]> Shamusworld >> Repos - virtualjaguar/blobdiff - src/jaguar.cpp
Preliminary key handling using Qt key types.
[virtualjaguar] / src / jaguar.cpp
index 582ec85d1de2662f6325c9d2dadd8b9d717486b0..796d9ee839786f0f96bdfcb3230f9e4d5bd36403 100644 (file)
@@ -5,30 +5,36 @@
 // GCC/SDL port by Niels Wagenaar (Linux/WIN32) and Carwin Jones (BeOS)
 // Cleanups and endian wrongness amelioration by James L. Hammons
 // Note: Endian wrongness probably stems from the MAME origins of this emu and
-//       the braindead way in which MAME handles memory. :-)
+//       the braindead way in which MAME handled memory when this was written. :-)
+//
+// JLH = James L. Hammons
+//
+// WHO  WHEN        WHAT
+// ---  ----------  -----------------------------------------------------------
+// JLH  11/25/2009  Major rewrite of memory subsystem and handlers
 //
 
 #include "jaguar.h"
 
 #include <SDL.h>
 #include "SDL_opengl.h"
+#include "blitter.h"
 #include "cdrom.h"
+#include "dac.h"
 #include "dsp.h"
+#include "eeprom.h"
 #include "event.h"
 #include "gpu.h"
-#include "gui.h"
+//#include "gui.h"
 #include "jerry.h"
 #include "joystick.h"
 #include "log.h"
 #include "m68k.h"
-#include "memory.h"
+//#include "memory.h"
+#include "mmu.h"
 #include "settings.h"
 #include "tom.h"
 #include "video.h"
-#include "blitter.h"
-#include "jerry.h"
-#include "dac.h"
-#include "eeprom.h"
 
 #define CPU_DEBUG
 //Do this in makefile??? Yes! Could, but it's easier to define here...
@@ -54,27 +60,13 @@ extern int effect_start;
 extern int effect_start2, effect_start3, effect_start4, effect_start5, effect_start6;
 #endif
 
-// Memory debugging identifiers
-
-const char * whoName[9] =
-       { "Unknown", "Jaguar", "DSP", "GPU", "TOM", "JERRY", "M68K", "Blitter", "OP" };
-
 uint32 jaguar_active_memory_dumps = 0;
 
 uint32 jaguarMainROMCRC32, jaguarROMSize, jaguarRunAddress;
 
-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
 bool BIOSLoaded = false;
 bool CDBIOSLoaded = false;
 
-//uint8 cdRAM[0x100];
-uint8 * cdRAM = &jaguarMainROM[0x5FFF00];
-uint8 tomRAM[0x4000];
-uint8 jerryRAM[0x10000];
-
 #ifdef CPU_DEBUG_MEMORY
 uint8 writeMemMax[0x400000], writeMemMin[0x400000];
 uint8 readMem[0x400000];
@@ -436,7 +428,7 @@ ADDRESS_MAP_END
 */
 #endif
 
-#define EXPERIMENTAL_MEMORY_HANDLING
+//#define EXPERIMENTAL_MEMORY_HANDLING
 // Experimental memory mappage...
 // Dunno if this is a good approach or not, but it seems to make better
 // sense to have all this crap in one spot intstead of scattered all over
@@ -799,6 +791,8 @@ int irq_ack_handler(int level)
        return vector;
 }
 
+//#define USE_NEW_MMU
+
 unsigned int m68k_read_memory_8(unsigned int address)
 {
 #ifdef CPU_DEBUG_MEMORY
@@ -813,15 +807,16 @@ unsigned int m68k_read_memory_8(unsigned int address)
 /*     if (address == 0x51136 || address == 0x51138 || address == 0xFB074 || address == 0xFB076
                || address == 0x1AF05E)
                WriteLog("[RM8  PC=%08X] Addr: %08X, val: %02X\n", m68k_get_reg(NULL, M68K_REG_PC), address, jaguar_mainRam[address]);//*/
+#ifndef USE_NEW_MMU
        unsigned int retVal = 0;
 
        if ((address >= 0x000000) && (address <= 0x3FFFFF))
-               retVal = jaguarMainRam[address];
+               retVal = jaguarMainRAM[address];
 //     else if ((address >= 0x800000) && (address <= 0xDFFFFF))
        else if ((address >= 0x800000) && (address <= 0xDFFEFF))
-               retVal = jaguarMainRom[address - 0x800000];
+               retVal = jaguarMainROM[address - 0x800000];
        else if ((address >= 0xE00000) && (address <= 0xE3FFFF))
-               retVal = jaguarBootRom[address - 0xE00000];
+               retVal = jaguarBootROM[address - 0xE00000];
        else if ((address >= 0xDFFF00) && (address <= 0xDFFFFF))
                retVal = CDROMReadByte(address);
        else if ((address >= 0xF00000) && (address <= 0xF0FFFF))
@@ -836,6 +831,9 @@ unsigned int m68k_read_memory_8(unsigned int address)
 //if (address >= 0x8B5E4 && address <= 0x8B5E4 + 16)
 //     WriteLog("M68K: Read byte $%02X at $%08X [PC=%08X]\n", retVal, address, m68k_get_reg(NULL, M68K_REG_PC));
     return retVal;
+#else
+       return MMURead8(address, M68K);
+#endif
 }
 
 void gpu_dump_disassembly(void);
