Mercurial > hg > Members > kono > os9 > sbc09
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;