X-Git-Url: http://shamusworld.gotdns.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fm68000%2Fcpuextra.c;h=e165dd202610e196425fde74cc07a8662e51ab6e;hb=f005034d4a3990efc8e445ce46222ce32600411b;hp=230c316a75d4b951c8c4029350e44f4f9d029656;hpb=2d556a3eb52664e928014a72ad18edc13281de7e;p=virtualjaguar diff --git a/src/m68000/cpuextra.c b/src/m68000/cpuextra.c index 230c316..e165dd2 100644 --- a/src/m68000/cpuextra.c +++ b/src/m68000/cpuextra.c @@ -21,6 +21,7 @@ int CurrentInstrCycles; struct regstruct regs; + // // Make displacement effective address for 68000 // @@ -51,6 +52,7 @@ uint32_t get_disp_ea_000(uint32_t base, uint32_t dp) #endif } + // // Create the Status Register from the flags // @@ -60,6 +62,7 @@ void MakeSR(void) | (GET_NFLG << 3) | (GET_ZFLG << 2) | (GET_VFLG << 1) | GET_CFLG); } + // // Set up the flags from Status Register // @@ -94,9 +97,14 @@ void MakeFromSR(void) // set_special(SPCFLAG_DOINT); } + // // Rudimentary exception handling. This is really stripped down from what // was in Hatari. +/* +NB: Seems that when an address exception occurs, it doesn't get handled properly + as per test1.cof. Need to figure out why it keeps going when it should wedge. :-P +*/ // // Handle exceptions. We need a special case to handle MFP exceptions // on Atari ST, because it's possible to change the MFP's vector base @@ -104,12 +112,45 @@ void MakeFromSR(void) // void Exception(int nr, uint32_t oldpc, int ExceptionSource) { -printf("Exception #%i occurred!\n", nr); + uint32_t currpc = m68k_getpc(), newpc; + +// Need to figure out how to report this stuff without using printf on stdout :-/ +#if 0 +char excNames[33][64] = { + "???", "???", "Bus Error", "Address Error", + "Illegal Instruction", "Zero Divide", "CHK", "TrapV", + "Privilege Violation", "Trace", "Line A", "Line F", + "???", "???", "Format Error", "Uninitialized Interrupt", + "???", "???", "???", "???", + "???", "???", "???", "???", + "Spurious/Autovector", "???", "???", "???", + "???", "???", "???", "???", + "Trap #" +}; + +printf("Exception #%i occurred! (%s)\n", nr, (nr < 32 ? excNames[nr] : (nr < 48 ? "Trap #" : "????"))); printf("Vector @ #%i = %08X\n", nr, m68k_read_memory_32(nr * 4)); //abort(); - uint32_t currpc = m68k_getpc(), newpc; +printf("PC = $%08X\n", currpc); +printf("A0 = $%08X A1 = $%08X A2 = $%08X A3 = $%08X\n", m68k_areg(regs, 0), m68k_areg(regs, 1), m68k_areg(regs, 2), m68k_areg(regs, 3)); +printf("A4 = $%08X A5 = $%08X A6 = $%08X A7 = $%08X\n", m68k_areg(regs, 4), m68k_areg(regs, 5), m68k_areg(regs, 6), m68k_areg(regs, 7)); +printf("D0 = $%08X D1 = $%08X D2 = $%08X D3 = $%08X\n", m68k_dreg(regs, 0), m68k_dreg(regs, 1), m68k_dreg(regs, 2), m68k_dreg(regs, 3)); +printf("D4 = $%08X D5 = $%08X D6 = $%08X D7 = $%08X\n", m68k_dreg(regs, 4), m68k_dreg(regs, 5), m68k_dreg(regs, 6), m68k_dreg(regs, 7)); +printf("\n"); + +uint32_t disPC = currpc - 10; +char buffer[128]; - /*if( nr>=2 && nr<10 ) fprintf(stderr,"Exception (-> %i bombs)!\n",nr);*/ +do +{ + uint32_t oldpc = disPC; + disPC += m68k_disassemble(buffer, disPC, 0); + printf("%s%08X: %s\n", (oldpc == currpc ? ">" : " "), oldpc, buffer); +} +while (disPC < (currpc + 10)); +#endif + +/*if( nr>=2 && nr<10 ) fprintf(stderr,"Exception (-> %i bombs)!\n",nr);*/ MakeSR(); @@ -284,6 +325,7 @@ printf("Vector @ #%i = %08X\n", nr, m68k_read_memory_32(nr * 4)); #endif } + /* The routines below take dividend and divisor as parameters. They return 0 if division by zero, or exact number of cycles otherwise. @@ -361,6 +403,7 @@ STATIC_INLINE int getDivu68kCycles_2 (uint32_t dividend, uint16_t divisor) return mcycles * 2; } + // This is called by cpuemu.c int getDivu68kCycles(uint32_t dividend, uint16_t divisor) { @@ -369,11 +412,11 @@ int getDivu68kCycles(uint32_t dividend, uint16_t divisor) return v; } + // // DIVS // Signed division // - STATIC_INLINE int getDivs68kCycles_2(int32_t dividend, int16_t divisor) { int mcycles; @@ -418,6 +461,7 @@ STATIC_INLINE int getDivs68kCycles_2(int32_t dividend, int16_t divisor) return mcycles * 2; } + // This is called by cpuemu.c int getDivs68kCycles(int32_t dividend, int16_t divisor) { @@ -425,3 +469,4 @@ int getDivs68kCycles(int32_t dividend, int16_t divisor) // write_log ("S%d ", v); return v; } +