@@ -903,16 +901,17 @@ unsigned int m68k_read_memory_16(unsigned int address)
 /*     if (address == 0x51136 || address == 0x51138 || address == 0xFB074 || address == 0xFB076
                || address == 0x1AF05E)
                WriteLog("[RM16  PC=%08X] Addr: %08X, val: %04X\n", m68k_get_reg(NULL, M68K_REG_PC), address, GET16(jaguar_mainRam, address));//*/
+#ifndef USE_NEW_MMU
     unsigned int retVal = 0;
 
        if ((address >= 0x000000) && (address <= 0x3FFFFE))
 //             retVal = (jaguar_mainRam[address] << 8) | jaguar_mainRam[address+1];
-               retVal = GET16(jaguarMainRam, address);
+               retVal = GET16(jaguarMainRAM, address);
 //     else if ((address >= 0x800000) && (address <= 0xDFFFFE))
        else if ((address >= 0x800000) && (address <= 0xDFFEFE))
-               retVal = (jaguarMainRom[address - 0x800000] << 8) | jaguarMainRom[address - 0x800000 + 1];
+               retVal = (jaguarMainROM[address - 0x800000] << 8) | jaguarMainROM[address - 0x800000 + 1];
        else if ((address >= 0xE00000) && (address <= 0xE3FFFE))
-               retVal = (jaguarBootRom[address - 0xE00000] << 8) | jaguarBootRom[address - 0xE00000 + 1];
+               retVal = (jaguarBootROM[address - 0xE00000] << 8) | jaguarBootROM[address - 0xE00000 + 1];
        else if ((address >= 0xDFFF00) && (address <= 0xDFFFFE))
                retVal = CDROMReadWord(address, M68K);
        else if ((address >= 0xF00000) && (address <= 0xF0FFFE))
@@ -931,6 +930,9 @@ unsigned int m68k_read_memory_16(unsigned int address)
 //if (address >= 0x8B5E4 && address <= 0x8B5E4 + 16)
 //     WriteLog("M68K: Read word $%04X at $%08X [PC=%08X]\n", retVal, address, m68k_get_reg(NULL, M68K_REG_PC));
     return retVal;
+#else
+       return MMURead16(address, M68K);
+#endif
 }
 
 unsigned int m68k_read_memory_32(unsigned int address)
@@ -940,7 +942,11 @@ unsigned int m68k_read_memory_32(unsigned int address)
                WriteLog("[RM32  PC=%08X] Addr: %08X, val: %08X\n", m68k_get_reg(NULL, M68K_REG_PC), address, (m68k_read_memory_16(address) << 16) | m68k_read_memory_16(address + 2));//*/
 
 //WriteLog("--> [RM32]\n");
+#ifndef USE_NEW_MMU
     return (m68k_read_memory_16(address) << 16) | m68k_read_memory_16(address + 2);
+#else
+       return MMURead32(address, M68K);
+#endif
 }
 
 void m68k_write_memory_8(unsigned int address, unsigned int value)
@@ -964,8 +970,9 @@ void m68k_write_memory_8(unsigned int address, unsigned int value)
        if (address >= 0x18FA70 && address < (0x18FA70 + 8000))
                WriteLog("M68K: Byte %02X written at %08X by 68K\n", value, address);//*/
 
+#ifndef USE_NEW_MMU
        if ((address >= 0x000000) && (address <= 0x3FFFFF))
