X-Git-Url: http://shamusworld.gotdns.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fjaguar.cpp;h=9365b01672c2a8afa82fd8f3781743e4cf4fc28d;hb=685bb45b7766e8a12cd0de8ee486b9a61183c425;hp=cff72cce4d3d0d8f72bda271a458fecb217b2532;hpb=ab4f660439ff855171f801e3fdfa3e9de69d991b;p=virtualjaguar diff --git a/src/jaguar.cpp b/src/jaguar.cpp index cff72cc..9365b01 100644 --- a/src/jaguar.cpp +++ b/src/jaguar.cpp @@ -38,10 +38,11 @@ //Do this in makefile??? Yes! Could, but it's easier to define here... //#define LOG_UNMAPPED_MEMORY_ACCESSES //#define ABORT_ON_UNMAPPED_MEMORY_ACCESS -#define ABORT_ON_ILLEGAL_INSTRUCTIONS +//#define ABORT_ON_ILLEGAL_INSTRUCTIONS //#define ABORT_ON_OFFICIAL_ILLEGAL_INSTRUCTION #define CPU_DEBUG_MEMORY //#define LOG_CD_BIOS_CALLS +#define CPU_DEBUG_TRACING // Private function prototypes @@ -78,6 +79,7 @@ uint32 returnAddr[4000], raPtr = 0xFFFFFFFF; uint32 pcQueue[0x400]; uint32 pcQPtr = 0; +bool startM68KTracing = false; // // Callback function to detect illegal instructions @@ -121,6 +123,17 @@ if (inRoutine) instSeen++; #endif +// For code tracing... +#ifdef CPU_DEBUG_TRACING + if (startM68KTracing) + { + static char buffer[2048]; + + m68k_disassemble(buffer, m68kPC, 0); + WriteLog("%06X: %s\n", m68kPC, buffer); + } +#endif + // For tracebacks... // Ideally, we'd save all the registers as well... pcQueue[pcQPtr++] = m68kPC; @@ -270,7 +283,7 @@ if (m68kPC == 0x802058) start = true; m68k_get_reg(NULL, M68K_REG_A0), m68k_get_reg(NULL, M68K_REG_A1), m68k_get_reg(NULL, M68K_REG_D0), m68k_get_reg(NULL, M68K_REG_D1), m68k_get_reg(NULL, M68K_REG_D2)); }//*/ - if (m68kPC == 0x82E1A) +/* if (m68kPC == 0x82E1A) { static char buffer[2048]; m68k_disassemble(buffer, m68kPC, 0);//M68K_CPU_TYPE_68000); @@ -279,7 +292,7 @@ if (m68kPC == 0x802058) start = true; m68k_get_reg(NULL, M68K_REG_A0), m68k_get_reg(NULL, M68K_REG_A1), m68k_get_reg(NULL, M68K_REG_D0), m68k_get_reg(NULL, M68K_REG_D1), m68k_get_reg(NULL, M68K_REG_D2)); }//*/ - if (m68kPC == 0x82E58) +/* if (m68kPC == 0x82E58) WriteLog("--> [Routine end]\n"); if (m68kPC == 0x80004) { @@ -376,8 +389,21 @@ CD_switch:: -> $306C WriteLog("\nM68K encountered an illegal instruction at %08X!!!\n\nAborting!\n", m68kPC); uint32 topOfStack = m68k_get_reg(NULL, M68K_REG_A7); WriteLog("M68K: Top of stack: %08X. Stack trace:\n", JaguarReadLong(topOfStack)); + uint32 address = topOfStack - (4 * 4 * 3); + for(int i=0; i<10; i++) - WriteLog("%06X: %08X\n", topOfStack - (i * 4), JaguarReadLong(topOfStack - (i * 4))); + { + WriteLog("%06X:", address); + + for(int j=0; j<4; j++) + { + WriteLog(" %08X", JaguarReadLong(address)); + address += 4; + } + + WriteLog("\n"); + } + WriteLog("Jaguar: VBL interrupt is %s\n", ((TOMIRQEnabled(IRQ_VIDEO)) && (JaguarInterruptHandlerIsValid(64))) ? "enabled" : "disabled"); M68K_show_context(); @@ -916,6 +942,13 @@ handler: #endif int irq_ack_handler(int level) { +#ifdef CPU_DEBUG_TRACING + if (startM68KTracing) + { + WriteLog("irq_ack_handler: M68K PC=%06X\n", m68k_get_reg(NULL, M68K_REG_PC)); + } +#endif + // Tracing the IPL lines on the Jaguar schematic yields the following: // IPL1 is connected to INTL on TOM (OUT to 68K) // IPL0-2 are also tied to Vcc via 4.7K resistors! @@ -1463,11 +1496,12 @@ void JaguarDasm(uint32 offset, uint32 qt) uint8 JaguarReadByte(uint32 offset, uint32 who/*=UNKNOWN*/) { uint8 data = 0x00; - offset &= 0xFFFFFF; - if (offset < 0x200000) - data = jaguarMainRAM[offset & 0x3FFFFF]; - else if ((offset >= 0x800000) && (offset < 0xC00000)) + + // First 2M is mirrored in the $0 - $7FFFFF range + if (offset < 0x800000) + data = jaguarMainRAM[offset & 0x1FFFFF]; + else if ((offset >= 0x800000) && (offset < 0xDFFF00)) data = jaguarMainROM[offset - 0x800000]; else if ((offset >= 0xDFFF00) && (offset <= 0xDFFFFF)) data = CDROMReadByte(offset, who); @@ -1488,11 +1522,13 @@ uint8 JaguarReadByte(uint32 offset, uint32 who/*=UNKNOWN*/) uint16 JaguarReadWord(uint32 offset, uint32 who/*=UNKNOWN*/) { offset &= 0xFFFFFF; - if (offset <= 0x1FFFFE) + + // First 2M is mirrored in the $0 - $7FFFFF range + if (offset < 0x800000) { return (jaguarMainRAM[(offset+0) & 0x1FFFFF] << 8) | jaguarMainRAM[(offset+1) & 0x1FFFFF]; } - else if ((offset >= 0x800000) && (offset <= 0xBFFFFE)) + else if ((offset >= 0x800000) && (offset < 0xDFFF00)) { offset -= 0x800000; return (jaguarMainROM[offset+0] << 8) | jaguarMainROM[offset+1]; @@ -1522,7 +1558,9 @@ void JaguarWriteByte(uint32 offset, uint8 data, uint32 who/*=UNKNOWN*/) WriteLog("JWB: Byte %02X written at %08X by %s\n", data, offset, whoName[who]);//*/ offset &= 0xFFFFFF; - if (offset < 0x200000) + + // First 2M is mirrored in the $0 - $7FFFFF range + if (offset < 0x800000) { jaguarMainRAM[offset & 0x1FFFFF] = data; return; @@ -1566,7 +1604,8 @@ if (offset == 0x0102)//64*4) offset &= 0xFFFFFF; - if (offset <= 0x1FFFFE) + // First 2M is mirrored in the $0 - $7FFFFF range + if (offset <= 0x7FFFFE) { /* GPU Table (CD BIOS) @@ -1817,9 +1856,26 @@ void JaguarDone(void) // for(int i=M68K_REG_A0; i<=M68K_REG_A7; i++) // WriteLog("\tA%i = 0x%.8x\n", i-M68K_REG_A0, m68k_get_reg(NULL, (m68k_register_t)i)); int32 topOfStack = m68k_get_reg(NULL, M68K_REG_A7); - WriteLog("M68K: Top of stack: %08X. Stack trace:\n", JaguarReadLong(topOfStack)); + WriteLog("M68K: Top of stack: %08X -> (%08X). Stack trace:\n", topOfStack, JaguarReadLong(topOfStack)); +#if 0 for(int i=-2; i<9; i++) WriteLog("%06X: %08X\n", topOfStack + (i * 4), JaguarReadLong(topOfStack + (i * 4))); +#else + uint32 address = topOfStack - (4 * 4 * 3); + + for(int i=0; i<10; i++) + { + WriteLog("%06X:", address); + + for(int j=0; j<4; j++) + { + WriteLog(" %08X", JaguarReadLong(address)); + address += 4; + } + + WriteLog("\n"); + } +#endif /* WriteLog("\nM68000 disassembly at $802288...\n"); jaguar_dasm(0x802288, 3); @@ -1977,7 +2033,7 @@ void JaguarExecuteNew(void) // it will be half this number for a half frame. BUT, since we're counting // HALF lines, we double this number and we're back at 525 for NTSC, 625 for PAL. // -// Scanline times are 63.5555... µs in NTSC and 64 µs in PAL +// Scanline times are 63.5555... μs in NTSC and 64 μs in PAL // Half line times are, naturally, half of this. :-P void HalflineCallback(void) {