Mercurial > hg > Members > kono > os9 > sbc09
diff engine.c @ 9:cb7aa75418b8
mmu and io
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Thu, 05 Jul 2018 16:00:19 +0900 |
parents | a6db579d8c11 |
children | 2a1338b218bf |
line wrap: on
line diff
--- a/engine.c Thu Jul 05 12:07:06 2018 +0900 +++ b/engine.c Thu Jul 05 16:00:19 2018 +0900 @@ -37,19 +37,30 @@ Byte aca,acb; Byte *breg=&aca,*areg=&acb; static int tracetrick=0; -extern int romstart; +extern long romstart; #ifdef USE_MMU -static inline Byte * mem0(Byte *iphymem, Word adr, Byte *immu) { return & iphymem[ ( immu[ (adr) >> 13 ] <<13 ) + ((adr) & 0x1fff )]; }; +static inline 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 )]; +}; #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;}} + +Byte * mem1(Byte *iphymem, Word adr, Byte *immu) { return mem0(iphymem,adr,immu); } + #else + #define mem(adr) mem[adr] -#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;} + +#endif + /* Two bytes of a word are fetched separately because of the possible wrap-around at address $ffff and alignment */ @@ -170,6 +181,8 @@ /*F*/ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, }; +extern char *prog ; + void interpr(void) { Word ixreg,iyreg,iureg,isreg,ipcreg; @@ -189,8 +202,14 @@ LOADREGS for(;;){ if(attention) { - if(tracing && ipcreg>=tracelo && ipcreg<=tracehi) - {SAVEREGS do_trace(tracefile); } + if(tracing && ipcreg>=tracelo && ipcreg<=tracehi) { + SAVEREGS +#ifdef USE_MMU + Byte *phyadr = &mem(pcreg); + prog = (char *)(phyadr - pcreg); +#endif + do_trace(tracefile); + } if(escape){ SAVEREGS do_escape(); LOADREGS } if(irq) { if(irq==1&&!(iccreg&0x10)) { /* standard IRQ */