-               jaguarMainRam[address] = value;
+               jaguarMainRAM[address] = value;
        else if ((address >= 0xDFFF00) && (address <= 0xDFFFFF))
                CDROMWriteByte(address, value, M68K);
        else if ((address >= 0xF00000) && (address <= 0xF0FFFF))
@@ -974,6 +981,9 @@ void m68k_write_memory_8(unsigned int address, unsigned int value)
                JERRYWriteByte(address, value, M68K);
        else
                jaguar_unknown_writebyte(address, value, M68K);
+#else
+       MMUWrite8(address, value, M68K);
+#endif
 }
 
 void m68k_write_memory_16(unsigned int address, unsigned int value)
@@ -1021,11 +1031,12 @@ if (address == 0xF02110)
                || address == 0x1AF05E)
                WriteLog("[WM16  PC=%08X] Addr: %08X, val: %04X\n", m68k_get_reg(NULL, M68K_REG_PC), address, value);//*/
 
+#ifndef USE_NEW_MMU
        if ((address >= 0x000000) && (address <= 0x3FFFFE))
        {
 /*             jaguar_mainRam[address] = value >> 8;
                jaguar_mainRam[address + 1] = value & 0xFF;*/
-               SET16(jaguarMainRam, address, value);
+               SET16(jaguarMainRAM, address, value);
        }
        else if ((address >= 0xDFFF00) && (address <= 0xDFFFFE))
                CDROMWriteWord(address, value, M68K);
@@ -1042,6 +1053,9 @@ if (address == 0xF02110)
                        m68k_get_reg(NULL, M68K_REG_D0), m68k_get_reg(NULL, M68K_REG_D1));
 #endif
        }
+#else
+       MMUWrite16(address, value, M68K);
+#endif
 }
 
 void m68k_write_memory_32(unsigned int address, unsigned int value)
@@ -1059,8 +1073,12 @@ if (address == 0xF03214 && value == 0x88E30047)
 /*     if (address == 0x51136 || address == 0xFB074)
                WriteLog("[WM32  PC=%08X] Addr: %08X, val: %02X\n", m68k_get_reg(NULL, M68K_REG_PC), address, value);//*/
 
+#ifndef USE_NEW_MMU
        m68k_write_memory_16(address, value >> 16);
        m68k_write_memory_16(address + 2, value & 0xFFFF);
+#else
+       MMUWrite32(address, value, M68K);
+#endif
 }
 
 
@@ -1232,13 +1250,13 @@ uint8 JaguarReadByte(uint32 offset, uint32 who/*=UNKNOWN*/)
 
        offset &= 0xFFFFFF;
        if (offset < 0x400000)
-               data = jaguarMainRam[offset & 0x3FFFFF];
+               data = jaguarMainRAM[offset & 0x3FFFFF];
        else if ((offset >= 0x800000) && (offset < 0xC00000))
-               data = jaguarMainRom[offset - 0x800000];
+               data = jaguarMainROM[offset - 0x800000];
        else if ((offset >= 0xDFFF00) && (offset <= 0xDFFFFF))
                data = CDROMReadByte(offset, who);
        else if ((offset >= 0xE00000) && (offset < 0xE40000))
-               data = jaguarBootRom[offset & 0x3FFFF];
+               data = jaguarBootROM[offset & 0x3FFFF];
        else if ((offset >= 0xF00000) && (offset < 0xF10000))
                data = TOMReadByte(offset, who);
        else if ((offset >= 0xF10000) && (offset < 0xF20000))
@@ -1254,18 +1272,18 @@ uint16 JaguarReadWord(uint32 offset, uint32 who/*=UNKNOWN*/)
        offset &= 0xFFFFFF;
        if (offset <= 0x3FFFFE)
        {
-               return (jaguarMainRam[(offset+0) & 0x3FFFFF] << 8) | jaguarMainRam[(offset+1) & 0x3FFFFF];
+               return (jaguarMainRAM[(offset+0) & 0x3FFFFF] << 8) | jaguarMainRAM[(offset+1) & 0x3FFFFF];
        }
        else if ((offset >= 0x800000) && (offset <= 0xBFFFFE))
        {
                offset -= 0x800000;
-               return (jaguarMainRom[offset+0] << 8) | jaguarMainRom[offset+1];
+               return (jaguarMainROM[offset+0] << 8) | jaguarMainROM[offset+1];
        }
 //     else if ((offset >= 0xDFFF00) && (offset < 0xDFFF00))
        else if ((offset >= 0xDFFF00) && (offset <= 0xDFFFFE))
                return CDROMReadWord(offset, who);
        else if ((offset >= 0xE00000) && (offset <= 0xE3FFFE))
