--- np2/debugsub386.c 2004/03/07 01:23:14 1.1 +++ np2/debugsub386.c 2004/06/02 11:02:53 1.11 @@ -6,6 +6,10 @@ #include "iocore.h" #include "debugsub.h" +void debugwriteseg(const char *fname, const descriptor_t *sd, + UINT32 addr, UINT32 size); +void debugpageptr(UINT32 addr); + #if defined(MACOS) #define CRLITERAL "\r" @@ -65,11 +69,11 @@ static const char str_register[] = "EAX=%.8x EBX=%.8x ECX=%.8x EDX=%.8x" CRLITERAL \ "ESP=%.8x EBP=%.8x ESI=%.8x EDI=%.8x" CRLITERAL \ "DS=%.4x ES=%.4x SS=%.4x CS=%.4x " \ - "EIP=%.8x "; + "EIP=%.8x " CRLITERAL; static const char str_picstat[] = \ - CRLITERAL "PIC0=%.2x:%.2x:%.2x" \ - CRLITERAL "PIC1=%.2x:%.2x:%.2x" \ - CRLITERAL "8255PORTC = %.2x / system-port = %.2x"; + "PIC0=%.2x:%.2x:%.2x" CRLITERAL \ + "PIC1=%.2x:%.2x:%.2x" CRLITERAL \ + "8255PORTC = %.2x / system-port = %.2x" CRLITERAL; const char *debugsub_flags(UINT16 flag) { @@ -107,35 +111,39 @@ static char work[256]; return(work); } -static void writeseg(const char *fname, UINT32 addr, UINT limit) { +void debugwriteseg(const char *fname, const descriptor_t *sd, + UINT32 addr, UINT32 size) { FILEH fh; - UINT size; BYTE buf[0x1000]; + UINT32 limit; + limit = sd->u.seg.limit; + if (limit <= addr) { + return; + } + size = min(limit - addr, size - 1) + 1; fh = file_create_c(fname); if (fh == FILEH_INVALID) { return; } - limit = min(limit, 0xffff); - limit++; - while(limit) { - size = min(limit, sizeof(buf)); - MEML_READ(addr, buf, size); - file_write(fh, buf, size); - addr += size; - limit -= size; + addr += sd->u.seg.segbase; + while(size) { + limit = min(size, sizeof(buf)); + MEML_READ(addr, buf, limit); + file_write(fh, buf, limit); + addr += limit; + size -= limit; } file_close(fh); } void debugsub_status(void) { -static int filenum = 0; - FILEH fh; - char work[512]; -const char *p; - descriptor_t *sd; +static int filenum = 0; + FILEH fh; + char work[512]; +const char *p; SPRINTF(work, file_i386reg, filenum); fh = file_create_c(work); @@ -145,23 +153,25 @@ const char *p; SPRINTF(work, str_picstat, pic.pi[0].imr, pic.pi[0].irr, pic.pi[0].isr, pic.pi[1].imr, pic.pi[1].irr, pic.pi[1].isr, - mouseif.portc, sysport.c); + mouseif.upd8255.portc, sysport.c); file_write(fh, work, strlen(work)); + + SPRINTF(work, "CS = %.8x:%.8x" CRLITERAL, + CPU_STAT_SREGBASE(CPU_CS_INDEX), + CPU_STAT_SREGLIMIT(CPU_CS_INDEX)); + file_write(fh, work, strlen(work)); + file_close(fh); } SPRINTF(work, file_i386cs, filenum); - sd = &CPU_STAT_SREG(CPU_CS_INDEX); - writeseg(work, sd->u.seg.segbase, sd->u.seg.limit); + debugwriteseg(work, &CPU_STAT_SREG(CPU_CS_INDEX), CPU_EIP & 0xffff0000, 0x10000); SPRINTF(work, file_i386ds, filenum); - sd = &CPU_STAT_SREG(CPU_DS_INDEX); - writeseg(work, sd->u.seg.segbase, sd->u.seg.limit); + debugwriteseg(work, &CPU_STAT_SREG(CPU_DS_INDEX), 0, 0x10000); SPRINTF(work, file_i386es, filenum); - sd = &CPU_STAT_SREG(CPU_ES_INDEX); - writeseg(work, sd->u.seg.segbase, sd->u.seg.limit); + debugwriteseg(work, &CPU_STAT_SREG(CPU_ES_INDEX), 0, 0x10000); SPRINTF(work, file_i386ss, filenum); - sd = &CPU_STAT_SREG(CPU_SS_INDEX); - writeseg(work, sd->u.seg.segbase, sd->u.seg.limit); + debugwriteseg(work, &CPU_STAT_SREG(CPU_SS_INDEX), CPU_ESP & 0xffff0000, 0x10000); filenum++; } @@ -172,12 +182,57 @@ void debugsub_memorydump(void) { fh = file_create_c(file_memorybin); if (fh != FILEH_INVALID) { - for (i=0; i<34; i++) -// for (i=0; i<64; i++) - { + for (i=0; i<34; i++) { file_write(fh, mem + i*0x8000, 0x8000); } file_close(fh); } } +void debugsub_memorydumpall(void) { + + FILEH fh; + + fh = file_create_c(file_memorybin); + if (fh != FILEH_INVALID) { + file_write(fh, mem, 0x110000); + if (CPU_EXTMEMSIZE > 0x10000) { + file_write(fh, CPU_EXTMEM + 0x10000, CPU_EXTMEMSIZE - 0x10000); + } + file_close(fh); + } +} + + +#if 1 // ²¶ÍѥǥХ° + +void debugpageptr(UINT32 addr) { + + FILEH fh; + char buf[256]; + UINT32 pde; + UINT32 pte; + UINT i; + UINT32 a; + + fh = file_create("page.txt"); + SPRINTF(buf, "CR3=%.8x\r\n", CPU_CR3); + file_write(fh, buf, strlen(buf)); + for (i=0; i<1024; i++) { + a = CPU_STAT_PDE_BASE + (i * 4); + pde = cpu_memoryread_d(a); + SPRINTF(buf, "%.8x=>%.8x [%.8x]\r\n", (i << 22), pde, a); + file_write(fh, buf, strlen(buf)); + } + addr >>= 22; + pde = cpu_memoryread_d(CPU_STAT_PDE_BASE + (addr * 4)); + for (i=0; i<1024; i++) { + a = (pde & CPU_PDE_BASEADDR_MASK) + (i * 4); + pte = cpu_memoryread_d(a); + SPRINTF(buf, "%.8x=>%.8x [%.8x]\r\n", (addr << 22) + (i << 12), pte, a); + file_write(fh, buf, strlen(buf)); + } + file_close(fh); +} + +#endif