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