diff engine.c @ 18:e3b08716aa53

fix mmu
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Mon, 09 Jul 2018 00:40:05 +0900
parents 807141dc5ee8
children 1925cfa982fe
line wrap: on
line diff
--- a/engine.c	Sun Jul 08 16:15:34 2018 +0900
+++ b/engine.c	Mon Jul 09 00:40:05 2018 +0900
@@ -42,12 +42,13 @@
 #ifdef USE_MMU
 
 Byte * mem0(Byte *iphymem, Word adr, Byte *immu) { 
+    if ((adr&0xfe00)==(IOPAGE&0xfe00)) return &mem[adr];
     int addr = (immu[ (adr) >> 13 ] <<13 ) + ((adr) & 0x1fff ); 
     return & iphymem[ addr ];
-};
+}
 
 static Byte mem1(Byte *iphymem, Word adr, Byte *immu) {
-    if ((adr&0xff00)==(IOPAGE&0xff00)) return do_input(adr&0xff);
+    if ((adr&0xfe00)==(IOPAGE&0xfe00)) return do_input(adr&0x1ff);
     Byte *p = mem0(iphymem, adr, immu);
     if(!(p-phymem>=rommemsize)) {
         return *p;
@@ -58,25 +59,29 @@
 
 #define mem(a) mem1(iphymem,a,immu)
 
-static void SETBYTE1(Byte n,Byte *iphymem, Word adr, Byte *immu) {
-    if ((adr&0xff00)==(IOPAGE&0xff00)) do_output(adr&0xff,n);
-    Byte *p = mem0(iphymem, adr, immu);
-    if(!(p-phymem>=romstart)) {
-        *p=n;
-    }
-}
+#define SETBYTE(a,n) { \
+    Word adr = a; \
+    if ((adr&0xfe00)==(IOPAGE&0xfe00)) { \
+        do_output(adr&0x1ff,n); \
+        immu = mmu; \
+    } else {\
+       Byte *p = mem0(iphymem, adr,immu); \
+       if(!(p-phymem>=romstart)) { \
+           *p=n; \
+       } \
+    } \
+} 
 
-#define SETBYTE(a,n) SETBYTE1(n,iphymem,a,immu);
 
 #else
 
 static Byte mem1(Word adr) {
-    if ((adr&0xff00)==(IOPAGE&0xff00)) return do_input(adr&0xff);
+    if ((adr&0xfe00)==(IOPAGE&0xfe00)) return do_input(adr&0x1ff);
     return mem[adr];
 }
 
 static void SETBYTE1(Word a,Byte n) {
-    if ((a&0xff00)==(IOPAGE&0xff00)) do_output(a&0xff,n);
+    if ((a&0xfe00)==(IOPAGE&0xfe00)) do_output(a&0x1ff,n);
     if(!(a>=romstart))mem[a]=n;
 }
 #define mem(a) mem1(a)
@@ -233,8 +238,8 @@
    if(tracing && ipcreg>=tracelo && ipcreg<=tracehi) {
         SAVEREGS 
 #ifdef USE_MMU
-        Byte *phyadr = mem0(phymem,pcreg,immu);
-        prog = (char *)(phyadr - pcreg);
+        Byte *phyadr = mem0(phymem,ipcreg,immu);
+        prog = (char *)(phyadr - ipcreg);
 #endif
         do_trace(tracefile); 
    }