diff engine.c @ 10:2a1338b218bf

on going
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Thu, 05 Jul 2018 18:37:11 +0900
parents cb7aa75418b8
children ce7323f9b937
line wrap: on
line diff
--- a/engine.c	Thu Jul 05 16:00:19 2018 +0900
+++ b/engine.c	Thu Jul 05 18:37:11 2018 +0900
@@ -40,9 +40,16 @@
 extern long romstart;
 
 #ifdef USE_MMU
-static inline Byte * mem0(Byte *iphymem, Word adr, Byte *immu) { 
+
+Byte dummy;
+static Byte * mem0(Byte *iphymem, Word adr, Byte *immu) { 
     if (adr>=0xff00) return iphymem + memsize - 0x10000 + adr; // fixed area
-    return & iphymem[ ( immu[ (adr) >> 13 ] <<13 ) + ((adr) & 0x1fff )]; 
+    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];})
@@ -1143,7 +1150,13 @@
    			         CLV SETDREG(tw) break;
    case 0xED: /*STD indexed  */
    				 tw=GETDREG; SETNZ16(tw) CLV
+#ifdef USE_MMU
+                                     STOREAC((tw<<8)&0x0ff); eaddr++;
+                                     STOREAC(tw&0x0ff);
+                                     break;
+#else
    				 SETWORD(eaddr,tw) break;
+#endif
    case 0xEE: /* LDU (LDS) indexed */  tw=GETWORD(eaddr);
                                   CLV SETNZ16(tw) if(!iflag)iureg=tw; else
                                   isreg=tw;break;
@@ -1188,7 +1201,13 @@
    			         CLV SETDREG(tw) break;
    case 0xFD: /*STD ext  */ EXTENDED
    				 tw=GETDREG; SETNZ16(tw) CLV
+#ifdef USE_MMU
+                                     STOREAC((tw<<8)&0x0ff); eaddr++;
+                                     STOREAC(tw&0x0ff);
+                                     break;
+#else
    				 SETWORD(eaddr,tw) break;
+#endif
    case 0xFE: /* LDU (LDS) ext */ EXTENDED tw=GETWORD(eaddr);
                                   CLV SETNZ16(tw) if(!iflag)iureg=tw; else
                                   isreg=tw;break;