diff engine.c @ 11:ce7323f9b937

fix
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Fri, 06 Jul 2018 18:31:38 +0900
parents 2a1338b218bf
children 2aebc6b17fbf
line wrap: on
line diff
--- a/engine.c	Thu Jul 05 18:37:11 2018 +0900
+++ b/engine.c	Fri Jul 06 18:31:38 2018 +0900
@@ -41,32 +41,58 @@
 
 #ifdef USE_MMU
 
-Byte dummy;
-static Byte * mem0(Byte *iphymem, Word adr, Byte *immu) { 
-    if (adr>=0xff00) return iphymem + memsize - 0x10000 + adr; // fixed area
+Byte * mem0(Byte *iphymem, Word adr, Byte *immu) { 
     int addr = (immu[ (adr) >> 13 ] <<13 ) + ((adr) & 0x1fff ); 
-    if ( addr >= memsize ) {
-        dummy = 0;
-        return &dummy;
-    }
     return & iphymem[ addr ];
 };
-#define mem(adr) (*mem0(iphymem, adr,immu))
-#define GETWORD(a) ({Byte *phy = mem0(iphymem, a,immu); phy[0]<<8|phy[1];})
-#define SETBYTE(a,n) {Byte *phy = mem0(iphymem, a,immu); if(!(phy-iphymem>=romstart)) phy[0]=n;}
-#define SETWORD(a,n) {Byte *phy = mem0(iphymem, a,immu); if(!(phy-iphymem>=romstart)){phy[0]=(n)>>8;phy[1]=n;}}
+
+static Byte mem1(Byte *iphymem, Word adr, Byte *immu) {
+    if ((adr&0xff00)==(IOPAGE&0xff00)) return do_input(adr&0xff);
+    Byte *p = mem0(iphymem, adr, immu);
+    if(!(p-phymem>=memsize)) {
+        return *p;
+    } else {
+        return 0xff;
+    }
+}
 
-Byte * mem1(Byte *iphymem, Word adr, Byte *immu) { return mem0(iphymem,adr,immu); }
+#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) SETBYTE1(n,iphymem,a,immu);
 
 #else
 
-#define mem(adr) mem[adr]
+static Byte mem1(Word adr) {
+    if ((adr&0xff00)==(IOPAGE&0xff00)) return do_input(adr&0xff);
+    return mem[adr];
+}
+
+static void SETBYTE1(Word a,Byte n) {
+    if ((a&0xff00)==(IOPAGE&0xff00)) do_output(a&0xff,n);
+    if(!(a>=romstart))mem[a]=n;
+}
+#define mem(a) mem1(a)
+#define SETBYTE(a,n) SETBYTE1(a,n);
+
+#endif
 
 #define GETWORD(a) (mem(a)<<8|mem((a)+1))
-#define SETBYTE(a,n) {if(!(a>=romstart))mem(a)=n;}
-#define SETWORD(a,n) if(!(a>=romstart)){mem(a)=(n)>>8;mem((a)+1)=n;}
+#define SETWORD(a,n) {Word a1=a;SETBYTE(a1,n>>8);SETBYTE(a1+1,n);}
 
-#endif
+/* Macros for load and store of accumulators. Can be modified to check
+   for port addresses */
+// #define LOADAC(reg) if((eaddr&0xff00)!=(IOPAGE&0xff00))reg=mem(eaddr);else\
+//            reg=do_input(eaddr&0xff);
+// #define STOREAC(reg) if((eaddr&0xff00)!=(IOPAGE&0xff00))SETBYTE(eaddr,reg)else\
+// 	   do_output(eaddr&0xff,reg);
 
 /* Two bytes of a word are fetched separately because of
    the possible wrap-around at address $ffff and alignment
@@ -149,12 +175,9 @@
 			 case 10: iccreg=val;break;\
 			 case 11: idpreg=val;break;}
 
-/* Macros for load and store of accumulators. Can be modified to check
-   for port addresses */
-#define LOADAC(reg) if((eaddr&0xff00)!=(IOPAGE&0xff00))reg=mem(eaddr);else\
-           reg=do_input(eaddr&0xff);
-#define STOREAC(reg) if((eaddr&0xff00)!=(IOPAGE&0xff00))SETBYTE(eaddr,reg)else\
-	   do_output(eaddr&0xff,reg);
+
+#define LOADAC(reg) reg=mem(eaddr);
+#define STOREAC(reg) SETBYTE(eaddr,reg);
 
 #define LOADREGS ixreg=xreg;iyreg=yreg;\
  iureg=ureg;isreg=sreg;\
@@ -212,7 +235,7 @@
    if(tracing && ipcreg>=tracelo && ipcreg<=tracehi) {
         SAVEREGS 
 #ifdef USE_MMU
-        Byte *phyadr = &mem(pcreg);
+        Byte *phyadr = mem0(phymem,pcreg,immu);
         prog = (char *)(phyadr - pcreg);
 #endif
         do_trace(tracefile); 
@@ -1105,7 +1128,12 @@
    			         CLV SETDREG(tw) break;
    case 0xDD: /*STD direct  */ DIRECT
    				 tw=GETDREG; SETNZ16(tw) CLV
+#ifdef USE_MMU
+                                  STOREAC((tw>>8)&0x0ff); eaddr++;
+                                  STOREAC(tw&0x0ff); break;
+#else
    				 SETWORD(eaddr,tw) break;
+#endif
    case 0xDE: /* LDU (LDS) direct */ DIRECT tw=GETWORD(eaddr);
                                   CLV SETNZ16(tw) if(!iflag)iureg=tw; else
                                   isreg=tw;break;
@@ -1151,7 +1179,7 @@
    case 0xED: /*STD indexed  */
    				 tw=GETDREG; SETNZ16(tw) CLV
 #ifdef USE_MMU
-                                     STOREAC((tw<<8)&0x0ff); eaddr++;
+                                     STOREAC((tw>>8)&0x0ff); eaddr++;
                                      STOREAC(tw&0x0ff);
                                      break;
 #else
@@ -1202,7 +1230,7 @@
    case 0xFD: /*STD ext  */ EXTENDED
    				 tw=GETDREG; SETNZ16(tw) CLV
 #ifdef USE_MMU
-                                     STOREAC((tw<<8)&0x0ff); eaddr++;
+                                     STOREAC((tw>>8)&0x0ff); eaddr++;
                                      STOREAC(tw&0x0ff);
                                      break;
 #else