]> Shamusworld >> Repos - virtualjaguar/blobdiff - src/m68000/cpuextra.c
Removed some cruft and nonstandard int/uint types, added M series BIOS.
[virtualjaguar] / src / m68000 / cpuextra.c
index 230c316a75d4b951c8c4029350e44f4f9d029656..e165dd202610e196425fde74cc07a8662e51ab6e 100644 (file)
@@ -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;
 }
+