From bc1b557f4781b3f924123b163f29e7cd201291db Mon Sep 17 00:00:00 2001 From: wavemotion-dave <75039837+wavemotion-dave@users.noreply.github.com> Date: Tue, 2 Nov 2021 21:50:41 -0400 Subject: [PATCH] Version 2.8 - slight sound optmization, slight speed optmization, elimination of the need for DS-LITE version... other cleanups as time permitted. --- A7800DS.nds | Bin 388096 -> 388608 bytes Makefile | 2 +- arm9/gfx/pdev_bg0.png | Bin 3076 -> 3100 bytes arm9/source/a7800utils.c | 119 +++++++++++++++++++++++---------- arm9/source/emu/Cartridge.c | 30 ++++----- arm9/source/emu/Cartridge.h | 8 +-- arm9/source/emu/Database.c | 126 +++++++++++++++++------------------ arm9/source/emu/HighScore.c | 4 ++ arm9/source/emu/Memory.c | 10 ++- arm9/source/emu/Memory.h | 6 +- arm9/source/emu/Pokey.c | 2 +- arm9/source/emu/ProSystem.c | 5 +- arm9/source/emu/ProSystem.h | 1 - arm9/source/emu/Sally.itcm.c | 30 ++++----- arm9/source/emu/Sound.c | 2 +- arm9/source/emu/Sound.h | 4 +- arm9/source/emu/Tia.itcm.c | 25 +++---- readme.txt | 26 +++++--- 18 files changed, 224 insertions(+), 176 deletions(-) diff --git a/A7800DS.nds b/A7800DS.nds index 7994e05fe209c59e64df746fcb65f4b184edee5d..ad0dfa3a7b0325786f647450b6497773e88cedc2 100644 GIT binary patch delta 31401 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 delta 29772 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 E0FU7fU;qFB 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 b70f46bf6123785d4f596b18d5b7d6d3cd479d27..c797717421125b873d7c00f42e3e7aeb0b68ecd9 100644 GIT binary patch delta 2268 zcmb7^c{J3G9>#yOU~C!JzGTV1gi2+Zu9<96Q}S9uG@6tsjZBOg{ATRRGL}l&DL2WG zJxz>8A(d=p&3G}E$OuCcZ~gWDckg?@|2^kC=RD^*=ktAH<#Xk$JYb+GR8~f3jP6hmsE zUWWl+ei~uSYNpt*Y>Xs(*J6wsFe{3HWv}HE@w|G)(IHtTGUId*;B;`#??XZL0a?BZH_x=5Pj|T?zR?F>Y2XP@DgAl)pYTOj- z{mIq!>Y<#0fHmBkBe$RF^*x=k(huueBZsg11>SF-TiK}HZIOOHB#lC`VlIm;wUj;L zO!jZMyi+;;=|-;j{@(;Jq|kF_M1nS+9k{48o$xYE7!5JpY!NGHF)&m+^Z? zzgq&cXIHGN?io0mCP&FC_8F@UoTsC?y>2EcAF&CM`dX!tdVc1hk8lV@y7RM4+!z+2 zoKWknt7y6!X*19)ede499q8dHLv)4OwvGUao&7=;_JCfZ?iz;Su)mH zV?&s6>@|ZF+4aH06dk}z@8E{-EUhJroaQFOK|SZ#pYCnkgM5D-PIxTcF~C7-?z{+@ z<`R#J_A3EjL~Tpr^L?VIG2>4uQeSh^Z3;x4kjztJAP*+M_^D;M5%)nT;;a2c|Lcb3 z`($ssxf_@N8*tpm`({FCzX<4x$uBL99|iT8u)P}0sE zxFN5#>!wvk3sY!vhYOwSYeiKjK`JDoR>I5FueQspeVQ$Y0pHf@0{QXe6i79>>?|+$ zFtGWnk6_aTbS55$*y8^@yv!`XpAEm4roMcsow`E1NUNxC{xC5}cPwMIwzto9L0R(V zY$rzk+d=hkB1=PYI_s+!Aa~PF9K86l-MsY*BfizfGSzEM*qv8w>V^TI zJV9dx= z?b5EG`wQ_)MqG!n%Dz(Lj3Lv!Ixe%jFLHcz`b;_3!^djIW$aYVUI;zdnS0stkjskc zNb-ESVaTiMsFF_oCKW(B8aAv-(euZuOg0(DKL0G0rE4yp=l*8MSkvfSDdhUXqw zqgl`+t)d(Bt0psSFyL;+5$0or(Lq1E9vKKS^F$INr65~Nk2{|NJ6%CMlxJxYiFVkf z&V7+-GpkckjU>ua|6`k_dzzz2;QyKm$_O2wmQ)oLC->@^Y}cze?Q#9#bLpZBKH5l& z>vKK5wa@9KPL9yZ3)QOyd8s5{Ci{+5K-t}Tb=Jzq z^c<8J8=kXG!&E*0AnjrM#Xuz5@`O)`FzJo9AB`8A#mE-Jo5!Q)B7Fs$8`;@OF_TUr z0^2%F6BJDMiZ!lR$Rj?>1SbXU$P>lhb6q82Ygnx@OgG?=-aTKDg7dOUG44G+-yUkZ zgBeZ!^B^`vu<#+nLe<$ZX1fsd8bNviU&zlQBIp4topP-YOY2;TSd5c!vQvSE)0#bTpH{(lmJ6&53OT55~FecijE7uQW!%su?NUyC9GS|+7r0O z-V3~~?^>4NVWp%W|8AQ)GN6`gelnRG{QQilOCG0O1t7h%>7;7gNxZlZtd`QE-zcCH zJ~N`{Q?$!xhpSuBwBhZSbA%buu+DLzzxPs%Gnoa#wiWLr!0-9MfM4fed(wt+6c_y$ DT3hzU delta 2244 zcmb`Edpy&NAI87iTvjfd>r^gNxgWQ~k4{*&47ucrCg577~4oDaw$?QmsBX3 zM3LDHg+olnap|}p_uLvH;?y6%zklbC-}8F^`Mh4w^LaiGGFQDxXc!>5TkPXxfsV@qY$?w;F?5BK-AHswtoh5HP9 zkBm6aoaZ%FwVc`YGtrmaZrPoghY8_D8gsj@Q=9Y+$;g0!--Ai9Q_ALEuHam~w#O=~n*8q+$SE zc2orJ?mWfe8X0t0`m^W|y;OVdao3+o>>ax<6reDqoVfsioO_N`_gmjsS~vD*jhOVB ze-+2|7?aetMiiPddS!dZ4kIc3;oA*PRLZPSK+gA-Py0$Bd2y!qK*Y6AM)v&m^%~C# z#i069!`jOyOTM_zUw`YPyTaD);z#Y6qJoq1)nA&mvP={ei8tFQSJWrwYl!DY#Ca1T zvgHCF2bAj!}6rrvb@-7z$KaQROY}(vSnL28CQ>RPwIqswdS)Snts2t&RLN zxQMk`mDlLB^Q9;Qa2?dplCx)NZ!FcBX*}bzHCu|UYt8`59B?XD)C$?C%2HkZcP7t& z%b$bfbV`hezf+B;jAg9Um?Uq^zm^v@sqn zh{k^sL*>ouvSVl!&pD(uWxKmC_}JqO)6kGB((V0v#In6$VP91K*?idr1&H1o5X;QKfpfdNe17yVSUd`9{x_FI>WCDd zI}N2UD{aN1Pj!RB()=TUqAK?0wct29%jY#d%y!7r{+#BWnjApEb1QLmc7a0>YN;Cqghi|tM^vLI6smT z%m|=()_Q;Q=&8OLCpBV3W>*`qTCo}|3Jm1d3CBuv3`f2TI^~@5?Qy;Qdl#@1nzL8w za&vLy+^r4n!s#_445HI=?8~xzYrwL|i^q+YVqq&-Ndp^Y@xYj;* z#V*R7z{o{h+;Mh}G}bl}K=NMb@X5af&P1;nCIzQ7BRV&|k0a({fWU+4bK8Tk3NexZf^9(E3j~Aab3)LS5 z^fj`rU#>|pJzHMK%%XcWy(xCHigrpbOA_S|G6~3A6Ffp*H{% zcgIOZsfkt@wubiW^Ex_5Z|d|crzCMUBfwQ^_dz4|y$=eenu9eb07PgsVZu>dv(0giJyqH9oN>-hkhT&LM2VTEGRZ!MH@2q2{^9? zRVirpPJyOmd}c2q>yd6LT!U2})P{&U5kQz79KfKr1jpnGL7MLHq3Ihh{5|#X65#An z?2~4}n1+&a4vPB94Y;0*YEg+zFCUanNGeeAwLQGRb$0jO>B|Sz^mQpGKFmSy7wsD{ zkP*OQ0 ? "<" : " ")); 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