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