#include "jerry.h"
#include "joystick.h"
#include "log.h"
-#include "m68k.h"
+#include "m68000/m68kinterface.h"
//#include "memory.h"
#include "mmu.h"
#include "settings.h"
//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
-unsigned jaguar_unknown_readbyte(unsigned address, uint32 who = UNKNOWN);
-unsigned jaguar_unknown_readword(unsigned address, uint32 who = UNKNOWN);
-void jaguar_unknown_writebyte(unsigned address, unsigned data, uint32 who = UNKNOWN);
-void jaguar_unknown_writeword(unsigned address, unsigned data, uint32 who = UNKNOWN);
+unsigned jaguar_unknown_readbyte(unsigned address, uint32_t who = UNKNOWN);
+unsigned jaguar_unknown_readword(unsigned address, uint32_t who = UNKNOWN);
+void jaguar_unknown_writebyte(unsigned address, unsigned data, uint32_t who = UNKNOWN);
+void jaguar_unknown_writeword(unsigned address, unsigned data, uint32_t who = UNKNOWN);
void M68K_show_context(void);
// External variables
#endif
// Really, need to include memory.h for this, but it might interfere with some stuff...
-extern uint8 jagMemSpace[];
+extern uint8_t jagMemSpace[];
// Internal variables
-uint32 jaguar_active_memory_dumps = 0;
+uint32_t jaguar_active_memory_dumps = 0;
-uint32 jaguarMainROMCRC32, jaguarROMSize, jaguarRunAddress;
+uint32_t jaguarMainROMCRC32, jaguarROMSize, jaguarRunAddress;
bool jaguarCartInserted = false;
bool lowerField = false;
#ifdef CPU_DEBUG_MEMORY
-uint8 writeMemMax[0x400000], writeMemMin[0x400000];
-uint8 readMem[0x400000];
-uint32 returnAddr[4000], raPtr = 0xFFFFFFFF;
+uint8_t writeMemMax[0x400000], writeMemMin[0x400000];
+uint8_t readMem[0x400000];
+uint32_t returnAddr[4000], raPtr = 0xFFFFFFFF;
#endif
-uint32 pcQueue[0x400];
-uint32 pcQPtr = 0;
+uint32_t pcQueue[0x400];
+uint32_t pcQPtr = 0;
+bool startM68KTracing = false;
//
// Callback function to detect illegal instructions
void M68KInstructionHook(void)
{
- uint32 m68kPC = m68k_get_reg(NULL, M68K_REG_PC);
+ uint32_t m68kPC = m68k_get_reg(NULL, M68K_REG_PC);
// Temp, for comparing...
{
/* static char buffer[2048];//, mem[64];
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;
static char buffer[2048];
for(int i=0; i<0x400; i++)
{
- m68k_disassemble(buffer, pcQueue[(pcQPtr + i) & 0x3FF], M68K_CPU_TYPE_68000);
+ m68k_disassemble(buffer, pcQueue[(pcQPtr + i) & 0x3FF], 0);//M68K_CPU_TYPE_68000);
WriteLog("\t%08X: %s\n", pcQueue[(pcQPtr + i) & 0x3FF], buffer);
}
WriteLog("\n");
- uint32 topOfStack = m68k_get_reg(NULL, M68K_REG_A7);
+ uint32_t topOfStack = m68k_get_reg(NULL, M68K_REG_A7);
WriteLog("M68K: Top of stack: %08X. Stack trace:\n", JaguarReadLong(topOfStack));
for(int i=0; i<10; i++)
WriteLog("%06X: %08X\n", topOfStack - (i * 4), JaguarReadLong(topOfStack - (i * 4)));
log_done();
exit(0);
}//*/
-/* uint16 opcode = JaguarReadWord(m68kPC);
+/* uint16_t opcode = JaguarReadWord(m68kPC);
if (opcode == 0x4E75) // RTS
{
if (startMemLog)
// WriteLog("Jaguar: Returning from subroutine to %08X\n", JaguarReadLong(m68k_get_reg(NULL, M68K_REG_A7)));
{
- uint32 addr = JaguarReadLong(m68k_get_reg(NULL, M68K_REG_A7));
+ uint32_t addr = JaguarReadLong(m68k_get_reg(NULL, M68K_REG_A7));
bool found = false;
if (raPtr != 0xFFFFFFFF)
{
- for(uint32 i=0; i<=raPtr; i++)
+ for(uint32_t i=0; i<=raPtr; i++)
{
if (returnAddr[i] == addr)
{
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, M68K_CPU_TYPE_68000);
+ m68k_disassemble(buffer, m68kPC, 0);//M68K_CPU_TYPE_68000);
WriteLog("--> [Routine start] %08X: %s", m68kPC, buffer);
WriteLog("\t\tA0=%08X, A1=%08X, D0=%08X(cmd), D1=%08X(# bytes), D2=%08X\n",
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)
{
#endif
#ifdef ABORT_ON_ILLEGAL_INSTRUCTIONS
- if (!m68k_is_valid_instruction(m68k_read_memory_16(m68kPC), M68K_CPU_TYPE_68000))
+ if (!m68k_is_valid_instruction(m68k_read_memory_16(m68kPC), 0))//M68K_CPU_TYPE_68000))
{
#ifndef ABORT_ON_OFFICIAL_ILLEGAL_INSTRUCTION
if (m68k_read_memory_16(m68kPC) == 0x4AFC)
#endif
WriteLog("\nM68K encountered an illegal instruction at %08X!!!\n\nAborting!\n", m68kPC);
- uint32 topOfStack = m68k_get_reg(NULL, M68K_REG_A7);
+ uint32_t topOfStack = m68k_get_reg(NULL, M68K_REG_A7);
WriteLog("M68K: Top of stack: %08X. Stack trace:\n", JaguarReadLong(topOfStack));
+ uint32_t 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();
#define NEW_TIMER_SYSTEM
/*
-uint8 jaguarMainRAM[0x400000]; // 68K CPU RAM
-uint8 jaguarMainROM[0x600000]; // 68K CPU ROM
-uint8 jaguarBootROM[0x040000]; // 68K CPU BIOS ROM--uses only half of this!
-uint8 jaguarCDBootROM[0x040000]; // 68K CPU CD BIOS ROM
+uint8_t jaguarMainRAM[0x400000]; // 68K CPU RAM
+uint8_t jaguarMainROM[0x600000]; // 68K CPU ROM
+uint8_t jaguarBootROM[0x040000]; // 68K CPU BIOS ROM--uses only half of this!
+uint8_t jaguarCDBootROM[0x040000]; // 68K CPU CD BIOS ROM
bool BIOSLoaded = false;
bool CDBIOSLoaded = false;
-uint8 cdRAM[0x100];
-uint8 tomRAM[0x4000];
-uint8 jerryRAM[0x10000];
-static uint16 eeprom_ram[64];
+uint8_t cdRAM[0x100];
+uint8_t tomRAM[0x4000];
+uint8_t jerryRAM[0x10000];
+static uint16_t eeprom_ram[64];
// NOTE: CD BIOS ROM is read from cartridge space @ $802000 (it's a cartridge, after all)
*/
enum MemType { MM_NOP = 0, MM_RAM, MM_ROM, MM_IO };
// M68K Memory map/handlers
-uint32 {
+uint32_t {
{ 0x000000, 0x3FFFFF, MM_RAM, jaguarMainRAM },
{ 0x800000, 0xDFFEFF, MM_ROM, jaguarMainROM },
// Note that this is really memory mapped I/O region...
*/
};
-void WriteByte(uint32 address, uint8 byte, uint32 who/*=UNKNOWN*/)
+void WriteByte(uint32_t address, uint8_t byte, uint32_t who/*=UNKNOWN*/)
{
// Not sure, but I think the system only has 24 address bits...
address &= 0x00FFFFFF;
{
if (address == 0xF00050)
{
- tomTimerPrescaler = (tomTimerPrescaler & 0x00FF) | ((uint16)byte << 8);
+ tomTimerPrescaler = (tomTimerPrescaler & 0x00FF) | ((uint16_t)byte << 8);
TOMResetPIT();
return;
}
}
else if (address == 0xF00052)
{
- tomTimerDivider = (tomTimerDivider & 0x00FF) | ((uint16)byte << 8);
+ tomTimerDivider = (tomTimerDivider & 0x00FF) | ((uint16_t)byte << 8);
TOMResetPIT();
return;
}
{
// WriteLog("JERRY: Writing %02X to SCLK...\n", data);
if ((address & 0x03) == 2)
- JERRYI2SInterruptDivide = (JERRYI2SInterruptDivide & 0x00FF) | ((uint32)byte << 8);
+ JERRYI2SInterruptDivide = (JERRYI2SInterruptDivide & 0x00FF) | ((uint32_t)byte << 8);
else
- JERRYI2SInterruptDivide = (JERRYI2SInterruptDivide & 0xFF00) | (uint32)byte;
+ JERRYI2SInterruptDivide = (JERRYI2SInterruptDivide & 0xFF00) | (uint32_t)byte;
JERRYI2SInterruptTimer = -1;
#ifndef NEW_TIMER_SYSTEM
; // Do nothing
}
-void WriteWord(uint32 adddress, uint16 word)
+void WriteWord(uint32_t adddress, uint16_t word)
{
}
-void WriteDWord(uint32 adddress, uint32 dword)
+void WriteDWord(uint32_t adddress, uint32_t dword)
{
}
-uint8 ReadByte(uint32 adddress)
+uint8_t ReadByte(uint32_t adddress)
{
}
-uint16 ReadWord(uint32 adddress)
+uint16_t ReadWord(uint32_t adddress)
{
}
-uint32 ReadDWord(uint32 adddress)
+uint32_t ReadDWord(uint32_t adddress)
{
}
#endif
#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!
{
if (startMemLog)
{
- uint8 hi = value >> 8, lo = value & 0xFF;
+ uint8_t hi = value >> 8, lo = value & 0xFF;
if (hi > writeMemMax[address])
writeMemMax[address] = hi;
// WriteLog("M68K: Writing to blitter --> %04X at %08X\n", value, address);
//if (address >= 0x0E75D0 && address <= 0x0E75E7)
// WriteLog("M68K: Writing %04X at %08X, M68K PC=%08X\n", value, address, m68k_get_reg(NULL, M68K_REG_PC));
-/*extern uint32 totalFrames;
+/*extern uint32_t totalFrames;
if (address == 0xF02114)
WriteLog("M68K: Writing to GPU_CTRL (frame:%u)... [M68K PC:%08X]\n", totalFrames, m68k_get_reg(NULL, M68K_REG_PC));
if (address == 0xF02110)
}
-uint32 JaguarGetHandler(uint32 i)
+uint32_t JaguarGetHandler(uint32_t i)
{
return JaguarReadLong(i * 4);
}
-bool JaguarInterruptHandlerIsValid(uint32 i) // Debug use only...
+bool JaguarInterruptHandlerIsValid(uint32_t i) // Debug use only...
{
- uint32 handler = JaguarGetHandler(i);
+ uint32_t handler = JaguarGetHandler(i);
return (handler && (handler != 0xFFFFFFFF) ? true : false);
}
for(int i=0; i<256; i++)
{
WriteLog("handler %03i at ", i);//$%08X\n", i, (unsigned int)JaguarGetHandler(i));
- uint32 address = (uint32)JaguarGetHandler(i);
+ uint32_t address = (uint32_t)JaguarGetHandler(i);
if (address == 0)
WriteLog(".........\n");
// in. This mistake causes it to try and overwrite approximately $700000 worth of address
// space! (That is, unless the 68K causes a bus error...)
-void jaguar_unknown_writebyte(unsigned address, unsigned data, uint32 who/*=UNKNOWN*/)
+void jaguar_unknown_writebyte(unsigned address, unsigned data, uint32_t who/*=UNKNOWN*/)
{
#ifdef LOG_UNMAPPED_MEMORY_ACCESSES
WriteLog("Jaguar: Unknown byte %02X written at %08X by %s (M68K PC=%06X)\n", data, address, whoName[who], m68k_get_reg(NULL, M68K_REG_PC));
#endif
}
-void jaguar_unknown_writeword(unsigned address, unsigned data, uint32 who/*=UNKNOWN*/)
+void jaguar_unknown_writeword(unsigned address, unsigned data, uint32_t who/*=UNKNOWN*/)
{
#ifdef LOG_UNMAPPED_MEMORY_ACCESSES
WriteLog("Jaguar: Unknown word %04X written at %08X by %s (M68K PC=%06X)\n", data, address, whoName[who], m68k_get_reg(NULL, M68K_REG_PC));
#endif
}
-unsigned jaguar_unknown_readbyte(unsigned address, uint32 who/*=UNKNOWN*/)
+unsigned jaguar_unknown_readbyte(unsigned address, uint32_t who/*=UNKNOWN*/)
{
#ifdef LOG_UNMAPPED_MEMORY_ACCESSES
WriteLog("Jaguar: Unknown byte read at %08X by %s (M68K PC=%06X)\n", address, whoName[who], m68k_get_reg(NULL, M68K_REG_PC));
return 0xFF;
}
-unsigned jaguar_unknown_readword(unsigned address, uint32 who/*=UNKNOWN*/)
+unsigned jaguar_unknown_readword(unsigned address, uint32_t who/*=UNKNOWN*/)
{
#ifdef LOG_UNMAPPED_MEMORY_ACCESSES
WriteLog("Jaguar: Unknown word read at %08X by %s (M68K PC=%06X)\n", address, whoName[who], m68k_get_reg(NULL, M68K_REG_PC));
return m68k_read_memory_32(address);
}
-void JaguarDasm(uint32 offset, uint32 qt)
+void JaguarDasm(uint32_t offset, uint32_t qt)
{
#ifdef CPU_DEBUG
static char buffer[2048];//, mem[64];
int pc = offset, oldpc;
- for(uint32 i=0; i<qt; i++)
+ for(uint32_t i=0; i<qt; i++)
{
/* oldpc = pc;
for(int j=0; j<64; j++)
pc += Dasm68000((char *)mem, buffer, 0);
WriteLog("%08X: %s\n", oldpc, buffer);//*/
oldpc = pc;
- pc += m68k_disassemble(buffer, pc, M68K_CPU_TYPE_68000);
+ pc += m68k_disassemble(buffer, pc, 0);//M68K_CPU_TYPE_68000);
WriteLog("%08X: %s\n", oldpc, buffer);//*/
}
#endif
}
-uint8 JaguarReadByte(uint32 offset, uint32 who/*=UNKNOWN*/)
+uint8_t JaguarReadByte(uint32_t offset, uint32_t who/*=UNKNOWN*/)
{
- uint8 data = 0x00;
-
+ uint8_t 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);
return data;
}
-uint16 JaguarReadWord(uint32 offset, uint32 who/*=UNKNOWN*/)
+uint16_t JaguarReadWord(uint32_t offset, uint32_t 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];
return jaguar_unknown_readword(offset, who);
}
-void JaguarWriteByte(uint32 offset, uint8 data, uint32 who/*=UNKNOWN*/)
+void JaguarWriteByte(uint32_t offset, uint8_t data, uint32_t who/*=UNKNOWN*/)
{
/* if (offset >= 0x4E00 && offset < 0x4E04)
WriteLog("JWB: Byte %02X written at %08X by %s\n", data, offset, whoName[who]);//*/
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;
jaguar_unknown_writebyte(offset, data, who);
}
-uint32 starCount;
-void JaguarWriteWord(uint32 offset, uint16 data, uint32 who/*=UNKNOWN*/)
+uint32_t starCount;
+void JaguarWriteWord(uint32_t offset, uint16_t data, uint32_t who/*=UNKNOWN*/)
{
/* if (offset >= 0x4E00 && offset < 0x4E04)
WriteLog("JWW: Word %04X written at %08X by %s\n", data, offset, whoName[who]);//*/
offset &= 0xFFFFFF;
- if (offset <= 0x1FFFFE)
+ // First 2M is mirrored in the $0 - $7FFFFF range
+ if (offset <= 0x7FFFFE)
{
/*
GPU Table (CD BIOS)
/*extern bool doGPUDis;
if (offset == 0x120216 && who == GPU)
doGPUDis = true;//*/
-/*extern uint32 gpu_pc;
+/*extern uint32_t gpu_pc;
if (who == GPU && (gpu_pc == 0xF03604 || gpu_pc == 0xF03638))
{
- uint32 base = offset - (offset > 0x148000 ? 0x148000 : 0x100000);
- uint32 y = base / 0x300;
- uint32 x = (base - (y * 0x300)) / 2;
+ uint32_t base = offset - (offset > 0x148000 ? 0x148000 : 0x100000);
+ uint32_t y = base / 0x300;
+ uint32_t x = (base - (y * 0x300)) / 2;
WriteLog("JWW: Writing starfield star %04X at %08X (%u/%u) [%s]\n", data, offset, x, y, (gpu_pc == 0xF03604 ? "s" : "L"));
}//*/
/*
/*if (who == GPU && offset == (0x001E17F8 + 0x34))
data = 0xFE3C;//*/
// WriteLog("JWW: Write at %08X written to by %s.\n", 0x001E17F8 + 0x34, whoName[who]);//*/
-/*extern uint32 gpu_pc;
+/*extern uint32_t gpu_pc;
if (who == GPU && (gpu_pc == 0xF03604 || gpu_pc == 0xF03638))
{
extern int objectPtr;
// if (starCount == 1)
// WriteLog("--> Drawing 1st star...\n");
//
-// uint32 base = offset - (offset > 0x148000 ? 0x148000 : 0x100000);
-// uint32 y = base / 0x300;
-// uint32 x = (base - (y * 0x300)) / 2;
+// uint32_t base = offset - (offset > 0x148000 ? 0x148000 : 0x100000);
+// uint32_t y = base / 0x300;
+// uint32_t x = (base - (y * 0x300)) / 2;
// WriteLog("JWW: Writing starfield star %04X at %08X (%u/%u) [%s]\n", data, offset, x, y, (gpu_pc == 0xF03604 ? "s" : "L"));
//A star of interest...
}
// We really should re-do this so that it does *real* 32-bit access... !!! FIX !!!
-uint32 JaguarReadLong(uint32 offset, uint32 who/*=UNKNOWN*/)
+uint32_t JaguarReadLong(uint32_t offset, uint32_t who/*=UNKNOWN*/)
{
return (JaguarReadWord(offset, who) << 16) | JaguarReadWord(offset+2, who);
}
// We really should re-do this so that it does *real* 32-bit access... !!! FIX !!!
-void JaguarWriteLong(uint32 offset, uint32 data, uint32 who/*=UNKNOWN*/)
+void JaguarWriteLong(uint32_t offset, uint32_t data, uint32_t who/*=UNKNOWN*/)
{
/* extern bool doDSPDis;
if (offset < 0x400 && !doDSPDis)
JaguarWriteWord(offset+2, data & 0xFFFF, who);
}
-void JaguarSetScreenBuffer(uint32 * buffer)
+void JaguarSetScreenBuffer(uint32_t * buffer)
{
// This is in TOM, but we set it here...
screenBuffer = buffer;
}
-void JaguarSetScreenPitch(uint32 pitch)
+void JaguarSetScreenPitch(uint32_t pitch)
{
// This is in TOM, but we set it here...
screenPitch = pitch;
//temp, for crappy crap that sux
memset(jaguarMainRAM + 0x804, 0xFF, 4);
- m68k_set_cpu_type(M68K_CPU_TYPE_68000);
+// m68k_set_cpu_type(M68K_CPU_TYPE_68000);
m68k_pulse_reset(); // Need to do this so UAE disasm doesn't segfault on exit
GPUInit();
DSPInit();
#ifdef CPU_DEBUG_MEMORY
/* WriteLog("\nJaguar: Memory Usage Stats (return addresses)\n\n");
- for(uint32 i=0; i<=raPtr; i++)
+ for(uint32_t i=0; i<=raPtr; i++)
{
WriteLog("\t%08X\n", returnAddr[i]);
WriteLog("M68000 disassembly at $%08X...\n", returnAddr[i] - 16);
//#ifdef CPU_DEBUG
// 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));
+ int32_t topOfStack = m68k_get_reg(NULL, M68K_REG_A7);
+ 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_t 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);
#if 0 // This is drawn already...
WriteLog("Jaguar: 68K AutoVector table:\n", JaguarReadWord(0x3004));
- for(uint32 i=0x64; i<=0x7C; i+=4)
+ for(uint32_t i=0x64; i<=0x7C; i+=4)
WriteLog(" #%u: %08X\n", (i-0x64)/4, JaguarReadLong(i));
#endif
JaguarDasm(0x802000, 6000);
WriteLog("\n");//*/
#endif
-/* WriteLog("\n\nM68000 disassembly at $4000...\n");
- JaguarDasm(0x4000, 10000);
+/* WriteLog("\n\nM68000 disassembly at $6004...\n");
+ JaguarDasm(0x6004, 10000);
WriteLog("\n");//*/
// WriteLog("\n\nM68000 disassembly at $802000...\n");
// JaguarDasm(0x802000, 0x1000);
}
-uint8 * GetRamPtr(void)
+uint8_t * GetRamPtr(void)
{
return jaguarMainRAM;
}
if (vjs.GPUEnabled)
GPUExec(USEC_TO_RISC_CYCLES(timeToNextEvent));
-#ifndef NEW_DAC_CODE
- if (vjs.DSPEnabled)
- {
- if (vjs.usePipelinedDSP)
- DSPExecP2(USEC_TO_RISC_CYCLES(timeToNextEvent)); // Pipelined DSP execution (3 stage)...
- else
- DSPExec(USEC_TO_RISC_CYCLES(timeToNextEvent)); // Ordinary non-pipelined DSP
- }
-#endif
-
HandleNextEvent();
}
while (!frameDone);
// 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)
{
//OK, this is hardwired to run in NTSC, and for who knows how long.
//Need to fix this so that it does a half-line in the correct amount of time
//and number of lines, depending on which mode we're in. [FIXED]
- uint16 vc = TOMReadWord(0xF00006, JAGUAR);
- uint16 vp = TOMReadWord(0xF0003E, JAGUAR) + 1;
- uint16 vi = TOMReadWord(0xF0004E, JAGUAR);
-// uint16 vbb = TOMReadWord(0xF00040, JAGUAR);
+ uint16_t vc = TOMReadWord(0xF00006, JAGUAR);
+ uint16_t vp = TOMReadWord(0xF0003E, JAGUAR) + 1;
+ uint16_t vi = TOMReadWord(0xF0004E, JAGUAR);
+// uint16_t vbb = TOMReadWord(0xF00040, JAGUAR);
vc++;
#ifdef USE_CORRECT_PAL_TIMINGS
// Each # of lines is for a full frame == 1/30s (NTSC), 1/25s (PAL).
// So we cut the number of half-lines in a frame in half. :-P
- uint16 numHalfLines = ((vjs.hardwareTypeNTSC ? 525 : 625) * 2) / 2;
+ uint16_t numHalfLines = ((vjs.hardwareTypeNTSC ? 525 : 625) * 2) / 2;
if ((vc & 0x7FF) >= numHalfLines)
#else