-               return (jaguarBootRom[(offset+0) & 0x3FFFF] << 8) | jaguarBootRom[(offset+1) & 0x3FFFF];
+               return (jaguarBootROM[(offset+0) & 0x3FFFF] << 8) | jaguarBootROM[(offset+1) & 0x3FFFF];
        else if ((offset >= 0xF00000) && (offset <= 0xF0FFFE))
                return TOMReadWord(offset, who);
        else if ((offset >= 0xF10000) && (offset <= 0xF1FFFE))
@@ -1284,7 +1302,7 @@ void JaguarWriteByte(uint32 offset, uint8 data, uint32 who/*=UNKNOWN*/)
        offset &= 0xFFFFFF;
        if (offset < 0x400000)
        {
-               jaguarMainRam[offset & 0x3FFFFF] = data;
+               jaguarMainRAM[offset & 0x3FFFFF] = data;
                return;
        }
        else if ((offset >= 0xDFFF00) && (offset <= 0xDFFFFF))
@@ -1412,8 +1430,8 @@ if (who == GPU && (gpu_pc == 0xF03604 || gpu_pc == 0xF03638))
 if (offset == 0x11D31A + 0x48000 || offset == 0x11D31A)
        WriteLog("JWW: %s writing star %04X at %08X...\n", whoName[who], data, offset);//*/
 
-               jaguarMainRam[(offset+0) & 0x3FFFFF] = data >> 8;
-               jaguarMainRam[(offset+1) & 0x3FFFFF] = data & 0xFF;
+               jaguarMainRAM[(offset+0) & 0x3FFFFF] = data >> 8;
+               jaguarMainRAM[(offset+1) & 0x3FFFFF] = data & 0xFF;
                return;
        }
        else if (offset >= 0xDFFF00 && offset <= 0xDFFFFE)
@@ -1470,13 +1488,13 @@ void JaguarInit(void)
        memset(writeMemMin, 0xFF, 0x400000);
        memset(writeMemMax, 0x00, 0x400000);
 #endif
-       memset(jaguarMainRam, 0x00, 0x400000);
+       memset(jaguarMainRAM, 0x00, 0x400000);
 //     memset(jaguar_mainRom, 0xFF, 0x200000); // & set it to all Fs...
 //     memset(jaguar_mainRom, 0x00, 0x200000); // & set it to all 0s...
 //NOTE: This *doesn't* fix FlipOut...
 //Or does it? Hmm...
 //Seems to want $01010101... Dunno why. Investigate!
-       memset(jaguarMainRom, 0x01, 0x600000);  // & set it to all 01s...
+       memset(jaguarMainROM, 0x01, 0x600000);  // & set it to all 01s...
 //     memset(jaguar_mainRom, 0xFF, 0x600000); // & set it to all Fs...
 
        m68k_set_cpu_type(M68K_CPU_TYPE_68000);
@@ -1495,9 +1513,9 @@ void JaguarReset(void)
 {
 //NOTE: This causes a (virtual) crash if this is set in the config but not found... !!! FIX !!!
        if (vjs.useJaguarBIOS)
-               memcpy(jaguarMainRam, jaguarBootRom, 8);
+               memcpy(jaguarMainRAM, jaguarBootROM, 8);
        else
-               SET32(jaguarMainRam, 4, jaguarRunAddress);
+               SET32(jaguarMainRAM, 4, jaguarRunAddress);
 
 //     WriteLog("jaguar_reset():\n");
        TOMReset();
@@ -1696,13 +1714,13 @@ void DumpMainMemory(void)
        if (fp == NULL)
                return;
 
-       fwrite(jaguarMainRam, 1, 0x400000, fp);
+       fwrite(jaguarMainRAM, 1, 0x400000, fp);
        fclose(fp);
 }
 
 uint8 * GetRamPtr(void)
 {
-       return jaguarMainRam;
+       return jaguarMainRAM;
 }
 
 //
@@ -1873,7 +1891,8 @@ void ScanlineCallback(void)
 //     if (vc == vbb)
        {
                JoystickExec();
-               RenderBackbuffer();
+//We comment this out so that the GUI can manage this instead. Which is how it should be anyway.
+//             RenderBackbuffer();
                TOMResetBackbuffer(backbuffer);
                frameDone = true;
        }//*/