# HG changeset patch # User Shinji KONO # Date 1531103128 -32400 # Node ID 1925cfa982fec0e414b7a50bd06dcffe966c7e6a # Parent 49fac9474858049c988ad7be567d29eeb18e2cfb fixing trace diff -r 49fac9474858 -r 1925cfa982fe engine.c --- a/engine.c Mon Jul 09 09:29:33 2018 +0900 +++ b/engine.c Mon Jul 09 11:25:28 2018 +0900 @@ -39,12 +39,29 @@ static int tracetrick=0; extern long romstart; -#ifdef USE_MMU +#ifndef USE_MMU + +static Byte mem1(Word adr) { + if ((adr&0xfe00)==(IOPAGE&0xfe00)) return do_input(adr&0x1ff); + return mem[adr]; +} + +static void SETBYTE1(Word a,Byte n) { + if ((a&0xfe00)==(IOPAGE&0xfe00)) do_output(a&0x1ff,n); + if(!(a>=romstart))mem[a]=n; +} +#define mem(a) mem1(a) +#define SETBYTE(a,n) SETBYTE1(a,n); + +#else + +int paddr(Word adr, Byte *immu) { + if ((adr&0xfe00)==(IOPAGE&0xfe00)) return memsize-0x10000+adr; + return (immu[ (adr) >> 13 ] <<13 ) + ((adr) & 0x1fff ); +} 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 ]; + return & iphymem[ paddr(adr,immu) ]; } static Byte mem1(Byte *iphymem, Word adr, Byte *immu) { @@ -72,21 +89,6 @@ } \ } - -#else - -static Byte mem1(Word adr) { - if ((adr&0xfe00)==(IOPAGE&0xfe00)) return do_input(adr&0x1ff); - return mem[adr]; -} - -static void SETBYTE1(Word a,Byte n) { - if ((a&0xfe00)==(IOPAGE&0xfe00)) do_output(a&0x1ff,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)) diff -r 49fac9474858 -r 1925cfa982fe trace.c --- a/trace.c Mon Jul 09 09:29:33 2018 +0900 +++ b/trace.c Mon Jul 09 11:25:28 2018 +0900 @@ -43,6 +43,9 @@ #ifdef USE_MMU extern char *prog ; // for disass extern Byte * mem0(Byte *iphymem, Word adr, Byte *immu) ; +extern int paddr(Word adr, Byte *immu) ; +#else +#define paddr(a,m) (a) #endif void do_exit(void) { @@ -52,7 +55,8 @@ typedef struct bp { - int address; + int address; // physical address + int laddr; int count; struct bp *next; } BP, *BPTR; @@ -94,13 +98,25 @@ ); } + +void setbreak(int adr,int count) ; +void nexti(void); + void do_escape(void) { char s[80]; int adr,skip; if (bpskip) { // skip unbreak instruction bpskip--; - for(BPTR b = breakpoint; b ; b=b->next) { - if (pcreg==b->address) { + int lpc = paddr(pcreg,mmu); + BPTR *prev = &breakpoint; + for(BPTR b = breakpoint; b ; b=b->next, prev=prev->next) { + if (lpc==b->address) { + if (b->count==-1) { // temporaly break point + BPTR next = b->next; + free(b); + prev->next = next; + goto restart0; + } if (b->count) b->count--; if (b->count==0) { goto restart0; @@ -131,6 +147,11 @@ if (s[0]) s[strlen(s) - 1] = 0; switch (s[0]) { + case 'n': // step over + if (nexti()) { + bpskip = -1; + break; + } case 's': // one step trace trskip = 1; if (s[1]) { @@ -139,35 +160,31 @@ bpskip = 0; attention = escape = 1; break; - case 'n': // step over - stkskip = sreg; - attention = escape = 1; - break; case 'f': // finish this call (until stack pop) stkskip = sreg + 2; attention = escape = 1; break; case 'b': // set break point - { - BPTR bp = calloc(1,sizeof(BP)); - bp->next = breakpoint; - breakpoint = bp; - bp->count = 1; - if (s[1]) { - char *next; - bp->address = getarg(s+1,&next); - if (next[0]) { - bp->count = getarg(next,&next); - } - } else { - bp->address = pcreg; - } + if (s[1]) { + char *next; + int count = 0; + int adr = getarg(s+0,&next); + if (next[0]) { + count = getarg(next,&next); + } + setbreak(adr,count); + } else { + setbreak(pcreg,0); } bpskip = -1; goto restart; case 'l': // break point list for(BPTR bp = breakpoint; bp ; bp = bp->next) { - printf("%x %i\n", bp->address, bp->count); +#ifdef USE_MMU + printf("%x %x %d\n", bp->laddr, bp->address, bp->count); +#else + printf("%x %d\n", bp->address, bp->count); +#endif } goto restart; case 'd': // delte break point list @@ -176,9 +193,9 @@ BPTR *prev = &breakpoint; for(BPTR bp = breakpoint; bp ; bp = bp->next) { if (trskip-- == 0) { - if (bp) { - *prev = bp->next; - } + BPTR next = b->next; + free(bp); + prev->next = next; break; } prev = &bp->next; @@ -326,3 +343,74 @@ set_term(escchar); } +void setbreak(int adr, int count) { + BPTR bp = calloc(1,sizeof(BP)); + bp->next = breakpoint; + breakpoint = bp; + bp->count = count; + if (s[1]) { + char *next; + bp->laddr = getarg(s+0,&next); + bp->address = paddr((bp->laddr,&next),mmu); + if (next[0]) { + bp->count = getarg(next,&next); + } + } else { + bp->laddr = pcreg; + bp->address = paddr(pcreg,mmu); + } +} + +int nexti(void) { + int op1 = phymem[mem1(pcreg)]; + int ofs = 0; + switch(op1) { + case 0x17: // LBSR + case 0xbd: // JSR extended + ofs=3; beak; + case 0x10: // page2 + { + int op2 = phymem[mem1(pcreg+1)]; + if (op2==0x3f) { // os9 system call + ofs=3; beak; + } + } + case 0x11: // page3 + { + int op2 = phymem[mem1(pcreg+1)]; + if (op2==0x3f) { // SWI3 + ofs=2; beak; + } + } + case 0x3f: // SWI + ofs=1; beak; + case 0x3c: // CWAI + case 0x8d: // BSR + case 0x9d: // JSR direct + ofs=2; beak; + case 0xad: // JSR index + { + int op2 = phymem[mem1(pcreg+1)]; + if (op2<0x80) ofs = 2; // 5bit ofs + else switch (op2&0xf) { + case 8: case 0xc: + ofs = 3; break; + case 9: case 0xd: case 0xf: + ofs = 4; break; + default: + ofs = 2; break; + } + } + break; + } + if (ofs) setbreak(pc+ofs,-1); + retrun ofs; +} + + + + + + + +