diff --git a/A7800DS.nds b/A7800DS.nds index 7994e05..ad0dfa3 100644 Binary files a/A7800DS.nds and b/A7800DS.nds differ diff --git a/Makefile b/Makefile index 57dd4be..048cb9c 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -VERSION=2.7 +VERSION=2.8 TARGNAME=A7800DS #--------------------------------------------------------------------------------- diff --git a/arm9/gfx/pdev_bg0.png b/arm9/gfx/pdev_bg0.png index b70f46b..c797717 100644 Binary files a/arm9/gfx/pdev_bg0.png and b/arm9/gfx/pdev_bg0.png differ diff --git a/arm9/source/a7800utils.c b/arm9/source/a7800utils.c index 0a9017a..117f35b 100644 --- a/arm9/source/a7800utils.c +++ b/arm9/source/a7800utils.c @@ -17,8 +17,8 @@ #include "bgTop.h" #include "bgFileSel.h" -static unsigned int sound_idx __attribute__((section(".dtcm"))) = 0; -static unsigned int myPokeyBufIdx __attribute__((section(".dtcm"))) = 0; +u8 isDS_LITE __attribute__((section(".dtcm"))) = 0; + static unsigned char lastPokeySample __attribute__((section(".dtcm"))) = 0; static unsigned char lastTiaSample __attribute__((section(".dtcm"))) = 0; static unsigned char lastSample __attribute__((section(".dtcm"))) = 0; @@ -35,10 +35,10 @@ int bg2; int bg3; // BG pointers int bg0s, bg1s, bg2s, bg3s; // sub BG pointers -int full_speed = 0; +u16 full_speed = 0; int etatEmu; -int gTotalAtariFrames=0; -int fpsDisplay=0; +u16 gTotalAtariFrames=0; +u16 fpsDisplay=0; int atari_frames = 0; #define MAX_DEBUG 5 @@ -56,7 +56,7 @@ short cxBG, cyBG, xdxBG,ydyBG; unsigned char *filebuffer; -bool bRefreshXY = false; +u8 bRefreshXY = false; #define WAITVBL swiWaitForVBlank(); swiWaitForVBlank(); swiWaitForVBlank(); swiWaitForVBlank(); swiWaitForVBlank(); @@ -96,28 +96,36 @@ static void DumpDebugData(void) #endif } - +u16 myTiaBufIdx __attribute__((section(".dtcm"))) = 0; +u8* snd_ptr __attribute__((section(".dtcm"))) = (u8*)((u32)sound_buffer + 0xA000000); +u8* snd_sta __attribute__((section(".dtcm"))) = (u8*)((u32)sound_buffer + 0xA000000); +u8* snd_end __attribute__((section(".dtcm"))) = (u8*)((u32)sound_buffer + 0xA000000 + SNDLENGTH); void VsoundHandler(void) { - static unsigned int sound_idx = 0; extern unsigned char tia_buffer[]; - extern int tiaBufIdx; - static int myTiaBufIdx=0; - - // If there is a fresh sample... - if (myTiaBufIdx != tiaBufIdx) + extern u16 tiaBufIdx; + + for (u8 i=0; i<2; i++) { - lastSample = tia_buffer[myTiaBufIdx]; - myTiaBufIdx = (myTiaBufIdx+1) & (SNDLENGTH-1); + // If there is a fresh sample... + if (myTiaBufIdx != tiaBufIdx) + { + lastSample = tia_buffer[myTiaBufIdx]; + myTiaBufIdx = (myTiaBufIdx+1) & (SNDLENGTH-1); + } + *snd_ptr++ = lastSample; + if (snd_ptr == snd_end) + { + snd_ptr = snd_sta; + } } - sound_buffer[sound_idx] = lastSample; - sound_idx = (sound_idx+1) & (SNDLENGTH-1); } +u16 myPokeyBufIdx __attribute__((section(".dtcm"))) = 0; void VsoundHandler_Pokey(void) { extern unsigned char pokey_buffer[]; - extern int pokeyBufIdx; + extern u16 pokeyBufIdx; // If there is a fresh Pokey sample... if (myPokeyBufIdx != pokeyBufIdx) @@ -125,8 +133,11 @@ void VsoundHandler_Pokey(void) lastPokeySample = pokey_buffer[myPokeyBufIdx]; myPokeyBufIdx = (myPokeyBufIdx+1) & (SNDLENGTH-1); } - sound_buffer[sound_idx] = lastPokeySample; - sound_idx = (sound_idx+1) & (SNDLENGTH-1); + *snd_ptr++ = lastPokeySample; + if (snd_ptr == snd_end) + { + snd_ptr = snd_sta; + } } @@ -205,13 +216,21 @@ void vblankIntr() void dsInitScreenMain(void) { - SetYtrigger(192); //trigger 2 lines before vsync + SetYtrigger(190); //trigger 2 lines before vsync irqSet(IRQ_VBLANK, vblankIntr); irqEnable(IRQ_VBLANK); + + if (isDSiMode()) isDS_LITE = false; + else isDS_LITE = true; vramSetBankB(VRAM_B_MAIN_BG_0x06020000 ); // Need to do this early so we can steal a bit of this RAM for bank swap... - vramSetBankD(VRAM_D_MAIN_BG_0x06040000 ); // Not using this for video but for cartridge bank swap area... it's faster! - vramSetBankE(VRAM_E_LCD ); // Not using this for video but 64K of faster RAM always useful! Mapped at 0x06880000 + vramSetBankD(VRAM_D_LCD ); // Not using this for video but 128K of faster RAM always useful! Mapped at 0x06860000 - Used for Cart Bankswitch + vramSetBankE(VRAM_E_LCD ); // Not using this for video but 64K of faster RAM always useful! Mapped at 0x06880000 - Used for Cart Bankswitch + vramSetBankF(VRAM_F_LCD ); // Not using this for video but 16K of faster RAM always useful! Mapped at 0x06890000 - .. + vramSetBankG(VRAM_G_LCD ); // Not using this for video but 16K of faster RAM always useful! Mapped at 0x06894000 - .. + vramSetBankH(VRAM_H_LCD ); // Not using this for video but 32K of faster RAM always useful! Mapped at 0x06898000 - .. + vramSetBankI(VRAM_I_LCD ); // Not using this for video but 16K of faster RAM always useful! Mapped at 0x068A0000 - .. + } void dsInitTimer(void) @@ -226,7 +245,8 @@ void dsShowScreenEmu(void) videoSetMode(MODE_5_2D | DISPLAY_BG2_ACTIVE | DISPLAY_BG3_ACTIVE); vramSetBankA(VRAM_A_MAIN_BG_0x06000000); vramSetBankB(VRAM_B_MAIN_BG_0x06020000 ); - vramSetBankD(VRAM_D_MAIN_BG_0x06040000 ); // Not using this for video but for cartridge bank swap area... it's faster! + vramSetBankD(VRAM_D_LCD ); // Not using this for video but 128K of faster RAM always useful! Mapped at 0x06860000 - Used for Cart Bankswitch + vramSetBankE(VRAM_E_LCD ); // Not using this for video but 64K of faster RAM always useful! Mapped at 0x06880000 - Used for Cart Bankswitch bg0 = bgInit(3, BgType_Bmp8, BgSize_B8_512x512, 0,0); bg1 = bgInit(2, BgType_Bmp8, BgSize_B8_512x512, 0,0); @@ -360,13 +380,6 @@ void dsLoadGame(char *filename) GameConf.DS_Pad[14] = 7; GameConf.DS_Pad[15] = 9; dsInstallSoundEmuFIFO(); - TIMER2_DATA = TIMER_FREQ((cartridge_pokey ? SOUND_FREQ:SOUND_FREQ*2)); - TIMER2_CR = TIMER_DIV_1 | TIMER_IRQ_REQ | TIMER_ENABLE; - if (cartridge_pokey) - irqSet(IRQ_TIMER2, VsoundHandler_Pokey); - else - irqSet(IRQ_TIMER2, VsoundHandler); - irqEnable(IRQ_TIMER2); atari_frames = 0; TIMER0_CR=0; @@ -454,7 +467,7 @@ void dsDisplayFiles(unsigned int NoDebGame,u32 ucSel) dsPrintValue(16-strlen(szName)/2,3,0,szName); dsPrintValue(31,5,0,(char *) (NoDebGame>0 ? "<" : " ")); dsPrintValue(31,22,0,(char *) (NoDebGame+14" : " ")); - sprintf(szName,"%s","A TO SELECT A GAME, B TO GO BACK"); + sprintf(szName,"%s","A=SELECT, X=NO SOUND, B=BACK"); dsPrintValue(16-strlen(szName)/2,23,0,szName); for (ucBcl=0;ucBcl<17; ucBcl++) { @@ -590,12 +603,16 @@ unsigned int dsWaitForRom(void) while (keysCurrent() & KEY_B); } - if (keysCurrent() & KEY_A) { - if (!proromlist[ucFicAct].directory) { + if (keysCurrent() & (KEY_A | KEY_X)) + { + if (!proromlist[ucFicAct].directory) + { + if (keysCurrent() & KEY_X) is_mute = true; else is_mute=false; bRet=true; bDone=true; } - else { + else + { chdir(proromlist[ucFicAct].filename); proFindFiles(); ucFicAct = 0; @@ -712,9 +729,17 @@ void dsPrintValue(int x, int y, unsigned int isSelect, char *pchStr) //--------------------------------------------------------------------------------- void dsInstallSoundEmuFIFO(void) { + memset(sound_buffer, 0x00, SNDLENGTH); + irqDisable(IRQ_TIMER2); + + if (is_mute) + { + return; // We've been asked to not install sound... + } + FifoMessage msg; msg.SoundPlay.data = &sound_buffer; - msg.SoundPlay.freq = (cartridge_pokey ? SOUND_FREQ:SOUND_FREQ*2); + msg.SoundPlay.freq = (cartridge_pokey ? SOUND_FREQ+21:(SOUND_FREQ*2)+21); msg.SoundPlay.volume = 127; msg.SoundPlay.pan = 64; msg.SoundPlay.loop = 1; @@ -723,6 +748,27 @@ void dsInstallSoundEmuFIFO(void) msg.SoundPlay.dataSize = SNDLENGTH >> 2; msg.type = EMUARM7_PLAY_SND; fifoSendDatamsg(FIFO_USER_01, sizeof(msg), (u8*)&msg); + + if (isDS_LITE) + { + snd_ptr = (u8*)((u32)sound_buffer + 0x00400000); + snd_sta = (u8*)((u32)sound_buffer + 0x00400000); + snd_end = (u8*)((u32)sound_buffer + 0x00400000 + SNDLENGTH); + } + else + { + snd_ptr = (u8*)((u32)sound_buffer + 0xA000000); + snd_sta = (u8*)((u32)sound_buffer + 0xA000000); + snd_end = (u8*)((u32)sound_buffer + 0xA000000 + SNDLENGTH); + } + + TIMER2_DATA = TIMER_FREQ(SOUND_FREQ); + TIMER2_CR = TIMER_DIV_1 | TIMER_IRQ_REQ | TIMER_ENABLE; + if (cartridge_pokey) + irqSet(IRQ_TIMER2, VsoundHandler_Pokey); + else + irqSet(IRQ_TIMER2, VsoundHandler); + irqEnable(IRQ_TIMER2); } void dsMainLoop(void) @@ -933,6 +979,7 @@ void dsMainLoop(void) if (fpsDisplay) { int fps = gTotalAtariFrames; + if (fps == 61) fps=60; gTotalAtariFrames = 0; fpsbuf[0] = '0' + (int)fps/100; fps = fps % 100; diff --git a/arm9/source/emu/Cartridge.c b/arm9/source/emu/Cartridge.c index 9d6e2c0..95c3a9e 100644 --- a/arm9/source/emu/Cartridge.c +++ b/arm9/source/emu/Cartridge.c @@ -32,24 +32,24 @@ char cartridge_year[128]; char cartridge_maker[128]; byte cartridge_digest[128]; char cartridge_filename[128]; -byte cartridge_type; -byte cartridge_region; -byte cartridge_pokey; +byte cartridge_type __attribute__((section(".dtcm"))); +byte cartridge_region __attribute__((section(".dtcm"))); +byte cartridge_pokey __attribute__((section(".dtcm"))); bool cartridge_hsc_enabled; byte cartridge_controller[2]; -byte cartridge_bank; -bool cartridge_steals_cycles; -bool cartridge_uses_wsync; -int cartridge_xOffset = 0; -int cartridge_yOffset = 22; -int cartridge_xScale = 256; -int cartridge_yScale = 220; +byte cartridge_bank __attribute__((section(".dtcm"))); +bool cartridge_steals_cycles __attribute__((section(".dtcm"))); +bool cartridge_uses_wsync __attribute__((section(".dtcm"))); +short cartridge_xOffset = 0; +short cartridge_yOffset = 22; +short cartridge_xScale = 256; +short cartridge_yScale = 220; uint cartridge_diff1 = DIFF_A; uint cartridge_diff2 = DIFF_A; extern int debug[]; -static byte* cartridge_buffer = NULL; -static uint cartridge_size = 0; +static byte* cartridge_buffer __attribute__((section(".dtcm"))) = NULL; +static uint cartridge_size __attribute__((section(".dtcm"))) = 0; static uint maxbank = 9; // ---------------------------------------------------------------------------- @@ -94,7 +94,7 @@ inline static void cartridge_WriteBank(word address, byte bank) last_bank = bank; uint offset = cartridge_GetBank(bank) * 16384; if(offset < cartridge_size) { - memory_WriteROMFast(address, 16384, cartridge_buffer + offset); + memory_WriteROMFast(address, (16384/4), cartridge_buffer + offset); cartridge_bank = bank; } } @@ -212,7 +212,7 @@ static bool _cartridge_Load(const byte* data, uint size) } if (cartridge_size <= (144 * 1024)) - cartridge_buffer = (byte *) 0x0603C000; // If smaller than 144k (98% of all carts are), we can use the VRAM buffer since it's faster to move stuff around... + cartridge_buffer = (byte *) 0x06860000; // If smaller than 144k (98% of all carts are), we can use the VRAM buffer since it's faster to move stuff around... else cartridge_buffer = (byte *) malloc(cartridge_size); // Otherwise allocate memory for(index = 0; index < cartridge_size; index++) { @@ -411,7 +411,7 @@ void cartridge_Release( ) // Snap out the High Score SRAM (if used) cartridge_SaveHighScoreSram(); - if ((u32)cartridge_buffer != 0x0603C000) + if ((u32)cartridge_buffer != 0x06860000) { free(cartridge_buffer); } diff --git a/arm9/source/emu/Cartridge.h b/arm9/source/emu/Cartridge.h index 3dc812f..6f6b8d0 100644 --- a/arm9/source/emu/Cartridge.h +++ b/arm9/source/emu/Cartridge.h @@ -104,10 +104,10 @@ extern byte cartridge_pokey; extern bool cartridge_hsc_enabled; extern byte cartridge_controller[2]; extern byte cartridge_bank; -extern int cartridge_xOffset; -extern int cartridge_yOffset; -extern int cartridge_xScale; -extern int cartridge_yScale; +extern short cartridge_xOffset; +extern short cartridge_yOffset; +extern short cartridge_xScale; +extern short cartridge_yScale; extern bool cartridge_steals_cycles; extern bool cartridge_uses_wsync; extern uint cartridge_diff1; diff --git a/arm9/source/emu/Database.c b/arm9/source/emu/Database.c index 245361a..e158510 100644 --- a/arm9/source/emu/Database.c +++ b/arm9/source/emu/Database.c @@ -50,52 +50,52 @@ typedef struct { Database_Entry game_list[] = { {"f5150c0fc1948832211e57852abb0c6e", "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", CT_NORMAL, POKEY_AT_450, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_YES, 0, 22, 256, 220}, // title=7800 Utility Cart - {"4332c24e4f3bc72e7fe1b77adf66c2b7", "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", CT_NORMAL, POKEY_NONE, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_NO, 0, 22, 256, 220}, // title=3D Asteroids - {"0be996d25144966d5541c9eb4919b289", "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", CT_SUPROM, POKEY_NONE, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_NO, 0, 22, 256, 220}, // title=Ace Of Aces - {"877dcc97a775ed55081864b2dbf5f1e2", "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", CT_SUPLRG, POKEY_NONE, LGN, LGN, DIFF_A, DIFF_A, NTSC, NO_STEALING, USES_WSYNC, HSC_NO, 7, 30, 264, 230}, // title=Alien Brigade - {"212ee2a6e66d8bb7fbf26f343cc8dc19", "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", CT_SUPCAR, POKEY_AT_450, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_NO, 0, 17, 256, 200}, // title=Arkanoid 78b Demo (purposely set HSC to false - game HSC is buggy) - {"07342c78619ba6ffcc61c10e907e3b50", "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", CT_NORMAL, POKEY_NONE, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_YES, 0, 25, 256, 230}, // title=Asteroids + {"4332c24e4f3bc72e7fe1b77adf66c2b7", "3D Asteroids", CT_NORMAL, POKEY_NONE, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_NO, 0, 22, 256, 220}, // title=3D Asteroids + {"0be996d25144966d5541c9eb4919b289", "Ace of Aces", CT_SUPROM, POKEY_NONE, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_NO, 0, 22, 256, 220}, // title=Ace Of Aces + {"877dcc97a775ed55081864b2dbf5f1e2", "Alien Brigade", CT_SUPLRG, POKEY_NONE, LGN, LGN, DIFF_A, DIFF_A, NTSC, NO_STEALING, USES_WSYNC, HSC_NO, 7, 30, 264, 230}, // title=Alien Brigade + {"212ee2a6e66d8bb7fbf26f343cc8dc19", "Arkanoid", CT_SUPCAR, POKEY_AT_450, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_NO, 0, 17, 256, 200}, // title=Arkanoid 78b Demo (purposely set HSC to false - game HSC is buggy) {"a65f79ad4a0bbdecd59d5f7eb3623fd7", "Asteroids Deluxe (NTSC)", CT_NORMAL, POKEY_NONE, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_YES, 0, 25, 256, 230}, // title=Asteroids Deluxe + {"07342c78619ba6ffcc61c10e907e3b50", "Asteroids", CT_NORMAL, POKEY_NONE, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_YES, 0, 25, 256, 230}, // title=Asteroids {"3d38281ed8a8d8c7cd457a18c92c8604", "Astro Blaster", CT_NORMAL, POKEY_NONE, JOY, JOY, DIFF_B, DIFF_B, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_YES, 30, 17, 320, 210}, // title=Astro Blaster {"a51e5df28a0fe8c52e9d28fb5f8e44a6", "Astro Fighter", CT_NORMAL, POKEY_NONE, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_YES, 30, 16, 320, 210}, // title=Astro Fighter {"7cdfbe37634e7dcd4dc67db7edbcd3ba", "Baby Pac-Man", CT_NORMAL, POKEY_NONE, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_NO, 30, 22, 320, 220}, // title=Baby Pac Man - {"8fc3a695eaea3984912d98ed4a543376", "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", CT_NORMAL, POKEY_AT_4000, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_NO, 0, 22, 256, 220}, // title=Ballblazer - {"42682415906c21c6af80e4198403ffda", "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", CT_SUPCAR, POKEY_AT_4000, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_NO, 0, 22, 256, 220}, // title=Barnyard Blaster - {"f5f6b69c5eb4b55fc163158d1a6b423e", "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", CT_SUPROM, POKEY_NONE, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_NO, 0, 22, 256, 220}, // title=Basketbrawl + {"8fc3a695eaea3984912d98ed4a543376", "Ballblazer", CT_NORMAL, POKEY_AT_4000, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_NO, 0, 22, 256, 220}, // title=Ballblazer + {"42682415906c21c6af80e4198403ffda", "Barnyard Blaster", CT_SUPCAR, POKEY_AT_4000, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_NO, 0, 22, 256, 220}, // title=Barnyard Blaster + {"f5f6b69c5eb4b55fc163158d1a6b423e", "Basketbrawl", CT_SUPROM, POKEY_NONE, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_NO, 0, 22, 256, 220}, // title=Basketbrawl {"78b1061d651ef806becac1dd3fda29a0", "Beef Drop", CT_NORMAL, POKEY_AT_4000, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, SKIP_WSYNC, HSC_YES, 0, 16, 256, 220}, // title=Beef Drop (Final Atariage) {"4e325918a8b3bbcf2f9405040abcfc6d", "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", CT_NORMAL, POKEY_NONE, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_YES, 0, 26, 256, 220}, // title=BonQ (found on Atairage Age site) {"9fa7743a016c9b7015ee1d386326f88e", "b*nQ", CT_NORMAL, POKEY_NONE, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, SKIP_WSYNC, HSC_YES, 0, 26, 256, 220}, // title=BonQ (final Atariage) - {"5a09946e57dbe30408a8f253a28d07db", "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", CT_NORMAL, POKEY_NONE, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_YES, 24, 24, 300, 230}, // title=Centipede + {"5a09946e57dbe30408a8f253a28d07db", "Centipede", CT_NORMAL, POKEY_NONE, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_YES, 24, 24, 300, 230}, // title=Centipede {"20660b667df538ec32a8e1b998438604", "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", CT_NORMAL, POKEY_NONE, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_YES, 24, 24, 300, 230}, // title=Centipede - Frameless Hack - {"93e4387864b014c155d7c17877990d1e", "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", CT_NORMAL, POKEY_NONE, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_NO, 0, 22, 256, 220}, // title=Choplifter - {"2e8e28f6ad8b9b9267d518d880c73ebb", "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", CT_SUPCAR, POKEY_AT_4000, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_NO, 0, 20, 256, 220}, // title=Commando - {"db691469128d9a4217ec7e315930b646", "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", CT_SUPCAR, POKEY_NONE, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_NO, 0, 22, 256, 220}, // title=Crack'ed - {"a94e4560b6ad053a1c24e096f1262ebf", "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", CT_SUPLRG, POKEY_NONE, LGN, LGN, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_NO, 0, 22, 256, 220}, // title=Crossbow - {"179b76ff729d4849b8f66a502398acae", "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", CT_SUPCAR, POKEY_NONE, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_NO, 0, 21, 256, 220}, // title=Dark Chambers - {"95ac811c7d27af0032ba090f28c107bd", "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", CT_NORMAL, POKEY_NONE, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_NO, 0, 22, 256, 220}, // title=Desert Falcon - {"731879ea82fc0ca245e39e036fe293e6", "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", CT_NORMAL, POKEY_NONE, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_YES, 0, 22, 256, 220}, // title=Dig Dug - {"5e332fbfc1e0fc74223d2e73271ce650", "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", CT_NORMAL, POKEY_NONE, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_NO, 0, 22, 256, 220}, // title=Donkey Kong Jr - {"19f1ee292a23636bd57d408b62de79c7", "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", CT_NORMAL, POKEY_NONE, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_NO, 0, 22, 256, 220}, // title=Donkey Kong + {"93e4387864b014c155d7c17877990d1e", "Choplifter", CT_NORMAL, POKEY_NONE, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_NO, 0, 22, 256, 220}, // title=Choplifter + {"2e8e28f6ad8b9b9267d518d880c73ebb", "Commando", CT_SUPCAR, POKEY_AT_4000, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_NO, 0, 20, 256, 220}, // title=Commando + {"db691469128d9a4217ec7e315930b646", "Crack'ed", CT_SUPCAR, POKEY_NONE, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_NO, 0, 22, 256, 220}, // title=Crack'ed + {"a94e4560b6ad053a1c24e096f1262ebf", "Crossbow", CT_SUPLRG, POKEY_NONE, LGN, LGN, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_NO, 0, 22, 256, 220}, // title=Crossbow + {"179b76ff729d4849b8f66a502398acae", "Dark Chambers", CT_SUPCAR, POKEY_NONE, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_NO, 0, 21, 256, 220}, // title=Dark Chambers + {"95ac811c7d27af0032ba090f28c107bd", "Desert Falcon", CT_NORMAL, POKEY_NONE, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_NO, 0, 22, 256, 220}, // title=Desert Falcon + {"731879ea82fc0ca245e39e036fe293e6", "Dig Dug", CT_NORMAL, POKEY_NONE, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_YES, 0, 22, 256, 220}, // title=Dig Dug + {"5e332fbfc1e0fc74223d2e73271ce650", "Donkey Kong Jr", CT_NORMAL, POKEY_NONE, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_NO, 0, 22, 256, 220}, // title=Donkey Kong Jr + {"19f1ee292a23636bd57d408b62de79c7", "Donkey Kong", CT_NORMAL, POKEY_NONE, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_NO, 0, 22, 256, 220}, // title=Donkey Kong {"c3107d3e3e17d67e3a11d47a5946a4f3", "DONKEY KONG XM", CT_SUPLRG, POKEY_AT_4000, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_NO, 0, 20, 256, 210}, // title=Donkey Kong XM Demo (purposely set HSC to false - game HSC is buggy) - {"543484c00ba233736bcaba2da20eeea9", "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", CT_ACTVIS, POKEY_NONE, JOY, JOY, DIFF_A, DIFF_A, NTSC, NO_STEALING, SKIP_WSYNC, HSC_NO, 0, 22, 256, 220}, // title=Double Dragon + {"543484c00ba233736bcaba2da20eeea9", "Double Dragon", CT_ACTVIS, POKEY_NONE, JOY, JOY, DIFF_A, DIFF_A, NTSC, NO_STEALING, SKIP_WSYNC, HSC_NO, 0, 22, 256, 220}, // title=Double Dragon {"94009ccfdcd4f55d24033ca06269ba6a", "Dragon's Descent", CT_NORMAL, POKEY_NONE, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_NO, 0, 24, 256, 234}, // title=Dragon's Descent 1.7 - {"fab1290f9a4c4f2b4d831c8a57f969f5", "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", CT_SUPRAM, POKEY_NONE, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_YES, 0, 25, 256, 230}, // title=Draker Quest {"a9f29004412621f20ad9f5c51cc11486", "Draker Quest II", CT_SUPRAM, POKEY_NONE, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_YES, 0, 24, 256, 230}, // title=Draker Quest II - {"b3143adbbb7d7d189e918e5b29d55a72", "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", CT_NORMAL, POKEY_AT_450, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_YES, 0, 23, 256, 220}, // title=Dungeon Stalker (homebrew) + {"fab1290f9a4c4f2b4d831c8a57f969f5", "Draker Quest", CT_SUPRAM, POKEY_NONE, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_YES, 0, 25, 256, 230}, // title=Draker Quest + {"b3143adbbb7d7d189e918e5b29d55a72", "Dungeon Stalker", CT_NORMAL, POKEY_AT_450, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_YES, 0, 23, 256, 220}, // title=Dungeon Stalker (homebrew) {"faea27017447dd8bae677d91125a8135", "EXO", CT_SUPRAM, POKEY_NONE, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_YES, 0, 25, 256, 230}, // title=E.X.O. - {"2251a6a0f3aec84cc0aff66fc9fa91e8", "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", CT_ABSOLU, POKEY_NONE, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_NO, 0, 22, 256, 220}, // title=F-18 Hornet - {"6287727ab36391a62f728bbdee88675c", "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", CT_NORMAL, POKEY_NONE, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_YES, 0, 22, 256, 220}, // title=Failsafe (homebrew) - {"d25d5d19188e9f149977c49eb0367cd1", "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", CT_SUPROM, POKEY_NONE, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_NO, 0, 22, 256, 220}, // title=Fatal Run - {"07dbbfe612a0a28e283c01545e59f25e", "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", CT_SUPROM, POKEY_NONE, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_NO, 0, 22, 256, 220}, // title=Fight Night - {"cf76b00244105b8e03cdc37677ec1073", "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", CT_NORMAL, POKEY_NONE, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_YES, 0, 22, 256, 220}, // title=Food Fight + {"2251a6a0f3aec84cc0aff66fc9fa91e8", "F-18 Hornet", CT_ABSOLU, POKEY_NONE, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_NO, 0, 22, 256, 220}, // title=F-18 Hornet + {"6287727ab36391a62f728bbdee88675c", "Failsafe", CT_NORMAL, POKEY_NONE, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_YES, 0, 22, 256, 220}, // title=Failsafe (homebrew) + {"d25d5d19188e9f149977c49eb0367cd1", "Fatal Run", CT_SUPROM, POKEY_NONE, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_NO, 0, 22, 256, 220}, // title=Fatal Run + {"07dbbfe612a0a28e283c01545e59f25e", "Fight Night", CT_SUPROM, POKEY_NONE, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_NO, 0, 22, 256, 220}, // title=Fight Night + {"cf76b00244105b8e03cdc37677ec1073", "Food Fight", CT_NORMAL, POKEY_NONE, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_YES, 0, 22, 256, 220}, // title=Food Fight {"e7d89669a7f92ec2cc99d9663a28671c", "Frenzy (w-Berzerk)", CT_NORMAL, POKEY_NONE, JOY, JOY, DIFF_A, DIFF_A, NTSC, NO_STEALING, USES_WSYNC, HSC_YES, 30, 15, 320, 205}, // title=Frenzy (with Berzerk) (homebrew) {"6053233cb59c0b4ca633623fd76c4576", "Froggie", CT_NORMAL, POKEY_AT_4000, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_YES, 34, 16, 320, 205}, // title=Froggie (homebrew) - {"fb8d803b328b2e442548f7799cfa9a4a", "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", CT_NORMAL, POKEY_NONE, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_YES, 0, 22, 256, 220}, // title=Galaga + {"fb8d803b328b2e442548f7799cfa9a4a", "Galaga", CT_NORMAL, POKEY_NONE, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_YES, 0, 22, 256, 220}, // title=Galaga {"98dbb110105c1445bb4efd79d53c79ae", "Galaxian", CT_NORMAL, POKEY_NONE, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_YES, 0, 13, 256, 200}, // title=Galaxian - {"06204dadc975be5e5e37e7cc66f984cf", "Galaga", CT_NORMAL, POKEY_NONE, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_NO, 0, 22, 256, 220}, // title=Gato + {"06204dadc975be5e5e37e7cc66f984cf", "Gato", CT_NORMAL, POKEY_NONE, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_NO, 0, 22, 256, 220}, // title=Gato {"e443f7fb5be3283dd44c0f5d80c3a7b3", "GoSub", CT_NORMAL, POKEY_NONE, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_NO, 12, 22, 280, 230}, // title=GoSub - {"fd9e78e201b6baafddfd3e1fbfe6ba31", "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", CT_NORMAL, POKEY_NONE, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_NO, 0, 22, 256, 220}, // title=Hat Trick - {"c3672482ca93f70eafd9134b936c3feb", "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", CT_SUPROM, POKEY_NONE, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_NO, 0, 25, 256, 230}, // title=Ikari Warriors + {"fd9e78e201b6baafddfd3e1fbfe6ba31", "Hat Trick", CT_NORMAL, POKEY_NONE, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_NO, 0, 22, 256, 220}, // title=Hat Trick + {"c3672482ca93f70eafd9134b936c3feb", "Ikari Warriors", CT_SUPROM, POKEY_NONE, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_NO, 0, 25, 256, 230}, // title=Ikari Warriors {"baebc9246c087e893dfa489632157180", "Impossible Mission", CT_SUPRAM, POKEY_NONE, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_NO, 0, 22, 256, 220}, // title=Impossible Mission {"1745feadabb24e7cefc375904c73fa4c", "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", CT_SUPRAM, POKEY_NONE, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_NO, 0, 22, 256, 220}, // title=Impossible Mission {"045fd12050b7f2b842d5970f2414e912", "Jinks", CT_SUPRAM, POKEY_NONE, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_NO, 0, 22, 256, 234}, // title=Jinks @@ -103,61 +103,59 @@ Database_Entry game_list[] = { {"e54edc299e72d22d0ba05d16f3393e8c", "Jr. Pac-Man (NTSC)", CT_NORMAL, POKEY_NONE, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_YES, 0, 22, 256, 220}, // title=Jr Pac-Man {"c3a5a8692a423d43d9d28dd5b7d109d9", "Karateka", CT_NORMAL, POKEY_NONE, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_NO, 0, 22, 256, 220}, // title=Karateka {"17b3b764d33eae9b5260f01df7bb9d2f", "Klax", CT_SUPROM, POKEY_NONE, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_NO, 0, 28, 256, 234}, // title=Klax - {"f57d0af323d4e173fb49ed447f0563d7", "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", CT_NORMAL, POKEY_NONE, JOY, JOY, DIFF_A, DIFF_A, NTSC, NO_STEALING, SKIP_WSYNC, HSC_NO, 0, 22, 256, 220}, // title=Kung Fu Master + {"f57d0af323d4e173fb49ed447f0563d7", "Kung Fu Master", CT_NORMAL, POKEY_NONE, JOY, JOY, DIFF_A, DIFF_A, NTSC, NO_STEALING, SKIP_WSYNC, HSC_NO, 0, 22, 256, 220}, // title=Kung Fu Master {"431ca060201ee1f9eb49d44962874049", "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", CT_NORMAL, POKEY_NONE, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_NO, 0, 22, 256, 220}, // title=Mario Bros. - {"37b5692e33a98115e574185fa8398c22", "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", CT_SUPROM, POKEY_NONE, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_NO, 0, 22, 256, 220}, // title=Mat Mania Challenge - {"f2f5e5841e4dda89a2faf8933dc33ea6", "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", CT_SUPROM, POKEY_NONE, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_NO, 0, 22, 256, 220}, // title=Mean 18 Ultimate Golf - {"bedc30ec43587e0c98fc38c39c1ef9d0", "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", CT_SUPROM, POKEY_NONE, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_NO, 0, 22, 256, 220}, // title=Meltdown + {"37b5692e33a98115e574185fa8398c22", "Mat Mania Challenge", CT_SUPROM, POKEY_NONE, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_NO, 0, 22, 256, 220}, // title=Mat Mania Challenge + {"f2f5e5841e4dda89a2faf8933dc33ea6", "Mean 18 Ultimate Golf", CT_SUPROM, POKEY_NONE, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_NO, 0, 22, 256, 220}, // title=Mean 18 Ultimate Golf + {"bedc30ec43587e0c98fc38c39c1ef9d0", "Meltdown", CT_SUPROM, POKEY_NONE, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_NO, 0, 22, 256, 220}, // title=Meltdown {"c3f6201d6a9388e860328c963a3301cc", "Meteor Shower", CT_NORMAL, POKEY_NONE, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_YES, 0, 21, 256, 220}, // title=Meteor Shower {"bc1e905db1008493a9632aa83ab4682b", "Midnight Mutants", CT_SUPROM, POKEY_NONE, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_NO, 0, 21, 256, 226}, // title=Midnight Mutants - {"017066f522908081ec3ee624f5e4a8aa", "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", CT_SUPLRG, POKEY_NONE, JOY, JOY, DIFF_B, DIFF_B, NTSC, NO_STEALING, SKIP_WSYNC, HSC_NO, 0, 22, 256, 220}, // title=Missing in Action - {"181a9978d9da7a7e21f770808cc681f2", "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", CT_NORMAL, POKEY_NONE, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_YES, 0, 25, 320, 230}, // title=Merlain + {"017066f522908081ec3ee624f5e4a8aa", "Missing in Action", CT_SUPLRG, POKEY_NONE, JOY, JOY, DIFF_B, DIFF_B, NTSC, NO_STEALING, SKIP_WSYNC, HSC_NO, 0, 22, 256, 220}, // title=Missing in Action + {"181a9978d9da7a7e21f770808cc681f2", "Merlain", CT_NORMAL, POKEY_NONE, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_YES, 0, 25, 320, 230}, // title=Merlain {"9ff38ea62004201d870caa8bd9463525", "Moon Cresta (NTSC)", CT_NORMAL, POKEY_NONE, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_YES, 30, 13, 320, 210}, // title=Moon Cresta - {"3bc8f554cf86f8132a623cc2201a564b", "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", CT_SUPROM, POKEY_NONE, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_NO, 0, 22, 256, 220}, // title=Motor Psycho + {"3bc8f554cf86f8132a623cc2201a564b", "Motor Psycho", CT_SUPROM, POKEY_NONE, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_NO, 0, 22, 256, 220}, // title=Motor Psycho {"fc0ea52a9fac557251b65ee680d951e5", "Ms. Pac-Man", CT_NORMAL, POKEY_NONE, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_YES, 0, 22, 256, 220}, // title=Ms. Pac-Man {"220121f771fc4b98cef97dc040e8d378", "Ninja Golf", CT_SUPROM, POKEY_NONE, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_NO, 10, 22, 270, 220}, // title=Ninja Golf - {"74569571a208f8b0b1ccfb22d7c914e1", "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", CT_NORMAL, POKEY_NONE, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_NO, 0, 12, 256, 220}, // title=One On One + {"74569571a208f8b0b1ccfb22d7c914e1", "One On One", CT_NORMAL, POKEY_NONE, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_NO, 0, 12, 256, 220}, // title=One On One {"5013b69cb05b21a1194ce48517df7bfc", "Pac-Man Collection", CT_NORMAL, POKEY_AT_4000, JOY, JOY, DIFF_B, DIFF_B, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_YES, 0, 19, 256, 216}, // title=Pac-Man Collection (homebrew) - {"044657294450c869c45e7ef61f4870de", "Pac-Man Collection - 40th Anniv", CT_SUPCAR, POKEY_AT_450, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_YES, 0, 25, 256, 220}, // title=Pac-Man Collection 40th Anniversary Edition (homebrew) - Pokey Version - {"e66f3812d74724cdb3ae489e5c7d1c0e", "Pac-Man XM", CT_SUPCAR, POKEY_NONE, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_YES, 0, 25, 256, 220}, // title=Pac-Man Collection 40th Anniversary Edition (homebrew) - Forced TIA - {"1330d23ebad9b5ded92ebeacdf305abd", "Pac-Man XM", CT_SUPCAR, POKEY_AT_450, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_YES, 0, 25, 256, 220}, // title=Pac-Man Collection 40th Anniversary Edition (homebrew) - XM (fixed) - {"1a5207870dec6fae9111cb747e20d8e3", "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", CT_NORMAL, POKEY_NONE, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_NO, 0, 22, 256, 220}, // title=Pete Rose Baseball - {"ec206c8db4316eb1ebce9fc960da7d8f", "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", CT_SUPROM, POKEY_NONE, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_NO, 0, 22, 256, 220}, // title=Pit Fighter + {"a59d362e3a391ff1482131aa0818ad3e", "Pac-Man XM", CT_SUPCAR, POKEY_NONE, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_YES, 9, 25, 278, 220}, // title=Pac-Man Collection 40th Anniversary Edition (homebrew) + {"1a5207870dec6fae9111cb747e20d8e3", "Pete Rose Baseball", CT_NORMAL, POKEY_NONE, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_NO, 0, 22, 256, 220}, // title=Pete Rose Baseball + {"ec206c8db4316eb1ebce9fc960da7d8f", "Pit Fighter", CT_SUPROM, POKEY_NONE, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_NO, 0, 22, 256, 220}, // title=Pit Fighter {"33aea1e2b6634a1dec8c7006d9afda22", "Planet Smashers", CT_SUPROM, POKEY_NONE, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_NO, 0, 18, 256, 226}, // title=Planet Smashers + {"74f0283c566bdee8543e4fdc5cb8b201", "Plutos XM", CT_SUPRAM, POKEY_AT_450, JOY, JOY, DIFF_B, DIFF_B, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_NO, 0, 22, 256, 220}, // title=Plutos XM {"86546808dc60961cdb1b20e761c50ab1", "Plutos", CT_SUPRAM, POKEY_NONE, JOY, JOY, DIFF_B, DIFF_B, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_NO, 0, 22, 256, 220}, // title=Plutos (non-XM) - {"74f0283c566bdee8543e4fdc5cb8b201", "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", CT_SUPRAM, POKEY_AT_450, JOY, JOY, DIFF_B, DIFF_B, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_NO, 0, 22, 256, 220}, // title=Plutos XM {"584582bb09ee8122e7fc09dc7d1ed813", "Pole Position II", CT_NORMAL, POKEY_NONE, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_NO, 35, 22, 320, 230}, // title=Pole Position II - {"1745feadabb24e7cefc375904c73fa4c", "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", CT_SUPRAM, POKEY_NONE, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_NO, 0, 22, 256, 220}, // title=Possible Mission + {"1745feadabb24e7cefc375904c73fa4c", "Possible Mission", CT_SUPRAM, POKEY_NONE, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_NO, 0, 22, 256, 220}, // title=Possible Mission {"0710aa2620435230da6a7cf3f620210d", "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", CT_SUPLRG, POKEY_AT_450, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_YES, 0, 18, 256, 210}, // title=Popeye Demo 2.7f (homebrew) {"81187dbc08934214bd55187d4b8149dd", "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", CT_SUPLRG, POKEY_AT_450, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_YES, 0, 18, 256, 210}, // title=Popeye Demo 2.8 (homebrew) {"640c7827fe63082efbaffc13f7983744", "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", CT_SUPLRG, POKEY_AT_450, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_YES, 0, 18, 256, 210}, // title=Popeye Demo 2.9 (homebrew) {"631262731c193928d01365d2bc31b64f", "Popeye", CT_SUPLRG, POKEY_AT_450, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_YES, 0, 18, 256, 210}, // title=Popeye Demo 1.0RC - {"ac03806cef2558fc795a7d5d8dba7bc0", "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", CT_ACTVIS, POKEY_NONE, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_NO, 0, 22, 256, 220}, // title=Rampage - {"bfad016d6e77eaccec74c0340aded8b9", "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", CT_SUPCAR, POKEY_NONE, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_NO, 0, 22, 256, 220}, // title=Realsports Baseball - {"8f7eb10ad0bd75474abf0c6c36c08486", "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", CT_NORMAL, POKEY_NONE, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_NO, 0, 22, 256, 220}, // title=Rescue On Fractalus + {"ac03806cef2558fc795a7d5d8dba7bc0", "Rampage", CT_ACTVIS, POKEY_NONE, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_NO, 0, 22, 256, 220}, // title=Rampage + {"bfad016d6e77eaccec74c0340aded8b9", "Realsports Baseball", CT_SUPCAR, POKEY_NONE, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_NO, 0, 22, 256, 220}, // title=Realsports Baseball + {"8f7eb10ad0bd75474abf0c6c36c08486", "Rescue On Fractalus", CT_NORMAL, POKEY_NONE, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_NO, 0, 22, 256, 220}, // title=Rescue On Fractalus {"66ecaafe1b82ae68ffc96267aaf7a4d7", "Robotron", CT_NORMAL, POKEY_NONE, TWIN,TWIN, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_YES, 5, 22, 270, 234}, // title=Robotron {"b6561537290e6e25e1249394366c3c63", "Robbo", CT_NORMAL, POKEY_NONE, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_NO, 0, 22, 256, 220}, // title=Robbo {"a3a85e507d6f718972b1464ce1aaf8a4", "Scramble", CT_NORMAL, POKEY_NONE, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_YES, 30, 13, 320, 205}, // title=Scramble (homebrew) - {"980c35ae9625773a450aa7ef51751c04", "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", CT_SUPROM, POKEY_NONE, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_NO, 0, 22, 256, 220}, // title=Scrapyard Dog - {"b697d9c2d1b9f6cb21041286d1bbfa7f", "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", CT_SUPROM, POKEY_AT_4000, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_NO, 0, 22, 256, 220}, // title=Sentinel + {"980c35ae9625773a450aa7ef51751c04", "Scrapyard Dog", CT_SUPROM, POKEY_NONE, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_NO, 0, 22, 256, 220}, // title=Scrapyard Dog + {"b697d9c2d1b9f6cb21041286d1bbfa7f", "Sentinel", CT_SUPROM, POKEY_AT_4000, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_NO, 0, 22, 256, 220}, // title=Sentinel {"9bd70c06d3386f76f8162881699a777a", "Serpentine", CT_SUPRAM, POKEY_AT_450, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_YES, 0, 22, 256, 220}, // title=Serpentine (homebrew) - {"771cb4609347657f63e6f0eb26036e35", "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", CT_NORMAL, POKEY_NONE, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_YES, 0, 22, 256, 220}, // title=Space Duel (homebrew) - {"6adf79558a3d7f5beca1bb8d34337417", "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", CT_NORMAL, POKEY_NONE, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_YES, 30, 16, 320, 205}, // title=Space Invaders (Homebrew) + {"771cb4609347657f63e6f0eb26036e35", "Space Duel", CT_NORMAL, POKEY_NONE, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_YES, 0, 22, 256, 220}, // title=Space Duel (homebrew) + {"6adf79558a3d7f5beca1bb8d34337417", "Space Invaders", CT_NORMAL, POKEY_NONE, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_YES, 30, 16, 320, 205}, // title=Space Invaders (Homebrew) {"19844117863cd38d4e1e4cbc867ae599", "Spire of the Ancients", CT_SUPLRG, POKEY_NONE, SOTA,SOTA, DIFF_A, DIFF_A, NTSC, NO_STEALING, USES_WSYNC, HSC_YES, 31, 25, 320, 230}, // title=Spire of the Ancients {"19844117863cd38d4e1e4cbc867ae599", "SotA", CT_SUPLRG, POKEY_NONE, SOTA,SOTA, DIFF_A, DIFF_A, NTSC, NO_STEALING, USES_WSYNC, HSC_YES, 31, 25, 320, 230}, // title=Spire of the Ancients - {"cbb0746192540a13b4c7775c7ce2021f", "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", CT_SUPRAM, POKEY_NONE, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_NO, 0, 22, 256, 220}, // title=Summer Games + {"cbb0746192540a13b4c7775c7ce2021f", "Summer Games", CT_SUPRAM, POKEY_NONE, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_NO, 0, 22, 256, 220}, // title=Summer Games {"81cee326b99d6831de10a566e338bd25", "Super Circus AA-NTSC-joy-4000", CT_NORMAL, POKEY_AT_4000, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_YES, 0, 21, 256, 220}, // title=Super Circus Atariage (Pokey 4000) - {"cc18e3b37a507c4217eb6cb1de8c8538", "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", CT_NORMAL, POKEY_NONE, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_NO, 0, 22, 256, 220}, // title=Super Huey UH-IX - {"59b5793bece1c80f77b55d60fb39cb94", "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", CT_NORMAL, POKEY_NONE, JOY, JOY, DIFF_B, DIFF_B, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_NO, 0, 22, 256, 220}, // title=Super Skatebordin' - {"44f862bca77d68b56b32534eda5c198d", "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", CT_SUPCAR, POKEY_NONE, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_NO, 0, 22, 256, 220}, // title=Tank Command - {"1af475ff6429a160752b592f0f92b287", "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", CT_NORMAL, POKEY_NONE, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_NO, 0, 22, 256, 220}, // title=Title Match Pro Wrestling - {"a60e4b608505d1fb201703b266f754a7", "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", CT_NORMAL, POKEY_NONE, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_NO, 0, 24, 256, 230}, // title=Time Salvo - {"c3903ab01a51222a52197dbfe6538ecf", "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", CT_NORMAL, POKEY_NONE, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_NO, 0, 22, 256, 220}, // title=Tomcat F-14 Simulator - {"208ef955fa90a29815eb097bce89bace", "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", CT_SUPROM, POKEY_NONE, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_NO, 0, 22, 256, 220}, // title=Touchdown Football - {"8d64763db3100aadc552db5e6868506a", "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", CT_SUPRAM, POKEY_NONE, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_NO, 0, 16, 256, 230}, // title=Tower Toppler - {"zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz", "UniWarS", CT_NORMAL, POKEY_NONE, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_YES, 0, 13, 256, 200}, // title=UniWarS - {"acf63758ecf3f3dd03e9d654ae6b69b7", "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", CT_SUPCAR, POKEY_NONE, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_NO, 0, 22, 256, 220}, // title=Water Ski - {"3799d72f78dda2ee87b0ef8bf7b91186", "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", CT_SUPRAM, POKEY_NONE, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_NO, 0, 22, 256, 220}, // title=Winter Games + {"cc18e3b37a507c4217eb6cb1de8c8538", "Super Huey UH-IX", CT_NORMAL, POKEY_NONE, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_NO, 0, 22, 256, 220}, // title=Super Huey UH-IX + {"59b5793bece1c80f77b55d60fb39cb94", "Super Skatebordin'", CT_NORMAL, POKEY_NONE, JOY, JOY, DIFF_B, DIFF_B, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_NO, 0, 22, 256, 220}, // title=Super Skatebordin' + {"44f862bca77d68b56b32534eda5c198d", "Tank Command", CT_SUPCAR, POKEY_NONE, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_NO, 0, 22, 256, 220}, // title=Tank Command + {"1af475ff6429a160752b592f0f92b287", "Title Match Pro Wrestling", CT_NORMAL, POKEY_NONE, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_NO, 0, 22, 256, 220}, // title=Title Match Pro Wrestling + {"a60e4b608505d1fb201703b266f754a7", "Time Salvo", CT_NORMAL, POKEY_NONE, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_NO, 0, 24, 256, 230}, // title=Time Salvo + {"c3903ab01a51222a52197dbfe6538ecf", "Tomcat F-14 Simulator", CT_NORMAL, POKEY_NONE, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_NO, 0, 22, 256, 220}, // title=Tomcat F-14 Simulator + {"208ef955fa90a29815eb097bce89bace", "Touchdown Football", CT_SUPROM, POKEY_NONE, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_NO, 0, 22, 256, 220}, // title=Touchdown Football + {"8d64763db3100aadc552db5e6868506a", "Tower Toppler", CT_SUPRAM, POKEY_NONE, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_NO, 0, 16, 256, 230}, // title=Tower Toppler + {"79df20ee86a989e669158bcb9d113e8a", "UniWarS", CT_NORMAL, POKEY_NONE, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_YES, 0, 13, 256, 200}, // title=UniWarS + {"acf63758ecf3f3dd03e9d654ae6b69b7", "Water Ski", CT_SUPCAR, POKEY_NONE, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_NO, 0, 22, 256, 220}, // title=Water Ski + {"3799d72f78dda2ee87b0ef8bf7b91186", "Winter Games", CT_SUPRAM, POKEY_NONE, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_NO, 0, 22, 256, 220}, // title=Winter Games {"05fb699db9eef564e2fe45c568746dbc", "Xenophobe", CT_SUPROM, POKEY_NONE, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_NO, 15, 22, 280, 234}, // title=Xenophobe {"d7dc17379aa25e5ae3c14b9e780c6f6d", "Xevious", CT_NORMAL, POKEY_NONE, JOY, JOY, DIFF_A, DIFF_A, NTSC, STEAL_CYCLE, USES_WSYNC, HSC_YES, 0, 22, 256, 220}, // title=Xevious {"","",CT_NORMAL,0,0,0,0,0,0,0,0,0,0}, diff --git a/arm9/source/emu/HighScore.c b/arm9/source/emu/HighScore.c index 5ddc725..d4bcbc0 100644 --- a/arm9/source/emu/HighScore.c +++ b/arm9/source/emu/HighScore.c @@ -147,6 +147,10 @@ bool cartridge_LoadHighScoreCart(void) FILE* file = fopen("highscore.rom", "rb" ); + // If we don't find it in the current directory, always try /roms/bios and /data/bios + if (file == NULL) file = fopen("/roms/bios/highscore.rom", "rb" ); + if (file == NULL) file = fopen("/data/bios/highscore.rom", "rb" ); + if( file != NULL ) { fread(high_score_buffer, 1, HSC_CART_ROM_SIZE, file ); diff --git a/arm9/source/emu/Memory.c b/arm9/source/emu/Memory.c index d9140ab..016aa37 100644 --- a/arm9/source/emu/Memory.c +++ b/arm9/source/emu/Memory.c @@ -27,7 +27,7 @@ #include "Maria.h" byte memory_ram[MEMORY_SIZE] = {0}; -byte memory_rom[MEMORY_SIZE] = {0}; +u16 *memory_rom = (u16*) 0x0688C000; // ---------------------------------------------------------------------------- // Reset @@ -44,10 +44,10 @@ void memory_Reset( ) } } +extern u8 isDS_LITE; // ---------------------------------------------------------------------------- // Read // ---------------------------------------------------------------------------- -#ifndef DS_LITE ITCM_CODE byte memory_Read(word address) { if (cartridge_pokey) @@ -79,14 +79,12 @@ ITCM_CODE byte memory_Read(word address) } return memory_ram[address]; } -#endif // ---------------------------------------------------------------------------- // Write // ---------------------------------------------------------------------------- ITCM_CODE void memory_Write(word address, byte data) { -#ifndef DS_LITE if (cartridge_pokey) { if (cartridge_pokey == POKEY_AT_4000) @@ -108,7 +106,6 @@ ITCM_CODE void memory_Write(word address, byte data) } } } -#endif if(!memory_rom[address]) { @@ -241,12 +238,13 @@ ITCM_CODE void memory_WriteROM(word address, word size, const byte* data) // ---------------------------------------------------------------------------- // WriteROMFast (assumes memory_rom[] already set properly) +// size is already in multiples of u32 dwords // ---------------------------------------------------------------------------- ITCM_CODE void memory_WriteROMFast(word address, word size, const byte* data) { u32* ramPtr = (u32*)&memory_ram[address]; u32* dataPtr = (u32*)data; - for (word i=0; i<(size>>2); i++) + for (word i=0; i> 2); - } - if(memory_ram[WSYNC]) // Will only write true here if cartridge_uses_wsync is true in Memory.c + + if (!isDS_LITE) { - prosystem_cycles = 456; - memory_ram[WSYNC] = false; - break; + if(riot_timing) + { + riot_UpdateTimer(sally_cyclesX4 >> 2); + } + if(memory_ram[WSYNC]) // Will only write true here if cartridge_uses_wsync is true in Memory.c + { + prosystem_cycles = 456; + memory_ram[WSYNC] = false; + break; + } } -#endif } } diff --git a/arm9/source/emu/Sound.c b/arm9/source/emu/Sound.c index c2b6deb..a3dcd18 100644 --- a/arm9/source/emu/Sound.c +++ b/arm9/source/emu/Sound.c @@ -20,7 +20,7 @@ unsigned char sound_buffer[SNDLENGTH]; // Sound buffer -unsigned int targetIndex = 0; +u8 is_mute __attribute__((section(".dtcm"))) = false; void processSound(register unsigned char *buffer) { diff --git a/arm9/source/emu/Sound.h b/arm9/source/emu/Sound.h index b7eaf8d..149a0b5 100644 --- a/arm9/source/emu/Sound.h +++ b/arm9/source/emu/Sound.h @@ -27,10 +27,10 @@ #include "shared.h" -#define SNDLENGTH (4096) +#define SNDLENGTH (8192) extern unsigned char sound_buffer[SNDLENGTH]; // Sound buffer - +extern u8 is_mute; extern bool sound_Store(); extern void processSound(register unsigned char *buffer); diff --git a/arm9/source/emu/Tia.itcm.c b/arm9/source/emu/Tia.itcm.c index 271357c..5609e04 100644 --- a/arm9/source/emu/Tia.itcm.c +++ b/arm9/source/emu/Tia.itcm.c @@ -50,21 +50,21 @@ #define TIA_POLY9_SIZE 511 byte tia_buffer[SNDLENGTH] = {0}; -int tiaBufIdx = 0; +u16 tiaBufIdx __attribute__((section(".dtcm"))) = 0; static const byte TIA_POLY4[ ] = {1,1,0,1,1,1,0,0,0,0,1,0,1,0,0}; static const byte TIA_POLY5[ ] = {0,0,1,0,1,1,0,0,1,1,1,1,1,0,0,0,1,1,0,1,1,1,0,1,0,1,0,0,0,0,1}; static const byte TIA_POLY9[ ] = {0,0,1,0,1,0,0,0,1,0,0,0,0,0,0,0,1,0,1,1,1,0,0,1,0,1,0,0,1,1,1,1,1,0,0,1,1,0,1,1,0,1,0,1,1,1,0,1,1,0,0,1,0,0,1,1,1,1,0,1,0,0,0,0,1,1,0,1,1,0,0,0,1,0,0,0,1,1,1,1,0,1,0,1,1,0,1,0,1,0,0,0,0,1,1,0,1,0,1,0,0,0,1,0,1,0,0,0,1,1,1,0,0,1,1,0,1,1,0,0,1,1,1,1,1,0,0,1,1,0,0,0,1,1,0,1,0,0,0,1,1,0,0,1,1,1,1,0,0,1,0,0,0,1,1,1,0,0,1,1,0,1,0,1,1,0,1,1,0,1,0,0,1,0,0,1,1,1,1,1,1,0,1,1,1,1,0,1,1,0,0,0,0,1,1,1,1,1,0,0,0,1,0,0,0,0,1,0,0,0,1,0,1,0,1,1,0,0,0,0,1,0,1,1,1,1,0,1,0,0,0,1,1,0,0,0,1,1,1,0,1,1,1,0,1,0,0,0,0,0,0,0,0,1,0,1,0,0,1,0,0,0,0,1,1,1,0,0,0,1,1,1,0,0,1,1,0,0,1,0,0,1,0,1,1,0,0,0,0,1,0,0,0,1,0,0,0,1,0,1,1,1,1,0,0,0,1,1,1,0,0,0,1,0,0,1,1,1,1,0,1,1,1,1,1,1,1,0,1,1,1,1,1,1,0,1,1,0,1,0,1,1,1,1,0,0,1,0,1,0,1,1,1,0,0,0,0,0,1,1,0,1,1,0,0,0,1,0,1,0,1,0,0,0,0,1,0,1,1,1,0,0,0,0,1,0,0,1,0,1,0,0,0,1,0,1,1,1,0,0,1,1,1,1,1,1,1,0,0,0,0,0,1,0,0,1,1,0,1,0,0,1,0,0,0,1,0,0,1,0,1,0,0,0,1,1,0,1,0,0,0,0,0,1,1,1,1,0,0,1,0,0,1,0,1,1,1,1,1,1,1,0,1,0,0,1,0,0,0,1,1,0,1,1,1,0,0,0,1,0,1,0,0,1,0,1,0,1,0,1,1,1,0,0,1,0,1,1,0,0,1,1,1,1,1,0,0,0,1,1,0}; static const byte TIA_DIV31[ ] = {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0}; -static byte tia_volume[2] = {0}; -static byte tia_counterMax[2] = {0}; -static byte tia_counter[2] = {0}; -byte tia_audc[2] = {0}; -byte tia_audf[2] = {0}; -byte tia_audv[2] = {0}; -static byte tia_poly4Cntr[2] = {0}; -static byte tia_poly5Cntr[2] = {0}; -static uint tia_poly9Cntr[2] = {0}; +static byte tia_volume[2] __attribute__((section(".dtcm"))) = {0}; +static byte tia_counterMax[2] __attribute__((section(".dtcm"))) = {0}; +static byte tia_counter[2] __attribute__((section(".dtcm"))) = {0}; +byte tia_audc[2] __attribute__((section(".dtcm"))) = {0}; +byte tia_audf[2] __attribute__((section(".dtcm"))) = {0}; +byte tia_audv[2] __attribute__((section(".dtcm"))) = {0}; +static byte tia_poly4Cntr[2] __attribute__((section(".dtcm"))) = {0}; +static byte tia_poly5Cntr[2] __attribute__((section(".dtcm"))) = {0}; +static u16 tia_poly9Cntr[2] __attribute__((section(".dtcm"))) = {0}; // ---------------------------------------------------------------------------- // ProcessChannel @@ -271,8 +271,9 @@ int TIA_Sample(void) // -------------------------------------------------------------------------------------- void tia_Process(uint length) { - uint index; - for(index = 0; index < length; index++) + if (is_mute) return; + + for(u16 index = 0; index < length; index++) { if(tia_counter[0] > 1) { diff --git a/readme.txt b/readme.txt index c3bb906..447398c 100644 --- a/readme.txt +++ b/readme.txt @@ -12,27 +12,37 @@ Features : ---------- Most things you should expect from an emulator. Speed is good. Sound is good except for the few games that run below 60FPS. + + Add highscore.rom for 7800 High Score saving. Philosophy : ---------- - I'm not striving for emulation accuracy - the goal is to get as many games as close - to perfectly playable as possible. Nothing else matters if the game won't run at - near full speed with all the gameplay in-tact. Minor screen glitches or minor sound - issues are secondary to making sure the game will actually run. If you're looking - for a highly accurate emulator for the 7800 ProSystem, this isn't it - try MAME/MESS. - But if you're looking to enjoy some classic console goodness on your DS/DSi then - you've come to the right place! + For this particular emulator, I'm not striving for emulation accuracy - the goal is to + get as many games as close to perfectly playable as possible. Nothing else matters if + the game won't run at near full speed with all the gameplay in-tact. Minor screen + glitches or minor sound issues are secondary to making sure the game will actually run. + If you're looking for a highly accurate emulator for the 7800 ProSystem, this isn't + it - try MAME/MESS. But if you're looking to enjoy some classic 7800 console goodness + on your DS/DSi then you've come to the right place! Be warned, the emulation of the ProSystem is tricky as there are several CPU-like - elments that need to be emulated (6502, TIA, RIOT, Pokey Chip) and the DS-LITE + elements that need to be emulated (6502, TIA, RIOT, Pokey Chip) and the DS-LITE just doesn't have the horsepower to do it properly so only the smallest non-Pokey games will run (Asteroids, Centipede, Joust, Meteor Shower, Moon Cresta, Ms Pac Man). The DSi will run most games at near full speed or beyond - with much higher emulation compatibility. + -------------------------------------------------------------------------------- History : -------------------------------------------------------------------------------- +V2.8 : 02-Nov-2021 by wavemotion-dave + * A bit of speed - enough to eliminate the old DS-LITE version. + * A few new homebrews added to the internal database. + * Optmized sound buffers for (very) slightly better performance. + * highscore.rom can now bin in /roms/bios or /data/bios + * Cleanup code as time permitted. + V2.7 : 02-Apr-2021 by wavemotion-dave * New support for the latest homebrews: Galaxian final * Added ability to swap screens using L+R+A