From 0389b346f320c8e39d0af10c24a0177298c96526 Mon Sep 17 00:00:00 2001 From: nattthebear Date: Sun, 16 Jul 2017 10:01:17 -0400 Subject: [PATCH 01/93] pcfx: fuck you mode --- .../Consoles/NEC/PCFX/LibTst.cs | 1 + .../Consoles/NEC/PCFX/Tst.cs | 7 +- output/dll/pcfx.wbx.gz | Bin 116793 -> 117021 bytes waterbox/pcfx/.vscode/settings.json | 3 +- waterbox/pcfx/defs.h | 4 +- waterbox/pcfx/king.cpp | 2 - waterbox/pcfx/pcfx.cpp | 102 +++++++++++++++--- 7 files changed, 102 insertions(+), 17 deletions(-) diff --git a/BizHawk.Emulation.Cores/Consoles/NEC/PCFX/LibTst.cs b/BizHawk.Emulation.Cores/Consoles/NEC/PCFX/LibTst.cs index c6fdf48c55..a108e501d7 100644 --- a/BizHawk.Emulation.Cores/Consoles/NEC/PCFX/LibTst.cs +++ b/BizHawk.Emulation.Cores/Consoles/NEC/PCFX/LibTst.cs @@ -49,6 +49,7 @@ namespace BizHawk.Emulation.Cores.Consoles.NEC.PCFX public int CpuEmulation; public int Port1; public int Port2; + public int PixelPro; } [BizImport(CC)] diff --git a/BizHawk.Emulation.Cores/Consoles/NEC/PCFX/Tst.cs b/BizHawk.Emulation.Cores/Consoles/NEC/PCFX/Tst.cs index b89760ba34..e0ee26e575 100644 --- a/BizHawk.Emulation.Cores/Consoles/NEC/PCFX/Tst.cs +++ b/BizHawk.Emulation.Cores/Consoles/NEC/PCFX/Tst.cs @@ -222,6 +222,10 @@ namespace BizHawk.Emulation.Cores.Consoles.NEC.PCFX [DeepEqualsIgnore] private bool _showLayerRAINBOW; + [Description("Pixel Pro. Overrides HiResEmulation if set")] + [DefaultValue(false)] + public bool PixelPro { get; set; } + public Settings Clone() { return (Settings)MemberwiseClone(); @@ -321,7 +325,8 @@ namespace BizHawk.Emulation.Cores.Consoles.NEC.PCFX CdSpeed = _syncSettings.CdSpeed, CpuEmulation = (int)_syncSettings.CpuEmulation, Port1 = (int)_syncSettings.Port1, - Port2 = (int)_syncSettings.Port2 + Port2 = (int)_syncSettings.Port2, + PixelPro = _settings.PixelPro ? 1 : 0 }; _core.PutSettingsBeforeInit(s); } diff --git a/output/dll/pcfx.wbx.gz b/output/dll/pcfx.wbx.gz index a8d7576f4aa56972d8eb81d090f4cbf661f5c0c0..855f4fea149c4b0c5db42aca786df7e3bfdc65d7 100644 GIT binary patch literal 117021 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 onb}#;I?0;wG|+p!yGQUy|_qf0_8# zsP*bb!t#h8+pILD{n%#s6O*S$Po4Jcg^;aY%pI01q0uNW6a0`yLp( zvAJEJnLKgw)X6h*xo^NTGky)c?zvs3KQ`{^$0iEhx$iojxh7sxZr90Eo}WCOa;+eP zFzsy#tKIH2Vi0MY8F+03;U4Noo0@n@T_1logVIm1BE@L!4vMMCUsBg6CQqFB*c71y z^>;yx*59<+c-?wx>B9DSkRElwdt^<#q@=D>nLlkzi%?E(sN516lL zf!(pO!-fS57RV3E56C0r;UgY=;C|4WX?I6OKwPN&k5YP>+)aJMdINgx5JMM*LeFW? zxuMWQ8gynTv{-{a84BH?K}Ux|S7^{7q0mn?Xp#}?5i5Ij5~OVFPl=rbyCUArIN~DY z6l*JF0Bem`0gKCRz1k>DaEs^gED+s5!XHu!rC^xiiWKY1NIP;(nTZ`H0;q^Hkk9BU zWk=nDys5;LTOj5g)J7^_d^iy>#hOaZiG%T+7c~e^@cIJS@mR0-?F6g_F9FNl(hZnf zRH#I;P6LfJcdu8aUV>}0moC>N^%FsFIC{0Z*@F$z!mQ%1**b@vKG9m)BI8TqTSQl?z;UI>#Nhb`XI4IHOl zk-ep6yJuh@yZ5jq&2%`SvE-aXsEs`X0JlDX%8D&^tWxGJZI;>B3`)mMD86I^w7cDt z7CY8)^t#V_5KY?L0Hsf;NcAjQPZm;EY>O;*rAl^`nJ_xdUj*;oqn7juxo$8v$P?Ko z&6JmK3y(DA+Zsm-sU9a+Q!YA=nBB8n7VnX;9T%h=ALCeV~x z+rW0Oj=)hLMT3;bh;~^K)r$tUUZY+-pxaEOcCVv?t0ZHX4dXw9NAt-xZG<$>?GK|> z8}K|8NdhVE{WEARWkBgq%IU2OVDJpT0ERCX?55McqiB!&{{naUO=_lP7huWCo--dv zt({aKEkrH6y^SER?1~IV_H6Suctus=CHr={#a}WsMO%&zs0(lSe6n)Yu_27dS$3Sd zPIBY%wkcIU>q%fEA?57RbYP3wXD!Llb-;VLam1dQilANsO?S)1KvMRocOj!(;<`TT z+klZYl>#*itxw|q*p&*9Nb`utFyNYYR>+yNgh&i=F=}i2nVnHnKV3c0e=wdFP*8

Q`Hc@=l(G7sXuvre+o-{6=>z+SZY{F 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

&qEWg>X>&Hj;$SqM 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 D;BFq~ diff --git a/waterbox/pcfx/.vscode/settings.json b/waterbox/pcfx/.vscode/settings.json index ed2aea06d3..63ffa1793c 100644 --- a/waterbox/pcfx/.vscode/settings.json +++ b/waterbox/pcfx/.vscode/settings.json @@ -10,6 +10,7 @@ "xiosbase": "cpp", "iosfwd": "cpp", "xlocale": "cpp", - "xstring": "cpp" + "xstring": "cpp", + "queue": "cpp" } } \ No newline at end of file diff --git a/waterbox/pcfx/defs.h b/waterbox/pcfx/defs.h index d6ec6a9f47..1c1245fa95 100644 --- a/waterbox/pcfx/defs.h +++ b/waterbox/pcfx/defs.h @@ -80,7 +80,7 @@ typedef struct // Set by the system emulation code every frame, to denote the horizontal and vertical offsets of the image, and the size // of the image. If the emulated system sets the elements of LineWidths, then the width(w) of this structure // is ignored while drawing the image. - int32 x, y, w, h; + int32 y, w, h; // Set(optionally) by emulation code. If InterlaceOn is true, then assume field height is 1/2 DisplayRect.h, and // only every other line in surface (with the start line defined by InterlacedField) has valid data @@ -118,3 +118,5 @@ extern bool Setting_AdpcmNoClicks; extern bool Setting_ChromaInterpolate; extern int Setting_PortDevice[2]; + +extern bool Setting_PixelPro; diff --git a/waterbox/pcfx/king.cpp b/waterbox/pcfx/king.cpp index 6a691a83ff..c2b67e446e 100644 --- a/waterbox/pcfx/king.cpp +++ b/waterbox/pcfx/king.cpp @@ -2628,7 +2628,6 @@ void KING_StartFrame(VDC **arg_vdc_chips, EmulateSpecStruct *espec) LineWidths[0] = 0; // These 2 should be overwritten in the big loop below. - espec->x = 0; espec->w = 256; espec->y = Setting_SlStart; @@ -3104,7 +3103,6 @@ static void MixLayers(void) #undef YUV888_TO_xxx } Ess->w = fx_vce.dot_clock ? HighDotClockWidth : 256; - Ess->x = 0; // FIXME if (fx_vce.frame_interlaced) diff --git a/waterbox/pcfx/pcfx.cpp b/waterbox/pcfx/pcfx.cpp index 96623ed54f..f201921d48 100644 --- a/waterbox/pcfx/pcfx.cpp +++ b/waterbox/pcfx/pcfx.cpp @@ -706,6 +706,90 @@ EXPORT bool Init(int numDisks, const uint8_t *bios) static int ActiveDisk; static uint32_t PrevConsoleButtons; +static void Blit(MyFrameInfo &f) +{ + // two widths to deal with: 256 and "341" (which can be 256, 341, or 1024 wide depending on settings) + // two heights: 240 and 480, but watch out for scanlinestart / scanline end + + // in pixel pro mode, 341 width is forced to 1024. we upsize 256 to 1024 as well, and double 240 tall + + const uint32_t *src = FrameBuffer; + uint32_t *dst = f.VideoBuffer; + const int srcp = 1024; + src += Ess.y * srcp; + + if (Setting_PixelPro) + { + f.Width = 1024; + f.Height = Ess.h; + + const int dstp = 1024; + + if (Ess.h > 240) // interlace + { + if (Ess.w == 256) + { + for (int j = 0; j < Ess.h; j++, src += srcp, dst += dstp) + { + for (int i = 0; i < 256; i++) + { + auto c = src[i]; + dst[i * 4 + 0] = c; + dst[i * 4 + 1] = c; + dst[i * 4 + 2] = c; + dst[i * 4 + 3] = c; + } + } + } + else + { + for (int j = 0; j < Ess.h; j++, src += srcp, dst += dstp) + { + memcpy(dst, src, LineWidths[j + Ess.y] * sizeof(uint32_t)); + } + } + } + else // progressive: line double + { + f.Height *= 2; + if (Ess.w == 256) + { + for (int j = 0; j < Ess.h; j++, src += srcp, dst += dstp * 2) + { + for (int i = 0; i < 256; i++) + { + auto c = src[i]; + dst[i * 4 + 0] = c; + dst[i * 4 + 1] = c; + dst[i * 4 + 2] = c; + dst[i * 4 + 3] = c; + } + memcpy(dst + dstp, dst, 4096); + } + } + else + { + for (int j = 0; j < Ess.h; j++, src += srcp, dst += dstp * 2) + { + memcpy(dst, src, 4096); + memcpy(dst + dstp, src, 4096); + } + } + } + } + else + { + f.Width = Ess.w; + f.Height = Ess.h; + + const int dstp = Ess.w; + for (int j = 0; j < Ess.h; j++, src += srcp, dst += dstp) + { + memcpy(dst, src, LineWidths[j + Ess.y] * sizeof(uint32_t)); + } + } +} + EXPORT void FrameAdvance(MyFrameInfo &f) { for (int i = 0; i < 2; i++) @@ -733,20 +817,10 @@ EXPORT void FrameAdvance(MyFrameInfo &f) Ess.SoundBuf = f.SoundBuffer; Emulate(&Ess); f.Cycles = Ess.MasterCycles; - f.Width = Ess.w; - f.Height = Ess.h; f.Samples = Ess.SoundBufSize; f.Lagged = Lagged; - const uint32_t *src = FrameBuffer; - uint32_t *dst = f.VideoBuffer; - const int srcp = 1024; - const int dstp = Ess.w; - src += Ess.y * srcp + Ess.x; - for (int j = 0; j < Ess.h; j++, src += srcp, dst += dstp) - { - memcpy(dst, src, LineWidths[j + Ess.y] * sizeof(uint32_t)); - } + Blit(f); } EXPORT void GetMemoryAreas(MemoryArea *m) @@ -821,6 +895,8 @@ ECL_SEALED bool Setting_ChromaInterpolate = false; ECL_SEALED int Setting_PortDevice[2]; +ECL_SEALED bool Setting_PixelPro; + struct FrontendSettings { int32_t AdpcmEmulateBuggyCodec; @@ -834,13 +910,14 @@ struct FrontendSettings int32_t CpuEmulation; int32_t Port1; int32_t Port2; + int32_t PixelPro; }; EXPORT void PutSettingsBeforeInit(const FrontendSettings &s) { Setting_AdpcmBuggy = s.AdpcmEmulateBuggyCodec; Setting_AdpcmNoClicks = s.AdpcmSuppressChannelResetClicks; - Setting_HighDotclockWidth = s.HiResEmulation; + Setting_HighDotclockWidth = s.PixelPro ? 1024 : s.HiResEmulation; Setting_NoSpriteLimit = s.DisableSpriteLimit; Setting_ChromaInterpolate = s.ChromaInterpolation; Setting_SlStart = s.ScanlineStart; @@ -849,6 +926,7 @@ EXPORT void PutSettingsBeforeInit(const FrontendSettings &s) Setting_CpuEmulation = s.CpuEmulation; Setting_PortDevice[0] = s.Port1; Setting_PortDevice[1] = s.Port2; + Setting_PixelPro = s.PixelPro; } /*MDFNGI EmulatedPCFX = From 46ea0cfd32b6240dc4523e8821d800868d08e96d Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Sun, 16 Jul 2017 11:53:06 -0400 Subject: [PATCH 02/93] A7800: Update gameDB --- Assets/gamedb/gamedb_a7800.txt | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/Assets/gamedb/gamedb_a7800.txt b/Assets/gamedb/gamedb_a7800.txt index 5515b75bdc..45cd9dd51e 100644 --- a/Assets/gamedb/gamedb_a7800.txt +++ b/Assets/gamedb/gamedb_a7800.txt @@ -1,4 +1,6 @@ ;;NOTE: These hashes were generated using trimmed ROM headers +md5:91041AADD1700A7A4076F4005F2C362F Diagnostics A78 NTSC=true;board=0 +md5:89E7B20E7E0C629D00C6CA68949A216F Test Rom A78 NTSC=true;board=0 md5:4332c24e4f3bc72e7fe1b77adf66c2b7 3D Asteroids A78 NTSC=true;board=0 md5:0be996d25144966d5541c9eb4919b289 Ace of Aces A78 NTSC=true;board=A78SG md5:aadde920b3aaba03bc10b40bd0619c94 Ace of Aces A78 PAL=true;board=A78SG @@ -27,9 +29,9 @@ md5:2e8e28f6ad8b9b9267d518d880c73ebb Commando A78 NTSC=true;board=A78SGP md5:55da6c6c3974d013f517e725aa60f48e Commando A78 PAL=true;board=A78SGP md5:db691469128d9a4217ec7e315930b646 Crack'ed A78 NTSC=true;board=A78SG md5:7cbe78fa06f47ba6516a67a4b003c9ee Crack'ed A78 PAL=true;board=A78SG -md5:0c9b124355d5328697a3b9e0011353f2 Crazy Brix A78 NTSC=true;board=A7816 -md5:45e1d527becc96d1715e810d1c07ac27 Crazy Brix A78 NTSC=true;board=A7816 -md5:fc7db1a9243ce2140f716762b8352a5c Crazy Brix A78 PAL=true;board=A7816 +md5:0c9b124355d5328697a3b9e0011353f2 Crazy Brix A78 NTSC=true;board=0 +md5:45e1d527becc96d1715e810d1c07ac27 Crazy Brix A78 NTSC=true;board=0 +md5:fc7db1a9243ce2140f716762b8352a5c Crazy Brix A78 PAL=true;board=0 md5:a94e4560b6ad053a1c24e096f1262ebf Crossbow A78 NTSC=true;board=A78S9 md5:63db371d67a98daec547b2abd5e7aa95 Crossbow A78 PAL=true;board=A78S9 md5:179b76ff729d4849b8f66a502398acae CDark Chambers A78 NTSC=true;board=A78SG @@ -86,8 +88,8 @@ md5:f2f5e5841e4dda89a2faf8933dc33ea6 Mean 18 Ultimate Golf A78 NTSC=true;board md5:2e9dbad6c0fa381a6cd1bb9abf98a104 Mean 18 Ultimate Golf A78 PAL=true;board=A78SG md5:bedc30ec43587e0c98fc38c39c1ef9d0 Meltdown A78 NTSC=true;board=A78SG md5:c80155d7eec9e3dcb79aa6b83c9ccd1e Meltdown A78 PAL=true;board=A78SG -md5:b02f93661f4b7e712810d2bf8e02ad79 Meteor Shower A78 NTSC=true;board=A7816 -md5:2f1f199ecc2b414d28e01f0de53ca8f7 Meteor Shower A78 PAL=true;board=A7816 +md5:b02f93661f4b7e712810d2bf8e02ad79 Meteor Shower A78 NTSC=true;board=0 +md5:2f1f199ecc2b414d28e01f0de53ca8f7 Meteor Shower A78 PAL=true;board=0 md5:bc1e905db1008493a9632aa83ab4682b Midnight Mutants A78 NTSC=true;board=A78SG md5:6794ea31570eba0b88a0bf1ead3f3f1b Midnight Mutants A78 PAL=true;board=A78SG md5:017066f522908081ec3ee624f5e4a8aa Missing in Action A78 NTSC=true;board=A78S9 @@ -102,7 +104,7 @@ md5:ea0c859aa54fe5eaf4c1f327fab06221 Ninja Golf A78 PAL=true;board=A78SG md5:74569571a208f8b0b1ccfb22d7c914e1 One on One Basketball A78 NTSC=true;board=0 md5:8dba0425f0262e5704581d8757a1a6e3 One on One Basketball A78 PAL=true;board=0 md5:5d7bc7092de69095137456733e7b685d Pac-Man Collection A78 NTSC=true;board=0 -md5:90223a8a363bdf643a19d0f97e63b1b2 PacArcade A78 NTSC=true;board=A7816 +md5:90223a8a363bdf643a19d0f97e63b1b2 PacArcade A78 NTSC=true;board=0 md5:386bded4a944bae455fedf56206dd1dd Pete Rose Baseball A78 PAL=true;board=0 md5:1a5207870dec6fae9111cb747e20d8e3 Pete Rose Baseball A78 NTSC=true;board=0 md5:05f43244465943ce819780a71a5b572a Pitfighter A78 NTSC=true;board=A78S4 @@ -115,8 +117,8 @@ md5:66e7230f7ef9d14db82d76b06b241bc0 Q-bert A78 NTSC=true;board=A7832 md5:ac03806cef2558fc795a7d5d8dba7bc0 Rampage A78 NTSC=true;board=A78AC md5:383ed9bd1efb9b6cb3388a777678c928 Realsports Baseball A78 NTSC=true;board=A78S4 md5:8f7eb10ad0bd75474abf0c6c36c08486 Rescue on Fractalus A78 NTSC=true;board=A7832 -md5:43525a0405184875c2ecfd0196886a34 Rip Off A78 NTSC=true;board=A7816 -md5:106b409c6f4c219b1a3b3d099ead3b2b Rip Off A78 PAL=true;board=0A7816 +md5:43525a0405184875c2ecfd0196886a34 Rip Off A78 NTSC=true;board=0 +md5:106b409c6f4c219b1a3b3d099ead3b2b Rip Off A78 PAL=true;board=00 md5:505f05e7f161f62ccd749dab3c4a204b Robot Finds Kitten A78 NTSC=true;board=A7832 md5:66ecaafe1b82ae68ffc96267aaf7a4d7 Robotron 2084 A78 NTSC=true;board=0 md5:ae85689b21bdf85cb9dc57c3b1fec9db Santa Simon A78 NTSC=true;board=A7848 @@ -148,7 +150,7 @@ md5:32a37244a9c6cc928dcdf02b45365aa8 Tower Toppler A78 PAL=true;board=A78S4R md5:412cc5bfa08bd03244b9c4e8d46cd0a0 Wasp (Standard Edition) A78 NTSC=true;board=A7832 md5:427cb05d0a1abb068998e2760d77f4fb Water Ski A78 NTSC=true;board=A78S4 md5:3799d72f78dda2ee87b0ef8bf7b91186 Winter Games A78 NTSC=true;board=A78SGR -md5:6813ffff510f930c867b3f0aba78ac85 Worm (0703) A78 NTSC=true;board=A7816 +md5:6813ffff510f930c867b3f0aba78ac85 Worm (0703) A78 NTSC=true;board=0 md5:05fb699db9eef564e2fe45c568746dbc Xenophobe A78 NTSC=true;board=A78SG md5:70937c3184f0be33d06f7f4382ca54de Xenophobe A78 PAL=true;board=A78SG md5:d7dc17379aa25e5ae3c14b9e780c6f6d Xevious A78 NTSC=true;board=0 From a27b4aefc184e1e84adbefad51d85d65f596b03a Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Sun, 16 Jul 2017 11:54:28 -0400 Subject: [PATCH 03/93] A7800Hawk: Update controllers And fix bugs --- .../Consoles/Atari/A7800Hawk/TIA_Sound/TIA.cs | 38 +++++++++++++++++-- 1 file changed, 34 insertions(+), 4 deletions(-) diff --git a/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/TIA_Sound/TIA.cs b/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/TIA_Sound/TIA.cs index 0e964de66c..6f6890831b 100644 --- a/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/TIA_Sound/TIA.cs +++ b/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/TIA_Sound/TIA.cs @@ -92,24 +92,54 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk // inputs 0-3 are measured by a charging capacitor, these inputs are used with the paddles and the keyboard // Changing the hard coded value will change the paddle position. The range seems to be roughly 0-56000 according to values from stella // 6105 roughly centers the paddle in Breakout + + //INPT0-3 are used to read 2 button joysticks as well for the A7800 if (maskedAddr == 0x08) // INPT0 { - return 0; + if (Core.m6532._outputB == 0 && (Core.m6532._ddRb & 0x10)==0x10) + { + return (byte)(Core.p1_fire_2x & 0x80); + } + else + { + return 0; + } } if (maskedAddr == 0x09) // INPT1 { - return 0; + if (Core.m6532._outputB == 0 && (Core.m6532._ddRb & 0x10) == 0x10) + { + return (byte)((Core.p1_fire_2x & 0x40)<<1); + } + else + { + return 0; + } } if (maskedAddr == 0x0A) // INPT2 { - return 0; + if (Core.m6532._outputB == 0 && (Core.m6532._ddRb & 0x04) == 0x04) + { + return (byte)(Core.p2_fire_2x & 0x80); + } + else + { + return 0; + } } if (maskedAddr == 0x0B) // INPT3 { - return 0; + if (Core.m6532._outputB == 0 && (Core.m6532._ddRb & 0x04) == 0x04) + { + return (byte)((Core.p2_fire_2x & 0x40)<<1); + } + else + { + return 0; + } } if (maskedAddr == 0x0C) // INPT4 From 7914532ff09d85245ae0fc77ef4560518531aafb Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Sun, 16 Jul 2017 11:56:02 -0400 Subject: [PATCH 04/93] A7800Hawk: Update Controllers Now supports 2 button controller Also fixes a few other small bugs --- .../Atari/A7800Hawk/A7800Hawk.IEmulator.cs | 13 ++++++++++ .../A7800Hawk/A7800Hawk.IMemoryDomains.cs | 6 ++--- .../Atari/A7800Hawk/A7800Hawk.IStatable.cs | 2 +- .../Consoles/Atari/A7800Hawk/A7800Hawk.cs | 6 ++--- .../A7800Hawk/A7800HawkControllerDeck.cs | 10 +++++++ .../Atari/A7800Hawk/A7800HawkControllers.cs | 23 +++++++++++++++- .../Consoles/Atari/A7800Hawk/M6532.cs | 15 +++++++---- .../Consoles/Atari/A7800Hawk/Maria.cs | 26 +++++++------------ .../Consoles/Atari/A7800Hawk/MemoryMap.cs | 2 -- 9 files changed, 71 insertions(+), 32 deletions(-) diff --git a/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/A7800Hawk.IEmulator.cs b/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/A7800Hawk.IEmulator.cs index 6272a42805..1ce8da055f 100644 --- a/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/A7800Hawk.IEmulator.cs +++ b/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/A7800Hawk.IEmulator.cs @@ -13,6 +13,7 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk //Maria related variables public int cycle; public int cpu_cycle; + public int m6532_cycle; public bool cpu_is_haltable; public bool cpu_is_halted; public bool cpu_halt_pending; @@ -23,6 +24,8 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk public byte p2_state; public byte p1_fire; public byte p2_fire; + public byte p1_fire_2x; + public byte p2_fire_2x; public byte con_state; // there are 4 maria cycles in a CPU cycle (fast access, both NTSC and PAL) @@ -75,6 +78,14 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk tia.Execute(0); } + // tick the m6532 timer, which is still active although not recommended to use + m6532_cycle++; + if (m6532_cycle== 4) + { + m6532.Timer.Tick(); + m6532_cycle = 0; + } + if (cpu_cycle <= (2 + (slow_access ? 1 : 0))) { cpu_is_haltable = true; @@ -149,6 +160,8 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk p2_state = _controllerDeck.ReadPort2(controller); p1_fire = _controllerDeck.ReadFire1(controller); p2_fire = _controllerDeck.ReadFire2(controller); + p1_fire_2x = _controllerDeck.ReadFire1_2x(controller); + p2_fire_2x = _controllerDeck.ReadFire2_2x(controller); } public void GetConsoleState(IController controller) diff --git a/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/A7800Hawk.IMemoryDomains.cs b/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/A7800Hawk.IMemoryDomains.cs index cdda3798f3..aad27675dd 100644 --- a/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/A7800Hawk.IMemoryDomains.cs +++ b/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/A7800Hawk.IMemoryDomains.cs @@ -23,10 +23,10 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk 1), new MemoryDomainDelegate( "TIA Registers", - TIA_regs.Length, + 0x20, MemoryDomain.Endian.Little, - addr => TIA_regs[addr], - (addr, value) => TIA_regs[addr] = value, + addr => tia.ReadMemory((ushort)addr,true), + (addr, value) => tia.WriteMemory((ushort)addr, value, true), 1), new MemoryDomainDelegate( "Maria Registers", diff --git a/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/A7800Hawk.IStatable.cs b/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/A7800Hawk.IStatable.cs index 6c5b9f7dbc..081b2d0d30 100644 --- a/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/A7800Hawk.IStatable.cs +++ b/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/A7800Hawk.IStatable.cs @@ -62,7 +62,6 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk ser.Sync("A7800_control_register", ref A7800_control_register); ser.Sync("_isPAL", ref _isPAL); - ser.Sync("TIA_regs", ref TIA_regs, false); ser.Sync("Maria_regs", ref Maria_regs, false); ser.Sync("RAM", ref RAM, false); ser.Sync("RAM_6532", ref RAM_6532, false); @@ -70,6 +69,7 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk ser.Sync("cycle", ref cycle); ser.Sync("cpu_cycle", ref cpu_cycle); + ser.Sync("m6532_cycle", ref m6532_cycle); ser.Sync("cpu_is_haltable", ref cpu_is_haltable); ser.Sync("cpu_is_halted", ref cpu_is_halted); ser.Sync("cpu_halt_pending", ref cpu_halt_pending); diff --git a/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/A7800Hawk.cs b/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/A7800Hawk.cs index 848e740291..ecd0d72ee0 100644 --- a/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/A7800Hawk.cs +++ b/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/A7800Hawk.cs @@ -6,7 +6,7 @@ using BizHawk.Emulation.Cores.Components.M6502; namespace BizHawk.Emulation.Cores.Atari.A7800Hawk { - [Core( + [CoreAttributes( "A7800Hawk", "", isPorted: false, @@ -22,7 +22,6 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk public byte A7800_control_register; // memory domains - public byte[] TIA_regs = new byte[0x20]; public byte[] Maria_regs = new byte[0x20]; public byte[] RAM = new byte[0x1000]; public byte[] RAM_6532 = new byte[0x80]; @@ -131,6 +130,7 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk maria._frameHz = 50; maria._screen_width = 320; maria._screen_height = 313; + maria._vblanklines = 20; maria._palette = PALPalette; } else @@ -138,6 +138,7 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk maria._frameHz = 60; maria._screen_width = 320; maria._screen_height = 263; + maria._vblanklines = 20; maria._palette = NTSCPalette; } @@ -171,7 +172,6 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk maria.Reset(); m6532.Reset(); - TIA_regs = new byte[0x20]; Maria_regs = new byte[0x20]; RAM = new byte[0x1000]; diff --git a/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/A7800HawkControllerDeck.cs b/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/A7800HawkControllerDeck.cs index 950377081b..a0e21053c1 100644 --- a/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/A7800HawkControllerDeck.cs +++ b/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/A7800HawkControllerDeck.cs @@ -70,6 +70,16 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk return Port2.ReadFire(c); } + public byte ReadFire1_2x(IController c) + { + return Port1.ReadFire2x(c); + } + + public byte ReadFire2_2x(IController c) + { + return Port2.ReadFire2x(c); + } + public ControllerDefinition Definition { get; } public void SyncState(Serializer ser) diff --git a/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/A7800HawkControllers.cs b/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/A7800HawkControllers.cs index ab203c3011..6db22121c6 100644 --- a/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/A7800HawkControllers.cs +++ b/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/A7800HawkControllers.cs @@ -17,6 +17,8 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk byte ReadFire(IController c); + byte ReadFire2x(IController c); + ControllerDefinition Definition { get; } void SyncState(Serializer ser); @@ -42,6 +44,11 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk } public byte ReadFire(IController c) + { + return 0x80; + } + + public byte ReadFire2x(IController c) { return 0; } @@ -101,6 +108,20 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk return result; } + public byte ReadFire2x(IController c) + { + byte result = 0; + if (c.IsPressed(Definition.BoolButtons[4])) + { + result = 0x80; + } + if (c.IsPressed(Definition.BoolButtons[5])) + { + result |= 0x40; + } + return result; + } + public ControllerDefinition Definition { get; } @@ -111,7 +132,7 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk private static readonly string[] BaseDefinition = { - "U", "D", "L", "R", "Fire" + "U", "D", "L", "R", "Fire", "Fire2" }; private static byte[] HandControllerButtons = diff --git a/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/M6532.cs b/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/M6532.cs index 74a5209996..bb21eed8db 100644 --- a/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/M6532.cs +++ b/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/M6532.cs @@ -1,4 +1,5 @@ using BizHawk.Common; +using System; namespace BizHawk.Emulation.Cores.Atari.A7800Hawk { @@ -8,9 +9,10 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk public A7800Hawk Core { get; set; } - private byte _ddRa = 0x00; - private byte _ddRb = 0x00; - private byte _outputA = 0x00; + public byte _ddRa = 0x00; + public byte _ddRb = 0x00; + public byte _outputA = 0x00; + public byte _outputB = 0x00; public TimerData Timer; @@ -55,6 +57,7 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk // Read Output reg B byte temp = Core.con_state; temp = (byte)(temp & ~_ddRb); + temp = (byte)(temp + (_outputB & _ddRb)); return temp; } @@ -166,7 +169,7 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk else if (registerAddr == 0x02) { // Write Output reg B - // But is read only + _outputB = value; } else if (registerAddr == 0x03) { @@ -187,7 +190,8 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk _ddRa = 0x00; _ddRb = 0x00; _outputA = 0x00; - } + _outputB = 0x00; + } public void SyncState(Serializer ser) { @@ -195,6 +199,7 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk ser.Sync("ddra", ref _ddRa); ser.Sync("ddrb", ref _ddRb); ser.Sync("OutputA", ref _outputA); + ser.Sync("OutputB", ref _outputB); Timer.SyncState(ser); ser.EndSection(); } diff --git a/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/Maria.cs b/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/Maria.cs index 4f92b19ac4..0efa0456c5 100644 --- a/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/Maria.cs +++ b/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/Maria.cs @@ -31,6 +31,7 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk public int _frameHz = 60; public int _screen_width = 320; public int _screen_height = 263; + public int _vblanklines = 20; public int[] _vidbuffer; public int[] _palette; @@ -42,9 +43,9 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk } public int VirtualWidth => 320; - public int VirtualHeight => _screen_height; + public int VirtualHeight => _screen_height - _vblanklines; public int BufferWidth => 320; - public int BufferHeight => _screen_height; + public int BufferHeight => _screen_height - _vblanklines; public int BackgroundColor => unchecked((int)0xff000000); public int VsyncNumerator => _frameHz; public int VsyncDenominator => 1; @@ -71,7 +72,6 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk public int header_read_time = 8; // default for 4 byte headers (10 for 5 bytes ones) public int graphics_read_time = 3; // depends on content of graphics header public int DMA_phase_next; - public int base_scanline; public ushort display_zone_pointer; public int display_zone_counter; @@ -120,14 +120,10 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk // Since long shut down loads up the next zone, this basically loads up the DLL for the first zone sl_DMA_complete = false; do_dma = false; - + for (int i=0; i<454;i++) { - if (i<28) - { - // DMA doesn't start until 7 CPU cycles into a scanline - } - else if (i==28 && Core.Maria_regs[0x1C].Bit(6) && !Core.Maria_regs[0x1C].Bit(5)) + if(i==0 && Core.Maria_regs[0x1C].Bit(6) && !Core.Maria_regs[0x1C].Bit(5)) { Core.cpu_halt_pending = true; DMA_phase = DMA_START_UP; @@ -161,21 +157,17 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk scanline++; cycle = 0; do_dma = false; - Core.Maria_regs[8] = 0; // we have now left VBLank - base_scanline = 0; sl_DMA_complete = false; Core.cpu.RDY = true; + Core.Maria_regs[8] = 0; // we have now left VBLank + // Now proceed with the remaining scanlines // the first one is a pre-render line, since we didn't actually put any data into the buffer yet while (scanline < 263) { - if (cycle < 28) - { - // DMA doesn't start until 7 CPU cycles into a scanline - } - else if (cycle == 28 && Core.Maria_regs[0x1C].Bit(6) && !Core.Maria_regs[0x1C].Bit(5)) + if (cycle == 28 && Core.Maria_regs[0x1C].Bit(6) && !Core.Maria_regs[0x1C].Bit(5)) { Core.cpu_halt_pending = true; DMA_phase = DMA_START_UP; @@ -374,7 +366,7 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk } // the address here is specified by CHAR_BASE maria registers - //ushort addr = (ushort)(GFX_Objects[header_counter].addr & 0xFF); + // ushort addr = (ushort)(GFX_Objects[header_counter].addr & 0xFF); for (int i = 0; i < GFX_Objects[header_counter].width; i++) { addr_t = ReadMemory((ushort)(GFX_Objects[header_counter].addr + i)); diff --git a/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/MemoryMap.cs b/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/MemoryMap.cs index 4eb62900b1..848e06ae7d 100644 --- a/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/MemoryMap.cs +++ b/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/MemoryMap.cs @@ -35,7 +35,6 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk else { return tia.ReadMemory((ushort)(addr & 0x1F), false); - //return TIA_regs[addr & 0x1F]; // TODO: what to return here? } } else if ((addr & 0xFCE0) == 0x20) @@ -110,7 +109,6 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk } else { - TIA_regs[addr & 0x1F] = value; tia.WriteMemory((ushort)(addr & 0x1F), value, false); } } From c26979c0b10aa1f9b895584f9f1f68c756c47e22 Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Sun, 16 Jul 2017 12:02:21 -0400 Subject: [PATCH 05/93] Update A7800Hawk.cs --- BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/A7800Hawk.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/A7800Hawk.cs b/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/A7800Hawk.cs index ecd0d72ee0..c680c70227 100644 --- a/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/A7800Hawk.cs +++ b/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/A7800Hawk.cs @@ -6,7 +6,7 @@ using BizHawk.Emulation.Cores.Components.M6502; namespace BizHawk.Emulation.Cores.Atari.A7800Hawk { - [CoreAttributes( + [Core( "A7800Hawk", "", isPorted: false, From a5ea733269a7d6d8a35e0e5710b675d103dd10c4 Mon Sep 17 00:00:00 2001 From: Alexander Date: Sun, 16 Jul 2017 09:14:00 -0700 Subject: [PATCH 06/93] Add the Ultraman Cartridge Hash/Checksum. --- BizHawk.Emulation.Common/Database/FirmwareDatabase.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/BizHawk.Emulation.Common/Database/FirmwareDatabase.cs b/BizHawk.Emulation.Common/Database/FirmwareDatabase.cs index 6b56f7275e..41b60815b7 100644 --- a/BizHawk.Emulation.Common/Database/FirmwareDatabase.cs +++ b/BizHawk.Emulation.Common/Database/FirmwareDatabase.cs @@ -72,7 +72,8 @@ namespace BizHawk.Emulation.Common Option("SAT", "E", ss_100_j); Option("SAT", "E", ss_101_j); FirmwareAndOption("a67cd4f550751f8b91de2b8b74528ab4e0c11c77", 2 * 1024 * 1024, "SAT", "KOF95", "kof95.bin", "King of Fighters cartridge"); - Firmware("SAT", "ULTRAMAN", "Ultraman cartridge"); + //Firmware("SAT", "ULTRAMAN", "Ultraman cartridge"); + FirmwareAndOption("56c1b93da6b660bf393fbf48ca47569000ef4047", 2 * 1024 * 1024, "SAT", "ULTRAMAN", "Ultraman.bin", "Ultraman cartridge"); var ti83_102 = File("CE08F6A808701FC6672230A790167EE485157561", 262144, "ti83_102.rom", "TI-83 Rom v1.02"); // ?? is this size correct? var ti83_103 = File("8399E384804D8D29866CAA4C8763D7A61946A467", 262144, "ti83_103.rom", "TI-83 Rom v1.03"); // ?? is this size correct? From a71255b4b213100164d3254e48f06b265559d6a1 Mon Sep 17 00:00:00 2001 From: Ashafix Date: Mon, 17 Jul 2017 01:28:22 +0200 Subject: [PATCH 07/93] updated arg parser --- BizHawk.Client.EmuHawk/ArgParser.cs | 1 + BizHawk.Client.EmuHawk/MainForm.Events.cs | 2 +- BizHawk.Client.EmuHawk/MainForm.cs | 48 ++++++++++++----------- 3 files changed, 28 insertions(+), 23 deletions(-) diff --git a/BizHawk.Client.EmuHawk/ArgParser.cs b/BizHawk.Client.EmuHawk/ArgParser.cs index 22ac749614..939ca94b29 100644 --- a/BizHawk.Client.EmuHawk/ArgParser.cs +++ b/BizHawk.Client.EmuHawk/ArgParser.cs @@ -20,6 +20,7 @@ namespace BizHawk.Client.EmuHawk public HashSet _currAviWriterFrameList; public int _autoDumpLength; public bool _autoCloseOnDump = false; + // chrome is never shown, even in windowed mode public bool _chromeless = false; public bool startFullscreen = false; public string luaScript = null; diff --git a/BizHawk.Client.EmuHawk/MainForm.Events.cs b/BizHawk.Client.EmuHawk/MainForm.Events.cs index 9e671697d4..290b2429bf 100644 --- a/BizHawk.Client.EmuHawk/MainForm.Events.cs +++ b/BizHawk.Client.EmuHawk/MainForm.Events.cs @@ -2430,7 +2430,7 @@ namespace BizHawk.Client.EmuHawk showMenuVisible = true; // need to always be able to restore this as an emergency measure } - if (_chromeless) + if (argParse._chromeless) { showMenuVisible = true; // I decided this was always possible in chromeless mode, we'll see what they think } diff --git a/BizHawk.Client.EmuHawk/MainForm.cs b/BizHawk.Client.EmuHawk/MainForm.cs index 9965c31309..84f6bbb043 100644 --- a/BizHawk.Client.EmuHawk/MainForm.cs +++ b/BizHawk.Client.EmuHawk/MainForm.cs @@ -153,7 +153,6 @@ namespace BizHawk.Client.EmuHawk } }; - ArgParser argParse = new ArgParser(); argParse.parseArguments(args); Database.LoadDatabase(Path.Combine(PathManager.GetExeDirectoryAbsolute(), "gamedb", "gamedb.txt")); @@ -299,9 +298,9 @@ namespace BizHawk.Client.EmuHawk Global.MovieSession.ReadOnly = true; // if user is dumping and didnt supply dump length, make it as long as the loaded movie - if (_autoDumpLength == 0) + if (argParse._autoDumpLength == 0) { - _autoDumpLength = movie.InputLogLength; + argParse._autoDumpLength = movie.InputLogLength; } // Copy pasta from drag & drop @@ -374,6 +373,16 @@ namespace BizHawk.Client.EmuHawk LoadQuickSave("QuickSave" + Global.Config.SaveSlot); } } + //start Lua Console if requested in the command line arguments + if (luaConsole) + { + GlobalWin.Tools.Load(); + } + //load Lua Script if requested in the command line arguments + if (luaScript != null) + { + GlobalWin.Tools.LuaConsole.LoadLuaFile(luaScript); + } //start Lua Console if requested in the command line arguments if (argParse.luaConsole) @@ -1022,15 +1031,15 @@ namespace BizHawk.Client.EmuHawk { // TODO - maybe apply a hack tracked during fullscreen here to override it FormBorderStyle = FormBorderStyle.None; - MainMenuStrip.Visible = Global.Config.DispChrome_MenuFullscreen && !_chromeless; - MainStatusBar.Visible = Global.Config.DispChrome_StatusBarFullscreen && !_chromeless; + MainMenuStrip.Visible = Global.Config.DispChrome_MenuFullscreen && !argParse._chromeless; + MainStatusBar.Visible = Global.Config.DispChrome_StatusBarFullscreen && !argParse._chromeless; } else { - MainStatusBar.Visible = Global.Config.DispChrome_StatusBarWindowed && !_chromeless; - MainMenuStrip.Visible = Global.Config.DispChrome_MenuWindowed && !_chromeless; - MaximizeBox = MinimizeBox = Global.Config.DispChrome_CaptionWindowed && !_chromeless; - if (Global.Config.DispChrome_FrameWindowed == 0 || _chromeless) + MainStatusBar.Visible = Global.Config.DispChrome_StatusBarWindowed && !argParse._chromeless; + MainMenuStrip.Visible = Global.Config.DispChrome_MenuWindowed && !argParse._chromeless; + MaximizeBox = MinimizeBox = Global.Config.DispChrome_CaptionWindowed && !argParse._chromeless; + if (Global.Config.DispChrome_FrameWindowed == 0 || argParse._chromeless) { FormBorderStyle = FormBorderStyle.None; } @@ -1356,7 +1365,6 @@ namespace BizHawk.Client.EmuHawk // AVI/WAV state private IVideoWriter _currAviWriter; - private readonly HashSet _currAviWriterFrameList; private AutofireController _autofireNullControls; @@ -1399,13 +1407,9 @@ namespace BizHawk.Client.EmuHawk private Point _windowedLocation; private bool _needsFullscreenOnLoad; - private int _autoDumpLength; - private readonly bool _autoCloseOnDump; private int _lastOpenRomFilter; - // chrome is never shown, even in windowed mode - private readonly bool _chromeless; - + private ArgParser argParse = new ArgParser(); // Resources private Bitmap _statusBarDiskLightOnImage; private Bitmap _statusBarDiskLightOffImage; @@ -1472,7 +1476,7 @@ namespace BizHawk.Client.EmuHawk } } - if (!Global.Config.DispChrome_CaptionWindowed || _chromeless) + if (!Global.Config.DispChrome_CaptionWindowed || argParse._chromeless) { str = ""; } @@ -3272,9 +3276,9 @@ namespace BizHawk.Client.EmuHawk try { // is this the best time to handle this? or deeper inside? - if (_currAviWriterFrameList != null) + if (argParse._currAviWriterFrameList != null) { - if (!_currAviWriterFrameList.Contains(Emulator.Frame)) + if (!argParse._currAviWriterFrameList.Contains(Emulator.Frame)) { goto HANDLE_AUTODUMP; } @@ -3357,13 +3361,13 @@ namespace BizHawk.Client.EmuHawk } HANDLE_AUTODUMP: - if (_autoDumpLength > 0) + if (argParse._autoDumpLength > 0) { - _autoDumpLength--; - if (_autoDumpLength == 0) // finish + argParse._autoDumpLength--; + if (argParse._autoDumpLength == 0) // finish { StopAv(); - if (_autoCloseOnDump) + if (argParse._autoCloseOnDump) { _exit = true; } From d42962a1b4aa8cb1811f1da49ef8a19b1f0a2a28 Mon Sep 17 00:00:00 2001 From: Ashafix Date: Mon, 17 Jul 2017 08:23:58 +0200 Subject: [PATCH 08/93] removed unnecessary code duplication --- BizHawk.Client.EmuHawk/MainForm.cs | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/BizHawk.Client.EmuHawk/MainForm.cs b/BizHawk.Client.EmuHawk/MainForm.cs index 84f6bbb043..2274b6ce5e 100644 --- a/BizHawk.Client.EmuHawk/MainForm.cs +++ b/BizHawk.Client.EmuHawk/MainForm.cs @@ -373,16 +373,6 @@ namespace BizHawk.Client.EmuHawk LoadQuickSave("QuickSave" + Global.Config.SaveSlot); } } - //start Lua Console if requested in the command line arguments - if (luaConsole) - { - GlobalWin.Tools.Load(); - } - //load Lua Script if requested in the command line arguments - if (luaScript != null) - { - GlobalWin.Tools.LuaConsole.LoadLuaFile(luaScript); - } //start Lua Console if requested in the command line arguments if (argParse.luaConsole) From 720cc0d9bb0e489a856d7c764a2caa399cb05e95 Mon Sep 17 00:00:00 2001 From: zeromus Date: Mon, 17 Jul 2017 09:47:25 -0500 Subject: [PATCH 09/93] fix path manager support of fully rooted paths (e.g. c:\roms) --- BizHawk.Client.Common/PathManager.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/BizHawk.Client.Common/PathManager.cs b/BizHawk.Client.Common/PathManager.cs index be0fdf0ca6..9543368fd8 100644 --- a/BizHawk.Client.Common/PathManager.cs +++ b/BizHawk.Client.Common/PathManager.cs @@ -134,6 +134,9 @@ namespace BizHawk.Client.Common return path; } + if (Path.IsPathRooted(path)) + return path; + //handling of initial .. was removed (Path.GetFullPath can handle it) //handling of file:// or file:\\ was removed (can Path.GetFullPath handle it? not sure) From f424a22033b06327f327e054f20bdaa3b0c0a9cf Mon Sep 17 00:00:00 2001 From: adelikat Date: Mon, 17 Jul 2017 11:20:29 -0500 Subject: [PATCH 10/93] Tastudio - fix recent menu - fixes #920 --- BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.cs b/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.cs index 91954bf9af..d2d48907b7 100644 --- a/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.cs +++ b/BizHawk.Client.EmuHawk/tools/TAStudio/TAStudio.cs @@ -78,7 +78,7 @@ namespace BizHawk.Client.EmuHawk DenoteMarkersWithBGColor = true; } - public RecentFiles RecentTas { get; } + public RecentFiles RecentTas { get; set; } public bool DrawInput { get; set; } public bool AutoPause { get; set; } public bool AutoRestoreLastPosition { get; set; } From 3ef2196a281264874378a4f6cb89425b00d9c38c Mon Sep 17 00:00:00 2001 From: zeromus Date: Mon, 17 Jul 2017 09:56:55 -0500 Subject: [PATCH 11/93] fix ghost window stealing input focus when exiting dialogs opened by hotkeys, or something like that --- BizHawk.Client.EmuHawk/Extensions/ControlExtensions.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/BizHawk.Client.EmuHawk/Extensions/ControlExtensions.cs b/BizHawk.Client.EmuHawk/Extensions/ControlExtensions.cs index 5221e522ed..f03313113b 100644 --- a/BizHawk.Client.EmuHawk/Extensions/ControlExtensions.cs +++ b/BizHawk.Client.EmuHawk/Extensions/ControlExtensions.cs @@ -176,7 +176,9 @@ namespace BizHawk.Client.EmuHawk.WinFormExtensions public static DialogResult ShowHawkDialog(this CommonDialog form) { GlobalWin.Sound.StopSound(); - var result = form.ShowDialog(new Form() { TopMost = true }); + var tempForm = new Form() { TopMost = true }; + var result = form.ShowDialog(tempForm); + tempForm.Dispose(); GlobalWin.Sound.StartSound(); return result; } From e61f7d787695a0780a2e6956dd608ed5e0498187 Mon Sep 17 00:00:00 2001 From: nattthebear Date: Mon, 17 Jul 2017 17:39:19 -0400 Subject: [PATCH 12/93] mgba to 0.6 release --- output/dll/mgba.dll | Bin 833024 -> 833024 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/output/dll/mgba.dll b/output/dll/mgba.dll index 12a7522a86be7ec3e41282a1195cdba591ff22ba..df75e9790d70df651929e9a051f9893b46d5cde6 100644 GIT binary patch delta 178744 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%0DvR%%9Lj#EGJ7Kd>=3lck+{kuw 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

+8g#&EK&BfA#zpBPR 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 M#pm6a8#wy^1FUjG82|tP From c31ebe176d25017fbc33f83f76d3c45eb9975d7b Mon Sep 17 00:00:00 2001 From: nattthebear Date: Mon, 17 Jul 2017 18:49:16 -0400 Subject: [PATCH 13/93] gpgx: multidisk? dunno --- BizHawk.Client.Common/RomLoader.cs | 2 +- .../Consoles/Sega/gpgx64/GPGX.IEmulator.cs | 47 +- .../Consoles/Sega/gpgx64/GPGX.IStatable.cs | 6 + .../Consoles/Sega/gpgx64/GPGX.cs | 76 +- .../Sega/gpgx64/GPGXControlConverter.cs | 7 +- .../Consoles/Sega/gpgx64/LibGPGX.cs | 51 +- output/dll/gpgx.wbx.gz | Bin 459165 -> 462957 bytes waterbox/gpgx/cinterface/cinterface.c | 8 + waterbox/gpgx/core/cd_hw/cdd.c | 1667 +++++++++-------- waterbox/gpgx/core/cd_hw/cdd.h | 216 +-- 10 files changed, 1078 insertions(+), 1002 deletions(-) diff --git a/BizHawk.Client.Common/RomLoader.cs b/BizHawk.Client.Common/RomLoader.cs index 19804b7352..546658b4e9 100644 --- a/BizHawk.Client.Common/RomLoader.cs +++ b/BizHawk.Client.Common/RomLoader.cs @@ -554,7 +554,7 @@ namespace BizHawk.Client.Common switch (game.System) { case "GEN": - var genesis = new GPGX(nextComm, null, disc, GetCoreSettings(), GetCoreSyncSettings()); + var genesis = new GPGX(nextComm, null, new[] { disc }, GetCoreSettings(), GetCoreSyncSettings()); nextEmulator = genesis; break; case "SAT": diff --git a/BizHawk.Emulation.Cores/Consoles/Sega/gpgx64/GPGX.IEmulator.cs b/BizHawk.Emulation.Cores/Consoles/Sega/gpgx64/GPGX.IEmulator.cs index ed54dfcee5..5e3cefb72b 100644 --- a/BizHawk.Emulation.Cores/Consoles/Sega/gpgx64/GPGX.IEmulator.cs +++ b/BizHawk.Emulation.Cores/Consoles/Sega/gpgx64/GPGX.IEmulator.cs @@ -7,20 +7,42 @@ namespace BizHawk.Emulation.Cores.Consoles.Sega.gpgx { public IEmulatorServiceProvider ServiceProvider { get; private set; } - public ControllerDefinition ControllerDefinition { get; private set; } - - // TODO: use render and rendersound + public ControllerDefinition ControllerDefinition { get; private set; } + + // TODO: use render and rendersound public void FrameAdvance(IController controller, bool render, bool rendersound = true) { if (controller.IsPressed("Reset")) Core.gpgx_reset(false); if (controller.IsPressed("Power")) - Core.gpgx_reset(true); - - // this shouldn't be needed, as nothing has changed - // if (!Core.gpgx_get_control(input, inputsize)) - // throw new Exception("gpgx_get_control() failed!"); - + Core.gpgx_reset(true); + if (_cds != null) + { + var prev = controller.IsPressed("Previous Disk"); + var next = controller.IsPressed("Next Disk"); + int newDisk = _discIndex; + if (prev && !_prevDiskPressed) + newDisk--; + if (next && !_nextDiskPressed) + newDisk++; + + if (newDisk < -1) + newDisk = -1; + if (newDisk >= _cds.Length) + newDisk = _cds.Length - 1; + + if (newDisk != _discIndex) + { + _discIndex = newDisk; + Core.gpgx_swap_disc(_discIndex == -1 ? null : GetCDDataStruct(_cds[_discIndex])); + Console.WriteLine("IMMA CHANGING MAH DISKS"); + } + } + + // this shouldn't be needed, as nothing has changed + // if (!Core.gpgx_get_control(input, inputsize)) + // throw new Exception("gpgx_get_control() failed!"); + ControlConverter.ScreenWidth = vwidth; ControlConverter.ScreenHeight = vheight; ControlConverter.Convert(controller, input); @@ -39,7 +61,7 @@ namespace BizHawk.Emulation.Cores.Consoles.Sega.gpgx if (IsLagFrame) LagCount++; - if (CD != null) + if (_cds != null) DriveLightOn = _drivelight; } @@ -70,8 +92,9 @@ namespace BizHawk.Emulation.Cores.Consoles.Sega.gpgx { if (_elf != null) _elf.Dispose(); - if (CD != null) - CD.Dispose(); + if (_cds != null) + foreach (var cd in _cds) + cd.Dispose(); _disposed = true; } } diff --git a/BizHawk.Emulation.Cores/Consoles/Sega/gpgx64/GPGX.IStatable.cs b/BizHawk.Emulation.Cores/Consoles/Sega/gpgx64/GPGX.IStatable.cs index a31c1233dc..312bc3e69c 100644 --- a/BizHawk.Emulation.Cores/Consoles/Sega/gpgx64/GPGX.IStatable.cs +++ b/BizHawk.Emulation.Cores/Consoles/Sega/gpgx64/GPGX.IStatable.cs @@ -36,6 +36,9 @@ namespace BizHawk.Emulation.Cores.Consoles.Sega.gpgx Frame = reader.ReadInt32(); LagCount = reader.ReadInt32(); IsLagFrame = reader.ReadBoolean(); + _discIndex = reader.ReadInt32(); + _prevDiskPressed = reader.ReadBoolean(); + _nextDiskPressed = reader.ReadBoolean(); // any managed pointers that we sent to the core need to be resent now! Core.gpgx_set_input_callback(InputCallback); RefreshMemCallbacks(); @@ -51,6 +54,9 @@ namespace BizHawk.Emulation.Cores.Consoles.Sega.gpgx writer.Write(Frame); writer.Write(LagCount); writer.Write(IsLagFrame); + writer.Write(_discIndex); + writer.Write(_prevDiskPressed); + writer.Write(_nextDiskPressed); } public byte[] SaveStateBinary() diff --git a/BizHawk.Emulation.Cores/Consoles/Sega/gpgx64/GPGX.cs b/BizHawk.Emulation.Cores/Consoles/Sega/gpgx64/GPGX.cs index b94e50ab42..88ac2a5d75 100644 --- a/BizHawk.Emulation.Cores/Consoles/Sega/gpgx64/GPGX.cs +++ b/BizHawk.Emulation.Cores/Consoles/Sega/gpgx64/GPGX.cs @@ -7,6 +7,8 @@ using BizHawk.Emulation.Common; using BizHawk.Emulation.Cores.Waterbox; using BizHawk.Common; using BizHawk.Emulation.DiscSystem; +using System.Collections.Generic; +using System.Linq; namespace BizHawk.Emulation.Cores.Consoles.Sega.gpgx { @@ -27,7 +29,7 @@ namespace BizHawk.Emulation.Cores.Consoles.Sega.gpgx { } - public GPGX(CoreComm comm, byte[] rom, DiscSystem.Disc CD, object settings, object syncSettings) + public GPGX(CoreComm comm, byte[] rom, IEnumerable cds, object settings, object syncSettings) { ServiceProvider = new BasicServiceProvider(this); // this can influence some things internally (autodetect romtype, etc) @@ -64,12 +66,14 @@ namespace BizHawk.Emulation.Cores.Consoles.Sega.gpgx LoadCallback = new LibGPGX.load_archive_cb(load_archive); this.romfile = rom; - this.CD = CD; - if (CD != null) + + if (cds != null) { - this.DiscSectorReader = new DiscSystem.DiscSectorReader(CD); + _cds = cds.ToArray(); + _cdReaders = cds.Select(c => new DiscSectorReader(c)).ToArray(); cd_callback_handle = new LibGPGX.cd_read_cb(CDRead); Core.gpgx_set_cdd_callback(cd_callback_handle); + DriveLightEnabled = true; } LibGPGX.INPUT_SYSTEM system_a = LibGPGX.INPUT_SYSTEM.SYSTEM_NONE; @@ -139,9 +143,6 @@ namespace BizHawk.Emulation.Cores.Consoles.Sega.gpgx InputCallback = new LibGPGX.input_cb(input_callback); Core.gpgx_set_input_callback(InputCallback); - if (CD != null) - DriveLightEnabled = true; - // process the non-init settings now PutSettings(_settings); @@ -159,8 +160,12 @@ namespace BizHawk.Emulation.Cores.Consoles.Sega.gpgx private LibGPGX Core; private PeRunner _elf; - DiscSystem.Disc CD; - DiscSystem.DiscSectorReader DiscSectorReader; + private Disc[] _cds; + private int _discIndex; + private DiscSectorReader[] _cdReaders; + private bool _prevDiskPressed; + private bool _nextDiskPressed; + byte[] romfile; private bool _disposed = false; @@ -217,12 +222,12 @@ namespace BizHawk.Emulation.Cores.Consoles.Sega.gpgx } else { - if (CD == null) + if (_cds == null) { Console.WriteLine("Couldn't satisfy firmware request {0} because none was provided.", filename); return 0; } - srcdata = GetCDData(CD); + srcdata = GetCDData(_cds[0]); if (srcdata.Length != maxsize) { Console.WriteLine("Couldn't satisfy firmware request {0} because of struct size.", filename); @@ -283,36 +288,38 @@ namespace BizHawk.Emulation.Cores.Consoles.Sega.gpgx void CDRead(int lba, IntPtr dest, bool audio) { - if (audio) + if ((uint)_discIndex < _cds.Length) { - byte[] data = new byte[2352]; - if (lba < CD.Session1.LeadoutLBA) + if (audio) { - DiscSectorReader.ReadLBA_2352(lba, data, 0); + byte[] data = new byte[2352]; + if (lba < _cds[_discIndex].Session1.LeadoutLBA) + { + _cdReaders[_discIndex].ReadLBA_2352(lba, data, 0); + } + else + { + // audio seems to read slightly past the end of disks; probably innoculous + // just send back 0s. + // Console.WriteLine("!!{0} >= {1}", lba, CD.LBACount); + } + Marshal.Copy(data, 0, dest, 2352); } else { - // audio seems to read slightly past the end of disks; probably innoculous - // just send back 0s. - // Console.WriteLine("!!{0} >= {1}", lba, CD.LBACount); + byte[] data = new byte[2048]; + _cdReaders[_discIndex].ReadLBA_2048(lba, data, 0); + Marshal.Copy(data, 0, dest, 2048); + _drivelight = true; } - Marshal.Copy(data, 0, dest, 2352); - } - else - { - byte[] data = new byte[2048]; - DiscSectorReader.ReadLBA_2048(lba, data, 0); - Marshal.Copy(data, 0, dest, 2048); - _drivelight = true; } } LibGPGX.cd_read_cb cd_callback_handle; - public static unsafe byte[] GetCDData(Disc cd) + public static LibGPGX.CDData GetCDDataStruct(Disc cd) { - LibGPGX.CDData ret = new LibGPGX.CDData(); - int size = Marshal.SizeOf(ret); + var ret = new LibGPGX.CDData(); var ses = cd.Session1; int ntrack = ses.InformationTrackCount; @@ -338,6 +345,13 @@ namespace BizHawk.Emulation.Cores.Consoles.Sega.gpgx } } + return ret; + } + + public static unsafe byte[] GetCDData(Disc cd) + { + var ret = GetCDDataStruct(cd); + int size = Marshal.SizeOf(ret); byte[] retdata = new byte[size]; fixed (byte* p = &retdata[0]) @@ -360,7 +374,7 @@ namespace BizHawk.Emulation.Cores.Consoles.Sega.gpgx if (!Core.gpgx_get_control(input, inputsize)) throw new Exception("gpgx_get_control() failed"); - ControlConverter = new GPGXControlConverter(input); + ControlConverter = new GPGXControlConverter(input, _cds != null); ControllerDefinition = ControlConverter.ControllerDef; } @@ -369,7 +383,7 @@ namespace BizHawk.Emulation.Cores.Consoles.Sega.gpgx return (LibGPGX.INPUT_DEVICE[])input.dev.Clone(); } - public bool IsMegaCD { get { return CD != null; } } + public bool IsMegaCD { get { return _cds != null; } } public class VDPView : IMonitor { diff --git a/BizHawk.Emulation.Cores/Consoles/Sega/gpgx64/GPGXControlConverter.cs b/BizHawk.Emulation.Cores/Consoles/Sega/gpgx64/GPGXControlConverter.cs index f1af5af62f..99a7a7745b 100644 --- a/BizHawk.Emulation.Cores/Consoles/Sega/gpgx64/GPGXControlConverter.cs +++ b/BizHawk.Emulation.Cores/Consoles/Sega/gpgx64/GPGXControlConverter.cs @@ -175,7 +175,7 @@ namespace BizHawk.Emulation.Cores.Consoles.Sega.gpgx }); } - public GPGXControlConverter(LibGPGX.InputData input) + public GPGXControlConverter(LibGPGX.InputData input, bool cdButtons) { Console.WriteLine("Genesis Controller report:"); foreach (var e in input.system) @@ -189,6 +189,11 @@ namespace BizHawk.Emulation.Cores.Consoles.Sega.gpgx ControllerDef.BoolButtons.Add("Power"); ControllerDef.BoolButtons.Add("Reset"); + if (cdButtons) + { + ControllerDef.BoolButtons.Add("Previous Disk"); + ControllerDef.BoolButtons.Add("Next Disk"); + } for (int i = 0; i < LibGPGX.MAX_DEVICES; i++) { diff --git a/BizHawk.Emulation.Cores/Consoles/Sega/gpgx64/LibGPGX.cs b/BizHawk.Emulation.Cores/Consoles/Sega/gpgx64/LibGPGX.cs index aaea926d69..5892f53513 100644 --- a/BizHawk.Emulation.Cores/Consoles/Sega/gpgx64/LibGPGX.cs +++ b/BizHawk.Emulation.Cores/Consoles/Sega/gpgx64/LibGPGX.cs @@ -49,7 +49,7 @@ namespace BizHawk.Emulation.Cores.Consoles.Sega.gpgx public uint BackdropColor; } - [BizImport(CallingConvention.Cdecl, Compatibility=true)] + [BizImport(CallingConvention.Cdecl, Compatibility = true)] public abstract bool gpgx_init(string feromextension, load_archive_cb feload_archive_cb, bool sixbutton, INPUT_SYSTEM system_a, INPUT_SYSTEM system_b, Region region, [In]InitSettings settings); [BizImport(CallingConvention.Cdecl)] @@ -84,34 +84,34 @@ namespace BizHawk.Emulation.Cores.Consoles.Sega.gpgx public enum INPUT_SYSTEM : byte { - SYSTEM_NONE = 0, // unconnected port - SYSTEM_MD_GAMEPAD = 1, // single 3-buttons or 6-buttons Control Pad - SYSTEM_MOUSE = 2, // Sega Mouse - SYSTEM_MENACER = 3, // Sega Menacer -- port B only - SYSTEM_JUSTIFIER = 4, // Konami Justifiers -- port B only - SYSTEM_XE_A1P = 5, // XE-A1P analog controller -- port A only - SYSTEM_ACTIVATOR = 6, // Sega Activator - SYSTEM_MS_GAMEPAD = 7, // single 2-buttons Control Pad -- Master System - SYSTEM_LIGHTPHASER = 8, // Sega Light Phaser -- Master System - SYSTEM_PADDLE = 9, // Sega Paddle Control -- Master System - SYSTEM_SPORTSPAD = 10, // Sega Sports Pad -- Master System - SYSTEM_TEAMPLAYER = 11, // Multi Tap -- Sega TeamPlayer - SYSTEM_WAYPLAY = 12, // Multi Tap -- EA 4-Way Play -- use both ports + SYSTEM_NONE = 0, // unconnected port + SYSTEM_MD_GAMEPAD = 1, // single 3-buttons or 6-buttons Control Pad + SYSTEM_MOUSE = 2, // Sega Mouse + SYSTEM_MENACER = 3, // Sega Menacer -- port B only + SYSTEM_JUSTIFIER = 4, // Konami Justifiers -- port B only + SYSTEM_XE_A1P = 5, // XE-A1P analog controller -- port A only + SYSTEM_ACTIVATOR = 6, // Sega Activator + SYSTEM_MS_GAMEPAD = 7, // single 2-buttons Control Pad -- Master System + SYSTEM_LIGHTPHASER = 8, // Sega Light Phaser -- Master System + SYSTEM_PADDLE = 9, // Sega Paddle Control -- Master System + SYSTEM_SPORTSPAD = 10, // Sega Sports Pad -- Master System + SYSTEM_TEAMPLAYER = 11, // Multi Tap -- Sega TeamPlayer + SYSTEM_WAYPLAY = 12, // Multi Tap -- EA 4-Way Play -- use both ports }; public enum INPUT_DEVICE : byte { - DEVICE_NONE = 0xff, // unconnected device = fixed ID for Team Player) - DEVICE_PAD3B = 0x00, // 3-buttons Control Pad = fixed ID for Team Player) - DEVICE_PAD6B = 0x01, // 6-buttons Control Pad = fixed ID for Team Player) - DEVICE_PAD2B = 0x02, // 2-buttons Control Pad - DEVICE_MOUSE = 0x03, // Sega Mouse + DEVICE_NONE = 0xff, // unconnected device = fixed ID for Team Player) + DEVICE_PAD3B = 0x00, // 3-buttons Control Pad = fixed ID for Team Player) + DEVICE_PAD6B = 0x01, // 6-buttons Control Pad = fixed ID for Team Player) + DEVICE_PAD2B = 0x02, // 2-buttons Control Pad + DEVICE_MOUSE = 0x03, // Sega Mouse DEVICE_LIGHTGUN = 0x04, // Sega Light Phaser, Menacer or Konami Justifiers - DEVICE_PADDLE = 0x05, // Sega Paddle Control + DEVICE_PADDLE = 0x05, // Sega Paddle Control DEVICE_SPORTSPAD = 0x06,// Sega Sports Pad - DEVICE_PICO = 0x07, // PICO tablet - DEVICE_TEREBI = 0x08, // Terebi Oekaki tablet - DEVICE_XE_A1P = 0x09, // XE-A1P analog controller + DEVICE_PICO = 0x07, // PICO tablet + DEVICE_TEREBI = 0x08, // Terebi Oekaki tablet + DEVICE_XE_A1P = 0x09, // XE-A1P analog controller DEVICE_ACTIVATOR = 0x0a,// Activator }; @@ -151,8 +151,6 @@ namespace BizHawk.Emulation.Cores.Consoles.Sega.gpgx [BizImport(CallingConvention.Cdecl)] public abstract void gpgx_set_cd_callback(CDCallback cd); - - ///

/// not every flag is valid for every device! /// @@ -277,6 +275,9 @@ namespace BizHawk.Emulation.Cores.Consoles.Sega.gpgx [BizImport(CallingConvention.Cdecl)] public abstract void gpgx_set_cdd_callback(cd_read_cb cddcb); + [BizImport(CallingConvention.Cdecl, Compatibility = true)] + public abstract void gpgx_swap_disc(CDData toc); + [StructLayout(LayoutKind.Sequential)] public struct VDPNameTable { diff --git a/output/dll/gpgx.wbx.gz b/output/dll/gpgx.wbx.gz index fc7827b49eb0cd4357bc7240a90edeefc59387da..3a0c836d1454a85fe1f1f0d93a9a234e4c5a6aa0 100644 GIT binary patch literal 462957 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

  • pV*dKz?2}jgJ8P7oXB|&1r!j|`%CX{ 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 Dq&bvt literal 459165 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Ð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

    Sf@tZw2{e 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

    uB6_lwrs`6yEU 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 diff --git a/waterbox/gpgx/cinterface/cinterface.c b/waterbox/gpgx/cinterface/cinterface.c index 9f2c53217c..84efe5fa24 100644 --- a/waterbox/gpgx/cinterface/cinterface.c +++ b/waterbox/gpgx/cinterface/cinterface.c @@ -192,6 +192,14 @@ GPGX_EX void gpgx_advance(void) nsamples = audio_update(soundbuffer); } +GPGX_EX void gpgx_swap_disc(const toc_t* toc) +{ + if (system_hw == SYSTEM_MCD) + { + cdd_hotswap(toc); + } +} + typedef struct { uint32 width; // in cells diff --git a/waterbox/gpgx/core/cd_hw/cdd.c b/waterbox/gpgx/core/cd_hw/cdd.c index 0eb4890317..cfebb81a45 100644 --- a/waterbox/gpgx/core/cd_hw/cdd.c +++ b/waterbox/gpgx/core/cd_hw/cdd.c @@ -1,826 +1,841 @@ -/*************************************************************************************** - * Genesis Plus - * CD drive processor & CD-DA fader - * - * Copyright (C) 2012-2013 Eke-Eke (Genesis Plus GX) - * - * Redistribution and use of this code or any derivative works are permitted - * provided that the following conditions are met: - * - * - Redistributions may not be sold, nor may they be used in a commercial - * product or activity. - * - * - Redistributions that are modified from the original source must include the - * complete source code, including the source code for all components used by a - * binary built from the modified sources. However, as a special exception, the - * source code distributed need not include anything that is normally distributed - * (in either source or binary form) with the major components (compiler, kernel, - * and so on) of the operating system on which the executable runs, unless that - * component itself accompanies the executable. - * - * - Redistributions must reproduce the above copyright notice, this list of - * conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************************/ -#include "shared.h" -#include "../cinterface/callbacks.h" - -/* BCD conversion lookup tables */ -static const uint8 lut_BCD_8[100] = -{ - 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, - 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, - 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, - 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, - 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, - 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, - 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, - 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, - 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, - 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, -}; - -static const uint16 lut_BCD_16[100] = -{ - 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, - 0x0100, 0x0101, 0x0102, 0x0103, 0x0104, 0x0105, 0x0106, 0x0107, 0x0108, 0x0109, - 0x0200, 0x0201, 0x0202, 0x0203, 0x0204, 0x0205, 0x0206, 0x0207, 0x0208, 0x0209, - 0x0300, 0x0301, 0x0302, 0x0303, 0x0304, 0x0305, 0x0306, 0x0307, 0x0308, 0x0309, - 0x0400, 0x0401, 0x0402, 0x0403, 0x0404, 0x0405, 0x0406, 0x0407, 0x0408, 0x0409, - 0x0500, 0x0501, 0x0502, 0x0503, 0x0504, 0x0505, 0x0506, 0x0507, 0x0508, 0x0509, - 0x0600, 0x0601, 0x0602, 0x0603, 0x0604, 0x0605, 0x0606, 0x0607, 0x0608, 0x0609, - 0x0700, 0x0701, 0x0702, 0x0703, 0x0704, 0x0705, 0x0706, 0x0707, 0x0708, 0x0709, - 0x0800, 0x0801, 0x0802, 0x0803, 0x0804, 0x0805, 0x0806, 0x0807, 0x0808, 0x0809, - 0x0900, 0x0901, 0x0902, 0x0903, 0x0904, 0x0905, 0x0906, 0x0907, 0x0908, 0x0909, -}; - -/* pre-build TOC */ -static const uint16 toc_snatcher[21] = -{ - 56014, 495, 10120, 20555, 1580, 5417, 12502, 16090, 6553, 9681, - 8148, 20228, 8622, 6142, 5858, 1287, 7424, 3535, 31697, 2485, - 31380 -}; - -static const uint16 toc_lunar[52] = -{ - 5422, 1057, 7932, 5401, 6380, 6592, 5862, 5937, 5478, 5870, - 6673, 6613, 6429, 4996, 4977, 5657, 3720, 5892, 3140, 3263, - 6351, 5187, 3249, 1464, 1596, 1750, 1751, 6599, 4578, 5205, - 1550, 1827, 2328, 1346, 1569, 1613, 7199, 4928, 1656, 2549, - 1875, 3901, 1850, 2399, 2028, 1724, 4889, 14551, 1184, 2132, - 685, 3167 -}; - -static const uint32 toc_shadow[15] = -{ - 10226, 70054, 11100, 12532, 12444, 11923, 10059, 10167, 10138, 13792, - 11637, 2547, 2521, 3856, 900 -}; - -static const uint32 toc_dungeon[13] = -{ - 2250, 22950, 16350, 24900, 13875, 19950, 13800, 15375, 17400, 17100, - 3325, 6825, 25275 -}; - -static const uint32 toc_ffight[26] = -{ - 11994, 9742, 10136, 9685, 9553, 14588, 9430, 8721, 9975, 9764, - 9704, 12796, 585, 754, 951, 624, 9047, 1068, 817, 9191, 1024, - 14562, 10320, 8627, 3795, 3047 -}; - -static const uint32 toc_ffightj[29] = -{ - 11994, 9752, 10119, 9690, 9567, 14575, 9431, 8731, 9965, 9763, - 9716, 12791, 579, 751, 958, 630, 9050, 1052, 825, 9193, 1026, - 14553, 9834, 10542, 1699, 1792, 1781, 3783, 3052 -}; - -/* supported WAVE file header (16-bit stereo samples @44.1kHz) */ -static const unsigned char waveHeader[32] = -{ - 0x57,0x41,0x56,0x45,0x66,0x6d,0x74,0x20,0x10,0x00,0x00,0x00,0x01,0x00,0x02,0x00, - 0x44,0xac,0x00,0x00,0x10,0xb1,0x02,0x00,0x04,0x00,0x10,0x00,0x64,0x61,0x74,0x61 -}; - -static blip_t* blip[2]; - -typedef struct -{ - toc_t toc; -} frontendcd_t; - -int cdd_load(const char *key, char *header) -{ - frontendcd_t fecd; - char data[2048]; - int startoffs; - - - int bytes = sizeof(frontendcd_t); - if (load_archive(key, (unsigned char *)&fecd, bytes, NULL) != bytes) - return 0; - - // look for valid header - cdd_readcallback(0, data, 0); - if (memcmp("SEGADISCSYSTEM", data, 14) == 0) - startoffs = 0; - else if (memcmp("SEGADISCSYSTEM", data + 16, 14) == 0) - startoffs = 16; - else - return 0; - // copy security block - memcpy(header, data + startoffs, 0x210); - - // copy disk information - memcpy(&cdd.toc, &fecd.toc, sizeof(toc_t)); - - cdd.loaded = 1; - return 1; -} - -void cdd_init(blip_t* left, blip_t* right) -{ - /* CD-DA is running by default at 44100 Hz */ - /* Audio stream is resampled to desired rate using Blip Buffer */ - blip[0] = left; - blip[1] = right; - blip_set_rates(left, 44100, snd.sample_rate); - blip_set_rates(right, 44100, snd.sample_rate); -} - -void cdd_reset(void) -{ - /* reset cycle counter */ - cdd.cycles = 0; - - /* reset drive access latency */ - cdd.latency = 0; - - /* reset track index */ - cdd.index = 0; - - /* reset logical block address */ - cdd.lba = 0; - - // reset audio subblock position - cdd.sampleOffset = 0; - - // reset audio read position - cdd.sampleLba = 0; - - /* reset status */ - cdd.status = cdd.loaded ? CD_STOP : NO_DISC; - - /* reset CD-DA fader (full volume) */ - cdd.volume = 0x400; - - /* clear CD-DA output */ - cdd.audio[0] = cdd.audio[1] = 0; -} - -void cdd_unload(void) -{ - cdd.loaded = 0; - cdd_readcallback = NULL; - - /* reset TOC */ - memset(&cdd.toc, 0x00, sizeof(cdd.toc)); -} - -void cdd_read_data(uint8 *dst) -{ - /* only read DATA track sectors */ - if ((cdd.lba >= 0) && (cdd.lba < cdd.toc.tracks[0].end)) - { - cdd_readcallback(cdd.lba, dst, 0); - } -} - -void cdd_read_audio(unsigned int samples) -{ - // previous audio outputs // - int16 l = cdd.audio[0]; - int16 r = cdd.audio[1]; - - // get number of internal clocks (samples) needed // - samples = blip_clocks_needed(blip[0], samples); - - // audio track playing ? // - if (!scd.regs[0x36>>1].byte.h) - { - int i, mul, delta; - - // current CD-DA fader volume // - int curVol = cdd.volume; - - // CD-DA fader volume setup (0-1024) // - int endVol = scd.regs[0x34>>1].w >> 4; - - // read samples from current block // - { -#ifdef LSB_FIRST - int16 *ptr = (int16 *) (cdc.ram); -#else - uint8 *ptr = cdc.ram; -#endif - { - char scratch[2352]; - // copy the end of current sector - int nsampreq = samples; - unsigned char *dest = cdc.ram; - cdd_readcallback(cdd.sampleLba, scratch, 1); - memcpy(cdc.ram, scratch + cdd.sampleOffset * 4, 2352 - cdd.sampleOffset * 4); - cdd.sampleLba++; - nsampreq -= 588 - cdd.sampleOffset; - dest += 2352 - cdd.sampleOffset * 4; - cdd.sampleOffset = 0; - // fill full sectors - while (nsampreq >= 588) - { - cdd_readcallback(cdd.sampleLba, scratch, 1); - memcpy(dest, scratch, 2352); - cdd.sampleLba++; - nsampreq -= 588; - dest += 2352; - } - // do last partial sector - if (nsampreq > 0) - { - cdd_readcallback(cdd.sampleLba, scratch, 1); - memcpy(dest, scratch, nsampreq * 4); - cdd.sampleOffset = nsampreq; - dest += nsampreq * 4; - nsampreq = 0; - } - //printf("samples: %i\n", samples); - //memset(cdc.ram, 0, samples * 4); - //fread(cdc.ram, 1, samples * 4, cdd.toc.tracks[cdd.index].fd); - } - - // process 16-bit (little-endian) stereo samples // - for (i=0; i endVol) - { - // fade-out // - curVol--; - } - else if (!curVol) - { - // audio will remain muted until next setup // - break; - } - } - } - - // save current CD-DA fader volume // - cdd.volume = curVol; - - // save last audio output for next frame // - cdd.audio[0] = l; - cdd.audio[1] = r; - } - else - { - // no audio output // - if (l) blip_add_delta_fast(blip[0], 0, -l); - if (r) blip_add_delta_fast(blip[1], 0, -r); - - // save audio output for next frame // - cdd.audio[0] = 0; - cdd.audio[1] = 0; - } - - // end of Blip Buffer timeframe // - blip_end_frame(blip[0], samples); - blip_end_frame(blip[1], samples); -} - - -void cdd_update(void) -{ -#ifdef LOG_CDD - error("LBA = %d (track n°%d)(latency=%d)\n", cdd.lba, cdd.index, cdd.latency); -#endif - - /* seeking disc */ - if (cdd.status == CD_SEEK) - { - /* drive latency */ - if (cdd.latency > 0) - { - cdd.latency--; - return; - } - - /* drive is ready */ - cdd.status = CD_READY; - } - - /* reading disc */ - else if (cdd.status == CD_PLAY) - { - /* drive latency */ - if (cdd.latency > 0) - { - cdd.latency--; - return; - } - - /* track type */ - if (!cdd.index) - { - /* DATA sector header (CD-ROM Mode 1) */ - uint8 header[4]; - uint32 msf = cdd.lba + 150; - header[0] = lut_BCD_8[(msf / 75) / 60]; - header[1] = lut_BCD_8[(msf / 75) % 60]; - header[2] = lut_BCD_8[(msf % 75)]; - header[3] = 0x01; - - /* data track sector read is controlled by CDC */ - cdd.lba += cdc_decoder_update(*(uint32 *)(header)); - } - else if (cdd.index < cdd.toc.last) - { - /* check against audio track start index */ - if (cdd.lba >= cdd.toc.tracks[cdd.index].start) - { - /* audio track playing */ - // if it wasn't before, set the audio start position - if (scd.regs[0x36>>1].byte.h) - { - cdd.sampleLba = cdd.lba + 1; - cdd.sampleOffset = 0; - } - scd.regs[0x36>>1].byte.h = 0x00; - } - - /* audio blocks are still sent to CDC as well as CD DAC/Fader */ - cdc_decoder_update(0); - - /* next audio block is automatically read */ - cdd.lba++; - } - else - { - /* end of disc */ - cdd.status = CD_END; - return; - } - - /* check end of current track */ - if (cdd.lba >= cdd.toc.tracks[cdd.index].end) - { - /* play next track */ - cdd.index++; - - /* PAUSE between tracks */ - scd.regs[0x36>>1].byte.h = 0x01; - } - } - - /* scanning disc */ - else if (cdd.status == CD_SCAN) - { - /* fast-forward or fast-rewind */ - cdd.lba += cdd.scanOffset; - cdd.sampleLba += cdd.scanOffset; - - /* check current track limits */ - if (cdd.lba >= cdd.toc.tracks[cdd.index].end) - { - /* next track */ - cdd.index++; - - /* skip directly to track start position */ - cdd.lba = cdd.toc.tracks[cdd.index].start; - - /* AUDIO track playing ? */ - if (cdd.status == CD_PLAY) - { - scd.regs[0x36>>1].byte.h = 0x00; - // set audio start point - cdd.sampleLba = cdd.lba; - cdd.sampleOffset = 0; - } - } - else if (cdd.lba < cdd.toc.tracks[cdd.index].start) - { - /* previous track */ - cdd.index--; - - /* skip directly to track end position */ - cdd.lba = cdd.toc.tracks[cdd.index].end; - } - - /* check disc limits */ - if (cdd.index < 0) - { - cdd.index = 0; - cdd.lba = 0; - } - else if (cdd.index >= cdd.toc.last) - { - /* no AUDIO track playing */ - scd.regs[0x36>>1].byte.h = 0x01; - - /* end of disc */ - cdd.index = cdd.toc.last; - cdd.lba = cdd.toc.end; - cdd.status = CD_END; - return; - } - } -} - -void cdd_process(void) -{ - /* Process CDD command */ - switch (scd.regs[0x42>>1].byte.h & 0x0f) - { - case 0x00: /* Drive Status */ - { - /* RS1-RS8 normally unchanged */ - scd.regs[0x38>>1].byte.h = cdd.status; - - /* unless RS1 indicated invalid track infos */ - if (scd.regs[0x38>>1].byte.l == 0x0f) - { - /* and SEEK has ended */ - if (cdd.status != CD_SEEK) - { - /* then return valid track infos, e.g current track number in RS2-RS3 (fixes Lunar - The Silver Star) */ - scd.regs[0x38>>1].byte.l = 0x02; - scd.regs[0x3a>>1].w = (cdd.index < cdd.toc.last) ? lut_BCD_16[cdd.index + 1] : 0x0A0A; - } - } - break; - } - - case 0x01: /* Stop Drive */ - { - /* update status */ - cdd.status = cdd.loaded ? CD_STOP : NO_DISC; - - /* no audio track playing */ - scd.regs[0x36>>1].byte.h = 0x01; - - /* RS1-RS8 ignored, expects 0x0 ("no disc" ?) in RS0 once */ - scd.regs[0x38>>1].w = 0x0000; - scd.regs[0x3a>>1].w = 0x0000; - scd.regs[0x3c>>1].w = 0x0000; - scd.regs[0x3e>>1].w = 0x0000; - scd.regs[0x40>>1].w = 0x000f; - return; - } - - case 0x02: /* Read TOC */ - { - /* Infos automatically retrieved by CDD processor from Q-Channel */ - /* commands 0x00-0x02 (current block) and 0x03-0x05 (Lead-In) */ - switch (scd.regs[0x44>>1].byte.l) - { - case 0x00: /* Current Absolute Time (MM:SS:FF) */ - { - int lba = cdd.lba + 150; - scd.regs[0x38>>1].w = cdd.status << 8; - scd.regs[0x3a>>1].w = lut_BCD_16[(lba/75)/60]; - scd.regs[0x3c>>1].w = lut_BCD_16[(lba/75)%60]; - scd.regs[0x3e>>1].w = lut_BCD_16[(lba%75)]; - scd.regs[0x40>>1].byte.h = cdd.index ? 0x00 : 0x04; /* Current block flags in RS8 (bit0 = mute status, bit1: pre-emphasis status, bit2: track type) */ - break; - } - - case 0x01: /* Current Track Relative Time (MM:SS:FF) */ - { - int lba = cdd.lba - cdd.toc.tracks[cdd.index].start; - scd.regs[0x38>>1].w = (cdd.status << 8) | 0x01; - scd.regs[0x3a>>1].w = lut_BCD_16[(lba/75)/60]; - scd.regs[0x3c>>1].w = lut_BCD_16[(lba/75)%60]; - scd.regs[0x3e>>1].w = lut_BCD_16[(lba%75)]; - scd.regs[0x40>>1].byte.h = cdd.index ? 0x00 : 0x04; /* Current block flags in RS8 (bit0 = mute status, bit1: pre-emphasis status, bit2: track type) */ - break; - } - - case 0x02: /* Current Track Number */ - { - scd.regs[0x38>>1].w = (cdd.status << 8) | 0x02; - scd.regs[0x3a>>1].w = (cdd.index < cdd.toc.last) ? lut_BCD_16[cdd.index + 1] : 0x0A0A; - scd.regs[0x3c>>1].w = 0x0000; - scd.regs[0x3e>>1].w = 0x0000; /* Disk Control Code (?) in RS6 */ - scd.regs[0x40>>1].byte.h = 0x00; - break; - } - - case 0x03: /* Total length (MM:SS:FF) */ - { - int lba = cdd.toc.end + 150; - scd.regs[0x38>>1].w = (cdd.status << 8) | 0x03; - scd.regs[0x3a>>1].w = lut_BCD_16[(lba/75)/60]; - scd.regs[0x3c>>1].w = lut_BCD_16[(lba/75)%60]; - scd.regs[0x3e>>1].w = lut_BCD_16[(lba%75)]; - scd.regs[0x40>>1].byte.h = 0x00; - break; - } - - case 0x04: /* First & Last Track Numbers */ - { - scd.regs[0x38>>1].w = (cdd.status << 8) | 0x04; - scd.regs[0x3a>>1].w = 0x0001; - scd.regs[0x3c>>1].w = lut_BCD_16[cdd.toc.last]; - scd.regs[0x3e>>1].w = 0x0000; /* Drive Version (?) in RS6-RS7 */ - scd.regs[0x40>>1].byte.h = 0x00; /* Lead-In flags in RS8 (bit0 = mute status, bit1: pre-emphasis status, bit2: track type) */ - break; - } - - case 0x05: /* Track Start Time (MM:SS:FF) */ - { - int track = scd.regs[0x46>>1].byte.h * 10 + scd.regs[0x46>>1].byte.l; - int lba = cdd.toc.tracks[track-1].start + 150; - scd.regs[0x38>>1].w = (cdd.status << 8) | 0x05; - scd.regs[0x3a>>1].w = lut_BCD_16[(lba/75)/60]; - scd.regs[0x3c>>1].w = lut_BCD_16[(lba/75)%60]; - scd.regs[0x3e>>1].w = lut_BCD_16[(lba%75)]; - scd.regs[0x40>>1].byte.h = track % 10; /* Track Number (low digit) */ - if (track == 1) - { - /* RS6 bit 3 is set for the first (DATA) track */ - scd.regs[0x3e>>1].byte.h |= 0x08; - } - break; - } - - default: - { -#ifdef LOG_ERROR - error("Unknown CDD Command %02X (%X)\n", scd.regs[0x44>>1].byte.l, s68k.pc); -#endif - return; - } - } - break; - } - - case 0x03: /* Play */ - { - /* reset track index */ - int index = 0; - - /* new LBA position */ - int lba = ((scd.regs[0x44>>1].byte.h * 10 + scd.regs[0x44>>1].byte.l) * 60 + - (scd.regs[0x46>>1].byte.h * 10 + scd.regs[0x46>>1].byte.l)) * 75 + - (scd.regs[0x48>>1].byte.h * 10 + scd.regs[0x48>>1].byte.l) - 150; - - /* CD drive latency */ - if (!cdd.latency) - { - /* Fixes a few games hanging during intro because they expect data to be read with some delay */ - /* Radical Rex needs at least one interrupt delay */ - /* Wolf Team games (Anet Futatabi, Cobra Command, Road Avenger & Time Gal) need at least 6 interrupts delay */ - /* Space Adventure Cobra (2nd morgue scene) needs at least 13 interrupts delay (incl. seek time, so 6 is OK) */ - /* Jeopardy & ESPN Sunday Night NFL are picky about this as well: 10 interrupts delay (+ seek time) seems OK */ - cdd.latency = 10; - } - - /* CD drive seek time */ - /* max. seek time = 1.5 s = 1.5 x 75 = 112.5 CDD interrupts (rounded to 120) for 270000 sectors max on disc. */ - /* Note: This is only a rough approximation since, on real hardware, seek time is much likely not linear and */ - /* latency much larger than above value, but this model works fine for Sonic CD (track 26 playback needs to */ - /* be enough delayed to start in sync with intro sequence, as compared with real hardware recording). */ - if (lba > cdd.lba) - { - cdd.latency += (((lba - cdd.lba) * 120) / 270000); - } - else - { - cdd.latency += (((cdd.lba - lba) * 120) / 270000); - } - - /* update current LBA */ - cdd.lba = lba; - - /* get track index */ - while ((cdd.toc.tracks[index].end <= lba) && (index < cdd.toc.last)) index++; - - /* update current track index */ - cdd.index = index; - - /* no audio track playing (yet) */ - scd.regs[0x36>>1].byte.h = 0x01; - - /* update status */ - cdd.status = CD_PLAY; - - /* return track index in RS2-RS3 */ - scd.regs[0x38>>1].w = (CD_PLAY << 8) | 0x02; - scd.regs[0x3a>>1].w = (cdd.index < cdd.toc.last) ? lut_BCD_16[index + 1] : 0x0A0A; - scd.regs[0x3c>>1].w = 0x0000; - scd.regs[0x3e>>1].w = 0x0000; - scd.regs[0x40>>1].byte.h = 0x00; - break; - } - - case 0x04: /* Seek */ - { - /* reset track index */ - int index = 0; - - /* new LBA position */ - int lba = ((scd.regs[0x44>>1].byte.h * 10 + scd.regs[0x44>>1].byte.l) * 60 + - (scd.regs[0x46>>1].byte.h * 10 + scd.regs[0x46>>1].byte.l)) * 75 + - (scd.regs[0x48>>1].byte.h * 10 + scd.regs[0x48>>1].byte.l) - 150; - - /* CD drive seek time */ - /* We are using similar linear model as above, although still not exactly accurate, */ - /* it works fine for Switch/Panic! intro (Switch needs at least 30 interrupts while */ - /* seeking from 00:05:63 to 24:03:19, Panic! when seeking from 00:05:60 to 24:06:07) */ - if (lba > cdd.lba) - { - cdd.latency = ((lba - cdd.lba) * 120) / 270000; - } - else - { - cdd.latency = ((cdd.lba - lba) * 120) / 270000; - } - - /* update current LBA */ - cdd.lba = lba; - - /* get current track index */ - while ((cdd.toc.tracks[index].end <= lba) && (index < cdd.toc.last)) index++; - - /* update current track index */ - cdd.index = index; - - /* no audio track playing */ - scd.regs[0x36>>1].byte.h = 0x01; - - /* update status */ - cdd.status = CD_SEEK; - - /* unknown RS1-RS8 values (returning 0xF in RS1 invalidates track infos in RS2-RS8 and fixes Final Fight CD intro when seek time is emulated) */ - scd.regs[0x38>>1].w = (CD_SEEK << 8) | 0x0f; - scd.regs[0x3a>>1].w = 0x0000; - scd.regs[0x3c>>1].w = 0x0000; - scd.regs[0x3e>>1].w = 0x0000; - scd.regs[0x40>>1].w = ~(CD_SEEK + 0xf) & 0x0f; - return; - } - - case 0x06: /* Pause */ - { - /* no audio track playing */ - scd.regs[0x36>>1].byte.h = 0x01; - - /* update status (RS1-RS8 unchanged) */ - cdd.status = scd.regs[0x38>>1].byte.h = CD_READY; - break; - } - - case 0x07: /* Resume */ - { - /* update status (RS1-RS8 unchanged) */ - cdd.status = scd.regs[0x38>>1].byte.h = CD_PLAY; - break; - } - - case 0x08: /* Forward Scan */ - { - /* reset scanning direction / speed */ - cdd.scanOffset = CD_SCAN_SPEED; - - /* update status (RS1-RS8 unchanged) */ - cdd.status = scd.regs[0x38>>1].byte.h = CD_SCAN; - break; - } - - case 0x09: /* Rewind Scan */ - { - /* reset scanning direction / speed */ - cdd.scanOffset = -CD_SCAN_SPEED; - - /* update status (RS1-RS8 unchanged) */ - cdd.status = scd.regs[0x38>>1].byte.h = CD_SCAN; - break; - } - - - case 0x0a: /* N-Track Jump Control ? (usually sent before CD_SEEK or CD_PLAY commands) */ - { - /* TC3 corresponds to seek direction (00=forward, FF=reverse) */ - /* TC4-TC7 are related to seek length (4x4 bits i.e parameter values are between -65535 and +65535) */ - /* Maybe related to number of auto-sequenced track jumps/moves for CD DSP (cf. CXD2500BQ datasheet) */ - /* also see US Patent nr. 5222054 for a detailled description of seeking operation using Track Jump */ - - /* no audio track playing */ - scd.regs[0x36>>1].byte.h = 0x01; - - /* update status (RS1-RS8 unchanged) */ - cdd.status = scd.regs[0x38>>1].byte.h = CD_READY; - break; - } - - case 0x0c: /* Close Tray */ - { - /* no audio track playing */ - scd.regs[0x36>>1].byte.h = 0x01; - - /* update status */ - cdd.status = cdd.loaded ? CD_STOP : NO_DISC; - - /* RS1-RS8 ignored, expects 0x0 ("no disc" ?) in RS0 once */ - scd.regs[0x38>>1].w = 0x0000; - scd.regs[0x3a>>1].w = 0x0000; - scd.regs[0x3c>>1].w = 0x0000; - scd.regs[0x3e>>1].w = 0x0000; - scd.regs[0x40>>1].w = 0x000f; - -#ifdef CD_TRAY_CALLBACK - CD_TRAY_CALLBACK -#endif - return; - } - - case 0x0d: /* Open Tray */ - { - /* no audio track playing */ - scd.regs[0x36>>1].byte.h = 0x01; - - /* update status (RS1-RS8 ignored) */ - cdd.status = CD_OPEN; - scd.regs[0x38>>1].w = CD_OPEN << 8; - scd.regs[0x3a>>1].w = 0x0000; - scd.regs[0x3c>>1].w = 0x0000; - scd.regs[0x3e>>1].w = 0x0000; - scd.regs[0x40>>1].w = ~CD_OPEN & 0x0f; - -#ifdef CD_TRAY_CALLBACK - CD_TRAY_CALLBACK -#endif - return; - } - - default: /* Unknown command */ -#ifdef LOG_CDD - error("Unknown CDD Command !!!\n"); -#endif - scd.regs[0x38>>1].byte.h = cdd.status; - break; - } - - /* only compute checksum when necessary */ - scd.regs[0x40>>1].byte.l = ~(scd.regs[0x38>>1].byte.h + scd.regs[0x38>>1].byte.l + - scd.regs[0x3a>>1].byte.h + scd.regs[0x3a>>1].byte.l + - scd.regs[0x3c>>1].byte.h + scd.regs[0x3c>>1].byte.l + - scd.regs[0x3e>>1].byte.h + scd.regs[0x3e>>1].byte.l + - scd.regs[0x40>>1].byte.h) & 0x0f; -} +/*************************************************************************************** + * Genesis Plus + * CD drive processor & CD-DA fader + * + * Copyright (C) 2012-2013 Eke-Eke (Genesis Plus GX) + * + * Redistribution and use of this code or any derivative works are permitted + * provided that the following conditions are met: + * + * - Redistributions may not be sold, nor may they be used in a commercial + * product or activity. + * + * - Redistributions that are modified from the original source must include the + * complete source code, including the source code for all components used by a + * binary built from the modified sources. However, as a special exception, the + * source code distributed need not include anything that is normally distributed + * (in either source or binary form) with the major components (compiler, kernel, + * and so on) of the operating system on which the executable runs, unless that + * component itself accompanies the executable. + * + * - Redistributions must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************************/ +#include "shared.h" +#include "../cinterface/callbacks.h" + +/* BCD conversion lookup tables */ +static const uint8 lut_BCD_8[100] = +{ + 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, + 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, + 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, + 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, + 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, + 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, + 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, + 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, + 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, +}; + +static const uint16 lut_BCD_16[100] = +{ + 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, + 0x0100, 0x0101, 0x0102, 0x0103, 0x0104, 0x0105, 0x0106, 0x0107, 0x0108, 0x0109, + 0x0200, 0x0201, 0x0202, 0x0203, 0x0204, 0x0205, 0x0206, 0x0207, 0x0208, 0x0209, + 0x0300, 0x0301, 0x0302, 0x0303, 0x0304, 0x0305, 0x0306, 0x0307, 0x0308, 0x0309, + 0x0400, 0x0401, 0x0402, 0x0403, 0x0404, 0x0405, 0x0406, 0x0407, 0x0408, 0x0409, + 0x0500, 0x0501, 0x0502, 0x0503, 0x0504, 0x0505, 0x0506, 0x0507, 0x0508, 0x0509, + 0x0600, 0x0601, 0x0602, 0x0603, 0x0604, 0x0605, 0x0606, 0x0607, 0x0608, 0x0609, + 0x0700, 0x0701, 0x0702, 0x0703, 0x0704, 0x0705, 0x0706, 0x0707, 0x0708, 0x0709, + 0x0800, 0x0801, 0x0802, 0x0803, 0x0804, 0x0805, 0x0806, 0x0807, 0x0808, 0x0809, + 0x0900, 0x0901, 0x0902, 0x0903, 0x0904, 0x0905, 0x0906, 0x0907, 0x0908, 0x0909, +}; + +/* pre-build TOC */ +static const uint16 toc_snatcher[21] = +{ + 56014, 495, 10120, 20555, 1580, 5417, 12502, 16090, 6553, 9681, + 8148, 20228, 8622, 6142, 5858, 1287, 7424, 3535, 31697, 2485, + 31380 +}; + +static const uint16 toc_lunar[52] = +{ + 5422, 1057, 7932, 5401, 6380, 6592, 5862, 5937, 5478, 5870, + 6673, 6613, 6429, 4996, 4977, 5657, 3720, 5892, 3140, 3263, + 6351, 5187, 3249, 1464, 1596, 1750, 1751, 6599, 4578, 5205, + 1550, 1827, 2328, 1346, 1569, 1613, 7199, 4928, 1656, 2549, + 1875, 3901, 1850, 2399, 2028, 1724, 4889, 14551, 1184, 2132, + 685, 3167 +}; + +static const uint32 toc_shadow[15] = +{ + 10226, 70054, 11100, 12532, 12444, 11923, 10059, 10167, 10138, 13792, + 11637, 2547, 2521, 3856, 900 +}; + +static const uint32 toc_dungeon[13] = +{ + 2250, 22950, 16350, 24900, 13875, 19950, 13800, 15375, 17400, 17100, + 3325, 6825, 25275 +}; + +static const uint32 toc_ffight[26] = +{ + 11994, 9742, 10136, 9685, 9553, 14588, 9430, 8721, 9975, 9764, + 9704, 12796, 585, 754, 951, 624, 9047, 1068, 817, 9191, 1024, + 14562, 10320, 8627, 3795, 3047 +}; + +static const uint32 toc_ffightj[29] = +{ + 11994, 9752, 10119, 9690, 9567, 14575, 9431, 8731, 9965, 9763, + 9716, 12791, 579, 751, 958, 630, 9050, 1052, 825, 9193, 1026, + 14553, 9834, 10542, 1699, 1792, 1781, 3783, 3052 +}; + +/* supported WAVE file header (16-bit stereo samples @44.1kHz) */ +static const unsigned char waveHeader[32] = +{ + 0x57,0x41,0x56,0x45,0x66,0x6d,0x74,0x20,0x10,0x00,0x00,0x00,0x01,0x00,0x02,0x00, + 0x44,0xac,0x00,0x00,0x10,0xb1,0x02,0x00,0x04,0x00,0x10,0x00,0x64,0x61,0x74,0x61 +}; + +static blip_t* blip[2]; + +typedef struct +{ + toc_t toc; +} frontendcd_t; + +int cdd_load(const char *key, char *header) +{ + frontendcd_t fecd; + char data[2048]; + int startoffs; + + + int bytes = sizeof(frontendcd_t); + if (load_archive(key, (unsigned char *)&fecd, bytes, NULL) != bytes) + return 0; + + // look for valid header + cdd_readcallback(0, data, 0); + if (memcmp("SEGADISCSYSTEM", data, 14) == 0) + startoffs = 0; + else if (memcmp("SEGADISCSYSTEM", data + 16, 14) == 0) + startoffs = 16; + else + return 0; + // copy security block + memcpy(header, data + startoffs, 0x210); + + // copy disk information + memcpy(&cdd.toc, &fecd.toc, sizeof(toc_t)); + + cdd.loaded = 1; + return 1; +} + +void cdd_init(blip_t* left, blip_t* right) +{ + /* CD-DA is running by default at 44100 Hz */ + /* Audio stream is resampled to desired rate using Blip Buffer */ + blip[0] = left; + blip[1] = right; + blip_set_rates(left, 44100, snd.sample_rate); + blip_set_rates(right, 44100, snd.sample_rate); +} + +void cdd_reset(void) +{ + /* reset cycle counter */ + cdd.cycles = 0; + + /* reset drive access latency */ + cdd.latency = 0; + + /* reset track index */ + cdd.index = 0; + + /* reset logical block address */ + cdd.lba = 0; + + // reset audio subblock position + cdd.sampleOffset = 0; + + // reset audio read position + cdd.sampleLba = 0; + + /* reset status */ + cdd.status = cdd.loaded ? CD_STOP : NO_DISC; + + /* reset CD-DA fader (full volume) */ + cdd.volume = 0x400; + + /* clear CD-DA output */ + cdd.audio[0] = cdd.audio[1] = 0; +} + +void cdd_unload(void) +{ + cdd.loaded = 0; + cdd_readcallback = NULL; + + /* reset TOC */ + memset(&cdd.toc, 0x00, sizeof(cdd.toc)); +} + +void cdd_hotswap(const toc_t *toc) +{ + if (toc) + { + cdd.loaded = 1; + memcpy(&cdd.toc, &toc, sizeof(cdd.toc)); + } + else + { + cdd.loaded = 0; + memset(&cdd.toc, 0x00, sizeof(cdd.toc)); + } + cdd_reset(); +} + +void cdd_read_data(uint8 *dst) +{ + /* only read DATA track sectors */ + if ((cdd.lba >= 0) && (cdd.lba < cdd.toc.tracks[0].end)) + { + cdd_readcallback(cdd.lba, dst, 0); + } +} + +void cdd_read_audio(unsigned int samples) +{ + // previous audio outputs // + int16 l = cdd.audio[0]; + int16 r = cdd.audio[1]; + + // get number of internal clocks (samples) needed // + samples = blip_clocks_needed(blip[0], samples); + + // audio track playing ? // + if (!scd.regs[0x36>>1].byte.h) + { + int i, mul, delta; + + // current CD-DA fader volume // + int curVol = cdd.volume; + + // CD-DA fader volume setup (0-1024) // + int endVol = scd.regs[0x34>>1].w >> 4; + + // read samples from current block // + { +#ifdef LSB_FIRST + int16 *ptr = (int16 *) (cdc.ram); +#else + uint8 *ptr = cdc.ram; +#endif + { + char scratch[2352]; + // copy the end of current sector + int nsampreq = samples; + unsigned char *dest = cdc.ram; + cdd_readcallback(cdd.sampleLba, scratch, 1); + memcpy(cdc.ram, scratch + cdd.sampleOffset * 4, 2352 - cdd.sampleOffset * 4); + cdd.sampleLba++; + nsampreq -= 588 - cdd.sampleOffset; + dest += 2352 - cdd.sampleOffset * 4; + cdd.sampleOffset = 0; + // fill full sectors + while (nsampreq >= 588) + { + cdd_readcallback(cdd.sampleLba, scratch, 1); + memcpy(dest, scratch, 2352); + cdd.sampleLba++; + nsampreq -= 588; + dest += 2352; + } + // do last partial sector + if (nsampreq > 0) + { + cdd_readcallback(cdd.sampleLba, scratch, 1); + memcpy(dest, scratch, nsampreq * 4); + cdd.sampleOffset = nsampreq; + dest += nsampreq * 4; + nsampreq = 0; + } + //printf("samples: %i\n", samples); + //memset(cdc.ram, 0, samples * 4); + //fread(cdc.ram, 1, samples * 4, cdd.toc.tracks[cdd.index].fd); + } + + // process 16-bit (little-endian) stereo samples // + for (i=0; i endVol) + { + // fade-out // + curVol--; + } + else if (!curVol) + { + // audio will remain muted until next setup // + break; + } + } + } + + // save current CD-DA fader volume // + cdd.volume = curVol; + + // save last audio output for next frame // + cdd.audio[0] = l; + cdd.audio[1] = r; + } + else + { + // no audio output // + if (l) blip_add_delta_fast(blip[0], 0, -l); + if (r) blip_add_delta_fast(blip[1], 0, -r); + + // save audio output for next frame // + cdd.audio[0] = 0; + cdd.audio[1] = 0; + } + + // end of Blip Buffer timeframe // + blip_end_frame(blip[0], samples); + blip_end_frame(blip[1], samples); +} + + +void cdd_update(void) +{ +#ifdef LOG_CDD + error("LBA = %d (track n�%d)(latency=%d)\n", cdd.lba, cdd.index, cdd.latency); +#endif + + /* seeking disc */ + if (cdd.status == CD_SEEK) + { + /* drive latency */ + if (cdd.latency > 0) + { + cdd.latency--; + return; + } + + /* drive is ready */ + cdd.status = CD_READY; + } + + /* reading disc */ + else if (cdd.status == CD_PLAY) + { + /* drive latency */ + if (cdd.latency > 0) + { + cdd.latency--; + return; + } + + /* track type */ + if (!cdd.index) + { + /* DATA sector header (CD-ROM Mode 1) */ + uint8 header[4]; + uint32 msf = cdd.lba + 150; + header[0] = lut_BCD_8[(msf / 75) / 60]; + header[1] = lut_BCD_8[(msf / 75) % 60]; + header[2] = lut_BCD_8[(msf % 75)]; + header[3] = 0x01; + + /* data track sector read is controlled by CDC */ + cdd.lba += cdc_decoder_update(*(uint32 *)(header)); + } + else if (cdd.index < cdd.toc.last) + { + /* check against audio track start index */ + if (cdd.lba >= cdd.toc.tracks[cdd.index].start) + { + /* audio track playing */ + // if it wasn't before, set the audio start position + if (scd.regs[0x36>>1].byte.h) + { + cdd.sampleLba = cdd.lba + 1; + cdd.sampleOffset = 0; + } + scd.regs[0x36>>1].byte.h = 0x00; + } + + /* audio blocks are still sent to CDC as well as CD DAC/Fader */ + cdc_decoder_update(0); + + /* next audio block is automatically read */ + cdd.lba++; + } + else + { + /* end of disc */ + cdd.status = CD_END; + return; + } + + /* check end of current track */ + if (cdd.lba >= cdd.toc.tracks[cdd.index].end) + { + /* play next track */ + cdd.index++; + + /* PAUSE between tracks */ + scd.regs[0x36>>1].byte.h = 0x01; + } + } + + /* scanning disc */ + else if (cdd.status == CD_SCAN) + { + /* fast-forward or fast-rewind */ + cdd.lba += cdd.scanOffset; + cdd.sampleLba += cdd.scanOffset; + + /* check current track limits */ + if (cdd.lba >= cdd.toc.tracks[cdd.index].end) + { + /* next track */ + cdd.index++; + + /* skip directly to track start position */ + cdd.lba = cdd.toc.tracks[cdd.index].start; + + /* AUDIO track playing ? */ + if (cdd.status == CD_PLAY) + { + scd.regs[0x36>>1].byte.h = 0x00; + // set audio start point + cdd.sampleLba = cdd.lba; + cdd.sampleOffset = 0; + } + } + else if (cdd.lba < cdd.toc.tracks[cdd.index].start) + { + /* previous track */ + cdd.index--; + + /* skip directly to track end position */ + cdd.lba = cdd.toc.tracks[cdd.index].end; + } + + /* check disc limits */ + if (cdd.index < 0) + { + cdd.index = 0; + cdd.lba = 0; + } + else if (cdd.index >= cdd.toc.last) + { + /* no AUDIO track playing */ + scd.regs[0x36>>1].byte.h = 0x01; + + /* end of disc */ + cdd.index = cdd.toc.last; + cdd.lba = cdd.toc.end; + cdd.status = CD_END; + return; + } + } +} + +void cdd_process(void) +{ + /* Process CDD command */ + switch (scd.regs[0x42>>1].byte.h & 0x0f) + { + case 0x00: /* Drive Status */ + { + /* RS1-RS8 normally unchanged */ + scd.regs[0x38>>1].byte.h = cdd.status; + + /* unless RS1 indicated invalid track infos */ + if (scd.regs[0x38>>1].byte.l == 0x0f) + { + /* and SEEK has ended */ + if (cdd.status != CD_SEEK) + { + /* then return valid track infos, e.g current track number in RS2-RS3 (fixes Lunar - The Silver Star) */ + scd.regs[0x38>>1].byte.l = 0x02; + scd.regs[0x3a>>1].w = (cdd.index < cdd.toc.last) ? lut_BCD_16[cdd.index + 1] : 0x0A0A; + } + } + break; + } + + case 0x01: /* Stop Drive */ + { + /* update status */ + cdd.status = cdd.loaded ? CD_STOP : NO_DISC; + + /* no audio track playing */ + scd.regs[0x36>>1].byte.h = 0x01; + + /* RS1-RS8 ignored, expects 0x0 ("no disc" ?) in RS0 once */ + scd.regs[0x38>>1].w = 0x0000; + scd.regs[0x3a>>1].w = 0x0000; + scd.regs[0x3c>>1].w = 0x0000; + scd.regs[0x3e>>1].w = 0x0000; + scd.regs[0x40>>1].w = 0x000f; + return; + } + + case 0x02: /* Read TOC */ + { + /* Infos automatically retrieved by CDD processor from Q-Channel */ + /* commands 0x00-0x02 (current block) and 0x03-0x05 (Lead-In) */ + switch (scd.regs[0x44>>1].byte.l) + { + case 0x00: /* Current Absolute Time (MM:SS:FF) */ + { + int lba = cdd.lba + 150; + scd.regs[0x38>>1].w = cdd.status << 8; + scd.regs[0x3a>>1].w = lut_BCD_16[(lba/75)/60]; + scd.regs[0x3c>>1].w = lut_BCD_16[(lba/75)%60]; + scd.regs[0x3e>>1].w = lut_BCD_16[(lba%75)]; + scd.regs[0x40>>1].byte.h = cdd.index ? 0x00 : 0x04; /* Current block flags in RS8 (bit0 = mute status, bit1: pre-emphasis status, bit2: track type) */ + break; + } + + case 0x01: /* Current Track Relative Time (MM:SS:FF) */ + { + int lba = cdd.lba - cdd.toc.tracks[cdd.index].start; + scd.regs[0x38>>1].w = (cdd.status << 8) | 0x01; + scd.regs[0x3a>>1].w = lut_BCD_16[(lba/75)/60]; + scd.regs[0x3c>>1].w = lut_BCD_16[(lba/75)%60]; + scd.regs[0x3e>>1].w = lut_BCD_16[(lba%75)]; + scd.regs[0x40>>1].byte.h = cdd.index ? 0x00 : 0x04; /* Current block flags in RS8 (bit0 = mute status, bit1: pre-emphasis status, bit2: track type) */ + break; + } + + case 0x02: /* Current Track Number */ + { + scd.regs[0x38>>1].w = (cdd.status << 8) | 0x02; + scd.regs[0x3a>>1].w = (cdd.index < cdd.toc.last) ? lut_BCD_16[cdd.index + 1] : 0x0A0A; + scd.regs[0x3c>>1].w = 0x0000; + scd.regs[0x3e>>1].w = 0x0000; /* Disk Control Code (?) in RS6 */ + scd.regs[0x40>>1].byte.h = 0x00; + break; + } + + case 0x03: /* Total length (MM:SS:FF) */ + { + int lba = cdd.toc.end + 150; + scd.regs[0x38>>1].w = (cdd.status << 8) | 0x03; + scd.regs[0x3a>>1].w = lut_BCD_16[(lba/75)/60]; + scd.regs[0x3c>>1].w = lut_BCD_16[(lba/75)%60]; + scd.regs[0x3e>>1].w = lut_BCD_16[(lba%75)]; + scd.regs[0x40>>1].byte.h = 0x00; + break; + } + + case 0x04: /* First & Last Track Numbers */ + { + scd.regs[0x38>>1].w = (cdd.status << 8) | 0x04; + scd.regs[0x3a>>1].w = 0x0001; + scd.regs[0x3c>>1].w = lut_BCD_16[cdd.toc.last]; + scd.regs[0x3e>>1].w = 0x0000; /* Drive Version (?) in RS6-RS7 */ + scd.regs[0x40>>1].byte.h = 0x00; /* Lead-In flags in RS8 (bit0 = mute status, bit1: pre-emphasis status, bit2: track type) */ + break; + } + + case 0x05: /* Track Start Time (MM:SS:FF) */ + { + int track = scd.regs[0x46>>1].byte.h * 10 + scd.regs[0x46>>1].byte.l; + int lba = cdd.toc.tracks[track-1].start + 150; + scd.regs[0x38>>1].w = (cdd.status << 8) | 0x05; + scd.regs[0x3a>>1].w = lut_BCD_16[(lba/75)/60]; + scd.regs[0x3c>>1].w = lut_BCD_16[(lba/75)%60]; + scd.regs[0x3e>>1].w = lut_BCD_16[(lba%75)]; + scd.regs[0x40>>1].byte.h = track % 10; /* Track Number (low digit) */ + if (track == 1) + { + /* RS6 bit 3 is set for the first (DATA) track */ + scd.regs[0x3e>>1].byte.h |= 0x08; + } + break; + } + + default: + { +#ifdef LOG_ERROR + error("Unknown CDD Command %02X (%X)\n", scd.regs[0x44>>1].byte.l, s68k.pc); +#endif + return; + } + } + break; + } + + case 0x03: /* Play */ + { + /* reset track index */ + int index = 0; + + /* new LBA position */ + int lba = ((scd.regs[0x44>>1].byte.h * 10 + scd.regs[0x44>>1].byte.l) * 60 + + (scd.regs[0x46>>1].byte.h * 10 + scd.regs[0x46>>1].byte.l)) * 75 + + (scd.regs[0x48>>1].byte.h * 10 + scd.regs[0x48>>1].byte.l) - 150; + + /* CD drive latency */ + if (!cdd.latency) + { + /* Fixes a few games hanging during intro because they expect data to be read with some delay */ + /* Radical Rex needs at least one interrupt delay */ + /* Wolf Team games (Anet Futatabi, Cobra Command, Road Avenger & Time Gal) need at least 6 interrupts delay */ + /* Space Adventure Cobra (2nd morgue scene) needs at least 13 interrupts delay (incl. seek time, so 6 is OK) */ + /* Jeopardy & ESPN Sunday Night NFL are picky about this as well: 10 interrupts delay (+ seek time) seems OK */ + cdd.latency = 10; + } + + /* CD drive seek time */ + /* max. seek time = 1.5 s = 1.5 x 75 = 112.5 CDD interrupts (rounded to 120) for 270000 sectors max on disc. */ + /* Note: This is only a rough approximation since, on real hardware, seek time is much likely not linear and */ + /* latency much larger than above value, but this model works fine for Sonic CD (track 26 playback needs to */ + /* be enough delayed to start in sync with intro sequence, as compared with real hardware recording). */ + if (lba > cdd.lba) + { + cdd.latency += (((lba - cdd.lba) * 120) / 270000); + } + else + { + cdd.latency += (((cdd.lba - lba) * 120) / 270000); + } + + /* update current LBA */ + cdd.lba = lba; + + /* get track index */ + while ((cdd.toc.tracks[index].end <= lba) && (index < cdd.toc.last)) index++; + + /* update current track index */ + cdd.index = index; + + /* no audio track playing (yet) */ + scd.regs[0x36>>1].byte.h = 0x01; + + /* update status */ + cdd.status = CD_PLAY; + + /* return track index in RS2-RS3 */ + scd.regs[0x38>>1].w = (CD_PLAY << 8) | 0x02; + scd.regs[0x3a>>1].w = (cdd.index < cdd.toc.last) ? lut_BCD_16[index + 1] : 0x0A0A; + scd.regs[0x3c>>1].w = 0x0000; + scd.regs[0x3e>>1].w = 0x0000; + scd.regs[0x40>>1].byte.h = 0x00; + break; + } + + case 0x04: /* Seek */ + { + /* reset track index */ + int index = 0; + + /* new LBA position */ + int lba = ((scd.regs[0x44>>1].byte.h * 10 + scd.regs[0x44>>1].byte.l) * 60 + + (scd.regs[0x46>>1].byte.h * 10 + scd.regs[0x46>>1].byte.l)) * 75 + + (scd.regs[0x48>>1].byte.h * 10 + scd.regs[0x48>>1].byte.l) - 150; + + /* CD drive seek time */ + /* We are using similar linear model as above, although still not exactly accurate, */ + /* it works fine for Switch/Panic! intro (Switch needs at least 30 interrupts while */ + /* seeking from 00:05:63 to 24:03:19, Panic! when seeking from 00:05:60 to 24:06:07) */ + if (lba > cdd.lba) + { + cdd.latency = ((lba - cdd.lba) * 120) / 270000; + } + else + { + cdd.latency = ((cdd.lba - lba) * 120) / 270000; + } + + /* update current LBA */ + cdd.lba = lba; + + /* get current track index */ + while ((cdd.toc.tracks[index].end <= lba) && (index < cdd.toc.last)) index++; + + /* update current track index */ + cdd.index = index; + + /* no audio track playing */ + scd.regs[0x36>>1].byte.h = 0x01; + + /* update status */ + cdd.status = CD_SEEK; + + /* unknown RS1-RS8 values (returning 0xF in RS1 invalidates track infos in RS2-RS8 and fixes Final Fight CD intro when seek time is emulated) */ + scd.regs[0x38>>1].w = (CD_SEEK << 8) | 0x0f; + scd.regs[0x3a>>1].w = 0x0000; + scd.regs[0x3c>>1].w = 0x0000; + scd.regs[0x3e>>1].w = 0x0000; + scd.regs[0x40>>1].w = ~(CD_SEEK + 0xf) & 0x0f; + return; + } + + case 0x06: /* Pause */ + { + /* no audio track playing */ + scd.regs[0x36>>1].byte.h = 0x01; + + /* update status (RS1-RS8 unchanged) */ + cdd.status = scd.regs[0x38>>1].byte.h = CD_READY; + break; + } + + case 0x07: /* Resume */ + { + /* update status (RS1-RS8 unchanged) */ + cdd.status = scd.regs[0x38>>1].byte.h = CD_PLAY; + break; + } + + case 0x08: /* Forward Scan */ + { + /* reset scanning direction / speed */ + cdd.scanOffset = CD_SCAN_SPEED; + + /* update status (RS1-RS8 unchanged) */ + cdd.status = scd.regs[0x38>>1].byte.h = CD_SCAN; + break; + } + + case 0x09: /* Rewind Scan */ + { + /* reset scanning direction / speed */ + cdd.scanOffset = -CD_SCAN_SPEED; + + /* update status (RS1-RS8 unchanged) */ + cdd.status = scd.regs[0x38>>1].byte.h = CD_SCAN; + break; + } + + + case 0x0a: /* N-Track Jump Control ? (usually sent before CD_SEEK or CD_PLAY commands) */ + { + /* TC3 corresponds to seek direction (00=forward, FF=reverse) */ + /* TC4-TC7 are related to seek length (4x4 bits i.e parameter values are between -65535 and +65535) */ + /* Maybe related to number of auto-sequenced track jumps/moves for CD DSP (cf. CXD2500BQ datasheet) */ + /* also see US Patent nr. 5222054 for a detailled description of seeking operation using Track Jump */ + + /* no audio track playing */ + scd.regs[0x36>>1].byte.h = 0x01; + + /* update status (RS1-RS8 unchanged) */ + cdd.status = scd.regs[0x38>>1].byte.h = CD_READY; + break; + } + + case 0x0c: /* Close Tray */ + { + /* no audio track playing */ + scd.regs[0x36>>1].byte.h = 0x01; + + /* update status */ + cdd.status = cdd.loaded ? CD_STOP : NO_DISC; + + /* RS1-RS8 ignored, expects 0x0 ("no disc" ?) in RS0 once */ + scd.regs[0x38>>1].w = 0x0000; + scd.regs[0x3a>>1].w = 0x0000; + scd.regs[0x3c>>1].w = 0x0000; + scd.regs[0x3e>>1].w = 0x0000; + scd.regs[0x40>>1].w = 0x000f; + +#ifdef CD_TRAY_CALLBACK + CD_TRAY_CALLBACK +#endif + return; + } + + case 0x0d: /* Open Tray */ + { + /* no audio track playing */ + scd.regs[0x36>>1].byte.h = 0x01; + + /* update status (RS1-RS8 ignored) */ + cdd.status = CD_OPEN; + scd.regs[0x38>>1].w = CD_OPEN << 8; + scd.regs[0x3a>>1].w = 0x0000; + scd.regs[0x3c>>1].w = 0x0000; + scd.regs[0x3e>>1].w = 0x0000; + scd.regs[0x40>>1].w = ~CD_OPEN & 0x0f; + +#ifdef CD_TRAY_CALLBACK + CD_TRAY_CALLBACK +#endif + return; + } + + default: /* Unknown command */ +#ifdef LOG_CDD + error("Unknown CDD Command !!!\n"); +#endif + scd.regs[0x38>>1].byte.h = cdd.status; + break; + } + + /* only compute checksum when necessary */ + scd.regs[0x40>>1].byte.l = ~(scd.regs[0x38>>1].byte.h + scd.regs[0x38>>1].byte.l + + scd.regs[0x3a>>1].byte.h + scd.regs[0x3a>>1].byte.l + + scd.regs[0x3c>>1].byte.h + scd.regs[0x3c>>1].byte.l + + scd.regs[0x3e>>1].byte.h + scd.regs[0x3e>>1].byte.l + + scd.regs[0x40>>1].byte.h) & 0x0f; +} diff --git a/waterbox/gpgx/core/cd_hw/cdd.h b/waterbox/gpgx/core/cd_hw/cdd.h index e1300b4eac..fdfb62b127 100644 --- a/waterbox/gpgx/core/cd_hw/cdd.h +++ b/waterbox/gpgx/core/cd_hw/cdd.h @@ -1,106 +1,110 @@ -/*************************************************************************************** - * Genesis Plus - * CD drive processor & CD-DA fader - * - * Copyright (C) 2012-2013 Eke-Eke (Genesis Plus GX) - * - * Redistribution and use of this code or any derivative works are permitted - * provided that the following conditions are met: - * - * - Redistributions may not be sold, nor may they be used in a commercial - * product or activity. - * - * - Redistributions that are modified from the original source must include the - * complete source code, including the source code for all components used by a - * binary built from the modified sources. However, as a special exception, the - * source code distributed need not include anything that is normally distributed - * (in either source or binary form) with the major components (compiler, kernel, - * and so on) of the operating system on which the executable runs, unless that - * component itself accompanies the executable. - * - * - Redistributions must reproduce the above copyright notice, this list of - * conditions and the following disclaimer in the documentation and/or other - * materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************************/ -#ifndef _HW_CDD_ -#define _HW_CDD_ - -#include "blip_buf.h" - -#ifdef USE_LIBTREMOR -#include "tremor/ivorbisfile.h" -#endif - -#define cdd scd.cdd_hw - -/* CDD status */ -#define NO_DISC 0x00 -#define CD_PLAY 0x01 -#define CD_SEEK 0x02 -#define CD_SCAN 0x03 -#define CD_READY 0x04 -#define CD_OPEN 0x05 /* similar to 0x0E ? */ -#define CD_STOP 0x09 -#define CD_END 0x0C - -/* CD blocks scanning speed */ -#define CD_SCAN_SPEED 30 - -#define CD_MAX_TRACKS 100 - -/* CD track */ -typedef struct -{ - int start; - int end; -} track_t; - -/* CD TOC */ -typedef struct -{ - int end; - int last; - track_t tracks[CD_MAX_TRACKS]; -} toc_t; - -/* CDD hardware */ -typedef struct -{ - uint32 cycles; - uint32 latency; - int loaded; - int index; - int lba; - int scanOffset; - int volume; - int sampleOffset; - int sampleLba; - uint8 status; - toc_t toc; - int16 audio[2]; -} cdd_t; - -/* Function prototypes */ -extern void cdd_init(blip_t* left, blip_t* right); -extern void cdd_reset(void); -extern int cdd_load(const char *key, char *header); -extern void cdd_unload(void); -extern void cdd_read_data(uint8 *dst); -extern void cdd_read_audio(unsigned int samples); -extern void cdd_update(void); -extern void cdd_process(void); - -#endif +/*************************************************************************************** + * Genesis Plus + * CD drive processor & CD-DA fader + * + * Copyright (C) 2012-2013 Eke-Eke (Genesis Plus GX) + * + * Redistribution and use of this code or any derivative works are permitted + * provided that the following conditions are met: + * + * - Redistributions may not be sold, nor may they be used in a commercial + * product or activity. + * + * - Redistributions that are modified from the original source must include the + * complete source code, including the source code for all components used by a + * binary built from the modified sources. However, as a special exception, the + * source code distributed need not include anything that is normally distributed + * (in either source or binary form) with the major components (compiler, kernel, + * and so on) of the operating system on which the executable runs, unless that + * component itself accompanies the executable. + * + * - Redistributions must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************************/ +#ifndef _HW_CDD_ +#define _HW_CDD_ + +#include "blip_buf.h" + +#ifdef USE_LIBTREMOR +#include "tremor/ivorbisfile.h" +#endif + +#define cdd scd.cdd_hw + +/* CDD status */ +#define NO_DISC 0x00 +#define CD_PLAY 0x01 +#define CD_SEEK 0x02 +#define CD_SCAN 0x03 +#define CD_READY 0x04 +#define CD_OPEN 0x05 /* similar to 0x0E ? */ +#define CD_STOP 0x09 +#define CD_END 0x0C + +/* CD blocks scanning speed */ +#define CD_SCAN_SPEED 30 + +#define CD_MAX_TRACKS 100 + +/* CD track */ +typedef struct +{ + int start; + int end; +} track_t; + +/* CD TOC */ +typedef struct +{ + int end; + int last; + track_t tracks[CD_MAX_TRACKS]; +} toc_t; + +/* CDD hardware */ +typedef struct +{ + uint32 cycles; + uint32 latency; + int loaded; + int index; + int lba; + int scanOffset; + int volume; + int sampleOffset; + int sampleLba; + uint8 status; + toc_t toc; + int16 audio[2]; +} cdd_t; + +/* Function prototypes */ +extern void cdd_init(blip_t* left, blip_t* right); +extern void cdd_reset(void); +extern int cdd_load(const char *key, char *header); +extern void cdd_unload(void); +extern void cdd_read_data(uint8 *dst); +extern void cdd_read_audio(unsigned int samples); +extern void cdd_update(void); +extern void cdd_process(void); + +// switch disks after emulation was started +// pass NULL to open tray +void cdd_hotswap(const toc_t *toc); + +#endif From f60a4a07e778019e9583c216f073493bf8d7721b Mon Sep 17 00:00:00 2001 From: adelikat Date: Mon, 17 Jul 2017 20:36:04 -0500 Subject: [PATCH 14/93] UI for multi-disc Sega-CD support. Note that the ui will technically allow you to bundle a mix of dics and carts, but tom loading for now will only take multiple discs. --- BizHawk.Client.Common/RomLoader.cs | 9 +++++++++ .../tools/MultiDiskBundler/MultiDiskBundler.Designer.cs | 9 +++++---- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/BizHawk.Client.Common/RomLoader.cs b/BizHawk.Client.Common/RomLoader.cs index 546658b4e9..9a9e0338ab 100644 --- a/BizHawk.Client.Common/RomLoader.cs +++ b/BizHawk.Client.Common/RomLoader.cs @@ -729,6 +729,15 @@ namespace BizHawk.Client.Common nextEmulator = new Tst(nextComm, pcfxDiscs, (Tst.Settings)GetCoreSettings(), (Tst.SyncSettings)GetCoreSyncSettings()); break; + case "GEN": + // We are assuming discs only, for now + var genDiscs = DiscsFromXml(xmlGame, "GEN", DiscType.MegaCD); + if (!genDiscs.Any()) + { + return false; + } + nextEmulator = new GPGX(nextComm, null, genDiscs, GetCoreSettings(), GetCoreSyncSettings()); + break; default: return false; } diff --git a/BizHawk.Client.EmuHawk/tools/MultiDiskBundler/MultiDiskBundler.Designer.cs b/BizHawk.Client.EmuHawk/tools/MultiDiskBundler/MultiDiskBundler.Designer.cs index def046ab2e..e159fc03ca 100644 --- a/BizHawk.Client.EmuHawk/tools/MultiDiskBundler/MultiDiskBundler.Designer.cs +++ b/BizHawk.Client.EmuHawk/tools/MultiDiskBundler/MultiDiskBundler.Designer.cs @@ -138,12 +138,13 @@ this.SystemDropDown.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; this.SystemDropDown.FormattingEnabled = true; this.SystemDropDown.Items.AddRange(new object[] { - "GB", "AppleII", - "PSX", "C64", - "SAT", - "PCFX"}); + "GB", + "GEN", + "PCFX", + "PSX", + "SAT"}); this.SystemDropDown.Location = new System.Drawing.Point(425, 75); this.SystemDropDown.Name = "SystemDropDown"; this.SystemDropDown.Size = new System.Drawing.Size(69, 21); From d99d2dd3dc37cb24432912c9d8fbca0e1f93c54b Mon Sep 17 00:00:00 2001 From: adelikat Date: Tue, 18 Jul 2017 10:37:17 -0500 Subject: [PATCH 15/93] PCE - start support for peripheral support - implement a controller deck and wire it up to the controller logic, with the same options as previously, 5 ports, with None and Gamepad as options. No ui for the new system. Old system code and ui still left in --- .../BizHawk.Emulation.Cores.csproj | 1 + .../Consoles/PC Engine/PCEngine.IEmulator.cs | 2 +- .../Consoles/PC Engine/PCEngine.ISettable.cs | 35 +++- .../Consoles/PC Engine/PCEngine.Input.cs | 18 +- .../Consoles/PC Engine/PCEngine.cs | 18 +- .../Consoles/PC Engine/PceControllerDeck.cs | 162 ++++++++++++++++++ 6 files changed, 217 insertions(+), 19 deletions(-) create mode 100644 BizHawk.Emulation.Cores/Consoles/PC Engine/PceControllerDeck.cs diff --git a/BizHawk.Emulation.Cores/BizHawk.Emulation.Cores.csproj b/BizHawk.Emulation.Cores/BizHawk.Emulation.Cores.csproj index 07fb3f1ede..75343412ce 100644 --- a/BizHawk.Emulation.Cores/BizHawk.Emulation.Cores.csproj +++ b/BizHawk.Emulation.Cores/BizHawk.Emulation.Cores.csproj @@ -1005,6 +1005,7 @@ + PCEngine.cs diff --git a/BizHawk.Emulation.Cores/Consoles/PC Engine/PCEngine.IEmulator.cs b/BizHawk.Emulation.Cores/Consoles/PC Engine/PCEngine.IEmulator.cs index ce4d1af49a..5fa7f01d7e 100644 --- a/BizHawk.Emulation.Cores/Consoles/PC Engine/PCEngine.IEmulator.cs +++ b/BizHawk.Emulation.Cores/Consoles/PC Engine/PCEngine.IEmulator.cs @@ -6,7 +6,7 @@ namespace BizHawk.Emulation.Cores.PCEngine { public IEmulatorServiceProvider ServiceProvider { get; private set; } - public ControllerDefinition ControllerDefinition => PCEngineController; + public ControllerDefinition ControllerDefinition => _controllerDeck.Definition; public void FrameAdvance(IController controller, bool render, bool rendersound) { diff --git a/BizHawk.Emulation.Cores/Consoles/PC Engine/PCEngine.ISettable.cs b/BizHawk.Emulation.Cores/Consoles/PC Engine/PCEngine.ISettable.cs index 28694b69d5..39e6d2dcaf 100644 --- a/BizHawk.Emulation.Cores/Consoles/PC Engine/PCEngine.ISettable.cs +++ b/BizHawk.Emulation.Cores/Consoles/PC Engine/PCEngine.ISettable.cs @@ -1,4 +1,7 @@ -using BizHawk.Emulation.Common; +using System.ComponentModel; + +using BizHawk.Common; +using BizHawk.Emulation.Common; namespace BizHawk.Emulation.Cores.PCEngine { @@ -62,6 +65,36 @@ namespace BizHawk.Emulation.Cores.PCEngine public class PCESyncSettings { + [DefaultValue(PceControllerType.GamePad)] + [DisplayName("Port 1 Device")] + [Description("The type of controller plugged into the first controller port")] + [TypeConverter(typeof(DescribableEnumConverter))] + public PceControllerType Port1 { get; set; } = PceControllerType.GamePad; + + [DefaultValue(PceControllerType.Unplugged)] + [DisplayName("Port 2 Device")] + [Description("The type of controller plugged into the second controller port")] + [TypeConverter(typeof(DescribableEnumConverter))] + public PceControllerType Port2 { get; set; } = PceControllerType.Unplugged; + + [DefaultValue(PceControllerType.Unplugged)] + [DisplayName("Port 3 Device")] + [Description("The type of controller plugged into the third controller port")] + [TypeConverter(typeof(DescribableEnumConverter))] + public PceControllerType Port3 { get; set; } = PceControllerType.Unplugged; + + [DefaultValue(PceControllerType.Unplugged)] + [DisplayName("Port 4 Device")] + [Description("The type of controller plugged into the fourth controller port")] + [TypeConverter(typeof(DescribableEnumConverter))] + public PceControllerType Port4 { get; set; } = PceControllerType.Unplugged; + + [DefaultValue(PceControllerType.Unplugged)] + [DisplayName("Port 5 Device")] + [Description("The type of controller plugged into the fifth controller port")] + [TypeConverter(typeof(DescribableEnumConverter))] + public PceControllerType Port5 { get; set; } = PceControllerType.Unplugged; + public ControllerSetting[] Controllers = { new ControllerSetting { IsConnected = true }, diff --git a/BizHawk.Emulation.Cores/Consoles/PC Engine/PCEngine.Input.cs b/BizHawk.Emulation.Cores/Consoles/PC Engine/PCEngine.Input.cs index c40788c08a..52b5c7e444 100644 --- a/BizHawk.Emulation.Cores/Consoles/PC Engine/PCEngine.Input.cs +++ b/BizHawk.Emulation.Cores/Consoles/PC Engine/PCEngine.Input.cs @@ -63,6 +63,8 @@ namespace BizHawk.Emulation.Cores.PCEngine } } + private readonly PceControllerDeck _controllerDeck; + private byte ReadInput() { InputCallbacks.Call(); @@ -72,21 +74,7 @@ namespace BizHawk.Emulation.Cores.PCEngine if (player < 6) { _lagged = false; - if (SEL == false) // return buttons - { - if (_controller.IsPressed("P" + player + " B1")) value &= 0xFE; - if (_controller.IsPressed("P" + player + " B2")) value &= 0xFD; - if (_controller.IsPressed("P" + player + " Select")) value &= 0xFB; - if (_controller.IsPressed("P" + player + " Run")) value &= 0xF7; - } - else - { - //return directions - if (_controller.IsPressed("P" + player + " Up")) value &= 0xFE; - if (_controller.IsPressed("P" + player + " Right")) value &= 0xFD; - if (_controller.IsPressed("P" + player + " Down")) value &= 0xFB; - if (_controller.IsPressed("P" + player + " Left")) value &= 0xF7; - } + value &= _controllerDeck.Read(player, _controller, SEL); } if (Region == "Japan") diff --git a/BizHawk.Emulation.Cores/Consoles/PC Engine/PCEngine.cs b/BizHawk.Emulation.Cores/Consoles/PC Engine/PCEngine.cs index 32ca565b65..d3d43f1464 100644 --- a/BizHawk.Emulation.Cores/Consoles/PC Engine/PCEngine.cs +++ b/BizHawk.Emulation.Cores/Consoles/PC Engine/PCEngine.cs @@ -41,7 +41,14 @@ namespace BizHawk.Emulation.Cores.PCEngine Settings = (PCESettings)settings ?? new PCESettings(); _syncSettings = (PCESyncSettings)syncSettings ?? new PCESyncSettings(); Init(game, rom); - SetControllerButtons(); + + _controllerDeck = new PceControllerDeck( + _syncSettings.Port1, + _syncSettings.Port2, + _syncSettings.Port3, + _syncSettings.Port4, + _syncSettings.Port5); + //SetControllerButtons(); // TODO: get rid of this method } public PCEngine(CoreComm comm, GameInfo game, Disc disc, object Settings, object syncSettings) @@ -96,7 +103,14 @@ namespace BizHawk.Emulation.Cores.PCEngine // the default RomStatusDetails don't do anything with Disc CoreComm.RomStatusDetails = string.Format("{0}\r\nDisk partial hash:{1}", game.Name, new DiscSystem.DiscHasher(disc).OldHash()); - SetControllerButtons(); + + _controllerDeck = new PceControllerDeck( + _syncSettings.Port1, + _syncSettings.Port2, + _syncSettings.Port3, + _syncSettings.Port4, + _syncSettings.Port5); + //SetControllerButtons(); } // ROM diff --git a/BizHawk.Emulation.Cores/Consoles/PC Engine/PceControllerDeck.cs b/BizHawk.Emulation.Cores/Consoles/PC Engine/PceControllerDeck.cs new file mode 100644 index 0000000000..ac5a9efd24 --- /dev/null +++ b/BizHawk.Emulation.Cores/Consoles/PC Engine/PceControllerDeck.cs @@ -0,0 +1,162 @@ +using System; +using System.Collections.Generic; +using System.Linq; + +using BizHawk.Emulation.Common; + +namespace BizHawk.Emulation.Cores.PCEngine +{ + public enum PceControllerType + { + Unplugged, + GamePad + } + + public class PceControllerDeck + { + private static readonly Type[] Implementors = + { + typeof(UnpluggedController), // Order must match PceControllerType enum values + typeof(StandardController) + }; + + public PceControllerDeck( + PceControllerType controller1, + PceControllerType controller2, + PceControllerType controller3, + PceControllerType controller4, + PceControllerType controller5) + { + Port1 = (IPort)Activator.CreateInstance(Implementors[(int)controller1], 1); + Port2 = (IPort)Activator.CreateInstance(Implementors[(int)controller2], 2); + Port3 = (IPort)Activator.CreateInstance(Implementors[(int)controller3], 3); + Port4 = (IPort)Activator.CreateInstance(Implementors[(int)controller4], 4); + Port5 = (IPort)Activator.CreateInstance(Implementors[(int)controller5], 5); + + Definition = new ControllerDefinition + { + Name = "PC Engine Controller", + BoolButtons = Port1.Definition.BoolButtons + .Concat(Port2.Definition.BoolButtons) + .Concat(Port3.Definition.BoolButtons) + .Concat(Port4.Definition.BoolButtons) + .Concat(Port5.Definition.BoolButtons) + .ToList() + }; + + Definition.FloatControls.AddRange(Port1.Definition.FloatControls); + Definition.FloatControls.AddRange(Port2.Definition.FloatControls); + Definition.FloatControls.AddRange(Port3.Definition.FloatControls); + Definition.FloatControls.AddRange(Port4.Definition.FloatControls); + Definition.FloatControls.AddRange(Port5.Definition.FloatControls); + + Definition.FloatRanges.AddRange(Port1.Definition.FloatRanges); + Definition.FloatRanges.AddRange(Port2.Definition.FloatRanges); + Definition.FloatRanges.AddRange(Port3.Definition.FloatRanges); + Definition.FloatRanges.AddRange(Port4.Definition.FloatRanges); + Definition.FloatRanges.AddRange(Port5.Definition.FloatRanges); + } + + private readonly IPort Port1; + private readonly IPort Port2; + private readonly IPort Port3; + private readonly IPort Port4; + private readonly IPort Port5; + + public byte Read(int portNum, IController c, bool sel) + { + switch (portNum) + { + default: + throw new ArgumentException($"Invalid {nameof(portNum)}: {portNum}"); + case 1: + return Port1.Read(c, sel); + case 2: + return Port2.Read(c, sel); + case 3: + return Port3.Read(c, sel); + case 4: + return Port4.Read(c, sel); + case 5: + return Port5.Read(c, sel); + } + } + + public ControllerDefinition Definition { get; } + } + + public interface IPort + { + byte Read(IController c, bool sel); + + ControllerDefinition Definition { get; } + + int PortNum { get; } + } + + public class UnpluggedController : IPort + { + public UnpluggedController(int portNum) + { + PortNum = portNum; + Definition = new ControllerDefinition + { + BoolButtons = new List() + }; + } + + public byte Read(IController c, bool sel) + { + return 0x3F; + } + + public ControllerDefinition Definition { get; } + + public int PortNum { get; } + } + + public class StandardController : IPort + { + public StandardController(int portNum) + { + PortNum = portNum; + Definition = new ControllerDefinition + { + BoolButtons = BaseDefinition + .Select(b => $"P{PortNum} " + b) + .ToList() + }; + } + + public ControllerDefinition Definition { get; } + + public int PortNum { get; } + + public byte Read(IController c, bool sel) + { + byte result = 0x3F; + + if (sel == false) + { + if (c.IsPressed($"P{PortNum} B1")) result &= 0xFE; + if (c.IsPressed($"P{PortNum} B2")) result &= 0xFD; + if (c.IsPressed($"P{PortNum} Select")) result &= 0xFB; + if (c.IsPressed($"P{PortNum} Run")) result &= 0xF7; + } + else + { + if (c.IsPressed($"P{PortNum} Up")) { result &= 0xFE; } + if (c.IsPressed($"P{PortNum} Right")) { result &= 0xFD; } + if (c.IsPressed($"P{PortNum} Down")) { result &= 0xFB; } + if (c.IsPressed($"P{PortNum} Left")) { result &= 0xF7; } + } + + return result; + } + + private static readonly string[] BaseDefinition = + { + "Up", "Down", "Left", "Right", "Select", "Run", "B2", "B1" + }; + } +} From 9fc8b8700d008d30b401cef6c22bfeb8f2d1efda Mon Sep 17 00:00:00 2001 From: adelikat Date: Tue, 18 Jul 2017 11:01:50 -0500 Subject: [PATCH 16/93] PCE - add ui for controller config --- .../PCE/PCEControllerConfig.Designer.cs | 104 ++++++++++-------- .../config/PCE/PCEControllerConfig.cs | 31 +----- .../Consoles/PC Engine/PCEngine.ISettable.cs | 26 ++--- 3 files changed, 71 insertions(+), 90 deletions(-) diff --git a/BizHawk.Client.EmuHawk/config/PCE/PCEControllerConfig.Designer.cs b/BizHawk.Client.EmuHawk/config/PCE/PCEControllerConfig.Designer.cs index f52aefb6fc..c78a658baa 100644 --- a/BizHawk.Client.EmuHawk/config/PCE/PCEControllerConfig.Designer.cs +++ b/BizHawk.Client.EmuHawk/config/PCE/PCEControllerConfig.Designer.cs @@ -28,52 +28,63 @@ /// private void InitializeComponent() { - System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(PCEControllerConfig)); - this.CancelBtn = new System.Windows.Forms.Button(); - this.OkBtn = new System.Windows.Forms.Button(); - this.SuspendLayout(); - // - // CancelBtn - // - this.CancelBtn.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.CancelBtn.DialogResult = System.Windows.Forms.DialogResult.Cancel; - this.CancelBtn.Location = new System.Drawing.Point(235, 145); - this.CancelBtn.Name = "CancelBtn"; - this.CancelBtn.Size = new System.Drawing.Size(60, 23); - this.CancelBtn.TabIndex = 3; - this.CancelBtn.Text = "&Cancel"; - this.CancelBtn.UseVisualStyleBackColor = true; - this.CancelBtn.Click += new System.EventHandler(this.CancelBtn_Click); - // - // OkBtn - // - this.OkBtn.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); - this.OkBtn.Location = new System.Drawing.Point(169, 145); - this.OkBtn.Name = "OkBtn"; - this.OkBtn.Size = new System.Drawing.Size(60, 23); - this.OkBtn.TabIndex = 2; - this.OkBtn.Text = "&OK"; - this.OkBtn.UseVisualStyleBackColor = true; - this.OkBtn.Click += new System.EventHandler(this.OkBtn_Click); - // - // PCEControllerConfig - // - this.AcceptButton = this.OkBtn; - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.CancelButton = this.CancelBtn; - this.ClientSize = new System.Drawing.Size(307, 180); - this.Controls.Add(this.CancelBtn); - this.Controls.Add(this.OkBtn); - this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; - this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); - this.MaximizeBox = false; - this.MinimizeBox = false; - this.Name = "PCEControllerConfig"; - this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; - this.Text = "Controller Settings"; - this.Load += new System.EventHandler(this.PCEControllerConfig_Load); - this.ResumeLayout(false); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(PCEControllerConfig)); + this.CancelBtn = new System.Windows.Forms.Button(); + this.OkBtn = new System.Windows.Forms.Button(); + this.ControllerPropertyGrid = new System.Windows.Forms.PropertyGrid(); + this.SuspendLayout(); + // + // CancelBtn + // + this.CancelBtn.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.CancelBtn.DialogResult = System.Windows.Forms.DialogResult.Cancel; + this.CancelBtn.Location = new System.Drawing.Point(235, 203); + this.CancelBtn.Name = "CancelBtn"; + this.CancelBtn.Size = new System.Drawing.Size(60, 23); + this.CancelBtn.TabIndex = 3; + this.CancelBtn.Text = "&Cancel"; + this.CancelBtn.UseVisualStyleBackColor = true; + this.CancelBtn.Click += new System.EventHandler(this.CancelBtn_Click); + // + // OkBtn + // + this.OkBtn.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); + this.OkBtn.Location = new System.Drawing.Point(169, 203); + this.OkBtn.Name = "OkBtn"; + this.OkBtn.Size = new System.Drawing.Size(60, 23); + this.OkBtn.TabIndex = 2; + this.OkBtn.Text = "&OK"; + this.OkBtn.UseVisualStyleBackColor = true; + this.OkBtn.Click += new System.EventHandler(this.OkBtn_Click); + // + // ControllerPropertyGrid + // + this.ControllerPropertyGrid.Location = new System.Drawing.Point(12, 12); + this.ControllerPropertyGrid.Name = "ControllerPropertyGrid"; + this.ControllerPropertyGrid.PropertySort = System.Windows.Forms.PropertySort.Alphabetical; + this.ControllerPropertyGrid.Size = new System.Drawing.Size(283, 181); + this.ControllerPropertyGrid.TabIndex = 4; + this.ControllerPropertyGrid.ToolbarVisible = false; + // + // PCEControllerConfig + // + this.AcceptButton = this.OkBtn; + this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.CancelButton = this.CancelBtn; + this.ClientSize = new System.Drawing.Size(307, 238); + this.Controls.Add(this.ControllerPropertyGrid); + this.Controls.Add(this.CancelBtn); + this.Controls.Add(this.OkBtn); + this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedSingle; + this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon"))); + this.MaximizeBox = false; + this.MinimizeBox = false; + this.Name = "PCEControllerConfig"; + this.StartPosition = System.Windows.Forms.FormStartPosition.CenterParent; + this.Text = "Controller Settings"; + this.Load += new System.EventHandler(this.PCEControllerConfig_Load); + this.ResumeLayout(false); } @@ -81,5 +92,6 @@ private System.Windows.Forms.Button CancelBtn; private System.Windows.Forms.Button OkBtn; + private System.Windows.Forms.PropertyGrid ControllerPropertyGrid; } } \ No newline at end of file diff --git a/BizHawk.Client.EmuHawk/config/PCE/PCEControllerConfig.cs b/BizHawk.Client.EmuHawk/config/PCE/PCEControllerConfig.cs index 0eec5d71e9..ba5af970fa 100644 --- a/BizHawk.Client.EmuHawk/config/PCE/PCEControllerConfig.cs +++ b/BizHawk.Client.EmuHawk/config/PCE/PCEControllerConfig.cs @@ -1,6 +1,4 @@ using System; -using System.Drawing; -using System.Linq; using System.Windows.Forms; using BizHawk.Emulation.Cores.PCEngine; @@ -10,6 +8,8 @@ namespace BizHawk.Client.EmuHawk { public partial class PCEControllerConfig : Form { + private PCEngine.PCESyncSettings _controllerSettings; + public PCEControllerConfig() { InitializeComponent(); @@ -18,36 +18,15 @@ namespace BizHawk.Client.EmuHawk private void PCEControllerConfig_Load(object sender, EventArgs e) { var pceSettings = ((PCEngine)Global.Emulator).GetSyncSettings(); - for (int i = 0; i < 5; i++) - { - Controls.Add(new Label - { - Text = "Controller " + (i + 1), - Location = new Point(15, 15 + (i * 25)) - }); - Controls.Add(new CheckBox - { - Text = "Connected", - Name = "Controller" + i, - Location = new Point(135, 15 + (i * 25)), - Checked = pceSettings.Controllers[i].IsConnected - }); - } + _controllerSettings = pceSettings; // Assumes only controller data is in sync settings! If there are ever more sync settings, this dialog should just become a general sync settings dialog (or both settings/sync settings) + ControllerPropertyGrid.SelectedObject = _controllerSettings; } private void OkBtn_Click(object sender, EventArgs e) { var pceSettings = ((PCEngine)Global.Emulator).GetSyncSettings(); - Controls - .OfType() - .OrderBy(c => c.Name) - .ToList() - .ForEach(c => - { - var index = int.Parse(c.Name.Replace("Controller", "")); - pceSettings.Controllers[index].IsConnected = c.Checked; - }); + pceSettings = _controllerSettings; GlobalWin.MainForm.PutCoreSyncSettings(pceSettings); DialogResult = DialogResult.OK; Close(); diff --git a/BizHawk.Emulation.Cores/Consoles/PC Engine/PCEngine.ISettable.cs b/BizHawk.Emulation.Cores/Consoles/PC Engine/PCEngine.ISettable.cs index 39e6d2dcaf..5a58dedea1 100644 --- a/BizHawk.Emulation.Cores/Consoles/PC Engine/PCEngine.ISettable.cs +++ b/BizHawk.Emulation.Cores/Consoles/PC Engine/PCEngine.ISettable.cs @@ -69,8 +69,8 @@ namespace BizHawk.Emulation.Cores.PCEngine [DisplayName("Port 1 Device")] [Description("The type of controller plugged into the first controller port")] [TypeConverter(typeof(DescribableEnumConverter))] - public PceControllerType Port1 { get; set; } = PceControllerType.GamePad; - + public PceControllerType Port1 { get; set; } = PceControllerType.GamePad; + [DefaultValue(PceControllerType.Unplugged)] [DisplayName("Port 2 Device")] [Description("The type of controller plugged into the second controller port")] @@ -106,13 +106,7 @@ namespace BizHawk.Emulation.Cores.PCEngine public PCESyncSettings Clone() { - var ret = new PCESyncSettings(); - for (int i = 0; i < Controllers.Length; i++) - { - ret.Controllers[i].IsConnected = Controllers[i].IsConnected; - } - - return ret; + return (PCESyncSettings)MemberwiseClone(); } public class ControllerSetting @@ -122,15 +116,11 @@ namespace BizHawk.Emulation.Cores.PCEngine public static bool NeedsReboot(PCESyncSettings x, PCESyncSettings y) { - for (int i = 0; i < x.Controllers.Length; i++) - { - if (x.Controllers[i].IsConnected != y.Controllers[i].IsConnected) - { - return true; - } - } - - return false; + return x.Port1 != y.Port1 + || x.Port2 != y.Port2 + || x.Port3 != y.Port3 + || x.Port4 != y.Port4 + || x.Port5 != y.Port5; } } } From 46e4ae05d67452837e50c8cb13000deb49913825 Mon Sep 17 00:00:00 2001 From: adelikat Date: Tue, 18 Jul 2017 11:05:11 -0500 Subject: [PATCH 17/93] PCE - rip out old controller config logic --- .../Consoles/PC Engine/PCEngine.ISettable.cs | 15 ------- .../Consoles/PC Engine/PCEngine.Input.cs | 41 +------------------ .../Consoles/PC Engine/PCEngine.cs | 2 - 3 files changed, 1 insertion(+), 57 deletions(-) diff --git a/BizHawk.Emulation.Cores/Consoles/PC Engine/PCEngine.ISettable.cs b/BizHawk.Emulation.Cores/Consoles/PC Engine/PCEngine.ISettable.cs index 5a58dedea1..00f27089c4 100644 --- a/BizHawk.Emulation.Cores/Consoles/PC Engine/PCEngine.ISettable.cs +++ b/BizHawk.Emulation.Cores/Consoles/PC Engine/PCEngine.ISettable.cs @@ -38,7 +38,6 @@ namespace BizHawk.Emulation.Cores.PCEngine { bool ret = PCESyncSettings.NeedsReboot(o, _syncSettings); _syncSettings = o; - // SetControllerButtons(); // not safe to change the controller during emulation, so instead make it a reboot event return ret; } @@ -95,25 +94,11 @@ namespace BizHawk.Emulation.Cores.PCEngine [TypeConverter(typeof(DescribableEnumConverter))] public PceControllerType Port5 { get; set; } = PceControllerType.Unplugged; - public ControllerSetting[] Controllers = - { - new ControllerSetting { IsConnected = true }, - new ControllerSetting { IsConnected = false }, - new ControllerSetting { IsConnected = false }, - new ControllerSetting { IsConnected = false }, - new ControllerSetting { IsConnected = false } - }; - public PCESyncSettings Clone() { return (PCESyncSettings)MemberwiseClone(); } - public class ControllerSetting - { - public bool IsConnected { get; set; } - } - public static bool NeedsReboot(PCESyncSettings x, PCESyncSettings y) { return x.Port1 != y.Port1 diff --git a/BizHawk.Emulation.Cores/Consoles/PC Engine/PCEngine.Input.cs b/BizHawk.Emulation.Cores/Consoles/PC Engine/PCEngine.Input.cs index 52b5c7e444..b22c525347 100644 --- a/BizHawk.Emulation.Cores/Consoles/PC Engine/PCEngine.Input.cs +++ b/BizHawk.Emulation.Cores/Consoles/PC Engine/PCEngine.Input.cs @@ -1,46 +1,7 @@ -using BizHawk.Emulation.Common; - -namespace BizHawk.Emulation.Cores.PCEngine +namespace BizHawk.Emulation.Cores.PCEngine { public partial class PCEngine { - private readonly ControllerDefinition PCEngineController = new ControllerDefinition - { - Name = "PC Engine Controller", - BoolButtons = - { - "P1 Up", "P1 Down", "P1 Left", "P1 Right", "P1 Select", "P1 Run", "P1 B2", "P1 B1", - "P2 Up", "P2 Down", "P2 Left", "P2 Right", "P2 Select", "P2 Run", "P2 B2", "P2 B1", - "P3 Up", "P3 Down", "P3 Left", "P3 Right", "P3 Select", "P3 Run", "P3 B2", "P3 B1", - "P4 Up", "P4 Down", "P4 Left", "P4 Right", "P4 Select", "P4 Run", "P4 B2", "P4 B1", - "P5 Up", "P5 Down", "P5 Left", "P5 Right", "P5 Select", "P5 Run", "P5 B2", "P5 B1" - } - }; - - private void SetControllerButtons() - { - ControllerDefinition.BoolButtons.Clear(); - ControllerDefinition.FloatControls.Clear(); - - for (int i = 0; i < 5; i++) - { - if (_syncSettings.Controllers[i].IsConnected) - { - ControllerDefinition.BoolButtons.AddRange(new[] - { - "P" + (i + 1) + " Up", - "P" + (i + 1) + " Down", - "P" + (i + 1) + " Left", - "P" + (i + 1) + " Right", - "P" + (i + 1) + " Select", - "P" + (i + 1) + " Run", - "P" + (i + 1) + " B1", - "P" + (i + 1) + " B2" - }); - } - } - } - private int SelectedController; private byte InputByte; diff --git a/BizHawk.Emulation.Cores/Consoles/PC Engine/PCEngine.cs b/BizHawk.Emulation.Cores/Consoles/PC Engine/PCEngine.cs index d3d43f1464..3eda6208b5 100644 --- a/BizHawk.Emulation.Cores/Consoles/PC Engine/PCEngine.cs +++ b/BizHawk.Emulation.Cores/Consoles/PC Engine/PCEngine.cs @@ -48,7 +48,6 @@ namespace BizHawk.Emulation.Cores.PCEngine _syncSettings.Port3, _syncSettings.Port4, _syncSettings.Port5); - //SetControllerButtons(); // TODO: get rid of this method } public PCEngine(CoreComm comm, GameInfo game, Disc disc, object Settings, object syncSettings) @@ -110,7 +109,6 @@ namespace BizHawk.Emulation.Cores.PCEngine _syncSettings.Port3, _syncSettings.Port4, _syncSettings.Port5); - //SetControllerButtons(); } // ROM From eaaf424a2c92c07b19f6c920ce3eeee0be70af64 Mon Sep 17 00:00:00 2001 From: adelikat Date: Tue, 18 Jul 2017 11:16:42 -0500 Subject: [PATCH 18/93] PCE - refactor virtual pad logic to use the controller deck --- .../tools/VirtualPads/schema/PceSchema.cs | 48 +++++++++++++++---- 1 file changed, 38 insertions(+), 10 deletions(-) diff --git a/BizHawk.Client.EmuHawk/tools/VirtualPads/schema/PceSchema.cs b/BizHawk.Client.EmuHawk/tools/VirtualPads/schema/PceSchema.cs index 5b5f6d26f5..1b6545b7b2 100644 --- a/BizHawk.Client.EmuHawk/tools/VirtualPads/schema/PceSchema.cs +++ b/BizHawk.Client.EmuHawk/tools/VirtualPads/schema/PceSchema.cs @@ -1,7 +1,10 @@ using System.Collections.Generic; using System.Drawing; +using System.Linq; +using System.Windows.Forms; using BizHawk.Emulation.Common; +using BizHawk.Emulation.Cores.PCEngine; namespace BizHawk.Client.EmuHawk { @@ -13,9 +16,34 @@ namespace BizHawk.Client.EmuHawk { public IEnumerable GetPadSchemas(IEmulator core) { - for (var i = 0; i < core.ControllerDefinition.PlayerCount; i++) + var ss = ((PCEngine)core).GetSyncSettings(); + + var padSchemas = new[] { - yield return StandardController(i + 1); + ss.Port1, + ss.Port2, + ss.Port3, + ss.Port4, + ss.Port5, + } + .Where(p => p != PceControllerType.Unplugged) + .Select((p, i) => GenerateSchemaForPort(p, i + 1)) + .Where(s => s != null); + + return padSchemas; + } + + private static PadSchema GenerateSchemaForPort(PceControllerType type, int controller) + { + switch (type) + { + default: + MessageBox.Show($"{type} is not supported yet"); + return null; + case PceControllerType.Unplugged: + return null; + case PceControllerType.GamePad: + return StandardController(controller); } } @@ -29,7 +57,7 @@ namespace BizHawk.Client.EmuHawk { new PadSchema.ButtonSchema { - Name = "P" + controller + " Up", + Name = $"P{controller} Up", DisplayName = "", Icon = Properties.Resources.BlueUp, Location = new Point(14, 12), @@ -37,7 +65,7 @@ namespace BizHawk.Client.EmuHawk }, new PadSchema.ButtonSchema { - Name = "P" + controller + " Down", + Name = $"P{controller} Down", DisplayName = "", Icon = Properties.Resources.BlueDown, Location = new Point(14, 56), @@ -45,7 +73,7 @@ namespace BizHawk.Client.EmuHawk }, new PadSchema.ButtonSchema { - Name = "P" + controller + " Left", + Name = $"P{controller} Left", DisplayName = "", Icon = Properties.Resources.Back, Location = new Point(2, 34), @@ -53,7 +81,7 @@ namespace BizHawk.Client.EmuHawk }, new PadSchema.ButtonSchema { - Name = "P" + controller + " Right", + Name = $"P{controller} Right", DisplayName = "", Icon = Properties.Resources.Forward, Location = new Point(24, 34), @@ -61,28 +89,28 @@ namespace BizHawk.Client.EmuHawk }, new PadSchema.ButtonSchema { - Name = "P" + controller + " B2", + Name = $"P{controller} B2", DisplayName = "II", Location = new Point(122, 34), Type = PadSchema.PadInputType.Boolean }, new PadSchema.ButtonSchema { - Name = "P" + controller + " B1", + Name = $"P{controller} B1", DisplayName = "I", Location = new Point(146, 34), Type = PadSchema.PadInputType.Boolean }, new PadSchema.ButtonSchema { - Name = "P" + controller + " Select", + Name = $"P{controller} Select", DisplayName = "s", Location = new Point(52, 34), Type = PadSchema.PadInputType.Boolean }, new PadSchema.ButtonSchema { - Name = "P" + controller + " Run", + Name = $"P{controller} Run", DisplayName = "R", Location = new Point(74, 34), Type = PadSchema.PadInputType.Boolean From 3109bdcc6a423fd531399e57a00081bab6e5f202 Mon Sep 17 00:00:00 2001 From: adelikat Date: Tue, 18 Jul 2017 11:20:02 -0500 Subject: [PATCH 19/93] PCE - cleanup --- .../config/PCE/PCEControllerConfig.cs | 5 +- .../Consoles/PC Engine/PCEngine.Input.cs | 24 ++++---- .../Consoles/PC Engine/PceControllerDeck.cs | 60 +++++++++---------- 3 files changed, 43 insertions(+), 46 deletions(-) diff --git a/BizHawk.Client.EmuHawk/config/PCE/PCEControllerConfig.cs b/BizHawk.Client.EmuHawk/config/PCE/PCEControllerConfig.cs index ba5af970fa..c67095376c 100644 --- a/BizHawk.Client.EmuHawk/config/PCE/PCEControllerConfig.cs +++ b/BizHawk.Client.EmuHawk/config/PCE/PCEControllerConfig.cs @@ -24,10 +24,7 @@ namespace BizHawk.Client.EmuHawk private void OkBtn_Click(object sender, EventArgs e) { - var pceSettings = ((PCEngine)Global.Emulator).GetSyncSettings(); - - pceSettings = _controllerSettings; - GlobalWin.MainForm.PutCoreSyncSettings(pceSettings); + GlobalWin.MainForm.PutCoreSyncSettings(_controllerSettings); DialogResult = DialogResult.OK; Close(); } diff --git a/BizHawk.Emulation.Cores/Consoles/PC Engine/PCEngine.Input.cs b/BizHawk.Emulation.Cores/Consoles/PC Engine/PCEngine.Input.cs index b22c525347..015f16f8ad 100644 --- a/BizHawk.Emulation.Cores/Consoles/PC Engine/PCEngine.Input.cs +++ b/BizHawk.Emulation.Cores/Consoles/PC Engine/PCEngine.Input.cs @@ -2,25 +2,25 @@ { public partial class PCEngine { - private int SelectedController; - private byte InputByte; + private int _selectedController; + private byte _inputByte; - public bool SEL => (InputByte & 1) != 0; - public bool CLR => (InputByte & 2) != 0; + private bool Sel => (_inputByte & 1) != 0; + private bool Clr => (_inputByte & 2) != 0; private void WriteInput(byte value) { - bool prevSEL = SEL; - InputByte = value; + bool prevSel = Sel; + _inputByte = value; - if (SEL && CLR) + if (Sel && Clr) { - SelectedController = 0; + _selectedController = 0; } - if (CLR == false && prevSEL == false && SEL == true) + if (Clr == false && prevSel == false && Sel) { - SelectedController = (SelectedController + 1); + _selectedController = _selectedController + 1; } } @@ -31,11 +31,11 @@ InputCallbacks.Call(); byte value = 0x3F; - int player = SelectedController + 1; + int player = _selectedController + 1; if (player < 6) { _lagged = false; - value &= _controllerDeck.Read(player, _controller, SEL); + value &= _controllerDeck.Read(player, _controller, Sel); } if (Region == "Japan") diff --git a/BizHawk.Emulation.Cores/Consoles/PC Engine/PceControllerDeck.cs b/BizHawk.Emulation.Cores/Consoles/PC Engine/PceControllerDeck.cs index ac5a9efd24..6108be5955 100644 --- a/BizHawk.Emulation.Cores/Consoles/PC Engine/PceControllerDeck.cs +++ b/BizHawk.Emulation.Cores/Consoles/PC Engine/PceControllerDeck.cs @@ -27,41 +27,41 @@ namespace BizHawk.Emulation.Cores.PCEngine PceControllerType controller4, PceControllerType controller5) { - Port1 = (IPort)Activator.CreateInstance(Implementors[(int)controller1], 1); - Port2 = (IPort)Activator.CreateInstance(Implementors[(int)controller2], 2); - Port3 = (IPort)Activator.CreateInstance(Implementors[(int)controller3], 3); - Port4 = (IPort)Activator.CreateInstance(Implementors[(int)controller4], 4); - Port5 = (IPort)Activator.CreateInstance(Implementors[(int)controller5], 5); + _port1 = (IPort)Activator.CreateInstance(Implementors[(int)controller1], 1); + _port2 = (IPort)Activator.CreateInstance(Implementors[(int)controller2], 2); + _port3 = (IPort)Activator.CreateInstance(Implementors[(int)controller3], 3); + _port4 = (IPort)Activator.CreateInstance(Implementors[(int)controller4], 4); + _port5 = (IPort)Activator.CreateInstance(Implementors[(int)controller5], 5); Definition = new ControllerDefinition { Name = "PC Engine Controller", - BoolButtons = Port1.Definition.BoolButtons - .Concat(Port2.Definition.BoolButtons) - .Concat(Port3.Definition.BoolButtons) - .Concat(Port4.Definition.BoolButtons) - .Concat(Port5.Definition.BoolButtons) + BoolButtons = _port1.Definition.BoolButtons + .Concat(_port2.Definition.BoolButtons) + .Concat(_port3.Definition.BoolButtons) + .Concat(_port4.Definition.BoolButtons) + .Concat(_port5.Definition.BoolButtons) .ToList() }; - Definition.FloatControls.AddRange(Port1.Definition.FloatControls); - Definition.FloatControls.AddRange(Port2.Definition.FloatControls); - Definition.FloatControls.AddRange(Port3.Definition.FloatControls); - Definition.FloatControls.AddRange(Port4.Definition.FloatControls); - Definition.FloatControls.AddRange(Port5.Definition.FloatControls); + Definition.FloatControls.AddRange(_port1.Definition.FloatControls); + Definition.FloatControls.AddRange(_port2.Definition.FloatControls); + Definition.FloatControls.AddRange(_port3.Definition.FloatControls); + Definition.FloatControls.AddRange(_port4.Definition.FloatControls); + Definition.FloatControls.AddRange(_port5.Definition.FloatControls); - Definition.FloatRanges.AddRange(Port1.Definition.FloatRanges); - Definition.FloatRanges.AddRange(Port2.Definition.FloatRanges); - Definition.FloatRanges.AddRange(Port3.Definition.FloatRanges); - Definition.FloatRanges.AddRange(Port4.Definition.FloatRanges); - Definition.FloatRanges.AddRange(Port5.Definition.FloatRanges); + Definition.FloatRanges.AddRange(_port1.Definition.FloatRanges); + Definition.FloatRanges.AddRange(_port2.Definition.FloatRanges); + Definition.FloatRanges.AddRange(_port3.Definition.FloatRanges); + Definition.FloatRanges.AddRange(_port4.Definition.FloatRanges); + Definition.FloatRanges.AddRange(_port5.Definition.FloatRanges); } - private readonly IPort Port1; - private readonly IPort Port2; - private readonly IPort Port3; - private readonly IPort Port4; - private readonly IPort Port5; + private readonly IPort _port1; + private readonly IPort _port2; + private readonly IPort _port3; + private readonly IPort _port4; + private readonly IPort _port5; public byte Read(int portNum, IController c, bool sel) { @@ -70,15 +70,15 @@ namespace BizHawk.Emulation.Cores.PCEngine default: throw new ArgumentException($"Invalid {nameof(portNum)}: {portNum}"); case 1: - return Port1.Read(c, sel); + return _port1.Read(c, sel); case 2: - return Port2.Read(c, sel); + return _port2.Read(c, sel); case 3: - return Port3.Read(c, sel); + return _port3.Read(c, sel); case 4: - return Port4.Read(c, sel); + return _port4.Read(c, sel); case 5: - return Port5.Read(c, sel); + return _port5.Read(c, sel); } } From 87f7183a2712cfe343530d96c6d57bec45f342bb Mon Sep 17 00:00:00 2001 From: nattthebear Date: Sun, 16 Jul 2017 12:23:41 -0400 Subject: [PATCH 20/93] sameboy: initial commit --- waterbox/sameboy/Makefile | 55 + waterbox/sameboy/apu.c | 497 +++++++ waterbox/sameboy/apu.h | 78 ++ waterbox/sameboy/camera.c | 149 +++ waterbox/sameboy/camera.h | 29 + waterbox/sameboy/debugger.c | 1850 +++++++++++++++++++++++++++ waterbox/sameboy/debugger.h | 32 + waterbox/sameboy/display.c | 800 ++++++++++++ waterbox/sameboy/display.h | 40 + waterbox/sameboy/gb.c | 563 ++++++++ waterbox/sameboy/gb.h | 570 +++++++++ waterbox/sameboy/gb_struct_def.h | 5 + waterbox/sameboy/joypad.c | 63 + waterbox/sameboy/joypad.h | 22 + waterbox/sameboy/mbc.c | 154 +++ waterbox/sameboy/mbc.h | 31 + waterbox/sameboy/memory.c | 726 +++++++++++ waterbox/sameboy/memory.h | 12 + waterbox/sameboy/printer.c | 201 +++ waterbox/sameboy/printer.h | 59 + waterbox/sameboy/save_state.c | 304 +++++ waterbox/sameboy/save_state.h | 24 + waterbox/sameboy/symbol_hash.c | 106 ++ waterbox/sameboy/symbol_hash.h | 37 + waterbox/sameboy/timing.c | 228 ++++ waterbox/sameboy/timing.h | 21 + waterbox/sameboy/z80_cpu.c | 1381 ++++++++++++++++++++ waterbox/sameboy/z80_cpu.h | 10 + waterbox/sameboy/z80_disassembler.c | 788 ++++++++++++ 29 files changed, 8835 insertions(+) create mode 100644 waterbox/sameboy/Makefile create mode 100644 waterbox/sameboy/apu.c create mode 100644 waterbox/sameboy/apu.h create mode 100644 waterbox/sameboy/camera.c create mode 100644 waterbox/sameboy/camera.h create mode 100644 waterbox/sameboy/debugger.c create mode 100644 waterbox/sameboy/debugger.h create mode 100644 waterbox/sameboy/display.c create mode 100644 waterbox/sameboy/display.h create mode 100644 waterbox/sameboy/gb.c create mode 100644 waterbox/sameboy/gb.h create mode 100644 waterbox/sameboy/gb_struct_def.h create mode 100644 waterbox/sameboy/joypad.c create mode 100644 waterbox/sameboy/joypad.h create mode 100644 waterbox/sameboy/mbc.c create mode 100644 waterbox/sameboy/mbc.h create mode 100644 waterbox/sameboy/memory.c create mode 100644 waterbox/sameboy/memory.h create mode 100644 waterbox/sameboy/printer.c create mode 100644 waterbox/sameboy/printer.h create mode 100644 waterbox/sameboy/save_state.c create mode 100644 waterbox/sameboy/save_state.h create mode 100644 waterbox/sameboy/symbol_hash.c create mode 100644 waterbox/sameboy/symbol_hash.h create mode 100644 waterbox/sameboy/timing.c create mode 100644 waterbox/sameboy/timing.h create mode 100644 waterbox/sameboy/z80_cpu.c create mode 100644 waterbox/sameboy/z80_cpu.h create mode 100644 waterbox/sameboy/z80_disassembler.c diff --git a/waterbox/sameboy/Makefile b/waterbox/sameboy/Makefile new file mode 100644 index 0000000000..0fdbe63b73 --- /dev/null +++ b/waterbox/sameboy/Makefile @@ -0,0 +1,55 @@ +CC = x86_64-nt64-midipix-gcc +CPP = x86_64-nt64-midipix-g++ + +FLAGS:=-Wall -Werror=pointer-to-int-cast -Werror=int-to-pointer-cast -Werror=implicit-function-declaration \ + -Wno-multichar \ + -fomit-frame-pointer -fvisibility=hidden \ + -O0 -g + +CCFLAGS:=$(FLAGS) -Ilib \ + -I../emulibc \ + -std=gnu99 \ + -DLSB_FIRST -D_GNU_SOURCE -DGB_INTERNAL + +CPPFLAGS:=$(FLAGS) -DSPC_NO_COPY_STATE_FUNCS + +TARGET = sameboy.wbx + +LDFLAGS = -Wl,--dynamicbase,--export-all-symbols + +ROOT_DIR:=$(shell dirname $(realpath $(lastword $(MAKEFILE_LIST)))) +C_SRCS:=$(shell find $(ROOT_DIR) -type f -name '*.c') +CPP_SRCS:=$(shell find $(ROOT_DIR) -type f -name '*.cpp') +SRCS:=$(C_SRCS) $(CPP_SRCS) +OBJ_DIR:=$(ROOT_DIR)/obj + +__OBJS:=$(SRCS:.c=.o) +_OBJS:=$(__OBJS:.cpp=.opp) +OBJS:=$(patsubst $(ROOT_DIR)%,$(OBJ_DIR)%,$(_OBJS)) + +$(OBJ_DIR)/%.o: %.c + @mkdir -p $(@D) + @$(CC) -c -o $@ $< $(CCFLAGS) + +$(OBJ_DIR)/%.opp: %.cpp + @mkdir -p $(@D) + @$(CPP) -c -o $@ $< $(CPPFLAGS) + +all: $(TARGET) + +.PHONY: clean all + +$(TARGET).in: $(OBJS) + @$(CPP) -o $@ $(LDFLAGS) $(FLAGS) $(OBJS) ../emulibc/libemuhost.so + +$(TARGET): $(TARGET).in +# strip $< -o $@ -R /4 -R /14 -R /29 -R /41 -R /55 -R /67 -R /78 -R /89 -R /104 + cp $< $@ + +clean: + rm -rf $(OBJ_DIR) + rm -f $(TARGET).in + rm -f $(TARGET) + +#install: +# $(CP) $(TARGET) $(DEST_$(ARCH)) diff --git a/waterbox/sameboy/apu.c b/waterbox/sameboy/apu.c new file mode 100644 index 0000000000..e0e0b89f28 --- /dev/null +++ b/waterbox/sameboy/apu.c @@ -0,0 +1,497 @@ +#include +#include +#include +#include "gb.h" + +#undef max +#define max(a,b) \ +({ __typeof__ (a) _a = (a); \ +__typeof__ (b) _b = (b); \ +_a > _b ? _a : _b; }) + +#undef min +#define min(a,b) \ +({ __typeof__ (a) _a = (a); \ +__typeof__ (b) _b = (b); \ +_a < _b ? _a : _b; }) + +#define APU_FREQUENCY 0x80000 + +static int16_t generate_square(uint64_t phase, uint32_t wave_length, int16_t amplitude, uint8_t duty) +{ + if (!wave_length) return 0; + if (phase % wave_length > wave_length * duty / 8) { + return amplitude; + } + return 0; +} + +static int16_t generate_wave(uint64_t phase, uint32_t wave_length, int16_t amplitude, int8_t *wave, uint8_t shift) +{ + if (!wave_length) wave_length = 1; + phase = phase % wave_length; + return ((wave[(int)(phase * 32 / wave_length)]) >> shift) * (int)amplitude / 0xF; +} + +static int16_t generate_noise(int16_t amplitude, uint16_t lfsr) +{ + if (lfsr & 1) { + return amplitude; + } + return 0; +} + +static int16_t step_lfsr(uint16_t lfsr, bool uses_7_bit) +{ + bool xor = (lfsr & 1) ^ ((lfsr & 2) >> 1); + lfsr >>= 1; + if (xor) { + lfsr |= 0x4000; + } + if (uses_7_bit) { + lfsr &= ~0x40; + if (xor) { + lfsr |= 0x40; + } + } + return lfsr; +} + +/* General Todo: The APU emulation seems to fail many accuracy tests. It might require a rewrite with + these tests in mind. */ + +static void GB_apu_run_internal(GB_gameboy_t *gb) +{ + while (!__sync_bool_compare_and_swap(&gb->apu_lock, false, true)); + uint32_t steps = gb->apu.apu_cycles / (CPU_FREQUENCY/APU_FREQUENCY); + if (!steps) goto exit; + + gb->apu.apu_cycles %= (CPU_FREQUENCY/APU_FREQUENCY); + for (uint8_t i = 0; i < 4; i++) { + /* Phase */ + gb->apu.wave_channels[i].phase += steps; + while (gb->apu.wave_channels[i].wave_length && gb->apu.wave_channels[i].phase >= gb->apu.wave_channels[i].wave_length) { + if (i == 3) { + gb->apu.lfsr = step_lfsr(gb->apu.lfsr, gb->apu.lfsr_7_bit); + } + + gb->apu.wave_channels[i].phase -= gb->apu.wave_channels[i].wave_length; + } + /* Stop on Length */ + if (gb->apu.wave_channels[i].stop_on_length) { + if (gb->apu.wave_channels[i].sound_length > 0) { + gb->apu.wave_channels[i].sound_length -= steps; + } + if (gb->apu.wave_channels[i].sound_length <= 0) { + gb->apu.wave_channels[i].amplitude = 0; + gb->apu.wave_channels[i].is_playing = false; + gb->apu.wave_channels[i].sound_length = i == 2? APU_FREQUENCY : APU_FREQUENCY / 4; + } + } + } + + gb->apu.envelope_step_timer += steps; + while (gb->apu.envelope_step_timer >= APU_FREQUENCY / 64) { + gb->apu.envelope_step_timer -= APU_FREQUENCY / 64; + for (uint8_t i = 0; i < 4; i++) { + if (gb->apu.wave_channels[i].envelope_steps && !--gb->apu.wave_channels[i].cur_envelope_steps) { + gb->apu.wave_channels[i].amplitude = min(max(gb->apu.wave_channels[i].amplitude + gb->apu.wave_channels[i].envelope_direction * CH_STEP, 0), MAX_CH_AMP); + gb->apu.wave_channels[i].cur_envelope_steps = gb->apu.wave_channels[i].envelope_steps; + } + } + } + + gb->apu.sweep_step_timer += steps; + while (gb->apu.sweep_step_timer >= APU_FREQUENCY / 128) { + gb->apu.sweep_step_timer -= APU_FREQUENCY / 128; + if (gb->apu.wave_channels[0].sweep_steps && !--gb->apu.wave_channels[0].cur_sweep_steps) { + + // Convert back to GB format + uint16_t temp = 2048 - gb->apu.wave_channels[0].wave_length / (APU_FREQUENCY / 131072); + + // Apply sweep + temp = temp + gb->apu.wave_channels[0].sweep_direction * + (temp / (1 << gb->apu.wave_channels[0].sweep_shift)); + if (temp > 2047) { + temp = 0; + } + + // Back to frequency + gb->apu.wave_channels[0].wave_length = (2048 - temp) * (APU_FREQUENCY / 131072); + + + gb->apu.wave_channels[0].cur_sweep_steps = gb->apu.wave_channels[0].sweep_steps; + } + } +exit: + gb->apu_lock = false; +} + +void GB_apu_get_samples_and_update_pcm_regs(GB_gameboy_t *gb, GB_sample_t *samples) +{ + GB_apu_run_internal(gb); + + samples->left = samples->right = 0; + if (!gb->apu.global_enable) { + return; + } + + gb->io_registers[GB_IO_PCM_12] = 0; + gb->io_registers[GB_IO_PCM_34] = 0; + + { + int16_t sample = generate_square(gb->apu.wave_channels[0].phase, + gb->apu.wave_channels[0].wave_length, + gb->apu.wave_channels[0].amplitude, + gb->apu.wave_channels[0].duty); + if (gb->apu.wave_channels[0].left_on ) samples->left += sample; + if (gb->apu.wave_channels[0].right_on) samples->right += sample; + gb->io_registers[GB_IO_PCM_12] = ((int)sample) * 0xF / MAX_CH_AMP; + } + + { + int16_t sample = generate_square(gb->apu.wave_channels[1].phase, + gb->apu.wave_channels[1].wave_length, + gb->apu.wave_channels[1].amplitude, + gb->apu.wave_channels[1].duty); + if (gb->apu.wave_channels[1].left_on ) samples->left += sample; + if (gb->apu.wave_channels[1].right_on) samples->right += sample; + gb->io_registers[GB_IO_PCM_12] |= (((int)sample) * 0xF / MAX_CH_AMP) << 4; + } + + if (gb->apu.wave_channels[2].is_playing) + { + int16_t sample = generate_wave(gb->apu.wave_channels[2].phase, + gb->apu.wave_channels[2].wave_length, + MAX_CH_AMP, + gb->apu.wave_form, + gb->apu.wave_shift); + if (gb->apu.wave_channels[2].left_on ) samples->left += sample; + if (gb->apu.wave_channels[2].right_on) samples->right += sample; + gb->io_registers[GB_IO_PCM_34] = ((int)sample) * 0xF / MAX_CH_AMP; + } + + { + int16_t sample = generate_noise(gb->apu.wave_channels[3].amplitude, + gb->apu.lfsr); + if (gb->apu.wave_channels[3].left_on ) samples->left += sample; + if (gb->apu.wave_channels[3].right_on) samples->right += sample; + gb->io_registers[GB_IO_PCM_34] |= (((int)sample) * 0xF / MAX_CH_AMP) << 4; + } + + samples->left = (int) samples->left * gb->apu.left_volume / 7; + samples->right = (int) samples->right * gb->apu.right_volume / 7; +} + +void GB_apu_run(GB_gameboy_t *gb) +{ + if (gb->sample_rate == 0) { + if (gb->apu.apu_cycles > 0xFF00) { + GB_sample_t dummy; + GB_apu_get_samples_and_update_pcm_regs(gb, &dummy); + } + return; + } + while (gb->audio_copy_in_progress); + double ticks_per_sample = (double) CPU_FREQUENCY / gb->sample_rate; + + if (gb->audio_quality == 0) { + GB_sample_t sample; + GB_apu_get_samples_and_update_pcm_regs(gb, &sample); + gb->current_supersample.left += sample.left; + gb->current_supersample.right += sample.right; + gb->n_subsamples++; + } + else if (gb->audio_quality != 1) { + double ticks_per_subsample = ticks_per_sample / gb->audio_quality; + if (ticks_per_subsample < 1) { + ticks_per_subsample = 1; + } + if (gb->apu_subsample_cycles > ticks_per_subsample) { + gb->apu_subsample_cycles -= ticks_per_subsample; + } + + GB_sample_t sample; + GB_apu_get_samples_and_update_pcm_regs(gb, &sample); + gb->current_supersample.left += sample.left; + gb->current_supersample.right += sample.right; + gb->n_subsamples++; + } + + if (gb->apu_sample_cycles > ticks_per_sample) { + gb->apu_sample_cycles -= ticks_per_sample; + if (gb->audio_position == gb->buffer_size) { + /* + if (!gb->turbo) { + GB_log(gb, "Audio overflow\n"); + } + */ + } + else { + if (gb->audio_quality == 1) { + GB_apu_get_samples_and_update_pcm_regs(gb, &gb->audio_buffer[gb->audio_position++]); + } + else { + gb->audio_buffer[gb->audio_position].left = round(gb->current_supersample.left / gb->n_subsamples); + gb->audio_buffer[gb->audio_position].right = round(gb->current_supersample.right / gb->n_subsamples); + gb->n_subsamples = 0; + gb->current_supersample = (GB_double_sample_t){0, }; + gb->audio_position++; + } + } + } +} + +void GB_apu_copy_buffer(GB_gameboy_t *gb, GB_sample_t *dest, unsigned int count) +{ + gb->audio_copy_in_progress = true; + + if (!gb->audio_stream_started) { + // Intentionally fail the first copy to sync the stream with the Gameboy. + gb->audio_stream_started = true; + gb->audio_position = 0; + } + + if (count > gb->audio_position) { + // GB_log(gb, "Audio underflow: %d\n", count - gb->audio_position); + if (gb->audio_position != 0) { + for (unsigned i = 0; i < count - gb->audio_position; i++) { + dest[gb->audio_position + i] = gb->audio_buffer[gb->audio_position - 1]; + } + } + else { + memset(dest + gb->audio_position, 0, (count - gb->audio_position) * sizeof(*gb->audio_buffer)); + } + count = gb->audio_position; + } + memcpy(dest, gb->audio_buffer, count * sizeof(*gb->audio_buffer)); + memmove(gb->audio_buffer, gb->audio_buffer + count, (gb->audio_position - count) * sizeof(*gb->audio_buffer)); + gb->audio_position -= count; + + gb->audio_copy_in_progress = false; +} + +void GB_apu_init(GB_gameboy_t *gb) +{ + memset(&gb->apu, 0, sizeof(gb->apu)); + gb->apu.wave_channels[0].duty = gb->apu.wave_channels[1].duty = 4; + gb->apu.lfsr = 0x7FFF; + gb->apu.left_volume = 7; + gb->apu.right_volume = 7; + for (int i = 0; i < 4; i++) { + gb->apu.wave_channels[i].left_on = gb->apu.wave_channels[i].right_on = 1; + } +} + +uint8_t GB_apu_read(GB_gameboy_t *gb, uint8_t reg) +{ + GB_apu_run_internal(gb); + + if (reg == GB_IO_NR52) { + uint8_t value = 0; + for (int i = 0; i < 4; i++) { + value >>= 1; + if (gb->apu.wave_channels[i].is_playing) { + value |= 0x8; + } + } + if (gb->apu.global_enable) { + value |= 0x80; + } + value |= 0x70; + return value; + } + + static const char read_mask[GB_IO_WAV_END - GB_IO_NR10 + 1] = { + /* NRX0 NRX1 NRX2 NRX3 NRX4 */ + 0x80, 0x3F, 0x00, 0xFF, 0xBF, // NR1X + 0xFF, 0x3F, 0x00, 0xFF, 0xBF, // NR2X + 0x7F, 0xFF, 0x9F, 0xFF, 0xBF, // NR3X + 0xFF, 0xFF, 0x00, 0x00, 0xBF, // NR4X + 0x00, 0x00, 0x70, 0xFF, 0xFF, // NR5X + + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, // Unused + // Wave RAM + 0, /* ... */ + }; + + if (reg >= GB_IO_WAV_START && reg <= GB_IO_WAV_END && gb->apu.wave_channels[2].is_playing) { + if (gb->apu.wave_channels[2].wave_length == 0) { + return gb->apu.wave_form[0]; + } + gb->apu.wave_channels[2].phase %= gb->apu.wave_channels[2].wave_length; + return gb->apu.wave_form[(int)(gb->apu.wave_channels[2].phase * 32 / gb->apu.wave_channels[2].wave_length)]; + } + + return gb->io_registers[reg] | read_mask[reg - GB_IO_NR10]; +} + +void GB_apu_write(GB_gameboy_t *gb, uint8_t reg, uint8_t value) +{ + GB_apu_run_internal(gb); + + static const uint8_t duties[] = {1, 2, 4, 6}; /* Values are in 1/8 */ + uint8_t channel = 0; + + if (!gb->apu.global_enable && reg != GB_IO_NR52) { + return; + } + + gb->io_registers[reg] = value; + + switch (reg) { + case GB_IO_NR10: + case GB_IO_NR11: + case GB_IO_NR12: + case GB_IO_NR13: + case GB_IO_NR14: + channel = 0; + break; + case GB_IO_NR21: + case GB_IO_NR22: + case GB_IO_NR23: + case GB_IO_NR24: + channel = 1; + break; + case GB_IO_NR33: + case GB_IO_NR34: + channel = 2; + break; + case GB_IO_NR41: + case GB_IO_NR42: + channel = 3; + default: + break; + } + + switch (reg) { + case GB_IO_NR10: + gb->apu.wave_channels[channel].sweep_direction = value & 8? -1 : 1; + gb->apu.wave_channels[channel].cur_sweep_steps = + gb->apu.wave_channels[channel].sweep_steps = (value & 0x70) >> 4; + gb->apu.wave_channels[channel].sweep_shift = value & 7; + break; + case GB_IO_NR11: + case GB_IO_NR21: + case GB_IO_NR41: + gb->apu.wave_channels[channel].duty = duties[value >> 6]; + gb->apu.wave_channels[channel].sound_length = (64 - (value & 0x3F)) * (APU_FREQUENCY / 256); + if (gb->apu.wave_channels[channel].sound_length == 0) { + gb->apu.wave_channels[channel].is_playing = false; + } + break; + case GB_IO_NR12: + case GB_IO_NR22: + case GB_IO_NR42: + gb->apu.wave_channels[channel].start_amplitude = + gb->apu.wave_channels[channel].amplitude = CH_STEP * (value >> 4); + if (value >> 4 == 0) { + gb->apu.wave_channels[channel].is_playing = false; + } + gb->apu.wave_channels[channel].envelope_direction = value & 8? 1 : -1; + gb->apu.wave_channels[channel].cur_envelope_steps = + gb->apu.wave_channels[channel].envelope_steps = value & 7; + break; + case GB_IO_NR13: + case GB_IO_NR23: + case GB_IO_NR33: + gb->apu.wave_channels[channel].NRX3_X4_temp = (gb->apu.wave_channels[channel].NRX3_X4_temp & 0xFF00) | value; + gb->apu.wave_channels[channel].wave_length = (2048 - gb->apu.wave_channels[channel].NRX3_X4_temp) * (APU_FREQUENCY / 131072); + if (channel == 2) { + gb->apu.wave_channels[channel].wave_length *= 2; + } + break; + case GB_IO_NR14: + case GB_IO_NR24: + case GB_IO_NR34: + gb->apu.wave_channels[channel].stop_on_length = value & 0x40; + if ((value & 0x80) && (channel != 2 || gb->apu.wave_enable)) { + gb->apu.wave_channels[channel].is_playing = true; + gb->apu.wave_channels[channel].phase = 0; + gb->apu.wave_channels[channel].amplitude = gb->apu.wave_channels[channel].start_amplitude; + gb->apu.wave_channels[channel].cur_envelope_steps = gb->apu.wave_channels[channel].envelope_steps; + } + + gb->apu.wave_channels[channel].NRX3_X4_temp = (gb->apu.wave_channels[channel].NRX3_X4_temp & 0xFF) | ((value & 0x7) << 8); + gb->apu.wave_channels[channel].wave_length = (2048 - gb->apu.wave_channels[channel].NRX3_X4_temp) * (APU_FREQUENCY / 131072); + if (channel == 2) { + gb->apu.wave_channels[channel].wave_length *= 2; + } + break; + case GB_IO_NR30: + gb->apu.wave_enable = value & 0x80; + gb->apu.wave_channels[2].is_playing &= gb->apu.wave_enable; + break; + case GB_IO_NR31: + gb->apu.wave_channels[2].sound_length = (256 - value) * (APU_FREQUENCY / 256); + if (gb->apu.wave_channels[2].sound_length == 0) { + gb->apu.wave_channels[2].is_playing = false; + } + break; + case GB_IO_NR32: + gb->apu.wave_shift = ((value >> 5) + 3) & 3; + if (gb->apu.wave_shift == 3) { + gb->apu.wave_shift = 4; + } + break; + case GB_IO_NR43: + { + double r = value & 0x7; + if (r == 0) r = 0.5; + uint8_t s = value >> 4; + gb->apu.wave_channels[3].wave_length = r * (1 << s) * (APU_FREQUENCY / 262144) ; + gb->apu.lfsr_7_bit = value & 0x8; + break; + } + case GB_IO_NR44: + gb->apu.wave_channels[3].stop_on_length = value & 0x40; + if (value & 0x80) { + gb->apu.wave_channels[3].is_playing = true; + gb->apu.lfsr = 0x7FFF; + gb->apu.wave_channels[3].amplitude = gb->apu.wave_channels[3].start_amplitude; + gb->apu.wave_channels[3].cur_envelope_steps = gb->apu.wave_channels[3].envelope_steps; + } + break; + + case GB_IO_NR50: + gb->apu.left_volume = (value & 7); + gb->apu.right_volume = ((value >> 4) & 7); + break; + + case GB_IO_NR51: + for (int i = 0; i < 4; i++) { + gb->apu.wave_channels[i].left_on = value & 1; + gb->apu.wave_channels[i].right_on = value & 0x10; + value >>= 1; + } + break; + case GB_IO_NR52: + + if ((value & 0x80) && !gb->apu.global_enable) { + GB_apu_init(gb); + gb->apu.global_enable = true; + } + else if (!(value & 0x80) && gb->apu.global_enable) { + memset(&gb->apu, 0, sizeof(gb->apu)); + memset(gb->io_registers + GB_IO_NR10, 0, GB_IO_WAV_START - GB_IO_NR10); + } + break; + + default: + if (reg >= GB_IO_WAV_START && reg <= GB_IO_WAV_END) { + gb->apu.wave_form[(reg - GB_IO_WAV_START) * 2] = value >> 4; + gb->apu.wave_form[(reg - GB_IO_WAV_START) * 2 + 1] = value & 0xF; + } + break; + } +} + +void GB_set_audio_quality(GB_gameboy_t *gb, unsigned quality) +{ + gb->audio_quality = quality; +} + +unsigned GB_apu_get_current_buffer_length(GB_gameboy_t *gb) +{ + return gb->audio_position; +} diff --git a/waterbox/sameboy/apu.h b/waterbox/sameboy/apu.h new file mode 100644 index 0000000000..ffc530e693 --- /dev/null +++ b/waterbox/sameboy/apu.h @@ -0,0 +1,78 @@ +#ifndef apu_h +#define apu_h +#include +#include +#include "gb_struct_def.h" +/* Divides nicely and never overflows with 4 channels */ +#define MAX_CH_AMP 0x1E00 +#define CH_STEP (0x1E00/0xF) + + +typedef struct +{ + int16_t left; + int16_t right; +} GB_sample_t; + +typedef struct +{ + double left; + double right; +} GB_double_sample_t; + +/* Not all used on all channels */ +/* All lengths are in APU ticks */ +typedef struct +{ + uint32_t phase; + uint32_t wave_length; + int32_t sound_length; + bool stop_on_length; + uint8_t duty; + int16_t amplitude; + int16_t start_amplitude; + uint8_t envelope_steps; + uint8_t cur_envelope_steps; + int8_t envelope_direction; + uint8_t sweep_steps; + uint8_t cur_sweep_steps; + int8_t sweep_direction; + uint8_t sweep_shift; + bool is_playing; + uint16_t NRX3_X4_temp; + bool left_on; + bool right_on; +} GB_apu_channel_t; + +typedef struct +{ + uint16_t apu_cycles; + bool global_enable; + uint32_t envelope_step_timer; + uint32_t sweep_step_timer; + int8_t wave_form[32]; + uint8_t wave_shift; + bool wave_enable; + uint16_t lfsr; + bool lfsr_7_bit; + uint8_t left_volume; + uint8_t right_volume; + GB_apu_channel_t wave_channels[4]; +} GB_apu_t; + +void GB_set_sample_rate(GB_gameboy_t *gb, unsigned int sample_rate); +/* Quality is the number of subsamples per sampling, for the sake of resampling. + 1 means on resampling at all, 0 is maximum quality. Default is 4. */ +void GB_set_audio_quality(GB_gameboy_t *gb, unsigned quality); +void GB_apu_copy_buffer(GB_gameboy_t *gb, GB_sample_t *dest, unsigned int count); +unsigned GB_apu_get_current_buffer_length(GB_gameboy_t *gb); + +#ifdef GB_INTERNAL +void GB_apu_write(GB_gameboy_t *gb, uint8_t reg, uint8_t value); +uint8_t GB_apu_read(GB_gameboy_t *gb, uint8_t reg); +void GB_apu_get_samples_and_update_pcm_regs(GB_gameboy_t *gb, GB_sample_t *samples); +void GB_apu_init(GB_gameboy_t *gb); +void GB_apu_run(GB_gameboy_t *gb); +#endif + +#endif /* apu_h */ diff --git a/waterbox/sameboy/camera.c b/waterbox/sameboy/camera.c new file mode 100644 index 0000000000..9b34998af3 --- /dev/null +++ b/waterbox/sameboy/camera.c @@ -0,0 +1,149 @@ +#include "gb.h" + +static int noise_seed = 0; + +/* This is not a complete emulation of the camera chip. Only the features used by the GameBoy Camera ROMs are supported. + We also do not emulate the timing of the real cart, as it might be actually faster than the webcam. */ + +static uint8_t generate_noise(uint8_t x, uint8_t y) +{ + int value = (x + y * 128 + noise_seed); + uint8_t *data = (uint8_t *) &value; + unsigned hash = 0; + + while ((int *) data != &value + 1) { + hash ^= (*data << 8); + if (hash & 0x8000) { + hash ^= 0x8a00; + hash ^= *data; + } + data++; + hash <<= 1; + } + return (hash >> 8); +} + +static long get_processed_color(GB_gameboy_t *gb, uint8_t x, uint8_t y) +{ + if (x >= 128) { + x = 0; + } + if (y >= 112) { + y = 0; + } + + long color = gb->camera_get_pixel_callback? gb->camera_get_pixel_callback(gb, x, y) : (generate_noise(x, y)); + + static const double gain_values[] = + {0.8809390, 0.9149149, 0.9457498, 0.9739758, + 1.0000000, 1.0241412, 1.0466537, 1.0677433, + 1.0875793, 1.1240310, 1.1568911, 1.1868043, + 1.2142561, 1.2396208, 1.2743837, 1.3157323, + 1.3525190, 1.3856512, 1.4157897, 1.4434309, + 1.4689574, 1.4926697, 1.5148087, 1.5355703, + 1.5551159, 1.5735801, 1.5910762, 1.6077008, + 1.6235366, 1.6386550, 1.6531183, 1.6669808}; + /* Multiply color by gain value */ + color *= gain_values[gb->camera_registers[GB_CAMERA_GAIN_AND_EDGE_ENHACEMENT_FLAGS] & 0x1F]; + + + /* Color is multiplied by the exposure register to simulate exposure. */ + color = color * ((gb->camera_registers[GB_CAMERA_EXPOSURE_HIGH] << 8) + gb->camera_registers[GB_CAMERA_EXPOSURE_LOW]) / 0x1000; + + return color; +} + +uint8_t GB_camera_read_image(GB_gameboy_t *gb, uint16_t addr) +{ + if (gb->camera_registers[GB_CAMERA_SHOOT_AND_1D_FLAGS] & 1) { + /* Forbid reading the image while the camera is busy. */ + return 0xFF; + } + uint8_t tile_x = addr / 0x10 % 0x10; + uint8_t tile_y = addr / 0x10 / 0x10; + + uint8_t y = ((addr >> 1) & 0x7) + tile_y * 8; + uint8_t bit = addr & 1; + + uint8_t ret = 0; + + for (uint8_t x = tile_x * 8; x < tile_x * 8 + 8; x++) { + + long color = get_processed_color(gb, x, y); + + static const double edge_enhancement_ratios[] = {0.5, 0.75, 1, 1.25, 2, 3, 4, 5}; + double edge_enhancement_ratio = edge_enhancement_ratios[(gb->camera_registers[GB_CAMERA_EDGE_ENHANCEMENT_INVERT_AND_VOLTAGE] >> 4) & 0x7]; + if ((gb->camera_registers[GB_CAMERA_GAIN_AND_EDGE_ENHACEMENT_FLAGS] & 0xE0) == 0xE0) { + color += (color * 4) * edge_enhancement_ratio; + color -= get_processed_color(gb, x - 1, y) * edge_enhancement_ratio; + color -= get_processed_color(gb, x + 1, y) * edge_enhancement_ratio; + color -= get_processed_color(gb, x, y - 1) * edge_enhancement_ratio; + color -= get_processed_color(gb, x, y + 1) * edge_enhancement_ratio; + } + + + /* The camera's registers are used as a threshold pattern, which defines the dithering */ + uint8_t pattern_base = ((x & 3) + (y & 3) * 4) * 3 + GB_CAMERA_DITHERING_PATTERN_START; + + if (color < gb->camera_registers[pattern_base]) { + color = 3; + } + else if (color < gb->camera_registers[pattern_base + 1]) { + color = 2; + } + else if (color < gb->camera_registers[pattern_base + 2]) { + color = 1; + } + else { + color = 0; + } + + ret <<= 1; + ret |= (color >> bit) & 1; + } + + return ret; +} + +void GB_set_camera_get_pixel_callback(GB_gameboy_t *gb, GB_camera_get_pixel_callback_t callback) +{ + gb->camera_get_pixel_callback = callback; +} + +void GB_set_camera_update_request_callback(GB_gameboy_t *gb, GB_camera_update_request_callback_t callback) +{ + gb->camera_update_request_callback = callback; +} + +void GB_camera_updated(GB_gameboy_t *gb) +{ + gb->camera_registers[GB_CAMERA_SHOOT_AND_1D_FLAGS] &= ~1; +} + +void GB_camera_write_register(GB_gameboy_t *gb, uint16_t addr, uint8_t value) +{ + addr &= 0x7F; + if (addr == GB_CAMERA_SHOOT_AND_1D_FLAGS) { + value &= 0x7; + noise_seed = rand(); + if ((value & 1) && !(gb->camera_registers[GB_CAMERA_SHOOT_AND_1D_FLAGS] & 1) && gb->camera_update_request_callback) { + /* If no callback is set, ignore the write as if the camera is instantly done */ + gb->camera_registers[GB_CAMERA_SHOOT_AND_1D_FLAGS] |= 1; + gb->camera_update_request_callback(gb); + } + } + else { + if (addr >= 0x36) { + GB_log(gb, "Wrote invalid camera register %02x: %2x\n", addr, value); + return; + } + gb->camera_registers[addr] = value; + } +} +uint8_t GB_camera_read_register(GB_gameboy_t *gb, uint16_t addr) +{ + if ((addr & 0x7F) == 0) { + return gb->camera_registers[GB_CAMERA_SHOOT_AND_1D_FLAGS]; + } + return 0; +} diff --git a/waterbox/sameboy/camera.h b/waterbox/sameboy/camera.h new file mode 100644 index 0000000000..21c69b68e6 --- /dev/null +++ b/waterbox/sameboy/camera.h @@ -0,0 +1,29 @@ +#ifndef camera_h +#define camera_h +#include +#include "gb_struct_def.h" + +typedef uint8_t (*GB_camera_get_pixel_callback_t)(GB_gameboy_t *gb, uint8_t x, uint8_t y); +typedef void (*GB_camera_update_request_callback_t)(GB_gameboy_t *gb); + +enum { + GB_CAMERA_SHOOT_AND_1D_FLAGS = 0, + GB_CAMERA_GAIN_AND_EDGE_ENHACEMENT_FLAGS = 1, + GB_CAMERA_EXPOSURE_HIGH = 2, + GB_CAMERA_EXPOSURE_LOW = 3, + GB_CAMERA_EDGE_ENHANCEMENT_INVERT_AND_VOLTAGE = 4, + GB_CAMERA_DITHERING_PATTERN_START = 6, + GB_CAMERA_DITHERING_PATTERN_END = 0x35, +}; + +uint8_t GB_camera_read_image(GB_gameboy_t *gb, uint16_t addr); + +void GB_set_camera_get_pixel_callback(GB_gameboy_t *gb, GB_camera_get_pixel_callback_t callback); +void GB_set_camera_update_request_callback(GB_gameboy_t *gb, GB_camera_update_request_callback_t callback); + +void GB_camera_updated(GB_gameboy_t *gb); + +void GB_camera_write_register(GB_gameboy_t *gb, uint16_t addr, uint8_t value); +uint8_t GB_camera_read_register(GB_gameboy_t *gb, uint16_t addr); + +#endif diff --git a/waterbox/sameboy/debugger.c b/waterbox/sameboy/debugger.c new file mode 100644 index 0000000000..7fc7b2a9a6 --- /dev/null +++ b/waterbox/sameboy/debugger.c @@ -0,0 +1,1850 @@ +#include +#include +#include +#include "gb.h" + +typedef struct { + bool has_bank; + uint16_t bank:9; + uint16_t value; +} value_t; + +typedef struct { + enum { + LVALUE_MEMORY, + LVALUE_REG16, + LVALUE_REG_H, + LVALUE_REG_L, + } kind; + union { + uint16_t *register_address; + value_t memory_address; + }; +} lvalue_t; + +#define VALUE_16(x) ((value_t){false, 0, (x)}) + +struct GB_breakpoint_s { + union { + struct { + uint16_t addr; + uint16_t bank; /* -1 = any bank*/ + }; + uint32_t key; /* For sorting and comparing */ + }; + char *condition; +}; + +#define BP_KEY(x) (((struct GB_breakpoint_s){.addr = ((x).value), .bank = (x).has_bank? (x).bank : -1 }).key) + +#define GB_WATCHPOINT_R (1) +#define GB_WATCHPOINT_W (2) + +struct GB_watchpoint_s { + union { + struct { + uint16_t addr; + uint16_t bank; /* -1 = any bank*/ + }; + uint32_t key; /* For sorting and comparing */ + }; + char *condition; + uint8_t flags; +}; + +#define WP_KEY(x) (((struct GB_watchpoint_s){.addr = ((x).value), .bank = (x).has_bank? (x).bank : -1 }).key) + +static uint16_t bank_for_addr(GB_gameboy_t *gb, uint16_t addr) +{ + if (addr < 0x4000) { + return gb->mbc_rom0_bank; + } + + if (addr < 0x8000) { + return gb->mbc_rom_bank; + } + + if (addr < 0xD000) { + return 0; + } + + if (addr < 0xE000) { + return gb->cgb_ram_bank; + } + + return 0; +} + +typedef struct { + uint16_t rom0_bank; + uint16_t rom_bank; + uint8_t mbc_ram_bank; + bool mbc_ram_enable; + uint8_t ram_bank; + uint8_t vram_bank; +} banking_state_t; + +static inline void save_banking_state(GB_gameboy_t *gb, banking_state_t *state) +{ + state->rom0_bank = gb->mbc_rom0_bank; + state->rom_bank = gb->mbc_rom_bank; + state->mbc_ram_bank = gb->mbc_ram_bank; + state->mbc_ram_enable = gb->mbc_ram_enable; + state->ram_bank = gb->cgb_ram_bank; + state->vram_bank = gb->cgb_vram_bank; +} + +static inline void restore_banking_state(GB_gameboy_t *gb, banking_state_t *state) +{ + + gb->mbc_rom0_bank = state->rom0_bank; + gb->mbc_rom_bank = state->rom_bank; + gb->mbc_ram_bank = state->mbc_ram_bank; + gb->mbc_ram_enable = state->mbc_ram_enable; + gb->cgb_ram_bank = state->ram_bank; + gb->cgb_vram_bank = state->vram_bank; +} + +static inline void switch_banking_state(GB_gameboy_t *gb, uint16_t bank) +{ + gb->mbc_rom0_bank = bank; + gb->mbc_rom_bank = bank; + gb->mbc_ram_bank = bank; + gb->mbc_ram_enable = true; + if (gb->is_cgb) { + gb->cgb_ram_bank = bank & 7; + gb->cgb_vram_bank = bank & 1; + } +} + +static const char *value_to_string(GB_gameboy_t *gb, uint16_t value, bool prefer_name) +{ + static __thread char output[256]; + const GB_bank_symbol_t *symbol = GB_debugger_find_symbol(gb, value); + + if (symbol && (value - symbol->addr > 0x1000 || symbol->addr == 0) ) { + symbol = NULL; + } + + /* Avoid overflow */ + if (symbol && strlen(symbol->name) > 240) { + symbol = NULL; + } + + if (!symbol) { + sprintf(output, "$%04x", value); + } + + else if (symbol->addr == value) { + if (prefer_name) { + sprintf(output, "%s ($%04x)", symbol->name, value); + } + else { + sprintf(output, "$%04x (%s)", value, symbol->name); + } + } + + else { + if (prefer_name) { + sprintf(output, "%s+$%03x ($%04x)", symbol->name, value - symbol->addr, value); + } + else { + sprintf(output, "$%04x (%s+$%03x)", value, symbol->name, value - symbol->addr); + } + } + return output; +} + +static const char *debugger_value_to_string(GB_gameboy_t *gb, value_t value, bool prefer_name) +{ + if (!value.has_bank) return value_to_string(gb, value.value, prefer_name); + + static __thread char output[256]; + const GB_bank_symbol_t *symbol = GB_map_find_symbol(gb->bank_symbols[value.bank], value.value); + + if (symbol && (value.value - symbol->addr > 0x1000 || symbol->addr == 0) ) { + symbol = NULL; + } + + /* Avoid overflow */ + if (symbol && strlen(symbol->name) > 240) { + symbol = NULL; + } + + if (!symbol) { + sprintf(output, "$%02x:$%04x", value.bank, value.value); + } + + else if (symbol->addr == value.value) { + if (prefer_name) { + sprintf(output, "%s ($%02x:$%04x)", symbol->name, value.bank, value.value); + } + else { + sprintf(output, "$%02x:$%04x (%s)", value.bank, value.value, symbol->name); + } + } + + else { + if (prefer_name) { + sprintf(output, "%s+$%03x ($%02x:$%04x)", symbol->name, value.value - symbol->addr, value.bank, value.value); + } + else { + sprintf(output, "$%02x:$%04x (%s+$%03x)", value.bank, value.value, symbol->name, value.value - symbol->addr); + } + } + return output; +} + +static value_t read_lvalue(GB_gameboy_t *gb, lvalue_t lvalue) +{ + /* Not used until we add support for operators like += */ + switch (lvalue.kind) { + case LVALUE_MEMORY: + if (lvalue.memory_address.has_bank) { + banking_state_t state; + save_banking_state(gb, &state); + switch_banking_state(gb, lvalue.memory_address.bank); + value_t r = VALUE_16(GB_read_memory(gb, lvalue.memory_address.value)); + restore_banking_state(gb, &state); + return r; + } + return VALUE_16(GB_read_memory(gb, lvalue.memory_address.value)); + + case LVALUE_REG16: + return VALUE_16(*lvalue.register_address); + + case LVALUE_REG_L: + return VALUE_16(*lvalue.register_address & 0x00FF); + + case LVALUE_REG_H: + return VALUE_16(*lvalue.register_address >> 8); + } +} + +static void write_lvalue(GB_gameboy_t *gb, lvalue_t lvalue, uint16_t value) +{ + switch (lvalue.kind) { + case LVALUE_MEMORY: + if (lvalue.memory_address.has_bank) { + banking_state_t state; + save_banking_state(gb, &state); + switch_banking_state(gb, lvalue.memory_address.bank); + GB_write_memory(gb, lvalue.memory_address.value, value); + restore_banking_state(gb, &state); + return; + } + GB_write_memory(gb, lvalue.memory_address.value, value); + return; + + case LVALUE_REG16: + *lvalue.register_address = value; + return; + + case LVALUE_REG_L: + *lvalue.register_address &= 0xFF00; + *lvalue.register_address |= value & 0xFF; + return; + + case LVALUE_REG_H: + *lvalue.register_address &= 0x00FF; + *lvalue.register_address |= value << 8; + return; + } +} + +/* 16 bit value 16 bit value = 16 bit value + 25 bit address 16 bit value = 25 bit address + 16 bit value 25 bit address = 25 bit address + 25 bit address 25 bit address = 16 bit value (since adding pointers, for examples, makes no sense) + + Boolean operators always return a 16-bit value + */ +#define FIX_BANK(x) ((value_t){a.has_bank ^ b.has_bank, a.has_bank? a.bank : b.bank, (x)}) + +static value_t add(value_t a, value_t b) {return FIX_BANK(a.value + b.value);} +static value_t sub(value_t a, value_t b) {return FIX_BANK(a.value - b.value);} +static value_t mul(value_t a, value_t b) {return FIX_BANK(a.value * b.value);} +static value_t _div(value_t a, value_t b) { + if (b.value == 0) { + return FIX_BANK(0); + } + return FIX_BANK(a.value / b.value); +}; +static value_t mod(value_t a, value_t b) { + if (b.value == 0) { + return FIX_BANK(0); + } + return FIX_BANK(a.value % b.value); +}; +static value_t and(value_t a, value_t b) {return FIX_BANK(a.value & b.value);} +static value_t or(value_t a, value_t b) {return FIX_BANK(a.value | b.value);} +static value_t xor(value_t a, value_t b) {return FIX_BANK(a.value ^ b.value);} +static value_t shleft(value_t a, value_t b) {return FIX_BANK(a.value << b.value);} +static value_t shright(value_t a, value_t b) {return FIX_BANK(a.value >> b.value);} +static value_t assign(GB_gameboy_t *gb, lvalue_t a, uint16_t b) +{ + write_lvalue(gb, a, b); + return read_lvalue(gb, a); +} + +static value_t bool_and(value_t a, value_t b) {return VALUE_16(a.value && b.value);} +static value_t bool_or(value_t a, value_t b) {return VALUE_16(a.value || b.value);} +static value_t equals(value_t a, value_t b) {return VALUE_16(a.value == b.value);} +static value_t different(value_t a, value_t b) {return VALUE_16(a.value != b.value);} +static value_t lower(value_t a, value_t b) {return VALUE_16(a.value < b.value);} +static value_t greater(value_t a, value_t b) {return VALUE_16(a.value > b.value);} +static value_t lower_equals(value_t a, value_t b) {return VALUE_16(a.value <= b.value);} +static value_t greater_equals(value_t a, value_t b) {return VALUE_16(a.value >= b.value);} +static value_t bank(value_t a, value_t b) {return (value_t) {true, a.value, b.value};} + + +static struct { + const char *string; + char priority; + value_t (*operator)(value_t, value_t); + value_t (*lvalue_operator)(GB_gameboy_t *, lvalue_t, uint16_t); +} operators[] = +{ + // Yes. This is not C-like. But it makes much more sense. + // Deal with it. + {"+", 0, add}, + {"-", 0, sub}, + {"||", 0, bool_or}, + {"|", 0, or}, + {"*", 1, mul}, + {"/", 1, _div}, + {"%", 1, mod}, + {"&&", 1, bool_and}, + {"&", 1, and}, + {"^", 1, xor}, + {"<<", 2, shleft}, + {"<=", 3, lower_equals}, + {"<", 3, lower}, + {">>", 2, shright}, + {">=", 3, greater_equals}, + {">", 3, greater}, + {"==", 3, equals}, + {"=", -1, NULL, assign}, + {"!=", 3, different}, + {":", 4, bank}, +}; + +value_t debugger_evaluate(GB_gameboy_t *gb, const char *string, + size_t length, bool *error, + uint16_t *watchpoint_address, uint8_t *watchpoint_new_value); + +static lvalue_t debugger_evaluate_lvalue(GB_gameboy_t *gb, const char *string, + size_t length, bool *error, + uint16_t *watchpoint_address, uint8_t *watchpoint_new_value) +{ + *error = false; + // Strip whitespace + while (length && (string[0] == ' ' || string[0] == '\n' || string[0] == '\r' || string[0] == '\t')) { + string++; + length--; + } + while (length && (string[length-1] == ' ' || string[length-1] == '\n' || string[length-1] == '\r' || string[length-1] == '\t')) { + length--; + } + if (length == 0) + { + GB_log(gb, "Expected expression.\n"); + *error = true; + return (lvalue_t){0,}; + } + if (string[0] == '(' && string[length - 1] == ')') { + // Attempt to strip parentheses + signed int depth = 0; + for (int i = 0; i < length; i++) { + if (string[i] == '(') depth++; + if (depth == 0) { + // First and last are not matching + depth = 1; + break; + } + if (string[i] == ')') depth--; + } + if (depth == 0) return debugger_evaluate_lvalue(gb, string + 1, length - 2, error, watchpoint_address, watchpoint_new_value); + } + else if (string[0] == '[' && string[length - 1] == ']') { + // Attempt to strip square parentheses (memory dereference) + signed int depth = 0; + for (int i = 0; i < length; i++) { + if (string[i] == '[') depth++; + if (depth == 0) { + // First and last are not matching + depth = 1; + break; + } + if (string[i] == ']') depth--; + } + if (depth == 0) { + return (lvalue_t){LVALUE_MEMORY, .memory_address = debugger_evaluate(gb, string + 1, length - 2, error, watchpoint_address, watchpoint_new_value)}; + } + } + + // Registers + if (string[0] != '$' && (string[0] < '0' || string[0] > '9')) { + if (length == 1) { + switch (string[0]) { + case 'a': return (lvalue_t){LVALUE_REG_H, .register_address = &gb->registers[GB_REGISTER_AF]}; + case 'f': return (lvalue_t){LVALUE_REG_L, .register_address = &gb->registers[GB_REGISTER_AF]}; + case 'b': return (lvalue_t){LVALUE_REG_H, .register_address = &gb->registers[GB_REGISTER_BC]}; + case 'c': return (lvalue_t){LVALUE_REG_L, .register_address = &gb->registers[GB_REGISTER_BC]}; + case 'd': return (lvalue_t){LVALUE_REG_H, .register_address = &gb->registers[GB_REGISTER_DE]}; + case 'e': return (lvalue_t){LVALUE_REG_L, .register_address = &gb->registers[GB_REGISTER_DE]}; + case 'h': return (lvalue_t){LVALUE_REG_H, .register_address = &gb->registers[GB_REGISTER_HL]}; + case 'l': return (lvalue_t){LVALUE_REG_L, .register_address = &gb->registers[GB_REGISTER_HL]}; + } + } + else if (length == 2) { + switch (string[0]) { + case 'a': if (string[1] == 'f') return (lvalue_t){LVALUE_REG16, .register_address = &gb->registers[GB_REGISTER_AF]}; + case 'b': if (string[1] == 'c') return (lvalue_t){LVALUE_REG16, .register_address = &gb->registers[GB_REGISTER_BC]}; + case 'd': if (string[1] == 'e') return (lvalue_t){LVALUE_REG16, .register_address = &gb->registers[GB_REGISTER_DE]}; + case 'h': if (string[1] == 'l') return (lvalue_t){LVALUE_REG16, .register_address = &gb->registers[GB_REGISTER_HL]}; + case 's': if (string[1] == 'p') return (lvalue_t){LVALUE_REG16, .register_address = &gb->registers[GB_REGISTER_SP]}; + case 'p': if (string[1] == 'c') return (lvalue_t){LVALUE_REG16, .register_address = &gb->pc}; + } + } + GB_log(gb, "Unknown register: %.*s\n", (unsigned int) length, string); + *error = true; + return (lvalue_t){0,}; + } + + GB_log(gb, "Expression is not an lvalue: %.*s\n", (unsigned int) length, string); + *error = true; + return (lvalue_t){0,}; +} + +#define ERROR ((value_t){0,}) +value_t debugger_evaluate(GB_gameboy_t *gb, const char *string, + size_t length, bool *error, + uint16_t *watchpoint_address, uint8_t *watchpoint_new_value) +{ + /* Disable watchpoints while evaulating expressions */ + uint16_t n_watchpoints = gb->n_watchpoints; + gb->n_watchpoints = 0; + + value_t ret = ERROR; + + *error = false; + // Strip whitespace + while (length && (string[0] == ' ' || string[0] == '\n' || string[0] == '\r' || string[0] == '\t')) { + string++; + length--; + } + while (length && (string[length-1] == ' ' || string[length-1] == '\n' || string[length-1] == '\r' || string[length-1] == '\t')) { + length--; + } + if (length == 0) + { + GB_log(gb, "Expected expression.\n"); + *error = true; + goto exit; + } + if (string[0] == '(' && string[length - 1] == ')') { + // Attempt to strip parentheses + signed int depth = 0; + for (int i = 0; i < length; i++) { + if (string[i] == '(') depth++; + if (depth == 0) { + // First and last are not matching + depth = 1; + break; + } + if (string[i] == ')') depth--; + } + if (depth == 0) { + ret = debugger_evaluate(gb, string + 1, length - 2, error, watchpoint_address, watchpoint_new_value); + goto exit; + } + } + else if (string[0] == '[' && string[length - 1] == ']') { + // Attempt to strip square parentheses (memory dereference) + signed int depth = 0; + for (int i = 0; i < length; i++) { + if (string[i] == '[') depth++; + if (depth == 0) { + // First and last are not matching + depth = 1; + break; + } + if (string[i] == ']') depth--; + } + + if (depth == 0) { + value_t addr = debugger_evaluate(gb, string + 1, length - 2, error, watchpoint_address, watchpoint_new_value); + banking_state_t state; + if (addr.bank) { + save_banking_state(gb, &state); + switch_banking_state(gb, addr.bank); + } + ret = VALUE_16(GB_read_memory(gb, addr.value)); + if (addr.bank) { + restore_banking_state(gb, &state); + } + goto exit; + } + + } + // Search for lowest priority operator + signed int depth = 0; + unsigned int operator_index = -1; + unsigned int operator_pos = 0; + for (int i = 0; i < length; i++) { + if (string[i] == '(') depth++; + else if (string[i] == ')') depth--; + else if (string[i] == '[') depth++; + else if (string[i] == ']') depth--; + else if (depth == 0) { + for (int j = 0; j < sizeof(operators) / sizeof(operators[0]); j++) { + if (strlen(operators[j].string) > length - i) continue; // Operator too big. + // Priority higher than what we already have. + if (operator_index != -1 && operators[operator_index].priority < operators[j].priority) continue; + unsigned long operator_length = strlen(operators[j].string); + if (memcmp(string + i, operators[j].string, operator_length) == 0) { + // Found an operator! + operator_pos = i; + operator_index = j; + /* for supporting = vs ==, etc*/ + i += operator_length - 1; + break; + } + } + } + } + if (operator_index != -1) { + unsigned int right_start = (unsigned int)(operator_pos + strlen(operators[operator_index].string)); + value_t right = debugger_evaluate(gb, string + right_start, length - right_start, error, watchpoint_address, watchpoint_new_value); + if (*error) goto exit; + if (operators[operator_index].lvalue_operator) { + lvalue_t left = debugger_evaluate_lvalue(gb, string, operator_pos, error, watchpoint_address, watchpoint_new_value); + if (*error) goto exit; + ret = operators[operator_index].lvalue_operator(gb, left, right.value); + goto exit; + } + value_t left = debugger_evaluate(gb, string, operator_pos, error, watchpoint_address, watchpoint_new_value); + if (*error) goto exit; + ret = operators[operator_index].operator(left, right); + goto exit; + } + + // Not an expression - must be a register or a literal + + // Registers + if (string[0] != '$' && (string[0] < '0' || string[0] > '9')) { + if (length == 1) { + switch (string[0]) { + case 'a': ret = VALUE_16(gb->registers[GB_REGISTER_AF] >> 8); goto exit; + case 'f': ret = VALUE_16(gb->registers[GB_REGISTER_AF] & 0xFF); goto exit; + case 'b': ret = VALUE_16(gb->registers[GB_REGISTER_BC] >> 8); goto exit; + case 'c': ret = VALUE_16(gb->registers[GB_REGISTER_BC] & 0xFF); goto exit; + case 'd': ret = VALUE_16(gb->registers[GB_REGISTER_DE] >> 8); goto exit; + case 'e': ret = VALUE_16(gb->registers[GB_REGISTER_DE] & 0xFF); goto exit; + case 'h': ret = VALUE_16(gb->registers[GB_REGISTER_HL] >> 8); goto exit; + case 'l': ret = VALUE_16(gb->registers[GB_REGISTER_HL] & 0xFF); goto exit; + } + } + else if (length == 2) { + switch (string[0]) { + case 'a': if (string[1] == 'f') {ret = VALUE_16(gb->registers[GB_REGISTER_AF]); goto exit;} + case 'b': if (string[1] == 'c') {ret = VALUE_16(gb->registers[GB_REGISTER_BC]); goto exit;} + case 'd': if (string[1] == 'e') {ret = VALUE_16(gb->registers[GB_REGISTER_DE]); goto exit;} + case 'h': if (string[1] == 'l') {ret = VALUE_16(gb->registers[GB_REGISTER_HL]); goto exit;} + case 's': if (string[1] == 'p') {ret = VALUE_16(gb->registers[GB_REGISTER_SP]); goto exit;} + case 'p': if (string[1] == 'c') {ret = (value_t){true, bank_for_addr(gb, gb->pc), gb->pc}; goto exit;} + } + } + else if (length == 3) { + if (watchpoint_address && memcmp(string, "old", 3) == 0) { + ret = VALUE_16(GB_read_memory(gb, *watchpoint_address)); + goto exit; + } + + if (watchpoint_new_value && memcmp(string, "new", 3) == 0) { + ret = VALUE_16(*watchpoint_new_value); + goto exit; + } + + /* $new is identical to $old in read conditions */ + if (watchpoint_address && memcmp(string, "new", 3) == 0) { + ret = VALUE_16(GB_read_memory(gb, *watchpoint_address)); + goto exit; + } + } + + char symbol_name[length + 1]; + memcpy(symbol_name, string, length); + symbol_name[length] = 0; + const GB_symbol_t *symbol = GB_reversed_map_find_symbol(&gb->reversed_symbol_map, symbol_name); + if (symbol) { + ret = (value_t){true, symbol->bank, symbol->addr}; + goto exit; + } + + GB_log(gb, "Unknown register or symbol: %.*s\n", (unsigned int) length, string); + *error = true; + goto exit; + } + + char *end; + int base = 10; + if (string[0] == '$') { + string++; + base = 16; + length--; + } + uint16_t literal = (uint16_t) (strtol(string, &end, base)); + if (end != string + length) { + GB_log(gb, "Failed to parse: %.*s\n", (unsigned int) length, string); + *error = true; + goto exit; + } + ret = VALUE_16(literal); +exit: + gb->n_watchpoints = n_watchpoints; + return ret; +} + +struct debugger_command_s; +typedef bool debugger_command_imp_t(GB_gameboy_t *gb, char *arguments, char *modifiers, const struct debugger_command_s *command); + +typedef struct debugger_command_s { + const char *command; + uint8_t min_length; + debugger_command_imp_t *implementation; + const char *help_string; // Null if should not appear in help + const char *arguments_format; // For usage message + const char *modifiers_format; // For usage message +} debugger_command_t; + +static const char *lstrip(const char *str) +{ + while (*str == ' ' || *str == '\t') { + str++; + } + return str; +} + +#define STOPPED_ONLY \ +if (!gb->debug_stopped) { \ +GB_log(gb, "Program is running. \n"); \ +return false; \ +} + +#define NO_MODIFIERS \ +if (modifiers) { \ +print_usage(gb, command); \ +return true; \ +} + +static void print_usage(GB_gameboy_t *gb, const debugger_command_t *command) +{ + GB_log(gb, "Usage: %s", command->command); + + if (command->modifiers_format) { + GB_log(gb, "[/%s]", command->modifiers_format); + } + + if (command->arguments_format) { + GB_log(gb, " %s", command->arguments_format); + } + + GB_log(gb, "\n"); +} + +static bool cont(GB_gameboy_t *gb, char *arguments, char *modifiers, const debugger_command_t *command) +{ + NO_MODIFIERS + STOPPED_ONLY + + if (strlen(lstrip(arguments))) { + print_usage(gb, command); + return true; + } + + gb->debug_stopped = false; + return false; +} + +static bool next(GB_gameboy_t *gb, char *arguments, char *modifiers, const debugger_command_t *command) +{ + NO_MODIFIERS + STOPPED_ONLY + + if (strlen(lstrip(arguments))) { + print_usage(gb, command); + return true; + } + + gb->debug_stopped = false; + gb->debug_next_command = true; + gb->debug_call_depth = 0; + return false; +} + +static bool step(GB_gameboy_t *gb, char *arguments, char *modifiers, const debugger_command_t *command) +{ + NO_MODIFIERS + STOPPED_ONLY + + if (strlen(lstrip(arguments))) { + print_usage(gb, command); + return true; + } + + return false; +} + +static bool finish(GB_gameboy_t *gb, char *arguments, char *modifiers, const debugger_command_t *command) +{ + NO_MODIFIERS + STOPPED_ONLY + + if (strlen(lstrip(arguments))) { + print_usage(gb, command); + return true; + } + + gb->debug_stopped = false; + gb->debug_fin_command = true; + gb->debug_call_depth = 0; + return false; +} + +static bool stack_leak_detection(GB_gameboy_t *gb, char *arguments, char *modifiers, const debugger_command_t *command) +{ + NO_MODIFIERS + STOPPED_ONLY + + if (strlen(lstrip(arguments))) { + print_usage(gb, command); + return true; + } + + gb->debug_stopped = false; + gb->stack_leak_detection = true; + gb->debug_call_depth = 0; + return false; +} + +static bool registers(GB_gameboy_t *gb, char *arguments, char *modifiers, const debugger_command_t *command) +{ + NO_MODIFIERS + if (strlen(lstrip(arguments))) { + print_usage(gb, command); + return true; + } + + GB_log(gb, "AF = $%04x\n", gb->registers[GB_REGISTER_AF]); /* AF can't really be an address */ + GB_log(gb, "BC = %s\n", value_to_string(gb, gb->registers[GB_REGISTER_BC], false)); + GB_log(gb, "DE = %s\n", value_to_string(gb, gb->registers[GB_REGISTER_DE], false)); + GB_log(gb, "HL = %s\n", value_to_string(gb, gb->registers[GB_REGISTER_HL], false)); + GB_log(gb, "SP = %s\n", value_to_string(gb, gb->registers[GB_REGISTER_SP], false)); + GB_log(gb, "PC = %s\n", value_to_string(gb, gb->pc, false)); + return true; +} + +/* Find the index of the closest breakpoint equal or greater to addr */ +static uint16_t find_breakpoint(GB_gameboy_t *gb, value_t addr) +{ + if (!gb->breakpoints) { + return 0; + } + + uint32_t key = BP_KEY(addr); + + int min = 0; + int max = gb->n_breakpoints; + while (min < max) { + uint16_t pivot = (min + max) / 2; + if (gb->breakpoints[pivot].key == key) return pivot; + if (gb->breakpoints[pivot].key > key) { + max = pivot; + } + else { + min = pivot + 1; + } + } + return (uint16_t) min; +} + +static bool breakpoint(GB_gameboy_t *gb, char *arguments, char *modifiers, const debugger_command_t *command) +{ + NO_MODIFIERS + if (strlen(lstrip(arguments)) == 0) { + print_usage(gb, command); + return true; + } + + if (gb->n_breakpoints == (typeof(gb->n_breakpoints)) -1) { + GB_log(gb, "Too many breakpoints set\n"); + return true; + } + + char *condition = NULL; + if ((condition = strstr(arguments, " if "))) { + *condition = 0; + condition += strlen(" if "); + /* Verify condition is sane (Todo: This might have side effects!) */ + bool error; + debugger_evaluate(gb, condition, (unsigned int)strlen(condition), &error, NULL, NULL); + if (error) return true; + + } + + bool error; + value_t result = debugger_evaluate(gb, arguments, (unsigned int)strlen(arguments), &error, NULL, NULL); + uint32_t key = BP_KEY(result); + + if (error) return true; + + uint16_t index = find_breakpoint(gb, result); + if (index < gb->n_breakpoints && gb->breakpoints[index].key == key) { + GB_log(gb, "Breakpoint already set at %s\n", debugger_value_to_string(gb, result, true)); + if (!gb->breakpoints[index].condition && condition) { + GB_log(gb, "Added condition to breakpoint\n"); + gb->breakpoints[index].condition = strdup(condition); + } + else if (gb->breakpoints[index].condition && condition) { + GB_log(gb, "Replaced breakpoint condition\n"); + free(gb->breakpoints[index].condition); + gb->breakpoints[index].condition = strdup(condition); + } + else if (gb->breakpoints[index].condition && !condition) { + GB_log(gb, "Removed breakpoint condition\n"); + free(gb->breakpoints[index].condition); + gb->breakpoints[index].condition = NULL; + } + return true; + } + + gb->breakpoints = realloc(gb->breakpoints, (gb->n_breakpoints + 1) * sizeof(gb->breakpoints[0])); + memmove(&gb->breakpoints[index + 1], &gb->breakpoints[index], (gb->n_breakpoints - index) * sizeof(gb->breakpoints[0])); + gb->breakpoints[index].key = key; + + if (condition) { + gb->breakpoints[index].condition = strdup(condition); + } + else { + gb->breakpoints[index].condition = NULL; + } + gb->n_breakpoints++; + + GB_log(gb, "Breakpoint set at %s\n", debugger_value_to_string(gb, result, true)); + return true; +} + +static bool delete(GB_gameboy_t *gb, char *arguments, char *modifiers, const debugger_command_t *command) +{ + NO_MODIFIERS + if (strlen(lstrip(arguments)) == 0) { + for (unsigned i = gb->n_breakpoints; i--;) { + if (gb->breakpoints[i].condition) { + free(gb->breakpoints[i].condition); + } + } + free(gb->breakpoints); + gb->breakpoints = NULL; + gb->n_breakpoints = 0; + return true; + } + + bool error; + value_t result = debugger_evaluate(gb, arguments, (unsigned int)strlen(arguments), &error, NULL, NULL); + uint32_t key = BP_KEY(result); + + if (error) return true; + + uint16_t index = find_breakpoint(gb, result); + if (index >= gb->n_breakpoints || gb->breakpoints[index].key != key) { + GB_log(gb, "No breakpoint set at %s\n", debugger_value_to_string(gb, result, true)); + return true; + } + + if (gb->breakpoints[index].condition) { + free(gb->breakpoints[index].condition); + } + + memmove(&gb->breakpoints[index], &gb->breakpoints[index + 1], (gb->n_breakpoints - index - 1) * sizeof(gb->breakpoints[0])); + gb->n_breakpoints--; + gb->breakpoints = realloc(gb->breakpoints, gb->n_breakpoints * sizeof(gb->breakpoints[0])); + + GB_log(gb, "Breakpoint removed from %s\n", debugger_value_to_string(gb, result, true)); + return true; +} + +/* Find the index of the closest watchpoint equal or greater to addr */ +static uint16_t find_watchpoint(GB_gameboy_t *gb, value_t addr) +{ + if (!gb->watchpoints) { + return 0; + } + uint32_t key = WP_KEY(addr); + int min = 0; + int max = gb->n_watchpoints; + while (min < max) { + uint16_t pivot = (min + max) / 2; + if (gb->watchpoints[pivot].key == key) return pivot; + if (gb->watchpoints[pivot].key > key) { + max = pivot; + } + else { + min = pivot + 1; + } + } + return (uint16_t) min; +} + +static bool watch(GB_gameboy_t *gb, char *arguments, char *modifiers, const debugger_command_t *command) +{ + if (strlen(lstrip(arguments)) == 0) { +print_usage: + print_usage(gb, command); + return true; + } + + if (gb->n_watchpoints == (typeof(gb->n_watchpoints)) -1) { + GB_log(gb, "Too many watchpoints set\n"); + return true; + } + + if (!modifiers) { + modifiers = "w"; + } + + uint8_t flags = 0; + while (*modifiers) { + switch (*modifiers) { + case 'r': + flags |= GB_WATCHPOINT_R; + break; + case 'w': + flags |= GB_WATCHPOINT_W; + break; + default: + goto print_usage; + } + modifiers++; + } + + if (!flags) { + goto print_usage; + } + + char *condition = NULL; + if ((condition = strstr(arguments, " if "))) { + *condition = 0; + condition += strlen(" if "); + /* Verify condition is sane (Todo: This might have side effects!) */ + bool error; + /* To make $new and $old legal */ + uint16_t dummy = 0; + uint8_t dummy2 = 0; + debugger_evaluate(gb, condition, (unsigned int)strlen(condition), &error, &dummy, &dummy2); + if (error) return true; + + } + + bool error; + value_t result = debugger_evaluate(gb, arguments, (unsigned int)strlen(arguments), &error, NULL, NULL); + uint32_t key = WP_KEY(result); + + if (error) return true; + + uint16_t index = find_watchpoint(gb, result); + if (index < gb->n_watchpoints && gb->watchpoints[index].key == key) { + GB_log(gb, "Watchpoint already set at %s\n", debugger_value_to_string(gb, result, true)); + if (gb->watchpoints[index].flags != flags) { + GB_log(gb, "Modified watchpoint type\n"); + gb->watchpoints[index].flags = flags; + } + if (!gb->watchpoints[index].condition && condition) { + GB_log(gb, "Added condition to watchpoint\n"); + gb->watchpoints[index].condition = strdup(condition); + } + else if (gb->watchpoints[index].condition && condition) { + GB_log(gb, "Replaced watchpoint condition\n"); + free(gb->watchpoints[index].condition); + gb->watchpoints[index].condition = strdup(condition); + } + else if (gb->watchpoints[index].condition && !condition) { + GB_log(gb, "Removed watchpoint condition\n"); + free(gb->watchpoints[index].condition); + gb->watchpoints[index].condition = NULL; + } + return true; + } + + gb->watchpoints = realloc(gb->watchpoints, (gb->n_watchpoints + 1) * sizeof(gb->watchpoints[0])); + memmove(&gb->watchpoints[index + 1], &gb->watchpoints[index], (gb->n_watchpoints - index) * sizeof(gb->watchpoints[0])); + gb->watchpoints[index].key = key; + gb->watchpoints[index].flags = flags; + if (condition) { + gb->watchpoints[index].condition = strdup(condition); + } + else { + gb->watchpoints[index].condition = NULL; + } + gb->n_watchpoints++; + + GB_log(gb, "Watchpoint set at %s\n", debugger_value_to_string(gb, result, true)); + return true; +} + +static bool unwatch(GB_gameboy_t *gb, char *arguments, char *modifiers, const debugger_command_t *command) +{ + NO_MODIFIERS + if (strlen(lstrip(arguments)) == 0) { + for (unsigned i = gb->n_watchpoints; i--;) { + if (gb->watchpoints[i].condition) { + free(gb->watchpoints[i].condition); + } + } + free(gb->watchpoints); + gb->watchpoints = NULL; + gb->n_watchpoints = 0; + return true; + } + + bool error; + value_t result = debugger_evaluate(gb, arguments, (unsigned int)strlen(arguments), &error, NULL, NULL); + uint32_t key = WP_KEY(result); + + if (error) return true; + + uint16_t index = find_watchpoint(gb, result); + if (index >= gb->n_watchpoints || gb->watchpoints[index].key != key) { + GB_log(gb, "No watchpoint set at %s\n", debugger_value_to_string(gb, result, true)); + return true; + } + + if (gb->watchpoints[index].condition) { + free(gb->watchpoints[index].condition); + } + + memmove(&gb->watchpoints[index], &gb->watchpoints[index + 1], (gb->n_watchpoints - index - 1) * sizeof(gb->watchpoints[0])); + gb->n_watchpoints--; + gb->watchpoints = realloc(gb->watchpoints, gb->n_watchpoints* sizeof(gb->watchpoints[0])); + + GB_log(gb, "Watchpoint removed from %s\n", debugger_value_to_string(gb, result, true)); + return true; +} + +static bool list(GB_gameboy_t *gb, char *arguments, char *modifiers, const debugger_command_t *command) +{ + NO_MODIFIERS + if (strlen(lstrip(arguments))) { + print_usage(gb, command); + return true; + } + + if (gb->n_breakpoints == 0) { + GB_log(gb, "No breakpoints set.\n"); + } + else { + GB_log(gb, "%d breakpoint(s) set:\n", gb->n_breakpoints); + for (uint16_t i = 0; i < gb->n_breakpoints; i++) { + value_t addr = (value_t){gb->breakpoints[i].bank != (uint16_t)-1, gb->breakpoints[i].bank, gb->breakpoints[i].addr}; + if (gb->breakpoints[i].condition) { + GB_log(gb, " %d. %s (Condition: %s)\n", i + 1, + debugger_value_to_string(gb, addr, addr.has_bank), + gb->breakpoints[i].condition); + } + else { + GB_log(gb, " %d. %s\n", i + 1, debugger_value_to_string(gb, addr, addr.has_bank)); + } + } + } + + if (gb->n_watchpoints == 0) { + GB_log(gb, "No watchpoints set.\n"); + } + else { + GB_log(gb, "%d watchpoint(s) set:\n", gb->n_watchpoints); + for (uint16_t i = 0; i < gb->n_watchpoints; i++) { + value_t addr = (value_t){gb->watchpoints[i].bank != (uint16_t)-1, gb->watchpoints[i].bank, gb->watchpoints[i].addr}; + if (gb->watchpoints[i].condition) { + GB_log(gb, " %d. %s (%c%c, Condition: %s)\n", i + 1, debugger_value_to_string(gb, addr, addr.has_bank), + (gb->watchpoints[i].flags & GB_WATCHPOINT_R)? 'r' : '-', + (gb->watchpoints[i].flags & GB_WATCHPOINT_W)? 'w' : '-', + gb->watchpoints[i].condition); + } + else { + GB_log(gb, " %d. %s (%c%c)\n", i + 1, debugger_value_to_string(gb,addr, addr.has_bank), + (gb->watchpoints[i].flags & GB_WATCHPOINT_R)? 'r' : '-', + (gb->watchpoints[i].flags & GB_WATCHPOINT_W)? 'w' : '-'); + } + } + } + + return true; +} + +static bool _should_break(GB_gameboy_t *gb, value_t addr) +{ + uint16_t index = find_breakpoint(gb, addr); + uint32_t key = BP_KEY(addr); + + if (index < gb->n_breakpoints && gb->breakpoints[index].key == key) { + if (!gb->breakpoints[index].condition) { + return true; + } + bool error; + bool condition = debugger_evaluate(gb, gb->breakpoints[index].condition, + (unsigned int)strlen(gb->breakpoints[index].condition), &error, NULL, NULL).value; + if (error) { + /* Should never happen */ + GB_log(gb, "An internal error has occured\n"); + return true; + } + return condition; + } + return false; +} + +static bool should_break(GB_gameboy_t *gb, uint16_t addr) +{ + /* Try any-bank breakpoint */ + value_t full_addr = (VALUE_16(addr)); + if (_should_break(gb, full_addr)) return true; + + /* Try bank-specific breakpoint */ + full_addr.has_bank = true; + full_addr.bank = bank_for_addr(gb, addr); + return _should_break(gb, full_addr); +} + +static bool print(GB_gameboy_t *gb, char *arguments, char *modifiers, const debugger_command_t *command) +{ + if (strlen(lstrip(arguments)) == 0) { + print_usage(gb, command); + return true; + } + + if (!modifiers || !modifiers[0]) { + modifiers = "a"; + } + else if (modifiers[1]) { + print_usage(gb, command); + return true; + } + + bool error; + value_t result = debugger_evaluate(gb, arguments, (unsigned int)strlen(arguments), &error, NULL, NULL); + if (!error) { + switch (modifiers[0]) { + case 'a': + GB_log(gb, "=%s\n", debugger_value_to_string(gb, result, false)); + break; + case 'd': + GB_log(gb, "=%d\n", result.value); + break; + case 'x': + GB_log(gb, "=$%x\n", result.value); + break; + case 'o': + GB_log(gb, "=0%o\n", result.value); + break; + case 'b': + { + if (!result.value) { + GB_log(gb, "=%%0\n"); + break; + } + char binary[17]; + binary[16] = 0; + char *ptr = &binary[16]; + while (result.value) { + *(--ptr) = (result.value & 1)? '1' : '0'; + result.value >>= 1; + } + GB_log(gb, "=%%%s\n", ptr); + break; + } + default: + break; + } + } + return true; +} + +static bool examine(GB_gameboy_t *gb, char *arguments, char *modifiers, const debugger_command_t *command) +{ + if (strlen(lstrip(arguments)) == 0) { + print_usage(gb, command); + return true; + } + + bool error; + value_t addr = debugger_evaluate(gb, arguments, (unsigned int)strlen(arguments), &error, NULL, NULL); + uint16_t count = 32; + + if (modifiers) { + char *end; + count = (uint16_t) (strtol(modifiers, &end, 10)); + if (*end) { + print_usage(gb, command); + return true; + } + } + + if (!error) { + if (addr.has_bank) { + banking_state_t old_state; + save_banking_state(gb, &old_state); + switch_banking_state(gb, addr.bank); + + while (count) { + GB_log(gb, "%02x:%04x: ", addr.bank, addr.value); + for (int i = 0; i < 16 && count; i++) { + GB_log(gb, "%02x ", GB_read_memory(gb, addr.value + i)); + count--; + } + addr.value += 16; + GB_log(gb, "\n"); + } + + restore_banking_state(gb, &old_state); + } + else { + while (count) { + GB_log(gb, "%04x: ", addr.value); + for (int i = 0; i < 16 && count; i++) { + GB_log(gb, "%02x ", GB_read_memory(gb, addr.value + i)); + count--; + } + addr.value += 16; + GB_log(gb, "\n"); + } + } + } + return true; +} + +static bool disassemble(GB_gameboy_t *gb, char *arguments, char *modifiers, const debugger_command_t *command) +{ + if (strlen(lstrip(arguments)) == 0) { + arguments = "pc"; + } + + bool error; + value_t addr = debugger_evaluate(gb, arguments, (unsigned int)strlen(arguments), &error, NULL, NULL); + uint16_t count = 5; + + if (modifiers) { + char *end; + count = (uint16_t) (strtol(modifiers, &end, 10)); + if (*end) { + print_usage(gb, command); + return true; + } + } + + if (!error) { + if (addr.has_bank) { + banking_state_t old_state; + save_banking_state(gb, &old_state); + switch_banking_state(gb, addr.bank); + + GB_cpu_disassemble(gb, addr.value, count); + + restore_banking_state(gb, &old_state); + } + else { + GB_cpu_disassemble(gb, addr.value, count); + } + } + return true; +} + +static bool mbc(GB_gameboy_t *gb, char *arguments, char *modifiers, const debugger_command_t *command) +{ + NO_MODIFIERS + + if (strlen(lstrip(arguments))) { + print_usage(gb, command); + return true; + } + + const GB_cartridge_t *cartridge = gb->cartridge_type; + + if (cartridge->has_ram) { + GB_log(gb, "Cartrdige includes%s RAM: $%x bytes\n", cartridge->has_battery? " battery-backed": "", gb->mbc_ram_size); + } + else { + GB_log(gb, "No cartridge RAM\n"); + } + + if (cartridge->mbc_type) { + static const char * const mapper_names[] = { + [GB_MBC1] = "MBC1", + [GB_MBC2] = "MBC2", + [GB_MBC3] = "MBC3", + [GB_MBC5] = "MBC5", + [GB_HUC1] = "HUC1", + [GB_HUC3] = "HUC3", + }; + GB_log(gb, "%s\n", mapper_names[cartridge->mbc_type]); + GB_log(gb, "Current mapped ROM bank: %x\n", gb->mbc_rom_bank); + if (cartridge->has_ram) { + GB_log(gb, "Current mapped RAM bank: %x\n", gb->mbc_ram_bank); + GB_log(gb, "RAM is curently %s\n", gb->mbc_ram_enable? "enabled" : "disabled"); + } + if (cartridge->mbc_type == GB_MBC1 && gb->mbc1_wiring == GB_STANDARD_MBC1_WIRING) { + GB_log(gb, "MBC1 banking mode is %s\n", gb->mbc1.mode == 1 ? "RAM" : "ROM"); + } + if (cartridge->mbc_type == GB_MBC1 && gb->mbc1_wiring == GB_MBC1M_WIRING) { + GB_log(gb, "MBC1 uses MBC1M wiring. \n"); + GB_log(gb, "Current mapped ROM0 bank: %x\n", gb->mbc_rom0_bank); + GB_log(gb, "MBC1 multicart banking mode is %s\n", gb->mbc1.mode == 1 ? "enabled" : "disabled"); + } + + } + else { + GB_log(gb, "No MBC\n"); + } + + if (cartridge->has_rumble) { + GB_log(gb, "Cart contains a rumble pak\n"); + } + + if (cartridge->has_rtc) { + GB_log(gb, "Cart contains a real time clock\n"); + } + + return true; +} + +static bool backtrace(GB_gameboy_t *gb, char *arguments, char *modifiers, const debugger_command_t *command) +{ + NO_MODIFIERS + + if (strlen(lstrip(arguments))) { + print_usage(gb, command); + return true; + } + + GB_log(gb, " 1. %s\n", debugger_value_to_string(gb, (value_t){true, bank_for_addr(gb, gb->pc), gb->pc}, true)); + for (unsigned int i = gb->backtrace_size; i--;) { + GB_log(gb, "%3d. %s\n", gb->backtrace_size - i + 1, debugger_value_to_string(gb, (value_t){true, gb->backtrace_returns[i].bank, gb->backtrace_returns[i].addr}, true)); + } + + return true; +} + +static bool ticks(GB_gameboy_t *gb, char *arguments, char *modifiers, const debugger_command_t *command) +{ + NO_MODIFIERS + STOPPED_ONLY + + if (strlen(lstrip(arguments))) { + print_usage(gb, command); + return true; + } + + GB_log(gb, "Ticks: %lu. (Resetting)\n", gb->debugger_ticks); + gb->debugger_ticks = 0; + + return true; +} + + +static bool palettes(GB_gameboy_t *gb, char *arguments, char *modifiers, const debugger_command_t *command) +{ + NO_MODIFIERS + if (strlen(lstrip(arguments))) { + print_usage(gb, command); + return true; + } + + if (!gb->is_cgb) { + GB_log(gb, "Not available on a DMG.\n"); + return true; + } + + GB_log(gb, "Background palettes: \n"); + for (unsigned i = 0; i < 32; i++) { + GB_log(gb, "%04x ", ((uint16_t *)&gb->background_palettes_data)[i]); + if (i % 4 == 3) { + GB_log(gb, "\n"); + } + } + + GB_log(gb, "Sprites palettes: \n"); + for (unsigned i = 0; i < 32; i++) { + GB_log(gb, "%04x ", ((uint16_t *)&gb->sprite_palettes_data)[i]); + if (i % 4 == 3) { + GB_log(gb, "\n"); + } + } + + return true; +} + +static bool lcd(GB_gameboy_t *gb, char *arguments, char *modifiers, const debugger_command_t *command) +{ + NO_MODIFIERS + if (strlen(lstrip(arguments))) { + print_usage(gb, command); + return true; + } + GB_log(gb, "LCDC:\n"); + GB_log(gb, " LCD enabled: %s\n",(gb->io_registers[GB_IO_LCDC] & 128)? "Enabled" : "Disabled"); + GB_log(gb, " %s: %s\n", gb->is_cgb? (gb->cgb_mode? "Sprite priority flags" : "Background and Window") : "Background", + (gb->io_registers[GB_IO_LCDC] & 1)? "Enabled" : "Disabled"); + GB_log(gb, " Objects: %s\n", (gb->io_registers[GB_IO_LCDC] & 2)? "Enabled" : "Disabled"); + GB_log(gb, " Object size: %s\n", (gb->io_registers[GB_IO_LCDC] & 4)? "8x16" : "8x8"); + GB_log(gb, " Background tilemap: %s\n", (gb->io_registers[GB_IO_LCDC] & 8)? "$9C00" : "$9800"); + GB_log(gb, " Background and Window Tileset: %s\n", (gb->io_registers[GB_IO_LCDC] & 16)? "$8000" : "$8800"); + GB_log(gb, " Window: %s\n", (gb->io_registers[GB_IO_LCDC] & 32)? "Enabled" : "Disabled"); + GB_log(gb, " Window tilemap: %s\n", (gb->io_registers[GB_IO_LCDC] & 64)? "$9C00" : "$9800"); + + GB_log(gb, "\nSTAT:\n"); + static const char *modes[] = {"Mode 0, H-Blank", "Mode 1, V-Blank", "Mode 2, OAM", "Mode 3, Rendering"}; + GB_log(gb, " Current mode: %s\n", modes[gb->io_registers[GB_IO_STAT] & 3]); + GB_log(gb, " LYC flag: %s\n", (gb->io_registers[GB_IO_STAT] & 4)? "On" : "Off"); + GB_log(gb, " H-Blank interrupt: %s\n", (gb->io_registers[GB_IO_STAT] & 8)? "Enabled" : "Disabled"); + GB_log(gb, " V-Blank interrupt: %s\n", (gb->io_registers[GB_IO_STAT] & 16)? "Enabled" : "Disabled"); + GB_log(gb, " OAM interrupt: %s\n", (gb->io_registers[GB_IO_STAT] & 32)? "Enabled" : "Disabled"); + GB_log(gb, " LYC interrupt: %s\n", (gb->io_registers[GB_IO_STAT] & 64)? "Enabled" : "Disabled"); + + + GB_log(gb, "\nCycles since frame start: %d\n", gb->display_cycles); + GB_log(gb, "Current line: %d\n", gb->display_cycles / 456); + GB_log(gb, "LY: %d\n", gb->io_registers[GB_IO_LY]); + GB_log(gb, "LYC: %d\n", gb->io_registers[GB_IO_LYC]); + GB_log(gb, "Window position: %d, %d\n", (signed) gb->io_registers[GB_IO_WX] - 7 , gb->io_registers[GB_IO_WY]); + GB_log(gb, "Interrupt line: %s\n", gb->stat_interrupt_line? "On" : "Off"); + + return true; +} + +static bool help(GB_gameboy_t *gb, char *arguments, char *modifiers, const debugger_command_t *command); + +#define HELP_NEWLINE "\n " + +/* Commands without implementations are aliases of the previous non-alias commands */ +static const debugger_command_t commands[] = { + {"continue", 1, cont, "Continue running until next stop"}, + {"next", 1, next, "Run the next instruction, skipping over function calls"}, + {"step", 1, step, "Run the next instruction, stepping into function calls"}, + {"finish", 1, finish, "Run until the current function returns"}, + {"backtrace", 2, backtrace, "Display the current call stack"}, + {"bt", 2, }, /* Alias */ + {"sld", 3, stack_leak_detection, "Like finish, but stops if a stack leak is detected (Experimental)"}, + {"ticks", 2, ticks, "Display the number of CPU ticks since the last time 'ticks' was used"}, + {"registers", 1, registers, "Print values of processor registers and other important registers"}, + {"cartridge", 2, mbc, "Displays information about the MBC and cartridge"}, + {"mbc", 3, }, /* Alias */ + {"lcd", 3, lcd, "Displays information about the current state of the LCD controller"}, + {"palettes", 3, palettes, "Displays the current CGB palettes"}, + {"breakpoint", 1, breakpoint, "Add a new breakpoint at the specified address/expression" HELP_NEWLINE + "Can also modify the condition of existing breakpoints.", + "[ if ]"}, + {"delete", 2, delete, "Delete a breakpoint by its address, or all breakpoints", "[]"}, + {"watch", 1, watch, "Add a new watchpoint at the specified address/expression." HELP_NEWLINE + "Can also modify the condition and type of existing watchpoints." HELP_NEWLINE + "Default watchpoint type is write-only.", + "[ if ]", "(r|w|rw)"}, + {"unwatch", 3, unwatch, "Delete a watchpoint by its address, or all watchpoints", "[]"}, + {"list", 1, list, "List all set breakpoints and watchpoints"}, + {"print", 1, print, "Evaluate and print an expression" HELP_NEWLINE + "Use modifier to format as an address (a, default) or as a number in" HELP_NEWLINE + "decimal (d), hexadecimal (x), octal (o) or binary (b).", + "", "format"}, + {"eval", 2, }, /* Alias */ + {"examine", 2, examine, "Examine values at address", "", "count"}, + {"x", 1, }, /* Alias */ + {"disassemble", 1, disassemble, "Disassemble instructions at address", "", "count"}, + + + {"help", 1, help, "List available commands or show help for the specified command", "[]"}, + {NULL,}, /* Null terminator */ +}; + +static const debugger_command_t *find_command(const char *string) +{ + size_t length = strlen(string); + for (const debugger_command_t *command = commands; command->command; command++) { + if (command->min_length > length) continue; + if (memcmp(command->command, string, length) == 0) { /* Is a substring? */ + /* Aliases */ + while (!command->implementation) { + command--; + } + return command; + } + } + + return NULL; +} + +static void print_command_shortcut(GB_gameboy_t *gb, const debugger_command_t *command) +{ + GB_attributed_log(gb, GB_LOG_BOLD | GB_LOG_UNDERLINE, "%.*s", command->min_length, command->command); + GB_attributed_log(gb, GB_LOG_BOLD , "%s", command->command + command->min_length); +} + +static void print_command_description(GB_gameboy_t *gb, const debugger_command_t *command) +{ + print_command_shortcut(gb, command); + GB_log(gb, ": "); + GB_log(gb, (const char *)&" %s\n" + strlen(command->command), command->help_string); +} + +static bool help(GB_gameboy_t *gb, char *arguments, char *modifiers, const debugger_command_t *ignored) +{ + const debugger_command_t *command = find_command(arguments); + if (command) { + print_command_description(gb, command); + GB_log(gb, "\n"); + print_usage(gb, command); + + command++; + if (command->command && !command->implementation) { /* Command has aliases*/ + GB_log(gb, "\nAliases: "); + do { + print_command_shortcut(gb, command); + GB_log(gb, " "); + command++; + } while (command->command && !command->implementation); + GB_log(gb, "\n"); + } + return true; + } + for (command = commands; command->command; command++) { + if (command->help_string) { + print_command_description(gb, command); + } + } + return true; +} + +void GB_debugger_call_hook(GB_gameboy_t *gb, uint16_t call_addr) +{ + /* Called just after the CPU calls a function/enters an interrupt/etc... */ + + if (gb->stack_leak_detection) { + if (gb->debug_call_depth >= sizeof(gb->sp_for_call_depth) / sizeof(gb->sp_for_call_depth[0])) { + GB_log(gb, "Potential stack overflow detected (Functions nest too much). \n"); + gb->debug_stopped = true; + } + else { + gb->sp_for_call_depth[gb->debug_call_depth] = gb->registers[GB_REGISTER_SP]; + gb->addr_for_call_depth[gb->debug_call_depth] = gb->pc; + } + } + + if (gb->backtrace_size < sizeof(gb->backtrace_sps) / sizeof(gb->backtrace_sps[0])) { + + while (gb->backtrace_size) { + if (gb->backtrace_sps[gb->backtrace_size - 1] < gb->registers[GB_REGISTER_SP]) { + gb->backtrace_size--; + } + else { + break; + } + } + + gb->backtrace_sps[gb->backtrace_size] = gb->registers[GB_REGISTER_SP]; + gb->backtrace_returns[gb->backtrace_size].bank = bank_for_addr(gb, call_addr); + gb->backtrace_returns[gb->backtrace_size].addr = call_addr; + gb->backtrace_size++; + } + + gb->debug_call_depth++; +} + +void GB_debugger_ret_hook(GB_gameboy_t *gb) +{ + /* Called just before the CPU runs ret/reti */ + + gb->debug_call_depth--; + + if (gb->stack_leak_detection) { + if (gb->debug_call_depth < 0) { + GB_log(gb, "Function finished without a stack leak.\n"); + gb->debug_stopped = true; + } + else { + if (gb->registers[GB_REGISTER_SP] != gb->sp_for_call_depth[gb->debug_call_depth]) { + GB_log(gb, "Stack leak detected for function %s!\n", value_to_string(gb, gb->addr_for_call_depth[gb->debug_call_depth], true)); + GB_log(gb, "SP is $%04x, should be $%04x.\n", gb->registers[GB_REGISTER_SP], + gb->sp_for_call_depth[gb->debug_call_depth]); + gb->debug_stopped = true; + } + } + } + + while (gb->backtrace_size) { + if (gb->backtrace_sps[gb->backtrace_size - 1] <= gb->registers[GB_REGISTER_SP]) { + gb->backtrace_size--; + } + else { + break; + } + } +} + +static bool _GB_debugger_test_write_watchpoint(GB_gameboy_t *gb, value_t addr, uint8_t value) +{ + uint16_t index = find_watchpoint(gb, addr); + uint32_t key = WP_KEY(addr); + + if (index < gb->n_watchpoints && gb->watchpoints[index].key == key) { + if (!(gb->watchpoints[index].flags & GB_WATCHPOINT_W)) { + return false; + } + if (!gb->watchpoints[index].condition) { + gb->debug_stopped = true; + GB_log(gb, "Watchpoint: [%s] = $%02x\n", debugger_value_to_string(gb, addr, true), value); + return true; + } + bool error; + bool condition = debugger_evaluate(gb, gb->watchpoints[index].condition, + (unsigned int)strlen(gb->watchpoints[index].condition), &error, &addr.value, &value).value; + if (error) { + /* Should never happen */ + GB_log(gb, "An internal error has occured\n"); + return false; + } + if (condition) { + gb->debug_stopped = true; + GB_log(gb, "Watchpoint: [%s] = $%02x\n", debugger_value_to_string(gb, addr, true), value); + return true; + } + } + return false; +} + +void GB_debugger_test_write_watchpoint(GB_gameboy_t *gb, uint16_t addr, uint8_t value) +{ + if (gb->debug_stopped) return; + + /* Try any-bank breakpoint */ + value_t full_addr = (VALUE_16(addr)); + if (_GB_debugger_test_write_watchpoint(gb, full_addr, value)) return; + + /* Try bank-specific breakpoint */ + full_addr.has_bank = true; + full_addr.bank = bank_for_addr(gb, addr); + _GB_debugger_test_write_watchpoint(gb, full_addr, value); +} + +static bool _GB_debugger_test_read_watchpoint(GB_gameboy_t *gb, value_t addr) +{ + uint16_t index = find_watchpoint(gb, addr); + uint32_t key = WP_KEY(addr); + + if (index < gb->n_watchpoints && gb->watchpoints[index].key == key) { + if (!(gb->watchpoints[index].flags & GB_WATCHPOINT_R)) { + return false; + } + if (!gb->watchpoints[index].condition) { + gb->debug_stopped = true; + GB_log(gb, "Watchpoint: [%s]\n", debugger_value_to_string(gb, addr, true)); + return true; + } + bool error; + bool condition = debugger_evaluate(gb, gb->watchpoints[index].condition, + (unsigned int)strlen(gb->watchpoints[index].condition), &error, &addr.value, NULL).value; + if (error) { + /* Should never happen */ + GB_log(gb, "An internal error has occured\n"); + return false; + } + if (condition) { + gb->debug_stopped = true; + GB_log(gb, "Watchpoint: [%s]\n", debugger_value_to_string(gb, addr, true)); + return true; + } + } + return false; +} + +void GB_debugger_test_read_watchpoint(GB_gameboy_t *gb, uint16_t addr) +{ + if (gb->debug_stopped) return; + + /* Try any-bank breakpoint */ + value_t full_addr = (VALUE_16(addr)); + if (_GB_debugger_test_read_watchpoint(gb, full_addr)) return; + + /* Try bank-specific breakpoint */ + full_addr.has_bank = true; + full_addr.bank = bank_for_addr(gb, addr); + _GB_debugger_test_read_watchpoint(gb, full_addr); +} + +/* Returns true if debugger waits for more commands */ +bool GB_debugger_execute_command(GB_gameboy_t *gb, char *input) +{ + if (!input[0]) { + return true; + } + + char *command_string = input; + char *arguments = strchr(input, ' '); + if (arguments) { + /* Actually "split" the string. */ + arguments[0] = 0; + arguments++; + } + else { + arguments = ""; + } + + char *modifiers = strchr(command_string, '/'); + if (modifiers) { + /* Actually "split" the string. */ + modifiers[0] = 0; + modifiers++; + } + + const debugger_command_t *command = find_command(command_string); + if (command) { + return command->implementation(gb, arguments, modifiers, command); + } + else { + GB_log(gb, "%s: no such command.\n", command_string); + return true; + } +} + +void GB_debugger_run(GB_gameboy_t *gb) +{ + if (gb->debug_disable) return; + + char *input = NULL; + if (gb->debug_next_command && gb->debug_call_depth <= 0) { + gb->debug_stopped = true; + } + if (gb->debug_fin_command && gb->debug_call_depth == -1) { + gb->debug_stopped = true; + } + if (gb->debug_stopped) { + GB_cpu_disassemble(gb, gb->pc, 5); + } +next_command: + if (input) { + free(input); + } + if (gb->breakpoints && !gb->debug_stopped && should_break(gb, gb->pc)) { + gb->debug_stopped = true; + GB_log(gb, "Breakpoint: PC = %s\n", value_to_string(gb, gb->pc, true)); + GB_cpu_disassemble(gb, gb->pc, 5); + } + if (gb->debug_stopped && !gb->debug_disable) { + gb->debug_next_command = false; + gb->debug_fin_command = false; + gb->stack_leak_detection = false; + input = gb->input_callback(gb); + + if (input == NULL) { + /* Debugging is no currently available, continue running */ + gb->debug_stopped = false; + return; + } + + if (GB_debugger_execute_command(gb, input)) { + goto next_command; + } + + free(input); + } +} + +void GB_debugger_handle_async_commands(GB_gameboy_t *gb) +{ + char *input = NULL; + + while (gb->async_input_callback && (input = gb->async_input_callback(gb))) { + GB_debugger_execute_command(gb, input); + free(input); + } +} + +void GB_debugger_load_symbol_file(GB_gameboy_t *gb, const char *path) +{ + FILE *f = fopen(path, "r"); + if (!f) return; + + char *line = NULL; + size_t size = 0; + size_t length = 0; + while ((length = getline(&line, &size, f)) != -1) { + for (unsigned i = 0; i < length; i++) { + if (line[i] == ';' || line[i] == '\n' || line[i] == '\r') { + line[i] = 0; + length = i; + break; + } + } + if (length == 0) continue; + + unsigned int bank, address; + char symbol[length]; + + if (sscanf(line, "%02x:%04x %s", &bank, &address, symbol) == 3) { + bank &= 0x1FF; + if (!gb->bank_symbols[bank]) { + gb->bank_symbols[bank] = GB_map_alloc(); + } + GB_bank_symbol_t *allocated_symbol = GB_map_add_symbol(gb->bank_symbols[bank], address, symbol); + if (allocated_symbol) { + GB_reversed_map_add_symbol(&gb->reversed_symbol_map, bank, allocated_symbol); + } + } + } + free(line); + fclose(f); +} + +const GB_bank_symbol_t *GB_debugger_find_symbol(GB_gameboy_t *gb, uint16_t addr) +{ + uint16_t bank = bank_for_addr(gb, addr); + + const GB_bank_symbol_t *symbol = GB_map_find_symbol(gb->bank_symbols[bank], addr); + if (symbol) return symbol; + if (bank != 0) return GB_map_find_symbol(gb->bank_symbols[0], addr); /* Maybe the symbol incorrectly uses bank 0? */ + + return NULL; +} + +const char *GB_debugger_name_for_address(GB_gameboy_t *gb, uint16_t addr) +{ + const GB_bank_symbol_t *symbol = GB_debugger_find_symbol(gb, addr); + if (symbol && symbol->addr == addr) return symbol->name; + return NULL; +} + +/* The public version of debugger_evaluate */ +bool GB_debugger_evaluate(GB_gameboy_t *gb, const char *string, uint16_t *result, uint16_t *result_bank) +{ + bool error = false; + value_t value = debugger_evaluate(gb, string, strlen(string), &error, NULL, NULL); + if (result) { + *result = value.value; + } + if (result_bank) { + *result_bank = value.has_bank? value.value : -1; + } + return error; +} + +void GB_debugger_break(GB_gameboy_t *gb) +{ + gb->debug_stopped = true; +} + +bool GB_debugger_is_stopped(GB_gameboy_t *gb) +{ + return gb->debug_stopped; +} + +void GB_debugger_set_disabled(GB_gameboy_t *gb, bool disabled) +{ + gb->debug_disable = disabled; +} diff --git a/waterbox/sameboy/debugger.h b/waterbox/sameboy/debugger.h new file mode 100644 index 0000000000..5d6491972c --- /dev/null +++ b/waterbox/sameboy/debugger.h @@ -0,0 +1,32 @@ +#ifndef debugger_h +#define debugger_h +#include +#include +#include "gb_struct_def.h" +#include "symbol_hash.h" + +#ifdef GB_INTERNAL +void GB_debugger_run(GB_gameboy_t *gb); +void GB_debugger_handle_async_commands(GB_gameboy_t *gb); +void GB_debugger_call_hook(GB_gameboy_t *gb, uint16_t call_addr); +void GB_debugger_ret_hook(GB_gameboy_t *gb); +void GB_debugger_test_write_watchpoint(GB_gameboy_t *gb, uint16_t addr, uint8_t value); +void GB_debugger_test_read_watchpoint(GB_gameboy_t *gb, uint16_t addr); +const GB_bank_symbol_t *GB_debugger_find_symbol(GB_gameboy_t *gb, uint16_t addr); +#endif + +#ifdef GB_INTERNAL +bool /* Returns true if debugger waits for more commands. Not relevant for non-GB_INTERNAL */ +#else +void +#endif +GB_debugger_execute_command(GB_gameboy_t *gb, char *input); /* Destroys input. */ + + +void GB_debugger_load_symbol_file(GB_gameboy_t *gb, const char *path); +const char *GB_debugger_name_for_address(GB_gameboy_t *gb, uint16_t addr); +bool GB_debugger_evaluate(GB_gameboy_t *gb, const char *string, uint16_t *result, uint16_t *result_bank); /* result_bank is -1 if unused. */ +void GB_debugger_break(GB_gameboy_t *gb); +bool GB_debugger_is_stopped(GB_gameboy_t *gb); +void GB_debugger_set_disabled(GB_gameboy_t *gb, bool disabled); +#endif /* debugger_h */ diff --git a/waterbox/sameboy/display.c b/waterbox/sameboy/display.c new file mode 100644 index 0000000000..e624ac93b6 --- /dev/null +++ b/waterbox/sameboy/display.c @@ -0,0 +1,800 @@ +#include +#include +#include +#include +#include "gb.h" + +/* + Each line is 456 cycles, approximately: + Mode 2 - 80 cycles / OAM Transfer + Mode 3 - 172 cycles / Rendering + Mode 0 - 204 cycles / HBlank + + Mode 1 is VBlank + + Todo: Mode lengths are not constants, see http://blog.kevtris.org/blogfiles/Nitty%20Gritty%20Gameboy%20VRAM%20Timing.txt + */ + +#define MODE2_LENGTH (80) +#define MODE3_LENGTH (172) +#define MODE0_LENGTH (204) +#define LINE_LENGTH (MODE2_LENGTH + MODE3_LENGTH + MODE0_LENGTH) // = 456 +#define LINES (144) +#define WIDTH (160) +#define VIRTUAL_LINES (LCDC_PERIOD / LINE_LENGTH) // = 154 + +typedef struct __attribute__((packed)) { + uint8_t y; + uint8_t x; + uint8_t tile; + uint8_t flags; +} GB_sprite_t; + +static bool window_enabled(GB_gameboy_t *gb) +{ + if ((gb->io_registers[GB_IO_LCDC] & 0x1) == 0) { + if (!gb->cgb_mode && gb->is_cgb) { + return false; + } + } + return (gb->io_registers[GB_IO_LCDC] & 0x20) && gb->io_registers[GB_IO_WX] < 167; +} + +static uint32_t get_pixel(GB_gameboy_t *gb, uint8_t x, uint8_t y) +{ + /* + Bit 7 - LCD Display Enable (0=Off, 1=On) + Bit 6 - Window Tile Map Display Select (0=9800-9BFF, 1=9C00-9FFF) + Bit 5 - Window Display Enable (0=Off, 1=On) + Bit 4 - BG & Window Tile Data Select (0=8800-97FF, 1=8000-8FFF) + Bit 3 - BG Tile Map Display Select (0=9800-9BFF, 1=9C00-9FFF) + Bit 2 - OBJ (Sprite) Size (0=8x8, 1=8x16) + Bit 1 - OBJ (Sprite) Display Enable (0=Off, 1=On) + Bit 0 - BG Display (for CGB see below) (0=Off, 1=On) + */ + uint16_t map = 0x1800; + uint8_t tile = 0; + uint8_t attributes = 0; + uint8_t sprite_palette = 0; + uint16_t tile_address = 0; + uint8_t background_pixel = 0, sprite_pixel = 0; + GB_sprite_t *sprite = (GB_sprite_t *) &gb->oam; + uint8_t sprites_in_line = 0; + bool lcd_8_16_mode = (gb->io_registers[GB_IO_LCDC] & 4) != 0; + bool sprites_enabled = (gb->io_registers[GB_IO_LCDC] & 2) != 0; + uint8_t lowest_sprite_x = 0xFF; + bool use_obp1 = false, priority = false; + bool in_window = false; + bool bg_enabled = true; + bool bg_behind = false; + if ((gb->io_registers[GB_IO_LCDC] & 0x1) == 0) { + if (gb->cgb_mode) { + bg_behind = true; + } + else { + bg_enabled = false; + } + } + if (window_enabled(gb) && y >= gb->io_registers[GB_IO_WY] && x + 7 >= gb->io_registers[GB_IO_WX] && gb->current_window_line != 0xFF) { + in_window = true; + } + + if (sprites_enabled) { + // Loop all sprites + for (uint8_t i = 40; i--; sprite++) { + int sprite_y = sprite->y - 16; + int sprite_x = sprite->x - 8; + // Is sprite in our line? + if (sprite_y <= y && sprite_y + (lcd_8_16_mode? 16:8) > y) { + uint8_t tile_x, tile_y, current_sprite_pixel; + uint16_t line_address; + // Limit to 10 sprites in one scan line. + if (++sprites_in_line == 11) break; + // Does not overlap our pixel. + if (sprite_x > x || sprite_x + 8 <= x) continue; + tile_x = x - sprite_x; + tile_y = y - sprite_y; + if (sprite->flags & 0x20) tile_x = 7 - tile_x; + if (sprite->flags & 0x40) tile_y = (lcd_8_16_mode? 15:7) - tile_y; + line_address = (lcd_8_16_mode? sprite->tile & 0xFE : sprite->tile) * 0x10 + tile_y * 2; + if (gb->cgb_mode && (sprite->flags & 0x8)) { + line_address += 0x2000; + } + current_sprite_pixel = (((gb->vram[line_address ] >> ((~tile_x)&7)) & 1 ) | + ((gb->vram[line_address + 1] >> ((~tile_x)&7)) & 1) << 1 ); + /* From Pandocs: + When sprites with different x coordinate values overlap, the one with the smaller x coordinate + (closer to the left) will have priority and appear above any others. This applies in Non CGB Mode + only. When sprites with the same x coordinate values overlap, they have priority according to table + ordering. (i.e. $FE00 - highest, $FE04 - next highest, etc.) In CGB Mode priorities are always + assigned like this. + */ + if (current_sprite_pixel != 0) { + if (!gb->cgb_mode && sprite->x >= lowest_sprite_x) { + break; + } + sprite_pixel = current_sprite_pixel; + lowest_sprite_x = sprite->x; + use_obp1 = (sprite->flags & 0x10) != 0; + sprite_palette = sprite->flags & 7; + priority = (sprite->flags & 0x80) != 0; + if (gb->cgb_mode) { + break; + } + } + } + } + } + + if (in_window) { + x -= gb->io_registers[GB_IO_WX] - 7; // Todo: This value is probably latched + y = gb->current_window_line; + } + else { + x += gb->effective_scx; + y += gb->io_registers[GB_IO_SCY]; + } + if (gb->io_registers[GB_IO_LCDC] & 0x08 && !in_window) { + map = 0x1C00; + } + else if (gb->io_registers[GB_IO_LCDC] & 0x40 && in_window) { + map = 0x1C00; + } + tile = gb->vram[map + x/8 + y/8 * 32]; + if (gb->cgb_mode) { + attributes = gb->vram[map + x/8 + y/8 * 32 + 0x2000]; + } + + if (attributes & 0x80) { + priority = !bg_behind && bg_enabled; + } + + if (!priority && sprite_pixel) { + if (!gb->cgb_mode) { + sprite_pixel = (gb->io_registers[use_obp1? GB_IO_OBP1:GB_IO_OBP0] >> (sprite_pixel << 1)) & 3; + sprite_palette = use_obp1; + } + return gb->sprite_palettes_rgb[sprite_palette * 4 + sprite_pixel]; + } + + if (bg_enabled) { + if (gb->io_registers[GB_IO_LCDC] & 0x10) { + tile_address = tile * 0x10; + } + else { + tile_address = (int8_t) tile * 0x10 + 0x1000; + } + if (attributes & 0x8) { + tile_address += 0x2000; + } + + if (attributes & 0x20) { + x = ~x; + } + + if (attributes & 0x40) { + y = ~y; + } + + background_pixel = (((gb->vram[tile_address + (y & 7) * 2 ] >> ((~x)&7)) & 1 ) | + ((gb->vram[tile_address + (y & 7) * 2 + 1] >> ((~x)&7)) & 1) << 1 ); + } + + if (priority && sprite_pixel && !background_pixel) { + if (!gb->cgb_mode) { + sprite_pixel = (gb->io_registers[use_obp1? GB_IO_OBP1:GB_IO_OBP0] >> (sprite_pixel << 1)) & 3; + sprite_palette = use_obp1; + } + return gb->sprite_palettes_rgb[sprite_palette * 4 + sprite_pixel]; + } + + if (!gb->cgb_mode) { + background_pixel = ((gb->io_registers[GB_IO_BGP] >> (background_pixel << 1)) & 3); + } + + return gb->background_palettes_rgb[(attributes & 7) * 4 + background_pixel]; +} + +static void display_vblank(GB_gameboy_t *gb) +{ + if (gb->turbo) { + if (GB_timing_sync_turbo(gb)) { + return; + } + } + + if (!gb->disable_rendering && ((!(gb->io_registers[GB_IO_LCDC] & 0x80) || gb->stopped) || gb->frame_skip_state == GB_FRAMESKIP_LCD_TURNED_ON)) { + /* LCD is off, set screen to white */ + uint32_t white = gb->rgb_encode_callback(gb, 0xFF, 0xFF, 0xFF); + for (unsigned i = 0; i < WIDTH * LINES; i++) { + gb ->screen[i] = white; + } + } + + gb->vblank_callback(gb); + GB_timing_sync(gb); + + gb->vblank_just_occured = true; +} + +static inline uint8_t scale_channel(uint8_t x) +{ + x &= 0x1f; + return (x << 3) | (x >> 2); +} + +void GB_palette_changed(GB_gameboy_t *gb, bool background_palette, uint8_t index) +{ + uint8_t *palette_data = background_palette? gb->background_palettes_data : gb->sprite_palettes_data; + uint16_t color = palette_data[index & ~1] | (palette_data[index | 1] << 8); + + // No need to &, scale channel does that. + uint8_t r = scale_channel(color); + uint8_t g = scale_channel(color >> 5); + uint8_t b = scale_channel(color >> 10); + assert (gb->rgb_encode_callback); + (background_palette? gb->background_palettes_rgb : gb->sprite_palettes_rgb)[index / 2] = gb->rgb_encode_callback(gb, r, g, b); +} + +/* + STAT interrupt is implemented based on this finding: + http://board.byuu.org/phpbb3/viewtopic.php?p=25527#p25531 + + General timing is based on GiiBiiAdvance's documents: + https://github.com/AntonioND/giibiiadvance + + */ + +static void update_display_state(GB_gameboy_t *gb, uint8_t cycles) +{ + uint8_t previous_stat_interrupt_line = gb->stat_interrupt_line; + gb->stat_interrupt_line = false; + + if (!(gb->io_registers[GB_IO_LCDC] & 0x80)) { + /* LCD is disabled, state is constant */ + + /* When the LCD is off, LY is 0 and STAT mode is 0. + Todo: Verify the LY=LYC flag should be on. */ + gb->io_registers[GB_IO_LY] = 0; + gb->io_registers[GB_IO_STAT] &= ~3; + gb->io_registers[GB_IO_STAT] |= 4; + if (gb->hdma_on_hblank) { + gb->hdma_on_hblank = false; + gb->hdma_on = false; + + /* Todo: is this correct? */ + gb->hdma_steps_left = 0xff; + } + + gb->oam_read_blocked = false; + gb->vram_read_blocked = false; + gb->oam_write_blocked = false; + gb->vram_write_blocked = false; + + /* Keep sending vblanks to user even if the screen is off */ + gb->display_cycles += cycles; + if (gb->display_cycles >= LCDC_PERIOD) { + /* VBlank! */ + gb->display_cycles -= LCDC_PERIOD; + display_vblank(gb); + } + + /* Reset window rendering state */ + gb->current_window_line = 0xFF; + return; + } + + uint8_t atomic_increase = gb->cgb_double_speed? 2 : 4; + uint8_t stat_delay = gb->cgb_double_speed? 2 : (gb->cgb_mode? 0 : 4); + /* Todo: This is correct for DMG. Is it correct for the 3 CGB modes (DMG/single/double)?*/ + uint8_t scx_delay = ((gb->effective_scx & 7) + atomic_increase - 1) & ~(atomic_increase - 1); + /* Todo: These are correct for DMG, DMG-mode CGB, and single speed CGB. Is is correct for double speed CGB? */ + uint8_t oam_blocking_rush = gb->cgb_double_speed? 2 : 4; + uint8_t vram_blocking_rush = gb->is_cgb? 0 : 4; + + for (; cycles; cycles -= atomic_increase) { + + gb->display_cycles += atomic_increase; + /* The very first line is 2 (4 from the CPU's perseptive) clocks shorter when the LCD turns on. + Todo: Verify on the 3 CGB modes, especially double speed mode. */ + if (gb->first_scanline && gb->display_cycles >= LINE_LENGTH - atomic_increase) { + gb->first_scanline = false; + gb->display_cycles += atomic_increase; + } + bool should_compare_ly = true; + uint8_t ly_for_comparison = gb->io_registers[GB_IO_LY] = gb->display_cycles / LINE_LENGTH; + + + /* Handle cycle completion. STAT's initial value depends on model and mode */ + if (gb->display_cycles == LCDC_PERIOD) { + /* VBlank! */ + gb->display_cycles = 0; + gb->io_registers[GB_IO_STAT] &= ~3; + if (gb->is_cgb) { + if (stat_delay) { + gb->io_registers[GB_IO_STAT] |= 1; + } + else { + gb->io_registers[GB_IO_STAT] |= 2; + } + } + ly_for_comparison = gb->io_registers[GB_IO_LY] = 0; + + /* Todo: verify timing */ + gb->oam_read_blocked = true; + gb->vram_read_blocked = false; + gb->oam_write_blocked = true; + gb->vram_write_blocked = false; + + + /* Reset window rendering state */ + gb->current_window_line = 0xFF; + } + + /* Entered VBlank state, update STAT and IF */ + else if (gb->display_cycles == LINES * LINE_LENGTH + stat_delay) { + gb->io_registers[GB_IO_STAT] &= ~3; + gb->io_registers[GB_IO_STAT] |= 1; + gb->io_registers[GB_IO_IF] |= 1; + + /* Entering VBlank state triggers the OAM interrupt. In CGB, it happens 4 cycles earlier */ + if (gb->io_registers[GB_IO_STAT] & 0x20 && !gb->is_cgb) { + gb->stat_interrupt_line = true; + } + if (gb->frame_skip_state == GB_FRAMESKIP_LCD_TURNED_ON) { + if (!gb->is_cgb) { + display_vblank(gb); + gb->frame_skip_state = GB_FRAMESKIP_SECOND_FRAME_RENDERED; + } + else { + gb->frame_skip_state = GB_FRAMESKIP_FIRST_FRAME_SKIPPED; + } + } + else { + gb->frame_skip_state = GB_FRAMESKIP_SECOND_FRAME_RENDERED; + display_vblank(gb); + } + } + + + /* Handle line 0 right after turning the LCD on */ + else if (gb->first_scanline) { + /* OAM and VRAM blocking is not rushed in the very first scanline */ + if (gb->display_cycles == atomic_increase) { + gb->io_registers[GB_IO_STAT] &= ~3; + gb->oam_read_blocked = false; + gb->vram_read_blocked = false; + gb->oam_write_blocked = false; + gb->vram_write_blocked = false; + } + else if (gb->display_cycles == MODE2_LENGTH) { + gb->io_registers[GB_IO_STAT] &= ~3; + gb->io_registers[GB_IO_STAT] |= 3; + gb->oam_read_blocked = true; + gb->vram_read_blocked = true; + gb->oam_write_blocked = true; + gb->vram_write_blocked = true; + } + else if (gb->display_cycles == MODE2_LENGTH + MODE3_LENGTH) { + gb->io_registers[GB_IO_STAT] &= ~3; + gb->oam_read_blocked = false; + gb->vram_read_blocked = false; + gb->oam_write_blocked = false; + gb->vram_write_blocked = false; + } + } + + /* Handle STAT changes for lines 0-143 */ + else if (gb->display_cycles < LINES * LINE_LENGTH) { + unsigned position_in_line = gb->display_cycles % LINE_LENGTH; + + /* Handle OAM and VRAM blocking */ + /* Todo: verify CGB timing for write blocking */ + if (position_in_line == stat_delay - oam_blocking_rush || + // In case stat_delay is 0 + (position_in_line == LINE_LENGTH + stat_delay - oam_blocking_rush && gb->io_registers[GB_IO_LY] != 143)) { + gb->oam_read_blocked = true; + gb->oam_write_blocked = gb->is_cgb; + } + else if (position_in_line == MODE2_LENGTH + stat_delay - vram_blocking_rush) { + gb->vram_read_blocked = true; + gb->vram_write_blocked = gb->is_cgb; + } + + if (position_in_line == stat_delay) { + gb->oam_write_blocked = true; + } + else if (!gb->is_cgb && position_in_line == MODE2_LENGTH + stat_delay - oam_blocking_rush) { + gb->oam_write_blocked = false; + } + else if (position_in_line == MODE2_LENGTH + stat_delay) { + gb->vram_write_blocked = true; + gb->oam_write_blocked = true; + } + + /* Handle everything else */ + if (position_in_line == stat_delay) { + gb->io_registers[GB_IO_STAT] &= ~3; + gb->io_registers[GB_IO_STAT] |= 2; + if (window_enabled(gb) && gb->display_cycles / LINE_LENGTH >= gb->io_registers[GB_IO_WY]) { + gb->current_window_line++; + } + } + else if (position_in_line == 0 && gb->display_cycles != 0) { + should_compare_ly = gb->is_cgb; + ly_for_comparison--; + } + else if (position_in_line == MODE2_LENGTH + stat_delay) { + gb->io_registers[GB_IO_STAT] &= ~3; + gb->io_registers[GB_IO_STAT] |= 3; + gb->effective_scx = gb->io_registers[GB_IO_SCX]; + gb->previous_lcdc_x = - (gb->effective_scx & 0x7); + + /* Todo: This works on both 007 - The World Is Not Enough and Donkey Kong 94, but should be verified better */ + if (window_enabled(gb) && gb->display_cycles / LINE_LENGTH == gb->io_registers[GB_IO_WY] && gb->current_window_line == 0xFF) { + gb->current_window_line = 0; + } + } + else if (position_in_line == MODE2_LENGTH + MODE3_LENGTH + stat_delay + scx_delay) { + gb->io_registers[GB_IO_STAT] &= ~3; + gb->oam_read_blocked = false; + gb->vram_read_blocked = false; + gb->oam_write_blocked = false; + gb->vram_write_blocked = false; + if (gb->hdma_on_hblank) { + gb->hdma_on = true; + gb->hdma_cycles = 0; + } + } + } + + /* Line 153 is special */ + else if (gb->display_cycles >= (VIRTUAL_LINES - 1) * LINE_LENGTH) { + /* DMG */ + if (!gb->is_cgb) { + switch (gb->display_cycles - (VIRTUAL_LINES - 1) * LINE_LENGTH) { + case 0: + should_compare_ly = false; + break; + case 4: + gb->io_registers[GB_IO_LY] = 0; + ly_for_comparison = VIRTUAL_LINES - 1; + break; + case 8: + gb->io_registers[GB_IO_LY] = 0; + should_compare_ly = false; + break; + default: + gb->io_registers[GB_IO_LY] = 0; + ly_for_comparison = 0; + } + } + /* CGB in DMG mode */ + else if (!gb->cgb_mode) { + switch (gb->display_cycles - (VIRTUAL_LINES - 1) * LINE_LENGTH) { + case 0: + ly_for_comparison = VIRTUAL_LINES - 2; + break; + case 4: + break; + case 8: + gb->io_registers[GB_IO_LY] = 0; + break; + default: + gb->io_registers[GB_IO_LY] = 0; + ly_for_comparison = 0; + } + } + /* Single speed CGB */ + else if (!gb->cgb_double_speed) { + switch (gb->display_cycles - (VIRTUAL_LINES - 1) * LINE_LENGTH) { + case 0: + break; + case 4: + gb->io_registers[GB_IO_LY] = 0; + break; + default: + gb->io_registers[GB_IO_LY] = 0; + ly_for_comparison = 0; + } + } + + /* Double speed CGB */ + else { + switch (gb->display_cycles - (VIRTUAL_LINES - 1) * LINE_LENGTH) { + case 0: + ly_for_comparison = VIRTUAL_LINES - 2; + break; + case 2: + case 4: + break; + case 6: + case 8: + gb->io_registers[GB_IO_LY] = 0; + break; + default: + gb->io_registers[GB_IO_LY] = 0; + ly_for_comparison = 0; + } + } + } + + /* Lines 144 - 152 */ + else { + if (stat_delay && gb->display_cycles % LINE_LENGTH == 0) { + should_compare_ly = gb->is_cgb; + ly_for_comparison--; + } + } + + /* Set LY=LYC bit */ + if (should_compare_ly && (ly_for_comparison == gb->io_registers[GB_IO_LYC])) { + gb->io_registers[GB_IO_STAT] |= 4; + } + else { + gb->io_registers[GB_IO_STAT] &= ~4; + } + + if (!gb->stat_interrupt_line) { + switch (gb->io_registers[GB_IO_STAT] & 3) { + case 0: gb->stat_interrupt_line = gb->io_registers[GB_IO_STAT] & 8; break; + case 1: gb->stat_interrupt_line = gb->io_registers[GB_IO_STAT] & 0x10; break; + case 2: gb->stat_interrupt_line = gb->io_registers[GB_IO_STAT] & 0x20; break; + } + + /* Use requested a LY=LYC interrupt and the LY=LYC bit is on */ + if ((gb->io_registers[GB_IO_STAT] & 0x44) == 0x44) { + gb->stat_interrupt_line = true; + } + } + } + + /* On the CGB, the last cycle of line 144 triggers an OAM interrupt + Todo: Verify timing for CGB in CGB mode and double speed CGB */ + if (gb->is_cgb && + gb->display_cycles == LINES * LINE_LENGTH + stat_delay - atomic_increase && + (gb->io_registers[GB_IO_STAT] & 0x20)) { + gb->stat_interrupt_line = true; + } + + if (gb->stat_interrupt_line && !previous_stat_interrupt_line) { + gb->io_registers[GB_IO_IF] |= 2; + } + + /* The value of LY is glitched in the last cycle of every line in CGB mode CGB in single speed + This is based on GiiBiiAdvance's docs */ + if (gb->cgb_mode && !gb->cgb_double_speed && + gb->display_cycles % LINE_LENGTH == LINE_LENGTH - 4) { + uint8_t glitch_pattern[] = {0, 0, 2, 0, 4, 4, 6, 0, 8}; + if ((gb->io_registers[GB_IO_LY] & 0xF) == 0xF) { + gb->io_registers[GB_IO_LY] = glitch_pattern[gb->io_registers[GB_IO_LY] >> 4] << 4; + } + else { + gb->io_registers[GB_IO_LY] = glitch_pattern[gb->io_registers[GB_IO_LY] & 7] | (gb->io_registers[GB_IO_LY] & 0xF8); + } + } +} + +void GB_display_run(GB_gameboy_t *gb, uint8_t cycles) +{ + update_display_state(gb, cycles); + if (gb->disable_rendering) { + return; + } + + /* + Display controller bug: For some reason, the OAM STAT interrupt is called, as expected, for LY = 0..143. + However, it is also called from LY = 144. + + See http://forums.nesdev.com/viewtopic.php?f=20&t=13727 + */ + + if (!(gb->io_registers[GB_IO_LCDC] & 0x80)) { + /* LCD is disabled, do nothing */ + return; + } + if (gb->display_cycles >= LINE_LENGTH * 144) { /* VBlank */ + return; + } + + uint8_t effective_ly = gb->display_cycles / LINE_LENGTH; + + + if (gb->display_cycles % LINE_LENGTH < MODE2_LENGTH) { /* Mode 2 */ + return; + } + + + /* Render */ + /* Todo: it appears that the actual rendering starts 4 cycles after mode 3 starts. Is this correct? */ + int16_t current_lcdc_x = gb->display_cycles % LINE_LENGTH - MODE2_LENGTH - (gb->effective_scx & 0x7) - 4; + + for (;gb->previous_lcdc_x < current_lcdc_x; gb->previous_lcdc_x++) { + if (gb->previous_lcdc_x >= WIDTH) { + continue; + } + if (gb->previous_lcdc_x < 0) { + continue; + } + gb->screen[effective_ly * WIDTH + gb->previous_lcdc_x] = + get_pixel(gb, gb->previous_lcdc_x, effective_ly); + } +} + +void GB_draw_tileset(GB_gameboy_t *gb, uint32_t *dest, GB_palette_type_t palette_type, uint8_t palette_index) +{ + uint32_t none_palette[4]; + uint32_t *palette = NULL; + + switch (gb->is_cgb? palette_type : GB_PALETTE_NONE) { + default: + case GB_PALETTE_NONE: + none_palette[0] = gb->rgb_encode_callback(gb, 0xFF, 0xFF, 0xFF); + none_palette[1] = gb->rgb_encode_callback(gb, 0xAA, 0xAA, 0xAA); + none_palette[2] = gb->rgb_encode_callback(gb, 0x55, 0x55, 0x55); + none_palette[3] = gb->rgb_encode_callback(gb, 0, 0, 0 ); + palette = none_palette; + break; + case GB_PALETTE_BACKGROUND: + palette = gb->background_palettes_rgb + (4 * (palette_index & 7)); + break; + case GB_PALETTE_OAM: + palette = gb->sprite_palettes_rgb + (4 * (palette_index & 7)); + break; + } + + for (unsigned y = 0; y < 192; y++) { + for (unsigned x = 0; x < 256; x++) { + if (x >= 128 && !gb->is_cgb) { + *(dest++) = gb->background_palettes_rgb[0]; + continue; + } + uint16_t tile = (x % 128) / 8 + y / 8 * 16; + uint16_t tile_address = tile * 0x10 + (x >= 128? 0x2000 : 0); + uint8_t pixel = (((gb->vram[tile_address + (y & 7) * 2 ] >> ((~x)&7)) & 1 ) | + ((gb->vram[tile_address + (y & 7) * 2 + 1] >> ((~x)&7)) & 1) << 1); + + if (!gb->cgb_mode) { + if (palette_type == GB_PALETTE_BACKGROUND) { + pixel = ((gb->io_registers[GB_IO_BGP] >> (pixel << 1)) & 3); + } + else if (!gb->cgb_mode) { + if (palette_type == GB_PALETTE_OAM) { + pixel = ((gb->io_registers[palette_index == 0? GB_IO_OBP0 : GB_IO_OBP1] >> (pixel << 1)) & 3); + } + } + } + + + *(dest++) = palette[pixel]; + } + } +} + +void GB_draw_tilemap(GB_gameboy_t *gb, uint32_t *dest, GB_palette_type_t palette_type, uint8_t palette_index, GB_map_type_t map_type, GB_tileset_type_t tileset_type) +{ + uint32_t none_palette[4]; + uint32_t *palette = NULL; + uint16_t map = 0x1800; + + switch (gb->is_cgb? palette_type : GB_PALETTE_NONE) { + case GB_PALETTE_NONE: + none_palette[0] = gb->rgb_encode_callback(gb, 0xFF, 0xFF, 0xFF); + none_palette[1] = gb->rgb_encode_callback(gb, 0xAA, 0xAA, 0xAA); + none_palette[2] = gb->rgb_encode_callback(gb, 0x55, 0x55, 0x55); + none_palette[3] = gb->rgb_encode_callback(gb, 0, 0, 0 ); + palette = none_palette; + break; + case GB_PALETTE_BACKGROUND: + palette = gb->background_palettes_rgb + (4 * (palette_index & 7)); + break; + case GB_PALETTE_OAM: + palette = gb->sprite_palettes_rgb + (4 * (palette_index & 7)); + break; + case GB_PALETTE_AUTO: + break; + } + + if (map_type == GB_MAP_9C00 || (map_type == GB_MAP_AUTO && gb->io_registers[GB_IO_LCDC] & 0x08)) { + map = 0x1c00; + } + + if (tileset_type == GB_TILESET_AUTO) { + tileset_type = (gb->io_registers[GB_IO_LCDC] & 0x10)? GB_TILESET_8800 : GB_TILESET_8000; + } + + for (unsigned y = 0; y < 256; y++) { + for (unsigned x = 0; x < 256; x++) { + uint8_t tile = gb->vram[map + x/8 + y/8 * 32]; + uint16_t tile_address; + uint8_t attributes = 0; + + if (tileset_type == GB_TILESET_8800) { + tile_address = tile * 0x10; + } + else { + tile_address = (int8_t) tile * 0x10 + 0x1000; + } + + if (gb->cgb_mode) { + attributes = gb->vram[map + x/8 + y/8 * 32 + 0x2000]; + } + + if (attributes & 0x8) { + tile_address += 0x2000; + } + + uint8_t pixel = (((gb->vram[tile_address + (((attributes & 0x40)? ~y : y) & 7) * 2 ] >> (((attributes & 0x20)? x : ~x)&7)) & 1 ) | + ((gb->vram[tile_address + (((attributes & 0x40)? ~y : y) & 7) * 2 + 1] >> (((attributes & 0x20)? x : ~x)&7)) & 1) << 1); + + if (!gb->cgb_mode && (palette_type == GB_PALETTE_BACKGROUND || palette_type == GB_PALETTE_AUTO)) { + pixel = ((gb->io_registers[GB_IO_BGP] >> (pixel << 1)) & 3); + } + + if (palette) { + *(dest++) = palette[pixel]; + } + else { + *(dest++) = gb->background_palettes_rgb[(attributes & 7) * 4 + pixel]; + } + } + } +} + +uint8_t GB_get_oam_info(GB_gameboy_t *gb, GB_oam_info_t *dest, uint8_t *sprite_height) +{ + uint8_t count = 0; + *sprite_height = (gb->io_registers[GB_IO_LCDC] & 4) ? 16:8; + uint8_t oam_to_dest_index[40] = {0,}; + for (unsigned y = 0; y < LINES; y++) { + GB_sprite_t *sprite = (GB_sprite_t *) &gb->oam; + uint8_t sprites_in_line = 0; + for (uint8_t i = 0; i < 40; i++, sprite++) { + int sprite_y = sprite->y - 16; + bool obscured = false; + // Is sprite not in this line? + if (sprite_y > y || sprite_y + *sprite_height <= y) continue; + if (++sprites_in_line == 11) obscured = true; + + GB_oam_info_t *info = NULL; + if (!oam_to_dest_index[i]) { + info = dest + count; + oam_to_dest_index[i] = ++count; + info->x = sprite->x; + info->y = sprite->y; + info->tile = *sprite_height == 16? sprite->tile & 0xFE : sprite->tile; + info->flags = sprite->flags; + info->obscured_by_line_limit = false; + info->oam_addr = 0xFE00 + i * sizeof(*sprite); + } + else { + info = dest + oam_to_dest_index[i] - 1; + } + info->obscured_by_line_limit |= obscured; + } + } + + + for (unsigned i = 0; i < count; i++) { + uint16_t vram_address = dest[i].tile * 0x10; + uint8_t flags = dest[i].flags; + uint8_t palette = gb->cgb_mode? (flags & 7) : ((flags & 0x10)? 1 : 0); + if (gb->is_cgb && (flags & 0x8)) { + vram_address += 0x2000; + } + + for (unsigned y = 0; y < *sprite_height; y++) { + for (unsigned x = 0; x < 8; x++) { + uint8_t color = (((gb->vram[vram_address ] >> ((~x)&7)) & 1 ) | + ((gb->vram[vram_address + 1] >> ((~x)&7)) & 1) << 1 ); + + if (!gb->cgb_mode) { + color = (gb->io_registers[palette? GB_IO_OBP1:GB_IO_OBP0] >> (color << 1)) & 3; + } + dest[i].image[((flags & 0x20)?7-x:x) + ((flags & 0x40)?*sprite_height - 1 -y:y) * 8] = gb->sprite_palettes_rgb[palette * 4 + color]; + } + vram_address += 2; + } + } + return count; +} diff --git a/waterbox/sameboy/display.h b/waterbox/sameboy/display.h new file mode 100644 index 0000000000..3967787237 --- /dev/null +++ b/waterbox/sameboy/display.h @@ -0,0 +1,40 @@ +#ifndef display_h +#define display_h + +#include "gb.h" +#ifdef GB_INTERNAL +void GB_display_run(GB_gameboy_t *gb, uint8_t cycles); +void GB_palette_changed(GB_gameboy_t *gb, bool background_palette, uint8_t index); +#endif + +typedef enum { + GB_PALETTE_NONE, + GB_PALETTE_BACKGROUND, + GB_PALETTE_OAM, + GB_PALETTE_AUTO, +} GB_palette_type_t; + +typedef enum { + GB_MAP_AUTO, + GB_MAP_9800, + GB_MAP_9C00, +} GB_map_type_t; + +typedef enum { + GB_TILESET_AUTO, + GB_TILESET_8800, + GB_TILESET_8000, +} GB_tileset_type_t; + +typedef struct { + uint32_t image[128]; + uint8_t x, y, tile, flags; + uint16_t oam_addr; + bool obscured_by_line_limit; +} GB_oam_info_t; + +void GB_draw_tileset(GB_gameboy_t *gb, uint32_t *dest, GB_palette_type_t palette_type, uint8_t palette_index); +void GB_draw_tilemap(GB_gameboy_t *gb, uint32_t *dest, GB_palette_type_t palette_type, uint8_t palette_index, GB_map_type_t map_type, GB_tileset_type_t tileset_type); +uint8_t GB_get_oam_info(GB_gameboy_t *gb, GB_oam_info_t *dest, uint8_t *sprite_height); + +#endif /* display_h */ diff --git a/waterbox/sameboy/gb.c b/waterbox/sameboy/gb.c new file mode 100644 index 0000000000..56697a1e83 --- /dev/null +++ b/waterbox/sameboy/gb.c @@ -0,0 +1,563 @@ +#include +#include +#include +#include +#include +#include +#include +#ifndef _WIN32 +#include +#include +#endif +#include "gb.h" + +void GB_attributed_logv(GB_gameboy_t *gb, GB_log_attributes attributes, const char *fmt, va_list args) +{ + char *string = NULL; + vasprintf(&string, fmt, args); + if (string) { + if (gb->log_callback) { + gb->log_callback(gb, string, attributes); + } + else { + /* Todo: Add ANSI escape sequences for attributed text */ + printf("%s", string); + } + } + free(string); +} + +void GB_attributed_log(GB_gameboy_t *gb, GB_log_attributes attributes, const char *fmt, ...) +{ + va_list args; + va_start(args, fmt); + GB_attributed_logv(gb, attributes, fmt, args); + va_end(args); +} + +void GB_log(GB_gameboy_t *gb, const char *fmt, ...) +{ + va_list args; + va_start(args, fmt); + GB_attributed_logv(gb, 0, fmt, args); + va_end(args); +} + +static char *default_input_callback(GB_gameboy_t *gb) +{ + char *expression = NULL; + size_t size = 0; + + if (getline(&expression, &size, stdin) == -1) { + /* The user doesn't have STDIN or used ^D. We make sure the program keeps running. */ + GB_set_async_input_callback(gb, NULL); /* Disable async input */ + return strdup("c"); + } + + if (!expression) { + return strdup(""); + } + + size_t length = strlen(expression); + if (expression[length - 1] == '\n') { + expression[length - 1] = 0; + } + return expression; +} + +static char *default_async_input_callback(GB_gameboy_t *gb) +{ +#ifndef _WIN32 + fd_set set; + FD_ZERO(&set); + FD_SET(STDIN_FILENO, &set); + struct timeval time = {0,}; + if (select(1, &set, NULL, NULL, &time) == 1) { + if (feof(stdin)) { + GB_set_async_input_callback(gb, NULL); /* Disable async input */ + return NULL; + } + return default_input_callback(gb); + } +#endif + return NULL; +} + +void GB_init(GB_gameboy_t *gb) +{ + memset(gb, 0, sizeof(*gb)); + gb->ram = malloc(gb->ram_size = 0x2000); + gb->vram = malloc(gb->vram_size = 0x2000); + + gb->input_callback = default_input_callback; + gb->async_input_callback = default_async_input_callback; + gb->cartridge_type = &GB_cart_defs[0]; // Default cartridge type + gb->audio_quality = 4; + + GB_reset(gb); +} + +void GB_init_cgb(GB_gameboy_t *gb) +{ + memset(gb, 0, sizeof(*gb)); + gb->ram = malloc(gb->ram_size = 0x2000 * 8); + gb->vram = malloc(gb->vram_size = 0x2000 * 2); + gb->is_cgb = true; + + gb->input_callback = default_input_callback; + gb->async_input_callback = default_async_input_callback; + gb->cartridge_type = &GB_cart_defs[0]; // Default cartridge type + gb->audio_quality = 4; + + GB_reset(gb); +} + +void GB_free(GB_gameboy_t *gb) +{ + gb->magic = 0; + if (gb->ram) { + free(gb->ram); + } + if (gb->vram) { + free(gb->vram); + } + if (gb->mbc_ram) { + free(gb->mbc_ram); + } + if (gb->rom) { + free(gb->rom); + } + if (gb->audio_buffer) { + free(gb->audio_buffer); + } + if (gb->breakpoints) { + free(gb->breakpoints); + } + for (int i = 0x200; i--;) { + if (gb->bank_symbols[i]) { + GB_map_free(gb->bank_symbols[i]); + } + } + for (int i = 0x400; i--;) { + if (gb->reversed_symbol_map.buckets[i]) { + GB_symbol_t *next = gb->reversed_symbol_map.buckets[i]->next; + free(gb->reversed_symbol_map.buckets[i]); + gb->reversed_symbol_map.buckets[i] = next; + } + } + memset(gb, 0, sizeof(*gb)); +} + +int GB_load_boot_rom(GB_gameboy_t *gb, const char *path) +{ + FILE *f = fopen(path, "rb"); + if (!f) { + GB_log(gb, "Could not open boot ROM: %s.\n", strerror(errno)); + return errno; + } + fread(gb->boot_rom, sizeof(gb->boot_rom), 1, f); + fclose(f); + return 0; +} + +int GB_load_rom(GB_gameboy_t *gb, const char *path) +{ + FILE *f = fopen(path, "rb"); + if (!f) { + GB_log(gb, "Could not open ROM: %s.\n", strerror(errno)); + return errno; + } + fseek(f, 0, SEEK_END); + gb->rom_size = (ftell(f) + 0x3FFF) & ~0x3FFF; /* Round to bank */ + /* And then round to a power of two */ + while (gb->rom_size & (gb->rom_size - 1)) { + /* I promise this works. */ + gb->rom_size |= gb->rom_size >> 1; + gb->rom_size++; + } + fseek(f, 0, SEEK_SET); + if (gb->rom) { + free(gb->rom); + } + gb->rom = malloc(gb->rom_size); + memset(gb->rom, 0xFF, gb->rom_size); /* Pad with 0xFFs */ + fread(gb->rom, gb->rom_size, 1, f); + fclose(f); + GB_configure_cart(gb); + + return 0; +} + +int GB_save_battery(GB_gameboy_t *gb, const char *path) +{ + if (!gb->cartridge_type->has_battery) return 0; // Nothing to save. + if (gb->mbc_ram_size == 0 && !gb->cartridge_type->has_rtc) return 0; /* Claims to have battery, but has no RAM or RTC */ + FILE *f = fopen(path, "wb"); + if (!f) { + GB_log(gb, "Could not open battery save: %s.\n", strerror(errno)); + return errno; + } + + if (fwrite(gb->mbc_ram, 1, gb->mbc_ram_size, f) != gb->mbc_ram_size) { + fclose(f); + return EIO; + } + if (gb->cartridge_type->has_rtc) { + if (fwrite(&gb->rtc_real, 1, sizeof(gb->rtc_real), f) != sizeof(gb->rtc_real)) { + fclose(f); + return EIO; + } + + if (fwrite(&gb->last_rtc_second, 1, sizeof(gb->last_rtc_second), f) != sizeof(gb->last_rtc_second)) { + fclose(f); + return EIO; + } + } + + errno = 0; + fclose(f); + return errno; +} + +/* Loading will silently stop if the format is incomplete */ +void GB_load_battery(GB_gameboy_t *gb, const char *path) +{ + FILE *f = fopen(path, "rb"); + if (!f) { + return; + } + + if (fread(gb->mbc_ram, 1, gb->mbc_ram_size, f) != gb->mbc_ram_size) { + goto reset_rtc; + } + + if (fread(&gb->rtc_real, 1, sizeof(gb->rtc_real), f) != sizeof(gb->rtc_real)) { + goto reset_rtc; + } + + if (fread(&gb->last_rtc_second, 1, sizeof(gb->last_rtc_second), f) != sizeof(gb->last_rtc_second)) { + goto reset_rtc; + } + + if (gb->last_rtc_second > time(NULL)) { + /* We must reset RTC here, or it will not advance. */ + goto reset_rtc; + } + + if (gb->last_rtc_second < 852076800) { /* 1/1/97. There weren't any RTC games that time, + so if the value we read is lower it means it wasn't + really RTC data. */ + goto reset_rtc; + } + goto exit; +reset_rtc: + gb->last_rtc_second = time(NULL); + gb->rtc_real.high |= 0x80; /* This gives the game a hint that the clock should be reset. */ +exit: + fclose(f); + return; +} + +void GB_run(GB_gameboy_t *gb) +{ + GB_debugger_run(gb); + GB_cpu_run(gb); + if (gb->vblank_just_occured) { + GB_update_joyp(gb); + GB_rtc_run(gb); + GB_debugger_handle_async_commands(gb); + } +} + +uint64_t GB_run_frame(GB_gameboy_t *gb) +{ + /* Configure turbo temporarily, the user wants to handle FPS capping manually. */ + bool old_turbo = gb->turbo; + bool old_dont_skip = gb->turbo_dont_skip; + gb->turbo = true; + gb->turbo_dont_skip = true; + + gb->cycles_since_last_sync = 0; + while (true) { + GB_run(gb); + if (gb->vblank_just_occured) { + break; + } + } + gb->turbo = old_turbo; + gb->turbo_dont_skip = old_dont_skip; + return gb->cycles_since_last_sync * FRAME_LENGTH * LCDC_PERIOD; +} + +void GB_set_pixels_output(GB_gameboy_t *gb, uint32_t *output) +{ + gb->screen = output; +} + +void GB_set_vblank_callback(GB_gameboy_t *gb, GB_vblank_callback_t callback) +{ + gb->vblank_callback = callback; +} + +void GB_set_log_callback(GB_gameboy_t *gb, GB_log_callback_t callback) +{ + gb->log_callback = callback; +} + +void GB_set_input_callback(GB_gameboy_t *gb, GB_input_callback_t callback) +{ + if (gb->input_callback == default_input_callback) { + gb->async_input_callback = NULL; + } + gb->input_callback = callback; +} + +void GB_set_async_input_callback(GB_gameboy_t *gb, GB_input_callback_t callback) +{ + gb->async_input_callback = callback; +} + +void GB_set_rgb_encode_callback(GB_gameboy_t *gb, GB_rgb_encode_callback_t callback) +{ + if (!gb->rgb_encode_callback && !gb->is_cgb) { + gb->sprite_palettes_rgb[4] = gb->sprite_palettes_rgb[0] = gb->background_palettes_rgb[0] = + callback(gb, 0xFF, 0xFF, 0xFF); + gb->sprite_palettes_rgb[5] = gb->sprite_palettes_rgb[1] = gb->background_palettes_rgb[1] = + callback(gb, 0xAA, 0xAA, 0xAA); + gb->sprite_palettes_rgb[6] = gb->sprite_palettes_rgb[2] = gb->background_palettes_rgb[2] = + callback(gb, 0x55, 0x55, 0x55); + gb->sprite_palettes_rgb[7] = gb->sprite_palettes_rgb[3] = gb->background_palettes_rgb[3] = + callback(gb, 0, 0, 0); + } + gb->rgb_encode_callback = callback; +} + +void GB_set_infrared_callback(GB_gameboy_t *gb, GB_infrared_callback_t callback) +{ + gb->infrared_callback = callback; +} + +void GB_set_infrared_input(GB_gameboy_t *gb, bool state) +{ + gb->infrared_input = state; + gb->cycles_since_input_ir_change = 0; + gb->ir_queue_length = 0; +} + +void GB_queue_infrared_input(GB_gameboy_t *gb, bool state, long cycles_after_previous_change) +{ + if (gb->ir_queue_length == GB_MAX_IR_QUEUE) { + GB_log(gb, "IR Queue is full\n"); + return; + } + gb->ir_queue[gb->ir_queue_length++] = (GB_ir_queue_item_t){state, cycles_after_previous_change}; +} + +void GB_set_rumble_callback(GB_gameboy_t *gb, GB_rumble_callback_t callback) +{ + gb->rumble_callback = callback; +} + +void GB_set_serial_transfer_start_callback(GB_gameboy_t *gb, GB_serial_transfer_start_callback_t callback) +{ + gb->serial_transfer_start_callback = callback; +} + +void GB_set_serial_transfer_end_callback(GB_gameboy_t *gb, GB_serial_transfer_end_callback_t callback) +{ + gb->serial_transfer_end_callback = callback; +} + +uint8_t GB_serial_get_data(GB_gameboy_t *gb) +{ + if (gb->io_registers[GB_IO_SC] & 1) { + /* Internal Clock */ + GB_log(gb, "Serial read request while using internal clock. \n"); + return 0xFF; + } + return gb->io_registers[GB_IO_SB]; +} +void GB_serial_set_data(GB_gameboy_t *gb, uint8_t data) +{ + if (gb->io_registers[GB_IO_SC] & 1) { + /* Internal Clock */ + GB_log(gb, "Serial write request while using internal clock. \n"); + return; + } + gb->io_registers[GB_IO_SB] = data; + gb->io_registers[GB_IO_IF] |= 8; +} + +void GB_set_sample_rate(GB_gameboy_t *gb, unsigned int sample_rate) +{ + if (gb->audio_buffer) { + free(gb->audio_buffer); + } + gb->buffer_size = sample_rate / 25; // 40ms delay + gb->audio_buffer = malloc(gb->buffer_size * sizeof(*gb->audio_buffer)); + gb->sample_rate = sample_rate; + gb->audio_position = 0; +} + +void GB_disconnect_serial(GB_gameboy_t *gb) +{ + gb->serial_transfer_start_callback = NULL; + gb->serial_transfer_end_callback = NULL; + + /* Reset any internally-emulated device. Currently, only the printer. */ + memset(&gb->printer, 0, sizeof(gb->printer)); +} + +bool GB_is_inited(GB_gameboy_t *gb) +{ + return gb->magic == 'SAME'; +} + +bool GB_is_cgb(GB_gameboy_t *gb) +{ + return gb->is_cgb; +} + +void GB_set_turbo_mode(GB_gameboy_t *gb, bool on, bool no_frame_skip) +{ + gb->turbo = on; + gb->turbo_dont_skip = no_frame_skip; +} + +void GB_set_rendering_disabled(GB_gameboy_t *gb, bool disabled) +{ + gb->disable_rendering = disabled; +} + +void *GB_get_user_data(GB_gameboy_t *gb) +{ + return gb->user_data; +} + +void GB_set_user_data(GB_gameboy_t *gb, void *data) +{ + gb->user_data = data; +} + +void GB_reset(GB_gameboy_t *gb) +{ + uint32_t mbc_ram_size = gb->mbc_ram_size; + bool cgb = gb->is_cgb; + memset(gb, 0, (size_t)GB_GET_SECTION((GB_gameboy_t *) 0, unsaved)); + gb->version = GB_STRUCT_VERSION; + + gb->mbc_rom_bank = 1; + gb->last_rtc_second = time(NULL); + gb->cgb_ram_bank = 1; + gb->io_registers[GB_IO_JOYP] = 0xF; + gb->mbc_ram_size = mbc_ram_size; + if (cgb) { + gb->ram_size = 0x2000 * 8; + memset(gb->ram, 0, gb->ram_size); + gb->vram_size = 0x2000 * 2; + memset(gb->vram, 0, gb->vram_size); + + gb->is_cgb = true; + gb->cgb_mode = true; + gb->io_registers[GB_IO_OBP0] = gb->io_registers[GB_IO_OBP1] = 0x00; + } + else { + gb->ram_size = 0x2000; + memset(gb->ram, 0, gb->ram_size); + gb->vram_size = 0x2000; + memset(gb->vram, 0, gb->vram_size); + + if (gb->rgb_encode_callback) { + gb->sprite_palettes_rgb[4] = gb->sprite_palettes_rgb[0] = gb->background_palettes_rgb[0] = + gb->rgb_encode_callback(gb, 0xFF, 0xFF, 0xFF); + gb->sprite_palettes_rgb[5] = gb->sprite_palettes_rgb[1] = gb->background_palettes_rgb[1] = + gb->rgb_encode_callback(gb, 0xAA, 0xAA, 0xAA); + gb->sprite_palettes_rgb[6] = gb->sprite_palettes_rgb[2] = gb->background_palettes_rgb[2] = + gb->rgb_encode_callback(gb, 0x55, 0x55, 0x55); + gb->sprite_palettes_rgb[7] = gb->sprite_palettes_rgb[3] = gb->background_palettes_rgb[3] = + gb->rgb_encode_callback(gb, 0, 0, 0); + } + gb->io_registers[GB_IO_OBP0] = gb->io_registers[GB_IO_OBP1] = 0xFF; + } + /* The serial interrupt always occur on the 0xF8th cycle of every 0x100 cycle since boot. */ + gb->serial_cycles = 0x100 - 0xF8; + gb->io_registers[GB_IO_SC] = 0x7E; + gb->magic = (uintptr_t)'SAME'; +} + +void GB_switch_model_and_reset(GB_gameboy_t *gb, bool is_cgb) +{ + if (is_cgb) { + gb->ram = realloc(gb->ram, gb->ram_size = 0x2000 * 8); + gb->vram = realloc(gb->vram, gb->vram_size = 0x2000 * 2); + } + else { + gb->ram = realloc(gb->ram, gb->ram_size = 0x2000); + gb->vram = realloc(gb->vram, gb->vram_size = 0x2000); + } + gb->is_cgb = is_cgb; + GB_reset(gb); + +} + +void *GB_get_direct_access(GB_gameboy_t *gb, GB_direct_access_t access, size_t *size, uint16_t *bank) +{ + /* Set size and bank to dummy pointers if not set */ + size_t dummy_size; + uint16_t dummy_bank; + if (!size) { + size = &dummy_size; + } + + if (!bank) { + bank = &dummy_bank; + } + + + switch (access) { + case GB_DIRECT_ACCESS_ROM: + *size = gb->rom_size; + *bank = gb->mbc_rom_bank; + return gb->rom; + case GB_DIRECT_ACCESS_RAM: + *size = gb->ram_size; + *bank = gb->cgb_ram_bank; + return gb->ram; + case GB_DIRECT_ACCESS_CART_RAM: + *size = gb->mbc_ram_size; + *bank = gb->mbc_ram_bank; + return gb->mbc_ram; + case GB_DIRECT_ACCESS_VRAM: + *size = gb->vram_size; + *bank = gb->cgb_vram_bank; + return gb->vram; + case GB_DIRECT_ACCESS_HRAM: + *size = sizeof(gb->hram); + *bank = 0; + return &gb->hram; + case GB_DIRECT_ACCESS_IO: + *size = sizeof(gb->io_registers); + *bank = 0; + return &gb->io_registers; + case GB_DIRECT_ACCESS_BOOTROM: + *size = gb->is_cgb? sizeof(gb->boot_rom) : 0x100; + *bank = 0; + return &gb->boot_rom; + case GB_DIRECT_ACCESS_OAM: + *size = sizeof(gb->oam); + *bank = 0; + return &gb->oam; + case GB_DIRECT_ACCESS_BGP: + *size = sizeof(gb->background_palettes_data); + *bank = 0; + return &gb->background_palettes_data; + case GB_DIRECT_ACCESS_OBP: + *size = sizeof(gb->sprite_palettes_data); + *bank = 0; + return &gb->sprite_palettes_data; + default: + *size = 0; + *bank = 0; + return NULL; + } +} diff --git a/waterbox/sameboy/gb.h b/waterbox/sameboy/gb.h new file mode 100644 index 0000000000..82608821fd --- /dev/null +++ b/waterbox/sameboy/gb.h @@ -0,0 +1,570 @@ +#ifndef GB_h +#define GB_h +#include +#include +#include +#include + +#include "gb_struct_def.h" +#include "save_state.h" + +#include "apu.h" +#include "camera.h" +#include "debugger.h" +#include "display.h" +#include "joypad.h" +#include "mbc.h" +#include "memory.h" +#include "printer.h" +#include "timing.h" +#include "z80_cpu.h" +#include "symbol_hash.h" + +#define GB_STRUCT_VERSION 11 + +enum { + GB_REGISTER_AF, + GB_REGISTER_BC, + GB_REGISTER_DE, + GB_REGISTER_HL, + GB_REGISTER_SP, + GB_REGISTERS_16_BIT /* Count */ +}; + +/* Todo: Actually use these! */ +enum { + GB_CARRY_FLAG = 16, + GB_HALF_CARRY_FLAG = 32, + GB_SUBSTRACT_FLAG = 64, + GB_ZERO_FLAG = 128, +}; + +#define GB_MAX_IR_QUEUE 256 + +enum { + /* Joypad and Serial */ + GB_IO_JOYP = 0x00, // Joypad (R/W) + GB_IO_SB = 0x01, // Serial transfer data (R/W) + GB_IO_SC = 0x02, // Serial Transfer Control (R/W) + + /* Missing */ + + /* Timers */ + GB_IO_DIV = 0x04, // Divider Register (R/W) + GB_IO_TIMA = 0x05, // Timer counter (R/W) + GB_IO_TMA = 0x06, // Timer Modulo (R/W) + GB_IO_TAC = 0x07, // Timer Control (R/W) + + /* Missing */ + + GB_IO_IF = 0x0f, // Interrupt Flag (R/W) + + /* Sound */ + GB_IO_NR10 = 0x10, // Channel 1 Sweep register (R/W) + GB_IO_NR11 = 0x11, // Channel 1 Sound length/Wave pattern duty (R/W) + GB_IO_NR12 = 0x12, // Channel 1 Volume Envelope (R/W) + GB_IO_NR13 = 0x13, // Channel 1 Frequency lo (Write Only) + GB_IO_NR14 = 0x14, // Channel 1 Frequency hi (R/W) + GB_IO_NR21 = 0x16, // Channel 2 Sound Length/Wave Pattern Duty (R/W) + GB_IO_NR22 = 0x17, // Channel 2 Volume Envelope (R/W) + GB_IO_NR23 = 0x18, // Channel 2 Frequency lo data (W) + GB_IO_NR24 = 0x19, // Channel 2 Frequency hi data (R/W) + GB_IO_NR30 = 0x1a, // Channel 3 Sound on/off (R/W) + GB_IO_NR31 = 0x1b, // Channel 3 Sound Length + GB_IO_NR32 = 0x1c, // Channel 3 Select output level (R/W) + GB_IO_NR33 = 0x1d, // Channel 3 Frequency's lower data (W) + GB_IO_NR34 = 0x1e, // Channel 3 Frequency's higher data (R/W) + + /* Missing */ + + GB_IO_NR41 = 0x20, // Channel 4 Sound Length (R/W) + GB_IO_NR42 = 0x21, // Channel 4 Volume Envelope (R/W) + GB_IO_NR43 = 0x22, // Channel 4 Polynomial Counter (R/W) + GB_IO_NR44 = 0x23, // Channel 4 Counter/consecutive, Inital (R/W) + GB_IO_NR50 = 0x24, // Channel control / ON-OFF / Volume (R/W) + GB_IO_NR51 = 0x25, // Selection of Sound output terminal (R/W) + GB_IO_NR52 = 0x26, // Sound on/off + + /* Missing */ + + GB_IO_WAV_START = 0x30, // Wave pattern start + GB_IO_WAV_END = 0x3f, // Wave pattern end + + /* Graphics */ + GB_IO_LCDC = 0x40, // LCD Control (R/W) + GB_IO_STAT = 0x41, // LCDC Status (R/W) + GB_IO_SCY = 0x42, // Scroll Y (R/W) + GB_IO_SCX = 0x43, // Scroll X (R/W) + GB_IO_LY = 0x44, // LCDC Y-Coordinate (R) + GB_IO_LYC = 0x45, // LY Compare (R/W) + GB_IO_DMA = 0x46, // DMA Transfer and Start Address (W) + GB_IO_BGP = 0x47, // BG Palette Data (R/W) - Non CGB Mode Only + GB_IO_OBP0 = 0x48, // Object Palette 0 Data (R/W) - Non CGB Mode Only + GB_IO_OBP1 = 0x49, // Object Palette 1 Data (R/W) - Non CGB Mode Only + GB_IO_WY = 0x4a, // Window Y Position (R/W) + GB_IO_WX = 0x4b, // Window X Position minus 7 (R/W) + // Has some undocumented compatibility flags written at boot. + // Unfortunately it is not readable or writable after boot has finished, so research of this + // register is quite limited. The value written to this register, however, can be controlled + // in some cases. + GB_IO_DMG_EMULATION = 0x4c, + + /* General CGB features */ + GB_IO_KEY1 = 0x4d, // CGB Mode Only - Prepare Speed Switch + + /* Missing */ + + GB_IO_VBK = 0x4f, // CGB Mode Only - VRAM Bank + GB_IO_BIOS = 0x50, // Write to disable the BIOS mapping + + /* CGB DMA */ + GB_IO_HDMA1 = 0x51, // CGB Mode Only - New DMA Source, High + GB_IO_HDMA2 = 0x52, // CGB Mode Only - New DMA Source, Low + GB_IO_HDMA3 = 0x53, // CGB Mode Only - New DMA Destination, High + GB_IO_HDMA4 = 0x54, // CGB Mode Only - New DMA Destination, Low + GB_IO_HDMA5 = 0x55, // CGB Mode Only - New DMA Length/Mode/Start + + /* IR */ + GB_IO_RP = 0x56, // CGB Mode Only - Infrared Communications Port + + /* Missing */ + + /* CGB Paletts */ + GB_IO_BGPI = 0x68, // CGB Mode Only - Background Palette Index + GB_IO_BGPD = 0x69, // CGB Mode Only - Background Palette Data + GB_IO_OBPI = 0x6a, // CGB Mode Only - Sprite Palette Index + GB_IO_OBPD = 0x6b, // CGB Mode Only - Sprite Palette Data + + // 1 is written for DMG ROMs on a CGB. Does not appear to have an effect. + GB_IO_DMG_EMULATION_INDICATION = 0x6c, // (FEh) Bit 0 (Read/Write) + + /* Missing */ + + GB_IO_SVBK = 0x70, // CGB Mode Only - WRAM Bank + GB_IO_UNKNOWN2 = 0x72, // (00h) - Bit 0-7 (Read/Write) + GB_IO_UNKNOWN3 = 0x73, // (00h) - Bit 0-7 (Read/Write) + GB_IO_UNKNOWN4 = 0x74, // (00h) - Bit 0-7 (Read/Write) - CGB Mode Only + GB_IO_UNKNOWN5 = 0x75, // (8Fh) - Bit 4-6 (Read/Write) + GB_IO_PCM_12 = 0x76, // Channels 1 and 2 amplitudes + GB_IO_PCM_34 = 0x77, // Channels 3 and 4 amplitudes + GB_IO_UNKNOWN8 = 0x7F, // Unknown, write only +}; + +typedef enum { + GB_LOG_BOLD = 1, + GB_LOG_DASHED_UNDERLINE = 2, + GB_LOG_UNDERLINE = 4, + GB_LOG_UNDERLINE_MASK = GB_LOG_DASHED_UNDERLINE | GB_LOG_UNDERLINE +} GB_log_attributes; + +#ifdef GB_INTERNAL +#define LCDC_PERIOD 70224 +#define CPU_FREQUENCY 0x400000 +#define DIV_CYCLES (0x100) +#define INTERNAL_DIV_CYCLES (0x40000) +#define FRAME_LENGTH 16742706 // in nanoseconds +#endif + +typedef void (*GB_vblank_callback_t)(GB_gameboy_t *gb); +typedef void (*GB_log_callback_t)(GB_gameboy_t *gb, const char *string, GB_log_attributes attributes); +typedef char *(*GB_input_callback_t)(GB_gameboy_t *gb); +typedef uint32_t (*GB_rgb_encode_callback_t)(GB_gameboy_t *gb, uint8_t r, uint8_t g, uint8_t b); +typedef void (*GB_infrared_callback_t)(GB_gameboy_t *gb, bool on, long cycles_since_last_update); +typedef void (*GB_rumble_callback_t)(GB_gameboy_t *gb, bool rumble_on); +typedef void (*GB_serial_transfer_start_callback_t)(GB_gameboy_t *gb, uint8_t byte_to_send); +typedef uint8_t (*GB_serial_transfer_end_callback_t)(GB_gameboy_t *gb); + +typedef struct { + bool state; + long delay; +} GB_ir_queue_item_t; + +struct GB_breakpoint_s; +struct GB_watchpoint_s; + +/* When state saving, each section is dumped independently of other sections. + This allows adding data to the end of the section without worrying about future compatibility. + Some other changes might be "safe" as well. + This struct is not packed, but dumped sections exclusively use types that have the same alignment in both 32 and 64 + bit platforms. */ + +/* We make sure bool is 1 for cross-platform save state compatibility. */ +/* Todo: We might want to typedef our own bool if this prevents SameBoy from working on specific platforms. */ +_Static_assert(sizeof(bool) == 1, "sizeof(bool) != 1"); + +#ifdef GB_INTERNAL +struct GB_gameboy_s { +#else +struct GB_gameboy_internal_s { +#endif + GB_SECTION(header, + /* The magic makes sure a state file is: + - Indeed a SameBoy state file. + - Has the same endianess has the current platform. */ + volatile uint32_t magic; + /* The version field makes sure we don't load save state files with a completely different structure. + This happens when struct fields are removed/resized in an backward incompatible manner. */ + uint32_t version; + ); + + GB_SECTION(core_state, + /* Registers */ + uint16_t pc; + union { + uint16_t registers[GB_REGISTERS_16_BIT]; + struct { + uint16_t af, + bc, + de, + hl, + sp; + }; + struct { +#if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ + uint8_t a, f, + b, c, + d, e, + h, l; +#elif __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ + uint8_t f, a, + c, b, + e, d, + l, h; +#else +#error Unable to detect endianess +#endif + }; + + }; + uint8_t ime; + uint8_t interrupt_enable; + uint8_t cgb_ram_bank; + + /* CPU and General Hardware Flags*/ + bool cgb_mode; + bool is_cgb; + bool cgb_double_speed; + bool halted; + bool stopped; + bool boot_rom_finished; + bool ime_toggle; /* ei (and di in CGB) have delayed effects.*/ + bool halt_bug; + + /* Misc state */ + bool infrared_input; + GB_printer_t printer; + ); + + /* DMA and HDMA */ + GB_SECTION(dma, + bool hdma_on; + bool hdma_on_hblank; + uint8_t hdma_steps_left; + uint16_t hdma_cycles; + uint16_t hdma_current_src, hdma_current_dest; + + uint8_t dma_steps_left; + uint8_t dma_current_dest; + uint16_t dma_current_src; + int16_t dma_cycles; + bool is_dma_restarting; + ); + + /* MBC */ + GB_SECTION(mbc, + uint16_t mbc_rom_bank; + uint8_t mbc_ram_bank; + uint32_t mbc_ram_size; + bool mbc_ram_enable; + union { + struct { + uint8_t bank_low:5; + uint8_t bank_high:2; + uint8_t padding:1; // Save state compatibility with 0.9 + uint8_t mode:1; + } mbc1; + + struct { + uint8_t rom_bank:4; + } mbc2; + + struct { + uint8_t rom_bank:7; + uint8_t padding:1; + uint8_t ram_bank:4; + } mbc3; + + struct { + uint8_t rom_bank_low; + uint8_t rom_bank_high:1; + uint8_t ram_bank:4; + } mbc5; + + struct { + uint8_t bank_low:6; + uint8_t bank_high:3; + uint8_t mode:1; + } huc1; + + struct { + uint8_t rom_bank; + uint8_t ram_bank; + } huc3; + }; + uint16_t mbc_rom0_bank; /* For some MBC1 wirings. */ + bool camera_registers_mapped; + uint8_t camera_registers[0x36]; + bool rumble_state; + ); + + + /* HRAM and HW Registers */ + GB_SECTION(hram, + uint8_t hram[0xFFFF - 0xFF80]; + uint8_t io_registers[0x80]; + ); + + /* Timing */ + GB_SECTION(timing, + uint32_t display_cycles; + uint32_t div_cycles; + uint8_t tima_reload_state; /* After TIMA overflows, it becomes 0 for 4 cycles before actually reloading. */ + GB_PADDING(uint16_t, serial_cycles); + uint16_t serial_cycles; /* This field changed its meaning in v0.10 */ + uint16_t serial_length; + ); + + /* APU */ + GB_SECTION(apu, + GB_apu_t apu; + ); + + /* RTC */ + GB_SECTION(rtc, + union { + struct { + uint8_t seconds; + uint8_t minutes; + uint8_t hours; + uint8_t days; + uint8_t high; + }; + uint8_t data[5]; + } rtc_real, rtc_latched; + time_t last_rtc_second; + bool rtc_latch; + ); + + /* Video Display */ + GB_SECTION(video, + uint32_t vram_size; // Different between CGB and DMG + uint8_t cgb_vram_bank; + uint8_t oam[0xA0]; + uint8_t background_palettes_data[0x40]; + uint8_t sprite_palettes_data[0x40]; + uint32_t background_palettes_rgb[0x20]; + uint32_t sprite_palettes_rgb[0x20]; + int16_t previous_lcdc_x; + bool stat_interrupt_line; + uint8_t effective_scx; + uint8_t current_window_line; + /* The LCDC will skip the first frame it renders after turning it on. + On the CGB, a frame is not skipped if the previous frame was skipped as well. + See https://www.reddit.com/r/EmuDev/comments/6exyxu/ */ + enum { + GB_FRAMESKIP_LCD_TURNED_ON, // On a DMG, the LCD renders a blank screen during this state, + // on a CGB, the previous frame is repeated (which might be + // blank if the LCD was off for more than a few cycles) + GB_FRAMESKIP_FIRST_FRAME_SKIPPED, // This state is 'skipped' when emulating a DMG + GB_FRAMESKIP_SECOND_FRAME_RENDERED, + } frame_skip_state; + bool first_scanline; // The very first scan line after turning the LCD behaves differently. + bool oam_read_blocked; + bool vram_read_blocked; + bool oam_write_blocked; + bool vram_write_blocked; + ); + + /* Unsaved data. This includes all pointers, as well as everything that shouldn't be on a save state */ + /* This data is reserved on reset and must come last in the struct */ + GB_SECTION(unsaved, + /* ROM */ + uint8_t *rom; + uint32_t rom_size; + const GB_cartridge_t *cartridge_type; + enum { + GB_STANDARD_MBC1_WIRING, + GB_MBC1M_WIRING, + } mbc1_wiring; + + /* Various RAMs */ + uint8_t *ram; + uint8_t *vram; + uint8_t *mbc_ram; + + /* I/O */ + uint32_t *screen; + GB_sample_t *audio_buffer; + bool keys[GB_KEY_MAX]; + + /* Timing */ + uint64_t last_sync; + uint64_t cycles_since_last_sync; + + /* Audio */ + unsigned buffer_size; + unsigned sample_rate; + unsigned audio_position; + bool audio_stream_started; /* detects first copy request to minimize lag */ + volatile bool audio_copy_in_progress; + volatile bool apu_lock; + double apu_sample_cycles; + double apu_subsample_cycles; + GB_double_sample_t current_supersample; + unsigned n_subsamples; + unsigned audio_quality; + + + /* Callbacks */ + void *user_data; + GB_log_callback_t log_callback; + GB_input_callback_t input_callback; + GB_input_callback_t async_input_callback; + GB_rgb_encode_callback_t rgb_encode_callback; + GB_vblank_callback_t vblank_callback; + GB_infrared_callback_t infrared_callback; + GB_camera_get_pixel_callback_t camera_get_pixel_callback; + GB_camera_update_request_callback_t camera_update_request_callback; + GB_rumble_callback_t rumble_callback; + GB_serial_transfer_start_callback_t serial_transfer_start_callback; + GB_serial_transfer_end_callback_t serial_transfer_end_callback; + + /* IR */ + long cycles_since_ir_change; + long cycles_since_input_ir_change; + GB_ir_queue_item_t ir_queue[GB_MAX_IR_QUEUE]; + size_t ir_queue_length; + + /*** Debugger ***/ + volatile bool debug_stopped, debug_disable; + bool debug_fin_command, debug_next_command; + + /* Breakpoints */ + uint16_t n_breakpoints; + struct GB_breakpoint_s *breakpoints; + + /* SLD (Todo: merge with backtrace) */ + bool stack_leak_detection; + int debug_call_depth; + uint16_t sp_for_call_depth[0x200]; /* Should be much more than enough */ + uint16_t addr_for_call_depth[0x200]; + + /* Backtrace */ + unsigned int backtrace_size; + uint16_t backtrace_sps[0x200]; + struct { + uint16_t bank; + uint16_t addr; + } backtrace_returns[0x200]; + + /* Watchpoints */ + uint16_t n_watchpoints; + struct GB_watchpoint_s *watchpoints; + + /* Symbol tables */ + GB_symbol_map_t *bank_symbols[0x200]; + GB_reversed_symbol_map_t reversed_symbol_map; + + /* Ticks command */ + unsigned long debugger_ticks; + + /* Misc */ + bool turbo; + bool turbo_dont_skip; + bool disable_rendering; + uint32_t ram_size; // Different between CGB and DMG + uint8_t boot_rom[0x900]; + bool vblank_just_occured; // For slow operations involving syscalls; these should only run once per vblank + ); +}; + +#ifndef GB_INTERNAL +struct GB_gameboy_s { + char __internal[sizeof(struct GB_gameboy_internal_s)]; +}; +#endif + + +#ifndef __printflike +/* Missing from Linux headers. */ +#define __printflike(fmtarg, firstvararg) \ +__attribute__((__format__ (__printf__, fmtarg, firstvararg))) +#endif + +void GB_init(GB_gameboy_t *gb); +void GB_init_cgb(GB_gameboy_t *gb); +bool GB_is_inited(GB_gameboy_t *gb); +bool GB_is_cgb(GB_gameboy_t *gb); +void GB_free(GB_gameboy_t *gb); +void GB_reset(GB_gameboy_t *gb); +void GB_switch_model_and_reset(GB_gameboy_t *gb, bool is_cgb); +void GB_run(GB_gameboy_t *gb); +/* Returns the time passed since the last frame, in nanoseconds */ +uint64_t GB_run_frame(GB_gameboy_t *gb); + +typedef enum { + GB_DIRECT_ACCESS_ROM, + GB_DIRECT_ACCESS_RAM, + GB_DIRECT_ACCESS_CART_RAM, + GB_DIRECT_ACCESS_VRAM, + GB_DIRECT_ACCESS_HRAM, + GB_DIRECT_ACCESS_IO, /* Warning: Some registers can only be read/written correctly via GB_memory_read/write. */ + GB_DIRECT_ACCESS_BOOTROM, + GB_DIRECT_ACCESS_OAM, + GB_DIRECT_ACCESS_BGP, + GB_DIRECT_ACCESS_OBP, +} GB_direct_access_t; + +/* Returns a mutable pointer to various hardware memories. If that memory is banked, the current bank + is returned at *bank, even if only a portion of the memory is banked. */ +void *GB_get_direct_access(GB_gameboy_t *gb, GB_direct_access_t access, size_t *size, uint16_t *bank); + +void *GB_get_user_data(GB_gameboy_t *gb); +void GB_set_user_data(GB_gameboy_t *gb, void *data); + +int GB_load_boot_rom(GB_gameboy_t *gb, const char *path); +int GB_load_rom(GB_gameboy_t *gb, const char *path); + +int GB_save_battery(GB_gameboy_t *gb, const char *path); +void GB_load_battery(GB_gameboy_t *gb, const char *path); + +void GB_set_turbo_mode(GB_gameboy_t *gb, bool on, bool no_frame_skip); +void GB_set_rendering_disabled(GB_gameboy_t *gb, bool disabled); + +void GB_log(GB_gameboy_t *gb, const char *fmt, ...) __printflike(2, 3); +void GB_attributed_log(GB_gameboy_t *gb, GB_log_attributes attributes, const char *fmt, ...) __printflike(3, 4); + +void GB_set_pixels_output(GB_gameboy_t *gb, uint32_t *output); + +void GB_set_infrared_input(GB_gameboy_t *gb, bool state); +void GB_queue_infrared_input(GB_gameboy_t *gb, bool state, long cycles_after_previous_change); + +void GB_set_vblank_callback(GB_gameboy_t *gb, GB_vblank_callback_t callback); +void GB_set_log_callback(GB_gameboy_t *gb, GB_log_callback_t callback); +void GB_set_input_callback(GB_gameboy_t *gb, GB_input_callback_t callback); +void GB_set_async_input_callback(GB_gameboy_t *gb, GB_input_callback_t callback); +void GB_set_rgb_encode_callback(GB_gameboy_t *gb, GB_rgb_encode_callback_t callback); +void GB_set_infrared_callback(GB_gameboy_t *gb, GB_infrared_callback_t callback); +void GB_set_rumble_callback(GB_gameboy_t *gb, GB_rumble_callback_t callback); + +/* These APIs are used when using internal clock */ +void GB_set_serial_transfer_start_callback(GB_gameboy_t *gb, GB_serial_transfer_start_callback_t callback); +void GB_set_serial_transfer_end_callback(GB_gameboy_t *gb, GB_serial_transfer_end_callback_t callback); + +/* These APIs are used when using external clock */ +uint8_t GB_serial_get_data(GB_gameboy_t *gb); +void GB_serial_set_data(GB_gameboy_t *gb, uint8_t data); + +void GB_disconnect_serial(GB_gameboy_t *gb); + +#endif /* GB_h */ diff --git a/waterbox/sameboy/gb_struct_def.h b/waterbox/sameboy/gb_struct_def.h new file mode 100644 index 0000000000..0e0ebd12ee --- /dev/null +++ b/waterbox/sameboy/gb_struct_def.h @@ -0,0 +1,5 @@ +#ifndef gb_struct_def_h +#define gb_struct_def_h +struct GB_gameboy_s; +typedef struct GB_gameboy_s GB_gameboy_t; +#endif diff --git a/waterbox/sameboy/joypad.c b/waterbox/sameboy/joypad.c new file mode 100644 index 0000000000..c5c4f08961 --- /dev/null +++ b/waterbox/sameboy/joypad.c @@ -0,0 +1,63 @@ +#include +#include "gb.h" +#include + +void GB_update_joyp(GB_gameboy_t *gb) +{ + uint8_t key_selection = 0; + uint8_t previous_state = 0; + + /* Todo: add delay to key selection */ + previous_state = gb->io_registers[GB_IO_JOYP] & 0xF; + key_selection = (gb->io_registers[GB_IO_JOYP] >> 4) & 3; + gb->io_registers[GB_IO_JOYP] &= 0xF0; + switch (key_selection) { + case 3: + /* Nothing is wired, all up */ + gb->io_registers[GB_IO_JOYP] |= 0x0F; + break; + + case 2: + /* Direction keys */ + for (uint8_t i = 0; i < 4; i++) { + gb->io_registers[GB_IO_JOYP] |= (!gb->keys[i]) << i; + } + /* Forbid pressing two opposing keys, this breaks a lot of games; even if it's somewhat possible. */ + if (!(gb->io_registers[GB_IO_JOYP] & 1)) { + gb->io_registers[GB_IO_JOYP] |= 2; + } + if (!(gb->io_registers[GB_IO_JOYP] & 4)) { + gb->io_registers[GB_IO_JOYP] |= 8; + } + break; + + case 1: + /* Other keys */ + for (uint8_t i = 0; i < 4; i++) { + gb->io_registers[GB_IO_JOYP] |= (!gb->keys[i + 4]) << i; + } + break; + + case 0: + /* Todo: verifiy this is correct */ + for (uint8_t i = 0; i < 4; i++) { + gb->io_registers[GB_IO_JOYP] |= (!gb->keys[i]) << i; + gb->io_registers[GB_IO_JOYP] |= (!gb->keys[i + 4]) << i; + } + break; + + default: + break; + } + if (previous_state != (gb->io_registers[GB_IO_JOYP] & 0xF)) { + /* Todo: disable when emulating CGB */ + gb->io_registers[GB_IO_IF] |= 0x10; + } + gb->io_registers[GB_IO_JOYP] |= 0xC0; // No SGB support +} + +void GB_set_key_state(GB_gameboy_t *gb, GB_key_t index, bool pressed) +{ + assert(index >= 0 && index < GB_KEY_MAX); + gb->keys[index] = pressed; +} diff --git a/waterbox/sameboy/joypad.h b/waterbox/sameboy/joypad.h new file mode 100644 index 0000000000..def4b9ac82 --- /dev/null +++ b/waterbox/sameboy/joypad.h @@ -0,0 +1,22 @@ +#ifndef joypad_h +#define joypad_h +#include "gb_struct_def.h" + +typedef enum { + GB_KEY_RIGHT, + GB_KEY_LEFT, + GB_KEY_UP, + GB_KEY_DOWN, + GB_KEY_A, + GB_KEY_B, + GB_KEY_SELECT, + GB_KEY_START, + GB_KEY_MAX +} GB_key_t; + +void GB_set_key_state(GB_gameboy_t *gb, GB_key_t index, bool pressed); + +#ifdef GB_INTERNAL +void GB_update_joyp(GB_gameboy_t *gb); +#endif +#endif /* joypad_h */ diff --git a/waterbox/sameboy/mbc.c b/waterbox/sameboy/mbc.c new file mode 100644 index 0000000000..d3791a180f --- /dev/null +++ b/waterbox/sameboy/mbc.c @@ -0,0 +1,154 @@ +#include +#include +#include +#include "gb.h" + +const GB_cartridge_t GB_cart_defs[256] = { + // From http://gbdev.gg8.se/wiki/articles/The_Cartridge_Header#0147_-_Cartridge_Type + /* MBC SUBTYPE RAM BAT. RTC RUMB. */ + { GB_NO_MBC, GB_STANDARD_MBC, false, false, false, false}, // 00h ROM ONLY + { GB_MBC1 , GB_STANDARD_MBC, false, false, false, false}, // 01h MBC1 + { GB_MBC1 , GB_STANDARD_MBC, true , false, false, false}, // 02h MBC1+RAM + { GB_MBC1 , GB_STANDARD_MBC, true , true , false, false}, // 03h MBC1+RAM+BATTERY + [5] = + { GB_MBC2 , GB_STANDARD_MBC, true , false, false, false}, // 05h MBC2 + { GB_MBC2 , GB_STANDARD_MBC, true , true , false, false}, // 06h MBC2+BATTERY + [8] = + { GB_NO_MBC, GB_STANDARD_MBC, true , false, false, false}, // 08h ROM+RAM + { GB_NO_MBC, GB_STANDARD_MBC, true , true , false, false}, // 09h ROM+RAM+BATTERY + [0xB] = + /* Todo: Not supported yet */ + { GB_NO_MBC, GB_STANDARD_MBC, false, false, false, false}, // 0Bh MMM01 + { GB_NO_MBC, GB_STANDARD_MBC, false, false, false, false}, // 0Ch MMM01+RAM + { GB_NO_MBC, GB_STANDARD_MBC, false, false, false, false}, // 0Dh MMM01+RAM+BATTERY + [0xF] = + { GB_MBC3 , GB_STANDARD_MBC, false, true, true , false}, // 0Fh MBC3+TIMER+BATTERY + { GB_MBC3 , GB_STANDARD_MBC, true , true, true , false}, // 10h MBC3+TIMER+RAM+BATTERY + { GB_MBC3 , GB_STANDARD_MBC, false, false, false, false}, // 11h MBC3 + { GB_MBC3 , GB_STANDARD_MBC, true , false, false, false}, // 12h MBC3+RAM + { GB_MBC3 , GB_STANDARD_MBC, true , true , false, false}, // 13h MBC3+RAM+BATTERY + [0x19] = + { GB_MBC5 , GB_STANDARD_MBC, false, false, false, false}, // 19h MBC5 + { GB_MBC5 , GB_STANDARD_MBC, true , false, false, false}, // 1Ah MBC5+RAM + { GB_MBC5 , GB_STANDARD_MBC, true , true , false, false}, // 1Bh MBC5+RAM+BATTERY + { GB_MBC5 , GB_STANDARD_MBC, false, false, false, true }, // 1Ch MBC5+RUMBLE + { GB_MBC5 , GB_STANDARD_MBC, true , false, false, true }, // 1Dh MBC5+RUMBLE+RAM + { GB_MBC5 , GB_STANDARD_MBC, true , true , false, true }, // 1Eh MBC5+RUMBLE+RAM+BATTERY + [0xFC] = + { GB_MBC5 , GB_CAMERA , true , true , false, false}, // FCh POCKET CAMERA + { GB_NO_MBC, GB_STANDARD_MBC, false, false, false, false}, // FDh BANDAI TAMA5 (Todo: Not supported) + { GB_HUC3 , GB_STANDARD_MBC, true , true , false, false}, // FEh HuC3 (Todo: Mapper support only) + { GB_HUC1 , GB_STANDARD_MBC, true , true , false, false}, // FFh HuC1+RAM+BATTERY (Todo: No IR bindings) +}; + +void GB_update_mbc_mappings(GB_gameboy_t *gb) +{ + switch (gb->cartridge_type->mbc_type) { + case GB_NO_MBC: return; + case GB_MBC1: + switch (gb->mbc1_wiring) { + case GB_STANDARD_MBC1_WIRING: + gb->mbc_rom_bank = gb->mbc1.bank_low | (gb->mbc1.bank_high << 5); + if (gb->mbc1.mode == 0) { + gb->mbc_ram_bank = 0; + gb->mbc_rom0_bank = 0; + } + else { + gb->mbc_ram_bank = gb->mbc1.bank_high; + gb->mbc_rom0_bank = gb->mbc1.bank_high << 5; + } + if ((gb->mbc_rom_bank & 0x1F) == 0) { + gb->mbc_rom_bank++; + } + break; + case GB_MBC1M_WIRING: + gb->mbc_rom_bank = (gb->mbc1.bank_low & 0xF) | (gb->mbc1.bank_high << 4); + if (gb->mbc1.mode == 0) { + gb->mbc_ram_bank = 0; + gb->mbc_rom0_bank = 0; + } + else { + gb->mbc_rom0_bank = gb->mbc1.bank_high << 4; + gb->mbc_ram_bank = 0; + } + if ((gb->mbc1.bank_low & 0x1F) == 0) { + gb->mbc_rom_bank++; + } + break; + } + break; + case GB_MBC2: + gb->mbc_rom_bank = gb->mbc2.rom_bank; + if ((gb->mbc_rom_bank & 0xF) == 0) { + gb->mbc_rom_bank = 1; + } + break; + case GB_MBC3: + gb->mbc_rom_bank = gb->mbc3.rom_bank; + gb->mbc_ram_bank = gb->mbc3.ram_bank; + if (gb->mbc_rom_bank == 0) { + gb->mbc_rom_bank = 1; + } + break; + case GB_MBC5: + gb->mbc_rom_bank = gb->mbc5.rom_bank_low | (gb->mbc5.rom_bank_high << 8); + gb->mbc_ram_bank = gb->mbc5.ram_bank; + break; + case GB_HUC1: + if (gb->huc1.mode == 0) { + gb->mbc_rom_bank = gb->huc1.bank_low | (gb->mbc1.bank_high << 6); + gb->mbc_ram_bank = 0; + } + else { + gb->mbc_rom_bank = gb->huc1.bank_low; + gb->mbc_ram_bank = gb->huc1.bank_high; + } + break; + case GB_HUC3: + gb->mbc_rom_bank = gb->huc3.rom_bank; + gb->mbc_ram_bank = gb->huc3.ram_bank; + break; + } +} + +void GB_configure_cart(GB_gameboy_t *gb) +{ + gb->cartridge_type = &GB_cart_defs[gb->rom[0x147]]; + + if (gb->rom[0x147] == 0 && gb->rom_size > 0x8000) { + GB_log(gb, "ROM header reports no MBC, but file size is over 32Kb. Assuming cartridge uses MBC3.\n"); + gb->cartridge_type = &GB_cart_defs[0x11]; + } + else if (gb->rom[0x147] != 0 && memcmp(gb->cartridge_type, &GB_cart_defs[0], sizeof(GB_cart_defs[0])) == 0) { + GB_log(gb, "Cartridge type %02x is not yet supported.\n", gb->rom[0x147]); + } + + if (gb->cartridge_type->has_ram) { + if (gb->cartridge_type->mbc_type == GB_MBC2) { + gb->mbc_ram_size = 0x200; + } + else { + static const int ram_sizes[256] = {0, 0x800, 0x2000, 0x8000, 0x20000, 0x10000}; + gb->mbc_ram_size = ram_sizes[gb->rom[0x149]]; + } + gb->mbc_ram = malloc(gb->mbc_ram_size); + + /* Todo: Some games assume unintialized MBC RAM is 0xFF. It this true for all cartridges types? */ + memset(gb->mbc_ram, 0xFF, gb->mbc_ram_size); + } + + /* MBC1 has at least 3 types of wiring (We currently support two (Standard and 4bit-MBC1M) of these). + See http://forums.nesdev.com/viewtopic.php?f=20&t=14099 */ + + /* Attempt to "guess" wiring */ + if (gb->cartridge_type->mbc_type == GB_MBC1) { + if (gb->rom_size >= 0x44000 && memcmp(gb->rom + 0x104, gb->rom + 0x40104, 0x30) == 0) { + gb->mbc1_wiring = GB_MBC1M_WIRING; + } + } + + /* Set MBC5's bank to 1 correctly */ + if (gb->cartridge_type->mbc_type == GB_MBC5) { + gb->mbc5.rom_bank_low = 1; + } +} diff --git a/waterbox/sameboy/mbc.h b/waterbox/sameboy/mbc.h new file mode 100644 index 0000000000..e7260f5643 --- /dev/null +++ b/waterbox/sameboy/mbc.h @@ -0,0 +1,31 @@ +#ifndef MBC_h +#define MBC_h +#include "gb_struct_def.h" + +typedef struct { + enum { + GB_NO_MBC, + GB_MBC1, + GB_MBC2, + GB_MBC3, + GB_MBC5, + GB_HUC1, /* Todo: HUC1 features are not emulated. Should be unified with the CGB IR sensor API. */ + GB_HUC3, + } mbc_type; + enum { + GB_STANDARD_MBC, + GB_CAMERA, + } mbc_subtype; + bool has_ram; + bool has_battery; + bool has_rtc; + bool has_rumble; +} GB_cartridge_t; + +#ifdef GB_INTERNAL +extern const GB_cartridge_t GB_cart_defs[256]; +void GB_update_mbc_mappings(GB_gameboy_t *gb); +void GB_configure_cart(GB_gameboy_t *gb); +#endif + +#endif /* MBC_h */ diff --git a/waterbox/sameboy/memory.c b/waterbox/sameboy/memory.c new file mode 100644 index 0000000000..c914e55965 --- /dev/null +++ b/waterbox/sameboy/memory.c @@ -0,0 +1,726 @@ +#include +#include +#include "gb.h" + +typedef uint8_t GB_read_function_t(GB_gameboy_t *gb, uint16_t addr); +typedef void GB_write_function_t(GB_gameboy_t *gb, uint16_t addr, uint8_t value); + +typedef enum { + GB_BUS_MAIN, /* In DMG: Cart and RAM. In CGB: Cart only */ + GB_BUS_RAM, /* In CGB only. */ + GB_BUS_VRAM, + GB_BUS_INTERNAL, /* Anything in highram. Might not be the most correct name. */ +} GB_bus_t; + +static GB_bus_t bus_for_addr(GB_gameboy_t *gb, uint16_t addr) +{ + if (addr < 0x8000) { + return GB_BUS_MAIN; + } + if (addr < 0xA000) { + return GB_BUS_VRAM; + } + if (addr < 0xC000) { + return GB_BUS_MAIN; + } + if (addr < 0xFE00) { + return gb->is_cgb? GB_BUS_RAM : GB_BUS_MAIN; + } + return GB_BUS_INTERNAL; +} + +static bool is_addr_in_dma_use(GB_gameboy_t *gb, uint16_t addr) +{ + if (!gb->dma_steps_left || (gb->dma_cycles < 0 && !gb->is_dma_restarting)) return false; + return bus_for_addr(gb, addr) == bus_for_addr(gb, gb->dma_current_src); +} + +static uint8_t read_rom(GB_gameboy_t *gb, uint16_t addr) +{ + if (addr < 0x100 && !gb->boot_rom_finished) { + return gb->boot_rom[addr]; + } + + if (addr >= 0x200 && addr < 0x900 && gb->is_cgb && !gb->boot_rom_finished) { + return gb->boot_rom[addr]; + } + + if (!gb->rom_size) { + return 0xFF; + } + unsigned int effective_address = (addr & 0x3FFF) + gb->mbc_rom0_bank * 0x4000; + return gb->rom[effective_address & (gb->rom_size - 1)]; +} + +static uint8_t read_mbc_rom(GB_gameboy_t *gb, uint16_t addr) +{ + unsigned int effective_address = (addr & 0x3FFF) + gb->mbc_rom_bank * 0x4000; + return gb->rom[effective_address & (gb->rom_size - 1)]; +} + +static uint8_t read_vram(GB_gameboy_t *gb, uint16_t addr) +{ + if (gb->vram_read_blocked) { + return 0xFF; + } + return gb->vram[(addr & 0x1FFF) + (uint16_t) gb->cgb_vram_bank * 0x2000]; +} + +static uint8_t read_mbc_ram(GB_gameboy_t *gb, uint16_t addr) +{ + if ((!gb->mbc_ram_enable || !gb->mbc_ram_size) && + gb->cartridge_type->mbc_subtype != GB_CAMERA && + gb->cartridge_type->mbc_type != GB_HUC1) return 0xFF; + + if (gb->cartridge_type->has_rtc && gb->mbc_ram_bank >= 8 && gb->mbc_ram_bank <= 0xC) { + /* RTC read */ + gb->rtc_latched.high |= ~0xC1; /* Not all bytes in RTC high are used. */ + return gb->rtc_latched.data[gb->mbc_ram_bank - 8]; + } + + if (gb->camera_registers_mapped) { + return GB_camera_read_register(gb, addr); + } + + if (!gb->mbc_ram) { + return 0xFF; + } + + if (gb->cartridge_type->mbc_subtype == GB_CAMERA && gb->mbc_ram_bank == 0 && addr >= 0xa100 && addr < 0xaf00) { + return GB_camera_read_image(gb, addr - 0xa100); + } + + uint8_t ret = gb->mbc_ram[((addr & 0x1FFF) + gb->mbc_ram_bank * 0x2000) & (gb->mbc_ram_size - 1)]; + if (gb->cartridge_type->mbc_type == GB_MBC2) { + ret |= 0xF0; + } + return ret; +} + +static uint8_t read_ram(GB_gameboy_t *gb, uint16_t addr) +{ + return gb->ram[addr & 0x0FFF]; +} + +static uint8_t read_banked_ram(GB_gameboy_t *gb, uint16_t addr) +{ + return gb->ram[(addr & 0x0FFF) + gb->cgb_ram_bank * 0x1000]; +} + +static uint8_t read_high_memory(GB_gameboy_t *gb, uint16_t addr) +{ + + if (addr < 0xFE00) { + return gb->ram[addr & 0x0FFF]; + } + + if (addr < 0xFEA0) { + if (gb->oam_read_blocked || (gb->dma_steps_left && (gb->dma_cycles > 0 || gb->is_dma_restarting))) { + return 0xFF; + } + return gb->oam[addr & 0xFF]; + } + + if (addr < 0xFF00) { + /* Unusable. CGB results are verified, but DMG results were tested on a SGB2 */ + if ((gb->io_registers[GB_IO_STAT] & 0x3) >= 2) { /* Seems to be disabled in Modes 2 and 3 */ + return 0xFF; + } + if (gb->is_cgb) { + return (addr & 0xF0) | ((addr >> 4) & 0xF); + } + return 0; + + } + + if (addr < 0xFF80) { + switch (addr & 0xFF) { + case GB_IO_IF: + return gb->io_registers[GB_IO_IF] | 0xE0; + case GB_IO_TAC: + return gb->io_registers[GB_IO_TAC] | 0xF8; + case GB_IO_STAT: + return gb->io_registers[GB_IO_STAT] | 0x80; + case GB_IO_DMG_EMULATION_INDICATION: + if (!gb->cgb_mode) { + return 0xFF; + } + return gb->io_registers[GB_IO_DMG_EMULATION_INDICATION] | 0xFE; + + case GB_IO_PCM_12: + case GB_IO_PCM_34: + { + if (!gb->is_cgb) return 0xFF; + GB_sample_t dummy; + GB_apu_get_samples_and_update_pcm_regs(gb, &dummy); + } + /* Fall through */ + case GB_IO_JOYP: + case GB_IO_TMA: + case GB_IO_LCDC: + case GB_IO_SCY: + case GB_IO_SCX: + case GB_IO_LY: + case GB_IO_LYC: + case GB_IO_BGP: + case GB_IO_OBP0: + case GB_IO_OBP1: + case GB_IO_WY: + case GB_IO_WX: + case GB_IO_SC: + case GB_IO_SB: + return gb->io_registers[addr & 0xFF]; + case GB_IO_TIMA: + if (gb->tima_reload_state == GB_TIMA_RELOADING) { + return 0; + } + return gb->io_registers[GB_IO_TIMA]; + case GB_IO_DIV: + return gb->div_cycles >> 8; + case GB_IO_HDMA5: + if (!gb->cgb_mode) return 0xFF; + return ((gb->hdma_on || gb->hdma_on_hblank)? 0 : 0x80) | ((gb->hdma_steps_left - 1) & 0x7F); + case GB_IO_SVBK: + if (!gb->cgb_mode) { + return 0xFF; + } + return gb->cgb_ram_bank | ~0x7; + case GB_IO_VBK: + if (!gb->is_cgb) { + return 0xFF; + } + return gb->cgb_vram_bank | ~0x1; + + /* Todo: It seems that a CGB in DMG mode can access BGPI and OBPI, but not BGPD and OBPD? */ + case GB_IO_BGPI: + case GB_IO_OBPI: + if (!gb->is_cgb) { + return 0xFF; + } + return gb->io_registers[addr & 0xFF] | 0x40; + + case GB_IO_BGPD: + case GB_IO_OBPD: + { + if (!gb->cgb_mode && gb->boot_rom_finished) { + return 0xFF; + } + uint8_t index_reg = (addr & 0xFF) - 1; + return ((addr & 0xFF) == GB_IO_BGPD? + gb->background_palettes_data : + gb->sprite_palettes_data)[gb->io_registers[index_reg] & 0x3F]; + } + + case GB_IO_KEY1: + if (!gb->cgb_mode) { + return 0xFF; + } + return (gb->io_registers[GB_IO_KEY1] & 0x7F) | (gb->cgb_double_speed? 0xFE : 0x7E); + + case GB_IO_RP: { + if (!gb->cgb_mode) return 0xFF; + /* You will read your own IR LED if it's on. */ + bool read_value = gb->infrared_input || (gb->io_registers[GB_IO_RP] & 1); + uint8_t ret = (gb->io_registers[GB_IO_RP] & 0xC1) | 0x3C; + if ((gb->io_registers[GB_IO_RP] & 0xC0) == 0xC0 && read_value) { + ret |= 2; + } + return ret; + } + case GB_IO_DMA: + /* Todo: is this documented? */ + return gb->is_cgb? 0x00 : 0xFF; + case GB_IO_UNKNOWN2: + case GB_IO_UNKNOWN3: + return gb->is_cgb? gb->io_registers[addr & 0xFF] : 0xFF; + case GB_IO_UNKNOWN4: + return gb->cgb_mode? gb->io_registers[addr & 0xFF] : 0xFF; + case GB_IO_UNKNOWN5: + return gb->is_cgb? gb->io_registers[addr & 0xFF] | 0x8F : 0xFF; + default: + if ((addr & 0xFF) >= GB_IO_NR10 && (addr & 0xFF) <= GB_IO_WAV_END) { + return GB_apu_read(gb, addr & 0xFF); + } + return 0xFF; + } + /* Hardware registers */ + return 0; + } + + if (addr == 0xFFFF) { + /* Interrupt Mask */ + return gb->interrupt_enable; + } + + /* HRAM */ + return gb->hram[addr - 0xFF80]; +} + +static GB_read_function_t * const read_map[] = +{ + read_rom, read_rom, read_rom, read_rom, /* 0XXX, 1XXX, 2XXX, 3XXX */ + read_mbc_rom, read_mbc_rom, read_mbc_rom, read_mbc_rom, /* 4XXX, 5XXX, 6XXX, 7XXX */ + read_vram, read_vram, /* 8XXX, 9XXX */ + read_mbc_ram, read_mbc_ram, /* AXXX, BXXX */ + read_ram, read_banked_ram, /* CXXX, DXXX */ + read_high_memory, read_high_memory, /* EXXX FXXX */ +}; + +uint8_t GB_read_memory(GB_gameboy_t *gb, uint16_t addr) +{ + if (gb->n_watchpoints) { + GB_debugger_test_read_watchpoint(gb, addr); + } + if (is_addr_in_dma_use(gb, addr)) { + addr = gb->dma_current_src; + } + return read_map[addr >> 12](gb, addr); +} + +static void write_mbc(GB_gameboy_t *gb, uint16_t addr, uint8_t value) +{ + switch (gb->cartridge_type->mbc_type) { + case GB_NO_MBC: return; + case GB_MBC1: + switch (addr & 0xF000) { + case 0x0000: case 0x1000: gb->mbc_ram_enable = (value & 0xF) == 0xA; break; + case 0x2000: case 0x3000: gb->mbc1.bank_low = value; break; + case 0x4000: case 0x5000: gb->mbc1.bank_high = value; break; + case 0x6000: case 0x7000: gb->mbc1.mode = value; break; + } + break; + case GB_MBC2: + switch (addr & 0xF000) { + case 0x0000: case 0x1000: if (!(addr & 0x100)) gb->mbc_ram_enable = (value & 0xF) == 0xA; break; + case 0x2000: case 0x3000: if ( addr & 0x100) gb->mbc2.rom_bank = value; break; + } + break; + case GB_MBC3: + switch (addr & 0xF000) { + case 0x0000: case 0x1000: gb->mbc_ram_enable = (value & 0xF) == 0xA; break; + case 0x2000: case 0x3000: gb->mbc3.rom_bank = value; break; + case 0x4000: case 0x5000: gb->mbc3.ram_bank = value; break; + case 0x6000: case 0x7000: + if (!gb->rtc_latch && (value & 1)) { /* Todo: verify condition is correct */ + memcpy(&gb->rtc_latched, &gb->rtc_real, sizeof(gb->rtc_real)); + } + gb->rtc_latch = value & 1; + break; + } + break; + case GB_MBC5: + switch (addr & 0xF000) { + case 0x0000: case 0x1000: gb->mbc_ram_enable = (value & 0xF) == 0xA; break; + case 0x2000: gb->mbc5.rom_bank_low = value; break; + case 0x3000: gb->mbc5.rom_bank_high = value; break; + case 0x4000: case 0x5000: + if (gb->cartridge_type->has_rumble) { + if (!!(value & 8) != gb->rumble_state) { + gb->rumble_state = !gb->rumble_state; + if (gb->rumble_callback) { + gb->rumble_callback(gb, gb->rumble_state); + } + } + value &= 7; + } + gb->mbc5.ram_bank = value; + gb->camera_registers_mapped = (value & 0x10) && gb->cartridge_type->mbc_subtype == GB_CAMERA; + break; + } + break; + case GB_HUC1: + switch (addr & 0xF000) { + case 0x0000: case 0x1000: gb->mbc_ram_enable = (value & 0xF) == 0xA; break; + case 0x2000: case 0x3000: gb->huc1.bank_low = value; break; + case 0x4000: case 0x5000: gb->huc1.bank_high = value; break; + case 0x6000: case 0x7000: gb->huc1.mode = value; break; + } + break; + case GB_HUC3: + switch (addr & 0xF000) { + case 0x0000: case 0x1000: gb->mbc_ram_enable = (value & 0xF) == 0xA; break; + case 0x2000: case 0x3000: gb->huc3.rom_bank = value; break; + case 0x4000: case 0x5000: gb->huc3.ram_bank = value; break; + } + break; + } + GB_update_mbc_mappings(gb); +} + +static void write_vram(GB_gameboy_t *gb, uint16_t addr, uint8_t value) +{ + if (gb->vram_write_blocked) { + //GB_log(gb, "Wrote %02x to %04x (VRAM) during mode 3\n", value, addr); + return; + } + gb->vram[(addr & 0x1FFF) + (uint16_t) gb->cgb_vram_bank * 0x2000] = value; +} + +static void write_mbc_ram(GB_gameboy_t *gb, uint16_t addr, uint8_t value) +{ + if (gb->camera_registers_mapped) { + GB_camera_write_register(gb, addr, value); + return; + } + + if (!gb->mbc_ram_enable || !gb->mbc_ram_size) return; + + if (gb->cartridge_type->has_rtc && gb->mbc_ram_bank >= 8 && gb->mbc_ram_bank <= 0xC) { + /* RTC read */ + gb->rtc_latched.data[gb->mbc_ram_bank - 8] = gb->rtc_real.data[gb->mbc_ram_bank - 8] = value; /* Todo: does it really write both? */ + } + + if (!gb->mbc_ram) { + return; + } + + gb->mbc_ram[((addr & 0x1FFF) + gb->mbc_ram_bank * 0x2000) & (gb->mbc_ram_size - 1)] = value; +} + +static void write_ram(GB_gameboy_t *gb, uint16_t addr, uint8_t value) +{ + gb->ram[addr & 0x0FFF] = value; +} + +static void write_banked_ram(GB_gameboy_t *gb, uint16_t addr, uint8_t value) +{ + gb->ram[(addr & 0x0FFF) + gb->cgb_ram_bank * 0x1000] = value; +} + +static void write_high_memory(GB_gameboy_t *gb, uint16_t addr, uint8_t value) +{ + if (addr < 0xFE00) { + GB_log(gb, "Wrote %02x to %04x (RAM Mirror)\n", value, addr); + gb->ram[addr & 0x0FFF] = value; + return; + } + + if (addr < 0xFEA0) { + if (gb->oam_write_blocked|| (gb->dma_steps_left && (gb->dma_cycles > 0 || gb->is_dma_restarting))) { + return; + } + gb->oam[addr & 0xFF] = value; + return; + } + + if (addr < 0xFF00) { + GB_log(gb, "Wrote %02x to %04x (Unused)\n", value, addr); + return; + } + + if (addr < 0xFF80) { + /* Hardware registers */ + switch (addr & 0xFF) { + + case GB_IO_SCX: + case GB_IO_IF: + case GB_IO_SCY: + case GB_IO_LYC: + case GB_IO_BGP: + case GB_IO_OBP0: + case GB_IO_OBP1: + case GB_IO_WY: + case GB_IO_WX: + case GB_IO_SB: + case GB_IO_DMG_EMULATION_INDICATION: + case GB_IO_UNKNOWN2: + case GB_IO_UNKNOWN3: + case GB_IO_UNKNOWN4: + case GB_IO_UNKNOWN5: + gb->io_registers[addr & 0xFF] = value; + return; + + case GB_IO_TIMA: + if (gb->tima_reload_state != GB_TIMA_RELOADED) { + gb->io_registers[GB_IO_TIMA] = value; + } + return; + + case GB_IO_TMA: + gb->io_registers[GB_IO_TMA] = value; + if (gb->tima_reload_state != GB_TIMA_RUNNING) { + gb->io_registers[GB_IO_TIMA] = value; + } + return; + + case GB_IO_TAC: + GB_emulate_timer_glitch(gb, gb->io_registers[GB_IO_TAC], value); + gb->io_registers[GB_IO_TAC] = value; + return; + + + case GB_IO_LCDC: + if ((value & 0x80) && !(gb->io_registers[GB_IO_LCDC] & 0x80)) { + /* It appears that there's a slight delay after enabling the screen? */ + /* Todo: verify this. */ + gb->display_cycles = 0; + gb->first_scanline = true; + if (gb->frame_skip_state == GB_FRAMESKIP_SECOND_FRAME_RENDERED) { + gb->frame_skip_state = GB_FRAMESKIP_LCD_TURNED_ON; + } + } + else if (!(value & 0x80) && (gb->io_registers[GB_IO_LCDC] & 0x80)) { + /* Sync after turning off LCD */ + GB_timing_sync(gb); + } + gb->io_registers[GB_IO_LCDC] = value; + return; + + case GB_IO_STAT: + /* A DMG bug: http://www.devrs.com/gb/files/faqs.html#GBBugs */ + if (!gb->is_cgb && !gb->stat_interrupt_line && + (gb->io_registers[GB_IO_STAT] & 0x3) < 2 && (gb->io_registers[GB_IO_LCDC] & 0x80)) { + gb->io_registers[GB_IO_IF] |= 2; + } + /* Delete previous R/W bits */ + gb->io_registers[GB_IO_STAT] &= 7; + /* Set them by value */ + gb->io_registers[GB_IO_STAT] |= value & ~7; + /* Set unused bit to 1 */ + gb->io_registers[GB_IO_STAT] |= 0x80; + return; + + case GB_IO_DIV: + GB_set_internal_div_counter(gb, 0); + return; + + case GB_IO_JOYP: + gb->io_registers[GB_IO_JOYP] &= 0x0F; + gb->io_registers[GB_IO_JOYP] |= value & 0xF0; + GB_update_joyp(gb); + return; + + case GB_IO_BIOS: + gb->boot_rom_finished = true; + return; + + case GB_IO_DMG_EMULATION: + if (gb->is_cgb && !gb->boot_rom_finished) { + gb->cgb_mode = value != 4; /* The real "contents" of this register aren't quite known yet. */ + } + return; + + case GB_IO_DMA: + if (value <= 0xE0) { + if (gb->dma_steps_left) { + /* This is not correct emulation, since we're not really delaying the second DMA. + One write that should have happened in the first DMA will not happen. However, + since that byte will be overwritten by the second DMA before it can actually be + read, it doesn't actually matter. */ + gb->is_dma_restarting = true; + } + gb->dma_cycles = -7; + gb->dma_current_dest = 0; + gb->dma_current_src = value << 8; + gb->dma_steps_left = 0xa0; + } + /* else { what? } */ + + return; + case GB_IO_SVBK: + if (!gb->cgb_mode) { + return; + } + gb->cgb_ram_bank = value & 0x7; + if (!gb->cgb_ram_bank) { + gb->cgb_ram_bank++; + } + return; + case GB_IO_VBK: + if (!gb->cgb_mode) { + return; + } + gb->cgb_vram_bank = value & 0x1; + return; + + case GB_IO_BGPI: + case GB_IO_OBPI: + if (!gb->is_cgb) { + return; + } + gb->io_registers[addr & 0xFF] = value; + return; + case GB_IO_BGPD: + case GB_IO_OBPD: + if (!gb->cgb_mode && gb->boot_rom_finished) { + /* Todo: Due to the behavior of a broken Game & Watch Gallery 2 ROM on a real CGB. A proper test ROM + is required. */ + return; + } + uint8_t index_reg = (addr & 0xFF) - 1; + ((addr & 0xFF) == GB_IO_BGPD? + gb->background_palettes_data : + gb->sprite_palettes_data)[gb->io_registers[index_reg] & 0x3F] = value; + GB_palette_changed(gb, (addr & 0xFF) == GB_IO_BGPD, gb->io_registers[index_reg] & 0x3F); + if (gb->io_registers[index_reg] & 0x80) { + gb->io_registers[index_reg]++; + gb->io_registers[index_reg] |= 0x80; + } + return; + case GB_IO_KEY1: + if (!gb->is_cgb) { + return; + } + gb->io_registers[GB_IO_KEY1] = value; + return; + case GB_IO_HDMA1: + if (gb->cgb_mode) { + gb->hdma_current_src &= 0xF0; + gb->hdma_current_src |= value << 8; + } + return; + case GB_IO_HDMA2: + if (gb->cgb_mode) { + gb->hdma_current_src &= 0xFF00; + gb->hdma_current_src |= value & 0xF0; + } + return; + case GB_IO_HDMA3: + if (gb->cgb_mode) { + gb->hdma_current_dest &= 0xF0; + gb->hdma_current_dest |= value << 8; + } + return; + case GB_IO_HDMA4: + if (gb->cgb_mode) { + gb->hdma_current_dest &= 0x1F00; + gb->hdma_current_dest |= value & 0xF0; + } + return; + case GB_IO_HDMA5: + if (!gb->cgb_mode) return; + if ((value & 0x80) == 0 && gb->hdma_on_hblank) { + gb->hdma_on_hblank = false; + return; + } + gb->hdma_on = (value & 0x80) == 0; + gb->hdma_on_hblank = (value & 0x80) != 0; + if (gb->hdma_on_hblank && (gb->io_registers[GB_IO_STAT] & 3) == 0) { + gb->hdma_on = true; + gb->hdma_cycles = 0; + } + gb->io_registers[GB_IO_HDMA5] = value; + gb->hdma_steps_left = (gb->io_registers[GB_IO_HDMA5] & 0x7F) + 1; + /* Todo: Verify this. Gambatte's DMA tests require this. */ + if (gb->hdma_current_dest + (gb->hdma_steps_left << 4) > 0xFFFF) { + gb->hdma_steps_left = (0x10000 - gb->hdma_current_dest) >> 4; + } + gb->hdma_cycles = 0; + return; + + /* Todo: what happens when starting a transfer during a transfer? + What happens when starting a transfer during external clock? + */ + case GB_IO_SC: + if (!gb->cgb_mode) { + value |= 2; + } + gb->io_registers[GB_IO_SC] = value | (~0x83); + if ((value & 0x80) && (value & 0x1) ) { + gb->serial_length = gb->cgb_mode && (value & 2)? 128 : 4096; + /* Todo: This is probably incorrect for CGB's faster clock mode. */ + gb->serial_cycles &= 0xFF; + if (gb->serial_transfer_start_callback) { + gb->serial_transfer_start_callback(gb, gb->io_registers[GB_IO_SB]); + } + } + else { + gb->serial_length = 0; + } + return; + + case GB_IO_RP: { + if (!gb->is_cgb) { + return; + } + if ((value & 1) != (gb->io_registers[GB_IO_RP] & 1)) { + if (gb->infrared_callback) { + gb->infrared_callback(gb, value & 1, gb->cycles_since_ir_change); + gb->cycles_since_ir_change = 0; + } + } + gb->io_registers[GB_IO_RP] = value; + return; + } + + default: + if ((addr & 0xFF) >= GB_IO_NR10 && (addr & 0xFF) <= GB_IO_WAV_END) { + GB_apu_write(gb, addr & 0xFF, value); + return; + } + GB_log(gb, "Wrote %02x to %04x (HW Register)\n", value, addr); + return; + } + } + + if (addr == 0xFFFF) { + /* Interrupt mask */ + gb->interrupt_enable = value; + return; + } + + /* HRAM */ + gb->hram[addr - 0xFF80] = value; +} + + + +static GB_write_function_t * const write_map[] = +{ + write_mbc, write_mbc, write_mbc, write_mbc, /* 0XXX, 1XXX, 2XXX, 3XXX */ + write_mbc, write_mbc, write_mbc, write_mbc, /* 4XXX, 5XXX, 6XXX, 7XXX */ + write_vram, write_vram, /* 8XXX, 9XXX */ + write_mbc_ram, write_mbc_ram, /* AXXX, BXXX */ + write_ram, write_banked_ram, /* CXXX, DXXX */ + write_high_memory, write_high_memory, /* EXXX FXXX */ +}; + +void GB_write_memory(GB_gameboy_t *gb, uint16_t addr, uint8_t value) +{ + if (gb->n_watchpoints) { + GB_debugger_test_write_watchpoint(gb, addr, value); + } + if (is_addr_in_dma_use(gb, addr)) { + /* Todo: What should happen? Will this affect DMA? Will data be written? What and where? */ + return; + } + write_map[addr >> 12](gb, addr, value); +} + +void GB_dma_run(GB_gameboy_t *gb) +{ + while (gb->dma_cycles >= 4 && gb->dma_steps_left) { + /* Todo: measure this value */ + gb->dma_cycles -= 4; + gb->dma_steps_left--; + gb->oam[gb->dma_current_dest++] = GB_read_memory(gb, gb->dma_current_src); + /* dma_current_src must be the correct value during GB_read_memory */ + gb->dma_current_src++; + if (!gb->dma_steps_left) { + gb->is_dma_restarting = false; + } + } +} + +void GB_hdma_run(GB_gameboy_t *gb) +{ + if (!gb->hdma_on) return; + while (gb->hdma_cycles >= 8) { + gb->hdma_cycles -= 8; + + for (uint8_t i = 0; i < 0x10; i++) { + GB_write_memory(gb, 0x8000 | (gb->hdma_current_dest++ & 0x1FFF), GB_read_memory(gb, (gb->hdma_current_src++))); + } + + if(--gb->hdma_steps_left == 0){ + gb->hdma_on = false; + gb->hdma_on_hblank = false; + gb->io_registers[GB_IO_HDMA5] &= 0x7F; + break; + } + if (gb->hdma_on_hblank) { + gb->hdma_on = false; + break; + } + } +} diff --git a/waterbox/sameboy/memory.h b/waterbox/sameboy/memory.h new file mode 100644 index 0000000000..16b3b9220f --- /dev/null +++ b/waterbox/sameboy/memory.h @@ -0,0 +1,12 @@ +#ifndef memory_h +#define memory_h +#include "gb.h" + +uint8_t GB_read_memory(GB_gameboy_t *gb, uint16_t addr); +void GB_write_memory(GB_gameboy_t *gb, uint16_t addr, uint8_t value); +#ifdef GB_INTERNAL +void GB_dma_run(GB_gameboy_t *gb); +void GB_hdma_run(GB_gameboy_t *gb); +#endif + +#endif /* memory_h */ diff --git a/waterbox/sameboy/printer.c b/waterbox/sameboy/printer.c new file mode 100644 index 0000000000..bc1d45ab47 --- /dev/null +++ b/waterbox/sameboy/printer.c @@ -0,0 +1,201 @@ +#include "gb.h" + +/* TODO: Emulation is VERY basic and assumes the ROM correctly uses the printer's interface. + Incorrect usage is not correctly emulated, as it's not well documented, nor do I + have my own GB Printer to figure it out myself. + + It also does not currently emulate communication timeout, which means that a bug + might prevent the printer operation until the GameBoy is restarted. + + Also, field mask values are assumed. */ + +static void handle_command(GB_gameboy_t *gb) +{ + + switch (gb->printer.command_id) { + case GB_PRINTER_INIT_COMMAND: + gb->printer.status = 0; + gb->printer.image_offset = 0; + break; + + case GB_PRINTER_START_COMMAND: + if (gb->printer.command_length == 4) { + gb->printer.status = 6; /* Printing */ + uint32_t image[gb->printer.image_offset]; + uint8_t palette = gb->printer.command_data[2]; + uint32_t colors[4] = {gb->rgb_encode_callback(gb, 0xff, 0xff, 0xff), + gb->rgb_encode_callback(gb, 0xaa, 0xaa, 0xaa), + gb->rgb_encode_callback(gb, 0x55, 0x55, 0x55), + gb->rgb_encode_callback(gb, 0x00, 0x00, 0x00)}; + for (unsigned i = 0; i < gb->printer.image_offset; i++) { + image[i] = colors[(palette >> (gb->printer.image[i] * 2)) & 3]; + } + + if (gb->printer.callback) { + gb->printer.callback(gb, image, gb->printer.image_offset / 160, + gb->printer.command_data[1] >> 4, gb->printer.command_data[1] & 7, + gb->printer.command_data[3] & 0x7F); + } + + gb->printer.image_offset = 0; + } + break; + + case GB_PRINTER_DATA_COMMAND: + if (gb->printer.command_length == GB_PRINTER_DATA_SIZE) { + gb->printer.image_offset %= sizeof(gb->printer.image); + gb->printer.status = 8; /* Received 0x280 bytes */ + + uint8_t *byte = gb->printer.command_data; + + for (unsigned row = 2; row--; ) { + for (unsigned tile_x = 0; tile_x < 160 / 8; tile_x++) { + for (unsigned y = 0; y < 8; y++, byte += 2) { + for (unsigned x_pixel = 0; x_pixel < 8; x_pixel++) { + gb->printer.image[gb->printer.image_offset + tile_x * 8 + x_pixel + y * 160] = + ((*byte) >> 7) | (((*(byte + 1)) >> 7) << 1); + (*byte) <<= 1; + (*(byte + 1)) <<= 1; + } + } + } + + gb->printer.image_offset += 8 * 160; + } + } + + case GB_PRINTER_NOP_COMMAND: + default: + break; + } +} + +static void serial_start(GB_gameboy_t *gb, uint8_t byte_received) +{ + gb->printer.byte_to_send = 0; + switch (gb->printer.command_state) { + case GB_PRINTER_COMMAND_MAGIC1: + if (byte_received != 0x88) { + return; + } + gb->printer.status &= ~1; + gb->printer.command_length = 0; + gb->printer.checksum = 0; + break; + + case GB_PRINTER_COMMAND_MAGIC2: + if (byte_received != 0x33) { + if (byte_received != 0x88) { + gb->printer.command_state = GB_PRINTER_COMMAND_MAGIC1; + } + return; + } + break; + + case GB_PRINTER_COMMAND_ID: + gb->printer.command_id = byte_received & 0xF; + break; + + case GB_PRINTER_COMMAND_COMPRESSION: + gb->printer.compression = byte_received & 1; + break; + + case GB_PRINTER_COMMAND_LENGTH_LOW: + gb->printer.length_left = byte_received; + break; + + case GB_PRINTER_COMMAND_LENGTH_HIGH: + gb->printer.length_left |= (byte_received & 3) << 8; + break; + + case GB_PRINTER_COMMAND_DATA: + if (gb->printer.command_length != GB_PRINTER_MAX_COMMAND_LENGTH) { + if (gb->printer.compression) { + if (!gb->printer.compression_run_lenth) { + gb->printer.compression_run_is_compressed = byte_received & 0x80; + gb->printer.compression_run_lenth = (byte_received & 0x7F) + 1 + gb->printer.compression_run_is_compressed; + } + else if (gb->printer.compression_run_is_compressed) { + while (gb->printer.compression_run_lenth) { + gb->printer.command_data[gb->printer.command_length++] = byte_received; + gb->printer.compression_run_lenth--; + if (gb->printer.command_length == GB_PRINTER_MAX_COMMAND_LENGTH) { + gb->printer.compression_run_lenth = 0; + } + } + } + else { + gb->printer.command_data[gb->printer.command_length++] = byte_received; + gb->printer.compression_run_lenth--; + } + } + else { + gb->printer.command_data[gb->printer.command_length++] = byte_received; + } + } + gb->printer.length_left--; + break; + + case GB_PRINTER_COMMAND_CHECKSUM_LOW: + gb->printer.checksum ^= byte_received; + break; + + case GB_PRINTER_COMMAND_CHECKSUM_HIGH: + gb->printer.checksum ^= byte_received << 8; + if (gb->printer.checksum) { + gb->printer.status |= 1; /* Checksum error*/ + gb->printer.command_state = GB_PRINTER_COMMAND_MAGIC1; + return; + } + break; + case GB_PRINTER_COMMAND_ACTIVE: + gb->printer.byte_to_send = 0x81; + break; + case GB_PRINTER_COMMAND_STATUS: + + if ((gb->printer.command_id & 0xF) == GB_PRINTER_INIT_COMMAND) { + /* Games expect INIT commands to return 0? */ + gb->printer.byte_to_send = 0; + } + else { + gb->printer.byte_to_send = gb->printer.status; + } + + /* Printing is done instantly, but let the game recieve a 6 (Printing) status at least once, for compatibility */ + if (gb->printer.status == 6) { + gb->printer.status = 4; /* Done */ + } + + gb->printer.command_state = GB_PRINTER_COMMAND_MAGIC1; + handle_command(gb); + return; + } + + if (gb->printer.command_state >= GB_PRINTER_COMMAND_ID && gb->printer.command_state < GB_PRINTER_COMMAND_CHECKSUM_LOW) { + gb->printer.checksum += byte_received; + } + + if (gb->printer.command_state != GB_PRINTER_COMMAND_DATA) { + gb->printer.command_state++; + } + + if (gb->printer.command_state == GB_PRINTER_COMMAND_DATA) { + if (gb->printer.length_left == 0) { + gb->printer.command_state++; + } + } + +} + +static uint8_t serial_end(GB_gameboy_t *gb) +{ + return gb->printer.byte_to_send; +} + +void GB_connect_printer(GB_gameboy_t *gb, GB_print_image_callback_t callback) +{ + memset(&gb->printer, 0, sizeof(gb->printer)); + GB_set_serial_transfer_start_callback(gb, serial_start); + GB_set_serial_transfer_end_callback(gb, serial_end); + gb->printer.callback = callback; +} \ No newline at end of file diff --git a/waterbox/sameboy/printer.h b/waterbox/sameboy/printer.h new file mode 100644 index 0000000000..e5d9036a08 --- /dev/null +++ b/waterbox/sameboy/printer.h @@ -0,0 +1,59 @@ +#ifndef printer_h +#define printer_h +#include +#include +#include "gb_struct_def.h" +#define GB_PRINTER_MAX_COMMAND_LENGTH 0x280 +#define GB_PRINTER_DATA_SIZE 0x280 + +typedef void (*GB_print_image_callback_t)(GB_gameboy_t *gb, + uint32_t *image, + uint8_t height, + uint8_t top_margin, + uint8_t bottom_margin, + uint8_t exposure); + + +typedef struct +{ + /* Communication state machine */ + + enum { + GB_PRINTER_COMMAND_MAGIC1, + GB_PRINTER_COMMAND_MAGIC2, + GB_PRINTER_COMMAND_ID, + GB_PRINTER_COMMAND_COMPRESSION, + GB_PRINTER_COMMAND_LENGTH_LOW, + GB_PRINTER_COMMAND_LENGTH_HIGH, + GB_PRINTER_COMMAND_DATA, + GB_PRINTER_COMMAND_CHECKSUM_LOW, + GB_PRINTER_COMMAND_CHECKSUM_HIGH, + GB_PRINTER_COMMAND_ACTIVE, + GB_PRINTER_COMMAND_STATUS, + } command_state : 8; + enum { + GB_PRINTER_INIT_COMMAND = 1, + GB_PRINTER_START_COMMAND = 2, + GB_PRINTER_DATA_COMMAND = 4, + GB_PRINTER_NOP_COMMAND = 0xF, + } command_id : 8; + bool compression; + uint16_t length_left; + uint8_t command_data[GB_PRINTER_MAX_COMMAND_LENGTH]; + uint16_t command_length; + uint16_t checksum; + uint8_t status; + uint8_t byte_to_send; + + uint8_t image[160 * 200]; + uint16_t image_offset; + + GB_print_image_callback_t callback; + + uint8_t compression_run_lenth; + bool compression_run_is_compressed; +} GB_printer_t; + + +void GB_connect_printer(GB_gameboy_t *gb, GB_print_image_callback_t callback); +#endif diff --git a/waterbox/sameboy/save_state.c b/waterbox/sameboy/save_state.c new file mode 100644 index 0000000000..cd579aa800 --- /dev/null +++ b/waterbox/sameboy/save_state.c @@ -0,0 +1,304 @@ +#include "gb.h" +#include +#include + +static bool dump_section(FILE *f, const void *src, uint32_t size) +{ + if (fwrite(&size, 1, sizeof(size), f) != sizeof(size)) { + return false; + } + + if (fwrite(src, 1, size, f) != size) { + return false; + } + + return true; +} + +#define DUMP_SECTION(gb, f, section) dump_section(f, GB_GET_SECTION(gb, section), GB_SECTION_SIZE(section)) + +/* Todo: we need a sane and protable save state format. */ +int GB_save_state(GB_gameboy_t *gb, const char *path) +{ + FILE *f = fopen(path, "wb"); + if (!f) { + GB_log(gb, "Could not open save state: %s.\n", strerror(errno)); + return errno; + } + + if (fwrite(GB_GET_SECTION(gb, header), 1, GB_SECTION_SIZE(header), f) != GB_SECTION_SIZE(header)) goto error; + if (!DUMP_SECTION(gb, f, core_state)) goto error; + if (!DUMP_SECTION(gb, f, dma )) goto error; + if (!DUMP_SECTION(gb, f, mbc )) goto error; + if (!DUMP_SECTION(gb, f, hram )) goto error; + if (!DUMP_SECTION(gb, f, timing )) goto error; + if (!DUMP_SECTION(gb, f, apu )) goto error; + if (!DUMP_SECTION(gb, f, rtc )) goto error; + if (!DUMP_SECTION(gb, f, video )) goto error; + + + if (fwrite(gb->mbc_ram, 1, gb->mbc_ram_size, f) != gb->mbc_ram_size) { + goto error; + } + + if (fwrite(gb->ram, 1, gb->ram_size, f) != gb->ram_size) { + goto error; + } + + if (fwrite(gb->vram, 1, gb->vram_size, f) != gb->vram_size) { + goto error; + } + + errno = 0; + +error: + fclose(f); + return errno; +} + +#undef DUMP_SECTION + +size_t GB_get_save_state_size(GB_gameboy_t *gb) +{ + return GB_SECTION_SIZE(header) + + GB_SECTION_SIZE(core_state) + sizeof(uint32_t) + + GB_SECTION_SIZE(dma ) + sizeof(uint32_t) + + GB_SECTION_SIZE(mbc ) + sizeof(uint32_t) + + GB_SECTION_SIZE(hram ) + sizeof(uint32_t) + + GB_SECTION_SIZE(timing ) + sizeof(uint32_t) + + GB_SECTION_SIZE(apu ) + sizeof(uint32_t) + + GB_SECTION_SIZE(rtc ) + sizeof(uint32_t) + + GB_SECTION_SIZE(video ) + sizeof(uint32_t) + + gb->mbc_ram_size + + gb->ram_size + + gb->vram_size; +} + +/* A write-line function for memory copying */ +static void buffer_write(const void *src, size_t size, uint8_t **dest) +{ + memcpy(*dest, src, size); + *dest += size; +} + +static void buffer_dump_section(uint8_t **buffer, const void *src, uint32_t size) +{ + buffer_write(&size, sizeof(size), buffer); + buffer_write(src, size, buffer); +} + +#define DUMP_SECTION(gb, buffer, section) buffer_dump_section(&buffer, GB_GET_SECTION(gb, section), GB_SECTION_SIZE(section)) +void GB_save_state_to_buffer(GB_gameboy_t *gb, uint8_t *buffer) +{ + buffer_write(GB_GET_SECTION(gb, header), GB_SECTION_SIZE(header), &buffer); + DUMP_SECTION(gb, buffer, core_state); + DUMP_SECTION(gb, buffer, dma ); + DUMP_SECTION(gb, buffer, mbc ); + DUMP_SECTION(gb, buffer, hram ); + DUMP_SECTION(gb, buffer, timing ); + DUMP_SECTION(gb, buffer, apu ); + DUMP_SECTION(gb, buffer, rtc ); + DUMP_SECTION(gb, buffer, video ); + + + buffer_write(gb->mbc_ram, gb->mbc_ram_size, &buffer); + buffer_write(gb->ram, gb->ram_size, &buffer); + buffer_write(gb->vram, gb->vram_size, &buffer); +} + +/* Best-effort read function for maximum future compatibility. */ +static bool read_section(FILE *f, void *dest, uint32_t size) +{ + uint32_t saved_size = 0; + if (fread(&saved_size, 1, sizeof(size), f) != sizeof(size)) { + return false; + } + + if (saved_size <= size) { + if (fread(dest, 1, saved_size, f) != saved_size) { + return false; + } + } + else { + if (fread(dest, 1, size, f) != size) { + return false; + } + fseek(f, saved_size - size, SEEK_CUR); + } + + return true; +} +#undef DUMP_SECTION + +static bool verify_state_compatibility(GB_gameboy_t *gb, GB_gameboy_t *save) +{ + if (gb->magic != save->magic) { + GB_log(gb, "File is not a save state, or is from an incompatible operating system.\n"); + return false; + } + + if (gb->version != save->version) { + GB_log(gb, "Save state is for a different version of SameBoy.\n"); + return false; + } + + if (gb->mbc_ram_size < save->mbc_ram_size) { + GB_log(gb, "Save state has non-matching MBC RAM size.\n"); + return false; + } + + if (gb->ram_size != save->ram_size) { + GB_log(gb, "Save state has non-matching RAM size. Try changing emulated model.\n"); + return false; + } + + if (gb->vram_size != save->vram_size) { + GB_log(gb, "Save state has non-matching VRAM size. Try changing emulated model.\n"); + return false; + } + + return true; +} + +#define READ_SECTION(gb, f, section) read_section(f, GB_GET_SECTION(gb, section), GB_SECTION_SIZE(section)) + +int GB_load_state(GB_gameboy_t *gb, const char *path) +{ + GB_gameboy_t save; + + /* Every unread value should be kept the same. */ + memcpy(&save, gb, sizeof(save)); + + FILE *f = fopen(path, "rb"); + if (!f) { + GB_log(gb, "Could not open save state: %s.\n", strerror(errno)); + return errno; + } + + if (fread(GB_GET_SECTION(&save, header), 1, GB_SECTION_SIZE(header), f) != GB_SECTION_SIZE(header)) goto error; + if (!READ_SECTION(&save, f, core_state)) goto error; + if (!READ_SECTION(&save, f, dma )) goto error; + if (!READ_SECTION(&save, f, mbc )) goto error; + if (!READ_SECTION(&save, f, hram )) goto error; + if (!READ_SECTION(&save, f, timing )) goto error; + if (!READ_SECTION(&save, f, apu )) goto error; + if (!READ_SECTION(&save, f, rtc )) goto error; + if (!READ_SECTION(&save, f, video )) goto error; + + if (!verify_state_compatibility(gb, &save)) { + errno = -1; + goto error; + } + + memset(gb->mbc_ram + save.mbc_ram_size, 0xFF, gb->mbc_ram_size - save.mbc_ram_size); + if (fread(gb->mbc_ram, 1, save.mbc_ram_size, f) != save.mbc_ram_size) { + fclose(f); + return EIO; + } + + if (fread(gb->ram, 1, gb->ram_size, f) != gb->ram_size) { + fclose(f); + return EIO; + } + + if (fread(gb->vram, 1, gb->vram_size, f) != gb->vram_size) { + fclose(f); + return EIO; + } + + memcpy(gb, &save, sizeof(save)); + errno = 0; + + if (gb->cartridge_type->has_rumble && gb->rumble_callback) { + gb->rumble_callback(gb, gb->rumble_state); + } + +error: + fclose(f); + return errno; +} + +#undef READ_SECTION + +/* An read-like function for buffer-copying */ +static size_t buffer_read(void *dest, size_t length, const uint8_t **buffer, size_t *buffer_length) +{ + if (length > *buffer_length) { + length = *buffer_length; + } + + memcpy(dest, *buffer, length); + *buffer += length; + *buffer_length -= length; + + return length; +} + +static bool buffer_read_section(const uint8_t **buffer, size_t *buffer_length, void *dest, uint32_t size) +{ + uint32_t saved_size = 0; + if (buffer_read(&saved_size, sizeof(size), buffer, buffer_length) != sizeof(size)) { + return false; + } + + if (saved_size <= size) { + if (buffer_read(dest, saved_size, buffer, buffer_length) != saved_size) { + return false; + } + } + else { + if (buffer_read(dest, size, buffer, buffer_length) != size) { + return false; + } + *buffer += saved_size - size; + *buffer_length -= saved_size - size; + } + + return true; +} + +#define READ_SECTION(gb, buffer, length, section) buffer_read_section(&buffer, &length, GB_GET_SECTION(gb, section), GB_SECTION_SIZE(section)) +int GB_load_state_from_buffer(GB_gameboy_t *gb, const uint8_t *buffer, size_t length) +{ + GB_gameboy_t save; + + /* Every unread value should be kept the same. */ + memcpy(&save, gb, sizeof(save)); + + if (buffer_read(GB_GET_SECTION(&save, header), GB_SECTION_SIZE(header), &buffer, &length) != GB_SECTION_SIZE(header)) return -1; + if (!READ_SECTION(&save, buffer, length, core_state)) return -1; + if (!READ_SECTION(&save, buffer, length, dma )) return -1; + if (!READ_SECTION(&save, buffer, length, mbc )) return -1; + if (!READ_SECTION(&save, buffer, length, hram )) return -1; + if (!READ_SECTION(&save, buffer, length, timing )) return -1; + if (!READ_SECTION(&save, buffer, length, apu )) return -1; + if (!READ_SECTION(&save, buffer, length, rtc )) return -1; + if (!READ_SECTION(&save, buffer, length, video )) return -1; + + if (!verify_state_compatibility(gb, &save)) { + return -1; + } + + memset(gb->mbc_ram + save.mbc_ram_size, 0xFF, gb->mbc_ram_size - save.mbc_ram_size); + if (buffer_read(gb->mbc_ram, save.mbc_ram_size, &buffer, &length) != save.mbc_ram_size) { + return -1; + } + + if (buffer_read(gb->ram, gb->ram_size, &buffer, &length) != gb->ram_size) { + return -1; + } + + if (buffer_read(gb->vram,gb->vram_size, &buffer, &length) != gb->vram_size) { + return -1; + } + + memcpy(gb, &save, sizeof(save)); + + if (gb->cartridge_type->has_rumble && gb->rumble_callback) { + gb->rumble_callback(gb, gb->rumble_state); + } + + return 0; +} + +#undef READ_SECTION diff --git a/waterbox/sameboy/save_state.h b/waterbox/sameboy/save_state.h new file mode 100644 index 0000000000..546ac2d95a --- /dev/null +++ b/waterbox/sameboy/save_state.h @@ -0,0 +1,24 @@ +/* Macros to make the GB_gameboy_t struct more future compatible when state saving */ +#ifndef save_state_h +#define save_state_h +#include + +#define GB_PADDING(type, old_usage) type old_usage##__do_not_use + +#define GB_SECTION(name, ...) __attribute__ ((aligned (8))) struct {} name##_section_start; __VA_ARGS__; struct {} name##_section_end +#define GB_SECTION_OFFSET(name) (offsetof(GB_gameboy_t, name##_section_start)) +#define GB_SECTION_SIZE(name) (offsetof(GB_gameboy_t, name##_section_end) - offsetof(GB_gameboy_t, name##_section_start)) +#define GB_GET_SECTION(gb, name) ((void*)&((gb)->name##_section_start)) + +#define GB_aligned_double __attribute__ ((aligned (8))) double + + +/* Public calls related to save states */ +int GB_save_state(GB_gameboy_t *gb, const char *path); +size_t GB_get_save_state_size(GB_gameboy_t *gb); +/* Assumes buffer is big enough to contain the save state. Use with GB_get_save_state_size(). */ +void GB_save_state_to_buffer(GB_gameboy_t *gb, uint8_t *buffer); + +int GB_load_state(GB_gameboy_t *gb, const char *path); +int GB_load_state_from_buffer(GB_gameboy_t *gb, const uint8_t *buffer, size_t length); +#endif /* save_state_h */ diff --git a/waterbox/sameboy/symbol_hash.c b/waterbox/sameboy/symbol_hash.c new file mode 100644 index 0000000000..709421c233 --- /dev/null +++ b/waterbox/sameboy/symbol_hash.c @@ -0,0 +1,106 @@ +#include "gb.h" + +static size_t GB_map_find_symbol_index(GB_symbol_map_t *map, uint16_t addr) +{ + if (!map->symbols) { + return 0; + } + ssize_t min = 0; + ssize_t max = map->n_symbols; + while (min < max) { + size_t pivot = (min + max) / 2; + if (map->symbols[pivot].addr == addr) return pivot; + if (map->symbols[pivot].addr > addr) { + max = pivot; + } + else { + min = pivot + 1; + } + } + return (size_t) min; +} + +GB_bank_symbol_t *GB_map_add_symbol(GB_symbol_map_t *map, uint16_t addr, const char *name) +{ + size_t index = GB_map_find_symbol_index(map, addr); + + if (index < map->n_symbols && map->symbols[index].addr == addr) return NULL; + + map->symbols = realloc(map->symbols, (map->n_symbols + 1) * sizeof(map->symbols[0])); + memmove(&map->symbols[index + 1], &map->symbols[index], (map->n_symbols - index) * sizeof(map->symbols[0])); + map->symbols[index].addr = addr; + map->symbols[index].name = strdup(name); + map->n_symbols++; + return &map->symbols[index]; +} + +const GB_bank_symbol_t *GB_map_find_symbol(GB_symbol_map_t *map, uint16_t addr) +{ + if (!map) return NULL; + size_t index = GB_map_find_symbol_index(map, addr); + if (index < map->n_symbols && map->symbols[index].addr != addr) { + index--; + } + if (index < map->n_symbols) { + return &map->symbols[index]; + } + return NULL; +} + +GB_symbol_map_t *GB_map_alloc(void) +{ + GB_symbol_map_t *map = malloc(sizeof(*map)); + memset(map, 0, sizeof(*map)); + return map; +} + +void GB_map_free(GB_symbol_map_t *map) +{ + for (unsigned i = 0; i < map->n_symbols; i++) { + free(map->symbols[i].name); + } + + if (map->symbols) { + free(map->symbols); + } + + free(map); +} + +static int hash_name(const char *name) +{ + int r = 0; + while (*name) { + r <<= 1; + if (r & 0x400) { + r ^= 0x401; + } + r += (unsigned char)*(name++); + } + + return r & 0x3FF; +} + +void GB_reversed_map_add_symbol(GB_reversed_symbol_map_t *map, uint16_t bank, GB_bank_symbol_t *bank_symbol) +{ + int hash = hash_name(bank_symbol->name); + GB_symbol_t *symbol = malloc(sizeof(*symbol)); + symbol->name = bank_symbol->name; + symbol->addr = bank_symbol->addr; + symbol->bank = bank; + symbol->next = map->buckets[hash]; + map->buckets[hash] = symbol; +} + +const GB_symbol_t *GB_reversed_map_find_symbol(GB_reversed_symbol_map_t *map, const char *name) +{ + int hash = hash_name(name); + GB_symbol_t *symbol = map->buckets[hash]; + + while (symbol) { + if (strcmp(symbol->name, name) == 0) return symbol; + symbol = symbol->next; + } + + return NULL; +} diff --git a/waterbox/sameboy/symbol_hash.h b/waterbox/sameboy/symbol_hash.h new file mode 100644 index 0000000000..239b0e313e --- /dev/null +++ b/waterbox/sameboy/symbol_hash.h @@ -0,0 +1,37 @@ +#ifndef symbol_hash_h +#define symbol_hash_h + +#include +#include + +typedef struct { + char *name; + uint16_t addr; +} GB_bank_symbol_t; + +typedef struct GB_symbol_s { + struct GB_symbol_s *next; + const char *name; + uint16_t bank; + uint16_t addr; +} GB_symbol_t; + +typedef struct { + GB_bank_symbol_t *symbols; + size_t n_symbols; +} GB_symbol_map_t; + +typedef struct { + GB_symbol_t *buckets[0x400]; +} GB_reversed_symbol_map_t; + +#ifdef GB_INTERNAL +void GB_reversed_map_add_symbol(GB_reversed_symbol_map_t *map, uint16_t bank, GB_bank_symbol_t *symbol); +const GB_symbol_t *GB_reversed_map_find_symbol(GB_reversed_symbol_map_t *map, const char *name); +GB_bank_symbol_t *GB_map_add_symbol(GB_symbol_map_t *map, uint16_t addr, const char *name); +const GB_bank_symbol_t *GB_map_find_symbol(GB_symbol_map_t *map, uint16_t addr); +GB_symbol_map_t *GB_map_alloc(void); +void GB_map_free(GB_symbol_map_t *map); +#endif + +#endif /* symbol_hash_h */ diff --git a/waterbox/sameboy/timing.c b/waterbox/sameboy/timing.c new file mode 100644 index 0000000000..77348fe232 --- /dev/null +++ b/waterbox/sameboy/timing.c @@ -0,0 +1,228 @@ +#include "gb.h" +#ifdef _WIN32 +#define _WIN32_WINNT 0x0500 +#include +#else +#include +#endif + +static int64_t get_nanoseconds(void) +{ +#ifndef _WIN32 + struct timeval now; + gettimeofday(&now, NULL); + return (now.tv_usec) * 1000 + now.tv_sec * 1000000000L; +#else + FILETIME time; + GetSystemTimeAsFileTime(&time); + return (((int64_t)time.dwHighDateTime << 32) | time.dwLowDateTime) * 100L; +#endif +} + +static void nsleep(uint64_t nanoseconds) +{ +#ifndef _WIN32 + struct timespec sleep = {0, nanoseconds}; + nanosleep(&sleep, NULL); +#else + HANDLE timer; + LARGE_INTEGER time; + timer = CreateWaitableTimer(NULL, true, NULL); + time.QuadPart = -(nanoseconds / 100L); + SetWaitableTimer(timer, &time, 0, NULL, NULL, false); + WaitForSingleObject(timer, INFINITE); + CloseHandle(timer); +#endif +} + +bool GB_timing_sync_turbo(GB_gameboy_t *gb) +{ + if (!gb->turbo_dont_skip) { + int64_t nanoseconds = get_nanoseconds(); + if (nanoseconds <= gb->last_sync + FRAME_LENGTH) { + return true; + } + gb->last_sync = nanoseconds; + } + return false; +} + +void GB_timing_sync(GB_gameboy_t *gb) +{ + if (gb->turbo) { + gb->cycles_since_last_sync = 0; + return; + } + /* Prevent syncing if not enough time has passed.*/ + if (gb->cycles_since_last_sync < LCDC_PERIOD / 4) return; + + uint64_t target_nanoseconds = gb->cycles_since_last_sync * FRAME_LENGTH / LCDC_PERIOD; + int64_t nanoseconds = get_nanoseconds(); + if (labs((signed long)(nanoseconds - gb->last_sync)) < target_nanoseconds ) { + nsleep(target_nanoseconds + gb->last_sync - nanoseconds); + gb->last_sync += target_nanoseconds; + } + else { + gb->last_sync = nanoseconds; + } + + gb->cycles_since_last_sync = 0; +} + +static void GB_ir_run(GB_gameboy_t *gb) +{ + if (gb->ir_queue_length == 0) return; + if (gb->cycles_since_input_ir_change >= gb->ir_queue[0].delay) { + gb->cycles_since_input_ir_change -= gb->ir_queue[0].delay; + gb->infrared_input = gb->ir_queue[0].state; + gb->ir_queue_length--; + memmove(&gb->ir_queue[0], &gb->ir_queue[1], sizeof(gb->ir_queue[0]) * (gb->ir_queue_length)); + } +} + +static void advance_tima_state_machine(GB_gameboy_t *gb) +{ + if (gb->tima_reload_state == GB_TIMA_RELOADED) { + gb->tima_reload_state = GB_TIMA_RUNNING; + } + else if (gb->tima_reload_state == GB_TIMA_RELOADING) { + gb->tima_reload_state = GB_TIMA_RELOADED; + } +} + +void GB_advance_cycles(GB_gameboy_t *gb, uint8_t cycles) +{ + // Affected by speed boost + gb->dma_cycles += cycles; + + advance_tima_state_machine(gb); + for (int i = 0; i < cycles; i += 4) { + GB_set_internal_div_counter(gb, gb->div_cycles + 4); + } + + if (cycles > 4) { + advance_tima_state_machine(gb); + if (cycles > 8) { + advance_tima_state_machine(gb); + } + } + + uint16_t previous_serial_cycles = gb->serial_cycles; + gb->serial_cycles += cycles; + if (gb->serial_length) { + if ((gb->serial_cycles & gb->serial_length) != (previous_serial_cycles & gb->serial_length)) { + gb->serial_length = 0; + gb->io_registers[GB_IO_SC] &= ~0x80; + /* TODO: Does SB "update" bit by bit? */ + if (gb->serial_transfer_end_callback) { + gb->io_registers[GB_IO_SB] = gb->serial_transfer_end_callback(gb); + } + else { + gb->io_registers[GB_IO_SB] = 0xFF; + } + + gb->io_registers[GB_IO_IF] |= 8; + } + } + + gb->debugger_ticks += cycles; + + if (gb->cgb_double_speed) { + cycles >>=1; + } + + // Not affected by speed boost + gb->hdma_cycles += cycles; + gb->apu_sample_cycles += cycles; + gb->apu_subsample_cycles += cycles; + gb->apu.apu_cycles += cycles; + gb->cycles_since_ir_change += cycles; + gb->cycles_since_input_ir_change += cycles; + gb->cycles_since_last_sync += cycles; + GB_dma_run(gb); + GB_hdma_run(gb); + GB_apu_run(gb); + GB_display_run(gb, cycles); + GB_ir_run(gb); +} + +/* Standard Timers */ +static const unsigned int GB_TAC_RATIOS[] = {1024, 16, 64, 256}; + +static void increase_tima(GB_gameboy_t *gb) +{ + gb->io_registers[GB_IO_TIMA]++; + if (gb->io_registers[GB_IO_TIMA] == 0) { + gb->io_registers[GB_IO_TIMA] = gb->io_registers[GB_IO_TMA]; + gb->io_registers[GB_IO_IF] |= 4; + gb->tima_reload_state = GB_TIMA_RELOADING; + } +} + +static bool counter_overflow_check(uint32_t old, uint32_t new, uint32_t max) +{ + return (old & (max >> 1)) && !(new & (max >> 1)); +} + +void GB_set_internal_div_counter(GB_gameboy_t *gb, uint32_t value) +{ + /* TIMA increases when a specific high-bit becomes a low-bit. */ + value &= INTERNAL_DIV_CYCLES - 1; + if ((gb->io_registers[GB_IO_TAC] & 4) && + counter_overflow_check(gb->div_cycles, value, GB_TAC_RATIOS[gb->io_registers[GB_IO_TAC] & 3])) { + increase_tima(gb); + } + gb->div_cycles = value; +} + +/* + This glitch is based on the expected results of mooneye-gb rapid_toggle test. + This glitch happens because how TIMA is increased, see GB_set_internal_div_counter. + According to GiiBiiAdvance, GBC's behavior is different, but this was not tested or implemented. +*/ +void GB_emulate_timer_glitch(GB_gameboy_t *gb, uint8_t old_tac, uint8_t new_tac) +{ + /* Glitch only happens when old_tac is enabled. */ + if (!(old_tac & 4)) return; + + unsigned int old_clocks = GB_TAC_RATIOS[old_tac & 3]; + unsigned int new_clocks = GB_TAC_RATIOS[new_tac & 3]; + + /* The bit used for overflow testing must have been 1 */ + if (gb->div_cycles & (old_clocks >> 1)) { + /* And now either the timer must be disabled, or the new bit used for overflow testing be 0. */ + if (!(new_tac & 4) || gb->div_cycles & (new_clocks >> 1)) { + increase_tima(gb); + } + } +} + +void GB_rtc_run(GB_gameboy_t *gb) +{ + if ((gb->rtc_real.high & 0x40) == 0) { /* is timer running? */ + time_t current_time = time(NULL); + while (gb->last_rtc_second < current_time) { + gb->last_rtc_second++; + if (++gb->rtc_real.seconds == 60) + { + gb->rtc_real.seconds = 0; + if (++gb->rtc_real.minutes == 60) + { + gb->rtc_real.minutes = 0; + if (++gb->rtc_real.hours == 24) + { + gb->rtc_real.hours = 0; + if (++gb->rtc_real.days == 0) + { + if (gb->rtc_real.high & 1) /* Bit 8 of days*/ + { + gb->rtc_real.high |= 0x80; /* Overflow bit */ + } + gb->rtc_real.high ^= 1; + } + } + } + } + } + } +} diff --git a/waterbox/sameboy/timing.h b/waterbox/sameboy/timing.h new file mode 100644 index 0000000000..ed9e15a513 --- /dev/null +++ b/waterbox/sameboy/timing.h @@ -0,0 +1,21 @@ +#ifndef timing_h +#define timing_h +#include "gb.h" + +#ifdef GB_INTERNAL +void GB_advance_cycles(GB_gameboy_t *gb, uint8_t cycles); +void GB_set_internal_div_counter(GB_gameboy_t *gb, uint32_t value); +void GB_rtc_run(GB_gameboy_t *gb); +void GB_emulate_timer_glitch(GB_gameboy_t *gb, uint8_t old_tac, uint8_t new_tac); +bool GB_timing_sync_turbo(GB_gameboy_t *gb); /* Returns true if should skip frame */ +void GB_timing_sync(GB_gameboy_t *gb); + + +enum { + GB_TIMA_RUNNING = 0, + GB_TIMA_RELOADING = 1, + GB_TIMA_RELOADED = 2 +}; +#endif + +#endif /* timing_h */ diff --git a/waterbox/sameboy/z80_cpu.c b/waterbox/sameboy/z80_cpu.c new file mode 100644 index 0000000000..0a1bde5dd7 --- /dev/null +++ b/waterbox/sameboy/z80_cpu.c @@ -0,0 +1,1381 @@ +#include +#include +#include "gb.h" + + +typedef void GB_opcode_t(GB_gameboy_t *gb, uint8_t opcode); + +static void ill(GB_gameboy_t *gb, uint8_t opcode) +{ + GB_log(gb, "Illegal Opcode. Halting.\n"); + gb->interrupt_enable = 0; + gb->halted = true; +} + +static void nop(GB_gameboy_t *gb, uint8_t opcode) +{ + GB_advance_cycles(gb, 4); +} + +static void stop(GB_gameboy_t *gb, uint8_t opcode) +{ + GB_advance_cycles(gb, 4); + if (gb->io_registers[GB_IO_KEY1] & 0x1) { + /* Make sure we don't leave display_cycles not divisble by 4 in single speed mode */ + if (gb->display_cycles % 4 == 2) { + GB_advance_cycles(gb, 4); + } + + /* Todo: the switch is not instant. We should emulate this. */ + gb->cgb_double_speed ^= true; + gb->io_registers[GB_IO_KEY1] = 0; + } + else { + gb->stopped = true; + } + gb->pc++; +} + +/* Operand naming conventions for functions: + r = 8-bit register + lr = low 8-bit register + hr = high 8-bit register + rr = 16-bit register + d8 = 8-bit imm + d16 = 16-bit imm + d.. = [..] + cc = condition code (z, nz, c, nc) + */ + +static void ld_rr_d16(GB_gameboy_t *gb, uint8_t opcode) +{ + uint8_t register_id; + uint16_t value; + GB_advance_cycles(gb, 4); + register_id = (opcode >> 4) + 1; + value = GB_read_memory(gb, gb->pc++); + GB_advance_cycles(gb, 4); + value |= GB_read_memory(gb, gb->pc++) << 8; + GB_advance_cycles(gb, 4); + gb->registers[register_id] = value; +} + +static void ld_drr_a(GB_gameboy_t *gb, uint8_t opcode) +{ + uint8_t register_id; + GB_advance_cycles(gb, 4); + register_id = (opcode >> 4) + 1; + GB_write_memory(gb, gb->registers[register_id], gb->registers[GB_REGISTER_AF] >> 8); + GB_advance_cycles(gb, 4); +} + +static void inc_rr(GB_gameboy_t *gb, uint8_t opcode) +{ + uint8_t register_id; + GB_advance_cycles(gb, 8); + register_id = (opcode >> 4) + 1; + gb->registers[register_id]++; +} + +static void inc_hr(GB_gameboy_t *gb, uint8_t opcode) +{ + uint8_t register_id; + GB_advance_cycles(gb, 4); + register_id = ((opcode >> 4) + 1) & 0x03; + gb->registers[register_id] += 0x100; + gb->registers[GB_REGISTER_AF] &= ~(GB_SUBSTRACT_FLAG | GB_ZERO_FLAG | GB_HALF_CARRY_FLAG); + + if ((gb->registers[register_id] & 0x0F00) == 0) { + gb->registers[GB_REGISTER_AF] |= GB_HALF_CARRY_FLAG; + } + + if ((gb->registers[register_id] & 0xFF00) == 0) { + gb->registers[GB_REGISTER_AF] |= GB_ZERO_FLAG; + } +} +static void dec_hr(GB_gameboy_t *gb, uint8_t opcode) +{ + uint8_t register_id; + GB_advance_cycles(gb, 4); + register_id = ((opcode >> 4) + 1) & 0x03; + gb->registers[register_id] -= 0x100; + gb->registers[GB_REGISTER_AF] &= ~(GB_ZERO_FLAG | GB_HALF_CARRY_FLAG); + gb->registers[GB_REGISTER_AF] |= GB_SUBSTRACT_FLAG; + + if ((gb->registers[register_id] & 0x0F00) == 0xF00) { + gb->registers[GB_REGISTER_AF] |= GB_HALF_CARRY_FLAG; + } + + if ((gb->registers[register_id] & 0xFF00) == 0) { + gb->registers[GB_REGISTER_AF] |= GB_ZERO_FLAG; + } +} + +static void ld_hr_d8(GB_gameboy_t *gb, uint8_t opcode) +{ + uint8_t register_id; + GB_advance_cycles(gb, 4); + register_id = ((opcode >> 4) + 1) & 0x03; + gb->registers[register_id] &= 0xFF; + gb->registers[register_id] |= GB_read_memory(gb, gb->pc++) << 8; + GB_advance_cycles(gb, 4); +} + +static void rlca(GB_gameboy_t *gb, uint8_t opcode) +{ + bool carry = (gb->registers[GB_REGISTER_AF] & 0x8000) != 0; + + GB_advance_cycles(gb, 4); + gb->registers[GB_REGISTER_AF] = (gb->registers[GB_REGISTER_AF] & 0xFF00) << 1; + if (carry) { + gb->registers[GB_REGISTER_AF] |= GB_CARRY_FLAG | 0x0100; + } +} + +static void rla(GB_gameboy_t *gb, uint8_t opcode) +{ + bool bit7 = (gb->registers[GB_REGISTER_AF] & 0x8000) != 0; + bool carry = (gb->registers[GB_REGISTER_AF] & GB_CARRY_FLAG) != 0; + + GB_advance_cycles(gb, 4); + gb->registers[GB_REGISTER_AF] = (gb->registers[GB_REGISTER_AF] & 0xFF00) << 1; + if (carry) { + gb->registers[GB_REGISTER_AF] |= 0x0100; + } + if (bit7) { + gb->registers[GB_REGISTER_AF] |= GB_CARRY_FLAG; + } +} + +static void ld_da16_sp(GB_gameboy_t *gb, uint8_t opcode) +{ + /* Todo: Verify order is correct */ + uint16_t addr; + GB_advance_cycles(gb, 4); + addr = GB_read_memory(gb, gb->pc++); + GB_advance_cycles(gb, 4); + addr |= GB_read_memory(gb, gb->pc++) << 8; + GB_advance_cycles(gb, 4); + GB_write_memory(gb, addr, gb->registers[GB_REGISTER_SP] & 0xFF); + GB_advance_cycles(gb, 4); + GB_write_memory(gb, addr+1, gb->registers[GB_REGISTER_SP] >> 8); + GB_advance_cycles(gb, 4); +} + +static void add_hl_rr(GB_gameboy_t *gb, uint8_t opcode) +{ + uint16_t hl = gb->registers[GB_REGISTER_HL]; + uint16_t rr; + uint8_t register_id; + GB_advance_cycles(gb, 8); + register_id = (opcode >> 4) + 1; + rr = gb->registers[register_id]; + gb->registers[GB_REGISTER_HL] = hl + rr; + gb->registers[GB_REGISTER_AF] &= ~(GB_SUBSTRACT_FLAG | GB_CARRY_FLAG | GB_HALF_CARRY_FLAG); + + /* The meaning of the Half Carry flag is really hard to track -_- */ + if (((hl & 0xFFF) + (rr & 0xFFF)) & 0x1000) { + gb->registers[GB_REGISTER_AF] |= GB_HALF_CARRY_FLAG; + } + + if ( ((unsigned long) hl) + ((unsigned long) rr) & 0x10000) { + gb->registers[GB_REGISTER_AF] |= GB_CARRY_FLAG; + } +} + +static void ld_a_drr(GB_gameboy_t *gb, uint8_t opcode) +{ + uint8_t register_id; + register_id = (opcode >> 4) + 1; + GB_advance_cycles(gb, 4); + gb->registers[GB_REGISTER_AF] &= 0xFF; + gb->registers[GB_REGISTER_AF] |= GB_read_memory(gb, gb->registers[register_id]) << 8; + GB_advance_cycles(gb, 4); +} + +static void dec_rr(GB_gameboy_t *gb, uint8_t opcode) +{ + uint8_t register_id; + GB_advance_cycles(gb, 8); + register_id = (opcode >> 4) + 1; + gb->registers[register_id]--; +} + +static void inc_lr(GB_gameboy_t *gb, uint8_t opcode) +{ + uint8_t register_id; + uint8_t value; + GB_advance_cycles(gb, 4); + register_id = (opcode >> 4) + 1; + + value = (gb->registers[register_id] & 0xFF) + 1; + gb->registers[register_id] = (gb->registers[register_id] & 0xFF00) | value; + + gb->registers[GB_REGISTER_AF] &= ~(GB_SUBSTRACT_FLAG | GB_ZERO_FLAG | GB_HALF_CARRY_FLAG); + + if ((gb->registers[register_id] & 0x0F) == 0) { + gb->registers[GB_REGISTER_AF] |= GB_HALF_CARRY_FLAG; + } + + if ((gb->registers[register_id] & 0xFF) == 0) { + gb->registers[GB_REGISTER_AF] |= GB_ZERO_FLAG; + } +} +static void dec_lr(GB_gameboy_t *gb, uint8_t opcode) +{ + uint8_t register_id; + uint8_t value; + GB_advance_cycles(gb, 4); + register_id = (opcode >> 4) + 1; + + value = (gb->registers[register_id] & 0xFF) - 1; + gb->registers[register_id] = (gb->registers[register_id] & 0xFF00) | value; + + gb->registers[GB_REGISTER_AF] &= ~(GB_ZERO_FLAG | GB_HALF_CARRY_FLAG); + gb->registers[GB_REGISTER_AF] |= GB_SUBSTRACT_FLAG; + + if ((gb->registers[register_id] & 0x0F) == 0xF) { + gb->registers[GB_REGISTER_AF] |= GB_HALF_CARRY_FLAG; + } + + if ((gb->registers[register_id] & 0xFF) == 0) { + gb->registers[GB_REGISTER_AF] |= GB_ZERO_FLAG; + } +} + +static void ld_lr_d8(GB_gameboy_t *gb, uint8_t opcode) +{ + uint8_t register_id; + GB_advance_cycles(gb, 4); + register_id = (opcode >> 4) + 1; + gb->registers[register_id] &= 0xFF00; + gb->registers[register_id] |= GB_read_memory(gb, gb->pc++); + GB_advance_cycles(gb, 4); +} + +static void rrca(GB_gameboy_t *gb, uint8_t opcode) +{ + bool carry = (gb->registers[GB_REGISTER_AF] & 0x100) != 0; + + GB_advance_cycles(gb, 4); + gb->registers[GB_REGISTER_AF] = (gb->registers[GB_REGISTER_AF] >> 1) & 0xFF00; + if (carry) { + gb->registers[GB_REGISTER_AF] |= GB_CARRY_FLAG | 0x8000; + } +} + +static void rra(GB_gameboy_t *gb, uint8_t opcode) +{ + bool bit1 = (gb->registers[GB_REGISTER_AF] & 0x0100) != 0; + bool carry = (gb->registers[GB_REGISTER_AF] & GB_CARRY_FLAG) != 0; + + GB_advance_cycles(gb, 4); + gb->registers[GB_REGISTER_AF] = (gb->registers[GB_REGISTER_AF] >> 1) & 0xFF00; + if (carry) { + gb->registers[GB_REGISTER_AF] |= 0x8000; + } + if (bit1) { + gb->registers[GB_REGISTER_AF] |= GB_CARRY_FLAG; + } +} + +static void jr_r8(GB_gameboy_t *gb, uint8_t opcode) +{ + /* Todo: Verify cycles are not 8 and 4 instead */ + GB_advance_cycles(gb, 4); + gb->pc += (int8_t) GB_read_memory(gb, gb->pc++); + GB_advance_cycles(gb, 8); +} + +static bool condition_code(GB_gameboy_t *gb, uint8_t opcode) +{ + switch ((opcode >> 3) & 0x3) { + case 0: + return !(gb->registers[GB_REGISTER_AF] & GB_ZERO_FLAG); + case 1: + return (gb->registers[GB_REGISTER_AF] & GB_ZERO_FLAG); + case 2: + return !(gb->registers[GB_REGISTER_AF] & GB_CARRY_FLAG); + case 3: + return (gb->registers[GB_REGISTER_AF] & GB_CARRY_FLAG); + } + + return false; +} + +static void jr_cc_r8(GB_gameboy_t *gb, uint8_t opcode) +{ + if (condition_code(gb, opcode)) { + GB_advance_cycles(gb, 4); + gb->pc += (int8_t)GB_read_memory(gb, gb->pc++); + GB_advance_cycles(gb, 8); + } + else { + GB_advance_cycles(gb, 8); + gb->pc += 1; + } +} + +static void daa(GB_gameboy_t *gb, uint8_t opcode) +{ + /* This function is UGLY and UNREADABLE! But it passes Blargg's daa test! */ + GB_advance_cycles(gb, 4); + gb->registers[GB_REGISTER_AF] &= ~GB_ZERO_FLAG; + if (gb->registers[GB_REGISTER_AF] & GB_SUBSTRACT_FLAG) { + if (gb->registers[GB_REGISTER_AF] & GB_HALF_CARRY_FLAG) { + gb->registers[GB_REGISTER_AF] &= ~GB_HALF_CARRY_FLAG; + if (gb->registers[GB_REGISTER_AF] & GB_CARRY_FLAG) { + gb->registers[GB_REGISTER_AF] += 0x9A00; + } + else { + gb->registers[GB_REGISTER_AF] += 0xFA00; + } + } + else if(gb->registers[GB_REGISTER_AF] & GB_CARRY_FLAG) { + gb->registers[GB_REGISTER_AF] += 0xA000; + } + } + else { + if (gb->registers[GB_REGISTER_AF] & GB_HALF_CARRY_FLAG) { + uint16_t number = gb->registers[GB_REGISTER_AF] >> 8; + if (gb->registers[GB_REGISTER_AF] & GB_CARRY_FLAG) { + number += 0x100; + } + gb->registers[GB_REGISTER_AF] = 0; + number += 0x06; + if (number >= 0xa0) { + number -= 0xa0; + gb->registers[GB_REGISTER_AF] |= GB_CARRY_FLAG; + } + gb->registers[GB_REGISTER_AF] |= number << 8; + } + else { + uint16_t number = gb->registers[GB_REGISTER_AF] >> 8; + if (gb->registers[GB_REGISTER_AF] & GB_CARRY_FLAG) { + number += 0x100; + } + if (number > 0x99) { + number += 0x60; + } + number = (number & 0x0F) + ((number & 0x0F) > 9 ? 6 : 0) + (number & 0xFF0); + gb->registers[GB_REGISTER_AF] = number << 8; + if (number & 0xFF00) { + gb->registers[GB_REGISTER_AF] |= GB_CARRY_FLAG; + } + } + } + if ((gb->registers[GB_REGISTER_AF] & 0xFF00) == 0) { + gb->registers[GB_REGISTER_AF] |= GB_ZERO_FLAG; + } +} + +static void cpl(GB_gameboy_t *gb, uint8_t opcode) +{ + GB_advance_cycles(gb, 4); + gb->registers[GB_REGISTER_AF] ^= 0xFF00; + gb->registers[GB_REGISTER_AF] |= GB_HALF_CARRY_FLAG | GB_SUBSTRACT_FLAG; +} + +static void scf(GB_gameboy_t *gb, uint8_t opcode) +{ + GB_advance_cycles(gb, 4); + gb->registers[GB_REGISTER_AF] |= GB_CARRY_FLAG; + gb->registers[GB_REGISTER_AF] &= ~(GB_HALF_CARRY_FLAG | GB_SUBSTRACT_FLAG); +} + +static void ccf(GB_gameboy_t *gb, uint8_t opcode) +{ + GB_advance_cycles(gb, 4); + gb->registers[GB_REGISTER_AF] ^= GB_CARRY_FLAG; + gb->registers[GB_REGISTER_AF] &= ~(GB_HALF_CARRY_FLAG | GB_SUBSTRACT_FLAG); +} + +static void ld_dhli_a(GB_gameboy_t *gb, uint8_t opcode) +{ + GB_advance_cycles(gb, 4); + GB_write_memory(gb, gb->registers[GB_REGISTER_HL]++, gb->registers[GB_REGISTER_AF] >> 8); + GB_advance_cycles(gb, 4); +} + +static void ld_dhld_a(GB_gameboy_t *gb, uint8_t opcode) +{ + GB_advance_cycles(gb, 4); + GB_write_memory(gb, gb->registers[GB_REGISTER_HL]--, gb->registers[GB_REGISTER_AF] >> 8); + GB_advance_cycles(gb, 4); +} + +static void ld_a_dhli(GB_gameboy_t *gb, uint8_t opcode) +{ + GB_advance_cycles(gb, 4); + gb->registers[GB_REGISTER_AF] &= 0xFF; + gb->registers[GB_REGISTER_AF] |= GB_read_memory(gb, gb->registers[GB_REGISTER_HL]++) << 8; + GB_advance_cycles(gb, 4); +} + +static void ld_a_dhld(GB_gameboy_t *gb, uint8_t opcode) +{ + GB_advance_cycles(gb, 4); + gb->registers[GB_REGISTER_AF] &= 0xFF; + gb->registers[GB_REGISTER_AF] |= GB_read_memory(gb, gb->registers[GB_REGISTER_HL]--) << 8; + GB_advance_cycles(gb, 4); +} + +static void inc_dhl(GB_gameboy_t *gb, uint8_t opcode) +{ + uint8_t value; + GB_advance_cycles(gb, 4); + value = GB_read_memory(gb, gb->registers[GB_REGISTER_HL]) + 1; + GB_advance_cycles(gb, 4); + GB_write_memory(gb, gb->registers[GB_REGISTER_HL], value); + GB_advance_cycles(gb, 4); + + gb->registers[GB_REGISTER_AF] &= ~(GB_SUBSTRACT_FLAG | GB_ZERO_FLAG | GB_HALF_CARRY_FLAG); + if ((value & 0x0F) == 0) { + gb->registers[GB_REGISTER_AF] |= GB_HALF_CARRY_FLAG; + } + + if ((value & 0xFF) == 0) { + gb->registers[GB_REGISTER_AF] |= GB_ZERO_FLAG; + } +} + +static void dec_dhl(GB_gameboy_t *gb, uint8_t opcode) +{ + uint8_t value; + GB_advance_cycles(gb, 4); + value = GB_read_memory(gb, gb->registers[GB_REGISTER_HL]) - 1; + GB_advance_cycles(gb, 4); + GB_write_memory(gb, gb->registers[GB_REGISTER_HL], value); + GB_advance_cycles(gb, 4); + + gb->registers[GB_REGISTER_AF] &= ~( GB_ZERO_FLAG | GB_HALF_CARRY_FLAG); + gb->registers[GB_REGISTER_AF] |= GB_SUBSTRACT_FLAG; + if ((value & 0x0F) == 0x0F) { + gb->registers[GB_REGISTER_AF] |= GB_HALF_CARRY_FLAG; + } + + if ((value & 0xFF) == 0) { + gb->registers[GB_REGISTER_AF] |= GB_ZERO_FLAG; + } +} + +static void ld_dhl_d8(GB_gameboy_t *gb, uint8_t opcode) +{ + GB_advance_cycles(gb, 4); + uint8_t data = GB_read_memory(gb, gb->pc++); + GB_advance_cycles(gb, 4); + GB_write_memory(gb, gb->registers[GB_REGISTER_HL], data); + GB_advance_cycles(gb, 4); +} + +uint8_t get_src_value(GB_gameboy_t *gb, uint8_t opcode) +{ + uint8_t src_register_id; + uint8_t src_low; + src_register_id = ((opcode >> 1) + 1) & 3; + src_low = opcode & 1; + if (src_register_id == GB_REGISTER_AF) { + if (src_low) { + return gb->registers[GB_REGISTER_AF] >> 8; + } + uint8_t ret = GB_read_memory(gb, gb->registers[GB_REGISTER_HL]); + GB_advance_cycles(gb, 4); + return ret; + } + if (src_low) { + return gb->registers[src_register_id] & 0xFF; + } + return gb->registers[src_register_id] >> 8; +} + +static void set_src_value(GB_gameboy_t *gb, uint8_t opcode, uint8_t value) +{ + uint8_t src_register_id; + uint8_t src_low; + src_register_id = ((opcode >> 1) + 1) & 3; + src_low = opcode & 1; + + if (src_register_id == GB_REGISTER_AF) { + if (src_low) { + gb->registers[GB_REGISTER_AF] &= 0xFF; + gb->registers[GB_REGISTER_AF] |= value << 8; + } + else { + GB_write_memory(gb, gb->registers[GB_REGISTER_HL], value); + GB_advance_cycles(gb, 4); + } + } + else { + if (src_low) { + gb->registers[src_register_id] &= 0xFF00; + gb->registers[src_register_id] |= value; + } + else { + gb->registers[src_register_id] &= 0xFF; + gb->registers[src_register_id] |= value << 8; + } + } +} + +/* The LD r,r instruction is extremely common and extremely simple. Decoding this opcode at runtime is a significent + performance hit, so we generate functions for every ld x,y couple (including [hl]) at compile time using macros. */ + +/* Todo: It's probably wise to do the same to all opcodes. */ + +#define LD_X_Y(x, y) \ +static void ld_##x##_##y(GB_gameboy_t *gb, uint8_t opcode) \ +{ \ + GB_advance_cycles(gb, 4); \ + gb->x = gb->y;\ +} + +#define LD_X_DHL(x) \ +static void ld_##x##_##dhl(GB_gameboy_t *gb, uint8_t opcode) \ +{ \ +GB_advance_cycles(gb, 4); \ +gb->x = GB_read_memory(gb, gb->registers[GB_REGISTER_HL]); \ +GB_advance_cycles(gb, 4);\ +} + +#define LD_DHL_Y(y) \ +static void ld_##dhl##_##y(GB_gameboy_t *gb, uint8_t opcode) \ +{ \ +GB_advance_cycles(gb, 4); \ +GB_write_memory(gb, gb->registers[GB_REGISTER_HL], gb->y); \ +GB_advance_cycles(gb, 4);\ +} + +LD_X_Y(b,c) LD_X_Y(b,d) LD_X_Y(b,e) LD_X_Y(b,h) LD_X_Y(b,l) LD_X_DHL(b) LD_X_Y(b,a) +LD_X_Y(c,b) LD_X_Y(c,d) LD_X_Y(c,e) LD_X_Y(c,h) LD_X_Y(c,l) LD_X_DHL(c) LD_X_Y(c,a) +LD_X_Y(d,b) LD_X_Y(d,c) LD_X_Y(d,e) LD_X_Y(d,h) LD_X_Y(d,l) LD_X_DHL(d) LD_X_Y(d,a) +LD_X_Y(e,b) LD_X_Y(e,c) LD_X_Y(e,d) LD_X_Y(e,h) LD_X_Y(e,l) LD_X_DHL(e) LD_X_Y(e,a) +LD_X_Y(h,b) LD_X_Y(h,c) LD_X_Y(h,d) LD_X_Y(h,e) LD_X_Y(h,l) LD_X_DHL(h) LD_X_Y(h,a) +LD_X_Y(l,b) LD_X_Y(l,c) LD_X_Y(l,d) LD_X_Y(l,e) LD_X_Y(l,h) LD_X_DHL(l) LD_X_Y(l,a) +LD_DHL_Y(b) LD_DHL_Y(c) LD_DHL_Y(d) LD_DHL_Y(e) LD_DHL_Y(h) LD_DHL_Y(l) LD_DHL_Y(a) +LD_X_Y(a,b) LD_X_Y(a,c) LD_X_Y(a,d) LD_X_Y(a,e) LD_X_Y(a,h) LD_X_Y(a,l) LD_X_DHL(a) + + +static void add_a_r(GB_gameboy_t *gb, uint8_t opcode) +{ + uint8_t value, a; + GB_advance_cycles(gb, 4); + value = get_src_value(gb, opcode); + a = gb->registers[GB_REGISTER_AF] >> 8; + gb->registers[GB_REGISTER_AF] = (a + value) << 8; + if ((uint8_t)(a + value) == 0) { + gb->registers[GB_REGISTER_AF] |= GB_ZERO_FLAG; + } + if ((a & 0xF) + (value & 0xF) > 0x0F) { + gb->registers[GB_REGISTER_AF] |= GB_HALF_CARRY_FLAG; + } + if (((unsigned long) a) + ((unsigned long) value) > 0xFF) { + gb->registers[GB_REGISTER_AF] |= GB_CARRY_FLAG; + } +} + +static void adc_a_r(GB_gameboy_t *gb, uint8_t opcode) +{ + uint8_t value, a, carry; + GB_advance_cycles(gb, 4); + value = get_src_value(gb, opcode); + a = gb->registers[GB_REGISTER_AF] >> 8; + carry = (gb->registers[GB_REGISTER_AF] & GB_CARRY_FLAG) != 0; + gb->registers[GB_REGISTER_AF] = (a + value + carry) << 8; + + if ((uint8_t)(a + value + carry) == 0) { + gb->registers[GB_REGISTER_AF] |= GB_ZERO_FLAG; + } + if ((a & 0xF) + (value & 0xF) + carry > 0x0F) { + gb->registers[GB_REGISTER_AF] |= GB_HALF_CARRY_FLAG; + } + if (((unsigned long) a) + ((unsigned long) value) + carry > 0xFF) { + gb->registers[GB_REGISTER_AF] |= GB_CARRY_FLAG; + } +} + +static void sub_a_r(GB_gameboy_t *gb, uint8_t opcode) +{ + uint8_t value, a; + GB_advance_cycles(gb, 4); + value = get_src_value(gb, opcode); + a = gb->registers[GB_REGISTER_AF] >> 8; + gb->registers[GB_REGISTER_AF] = ((a - value) << 8) | GB_SUBSTRACT_FLAG; + if (a == value) { + gb->registers[GB_REGISTER_AF] |= GB_ZERO_FLAG; + } + if ((a & 0xF) < (value & 0xF)) { + gb->registers[GB_REGISTER_AF] |= GB_HALF_CARRY_FLAG; + } + if (a < value) { + gb->registers[GB_REGISTER_AF] |= GB_CARRY_FLAG; + } +} + +static void sbc_a_r(GB_gameboy_t *gb, uint8_t opcode) +{ + uint8_t value, a, carry; + GB_advance_cycles(gb, 4); + value = get_src_value(gb, opcode); + a = gb->registers[GB_REGISTER_AF] >> 8; + carry = (gb->registers[GB_REGISTER_AF] & GB_CARRY_FLAG) != 0; + gb->registers[GB_REGISTER_AF] = ((a - value - carry) << 8) | GB_SUBSTRACT_FLAG; + + if ((uint8_t) (a - value - carry) == 0) { + gb->registers[GB_REGISTER_AF] |= GB_ZERO_FLAG; + } + if ((a & 0xF) < (value & 0xF) + carry) { + gb->registers[GB_REGISTER_AF] |= GB_HALF_CARRY_FLAG; + } + if (((unsigned long) a) - ((unsigned long) value) - carry > 0xFF) { + gb->registers[GB_REGISTER_AF] |= GB_CARRY_FLAG; + } +} + +static void and_a_r(GB_gameboy_t *gb, uint8_t opcode) +{ + uint8_t value, a; + GB_advance_cycles(gb, 4); + value = get_src_value(gb, opcode); + a = gb->registers[GB_REGISTER_AF] >> 8; + gb->registers[GB_REGISTER_AF] = ((a & value) << 8) | GB_HALF_CARRY_FLAG; + if ((a & value) == 0) { + gb->registers[GB_REGISTER_AF] |= GB_ZERO_FLAG; + } +} + +static void xor_a_r(GB_gameboy_t *gb, uint8_t opcode) +{ + uint8_t value, a; + GB_advance_cycles(gb, 4); + value = get_src_value(gb, opcode); + a = gb->registers[GB_REGISTER_AF] >> 8; + gb->registers[GB_REGISTER_AF] = (a ^ value) << 8; + if ((a ^ value) == 0) { + gb->registers[GB_REGISTER_AF] |= GB_ZERO_FLAG; + } +} + +static void or_a_r(GB_gameboy_t *gb, uint8_t opcode) +{ + uint8_t value, a; + GB_advance_cycles(gb, 4); + value = get_src_value(gb, opcode); + a = gb->registers[GB_REGISTER_AF] >> 8; + gb->registers[GB_REGISTER_AF] = (a | value) << 8; + if ((a | value) == 0) { + gb->registers[GB_REGISTER_AF] |= GB_ZERO_FLAG; + } +} + +static void cp_a_r(GB_gameboy_t *gb, uint8_t opcode) +{ + uint8_t value, a; + GB_advance_cycles(gb, 4); + value = get_src_value(gb, opcode); + a = gb->registers[GB_REGISTER_AF] >> 8; + gb->registers[GB_REGISTER_AF] &= 0xFF00; + gb->registers[GB_REGISTER_AF] |= GB_SUBSTRACT_FLAG; + if (a == value) { + gb->registers[GB_REGISTER_AF] |= GB_ZERO_FLAG; + } + if ((a & 0xF) < (value & 0xF)) { + gb->registers[GB_REGISTER_AF] |= GB_HALF_CARRY_FLAG; + } + if (a < value) { + gb->registers[GB_REGISTER_AF] |= GB_CARRY_FLAG; + } +} + +static void halt(GB_gameboy_t *gb, uint8_t opcode) +{ + GB_advance_cycles(gb, 4); + gb->halted = true; + /* Despite what some online documentations say, the HALT bug also happens on a CGB, in both CGB and DMG modes. */ + if (!gb->ime && (gb->interrupt_enable & gb->io_registers[GB_IO_IF] & 0x1F) != 0) { + gb->halted = false; + gb->halt_bug = true; + } +} + +static void ret_cc(GB_gameboy_t *gb, uint8_t opcode) +{ + /* Todo: Verify timing */ + if (condition_code(gb, opcode)) { + GB_debugger_ret_hook(gb); + GB_advance_cycles(gb, 8); + gb->pc = GB_read_memory(gb, gb->registers[GB_REGISTER_SP]); + GB_advance_cycles(gb, 4); + gb->pc |= GB_read_memory(gb, gb->registers[GB_REGISTER_SP] + 1) << 8; + GB_advance_cycles(gb, 8); + gb->registers[GB_REGISTER_SP] += 2; + } + else { + GB_advance_cycles(gb, 8); + } +} + +static void pop_rr(GB_gameboy_t *gb, uint8_t opcode) +{ + uint8_t register_id; + GB_advance_cycles(gb, 4); + register_id = ((opcode >> 4) + 1) & 3; + gb->registers[register_id] = GB_read_memory(gb, gb->registers[GB_REGISTER_SP]); + GB_advance_cycles(gb, 4); + gb->registers[register_id] |= GB_read_memory(gb, gb->registers[GB_REGISTER_SP] + 1) << 8; + GB_advance_cycles(gb, 4); + gb->registers[GB_REGISTER_AF] &= 0xFFF0; // Make sure we don't set impossible flags on F! See Blargg's PUSH AF test. + gb->registers[GB_REGISTER_SP] += 2; +} + +static void jp_cc_a16(GB_gameboy_t *gb, uint8_t opcode) +{ + if (condition_code(gb, opcode)) { + GB_advance_cycles(gb, 4); + uint16_t addr = GB_read_memory(gb, gb->pc); + GB_advance_cycles(gb, 4); + addr |= (GB_read_memory(gb, gb->pc + 1) << 8); + GB_advance_cycles(gb, 8); + gb->pc = addr; + + } + else { + GB_advance_cycles(gb, 12); + gb->pc += 2; + } +} + +static void jp_a16(GB_gameboy_t *gb, uint8_t opcode) +{ + GB_advance_cycles(gb, 4); + uint16_t addr = GB_read_memory(gb, gb->pc); + GB_advance_cycles(gb, 4); + addr |= (GB_read_memory(gb, gb->pc + 1) << 8); + GB_advance_cycles(gb, 8); + gb->pc = addr;} + +static void call_cc_a16(GB_gameboy_t *gb, uint8_t opcode) +{ + uint16_t call_addr = gb->pc - 1; + if (condition_code(gb, opcode)) { + GB_advance_cycles(gb, 4); + gb->registers[GB_REGISTER_SP] -= 2; + uint16_t addr = GB_read_memory(gb, gb->pc++); + GB_advance_cycles(gb, 4); + addr |= (GB_read_memory(gb, gb->pc++) << 8); + GB_advance_cycles(gb, 8); + GB_write_memory(gb, gb->registers[GB_REGISTER_SP] + 1, (gb->pc) >> 8); + GB_advance_cycles(gb, 4); + GB_write_memory(gb, gb->registers[GB_REGISTER_SP], (gb->pc) & 0xFF); + GB_advance_cycles(gb, 4); + gb->pc = addr; + + GB_debugger_call_hook(gb, call_addr); + } + else { + GB_advance_cycles(gb, 12); + gb->pc += 2; + } +} + +static void push_rr(GB_gameboy_t *gb, uint8_t opcode) +{ + uint8_t register_id; + GB_advance_cycles(gb, 8); + register_id = ((opcode >> 4) + 1) & 3; + gb->registers[GB_REGISTER_SP] -= 2; + GB_write_memory(gb, gb->registers[GB_REGISTER_SP] + 1, (gb->registers[register_id]) >> 8); + GB_advance_cycles(gb, 4); + GB_write_memory(gb, gb->registers[GB_REGISTER_SP], (gb->registers[register_id]) & 0xFF); + GB_advance_cycles(gb, 4); +} + +static void add_a_d8(GB_gameboy_t *gb, uint8_t opcode) +{ + uint8_t value, a; + GB_advance_cycles(gb, 4); + value = GB_read_memory(gb, gb->pc++); + GB_advance_cycles(gb, 4); + a = gb->registers[GB_REGISTER_AF] >> 8; + gb->registers[GB_REGISTER_AF] = (a + value) << 8; + if ((uint8_t) (a + value) == 0) { + gb->registers[GB_REGISTER_AF] |= GB_ZERO_FLAG; + } + if ((a & 0xF) + (value & 0xF) > 0x0F) { + gb->registers[GB_REGISTER_AF] |= GB_HALF_CARRY_FLAG; + } + if (((unsigned long) a) + ((unsigned long) value) > 0xFF) { + gb->registers[GB_REGISTER_AF] |= GB_CARRY_FLAG; + } +} + +static void adc_a_d8(GB_gameboy_t *gb, uint8_t opcode) +{ + uint8_t value, a, carry; + GB_advance_cycles(gb, 4); + value = GB_read_memory(gb, gb->pc++); + GB_advance_cycles(gb, 4); + a = gb->registers[GB_REGISTER_AF] >> 8; + carry = (gb->registers[GB_REGISTER_AF] & GB_CARRY_FLAG) != 0; + gb->registers[GB_REGISTER_AF] = (a + value + carry) << 8; + + if (gb->registers[GB_REGISTER_AF] == 0) { + gb->registers[GB_REGISTER_AF] |= GB_ZERO_FLAG; + } + if ((a & 0xF) + (value & 0xF) + carry > 0x0F) { + gb->registers[GB_REGISTER_AF] |= GB_HALF_CARRY_FLAG; + } + if (((unsigned long) a) + ((unsigned long) value) + carry > 0xFF) { + gb->registers[GB_REGISTER_AF] |= GB_CARRY_FLAG; + } +} + +static void sub_a_d8(GB_gameboy_t *gb, uint8_t opcode) +{ + uint8_t value, a; + GB_advance_cycles(gb, 4); + value = GB_read_memory(gb, gb->pc++); + GB_advance_cycles(gb, 4); + a = gb->registers[GB_REGISTER_AF] >> 8; + gb->registers[GB_REGISTER_AF] = ((a - value) << 8) | GB_SUBSTRACT_FLAG; + if (a == value) { + gb->registers[GB_REGISTER_AF] |= GB_ZERO_FLAG; + } + if ((a & 0xF) < (value & 0xF)) { + gb->registers[GB_REGISTER_AF] |= GB_HALF_CARRY_FLAG; + } + if (a < value) { + gb->registers[GB_REGISTER_AF] |= GB_CARRY_FLAG; + } +} + +static void sbc_a_d8(GB_gameboy_t *gb, uint8_t opcode) +{ + uint8_t value, a, carry; + GB_advance_cycles(gb, 4); + value = GB_read_memory(gb, gb->pc++); + GB_advance_cycles(gb, 4); + a = gb->registers[GB_REGISTER_AF] >> 8; + carry = (gb->registers[GB_REGISTER_AF] & GB_CARRY_FLAG) != 0; + gb->registers[GB_REGISTER_AF] = ((a - value - carry) << 8) | GB_SUBSTRACT_FLAG; + + if ((uint8_t) (a - value - carry) == 0) { + gb->registers[GB_REGISTER_AF] |= GB_ZERO_FLAG; + } + if ((a & 0xF) < (value & 0xF) + carry) { + gb->registers[GB_REGISTER_AF] |= GB_HALF_CARRY_FLAG; + } + if (((unsigned long) a) - ((unsigned long) value) - carry > 0xFF) { + gb->registers[GB_REGISTER_AF] |= GB_CARRY_FLAG; + } +} + +static void and_a_d8(GB_gameboy_t *gb, uint8_t opcode) +{ + uint8_t value, a; + GB_advance_cycles(gb, 4); + value = GB_read_memory(gb, gb->pc++); + GB_advance_cycles(gb, 4); + a = gb->registers[GB_REGISTER_AF] >> 8; + gb->registers[GB_REGISTER_AF] = ((a & value) << 8) | GB_HALF_CARRY_FLAG; + if ((a & value) == 0) { + gb->registers[GB_REGISTER_AF] |= GB_ZERO_FLAG; + } +} + +static void xor_a_d8(GB_gameboy_t *gb, uint8_t opcode) +{ + uint8_t value, a; + GB_advance_cycles(gb, 4); + value = GB_read_memory(gb, gb->pc++); + GB_advance_cycles(gb, 4); + a = gb->registers[GB_REGISTER_AF] >> 8; + gb->registers[GB_REGISTER_AF] = (a ^ value) << 8; + if ((a ^ value) == 0) { + gb->registers[GB_REGISTER_AF] |= GB_ZERO_FLAG; + } +} + +static void or_a_d8(GB_gameboy_t *gb, uint8_t opcode) +{ + uint8_t value, a; + GB_advance_cycles(gb, 4); + value = GB_read_memory(gb, gb->pc++); + GB_advance_cycles(gb, 4); + a = gb->registers[GB_REGISTER_AF] >> 8; + gb->registers[GB_REGISTER_AF] = (a | value) << 8; + if ((a | value) == 0) { + gb->registers[GB_REGISTER_AF] |= GB_ZERO_FLAG; + } +} + +static void cp_a_d8(GB_gameboy_t *gb, uint8_t opcode) +{ + uint8_t value, a; + GB_advance_cycles(gb, 4); + value = GB_read_memory(gb, gb->pc++); + GB_advance_cycles(gb, 4); + a = gb->registers[GB_REGISTER_AF] >> 8; + gb->registers[GB_REGISTER_AF] &= 0xFF00; + gb->registers[GB_REGISTER_AF] |= GB_SUBSTRACT_FLAG; + if (a == value) { + gb->registers[GB_REGISTER_AF] |= GB_ZERO_FLAG; + } + if ((a & 0xF) < (value & 0xF)) { + gb->registers[GB_REGISTER_AF] |= GB_HALF_CARRY_FLAG; + } + if (a < value) { + gb->registers[GB_REGISTER_AF] |= GB_CARRY_FLAG; + } +} + +static void rst(GB_gameboy_t *gb, uint8_t opcode) +{ + uint16_t call_addr = gb->pc - 1; + GB_advance_cycles(gb, 8); + gb->registers[GB_REGISTER_SP] -= 2; + GB_write_memory(gb, gb->registers[GB_REGISTER_SP] + 1, (gb->pc) >> 8); + GB_advance_cycles(gb, 4); + GB_write_memory(gb, gb->registers[GB_REGISTER_SP], (gb->pc) & 0xFF); + GB_advance_cycles(gb, 4); + gb->pc = opcode ^ 0xC7; + GB_debugger_call_hook(gb, call_addr); +} + +static void ret(GB_gameboy_t *gb, uint8_t opcode) +{ + GB_debugger_ret_hook(gb); + GB_advance_cycles(gb, 4); + gb->pc = GB_read_memory(gb, gb->registers[GB_REGISTER_SP]); + GB_advance_cycles(gb, 4); + gb->pc |= GB_read_memory(gb, gb->registers[GB_REGISTER_SP] + 1) << 8; + GB_advance_cycles(gb, 8); + gb->registers[GB_REGISTER_SP] += 2; +} + +static void reti(GB_gameboy_t *gb, uint8_t opcode) +{ + ret(gb, opcode); + gb->ime = true; +} + +static void call_a16(GB_gameboy_t *gb, uint8_t opcode) +{ + uint16_t call_addr = gb->pc - 1; + GB_advance_cycles(gb, 4); + gb->registers[GB_REGISTER_SP] -= 2; + uint16_t addr = GB_read_memory(gb, gb->pc++); + GB_advance_cycles(gb, 4); + addr |= (GB_read_memory(gb, gb->pc++) << 8); + GB_advance_cycles(gb, 8); + GB_write_memory(gb, gb->registers[GB_REGISTER_SP] + 1, (gb->pc) >> 8); + GB_advance_cycles(gb, 4); + GB_write_memory(gb, gb->registers[GB_REGISTER_SP], (gb->pc) & 0xFF); + GB_advance_cycles(gb, 4); + gb->pc = addr; + GB_debugger_call_hook(gb, call_addr); +} + +static void ld_da8_a(GB_gameboy_t *gb, uint8_t opcode) +{ + GB_advance_cycles(gb, 4); + uint8_t temp = GB_read_memory(gb, gb->pc++); + GB_advance_cycles(gb, 4); + GB_write_memory(gb, 0xFF00 + temp, gb->registers[GB_REGISTER_AF] >> 8); + GB_advance_cycles(gb, 4); +} + +static void ld_a_da8(GB_gameboy_t *gb, uint8_t opcode) +{ + GB_advance_cycles(gb, 4); + gb->registers[GB_REGISTER_AF] &= 0xFF; + uint8_t temp = GB_read_memory(gb, gb->pc++); + GB_advance_cycles(gb, 4); + gb->registers[GB_REGISTER_AF] |= GB_read_memory(gb, 0xFF00 + temp) << 8; + GB_advance_cycles(gb, 4); +} + +static void ld_dc_a(GB_gameboy_t *gb, uint8_t opcode) +{ + GB_advance_cycles(gb, 4); + GB_write_memory(gb, 0xFF00 + (gb->registers[GB_REGISTER_BC] & 0xFF), gb->registers[GB_REGISTER_AF] >> 8); + GB_advance_cycles(gb, 4); +} + +static void ld_a_dc(GB_gameboy_t *gb, uint8_t opcode) +{ + GB_advance_cycles(gb, 4); + gb->registers[GB_REGISTER_AF] &= 0xFF; + gb->registers[GB_REGISTER_AF] |= GB_read_memory(gb, 0xFF00 + (gb->registers[GB_REGISTER_BC] & 0xFF)) << 8; + GB_advance_cycles(gb, 4); +} + +static void add_sp_r8(GB_gameboy_t *gb, uint8_t opcode) +{ + int16_t offset; + uint16_t sp = gb->registers[GB_REGISTER_SP]; + GB_advance_cycles(gb, 4); + offset = (int8_t) GB_read_memory(gb, gb->pc++); + GB_advance_cycles(gb, 12); + gb->registers[GB_REGISTER_SP] += offset; + + gb->registers[GB_REGISTER_AF] &= 0xFF00; + + /* A new instruction, a new meaning for Half Carry! */ + if ((sp & 0xF) + (offset & 0xF) > 0xF) { + gb->registers[GB_REGISTER_AF] |= GB_HALF_CARRY_FLAG; + } + + if ((sp & 0xFF) + (offset & 0xFF) > 0xFF) { + gb->registers[GB_REGISTER_AF] |= GB_CARRY_FLAG; + } +} + +static void jp_hl(GB_gameboy_t *gb, uint8_t opcode) +{ + GB_advance_cycles(gb, 4); + gb->pc = gb->registers[GB_REGISTER_HL]; +} + +static void ld_da16_a(GB_gameboy_t *gb, uint8_t opcode) +{ + uint16_t addr; + GB_advance_cycles(gb, 4); + addr = GB_read_memory(gb, gb->pc++); + GB_advance_cycles(gb, 4); + addr |= GB_read_memory(gb, gb->pc++) << 8; + GB_advance_cycles(gb, 4); + GB_write_memory(gb, addr, gb->registers[GB_REGISTER_AF] >> 8); + GB_advance_cycles(gb, 4); +} + +static void ld_a_da16(GB_gameboy_t *gb, uint8_t opcode) +{ + uint16_t addr; + GB_advance_cycles(gb, 4); + gb->registers[GB_REGISTER_AF] &= 0xFF; + addr = GB_read_memory(gb, gb->pc++); + GB_advance_cycles(gb, 4); + addr |= GB_read_memory(gb, gb->pc++) << 8 ; + GB_advance_cycles(gb, 4); + gb->registers[GB_REGISTER_AF] |= GB_read_memory(gb, addr) << 8; + GB_advance_cycles(gb, 4); +} + +static void di(GB_gameboy_t *gb, uint8_t opcode) +{ + /* DI is NOT delayed, not even on a CGB. Mooneye's di_timing-GS test fails on a CGB + for different reasons.*/ + GB_advance_cycles(gb, 4); + gb->ime = false; +} + +static void ei(GB_gameboy_t *gb, uint8_t opcode) +{ + /* ei is actually "disable interrupts for one instruction, then enable them". */ + GB_advance_cycles(gb, 4); + gb->ime = false; + gb->ime_toggle = true; +} + +static void ld_hl_sp_r8(GB_gameboy_t *gb, uint8_t opcode) +{ + int16_t offset; + GB_advance_cycles(gb, 4); + gb->registers[GB_REGISTER_AF] &= 0xFF00; + offset = (int8_t) GB_read_memory(gb, gb->pc++); + GB_advance_cycles(gb, 8); + gb->registers[GB_REGISTER_HL] = gb->registers[GB_REGISTER_SP] + offset; + + if ((gb->registers[GB_REGISTER_SP] & 0xF) + (offset & 0xF) > 0xF) { + gb->registers[GB_REGISTER_AF] |= GB_HALF_CARRY_FLAG; + } + + if ((gb->registers[GB_REGISTER_SP] & 0xFF) + (offset & 0xFF) > 0xFF) { + gb->registers[GB_REGISTER_AF] |= GB_CARRY_FLAG; + } +} + +static void ld_sp_hl(GB_gameboy_t *gb, uint8_t opcode) +{ + GB_advance_cycles(gb, 8); + gb->registers[GB_REGISTER_SP] = gb->registers[GB_REGISTER_HL]; +} + +static void rlc_r(GB_gameboy_t *gb, uint8_t opcode) +{ + bool carry; + uint8_t value; + GB_advance_cycles(gb, 4); + value = get_src_value(gb, opcode); + carry = (value & 0x80) != 0; + gb->registers[GB_REGISTER_AF] &= 0xFF00; + set_src_value(gb, opcode, (value << 1) | carry); + if (carry) { + gb->registers[GB_REGISTER_AF] |= GB_CARRY_FLAG; + } + if (!(value << 1)) { + gb->registers[GB_REGISTER_AF] |= GB_ZERO_FLAG; + } +} + +static void rrc_r(GB_gameboy_t *gb, uint8_t opcode) +{ + bool carry; + uint8_t value; + GB_advance_cycles(gb, 4); + value = get_src_value(gb, opcode); + carry = (value & 0x01) != 0; + gb->registers[GB_REGISTER_AF] &= 0xFF00; + value = (value >> 1) | (carry << 7); + set_src_value(gb, opcode, value); + if (carry) { + gb->registers[GB_REGISTER_AF] |= GB_CARRY_FLAG; + } + if (value == 0) { + gb->registers[GB_REGISTER_AF] |= GB_ZERO_FLAG; + } +} + +static void rl_r(GB_gameboy_t *gb, uint8_t opcode) +{ + bool carry; + uint8_t value; + bool bit7; + GB_advance_cycles(gb, 4); + value = get_src_value(gb, opcode); + carry = (gb->registers[GB_REGISTER_AF] & GB_CARRY_FLAG) != 0; + bit7 = (value & 0x80) != 0; + + gb->registers[GB_REGISTER_AF] &= 0xFF00; + value = (value << 1) | carry; + set_src_value(gb, opcode, value); + if (bit7) { + gb->registers[GB_REGISTER_AF] |= GB_CARRY_FLAG; + } + if (value == 0) { + gb->registers[GB_REGISTER_AF] |= GB_ZERO_FLAG; + } +} + +static void rr_r(GB_gameboy_t *gb, uint8_t opcode) +{ + bool carry; + uint8_t value; + bool bit1; + + GB_advance_cycles(gb, 4); + value = get_src_value(gb, opcode); + carry = (gb->registers[GB_REGISTER_AF] & GB_CARRY_FLAG) != 0; + bit1 = (value & 0x1) != 0; + + gb->registers[GB_REGISTER_AF] &= 0xFF00; + value = (value >> 1) | (carry << 7); + set_src_value(gb, opcode, value); + if (bit1) { + gb->registers[GB_REGISTER_AF] |= GB_CARRY_FLAG; + } + if (value == 0) { + gb->registers[GB_REGISTER_AF] |= GB_ZERO_FLAG; + } +} + +static void sla_r(GB_gameboy_t *gb, uint8_t opcode) +{ + uint8_t value; + bool carry; + GB_advance_cycles(gb, 4); + value = get_src_value(gb, opcode); + carry = (value & 0x80) != 0; + gb->registers[GB_REGISTER_AF] &= 0xFF00; + set_src_value(gb, opcode, (value << 1)); + if (carry) { + gb->registers[GB_REGISTER_AF] |= GB_CARRY_FLAG; + } + if ((value & 0x7F) == 0) { + gb->registers[GB_REGISTER_AF] |= GB_ZERO_FLAG; + } +} + +static void sra_r(GB_gameboy_t *gb, uint8_t opcode) +{ + uint8_t bit7; + uint8_t value; + GB_advance_cycles(gb, 4); + value = get_src_value(gb, opcode); + bit7 = value & 0x80; + gb->registers[GB_REGISTER_AF] &= 0xFF00; + if (value & 1) { + gb->registers[GB_REGISTER_AF] |= GB_CARRY_FLAG; + } + value = (value >> 1) | bit7; + set_src_value(gb, opcode, value); + if (value == 0) { + gb->registers[GB_REGISTER_AF] |= GB_ZERO_FLAG; + } +} + +static void srl_r(GB_gameboy_t *gb, uint8_t opcode) +{ + uint8_t value; + GB_advance_cycles(gb, 4); + value = get_src_value(gb, opcode); + gb->registers[GB_REGISTER_AF] &= 0xFF00; + set_src_value(gb, opcode, (value >> 1)); + if (value & 1) { + gb->registers[GB_REGISTER_AF] |= GB_CARRY_FLAG; + } + if (!(value >> 1)) { + gb->registers[GB_REGISTER_AF] |= GB_ZERO_FLAG; + } +} + +static void swap_r(GB_gameboy_t *gb, uint8_t opcode) +{ + uint8_t value; + GB_advance_cycles(gb, 4); + value = get_src_value(gb, opcode); + gb->registers[GB_REGISTER_AF] &= 0xFF00; + set_src_value(gb, opcode, (value >> 4) | (value << 4)); + if (!value) { + gb->registers[GB_REGISTER_AF] |= GB_ZERO_FLAG; + } +} + +static void bit_r(GB_gameboy_t *gb, uint8_t opcode) +{ + uint8_t value; + uint8_t bit; + GB_advance_cycles(gb, 4); + value = get_src_value(gb, opcode); + bit = 1 << ((opcode >> 3) & 7); + if ((opcode & 0xC0) == 0x40) { /* Bit */ + gb->registers[GB_REGISTER_AF] &= 0xFF00 | GB_CARRY_FLAG; + gb->registers[GB_REGISTER_AF] |= GB_HALF_CARRY_FLAG; + if (!(bit & value)) { + gb->registers[GB_REGISTER_AF] |= GB_ZERO_FLAG; + } + } + else if ((opcode & 0xC0) == 0x80) { /* res */ + set_src_value(gb, opcode, value & ~bit) ; + } + else if ((opcode & 0xC0) == 0xC0) { /* set */ + set_src_value(gb, opcode, value | bit) ; + } +} + +static void cb_prefix(GB_gameboy_t *gb, uint8_t opcode) +{ + GB_advance_cycles(gb, 4); + opcode = GB_read_memory(gb, gb->pc++); + switch (opcode >> 3) { + case 0: + rlc_r(gb, opcode); + break; + case 1: + rrc_r(gb, opcode); + break; + case 2: + rl_r(gb, opcode); + break; + case 3: + rr_r(gb, opcode); + break; + case 4: + sla_r(gb, opcode); + break; + case 5: + sra_r(gb, opcode); + break; + case 6: + swap_r(gb, opcode); + break; + case 7: + srl_r(gb, opcode); + break; + default: + bit_r(gb, opcode); + break; + } +} + +static GB_opcode_t *opcodes[256] = { + /* X0 X1 X2 X3 X4 X5 X6 X7 */ + /* X8 X9 Xa Xb Xc Xd Xe Xf */ + nop, ld_rr_d16, ld_drr_a, inc_rr, inc_hr, dec_hr, ld_hr_d8, rlca, /* 0X */ + ld_da16_sp, add_hl_rr, ld_a_drr, dec_rr, inc_lr, dec_lr, ld_lr_d8, rrca, + stop, ld_rr_d16, ld_drr_a, inc_rr, inc_hr, dec_hr, ld_hr_d8, rla, /* 1X */ + jr_r8, add_hl_rr, ld_a_drr, dec_rr, inc_lr, dec_lr, ld_lr_d8, rra, + jr_cc_r8, ld_rr_d16, ld_dhli_a, inc_rr, inc_hr, dec_hr, ld_hr_d8, daa, /* 2X */ + jr_cc_r8, add_hl_rr, ld_a_dhli, dec_rr, inc_lr, dec_lr, ld_lr_d8, cpl, + jr_cc_r8, ld_rr_d16, ld_dhld_a, inc_rr, inc_dhl, dec_dhl, ld_dhl_d8, scf, /* 3X */ + jr_cc_r8, add_hl_rr, ld_a_dhld, dec_rr, inc_hr, dec_hr, ld_hr_d8, ccf, + nop, ld_b_c, ld_b_d, ld_b_e, ld_b_h, ld_b_l, ld_b_dhl, ld_b_a, /* 4X */ + ld_c_b, nop, ld_c_d, ld_c_e, ld_c_h, ld_c_l, ld_c_dhl, ld_c_a, + ld_d_b, ld_d_c, nop, ld_d_e, ld_d_h, ld_d_l, ld_d_dhl, ld_d_a, /* 5X */ + ld_e_b, ld_e_c, ld_e_d, nop, ld_e_h, ld_e_l, ld_e_dhl, ld_e_a, + ld_h_b, ld_h_c, ld_h_d, ld_h_e, nop, ld_h_l, ld_h_dhl, ld_h_a, /* 6X */ + ld_l_b, ld_l_c, ld_l_d, ld_l_e, ld_l_h, nop, ld_l_dhl, ld_l_a, + ld_dhl_b, ld_dhl_c, ld_dhl_d, ld_dhl_e, ld_dhl_h, ld_dhl_l, halt, ld_dhl_a, /* 7X */ + ld_a_b, ld_a_c, ld_a_d, ld_a_e, ld_a_h, ld_a_l, ld_a_dhl, nop, + add_a_r, add_a_r, add_a_r, add_a_r, add_a_r, add_a_r, add_a_r, add_a_r, /* 8X */ + adc_a_r, adc_a_r, adc_a_r, adc_a_r, adc_a_r, adc_a_r, adc_a_r, adc_a_r, + sub_a_r, sub_a_r, sub_a_r, sub_a_r, sub_a_r, sub_a_r, sub_a_r, sub_a_r, /* 9X */ + sbc_a_r, sbc_a_r, sbc_a_r, sbc_a_r, sbc_a_r, sbc_a_r, sbc_a_r, sbc_a_r, + and_a_r, and_a_r, and_a_r, and_a_r, and_a_r, and_a_r, and_a_r, and_a_r, /* aX */ + xor_a_r, xor_a_r, xor_a_r, xor_a_r, xor_a_r, xor_a_r, xor_a_r, xor_a_r, + or_a_r, or_a_r, or_a_r, or_a_r, or_a_r, or_a_r, or_a_r, or_a_r, /* bX */ + cp_a_r, cp_a_r, cp_a_r, cp_a_r, cp_a_r, cp_a_r, cp_a_r, cp_a_r, + ret_cc, pop_rr, jp_cc_a16, jp_a16, call_cc_a16,push_rr, add_a_d8, rst, /* cX */ + ret_cc, ret, jp_cc_a16, cb_prefix, call_cc_a16,call_a16, adc_a_d8, rst, + ret_cc, pop_rr, jp_cc_a16, ill, call_cc_a16,push_rr, sub_a_d8, rst, /* dX */ + ret_cc, reti, jp_cc_a16, ill, call_cc_a16,ill, sbc_a_d8, rst, + ld_da8_a, pop_rr, ld_dc_a, ill, ill, push_rr, and_a_d8, rst, /* eX */ + add_sp_r8, jp_hl, ld_da16_a, ill, ill, ill, xor_a_d8, rst, + ld_a_da8, pop_rr, ld_a_dc, di, ill, push_rr, or_a_d8, rst, /* fX */ + ld_hl_sp_r8,ld_sp_hl, ld_a_da16, ei, ill, ill, cp_a_d8, rst, +}; +void GB_cpu_run(GB_gameboy_t *gb) +{ + gb->vblank_just_occured = false; + bool interrupt = gb->interrupt_enable & gb->io_registers[GB_IO_IF] & 0x1F; + + if (interrupt) { + gb->halted = false; + } + + if (gb->hdma_on) { + GB_advance_cycles(gb, 4); + return; + } + + bool effecitve_ime = gb->ime; + if (gb->ime_toggle) { + gb->ime = !gb->ime; + gb->ime_toggle = false; + } + + if (effecitve_ime && interrupt) { + uint8_t interrupt_bit = 0; + uint8_t interrupt_queue = gb->interrupt_enable & gb->io_registers[GB_IO_IF] & 0x1F; + while (!(interrupt_queue & 1)) { + interrupt_queue >>= 1; + interrupt_bit++; + } + gb->io_registers[GB_IO_IF] &= ~(1 << interrupt_bit); + gb->ime = false; + nop(gb, 0); + /* Run pseudo instructions rst 40-60*/ + rst(gb, 0x87 + interrupt_bit * 8); + } + else if(!gb->halted && !gb->stopped) { + uint8_t opcode = GB_read_memory(gb, gb->pc++); + if (gb->halt_bug) { + gb->pc--; + gb->halt_bug = false; + } + opcodes[opcode](gb, opcode); + } + else { + GB_advance_cycles(gb, 4); + } +} diff --git a/waterbox/sameboy/z80_cpu.h b/waterbox/sameboy/z80_cpu.h new file mode 100644 index 0000000000..1434ed7b96 --- /dev/null +++ b/waterbox/sameboy/z80_cpu.h @@ -0,0 +1,10 @@ +#ifndef z80_cpu_h +#define z80_cpu_h +#include "gb.h" + +void GB_cpu_disassemble(GB_gameboy_t *gb, uint16_t pc, uint16_t count); +#ifdef GB_INTERNAL +void GB_cpu_run(GB_gameboy_t *gb); +#endif + +#endif /* z80_cpu_h */ diff --git a/waterbox/sameboy/z80_disassembler.c b/waterbox/sameboy/z80_disassembler.c new file mode 100644 index 0000000000..08fb62f039 --- /dev/null +++ b/waterbox/sameboy/z80_disassembler.c @@ -0,0 +1,788 @@ +#include +#include +#include "gb.h" + + +typedef void GB_opcode_t(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc); + +static void ill(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) +{ + GB_log(gb, ".BYTE $%02x\n", opcode); + (*pc)++; +} + +static void nop(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) +{ + GB_log(gb, "NOP\n"); + (*pc)++; +} + +static void stop(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) +{ + (*pc)++; + uint8_t next = GB_read_memory(gb, (*pc)++); + if (next) { + GB_log(gb, "CORRUPTED STOP (%02x)\n", next); + } + else { + GB_log(gb, "STOP\n"); + } +} + +static char *register_names[] = {"af", "bc", "de", "hl", "sp"}; + +static void ld_rr_d16(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) +{ + uint8_t register_id; + uint16_t value; + register_id = (GB_read_memory(gb, (*pc)++) >> 4) + 1; + value = GB_read_memory(gb, (*pc)++); + value |= GB_read_memory(gb, (*pc)++) << 8; + const char *symbol = GB_debugger_name_for_address(gb, value); + if (symbol) { + GB_log(gb, "LD %s, %s ; =$%04x\n", register_names[register_id], symbol, value); + } + else { + GB_log(gb, "LD %s, $%04x\n", register_names[register_id], value); + } +} + +static void ld_drr_a(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) +{ + uint8_t register_id; + register_id = (GB_read_memory(gb, (*pc)++) >> 4) + 1; + GB_log(gb, "LD [%s], a\n", register_names[register_id]); +} + +static void inc_rr(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) +{ + uint8_t register_id; + register_id = (GB_read_memory(gb, (*pc)++) >> 4) + 1; + GB_log(gb, "INC %s\n", register_names[register_id]); +} + +static void inc_hr(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) +{ + uint8_t register_id; + (*pc)++; + register_id = ((opcode >> 4) + 1) & 0x03; + GB_log(gb, "INC %c\n", register_names[register_id][0]); + +} +static void dec_hr(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) +{ + uint8_t register_id; + (*pc)++; + register_id = ((opcode >> 4) + 1) & 0x03; + GB_log(gb, "DEC %c\n", register_names[register_id][0]); +} + +static void ld_hr_d8(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) +{ + uint8_t register_id; + (*pc)++; + register_id = ((opcode >> 4) + 1) & 0x03; + GB_log(gb, "LD %c, $%02x\n", register_names[register_id][0], GB_read_memory(gb, (*pc)++)); +} + +static void rlca(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) +{ + (*pc)++; + GB_log(gb, "RLCA\n"); +} + +static void rla(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) +{ + (*pc)++; + GB_log(gb, "RLA\n"); +} + +static void ld_da16_sp(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc){ + uint16_t addr; + (*pc)++; + addr = GB_read_memory(gb, (*pc)++); + addr |= GB_read_memory(gb, (*pc)++) << 8; + const char *symbol = GB_debugger_name_for_address(gb, addr); + if (symbol) { + GB_log(gb, "LD [%s], sp ; =$%04x\n", symbol, addr); + } + else { + GB_log(gb, "LD [$%04x], sp\n", addr); + } +} + +static void add_hl_rr(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) +{ + uint8_t register_id; + (*pc)++; + register_id = (opcode >> 4) + 1; + GB_log(gb, "ADD hl, %s\n", register_names[register_id]); +} + +static void ld_a_drr(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) +{ + uint8_t register_id; + register_id = (GB_read_memory(gb, (*pc)++) >> 4) + 1; + GB_log(gb, "LD a, [%s]\n", register_names[register_id]); +} + +static void dec_rr(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) +{ + uint8_t register_id; + register_id = (GB_read_memory(gb, (*pc)++) >> 4) + 1; + GB_log(gb, "DEC %s\n", register_names[register_id]); +} + +static void inc_lr(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) +{ + uint8_t register_id; + register_id = (GB_read_memory(gb, (*pc)++) >> 4) + 1; + + GB_log(gb, "INC %c\n", register_names[register_id][1]); +} +static void dec_lr(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) +{ + uint8_t register_id; + register_id = (GB_read_memory(gb, (*pc)++) >> 4) + 1; + + GB_log(gb, "DEC %c\n", register_names[register_id][1]); +} + +static void ld_lr_d8(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) +{ + uint8_t register_id; + register_id = (GB_read_memory(gb, (*pc)++) >> 4) + 1; + + GB_log(gb, "LD %c, $%02x\n", register_names[register_id][1], GB_read_memory(gb, (*pc)++)); +} + +static void rrca(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) +{ + GB_log(gb, "RRCA\n"); + (*pc)++; +} + +static void rra(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) +{ + GB_log(gb, "RRA\n"); + (*pc)++; +} + +static void jr_r8(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) +{ + (*pc)++; + uint16_t addr = *pc + (int8_t) GB_read_memory(gb, (*pc)) + 1; + const char *symbol = GB_debugger_name_for_address(gb, addr); + if (symbol) { + GB_attributed_log(gb, GB_LOG_UNDERLINE, "JR %s ; =$%04x\n", symbol, addr); + } + else { + GB_attributed_log(gb, GB_LOG_UNDERLINE, "JR $%04x\n", addr); + } + (*pc)++; +} + +static const char *condition_code(uint8_t opcode) +{ + switch ((opcode >> 3) & 0x3) { + case 0: + return "nz"; + case 1: + return "z"; + case 2: + return "nc"; + case 3: + return "c"; + } + + return NULL; +} + +static void jr_cc_r8(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) +{ + (*pc)++; + uint16_t addr = *pc + (int8_t) GB_read_memory(gb, (*pc)) + 1; + const char *symbol = GB_debugger_name_for_address(gb, addr); + if (symbol) { + GB_attributed_log(gb, GB_LOG_DASHED_UNDERLINE, "JR %s, %s ; =$%04x\n", condition_code(opcode), symbol, addr); + } + else { + GB_attributed_log(gb, GB_LOG_DASHED_UNDERLINE, "JR %s, $%04x\n", condition_code(opcode), addr); + } + (*pc)++; +} + +static void daa(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) +{ + GB_log(gb, "DAA\n"); + (*pc)++; +} + +static void cpl(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) +{ + GB_log(gb, "CPL\n"); + (*pc)++; +} + +static void scf(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) +{ + GB_log(gb, "SCF\n"); + (*pc)++; +} + +static void ccf(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) +{ + GB_log(gb, "CCF\n"); + (*pc)++; +} + +static void ld_dhli_a(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) +{ + GB_log(gb, "LD [hli], a\n"); + (*pc)++; +} + +static void ld_dhld_a(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) +{ + GB_log(gb, "LD [hld], a\n"); + (*pc)++; +} + +static void ld_a_dhli(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) +{ + GB_log(gb, "LD a, [hli]\n"); + (*pc)++; +} + +static void ld_a_dhld(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) +{ + GB_log(gb, "LD a, [hld]\n"); + (*pc)++; +} + +static void inc_dhl(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) +{ + GB_log(gb, "INC [hl]\n"); + (*pc)++; +} + +static void dec_dhl(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) +{ + GB_log(gb, "DEC [hl]\n"); + (*pc)++; +} + +static void ld_dhl_d8(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) +{ + (*pc)++; + GB_log(gb, "LD [hl], $%02x\n", GB_read_memory(gb, (*pc)++)); +} + +static const char *get_src_name(uint8_t opcode) +{ + uint8_t src_register_id; + uint8_t src_low; + src_register_id = ((opcode >> 1) + 1) & 3; + src_low = (opcode & 1); + if (src_register_id == GB_REGISTER_AF) { + return src_low? "a": "[hl]"; + } + if (src_low) { + return register_names[src_register_id] + 1; + } + static const char *high_register_names[] = {"a", "b", "d", "h"}; + return high_register_names[src_register_id]; +} + +static const char *get_dst_name(uint8_t opcode) +{ + uint8_t dst_register_id; + uint8_t dst_low; + dst_register_id = ((opcode >> 4) + 1) & 3; + dst_low = opcode & 8; + if (dst_register_id == GB_REGISTER_AF) { + return dst_low? "a": "[hl]"; + } + if (dst_low) { + return register_names[dst_register_id] + 1; + } + static const char *high_register_names[] = {"a", "b", "d", "h"}; + return high_register_names[dst_register_id]; +} + +static void ld_r_r(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) +{ + (*pc)++; + GB_log(gb, "LD %s, %s\n", get_dst_name(opcode), get_src_name(opcode)); +} + +static void add_a_r(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) +{ + (*pc)++; + GB_log(gb, "ADD %s\n", get_src_name(opcode)); +} + +static void adc_a_r(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) +{ + (*pc)++; + GB_log(gb, "ADC %s\n", get_src_name(opcode)); +} + +static void sub_a_r(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) +{ + (*pc)++; + GB_log(gb, "SUB %s\n", get_src_name(opcode)); +} + +static void sbc_a_r(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) +{ + (*pc)++; + GB_log(gb, "SBC %s\n", get_src_name(opcode)); +} + +static void and_a_r(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) +{ + (*pc)++; + GB_log(gb, "AND %s\n", get_src_name(opcode)); +} + +static void xor_a_r(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) +{ + (*pc)++; + GB_log(gb, "XOR %s\n", get_src_name(opcode)); +} + +static void or_a_r(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) +{ + (*pc)++; + GB_log(gb, "OR %s\n", get_src_name(opcode)); +} + +static void cp_a_r(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) +{ + (*pc)++; + GB_log(gb, "CP %s\n", get_src_name(opcode)); +} + +static void halt(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) +{ + (*pc)++; + GB_log(gb, "HALT\n"); +} + +static void ret_cc(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) +{ + (*pc)++; + GB_attributed_log(gb, GB_LOG_DASHED_UNDERLINE, "RET %s\n", condition_code(opcode)); +} + +static void pop_rr(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) +{ + uint8_t register_id; + register_id = ((GB_read_memory(gb, (*pc)++) >> 4) + 1) & 3; + GB_log(gb, "POP %s\n", register_names[register_id]); +} + +static void jp_cc_a16(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) +{ + (*pc)++; + uint16_t addr = GB_read_memory(gb, *pc) | (GB_read_memory(gb, *pc + 1) << 8); + const char *symbol = GB_debugger_name_for_address(gb, addr); + if (symbol) { + GB_attributed_log(gb, GB_LOG_DASHED_UNDERLINE, "JP %s, %s ; =$%04x\n", condition_code(opcode), symbol, addr); + } + else { + GB_attributed_log(gb, GB_LOG_DASHED_UNDERLINE, "JP %s, $%04x\n", condition_code(opcode), addr); + } + (*pc) += 2; +} + +static void jp_a16(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) +{ + (*pc)++; + uint16_t addr = GB_read_memory(gb, *pc) | (GB_read_memory(gb, *pc + 1) << 8); + const char *symbol = GB_debugger_name_for_address(gb, addr); + if (symbol) { + GB_log(gb, "JP %s ; =$%04x\n", symbol, addr); + } + else { + GB_log(gb, "JP $%04x\n", addr); + } + (*pc) += 2; +} + +static void call_cc_a16(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) +{ + (*pc)++; + uint16_t addr = GB_read_memory(gb, *pc) | (GB_read_memory(gb, *pc + 1) << 8); + const char *symbol = GB_debugger_name_for_address(gb, addr); + if (symbol) { + GB_log(gb, "CALL %s, %s ; =$%04x\n", condition_code(opcode), symbol, addr); + } + else { + GB_log(gb, "CALL %s, $%04x\n", condition_code(opcode), addr); + } + (*pc) += 2; +} + +static void push_rr(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) +{ + uint8_t register_id; + register_id = ((GB_read_memory(gb, (*pc)++) >> 4) + 1) & 3; + GB_log(gb, "PUSH %s\n", register_names[register_id]); +} + +static void add_a_d8(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) +{ + (*pc)++; + GB_log(gb, "ADD $%02x\n", GB_read_memory(gb, (*pc)++)); +} + +static void adc_a_d8(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) +{ + (*pc)++; + GB_log(gb, "ADC $%02x\n", GB_read_memory(gb, (*pc)++)); +} + +static void sub_a_d8(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) +{ + (*pc)++; + GB_log(gb, "SUB $%02x\n", GB_read_memory(gb, (*pc)++)); +} + +static void sbc_a_d8(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) +{ + (*pc)++; + GB_log(gb, "SBC $%02x\n", GB_read_memory(gb, (*pc)++)); +} + +static void and_a_d8(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) +{ + (*pc)++; + GB_log(gb, "AND $%02x\n", GB_read_memory(gb, (*pc)++)); +} + +static void xor_a_d8(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) +{ + (*pc)++; + GB_log(gb, "XOR $%02x\n", GB_read_memory(gb, (*pc)++)); +} + +static void or_a_d8(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) +{ + (*pc)++; + GB_log(gb, "OR $%02x\n", GB_read_memory(gb, (*pc)++)); +} + +static void cp_a_d8(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) +{ + (*pc)++; + GB_log(gb, "CP $%02x\n", GB_read_memory(gb, (*pc)++)); +} + +static void rst(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) +{ + (*pc)++; + GB_log(gb, "RST $%02x\n", opcode ^ 0xC7); + +} + +static void ret(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) +{ + (*pc)++; + GB_attributed_log(gb, GB_LOG_UNDERLINE, "RET\n"); +} + +static void reti(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) +{ + (*pc)++; + GB_attributed_log(gb, GB_LOG_UNDERLINE, "RETI\n"); +} + +static void call_a16(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) +{ + (*pc)++; + uint16_t addr = GB_read_memory(gb, *pc) | (GB_read_memory(gb, *pc + 1) << 8); + const char *symbol = GB_debugger_name_for_address(gb, 0xff00 + addr); + if (symbol) { + GB_log(gb, "CALL %s ; =$%04x\n", symbol, addr); + } + else { + GB_log(gb, "CALL $%04x\n", addr); + } + (*pc) += 2; +} + +static void ld_da8_a(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) +{ + (*pc)++; + uint8_t addr = GB_read_memory(gb, (*pc)++); + const char *symbol = GB_debugger_name_for_address(gb, 0xff00 + addr); + if (symbol) { + GB_log(gb, "LDH [%s & $FF], a ; =$%02x\n", symbol, addr); + } + else { + GB_log(gb, "LDH [$%02x], a\n", addr); + } +} + +static void ld_a_da8(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) +{ + (*pc)++; + uint8_t addr = GB_read_memory(gb, (*pc)++); + const char *symbol = GB_debugger_name_for_address(gb, 0xff00 + addr); + if (symbol) { + GB_log(gb, "LDH a, [%s & $FF] ; =$%02x\n", symbol, addr); + } + else { + GB_log(gb, "LDH a, [$%02x]\n", addr); + } +} + +static void ld_dc_a(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) +{ + (*pc)++; + GB_log(gb, "LDH [c], a\n"); +} + +static void ld_a_dc(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) +{ + (*pc)++; + GB_log(gb, "LDH a, [c]\n"); +} + +static void add_sp_r8(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) +{ + (*pc)++; + int8_t temp = GB_read_memory(gb, (*pc)++); + GB_log(gb, "ADD SP, %s$%02x\n", temp < 0? "-" : "", temp < 0? -temp : temp); +} + +static void jp_hl(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) +{ + (*pc)++; + GB_log(gb, "JP hl\n"); +} + +static void ld_da16_a(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) +{ + (*pc)++; + uint16_t addr = GB_read_memory(gb, *pc) | (GB_read_memory(gb, *pc + 1) << 8); + const char *symbol = GB_debugger_name_for_address(gb, addr); + if (symbol) { + GB_log(gb, "LD [%s], a ; =$%04x\n", symbol, addr); + } + else { + GB_log(gb, "LD [$%04x], a\n", addr); + } + (*pc) += 2; +} + +static void ld_a_da16(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) +{ + (*pc)++; + uint16_t addr = GB_read_memory(gb, *pc) | (GB_read_memory(gb, *pc + 1) << 8); + const char *symbol = GB_debugger_name_for_address(gb, addr); + if (symbol) { + GB_log(gb, "LD a, [%s] ; =$%04x\n", symbol, addr); + } + else { + GB_log(gb, "LD a, [$%04x]\n", addr); + } + (*pc) += 2; +} + +static void di(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) +{ + (*pc)++; + GB_log(gb, "DI\n"); +} + +static void ei(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) +{ + (*pc)++; + GB_log(gb, "EI\n"); +} + +static void ld_hl_sp_r8(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) +{ + (*pc)++; + int8_t temp = GB_read_memory(gb, (*pc)++); + GB_log(gb, "LD hl, sp, %s$%02x\n", temp < 0? "-" : "", temp < 0? -temp : temp); +} + +static void ld_sp_hl(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) +{ + (*pc)++; + GB_log(gb, "LD sp, hl\n"); +} + +static void rlc_r(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) +{ + (*pc)++; + GB_log(gb, "RLC %s\n", get_src_name(opcode)); +} + +static void rrc_r(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) +{ + (*pc)++; + GB_log(gb, "RRC %s\n", get_src_name(opcode)); +} + +static void rl_r(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) +{ + (*pc)++; + GB_log(gb, "RL %s\n", get_src_name(opcode)); +} + +static void rr_r(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) +{ + (*pc)++; + GB_log(gb, "RR %s\n", get_src_name(opcode)); +} + +static void sla_r(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) +{ + (*pc)++; + GB_log(gb, "SLA %s\n", get_src_name(opcode)); +} + +static void sra_r(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) +{ + (*pc)++; + GB_log(gb, "SRA %s\n", get_src_name(opcode)); +} + +static void srl_r(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) +{ + (*pc)++; + GB_log(gb, "SRL %s\n", get_src_name(opcode)); +} + +static void swap_r(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) +{ + (*pc)++; + GB_log(gb, "RLC %s\n", get_src_name(opcode)); +} + +static void bit_r(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) +{ + uint8_t bit; + (*pc)++; + bit = ((opcode >> 3) & 7); + if ((opcode & 0xC0) == 0x40) { /* Bit */ + GB_log(gb, "BIT %s, %d\n", get_src_name(opcode), bit); + } + else if ((opcode & 0xC0) == 0x80) { /* res */ + GB_log(gb, "RES %s, %d\n", get_src_name(opcode), bit); + } + else if ((opcode & 0xC0) == 0xC0) { /* set */ + GB_log(gb, "SET %s, %d\n", get_src_name(opcode), bit); + } +} + +static void cb_prefix(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) +{ + opcode = GB_read_memory(gb, ++*pc); + switch (opcode >> 3) { + case 0: + rlc_r(gb, opcode, pc); + break; + case 1: + rrc_r(gb, opcode, pc); + break; + case 2: + rl_r(gb, opcode, pc); + break; + case 3: + rr_r(gb, opcode, pc); + break; + case 4: + sla_r(gb, opcode, pc); + break; + case 5: + sra_r(gb, opcode, pc); + break; + case 6: + swap_r(gb, opcode, pc); + break; + case 7: + srl_r(gb, opcode, pc); + break; + default: + bit_r(gb, opcode, pc); + break; + } +} + +static GB_opcode_t *opcodes[256] = { + /* X0 X1 X2 X3 X4 X5 X6 X7 */ + /* X8 X9 Xa Xb Xc Xd Xe Xf */ + nop, ld_rr_d16, ld_drr_a, inc_rr, inc_hr, dec_hr, ld_hr_d8, rlca, /* 0X */ + ld_da16_sp, add_hl_rr, ld_a_drr, dec_rr, inc_lr, dec_lr, ld_lr_d8, rrca, + stop, ld_rr_d16, ld_drr_a, inc_rr, inc_hr, dec_hr, ld_hr_d8, rla, /* 1X */ + jr_r8, add_hl_rr, ld_a_drr, dec_rr, inc_lr, dec_lr, ld_lr_d8, rra, + jr_cc_r8, ld_rr_d16, ld_dhli_a, inc_rr, inc_hr, dec_hr, ld_hr_d8, daa, /* 2X */ + jr_cc_r8, add_hl_rr, ld_a_dhli, dec_rr, inc_lr, dec_lr, ld_lr_d8, cpl, + jr_cc_r8, ld_rr_d16, ld_dhld_a, inc_rr, inc_dhl, dec_dhl, ld_dhl_d8, scf, /* 3X */ + jr_cc_r8, add_hl_rr, ld_a_dhld, dec_rr, inc_hr, dec_hr, ld_hr_d8, ccf, + ld_r_r, ld_r_r, ld_r_r, ld_r_r, ld_r_r, ld_r_r, ld_r_r, ld_r_r, /* 4X */ + ld_r_r, ld_r_r, ld_r_r, ld_r_r, ld_r_r, ld_r_r, ld_r_r, ld_r_r, + ld_r_r, ld_r_r, ld_r_r, ld_r_r, ld_r_r, ld_r_r, ld_r_r, ld_r_r, /* 5X */ + ld_r_r, ld_r_r, ld_r_r, ld_r_r, ld_r_r, ld_r_r, ld_r_r, ld_r_r, + ld_r_r, ld_r_r, ld_r_r, ld_r_r, ld_r_r, ld_r_r, ld_r_r, ld_r_r, /* 6X */ + ld_r_r, ld_r_r, ld_r_r, ld_r_r, ld_r_r, ld_r_r, ld_r_r, ld_r_r, + ld_r_r, ld_r_r, ld_r_r, ld_r_r, ld_r_r, ld_r_r, halt, ld_r_r, /* 7X */ + ld_r_r, ld_r_r, ld_r_r, ld_r_r, ld_r_r, ld_r_r, ld_r_r, ld_r_r, + add_a_r, add_a_r, add_a_r, add_a_r, add_a_r, add_a_r, add_a_r, add_a_r, /* 8X */ + adc_a_r, adc_a_r, adc_a_r, adc_a_r, adc_a_r, adc_a_r, adc_a_r, adc_a_r, + sub_a_r, sub_a_r, sub_a_r, sub_a_r, sub_a_r, sub_a_r, sub_a_r, sub_a_r, /* 9X */ + sbc_a_r, sbc_a_r, sbc_a_r, sbc_a_r, sbc_a_r, sbc_a_r, sbc_a_r, sbc_a_r, + and_a_r, and_a_r, and_a_r, and_a_r, and_a_r, and_a_r, and_a_r, and_a_r, /* aX */ + xor_a_r, xor_a_r, xor_a_r, xor_a_r, xor_a_r, xor_a_r, xor_a_r, xor_a_r, + or_a_r, or_a_r, or_a_r, or_a_r, or_a_r, or_a_r, or_a_r, or_a_r, /* bX */ + cp_a_r, cp_a_r, cp_a_r, cp_a_r, cp_a_r, cp_a_r, cp_a_r, cp_a_r, + ret_cc, pop_rr, jp_cc_a16, jp_a16, call_cc_a16,push_rr, add_a_d8, rst, /* cX */ + ret_cc, ret, jp_cc_a16, cb_prefix, call_cc_a16,call_a16, adc_a_d8, rst, + ret_cc, pop_rr, jp_cc_a16, ill, call_cc_a16,push_rr, sub_a_d8, rst, /* dX */ + ret_cc, reti, jp_cc_a16, ill, call_cc_a16,ill, sbc_a_d8, rst, + ld_da8_a, pop_rr, ld_dc_a, ill, ill, push_rr, and_a_d8, rst, /* eX */ + add_sp_r8, jp_hl, ld_da16_a, ill, ill, ill, xor_a_d8, rst, + ld_a_da8, pop_rr, ld_a_dc, di, ill, push_rr, or_a_d8, rst, /* fX */ + ld_hl_sp_r8,ld_sp_hl, ld_a_da16, ei, ill, ill, cp_a_d8, rst, +}; + + + +void GB_cpu_disassemble(GB_gameboy_t *gb, uint16_t pc, uint16_t count) +{ + const GB_bank_symbol_t *function_symbol = GB_debugger_find_symbol(gb, pc); + + if (function_symbol && pc - function_symbol->addr > 0x1000) { + function_symbol = NULL; + } + + if (function_symbol && pc != function_symbol->addr) { + GB_log(gb, "%s:\n", function_symbol->name); + } + + uint16_t current_function = function_symbol? function_symbol->addr : 0; + + while (count--) { + function_symbol = GB_debugger_find_symbol(gb, pc); + if (function_symbol && function_symbol->addr == pc) { + if (current_function != function_symbol->addr) { + GB_log(gb, "\n"); + } + GB_log(gb, "%s:\n", function_symbol->name); + } + if (function_symbol) { + GB_log(gb, "%s%04x <+%03x>: ", pc == gb->pc? " ->": " ", pc, pc - function_symbol->addr); + } + else { + GB_log(gb, "%s%04x: ", pc == gb->pc? " ->": " ", pc); + } + uint8_t opcode = GB_read_memory(gb, pc); + opcodes[opcode](gb, opcode, &pc); + } +} From 34e68c589fd602333be43b94c06aa641052ab39d Mon Sep 17 00:00:00 2001 From: nattthebear Date: Sun, 16 Jul 2017 14:53:03 -0400 Subject: [PATCH 21/93] Sameboy progress --- BizHawk.Client.Common/RomLoader.cs | 3 +- .../BizHawk.Emulation.Cores.csproj | 4 + .../Consoles/Nintendo/Gameboy/LibSameboy.cs | 16 + .../Consoles/Nintendo/Gameboy/Sameboy.cs | 88 + .../Properties/Resources.Designer.cs | 20 + .../Properties/Resources.resx | 6 + .../Resources/cgb_boot.bin.gz | Bin 0 -> 1682 bytes .../Resources/dmg_boot.bin.gz | Bin 0 -> 215 bytes waterbox/emulibc/emulibc.h | 4 + waterbox/sameboy/.vscode/settings.json | 6 + waterbox/sameboy/Makefile | 2 +- waterbox/sameboy/bizhawk.cpp | 118 ++ waterbox/sameboy/debugger.c | 1850 ----------------- waterbox/sameboy/debugger.h | 32 - waterbox/sameboy/gb.c | 4 +- waterbox/sameboy/gb.h | 12 - waterbox/sameboy/memory.c | 6 - waterbox/sameboy/timing.c | 2 - waterbox/sameboy/z80_cpu.c | 6 - waterbox/sameboy/z80_disassembler.c | 788 ------- 20 files changed, 266 insertions(+), 2701 deletions(-) create mode 100644 BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/LibSameboy.cs create mode 100644 BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/Sameboy.cs create mode 100644 BizHawk.Emulation.Cores/Resources/cgb_boot.bin.gz create mode 100644 BizHawk.Emulation.Cores/Resources/dmg_boot.bin.gz create mode 100644 waterbox/sameboy/.vscode/settings.json create mode 100644 waterbox/sameboy/bizhawk.cpp delete mode 100644 waterbox/sameboy/debugger.c delete mode 100644 waterbox/sameboy/debugger.h delete mode 100644 waterbox/sameboy/z80_disassembler.c diff --git a/BizHawk.Client.Common/RomLoader.cs b/BizHawk.Client.Common/RomLoader.cs index 9a9e0338ab..4af0355a29 100644 --- a/BizHawk.Client.Common/RomLoader.cs +++ b/BizHawk.Client.Common/RomLoader.cs @@ -921,7 +921,8 @@ namespace BizHawk.Client.Common if (!Global.Config.GB_AsSGB) { //core = CoreInventory.Instance["GB", "Pizza Boy"]; - core = CoreInventory.Instance["GB", "Gambatte"]; + //core = CoreInventory.Instance["GB", "Gambatte"]; + core = CoreInventory.Instance["GB", "SameBoy"]; } else { diff --git a/BizHawk.Emulation.Cores/BizHawk.Emulation.Cores.csproj b/BizHawk.Emulation.Cores/BizHawk.Emulation.Cores.csproj index 07fb3f1ede..f56e83a6ab 100644 --- a/BizHawk.Emulation.Cores/BizHawk.Emulation.Cores.csproj +++ b/BizHawk.Emulation.Cores/BizHawk.Emulation.Cores.csproj @@ -538,7 +538,9 @@ + + @@ -1309,6 +1311,8 @@ + + diff --git a/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/LibSameboy.cs b/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/LibSameboy.cs new file mode 100644 index 0000000000..5c13e48d23 --- /dev/null +++ b/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/LibSameboy.cs @@ -0,0 +1,16 @@ +using BizHawk.Common.BizInvoke; +using BizHawk.Emulation.Cores.Waterbox; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace BizHawk.Emulation.Cores.Consoles.Nintendo.Gameboy +{ + public abstract class LibSameboy : LibWaterboxCore + { + [BizImport(CC)] + public abstract bool Init(bool cgb); + } +} diff --git a/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/Sameboy.cs b/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/Sameboy.cs new file mode 100644 index 0000000000..453aaf65a0 --- /dev/null +++ b/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/Sameboy.cs @@ -0,0 +1,88 @@ +using BizHawk.Common; +using BizHawk.Emulation.Common; +using BizHawk.Emulation.Cores.Properties; +using BizHawk.Emulation.Cores.Waterbox; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace BizHawk.Emulation.Cores.Consoles.Nintendo.Gameboy +{ + [Core("SameBoy", "LIJI32", true, false, "efc11783c7fb6da66e1dd084e41ba6a85c0bd17e", + "https://sameboy.github.io/", false)] + public class Sameboy : WaterboxCore, IGameboyCommon + { + /// + /// the nominal length of one frame + /// + private const int TICKSPERFRAME = 35112; + + /// + /// number of ticks per second (GB, CGB) + /// + private const int TICKSPERSECOND = 2097152; + + /// + /// number of ticks per second (SGB) + /// + private const int TICKSPERSECOND_SGB = 2147727; + + private LibSameboy _core; + private bool _cgb; + + [CoreConstructor("GB")] + public Sameboy(CoreComm comm, byte[] rom) + : base(comm, new Configuration + { + DefaultWidth = 160, + DefaultHeight = 144, + MaxWidth = 256, + MaxHeight = 224, + MaxSamples = 1024, + DefaultFpsNumerator = TICKSPERSECOND, + DefaultFpsDenominator = TICKSPERFRAME, + SystemId = "GB" + }) + { + _core = PreInit(new PeRunnerOptions + { + Filename = "sameboy.wbx", + SbrkHeapSizeKB = 128, + InvisibleHeapSizeKB = 16 * 1024, + SealedHeapSizeKB = 5 * 1024, + PlainHeapSizeKB = 4096, + MmapHeapSizeKB = 34 * 1024 + }); + + _cgb = (rom[0x143] & 0xc0) == 0xc0; + Console.WriteLine("Automaticly detected CGB to " + _cgb); + var bios = Util.DecompressGzipFile(new MemoryStream( + _cgb ? Resources.SameboyCgbBoot : Resources.SameboyDmgBoot)); + + _exe.AddReadonlyFile(rom, "game.rom"); + _exe.AddReadonlyFile(bios, "boot.rom"); + + if (!_core.Init(_cgb)) + { + throw new InvalidOperationException("Core rejected the rom!"); + } + + _exe.RemoveReadonlyFile("game.rom"); + _exe.RemoveReadonlyFile("boot.rom"); + + PostInit(); + } + + protected override LibWaterboxCore.FrameInfo FrameAdvancePrep(IController controller, bool render, bool rendersound) + { + return new LibSameboy.FrameInfo + { + }; + } + + public bool IsCGBMode() => _cgb; + } +} diff --git a/BizHawk.Emulation.Cores/Properties/Resources.Designer.cs b/BizHawk.Emulation.Cores/Properties/Resources.Designer.cs index 59d6602caf..5a3bbcce9a 100644 --- a/BizHawk.Emulation.Cores/Properties/Resources.Designer.cs +++ b/BizHawk.Emulation.Cores/Properties/Resources.Designer.cs @@ -60,6 +60,26 @@ namespace BizHawk.Emulation.Cores.Properties { } } + /// + /// Looks up a localized resource of type System.Byte[]. + /// + internal static byte[] SameboyCgbBoot { + get { + object obj = ResourceManager.GetObject("SameboyCgbBoot", resourceCulture); + return ((byte[])(obj)); + } + } + + /// + /// Looks up a localized resource of type System.Byte[]. + /// + internal static byte[] SameboyDmgBoot { + get { + object obj = ResourceManager.GetObject("SameboyDmgBoot", resourceCulture); + return ((byte[])(obj)); + } + } + /// /// Looks up a localized resource of type System.Byte[]. /// diff --git a/BizHawk.Emulation.Cores/Properties/Resources.resx b/BizHawk.Emulation.Cores/Properties/Resources.resx index 1378c9e6e9..bdb07b9a9f 100644 --- a/BizHawk.Emulation.Cores/Properties/Resources.resx +++ b/BizHawk.Emulation.Cores/Properties/Resources.resx @@ -118,6 +118,12 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + ..\Resources\cgb_boot.bin.gz;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + ..\Resources\dmg_boot.bin.gz;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + ..\Resources\sgb-cart-present.spc.gz;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 diff --git a/BizHawk.Emulation.Cores/Resources/cgb_boot.bin.gz b/BizHawk.Emulation.Cores/Resources/cgb_boot.bin.gz new file mode 100644 index 0000000000000000000000000000000000000000..ab0eb54bfdbeeb29f773031bd817112cd4bd807d GIT binary patch literal 1682 zcmV;D25tEtiwFqP+h$n;0ApujUt(`>bS`3PZUE(0_Y2cN6uvZVT1V5=8LKvz)KTl+ zE2i#^TU6W%?g@&kHW5Ju#l3NZI1m*@R9tZzN}MPT)N?P?I;wRgzSQjx{sVs8-Fxre zy^nj3BQI4gd&kp;x`;HhA5-Q$EF!YlbvqnLtX3RqP!sCsp?2 zPs(S~BIu?>P7Ad#D={z%PI*xSzc$x13PsxQ_{JAp>J~MP)k9LGpfmkA13@fv(p<f1s*MmhE)+Zu; zM`cM06?Dc93E;;sVY5iXFfw;B$^z2RyvZ;X&Gw8k-R!|I9!ERsXkpOImkjy_(gFSN zm{p|Kg&VKsISU)~>TW1wO7<99tmfuITgNY1QDbyrds&r=+Jq9@-TuR;*ksR54buRGCmLTuzcaF~%bni^ZZY4pt8;TdGJg2Inu8uWW&` zyihGzi7AdMmn(-*L8)kgl8u`+Z`7z$<7RD|wZWY#cJ0)t6K>V6QLDDCnl!_mFn&CL z{`__8*6F(5vSmxi^y<~C(P*?^zkcV>pVt~T#Drju<1rk3OfcbQahlc;<2o46$9UcH z`>a_U#xQt75YGdLZ~o5t>vpcwck0^ChO_XHt7yzsJaPHXmKy1R_mNpUIgB_= zc)}x|;LQXg(HWSep~Jyf!Q^o|oz7;n1p5%;Z1qUB^FX_H;H1Vo3#Z(+T6I+GW(e8p z%i_r8NTKoT5{_KlsdYI=+H_?q=clja-Y0>0$s98&Hyno~Vjg4hQc>{u=$S7;sRtW^4D4Oq%$SK2Crzp!pYZv`!2b_9$vFzz56E&*xgHf2CuRaFGA0AMCm0F+9wtXfSsC=Y99T3$1p4U%qENnzc)xhWhN1zb%x>+B5<|BUm!C;5+E_R5b?Y^5ocDFG8 zWQh85mQGrMs862o&}&gqI>M)?z7s}A{Ac(_PD3dYVqDHQ{|HkUXACpzHH-V8!@&Bn z36)YYZSr2y_G3eR6Q-4*k+T%afY1?UBX3GQamx2lZQ=N%dBv&j_6*9C8?*0)|aN_01N|Fc0ZEBGNB{`{0A3e5XaE2J literal 0 HcmV?d00001 diff --git a/BizHawk.Emulation.Cores/Resources/dmg_boot.bin.gz b/BizHawk.Emulation.Cores/Resources/dmg_boot.bin.gz new file mode 100644 index 0000000000000000000000000000000000000000..85f1e8276a20c915a780bf8d228032451b736ab4 GIT binary patch literal 215 zcmV;|04V<-iwFqP+h$n;0Ay`vUt(`>bS`3PZU8g<_g|5rLFsgk#&5fZ2Wk%l?LI#c zdZ21o{y@d<&jWWs7Dh#Z1}XQmO$Z{O;gjGR20jicVI^f=g`akkuLNc)>d)lk zvDM%(0t)EyOMJDP_`rcp_v}0dyXLb?8QAzitb-udG$2cH1LM<=ioT4D!VH2p7!Lnq zuw&t4IIZyYwBX0ng0>1@E0vU$luv$e`8Pq~*U7Wf8CZeT17W-N2O=kJoOUkVxzx#q RfokAE002P!A@=|Q005=QWzzrv literal 0 HcmV?d00001 diff --git a/waterbox/emulibc/emulibc.h b/waterbox/emulibc/emulibc.h index da0eccc7c8..29d0ff7baa 100644 --- a/waterbox/emulibc/emulibc.h +++ b/waterbox/emulibc/emulibc.h @@ -10,7 +10,11 @@ extern "C" { // mark an entry point or callback pointer #define ECL_ENTRY // mark a visible symbol +#ifdef __cplusplus +#define ECL_EXPORT extern "C" __attribute__((visibility("default"))) +#else #define ECL_EXPORT __attribute__((visibility("default"))) +#endif // allocate memory from the "sealed" pool. this memory can never be freed, // and can only be allocated or written to during the init phase. after that, the host diff --git a/waterbox/sameboy/.vscode/settings.json b/waterbox/sameboy/.vscode/settings.json new file mode 100644 index 0000000000..a5401e1c1f --- /dev/null +++ b/waterbox/sameboy/.vscode/settings.json @@ -0,0 +1,6 @@ +// Place your settings in this file to overwrite default and user settings. +{ + "editor.tabSize": 4, + "editor.insertSpaces": false, + "editor.detectIndentation": false +} \ No newline at end of file diff --git a/waterbox/sameboy/Makefile b/waterbox/sameboy/Makefile index 0fdbe63b73..f3824c30ee 100644 --- a/waterbox/sameboy/Makefile +++ b/waterbox/sameboy/Makefile @@ -11,7 +11,7 @@ CCFLAGS:=$(FLAGS) -Ilib \ -std=gnu99 \ -DLSB_FIRST -D_GNU_SOURCE -DGB_INTERNAL -CPPFLAGS:=$(FLAGS) -DSPC_NO_COPY_STATE_FUNCS +CPPFLAGS:=$(FLAGS) -DSPC_NO_COPY_STATE_FUNCS -std=c++0x TARGET = sameboy.wbx diff --git a/waterbox/sameboy/bizhawk.cpp b/waterbox/sameboy/bizhawk.cpp new file mode 100644 index 0000000000..81b31201d0 --- /dev/null +++ b/waterbox/sameboy/bizhawk.cpp @@ -0,0 +1,118 @@ +#include +#include "../emulibc/emulibc.h" +#include "../emulibc/waterboxcore.h" + +#define _Static_assert static_assert + +extern "C" { +#include "gb.h" +#include "joypad.h" +#include "apu.h" +} + +static GB_gameboy_t GB; + +static void VBlankCallback(GB_gameboy_t *gb) +{ + +} + +static void LogCallback(GB_gameboy_t *gb, const char *string, GB_log_attributes attributes) +{ + fputs(string, stdout); +} + +static uint32_t RgbEncodeCallback(GB_gameboy_t *gb, uint8_t r, uint8_t g, uint8_t b) +{ + return b | g << 8 | r << 16 | 0xff000000; +} + +static void InfraredCallback(GB_gameboy_t *gb, bool on, long cycles_since_last_update) +{ + +} + +static void RumbleCallback(GB_gameboy_t *gb, bool rumble_on) +{ + +} + +static void SerialStartCallback(GB_gameboy_t *gb, uint8_t byte_to_send) +{ + +} + +static uint8_t SerialEndCallback(GB_gameboy_t *gb) +{ + return 0; +} + +ECL_EXPORT bool Init(bool cgb) +{ + if (cgb) + GB_init_cgb(&GB); + else + GB_init(&GB); + if (GB_load_boot_rom(&GB, "boot.rom") != 0) + return false; + + if (GB_load_rom(&GB, "game.rom") != 0) + return false; + + GB_set_vblank_callback(&GB, VBlankCallback); + GB_set_log_callback(&GB, LogCallback); + GB_set_rgb_encode_callback(&GB, RgbEncodeCallback); + GB_set_infrared_callback(&GB, InfraredCallback); + GB_set_rumble_callback(&GB, RumbleCallback); + + return true; +} + +struct MyFrameInfo : public FrameInfo +{ + +}; + +ECL_EXPORT void FrameAdvance(MyFrameInfo &f) +{ + GB_set_pixels_output(&GB, f.VideoBuffer); + // void GB_set_key_state(GB_gameboy_t *gb, GB_key_t index, bool pressed); + GB_run_frame(&GB); + f.Samples = 735; + f.Width = 160; + f.Height = 144; +} + +static void SetMemoryArea(MemoryArea *m, GB_direct_access_t access, const char* name, int32_t flags) +{ + size_t size; + m->Name = name; + m->Data = GB_get_direct_access(&GB, access, &size, nullptr); + m->Size = size; + m->Flags = flags; +} + +ECL_EXPORT void GetMemoryAreas(MemoryArea *m) +{ + // TODO: "System Bus" + SetMemoryArea(m + 0, GB_DIRECT_ACCESS_RAM, "WRAM", MEMORYAREA_FLAGS_WORDSIZE1 | MEMORYAREA_FLAGS_WRITABLE | MEMORYAREA_FLAGS_PRIMARY); + SetMemoryArea(m + 1, GB_DIRECT_ACCESS_ROM, "ROM", MEMORYAREA_FLAGS_WORDSIZE1); + SetMemoryArea(m + 2, GB_DIRECT_ACCESS_VRAM, "VRAM", MEMORYAREA_FLAGS_WORDSIZE1 | MEMORYAREA_FLAGS_WRITABLE); + SetMemoryArea(m + 3, GB_DIRECT_ACCESS_CART_RAM, "CartRAM", MEMORYAREA_FLAGS_WORDSIZE1 | MEMORYAREA_FLAGS_WRITABLE); + SetMemoryArea(m + 4, GB_DIRECT_ACCESS_OAM, "OAM", MEMORYAREA_FLAGS_WORDSIZE1 | MEMORYAREA_FLAGS_WRITABLE); + SetMemoryArea(m + 5, GB_DIRECT_ACCESS_HRAM, "HRAM", MEMORYAREA_FLAGS_WORDSIZE1 | MEMORYAREA_FLAGS_WRITABLE); + SetMemoryArea(m + 6, GB_DIRECT_ACCESS_IO, "IO", MEMORYAREA_FLAGS_WORDSIZE1); + SetMemoryArea(m + 7, GB_DIRECT_ACCESS_BOOTROM, "BOOTROM", MEMORYAREA_FLAGS_WORDSIZE1); + SetMemoryArea(m + 8, GB_DIRECT_ACCESS_BGP, "BGP", MEMORYAREA_FLAGS_WORDSIZE1 | MEMORYAREA_FLAGS_WRITABLE); + SetMemoryArea(m + 8, GB_DIRECT_ACCESS_OBP, "OBP", MEMORYAREA_FLAGS_WORDSIZE1 | MEMORYAREA_FLAGS_WRITABLE); +} + +ECL_EXPORT void SetInputCallback(void (*callback)()) +{ + // TODO +} + +int main() +{ + return 0; +} diff --git a/waterbox/sameboy/debugger.c b/waterbox/sameboy/debugger.c deleted file mode 100644 index 7fc7b2a9a6..0000000000 --- a/waterbox/sameboy/debugger.c +++ /dev/null @@ -1,1850 +0,0 @@ -#include -#include -#include -#include "gb.h" - -typedef struct { - bool has_bank; - uint16_t bank:9; - uint16_t value; -} value_t; - -typedef struct { - enum { - LVALUE_MEMORY, - LVALUE_REG16, - LVALUE_REG_H, - LVALUE_REG_L, - } kind; - union { - uint16_t *register_address; - value_t memory_address; - }; -} lvalue_t; - -#define VALUE_16(x) ((value_t){false, 0, (x)}) - -struct GB_breakpoint_s { - union { - struct { - uint16_t addr; - uint16_t bank; /* -1 = any bank*/ - }; - uint32_t key; /* For sorting and comparing */ - }; - char *condition; -}; - -#define BP_KEY(x) (((struct GB_breakpoint_s){.addr = ((x).value), .bank = (x).has_bank? (x).bank : -1 }).key) - -#define GB_WATCHPOINT_R (1) -#define GB_WATCHPOINT_W (2) - -struct GB_watchpoint_s { - union { - struct { - uint16_t addr; - uint16_t bank; /* -1 = any bank*/ - }; - uint32_t key; /* For sorting and comparing */ - }; - char *condition; - uint8_t flags; -}; - -#define WP_KEY(x) (((struct GB_watchpoint_s){.addr = ((x).value), .bank = (x).has_bank? (x).bank : -1 }).key) - -static uint16_t bank_for_addr(GB_gameboy_t *gb, uint16_t addr) -{ - if (addr < 0x4000) { - return gb->mbc_rom0_bank; - } - - if (addr < 0x8000) { - return gb->mbc_rom_bank; - } - - if (addr < 0xD000) { - return 0; - } - - if (addr < 0xE000) { - return gb->cgb_ram_bank; - } - - return 0; -} - -typedef struct { - uint16_t rom0_bank; - uint16_t rom_bank; - uint8_t mbc_ram_bank; - bool mbc_ram_enable; - uint8_t ram_bank; - uint8_t vram_bank; -} banking_state_t; - -static inline void save_banking_state(GB_gameboy_t *gb, banking_state_t *state) -{ - state->rom0_bank = gb->mbc_rom0_bank; - state->rom_bank = gb->mbc_rom_bank; - state->mbc_ram_bank = gb->mbc_ram_bank; - state->mbc_ram_enable = gb->mbc_ram_enable; - state->ram_bank = gb->cgb_ram_bank; - state->vram_bank = gb->cgb_vram_bank; -} - -static inline void restore_banking_state(GB_gameboy_t *gb, banking_state_t *state) -{ - - gb->mbc_rom0_bank = state->rom0_bank; - gb->mbc_rom_bank = state->rom_bank; - gb->mbc_ram_bank = state->mbc_ram_bank; - gb->mbc_ram_enable = state->mbc_ram_enable; - gb->cgb_ram_bank = state->ram_bank; - gb->cgb_vram_bank = state->vram_bank; -} - -static inline void switch_banking_state(GB_gameboy_t *gb, uint16_t bank) -{ - gb->mbc_rom0_bank = bank; - gb->mbc_rom_bank = bank; - gb->mbc_ram_bank = bank; - gb->mbc_ram_enable = true; - if (gb->is_cgb) { - gb->cgb_ram_bank = bank & 7; - gb->cgb_vram_bank = bank & 1; - } -} - -static const char *value_to_string(GB_gameboy_t *gb, uint16_t value, bool prefer_name) -{ - static __thread char output[256]; - const GB_bank_symbol_t *symbol = GB_debugger_find_symbol(gb, value); - - if (symbol && (value - symbol->addr > 0x1000 || symbol->addr == 0) ) { - symbol = NULL; - } - - /* Avoid overflow */ - if (symbol && strlen(symbol->name) > 240) { - symbol = NULL; - } - - if (!symbol) { - sprintf(output, "$%04x", value); - } - - else if (symbol->addr == value) { - if (prefer_name) { - sprintf(output, "%s ($%04x)", symbol->name, value); - } - else { - sprintf(output, "$%04x (%s)", value, symbol->name); - } - } - - else { - if (prefer_name) { - sprintf(output, "%s+$%03x ($%04x)", symbol->name, value - symbol->addr, value); - } - else { - sprintf(output, "$%04x (%s+$%03x)", value, symbol->name, value - symbol->addr); - } - } - return output; -} - -static const char *debugger_value_to_string(GB_gameboy_t *gb, value_t value, bool prefer_name) -{ - if (!value.has_bank) return value_to_string(gb, value.value, prefer_name); - - static __thread char output[256]; - const GB_bank_symbol_t *symbol = GB_map_find_symbol(gb->bank_symbols[value.bank], value.value); - - if (symbol && (value.value - symbol->addr > 0x1000 || symbol->addr == 0) ) { - symbol = NULL; - } - - /* Avoid overflow */ - if (symbol && strlen(symbol->name) > 240) { - symbol = NULL; - } - - if (!symbol) { - sprintf(output, "$%02x:$%04x", value.bank, value.value); - } - - else if (symbol->addr == value.value) { - if (prefer_name) { - sprintf(output, "%s ($%02x:$%04x)", symbol->name, value.bank, value.value); - } - else { - sprintf(output, "$%02x:$%04x (%s)", value.bank, value.value, symbol->name); - } - } - - else { - if (prefer_name) { - sprintf(output, "%s+$%03x ($%02x:$%04x)", symbol->name, value.value - symbol->addr, value.bank, value.value); - } - else { - sprintf(output, "$%02x:$%04x (%s+$%03x)", value.bank, value.value, symbol->name, value.value - symbol->addr); - } - } - return output; -} - -static value_t read_lvalue(GB_gameboy_t *gb, lvalue_t lvalue) -{ - /* Not used until we add support for operators like += */ - switch (lvalue.kind) { - case LVALUE_MEMORY: - if (lvalue.memory_address.has_bank) { - banking_state_t state; - save_banking_state(gb, &state); - switch_banking_state(gb, lvalue.memory_address.bank); - value_t r = VALUE_16(GB_read_memory(gb, lvalue.memory_address.value)); - restore_banking_state(gb, &state); - return r; - } - return VALUE_16(GB_read_memory(gb, lvalue.memory_address.value)); - - case LVALUE_REG16: - return VALUE_16(*lvalue.register_address); - - case LVALUE_REG_L: - return VALUE_16(*lvalue.register_address & 0x00FF); - - case LVALUE_REG_H: - return VALUE_16(*lvalue.register_address >> 8); - } -} - -static void write_lvalue(GB_gameboy_t *gb, lvalue_t lvalue, uint16_t value) -{ - switch (lvalue.kind) { - case LVALUE_MEMORY: - if (lvalue.memory_address.has_bank) { - banking_state_t state; - save_banking_state(gb, &state); - switch_banking_state(gb, lvalue.memory_address.bank); - GB_write_memory(gb, lvalue.memory_address.value, value); - restore_banking_state(gb, &state); - return; - } - GB_write_memory(gb, lvalue.memory_address.value, value); - return; - - case LVALUE_REG16: - *lvalue.register_address = value; - return; - - case LVALUE_REG_L: - *lvalue.register_address &= 0xFF00; - *lvalue.register_address |= value & 0xFF; - return; - - case LVALUE_REG_H: - *lvalue.register_address &= 0x00FF; - *lvalue.register_address |= value << 8; - return; - } -} - -/* 16 bit value 16 bit value = 16 bit value - 25 bit address 16 bit value = 25 bit address - 16 bit value 25 bit address = 25 bit address - 25 bit address 25 bit address = 16 bit value (since adding pointers, for examples, makes no sense) - - Boolean operators always return a 16-bit value - */ -#define FIX_BANK(x) ((value_t){a.has_bank ^ b.has_bank, a.has_bank? a.bank : b.bank, (x)}) - -static value_t add(value_t a, value_t b) {return FIX_BANK(a.value + b.value);} -static value_t sub(value_t a, value_t b) {return FIX_BANK(a.value - b.value);} -static value_t mul(value_t a, value_t b) {return FIX_BANK(a.value * b.value);} -static value_t _div(value_t a, value_t b) { - if (b.value == 0) { - return FIX_BANK(0); - } - return FIX_BANK(a.value / b.value); -}; -static value_t mod(value_t a, value_t b) { - if (b.value == 0) { - return FIX_BANK(0); - } - return FIX_BANK(a.value % b.value); -}; -static value_t and(value_t a, value_t b) {return FIX_BANK(a.value & b.value);} -static value_t or(value_t a, value_t b) {return FIX_BANK(a.value | b.value);} -static value_t xor(value_t a, value_t b) {return FIX_BANK(a.value ^ b.value);} -static value_t shleft(value_t a, value_t b) {return FIX_BANK(a.value << b.value);} -static value_t shright(value_t a, value_t b) {return FIX_BANK(a.value >> b.value);} -static value_t assign(GB_gameboy_t *gb, lvalue_t a, uint16_t b) -{ - write_lvalue(gb, a, b); - return read_lvalue(gb, a); -} - -static value_t bool_and(value_t a, value_t b) {return VALUE_16(a.value && b.value);} -static value_t bool_or(value_t a, value_t b) {return VALUE_16(a.value || b.value);} -static value_t equals(value_t a, value_t b) {return VALUE_16(a.value == b.value);} -static value_t different(value_t a, value_t b) {return VALUE_16(a.value != b.value);} -static value_t lower(value_t a, value_t b) {return VALUE_16(a.value < b.value);} -static value_t greater(value_t a, value_t b) {return VALUE_16(a.value > b.value);} -static value_t lower_equals(value_t a, value_t b) {return VALUE_16(a.value <= b.value);} -static value_t greater_equals(value_t a, value_t b) {return VALUE_16(a.value >= b.value);} -static value_t bank(value_t a, value_t b) {return (value_t) {true, a.value, b.value};} - - -static struct { - const char *string; - char priority; - value_t (*operator)(value_t, value_t); - value_t (*lvalue_operator)(GB_gameboy_t *, lvalue_t, uint16_t); -} operators[] = -{ - // Yes. This is not C-like. But it makes much more sense. - // Deal with it. - {"+", 0, add}, - {"-", 0, sub}, - {"||", 0, bool_or}, - {"|", 0, or}, - {"*", 1, mul}, - {"/", 1, _div}, - {"%", 1, mod}, - {"&&", 1, bool_and}, - {"&", 1, and}, - {"^", 1, xor}, - {"<<", 2, shleft}, - {"<=", 3, lower_equals}, - {"<", 3, lower}, - {">>", 2, shright}, - {">=", 3, greater_equals}, - {">", 3, greater}, - {"==", 3, equals}, - {"=", -1, NULL, assign}, - {"!=", 3, different}, - {":", 4, bank}, -}; - -value_t debugger_evaluate(GB_gameboy_t *gb, const char *string, - size_t length, bool *error, - uint16_t *watchpoint_address, uint8_t *watchpoint_new_value); - -static lvalue_t debugger_evaluate_lvalue(GB_gameboy_t *gb, const char *string, - size_t length, bool *error, - uint16_t *watchpoint_address, uint8_t *watchpoint_new_value) -{ - *error = false; - // Strip whitespace - while (length && (string[0] == ' ' || string[0] == '\n' || string[0] == '\r' || string[0] == '\t')) { - string++; - length--; - } - while (length && (string[length-1] == ' ' || string[length-1] == '\n' || string[length-1] == '\r' || string[length-1] == '\t')) { - length--; - } - if (length == 0) - { - GB_log(gb, "Expected expression.\n"); - *error = true; - return (lvalue_t){0,}; - } - if (string[0] == '(' && string[length - 1] == ')') { - // Attempt to strip parentheses - signed int depth = 0; - for (int i = 0; i < length; i++) { - if (string[i] == '(') depth++; - if (depth == 0) { - // First and last are not matching - depth = 1; - break; - } - if (string[i] == ')') depth--; - } - if (depth == 0) return debugger_evaluate_lvalue(gb, string + 1, length - 2, error, watchpoint_address, watchpoint_new_value); - } - else if (string[0] == '[' && string[length - 1] == ']') { - // Attempt to strip square parentheses (memory dereference) - signed int depth = 0; - for (int i = 0; i < length; i++) { - if (string[i] == '[') depth++; - if (depth == 0) { - // First and last are not matching - depth = 1; - break; - } - if (string[i] == ']') depth--; - } - if (depth == 0) { - return (lvalue_t){LVALUE_MEMORY, .memory_address = debugger_evaluate(gb, string + 1, length - 2, error, watchpoint_address, watchpoint_new_value)}; - } - } - - // Registers - if (string[0] != '$' && (string[0] < '0' || string[0] > '9')) { - if (length == 1) { - switch (string[0]) { - case 'a': return (lvalue_t){LVALUE_REG_H, .register_address = &gb->registers[GB_REGISTER_AF]}; - case 'f': return (lvalue_t){LVALUE_REG_L, .register_address = &gb->registers[GB_REGISTER_AF]}; - case 'b': return (lvalue_t){LVALUE_REG_H, .register_address = &gb->registers[GB_REGISTER_BC]}; - case 'c': return (lvalue_t){LVALUE_REG_L, .register_address = &gb->registers[GB_REGISTER_BC]}; - case 'd': return (lvalue_t){LVALUE_REG_H, .register_address = &gb->registers[GB_REGISTER_DE]}; - case 'e': return (lvalue_t){LVALUE_REG_L, .register_address = &gb->registers[GB_REGISTER_DE]}; - case 'h': return (lvalue_t){LVALUE_REG_H, .register_address = &gb->registers[GB_REGISTER_HL]}; - case 'l': return (lvalue_t){LVALUE_REG_L, .register_address = &gb->registers[GB_REGISTER_HL]}; - } - } - else if (length == 2) { - switch (string[0]) { - case 'a': if (string[1] == 'f') return (lvalue_t){LVALUE_REG16, .register_address = &gb->registers[GB_REGISTER_AF]}; - case 'b': if (string[1] == 'c') return (lvalue_t){LVALUE_REG16, .register_address = &gb->registers[GB_REGISTER_BC]}; - case 'd': if (string[1] == 'e') return (lvalue_t){LVALUE_REG16, .register_address = &gb->registers[GB_REGISTER_DE]}; - case 'h': if (string[1] == 'l') return (lvalue_t){LVALUE_REG16, .register_address = &gb->registers[GB_REGISTER_HL]}; - case 's': if (string[1] == 'p') return (lvalue_t){LVALUE_REG16, .register_address = &gb->registers[GB_REGISTER_SP]}; - case 'p': if (string[1] == 'c') return (lvalue_t){LVALUE_REG16, .register_address = &gb->pc}; - } - } - GB_log(gb, "Unknown register: %.*s\n", (unsigned int) length, string); - *error = true; - return (lvalue_t){0,}; - } - - GB_log(gb, "Expression is not an lvalue: %.*s\n", (unsigned int) length, string); - *error = true; - return (lvalue_t){0,}; -} - -#define ERROR ((value_t){0,}) -value_t debugger_evaluate(GB_gameboy_t *gb, const char *string, - size_t length, bool *error, - uint16_t *watchpoint_address, uint8_t *watchpoint_new_value) -{ - /* Disable watchpoints while evaulating expressions */ - uint16_t n_watchpoints = gb->n_watchpoints; - gb->n_watchpoints = 0; - - value_t ret = ERROR; - - *error = false; - // Strip whitespace - while (length && (string[0] == ' ' || string[0] == '\n' || string[0] == '\r' || string[0] == '\t')) { - string++; - length--; - } - while (length && (string[length-1] == ' ' || string[length-1] == '\n' || string[length-1] == '\r' || string[length-1] == '\t')) { - length--; - } - if (length == 0) - { - GB_log(gb, "Expected expression.\n"); - *error = true; - goto exit; - } - if (string[0] == '(' && string[length - 1] == ')') { - // Attempt to strip parentheses - signed int depth = 0; - for (int i = 0; i < length; i++) { - if (string[i] == '(') depth++; - if (depth == 0) { - // First and last are not matching - depth = 1; - break; - } - if (string[i] == ')') depth--; - } - if (depth == 0) { - ret = debugger_evaluate(gb, string + 1, length - 2, error, watchpoint_address, watchpoint_new_value); - goto exit; - } - } - else if (string[0] == '[' && string[length - 1] == ']') { - // Attempt to strip square parentheses (memory dereference) - signed int depth = 0; - for (int i = 0; i < length; i++) { - if (string[i] == '[') depth++; - if (depth == 0) { - // First and last are not matching - depth = 1; - break; - } - if (string[i] == ']') depth--; - } - - if (depth == 0) { - value_t addr = debugger_evaluate(gb, string + 1, length - 2, error, watchpoint_address, watchpoint_new_value); - banking_state_t state; - if (addr.bank) { - save_banking_state(gb, &state); - switch_banking_state(gb, addr.bank); - } - ret = VALUE_16(GB_read_memory(gb, addr.value)); - if (addr.bank) { - restore_banking_state(gb, &state); - } - goto exit; - } - - } - // Search for lowest priority operator - signed int depth = 0; - unsigned int operator_index = -1; - unsigned int operator_pos = 0; - for (int i = 0; i < length; i++) { - if (string[i] == '(') depth++; - else if (string[i] == ')') depth--; - else if (string[i] == '[') depth++; - else if (string[i] == ']') depth--; - else if (depth == 0) { - for (int j = 0; j < sizeof(operators) / sizeof(operators[0]); j++) { - if (strlen(operators[j].string) > length - i) continue; // Operator too big. - // Priority higher than what we already have. - if (operator_index != -1 && operators[operator_index].priority < operators[j].priority) continue; - unsigned long operator_length = strlen(operators[j].string); - if (memcmp(string + i, operators[j].string, operator_length) == 0) { - // Found an operator! - operator_pos = i; - operator_index = j; - /* for supporting = vs ==, etc*/ - i += operator_length - 1; - break; - } - } - } - } - if (operator_index != -1) { - unsigned int right_start = (unsigned int)(operator_pos + strlen(operators[operator_index].string)); - value_t right = debugger_evaluate(gb, string + right_start, length - right_start, error, watchpoint_address, watchpoint_new_value); - if (*error) goto exit; - if (operators[operator_index].lvalue_operator) { - lvalue_t left = debugger_evaluate_lvalue(gb, string, operator_pos, error, watchpoint_address, watchpoint_new_value); - if (*error) goto exit; - ret = operators[operator_index].lvalue_operator(gb, left, right.value); - goto exit; - } - value_t left = debugger_evaluate(gb, string, operator_pos, error, watchpoint_address, watchpoint_new_value); - if (*error) goto exit; - ret = operators[operator_index].operator(left, right); - goto exit; - } - - // Not an expression - must be a register or a literal - - // Registers - if (string[0] != '$' && (string[0] < '0' || string[0] > '9')) { - if (length == 1) { - switch (string[0]) { - case 'a': ret = VALUE_16(gb->registers[GB_REGISTER_AF] >> 8); goto exit; - case 'f': ret = VALUE_16(gb->registers[GB_REGISTER_AF] & 0xFF); goto exit; - case 'b': ret = VALUE_16(gb->registers[GB_REGISTER_BC] >> 8); goto exit; - case 'c': ret = VALUE_16(gb->registers[GB_REGISTER_BC] & 0xFF); goto exit; - case 'd': ret = VALUE_16(gb->registers[GB_REGISTER_DE] >> 8); goto exit; - case 'e': ret = VALUE_16(gb->registers[GB_REGISTER_DE] & 0xFF); goto exit; - case 'h': ret = VALUE_16(gb->registers[GB_REGISTER_HL] >> 8); goto exit; - case 'l': ret = VALUE_16(gb->registers[GB_REGISTER_HL] & 0xFF); goto exit; - } - } - else if (length == 2) { - switch (string[0]) { - case 'a': if (string[1] == 'f') {ret = VALUE_16(gb->registers[GB_REGISTER_AF]); goto exit;} - case 'b': if (string[1] == 'c') {ret = VALUE_16(gb->registers[GB_REGISTER_BC]); goto exit;} - case 'd': if (string[1] == 'e') {ret = VALUE_16(gb->registers[GB_REGISTER_DE]); goto exit;} - case 'h': if (string[1] == 'l') {ret = VALUE_16(gb->registers[GB_REGISTER_HL]); goto exit;} - case 's': if (string[1] == 'p') {ret = VALUE_16(gb->registers[GB_REGISTER_SP]); goto exit;} - case 'p': if (string[1] == 'c') {ret = (value_t){true, bank_for_addr(gb, gb->pc), gb->pc}; goto exit;} - } - } - else if (length == 3) { - if (watchpoint_address && memcmp(string, "old", 3) == 0) { - ret = VALUE_16(GB_read_memory(gb, *watchpoint_address)); - goto exit; - } - - if (watchpoint_new_value && memcmp(string, "new", 3) == 0) { - ret = VALUE_16(*watchpoint_new_value); - goto exit; - } - - /* $new is identical to $old in read conditions */ - if (watchpoint_address && memcmp(string, "new", 3) == 0) { - ret = VALUE_16(GB_read_memory(gb, *watchpoint_address)); - goto exit; - } - } - - char symbol_name[length + 1]; - memcpy(symbol_name, string, length); - symbol_name[length] = 0; - const GB_symbol_t *symbol = GB_reversed_map_find_symbol(&gb->reversed_symbol_map, symbol_name); - if (symbol) { - ret = (value_t){true, symbol->bank, symbol->addr}; - goto exit; - } - - GB_log(gb, "Unknown register or symbol: %.*s\n", (unsigned int) length, string); - *error = true; - goto exit; - } - - char *end; - int base = 10; - if (string[0] == '$') { - string++; - base = 16; - length--; - } - uint16_t literal = (uint16_t) (strtol(string, &end, base)); - if (end != string + length) { - GB_log(gb, "Failed to parse: %.*s\n", (unsigned int) length, string); - *error = true; - goto exit; - } - ret = VALUE_16(literal); -exit: - gb->n_watchpoints = n_watchpoints; - return ret; -} - -struct debugger_command_s; -typedef bool debugger_command_imp_t(GB_gameboy_t *gb, char *arguments, char *modifiers, const struct debugger_command_s *command); - -typedef struct debugger_command_s { - const char *command; - uint8_t min_length; - debugger_command_imp_t *implementation; - const char *help_string; // Null if should not appear in help - const char *arguments_format; // For usage message - const char *modifiers_format; // For usage message -} debugger_command_t; - -static const char *lstrip(const char *str) -{ - while (*str == ' ' || *str == '\t') { - str++; - } - return str; -} - -#define STOPPED_ONLY \ -if (!gb->debug_stopped) { \ -GB_log(gb, "Program is running. \n"); \ -return false; \ -} - -#define NO_MODIFIERS \ -if (modifiers) { \ -print_usage(gb, command); \ -return true; \ -} - -static void print_usage(GB_gameboy_t *gb, const debugger_command_t *command) -{ - GB_log(gb, "Usage: %s", command->command); - - if (command->modifiers_format) { - GB_log(gb, "[/%s]", command->modifiers_format); - } - - if (command->arguments_format) { - GB_log(gb, " %s", command->arguments_format); - } - - GB_log(gb, "\n"); -} - -static bool cont(GB_gameboy_t *gb, char *arguments, char *modifiers, const debugger_command_t *command) -{ - NO_MODIFIERS - STOPPED_ONLY - - if (strlen(lstrip(arguments))) { - print_usage(gb, command); - return true; - } - - gb->debug_stopped = false; - return false; -} - -static bool next(GB_gameboy_t *gb, char *arguments, char *modifiers, const debugger_command_t *command) -{ - NO_MODIFIERS - STOPPED_ONLY - - if (strlen(lstrip(arguments))) { - print_usage(gb, command); - return true; - } - - gb->debug_stopped = false; - gb->debug_next_command = true; - gb->debug_call_depth = 0; - return false; -} - -static bool step(GB_gameboy_t *gb, char *arguments, char *modifiers, const debugger_command_t *command) -{ - NO_MODIFIERS - STOPPED_ONLY - - if (strlen(lstrip(arguments))) { - print_usage(gb, command); - return true; - } - - return false; -} - -static bool finish(GB_gameboy_t *gb, char *arguments, char *modifiers, const debugger_command_t *command) -{ - NO_MODIFIERS - STOPPED_ONLY - - if (strlen(lstrip(arguments))) { - print_usage(gb, command); - return true; - } - - gb->debug_stopped = false; - gb->debug_fin_command = true; - gb->debug_call_depth = 0; - return false; -} - -static bool stack_leak_detection(GB_gameboy_t *gb, char *arguments, char *modifiers, const debugger_command_t *command) -{ - NO_MODIFIERS - STOPPED_ONLY - - if (strlen(lstrip(arguments))) { - print_usage(gb, command); - return true; - } - - gb->debug_stopped = false; - gb->stack_leak_detection = true; - gb->debug_call_depth = 0; - return false; -} - -static bool registers(GB_gameboy_t *gb, char *arguments, char *modifiers, const debugger_command_t *command) -{ - NO_MODIFIERS - if (strlen(lstrip(arguments))) { - print_usage(gb, command); - return true; - } - - GB_log(gb, "AF = $%04x\n", gb->registers[GB_REGISTER_AF]); /* AF can't really be an address */ - GB_log(gb, "BC = %s\n", value_to_string(gb, gb->registers[GB_REGISTER_BC], false)); - GB_log(gb, "DE = %s\n", value_to_string(gb, gb->registers[GB_REGISTER_DE], false)); - GB_log(gb, "HL = %s\n", value_to_string(gb, gb->registers[GB_REGISTER_HL], false)); - GB_log(gb, "SP = %s\n", value_to_string(gb, gb->registers[GB_REGISTER_SP], false)); - GB_log(gb, "PC = %s\n", value_to_string(gb, gb->pc, false)); - return true; -} - -/* Find the index of the closest breakpoint equal or greater to addr */ -static uint16_t find_breakpoint(GB_gameboy_t *gb, value_t addr) -{ - if (!gb->breakpoints) { - return 0; - } - - uint32_t key = BP_KEY(addr); - - int min = 0; - int max = gb->n_breakpoints; - while (min < max) { - uint16_t pivot = (min + max) / 2; - if (gb->breakpoints[pivot].key == key) return pivot; - if (gb->breakpoints[pivot].key > key) { - max = pivot; - } - else { - min = pivot + 1; - } - } - return (uint16_t) min; -} - -static bool breakpoint(GB_gameboy_t *gb, char *arguments, char *modifiers, const debugger_command_t *command) -{ - NO_MODIFIERS - if (strlen(lstrip(arguments)) == 0) { - print_usage(gb, command); - return true; - } - - if (gb->n_breakpoints == (typeof(gb->n_breakpoints)) -1) { - GB_log(gb, "Too many breakpoints set\n"); - return true; - } - - char *condition = NULL; - if ((condition = strstr(arguments, " if "))) { - *condition = 0; - condition += strlen(" if "); - /* Verify condition is sane (Todo: This might have side effects!) */ - bool error; - debugger_evaluate(gb, condition, (unsigned int)strlen(condition), &error, NULL, NULL); - if (error) return true; - - } - - bool error; - value_t result = debugger_evaluate(gb, arguments, (unsigned int)strlen(arguments), &error, NULL, NULL); - uint32_t key = BP_KEY(result); - - if (error) return true; - - uint16_t index = find_breakpoint(gb, result); - if (index < gb->n_breakpoints && gb->breakpoints[index].key == key) { - GB_log(gb, "Breakpoint already set at %s\n", debugger_value_to_string(gb, result, true)); - if (!gb->breakpoints[index].condition && condition) { - GB_log(gb, "Added condition to breakpoint\n"); - gb->breakpoints[index].condition = strdup(condition); - } - else if (gb->breakpoints[index].condition && condition) { - GB_log(gb, "Replaced breakpoint condition\n"); - free(gb->breakpoints[index].condition); - gb->breakpoints[index].condition = strdup(condition); - } - else if (gb->breakpoints[index].condition && !condition) { - GB_log(gb, "Removed breakpoint condition\n"); - free(gb->breakpoints[index].condition); - gb->breakpoints[index].condition = NULL; - } - return true; - } - - gb->breakpoints = realloc(gb->breakpoints, (gb->n_breakpoints + 1) * sizeof(gb->breakpoints[0])); - memmove(&gb->breakpoints[index + 1], &gb->breakpoints[index], (gb->n_breakpoints - index) * sizeof(gb->breakpoints[0])); - gb->breakpoints[index].key = key; - - if (condition) { - gb->breakpoints[index].condition = strdup(condition); - } - else { - gb->breakpoints[index].condition = NULL; - } - gb->n_breakpoints++; - - GB_log(gb, "Breakpoint set at %s\n", debugger_value_to_string(gb, result, true)); - return true; -} - -static bool delete(GB_gameboy_t *gb, char *arguments, char *modifiers, const debugger_command_t *command) -{ - NO_MODIFIERS - if (strlen(lstrip(arguments)) == 0) { - for (unsigned i = gb->n_breakpoints; i--;) { - if (gb->breakpoints[i].condition) { - free(gb->breakpoints[i].condition); - } - } - free(gb->breakpoints); - gb->breakpoints = NULL; - gb->n_breakpoints = 0; - return true; - } - - bool error; - value_t result = debugger_evaluate(gb, arguments, (unsigned int)strlen(arguments), &error, NULL, NULL); - uint32_t key = BP_KEY(result); - - if (error) return true; - - uint16_t index = find_breakpoint(gb, result); - if (index >= gb->n_breakpoints || gb->breakpoints[index].key != key) { - GB_log(gb, "No breakpoint set at %s\n", debugger_value_to_string(gb, result, true)); - return true; - } - - if (gb->breakpoints[index].condition) { - free(gb->breakpoints[index].condition); - } - - memmove(&gb->breakpoints[index], &gb->breakpoints[index + 1], (gb->n_breakpoints - index - 1) * sizeof(gb->breakpoints[0])); - gb->n_breakpoints--; - gb->breakpoints = realloc(gb->breakpoints, gb->n_breakpoints * sizeof(gb->breakpoints[0])); - - GB_log(gb, "Breakpoint removed from %s\n", debugger_value_to_string(gb, result, true)); - return true; -} - -/* Find the index of the closest watchpoint equal or greater to addr */ -static uint16_t find_watchpoint(GB_gameboy_t *gb, value_t addr) -{ - if (!gb->watchpoints) { - return 0; - } - uint32_t key = WP_KEY(addr); - int min = 0; - int max = gb->n_watchpoints; - while (min < max) { - uint16_t pivot = (min + max) / 2; - if (gb->watchpoints[pivot].key == key) return pivot; - if (gb->watchpoints[pivot].key > key) { - max = pivot; - } - else { - min = pivot + 1; - } - } - return (uint16_t) min; -} - -static bool watch(GB_gameboy_t *gb, char *arguments, char *modifiers, const debugger_command_t *command) -{ - if (strlen(lstrip(arguments)) == 0) { -print_usage: - print_usage(gb, command); - return true; - } - - if (gb->n_watchpoints == (typeof(gb->n_watchpoints)) -1) { - GB_log(gb, "Too many watchpoints set\n"); - return true; - } - - if (!modifiers) { - modifiers = "w"; - } - - uint8_t flags = 0; - while (*modifiers) { - switch (*modifiers) { - case 'r': - flags |= GB_WATCHPOINT_R; - break; - case 'w': - flags |= GB_WATCHPOINT_W; - break; - default: - goto print_usage; - } - modifiers++; - } - - if (!flags) { - goto print_usage; - } - - char *condition = NULL; - if ((condition = strstr(arguments, " if "))) { - *condition = 0; - condition += strlen(" if "); - /* Verify condition is sane (Todo: This might have side effects!) */ - bool error; - /* To make $new and $old legal */ - uint16_t dummy = 0; - uint8_t dummy2 = 0; - debugger_evaluate(gb, condition, (unsigned int)strlen(condition), &error, &dummy, &dummy2); - if (error) return true; - - } - - bool error; - value_t result = debugger_evaluate(gb, arguments, (unsigned int)strlen(arguments), &error, NULL, NULL); - uint32_t key = WP_KEY(result); - - if (error) return true; - - uint16_t index = find_watchpoint(gb, result); - if (index < gb->n_watchpoints && gb->watchpoints[index].key == key) { - GB_log(gb, "Watchpoint already set at %s\n", debugger_value_to_string(gb, result, true)); - if (gb->watchpoints[index].flags != flags) { - GB_log(gb, "Modified watchpoint type\n"); - gb->watchpoints[index].flags = flags; - } - if (!gb->watchpoints[index].condition && condition) { - GB_log(gb, "Added condition to watchpoint\n"); - gb->watchpoints[index].condition = strdup(condition); - } - else if (gb->watchpoints[index].condition && condition) { - GB_log(gb, "Replaced watchpoint condition\n"); - free(gb->watchpoints[index].condition); - gb->watchpoints[index].condition = strdup(condition); - } - else if (gb->watchpoints[index].condition && !condition) { - GB_log(gb, "Removed watchpoint condition\n"); - free(gb->watchpoints[index].condition); - gb->watchpoints[index].condition = NULL; - } - return true; - } - - gb->watchpoints = realloc(gb->watchpoints, (gb->n_watchpoints + 1) * sizeof(gb->watchpoints[0])); - memmove(&gb->watchpoints[index + 1], &gb->watchpoints[index], (gb->n_watchpoints - index) * sizeof(gb->watchpoints[0])); - gb->watchpoints[index].key = key; - gb->watchpoints[index].flags = flags; - if (condition) { - gb->watchpoints[index].condition = strdup(condition); - } - else { - gb->watchpoints[index].condition = NULL; - } - gb->n_watchpoints++; - - GB_log(gb, "Watchpoint set at %s\n", debugger_value_to_string(gb, result, true)); - return true; -} - -static bool unwatch(GB_gameboy_t *gb, char *arguments, char *modifiers, const debugger_command_t *command) -{ - NO_MODIFIERS - if (strlen(lstrip(arguments)) == 0) { - for (unsigned i = gb->n_watchpoints; i--;) { - if (gb->watchpoints[i].condition) { - free(gb->watchpoints[i].condition); - } - } - free(gb->watchpoints); - gb->watchpoints = NULL; - gb->n_watchpoints = 0; - return true; - } - - bool error; - value_t result = debugger_evaluate(gb, arguments, (unsigned int)strlen(arguments), &error, NULL, NULL); - uint32_t key = WP_KEY(result); - - if (error) return true; - - uint16_t index = find_watchpoint(gb, result); - if (index >= gb->n_watchpoints || gb->watchpoints[index].key != key) { - GB_log(gb, "No watchpoint set at %s\n", debugger_value_to_string(gb, result, true)); - return true; - } - - if (gb->watchpoints[index].condition) { - free(gb->watchpoints[index].condition); - } - - memmove(&gb->watchpoints[index], &gb->watchpoints[index + 1], (gb->n_watchpoints - index - 1) * sizeof(gb->watchpoints[0])); - gb->n_watchpoints--; - gb->watchpoints = realloc(gb->watchpoints, gb->n_watchpoints* sizeof(gb->watchpoints[0])); - - GB_log(gb, "Watchpoint removed from %s\n", debugger_value_to_string(gb, result, true)); - return true; -} - -static bool list(GB_gameboy_t *gb, char *arguments, char *modifiers, const debugger_command_t *command) -{ - NO_MODIFIERS - if (strlen(lstrip(arguments))) { - print_usage(gb, command); - return true; - } - - if (gb->n_breakpoints == 0) { - GB_log(gb, "No breakpoints set.\n"); - } - else { - GB_log(gb, "%d breakpoint(s) set:\n", gb->n_breakpoints); - for (uint16_t i = 0; i < gb->n_breakpoints; i++) { - value_t addr = (value_t){gb->breakpoints[i].bank != (uint16_t)-1, gb->breakpoints[i].bank, gb->breakpoints[i].addr}; - if (gb->breakpoints[i].condition) { - GB_log(gb, " %d. %s (Condition: %s)\n", i + 1, - debugger_value_to_string(gb, addr, addr.has_bank), - gb->breakpoints[i].condition); - } - else { - GB_log(gb, " %d. %s\n", i + 1, debugger_value_to_string(gb, addr, addr.has_bank)); - } - } - } - - if (gb->n_watchpoints == 0) { - GB_log(gb, "No watchpoints set.\n"); - } - else { - GB_log(gb, "%d watchpoint(s) set:\n", gb->n_watchpoints); - for (uint16_t i = 0; i < gb->n_watchpoints; i++) { - value_t addr = (value_t){gb->watchpoints[i].bank != (uint16_t)-1, gb->watchpoints[i].bank, gb->watchpoints[i].addr}; - if (gb->watchpoints[i].condition) { - GB_log(gb, " %d. %s (%c%c, Condition: %s)\n", i + 1, debugger_value_to_string(gb, addr, addr.has_bank), - (gb->watchpoints[i].flags & GB_WATCHPOINT_R)? 'r' : '-', - (gb->watchpoints[i].flags & GB_WATCHPOINT_W)? 'w' : '-', - gb->watchpoints[i].condition); - } - else { - GB_log(gb, " %d. %s (%c%c)\n", i + 1, debugger_value_to_string(gb,addr, addr.has_bank), - (gb->watchpoints[i].flags & GB_WATCHPOINT_R)? 'r' : '-', - (gb->watchpoints[i].flags & GB_WATCHPOINT_W)? 'w' : '-'); - } - } - } - - return true; -} - -static bool _should_break(GB_gameboy_t *gb, value_t addr) -{ - uint16_t index = find_breakpoint(gb, addr); - uint32_t key = BP_KEY(addr); - - if (index < gb->n_breakpoints && gb->breakpoints[index].key == key) { - if (!gb->breakpoints[index].condition) { - return true; - } - bool error; - bool condition = debugger_evaluate(gb, gb->breakpoints[index].condition, - (unsigned int)strlen(gb->breakpoints[index].condition), &error, NULL, NULL).value; - if (error) { - /* Should never happen */ - GB_log(gb, "An internal error has occured\n"); - return true; - } - return condition; - } - return false; -} - -static bool should_break(GB_gameboy_t *gb, uint16_t addr) -{ - /* Try any-bank breakpoint */ - value_t full_addr = (VALUE_16(addr)); - if (_should_break(gb, full_addr)) return true; - - /* Try bank-specific breakpoint */ - full_addr.has_bank = true; - full_addr.bank = bank_for_addr(gb, addr); - return _should_break(gb, full_addr); -} - -static bool print(GB_gameboy_t *gb, char *arguments, char *modifiers, const debugger_command_t *command) -{ - if (strlen(lstrip(arguments)) == 0) { - print_usage(gb, command); - return true; - } - - if (!modifiers || !modifiers[0]) { - modifiers = "a"; - } - else if (modifiers[1]) { - print_usage(gb, command); - return true; - } - - bool error; - value_t result = debugger_evaluate(gb, arguments, (unsigned int)strlen(arguments), &error, NULL, NULL); - if (!error) { - switch (modifiers[0]) { - case 'a': - GB_log(gb, "=%s\n", debugger_value_to_string(gb, result, false)); - break; - case 'd': - GB_log(gb, "=%d\n", result.value); - break; - case 'x': - GB_log(gb, "=$%x\n", result.value); - break; - case 'o': - GB_log(gb, "=0%o\n", result.value); - break; - case 'b': - { - if (!result.value) { - GB_log(gb, "=%%0\n"); - break; - } - char binary[17]; - binary[16] = 0; - char *ptr = &binary[16]; - while (result.value) { - *(--ptr) = (result.value & 1)? '1' : '0'; - result.value >>= 1; - } - GB_log(gb, "=%%%s\n", ptr); - break; - } - default: - break; - } - } - return true; -} - -static bool examine(GB_gameboy_t *gb, char *arguments, char *modifiers, const debugger_command_t *command) -{ - if (strlen(lstrip(arguments)) == 0) { - print_usage(gb, command); - return true; - } - - bool error; - value_t addr = debugger_evaluate(gb, arguments, (unsigned int)strlen(arguments), &error, NULL, NULL); - uint16_t count = 32; - - if (modifiers) { - char *end; - count = (uint16_t) (strtol(modifiers, &end, 10)); - if (*end) { - print_usage(gb, command); - return true; - } - } - - if (!error) { - if (addr.has_bank) { - banking_state_t old_state; - save_banking_state(gb, &old_state); - switch_banking_state(gb, addr.bank); - - while (count) { - GB_log(gb, "%02x:%04x: ", addr.bank, addr.value); - for (int i = 0; i < 16 && count; i++) { - GB_log(gb, "%02x ", GB_read_memory(gb, addr.value + i)); - count--; - } - addr.value += 16; - GB_log(gb, "\n"); - } - - restore_banking_state(gb, &old_state); - } - else { - while (count) { - GB_log(gb, "%04x: ", addr.value); - for (int i = 0; i < 16 && count; i++) { - GB_log(gb, "%02x ", GB_read_memory(gb, addr.value + i)); - count--; - } - addr.value += 16; - GB_log(gb, "\n"); - } - } - } - return true; -} - -static bool disassemble(GB_gameboy_t *gb, char *arguments, char *modifiers, const debugger_command_t *command) -{ - if (strlen(lstrip(arguments)) == 0) { - arguments = "pc"; - } - - bool error; - value_t addr = debugger_evaluate(gb, arguments, (unsigned int)strlen(arguments), &error, NULL, NULL); - uint16_t count = 5; - - if (modifiers) { - char *end; - count = (uint16_t) (strtol(modifiers, &end, 10)); - if (*end) { - print_usage(gb, command); - return true; - } - } - - if (!error) { - if (addr.has_bank) { - banking_state_t old_state; - save_banking_state(gb, &old_state); - switch_banking_state(gb, addr.bank); - - GB_cpu_disassemble(gb, addr.value, count); - - restore_banking_state(gb, &old_state); - } - else { - GB_cpu_disassemble(gb, addr.value, count); - } - } - return true; -} - -static bool mbc(GB_gameboy_t *gb, char *arguments, char *modifiers, const debugger_command_t *command) -{ - NO_MODIFIERS - - if (strlen(lstrip(arguments))) { - print_usage(gb, command); - return true; - } - - const GB_cartridge_t *cartridge = gb->cartridge_type; - - if (cartridge->has_ram) { - GB_log(gb, "Cartrdige includes%s RAM: $%x bytes\n", cartridge->has_battery? " battery-backed": "", gb->mbc_ram_size); - } - else { - GB_log(gb, "No cartridge RAM\n"); - } - - if (cartridge->mbc_type) { - static const char * const mapper_names[] = { - [GB_MBC1] = "MBC1", - [GB_MBC2] = "MBC2", - [GB_MBC3] = "MBC3", - [GB_MBC5] = "MBC5", - [GB_HUC1] = "HUC1", - [GB_HUC3] = "HUC3", - }; - GB_log(gb, "%s\n", mapper_names[cartridge->mbc_type]); - GB_log(gb, "Current mapped ROM bank: %x\n", gb->mbc_rom_bank); - if (cartridge->has_ram) { - GB_log(gb, "Current mapped RAM bank: %x\n", gb->mbc_ram_bank); - GB_log(gb, "RAM is curently %s\n", gb->mbc_ram_enable? "enabled" : "disabled"); - } - if (cartridge->mbc_type == GB_MBC1 && gb->mbc1_wiring == GB_STANDARD_MBC1_WIRING) { - GB_log(gb, "MBC1 banking mode is %s\n", gb->mbc1.mode == 1 ? "RAM" : "ROM"); - } - if (cartridge->mbc_type == GB_MBC1 && gb->mbc1_wiring == GB_MBC1M_WIRING) { - GB_log(gb, "MBC1 uses MBC1M wiring. \n"); - GB_log(gb, "Current mapped ROM0 bank: %x\n", gb->mbc_rom0_bank); - GB_log(gb, "MBC1 multicart banking mode is %s\n", gb->mbc1.mode == 1 ? "enabled" : "disabled"); - } - - } - else { - GB_log(gb, "No MBC\n"); - } - - if (cartridge->has_rumble) { - GB_log(gb, "Cart contains a rumble pak\n"); - } - - if (cartridge->has_rtc) { - GB_log(gb, "Cart contains a real time clock\n"); - } - - return true; -} - -static bool backtrace(GB_gameboy_t *gb, char *arguments, char *modifiers, const debugger_command_t *command) -{ - NO_MODIFIERS - - if (strlen(lstrip(arguments))) { - print_usage(gb, command); - return true; - } - - GB_log(gb, " 1. %s\n", debugger_value_to_string(gb, (value_t){true, bank_for_addr(gb, gb->pc), gb->pc}, true)); - for (unsigned int i = gb->backtrace_size; i--;) { - GB_log(gb, "%3d. %s\n", gb->backtrace_size - i + 1, debugger_value_to_string(gb, (value_t){true, gb->backtrace_returns[i].bank, gb->backtrace_returns[i].addr}, true)); - } - - return true; -} - -static bool ticks(GB_gameboy_t *gb, char *arguments, char *modifiers, const debugger_command_t *command) -{ - NO_MODIFIERS - STOPPED_ONLY - - if (strlen(lstrip(arguments))) { - print_usage(gb, command); - return true; - } - - GB_log(gb, "Ticks: %lu. (Resetting)\n", gb->debugger_ticks); - gb->debugger_ticks = 0; - - return true; -} - - -static bool palettes(GB_gameboy_t *gb, char *arguments, char *modifiers, const debugger_command_t *command) -{ - NO_MODIFIERS - if (strlen(lstrip(arguments))) { - print_usage(gb, command); - return true; - } - - if (!gb->is_cgb) { - GB_log(gb, "Not available on a DMG.\n"); - return true; - } - - GB_log(gb, "Background palettes: \n"); - for (unsigned i = 0; i < 32; i++) { - GB_log(gb, "%04x ", ((uint16_t *)&gb->background_palettes_data)[i]); - if (i % 4 == 3) { - GB_log(gb, "\n"); - } - } - - GB_log(gb, "Sprites palettes: \n"); - for (unsigned i = 0; i < 32; i++) { - GB_log(gb, "%04x ", ((uint16_t *)&gb->sprite_palettes_data)[i]); - if (i % 4 == 3) { - GB_log(gb, "\n"); - } - } - - return true; -} - -static bool lcd(GB_gameboy_t *gb, char *arguments, char *modifiers, const debugger_command_t *command) -{ - NO_MODIFIERS - if (strlen(lstrip(arguments))) { - print_usage(gb, command); - return true; - } - GB_log(gb, "LCDC:\n"); - GB_log(gb, " LCD enabled: %s\n",(gb->io_registers[GB_IO_LCDC] & 128)? "Enabled" : "Disabled"); - GB_log(gb, " %s: %s\n", gb->is_cgb? (gb->cgb_mode? "Sprite priority flags" : "Background and Window") : "Background", - (gb->io_registers[GB_IO_LCDC] & 1)? "Enabled" : "Disabled"); - GB_log(gb, " Objects: %s\n", (gb->io_registers[GB_IO_LCDC] & 2)? "Enabled" : "Disabled"); - GB_log(gb, " Object size: %s\n", (gb->io_registers[GB_IO_LCDC] & 4)? "8x16" : "8x8"); - GB_log(gb, " Background tilemap: %s\n", (gb->io_registers[GB_IO_LCDC] & 8)? "$9C00" : "$9800"); - GB_log(gb, " Background and Window Tileset: %s\n", (gb->io_registers[GB_IO_LCDC] & 16)? "$8000" : "$8800"); - GB_log(gb, " Window: %s\n", (gb->io_registers[GB_IO_LCDC] & 32)? "Enabled" : "Disabled"); - GB_log(gb, " Window tilemap: %s\n", (gb->io_registers[GB_IO_LCDC] & 64)? "$9C00" : "$9800"); - - GB_log(gb, "\nSTAT:\n"); - static const char *modes[] = {"Mode 0, H-Blank", "Mode 1, V-Blank", "Mode 2, OAM", "Mode 3, Rendering"}; - GB_log(gb, " Current mode: %s\n", modes[gb->io_registers[GB_IO_STAT] & 3]); - GB_log(gb, " LYC flag: %s\n", (gb->io_registers[GB_IO_STAT] & 4)? "On" : "Off"); - GB_log(gb, " H-Blank interrupt: %s\n", (gb->io_registers[GB_IO_STAT] & 8)? "Enabled" : "Disabled"); - GB_log(gb, " V-Blank interrupt: %s\n", (gb->io_registers[GB_IO_STAT] & 16)? "Enabled" : "Disabled"); - GB_log(gb, " OAM interrupt: %s\n", (gb->io_registers[GB_IO_STAT] & 32)? "Enabled" : "Disabled"); - GB_log(gb, " LYC interrupt: %s\n", (gb->io_registers[GB_IO_STAT] & 64)? "Enabled" : "Disabled"); - - - GB_log(gb, "\nCycles since frame start: %d\n", gb->display_cycles); - GB_log(gb, "Current line: %d\n", gb->display_cycles / 456); - GB_log(gb, "LY: %d\n", gb->io_registers[GB_IO_LY]); - GB_log(gb, "LYC: %d\n", gb->io_registers[GB_IO_LYC]); - GB_log(gb, "Window position: %d, %d\n", (signed) gb->io_registers[GB_IO_WX] - 7 , gb->io_registers[GB_IO_WY]); - GB_log(gb, "Interrupt line: %s\n", gb->stat_interrupt_line? "On" : "Off"); - - return true; -} - -static bool help(GB_gameboy_t *gb, char *arguments, char *modifiers, const debugger_command_t *command); - -#define HELP_NEWLINE "\n " - -/* Commands without implementations are aliases of the previous non-alias commands */ -static const debugger_command_t commands[] = { - {"continue", 1, cont, "Continue running until next stop"}, - {"next", 1, next, "Run the next instruction, skipping over function calls"}, - {"step", 1, step, "Run the next instruction, stepping into function calls"}, - {"finish", 1, finish, "Run until the current function returns"}, - {"backtrace", 2, backtrace, "Display the current call stack"}, - {"bt", 2, }, /* Alias */ - {"sld", 3, stack_leak_detection, "Like finish, but stops if a stack leak is detected (Experimental)"}, - {"ticks", 2, ticks, "Display the number of CPU ticks since the last time 'ticks' was used"}, - {"registers", 1, registers, "Print values of processor registers and other important registers"}, - {"cartridge", 2, mbc, "Displays information about the MBC and cartridge"}, - {"mbc", 3, }, /* Alias */ - {"lcd", 3, lcd, "Displays information about the current state of the LCD controller"}, - {"palettes", 3, palettes, "Displays the current CGB palettes"}, - {"breakpoint", 1, breakpoint, "Add a new breakpoint at the specified address/expression" HELP_NEWLINE - "Can also modify the condition of existing breakpoints.", - "[ if ]"}, - {"delete", 2, delete, "Delete a breakpoint by its address, or all breakpoints", "[]"}, - {"watch", 1, watch, "Add a new watchpoint at the specified address/expression." HELP_NEWLINE - "Can also modify the condition and type of existing watchpoints." HELP_NEWLINE - "Default watchpoint type is write-only.", - "[ if ]", "(r|w|rw)"}, - {"unwatch", 3, unwatch, "Delete a watchpoint by its address, or all watchpoints", "[]"}, - {"list", 1, list, "List all set breakpoints and watchpoints"}, - {"print", 1, print, "Evaluate and print an expression" HELP_NEWLINE - "Use modifier to format as an address (a, default) or as a number in" HELP_NEWLINE - "decimal (d), hexadecimal (x), octal (o) or binary (b).", - "", "format"}, - {"eval", 2, }, /* Alias */ - {"examine", 2, examine, "Examine values at address", "", "count"}, - {"x", 1, }, /* Alias */ - {"disassemble", 1, disassemble, "Disassemble instructions at address", "", "count"}, - - - {"help", 1, help, "List available commands or show help for the specified command", "[]"}, - {NULL,}, /* Null terminator */ -}; - -static const debugger_command_t *find_command(const char *string) -{ - size_t length = strlen(string); - for (const debugger_command_t *command = commands; command->command; command++) { - if (command->min_length > length) continue; - if (memcmp(command->command, string, length) == 0) { /* Is a substring? */ - /* Aliases */ - while (!command->implementation) { - command--; - } - return command; - } - } - - return NULL; -} - -static void print_command_shortcut(GB_gameboy_t *gb, const debugger_command_t *command) -{ - GB_attributed_log(gb, GB_LOG_BOLD | GB_LOG_UNDERLINE, "%.*s", command->min_length, command->command); - GB_attributed_log(gb, GB_LOG_BOLD , "%s", command->command + command->min_length); -} - -static void print_command_description(GB_gameboy_t *gb, const debugger_command_t *command) -{ - print_command_shortcut(gb, command); - GB_log(gb, ": "); - GB_log(gb, (const char *)&" %s\n" + strlen(command->command), command->help_string); -} - -static bool help(GB_gameboy_t *gb, char *arguments, char *modifiers, const debugger_command_t *ignored) -{ - const debugger_command_t *command = find_command(arguments); - if (command) { - print_command_description(gb, command); - GB_log(gb, "\n"); - print_usage(gb, command); - - command++; - if (command->command && !command->implementation) { /* Command has aliases*/ - GB_log(gb, "\nAliases: "); - do { - print_command_shortcut(gb, command); - GB_log(gb, " "); - command++; - } while (command->command && !command->implementation); - GB_log(gb, "\n"); - } - return true; - } - for (command = commands; command->command; command++) { - if (command->help_string) { - print_command_description(gb, command); - } - } - return true; -} - -void GB_debugger_call_hook(GB_gameboy_t *gb, uint16_t call_addr) -{ - /* Called just after the CPU calls a function/enters an interrupt/etc... */ - - if (gb->stack_leak_detection) { - if (gb->debug_call_depth >= sizeof(gb->sp_for_call_depth) / sizeof(gb->sp_for_call_depth[0])) { - GB_log(gb, "Potential stack overflow detected (Functions nest too much). \n"); - gb->debug_stopped = true; - } - else { - gb->sp_for_call_depth[gb->debug_call_depth] = gb->registers[GB_REGISTER_SP]; - gb->addr_for_call_depth[gb->debug_call_depth] = gb->pc; - } - } - - if (gb->backtrace_size < sizeof(gb->backtrace_sps) / sizeof(gb->backtrace_sps[0])) { - - while (gb->backtrace_size) { - if (gb->backtrace_sps[gb->backtrace_size - 1] < gb->registers[GB_REGISTER_SP]) { - gb->backtrace_size--; - } - else { - break; - } - } - - gb->backtrace_sps[gb->backtrace_size] = gb->registers[GB_REGISTER_SP]; - gb->backtrace_returns[gb->backtrace_size].bank = bank_for_addr(gb, call_addr); - gb->backtrace_returns[gb->backtrace_size].addr = call_addr; - gb->backtrace_size++; - } - - gb->debug_call_depth++; -} - -void GB_debugger_ret_hook(GB_gameboy_t *gb) -{ - /* Called just before the CPU runs ret/reti */ - - gb->debug_call_depth--; - - if (gb->stack_leak_detection) { - if (gb->debug_call_depth < 0) { - GB_log(gb, "Function finished without a stack leak.\n"); - gb->debug_stopped = true; - } - else { - if (gb->registers[GB_REGISTER_SP] != gb->sp_for_call_depth[gb->debug_call_depth]) { - GB_log(gb, "Stack leak detected for function %s!\n", value_to_string(gb, gb->addr_for_call_depth[gb->debug_call_depth], true)); - GB_log(gb, "SP is $%04x, should be $%04x.\n", gb->registers[GB_REGISTER_SP], - gb->sp_for_call_depth[gb->debug_call_depth]); - gb->debug_stopped = true; - } - } - } - - while (gb->backtrace_size) { - if (gb->backtrace_sps[gb->backtrace_size - 1] <= gb->registers[GB_REGISTER_SP]) { - gb->backtrace_size--; - } - else { - break; - } - } -} - -static bool _GB_debugger_test_write_watchpoint(GB_gameboy_t *gb, value_t addr, uint8_t value) -{ - uint16_t index = find_watchpoint(gb, addr); - uint32_t key = WP_KEY(addr); - - if (index < gb->n_watchpoints && gb->watchpoints[index].key == key) { - if (!(gb->watchpoints[index].flags & GB_WATCHPOINT_W)) { - return false; - } - if (!gb->watchpoints[index].condition) { - gb->debug_stopped = true; - GB_log(gb, "Watchpoint: [%s] = $%02x\n", debugger_value_to_string(gb, addr, true), value); - return true; - } - bool error; - bool condition = debugger_evaluate(gb, gb->watchpoints[index].condition, - (unsigned int)strlen(gb->watchpoints[index].condition), &error, &addr.value, &value).value; - if (error) { - /* Should never happen */ - GB_log(gb, "An internal error has occured\n"); - return false; - } - if (condition) { - gb->debug_stopped = true; - GB_log(gb, "Watchpoint: [%s] = $%02x\n", debugger_value_to_string(gb, addr, true), value); - return true; - } - } - return false; -} - -void GB_debugger_test_write_watchpoint(GB_gameboy_t *gb, uint16_t addr, uint8_t value) -{ - if (gb->debug_stopped) return; - - /* Try any-bank breakpoint */ - value_t full_addr = (VALUE_16(addr)); - if (_GB_debugger_test_write_watchpoint(gb, full_addr, value)) return; - - /* Try bank-specific breakpoint */ - full_addr.has_bank = true; - full_addr.bank = bank_for_addr(gb, addr); - _GB_debugger_test_write_watchpoint(gb, full_addr, value); -} - -static bool _GB_debugger_test_read_watchpoint(GB_gameboy_t *gb, value_t addr) -{ - uint16_t index = find_watchpoint(gb, addr); - uint32_t key = WP_KEY(addr); - - if (index < gb->n_watchpoints && gb->watchpoints[index].key == key) { - if (!(gb->watchpoints[index].flags & GB_WATCHPOINT_R)) { - return false; - } - if (!gb->watchpoints[index].condition) { - gb->debug_stopped = true; - GB_log(gb, "Watchpoint: [%s]\n", debugger_value_to_string(gb, addr, true)); - return true; - } - bool error; - bool condition = debugger_evaluate(gb, gb->watchpoints[index].condition, - (unsigned int)strlen(gb->watchpoints[index].condition), &error, &addr.value, NULL).value; - if (error) { - /* Should never happen */ - GB_log(gb, "An internal error has occured\n"); - return false; - } - if (condition) { - gb->debug_stopped = true; - GB_log(gb, "Watchpoint: [%s]\n", debugger_value_to_string(gb, addr, true)); - return true; - } - } - return false; -} - -void GB_debugger_test_read_watchpoint(GB_gameboy_t *gb, uint16_t addr) -{ - if (gb->debug_stopped) return; - - /* Try any-bank breakpoint */ - value_t full_addr = (VALUE_16(addr)); - if (_GB_debugger_test_read_watchpoint(gb, full_addr)) return; - - /* Try bank-specific breakpoint */ - full_addr.has_bank = true; - full_addr.bank = bank_for_addr(gb, addr); - _GB_debugger_test_read_watchpoint(gb, full_addr); -} - -/* Returns true if debugger waits for more commands */ -bool GB_debugger_execute_command(GB_gameboy_t *gb, char *input) -{ - if (!input[0]) { - return true; - } - - char *command_string = input; - char *arguments = strchr(input, ' '); - if (arguments) { - /* Actually "split" the string. */ - arguments[0] = 0; - arguments++; - } - else { - arguments = ""; - } - - char *modifiers = strchr(command_string, '/'); - if (modifiers) { - /* Actually "split" the string. */ - modifiers[0] = 0; - modifiers++; - } - - const debugger_command_t *command = find_command(command_string); - if (command) { - return command->implementation(gb, arguments, modifiers, command); - } - else { - GB_log(gb, "%s: no such command.\n", command_string); - return true; - } -} - -void GB_debugger_run(GB_gameboy_t *gb) -{ - if (gb->debug_disable) return; - - char *input = NULL; - if (gb->debug_next_command && gb->debug_call_depth <= 0) { - gb->debug_stopped = true; - } - if (gb->debug_fin_command && gb->debug_call_depth == -1) { - gb->debug_stopped = true; - } - if (gb->debug_stopped) { - GB_cpu_disassemble(gb, gb->pc, 5); - } -next_command: - if (input) { - free(input); - } - if (gb->breakpoints && !gb->debug_stopped && should_break(gb, gb->pc)) { - gb->debug_stopped = true; - GB_log(gb, "Breakpoint: PC = %s\n", value_to_string(gb, gb->pc, true)); - GB_cpu_disassemble(gb, gb->pc, 5); - } - if (gb->debug_stopped && !gb->debug_disable) { - gb->debug_next_command = false; - gb->debug_fin_command = false; - gb->stack_leak_detection = false; - input = gb->input_callback(gb); - - if (input == NULL) { - /* Debugging is no currently available, continue running */ - gb->debug_stopped = false; - return; - } - - if (GB_debugger_execute_command(gb, input)) { - goto next_command; - } - - free(input); - } -} - -void GB_debugger_handle_async_commands(GB_gameboy_t *gb) -{ - char *input = NULL; - - while (gb->async_input_callback && (input = gb->async_input_callback(gb))) { - GB_debugger_execute_command(gb, input); - free(input); - } -} - -void GB_debugger_load_symbol_file(GB_gameboy_t *gb, const char *path) -{ - FILE *f = fopen(path, "r"); - if (!f) return; - - char *line = NULL; - size_t size = 0; - size_t length = 0; - while ((length = getline(&line, &size, f)) != -1) { - for (unsigned i = 0; i < length; i++) { - if (line[i] == ';' || line[i] == '\n' || line[i] == '\r') { - line[i] = 0; - length = i; - break; - } - } - if (length == 0) continue; - - unsigned int bank, address; - char symbol[length]; - - if (sscanf(line, "%02x:%04x %s", &bank, &address, symbol) == 3) { - bank &= 0x1FF; - if (!gb->bank_symbols[bank]) { - gb->bank_symbols[bank] = GB_map_alloc(); - } - GB_bank_symbol_t *allocated_symbol = GB_map_add_symbol(gb->bank_symbols[bank], address, symbol); - if (allocated_symbol) { - GB_reversed_map_add_symbol(&gb->reversed_symbol_map, bank, allocated_symbol); - } - } - } - free(line); - fclose(f); -} - -const GB_bank_symbol_t *GB_debugger_find_symbol(GB_gameboy_t *gb, uint16_t addr) -{ - uint16_t bank = bank_for_addr(gb, addr); - - const GB_bank_symbol_t *symbol = GB_map_find_symbol(gb->bank_symbols[bank], addr); - if (symbol) return symbol; - if (bank != 0) return GB_map_find_symbol(gb->bank_symbols[0], addr); /* Maybe the symbol incorrectly uses bank 0? */ - - return NULL; -} - -const char *GB_debugger_name_for_address(GB_gameboy_t *gb, uint16_t addr) -{ - const GB_bank_symbol_t *symbol = GB_debugger_find_symbol(gb, addr); - if (symbol && symbol->addr == addr) return symbol->name; - return NULL; -} - -/* The public version of debugger_evaluate */ -bool GB_debugger_evaluate(GB_gameboy_t *gb, const char *string, uint16_t *result, uint16_t *result_bank) -{ - bool error = false; - value_t value = debugger_evaluate(gb, string, strlen(string), &error, NULL, NULL); - if (result) { - *result = value.value; - } - if (result_bank) { - *result_bank = value.has_bank? value.value : -1; - } - return error; -} - -void GB_debugger_break(GB_gameboy_t *gb) -{ - gb->debug_stopped = true; -} - -bool GB_debugger_is_stopped(GB_gameboy_t *gb) -{ - return gb->debug_stopped; -} - -void GB_debugger_set_disabled(GB_gameboy_t *gb, bool disabled) -{ - gb->debug_disable = disabled; -} diff --git a/waterbox/sameboy/debugger.h b/waterbox/sameboy/debugger.h deleted file mode 100644 index 5d6491972c..0000000000 --- a/waterbox/sameboy/debugger.h +++ /dev/null @@ -1,32 +0,0 @@ -#ifndef debugger_h -#define debugger_h -#include -#include -#include "gb_struct_def.h" -#include "symbol_hash.h" - -#ifdef GB_INTERNAL -void GB_debugger_run(GB_gameboy_t *gb); -void GB_debugger_handle_async_commands(GB_gameboy_t *gb); -void GB_debugger_call_hook(GB_gameboy_t *gb, uint16_t call_addr); -void GB_debugger_ret_hook(GB_gameboy_t *gb); -void GB_debugger_test_write_watchpoint(GB_gameboy_t *gb, uint16_t addr, uint8_t value); -void GB_debugger_test_read_watchpoint(GB_gameboy_t *gb, uint16_t addr); -const GB_bank_symbol_t *GB_debugger_find_symbol(GB_gameboy_t *gb, uint16_t addr); -#endif - -#ifdef GB_INTERNAL -bool /* Returns true if debugger waits for more commands. Not relevant for non-GB_INTERNAL */ -#else -void -#endif -GB_debugger_execute_command(GB_gameboy_t *gb, char *input); /* Destroys input. */ - - -void GB_debugger_load_symbol_file(GB_gameboy_t *gb, const char *path); -const char *GB_debugger_name_for_address(GB_gameboy_t *gb, uint16_t addr); -bool GB_debugger_evaluate(GB_gameboy_t *gb, const char *string, uint16_t *result, uint16_t *result_bank); /* result_bank is -1 if unused. */ -void GB_debugger_break(GB_gameboy_t *gb); -bool GB_debugger_is_stopped(GB_gameboy_t *gb); -void GB_debugger_set_disabled(GB_gameboy_t *gb, bool disabled); -#endif /* debugger_h */ diff --git a/waterbox/sameboy/gb.c b/waterbox/sameboy/gb.c index 56697a1e83..d464734c4e 100644 --- a/waterbox/sameboy/gb.c +++ b/waterbox/sameboy/gb.c @@ -67,7 +67,7 @@ static char *default_input_callback(GB_gameboy_t *gb) static char *default_async_input_callback(GB_gameboy_t *gb) { -#ifndef _WIN32 +#if 0 fd_set set; FD_ZERO(&set); FD_SET(STDIN_FILENO, &set); @@ -260,12 +260,10 @@ exit: void GB_run(GB_gameboy_t *gb) { - GB_debugger_run(gb); GB_cpu_run(gb); if (gb->vblank_just_occured) { GB_update_joyp(gb); GB_rtc_run(gb); - GB_debugger_handle_async_commands(gb); } } diff --git a/waterbox/sameboy/gb.h b/waterbox/sameboy/gb.h index 82608821fd..4d7588b644 100644 --- a/waterbox/sameboy/gb.h +++ b/waterbox/sameboy/gb.h @@ -10,7 +10,6 @@ #include "apu.h" #include "camera.h" -#include "debugger.h" #include "display.h" #include "joypad.h" #include "mbc.h" @@ -179,9 +178,6 @@ typedef struct { long delay; } GB_ir_queue_item_t; -struct GB_breakpoint_s; -struct GB_watchpoint_s; - /* When state saving, each section is dumped independently of other sections. This allows adding data to the end of the section without worrying about future compatibility. Some other changes might be "safe" as well. @@ -445,10 +441,6 @@ struct GB_gameboy_internal_s { GB_ir_queue_item_t ir_queue[GB_MAX_IR_QUEUE]; size_t ir_queue_length; - /*** Debugger ***/ - volatile bool debug_stopped, debug_disable; - bool debug_fin_command, debug_next_command; - /* Breakpoints */ uint16_t n_breakpoints; struct GB_breakpoint_s *breakpoints; @@ -467,10 +459,6 @@ struct GB_gameboy_internal_s { uint16_t addr; } backtrace_returns[0x200]; - /* Watchpoints */ - uint16_t n_watchpoints; - struct GB_watchpoint_s *watchpoints; - /* Symbol tables */ GB_symbol_map_t *bank_symbols[0x200]; GB_reversed_symbol_map_t reversed_symbol_map; diff --git a/waterbox/sameboy/memory.c b/waterbox/sameboy/memory.c index c914e55965..f694d210a4 100644 --- a/waterbox/sameboy/memory.c +++ b/waterbox/sameboy/memory.c @@ -268,9 +268,6 @@ static GB_read_function_t * const read_map[] = uint8_t GB_read_memory(GB_gameboy_t *gb, uint16_t addr) { - if (gb->n_watchpoints) { - GB_debugger_test_read_watchpoint(gb, addr); - } if (is_addr_in_dma_use(gb, addr)) { addr = gb->dma_current_src; } @@ -677,9 +674,6 @@ static GB_write_function_t * const write_map[] = void GB_write_memory(GB_gameboy_t *gb, uint16_t addr, uint8_t value) { - if (gb->n_watchpoints) { - GB_debugger_test_write_watchpoint(gb, addr, value); - } if (is_addr_in_dma_use(gb, addr)) { /* Todo: What should happen? Will this affect DMA? Will data be written? What and where? */ return; diff --git a/waterbox/sameboy/timing.c b/waterbox/sameboy/timing.c index 77348fe232..d53c85a014 100644 --- a/waterbox/sameboy/timing.c +++ b/waterbox/sameboy/timing.c @@ -125,8 +125,6 @@ void GB_advance_cycles(GB_gameboy_t *gb, uint8_t cycles) } } - gb->debugger_ticks += cycles; - if (gb->cgb_double_speed) { cycles >>=1; } diff --git a/waterbox/sameboy/z80_cpu.c b/waterbox/sameboy/z80_cpu.c index 0a1bde5dd7..19adc82f47 100644 --- a/waterbox/sameboy/z80_cpu.c +++ b/waterbox/sameboy/z80_cpu.c @@ -701,7 +701,6 @@ static void ret_cc(GB_gameboy_t *gb, uint8_t opcode) { /* Todo: Verify timing */ if (condition_code(gb, opcode)) { - GB_debugger_ret_hook(gb); GB_advance_cycles(gb, 8); gb->pc = GB_read_memory(gb, gb->registers[GB_REGISTER_SP]); GB_advance_cycles(gb, 4); @@ -768,8 +767,6 @@ static void call_cc_a16(GB_gameboy_t *gb, uint8_t opcode) GB_write_memory(gb, gb->registers[GB_REGISTER_SP], (gb->pc) & 0xFF); GB_advance_cycles(gb, 4); gb->pc = addr; - - GB_debugger_call_hook(gb, call_addr); } else { GB_advance_cycles(gb, 12); @@ -938,12 +935,10 @@ static void rst(GB_gameboy_t *gb, uint8_t opcode) GB_write_memory(gb, gb->registers[GB_REGISTER_SP], (gb->pc) & 0xFF); GB_advance_cycles(gb, 4); gb->pc = opcode ^ 0xC7; - GB_debugger_call_hook(gb, call_addr); } static void ret(GB_gameboy_t *gb, uint8_t opcode) { - GB_debugger_ret_hook(gb); GB_advance_cycles(gb, 4); gb->pc = GB_read_memory(gb, gb->registers[GB_REGISTER_SP]); GB_advance_cycles(gb, 4); @@ -972,7 +967,6 @@ static void call_a16(GB_gameboy_t *gb, uint8_t opcode) GB_write_memory(gb, gb->registers[GB_REGISTER_SP], (gb->pc) & 0xFF); GB_advance_cycles(gb, 4); gb->pc = addr; - GB_debugger_call_hook(gb, call_addr); } static void ld_da8_a(GB_gameboy_t *gb, uint8_t opcode) diff --git a/waterbox/sameboy/z80_disassembler.c b/waterbox/sameboy/z80_disassembler.c deleted file mode 100644 index 08fb62f039..0000000000 --- a/waterbox/sameboy/z80_disassembler.c +++ /dev/null @@ -1,788 +0,0 @@ -#include -#include -#include "gb.h" - - -typedef void GB_opcode_t(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc); - -static void ill(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) -{ - GB_log(gb, ".BYTE $%02x\n", opcode); - (*pc)++; -} - -static void nop(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) -{ - GB_log(gb, "NOP\n"); - (*pc)++; -} - -static void stop(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) -{ - (*pc)++; - uint8_t next = GB_read_memory(gb, (*pc)++); - if (next) { - GB_log(gb, "CORRUPTED STOP (%02x)\n", next); - } - else { - GB_log(gb, "STOP\n"); - } -} - -static char *register_names[] = {"af", "bc", "de", "hl", "sp"}; - -static void ld_rr_d16(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) -{ - uint8_t register_id; - uint16_t value; - register_id = (GB_read_memory(gb, (*pc)++) >> 4) + 1; - value = GB_read_memory(gb, (*pc)++); - value |= GB_read_memory(gb, (*pc)++) << 8; - const char *symbol = GB_debugger_name_for_address(gb, value); - if (symbol) { - GB_log(gb, "LD %s, %s ; =$%04x\n", register_names[register_id], symbol, value); - } - else { - GB_log(gb, "LD %s, $%04x\n", register_names[register_id], value); - } -} - -static void ld_drr_a(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) -{ - uint8_t register_id; - register_id = (GB_read_memory(gb, (*pc)++) >> 4) + 1; - GB_log(gb, "LD [%s], a\n", register_names[register_id]); -} - -static void inc_rr(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) -{ - uint8_t register_id; - register_id = (GB_read_memory(gb, (*pc)++) >> 4) + 1; - GB_log(gb, "INC %s\n", register_names[register_id]); -} - -static void inc_hr(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) -{ - uint8_t register_id; - (*pc)++; - register_id = ((opcode >> 4) + 1) & 0x03; - GB_log(gb, "INC %c\n", register_names[register_id][0]); - -} -static void dec_hr(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) -{ - uint8_t register_id; - (*pc)++; - register_id = ((opcode >> 4) + 1) & 0x03; - GB_log(gb, "DEC %c\n", register_names[register_id][0]); -} - -static void ld_hr_d8(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) -{ - uint8_t register_id; - (*pc)++; - register_id = ((opcode >> 4) + 1) & 0x03; - GB_log(gb, "LD %c, $%02x\n", register_names[register_id][0], GB_read_memory(gb, (*pc)++)); -} - -static void rlca(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) -{ - (*pc)++; - GB_log(gb, "RLCA\n"); -} - -static void rla(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) -{ - (*pc)++; - GB_log(gb, "RLA\n"); -} - -static void ld_da16_sp(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc){ - uint16_t addr; - (*pc)++; - addr = GB_read_memory(gb, (*pc)++); - addr |= GB_read_memory(gb, (*pc)++) << 8; - const char *symbol = GB_debugger_name_for_address(gb, addr); - if (symbol) { - GB_log(gb, "LD [%s], sp ; =$%04x\n", symbol, addr); - } - else { - GB_log(gb, "LD [$%04x], sp\n", addr); - } -} - -static void add_hl_rr(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) -{ - uint8_t register_id; - (*pc)++; - register_id = (opcode >> 4) + 1; - GB_log(gb, "ADD hl, %s\n", register_names[register_id]); -} - -static void ld_a_drr(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) -{ - uint8_t register_id; - register_id = (GB_read_memory(gb, (*pc)++) >> 4) + 1; - GB_log(gb, "LD a, [%s]\n", register_names[register_id]); -} - -static void dec_rr(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) -{ - uint8_t register_id; - register_id = (GB_read_memory(gb, (*pc)++) >> 4) + 1; - GB_log(gb, "DEC %s\n", register_names[register_id]); -} - -static void inc_lr(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) -{ - uint8_t register_id; - register_id = (GB_read_memory(gb, (*pc)++) >> 4) + 1; - - GB_log(gb, "INC %c\n", register_names[register_id][1]); -} -static void dec_lr(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) -{ - uint8_t register_id; - register_id = (GB_read_memory(gb, (*pc)++) >> 4) + 1; - - GB_log(gb, "DEC %c\n", register_names[register_id][1]); -} - -static void ld_lr_d8(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) -{ - uint8_t register_id; - register_id = (GB_read_memory(gb, (*pc)++) >> 4) + 1; - - GB_log(gb, "LD %c, $%02x\n", register_names[register_id][1], GB_read_memory(gb, (*pc)++)); -} - -static void rrca(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) -{ - GB_log(gb, "RRCA\n"); - (*pc)++; -} - -static void rra(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) -{ - GB_log(gb, "RRA\n"); - (*pc)++; -} - -static void jr_r8(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) -{ - (*pc)++; - uint16_t addr = *pc + (int8_t) GB_read_memory(gb, (*pc)) + 1; - const char *symbol = GB_debugger_name_for_address(gb, addr); - if (symbol) { - GB_attributed_log(gb, GB_LOG_UNDERLINE, "JR %s ; =$%04x\n", symbol, addr); - } - else { - GB_attributed_log(gb, GB_LOG_UNDERLINE, "JR $%04x\n", addr); - } - (*pc)++; -} - -static const char *condition_code(uint8_t opcode) -{ - switch ((opcode >> 3) & 0x3) { - case 0: - return "nz"; - case 1: - return "z"; - case 2: - return "nc"; - case 3: - return "c"; - } - - return NULL; -} - -static void jr_cc_r8(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) -{ - (*pc)++; - uint16_t addr = *pc + (int8_t) GB_read_memory(gb, (*pc)) + 1; - const char *symbol = GB_debugger_name_for_address(gb, addr); - if (symbol) { - GB_attributed_log(gb, GB_LOG_DASHED_UNDERLINE, "JR %s, %s ; =$%04x\n", condition_code(opcode), symbol, addr); - } - else { - GB_attributed_log(gb, GB_LOG_DASHED_UNDERLINE, "JR %s, $%04x\n", condition_code(opcode), addr); - } - (*pc)++; -} - -static void daa(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) -{ - GB_log(gb, "DAA\n"); - (*pc)++; -} - -static void cpl(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) -{ - GB_log(gb, "CPL\n"); - (*pc)++; -} - -static void scf(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) -{ - GB_log(gb, "SCF\n"); - (*pc)++; -} - -static void ccf(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) -{ - GB_log(gb, "CCF\n"); - (*pc)++; -} - -static void ld_dhli_a(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) -{ - GB_log(gb, "LD [hli], a\n"); - (*pc)++; -} - -static void ld_dhld_a(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) -{ - GB_log(gb, "LD [hld], a\n"); - (*pc)++; -} - -static void ld_a_dhli(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) -{ - GB_log(gb, "LD a, [hli]\n"); - (*pc)++; -} - -static void ld_a_dhld(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) -{ - GB_log(gb, "LD a, [hld]\n"); - (*pc)++; -} - -static void inc_dhl(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) -{ - GB_log(gb, "INC [hl]\n"); - (*pc)++; -} - -static void dec_dhl(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) -{ - GB_log(gb, "DEC [hl]\n"); - (*pc)++; -} - -static void ld_dhl_d8(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) -{ - (*pc)++; - GB_log(gb, "LD [hl], $%02x\n", GB_read_memory(gb, (*pc)++)); -} - -static const char *get_src_name(uint8_t opcode) -{ - uint8_t src_register_id; - uint8_t src_low; - src_register_id = ((opcode >> 1) + 1) & 3; - src_low = (opcode & 1); - if (src_register_id == GB_REGISTER_AF) { - return src_low? "a": "[hl]"; - } - if (src_low) { - return register_names[src_register_id] + 1; - } - static const char *high_register_names[] = {"a", "b", "d", "h"}; - return high_register_names[src_register_id]; -} - -static const char *get_dst_name(uint8_t opcode) -{ - uint8_t dst_register_id; - uint8_t dst_low; - dst_register_id = ((opcode >> 4) + 1) & 3; - dst_low = opcode & 8; - if (dst_register_id == GB_REGISTER_AF) { - return dst_low? "a": "[hl]"; - } - if (dst_low) { - return register_names[dst_register_id] + 1; - } - static const char *high_register_names[] = {"a", "b", "d", "h"}; - return high_register_names[dst_register_id]; -} - -static void ld_r_r(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) -{ - (*pc)++; - GB_log(gb, "LD %s, %s\n", get_dst_name(opcode), get_src_name(opcode)); -} - -static void add_a_r(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) -{ - (*pc)++; - GB_log(gb, "ADD %s\n", get_src_name(opcode)); -} - -static void adc_a_r(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) -{ - (*pc)++; - GB_log(gb, "ADC %s\n", get_src_name(opcode)); -} - -static void sub_a_r(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) -{ - (*pc)++; - GB_log(gb, "SUB %s\n", get_src_name(opcode)); -} - -static void sbc_a_r(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) -{ - (*pc)++; - GB_log(gb, "SBC %s\n", get_src_name(opcode)); -} - -static void and_a_r(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) -{ - (*pc)++; - GB_log(gb, "AND %s\n", get_src_name(opcode)); -} - -static void xor_a_r(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) -{ - (*pc)++; - GB_log(gb, "XOR %s\n", get_src_name(opcode)); -} - -static void or_a_r(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) -{ - (*pc)++; - GB_log(gb, "OR %s\n", get_src_name(opcode)); -} - -static void cp_a_r(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) -{ - (*pc)++; - GB_log(gb, "CP %s\n", get_src_name(opcode)); -} - -static void halt(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) -{ - (*pc)++; - GB_log(gb, "HALT\n"); -} - -static void ret_cc(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) -{ - (*pc)++; - GB_attributed_log(gb, GB_LOG_DASHED_UNDERLINE, "RET %s\n", condition_code(opcode)); -} - -static void pop_rr(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) -{ - uint8_t register_id; - register_id = ((GB_read_memory(gb, (*pc)++) >> 4) + 1) & 3; - GB_log(gb, "POP %s\n", register_names[register_id]); -} - -static void jp_cc_a16(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) -{ - (*pc)++; - uint16_t addr = GB_read_memory(gb, *pc) | (GB_read_memory(gb, *pc + 1) << 8); - const char *symbol = GB_debugger_name_for_address(gb, addr); - if (symbol) { - GB_attributed_log(gb, GB_LOG_DASHED_UNDERLINE, "JP %s, %s ; =$%04x\n", condition_code(opcode), symbol, addr); - } - else { - GB_attributed_log(gb, GB_LOG_DASHED_UNDERLINE, "JP %s, $%04x\n", condition_code(opcode), addr); - } - (*pc) += 2; -} - -static void jp_a16(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) -{ - (*pc)++; - uint16_t addr = GB_read_memory(gb, *pc) | (GB_read_memory(gb, *pc + 1) << 8); - const char *symbol = GB_debugger_name_for_address(gb, addr); - if (symbol) { - GB_log(gb, "JP %s ; =$%04x\n", symbol, addr); - } - else { - GB_log(gb, "JP $%04x\n", addr); - } - (*pc) += 2; -} - -static void call_cc_a16(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) -{ - (*pc)++; - uint16_t addr = GB_read_memory(gb, *pc) | (GB_read_memory(gb, *pc + 1) << 8); - const char *symbol = GB_debugger_name_for_address(gb, addr); - if (symbol) { - GB_log(gb, "CALL %s, %s ; =$%04x\n", condition_code(opcode), symbol, addr); - } - else { - GB_log(gb, "CALL %s, $%04x\n", condition_code(opcode), addr); - } - (*pc) += 2; -} - -static void push_rr(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) -{ - uint8_t register_id; - register_id = ((GB_read_memory(gb, (*pc)++) >> 4) + 1) & 3; - GB_log(gb, "PUSH %s\n", register_names[register_id]); -} - -static void add_a_d8(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) -{ - (*pc)++; - GB_log(gb, "ADD $%02x\n", GB_read_memory(gb, (*pc)++)); -} - -static void adc_a_d8(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) -{ - (*pc)++; - GB_log(gb, "ADC $%02x\n", GB_read_memory(gb, (*pc)++)); -} - -static void sub_a_d8(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) -{ - (*pc)++; - GB_log(gb, "SUB $%02x\n", GB_read_memory(gb, (*pc)++)); -} - -static void sbc_a_d8(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) -{ - (*pc)++; - GB_log(gb, "SBC $%02x\n", GB_read_memory(gb, (*pc)++)); -} - -static void and_a_d8(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) -{ - (*pc)++; - GB_log(gb, "AND $%02x\n", GB_read_memory(gb, (*pc)++)); -} - -static void xor_a_d8(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) -{ - (*pc)++; - GB_log(gb, "XOR $%02x\n", GB_read_memory(gb, (*pc)++)); -} - -static void or_a_d8(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) -{ - (*pc)++; - GB_log(gb, "OR $%02x\n", GB_read_memory(gb, (*pc)++)); -} - -static void cp_a_d8(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) -{ - (*pc)++; - GB_log(gb, "CP $%02x\n", GB_read_memory(gb, (*pc)++)); -} - -static void rst(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) -{ - (*pc)++; - GB_log(gb, "RST $%02x\n", opcode ^ 0xC7); - -} - -static void ret(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) -{ - (*pc)++; - GB_attributed_log(gb, GB_LOG_UNDERLINE, "RET\n"); -} - -static void reti(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) -{ - (*pc)++; - GB_attributed_log(gb, GB_LOG_UNDERLINE, "RETI\n"); -} - -static void call_a16(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) -{ - (*pc)++; - uint16_t addr = GB_read_memory(gb, *pc) | (GB_read_memory(gb, *pc + 1) << 8); - const char *symbol = GB_debugger_name_for_address(gb, 0xff00 + addr); - if (symbol) { - GB_log(gb, "CALL %s ; =$%04x\n", symbol, addr); - } - else { - GB_log(gb, "CALL $%04x\n", addr); - } - (*pc) += 2; -} - -static void ld_da8_a(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) -{ - (*pc)++; - uint8_t addr = GB_read_memory(gb, (*pc)++); - const char *symbol = GB_debugger_name_for_address(gb, 0xff00 + addr); - if (symbol) { - GB_log(gb, "LDH [%s & $FF], a ; =$%02x\n", symbol, addr); - } - else { - GB_log(gb, "LDH [$%02x], a\n", addr); - } -} - -static void ld_a_da8(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) -{ - (*pc)++; - uint8_t addr = GB_read_memory(gb, (*pc)++); - const char *symbol = GB_debugger_name_for_address(gb, 0xff00 + addr); - if (symbol) { - GB_log(gb, "LDH a, [%s & $FF] ; =$%02x\n", symbol, addr); - } - else { - GB_log(gb, "LDH a, [$%02x]\n", addr); - } -} - -static void ld_dc_a(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) -{ - (*pc)++; - GB_log(gb, "LDH [c], a\n"); -} - -static void ld_a_dc(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) -{ - (*pc)++; - GB_log(gb, "LDH a, [c]\n"); -} - -static void add_sp_r8(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) -{ - (*pc)++; - int8_t temp = GB_read_memory(gb, (*pc)++); - GB_log(gb, "ADD SP, %s$%02x\n", temp < 0? "-" : "", temp < 0? -temp : temp); -} - -static void jp_hl(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) -{ - (*pc)++; - GB_log(gb, "JP hl\n"); -} - -static void ld_da16_a(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) -{ - (*pc)++; - uint16_t addr = GB_read_memory(gb, *pc) | (GB_read_memory(gb, *pc + 1) << 8); - const char *symbol = GB_debugger_name_for_address(gb, addr); - if (symbol) { - GB_log(gb, "LD [%s], a ; =$%04x\n", symbol, addr); - } - else { - GB_log(gb, "LD [$%04x], a\n", addr); - } - (*pc) += 2; -} - -static void ld_a_da16(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) -{ - (*pc)++; - uint16_t addr = GB_read_memory(gb, *pc) | (GB_read_memory(gb, *pc + 1) << 8); - const char *symbol = GB_debugger_name_for_address(gb, addr); - if (symbol) { - GB_log(gb, "LD a, [%s] ; =$%04x\n", symbol, addr); - } - else { - GB_log(gb, "LD a, [$%04x]\n", addr); - } - (*pc) += 2; -} - -static void di(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) -{ - (*pc)++; - GB_log(gb, "DI\n"); -} - -static void ei(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) -{ - (*pc)++; - GB_log(gb, "EI\n"); -} - -static void ld_hl_sp_r8(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) -{ - (*pc)++; - int8_t temp = GB_read_memory(gb, (*pc)++); - GB_log(gb, "LD hl, sp, %s$%02x\n", temp < 0? "-" : "", temp < 0? -temp : temp); -} - -static void ld_sp_hl(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) -{ - (*pc)++; - GB_log(gb, "LD sp, hl\n"); -} - -static void rlc_r(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) -{ - (*pc)++; - GB_log(gb, "RLC %s\n", get_src_name(opcode)); -} - -static void rrc_r(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) -{ - (*pc)++; - GB_log(gb, "RRC %s\n", get_src_name(opcode)); -} - -static void rl_r(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) -{ - (*pc)++; - GB_log(gb, "RL %s\n", get_src_name(opcode)); -} - -static void rr_r(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) -{ - (*pc)++; - GB_log(gb, "RR %s\n", get_src_name(opcode)); -} - -static void sla_r(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) -{ - (*pc)++; - GB_log(gb, "SLA %s\n", get_src_name(opcode)); -} - -static void sra_r(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) -{ - (*pc)++; - GB_log(gb, "SRA %s\n", get_src_name(opcode)); -} - -static void srl_r(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) -{ - (*pc)++; - GB_log(gb, "SRL %s\n", get_src_name(opcode)); -} - -static void swap_r(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) -{ - (*pc)++; - GB_log(gb, "RLC %s\n", get_src_name(opcode)); -} - -static void bit_r(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) -{ - uint8_t bit; - (*pc)++; - bit = ((opcode >> 3) & 7); - if ((opcode & 0xC0) == 0x40) { /* Bit */ - GB_log(gb, "BIT %s, %d\n", get_src_name(opcode), bit); - } - else if ((opcode & 0xC0) == 0x80) { /* res */ - GB_log(gb, "RES %s, %d\n", get_src_name(opcode), bit); - } - else if ((opcode & 0xC0) == 0xC0) { /* set */ - GB_log(gb, "SET %s, %d\n", get_src_name(opcode), bit); - } -} - -static void cb_prefix(GB_gameboy_t *gb, uint8_t opcode, uint16_t *pc) -{ - opcode = GB_read_memory(gb, ++*pc); - switch (opcode >> 3) { - case 0: - rlc_r(gb, opcode, pc); - break; - case 1: - rrc_r(gb, opcode, pc); - break; - case 2: - rl_r(gb, opcode, pc); - break; - case 3: - rr_r(gb, opcode, pc); - break; - case 4: - sla_r(gb, opcode, pc); - break; - case 5: - sra_r(gb, opcode, pc); - break; - case 6: - swap_r(gb, opcode, pc); - break; - case 7: - srl_r(gb, opcode, pc); - break; - default: - bit_r(gb, opcode, pc); - break; - } -} - -static GB_opcode_t *opcodes[256] = { - /* X0 X1 X2 X3 X4 X5 X6 X7 */ - /* X8 X9 Xa Xb Xc Xd Xe Xf */ - nop, ld_rr_d16, ld_drr_a, inc_rr, inc_hr, dec_hr, ld_hr_d8, rlca, /* 0X */ - ld_da16_sp, add_hl_rr, ld_a_drr, dec_rr, inc_lr, dec_lr, ld_lr_d8, rrca, - stop, ld_rr_d16, ld_drr_a, inc_rr, inc_hr, dec_hr, ld_hr_d8, rla, /* 1X */ - jr_r8, add_hl_rr, ld_a_drr, dec_rr, inc_lr, dec_lr, ld_lr_d8, rra, - jr_cc_r8, ld_rr_d16, ld_dhli_a, inc_rr, inc_hr, dec_hr, ld_hr_d8, daa, /* 2X */ - jr_cc_r8, add_hl_rr, ld_a_dhli, dec_rr, inc_lr, dec_lr, ld_lr_d8, cpl, - jr_cc_r8, ld_rr_d16, ld_dhld_a, inc_rr, inc_dhl, dec_dhl, ld_dhl_d8, scf, /* 3X */ - jr_cc_r8, add_hl_rr, ld_a_dhld, dec_rr, inc_hr, dec_hr, ld_hr_d8, ccf, - ld_r_r, ld_r_r, ld_r_r, ld_r_r, ld_r_r, ld_r_r, ld_r_r, ld_r_r, /* 4X */ - ld_r_r, ld_r_r, ld_r_r, ld_r_r, ld_r_r, ld_r_r, ld_r_r, ld_r_r, - ld_r_r, ld_r_r, ld_r_r, ld_r_r, ld_r_r, ld_r_r, ld_r_r, ld_r_r, /* 5X */ - ld_r_r, ld_r_r, ld_r_r, ld_r_r, ld_r_r, ld_r_r, ld_r_r, ld_r_r, - ld_r_r, ld_r_r, ld_r_r, ld_r_r, ld_r_r, ld_r_r, ld_r_r, ld_r_r, /* 6X */ - ld_r_r, ld_r_r, ld_r_r, ld_r_r, ld_r_r, ld_r_r, ld_r_r, ld_r_r, - ld_r_r, ld_r_r, ld_r_r, ld_r_r, ld_r_r, ld_r_r, halt, ld_r_r, /* 7X */ - ld_r_r, ld_r_r, ld_r_r, ld_r_r, ld_r_r, ld_r_r, ld_r_r, ld_r_r, - add_a_r, add_a_r, add_a_r, add_a_r, add_a_r, add_a_r, add_a_r, add_a_r, /* 8X */ - adc_a_r, adc_a_r, adc_a_r, adc_a_r, adc_a_r, adc_a_r, adc_a_r, adc_a_r, - sub_a_r, sub_a_r, sub_a_r, sub_a_r, sub_a_r, sub_a_r, sub_a_r, sub_a_r, /* 9X */ - sbc_a_r, sbc_a_r, sbc_a_r, sbc_a_r, sbc_a_r, sbc_a_r, sbc_a_r, sbc_a_r, - and_a_r, and_a_r, and_a_r, and_a_r, and_a_r, and_a_r, and_a_r, and_a_r, /* aX */ - xor_a_r, xor_a_r, xor_a_r, xor_a_r, xor_a_r, xor_a_r, xor_a_r, xor_a_r, - or_a_r, or_a_r, or_a_r, or_a_r, or_a_r, or_a_r, or_a_r, or_a_r, /* bX */ - cp_a_r, cp_a_r, cp_a_r, cp_a_r, cp_a_r, cp_a_r, cp_a_r, cp_a_r, - ret_cc, pop_rr, jp_cc_a16, jp_a16, call_cc_a16,push_rr, add_a_d8, rst, /* cX */ - ret_cc, ret, jp_cc_a16, cb_prefix, call_cc_a16,call_a16, adc_a_d8, rst, - ret_cc, pop_rr, jp_cc_a16, ill, call_cc_a16,push_rr, sub_a_d8, rst, /* dX */ - ret_cc, reti, jp_cc_a16, ill, call_cc_a16,ill, sbc_a_d8, rst, - ld_da8_a, pop_rr, ld_dc_a, ill, ill, push_rr, and_a_d8, rst, /* eX */ - add_sp_r8, jp_hl, ld_da16_a, ill, ill, ill, xor_a_d8, rst, - ld_a_da8, pop_rr, ld_a_dc, di, ill, push_rr, or_a_d8, rst, /* fX */ - ld_hl_sp_r8,ld_sp_hl, ld_a_da16, ei, ill, ill, cp_a_d8, rst, -}; - - - -void GB_cpu_disassemble(GB_gameboy_t *gb, uint16_t pc, uint16_t count) -{ - const GB_bank_symbol_t *function_symbol = GB_debugger_find_symbol(gb, pc); - - if (function_symbol && pc - function_symbol->addr > 0x1000) { - function_symbol = NULL; - } - - if (function_symbol && pc != function_symbol->addr) { - GB_log(gb, "%s:\n", function_symbol->name); - } - - uint16_t current_function = function_symbol? function_symbol->addr : 0; - - while (count--) { - function_symbol = GB_debugger_find_symbol(gb, pc); - if (function_symbol && function_symbol->addr == pc) { - if (current_function != function_symbol->addr) { - GB_log(gb, "\n"); - } - GB_log(gb, "%s:\n", function_symbol->name); - } - if (function_symbol) { - GB_log(gb, "%s%04x <+%03x>: ", pc == gb->pc? " ->": " ", pc, pc - function_symbol->addr); - } - else { - GB_log(gb, "%s%04x: ", pc == gb->pc? " ->": " ", pc); - } - uint8_t opcode = GB_read_memory(gb, pc); - opcodes[opcode](gb, opcode, &pc); - } -} From f7bb894753caacaf994eaf51c2b61e71019bcce2 Mon Sep 17 00:00:00 2001 From: nattthebear Date: Sun, 16 Jul 2017 20:36:58 -0400 Subject: [PATCH 22/93] sameboy: it's alive! --- .../Consoles/Nintendo/Gameboy/Sameboy.cs | 4 +- waterbox/sameboy/Makefile | 5 +- waterbox/sameboy/bizhawk.cpp | 14 +- waterbox/sameboy/camera.c | 2 +- waterbox/sameboy/display.c | 7 - waterbox/sameboy/gb.c | 40 +-- waterbox/sameboy/gb.h | 42 +-- waterbox/sameboy/joypad.c | 7 - waterbox/sameboy/memory.c | 4 - waterbox/sameboy/save_state.c | 304 ------------------ waterbox/sameboy/save_state.h | 24 -- waterbox/sameboy/symbol_hash.c | 106 ------ waterbox/sameboy/symbol_hash.h | 37 --- waterbox/sameboy/timing.c | 65 +--- waterbox/sameboy/timing.h | 3 - waterbox/sameboy/z80_cpu.c | 4 +- 16 files changed, 31 insertions(+), 637 deletions(-) delete mode 100644 waterbox/sameboy/save_state.c delete mode 100644 waterbox/sameboy/save_state.h delete mode 100644 waterbox/sameboy/symbol_hash.c delete mode 100644 waterbox/sameboy/symbol_hash.h diff --git a/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/Sameboy.cs b/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/Sameboy.cs index 453aaf65a0..8d93b7521f 100644 --- a/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/Sameboy.cs +++ b/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/Sameboy.cs @@ -59,8 +59,8 @@ namespace BizHawk.Emulation.Cores.Consoles.Nintendo.Gameboy _cgb = (rom[0x143] & 0xc0) == 0xc0; Console.WriteLine("Automaticly detected CGB to " + _cgb); - var bios = Util.DecompressGzipFile(new MemoryStream( - _cgb ? Resources.SameboyCgbBoot : Resources.SameboyDmgBoot)); + var bios = Util.DecompressGzipFile(new MemoryStream(_cgb ? Resources.SameboyCgbBoot : Resources.SameboyDmgBoot)); + // var bios = comm.CoreFileProvider.GetFirmware(_cgb ? "GBC" : "GB", "World", true); _exe.AddReadonlyFile(rom, "game.rom"); _exe.AddReadonlyFile(bios, "boot.rom"); diff --git a/waterbox/sameboy/Makefile b/waterbox/sameboy/Makefile index f3824c30ee..640a98f0d7 100644 --- a/waterbox/sameboy/Makefile +++ b/waterbox/sameboy/Makefile @@ -6,12 +6,11 @@ FLAGS:=-Wall -Werror=pointer-to-int-cast -Werror=int-to-pointer-cast -Werror=imp -fomit-frame-pointer -fvisibility=hidden \ -O0 -g -CCFLAGS:=$(FLAGS) -Ilib \ - -I../emulibc \ +CCFLAGS:=$(FLAGS) \ -std=gnu99 \ -DLSB_FIRST -D_GNU_SOURCE -DGB_INTERNAL -CPPFLAGS:=$(FLAGS) -DSPC_NO_COPY_STATE_FUNCS -std=c++0x +CPPFLAGS:=$(FLAGS) -DSPC_NO_COPY_STATE_FUNCS -std=c++0x -D_GNU_SOURCE -DGB_INTERNAL TARGET = sameboy.wbx diff --git a/waterbox/sameboy/bizhawk.cpp b/waterbox/sameboy/bizhawk.cpp index 81b31201d0..15f462da84 100644 --- a/waterbox/sameboy/bizhawk.cpp +++ b/waterbox/sameboy/bizhawk.cpp @@ -65,6 +65,9 @@ ECL_EXPORT bool Init(bool cgb) GB_set_infrared_callback(&GB, InfraredCallback); GB_set_rumble_callback(&GB, RumbleCallback); + GB_set_sample_rate(&GB, 44100); + GB_set_audio_quality(&GB, 1); + return true; } @@ -76,9 +79,12 @@ struct MyFrameInfo : public FrameInfo ECL_EXPORT void FrameAdvance(MyFrameInfo &f) { GB_set_pixels_output(&GB, f.VideoBuffer); - // void GB_set_key_state(GB_gameboy_t *gb, GB_key_t index, bool pressed); - GB_run_frame(&GB); - f.Samples = 735; + for (int i = 0; i < (int)GB_KEY_MAX; i++) + GB_set_key_state(&GB, (GB_key_t)i, false); + + f.Cycles = GB_run_cycles(&GB, 35112); + f.Samples = GB_apu_get_current_buffer_length(&GB); + GB_apu_copy_buffer(&GB, (GB_sample_t*)f.SoundBuffer, f.Samples); f.Width = 160; f.Height = 144; } @@ -104,7 +110,7 @@ ECL_EXPORT void GetMemoryAreas(MemoryArea *m) SetMemoryArea(m + 6, GB_DIRECT_ACCESS_IO, "IO", MEMORYAREA_FLAGS_WORDSIZE1); SetMemoryArea(m + 7, GB_DIRECT_ACCESS_BOOTROM, "BOOTROM", MEMORYAREA_FLAGS_WORDSIZE1); SetMemoryArea(m + 8, GB_DIRECT_ACCESS_BGP, "BGP", MEMORYAREA_FLAGS_WORDSIZE1 | MEMORYAREA_FLAGS_WRITABLE); - SetMemoryArea(m + 8, GB_DIRECT_ACCESS_OBP, "OBP", MEMORYAREA_FLAGS_WORDSIZE1 | MEMORYAREA_FLAGS_WRITABLE); + SetMemoryArea(m + 9, GB_DIRECT_ACCESS_OBP, "OBP", MEMORYAREA_FLAGS_WORDSIZE1 | MEMORYAREA_FLAGS_WRITABLE); } ECL_EXPORT void SetInputCallback(void (*callback)()) diff --git a/waterbox/sameboy/camera.c b/waterbox/sameboy/camera.c index 9b34998af3..6ce2c0d89e 100644 --- a/waterbox/sameboy/camera.c +++ b/waterbox/sameboy/camera.c @@ -125,7 +125,7 @@ void GB_camera_write_register(GB_gameboy_t *gb, uint16_t addr, uint8_t value) addr &= 0x7F; if (addr == GB_CAMERA_SHOOT_AND_1D_FLAGS) { value &= 0x7; - noise_seed = rand(); + noise_seed = 42; // rand(); if ((value & 1) && !(gb->camera_registers[GB_CAMERA_SHOOT_AND_1D_FLAGS] & 1) && gb->camera_update_request_callback) { /* If no callback is set, ignore the write as if the camera is instantly done */ gb->camera_registers[GB_CAMERA_SHOOT_AND_1D_FLAGS] |= 1; diff --git a/waterbox/sameboy/display.c b/waterbox/sameboy/display.c index e624ac93b6..d2ee911619 100644 --- a/waterbox/sameboy/display.c +++ b/waterbox/sameboy/display.c @@ -197,12 +197,6 @@ static uint32_t get_pixel(GB_gameboy_t *gb, uint8_t x, uint8_t y) static void display_vblank(GB_gameboy_t *gb) { - if (gb->turbo) { - if (GB_timing_sync_turbo(gb)) { - return; - } - } - if (!gb->disable_rendering && ((!(gb->io_registers[GB_IO_LCDC] & 0x80) || gb->stopped) || gb->frame_skip_state == GB_FRAMESKIP_LCD_TURNED_ON)) { /* LCD is off, set screen to white */ uint32_t white = gb->rgb_encode_callback(gb, 0xFF, 0xFF, 0xFF); @@ -212,7 +206,6 @@ static void display_vblank(GB_gameboy_t *gb) } gb->vblank_callback(gb); - GB_timing_sync(gb); gb->vblank_just_occured = true; } diff --git a/waterbox/sameboy/gb.c b/waterbox/sameboy/gb.c index d464734c4e..475d48f881 100644 --- a/waterbox/sameboy/gb.c +++ b/waterbox/sameboy/gb.c @@ -133,18 +133,6 @@ void GB_free(GB_gameboy_t *gb) if (gb->breakpoints) { free(gb->breakpoints); } - for (int i = 0x200; i--;) { - if (gb->bank_symbols[i]) { - GB_map_free(gb->bank_symbols[i]); - } - } - for (int i = 0x400; i--;) { - if (gb->reversed_symbol_map.buckets[i]) { - GB_symbol_t *next = gb->reversed_symbol_map.buckets[i]->next; - free(gb->reversed_symbol_map.buckets[i]); - gb->reversed_symbol_map.buckets[i] = next; - } - } memset(gb, 0, sizeof(*gb)); } @@ -267,24 +255,20 @@ void GB_run(GB_gameboy_t *gb) } } -uint64_t GB_run_frame(GB_gameboy_t *gb) +uint64_t GB_run_cycles(GB_gameboy_t *gb, uint32_t cycles) { - /* Configure turbo temporarily, the user wants to handle FPS capping manually. */ - bool old_turbo = gb->turbo; - bool old_dont_skip = gb->turbo_dont_skip; - gb->turbo = true; - gb->turbo_dont_skip = true; - - gb->cycles_since_last_sync = 0; - while (true) { + uint64_t start = gb->cycles_since_epoch; + uint64_t target = start + cycles; + while (gb->cycles_since_epoch < target) { GB_run(gb); if (gb->vblank_just_occured) { + // TODO: fix these up + GB_update_joyp(gb); + GB_rtc_run(gb); break; } } - gb->turbo = old_turbo; - gb->turbo_dont_skip = old_dont_skip; - return gb->cycles_since_last_sync * FRAME_LENGTH * LCDC_PERIOD; + return gb->cycles_since_epoch - start; } void GB_set_pixels_output(GB_gameboy_t *gb, uint32_t *output) @@ -416,12 +400,6 @@ bool GB_is_cgb(GB_gameboy_t *gb) return gb->is_cgb; } -void GB_set_turbo_mode(GB_gameboy_t *gb, bool on, bool no_frame_skip) -{ - gb->turbo = on; - gb->turbo_dont_skip = no_frame_skip; -} - void GB_set_rendering_disabled(GB_gameboy_t *gb, bool disabled) { gb->disable_rendering = disabled; @@ -441,7 +419,7 @@ void GB_reset(GB_gameboy_t *gb) { uint32_t mbc_ram_size = gb->mbc_ram_size; bool cgb = gb->is_cgb; - memset(gb, 0, (size_t)GB_GET_SECTION((GB_gameboy_t *) 0, unsaved)); + // memset(gb, 0, (size_t)GB_GET_SECTION((GB_gameboy_t *) 0, unsaved)); gb->version = GB_STRUCT_VERSION; gb->mbc_rom_bank = 1; diff --git a/waterbox/sameboy/gb.h b/waterbox/sameboy/gb.h index 4d7588b644..a80b89e5ec 100644 --- a/waterbox/sameboy/gb.h +++ b/waterbox/sameboy/gb.h @@ -4,9 +4,9 @@ #include #include #include +#include #include "gb_struct_def.h" -#include "save_state.h" #include "apu.h" #include "camera.h" @@ -17,7 +17,6 @@ #include "printer.h" #include "timing.h" #include "z80_cpu.h" -#include "symbol_hash.h" #define GB_STRUCT_VERSION 11 @@ -193,7 +192,6 @@ struct GB_gameboy_s { #else struct GB_gameboy_internal_s { #endif - GB_SECTION(header, /* The magic makes sure a state file is: - Indeed a SameBoy state file. - Has the same endianess has the current platform. */ @@ -201,9 +199,7 @@ struct GB_gameboy_internal_s { /* The version field makes sure we don't load save state files with a completely different structure. This happens when struct fields are removed/resized in an backward incompatible manner. */ uint32_t version; - ); - - GB_SECTION(core_state, + /* Registers */ uint16_t pc; union { @@ -249,10 +245,8 @@ struct GB_gameboy_internal_s { /* Misc state */ bool infrared_input; GB_printer_t printer; - ); /* DMA and HDMA */ - GB_SECTION(dma, bool hdma_on; bool hdma_on_hblank; uint8_t hdma_steps_left; @@ -264,10 +258,8 @@ struct GB_gameboy_internal_s { uint16_t dma_current_src; int16_t dma_cycles; bool is_dma_restarting; - ); /* MBC */ - GB_SECTION(mbc, uint16_t mbc_rom_bank; uint8_t mbc_ram_bank; uint32_t mbc_ram_size; @@ -311,32 +303,23 @@ struct GB_gameboy_internal_s { bool camera_registers_mapped; uint8_t camera_registers[0x36]; bool rumble_state; - ); /* HRAM and HW Registers */ - GB_SECTION(hram, uint8_t hram[0xFFFF - 0xFF80]; uint8_t io_registers[0x80]; - ); /* Timing */ - GB_SECTION(timing, uint32_t display_cycles; uint32_t div_cycles; uint8_t tima_reload_state; /* After TIMA overflows, it becomes 0 for 4 cycles before actually reloading. */ - GB_PADDING(uint16_t, serial_cycles); uint16_t serial_cycles; /* This field changed its meaning in v0.10 */ uint16_t serial_length; - ); /* APU */ - GB_SECTION(apu, GB_apu_t apu; - ); /* RTC */ - GB_SECTION(rtc, union { struct { uint8_t seconds; @@ -349,10 +332,8 @@ struct GB_gameboy_internal_s { } rtc_real, rtc_latched; time_t last_rtc_second; bool rtc_latch; - ); /* Video Display */ - GB_SECTION(video, uint32_t vram_size; // Different between CGB and DMG uint8_t cgb_vram_bank; uint8_t oam[0xA0]; @@ -379,11 +360,9 @@ struct GB_gameboy_internal_s { bool vram_read_blocked; bool oam_write_blocked; bool vram_write_blocked; - ); /* Unsaved data. This includes all pointers, as well as everything that shouldn't be on a save state */ /* This data is reserved on reset and must come last in the struct */ - GB_SECTION(unsaved, /* ROM */ uint8_t *rom; uint32_t rom_size; @@ -404,8 +383,7 @@ struct GB_gameboy_internal_s { bool keys[GB_KEY_MAX]; /* Timing */ - uint64_t last_sync; - uint64_t cycles_since_last_sync; + uint64_t cycles_since_epoch; /* Audio */ unsigned buffer_size; @@ -459,21 +437,11 @@ struct GB_gameboy_internal_s { uint16_t addr; } backtrace_returns[0x200]; - /* Symbol tables */ - GB_symbol_map_t *bank_symbols[0x200]; - GB_reversed_symbol_map_t reversed_symbol_map; - - /* Ticks command */ - unsigned long debugger_ticks; - /* Misc */ - bool turbo; - bool turbo_dont_skip; bool disable_rendering; uint32_t ram_size; // Different between CGB and DMG uint8_t boot_rom[0x900]; bool vblank_just_occured; // For slow operations involving syscalls; these should only run once per vblank - ); }; #ifndef GB_INTERNAL @@ -497,8 +465,7 @@ void GB_free(GB_gameboy_t *gb); void GB_reset(GB_gameboy_t *gb); void GB_switch_model_and_reset(GB_gameboy_t *gb, bool is_cgb); void GB_run(GB_gameboy_t *gb); -/* Returns the time passed since the last frame, in nanoseconds */ -uint64_t GB_run_frame(GB_gameboy_t *gb); +uint64_t GB_run_cycles(GB_gameboy_t *gb, uint32_t cycles); typedef enum { GB_DIRECT_ACCESS_ROM, @@ -526,7 +493,6 @@ int GB_load_rom(GB_gameboy_t *gb, const char *path); int GB_save_battery(GB_gameboy_t *gb, const char *path); void GB_load_battery(GB_gameboy_t *gb, const char *path); -void GB_set_turbo_mode(GB_gameboy_t *gb, bool on, bool no_frame_skip); void GB_set_rendering_disabled(GB_gameboy_t *gb, bool disabled); void GB_log(GB_gameboy_t *gb, const char *fmt, ...) __printflike(2, 3); diff --git a/waterbox/sameboy/joypad.c b/waterbox/sameboy/joypad.c index c5c4f08961..21e6d666b0 100644 --- a/waterbox/sameboy/joypad.c +++ b/waterbox/sameboy/joypad.c @@ -22,13 +22,6 @@ void GB_update_joyp(GB_gameboy_t *gb) for (uint8_t i = 0; i < 4; i++) { gb->io_registers[GB_IO_JOYP] |= (!gb->keys[i]) << i; } - /* Forbid pressing two opposing keys, this breaks a lot of games; even if it's somewhat possible. */ - if (!(gb->io_registers[GB_IO_JOYP] & 1)) { - gb->io_registers[GB_IO_JOYP] |= 2; - } - if (!(gb->io_registers[GB_IO_JOYP] & 4)) { - gb->io_registers[GB_IO_JOYP] |= 8; - } break; case 1: diff --git a/waterbox/sameboy/memory.c b/waterbox/sameboy/memory.c index f694d210a4..3e34895c97 100644 --- a/waterbox/sameboy/memory.c +++ b/waterbox/sameboy/memory.c @@ -456,10 +456,6 @@ static void write_high_memory(GB_gameboy_t *gb, uint16_t addr, uint8_t value) gb->frame_skip_state = GB_FRAMESKIP_LCD_TURNED_ON; } } - else if (!(value & 0x80) && (gb->io_registers[GB_IO_LCDC] & 0x80)) { - /* Sync after turning off LCD */ - GB_timing_sync(gb); - } gb->io_registers[GB_IO_LCDC] = value; return; diff --git a/waterbox/sameboy/save_state.c b/waterbox/sameboy/save_state.c deleted file mode 100644 index cd579aa800..0000000000 --- a/waterbox/sameboy/save_state.c +++ /dev/null @@ -1,304 +0,0 @@ -#include "gb.h" -#include -#include - -static bool dump_section(FILE *f, const void *src, uint32_t size) -{ - if (fwrite(&size, 1, sizeof(size), f) != sizeof(size)) { - return false; - } - - if (fwrite(src, 1, size, f) != size) { - return false; - } - - return true; -} - -#define DUMP_SECTION(gb, f, section) dump_section(f, GB_GET_SECTION(gb, section), GB_SECTION_SIZE(section)) - -/* Todo: we need a sane and protable save state format. */ -int GB_save_state(GB_gameboy_t *gb, const char *path) -{ - FILE *f = fopen(path, "wb"); - if (!f) { - GB_log(gb, "Could not open save state: %s.\n", strerror(errno)); - return errno; - } - - if (fwrite(GB_GET_SECTION(gb, header), 1, GB_SECTION_SIZE(header), f) != GB_SECTION_SIZE(header)) goto error; - if (!DUMP_SECTION(gb, f, core_state)) goto error; - if (!DUMP_SECTION(gb, f, dma )) goto error; - if (!DUMP_SECTION(gb, f, mbc )) goto error; - if (!DUMP_SECTION(gb, f, hram )) goto error; - if (!DUMP_SECTION(gb, f, timing )) goto error; - if (!DUMP_SECTION(gb, f, apu )) goto error; - if (!DUMP_SECTION(gb, f, rtc )) goto error; - if (!DUMP_SECTION(gb, f, video )) goto error; - - - if (fwrite(gb->mbc_ram, 1, gb->mbc_ram_size, f) != gb->mbc_ram_size) { - goto error; - } - - if (fwrite(gb->ram, 1, gb->ram_size, f) != gb->ram_size) { - goto error; - } - - if (fwrite(gb->vram, 1, gb->vram_size, f) != gb->vram_size) { - goto error; - } - - errno = 0; - -error: - fclose(f); - return errno; -} - -#undef DUMP_SECTION - -size_t GB_get_save_state_size(GB_gameboy_t *gb) -{ - return GB_SECTION_SIZE(header) - + GB_SECTION_SIZE(core_state) + sizeof(uint32_t) - + GB_SECTION_SIZE(dma ) + sizeof(uint32_t) - + GB_SECTION_SIZE(mbc ) + sizeof(uint32_t) - + GB_SECTION_SIZE(hram ) + sizeof(uint32_t) - + GB_SECTION_SIZE(timing ) + sizeof(uint32_t) - + GB_SECTION_SIZE(apu ) + sizeof(uint32_t) - + GB_SECTION_SIZE(rtc ) + sizeof(uint32_t) - + GB_SECTION_SIZE(video ) + sizeof(uint32_t) - + gb->mbc_ram_size - + gb->ram_size - + gb->vram_size; -} - -/* A write-line function for memory copying */ -static void buffer_write(const void *src, size_t size, uint8_t **dest) -{ - memcpy(*dest, src, size); - *dest += size; -} - -static void buffer_dump_section(uint8_t **buffer, const void *src, uint32_t size) -{ - buffer_write(&size, sizeof(size), buffer); - buffer_write(src, size, buffer); -} - -#define DUMP_SECTION(gb, buffer, section) buffer_dump_section(&buffer, GB_GET_SECTION(gb, section), GB_SECTION_SIZE(section)) -void GB_save_state_to_buffer(GB_gameboy_t *gb, uint8_t *buffer) -{ - buffer_write(GB_GET_SECTION(gb, header), GB_SECTION_SIZE(header), &buffer); - DUMP_SECTION(gb, buffer, core_state); - DUMP_SECTION(gb, buffer, dma ); - DUMP_SECTION(gb, buffer, mbc ); - DUMP_SECTION(gb, buffer, hram ); - DUMP_SECTION(gb, buffer, timing ); - DUMP_SECTION(gb, buffer, apu ); - DUMP_SECTION(gb, buffer, rtc ); - DUMP_SECTION(gb, buffer, video ); - - - buffer_write(gb->mbc_ram, gb->mbc_ram_size, &buffer); - buffer_write(gb->ram, gb->ram_size, &buffer); - buffer_write(gb->vram, gb->vram_size, &buffer); -} - -/* Best-effort read function for maximum future compatibility. */ -static bool read_section(FILE *f, void *dest, uint32_t size) -{ - uint32_t saved_size = 0; - if (fread(&saved_size, 1, sizeof(size), f) != sizeof(size)) { - return false; - } - - if (saved_size <= size) { - if (fread(dest, 1, saved_size, f) != saved_size) { - return false; - } - } - else { - if (fread(dest, 1, size, f) != size) { - return false; - } - fseek(f, saved_size - size, SEEK_CUR); - } - - return true; -} -#undef DUMP_SECTION - -static bool verify_state_compatibility(GB_gameboy_t *gb, GB_gameboy_t *save) -{ - if (gb->magic != save->magic) { - GB_log(gb, "File is not a save state, or is from an incompatible operating system.\n"); - return false; - } - - if (gb->version != save->version) { - GB_log(gb, "Save state is for a different version of SameBoy.\n"); - return false; - } - - if (gb->mbc_ram_size < save->mbc_ram_size) { - GB_log(gb, "Save state has non-matching MBC RAM size.\n"); - return false; - } - - if (gb->ram_size != save->ram_size) { - GB_log(gb, "Save state has non-matching RAM size. Try changing emulated model.\n"); - return false; - } - - if (gb->vram_size != save->vram_size) { - GB_log(gb, "Save state has non-matching VRAM size. Try changing emulated model.\n"); - return false; - } - - return true; -} - -#define READ_SECTION(gb, f, section) read_section(f, GB_GET_SECTION(gb, section), GB_SECTION_SIZE(section)) - -int GB_load_state(GB_gameboy_t *gb, const char *path) -{ - GB_gameboy_t save; - - /* Every unread value should be kept the same. */ - memcpy(&save, gb, sizeof(save)); - - FILE *f = fopen(path, "rb"); - if (!f) { - GB_log(gb, "Could not open save state: %s.\n", strerror(errno)); - return errno; - } - - if (fread(GB_GET_SECTION(&save, header), 1, GB_SECTION_SIZE(header), f) != GB_SECTION_SIZE(header)) goto error; - if (!READ_SECTION(&save, f, core_state)) goto error; - if (!READ_SECTION(&save, f, dma )) goto error; - if (!READ_SECTION(&save, f, mbc )) goto error; - if (!READ_SECTION(&save, f, hram )) goto error; - if (!READ_SECTION(&save, f, timing )) goto error; - if (!READ_SECTION(&save, f, apu )) goto error; - if (!READ_SECTION(&save, f, rtc )) goto error; - if (!READ_SECTION(&save, f, video )) goto error; - - if (!verify_state_compatibility(gb, &save)) { - errno = -1; - goto error; - } - - memset(gb->mbc_ram + save.mbc_ram_size, 0xFF, gb->mbc_ram_size - save.mbc_ram_size); - if (fread(gb->mbc_ram, 1, save.mbc_ram_size, f) != save.mbc_ram_size) { - fclose(f); - return EIO; - } - - if (fread(gb->ram, 1, gb->ram_size, f) != gb->ram_size) { - fclose(f); - return EIO; - } - - if (fread(gb->vram, 1, gb->vram_size, f) != gb->vram_size) { - fclose(f); - return EIO; - } - - memcpy(gb, &save, sizeof(save)); - errno = 0; - - if (gb->cartridge_type->has_rumble && gb->rumble_callback) { - gb->rumble_callback(gb, gb->rumble_state); - } - -error: - fclose(f); - return errno; -} - -#undef READ_SECTION - -/* An read-like function for buffer-copying */ -static size_t buffer_read(void *dest, size_t length, const uint8_t **buffer, size_t *buffer_length) -{ - if (length > *buffer_length) { - length = *buffer_length; - } - - memcpy(dest, *buffer, length); - *buffer += length; - *buffer_length -= length; - - return length; -} - -static bool buffer_read_section(const uint8_t **buffer, size_t *buffer_length, void *dest, uint32_t size) -{ - uint32_t saved_size = 0; - if (buffer_read(&saved_size, sizeof(size), buffer, buffer_length) != sizeof(size)) { - return false; - } - - if (saved_size <= size) { - if (buffer_read(dest, saved_size, buffer, buffer_length) != saved_size) { - return false; - } - } - else { - if (buffer_read(dest, size, buffer, buffer_length) != size) { - return false; - } - *buffer += saved_size - size; - *buffer_length -= saved_size - size; - } - - return true; -} - -#define READ_SECTION(gb, buffer, length, section) buffer_read_section(&buffer, &length, GB_GET_SECTION(gb, section), GB_SECTION_SIZE(section)) -int GB_load_state_from_buffer(GB_gameboy_t *gb, const uint8_t *buffer, size_t length) -{ - GB_gameboy_t save; - - /* Every unread value should be kept the same. */ - memcpy(&save, gb, sizeof(save)); - - if (buffer_read(GB_GET_SECTION(&save, header), GB_SECTION_SIZE(header), &buffer, &length) != GB_SECTION_SIZE(header)) return -1; - if (!READ_SECTION(&save, buffer, length, core_state)) return -1; - if (!READ_SECTION(&save, buffer, length, dma )) return -1; - if (!READ_SECTION(&save, buffer, length, mbc )) return -1; - if (!READ_SECTION(&save, buffer, length, hram )) return -1; - if (!READ_SECTION(&save, buffer, length, timing )) return -1; - if (!READ_SECTION(&save, buffer, length, apu )) return -1; - if (!READ_SECTION(&save, buffer, length, rtc )) return -1; - if (!READ_SECTION(&save, buffer, length, video )) return -1; - - if (!verify_state_compatibility(gb, &save)) { - return -1; - } - - memset(gb->mbc_ram + save.mbc_ram_size, 0xFF, gb->mbc_ram_size - save.mbc_ram_size); - if (buffer_read(gb->mbc_ram, save.mbc_ram_size, &buffer, &length) != save.mbc_ram_size) { - return -1; - } - - if (buffer_read(gb->ram, gb->ram_size, &buffer, &length) != gb->ram_size) { - return -1; - } - - if (buffer_read(gb->vram,gb->vram_size, &buffer, &length) != gb->vram_size) { - return -1; - } - - memcpy(gb, &save, sizeof(save)); - - if (gb->cartridge_type->has_rumble && gb->rumble_callback) { - gb->rumble_callback(gb, gb->rumble_state); - } - - return 0; -} - -#undef READ_SECTION diff --git a/waterbox/sameboy/save_state.h b/waterbox/sameboy/save_state.h deleted file mode 100644 index 546ac2d95a..0000000000 --- a/waterbox/sameboy/save_state.h +++ /dev/null @@ -1,24 +0,0 @@ -/* Macros to make the GB_gameboy_t struct more future compatible when state saving */ -#ifndef save_state_h -#define save_state_h -#include - -#define GB_PADDING(type, old_usage) type old_usage##__do_not_use - -#define GB_SECTION(name, ...) __attribute__ ((aligned (8))) struct {} name##_section_start; __VA_ARGS__; struct {} name##_section_end -#define GB_SECTION_OFFSET(name) (offsetof(GB_gameboy_t, name##_section_start)) -#define GB_SECTION_SIZE(name) (offsetof(GB_gameboy_t, name##_section_end) - offsetof(GB_gameboy_t, name##_section_start)) -#define GB_GET_SECTION(gb, name) ((void*)&((gb)->name##_section_start)) - -#define GB_aligned_double __attribute__ ((aligned (8))) double - - -/* Public calls related to save states */ -int GB_save_state(GB_gameboy_t *gb, const char *path); -size_t GB_get_save_state_size(GB_gameboy_t *gb); -/* Assumes buffer is big enough to contain the save state. Use with GB_get_save_state_size(). */ -void GB_save_state_to_buffer(GB_gameboy_t *gb, uint8_t *buffer); - -int GB_load_state(GB_gameboy_t *gb, const char *path); -int GB_load_state_from_buffer(GB_gameboy_t *gb, const uint8_t *buffer, size_t length); -#endif /* save_state_h */ diff --git a/waterbox/sameboy/symbol_hash.c b/waterbox/sameboy/symbol_hash.c deleted file mode 100644 index 709421c233..0000000000 --- a/waterbox/sameboy/symbol_hash.c +++ /dev/null @@ -1,106 +0,0 @@ -#include "gb.h" - -static size_t GB_map_find_symbol_index(GB_symbol_map_t *map, uint16_t addr) -{ - if (!map->symbols) { - return 0; - } - ssize_t min = 0; - ssize_t max = map->n_symbols; - while (min < max) { - size_t pivot = (min + max) / 2; - if (map->symbols[pivot].addr == addr) return pivot; - if (map->symbols[pivot].addr > addr) { - max = pivot; - } - else { - min = pivot + 1; - } - } - return (size_t) min; -} - -GB_bank_symbol_t *GB_map_add_symbol(GB_symbol_map_t *map, uint16_t addr, const char *name) -{ - size_t index = GB_map_find_symbol_index(map, addr); - - if (index < map->n_symbols && map->symbols[index].addr == addr) return NULL; - - map->symbols = realloc(map->symbols, (map->n_symbols + 1) * sizeof(map->symbols[0])); - memmove(&map->symbols[index + 1], &map->symbols[index], (map->n_symbols - index) * sizeof(map->symbols[0])); - map->symbols[index].addr = addr; - map->symbols[index].name = strdup(name); - map->n_symbols++; - return &map->symbols[index]; -} - -const GB_bank_symbol_t *GB_map_find_symbol(GB_symbol_map_t *map, uint16_t addr) -{ - if (!map) return NULL; - size_t index = GB_map_find_symbol_index(map, addr); - if (index < map->n_symbols && map->symbols[index].addr != addr) { - index--; - } - if (index < map->n_symbols) { - return &map->symbols[index]; - } - return NULL; -} - -GB_symbol_map_t *GB_map_alloc(void) -{ - GB_symbol_map_t *map = malloc(sizeof(*map)); - memset(map, 0, sizeof(*map)); - return map; -} - -void GB_map_free(GB_symbol_map_t *map) -{ - for (unsigned i = 0; i < map->n_symbols; i++) { - free(map->symbols[i].name); - } - - if (map->symbols) { - free(map->symbols); - } - - free(map); -} - -static int hash_name(const char *name) -{ - int r = 0; - while (*name) { - r <<= 1; - if (r & 0x400) { - r ^= 0x401; - } - r += (unsigned char)*(name++); - } - - return r & 0x3FF; -} - -void GB_reversed_map_add_symbol(GB_reversed_symbol_map_t *map, uint16_t bank, GB_bank_symbol_t *bank_symbol) -{ - int hash = hash_name(bank_symbol->name); - GB_symbol_t *symbol = malloc(sizeof(*symbol)); - symbol->name = bank_symbol->name; - symbol->addr = bank_symbol->addr; - symbol->bank = bank; - symbol->next = map->buckets[hash]; - map->buckets[hash] = symbol; -} - -const GB_symbol_t *GB_reversed_map_find_symbol(GB_reversed_symbol_map_t *map, const char *name) -{ - int hash = hash_name(name); - GB_symbol_t *symbol = map->buckets[hash]; - - while (symbol) { - if (strcmp(symbol->name, name) == 0) return symbol; - symbol = symbol->next; - } - - return NULL; -} diff --git a/waterbox/sameboy/symbol_hash.h b/waterbox/sameboy/symbol_hash.h deleted file mode 100644 index 239b0e313e..0000000000 --- a/waterbox/sameboy/symbol_hash.h +++ /dev/null @@ -1,37 +0,0 @@ -#ifndef symbol_hash_h -#define symbol_hash_h - -#include -#include - -typedef struct { - char *name; - uint16_t addr; -} GB_bank_symbol_t; - -typedef struct GB_symbol_s { - struct GB_symbol_s *next; - const char *name; - uint16_t bank; - uint16_t addr; -} GB_symbol_t; - -typedef struct { - GB_bank_symbol_t *symbols; - size_t n_symbols; -} GB_symbol_map_t; - -typedef struct { - GB_symbol_t *buckets[0x400]; -} GB_reversed_symbol_map_t; - -#ifdef GB_INTERNAL -void GB_reversed_map_add_symbol(GB_reversed_symbol_map_t *map, uint16_t bank, GB_bank_symbol_t *symbol); -const GB_symbol_t *GB_reversed_map_find_symbol(GB_reversed_symbol_map_t *map, const char *name); -GB_bank_symbol_t *GB_map_add_symbol(GB_symbol_map_t *map, uint16_t addr, const char *name); -const GB_bank_symbol_t *GB_map_find_symbol(GB_symbol_map_t *map, uint16_t addr); -GB_symbol_map_t *GB_map_alloc(void); -void GB_map_free(GB_symbol_map_t *map); -#endif - -#endif /* symbol_hash_h */ diff --git a/waterbox/sameboy/timing.c b/waterbox/sameboy/timing.c index d53c85a014..6e6c81e752 100644 --- a/waterbox/sameboy/timing.c +++ b/waterbox/sameboy/timing.c @@ -6,69 +6,6 @@ #include #endif -static int64_t get_nanoseconds(void) -{ -#ifndef _WIN32 - struct timeval now; - gettimeofday(&now, NULL); - return (now.tv_usec) * 1000 + now.tv_sec * 1000000000L; -#else - FILETIME time; - GetSystemTimeAsFileTime(&time); - return (((int64_t)time.dwHighDateTime << 32) | time.dwLowDateTime) * 100L; -#endif -} - -static void nsleep(uint64_t nanoseconds) -{ -#ifndef _WIN32 - struct timespec sleep = {0, nanoseconds}; - nanosleep(&sleep, NULL); -#else - HANDLE timer; - LARGE_INTEGER time; - timer = CreateWaitableTimer(NULL, true, NULL); - time.QuadPart = -(nanoseconds / 100L); - SetWaitableTimer(timer, &time, 0, NULL, NULL, false); - WaitForSingleObject(timer, INFINITE); - CloseHandle(timer); -#endif -} - -bool GB_timing_sync_turbo(GB_gameboy_t *gb) -{ - if (!gb->turbo_dont_skip) { - int64_t nanoseconds = get_nanoseconds(); - if (nanoseconds <= gb->last_sync + FRAME_LENGTH) { - return true; - } - gb->last_sync = nanoseconds; - } - return false; -} - -void GB_timing_sync(GB_gameboy_t *gb) -{ - if (gb->turbo) { - gb->cycles_since_last_sync = 0; - return; - } - /* Prevent syncing if not enough time has passed.*/ - if (gb->cycles_since_last_sync < LCDC_PERIOD / 4) return; - - uint64_t target_nanoseconds = gb->cycles_since_last_sync * FRAME_LENGTH / LCDC_PERIOD; - int64_t nanoseconds = get_nanoseconds(); - if (labs((signed long)(nanoseconds - gb->last_sync)) < target_nanoseconds ) { - nsleep(target_nanoseconds + gb->last_sync - nanoseconds); - gb->last_sync += target_nanoseconds; - } - else { - gb->last_sync = nanoseconds; - } - - gb->cycles_since_last_sync = 0; -} - static void GB_ir_run(GB_gameboy_t *gb) { if (gb->ir_queue_length == 0) return; @@ -136,7 +73,7 @@ void GB_advance_cycles(GB_gameboy_t *gb, uint8_t cycles) gb->apu.apu_cycles += cycles; gb->cycles_since_ir_change += cycles; gb->cycles_since_input_ir_change += cycles; - gb->cycles_since_last_sync += cycles; + gb->cycles_since_epoch += cycles >> 1; GB_dma_run(gb); GB_hdma_run(gb); GB_apu_run(gb); diff --git a/waterbox/sameboy/timing.h b/waterbox/sameboy/timing.h index ed9e15a513..bd3b2f2732 100644 --- a/waterbox/sameboy/timing.h +++ b/waterbox/sameboy/timing.h @@ -7,9 +7,6 @@ void GB_advance_cycles(GB_gameboy_t *gb, uint8_t cycles); void GB_set_internal_div_counter(GB_gameboy_t *gb, uint32_t value); void GB_rtc_run(GB_gameboy_t *gb); void GB_emulate_timer_glitch(GB_gameboy_t *gb, uint8_t old_tac, uint8_t new_tac); -bool GB_timing_sync_turbo(GB_gameboy_t *gb); /* Returns true if should skip frame */ -void GB_timing_sync(GB_gameboy_t *gb); - enum { GB_TIMA_RUNNING = 0, diff --git a/waterbox/sameboy/z80_cpu.c b/waterbox/sameboy/z80_cpu.c index 19adc82f47..9558765263 100644 --- a/waterbox/sameboy/z80_cpu.c +++ b/waterbox/sameboy/z80_cpu.c @@ -283,7 +283,7 @@ static void jr_r8(GB_gameboy_t *gb, uint8_t opcode) { /* Todo: Verify cycles are not 8 and 4 instead */ GB_advance_cycles(gb, 4); - gb->pc += (int8_t) GB_read_memory(gb, gb->pc++); + gb->pc += (int8_t)GB_read_memory(gb, gb->pc) + 1; GB_advance_cycles(gb, 8); } @@ -307,7 +307,7 @@ static void jr_cc_r8(GB_gameboy_t *gb, uint8_t opcode) { if (condition_code(gb, opcode)) { GB_advance_cycles(gb, 4); - gb->pc += (int8_t)GB_read_memory(gb, gb->pc++); + gb->pc += (int8_t)GB_read_memory(gb, gb->pc) + 1; GB_advance_cycles(gb, 8); } else { From 721a6c047086572f2f4e4dfd165d4497050e8163 Mon Sep 17 00:00:00 2001 From: nattthebear Date: Tue, 18 Jul 2017 17:46:21 -0400 Subject: [PATCH 23/93] sameboy: brip bruffer --- waterbox/sameboy/apu.c | 105 +------- waterbox/sameboy/apu.h | 13 - waterbox/sameboy/bizhawk.cpp | 91 ++++--- waterbox/sameboy/blip_buf/blip_buf.c | 344 +++++++++++++++++++++++++++ waterbox/sameboy/blip_buf/blip_buf.h | 72 ++++++ waterbox/sameboy/gb.c | 28 +-- waterbox/sameboy/gb.h | 19 +- waterbox/sameboy/timing.c | 2 - 8 files changed, 493 insertions(+), 181 deletions(-) create mode 100644 waterbox/sameboy/blip_buf/blip_buf.c create mode 100644 waterbox/sameboy/blip_buf/blip_buf.h diff --git a/waterbox/sameboy/apu.c b/waterbox/sameboy/apu.c index e0e0b89f28..10b5bf9bea 100644 --- a/waterbox/sameboy/apu.c +++ b/waterbox/sameboy/apu.c @@ -62,9 +62,9 @@ static int16_t step_lfsr(uint16_t lfsr, bool uses_7_bit) static void GB_apu_run_internal(GB_gameboy_t *gb) { - while (!__sync_bool_compare_and_swap(&gb->apu_lock, false, true)); uint32_t steps = gb->apu.apu_cycles / (CPU_FREQUENCY/APU_FREQUENCY); - if (!steps) goto exit; + if (!steps) + return; gb->apu.apu_cycles %= (CPU_FREQUENCY/APU_FREQUENCY); for (uint8_t i = 0; i < 4; i++) { @@ -118,13 +118,9 @@ static void GB_apu_run_internal(GB_gameboy_t *gb) // Back to frequency gb->apu.wave_channels[0].wave_length = (2048 - temp) * (APU_FREQUENCY / 131072); - - gb->apu.wave_channels[0].cur_sweep_steps = gb->apu.wave_channels[0].sweep_steps; } } -exit: - gb->apu_lock = false; } void GB_apu_get_samples_and_update_pcm_regs(GB_gameboy_t *gb, GB_sample_t *samples) @@ -185,90 +181,9 @@ void GB_apu_get_samples_and_update_pcm_regs(GB_gameboy_t *gb, GB_sample_t *sampl void GB_apu_run(GB_gameboy_t *gb) { - if (gb->sample_rate == 0) { - if (gb->apu.apu_cycles > 0xFF00) { - GB_sample_t dummy; - GB_apu_get_samples_and_update_pcm_regs(gb, &dummy); - } - return; - } - while (gb->audio_copy_in_progress); - double ticks_per_sample = (double) CPU_FREQUENCY / gb->sample_rate; - - if (gb->audio_quality == 0) { - GB_sample_t sample; - GB_apu_get_samples_and_update_pcm_regs(gb, &sample); - gb->current_supersample.left += sample.left; - gb->current_supersample.right += sample.right; - gb->n_subsamples++; - } - else if (gb->audio_quality != 1) { - double ticks_per_subsample = ticks_per_sample / gb->audio_quality; - if (ticks_per_subsample < 1) { - ticks_per_subsample = 1; - } - if (gb->apu_subsample_cycles > ticks_per_subsample) { - gb->apu_subsample_cycles -= ticks_per_subsample; - } - - GB_sample_t sample; - GB_apu_get_samples_and_update_pcm_regs(gb, &sample); - gb->current_supersample.left += sample.left; - gb->current_supersample.right += sample.right; - gb->n_subsamples++; - } - - if (gb->apu_sample_cycles > ticks_per_sample) { - gb->apu_sample_cycles -= ticks_per_sample; - if (gb->audio_position == gb->buffer_size) { - /* - if (!gb->turbo) { - GB_log(gb, "Audio overflow\n"); - } - */ - } - else { - if (gb->audio_quality == 1) { - GB_apu_get_samples_and_update_pcm_regs(gb, &gb->audio_buffer[gb->audio_position++]); - } - else { - gb->audio_buffer[gb->audio_position].left = round(gb->current_supersample.left / gb->n_subsamples); - gb->audio_buffer[gb->audio_position].right = round(gb->current_supersample.right / gb->n_subsamples); - gb->n_subsamples = 0; - gb->current_supersample = (GB_double_sample_t){0, }; - gb->audio_position++; - } - } - } -} - -void GB_apu_copy_buffer(GB_gameboy_t *gb, GB_sample_t *dest, unsigned int count) -{ - gb->audio_copy_in_progress = true; - - if (!gb->audio_stream_started) { - // Intentionally fail the first copy to sync the stream with the Gameboy. - gb->audio_stream_started = true; - gb->audio_position = 0; - } - - if (count > gb->audio_position) { - // GB_log(gb, "Audio underflow: %d\n", count - gb->audio_position); - if (gb->audio_position != 0) { - for (unsigned i = 0; i < count - gb->audio_position; i++) { - dest[gb->audio_position + i] = gb->audio_buffer[gb->audio_position - 1]; - } - } - else { - memset(dest + gb->audio_position, 0, (count - gb->audio_position) * sizeof(*gb->audio_buffer)); - } - count = gb->audio_position; - } - memcpy(dest, gb->audio_buffer, count * sizeof(*gb->audio_buffer)); - memmove(gb->audio_buffer, gb->audio_buffer + count, (gb->audio_position - count) * sizeof(*gb->audio_buffer)); - gb->audio_position -= count; - - gb->audio_copy_in_progress = false; + GB_sample_t sample; + GB_apu_get_samples_and_update_pcm_regs(gb, &sample); + gb->sample_callback(gb, sample, gb->cycles_since_epoch); } void GB_apu_init(GB_gameboy_t *gb) @@ -485,13 +400,3 @@ void GB_apu_write(GB_gameboy_t *gb, uint8_t reg, uint8_t value) break; } } - -void GB_set_audio_quality(GB_gameboy_t *gb, unsigned quality) -{ - gb->audio_quality = quality; -} - -unsigned GB_apu_get_current_buffer_length(GB_gameboy_t *gb) -{ - return gb->audio_position; -} diff --git a/waterbox/sameboy/apu.h b/waterbox/sameboy/apu.h index ffc530e693..a8eab55fd6 100644 --- a/waterbox/sameboy/apu.h +++ b/waterbox/sameboy/apu.h @@ -14,12 +14,6 @@ typedef struct int16_t right; } GB_sample_t; -typedef struct -{ - double left; - double right; -} GB_double_sample_t; - /* Not all used on all channels */ /* All lengths are in APU ticks */ typedef struct @@ -60,13 +54,6 @@ typedef struct GB_apu_channel_t wave_channels[4]; } GB_apu_t; -void GB_set_sample_rate(GB_gameboy_t *gb, unsigned int sample_rate); -/* Quality is the number of subsamples per sampling, for the sake of resampling. - 1 means on resampling at all, 0 is maximum quality. Default is 4. */ -void GB_set_audio_quality(GB_gameboy_t *gb, unsigned quality); -void GB_apu_copy_buffer(GB_gameboy_t *gb, GB_sample_t *dest, unsigned int count); -unsigned GB_apu_get_current_buffer_length(GB_gameboy_t *gb); - #ifdef GB_INTERNAL void GB_apu_write(GB_gameboy_t *gb, uint8_t reg, uint8_t value); uint8_t GB_apu_read(GB_gameboy_t *gb, uint8_t reg); diff --git a/waterbox/sameboy/bizhawk.cpp b/waterbox/sameboy/bizhawk.cpp index 15f462da84..187c668a5b 100644 --- a/waterbox/sameboy/bizhawk.cpp +++ b/waterbox/sameboy/bizhawk.cpp @@ -1,6 +1,7 @@ #include #include "../emulibc/emulibc.h" #include "../emulibc/waterboxcore.h" +#include "blip_buf/blip_buf.h" #define _Static_assert static_assert @@ -14,7 +15,6 @@ static GB_gameboy_t GB; static void VBlankCallback(GB_gameboy_t *gb) { - } static void LogCallback(GB_gameboy_t *gb, const char *string, GB_log_attributes attributes) @@ -24,22 +24,19 @@ static void LogCallback(GB_gameboy_t *gb, const char *string, GB_log_attributes static uint32_t RgbEncodeCallback(GB_gameboy_t *gb, uint8_t r, uint8_t g, uint8_t b) { - return b | g << 8 | r << 16 | 0xff000000; + return b | g << 8 | r << 16 | 0xff000000; } static void InfraredCallback(GB_gameboy_t *gb, bool on, long cycles_since_last_update) { - } static void RumbleCallback(GB_gameboy_t *gb, bool rumble_on) { - } static void SerialStartCallback(GB_gameboy_t *gb, uint8_t byte_to_send) { - } static uint8_t SerialEndCallback(GB_gameboy_t *gb) @@ -47,55 +44,83 @@ static uint8_t SerialEndCallback(GB_gameboy_t *gb) return 0; } +static blip_t *leftblip; +static blip_t *rightblip; +const int SOUND_RATE_GB = 2097152; +const int SOUND_RATE_SGB = 2147727; +static uint64_t sound_start_clock; +static GB_sample_t sample_gb; + +static void SampleCallback(GB_gameboy_t *gb, GB_sample_t sample, uint64_t clock) +{ + int l = sample.left - sample_gb.left; + int r = sample.right - sample_gb.right; + if (l) + blip_add_delta(leftblip, clock - sound_start_clock, l); + if (r) + blip_add_delta(rightblip, clock - sound_start_clock, r); + sample_gb = sample; +} + ECL_EXPORT bool Init(bool cgb) { - if (cgb) - GB_init_cgb(&GB); - else - GB_init(&GB); - if (GB_load_boot_rom(&GB, "boot.rom") != 0) - return false; - - if (GB_load_rom(&GB, "game.rom") != 0) - return false; + if (cgb) + GB_init_cgb(&GB); + else + GB_init(&GB); + if (GB_load_boot_rom(&GB, "boot.rom") != 0) + return false; - GB_set_vblank_callback(&GB, VBlankCallback); - GB_set_log_callback(&GB, LogCallback); - GB_set_rgb_encode_callback(&GB, RgbEncodeCallback); - GB_set_infrared_callback(&GB, InfraredCallback); - GB_set_rumble_callback(&GB, RumbleCallback); + if (GB_load_rom(&GB, "game.rom") != 0) + return false; - GB_set_sample_rate(&GB, 44100); - GB_set_audio_quality(&GB, 1); + GB_set_vblank_callback(&GB, VBlankCallback); + GB_set_log_callback(&GB, LogCallback); + GB_set_rgb_encode_callback(&GB, RgbEncodeCallback); + GB_set_infrared_callback(&GB, InfraredCallback); + GB_set_rumble_callback(&GB, RumbleCallback); + GB_set_sample_callback(&GB, SampleCallback); - return true; + leftblip = blip_new(1024); + rightblip = blip_new(1024); + blip_set_rates(leftblip, SOUND_RATE_GB, 44100); + blip_set_rates(rightblip, SOUND_RATE_GB, 44100); + + return true; } struct MyFrameInfo : public FrameInfo { - }; +static int FrameOverflow; + ECL_EXPORT void FrameAdvance(MyFrameInfo &f) { - GB_set_pixels_output(&GB, f.VideoBuffer); + GB_set_pixels_output(&GB, f.VideoBuffer); for (int i = 0; i < (int)GB_KEY_MAX; i++) GB_set_key_state(&GB, (GB_key_t)i, false); + + sound_start_clock = GB_epoch(&GB); - f.Cycles = GB_run_cycles(&GB, 35112); - f.Samples = GB_apu_get_current_buffer_length(&GB); - GB_apu_copy_buffer(&GB, (GB_sample_t*)f.SoundBuffer, f.Samples); + uint32_t target = 35112 - FrameOverflow; + f.Cycles = GB_run_cycles(&GB, target); + FrameOverflow = f.Cycles - target; + blip_end_frame(leftblip, f.Cycles); + blip_end_frame(rightblip, f.Cycles); + f.Samples = blip_read_samples(leftblip, f.SoundBuffer, 2048, 1); + blip_read_samples(rightblip, f.SoundBuffer + 1, 2048, 1); f.Width = 160; f.Height = 144; } -static void SetMemoryArea(MemoryArea *m, GB_direct_access_t access, const char* name, int32_t flags) +static void SetMemoryArea(MemoryArea *m, GB_direct_access_t access, const char *name, int32_t flags) { - size_t size; - m->Name = name; - m->Data = GB_get_direct_access(&GB, access, &size, nullptr); - m->Size = size; - m->Flags = flags; + size_t size; + m->Name = name; + m->Data = GB_get_direct_access(&GB, access, &size, nullptr); + m->Size = size; + m->Flags = flags; } ECL_EXPORT void GetMemoryAreas(MemoryArea *m) diff --git a/waterbox/sameboy/blip_buf/blip_buf.c b/waterbox/sameboy/blip_buf/blip_buf.c new file mode 100644 index 0000000000..1bd3377e92 --- /dev/null +++ b/waterbox/sameboy/blip_buf/blip_buf.c @@ -0,0 +1,344 @@ +/* blip_buf 1.1.0. http://www.slack.net/~ant/ */ + +#include "blip_buf.h" + +#include +#include +#include +#include + +/* Library Copyright (C) 2003-2009 Shay Green. This library is free software; +you can redistribute it and/or modify it under the terms of the GNU Lesser +General Public License as published by the Free Software Foundation; either +version 2.1 of the License, or (at your option) any later version. This +library is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR +A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +details. You should have received a copy of the GNU Lesser General Public +License along with this module; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ + +#if defined (BLARGG_TEST) && BLARGG_TEST + #include "blargg_test.h" +#endif + +/* Equivalent to ULONG_MAX >= 0xFFFFFFFF00000000. +Avoids constants that don't fit in 32 bits. */ +#if ULONG_MAX/0xFFFFFFFF > 0xFFFFFFFF + typedef unsigned long fixed_t; + enum { pre_shift = 32 }; + +#elif defined(ULLONG_MAX) + typedef unsigned long long fixed_t; + enum { pre_shift = 32 }; + +#else + typedef unsigned fixed_t; + enum { pre_shift = 0 }; + +#endif + +enum { time_bits = pre_shift + 20 }; + +static fixed_t const time_unit = (fixed_t) 1 << time_bits; + +enum { bass_shift = 9 }; /* affects high-pass filter breakpoint frequency */ +enum { end_frame_extra = 2 }; /* allows deltas slightly after frame length */ + +enum { half_width = 8 }; +enum { buf_extra = half_width*2 + end_frame_extra }; +enum { phase_bits = 5 }; +enum { phase_count = 1 << phase_bits }; +enum { delta_bits = 15 }; +enum { delta_unit = 1 << delta_bits }; +enum { frac_bits = time_bits - pre_shift }; + +/* We could eliminate avail and encode whole samples in offset, but that would +limit the total buffered samples to blip_max_frame. That could only be +increased by decreasing time_bits, which would reduce resample ratio accuracy. +*/ + +/** Sample buffer that resamples to output rate and accumulates samples +until they're read out */ +struct blip_t +{ + fixed_t factor; + fixed_t offset; + int avail; + int size; + int integrator; +}; + +typedef int buf_t; + +/* probably not totally portable */ +#define SAMPLES( buf ) ((buf_t*) ((buf) + 1)) + +/* Arithmetic (sign-preserving) right shift */ +#define ARITH_SHIFT( n, shift ) \ + ((n) >> (shift)) + +enum { max_sample = +32767 }; +enum { min_sample = -32768 }; + +#define CLAMP( n ) \ + {\ + if ( (short) n != n )\ + n = ARITH_SHIFT( n, 16 ) ^ max_sample;\ + } + +static void check_assumptions( void ) +{ + int n; + + #if INT_MAX < 0x7FFFFFFF || UINT_MAX < 0xFFFFFFFF + #error "int must be at least 32 bits" + #endif + + assert( (-3 >> 1) == -2 ); /* right shift must preserve sign */ + + n = max_sample * 2; + CLAMP( n ); + assert( n == max_sample ); + + n = min_sample * 2; + CLAMP( n ); + assert( n == min_sample ); + + assert( blip_max_ratio <= time_unit ); + assert( blip_max_frame <= (fixed_t) -1 >> time_bits ); +} + +blip_t* blip_new( int size ) +{ + blip_t* m; + assert( size >= 0 ); + + m = (blip_t*) malloc( sizeof *m + (size + buf_extra) * sizeof (buf_t) ); + if ( m ) + { + m->factor = time_unit / blip_max_ratio; + m->size = size; + blip_clear( m ); + check_assumptions(); + } + return m; +} + +void blip_delete( blip_t* m ) +{ + if ( m != NULL ) + { + /* Clear fields in case user tries to use after freeing */ + memset( m, 0, sizeof *m ); + free( m ); + } +} + +void blip_set_rates( blip_t* m, double clock_rate, double sample_rate ) +{ + double factor = time_unit * sample_rate / clock_rate; + m->factor = (fixed_t) factor; + + /* Fails if clock_rate exceeds maximum, relative to sample_rate */ + assert( 0 <= factor - m->factor && factor - m->factor < 1 ); + + /* Avoid requiring math.h. Equivalent to + m->factor = (int) ceil( factor ) */ + if ( m->factor < factor ) + m->factor++; + + /* At this point, factor is most likely rounded up, but could still + have been rounded down in the floating-point calculation. */ +} + +void blip_clear( blip_t* m ) +{ + /* We could set offset to 0, factor/2, or factor-1. 0 is suitable if + factor is rounded up. factor-1 is suitable if factor is rounded down. + Since we don't know rounding direction, factor/2 accommodates either, + with the slight loss of showing an error in half the time. Since for + a 64-bit factor this is years, the halving isn't a problem. */ + + m->offset = m->factor / 2; + m->avail = 0; + m->integrator = 0; + memset( SAMPLES( m ), 0, (m->size + buf_extra) * sizeof (buf_t) ); +} + +int blip_clocks_needed( const blip_t* m, int samples ) +{ + fixed_t needed; + + /* Fails if buffer can't hold that many more samples */ + assert( samples >= 0 && m->avail + samples <= m->size ); + + needed = (fixed_t) samples * time_unit; + if ( needed < m->offset ) + return 0; + + return (needed - m->offset + m->factor - 1) / m->factor; +} + +void blip_end_frame( blip_t* m, unsigned t ) +{ + fixed_t off = t * m->factor + m->offset; + m->avail += off >> time_bits; + m->offset = off & (time_unit - 1); + + /* Fails if buffer size was exceeded */ + assert( m->avail <= m->size ); +} + +int blip_samples_avail( const blip_t* m ) +{ + return m->avail; +} + +static void remove_samples( blip_t* m, int count ) +{ + buf_t* buf = SAMPLES( m ); + int remain = m->avail + buf_extra - count; + m->avail -= count; + + memmove( &buf [0], &buf [count], remain * sizeof buf [0] ); + memset( &buf [remain], 0, count * sizeof buf [0] ); +} + +int blip_read_samples( blip_t* m, short out [], int count, int stereo ) +{ + assert( count >= 0 ); + + if ( count > m->avail ) + count = m->avail; + + if ( count ) + { + int const step = stereo ? 2 : 1; + buf_t const* in = SAMPLES( m ); + buf_t const* end = in + count; + int sum = m->integrator; + do + { + /* Eliminate fraction */ + int s = ARITH_SHIFT( sum, delta_bits ); + + sum += *in++; + + CLAMP( s ); + + *out = s; + out += step; + + /* High-pass filter */ + sum -= s << (delta_bits - bass_shift); + } + while ( in != end ); + m->integrator = sum; + + remove_samples( m, count ); + } + + return count; +} + +/* Things that didn't help performance on x86: + __attribute__((aligned(128))) + #define short int + restrict +*/ + +/* Sinc_Generator( 0.9, 0.55, 4.5 ) */ +static short const bl_step [phase_count + 1] [half_width] = +{ +{ 43, -115, 350, -488, 1136, -914, 5861,21022}, +{ 44, -118, 348, -473, 1076, -799, 5274,21001}, +{ 45, -121, 344, -454, 1011, -677, 4706,20936}, +{ 46, -122, 336, -431, 942, -549, 4156,20829}, +{ 47, -123, 327, -404, 868, -418, 3629,20679}, +{ 47, -122, 316, -375, 792, -285, 3124,20488}, +{ 47, -120, 303, -344, 714, -151, 2644,20256}, +{ 46, -117, 289, -310, 634, -17, 2188,19985}, +{ 46, -114, 273, -275, 553, 117, 1758,19675}, +{ 44, -108, 255, -237, 471, 247, 1356,19327}, +{ 43, -103, 237, -199, 390, 373, 981,18944}, +{ 42, -98, 218, -160, 310, 495, 633,18527}, +{ 40, -91, 198, -121, 231, 611, 314,18078}, +{ 38, -84, 178, -81, 153, 722, 22,17599}, +{ 36, -76, 157, -43, 80, 824, -241,17092}, +{ 34, -68, 135, -3, 8, 919, -476,16558}, +{ 32, -61, 115, 34, -60, 1006, -683,16001}, +{ 29, -52, 94, 70, -123, 1083, -862,15422}, +{ 27, -44, 73, 106, -184, 1152,-1015,14824}, +{ 25, -36, 53, 139, -239, 1211,-1142,14210}, +{ 22, -27, 34, 170, -290, 1261,-1244,13582}, +{ 20, -20, 16, 199, -335, 1301,-1322,12942}, +{ 18, -12, -3, 226, -375, 1331,-1376,12293}, +{ 15, -4, -19, 250, -410, 1351,-1408,11638}, +{ 13, 3, -35, 272, -439, 1361,-1419,10979}, +{ 11, 9, -49, 292, -464, 1362,-1410,10319}, +{ 9, 16, -63, 309, -483, 1354,-1383, 9660}, +{ 7, 22, -75, 322, -496, 1337,-1339, 9005}, +{ 6, 26, -85, 333, -504, 1312,-1280, 8355}, +{ 4, 31, -94, 341, -507, 1278,-1205, 7713}, +{ 3, 35, -102, 347, -506, 1238,-1119, 7082}, +{ 1, 40, -110, 350, -499, 1190,-1021, 6464}, +{ 0, 43, -115, 350, -488, 1136, -914, 5861} +}; + +/* Shifting by pre_shift allows calculation using unsigned int rather than +possibly-wider fixed_t. On 32-bit platforms, this is likely more efficient. +And by having pre_shift 32, a 32-bit platform can easily do the shift by +simply ignoring the low half. */ + +void blip_add_delta( blip_t* m, unsigned time, int delta ) +{ + unsigned fixed = (unsigned) ((time * m->factor + m->offset) >> pre_shift); + buf_t* out = SAMPLES( m ) + m->avail + (fixed >> frac_bits); + + int const phase_shift = frac_bits - phase_bits; + int phase = fixed >> phase_shift & (phase_count - 1); + short const* in = bl_step [phase]; + short const* rev = bl_step [phase_count - phase]; + + int interp = fixed >> (phase_shift - delta_bits) & (delta_unit - 1); + int delta2 = (delta * interp) >> delta_bits; + delta -= delta2; + + /* Fails if buffer size was exceeded */ + assert( out <= &SAMPLES( m ) [m->size + end_frame_extra] ); + + out [0] += in[0]*delta + in[half_width+0]*delta2; + out [1] += in[1]*delta + in[half_width+1]*delta2; + out [2] += in[2]*delta + in[half_width+2]*delta2; + out [3] += in[3]*delta + in[half_width+3]*delta2; + out [4] += in[4]*delta + in[half_width+4]*delta2; + out [5] += in[5]*delta + in[half_width+5]*delta2; + out [6] += in[6]*delta + in[half_width+6]*delta2; + out [7] += in[7]*delta + in[half_width+7]*delta2; + + in = rev; + out [ 8] += in[7]*delta + in[7-half_width]*delta2; + out [ 9] += in[6]*delta + in[6-half_width]*delta2; + out [10] += in[5]*delta + in[5-half_width]*delta2; + out [11] += in[4]*delta + in[4-half_width]*delta2; + out [12] += in[3]*delta + in[3-half_width]*delta2; + out [13] += in[2]*delta + in[2-half_width]*delta2; + out [14] += in[1]*delta + in[1-half_width]*delta2; + out [15] += in[0]*delta + in[0-half_width]*delta2; +} + +void blip_add_delta_fast( blip_t* m, unsigned time, int delta ) +{ + unsigned fixed = (unsigned) ((time * m->factor + m->offset) >> pre_shift); + buf_t* out = SAMPLES( m ) + m->avail + (fixed >> frac_bits); + + int interp = fixed >> (frac_bits - delta_bits) & (delta_unit - 1); + int delta2 = delta * interp; + + /* Fails if buffer size was exceeded */ + assert( out <= &SAMPLES( m ) [m->size + end_frame_extra] ); + + out [7] += delta * delta_unit - delta2; + out [8] += delta2; +} diff --git a/waterbox/sameboy/blip_buf/blip_buf.h b/waterbox/sameboy/blip_buf/blip_buf.h new file mode 100644 index 0000000000..e9a5d4cc3b --- /dev/null +++ b/waterbox/sameboy/blip_buf/blip_buf.h @@ -0,0 +1,72 @@ +/** \file +Sample buffer that resamples from input clock rate to output sample rate */ + +/* blip_buf 1.1.0 */ +#ifndef BLIP_BUF_H +#define BLIP_BUF_H + +#ifdef __cplusplus + extern "C" { +#endif + +/** First parameter of most functions is blip_t*, or const blip_t* if nothing +is changed. */ +typedef struct blip_t blip_t; + +/** Creates new buffer that can hold at most sample_count samples. Sets rates +so that there are blip_max_ratio clocks per sample. Returns pointer to new +buffer, or NULL if insufficient memory. */ +blip_t* blip_new( int sample_count ); + +/** Sets approximate input clock rate and output sample rate. For every +clock_rate input clocks, approximately sample_rate samples are generated. */ +void blip_set_rates( blip_t*, double clock_rate, double sample_rate ); + +enum { /** Maximum clock_rate/sample_rate ratio. For a given sample_rate, +clock_rate must not be greater than sample_rate*blip_max_ratio. */ +blip_max_ratio = 1 << 20 }; + +/** Clears entire buffer. Afterwards, blip_samples_avail() == 0. */ +void blip_clear( blip_t* ); + +/** Adds positive/negative delta into buffer at specified clock time. */ +void blip_add_delta( blip_t*, unsigned int clock_time, int delta ); + +/** Same as blip_add_delta(), but uses faster, lower-quality synthesis. */ +void blip_add_delta_fast( blip_t*, unsigned int clock_time, int delta ); + +/** Length of time frame, in clocks, needed to make sample_count additional +samples available. */ +int blip_clocks_needed( const blip_t*, int sample_count ); + +enum { /** Maximum number of samples that can be generated from one time frame. */ +blip_max_frame = 4000 }; + +/** Makes input clocks before clock_duration available for reading as output +samples. Also begins new time frame at clock_duration, so that clock time 0 in +the new time frame specifies the same clock as clock_duration in the old time +frame specified. Deltas can have been added slightly past clock_duration (up to +however many clocks there are in two output samples). */ +void blip_end_frame( blip_t*, unsigned int clock_duration ); + +/** Number of buffered samples available for reading. */ +int blip_samples_avail( const blip_t* ); + +/** Reads and removes at most 'count' samples and writes them to 'out'. If +'stereo' is true, writes output to every other element of 'out', allowing easy +interleaving of two buffers into a stereo sample stream. Outputs 16-bit signed +samples. Returns number of samples actually read. */ +int blip_read_samples( blip_t*, short out [], int count, int stereo ); + +/** Frees buffer. No effect if NULL is passed. */ +void blip_delete( blip_t* ); + + +/* Deprecated */ +typedef blip_t blip_buffer_t; + +#ifdef __cplusplus + } +#endif + +#endif diff --git a/waterbox/sameboy/gb.c b/waterbox/sameboy/gb.c index 475d48f881..986a5623c6 100644 --- a/waterbox/sameboy/gb.c +++ b/waterbox/sameboy/gb.c @@ -92,7 +92,6 @@ void GB_init(GB_gameboy_t *gb) gb->input_callback = default_input_callback; gb->async_input_callback = default_async_input_callback; gb->cartridge_type = &GB_cart_defs[0]; // Default cartridge type - gb->audio_quality = 4; GB_reset(gb); } @@ -107,7 +106,6 @@ void GB_init_cgb(GB_gameboy_t *gb) gb->input_callback = default_input_callback; gb->async_input_callback = default_async_input_callback; gb->cartridge_type = &GB_cart_defs[0]; // Default cartridge type - gb->audio_quality = 4; GB_reset(gb); } @@ -127,9 +125,6 @@ void GB_free(GB_gameboy_t *gb) if (gb->rom) { free(gb->rom); } - if (gb->audio_buffer) { - free(gb->audio_buffer); - } if (gb->breakpoints) { free(gb->breakpoints); } @@ -262,15 +257,18 @@ uint64_t GB_run_cycles(GB_gameboy_t *gb, uint32_t cycles) while (gb->cycles_since_epoch < target) { GB_run(gb); if (gb->vblank_just_occured) { - // TODO: fix these up GB_update_joyp(gb); GB_rtc_run(gb); - break; } } return gb->cycles_since_epoch - start; } +uint64_t GB_epoch(GB_gameboy_t *gb) +{ + return gb->cycles_since_epoch; +} + void GB_set_pixels_output(GB_gameboy_t *gb, uint32_t *output) { gb->screen = output; @@ -340,6 +338,11 @@ void GB_set_rumble_callback(GB_gameboy_t *gb, GB_rumble_callback_t callback) gb->rumble_callback = callback; } +void GB_set_sample_callback(GB_gameboy_t *gb, GB_sample_callback_t callback) +{ + gb->sample_callback = callback; +} + void GB_set_serial_transfer_start_callback(GB_gameboy_t *gb, GB_serial_transfer_start_callback_t callback) { gb->serial_transfer_start_callback = callback; @@ -370,17 +373,6 @@ void GB_serial_set_data(GB_gameboy_t *gb, uint8_t data) gb->io_registers[GB_IO_IF] |= 8; } -void GB_set_sample_rate(GB_gameboy_t *gb, unsigned int sample_rate) -{ - if (gb->audio_buffer) { - free(gb->audio_buffer); - } - gb->buffer_size = sample_rate / 25; // 40ms delay - gb->audio_buffer = malloc(gb->buffer_size * sizeof(*gb->audio_buffer)); - gb->sample_rate = sample_rate; - gb->audio_position = 0; -} - void GB_disconnect_serial(GB_gameboy_t *gb) { gb->serial_transfer_start_callback = NULL; diff --git a/waterbox/sameboy/gb.h b/waterbox/sameboy/gb.h index a80b89e5ec..5eb644d20a 100644 --- a/waterbox/sameboy/gb.h +++ b/waterbox/sameboy/gb.h @@ -171,6 +171,7 @@ typedef void (*GB_infrared_callback_t)(GB_gameboy_t *gb, bool on, long cycles_si typedef void (*GB_rumble_callback_t)(GB_gameboy_t *gb, bool rumble_on); typedef void (*GB_serial_transfer_start_callback_t)(GB_gameboy_t *gb, uint8_t byte_to_send); typedef uint8_t (*GB_serial_transfer_end_callback_t)(GB_gameboy_t *gb); +typedef void (*GB_sample_callback_t)(GB_gameboy_t *gb, GB_sample_t sample, uint64_t clock); typedef struct { bool state; @@ -379,26 +380,11 @@ struct GB_gameboy_internal_s { /* I/O */ uint32_t *screen; - GB_sample_t *audio_buffer; bool keys[GB_KEY_MAX]; /* Timing */ uint64_t cycles_since_epoch; - /* Audio */ - unsigned buffer_size; - unsigned sample_rate; - unsigned audio_position; - bool audio_stream_started; /* detects first copy request to minimize lag */ - volatile bool audio_copy_in_progress; - volatile bool apu_lock; - double apu_sample_cycles; - double apu_subsample_cycles; - GB_double_sample_t current_supersample; - unsigned n_subsamples; - unsigned audio_quality; - - /* Callbacks */ void *user_data; GB_log_callback_t log_callback; @@ -412,6 +398,7 @@ struct GB_gameboy_internal_s { GB_rumble_callback_t rumble_callback; GB_serial_transfer_start_callback_t serial_transfer_start_callback; GB_serial_transfer_end_callback_t serial_transfer_end_callback; + GB_sample_callback_t sample_callback; /* IR */ long cycles_since_ir_change; @@ -466,6 +453,7 @@ void GB_reset(GB_gameboy_t *gb); void GB_switch_model_and_reset(GB_gameboy_t *gb, bool is_cgb); void GB_run(GB_gameboy_t *gb); uint64_t GB_run_cycles(GB_gameboy_t *gb, uint32_t cycles); +uint64_t GB_epoch(GB_gameboy_t *gb); typedef enum { GB_DIRECT_ACCESS_ROM, @@ -510,6 +498,7 @@ void GB_set_async_input_callback(GB_gameboy_t *gb, GB_input_callback_t callback) void GB_set_rgb_encode_callback(GB_gameboy_t *gb, GB_rgb_encode_callback_t callback); void GB_set_infrared_callback(GB_gameboy_t *gb, GB_infrared_callback_t callback); void GB_set_rumble_callback(GB_gameboy_t *gb, GB_rumble_callback_t callback); +void GB_set_sample_callback(GB_gameboy_t *gb, GB_sample_callback_t callback); /* These APIs are used when using internal clock */ void GB_set_serial_transfer_start_callback(GB_gameboy_t *gb, GB_serial_transfer_start_callback_t callback); diff --git a/waterbox/sameboy/timing.c b/waterbox/sameboy/timing.c index 6e6c81e752..e67992c167 100644 --- a/waterbox/sameboy/timing.c +++ b/waterbox/sameboy/timing.c @@ -68,8 +68,6 @@ void GB_advance_cycles(GB_gameboy_t *gb, uint8_t cycles) // Not affected by speed boost gb->hdma_cycles += cycles; - gb->apu_sample_cycles += cycles; - gb->apu_subsample_cycles += cycles; gb->apu.apu_cycles += cycles; gb->cycles_since_ir_change += cycles; gb->cycles_since_input_ir_change += cycles; From 1f891581798f016a402a8347875b15d0ff199ab1 Mon Sep 17 00:00:00 2001 From: nattthebear Date: Tue, 18 Jul 2017 18:19:51 -0400 Subject: [PATCH 24/93] sameboy: input --- .../Consoles/Nintendo/Gameboy/LibSameboy.cs | 21 +++++++ .../Consoles/Nintendo/Gameboy/Sameboy.cs | 56 +++++++++++++++++++ waterbox/sameboy/bizhawk.cpp | 5 +- waterbox/sameboy/gb.c | 6 +- waterbox/sameboy/gb.h | 2 +- waterbox/sameboy/joypad.c | 20 ++----- waterbox/sameboy/joypad.h | 14 +---- 7 files changed, 90 insertions(+), 34 deletions(-) diff --git a/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/LibSameboy.cs b/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/LibSameboy.cs index 5c13e48d23..c9ba9cc16b 100644 --- a/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/LibSameboy.cs +++ b/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/LibSameboy.cs @@ -3,6 +3,7 @@ using BizHawk.Emulation.Cores.Waterbox; using System; using System.Collections.Generic; using System.Linq; +using System.Runtime.InteropServices; using System.Text; using System.Threading.Tasks; @@ -10,6 +11,26 @@ namespace BizHawk.Emulation.Cores.Consoles.Nintendo.Gameboy { public abstract class LibSameboy : LibWaterboxCore { + [Flags] + public enum Buttons : uint + { + A = 0x01, + B = 0x02, + SELECT = 0x04, + START = 0x08, + RIGHT = 0x10, + LEFT = 0x20, + UP = 0x40, + DOWN = 0x80 + } + + [StructLayout(LayoutKind.Sequential)] + public new class FrameInfo : LibWaterboxCore.FrameInfo + { + public long Time; + public Buttons Keys; + } + [BizImport(CC)] public abstract bool Init(bool cgb); } diff --git a/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/Sameboy.cs b/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/Sameboy.cs index 8d93b7521f..a052576634 100644 --- a/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/Sameboy.cs +++ b/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/Sameboy.cs @@ -32,6 +32,7 @@ namespace BizHawk.Emulation.Cores.Consoles.Nintendo.Gameboy private LibSameboy _core; private bool _cgb; + private bool _sgb; [CoreConstructor("GB")] public Sameboy(CoreComm comm, byte[] rom) @@ -76,10 +77,65 @@ namespace BizHawk.Emulation.Cores.Consoles.Nintendo.Gameboy PostInit(); } + #region Controller + + private static readonly ControllerDefinition _gbDefinition; + private static readonly ControllerDefinition _sgbDefinition; + public override ControllerDefinition ControllerDefinition => _sgb ? _sgbDefinition : _gbDefinition; + + private static ControllerDefinition CreateControllerDefinition(int p) + { + var ret = new ControllerDefinition { Name = "Gameboy Controller" }; + for (int i = 0; i < p; i++) + { + ret.BoolButtons.AddRange( + new[] { "Up", "Down", "Left", "Right", "A", "B", "Select", "Start" } + .Select(s => $"P{i + 1} {s}")); + } + return ret; + } + + static Sameboy() + { + _gbDefinition = CreateControllerDefinition(1); + _sgbDefinition = CreateControllerDefinition(4); + } + + private LibSameboy.Buttons GetButtons(IController c) + { + LibSameboy.Buttons b = 0; + for (int i = _sgb ? 4 : 1; i > 0; i--) + { + if (c.IsPressed($"P{i} Up")) + b |= LibSameboy.Buttons.UP; + if (c.IsPressed($"P{i} Down")) + b |= LibSameboy.Buttons.DOWN; + if (c.IsPressed($"P{i} Left")) + b |= LibSameboy.Buttons.LEFT; + if (c.IsPressed($"P{i} Right")) + b |= LibSameboy.Buttons.RIGHT; + if (c.IsPressed($"P{i} A")) + b |= LibSameboy.Buttons.A; + if (c.IsPressed($"P{i} B")) + b |= LibSameboy.Buttons.B; + if (c.IsPressed($"P{i} Select")) + b |= LibSameboy.Buttons.SELECT; + if (c.IsPressed($"P{i} Start")) + b |= LibSameboy.Buttons.START; + if (i != 1) + b = (LibSameboy.Buttons)((uint)b << 8); + } + return b; + } + + #endregion + protected override LibWaterboxCore.FrameInfo FrameAdvancePrep(IController controller, bool render, bool rendersound) { return new LibSameboy.FrameInfo { + Time = 0, + Keys = GetButtons(controller) }; } diff --git a/waterbox/sameboy/bizhawk.cpp b/waterbox/sameboy/bizhawk.cpp index 187c668a5b..c704aaf13a 100644 --- a/waterbox/sameboy/bizhawk.cpp +++ b/waterbox/sameboy/bizhawk.cpp @@ -91,6 +91,8 @@ ECL_EXPORT bool Init(bool cgb) struct MyFrameInfo : public FrameInfo { + int64_t Time; + uint32_t Keys; }; static int FrameOverflow; @@ -98,8 +100,7 @@ static int FrameOverflow; ECL_EXPORT void FrameAdvance(MyFrameInfo &f) { GB_set_pixels_output(&GB, f.VideoBuffer); - for (int i = 0; i < (int)GB_KEY_MAX; i++) - GB_set_key_state(&GB, (GB_key_t)i, false); + GB_set_key_state(&GB, f.Keys & 0xff); sound_start_clock = GB_epoch(&GB); diff --git a/waterbox/sameboy/gb.c b/waterbox/sameboy/gb.c index 986a5623c6..0f6b298b07 100644 --- a/waterbox/sameboy/gb.c +++ b/waterbox/sameboy/gb.c @@ -252,14 +252,12 @@ void GB_run(GB_gameboy_t *gb) uint64_t GB_run_cycles(GB_gameboy_t *gb, uint32_t cycles) { + GB_update_joyp(gb); + GB_rtc_run(gb); uint64_t start = gb->cycles_since_epoch; uint64_t target = start + cycles; while (gb->cycles_since_epoch < target) { GB_run(gb); - if (gb->vblank_just_occured) { - GB_update_joyp(gb); - GB_rtc_run(gb); - } } return gb->cycles_since_epoch - start; } diff --git a/waterbox/sameboy/gb.h b/waterbox/sameboy/gb.h index 5eb644d20a..d1fb323d3e 100644 --- a/waterbox/sameboy/gb.h +++ b/waterbox/sameboy/gb.h @@ -380,7 +380,7 @@ struct GB_gameboy_internal_s { /* I/O */ uint32_t *screen; - bool keys[GB_KEY_MAX]; + int keys; /* Timing */ uint64_t cycles_since_epoch; diff --git a/waterbox/sameboy/joypad.c b/waterbox/sameboy/joypad.c index 21e6d666b0..0cad7ab084 100644 --- a/waterbox/sameboy/joypad.c +++ b/waterbox/sameboy/joypad.c @@ -9,7 +9,7 @@ void GB_update_joyp(GB_gameboy_t *gb) /* Todo: add delay to key selection */ previous_state = gb->io_registers[GB_IO_JOYP] & 0xF; - key_selection = (gb->io_registers[GB_IO_JOYP] >> 4) & 3; + key_selection = gb->io_registers[GB_IO_JOYP] >> 4 & 3; gb->io_registers[GB_IO_JOYP] &= 0xF0; switch (key_selection) { case 3: @@ -19,24 +19,17 @@ void GB_update_joyp(GB_gameboy_t *gb) case 2: /* Direction keys */ - for (uint8_t i = 0; i < 4; i++) { - gb->io_registers[GB_IO_JOYP] |= (!gb->keys[i]) << i; - } + gb->io_registers[GB_IO_JOYP] |= ~gb->keys >> 4 & 0xf; break; case 1: /* Other keys */ - for (uint8_t i = 0; i < 4; i++) { - gb->io_registers[GB_IO_JOYP] |= (!gb->keys[i + 4]) << i; - } + gb->io_registers[GB_IO_JOYP] |= ~gb->keys & 0xf; break; case 0: /* Todo: verifiy this is correct */ - for (uint8_t i = 0; i < 4; i++) { - gb->io_registers[GB_IO_JOYP] |= (!gb->keys[i]) << i; - gb->io_registers[GB_IO_JOYP] |= (!gb->keys[i + 4]) << i; - } + gb->io_registers[GB_IO_JOYP] |= ~(gb->keys >> 4 & gb->keys) & 0xf; break; default: @@ -49,8 +42,7 @@ void GB_update_joyp(GB_gameboy_t *gb) gb->io_registers[GB_IO_JOYP] |= 0xC0; // No SGB support } -void GB_set_key_state(GB_gameboy_t *gb, GB_key_t index, bool pressed) +void GB_set_key_state(GB_gameboy_t *gb, int keys) { - assert(index >= 0 && index < GB_KEY_MAX); - gb->keys[index] = pressed; + gb->keys = keys; } diff --git a/waterbox/sameboy/joypad.h b/waterbox/sameboy/joypad.h index def4b9ac82..f7ffdfdec4 100644 --- a/waterbox/sameboy/joypad.h +++ b/waterbox/sameboy/joypad.h @@ -2,19 +2,7 @@ #define joypad_h #include "gb_struct_def.h" -typedef enum { - GB_KEY_RIGHT, - GB_KEY_LEFT, - GB_KEY_UP, - GB_KEY_DOWN, - GB_KEY_A, - GB_KEY_B, - GB_KEY_SELECT, - GB_KEY_START, - GB_KEY_MAX -} GB_key_t; - -void GB_set_key_state(GB_gameboy_t *gb, GB_key_t index, bool pressed); +void GB_set_key_state(GB_gameboy_t *gb, int keys); #ifdef GB_INTERNAL void GB_update_joyp(GB_gameboy_t *gb); From bfd7337a32911477033ff49f22b1e9e7b230e51c Mon Sep 17 00:00:00 2001 From: nattthebear Date: Tue, 18 Jul 2017 19:57:53 -0400 Subject: [PATCH 25/93] sameboy: SGB support. Mostly accomplished through the power of copy+paste, since we plan on dropping pizza boy --- BizHawk.Client.Common/RomLoader.cs | 2 +- .../Consoles/Nintendo/Gameboy/LibSameboy.cs | 2 +- .../Consoles/Nintendo/Gameboy/Sameboy.cs | 29 +- waterbox/sameboy/bizhawk.cpp | 75 +- waterbox/sameboy/gb.c | 14 + waterbox/sameboy/gb.h | 2 + waterbox/sameboy/memory.c | 12 + waterbox/sameboy/sgb.c | 1001 ++++++++++++++ waterbox/sameboy/sgb.h | 36 + waterbox/sameboy/snes_spc/SNES_SPC.cpp | 564 ++++++++ waterbox/sameboy/snes_spc/SNES_SPC.h | 284 ++++ waterbox/sameboy/snes_spc/SNES_SPC_misc.cpp | 380 +++++ waterbox/sameboy/snes_spc/SNES_SPC_state.cpp | 129 ++ waterbox/sameboy/snes_spc/SPC_CPU.h | 1220 +++++++++++++++++ waterbox/sameboy/snes_spc/SPC_DSP.cpp | 1018 ++++++++++++++ waterbox/sameboy/snes_spc/SPC_DSP.h | 304 ++++ waterbox/sameboy/snes_spc/SPC_Filter.cpp | 68 + waterbox/sameboy/snes_spc/SPC_Filter.h | 47 + waterbox/sameboy/snes_spc/blargg_common.h | 186 +++ waterbox/sameboy/snes_spc/blargg_config.h | 24 + waterbox/sameboy/snes_spc/blargg_endian.h | 185 +++ waterbox/sameboy/snes_spc/blargg_source.h | 100 ++ waterbox/sameboy/snes_spc/changes.txt | 107 ++ waterbox/sameboy/snes_spc/dsp.cpp | 48 + waterbox/sameboy/snes_spc/dsp.h | 83 ++ waterbox/sameboy/snes_spc/license.txt | 504 +++++++ waterbox/sameboy/snes_spc/readme.txt | 86 ++ waterbox/sameboy/snes_spc/snes_spc.txt | 318 +++++ waterbox/sameboy/snes_spc/spc.cpp | 74 + waterbox/sameboy/snes_spc/spc.h | 149 ++ 30 files changed, 7030 insertions(+), 21 deletions(-) create mode 100644 waterbox/sameboy/sgb.c create mode 100644 waterbox/sameboy/sgb.h create mode 100644 waterbox/sameboy/snes_spc/SNES_SPC.cpp create mode 100644 waterbox/sameboy/snes_spc/SNES_SPC.h create mode 100644 waterbox/sameboy/snes_spc/SNES_SPC_misc.cpp create mode 100644 waterbox/sameboy/snes_spc/SNES_SPC_state.cpp create mode 100644 waterbox/sameboy/snes_spc/SPC_CPU.h create mode 100644 waterbox/sameboy/snes_spc/SPC_DSP.cpp create mode 100644 waterbox/sameboy/snes_spc/SPC_DSP.h create mode 100644 waterbox/sameboy/snes_spc/SPC_Filter.cpp create mode 100644 waterbox/sameboy/snes_spc/SPC_Filter.h create mode 100644 waterbox/sameboy/snes_spc/blargg_common.h create mode 100644 waterbox/sameboy/snes_spc/blargg_config.h create mode 100644 waterbox/sameboy/snes_spc/blargg_endian.h create mode 100644 waterbox/sameboy/snes_spc/blargg_source.h create mode 100644 waterbox/sameboy/snes_spc/changes.txt create mode 100644 waterbox/sameboy/snes_spc/dsp.cpp create mode 100644 waterbox/sameboy/snes_spc/dsp.h create mode 100644 waterbox/sameboy/snes_spc/license.txt create mode 100644 waterbox/sameboy/snes_spc/readme.txt create mode 100644 waterbox/sameboy/snes_spc/snes_spc.txt create mode 100644 waterbox/sameboy/snes_spc/spc.cpp create mode 100644 waterbox/sameboy/snes_spc/spc.h diff --git a/BizHawk.Client.Common/RomLoader.cs b/BizHawk.Client.Common/RomLoader.cs index 4af0355a29..810c8a303b 100644 --- a/BizHawk.Client.Common/RomLoader.cs +++ b/BizHawk.Client.Common/RomLoader.cs @@ -935,7 +935,7 @@ namespace BizHawk.Client.Common } else { - core = CoreInventory.Instance["SGB", "Pizza Boy"]; + core = CoreInventory.Instance["SGB", "SameBoy"]; } } break; diff --git a/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/LibSameboy.cs b/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/LibSameboy.cs index c9ba9cc16b..4801cd7d45 100644 --- a/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/LibSameboy.cs +++ b/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/LibSameboy.cs @@ -32,6 +32,6 @@ namespace BizHawk.Emulation.Cores.Consoles.Nintendo.Gameboy } [BizImport(CC)] - public abstract bool Init(bool cgb); + public abstract bool Init(bool cgb, byte[] spc, int spclen); } } diff --git a/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/Sameboy.cs b/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/Sameboy.cs index a052576634..a82a4e2e21 100644 --- a/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/Sameboy.cs +++ b/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/Sameboy.cs @@ -34,18 +34,27 @@ namespace BizHawk.Emulation.Cores.Consoles.Nintendo.Gameboy private bool _cgb; private bool _sgb; + [CoreConstructor("SGB")] + public Sameboy(byte[] rom, CoreComm comm) + : this(rom, comm, true) + { } + [CoreConstructor("GB")] public Sameboy(CoreComm comm, byte[] rom) + : this(rom, comm, false) + { } + + public Sameboy(byte[] rom, CoreComm comm, bool sgb) : base(comm, new Configuration { - DefaultWidth = 160, - DefaultHeight = 144, - MaxWidth = 256, - MaxHeight = 224, + DefaultWidth = sgb ? 256 : 160, + DefaultHeight = sgb ? 224 : 144, + MaxWidth = sgb ? 256 : 160, + MaxHeight = sgb ? 224 : 144, MaxSamples = 1024, - DefaultFpsNumerator = TICKSPERSECOND, + DefaultFpsNumerator = sgb ? TICKSPERSECOND_SGB : TICKSPERSECOND, DefaultFpsDenominator = TICKSPERFRAME, - SystemId = "GB" + SystemId = sgb ? "SGB" : "GB" }) { _core = PreInit(new PeRunnerOptions @@ -58,15 +67,19 @@ namespace BizHawk.Emulation.Cores.Consoles.Nintendo.Gameboy MmapHeapSizeKB = 34 * 1024 }); - _cgb = (rom[0x143] & 0xc0) == 0xc0; + _cgb = (rom[0x143] & 0xc0) == 0xc0 && !sgb; + _sgb = sgb; Console.WriteLine("Automaticly detected CGB to " + _cgb); var bios = Util.DecompressGzipFile(new MemoryStream(_cgb ? Resources.SameboyCgbBoot : Resources.SameboyDmgBoot)); // var bios = comm.CoreFileProvider.GetFirmware(_cgb ? "GBC" : "GB", "World", true); + var spc = sgb + ? Util.DecompressGzipFile(new MemoryStream(Resources.SgbCartPresent_SPC)) + : null; _exe.AddReadonlyFile(rom, "game.rom"); _exe.AddReadonlyFile(bios, "boot.rom"); - if (!_core.Init(_cgb)) + if (!_core.Init(_cgb, spc, spc?.Length ?? 0)) { throw new InvalidOperationException("Core rejected the rom!"); } diff --git a/waterbox/sameboy/bizhawk.cpp b/waterbox/sameboy/bizhawk.cpp index c704aaf13a..dbcfdcb0e9 100644 --- a/waterbox/sameboy/bizhawk.cpp +++ b/waterbox/sameboy/bizhawk.cpp @@ -9,12 +9,25 @@ extern "C" { #include "gb.h" #include "joypad.h" #include "apu.h" +#include "sgb.h" } static GB_gameboy_t GB; +static uint32_t GBPixels[160 * 144]; +static uint32_t* CurrentFramebuffer; +static bool sgb; static void VBlankCallback(GB_gameboy_t *gb) { + if (sgb) + { + sgb_take_frame(GBPixels); + sgb_render_frame(CurrentFramebuffer); + } + else + { + memcpy(CurrentFramebuffer, GBPixels, sizeof(GBPixels)); + } } static void LogCallback(GB_gameboy_t *gb, const char *string, GB_log_attributes attributes) @@ -50,6 +63,7 @@ const int SOUND_RATE_GB = 2097152; const int SOUND_RATE_SGB = 2147727; static uint64_t sound_start_clock; static GB_sample_t sample_gb; +static GB_sample_t sample_sgb; static void SampleCallback(GB_gameboy_t *gb, GB_sample_t sample, uint64_t clock) { @@ -61,19 +75,42 @@ static void SampleCallback(GB_gameboy_t *gb, GB_sample_t sample, uint64_t clock) blip_add_delta(rightblip, clock - sound_start_clock, r); sample_gb = sample; } - -ECL_EXPORT bool Init(bool cgb) +static void SgbSampleCallback(int16_t sl, int16_t sr, uint64_t clock) { - if (cgb) + int l = sl - sample_sgb.left; + int r = sr - sample_sgb.right; + if (l) + blip_add_delta(leftblip, clock - sound_start_clock, l); + if (r) + blip_add_delta(rightblip, clock - sound_start_clock, r); + sample_sgb.left = sl; + sample_sgb.right = sr; +} + +ECL_EXPORT bool Init(bool cgb, const uint8_t* spc, int spclen) +{ + if (spc) + { + GB_init_sgb(&GB); + if (!sgb_init(spc, spclen)) + return false; + sgb = true; + } + else if (cgb) + { GB_init_cgb(&GB); + } else + { GB_init(&GB); + } + if (GB_load_boot_rom(&GB, "boot.rom") != 0) return false; - if (GB_load_rom(&GB, "game.rom") != 0) return false; + GB_set_pixels_output(&GB, GBPixels); GB_set_vblank_callback(&GB, VBlankCallback); GB_set_log_callback(&GB, LogCallback); GB_set_rgb_encode_callback(&GB, RgbEncodeCallback); @@ -83,8 +120,8 @@ ECL_EXPORT bool Init(bool cgb) leftblip = blip_new(1024); rightblip = blip_new(1024); - blip_set_rates(leftblip, SOUND_RATE_GB, 44100); - blip_set_rates(rightblip, SOUND_RATE_GB, 44100); + blip_set_rates(leftblip, sgb ? SOUND_RATE_SGB : SOUND_RATE_GB, 44100); + blip_set_rates(rightblip, sgb ? SOUND_RATE_SGB : SOUND_RATE_GB, 44100); return true; } @@ -99,20 +136,36 @@ static int FrameOverflow; ECL_EXPORT void FrameAdvance(MyFrameInfo &f) { - GB_set_pixels_output(&GB, f.VideoBuffer); - GB_set_key_state(&GB, f.Keys & 0xff); - + if (sgb) + { + sgb_set_controller_data((uint8_t*)&f.Keys); + } + else + { + GB_set_key_state(&GB, f.Keys & 0xff); + } sound_start_clock = GB_epoch(&GB); + CurrentFramebuffer = f.VideoBuffer; uint32_t target = 35112 - FrameOverflow; f.Cycles = GB_run_cycles(&GB, target); FrameOverflow = f.Cycles - target; + if (sgb) + { + f.Width = 256; + f.Height = 224; + sgb_render_audio(GB_epoch(&GB), SgbSampleCallback); + } + else + { + f.Width = 160; + f.Height = 144; + } blip_end_frame(leftblip, f.Cycles); blip_end_frame(rightblip, f.Cycles); f.Samples = blip_read_samples(leftblip, f.SoundBuffer, 2048, 1); blip_read_samples(rightblip, f.SoundBuffer + 1, 2048, 1); - f.Width = 160; - f.Height = 144; + CurrentFramebuffer = NULL; } static void SetMemoryArea(MemoryArea *m, GB_direct_access_t access, const char *name, int32_t flags) diff --git a/waterbox/sameboy/gb.c b/waterbox/sameboy/gb.c index 0f6b298b07..814a78811b 100644 --- a/waterbox/sameboy/gb.c +++ b/waterbox/sameboy/gb.c @@ -96,6 +96,20 @@ void GB_init(GB_gameboy_t *gb) GB_reset(gb); } +void GB_init_sgb(GB_gameboy_t *gb) +{ + memset(gb, 0, sizeof(*gb)); + gb->ram = malloc(gb->ram_size = 0x2000); + gb->vram = malloc(gb->vram_size = 0x2000); + gb->is_sgb = true; + + gb->input_callback = default_input_callback; + gb->async_input_callback = default_async_input_callback; + gb->cartridge_type = &GB_cart_defs[0]; // Default cartridge type + + GB_reset(gb); +} + void GB_init_cgb(GB_gameboy_t *gb) { memset(gb, 0, sizeof(*gb)); diff --git a/waterbox/sameboy/gb.h b/waterbox/sameboy/gb.h index d1fb323d3e..e67a89244d 100644 --- a/waterbox/sameboy/gb.h +++ b/waterbox/sameboy/gb.h @@ -234,6 +234,7 @@ struct GB_gameboy_internal_s { uint8_t cgb_ram_bank; /* CPU and General Hardware Flags*/ + bool is_sgb; bool cgb_mode; bool is_cgb; bool cgb_double_speed; @@ -445,6 +446,7 @@ __attribute__((__format__ (__printf__, fmtarg, firstvararg))) #endif void GB_init(GB_gameboy_t *gb); +void GB_init_sgb(GB_gameboy_t *gb); void GB_init_cgb(GB_gameboy_t *gb); bool GB_is_inited(GB_gameboy_t *gb); bool GB_is_cgb(GB_gameboy_t *gb); diff --git a/waterbox/sameboy/memory.c b/waterbox/sameboy/memory.c index 3e34895c97..7ae5368d70 100644 --- a/waterbox/sameboy/memory.c +++ b/waterbox/sameboy/memory.c @@ -1,6 +1,7 @@ #include #include #include "gb.h" +#include "sgb.h" typedef uint8_t GB_read_function_t(GB_gameboy_t *gb, uint16_t addr); typedef void GB_write_function_t(GB_gameboy_t *gb, uint16_t addr, uint8_t value); @@ -134,6 +135,11 @@ static uint8_t read_high_memory(GB_gameboy_t *gb, uint16_t addr) } if (addr < 0xFF80) { + if (addr == 0xff00 && gb->is_sgb) + { + return sgb_read_ff00(gb->cycles_since_epoch); + } + switch (addr & 0xFF) { case GB_IO_IF: return gb->io_registers[GB_IO_IF] | 0xE0; @@ -406,6 +412,12 @@ static void write_high_memory(GB_gameboy_t *gb, uint16_t addr, uint8_t value) } if (addr < 0xFF80) { + if (addr == 0xff00 && gb->is_sgb) + { + sgb_write_ff00(value, gb->cycles_since_epoch); + return; + } + /* Hardware registers */ switch (addr & 0xFF) { diff --git a/waterbox/sameboy/sgb.c b/waterbox/sameboy/sgb.c new file mode 100644 index 0000000000..896cc68c73 --- /dev/null +++ b/waterbox/sameboy/sgb.c @@ -0,0 +1,1001 @@ +#include "sgb.h" +#include +#include +#include +#include "snes_spc/spc.h" + +#define utils_log printf + +const uint8_t iplrom[64] = { + /*ffc0*/ 0xcd, 0xef, //mov x,#$ef + /*ffc2*/ 0xbd, //mov sp,x + /*ffc3*/ 0xe8, 0x00, //mov a,#$00 + /*ffc5*/ 0xc6, //mov (x),a + /*ffc6*/ 0x1d, //dec x + /*ffc7*/ 0xd0, 0xfc, //bne $ffc5 + /*ffc9*/ 0x8f, 0xaa, 0xf4, //mov $f4,#$aa + /*ffcc*/ 0x8f, 0xbb, 0xf5, //mov $f5,#$bb + /*ffcf*/ 0x78, 0xcc, 0xf4, //cmp $f4,#$cc + /*ffd2*/ 0xd0, 0xfb, //bne $ffcf + /*ffd4*/ 0x2f, 0x19, //bra $ffef + /*ffd6*/ 0xeb, 0xf4, //mov y,$f4 + /*ffd8*/ 0xd0, 0xfc, //bne $ffd6 + /*ffda*/ 0x7e, 0xf4, //cmp y,$f4 + /*ffdc*/ 0xd0, 0x0b, //bne $ffe9 + /*ffde*/ 0xe4, 0xf5, //mov a,$f5 + /*ffe0*/ 0xcb, 0xf4, //mov $f4,y + /*ffe2*/ 0xd7, 0x00, //mov ($00)+y,a + /*ffe4*/ 0xfc, //inc y + /*ffe5*/ 0xd0, 0xf3, //bne $ffda + /*ffe7*/ 0xab, 0x01, //inc $01 + /*ffe9*/ 0x10, 0xef, //bpl $ffda + /*ffeb*/ 0x7e, 0xf4, //cmp y,$f4 + /*ffed*/ 0x10, 0xeb, //bpl $ffda + /*ffef*/ 0xba, 0xf6, //movw ya,$f6 + /*fff1*/ 0xda, 0x00, //movw $00,ya + /*fff3*/ 0xba, 0xf4, //movw ya,$f4 + /*fff5*/ 0xc4, 0xf4, //mov $f4,a + /*fff7*/ 0xdd, //mov a,y + /*fff8*/ 0x5d, //mov x,a + /*fff9*/ 0xd0, 0xdb, //bne $ffd6 + /*fffb*/ 0x1f, 0x00, 0x00, //jmp ($0000+x) + /*fffe*/ 0xc0, 0xff //reset vector location ($ffc0) +}; + +// the "reference clock" is tied to the GB cpu. 35112 of these should equal one GB LCD frame. +// it is always increasing and never resets/rebases + +const int refclocks_per_spc_sample = 67; // ~32055hz + +typedef struct +{ + // writes to FF00 + uint64_t last_write_time; // last write time relative to reference clock + uint8_t last_write_value; + + // recv packets + uint8_t read_index; // 0-127, index of the next bit read. if 255, not currently reading + uint8_t packet[16]; // a packet in the process of being formed + + uint8_t command[16 * 7]; // a command in the process of being formed + uint8_t expected_packets; // total number of packets expected for a command + uint8_t next_packet; // index of the next packet to be read + + // joypad reading + uint8_t joypad_index; // index of currently reading joypad + uint8_t num_joypads; // number of currently selected joypads (MLT_REQ) + uint8_t joypad_data[4]; // data for each joypad + uint8_t joypad_has_been_read; // state for advancing joypad_index. extermely weird; logic lifted from VBA and probably wrong + + // palettes + uint32_t palette[8][16]; + uint32_t auxpalette[512][4]; + + // border + uint8_t tiles[256][64]; // tiles stored in packed form + uint16_t tilemap[32 * 32]; + + // frame data + uint8_t frame[160 * 144]; // the most recent obtained full frame + uint32_t frozenframe[256 * 224]; // the most recent saved full frame (MASK_EN) + uint8_t attr[20 * 18]; // current attr map for the GB screen + uint8_t auxattr[45][20 * 18]; // 45 attr files + + // MASK_EN + uint8_t active_mask; // true if mask is currently being used + + // audio + SNES_SPC *spc; + uint64_t frame_start; // when the current audio frame started relative to reference clock + uint32_t clock_remainder; // number of reference clocks not sent to the SPC last frame + uint8_t sound_control[4]; // TODO... + + // transfers + uint32_t waiting_transfer; +#define TRN_NONE 0 +#define TRN_SOUND 1 +#define TRN_PAL 2 +#define TRN_CHR_LOW 3 +#define TRN_CHR_HI 4 +#define TRN_PCT 5 +#define TRN_ATTR 6 + int32_t transfer_countdown; // number of frames until transfer. not entirely accurate +} sgb_t; + +static sgb_t sgb; + +static uint32_t makecol(uint16_t c) +{ + return c >> 7 & 0xf8 | c >> 12 & 0x07 | c << 6 & 0xf800 | c << 1 & 0x0700 | c << 19 & 0xf80000 | c << 14 & 0x070000 | 0xff000000; +} + +static void cmd_trn(uint32_t which) +{ + if ((sgb.command[0] & 7) == 1) + { + if (sgb.waiting_transfer == TRN_NONE) + { + sgb.waiting_transfer = which; + sgb.transfer_countdown = 4; + } + else + { + utils_log("SGB: TRN already queued!\n"); + } + } + else + { + utils_log("SGB: cmd_trn bad length\n"); + } +} + +static void cmd_pal(int a, int b) +{ + if ((sgb.command[0] & 7) == 1) + { + uint32_t c[7]; + for (int i = 0; i < 7; i++) + c[i] = makecol(sgb.command[i * 2 + 1] | sgb.command[i * 2 + 2] << 8); + sgb.palette[0][0] = c[0]; + sgb.palette[1][0] = c[0]; + sgb.palette[2][0] = c[0]; + sgb.palette[3][0] = c[0]; + sgb.palette[a][1] = c[1]; + sgb.palette[a][2] = c[2]; + sgb.palette[a][3] = c[3]; + sgb.palette[b][1] = c[4]; + sgb.palette[b][2] = c[5]; + sgb.palette[b][3] = c[6]; + } + else + { + utils_log("SGB: cmd_pal bad length\n"); + } +} + +static void cmd_pal_set(void) +{ + if ((sgb.command[0] & 7) == 1) + { + int p0 = sgb.command[1] | sgb.command[2] << 8 & 0x100; + for (int i = 0; i < 4; i++) + { + int p = sgb.command[i * 2 + 1] | sgb.command[i * 2 + 2] << 8 & 0x100; + sgb.palette[i][0] = sgb.auxpalette[p0][0]; + sgb.palette[i][1] = sgb.auxpalette[p][1]; + sgb.palette[i][2] = sgb.auxpalette[p][2]; + sgb.palette[i][3] = sgb.auxpalette[p][3]; + } + if (sgb.command[9] & 0x80) // change attribute + { + int attr = sgb.command[9] & 0x3f; + if (attr >= 45) + attr = 44; + memcpy(sgb.attr, sgb.auxattr[attr], sizeof(sgb.attr)); + } + if (sgb.command[9] & 0x40) // cancel mask + { + sgb.active_mask = 0; + } + } + else + { + utils_log("SGB: cmd_pal bad length\n"); + } +} + +static void cmd_attr_blk() +{ + int nset = sgb.command[1]; + if (nset <= 0 || nset >= 19) + { + utils_log("SGB: cmd_attr_blk bad nset\n"); + return; + } + int npacket = (nset * 6 + 16) / 16; + if ((sgb.command[0] & 7) != npacket) + { + utils_log("SGB: cmd_attr_blk bad length\n"); + return; + } + for (int i = 0; i < nset; i++) + { + int ctrl = sgb.command[i * 6 + 2] & 7; + int pals = sgb.command[i * 6 + 3]; + int x1 = sgb.command[i * 6 + 4]; + int y1 = sgb.command[i * 6 + 5]; + int x2 = sgb.command[i * 6 + 6]; + int y2 = sgb.command[i * 6 + 7]; + int inside = ctrl & 1; + int line = ctrl & 2; + int outside = ctrl & 4; + int insidepal = pals & 3; + int linepal = pals >> 2 & 3; + int outsidepal = pals >> 4 & 3; + if (ctrl == 1) + { + ctrl = 3; + linepal = insidepal; + } + else if (ctrl == 4) + { + ctrl = 6; + linepal = outsidepal; + } + uint8_t *dst = sgb.attr; + for (int y = 0; y < 18; y++) + { + for (int x = 0; x < 20; x++) + { + if (outside && (x < x1 || x > x2 || y < y1 || y > y2)) + *dst = outsidepal; + else if (inside && x > x1 && x < x2 && y > y1 && y < y2) + *dst = insidepal; + else if (line) + *dst = linepal; + dst++; + } + } + } +} + +static void cmd_attr_lin() +{ + int nset = sgb.command[1]; + if (nset <= 0 || nset >= 111) + { + utils_log("SGB: cmd_attr_lin bad nset\n"); + return; + } + int npacket = (nset + 17) / 16; + if ((sgb.command[0] & 7) != npacket) + { + utils_log("SGB: cmd_attr_lin bad length\n"); + return; + } + for (int i = 0; i < nset; i++) + { + uint8_t v = sgb.command[i + 2]; + int line = v & 31; + int a = v >> 5 & 3; + if (v & 0x80) // horizontal + { + if (line > 17) + line = 17; + memset(sgb.attr + line * 20, a, 20); + } + else // vertical + { + if (line > 19) + line = 19; + uint8_t *dst = sgb.attr + line; + for (int i = 0; i < 18; i++, dst += 20) + dst[0] = a; + } + } +} + +static void cmd_attr_div() +{ + if ((sgb.command[0] & 7) == 1) + { + uint8_t v = sgb.command[1]; + + int c = v & 3; + int a = v >> 2 & 3; + int b = v >> 4 & 3; + + int pos = sgb.command[2]; + uint8_t *dst = sgb.attr; + if (v & 0x40) // horizontal + { + if (pos > 17) + pos = 17; + int i; + for (i = 0; i < pos; i++, dst += 20) + memset(dst, a, 20); + memset(dst, b, 20); + i++, dst += 20; + for (; i < 18; i++, dst += 20) + memset(dst, c, 20); + } + else // vertical + { + if (pos > 19) + pos = 19; + for (int j = 0; j < 18; j++) + { + int i; + for (i = 0; i < pos; i++) + *dst++ = a; + *dst++ = b; + i++; + for (; i < 20; i++) + *dst++ = c; + } + } + } + else + { + utils_log("SGB: cmd_attr_div bad length\n"); + } +} + +static void cmd_attr_chr() +{ + int x = sgb.command[1]; + int y = sgb.command[2]; + int n = sgb.command[3] | sgb.command[4] << 8; + if (n > 360) + { + utils_log("SGB: cmd_attr_chr bad n\n"); + return; + } + int npacket = (n + 87) / 64; + if ((sgb.command[0] & 7) != npacket) + { + utils_log("SGB: cmd_attr_chr bad length\n"); + return; + } + uint8_t *dst = sgb.attr; + if (x > 19) + x = 19; + if (y > 17) + y = 17; + int vertical = sgb.command[5]; + for (int i = 0; i < 360; i++) + { + uint8_t v = i / 4 + 6; + int a = v >> (2 * (3 - (i & 3))) & 3; + dst[y * 20 + x] = a; + if (vertical) + { + y++; + if (y == 18) + { + y = 0; + x++; + if (x == 20) + return; + } + } + else + { + x++; + if (x == 20) + { + x = 0; + y++; + if (y == 18) + return; + } + } + } +} + +static void cmd_attr_set() +{ + if ((sgb.command[0] & 7) == 1) + { + int attr = sgb.command[1] & 0x3f; + if (attr >= 45) + attr = 44; + memcpy(sgb.attr, sgb.auxattr[attr], sizeof(sgb.attr)); + if (sgb.command[1] & 0x40) + { + sgb.active_mask = 0; + } + } + else + { + utils_log("SGB: cmd_attr_set bad length\n"); + } +} + +static void cmd_mlt_req(void) +{ + if ((sgb.command[0] & 7) == 1) + { + switch (sgb.command[1] & 3) + { + case 0: + case 2: + sgb.num_joypads = 1; + sgb.joypad_index = 0; + break; + case 1: + sgb.num_joypads = 2; + sgb.joypad_index = 1; + break; + case 3: + sgb.num_joypads = 4; + sgb.joypad_index = 1; + break; + } + utils_log("SGB: %u joypads\n", sgb.num_joypads); + } + else + { + utils_log("SGB: cmd_mlt_req bad length\n"); + } +} + +static void cmd_mask(void) +{ + if ((sgb.command[0] & 7) == 1) + { + switch (sgb.command[1] & 3) + { + case 0: + sgb.active_mask = 0; + break; + case 1: + sgb.active_mask = 1; + break; + case 2: + case 3: + sgb.active_mask = 1; + for (int i = 0; i < 256 * 224; i++) + sgb.frozenframe[i] = sgb.palette[0][0]; + break; + } + } + else + { + utils_log("SGB: cmd_mask bad length\n"); + } +} + +static void cmd_sound(void) +{ + if ((sgb.command[0] & 7) == 1) + { + sgb.sound_control[1] = sgb.command[1]; + sgb.sound_control[2] = sgb.command[2]; + sgb.sound_control[3] = sgb.command[3]; + sgb.sound_control[0] = sgb.command[4]; + } + else + { + utils_log("SGB: cmd_sound bad length\n"); + } +} + +static void do_command(void) +{ + const int command = sgb.command[0] >> 3; + switch (command) + { + default: + utils_log("SGB: Unknown or unimplemented command %02xh\n", command); + break; + + case 0x00: // PAL01 + utils_log("SGB: PAL01\n"); + cmd_pal(0, 1); + break; + case 0x01: // PAL23 + utils_log("SGB: PAL23\n"); + cmd_pal(2, 3); + break; + case 0x02: // PAL03 + utils_log("SGB: PAL03\n"); + cmd_pal(0, 3); + break; + case 0x03: // PAL12 + utils_log("SGB: PAL12\n"); + cmd_pal(1, 2); + break; + case 0x0a: // PAL_SET + utils_log("SGB: PAL_SET\n"); + cmd_pal_set(); + break; + + case 0x04: // ATTR_BLK + utils_log("SGB: ATTR_BLK\n"); + cmd_attr_blk(); + break; + case 0x05: // ATTR_LIN + utils_log("SGB: ATTR_LIN\n"); + cmd_attr_lin(); + break; + case 0x06: // ATTR_DIV + utils_log("SGB: ATTR_DIV\n"); + cmd_attr_div(); + break; + case 0x07: // ATTR_CHR + utils_log("SGB: ATTR_CHR\n"); + cmd_attr_chr(); + break; + case 0x16: // ATTR_SET + utils_log("SGB: ATTR_SET\n"); + cmd_attr_set(); + break; + + case 0x17: // MASK_EN + utils_log("SGB: MASK_EN\n"); + cmd_mask(); + break; + + // unknown functions + case 0x0c: // ATRC_EN + utils_log("SGB: ATRC_EN??\n"); + break; + case 0x0d: // TEST_EN + utils_log("SGB: TEST_EN??\n"); + break; + case 0x0e: // ICON_EN + utils_log("SGB: ICON_EN??\n"); + break; + case 0x18: // OBJ_TRN + // no game used this + utils_log("SGB: OBJ_TRN??\n"); + break; + + // unimplementable functions + case 0x0f: // DATA_SND + // TODO: Is it possible for this (and DATA_TRN) to write data to + // memory areas used for the attribute file, etc? + // If so, do games do this? + utils_log("SGB: DATA_SND!! %02x:%02x%02x [%02x]\n", sgb.command[3], sgb.command[2], sgb.command[1], sgb.command[4]); + break; + case 0x10: // DATA_TRN + utils_log("SGB: DATA_TRN!!\n"); + break; + case 0x12: // JUMP + utils_log("SGB: JUMP!!\n"); + break; + + // joypad + case 0x11: // MLT_REQ + utils_log("SGB: MLT_REQ\n"); + cmd_mlt_req(); + break; + + // sound + case 0x08: // SOUND + utils_log("SGB: SOUND %02x %02x %02x %02x\n", sgb.command[1], sgb.command[2], sgb.command[3], sgb.command[4]); + cmd_sound(); + break; + + // all vram transfers + case 0x09: // SOU_TRN + utils_log("SGB: SOU_TRN\n"); + cmd_trn(TRN_SOUND); + break; + case 0x0b: // PAL_TRN + utils_log("SGB: PAL_TRN\n"); + cmd_trn(TRN_PAL); + break; + case 0x13: // CHR_TRN + utils_log("SGB: CHR_TRN\n"); + cmd_trn(sgb.command[1] & 1 ? TRN_CHR_HI : TRN_CHR_LOW); + break; + case 0x14: // PCT_TRN + utils_log("SGB: PCT_TRN\n"); + cmd_trn(TRN_PCT); + break; + case 0x15: // ATTR_TRN + utils_log("SGB: ATTR_TRN\n"); + cmd_trn(TRN_ATTR); + break; + } +} + +static void do_packet(void) +{ + memcpy(sgb.command + sgb.next_packet * 16, sgb.packet, sizeof(sgb.packet)); + sgb.next_packet++; + + if (sgb.expected_packets == 0) // not in the middle of a command + sgb.expected_packets = sgb.command[0] & 7; + + if (sgb.expected_packets == 0) // huh? + { + utils_log("SGB: zero packet command\n"); + sgb.expected_packets = 0; + sgb.next_packet = 0; + } + else if (sgb.next_packet == sgb.expected_packets) + { + do_command(); + sgb.expected_packets = 0; + sgb.next_packet = 0; + } +} + +int sgb_init(const uint8_t *spc, int length) +{ + memset(&sgb, 0, sizeof(sgb)); + sgb.read_index = 255; + sgb.num_joypads = 1; + sgb.palette[0][0] = 0xffffffff; + sgb.palette[0][1] = 0xffaaaaaa; + sgb.palette[0][2] = 0xff555555; + sgb.palette[0][3] = 0xff000000; + + sgb.spc = spc_new(); + spc_init_rom(sgb.spc, iplrom); + spc_reset(sgb.spc); + if (spc_load_spc(sgb.spc, spc, length) != NULL) + { + utils_log("SGB: Failed to load SPC\n"); + return 0; + } + + return 1; +} + +void sgb_write_ff00(uint8_t val, uint64_t time) +{ + val &= 0x30; + + //utils_log("ZZ: %02x, %llu", val, time); + const int p14_fell = (val & 0x10) < (sgb.last_write_value & 0x10); + const int p15_fell = (val & 0x20) < (sgb.last_write_value & 0x20); + const int p14_rose = (val & 0x10) > (sgb.last_write_value & 0x10); + const int p15_rose = (val & 0x20) > (sgb.last_write_value & 0x20); + + if (val == 0) // reset command processing + { + sgb.read_index = 0; + memset(sgb.packet, 0, sizeof(sgb.packet)); + } + else if (sgb.read_index != 255) // currently reading a packet + { + if (p14_fell || p15_fell) + { + if (sgb.read_index == 128) // end of packet + { + if (p14_fell) + do_packet(); + else + utils_log("SGB: Stop bit not present\n"); + sgb.read_index = 255; + } + else + { + if (p15_fell) + { + int byte = sgb.read_index >> 3; + int bit = sgb.read_index & 7; + sgb.packet[byte] |= 1 << bit; + } + sgb.read_index++; + } + } + } + else // joypad processing + { + if (val == 0x10) + sgb.joypad_has_been_read |= 2; // reading P15 + if (val == 0x20) + sgb.joypad_has_been_read |= 1; // reading P14 + if (val == 0x30 && (p14_rose || p15_rose)) + { + if (sgb.joypad_has_been_read == 7) + { + sgb.joypad_has_been_read = 0; + sgb.joypad_index++; + sgb.joypad_index &= sgb.num_joypads - 1; + //utils_log("SGB: joypad index to %u", sgb.joypad_index); + } + else + { + sgb.joypad_has_been_read &= 3; // the other line must be asserted and a read must happen before joypad_index inc?? + } + } + } + + sgb.last_write_value = val; + sgb.last_write_time = time; +} + +uint8_t sgb_read_ff00(uint64_t time) +{ + uint8_t ret = sgb.last_write_value & 0xf0 | 0xc0; + const int p14 = !(ret & 0x10); + const int p15 = !(ret & 0x20); + const int ji = sgb.joypad_index; + + // TODO: is this "reset" correct? + sgb.joypad_has_been_read |= 4; // read occured + sgb.read_index = 255; + sgb.next_packet = 0; + sgb.expected_packets = 0; + + if (!p14 && !p15) + { + //utils_log("SGB: SCAN%u", ji); + // scan id + return ret | (15 - ji); + } + else + { + // get data + const uint8_t j = sgb.joypad_data[ji]; + if (p14) + ret |= j >> 4; + if (p15) + ret |= j & 0x0f; + //utils_log("SGB: READ%u %02x", ji, ret ^ 0x0f); + return ret ^ 0x0f; + } +} + +// for each of 4 joypads: +// 7......0 +// DULRSsBA +void sgb_set_controller_data(const uint8_t *buttons) +{ + memcpy(sgb.joypad_data, buttons, sizeof(sgb.joypad_data)); +} + +static void trn_sound(const uint8_t* data) +{ + int len = data[0] | data[1] << 8; + int addr = data[2] | data[3] << 8; + utils_log("TRN_SOUND %04x %04x\n", addr, len); + uint8_t* dst = spc_get_ram(sgb.spc); + + if (len > 0xffc) + { + utils_log("TRN_SOUND src overflow\n"); + return; + } + if (len + addr >= 0x10000) + { + utils_log("TRN_SOUND dst overflow\n"); + return; + } + memcpy(dst + addr, data + 4, len); +} + +static void trn_pal(const uint8_t *data) +{ + const uint16_t *src = (const uint16_t *)data; + uint32_t *dst = sgb.auxpalette[0]; + for (int i = 0; i < 2048; i++) + dst[i] = makecol(src[i]); +} + +static void trn_attr(const uint8_t *data) +{ + uint8_t *dst = sgb.auxattr[0]; + for (int n = 0; n < 45 * 90; n++) + { + uint8_t s = *data++; + *dst++ = s >> 6 & 3; + *dst++ = s >> 4 & 3; + *dst++ = s >> 2 & 3; + *dst++ = s >> 0 & 3; + } +} + +static void trn_pct(const uint8_t *data) +{ + memcpy(sgb.tilemap, data, sizeof(sgb.tilemap)); + const uint16_t *palettes = (const uint16_t *)(data + sizeof(sgb.tilemap)); + uint32_t *dst = sgb.palette[4]; + for (int i = 0; i < 64; i++) + dst[i] = makecol(palettes[i]); +} + +static void trn_chr(const uint8_t *data, int bank) +{ + uint8_t *dst = sgb.tiles[128 * bank]; + for (int n = 0; n < 128; n++) + { + for (int y = 0; y < 8; y++) + { + int a = data[0]; + int b = data[1] << 1; + int c = data[16] << 2; + int d = data[17] << 3; + for (int x = 7; x >= 0; x--) + { + dst[x] = a & 1 | b & 2 | c & 4 | d & 8; + a >>= 1; + b >>= 1; + c >>= 1; + d >>= 1; + } + dst += 8; + data += 2; + } + data += 16; + } +} + +static void do_vram_transfer(void) +{ + uint8_t vram[4096]; + for (int tilenum = 0; tilenum < 256; tilenum++) + { + const int ty = tilenum / 20; + const int tx = tilenum % 20; + const uint8_t *src = sgb.frame + ty * 8 * 160 + tx * 8; + uint8_t *dst = vram + 16 * tilenum; + for (int j = 0; j < 8; j++) + { + uint32_t a = 0, b = 0; + a |= (src[7] & 1) << 0; + a |= (src[6] & 1) << 1; + a |= (src[5] & 1) << 2; + a |= (src[4] & 1) << 3; + a |= (src[3] & 1) << 4; + a |= (src[2] & 1) << 5; + a |= (src[1] & 1) << 6; + a |= (src[0] & 1) << 7; + + b |= (src[7] & 2) >> 1; + b |= (src[6] & 2) << 0; + b |= (src[5] & 2) << 1; + b |= (src[4] & 2) << 2; + b |= (src[3] & 2) << 3; + b |= (src[2] & 2) << 4; + b |= (src[1] & 2) << 5; + b |= (src[0] & 2) << 6; + *dst++ = a; + *dst++ = b; + src += 160; + } + } + + switch (sgb.waiting_transfer) + { + case TRN_SOUND: + trn_sound(vram); + break; + case TRN_PAL: + trn_pal(vram); + break; + case TRN_CHR_LOW: + trn_chr(vram, 0); + break; + case TRN_CHR_HI: + trn_chr(vram, 1); + break; + case TRN_PCT: + trn_pct(vram); + break; + case TRN_ATTR: + trn_attr(vram); + break; + } +} + +static void sgb_render_frame_gb(uint32_t *vbuff) +{ + const uint8_t *attr = sgb.attr; + const uint8_t *src = sgb.frame; + uint32_t *dst = vbuff + ((224 - 144) / 2 * 256 + (256 - 160) / 2); + + for (int j = 0; j < 144; j++) + { + const uint8_t *attr_line = attr + j / 8 * 20; + for (int i = 0; i < 160; i++) + { + const int attr_index = i / 8; + *dst++ = sgb.palette[attr_line[attr_index]][*src++]; + } + dst += 256 - 160; + } +} + +static void draw_tile(uint16_t entry, uint32_t *dest) +{ + const uint8_t *tile = sgb.tiles[entry & 0xff]; + const uint32_t *palette = sgb.palette[entry >> 10 & 7]; + int hflip = entry & 0x4000; + int vflip = entry & 0x8000; + int hinc, vinc; + if (hflip) + { + hinc = -1; + dest += 7; + } + else + { + hinc = 1; + } + if (vflip) + { + vinc = -256; + dest += 7 * 256; + } + else + { + vinc = 256; + } + vinc -= 8 * hinc; + for (int y = 0; y < 8; y++, dest += vinc) + { + for (int x = 0; x < 8; x++, dest += hinc) + { + int c = *tile++; + if (c) + *dest = palette[c]; + } + } +} + +static void sgb_render_border(uint32_t *vbuff) +{ + const uint16_t *tilemap = sgb.tilemap; + for (int n = 0; n < 32 * 28; n++) + { + draw_tile(*tilemap++, vbuff); + vbuff += 8; + if ((n & 31) == 31) + vbuff += 256 * 7; + } +} + +// 160x144 32bpp pixel data +// assumed to contain exact pixel values 00, 55, aa, ff +void sgb_take_frame(uint32_t *vbuff) +{ + for (int i = 0; i < 160 * 144; i++) + { + sgb.frame[i] = 3 - (vbuff[i] >> 6 & 3); // 0, 1, 2, or 3 for each pixel + } + if (sgb.waiting_transfer != TRN_NONE) + { + if (!--sgb.transfer_countdown) + { + do_vram_transfer(); + sgb.waiting_transfer = TRN_NONE; + } + } + if (!sgb.active_mask) + { + // render the frame now + for (int i = 0; i < 256 * 224; i++) + sgb.frozenframe[i] = sgb.palette[0][0]; + sgb_render_frame_gb(sgb.frozenframe); + sgb_render_border(sgb.frozenframe); + } +} + +void sgb_render_frame(uint32_t *vbuff) +{ + memcpy(vbuff, sgb.frozenframe, sizeof(sgb.frozenframe)); +} + +void sgb_render_audio(uint64_t time, void (*callback)(int16_t l, int16_t r, uint64_t time)) +{ + int16_t sound_buffer[4096]; + uint32_t diff = time - sgb.frame_start + sgb.clock_remainder; + //utils_log("%ul", diff); + + uint32_t samples = diff / refclocks_per_spc_sample; + uint32_t new_remainder = diff % refclocks_per_spc_sample; + + spc_set_output(sgb.spc, sound_buffer, sizeof(sound_buffer) / sizeof(sound_buffer[0])); + int p; + for (p = 0; p < 4; p++) + { + if (spc_read_port(sgb.spc, 0, p) != sgb.sound_control[p]) + break; + } + if (p == 4) // recived + { + sgb.sound_control[0] = 0; + sgb.sound_control[1] = 0; + sgb.sound_control[2] = 0; + } + for (p = 0; p < 4; p++) + { + spc_write_port(sgb.spc, 0, p, sgb.sound_control[p]); + } + + spc_end_frame(sgb.spc, samples * 32); + + uint64_t t = sgb.frame_start + refclocks_per_spc_sample - sgb.clock_remainder; + for (int i = 0; i < samples; i++, t += refclocks_per_spc_sample) + callback(sound_buffer[i * 2], sound_buffer[i * 2] + 1, t); + + sgb.frame_start = time; + sgb.clock_remainder = new_remainder; +} diff --git a/waterbox/sameboy/sgb.h b/waterbox/sameboy/sgb.h new file mode 100644 index 0000000000..35e76dcad9 --- /dev/null +++ b/waterbox/sameboy/sgb.h @@ -0,0 +1,36 @@ +#pragma once +#include + +// whenever a time is asked for, it is relative to a clock that ticks 35112 times +// per nominal frame on the GB lcd, starts at 0 when emulation begins, and never resets/rebases + +// write to MMIO ff00. only bits 4 and 5 are used +void sgb_write_ff00(uint8_t val, uint64_t time); + +// read from MMIO ff00. supplies data for all 8 bits +uint8_t sgb_read_ff00(uint64_t time); + +// set controller data to be used by subsequent controller reads +// buttons[0] = controller 1, buttons[3] = controller 4 +// 7......0 +// DULRSsBA +void sgb_set_controller_data(const uint8_t* buttons); + +// initialize the SGB module. pass an SPC file that results from the real S-CPU initialization, +// and the length of that file +int sgb_init(const uint8_t* spc, int length); + +// call whenever the gameboy has finished producing a video frame +// data is 32bpp 160x144 screen data. for each pixel: +//31 7 0 +// xxxxxxxx xxxxxxxx xxxxxxxx DDxxxxxx -- DD = 0, 1, 2, or 3. x = don't care +void sgb_take_frame(uint32_t* vbuff); + +// copy the finished video frame to an output buffer. pixel format is 32bpp xrgb +// can be called at any time, including right after sgb_take_frame +void sgb_render_frame(uint32_t* vbuff); + +// call to finish a frame's worth of audio. should be called once every 35112 time units (some jitter is OK) +// callback will be called with L and R sample values for various time points +// between the last time sgb_render_audio was called and now +void sgb_render_audio(uint64_t time, void(*callback)(int16_t l, int16_t r, uint64_t time)); diff --git a/waterbox/sameboy/snes_spc/SNES_SPC.cpp b/waterbox/sameboy/snes_spc/SNES_SPC.cpp new file mode 100644 index 0000000000..fb3b147ae8 --- /dev/null +++ b/waterbox/sameboy/snes_spc/SNES_SPC.cpp @@ -0,0 +1,564 @@ +// Core SPC emulation: CPU, timers, SMP registers, memory + +// snes_spc 0.9.0. http://www.slack.net/~ant/ + +#include "SNES_SPC.h" + +#include + +/* Copyright (C) 2004-2007 Shay Green. This module is free software; you +can redistribute it and/or modify it under the terms of the GNU Lesser +General Public License as published by the Free Software Foundation; either +version 2.1 of the License, or (at your option) any later version. This +module is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +details. You should have received a copy of the GNU Lesser General Public +License along with this module; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ + +#include "blargg_source.h" + +#define RAM (m.ram.ram) +#define REGS (m.smp_regs [0]) +#define REGS_IN (m.smp_regs [1]) + +// (n ? n : 256) +#define IF_0_THEN_256( n ) ((uint8_t) ((n) - 1) + 1) + +// Note: SPC_MORE_ACCURACY exists mainly so I can run my validation tests, which +// do crazy echo buffer accesses. +#ifndef SPC_MORE_ACCURACY + #define SPC_MORE_ACCURACY 0 +#endif + +#ifdef BLARGG_ENABLE_OPTIMIZER + #include BLARGG_ENABLE_OPTIMIZER +#endif + + +//// Timers + +#if SPC_DISABLE_TEMPO + #define TIMER_DIV( t, n ) ((n) >> t->prescaler) + #define TIMER_MUL( t, n ) ((n) << t->prescaler) +#else + #define TIMER_DIV( t, n ) ((n) / t->prescaler) + #define TIMER_MUL( t, n ) ((n) * t->prescaler) +#endif + +SNES_SPC::Timer* SNES_SPC::run_timer_( Timer* t, rel_time_t time ) +{ + int elapsed = TIMER_DIV( t, time - t->next_time ) + 1; + t->next_time += TIMER_MUL( t, elapsed ); + + if ( t->enabled ) + { + int remain = IF_0_THEN_256( t->period - t->divider ); + int divider = t->divider + elapsed; + int over = elapsed - remain; + if ( over >= 0 ) + { + int n = over / t->period; + t->counter = (t->counter + 1 + n) & 0x0F; + divider = over - n * t->period; + } + t->divider = (uint8_t) divider; + } + return t; +} + +inline SNES_SPC::Timer* SNES_SPC::run_timer( Timer* t, rel_time_t time ) +{ + if ( time >= t->next_time ) + t = run_timer_( t, time ); + return t; +} + + +//// ROM + +void SNES_SPC::enable_rom( int enable ) +{ + if ( m.rom_enabled != enable ) + { + m.rom_enabled = enable; + if ( enable ) + memcpy( m.hi_ram, &RAM [rom_addr], sizeof m.hi_ram ); + memcpy( &RAM [rom_addr], (enable ? m.rom : m.hi_ram), rom_size ); + // TODO: ROM can still get overwritten when DSP writes to echo buffer + } +} + + +//// DSP + +#if SPC_LESS_ACCURATE + int const max_reg_time = 29; + + signed char const SNES_SPC::reg_times_ [256] = + { + -1, 0,-11,-10,-15,-11, -2, -2, 4, 3, 14, 14, 26, 26, 14, 22, + 2, 3, 0, 1,-12, 0, 1, 1, 7, 6, 14, 14, 27, 14, 14, 23, + 5, 6, 3, 4, -1, 3, 4, 4, 10, 9, 14, 14, 26, -5, 14, 23, + 8, 9, 6, 7, 2, 6, 7, 7, 13, 12, 14, 14, 27, -4, 14, 24, + 11, 12, 9, 10, 5, 9, 10, 10, 16, 15, 14, 14, -2, -4, 14, 24, + 14, 15, 12, 13, 8, 12, 13, 13, 19, 18, 14, 14, -2,-36, 14, 24, + 17, 18, 15, 16, 11, 15, 16, 16, 22, 21, 14, 14, 28, -3, 14, 25, + 20, 21, 18, 19, 14, 18, 19, 19, 25, 24, 14, 14, 14, 29, 14, 25, + + 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, + 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, + 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, + 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, + 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, + 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, + 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, + 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, + }; + + #define RUN_DSP( time, offset ) \ + int count = (time) - (offset) - m.dsp_time;\ + if ( count >= 0 )\ + {\ + int clock_count = (count & ~(clocks_per_sample - 1)) + clocks_per_sample;\ + m.dsp_time += clock_count;\ + dsp.run( clock_count );\ + } +#else + #define RUN_DSP( time, offset ) \ + {\ + int count = (time) - m.dsp_time;\ + if ( !SPC_MORE_ACCURACY || count )\ + {\ + assert( count > 0 );\ + m.dsp_time = (time);\ + dsp.run( count );\ + }\ + } +#endif + +int SNES_SPC::dsp_read( rel_time_t time ) +{ + RUN_DSP( time, reg_times [REGS [r_dspaddr] & 0x7F] ); + + int result = dsp.read( REGS [r_dspaddr] & 0x7F ); + + #ifdef SPC_DSP_READ_HOOK + SPC_DSP_READ_HOOK( spc_time + time, (REGS [r_dspaddr] & 0x7F), result ); + #endif + + return result; +} + +inline void SNES_SPC::dsp_write( int data, rel_time_t time ) +{ + RUN_DSP( time, reg_times [REGS [r_dspaddr]] ) + #if SPC_LESS_ACCURATE + else if ( m.dsp_time == skipping_time ) + { + int r = REGS [r_dspaddr]; + if ( r == SPC_DSP::r_kon ) + m.skipped_kon |= data & ~dsp.read( SPC_DSP::r_koff ); + + if ( r == SPC_DSP::r_koff ) + { + m.skipped_koff |= data; + m.skipped_kon &= ~data; + } + } + #endif + + #ifdef SPC_DSP_WRITE_HOOK + SPC_DSP_WRITE_HOOK( m.spc_time + time, REGS [r_dspaddr], (uint8_t) data ); + #endif + + if ( REGS [r_dspaddr] <= 0x7F ) + dsp.write( REGS [r_dspaddr], data ); + else if ( !SPC_MORE_ACCURACY ) + dprintf( "SPC wrote to DSP register > $7F\n" ); +} + + +//// Memory access extras + +#if SPC_MORE_ACCURACY + #define MEM_ACCESS( time, addr ) \ + {\ + if ( time >= m.dsp_time )\ + {\ + RUN_DSP( time, max_reg_time );\ + }\ + } +#elif !defined (NDEBUG) + // Debug-only check for read/write within echo buffer, since this might result in + // inaccurate emulation due to the DSP not being caught up to the present. + + bool SNES_SPC::check_echo_access( int addr ) + { + if ( !(dsp.read( SPC_DSP::r_flg ) & 0x20) ) + { + int start = 0x100 * dsp.read( SPC_DSP::r_esa ); + int size = 0x800 * (dsp.read( SPC_DSP::r_edl ) & 0x0F); + int end = start + (size ? size : 4); + if ( start <= addr && addr < end ) + { + if ( !m.echo_accessed ) + { + m.echo_accessed = 1; + return true; + } + } + } + return false; + } + + #define MEM_ACCESS( time, addr ) check( !check_echo_access( (uint16_t) addr ) ); +#else + #define MEM_ACCESS( time, addr ) +#endif + + +//// CPU write + +#if SPC_MORE_ACCURACY +static unsigned char const glitch_probs [3] [256] = +{ + 0xC3,0x92,0x5B,0x1C,0xD1,0x92,0x5B,0x1C,0xDB,0x9C,0x72,0x18,0xCD,0x5C,0x38,0x0B, + 0xE1,0x9C,0x74,0x17,0xCF,0x75,0x45,0x0C,0xCF,0x6E,0x4A,0x0D,0xA3,0x3A,0x1D,0x08, + 0xDB,0xA0,0x82,0x19,0xD9,0x73,0x3C,0x0E,0xCB,0x76,0x52,0x0B,0xA5,0x46,0x1D,0x09, + 0xDA,0x74,0x55,0x0F,0xA2,0x3F,0x21,0x05,0x9A,0x40,0x20,0x07,0x63,0x1E,0x10,0x01, + 0xDF,0xA9,0x85,0x1D,0xD3,0x84,0x4B,0x0E,0xCF,0x6F,0x49,0x0F,0xB3,0x48,0x1E,0x05, + 0xD8,0x77,0x52,0x12,0xB7,0x49,0x23,0x06,0xAA,0x45,0x28,0x07,0x7D,0x28,0x0F,0x07, + 0xCC,0x7B,0x4A,0x0E,0xB2,0x4F,0x24,0x07,0xAD,0x43,0x2C,0x06,0x86,0x29,0x11,0x07, + 0xAE,0x48,0x1F,0x0A,0x76,0x21,0x19,0x05,0x76,0x21,0x14,0x05,0x44,0x11,0x0B,0x01, + 0xE7,0xAD,0x96,0x23,0xDC,0x86,0x59,0x0E,0xDC,0x7C,0x5F,0x15,0xBB,0x53,0x2E,0x09, + 0xD6,0x7C,0x4A,0x16,0xBB,0x4A,0x25,0x08,0xB3,0x4F,0x28,0x0B,0x8E,0x23,0x15,0x08, + 0xCF,0x7F,0x57,0x11,0xB5,0x4A,0x23,0x0A,0xAA,0x42,0x28,0x05,0x7D,0x22,0x12,0x03, + 0xA6,0x49,0x28,0x09,0x82,0x2B,0x0D,0x04,0x7A,0x20,0x0F,0x04,0x3D,0x0F,0x09,0x03, + 0xD1,0x7C,0x4C,0x0F,0xAF,0x4E,0x21,0x09,0xA8,0x46,0x2A,0x07,0x85,0x1F,0x0E,0x07, + 0xA6,0x3F,0x26,0x07,0x7C,0x24,0x14,0x07,0x78,0x22,0x16,0x04,0x46,0x12,0x0A,0x02, + 0xA6,0x41,0x2C,0x0A,0x7E,0x28,0x11,0x05,0x73,0x1B,0x14,0x05,0x3D,0x11,0x0A,0x02, + 0x70,0x22,0x17,0x05,0x48,0x13,0x08,0x03,0x3C,0x07,0x0D,0x07,0x26,0x07,0x06,0x01, + + 0xE0,0x9F,0xDA,0x7C,0x4F,0x18,0x28,0x0D,0xE9,0x9F,0xDA,0x7C,0x4F,0x18,0x1F,0x07, + 0xE6,0x97,0xD8,0x72,0x64,0x13,0x26,0x09,0xDC,0x67,0xA9,0x38,0x21,0x07,0x15,0x06, + 0xE9,0x91,0xD2,0x6B,0x63,0x14,0x2B,0x0E,0xD6,0x61,0xB7,0x41,0x2B,0x0E,0x10,0x09, + 0xCF,0x59,0xB0,0x2F,0x35,0x08,0x0F,0x07,0xB6,0x30,0x7A,0x21,0x17,0x07,0x09,0x03, + 0xE7,0xA3,0xE5,0x6B,0x65,0x1F,0x34,0x09,0xD8,0x6B,0xBE,0x45,0x27,0x07,0x10,0x07, + 0xDA,0x54,0xB1,0x39,0x2E,0x0E,0x17,0x08,0xA9,0x3C,0x86,0x22,0x16,0x06,0x07,0x03, + 0xD4,0x51,0xBC,0x3D,0x38,0x0A,0x13,0x06,0xB2,0x37,0x79,0x1C,0x17,0x05,0x0E,0x06, + 0xA7,0x31,0x74,0x1C,0x11,0x06,0x0C,0x02,0x6D,0x1A,0x38,0x10,0x0B,0x05,0x06,0x03, + 0xEB,0x9A,0xE1,0x7A,0x6F,0x13,0x34,0x0E,0xE6,0x75,0xC5,0x45,0x3E,0x0B,0x1A,0x05, + 0xD8,0x63,0xC1,0x40,0x3C,0x1B,0x19,0x06,0xB3,0x42,0x83,0x29,0x18,0x0A,0x08,0x04, + 0xD4,0x58,0xBA,0x43,0x3F,0x0A,0x1F,0x09,0xB1,0x33,0x8A,0x1F,0x1F,0x06,0x0D,0x05, + 0xAF,0x3C,0x7A,0x1F,0x16,0x08,0x0A,0x01,0x72,0x1B,0x52,0x0D,0x0B,0x09,0x06,0x01, + 0xCF,0x63,0xB7,0x47,0x40,0x10,0x14,0x06,0xC0,0x41,0x96,0x20,0x1C,0x09,0x10,0x05, + 0xA6,0x35,0x82,0x1A,0x20,0x0C,0x0E,0x04,0x80,0x1F,0x53,0x0F,0x0B,0x02,0x06,0x01, + 0xA6,0x31,0x81,0x1B,0x1D,0x01,0x08,0x08,0x7B,0x20,0x4D,0x19,0x0E,0x05,0x07,0x03, + 0x6B,0x17,0x49,0x07,0x0E,0x03,0x0A,0x05,0x37,0x0B,0x1F,0x06,0x04,0x02,0x07,0x01, + + 0xF0,0xD6,0xED,0xAD,0xEC,0xB1,0xEB,0x79,0xAC,0x22,0x47,0x1E,0x6E,0x1B,0x32,0x0A, + 0xF0,0xD6,0xEA,0xA4,0xED,0xC4,0xDE,0x82,0x98,0x1F,0x50,0x13,0x52,0x15,0x2A,0x0A, + 0xF1,0xD1,0xEB,0xA2,0xEB,0xB7,0xD8,0x69,0xA2,0x1F,0x5B,0x18,0x55,0x18,0x2C,0x0A, + 0xED,0xB5,0xDE,0x7E,0xE6,0x85,0xD3,0x59,0x59,0x0F,0x2C,0x09,0x24,0x07,0x15,0x09, + 0xF1,0xD6,0xEA,0xA0,0xEC,0xBB,0xDA,0x77,0xA9,0x23,0x58,0x14,0x5D,0x12,0x2F,0x09, + 0xF1,0xC1,0xE3,0x86,0xE4,0x87,0xD2,0x4E,0x68,0x15,0x26,0x0B,0x27,0x09,0x15,0x02, + 0xEE,0xA6,0xE0,0x5C,0xE0,0x77,0xC3,0x41,0x67,0x1B,0x3C,0x07,0x2A,0x06,0x19,0x07, + 0xE4,0x75,0xC6,0x43,0xCC,0x50,0x95,0x23,0x35,0x09,0x14,0x04,0x15,0x05,0x0B,0x04, + 0xEE,0xD6,0xED,0xAD,0xEC,0xB1,0xEB,0x79,0xAC,0x22,0x56,0x14,0x5A,0x12,0x26,0x0A, + 0xEE,0xBB,0xE7,0x7E,0xE9,0x8D,0xCB,0x49,0x67,0x11,0x34,0x07,0x2B,0x0B,0x14,0x07, + 0xED,0xA7,0xE5,0x76,0xE3,0x7E,0xC4,0x4B,0x77,0x14,0x34,0x08,0x27,0x07,0x14,0x04, + 0xE7,0x8B,0xD2,0x4C,0xCA,0x56,0x9E,0x31,0x36,0x0C,0x11,0x07,0x14,0x04,0x0A,0x02, + 0xF0,0x9B,0xEA,0x6F,0xE5,0x81,0xC4,0x43,0x74,0x10,0x30,0x0B,0x2D,0x08,0x1B,0x06, + 0xE6,0x83,0xCA,0x48,0xD9,0x56,0xA7,0x23,0x3B,0x09,0x12,0x09,0x15,0x07,0x0A,0x03, + 0xE5,0x5F,0xCB,0x3C,0xCF,0x48,0x91,0x22,0x31,0x0A,0x17,0x08,0x15,0x04,0x0D,0x02, + 0xD1,0x43,0x91,0x20,0xA9,0x2D,0x54,0x12,0x17,0x07,0x09,0x02,0x0C,0x04,0x05,0x03, +}; +#endif + +// divided into multiple functions to keep rarely-used functionality separate +// so often-used functionality can be optimized better by compiler + +// If write isn't preceded by read, data has this added to it +int const no_read_before_write = 0x2000; + +void SNES_SPC::cpu_write_smp_reg_( int data, rel_time_t time, int addr ) +{ + switch ( addr ) + { + case r_t0target: + case r_t1target: + case r_t2target: { + Timer* t = &m.timers [addr - r_t0target]; + int period = IF_0_THEN_256( data ); + if ( t->period != period ) + { + t = run_timer( t, time ); + #if SPC_MORE_ACCURACY + // Insane behavior when target is written just after counter is + // clocked and counter matches new period and new period isn't 1, 2, 4, or 8 + if ( t->divider == (period & 0xFF) && + t->next_time == time + TIMER_MUL( t, 1 ) && + ((period - 1) | ~0x0F) & period ) + { + //dprintf( "SPC pathological timer target write\n" ); + + // If the period is 3, 5, or 9, there's a probability this behavior won't occur, + // based on the previous period + int prob = 0xFF; + int old_period = t->period & 0xFF; + if ( period == 3 ) prob = glitch_probs [0] [old_period]; + if ( period == 5 ) prob = glitch_probs [1] [old_period]; + if ( period == 9 ) prob = glitch_probs [2] [old_period]; + + // The glitch suppresses incrementing of one of the counter bits, based on + // the lowest set bit in the new period + int b = 1; + while ( !(period & b) ) + b <<= 1; + + if ( (rand() >> 4 & 0xFF) <= prob ) + t->divider = (t->divider - b) & 0xFF; + } + #endif + t->period = period; + } + break; + } + + case r_t0out: + case r_t1out: + case r_t2out: + if ( !SPC_MORE_ACCURACY ) + dprintf( "SPC wrote to counter %d\n", (int) addr - r_t0out ); + + if ( data < no_read_before_write / 2 ) + run_timer( &m.timers [addr - r_t0out], time - 1 )->counter = 0; + break; + + // Registers that act like RAM + case 0x8: + case 0x9: + REGS_IN [addr] = (uint8_t) data; + break; + + case r_test: + if ( (uint8_t) data != 0x0A ) + dprintf( "SPC wrote to test register\n" ); + break; + + case r_control: + // port clears + if ( data & 0x10 ) + { + REGS_IN [r_cpuio0] = 0; + REGS_IN [r_cpuio1] = 0; + } + if ( data & 0x20 ) + { + REGS_IN [r_cpuio2] = 0; + REGS_IN [r_cpuio3] = 0; + } + + // timers + { + for ( int i = 0; i < timer_count; i++ ) + { + Timer* t = &m.timers [i]; + int enabled = data >> i & 1; + if ( t->enabled != enabled ) + { + t = run_timer( t, time ); + t->enabled = enabled; + if ( enabled ) + { + t->divider = 0; + t->counter = 0; + } + } + } + } + enable_rom( data & 0x80 ); + break; + } +} + +void SNES_SPC::cpu_write_smp_reg( int data, rel_time_t time, int addr ) +{ + if ( addr == r_dspdata ) // 99% + dsp_write( data, time ); + else + cpu_write_smp_reg_( data, time, addr ); +} + +void SNES_SPC::cpu_write_high( int data, int i, rel_time_t time ) +{ + if ( i < rom_size ) + { + m.hi_ram [i] = (uint8_t) data; + if ( m.rom_enabled ) + RAM [i + rom_addr] = m.rom [i]; // restore overwritten ROM + } + else + { + assert( RAM [i + rom_addr] == (uint8_t) data ); + RAM [i + rom_addr] = cpu_pad_fill; // restore overwritten padding + cpu_write( data, i + rom_addr - 0x10000, time ); + } +} + +int const bits_in_int = CHAR_BIT * sizeof (int); + +void SNES_SPC::cpu_write( int data, int addr, rel_time_t time ) +{ + MEM_ACCESS( time, addr ) + + // RAM + RAM [addr] = (uint8_t) data; + int reg = addr - 0xF0; + if ( reg >= 0 ) // 64% + { + // $F0-$FF + if ( reg < reg_count ) // 87% + { + REGS [reg] = (uint8_t) data; + + // Ports + #ifdef SPC_PORT_WRITE_HOOK + if ( (unsigned) (reg - r_cpuio0) < port_count ) + SPC_PORT_WRITE_HOOK( m.spc_time + time, (reg - r_cpuio0), + (uint8_t) data, ®S [r_cpuio0] ); + #endif + + // Registers other than $F2 and $F4-$F7 + //if ( reg != 2 && reg != 4 && reg != 5 && reg != 6 && reg != 7 ) + // TODO: this is a bit on the fragile side + if ( ((~0x2F00 << (bits_in_int - 16)) << reg) < 0 ) // 36% + cpu_write_smp_reg( data, time, reg ); + } + // High mem/address wrap-around + else + { + reg -= rom_addr - 0xF0; + if ( reg >= 0 ) // 1% in IPL ROM area or address wrapped around + cpu_write_high( data, reg, time ); + } + } +} + + +//// CPU read + +inline int SNES_SPC::cpu_read_smp_reg( int reg, rel_time_t time ) +{ + int result = REGS_IN [reg]; + reg -= r_dspaddr; + // DSP addr and data + if ( (unsigned) reg <= 1 ) // 4% 0xF2 and 0xF3 + { + result = REGS [r_dspaddr]; + if ( (unsigned) reg == 1 ) + result = dsp_read( time ); // 0xF3 + } + return result; +} + +int SNES_SPC::cpu_read( int addr, rel_time_t time ) +{ + MEM_ACCESS( time, addr ) + + // RAM + int result = RAM [addr]; + int reg = addr - 0xF0; + if ( reg >= 0 ) // 40% + { + reg -= 0x10; + if ( (unsigned) reg >= 0xFF00 ) // 21% + { + reg += 0x10 - r_t0out; + + // Timers + if ( (unsigned) reg < timer_count ) // 90% + { + Timer* t = &m.timers [reg]; + if ( time >= t->next_time ) + t = run_timer_( t, time ); + result = t->counter; + t->counter = 0; + } + // Other registers + else if ( reg < 0 ) // 10% + { + result = cpu_read_smp_reg( reg + r_t0out, time ); + } + else // 1% + { + assert( reg + (r_t0out + 0xF0 - 0x10000) < 0x100 ); + result = cpu_read( reg + (r_t0out + 0xF0 - 0x10000), time ); + } + } + } + + return result; +} + + +//// Run + +// Prefix and suffix for CPU emulator function +#define SPC_CPU_RUN_FUNC \ +BOOST::uint8_t* SNES_SPC::run_until_( time_t end_time )\ +{\ + rel_time_t rel_time = m.spc_time - end_time;\ + assert( rel_time <= 0 );\ + m.spc_time = end_time;\ + m.dsp_time += rel_time;\ + m.timers [0].next_time += rel_time;\ + m.timers [1].next_time += rel_time;\ + m.timers [2].next_time += rel_time; + +#define SPC_CPU_RUN_FUNC_END \ + m.spc_time += rel_time;\ + m.dsp_time -= rel_time;\ + m.timers [0].next_time -= rel_time;\ + m.timers [1].next_time -= rel_time;\ + m.timers [2].next_time -= rel_time;\ + assert( m.spc_time <= end_time );\ + return ®S [r_cpuio0];\ +} + +int const cpu_lag_max = 12 - 1; // DIV YA,X takes 12 clocks + +void SNES_SPC::end_frame( time_t end_time ) +{ + // Catch CPU up to as close to end as possible. If final instruction + // would exceed end, does NOT execute it and leaves m.spc_time < end. + if ( end_time > m.spc_time ) + run_until_( end_time ); + + m.spc_time -= end_time; + m.extra_clocks += end_time; + + // Greatest number of clocks early that emulation can stop early due to + // not being able to execute current instruction without going over + // allowed time. + assert( -cpu_lag_max <= m.spc_time && m.spc_time <= 0 ); + + // Catch timers up to CPU + for ( int i = 0; i < timer_count; i++ ) + run_timer( &m.timers [i], 0 ); + + // Catch DSP up to CPU + if ( m.dsp_time < 0 ) + { + RUN_DSP( 0, max_reg_time ); + } + + // Save any extra samples beyond what should be generated + if ( m.buf_begin ) + save_extra(); +} + +// Inclusion here allows static memory access functions and better optimization +#include "SPC_CPU.h" diff --git a/waterbox/sameboy/snes_spc/SNES_SPC.h b/waterbox/sameboy/snes_spc/SNES_SPC.h new file mode 100644 index 0000000000..fb1ad18a45 --- /dev/null +++ b/waterbox/sameboy/snes_spc/SNES_SPC.h @@ -0,0 +1,284 @@ +// SNES SPC-700 APU emulator + +// snes_spc 0.9.0 +#ifndef SNES_SPC_H +#define SNES_SPC_H + +#include "SPC_DSP.h" +#include "blargg_endian.h" +#include + +struct SNES_SPC { +public: + typedef BOOST::uint8_t uint8_t; + + // Must be called once before using + blargg_err_t init(); + + // Sample pairs generated per second + enum { sample_rate = 32000 }; + +// Emulator use + + // Sets IPL ROM data. Library does not include ROM data. Most SPC music files + // don't need ROM, but a full emulator must provide this. + enum { rom_size = 0x40 }; + void init_rom( uint8_t const rom [rom_size] ); + + // Sets destination for output samples + typedef short sample_t; + void set_output( sample_t* out, int out_size ); + + // Number of samples written to output since last set + int sample_count() const; + + // Resets SPC to power-on state. This resets your output buffer, so you must + // call set_output() after this. + void reset(); + + // Emulates pressing reset switch on SNES. This resets your output buffer, so + // you must call set_output() after this. + void soft_reset(); + + // 1024000 SPC clocks per second, sample pair every 32 clocks + typedef int time_t; + enum { clock_rate = 1024000 }; + enum { clocks_per_sample = 32 }; + + // Emulated port read/write at specified time + enum { port_count = 4 }; + int read_port ( time_t, int port ); + void write_port( time_t, int port, int data ); + + // Runs SPC to end_time and starts a new time frame at 0 + void end_frame( time_t end_time ); + + uint8_t* get_ram(); + +// Sound control + + // Mutes voices corresponding to non-zero bits in mask (issues repeated KOFF events). + // Reduces emulation accuracy. + enum { voice_count = 8 }; + void mute_voices( int mask ); + + // If true, prevents channels and global volumes from being phase-negated. + // Only supported by fast DSP. + void disable_surround( bool disable = true ); + + // Sets tempo, where tempo_unit = normal, tempo_unit / 2 = half speed, etc. + enum { tempo_unit = 0x100 }; + void set_tempo( int ); + +// SPC music files + + // Loads SPC data into emulator + enum { spc_min_file_size = 0x10180 }; + enum { spc_file_size = 0x10200 }; + blargg_err_t load_spc( void const* in, long size ); + + // Clears echo region. Useful after loading an SPC as many have garbage in echo. + void clear_echo(); + + // Plays for count samples and write samples to out. Discards samples if out + // is NULL. Count must be a multiple of 2 since output is stereo. + blargg_err_t play( int count, sample_t* out ); + + // Skips count samples. Several times faster than play() when using fast DSP. + blargg_err_t skip( int count ); + +// State save/load (only available with accurate DSP) + +#if !SPC_NO_COPY_STATE_FUNCS + // Saves/loads state + enum { state_size = 67 * 1024L }; // maximum space needed when saving + typedef SPC_DSP::copy_func_t copy_func_t; + void copy_state( unsigned char** io, copy_func_t ); + + // Writes minimal header to spc_out + static void init_header( void* spc_out ); + + // Saves emulator state as SPC file data. Writes spc_file_size bytes to spc_out. + // Does not set up SPC header; use init_header() for that. + void save_spc( void* spc_out ); + + // Returns true if new key-on events occurred since last check. Useful for + // trimming silence while saving an SPC. + bool check_kon(); +#endif + +public: + BLARGG_DISABLE_NOTHROW + + typedef BOOST::uint16_t uint16_t; + + // Time relative to m_spc_time. Speeds up code a bit by eliminating need to + // constantly add m_spc_time to time from CPU. CPU uses time that ends at + // 0 to eliminate reloading end time every instruction. It pays off. + typedef int rel_time_t; + + struct Timer + { + rel_time_t next_time; // time of next event + int prescaler; + int period; + int divider; + int enabled; + int counter; + }; + enum { reg_count = 0x10 }; + enum { timer_count = 3 }; + enum { extra_size = SPC_DSP::extra_size }; + + enum { signature_size = 35 }; + +private: + SPC_DSP dsp; + + #if SPC_LESS_ACCURATE + static signed char const reg_times_ [256]; + signed char reg_times [256]; + #endif + + struct state_t + { + Timer timers [timer_count]; + + uint8_t smp_regs [2] [reg_count]; + + struct + { + int pc; + int a; + int x; + int y; + int psw; + int sp; + } cpu_regs; + + rel_time_t dsp_time; + time_t spc_time; + bool echo_accessed; + + int tempo; + int skipped_kon; + int skipped_koff; + const char* cpu_error; + + int extra_clocks; + sample_t* buf_begin; + sample_t const* buf_end; + sample_t* extra_pos; + sample_t extra_buf [extra_size]; + + int rom_enabled; + uint8_t rom [rom_size]; + uint8_t hi_ram [rom_size]; + + unsigned char cycle_table [256]; + + struct + { + // padding to neutralize address overflow + union { + uint8_t padding1 [0x100]; + uint16_t align; // makes compiler align data for 16-bit access + } padding1 [1]; + uint8_t ram [0x10000]; + uint8_t padding2 [0x100]; + } ram; + }; + state_t m; + + enum { rom_addr = 0xFFC0 }; + + enum { skipping_time = 127 }; + + // Value that padding should be filled with + enum { cpu_pad_fill = 0xFF }; + + enum { + r_test = 0x0, r_control = 0x1, + r_dspaddr = 0x2, r_dspdata = 0x3, + r_cpuio0 = 0x4, r_cpuio1 = 0x5, + r_cpuio2 = 0x6, r_cpuio3 = 0x7, + r_f8 = 0x8, r_f9 = 0x9, + r_t0target = 0xA, r_t1target = 0xB, r_t2target = 0xC, + r_t0out = 0xD, r_t1out = 0xE, r_t2out = 0xF + }; + + void timers_loaded(); + void enable_rom( int enable ); + void reset_buf(); + void save_extra(); + void load_regs( uint8_t const in [reg_count] ); + void ram_loaded(); + void regs_loaded(); + void reset_time_regs(); + void reset_common( int timer_counter_init ); + + Timer* run_timer_ ( Timer* t, rel_time_t ); + Timer* run_timer ( Timer* t, rel_time_t ); + int dsp_read ( rel_time_t ); + void dsp_write ( int data, rel_time_t ); + void cpu_write_smp_reg_( int data, rel_time_t, int addr ); + void cpu_write_smp_reg ( int data, rel_time_t, int addr ); + void cpu_write_high ( int data, int i, rel_time_t ); + void cpu_write ( int data, int addr, rel_time_t ); + int cpu_read_smp_reg ( int i, rel_time_t ); + int cpu_read ( int addr, rel_time_t ); + unsigned CPU_mem_bit ( uint8_t const* pc, rel_time_t ); + + bool check_echo_access ( int addr ); + uint8_t* run_until_( time_t end_time ); + + struct spc_file_t + { + char signature [signature_size]; + uint8_t has_id666; + uint8_t version; + uint8_t pcl, pch; + uint8_t a; + uint8_t x; + uint8_t y; + uint8_t psw; + uint8_t sp; + char text [212]; + uint8_t ram [0x10000]; + uint8_t dsp [128]; + uint8_t unused [0x40]; + uint8_t ipl_rom [0x40]; + }; + + static char const signature [signature_size + 1]; + + void save_regs( uint8_t out [reg_count] ); +}; + +#include + +inline uint8_t* SNES_SPC::get_ram() { return m.ram.ram; } + +inline int SNES_SPC::sample_count() const { return (m.extra_clocks >> 5) * 2; } + +inline int SNES_SPC::read_port( time_t t, int port ) +{ + assert( (unsigned) port < port_count ); + return run_until_( t ) [port]; +} + +inline void SNES_SPC::write_port( time_t t, int port, int data ) +{ + assert( (unsigned) port < port_count ); + run_until_( t ) [0x10 + port] = data; +} + +inline void SNES_SPC::mute_voices( int mask ) { dsp.mute_voices( mask ); } + +inline void SNES_SPC::disable_surround( bool disable ) { dsp.disable_surround( disable ); } + +#if !SPC_NO_COPY_STATE_FUNCS +inline bool SNES_SPC::check_kon() { return dsp.check_kon(); } +#endif + +#endif diff --git a/waterbox/sameboy/snes_spc/SNES_SPC_misc.cpp b/waterbox/sameboy/snes_spc/SNES_SPC_misc.cpp new file mode 100644 index 0000000000..87288ab8ee --- /dev/null +++ b/waterbox/sameboy/snes_spc/SNES_SPC_misc.cpp @@ -0,0 +1,380 @@ +// SPC emulation support: init, sample buffering, reset, SPC loading + +// snes_spc 0.9.0. http://www.slack.net/~ant/ + +#include "SNES_SPC.h" + +#include + +/* Copyright (C) 2004-2007 Shay Green. This module is free software; you +can redistribute it and/or modify it under the terms of the GNU Lesser +General Public License as published by the Free Software Foundation; either +version 2.1 of the License, or (at your option) any later version. This +module is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +details. You should have received a copy of the GNU Lesser General Public +License along with this module; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ + +#include "blargg_source.h" + +#define RAM (m.ram.ram) +#define REGS (m.smp_regs [0]) +#define REGS_IN (m.smp_regs [1]) + +// (n ? n : 256) +#define IF_0_THEN_256( n ) ((uint8_t) ((n) - 1) + 1) + + +//// Init + +blargg_err_t SNES_SPC::init() +{ + memset( &m, 0, sizeof m ); + dsp.init( RAM ); + + m.tempo = tempo_unit; + + // Most SPC music doesn't need ROM, and almost all the rest only rely + // on these two bytes + m.rom [0x3E] = 0xFF; + m.rom [0x3F] = 0xC0; + + static unsigned char const cycle_table [128] = + {// 01 23 45 67 89 AB CD EF + 0x28,0x47,0x34,0x36,0x26,0x54,0x54,0x68, // 0 + 0x48,0x47,0x45,0x56,0x55,0x65,0x22,0x46, // 1 + 0x28,0x47,0x34,0x36,0x26,0x54,0x54,0x74, // 2 + 0x48,0x47,0x45,0x56,0x55,0x65,0x22,0x38, // 3 + 0x28,0x47,0x34,0x36,0x26,0x44,0x54,0x66, // 4 + 0x48,0x47,0x45,0x56,0x55,0x45,0x22,0x43, // 5 + 0x28,0x47,0x34,0x36,0x26,0x44,0x54,0x75, // 6 + 0x48,0x47,0x45,0x56,0x55,0x55,0x22,0x36, // 7 + 0x28,0x47,0x34,0x36,0x26,0x54,0x52,0x45, // 8 + 0x48,0x47,0x45,0x56,0x55,0x55,0x22,0xC5, // 9 + 0x38,0x47,0x34,0x36,0x26,0x44,0x52,0x44, // A + 0x48,0x47,0x45,0x56,0x55,0x55,0x22,0x34, // B + 0x38,0x47,0x45,0x47,0x25,0x64,0x52,0x49, // C + 0x48,0x47,0x56,0x67,0x45,0x55,0x22,0x83, // D + 0x28,0x47,0x34,0x36,0x24,0x53,0x43,0x40, // E + 0x48,0x47,0x45,0x56,0x34,0x54,0x22,0x60, // F + }; + + // unpack cycle table + for ( int i = 0; i < 128; i++ ) + { + int n = cycle_table [i]; + m.cycle_table [i * 2 + 0] = n >> 4; + m.cycle_table [i * 2 + 1] = n & 0x0F; + } + + #if SPC_LESS_ACCURATE + memcpy( reg_times, reg_times_, sizeof reg_times ); + #endif + + reset(); + return 0; +} + +void SNES_SPC::init_rom( uint8_t const in [rom_size] ) +{ + memcpy( m.rom, in, sizeof m.rom ); +} + +void SNES_SPC::set_tempo( int t ) +{ + m.tempo = t; + int const timer2_shift = 4; // 64 kHz + int const other_shift = 3; // 8 kHz + + #if SPC_DISABLE_TEMPO + m.timers [2].prescaler = timer2_shift; + m.timers [1].prescaler = timer2_shift + other_shift; + m.timers [0].prescaler = timer2_shift + other_shift; + #else + if ( !t ) + t = 1; + int const timer2_rate = 1 << timer2_shift; + int rate = (timer2_rate * tempo_unit + (t >> 1)) / t; + if ( rate < timer2_rate / 4 ) + rate = timer2_rate / 4; // max 4x tempo + m.timers [2].prescaler = rate; + m.timers [1].prescaler = rate << other_shift; + m.timers [0].prescaler = rate << other_shift; + #endif +} + +// Timer registers have been loaded. Applies these to the timers. Does not +// reset timer prescalers or dividers. +void SNES_SPC::timers_loaded() +{ + int i; + for ( i = 0; i < timer_count; i++ ) + { + Timer* t = &m.timers [i]; + t->period = IF_0_THEN_256( REGS [r_t0target + i] ); + t->enabled = REGS [r_control] >> i & 1; + t->counter = REGS_IN [r_t0out + i] & 0x0F; + } + + set_tempo( m.tempo ); +} + +// Loads registers from unified 16-byte format +void SNES_SPC::load_regs( uint8_t const in [reg_count] ) +{ + memcpy( REGS, in, reg_count ); + memcpy( REGS_IN, REGS, reg_count ); + + // These always read back as 0 + REGS_IN [r_test ] = 0; + REGS_IN [r_control ] = 0; + REGS_IN [r_t0target] = 0; + REGS_IN [r_t1target] = 0; + REGS_IN [r_t2target] = 0; +} + +// RAM was just loaded from SPC, with $F0-$FF containing SMP registers +// and timer counts. Copies these to proper registers. +void SNES_SPC::ram_loaded() +{ + m.rom_enabled = 0; + load_regs( &RAM [0xF0] ); + + // Put STOP instruction around memory to catch PC underflow/overflow + memset( m.ram.padding1, cpu_pad_fill, sizeof m.ram.padding1 ); + memset( m.ram.padding2, cpu_pad_fill, sizeof m.ram.padding2 ); +} + +// Registers were just loaded. Applies these new values. +void SNES_SPC::regs_loaded() +{ + enable_rom( REGS [r_control] & 0x80 ); + timers_loaded(); +} + +void SNES_SPC::reset_time_regs() +{ + m.cpu_error = 0; + m.echo_accessed = 0; + m.spc_time = 0; + m.dsp_time = 0; + #if SPC_LESS_ACCURATE + m.dsp_time = clocks_per_sample + 1; + #endif + + for ( int i = 0; i < timer_count; i++ ) + { + Timer* t = &m.timers [i]; + t->next_time = 1; + t->divider = 0; + } + + regs_loaded(); + + m.extra_clocks = 0; + reset_buf(); +} + +void SNES_SPC::reset_common( int timer_counter_init ) +{ + int i; + for ( i = 0; i < timer_count; i++ ) + REGS_IN [r_t0out + i] = timer_counter_init; + + // Run IPL ROM + memset( &m.cpu_regs, 0, sizeof m.cpu_regs ); + m.cpu_regs.pc = rom_addr; + + REGS [r_test ] = 0x0A; + REGS [r_control] = 0xB0; // ROM enabled, clear ports + for ( i = 0; i < port_count; i++ ) + REGS_IN [r_cpuio0 + i] = 0; + + reset_time_regs(); +} + +void SNES_SPC::soft_reset() +{ + reset_common( 0 ); + dsp.soft_reset(); +} + +void SNES_SPC::reset() +{ + memset( RAM, 0xFF, 0x10000 ); + ram_loaded(); + reset_common( 0x0F ); + dsp.reset(); +} + +char const SNES_SPC::signature [signature_size + 1] = + "SNES-SPC700 Sound File Data v0.30\x1A\x1A"; + +blargg_err_t SNES_SPC::load_spc( void const* data, long size ) +{ + spc_file_t const* const spc = (spc_file_t const*) data; + + // be sure compiler didn't insert any padding into fle_t + assert( sizeof (spc_file_t) == spc_min_file_size + 0x80 ); + + // Check signature and file size + if ( size < signature_size || memcmp( spc, signature, 27 ) ) + return "Not an SPC file"; + + if ( size < spc_min_file_size ) + return "Corrupt SPC file"; + + // CPU registers + m.cpu_regs.pc = spc->pch * 0x100 + spc->pcl; + m.cpu_regs.a = spc->a; + m.cpu_regs.x = spc->x; + m.cpu_regs.y = spc->y; + m.cpu_regs.psw = spc->psw; + m.cpu_regs.sp = spc->sp; + + // RAM and registers + memcpy( RAM, spc->ram, 0x10000 ); + ram_loaded(); + + // DSP registers + dsp.load( spc->dsp ); + + reset_time_regs(); + + return 0; +} + +void SNES_SPC::clear_echo() +{ + if ( !(dsp.read( SPC_DSP::r_flg ) & 0x20) ) + { + int addr = 0x100 * dsp.read( SPC_DSP::r_esa ); + int end = addr + 0x800 * (dsp.read( SPC_DSP::r_edl ) & 0x0F); + if ( end > 0x10000 ) + end = 0x10000; + memset( &RAM [addr], 0xFF, end - addr ); + } +} + + +//// Sample output + +void SNES_SPC::reset_buf() +{ + // Start with half extra buffer of silence + sample_t* out = m.extra_buf; + while ( out < &m.extra_buf [extra_size / 2] ) + *out++ = 0; + + m.extra_pos = out; + m.buf_begin = 0; + + dsp.set_output( 0, 0 ); +} + +void SNES_SPC::set_output( sample_t* out, int size ) +{ + require( (size & 1) == 0 ); // size must be even + + m.extra_clocks &= clocks_per_sample - 1; + if ( out ) + { + sample_t const* out_end = out + size; + m.buf_begin = out; + m.buf_end = out_end; + + // Copy extra to output + sample_t const* in = m.extra_buf; + while ( in < m.extra_pos && out < out_end ) + *out++ = *in++; + + // Handle output being full already + if ( out >= out_end ) + { + // Have DSP write to remaining extra space + out = dsp.extra(); + out_end = &dsp.extra() [extra_size]; + + // Copy any remaining extra samples as if DSP wrote them + while ( in < m.extra_pos ) + *out++ = *in++; + assert( out <= out_end ); + } + + dsp.set_output( out, out_end - out ); + } + else + { + reset_buf(); + } +} + +void SNES_SPC::save_extra() +{ + // Get end pointers + sample_t const* main_end = m.buf_end; // end of data written to buf + sample_t const* dsp_end = dsp.out_pos(); // end of data written to dsp.extra() + if ( m.buf_begin <= dsp_end && dsp_end <= main_end ) + { + main_end = dsp_end; + dsp_end = dsp.extra(); // nothing in DSP's extra + } + + // Copy any extra samples at these ends into extra_buf + sample_t* out = m.extra_buf; + sample_t const* in; + for ( in = m.buf_begin + sample_count(); in < main_end; in++ ) + *out++ = *in; + for ( in = dsp.extra(); in < dsp_end ; in++ ) + *out++ = *in; + + m.extra_pos = out; + assert( out <= &m.extra_buf [extra_size] ); +} + +blargg_err_t SNES_SPC::play( int count, sample_t* out ) +{ + require( (count & 1) == 0 ); // must be even + if ( count ) + { + set_output( out, count ); + end_frame( count * (clocks_per_sample / 2) ); + } + + const char* err = m.cpu_error; + m.cpu_error = 0; + return err; +} + +blargg_err_t SNES_SPC::skip( int count ) +{ + #if SPC_LESS_ACCURATE + if ( count > 2 * sample_rate * 2 ) + { + set_output( 0, 0 ); + + // Skip a multiple of 4 samples + time_t end = count; + count = (count & 3) + 1 * sample_rate * 2; + end = (end - count) * (clocks_per_sample / 2); + + m.skipped_kon = 0; + m.skipped_koff = 0; + + // Preserve DSP and timer synchronization + // TODO: verify that this really preserves it + int old_dsp_time = m.dsp_time + m.spc_time; + m.dsp_time = end - m.spc_time + skipping_time; + end_frame( end ); + m.dsp_time = m.dsp_time - skipping_time + old_dsp_time; + + dsp.write( SPC_DSP::r_koff, m.skipped_koff & ~m.skipped_kon ); + dsp.write( SPC_DSP::r_kon , m.skipped_kon ); + clear_echo(); + } + #endif + + return play( count, 0 ); +} diff --git a/waterbox/sameboy/snes_spc/SNES_SPC_state.cpp b/waterbox/sameboy/snes_spc/SNES_SPC_state.cpp new file mode 100644 index 0000000000..a8052b6587 --- /dev/null +++ b/waterbox/sameboy/snes_spc/SNES_SPC_state.cpp @@ -0,0 +1,129 @@ +// SPC emulation state save/load: copy_state(), save_spc() +// Separate file to avoid linking in unless needed + +// snes_spc 0.9.0. http://www.slack.net/~ant/ + +#include "SNES_SPC.h" + +#if !SPC_NO_COPY_STATE_FUNCS + +#include + +/* Copyright (C) 2004-2007 Shay Green. This module is free software; you +can redistribute it and/or modify it under the terms of the GNU Lesser +General Public License as published by the Free Software Foundation; either +version 2.1 of the License, or (at your option) any later version. This +module is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +details. You should have received a copy of the GNU Lesser General Public +License along with this module; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ + +#include "blargg_source.h" + +#define RAM (m.ram.ram) +#define REGS (m.smp_regs [0]) +#define REGS_IN (m.smp_regs [1]) + +void SNES_SPC::save_regs( uint8_t out [reg_count] ) +{ + // Use current timer counter values + for ( int i = 0; i < timer_count; i++ ) + out [r_t0out + i] = m.timers [i].counter; + + // Last written values + memcpy( out, REGS, r_t0out ); +} + +void SNES_SPC::init_header( void* spc_out ) +{ + spc_file_t* const spc = (spc_file_t*) spc_out; + + spc->has_id666 = 26; // has none + spc->version = 30; + memcpy( spc, signature, sizeof spc->signature ); + memset( spc->text, 0, sizeof spc->text ); +} + +void SNES_SPC::save_spc( void* spc_out ) +{ + spc_file_t* const spc = (spc_file_t*) spc_out; + + // CPU + spc->pcl = (uint8_t) (m.cpu_regs.pc >> 0); + spc->pch = (uint8_t) (m.cpu_regs.pc >> 8); + spc->a = m.cpu_regs.a; + spc->x = m.cpu_regs.x; + spc->y = m.cpu_regs.y; + spc->psw = m.cpu_regs.psw; + spc->sp = m.cpu_regs.sp; + + // RAM, ROM + memcpy( spc->ram, RAM, sizeof spc->ram ); + if ( m.rom_enabled ) + memcpy( spc->ram + rom_addr, m.hi_ram, sizeof m.hi_ram ); + memset( spc->unused, 0, sizeof spc->unused ); + memcpy( spc->ipl_rom, m.rom, sizeof spc->ipl_rom ); + + // SMP registers + save_regs( &spc->ram [0xF0] ); + int i; + for ( i = 0; i < port_count; i++ ) + spc->ram [0xF0 + r_cpuio0 + i] = REGS_IN [r_cpuio0 + i]; + + // DSP registers + for ( i = 0; i < SPC_DSP::register_count; i++ ) + spc->dsp [i] = dsp.read( i ); +} + +void SNES_SPC::copy_state( unsigned char** io, copy_func_t copy ) +{ + SPC_State_Copier copier( io, copy ); + + // Make state data more readable by putting 64K RAM, 16 SMP registers, + // then DSP (with its 128 registers) first + + // RAM + enable_rom( 0 ); // will get re-enabled if necessary in regs_loaded() below + copier.copy( RAM, 0x10000 ); + + { + // SMP registers + uint8_t out_ports [port_count]; + uint8_t regs [reg_count]; + memcpy( out_ports, ®S [r_cpuio0], sizeof out_ports ); + save_regs( regs ); + copier.copy( regs, sizeof regs ); + copier.copy( out_ports, sizeof out_ports ); + load_regs( regs ); + regs_loaded(); + memcpy( ®S [r_cpuio0], out_ports, sizeof out_ports ); + } + + // CPU registers + SPC_COPY( uint16_t, m.cpu_regs.pc ); + SPC_COPY( uint8_t, m.cpu_regs.a ); + SPC_COPY( uint8_t, m.cpu_regs.x ); + SPC_COPY( uint8_t, m.cpu_regs.y ); + SPC_COPY( uint8_t, m.cpu_regs.psw ); + SPC_COPY( uint8_t, m.cpu_regs.sp ); + copier.extra(); + + SPC_COPY( int16_t, m.spc_time ); + SPC_COPY( int16_t, m.dsp_time ); + + // DSP + dsp.copy_state( io, copy ); + + // Timers + for ( int i = 0; i < timer_count; i++ ) + { + Timer* t = &m.timers [i]; + SPC_COPY( int16_t, t->next_time ); + SPC_COPY( uint8_t, t->divider ); + copier.extra(); + } + copier.extra(); +} +#endif diff --git a/waterbox/sameboy/snes_spc/SPC_CPU.h b/waterbox/sameboy/snes_spc/SPC_CPU.h new file mode 100644 index 0000000000..664fc4886e --- /dev/null +++ b/waterbox/sameboy/snes_spc/SPC_CPU.h @@ -0,0 +1,1220 @@ +// snes_spc 0.9.0. http://www.slack.net/~ant/ + +/* Copyright (C) 2004-2007 Shay Green. This module is free software; you +can redistribute it and/or modify it under the terms of the GNU Lesser +General Public License as published by the Free Software Foundation; either +version 2.1 of the License, or (at your option) any later version. This +module is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +details. You should have received a copy of the GNU Lesser General Public +License along with this module; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ + +//// Memory access + +#if SPC_MORE_ACCURACY + #define SUSPICIOUS_OPCODE( name ) ((void) 0) +#else + #define SUSPICIOUS_OPCODE( name ) dprintf( "SPC: suspicious opcode: " name "\n" ) +#endif + +#define CPU_READ( time, offset, addr )\ + cpu_read( addr, time + offset ) + +#define CPU_WRITE( time, offset, addr, data )\ + cpu_write( data, addr, time + offset ) + +#if SPC_MORE_ACCURACY + #define CPU_READ_TIMER( time, offset, addr, out )\ + { out = CPU_READ( time, offset, addr ); } + +#else + // timers are by far the most common thing read from dp + #define CPU_READ_TIMER( time, offset, addr_, out )\ + {\ + rel_time_t adj_time = time + offset;\ + int dp_addr = addr_;\ + int ti = dp_addr - (r_t0out + 0xF0);\ + if ( (unsigned) ti < timer_count )\ + {\ + Timer* t = &m.timers [ti];\ + if ( adj_time >= t->next_time )\ + t = run_timer_( t, adj_time );\ + out = t->counter;\ + t->counter = 0;\ + }\ + else\ + {\ + out = ram [dp_addr];\ + int i = dp_addr - 0xF0;\ + if ( (unsigned) i < 0x10 )\ + out = cpu_read_smp_reg( i, adj_time );\ + }\ + } +#endif + +#define TIME_ADJ( n ) (n) + +#define READ_TIMER( time, addr, out ) CPU_READ_TIMER( rel_time, TIME_ADJ(time), (addr), out ) +#define READ( time, addr ) CPU_READ ( rel_time, TIME_ADJ(time), (addr) ) +#define WRITE( time, addr, data ) CPU_WRITE( rel_time, TIME_ADJ(time), (addr), (data) ) + +#define DP_ADDR( addr ) (dp + (addr)) + +#define READ_DP_TIMER( time, addr, out ) CPU_READ_TIMER( rel_time, TIME_ADJ(time), DP_ADDR( addr ), out ) +#define READ_DP( time, addr ) READ ( time, DP_ADDR( addr ) ) +#define WRITE_DP( time, addr, data ) WRITE( time, DP_ADDR( addr ), data ) + +#define READ_PROG16( addr ) GET_LE16( ram + (addr) ) + +#define SET_PC( n ) (pc = ram + (n)) +#define GET_PC() (pc - ram) +#define READ_PC( pc ) (*(pc)) +#define READ_PC16( pc ) GET_LE16( pc ) + +// TODO: remove non-wrapping versions? +#define SPC_NO_SP_WRAPAROUND 0 + +#define SET_SP( v ) (sp = ram + 0x101 + (v)) +#define GET_SP() (sp - 0x101 - ram) + +#if SPC_NO_SP_WRAPAROUND +#define PUSH16( v ) (sp -= 2, SET_LE16( sp, v )) +#define PUSH( v ) (void) (*--sp = (uint8_t) (v)) +#define POP( out ) (void) ((out) = *sp++) + +#else +#define PUSH16( data )\ +{\ + int addr = (sp -= 2) - ram;\ + if ( addr > 0x100 )\ + {\ + SET_LE16( sp, data );\ + }\ + else\ + {\ + ram [(uint8_t) addr + 0x100] = (uint8_t) data;\ + sp [1] = (uint8_t) (data >> 8);\ + sp += 0x100;\ + }\ +} + +#define PUSH( data )\ +{\ + *--sp = (uint8_t) (data);\ + if ( sp - ram == 0x100 )\ + sp += 0x100;\ +} + +#define POP( out )\ +{\ + out = *sp++;\ + if ( sp - ram == 0x201 )\ + {\ + out = sp [-0x101];\ + sp -= 0x100;\ + }\ +} + +#endif + +#define MEM_BIT( rel ) CPU_mem_bit( pc, rel_time + rel ) + +unsigned SNES_SPC::CPU_mem_bit( uint8_t const* pc, rel_time_t rel_time ) +{ + unsigned addr = READ_PC16( pc ); + unsigned t = READ( 0, addr & 0x1FFF ) >> (addr >> 13); + return t << 8 & 0x100; +} + +//// Status flag handling + +// Hex value in name to clarify code and bit shifting. +// Flag stored in indicated variable during emulation +int const n80 = 0x80; // nz +int const v40 = 0x40; // psw +int const p20 = 0x20; // dp +int const b10 = 0x10; // psw +int const h08 = 0x08; // psw +int const i04 = 0x04; // psw +int const z02 = 0x02; // nz +int const c01 = 0x01; // c + +int const nz_neg_mask = 0x880; // either bit set indicates N flag set + +#define GET_PSW( out )\ +{\ + out = psw & ~(n80 | p20 | z02 | c01);\ + out |= c >> 8 & c01;\ + out |= dp >> 3 & p20;\ + out |= ((nz >> 4) | nz) & n80;\ + if ( !(uint8_t) nz ) out |= z02;\ +} + +#define SET_PSW( in )\ +{\ + psw = in;\ + c = in << 8;\ + dp = in << 3 & 0x100;\ + nz = (in << 4 & 0x800) | (~in & z02);\ +} + +SPC_CPU_RUN_FUNC +{ + uint8_t* const ram = RAM; + int a = m.cpu_regs.a; + int x = m.cpu_regs.x; + int y = m.cpu_regs.y; + uint8_t const* pc; + uint8_t* sp; + int psw; + int c; + int nz; + int dp; + + SET_PC( m.cpu_regs.pc ); + SET_SP( m.cpu_regs.sp ); + SET_PSW( m.cpu_regs.psw ); + + goto loop; + + + // Main loop + +cbranch_taken_loop: + pc += *(BOOST::int8_t const*) pc; +inc_pc_loop: + pc++; +loop: +{ + unsigned opcode; + unsigned data; + + check( (unsigned) a < 0x100 ); + check( (unsigned) x < 0x100 ); + check( (unsigned) y < 0x100 ); + + opcode = *pc; + if ( (rel_time += m.cycle_table [opcode]) > 0 ) + goto out_of_time; + + #ifdef SPC_CPU_OPCODE_HOOK + SPC_CPU_OPCODE_HOOK( GET_PC(), opcode ); + #endif + /* + //SUB_CASE_COUNTER( 1 ); + #define PROFILE_TIMER_LOOP( op, addr, len )\ + if ( opcode == op )\ + {\ + int cond = (unsigned) ((addr) - 0xFD) < 3 &&\ + pc [len] == 0xF0 && pc [len+1] == 0xFE - len;\ + SUB_CASE_COUNTER( op && cond );\ + } + + PROFILE_TIMER_LOOP( 0xEC, GET_LE16( pc + 1 ), 3 ); + PROFILE_TIMER_LOOP( 0xEB, pc [1], 2 ); + PROFILE_TIMER_LOOP( 0xE4, pc [1], 2 ); + */ + + // TODO: if PC is at end of memory, this will get wrong operand (very obscure) + data = *++pc; + switch ( opcode ) + { + +// Common instructions + +#define BRANCH( cond )\ +{\ + pc++;\ + pc += (BOOST::int8_t) data;\ + if ( cond )\ + goto loop;\ + pc -= (BOOST::int8_t) data;\ + rel_time -= 2;\ + goto loop;\ +} + + case 0xF0: // BEQ + BRANCH( !(uint8_t) nz ) // 89% taken + + case 0xD0: // BNE + BRANCH( (uint8_t) nz ) + + case 0x3F:{// CALL + int old_addr = GET_PC() + 2; + SET_PC( READ_PC16( pc ) ); + PUSH16( old_addr ); + goto loop; + } + + case 0x6F:// RET + #if SPC_NO_SP_WRAPAROUND + { + SET_PC( GET_LE16( sp ) ); + sp += 2; + } + #else + { + int addr = sp - ram; + SET_PC( GET_LE16( sp ) ); + sp += 2; + if ( addr < 0x1FF ) + goto loop; + + SET_PC( sp [-0x101] * 0x100 + ram [(uint8_t) addr + 0x100] ); + sp -= 0x100; + } + #endif + goto loop; + + case 0xE4: // MOV a,dp + ++pc; + // 80% from timer + READ_DP_TIMER( 0, data, a = nz ); + goto loop; + + case 0xFA:{// MOV dp,dp + int temp; + READ_DP_TIMER( -2, data, temp ); + data = temp + no_read_before_write ; + } + // fall through + case 0x8F:{// MOV dp,#imm + int temp = READ_PC( pc + 1 ); + pc += 2; + + #if !SPC_MORE_ACCURACY + { + int i = dp + temp; + ram [i] = (uint8_t) data; + i -= 0xF0; + if ( (unsigned) i < 0x10 ) // 76% + { + REGS [i] = (uint8_t) data; + + // Registers other than $F2 and $F4-$F7 + //if ( i != 2 && i != 4 && i != 5 && i != 6 && i != 7 ) + if ( ((~0x2F00 << (bits_in_int - 16)) << i) < 0 ) // 12% + cpu_write_smp_reg( data, rel_time, i ); + } + } + #else + WRITE_DP( 0, temp, data ); + #endif + goto loop; + } + + case 0xC4: // MOV dp,a + ++pc; + #if !SPC_MORE_ACCURACY + { + int i = dp + data; + ram [i] = (uint8_t) a; + i -= 0xF0; + if ( (unsigned) i < 0x10 ) // 39% + { + unsigned sel = i - 2; + REGS [i] = (uint8_t) a; + + if ( sel == 1 ) // 51% $F3 + dsp_write( a, rel_time ); + else if ( sel > 1 ) // 1% not $F2 or $F3 + cpu_write_smp_reg_( a, rel_time, i ); + } + } + #else + WRITE_DP( 0, data, a ); + #endif + goto loop; + +#define CASE( n ) case n: + +// Define common address modes based on opcode for immediate mode. Execution +// ends with data set to the address of the operand. +#define ADDR_MODES_( op )\ + CASE( op - 0x02 ) /* (X) */\ + data = x + dp;\ + pc--;\ + goto end_##op;\ + CASE( op + 0x0F ) /* (dp)+Y */\ + data = READ_PROG16( data + dp ) + y;\ + goto end_##op;\ + CASE( op - 0x01 ) /* (dp+X) */\ + data = READ_PROG16( ((uint8_t) (data + x)) + dp );\ + goto end_##op;\ + CASE( op + 0x0E ) /* abs+Y */\ + data += y;\ + goto abs_##op;\ + CASE( op + 0x0D ) /* abs+X */\ + data += x;\ + CASE( op - 0x03 ) /* abs */\ + abs_##op:\ + data += 0x100 * READ_PC( ++pc );\ + goto end_##op;\ + CASE( op + 0x0C ) /* dp+X */\ + data = (uint8_t) (data + x); + +#define ADDR_MODES_NO_DP( op )\ + ADDR_MODES_( op )\ + data += dp;\ + end_##op: + +#define ADDR_MODES( op )\ + ADDR_MODES_( op )\ + CASE( op - 0x04 ) /* dp */\ + data += dp;\ + end_##op: + +// 1. 8-bit Data Transmission Commands. Group I + + ADDR_MODES_NO_DP( 0xE8 ) // MOV A,addr + a = nz = READ( 0, data ); + goto inc_pc_loop; + + case 0xBF:{// MOV A,(X)+ + int temp = x + dp; + x = (uint8_t) (x + 1); + a = nz = READ( -1, temp ); + goto loop; + } + + case 0xE8: // MOV A,imm + a = data; + nz = data; + goto inc_pc_loop; + + case 0xF9: // MOV X,dp+Y + data = (uint8_t) (data + y); + case 0xF8: // MOV X,dp + READ_DP_TIMER( 0, data, x = nz ); + goto inc_pc_loop; + + case 0xE9: // MOV X,abs + data = READ_PC16( pc ); + ++pc; + data = READ( 0, data ); + case 0xCD: // MOV X,imm + x = data; + nz = data; + goto inc_pc_loop; + + case 0xFB: // MOV Y,dp+X + data = (uint8_t) (data + x); + case 0xEB: // MOV Y,dp + // 70% from timer + pc++; + READ_DP_TIMER( 0, data, y = nz ); + goto loop; + + case 0xEC:{// MOV Y,abs + int temp = READ_PC16( pc ); + pc += 2; + READ_TIMER( 0, temp, y = nz ); + //y = nz = READ( 0, temp ); + goto loop; + } + + case 0x8D: // MOV Y,imm + y = data; + nz = data; + goto inc_pc_loop; + +// 2. 8-BIT DATA TRANSMISSION COMMANDS, GROUP 2 + + ADDR_MODES_NO_DP( 0xC8 ) // MOV addr,A + WRITE( 0, data, a ); + goto inc_pc_loop; + + { + int temp; + case 0xCC: // MOV abs,Y + temp = y; + goto mov_abs_temp; + case 0xC9: // MOV abs,X + temp = x; + mov_abs_temp: + WRITE( 0, READ_PC16( pc ), temp ); + pc += 2; + goto loop; + } + + case 0xD9: // MOV dp+Y,X + data = (uint8_t) (data + y); + case 0xD8: // MOV dp,X + WRITE( 0, data + dp, x ); + goto inc_pc_loop; + + case 0xDB: // MOV dp+X,Y + data = (uint8_t) (data + x); + case 0xCB: // MOV dp,Y + WRITE( 0, data + dp, y ); + goto inc_pc_loop; + +// 3. 8-BIT DATA TRANSMISSIN COMMANDS, GROUP 3. + + case 0x7D: // MOV A,X + a = x; + nz = x; + goto loop; + + case 0xDD: // MOV A,Y + a = y; + nz = y; + goto loop; + + case 0x5D: // MOV X,A + x = a; + nz = a; + goto loop; + + case 0xFD: // MOV Y,A + y = a; + nz = a; + goto loop; + + case 0x9D: // MOV X,SP + x = nz = GET_SP(); + goto loop; + + case 0xBD: // MOV SP,X + SET_SP( x ); + goto loop; + + //case 0xC6: // MOV (X),A (handled by MOV addr,A in group 2) + + case 0xAF: // MOV (X)+,A + WRITE_DP( 0, x, a + no_read_before_write ); + x++; + goto loop; + +// 5. 8-BIT LOGIC OPERATION COMMANDS + +#define LOGICAL_OP( op, func )\ + ADDR_MODES( op ) /* addr */\ + data = READ( 0, data );\ + case op: /* imm */\ + nz = a func##= data;\ + goto inc_pc_loop;\ + { unsigned addr;\ + case op + 0x11: /* X,Y */\ + data = READ_DP( -2, y );\ + addr = x + dp;\ + goto addr_##op;\ + case op + 0x01: /* dp,dp */\ + data = READ_DP( -3, data );\ + case op + 0x10:{/*dp,imm*/\ + uint8_t const* addr2 = pc + 1;\ + pc += 2;\ + addr = READ_PC( addr2 ) + dp;\ + }\ + addr_##op:\ + nz = data func READ( -1, addr );\ + WRITE( 0, addr, nz );\ + goto loop;\ + } + + LOGICAL_OP( 0x28, & ); // AND + + LOGICAL_OP( 0x08, | ); // OR + + LOGICAL_OP( 0x48, ^ ); // EOR + +// 4. 8-BIT ARITHMETIC OPERATION COMMANDS + + ADDR_MODES( 0x68 ) // CMP addr + data = READ( 0, data ); + case 0x68: // CMP imm + nz = a - data; + c = ~nz; + nz &= 0xFF; + goto inc_pc_loop; + + case 0x79: // CMP (X),(Y) + data = READ_DP( -2, y ); + nz = READ_DP( -1, x ) - data; + c = ~nz; + nz &= 0xFF; + goto loop; + + case 0x69: // CMP dp,dp + data = READ_DP( -3, data ); + case 0x78: // CMP dp,imm + nz = READ_DP( -1, READ_PC( ++pc ) ) - data; + c = ~nz; + nz &= 0xFF; + goto inc_pc_loop; + + case 0x3E: // CMP X,dp + data += dp; + goto cmp_x_addr; + case 0x1E: // CMP X,abs + data = READ_PC16( pc ); + pc++; + cmp_x_addr: + data = READ( 0, data ); + case 0xC8: // CMP X,imm + nz = x - data; + c = ~nz; + nz &= 0xFF; + goto inc_pc_loop; + + case 0x7E: // CMP Y,dp + data += dp; + goto cmp_y_addr; + case 0x5E: // CMP Y,abs + data = READ_PC16( pc ); + pc++; + cmp_y_addr: + data = READ( 0, data ); + case 0xAD: // CMP Y,imm + nz = y - data; + c = ~nz; + nz &= 0xFF; + goto inc_pc_loop; + + { + int addr; + case 0xB9: // SBC (x),(y) + case 0x99: // ADC (x),(y) + pc--; // compensate for inc later + data = READ_DP( -2, y ); + addr = x + dp; + goto adc_addr; + case 0xA9: // SBC dp,dp + case 0x89: // ADC dp,dp + data = READ_DP( -3, data ); + case 0xB8: // SBC dp,imm + case 0x98: // ADC dp,imm + addr = READ_PC( ++pc ) + dp; + adc_addr: + nz = READ( -1, addr ); + goto adc_data; + +// catch ADC and SBC together, then decode later based on operand +#undef CASE +#define CASE( n ) case n: case (n) + 0x20: + ADDR_MODES( 0x88 ) // ADC/SBC addr + data = READ( 0, data ); + case 0xA8: // SBC imm + case 0x88: // ADC imm + addr = -1; // A + nz = a; + adc_data: { + int flags; + if ( opcode >= 0xA0 ) // SBC + data ^= 0xFF; + + flags = data ^ nz; + nz += data + (c >> 8 & 1); + flags ^= nz; + + psw = (psw & ~(v40 | h08)) | + (flags >> 1 & h08) | + ((flags + 0x80) >> 2 & v40); + c = nz; + if ( addr < 0 ) + { + a = (uint8_t) nz; + goto inc_pc_loop; + } + WRITE( 0, addr, /*(uint8_t)*/ nz ); + goto inc_pc_loop; + } + + } + +// 6. ADDITION & SUBTRACTION COMMANDS + +#define INC_DEC_REG( reg, op )\ + nz = reg op;\ + reg = (uint8_t) nz;\ + goto loop; + + case 0xBC: INC_DEC_REG( a, + 1 ) // INC A + case 0x3D: INC_DEC_REG( x, + 1 ) // INC X + case 0xFC: INC_DEC_REG( y, + 1 ) // INC Y + + case 0x9C: INC_DEC_REG( a, - 1 ) // DEC A + case 0x1D: INC_DEC_REG( x, - 1 ) // DEC X + case 0xDC: INC_DEC_REG( y, - 1 ) // DEC Y + + case 0x9B: // DEC dp+X + case 0xBB: // INC dp+X + data = (uint8_t) (data + x); + case 0x8B: // DEC dp + case 0xAB: // INC dp + data += dp; + goto inc_abs; + case 0x8C: // DEC abs + case 0xAC: // INC abs + data = READ_PC16( pc ); + pc++; + inc_abs: + nz = (opcode >> 4 & 2) - 1; + nz += READ( -1, data ); + WRITE( 0, data, /*(uint8_t)*/ nz ); + goto inc_pc_loop; + +// 7. SHIFT, ROTATION COMMANDS + + case 0x5C: // LSR A + c = 0; + case 0x7C:{// ROR A + nz = (c >> 1 & 0x80) | (a >> 1); + c = a << 8; + a = nz; + goto loop; + } + + case 0x1C: // ASL A + c = 0; + case 0x3C:{// ROL A + int temp = c >> 8 & 1; + c = a << 1; + nz = c | temp; + a = (uint8_t) nz; + goto loop; + } + + case 0x0B: // ASL dp + c = 0; + data += dp; + goto rol_mem; + case 0x1B: // ASL dp+X + c = 0; + case 0x3B: // ROL dp+X + data = (uint8_t) (data + x); + case 0x2B: // ROL dp + data += dp; + goto rol_mem; + case 0x0C: // ASL abs + c = 0; + case 0x2C: // ROL abs + data = READ_PC16( pc ); + pc++; + rol_mem: + nz = c >> 8 & 1; + nz |= (c = READ( -1, data ) << 1); + WRITE( 0, data, /*(uint8_t)*/ nz ); + goto inc_pc_loop; + + case 0x4B: // LSR dp + c = 0; + data += dp; + goto ror_mem; + case 0x5B: // LSR dp+X + c = 0; + case 0x7B: // ROR dp+X + data = (uint8_t) (data + x); + case 0x6B: // ROR dp + data += dp; + goto ror_mem; + case 0x4C: // LSR abs + c = 0; + case 0x6C: // ROR abs + data = READ_PC16( pc ); + pc++; + ror_mem: { + int temp = READ( -1, data ); + nz = (c >> 1 & 0x80) | (temp >> 1); + c = temp << 8; + WRITE( 0, data, nz ); + goto inc_pc_loop; + } + + case 0x9F: // XCN + nz = a = (a >> 4) | (uint8_t) (a << 4); + goto loop; + +// 8. 16-BIT TRANSMISION COMMANDS + + case 0xBA: // MOVW YA,dp + a = READ_DP( -2, data ); + nz = (a & 0x7F) | (a >> 1); + y = READ_DP( 0, (uint8_t) (data + 1) ); + nz |= y; + goto inc_pc_loop; + + case 0xDA: // MOVW dp,YA + WRITE_DP( -1, data, a ); + WRITE_DP( 0, (uint8_t) (data + 1), y + no_read_before_write ); + goto inc_pc_loop; + +// 9. 16-BIT OPERATION COMMANDS + + case 0x3A: // INCW dp + case 0x1A:{// DECW dp + int temp; + // low byte + data += dp; + temp = READ( -3, data ); + temp += (opcode >> 4 & 2) - 1; // +1 for INCW, -1 for DECW + nz = ((temp >> 1) | temp) & 0x7F; + WRITE( -2, data, /*(uint8_t)*/ temp ); + + // high byte + data = (uint8_t) (data + 1) + dp; + temp = (uint8_t) ((temp >> 8) + READ( -1, data )); + nz |= temp; + WRITE( 0, data, temp ); + + goto inc_pc_loop; + } + + case 0x7A: // ADDW YA,dp + case 0x9A:{// SUBW YA,dp + int lo = READ_DP( -2, data ); + int hi = READ_DP( 0, (uint8_t) (data + 1) ); + int result; + int flags; + + if ( opcode == 0x9A ) // SUBW + { + lo = (lo ^ 0xFF) + 1; + hi ^= 0xFF; + } + + lo += a; + result = y + hi + (lo >> 8); + flags = hi ^ y ^ result; + + psw = (psw & ~(v40 | h08)) | + (flags >> 1 & h08) | + ((flags + 0x80) >> 2 & v40); + c = result; + a = (uint8_t) lo; + result = (uint8_t) result; + y = result; + nz = (((lo >> 1) | lo) & 0x7F) | result; + + goto inc_pc_loop; + } + + case 0x5A: { // CMPW YA,dp + int temp = a - READ_DP( -1, data ); + nz = ((temp >> 1) | temp) & 0x7F; + temp = y + (temp >> 8); + temp -= READ_DP( 0, (uint8_t) (data + 1) ); + nz |= temp; + c = ~temp; + nz &= 0xFF; + goto inc_pc_loop; + } + +// 10. MULTIPLICATION & DIVISON COMMANDS + + case 0xCF: { // MUL YA + unsigned temp = y * a; + a = (uint8_t) temp; + nz = ((temp >> 1) | temp) & 0x7F; + y = temp >> 8; + nz |= y; + goto loop; + } + + case 0x9E: // DIV YA,X + { + unsigned ya = y * 0x100 + a; + + psw &= ~(h08 | v40); + + if ( y >= x ) + psw |= v40; + + if ( (y & 15) >= (x & 15) ) + psw |= h08; + + if ( y < x * 2 ) + { + a = ya / x; + y = ya - a * x; + } + else + { + a = 255 - (ya - x * 0x200) / (256 - x); + y = x + (ya - x * 0x200) % (256 - x); + } + + nz = (uint8_t) a; + a = (uint8_t) a; + + goto loop; + } + +// 11. DECIMAL COMPENSATION COMMANDS + + case 0xDF: // DAA + SUSPICIOUS_OPCODE( "DAA" ); + if ( a > 0x99 || c & 0x100 ) + { + a += 0x60; + c = 0x100; + } + + if ( (a & 0x0F) > 9 || psw & h08 ) + a += 0x06; + + nz = a; + a = (uint8_t) a; + goto loop; + + case 0xBE: // DAS + SUSPICIOUS_OPCODE( "DAS" ); + if ( a > 0x99 || !(c & 0x100) ) + { + a -= 0x60; + c = 0; + } + + if ( (a & 0x0F) > 9 || !(psw & h08) ) + a -= 0x06; + + nz = a; + a = (uint8_t) a; + goto loop; + +// 12. BRANCHING COMMANDS + + case 0x2F: // BRA rel + pc += (BOOST::int8_t) data; + goto inc_pc_loop; + + case 0x30: // BMI + BRANCH( (nz & nz_neg_mask) ) + + case 0x10: // BPL + BRANCH( !(nz & nz_neg_mask) ) + + case 0xB0: // BCS + BRANCH( c & 0x100 ) + + case 0x90: // BCC + BRANCH( !(c & 0x100) ) + + case 0x70: // BVS + BRANCH( psw & v40 ) + + case 0x50: // BVC + BRANCH( !(psw & v40) ) + + #define CBRANCH( cond )\ + {\ + pc++;\ + if ( cond )\ + goto cbranch_taken_loop;\ + rel_time -= 2;\ + goto inc_pc_loop;\ + } + + case 0x03: // BBS dp.bit,rel + case 0x23: + case 0x43: + case 0x63: + case 0x83: + case 0xA3: + case 0xC3: + case 0xE3: + CBRANCH( READ_DP( -4, data ) >> (opcode >> 5) & 1 ) + + case 0x13: // BBC dp.bit,rel + case 0x33: + case 0x53: + case 0x73: + case 0x93: + case 0xB3: + case 0xD3: + case 0xF3: + CBRANCH( !(READ_DP( -4, data ) >> (opcode >> 5) & 1) ) + + case 0xDE: // CBNE dp+X,rel + data = (uint8_t) (data + x); + // fall through + case 0x2E:{// CBNE dp,rel + int temp; + // 61% from timer + READ_DP_TIMER( -4, data, temp ); + CBRANCH( temp != a ) + } + + case 0x6E: { // DBNZ dp,rel + unsigned temp = READ_DP( -4, data ) - 1; + WRITE_DP( -3, (uint8_t) data, /*(uint8_t)*/ temp + no_read_before_write ); + CBRANCH( temp ) + } + + case 0xFE: // DBNZ Y,rel + y = (uint8_t) (y - 1); + BRANCH( y ) + + case 0x1F: // JMP [abs+X] + SET_PC( READ_PC16( pc ) + x ); + // fall through + case 0x5F: // JMP abs + SET_PC( READ_PC16( pc ) ); + goto loop; + +// 13. SUB-ROUTINE CALL RETURN COMMANDS + + case 0x0F:{// BRK + int temp; + int ret_addr = GET_PC(); + SUSPICIOUS_OPCODE( "BRK" ); + SET_PC( READ_PROG16( 0xFFDE ) ); // vector address verified + PUSH16( ret_addr ); + GET_PSW( temp ); + psw = (psw | b10) & ~i04; + PUSH( temp ); + goto loop; + } + + case 0x4F:{// PCALL offset + int ret_addr = GET_PC() + 1; + SET_PC( 0xFF00 | data ); + PUSH16( ret_addr ); + goto loop; + } + + case 0x01: // TCALL n + case 0x11: + case 0x21: + case 0x31: + case 0x41: + case 0x51: + case 0x61: + case 0x71: + case 0x81: + case 0x91: + case 0xA1: + case 0xB1: + case 0xC1: + case 0xD1: + case 0xE1: + case 0xF1: { + int ret_addr = GET_PC(); + SET_PC( READ_PROG16( 0xFFDE - (opcode >> 3) ) ); + PUSH16( ret_addr ); + goto loop; + } + +// 14. STACK OPERATION COMMANDS + + { + int temp; + case 0x7F: // RET1 + temp = *sp; + SET_PC( GET_LE16( sp + 1 ) ); + sp += 3; + goto set_psw; + case 0x8E: // POP PSW + POP( temp ); + set_psw: + SET_PSW( temp ); + goto loop; + } + + case 0x0D: { // PUSH PSW + int temp; + GET_PSW( temp ); + PUSH( temp ); + goto loop; + } + + case 0x2D: // PUSH A + PUSH( a ); + goto loop; + + case 0x4D: // PUSH X + PUSH( x ); + goto loop; + + case 0x6D: // PUSH Y + PUSH( y ); + goto loop; + + case 0xAE: // POP A + POP( a ); + goto loop; + + case 0xCE: // POP X + POP( x ); + goto loop; + + case 0xEE: // POP Y + POP( y ); + goto loop; + +// 15. BIT OPERATION COMMANDS + + case 0x02: // SET1 + case 0x22: + case 0x42: + case 0x62: + case 0x82: + case 0xA2: + case 0xC2: + case 0xE2: + case 0x12: // CLR1 + case 0x32: + case 0x52: + case 0x72: + case 0x92: + case 0xB2: + case 0xD2: + case 0xF2: { + int bit = 1 << (opcode >> 5); + int mask = ~bit; + if ( opcode & 0x10 ) + bit = 0; + data += dp; + WRITE( 0, data, (READ( -1, data ) & mask) | bit ); + goto inc_pc_loop; + } + + case 0x0E: // TSET1 abs + case 0x4E: // TCLR1 abs + data = READ_PC16( pc ); + pc += 2; + { + unsigned temp = READ( -2, data ); + nz = (uint8_t) (a - temp); + temp &= ~a; + if ( opcode == 0x0E ) + temp |= a; + WRITE( 0, data, temp ); + } + goto loop; + + case 0x4A: // AND1 C,mem.bit + c &= MEM_BIT( 0 ); + pc += 2; + goto loop; + + case 0x6A: // AND1 C,/mem.bit + c &= ~MEM_BIT( 0 ); + pc += 2; + goto loop; + + case 0x0A: // OR1 C,mem.bit + c |= MEM_BIT( -1 ); + pc += 2; + goto loop; + + case 0x2A: // OR1 C,/mem.bit + c |= ~MEM_BIT( -1 ); + pc += 2; + goto loop; + + case 0x8A: // EOR1 C,mem.bit + c ^= MEM_BIT( -1 ); + pc += 2; + goto loop; + + case 0xEA: // NOT1 mem.bit + data = READ_PC16( pc ); + pc += 2; + { + unsigned temp = READ( -1, data & 0x1FFF ); + temp ^= 1 << (data >> 13); + WRITE( 0, data & 0x1FFF, temp ); + } + goto loop; + + case 0xCA: // MOV1 mem.bit,C + data = READ_PC16( pc ); + pc += 2; + { + unsigned temp = READ( -2, data & 0x1FFF ); + unsigned bit = data >> 13; + temp = (temp & ~(1 << bit)) | ((c >> 8 & 1) << bit); + WRITE( 0, data & 0x1FFF, temp + no_read_before_write ); + } + goto loop; + + case 0xAA: // MOV1 C,mem.bit + c = MEM_BIT( 0 ); + pc += 2; + goto loop; + +// 16. PROGRAM PSW FLAG OPERATION COMMANDS + + case 0x60: // CLRC + c = 0; + goto loop; + + case 0x80: // SETC + c = ~0; + goto loop; + + case 0xED: // NOTC + c ^= 0x100; + goto loop; + + case 0xE0: // CLRV + psw &= ~(v40 | h08); + goto loop; + + case 0x20: // CLRP + dp = 0; + goto loop; + + case 0x40: // SETP + dp = 0x100; + goto loop; + + case 0xA0: // EI + SUSPICIOUS_OPCODE( "EI" ); + psw |= i04; + goto loop; + + case 0xC0: // DI + SUSPICIOUS_OPCODE( "DI" ); + psw &= ~i04; + goto loop; + +// 17. OTHER COMMANDS + + case 0x00: // NOP + goto loop; + + case 0xFF:{// STOP + // handle PC wrap-around + unsigned addr = GET_PC() - 1; + if ( addr >= 0x10000 ) + { + addr &= 0xFFFF; + SET_PC( addr ); + dprintf( "SPC: PC wrapped around\n" ); + goto loop; + } + } + // fall through + case 0xEF: // SLEEP + SUSPICIOUS_OPCODE( "STOP/SLEEP" ); + --pc; + rel_time = 0; + m.cpu_error = "SPC emulation error"; + goto stop; + } // switch + + assert( 0 ); // catch any unhandled instructions +} +out_of_time: + rel_time -= m.cycle_table [*pc]; // undo partial execution of opcode +stop: + + // Uncache registers + if ( GET_PC() >= 0x10000 ) + dprintf( "SPC: PC wrapped around\n" ); + m.cpu_regs.pc = (uint16_t) GET_PC(); + m.cpu_regs.sp = ( uint8_t) GET_SP(); + m.cpu_regs.a = ( uint8_t) a; + m.cpu_regs.x = ( uint8_t) x; + m.cpu_regs.y = ( uint8_t) y; + { + int temp; + GET_PSW( temp ); + m.cpu_regs.psw = (uint8_t) temp; + } +} +SPC_CPU_RUN_FUNC_END diff --git a/waterbox/sameboy/snes_spc/SPC_DSP.cpp b/waterbox/sameboy/snes_spc/SPC_DSP.cpp new file mode 100644 index 0000000000..dd180506fc --- /dev/null +++ b/waterbox/sameboy/snes_spc/SPC_DSP.cpp @@ -0,0 +1,1018 @@ +// snes_spc 0.9.0. http://www.slack.net/~ant/ + +#include "SPC_DSP.h" + +#include "blargg_endian.h" +#include + +/* Copyright (C) 2007 Shay Green. This module is free software; you +can redistribute it and/or modify it under the terms of the GNU Lesser +General Public License as published by the Free Software Foundation; either +version 2.1 of the License, or (at your option) any later version. This +module is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +details. You should have received a copy of the GNU Lesser General Public +License along with this module; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ + +#include "blargg_source.h" + +#ifdef BLARGG_ENABLE_OPTIMIZER + #include BLARGG_ENABLE_OPTIMIZER +#endif + +#if INT_MAX < 0x7FFFFFFF + #error "Requires that int type have at least 32 bits" +#endif + +// TODO: add to blargg_endian.h +#define GET_LE16SA( addr ) ((BOOST::int16_t) GET_LE16( addr )) +#define GET_LE16A( addr ) GET_LE16( addr ) +#define SET_LE16A( addr, data ) SET_LE16( addr, data ) + +static BOOST::uint8_t const initial_regs [SPC_DSP::register_count] = +{ + 0x45,0x8B,0x5A,0x9A,0xE4,0x82,0x1B,0x78,0x00,0x00,0xAA,0x96,0x89,0x0E,0xE0,0x80, + 0x2A,0x49,0x3D,0xBA,0x14,0xA0,0xAC,0xC5,0x00,0x00,0x51,0xBB,0x9C,0x4E,0x7B,0xFF, + 0xF4,0xFD,0x57,0x32,0x37,0xD9,0x42,0x22,0x00,0x00,0x5B,0x3C,0x9F,0x1B,0x87,0x9A, + 0x6F,0x27,0xAF,0x7B,0xE5,0x68,0x0A,0xD9,0x00,0x00,0x9A,0xC5,0x9C,0x4E,0x7B,0xFF, + 0xEA,0x21,0x78,0x4F,0xDD,0xED,0x24,0x14,0x00,0x00,0x77,0xB1,0xD1,0x36,0xC1,0x67, + 0x52,0x57,0x46,0x3D,0x59,0xF4,0x87,0xA4,0x00,0x00,0x7E,0x44,0x9C,0x4E,0x7B,0xFF, + 0x75,0xF5,0x06,0x97,0x10,0xC3,0x24,0xBB,0x00,0x00,0x7B,0x7A,0xE0,0x60,0x12,0x0F, + 0xF7,0x74,0x1C,0xE5,0x39,0x3D,0x73,0xC1,0x00,0x00,0x7A,0xB3,0xFF,0x4E,0x7B,0xFF +}; + +// if ( io < -32768 ) io = -32768; +// if ( io > 32767 ) io = 32767; +#define CLAMP16( io )\ +{\ + if ( (int16_t) io != io )\ + io = (io >> 31) ^ 0x7FFF;\ +} + +// Access global DSP register +#define REG(n) m.regs [r_##n] + +// Access voice DSP register +#define VREG(r,n) r [v_##n] + +#define WRITE_SAMPLES( l, r, out ) \ +{\ + out [0] = l;\ + out [1] = r;\ + out += 2;\ + if ( out >= m.out_end )\ + {\ + check( out == m.out_end );\ + check( m.out_end != &m.extra [extra_size] || \ + (m.extra <= m.out_begin && m.extra < &m.extra [extra_size]) );\ + out = m.extra;\ + m.out_end = &m.extra [extra_size];\ + }\ +}\ + +void SPC_DSP::set_output( sample_t* out, int size ) +{ + require( (size & 1) == 0 ); // must be even + if ( !out ) + { + out = m.extra; + size = extra_size; + } + m.out_begin = out; + m.out = out; + m.out_end = out + size; +} + +// Volume registers and efb are signed! Easy to forget int8_t cast. +// Prefixes are to avoid accidental use of locals with same names. + +// Gaussian interpolation + +static short const gauss [512] = +{ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, + 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5, 5, 5, 5, + 6, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 10, 10, 10, + 11, 11, 11, 12, 12, 13, 13, 14, 14, 15, 15, 15, 16, 16, 17, 17, + 18, 19, 19, 20, 20, 21, 21, 22, 23, 23, 24, 24, 25, 26, 27, 27, + 28, 29, 29, 30, 31, 32, 32, 33, 34, 35, 36, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, + 58, 59, 60, 61, 62, 64, 65, 66, 67, 69, 70, 71, 73, 74, 76, 77, + 78, 80, 81, 83, 84, 86, 87, 89, 90, 92, 94, 95, 97, 99, 100, 102, + 104, 106, 107, 109, 111, 113, 115, 117, 118, 120, 122, 124, 126, 128, 130, 132, + 134, 137, 139, 141, 143, 145, 147, 150, 152, 154, 156, 159, 161, 163, 166, 168, + 171, 173, 175, 178, 180, 183, 186, 188, 191, 193, 196, 199, 201, 204, 207, 210, + 212, 215, 218, 221, 224, 227, 230, 233, 236, 239, 242, 245, 248, 251, 254, 257, + 260, 263, 267, 270, 273, 276, 280, 283, 286, 290, 293, 297, 300, 304, 307, 311, + 314, 318, 321, 325, 328, 332, 336, 339, 343, 347, 351, 354, 358, 362, 366, 370, + 374, 378, 381, 385, 389, 393, 397, 401, 405, 410, 414, 418, 422, 426, 430, 434, + 439, 443, 447, 451, 456, 460, 464, 469, 473, 477, 482, 486, 491, 495, 499, 504, + 508, 513, 517, 522, 527, 531, 536, 540, 545, 550, 554, 559, 563, 568, 573, 577, + 582, 587, 592, 596, 601, 606, 611, 615, 620, 625, 630, 635, 640, 644, 649, 654, + 659, 664, 669, 674, 678, 683, 688, 693, 698, 703, 708, 713, 718, 723, 728, 732, + 737, 742, 747, 752, 757, 762, 767, 772, 777, 782, 787, 792, 797, 802, 806, 811, + 816, 821, 826, 831, 836, 841, 846, 851, 855, 860, 865, 870, 875, 880, 884, 889, + 894, 899, 904, 908, 913, 918, 923, 927, 932, 937, 941, 946, 951, 955, 960, 965, + 969, 974, 978, 983, 988, 992, 997,1001,1005,1010,1014,1019,1023,1027,1032,1036, +1040,1045,1049,1053,1057,1061,1066,1070,1074,1078,1082,1086,1090,1094,1098,1102, +1106,1109,1113,1117,1121,1125,1128,1132,1136,1139,1143,1146,1150,1153,1157,1160, +1164,1167,1170,1174,1177,1180,1183,1186,1190,1193,1196,1199,1202,1205,1207,1210, +1213,1216,1219,1221,1224,1227,1229,1232,1234,1237,1239,1241,1244,1246,1248,1251, +1253,1255,1257,1259,1261,1263,1265,1267,1269,1270,1272,1274,1275,1277,1279,1280, +1282,1283,1284,1286,1287,1288,1290,1291,1292,1293,1294,1295,1296,1297,1297,1298, +1299,1300,1300,1301,1302,1302,1303,1303,1303,1304,1304,1304,1304,1304,1305,1305, +}; + +inline int SPC_DSP::interpolate( voice_t const* v ) +{ + // Make pointers into gaussian based on fractional position between samples + int offset = v->interp_pos >> 4 & 0xFF; + short const* fwd = gauss + 255 - offset; + short const* rev = gauss + offset; // mirror left half of gaussian + + int const* in = &v->buf [(v->interp_pos >> 12) + v->buf_pos]; + int out; + out = (fwd [ 0] * in [0]) >> 11; + out += (fwd [256] * in [1]) >> 11; + out += (rev [256] * in [2]) >> 11; + out = (int16_t) out; + out += (rev [ 0] * in [3]) >> 11; + + CLAMP16( out ); + out &= ~1; + return out; +} + + +//// Counters + +int const simple_counter_range = 2048 * 5 * 3; // 30720 + +static unsigned const counter_rates [32] = +{ + simple_counter_range + 1, // never fires + 2048, 1536, + 1280, 1024, 768, + 640, 512, 384, + 320, 256, 192, + 160, 128, 96, + 80, 64, 48, + 40, 32, 24, + 20, 16, 12, + 10, 8, 6, + 5, 4, 3, + 2, + 1 +}; + +static unsigned const counter_offsets [32] = +{ + 1, 0, 1040, + 536, 0, 1040, + 536, 0, 1040, + 536, 0, 1040, + 536, 0, 1040, + 536, 0, 1040, + 536, 0, 1040, + 536, 0, 1040, + 536, 0, 1040, + 536, 0, 1040, + 0, + 0 +}; + +inline void SPC_DSP::init_counter() +{ + m.counter = 0; +} + +inline void SPC_DSP::run_counters() +{ + if ( --m.counter < 0 ) + m.counter = simple_counter_range - 1; +} + +inline unsigned SPC_DSP::read_counter( int rate ) +{ + return ((unsigned) m.counter + counter_offsets [rate]) % counter_rates [rate]; +} + + +//// Envelope + +inline void SPC_DSP::run_envelope( voice_t* const v ) +{ + int env = v->env; + if ( v->env_mode == env_release ) // 60% + { + if ( (env -= 0x8) < 0 ) + env = 0; + v->env = env; + } + else + { + int rate; + int env_data = VREG(v->regs,adsr1); + if ( m.t_adsr0 & 0x80 ) // 99% ADSR + { + if ( v->env_mode >= env_decay ) // 99% + { + env--; + env -= env >> 8; + rate = env_data & 0x1F; + if ( v->env_mode == env_decay ) // 1% + rate = (m.t_adsr0 >> 3 & 0x0E) + 0x10; + } + else // env_attack + { + rate = (m.t_adsr0 & 0x0F) * 2 + 1; + env += rate < 31 ? 0x20 : 0x400; + } + } + else // GAIN + { + int mode; + env_data = VREG(v->regs,gain); + mode = env_data >> 5; + if ( mode < 4 ) // direct + { + env = env_data * 0x10; + rate = 31; + } + else + { + rate = env_data & 0x1F; + if ( mode == 4 ) // 4: linear decrease + { + env -= 0x20; + } + else if ( mode < 6 ) // 5: exponential decrease + { + env--; + env -= env >> 8; + } + else // 6,7: linear increase + { + env += 0x20; + if ( mode > 6 && (unsigned) v->hidden_env >= 0x600 ) + env += 0x8 - 0x20; // 7: two-slope linear increase + } + } + } + + // Sustain level + if ( (env >> 8) == (env_data >> 5) && v->env_mode == env_decay ) + v->env_mode = env_sustain; + + v->hidden_env = env; + + // unsigned cast because linear decrease going negative also triggers this + if ( (unsigned) env > 0x7FF ) + { + env = (env < 0 ? 0 : 0x7FF); + if ( v->env_mode == env_attack ) + v->env_mode = env_decay; + } + + if ( !read_counter( rate ) ) + v->env = env; // nothing else is controlled by the counter + } +} + + +//// BRR Decoding + +inline void SPC_DSP::decode_brr( voice_t* v ) +{ + // Arrange the four input nybbles in 0xABCD order for easy decoding + int nybbles = m.t_brr_byte * 0x100 + m.ram [(v->brr_addr + v->brr_offset + 1) & 0xFFFF]; + + int const header = m.t_brr_header; + + // Write to next four samples in circular buffer + int* pos = &v->buf [v->buf_pos]; + int* end; + if ( (v->buf_pos += 4) >= brr_buf_size ) + v->buf_pos = 0; + + // Decode four samples + for ( end = pos + 4; pos < end; pos++, nybbles <<= 4 ) + { + // Extract nybble and sign-extend + int s = (int16_t) nybbles >> 12; + + // Shift sample based on header + int const shift = header >> 4; + s = (s << shift) >> 1; + if ( shift >= 0xD ) // handle invalid range + s = (s >> 25) << 11; // same as: s = (s < 0 ? -0x800 : 0) + + // Apply IIR filter (8 is the most commonly used) + int const filter = header & 0x0C; + int const p1 = pos [brr_buf_size - 1]; + int const p2 = pos [brr_buf_size - 2] >> 1; + if ( filter >= 8 ) + { + s += p1; + s -= p2; + if ( filter == 8 ) // s += p1 * 0.953125 - p2 * 0.46875 + { + s += p2 >> 4; + s += (p1 * -3) >> 6; + } + else // s += p1 * 0.8984375 - p2 * 0.40625 + { + s += (p1 * -13) >> 7; + s += (p2 * 3) >> 4; + } + } + else if ( filter ) // s += p1 * 0.46875 + { + s += p1 >> 1; + s += (-p1) >> 5; + } + + // Adjust and write sample + CLAMP16( s ); + s = (int16_t) (s * 2); + pos [brr_buf_size] = pos [0] = s; // second copy simplifies wrap-around + } +} + + +//// Misc + +#define MISC_CLOCK( n ) inline void SPC_DSP::misc_##n() + +MISC_CLOCK( 27 ) +{ + m.t_pmon = REG(pmon) & 0xFE; // voice 0 doesn't support PMON +} +MISC_CLOCK( 28 ) +{ + m.t_non = REG(non); + m.t_eon = REG(eon); + m.t_dir = REG(dir); +} +MISC_CLOCK( 29 ) +{ + if ( (m.every_other_sample ^= 1) != 0 ) + m.new_kon &= ~m.kon; // clears KON 63 clocks after it was last read +} +MISC_CLOCK( 30 ) +{ + if ( m.every_other_sample ) + { + m.kon = m.new_kon; + m.t_koff = REG(koff) | m.mute_mask; + } + + run_counters(); + + // Noise + if ( !read_counter( REG(flg) & 0x1F ) ) + { + int feedback = (m.noise << 13) ^ (m.noise << 14); + m.noise = (feedback & 0x4000) ^ (m.noise >> 1); + } +} + + +//// Voices + +#define VOICE_CLOCK( n ) void SPC_DSP::voice_##n( voice_t* const v ) + +inline VOICE_CLOCK( V1 ) +{ + m.t_dir_addr = m.t_dir * 0x100 + m.t_srcn * 4; + m.t_srcn = VREG(v->regs,srcn); +} +inline VOICE_CLOCK( V2 ) +{ + // Read sample pointer (ignored if not needed) + uint8_t const* entry = &m.ram [m.t_dir_addr]; + if ( !v->kon_delay ) + entry += 2; + m.t_brr_next_addr = GET_LE16A( entry ); + + m.t_adsr0 = VREG(v->regs,adsr0); + + // Read pitch, spread over two clocks + m.t_pitch = VREG(v->regs,pitchl); +} +inline VOICE_CLOCK( V3a ) +{ + m.t_pitch += (VREG(v->regs,pitchh) & 0x3F) << 8; +} +inline VOICE_CLOCK( V3b ) +{ + // Read BRR header and byte + m.t_brr_byte = m.ram [(v->brr_addr + v->brr_offset) & 0xFFFF]; + m.t_brr_header = m.ram [v->brr_addr]; // brr_addr doesn't need masking +} +VOICE_CLOCK( V3c ) +{ + // Pitch modulation using previous voice's output + if ( m.t_pmon & v->vbit ) + m.t_pitch += ((m.t_output >> 5) * m.t_pitch) >> 10; + + if ( v->kon_delay ) + { + // Get ready to start BRR decoding on next sample + if ( v->kon_delay == 5 ) + { + v->brr_addr = m.t_brr_next_addr; + v->brr_offset = 1; + v->buf_pos = 0; + m.t_brr_header = 0; // header is ignored on this sample + m.kon_check = true; + } + + // Envelope is never run during KON + v->env = 0; + v->hidden_env = 0; + + // Disable BRR decoding until last three samples + v->interp_pos = 0; + if ( --v->kon_delay & 3 ) + v->interp_pos = 0x4000; + + // Pitch is never added during KON + m.t_pitch = 0; + } + + // Gaussian interpolation + { + int output = interpolate( v ); + + // Noise + if ( m.t_non & v->vbit ) + output = (int16_t) (m.noise * 2); + + // Apply envelope + m.t_output = (output * v->env) >> 11 & ~1; + v->t_envx_out = (uint8_t) (v->env >> 4); + } + + // Immediate silence due to end of sample or soft reset + if ( REG(flg) & 0x80 || (m.t_brr_header & 3) == 1 ) + { + v->env_mode = env_release; + v->env = 0; + } + + if ( m.every_other_sample ) + { + // KOFF + if ( m.t_koff & v->vbit ) + v->env_mode = env_release; + + // KON + if ( m.kon & v->vbit ) + { + v->kon_delay = 5; + v->env_mode = env_attack; + } + } + + // Run envelope for next sample + if ( !v->kon_delay ) + run_envelope( v ); +} +inline void SPC_DSP::voice_output( voice_t const* v, int ch ) +{ + // Apply left/right volume + int amp = (m.t_output * (int8_t) VREG(v->regs,voll + ch)) >> 7; + + // Add to output total + m.t_main_out [ch] += amp; + CLAMP16( m.t_main_out [ch] ); + + // Optionally add to echo total + if ( m.t_eon & v->vbit ) + { + m.t_echo_out [ch] += amp; + CLAMP16( m.t_echo_out [ch] ); + } +} +VOICE_CLOCK( V4 ) +{ + // Decode BRR + m.t_looped = 0; + if ( v->interp_pos >= 0x4000 ) + { + decode_brr( v ); + + if ( (v->brr_offset += 2) >= brr_block_size ) + { + // Start decoding next BRR block + assert( v->brr_offset == brr_block_size ); + v->brr_addr = (v->brr_addr + brr_block_size) & 0xFFFF; + if ( m.t_brr_header & 1 ) + { + v->brr_addr = m.t_brr_next_addr; + m.t_looped = v->vbit; + } + v->brr_offset = 1; + } + } + + // Apply pitch + v->interp_pos = (v->interp_pos & 0x3FFF) + m.t_pitch; + + // Keep from getting too far ahead (when using pitch modulation) + if ( v->interp_pos > 0x7FFF ) + v->interp_pos = 0x7FFF; + + // Output left + voice_output( v, 0 ); +} +inline VOICE_CLOCK( V5 ) +{ + // Output right + voice_output( v, 1 ); + + // ENDX, OUTX, and ENVX won't update if you wrote to them 1-2 clocks earlier + int endx_buf = REG(endx) | m.t_looped; + + // Clear bit in ENDX if KON just began + if ( v->kon_delay == 5 ) + endx_buf &= ~v->vbit; + m.endx_buf = (uint8_t) endx_buf; +} +inline VOICE_CLOCK( V6 ) +{ + (void) v; // avoid compiler warning about unused v + m.outx_buf = (uint8_t) (m.t_output >> 8); +} +inline VOICE_CLOCK( V7 ) +{ + // Update ENDX + REG(endx) = m.endx_buf; + + m.envx_buf = v->t_envx_out; +} +inline VOICE_CLOCK( V8 ) +{ + // Update OUTX + VREG(v->regs,outx) = m.outx_buf; +} +inline VOICE_CLOCK( V9 ) +{ + // Update ENVX + VREG(v->regs,envx) = m.envx_buf; +} + +// Most voices do all these in one clock, so make a handy composite +inline VOICE_CLOCK( V3 ) +{ + voice_V3a( v ); + voice_V3b( v ); + voice_V3c( v ); +} + +// Common combinations of voice steps on different voices. This greatly reduces +// code size and allows everything to be inlined in these functions. +VOICE_CLOCK(V7_V4_V1) { voice_V7(v); voice_V1(v+3); voice_V4(v+1); } +VOICE_CLOCK(V8_V5_V2) { voice_V8(v); voice_V5(v+1); voice_V2(v+2); } +VOICE_CLOCK(V9_V6_V3) { voice_V9(v); voice_V6(v+1); voice_V3(v+2); } + + +//// Echo + +// Current echo buffer pointer for left/right channel +#define ECHO_PTR( ch ) (&m.ram [m.t_echo_ptr + ch * 2]) + +// Sample in echo history buffer, where 0 is the oldest +#define ECHO_FIR( i ) (m.echo_hist_pos [i]) + +// Calculate FIR point for left/right channel +#define CALC_FIR( i, ch ) ((ECHO_FIR( i + 1 ) [ch] * (int8_t) REG(fir + i * 0x10)) >> 6) + +#define ECHO_CLOCK( n ) inline void SPC_DSP::echo_##n() + +inline void SPC_DSP::echo_read( int ch ) +{ + int s = GET_LE16SA( ECHO_PTR( ch ) ); + // second copy simplifies wrap-around handling + ECHO_FIR( 0 ) [ch] = ECHO_FIR( 8 ) [ch] = s >> 1; +} + +ECHO_CLOCK( 22 ) +{ + // History + if ( ++m.echo_hist_pos >= &m.echo_hist [echo_hist_size] ) + m.echo_hist_pos = m.echo_hist; + + m.t_echo_ptr = (m.t_esa * 0x100 + m.echo_offset) & 0xFFFF; + echo_read( 0 ); + + // FIR (using l and r temporaries below helps compiler optimize) + int l = CALC_FIR( 0, 0 ); + int r = CALC_FIR( 0, 1 ); + + m.t_echo_in [0] = l; + m.t_echo_in [1] = r; +} +ECHO_CLOCK( 23 ) +{ + int l = CALC_FIR( 1, 0 ) + CALC_FIR( 2, 0 ); + int r = CALC_FIR( 1, 1 ) + CALC_FIR( 2, 1 ); + + m.t_echo_in [0] += l; + m.t_echo_in [1] += r; + + echo_read( 1 ); +} +ECHO_CLOCK( 24 ) +{ + int l = CALC_FIR( 3, 0 ) + CALC_FIR( 4, 0 ) + CALC_FIR( 5, 0 ); + int r = CALC_FIR( 3, 1 ) + CALC_FIR( 4, 1 ) + CALC_FIR( 5, 1 ); + + m.t_echo_in [0] += l; + m.t_echo_in [1] += r; +} +ECHO_CLOCK( 25 ) +{ + int l = m.t_echo_in [0] + CALC_FIR( 6, 0 ); + int r = m.t_echo_in [1] + CALC_FIR( 6, 1 ); + + l = (int16_t) l; + r = (int16_t) r; + + l += (int16_t) CALC_FIR( 7, 0 ); + r += (int16_t) CALC_FIR( 7, 1 ); + + CLAMP16( l ); + CLAMP16( r ); + + m.t_echo_in [0] = l & ~1; + m.t_echo_in [1] = r & ~1; +} +inline int SPC_DSP::echo_output( int ch ) +{ + int out = (int16_t) ((m.t_main_out [ch] * (int8_t) REG(mvoll + ch * 0x10)) >> 7) + + (int16_t) ((m.t_echo_in [ch] * (int8_t) REG(evoll + ch * 0x10)) >> 7); + CLAMP16( out ); + return out; +} +ECHO_CLOCK( 26 ) +{ + // Left output volumes + // (save sample for next clock so we can output both together) + m.t_main_out [0] = echo_output( 0 ); + + // Echo feedback + int l = m.t_echo_out [0] + (int16_t) ((m.t_echo_in [0] * (int8_t) REG(efb)) >> 7); + int r = m.t_echo_out [1] + (int16_t) ((m.t_echo_in [1] * (int8_t) REG(efb)) >> 7); + + CLAMP16( l ); + CLAMP16( r ); + + m.t_echo_out [0] = l & ~1; + m.t_echo_out [1] = r & ~1; +} +ECHO_CLOCK( 27 ) +{ + // Output + int l = m.t_main_out [0]; + int r = echo_output( 1 ); + m.t_main_out [0] = 0; + m.t_main_out [1] = 0; + + // TODO: global muting isn't this simple (turns DAC on and off + // or something, causing small ~37-sample pulse when first muted) + if ( REG(flg) & 0x40 ) + { + l = 0; + r = 0; + } + + // Output sample to DAC + #ifdef SPC_DSP_OUT_HOOK + SPC_DSP_OUT_HOOK( l, r ); + #else + sample_t* out = m.out; + WRITE_SAMPLES( l, r, out ); + m.out = out; + #endif +} +ECHO_CLOCK( 28 ) +{ + m.t_echo_enabled = REG(flg); +} +inline void SPC_DSP::echo_write( int ch ) +{ + if ( !(m.t_echo_enabled & 0x20) ) + SET_LE16A( ECHO_PTR( ch ), m.t_echo_out [ch] ); + m.t_echo_out [ch] = 0; +} +ECHO_CLOCK( 29 ) +{ + m.t_esa = REG(esa); + + if ( !m.echo_offset ) + m.echo_length = (REG(edl) & 0x0F) * 0x800; + + m.echo_offset += 4; + if ( m.echo_offset >= m.echo_length ) + m.echo_offset = 0; + + // Write left echo + echo_write( 0 ); + + m.t_echo_enabled = REG(flg); +} +ECHO_CLOCK( 30 ) +{ + // Write right echo + echo_write( 1 ); +} + + +//// Timing + +// Execute clock for a particular voice +#define V( clock, voice ) voice_##clock( &m.voices [voice] ); + +/* The most common sequence of clocks uses composite operations +for efficiency. For example, the following are equivalent to the +individual steps on the right: + +V(V7_V4_V1,2) -> V(V7,2) V(V4,3) V(V1,5) +V(V8_V5_V2,2) -> V(V8,2) V(V5,3) V(V2,4) +V(V9_V6_V3,2) -> V(V9,2) V(V6,3) V(V3,4) */ + +// Voice 0 1 2 3 4 5 6 7 +#define GEN_DSP_TIMING \ +PHASE( 0) V(V5,0)V(V2,1)\ +PHASE( 1) V(V6,0)V(V3,1)\ +PHASE( 2) V(V7_V4_V1,0)\ +PHASE( 3) V(V8_V5_V2,0)\ +PHASE( 4) V(V9_V6_V3,0)\ +PHASE( 5) V(V7_V4_V1,1)\ +PHASE( 6) V(V8_V5_V2,1)\ +PHASE( 7) V(V9_V6_V3,1)\ +PHASE( 8) V(V7_V4_V1,2)\ +PHASE( 9) V(V8_V5_V2,2)\ +PHASE(10) V(V9_V6_V3,2)\ +PHASE(11) V(V7_V4_V1,3)\ +PHASE(12) V(V8_V5_V2,3)\ +PHASE(13) V(V9_V6_V3,3)\ +PHASE(14) V(V7_V4_V1,4)\ +PHASE(15) V(V8_V5_V2,4)\ +PHASE(16) V(V9_V6_V3,4)\ +PHASE(17) V(V1,0) V(V7,5)V(V4,6)\ +PHASE(18) V(V8_V5_V2,5)\ +PHASE(19) V(V9_V6_V3,5)\ +PHASE(20) V(V1,1) V(V7,6)V(V4,7)\ +PHASE(21) V(V8,6)V(V5,7) V(V2,0) /* t_brr_next_addr order dependency */\ +PHASE(22) V(V3a,0) V(V9,6)V(V6,7) echo_22();\ +PHASE(23) V(V7,7) echo_23();\ +PHASE(24) V(V8,7) echo_24();\ +PHASE(25) V(V3b,0) V(V9,7) echo_25();\ +PHASE(26) echo_26();\ +PHASE(27) misc_27(); echo_27();\ +PHASE(28) misc_28(); echo_28();\ +PHASE(29) misc_29(); echo_29();\ +PHASE(30) misc_30();V(V3c,0) echo_30();\ +PHASE(31) V(V4,0) V(V1,2)\ + +#if !SPC_DSP_CUSTOM_RUN + +void SPC_DSP::run( int clocks_remain ) +{ + require( clocks_remain > 0 ); + + int const phase = m.phase; + m.phase = (phase + clocks_remain) & 31; + switch ( phase ) + { + loop: + + #define PHASE( n ) if ( n && !--clocks_remain ) break; case n: + GEN_DSP_TIMING + #undef PHASE + + if ( --clocks_remain ) + goto loop; + } +} + +#endif + + +//// Setup + +void SPC_DSP::init( void* ram_64k ) +{ + m.ram = (uint8_t*) ram_64k; + mute_voices( 0 ); + disable_surround( false ); + set_output( 0, 0 ); + reset(); + + #ifndef NDEBUG + // be sure this sign-extends + assert( (int16_t) 0x8000 == -0x8000 ); + + // be sure right shift preserves sign + assert( (-1 >> 1) == -1 ); + + // check clamp macro + int i; + i = +0x8000; CLAMP16( i ); assert( i == +0x7FFF ); + i = -0x8001; CLAMP16( i ); assert( i == -0x8000 ); + + blargg_verify_byte_order(); + #endif +} + +void SPC_DSP::soft_reset_common() +{ + require( m.ram ); // init() must have been called already + + m.noise = 0x4000; + m.echo_hist_pos = m.echo_hist; + m.every_other_sample = 1; + m.echo_offset = 0; + m.phase = 0; + + init_counter(); +} + +void SPC_DSP::soft_reset() +{ + REG(flg) = 0xE0; + soft_reset_common(); +} + +void SPC_DSP::load( uint8_t const regs [register_count] ) +{ + memcpy( m.regs, regs, sizeof m.regs ); + memset( &m.regs [register_count], 0, offsetof (state_t,ram) - register_count ); + + // Internal state + for ( int i = voice_count; --i >= 0; ) + { + voice_t* v = &m.voices [i]; + v->brr_offset = 1; + v->vbit = 1 << i; + v->regs = &m.regs [i * 0x10]; + } + m.new_kon = REG(kon); + m.t_dir = REG(dir); + m.t_esa = REG(esa); + + soft_reset_common(); +} + +void SPC_DSP::reset() { load( initial_regs ); } + + +//// State save/load + +#if !SPC_NO_COPY_STATE_FUNCS + +void SPC_State_Copier::copy( void* state, size_t size ) +{ + func( buf, state, size ); +} + +int SPC_State_Copier::copy_int( int state, int size ) +{ + BOOST::uint8_t s [2]; + SET_LE16( s, state ); + func( buf, &s, size ); + return GET_LE16( s ); +} + +void SPC_State_Copier::skip( int count ) +{ + if ( count > 0 ) + { + char temp [64]; + memset( temp, 0, sizeof temp ); + do + { + int n = sizeof temp; + if ( n > count ) + n = count; + count -= n; + func( buf, temp, n ); + } + while ( count ); + } +} + +void SPC_State_Copier::extra() +{ + int n = 0; + SPC_State_Copier& copier = *this; + SPC_COPY( uint8_t, n ); + skip( n ); +} + +void SPC_DSP::copy_state( unsigned char** io, copy_func_t copy ) +{ + SPC_State_Copier copier( io, copy ); + + // DSP registers + copier.copy( m.regs, register_count ); + + // Internal state + + // Voices + int i; + for ( i = 0; i < voice_count; i++ ) + { + voice_t* v = &m.voices [i]; + + // BRR buffer + int i; + for ( i = 0; i < brr_buf_size; i++ ) + { + int s = v->buf [i]; + SPC_COPY( int16_t, s ); + v->buf [i] = v->buf [i + brr_buf_size] = s; + } + + SPC_COPY( uint16_t, v->interp_pos ); + SPC_COPY( uint16_t, v->brr_addr ); + SPC_COPY( uint16_t, v->env ); + SPC_COPY( int16_t, v->hidden_env ); + SPC_COPY( uint8_t, v->buf_pos ); + SPC_COPY( uint8_t, v->brr_offset ); + SPC_COPY( uint8_t, v->kon_delay ); + { + int m = v->env_mode; + SPC_COPY( uint8_t, m ); + v->env_mode = (enum env_mode_t) m; + } + SPC_COPY( uint8_t, v->t_envx_out ); + + copier.extra(); + } + + // Echo history + for ( i = 0; i < echo_hist_size; i++ ) + { + int j; + for ( j = 0; j < 2; j++ ) + { + int s = m.echo_hist_pos [i] [j]; + SPC_COPY( int16_t, s ); + m.echo_hist [i] [j] = s; // write back at offset 0 + } + } + m.echo_hist_pos = m.echo_hist; + memcpy( &m.echo_hist [echo_hist_size], m.echo_hist, echo_hist_size * sizeof m.echo_hist [0] ); + + // Misc + SPC_COPY( uint8_t, m.every_other_sample ); + SPC_COPY( uint8_t, m.kon ); + + SPC_COPY( uint16_t, m.noise ); + SPC_COPY( uint16_t, m.counter ); + SPC_COPY( uint16_t, m.echo_offset ); + SPC_COPY( uint16_t, m.echo_length ); + SPC_COPY( uint8_t, m.phase ); + + SPC_COPY( uint8_t, m.new_kon ); + SPC_COPY( uint8_t, m.endx_buf ); + SPC_COPY( uint8_t, m.envx_buf ); + SPC_COPY( uint8_t, m.outx_buf ); + + SPC_COPY( uint8_t, m.t_pmon ); + SPC_COPY( uint8_t, m.t_non ); + SPC_COPY( uint8_t, m.t_eon ); + SPC_COPY( uint8_t, m.t_dir ); + SPC_COPY( uint8_t, m.t_koff ); + + SPC_COPY( uint16_t, m.t_brr_next_addr ); + SPC_COPY( uint8_t, m.t_adsr0 ); + SPC_COPY( uint8_t, m.t_brr_header ); + SPC_COPY( uint8_t, m.t_brr_byte ); + SPC_COPY( uint8_t, m.t_srcn ); + SPC_COPY( uint8_t, m.t_esa ); + SPC_COPY( uint8_t, m.t_echo_enabled ); + + SPC_COPY( int16_t, m.t_main_out [0] ); + SPC_COPY( int16_t, m.t_main_out [1] ); + SPC_COPY( int16_t, m.t_echo_out [0] ); + SPC_COPY( int16_t, m.t_echo_out [1] ); + SPC_COPY( int16_t, m.t_echo_in [0] ); + SPC_COPY( int16_t, m.t_echo_in [1] ); + + SPC_COPY( uint16_t, m.t_dir_addr ); + SPC_COPY( uint16_t, m.t_pitch ); + SPC_COPY( int16_t, m.t_output ); + SPC_COPY( uint16_t, m.t_echo_ptr ); + SPC_COPY( uint8_t, m.t_looped ); + + copier.extra(); +} +#endif diff --git a/waterbox/sameboy/snes_spc/SPC_DSP.h b/waterbox/sameboy/snes_spc/SPC_DSP.h new file mode 100644 index 0000000000..4522ace915 --- /dev/null +++ b/waterbox/sameboy/snes_spc/SPC_DSP.h @@ -0,0 +1,304 @@ +// Highly accurate SNES SPC-700 DSP emulator + +// snes_spc 0.9.0 +#ifndef SPC_DSP_H +#define SPC_DSP_H + +#include "blargg_common.h" + +extern "C" { typedef void (*dsp_copy_func_t)( unsigned char** io, void* state, size_t ); } + +class SPC_DSP { +public: + typedef BOOST::uint8_t uint8_t; + +// Setup + + // Initializes DSP and has it use the 64K RAM provided + void init( void* ram_64k ); + + // Sets destination for output samples. If out is NULL or out_size is 0, + // doesn't generate any. + typedef short sample_t; + void set_output( sample_t* out, int out_size ); + + // Number of samples written to output since it was last set, always + // a multiple of 2. Undefined if more samples were generated than + // output buffer could hold. + int sample_count() const; + +// Emulation + + // Resets DSP to power-on state + void reset(); + + // Emulates pressing reset switch on SNES + void soft_reset(); + + // Reads/writes DSP registers. For accuracy, you must first call run() + // to catch the DSP up to present. + int read ( int addr ) const; + void write( int addr, int data ); + + // Runs DSP for specified number of clocks (~1024000 per second). Every 32 clocks + // a pair of samples is be generated. + void run( int clock_count ); + +// Sound control + + // Mutes voices corresponding to non-zero bits in mask (issues repeated KOFF events). + // Reduces emulation accuracy. + enum { voice_count = 8 }; + void mute_voices( int mask ); + +// State + + // Resets DSP and uses supplied values to initialize registers + enum { register_count = 128 }; + void load( uint8_t const regs [register_count] ); + + // Saves/loads exact emulator state + enum { state_size = 640 }; // maximum space needed when saving + typedef dsp_copy_func_t copy_func_t; + void copy_state( unsigned char** io, copy_func_t ); + + // Returns non-zero if new key-on events occurred since last call + bool check_kon(); + +// DSP register addresses + + // Global registers + enum { + r_mvoll = 0x0C, r_mvolr = 0x1C, + r_evoll = 0x2C, r_evolr = 0x3C, + r_kon = 0x4C, r_koff = 0x5C, + r_flg = 0x6C, r_endx = 0x7C, + r_efb = 0x0D, r_pmon = 0x2D, + r_non = 0x3D, r_eon = 0x4D, + r_dir = 0x5D, r_esa = 0x6D, + r_edl = 0x7D, + r_fir = 0x0F // 8 coefficients at 0x0F, 0x1F ... 0x7F + }; + + // Voice registers + enum { + v_voll = 0x00, v_volr = 0x01, + v_pitchl = 0x02, v_pitchh = 0x03, + v_srcn = 0x04, v_adsr0 = 0x05, + v_adsr1 = 0x06, v_gain = 0x07, + v_envx = 0x08, v_outx = 0x09 + }; + +public: + enum { extra_size = 16 }; + sample_t* extra() { return m.extra; } + sample_t const* out_pos() const { return m.out; } + void disable_surround( bool ) { } // not supported +public: + BLARGG_DISABLE_NOTHROW + + typedef BOOST::int8_t int8_t; + typedef BOOST::int16_t int16_t; + + enum { echo_hist_size = 8 }; + + enum env_mode_t { env_release, env_attack, env_decay, env_sustain }; + enum { brr_buf_size = 12 }; + struct voice_t + { + int buf [brr_buf_size*2];// decoded samples (twice the size to simplify wrap handling) + int buf_pos; // place in buffer where next samples will be decoded + int interp_pos; // relative fractional position in sample (0x1000 = 1.0) + int brr_addr; // address of current BRR block + int brr_offset; // current decoding offset in BRR block + uint8_t* regs; // pointer to voice's DSP registers + int vbit; // bitmask for voice: 0x01 for voice 0, 0x02 for voice 1, etc. + int kon_delay; // KON delay/current setup phase + env_mode_t env_mode; + int env; // current envelope level + int hidden_env; // used by GAIN mode 7, very obscure quirk + uint8_t t_envx_out; + }; +private: + enum { brr_block_size = 9 }; + + struct state_t + { + uint8_t regs [register_count]; + + // Echo history keeps most recent 8 samples (twice the size to simplify wrap handling) + int echo_hist [echo_hist_size * 2] [2]; + int (*echo_hist_pos) [2]; // &echo_hist [0 to 7] + + int every_other_sample; // toggles every sample + int kon; // KON value when last checked + int noise; + int counter; + int echo_offset; // offset from ESA in echo buffer + int echo_length; // number of bytes that echo_offset will stop at + int phase; // next clock cycle to run (0-31) + bool kon_check; // set when a new KON occurs + + // Hidden registers also written to when main register is written to + int new_kon; + uint8_t endx_buf; + uint8_t envx_buf; + uint8_t outx_buf; + + // Temporary state between clocks + + // read once per sample + int t_pmon; + int t_non; + int t_eon; + int t_dir; + int t_koff; + + // read a few clocks ahead then used + int t_brr_next_addr; + int t_adsr0; + int t_brr_header; + int t_brr_byte; + int t_srcn; + int t_esa; + int t_echo_enabled; + + // internal state that is recalculated every sample + int t_dir_addr; + int t_pitch; + int t_output; + int t_looped; + int t_echo_ptr; + + // left/right sums + int t_main_out [2]; + int t_echo_out [2]; + int t_echo_in [2]; + + voice_t voices [voice_count]; + + // non-emulation state + uint8_t* ram; // 64K shared RAM between DSP and SMP + int mute_mask; + sample_t* out; + sample_t* out_end; + sample_t* out_begin; + sample_t extra [extra_size]; + }; + state_t m; + + void init_counter(); + void run_counters(); + unsigned read_counter( int rate ); + + int interpolate( voice_t const* v ); + void run_envelope( voice_t* const v ); + void decode_brr( voice_t* v ); + + void misc_27(); + void misc_28(); + void misc_29(); + void misc_30(); + + void voice_output( voice_t const* v, int ch ); + void voice_V1( voice_t* const ); + void voice_V2( voice_t* const ); + void voice_V3( voice_t* const ); + void voice_V3a( voice_t* const ); + void voice_V3b( voice_t* const ); + void voice_V3c( voice_t* const ); + void voice_V4( voice_t* const ); + void voice_V5( voice_t* const ); + void voice_V6( voice_t* const ); + void voice_V7( voice_t* const ); + void voice_V8( voice_t* const ); + void voice_V9( voice_t* const ); + void voice_V7_V4_V1( voice_t* const ); + void voice_V8_V5_V2( voice_t* const ); + void voice_V9_V6_V3( voice_t* const ); + + void echo_read( int ch ); + int echo_output( int ch ); + void echo_write( int ch ); + void echo_22(); + void echo_23(); + void echo_24(); + void echo_25(); + void echo_26(); + void echo_27(); + void echo_28(); + void echo_29(); + void echo_30(); + + void soft_reset_common(); +}; + +#include + +inline int SPC_DSP::sample_count() const { return m.out - m.out_begin; } + +inline int SPC_DSP::read( int addr ) const +{ + assert( (unsigned) addr < register_count ); + return m.regs [addr]; +} + +inline void SPC_DSP::write( int addr, int data ) +{ + assert( (unsigned) addr < register_count ); + + m.regs [addr] = (uint8_t) data; + switch ( addr & 0x0F ) + { + case v_envx: + m.envx_buf = (uint8_t) data; + break; + + case v_outx: + m.outx_buf = (uint8_t) data; + break; + + case 0x0C: + if ( addr == r_kon ) + m.new_kon = (uint8_t) data; + + if ( addr == r_endx ) // always cleared, regardless of data written + { + m.endx_buf = 0; + m.regs [r_endx] = 0; + } + break; + } +} + +inline void SPC_DSP::mute_voices( int mask ) { m.mute_mask = mask; } + +inline bool SPC_DSP::check_kon() +{ + bool old = m.kon_check; + m.kon_check = 0; + return old; +} + +#if !SPC_NO_COPY_STATE_FUNCS + +class SPC_State_Copier { + SPC_DSP::copy_func_t func; + unsigned char** buf; +public: + SPC_State_Copier( unsigned char** p, SPC_DSP::copy_func_t f ) { func = f; buf = p; } + void copy( void* state, size_t size ); + int copy_int( int state, int size ); + void skip( int count ); + void extra(); +}; + +#define SPC_COPY( type, state )\ +{\ + state = (BOOST::type) copier.copy_int( state, sizeof (BOOST::type) );\ + assert( (BOOST::type) state == state );\ +} + +#endif + +#endif diff --git a/waterbox/sameboy/snes_spc/SPC_Filter.cpp b/waterbox/sameboy/snes_spc/SPC_Filter.cpp new file mode 100644 index 0000000000..b3d5770822 --- /dev/null +++ b/waterbox/sameboy/snes_spc/SPC_Filter.cpp @@ -0,0 +1,68 @@ +// snes_spc 0.9.0. http://www.slack.net/~ant/ + +#include "SPC_Filter.h" + +#include + +/* Copyright (C) 2007 Shay Green. This module is free software; you +can redistribute it and/or modify it under the terms of the GNU Lesser +General Public License as published by the Free Software Foundation; either +version 2.1 of the License, or (at your option) any later version. This +module is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +details. You should have received a copy of the GNU Lesser General Public +License along with this module; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ + +#include "blargg_source.h" + +void SPC_Filter::clear() { memset( ch, 0, sizeof ch ); } + +SPC_Filter::SPC_Filter() +{ + gain = gain_unit; + bass = bass_norm; + clear(); +} + +void SPC_Filter::run( short* io, int count ) +{ + require( (count & 1) == 0 ); // must be even + + int const gain = this->gain; + int const bass = this->bass; + chan_t* c = &ch [2]; + do + { + // cache in registers + int sum = (--c)->sum; + int pp1 = c->pp1; + int p1 = c->p1; + + for ( int i = 0; i < count; i += 2 ) + { + // Low-pass filter (two point FIR with coeffs 0.25, 0.75) + int f = io [i] + p1; + p1 = io [i] * 3; + + // High-pass filter ("leaky integrator") + int delta = f - pp1; + pp1 = f; + int s = sum >> (gain_bits + 2); + sum += (delta * gain) - (sum >> bass); + + // Clamp to 16 bits + if ( (short) s != s ) + s = (s >> 31) ^ 0x7FFF; + + io [i] = (short) s; + } + + c->p1 = p1; + c->pp1 = pp1; + c->sum = sum; + ++io; + } + while ( c != ch ); +} diff --git a/waterbox/sameboy/snes_spc/SPC_Filter.h b/waterbox/sameboy/snes_spc/SPC_Filter.h new file mode 100644 index 0000000000..d5c83cb8f1 --- /dev/null +++ b/waterbox/sameboy/snes_spc/SPC_Filter.h @@ -0,0 +1,47 @@ +// Simple low-pass and high-pass filter to better match sound output of a SNES + +// snes_spc 0.9.0 +#ifndef SPC_FILTER_H +#define SPC_FILTER_H + +#include "blargg_common.h" + +struct SPC_Filter { +public: + + // Filters count samples of stereo sound in place. Count must be a multiple of 2. + typedef short sample_t; + void run( sample_t* io, int count ); + +// Optional features + + // Clears filter to silence + void clear(); + + // Sets gain (volume), where gain_unit is normal. Gains greater than gain_unit + // are fine, since output is clamped to 16-bit sample range. + enum { gain_unit = 0x100 }; + void set_gain( int gain ); + + // Sets amount of bass (logarithmic scale) + enum { bass_none = 0 }; + enum { bass_norm = 8 }; // normal amount + enum { bass_max = 31 }; + void set_bass( int bass ); + +public: + SPC_Filter(); + BLARGG_DISABLE_NOTHROW +private: + enum { gain_bits = 8 }; + int gain; + int bass; + struct chan_t { int p1, pp1, sum; }; + chan_t ch [2]; +}; + +inline void SPC_Filter::set_gain( int g ) { gain = g; } + +inline void SPC_Filter::set_bass( int b ) { bass = b; } + +#endif diff --git a/waterbox/sameboy/snes_spc/blargg_common.h b/waterbox/sameboy/snes_spc/blargg_common.h new file mode 100644 index 0000000000..75edff3914 --- /dev/null +++ b/waterbox/sameboy/snes_spc/blargg_common.h @@ -0,0 +1,186 @@ +// Sets up common environment for Shay Green's libraries. +// To change configuration options, modify blargg_config.h, not this file. + +// snes_spc 0.9.0 +#ifndef BLARGG_COMMON_H +#define BLARGG_COMMON_H + +#include +#include +#include +#include + +#undef BLARGG_COMMON_H +// allow blargg_config.h to #include blargg_common.h +#include "blargg_config.h" +#ifndef BLARGG_COMMON_H +#define BLARGG_COMMON_H + +// BLARGG_RESTRICT: equivalent to restrict, where supported +#if defined (__GNUC__) || _MSC_VER >= 1100 + #define BLARGG_RESTRICT __restrict +#else + #define BLARGG_RESTRICT +#endif + +// STATIC_CAST(T,expr): Used in place of static_cast (expr) +#ifndef STATIC_CAST + #define STATIC_CAST(T,expr) ((T) (expr)) +#endif + +// blargg_err_t (0 on success, otherwise error string) +#ifndef blargg_err_t + typedef const char* blargg_err_t; +#endif + +// blargg_vector - very lightweight vector of POD types (no constructor/destructor) +template +class blargg_vector { + T* begin_; + size_t size_; +public: + blargg_vector() : begin_( 0 ), size_( 0 ) { } + ~blargg_vector() { free( begin_ ); } + size_t size() const { return size_; } + T* begin() const { return begin_; } + T* end() const { return begin_ + size_; } + blargg_err_t resize( size_t n ) + { + // TODO: blargg_common.cpp to hold this as an outline function, ugh + void* p = realloc( begin_, n * sizeof (T) ); + if ( p ) + begin_ = (T*) p; + else if ( n > size_ ) // realloc failure only a problem if expanding + return "Out of memory"; + size_ = n; + return 0; + } + void clear() { void* p = begin_; begin_ = 0; size_ = 0; free( p ); } + T& operator [] ( size_t n ) const + { + assert( n <= size_ ); // <= to allow past-the-end value + return begin_ [n]; + } +}; + +#ifndef BLARGG_DISABLE_NOTHROW + // throw spec mandatory in ISO C++ if operator new can return NULL + #if __cplusplus >= 199711 || defined (__GNUC__) + #define BLARGG_THROWS( spec ) throw spec + #else + #define BLARGG_THROWS( spec ) + #endif + #define BLARGG_DISABLE_NOTHROW \ + void* operator new ( size_t s ) BLARGG_THROWS(()) { return malloc( s ); }\ + void operator delete ( void* p ) { free( p ); } + #define BLARGG_NEW new +#else + #include + #define BLARGG_NEW new (std::nothrow) +#endif + +// BLARGG_4CHAR('a','b','c','d') = 'abcd' (four character integer constant) +#define BLARGG_4CHAR( a, b, c, d ) \ + ((a&0xFF)*0x1000000L + (b&0xFF)*0x10000L + (c&0xFF)*0x100L + (d&0xFF)) + +// BOOST_STATIC_ASSERT( expr ): Generates compile error if expr is 0. +#ifndef BOOST_STATIC_ASSERT + #ifdef _MSC_VER + // MSVC6 (_MSC_VER < 1300) fails for use of __LINE__ when /Zl is specified + #define BOOST_STATIC_ASSERT( expr ) \ + void blargg_failed_( int (*arg) [2 / (int) !!(expr) - 1] ) + #else + // Some other compilers fail when declaring same function multiple times in class, + // so differentiate them by line + #define BOOST_STATIC_ASSERT( expr ) \ + void blargg_failed_( int (*arg) [2 / !!(expr) - 1] [__LINE__] ) + #endif +#endif + +// BLARGG_COMPILER_HAS_BOOL: If 0, provides bool support for old compiler. If 1, +// compiler is assumed to support bool. If undefined, availability is determined. +#ifndef BLARGG_COMPILER_HAS_BOOL + #if defined (__MWERKS__) + #if !__option(bool) + #define BLARGG_COMPILER_HAS_BOOL 0 + #endif + #elif defined (_MSC_VER) + #if _MSC_VER < 1100 + #define BLARGG_COMPILER_HAS_BOOL 0 + #endif + #elif defined (__GNUC__) + // supports bool + #elif __cplusplus < 199711 + #define BLARGG_COMPILER_HAS_BOOL 0 + #endif +#endif +#if defined (BLARGG_COMPILER_HAS_BOOL) && !BLARGG_COMPILER_HAS_BOOL + // If you get errors here, modify your blargg_config.h file + typedef int bool; + const bool true = 1; + const bool false = 0; +#endif + +// blargg_long/blargg_ulong = at least 32 bits, int if it's big enough + +#if INT_MAX < 0x7FFFFFFF || LONG_MAX == 0x7FFFFFFF + typedef long blargg_long; +#else + typedef int blargg_long; +#endif + +#if UINT_MAX < 0xFFFFFFFF || ULONG_MAX == 0xFFFFFFFF + typedef unsigned long blargg_ulong; +#else + typedef unsigned blargg_ulong; +#endif + +// BOOST::int8_t etc. + +// HAVE_STDINT_H: If defined, use for int8_t etc. +#if defined (HAVE_STDINT_H) + #include + #define BOOST + +// HAVE_INTTYPES_H: If defined, use for int8_t etc. +#elif defined (HAVE_INTTYPES_H) + #include + #define BOOST + +#else + struct BOOST + { + #if UCHAR_MAX == 0xFF && SCHAR_MAX == 0x7F + typedef signed char int8_t; + typedef unsigned char uint8_t; + #else + // No suitable 8-bit type available + typedef struct see_blargg_common_h int8_t; + typedef struct see_blargg_common_h uint8_t; + #endif + + #if USHRT_MAX == 0xFFFF + typedef short int16_t; + typedef unsigned short uint16_t; + #else + // No suitable 16-bit type available + typedef struct see_blargg_common_h int16_t; + typedef struct see_blargg_common_h uint16_t; + #endif + + #if ULONG_MAX == 0xFFFFFFFF + typedef long int32_t; + typedef unsigned long uint32_t; + #elif UINT_MAX == 0xFFFFFFFF + typedef int int32_t; + typedef unsigned int uint32_t; + #else + // No suitable 32-bit type available + typedef struct see_blargg_common_h int32_t; + typedef struct see_blargg_common_h uint32_t; + #endif + }; +#endif + +#endif +#endif diff --git a/waterbox/sameboy/snes_spc/blargg_config.h b/waterbox/sameboy/snes_spc/blargg_config.h new file mode 100644 index 0000000000..9dc69db836 --- /dev/null +++ b/waterbox/sameboy/snes_spc/blargg_config.h @@ -0,0 +1,24 @@ +// snes_spc 0.9.0 user configuration file. Don't replace when updating library. + +// snes_spc 0.9.0 +#ifndef BLARGG_CONFIG_H +#define BLARGG_CONFIG_H + +// Uncomment to disable debugging checks +//#define NDEBUG 1 + +// Uncomment to enable platform-specific (and possibly non-portable) optimizations +//#define BLARGG_NONPORTABLE 1 + +// Uncomment if automatic byte-order determination doesn't work +//#define BLARGG_BIG_ENDIAN 1 + +// Uncomment if you get errors in the bool section of blargg_common.h +//#define BLARGG_COMPILER_HAS_BOOL 1 + +// Use standard config.h if present +#ifdef HAVE_CONFIG_H + #include "config.h" +#endif + +#endif diff --git a/waterbox/sameboy/snes_spc/blargg_endian.h b/waterbox/sameboy/snes_spc/blargg_endian.h new file mode 100644 index 0000000000..f2daca6416 --- /dev/null +++ b/waterbox/sameboy/snes_spc/blargg_endian.h @@ -0,0 +1,185 @@ +// CPU Byte Order Utilities + +// snes_spc 0.9.0 +#ifndef BLARGG_ENDIAN +#define BLARGG_ENDIAN + +#include "blargg_common.h" + +// BLARGG_CPU_CISC: Defined if CPU has very few general-purpose registers (< 16) +#if defined (_M_IX86) || defined (_M_IA64) || defined (__i486__) || \ + defined (__x86_64__) || defined (__ia64__) || defined (__i386__) + #define BLARGG_CPU_X86 1 + #define BLARGG_CPU_CISC 1 +#endif + +#if defined (__powerpc__) || defined (__ppc__) || defined (__POWERPC__) || defined (__powerc) + #define BLARGG_CPU_POWERPC 1 + #define BLARGG_CPU_RISC 1 +#endif + +// BLARGG_BIG_ENDIAN, BLARGG_LITTLE_ENDIAN: Determined automatically, otherwise only +// one may be #defined to 1. Only needed if something actually depends on byte order. +#if !defined (BLARGG_BIG_ENDIAN) && !defined (BLARGG_LITTLE_ENDIAN) +#ifdef __GLIBC__ + // GCC handles this for us + #include + #if __BYTE_ORDER == __LITTLE_ENDIAN + #define BLARGG_LITTLE_ENDIAN 1 + #elif __BYTE_ORDER == __BIG_ENDIAN + #define BLARGG_BIG_ENDIAN 1 + #endif +#else + +#if defined (LSB_FIRST) || defined (__LITTLE_ENDIAN__) || BLARGG_CPU_X86 || \ + (defined (LITTLE_ENDIAN) && LITTLE_ENDIAN+0 != 1234) + #define BLARGG_LITTLE_ENDIAN 1 +#endif + +#if defined (MSB_FIRST) || defined (__BIG_ENDIAN__) || defined (WORDS_BIGENDIAN) || \ + defined (__sparc__) || BLARGG_CPU_POWERPC || \ + (defined (BIG_ENDIAN) && BIG_ENDIAN+0 != 4321) + #define BLARGG_BIG_ENDIAN 1 +#elif !defined (__mips__) + // No endian specified; assume little-endian, since it's most common + #define BLARGG_LITTLE_ENDIAN 1 +#endif +#endif +#endif + +#if BLARGG_LITTLE_ENDIAN && BLARGG_BIG_ENDIAN + #undef BLARGG_LITTLE_ENDIAN + #undef BLARGG_BIG_ENDIAN +#endif + +inline void blargg_verify_byte_order() +{ + #ifndef NDEBUG + #if BLARGG_BIG_ENDIAN + volatile int i = 1; + assert( *(volatile char*) &i == 0 ); + #elif BLARGG_LITTLE_ENDIAN + volatile int i = 1; + assert( *(volatile char*) &i != 0 ); + #endif + #endif +} + +inline unsigned get_le16( void const* p ) +{ + return (unsigned) ((unsigned char const*) p) [1] << 8 | + (unsigned) ((unsigned char const*) p) [0]; +} + +inline unsigned get_be16( void const* p ) +{ + return (unsigned) ((unsigned char const*) p) [0] << 8 | + (unsigned) ((unsigned char const*) p) [1]; +} + +inline blargg_ulong get_le32( void const* p ) +{ + return (blargg_ulong) ((unsigned char const*) p) [3] << 24 | + (blargg_ulong) ((unsigned char const*) p) [2] << 16 | + (blargg_ulong) ((unsigned char const*) p) [1] << 8 | + (blargg_ulong) ((unsigned char const*) p) [0]; +} + +inline blargg_ulong get_be32( void const* p ) +{ + return (blargg_ulong) ((unsigned char const*) p) [0] << 24 | + (blargg_ulong) ((unsigned char const*) p) [1] << 16 | + (blargg_ulong) ((unsigned char const*) p) [2] << 8 | + (blargg_ulong) ((unsigned char const*) p) [3]; +} + +inline void set_le16( void* p, unsigned n ) +{ + ((unsigned char*) p) [1] = (unsigned char) (n >> 8); + ((unsigned char*) p) [0] = (unsigned char) n; +} + +inline void set_be16( void* p, unsigned n ) +{ + ((unsigned char*) p) [0] = (unsigned char) (n >> 8); + ((unsigned char*) p) [1] = (unsigned char) n; +} + +inline void set_le32( void* p, blargg_ulong n ) +{ + ((unsigned char*) p) [0] = (unsigned char) n; + ((unsigned char*) p) [1] = (unsigned char) (n >> 8); + ((unsigned char*) p) [2] = (unsigned char) (n >> 16); + ((unsigned char*) p) [3] = (unsigned char) (n >> 24); +} + +inline void set_be32( void* p, blargg_ulong n ) +{ + ((unsigned char*) p) [3] = (unsigned char) n; + ((unsigned char*) p) [2] = (unsigned char) (n >> 8); + ((unsigned char*) p) [1] = (unsigned char) (n >> 16); + ((unsigned char*) p) [0] = (unsigned char) (n >> 24); +} + +#if BLARGG_NONPORTABLE + // Optimized implementation if byte order is known + #if BLARGG_LITTLE_ENDIAN + #define GET_LE16( addr ) (*(BOOST::uint16_t*) (addr)) + #define GET_LE32( addr ) (*(BOOST::uint32_t*) (addr)) + #define SET_LE16( addr, data ) (void) (*(BOOST::uint16_t*) (addr) = (data)) + #define SET_LE32( addr, data ) (void) (*(BOOST::uint32_t*) (addr) = (data)) + #elif BLARGG_BIG_ENDIAN + #define GET_BE16( addr ) (*(BOOST::uint16_t*) (addr)) + #define GET_BE32( addr ) (*(BOOST::uint32_t*) (addr)) + #define SET_BE16( addr, data ) (void) (*(BOOST::uint16_t*) (addr) = (data)) + #define SET_BE32( addr, data ) (void) (*(BOOST::uint32_t*) (addr) = (data)) + + #if BLARGG_CPU_POWERPC + // PowerPC has special byte-reversed instructions + #if defined (__MWERKS__) + #define GET_LE16( addr ) (__lhbrx( addr, 0 )) + #define GET_LE32( addr ) (__lwbrx( addr, 0 )) + #define SET_LE16( addr, in ) (__sthbrx( in, addr, 0 )) + #define SET_LE32( addr, in ) (__stwbrx( in, addr, 0 )) + #elif defined (__GNUC__) + #define GET_LE16( addr ) ({unsigned ppc_lhbrx_; asm( "lhbrx %0,0,%1" : "=r" (ppc_lhbrx_) : "r" (addr), "0" (ppc_lhbrx_) ); ppc_lhbrx_;}) + #define GET_LE32( addr ) ({unsigned ppc_lwbrx_; asm( "lwbrx %0,0,%1" : "=r" (ppc_lwbrx_) : "r" (addr), "0" (ppc_lwbrx_) ); ppc_lwbrx_;}) + #define SET_LE16( addr, in ) ({asm( "sthbrx %0,0,%1" : : "r" (in), "r" (addr) );}) + #define SET_LE32( addr, in ) ({asm( "stwbrx %0,0,%1" : : "r" (in), "r" (addr) );}) + #endif + #endif + #endif +#endif + +#ifndef GET_LE16 + #define GET_LE16( addr ) get_le16( addr ) + #define SET_LE16( addr, data ) set_le16( addr, data ) +#endif + +#ifndef GET_LE32 + #define GET_LE32( addr ) get_le32( addr ) + #define SET_LE32( addr, data ) set_le32( addr, data ) +#endif + +#ifndef GET_BE16 + #define GET_BE16( addr ) get_be16( addr ) + #define SET_BE16( addr, data ) set_be16( addr, data ) +#endif + +#ifndef GET_BE32 + #define GET_BE32( addr ) get_be32( addr ) + #define SET_BE32( addr, data ) set_be32( addr, data ) +#endif + +// auto-selecting versions + +inline void set_le( BOOST::uint16_t* p, unsigned n ) { SET_LE16( p, n ); } +inline void set_le( BOOST::uint32_t* p, blargg_ulong n ) { SET_LE32( p, n ); } +inline void set_be( BOOST::uint16_t* p, unsigned n ) { SET_BE16( p, n ); } +inline void set_be( BOOST::uint32_t* p, blargg_ulong n ) { SET_BE32( p, n ); } +inline unsigned get_le( BOOST::uint16_t* p ) { return GET_LE16( p ); } +inline blargg_ulong get_le( BOOST::uint32_t* p ) { return GET_LE32( p ); } +inline unsigned get_be( BOOST::uint16_t* p ) { return GET_BE16( p ); } +inline blargg_ulong get_be( BOOST::uint32_t* p ) { return GET_BE32( p ); } + +#endif diff --git a/waterbox/sameboy/snes_spc/blargg_source.h b/waterbox/sameboy/snes_spc/blargg_source.h new file mode 100644 index 0000000000..5e45c4fb42 --- /dev/null +++ b/waterbox/sameboy/snes_spc/blargg_source.h @@ -0,0 +1,100 @@ +/* Included at the beginning of library source files, after all other #include lines. +Sets up helpful macros and services used in my source code. They don't need +module an annoying module prefix on their names since they are defined after +all other #include lines. */ + +// snes_spc 0.9.0 +#ifndef BLARGG_SOURCE_H +#define BLARGG_SOURCE_H + +// If debugging is enabled, abort program if expr is false. Meant for checking +// internal state and consistency. A failed assertion indicates a bug in the module. +// void assert( bool expr ); +#include + +// If debugging is enabled and expr is false, abort program. Meant for checking +// caller-supplied parameters and operations that are outside the control of the +// module. A failed requirement indicates a bug outside the module. +// void require( bool expr ); +#undef require +#define require( expr ) assert( expr ) + +// Like printf() except output goes to debug log file. Might be defined to do +// nothing (not even evaluate its arguments). +// void dprintf( const char* format, ... ); +static inline void blargg_dprintf_( const char*, ... ) { } +#undef dprintf +#define dprintf (1) ? (void) 0 : blargg_dprintf_ + +// If enabled, evaluate expr and if false, make debug log entry with source file +// and line. Meant for finding situations that should be examined further, but that +// don't indicate a problem. In all cases, execution continues normally. +#undef check +#define check( expr ) ((void) 0) + +// If expr yields error string, return it from current function, otherwise continue. +#undef RETURN_ERR +#define RETURN_ERR( expr ) do { \ + blargg_err_t blargg_return_err_ = (expr); \ + if ( blargg_return_err_ ) return blargg_return_err_; \ + } while ( 0 ) + +// If ptr is 0, return out of memory error string. +#undef CHECK_ALLOC +#define CHECK_ALLOC( ptr ) do { if ( (ptr) == 0 ) return "Out of memory"; } while ( 0 ) + +// Avoid any macros which evaluate their arguments multiple times +#undef min +#undef max + +#define DEF_MIN_MAX( type ) \ + static inline type min( type x, type y ) { if ( x < y ) return x; return y; }\ + static inline type max( type x, type y ) { if ( y < x ) return x; return y; } + +DEF_MIN_MAX( int ) +DEF_MIN_MAX( unsigned ) +DEF_MIN_MAX( long ) +DEF_MIN_MAX( unsigned long ) +DEF_MIN_MAX( float ) +DEF_MIN_MAX( double ) + +#undef DEF_MIN_MAX + +/* +// using const references generates crappy code, and I am currenly only using these +// for built-in types, so they take arguments by value + +// TODO: remove +inline int min( int x, int y ) +template +inline T min( T x, T y ) +{ + if ( x < y ) + return x; + return y; +} + +template +inline T max( T x, T y ) +{ + if ( x < y ) + return y; + return x; +} +*/ + +// TODO: good idea? bad idea? +#undef byte +#define byte byte_ +typedef unsigned char byte; + +// deprecated +#define BLARGG_CHECK_ALLOC CHECK_ALLOC +#define BLARGG_RETURN_ERR RETURN_ERR + +// BLARGG_SOURCE_BEGIN: If defined, #included, allowing redefition of dprintf and check +#ifdef BLARGG_SOURCE_BEGIN + #include BLARGG_SOURCE_BEGIN +#endif + +#endif diff --git a/waterbox/sameboy/snes_spc/changes.txt b/waterbox/sameboy/snes_spc/changes.txt new file mode 100644 index 0000000000..33661832b4 --- /dev/null +++ b/waterbox/sameboy/snes_spc/changes.txt @@ -0,0 +1,107 @@ +snes_spc Change Log +------------------- + +snes_spc 0.9.0 +-------------- +- Improved documentation + +- SPC: Added spc_skip() function for quickly seeking in an SPC music +file. Runs 3-4x faster than normal playback using the fast DSP (or about +43-60X real-time on my 400 MHz Mac). + +- SPC: Added spc_set_tempo() to change tempo of SPC music playback. + +- SPC: Sample generation is now corrected to generate exactly one pair +of samples every 32 clocks without exception. Before it could generate a +few samples more or less depending on how far ahead or behind DSP was at +the moment. + +- SPC: Changed spc_reset() and spc_soft_reset() to also reset output +buffer (see spc.h). + +- SPC: Fixed minor timer counting bug. + +- SPC: Stack pointer wrap-around is now emulated (and without any +noticeable performance hit). + +- SPC: Runs about 5% faster due to various optimizations. + +- SPC: Found way to make fast DSP register accesses cycle-accurate in +most cases, without reducing performance. Allows fast DSP to pass most +of my validation tests. + +- DSP: Added surround disable support to fast DSP again. + +- DSP: Improved voice un-muting to take effect immediately on fast DSP. + +- DSP: Noise shift register now starts at 0x4000 instead of 0x4001 as it +incorrectly did before. + +- Converted library to C++ code internally. A C interface is still +included in spc.h and dsp.h. Note that these are different than the +previous interface, so your code will require minor changes: + + Old SPC code New SPC code + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + #include "spc/spc.h" #include "snes_spc/spc.h" + + snes_spc_t* spc; SNES_SPC* spc; + spc = malloc( sizeof (snes_spc_t) ); spc = spc_new(); + spc_init( spc ); + + spc_end_frame( time ); spc_end_frame( spc, time ); + /* etc. */ + + /* done using SPC */ spc_delete( spc ); + + + Old DSP code New DSP code + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + #include "spc/spc_dsp.h" #include "snes_spc/dsp.h" + + spc_dsp_init( ram ); SPC_DSP* dsp; + dsp = spc_dsp_new(); + spc_dsp_init( dsp, ram ); + + spc_dsp_run( count ); spc_dsp_run( dsp, count ); + /* etc. */ + + /* done using DSP */ spc_dsp_delete( dsp ); + + +snes_spc 0.8.0 +-------------- +- Added several demos + +- Added high-pass/low-pass filter to better match SNES sound + +- Added save state functionality for SPC and accurate DSP (but not fast +DSP) + +- Added emulation of reset switch on NES (soft reset) + +- Made source more compatible with pre-C99 compilers by eliminating +mid-block declarations + +- SPC: Many S-SMP accuracy improvements, mostly in memory access times + +- SPC: S-SMP speed improvements + +- SPC: Added SPC load/save functions and KON checking to help trim +silence from beginning + +- SPC: Changed spc_init() to have you allocate most of the memory used +by the library so you have more control over it + +- DSP: New highly accurate DSP and faster version derived from same code + +- DSP: Changed prefix from dsp_ to spc_dsp_. Your DSP code will require +changes. + +- DSP: Removed surround disable and gain. Gain can now be done with the +dsp_filter module, and surround disable will probably only be +implemented in the fast DSP at some point. + +- DSP: Changed interface to work in clocks rather than samples, +necessary for the new accurate DSP. Sample output is now done with +separate functions. Your DSP code will require changes. diff --git a/waterbox/sameboy/snes_spc/dsp.cpp b/waterbox/sameboy/snes_spc/dsp.cpp new file mode 100644 index 0000000000..99d0cf5c5e --- /dev/null +++ b/waterbox/sameboy/snes_spc/dsp.cpp @@ -0,0 +1,48 @@ +// snes_spc 0.9.0. http://www.slack.net/~ant/ + +#include "dsp.h" + +#include "SPC_DSP.h" + +/* Copyright (C) 2007 Shay Green. This module is free software; you +can redistribute it and/or modify it under the terms of the GNU Lesser +General Public License as published by the Free Software Foundation; either +version 2.1 of the License, or (at your option) any later version. This +module is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +details. You should have received a copy of the GNU Lesser General Public +License along with this module; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ + +#include "blargg_source.h" + +SPC_DSP* spc_dsp_new( void ) +{ + // be sure constants match + assert( spc_dsp_voice_count == (int) SPC_DSP::voice_count ); + assert( spc_dsp_register_count == (int) SPC_DSP::register_count ); + #if !SPC_NO_COPY_STATE_FUNCS + assert( spc_dsp_state_size == (int) SPC_DSP::state_size ); + #endif + + return new SPC_DSP; +} + +void spc_dsp_delete ( SPC_DSP* s ) { delete s; } +void spc_dsp_init ( SPC_DSP* s, void* ram_64k ) { s->init( ram_64k ); } +void spc_dsp_set_output ( SPC_DSP* s, spc_dsp_sample_t* p, int n ) { s->set_output( p, n ); } +int spc_dsp_sample_count( SPC_DSP const* s ) { return s->sample_count(); } +void spc_dsp_reset ( SPC_DSP* s ) { s->reset(); } +void spc_dsp_soft_reset ( SPC_DSP* s ) { s->soft_reset(); } +int spc_dsp_read ( SPC_DSP const* s, int addr ) { return s->read( addr ); } +void spc_dsp_write ( SPC_DSP* s, int addr, int data ) { s->write( addr, data ); } +void spc_dsp_run ( SPC_DSP* s, int clock_count ) { s->run( clock_count ); } +void spc_dsp_mute_voices ( SPC_DSP* s, int mask ) { s->mute_voices( mask ); } +void spc_dsp_disable_surround( SPC_DSP* s, int disable ) { s->disable_surround( disable ); } +void spc_dsp_load ( SPC_DSP* s, unsigned char const regs [spc_dsp_register_count] ) { s->load( regs ); } + +#if !SPC_NO_COPY_STATE_FUNCS +void spc_dsp_copy_state ( SPC_DSP* s, unsigned char** p, spc_dsp_copy_func_t f ) { s->copy_state( p, f ); } +int spc_dsp_check_kon ( SPC_DSP* s ) { return s->check_kon(); } +#endif diff --git a/waterbox/sameboy/snes_spc/dsp.h b/waterbox/sameboy/snes_spc/dsp.h new file mode 100644 index 0000000000..59867d92f9 --- /dev/null +++ b/waterbox/sameboy/snes_spc/dsp.h @@ -0,0 +1,83 @@ +/* SNES SPC-700 DSP emulator C interface (also usable from C++) */ + +/* snes_spc 0.9.0 */ +#ifndef DSP_H +#define DSP_H + +#include + +#ifdef __cplusplus + extern "C" { +#endif + +typedef struct SPC_DSP SPC_DSP; + +/* Creates new DSP emulator. NULL if out of memory. */ +SPC_DSP* spc_dsp_new( void ); + +/* Frees DSP emulator */ +void spc_dsp_delete( SPC_DSP* ); + +/* Initializes DSP and has it use the 64K RAM provided */ +void spc_dsp_init( SPC_DSP*, void* ram_64k ); + +/* Sets destination for output samples. If out is NULL or out_size is 0, +doesn't generate any. */ +typedef short spc_dsp_sample_t; +void spc_dsp_set_output( SPC_DSP*, spc_dsp_sample_t* out, int out_size ); + +/* Number of samples written to output since it was last set, always +a multiple of 2. Undefined if more samples were generated than +output buffer could hold. */ +int spc_dsp_sample_count( SPC_DSP const* ); + + +/**** Emulation *****/ + +/* Resets DSP to power-on state */ +void spc_dsp_reset( SPC_DSP* ); + +/* Emulates pressing reset switch on SNES */ +void spc_dsp_soft_reset( SPC_DSP* ); + +/* Reads/writes DSP registers. For accuracy, you must first call spc_dsp_run() */ +/* to catch the DSP up to present. */ +int spc_dsp_read ( SPC_DSP const*, int addr ); +void spc_dsp_write( SPC_DSP*, int addr, int data ); + +/* Runs DSP for specified number of clocks (~1024000 per second). Every 32 clocks */ +/* a pair of samples is be generated. */ +void spc_dsp_run( SPC_DSP*, int clock_count ); + + +/**** Sound control *****/ + +/* Mutes voices corresponding to non-zero bits in mask. Reduces emulation accuracy. */ +enum { spc_dsp_voice_count = 8 }; +void spc_dsp_mute_voices( SPC_DSP*, int mask ); + +/* If true, prevents channels and global volumes from being phase-negated. +Only supported by fast DSP; has no effect on accurate DSP. */ +void spc_dsp_disable_surround( SPC_DSP*, int disable ); + + +/**** State save/load *****/ + +/* Resets DSP and uses supplied values to initialize registers */ +enum { spc_dsp_register_count = 128 }; +void spc_dsp_load( SPC_DSP*, unsigned char const regs [spc_dsp_register_count] ); + +/* Saves/loads exact emulator state (accurate DSP only) */ +enum { spc_dsp_state_size = 640 }; /* maximum space needed when saving */ +typedef void (*spc_dsp_copy_func_t)( unsigned char** io, void* state, size_t ); +void spc_dsp_copy_state( SPC_DSP*, unsigned char** io, spc_dsp_copy_func_t ); + +/* Returns non-zero if new key-on events occurred since last call (accurate DSP only) */ +int spc_dsp_check_kon( SPC_DSP* ); + + +#ifdef __cplusplus + } +#endif + +#endif diff --git a/waterbox/sameboy/snes_spc/license.txt b/waterbox/sameboy/snes_spc/license.txt new file mode 100644 index 0000000000..5faba9d48c --- /dev/null +++ b/waterbox/sameboy/snes_spc/license.txt @@ -0,0 +1,504 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! + + diff --git a/waterbox/sameboy/snes_spc/readme.txt b/waterbox/sameboy/snes_spc/readme.txt new file mode 100644 index 0000000000..979913f0ac --- /dev/null +++ b/waterbox/sameboy/snes_spc/readme.txt @@ -0,0 +1,86 @@ +snes_spc 0.9.0: SNES SPC-700 APU Emulator +----------------------------------------- +This library includes a full SPC emulator and an S-DSP emulator that can +be used on its own. Two S-DSP emulators are available: a highly accurate +one for use in a SNES emulator, and a 3x faster one for use in an SPC +music player or a resource-limited SNES emulator. + +* Can be used from C and C++ code +* Full SPC-700 APU emulator with cycle accuracy in most cases +* Loads, plays, and saves SPC music files +* Can save and load exact full emulator state +* DSP voice muting, surround sound disable, and song tempo adjustment +* Uses 7% CPU average on 400 MHz Mac to play an SPC using fast DSP + +The accurate DSP emulator is based on past research by others and +hundreds of hours of recent research by me. It passes over a hundred +strenuous timing and behavior validation tests that were also run on the +SNES. As far as I know, it's the first DSP emulator with cycle accuracy, +properly emulating every DSP register and memory access at the exact SPC +cycle it occurs at, whereas previous DSP emulators emulated these only +to the nearest sample (which occurs every 32 clocks). + +Author : Shay Green +Website: http://www.slack.net/~ant/ +Forum : http://groups.google.com/group/blargg-sound-libs +License: GNU Lesser General Public License (LGPL) + + +Getting Started +--------------- +Build a program consisting of demo/play_spc.c, demo/demo_util.c, +demo/wave_writer.c, and all source files in snes_spc/. Put an SPC music +file in the same directory and name it "test.spc". Running the program +should generate the recording "out.wav". + +Read snes_spc.txt for more information. Post to the discussion forum for +assistance. + + +Files +----- +snes_spc.txt Documentation +changes.txt Change log +license.txt GNU LGPL license + +demo/ + play_spc.c Records SPC file to wave sound file + benchmark.c Finds how fast emulator runs on your computer + trim_spc.c Trims silence off beginning of an SPC file + save_state.c Saves/loads exact emulator state to/from file + comm.c Communicates with SPC how SNES would + demo_util.h General utility functions used by demos + demo_util.c + wave_writer.h WAVE sound file writer used for demo output + wave_writer.c + +fast_dsp/ Optional standalone fast DSP emulator + SPC_DSP.h To use with full SPC emulator, move into + SPC_DSP.cpp snes_spc/ and replace original files + +snes_spc/ Library sources + blargg_config.h Configuration (modify as necessary) + + spc.h C interface to SPC emulator and sound filter + spc.cpp + + SPC_Filter.h Optional filter to make sound more authentic + SPC_Filter.cpp + + SNES_SPC.h Full SPC emulator + SNES_SPC.cpp + SNES_SPC_misc.cpp + SNES_SPC_state.cpp + SPC_CPU.h + + dsp.h C interface to DSP emulator + dsp.cpp + + SPC_DSP.h Standalone accurate DSP emulator + SPC_DSP.cpp + blargg_common.h + blargg_endian.h + blargg_source.h + +-- +Shay Green diff --git a/waterbox/sameboy/snes_spc/snes_spc.txt b/waterbox/sameboy/snes_spc/snes_spc.txt new file mode 100644 index 0000000000..d37b34347f --- /dev/null +++ b/waterbox/sameboy/snes_spc/snes_spc.txt @@ -0,0 +1,318 @@ +snes_spc 0.9.0: SNES SPC-700 APU Emulator +----------------------------------------- +Author : Shay Green +Website: http://www.slack.net/~ant/ +Forum : http://groups.google.com/group/blargg-sound-libs +License: GNU Lesser General Public License (LGPL) + + +Contents +-------- +* C and C++ Interfaces +* Overview +* Full SPC Emulation +* DSP Emulation +* SPC Music Playback +* State Copying +* Library Compilation +* Error handling +* Solving Problems +* Accurate S-DSP Limitations +* Fast S-DSP Limitations +* S-SMP Limitations +* To Do +* Thanks + + +C and C++ Interfaces +-------------------- +The library includes a C interface in spc.h and dsp.h, which can be used +from C and C++. This C interface is referred to in the following +documentation. If you're building this as a shared library (rather than +linking statically), you should use the C interface since it will change +less in future versions. + +The native C++ interface is in the header files SNES_SPC.h, SPC_DSP.h, +and SPC_Filter.h, and the two interfaces can be freely mixed in C++ +code. Conversion between the two interfaces generally follows a pattern: + + C interface C++ interface + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + SNES_SPC* spc; SNES_SPC* spc; + + spc = spc_new(); spc = new SNES_SPC; + + spc_play( spc, count, buf ); spc->play( count, buf ); + + spc_sample_rate SNES_SPC::sample_rate + + spc_delete( spc ); delete spc; + + +Overview +-------- +There are three main roles for this library: +* Full SPC emulation in a SNES emulator +* DSP emulation in a SNES emulator (where you emulate the SMP CPU) +* SPC playback in an SPC music file player + +Each of these uses are described separately below. + + +Full SPC Emulation +------------------ +See spc.h for full function reference (SNES_SPC.h if using C++). + +* Create SPC emulator with spc_new() and check for NULL. + +* Call spc_init_rom() with a pointer to the 64-byte IPL ROM dump (not +included with library). + +* When your emulated SNES is powered on, call spc_reset(). When the +reset switch is pressed, call spc_soft_reset(). + +* Call spc_set_output() with your output buffer, then do emulation. + +* When the SNES CPU accesses APU ports, call spc_read_port() and +spc_write_port(). + +* When your emulator's timebase is going back to 0, call +spc_end_frame(), usually at the end of a video frame or scanline. + +* Periodically play samples from your buffer. Use spc_sample_count() to +find out how many samples have been written, then spc_set_output() after +you've made more space in your buffer. + +* Save/load full emulator state with spc_copy_state(). + +* You can save as an SPC music file with spc_save_spc(). + +* When done, use spc_delete() to free memory. + + +DSP Emulation +------------- +See dsp.h for full function reference (SPC_DSP.h if using C++). + +* Create DSP emulator with spc_dsp_new() and check for NULL. + +* Let the DSP know where your 64K RAM is with spc_dsp_init(). + +* When your emulated SNES is powered on, call spc_dsp_reset(). When the +reset switch is pressed, call spc_dsp_soft_reset(). + +* Call spc_dsp_set_output() with your output buffer, then do emulation. + +* Use spc_dsp_run() to run DSP for specified number of clocks (1024000 +per second). Every 32 clocks a pair of samples is added to your output +buffer. + +* Use spc_dsp_read() and spc_dsp_write() to handle DSP reads/writes from +the S-SMP. Before calling these always catch the DSP up to present time +with spc_dsp_run(). + +* Periodically play samples from your buffer. Use spc_dsp_sample_count() +to find out how many samples have been written, then +spc_dsp_set_output() after you've made more space in your buffer. + +* Use spc_dsp_copy_state() to save/load full DSP state. + +* When done, use spc_delete() to free memory. + + +SPC Music Playback +------------------ +See spc.h for full function reference (SNES_SPC.h if using C++). + +* Create SPC emulator with spc_new() and check for NULL. + +* Load SPC with spc_load_spc() and check for error. + +* Optionally cear echo buffer with spc_clear_echo(). Many SPCs have +garbage in echo buffer, which causes noise at the beginning. + +* Generate samples as needed with spc_play(). + +* When done, use spc_delete() to free memory. + +* For a more complete game music playback library, use Game_Music_Emu + + +State Copying +------------- +The SPC and DSP modules include state save/load functions. They take a +pointer to a pointer to a buffer to store state, and a copy function. +This copy function can either copy data to the buffer or from it, +allowing state save and restore with the same library function. The +internal save state format allows for future expansion without making +previous save states unusable. + +The SPC save state format puts the most important parts first to make it +easier to manually examine. It's organized as follows: + +Offset Size Data +- - - - - - - - - - - - - - - - - - + 0 $10000 SPC RAM +$10000 $10 SMP $F0-$FF registers +$10010 4 SMP $F4-$F8 output registers +$10014 2 PC +$10016 1 A +$10017 1 X +$10018 1 Y +$10019 1 PSW +$1001A 1 SP +$1001B 5 internal +$10020 $80 DSP registers +$100A0 ... internal + + +Library Compilation +------------------- +While this library is in C++, it has been written to easily link in a C +program *without* needing the standard C++ library. It doesn't use +exception handling or run-time type information (RTTI), so you can +disable these in your C++ compiler to increase efficiency. + +If you're building a shared library (DLL), I recommend only exporting +the C interfaces in spc.h and dsp.h, as the C++ interfaces expose +implementation details that will break link compatibility across +versions. + +If you're using C and compiling with GCC, I recommend the following +command-line options when compiling the library source, otherwise GCC +will insert calls to the standard C++ library and require that it be +linked in: + + -fno-rtti -fno-exceptions + +For maximum optimization, see the NDEBUG and BLARGG_NONPORTABLE options +in blargg_config. If using GCC, you can enable these by adding the +following command-line options when you invoke gcc. If you encounter +problems, try without -DBLARGG_NONPORTABLE; if that works, contact me so +I can figure out why BLARGG_NONPORTABLE was causing it to fail. + + -O3 -DNDEBUG -DBLARGG_NONPORTABLE -fno-rtti -fno-exceptions + + + +Error handling +-------------- +Functions which can fail have a return type of spc_err_t (blargg_err_t +in the C++ interfaces), which is a pointer to an error string (const +char*). If a function is successful it returns NULL. Errors that you can +easily avoid are checked with debug assertions; spc_err_t return values +are only used for genuine run-time errors that can't be easily predicted +in advance (out of memory, I/O errors, incompatible file data). Your +code should check all error values. + +To improve usability for C programmers, C++ programmers unfamiliar with +exceptions, and compatibility with older C++ compilers, the library does +*not* throw any C++ exceptions and uses malloc() instead of the standard +operator new. This means that you *must* check for NULL when creating a +library object with the new operator. + + +Solving Problems +---------------- +If you're having problems, try the following: + +* If you're getting garbled sound, try this simple siren generator in +place of your call to play(). This will quickly tell whether the problem +is in the library or in your code. + + static void play_siren( long count, short* out ) + { + static double a, a2; + while ( count-- ) + *out++ = 0x2000 * sin( a += .1 + .05*sin( a2+=.00005 ) ); + } + +* Enable debugging support in your environment. This enables assertions +and other run-time checks. + +* Turn the compiler's optimizer is off. Sometimes an optimizer generates +bad code. + +* If multiple threads are being used, ensure that only one at a time is +accessing a given set of objects from the library. This library is not +in general thread-safe, though independent objects can be used in +separate threads. + +* If all else fails, see if the demos work. + + +Accurate S-DSP Limitations +-------------------------- +* Power-up and soft reset behavior might have slight inaccuracies. + +* Muting (FLG bit 6) behavior when toggling bit very rapidly is not +emulated properly. + +* No other known inaccuracies. Has passed 100+ strenuous tests. + + +Fast S-DSP Limitations +---------------------- +* Uses faster sample calculations except in cases where exact value is +actually important (BRR decoding, and gaussian interpolation combined +with pitch modulation). + +* Stops decoding BRR data when a voice's envelope has released to +silence. + +* Emulates 32 clocks at a time, so DSP register and memory accesses are +all done in a bunch rather than spread out. Even though, some clever +code makes register accesses separated by 40 or so clocks occur with +cycle-accurate timing. + + +S-SMP Limitations +----------------- +* Opcode fetches and indirect pointers are always read directly from +memory, even for the $F0-$FF region, and the DSP is not caught up for +these fetches. + +* Attempts to perversely execute data in registers or an area being +modified by echo will not be emulated properly. + +* Has not been thoroughly tested. + +* Test register ($F0) is not implemented. + +* Echo buffer can overwrite IPL ROM area, and does not correctly update +extra RAM there. + + +To Do +----- +* I'd like feedback on the interface and any ways to improve it. In +particular, the differing features between the accurate and fast DSP +emulators might make it harder to cleanly switch between them without +modifying source code. + +* Finish thorough tests on SMP memory access times. + +* Finish thorough tests on SMP instruction behavior (flags, registers). + +* Finish thorough tests on SMP timers. + +* Finish power-up and reset behavior testing. + +* Come up with best starting conditions to play an SPC and implement in +hardware SNES SPC player for verification. + + +Thanks +------ +Thanks to Anti-Resonance's SPC2ROM and help getting SPCs playing on my +SNES in the first place, then Brad Martin's openspc and Chris Moeller's +openspc++ C++ adaptation, giving me a good SPC emulator to start with +several years ago. Thanks to Richard Bannister, Mahendra Tallur, Shazz, +nenolod, theHobbit, Johan Samuelsson, nes6502, and Micket for helping +test my Game_Music_Emu library. Thanks to hcs for help in converting to +C for the Rockbox port. Thanks to byuu (bsnes author) and pagefault and +Nach (zsnes team) for testing and using my new rewritten DSP in their +emulators. Thanks to anomie for his good SNES documentation and +discussions with me to keep it up to date with my latest findings. +-- +Shay Green diff --git a/waterbox/sameboy/snes_spc/spc.cpp b/waterbox/sameboy/snes_spc/spc.cpp new file mode 100644 index 0000000000..4e5a77ef15 --- /dev/null +++ b/waterbox/sameboy/snes_spc/spc.cpp @@ -0,0 +1,74 @@ +// snes_spc 0.9.0. http://www.slack.net/~ant/ + +#include "spc.h" + +#include "SNES_SPC.h" +#include "SPC_Filter.h" + +/* Copyright (C) 2004-2007 Shay Green. This module is free software; you +can redistribute it and/or modify it under the terms of the GNU Lesser +General Public License as published by the Free Software Foundation; either +version 2.1 of the License, or (at your option) any later version. This +module is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more +details. You should have received a copy of the GNU Lesser General Public +License along with this module; if not, write to the Free Software Foundation, +Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ + +#include "blargg_source.h" + +SNES_SPC* spc_new( void ) +{ + // be sure constants match + assert( spc_sample_rate == (int) SNES_SPC::sample_rate ); + assert( spc_rom_size == (int) SNES_SPC::rom_size ); + assert( spc_clock_rate == (int) SNES_SPC::clock_rate ); + assert( spc_clocks_per_sample == (int) SNES_SPC::clocks_per_sample ); + assert( spc_port_count == (int) SNES_SPC::port_count ); + assert( spc_voice_count == (int) SNES_SPC::voice_count ); + assert( spc_tempo_unit == (int) SNES_SPC::tempo_unit ); + assert( spc_file_size == (int) SNES_SPC::spc_file_size ); + #if !SPC_NO_COPY_STATE_FUNCS + assert( spc_state_size == (int) SNES_SPC::state_size ); + #endif + + SNES_SPC* s = new SNES_SPC; + if ( s && s->init() ) + { + delete s; + s = 0; + } + return s; +} + +void spc_delete ( SNES_SPC* s ) { delete s; } +void spc_init_rom ( SNES_SPC* s, unsigned char const r [64] ) { s->init_rom( r ); } +void spc_set_output ( SNES_SPC* s, spc_sample_t* p, int n ) { s->set_output( p, n ); } +int spc_sample_count ( SNES_SPC const* s ) { return s->sample_count(); } +void spc_reset ( SNES_SPC* s ) { s->reset(); } +void spc_soft_reset ( SNES_SPC* s ) { s->soft_reset(); } +int spc_read_port ( SNES_SPC* s, spc_time_t t, int p ) { return s->read_port( t, p ); } +void spc_write_port ( SNES_SPC* s, spc_time_t t, int p, int d ) { s->write_port( t, p, d ); } +void spc_end_frame ( SNES_SPC* s, spc_time_t t ) { s->end_frame( t ); } +void spc_mute_voices ( SNES_SPC* s, int mask ) { s->mute_voices( mask ); } +void spc_disable_surround( SNES_SPC* s, int disable ) { s->disable_surround( disable ); } +void spc_set_tempo ( SNES_SPC* s, int tempo ) { s->set_tempo( tempo ); } +uint8_t* spc_get_ram(SNES_SPC* s) { return s->get_ram(); } +spc_err_t spc_load_spc ( SNES_SPC* s, void const* p, long n ) { return s->load_spc( p, n ); } +void spc_clear_echo ( SNES_SPC* s ) { s->clear_echo(); } +spc_err_t spc_play ( SNES_SPC* s, int count, short* out ) { return s->play( count, out ); } +spc_err_t spc_skip ( SNES_SPC* s, int count ) { return s->skip( count ); } +#if !SPC_NO_COPY_STATE_FUNCS +void spc_copy_state ( SNES_SPC* s, unsigned char** p, spc_copy_func_t f ) { s->copy_state( p, f ); } +void spc_init_header ( void* spc_out ) { SNES_SPC::init_header( spc_out ); } +void spc_save_spc ( SNES_SPC* s, void* spc_out ) { s->save_spc( spc_out ); } +int spc_check_kon ( SNES_SPC* s ) { return s->check_kon(); } +#endif + +SPC_Filter* spc_filter_new( void ) { return new SPC_Filter; } +void spc_filter_delete( SPC_Filter* f ) { delete f; } +void spc_filter_run( SPC_Filter* f, spc_sample_t* p, int s ) { f->run( p, s ); } +void spc_filter_clear( SPC_Filter* f ) { f->clear(); } +void spc_filter_set_gain( SPC_Filter* f, int gain ) { f->set_gain( gain ); } +void spc_filter_set_bass( SPC_Filter* f, int bass ) { f->set_bass( bass ); } diff --git a/waterbox/sameboy/snes_spc/spc.h b/waterbox/sameboy/snes_spc/spc.h new file mode 100644 index 0000000000..cf23f3c945 --- /dev/null +++ b/waterbox/sameboy/snes_spc/spc.h @@ -0,0 +1,149 @@ +/* SNES SPC-700 APU emulator C interface (also usable from C++) */ + +/* snes_spc 0.9.0 */ +#ifndef SPC_H +#define SPC_H + +#include +#include + +#ifdef __cplusplus + extern "C" { +#endif + +/* Error string return. NULL if success, otherwise error message. */ +typedef const char* spc_err_t; + +typedef struct SNES_SPC SNES_SPC; + +/* Creates new SPC emulator. NULL if out of memory. */ +SNES_SPC* spc_new( void ); + +/* Frees SPC emulator */ +void spc_delete( SNES_SPC* ); + +/* Sample pairs generated per second */ +enum { spc_sample_rate = 32000 }; + + +/**** Emulator use ****/ + +/* Sets IPL ROM data. Library does not include ROM data. Most SPC music files +don't need ROM, but a full emulator must provide this. */ +enum { spc_rom_size = 0x40 }; +void spc_init_rom( SNES_SPC*, unsigned char const rom [spc_rom_size] ); + +/* Sets destination for output samples */ +typedef short spc_sample_t; +void spc_set_output( SNES_SPC*, spc_sample_t* out, int out_size ); + +/* Number of samples written to output since last set */ +int spc_sample_count( SNES_SPC const* ); + +/* Resets SPC to power-on state. This resets your output buffer, so you must +call spc_set_output() after this. */ +void spc_reset( SNES_SPC* ); + +/* Emulates pressing reset switch on SNES. This resets your output buffer, so +you must call spc_set_output() after this. */ +void spc_soft_reset( SNES_SPC* ); + +/* 1024000 SPC clocks per second, sample pair every 32 clocks */ +typedef int spc_time_t; +enum { spc_clock_rate = 1024000 }; +enum { spc_clocks_per_sample = 32 }; + +/* Reads/writes port at specified time */ +enum { spc_port_count = 4 }; +int spc_read_port ( SNES_SPC*, spc_time_t, int port ); +void spc_write_port( SNES_SPC*, spc_time_t, int port, int data ); + +/* Runs SPC to end_time and starts a new time frame at 0 */ +void spc_end_frame( SNES_SPC*, spc_time_t end_time ); + +uint8_t* spc_get_ram(SNES_SPC*); + +/**** Sound control ****/ + +/*Mutes voices corresponding to non-zero bits in mask. Reduces emulation accuracy. */ +enum { spc_voice_count = 8 }; +void spc_mute_voices( SNES_SPC*, int mask ); + +/* If true, prevents channels and global volumes from being phase-negated. +Only supported by fast DSP; has no effect on accurate DSP. */ +void spc_disable_surround( SNES_SPC*, int disable ); + +/* Sets tempo, where spc_tempo_unit = normal, spc_tempo_unit / 2 = half speed, etc. */ +enum { spc_tempo_unit = 0x100 }; +void spc_set_tempo( SNES_SPC*, int ); + + +/**** SPC music playback *****/ + +/* Loads SPC data into emulator. Returns NULL on success, otherwise error string. */ +spc_err_t spc_load_spc( SNES_SPC*, void const* spc_in, long size ); + +/* Clears echo region. Useful after loading an SPC as many have garbage in echo. */ +void spc_clear_echo( SNES_SPC* ); + +/* Plays for count samples and write samples to out. Discards samples if out +is NULL. Count must be a multiple of 2 since output is stereo. */ +spc_err_t spc_play( SNES_SPC*, int count, short* out ); + +/* Skips count samples. Several times faster than spc_play(). */ +spc_err_t spc_skip( SNES_SPC*, int count ); + + +/**** State save/load (only available with accurate DSP) ****/ + +/* Saves/loads exact emulator state */ +enum { spc_state_size = 67 * 1024L }; /* maximum space needed when saving */ +typedef void (*spc_copy_func_t)( unsigned char** io, void* state, size_t ); +void spc_copy_state( SNES_SPC*, unsigned char** io, spc_copy_func_t ); + +/* Writes minimal SPC file header to spc_out */ +void spc_init_header( void* spc_out ); + +/* Saves emulator state as SPC file data. Writes spc_file_size bytes to spc_out. +Does not set up SPC header; use spc_init_header() for that. */ +enum { spc_file_size = 0x10200 }; /* spc_out must have this many bytes allocated */ +void spc_save_spc( SNES_SPC*, void* spc_out ); + +/* Returns non-zero if new key-on events occurred since last check. Useful for +trimming silence while saving an SPC. */ +int spc_check_kon( SNES_SPC* ); + + +/**** SPC_Filter ****/ + +typedef struct SPC_Filter SPC_Filter; + +/* Creates new filter. NULL if out of memory. */ +SPC_Filter* spc_filter_new( void ); + +/* Frees filter */ +void spc_filter_delete( SPC_Filter* ); + +/* Filters count samples of stereo sound in place. Count must be a multiple of 2. */ +void spc_filter_run( SPC_Filter*, spc_sample_t* io, int count ); + +/* Clears filter to silence */ +void spc_filter_clear( SPC_Filter* ); + +/* Sets gain (volume), where spc_filter_gain_unit is normal. Gains greater than +spc_filter_gain_unit are fine, since output is clamped to 16-bit sample range. */ +enum { spc_filter_gain_unit = 0x100 }; +void spc_filter_set_gain( SPC_Filter*, int gain ); + +/* Sets amount of bass (logarithmic scale) */ +enum { spc_filter_bass_none = 0 }; +enum { spc_filter_bass_norm = 8 }; /* normal amount */ +enum { spc_filter_bass_max = 31 }; +void spc_filter_set_bass( SPC_Filter*, int bass ); + + +#ifdef __cplusplus + } +#endif + +#endif From 1f856b468f4c6e9a1e5993da276a5526f34ccd62 Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Tue, 18 Jul 2017 20:00:16 -0400 Subject: [PATCH 26/93] A7800Hawk: Maria Updates Add DMA auto shutdown - Fixes Choplifter Properly emulate read mode - Fixes top line of Centipede. --- .../Consoles/Atari/A7800Hawk/Maria.cs | 165 +++++++++++------- 1 file changed, 103 insertions(+), 62 deletions(-) diff --git a/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/Maria.cs b/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/Maria.cs index 0efa0456c5..8bcd0f8f8e 100644 --- a/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/Maria.cs +++ b/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/Maria.cs @@ -1,5 +1,4 @@ using System; - using BizHawk.Emulation.Common; using BizHawk.Common.NumberExtensions; using BizHawk.Common; @@ -24,9 +23,11 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk public byte[] obj; // up to 32 bytes can compose one object } - // technically there is no limit on he number of graphics objects, but since dma is automatically killed + // technically there is no limit on the number of graphics objects, but since dma is automatically killed // at the end of a scanline, we have an effective limit - GFX_Object[] GFX_Objects = new GFX_Object[128]; + GFX_Object[,] GFX_Objects = new GFX_Object[2,128]; + + int GFX_index = 0; public int _frameHz = 60; public int _screen_width = 320; @@ -36,6 +37,7 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk public int[] _vidbuffer; public int[] _palette; public int[] scanline_buffer = new int[320]; + public int[] bg_temp = new int[320]; // since BG color can be changed midscanline, we need to account for this here. public int[] GetVideoBuffer() { @@ -83,7 +85,7 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk public bool current_DLL_H8; public int header_counter; - public int header_counter_max; + public int[] header_counter_max = new int [2]; public int header_pointer; // since headers could be 4 or 5 bytes, we need a seperate pointer // write mode is actually persistent but exists outside of the regs @@ -101,7 +103,7 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk // we start off in VBlank for 20 scanlines // at the end of vblank is a DMA to set up the display for the start of drawing // this is free time for the CPU to set up display lists - while (scanline < 19) + while (scanline < 20) { Core.RunCPUCycle(); cycle++; @@ -121,7 +123,7 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk sl_DMA_complete = false; do_dma = false; - for (int i=0; i<454;i++) + for (int i=0; i<28;i++) { if(i==0 && Core.Maria_regs[0x1C].Bit(6) && !Core.Maria_regs[0x1C].Bit(5)) { @@ -138,7 +140,7 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk { // schedule an NMI for one maria tick into the future // (but set to 2 since it decrements immediately) - DLI_countdown = 2; + //DLI_countdown = 2; current_DLL_DLI = false; } @@ -154,8 +156,8 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk Core.RunCPUCycle(); } - scanline++; - cycle = 0; + //scanline++; + //cycle = 0; do_dma = false; sl_DMA_complete = false; Core.cpu.RDY = true; @@ -167,7 +169,7 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk while (scanline < 263) { - if (cycle == 28 && Core.Maria_regs[0x1C].Bit(6) && !Core.Maria_regs[0x1C].Bit(5)) + if (cycle == 50 && Core.Maria_regs[0x1C].Bit(6) && !Core.Maria_regs[0x1C].Bit(5)) { Core.cpu_halt_pending = true; DMA_phase = DMA_START_UP; @@ -195,6 +197,32 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk } } + if (cycle > 133) + { + bg_temp[cycle - 134] = Core.Maria_regs[0]; + } + + + if (cycle == 440 && !sl_DMA_complete && do_dma && (DMA_phase == DMA_GRAPHICS || DMA_phase == DMA_HEADER)) + { + //Console.Write(scanline); + //Console.Write(" "); + //Console.Write(DMA_phase); + //Console.Write(" "); + //Console.WriteLine(DMA_phase_counter); + + if (current_DLL_offset == 0) + { + DMA_phase = DMA_SHUTDOWN_LAST; + } + else + { + DMA_phase = DMA_SHUTDOWN_OTHER; + } + DMA_phase_counter = 0; + + } + Core.RunCPUCycle(); cycle++; @@ -206,14 +234,22 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk // add the current graphics to the buffer draw_scanline(scanline - 21); } - //Console.Write("Scanline"); - //Console.WriteLine(scanline - 21); scanline++; cycle = 0; Core.tia._hsyncCnt = 0; Core.cpu.RDY = true; do_dma = false; sl_DMA_complete = false; + + // swap sacnline buffers + if (GFX_index == 1) + { + GFX_index = 0; + } + else + { + GFX_index = 1; + } } } } @@ -253,7 +289,7 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk if (DMA_phase_counter==1) { header_counter++; - GFX_Objects[header_counter].addr = ReadMemory((ushort)(current_DLL_addr + header_pointer)); + GFX_Objects[GFX_index, header_counter].addr = ReadMemory((ushort)(current_DLL_addr + header_pointer)); header_pointer++; byte temp = ReadMemory((ushort)(current_DLL_addr + header_pointer)); // if there is no width, then we must have an extended header @@ -278,12 +314,12 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk else { // we are in 5 Byte header mode (i.e. using the character map) - GFX_Objects[header_counter].write_mode = temp.Bit(7); + GFX_Objects[GFX_index, header_counter].write_mode = temp.Bit(7); global_write_mode = temp.Bit(7); - GFX_Objects[header_counter].ind_mode = temp.Bit(5); + GFX_Objects[GFX_index, header_counter].ind_mode = temp.Bit(5); header_pointer++; temp = (byte)(ReadMemory((ushort)(current_DLL_addr + header_pointer))); - GFX_Objects[header_counter].addr |= (ushort)(temp << 8); + GFX_Objects[GFX_index, header_counter].addr |= (ushort)(temp << 8); header_pointer++; temp = ReadMemory((ushort)(current_DLL_addr + header_pointer)); int temp_w = (temp & 0x1F); // this is the 2's complement of width (for reasons that escape me) @@ -291,18 +327,18 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk if (temp_w == 0) { // important note here. In 5 byte mode, width 0 actually counts as 32 - GFX_Objects[header_counter].width = 32; + GFX_Objects[GFX_index, header_counter].width = 32; } else { temp_w = (temp_w - 1); temp_w = (0x1F - temp_w); - GFX_Objects[header_counter].width = (byte)(temp_w & 0x1F); + GFX_Objects[GFX_index, header_counter].width = (byte)(temp_w & 0x1F); } - GFX_Objects[header_counter].palette = (byte)((temp & 0xE0) >> 5); + GFX_Objects[GFX_index, header_counter].palette = (byte)((temp & 0xE0) >> 5); header_pointer++; - GFX_Objects[header_counter].h_pos = ReadMemory((ushort)(current_DLL_addr + header_pointer)); + GFX_Objects[GFX_index, header_counter].h_pos = ReadMemory((ushort)(current_DLL_addr + header_pointer)); header_pointer++; DMA_phase_next = DMA_GRAPHICS; @@ -315,21 +351,21 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk int temp_w = (temp & 0x1F); // this is the 2's complement of width (for reasons that escape me) temp_w = (temp_w - 1); temp_w = (0x1F - temp_w); - GFX_Objects[header_counter].width = (byte)(temp_w & 0x1F); + GFX_Objects[GFX_index, header_counter].width = (byte)(temp_w & 0x1F); - GFX_Objects[header_counter].palette = (byte)((temp & 0xE0) >> 5); + GFX_Objects[GFX_index, header_counter].palette = (byte)((temp & 0xE0) >> 5); header_pointer++; temp = (byte)(ReadMemory((ushort)(current_DLL_addr + header_pointer))); - GFX_Objects[header_counter].addr |= (ushort)(temp << 8); + GFX_Objects[GFX_index, header_counter].addr |= (ushort)(temp << 8); header_pointer++; - GFX_Objects[header_counter].h_pos = ReadMemory((ushort)(current_DLL_addr + header_pointer)); + GFX_Objects[GFX_index, header_counter].h_pos = ReadMemory((ushort)(current_DLL_addr + header_pointer)); header_pointer++; DMA_phase_next = DMA_GRAPHICS; - GFX_Objects[header_counter].write_mode = global_write_mode; + GFX_Objects[GFX_index, header_counter].write_mode = global_write_mode; - GFX_Objects[header_counter].ind_mode = false; + GFX_Objects[GFX_index, header_counter].ind_mode = false; header_read_time = 8; } @@ -350,37 +386,37 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk ushort addr_t = 0; // in 5 byte mode, we first have to check if we are in direct or indirect mode - if (GFX_Objects[header_counter].ind_mode) + if (GFX_Objects[GFX_index, header_counter].ind_mode) { int ch_size = 0; if (Core.Maria_regs[0x1C].Bit(4)) { - graphics_read_time = 9 * GFX_Objects[header_counter].width + 3; + graphics_read_time = 9 * GFX_Objects[GFX_index, header_counter].width + 3; ch_size = 2; } else { - graphics_read_time = 6 * GFX_Objects[header_counter].width + 3; + graphics_read_time = 6 * GFX_Objects[GFX_index, header_counter].width + 3; ch_size = 1; } // the address here is specified by CHAR_BASE maria registers // ushort addr = (ushort)(GFX_Objects[header_counter].addr & 0xFF); - for (int i = 0; i < GFX_Objects[header_counter].width; i++) + for (int i = 0; i < GFX_Objects[GFX_index, header_counter].width; i++) { - addr_t = ReadMemory((ushort)(GFX_Objects[header_counter].addr + i)); + addr_t = ReadMemory((ushort)(GFX_Objects[GFX_index, header_counter].addr + i)); addr_t |= (ushort)((Core.Maria_regs[0x14] + current_DLL_offset) << 8); if ((current_DLL_H16 && addr_t.Bit(12)) || (current_DLL_H8 && addr_t.Bit(11))) { if (i * ch_size < 32) { - GFX_Objects[header_counter].obj[i * ch_size] = 0; + GFX_Objects[GFX_index, header_counter].obj[i * ch_size] = 0; } if ((i * ch_size + 1 < 32) && (ch_size == 2)) { - GFX_Objects[header_counter].obj[i * ch_size + 1] = 0; + GFX_Objects[GFX_index, header_counter].obj[i * ch_size + 1] = 0; } if (ch_size == 1) { @@ -396,30 +432,30 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk { if (i * ch_size < 32) { - GFX_Objects[header_counter].obj[i * ch_size] = ReadMemory(addr_t); + GFX_Objects[GFX_index, header_counter].obj[i * ch_size] = ReadMemory(addr_t); } if ((i * ch_size + 1 < 32) && (ch_size == 2)) { - GFX_Objects[header_counter].obj[i * ch_size + 1] = ReadMemory(addr_t); + GFX_Objects[GFX_index, header_counter].obj[i * ch_size + 1] = ReadMemory(addr_t); } } } } else { - graphics_read_time = 3 * GFX_Objects[header_counter].width; + graphics_read_time = 3 * GFX_Objects[GFX_index, header_counter].width; - for (int i = 0; i < GFX_Objects[header_counter].width; i++) + for (int i = 0; i < GFX_Objects[GFX_index, header_counter].width; i++) { - addr_t = (ushort)(GFX_Objects[header_counter].addr + (current_DLL_offset << 8) + i); + addr_t = (ushort)(GFX_Objects[GFX_index, header_counter].addr + (current_DLL_offset << 8) + i); if ((current_DLL_H16 && addr_t.Bit(12)) || (current_DLL_H8 && addr_t.Bit(11))) { - GFX_Objects[header_counter].obj[i] = 0; + GFX_Objects[GFX_index, header_counter].obj[i] = 0; graphics_read_time -= 3; } else { - GFX_Objects[header_counter].obj[i] = ReadMemory(addr_t); + GFX_Objects[GFX_index, header_counter].obj[i] = ReadMemory(addr_t); } } } @@ -440,7 +476,7 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk Core.cpu_resume_pending = true; sl_DMA_complete = true; current_DLL_offset -= 1; // this is reduced by one for each scanline, which changes where graphics are fetched - header_counter_max = header_counter; + header_counter_max[GFX_index] = header_counter; header_counter = -1; header_pointer = 0; return; @@ -463,10 +499,11 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk current_DLL_offset = (byte)(temp & 0xF); current_DLL_DLI = temp.Bit(7); + current_DLL_H16 = temp.Bit(6); current_DLL_H8 = temp.Bit(5); - header_counter_max = header_counter; + header_counter_max[GFX_index] = header_counter; header_counter = -1; header_pointer = 0; } @@ -482,24 +519,24 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk int local_palette; int index; int color; + int local_GFX_index; + + local_GFX_index = (GFX_index == 1) ? 0 : 1; // whatever the current index is, we use the opposite int disp_mode = Core.Maria_regs[0x1C] & 0x3; - int temp_bg = Core.Maria_regs[0]; - - for (int i = 0; i < 320; i++) { - scanline_buffer[i] = _palette[temp_bg]; + scanline_buffer[i] = _palette[bg_temp[i]]; } - for (int i = 0; i < header_counter_max; i++) + for (int i = 0; i < header_counter_max[local_GFX_index]; i++) { - local_start = GFX_Objects[i].h_pos; - local_palette = GFX_Objects[i].palette; + local_start = GFX_Objects[local_GFX_index, i].h_pos; + local_palette = GFX_Objects[local_GFX_index, i].palette; // the two different rendering paths are basically controlled by write mode - if (GFX_Objects[i].write_mode) + if (GFX_Objects[local_GFX_index, i].write_mode) { } @@ -507,7 +544,7 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk { if (disp_mode == 0) { - local_width = GFX_Objects[i].width; + local_width = GFX_Objects[local_GFX_index, i].width; for (int j = 0; j < local_width; j++) { @@ -518,7 +555,7 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk if (index > 511) index -= 512; if (index < 320) { - color = GFX_Objects[i].obj[j]; + color = GFX_Objects[local_GFX_index, i].obj[j]; // this is now the color index (0-3) we choose from the palette if (k>=6) @@ -554,19 +591,19 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk } else if (disp_mode == 2) // note: 1 is not used { - local_width = GFX_Objects[i].width; + local_width = GFX_Objects[local_GFX_index, i].width; // here the palette is determined by palette bit 2 only // hence only palette 0 or 4 is available - local_palette = GFX_Objects[i].palette & 0x4; + local_palette = GFX_Objects[local_GFX_index, i].palette & 0x4; - int temp_c0 = GFX_Objects[i].palette & 0x1; - int temp_c1 = GFX_Objects[i].palette & 0x2; + int temp_c0 = GFX_Objects[local_GFX_index, i].palette & 0x1; + int temp_c1 = GFX_Objects[local_GFX_index, i].palette & 0x2; for (int j = 0; j < local_width; j++) { for (int k = 7; k >= 0; k--) { - color = (GFX_Objects[i].obj[j] >> k) & 1; + color = (GFX_Objects[local_GFX_index, i].obj[j] >> k) & 1; color = (color << 1) | ((k % 2 == 0) ? temp_c0 : temp_c1); index = local_start * 2 + j * 8 + (7 - k); if (index > 511) index -= 512; @@ -586,13 +623,13 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk } else { - local_width = GFX_Objects[i].width; + local_width = GFX_Objects[local_GFX_index, i].width; for (int j = 0; j < local_width; j++) { for (int k = 7; k >= 0; k--) { - color = (GFX_Objects[i].obj[j] >> k) & 1; + color = (GFX_Objects[local_GFX_index, i].obj[j] >> k) & 1; index = local_start * 2 + j * 8 + (7 - k); if (index > 511) index -= 512; if (index < 320 && color == 1) @@ -620,10 +657,13 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk { _vidbuffer = new int[VirtualWidth * VirtualHeight]; - for (int i = 0; i < 128; i++) + for (int j = 0; j < 2; j++) { - GFX_Objects[i].obj = new byte[32]; - } + for (int i = 0; i < 128; i++) + { + GFX_Objects[j, i].obj = new byte[32]; + } + } } // Most of the Maria state is captured in Maria Regs in the core @@ -634,6 +674,7 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk ser.BeginSection("Maria"); ser.Sync("global write mode", ref global_write_mode); + ser.Sync("GFX_index", ref GFX_index); ser.EndSection(); } From 09672a6bf9ecbf3af5d3376183ec94b0d1617ff1 Mon Sep 17 00:00:00 2001 From: nattthebear Date: Tue, 18 Jul 2017 20:45:06 -0400 Subject: [PATCH 27/93] SGB: fix bugs in attr chr. Fixes some graphical glitches in Daffy Duck Marvin Missions --- waterbox/sameboy/sgb.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/waterbox/sameboy/sgb.c b/waterbox/sameboy/sgb.c index 896cc68c73..42c0ba7b9f 100644 --- a/waterbox/sameboy/sgb.c +++ b/waterbox/sameboy/sgb.c @@ -332,7 +332,7 @@ static void cmd_attr_chr() return; } int npacket = (n + 87) / 64; - if ((sgb.command[0] & 7) != npacket) + if ((sgb.command[0] & 7) < npacket) { utils_log("SGB: cmd_attr_chr bad length\n"); return; @@ -343,9 +343,9 @@ static void cmd_attr_chr() if (y > 17) y = 17; int vertical = sgb.command[5]; - for (int i = 0; i < 360; i++) + for (int i = 0; i < n; i++) { - uint8_t v = i / 4 + 6; + uint8_t v = sgb.command[i / 4 + 6]; int a = v >> (2 * (3 - (i & 3))) & 3; dst[y * 20 + x] = a; if (vertical) From 22178caea78b8be6e78344cb799e86b35034fd72 Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Tue, 18 Jul 2017 21:17:27 -0400 Subject: [PATCH 28/93] A7800Hawk: More Maria updates -Fixes Donkey Kong and DK Jr --- .../Consoles/Atari/A7800Hawk/Maria.cs | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/Maria.cs b/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/Maria.cs index 8bcd0f8f8e..9a250b911b 100644 --- a/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/Maria.cs +++ b/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/Maria.cs @@ -169,7 +169,7 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk while (scanline < 263) { - if (cycle == 50 && Core.Maria_regs[0x1C].Bit(6) && !Core.Maria_regs[0x1C].Bit(5)) + if (cycle == 28 && Core.Maria_regs[0x1C].Bit(6) && !Core.Maria_regs[0x1C].Bit(5)) { Core.cpu_halt_pending = true; DMA_phase = DMA_START_UP; @@ -394,6 +394,7 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk { graphics_read_time = 9 * GFX_Objects[GFX_index, header_counter].width + 3; ch_size = 2; + GFX_Objects[GFX_index, header_counter].width *= 2; } else { @@ -410,7 +411,7 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk if ((current_DLL_H16 && addr_t.Bit(12)) || (current_DLL_H8 && addr_t.Bit(11))) { - if (i * ch_size < 32) + if (i * ch_size < 64) { GFX_Objects[GFX_index, header_counter].obj[i * ch_size] = 0; } @@ -430,13 +431,13 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk } else { - if (i * ch_size < 32) + if (i * ch_size < 128) { GFX_Objects[GFX_index, header_counter].obj[i * ch_size] = ReadMemory(addr_t); } - if ((i * ch_size + 1 < 32) && (ch_size == 2)) + if (((i * ch_size + 1) < 128) && (ch_size == 2)) { - GFX_Objects[GFX_index, header_counter].obj[i * ch_size + 1] = ReadMemory(addr_t); + GFX_Objects[GFX_index, header_counter].obj[i * ch_size + 1] = ReadMemory((ushort)(addr_t + 1)); } } } @@ -552,7 +553,11 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk { index = local_start * 2 + j * 8 + (7 - k); - if (index > 511) index -= 512; + if (index > 511) + { + index -= 512; + } + if (index < 320) { color = GFX_Objects[local_GFX_index, i].obj[j]; @@ -661,7 +666,7 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk { for (int i = 0; i < 128; i++) { - GFX_Objects[j, i].obj = new byte[32]; + GFX_Objects[j, i].obj = new byte[128]; } } } From ab817f143d57411edb5df08ab9925d2b4c2c651c Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Wed, 19 Jul 2017 09:35:58 -0400 Subject: [PATCH 29/93] A7800Hawk: Maria timing Fix Fixes Desert Falcon and Kung Fu Master --- .../Consoles/Atari/A7800Hawk/Maria.cs | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/Maria.cs b/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/Maria.cs index 9a250b911b..3d86d1568a 100644 --- a/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/Maria.cs +++ b/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/Maria.cs @@ -123,7 +123,7 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk sl_DMA_complete = false; do_dma = false; - for (int i=0; i<28;i++) + for (int i=0; i<454;i++) { if(i==0 && Core.Maria_regs[0x1C].Bit(6) && !Core.Maria_regs[0x1C].Bit(5)) { @@ -156,8 +156,8 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk Core.RunCPUCycle(); } - //scanline++; - //cycle = 0; + scanline++; + cycle = 0; do_dma = false; sl_DMA_complete = false; Core.cpu.RDY = true; @@ -205,12 +205,6 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk if (cycle == 440 && !sl_DMA_complete && do_dma && (DMA_phase == DMA_GRAPHICS || DMA_phase == DMA_HEADER)) { - //Console.Write(scanline); - //Console.Write(" "); - //Console.Write(DMA_phase); - //Console.Write(" "); - //Console.WriteLine(DMA_phase_counter); - if (current_DLL_offset == 0) { DMA_phase = DMA_SHUTDOWN_LAST; From 052c35cd3527949db83edc77f89254b32740befd Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Wed, 19 Jul 2017 14:54:47 -0400 Subject: [PATCH 30/93] A7800Hawk: Fix Lag detection --- .../Consoles/Atari/A7800Hawk/TIA_Sound/TIA.cs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/TIA_Sound/TIA.cs b/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/TIA_Sound/TIA.cs index 6f6890831b..1b95a00306 100644 --- a/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/TIA_Sound/TIA.cs +++ b/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/TIA_Sound/TIA.cs @@ -98,6 +98,7 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk { if (Core.m6532._outputB == 0 && (Core.m6532._ddRb & 0x10)==0x10) { + Core._islag = false; return (byte)(Core.p1_fire_2x & 0x80); } else @@ -110,6 +111,7 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk { if (Core.m6532._outputB == 0 && (Core.m6532._ddRb & 0x10) == 0x10) { + Core._islag = false; return (byte)((Core.p1_fire_2x & 0x40)<<1); } else @@ -122,6 +124,7 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk { if (Core.m6532._outputB == 0 && (Core.m6532._ddRb & 0x04) == 0x04) { + Core._islag = false; return (byte)(Core.p2_fire_2x & 0x80); } else @@ -134,6 +137,7 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk { if (Core.m6532._outputB == 0 && (Core.m6532._ddRb & 0x04) == 0x04) { + Core._islag = false; return (byte)((Core.p2_fire_2x & 0x40)<<1); } else @@ -144,11 +148,13 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk if (maskedAddr == 0x0C) // INPT4 { + Core._islag = false; return Core.p1_fire; } if (maskedAddr == 0x0D) // INPT5 { + Core._islag = false; return Core.p2_fire; } From 4b79525e8d8bdb6e0716913eb0ff89078054d799 Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Wed, 19 Jul 2017 14:55:50 -0400 Subject: [PATCH 31/93] Atari780Hawk: Bug Fixes --- .../Atari/A7800Hawk/A7800Hawk.IEmulator.cs | 1 + .../Consoles/Atari/A7800Hawk/Maria.cs | 19 ++++++++++--------- .../Consoles/Atari/A7800Hawk/MemoryMap.cs | 1 + 3 files changed, 12 insertions(+), 9 deletions(-) diff --git a/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/A7800Hawk.IEmulator.cs b/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/A7800Hawk.IEmulator.cs index 1ce8da055f..06ea64f01f 100644 --- a/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/A7800Hawk.IEmulator.cs +++ b/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/A7800Hawk.IEmulator.cs @@ -35,6 +35,7 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk public void FrameAdvance(IController controller, bool render, bool rendersound) { + Console.WriteLine("-----------------------FRAME-----------------------"); if (_tracer.Enabled) { cpu.TraceCallback = s => _tracer.Put(s); diff --git a/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/Maria.cs b/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/Maria.cs index 3d86d1568a..9bfa8635d7 100644 --- a/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/Maria.cs +++ b/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/Maria.cs @@ -122,7 +122,8 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk // Since long shut down loads up the next zone, this basically loads up the DLL for the first zone sl_DMA_complete = false; do_dma = false; - + Core.Maria_regs[8] = 0; // we have now left VBLank + for (int i=0; i<454;i++) { if(i==0 && Core.Maria_regs[0x1C].Bit(6) && !Core.Maria_regs[0x1C].Bit(5)) @@ -140,7 +141,7 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk { // schedule an NMI for one maria tick into the future // (but set to 2 since it decrements immediately) - //DLI_countdown = 2; + DLI_countdown = 2; current_DLL_DLI = false; } @@ -161,14 +162,11 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk do_dma = false; sl_DMA_complete = false; Core.cpu.RDY = true; - Core.Maria_regs[8] = 0; // we have now left VBLank - // Now proceed with the remaining scanlines // the first one is a pre-render line, since we didn't actually put any data into the buffer yet - while (scanline < 263) - { - + while (scanline < _screen_height) + { if (cycle == 28 && Core.Maria_regs[0x1C].Bit(6) && !Core.Maria_regs[0x1C].Bit(5)) { Core.cpu_halt_pending = true; @@ -205,6 +203,8 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk if (cycle == 440 && !sl_DMA_complete && do_dma && (DMA_phase == DMA_GRAPHICS || DMA_phase == DMA_HEADER)) { + //Console.WriteLine(scanline); + if (current_DLL_offset == 0) { DMA_phase = DMA_SHUTDOWN_LAST; @@ -213,8 +213,8 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk { DMA_phase = DMA_SHUTDOWN_OTHER; } - DMA_phase_counter = 0; - + + DMA_phase_counter = 0; } Core.RunCPUCycle(); @@ -443,6 +443,7 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk for (int i = 0; i < GFX_Objects[GFX_index, header_counter].width; i++) { addr_t = (ushort)(GFX_Objects[GFX_index, header_counter].addr + (current_DLL_offset << 8) + i); + if ((current_DLL_H16 && addr_t.Bit(12)) || (current_DLL_H8 && addr_t.Bit(11))) { GFX_Objects[GFX_index, header_counter].obj[i] = 0; diff --git a/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/MemoryMap.cs b/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/MemoryMap.cs index 848e06ae7d..164391b25f 100644 --- a/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/MemoryMap.cs +++ b/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/MemoryMap.cs @@ -118,6 +118,7 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk { // register 8 is read only and controlled by Maria var temp = addr & 0x1F; + if (temp != 8) Maria_regs[temp] = value; From 8796269d6b0bcebc0d40850a74a7e71e52f2d039 Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Wed, 19 Jul 2017 15:03:50 -0400 Subject: [PATCH 32/93] A7800Hawk: more lag detection --- BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/M6532.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/M6532.cs b/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/M6532.cs index bb21eed8db..6ead2370e3 100644 --- a/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/M6532.cs +++ b/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/M6532.cs @@ -54,6 +54,8 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk if (registerAddr == 0x02) { + Core._islag = false; + // Read Output reg B byte temp = Core.con_state; temp = (byte)(temp & ~_ddRb); From 436cae0df62d41e48462cc08e558e1019f038302 Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Wed, 19 Jul 2017 15:21:22 -0400 Subject: [PATCH 33/93] A7800Hawk: Fix PAL --- .../Consoles/Atari/A7800Hawk/Mappers/MapperDefault.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/Mappers/MapperDefault.cs b/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/Mappers/MapperDefault.cs index 5260bdcb7f..44c0513abf 100644 --- a/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/Mappers/MapperDefault.cs +++ b/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/Mappers/MapperDefault.cs @@ -38,9 +38,9 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk { return Core._rom[Core._rom.Length - (0x10000 - addr)]; } - else if (addr >= 0xF000 && !Core.A7800_control_register.Bit(2)) + else if (addr >= (0x10000-Core._bios.Length) && !Core.A7800_control_register.Bit(2)) { - return Core._bios[addr - 0xF000]; + return Core._bios[addr - (0x10000 - Core._bios.Length)]; } else { From 9e76c8aa2ff49fb135d89473f2f37a1e41bd340a Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Wed, 19 Jul 2017 17:08:10 -0400 Subject: [PATCH 34/93] Update A7800 DB --- Assets/gamedb/gamedb_a7800.txt | 31 ++++++++++++++++--------------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/Assets/gamedb/gamedb_a7800.txt b/Assets/gamedb/gamedb_a7800.txt index 45cd9dd51e..f72db6fd92 100644 --- a/Assets/gamedb/gamedb_a7800.txt +++ b/Assets/gamedb/gamedb_a7800.txt @@ -6,19 +6,20 @@ md5:0be996d25144966d5541c9eb4919b289 Ace of Aces A78 NTSC=true;board=A78SG md5:aadde920b3aaba03bc10b40bd0619c94 Ace of Aces A78 PAL=true;board=A78SG md5:877dcc97a775ed55081864b2dbf5f1e2 Alien Brigade A78 NTSC=true;board=A78S9 md5:de3e9496cb7341f865f27e5a72c7f2f5 Alien Brigade A78 PAL=true;board=A78S9 -md5:0a9e58ef5eb9ff93246e0fff684dc7f1 Arkanoid (0911) A78 NTSC=true;board=A7832P +md5:0a9e58ef5eb9ff93246e0fff684dc7f1 Arkanoid (0911) A78 NTSC=true;board=0P md5:f9fb84658c5586df159a0c75cc46b54c Asteroids Deluxe A78 NTSC=true;board=0 -md5:a65f79ad4a0bbdecd59d5f7eb3623fd7 Asteroids Deluxe A78 NTSC=true;board=A7832 -md5:1baf41de200f26ec643625021290bec2 Asteroids Deluxe A78 PAL=true;board=A7832 +md5:a65f79ad4a0bbdecd59d5f7eb3623fd7 Asteroids Deluxe A78 NTSC=true;board=0 +md5:1baf41de200f26ec643625021290bec2 Asteroids Deluxe A78 PAL=true;board=0 md5:07342c78619ba6ffcc61c10e907e3b50 Asteroids A78 NTSC=true;board=0 -md5:8fc3a695eaea3984912d98ed4a543376 Ballblazer A78 NTSC=true;board=A7832P -md5:b558814d54904ce0582e2f6a801d03af Ballblazer A78 PAL=true;board=A7832P +md5:8fc3a695eaea3984912d98ed4a543376 Ballblazer A78 NTSC=true;board=0P +md5:b558814d54904ce0582e2f6a801d03af Ballblazer A78 PAL=true;board=0P md5:42682415906c21c6af80e4198403ffda Barnyard Blaster A78 NTSC=true;board=A78SG md5:babe2bc2976688bafb8b23c192658126 Barnyard Blaster A78 PAL=true;board=A78SG md5:f5f6b69c5eb4b55fc163158d1a6b423e Basketbrawl A78 NTSC=true;board=A78SG md5:fba002089fcfa176454ab507e0eb76cb Basketbrawl A78 PAL=true;board=A78SG md5:6010a398070dfacb4c0173d75d73c50a Beef Drop A78 NTSC=true;board=0 md5:c534db0a062225b17cfb8ecce0fb9090 Beef Drop A78 NTSC=true;board=0 +md5:CE25D34071B2C798ACE4C8792EAE8E84 Beef Drop A78 NTSC=true;board=0 md5:6da5b1b9fa0001e3517f6084ff651b07 Bentley Bear - Crystal Quest A78 NTSC=true;board=A78S9 md5:5a09946e57dbe30408a8f253a28d07db Centipede A78 NTSC=true;board=0 md5:38c056a48472d9a9e16ebda5ed91dae7 Centipede A78 PAL=true;board=0 @@ -71,8 +72,8 @@ md5:045fd12050b7f2b842d5970f2414e912 Jinks A78 NTSC=true;board=A78SGR md5:dfb86f4d06f05ad00cf418f0a59a24f7 Jinks A78 PAL=true;board=A78SGR md5:f18b3b897a25ab3885b43b4bd141b396 Joust A78 NTSC=true;board=0 md5:f2dae0264a4b4a73762b9d7177e989f6 Joust A78 PAL=true;board=0 -md5:548ba2e54e4fc45ab84ed634d702c136 Jr. Ms. Pac-Man A78 NTSC=true;board=A7832P -md5:6bc2daeb48e28d103a4298a276e7e551 Jr. Pac-Man (Tunnels) A78 NTSC=true;board=A7832P +md5:548ba2e54e4fc45ab84ed634d702c136 Jr. Ms. Pac-Man A78 NTSC=true;board=0P +md5:6bc2daeb48e28d103a4298a276e7e551 Jr. Pac-Man (Tunnels) A78 NTSC=true;board=0P md5:0b3baf47886915dd2eec5da7671bfa63 Jr. Pac-Man A78 NTSC=true;board=A78SGR md5:8281ab17fa3bfc0a6c497d6a4f350061 Jr. Pac-Man A78 NTSC=true;board=A78SGR md5:17b3b764d33eae9b5260f01df7bb9d2f KLAX A78 NTSC=true;board=A78SG @@ -94,7 +95,7 @@ md5:bc1e905db1008493a9632aa83ab4682b Midnight Mutants A78 NTSC=true;board=A78S md5:6794ea31570eba0b88a0bf1ead3f3f1b Midnight Mutants A78 PAL=true;board=A78SG md5:017066f522908081ec3ee624f5e4a8aa Missing in Action A78 NTSC=true;board=A78S9 md5:d0f46bf92ed6e7b1cce63278420cae8a Missing in Action A78 NTSC=true;board=A78S9 -md5:9ff38ea62004201d870caa8bd9463525 Moon Cresta A78 NTSC=true;board=A7832 +md5:9ff38ea62004201d870caa8bd9463525 Moon Cresta A78 NTSC=true;board=0 md5:3bc8f554cf86f8132a623cc2201a564b Motor Psycho A78 NTSC=true;board=A78SG md5:5330bfe428a6b601b7e76c2cfc4cd049 Motor Psycho A78 PAL=true;board=A78SG md5:fc0ea52a9fac557251b65ee680d951e5 Ms. Pac-Man A78 NTSC=true;board=0 @@ -113,15 +114,15 @@ md5:2837a8fd49b7fc7ccd70fd45b69c5099 Planet Smashers A78 PAL=true;board=A78SG md5:86546808dc60961cdb1b20e761c50ab1 Plutos A78 NTSC=true;board=A78SGR md5:584582bb09ee8122e7fc09dc7d1ed813 Pole Position II A78 NTSC=true;board=0 md5:865457e0e0f48253b08f77b9e18f93b2 Pole Position II A78 PAL=true;board=0 -md5:66e7230f7ef9d14db82d76b06b241bc0 Q-bert A78 NTSC=true;board=A7832 +md5:66e7230f7ef9d14db82d76b06b241bc0 Q-bert A78 NTSC=true;board=0 md5:ac03806cef2558fc795a7d5d8dba7bc0 Rampage A78 NTSC=true;board=A78AC md5:383ed9bd1efb9b6cb3388a777678c928 Realsports Baseball A78 NTSC=true;board=A78S4 -md5:8f7eb10ad0bd75474abf0c6c36c08486 Rescue on Fractalus A78 NTSC=true;board=A7832 +md5:8f7eb10ad0bd75474abf0c6c36c08486 Rescue on Fractalus A78 NTSC=true;board=0 md5:43525a0405184875c2ecfd0196886a34 Rip Off A78 NTSC=true;board=0 -md5:106b409c6f4c219b1a3b3d099ead3b2b Rip Off A78 PAL=true;board=00 -md5:505f05e7f161f62ccd749dab3c4a204b Robot Finds Kitten A78 NTSC=true;board=A7832 +md5:106b409c6f4c219b1a3b3d099ead3b2b Rip Off A78 PAL=true;board=0 +md5:505f05e7f161f62ccd749dab3c4a204b Robot Finds Kitten A78 NTSC=true;board=0 md5:66ecaafe1b82ae68ffc96267aaf7a4d7 Robotron 2084 A78 NTSC=true;board=0 -md5:ae85689b21bdf85cb9dc57c3b1fec9db Santa Simon A78 NTSC=true;board=A7848 +md5:ae85689b21bdf85cb9dc57c3b1fec9db Santa Simon A78 NTSC=true;board=0 md5:57651b6c8e62811fab0361cea537b79c Scramble A78 NTSC=true;board=0 md5:c265cfd65534a4514f226cb4c7f7d6bf Scramble A78 NTSC=true;board=0 md5:1ee26fc6b06b4c9ba74931914b7e719d Scramble A78 PAL=true;board=0 @@ -132,7 +133,7 @@ md5:b697d9c2d1b9f6cb21041286d1bbfa7f Sentinel A78 NTSC=true;board=A78SG md5:5469b4de0608f23a5c4f98f331c9e75f Sentinel A78 PAL=true;board=A78SG md5:2d643ac548c40e58c99d0fe433ba4ba0 Sirius A78 NTSC=true;board=A78SGR md5:a84c1b2300fbfbf21b1c02387f613dad Space Duel A78 PAL=true;board=0 -md5:771cb4609347657f63e6f0eb26036e35 Space Duel A78 NTSC=true;board=A7832 +md5:771cb4609347657f63e6f0eb26036e35 Space Duel A78 NTSC=true;board=0 md5:6adf79558a3d7f5beca1bb8d34337417 Space Invaders A78 NTSC=true;board=0 md5:cbb0746192540a13b4c7775c7ce2021f Summer Games A78 NTSC=true;board=A78SGR md5:cc18e3b37a507c4217eb6cb1de8c8538 Super Huey UH-IX A78 NTSC=true;board=0 @@ -147,7 +148,7 @@ md5:682338364243b023ecc9d24f0abfc9a7 Tomcat F14 A78 PAL=true;board=0 md5:208ef955fa90a29815eb097bce89bace Touchdown Football A78 NTSC=true;board=A78SG md5:8d64763db3100aadc552db5e6868506a Tower Toppler A78 NTSC=true;board=A78S4R md5:32a37244a9c6cc928dcdf02b45365aa8 Tower Toppler A78 PAL=true;board=A78S4R -md5:412cc5bfa08bd03244b9c4e8d46cd0a0 Wasp (Standard Edition) A78 NTSC=true;board=A7832 +md5:412cc5bfa08bd03244b9c4e8d46cd0a0 Wasp (Standard Edition) A78 NTSC=true;board=0 md5:427cb05d0a1abb068998e2760d77f4fb Water Ski A78 NTSC=true;board=A78S4 md5:3799d72f78dda2ee87b0ef8bf7b91186 Winter Games A78 NTSC=true;board=A78SGR md5:6813ffff510f930c867b3f0aba78ac85 Worm (0703) A78 NTSC=true;board=0 From 7d2ee60adee0da0b454f9d570008ee9cfb8a29c5 Mon Sep 17 00:00:00 2001 From: nattthebear Date: Wed, 19 Jul 2017 17:08:48 -0400 Subject: [PATCH 35/93] sameboy: lag flag / inputcallback --- waterbox/sameboy/bizhawk.cpp | 12 ++++++- waterbox/sameboy/gb.c | 68 ++++++------------------------------ waterbox/sameboy/gb.h | 8 +++-- waterbox/sameboy/memory.c | 3 ++ 4 files changed, 30 insertions(+), 61 deletions(-) diff --git a/waterbox/sameboy/bizhawk.cpp b/waterbox/sameboy/bizhawk.cpp index dbcfdcb0e9..531e4f4eeb 100644 --- a/waterbox/sameboy/bizhawk.cpp +++ b/waterbox/sameboy/bizhawk.cpp @@ -57,6 +57,13 @@ static uint8_t SerialEndCallback(GB_gameboy_t *gb) return 0; } +static void (*FrontendInputCallback)(); + +static void InputCallback(GB_gameboy_t *gb) +{ + FrontendInputCallback(); +} + static blip_t *leftblip; static blip_t *rightblip; const int SOUND_RATE_GB = 2097152; @@ -146,6 +153,7 @@ ECL_EXPORT void FrameAdvance(MyFrameInfo &f) } sound_start_clock = GB_epoch(&GB); CurrentFramebuffer = f.VideoBuffer; + GB_set_lagged(&GB, true); uint32_t target = 35112 - FrameOverflow; f.Cycles = GB_run_cycles(&GB, target); @@ -166,6 +174,7 @@ ECL_EXPORT void FrameAdvance(MyFrameInfo &f) f.Samples = blip_read_samples(leftblip, f.SoundBuffer, 2048, 1); blip_read_samples(rightblip, f.SoundBuffer + 1, 2048, 1); CurrentFramebuffer = NULL; + f.Lagged = GB_get_lagged(&GB); } static void SetMemoryArea(MemoryArea *m, GB_direct_access_t access, const char *name, int32_t flags) @@ -194,7 +203,8 @@ ECL_EXPORT void GetMemoryAreas(MemoryArea *m) ECL_EXPORT void SetInputCallback(void (*callback)()) { - // TODO + FrontendInputCallback = callback; + GB_set_input_callback(&GB, callback ? InputCallback : nullptr); } int main() diff --git a/waterbox/sameboy/gb.c b/waterbox/sameboy/gb.c index 814a78811b..e8e90d55bd 100644 --- a/waterbox/sameboy/gb.c +++ b/waterbox/sameboy/gb.c @@ -43,54 +43,11 @@ void GB_log(GB_gameboy_t *gb, const char *fmt, ...) va_end(args); } -static char *default_input_callback(GB_gameboy_t *gb) -{ - char *expression = NULL; - size_t size = 0; - - if (getline(&expression, &size, stdin) == -1) { - /* The user doesn't have STDIN or used ^D. We make sure the program keeps running. */ - GB_set_async_input_callback(gb, NULL); /* Disable async input */ - return strdup("c"); - } - - if (!expression) { - return strdup(""); - } - - size_t length = strlen(expression); - if (expression[length - 1] == '\n') { - expression[length - 1] = 0; - } - return expression; -} - -static char *default_async_input_callback(GB_gameboy_t *gb) -{ -#if 0 - fd_set set; - FD_ZERO(&set); - FD_SET(STDIN_FILENO, &set); - struct timeval time = {0,}; - if (select(1, &set, NULL, NULL, &time) == 1) { - if (feof(stdin)) { - GB_set_async_input_callback(gb, NULL); /* Disable async input */ - return NULL; - } - return default_input_callback(gb); - } -#endif - return NULL; -} - void GB_init(GB_gameboy_t *gb) { memset(gb, 0, sizeof(*gb)); gb->ram = malloc(gb->ram_size = 0x2000); gb->vram = malloc(gb->vram_size = 0x2000); - - gb->input_callback = default_input_callback; - gb->async_input_callback = default_async_input_callback; gb->cartridge_type = &GB_cart_defs[0]; // Default cartridge type GB_reset(gb); @@ -102,9 +59,6 @@ void GB_init_sgb(GB_gameboy_t *gb) gb->ram = malloc(gb->ram_size = 0x2000); gb->vram = malloc(gb->vram_size = 0x2000); gb->is_sgb = true; - - gb->input_callback = default_input_callback; - gb->async_input_callback = default_async_input_callback; gb->cartridge_type = &GB_cart_defs[0]; // Default cartridge type GB_reset(gb); @@ -116,9 +70,6 @@ void GB_init_cgb(GB_gameboy_t *gb) gb->ram = malloc(gb->ram_size = 0x2000 * 8); gb->vram = malloc(gb->vram_size = 0x2000 * 2); gb->is_cgb = true; - - gb->input_callback = default_input_callback; - gb->async_input_callback = default_async_input_callback; gb->cartridge_type = &GB_cart_defs[0]; // Default cartridge type GB_reset(gb); @@ -298,17 +249,9 @@ void GB_set_log_callback(GB_gameboy_t *gb, GB_log_callback_t callback) void GB_set_input_callback(GB_gameboy_t *gb, GB_input_callback_t callback) { - if (gb->input_callback == default_input_callback) { - gb->async_input_callback = NULL; - } gb->input_callback = callback; } -void GB_set_async_input_callback(GB_gameboy_t *gb, GB_input_callback_t callback) -{ - gb->async_input_callback = callback; -} - void GB_set_rgb_encode_callback(GB_gameboy_t *gb, GB_rgb_encode_callback_t callback) { if (!gb->rgb_encode_callback && !gb->is_cgb) { @@ -541,3 +484,14 @@ void *GB_get_direct_access(GB_gameboy_t *gb, GB_direct_access_t access, size_t * return NULL; } } + +void GB_set_lagged(GB_gameboy_t *gb, bool lagged) +{ + gb->lagged = lagged; +} + +bool GB_get_lagged(GB_gameboy_t *gb) +{ + return gb->lagged; +} + diff --git a/waterbox/sameboy/gb.h b/waterbox/sameboy/gb.h index e67a89244d..9b5f4613dd 100644 --- a/waterbox/sameboy/gb.h +++ b/waterbox/sameboy/gb.h @@ -165,7 +165,7 @@ typedef enum { typedef void (*GB_vblank_callback_t)(GB_gameboy_t *gb); typedef void (*GB_log_callback_t)(GB_gameboy_t *gb, const char *string, GB_log_attributes attributes); -typedef char *(*GB_input_callback_t)(GB_gameboy_t *gb); +typedef void (*GB_input_callback_t)(GB_gameboy_t *gb); typedef uint32_t (*GB_rgb_encode_callback_t)(GB_gameboy_t *gb, uint8_t r, uint8_t g, uint8_t b); typedef void (*GB_infrared_callback_t)(GB_gameboy_t *gb, bool on, long cycles_since_last_update); typedef void (*GB_rumble_callback_t)(GB_gameboy_t *gb, bool rumble_on); @@ -382,6 +382,7 @@ struct GB_gameboy_internal_s { /* I/O */ uint32_t *screen; int keys; + bool lagged; /* Timing */ uint64_t cycles_since_epoch; @@ -390,7 +391,6 @@ struct GB_gameboy_internal_s { void *user_data; GB_log_callback_t log_callback; GB_input_callback_t input_callback; - GB_input_callback_t async_input_callback; GB_rgb_encode_callback_t rgb_encode_callback; GB_vblank_callback_t vblank_callback; GB_infrared_callback_t infrared_callback; @@ -496,7 +496,6 @@ void GB_queue_infrared_input(GB_gameboy_t *gb, bool state, long cycles_after_pre void GB_set_vblank_callback(GB_gameboy_t *gb, GB_vblank_callback_t callback); void GB_set_log_callback(GB_gameboy_t *gb, GB_log_callback_t callback); void GB_set_input_callback(GB_gameboy_t *gb, GB_input_callback_t callback); -void GB_set_async_input_callback(GB_gameboy_t *gb, GB_input_callback_t callback); void GB_set_rgb_encode_callback(GB_gameboy_t *gb, GB_rgb_encode_callback_t callback); void GB_set_infrared_callback(GB_gameboy_t *gb, GB_infrared_callback_t callback); void GB_set_rumble_callback(GB_gameboy_t *gb, GB_rumble_callback_t callback); @@ -512,4 +511,7 @@ void GB_serial_set_data(GB_gameboy_t *gb, uint8_t data); void GB_disconnect_serial(GB_gameboy_t *gb); +void GB_set_lagged(GB_gameboy_t *gb, bool lagged); +bool GB_get_lagged(GB_gameboy_t *gb); + #endif /* GB_h */ diff --git a/waterbox/sameboy/memory.c b/waterbox/sameboy/memory.c index 7ae5368d70..f53aac608d 100644 --- a/waterbox/sameboy/memory.c +++ b/waterbox/sameboy/memory.c @@ -137,6 +137,9 @@ static uint8_t read_high_memory(GB_gameboy_t *gb, uint16_t addr) if (addr < 0xFF80) { if (addr == 0xff00 && gb->is_sgb) { + if (gb->input_callback) + gb->input_callback(gb); + gb->lagged = false; return sgb_read_ff00(gb->cycles_since_epoch); } From ee7b0bf20c86e1c48d9a75613dc6067c0dce2540 Mon Sep 17 00:00:00 2001 From: zeromus Date: Wed, 19 Jul 2017 16:50:05 -0500 Subject: [PATCH 36/93] i dont think the xinput joystick->direction mappings sensitivity was right. made them less sensitive. --- BizHawk.Client.EmuHawk/Input/GamePad360.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/BizHawk.Client.EmuHawk/Input/GamePad360.cs b/BizHawk.Client.EmuHawk/Input/GamePad360.cs index ab0a4a2d2a..a93d1dd1b2 100644 --- a/BizHawk.Client.EmuHawk/Input/GamePad360.cs +++ b/BizHawk.Client.EmuHawk/Input/GamePad360.cs @@ -180,8 +180,8 @@ namespace BizHawk.Client.EmuHawk void InitializeButtons() { - const int dzp = 9000; - const int dzn = -9000; + const int dzp = 20000; + const int dzn = -20000; const int dzt = 40; AddItem("A", () => (state.Gamepad.wButtons & (ushort)GamepadButtonFlags.A) != 0); From cf8013af4a642fd0c9ef834bac336b27695f022b Mon Sep 17 00:00:00 2001 From: nattthebear Date: Wed, 19 Jul 2017 18:48:11 -0400 Subject: [PATCH 37/93] sameboy: Add more features for the merciless slave driver --- BizHawk.Client.Common/RomLoader.cs | 4 +- BizHawk.Client.EmuHawk/MainForm.cs | 5 + BizHawk.Client.EmuHawk/tools/GB/GBGPUView.cs | 493 ++++++++++-------- .../Consoles/Nintendo/Gameboy/Gambatte.cs | 20 +- .../Nintendo/Gameboy/IGameboyCommon.cs | 47 +- .../Consoles/Nintendo/Gameboy/LibSameboy.cs | 9 + .../Consoles/Nintendo/Gameboy/Pizza.cs | 2 +- .../Consoles/Nintendo/Gameboy/Sameboy.cs | 51 ++ waterbox/sameboy/bizhawk.cpp | 18 + waterbox/sameboy/display.c | 7 +- waterbox/sameboy/gb.h | 6 +- 11 files changed, 409 insertions(+), 253 deletions(-) diff --git a/BizHawk.Client.Common/RomLoader.cs b/BizHawk.Client.Common/RomLoader.cs index 810c8a303b..d054ab86f6 100644 --- a/BizHawk.Client.Common/RomLoader.cs +++ b/BizHawk.Client.Common/RomLoader.cs @@ -921,8 +921,8 @@ namespace BizHawk.Client.Common if (!Global.Config.GB_AsSGB) { //core = CoreInventory.Instance["GB", "Pizza Boy"]; - //core = CoreInventory.Instance["GB", "Gambatte"]; - core = CoreInventory.Instance["GB", "SameBoy"]; + core = CoreInventory.Instance["GB", "Gambatte"]; + //core = CoreInventory.Instance["GB", "SameBoy"]; } else { diff --git a/BizHawk.Client.EmuHawk/MainForm.cs b/BizHawk.Client.EmuHawk/MainForm.cs index 2274b6ce5e..611c693e20 100644 --- a/BizHawk.Client.EmuHawk/MainForm.cs +++ b/BizHawk.Client.EmuHawk/MainForm.cs @@ -33,6 +33,7 @@ using BizHawk.Emulation.Common.Base_Implementations; using BizHawk.Emulation.Cores.Nintendo.SNES9X; using BizHawk.Emulation.Cores.Consoles.SNK; using BizHawk.Emulation.Cores.Consoles.Sega.PicoDrive; +using BizHawk.Emulation.Cores.Consoles.Nintendo.Gameboy; namespace BizHawk.Client.EmuHawk { @@ -1744,6 +1745,10 @@ namespace BizHawk.Client.EmuHawk { sNESToolStripMenuItem.Visible = true; } + else if (Emulator is Sameboy) + { + GBSubMenu.Visible = true; + } break; case "Coleco": ColecoSubMenu.Visible = true; diff --git a/BizHawk.Client.EmuHawk/tools/GB/GBGPUView.cs b/BizHawk.Client.EmuHawk/tools/GB/GBGPUView.cs index 6151c05677..8dc50567ef 100644 --- a/BizHawk.Client.EmuHawk/tools/GB/GBGPUView.cs +++ b/BizHawk.Client.EmuHawk/tools/GB/GBGPUView.cs @@ -9,13 +9,15 @@ using BizHawk.Emulation.Cores.Nintendo.Gameboy; using BizHawk.Client.EmuHawk.WinFormExtensions; using System.Collections.Generic; using BizHawk.Emulation.Common; +using BizHawk.Emulation.Cores.Consoles.Nintendo.Gameboy; +using BizHawk.Common; namespace BizHawk.Client.EmuHawk { public partial class GBGPUView : Form, IToolFormAutoConfig { [RequiredService] - public Gameboy Gb { get; private set; } + public IGameboyCommon Gb { get; private set; } // TODO: freeze semantics are a bit weird: details for a mouseover or freeze are taken from the current // state, not the state at the last callback (and so can be quite different when update is set to manual). @@ -32,11 +34,8 @@ namespace BizHawk.Client.EmuHawk // g' = 8.25g // b' = 8.25b - // gambatte doesn't modify these memory locations unless you reconstruct, so we can store - private IntPtr _vram; - private IntPtr _bgpal; - private IntPtr _sppal; - private IntPtr _oam; + + private GPUMemoryAreas _memory; private bool _cgb; // set once at start private int _lcdc; // set at each callback @@ -89,13 +88,9 @@ namespace BizHawk.Client.EmuHawk _cgb = Gb.IsCGBMode(); _lcdc = 0; - // TODO: can this be a required Emulator Service, and let the tool manage the logic of closing? - if (!Gb.GetGPUMemoryAreas(out _vram, out _bgpal, out _sppal, out _oam)) - { - if (Visible) - Close(); - } - tilespal = _bgpal; + _memory = Gb.GetGPU(); + + tilespal = _memory.Bgpal; if (_cgb) label4.Enabled = true; @@ -357,112 +352,120 @@ namespace BizHawk.Client.EmuHawk #endregion - void ScanlineCallback(int lcdc) + void ScanlineCallback(byte lcdc) { - _lcdc = lcdc; - // set alpha on all pixels - unsafe + using (_memory.EnterExit()) { - int* p = (int*)_bgpal; - for (int i = 0; i < 32; i++) - p[i] |= unchecked((int)0xff000000); - p = (int*)_sppal; - for (int i = 0; i < 32; i++) - p[i] |= unchecked((int)0xff000000); - int c = Spriteback.ToArgb(); - for (int i = 0; i < 32; i += 4) - p[i] = c; - } + var _bgpal = _memory.Bgpal; + var _sppal = _memory.Sppal; + var _oam = _memory.Oam; + var _vram = _memory.Vram; - // bg maps - if (!_cgb) - { - DrawBGDMG( - bmpViewBG.BMP, - _vram + (lcdc.Bit(3) ? 0x1c00 : 0x1800), - _vram + (lcdc.Bit(4) ? 0x0000 : 0x1000), - !lcdc.Bit(4), - _bgpal); + _lcdc = lcdc; + // set alpha on all pixels + // TODO: RE: Spriteback, you can't muck with Sameboy in this way due to how SGB reads stuff...? + /*unsafe + { + int* p = (int*)_bgpal; + for (int i = 0; i < 32; i++) + p[i] |= unchecked((int)0xff000000); + p = (int*)_sppal; + for (int i = 0; i < 32; i++) + p[i] |= unchecked((int)0xff000000); + int c = Spriteback.ToArgb(); + for (int i = 0; i < 32; i += 4) + p[i] = c; + }*/ - DrawBGDMG( - bmpViewWin.BMP, - _vram + (lcdc.Bit(6) ? 0x1c00 : 0x1800), - _vram + 0x1000, // force win to second tile bank??? - true, - _bgpal); - } - else - { - DrawBGCGB( - bmpViewBG.BMP, - _vram + (lcdc.Bit(3) ? 0x1c00 : 0x1800), - _vram + (lcdc.Bit(4) ? 0x0000 : 0x1000), - !lcdc.Bit(4), - _bgpal); + // bg maps + if (!_cgb) + { + DrawBGDMG( + bmpViewBG.BMP, + _vram + (lcdc.Bit(3) ? 0x1c00 : 0x1800), + _vram + (lcdc.Bit(4) ? 0x0000 : 0x1000), + !lcdc.Bit(4), + _bgpal); - DrawBGCGB( - bmpViewWin.BMP, - _vram + (lcdc.Bit(6) ? 0x1c00 : 0x1800), - _vram + 0x1000, // force win to second tile bank??? - true, - _bgpal); - } - bmpViewBG.Refresh(); - bmpViewWin.Refresh(); + DrawBGDMG( + bmpViewWin.BMP, + _vram + (lcdc.Bit(6) ? 0x1c00 : 0x1800), + _vram + 0x1000, // force win to second tile bank??? + true, + _bgpal); + } + else + { + DrawBGCGB( + bmpViewBG.BMP, + _vram + (lcdc.Bit(3) ? 0x1c00 : 0x1800), + _vram + (lcdc.Bit(4) ? 0x0000 : 0x1000), + !lcdc.Bit(4), + _bgpal); - // tile display - // TODO: user selects palette to use, instead of fixed palette 0 - // or possibly "smart" where, if a tile is in use, it's drawn with one of the palettes actually being used with it? - DrawTiles(bmpViewTiles1.BMP, _vram, tilespal); - bmpViewTiles1.Refresh(); - if (_cgb) - { - DrawTiles(bmpViewTiles2.BMP, _vram + 0x2000, tilespal); - bmpViewTiles2.Refresh(); - } + DrawBGCGB( + bmpViewWin.BMP, + _vram + (lcdc.Bit(6) ? 0x1c00 : 0x1800), + _vram + 0x1000, // force win to second tile bank??? + true, + _bgpal); + } + bmpViewBG.Refresh(); + bmpViewWin.Refresh(); - // palettes - if (_cgb) - { - bmpViewBGPal.ChangeBitmapSize(8, 4); - if (bmpViewBGPal.Width != 128) - bmpViewBGPal.Width = 128; - bmpViewSPPal.ChangeBitmapSize(8, 4); - if (bmpViewSPPal.Width != 128) - bmpViewSPPal.Width = 128; - DrawPal(bmpViewBGPal.BMP, _bgpal, 8); - DrawPal(bmpViewSPPal.BMP, _sppal, 8); - } - else - { - bmpViewBGPal.ChangeBitmapSize(1, 4); - if (bmpViewBGPal.Width != 16) - bmpViewBGPal.Width = 16; - bmpViewSPPal.ChangeBitmapSize(2, 4); - if (bmpViewSPPal.Width != 32) - bmpViewSPPal.Width = 32; - DrawPal(bmpViewBGPal.BMP, _bgpal, 1); - DrawPal(bmpViewSPPal.BMP, _sppal, 2); - } - bmpViewBGPal.Refresh(); - bmpViewSPPal.Refresh(); + // tile display + // TODO: user selects palette to use, instead of fixed palette 0 + // or possibly "smart" where, if a tile is in use, it's drawn with one of the palettes actually being used with it? + DrawTiles(bmpViewTiles1.BMP, _vram, tilespal); + bmpViewTiles1.Refresh(); + if (_cgb) + { + DrawTiles(bmpViewTiles2.BMP, _vram + 0x2000, tilespal); + bmpViewTiles2.Refresh(); + } - // oam - if (lcdc.Bit(2)) // 8x16 - { - bmpViewOAM.ChangeBitmapSize(320, 16); - if (bmpViewOAM.Height != 16) - bmpViewOAM.Height = 16; - } - else - { - bmpViewOAM.ChangeBitmapSize(320, 8); - if (bmpViewOAM.Height != 8) - bmpViewOAM.Height = 8; - } - DrawOam(bmpViewOAM.BMP, _oam, _vram, _sppal, lcdc.Bit(2), _cgb); - bmpViewOAM.Refresh(); + // palettes + if (_cgb) + { + bmpViewBGPal.ChangeBitmapSize(8, 4); + if (bmpViewBGPal.Width != 128) + bmpViewBGPal.Width = 128; + bmpViewSPPal.ChangeBitmapSize(8, 4); + if (bmpViewSPPal.Width != 128) + bmpViewSPPal.Width = 128; + DrawPal(bmpViewBGPal.BMP, _bgpal, 8); + DrawPal(bmpViewSPPal.BMP, _sppal, 8); + } + else + { + bmpViewBGPal.ChangeBitmapSize(1, 4); + if (bmpViewBGPal.Width != 16) + bmpViewBGPal.Width = 16; + bmpViewSPPal.ChangeBitmapSize(2, 4); + if (bmpViewSPPal.Width != 32) + bmpViewSPPal.Width = 32; + DrawPal(bmpViewBGPal.BMP, _bgpal, 1); + DrawPal(bmpViewSPPal.BMP, _sppal, 2); + } + bmpViewBGPal.Refresh(); + bmpViewSPPal.Refresh(); + // oam + if (lcdc.Bit(2)) // 8x16 + { + bmpViewOAM.ChangeBitmapSize(320, 16); + if (bmpViewOAM.Height != 16) + bmpViewOAM.Height = 16; + } + else + { + bmpViewOAM.ChangeBitmapSize(320, 8); + if (bmpViewOAM.Height != 8) + bmpViewOAM.Height = 8; + } + DrawOam(bmpViewOAM.BMP, _oam, _vram, _sppal, lcdc.Bit(2), _cgb); + bmpViewOAM.Refresh(); + } // try to run the current mouseover, to refresh if the mouse is being held over a pane while the emulator runs // this doesn't really work well; the update rate seems to be throttled MouseEventArgs e = new MouseEventArgs(MouseButtons.None, 0, Cursor.Position.X, Cursor.Position.Y, 0); @@ -514,7 +517,7 @@ namespace BizHawk.Client.EmuHawk private void buttonRefresh_Click(object sender, EventArgs e) { - if (cbscanline == -2 && Gb != null) + if (cbscanline == -2) Gb.SetScanlineCallback(ScanlineCallback, -2); } @@ -614,145 +617,177 @@ namespace BizHawk.Client.EmuHawk private unsafe void PaletteMouseover(int x, int y, bool sprite) { - bmpViewDetails.ChangeBitmapSize(8, 10); - if (bmpViewDetails.Height != 80) - bmpViewDetails.Height = 80; - var sb = new StringBuilder(); - x /= 16; - y /= 16; - int* pal = (int*)(sprite ? _sppal : _bgpal) + x * 4; - int color = pal[y]; - - sb.AppendLine(string.Format("Palette {0}", x)); - sb.AppendLine(string.Format("Color {0}", y)); - sb.AppendLine(string.Format("(R,G,B) = ({0},{1},{2})", color >> 16 & 255, color >> 8 & 255, color & 255)); - - var lockdata = bmpViewDetails.BMP.LockBits(new Rectangle(0, 0, 8, 10), System.Drawing.Imaging.ImageLockMode.WriteOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb); - int* dest = (int*)lockdata.Scan0; - int pitch = lockdata.Stride / sizeof(int); - - for (int py = 0; py < 10; py++) + using (_memory.EnterExit()) { - for (int px = 0; px < 8; px++) + var _bgpal = _memory.Bgpal; + var _sppal = _memory.Sppal; + var _oam = _memory.Oam; + var _vram = _memory.Vram; + + bmpViewDetails.ChangeBitmapSize(8, 10); + if (bmpViewDetails.Height != 80) + bmpViewDetails.Height = 80; + var sb = new StringBuilder(); + x /= 16; + y /= 16; + int* pal = (int*)(sprite ? _sppal : _bgpal) + x * 4; + int color = pal[y]; + + sb.AppendLine(string.Format("Palette {0}", x)); + sb.AppendLine(string.Format("Color {0}", y)); + sb.AppendLine(string.Format("(R,G,B) = ({0},{1},{2})", color >> 16 & 255, color >> 8 & 255, color & 255)); + + var lockdata = bmpViewDetails.BMP.LockBits(new Rectangle(0, 0, 8, 10), System.Drawing.Imaging.ImageLockMode.WriteOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb); + int* dest = (int*)lockdata.Scan0; + int pitch = lockdata.Stride / sizeof(int); + + for (int py = 0; py < 10; py++) { - if (py < 8) - *dest++ = color; - else - *dest++ = pal[px / 2]; + for (int px = 0; px < 8; px++) + { + if (py < 8) + *dest++ = color; + else + *dest++ = pal[px / 2]; + } + dest -= 8; + dest += pitch; } - dest -= 8; - dest += pitch; + bmpViewDetails.BMP.UnlockBits(lockdata); + labelDetails.Text = sb.ToString(); + bmpViewDetails.Refresh(); } - bmpViewDetails.BMP.UnlockBits(lockdata); - labelDetails.Text = sb.ToString(); - bmpViewDetails.Refresh(); } unsafe void TileMouseover(int x, int y, bool secondbank) { - // todo: draw with a specific palette - bmpViewDetails.ChangeBitmapSize(8, 8); - if (bmpViewDetails.Height != 64) - bmpViewDetails.Height = 64; - var sb = new StringBuilder(); - x /= 8; - y /= 8; - int tileindex = y * 16 + x; - int tileoffs = tileindex * 16; - if (_cgb) - sb.AppendLine(string.Format("Tile #{0} @{2}:{1:x4}", tileindex, tileoffs + 0x8000, secondbank ? 1 : 0)); - else - sb.AppendLine(string.Format("Tile #{0} @{1:x4}", tileindex, tileoffs + 0x8000)); + using (_memory.EnterExit()) + { + var _bgpal = _memory.Bgpal; + var _sppal = _memory.Sppal; + var _oam = _memory.Oam; + var _vram = _memory.Vram; - var lockdata = bmpViewDetails.BMP.LockBits(new Rectangle(0, 0, 8, 8), System.Drawing.Imaging.ImageLockMode.WriteOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb); - DrawTile((byte*)_vram + tileoffs + (secondbank ? 8192 : 0), (int*)lockdata.Scan0, lockdata.Stride / sizeof(int), (int*)tilespal); - bmpViewDetails.BMP.UnlockBits(lockdata); - labelDetails.Text = sb.ToString(); - bmpViewDetails.Refresh(); + // todo: draw with a specific palette + bmpViewDetails.ChangeBitmapSize(8, 8); + if (bmpViewDetails.Height != 64) + bmpViewDetails.Height = 64; + var sb = new StringBuilder(); + x /= 8; + y /= 8; + int tileindex = y * 16 + x; + int tileoffs = tileindex * 16; + if (_cgb) + sb.AppendLine(string.Format("Tile #{0} @{2}:{1:x4}", tileindex, tileoffs + 0x8000, secondbank ? 1 : 0)); + else + sb.AppendLine(string.Format("Tile #{0} @{1:x4}", tileindex, tileoffs + 0x8000)); + + var lockdata = bmpViewDetails.BMP.LockBits(new Rectangle(0, 0, 8, 8), System.Drawing.Imaging.ImageLockMode.WriteOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb); + DrawTile((byte*)_vram + tileoffs + (secondbank ? 8192 : 0), (int*)lockdata.Scan0, lockdata.Stride / sizeof(int), (int*)tilespal); + bmpViewDetails.BMP.UnlockBits(lockdata); + labelDetails.Text = sb.ToString(); + bmpViewDetails.Refresh(); + } } unsafe void TilemapMouseover(int x, int y, bool win) { - bmpViewDetails.ChangeBitmapSize(8, 8); - if (bmpViewDetails.Height != 64) - bmpViewDetails.Height = 64; - var sb = new StringBuilder(); - bool secondmap = win ? _lcdc.Bit(6) : _lcdc.Bit(3); - int mapoffs = secondmap ? 0x1c00 : 0x1800; - x /= 8; - y /= 8; - mapoffs += y * 32 + x; - byte* mapbase = (byte*)_vram + mapoffs; - int tileindex = mapbase[0]; - if (win || !_lcdc.Bit(4)) // 0x9000 base - if (tileindex < 128) - tileindex += 256; // compute all if from 0x8000 base - int tileoffs = tileindex * 16; - var lockdata = bmpViewDetails.BMP.LockBits(new Rectangle(0, 0, 8, 8), System.Drawing.Imaging.ImageLockMode.WriteOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb); - if (!_cgb) + using (_memory.EnterExit()) { - sb.AppendLine(string.Format("{0} Map ({1},{2}) @{3:x4}", win ? "Win" : "BG", x, y, mapoffs + 0x8000)); - sb.AppendLine(string.Format(" Tile #{0} @{1:x4}", tileindex, tileoffs + 0x8000)); - DrawTile((byte*)_vram + tileoffs, (int*)lockdata.Scan0, lockdata.Stride / sizeof(int), (int*)_bgpal); - } - else - { - int tileext = mapbase[8192]; + var _bgpal = _memory.Bgpal; + var _sppal = _memory.Sppal; + var _oam = _memory.Oam; + var _vram = _memory.Vram; - sb.AppendLine(string.Format("{0} Map ({1},{2}) @{3:x4}", win ? "Win" : "BG", x, y, mapoffs + 0x8000)); - sb.AppendLine(string.Format(" Tile #{0} @{2}:{1:x4}", tileindex, tileoffs + 0x8000, tileext.Bit(3) ? 1 : 0)); - sb.AppendLine(string.Format(" Palette {0}", tileext & 7)); - sb.AppendLine(string.Format(" Flags {0}{1}{2}", tileext.Bit(5) ? 'H' : ' ', tileext.Bit(6) ? 'V' : ' ', tileext.Bit(7) ? 'P' : ' ')); - DrawTileHv((byte*)_vram + tileoffs + (tileext.Bit(3) ? 8192 : 0), (int*)lockdata.Scan0, lockdata.Stride / sizeof(int), (int*)_bgpal + 4 * (tileext & 7), tileext.Bit(5), tileext.Bit(6)); + bmpViewDetails.ChangeBitmapSize(8, 8); + if (bmpViewDetails.Height != 64) + bmpViewDetails.Height = 64; + var sb = new StringBuilder(); + bool secondmap = win ? _lcdc.Bit(6) : _lcdc.Bit(3); + int mapoffs = secondmap ? 0x1c00 : 0x1800; + x /= 8; + y /= 8; + mapoffs += y * 32 + x; + byte* mapbase = (byte*)_vram + mapoffs; + int tileindex = mapbase[0]; + if (win || !_lcdc.Bit(4)) // 0x9000 base + if (tileindex < 128) + tileindex += 256; // compute all if from 0x8000 base + int tileoffs = tileindex * 16; + var lockdata = bmpViewDetails.BMP.LockBits(new Rectangle(0, 0, 8, 8), System.Drawing.Imaging.ImageLockMode.WriteOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb); + if (!_cgb) + { + sb.AppendLine(string.Format("{0} Map ({1},{2}) @{3:x4}", win ? "Win" : "BG", x, y, mapoffs + 0x8000)); + sb.AppendLine(string.Format(" Tile #{0} @{1:x4}", tileindex, tileoffs + 0x8000)); + DrawTile((byte*)_vram + tileoffs, (int*)lockdata.Scan0, lockdata.Stride / sizeof(int), (int*)_bgpal); + } + else + { + int tileext = mapbase[8192]; + + sb.AppendLine(string.Format("{0} Map ({1},{2}) @{3:x4}", win ? "Win" : "BG", x, y, mapoffs + 0x8000)); + sb.AppendLine(string.Format(" Tile #{0} @{2}:{1:x4}", tileindex, tileoffs + 0x8000, tileext.Bit(3) ? 1 : 0)); + sb.AppendLine(string.Format(" Palette {0}", tileext & 7)); + sb.AppendLine(string.Format(" Flags {0}{1}{2}", tileext.Bit(5) ? 'H' : ' ', tileext.Bit(6) ? 'V' : ' ', tileext.Bit(7) ? 'P' : ' ')); + DrawTileHv((byte*)_vram + tileoffs + (tileext.Bit(3) ? 8192 : 0), (int*)lockdata.Scan0, lockdata.Stride / sizeof(int), (int*)_bgpal + 4 * (tileext & 7), tileext.Bit(5), tileext.Bit(6)); + } + bmpViewDetails.BMP.UnlockBits(lockdata); + labelDetails.Text = sb.ToString(); + bmpViewDetails.Refresh(); } - bmpViewDetails.BMP.UnlockBits(lockdata); - labelDetails.Text = sb.ToString(); - bmpViewDetails.Refresh(); } unsafe void SpriteMouseover(int x, int y) { - bool tall = _lcdc.Bit(2); - x /= 8; - y /= 8; - bmpViewDetails.ChangeBitmapSize(8, tall ? 16 : 8); - if (bmpViewDetails.Height != bmpViewDetails.BMP.Height * 8) - bmpViewDetails.Height = bmpViewDetails.BMP.Height * 8; - var sb = new StringBuilder(); + using (_memory.EnterExit()) + { + var _bgpal = _memory.Bgpal; + var _sppal = _memory.Sppal; + var _oam = _memory.Oam; + var _vram = _memory.Vram; - byte* oament = (byte*)_oam + 4 * x; - int sy = oament[0]; - int sx = oament[1]; - int tilenum = oament[2]; - int flags = oament[3]; - bool hflip = flags.Bit(5); - bool vflip = flags.Bit(6); - if (tall) - tilenum = vflip ? tilenum | 1 : tilenum & ~1; - int tileoffs = tilenum * 16; - sb.AppendLine(string.Format("Sprite #{0} @{1:x4}", x, 4 * x + 0xfe00)); - sb.AppendLine(string.Format(" (x,y) = ({0},{1})", sx, sy)); - var lockdata = bmpViewDetails.BMP.LockBits(new Rectangle(0, 0, 8, tall ? 16 : 8), System.Drawing.Imaging.ImageLockMode.WriteOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb); - if (_cgb) - { - sb.AppendLine(string.Format(" Tile #{0} @{2}:{1:x4}", y == 1 ? tilenum ^ 1 : tilenum, tileoffs + 0x8000, flags.Bit(3) ? 1 : 0)); - sb.AppendLine(string.Format(" Palette {0}", flags & 7)); - DrawTileHv((byte*)_vram + tileoffs + (flags.Bit(3) ? 8192 : 0), (int*)lockdata.Scan0, lockdata.Stride / sizeof(int), (int*)_sppal + 4 * (flags & 7), hflip, vflip); + bool tall = _lcdc.Bit(2); + x /= 8; + y /= 8; + bmpViewDetails.ChangeBitmapSize(8, tall ? 16 : 8); + if (bmpViewDetails.Height != bmpViewDetails.BMP.Height * 8) + bmpViewDetails.Height = bmpViewDetails.BMP.Height * 8; + var sb = new StringBuilder(); + + byte* oament = (byte*)_oam + 4 * x; + int sy = oament[0]; + int sx = oament[1]; + int tilenum = oament[2]; + int flags = oament[3]; + bool hflip = flags.Bit(5); + bool vflip = flags.Bit(6); if (tall) - DrawTileHv((byte*)_vram + (tileoffs ^ 16) + (flags.Bit(3) ? 8192 : 0), (int*)(lockdata.Scan0 + lockdata.Stride * 8), lockdata.Stride / sizeof(int), (int*)_sppal + 4 * (flags & 7), hflip, vflip); + tilenum = vflip ? tilenum | 1 : tilenum & ~1; + int tileoffs = tilenum * 16; + sb.AppendLine(string.Format("Sprite #{0} @{1:x4}", x, 4 * x + 0xfe00)); + sb.AppendLine(string.Format(" (x,y) = ({0},{1})", sx, sy)); + var lockdata = bmpViewDetails.BMP.LockBits(new Rectangle(0, 0, 8, tall ? 16 : 8), System.Drawing.Imaging.ImageLockMode.WriteOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb); + if (_cgb) + { + sb.AppendLine(string.Format(" Tile #{0} @{2}:{1:x4}", y == 1 ? tilenum ^ 1 : tilenum, tileoffs + 0x8000, flags.Bit(3) ? 1 : 0)); + sb.AppendLine(string.Format(" Palette {0}", flags & 7)); + DrawTileHv((byte*)_vram + tileoffs + (flags.Bit(3) ? 8192 : 0), (int*)lockdata.Scan0, lockdata.Stride / sizeof(int), (int*)_sppal + 4 * (flags & 7), hflip, vflip); + if (tall) + DrawTileHv((byte*)_vram + (tileoffs ^ 16) + (flags.Bit(3) ? 8192 : 0), (int*)(lockdata.Scan0 + lockdata.Stride * 8), lockdata.Stride / sizeof(int), (int*)_sppal + 4 * (flags & 7), hflip, vflip); + } + else + { + sb.AppendLine(string.Format(" Tile #{0} @{1:x4}", y == 1 ? tilenum ^ 1 : tilenum, tileoffs + 0x8000)); + sb.AppendLine(string.Format(" Palette {0}", flags.Bit(4) ? 1 : 0)); + DrawTileHv((byte*)_vram + tileoffs, (int*)lockdata.Scan0, lockdata.Stride / sizeof(int), (int*)_sppal + (flags.Bit(4) ? 4 : 0), hflip, vflip); + if (tall) + DrawTileHv((byte*)_vram + (tileoffs ^ 16), (int*)(lockdata.Scan0 + lockdata.Stride * 8), lockdata.Stride / sizeof(int), (int*)_sppal + 4 * (flags.Bit(4) ? 4 : 0), hflip, vflip); + } + sb.AppendLine(string.Format(" Flags {0}{1}{2}", hflip ? 'H' : ' ', vflip ? 'V' : ' ', flags.Bit(7) ? 'P' : ' ')); + bmpViewDetails.BMP.UnlockBits(lockdata); + labelDetails.Text = sb.ToString(); + bmpViewDetails.Refresh(); } - else - { - sb.AppendLine(string.Format(" Tile #{0} @{1:x4}", y == 1 ? tilenum ^ 1 : tilenum, tileoffs + 0x8000)); - sb.AppendLine(string.Format(" Palette {0}", flags.Bit(4) ? 1 : 0)); - DrawTileHv((byte*)_vram + tileoffs, (int*)lockdata.Scan0, lockdata.Stride / sizeof(int), (int*)_sppal + (flags.Bit(4) ? 4 : 0), hflip, vflip); - if (tall) - DrawTileHv((byte*)_vram + (tileoffs ^ 16), (int*)(lockdata.Scan0 + lockdata.Stride * 8), lockdata.Stride / sizeof(int), (int*)_sppal + 4 * (flags.Bit(4) ? 4 : 0), hflip, vflip); - } - sb.AppendLine(string.Format(" Flags {0}{1}{2}", hflip ? 'H' : ' ', vflip ? 'V' : ' ', flags.Bit(7) ? 'P' : ' ')); - bmpViewDetails.BMP.UnlockBits(lockdata); - labelDetails.Text = sb.ToString(); - bmpViewDetails.Refresh(); } private void bmpViewBG_MouseEnter(object sender, EventArgs e) @@ -882,9 +917,9 @@ namespace BizHawk.Client.EmuHawk else if (e.Button == MouseButtons.Left) { if (sender == bmpViewBGPal) - tilespal = _bgpal + e.X / 16 * 16; + tilespal = _memory.Bgpal + e.X / 16 * 16; else if (sender == bmpViewSPPal) - tilespal = _sppal + e.X / 16 * 16; + tilespal = _memory.Sppal + e.X / 16 * 16; } } diff --git a/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/Gambatte.cs b/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/Gambatte.cs index 9e04730e4a..864cdd856d 100644 --- a/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/Gambatte.cs +++ b/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/Gambatte.cs @@ -439,7 +439,7 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy #region ppudebug - public bool GetGPUMemoryAreas(out IntPtr vram, out IntPtr bgpal, out IntPtr sppal, out IntPtr oam) + public GPUMemoryAreas GetGPU() { IntPtr _vram = IntPtr.Zero; IntPtr _bgpal = IntPtr.Zero; @@ -451,23 +451,11 @@ namespace BizHawk.Emulation.Cores.Nintendo.Gameboy || !LibGambatte.gambatte_getmemoryarea(GambatteState, LibGambatte.MemoryAreas.sppal, ref _sppal, ref unused) || !LibGambatte.gambatte_getmemoryarea(GambatteState, LibGambatte.MemoryAreas.oam, ref _oam, ref unused)) { - vram = IntPtr.Zero; - bgpal = IntPtr.Zero; - sppal = IntPtr.Zero; - oam = IntPtr.Zero; - return false; + throw new InvalidOperationException("Unexpected error in gambatte_getmemoryarea"); } - vram = _vram; - bgpal = _bgpal; - sppal = _sppal; - oam = _oam; - return true; - } + return new GPUMemoryAreas(_vram, _oam, _sppal, _bgpal); - /// - /// - /// current value of register $ff40 (LCDC) - public delegate void ScanlineCallback(int lcdc); + } /// /// set up callback diff --git a/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/IGameboyCommon.cs b/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/IGameboyCommon.cs index fa236b8f47..b874919ad7 100644 --- a/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/IGameboyCommon.cs +++ b/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/IGameboyCommon.cs @@ -1,4 +1,6 @@ -using System; +using BizHawk.Common; +using BizHawk.Emulation.Common; +using System; using System.Collections.Generic; using System.Linq; using System.Text; @@ -6,8 +8,49 @@ using System.Threading.Tasks; namespace BizHawk.Emulation.Cores.Consoles.Nintendo.Gameboy { - public interface IGameboyCommon + /// + /// + /// current value of register $ff40 (LCDC) + public delegate void ScanlineCallback(byte lcdc); + + public interface IGameboyCommon : ISpecializedEmulatorService { bool IsCGBMode(); + GPUMemoryAreas GetGPU(); + + /// + /// set up callback + /// + /// scanline. -1 = end of frame, -2 = RIGHT NOW + void SetScanlineCallback(ScanlineCallback callback, int line); + } + + public class GPUMemoryAreas : IMonitor + { + public IntPtr Vram { get; } + public IntPtr Oam { get; } + public IntPtr Sppal { get; } + public IntPtr Bgpal { get; } + + private readonly IMonitor _monitor; + + public GPUMemoryAreas(IntPtr vram, IntPtr oam, IntPtr sppal, IntPtr bgpal, IMonitor monitor = null) + { + Vram = vram; + Oam = oam; + Sppal = sppal; + Bgpal = bgpal; + _monitor = monitor; + } + + public void Enter() + { + _monitor?.Enter(); + } + + public void Exit() + { + _monitor?.Exit(); + } } } diff --git a/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/LibSameboy.cs b/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/LibSameboy.cs index 4801cd7d45..aba870b558 100644 --- a/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/LibSameboy.cs +++ b/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/LibSameboy.cs @@ -33,5 +33,14 @@ namespace BizHawk.Emulation.Cores.Consoles.Nintendo.Gameboy [BizImport(CC)] public abstract bool Init(bool cgb, byte[] spc, int spclen); + + [BizImport(CC)] + public abstract void GetGpuMemory(IntPtr[] ptrs); + + [BizImport(CC)] + public abstract void SetScanlineCallback(ScanlineCallback callback, int ly); + + [BizImport(CC)] + public abstract byte GetIoReg(byte port); } } diff --git a/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/Pizza.cs b/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/Pizza.cs index 52b966647b..90fecb3b99 100644 --- a/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/Pizza.cs +++ b/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/Pizza.cs @@ -13,7 +13,7 @@ namespace BizHawk.Emulation.Cores.Consoles.Nintendo.Gameboy { [Core("Pizza Boy", "Davide Berra", true, true, "c7bc6ee376028b3766de8d7a02e60ab794841f45", "https://github.com/davideberra/emu-pizza/", false)] - public class Pizza : WaterboxCore, IGameboyCommon + public class Pizza : WaterboxCore { private LibPizza _pizza; private readonly bool _sgb; diff --git a/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/Sameboy.cs b/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/Sameboy.cs index a82a4e2e21..aaa1a1a006 100644 --- a/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/Sameboy.cs +++ b/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/Sameboy.cs @@ -88,6 +88,10 @@ namespace BizHawk.Emulation.Cores.Consoles.Nintendo.Gameboy _exe.RemoveReadonlyFile("boot.rom"); PostInit(); + + var scratch = new IntPtr[4]; + _core.GetGpuMemory(scratch); + _gpuMemory = new GPUMemoryAreas(scratch[0], scratch[1], scratch[3], scratch[2], _exe); } #region Controller @@ -152,6 +156,53 @@ namespace BizHawk.Emulation.Cores.Consoles.Nintendo.Gameboy }; } + protected override void FrameAdvancePost() + { + if (_scanlineCallback != null && _scanlineCallbackLine == -1) + _scanlineCallback(_core.GetIoReg(0x40)); + } + + protected override void LoadStateBinaryInternal(BinaryReader reader) + { + UpdateCoreScanlineCallback(false); + } + public bool IsCGBMode() => _cgb; + + private GPUMemoryAreas _gpuMemory; + + public GPUMemoryAreas GetGPU() => _gpuMemory; + private ScanlineCallback _scanlineCallback; + private int _scanlineCallbackLine; + + public void SetScanlineCallback(ScanlineCallback callback, int line) + { + _scanlineCallback = callback; + _scanlineCallbackLine = line; + UpdateCoreScanlineCallback(true); + } + + private void UpdateCoreScanlineCallback(bool now) + { + if (_scanlineCallback == null) + { + _core.SetScanlineCallback(null, -1); + } + else + { + if (_scanlineCallbackLine >= 0 && _scanlineCallbackLine <= 153) + { + _core.SetScanlineCallback(_scanlineCallback, _scanlineCallbackLine); + } + else + { + _core.SetScanlineCallback(null, -1); + if (_scanlineCallbackLine == -2 && now) + { + _scanlineCallback(_core.GetIoReg(0x40)); + } + } + } + } } } diff --git a/waterbox/sameboy/bizhawk.cpp b/waterbox/sameboy/bizhawk.cpp index 531e4f4eeb..15db12b9d6 100644 --- a/waterbox/sameboy/bizhawk.cpp +++ b/waterbox/sameboy/bizhawk.cpp @@ -207,6 +207,24 @@ ECL_EXPORT void SetInputCallback(void (*callback)()) GB_set_input_callback(&GB, callback ? InputCallback : nullptr); } +ECL_EXPORT void GetGpuMemory(void **p) +{ + p[0] = GB_get_direct_access(&GB, GB_DIRECT_ACCESS_VRAM, nullptr, nullptr); + p[1] = GB_get_direct_access(&GB, GB_DIRECT_ACCESS_OAM, nullptr, nullptr); + p[2] = GB.background_palettes_rgb; + p[3] = GB.sprite_palettes_rgb; +} + +ECL_EXPORT void SetScanlineCallback(void (*callback)(uint8_t), int ly) +{ + GB.scanline_callback = callback; + GB.scanline_callback_ly = ly; +} +ECL_EXPORT uint8_t GetIoReg(uint8_t port) +{ + return GB.io_registers[port]; +} + int main() { return 0; diff --git a/waterbox/sameboy/display.c b/waterbox/sameboy/display.c index d2ee911619..28dd5f07ec 100644 --- a/waterbox/sameboy/display.c +++ b/waterbox/sameboy/display.c @@ -296,7 +296,10 @@ static void update_display_state(GB_gameboy_t *gb, uint8_t cycles) } bool should_compare_ly = true; uint8_t ly_for_comparison = gb->io_registers[GB_IO_LY] = gb->display_cycles / LINE_LENGTH; - + + if (gb->scanline_callback && gb->display_cycles % LINE_LENGTH == 0 && gb->scanline_callback_ly == ly_for_comparison) { + gb->scanline_callback(gb->io_registers[GB_IO_LCDC]); + } /* Handle cycle completion. STAT's initial value depends on model and mode */ if (gb->display_cycles == LCDC_PERIOD) { @@ -380,7 +383,7 @@ static void update_display_state(GB_gameboy_t *gb, uint8_t cycles) /* Handle STAT changes for lines 0-143 */ else if (gb->display_cycles < LINES * LINE_LENGTH) { unsigned position_in_line = gb->display_cycles % LINE_LENGTH; - + /* Handle OAM and VRAM blocking */ /* Todo: verify CGB timing for write blocking */ if (position_in_line == stat_delay - oam_blocking_rush || diff --git a/waterbox/sameboy/gb.h b/waterbox/sameboy/gb.h index 9b5f4613dd..91d29effe4 100644 --- a/waterbox/sameboy/gb.h +++ b/waterbox/sameboy/gb.h @@ -172,6 +172,7 @@ typedef void (*GB_rumble_callback_t)(GB_gameboy_t *gb, bool rumble_on); typedef void (*GB_serial_transfer_start_callback_t)(GB_gameboy_t *gb, uint8_t byte_to_send); typedef uint8_t (*GB_serial_transfer_end_callback_t)(GB_gameboy_t *gb); typedef void (*GB_sample_callback_t)(GB_gameboy_t *gb, GB_sample_t sample, uint64_t clock); +typedef void (*GB_scanline_callback_t)(uint8_t lcdc); typedef struct { bool state; @@ -400,7 +401,10 @@ struct GB_gameboy_internal_s { GB_serial_transfer_start_callback_t serial_transfer_start_callback; GB_serial_transfer_end_callback_t serial_transfer_end_callback; GB_sample_callback_t sample_callback; - + + GB_scanline_callback_t scanline_callback; + int scanline_callback_ly; + /* IR */ long cycles_since_ir_change; long cycles_since_input_ir_change; From 16467c3cb0b33943e85d02a8c790f1ff38ada088 Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Wed, 19 Jul 2017 19:19:00 -0400 Subject: [PATCH 38/93] A7800Hawk: Start Supergame Mappers --- .../Consoles/Atari/A7800Hawk/A7800Hawk.cs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/A7800Hawk.cs b/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/A7800Hawk.cs index c680c70227..78e2996d6d 100644 --- a/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/A7800Hawk.cs +++ b/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/A7800Hawk.cs @@ -41,7 +41,7 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk public MOS6502X cpu; public Maria maria; - private bool _isPAL; + public bool _isPAL; public M6532 m6532; public TIA tia; @@ -189,6 +189,10 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk { mapper = new MapperDefault(); } + if (m=="A78SG") + { + mapper = new MapperSG(); + } mapper.Core = this; } From a05e7f28241d5338b0f3b214ad51c3b926f72a3f Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Wed, 19 Jul 2017 19:19:37 -0400 Subject: [PATCH 39/93] A7800Hawk: Start Super Game mappers --- .../Atari/A7800Hawk/Mappers/MapperSG.cs | 113 ++++++++++++++++++ 1 file changed, 113 insertions(+) create mode 100644 BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/Mappers/MapperSG.cs diff --git a/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/Mappers/MapperSG.cs b/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/Mappers/MapperSG.cs new file mode 100644 index 0000000000..db327c8312 --- /dev/null +++ b/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/Mappers/MapperSG.cs @@ -0,0 +1,113 @@ +using BizHawk.Common; +using BizHawk.Common.NumberExtensions; +using System; + +namespace BizHawk.Emulation.Cores.Atari.A7800Hawk +{ + // Default mapper with no bank switching + // Just need to keep track of high score bios stuff + public class MapperSG : MapperBase + { + public byte bank = 0; + + public override byte ReadMemory(ushort addr) + { + if (addr >= 0x1000 && addr < 0x1800) + { + //could be hsbios RAM here + if (Core._hsbios != null) + { + return Core._hsram[addr - 0x1000]; + } + return 0xFF; + } + else if (addr < 0x4000) + { + // could be either RAM mirror or ROM + if (addr >= 0x3000 && Core._hsbios != null) + { + return Core._hsbios[addr - 0x3000]; + } + else + { + return Core.RAM[0x800 + addr & 0x7FF]; + } + } + else + { + // cartridge and other OPSYS + if (addr >= (0x10000 - Core._bios.Length) && !Core.A7800_control_register.Bit(2)) + { + return Core._bios[addr - (0x10000 - Core._bios.Length)]; + } + else + { + if (addr >=0xC000) + { + // bank 7 is fixed + return Core._rom[Core._rom.Length - (0x10000 - addr)]; + } + else if (addr >= 0x8000) + { + // reutrn whatever bank is there + int temp_addr = addr - 0x8000; + + return Core._rom[temp_addr + bank * 0x4000]; + } + else + { + // return bank 6 + int temp_addr = addr - 0x4000; + return Core._rom[temp_addr + 6 * 0x4000]; + } + } + } + } + + public override byte PeekMemory(ushort addr) + { + return ReadMemory(addr); + } + + public override void WriteMemory(ushort addr, byte value) + { + if (addr >= 0x1000 && addr < 0x1800) + { + //could be hsbios RAM here + if (Core._hsbios != null) + { + Core._hsram[addr - 0x1000] = value; + } + } + else if (addr < 0x4000) + { + // could be either RAM mirror or ROM + if (addr >= 0x3000 && Core._hsbios != null) + { + } + else + { + Core.RAM[0x800 + addr & 0x7FF] = value; + } + } + else + { + // cartridge and other OPSYS + if (addr>=0x8000) + { + bank = value; + } + } + } + + public override void PokeMemory(ushort addr, byte value) + { + WriteMemory(addr, value); + } + + public override void SyncState(Serializer ser) + { + ser.Sync("Bank", ref bank); + } + } +} From 6e0ad90962c7c6914983a92ad1aaab8a22408d4e Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Wed, 19 Jul 2017 19:21:18 -0400 Subject: [PATCH 40/93] Update BizHawk.Emulation.Cores.csproj --- BizHawk.Emulation.Cores/BizHawk.Emulation.Cores.csproj | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/BizHawk.Emulation.Cores/BizHawk.Emulation.Cores.csproj b/BizHawk.Emulation.Cores/BizHawk.Emulation.Cores.csproj index 07fb3f1ede..64328b3723 100644 --- a/BizHawk.Emulation.Cores/BizHawk.Emulation.Cores.csproj +++ b/BizHawk.Emulation.Cores/BizHawk.Emulation.Cores.csproj @@ -357,6 +357,7 @@ + A7800Hawk.cs @@ -1326,4 +1327,4 @@ --> - \ No newline at end of file + From 57ca86710b8796b54547f37920d978c4e16daf68 Mon Sep 17 00:00:00 2001 From: nattthebear Date: Wed, 19 Jul 2017 19:49:23 -0400 Subject: [PATCH 41/93] sameboy: SAVERAMS --- .../Consoles/Nintendo/Gameboy/LibSameboy.cs | 9 ++ .../Consoles/Nintendo/Gameboy/Sameboy.cs | 22 +++- BizHawk.Emulation.Cores/Waterbox/PeRunner.cs | 114 ++++++++++++++++-- waterbox/sameboy/bizhawk.cpp | 25 +++- 4 files changed, 157 insertions(+), 13 deletions(-) diff --git a/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/LibSameboy.cs b/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/LibSameboy.cs index aba870b558..405635404c 100644 --- a/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/LibSameboy.cs +++ b/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/LibSameboy.cs @@ -42,5 +42,14 @@ namespace BizHawk.Emulation.Cores.Consoles.Nintendo.Gameboy [BizImport(CC)] public abstract byte GetIoReg(byte port); + + [BizImport(CC)] + public abstract void PutSaveRam(); + + [BizImport(CC)] + public abstract void GetSaveRam(); + + [BizImport(CC)] + public abstract bool HasSaveRam(); } } diff --git a/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/Sameboy.cs b/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/Sameboy.cs index aaa1a1a006..928ab1bd62 100644 --- a/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/Sameboy.cs +++ b/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/Sameboy.cs @@ -13,7 +13,7 @@ namespace BizHawk.Emulation.Cores.Consoles.Nintendo.Gameboy { [Core("SameBoy", "LIJI32", true, false, "efc11783c7fb6da66e1dd084e41ba6a85c0bd17e", "https://sameboy.github.io/", false)] - public class Sameboy : WaterboxCore, IGameboyCommon + public class Sameboy : WaterboxCore, IGameboyCommon, ISaveRam { /// /// the nominal length of one frame @@ -147,6 +147,26 @@ namespace BizHawk.Emulation.Cores.Consoles.Nintendo.Gameboy #endregion + #region ISaveram + + public new bool SaveRamModified => _core.HasSaveRam(); + + public new byte[] CloneSaveRam() + { + _exe.AddTransientFile(null, "save.ram"); + _core.GetSaveRam(); + return _exe.RemoveTransientFile("save.ram"); + } + + public new void StoreSaveRam(byte[] data) + { + _exe.AddReadonlyFile(data, "save.ram"); + _core.PutSaveRam(); + _exe.RemoveReadonlyFile("save.ram"); + } + + #endregion + protected override LibWaterboxCore.FrameInfo FrameAdvancePrep(IController controller, bool render, bool rendersound) { return new LibSameboy.FrameInfo diff --git a/BizHawk.Emulation.Cores/Waterbox/PeRunner.cs b/BizHawk.Emulation.Cores/Waterbox/PeRunner.cs index 1db3950b0a..080b91e4b3 100644 --- a/BizHawk.Emulation.Cores/Waterbox/PeRunner.cs +++ b/BizHawk.Emulation.Cores/Waterbox/PeRunner.cs @@ -308,6 +308,68 @@ namespace BizHawk.Emulation.Cores.Waterbox } } + private class TransientFile : IFileObject + { + private bool _inUse = false; + public string Name { get; } + public Stream Stream { get; } + public bool Close() + { + if (_inUse) + { + _inUse = false; + return true; + } + else + { + return false; + } + } + + public bool Open(FileAccess access) + { + if (_inUse) + { + return false; + } + else + { + // TODO: if access != RW, the resultant handle lets you do those all anyway + _inUse = true; + Stream.Position = 0; + return true; + } + } + + public void LoadStateBinary(BinaryReader br) + { + throw new InvalidOperationException("Internal savestate error!"); + } + + public void SaveStateBinary(BinaryWriter bw) + { + throw new InvalidOperationException("Transient files cannot be savestated!"); + } + + public TransientFile(byte[] data, string name) + { + Stream = new MemoryStream(); + Name = name; + if (data != null) + { + Stream.Write(data, 0, data.Length); + Stream.Position = 0; + } + } + + public byte[] GetContents() + { + if (_inUse) + throw new InvalidOperationException(); + return ((MemoryStream)Stream).ToArray(); + } + } + private readonly List _openFiles = new List(); private readonly Dictionary _availableFiles = new Dictionary(); @@ -697,6 +759,21 @@ namespace BizHawk.Emulation.Cores.Waterbox } } + + private T RemoveFileInternal(string name) + where T : IFileObject + { + IFileObject o; + if (!_availableFiles.TryGetValue(name, out o)) + throw new InvalidOperationException("File was never registered!"); + if (o.GetType() != typeof(T)) + throw new InvalidOperationException("Object was not a the right kind of file"); + if (_openFiles.Contains(o)) + throw new InvalidOperationException("Core never closed the file!"); + _availableFiles.Remove(name); + return (T)o; + } + public void AddReadonlyFile(byte[] data, string name) { _availableFiles.Add(name, new ReadonlyFirmware(data, name)); @@ -704,15 +781,16 @@ namespace BizHawk.Emulation.Cores.Waterbox public void RemoveReadonlyFile(string name) { - IFileObject o; - if (!_availableFiles.TryGetValue(name, out o)) - throw new InvalidOperationException("Firmware was never registered!"); - var f = o as ReadonlyFirmware; - if (f == null) - throw new InvalidOperationException("Object was not a firmware!"); - if (_openFiles.Contains(o)) - throw new InvalidOperationException("Core never closed the firmware!"); - _availableFiles.Remove(name); + RemoveFileInternal(name); + } + + public void AddTransientFile(byte[] data, string name) + { + _availableFiles.Add(name, new TransientFile(data, name)); + } + public byte[] RemoveTransientFile(string name) + { + return RemoveFileInternal(name).GetContents(); } } @@ -1090,6 +1168,24 @@ namespace BizHawk.Emulation.Cores.Waterbox _syscalls.RemoveReadonlyFile(name); } + /// + /// Add a transient file that will appear to the waterbox core's libc. The file will be readable + /// and writable. Any attempt to save state while the file is loaded will fail. + /// + public void AddTransientFile(byte[] data, string name) + { + _syscalls.AddTransientFile(data, name); // don't need to clone data, as it's used at init only + } + + /// + /// Remove a file previously added by AddTransientFile + /// + /// The state of the file when it was removed + public byte[] RemoveTransientFile(string name) + { + return _syscalls.RemoveTransientFile(name); + } + public void SaveStateBinary(BinaryWriter bw) { bw.Write(_createstamp); diff --git a/waterbox/sameboy/bizhawk.cpp b/waterbox/sameboy/bizhawk.cpp index 15db12b9d6..f37c60a0eb 100644 --- a/waterbox/sameboy/bizhawk.cpp +++ b/waterbox/sameboy/bizhawk.cpp @@ -15,7 +15,7 @@ extern "C" { static GB_gameboy_t GB; static uint32_t GBPixels[160 * 144]; -static uint32_t* CurrentFramebuffer; +static uint32_t *CurrentFramebuffer; static bool sgb; static void VBlankCallback(GB_gameboy_t *gb) { @@ -94,7 +94,7 @@ static void SgbSampleCallback(int16_t sl, int16_t sr, uint64_t clock) sample_sgb.right = sr; } -ECL_EXPORT bool Init(bool cgb, const uint8_t* spc, int spclen) +ECL_EXPORT bool Init(bool cgb, const uint8_t *spc, int spclen) { if (spc) { @@ -145,7 +145,7 @@ ECL_EXPORT void FrameAdvance(MyFrameInfo &f) { if (sgb) { - sgb_set_controller_data((uint8_t*)&f.Keys); + sgb_set_controller_data((uint8_t *)&f.Keys); } else { @@ -225,6 +225,25 @@ ECL_EXPORT uint8_t GetIoReg(uint8_t port) return GB.io_registers[port]; } +ECL_EXPORT void PutSaveRam() +{ + GB_load_battery(&GB, "save.ram"); +} + +ECL_EXPORT void GetSaveRam() +{ + GB_save_battery(&GB, "save.ram"); +} + +ECL_EXPORT bool HasSaveRam() +{ + if (!GB.cartridge_type->has_battery) + return false; // Nothing to save. + if (GB.mbc_ram_size == 0 && !GB.cartridge_type->has_rtc) + return false; /* Claims to have battery, but has no RAM or RTC */ + return true; +} + int main() { return 0; From a640c53e52eeec0b2f2542142ae4409457d4bf93 Mon Sep 17 00:00:00 2001 From: nattthebear Date: Wed, 19 Jul 2017 20:18:13 -0400 Subject: [PATCH 42/93] Sameboy: RTC --- BizHawk.Client.EmuHawk/MainForm.Events.cs | 10 ++- .../Consoles/Nintendo/Gameboy/Sameboy.cs | 88 +++++++++++++++++-- waterbox/sameboy/bizhawk.cpp | 1 + waterbox/sameboy/gb.h | 2 + waterbox/sameboy/timing.c | 2 +- 5 files changed, 92 insertions(+), 11 deletions(-) diff --git a/BizHawk.Client.EmuHawk/MainForm.Events.cs b/BizHawk.Client.EmuHawk/MainForm.Events.cs index 290b2429bf..21c72d1312 100644 --- a/BizHawk.Client.EmuHawk/MainForm.Events.cs +++ b/BizHawk.Client.EmuHawk/MainForm.Events.cs @@ -25,6 +25,7 @@ using BizHawk.Client.EmuHawk.ToolExtensions; using BizHawk.Emulation.Cores.Computers.AppleII; using BizHawk.Client.ApiHawk; using BizHawk.Emulation.Cores.Computers.Commodore64; +using BizHawk.Emulation.Cores.Nintendo.Gameboy; namespace BizHawk.Client.EmuHawk { @@ -2002,7 +2003,14 @@ namespace BizHawk.Client.EmuHawk private void GBCoreSettingsMenuItem_Click(object sender, EventArgs e) { - GBPrefs.DoGBPrefsDialog(this); + if (Global.Emulator is Gameboy) + { + GBPrefs.DoGBPrefsDialog(this); + } + else // sameboy + { + GenericCoreConfig.DoDialog(this, "Gameboy Settings"); + } } private void LoadGbInSgbMenuItem_Click(object sender, EventArgs e) diff --git a/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/Sameboy.cs b/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/Sameboy.cs index 928ab1bd62..1b7231b02d 100644 --- a/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/Sameboy.cs +++ b/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/Sameboy.cs @@ -4,6 +4,7 @@ using BizHawk.Emulation.Cores.Properties; using BizHawk.Emulation.Cores.Waterbox; using System; using System.Collections.Generic; +using System.ComponentModel; using System.IO; using System.Linq; using System.Text; @@ -13,7 +14,9 @@ namespace BizHawk.Emulation.Cores.Consoles.Nintendo.Gameboy { [Core("SameBoy", "LIJI32", true, false, "efc11783c7fb6da66e1dd084e41ba6a85c0bd17e", "https://sameboy.github.io/", false)] - public class Sameboy : WaterboxCore, IGameboyCommon, ISaveRam + public class Sameboy : WaterboxCore, + IGameboyCommon, ISaveRam, + ISettable { /// /// the nominal length of one frame @@ -35,16 +38,16 @@ namespace BizHawk.Emulation.Cores.Consoles.Nintendo.Gameboy private bool _sgb; [CoreConstructor("SGB")] - public Sameboy(byte[] rom, CoreComm comm) - : this(rom, comm, true) + public Sameboy(byte[] rom, CoreComm comm, SyncSettings syncSettings, bool deterministic) + : this(rom, comm, true, syncSettings, deterministic) { } [CoreConstructor("GB")] - public Sameboy(CoreComm comm, byte[] rom) - : this(rom, comm, false) + public Sameboy(CoreComm comm, byte[] rom, SyncSettings syncSettings, bool deterministic) + : this(rom, comm, false, syncSettings, deterministic) { } - public Sameboy(byte[] rom, CoreComm comm, bool sgb) + public Sameboy(byte[] rom, CoreComm comm, bool sgb, SyncSettings syncSettings, bool deterministic) : base(comm, new Configuration { DefaultWidth = sgb ? 256 : 160, @@ -70,8 +73,12 @@ namespace BizHawk.Emulation.Cores.Consoles.Nintendo.Gameboy _cgb = (rom[0x143] & 0xc0) == 0xc0 && !sgb; _sgb = sgb; Console.WriteLine("Automaticly detected CGB to " + _cgb); - var bios = Util.DecompressGzipFile(new MemoryStream(_cgb ? Resources.SameboyCgbBoot : Resources.SameboyDmgBoot)); - // var bios = comm.CoreFileProvider.GetFirmware(_cgb ? "GBC" : "GB", "World", true); + _syncSettings = syncSettings ?? new SyncSettings(); + + var bios = _syncSettings.UseRealBIOS && !sgb + ? comm.CoreFileProvider.GetFirmware(_cgb ? "GBC" : "GB", "World", true) + : Util.DecompressGzipFile(new MemoryStream(_cgb ? Resources.SameboyCgbBoot : Resources.SameboyDmgBoot)); + var spc = sgb ? Util.DecompressGzipFile(new MemoryStream(Resources.SgbCartPresent_SPC)) : null; @@ -92,6 +99,9 @@ namespace BizHawk.Emulation.Cores.Consoles.Nintendo.Gameboy var scratch = new IntPtr[4]; _core.GetGpuMemory(scratch); _gpuMemory = new GPUMemoryAreas(scratch[0], scratch[1], scratch[3], scratch[2], _exe); + + DeterministicEmulation = deterministic || !_syncSettings.UseRealTime; + InitializeRtc(_syncSettings.InitialTime); } #region Controller @@ -167,11 +177,71 @@ namespace BizHawk.Emulation.Cores.Consoles.Nintendo.Gameboy #endregion + #region ISettable + + private SyncSettings _syncSettings; + + public class SyncSettings + { + [DisplayName("Initial Time")] + [Description("Initial time of emulation. Only relevant when UseRealTime is false.")] + [DefaultValue(typeof(DateTime), "2010-01-01")] + public DateTime InitialTime { get; set; } + + [DisplayName("Use RealTime")] + [Description("If true, RTC clock will be based off of real time instead of emulated time. Ignored (set to false) when recording a movie.")] + [DefaultValue(false)] + public bool UseRealTime { get; set; } + + [Description("If true, real BIOS files will be used. Ignored in SGB mode.")] + [DefaultValue(false)] + public bool UseRealBIOS { get; set; } + + public SyncSettings Clone() + { + return (SyncSettings)MemberwiseClone(); + } + + public static bool NeedsReboot(SyncSettings x, SyncSettings y) + { + return !DeepEquality.DeepEquals(x, y); + } + + public SyncSettings() + { + SettingsUtil.SetDefaultValues(this); + } + } + + public object GetSettings() + { + return null; + } + + public SyncSettings GetSyncSettings() + { + return _syncSettings.Clone(); + } + + public bool PutSettings(object o) + { + return false; + } + + public bool PutSyncSettings(SyncSettings o) + { + var ret = SyncSettings.NeedsReboot(_syncSettings, o); + _syncSettings = o; + return ret; + } + + #endregion + protected override LibWaterboxCore.FrameInfo FrameAdvancePrep(IController controller, bool render, bool rendersound) { return new LibSameboy.FrameInfo { - Time = 0, + Time = GetRtcTime(!DeterministicEmulation), Keys = GetButtons(controller) }; } diff --git a/waterbox/sameboy/bizhawk.cpp b/waterbox/sameboy/bizhawk.cpp index f37c60a0eb..28c6cda11e 100644 --- a/waterbox/sameboy/bizhawk.cpp +++ b/waterbox/sameboy/bizhawk.cpp @@ -154,6 +154,7 @@ ECL_EXPORT void FrameAdvance(MyFrameInfo &f) sound_start_clock = GB_epoch(&GB); CurrentFramebuffer = f.VideoBuffer; GB_set_lagged(&GB, true); + GB.frontend_rtc_time = f.Time; uint32_t target = 35112 - FrameOverflow; f.Cycles = GB_run_cycles(&GB, target); diff --git a/waterbox/sameboy/gb.h b/waterbox/sameboy/gb.h index 91d29effe4..098a3d2ea3 100644 --- a/waterbox/sameboy/gb.h +++ b/waterbox/sameboy/gb.h @@ -434,6 +434,8 @@ struct GB_gameboy_internal_s { uint32_t ram_size; // Different between CGB and DMG uint8_t boot_rom[0x900]; bool vblank_just_occured; // For slow operations involving syscalls; these should only run once per vblank + + int64_t frontend_rtc_time; }; #ifndef GB_INTERNAL diff --git a/waterbox/sameboy/timing.c b/waterbox/sameboy/timing.c index e67992c167..bb2501b31a 100644 --- a/waterbox/sameboy/timing.c +++ b/waterbox/sameboy/timing.c @@ -133,7 +133,7 @@ void GB_emulate_timer_glitch(GB_gameboy_t *gb, uint8_t old_tac, uint8_t new_tac) void GB_rtc_run(GB_gameboy_t *gb) { if ((gb->rtc_real.high & 0x40) == 0) { /* is timer running? */ - time_t current_time = time(NULL); + time_t current_time = gb->frontend_rtc_time; while (gb->last_rtc_second < current_time) { gb->last_rtc_second++; if (++gb->rtc_real.seconds == 60) From 0d6bdc200b00413abe41fef0294aca1cb95f7ccf Mon Sep 17 00:00:00 2001 From: nattthebear Date: Wed, 19 Jul 2017 20:38:19 -0400 Subject: [PATCH 43/93] sameboy: a bit of savestate optimization --- .../Consoles/Nintendo/Gameboy/Sameboy.cs | 10 +++---- waterbox/sameboy/gb.c | 28 ++----------------- 2 files changed, 7 insertions(+), 31 deletions(-) diff --git a/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/Sameboy.cs b/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/Sameboy.cs index 1b7231b02d..c9d5269710 100644 --- a/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/Sameboy.cs +++ b/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/Sameboy.cs @@ -63,11 +63,11 @@ namespace BizHawk.Emulation.Cores.Consoles.Nintendo.Gameboy _core = PreInit(new PeRunnerOptions { Filename = "sameboy.wbx", - SbrkHeapSizeKB = 128, - InvisibleHeapSizeKB = 16 * 1024, - SealedHeapSizeKB = 5 * 1024, - PlainHeapSizeKB = 4096, - MmapHeapSizeKB = 34 * 1024 + SbrkHeapSizeKB = 192, + InvisibleHeapSizeKB = 4, + SealedHeapSizeKB = 9 * 1024, + PlainHeapSizeKB = 4, + MmapHeapSizeKB = 1024 }); _cgb = (rom[0x143] & 0xc0) == 0xc0 && !sgb; diff --git a/waterbox/sameboy/gb.c b/waterbox/sameboy/gb.c index e8e90d55bd..ce14dc647c 100644 --- a/waterbox/sameboy/gb.c +++ b/waterbox/sameboy/gb.c @@ -5,11 +5,8 @@ #include #include #include -#ifndef _WIN32 -#include -#include -#endif #include "gb.h" +#include "../emulibc/emulibc.h" void GB_attributed_logv(GB_gameboy_t *gb, GB_log_attributes attributes, const char *fmt, va_list args) { @@ -75,27 +72,6 @@ void GB_init_cgb(GB_gameboy_t *gb) GB_reset(gb); } -void GB_free(GB_gameboy_t *gb) -{ - gb->magic = 0; - if (gb->ram) { - free(gb->ram); - } - if (gb->vram) { - free(gb->vram); - } - if (gb->mbc_ram) { - free(gb->mbc_ram); - } - if (gb->rom) { - free(gb->rom); - } - if (gb->breakpoints) { - free(gb->breakpoints); - } - memset(gb, 0, sizeof(*gb)); -} - int GB_load_boot_rom(GB_gameboy_t *gb, const char *path) { FILE *f = fopen(path, "rb"); @@ -127,7 +103,7 @@ int GB_load_rom(GB_gameboy_t *gb, const char *path) if (gb->rom) { free(gb->rom); } - gb->rom = malloc(gb->rom_size); + gb->rom = alloc_sealed(gb->rom_size); memset(gb->rom, 0xFF, gb->rom_size); /* Pad with 0xFFs */ fread(gb->rom, gb->rom_size, 1, f); fclose(f); From 491dc9c1fbc9683d253f1a781e903cd5592fee90 Mon Sep 17 00:00:00 2001 From: nattthebear Date: Wed, 19 Jul 2017 20:43:44 -0400 Subject: [PATCH 44/93] sameboy: wbx file --- output/dll/sameboy.wbx.gz | Bin 0 -> 58573 bytes waterbox/sameboy/Makefile | 8 ++++---- 2 files changed, 4 insertions(+), 4 deletions(-) create mode 100644 output/dll/sameboy.wbx.gz diff --git a/output/dll/sameboy.wbx.gz b/output/dll/sameboy.wbx.gz new file mode 100644 index 0000000000000000000000000000000000000000..c810c4beead9c4e0539a4e65ccab05dafb5b6f32 GIT binary patch literal 58573 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 literal 0 HcmV?d00001 diff --git a/waterbox/sameboy/Makefile b/waterbox/sameboy/Makefile index 640a98f0d7..e694a321e1 100644 --- a/waterbox/sameboy/Makefile +++ b/waterbox/sameboy/Makefile @@ -3,8 +3,8 @@ CPP = x86_64-nt64-midipix-g++ FLAGS:=-Wall -Werror=pointer-to-int-cast -Werror=int-to-pointer-cast -Werror=implicit-function-declaration \ -Wno-multichar \ - -fomit-frame-pointer -fvisibility=hidden \ - -O0 -g + -fomit-frame-pointer \ + -O3 -flto CCFLAGS:=$(FLAGS) \ -std=gnu99 \ @@ -42,8 +42,8 @@ $(TARGET).in: $(OBJS) @$(CPP) -o $@ $(LDFLAGS) $(FLAGS) $(OBJS) ../emulibc/libemuhost.so $(TARGET): $(TARGET).in -# strip $< -o $@ -R /4 -R /14 -R /29 -R /41 -R /55 -R /67 -R /78 -R /89 -R /104 - cp $< $@ + strip $< -o $@ -R /4 -R /14 -R /29 -R /41 -R /55 -R /67 -R /78 -R /89 -R /104 +# cp $< $@ clean: rm -rf $(OBJ_DIR) From 3ff8eabdf264b72657f0da9fbf7fbf5d9b6df416 Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Wed, 19 Jul 2017 20:53:41 -0400 Subject: [PATCH 45/93] A7800Hawk: Fix NTSC Palette --- .../Consoles/Atari/A7800Hawk/A7800Hawk.cs | 129 +++++++++--------- 1 file changed, 66 insertions(+), 63 deletions(-) diff --git a/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/A7800Hawk.cs b/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/A7800Hawk.cs index 78e2996d6d..74585103ea 100644 --- a/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/A7800Hawk.cs +++ b/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/A7800Hawk.cs @@ -201,93 +201,96 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk * MariaTables.cs * * Palette tables for the Maria class. - * All derived from Dan Boris' 7800/MAME code. + * PAL derived from Dan Boris' 7800/MAME code. * - * Copyright © 2004 Mike Murphy + * PAL Table: Copyright © 2004 Mike Murphy * + * NTSC Table Source: http://atariage.com/forums/topic/95498-7800-color-palette-in-mess/?p=1174461 + * + * */ public static readonly int[] NTSCPalette = { - 0x000000, 0x1c1c1c, 0x393939, 0x595959, // Grey - 0x797979, 0x929292, 0xababab, 0xbcbcbc, - 0xcdcdcd, 0xd9d9d9, 0xe6e6e6, 0xececec, - 0xf2f2f2, 0xf8f8f8, 0xffffff, 0xffffff, + 0x000000, 0x2e2e2e, 0x3c3c3c, 0x595959, + 0x777777, 0x838383, 0xa0a0a0, 0xb7b7b7, + 0xcdcdcd, 0xd8d8d8, 0xdddddd, 0xe0e0e0, + 0xeaeaea, 0xf0f0f0, 0xf6f6f6, 0xffffff, - 0x391701, 0x5e2304, 0x833008, 0xa54716, // Gold - 0xc85f24, 0xe37820, 0xff911d, 0xffab1d, - 0xffc51d, 0xffce34, 0xffd84c, 0xffe651, - 0xfff456, 0xfff977, 0xffff98, 0xffff98, + 0x412000, 0x542800, 0x763706, 0x984f0f, + 0xbb6818, 0xd78016, 0xff911d, 0xffab1d, + 0xffc51d, 0xffd03b, 0xffd84c, 0xffe651, + 0xfff456, 0xfff977, 0xffff98, 0xffffab, - 0x451904, 0x721e11, 0x9f241e, 0xb33a20, // Orange - 0xc85122, 0xe36920, 0xff811e, 0xff8c25, - 0xff982c, 0xffae38, 0xffc545, 0xffc559, - 0xffc66d, 0xffd587, 0xffe4a1, 0xffe4a1, + 0x451904, 0x721e11, 0x9f241e, 0xb33a20, + 0xc85122, 0xe36920, 0xfc811e, 0xff8c25, + 0xff982c, 0xffae38, 0xffc455, 0xffc559, + 0xffc66d, 0xffd587, 0xffe4a1, 0xffe6ab, - 0x4a1704, 0x7e1a0d, 0xb21d17, 0xc82119, // Red Orange - 0xdf251c, 0xec3b38, 0xfa5255, 0xfc6161, - 0xff706e, 0xff7f7e, 0xff8f8f, 0xff9d9e, - 0xffabad, 0xffb9bd, 0xffc7ce, 0xffc7ce, + 0x5f1f0e, 0x7a240d, 0x9c2c0f, 0xb02f0e, + 0xbf3624, 0xd34e2a, 0xe7623e, 0xf36e4a, + 0xfd7854, 0xff8a6a, 0xff987c, 0xffa48b, + 0xffb39e, 0xffc2b2, 0xffd0c3, 0xffdad0, - 0x050568, 0x3b136d, 0x712272, 0x8b2a8c, // Pink - 0xa532a6, 0xb938ba, 0xcd3ecf, 0xdb47dd, - 0xea51eb, 0xf45ff5, 0xfe6dff, 0xfe7afd, - 0xff87fb, 0xff95fd, 0xffa4ff, 0xffa4ff, + 0x4a1704, 0x7e1a0d, 0xb21d17, 0xc82119, + 0xdf251c, 0xec3b38, 0xfa5255, 0xfc6161, + 0xff7063, 0xff7f7e, 0xff8f8f, 0xff9d9e, + 0xffabad, 0xffb9bd, 0xffc7ce, 0xffcade, - 0x280479, 0x400984, 0x590f90, 0x70249d, // Purple - 0x8839aa, 0xa441c3, 0xc04adc, 0xd054ed, - 0xe05eff, 0xe96dff, 0xf27cff, 0xf88aff, - 0xff98ff, 0xfea1ff, 0xfeabff, 0xfeabff, + 0x490136, 0x66014b, 0x80035f, 0x951874, + 0xaa2d89, 0xba3d99, 0xca4da9, 0xd75ab6, + 0xe467c3, 0xef72ce, 0xfb7eda, 0xff8de1, + 0xff9de5, 0xffa5e7, 0xffafea, 0xffb8ec, - 0x35088a, 0x420aad, 0x500cd0, 0x6428d0, // Purple Blue - 0x7945d0, 0x8d4bd4, 0xa251d9, 0xb058ec, - 0xbe60ff, 0xc56bff, 0xcc77ff, 0xd183ff, - 0xd790ff, 0xdb9dff, 0xdfaaff, 0xdfaaff, + 0x48036c, 0x5c0488, 0x650d91, 0x7b23a7, + 0x933bbf, 0x9d45c9, 0xa74fd3, 0xb25ade, + 0xbd65e9, 0xc56df1, 0xce76fa, 0xd583ff, + 0xda90ff, 0xde9cff, 0xe2a9ff, 0xe6b6ff, - 0x051e81, 0x0626a5, 0x082fca, 0x263dd4, // Blue1 - 0x444cde, 0x4f5aee, 0x5a68ff, 0x6575ff, + 0x051e81, 0x0626a5, 0x082fca, 0x263dd4, + 0x444cde, 0x4f5aec, 0x5a68ff, 0x6575ff, 0x7183ff, 0x8091ff, 0x90a0ff, 0x97a9ff, - 0x9fb2ff, 0xafbeff, 0xc0cbff, 0xc0cbff, + 0x9fb2ff, 0xafbeff, 0xc0cbff, 0xcdd3ff, - 0x0c048b, 0x2218a0, 0x382db5, 0x483ec7, // Blue2 - 0x584fda, 0x6159ec, 0x6b64ff, 0x7a74ff, - 0x8a84ff, 0x918eff, 0x9998ff, 0xa5a3ff, - 0xb1aeff, 0xb8b8ff, 0xc0c2ff, 0xc0c2ff, + 0x0b0779, 0x201c8e, 0x3531a3, 0x4642b4, + 0x5753c5, 0x615dcf, 0x6d69db, 0x7b77e9, + 0x8985f7, 0x918dff, 0x9c98ff, 0xa7a4ff, + 0xb2afff, 0xbbb8ff, 0xc3c1ff, 0xd3d1ff, - 0x1d295a, 0x1d3876, 0x1d4892, 0x1c5cac, // Light Blue - 0x1c71c6, 0x3286cf, 0x489bd9, 0x4ea8ec, + 0x1d295a, 0x1d3876, 0x1d4892, 0x1d5cac, + 0x1d71c6, 0x3286cf, 0x489bd9, 0x4ea8ec, 0x55b6ff, 0x70c7ff, 0x8cd8ff, 0x93dbff, - 0x9bdfff, 0xafe4ff, 0xc3e9ff, 0xc3e9ff, + 0x9bdfff, 0xafe4ff, 0xc3e9ff, 0xcfedff, - 0x2f4302, 0x395202, 0x446103, 0x417a12, // Turquoise - 0x3e9421, 0x4a9f2e, 0x57ab3b, 0x5cbd55, - 0x61d070, 0x69e27a, 0x72f584, 0x7cfa8d, - 0x87ff97, 0x9affa6, 0xadffb6, 0xadffb6, + 0x014b59, 0x015d6e, 0x016f84, 0x01849c, + 0x0199b5, 0x01abca, 0x01bcde, 0x01d0f5, + 0x1adcff, 0x3ee1ff, 0x64e7ff, 0x76eaff, + 0x8bedff, 0x9aefff, 0xb1f3ff, 0xc7f6ff, - 0x0a4108, 0x0d540a, 0x10680d, 0x137d0f, // Green Blue - 0x169212, 0x19a514, 0x1cb917, 0x1ec919, - 0x21d91b, 0x47e42d, 0x6ef040, 0x78f74d, - 0x83ff5b, 0x9aff7a, 0xb2ff9a, 0xb2ff9a, + 0x004800, 0x005400, 0x036b03, 0x0e760e, + 0x188018, 0x279227, 0x36a436, 0x4eb94e, + 0x51cd51, 0x72da72, 0x7ce47c, 0x85ed85, + 0xa2ffa2, 0xb5ffb5, 0xc8ffc8, 0xd0ffd0, - 0x04410b, 0x05530e, 0x066611, 0x077714, // Green - 0x088817, 0x099b1a, 0x0baf1d, 0x48c41f, - 0x86d922, 0x8fe924, 0x99f927, 0xa8fc41, - 0xb7ff5b, 0xc9ff6e, 0xdcff81, 0xdcff81, + 0x164000, 0x1c5300, 0x236600, 0x287800, + 0x2e8c00, 0x3a980c, 0x47a519, 0x51af23, + 0x5cba2e, 0x71cf43, 0x85e357, 0x8deb5f, + 0x97f569, 0xa4ff97, 0xb9ff97, 0xb9ff97, - 0x02350f, 0x073f15, 0x0c4a1c, 0x2d5f1e, // Yellow Green - 0x4f7420, 0x598324, 0x649228, 0x82a12e, - 0xa1b034, 0xa9c13a, 0xb2d241, 0xc4d945, - 0xd6e149, 0xe4f04e, 0xf2ff53, 0xf2ff53, + 0x2c3500, 0x384400, 0x445200, 0x495600, + 0x607100, 0x6c7f00, 0x798d0a, 0x8b9f1c, + 0x9eb22f, 0xabbf3c, 0xb8cc49, 0xc2d653, + 0xcde153, 0xdbef6c, 0xe8fc79, 0xf2ffab, - 0x263001, 0x243803, 0x234005, 0x51541b, // Orange Green - 0x806931, 0x978135, 0xaf993a, 0xc2a73e, - 0xd5b543, 0xdbc03d, 0xe1cb38, 0xe2d836, - 0xe3e534, 0xeff258, 0xfbff7d, 0xfbff7d, + 0x463a09, 0x4d3f09, 0x544509, 0x6c5809, + 0x907609, 0xab8b0a, 0xc1a120, 0xd0b02f, + 0xdebe3d, 0xe6c645, 0xedcd4c, 0xf6da65, + 0xfde67d, 0xfff2a2, 0xfff9c5, 0xfff9d4, - 0x401a02, 0x581f05, 0x702408, 0x8d3a13, // Light Orange - 0xab511f, 0xb56427, 0xbf7730, 0xd0853a, + 0x401a02, 0x581f05, 0x702408, 0x8d3a13, + 0xab511f, 0xb56427, 0xbf7730, 0xd0853a, 0xe19344, 0xeda04e, 0xf9ad58, 0xfcb75c, - 0xffc160, 0xffc671, 0xffcb83, 0xffcb83 + 0xffc160, 0xffc671, 0xffcb83, 0xffd498 }; public static readonly int[] PALPalette = From 223902a2f836dc8c5dcffea40b4eb71516445465 Mon Sep 17 00:00:00 2001 From: nattthebear Date: Wed, 19 Jul 2017 21:09:39 -0400 Subject: [PATCH 46/93] tweak ECL_INVISIBLE a bit. Internal crap,. --- BizHawk.Emulation.Cores/Waterbox/PeWrapper.cs | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/BizHawk.Emulation.Cores/Waterbox/PeWrapper.cs b/BizHawk.Emulation.Cores/Waterbox/PeWrapper.cs index 14bba95a76..8f2e5d3d28 100644 --- a/BizHawk.Emulation.Cores/Waterbox/PeWrapper.cs +++ b/BizHawk.Emulation.Cores/Waterbox/PeWrapper.cs @@ -344,6 +344,13 @@ namespace BizHawk.Emulation.Cores.Waterbox Marshal.Copy(Z.US(_imports.Start), impData, 0, (int)_imports.Size); WaterboxUtils.ZeroMemory(Z.US(_imports.Start), (long)_imports.Size); } + byte[] invData = null; + if (_invisible != null) + { + invData = new byte[_invisible.Size]; + Marshal.Copy(Z.US(_invisible.Start), invData, 0, (int)_invisible.Size); + WaterboxUtils.ZeroMemory(Z.US(_invisible.Start), (long)_invisible.Size); + } Memory.SaveXorSnapshot(); if (_imports != null) { @@ -351,6 +358,10 @@ namespace BizHawk.Emulation.Cores.Waterbox _imports.W = false; Memory.Protect(_imports.Start, _imports.Size, _imports.Prot); } + if (_invisible != null) + { + Marshal.Copy(invData, 0, Z.US(_invisible.Start), (int)_invisible.Size); + } if (_sealed != null) { _sealed.W = false; From a6fb55fa7cc6864153098b779065b84485a2bef2 Mon Sep 17 00:00:00 2001 From: nattthebear Date: Wed, 19 Jul 2017 21:39:00 -0400 Subject: [PATCH 47/93] gpgx: decrease RAM usage slightly --- BizHawk.Emulation.Cores/Consoles/Sega/gpgx64/GPGX.cs | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/BizHawk.Emulation.Cores/Consoles/Sega/gpgx64/GPGX.cs b/BizHawk.Emulation.Cores/Consoles/Sega/gpgx64/GPGX.cs index 88ac2a5d75..417e0a5bcb 100644 --- a/BizHawk.Emulation.Cores/Consoles/Sega/gpgx64/GPGX.cs +++ b/BizHawk.Emulation.Cores/Consoles/Sega/gpgx64/GPGX.cs @@ -65,7 +65,7 @@ namespace BizHawk.Emulation.Cores.Consoles.Sega.gpgx LoadCallback = new LibGPGX.load_archive_cb(load_archive); - this.romfile = rom; + _romfile = rom; if (cds != null) { @@ -155,6 +155,8 @@ namespace BizHawk.Emulation.Cores.Consoles.Sega.gpgx Tracer = new GPGXTraceBuffer(this, MemoryDomains, this); (ServiceProvider as BasicServiceProvider).Register(Tracer); } + + _romfile = null; } private LibGPGX Core; @@ -166,7 +168,7 @@ namespace BizHawk.Emulation.Cores.Consoles.Sega.gpgx private bool _prevDiskPressed; private bool _nextDiskPressed; - byte[] romfile; + byte[] _romfile; private bool _disposed = false; @@ -206,16 +208,16 @@ namespace BizHawk.Emulation.Cores.Consoles.Sega.gpgx if (filename == "PRIMARY_ROM") { - if (romfile == null) + if (_romfile == null) { Console.WriteLine("Couldn't satisfy firmware request PRIMARY_ROM because none was provided."); return 0; } - srcdata = romfile; + srcdata = _romfile; } else if (filename == "PRIMARY_CD" || filename == "SECONDARY_CD") { - if (filename == "PRIMARY_CD" && romfile != null) + if (filename == "PRIMARY_CD" && _romfile != null) { Console.WriteLine("Declined to satisfy firmware request PRIMARY_CD because PRIMARY_ROM was provided."); return 0; From c01850df2bf4187ad823567db19b2f1ebdc8c666 Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Thu, 20 Jul 2017 10:41:15 -0400 Subject: [PATCH 48/93] A7800Hawk: Implement remaining display modes --- .../Consoles/Atari/A7800Hawk/Maria.cs | 168 +++++++++++++++++- 1 file changed, 159 insertions(+), 9 deletions(-) diff --git a/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/Maria.cs b/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/Maria.cs index 9bfa8635d7..42d444563b 100644 --- a/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/Maria.cs +++ b/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/Maria.cs @@ -534,7 +534,158 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk // the two different rendering paths are basically controlled by write mode if (GFX_Objects[local_GFX_index, i].write_mode) { + if (disp_mode == 0) + { + local_width = GFX_Objects[local_GFX_index, i].width; + for (int j = 0; j < local_width; j++) + { + for (int k = 3; k >= 0; k--) + { + index = local_start * 2 + j * 4 + (3 - k); + + if (index > 511) + { + index -= 512; + } + + if (index < 320) + { + color = GFX_Objects[local_GFX_index, i].obj[j]; + + // this is now the color index (0-3) we choose from the palette + if (k >= 2) + { + color = (((color >> 2) & 0x3) << 2) + ((color >> 6) & 0x3); + } + else + { + color = ((color & 0x3) << 2) + ((color >> 4) & 0x3); + } + + if ((color != 0) && (color != 4) && (color != 8) && (color != 12)) // transparent + { + color = ((local_palette & 4) << 2) + color; + + color = Core.Maria_regs[color]; + + // the top 4 bits from this are the color, the bottom 4 are the luminosity + // this is already conveniently arranged in the palette + scanline_buffer[index] = _palette[color]; + } + } + } + } + } + else if (disp_mode == 2) // note: 1 is not used + { + local_width = GFX_Objects[local_GFX_index, i].width; + + for (int j = 0; j < local_width; j++) + { + for (int k = 7; k >= 0; k--) + { + index = local_start * 2 + j * 8 + (7 - k); + + if (index > 511) + { + index -= 512; + } + + if (index < 320) + { + color = GFX_Objects[local_GFX_index, i].obj[j]; + + // this is now the color index (0-3) we choose from the palette + if (k >= 6) + { + color = ((color >> 6) & 0x2) + ((color >> 3) & 0x1); + } + else if (k >= 4) + { + color = ((color >> 5) & 0x2) + ((color >> 2) & 0x1); + + } + else if (k >= 2) + { + color = ((color >> 4) & 0x2) + ((color >> 1) & 0x1); + } + else + { + color = ((color >> 3) & 0x2) + (color & 0x1); + } + + if (color != 0) // transparent + { + color = ((local_palette & 4) << 2) + color; + + color = Core.Maria_regs[color]; + + // the top 4 bits from this are the color, the bottom 4 are the luminosity + // this is already conveniently arranged in the palette + scanline_buffer[index] = _palette[color]; + } + } + } + } + } + else + { + local_width = GFX_Objects[local_GFX_index, i].width; + + for (int j = 0; j < local_width; j++) + { + for (int k = 7; k >= 0; k--) + { + index = local_start * 2 + j * 8 + (7 - k); + + if (index > 511) + { + index -= 512; + } + + if (index < 320) + { + color = GFX_Objects[local_GFX_index, i].obj[j]; + int temp_color = color; + + // this is now the color index (0-3) we choose from the palette + if (k >= 6) + { + color = ((color >> 7) & 0x1); + temp_color = (local_palette & 4) + ((temp_color >> 2) & 3); + } + else if (k >= 4) + { + color = ((color >> 6) & 0x1); + temp_color = (local_palette & 4) + ((temp_color >> 2) & 3); + + } + else if (k >= 2) + { + color = ((color >> 5) & 0x1); + temp_color = (local_palette & 4) + (temp_color & 3); + } + else + { + color = ((color >> 4) & 0x1); + temp_color = (local_palette & 4) + (temp_color & 3); + } + + if (color != 0) // transparent + { + color = (temp_color << 2) + color; + + color = Core.Maria_regs[color]; + + // the top 4 bits from this are the color, the bottom 4 are the luminosity + // this is already conveniently arranged in the palette + scanline_buffer[index] = _palette[color]; + } + } + } + } + } } else { @@ -558,17 +709,16 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk color = GFX_Objects[local_GFX_index, i].obj[j]; // this is now the color index (0-3) we choose from the palette - if (k>=6) + if (k >= 6) { - color = (color >> 6) & 0x3; + color = (color >> 6) & 0x3; + } + else if (k >= 4) + { + color = (color >> 4) & 0x3; } - else if (k>=4) - { - color = (color >> 4) & 0x3; - - } - else if (k>=2) + else if (k >= 2) { color = (color >> 2) & 0x3; } @@ -576,7 +726,7 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk { color = color & 0x3; } - + if (color != 0) // transparent { color = Core.Maria_regs[local_palette * 4 + color]; From 9038a4b8a505ac72bd61d78cc1ec0d20fea2dd39 Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Thu, 20 Jul 2017 12:22:15 -0400 Subject: [PATCH 49/93] A7800Hawk: Fix Holey DMA Fixes Xenophobe --- .../Consoles/Atari/A7800Hawk/Maria.cs | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/Maria.cs b/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/Maria.cs index 42d444563b..1736e4fcbe 100644 --- a/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/Maria.cs +++ b/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/Maria.cs @@ -203,7 +203,7 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk if (cycle == 440 && !sl_DMA_complete && do_dma && (DMA_phase == DMA_GRAPHICS || DMA_phase == DMA_HEADER)) { - //Console.WriteLine(scanline); + Console.WriteLine(scanline); if (current_DLL_offset == 0) { @@ -403,7 +403,7 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk addr_t = ReadMemory((ushort)(GFX_Objects[GFX_index, header_counter].addr + i)); addr_t |= (ushort)((Core.Maria_regs[0x14] + current_DLL_offset) << 8); - if ((current_DLL_H16 && addr_t.Bit(12)) || (current_DLL_H8 && addr_t.Bit(11))) + if (((current_DLL_H16 && addr_t.Bit(12)) || (current_DLL_H8 && addr_t.Bit(11))) && (addr_t > 0x8000)) { if (i * ch_size < 64) { @@ -444,9 +444,9 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk { addr_t = (ushort)(GFX_Objects[GFX_index, header_counter].addr + (current_DLL_offset << 8) + i); - if ((current_DLL_H16 && addr_t.Bit(12)) || (current_DLL_H8 && addr_t.Bit(11))) + if (((current_DLL_H16 && addr_t.Bit(12)) || (current_DLL_H8 && addr_t.Bit(11))) && (addr_t > 0x8000)) { - GFX_Objects[GFX_index, header_counter].obj[i] = 0; + GFX_Objects[GFX_index, header_counter].obj[i] = 0; graphics_read_time -= 3; } else @@ -580,7 +580,7 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk else if (disp_mode == 2) // note: 1 is not used { local_width = GFX_Objects[local_GFX_index, i].width; - + for (int j = 0; j < local_width; j++) { for (int k = 7; k >= 0; k--) @@ -632,7 +632,7 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk else { local_width = GFX_Objects[local_GFX_index, i].width; - + for (int j = 0; j < local_width; j++) { for (int k = 7; k >= 0; k--) @@ -748,7 +748,7 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk int temp_c0 = GFX_Objects[local_GFX_index, i].palette & 0x1; int temp_c1 = GFX_Objects[local_GFX_index, i].palette & 0x2; - + for (int j = 0; j < local_width; j++) { for (int k = 7; k >= 0; k--) @@ -760,7 +760,6 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk if (index < 320) { - color = Core.Maria_regs[local_palette + color]; // the top 4 bits from this are the color, the bottom 4 are the luminosity @@ -769,12 +768,11 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk } } } - } else { local_width = GFX_Objects[local_GFX_index, i].width; - + for (int j = 0; j < local_width; j++) { for (int k = 7; k >= 0; k--) From ab814fb3e4fdd8362da3bda6ee655baa7a85bc82 Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Thu, 20 Jul 2017 12:23:24 -0400 Subject: [PATCH 50/93] Update Maria.cs --- BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/Maria.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/Maria.cs b/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/Maria.cs index 1736e4fcbe..b6d8e91113 100644 --- a/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/Maria.cs +++ b/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/Maria.cs @@ -203,7 +203,7 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk if (cycle == 440 && !sl_DMA_complete && do_dma && (DMA_phase == DMA_GRAPHICS || DMA_phase == DMA_HEADER)) { - Console.WriteLine(scanline); + //Console.WriteLine(scanline); if (current_DLL_offset == 0) { From 0b7c10594ca0a862eddacba575575b6e98fafed2 Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Thu, 20 Jul 2017 15:01:09 -0400 Subject: [PATCH 51/93] Update MapperSG.cs --- .../Consoles/Atari/A7800Hawk/Mappers/MapperSG.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/Mappers/MapperSG.cs b/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/Mappers/MapperSG.cs index db327c8312..9337faa364 100644 --- a/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/Mappers/MapperSG.cs +++ b/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/Mappers/MapperSG.cs @@ -95,7 +95,7 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk // cartridge and other OPSYS if (addr>=0x8000) { - bank = value; + bank = (byte)(value & 0x7); } } } From 585f9f412bc0387a7c7985cf5c67dba92416e0d6 Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Thu, 20 Jul 2017 15:01:47 -0400 Subject: [PATCH 52/93] A7800Hawk: Start support for ROM Headers --- .../Consoles/Atari/A7800Hawk/A7800Hawk.cs | 27 +++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/A7800Hawk.cs b/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/A7800Hawk.cs index 74585103ea..bc13004d43 100644 --- a/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/A7800Hawk.cs +++ b/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/A7800Hawk.cs @@ -3,6 +3,7 @@ using BizHawk.Common.BufferExtensions; using BizHawk.Emulation.Common; using BizHawk.Emulation.Cores.Components.M6502; +using BizHawk.Common.NumberExtensions; namespace BizHawk.Emulation.Cores.Atari.A7800Hawk { @@ -75,10 +76,15 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk byte[] palBios = comm.CoreFileProvider.GetFirmware("A78", "Bios_PAL", false, "The game will not run if the correct region BIOS is not available."); byte[] ntscBios = comm.CoreFileProvider.GetFirmware("A78", "Bios_NTSC", false, "The game will not run if the correct region BIOS is not available."); + byte[] header = new byte[128]; + bool is_header = false; + if (rom.Length % 1024 == 128) { Console.WriteLine("Trimming 128 byte .a78 header..."); byte[] newrom = new byte[rom.Length - 128]; + is_header = true; + Buffer.BlockCopy(rom, 0, header, 0, 128); Buffer.BlockCopy(rom, 128, newrom, 0, newrom.Length); rom = newrom; } @@ -108,9 +114,26 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk else throw new Exception("No Board selected for this game"); } + else if (is_header) + { + byte cart_1 = header[0x35]; + byte cart_2 = header[0x36]; + + _isPAL = (header[0x39] > 0) ? true : false; + + if (cart_2.Bit(1)) + { + s_mapper = "1"; + } + else + { + s_mapper = "0"; + } + + } else { - throw new Exception("ROM not in gamedb"); + throw new Exception("ROM not in gamedb and has no header"); } Reset_Mapper(s_mapper); @@ -189,7 +212,7 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk { mapper = new MapperDefault(); } - if (m=="A78SG") + if (m=="1") { mapper = new MapperSG(); } From c07f9e7ee671cd481e57d8a0e6935e2a7d4f88a1 Mon Sep 17 00:00:00 2001 From: zeromus Date: Thu, 20 Jul 2017 15:02:21 -0500 Subject: [PATCH 53/93] kopilua: fix io.open with mode "a" --- output/dll/nlua/KopiLua.dll | Bin 208896 -> 208896 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/output/dll/nlua/KopiLua.dll b/output/dll/nlua/KopiLua.dll index 0c58ba7027d8176c22da38fc6f406c54ea50703d..a5e11dac1e25431e066c7b2ea298eaf2bf2b3965 100644 GIT binary patch delta 10107 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 delta 10137 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 Date: Thu, 20 Jul 2017 17:22:40 -0400 Subject: [PATCH 54/93] I thought there was more to this vb settings thing. I guess not. --- .../Consoles/Nintendo/VB/LibVirtualBoyee.cs | 24 ++++-- .../Consoles/Nintendo/VB/VirtualBoyee.cs | 8 +- output/dll/vb.wbx.gz | Bin 37759 -> 38318 bytes waterbox/vb/vb.cpp | 79 ++++++++++++------ waterbox/vb/vip.cpp | 5 +- 5 files changed, 80 insertions(+), 36 deletions(-) diff --git a/BizHawk.Emulation.Cores/Consoles/Nintendo/VB/LibVirtualBoyee.cs b/BizHawk.Emulation.Cores/Consoles/Nintendo/VB/LibVirtualBoyee.cs index 89beef4e9a..619f304736 100644 --- a/BizHawk.Emulation.Cores/Consoles/Nintendo/VB/LibVirtualBoyee.cs +++ b/BizHawk.Emulation.Cores/Consoles/Nintendo/VB/LibVirtualBoyee.cs @@ -37,10 +37,23 @@ namespace BizHawk.Emulation.Cores.Consoles.Nintendo.VB } [StructLayout(LayoutKind.Sequential)] - public class NativeSettings + public class NativeSyncSettings { public int InstantReadHack; public int DisableParallax; + + public static NativeSyncSettings FromFrontendSettings(VirtualBoyee.SyncSettings ss) + { + return new NativeSyncSettings + { + InstantReadHack = ss.InstantReadHack ? 1 : 0, + DisableParallax = ss.DisableParallax ? 1 : 0, + }; + } + } + + public class NativeSettings + { public int ThreeDeeMode; public int SwapViews; public int AnaglyphPreset; @@ -56,12 +69,10 @@ namespace BizHawk.Emulation.Cores.Consoles.Nintendo.VB return c.ToArgb(); } - public static NativeSettings FromFrontendSettings(VirtualBoyee.Settings s, VirtualBoyee.SyncSettings ss) + public static NativeSettings FromFrontendSettings(VirtualBoyee.Settings s) { return new NativeSettings { - InstantReadHack = ss.InstantReadHack ? 1 : 0, - DisableParallax = ss.DisableParallax ? 1 : 0, ThreeDeeMode = (int)s.ThreeDeeMode, SwapViews = s.SwapViews ? 1 : 0, AnaglyphPreset = (int)s.AnaglyphPreset, @@ -77,7 +88,10 @@ namespace BizHawk.Emulation.Cores.Consoles.Nintendo.VB [BizImport(CC)] - public abstract bool Load(byte[] rom, int length, [In]NativeSettings settings); + public abstract bool Load(byte[] rom, int length, NativeSyncSettings settings); + + [BizImport(CC)] + public abstract void SetSettings(NativeSettings settings); [BizImport(CC)] public abstract void HardReset(); diff --git a/BizHawk.Emulation.Cores/Consoles/Nintendo/VB/VirtualBoyee.cs b/BizHawk.Emulation.Cores/Consoles/Nintendo/VB/VirtualBoyee.cs index 43b7e26ada..2b564a11e3 100644 --- a/BizHawk.Emulation.Cores/Consoles/Nintendo/VB/VirtualBoyee.cs +++ b/BizHawk.Emulation.Cores/Consoles/Nintendo/VB/VirtualBoyee.cs @@ -24,7 +24,7 @@ namespace BizHawk.Emulation.Cores.Consoles.Nintendo.VB [CoreConstructor("VB")] public VirtualBoyee(CoreComm comm, byte[] rom, Settings settings, SyncSettings syncSettings) - :base(comm, new Configuration + : base(comm, new Configuration { DefaultFpsNumerator = 20000000, DefaultFpsDenominator = 397824, @@ -38,8 +38,6 @@ namespace BizHawk.Emulation.Cores.Consoles.Nintendo.VB { _settings = settings ?? new Settings(); _syncSettings = syncSettings ?? new SyncSettings(); - // TODO: the way settings work in this core, changing the non-sync ones will invalidate savestates - var nativeSettings = LibVirtualBoyee.NativeSettings.FromFrontendSettings(_settings, _syncSettings); _boyee = PreInit(new PeRunnerOptions { @@ -50,7 +48,7 @@ namespace BizHawk.Emulation.Cores.Consoles.Nintendo.VB PlainHeapSizeKB = 256 }); - if (!_boyee.Load(rom, rom.Length, nativeSettings)) + if (!_boyee.Load(rom, rom.Length, LibVirtualBoyee.NativeSyncSettings.FromFrontendSettings(_syncSettings))) throw new InvalidOperationException("Core rejected the rom"); // do a quick hack up for frame zero size @@ -60,6 +58,8 @@ namespace BizHawk.Emulation.Cores.Consoles.Nintendo.VB BufferHeight = tmp.Height; PostInit(); + + _boyee.SetSettings(LibVirtualBoyee.NativeSettings.FromFrontendSettings(_settings)); } protected override LibWaterboxCore.FrameInfo FrameAdvancePrep(IController controller, bool render, bool rendersound) diff --git a/output/dll/vb.wbx.gz b/output/dll/vb.wbx.gz index cda73284d93b62430585ac279d508d1d7adbfe41..cec6e7d75bcfaf81b56e06b50306d0298ddc27f9 100644 GIT binary patch literal 38318 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 bcEzsR_(w}8YD6mS9L@Ov9kYoS4srniS(KX8 diff --git a/waterbox/vb/vb.cpp b/waterbox/vb/vb.cpp index 9087ea46dd..b70042ae89 100644 --- a/waterbox/vb/vb.cpp +++ b/waterbox/vb/vb.cpp @@ -26,10 +26,13 @@ namespace MDFN_IEN_VB { -struct NativeSettings +struct NativeSyncSettings { int InstantReadHack; int DisableParallax; +}; +struct NativeSettings +{ int ThreeDeeMode; int SwapViews; int AnaglyphPreset; @@ -56,14 +59,14 @@ enum }; static const uint32 AnaglyphPreset_Colors[][2] = -{ - {0, 0}, - {0xFF0000, 0x0000FF}, - {0xFF0000, 0x00B7EB}, - {0xFF0000, 0x00FFFF}, - {0xFF0000, 0x00FF00}, - {0x00FF00, 0xFF00FF}, - {0xFFFF00, 0x0000FF}, + { + {0, 0}, + {0xFF0000, 0x0000FF}, + {0xFF0000, 0x00B7EB}, + {0xFF0000, 0x00FFFF}, + {0xFF0000, 0x00FF00}, + {0x00FF00, 0xFF00FF}, + {0xFFFF00, 0x0000FF}, }; static uint32 VB3DMode; @@ -501,7 +504,6 @@ void VB_ExitLoop(void) VB_V810->Exit(); } - /*MDFNGI EmulatedVB = { @@ -552,7 +554,7 @@ void VB_ExitLoop(void) using namespace MDFN_IEN_VB; -EXPORT int Load(const uint8 *rom, int length, const NativeSettings* settings) +EXPORT int Load(const uint8 *rom, int length, const NativeSyncSettings *syncSettings) { const uint64 rom_size = length; V810_Emu_Mode cpu_mode = V810_EMU_MODE_ACCURATE; @@ -660,20 +662,20 @@ EXPORT int Load(const uint8 *rom, int length, const NativeSettings* settings) VB_VSU = new VSU(); VBINPUT_Init(); - VB3DMode = settings->ThreeDeeMode; - uint32 prescale = settings->InterlacePrescale; - uint32 sbs_separation = settings->SideBySideSeparation; - bool reverse = settings->SwapViews; + VB3DMode = 0; + uint32 prescale = 1; + uint32 sbs_separation = 0; + bool reverse = false; VIP_Set3DMode(VB3DMode, reverse, prescale, sbs_separation); - VIP_SetParallaxDisable(settings->DisableParallax); + VIP_SetParallaxDisable(syncSettings->DisableParallax); { - auto presetColor = settings->AnaglyphPreset; + auto presetColor = 1; - uint32 lcolor = settings->AnaglyphCustomLeftColor; - uint32 rcolor = settings->AnaglyphCustomRightColor; + uint32 lcolor = 0xff0000; + uint32 rcolor = 0x00ff00; if (presetColor != ANAGLYPH_PRESET_DISABLED) { @@ -681,12 +683,12 @@ EXPORT int Load(const uint8 *rom, int length, const NativeSettings* settings) rcolor = AnaglyphPreset_Colors[presetColor][1]; } VIP_SetAnaglyphColors(lcolor, rcolor); - VIP_SetDefaultColor(settings->NonAnaglyphColor); + VIP_SetDefaultColor(0xffffff); } - VBINPUT_SetInstantReadHack(settings->InstantReadHack); + VBINPUT_SetInstantReadHack(syncSettings->InstantReadHack); - VIP_SetLEDOnScale(settings->LedOnScale / 1000.0); + VIP_SetLEDOnScale(1750 / 1000.0); VB_Power(); @@ -731,7 +733,34 @@ EXPORT int Load(const uint8 *rom, int length, const NativeSettings* settings) return 1; } -EXPORT void GetMemoryAreas(MemoryArea* m) +EXPORT void SetSettings(const NativeSettings *settings) +{ + VB3DMode = settings->ThreeDeeMode; + uint32 prescale = settings->InterlacePrescale; + uint32 sbs_separation = settings->SideBySideSeparation; + bool reverse = settings->SwapViews; + + VIP_Set3DMode(VB3DMode, reverse, prescale, sbs_separation); + + { + auto presetColor = settings->AnaglyphPreset; + + uint32 lcolor = settings->AnaglyphCustomLeftColor; + uint32 rcolor = settings->AnaglyphCustomRightColor; + + if (presetColor != ANAGLYPH_PRESET_DISABLED) + { + lcolor = AnaglyphPreset_Colors[presetColor][0]; + rcolor = AnaglyphPreset_Colors[presetColor][1]; + } + VIP_SetAnaglyphColors(lcolor, rcolor); + VIP_SetDefaultColor(settings->NonAnaglyphColor); + } + + VIP_SetLEDOnScale(settings->LedOnScale / 1000.0); +} + +EXPORT void GetMemoryAreas(MemoryArea *m) { m[0].Data = WRAM; m[0].Name = "WRAM"; @@ -749,7 +778,7 @@ EXPORT void GetMemoryAreas(MemoryArea* m) m[2].Flags = MEMORYAREA_FLAGS_WORDSIZE4; } -EXPORT void FrameAdvance(MyFrameInfo* frame) +EXPORT void FrameAdvance(MyFrameInfo *frame) { v810_timestamp_t v810_timestamp; lagged = true; @@ -779,7 +808,7 @@ EXPORT void FrameAdvance(MyFrameInfo* frame) VB_V810->ResetTS(0); } -EXPORT void PredictFrameSize(MyFrameInfo* frame) +EXPORT void PredictFrameSize(MyFrameInfo *frame) { VIP_CalcFrameSize(frame); } diff --git a/waterbox/vb/vip.cpp b/waterbox/vb/vip.cpp index abb7635b53..9810130362 100644 --- a/waterbox/vb/vip.cpp +++ b/waterbox/vb/vip.cpp @@ -21,6 +21,7 @@ #include "vb.h" #include +#include "../emulibc/emulibc.h" #define VIP_DBGMSG(format, ...) \ { \ @@ -67,8 +68,8 @@ static uint32 ColorLUT[2][256]; static int32 BrightnessCache[4]; static uint32 BrightCLUT[2][4]; -static float ColorLUTNoGC[2][256][3]; -static uint32 AnaSlowColorLUT[256][256]; +static float ECL_INVISIBLE ColorLUTNoGC[2][256][3]; +static uint32 ECL_INVISIBLE AnaSlowColorLUT[256][256]; static bool VidSettingsDirty; static bool ParallaxDisabled; From fd63acd644ec279d3f3b51473ad5e76570f67d25 Mon Sep 17 00:00:00 2001 From: zeromus Date: Thu, 20 Jul 2017 17:18:08 -0500 Subject: [PATCH 55/93] ogl display method: dont crash when disposing if user's system can't compile shaders. also print some diagnostics for cgc failures to console --- Bizware/BizHawk.Bizware.BizwareGL.OpenTK/IGL_TK.cs | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/Bizware/BizHawk.Bizware.BizwareGL.OpenTK/IGL_TK.cs b/Bizware/BizHawk.Bizware.BizwareGL.OpenTK/IGL_TK.cs index 7bf1154656..0dd236b7b7 100644 --- a/Bizware/BizHawk.Bizware.BizwareGL.OpenTK/IGL_TK.cs +++ b/Bizware/BizHawk.Bizware.BizwareGL.OpenTK/IGL_TK.cs @@ -346,6 +346,11 @@ namespace BizHawk.Bizware.BizwareGL.Drivers.OpenTK public void FreePipeline(Pipeline pipeline) { var pw = pipeline.Opaque as PipelineWrapper; + + //unavailable pipelines will have no opaque + if (pw == null) + return; + GL.DeleteProgram(pw.pid); pw.FragmentShader.Release(); @@ -686,9 +691,13 @@ namespace BizHawk.Bizware.BizwareGL.Drivers.OpenTK { var cgc = new CGC(); var results = cgc.Run(source, entry, type == ShaderType.FragmentShader ? "glslf" : "glslv", false); - + if (!results.Succeeded) + { + Console.WriteLine("CGC failed"); + Console.WriteLine(results.Errors); return new Shader(this, null, false); + } source = results.Code; sw.MapCodeToNative = results.MapCodeToNative; From d640c16cff0c220f1850e6135b461569f7ebf55c Mon Sep 17 00:00:00 2001 From: nattthebear Date: Thu, 20 Jul 2017 18:39:51 -0400 Subject: [PATCH 56/93] sameboi: fix lag flag and input callback on non-sgb mode --- output/dll/sameboy.wbx.gz | Bin 58573 -> 58625 bytes waterbox/sameboy/memory.c | 6 ++++-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/output/dll/sameboy.wbx.gz b/output/dll/sameboy.wbx.gz index c810c4beead9c4e0539a4e65ccab05dafb5b6f32..400fff95a3f2a05000846d0c1406de173fff44f4 100644 GIT binary patch literal 58625 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 diff --git a/waterbox/sameboy/memory.c b/waterbox/sameboy/memory.c index f53aac608d..6988beb4cd 100644 --- a/waterbox/sameboy/memory.c +++ b/waterbox/sameboy/memory.c @@ -135,12 +135,14 @@ static uint8_t read_high_memory(GB_gameboy_t *gb, uint16_t addr) } if (addr < 0xFF80) { - if (addr == 0xff00 && gb->is_sgb) + if (addr == 0xff00) { if (gb->input_callback) gb->input_callback(gb); gb->lagged = false; - return sgb_read_ff00(gb->cycles_since_epoch); + if (gb->is_sgb) { + return sgb_read_ff00(gb->cycles_since_epoch); + } } switch (addr & 0xFF) { From 19a9275a9ef97c9191ef9beaf6b645b772e15867 Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Thu, 20 Jul 2017 18:50:47 -0400 Subject: [PATCH 57/93] Atari7800Hawk: Fix some Maria bugs --- .../Consoles/Atari/A7800Hawk/Maria.cs | 56 ++++++++++++------- 1 file changed, 37 insertions(+), 19 deletions(-) diff --git a/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/Maria.cs b/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/Maria.cs index b6d8e91113..401446dc94 100644 --- a/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/Maria.cs +++ b/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/Maria.cs @@ -84,6 +84,8 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk public bool current_DLL_H16; public bool current_DLL_H8; + public bool overrun_dma; + public int header_counter; public int[] header_counter_max = new int [2]; public int header_pointer; // since headers could be 4 or 5 bytes, we need a seperate pointer @@ -173,6 +175,7 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk DMA_phase = DMA_START_UP; DMA_phase_counter = 0; do_dma = true; + sl_DMA_complete = false; } else if (!sl_DMA_complete && do_dma) { @@ -186,6 +189,20 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk current_DLL_DLI = false; } + if (overrun_dma && sl_DMA_complete) + { + if (GFX_index == 1) + { + GFX_index = 0; + } + else + { + GFX_index = 1; + } + + overrun_dma = false; + } + if (DLI_countdown > 0) { DLI_countdown--; @@ -201,10 +218,10 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk } - if (cycle == 440 && !sl_DMA_complete && do_dma && (DMA_phase == DMA_GRAPHICS || DMA_phase == DMA_HEADER)) + if (cycle == 453 && !sl_DMA_complete && do_dma && (DMA_phase == DMA_GRAPHICS || DMA_phase == DMA_HEADER)) { + overrun_dma = true; //Console.WriteLine(scanline); - if (current_DLL_offset == 0) { DMA_phase = DMA_SHUTDOWN_LAST; @@ -232,17 +249,18 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk cycle = 0; Core.tia._hsyncCnt = 0; Core.cpu.RDY = true; - do_dma = false; - sl_DMA_complete = false; // swap sacnline buffers - if (GFX_index == 1) + if (!overrun_dma) { - GFX_index = 0; - } - else - { - GFX_index = 1; + if (GFX_index == 1) + { + GFX_index = 0; + } + else + { + GFX_index = 1; + } } } } @@ -403,13 +421,13 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk addr_t = ReadMemory((ushort)(GFX_Objects[GFX_index, header_counter].addr + i)); addr_t |= (ushort)((Core.Maria_regs[0x14] + current_DLL_offset) << 8); - if (((current_DLL_H16 && addr_t.Bit(12)) || (current_DLL_H8 && addr_t.Bit(11))) && (addr_t > 0x8000)) + if (((current_DLL_H16 && addr_t.Bit(12)) || (current_DLL_H8 && addr_t.Bit(11))) && (addr_t >= 0x8000)) { - if (i * ch_size < 64) + if (i * ch_size < 128) { GFX_Objects[GFX_index, header_counter].obj[i * ch_size] = 0; } - if ((i * ch_size + 1 < 32) && (ch_size == 2)) + if ((i * ch_size + 1 < 128) && (ch_size == 2)) { GFX_Objects[GFX_index, header_counter].obj[i * ch_size + 1] = 0; } @@ -421,7 +439,7 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk { graphics_read_time -= 9; } - + } else { @@ -444,7 +462,7 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk { addr_t = (ushort)(GFX_Objects[GFX_index, header_counter].addr + (current_DLL_offset << 8) + i); - if (((current_DLL_H16 && addr_t.Bit(12)) || (current_DLL_H8 && addr_t.Bit(11))) && (addr_t > 0x8000)) + if (((current_DLL_H16 && addr_t.Bit(12)) || (current_DLL_H8 && addr_t.Bit(11))) && (addr_t >= 0x8000)) { GFX_Objects[GFX_index, header_counter].obj[i] = 0; graphics_read_time -= 3; @@ -537,7 +555,7 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk if (disp_mode == 0) { local_width = GFX_Objects[local_GFX_index, i].width; - + for (int j = 0; j < local_width; j++) { for (int k = 3; k >= 0; k--) @@ -580,12 +598,12 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk else if (disp_mode == 2) // note: 1 is not used { local_width = GFX_Objects[local_GFX_index, i].width; - + for (int j = 0; j < local_width; j++) { for (int k = 7; k >= 0; k--) { - index = local_start * 2 + j * 8 + (7 - k); + index = local_start * 4 + j * 8 + (7 - k); if (index > 511) { @@ -772,7 +790,7 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk else { local_width = GFX_Objects[local_GFX_index, i].width; - + for (int j = 0; j < local_width; j++) { for (int k = 7; k >= 0; k--) From 182cf4228b90b25bcacadf34872e38711fc0db40 Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Thu, 20 Jul 2017 19:42:31 -0400 Subject: [PATCH 58/93] Update A7800 DB --- Assets/gamedb/gamedb_a7800.txt | 106 +++++++++++++++++---------------- 1 file changed, 55 insertions(+), 51 deletions(-) diff --git a/Assets/gamedb/gamedb_a7800.txt b/Assets/gamedb/gamedb_a7800.txt index f72db6fd92..5274e0aada 100644 --- a/Assets/gamedb/gamedb_a7800.txt +++ b/Assets/gamedb/gamedb_a7800.txt @@ -1,9 +1,13 @@ ;;NOTE: These hashes were generated using trimmed ROM headers +;0 = normal cart (no banking or pokey or RAM) +;1 = Super Game mapper (standard mapper) + md5:91041AADD1700A7A4076F4005F2C362F Diagnostics A78 NTSC=true;board=0 md5:89E7B20E7E0C629D00C6CA68949A216F Test Rom A78 NTSC=true;board=0 md5:4332c24e4f3bc72e7fe1b77adf66c2b7 3D Asteroids A78 NTSC=true;board=0 -md5:0be996d25144966d5541c9eb4919b289 Ace of Aces A78 NTSC=true;board=A78SG -md5:aadde920b3aaba03bc10b40bd0619c94 Ace of Aces A78 PAL=true;board=A78SG +md5:A0285769753B18C407CB6E818B7DCAD2 3D Asteroids A78 NTSC=true;board=0 +md5:0be996d25144966d5541c9eb4919b289 Ace of Aces A78 NTSC=true;board=1 +md5:aadde920b3aaba03bc10b40bd0619c94 Ace of Aces A78 PAL=true;board=1 md5:877dcc97a775ed55081864b2dbf5f1e2 Alien Brigade A78 NTSC=true;board=A78S9 md5:de3e9496cb7341f865f27e5a72c7f2f5 Alien Brigade A78 PAL=true;board=A78S9 md5:0a9e58ef5eb9ff93246e0fff684dc7f1 Arkanoid (0911) A78 NTSC=true;board=0P @@ -13,10 +17,10 @@ md5:1baf41de200f26ec643625021290bec2 Asteroids Deluxe A78 PAL=true;board=0 md5:07342c78619ba6ffcc61c10e907e3b50 Asteroids A78 NTSC=true;board=0 md5:8fc3a695eaea3984912d98ed4a543376 Ballblazer A78 NTSC=true;board=0P md5:b558814d54904ce0582e2f6a801d03af Ballblazer A78 PAL=true;board=0P -md5:42682415906c21c6af80e4198403ffda Barnyard Blaster A78 NTSC=true;board=A78SG -md5:babe2bc2976688bafb8b23c192658126 Barnyard Blaster A78 PAL=true;board=A78SG -md5:f5f6b69c5eb4b55fc163158d1a6b423e Basketbrawl A78 NTSC=true;board=A78SG -md5:fba002089fcfa176454ab507e0eb76cb Basketbrawl A78 PAL=true;board=A78SG +md5:42682415906c21c6af80e4198403ffda Barnyard Blaster A78 NTSC=true;board=1 +md5:babe2bc2976688bafb8b23c192658126 Barnyard Blaster A78 PAL=true;board=1 +md5:f5f6b69c5eb4b55fc163158d1a6b423e Basketbrawl A78 NTSC=true;board=1 +md5:fba002089fcfa176454ab507e0eb76cb Basketbrawl A78 PAL=true;board=1 md5:6010a398070dfacb4c0173d75d73c50a Beef Drop A78 NTSC=true;board=0 md5:c534db0a062225b17cfb8ecce0fb9090 Beef Drop A78 NTSC=true;board=0 md5:CE25D34071B2C798ACE4C8792EAE8E84 Beef Drop A78 NTSC=true;board=0 @@ -26,17 +30,17 @@ md5:38c056a48472d9a9e16ebda5ed91dae7 Centipede A78 PAL=true;board=0 md5:93e4387864b014c155d7c17877990d1e Choplifter! A78 NTSC=true;board=0 md5:59d4edb0230b5acc918b94f6bc94779f Choplifter! A78 PAL=true;board=0 md5:441ac404cdc7bcbd4d787f911df7bf0d Color Test A78 NTSC=true;board=0 -md5:2e8e28f6ad8b9b9267d518d880c73ebb Commando A78 NTSC=true;board=A78SGP -md5:55da6c6c3974d013f517e725aa60f48e Commando A78 PAL=true;board=A78SGP -md5:db691469128d9a4217ec7e315930b646 Crack'ed A78 NTSC=true;board=A78SG -md5:7cbe78fa06f47ba6516a67a4b003c9ee Crack'ed A78 PAL=true;board=A78SG +md5:2e8e28f6ad8b9b9267d518d880c73ebb Commando A78 NTSC=true;board=1P +md5:55da6c6c3974d013f517e725aa60f48e Commando A78 PAL=true;board=1P +md5:db691469128d9a4217ec7e315930b646 Crack'ed A78 NTSC=true;board=1 +md5:7cbe78fa06f47ba6516a67a4b003c9ee Crack'ed A78 PAL=true;board=1 md5:0c9b124355d5328697a3b9e0011353f2 Crazy Brix A78 NTSC=true;board=0 md5:45e1d527becc96d1715e810d1c07ac27 Crazy Brix A78 NTSC=true;board=0 md5:fc7db1a9243ce2140f716762b8352a5c Crazy Brix A78 PAL=true;board=0 md5:a94e4560b6ad053a1c24e096f1262ebf Crossbow A78 NTSC=true;board=A78S9 md5:63db371d67a98daec547b2abd5e7aa95 Crossbow A78 PAL=true;board=A78S9 -md5:179b76ff729d4849b8f66a502398acae CDark Chambers A78 NTSC=true;board=A78SG -md5:a2b8e2f159642c4b91de82e9a2928494 Dark Chambers A78 PAL=true;board=A78SG +md5:179b76ff729d4849b8f66a502398acae CDark Chambers A78 NTSC=true;board=1 +md5:a2b8e2f159642c4b91de82e9a2928494 Dark Chambers A78 PAL=true;board=1 md5:95ac811c7d27af0032ba090f28c107bd Desert Falcon A78 NTSC=true;board=0 md5:2d5d99b993a885b063f9f22ce5e6523d Desert Falcon A78 PAL=true;board=0 md5:731879ea82fc0ca245e39e036fe293e6 Dig Dug A78 NTSC=true;board=0 @@ -51,10 +55,10 @@ md5:2251a6a0f3aec84cc0aff66fc9fa91e8 F-18 Hornet A78 NTSC=true;board=A78AB md5:e7709da8e49d3767301947a0a0b9d2e6 F-18 Hornet A78 PAL=true;board=A78AB md5:6287727ab36391a62f728bbdee88675c FailSafe A78 NTSC=true;board=A7848 md5:d2bb22f704f1610a4c396c51f5188e15 FailSafe A78 NTSC=true;board=A7848 -md5:d25d5d19188e9f149977c49eb0367cd1 Fatal Run A78 NTSC=true;board=A78SG -md5:23505651ac2e47f3637152066c3aa62f Fatal Run A78 PAL=true;board=A78SG -md5:e80f24e953563e6b61556737d67d3836 Fight Night A78 PAL=true;board=A78SG -md5:07dbbfe612a0a28e283c01545e59f25e Fight Night A78 NTSC=true;board=A78SG +md5:d25d5d19188e9f149977c49eb0367cd1 Fatal Run A78 NTSC=true;board=1 +md5:23505651ac2e47f3637152066c3aa62f Fatal Run A78 PAL=true;board=1 +md5:e80f24e953563e6b61556737d67d3836 Fight Night A78 PAL=true;board=1 +md5:07dbbfe612a0a28e283c01545e59f25e Fight Night A78 NTSC=true;board=1 md5:cf76b00244105b8e03cdc37677ec1073 Food Fight A78 NTSC=true;board=0 md5:de0d4f5a9bf1c1bddee3ed2f7ec51209 Food Fight A78 PAL=true;board=0 md5:45136d1d9eddf0bebad32995647b3298 Frogger Demo A78 NTSC=true;board=0 @@ -63,45 +67,45 @@ md5:f5dc7dc8e38072d3d65bd90a660148ce Galaga A78 PAL=true;board=0 md5:06204dadc975be5e5e37e7cc66f984cf Gato A78 NTSC=true;board=0 md5:0baec96787ce17f390e204de1a136e59 Hat Trick A78 PAL=true;board=0 md5:fd9e78e201b6baafddfd3e1fbfe6ba31 Hat Trick A78 NTSC=true;board=0 -md5:c3672482ca93f70eafd9134b936c3feb Ikari Warriors A78 NTSC=true;board=A78SG -md5:8c2c2a1ea6e9a928a44c3151ba5c1ce3 Ikari Warriors A78 PAL=true;board=A78SG -md5:1745feadabb24e7cefc375904c73fa4c Impossible Mission Fixed A78 NTSC=true;board=A78SGR -md5:baebc9246c087e893dfa489632157180 Impossible Mission A78 NTSC=true;board=A78SGR -md5:80dead01ea2db5045f6f4443faa6fce8 Impossible Mission A78 PAL=true;board=A78SGR -md5:045fd12050b7f2b842d5970f2414e912 Jinks A78 NTSC=true;board=A78SGR -md5:dfb86f4d06f05ad00cf418f0a59a24f7 Jinks A78 PAL=true;board=A78SGR +md5:c3672482ca93f70eafd9134b936c3feb Ikari Warriors A78 NTSC=true;board=1 +md5:8c2c2a1ea6e9a928a44c3151ba5c1ce3 Ikari Warriors A78 PAL=true;board=1 +md5:1745feadabb24e7cefc375904c73fa4c Impossible Mission Fixed A78 NTSC=true;board=1R +md5:baebc9246c087e893dfa489632157180 Impossible Mission A78 NTSC=true;board=1R +md5:80dead01ea2db5045f6f4443faa6fce8 Impossible Mission A78 PAL=true;board=1R +md5:045fd12050b7f2b842d5970f2414e912 Jinks A78 NTSC=true;board=1R +md5:dfb86f4d06f05ad00cf418f0a59a24f7 Jinks A78 PAL=true;board=1R md5:f18b3b897a25ab3885b43b4bd141b396 Joust A78 NTSC=true;board=0 md5:f2dae0264a4b4a73762b9d7177e989f6 Joust A78 PAL=true;board=0 md5:548ba2e54e4fc45ab84ed634d702c136 Jr. Ms. Pac-Man A78 NTSC=true;board=0P md5:6bc2daeb48e28d103a4298a276e7e551 Jr. Pac-Man (Tunnels) A78 NTSC=true;board=0P -md5:0b3baf47886915dd2eec5da7671bfa63 Jr. Pac-Man A78 NTSC=true;board=A78SGR -md5:8281ab17fa3bfc0a6c497d6a4f350061 Jr. Pac-Man A78 NTSC=true;board=A78SGR -md5:17b3b764d33eae9b5260f01df7bb9d2f KLAX A78 NTSC=true;board=A78SG +md5:0b3baf47886915dd2eec5da7671bfa63 Jr. Pac-Man A78 NTSC=true;board=1R +md5:8281ab17fa3bfc0a6c497d6a4f350061 Jr. Pac-Man A78 NTSC=true;board=1R +md5:17b3b764d33eae9b5260f01df7bb9d2f KLAX A78 NTSC=true;board=1 md5:5e0a1e832bbcea6facb832fde23a440a Karateka A78 PAL=true;board=A78S4 md5:c3a5a8692a423d43d9d28dd5b7d109d9 Karateka A78 NTSC=true;board=0 md5:f57d0af323d4e173fb49ed447f0563d7 Kung-Fu Master A78 NTSC=true;board=0 md5:2931b75811ad03f3ac9330838f3d231b Kung-Fu Master A78 PAL=true;board=0 md5:431ca060201ee1f9eb49d44962874049 Mario Bros. A78 NTSC=true;board=0 md5:d2e861306be78e44248bb71d7475d8a3 Mario Bros. A78 PAL=true;board=0 -md5:37b5692e33a98115e574185fa8398c22 Mat Mania Challenge A78 NTSC=true;board=A78SG -md5:6819c37b96063b024898a19dbae2df54 Mat Mania Challenge A78 PAL=true;board=A78SG -md5:f2f5e5841e4dda89a2faf8933dc33ea6 Mean 18 Ultimate Golf A78 NTSC=true;board=A78SG -md5:2e9dbad6c0fa381a6cd1bb9abf98a104 Mean 18 Ultimate Golf A78 PAL=true;board=A78SG -md5:bedc30ec43587e0c98fc38c39c1ef9d0 Meltdown A78 NTSC=true;board=A78SG -md5:c80155d7eec9e3dcb79aa6b83c9ccd1e Meltdown A78 PAL=true;board=A78SG +md5:37b5692e33a98115e574185fa8398c22 Mat Mania Challenge A78 NTSC=true;board=1 +md5:6819c37b96063b024898a19dbae2df54 Mat Mania Challenge A78 PAL=true;board=1 +md5:f2f5e5841e4dda89a2faf8933dc33ea6 Mean 18 Ultimate Golf A78 NTSC=true;board=1 +md5:2e9dbad6c0fa381a6cd1bb9abf98a104 Mean 18 Ultimate Golf A78 PAL=true;board=1 +md5:bedc30ec43587e0c98fc38c39c1ef9d0 Meltdown A78 NTSC=true;board=1 +md5:c80155d7eec9e3dcb79aa6b83c9ccd1e Meltdown A78 PAL=true;board=1 md5:b02f93661f4b7e712810d2bf8e02ad79 Meteor Shower A78 NTSC=true;board=0 md5:2f1f199ecc2b414d28e01f0de53ca8f7 Meteor Shower A78 PAL=true;board=0 -md5:bc1e905db1008493a9632aa83ab4682b Midnight Mutants A78 NTSC=true;board=A78SG -md5:6794ea31570eba0b88a0bf1ead3f3f1b Midnight Mutants A78 PAL=true;board=A78SG +md5:bc1e905db1008493a9632aa83ab4682b Midnight Mutants A78 NTSC=true;board=1 +md5:6794ea31570eba0b88a0bf1ead3f3f1b Midnight Mutants A78 PAL=true;board=1 md5:017066f522908081ec3ee624f5e4a8aa Missing in Action A78 NTSC=true;board=A78S9 md5:d0f46bf92ed6e7b1cce63278420cae8a Missing in Action A78 NTSC=true;board=A78S9 md5:9ff38ea62004201d870caa8bd9463525 Moon Cresta A78 NTSC=true;board=0 -md5:3bc8f554cf86f8132a623cc2201a564b Motor Psycho A78 NTSC=true;board=A78SG -md5:5330bfe428a6b601b7e76c2cfc4cd049 Motor Psycho A78 PAL=true;board=A78SG +md5:3bc8f554cf86f8132a623cc2201a564b Motor Psycho A78 NTSC=true;board=1 +md5:5330bfe428a6b601b7e76c2cfc4cd049 Motor Psycho A78 PAL=true;board=1 md5:fc0ea52a9fac557251b65ee680d951e5 Ms. Pac-Man A78 NTSC=true;board=0 md5:56469e8c5ff8983c6cb8dadc64eb0363 Ms. Pac-Man A78 PAL=true;board=0 -md5:220121f771fc4b98cef97dc040e8d378 Ninja Golf A78 NTSC=true;board=A78SG -md5:ea0c859aa54fe5eaf4c1f327fab06221 Ninja Golf A78 PAL=true;board=A78SG +md5:220121f771fc4b98cef97dc040e8d378 Ninja Golf A78 NTSC=true;board=1 +md5:ea0c859aa54fe5eaf4c1f327fab06221 Ninja Golf A78 PAL=true;board=1 md5:74569571a208f8b0b1ccfb22d7c914e1 One on One Basketball A78 NTSC=true;board=0 md5:8dba0425f0262e5704581d8757a1a6e3 One on One Basketball A78 PAL=true;board=0 md5:5d7bc7092de69095137456733e7b685d Pac-Man Collection A78 NTSC=true;board=0 @@ -109,9 +113,9 @@ md5:90223a8a363bdf643a19d0f97e63b1b2 PacArcade A78 NTSC=true;board=0 md5:386bded4a944bae455fedf56206dd1dd Pete Rose Baseball A78 PAL=true;board=0 md5:1a5207870dec6fae9111cb747e20d8e3 Pete Rose Baseball A78 NTSC=true;board=0 md5:05f43244465943ce819780a71a5b572a Pitfighter A78 NTSC=true;board=A78S4 -md5:33aea1e2b6634a1dec8c7006d9afda22 Planet Smashers A78 NTSC=true;board=A78SG -md5:2837a8fd49b7fc7ccd70fd45b69c5099 Planet Smashers A78 PAL=true;board=A78SG -md5:86546808dc60961cdb1b20e761c50ab1 Plutos A78 NTSC=true;board=A78SGR +md5:33aea1e2b6634a1dec8c7006d9afda22 Planet Smashers A78 NTSC=true;board=1 +md5:2837a8fd49b7fc7ccd70fd45b69c5099 Planet Smashers A78 PAL=true;board=1 +md5:86546808dc60961cdb1b20e761c50ab1 Plutos A78 NTSC=true;board=1R md5:584582bb09ee8122e7fc09dc7d1ed813 Pole Position II A78 NTSC=true;board=0 md5:865457e0e0f48253b08f77b9e18f93b2 Pole Position II A78 PAL=true;board=0 md5:66e7230f7ef9d14db82d76b06b241bc0 Q-bert A78 NTSC=true;board=0 @@ -127,15 +131,15 @@ md5:57651b6c8e62811fab0361cea537b79c Scramble A78 NTSC=true;board=0 md5:c265cfd65534a4514f226cb4c7f7d6bf Scramble A78 NTSC=true;board=0 md5:1ee26fc6b06b4c9ba74931914b7e719d Scramble A78 PAL=true;board=0 md5:65fe82f419f6583a0f9a736242cb303d Scramble A78 PAL=true;board=0 -md5:980c35ae9625773a450aa7ef51751c04 Scrapyard Dog A78 NTSC=true;board=A78SG -md5:53db322c201323fe2ca8f074c0a2bf86 Scrapyard Dog A78 PAL=true;board=A78SG -md5:b697d9c2d1b9f6cb21041286d1bbfa7f Sentinel A78 NTSC=true;board=A78SG -md5:5469b4de0608f23a5c4f98f331c9e75f Sentinel A78 PAL=true;board=A78SG -md5:2d643ac548c40e58c99d0fe433ba4ba0 Sirius A78 NTSC=true;board=A78SGR +md5:980c35ae9625773a450aa7ef51751c04 Scrapyard Dog A78 NTSC=true;board=1 +md5:53db322c201323fe2ca8f074c0a2bf86 Scrapyard Dog A78 PAL=true;board=1 +md5:b697d9c2d1b9f6cb21041286d1bbfa7f Sentinel A78 NTSC=true;board=1P +md5:5469b4de0608f23a5c4f98f331c9e75f Sentinel A78 PAL=true;board=1P +md5:2d643ac548c40e58c99d0fe433ba4ba0 Sirius A78 NTSC=true;board=1R md5:a84c1b2300fbfbf21b1c02387f613dad Space Duel A78 PAL=true;board=0 md5:771cb4609347657f63e6f0eb26036e35 Space Duel A78 NTSC=true;board=0 md5:6adf79558a3d7f5beca1bb8d34337417 Space Invaders A78 NTSC=true;board=0 -md5:cbb0746192540a13b4c7775c7ce2021f Summer Games A78 NTSC=true;board=A78SGR +md5:cbb0746192540a13b4c7775c7ce2021f Summer Games A78 NTSC=true;board=1R md5:cc18e3b37a507c4217eb6cb1de8c8538 Super Huey UH-IX A78 NTSC=true;board=0 md5:162f9c953f0657689cc74ab20b40280f Super Huey UH-IX A78 PAL=true;board=0 md5:59b5793bece1c80f77b55d60fb39cb94 Super Skateboardin' A78 NTSC=true;board=0 @@ -145,15 +149,15 @@ md5:3bb9c8d9adc912dd7f8471c97445cd8d Titlematch Pro Wrestling A78 PAL=true;boa md5:1af475ff6429a160752b592f0f92b287 Titlematch Pro Wrestling A78 NTSC=true;board=0 md5:c3903ab01a51222a52197dbfe6538ecf Tomcat F14 A78 NTSC=true;board=0 md5:682338364243b023ecc9d24f0abfc9a7 Tomcat F14 A78 PAL=true;board=0 -md5:208ef955fa90a29815eb097bce89bace Touchdown Football A78 NTSC=true;board=A78SG +md5:208ef955fa90a29815eb097bce89bace Touchdown Football A78 NTSC=true;board=1 md5:8d64763db3100aadc552db5e6868506a Tower Toppler A78 NTSC=true;board=A78S4R md5:32a37244a9c6cc928dcdf02b45365aa8 Tower Toppler A78 PAL=true;board=A78S4R md5:412cc5bfa08bd03244b9c4e8d46cd0a0 Wasp (Standard Edition) A78 NTSC=true;board=0 md5:427cb05d0a1abb068998e2760d77f4fb Water Ski A78 NTSC=true;board=A78S4 -md5:3799d72f78dda2ee87b0ef8bf7b91186 Winter Games A78 NTSC=true;board=A78SGR +md5:3799d72f78dda2ee87b0ef8bf7b91186 Winter Games A78 NTSC=true;board=1R md5:6813ffff510f930c867b3f0aba78ac85 Worm (0703) A78 NTSC=true;board=0 -md5:05fb699db9eef564e2fe45c568746dbc Xenophobe A78 NTSC=true;board=A78SG -md5:70937c3184f0be33d06f7f4382ca54de Xenophobe A78 PAL=true;board=A78SG +md5:05fb699db9eef564e2fe45c568746dbc Xenophobe A78 NTSC=true;board=1 +md5:70937c3184f0be33d06f7f4382ca54de Xenophobe A78 PAL=true;board=1 md5:d7dc17379aa25e5ae3c14b9e780c6f6d Xevious A78 NTSC=true;board=0 md5:b1a9f196ce5f47ca8caf8fa7bc4ca46c Xevious A78 PAL=true;board=0 md5:ce6fbdc7b037a4efdaf87267f5f292cc b*nQ A78 NTSC=true;board=0 \ No newline at end of file From 140f6036076c00635f356aac2d0585157f79f1bb Mon Sep 17 00:00:00 2001 From: adelikat Date: Fri, 21 Jul 2017 08:34:44 -0500 Subject: [PATCH 59/93] rename menu item from Pizza Boy to SameBoy, remove some commented code --- BizHawk.Client.Common/RomLoader.cs | 2 - BizHawk.Client.EmuHawk/MainForm.Designer.cs | 7020 +++++++++---------- BizHawk.Client.EmuHawk/MainForm.Events.cs | 3 +- 3 files changed, 3511 insertions(+), 3514 deletions(-) diff --git a/BizHawk.Client.Common/RomLoader.cs b/BizHawk.Client.Common/RomLoader.cs index d054ab86f6..3523776d36 100644 --- a/BizHawk.Client.Common/RomLoader.cs +++ b/BizHawk.Client.Common/RomLoader.cs @@ -920,9 +920,7 @@ namespace BizHawk.Client.Common case "GBC": if (!Global.Config.GB_AsSGB) { - //core = CoreInventory.Instance["GB", "Pizza Boy"]; core = CoreInventory.Instance["GB", "Gambatte"]; - //core = CoreInventory.Instance["GB", "SameBoy"]; } else { diff --git a/BizHawk.Client.EmuHawk/MainForm.Designer.cs b/BizHawk.Client.EmuHawk/MainForm.Designer.cs index df6e60bf23..be04630c83 100644 --- a/BizHawk.Client.EmuHawk/MainForm.Designer.cs +++ b/BizHawk.Client.EmuHawk/MainForm.Designer.cs @@ -17,440 +17,440 @@ /// private void InitializeComponent() { - this.components = new System.ComponentModel.Container(); - System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainForm)); - this.MainformMenu = new MenuStripEx(); - this.FileSubMenu = new System.Windows.Forms.ToolStripMenuItem(); - this.OpenRomMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.RecentRomSubMenu = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator3 = new System.Windows.Forms.ToolStripSeparator(); - this.OpenAdvancedMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.CloseRomMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItem1 = new System.Windows.Forms.ToolStripSeparator(); - this.SaveStateSubMenu = new System.Windows.Forms.ToolStripMenuItem(); - this.SaveState1MenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.SaveState2MenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.SaveState3MenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.SaveState4MenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.SaveState5MenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.SaveState6MenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.SaveState7MenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.SaveState8MenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.SaveState9MenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.SaveState0MenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator6 = new System.Windows.Forms.ToolStripSeparator(); - this.SaveNamedStateMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.LoadStateSubMenu = new System.Windows.Forms.ToolStripMenuItem(); - this.LoadState1MenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.LoadState2MenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.LoadState3MenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.LoadState4MenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.LoadState5MenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.LoadState6MenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.LoadState7MenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.LoadState8MenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.LoadState9MenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.LoadState0MenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator7 = new System.Windows.Forms.ToolStripSeparator(); - this.LoadNamedStateMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator21 = new System.Windows.Forms.ToolStripSeparator(); - this.AutoloadLastSlotMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.SaveSlotSubMenu = new System.Windows.Forms.ToolStripMenuItem(); - this.SelectSlot0MenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.SelectSlot1MenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.SelectSlot2MenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.SelectSlot3MenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.SelectSlot4MenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.SelectSlot5MenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.SelectSlot6MenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.SelectSlot7MenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.SelectSlot8MenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.SelectSlot9MenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.PreviousSlotMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.NextSlotMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator5 = new System.Windows.Forms.ToolStripSeparator(); - this.SaveToCurrentSlotMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.LoadCurrentSlotMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.SaveRAMSubMenu = new System.Windows.Forms.ToolStripMenuItem(); - this.FlushSaveRAMMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItem2 = new System.Windows.Forms.ToolStripSeparator(); - this.MovieSubMenu = new System.Windows.Forms.ToolStripMenuItem(); - this.ReadonlyMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator15 = new System.Windows.Forms.ToolStripSeparator(); - this.RecentMovieSubMenu = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator16 = new System.Windows.Forms.ToolStripSeparator(); - this.RecordMovieMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.PlayMovieMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.StopMovieMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.PlayFromBeginningMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.ImportMoviesMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.SaveMovieMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.SaveMovieAsMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.StopMovieWithoutSavingMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator14 = new System.Windows.Forms.ToolStripSeparator(); - this.AutomaticallyBackupMoviesMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.FullMovieLoadstatesMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.MovieEndSubMenu = new System.Windows.Forms.ToolStripMenuItem(); - this.MovieEndFinishMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.MovieEndRecordMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.MovieEndStopMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.MovieEndPauseMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.AVSubMenu = new System.Windows.Forms.ToolStripMenuItem(); - this.RecordAVMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.ConfigAndRecordAVMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.StopAVIMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator19 = new System.Windows.Forms.ToolStripSeparator(); - this.CaptureOSDMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.SynclessRecordingMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.ScreenshotSubMenu = new System.Windows.Forms.ToolStripMenuItem(); - this.ScreenshotMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.ScreenshotAsMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.ScreenshotClipboardMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.ScreenshotClientClipboardMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator20 = new System.Windows.Forms.ToolStripSeparator(); - this.ScreenshotCaptureOSDMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator4 = new System.Windows.Forms.ToolStripSeparator(); - this.ExitMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.EmulationSubMenu = new System.Windows.Forms.ToolStripMenuItem(); - this.PauseMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.RebootCoreMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); - this.SoftResetMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.HardResetMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.ViewSubMenu = new System.Windows.Forms.ToolStripMenuItem(); - this.WindowSizeSubMenu = new System.Windows.Forms.ToolStripMenuItem(); - this.x1MenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.x2MenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.x3MenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.x4MenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.x5MenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.mzMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.SwitchToFullscreenMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator(); - this.DisplayFPSMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.DisplayFrameCounterMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.DisplayLagCounterMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.DisplayInputMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.DisplayRerecordCountMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.DisplaySubtitlesMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItem4 = new System.Windows.Forms.ToolStripSeparator(); - this.DisplayStatusBarMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.DisplayMessagesMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.DisplayLogWindowMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.ConfigSubMenu = new System.Windows.Forms.ToolStripMenuItem(); - this.ControllersMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.HotkeysMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.DisplayConfigMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.SoundMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.PathsMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.FirmwaresMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.MessagesMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.AutofireMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.RewindOptionsMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.extensionsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.ClientOptionsMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.ProfilesMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator9 = new System.Windows.Forms.ToolStripSeparator(); - this.SpeedSkipSubMenu = new System.Windows.Forms.ToolStripMenuItem(); - this.ClockThrottleMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.AudioThrottleMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.VsyncThrottleMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator27 = new System.Windows.Forms.ToolStripSeparator(); - this.VsyncEnabledMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItem3 = new System.Windows.Forms.ToolStripSeparator(); - this.miUnthrottled = new System.Windows.Forms.ToolStripMenuItem(); - this.MinimizeSkippingMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.NeverSkipMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItem17 = new System.Windows.Forms.ToolStripMenuItem(); - this.Frameskip1MenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.Frameskip2MenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.Frameskip3MenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.Frameskip4MenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.Frameskip5MenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.Frameskip6MenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.Frameskip7MenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.Frameskip8MenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.Frameskip9MenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItem5 = new System.Windows.Forms.ToolStripSeparator(); - this.Speed50MenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.Speed75MenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.Speed100MenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.Speed150MenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.Speed200MenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.Speed400MenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.KeyPrioritySubMenu = new System.Windows.Forms.ToolStripMenuItem(); - this.BothHkAndControllerMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.InputOverHkMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.HkOverInputMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.CoresSubMenu = new System.Windows.Forms.ToolStripMenuItem(); - this.NesCoreSubMenu = new System.Windows.Forms.ToolStripMenuItem(); - this.QuicknesCoreMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.NesCoreMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.CoreSNESSubMenu = new System.Windows.Forms.ToolStripMenuItem(); - this.Coresnes9xMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.CorebsnesMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.GbaCoreSubMenu = new System.Windows.Forms.ToolStripMenuItem(); - this.VbaNextCoreMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.MgbaCoreMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.Atari7800CoreSubMenu = new System.Windows.Forms.ToolStripMenuItem(); - this.Emu7800CoreMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.Atari7800HawkCoreMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.SGBCoreSubmenu = new System.Windows.Forms.ToolStripMenuItem(); - this.SgbBsnesMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.SgbPizzaBoyMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.GBInSGBMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItem16 = new System.Windows.Forms.ToolStripSeparator(); - this.allowGameDBCoreOverridesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator8 = new System.Windows.Forms.ToolStripSeparator(); - this.N64VideoPluginSettingsMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.setLibretroCoreToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator10 = new System.Windows.Forms.ToolStripSeparator(); - this.SaveConfigMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.SaveConfigAsMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.LoadConfigMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.LoadConfigFromMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.ToolsSubMenu = new System.Windows.Forms.ToolStripMenuItem(); - this.ToolBoxMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator12 = new System.Windows.Forms.ToolStripSeparator(); - this.RamWatchMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.RamSearchMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.LuaConsoleMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.TAStudioMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.HexEditorMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.TraceLoggerMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.DebuggerMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.CodeDataLoggerMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.MacroToolMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.VirtualPadMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.BasicBotMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator11 = new System.Windows.Forms.ToolStripSeparator(); - this.CheatsMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.gameSharkConverterToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator29 = new System.Windows.Forms.ToolStripSeparator(); - this.MultiDiskBundlerFileMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.externalToolToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.dummyExternalTool = new System.Windows.Forms.ToolStripMenuItem(); - this.batchRunnerToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.ExperimentalToolsSubMenu = new System.Windows.Forms.ToolStripMenuItem(); - this.AutoHawkMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.NewHexEditorMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.NESSubMenu = new System.Windows.Forms.ToolStripMenuItem(); - this.coreToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.quickNESToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.nesHawkToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator34 = new System.Windows.Forms.ToolStripSeparator(); - this.NESPPUViewerMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.NESNametableViewerMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.NESGameGenieCodesMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.musicRipperToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator17 = new System.Windows.Forms.ToolStripSeparator(); - this.NesControllerSettingsMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.NESGraphicSettingsMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.NESSoundChannelsMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.VSSettingsMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.MovieSettingsMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator22 = new System.Windows.Forms.ToolStripSeparator(); - this.FDSControlsMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.FdsEjectDiskMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.VSControlsMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.VSInsertCoinP1MenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.VSInsertCoinP2MenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.VSServiceSwitchMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.barcodeReaderToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.PCESubMenu = new System.Windows.Forms.ToolStripMenuItem(); - this.PceControllerSettingsMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.PCEGraphicsSettingsMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator32 = new System.Windows.Forms.ToolStripSeparator(); - this.PCEBGViewerMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.PCEtileViewerToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.PceSoundDebuggerToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator25 = new System.Windows.Forms.ToolStripSeparator(); - this.PCEAlwaysPerformSpriteLimitMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.PCEAlwaysEqualizeVolumesMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.PCEArcadeCardRewindEnableMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.SMSSubMenu = new System.Windows.Forms.ToolStripMenuItem(); - this.SMSregionToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.SMSregionExportToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.SMSregionJapanToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.SMSregionAutoToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.SMSdisplayToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.SMSdisplayNtscToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.SMSdisplayPalToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.SMSdisplayAutoToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.SMStoolStripMenuItem2 = new System.Windows.Forms.ToolStripSeparator(); - this.SMSenableBIOSToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.SMSEnableFMChipMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.SMSOverclockMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.SMSForceStereoMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.SMSSpriteLimitMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.SMSDisplayOverscanMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.SMSFix3DGameDisplayToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.ShowClippedRegionsMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.HighlightActiveDisplayRegionMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.SMSGraphicsSettingsMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator24 = new System.Windows.Forms.ToolStripSeparator(); - this.SMSVDPViewerToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.GGGameGenieMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.TI83SubMenu = new System.Windows.Forms.ToolStripMenuItem(); - this.KeypadMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.LoadTIFileMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator13 = new System.Windows.Forms.ToolStripSeparator(); - this.AutoloadKeypadMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.paletteToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.AtariSubMenu = new System.Windows.Forms.ToolStripMenuItem(); - this.AtariSettingsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.A7800SubMenu = new System.Windows.Forms.ToolStripMenuItem(); - this.A7800ControllerSettingsMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.GBSubMenu = new System.Windows.Forms.ToolStripMenuItem(); - this.GBcoreSettingsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.LoadGBInSGBMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator28 = new System.Windows.Forms.ToolStripSeparator(); - this.GBGPUViewerMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.GBGameGenieMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.GBASubMenu = new System.Windows.Forms.ToolStripMenuItem(); - this.GBACoreSelectionSubMenu = new System.Windows.Forms.ToolStripMenuItem(); - this.GBAmGBAMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.GBAVBANextMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.GBAcoresettingsToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator33 = new System.Windows.Forms.ToolStripSeparator(); - this.GbaGpuViewerMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.PSXSubMenu = new System.Windows.Forms.ToolStripMenuItem(); - this.PSXControllerSettingsMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.PSXOptionsMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.PSXDiscControlsMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.PSXHashDiscsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.SNESSubMenu = new System.Windows.Forms.ToolStripMenuItem(); - this.SNESControllerConfigurationMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator18 = new System.Windows.Forms.ToolStripSeparator(); - this.SnesGfxDebuggerMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.SnesGBInSGBMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.SnesGameGenieMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.SnesOptionsMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.ColecoSubMenu = new System.Windows.Forms.ToolStripMenuItem(); - this.ColecoControllerSettingsMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator35 = new System.Windows.Forms.ToolStripSeparator(); - this.ColecoSkipBiosMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.N64SubMenu = new System.Windows.Forms.ToolStripMenuItem(); - this.N64PluginSettingsMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.N64ControllerSettingsMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator23 = new System.Windows.Forms.ToolStripSeparator(); - this.N64CircularAnalogRangeMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.MupenStyleLagMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.N64ExpansionSlotMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.SaturnSubMenu = new System.Windows.Forms.ToolStripMenuItem(); - this.SaturnPreferencesMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.DGBSubMenu = new System.Windows.Forms.ToolStripMenuItem(); - this.DGBsettingsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.GenesisSubMenu = new System.Windows.Forms.ToolStripMenuItem(); - this.vDPViewerToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.GenesisGameGenieECDC = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator26 = new System.Windows.Forms.ToolStripSeparator(); - this.GenesisSettingsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.wonderSwanToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.settingsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.AppleSubMenu = new System.Windows.Forms.ToolStripMenuItem(); - this.AppleDisksSubMenu = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator31 = new System.Windows.Forms.ToolStripSeparator(); - this.settingsToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); - this.C64SubMenu = new System.Windows.Forms.ToolStripMenuItem(); - this.C64DisksSubMenu = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator36 = new System.Windows.Forms.ToolStripSeparator(); - this.C64SettingsMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.IntvSubMenu = new System.Windows.Forms.ToolStripMenuItem(); - this.IntVControllerSettingsMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.sNESToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.preferencesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.virtualBoyToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.preferencesToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); - this.neoGeoPocketToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.preferencesToolStripMenuItem2 = new System.Windows.Forms.ToolStripMenuItem(); - this.HelpSubMenu = new System.Windows.Forms.ToolStripMenuItem(); - this.OnlineHelpMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.ForumsMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.FeaturesMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.AboutMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.MainStatusBar = new StatusStripEx(); - this.DumpStatusButton = new System.Windows.Forms.ToolStripDropDownButton(); - this.EmuStatus = new System.Windows.Forms.ToolStripStatusLabel(); - this.PlayRecordStatusButton = new System.Windows.Forms.ToolStripDropDownButton(); - this.PauseStatusButton = new System.Windows.Forms.ToolStripDropDownButton(); - this.RebootStatusBarIcon = new System.Windows.Forms.ToolStripStatusLabel(); - this.AVIStatusLabel = new System.Windows.Forms.ToolStripStatusLabel(); - this.LedLightStatusLabel = new System.Windows.Forms.ToolStripStatusLabel(); - this.SaveSlotsStatusLabel = new System.Windows.Forms.ToolStripStatusLabel(); - this.Slot1StatusButton = new System.Windows.Forms.ToolStripStatusLabel(); - this.Slot2StatusButton = new System.Windows.Forms.ToolStripStatusLabel(); - this.Slot3StatusButton = new System.Windows.Forms.ToolStripStatusLabel(); - this.Slot4StatusButton = new System.Windows.Forms.ToolStripStatusLabel(); - this.Slot5StatusButton = new System.Windows.Forms.ToolStripStatusLabel(); - this.Slot6StatusButton = new System.Windows.Forms.ToolStripStatusLabel(); - this.Slot7StatusButton = new System.Windows.Forms.ToolStripStatusLabel(); - this.Slot8StatusButton = new System.Windows.Forms.ToolStripStatusLabel(); - this.Slot9StatusButton = new System.Windows.Forms.ToolStripStatusLabel(); - this.Slot0StatusButton = new System.Windows.Forms.ToolStripStatusLabel(); - this.CheatStatusButton = new System.Windows.Forms.ToolStripStatusLabel(); - this.KeyPriorityStatusLabel = new System.Windows.Forms.ToolStripStatusLabel(); - this.CoreNameStatusBarButton = new System.Windows.Forms.ToolStripStatusLabel(); - this.ProfileFirstBootLabel = new System.Windows.Forms.ToolStripStatusLabel(); - this.LinkConnectStatusBarButton = new System.Windows.Forms.ToolStripStatusLabel(); - this.UpdateNotification = new System.Windows.Forms.ToolStripStatusLabel(); - this.MainFormContextMenu = new System.Windows.Forms.ContextMenuStrip(this.components); - this.OpenRomContextMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.LoadLastRomContextMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.StopAVContextMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.ContextSeparator_AfterROM = new System.Windows.Forms.ToolStripSeparator(); - this.RecordMovieContextMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.PlayMovieContextMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.RestartMovieContextMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.StopMovieContextMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.LoadLastMovieContextMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.BackupMovieContextMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.StopNoSaveContextMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.ViewSubtitlesContextMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.AddSubtitleContextMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.ViewCommentsContextMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.SaveMovieContextMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.SaveMovieAsContextMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.ContextSeparator_AfterMovie = new System.Windows.Forms.ToolStripSeparator(); - this.UndoSavestateContextMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.ContextSeparator_AfterUndo = new System.Windows.Forms.ToolStripSeparator(); - this.ConfigContextMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItem6 = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItem7 = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItem8 = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItem9 = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItem10 = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItem11 = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItem12 = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItem13 = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItem14 = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItem15 = new System.Windows.Forms.ToolStripMenuItem(); - this.customizeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator30 = new System.Windows.Forms.ToolStripSeparator(); - this.SavestateTypeContextSubMenu = new System.Windows.Forms.ToolStripMenuItem(); - this.SavestateTypeDefaultContextMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.SavestateBinaryContextMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.SavestateTextContextMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripSeparator37 = new System.Windows.Forms.ToolStripSeparator(); - this.toolStripMenuItem66 = new System.Windows.Forms.ToolStripMenuItem(); - this.toolStripMenuItem67 = new System.Windows.Forms.ToolStripMenuItem(); - this.ScreenshotContextMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.CloseRomContextMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.ClearSRAMContextMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.ShowMenuContextMenuSeparator = new System.Windows.Forms.ToolStripSeparator(); - this.ShowMenuContextMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.timerMouseIdle = new System.Windows.Forms.Timer(this.components); - this.pCFXToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); - this.preferencesToolStripMenuItem3 = new System.Windows.Forms.ToolStripMenuItem(); - this.MainformMenu.SuspendLayout(); - this.MainStatusBar.SuspendLayout(); - this.MainFormContextMenu.SuspendLayout(); - this.SuspendLayout(); - // - // MainformMenu - // - this.MainformMenu.ClickThrough = true; - this.MainformMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.components = new System.ComponentModel.Container(); + System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(MainForm)); + this.MainformMenu = new MenuStripEx(); + this.FileSubMenu = new System.Windows.Forms.ToolStripMenuItem(); + this.OpenRomMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.RecentRomSubMenu = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator3 = new System.Windows.Forms.ToolStripSeparator(); + this.OpenAdvancedMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.CloseRomMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItem1 = new System.Windows.Forms.ToolStripSeparator(); + this.SaveStateSubMenu = new System.Windows.Forms.ToolStripMenuItem(); + this.SaveState1MenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.SaveState2MenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.SaveState3MenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.SaveState4MenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.SaveState5MenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.SaveState6MenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.SaveState7MenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.SaveState8MenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.SaveState9MenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.SaveState0MenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator6 = new System.Windows.Forms.ToolStripSeparator(); + this.SaveNamedStateMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.LoadStateSubMenu = new System.Windows.Forms.ToolStripMenuItem(); + this.LoadState1MenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.LoadState2MenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.LoadState3MenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.LoadState4MenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.LoadState5MenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.LoadState6MenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.LoadState7MenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.LoadState8MenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.LoadState9MenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.LoadState0MenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator7 = new System.Windows.Forms.ToolStripSeparator(); + this.LoadNamedStateMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator21 = new System.Windows.Forms.ToolStripSeparator(); + this.AutoloadLastSlotMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.SaveSlotSubMenu = new System.Windows.Forms.ToolStripMenuItem(); + this.SelectSlot0MenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.SelectSlot1MenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.SelectSlot2MenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.SelectSlot3MenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.SelectSlot4MenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.SelectSlot5MenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.SelectSlot6MenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.SelectSlot7MenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.SelectSlot8MenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.SelectSlot9MenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.PreviousSlotMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.NextSlotMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator5 = new System.Windows.Forms.ToolStripSeparator(); + this.SaveToCurrentSlotMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.LoadCurrentSlotMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.SaveRAMSubMenu = new System.Windows.Forms.ToolStripMenuItem(); + this.FlushSaveRAMMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItem2 = new System.Windows.Forms.ToolStripSeparator(); + this.MovieSubMenu = new System.Windows.Forms.ToolStripMenuItem(); + this.ReadonlyMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator15 = new System.Windows.Forms.ToolStripSeparator(); + this.RecentMovieSubMenu = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator16 = new System.Windows.Forms.ToolStripSeparator(); + this.RecordMovieMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.PlayMovieMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.StopMovieMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.PlayFromBeginningMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.ImportMoviesMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.SaveMovieMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.SaveMovieAsMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.StopMovieWithoutSavingMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator14 = new System.Windows.Forms.ToolStripSeparator(); + this.AutomaticallyBackupMoviesMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.FullMovieLoadstatesMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.MovieEndSubMenu = new System.Windows.Forms.ToolStripMenuItem(); + this.MovieEndFinishMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.MovieEndRecordMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.MovieEndStopMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.MovieEndPauseMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.AVSubMenu = new System.Windows.Forms.ToolStripMenuItem(); + this.RecordAVMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.ConfigAndRecordAVMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.StopAVIMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator19 = new System.Windows.Forms.ToolStripSeparator(); + this.CaptureOSDMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.SynclessRecordingMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.ScreenshotSubMenu = new System.Windows.Forms.ToolStripMenuItem(); + this.ScreenshotMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.ScreenshotAsMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.ScreenshotClipboardMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.ScreenshotClientClipboardMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator20 = new System.Windows.Forms.ToolStripSeparator(); + this.ScreenshotCaptureOSDMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator4 = new System.Windows.Forms.ToolStripSeparator(); + this.ExitMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.EmulationSubMenu = new System.Windows.Forms.ToolStripMenuItem(); + this.PauseMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.RebootCoreMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator1 = new System.Windows.Forms.ToolStripSeparator(); + this.SoftResetMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.HardResetMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.ViewSubMenu = new System.Windows.Forms.ToolStripMenuItem(); + this.WindowSizeSubMenu = new System.Windows.Forms.ToolStripMenuItem(); + this.x1MenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.x2MenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.x3MenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.x4MenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.x5MenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.mzMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.SwitchToFullscreenMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator2 = new System.Windows.Forms.ToolStripSeparator(); + this.DisplayFPSMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.DisplayFrameCounterMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.DisplayLagCounterMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.DisplayInputMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.DisplayRerecordCountMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.DisplaySubtitlesMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItem4 = new System.Windows.Forms.ToolStripSeparator(); + this.DisplayStatusBarMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.DisplayMessagesMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.DisplayLogWindowMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.ConfigSubMenu = new System.Windows.Forms.ToolStripMenuItem(); + this.ControllersMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.HotkeysMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.DisplayConfigMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.SoundMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.PathsMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.FirmwaresMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.MessagesMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.AutofireMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.RewindOptionsMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.extensionsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.ClientOptionsMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.ProfilesMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator9 = new System.Windows.Forms.ToolStripSeparator(); + this.SpeedSkipSubMenu = new System.Windows.Forms.ToolStripMenuItem(); + this.ClockThrottleMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.AudioThrottleMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.VsyncThrottleMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator27 = new System.Windows.Forms.ToolStripSeparator(); + this.VsyncEnabledMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItem3 = new System.Windows.Forms.ToolStripSeparator(); + this.miUnthrottled = new System.Windows.Forms.ToolStripMenuItem(); + this.MinimizeSkippingMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.NeverSkipMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItem17 = new System.Windows.Forms.ToolStripMenuItem(); + this.Frameskip1MenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.Frameskip2MenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.Frameskip3MenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.Frameskip4MenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.Frameskip5MenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.Frameskip6MenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.Frameskip7MenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.Frameskip8MenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.Frameskip9MenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItem5 = new System.Windows.Forms.ToolStripSeparator(); + this.Speed50MenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.Speed75MenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.Speed100MenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.Speed150MenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.Speed200MenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.Speed400MenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.KeyPrioritySubMenu = new System.Windows.Forms.ToolStripMenuItem(); + this.BothHkAndControllerMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.InputOverHkMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.HkOverInputMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.CoresSubMenu = new System.Windows.Forms.ToolStripMenuItem(); + this.NesCoreSubMenu = new System.Windows.Forms.ToolStripMenuItem(); + this.QuicknesCoreMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.NesCoreMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.CoreSNESSubMenu = new System.Windows.Forms.ToolStripMenuItem(); + this.Coresnes9xMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.CorebsnesMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.GbaCoreSubMenu = new System.Windows.Forms.ToolStripMenuItem(); + this.VbaNextCoreMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.MgbaCoreMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.Atari7800CoreSubMenu = new System.Windows.Forms.ToolStripMenuItem(); + this.Emu7800CoreMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.Atari7800HawkCoreMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.SGBCoreSubmenu = new System.Windows.Forms.ToolStripMenuItem(); + this.SgbBsnesMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.SgbSameBoyMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.GBInSGBMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItem16 = new System.Windows.Forms.ToolStripSeparator(); + this.allowGameDBCoreOverridesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator8 = new System.Windows.Forms.ToolStripSeparator(); + this.N64VideoPluginSettingsMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.setLibretroCoreToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator10 = new System.Windows.Forms.ToolStripSeparator(); + this.SaveConfigMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.SaveConfigAsMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.LoadConfigMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.LoadConfigFromMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.ToolsSubMenu = new System.Windows.Forms.ToolStripMenuItem(); + this.ToolBoxMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator12 = new System.Windows.Forms.ToolStripSeparator(); + this.RamWatchMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.RamSearchMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.LuaConsoleMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.TAStudioMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.HexEditorMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.TraceLoggerMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.DebuggerMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.CodeDataLoggerMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.MacroToolMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.VirtualPadMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.BasicBotMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator11 = new System.Windows.Forms.ToolStripSeparator(); + this.CheatsMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.gameSharkConverterToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator29 = new System.Windows.Forms.ToolStripSeparator(); + this.MultiDiskBundlerFileMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.externalToolToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.dummyExternalTool = new System.Windows.Forms.ToolStripMenuItem(); + this.batchRunnerToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.ExperimentalToolsSubMenu = new System.Windows.Forms.ToolStripMenuItem(); + this.AutoHawkMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.NewHexEditorMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.NESSubMenu = new System.Windows.Forms.ToolStripMenuItem(); + this.coreToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.quickNESToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.nesHawkToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator34 = new System.Windows.Forms.ToolStripSeparator(); + this.NESPPUViewerMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.NESNametableViewerMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.NESGameGenieCodesMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.musicRipperToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator17 = new System.Windows.Forms.ToolStripSeparator(); + this.NesControllerSettingsMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.NESGraphicSettingsMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.NESSoundChannelsMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.VSSettingsMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.MovieSettingsMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator22 = new System.Windows.Forms.ToolStripSeparator(); + this.FDSControlsMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.FdsEjectDiskMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.VSControlsMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.VSInsertCoinP1MenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.VSInsertCoinP2MenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.VSServiceSwitchMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.barcodeReaderToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.PCESubMenu = new System.Windows.Forms.ToolStripMenuItem(); + this.PceControllerSettingsMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.PCEGraphicsSettingsMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator32 = new System.Windows.Forms.ToolStripSeparator(); + this.PCEBGViewerMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.PCEtileViewerToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.PceSoundDebuggerToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator25 = new System.Windows.Forms.ToolStripSeparator(); + this.PCEAlwaysPerformSpriteLimitMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.PCEAlwaysEqualizeVolumesMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.PCEArcadeCardRewindEnableMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.SMSSubMenu = new System.Windows.Forms.ToolStripMenuItem(); + this.SMSregionToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.SMSregionExportToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.SMSregionJapanToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.SMSregionAutoToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.SMSdisplayToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.SMSdisplayNtscToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.SMSdisplayPalToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.SMSdisplayAutoToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.SMStoolStripMenuItem2 = new System.Windows.Forms.ToolStripSeparator(); + this.SMSenableBIOSToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.SMSEnableFMChipMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.SMSOverclockMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.SMSForceStereoMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.SMSSpriteLimitMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.SMSDisplayOverscanMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.SMSFix3DGameDisplayToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.ShowClippedRegionsMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.HighlightActiveDisplayRegionMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.SMSGraphicsSettingsMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator24 = new System.Windows.Forms.ToolStripSeparator(); + this.SMSVDPViewerToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.GGGameGenieMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.TI83SubMenu = new System.Windows.Forms.ToolStripMenuItem(); + this.KeypadMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.LoadTIFileMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator13 = new System.Windows.Forms.ToolStripSeparator(); + this.AutoloadKeypadMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.paletteToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.AtariSubMenu = new System.Windows.Forms.ToolStripMenuItem(); + this.AtariSettingsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.A7800SubMenu = new System.Windows.Forms.ToolStripMenuItem(); + this.A7800ControllerSettingsMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.GBSubMenu = new System.Windows.Forms.ToolStripMenuItem(); + this.GBcoreSettingsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.LoadGBInSGBMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator28 = new System.Windows.Forms.ToolStripSeparator(); + this.GBGPUViewerMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.GBGameGenieMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.GBASubMenu = new System.Windows.Forms.ToolStripMenuItem(); + this.GBACoreSelectionSubMenu = new System.Windows.Forms.ToolStripMenuItem(); + this.GBAmGBAMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.GBAVBANextMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.GBAcoresettingsToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator33 = new System.Windows.Forms.ToolStripSeparator(); + this.GbaGpuViewerMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.PSXSubMenu = new System.Windows.Forms.ToolStripMenuItem(); + this.PSXControllerSettingsMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.PSXOptionsMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.PSXDiscControlsMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.PSXHashDiscsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.SNESSubMenu = new System.Windows.Forms.ToolStripMenuItem(); + this.SNESControllerConfigurationMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator18 = new System.Windows.Forms.ToolStripSeparator(); + this.SnesGfxDebuggerMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.SnesGBInSGBMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.SnesGameGenieMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.SnesOptionsMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.ColecoSubMenu = new System.Windows.Forms.ToolStripMenuItem(); + this.ColecoControllerSettingsMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator35 = new System.Windows.Forms.ToolStripSeparator(); + this.ColecoSkipBiosMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.N64SubMenu = new System.Windows.Forms.ToolStripMenuItem(); + this.N64PluginSettingsMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.N64ControllerSettingsMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator23 = new System.Windows.Forms.ToolStripSeparator(); + this.N64CircularAnalogRangeMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.MupenStyleLagMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.N64ExpansionSlotMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.SaturnSubMenu = new System.Windows.Forms.ToolStripMenuItem(); + this.SaturnPreferencesMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.DGBSubMenu = new System.Windows.Forms.ToolStripMenuItem(); + this.DGBsettingsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.GenesisSubMenu = new System.Windows.Forms.ToolStripMenuItem(); + this.vDPViewerToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.GenesisGameGenieECDC = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator26 = new System.Windows.Forms.ToolStripSeparator(); + this.GenesisSettingsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.wonderSwanToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.settingsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.AppleSubMenu = new System.Windows.Forms.ToolStripMenuItem(); + this.AppleDisksSubMenu = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator31 = new System.Windows.Forms.ToolStripSeparator(); + this.settingsToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); + this.C64SubMenu = new System.Windows.Forms.ToolStripMenuItem(); + this.C64DisksSubMenu = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator36 = new System.Windows.Forms.ToolStripSeparator(); + this.C64SettingsMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.IntvSubMenu = new System.Windows.Forms.ToolStripMenuItem(); + this.IntVControllerSettingsMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.sNESToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.preferencesToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.pCFXToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.preferencesToolStripMenuItem3 = new System.Windows.Forms.ToolStripMenuItem(); + this.virtualBoyToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.preferencesToolStripMenuItem1 = new System.Windows.Forms.ToolStripMenuItem(); + this.neoGeoPocketToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.preferencesToolStripMenuItem2 = new System.Windows.Forms.ToolStripMenuItem(); + this.HelpSubMenu = new System.Windows.Forms.ToolStripMenuItem(); + this.OnlineHelpMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.ForumsMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.FeaturesMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.AboutMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.MainStatusBar = new StatusStripEx(); + this.DumpStatusButton = new System.Windows.Forms.ToolStripDropDownButton(); + this.EmuStatus = new System.Windows.Forms.ToolStripStatusLabel(); + this.PlayRecordStatusButton = new System.Windows.Forms.ToolStripDropDownButton(); + this.PauseStatusButton = new System.Windows.Forms.ToolStripDropDownButton(); + this.RebootStatusBarIcon = new System.Windows.Forms.ToolStripStatusLabel(); + this.AVIStatusLabel = new System.Windows.Forms.ToolStripStatusLabel(); + this.LedLightStatusLabel = new System.Windows.Forms.ToolStripStatusLabel(); + this.SaveSlotsStatusLabel = new System.Windows.Forms.ToolStripStatusLabel(); + this.Slot1StatusButton = new System.Windows.Forms.ToolStripStatusLabel(); + this.Slot2StatusButton = new System.Windows.Forms.ToolStripStatusLabel(); + this.Slot3StatusButton = new System.Windows.Forms.ToolStripStatusLabel(); + this.Slot4StatusButton = new System.Windows.Forms.ToolStripStatusLabel(); + this.Slot5StatusButton = new System.Windows.Forms.ToolStripStatusLabel(); + this.Slot6StatusButton = new System.Windows.Forms.ToolStripStatusLabel(); + this.Slot7StatusButton = new System.Windows.Forms.ToolStripStatusLabel(); + this.Slot8StatusButton = new System.Windows.Forms.ToolStripStatusLabel(); + this.Slot9StatusButton = new System.Windows.Forms.ToolStripStatusLabel(); + this.Slot0StatusButton = new System.Windows.Forms.ToolStripStatusLabel(); + this.CheatStatusButton = new System.Windows.Forms.ToolStripStatusLabel(); + this.KeyPriorityStatusLabel = new System.Windows.Forms.ToolStripStatusLabel(); + this.CoreNameStatusBarButton = new System.Windows.Forms.ToolStripStatusLabel(); + this.ProfileFirstBootLabel = new System.Windows.Forms.ToolStripStatusLabel(); + this.LinkConnectStatusBarButton = new System.Windows.Forms.ToolStripStatusLabel(); + this.UpdateNotification = new System.Windows.Forms.ToolStripStatusLabel(); + this.MainFormContextMenu = new System.Windows.Forms.ContextMenuStrip(this.components); + this.OpenRomContextMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.LoadLastRomContextMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.StopAVContextMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.ContextSeparator_AfterROM = new System.Windows.Forms.ToolStripSeparator(); + this.RecordMovieContextMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.PlayMovieContextMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.RestartMovieContextMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.StopMovieContextMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.LoadLastMovieContextMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.BackupMovieContextMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.StopNoSaveContextMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.ViewSubtitlesContextMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.AddSubtitleContextMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.ViewCommentsContextMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.SaveMovieContextMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.SaveMovieAsContextMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.ContextSeparator_AfterMovie = new System.Windows.Forms.ToolStripSeparator(); + this.UndoSavestateContextMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.ContextSeparator_AfterUndo = new System.Windows.Forms.ToolStripSeparator(); + this.ConfigContextMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItem6 = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItem7 = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItem8 = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItem9 = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItem10 = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItem11 = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItem12 = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItem13 = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItem14 = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItem15 = new System.Windows.Forms.ToolStripMenuItem(); + this.customizeToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator30 = new System.Windows.Forms.ToolStripSeparator(); + this.SavestateTypeContextSubMenu = new System.Windows.Forms.ToolStripMenuItem(); + this.SavestateTypeDefaultContextMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.SavestateBinaryContextMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.SavestateTextContextMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripSeparator37 = new System.Windows.Forms.ToolStripSeparator(); + this.toolStripMenuItem66 = new System.Windows.Forms.ToolStripMenuItem(); + this.toolStripMenuItem67 = new System.Windows.Forms.ToolStripMenuItem(); + this.ScreenshotContextMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.CloseRomContextMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.ClearSRAMContextMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.ShowMenuContextMenuSeparator = new System.Windows.Forms.ToolStripSeparator(); + this.ShowMenuContextMenuItem = new System.Windows.Forms.ToolStripMenuItem(); + this.timerMouseIdle = new System.Windows.Forms.Timer(this.components); + this.MainformMenu.SuspendLayout(); + this.MainStatusBar.SuspendLayout(); + this.MainFormContextMenu.SuspendLayout(); + this.SuspendLayout(); + // + // MainformMenu + // + this.MainformMenu.ClickThrough = true; + this.MainformMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.FileSubMenu, this.EmulationSubMenu, this.ViewSubMenu, @@ -480,19 +480,19 @@ this.virtualBoyToolStripMenuItem, this.neoGeoPocketToolStripMenuItem, this.HelpSubMenu}); - this.MainformMenu.LayoutStyle = System.Windows.Forms.ToolStripLayoutStyle.Flow; - this.MainformMenu.Location = new System.Drawing.Point(0, 0); - this.MainformMenu.Name = "MainformMenu"; - this.MainformMenu.Size = new System.Drawing.Size(470, 74); - this.MainformMenu.TabIndex = 0; - this.MainformMenu.Text = "menuStrip1"; - this.MainformMenu.MenuActivate += new System.EventHandler(this.MainformMenu_MenuActivate); - this.MainformMenu.MenuDeactivate += new System.EventHandler(this.MainformMenu_MenuDeactivate); - this.MainformMenu.Leave += new System.EventHandler(this.MainformMenu_Leave); - // - // FileSubMenu - // - this.FileSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.MainformMenu.LayoutStyle = System.Windows.Forms.ToolStripLayoutStyle.Flow; + this.MainformMenu.Location = new System.Drawing.Point(0, 0); + this.MainformMenu.Name = "MainformMenu"; + this.MainformMenu.Size = new System.Drawing.Size(470, 80); + this.MainformMenu.TabIndex = 0; + this.MainformMenu.Text = "menuStrip1"; + this.MainformMenu.MenuActivate += new System.EventHandler(this.MainformMenu_MenuActivate); + this.MainformMenu.MenuDeactivate += new System.EventHandler(this.MainformMenu_MenuDeactivate); + this.MainformMenu.Leave += new System.EventHandler(this.MainformMenu_Leave); + // + // FileSubMenu + // + this.FileSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.OpenRomMenuItem, this.RecentRomSubMenu, this.OpenAdvancedMenuItem, @@ -508,57 +508,57 @@ this.ScreenshotSubMenu, this.toolStripSeparator4, this.ExitMenuItem}); - this.FileSubMenu.Name = "FileSubMenu"; - this.FileSubMenu.Size = new System.Drawing.Size(35, 17); - this.FileSubMenu.Text = "&File"; - this.FileSubMenu.DropDownOpened += new System.EventHandler(this.FileSubMenu_DropDownOpened); - // - // OpenRomMenuItem - // - this.OpenRomMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.OpenFile; - this.OpenRomMenuItem.Name = "OpenRomMenuItem"; - this.OpenRomMenuItem.Size = new System.Drawing.Size(151, 22); - this.OpenRomMenuItem.Text = "&Open ROM"; - this.OpenRomMenuItem.Click += new System.EventHandler(this.OpenRomMenuItem_Click); - // - // RecentRomSubMenu - // - this.RecentRomSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.FileSubMenu.Name = "FileSubMenu"; + this.FileSubMenu.Size = new System.Drawing.Size(37, 19); + this.FileSubMenu.Text = "&File"; + this.FileSubMenu.DropDownOpened += new System.EventHandler(this.FileSubMenu_DropDownOpened); + // + // OpenRomMenuItem + // + this.OpenRomMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.OpenFile; + this.OpenRomMenuItem.Name = "OpenRomMenuItem"; + this.OpenRomMenuItem.Size = new System.Drawing.Size(159, 22); + this.OpenRomMenuItem.Text = "&Open ROM"; + this.OpenRomMenuItem.Click += new System.EventHandler(this.OpenRomMenuItem_Click); + // + // RecentRomSubMenu + // + this.RecentRomSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.toolStripSeparator3}); - this.RecentRomSubMenu.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Recent; - this.RecentRomSubMenu.Name = "RecentRomSubMenu"; - this.RecentRomSubMenu.Size = new System.Drawing.Size(151, 22); - this.RecentRomSubMenu.Text = "&Recent ROM"; - this.RecentRomSubMenu.DropDownOpened += new System.EventHandler(this.RecentRomMenuItem_DropDownOpened); - // - // toolStripSeparator3 - // - this.toolStripSeparator3.Name = "toolStripSeparator3"; - this.toolStripSeparator3.Size = new System.Drawing.Size(57, 6); - // - // OpenAdvancedMenuItem - // - this.OpenAdvancedMenuItem.Name = "OpenAdvancedMenuItem"; - this.OpenAdvancedMenuItem.Size = new System.Drawing.Size(151, 22); - this.OpenAdvancedMenuItem.Text = "Open Ad&vanced"; - this.OpenAdvancedMenuItem.Click += new System.EventHandler(this.OpenAdvancedMenuItem_Click); - // - // CloseRomMenuItem - // - this.CloseRomMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Close; - this.CloseRomMenuItem.Name = "CloseRomMenuItem"; - this.CloseRomMenuItem.Size = new System.Drawing.Size(151, 22); - this.CloseRomMenuItem.Text = "&Close ROM"; - this.CloseRomMenuItem.Click += new System.EventHandler(this.CloseRomMenuItem_Click); - // - // toolStripMenuItem1 - // - this.toolStripMenuItem1.Name = "toolStripMenuItem1"; - this.toolStripMenuItem1.Size = new System.Drawing.Size(148, 6); - // - // SaveStateSubMenu - // - this.SaveStateSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.RecentRomSubMenu.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Recent; + this.RecentRomSubMenu.Name = "RecentRomSubMenu"; + this.RecentRomSubMenu.Size = new System.Drawing.Size(159, 22); + this.RecentRomSubMenu.Text = "&Recent ROM"; + this.RecentRomSubMenu.DropDownOpened += new System.EventHandler(this.RecentRomMenuItem_DropDownOpened); + // + // toolStripSeparator3 + // + this.toolStripSeparator3.Name = "toolStripSeparator3"; + this.toolStripSeparator3.Size = new System.Drawing.Size(57, 6); + // + // OpenAdvancedMenuItem + // + this.OpenAdvancedMenuItem.Name = "OpenAdvancedMenuItem"; + this.OpenAdvancedMenuItem.Size = new System.Drawing.Size(159, 22); + this.OpenAdvancedMenuItem.Text = "Open Ad&vanced"; + this.OpenAdvancedMenuItem.Click += new System.EventHandler(this.OpenAdvancedMenuItem_Click); + // + // CloseRomMenuItem + // + this.CloseRomMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Close; + this.CloseRomMenuItem.Name = "CloseRomMenuItem"; + this.CloseRomMenuItem.Size = new System.Drawing.Size(159, 22); + this.CloseRomMenuItem.Text = "&Close ROM"; + this.CloseRomMenuItem.Click += new System.EventHandler(this.CloseRomMenuItem_Click); + // + // toolStripMenuItem1 + // + this.toolStripMenuItem1.Name = "toolStripMenuItem1"; + this.toolStripMenuItem1.Size = new System.Drawing.Size(156, 6); + // + // SaveStateSubMenu + // + this.SaveStateSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.SaveState1MenuItem, this.SaveState2MenuItem, this.SaveState3MenuItem, @@ -571,96 +571,96 @@ this.SaveState0MenuItem, this.toolStripSeparator6, this.SaveNamedStateMenuItem}); - this.SaveStateSubMenu.Name = "SaveStateSubMenu"; - this.SaveStateSubMenu.Size = new System.Drawing.Size(151, 22); - this.SaveStateSubMenu.Text = "&Save State"; - this.SaveStateSubMenu.DropDownOpened += new System.EventHandler(this.SaveStateSubMenu_DropDownOpened); - // - // SaveState1MenuItem - // - this.SaveState1MenuItem.Name = "SaveState1MenuItem"; - this.SaveState1MenuItem.Size = new System.Drawing.Size(175, 22); - this.SaveState1MenuItem.Text = "1"; - this.SaveState1MenuItem.Click += new System.EventHandler(this.Savestate1MenuItem_Click); - // - // SaveState2MenuItem - // - this.SaveState2MenuItem.Name = "SaveState2MenuItem"; - this.SaveState2MenuItem.Size = new System.Drawing.Size(175, 22); - this.SaveState2MenuItem.Text = "2"; - this.SaveState2MenuItem.Click += new System.EventHandler(this.Savestate2MenuItem_Click); - // - // SaveState3MenuItem - // - this.SaveState3MenuItem.Name = "SaveState3MenuItem"; - this.SaveState3MenuItem.Size = new System.Drawing.Size(175, 22); - this.SaveState3MenuItem.Text = "3"; - this.SaveState3MenuItem.Click += new System.EventHandler(this.Savestate3MenuItem_Click); - // - // SaveState4MenuItem - // - this.SaveState4MenuItem.Name = "SaveState4MenuItem"; - this.SaveState4MenuItem.Size = new System.Drawing.Size(175, 22); - this.SaveState4MenuItem.Text = "4"; - this.SaveState4MenuItem.Click += new System.EventHandler(this.Savestate4MenuItem_Click); - // - // SaveState5MenuItem - // - this.SaveState5MenuItem.Name = "SaveState5MenuItem"; - this.SaveState5MenuItem.Size = new System.Drawing.Size(175, 22); - this.SaveState5MenuItem.Text = "5"; - this.SaveState5MenuItem.Click += new System.EventHandler(this.Savestate5MenuItem_Click); - // - // SaveState6MenuItem - // - this.SaveState6MenuItem.Name = "SaveState6MenuItem"; - this.SaveState6MenuItem.Size = new System.Drawing.Size(175, 22); - this.SaveState6MenuItem.Text = "6"; - this.SaveState6MenuItem.Click += new System.EventHandler(this.Savestate6MenuItem_Click); - // - // SaveState7MenuItem - // - this.SaveState7MenuItem.Name = "SaveState7MenuItem"; - this.SaveState7MenuItem.Size = new System.Drawing.Size(175, 22); - this.SaveState7MenuItem.Text = "7"; - this.SaveState7MenuItem.Click += new System.EventHandler(this.Savestate7MenuItem_Click); - // - // SaveState8MenuItem - // - this.SaveState8MenuItem.Name = "SaveState8MenuItem"; - this.SaveState8MenuItem.Size = new System.Drawing.Size(175, 22); - this.SaveState8MenuItem.Text = "8"; - this.SaveState8MenuItem.Click += new System.EventHandler(this.Savestate8MenuItem_Click); - // - // SaveState9MenuItem - // - this.SaveState9MenuItem.Name = "SaveState9MenuItem"; - this.SaveState9MenuItem.Size = new System.Drawing.Size(175, 22); - this.SaveState9MenuItem.Text = "9"; - this.SaveState9MenuItem.Click += new System.EventHandler(this.Savestate9MenuItem_Click); - // - // SaveState0MenuItem - // - this.SaveState0MenuItem.Name = "SaveState0MenuItem"; - this.SaveState0MenuItem.Size = new System.Drawing.Size(175, 22); - this.SaveState0MenuItem.Text = "0"; - this.SaveState0MenuItem.Click += new System.EventHandler(this.Savestate0MenuItem_Click); - // - // toolStripSeparator6 - // - this.toolStripSeparator6.Name = "toolStripSeparator6"; - this.toolStripSeparator6.Size = new System.Drawing.Size(172, 6); - // - // SaveNamedStateMenuItem - // - this.SaveNamedStateMenuItem.Name = "SaveNamedStateMenuItem"; - this.SaveNamedStateMenuItem.Size = new System.Drawing.Size(175, 22); - this.SaveNamedStateMenuItem.Text = "Save Named State..."; - this.SaveNamedStateMenuItem.Click += new System.EventHandler(this.SaveNamedStateMenuItem_Click); - // - // LoadStateSubMenu - // - this.LoadStateSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.SaveStateSubMenu.Name = "SaveStateSubMenu"; + this.SaveStateSubMenu.Size = new System.Drawing.Size(159, 22); + this.SaveStateSubMenu.Text = "&Save State"; + this.SaveStateSubMenu.DropDownOpened += new System.EventHandler(this.SaveStateSubMenu_DropDownOpened); + // + // SaveState1MenuItem + // + this.SaveState1MenuItem.Name = "SaveState1MenuItem"; + this.SaveState1MenuItem.Size = new System.Drawing.Size(178, 22); + this.SaveState1MenuItem.Text = "1"; + this.SaveState1MenuItem.Click += new System.EventHandler(this.Savestate1MenuItem_Click); + // + // SaveState2MenuItem + // + this.SaveState2MenuItem.Name = "SaveState2MenuItem"; + this.SaveState2MenuItem.Size = new System.Drawing.Size(178, 22); + this.SaveState2MenuItem.Text = "2"; + this.SaveState2MenuItem.Click += new System.EventHandler(this.Savestate2MenuItem_Click); + // + // SaveState3MenuItem + // + this.SaveState3MenuItem.Name = "SaveState3MenuItem"; + this.SaveState3MenuItem.Size = new System.Drawing.Size(178, 22); + this.SaveState3MenuItem.Text = "3"; + this.SaveState3MenuItem.Click += new System.EventHandler(this.Savestate3MenuItem_Click); + // + // SaveState4MenuItem + // + this.SaveState4MenuItem.Name = "SaveState4MenuItem"; + this.SaveState4MenuItem.Size = new System.Drawing.Size(178, 22); + this.SaveState4MenuItem.Text = "4"; + this.SaveState4MenuItem.Click += new System.EventHandler(this.Savestate4MenuItem_Click); + // + // SaveState5MenuItem + // + this.SaveState5MenuItem.Name = "SaveState5MenuItem"; + this.SaveState5MenuItem.Size = new System.Drawing.Size(178, 22); + this.SaveState5MenuItem.Text = "5"; + this.SaveState5MenuItem.Click += new System.EventHandler(this.Savestate5MenuItem_Click); + // + // SaveState6MenuItem + // + this.SaveState6MenuItem.Name = "SaveState6MenuItem"; + this.SaveState6MenuItem.Size = new System.Drawing.Size(178, 22); + this.SaveState6MenuItem.Text = "6"; + this.SaveState6MenuItem.Click += new System.EventHandler(this.Savestate6MenuItem_Click); + // + // SaveState7MenuItem + // + this.SaveState7MenuItem.Name = "SaveState7MenuItem"; + this.SaveState7MenuItem.Size = new System.Drawing.Size(178, 22); + this.SaveState7MenuItem.Text = "7"; + this.SaveState7MenuItem.Click += new System.EventHandler(this.Savestate7MenuItem_Click); + // + // SaveState8MenuItem + // + this.SaveState8MenuItem.Name = "SaveState8MenuItem"; + this.SaveState8MenuItem.Size = new System.Drawing.Size(178, 22); + this.SaveState8MenuItem.Text = "8"; + this.SaveState8MenuItem.Click += new System.EventHandler(this.Savestate8MenuItem_Click); + // + // SaveState9MenuItem + // + this.SaveState9MenuItem.Name = "SaveState9MenuItem"; + this.SaveState9MenuItem.Size = new System.Drawing.Size(178, 22); + this.SaveState9MenuItem.Text = "9"; + this.SaveState9MenuItem.Click += new System.EventHandler(this.Savestate9MenuItem_Click); + // + // SaveState0MenuItem + // + this.SaveState0MenuItem.Name = "SaveState0MenuItem"; + this.SaveState0MenuItem.Size = new System.Drawing.Size(178, 22); + this.SaveState0MenuItem.Text = "0"; + this.SaveState0MenuItem.Click += new System.EventHandler(this.Savestate0MenuItem_Click); + // + // toolStripSeparator6 + // + this.toolStripSeparator6.Name = "toolStripSeparator6"; + this.toolStripSeparator6.Size = new System.Drawing.Size(175, 6); + // + // SaveNamedStateMenuItem + // + this.SaveNamedStateMenuItem.Name = "SaveNamedStateMenuItem"; + this.SaveNamedStateMenuItem.Size = new System.Drawing.Size(178, 22); + this.SaveNamedStateMenuItem.Text = "Save Named State..."; + this.SaveNamedStateMenuItem.Click += new System.EventHandler(this.SaveNamedStateMenuItem_Click); + // + // LoadStateSubMenu + // + this.LoadStateSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.LoadState1MenuItem, this.LoadState2MenuItem, this.LoadState3MenuItem, @@ -675,108 +675,108 @@ this.LoadNamedStateMenuItem, this.toolStripSeparator21, this.AutoloadLastSlotMenuItem}); - this.LoadStateSubMenu.Name = "LoadStateSubMenu"; - this.LoadStateSubMenu.Size = new System.Drawing.Size(151, 22); - this.LoadStateSubMenu.Text = "&Load State"; - this.LoadStateSubMenu.DropDownOpened += new System.EventHandler(this.LoadStateSubMenu_DropDownOpened); - // - // LoadState1MenuItem - // - this.LoadState1MenuItem.Name = "LoadState1MenuItem"; - this.LoadState1MenuItem.Size = new System.Drawing.Size(174, 22); - this.LoadState1MenuItem.Text = "1"; - this.LoadState1MenuItem.Click += new System.EventHandler(this.Loadstate1MenuItem_Click); - // - // LoadState2MenuItem - // - this.LoadState2MenuItem.Name = "LoadState2MenuItem"; - this.LoadState2MenuItem.Size = new System.Drawing.Size(174, 22); - this.LoadState2MenuItem.Text = "2"; - this.LoadState2MenuItem.Click += new System.EventHandler(this.Loadstate2MenuItem_Click); - // - // LoadState3MenuItem - // - this.LoadState3MenuItem.Name = "LoadState3MenuItem"; - this.LoadState3MenuItem.Size = new System.Drawing.Size(174, 22); - this.LoadState3MenuItem.Text = "3"; - this.LoadState3MenuItem.Click += new System.EventHandler(this.Loadstate3MenuItem_Click); - // - // LoadState4MenuItem - // - this.LoadState4MenuItem.Name = "LoadState4MenuItem"; - this.LoadState4MenuItem.Size = new System.Drawing.Size(174, 22); - this.LoadState4MenuItem.Text = "4"; - this.LoadState4MenuItem.Click += new System.EventHandler(this.Loadstate4MenuItem_Click); - // - // LoadState5MenuItem - // - this.LoadState5MenuItem.Name = "LoadState5MenuItem"; - this.LoadState5MenuItem.Size = new System.Drawing.Size(174, 22); - this.LoadState5MenuItem.Text = "5"; - this.LoadState5MenuItem.Click += new System.EventHandler(this.Loadstate5MenuItem_Click); - // - // LoadState6MenuItem - // - this.LoadState6MenuItem.Name = "LoadState6MenuItem"; - this.LoadState6MenuItem.Size = new System.Drawing.Size(174, 22); - this.LoadState6MenuItem.Text = "6"; - this.LoadState6MenuItem.Click += new System.EventHandler(this.Loadstate6MenuItem_Click); - // - // LoadState7MenuItem - // - this.LoadState7MenuItem.Name = "LoadState7MenuItem"; - this.LoadState7MenuItem.Size = new System.Drawing.Size(174, 22); - this.LoadState7MenuItem.Text = "7"; - this.LoadState7MenuItem.Click += new System.EventHandler(this.Loadstate7MenuItem_Click); - // - // LoadState8MenuItem - // - this.LoadState8MenuItem.Name = "LoadState8MenuItem"; - this.LoadState8MenuItem.Size = new System.Drawing.Size(174, 22); - this.LoadState8MenuItem.Text = "8"; - this.LoadState8MenuItem.Click += new System.EventHandler(this.Loadstate8MenuItem_Click); - // - // LoadState9MenuItem - // - this.LoadState9MenuItem.Name = "LoadState9MenuItem"; - this.LoadState9MenuItem.Size = new System.Drawing.Size(174, 22); - this.LoadState9MenuItem.Text = "9"; - this.LoadState9MenuItem.Click += new System.EventHandler(this.Loadstate9MenuItem_Click); - // - // LoadState0MenuItem - // - this.LoadState0MenuItem.Name = "LoadState0MenuItem"; - this.LoadState0MenuItem.Size = new System.Drawing.Size(174, 22); - this.LoadState0MenuItem.Text = "0"; - this.LoadState0MenuItem.Click += new System.EventHandler(this.Loadstate0MenuItem_Click); - // - // toolStripSeparator7 - // - this.toolStripSeparator7.Name = "toolStripSeparator7"; - this.toolStripSeparator7.Size = new System.Drawing.Size(171, 6); - // - // LoadNamedStateMenuItem - // - this.LoadNamedStateMenuItem.Name = "LoadNamedStateMenuItem"; - this.LoadNamedStateMenuItem.Size = new System.Drawing.Size(174, 22); - this.LoadNamedStateMenuItem.Text = "Load Named State..."; - this.LoadNamedStateMenuItem.Click += new System.EventHandler(this.LoadNamedStateMenuItem_Click); - // - // toolStripSeparator21 - // - this.toolStripSeparator21.Name = "toolStripSeparator21"; - this.toolStripSeparator21.Size = new System.Drawing.Size(171, 6); - // - // AutoloadLastSlotMenuItem - // - this.AutoloadLastSlotMenuItem.Name = "AutoloadLastSlotMenuItem"; - this.AutoloadLastSlotMenuItem.Size = new System.Drawing.Size(174, 22); - this.AutoloadLastSlotMenuItem.Text = "Autoload last Slot"; - this.AutoloadLastSlotMenuItem.Click += new System.EventHandler(this.AutoloadLastSlotMenuItem_Click); - // - // SaveSlotSubMenu - // - this.SaveSlotSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.LoadStateSubMenu.Name = "LoadStateSubMenu"; + this.LoadStateSubMenu.Size = new System.Drawing.Size(159, 22); + this.LoadStateSubMenu.Text = "&Load State"; + this.LoadStateSubMenu.DropDownOpened += new System.EventHandler(this.LoadStateSubMenu_DropDownOpened); + // + // LoadState1MenuItem + // + this.LoadState1MenuItem.Name = "LoadState1MenuItem"; + this.LoadState1MenuItem.Size = new System.Drawing.Size(180, 22); + this.LoadState1MenuItem.Text = "1"; + this.LoadState1MenuItem.Click += new System.EventHandler(this.Loadstate1MenuItem_Click); + // + // LoadState2MenuItem + // + this.LoadState2MenuItem.Name = "LoadState2MenuItem"; + this.LoadState2MenuItem.Size = new System.Drawing.Size(180, 22); + this.LoadState2MenuItem.Text = "2"; + this.LoadState2MenuItem.Click += new System.EventHandler(this.Loadstate2MenuItem_Click); + // + // LoadState3MenuItem + // + this.LoadState3MenuItem.Name = "LoadState3MenuItem"; + this.LoadState3MenuItem.Size = new System.Drawing.Size(180, 22); + this.LoadState3MenuItem.Text = "3"; + this.LoadState3MenuItem.Click += new System.EventHandler(this.Loadstate3MenuItem_Click); + // + // LoadState4MenuItem + // + this.LoadState4MenuItem.Name = "LoadState4MenuItem"; + this.LoadState4MenuItem.Size = new System.Drawing.Size(180, 22); + this.LoadState4MenuItem.Text = "4"; + this.LoadState4MenuItem.Click += new System.EventHandler(this.Loadstate4MenuItem_Click); + // + // LoadState5MenuItem + // + this.LoadState5MenuItem.Name = "LoadState5MenuItem"; + this.LoadState5MenuItem.Size = new System.Drawing.Size(180, 22); + this.LoadState5MenuItem.Text = "5"; + this.LoadState5MenuItem.Click += new System.EventHandler(this.Loadstate5MenuItem_Click); + // + // LoadState6MenuItem + // + this.LoadState6MenuItem.Name = "LoadState6MenuItem"; + this.LoadState6MenuItem.Size = new System.Drawing.Size(180, 22); + this.LoadState6MenuItem.Text = "6"; + this.LoadState6MenuItem.Click += new System.EventHandler(this.Loadstate6MenuItem_Click); + // + // LoadState7MenuItem + // + this.LoadState7MenuItem.Name = "LoadState7MenuItem"; + this.LoadState7MenuItem.Size = new System.Drawing.Size(180, 22); + this.LoadState7MenuItem.Text = "7"; + this.LoadState7MenuItem.Click += new System.EventHandler(this.Loadstate7MenuItem_Click); + // + // LoadState8MenuItem + // + this.LoadState8MenuItem.Name = "LoadState8MenuItem"; + this.LoadState8MenuItem.Size = new System.Drawing.Size(180, 22); + this.LoadState8MenuItem.Text = "8"; + this.LoadState8MenuItem.Click += new System.EventHandler(this.Loadstate8MenuItem_Click); + // + // LoadState9MenuItem + // + this.LoadState9MenuItem.Name = "LoadState9MenuItem"; + this.LoadState9MenuItem.Size = new System.Drawing.Size(180, 22); + this.LoadState9MenuItem.Text = "9"; + this.LoadState9MenuItem.Click += new System.EventHandler(this.Loadstate9MenuItem_Click); + // + // LoadState0MenuItem + // + this.LoadState0MenuItem.Name = "LoadState0MenuItem"; + this.LoadState0MenuItem.Size = new System.Drawing.Size(180, 22); + this.LoadState0MenuItem.Text = "0"; + this.LoadState0MenuItem.Click += new System.EventHandler(this.Loadstate0MenuItem_Click); + // + // toolStripSeparator7 + // + this.toolStripSeparator7.Name = "toolStripSeparator7"; + this.toolStripSeparator7.Size = new System.Drawing.Size(177, 6); + // + // LoadNamedStateMenuItem + // + this.LoadNamedStateMenuItem.Name = "LoadNamedStateMenuItem"; + this.LoadNamedStateMenuItem.Size = new System.Drawing.Size(180, 22); + this.LoadNamedStateMenuItem.Text = "Load Named State..."; + this.LoadNamedStateMenuItem.Click += new System.EventHandler(this.LoadNamedStateMenuItem_Click); + // + // toolStripSeparator21 + // + this.toolStripSeparator21.Name = "toolStripSeparator21"; + this.toolStripSeparator21.Size = new System.Drawing.Size(177, 6); + // + // AutoloadLastSlotMenuItem + // + this.AutoloadLastSlotMenuItem.Name = "AutoloadLastSlotMenuItem"; + this.AutoloadLastSlotMenuItem.Size = new System.Drawing.Size(180, 22); + this.AutoloadLastSlotMenuItem.Text = "Autoload last Slot"; + this.AutoloadLastSlotMenuItem.Click += new System.EventHandler(this.AutoloadLastSlotMenuItem_Click); + // + // SaveSlotSubMenu + // + this.SaveSlotSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.SelectSlot0MenuItem, this.SelectSlot1MenuItem, this.SelectSlot2MenuItem, @@ -792,140 +792,140 @@ this.toolStripSeparator5, this.SaveToCurrentSlotMenuItem, this.LoadCurrentSlotMenuItem}); - this.SaveSlotSubMenu.Name = "SaveSlotSubMenu"; - this.SaveSlotSubMenu.Size = new System.Drawing.Size(151, 22); - this.SaveSlotSubMenu.Text = "Save S&lot"; - this.SaveSlotSubMenu.DropDownOpened += new System.EventHandler(this.SaveSlotSubMenu_DropDownOpened); - // - // SelectSlot0MenuItem - // - this.SelectSlot0MenuItem.Name = "SelectSlot0MenuItem"; - this.SelectSlot0MenuItem.Size = new System.Drawing.Size(172, 22); - this.SelectSlot0MenuItem.Text = "Select Slot 0"; - this.SelectSlot0MenuItem.Click += new System.EventHandler(this.SelectSlotMenuItems_Click); - // - // SelectSlot1MenuItem - // - this.SelectSlot1MenuItem.Name = "SelectSlot1MenuItem"; - this.SelectSlot1MenuItem.Size = new System.Drawing.Size(172, 22); - this.SelectSlot1MenuItem.Text = "Select Slot 1"; - this.SelectSlot1MenuItem.Click += new System.EventHandler(this.SelectSlotMenuItems_Click); - // - // SelectSlot2MenuItem - // - this.SelectSlot2MenuItem.Name = "SelectSlot2MenuItem"; - this.SelectSlot2MenuItem.Size = new System.Drawing.Size(172, 22); - this.SelectSlot2MenuItem.Text = "Select Slot 2"; - this.SelectSlot2MenuItem.Click += new System.EventHandler(this.SelectSlotMenuItems_Click); - // - // SelectSlot3MenuItem - // - this.SelectSlot3MenuItem.Name = "SelectSlot3MenuItem"; - this.SelectSlot3MenuItem.Size = new System.Drawing.Size(172, 22); - this.SelectSlot3MenuItem.Text = "Select Slot 3"; - this.SelectSlot3MenuItem.Click += new System.EventHandler(this.SelectSlotMenuItems_Click); - // - // SelectSlot4MenuItem - // - this.SelectSlot4MenuItem.Name = "SelectSlot4MenuItem"; - this.SelectSlot4MenuItem.Size = new System.Drawing.Size(172, 22); - this.SelectSlot4MenuItem.Text = "Select Slot 4"; - this.SelectSlot4MenuItem.Click += new System.EventHandler(this.SelectSlotMenuItems_Click); - // - // SelectSlot5MenuItem - // - this.SelectSlot5MenuItem.Name = "SelectSlot5MenuItem"; - this.SelectSlot5MenuItem.Size = new System.Drawing.Size(172, 22); - this.SelectSlot5MenuItem.Text = "Select Slot 5"; - this.SelectSlot5MenuItem.Click += new System.EventHandler(this.SelectSlotMenuItems_Click); - // - // SelectSlot6MenuItem - // - this.SelectSlot6MenuItem.Name = "SelectSlot6MenuItem"; - this.SelectSlot6MenuItem.Size = new System.Drawing.Size(172, 22); - this.SelectSlot6MenuItem.Text = "Select Slot 6"; - this.SelectSlot6MenuItem.Click += new System.EventHandler(this.SelectSlotMenuItems_Click); - // - // SelectSlot7MenuItem - // - this.SelectSlot7MenuItem.Name = "SelectSlot7MenuItem"; - this.SelectSlot7MenuItem.Size = new System.Drawing.Size(172, 22); - this.SelectSlot7MenuItem.Text = "Select Slot 7"; - this.SelectSlot7MenuItem.Click += new System.EventHandler(this.SelectSlotMenuItems_Click); - // - // SelectSlot8MenuItem - // - this.SelectSlot8MenuItem.Name = "SelectSlot8MenuItem"; - this.SelectSlot8MenuItem.Size = new System.Drawing.Size(172, 22); - this.SelectSlot8MenuItem.Text = "Select Slot 8"; - this.SelectSlot8MenuItem.Click += new System.EventHandler(this.SelectSlotMenuItems_Click); - // - // SelectSlot9MenuItem - // - this.SelectSlot9MenuItem.Name = "SelectSlot9MenuItem"; - this.SelectSlot9MenuItem.Size = new System.Drawing.Size(172, 22); - this.SelectSlot9MenuItem.Text = "Select Slot 9"; - this.SelectSlot9MenuItem.Click += new System.EventHandler(this.SelectSlotMenuItems_Click); - // - // PreviousSlotMenuItem - // - this.PreviousSlotMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.MoveLeft; - this.PreviousSlotMenuItem.Name = "PreviousSlotMenuItem"; - this.PreviousSlotMenuItem.Size = new System.Drawing.Size(172, 22); - this.PreviousSlotMenuItem.Text = "Previous Slot"; - this.PreviousSlotMenuItem.Click += new System.EventHandler(this.PreviousSlotMenuItem_Click); - // - // NextSlotMenuItem - // - this.NextSlotMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.MoveRight; - this.NextSlotMenuItem.Name = "NextSlotMenuItem"; - this.NextSlotMenuItem.Size = new System.Drawing.Size(172, 22); - this.NextSlotMenuItem.Text = "Next Slot"; - this.NextSlotMenuItem.Click += new System.EventHandler(this.NextSlotMenuItem_Click); - // - // toolStripSeparator5 - // - this.toolStripSeparator5.Name = "toolStripSeparator5"; - this.toolStripSeparator5.Size = new System.Drawing.Size(169, 6); - // - // SaveToCurrentSlotMenuItem - // - this.SaveToCurrentSlotMenuItem.Name = "SaveToCurrentSlotMenuItem"; - this.SaveToCurrentSlotMenuItem.Size = new System.Drawing.Size(172, 22); - this.SaveToCurrentSlotMenuItem.Text = "Save to Current Slot"; - this.SaveToCurrentSlotMenuItem.Click += new System.EventHandler(this.SaveToCurrentSlotMenuItem_Click); - // - // LoadCurrentSlotMenuItem - // - this.LoadCurrentSlotMenuItem.Name = "LoadCurrentSlotMenuItem"; - this.LoadCurrentSlotMenuItem.Size = new System.Drawing.Size(172, 22); - this.LoadCurrentSlotMenuItem.Text = "Load Current Slot"; - this.LoadCurrentSlotMenuItem.Click += new System.EventHandler(this.LoadCurrentSlotMenuItem_Click); - // - // SaveRAMSubMenu - // - this.SaveRAMSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.SaveSlotSubMenu.Name = "SaveSlotSubMenu"; + this.SaveSlotSubMenu.Size = new System.Drawing.Size(159, 22); + this.SaveSlotSubMenu.Text = "Save S&lot"; + this.SaveSlotSubMenu.DropDownOpened += new System.EventHandler(this.SaveSlotSubMenu_DropDownOpened); + // + // SelectSlot0MenuItem + // + this.SelectSlot0MenuItem.Name = "SelectSlot0MenuItem"; + this.SelectSlot0MenuItem.Size = new System.Drawing.Size(178, 22); + this.SelectSlot0MenuItem.Text = "Select Slot 0"; + this.SelectSlot0MenuItem.Click += new System.EventHandler(this.SelectSlotMenuItems_Click); + // + // SelectSlot1MenuItem + // + this.SelectSlot1MenuItem.Name = "SelectSlot1MenuItem"; + this.SelectSlot1MenuItem.Size = new System.Drawing.Size(178, 22); + this.SelectSlot1MenuItem.Text = "Select Slot 1"; + this.SelectSlot1MenuItem.Click += new System.EventHandler(this.SelectSlotMenuItems_Click); + // + // SelectSlot2MenuItem + // + this.SelectSlot2MenuItem.Name = "SelectSlot2MenuItem"; + this.SelectSlot2MenuItem.Size = new System.Drawing.Size(178, 22); + this.SelectSlot2MenuItem.Text = "Select Slot 2"; + this.SelectSlot2MenuItem.Click += new System.EventHandler(this.SelectSlotMenuItems_Click); + // + // SelectSlot3MenuItem + // + this.SelectSlot3MenuItem.Name = "SelectSlot3MenuItem"; + this.SelectSlot3MenuItem.Size = new System.Drawing.Size(178, 22); + this.SelectSlot3MenuItem.Text = "Select Slot 3"; + this.SelectSlot3MenuItem.Click += new System.EventHandler(this.SelectSlotMenuItems_Click); + // + // SelectSlot4MenuItem + // + this.SelectSlot4MenuItem.Name = "SelectSlot4MenuItem"; + this.SelectSlot4MenuItem.Size = new System.Drawing.Size(178, 22); + this.SelectSlot4MenuItem.Text = "Select Slot 4"; + this.SelectSlot4MenuItem.Click += new System.EventHandler(this.SelectSlotMenuItems_Click); + // + // SelectSlot5MenuItem + // + this.SelectSlot5MenuItem.Name = "SelectSlot5MenuItem"; + this.SelectSlot5MenuItem.Size = new System.Drawing.Size(178, 22); + this.SelectSlot5MenuItem.Text = "Select Slot 5"; + this.SelectSlot5MenuItem.Click += new System.EventHandler(this.SelectSlotMenuItems_Click); + // + // SelectSlot6MenuItem + // + this.SelectSlot6MenuItem.Name = "SelectSlot6MenuItem"; + this.SelectSlot6MenuItem.Size = new System.Drawing.Size(178, 22); + this.SelectSlot6MenuItem.Text = "Select Slot 6"; + this.SelectSlot6MenuItem.Click += new System.EventHandler(this.SelectSlotMenuItems_Click); + // + // SelectSlot7MenuItem + // + this.SelectSlot7MenuItem.Name = "SelectSlot7MenuItem"; + this.SelectSlot7MenuItem.Size = new System.Drawing.Size(178, 22); + this.SelectSlot7MenuItem.Text = "Select Slot 7"; + this.SelectSlot7MenuItem.Click += new System.EventHandler(this.SelectSlotMenuItems_Click); + // + // SelectSlot8MenuItem + // + this.SelectSlot8MenuItem.Name = "SelectSlot8MenuItem"; + this.SelectSlot8MenuItem.Size = new System.Drawing.Size(178, 22); + this.SelectSlot8MenuItem.Text = "Select Slot 8"; + this.SelectSlot8MenuItem.Click += new System.EventHandler(this.SelectSlotMenuItems_Click); + // + // SelectSlot9MenuItem + // + this.SelectSlot9MenuItem.Name = "SelectSlot9MenuItem"; + this.SelectSlot9MenuItem.Size = new System.Drawing.Size(178, 22); + this.SelectSlot9MenuItem.Text = "Select Slot 9"; + this.SelectSlot9MenuItem.Click += new System.EventHandler(this.SelectSlotMenuItems_Click); + // + // PreviousSlotMenuItem + // + this.PreviousSlotMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.MoveLeft; + this.PreviousSlotMenuItem.Name = "PreviousSlotMenuItem"; + this.PreviousSlotMenuItem.Size = new System.Drawing.Size(178, 22); + this.PreviousSlotMenuItem.Text = "Previous Slot"; + this.PreviousSlotMenuItem.Click += new System.EventHandler(this.PreviousSlotMenuItem_Click); + // + // NextSlotMenuItem + // + this.NextSlotMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.MoveRight; + this.NextSlotMenuItem.Name = "NextSlotMenuItem"; + this.NextSlotMenuItem.Size = new System.Drawing.Size(178, 22); + this.NextSlotMenuItem.Text = "Next Slot"; + this.NextSlotMenuItem.Click += new System.EventHandler(this.NextSlotMenuItem_Click); + // + // toolStripSeparator5 + // + this.toolStripSeparator5.Name = "toolStripSeparator5"; + this.toolStripSeparator5.Size = new System.Drawing.Size(175, 6); + // + // SaveToCurrentSlotMenuItem + // + this.SaveToCurrentSlotMenuItem.Name = "SaveToCurrentSlotMenuItem"; + this.SaveToCurrentSlotMenuItem.Size = new System.Drawing.Size(178, 22); + this.SaveToCurrentSlotMenuItem.Text = "Save to Current Slot"; + this.SaveToCurrentSlotMenuItem.Click += new System.EventHandler(this.SaveToCurrentSlotMenuItem_Click); + // + // LoadCurrentSlotMenuItem + // + this.LoadCurrentSlotMenuItem.Name = "LoadCurrentSlotMenuItem"; + this.LoadCurrentSlotMenuItem.Size = new System.Drawing.Size(178, 22); + this.LoadCurrentSlotMenuItem.Text = "Load Current Slot"; + this.LoadCurrentSlotMenuItem.Click += new System.EventHandler(this.LoadCurrentSlotMenuItem_Click); + // + // SaveRAMSubMenu + // + this.SaveRAMSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.FlushSaveRAMMenuItem}); - this.SaveRAMSubMenu.Name = "SaveRAMSubMenu"; - this.SaveRAMSubMenu.Size = new System.Drawing.Size(151, 22); - this.SaveRAMSubMenu.Text = "Save &RAM"; - this.SaveRAMSubMenu.DropDownOpened += new System.EventHandler(this.FlushSaveRAMSubMenu_DropDownOpened); - // - // FlushSaveRAMMenuItem - // - this.FlushSaveRAMMenuItem.Name = "FlushSaveRAMMenuItem"; - this.FlushSaveRAMMenuItem.Size = new System.Drawing.Size(150, 22); - this.FlushSaveRAMMenuItem.Text = "&Flush Save Ram"; - this.FlushSaveRAMMenuItem.Click += new System.EventHandler(this.FlushSaveRAMMenuItem_Click); - // - // toolStripMenuItem2 - // - this.toolStripMenuItem2.Name = "toolStripMenuItem2"; - this.toolStripMenuItem2.Size = new System.Drawing.Size(148, 6); - // - // MovieSubMenu - // - this.MovieSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.SaveRAMSubMenu.Name = "SaveRAMSubMenu"; + this.SaveRAMSubMenu.Size = new System.Drawing.Size(159, 22); + this.SaveRAMSubMenu.Text = "Save &RAM"; + this.SaveRAMSubMenu.DropDownOpened += new System.EventHandler(this.FlushSaveRAMSubMenu_DropDownOpened); + // + // FlushSaveRAMMenuItem + // + this.FlushSaveRAMMenuItem.Name = "FlushSaveRAMMenuItem"; + this.FlushSaveRAMMenuItem.Size = new System.Drawing.Size(156, 22); + this.FlushSaveRAMMenuItem.Text = "&Flush Save Ram"; + this.FlushSaveRAMMenuItem.Click += new System.EventHandler(this.FlushSaveRAMMenuItem_Click); + // + // toolStripMenuItem2 + // + this.toolStripMenuItem2.Name = "toolStripMenuItem2"; + this.toolStripMenuItem2.Size = new System.Drawing.Size(156, 6); + // + // MovieSubMenu + // + this.MovieSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.ReadonlyMenuItem, this.toolStripSeparator15, this.RecentMovieSubMenu, @@ -941,338 +941,338 @@ this.AutomaticallyBackupMoviesMenuItem, this.FullMovieLoadstatesMenuItem, this.MovieEndSubMenu}); - this.MovieSubMenu.Name = "MovieSubMenu"; - this.MovieSubMenu.Size = new System.Drawing.Size(151, 22); - this.MovieSubMenu.Text = "&Movie"; - this.MovieSubMenu.DropDownOpened += new System.EventHandler(this.MovieSubMenu_DropDownOpened); - // - // ReadonlyMenuItem - // - this.ReadonlyMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.ReadOnly; - this.ReadonlyMenuItem.Name = "ReadonlyMenuItem"; - this.ReadonlyMenuItem.Size = new System.Drawing.Size(211, 22); - this.ReadonlyMenuItem.Text = "Read-only"; - this.ReadonlyMenuItem.Click += new System.EventHandler(this.ReadonlyMenuItem_Click); - // - // toolStripSeparator15 - // - this.toolStripSeparator15.Name = "toolStripSeparator15"; - this.toolStripSeparator15.Size = new System.Drawing.Size(208, 6); - // - // RecentMovieSubMenu - // - this.RecentMovieSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.MovieSubMenu.Name = "MovieSubMenu"; + this.MovieSubMenu.Size = new System.Drawing.Size(159, 22); + this.MovieSubMenu.Text = "&Movie"; + this.MovieSubMenu.DropDownOpened += new System.EventHandler(this.MovieSubMenu_DropDownOpened); + // + // ReadonlyMenuItem + // + this.ReadonlyMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.ReadOnly; + this.ReadonlyMenuItem.Name = "ReadonlyMenuItem"; + this.ReadonlyMenuItem.Size = new System.Drawing.Size(231, 22); + this.ReadonlyMenuItem.Text = "Read-only"; + this.ReadonlyMenuItem.Click += new System.EventHandler(this.ReadonlyMenuItem_Click); + // + // toolStripSeparator15 + // + this.toolStripSeparator15.Name = "toolStripSeparator15"; + this.toolStripSeparator15.Size = new System.Drawing.Size(228, 6); + // + // RecentMovieSubMenu + // + this.RecentMovieSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.toolStripSeparator16}); - this.RecentMovieSubMenu.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Recent; - this.RecentMovieSubMenu.Name = "RecentMovieSubMenu"; - this.RecentMovieSubMenu.Size = new System.Drawing.Size(211, 22); - this.RecentMovieSubMenu.Text = "Recent"; - this.RecentMovieSubMenu.DropDownOpened += new System.EventHandler(this.RecentMovieSubMenu_DropDownOpened); - // - // toolStripSeparator16 - // - this.toolStripSeparator16.Name = "toolStripSeparator16"; - this.toolStripSeparator16.Size = new System.Drawing.Size(57, 6); - // - // RecordMovieMenuItem - // - this.RecordMovieMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.RecordHS; - this.RecordMovieMenuItem.Name = "RecordMovieMenuItem"; - this.RecordMovieMenuItem.Size = new System.Drawing.Size(211, 22); - this.RecordMovieMenuItem.Text = "&Record Movie..."; - this.RecordMovieMenuItem.Click += new System.EventHandler(this.RecordMovieMenuItem_Click); - // - // PlayMovieMenuItem - // - this.PlayMovieMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Play; - this.PlayMovieMenuItem.Name = "PlayMovieMenuItem"; - this.PlayMovieMenuItem.Size = new System.Drawing.Size(211, 22); - this.PlayMovieMenuItem.Text = "&Play Movie..."; - this.PlayMovieMenuItem.Click += new System.EventHandler(this.PlayMovieMenuItem_Click); - // - // StopMovieMenuItem - // - this.StopMovieMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Stop; - this.StopMovieMenuItem.Name = "StopMovieMenuItem"; - this.StopMovieMenuItem.Size = new System.Drawing.Size(211, 22); - this.StopMovieMenuItem.Text = "Stop Movie"; - this.StopMovieMenuItem.Click += new System.EventHandler(this.StopMovieMenuItem_Click); - // - // PlayFromBeginningMenuItem - // - this.PlayFromBeginningMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.restart; - this.PlayFromBeginningMenuItem.Name = "PlayFromBeginningMenuItem"; - this.PlayFromBeginningMenuItem.Size = new System.Drawing.Size(211, 22); - this.PlayFromBeginningMenuItem.Text = "Play from Beginning"; - this.PlayFromBeginningMenuItem.Click += new System.EventHandler(this.PlayFromBeginningMenuItem_Click); - // - // ImportMoviesMenuItem - // - this.ImportMoviesMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Import; - this.ImportMoviesMenuItem.Name = "ImportMoviesMenuItem"; - this.ImportMoviesMenuItem.Size = new System.Drawing.Size(211, 22); - this.ImportMoviesMenuItem.Text = "Import Movies..."; - this.ImportMoviesMenuItem.Click += new System.EventHandler(this.ImportMovieMenuItem_Click); - // - // SaveMovieMenuItem - // - this.SaveMovieMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.SaveAs; - this.SaveMovieMenuItem.Name = "SaveMovieMenuItem"; - this.SaveMovieMenuItem.Size = new System.Drawing.Size(211, 22); - this.SaveMovieMenuItem.Text = "&Save Movie"; - this.SaveMovieMenuItem.Click += new System.EventHandler(this.SaveMovieMenuItem_Click); - // - // SaveMovieAsMenuItem - // - this.SaveMovieAsMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.SaveAs; - this.SaveMovieAsMenuItem.Name = "SaveMovieAsMenuItem"; - this.SaveMovieAsMenuItem.Size = new System.Drawing.Size(211, 22); - this.SaveMovieAsMenuItem.Text = "Save Movie As..."; - this.SaveMovieAsMenuItem.Click += new System.EventHandler(this.SaveMovieAsMenuItem_Click); - // - // StopMovieWithoutSavingMenuItem - // - this.StopMovieWithoutSavingMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Stop; - this.StopMovieWithoutSavingMenuItem.Name = "StopMovieWithoutSavingMenuItem"; - this.StopMovieWithoutSavingMenuItem.Size = new System.Drawing.Size(211, 22); - this.StopMovieWithoutSavingMenuItem.Text = "Stop Movie without Saving"; - this.StopMovieWithoutSavingMenuItem.Click += new System.EventHandler(this.StopMovieWithoutSavingMenuItem_Click); - // - // toolStripSeparator14 - // - this.toolStripSeparator14.Name = "toolStripSeparator14"; - this.toolStripSeparator14.Size = new System.Drawing.Size(208, 6); - // - // AutomaticallyBackupMoviesMenuItem - // - this.AutomaticallyBackupMoviesMenuItem.Name = "AutomaticallyBackupMoviesMenuItem"; - this.AutomaticallyBackupMoviesMenuItem.Size = new System.Drawing.Size(211, 22); - this.AutomaticallyBackupMoviesMenuItem.Text = "Automatically Backup Movies"; - this.AutomaticallyBackupMoviesMenuItem.Click += new System.EventHandler(this.AutomaticMovieBackupMenuItem_Click); - // - // FullMovieLoadstatesMenuItem - // - this.FullMovieLoadstatesMenuItem.Name = "FullMovieLoadstatesMenuItem"; - this.FullMovieLoadstatesMenuItem.Size = new System.Drawing.Size(211, 22); - this.FullMovieLoadstatesMenuItem.Text = "Full Movie Loadstates"; - this.FullMovieLoadstatesMenuItem.Click += new System.EventHandler(this.FullMovieLoadstatesMenuItem_Click); - // - // MovieEndSubMenu - // - this.MovieEndSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.RecentMovieSubMenu.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Recent; + this.RecentMovieSubMenu.Name = "RecentMovieSubMenu"; + this.RecentMovieSubMenu.Size = new System.Drawing.Size(231, 22); + this.RecentMovieSubMenu.Text = "Recent"; + this.RecentMovieSubMenu.DropDownOpened += new System.EventHandler(this.RecentMovieSubMenu_DropDownOpened); + // + // toolStripSeparator16 + // + this.toolStripSeparator16.Name = "toolStripSeparator16"; + this.toolStripSeparator16.Size = new System.Drawing.Size(57, 6); + // + // RecordMovieMenuItem + // + this.RecordMovieMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.RecordHS; + this.RecordMovieMenuItem.Name = "RecordMovieMenuItem"; + this.RecordMovieMenuItem.Size = new System.Drawing.Size(231, 22); + this.RecordMovieMenuItem.Text = "&Record Movie..."; + this.RecordMovieMenuItem.Click += new System.EventHandler(this.RecordMovieMenuItem_Click); + // + // PlayMovieMenuItem + // + this.PlayMovieMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Play; + this.PlayMovieMenuItem.Name = "PlayMovieMenuItem"; + this.PlayMovieMenuItem.Size = new System.Drawing.Size(231, 22); + this.PlayMovieMenuItem.Text = "&Play Movie..."; + this.PlayMovieMenuItem.Click += new System.EventHandler(this.PlayMovieMenuItem_Click); + // + // StopMovieMenuItem + // + this.StopMovieMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Stop; + this.StopMovieMenuItem.Name = "StopMovieMenuItem"; + this.StopMovieMenuItem.Size = new System.Drawing.Size(231, 22); + this.StopMovieMenuItem.Text = "Stop Movie"; + this.StopMovieMenuItem.Click += new System.EventHandler(this.StopMovieMenuItem_Click); + // + // PlayFromBeginningMenuItem + // + this.PlayFromBeginningMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.restart; + this.PlayFromBeginningMenuItem.Name = "PlayFromBeginningMenuItem"; + this.PlayFromBeginningMenuItem.Size = new System.Drawing.Size(231, 22); + this.PlayFromBeginningMenuItem.Text = "Play from Beginning"; + this.PlayFromBeginningMenuItem.Click += new System.EventHandler(this.PlayFromBeginningMenuItem_Click); + // + // ImportMoviesMenuItem + // + this.ImportMoviesMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Import; + this.ImportMoviesMenuItem.Name = "ImportMoviesMenuItem"; + this.ImportMoviesMenuItem.Size = new System.Drawing.Size(231, 22); + this.ImportMoviesMenuItem.Text = "Import Movies..."; + this.ImportMoviesMenuItem.Click += new System.EventHandler(this.ImportMovieMenuItem_Click); + // + // SaveMovieMenuItem + // + this.SaveMovieMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.SaveAs; + this.SaveMovieMenuItem.Name = "SaveMovieMenuItem"; + this.SaveMovieMenuItem.Size = new System.Drawing.Size(231, 22); + this.SaveMovieMenuItem.Text = "&Save Movie"; + this.SaveMovieMenuItem.Click += new System.EventHandler(this.SaveMovieMenuItem_Click); + // + // SaveMovieAsMenuItem + // + this.SaveMovieAsMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.SaveAs; + this.SaveMovieAsMenuItem.Name = "SaveMovieAsMenuItem"; + this.SaveMovieAsMenuItem.Size = new System.Drawing.Size(231, 22); + this.SaveMovieAsMenuItem.Text = "Save Movie As..."; + this.SaveMovieAsMenuItem.Click += new System.EventHandler(this.SaveMovieAsMenuItem_Click); + // + // StopMovieWithoutSavingMenuItem + // + this.StopMovieWithoutSavingMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Stop; + this.StopMovieWithoutSavingMenuItem.Name = "StopMovieWithoutSavingMenuItem"; + this.StopMovieWithoutSavingMenuItem.Size = new System.Drawing.Size(231, 22); + this.StopMovieWithoutSavingMenuItem.Text = "Stop Movie without Saving"; + this.StopMovieWithoutSavingMenuItem.Click += new System.EventHandler(this.StopMovieWithoutSavingMenuItem_Click); + // + // toolStripSeparator14 + // + this.toolStripSeparator14.Name = "toolStripSeparator14"; + this.toolStripSeparator14.Size = new System.Drawing.Size(228, 6); + // + // AutomaticallyBackupMoviesMenuItem + // + this.AutomaticallyBackupMoviesMenuItem.Name = "AutomaticallyBackupMoviesMenuItem"; + this.AutomaticallyBackupMoviesMenuItem.Size = new System.Drawing.Size(231, 22); + this.AutomaticallyBackupMoviesMenuItem.Text = "Automatically Backup Movies"; + this.AutomaticallyBackupMoviesMenuItem.Click += new System.EventHandler(this.AutomaticMovieBackupMenuItem_Click); + // + // FullMovieLoadstatesMenuItem + // + this.FullMovieLoadstatesMenuItem.Name = "FullMovieLoadstatesMenuItem"; + this.FullMovieLoadstatesMenuItem.Size = new System.Drawing.Size(231, 22); + this.FullMovieLoadstatesMenuItem.Text = "Full Movie Loadstates"; + this.FullMovieLoadstatesMenuItem.Click += new System.EventHandler(this.FullMovieLoadstatesMenuItem_Click); + // + // MovieEndSubMenu + // + this.MovieEndSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.MovieEndFinishMenuItem, this.MovieEndRecordMenuItem, this.MovieEndStopMenuItem, this.MovieEndPauseMenuItem}); - this.MovieEndSubMenu.Name = "MovieEndSubMenu"; - this.MovieEndSubMenu.Size = new System.Drawing.Size(211, 22); - this.MovieEndSubMenu.Text = "On Movie End"; - this.MovieEndSubMenu.DropDownOpened += new System.EventHandler(this.MovieEndSubMenu_DropDownOpened); - // - // MovieEndFinishMenuItem - // - this.MovieEndFinishMenuItem.Name = "MovieEndFinishMenuItem"; - this.MovieEndFinishMenuItem.Size = new System.Drawing.Size(160, 22); - this.MovieEndFinishMenuItem.Text = "Switch to Finished"; - this.MovieEndFinishMenuItem.Click += new System.EventHandler(this.MovieEndFinishMenuItem_Click); - // - // MovieEndRecordMenuItem - // - this.MovieEndRecordMenuItem.Name = "MovieEndRecordMenuItem"; - this.MovieEndRecordMenuItem.Size = new System.Drawing.Size(160, 22); - this.MovieEndRecordMenuItem.Text = "Switch To Record"; - this.MovieEndRecordMenuItem.Click += new System.EventHandler(this.MovieEndRecordMenuItem_Click); - // - // MovieEndStopMenuItem - // - this.MovieEndStopMenuItem.Name = "MovieEndStopMenuItem"; - this.MovieEndStopMenuItem.Size = new System.Drawing.Size(160, 22); - this.MovieEndStopMenuItem.Text = "Stop"; - this.MovieEndStopMenuItem.Click += new System.EventHandler(this.MovieEndStopMenuItem_Click); - // - // MovieEndPauseMenuItem - // - this.MovieEndPauseMenuItem.Name = "MovieEndPauseMenuItem"; - this.MovieEndPauseMenuItem.Size = new System.Drawing.Size(160, 22); - this.MovieEndPauseMenuItem.Text = "Pause"; - this.MovieEndPauseMenuItem.Click += new System.EventHandler(this.MovieEndPauseMenuItem_Click); - // - // AVSubMenu - // - this.AVSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.MovieEndSubMenu.Name = "MovieEndSubMenu"; + this.MovieEndSubMenu.Size = new System.Drawing.Size(231, 22); + this.MovieEndSubMenu.Text = "On Movie End"; + this.MovieEndSubMenu.DropDownOpened += new System.EventHandler(this.MovieEndSubMenu_DropDownOpened); + // + // MovieEndFinishMenuItem + // + this.MovieEndFinishMenuItem.Name = "MovieEndFinishMenuItem"; + this.MovieEndFinishMenuItem.Size = new System.Drawing.Size(170, 22); + this.MovieEndFinishMenuItem.Text = "Switch to Finished"; + this.MovieEndFinishMenuItem.Click += new System.EventHandler(this.MovieEndFinishMenuItem_Click); + // + // MovieEndRecordMenuItem + // + this.MovieEndRecordMenuItem.Name = "MovieEndRecordMenuItem"; + this.MovieEndRecordMenuItem.Size = new System.Drawing.Size(170, 22); + this.MovieEndRecordMenuItem.Text = "Switch To Record"; + this.MovieEndRecordMenuItem.Click += new System.EventHandler(this.MovieEndRecordMenuItem_Click); + // + // MovieEndStopMenuItem + // + this.MovieEndStopMenuItem.Name = "MovieEndStopMenuItem"; + this.MovieEndStopMenuItem.Size = new System.Drawing.Size(170, 22); + this.MovieEndStopMenuItem.Text = "Stop"; + this.MovieEndStopMenuItem.Click += new System.EventHandler(this.MovieEndStopMenuItem_Click); + // + // MovieEndPauseMenuItem + // + this.MovieEndPauseMenuItem.Name = "MovieEndPauseMenuItem"; + this.MovieEndPauseMenuItem.Size = new System.Drawing.Size(170, 22); + this.MovieEndPauseMenuItem.Text = "Pause"; + this.MovieEndPauseMenuItem.Click += new System.EventHandler(this.MovieEndPauseMenuItem_Click); + // + // AVSubMenu + // + this.AVSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.RecordAVMenuItem, this.ConfigAndRecordAVMenuItem, this.StopAVIMenuItem, this.toolStripSeparator19, this.CaptureOSDMenuItem, this.SynclessRecordingMenuItem}); - this.AVSubMenu.Name = "AVSubMenu"; - this.AVSubMenu.Size = new System.Drawing.Size(151, 22); - this.AVSubMenu.Text = "&AVI/WAV"; - this.AVSubMenu.DropDownOpened += new System.EventHandler(this.AVSubMenu_DropDownOpened); - // - // RecordAVMenuItem - // - this.RecordAVMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.RecordHS; - this.RecordAVMenuItem.Name = "RecordAVMenuItem"; - this.RecordAVMenuItem.Size = new System.Drawing.Size(210, 22); - this.RecordAVMenuItem.Text = "&Record AVI/WAV"; - this.RecordAVMenuItem.Click += new System.EventHandler(this.RecordAVMenuItem_Click); - // - // ConfigAndRecordAVMenuItem - // - this.ConfigAndRecordAVMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.AVI; - this.ConfigAndRecordAVMenuItem.Name = "ConfigAndRecordAVMenuItem"; - this.ConfigAndRecordAVMenuItem.Size = new System.Drawing.Size(210, 22); - this.ConfigAndRecordAVMenuItem.Text = "Config and Record AVI/WAV"; - this.ConfigAndRecordAVMenuItem.Click += new System.EventHandler(this.ConfigAndRecordAVMenuItem_Click); - // - // StopAVIMenuItem - // - this.StopAVIMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Stop; - this.StopAVIMenuItem.Name = "StopAVIMenuItem"; - this.StopAVIMenuItem.Size = new System.Drawing.Size(210, 22); - this.StopAVIMenuItem.Text = "&Stop AVI/WAV"; - this.StopAVIMenuItem.Click += new System.EventHandler(this.StopAVMenuItem_Click); - // - // toolStripSeparator19 - // - this.toolStripSeparator19.Name = "toolStripSeparator19"; - this.toolStripSeparator19.Size = new System.Drawing.Size(207, 6); - // - // CaptureOSDMenuItem - // - this.CaptureOSDMenuItem.Name = "CaptureOSDMenuItem"; - this.CaptureOSDMenuItem.Size = new System.Drawing.Size(210, 22); - this.CaptureOSDMenuItem.Text = "Capture OSD"; - this.CaptureOSDMenuItem.Click += new System.EventHandler(this.CaptureOSDMenuItem_Click); - // - // SynclessRecordingMenuItem - // - this.SynclessRecordingMenuItem.Name = "SynclessRecordingMenuItem"; - this.SynclessRecordingMenuItem.Size = new System.Drawing.Size(210, 22); - this.SynclessRecordingMenuItem.Text = "S&yncless Recording Tools"; - this.SynclessRecordingMenuItem.Click += new System.EventHandler(this.SynclessRecordingMenuItem_Click); - // - // ScreenshotSubMenu - // - this.ScreenshotSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.AVSubMenu.Name = "AVSubMenu"; + this.AVSubMenu.Size = new System.Drawing.Size(159, 22); + this.AVSubMenu.Text = "&AVI/WAV"; + this.AVSubMenu.DropDownOpened += new System.EventHandler(this.AVSubMenu_DropDownOpened); + // + // RecordAVMenuItem + // + this.RecordAVMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.RecordHS; + this.RecordAVMenuItem.Name = "RecordAVMenuItem"; + this.RecordAVMenuItem.Size = new System.Drawing.Size(223, 22); + this.RecordAVMenuItem.Text = "&Record AVI/WAV"; + this.RecordAVMenuItem.Click += new System.EventHandler(this.RecordAVMenuItem_Click); + // + // ConfigAndRecordAVMenuItem + // + this.ConfigAndRecordAVMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.AVI; + this.ConfigAndRecordAVMenuItem.Name = "ConfigAndRecordAVMenuItem"; + this.ConfigAndRecordAVMenuItem.Size = new System.Drawing.Size(223, 22); + this.ConfigAndRecordAVMenuItem.Text = "Config and Record AVI/WAV"; + this.ConfigAndRecordAVMenuItem.Click += new System.EventHandler(this.ConfigAndRecordAVMenuItem_Click); + // + // StopAVIMenuItem + // + this.StopAVIMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Stop; + this.StopAVIMenuItem.Name = "StopAVIMenuItem"; + this.StopAVIMenuItem.Size = new System.Drawing.Size(223, 22); + this.StopAVIMenuItem.Text = "&Stop AVI/WAV"; + this.StopAVIMenuItem.Click += new System.EventHandler(this.StopAVMenuItem_Click); + // + // toolStripSeparator19 + // + this.toolStripSeparator19.Name = "toolStripSeparator19"; + this.toolStripSeparator19.Size = new System.Drawing.Size(220, 6); + // + // CaptureOSDMenuItem + // + this.CaptureOSDMenuItem.Name = "CaptureOSDMenuItem"; + this.CaptureOSDMenuItem.Size = new System.Drawing.Size(223, 22); + this.CaptureOSDMenuItem.Text = "Capture OSD"; + this.CaptureOSDMenuItem.Click += new System.EventHandler(this.CaptureOSDMenuItem_Click); + // + // SynclessRecordingMenuItem + // + this.SynclessRecordingMenuItem.Name = "SynclessRecordingMenuItem"; + this.SynclessRecordingMenuItem.Size = new System.Drawing.Size(223, 22); + this.SynclessRecordingMenuItem.Text = "S&yncless Recording Tools"; + this.SynclessRecordingMenuItem.Click += new System.EventHandler(this.SynclessRecordingMenuItem_Click); + // + // ScreenshotSubMenu + // + this.ScreenshotSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.ScreenshotMenuItem, this.ScreenshotAsMenuItem, this.ScreenshotClipboardMenuItem, this.ScreenshotClientClipboardMenuItem, this.toolStripSeparator20, this.ScreenshotCaptureOSDMenuItem1}); - this.ScreenshotSubMenu.Name = "ScreenshotSubMenu"; - this.ScreenshotSubMenu.Size = new System.Drawing.Size(151, 22); - this.ScreenshotSubMenu.Text = "Scree&nshot"; - this.ScreenshotSubMenu.DropDownOpening += new System.EventHandler(this.ScreenshotSubMenu_DropDownOpening); - // - // ScreenshotMenuItem - // - this.ScreenshotMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.camera; - this.ScreenshotMenuItem.Name = "ScreenshotMenuItem"; - this.ScreenshotMenuItem.Size = new System.Drawing.Size(227, 22); - this.ScreenshotMenuItem.Text = "Screenshot"; - this.ScreenshotMenuItem.Click += new System.EventHandler(this.ScreenshotMenuItem_Click); - // - // ScreenshotAsMenuItem - // - this.ScreenshotAsMenuItem.Name = "ScreenshotAsMenuItem"; - this.ScreenshotAsMenuItem.Size = new System.Drawing.Size(227, 22); - this.ScreenshotAsMenuItem.Text = "Screenshot As..."; - this.ScreenshotAsMenuItem.Click += new System.EventHandler(this.ScreenshotAsMenuItem_Click); - // - // ScreenshotClipboardMenuItem - // - this.ScreenshotClipboardMenuItem.Name = "ScreenshotClipboardMenuItem"; - this.ScreenshotClipboardMenuItem.Size = new System.Drawing.Size(227, 22); - this.ScreenshotClipboardMenuItem.Text = "Screenshot (raw) -> Clipboard"; - this.ScreenshotClipboardMenuItem.Click += new System.EventHandler(this.ScreenshotClipboardMenuItem_Click); - // - // ScreenshotClientClipboardMenuItem - // - this.ScreenshotClientClipboardMenuItem.Name = "ScreenshotClientClipboardMenuItem"; - this.ScreenshotClientClipboardMenuItem.Size = new System.Drawing.Size(227, 22); - this.ScreenshotClientClipboardMenuItem.Text = "Screenshot (client) -> Clipboard"; - this.ScreenshotClientClipboardMenuItem.Click += new System.EventHandler(this.ScreenshotClientClipboardMenuItem_Click); - // - // toolStripSeparator20 - // - this.toolStripSeparator20.Name = "toolStripSeparator20"; - this.toolStripSeparator20.Size = new System.Drawing.Size(224, 6); - // - // ScreenshotCaptureOSDMenuItem1 - // - this.ScreenshotCaptureOSDMenuItem1.Name = "ScreenshotCaptureOSDMenuItem1"; - this.ScreenshotCaptureOSDMenuItem1.Size = new System.Drawing.Size(227, 22); - this.ScreenshotCaptureOSDMenuItem1.Text = "Capture OSD"; - this.ScreenshotCaptureOSDMenuItem1.Click += new System.EventHandler(this.ScreenshotCaptureOSDMenuItem_Click); - // - // toolStripSeparator4 - // - this.toolStripSeparator4.Name = "toolStripSeparator4"; - this.toolStripSeparator4.Size = new System.Drawing.Size(148, 6); - // - // ExitMenuItem - // - this.ExitMenuItem.Name = "ExitMenuItem"; - this.ExitMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Alt | System.Windows.Forms.Keys.F4))); - this.ExitMenuItem.Size = new System.Drawing.Size(151, 22); - this.ExitMenuItem.Text = "E&xit"; - this.ExitMenuItem.Click += new System.EventHandler(this.ExitMenuItem_Click); - // - // EmulationSubMenu - // - this.EmulationSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.ScreenshotSubMenu.Name = "ScreenshotSubMenu"; + this.ScreenshotSubMenu.Size = new System.Drawing.Size(159, 22); + this.ScreenshotSubMenu.Text = "Scree&nshot"; + this.ScreenshotSubMenu.DropDownOpening += new System.EventHandler(this.ScreenshotSubMenu_DropDownOpening); + // + // ScreenshotMenuItem + // + this.ScreenshotMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.camera; + this.ScreenshotMenuItem.Name = "ScreenshotMenuItem"; + this.ScreenshotMenuItem.Size = new System.Drawing.Size(243, 22); + this.ScreenshotMenuItem.Text = "Screenshot"; + this.ScreenshotMenuItem.Click += new System.EventHandler(this.ScreenshotMenuItem_Click); + // + // ScreenshotAsMenuItem + // + this.ScreenshotAsMenuItem.Name = "ScreenshotAsMenuItem"; + this.ScreenshotAsMenuItem.Size = new System.Drawing.Size(243, 22); + this.ScreenshotAsMenuItem.Text = "Screenshot As..."; + this.ScreenshotAsMenuItem.Click += new System.EventHandler(this.ScreenshotAsMenuItem_Click); + // + // ScreenshotClipboardMenuItem + // + this.ScreenshotClipboardMenuItem.Name = "ScreenshotClipboardMenuItem"; + this.ScreenshotClipboardMenuItem.Size = new System.Drawing.Size(243, 22); + this.ScreenshotClipboardMenuItem.Text = "Screenshot (raw) -> Clipboard"; + this.ScreenshotClipboardMenuItem.Click += new System.EventHandler(this.ScreenshotClipboardMenuItem_Click); + // + // ScreenshotClientClipboardMenuItem + // + this.ScreenshotClientClipboardMenuItem.Name = "ScreenshotClientClipboardMenuItem"; + this.ScreenshotClientClipboardMenuItem.Size = new System.Drawing.Size(243, 22); + this.ScreenshotClientClipboardMenuItem.Text = "Screenshot (client) -> Clipboard"; + this.ScreenshotClientClipboardMenuItem.Click += new System.EventHandler(this.ScreenshotClientClipboardMenuItem_Click); + // + // toolStripSeparator20 + // + this.toolStripSeparator20.Name = "toolStripSeparator20"; + this.toolStripSeparator20.Size = new System.Drawing.Size(240, 6); + // + // ScreenshotCaptureOSDMenuItem1 + // + this.ScreenshotCaptureOSDMenuItem1.Name = "ScreenshotCaptureOSDMenuItem1"; + this.ScreenshotCaptureOSDMenuItem1.Size = new System.Drawing.Size(243, 22); + this.ScreenshotCaptureOSDMenuItem1.Text = "Capture OSD"; + this.ScreenshotCaptureOSDMenuItem1.Click += new System.EventHandler(this.ScreenshotCaptureOSDMenuItem_Click); + // + // toolStripSeparator4 + // + this.toolStripSeparator4.Name = "toolStripSeparator4"; + this.toolStripSeparator4.Size = new System.Drawing.Size(156, 6); + // + // ExitMenuItem + // + this.ExitMenuItem.Name = "ExitMenuItem"; + this.ExitMenuItem.ShortcutKeys = ((System.Windows.Forms.Keys)((System.Windows.Forms.Keys.Alt | System.Windows.Forms.Keys.F4))); + this.ExitMenuItem.Size = new System.Drawing.Size(159, 22); + this.ExitMenuItem.Text = "E&xit"; + this.ExitMenuItem.Click += new System.EventHandler(this.ExitMenuItem_Click); + // + // EmulationSubMenu + // + this.EmulationSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.PauseMenuItem, this.RebootCoreMenuItem, this.toolStripSeparator1, this.SoftResetMenuItem, this.HardResetMenuItem}); - this.EmulationSubMenu.Name = "EmulationSubMenu"; - this.EmulationSubMenu.Size = new System.Drawing.Size(65, 17); - this.EmulationSubMenu.Text = "&Emulation"; - this.EmulationSubMenu.DropDownOpened += new System.EventHandler(this.EmulationMenuItem_DropDownOpened); - // - // PauseMenuItem - // - this.PauseMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Pause; - this.PauseMenuItem.Name = "PauseMenuItem"; - this.PauseMenuItem.Size = new System.Drawing.Size(135, 22); - this.PauseMenuItem.Text = "&Pause"; - this.PauseMenuItem.Click += new System.EventHandler(this.PauseMenuItem_Click); - // - // RebootCoreMenuItem - // - this.RebootCoreMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.reboot; - this.RebootCoreMenuItem.Name = "RebootCoreMenuItem"; - this.RebootCoreMenuItem.Size = new System.Drawing.Size(135, 22); - this.RebootCoreMenuItem.Text = "&Reboot Core"; - this.RebootCoreMenuItem.Click += new System.EventHandler(this.PowerMenuItem_Click); - // - // toolStripSeparator1 - // - this.toolStripSeparator1.Name = "toolStripSeparator1"; - this.toolStripSeparator1.Size = new System.Drawing.Size(132, 6); - // - // SoftResetMenuItem - // - this.SoftResetMenuItem.Name = "SoftResetMenuItem"; - this.SoftResetMenuItem.Size = new System.Drawing.Size(135, 22); - this.SoftResetMenuItem.Text = "&Soft Reset"; - this.SoftResetMenuItem.Click += new System.EventHandler(this.SoftResetMenuItem_Click); - // - // HardResetMenuItem - // - this.HardResetMenuItem.Name = "HardResetMenuItem"; - this.HardResetMenuItem.Size = new System.Drawing.Size(135, 22); - this.HardResetMenuItem.Text = "&Hard Reset"; - this.HardResetMenuItem.Click += new System.EventHandler(this.HardResetMenuItem_Click); - // - // ViewSubMenu - // - this.ViewSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.EmulationSubMenu.Name = "EmulationSubMenu"; + this.EmulationSubMenu.Size = new System.Drawing.Size(73, 19); + this.EmulationSubMenu.Text = "&Emulation"; + this.EmulationSubMenu.DropDownOpened += new System.EventHandler(this.EmulationMenuItem_DropDownOpened); + // + // PauseMenuItem + // + this.PauseMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Pause; + this.PauseMenuItem.Name = "PauseMenuItem"; + this.PauseMenuItem.Size = new System.Drawing.Size(140, 22); + this.PauseMenuItem.Text = "&Pause"; + this.PauseMenuItem.Click += new System.EventHandler(this.PauseMenuItem_Click); + // + // RebootCoreMenuItem + // + this.RebootCoreMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.reboot; + this.RebootCoreMenuItem.Name = "RebootCoreMenuItem"; + this.RebootCoreMenuItem.Size = new System.Drawing.Size(140, 22); + this.RebootCoreMenuItem.Text = "&Reboot Core"; + this.RebootCoreMenuItem.Click += new System.EventHandler(this.PowerMenuItem_Click); + // + // toolStripSeparator1 + // + this.toolStripSeparator1.Name = "toolStripSeparator1"; + this.toolStripSeparator1.Size = new System.Drawing.Size(137, 6); + // + // SoftResetMenuItem + // + this.SoftResetMenuItem.Name = "SoftResetMenuItem"; + this.SoftResetMenuItem.Size = new System.Drawing.Size(140, 22); + this.SoftResetMenuItem.Text = "&Soft Reset"; + this.SoftResetMenuItem.Click += new System.EventHandler(this.SoftResetMenuItem_Click); + // + // HardResetMenuItem + // + this.HardResetMenuItem.Name = "HardResetMenuItem"; + this.HardResetMenuItem.Size = new System.Drawing.Size(140, 22); + this.HardResetMenuItem.Text = "&Hard Reset"; + this.HardResetMenuItem.Click += new System.EventHandler(this.HardResetMenuItem_Click); + // + // ViewSubMenu + // + this.ViewSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.WindowSizeSubMenu, this.SwitchToFullscreenMenuItem, this.toolStripSeparator2, @@ -1286,151 +1286,151 @@ this.DisplayStatusBarMenuItem, this.DisplayMessagesMenuItem, this.DisplayLogWindowMenuItem}); - this.ViewSubMenu.Name = "ViewSubMenu"; - this.ViewSubMenu.Size = new System.Drawing.Size(41, 17); - this.ViewSubMenu.Text = "&View"; - this.ViewSubMenu.DropDownOpened += new System.EventHandler(this.ViewSubMenu_DropDownOpened); - // - // WindowSizeSubMenu - // - this.WindowSizeSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.ViewSubMenu.Name = "ViewSubMenu"; + this.ViewSubMenu.Size = new System.Drawing.Size(44, 19); + this.ViewSubMenu.Text = "&View"; + this.ViewSubMenu.DropDownOpened += new System.EventHandler(this.ViewSubMenu_DropDownOpened); + // + // WindowSizeSubMenu + // + this.WindowSizeSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.x1MenuItem, this.x2MenuItem, this.x3MenuItem, this.x4MenuItem, this.x5MenuItem, this.mzMenuItem}); - this.WindowSizeSubMenu.Name = "WindowSizeSubMenu"; - this.WindowSizeSubMenu.Size = new System.Drawing.Size(187, 22); - this.WindowSizeSubMenu.Text = "&Window Size"; - this.WindowSizeSubMenu.DropDownOpened += new System.EventHandler(this.WindowSizeSubMenu_DropDownOpened); - // - // x1MenuItem - // - this.x1MenuItem.Name = "x1MenuItem"; - this.x1MenuItem.Size = new System.Drawing.Size(94, 22); - this.x1MenuItem.Text = "&1x"; - this.x1MenuItem.Click += new System.EventHandler(this.WindowSize_Click); - // - // x2MenuItem - // - this.x2MenuItem.Name = "x2MenuItem"; - this.x2MenuItem.Size = new System.Drawing.Size(94, 22); - this.x2MenuItem.Text = "&2x"; - this.x2MenuItem.Click += new System.EventHandler(this.WindowSize_Click); - // - // x3MenuItem - // - this.x3MenuItem.Name = "x3MenuItem"; - this.x3MenuItem.Size = new System.Drawing.Size(94, 22); - this.x3MenuItem.Text = "&3x"; - this.x3MenuItem.Click += new System.EventHandler(this.WindowSize_Click); - // - // x4MenuItem - // - this.x4MenuItem.Name = "x4MenuItem"; - this.x4MenuItem.Size = new System.Drawing.Size(94, 22); - this.x4MenuItem.Text = "&4x"; - this.x4MenuItem.Click += new System.EventHandler(this.WindowSize_Click); - // - // x5MenuItem - // - this.x5MenuItem.Name = "x5MenuItem"; - this.x5MenuItem.Size = new System.Drawing.Size(94, 22); - this.x5MenuItem.Text = "&5x"; - this.x5MenuItem.Click += new System.EventHandler(this.WindowSize_Click); - // - // mzMenuItem - // - this.mzMenuItem.Name = "mzMenuItem"; - this.mzMenuItem.Size = new System.Drawing.Size(94, 22); - this.mzMenuItem.Text = "&Max"; - this.mzMenuItem.Click += new System.EventHandler(this.WindowSize_Click); - // - // SwitchToFullscreenMenuItem - // - this.SwitchToFullscreenMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Fullscreen; - this.SwitchToFullscreenMenuItem.Name = "SwitchToFullscreenMenuItem"; - this.SwitchToFullscreenMenuItem.Size = new System.Drawing.Size(187, 22); - this.SwitchToFullscreenMenuItem.Text = "Switch to Fullscreen"; - this.SwitchToFullscreenMenuItem.Click += new System.EventHandler(this.SwitchToFullscreenMenuItem_Click); - // - // toolStripSeparator2 - // - this.toolStripSeparator2.Name = "toolStripSeparator2"; - this.toolStripSeparator2.Size = new System.Drawing.Size(184, 6); - // - // DisplayFPSMenuItem - // - this.DisplayFPSMenuItem.Name = "DisplayFPSMenuItem"; - this.DisplayFPSMenuItem.Size = new System.Drawing.Size(187, 22); - this.DisplayFPSMenuItem.Text = "Display FPS"; - this.DisplayFPSMenuItem.Click += new System.EventHandler(this.DisplayFpsMenuItem_Click); - // - // DisplayFrameCounterMenuItem - // - this.DisplayFrameCounterMenuItem.Name = "DisplayFrameCounterMenuItem"; - this.DisplayFrameCounterMenuItem.Size = new System.Drawing.Size(187, 22); - this.DisplayFrameCounterMenuItem.Text = "Display FrameCounter"; - this.DisplayFrameCounterMenuItem.Click += new System.EventHandler(this.DisplayFrameCounterMenuItem_Click); - // - // DisplayLagCounterMenuItem - // - this.DisplayLagCounterMenuItem.Name = "DisplayLagCounterMenuItem"; - this.DisplayLagCounterMenuItem.Size = new System.Drawing.Size(187, 22); - this.DisplayLagCounterMenuItem.Text = "Display Lag Counter"; - this.DisplayLagCounterMenuItem.Click += new System.EventHandler(this.DisplayLagCounterMenuItem_Click); - // - // DisplayInputMenuItem - // - this.DisplayInputMenuItem.Name = "DisplayInputMenuItem"; - this.DisplayInputMenuItem.Size = new System.Drawing.Size(187, 22); - this.DisplayInputMenuItem.Text = "Display Input"; - this.DisplayInputMenuItem.Click += new System.EventHandler(this.DisplayInputMenuItem_Click); - // - // DisplayRerecordCountMenuItem - // - this.DisplayRerecordCountMenuItem.Name = "DisplayRerecordCountMenuItem"; - this.DisplayRerecordCountMenuItem.Size = new System.Drawing.Size(187, 22); - this.DisplayRerecordCountMenuItem.Text = "Display Rerecord Count"; - this.DisplayRerecordCountMenuItem.Click += new System.EventHandler(this.DisplayRerecordsMenuItem_Click); - // - // DisplaySubtitlesMenuItem - // - this.DisplaySubtitlesMenuItem.Name = "DisplaySubtitlesMenuItem"; - this.DisplaySubtitlesMenuItem.Size = new System.Drawing.Size(187, 22); - this.DisplaySubtitlesMenuItem.Text = "Display Subtitles"; - this.DisplaySubtitlesMenuItem.Click += new System.EventHandler(this.DisplaySubtitlesMenuItem_Click); - // - // toolStripMenuItem4 - // - this.toolStripMenuItem4.Name = "toolStripMenuItem4"; - this.toolStripMenuItem4.Size = new System.Drawing.Size(184, 6); - // - // DisplayStatusBarMenuItem - // - this.DisplayStatusBarMenuItem.Name = "DisplayStatusBarMenuItem"; - this.DisplayStatusBarMenuItem.Size = new System.Drawing.Size(187, 22); - this.DisplayStatusBarMenuItem.Text = "Display Status Bar"; - this.DisplayStatusBarMenuItem.Click += new System.EventHandler(this.DisplayStatusBarMenuItem_Click); - // - // DisplayMessagesMenuItem - // - this.DisplayMessagesMenuItem.Name = "DisplayMessagesMenuItem"; - this.DisplayMessagesMenuItem.Size = new System.Drawing.Size(187, 22); - this.DisplayMessagesMenuItem.Text = "Display Messages"; - this.DisplayMessagesMenuItem.Click += new System.EventHandler(this.DisplayMessagesMenuItem_Click); - // - // DisplayLogWindowMenuItem - // - this.DisplayLogWindowMenuItem.Name = "DisplayLogWindowMenuItem"; - this.DisplayLogWindowMenuItem.Size = new System.Drawing.Size(187, 22); - this.DisplayLogWindowMenuItem.Text = "Display Log Window"; - this.DisplayLogWindowMenuItem.Click += new System.EventHandler(this.DisplayLogWindowMenuItem_Click); - // - // ConfigSubMenu - // - this.ConfigSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.WindowSizeSubMenu.Name = "WindowSizeSubMenu"; + this.WindowSizeSubMenu.Size = new System.Drawing.Size(198, 22); + this.WindowSizeSubMenu.Text = "&Window Size"; + this.WindowSizeSubMenu.DropDownOpened += new System.EventHandler(this.WindowSizeSubMenu_DropDownOpened); + // + // x1MenuItem + // + this.x1MenuItem.Name = "x1MenuItem"; + this.x1MenuItem.Size = new System.Drawing.Size(96, 22); + this.x1MenuItem.Text = "&1x"; + this.x1MenuItem.Click += new System.EventHandler(this.WindowSize_Click); + // + // x2MenuItem + // + this.x2MenuItem.Name = "x2MenuItem"; + this.x2MenuItem.Size = new System.Drawing.Size(96, 22); + this.x2MenuItem.Text = "&2x"; + this.x2MenuItem.Click += new System.EventHandler(this.WindowSize_Click); + // + // x3MenuItem + // + this.x3MenuItem.Name = "x3MenuItem"; + this.x3MenuItem.Size = new System.Drawing.Size(96, 22); + this.x3MenuItem.Text = "&3x"; + this.x3MenuItem.Click += new System.EventHandler(this.WindowSize_Click); + // + // x4MenuItem + // + this.x4MenuItem.Name = "x4MenuItem"; + this.x4MenuItem.Size = new System.Drawing.Size(96, 22); + this.x4MenuItem.Text = "&4x"; + this.x4MenuItem.Click += new System.EventHandler(this.WindowSize_Click); + // + // x5MenuItem + // + this.x5MenuItem.Name = "x5MenuItem"; + this.x5MenuItem.Size = new System.Drawing.Size(96, 22); + this.x5MenuItem.Text = "&5x"; + this.x5MenuItem.Click += new System.EventHandler(this.WindowSize_Click); + // + // mzMenuItem + // + this.mzMenuItem.Name = "mzMenuItem"; + this.mzMenuItem.Size = new System.Drawing.Size(96, 22); + this.mzMenuItem.Text = "&Max"; + this.mzMenuItem.Click += new System.EventHandler(this.WindowSize_Click); + // + // SwitchToFullscreenMenuItem + // + this.SwitchToFullscreenMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Fullscreen; + this.SwitchToFullscreenMenuItem.Name = "SwitchToFullscreenMenuItem"; + this.SwitchToFullscreenMenuItem.Size = new System.Drawing.Size(198, 22); + this.SwitchToFullscreenMenuItem.Text = "Switch to Fullscreen"; + this.SwitchToFullscreenMenuItem.Click += new System.EventHandler(this.SwitchToFullscreenMenuItem_Click); + // + // toolStripSeparator2 + // + this.toolStripSeparator2.Name = "toolStripSeparator2"; + this.toolStripSeparator2.Size = new System.Drawing.Size(195, 6); + // + // DisplayFPSMenuItem + // + this.DisplayFPSMenuItem.Name = "DisplayFPSMenuItem"; + this.DisplayFPSMenuItem.Size = new System.Drawing.Size(198, 22); + this.DisplayFPSMenuItem.Text = "Display FPS"; + this.DisplayFPSMenuItem.Click += new System.EventHandler(this.DisplayFpsMenuItem_Click); + // + // DisplayFrameCounterMenuItem + // + this.DisplayFrameCounterMenuItem.Name = "DisplayFrameCounterMenuItem"; + this.DisplayFrameCounterMenuItem.Size = new System.Drawing.Size(198, 22); + this.DisplayFrameCounterMenuItem.Text = "Display FrameCounter"; + this.DisplayFrameCounterMenuItem.Click += new System.EventHandler(this.DisplayFrameCounterMenuItem_Click); + // + // DisplayLagCounterMenuItem + // + this.DisplayLagCounterMenuItem.Name = "DisplayLagCounterMenuItem"; + this.DisplayLagCounterMenuItem.Size = new System.Drawing.Size(198, 22); + this.DisplayLagCounterMenuItem.Text = "Display Lag Counter"; + this.DisplayLagCounterMenuItem.Click += new System.EventHandler(this.DisplayLagCounterMenuItem_Click); + // + // DisplayInputMenuItem + // + this.DisplayInputMenuItem.Name = "DisplayInputMenuItem"; + this.DisplayInputMenuItem.Size = new System.Drawing.Size(198, 22); + this.DisplayInputMenuItem.Text = "Display Input"; + this.DisplayInputMenuItem.Click += new System.EventHandler(this.DisplayInputMenuItem_Click); + // + // DisplayRerecordCountMenuItem + // + this.DisplayRerecordCountMenuItem.Name = "DisplayRerecordCountMenuItem"; + this.DisplayRerecordCountMenuItem.Size = new System.Drawing.Size(198, 22); + this.DisplayRerecordCountMenuItem.Text = "Display Rerecord Count"; + this.DisplayRerecordCountMenuItem.Click += new System.EventHandler(this.DisplayRerecordsMenuItem_Click); + // + // DisplaySubtitlesMenuItem + // + this.DisplaySubtitlesMenuItem.Name = "DisplaySubtitlesMenuItem"; + this.DisplaySubtitlesMenuItem.Size = new System.Drawing.Size(198, 22); + this.DisplaySubtitlesMenuItem.Text = "Display Subtitles"; + this.DisplaySubtitlesMenuItem.Click += new System.EventHandler(this.DisplaySubtitlesMenuItem_Click); + // + // toolStripMenuItem4 + // + this.toolStripMenuItem4.Name = "toolStripMenuItem4"; + this.toolStripMenuItem4.Size = new System.Drawing.Size(195, 6); + // + // DisplayStatusBarMenuItem + // + this.DisplayStatusBarMenuItem.Name = "DisplayStatusBarMenuItem"; + this.DisplayStatusBarMenuItem.Size = new System.Drawing.Size(198, 22); + this.DisplayStatusBarMenuItem.Text = "Display Status Bar"; + this.DisplayStatusBarMenuItem.Click += new System.EventHandler(this.DisplayStatusBarMenuItem_Click); + // + // DisplayMessagesMenuItem + // + this.DisplayMessagesMenuItem.Name = "DisplayMessagesMenuItem"; + this.DisplayMessagesMenuItem.Size = new System.Drawing.Size(198, 22); + this.DisplayMessagesMenuItem.Text = "Display Messages"; + this.DisplayMessagesMenuItem.Click += new System.EventHandler(this.DisplayMessagesMenuItem_Click); + // + // DisplayLogWindowMenuItem + // + this.DisplayLogWindowMenuItem.Name = "DisplayLogWindowMenuItem"; + this.DisplayLogWindowMenuItem.Size = new System.Drawing.Size(198, 22); + this.DisplayLogWindowMenuItem.Text = "Display Log Window"; + this.DisplayLogWindowMenuItem.Click += new System.EventHandler(this.DisplayLogWindowMenuItem_Click); + // + // ConfigSubMenu + // + this.ConfigSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.ControllersMenuItem, this.HotkeysMenuItem, this.DisplayConfigMenuItem, @@ -1452,113 +1452,113 @@ this.SaveConfigAsMenuItem, this.LoadConfigMenuItem, this.LoadConfigFromMenuItem}); - this.ConfigSubMenu.Name = "ConfigSubMenu"; - this.ConfigSubMenu.Size = new System.Drawing.Size(50, 17); - this.ConfigSubMenu.Text = "&Config"; - this.ConfigSubMenu.DropDownOpened += new System.EventHandler(this.ConfigSubMenu_DropDownOpened); - // - // ControllersMenuItem - // - this.ControllersMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.GameController; - this.ControllersMenuItem.Name = "ControllersMenuItem"; - this.ControllersMenuItem.Size = new System.Drawing.Size(170, 22); - this.ControllersMenuItem.Text = "&Controllers..."; - this.ControllersMenuItem.Click += new System.EventHandler(this.ControllersMenuItem_Click); - // - // HotkeysMenuItem - // - this.HotkeysMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.HotKeys; - this.HotkeysMenuItem.Name = "HotkeysMenuItem"; - this.HotkeysMenuItem.Size = new System.Drawing.Size(170, 22); - this.HotkeysMenuItem.Text = "&Hotkeys..."; - this.HotkeysMenuItem.Click += new System.EventHandler(this.HotkeysMenuItem_Click); - // - // DisplayConfigMenuItem - // - this.DisplayConfigMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("DisplayConfigMenuItem.Image"))); - this.DisplayConfigMenuItem.Name = "DisplayConfigMenuItem"; - this.DisplayConfigMenuItem.Size = new System.Drawing.Size(170, 22); - this.DisplayConfigMenuItem.Text = "Display..."; - this.DisplayConfigMenuItem.Click += new System.EventHandler(this.DisplayConfigMenuItem_Click); - // - // SoundMenuItem - // - this.SoundMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.AudioHS; - this.SoundMenuItem.Name = "SoundMenuItem"; - this.SoundMenuItem.Size = new System.Drawing.Size(170, 22); - this.SoundMenuItem.Text = "&Sound..."; - this.SoundMenuItem.Click += new System.EventHandler(this.SoundMenuItem_Click); - // - // PathsMenuItem - // - this.PathsMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.CopyFolderHS; - this.PathsMenuItem.Name = "PathsMenuItem"; - this.PathsMenuItem.Size = new System.Drawing.Size(170, 22); - this.PathsMenuItem.Text = "Paths..."; - this.PathsMenuItem.Click += new System.EventHandler(this.PathsMenuItem_Click); - // - // FirmwaresMenuItem - // - this.FirmwaresMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("FirmwaresMenuItem.Image"))); - this.FirmwaresMenuItem.Name = "FirmwaresMenuItem"; - this.FirmwaresMenuItem.Size = new System.Drawing.Size(170, 22); - this.FirmwaresMenuItem.Text = "&Firmwares..."; - this.FirmwaresMenuItem.Click += new System.EventHandler(this.FirmwaresMenuItem_Click); - // - // MessagesMenuItem - // - this.MessagesMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.MessageConfig; - this.MessagesMenuItem.Name = "MessagesMenuItem"; - this.MessagesMenuItem.Size = new System.Drawing.Size(170, 22); - this.MessagesMenuItem.Text = "&Messages..."; - this.MessagesMenuItem.Click += new System.EventHandler(this.MessagesMenuItem_Click); - // - // AutofireMenuItem - // - this.AutofireMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Lightning; - this.AutofireMenuItem.Name = "AutofireMenuItem"; - this.AutofireMenuItem.Size = new System.Drawing.Size(170, 22); - this.AutofireMenuItem.Text = "&Autofire..."; - this.AutofireMenuItem.Click += new System.EventHandler(this.AutofireMenuItem_Click); - // - // RewindOptionsMenuItem - // - this.RewindOptionsMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Previous; - this.RewindOptionsMenuItem.Name = "RewindOptionsMenuItem"; - this.RewindOptionsMenuItem.Size = new System.Drawing.Size(170, 22); - this.RewindOptionsMenuItem.Text = "&Rewind && States..."; - this.RewindOptionsMenuItem.Click += new System.EventHandler(this.RewindOptionsMenuItem_Click); - // - // extensionsToolStripMenuItem - // - this.extensionsToolStripMenuItem.Name = "extensionsToolStripMenuItem"; - this.extensionsToolStripMenuItem.Size = new System.Drawing.Size(170, 22); - this.extensionsToolStripMenuItem.Text = "File Extensions..."; - this.extensionsToolStripMenuItem.Click += new System.EventHandler(this.FileExtensionsMenuItem_Click); - // - // ClientOptionsMenuItem - // - this.ClientOptionsMenuItem.Name = "ClientOptionsMenuItem"; - this.ClientOptionsMenuItem.Size = new System.Drawing.Size(170, 22); - this.ClientOptionsMenuItem.Text = "&Customize..."; - this.ClientOptionsMenuItem.Click += new System.EventHandler(this.CustomizeMenuItem_Click); - // - // ProfilesMenuItem - // - this.ProfilesMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.user_blue_small; - this.ProfilesMenuItem.Name = "ProfilesMenuItem"; - this.ProfilesMenuItem.Size = new System.Drawing.Size(170, 22); - this.ProfilesMenuItem.Text = "&Profiles..."; - this.ProfilesMenuItem.Click += new System.EventHandler(this.ProfilesMenuItem_Click); - // - // toolStripSeparator9 - // - this.toolStripSeparator9.Name = "toolStripSeparator9"; - this.toolStripSeparator9.Size = new System.Drawing.Size(167, 6); - // - // SpeedSkipSubMenu - // - this.SpeedSkipSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.ConfigSubMenu.Name = "ConfigSubMenu"; + this.ConfigSubMenu.Size = new System.Drawing.Size(55, 19); + this.ConfigSubMenu.Text = "&Config"; + this.ConfigSubMenu.DropDownOpened += new System.EventHandler(this.ConfigSubMenu_DropDownOpened); + // + // ControllersMenuItem + // + this.ControllersMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.GameController; + this.ControllersMenuItem.Name = "ControllersMenuItem"; + this.ControllersMenuItem.Size = new System.Drawing.Size(179, 22); + this.ControllersMenuItem.Text = "&Controllers..."; + this.ControllersMenuItem.Click += new System.EventHandler(this.ControllersMenuItem_Click); + // + // HotkeysMenuItem + // + this.HotkeysMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.HotKeys; + this.HotkeysMenuItem.Name = "HotkeysMenuItem"; + this.HotkeysMenuItem.Size = new System.Drawing.Size(179, 22); + this.HotkeysMenuItem.Text = "&Hotkeys..."; + this.HotkeysMenuItem.Click += new System.EventHandler(this.HotkeysMenuItem_Click); + // + // DisplayConfigMenuItem + // + this.DisplayConfigMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("DisplayConfigMenuItem.Image"))); + this.DisplayConfigMenuItem.Name = "DisplayConfigMenuItem"; + this.DisplayConfigMenuItem.Size = new System.Drawing.Size(179, 22); + this.DisplayConfigMenuItem.Text = "Display..."; + this.DisplayConfigMenuItem.Click += new System.EventHandler(this.DisplayConfigMenuItem_Click); + // + // SoundMenuItem + // + this.SoundMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.AudioHS; + this.SoundMenuItem.Name = "SoundMenuItem"; + this.SoundMenuItem.Size = new System.Drawing.Size(179, 22); + this.SoundMenuItem.Text = "&Sound..."; + this.SoundMenuItem.Click += new System.EventHandler(this.SoundMenuItem_Click); + // + // PathsMenuItem + // + this.PathsMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.CopyFolderHS; + this.PathsMenuItem.Name = "PathsMenuItem"; + this.PathsMenuItem.Size = new System.Drawing.Size(179, 22); + this.PathsMenuItem.Text = "Paths..."; + this.PathsMenuItem.Click += new System.EventHandler(this.PathsMenuItem_Click); + // + // FirmwaresMenuItem + // + this.FirmwaresMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("FirmwaresMenuItem.Image"))); + this.FirmwaresMenuItem.Name = "FirmwaresMenuItem"; + this.FirmwaresMenuItem.Size = new System.Drawing.Size(179, 22); + this.FirmwaresMenuItem.Text = "&Firmwares..."; + this.FirmwaresMenuItem.Click += new System.EventHandler(this.FirmwaresMenuItem_Click); + // + // MessagesMenuItem + // + this.MessagesMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.MessageConfig; + this.MessagesMenuItem.Name = "MessagesMenuItem"; + this.MessagesMenuItem.Size = new System.Drawing.Size(179, 22); + this.MessagesMenuItem.Text = "&Messages..."; + this.MessagesMenuItem.Click += new System.EventHandler(this.MessagesMenuItem_Click); + // + // AutofireMenuItem + // + this.AutofireMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Lightning; + this.AutofireMenuItem.Name = "AutofireMenuItem"; + this.AutofireMenuItem.Size = new System.Drawing.Size(179, 22); + this.AutofireMenuItem.Text = "&Autofire..."; + this.AutofireMenuItem.Click += new System.EventHandler(this.AutofireMenuItem_Click); + // + // RewindOptionsMenuItem + // + this.RewindOptionsMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Previous; + this.RewindOptionsMenuItem.Name = "RewindOptionsMenuItem"; + this.RewindOptionsMenuItem.Size = new System.Drawing.Size(179, 22); + this.RewindOptionsMenuItem.Text = "&Rewind && States..."; + this.RewindOptionsMenuItem.Click += new System.EventHandler(this.RewindOptionsMenuItem_Click); + // + // extensionsToolStripMenuItem + // + this.extensionsToolStripMenuItem.Name = "extensionsToolStripMenuItem"; + this.extensionsToolStripMenuItem.Size = new System.Drawing.Size(179, 22); + this.extensionsToolStripMenuItem.Text = "File Extensions..."; + this.extensionsToolStripMenuItem.Click += new System.EventHandler(this.FileExtensionsMenuItem_Click); + // + // ClientOptionsMenuItem + // + this.ClientOptionsMenuItem.Name = "ClientOptionsMenuItem"; + this.ClientOptionsMenuItem.Size = new System.Drawing.Size(179, 22); + this.ClientOptionsMenuItem.Text = "&Customize..."; + this.ClientOptionsMenuItem.Click += new System.EventHandler(this.CustomizeMenuItem_Click); + // + // ProfilesMenuItem + // + this.ProfilesMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.user_blue_small; + this.ProfilesMenuItem.Name = "ProfilesMenuItem"; + this.ProfilesMenuItem.Size = new System.Drawing.Size(179, 22); + this.ProfilesMenuItem.Text = "&Profiles..."; + this.ProfilesMenuItem.Click += new System.EventHandler(this.ProfilesMenuItem_Click); + // + // toolStripSeparator9 + // + this.toolStripSeparator9.Name = "toolStripSeparator9"; + this.toolStripSeparator9.Size = new System.Drawing.Size(176, 6); + // + // SpeedSkipSubMenu + // + this.SpeedSkipSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.ClockThrottleMenuItem, this.AudioThrottleMenuItem, this.VsyncThrottleMenuItem, @@ -1576,73 +1576,73 @@ this.Speed150MenuItem, this.Speed200MenuItem, this.Speed400MenuItem}); - this.SpeedSkipSubMenu.Name = "SpeedSkipSubMenu"; - this.SpeedSkipSubMenu.Size = new System.Drawing.Size(170, 22); - this.SpeedSkipSubMenu.Text = "Speed/Skip"; - this.SpeedSkipSubMenu.DropDownOpened += new System.EventHandler(this.FrameSkipMenuItem_DropDownOpened); - // - // ClockThrottleMenuItem - // - this.ClockThrottleMenuItem.Name = "ClockThrottleMenuItem"; - this.ClockThrottleMenuItem.Size = new System.Drawing.Size(181, 22); - this.ClockThrottleMenuItem.Text = "Clock Throttle"; - this.ClockThrottleMenuItem.Click += new System.EventHandler(this.ClockThrottleMenuItem_Click); - // - // AudioThrottleMenuItem - // - this.AudioThrottleMenuItem.Name = "AudioThrottleMenuItem"; - this.AudioThrottleMenuItem.Size = new System.Drawing.Size(181, 22); - this.AudioThrottleMenuItem.Text = "Audio Throttle"; - this.AudioThrottleMenuItem.Click += new System.EventHandler(this.AudioThrottleMenuItem_Click); - // - // VsyncThrottleMenuItem - // - this.VsyncThrottleMenuItem.Name = "VsyncThrottleMenuItem"; - this.VsyncThrottleMenuItem.Size = new System.Drawing.Size(181, 22); - this.VsyncThrottleMenuItem.Text = "VSync Throttle"; - this.VsyncThrottleMenuItem.Click += new System.EventHandler(this.VsyncThrottleMenuItem_Click); - // - // toolStripSeparator27 - // - this.toolStripSeparator27.Name = "toolStripSeparator27"; - this.toolStripSeparator27.Size = new System.Drawing.Size(178, 6); - // - // VsyncEnabledMenuItem - // - this.VsyncEnabledMenuItem.Name = "VsyncEnabledMenuItem"; - this.VsyncEnabledMenuItem.Size = new System.Drawing.Size(181, 22); - this.VsyncEnabledMenuItem.Text = "VSync Enabled"; - this.VsyncEnabledMenuItem.Click += new System.EventHandler(this.VsyncEnabledMenuItem_Click); - // - // toolStripMenuItem3 - // - this.toolStripMenuItem3.Name = "toolStripMenuItem3"; - this.toolStripMenuItem3.Size = new System.Drawing.Size(178, 6); - // - // miUnthrottled - // - this.miUnthrottled.Name = "miUnthrottled"; - this.miUnthrottled.Size = new System.Drawing.Size(181, 22); - this.miUnthrottled.Text = "Unthrottled"; - this.miUnthrottled.Click += new System.EventHandler(this.UnthrottledMenuItem_Click); - // - // MinimizeSkippingMenuItem - // - this.MinimizeSkippingMenuItem.Name = "MinimizeSkippingMenuItem"; - this.MinimizeSkippingMenuItem.Size = new System.Drawing.Size(181, 22); - this.MinimizeSkippingMenuItem.Text = "Auto-minimize skipping"; - this.MinimizeSkippingMenuItem.Click += new System.EventHandler(this.MinimizeSkippingMenuItem_Click); - // - // NeverSkipMenuItem - // - this.NeverSkipMenuItem.Name = "NeverSkipMenuItem"; - this.NeverSkipMenuItem.Size = new System.Drawing.Size(181, 22); - this.NeverSkipMenuItem.Text = "Skip 0 (never)"; - this.NeverSkipMenuItem.Click += new System.EventHandler(this.NeverSkipMenuItem_Click); - // - // toolStripMenuItem17 - // - this.toolStripMenuItem17.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.SpeedSkipSubMenu.Name = "SpeedSkipSubMenu"; + this.SpeedSkipSubMenu.Size = new System.Drawing.Size(179, 22); + this.SpeedSkipSubMenu.Text = "Speed/Skip"; + this.SpeedSkipSubMenu.DropDownOpened += new System.EventHandler(this.FrameSkipMenuItem_DropDownOpened); + // + // ClockThrottleMenuItem + // + this.ClockThrottleMenuItem.Name = "ClockThrottleMenuItem"; + this.ClockThrottleMenuItem.Size = new System.Drawing.Size(202, 22); + this.ClockThrottleMenuItem.Text = "Clock Throttle"; + this.ClockThrottleMenuItem.Click += new System.EventHandler(this.ClockThrottleMenuItem_Click); + // + // AudioThrottleMenuItem + // + this.AudioThrottleMenuItem.Name = "AudioThrottleMenuItem"; + this.AudioThrottleMenuItem.Size = new System.Drawing.Size(202, 22); + this.AudioThrottleMenuItem.Text = "Audio Throttle"; + this.AudioThrottleMenuItem.Click += new System.EventHandler(this.AudioThrottleMenuItem_Click); + // + // VsyncThrottleMenuItem + // + this.VsyncThrottleMenuItem.Name = "VsyncThrottleMenuItem"; + this.VsyncThrottleMenuItem.Size = new System.Drawing.Size(202, 22); + this.VsyncThrottleMenuItem.Text = "VSync Throttle"; + this.VsyncThrottleMenuItem.Click += new System.EventHandler(this.VsyncThrottleMenuItem_Click); + // + // toolStripSeparator27 + // + this.toolStripSeparator27.Name = "toolStripSeparator27"; + this.toolStripSeparator27.Size = new System.Drawing.Size(199, 6); + // + // VsyncEnabledMenuItem + // + this.VsyncEnabledMenuItem.Name = "VsyncEnabledMenuItem"; + this.VsyncEnabledMenuItem.Size = new System.Drawing.Size(202, 22); + this.VsyncEnabledMenuItem.Text = "VSync Enabled"; + this.VsyncEnabledMenuItem.Click += new System.EventHandler(this.VsyncEnabledMenuItem_Click); + // + // toolStripMenuItem3 + // + this.toolStripMenuItem3.Name = "toolStripMenuItem3"; + this.toolStripMenuItem3.Size = new System.Drawing.Size(199, 6); + // + // miUnthrottled + // + this.miUnthrottled.Name = "miUnthrottled"; + this.miUnthrottled.Size = new System.Drawing.Size(202, 22); + this.miUnthrottled.Text = "Unthrottled"; + this.miUnthrottled.Click += new System.EventHandler(this.UnthrottledMenuItem_Click); + // + // MinimizeSkippingMenuItem + // + this.MinimizeSkippingMenuItem.Name = "MinimizeSkippingMenuItem"; + this.MinimizeSkippingMenuItem.Size = new System.Drawing.Size(202, 22); + this.MinimizeSkippingMenuItem.Text = "Auto-minimize skipping"; + this.MinimizeSkippingMenuItem.Click += new System.EventHandler(this.MinimizeSkippingMenuItem_Click); + // + // NeverSkipMenuItem + // + this.NeverSkipMenuItem.Name = "NeverSkipMenuItem"; + this.NeverSkipMenuItem.Size = new System.Drawing.Size(202, 22); + this.NeverSkipMenuItem.Text = "Skip 0 (never)"; + this.NeverSkipMenuItem.Click += new System.EventHandler(this.NeverSkipMenuItem_Click); + // + // toolStripMenuItem17 + // + this.toolStripMenuItem17.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.Frameskip1MenuItem, this.Frameskip2MenuItem, this.Frameskip3MenuItem, @@ -1652,155 +1652,155 @@ this.Frameskip7MenuItem, this.Frameskip8MenuItem, this.Frameskip9MenuItem}); - this.toolStripMenuItem17.Name = "toolStripMenuItem17"; - this.toolStripMenuItem17.Size = new System.Drawing.Size(181, 22); - this.toolStripMenuItem17.Text = "Skip 1..9"; - // - // Frameskip1MenuItem - // - this.Frameskip1MenuItem.Name = "Frameskip1MenuItem"; - this.Frameskip1MenuItem.Size = new System.Drawing.Size(80, 22); - this.Frameskip1MenuItem.Text = "1"; - this.Frameskip1MenuItem.Click += new System.EventHandler(this.Frameskip1MenuItem_Click); - // - // Frameskip2MenuItem - // - this.Frameskip2MenuItem.Name = "Frameskip2MenuItem"; - this.Frameskip2MenuItem.Size = new System.Drawing.Size(80, 22); - this.Frameskip2MenuItem.Text = "2"; - this.Frameskip2MenuItem.Click += new System.EventHandler(this.Frameskip2MenuItem_Click); - // - // Frameskip3MenuItem - // - this.Frameskip3MenuItem.Name = "Frameskip3MenuItem"; - this.Frameskip3MenuItem.Size = new System.Drawing.Size(80, 22); - this.Frameskip3MenuItem.Text = "3"; - this.Frameskip3MenuItem.Click += new System.EventHandler(this.Frameskip3MenuItem_Click); - // - // Frameskip4MenuItem - // - this.Frameskip4MenuItem.Name = "Frameskip4MenuItem"; - this.Frameskip4MenuItem.Size = new System.Drawing.Size(80, 22); - this.Frameskip4MenuItem.Text = "4"; - this.Frameskip4MenuItem.Click += new System.EventHandler(this.Frameskip4MenuItem_Click); - // - // Frameskip5MenuItem - // - this.Frameskip5MenuItem.Name = "Frameskip5MenuItem"; - this.Frameskip5MenuItem.Size = new System.Drawing.Size(80, 22); - this.Frameskip5MenuItem.Text = "5"; - this.Frameskip5MenuItem.Click += new System.EventHandler(this.Frameskip5MenuItem_Click); - // - // Frameskip6MenuItem - // - this.Frameskip6MenuItem.Name = "Frameskip6MenuItem"; - this.Frameskip6MenuItem.Size = new System.Drawing.Size(80, 22); - this.Frameskip6MenuItem.Text = "6"; - this.Frameskip6MenuItem.Click += new System.EventHandler(this.Frameskip6MenuItem_Click); - // - // Frameskip7MenuItem - // - this.Frameskip7MenuItem.Name = "Frameskip7MenuItem"; - this.Frameskip7MenuItem.Size = new System.Drawing.Size(80, 22); - this.Frameskip7MenuItem.Text = "7"; - this.Frameskip7MenuItem.Click += new System.EventHandler(this.Frameskip7MenuItem_Click); - // - // Frameskip8MenuItem - // - this.Frameskip8MenuItem.Name = "Frameskip8MenuItem"; - this.Frameskip8MenuItem.Size = new System.Drawing.Size(80, 22); - this.Frameskip8MenuItem.Text = "8"; - this.Frameskip8MenuItem.Click += new System.EventHandler(this.Frameskip8MenuItem_Click); - // - // Frameskip9MenuItem - // - this.Frameskip9MenuItem.Name = "Frameskip9MenuItem"; - this.Frameskip9MenuItem.Size = new System.Drawing.Size(80, 22); - this.Frameskip9MenuItem.Text = "9"; - this.Frameskip9MenuItem.Click += new System.EventHandler(this.Frameskip9MenuItem_Click); - // - // toolStripMenuItem5 - // - this.toolStripMenuItem5.Name = "toolStripMenuItem5"; - this.toolStripMenuItem5.Size = new System.Drawing.Size(178, 6); - // - // Speed50MenuItem - // - this.Speed50MenuItem.Name = "Speed50MenuItem"; - this.Speed50MenuItem.Size = new System.Drawing.Size(181, 22); - this.Speed50MenuItem.Text = "Speed 50%"; - this.Speed50MenuItem.Click += new System.EventHandler(this.Speed50MenuItem_Click); - // - // Speed75MenuItem - // - this.Speed75MenuItem.Name = "Speed75MenuItem"; - this.Speed75MenuItem.Size = new System.Drawing.Size(181, 22); - this.Speed75MenuItem.Text = "Speed 75%"; - this.Speed75MenuItem.Click += new System.EventHandler(this.Speed75MenuItem_Click); - // - // Speed100MenuItem - // - this.Speed100MenuItem.Name = "Speed100MenuItem"; - this.Speed100MenuItem.Size = new System.Drawing.Size(181, 22); - this.Speed100MenuItem.Text = "Speed 100%"; - this.Speed100MenuItem.Click += new System.EventHandler(this.Speed100MenuItem_Click); - // - // Speed150MenuItem - // - this.Speed150MenuItem.Name = "Speed150MenuItem"; - this.Speed150MenuItem.Size = new System.Drawing.Size(181, 22); - this.Speed150MenuItem.Text = "Speed 150%"; - this.Speed150MenuItem.Click += new System.EventHandler(this.Speed150MenuItem_Click); - // - // Speed200MenuItem - // - this.Speed200MenuItem.Name = "Speed200MenuItem"; - this.Speed200MenuItem.Size = new System.Drawing.Size(181, 22); - this.Speed200MenuItem.Text = "Speed 200%"; - this.Speed200MenuItem.Click += new System.EventHandler(this.Speed200MenuItem_Click); - // - // Speed400MenuItem - // - this.Speed400MenuItem.Name = "Speed400MenuItem"; - this.Speed400MenuItem.Size = new System.Drawing.Size(181, 22); - this.Speed400MenuItem.Text = "Speed 400%"; - this.Speed400MenuItem.Click += new System.EventHandler(this.Speed400MenuItem_Click); - // - // KeyPrioritySubMenu - // - this.KeyPrioritySubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.toolStripMenuItem17.Name = "toolStripMenuItem17"; + this.toolStripMenuItem17.Size = new System.Drawing.Size(202, 22); + this.toolStripMenuItem17.Text = "Skip 1..9"; + // + // Frameskip1MenuItem + // + this.Frameskip1MenuItem.Name = "Frameskip1MenuItem"; + this.Frameskip1MenuItem.Size = new System.Drawing.Size(80, 22); + this.Frameskip1MenuItem.Text = "1"; + this.Frameskip1MenuItem.Click += new System.EventHandler(this.Frameskip1MenuItem_Click); + // + // Frameskip2MenuItem + // + this.Frameskip2MenuItem.Name = "Frameskip2MenuItem"; + this.Frameskip2MenuItem.Size = new System.Drawing.Size(80, 22); + this.Frameskip2MenuItem.Text = "2"; + this.Frameskip2MenuItem.Click += new System.EventHandler(this.Frameskip2MenuItem_Click); + // + // Frameskip3MenuItem + // + this.Frameskip3MenuItem.Name = "Frameskip3MenuItem"; + this.Frameskip3MenuItem.Size = new System.Drawing.Size(80, 22); + this.Frameskip3MenuItem.Text = "3"; + this.Frameskip3MenuItem.Click += new System.EventHandler(this.Frameskip3MenuItem_Click); + // + // Frameskip4MenuItem + // + this.Frameskip4MenuItem.Name = "Frameskip4MenuItem"; + this.Frameskip4MenuItem.Size = new System.Drawing.Size(80, 22); + this.Frameskip4MenuItem.Text = "4"; + this.Frameskip4MenuItem.Click += new System.EventHandler(this.Frameskip4MenuItem_Click); + // + // Frameskip5MenuItem + // + this.Frameskip5MenuItem.Name = "Frameskip5MenuItem"; + this.Frameskip5MenuItem.Size = new System.Drawing.Size(80, 22); + this.Frameskip5MenuItem.Text = "5"; + this.Frameskip5MenuItem.Click += new System.EventHandler(this.Frameskip5MenuItem_Click); + // + // Frameskip6MenuItem + // + this.Frameskip6MenuItem.Name = "Frameskip6MenuItem"; + this.Frameskip6MenuItem.Size = new System.Drawing.Size(80, 22); + this.Frameskip6MenuItem.Text = "6"; + this.Frameskip6MenuItem.Click += new System.EventHandler(this.Frameskip6MenuItem_Click); + // + // Frameskip7MenuItem + // + this.Frameskip7MenuItem.Name = "Frameskip7MenuItem"; + this.Frameskip7MenuItem.Size = new System.Drawing.Size(80, 22); + this.Frameskip7MenuItem.Text = "7"; + this.Frameskip7MenuItem.Click += new System.EventHandler(this.Frameskip7MenuItem_Click); + // + // Frameskip8MenuItem + // + this.Frameskip8MenuItem.Name = "Frameskip8MenuItem"; + this.Frameskip8MenuItem.Size = new System.Drawing.Size(80, 22); + this.Frameskip8MenuItem.Text = "8"; + this.Frameskip8MenuItem.Click += new System.EventHandler(this.Frameskip8MenuItem_Click); + // + // Frameskip9MenuItem + // + this.Frameskip9MenuItem.Name = "Frameskip9MenuItem"; + this.Frameskip9MenuItem.Size = new System.Drawing.Size(80, 22); + this.Frameskip9MenuItem.Text = "9"; + this.Frameskip9MenuItem.Click += new System.EventHandler(this.Frameskip9MenuItem_Click); + // + // toolStripMenuItem5 + // + this.toolStripMenuItem5.Name = "toolStripMenuItem5"; + this.toolStripMenuItem5.Size = new System.Drawing.Size(199, 6); + // + // Speed50MenuItem + // + this.Speed50MenuItem.Name = "Speed50MenuItem"; + this.Speed50MenuItem.Size = new System.Drawing.Size(202, 22); + this.Speed50MenuItem.Text = "Speed 50%"; + this.Speed50MenuItem.Click += new System.EventHandler(this.Speed50MenuItem_Click); + // + // Speed75MenuItem + // + this.Speed75MenuItem.Name = "Speed75MenuItem"; + this.Speed75MenuItem.Size = new System.Drawing.Size(202, 22); + this.Speed75MenuItem.Text = "Speed 75%"; + this.Speed75MenuItem.Click += new System.EventHandler(this.Speed75MenuItem_Click); + // + // Speed100MenuItem + // + this.Speed100MenuItem.Name = "Speed100MenuItem"; + this.Speed100MenuItem.Size = new System.Drawing.Size(202, 22); + this.Speed100MenuItem.Text = "Speed 100%"; + this.Speed100MenuItem.Click += new System.EventHandler(this.Speed100MenuItem_Click); + // + // Speed150MenuItem + // + this.Speed150MenuItem.Name = "Speed150MenuItem"; + this.Speed150MenuItem.Size = new System.Drawing.Size(202, 22); + this.Speed150MenuItem.Text = "Speed 150%"; + this.Speed150MenuItem.Click += new System.EventHandler(this.Speed150MenuItem_Click); + // + // Speed200MenuItem + // + this.Speed200MenuItem.Name = "Speed200MenuItem"; + this.Speed200MenuItem.Size = new System.Drawing.Size(202, 22); + this.Speed200MenuItem.Text = "Speed 200%"; + this.Speed200MenuItem.Click += new System.EventHandler(this.Speed200MenuItem_Click); + // + // Speed400MenuItem + // + this.Speed400MenuItem.Name = "Speed400MenuItem"; + this.Speed400MenuItem.Size = new System.Drawing.Size(202, 22); + this.Speed400MenuItem.Text = "Speed 400%"; + this.Speed400MenuItem.Click += new System.EventHandler(this.Speed400MenuItem_Click); + // + // KeyPrioritySubMenu + // + this.KeyPrioritySubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.BothHkAndControllerMenuItem, this.InputOverHkMenuItem, this.HkOverInputMenuItem}); - this.KeyPrioritySubMenu.Name = "KeyPrioritySubMenu"; - this.KeyPrioritySubMenu.Size = new System.Drawing.Size(170, 22); - this.KeyPrioritySubMenu.Text = "Key Priority"; - this.KeyPrioritySubMenu.DropDownOpened += new System.EventHandler(this.KeyPriorityMenuItem_DropDownOpened); - // - // BothHkAndControllerMenuItem - // - this.BothHkAndControllerMenuItem.Name = "BothHkAndControllerMenuItem"; - this.BothHkAndControllerMenuItem.Size = new System.Drawing.Size(214, 22); - this.BothHkAndControllerMenuItem.Text = "Both Hotkeys and Controllers"; - this.BothHkAndControllerMenuItem.Click += new System.EventHandler(this.BothHkAndControllerMenuItem_Click); - // - // InputOverHkMenuItem - // - this.InputOverHkMenuItem.Name = "InputOverHkMenuItem"; - this.InputOverHkMenuItem.Size = new System.Drawing.Size(214, 22); - this.InputOverHkMenuItem.Text = "Input overrides Hotkeys"; - this.InputOverHkMenuItem.Click += new System.EventHandler(this.InputOverHkMenuItem_Click); - // - // HkOverInputMenuItem - // - this.HkOverInputMenuItem.Name = "HkOverInputMenuItem"; - this.HkOverInputMenuItem.Size = new System.Drawing.Size(214, 22); - this.HkOverInputMenuItem.Text = "Hotkeys override Input"; - this.HkOverInputMenuItem.Click += new System.EventHandler(this.HkOverInputMenuItem_Click); - // - // CoresSubMenu - // - this.CoresSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.KeyPrioritySubMenu.Name = "KeyPrioritySubMenu"; + this.KeyPrioritySubMenu.Size = new System.Drawing.Size(179, 22); + this.KeyPrioritySubMenu.Text = "Key Priority"; + this.KeyPrioritySubMenu.DropDownOpened += new System.EventHandler(this.KeyPriorityMenuItem_DropDownOpened); + // + // BothHkAndControllerMenuItem + // + this.BothHkAndControllerMenuItem.Name = "BothHkAndControllerMenuItem"; + this.BothHkAndControllerMenuItem.Size = new System.Drawing.Size(229, 22); + this.BothHkAndControllerMenuItem.Text = "Both Hotkeys and Controllers"; + this.BothHkAndControllerMenuItem.Click += new System.EventHandler(this.BothHkAndControllerMenuItem_Click); + // + // InputOverHkMenuItem + // + this.InputOverHkMenuItem.Name = "InputOverHkMenuItem"; + this.InputOverHkMenuItem.Size = new System.Drawing.Size(229, 22); + this.InputOverHkMenuItem.Text = "Input overrides Hotkeys"; + this.InputOverHkMenuItem.Click += new System.EventHandler(this.InputOverHkMenuItem_Click); + // + // HkOverInputMenuItem + // + this.HkOverInputMenuItem.Name = "HkOverInputMenuItem"; + this.HkOverInputMenuItem.Size = new System.Drawing.Size(229, 22); + this.HkOverInputMenuItem.Text = "Hotkeys override Input"; + this.HkOverInputMenuItem.Click += new System.EventHandler(this.HkOverInputMenuItem_Click); + // + // CoresSubMenu + // + this.CoresSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.NesCoreSubMenu, this.CoreSNESSubMenu, this.GbaCoreSubMenu, @@ -1812,208 +1812,208 @@ this.toolStripSeparator8, this.N64VideoPluginSettingsMenuItem, this.setLibretroCoreToolStripMenuItem}); - this.CoresSubMenu.Name = "CoresSubMenu"; - this.CoresSubMenu.Size = new System.Drawing.Size(170, 22); - this.CoresSubMenu.Text = "Cores"; - this.CoresSubMenu.DropDownOpened += new System.EventHandler(this.CoresSubMenu_DropDownOpened); - // - // NesCoreSubMenu - // - this.NesCoreSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.CoresSubMenu.Name = "CoresSubMenu"; + this.CoresSubMenu.Size = new System.Drawing.Size(179, 22); + this.CoresSubMenu.Text = "Cores"; + this.CoresSubMenu.DropDownOpened += new System.EventHandler(this.CoresSubMenu_DropDownOpened); + // + // NesCoreSubMenu + // + this.NesCoreSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.QuicknesCoreMenuItem, this.NesCoreMenuItem}); - this.NesCoreSubMenu.Name = "NesCoreSubMenu"; - this.NesCoreSubMenu.Size = new System.Drawing.Size(223, 22); - this.NesCoreSubMenu.Text = "NES"; - this.NesCoreSubMenu.DropDownOpened += new System.EventHandler(this.NesCoreSubMenu_DropDownOpened); - // - // QuicknesCoreMenuItem - // - this.QuicknesCoreMenuItem.Name = "QuicknesCoreMenuItem"; - this.QuicknesCoreMenuItem.Size = new System.Drawing.Size(119, 22); - this.QuicknesCoreMenuItem.Text = "QuickNES"; - this.QuicknesCoreMenuItem.Click += new System.EventHandler(this.NesCorePick_Click); - // - // NesCoreMenuItem - // - this.NesCoreMenuItem.Name = "NesCoreMenuItem"; - this.NesCoreMenuItem.Size = new System.Drawing.Size(119, 22); - this.NesCoreMenuItem.Text = "NesHawk"; - this.NesCoreMenuItem.Click += new System.EventHandler(this.NesCorePick_Click); - // - // CoreSNESSubMenu - // - this.CoreSNESSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.NesCoreSubMenu.Name = "NesCoreSubMenu"; + this.NesCoreSubMenu.Size = new System.Drawing.Size(239, 22); + this.NesCoreSubMenu.Text = "NES"; + this.NesCoreSubMenu.DropDownOpened += new System.EventHandler(this.NesCoreSubMenu_DropDownOpened); + // + // QuicknesCoreMenuItem + // + this.QuicknesCoreMenuItem.Name = "QuicknesCoreMenuItem"; + this.QuicknesCoreMenuItem.Size = new System.Drawing.Size(126, 22); + this.QuicknesCoreMenuItem.Text = "QuickNES"; + this.QuicknesCoreMenuItem.Click += new System.EventHandler(this.NesCorePick_Click); + // + // NesCoreMenuItem + // + this.NesCoreMenuItem.Name = "NesCoreMenuItem"; + this.NesCoreMenuItem.Size = new System.Drawing.Size(126, 22); + this.NesCoreMenuItem.Text = "NesHawk"; + this.NesCoreMenuItem.Click += new System.EventHandler(this.NesCorePick_Click); + // + // CoreSNESSubMenu + // + this.CoreSNESSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.Coresnes9xMenuItem, this.CorebsnesMenuItem}); - this.CoreSNESSubMenu.Name = "CoreSNESSubMenu"; - this.CoreSNESSubMenu.Size = new System.Drawing.Size(223, 22); - this.CoreSNESSubMenu.Text = "SNES"; - this.CoreSNESSubMenu.DropDownOpened += new System.EventHandler(this.CoreSNESSubMenu_DropDownOpened); - // - // Coresnes9xMenuItem - // - this.Coresnes9xMenuItem.Name = "Coresnes9xMenuItem"; - this.Coresnes9xMenuItem.Size = new System.Drawing.Size(109, 22); - this.Coresnes9xMenuItem.Text = "Snes9x"; - this.Coresnes9xMenuItem.Click += new System.EventHandler(this.CoreSnesToggle_Click); - // - // CorebsnesMenuItem - // - this.CorebsnesMenuItem.Name = "CorebsnesMenuItem"; - this.CorebsnesMenuItem.Size = new System.Drawing.Size(109, 22); - this.CorebsnesMenuItem.Text = "BSNES"; - this.CorebsnesMenuItem.Click += new System.EventHandler(this.CoreSnesToggle_Click); - // - // GbaCoreSubMenu - // - this.GbaCoreSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.CoreSNESSubMenu.Name = "CoreSNESSubMenu"; + this.CoreSNESSubMenu.Size = new System.Drawing.Size(239, 22); + this.CoreSNESSubMenu.Text = "SNES"; + this.CoreSNESSubMenu.DropDownOpened += new System.EventHandler(this.CoreSNESSubMenu_DropDownOpened); + // + // Coresnes9xMenuItem + // + this.Coresnes9xMenuItem.Name = "Coresnes9xMenuItem"; + this.Coresnes9xMenuItem.Size = new System.Drawing.Size(109, 22); + this.Coresnes9xMenuItem.Text = "Snes9x"; + this.Coresnes9xMenuItem.Click += new System.EventHandler(this.CoreSnesToggle_Click); + // + // CorebsnesMenuItem + // + this.CorebsnesMenuItem.Name = "CorebsnesMenuItem"; + this.CorebsnesMenuItem.Size = new System.Drawing.Size(109, 22); + this.CorebsnesMenuItem.Text = "BSNES"; + this.CorebsnesMenuItem.Click += new System.EventHandler(this.CoreSnesToggle_Click); + // + // GbaCoreSubMenu + // + this.GbaCoreSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.VbaNextCoreMenuItem, this.MgbaCoreMenuItem}); - this.GbaCoreSubMenu.Name = "GbaCoreSubMenu"; - this.GbaCoreSubMenu.Size = new System.Drawing.Size(223, 22); - this.GbaCoreSubMenu.Text = "GBA"; - this.GbaCoreSubMenu.DropDownOpened += new System.EventHandler(this.GbaCoreSubMenu_DropDownOpened); - // - // VbaNextCoreMenuItem - // - this.VbaNextCoreMenuItem.Name = "VbaNextCoreMenuItem"; - this.VbaNextCoreMenuItem.Size = new System.Drawing.Size(120, 22); - this.VbaNextCoreMenuItem.Text = "VBA-Next"; - this.VbaNextCoreMenuItem.Click += new System.EventHandler(this.GbaCorePick_Click); - // - // MgbaCoreMenuItem - // - this.MgbaCoreMenuItem.Name = "MgbaCoreMenuItem"; - this.MgbaCoreMenuItem.Size = new System.Drawing.Size(120, 22); - this.MgbaCoreMenuItem.Text = "mGBA"; - this.MgbaCoreMenuItem.Click += new System.EventHandler(this.GbaCorePick_Click); - // - // Atari7800CoreSubMenu - // - this.Atari7800CoreSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.GbaCoreSubMenu.Name = "GbaCoreSubMenu"; + this.GbaCoreSubMenu.Size = new System.Drawing.Size(239, 22); + this.GbaCoreSubMenu.Text = "GBA"; + this.GbaCoreSubMenu.DropDownOpened += new System.EventHandler(this.GbaCoreSubMenu_DropDownOpened); + // + // VbaNextCoreMenuItem + // + this.VbaNextCoreMenuItem.Name = "VbaNextCoreMenuItem"; + this.VbaNextCoreMenuItem.Size = new System.Drawing.Size(125, 22); + this.VbaNextCoreMenuItem.Text = "VBA-Next"; + this.VbaNextCoreMenuItem.Click += new System.EventHandler(this.GbaCorePick_Click); + // + // MgbaCoreMenuItem + // + this.MgbaCoreMenuItem.Name = "MgbaCoreMenuItem"; + this.MgbaCoreMenuItem.Size = new System.Drawing.Size(125, 22); + this.MgbaCoreMenuItem.Text = "mGBA"; + this.MgbaCoreMenuItem.Click += new System.EventHandler(this.GbaCorePick_Click); + // + // Atari7800CoreSubMenu + // + this.Atari7800CoreSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.Emu7800CoreMenuItem, this.Atari7800HawkCoreMenuItem}); - this.Atari7800CoreSubMenu.Name = "Atari7800CoreSubMenu"; - this.Atari7800CoreSubMenu.Size = new System.Drawing.Size(223, 22); - this.Atari7800CoreSubMenu.Text = "Atari 7800"; - this.Atari7800CoreSubMenu.DropDownOpened += new System.EventHandler(this.Atari7800CoreSubMenu_DropDownOpened); - // - // Emu7800CoreMenuItem - // - this.Emu7800CoreMenuItem.Name = "Emu7800CoreMenuItem"; - this.Emu7800CoreMenuItem.Size = new System.Drawing.Size(147, 22); - this.Emu7800CoreMenuItem.Text = "EMU7800"; - this.Emu7800CoreMenuItem.Click += new System.EventHandler(this.Atari7800CorePick_Click); - // - // Atari7800HawkCoreMenuItem - // - this.Atari7800HawkCoreMenuItem.Name = "Atari7800HawkCoreMenuItem"; - this.Atari7800HawkCoreMenuItem.Size = new System.Drawing.Size(147, 22); - this.Atari7800HawkCoreMenuItem.Text = "Atari7800Hawk"; - this.Atari7800HawkCoreMenuItem.Click += new System.EventHandler(this.Atari7800CorePick_Click); - // - // SGBCoreSubmenu - // - this.SGBCoreSubmenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.Atari7800CoreSubMenu.Name = "Atari7800CoreSubMenu"; + this.Atari7800CoreSubMenu.Size = new System.Drawing.Size(239, 22); + this.Atari7800CoreSubMenu.Text = "Atari 7800"; + this.Atari7800CoreSubMenu.DropDownOpened += new System.EventHandler(this.Atari7800CoreSubMenu_DropDownOpened); + // + // Emu7800CoreMenuItem + // + this.Emu7800CoreMenuItem.Name = "Emu7800CoreMenuItem"; + this.Emu7800CoreMenuItem.Size = new System.Drawing.Size(153, 22); + this.Emu7800CoreMenuItem.Text = "EMU7800"; + this.Emu7800CoreMenuItem.Click += new System.EventHandler(this.Atari7800CorePick_Click); + // + // Atari7800HawkCoreMenuItem + // + this.Atari7800HawkCoreMenuItem.Name = "Atari7800HawkCoreMenuItem"; + this.Atari7800HawkCoreMenuItem.Size = new System.Drawing.Size(153, 22); + this.Atari7800HawkCoreMenuItem.Text = "Atari7800Hawk"; + this.Atari7800HawkCoreMenuItem.Click += new System.EventHandler(this.Atari7800CorePick_Click); + // + // SGBCoreSubmenu + // + this.SGBCoreSubmenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.SgbBsnesMenuItem, - this.SgbPizzaBoyMenuItem}); - this.SGBCoreSubmenu.Name = "SGBCoreSubmenu"; - this.SGBCoreSubmenu.Size = new System.Drawing.Size(223, 22); - this.SGBCoreSubmenu.Text = "SGB"; - this.SGBCoreSubmenu.DropDownOpened += new System.EventHandler(this.SGBCoreSubmenu_DropDownOpened); - // - // SgbBsnesMenuItem - // - this.SgbBsnesMenuItem.Name = "SgbBsnesMenuItem"; - this.SgbBsnesMenuItem.Size = new System.Drawing.Size(119, 22); - this.SgbBsnesMenuItem.Text = "BSNES"; - this.SgbBsnesMenuItem.Click += new System.EventHandler(this.SgbCorePick_Click); - // - // SgbPizzaBoyMenuItem - // - this.SgbPizzaBoyMenuItem.Name = "SgbPizzaBoyMenuItem"; - this.SgbPizzaBoyMenuItem.Size = new System.Drawing.Size(119, 22); - this.SgbPizzaBoyMenuItem.Text = "Pizza Boy"; - this.SgbPizzaBoyMenuItem.Click += new System.EventHandler(this.SgbCorePick_Click); - // - // GBInSGBMenuItem - // - this.GBInSGBMenuItem.Name = "GBInSGBMenuItem"; - this.GBInSGBMenuItem.Size = new System.Drawing.Size(223, 22); - this.GBInSGBMenuItem.Text = "GB in SGB"; - this.GBInSGBMenuItem.Click += new System.EventHandler(this.GbInSgbMenuItem_Click); - // - // toolStripMenuItem16 - // - this.toolStripMenuItem16.Name = "toolStripMenuItem16"; - this.toolStripMenuItem16.Size = new System.Drawing.Size(220, 6); - // - // allowGameDBCoreOverridesToolStripMenuItem - // - this.allowGameDBCoreOverridesToolStripMenuItem.Name = "allowGameDBCoreOverridesToolStripMenuItem"; - this.allowGameDBCoreOverridesToolStripMenuItem.Size = new System.Drawing.Size(223, 22); - this.allowGameDBCoreOverridesToolStripMenuItem.Text = "Follow GameDB Core Overrides"; - this.allowGameDBCoreOverridesToolStripMenuItem.Click += new System.EventHandler(this.AllowGameDBCoreOverridesToolStripMenuItem_Click); - // - // toolStripSeparator8 - // - this.toolStripSeparator8.Name = "toolStripSeparator8"; - this.toolStripSeparator8.Size = new System.Drawing.Size(220, 6); - // - // N64VideoPluginSettingsMenuItem - // - this.N64VideoPluginSettingsMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.monitor; - this.N64VideoPluginSettingsMenuItem.Name = "N64VideoPluginSettingsMenuItem"; - this.N64VideoPluginSettingsMenuItem.Size = new System.Drawing.Size(223, 22); - this.N64VideoPluginSettingsMenuItem.Text = "N64 Video Plugin Settings"; - this.N64VideoPluginSettingsMenuItem.Click += new System.EventHandler(this.N64VideoPluginSettingsMenuItem_Click); - // - // setLibretroCoreToolStripMenuItem - // - this.setLibretroCoreToolStripMenuItem.Name = "setLibretroCoreToolStripMenuItem"; - this.setLibretroCoreToolStripMenuItem.Size = new System.Drawing.Size(223, 22); - this.setLibretroCoreToolStripMenuItem.Text = "Set Libretro Core"; - this.setLibretroCoreToolStripMenuItem.Click += new System.EventHandler(this.SetLibretroCoreMenuItem_Click); - // - // toolStripSeparator10 - // - this.toolStripSeparator10.Name = "toolStripSeparator10"; - this.toolStripSeparator10.Size = new System.Drawing.Size(167, 6); - // - // SaveConfigMenuItem - // - this.SaveConfigMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Save; - this.SaveConfigMenuItem.Name = "SaveConfigMenuItem"; - this.SaveConfigMenuItem.Size = new System.Drawing.Size(170, 22); - this.SaveConfigMenuItem.Text = "Save Config"; - this.SaveConfigMenuItem.Click += new System.EventHandler(this.SaveConfigMenuItem_Click); - // - // SaveConfigAsMenuItem - // - this.SaveConfigAsMenuItem.Name = "SaveConfigAsMenuItem"; - this.SaveConfigAsMenuItem.Size = new System.Drawing.Size(170, 22); - this.SaveConfigAsMenuItem.Text = "Save Config As..."; - this.SaveConfigAsMenuItem.Click += new System.EventHandler(this.SaveConfigAsMenuItem_Click); - // - // LoadConfigMenuItem - // - this.LoadConfigMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.LoadConfig; - this.LoadConfigMenuItem.Name = "LoadConfigMenuItem"; - this.LoadConfigMenuItem.Size = new System.Drawing.Size(170, 22); - this.LoadConfigMenuItem.Text = "Load Config"; - this.LoadConfigMenuItem.Click += new System.EventHandler(this.LoadConfigMenuItem_Click); - // - // LoadConfigFromMenuItem - // - this.LoadConfigFromMenuItem.Name = "LoadConfigFromMenuItem"; - this.LoadConfigFromMenuItem.Size = new System.Drawing.Size(170, 22); - this.LoadConfigFromMenuItem.Text = "Load Config From..."; - this.LoadConfigFromMenuItem.Click += new System.EventHandler(this.LoadConfigFromMenuItem_Click); - // - // ToolsSubMenu - // - this.ToolsSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.SgbSameBoyMenuItem}); + this.SGBCoreSubmenu.Name = "SGBCoreSubmenu"; + this.SGBCoreSubmenu.Size = new System.Drawing.Size(239, 22); + this.SGBCoreSubmenu.Text = "SGB"; + this.SGBCoreSubmenu.DropDownOpened += new System.EventHandler(this.SGBCoreSubmenu_DropDownOpened); + // + // SgbBsnesMenuItem + // + this.SgbBsnesMenuItem.Name = "SgbBsnesMenuItem"; + this.SgbBsnesMenuItem.Size = new System.Drawing.Size(152, 22); + this.SgbBsnesMenuItem.Text = "BSNES"; + this.SgbBsnesMenuItem.Click += new System.EventHandler(this.SgbCorePick_Click); + // + // SgbSameBoyMenuItem + // + this.SgbSameBoyMenuItem.Name = "SgbSameBoyMenuItem"; + this.SgbSameBoyMenuItem.Size = new System.Drawing.Size(152, 22); + this.SgbSameBoyMenuItem.Text = "SameBoy"; + this.SgbSameBoyMenuItem.Click += new System.EventHandler(this.SgbCorePick_Click); + // + // GBInSGBMenuItem + // + this.GBInSGBMenuItem.Name = "GBInSGBMenuItem"; + this.GBInSGBMenuItem.Size = new System.Drawing.Size(239, 22); + this.GBInSGBMenuItem.Text = "GB in SGB"; + this.GBInSGBMenuItem.Click += new System.EventHandler(this.GbInSgbMenuItem_Click); + // + // toolStripMenuItem16 + // + this.toolStripMenuItem16.Name = "toolStripMenuItem16"; + this.toolStripMenuItem16.Size = new System.Drawing.Size(236, 6); + // + // allowGameDBCoreOverridesToolStripMenuItem + // + this.allowGameDBCoreOverridesToolStripMenuItem.Name = "allowGameDBCoreOverridesToolStripMenuItem"; + this.allowGameDBCoreOverridesToolStripMenuItem.Size = new System.Drawing.Size(239, 22); + this.allowGameDBCoreOverridesToolStripMenuItem.Text = "Follow GameDB Core Overrides"; + this.allowGameDBCoreOverridesToolStripMenuItem.Click += new System.EventHandler(this.AllowGameDBCoreOverridesToolStripMenuItem_Click); + // + // toolStripSeparator8 + // + this.toolStripSeparator8.Name = "toolStripSeparator8"; + this.toolStripSeparator8.Size = new System.Drawing.Size(236, 6); + // + // N64VideoPluginSettingsMenuItem + // + this.N64VideoPluginSettingsMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.monitor; + this.N64VideoPluginSettingsMenuItem.Name = "N64VideoPluginSettingsMenuItem"; + this.N64VideoPluginSettingsMenuItem.Size = new System.Drawing.Size(239, 22); + this.N64VideoPluginSettingsMenuItem.Text = "N64 Video Plugin Settings"; + this.N64VideoPluginSettingsMenuItem.Click += new System.EventHandler(this.N64VideoPluginSettingsMenuItem_Click); + // + // setLibretroCoreToolStripMenuItem + // + this.setLibretroCoreToolStripMenuItem.Name = "setLibretroCoreToolStripMenuItem"; + this.setLibretroCoreToolStripMenuItem.Size = new System.Drawing.Size(239, 22); + this.setLibretroCoreToolStripMenuItem.Text = "Set Libretro Core"; + this.setLibretroCoreToolStripMenuItem.Click += new System.EventHandler(this.SetLibretroCoreMenuItem_Click); + // + // toolStripSeparator10 + // + this.toolStripSeparator10.Name = "toolStripSeparator10"; + this.toolStripSeparator10.Size = new System.Drawing.Size(176, 6); + // + // SaveConfigMenuItem + // + this.SaveConfigMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Save; + this.SaveConfigMenuItem.Name = "SaveConfigMenuItem"; + this.SaveConfigMenuItem.Size = new System.Drawing.Size(179, 22); + this.SaveConfigMenuItem.Text = "Save Config"; + this.SaveConfigMenuItem.Click += new System.EventHandler(this.SaveConfigMenuItem_Click); + // + // SaveConfigAsMenuItem + // + this.SaveConfigAsMenuItem.Name = "SaveConfigAsMenuItem"; + this.SaveConfigAsMenuItem.Size = new System.Drawing.Size(179, 22); + this.SaveConfigAsMenuItem.Text = "Save Config As..."; + this.SaveConfigAsMenuItem.Click += new System.EventHandler(this.SaveConfigAsMenuItem_Click); + // + // LoadConfigMenuItem + // + this.LoadConfigMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.LoadConfig; + this.LoadConfigMenuItem.Name = "LoadConfigMenuItem"; + this.LoadConfigMenuItem.Size = new System.Drawing.Size(179, 22); + this.LoadConfigMenuItem.Text = "Load Config"; + this.LoadConfigMenuItem.Click += new System.EventHandler(this.LoadConfigMenuItem_Click); + // + // LoadConfigFromMenuItem + // + this.LoadConfigFromMenuItem.Name = "LoadConfigFromMenuItem"; + this.LoadConfigFromMenuItem.Size = new System.Drawing.Size(179, 22); + this.LoadConfigFromMenuItem.Text = "Load Config From..."; + this.LoadConfigFromMenuItem.Click += new System.EventHandler(this.LoadConfigFromMenuItem_Click); + // + // ToolsSubMenu + // + this.ToolsSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.ToolBoxMenuItem, this.toolStripSeparator12, this.RamWatchMenuItem, @@ -2035,194 +2035,194 @@ this.externalToolToolStripMenuItem, this.batchRunnerToolStripMenuItem, this.ExperimentalToolsSubMenu}); - this.ToolsSubMenu.Name = "ToolsSubMenu"; - this.ToolsSubMenu.Size = new System.Drawing.Size(44, 17); - this.ToolsSubMenu.Text = "&Tools"; - this.ToolsSubMenu.DropDownOpened += new System.EventHandler(this.ToolsSubMenu_DropDownOpened); - // - // ToolBoxMenuItem - // - this.ToolBoxMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.ToolBox; - this.ToolBoxMenuItem.Name = "ToolBoxMenuItem"; - this.ToolBoxMenuItem.Size = new System.Drawing.Size(183, 22); - this.ToolBoxMenuItem.Text = "&Tool Box"; - this.ToolBoxMenuItem.Click += new System.EventHandler(this.ToolBoxMenuItem_Click); - // - // toolStripSeparator12 - // - this.toolStripSeparator12.Name = "toolStripSeparator12"; - this.toolStripSeparator12.Size = new System.Drawing.Size(180, 6); - // - // RamWatchMenuItem - // - this.RamWatchMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.watch; - this.RamWatchMenuItem.Name = "RamWatchMenuItem"; - this.RamWatchMenuItem.Size = new System.Drawing.Size(183, 22); - this.RamWatchMenuItem.Text = "RAM &Watch"; - this.RamWatchMenuItem.Click += new System.EventHandler(this.RamWatchMenuItem_Click); - // - // RamSearchMenuItem - // - this.RamSearchMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.search; - this.RamSearchMenuItem.Name = "RamSearchMenuItem"; - this.RamSearchMenuItem.Size = new System.Drawing.Size(183, 22); - this.RamSearchMenuItem.Text = "RAM &Search"; - this.RamSearchMenuItem.Click += new System.EventHandler(this.RamSearchMenuItem_Click); - // - // LuaConsoleMenuItem - // - this.LuaConsoleMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Lua; - this.LuaConsoleMenuItem.Name = "LuaConsoleMenuItem"; - this.LuaConsoleMenuItem.Size = new System.Drawing.Size(183, 22); - this.LuaConsoleMenuItem.Text = "Lua Console"; - this.LuaConsoleMenuItem.Click += new System.EventHandler(this.LuaConsoleMenuItem_Click); - // - // TAStudioMenuItem - // - this.TAStudioMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.TAStudio; - this.TAStudioMenuItem.Name = "TAStudioMenuItem"; - this.TAStudioMenuItem.Size = new System.Drawing.Size(183, 22); - this.TAStudioMenuItem.Text = "&TAStudio"; - this.TAStudioMenuItem.Click += new System.EventHandler(this.TAStudioMenuItem_Click); - // - // HexEditorMenuItem - // - this.HexEditorMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.poke; - this.HexEditorMenuItem.Name = "HexEditorMenuItem"; - this.HexEditorMenuItem.Size = new System.Drawing.Size(183, 22); - this.HexEditorMenuItem.Text = "&Hex Editor"; - this.HexEditorMenuItem.Click += new System.EventHandler(this.HexEditorMenuItem_Click); - // - // TraceLoggerMenuItem - // - this.TraceLoggerMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.pencil; - this.TraceLoggerMenuItem.Name = "TraceLoggerMenuItem"; - this.TraceLoggerMenuItem.Size = new System.Drawing.Size(183, 22); - this.TraceLoggerMenuItem.Text = "Trace &Logger"; - this.TraceLoggerMenuItem.Click += new System.EventHandler(this.TraceLoggerMenuItem_Click); - // - // DebuggerMenuItem - // - this.DebuggerMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Bug; - this.DebuggerMenuItem.Name = "DebuggerMenuItem"; - this.DebuggerMenuItem.Size = new System.Drawing.Size(183, 22); - this.DebuggerMenuItem.Text = "&Debugger"; - this.DebuggerMenuItem.Click += new System.EventHandler(this.DebuggerMenuItem_Click); - // - // CodeDataLoggerMenuItem - // - this.CodeDataLoggerMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.cdlogger; - this.CodeDataLoggerMenuItem.Name = "CodeDataLoggerMenuItem"; - this.CodeDataLoggerMenuItem.Size = new System.Drawing.Size(183, 22); - this.CodeDataLoggerMenuItem.Text = "Code-Data Logger"; - this.CodeDataLoggerMenuItem.Click += new System.EventHandler(this.CodeDataLoggerMenuItem_Click); - // - // MacroToolMenuItem - // - this.MacroToolMenuItem.Name = "MacroToolMenuItem"; - this.MacroToolMenuItem.Size = new System.Drawing.Size(183, 22); - this.MacroToolMenuItem.Text = "&Macro Tool"; - this.MacroToolMenuItem.Click += new System.EventHandler(this.MacroToolMenuItem_Click); - // - // VirtualPadMenuItem - // - this.VirtualPadMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.GameController; - this.VirtualPadMenuItem.Name = "VirtualPadMenuItem"; - this.VirtualPadMenuItem.Size = new System.Drawing.Size(183, 22); - this.VirtualPadMenuItem.Text = "Virtual Pad"; - this.VirtualPadMenuItem.Click += new System.EventHandler(this.VirtualPadMenuItem_Click); - // - // BasicBotMenuItem - // - this.BasicBotMenuItem.Name = "BasicBotMenuItem"; - this.BasicBotMenuItem.Size = new System.Drawing.Size(183, 22); - this.BasicBotMenuItem.Text = "Basic Bot"; - this.BasicBotMenuItem.Click += new System.EventHandler(this.BasicBotMenuItem_Click); - // - // toolStripSeparator11 - // - this.toolStripSeparator11.Name = "toolStripSeparator11"; - this.toolStripSeparator11.Size = new System.Drawing.Size(180, 6); - // - // CheatsMenuItem - // - this.CheatsMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Freeze; - this.CheatsMenuItem.Name = "CheatsMenuItem"; - this.CheatsMenuItem.Size = new System.Drawing.Size(183, 22); - this.CheatsMenuItem.Text = "Cheats"; - this.CheatsMenuItem.Click += new System.EventHandler(this.CheatsMenuItem_Click); - // - // gameSharkConverterToolStripMenuItem - // - this.gameSharkConverterToolStripMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Shark; - this.gameSharkConverterToolStripMenuItem.Name = "gameSharkConverterToolStripMenuItem"; - this.gameSharkConverterToolStripMenuItem.Size = new System.Drawing.Size(183, 22); - this.gameSharkConverterToolStripMenuItem.Text = "Cheat Code Converter"; - this.gameSharkConverterToolStripMenuItem.Click += new System.EventHandler(this.CheatCodeConverterMenuItem_Click); - // - // toolStripSeparator29 - // - this.toolStripSeparator29.Name = "toolStripSeparator29"; - this.toolStripSeparator29.Size = new System.Drawing.Size(180, 6); - // - // MultiDiskBundlerFileMenuItem - // - this.MultiDiskBundlerFileMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.SaveConfig; - this.MultiDiskBundlerFileMenuItem.Name = "MultiDiskBundlerFileMenuItem"; - this.MultiDiskBundlerFileMenuItem.Size = new System.Drawing.Size(183, 22); - this.MultiDiskBundlerFileMenuItem.Text = "Multi-disk Bundler"; - this.MultiDiskBundlerFileMenuItem.Click += new System.EventHandler(this.MultidiskBundlerMenuItem_Click); - // - // externalToolToolStripMenuItem - // - this.externalToolToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.ToolsSubMenu.Name = "ToolsSubMenu"; + this.ToolsSubMenu.Size = new System.Drawing.Size(47, 19); + this.ToolsSubMenu.Text = "&Tools"; + this.ToolsSubMenu.DropDownOpened += new System.EventHandler(this.ToolsSubMenu_DropDownOpened); + // + // ToolBoxMenuItem + // + this.ToolBoxMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.ToolBox; + this.ToolBoxMenuItem.Name = "ToolBoxMenuItem"; + this.ToolBoxMenuItem.Size = new System.Drawing.Size(191, 22); + this.ToolBoxMenuItem.Text = "&Tool Box"; + this.ToolBoxMenuItem.Click += new System.EventHandler(this.ToolBoxMenuItem_Click); + // + // toolStripSeparator12 + // + this.toolStripSeparator12.Name = "toolStripSeparator12"; + this.toolStripSeparator12.Size = new System.Drawing.Size(188, 6); + // + // RamWatchMenuItem + // + this.RamWatchMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.watch; + this.RamWatchMenuItem.Name = "RamWatchMenuItem"; + this.RamWatchMenuItem.Size = new System.Drawing.Size(191, 22); + this.RamWatchMenuItem.Text = "RAM &Watch"; + this.RamWatchMenuItem.Click += new System.EventHandler(this.RamWatchMenuItem_Click); + // + // RamSearchMenuItem + // + this.RamSearchMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.search; + this.RamSearchMenuItem.Name = "RamSearchMenuItem"; + this.RamSearchMenuItem.Size = new System.Drawing.Size(191, 22); + this.RamSearchMenuItem.Text = "RAM &Search"; + this.RamSearchMenuItem.Click += new System.EventHandler(this.RamSearchMenuItem_Click); + // + // LuaConsoleMenuItem + // + this.LuaConsoleMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Lua; + this.LuaConsoleMenuItem.Name = "LuaConsoleMenuItem"; + this.LuaConsoleMenuItem.Size = new System.Drawing.Size(191, 22); + this.LuaConsoleMenuItem.Text = "Lua Console"; + this.LuaConsoleMenuItem.Click += new System.EventHandler(this.LuaConsoleMenuItem_Click); + // + // TAStudioMenuItem + // + this.TAStudioMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.TAStudio; + this.TAStudioMenuItem.Name = "TAStudioMenuItem"; + this.TAStudioMenuItem.Size = new System.Drawing.Size(191, 22); + this.TAStudioMenuItem.Text = "&TAStudio"; + this.TAStudioMenuItem.Click += new System.EventHandler(this.TAStudioMenuItem_Click); + // + // HexEditorMenuItem + // + this.HexEditorMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.poke; + this.HexEditorMenuItem.Name = "HexEditorMenuItem"; + this.HexEditorMenuItem.Size = new System.Drawing.Size(191, 22); + this.HexEditorMenuItem.Text = "&Hex Editor"; + this.HexEditorMenuItem.Click += new System.EventHandler(this.HexEditorMenuItem_Click); + // + // TraceLoggerMenuItem + // + this.TraceLoggerMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.pencil; + this.TraceLoggerMenuItem.Name = "TraceLoggerMenuItem"; + this.TraceLoggerMenuItem.Size = new System.Drawing.Size(191, 22); + this.TraceLoggerMenuItem.Text = "Trace &Logger"; + this.TraceLoggerMenuItem.Click += new System.EventHandler(this.TraceLoggerMenuItem_Click); + // + // DebuggerMenuItem + // + this.DebuggerMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Bug; + this.DebuggerMenuItem.Name = "DebuggerMenuItem"; + this.DebuggerMenuItem.Size = new System.Drawing.Size(191, 22); + this.DebuggerMenuItem.Text = "&Debugger"; + this.DebuggerMenuItem.Click += new System.EventHandler(this.DebuggerMenuItem_Click); + // + // CodeDataLoggerMenuItem + // + this.CodeDataLoggerMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.cdlogger; + this.CodeDataLoggerMenuItem.Name = "CodeDataLoggerMenuItem"; + this.CodeDataLoggerMenuItem.Size = new System.Drawing.Size(191, 22); + this.CodeDataLoggerMenuItem.Text = "Code-Data Logger"; + this.CodeDataLoggerMenuItem.Click += new System.EventHandler(this.CodeDataLoggerMenuItem_Click); + // + // MacroToolMenuItem + // + this.MacroToolMenuItem.Name = "MacroToolMenuItem"; + this.MacroToolMenuItem.Size = new System.Drawing.Size(191, 22); + this.MacroToolMenuItem.Text = "&Macro Tool"; + this.MacroToolMenuItem.Click += new System.EventHandler(this.MacroToolMenuItem_Click); + // + // VirtualPadMenuItem + // + this.VirtualPadMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.GameController; + this.VirtualPadMenuItem.Name = "VirtualPadMenuItem"; + this.VirtualPadMenuItem.Size = new System.Drawing.Size(191, 22); + this.VirtualPadMenuItem.Text = "Virtual Pad"; + this.VirtualPadMenuItem.Click += new System.EventHandler(this.VirtualPadMenuItem_Click); + // + // BasicBotMenuItem + // + this.BasicBotMenuItem.Name = "BasicBotMenuItem"; + this.BasicBotMenuItem.Size = new System.Drawing.Size(191, 22); + this.BasicBotMenuItem.Text = "Basic Bot"; + this.BasicBotMenuItem.Click += new System.EventHandler(this.BasicBotMenuItem_Click); + // + // toolStripSeparator11 + // + this.toolStripSeparator11.Name = "toolStripSeparator11"; + this.toolStripSeparator11.Size = new System.Drawing.Size(188, 6); + // + // CheatsMenuItem + // + this.CheatsMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Freeze; + this.CheatsMenuItem.Name = "CheatsMenuItem"; + this.CheatsMenuItem.Size = new System.Drawing.Size(191, 22); + this.CheatsMenuItem.Text = "Cheats"; + this.CheatsMenuItem.Click += new System.EventHandler(this.CheatsMenuItem_Click); + // + // gameSharkConverterToolStripMenuItem + // + this.gameSharkConverterToolStripMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Shark; + this.gameSharkConverterToolStripMenuItem.Name = "gameSharkConverterToolStripMenuItem"; + this.gameSharkConverterToolStripMenuItem.Size = new System.Drawing.Size(191, 22); + this.gameSharkConverterToolStripMenuItem.Text = "Cheat Code Converter"; + this.gameSharkConverterToolStripMenuItem.Click += new System.EventHandler(this.CheatCodeConverterMenuItem_Click); + // + // toolStripSeparator29 + // + this.toolStripSeparator29.Name = "toolStripSeparator29"; + this.toolStripSeparator29.Size = new System.Drawing.Size(188, 6); + // + // MultiDiskBundlerFileMenuItem + // + this.MultiDiskBundlerFileMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.SaveConfig; + this.MultiDiskBundlerFileMenuItem.Name = "MultiDiskBundlerFileMenuItem"; + this.MultiDiskBundlerFileMenuItem.Size = new System.Drawing.Size(191, 22); + this.MultiDiskBundlerFileMenuItem.Text = "Multi-disk Bundler"; + this.MultiDiskBundlerFileMenuItem.Click += new System.EventHandler(this.MultidiskBundlerMenuItem_Click); + // + // externalToolToolStripMenuItem + // + this.externalToolToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.dummyExternalTool}); - this.externalToolToolStripMenuItem.Name = "externalToolToolStripMenuItem"; - this.externalToolToolStripMenuItem.Size = new System.Drawing.Size(183, 22); - this.externalToolToolStripMenuItem.Text = "External Tool"; - this.externalToolToolStripMenuItem.DropDownOpening += new System.EventHandler(this.ExternalToolToolStripMenuItem_DropDownOpening); - // - // dummyExternalTool - // - this.dummyExternalTool.Name = "dummyExternalTool"; - this.dummyExternalTool.Size = new System.Drawing.Size(99, 22); - this.dummyExternalTool.Text = "None"; - // - // batchRunnerToolStripMenuItem - // - this.batchRunnerToolStripMenuItem.Name = "batchRunnerToolStripMenuItem"; - this.batchRunnerToolStripMenuItem.Size = new System.Drawing.Size(183, 22); - this.batchRunnerToolStripMenuItem.Text = "Batch Runner"; - this.batchRunnerToolStripMenuItem.Visible = false; - this.batchRunnerToolStripMenuItem.Click += new System.EventHandler(this.BatchRunnerToolStripMenuItem_Click); - // - // ExperimentalToolsSubMenu - // - this.ExperimentalToolsSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.externalToolToolStripMenuItem.Name = "externalToolToolStripMenuItem"; + this.externalToolToolStripMenuItem.Size = new System.Drawing.Size(191, 22); + this.externalToolToolStripMenuItem.Text = "External Tool"; + this.externalToolToolStripMenuItem.DropDownOpening += new System.EventHandler(this.ExternalToolToolStripMenuItem_DropDownOpening); + // + // dummyExternalTool + // + this.dummyExternalTool.Name = "dummyExternalTool"; + this.dummyExternalTool.Size = new System.Drawing.Size(103, 22); + this.dummyExternalTool.Text = "None"; + // + // batchRunnerToolStripMenuItem + // + this.batchRunnerToolStripMenuItem.Name = "batchRunnerToolStripMenuItem"; + this.batchRunnerToolStripMenuItem.Size = new System.Drawing.Size(191, 22); + this.batchRunnerToolStripMenuItem.Text = "Batch Runner"; + this.batchRunnerToolStripMenuItem.Visible = false; + this.batchRunnerToolStripMenuItem.Click += new System.EventHandler(this.BatchRunnerToolStripMenuItem_Click); + // + // ExperimentalToolsSubMenu + // + this.ExperimentalToolsSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.AutoHawkMenuItem, this.NewHexEditorMenuItem}); - this.ExperimentalToolsSubMenu.Name = "ExperimentalToolsSubMenu"; - this.ExperimentalToolsSubMenu.Size = new System.Drawing.Size(183, 22); - this.ExperimentalToolsSubMenu.Text = "Experimental Tools"; - this.ExperimentalToolsSubMenu.DropDownOpened += new System.EventHandler(this.ExperimentalToolsSubMenu_DropDownOpened); - // - // AutoHawkMenuItem - // - this.AutoHawkMenuItem.Name = "AutoHawkMenuItem"; - this.AutoHawkMenuItem.Size = new System.Drawing.Size(148, 22); - this.AutoHawkMenuItem.Text = "AutoHawk"; - this.AutoHawkMenuItem.Click += new System.EventHandler(this.AutoHawkMenuItem_Click); - // - // NewHexEditorMenuItem - // - this.NewHexEditorMenuItem.Name = "NewHexEditorMenuItem"; - this.NewHexEditorMenuItem.Size = new System.Drawing.Size(148, 22); - this.NewHexEditorMenuItem.Text = "New Hex Editor"; - this.NewHexEditorMenuItem.Click += new System.EventHandler(this.NewHexEditorMenuItem_Click); - // - // NESSubMenu - // - this.NESSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.ExperimentalToolsSubMenu.Name = "ExperimentalToolsSubMenu"; + this.ExperimentalToolsSubMenu.Size = new System.Drawing.Size(191, 22); + this.ExperimentalToolsSubMenu.Text = "Experimental Tools"; + this.ExperimentalToolsSubMenu.DropDownOpened += new System.EventHandler(this.ExperimentalToolsSubMenu_DropDownOpened); + // + // AutoHawkMenuItem + // + this.AutoHawkMenuItem.Name = "AutoHawkMenuItem"; + this.AutoHawkMenuItem.Size = new System.Drawing.Size(155, 22); + this.AutoHawkMenuItem.Text = "AutoHawk"; + this.AutoHawkMenuItem.Click += new System.EventHandler(this.AutoHawkMenuItem_Click); + // + // NewHexEditorMenuItem + // + this.NewHexEditorMenuItem.Name = "NewHexEditorMenuItem"; + this.NewHexEditorMenuItem.Size = new System.Drawing.Size(155, 22); + this.NewHexEditorMenuItem.Text = "New Hex Editor"; + this.NewHexEditorMenuItem.Click += new System.EventHandler(this.NewHexEditorMenuItem_Click); + // + // NESSubMenu + // + this.NESSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.coreToolStripMenuItem, this.toolStripSeparator34, this.NESPPUViewerMenuItem, @@ -2239,173 +2239,173 @@ this.FDSControlsMenuItem, this.VSControlsMenuItem, this.barcodeReaderToolStripMenuItem}); - this.NESSubMenu.Name = "NESSubMenu"; - this.NESSubMenu.Size = new System.Drawing.Size(38, 17); - this.NESSubMenu.Text = "&NES"; - this.NESSubMenu.DropDownOpened += new System.EventHandler(this.NESSubMenu_DropDownOpened); - // - // coreToolStripMenuItem - // - this.coreToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.NESSubMenu.Name = "NESSubMenu"; + this.NESSubMenu.Size = new System.Drawing.Size(40, 19); + this.NESSubMenu.Text = "&NES"; + this.NESSubMenu.DropDownOpened += new System.EventHandler(this.NESSubMenu_DropDownOpened); + // + // coreToolStripMenuItem + // + this.coreToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.quickNESToolStripMenuItem, this.nesHawkToolStripMenuItem}); - this.coreToolStripMenuItem.Name = "coreToolStripMenuItem"; - this.coreToolStripMenuItem.Size = new System.Drawing.Size(217, 22); - this.coreToolStripMenuItem.Text = "&Core"; - this.coreToolStripMenuItem.DropDownOpened += new System.EventHandler(this.CoreToolStripMenuItem_DropDownOpened); - // - // quickNESToolStripMenuItem - // - this.quickNESToolStripMenuItem.Name = "quickNESToolStripMenuItem"; - this.quickNESToolStripMenuItem.Size = new System.Drawing.Size(118, 22); - this.quickNESToolStripMenuItem.Text = "&QuickNes"; - this.quickNESToolStripMenuItem.Click += new System.EventHandler(this.QuickNesToolStripMenuItem_Click); - // - // nesHawkToolStripMenuItem - // - this.nesHawkToolStripMenuItem.Name = "nesHawkToolStripMenuItem"; - this.nesHawkToolStripMenuItem.Size = new System.Drawing.Size(118, 22); - this.nesHawkToolStripMenuItem.Text = "&NesHawk"; - this.nesHawkToolStripMenuItem.Click += new System.EventHandler(this.NesHawkToolStripMenuItem_Click); - // - // toolStripSeparator34 - // - this.toolStripSeparator34.Name = "toolStripSeparator34"; - this.toolStripSeparator34.Size = new System.Drawing.Size(214, 6); - // - // NESPPUViewerMenuItem - // - this.NESPPUViewerMenuItem.Name = "NESPPUViewerMenuItem"; - this.NESPPUViewerMenuItem.Size = new System.Drawing.Size(217, 22); - this.NESPPUViewerMenuItem.Text = "&PPU Viewer"; - this.NESPPUViewerMenuItem.Click += new System.EventHandler(this.NesPPUViewerMenuItem_Click); - // - // NESNametableViewerMenuItem - // - this.NESNametableViewerMenuItem.Name = "NESNametableViewerMenuItem"; - this.NESNametableViewerMenuItem.Size = new System.Drawing.Size(217, 22); - this.NESNametableViewerMenuItem.Text = "&Nametable Viewer"; - this.NESNametableViewerMenuItem.Click += new System.EventHandler(this.NESNametableViewerMenuItem_Click); - // - // NESGameGenieCodesMenuItem - // - this.NESGameGenieCodesMenuItem.Name = "NESGameGenieCodesMenuItem"; - this.NESGameGenieCodesMenuItem.Size = new System.Drawing.Size(217, 22); - this.NESGameGenieCodesMenuItem.Text = "&Game Genie Encoder/Decoder"; - this.NESGameGenieCodesMenuItem.Click += new System.EventHandler(this.NESGameGenieCodesMenuItem_Click); - // - // musicRipperToolStripMenuItem - // - this.musicRipperToolStripMenuItem.Name = "musicRipperToolStripMenuItem"; - this.musicRipperToolStripMenuItem.Size = new System.Drawing.Size(217, 22); - this.musicRipperToolStripMenuItem.Text = "Music Ripper"; - this.musicRipperToolStripMenuItem.Click += new System.EventHandler(this.MusicRipperMenuItem_Click); - // - // toolStripSeparator17 - // - this.toolStripSeparator17.Name = "toolStripSeparator17"; - this.toolStripSeparator17.Size = new System.Drawing.Size(214, 6); - // - // NesControllerSettingsMenuItem - // - this.NesControllerSettingsMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.GameController; - this.NesControllerSettingsMenuItem.Name = "NesControllerSettingsMenuItem"; - this.NesControllerSettingsMenuItem.Size = new System.Drawing.Size(217, 22); - this.NesControllerSettingsMenuItem.Text = "Controller Settings..."; - this.NesControllerSettingsMenuItem.Click += new System.EventHandler(this.NesControllerSettingsMenuItem_Click); - // - // NESGraphicSettingsMenuItem - // - this.NESGraphicSettingsMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.tvIcon; - this.NESGraphicSettingsMenuItem.Name = "NESGraphicSettingsMenuItem"; - this.NESGraphicSettingsMenuItem.Size = new System.Drawing.Size(217, 22); - this.NESGraphicSettingsMenuItem.Text = "Graphics Settings..."; - this.NESGraphicSettingsMenuItem.Click += new System.EventHandler(this.NESGraphicSettingsMenuItem_Click); - // - // NESSoundChannelsMenuItem - // - this.NESSoundChannelsMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.AudioHS; - this.NESSoundChannelsMenuItem.Name = "NESSoundChannelsMenuItem"; - this.NESSoundChannelsMenuItem.Size = new System.Drawing.Size(217, 22); - this.NESSoundChannelsMenuItem.Text = "Sound Channels..."; - this.NESSoundChannelsMenuItem.Click += new System.EventHandler(this.NESSoundChannelsMenuItem_Click); - // - // VSSettingsMenuItem - // - this.VSSettingsMenuItem.Name = "VSSettingsMenuItem"; - this.VSSettingsMenuItem.Size = new System.Drawing.Size(217, 22); - this.VSSettingsMenuItem.Text = "VS Settings..."; - this.VSSettingsMenuItem.Click += new System.EventHandler(this.VsSettingsMenuItem_Click); - // - // MovieSettingsMenuItem - // - this.MovieSettingsMenuItem.Name = "MovieSettingsMenuItem"; - this.MovieSettingsMenuItem.Size = new System.Drawing.Size(217, 22); - this.MovieSettingsMenuItem.Text = "Advanced Settings..."; - this.MovieSettingsMenuItem.Click += new System.EventHandler(this.MovieSettingsMenuItem_Click); - // - // toolStripSeparator22 - // - this.toolStripSeparator22.Name = "toolStripSeparator22"; - this.toolStripSeparator22.Size = new System.Drawing.Size(214, 6); - // - // FDSControlsMenuItem - // - this.FDSControlsMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.coreToolStripMenuItem.Name = "coreToolStripMenuItem"; + this.coreToolStripMenuItem.Size = new System.Drawing.Size(233, 22); + this.coreToolStripMenuItem.Text = "&Core"; + this.coreToolStripMenuItem.DropDownOpened += new System.EventHandler(this.CoreToolStripMenuItem_DropDownOpened); + // + // quickNESToolStripMenuItem + // + this.quickNESToolStripMenuItem.Name = "quickNESToolStripMenuItem"; + this.quickNESToolStripMenuItem.Size = new System.Drawing.Size(125, 22); + this.quickNESToolStripMenuItem.Text = "&QuickNes"; + this.quickNESToolStripMenuItem.Click += new System.EventHandler(this.QuickNesToolStripMenuItem_Click); + // + // nesHawkToolStripMenuItem + // + this.nesHawkToolStripMenuItem.Name = "nesHawkToolStripMenuItem"; + this.nesHawkToolStripMenuItem.Size = new System.Drawing.Size(125, 22); + this.nesHawkToolStripMenuItem.Text = "&NesHawk"; + this.nesHawkToolStripMenuItem.Click += new System.EventHandler(this.NesHawkToolStripMenuItem_Click); + // + // toolStripSeparator34 + // + this.toolStripSeparator34.Name = "toolStripSeparator34"; + this.toolStripSeparator34.Size = new System.Drawing.Size(230, 6); + // + // NESPPUViewerMenuItem + // + this.NESPPUViewerMenuItem.Name = "NESPPUViewerMenuItem"; + this.NESPPUViewerMenuItem.Size = new System.Drawing.Size(233, 22); + this.NESPPUViewerMenuItem.Text = "&PPU Viewer"; + this.NESPPUViewerMenuItem.Click += new System.EventHandler(this.NesPPUViewerMenuItem_Click); + // + // NESNametableViewerMenuItem + // + this.NESNametableViewerMenuItem.Name = "NESNametableViewerMenuItem"; + this.NESNametableViewerMenuItem.Size = new System.Drawing.Size(233, 22); + this.NESNametableViewerMenuItem.Text = "&Nametable Viewer"; + this.NESNametableViewerMenuItem.Click += new System.EventHandler(this.NESNametableViewerMenuItem_Click); + // + // NESGameGenieCodesMenuItem + // + this.NESGameGenieCodesMenuItem.Name = "NESGameGenieCodesMenuItem"; + this.NESGameGenieCodesMenuItem.Size = new System.Drawing.Size(233, 22); + this.NESGameGenieCodesMenuItem.Text = "&Game Genie Encoder/Decoder"; + this.NESGameGenieCodesMenuItem.Click += new System.EventHandler(this.NESGameGenieCodesMenuItem_Click); + // + // musicRipperToolStripMenuItem + // + this.musicRipperToolStripMenuItem.Name = "musicRipperToolStripMenuItem"; + this.musicRipperToolStripMenuItem.Size = new System.Drawing.Size(233, 22); + this.musicRipperToolStripMenuItem.Text = "Music Ripper"; + this.musicRipperToolStripMenuItem.Click += new System.EventHandler(this.MusicRipperMenuItem_Click); + // + // toolStripSeparator17 + // + this.toolStripSeparator17.Name = "toolStripSeparator17"; + this.toolStripSeparator17.Size = new System.Drawing.Size(230, 6); + // + // NesControllerSettingsMenuItem + // + this.NesControllerSettingsMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.GameController; + this.NesControllerSettingsMenuItem.Name = "NesControllerSettingsMenuItem"; + this.NesControllerSettingsMenuItem.Size = new System.Drawing.Size(233, 22); + this.NesControllerSettingsMenuItem.Text = "Controller Settings..."; + this.NesControllerSettingsMenuItem.Click += new System.EventHandler(this.NesControllerSettingsMenuItem_Click); + // + // NESGraphicSettingsMenuItem + // + this.NESGraphicSettingsMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.tvIcon; + this.NESGraphicSettingsMenuItem.Name = "NESGraphicSettingsMenuItem"; + this.NESGraphicSettingsMenuItem.Size = new System.Drawing.Size(233, 22); + this.NESGraphicSettingsMenuItem.Text = "Graphics Settings..."; + this.NESGraphicSettingsMenuItem.Click += new System.EventHandler(this.NESGraphicSettingsMenuItem_Click); + // + // NESSoundChannelsMenuItem + // + this.NESSoundChannelsMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.AudioHS; + this.NESSoundChannelsMenuItem.Name = "NESSoundChannelsMenuItem"; + this.NESSoundChannelsMenuItem.Size = new System.Drawing.Size(233, 22); + this.NESSoundChannelsMenuItem.Text = "Sound Channels..."; + this.NESSoundChannelsMenuItem.Click += new System.EventHandler(this.NESSoundChannelsMenuItem_Click); + // + // VSSettingsMenuItem + // + this.VSSettingsMenuItem.Name = "VSSettingsMenuItem"; + this.VSSettingsMenuItem.Size = new System.Drawing.Size(233, 22); + this.VSSettingsMenuItem.Text = "VS Settings..."; + this.VSSettingsMenuItem.Click += new System.EventHandler(this.VsSettingsMenuItem_Click); + // + // MovieSettingsMenuItem + // + this.MovieSettingsMenuItem.Name = "MovieSettingsMenuItem"; + this.MovieSettingsMenuItem.Size = new System.Drawing.Size(233, 22); + this.MovieSettingsMenuItem.Text = "Advanced Settings..."; + this.MovieSettingsMenuItem.Click += new System.EventHandler(this.MovieSettingsMenuItem_Click); + // + // toolStripSeparator22 + // + this.toolStripSeparator22.Name = "toolStripSeparator22"; + this.toolStripSeparator22.Size = new System.Drawing.Size(230, 6); + // + // FDSControlsMenuItem + // + this.FDSControlsMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.FdsEjectDiskMenuItem}); - this.FDSControlsMenuItem.Name = "FDSControlsMenuItem"; - this.FDSControlsMenuItem.Size = new System.Drawing.Size(217, 22); - this.FDSControlsMenuItem.Text = "FDS Controls"; - this.FDSControlsMenuItem.DropDownOpened += new System.EventHandler(this.FdsControlsMenuItem_DropDownOpened); - // - // FdsEjectDiskMenuItem - // - this.FdsEjectDiskMenuItem.Name = "FdsEjectDiskMenuItem"; - this.FdsEjectDiskMenuItem.Size = new System.Drawing.Size(120, 22); - this.FdsEjectDiskMenuItem.Text = "&Eject Disk"; - this.FdsEjectDiskMenuItem.Click += new System.EventHandler(this.FdsEjectDiskMenuItem_Click); - // - // VSControlsMenuItem - // - this.VSControlsMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.FDSControlsMenuItem.Name = "FDSControlsMenuItem"; + this.FDSControlsMenuItem.Size = new System.Drawing.Size(233, 22); + this.FDSControlsMenuItem.Text = "FDS Controls"; + this.FDSControlsMenuItem.DropDownOpened += new System.EventHandler(this.FdsControlsMenuItem_DropDownOpened); + // + // FdsEjectDiskMenuItem + // + this.FdsEjectDiskMenuItem.Name = "FdsEjectDiskMenuItem"; + this.FdsEjectDiskMenuItem.Size = new System.Drawing.Size(124, 22); + this.FdsEjectDiskMenuItem.Text = "&Eject Disk"; + this.FdsEjectDiskMenuItem.Click += new System.EventHandler(this.FdsEjectDiskMenuItem_Click); + // + // VSControlsMenuItem + // + this.VSControlsMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.VSInsertCoinP1MenuItem, this.VSInsertCoinP2MenuItem, this.VSServiceSwitchMenuItem}); - this.VSControlsMenuItem.Name = "VSControlsMenuItem"; - this.VSControlsMenuItem.Size = new System.Drawing.Size(217, 22); - this.VSControlsMenuItem.Text = "VS Controls"; - // - // VSInsertCoinP1MenuItem - // - this.VSInsertCoinP1MenuItem.Name = "VSInsertCoinP1MenuItem"; - this.VSInsertCoinP1MenuItem.Size = new System.Drawing.Size(143, 22); - this.VSInsertCoinP1MenuItem.Text = "Insert Coin P1"; - this.VSInsertCoinP1MenuItem.Click += new System.EventHandler(this.VsInsertCoinP1MenuItem_Click); - // - // VSInsertCoinP2MenuItem - // - this.VSInsertCoinP2MenuItem.Name = "VSInsertCoinP2MenuItem"; - this.VSInsertCoinP2MenuItem.Size = new System.Drawing.Size(143, 22); - this.VSInsertCoinP2MenuItem.Text = "Insert Coin P2"; - this.VSInsertCoinP2MenuItem.Click += new System.EventHandler(this.VsInsertCoinP2MenuItem_Click); - // - // VSServiceSwitchMenuItem - // - this.VSServiceSwitchMenuItem.Name = "VSServiceSwitchMenuItem"; - this.VSServiceSwitchMenuItem.Size = new System.Drawing.Size(143, 22); - this.VSServiceSwitchMenuItem.Text = "Service Switch"; - this.VSServiceSwitchMenuItem.Click += new System.EventHandler(this.VsServiceSwitchMenuItem_Click); - // - // barcodeReaderToolStripMenuItem - // - this.barcodeReaderToolStripMenuItem.Name = "barcodeReaderToolStripMenuItem"; - this.barcodeReaderToolStripMenuItem.Size = new System.Drawing.Size(217, 22); - this.barcodeReaderToolStripMenuItem.Text = "Barcode Reader"; - this.barcodeReaderToolStripMenuItem.Click += new System.EventHandler(this.BarcodeReaderMenuItem_Click); - // - // PCESubMenu - // - this.PCESubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.VSControlsMenuItem.Name = "VSControlsMenuItem"; + this.VSControlsMenuItem.Size = new System.Drawing.Size(233, 22); + this.VSControlsMenuItem.Text = "VS Controls"; + // + // VSInsertCoinP1MenuItem + // + this.VSInsertCoinP1MenuItem.Name = "VSInsertCoinP1MenuItem"; + this.VSInsertCoinP1MenuItem.Size = new System.Drawing.Size(149, 22); + this.VSInsertCoinP1MenuItem.Text = "Insert Coin P1"; + this.VSInsertCoinP1MenuItem.Click += new System.EventHandler(this.VsInsertCoinP1MenuItem_Click); + // + // VSInsertCoinP2MenuItem + // + this.VSInsertCoinP2MenuItem.Name = "VSInsertCoinP2MenuItem"; + this.VSInsertCoinP2MenuItem.Size = new System.Drawing.Size(149, 22); + this.VSInsertCoinP2MenuItem.Text = "Insert Coin P2"; + this.VSInsertCoinP2MenuItem.Click += new System.EventHandler(this.VsInsertCoinP2MenuItem_Click); + // + // VSServiceSwitchMenuItem + // + this.VSServiceSwitchMenuItem.Name = "VSServiceSwitchMenuItem"; + this.VSServiceSwitchMenuItem.Size = new System.Drawing.Size(149, 22); + this.VSServiceSwitchMenuItem.Text = "Service Switch"; + this.VSServiceSwitchMenuItem.Click += new System.EventHandler(this.VsServiceSwitchMenuItem_Click); + // + // barcodeReaderToolStripMenuItem + // + this.barcodeReaderToolStripMenuItem.Name = "barcodeReaderToolStripMenuItem"; + this.barcodeReaderToolStripMenuItem.Size = new System.Drawing.Size(233, 22); + this.barcodeReaderToolStripMenuItem.Text = "Barcode Reader"; + this.barcodeReaderToolStripMenuItem.Click += new System.EventHandler(this.BarcodeReaderMenuItem_Click); + // + // PCESubMenu + // + this.PCESubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.PceControllerSettingsMenuItem, this.PCEGraphicsSettingsMenuItem, this.toolStripSeparator32, @@ -2416,82 +2416,82 @@ this.PCEAlwaysPerformSpriteLimitMenuItem, this.PCEAlwaysEqualizeVolumesMenuItem, this.PCEArcadeCardRewindEnableMenuItem}); - this.PCESubMenu.Name = "PCESubMenu"; - this.PCESubMenu.Size = new System.Drawing.Size(38, 17); - this.PCESubMenu.Text = "&PCE"; - this.PCESubMenu.DropDownOpened += new System.EventHandler(this.PCESubMenu_DropDownOpened); - // - // PceControllerSettingsMenuItem - // - this.PceControllerSettingsMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.GameController; - this.PceControllerSettingsMenuItem.Name = "PceControllerSettingsMenuItem"; - this.PceControllerSettingsMenuItem.Size = new System.Drawing.Size(240, 22); - this.PceControllerSettingsMenuItem.Text = "Controller Settings"; - this.PceControllerSettingsMenuItem.Click += new System.EventHandler(this.PceControllerSettingsMenuItem_Click); - // - // PCEGraphicsSettingsMenuItem - // - this.PCEGraphicsSettingsMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.tvIcon; - this.PCEGraphicsSettingsMenuItem.Name = "PCEGraphicsSettingsMenuItem"; - this.PCEGraphicsSettingsMenuItem.Size = new System.Drawing.Size(240, 22); - this.PCEGraphicsSettingsMenuItem.Text = "Graphics Settings"; - this.PCEGraphicsSettingsMenuItem.Click += new System.EventHandler(this.PceGraphicsSettingsMenuItem_Click); - // - // toolStripSeparator32 - // - this.toolStripSeparator32.Name = "toolStripSeparator32"; - this.toolStripSeparator32.Size = new System.Drawing.Size(237, 6); - // - // PCEBGViewerMenuItem - // - this.PCEBGViewerMenuItem.Name = "PCEBGViewerMenuItem"; - this.PCEBGViewerMenuItem.Size = new System.Drawing.Size(240, 22); - this.PCEBGViewerMenuItem.Text = "&BG Viewer"; - this.PCEBGViewerMenuItem.Click += new System.EventHandler(this.PceBgViewerMenuItem_Click); - // - // PCEtileViewerToolStripMenuItem - // - this.PCEtileViewerToolStripMenuItem.Name = "PCEtileViewerToolStripMenuItem"; - this.PCEtileViewerToolStripMenuItem.Size = new System.Drawing.Size(240, 22); - this.PCEtileViewerToolStripMenuItem.Text = "&Tile Viewer"; - this.PCEtileViewerToolStripMenuItem.Click += new System.EventHandler(this.PceTileViewerMenuItem_Click); - // - // PceSoundDebuggerToolStripMenuItem - // - this.PceSoundDebuggerToolStripMenuItem.Name = "PceSoundDebuggerToolStripMenuItem"; - this.PceSoundDebuggerToolStripMenuItem.Size = new System.Drawing.Size(240, 22); - this.PceSoundDebuggerToolStripMenuItem.Text = "&Sound Debugger"; - this.PceSoundDebuggerToolStripMenuItem.Click += new System.EventHandler(this.PceSoundDebuggerMenuItem_Click); - // - // toolStripSeparator25 - // - this.toolStripSeparator25.Name = "toolStripSeparator25"; - this.toolStripSeparator25.Size = new System.Drawing.Size(237, 6); - // - // PCEAlwaysPerformSpriteLimitMenuItem - // - this.PCEAlwaysPerformSpriteLimitMenuItem.Name = "PCEAlwaysPerformSpriteLimitMenuItem"; - this.PCEAlwaysPerformSpriteLimitMenuItem.Size = new System.Drawing.Size(240, 22); - this.PCEAlwaysPerformSpriteLimitMenuItem.Text = "Always Perform Sprite Limit"; - this.PCEAlwaysPerformSpriteLimitMenuItem.Click += new System.EventHandler(this.PCEAlwaysPerformSpriteLimitMenuItem_Click); - // - // PCEAlwaysEqualizeVolumesMenuItem - // - this.PCEAlwaysEqualizeVolumesMenuItem.Name = "PCEAlwaysEqualizeVolumesMenuItem"; - this.PCEAlwaysEqualizeVolumesMenuItem.Size = new System.Drawing.Size(240, 22); - this.PCEAlwaysEqualizeVolumesMenuItem.Text = "Always Equalize Volumes (PCE-CD)"; - this.PCEAlwaysEqualizeVolumesMenuItem.Click += new System.EventHandler(this.PCEAlwaysEqualizeVolumesMenuItem_Click); - // - // PCEArcadeCardRewindEnableMenuItem - // - this.PCEArcadeCardRewindEnableMenuItem.Name = "PCEArcadeCardRewindEnableMenuItem"; - this.PCEArcadeCardRewindEnableMenuItem.Size = new System.Drawing.Size(240, 22); - this.PCEArcadeCardRewindEnableMenuItem.Text = "Arcade Card Rewind-Enable Hack"; - this.PCEArcadeCardRewindEnableMenuItem.Click += new System.EventHandler(this.PCEArcadeCardRewindEnableMenuItem_Click); - // - // SMSSubMenu - // - this.SMSSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.PCESubMenu.Name = "PCESubMenu"; + this.PCESubMenu.Size = new System.Drawing.Size(40, 19); + this.PCESubMenu.Text = "&PCE"; + this.PCESubMenu.DropDownOpened += new System.EventHandler(this.PCESubMenu_DropDownOpened); + // + // PceControllerSettingsMenuItem + // + this.PceControllerSettingsMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.GameController; + this.PceControllerSettingsMenuItem.Name = "PceControllerSettingsMenuItem"; + this.PceControllerSettingsMenuItem.Size = new System.Drawing.Size(258, 22); + this.PceControllerSettingsMenuItem.Text = "Controller Settings"; + this.PceControllerSettingsMenuItem.Click += new System.EventHandler(this.PceControllerSettingsMenuItem_Click); + // + // PCEGraphicsSettingsMenuItem + // + this.PCEGraphicsSettingsMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.tvIcon; + this.PCEGraphicsSettingsMenuItem.Name = "PCEGraphicsSettingsMenuItem"; + this.PCEGraphicsSettingsMenuItem.Size = new System.Drawing.Size(258, 22); + this.PCEGraphicsSettingsMenuItem.Text = "Graphics Settings"; + this.PCEGraphicsSettingsMenuItem.Click += new System.EventHandler(this.PceGraphicsSettingsMenuItem_Click); + // + // toolStripSeparator32 + // + this.toolStripSeparator32.Name = "toolStripSeparator32"; + this.toolStripSeparator32.Size = new System.Drawing.Size(255, 6); + // + // PCEBGViewerMenuItem + // + this.PCEBGViewerMenuItem.Name = "PCEBGViewerMenuItem"; + this.PCEBGViewerMenuItem.Size = new System.Drawing.Size(258, 22); + this.PCEBGViewerMenuItem.Text = "&BG Viewer"; + this.PCEBGViewerMenuItem.Click += new System.EventHandler(this.PceBgViewerMenuItem_Click); + // + // PCEtileViewerToolStripMenuItem + // + this.PCEtileViewerToolStripMenuItem.Name = "PCEtileViewerToolStripMenuItem"; + this.PCEtileViewerToolStripMenuItem.Size = new System.Drawing.Size(258, 22); + this.PCEtileViewerToolStripMenuItem.Text = "&Tile Viewer"; + this.PCEtileViewerToolStripMenuItem.Click += new System.EventHandler(this.PceTileViewerMenuItem_Click); + // + // PceSoundDebuggerToolStripMenuItem + // + this.PceSoundDebuggerToolStripMenuItem.Name = "PceSoundDebuggerToolStripMenuItem"; + this.PceSoundDebuggerToolStripMenuItem.Size = new System.Drawing.Size(258, 22); + this.PceSoundDebuggerToolStripMenuItem.Text = "&Sound Debugger"; + this.PceSoundDebuggerToolStripMenuItem.Click += new System.EventHandler(this.PceSoundDebuggerMenuItem_Click); + // + // toolStripSeparator25 + // + this.toolStripSeparator25.Name = "toolStripSeparator25"; + this.toolStripSeparator25.Size = new System.Drawing.Size(255, 6); + // + // PCEAlwaysPerformSpriteLimitMenuItem + // + this.PCEAlwaysPerformSpriteLimitMenuItem.Name = "PCEAlwaysPerformSpriteLimitMenuItem"; + this.PCEAlwaysPerformSpriteLimitMenuItem.Size = new System.Drawing.Size(258, 22); + this.PCEAlwaysPerformSpriteLimitMenuItem.Text = "Always Perform Sprite Limit"; + this.PCEAlwaysPerformSpriteLimitMenuItem.Click += new System.EventHandler(this.PCEAlwaysPerformSpriteLimitMenuItem_Click); + // + // PCEAlwaysEqualizeVolumesMenuItem + // + this.PCEAlwaysEqualizeVolumesMenuItem.Name = "PCEAlwaysEqualizeVolumesMenuItem"; + this.PCEAlwaysEqualizeVolumesMenuItem.Size = new System.Drawing.Size(258, 22); + this.PCEAlwaysEqualizeVolumesMenuItem.Text = "Always Equalize Volumes (PCE-CD)"; + this.PCEAlwaysEqualizeVolumesMenuItem.Click += new System.EventHandler(this.PCEAlwaysEqualizeVolumesMenuItem_Click); + // + // PCEArcadeCardRewindEnableMenuItem + // + this.PCEArcadeCardRewindEnableMenuItem.Name = "PCEArcadeCardRewindEnableMenuItem"; + this.PCEArcadeCardRewindEnableMenuItem.Size = new System.Drawing.Size(258, 22); + this.PCEArcadeCardRewindEnableMenuItem.Text = "Arcade Card Rewind-Enable Hack"; + this.PCEArcadeCardRewindEnableMenuItem.Click += new System.EventHandler(this.PCEArcadeCardRewindEnableMenuItem_Click); + // + // SMSSubMenu + // + this.SMSSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.SMSregionToolStripMenuItem, this.SMSdisplayToolStripMenuItem, this.SMStoolStripMenuItem2, @@ -2508,785 +2508,800 @@ this.toolStripSeparator24, this.SMSVDPViewerToolStripMenuItem, this.GGGameGenieMenuItem}); - this.SMSSubMenu.Name = "SMSSubMenu"; - this.SMSSubMenu.Size = new System.Drawing.Size(39, 17); - this.SMSSubMenu.Text = "&SMS"; - this.SMSSubMenu.DropDownOpened += new System.EventHandler(this.SMSSubMenu_DropDownOpened); - // - // SMSregionToolStripMenuItem - // - this.SMSregionToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.SMSSubMenu.Name = "SMSSubMenu"; + this.SMSSubMenu.Size = new System.Drawing.Size(42, 19); + this.SMSSubMenu.Text = "&SMS"; + this.SMSSubMenu.DropDownOpened += new System.EventHandler(this.SMSSubMenu_DropDownOpened); + // + // SMSregionToolStripMenuItem + // + this.SMSregionToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.SMSregionExportToolStripMenuItem, this.SMSregionJapanToolStripMenuItem, this.SMSregionAutoToolStripMenuItem}); - this.SMSregionToolStripMenuItem.Name = "SMSregionToolStripMenuItem"; - this.SMSregionToolStripMenuItem.Size = new System.Drawing.Size(262, 22); - this.SMSregionToolStripMenuItem.Text = "Region"; - // - // SMSregionExportToolStripMenuItem - // - this.SMSregionExportToolStripMenuItem.Name = "SMSregionExportToolStripMenuItem"; - this.SMSregionExportToolStripMenuItem.Size = new System.Drawing.Size(106, 22); - this.SMSregionExportToolStripMenuItem.Text = "Export"; - this.SMSregionExportToolStripMenuItem.Click += new System.EventHandler(this.SMS_RegionExport_Click); - // - // SMSregionJapanToolStripMenuItem - // - this.SMSregionJapanToolStripMenuItem.Name = "SMSregionJapanToolStripMenuItem"; - this.SMSregionJapanToolStripMenuItem.Size = new System.Drawing.Size(106, 22); - this.SMSregionJapanToolStripMenuItem.Text = "Japan"; - this.SMSregionJapanToolStripMenuItem.Click += new System.EventHandler(this.SMS_RegionJapan_Click); - // - // SMSregionAutoToolStripMenuItem - // - this.SMSregionAutoToolStripMenuItem.Name = "SMSregionAutoToolStripMenuItem"; - this.SMSregionAutoToolStripMenuItem.Size = new System.Drawing.Size(106, 22); - this.SMSregionAutoToolStripMenuItem.Text = "Auto"; - this.SMSregionAutoToolStripMenuItem.Click += new System.EventHandler(this.SMS_RegionAuto_Click); - // - // SMSdisplayToolStripMenuItem - // - this.SMSdisplayToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.SMSregionToolStripMenuItem.Name = "SMSregionToolStripMenuItem"; + this.SMSregionToolStripMenuItem.Size = new System.Drawing.Size(277, 22); + this.SMSregionToolStripMenuItem.Text = "Region"; + // + // SMSregionExportToolStripMenuItem + // + this.SMSregionExportToolStripMenuItem.Name = "SMSregionExportToolStripMenuItem"; + this.SMSregionExportToolStripMenuItem.Size = new System.Drawing.Size(107, 22); + this.SMSregionExportToolStripMenuItem.Text = "Export"; + this.SMSregionExportToolStripMenuItem.Click += new System.EventHandler(this.SMS_RegionExport_Click); + // + // SMSregionJapanToolStripMenuItem + // + this.SMSregionJapanToolStripMenuItem.Name = "SMSregionJapanToolStripMenuItem"; + this.SMSregionJapanToolStripMenuItem.Size = new System.Drawing.Size(107, 22); + this.SMSregionJapanToolStripMenuItem.Text = "Japan"; + this.SMSregionJapanToolStripMenuItem.Click += new System.EventHandler(this.SMS_RegionJapan_Click); + // + // SMSregionAutoToolStripMenuItem + // + this.SMSregionAutoToolStripMenuItem.Name = "SMSregionAutoToolStripMenuItem"; + this.SMSregionAutoToolStripMenuItem.Size = new System.Drawing.Size(107, 22); + this.SMSregionAutoToolStripMenuItem.Text = "Auto"; + this.SMSregionAutoToolStripMenuItem.Click += new System.EventHandler(this.SMS_RegionAuto_Click); + // + // SMSdisplayToolStripMenuItem + // + this.SMSdisplayToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.SMSdisplayNtscToolStripMenuItem, this.SMSdisplayPalToolStripMenuItem, this.SMSdisplayAutoToolStripMenuItem}); - this.SMSdisplayToolStripMenuItem.Name = "SMSdisplayToolStripMenuItem"; - this.SMSdisplayToolStripMenuItem.Size = new System.Drawing.Size(262, 22); - this.SMSdisplayToolStripMenuItem.Text = "Display Type"; - // - // SMSdisplayNtscToolStripMenuItem - // - this.SMSdisplayNtscToolStripMenuItem.Name = "SMSdisplayNtscToolStripMenuItem"; - this.SMSdisplayNtscToolStripMenuItem.Size = new System.Drawing.Size(100, 22); - this.SMSdisplayNtscToolStripMenuItem.Text = "NTSC"; - this.SMSdisplayNtscToolStripMenuItem.Click += new System.EventHandler(this.SMS_DisplayNTSC_Click); - // - // SMSdisplayPalToolStripMenuItem - // - this.SMSdisplayPalToolStripMenuItem.Name = "SMSdisplayPalToolStripMenuItem"; - this.SMSdisplayPalToolStripMenuItem.Size = new System.Drawing.Size(100, 22); - this.SMSdisplayPalToolStripMenuItem.Text = "PAL"; - this.SMSdisplayPalToolStripMenuItem.Click += new System.EventHandler(this.SMS_DisplayPAL_Click); - // - // SMSdisplayAutoToolStripMenuItem - // - this.SMSdisplayAutoToolStripMenuItem.Name = "SMSdisplayAutoToolStripMenuItem"; - this.SMSdisplayAutoToolStripMenuItem.Size = new System.Drawing.Size(100, 22); - this.SMSdisplayAutoToolStripMenuItem.Text = "Auto"; - this.SMSdisplayAutoToolStripMenuItem.Click += new System.EventHandler(this.SMS_DisplayAuto_Click); - // - // SMStoolStripMenuItem2 - // - this.SMStoolStripMenuItem2.Name = "SMStoolStripMenuItem2"; - this.SMStoolStripMenuItem2.Size = new System.Drawing.Size(259, 6); - // - // SMSenableBIOSToolStripMenuItem - // - this.SMSenableBIOSToolStripMenuItem.Name = "SMSenableBIOSToolStripMenuItem"; - this.SMSenableBIOSToolStripMenuItem.Size = new System.Drawing.Size(262, 22); - this.SMSenableBIOSToolStripMenuItem.Text = "Enable BIOS (Must be Enabled for TAS)"; - this.SMSenableBIOSToolStripMenuItem.Click += new System.EventHandler(this.SmsBiosMenuItem_Click); - // - // SMSEnableFMChipMenuItem - // - this.SMSEnableFMChipMenuItem.Name = "SMSEnableFMChipMenuItem"; - this.SMSEnableFMChipMenuItem.Size = new System.Drawing.Size(262, 22); - this.SMSEnableFMChipMenuItem.Text = "&Enable FM Chip"; - this.SMSEnableFMChipMenuItem.Click += new System.EventHandler(this.SmsEnableFmChipMenuItem_Click); - // - // SMSOverclockMenuItem - // - this.SMSOverclockMenuItem.Name = "SMSOverclockMenuItem"; - this.SMSOverclockMenuItem.Size = new System.Drawing.Size(262, 22); - this.SMSOverclockMenuItem.Text = "&Overclock when Known Safe"; - this.SMSOverclockMenuItem.Click += new System.EventHandler(this.SMSOverclockMenuItem_Click); - // - // SMSForceStereoMenuItem - // - this.SMSForceStereoMenuItem.Name = "SMSForceStereoMenuItem"; - this.SMSForceStereoMenuItem.Size = new System.Drawing.Size(262, 22); - this.SMSForceStereoMenuItem.Text = "&Force Stereo Separation"; - this.SMSForceStereoMenuItem.Click += new System.EventHandler(this.SMSForceStereoMenuItem_Click); - // - // SMSSpriteLimitMenuItem - // - this.SMSSpriteLimitMenuItem.Name = "SMSSpriteLimitMenuItem"; - this.SMSSpriteLimitMenuItem.Size = new System.Drawing.Size(262, 22); - this.SMSSpriteLimitMenuItem.Text = "Sprite &Limit"; - this.SMSSpriteLimitMenuItem.Click += new System.EventHandler(this.SMSSpriteLimitMenuItem_Click); - // - // SMSDisplayOverscanMenuItem - // - this.SMSDisplayOverscanMenuItem.Name = "SMSDisplayOverscanMenuItem"; - this.SMSDisplayOverscanMenuItem.Size = new System.Drawing.Size(262, 22); - this.SMSDisplayOverscanMenuItem.Text = "Display Overscan"; - this.SMSDisplayOverscanMenuItem.Click += new System.EventHandler(this.SMSDisplayOverscanMenuItem_Click); - // - // SMSFix3DGameDisplayToolStripMenuItem - // - this.SMSFix3DGameDisplayToolStripMenuItem.Name = "SMSFix3DGameDisplayToolStripMenuItem"; - this.SMSFix3DGameDisplayToolStripMenuItem.Size = new System.Drawing.Size(262, 22); - this.SMSFix3DGameDisplayToolStripMenuItem.Text = "Fix 3D Game Display"; - this.SMSFix3DGameDisplayToolStripMenuItem.Click += new System.EventHandler(this.SMSFix3DDisplayMenuItem_Click); - // - // ShowClippedRegionsMenuItem - // - this.ShowClippedRegionsMenuItem.Name = "ShowClippedRegionsMenuItem"; - this.ShowClippedRegionsMenuItem.Size = new System.Drawing.Size(262, 22); - this.ShowClippedRegionsMenuItem.Text = "&Show Clipped Regions"; - this.ShowClippedRegionsMenuItem.Click += new System.EventHandler(this.ShowClippedRegionsMenuItem_Click); - // - // HighlightActiveDisplayRegionMenuItem - // - this.HighlightActiveDisplayRegionMenuItem.Name = "HighlightActiveDisplayRegionMenuItem"; - this.HighlightActiveDisplayRegionMenuItem.Size = new System.Drawing.Size(262, 22); - this.HighlightActiveDisplayRegionMenuItem.Text = "&Highlight Active Display Region"; - this.HighlightActiveDisplayRegionMenuItem.Click += new System.EventHandler(this.HighlightActiveDisplayRegionMenuItem_Click); - // - // SMSGraphicsSettingsMenuItem - // - this.SMSGraphicsSettingsMenuItem.Name = "SMSGraphicsSettingsMenuItem"; - this.SMSGraphicsSettingsMenuItem.Size = new System.Drawing.Size(262, 22); - this.SMSGraphicsSettingsMenuItem.Text = "&Graphics Settings..."; - this.SMSGraphicsSettingsMenuItem.Click += new System.EventHandler(this.SMSGraphicsSettingsMenuItem_Click); - // - // toolStripSeparator24 - // - this.toolStripSeparator24.Name = "toolStripSeparator24"; - this.toolStripSeparator24.Size = new System.Drawing.Size(259, 6); - // - // SMSVDPViewerToolStripMenuItem - // - this.SMSVDPViewerToolStripMenuItem.Name = "SMSVDPViewerToolStripMenuItem"; - this.SMSVDPViewerToolStripMenuItem.Size = new System.Drawing.Size(262, 22); - this.SMSVDPViewerToolStripMenuItem.Text = "&VDP Viewer"; - this.SMSVDPViewerToolStripMenuItem.Click += new System.EventHandler(this.SmsVdpViewerMenuItem_Click); - // - // GGGameGenieMenuItem - // - this.GGGameGenieMenuItem.Name = "GGGameGenieMenuItem"; - this.GGGameGenieMenuItem.Size = new System.Drawing.Size(262, 22); - this.GGGameGenieMenuItem.Text = "&Game Genie Encoder/Decoder"; - this.GGGameGenieMenuItem.Click += new System.EventHandler(this.GGGameGenieMenuItem_Click); - // - // TI83SubMenu - // - this.TI83SubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.SMSdisplayToolStripMenuItem.Name = "SMSdisplayToolStripMenuItem"; + this.SMSdisplayToolStripMenuItem.Size = new System.Drawing.Size(277, 22); + this.SMSdisplayToolStripMenuItem.Text = "Display Type"; + // + // SMSdisplayNtscToolStripMenuItem + // + this.SMSdisplayNtscToolStripMenuItem.Name = "SMSdisplayNtscToolStripMenuItem"; + this.SMSdisplayNtscToolStripMenuItem.Size = new System.Drawing.Size(104, 22); + this.SMSdisplayNtscToolStripMenuItem.Text = "NTSC"; + this.SMSdisplayNtscToolStripMenuItem.Click += new System.EventHandler(this.SMS_DisplayNTSC_Click); + // + // SMSdisplayPalToolStripMenuItem + // + this.SMSdisplayPalToolStripMenuItem.Name = "SMSdisplayPalToolStripMenuItem"; + this.SMSdisplayPalToolStripMenuItem.Size = new System.Drawing.Size(104, 22); + this.SMSdisplayPalToolStripMenuItem.Text = "PAL"; + this.SMSdisplayPalToolStripMenuItem.Click += new System.EventHandler(this.SMS_DisplayPAL_Click); + // + // SMSdisplayAutoToolStripMenuItem + // + this.SMSdisplayAutoToolStripMenuItem.Name = "SMSdisplayAutoToolStripMenuItem"; + this.SMSdisplayAutoToolStripMenuItem.Size = new System.Drawing.Size(104, 22); + this.SMSdisplayAutoToolStripMenuItem.Text = "Auto"; + this.SMSdisplayAutoToolStripMenuItem.Click += new System.EventHandler(this.SMS_DisplayAuto_Click); + // + // SMStoolStripMenuItem2 + // + this.SMStoolStripMenuItem2.Name = "SMStoolStripMenuItem2"; + this.SMStoolStripMenuItem2.Size = new System.Drawing.Size(274, 6); + // + // SMSenableBIOSToolStripMenuItem + // + this.SMSenableBIOSToolStripMenuItem.Name = "SMSenableBIOSToolStripMenuItem"; + this.SMSenableBIOSToolStripMenuItem.Size = new System.Drawing.Size(277, 22); + this.SMSenableBIOSToolStripMenuItem.Text = "Enable BIOS (Must be Enabled for TAS)"; + this.SMSenableBIOSToolStripMenuItem.Click += new System.EventHandler(this.SmsBiosMenuItem_Click); + // + // SMSEnableFMChipMenuItem + // + this.SMSEnableFMChipMenuItem.Name = "SMSEnableFMChipMenuItem"; + this.SMSEnableFMChipMenuItem.Size = new System.Drawing.Size(277, 22); + this.SMSEnableFMChipMenuItem.Text = "&Enable FM Chip"; + this.SMSEnableFMChipMenuItem.Click += new System.EventHandler(this.SmsEnableFmChipMenuItem_Click); + // + // SMSOverclockMenuItem + // + this.SMSOverclockMenuItem.Name = "SMSOverclockMenuItem"; + this.SMSOverclockMenuItem.Size = new System.Drawing.Size(277, 22); + this.SMSOverclockMenuItem.Text = "&Overclock when Known Safe"; + this.SMSOverclockMenuItem.Click += new System.EventHandler(this.SMSOverclockMenuItem_Click); + // + // SMSForceStereoMenuItem + // + this.SMSForceStereoMenuItem.Name = "SMSForceStereoMenuItem"; + this.SMSForceStereoMenuItem.Size = new System.Drawing.Size(277, 22); + this.SMSForceStereoMenuItem.Text = "&Force Stereo Separation"; + this.SMSForceStereoMenuItem.Click += new System.EventHandler(this.SMSForceStereoMenuItem_Click); + // + // SMSSpriteLimitMenuItem + // + this.SMSSpriteLimitMenuItem.Name = "SMSSpriteLimitMenuItem"; + this.SMSSpriteLimitMenuItem.Size = new System.Drawing.Size(277, 22); + this.SMSSpriteLimitMenuItem.Text = "Sprite &Limit"; + this.SMSSpriteLimitMenuItem.Click += new System.EventHandler(this.SMSSpriteLimitMenuItem_Click); + // + // SMSDisplayOverscanMenuItem + // + this.SMSDisplayOverscanMenuItem.Name = "SMSDisplayOverscanMenuItem"; + this.SMSDisplayOverscanMenuItem.Size = new System.Drawing.Size(277, 22); + this.SMSDisplayOverscanMenuItem.Text = "Display Overscan"; + this.SMSDisplayOverscanMenuItem.Click += new System.EventHandler(this.SMSDisplayOverscanMenuItem_Click); + // + // SMSFix3DGameDisplayToolStripMenuItem + // + this.SMSFix3DGameDisplayToolStripMenuItem.Name = "SMSFix3DGameDisplayToolStripMenuItem"; + this.SMSFix3DGameDisplayToolStripMenuItem.Size = new System.Drawing.Size(277, 22); + this.SMSFix3DGameDisplayToolStripMenuItem.Text = "Fix 3D Game Display"; + this.SMSFix3DGameDisplayToolStripMenuItem.Click += new System.EventHandler(this.SMSFix3DDisplayMenuItem_Click); + // + // ShowClippedRegionsMenuItem + // + this.ShowClippedRegionsMenuItem.Name = "ShowClippedRegionsMenuItem"; + this.ShowClippedRegionsMenuItem.Size = new System.Drawing.Size(277, 22); + this.ShowClippedRegionsMenuItem.Text = "&Show Clipped Regions"; + this.ShowClippedRegionsMenuItem.Click += new System.EventHandler(this.ShowClippedRegionsMenuItem_Click); + // + // HighlightActiveDisplayRegionMenuItem + // + this.HighlightActiveDisplayRegionMenuItem.Name = "HighlightActiveDisplayRegionMenuItem"; + this.HighlightActiveDisplayRegionMenuItem.Size = new System.Drawing.Size(277, 22); + this.HighlightActiveDisplayRegionMenuItem.Text = "&Highlight Active Display Region"; + this.HighlightActiveDisplayRegionMenuItem.Click += new System.EventHandler(this.HighlightActiveDisplayRegionMenuItem_Click); + // + // SMSGraphicsSettingsMenuItem + // + this.SMSGraphicsSettingsMenuItem.Name = "SMSGraphicsSettingsMenuItem"; + this.SMSGraphicsSettingsMenuItem.Size = new System.Drawing.Size(277, 22); + this.SMSGraphicsSettingsMenuItem.Text = "&Graphics Settings..."; + this.SMSGraphicsSettingsMenuItem.Click += new System.EventHandler(this.SMSGraphicsSettingsMenuItem_Click); + // + // toolStripSeparator24 + // + this.toolStripSeparator24.Name = "toolStripSeparator24"; + this.toolStripSeparator24.Size = new System.Drawing.Size(274, 6); + // + // SMSVDPViewerToolStripMenuItem + // + this.SMSVDPViewerToolStripMenuItem.Name = "SMSVDPViewerToolStripMenuItem"; + this.SMSVDPViewerToolStripMenuItem.Size = new System.Drawing.Size(277, 22); + this.SMSVDPViewerToolStripMenuItem.Text = "&VDP Viewer"; + this.SMSVDPViewerToolStripMenuItem.Click += new System.EventHandler(this.SmsVdpViewerMenuItem_Click); + // + // GGGameGenieMenuItem + // + this.GGGameGenieMenuItem.Name = "GGGameGenieMenuItem"; + this.GGGameGenieMenuItem.Size = new System.Drawing.Size(277, 22); + this.GGGameGenieMenuItem.Text = "&Game Genie Encoder/Decoder"; + this.GGGameGenieMenuItem.Click += new System.EventHandler(this.GGGameGenieMenuItem_Click); + // + // TI83SubMenu + // + this.TI83SubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.KeypadMenuItem, this.LoadTIFileMenuItem, this.toolStripSeparator13, this.AutoloadKeypadMenuItem, this.paletteToolStripMenuItem}); - this.TI83SubMenu.Name = "TI83SubMenu"; - this.TI83SubMenu.Size = new System.Drawing.Size(41, 17); - this.TI83SubMenu.Text = "TI83"; - this.TI83SubMenu.DropDownOpened += new System.EventHandler(this.TI83SubMenu_DropDownOpened); - // - // KeypadMenuItem - // - this.KeypadMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.calculator; - this.KeypadMenuItem.Name = "KeypadMenuItem"; - this.KeypadMenuItem.Size = new System.Drawing.Size(157, 22); - this.KeypadMenuItem.Text = "Keypad"; - this.KeypadMenuItem.Click += new System.EventHandler(this.KeypadMenuItem_Click); - // - // LoadTIFileMenuItem - // - this.LoadTIFileMenuItem.Name = "LoadTIFileMenuItem"; - this.LoadTIFileMenuItem.Size = new System.Drawing.Size(157, 22); - this.LoadTIFileMenuItem.Text = "Load TI-83 File..."; - this.LoadTIFileMenuItem.Click += new System.EventHandler(this.LoadTIFileMenuItem_Click); - // - // toolStripSeparator13 - // - this.toolStripSeparator13.Name = "toolStripSeparator13"; - this.toolStripSeparator13.Size = new System.Drawing.Size(154, 6); - // - // AutoloadKeypadMenuItem - // - this.AutoloadKeypadMenuItem.Checked = true; - this.AutoloadKeypadMenuItem.CheckState = System.Windows.Forms.CheckState.Checked; - this.AutoloadKeypadMenuItem.Name = "AutoloadKeypadMenuItem"; - this.AutoloadKeypadMenuItem.Size = new System.Drawing.Size(157, 22); - this.AutoloadKeypadMenuItem.Text = "Autoload Keypad"; - this.AutoloadKeypadMenuItem.Click += new System.EventHandler(this.AutoloadKeypadMenuItem_Click); - // - // paletteToolStripMenuItem - // - this.paletteToolStripMenuItem.Name = "paletteToolStripMenuItem"; - this.paletteToolStripMenuItem.Size = new System.Drawing.Size(157, 22); - this.paletteToolStripMenuItem.Text = "Palette..."; - this.paletteToolStripMenuItem.Click += new System.EventHandler(this.TI83PaletteMenuItem_Click); - // - // AtariSubMenu - // - this.AtariSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.TI83SubMenu.Name = "TI83SubMenu"; + this.TI83SubMenu.Size = new System.Drawing.Size(41, 19); + this.TI83SubMenu.Text = "TI83"; + this.TI83SubMenu.DropDownOpened += new System.EventHandler(this.TI83SubMenu_DropDownOpened); + // + // KeypadMenuItem + // + this.KeypadMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.calculator; + this.KeypadMenuItem.Name = "KeypadMenuItem"; + this.KeypadMenuItem.Size = new System.Drawing.Size(165, 22); + this.KeypadMenuItem.Text = "Keypad"; + this.KeypadMenuItem.Click += new System.EventHandler(this.KeypadMenuItem_Click); + // + // LoadTIFileMenuItem + // + this.LoadTIFileMenuItem.Name = "LoadTIFileMenuItem"; + this.LoadTIFileMenuItem.Size = new System.Drawing.Size(165, 22); + this.LoadTIFileMenuItem.Text = "Load TI-83 File..."; + this.LoadTIFileMenuItem.Click += new System.EventHandler(this.LoadTIFileMenuItem_Click); + // + // toolStripSeparator13 + // + this.toolStripSeparator13.Name = "toolStripSeparator13"; + this.toolStripSeparator13.Size = new System.Drawing.Size(162, 6); + // + // AutoloadKeypadMenuItem + // + this.AutoloadKeypadMenuItem.Checked = true; + this.AutoloadKeypadMenuItem.CheckState = System.Windows.Forms.CheckState.Checked; + this.AutoloadKeypadMenuItem.Name = "AutoloadKeypadMenuItem"; + this.AutoloadKeypadMenuItem.Size = new System.Drawing.Size(165, 22); + this.AutoloadKeypadMenuItem.Text = "Autoload Keypad"; + this.AutoloadKeypadMenuItem.Click += new System.EventHandler(this.AutoloadKeypadMenuItem_Click); + // + // paletteToolStripMenuItem + // + this.paletteToolStripMenuItem.Name = "paletteToolStripMenuItem"; + this.paletteToolStripMenuItem.Size = new System.Drawing.Size(165, 22); + this.paletteToolStripMenuItem.Text = "Palette..."; + this.paletteToolStripMenuItem.Click += new System.EventHandler(this.TI83PaletteMenuItem_Click); + // + // AtariSubMenu + // + this.AtariSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.AtariSettingsToolStripMenuItem}); - this.AtariSubMenu.Name = "AtariSubMenu"; - this.AtariSubMenu.Size = new System.Drawing.Size(42, 17); - this.AtariSubMenu.Text = "&Atari"; - // - // AtariSettingsToolStripMenuItem - // - this.AtariSettingsToolStripMenuItem.Name = "AtariSettingsToolStripMenuItem"; - this.AtariSettingsToolStripMenuItem.Size = new System.Drawing.Size(125, 22); - this.AtariSettingsToolStripMenuItem.Text = "Settings..."; - this.AtariSettingsToolStripMenuItem.Click += new System.EventHandler(this.AtariSettingsToolStripMenuItem_Click); - // - // A7800SubMenu - // - this.A7800SubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.AtariSubMenu.Name = "AtariSubMenu"; + this.AtariSubMenu.Size = new System.Drawing.Size(44, 19); + this.AtariSubMenu.Text = "&Atari"; + // + // AtariSettingsToolStripMenuItem + // + this.AtariSettingsToolStripMenuItem.Name = "AtariSettingsToolStripMenuItem"; + this.AtariSettingsToolStripMenuItem.Size = new System.Drawing.Size(125, 22); + this.AtariSettingsToolStripMenuItem.Text = "Settings..."; + this.AtariSettingsToolStripMenuItem.Click += new System.EventHandler(this.AtariSettingsToolStripMenuItem_Click); + // + // A7800SubMenu + // + this.A7800SubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.A7800ControllerSettingsMenuItem}); - this.A7800SubMenu.Name = "A7800SubMenu"; - this.A7800SubMenu.Size = new System.Drawing.Size(50, 17); - this.A7800SubMenu.Text = "&A7800"; - this.A7800SubMenu.DropDownOpened += new System.EventHandler(this.A7800SubMenu_DropDownOpened); - // - // A7800ControllerSettingsMenuItem - // - this.A7800ControllerSettingsMenuItem.Name = "A7800ControllerSettingsMenuItem"; - this.A7800ControllerSettingsMenuItem.Size = new System.Drawing.Size(125, 22); - this.A7800ControllerSettingsMenuItem.Text = "Settings..."; - this.A7800ControllerSettingsMenuItem.Click += new System.EventHandler(this.A7800SettingsToolStripMenuItem_Click); - // - // GBSubMenu - // - this.GBSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.A7800SubMenu.Name = "A7800SubMenu"; + this.A7800SubMenu.Size = new System.Drawing.Size(51, 19); + this.A7800SubMenu.Text = "&A7800"; + this.A7800SubMenu.DropDownOpened += new System.EventHandler(this.A7800SubMenu_DropDownOpened); + // + // A7800ControllerSettingsMenuItem + // + this.A7800ControllerSettingsMenuItem.Name = "A7800ControllerSettingsMenuItem"; + this.A7800ControllerSettingsMenuItem.Size = new System.Drawing.Size(125, 22); + this.A7800ControllerSettingsMenuItem.Text = "Settings..."; + this.A7800ControllerSettingsMenuItem.Click += new System.EventHandler(this.A7800SettingsToolStripMenuItem_Click); + // + // GBSubMenu + // + this.GBSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.GBcoreSettingsToolStripMenuItem, this.LoadGBInSGBMenuItem, this.toolStripSeparator28, this.GBGPUViewerMenuItem, this.GBGameGenieMenuItem}); - this.GBSubMenu.Name = "GBSubMenu"; - this.GBSubMenu.Size = new System.Drawing.Size(32, 17); - this.GBSubMenu.Text = "&GB"; - this.GBSubMenu.DropDownOpened += new System.EventHandler(this.GBSubMenu_DropDownOpened); - // - // GBcoreSettingsToolStripMenuItem - // - this.GBcoreSettingsToolStripMenuItem.Name = "GBcoreSettingsToolStripMenuItem"; - this.GBcoreSettingsToolStripMenuItem.Size = new System.Drawing.Size(217, 22); - this.GBcoreSettingsToolStripMenuItem.Text = "Settings..."; - this.GBcoreSettingsToolStripMenuItem.Click += new System.EventHandler(this.GBCoreSettingsMenuItem_Click); - // - // LoadGBInSGBMenuItem - // - this.LoadGBInSGBMenuItem.Name = "LoadGBInSGBMenuItem"; - this.LoadGBInSGBMenuItem.Size = new System.Drawing.Size(217, 22); - this.LoadGBInSGBMenuItem.Text = "Load GB in SGB"; - this.LoadGBInSGBMenuItem.Click += new System.EventHandler(this.LoadGbInSgbMenuItem_Click); - // - // toolStripSeparator28 - // - this.toolStripSeparator28.Name = "toolStripSeparator28"; - this.toolStripSeparator28.Size = new System.Drawing.Size(214, 6); - // - // GBGPUViewerMenuItem - // - this.GBGPUViewerMenuItem.Name = "GBGPUViewerMenuItem"; - this.GBGPUViewerMenuItem.Size = new System.Drawing.Size(217, 22); - this.GBGPUViewerMenuItem.Text = "GPU Viewer"; - this.GBGPUViewerMenuItem.Click += new System.EventHandler(this.GbGpuViewerMenuItem_Click); - // - // GBGameGenieMenuItem - // - this.GBGameGenieMenuItem.Name = "GBGameGenieMenuItem"; - this.GBGameGenieMenuItem.Size = new System.Drawing.Size(217, 22); - this.GBGameGenieMenuItem.Text = "&Game Genie Encoder/Decoder"; - this.GBGameGenieMenuItem.Click += new System.EventHandler(this.GBGameGenieMenuItem_Click); - // - // GBASubMenu - // - this.GBASubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.GBSubMenu.Name = "GBSubMenu"; + this.GBSubMenu.Size = new System.Drawing.Size(34, 19); + this.GBSubMenu.Text = "&GB"; + this.GBSubMenu.DropDownOpened += new System.EventHandler(this.GBSubMenu_DropDownOpened); + // + // GBcoreSettingsToolStripMenuItem + // + this.GBcoreSettingsToolStripMenuItem.Name = "GBcoreSettingsToolStripMenuItem"; + this.GBcoreSettingsToolStripMenuItem.Size = new System.Drawing.Size(233, 22); + this.GBcoreSettingsToolStripMenuItem.Text = "Settings..."; + this.GBcoreSettingsToolStripMenuItem.Click += new System.EventHandler(this.GBCoreSettingsMenuItem_Click); + // + // LoadGBInSGBMenuItem + // + this.LoadGBInSGBMenuItem.Name = "LoadGBInSGBMenuItem"; + this.LoadGBInSGBMenuItem.Size = new System.Drawing.Size(233, 22); + this.LoadGBInSGBMenuItem.Text = "Load GB in SGB"; + this.LoadGBInSGBMenuItem.Click += new System.EventHandler(this.LoadGbInSgbMenuItem_Click); + // + // toolStripSeparator28 + // + this.toolStripSeparator28.Name = "toolStripSeparator28"; + this.toolStripSeparator28.Size = new System.Drawing.Size(230, 6); + // + // GBGPUViewerMenuItem + // + this.GBGPUViewerMenuItem.Name = "GBGPUViewerMenuItem"; + this.GBGPUViewerMenuItem.Size = new System.Drawing.Size(233, 22); + this.GBGPUViewerMenuItem.Text = "GPU Viewer"; + this.GBGPUViewerMenuItem.Click += new System.EventHandler(this.GbGpuViewerMenuItem_Click); + // + // GBGameGenieMenuItem + // + this.GBGameGenieMenuItem.Name = "GBGameGenieMenuItem"; + this.GBGameGenieMenuItem.Size = new System.Drawing.Size(233, 22); + this.GBGameGenieMenuItem.Text = "&Game Genie Encoder/Decoder"; + this.GBGameGenieMenuItem.Click += new System.EventHandler(this.GBGameGenieMenuItem_Click); + // + // GBASubMenu + // + this.GBASubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.GBACoreSelectionSubMenu, this.GBAcoresettingsToolStripMenuItem1, this.toolStripSeparator33, this.GbaGpuViewerMenuItem}); - this.GBASubMenu.Name = "GBASubMenu"; - this.GBASubMenu.Size = new System.Drawing.Size(39, 17); - this.GBASubMenu.Text = "GBA"; - // - // GBACoreSelectionSubMenu - // - this.GBACoreSelectionSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.GBASubMenu.Name = "GBASubMenu"; + this.GBASubMenu.Size = new System.Drawing.Size(42, 19); + this.GBASubMenu.Text = "GBA"; + // + // GBACoreSelectionSubMenu + // + this.GBACoreSelectionSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.GBAmGBAMenuItem, this.GBAVBANextMenuItem}); - this.GBACoreSelectionSubMenu.Name = "GBACoreSelectionSubMenu"; - this.GBACoreSelectionSubMenu.Size = new System.Drawing.Size(129, 22); - this.GBACoreSelectionSubMenu.Text = "&Core"; - this.GBACoreSelectionSubMenu.DropDownOpened += new System.EventHandler(this.GBACoreSelectionSubMenu_DropDownOpened); - // - // GBAmGBAMenuItem - // - this.GBAmGBAMenuItem.Name = "GBAmGBAMenuItem"; - this.GBAmGBAMenuItem.Size = new System.Drawing.Size(120, 22); - this.GBAmGBAMenuItem.Text = "mGBA"; - this.GBAmGBAMenuItem.Click += new System.EventHandler(this.UsemGBAMenuItem_Click); - // - // GBAVBANextMenuItem - // - this.GBAVBANextMenuItem.Name = "GBAVBANextMenuItem"; - this.GBAVBANextMenuItem.Size = new System.Drawing.Size(120, 22); - this.GBAVBANextMenuItem.Text = "&VBA-Next"; - this.GBAVBANextMenuItem.Click += new System.EventHandler(this.UseVbaNextMenuItem_Click); - // - // GBAcoresettingsToolStripMenuItem1 - // - this.GBAcoresettingsToolStripMenuItem1.Name = "GBAcoresettingsToolStripMenuItem1"; - this.GBAcoresettingsToolStripMenuItem1.Size = new System.Drawing.Size(129, 22); - this.GBAcoresettingsToolStripMenuItem1.Text = "&Settings..."; - this.GBAcoresettingsToolStripMenuItem1.Click += new System.EventHandler(this.GBAcoresettingsToolStripMenuItem1_Click); - // - // toolStripSeparator33 - // - this.toolStripSeparator33.Name = "toolStripSeparator33"; - this.toolStripSeparator33.Size = new System.Drawing.Size(126, 6); - // - // GbaGpuViewerMenuItem - // - this.GbaGpuViewerMenuItem.Name = "GbaGpuViewerMenuItem"; - this.GbaGpuViewerMenuItem.Size = new System.Drawing.Size(129, 22); - this.GbaGpuViewerMenuItem.Text = "GPU Viewer"; - this.GbaGpuViewerMenuItem.Click += new System.EventHandler(this.GbaGpuViewerMenuItem_Click); - // - // PSXSubMenu - // - this.PSXSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.GBACoreSelectionSubMenu.Name = "GBACoreSelectionSubMenu"; + this.GBACoreSelectionSubMenu.Size = new System.Drawing.Size(135, 22); + this.GBACoreSelectionSubMenu.Text = "&Core"; + this.GBACoreSelectionSubMenu.DropDownOpened += new System.EventHandler(this.GBACoreSelectionSubMenu_DropDownOpened); + // + // GBAmGBAMenuItem + // + this.GBAmGBAMenuItem.Name = "GBAmGBAMenuItem"; + this.GBAmGBAMenuItem.Size = new System.Drawing.Size(125, 22); + this.GBAmGBAMenuItem.Text = "mGBA"; + this.GBAmGBAMenuItem.Click += new System.EventHandler(this.UsemGBAMenuItem_Click); + // + // GBAVBANextMenuItem + // + this.GBAVBANextMenuItem.Name = "GBAVBANextMenuItem"; + this.GBAVBANextMenuItem.Size = new System.Drawing.Size(125, 22); + this.GBAVBANextMenuItem.Text = "&VBA-Next"; + this.GBAVBANextMenuItem.Click += new System.EventHandler(this.UseVbaNextMenuItem_Click); + // + // GBAcoresettingsToolStripMenuItem1 + // + this.GBAcoresettingsToolStripMenuItem1.Name = "GBAcoresettingsToolStripMenuItem1"; + this.GBAcoresettingsToolStripMenuItem1.Size = new System.Drawing.Size(135, 22); + this.GBAcoresettingsToolStripMenuItem1.Text = "&Settings..."; + this.GBAcoresettingsToolStripMenuItem1.Click += new System.EventHandler(this.GBAcoresettingsToolStripMenuItem1_Click); + // + // toolStripSeparator33 + // + this.toolStripSeparator33.Name = "toolStripSeparator33"; + this.toolStripSeparator33.Size = new System.Drawing.Size(132, 6); + // + // GbaGpuViewerMenuItem + // + this.GbaGpuViewerMenuItem.Name = "GbaGpuViewerMenuItem"; + this.GbaGpuViewerMenuItem.Size = new System.Drawing.Size(135, 22); + this.GbaGpuViewerMenuItem.Text = "GPU Viewer"; + this.GbaGpuViewerMenuItem.Click += new System.EventHandler(this.GbaGpuViewerMenuItem_Click); + // + // PSXSubMenu + // + this.PSXSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.PSXControllerSettingsMenuItem, this.PSXOptionsMenuItem, this.PSXDiscControlsMenuItem, this.PSXHashDiscsToolStripMenuItem}); - this.PSXSubMenu.Name = "PSXSubMenu"; - this.PSXSubMenu.Size = new System.Drawing.Size(37, 17); - this.PSXSubMenu.Text = "PSX"; - this.PSXSubMenu.DropDownOpened += new System.EventHandler(this.PSXSubMenu_DropDownOpened); - // - // PSXControllerSettingsMenuItem - // - this.PSXControllerSettingsMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.GameController; - this.PSXControllerSettingsMenuItem.Name = "PSXControllerSettingsMenuItem"; - this.PSXControllerSettingsMenuItem.Size = new System.Drawing.Size(216, 22); - this.PSXControllerSettingsMenuItem.Text = "Controller / Memcard Settings"; - this.PSXControllerSettingsMenuItem.Click += new System.EventHandler(this.PSXControllerSettingsMenuItem_Click); - // - // PSXOptionsMenuItem - // - this.PSXOptionsMenuItem.Name = "PSXOptionsMenuItem"; - this.PSXOptionsMenuItem.Size = new System.Drawing.Size(216, 22); - this.PSXOptionsMenuItem.Text = "&Options"; - this.PSXOptionsMenuItem.Click += new System.EventHandler(this.PSXOptionsMenuItem_Click); - // - // PSXDiscControlsMenuItem - // - this.PSXDiscControlsMenuItem.Name = "PSXDiscControlsMenuItem"; - this.PSXDiscControlsMenuItem.Size = new System.Drawing.Size(216, 22); - this.PSXDiscControlsMenuItem.Text = "&Disc Controls"; - this.PSXDiscControlsMenuItem.Click += new System.EventHandler(this.PSXDiscControlsMenuItem_Click); - // - // PSXHashDiscsToolStripMenuItem - // - this.PSXHashDiscsToolStripMenuItem.Name = "PSXHashDiscsToolStripMenuItem"; - this.PSXHashDiscsToolStripMenuItem.Size = new System.Drawing.Size(216, 22); - this.PSXHashDiscsToolStripMenuItem.Text = "&Hash Discs"; - this.PSXHashDiscsToolStripMenuItem.Click += new System.EventHandler(this.PSXHashDiscsToolStripMenuItem_Click); - // - // SNESSubMenu - // - this.SNESSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.PSXSubMenu.Name = "PSXSubMenu"; + this.PSXSubMenu.Size = new System.Drawing.Size(39, 19); + this.PSXSubMenu.Text = "PSX"; + this.PSXSubMenu.DropDownOpened += new System.EventHandler(this.PSXSubMenu_DropDownOpened); + // + // PSXControllerSettingsMenuItem + // + this.PSXControllerSettingsMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.GameController; + this.PSXControllerSettingsMenuItem.Name = "PSXControllerSettingsMenuItem"; + this.PSXControllerSettingsMenuItem.Size = new System.Drawing.Size(234, 22); + this.PSXControllerSettingsMenuItem.Text = "Controller / Memcard Settings"; + this.PSXControllerSettingsMenuItem.Click += new System.EventHandler(this.PSXControllerSettingsMenuItem_Click); + // + // PSXOptionsMenuItem + // + this.PSXOptionsMenuItem.Name = "PSXOptionsMenuItem"; + this.PSXOptionsMenuItem.Size = new System.Drawing.Size(234, 22); + this.PSXOptionsMenuItem.Text = "&Options"; + this.PSXOptionsMenuItem.Click += new System.EventHandler(this.PSXOptionsMenuItem_Click); + // + // PSXDiscControlsMenuItem + // + this.PSXDiscControlsMenuItem.Name = "PSXDiscControlsMenuItem"; + this.PSXDiscControlsMenuItem.Size = new System.Drawing.Size(234, 22); + this.PSXDiscControlsMenuItem.Text = "&Disc Controls"; + this.PSXDiscControlsMenuItem.Click += new System.EventHandler(this.PSXDiscControlsMenuItem_Click); + // + // PSXHashDiscsToolStripMenuItem + // + this.PSXHashDiscsToolStripMenuItem.Name = "PSXHashDiscsToolStripMenuItem"; + this.PSXHashDiscsToolStripMenuItem.Size = new System.Drawing.Size(234, 22); + this.PSXHashDiscsToolStripMenuItem.Text = "&Hash Discs"; + this.PSXHashDiscsToolStripMenuItem.Click += new System.EventHandler(this.PSXHashDiscsToolStripMenuItem_Click); + // + // SNESSubMenu + // + this.SNESSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.SNESControllerConfigurationMenuItem, this.toolStripSeparator18, this.SnesGfxDebuggerMenuItem, this.SnesGBInSGBMenuItem, this.SnesGameGenieMenuItem, this.SnesOptionsMenuItem}); - this.SNESSubMenu.Name = "SNESSubMenu"; - this.SNESSubMenu.Size = new System.Drawing.Size(44, 17); - this.SNESSubMenu.Text = "&SNES"; - this.SNESSubMenu.DropDownOpened += new System.EventHandler(this.SNESSubMenu_DropDownOpened); - // - // SNESControllerConfigurationMenuItem - // - this.SNESControllerConfigurationMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.GameController; - this.SNESControllerConfigurationMenuItem.Name = "SNESControllerConfigurationMenuItem"; - this.SNESControllerConfigurationMenuItem.Size = new System.Drawing.Size(217, 22); - this.SNESControllerConfigurationMenuItem.Text = "Controller Configuration"; - this.SNESControllerConfigurationMenuItem.Click += new System.EventHandler(this.SNESControllerConfigurationMenuItem_Click); - // - // toolStripSeparator18 - // - this.toolStripSeparator18.Name = "toolStripSeparator18"; - this.toolStripSeparator18.Size = new System.Drawing.Size(214, 6); - // - // SnesGfxDebuggerMenuItem - // - this.SnesGfxDebuggerMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Bug; - this.SnesGfxDebuggerMenuItem.Name = "SnesGfxDebuggerMenuItem"; - this.SnesGfxDebuggerMenuItem.Size = new System.Drawing.Size(217, 22); - this.SnesGfxDebuggerMenuItem.Text = "Graphics Debugger"; - this.SnesGfxDebuggerMenuItem.Click += new System.EventHandler(this.SnesGfxDebuggerMenuItem_Click); - // - // SnesGBInSGBMenuItem - // - this.SnesGBInSGBMenuItem.Name = "SnesGBInSGBMenuItem"; - this.SnesGBInSGBMenuItem.Size = new System.Drawing.Size(217, 22); - this.SnesGBInSGBMenuItem.Text = "Load GB in SGB"; - this.SnesGBInSGBMenuItem.Click += new System.EventHandler(this.SnesGbInSgbMenuItem_Click); - // - // SnesGameGenieMenuItem - // - this.SnesGameGenieMenuItem.Name = "SnesGameGenieMenuItem"; - this.SnesGameGenieMenuItem.Size = new System.Drawing.Size(217, 22); - this.SnesGameGenieMenuItem.Text = "&Game Genie Encoder/Decoder"; - this.SnesGameGenieMenuItem.Click += new System.EventHandler(this.SnesGameGenieMenuItem_Click); - // - // SnesOptionsMenuItem - // - this.SnesOptionsMenuItem.Name = "SnesOptionsMenuItem"; - this.SnesOptionsMenuItem.Size = new System.Drawing.Size(217, 22); - this.SnesOptionsMenuItem.Text = "&Options"; - this.SnesOptionsMenuItem.Click += new System.EventHandler(this.SnesOptionsMenuItem_Click); - // - // ColecoSubMenu - // - this.ColecoSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.SNESSubMenu.Name = "SNESSubMenu"; + this.SNESSubMenu.Size = new System.Drawing.Size(46, 19); + this.SNESSubMenu.Text = "&SNES"; + this.SNESSubMenu.DropDownOpened += new System.EventHandler(this.SNESSubMenu_DropDownOpened); + // + // SNESControllerConfigurationMenuItem + // + this.SNESControllerConfigurationMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.GameController; + this.SNESControllerConfigurationMenuItem.Name = "SNESControllerConfigurationMenuItem"; + this.SNESControllerConfigurationMenuItem.Size = new System.Drawing.Size(233, 22); + this.SNESControllerConfigurationMenuItem.Text = "Controller Configuration"; + this.SNESControllerConfigurationMenuItem.Click += new System.EventHandler(this.SNESControllerConfigurationMenuItem_Click); + // + // toolStripSeparator18 + // + this.toolStripSeparator18.Name = "toolStripSeparator18"; + this.toolStripSeparator18.Size = new System.Drawing.Size(230, 6); + // + // SnesGfxDebuggerMenuItem + // + this.SnesGfxDebuggerMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Bug; + this.SnesGfxDebuggerMenuItem.Name = "SnesGfxDebuggerMenuItem"; + this.SnesGfxDebuggerMenuItem.Size = new System.Drawing.Size(233, 22); + this.SnesGfxDebuggerMenuItem.Text = "Graphics Debugger"; + this.SnesGfxDebuggerMenuItem.Click += new System.EventHandler(this.SnesGfxDebuggerMenuItem_Click); + // + // SnesGBInSGBMenuItem + // + this.SnesGBInSGBMenuItem.Name = "SnesGBInSGBMenuItem"; + this.SnesGBInSGBMenuItem.Size = new System.Drawing.Size(233, 22); + this.SnesGBInSGBMenuItem.Text = "Load GB in SGB"; + this.SnesGBInSGBMenuItem.Click += new System.EventHandler(this.SnesGbInSgbMenuItem_Click); + // + // SnesGameGenieMenuItem + // + this.SnesGameGenieMenuItem.Name = "SnesGameGenieMenuItem"; + this.SnesGameGenieMenuItem.Size = new System.Drawing.Size(233, 22); + this.SnesGameGenieMenuItem.Text = "&Game Genie Encoder/Decoder"; + this.SnesGameGenieMenuItem.Click += new System.EventHandler(this.SnesGameGenieMenuItem_Click); + // + // SnesOptionsMenuItem + // + this.SnesOptionsMenuItem.Name = "SnesOptionsMenuItem"; + this.SnesOptionsMenuItem.Size = new System.Drawing.Size(233, 22); + this.SnesOptionsMenuItem.Text = "&Options"; + this.SnesOptionsMenuItem.Click += new System.EventHandler(this.SnesOptionsMenuItem_Click); + // + // ColecoSubMenu + // + this.ColecoSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.ColecoControllerSettingsMenuItem, this.toolStripSeparator35, this.ColecoSkipBiosMenuItem}); - this.ColecoSubMenu.Name = "ColecoSubMenu"; - this.ColecoSubMenu.Size = new System.Drawing.Size(51, 17); - this.ColecoSubMenu.Text = "&Coleco"; - this.ColecoSubMenu.DropDownOpened += new System.EventHandler(this.ColecoSubMenu_DropDownOpened); - // - // ColecoControllerSettingsMenuItem - // - this.ColecoControllerSettingsMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.GameController; - this.ColecoControllerSettingsMenuItem.Name = "ColecoControllerSettingsMenuItem"; - this.ColecoControllerSettingsMenuItem.Size = new System.Drawing.Size(235, 22); - this.ColecoControllerSettingsMenuItem.Text = "&Controller Settings..."; - this.ColecoControllerSettingsMenuItem.Click += new System.EventHandler(this.ColecoControllerSettingsMenuItem_Click); - // - // toolStripSeparator35 - // - this.toolStripSeparator35.Name = "toolStripSeparator35"; - this.toolStripSeparator35.Size = new System.Drawing.Size(232, 6); - // - // ColecoSkipBiosMenuItem - // - this.ColecoSkipBiosMenuItem.Name = "ColecoSkipBiosMenuItem"; - this.ColecoSkipBiosMenuItem.Size = new System.Drawing.Size(235, 22); - this.ColecoSkipBiosMenuItem.Text = "&Skip BIOS intro (When Applicable)"; - this.ColecoSkipBiosMenuItem.Click += new System.EventHandler(this.ColecoSkipBiosMenuItem_Click); - // - // N64SubMenu - // - this.N64SubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.ColecoSubMenu.Name = "ColecoSubMenu"; + this.ColecoSubMenu.Size = new System.Drawing.Size(56, 19); + this.ColecoSubMenu.Text = "&Coleco"; + this.ColecoSubMenu.DropDownOpened += new System.EventHandler(this.ColecoSubMenu_DropDownOpened); + // + // ColecoControllerSettingsMenuItem + // + this.ColecoControllerSettingsMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.GameController; + this.ColecoControllerSettingsMenuItem.Name = "ColecoControllerSettingsMenuItem"; + this.ColecoControllerSettingsMenuItem.Size = new System.Drawing.Size(253, 22); + this.ColecoControllerSettingsMenuItem.Text = "&Controller Settings..."; + this.ColecoControllerSettingsMenuItem.Click += new System.EventHandler(this.ColecoControllerSettingsMenuItem_Click); + // + // toolStripSeparator35 + // + this.toolStripSeparator35.Name = "toolStripSeparator35"; + this.toolStripSeparator35.Size = new System.Drawing.Size(250, 6); + // + // ColecoSkipBiosMenuItem + // + this.ColecoSkipBiosMenuItem.Name = "ColecoSkipBiosMenuItem"; + this.ColecoSkipBiosMenuItem.Size = new System.Drawing.Size(253, 22); + this.ColecoSkipBiosMenuItem.Text = "&Skip BIOS intro (When Applicable)"; + this.ColecoSkipBiosMenuItem.Click += new System.EventHandler(this.ColecoSkipBiosMenuItem_Click); + // + // N64SubMenu + // + this.N64SubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.N64PluginSettingsMenuItem, this.N64ControllerSettingsMenuItem, this.toolStripSeparator23, this.N64CircularAnalogRangeMenuItem, this.MupenStyleLagMenuItem, this.N64ExpansionSlotMenuItem}); - this.N64SubMenu.Name = "N64SubMenu"; - this.N64SubMenu.Size = new System.Drawing.Size(38, 17); - this.N64SubMenu.Text = "N64"; - this.N64SubMenu.DropDownOpened += new System.EventHandler(this.N64SubMenu_DropDownOpened); - // - // N64PluginSettingsMenuItem - // - this.N64PluginSettingsMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("N64PluginSettingsMenuItem.Image"))); - this.N64PluginSettingsMenuItem.Name = "N64PluginSettingsMenuItem"; - this.N64PluginSettingsMenuItem.Size = new System.Drawing.Size(180, 22); - this.N64PluginSettingsMenuItem.Text = "Plugins"; - this.N64PluginSettingsMenuItem.Click += new System.EventHandler(this.N64PluginSettingsMenuItem_Click); - // - // N64ControllerSettingsMenuItem - // - this.N64ControllerSettingsMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.GameController; - this.N64ControllerSettingsMenuItem.Name = "N64ControllerSettingsMenuItem"; - this.N64ControllerSettingsMenuItem.Size = new System.Drawing.Size(180, 22); - this.N64ControllerSettingsMenuItem.Text = "Controller Settings..."; - this.N64ControllerSettingsMenuItem.Click += new System.EventHandler(this.N64ControllerSettingsMenuItem_Click); - // - // toolStripSeparator23 - // - this.toolStripSeparator23.Name = "toolStripSeparator23"; - this.toolStripSeparator23.Size = new System.Drawing.Size(177, 6); - // - // N64CircularAnalogRangeMenuItem - // - this.N64CircularAnalogRangeMenuItem.Name = "N64CircularAnalogRangeMenuItem"; - this.N64CircularAnalogRangeMenuItem.Size = new System.Drawing.Size(180, 22); - this.N64CircularAnalogRangeMenuItem.Text = "Circular Analog Range"; - this.N64CircularAnalogRangeMenuItem.Click += new System.EventHandler(this.N64CircularAnalogRangeMenuItem_Click); - // - // MupenStyleLagMenuItem - // - this.MupenStyleLagMenuItem.Name = "MupenStyleLagMenuItem"; - this.MupenStyleLagMenuItem.Size = new System.Drawing.Size(180, 22); - this.MupenStyleLagMenuItem.Text = "&Non-VI Lag Frames"; - this.MupenStyleLagMenuItem.Click += new System.EventHandler(this.MupenStyleLagMenuItem_Click); - // - // N64ExpansionSlotMenuItem - // - this.N64ExpansionSlotMenuItem.Name = "N64ExpansionSlotMenuItem"; - this.N64ExpansionSlotMenuItem.Size = new System.Drawing.Size(180, 22); - this.N64ExpansionSlotMenuItem.Text = "&Use Expansion Slot"; - this.N64ExpansionSlotMenuItem.Click += new System.EventHandler(this.N64ExpansionSlotMenuItem_Click); - // - // SaturnSubMenu - // - this.SaturnSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.N64SubMenu.Name = "N64SubMenu"; + this.N64SubMenu.Size = new System.Drawing.Size(40, 19); + this.N64SubMenu.Text = "N64"; + this.N64SubMenu.DropDownOpened += new System.EventHandler(this.N64SubMenu_DropDownOpened); + // + // N64PluginSettingsMenuItem + // + this.N64PluginSettingsMenuItem.Image = ((System.Drawing.Image)(resources.GetObject("N64PluginSettingsMenuItem.Image"))); + this.N64PluginSettingsMenuItem.Name = "N64PluginSettingsMenuItem"; + this.N64PluginSettingsMenuItem.Size = new System.Drawing.Size(192, 22); + this.N64PluginSettingsMenuItem.Text = "Plugins"; + this.N64PluginSettingsMenuItem.Click += new System.EventHandler(this.N64PluginSettingsMenuItem_Click); + // + // N64ControllerSettingsMenuItem + // + this.N64ControllerSettingsMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.GameController; + this.N64ControllerSettingsMenuItem.Name = "N64ControllerSettingsMenuItem"; + this.N64ControllerSettingsMenuItem.Size = new System.Drawing.Size(192, 22); + this.N64ControllerSettingsMenuItem.Text = "Controller Settings..."; + this.N64ControllerSettingsMenuItem.Click += new System.EventHandler(this.N64ControllerSettingsMenuItem_Click); + // + // toolStripSeparator23 + // + this.toolStripSeparator23.Name = "toolStripSeparator23"; + this.toolStripSeparator23.Size = new System.Drawing.Size(189, 6); + // + // N64CircularAnalogRangeMenuItem + // + this.N64CircularAnalogRangeMenuItem.Name = "N64CircularAnalogRangeMenuItem"; + this.N64CircularAnalogRangeMenuItem.Size = new System.Drawing.Size(192, 22); + this.N64CircularAnalogRangeMenuItem.Text = "Circular Analog Range"; + this.N64CircularAnalogRangeMenuItem.Click += new System.EventHandler(this.N64CircularAnalogRangeMenuItem_Click); + // + // MupenStyleLagMenuItem + // + this.MupenStyleLagMenuItem.Name = "MupenStyleLagMenuItem"; + this.MupenStyleLagMenuItem.Size = new System.Drawing.Size(192, 22); + this.MupenStyleLagMenuItem.Text = "&Non-VI Lag Frames"; + this.MupenStyleLagMenuItem.Click += new System.EventHandler(this.MupenStyleLagMenuItem_Click); + // + // N64ExpansionSlotMenuItem + // + this.N64ExpansionSlotMenuItem.Name = "N64ExpansionSlotMenuItem"; + this.N64ExpansionSlotMenuItem.Size = new System.Drawing.Size(192, 22); + this.N64ExpansionSlotMenuItem.Text = "&Use Expansion Slot"; + this.N64ExpansionSlotMenuItem.Click += new System.EventHandler(this.N64ExpansionSlotMenuItem_Click); + // + // SaturnSubMenu + // + this.SaturnSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.SaturnPreferencesMenuItem}); - this.SaturnSubMenu.Name = "SaturnSubMenu"; - this.SaturnSubMenu.Size = new System.Drawing.Size(51, 17); - this.SaturnSubMenu.Text = "&Saturn"; - // - // SaturnPreferencesMenuItem - // - this.SaturnPreferencesMenuItem.Name = "SaturnPreferencesMenuItem"; - this.SaturnPreferencesMenuItem.Size = new System.Drawing.Size(144, 22); - this.SaturnPreferencesMenuItem.Text = "Preferences..."; - this.SaturnPreferencesMenuItem.Click += new System.EventHandler(this.SaturnPreferencesMenuItem_Click); - // - // DGBSubMenu - // - this.DGBSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.SaturnSubMenu.Name = "SaturnSubMenu"; + this.SaturnSubMenu.Size = new System.Drawing.Size(53, 19); + this.SaturnSubMenu.Text = "&Saturn"; + // + // SaturnPreferencesMenuItem + // + this.SaturnPreferencesMenuItem.Name = "SaturnPreferencesMenuItem"; + this.SaturnPreferencesMenuItem.Size = new System.Drawing.Size(144, 22); + this.SaturnPreferencesMenuItem.Text = "Preferences..."; + this.SaturnPreferencesMenuItem.Click += new System.EventHandler(this.SaturnPreferencesMenuItem_Click); + // + // DGBSubMenu + // + this.DGBSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.DGBsettingsToolStripMenuItem}); - this.DGBSubMenu.Name = "DGBSubMenu"; - this.DGBSubMenu.Size = new System.Drawing.Size(53, 17); - this.DGBSubMenu.Text = "&GB Link"; - // - // DGBsettingsToolStripMenuItem - // - this.DGBsettingsToolStripMenuItem.Name = "DGBsettingsToolStripMenuItem"; - this.DGBsettingsToolStripMenuItem.Size = new System.Drawing.Size(125, 22); - this.DGBsettingsToolStripMenuItem.Text = "Settings..."; - this.DGBsettingsToolStripMenuItem.Click += new System.EventHandler(this.DgbSettingsMenuItem_Click); - // - // GenesisSubMenu - // - this.GenesisSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.DGBSubMenu.Name = "DGBSubMenu"; + this.DGBSubMenu.Size = new System.Drawing.Size(59, 19); + this.DGBSubMenu.Text = "&GB Link"; + // + // DGBsettingsToolStripMenuItem + // + this.DGBsettingsToolStripMenuItem.Name = "DGBsettingsToolStripMenuItem"; + this.DGBsettingsToolStripMenuItem.Size = new System.Drawing.Size(125, 22); + this.DGBsettingsToolStripMenuItem.Text = "Settings..."; + this.DGBsettingsToolStripMenuItem.Click += new System.EventHandler(this.DgbSettingsMenuItem_Click); + // + // GenesisSubMenu + // + this.GenesisSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.vDPViewerToolStripMenuItem, this.GenesisGameGenieECDC, this.toolStripSeparator26, this.GenesisSettingsToolStripMenuItem}); - this.GenesisSubMenu.Name = "GenesisSubMenu"; - this.GenesisSubMenu.Size = new System.Drawing.Size(56, 17); - this.GenesisSubMenu.Text = "&Genesis"; - // - // vDPViewerToolStripMenuItem - // - this.vDPViewerToolStripMenuItem.Name = "vDPViewerToolStripMenuItem"; - this.vDPViewerToolStripMenuItem.Size = new System.Drawing.Size(217, 22); - this.vDPViewerToolStripMenuItem.Text = "&VDP Viewer"; - this.vDPViewerToolStripMenuItem.Click += new System.EventHandler(this.GenVdpViewerMenuItem_Click); - // - // GenesisGameGenieECDC - // - this.GenesisGameGenieECDC.Name = "GenesisGameGenieECDC"; - this.GenesisGameGenieECDC.Size = new System.Drawing.Size(217, 22); - this.GenesisGameGenieECDC.Text = "&Game Genie Encoder/Decoder"; - this.GenesisGameGenieECDC.Click += new System.EventHandler(this.GenesisGameGenieEcDc_Click); - // - // toolStripSeparator26 - // - this.toolStripSeparator26.Name = "toolStripSeparator26"; - this.toolStripSeparator26.Size = new System.Drawing.Size(214, 6); - // - // GenesisSettingsToolStripMenuItem - // - this.GenesisSettingsToolStripMenuItem.Name = "GenesisSettingsToolStripMenuItem"; - this.GenesisSettingsToolStripMenuItem.Size = new System.Drawing.Size(217, 22); - this.GenesisSettingsToolStripMenuItem.Text = "&Settings..."; - this.GenesisSettingsToolStripMenuItem.Click += new System.EventHandler(this.GenesisSettingsMenuItem_Click); - // - // wonderSwanToolStripMenuItem - // - this.wonderSwanToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.GenesisSubMenu.Name = "GenesisSubMenu"; + this.GenesisSubMenu.Size = new System.Drawing.Size(59, 19); + this.GenesisSubMenu.Text = "&Genesis"; + // + // vDPViewerToolStripMenuItem + // + this.vDPViewerToolStripMenuItem.Name = "vDPViewerToolStripMenuItem"; + this.vDPViewerToolStripMenuItem.Size = new System.Drawing.Size(233, 22); + this.vDPViewerToolStripMenuItem.Text = "&VDP Viewer"; + this.vDPViewerToolStripMenuItem.Click += new System.EventHandler(this.GenVdpViewerMenuItem_Click); + // + // GenesisGameGenieECDC + // + this.GenesisGameGenieECDC.Name = "GenesisGameGenieECDC"; + this.GenesisGameGenieECDC.Size = new System.Drawing.Size(233, 22); + this.GenesisGameGenieECDC.Text = "&Game Genie Encoder/Decoder"; + this.GenesisGameGenieECDC.Click += new System.EventHandler(this.GenesisGameGenieEcDc_Click); + // + // toolStripSeparator26 + // + this.toolStripSeparator26.Name = "toolStripSeparator26"; + this.toolStripSeparator26.Size = new System.Drawing.Size(230, 6); + // + // GenesisSettingsToolStripMenuItem + // + this.GenesisSettingsToolStripMenuItem.Name = "GenesisSettingsToolStripMenuItem"; + this.GenesisSettingsToolStripMenuItem.Size = new System.Drawing.Size(233, 22); + this.GenesisSettingsToolStripMenuItem.Text = "&Settings..."; + this.GenesisSettingsToolStripMenuItem.Click += new System.EventHandler(this.GenesisSettingsMenuItem_Click); + // + // wonderSwanToolStripMenuItem + // + this.wonderSwanToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.settingsToolStripMenuItem}); - this.wonderSwanToolStripMenuItem.Name = "wonderSwanToolStripMenuItem"; - this.wonderSwanToolStripMenuItem.Size = new System.Drawing.Size(83, 17); - this.wonderSwanToolStripMenuItem.Text = "&WonderSwan"; - // - // settingsToolStripMenuItem - // - this.settingsToolStripMenuItem.Name = "settingsToolStripMenuItem"; - this.settingsToolStripMenuItem.Size = new System.Drawing.Size(125, 22); - this.settingsToolStripMenuItem.Text = "&Settings..."; - this.settingsToolStripMenuItem.Click += new System.EventHandler(this.WondersawnSettingsMenuItem_Click); - // - // AppleSubMenu - // - this.AppleSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.wonderSwanToolStripMenuItem.Name = "wonderSwanToolStripMenuItem"; + this.wonderSwanToolStripMenuItem.Size = new System.Drawing.Size(89, 19); + this.wonderSwanToolStripMenuItem.Text = "&WonderSwan"; + // + // settingsToolStripMenuItem + // + this.settingsToolStripMenuItem.Name = "settingsToolStripMenuItem"; + this.settingsToolStripMenuItem.Size = new System.Drawing.Size(125, 22); + this.settingsToolStripMenuItem.Text = "&Settings..."; + this.settingsToolStripMenuItem.Click += new System.EventHandler(this.WondersawnSettingsMenuItem_Click); + // + // AppleSubMenu + // + this.AppleSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.AppleDisksSubMenu, this.settingsToolStripMenuItem1}); - this.AppleSubMenu.Name = "AppleSubMenu"; - this.AppleSubMenu.Size = new System.Drawing.Size(46, 17); - this.AppleSubMenu.Text = "Apple"; - this.AppleSubMenu.DropDownOpened += new System.EventHandler(this.AppleSubMenu_DropDownOpened); - // - // AppleDisksSubMenu - // - this.AppleDisksSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.AppleSubMenu.Name = "AppleSubMenu"; + this.AppleSubMenu.Size = new System.Drawing.Size(50, 19); + this.AppleSubMenu.Text = "Apple"; + this.AppleSubMenu.DropDownOpened += new System.EventHandler(this.AppleSubMenu_DropDownOpened); + // + // AppleDisksSubMenu + // + this.AppleDisksSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.toolStripSeparator31}); - this.AppleDisksSubMenu.Name = "AppleDisksSubMenu"; - this.AppleDisksSubMenu.Size = new System.Drawing.Size(125, 22); - this.AppleDisksSubMenu.Text = "Disks"; - this.AppleDisksSubMenu.DropDownOpened += new System.EventHandler(this.AppleDisksSubMenu_DropDownOpened); - // - // toolStripSeparator31 - // - this.toolStripSeparator31.Name = "toolStripSeparator31"; - this.toolStripSeparator31.Size = new System.Drawing.Size(57, 6); - // - // settingsToolStripMenuItem1 - // - this.settingsToolStripMenuItem1.Name = "settingsToolStripMenuItem1"; - this.settingsToolStripMenuItem1.Size = new System.Drawing.Size(125, 22); - this.settingsToolStripMenuItem1.Text = "&Settings..."; - this.settingsToolStripMenuItem1.Click += new System.EventHandler(this.AppleIISettingsMenuItem_Click); - // - // C64SubMenu - // - this.C64SubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.AppleDisksSubMenu.Name = "AppleDisksSubMenu"; + this.AppleDisksSubMenu.Size = new System.Drawing.Size(125, 22); + this.AppleDisksSubMenu.Text = "Disks"; + this.AppleDisksSubMenu.DropDownOpened += new System.EventHandler(this.AppleDisksSubMenu_DropDownOpened); + // + // toolStripSeparator31 + // + this.toolStripSeparator31.Name = "toolStripSeparator31"; + this.toolStripSeparator31.Size = new System.Drawing.Size(57, 6); + // + // settingsToolStripMenuItem1 + // + this.settingsToolStripMenuItem1.Name = "settingsToolStripMenuItem1"; + this.settingsToolStripMenuItem1.Size = new System.Drawing.Size(125, 22); + this.settingsToolStripMenuItem1.Text = "&Settings..."; + this.settingsToolStripMenuItem1.Click += new System.EventHandler(this.AppleIISettingsMenuItem_Click); + // + // C64SubMenu + // + this.C64SubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.C64DisksSubMenu, this.C64SettingsMenuItem}); - this.C64SubMenu.Name = "C64SubMenu"; - this.C64SubMenu.Size = new System.Drawing.Size(38, 17); - this.C64SubMenu.Text = "&C64"; - this.C64SubMenu.DropDownOpened += new System.EventHandler(this.C64SubMenu_DropDownOpened); - // - // C64DisksSubMenu - // - this.C64DisksSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.C64SubMenu.Name = "C64SubMenu"; + this.C64SubMenu.Size = new System.Drawing.Size(39, 19); + this.C64SubMenu.Text = "&C64"; + this.C64SubMenu.DropDownOpened += new System.EventHandler(this.C64SubMenu_DropDownOpened); + // + // C64DisksSubMenu + // + this.C64DisksSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.toolStripSeparator36}); - this.C64DisksSubMenu.Name = "C64DisksSubMenu"; - this.C64DisksSubMenu.Size = new System.Drawing.Size(125, 22); - this.C64DisksSubMenu.Text = "Disks"; - this.C64DisksSubMenu.DropDownOpened += new System.EventHandler(this.C64DisksSubMenu_DropDownOpened); - // - // toolStripSeparator36 - // - this.toolStripSeparator36.Name = "toolStripSeparator36"; - this.toolStripSeparator36.Size = new System.Drawing.Size(57, 6); - // - // C64SettingsMenuItem - // - this.C64SettingsMenuItem.Name = "C64SettingsMenuItem"; - this.C64SettingsMenuItem.Size = new System.Drawing.Size(125, 22); - this.C64SettingsMenuItem.Text = "&Settings..."; - this.C64SettingsMenuItem.Click += new System.EventHandler(this.C64SettingsMenuItem_Click); - // - // IntvSubMenu - // - this.IntvSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.C64DisksSubMenu.Name = "C64DisksSubMenu"; + this.C64DisksSubMenu.Size = new System.Drawing.Size(125, 22); + this.C64DisksSubMenu.Text = "Disks"; + this.C64DisksSubMenu.DropDownOpened += new System.EventHandler(this.C64DisksSubMenu_DropDownOpened); + // + // toolStripSeparator36 + // + this.toolStripSeparator36.Name = "toolStripSeparator36"; + this.toolStripSeparator36.Size = new System.Drawing.Size(57, 6); + // + // C64SettingsMenuItem + // + this.C64SettingsMenuItem.Name = "C64SettingsMenuItem"; + this.C64SettingsMenuItem.Size = new System.Drawing.Size(125, 22); + this.C64SettingsMenuItem.Text = "&Settings..."; + this.C64SettingsMenuItem.Click += new System.EventHandler(this.C64SettingsMenuItem_Click); + // + // IntvSubMenu + // + this.IntvSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.IntVControllerSettingsMenuItem}); - this.IntvSubMenu.Name = "IntvSubMenu"; - this.IntvSubMenu.Size = new System.Drawing.Size(39, 17); - this.IntvSubMenu.Text = "&Intv"; - this.IntvSubMenu.DropDownOpened += new System.EventHandler(this.IntvSubMenu_DropDownOpened); - // - // IntVControllerSettingsMenuItem - // - this.IntVControllerSettingsMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.GameController; - this.IntVControllerSettingsMenuItem.Name = "IntVControllerSettingsMenuItem"; - this.IntVControllerSettingsMenuItem.Size = new System.Drawing.Size(175, 22); - this.IntVControllerSettingsMenuItem.Text = "Controller Settings..."; - this.IntVControllerSettingsMenuItem.Click += new System.EventHandler(this.IntVControllerSettingsMenuItem_Click); - // - // sNESToolStripMenuItem - // - this.sNESToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.IntvSubMenu.Name = "IntvSubMenu"; + this.IntvSubMenu.Size = new System.Drawing.Size(39, 19); + this.IntvSubMenu.Text = "&Intv"; + this.IntvSubMenu.DropDownOpened += new System.EventHandler(this.IntvSubMenu_DropDownOpened); + // + // IntVControllerSettingsMenuItem + // + this.IntVControllerSettingsMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.GameController; + this.IntVControllerSettingsMenuItem.Name = "IntVControllerSettingsMenuItem"; + this.IntVControllerSettingsMenuItem.Size = new System.Drawing.Size(181, 22); + this.IntVControllerSettingsMenuItem.Text = "Controller Settings..."; + this.IntVControllerSettingsMenuItem.Click += new System.EventHandler(this.IntVControllerSettingsMenuItem_Click); + // + // sNESToolStripMenuItem + // + this.sNESToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.preferencesToolStripMenuItem}); - this.sNESToolStripMenuItem.Name = "sNESToolStripMenuItem"; - this.sNESToolStripMenuItem.Size = new System.Drawing.Size(44, 17); - this.sNESToolStripMenuItem.Text = "&SNES"; - // - // preferencesToolStripMenuItem - // - this.preferencesToolStripMenuItem.Name = "preferencesToolStripMenuItem"; - this.preferencesToolStripMenuItem.Size = new System.Drawing.Size(144, 22); - this.preferencesToolStripMenuItem.Text = "Preferences..."; - this.preferencesToolStripMenuItem.Click += new System.EventHandler(this.preferencesToolStripMenuItem_Click); - // - // virtualBoyToolStripMenuItem - // - this.virtualBoyToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.sNESToolStripMenuItem.Name = "sNESToolStripMenuItem"; + this.sNESToolStripMenuItem.Size = new System.Drawing.Size(46, 19); + this.sNESToolStripMenuItem.Text = "&SNES"; + // + // preferencesToolStripMenuItem + // + this.preferencesToolStripMenuItem.Name = "preferencesToolStripMenuItem"; + this.preferencesToolStripMenuItem.Size = new System.Drawing.Size(144, 22); + this.preferencesToolStripMenuItem.Text = "Preferences..."; + this.preferencesToolStripMenuItem.Click += new System.EventHandler(this.preferencesToolStripMenuItem_Click); + // + // pCFXToolStripMenuItem + // + this.pCFXToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.preferencesToolStripMenuItem3}); + this.pCFXToolStripMenuItem.Name = "pCFXToolStripMenuItem"; + this.pCFXToolStripMenuItem.Size = new System.Drawing.Size(52, 19); + this.pCFXToolStripMenuItem.Text = "&PC-FX"; + // + // preferencesToolStripMenuItem3 + // + this.preferencesToolStripMenuItem3.Name = "preferencesToolStripMenuItem3"; + this.preferencesToolStripMenuItem3.Size = new System.Drawing.Size(144, 22); + this.preferencesToolStripMenuItem3.Text = "Preferences..."; + this.preferencesToolStripMenuItem3.Click += new System.EventHandler(this.preferencesToolStripMenuItem3_Click); + // + // virtualBoyToolStripMenuItem + // + this.virtualBoyToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.preferencesToolStripMenuItem1}); - this.virtualBoyToolStripMenuItem.Name = "virtualBoyToolStripMenuItem"; - this.virtualBoyToolStripMenuItem.Size = new System.Drawing.Size(67, 17); - this.virtualBoyToolStripMenuItem.Text = "&VirtualBoy"; - // - // preferencesToolStripMenuItem1 - // - this.preferencesToolStripMenuItem1.Name = "preferencesToolStripMenuItem1"; - this.preferencesToolStripMenuItem1.Size = new System.Drawing.Size(152, 22); - this.preferencesToolStripMenuItem1.Text = "Preferences..."; - this.preferencesToolStripMenuItem1.Click += new System.EventHandler(this.preferencesToolStripMenuItem1_Click); - // - // neoGeoPocketToolStripMenuItem - // - this.neoGeoPocketToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.virtualBoyToolStripMenuItem.Name = "virtualBoyToolStripMenuItem"; + this.virtualBoyToolStripMenuItem.Size = new System.Drawing.Size(73, 19); + this.virtualBoyToolStripMenuItem.Text = "&VirtualBoy"; + // + // preferencesToolStripMenuItem1 + // + this.preferencesToolStripMenuItem1.Name = "preferencesToolStripMenuItem1"; + this.preferencesToolStripMenuItem1.Size = new System.Drawing.Size(144, 22); + this.preferencesToolStripMenuItem1.Text = "Preferences..."; + this.preferencesToolStripMenuItem1.Click += new System.EventHandler(this.preferencesToolStripMenuItem1_Click); + // + // neoGeoPocketToolStripMenuItem + // + this.neoGeoPocketToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.preferencesToolStripMenuItem2}); - this.neoGeoPocketToolStripMenuItem.Name = "neoGeoPocketToolStripMenuItem"; - this.neoGeoPocketToolStripMenuItem.Size = new System.Drawing.Size(92, 17); - this.neoGeoPocketToolStripMenuItem.Text = "&NeoGeo Pocket"; - // - // preferencesToolStripMenuItem2 - // - this.preferencesToolStripMenuItem2.Name = "preferencesToolStripMenuItem2"; - this.preferencesToolStripMenuItem2.Size = new System.Drawing.Size(144, 22); - this.preferencesToolStripMenuItem2.Text = "Preferences..."; - this.preferencesToolStripMenuItem2.Click += new System.EventHandler(this.preferencesToolStripMenuItem2_Click); - // - // HelpSubMenu - // - this.HelpSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.neoGeoPocketToolStripMenuItem.Name = "neoGeoPocketToolStripMenuItem"; + this.neoGeoPocketToolStripMenuItem.Size = new System.Drawing.Size(101, 19); + this.neoGeoPocketToolStripMenuItem.Text = "&NeoGeo Pocket"; + // + // preferencesToolStripMenuItem2 + // + this.preferencesToolStripMenuItem2.Name = "preferencesToolStripMenuItem2"; + this.preferencesToolStripMenuItem2.Size = new System.Drawing.Size(144, 22); + this.preferencesToolStripMenuItem2.Text = "Preferences..."; + this.preferencesToolStripMenuItem2.Click += new System.EventHandler(this.preferencesToolStripMenuItem2_Click); + // + // HelpSubMenu + // + this.HelpSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.OnlineHelpMenuItem, this.ForumsMenuItem, this.FeaturesMenuItem, this.AboutMenuItem}); - this.HelpSubMenu.Name = "HelpSubMenu"; - this.HelpSubMenu.Size = new System.Drawing.Size(40, 17); - this.HelpSubMenu.Text = "&Help"; - this.HelpSubMenu.DropDownOpened += new System.EventHandler(this.HelpSubMenu_DropDownOpened); - // - // OnlineHelpMenuItem - // - this.OnlineHelpMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Help; - this.OnlineHelpMenuItem.Name = "OnlineHelpMenuItem"; - this.OnlineHelpMenuItem.Size = new System.Drawing.Size(140, 22); - this.OnlineHelpMenuItem.Text = "&Online Help..."; - this.OnlineHelpMenuItem.Click += new System.EventHandler(this.OnlineHelpMenuItem_Click); - // - // ForumsMenuItem - // - this.ForumsMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.TAStudio; - this.ForumsMenuItem.Name = "ForumsMenuItem"; - this.ForumsMenuItem.Size = new System.Drawing.Size(140, 22); - this.ForumsMenuItem.Text = "Forums..."; - this.ForumsMenuItem.Click += new System.EventHandler(this.ForumsMenuItem_Click); - // - // FeaturesMenuItem - // - this.FeaturesMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.kitchensink; - this.FeaturesMenuItem.Name = "FeaturesMenuItem"; - this.FeaturesMenuItem.Size = new System.Drawing.Size(140, 22); - this.FeaturesMenuItem.Text = "&Features"; - this.FeaturesMenuItem.Click += new System.EventHandler(this.FeaturesMenuItem_Click); - // - // AboutMenuItem - // - this.AboutMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.CorpHawkSmall; - this.AboutMenuItem.Name = "AboutMenuItem"; - this.AboutMenuItem.Size = new System.Drawing.Size(140, 22); - this.AboutMenuItem.Text = "&About"; - this.AboutMenuItem.Click += new System.EventHandler(this.AboutMenuItem_Click); - // - // MainStatusBar - // - this.MainStatusBar.ClickThrough = true; - this.MainStatusBar.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.HelpSubMenu.Name = "HelpSubMenu"; + this.HelpSubMenu.Size = new System.Drawing.Size(44, 19); + this.HelpSubMenu.Text = "&Help"; + this.HelpSubMenu.DropDownOpened += new System.EventHandler(this.HelpSubMenu_DropDownOpened); + // + // OnlineHelpMenuItem + // + this.OnlineHelpMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Help; + this.OnlineHelpMenuItem.Name = "OnlineHelpMenuItem"; + this.OnlineHelpMenuItem.Size = new System.Drawing.Size(146, 22); + this.OnlineHelpMenuItem.Text = "&Online Help..."; + this.OnlineHelpMenuItem.Click += new System.EventHandler(this.OnlineHelpMenuItem_Click); + // + // ForumsMenuItem + // + this.ForumsMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.TAStudio; + this.ForumsMenuItem.Name = "ForumsMenuItem"; + this.ForumsMenuItem.Size = new System.Drawing.Size(146, 22); + this.ForumsMenuItem.Text = "Forums..."; + this.ForumsMenuItem.Click += new System.EventHandler(this.ForumsMenuItem_Click); + // + // FeaturesMenuItem + // + this.FeaturesMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.kitchensink; + this.FeaturesMenuItem.Name = "FeaturesMenuItem"; + this.FeaturesMenuItem.Size = new System.Drawing.Size(146, 22); + this.FeaturesMenuItem.Text = "&Features"; + this.FeaturesMenuItem.Click += new System.EventHandler(this.FeaturesMenuItem_Click); + // + // AboutMenuItem + // + this.AboutMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.CorpHawkSmall; + this.AboutMenuItem.Name = "AboutMenuItem"; + this.AboutMenuItem.Size = new System.Drawing.Size(146, 22); + this.AboutMenuItem.Text = "&About"; + this.AboutMenuItem.Click += new System.EventHandler(this.AboutMenuItem_Click); + // + // MainStatusBar + // + this.MainStatusBar.ClickThrough = true; + this.MainStatusBar.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.DumpStatusButton, this.EmuStatus, this.PlayRecordStatusButton, @@ -3311,224 +3326,224 @@ this.ProfileFirstBootLabel, this.LinkConnectStatusBarButton, this.UpdateNotification}); - this.MainStatusBar.Location = new System.Drawing.Point(0, 386); - this.MainStatusBar.Name = "MainStatusBar"; - this.MainStatusBar.ShowItemToolTips = true; - this.MainStatusBar.Size = new System.Drawing.Size(470, 22); - this.MainStatusBar.SizingGrip = false; - this.MainStatusBar.TabIndex = 1; - this.MainStatusBar.Text = "0"; - // - // DumpStatusButton - // - this.DumpStatusButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.DumpStatusButton.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Blank; - this.DumpStatusButton.ImageTransparentColor = System.Drawing.Color.Magenta; - this.DumpStatusButton.Name = "DumpStatusButton"; - this.DumpStatusButton.ShowDropDownArrow = false; - this.DumpStatusButton.Size = new System.Drawing.Size(20, 20); - this.DumpStatusButton.Text = "No ROM loaded"; - this.DumpStatusButton.Click += new System.EventHandler(this.DumpStatusButton_Click); - // - // EmuStatus - // - this.EmuStatus.Name = "EmuStatus"; - this.EmuStatus.Size = new System.Drawing.Size(0, 17); - // - // PlayRecordStatusButton - // - this.PlayRecordStatusButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.PlayRecordStatusButton.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Blank; - this.PlayRecordStatusButton.ImageTransparentColor = System.Drawing.Color.Magenta; - this.PlayRecordStatusButton.Name = "PlayRecordStatusButton"; - this.PlayRecordStatusButton.ShowDropDownArrow = false; - this.PlayRecordStatusButton.Size = new System.Drawing.Size(20, 20); - this.PlayRecordStatusButton.Text = "No movie is active"; - // - // PauseStatusButton - // - this.PauseStatusButton.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right; - this.PauseStatusButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.PauseStatusButton.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Blank; - this.PauseStatusButton.ImageTransparentColor = System.Drawing.Color.Magenta; - this.PauseStatusButton.Name = "PauseStatusButton"; - this.PauseStatusButton.ShowDropDownArrow = false; - this.PauseStatusButton.Size = new System.Drawing.Size(20, 20); - this.PauseStatusButton.Text = "toolStripDropDownButton1"; - this.PauseStatusButton.ToolTipText = "Emulator is paused"; - this.PauseStatusButton.Click += new System.EventHandler(this.PauseMenuItem_Click); - // - // RebootStatusBarIcon - // - this.RebootStatusBarIcon.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.RebootStatusBarIcon.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.reboot; - this.RebootStatusBarIcon.Name = "RebootStatusBarIcon"; - this.RebootStatusBarIcon.RightToLeft = System.Windows.Forms.RightToLeft.No; - this.RebootStatusBarIcon.Size = new System.Drawing.Size(16, 17); - this.RebootStatusBarIcon.Text = "Reboot"; - this.RebootStatusBarIcon.ToolTipText = "A reboot of the core is needed for a setting change to take effect"; - this.RebootStatusBarIcon.Click += new System.EventHandler(this.PowerMenuItem_Click); - // - // AVIStatusLabel - // - this.AVIStatusLabel.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.AVIStatusLabel.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Blank; - this.AVIStatusLabel.Name = "AVIStatusLabel"; - this.AVIStatusLabel.Size = new System.Drawing.Size(16, 17); - this.AVIStatusLabel.Text = "AVI Capture"; - // - // LedLightStatusLabel - // - this.LedLightStatusLabel.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.LightOff; - this.LedLightStatusLabel.Name = "LedLightStatusLabel"; - this.LedLightStatusLabel.Size = new System.Drawing.Size(16, 17); - this.LedLightStatusLabel.ToolTipText = "Disk Drive LED Light"; - // - // SaveSlotsStatusLabel - // - this.SaveSlotsStatusLabel.BackColor = System.Drawing.SystemColors.Control; - this.SaveSlotsStatusLabel.Name = "SaveSlotsStatusLabel"; - this.SaveSlotsStatusLabel.Size = new System.Drawing.Size(56, 17); - this.SaveSlotsStatusLabel.Text = "Save slots"; - // - // Slot1StatusButton - // - this.Slot1StatusButton.Name = "Slot1StatusButton"; - this.Slot1StatusButton.Size = new System.Drawing.Size(13, 17); - this.Slot1StatusButton.Text = "1"; - this.Slot1StatusButton.ToolTipText = "Save slot 1"; - this.Slot1StatusButton.MouseUp += new System.Windows.Forms.MouseEventHandler(this.SlotStatusButtons_MouseUp); - // - // Slot2StatusButton - // - this.Slot2StatusButton.Name = "Slot2StatusButton"; - this.Slot2StatusButton.Size = new System.Drawing.Size(13, 17); - this.Slot2StatusButton.Text = "2"; - this.Slot2StatusButton.ToolTipText = "Save slot 2"; - this.Slot2StatusButton.MouseUp += new System.Windows.Forms.MouseEventHandler(this.SlotStatusButtons_MouseUp); - // - // Slot3StatusButton - // - this.Slot3StatusButton.Name = "Slot3StatusButton"; - this.Slot3StatusButton.Size = new System.Drawing.Size(13, 17); - this.Slot3StatusButton.Text = "3"; - this.Slot3StatusButton.ToolTipText = "Save slot 3"; - this.Slot3StatusButton.MouseUp += new System.Windows.Forms.MouseEventHandler(this.SlotStatusButtons_MouseUp); - // - // Slot4StatusButton - // - this.Slot4StatusButton.Name = "Slot4StatusButton"; - this.Slot4StatusButton.Size = new System.Drawing.Size(13, 17); - this.Slot4StatusButton.Text = "4"; - this.Slot4StatusButton.ToolTipText = "Save slot 4"; - this.Slot4StatusButton.MouseUp += new System.Windows.Forms.MouseEventHandler(this.SlotStatusButtons_MouseUp); - // - // Slot5StatusButton - // - this.Slot5StatusButton.Name = "Slot5StatusButton"; - this.Slot5StatusButton.Size = new System.Drawing.Size(13, 17); - this.Slot5StatusButton.Text = "5"; - this.Slot5StatusButton.ToolTipText = "Save slot 5"; - this.Slot5StatusButton.MouseUp += new System.Windows.Forms.MouseEventHandler(this.SlotStatusButtons_MouseUp); - // - // Slot6StatusButton - // - this.Slot6StatusButton.Name = "Slot6StatusButton"; - this.Slot6StatusButton.Size = new System.Drawing.Size(13, 17); - this.Slot6StatusButton.Text = "6"; - this.Slot6StatusButton.ToolTipText = "Save slot 6"; - this.Slot6StatusButton.MouseUp += new System.Windows.Forms.MouseEventHandler(this.SlotStatusButtons_MouseUp); - // - // Slot7StatusButton - // - this.Slot7StatusButton.Name = "Slot7StatusButton"; - this.Slot7StatusButton.Size = new System.Drawing.Size(13, 17); - this.Slot7StatusButton.Text = "7"; - this.Slot7StatusButton.ToolTipText = "Save slot 7"; - this.Slot7StatusButton.MouseUp += new System.Windows.Forms.MouseEventHandler(this.SlotStatusButtons_MouseUp); - // - // Slot8StatusButton - // - this.Slot8StatusButton.Name = "Slot8StatusButton"; - this.Slot8StatusButton.Size = new System.Drawing.Size(13, 17); - this.Slot8StatusButton.Text = "8"; - this.Slot8StatusButton.ToolTipText = "Save slot 8"; - this.Slot8StatusButton.MouseUp += new System.Windows.Forms.MouseEventHandler(this.SlotStatusButtons_MouseUp); - // - // Slot9StatusButton - // - this.Slot9StatusButton.Name = "Slot9StatusButton"; - this.Slot9StatusButton.Size = new System.Drawing.Size(13, 17); - this.Slot9StatusButton.Text = "9"; - this.Slot9StatusButton.ToolTipText = "Save slot 9"; - this.Slot9StatusButton.MouseUp += new System.Windows.Forms.MouseEventHandler(this.SlotStatusButtons_MouseUp); - // - // Slot0StatusButton - // - this.Slot0StatusButton.Name = "Slot0StatusButton"; - this.Slot0StatusButton.Size = new System.Drawing.Size(13, 17); - this.Slot0StatusButton.Text = "0"; - this.Slot0StatusButton.ToolTipText = "Save slot 0"; - this.Slot0StatusButton.MouseUp += new System.Windows.Forms.MouseEventHandler(this.SlotStatusButtons_MouseUp); - // - // CheatStatusButton - // - this.CheatStatusButton.Name = "CheatStatusButton"; - this.CheatStatusButton.Size = new System.Drawing.Size(0, 17); - this.CheatStatusButton.Click += new System.EventHandler(this.FreezeStatus_Click); - // - // KeyPriorityStatusLabel - // - this.KeyPriorityStatusLabel.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.KeyPriorityStatusLabel.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Both; - this.KeyPriorityStatusLabel.Margin = new System.Windows.Forms.Padding(5, 3, 5, 0); - this.KeyPriorityStatusLabel.Name = "KeyPriorityStatusLabel"; - this.KeyPriorityStatusLabel.Size = new System.Drawing.Size(16, 19); - this.KeyPriorityStatusLabel.Text = "KeyPriority"; - this.KeyPriorityStatusLabel.Click += new System.EventHandler(this.KeyPriorityStatusLabel_Click); - // - // CoreNameStatusBarButton - // - this.CoreNameStatusBarButton.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.CorpHawkSmall; - this.CoreNameStatusBarButton.Name = "CoreNameStatusBarButton"; - this.CoreNameStatusBarButton.Size = new System.Drawing.Size(66, 17); - this.CoreNameStatusBarButton.Text = "Neshawk"; - // - // ProfileFirstBootLabel - // - this.ProfileFirstBootLabel.AutoToolTip = true; - this.ProfileFirstBootLabel.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.ProfileFirstBootLabel.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.user_blue_small; - this.ProfileFirstBootLabel.Name = "ProfileFirstBootLabel"; - this.ProfileFirstBootLabel.Size = new System.Drawing.Size(16, 17); - this.ProfileFirstBootLabel.Text = "ProfileFirstBootLabel"; - this.ProfileFirstBootLabel.ToolTipText = "Set up your profile before use"; - this.ProfileFirstBootLabel.Visible = false; - this.ProfileFirstBootLabel.Click += new System.EventHandler(this.ProfileFirstBootLabel_Click); - // - // LinkConnectStatusBarButton - // - this.LinkConnectStatusBarButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; - this.LinkConnectStatusBarButton.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.connect_16x16; - this.LinkConnectStatusBarButton.Name = "LinkConnectStatusBarButton"; - this.LinkConnectStatusBarButton.Size = new System.Drawing.Size(16, 17); - this.LinkConnectStatusBarButton.Text = "Link connection is currently enabled"; - this.LinkConnectStatusBarButton.ToolTipText = "Link connection is currently enabled"; - // - // UpdateNotification - // - this.UpdateNotification.IsLink = true; - this.UpdateNotification.LinkColor = System.Drawing.Color.Red; - this.UpdateNotification.Name = "UpdateNotification"; - this.UpdateNotification.Size = new System.Drawing.Size(53, 17); - this.UpdateNotification.Spring = true; - this.UpdateNotification.Text = "New version available!"; - this.UpdateNotification.TextAlign = System.Drawing.ContentAlignment.MiddleRight; - this.UpdateNotification.Click += new System.EventHandler(this.UpdateNotification_Click); - // - // MainFormContextMenu - // - this.MainFormContextMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.MainStatusBar.Location = new System.Drawing.Point(0, 386); + this.MainStatusBar.Name = "MainStatusBar"; + this.MainStatusBar.ShowItemToolTips = true; + this.MainStatusBar.Size = new System.Drawing.Size(470, 22); + this.MainStatusBar.SizingGrip = false; + this.MainStatusBar.TabIndex = 1; + this.MainStatusBar.Text = "0"; + // + // DumpStatusButton + // + this.DumpStatusButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.DumpStatusButton.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Blank; + this.DumpStatusButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.DumpStatusButton.Name = "DumpStatusButton"; + this.DumpStatusButton.ShowDropDownArrow = false; + this.DumpStatusButton.Size = new System.Drawing.Size(20, 20); + this.DumpStatusButton.Text = "No ROM loaded"; + this.DumpStatusButton.Click += new System.EventHandler(this.DumpStatusButton_Click); + // + // EmuStatus + // + this.EmuStatus.Name = "EmuStatus"; + this.EmuStatus.Size = new System.Drawing.Size(0, 17); + // + // PlayRecordStatusButton + // + this.PlayRecordStatusButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.PlayRecordStatusButton.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Blank; + this.PlayRecordStatusButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.PlayRecordStatusButton.Name = "PlayRecordStatusButton"; + this.PlayRecordStatusButton.ShowDropDownArrow = false; + this.PlayRecordStatusButton.Size = new System.Drawing.Size(20, 20); + this.PlayRecordStatusButton.Text = "No movie is active"; + // + // PauseStatusButton + // + this.PauseStatusButton.Alignment = System.Windows.Forms.ToolStripItemAlignment.Right; + this.PauseStatusButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.PauseStatusButton.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Blank; + this.PauseStatusButton.ImageTransparentColor = System.Drawing.Color.Magenta; + this.PauseStatusButton.Name = "PauseStatusButton"; + this.PauseStatusButton.ShowDropDownArrow = false; + this.PauseStatusButton.Size = new System.Drawing.Size(20, 20); + this.PauseStatusButton.Text = "toolStripDropDownButton1"; + this.PauseStatusButton.ToolTipText = "Emulator is paused"; + this.PauseStatusButton.Click += new System.EventHandler(this.PauseMenuItem_Click); + // + // RebootStatusBarIcon + // + this.RebootStatusBarIcon.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.RebootStatusBarIcon.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.reboot; + this.RebootStatusBarIcon.Name = "RebootStatusBarIcon"; + this.RebootStatusBarIcon.RightToLeft = System.Windows.Forms.RightToLeft.No; + this.RebootStatusBarIcon.Size = new System.Drawing.Size(16, 17); + this.RebootStatusBarIcon.Text = "Reboot"; + this.RebootStatusBarIcon.ToolTipText = "A reboot of the core is needed for a setting change to take effect"; + this.RebootStatusBarIcon.Click += new System.EventHandler(this.PowerMenuItem_Click); + // + // AVIStatusLabel + // + this.AVIStatusLabel.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.AVIStatusLabel.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Blank; + this.AVIStatusLabel.Name = "AVIStatusLabel"; + this.AVIStatusLabel.Size = new System.Drawing.Size(16, 17); + this.AVIStatusLabel.Text = "AVI Capture"; + // + // LedLightStatusLabel + // + this.LedLightStatusLabel.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.LightOff; + this.LedLightStatusLabel.Name = "LedLightStatusLabel"; + this.LedLightStatusLabel.Size = new System.Drawing.Size(16, 17); + this.LedLightStatusLabel.ToolTipText = "Disk Drive LED Light"; + // + // SaveSlotsStatusLabel + // + this.SaveSlotsStatusLabel.BackColor = System.Drawing.SystemColors.Control; + this.SaveSlotsStatusLabel.Name = "SaveSlotsStatusLabel"; + this.SaveSlotsStatusLabel.Size = new System.Drawing.Size(58, 17); + this.SaveSlotsStatusLabel.Text = "Save slots"; + // + // Slot1StatusButton + // + this.Slot1StatusButton.Name = "Slot1StatusButton"; + this.Slot1StatusButton.Size = new System.Drawing.Size(13, 17); + this.Slot1StatusButton.Text = "1"; + this.Slot1StatusButton.ToolTipText = "Save slot 1"; + this.Slot1StatusButton.MouseUp += new System.Windows.Forms.MouseEventHandler(this.SlotStatusButtons_MouseUp); + // + // Slot2StatusButton + // + this.Slot2StatusButton.Name = "Slot2StatusButton"; + this.Slot2StatusButton.Size = new System.Drawing.Size(13, 17); + this.Slot2StatusButton.Text = "2"; + this.Slot2StatusButton.ToolTipText = "Save slot 2"; + this.Slot2StatusButton.MouseUp += new System.Windows.Forms.MouseEventHandler(this.SlotStatusButtons_MouseUp); + // + // Slot3StatusButton + // + this.Slot3StatusButton.Name = "Slot3StatusButton"; + this.Slot3StatusButton.Size = new System.Drawing.Size(13, 17); + this.Slot3StatusButton.Text = "3"; + this.Slot3StatusButton.ToolTipText = "Save slot 3"; + this.Slot3StatusButton.MouseUp += new System.Windows.Forms.MouseEventHandler(this.SlotStatusButtons_MouseUp); + // + // Slot4StatusButton + // + this.Slot4StatusButton.Name = "Slot4StatusButton"; + this.Slot4StatusButton.Size = new System.Drawing.Size(13, 17); + this.Slot4StatusButton.Text = "4"; + this.Slot4StatusButton.ToolTipText = "Save slot 4"; + this.Slot4StatusButton.MouseUp += new System.Windows.Forms.MouseEventHandler(this.SlotStatusButtons_MouseUp); + // + // Slot5StatusButton + // + this.Slot5StatusButton.Name = "Slot5StatusButton"; + this.Slot5StatusButton.Size = new System.Drawing.Size(13, 17); + this.Slot5StatusButton.Text = "5"; + this.Slot5StatusButton.ToolTipText = "Save slot 5"; + this.Slot5StatusButton.MouseUp += new System.Windows.Forms.MouseEventHandler(this.SlotStatusButtons_MouseUp); + // + // Slot6StatusButton + // + this.Slot6StatusButton.Name = "Slot6StatusButton"; + this.Slot6StatusButton.Size = new System.Drawing.Size(13, 17); + this.Slot6StatusButton.Text = "6"; + this.Slot6StatusButton.ToolTipText = "Save slot 6"; + this.Slot6StatusButton.MouseUp += new System.Windows.Forms.MouseEventHandler(this.SlotStatusButtons_MouseUp); + // + // Slot7StatusButton + // + this.Slot7StatusButton.Name = "Slot7StatusButton"; + this.Slot7StatusButton.Size = new System.Drawing.Size(13, 17); + this.Slot7StatusButton.Text = "7"; + this.Slot7StatusButton.ToolTipText = "Save slot 7"; + this.Slot7StatusButton.MouseUp += new System.Windows.Forms.MouseEventHandler(this.SlotStatusButtons_MouseUp); + // + // Slot8StatusButton + // + this.Slot8StatusButton.Name = "Slot8StatusButton"; + this.Slot8StatusButton.Size = new System.Drawing.Size(13, 17); + this.Slot8StatusButton.Text = "8"; + this.Slot8StatusButton.ToolTipText = "Save slot 8"; + this.Slot8StatusButton.MouseUp += new System.Windows.Forms.MouseEventHandler(this.SlotStatusButtons_MouseUp); + // + // Slot9StatusButton + // + this.Slot9StatusButton.Name = "Slot9StatusButton"; + this.Slot9StatusButton.Size = new System.Drawing.Size(13, 17); + this.Slot9StatusButton.Text = "9"; + this.Slot9StatusButton.ToolTipText = "Save slot 9"; + this.Slot9StatusButton.MouseUp += new System.Windows.Forms.MouseEventHandler(this.SlotStatusButtons_MouseUp); + // + // Slot0StatusButton + // + this.Slot0StatusButton.Name = "Slot0StatusButton"; + this.Slot0StatusButton.Size = new System.Drawing.Size(13, 17); + this.Slot0StatusButton.Text = "0"; + this.Slot0StatusButton.ToolTipText = "Save slot 0"; + this.Slot0StatusButton.MouseUp += new System.Windows.Forms.MouseEventHandler(this.SlotStatusButtons_MouseUp); + // + // CheatStatusButton + // + this.CheatStatusButton.Name = "CheatStatusButton"; + this.CheatStatusButton.Size = new System.Drawing.Size(0, 17); + this.CheatStatusButton.Click += new System.EventHandler(this.FreezeStatus_Click); + // + // KeyPriorityStatusLabel + // + this.KeyPriorityStatusLabel.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.KeyPriorityStatusLabel.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Both; + this.KeyPriorityStatusLabel.Margin = new System.Windows.Forms.Padding(5, 3, 5, 0); + this.KeyPriorityStatusLabel.Name = "KeyPriorityStatusLabel"; + this.KeyPriorityStatusLabel.Size = new System.Drawing.Size(16, 19); + this.KeyPriorityStatusLabel.Text = "KeyPriority"; + this.KeyPriorityStatusLabel.Click += new System.EventHandler(this.KeyPriorityStatusLabel_Click); + // + // CoreNameStatusBarButton + // + this.CoreNameStatusBarButton.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.CorpHawkSmall; + this.CoreNameStatusBarButton.Name = "CoreNameStatusBarButton"; + this.CoreNameStatusBarButton.Size = new System.Drawing.Size(71, 17); + this.CoreNameStatusBarButton.Text = "Neshawk"; + // + // ProfileFirstBootLabel + // + this.ProfileFirstBootLabel.AutoToolTip = true; + this.ProfileFirstBootLabel.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.ProfileFirstBootLabel.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.user_blue_small; + this.ProfileFirstBootLabel.Name = "ProfileFirstBootLabel"; + this.ProfileFirstBootLabel.Size = new System.Drawing.Size(16, 17); + this.ProfileFirstBootLabel.Text = "ProfileFirstBootLabel"; + this.ProfileFirstBootLabel.ToolTipText = "Set up your profile before use"; + this.ProfileFirstBootLabel.Visible = false; + this.ProfileFirstBootLabel.Click += new System.EventHandler(this.ProfileFirstBootLabel_Click); + // + // LinkConnectStatusBarButton + // + this.LinkConnectStatusBarButton.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Image; + this.LinkConnectStatusBarButton.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.connect_16x16; + this.LinkConnectStatusBarButton.Name = "LinkConnectStatusBarButton"; + this.LinkConnectStatusBarButton.Size = new System.Drawing.Size(16, 17); + this.LinkConnectStatusBarButton.Text = "Link connection is currently enabled"; + this.LinkConnectStatusBarButton.ToolTipText = "Link connection is currently enabled"; + // + // UpdateNotification + // + this.UpdateNotification.IsLink = true; + this.UpdateNotification.LinkColor = System.Drawing.Color.Red; + this.UpdateNotification.Name = "UpdateNotification"; + this.UpdateNotification.Size = new System.Drawing.Size(46, 17); + this.UpdateNotification.Spring = true; + this.UpdateNotification.Text = "New version available!"; + this.UpdateNotification.TextAlign = System.Drawing.ContentAlignment.MiddleRight; + this.UpdateNotification.Click += new System.EventHandler(this.UpdateNotification_Click); + // + // MainFormContextMenu + // + this.MainFormContextMenu.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.OpenRomContextMenuItem, this.LoadLastRomContextMenuItem, this.StopAVContextMenuItem, @@ -3554,153 +3569,153 @@ this.ClearSRAMContextMenuItem, this.ShowMenuContextMenuSeparator, this.ShowMenuContextMenuItem}); - this.MainFormContextMenu.Name = "contextMenuStrip1"; - this.MainFormContextMenu.Size = new System.Drawing.Size(202, 490); - this.MainFormContextMenu.Closing += new System.Windows.Forms.ToolStripDropDownClosingEventHandler(this.MainFormContextMenu_Closing); - this.MainFormContextMenu.Opening += new System.ComponentModel.CancelEventHandler(this.MainFormContextMenu_Opening); - // - // OpenRomContextMenuItem - // - this.OpenRomContextMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.OpenFile; - this.OpenRomContextMenuItem.Name = "OpenRomContextMenuItem"; - this.OpenRomContextMenuItem.Size = new System.Drawing.Size(201, 22); - this.OpenRomContextMenuItem.Text = "Open Rom"; - this.OpenRomContextMenuItem.Click += new System.EventHandler(this.OpenRomMenuItem_Click); - // - // LoadLastRomContextMenuItem - // - this.LoadLastRomContextMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Recent; - this.LoadLastRomContextMenuItem.Name = "LoadLastRomContextMenuItem"; - this.LoadLastRomContextMenuItem.Size = new System.Drawing.Size(201, 22); - this.LoadLastRomContextMenuItem.Text = "Load Last ROM"; - this.LoadLastRomContextMenuItem.Click += new System.EventHandler(this.LoadLastRomContextMenuItem_Click); - // - // StopAVContextMenuItem - // - this.StopAVContextMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Stop; - this.StopAVContextMenuItem.Name = "StopAVContextMenuItem"; - this.StopAVContextMenuItem.Size = new System.Drawing.Size(201, 22); - this.StopAVContextMenuItem.Text = "Stop AVI/WAV"; - this.StopAVContextMenuItem.Click += new System.EventHandler(this.StopAVMenuItem_Click); - // - // ContextSeparator_AfterROM - // - this.ContextSeparator_AfterROM.Name = "ContextSeparator_AfterROM"; - this.ContextSeparator_AfterROM.Size = new System.Drawing.Size(198, 6); - // - // RecordMovieContextMenuItem - // - this.RecordMovieContextMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.RecordHS; - this.RecordMovieContextMenuItem.Name = "RecordMovieContextMenuItem"; - this.RecordMovieContextMenuItem.Size = new System.Drawing.Size(201, 22); - this.RecordMovieContextMenuItem.Text = "Record Movie"; - this.RecordMovieContextMenuItem.Click += new System.EventHandler(this.RecordMovieMenuItem_Click); - // - // PlayMovieContextMenuItem - // - this.PlayMovieContextMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Play; - this.PlayMovieContextMenuItem.Name = "PlayMovieContextMenuItem"; - this.PlayMovieContextMenuItem.Size = new System.Drawing.Size(201, 22); - this.PlayMovieContextMenuItem.Text = "Play Movie"; - this.PlayMovieContextMenuItem.Click += new System.EventHandler(this.PlayMovieMenuItem_Click); - // - // RestartMovieContextMenuItem - // - this.RestartMovieContextMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.restart; - this.RestartMovieContextMenuItem.Name = "RestartMovieContextMenuItem"; - this.RestartMovieContextMenuItem.Size = new System.Drawing.Size(201, 22); - this.RestartMovieContextMenuItem.Text = "Restart Movie"; - this.RestartMovieContextMenuItem.Click += new System.EventHandler(this.PlayFromBeginningMenuItem_Click); - // - // StopMovieContextMenuItem - // - this.StopMovieContextMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Stop; - this.StopMovieContextMenuItem.Name = "StopMovieContextMenuItem"; - this.StopMovieContextMenuItem.Size = new System.Drawing.Size(201, 22); - this.StopMovieContextMenuItem.Text = "Stop Movie"; - this.StopMovieContextMenuItem.Click += new System.EventHandler(this.StopMovieMenuItem_Click); - // - // LoadLastMovieContextMenuItem - // - this.LoadLastMovieContextMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Recent; - this.LoadLastMovieContextMenuItem.Name = "LoadLastMovieContextMenuItem"; - this.LoadLastMovieContextMenuItem.Size = new System.Drawing.Size(201, 22); - this.LoadLastMovieContextMenuItem.Text = "Load Last Movie"; - this.LoadLastMovieContextMenuItem.Click += new System.EventHandler(this.LoadLastMovieContextMenuItem_Click); - // - // BackupMovieContextMenuItem - // - this.BackupMovieContextMenuItem.Name = "BackupMovieContextMenuItem"; - this.BackupMovieContextMenuItem.Size = new System.Drawing.Size(201, 22); - this.BackupMovieContextMenuItem.Text = "Backup Movie"; - this.BackupMovieContextMenuItem.Click += new System.EventHandler(this.BackupMovieContextMenuItem_Click); - // - // StopNoSaveContextMenuItem - // - this.StopNoSaveContextMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Stop; - this.StopNoSaveContextMenuItem.Name = "StopNoSaveContextMenuItem"; - this.StopNoSaveContextMenuItem.Size = new System.Drawing.Size(201, 22); - this.StopNoSaveContextMenuItem.Text = "Stop Movie without Saving"; - this.StopNoSaveContextMenuItem.Click += new System.EventHandler(this.StopMovieWithoutSavingMenuItem_Click); - // - // ViewSubtitlesContextMenuItem - // - this.ViewSubtitlesContextMenuItem.Name = "ViewSubtitlesContextMenuItem"; - this.ViewSubtitlesContextMenuItem.Size = new System.Drawing.Size(201, 22); - this.ViewSubtitlesContextMenuItem.Text = "View Subtitles"; - this.ViewSubtitlesContextMenuItem.Click += new System.EventHandler(this.ViewSubtitlesContextMenuItem_Click); - // - // AddSubtitleContextMenuItem - // - this.AddSubtitleContextMenuItem.Name = "AddSubtitleContextMenuItem"; - this.AddSubtitleContextMenuItem.Size = new System.Drawing.Size(201, 22); - this.AddSubtitleContextMenuItem.Text = "Add Subtitle"; - this.AddSubtitleContextMenuItem.Click += new System.EventHandler(this.AddSubtitleContextMenuItem_Click); - // - // ViewCommentsContextMenuItem - // - this.ViewCommentsContextMenuItem.Name = "ViewCommentsContextMenuItem"; - this.ViewCommentsContextMenuItem.Size = new System.Drawing.Size(201, 22); - this.ViewCommentsContextMenuItem.Text = "View Comments"; - this.ViewCommentsContextMenuItem.Click += new System.EventHandler(this.ViewCommentsContextMenuItem_Click); - // - // SaveMovieContextMenuItem - // - this.SaveMovieContextMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.SaveAs; - this.SaveMovieContextMenuItem.Name = "SaveMovieContextMenuItem"; - this.SaveMovieContextMenuItem.Size = new System.Drawing.Size(201, 22); - this.SaveMovieContextMenuItem.Text = "Save Movie"; - this.SaveMovieContextMenuItem.Click += new System.EventHandler(this.SaveMovieMenuItem_Click); - // - // SaveMovieAsContextMenuItem - // - this.SaveMovieAsContextMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.SaveAs; - this.SaveMovieAsContextMenuItem.Name = "SaveMovieAsContextMenuItem"; - this.SaveMovieAsContextMenuItem.Size = new System.Drawing.Size(201, 22); - this.SaveMovieAsContextMenuItem.Text = "Save Movie As..."; - this.SaveMovieAsContextMenuItem.Click += new System.EventHandler(this.SaveMovieAsMenuItem_Click); - // - // ContextSeparator_AfterMovie - // - this.ContextSeparator_AfterMovie.Name = "ContextSeparator_AfterMovie"; - this.ContextSeparator_AfterMovie.Size = new System.Drawing.Size(198, 6); - // - // UndoSavestateContextMenuItem - // - this.UndoSavestateContextMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.undo; - this.UndoSavestateContextMenuItem.Name = "UndoSavestateContextMenuItem"; - this.UndoSavestateContextMenuItem.Size = new System.Drawing.Size(201, 22); - this.UndoSavestateContextMenuItem.Text = "Undo Savestate"; - this.UndoSavestateContextMenuItem.Click += new System.EventHandler(this.UndoSavestateContextMenuItem_Click); - // - // ContextSeparator_AfterUndo - // - this.ContextSeparator_AfterUndo.Name = "ContextSeparator_AfterUndo"; - this.ContextSeparator_AfterUndo.Size = new System.Drawing.Size(198, 6); - // - // ConfigContextMenuItem - // - this.ConfigContextMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.MainFormContextMenu.Name = "contextMenuStrip1"; + this.MainFormContextMenu.Size = new System.Drawing.Size(217, 490); + this.MainFormContextMenu.Closing += new System.Windows.Forms.ToolStripDropDownClosingEventHandler(this.MainFormContextMenu_Closing); + this.MainFormContextMenu.Opening += new System.ComponentModel.CancelEventHandler(this.MainFormContextMenu_Opening); + // + // OpenRomContextMenuItem + // + this.OpenRomContextMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.OpenFile; + this.OpenRomContextMenuItem.Name = "OpenRomContextMenuItem"; + this.OpenRomContextMenuItem.Size = new System.Drawing.Size(216, 22); + this.OpenRomContextMenuItem.Text = "Open Rom"; + this.OpenRomContextMenuItem.Click += new System.EventHandler(this.OpenRomMenuItem_Click); + // + // LoadLastRomContextMenuItem + // + this.LoadLastRomContextMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Recent; + this.LoadLastRomContextMenuItem.Name = "LoadLastRomContextMenuItem"; + this.LoadLastRomContextMenuItem.Size = new System.Drawing.Size(216, 22); + this.LoadLastRomContextMenuItem.Text = "Load Last ROM"; + this.LoadLastRomContextMenuItem.Click += new System.EventHandler(this.LoadLastRomContextMenuItem_Click); + // + // StopAVContextMenuItem + // + this.StopAVContextMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Stop; + this.StopAVContextMenuItem.Name = "StopAVContextMenuItem"; + this.StopAVContextMenuItem.Size = new System.Drawing.Size(216, 22); + this.StopAVContextMenuItem.Text = "Stop AVI/WAV"; + this.StopAVContextMenuItem.Click += new System.EventHandler(this.StopAVMenuItem_Click); + // + // ContextSeparator_AfterROM + // + this.ContextSeparator_AfterROM.Name = "ContextSeparator_AfterROM"; + this.ContextSeparator_AfterROM.Size = new System.Drawing.Size(213, 6); + // + // RecordMovieContextMenuItem + // + this.RecordMovieContextMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.RecordHS; + this.RecordMovieContextMenuItem.Name = "RecordMovieContextMenuItem"; + this.RecordMovieContextMenuItem.Size = new System.Drawing.Size(216, 22); + this.RecordMovieContextMenuItem.Text = "Record Movie"; + this.RecordMovieContextMenuItem.Click += new System.EventHandler(this.RecordMovieMenuItem_Click); + // + // PlayMovieContextMenuItem + // + this.PlayMovieContextMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Play; + this.PlayMovieContextMenuItem.Name = "PlayMovieContextMenuItem"; + this.PlayMovieContextMenuItem.Size = new System.Drawing.Size(216, 22); + this.PlayMovieContextMenuItem.Text = "Play Movie"; + this.PlayMovieContextMenuItem.Click += new System.EventHandler(this.PlayMovieMenuItem_Click); + // + // RestartMovieContextMenuItem + // + this.RestartMovieContextMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.restart; + this.RestartMovieContextMenuItem.Name = "RestartMovieContextMenuItem"; + this.RestartMovieContextMenuItem.Size = new System.Drawing.Size(216, 22); + this.RestartMovieContextMenuItem.Text = "Restart Movie"; + this.RestartMovieContextMenuItem.Click += new System.EventHandler(this.PlayFromBeginningMenuItem_Click); + // + // StopMovieContextMenuItem + // + this.StopMovieContextMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Stop; + this.StopMovieContextMenuItem.Name = "StopMovieContextMenuItem"; + this.StopMovieContextMenuItem.Size = new System.Drawing.Size(216, 22); + this.StopMovieContextMenuItem.Text = "Stop Movie"; + this.StopMovieContextMenuItem.Click += new System.EventHandler(this.StopMovieMenuItem_Click); + // + // LoadLastMovieContextMenuItem + // + this.LoadLastMovieContextMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Recent; + this.LoadLastMovieContextMenuItem.Name = "LoadLastMovieContextMenuItem"; + this.LoadLastMovieContextMenuItem.Size = new System.Drawing.Size(216, 22); + this.LoadLastMovieContextMenuItem.Text = "Load Last Movie"; + this.LoadLastMovieContextMenuItem.Click += new System.EventHandler(this.LoadLastMovieContextMenuItem_Click); + // + // BackupMovieContextMenuItem + // + this.BackupMovieContextMenuItem.Name = "BackupMovieContextMenuItem"; + this.BackupMovieContextMenuItem.Size = new System.Drawing.Size(216, 22); + this.BackupMovieContextMenuItem.Text = "Backup Movie"; + this.BackupMovieContextMenuItem.Click += new System.EventHandler(this.BackupMovieContextMenuItem_Click); + // + // StopNoSaveContextMenuItem + // + this.StopNoSaveContextMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Stop; + this.StopNoSaveContextMenuItem.Name = "StopNoSaveContextMenuItem"; + this.StopNoSaveContextMenuItem.Size = new System.Drawing.Size(216, 22); + this.StopNoSaveContextMenuItem.Text = "Stop Movie without Saving"; + this.StopNoSaveContextMenuItem.Click += new System.EventHandler(this.StopMovieWithoutSavingMenuItem_Click); + // + // ViewSubtitlesContextMenuItem + // + this.ViewSubtitlesContextMenuItem.Name = "ViewSubtitlesContextMenuItem"; + this.ViewSubtitlesContextMenuItem.Size = new System.Drawing.Size(216, 22); + this.ViewSubtitlesContextMenuItem.Text = "View Subtitles"; + this.ViewSubtitlesContextMenuItem.Click += new System.EventHandler(this.ViewSubtitlesContextMenuItem_Click); + // + // AddSubtitleContextMenuItem + // + this.AddSubtitleContextMenuItem.Name = "AddSubtitleContextMenuItem"; + this.AddSubtitleContextMenuItem.Size = new System.Drawing.Size(216, 22); + this.AddSubtitleContextMenuItem.Text = "Add Subtitle"; + this.AddSubtitleContextMenuItem.Click += new System.EventHandler(this.AddSubtitleContextMenuItem_Click); + // + // ViewCommentsContextMenuItem + // + this.ViewCommentsContextMenuItem.Name = "ViewCommentsContextMenuItem"; + this.ViewCommentsContextMenuItem.Size = new System.Drawing.Size(216, 22); + this.ViewCommentsContextMenuItem.Text = "View Comments"; + this.ViewCommentsContextMenuItem.Click += new System.EventHandler(this.ViewCommentsContextMenuItem_Click); + // + // SaveMovieContextMenuItem + // + this.SaveMovieContextMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.SaveAs; + this.SaveMovieContextMenuItem.Name = "SaveMovieContextMenuItem"; + this.SaveMovieContextMenuItem.Size = new System.Drawing.Size(216, 22); + this.SaveMovieContextMenuItem.Text = "Save Movie"; + this.SaveMovieContextMenuItem.Click += new System.EventHandler(this.SaveMovieMenuItem_Click); + // + // SaveMovieAsContextMenuItem + // + this.SaveMovieAsContextMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.SaveAs; + this.SaveMovieAsContextMenuItem.Name = "SaveMovieAsContextMenuItem"; + this.SaveMovieAsContextMenuItem.Size = new System.Drawing.Size(216, 22); + this.SaveMovieAsContextMenuItem.Text = "Save Movie As..."; + this.SaveMovieAsContextMenuItem.Click += new System.EventHandler(this.SaveMovieAsMenuItem_Click); + // + // ContextSeparator_AfterMovie + // + this.ContextSeparator_AfterMovie.Name = "ContextSeparator_AfterMovie"; + this.ContextSeparator_AfterMovie.Size = new System.Drawing.Size(213, 6); + // + // UndoSavestateContextMenuItem + // + this.UndoSavestateContextMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.undo; + this.UndoSavestateContextMenuItem.Name = "UndoSavestateContextMenuItem"; + this.UndoSavestateContextMenuItem.Size = new System.Drawing.Size(216, 22); + this.UndoSavestateContextMenuItem.Text = "Undo Savestate"; + this.UndoSavestateContextMenuItem.Click += new System.EventHandler(this.UndoSavestateContextMenuItem_Click); + // + // ContextSeparator_AfterUndo + // + this.ContextSeparator_AfterUndo.Name = "ContextSeparator_AfterUndo"; + this.ContextSeparator_AfterUndo.Size = new System.Drawing.Size(213, 6); + // + // ConfigContextMenuItem + // + this.ConfigContextMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.toolStripMenuItem6, this.toolStripMenuItem7, this.toolStripMenuItem8, @@ -3717,232 +3732,217 @@ this.toolStripSeparator37, this.toolStripMenuItem66, this.toolStripMenuItem67}); - this.ConfigContextMenuItem.Name = "ConfigContextMenuItem"; - this.ConfigContextMenuItem.Size = new System.Drawing.Size(201, 22); - this.ConfigContextMenuItem.Text = "Config"; - // - // toolStripMenuItem6 - // - this.toolStripMenuItem6.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.GameController; - this.toolStripMenuItem6.Name = "toolStripMenuItem6"; - this.toolStripMenuItem6.Size = new System.Drawing.Size(157, 22); - this.toolStripMenuItem6.Text = "&Controllers..."; - this.toolStripMenuItem6.Click += new System.EventHandler(this.ControllersMenuItem_Click); - // - // toolStripMenuItem7 - // - this.toolStripMenuItem7.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.HotKeys; - this.toolStripMenuItem7.Name = "toolStripMenuItem7"; - this.toolStripMenuItem7.Size = new System.Drawing.Size(157, 22); - this.toolStripMenuItem7.Text = "&Hotkeys..."; - this.toolStripMenuItem7.Click += new System.EventHandler(this.HotkeysMenuItem_Click); - // - // toolStripMenuItem8 - // - this.toolStripMenuItem8.Image = ((System.Drawing.Image)(resources.GetObject("toolStripMenuItem8.Image"))); - this.toolStripMenuItem8.Name = "toolStripMenuItem8"; - this.toolStripMenuItem8.Size = new System.Drawing.Size(157, 22); - this.toolStripMenuItem8.Text = "Display..."; - this.toolStripMenuItem8.Click += new System.EventHandler(this.DisplayConfigMenuItem_Click); - // - // toolStripMenuItem9 - // - this.toolStripMenuItem9.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.AudioHS; - this.toolStripMenuItem9.Name = "toolStripMenuItem9"; - this.toolStripMenuItem9.Size = new System.Drawing.Size(157, 22); - this.toolStripMenuItem9.Text = "&Sound..."; - this.toolStripMenuItem9.Click += new System.EventHandler(this.SoundMenuItem_Click); - // - // toolStripMenuItem10 - // - this.toolStripMenuItem10.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.CopyFolderHS; - this.toolStripMenuItem10.Name = "toolStripMenuItem10"; - this.toolStripMenuItem10.Size = new System.Drawing.Size(157, 22); - this.toolStripMenuItem10.Text = "Paths..."; - this.toolStripMenuItem10.Click += new System.EventHandler(this.PathsMenuItem_Click); - // - // toolStripMenuItem11 - // - this.toolStripMenuItem11.Image = ((System.Drawing.Image)(resources.GetObject("toolStripMenuItem11.Image"))); - this.toolStripMenuItem11.Name = "toolStripMenuItem11"; - this.toolStripMenuItem11.Size = new System.Drawing.Size(157, 22); - this.toolStripMenuItem11.Text = "&Firmwares..."; - this.toolStripMenuItem11.Click += new System.EventHandler(this.FirmwaresMenuItem_Click); - // - // toolStripMenuItem12 - // - this.toolStripMenuItem12.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.MessageConfig; - this.toolStripMenuItem12.Name = "toolStripMenuItem12"; - this.toolStripMenuItem12.Size = new System.Drawing.Size(157, 22); - this.toolStripMenuItem12.Text = "&Messages..."; - this.toolStripMenuItem12.Click += new System.EventHandler(this.MessagesMenuItem_Click); - // - // toolStripMenuItem13 - // - this.toolStripMenuItem13.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Lightning; - this.toolStripMenuItem13.Name = "toolStripMenuItem13"; - this.toolStripMenuItem13.Size = new System.Drawing.Size(157, 22); - this.toolStripMenuItem13.Text = "&Autofire..."; - this.toolStripMenuItem13.Click += new System.EventHandler(this.AutofireMenuItem_Click); - // - // toolStripMenuItem14 - // - this.toolStripMenuItem14.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Previous; - this.toolStripMenuItem14.Name = "toolStripMenuItem14"; - this.toolStripMenuItem14.Size = new System.Drawing.Size(157, 22); - this.toolStripMenuItem14.Text = "&Rewind..."; - this.toolStripMenuItem14.Click += new System.EventHandler(this.RewindOptionsMenuItem_Click); - // - // toolStripMenuItem15 - // - this.toolStripMenuItem15.Name = "toolStripMenuItem15"; - this.toolStripMenuItem15.Size = new System.Drawing.Size(157, 22); - this.toolStripMenuItem15.Text = "File Extensions..."; - this.toolStripMenuItem15.Click += new System.EventHandler(this.FileExtensionsMenuItem_Click); - // - // customizeToolStripMenuItem - // - this.customizeToolStripMenuItem.Name = "customizeToolStripMenuItem"; - this.customizeToolStripMenuItem.Size = new System.Drawing.Size(157, 22); - this.customizeToolStripMenuItem.Text = "Customize..."; - this.customizeToolStripMenuItem.Click += new System.EventHandler(this.CustomizeMenuItem_Click); - // - // toolStripSeparator30 - // - this.toolStripSeparator30.Name = "toolStripSeparator30"; - this.toolStripSeparator30.Size = new System.Drawing.Size(154, 6); - // - // SavestateTypeContextSubMenu - // - this.SavestateTypeContextSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { + this.ConfigContextMenuItem.Name = "ConfigContextMenuItem"; + this.ConfigContextMenuItem.Size = new System.Drawing.Size(216, 22); + this.ConfigContextMenuItem.Text = "Config"; + // + // toolStripMenuItem6 + // + this.toolStripMenuItem6.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.GameController; + this.toolStripMenuItem6.Name = "toolStripMenuItem6"; + this.toolStripMenuItem6.Size = new System.Drawing.Size(159, 22); + this.toolStripMenuItem6.Text = "&Controllers..."; + this.toolStripMenuItem6.Click += new System.EventHandler(this.ControllersMenuItem_Click); + // + // toolStripMenuItem7 + // + this.toolStripMenuItem7.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.HotKeys; + this.toolStripMenuItem7.Name = "toolStripMenuItem7"; + this.toolStripMenuItem7.Size = new System.Drawing.Size(159, 22); + this.toolStripMenuItem7.Text = "&Hotkeys..."; + this.toolStripMenuItem7.Click += new System.EventHandler(this.HotkeysMenuItem_Click); + // + // toolStripMenuItem8 + // + this.toolStripMenuItem8.Image = ((System.Drawing.Image)(resources.GetObject("toolStripMenuItem8.Image"))); + this.toolStripMenuItem8.Name = "toolStripMenuItem8"; + this.toolStripMenuItem8.Size = new System.Drawing.Size(159, 22); + this.toolStripMenuItem8.Text = "Display..."; + this.toolStripMenuItem8.Click += new System.EventHandler(this.DisplayConfigMenuItem_Click); + // + // toolStripMenuItem9 + // + this.toolStripMenuItem9.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.AudioHS; + this.toolStripMenuItem9.Name = "toolStripMenuItem9"; + this.toolStripMenuItem9.Size = new System.Drawing.Size(159, 22); + this.toolStripMenuItem9.Text = "&Sound..."; + this.toolStripMenuItem9.Click += new System.EventHandler(this.SoundMenuItem_Click); + // + // toolStripMenuItem10 + // + this.toolStripMenuItem10.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.CopyFolderHS; + this.toolStripMenuItem10.Name = "toolStripMenuItem10"; + this.toolStripMenuItem10.Size = new System.Drawing.Size(159, 22); + this.toolStripMenuItem10.Text = "Paths..."; + this.toolStripMenuItem10.Click += new System.EventHandler(this.PathsMenuItem_Click); + // + // toolStripMenuItem11 + // + this.toolStripMenuItem11.Image = ((System.Drawing.Image)(resources.GetObject("toolStripMenuItem11.Image"))); + this.toolStripMenuItem11.Name = "toolStripMenuItem11"; + this.toolStripMenuItem11.Size = new System.Drawing.Size(159, 22); + this.toolStripMenuItem11.Text = "&Firmwares..."; + this.toolStripMenuItem11.Click += new System.EventHandler(this.FirmwaresMenuItem_Click); + // + // toolStripMenuItem12 + // + this.toolStripMenuItem12.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.MessageConfig; + this.toolStripMenuItem12.Name = "toolStripMenuItem12"; + this.toolStripMenuItem12.Size = new System.Drawing.Size(159, 22); + this.toolStripMenuItem12.Text = "&Messages..."; + this.toolStripMenuItem12.Click += new System.EventHandler(this.MessagesMenuItem_Click); + // + // toolStripMenuItem13 + // + this.toolStripMenuItem13.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Lightning; + this.toolStripMenuItem13.Name = "toolStripMenuItem13"; + this.toolStripMenuItem13.Size = new System.Drawing.Size(159, 22); + this.toolStripMenuItem13.Text = "&Autofire..."; + this.toolStripMenuItem13.Click += new System.EventHandler(this.AutofireMenuItem_Click); + // + // toolStripMenuItem14 + // + this.toolStripMenuItem14.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Previous; + this.toolStripMenuItem14.Name = "toolStripMenuItem14"; + this.toolStripMenuItem14.Size = new System.Drawing.Size(159, 22); + this.toolStripMenuItem14.Text = "&Rewind..."; + this.toolStripMenuItem14.Click += new System.EventHandler(this.RewindOptionsMenuItem_Click); + // + // toolStripMenuItem15 + // + this.toolStripMenuItem15.Name = "toolStripMenuItem15"; + this.toolStripMenuItem15.Size = new System.Drawing.Size(159, 22); + this.toolStripMenuItem15.Text = "File Extensions..."; + this.toolStripMenuItem15.Click += new System.EventHandler(this.FileExtensionsMenuItem_Click); + // + // customizeToolStripMenuItem + // + this.customizeToolStripMenuItem.Name = "customizeToolStripMenuItem"; + this.customizeToolStripMenuItem.Size = new System.Drawing.Size(159, 22); + this.customizeToolStripMenuItem.Text = "Customize..."; + this.customizeToolStripMenuItem.Click += new System.EventHandler(this.CustomizeMenuItem_Click); + // + // toolStripSeparator30 + // + this.toolStripSeparator30.Name = "toolStripSeparator30"; + this.toolStripSeparator30.Size = new System.Drawing.Size(156, 6); + // + // SavestateTypeContextSubMenu + // + this.SavestateTypeContextSubMenu.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { this.SavestateTypeDefaultContextMenuItem, this.SavestateBinaryContextMenuItem, this.SavestateTextContextMenuItem}); - this.SavestateTypeContextSubMenu.Name = "SavestateTypeContextSubMenu"; - this.SavestateTypeContextSubMenu.Size = new System.Drawing.Size(157, 22); - this.SavestateTypeContextSubMenu.Text = "Savestate Type"; - this.SavestateTypeContextSubMenu.DropDownOpened += new System.EventHandler(this.SavestateTypeContextSubMenu_DropDownOpened); - // - // SavestateTypeDefaultContextMenuItem - // - this.SavestateTypeDefaultContextMenuItem.Name = "SavestateTypeDefaultContextMenuItem"; - this.SavestateTypeDefaultContextMenuItem.Size = new System.Drawing.Size(109, 22); - this.SavestateTypeDefaultContextMenuItem.Text = "&Default"; - // - // SavestateBinaryContextMenuItem - // - this.SavestateBinaryContextMenuItem.Name = "SavestateBinaryContextMenuItem"; - this.SavestateBinaryContextMenuItem.Size = new System.Drawing.Size(109, 22); - this.SavestateBinaryContextMenuItem.Text = "&Binary"; - // - // SavestateTextContextMenuItem - // - this.SavestateTextContextMenuItem.Name = "SavestateTextContextMenuItem"; - this.SavestateTextContextMenuItem.Size = new System.Drawing.Size(109, 22); - this.SavestateTextContextMenuItem.Text = "&Text"; - // - // toolStripSeparator37 - // - this.toolStripSeparator37.Name = "toolStripSeparator37"; - this.toolStripSeparator37.Size = new System.Drawing.Size(154, 6); - // - // toolStripMenuItem66 - // - this.toolStripMenuItem66.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Save; - this.toolStripMenuItem66.Name = "toolStripMenuItem66"; - this.toolStripMenuItem66.Size = new System.Drawing.Size(157, 22); - this.toolStripMenuItem66.Text = "Save Config"; - this.toolStripMenuItem66.Click += new System.EventHandler(this.SaveConfigMenuItem_Click); - // - // toolStripMenuItem67 - // - this.toolStripMenuItem67.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.LoadConfig; - this.toolStripMenuItem67.Name = "toolStripMenuItem67"; - this.toolStripMenuItem67.Size = new System.Drawing.Size(157, 22); - this.toolStripMenuItem67.Text = "Load Config"; - this.toolStripMenuItem67.Click += new System.EventHandler(this.LoadConfigMenuItem_Click); - // - // ScreenshotContextMenuItem - // - this.ScreenshotContextMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.camera; - this.ScreenshotContextMenuItem.Name = "ScreenshotContextMenuItem"; - this.ScreenshotContextMenuItem.Size = new System.Drawing.Size(201, 22); - this.ScreenshotContextMenuItem.Text = "Screenshot"; - this.ScreenshotContextMenuItem.Click += new System.EventHandler(this.ScreenshotMenuItem_Click); - // - // CloseRomContextMenuItem - // - this.CloseRomContextMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Close; - this.CloseRomContextMenuItem.Name = "CloseRomContextMenuItem"; - this.CloseRomContextMenuItem.Size = new System.Drawing.Size(201, 22); - this.CloseRomContextMenuItem.Text = "Close ROM"; - this.CloseRomContextMenuItem.Click += new System.EventHandler(this.CloseRomMenuItem_Click); - // - // ClearSRAMContextMenuItem - // - this.ClearSRAMContextMenuItem.Name = "ClearSRAMContextMenuItem"; - this.ClearSRAMContextMenuItem.Size = new System.Drawing.Size(201, 22); - this.ClearSRAMContextMenuItem.Text = "Close and Clear SRAM"; - this.ClearSRAMContextMenuItem.Click += new System.EventHandler(this.ClearSramContextMenuItem_Click); - // - // ShowMenuContextMenuSeparator - // - this.ShowMenuContextMenuSeparator.Name = "ShowMenuContextMenuSeparator"; - this.ShowMenuContextMenuSeparator.Size = new System.Drawing.Size(198, 6); - // - // ShowMenuContextMenuItem - // - this.ShowMenuContextMenuItem.Name = "ShowMenuContextMenuItem"; - this.ShowMenuContextMenuItem.Size = new System.Drawing.Size(201, 22); - this.ShowMenuContextMenuItem.Text = "Show Menu"; - this.ShowMenuContextMenuItem.Click += new System.EventHandler(this.ShowMenuContextMenuItem_Click); - // - // timerMouseIdle - // - this.timerMouseIdle.Enabled = true; - this.timerMouseIdle.Interval = 2000; - this.timerMouseIdle.Tick += new System.EventHandler(this.TimerMouseIdle_Tick); - // - // pCFXToolStripMenuItem - // - this.pCFXToolStripMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] { - this.preferencesToolStripMenuItem3}); - this.pCFXToolStripMenuItem.Name = "pCFXToolStripMenuItem"; - this.pCFXToolStripMenuItem.Size = new System.Drawing.Size(48, 17); - this.pCFXToolStripMenuItem.Text = "&PC-FX"; - // - // preferencesToolStripMenuItem3 - // - this.preferencesToolStripMenuItem3.Name = "preferencesToolStripMenuItem3"; - this.preferencesToolStripMenuItem3.Size = new System.Drawing.Size(152, 22); - this.preferencesToolStripMenuItem3.Text = "Preferences..."; - this.preferencesToolStripMenuItem3.Click += new System.EventHandler(this.preferencesToolStripMenuItem3_Click); - // - // MainForm - // - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None; - this.ClientSize = new System.Drawing.Size(470, 408); - this.Controls.Add(this.MainStatusBar); - this.Controls.Add(this.MainformMenu); - this.Font = new System.Drawing.Font("Arial", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); - this.MainMenuStrip = this.MainformMenu; - this.Name = "MainForm"; - this.Text = "BizHawk"; - this.Activated += new System.EventHandler(this.MainForm_Activated); - this.Deactivate += new System.EventHandler(this.MainForm_Deactivate); - this.Load += new System.EventHandler(this.MainForm_Load); - this.Shown += new System.EventHandler(this.MainForm_Shown); - this.Enter += new System.EventHandler(this.MainForm_Enter); - this.MouseClick += new System.Windows.Forms.MouseEventHandler(this.MainForm_MouseClick); - this.MouseMove += new System.Windows.Forms.MouseEventHandler(this.MainForm_MouseMove); - this.Resize += new System.EventHandler(this.MainForm_Resize); - this.MainformMenu.ResumeLayout(false); - this.MainformMenu.PerformLayout(); - this.MainStatusBar.ResumeLayout(false); - this.MainStatusBar.PerformLayout(); - this.MainFormContextMenu.ResumeLayout(false); - this.ResumeLayout(false); - this.PerformLayout(); + this.SavestateTypeContextSubMenu.Name = "SavestateTypeContextSubMenu"; + this.SavestateTypeContextSubMenu.Size = new System.Drawing.Size(159, 22); + this.SavestateTypeContextSubMenu.Text = "Savestate Type"; + this.SavestateTypeContextSubMenu.DropDownOpened += new System.EventHandler(this.SavestateTypeContextSubMenu_DropDownOpened); + // + // SavestateTypeDefaultContextMenuItem + // + this.SavestateTypeDefaultContextMenuItem.Name = "SavestateTypeDefaultContextMenuItem"; + this.SavestateTypeDefaultContextMenuItem.Size = new System.Drawing.Size(112, 22); + this.SavestateTypeDefaultContextMenuItem.Text = "&Default"; + // + // SavestateBinaryContextMenuItem + // + this.SavestateBinaryContextMenuItem.Name = "SavestateBinaryContextMenuItem"; + this.SavestateBinaryContextMenuItem.Size = new System.Drawing.Size(112, 22); + this.SavestateBinaryContextMenuItem.Text = "&Binary"; + // + // SavestateTextContextMenuItem + // + this.SavestateTextContextMenuItem.Name = "SavestateTextContextMenuItem"; + this.SavestateTextContextMenuItem.Size = new System.Drawing.Size(112, 22); + this.SavestateTextContextMenuItem.Text = "&Text"; + // + // toolStripSeparator37 + // + this.toolStripSeparator37.Name = "toolStripSeparator37"; + this.toolStripSeparator37.Size = new System.Drawing.Size(156, 6); + // + // toolStripMenuItem66 + // + this.toolStripMenuItem66.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Save; + this.toolStripMenuItem66.Name = "toolStripMenuItem66"; + this.toolStripMenuItem66.Size = new System.Drawing.Size(159, 22); + this.toolStripMenuItem66.Text = "Save Config"; + this.toolStripMenuItem66.Click += new System.EventHandler(this.SaveConfigMenuItem_Click); + // + // toolStripMenuItem67 + // + this.toolStripMenuItem67.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.LoadConfig; + this.toolStripMenuItem67.Name = "toolStripMenuItem67"; + this.toolStripMenuItem67.Size = new System.Drawing.Size(159, 22); + this.toolStripMenuItem67.Text = "Load Config"; + this.toolStripMenuItem67.Click += new System.EventHandler(this.LoadConfigMenuItem_Click); + // + // ScreenshotContextMenuItem + // + this.ScreenshotContextMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.camera; + this.ScreenshotContextMenuItem.Name = "ScreenshotContextMenuItem"; + this.ScreenshotContextMenuItem.Size = new System.Drawing.Size(216, 22); + this.ScreenshotContextMenuItem.Text = "Screenshot"; + this.ScreenshotContextMenuItem.Click += new System.EventHandler(this.ScreenshotMenuItem_Click); + // + // CloseRomContextMenuItem + // + this.CloseRomContextMenuItem.Image = global::BizHawk.Client.EmuHawk.Properties.Resources.Close; + this.CloseRomContextMenuItem.Name = "CloseRomContextMenuItem"; + this.CloseRomContextMenuItem.Size = new System.Drawing.Size(216, 22); + this.CloseRomContextMenuItem.Text = "Close ROM"; + this.CloseRomContextMenuItem.Click += new System.EventHandler(this.CloseRomMenuItem_Click); + // + // ClearSRAMContextMenuItem + // + this.ClearSRAMContextMenuItem.Name = "ClearSRAMContextMenuItem"; + this.ClearSRAMContextMenuItem.Size = new System.Drawing.Size(216, 22); + this.ClearSRAMContextMenuItem.Text = "Close and Clear SRAM"; + this.ClearSRAMContextMenuItem.Click += new System.EventHandler(this.ClearSramContextMenuItem_Click); + // + // ShowMenuContextMenuSeparator + // + this.ShowMenuContextMenuSeparator.Name = "ShowMenuContextMenuSeparator"; + this.ShowMenuContextMenuSeparator.Size = new System.Drawing.Size(213, 6); + // + // ShowMenuContextMenuItem + // + this.ShowMenuContextMenuItem.Name = "ShowMenuContextMenuItem"; + this.ShowMenuContextMenuItem.Size = new System.Drawing.Size(216, 22); + this.ShowMenuContextMenuItem.Text = "Show Menu"; + this.ShowMenuContextMenuItem.Click += new System.EventHandler(this.ShowMenuContextMenuItem_Click); + // + // timerMouseIdle + // + this.timerMouseIdle.Enabled = true; + this.timerMouseIdle.Interval = 2000; + this.timerMouseIdle.Tick += new System.EventHandler(this.TimerMouseIdle_Tick); + // + // MainForm + // + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.None; + this.ClientSize = new System.Drawing.Size(470, 408); + this.Controls.Add(this.MainStatusBar); + this.Controls.Add(this.MainformMenu); + this.Font = new System.Drawing.Font("Arial", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); + this.MainMenuStrip = this.MainformMenu; + this.Name = "MainForm"; + this.Text = "BizHawk"; + this.Activated += new System.EventHandler(this.MainForm_Activated); + this.Deactivate += new System.EventHandler(this.MainForm_Deactivate); + this.Load += new System.EventHandler(this.MainForm_Load); + this.Shown += new System.EventHandler(this.MainForm_Shown); + this.Enter += new System.EventHandler(this.MainForm_Enter); + this.MouseClick += new System.Windows.Forms.MouseEventHandler(this.MainForm_MouseClick); + this.MouseMove += new System.Windows.Forms.MouseEventHandler(this.MainForm_MouseMove); + this.Resize += new System.EventHandler(this.MainForm_Resize); + this.MainformMenu.ResumeLayout(false); + this.MainformMenu.PerformLayout(); + this.MainStatusBar.ResumeLayout(false); + this.MainStatusBar.PerformLayout(); + this.MainFormContextMenu.ResumeLayout(false); + this.ResumeLayout(false); + this.PerformLayout(); } @@ -4368,7 +4368,7 @@ private System.Windows.Forms.ToolStripMenuItem Atari7800HawkCoreMenuItem; private System.Windows.Forms.ToolStripMenuItem SGBCoreSubmenu; private System.Windows.Forms.ToolStripMenuItem SgbBsnesMenuItem; - private System.Windows.Forms.ToolStripMenuItem SgbPizzaBoyMenuItem; + private System.Windows.Forms.ToolStripMenuItem SgbSameBoyMenuItem; private System.Windows.Forms.ToolStripMenuItem pCFXToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem preferencesToolStripMenuItem3; } diff --git a/BizHawk.Client.EmuHawk/MainForm.Events.cs b/BizHawk.Client.EmuHawk/MainForm.Events.cs index 21c72d1312..663e4fd85d 100644 --- a/BizHawk.Client.EmuHawk/MainForm.Events.cs +++ b/BizHawk.Client.EmuHawk/MainForm.Events.cs @@ -1258,7 +1258,7 @@ namespace BizHawk.Client.EmuHawk private void SGBCoreSubmenu_DropDownOpened(object sender, EventArgs e) { SgbBsnesMenuItem.Checked = Global.Config.SGB_UseBsnes; - SgbPizzaBoyMenuItem.Checked = !Global.Config.SGB_UseBsnes; + SgbSameBoyMenuItem.Checked = !Global.Config.SGB_UseBsnes; } private void SgbCorePick_Click(object sender, EventArgs e) @@ -1271,7 +1271,6 @@ namespace BizHawk.Client.EmuHawk } } - private void GbInSgbMenuItem_Click(object sender, EventArgs e) { Global.Config.GB_AsSGB ^= true; From f5a5e9bd17417a54cc852da2f14458b75bb834ce Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Fri, 21 Jul 2017 16:33:45 -0400 Subject: [PATCH 60/93] Atari7800Hawk: More mappers --- .../Atari/A7800Hawk/A7800Hawk.IStatable.cs | 3 +- .../Consoles/Atari/A7800Hawk/A7800Hawk.cs | 31 +++++++++++++++++-- .../Consoles/Atari/A7800Hawk/Maria.cs | 26 +++------------- 3 files changed, 35 insertions(+), 25 deletions(-) diff --git a/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/A7800Hawk.IStatable.cs b/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/A7800Hawk.IStatable.cs index 081b2d0d30..36b9fa3455 100644 --- a/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/A7800Hawk.IStatable.cs +++ b/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/A7800Hawk.IStatable.cs @@ -76,7 +76,8 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk ser.Sync("cpu_resume_pending", ref cpu_resume_pending); ser.Sync("slow_access", ref slow_access); - + ser.Sync("small flag", ref small_flag); + ser.Sync("pal kara", ref PAL_Kara); ser.EndSection(); } diff --git a/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/A7800Hawk.cs b/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/A7800Hawk.cs index bc13004d43..005bb59f94 100644 --- a/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/A7800Hawk.cs +++ b/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/A7800Hawk.cs @@ -37,6 +37,8 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk public string s_mapper; public MapperBase mapper; + public bool small_flag = false; + public bool PAL_Kara = false; private readonly ITraceable _tracer; @@ -123,7 +125,14 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk if (cart_2.Bit(1)) { - s_mapper = "1"; + if (cart_2.Bit(3)) + { + s_mapper = "2"; + } + else + { + s_mapper = "1"; + } } else { @@ -136,6 +145,18 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk throw new Exception("ROM not in gamedb and has no header"); } + // some games that use the Super Game mapper only have 4 banks, so let's set a flag to limit bank size + if (rom.Length < 0x14000) + { + small_flag = true; + + // additionally, PAL Karateka has bank 6 (actually 2) at 0x4000 + if (rom.HashMD5()=="5E0A1E832BBCEA6FACB832FDE23A440A") + { + PAL_Kara = true; + } + } + Reset_Mapper(s_mapper); _rom = rom; @@ -208,14 +229,18 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk private void Reset_Mapper(string m) { - if (m=="0") + if (m == "0") { mapper = new MapperDefault(); } - if (m=="1") + if (m == "1") { mapper = new MapperSG(); } + if (m == "2") + { + mapper = new MapperSGE(); + } mapper.Core = this; } diff --git a/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/Maria.cs b/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/Maria.cs index 401446dc94..9e9ca302ea 100644 --- a/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/Maria.cs +++ b/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/Maria.cs @@ -90,9 +90,6 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk public int[] header_counter_max = new int [2]; public int header_pointer; // since headers could be 4 or 5 bytes, we need a seperate pointer - // write mode is actually persistent but exists outside of the regs - public bool global_write_mode; - // each frame contains 263 scanlines // each scanline consists of 113.5 CPU cycles (fast access) which equates to 454 Maria cycles // In total there are 29850.5 CPU cycles (fast access) in a frame @@ -327,7 +324,7 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk { // we are in 5 Byte header mode (i.e. using the character map) GFX_Objects[GFX_index, header_counter].write_mode = temp.Bit(7); - global_write_mode = temp.Bit(7); + GFX_Objects[GFX_index, header_counter].ind_mode = temp.Bit(5); header_pointer++; temp = (byte)(ReadMemory((ushort)(current_DLL_addr + header_pointer))); @@ -375,7 +372,7 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk DMA_phase_next = DMA_GRAPHICS; - GFX_Objects[GFX_index, header_counter].write_mode = global_write_mode; + GFX_Objects[GFX_index, header_counter].write_mode = false; GFX_Objects[GFX_index, header_counter].ind_mode = false; @@ -587,8 +584,6 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk color = Core.Maria_regs[color]; - // the top 4 bits from this are the color, the bottom 4 are the luminosity - // this is already conveniently arranged in the palette scanline_buffer[index] = _palette[color]; } } @@ -598,7 +593,7 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk else if (disp_mode == 2) // note: 1 is not used { local_width = GFX_Objects[local_GFX_index, i].width; - + for (int j = 0; j < local_width; j++) { for (int k = 7; k >= 0; k--) @@ -639,8 +634,6 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk color = Core.Maria_regs[color]; - // the top 4 bits from this are the color, the bottom 4 are the luminosity - // this is already conveniently arranged in the palette scanline_buffer[index] = _palette[color]; } } @@ -696,8 +689,6 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk color = Core.Maria_regs[color]; - // the top 4 bits from this are the color, the bottom 4 are the luminosity - // this is already conveniently arranged in the palette scanline_buffer[index] = _palette[color]; } } @@ -710,7 +701,7 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk if (disp_mode == 0) { local_width = GFX_Objects[local_GFX_index, i].width; - + for (int j = 0; j < local_width; j++) { for (int k = 7; k >= 0; k--) @@ -749,8 +740,6 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk { color = Core.Maria_regs[local_palette * 4 + color]; - // the top 4 bits from this are the color, the bottom 4 are the luminosity - // this is already conveniently arranged in the palette scanline_buffer[index] = _palette[color]; } } @@ -763,7 +752,7 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk // here the palette is determined by palette bit 2 only // hence only palette 0 or 4 is available local_palette = GFX_Objects[local_GFX_index, i].palette & 0x4; - + int temp_c0 = GFX_Objects[local_GFX_index, i].palette & 0x1; int temp_c1 = GFX_Objects[local_GFX_index, i].palette & 0x2; @@ -780,8 +769,6 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk { color = Core.Maria_regs[local_palette + color]; - // the top 4 bits from this are the color, the bottom 4 are the luminosity - // this is already conveniently arranged in the palette scanline_buffer[index] = _palette[color]; } } @@ -802,8 +789,6 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk { color = Core.Maria_regs[local_palette * 4 + 2]; // automatically use index 2 here - // the top 4 bits from this are the color, the bottom 4 are the luminosity - // this is already conveniently arranged in the palette scanline_buffer[index] = _palette[color]; } } @@ -839,7 +824,6 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk { ser.BeginSection("Maria"); - ser.Sync("global write mode", ref global_write_mode); ser.Sync("GFX_index", ref GFX_index); ser.EndSection(); From d44971a021190a27dc467e1e1ae0b0f718e5b666 Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Fri, 21 Jul 2017 16:34:27 -0400 Subject: [PATCH 61/93] Atari7800Hawk: More Mappers --- .../Atari/A7800Hawk/Mappers/MapperSG.cs | 30 +++-- .../Atari/A7800Hawk/Mappers/MapperSGE.cs | 113 ++++++++++++++++++ 2 files changed, 135 insertions(+), 8 deletions(-) create mode 100644 BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/Mappers/MapperSGE.cs diff --git a/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/Mappers/MapperSG.cs b/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/Mappers/MapperSG.cs index 9337faa364..45e68c1099 100644 --- a/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/Mappers/MapperSG.cs +++ b/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/Mappers/MapperSG.cs @@ -4,8 +4,7 @@ using System; namespace BizHawk.Emulation.Cores.Atari.A7800Hawk { - // Default mapper with no bank switching - // Just need to keep track of high score bios stuff + // Default Bank Switching Mapper used by most games public class MapperSG : MapperBase { public byte bank = 0; @@ -42,24 +41,39 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk } else { - if (addr >=0xC000) + if (addr >= 0xC000) { // bank 7 is fixed return Core._rom[Core._rom.Length - (0x10000 - addr)]; } else if (addr >= 0x8000) { - // reutrn whatever bank is there + // return whatever bank is there int temp_addr = addr - 0x8000; - return Core._rom[temp_addr + bank * 0x4000]; } else { // return bank 6 int temp_addr = addr - 0x4000; - return Core._rom[temp_addr + 6 * 0x4000]; - } + + if (!Core.small_flag) + { + return Core._rom[temp_addr + 6 * 0x4000]; + } + else + { + if (Core.PAL_Kara) + { + return Core._rom[temp_addr + 2 * 0x4000]; + } + else + { + // Should never get here, but in case we do just return FF + return 0xFF; + } + } + } } } } @@ -95,7 +109,7 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk // cartridge and other OPSYS if (addr>=0x8000) { - bank = (byte)(value & 0x7); + bank = (byte)(value & (Core.small_flag ? 0x3 : 0x7)); } } } diff --git a/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/Mappers/MapperSGE.cs b/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/Mappers/MapperSGE.cs new file mode 100644 index 0000000000..a3f5f47e98 --- /dev/null +++ b/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/Mappers/MapperSGE.cs @@ -0,0 +1,113 @@ +using BizHawk.Common; +using BizHawk.Common.NumberExtensions; +using System; + +namespace BizHawk.Emulation.Cores.Atari.A7800Hawk +{ + // Super Game mapper but with extra ROM at the start of the file + // Have to add 1 to bank number to get correct bank value + public class MapperSGE : MapperBase + { + public byte bank = 0; + + public override byte ReadMemory(ushort addr) + { + if (addr >= 0x1000 && addr < 0x1800) + { + //could be hsbios RAM here + if (Core._hsbios != null) + { + return Core._hsram[addr - 0x1000]; + } + return 0xFF; + } + else if (addr < 0x4000) + { + // could be either RAM mirror or ROM + if (addr >= 0x3000 && Core._hsbios != null) + { + return Core._hsbios[addr - 0x3000]; + } + else + { + return Core.RAM[0x800 + addr & 0x7FF]; + } + } + else + { + // cartridge and other OPSYS + if (addr >= (0x10000 - Core._bios.Length) && !Core.A7800_control_register.Bit(2)) + { + return Core._bios[addr - (0x10000 - Core._bios.Length)]; + } + else + { + if (addr >=0xC000) + { + // bank 7 is fixed + return Core._rom[Core._rom.Length - (0x10000 - addr)]; + } + else if (addr >= 0x8000) + { + // return whatever bank is there + // but remember we need to add 1 to adjust for the extra bank at the beginning + int temp_addr = addr - 0x8000; + return Core._rom[temp_addr + (bank + 1) * 0x4000]; + } + else + { + // return the 16k extra ROM (located at beginning of file) + int temp_addr = addr - 0x4000; + return Core._rom[temp_addr]; + } + } + } + } + + public override byte PeekMemory(ushort addr) + { + return ReadMemory(addr); + } + + public override void WriteMemory(ushort addr, byte value) + { + if (addr >= 0x1000 && addr < 0x1800) + { + //could be hsbios RAM here + if (Core._hsbios != null) + { + Core._hsram[addr - 0x1000] = value; + } + } + else if (addr < 0x4000) + { + // could be either RAM mirror or ROM + if (addr >= 0x3000 && Core._hsbios != null) + { + } + else + { + Core.RAM[0x800 + addr & 0x7FF] = value; + } + } + else + { + // cartridge and other OPSYS + if (addr>=0x8000) + { + bank = (byte)(value & 0x7); + } + } + } + + public override void PokeMemory(ushort addr, byte value) + { + WriteMemory(addr, value); + } + + public override void SyncState(Serializer ser) + { + ser.Sync("Bank", ref bank); + } + } +} From bd440f4830337b06ac212af8e0b59ff2089b38d7 Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Fri, 21 Jul 2017 16:36:17 -0400 Subject: [PATCH 62/93] Update BizHawk.Emulation.Cores.csproj --- BizHawk.Emulation.Cores/BizHawk.Emulation.Cores.csproj | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/BizHawk.Emulation.Cores/BizHawk.Emulation.Cores.csproj b/BizHawk.Emulation.Cores/BizHawk.Emulation.Cores.csproj index 64b89554e8..5e03c074f4 100644 --- a/BizHawk.Emulation.Cores/BizHawk.Emulation.Cores.csproj +++ b/BizHawk.Emulation.Cores/BizHawk.Emulation.Cores.csproj @@ -357,7 +357,8 @@ - + + A7800Hawk.cs From 676a7d0721bafe0f50f28a3673fa08e1115465d8 Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Fri, 21 Jul 2017 16:36:54 -0400 Subject: [PATCH 63/93] Atari7800Hawk Game DB Update --- Assets/gamedb/gamedb_a7800.txt | 33 +++++++++++++++++---------------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/Assets/gamedb/gamedb_a7800.txt b/Assets/gamedb/gamedb_a7800.txt index 5274e0aada..e5e7c0ca82 100644 --- a/Assets/gamedb/gamedb_a7800.txt +++ b/Assets/gamedb/gamedb_a7800.txt @@ -1,6 +1,7 @@ ;;NOTE: These hashes were generated using trimmed ROM headers ;0 = normal cart (no banking or pokey or RAM) ;1 = Super Game mapper (standard mapper) +;2 = Super Game with extra ROM md5:91041AADD1700A7A4076F4005F2C362F Diagnostics A78 NTSC=true;board=0 md5:89E7B20E7E0C629D00C6CA68949A216F Test Rom A78 NTSC=true;board=0 @@ -8,8 +9,8 @@ md5:4332c24e4f3bc72e7fe1b77adf66c2b7 3D Asteroids A78 NTSC=true;board=0 md5:A0285769753B18C407CB6E818B7DCAD2 3D Asteroids A78 NTSC=true;board=0 md5:0be996d25144966d5541c9eb4919b289 Ace of Aces A78 NTSC=true;board=1 md5:aadde920b3aaba03bc10b40bd0619c94 Ace of Aces A78 PAL=true;board=1 -md5:877dcc97a775ed55081864b2dbf5f1e2 Alien Brigade A78 NTSC=true;board=A78S9 -md5:de3e9496cb7341f865f27e5a72c7f2f5 Alien Brigade A78 PAL=true;board=A78S9 +md5:877dcc97a775ed55081864b2dbf5f1e2 Alien Brigade A78 NTSC=true;board=2 +md5:de3e9496cb7341f865f27e5a72c7f2f5 Alien Brigade A78 PAL=true;board=2 md5:0a9e58ef5eb9ff93246e0fff684dc7f1 Arkanoid (0911) A78 NTSC=true;board=0P md5:f9fb84658c5586df159a0c75cc46b54c Asteroids Deluxe A78 NTSC=true;board=0 md5:a65f79ad4a0bbdecd59d5f7eb3623fd7 Asteroids Deluxe A78 NTSC=true;board=0 @@ -24,7 +25,7 @@ md5:fba002089fcfa176454ab507e0eb76cb Basketbrawl A78 PAL=true;board=1 md5:6010a398070dfacb4c0173d75d73c50a Beef Drop A78 NTSC=true;board=0 md5:c534db0a062225b17cfb8ecce0fb9090 Beef Drop A78 NTSC=true;board=0 md5:CE25D34071B2C798ACE4C8792EAE8E84 Beef Drop A78 NTSC=true;board=0 -md5:6da5b1b9fa0001e3517f6084ff651b07 Bentley Bear - Crystal Quest A78 NTSC=true;board=A78S9 +md5:6da5b1b9fa0001e3517f6084ff651b07 Bentley Bear - Crystal Quest A78 NTSC=true;board=2 md5:5a09946e57dbe30408a8f253a28d07db Centipede A78 NTSC=true;board=0 md5:38c056a48472d9a9e16ebda5ed91dae7 Centipede A78 PAL=true;board=0 md5:93e4387864b014c155d7c17877990d1e Choplifter! A78 NTSC=true;board=0 @@ -37,8 +38,8 @@ md5:7cbe78fa06f47ba6516a67a4b003c9ee Crack'ed A78 PAL=true;board=1 md5:0c9b124355d5328697a3b9e0011353f2 Crazy Brix A78 NTSC=true;board=0 md5:45e1d527becc96d1715e810d1c07ac27 Crazy Brix A78 NTSC=true;board=0 md5:fc7db1a9243ce2140f716762b8352a5c Crazy Brix A78 PAL=true;board=0 -md5:a94e4560b6ad053a1c24e096f1262ebf Crossbow A78 NTSC=true;board=A78S9 -md5:63db371d67a98daec547b2abd5e7aa95 Crossbow A78 PAL=true;board=A78S9 +md5:a94e4560b6ad053a1c24e096f1262ebf Crossbow A78 NTSC=true;board=2 +md5:63db371d67a98daec547b2abd5e7aa95 Crossbow A78 PAL=true;board=2 md5:179b76ff729d4849b8f66a502398acae CDark Chambers A78 NTSC=true;board=1 md5:a2b8e2f159642c4b91de82e9a2928494 Dark Chambers A78 PAL=true;board=1 md5:95ac811c7d27af0032ba090f28c107bd Desert Falcon A78 NTSC=true;board=0 @@ -53,8 +54,8 @@ md5:de2ebafcf0e37aaa9d0e9525a7f4dd62 Double Dragon A78 PAL=true;board=A78AC md5:543484c00ba233736bcaba2da20eeea9 Double Dragon A78 NTSC=true;board=A78AC md5:2251a6a0f3aec84cc0aff66fc9fa91e8 F-18 Hornet A78 NTSC=true;board=A78AB md5:e7709da8e49d3767301947a0a0b9d2e6 F-18 Hornet A78 PAL=true;board=A78AB -md5:6287727ab36391a62f728bbdee88675c FailSafe A78 NTSC=true;board=A7848 -md5:d2bb22f704f1610a4c396c51f5188e15 FailSafe A78 NTSC=true;board=A7848 +md5:6287727ab36391a62f728bbdee88675c FailSafe A78 NTSC=true;board=0 +md5:d2bb22f704f1610a4c396c51f5188e15 FailSafe A78 NTSC=true;board=0 md5:d25d5d19188e9f149977c49eb0367cd1 Fatal Run A78 NTSC=true;board=1 md5:23505651ac2e47f3637152066c3aa62f Fatal Run A78 PAL=true;board=1 md5:e80f24e953563e6b61556737d67d3836 Fight Night A78 PAL=true;board=1 @@ -81,7 +82,7 @@ md5:6bc2daeb48e28d103a4298a276e7e551 Jr. Pac-Man (Tunnels) A78 NTSC=true;board md5:0b3baf47886915dd2eec5da7671bfa63 Jr. Pac-Man A78 NTSC=true;board=1R md5:8281ab17fa3bfc0a6c497d6a4f350061 Jr. Pac-Man A78 NTSC=true;board=1R md5:17b3b764d33eae9b5260f01df7bb9d2f KLAX A78 NTSC=true;board=1 -md5:5e0a1e832bbcea6facb832fde23a440a Karateka A78 PAL=true;board=A78S4 +md5:5e0a1e832bbcea6facb832fde23a440a Karateka A78 PAL=true;board=1 md5:c3a5a8692a423d43d9d28dd5b7d109d9 Karateka A78 NTSC=true;board=0 md5:f57d0af323d4e173fb49ed447f0563d7 Kung-Fu Master A78 NTSC=true;board=0 md5:2931b75811ad03f3ac9330838f3d231b Kung-Fu Master A78 PAL=true;board=0 @@ -97,8 +98,8 @@ md5:b02f93661f4b7e712810d2bf8e02ad79 Meteor Shower A78 NTSC=true;board=0 md5:2f1f199ecc2b414d28e01f0de53ca8f7 Meteor Shower A78 PAL=true;board=0 md5:bc1e905db1008493a9632aa83ab4682b Midnight Mutants A78 NTSC=true;board=1 md5:6794ea31570eba0b88a0bf1ead3f3f1b Midnight Mutants A78 PAL=true;board=1 -md5:017066f522908081ec3ee624f5e4a8aa Missing in Action A78 NTSC=true;board=A78S9 -md5:d0f46bf92ed6e7b1cce63278420cae8a Missing in Action A78 NTSC=true;board=A78S9 +md5:017066f522908081ec3ee624f5e4a8aa Missing in Action A78 NTSC=true;board=2 +md5:d0f46bf92ed6e7b1cce63278420cae8a Missing in Action A78 NTSC=true;board=2 md5:9ff38ea62004201d870caa8bd9463525 Moon Cresta A78 NTSC=true;board=0 md5:3bc8f554cf86f8132a623cc2201a564b Motor Psycho A78 NTSC=true;board=1 md5:5330bfe428a6b601b7e76c2cfc4cd049 Motor Psycho A78 PAL=true;board=1 @@ -112,7 +113,7 @@ md5:5d7bc7092de69095137456733e7b685d Pac-Man Collection A78 NTSC=true;board=0 md5:90223a8a363bdf643a19d0f97e63b1b2 PacArcade A78 NTSC=true;board=0 md5:386bded4a944bae455fedf56206dd1dd Pete Rose Baseball A78 PAL=true;board=0 md5:1a5207870dec6fae9111cb747e20d8e3 Pete Rose Baseball A78 NTSC=true;board=0 -md5:05f43244465943ce819780a71a5b572a Pitfighter A78 NTSC=true;board=A78S4 +md5:05f43244465943ce819780a71a5b572a Pitfighter A78 NTSC=true;board=1 md5:33aea1e2b6634a1dec8c7006d9afda22 Planet Smashers A78 NTSC=true;board=1 md5:2837a8fd49b7fc7ccd70fd45b69c5099 Planet Smashers A78 PAL=true;board=1 md5:86546808dc60961cdb1b20e761c50ab1 Plutos A78 NTSC=true;board=1R @@ -120,7 +121,7 @@ md5:584582bb09ee8122e7fc09dc7d1ed813 Pole Position II A78 NTSC=true;board=0 md5:865457e0e0f48253b08f77b9e18f93b2 Pole Position II A78 PAL=true;board=0 md5:66e7230f7ef9d14db82d76b06b241bc0 Q-bert A78 NTSC=true;board=0 md5:ac03806cef2558fc795a7d5d8dba7bc0 Rampage A78 NTSC=true;board=A78AC -md5:383ed9bd1efb9b6cb3388a777678c928 Realsports Baseball A78 NTSC=true;board=A78S4 +md5:383ed9bd1efb9b6cb3388a777678c928 Realsports Baseball A78 NTSC=true;board=1 md5:8f7eb10ad0bd75474abf0c6c36c08486 Rescue on Fractalus A78 NTSC=true;board=0 md5:43525a0405184875c2ecfd0196886a34 Rip Off A78 NTSC=true;board=0 md5:106b409c6f4c219b1a3b3d099ead3b2b Rip Off A78 PAL=true;board=0 @@ -144,16 +145,16 @@ md5:cc18e3b37a507c4217eb6cb1de8c8538 Super Huey UH-IX A78 NTSC=true;board=0 md5:162f9c953f0657689cc74ab20b40280f Super Huey UH-IX A78 PAL=true;board=0 md5:59b5793bece1c80f77b55d60fb39cb94 Super Skateboardin' A78 NTSC=true;board=0 md5:95d7c321dce8f57623a9c5b4947bb375 Super Skateboardin' A78 PAL=true;board=0 -md5:5c4f752371a523f15e9980fea73b874d Tank Command A78 NTSC=true;board=A78S4 +md5:5c4f752371a523f15e9980fea73b874d Tank Command A78 NTSC=true;board=1 md5:3bb9c8d9adc912dd7f8471c97445cd8d Titlematch Pro Wrestling A78 PAL=true;board=0 md5:1af475ff6429a160752b592f0f92b287 Titlematch Pro Wrestling A78 NTSC=true;board=0 md5:c3903ab01a51222a52197dbfe6538ecf Tomcat F14 A78 NTSC=true;board=0 md5:682338364243b023ecc9d24f0abfc9a7 Tomcat F14 A78 PAL=true;board=0 md5:208ef955fa90a29815eb097bce89bace Touchdown Football A78 NTSC=true;board=1 -md5:8d64763db3100aadc552db5e6868506a Tower Toppler A78 NTSC=true;board=A78S4R -md5:32a37244a9c6cc928dcdf02b45365aa8 Tower Toppler A78 PAL=true;board=A78S4R +md5:8d64763db3100aadc552db5e6868506a Tower Toppler A78 NTSC=true;board=1R +md5:32a37244a9c6cc928dcdf02b45365aa8 Tower Toppler A78 PAL=true;board=1R md5:412cc5bfa08bd03244b9c4e8d46cd0a0 Wasp (Standard Edition) A78 NTSC=true;board=0 -md5:427cb05d0a1abb068998e2760d77f4fb Water Ski A78 NTSC=true;board=A78S4 +md5:427cb05d0a1abb068998e2760d77f4fb Water Ski A78 NTSC=true;board=1 md5:3799d72f78dda2ee87b0ef8bf7b91186 Winter Games A78 NTSC=true;board=1R md5:6813ffff510f930c867b3f0aba78ac85 Worm (0703) A78 NTSC=true;board=0 md5:05fb699db9eef564e2fe45c568746dbc Xenophobe A78 NTSC=true;board=1 From 38ff2899902512b92d4b885be8df1070af958229 Mon Sep 17 00:00:00 2001 From: nattthebear Date: Fri, 21 Jul 2017 16:44:12 -0400 Subject: [PATCH 64/93] Sameboy: Add copyright notices from original repo back. They were inadvertently left out because I copied a subdirectory and not the root directory --- waterbox/sameboy/CHANGES.md | 1 + waterbox/sameboy/LICENSE | 21 +++++++++++++++ waterbox/sameboy/README.md | 51 +++++++++++++++++++++++++++++++++++++ 3 files changed, 73 insertions(+) create mode 100644 waterbox/sameboy/CHANGES.md create mode 100644 waterbox/sameboy/LICENSE create mode 100644 waterbox/sameboy/README.md diff --git a/waterbox/sameboy/CHANGES.md b/waterbox/sameboy/CHANGES.md new file mode 100644 index 0000000000..b94aec4c71 --- /dev/null +++ b/waterbox/sameboy/CHANGES.md @@ -0,0 +1 @@ +See https://sameboy.github.io/changelog/ \ No newline at end of file diff --git a/waterbox/sameboy/LICENSE b/waterbox/sameboy/LICENSE new file mode 100644 index 0000000000..008851f512 --- /dev/null +++ b/waterbox/sameboy/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2015-2017 Lior Halphon + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/waterbox/sameboy/README.md b/waterbox/sameboy/README.md new file mode 100644 index 0000000000..9aa5201b63 --- /dev/null +++ b/waterbox/sameboy/README.md @@ -0,0 +1,51 @@ +# SameBoy + +SameBoy is an open source Gameboy (DMG) and Gameboy Color (CGB) emulator, written in portable C. It has a native Cocoa frontend for OS X, and an incomplete experimental SDL frontend for other operating systems. It also includes a text-based debugger with an expression evaluator. Visit [the website](https://sameboy.github.io/). + +## Features +Features common to both Cocoa and SDL versions: + * Supports Gameboy (DMG) and Gameboy Color (CGB) emulation + * Lets you choose the model you want to emulate regardless of ROM + * High quality 96KHz audio + * Battery save support + * Save states + * Includes open source DMG and CGB boot ROMs: + * Complete support for (and documentation of) *all* game-specific palettes in the CGB boot ROM, for accurate emulation of Gameboy games on a Gameboy Color + * Supports manual palette selection with key combinations, with 4 additional new palettes (A + B + direction) + * Supports palette selection in a CGB game, forcing it to run in 'paletted' DMG mode, if ROM allows doing so. + * Support for games with a non-Nintendo logo in the header + * No long animation in the DMG boot + * Advanced text-based debugger with an expression evaluator, disassembler, conditional breakpoints, conditional watchpoints, backtracing and other features + * Emulates [PCM_12 and PCM_34 registers](https://github.com/LIJI32/GBVisualizer) + * Emulates LCD timing effects, supporting the Demotronic trick, [GBVideoPlayer](https://github.com/LIJI32/GBVideoPlayer) and other tech demos + * Extermely high accuracy + * Real time clock emulation + +Features currently supported only with the Cocoa version: + * Native Cocoa interface, with support for all system-wide features, such as drag-and-drop and smart titlebars + * Retina display support, allowing a wider range of scaling factors without artifacts + * Optional frame blending + * Several [scaling algorithms](https://sameboy.github.io/scaling/) (Including exclusive algorithms like OmniScale and Anti-aliased Scale2x) + * GameBoy Camera support + +[Read more](https://sameboy.github.io/features/). + +## Compatibility +SameBoy passes many of [blargg's test ROMs](http://gbdev.gg8.se/wiki/articles/Test_ROMs#Blargg.27s_tests), as well as 77 out of 78 of [mooneye-gb's](https://github.com/Gekkio/mooneye-gb) tests (Some tests require the original boot ROMs). SameBoy should work with most games and demos, please [report](https://github.com/LIJI32/SameBoy/issues/new) any broken ROM. The latest results for SameBoy's automatic tester are available [here](https://sameboy.github.io/automation/). + +## Compilation +SameBoy requires the following tools and libraries to build: + * clang + * make + * Cocoa port: OS X SDK and Xcode command line tools + * SDL port: SDL2.framework (OS X) or libsdl2 (Other platforms) + * [rgbds](https://github.com/bentley/rgbds/releases/), for boot ROM compilation + +On Windows, SameBoy also requires: + * Visual Studio (For headers, etc.) + * [GnuWin](http://gnuwin32.sourceforge.net/) + * Running vcvars32 before running make. Make sure all required tools and libraries are in %PATH% and %lib%, repsectively. + +To compile, simply run `make`. The targets are cocoa (Default for OS X), sdl (Default for everything else), bootroms and tester. You may also specify CONF=debug (default), CONF=release or CONF=native_release to control optimization and symbols. native_release is faster than release, but is optimized to the host's CPU and therefore is not portable. You may set BOOTROMS_DIR=... to a directory containing precompiled dmg_boot.bin and cgb_boot.bin files, otherwise the build system will compile and use SameBoy's own boot ROMs. + +SameBoy was compiled and tested on macOS, Ubuntu and 32-bit Windows 7. From fcfe2b23c9e2813e96e1783286f2006571537cef Mon Sep 17 00:00:00 2001 From: nattthebear Date: Fri, 21 Jul 2017 18:23:14 -0400 Subject: [PATCH 65/93] Pizza Boy makes some interesting attempts, but doesn't stack up against the serious GB cores --- .../Consoles/Nintendo/Gameboy/LibPizza.cs | 43 - .../Consoles/Nintendo/Gameboy/Pizza.cs | 169 -- output/dll/pizza.wbx.gz | Bin 57959 -> 0 bytes waterbox/pizza/.vscode/settings.json | 6 - waterbox/pizza/Makefile | 54 - waterbox/pizza/README.md | 49 - waterbox/pizza/blip_buf/blip_buf.c | 344 --- waterbox/pizza/blip_buf/blip_buf.h | 72 - waterbox/pizza/lib/cartridge.c | 233 -- waterbox/pizza/lib/cartridge.h | 28 - waterbox/pizza/lib/cycles.c | 321 --- waterbox/pizza/lib/cycles.h | 68 - waterbox/pizza/lib/gameboy.c | 235 -- waterbox/pizza/lib/gameboy.h | 28 - waterbox/pizza/lib/global.c | 47 - waterbox/pizza/lib/global.h | 40 - waterbox/pizza/lib/gpu.c | 1072 ------- waterbox/pizza/lib/gpu.h | 133 - waterbox/pizza/lib/input.c | 50 - waterbox/pizza/lib/input.h | 27 - waterbox/pizza/lib/interrupt.h | 35 - waterbox/pizza/lib/mmu.c | 1029 ------- waterbox/pizza/lib/mmu.h | 112 - waterbox/pizza/lib/serial.c | 192 -- waterbox/pizza/lib/serial.h | 92 - waterbox/pizza/lib/sgb.c | 999 ------- waterbox/pizza/lib/sgb.h | 36 - waterbox/pizza/lib/snes_spc/SNES_SPC.cpp | 564 ---- waterbox/pizza/lib/snes_spc/SNES_SPC.h | 284 -- waterbox/pizza/lib/snes_spc/SNES_SPC_misc.cpp | 380 --- .../pizza/lib/snes_spc/SNES_SPC_state.cpp | 129 - waterbox/pizza/lib/snes_spc/SPC_CPU.h | 1220 -------- waterbox/pizza/lib/snes_spc/SPC_DSP.cpp | 1018 ------- waterbox/pizza/lib/snes_spc/SPC_DSP.h | 304 -- waterbox/pizza/lib/snes_spc/SPC_Filter.cpp | 68 - waterbox/pizza/lib/snes_spc/SPC_Filter.h | 47 - waterbox/pizza/lib/snes_spc/blargg_common.h | 186 -- waterbox/pizza/lib/snes_spc/blargg_config.h | 24 - waterbox/pizza/lib/snes_spc/blargg_endian.h | 185 -- waterbox/pizza/lib/snes_spc/blargg_source.h | 100 - waterbox/pizza/lib/snes_spc/changes.txt | 107 - waterbox/pizza/lib/snes_spc/dsp.cpp | 48 - waterbox/pizza/lib/snes_spc/dsp.h | 83 - waterbox/pizza/lib/snes_spc/license.txt | 504 ---- waterbox/pizza/lib/snes_spc/readme.txt | 86 - waterbox/pizza/lib/snes_spc/snes_spc.txt | 318 --- waterbox/pizza/lib/snes_spc/spc.cpp | 74 - waterbox/pizza/lib/snes_spc/spc.h | 149 - waterbox/pizza/lib/sound.c | 1159 -------- waterbox/pizza/lib/sound.h | 300 -- waterbox/pizza/lib/sound_output.c | 57 - waterbox/pizza/lib/sound_output.h | 9 - waterbox/pizza/lib/timer.c | 79 - waterbox/pizza/lib/timer.h | 63 - waterbox/pizza/lib/utils.c | 75 - waterbox/pizza/lib/utils.h | 27 - waterbox/pizza/lib/z80_gameboy.h | 2480 ----------------- waterbox/pizza/lib/z80_gameboy_regs.h | 48 - waterbox/pizza/pizza.c | 194 -- 59 files changed, 15883 deletions(-) delete mode 100644 BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/LibPizza.cs delete mode 100644 BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/Pizza.cs delete mode 100644 output/dll/pizza.wbx.gz delete mode 100644 waterbox/pizza/.vscode/settings.json delete mode 100644 waterbox/pizza/Makefile delete mode 100644 waterbox/pizza/README.md delete mode 100644 waterbox/pizza/blip_buf/blip_buf.c delete mode 100644 waterbox/pizza/blip_buf/blip_buf.h delete mode 100644 waterbox/pizza/lib/cartridge.c delete mode 100644 waterbox/pizza/lib/cartridge.h delete mode 100644 waterbox/pizza/lib/cycles.c delete mode 100644 waterbox/pizza/lib/cycles.h delete mode 100644 waterbox/pizza/lib/gameboy.c delete mode 100644 waterbox/pizza/lib/gameboy.h delete mode 100644 waterbox/pizza/lib/global.c delete mode 100644 waterbox/pizza/lib/global.h delete mode 100644 waterbox/pizza/lib/gpu.c delete mode 100644 waterbox/pizza/lib/gpu.h delete mode 100644 waterbox/pizza/lib/input.c delete mode 100644 waterbox/pizza/lib/input.h delete mode 100644 waterbox/pizza/lib/interrupt.h delete mode 100644 waterbox/pizza/lib/mmu.c delete mode 100644 waterbox/pizza/lib/mmu.h delete mode 100644 waterbox/pizza/lib/serial.c delete mode 100644 waterbox/pizza/lib/serial.h delete mode 100644 waterbox/pizza/lib/sgb.c delete mode 100644 waterbox/pizza/lib/sgb.h delete mode 100644 waterbox/pizza/lib/snes_spc/SNES_SPC.cpp delete mode 100644 waterbox/pizza/lib/snes_spc/SNES_SPC.h delete mode 100644 waterbox/pizza/lib/snes_spc/SNES_SPC_misc.cpp delete mode 100644 waterbox/pizza/lib/snes_spc/SNES_SPC_state.cpp delete mode 100644 waterbox/pizza/lib/snes_spc/SPC_CPU.h delete mode 100644 waterbox/pizza/lib/snes_spc/SPC_DSP.cpp delete mode 100644 waterbox/pizza/lib/snes_spc/SPC_DSP.h delete mode 100644 waterbox/pizza/lib/snes_spc/SPC_Filter.cpp delete mode 100644 waterbox/pizza/lib/snes_spc/SPC_Filter.h delete mode 100644 waterbox/pizza/lib/snes_spc/blargg_common.h delete mode 100644 waterbox/pizza/lib/snes_spc/blargg_config.h delete mode 100644 waterbox/pizza/lib/snes_spc/blargg_endian.h delete mode 100644 waterbox/pizza/lib/snes_spc/blargg_source.h delete mode 100644 waterbox/pizza/lib/snes_spc/changes.txt delete mode 100644 waterbox/pizza/lib/snes_spc/dsp.cpp delete mode 100644 waterbox/pizza/lib/snes_spc/dsp.h delete mode 100644 waterbox/pizza/lib/snes_spc/license.txt delete mode 100644 waterbox/pizza/lib/snes_spc/readme.txt delete mode 100644 waterbox/pizza/lib/snes_spc/snes_spc.txt delete mode 100644 waterbox/pizza/lib/snes_spc/spc.cpp delete mode 100644 waterbox/pizza/lib/snes_spc/spc.h delete mode 100644 waterbox/pizza/lib/sound.c delete mode 100644 waterbox/pizza/lib/sound.h delete mode 100644 waterbox/pizza/lib/sound_output.c delete mode 100644 waterbox/pizza/lib/sound_output.h delete mode 100644 waterbox/pizza/lib/timer.c delete mode 100644 waterbox/pizza/lib/timer.h delete mode 100644 waterbox/pizza/lib/utils.c delete mode 100644 waterbox/pizza/lib/utils.h delete mode 100644 waterbox/pizza/lib/z80_gameboy.h delete mode 100644 waterbox/pizza/lib/z80_gameboy_regs.h delete mode 100644 waterbox/pizza/pizza.c diff --git a/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/LibPizza.cs b/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/LibPizza.cs deleted file mode 100644 index e8306aea35..0000000000 --- a/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/LibPizza.cs +++ /dev/null @@ -1,43 +0,0 @@ -using BizHawk.Common.BizInvoke; -using BizHawk.Emulation.Cores.Waterbox; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Runtime.InteropServices; -using System.Text; -using System.Threading.Tasks; - -namespace BizHawk.Emulation.Cores.Consoles.Nintendo.Gameboy -{ - public abstract class LibPizza : LibWaterboxCore, ICustomSaveram - { - [Flags] - public enum Buttons : uint - { - A = 0x01, - B = 0x02, - SELECT = 0x04, - START = 0x08, - RIGHT = 0x10, - LEFT = 0x20, - UP = 0x40, - DOWN = 0x80 - } - [StructLayout(LayoutKind.Sequential)] - public new class FrameInfo : LibWaterboxCore.FrameInfo - { - public long Time; - public Buttons Keys; - } - [BizImport(CC)] - public abstract bool Init(byte[] rom, int romlen, bool sgb, byte[] spc, int spclen); - [BizImport(CC)] - public abstract bool IsCGB(); - [BizImport(CC)] - public abstract int GetSaveramSize(); - [BizImport(CC)] - public abstract void PutSaveram(byte[] data, int size); - [BizImport(CC)] - public abstract void GetSaveram(byte[] data, int size); - } -} diff --git a/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/Pizza.cs b/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/Pizza.cs deleted file mode 100644 index 90fecb3b99..0000000000 --- a/BizHawk.Emulation.Cores/Consoles/Nintendo/Gameboy/Pizza.cs +++ /dev/null @@ -1,169 +0,0 @@ -using BizHawk.Common; -using BizHawk.Common.BizInvoke; -using BizHawk.Emulation.Common; -using BizHawk.Emulation.Cores.Waterbox; -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Text; -using System.Threading.Tasks; - -namespace BizHawk.Emulation.Cores.Consoles.Nintendo.Gameboy -{ - [Core("Pizza Boy", "Davide Berra", true, true, "c7bc6ee376028b3766de8d7a02e60ab794841f45", - "https://github.com/davideberra/emu-pizza/", false)] - public class Pizza : WaterboxCore - { - private LibPizza _pizza; - private readonly bool _sgb; - - [CoreConstructor("SGB")] - public Pizza(byte[] rom, CoreComm comm) - : this(rom, comm, true) - { } - - [CoreConstructor("GB")] - public Pizza(CoreComm comm, byte[] rom) - : this(rom, comm, false) - { } - - public Pizza(byte[] rom, CoreComm comm, bool sgb) - : base(comm, new Configuration - { - DefaultWidth = 160, - DefaultHeight = 144, - MaxWidth = 256, - MaxHeight = 224, - MaxSamples = 1024, - DefaultFpsNumerator = TICKSPERSECOND, - DefaultFpsDenominator = TICKSPERFRAME - }) - { - if (sgb && (rom[0x143] & 0xc0) == 0xc0) - { - throw new CGBNotSupportedException(); - } - - _pizza = PreInit(new PeRunnerOptions - { - Filename = "pizza.wbx", - SbrkHeapSizeKB = 128, - InvisibleHeapSizeKB = 16, - SealedHeapSizeKB = 5 * 1024, - PlainHeapSizeKB = 16, - MmapHeapSizeKB = 0 - }); - - var spc = sgb - ? Util.DecompressGzipFile(new MemoryStream(Properties.Resources.SgbCartPresent_SPC)) - : new byte[0]; - _sgb = sgb; - if (!_pizza.Init(rom, rom.Length, _sgb, spc, spc.Length)) - { - throw new InvalidOperationException("Core rejected the rom!"); - } - - PostInit(); - - if (_sgb) - { - VsyncNumerator = TICKSPERSECOND_SGB; - BufferWidth = 256; - BufferHeight = 224; - } - InitializeRtc(new DateTime(2010, 1, 1)); // TODO: connect to syncsettings - Console.WriteLine("Pizza Initialized: CGB {0} SGB {1}", IsCGBMode(), IsSGBMode()); - } - - /// - /// the nominal length of one frame - /// - private const int TICKSPERFRAME = 35112; - - /// - /// number of ticks per second (GB, CGB) - /// - private const int TICKSPERSECOND = 2097152; - - /// - /// number of ticks per second (SGB) - /// - private const int TICKSPERSECOND_SGB = 2147727; - - #region Controller - - private static readonly ControllerDefinition _gbDefinition; - private static readonly ControllerDefinition _sgbDefinition; - public override ControllerDefinition ControllerDefinition => _sgb ? _sgbDefinition : _gbDefinition; - - private static ControllerDefinition CreateControllerDefinition(int p) - { - var ret = new ControllerDefinition { Name = "Gameboy Controller" }; - for (int i = 0; i < p; i++) - { - ret.BoolButtons.AddRange( - new[] { "Up", "Down", "Left", "Right", "A", "B", "Select", "Start" } - .Select(s => $"P{i + 1} {s}")); - } - return ret; - } - - static Pizza() - { - _gbDefinition = CreateControllerDefinition(1); - _sgbDefinition = CreateControllerDefinition(4); - } - - private LibPizza.Buttons GetButtons(IController c) - { - LibPizza.Buttons b = 0; - for (int i = _sgb ? 4 : 1; i > 0; i--) - { - if (c.IsPressed($"P{i} Up")) - b |= LibPizza.Buttons.UP; - if (c.IsPressed($"P{i} Down")) - b |= LibPizza.Buttons.DOWN; - if (c.IsPressed($"P{i} Left")) - b |= LibPizza.Buttons.LEFT; - if (c.IsPressed($"P{i} Right")) - b |= LibPizza.Buttons.RIGHT; - if (c.IsPressed($"P{i} A")) - b |= LibPizza.Buttons.A; - if (c.IsPressed($"P{i} B")) - b |= LibPizza.Buttons.B; - if (c.IsPressed($"P{i} Select")) - b |= LibPizza.Buttons.SELECT; - if (c.IsPressed($"P{i} Start")) - b |= LibPizza.Buttons.START; - if (i != 1) - b = (LibPizza.Buttons)((uint)b << 8); - } - return b; - } - - #endregion - - LibPizza.FrameInfo _tmp; // TODO: clean this up so it's not so hacky - - protected override LibWaterboxCore.FrameInfo FrameAdvancePrep(IController controller, bool render, bool rendersound) - { - return _tmp = new LibPizza.FrameInfo - { - Time = GetRtcTime(false), - Keys = GetButtons(controller) - }; - } - - protected override void FrameAdvancePost() - { - //Console.WriteLine(_tmp.Cycles); - _tmp = null; - } - - public bool IsCGBMode() => _pizza.IsCGB(); - public bool IsSGBMode() => _sgb; - - public override string SystemId => _sgb ? "SGB" : "GB"; - } -} diff --git a/output/dll/pizza.wbx.gz b/output/dll/pizza.wbx.gz deleted file mode 100644 index 3df3e57b0fe2aed47d15c8b5220f5fc8912237bf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 57959 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 E03_?z#{d8T diff --git a/waterbox/pizza/.vscode/settings.json b/waterbox/pizza/.vscode/settings.json deleted file mode 100644 index d5073385ae..0000000000 --- a/waterbox/pizza/.vscode/settings.json +++ /dev/null @@ -1,6 +0,0 @@ -// Place your settings in this file to overwrite default and user settings. -{ - "editor.insertSpaces": false, - "editor.tabSize": 4, - "editor.detectIndentation": false -} \ No newline at end of file diff --git a/waterbox/pizza/Makefile b/waterbox/pizza/Makefile deleted file mode 100644 index 4893bc03f3..0000000000 --- a/waterbox/pizza/Makefile +++ /dev/null @@ -1,54 +0,0 @@ -CC = x86_64-nt64-midipix-gcc -CPP = x86_64-nt64-midipix-g++ - -FLAGS:=-Wall -Werror=pointer-to-int-cast -Werror=int-to-pointer-cast -Werror=implicit-function-declaration \ - -fomit-frame-pointer -fvisibility=hidden \ - -O3 -flto - -CCFLAGS:=$(FLAGS) -Ilib \ - -I../emulibc \ - -std=c99 \ - -DLSB_FIRST -D_GNU_SOURCE - -CPPFLAGS:=$(FLAGS) -DSPC_NO_COPY_STATE_FUNCS - -TARGET = pizza.wbx - -LDFLAGS = -Wl,--dynamicbase,--export-all-symbols - -ROOT_DIR:=$(shell dirname $(realpath $(lastword $(MAKEFILE_LIST)))) -C_SRCS:=$(shell find $(ROOT_DIR) -type f -name '*.c') -CPP_SRCS:=$(shell find $(ROOT_DIR) -type f -name '*.cpp') -SRCS:=$(C_SRCS) $(CPP_SRCS) -OBJ_DIR:=$(ROOT_DIR)/obj - -__OBJS:=$(SRCS:.c=.o) -_OBJS:=$(__OBJS:.cpp=.opp) -OBJS:=$(patsubst $(ROOT_DIR)%,$(OBJ_DIR)%,$(_OBJS)) - -$(OBJ_DIR)/%.o: %.c - @mkdir -p $(@D) - @$(CC) -c -o $@ $< $(CCFLAGS) - -$(OBJ_DIR)/%.opp: %.cpp - @mkdir -p $(@D) - @$(CPP) -c -o $@ $< $(CPPFLAGS) - -all: $(TARGET) - -.PHONY: clean all - -$(TARGET).in: $(OBJS) - @$(CPP) -o $@ $(LDFLAGS) $(FLAGS) $(OBJS) ../emulibc/libemuhost.so - -$(TARGET): $(TARGET).in - strip $< -o $@ -R /4 -R /14 -R /29 -R /41 -R /55 -R /67 -R /78 -R /89 -R /104 -# cp $< $@ - -clean: - rm -rf $(OBJ_DIR) - rm -f $(TARGET).in - rm -f $(TARGET) - -#install: -# $(CP) $(TARGET) $(DEST_$(ARCH)) diff --git a/waterbox/pizza/README.md b/waterbox/pizza/README.md deleted file mode 100644 index edc069a750..0000000000 --- a/waterbox/pizza/README.md +++ /dev/null @@ -1,49 +0,0 @@ -# Emu-pizza -A new born Gameboy Classic/Color emulator.... - -Requirements ------------ -Emu-pizza requires libSDL2 to compile and run Space Invaders and Gameboy games. To install it - -on an APT based distro: -``` -sudo apt-get install libsdl2-dev -``` - -on a YUM based distro: -``` -sudo yum install SDL2-devel -``` - -Compile -------- -``` -make -``` - -Usage ------ -``` -emu-pizza [gameboy rom] -``` - -Gameboy keys -------------------- -* Arrows -- Arrows (rly?) -* Enter -- Start -* Space -- Select -* Z/X -- A/B buttons -* Q -- Exit - -Supported ROMS --------------- -* Almost totality of Gameboy roms - -Todo ----- -* Serial cable emulation - -Credits -------- - -Thanks to [Emulator 101](http://www.emulator101.com), the source of all my current knowledge on 8080 emulation diff --git a/waterbox/pizza/blip_buf/blip_buf.c b/waterbox/pizza/blip_buf/blip_buf.c deleted file mode 100644 index 1bd3377e92..0000000000 --- a/waterbox/pizza/blip_buf/blip_buf.c +++ /dev/null @@ -1,344 +0,0 @@ -/* blip_buf 1.1.0. http://www.slack.net/~ant/ */ - -#include "blip_buf.h" - -#include -#include -#include -#include - -/* Library Copyright (C) 2003-2009 Shay Green. This library is free software; -you can redistribute it and/or modify it under the terms of the GNU Lesser -General Public License as published by the Free Software Foundation; either -version 2.1 of the License, or (at your option) any later version. This -library is distributed in the hope that it will be useful, but WITHOUT ANY -WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR -A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more -details. You should have received a copy of the GNU Lesser General Public -License along with this module; if not, write to the Free Software Foundation, -Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ - -#if defined (BLARGG_TEST) && BLARGG_TEST - #include "blargg_test.h" -#endif - -/* Equivalent to ULONG_MAX >= 0xFFFFFFFF00000000. -Avoids constants that don't fit in 32 bits. */ -#if ULONG_MAX/0xFFFFFFFF > 0xFFFFFFFF - typedef unsigned long fixed_t; - enum { pre_shift = 32 }; - -#elif defined(ULLONG_MAX) - typedef unsigned long long fixed_t; - enum { pre_shift = 32 }; - -#else - typedef unsigned fixed_t; - enum { pre_shift = 0 }; - -#endif - -enum { time_bits = pre_shift + 20 }; - -static fixed_t const time_unit = (fixed_t) 1 << time_bits; - -enum { bass_shift = 9 }; /* affects high-pass filter breakpoint frequency */ -enum { end_frame_extra = 2 }; /* allows deltas slightly after frame length */ - -enum { half_width = 8 }; -enum { buf_extra = half_width*2 + end_frame_extra }; -enum { phase_bits = 5 }; -enum { phase_count = 1 << phase_bits }; -enum { delta_bits = 15 }; -enum { delta_unit = 1 << delta_bits }; -enum { frac_bits = time_bits - pre_shift }; - -/* We could eliminate avail and encode whole samples in offset, but that would -limit the total buffered samples to blip_max_frame. That could only be -increased by decreasing time_bits, which would reduce resample ratio accuracy. -*/ - -/** Sample buffer that resamples to output rate and accumulates samples -until they're read out */ -struct blip_t -{ - fixed_t factor; - fixed_t offset; - int avail; - int size; - int integrator; -}; - -typedef int buf_t; - -/* probably not totally portable */ -#define SAMPLES( buf ) ((buf_t*) ((buf) + 1)) - -/* Arithmetic (sign-preserving) right shift */ -#define ARITH_SHIFT( n, shift ) \ - ((n) >> (shift)) - -enum { max_sample = +32767 }; -enum { min_sample = -32768 }; - -#define CLAMP( n ) \ - {\ - if ( (short) n != n )\ - n = ARITH_SHIFT( n, 16 ) ^ max_sample;\ - } - -static void check_assumptions( void ) -{ - int n; - - #if INT_MAX < 0x7FFFFFFF || UINT_MAX < 0xFFFFFFFF - #error "int must be at least 32 bits" - #endif - - assert( (-3 >> 1) == -2 ); /* right shift must preserve sign */ - - n = max_sample * 2; - CLAMP( n ); - assert( n == max_sample ); - - n = min_sample * 2; - CLAMP( n ); - assert( n == min_sample ); - - assert( blip_max_ratio <= time_unit ); - assert( blip_max_frame <= (fixed_t) -1 >> time_bits ); -} - -blip_t* blip_new( int size ) -{ - blip_t* m; - assert( size >= 0 ); - - m = (blip_t*) malloc( sizeof *m + (size + buf_extra) * sizeof (buf_t) ); - if ( m ) - { - m->factor = time_unit / blip_max_ratio; - m->size = size; - blip_clear( m ); - check_assumptions(); - } - return m; -} - -void blip_delete( blip_t* m ) -{ - if ( m != NULL ) - { - /* Clear fields in case user tries to use after freeing */ - memset( m, 0, sizeof *m ); - free( m ); - } -} - -void blip_set_rates( blip_t* m, double clock_rate, double sample_rate ) -{ - double factor = time_unit * sample_rate / clock_rate; - m->factor = (fixed_t) factor; - - /* Fails if clock_rate exceeds maximum, relative to sample_rate */ - assert( 0 <= factor - m->factor && factor - m->factor < 1 ); - - /* Avoid requiring math.h. Equivalent to - m->factor = (int) ceil( factor ) */ - if ( m->factor < factor ) - m->factor++; - - /* At this point, factor is most likely rounded up, but could still - have been rounded down in the floating-point calculation. */ -} - -void blip_clear( blip_t* m ) -{ - /* We could set offset to 0, factor/2, or factor-1. 0 is suitable if - factor is rounded up. factor-1 is suitable if factor is rounded down. - Since we don't know rounding direction, factor/2 accommodates either, - with the slight loss of showing an error in half the time. Since for - a 64-bit factor this is years, the halving isn't a problem. */ - - m->offset = m->factor / 2; - m->avail = 0; - m->integrator = 0; - memset( SAMPLES( m ), 0, (m->size + buf_extra) * sizeof (buf_t) ); -} - -int blip_clocks_needed( const blip_t* m, int samples ) -{ - fixed_t needed; - - /* Fails if buffer can't hold that many more samples */ - assert( samples >= 0 && m->avail + samples <= m->size ); - - needed = (fixed_t) samples * time_unit; - if ( needed < m->offset ) - return 0; - - return (needed - m->offset + m->factor - 1) / m->factor; -} - -void blip_end_frame( blip_t* m, unsigned t ) -{ - fixed_t off = t * m->factor + m->offset; - m->avail += off >> time_bits; - m->offset = off & (time_unit - 1); - - /* Fails if buffer size was exceeded */ - assert( m->avail <= m->size ); -} - -int blip_samples_avail( const blip_t* m ) -{ - return m->avail; -} - -static void remove_samples( blip_t* m, int count ) -{ - buf_t* buf = SAMPLES( m ); - int remain = m->avail + buf_extra - count; - m->avail -= count; - - memmove( &buf [0], &buf [count], remain * sizeof buf [0] ); - memset( &buf [remain], 0, count * sizeof buf [0] ); -} - -int blip_read_samples( blip_t* m, short out [], int count, int stereo ) -{ - assert( count >= 0 ); - - if ( count > m->avail ) - count = m->avail; - - if ( count ) - { - int const step = stereo ? 2 : 1; - buf_t const* in = SAMPLES( m ); - buf_t const* end = in + count; - int sum = m->integrator; - do - { - /* Eliminate fraction */ - int s = ARITH_SHIFT( sum, delta_bits ); - - sum += *in++; - - CLAMP( s ); - - *out = s; - out += step; - - /* High-pass filter */ - sum -= s << (delta_bits - bass_shift); - } - while ( in != end ); - m->integrator = sum; - - remove_samples( m, count ); - } - - return count; -} - -/* Things that didn't help performance on x86: - __attribute__((aligned(128))) - #define short int - restrict -*/ - -/* Sinc_Generator( 0.9, 0.55, 4.5 ) */ -static short const bl_step [phase_count + 1] [half_width] = -{ -{ 43, -115, 350, -488, 1136, -914, 5861,21022}, -{ 44, -118, 348, -473, 1076, -799, 5274,21001}, -{ 45, -121, 344, -454, 1011, -677, 4706,20936}, -{ 46, -122, 336, -431, 942, -549, 4156,20829}, -{ 47, -123, 327, -404, 868, -418, 3629,20679}, -{ 47, -122, 316, -375, 792, -285, 3124,20488}, -{ 47, -120, 303, -344, 714, -151, 2644,20256}, -{ 46, -117, 289, -310, 634, -17, 2188,19985}, -{ 46, -114, 273, -275, 553, 117, 1758,19675}, -{ 44, -108, 255, -237, 471, 247, 1356,19327}, -{ 43, -103, 237, -199, 390, 373, 981,18944}, -{ 42, -98, 218, -160, 310, 495, 633,18527}, -{ 40, -91, 198, -121, 231, 611, 314,18078}, -{ 38, -84, 178, -81, 153, 722, 22,17599}, -{ 36, -76, 157, -43, 80, 824, -241,17092}, -{ 34, -68, 135, -3, 8, 919, -476,16558}, -{ 32, -61, 115, 34, -60, 1006, -683,16001}, -{ 29, -52, 94, 70, -123, 1083, -862,15422}, -{ 27, -44, 73, 106, -184, 1152,-1015,14824}, -{ 25, -36, 53, 139, -239, 1211,-1142,14210}, -{ 22, -27, 34, 170, -290, 1261,-1244,13582}, -{ 20, -20, 16, 199, -335, 1301,-1322,12942}, -{ 18, -12, -3, 226, -375, 1331,-1376,12293}, -{ 15, -4, -19, 250, -410, 1351,-1408,11638}, -{ 13, 3, -35, 272, -439, 1361,-1419,10979}, -{ 11, 9, -49, 292, -464, 1362,-1410,10319}, -{ 9, 16, -63, 309, -483, 1354,-1383, 9660}, -{ 7, 22, -75, 322, -496, 1337,-1339, 9005}, -{ 6, 26, -85, 333, -504, 1312,-1280, 8355}, -{ 4, 31, -94, 341, -507, 1278,-1205, 7713}, -{ 3, 35, -102, 347, -506, 1238,-1119, 7082}, -{ 1, 40, -110, 350, -499, 1190,-1021, 6464}, -{ 0, 43, -115, 350, -488, 1136, -914, 5861} -}; - -/* Shifting by pre_shift allows calculation using unsigned int rather than -possibly-wider fixed_t. On 32-bit platforms, this is likely more efficient. -And by having pre_shift 32, a 32-bit platform can easily do the shift by -simply ignoring the low half. */ - -void blip_add_delta( blip_t* m, unsigned time, int delta ) -{ - unsigned fixed = (unsigned) ((time * m->factor + m->offset) >> pre_shift); - buf_t* out = SAMPLES( m ) + m->avail + (fixed >> frac_bits); - - int const phase_shift = frac_bits - phase_bits; - int phase = fixed >> phase_shift & (phase_count - 1); - short const* in = bl_step [phase]; - short const* rev = bl_step [phase_count - phase]; - - int interp = fixed >> (phase_shift - delta_bits) & (delta_unit - 1); - int delta2 = (delta * interp) >> delta_bits; - delta -= delta2; - - /* Fails if buffer size was exceeded */ - assert( out <= &SAMPLES( m ) [m->size + end_frame_extra] ); - - out [0] += in[0]*delta + in[half_width+0]*delta2; - out [1] += in[1]*delta + in[half_width+1]*delta2; - out [2] += in[2]*delta + in[half_width+2]*delta2; - out [3] += in[3]*delta + in[half_width+3]*delta2; - out [4] += in[4]*delta + in[half_width+4]*delta2; - out [5] += in[5]*delta + in[half_width+5]*delta2; - out [6] += in[6]*delta + in[half_width+6]*delta2; - out [7] += in[7]*delta + in[half_width+7]*delta2; - - in = rev; - out [ 8] += in[7]*delta + in[7-half_width]*delta2; - out [ 9] += in[6]*delta + in[6-half_width]*delta2; - out [10] += in[5]*delta + in[5-half_width]*delta2; - out [11] += in[4]*delta + in[4-half_width]*delta2; - out [12] += in[3]*delta + in[3-half_width]*delta2; - out [13] += in[2]*delta + in[2-half_width]*delta2; - out [14] += in[1]*delta + in[1-half_width]*delta2; - out [15] += in[0]*delta + in[0-half_width]*delta2; -} - -void blip_add_delta_fast( blip_t* m, unsigned time, int delta ) -{ - unsigned fixed = (unsigned) ((time * m->factor + m->offset) >> pre_shift); - buf_t* out = SAMPLES( m ) + m->avail + (fixed >> frac_bits); - - int interp = fixed >> (frac_bits - delta_bits) & (delta_unit - 1); - int delta2 = delta * interp; - - /* Fails if buffer size was exceeded */ - assert( out <= &SAMPLES( m ) [m->size + end_frame_extra] ); - - out [7] += delta * delta_unit - delta2; - out [8] += delta2; -} diff --git a/waterbox/pizza/blip_buf/blip_buf.h b/waterbox/pizza/blip_buf/blip_buf.h deleted file mode 100644 index e9a5d4cc3b..0000000000 --- a/waterbox/pizza/blip_buf/blip_buf.h +++ /dev/null @@ -1,72 +0,0 @@ -/** \file -Sample buffer that resamples from input clock rate to output sample rate */ - -/* blip_buf 1.1.0 */ -#ifndef BLIP_BUF_H -#define BLIP_BUF_H - -#ifdef __cplusplus - extern "C" { -#endif - -/** First parameter of most functions is blip_t*, or const blip_t* if nothing -is changed. */ -typedef struct blip_t blip_t; - -/** Creates new buffer that can hold at most sample_count samples. Sets rates -so that there are blip_max_ratio clocks per sample. Returns pointer to new -buffer, or NULL if insufficient memory. */ -blip_t* blip_new( int sample_count ); - -/** Sets approximate input clock rate and output sample rate. For every -clock_rate input clocks, approximately sample_rate samples are generated. */ -void blip_set_rates( blip_t*, double clock_rate, double sample_rate ); - -enum { /** Maximum clock_rate/sample_rate ratio. For a given sample_rate, -clock_rate must not be greater than sample_rate*blip_max_ratio. */ -blip_max_ratio = 1 << 20 }; - -/** Clears entire buffer. Afterwards, blip_samples_avail() == 0. */ -void blip_clear( blip_t* ); - -/** Adds positive/negative delta into buffer at specified clock time. */ -void blip_add_delta( blip_t*, unsigned int clock_time, int delta ); - -/** Same as blip_add_delta(), but uses faster, lower-quality synthesis. */ -void blip_add_delta_fast( blip_t*, unsigned int clock_time, int delta ); - -/** Length of time frame, in clocks, needed to make sample_count additional -samples available. */ -int blip_clocks_needed( const blip_t*, int sample_count ); - -enum { /** Maximum number of samples that can be generated from one time frame. */ -blip_max_frame = 4000 }; - -/** Makes input clocks before clock_duration available for reading as output -samples. Also begins new time frame at clock_duration, so that clock time 0 in -the new time frame specifies the same clock as clock_duration in the old time -frame specified. Deltas can have been added slightly past clock_duration (up to -however many clocks there are in two output samples). */ -void blip_end_frame( blip_t*, unsigned int clock_duration ); - -/** Number of buffered samples available for reading. */ -int blip_samples_avail( const blip_t* ); - -/** Reads and removes at most 'count' samples and writes them to 'out'. If -'stereo' is true, writes output to every other element of 'out', allowing easy -interleaving of two buffers into a stereo sample stream. Outputs 16-bit signed -samples. Returns number of samples actually read. */ -int blip_read_samples( blip_t*, short out [], int count, int stereo ); - -/** Frees buffer. No effect if NULL is passed. */ -void blip_delete( blip_t* ); - - -/* Deprecated */ -typedef blip_t blip_buffer_t; - -#ifdef __cplusplus - } -#endif - -#endif diff --git a/waterbox/pizza/lib/cartridge.c b/waterbox/pizza/lib/cartridge.c deleted file mode 100644 index 89835aad17..0000000000 --- a/waterbox/pizza/lib/cartridge.c +++ /dev/null @@ -1,233 +0,0 @@ -/* - - This file is part of Emu-Pizza - - Emu-Pizza is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Emu-Pizza is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Emu-Pizza. If not, see . - -*/ - -#include -#include -#include -#include - -#include "global.h" -#include "mmu.h" -#include "utils.h" - -/* guess what */ -/* return values */ -/* 0: OK */ -/* 1: Can't open/read file */ -/* 2: Unknown cartridge */ - -char cartridge_load(const void *data, size_t sz) -{ - int i, z = 0; - - if (sz < 1 || sz > 1 << 22) - return 1; - - const uint8_t *rom = (const uint8_t *)data; - - /* gameboy color? */ - if (rom[0x143] == 0xC0 || rom[0x143] == 0x80) - { - utils_log("Gameboy Color cartridge\n"); - global_cgb = global_sgb ? 0 : 1; - } - else - { - utils_log("Gameboy Classic cartridge\n"); - global_cgb = 0; - } - - /* get cartridge infos */ - uint8_t mbc = rom[0x147]; - - utils_log("Cartridge code: %02x\n", mbc); - - switch (mbc) - { - case 0x00: - utils_log("ROM ONLY\n"); - break; - case 0x01: - utils_log("MBC1\n"); - break; - case 0x02: - utils_log("MBC1 + RAM\n"); - break; - case 0x03: - utils_log("MBC1 + RAM + BATTERY\n"); - break; - case 0x05: - utils_log("MBC2\n"); - break; - case 0x06: - mmu_init_ram(512); - utils_log("MBC2 + BATTERY\n"); - break; - case 0x10: - utils_log("MBC3 + TIMER + RAM + BATTERY\n"); - break; - case 0x11: - utils_log("MBC3\n"); - break; - case 0x12: - utils_log("MBC3 + RAM\n"); - break; - case 0x13: - utils_log("MBC3 + RAM + BATTERY\n"); - break; - case 0x19: - utils_log("MBC5\n"); - break; - case 0x1A: - utils_log("MBC5 + RAM\n"); - break; - case 0x1B: - utils_log("MBC5 + RAM + BATTERY\n"); - break; - case 0x1C: - global_rumble = 1; - utils_log("MBC5 + RUMBLE\n"); - break; - case 0x1D: - global_rumble = 1; - utils_log("MBC5 + RUMBLE + RAM\n"); - break; - case 0x1E: - global_rumble = 1; - utils_log("MBC5 + RUMBLE + RAM + BATTERY\n"); - break; - - default: - utils_log("Unknown cartridge type: %02x\n", mbc); - return 2; - } - - /* title */ - for (i = 0x134; i < 0x143; i++) - if (rom[i] > 0x40 && rom[i] < 0x5B) - global_cart_name[z++] = rom[i]; - - global_cart_name[z] = '\0'; - - utils_log("%s\n", global_cart_name); - - /* get ROM banks */ - uint8_t byte = rom[0x148]; - - utils_log("ROM: "); - - switch (byte) - { - case 0x00: - utils_log("0 banks\n"); - break; - case 0x01: - utils_log("4 banks\n"); - break; - case 0x02: - utils_log("8 banks\n"); - break; - case 0x03: - utils_log("16 banks\n"); - break; - case 0x04: - utils_log("32 banks\n"); - break; - case 0x05: - utils_log("64 banks\n"); - break; - case 0x06: - utils_log("128 banks\n"); - break; - case 0x07: - utils_log("256 banks\n"); - break; - case 0x52: - utils_log("72 banks\n"); - break; - case 0x53: - utils_log("80 banks\n"); - break; - case 0x54: - utils_log("96 banks\n"); - break; - } - - /* init MMU */ - mmu_init(mbc, byte); - - /* get RAM banks */ - byte = rom[0x149]; - - utils_log("RAM: "); - - switch (byte) - { - case 0x00: - utils_log("NO RAM\n"); - break; - case 0x01: - mmu_init_ram(1 << 11); - utils_log("2 kB\n"); - break; - case 0x02: - /* MBC5 got bigger values */ - if (mbc >= 0x19 && mbc <= 0x1E) - { - mmu_init_ram(1 << 16); - utils_log("64 kB\n"); - } - else - { - mmu_init_ram(1 << 13); - utils_log("8 kB\n"); - } - break; - case 0x03: - mmu_init_ram(1 << 15); - utils_log("32 kB\n"); - break; - case 0x04: - mmu_init_ram(1 << 17); - utils_log("128 kB\n"); - break; - case 0x05: - mmu_init_ram(1 << 16); - utils_log("64 kB\n"); - break; - } - - /* restore saved RAM if it's the case */ - //mmu_restore_ram(file_sav); - - /* restore saved RTC if it's the case */ - //mmu_restore_rtc(file_rtc); - - /* load FULL ROM at 0x0000 address of system memory */ - mmu_load_cartridge(rom, sz); - - return 0; -} - -/*void cartridge_term() -{ - // save persistent data (battery backed RAM and RTC clock) - mmu_save_ram(file_sav); - mmu_save_rtc(file_rtc); -}*/ diff --git a/waterbox/pizza/lib/cartridge.h b/waterbox/pizza/lib/cartridge.h deleted file mode 100644 index ebc95de13c..0000000000 --- a/waterbox/pizza/lib/cartridge.h +++ /dev/null @@ -1,28 +0,0 @@ -/* - - This file is part of Emu-Pizza - - Emu-Pizza is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Emu-Pizza is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Emu-Pizza. If not, see . - -*/ - -#ifndef __CARTRIDGE_HDR__ -#define __CARTRIDGE_HDR__ - -#include - -/* prototypes */ -char cartridge_load(const void* data, size_t sz); - -#endif diff --git a/waterbox/pizza/lib/cycles.c b/waterbox/pizza/lib/cycles.c deleted file mode 100644 index f8a350462e..0000000000 --- a/waterbox/pizza/lib/cycles.c +++ /dev/null @@ -1,321 +0,0 @@ -/* - - This file is part of Emu-Pizza - - Emu-Pizza is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Emu-Pizza is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Emu-Pizza. If not, see . - -*/ - -#include -#include "cycles.h" -#include "global.h" -#include "gpu.h" -#include "mmu.h" -#include "serial.h" -#include "sound.h" -#include "timer.h" -#include "interrupt.h" -#include "utils.h" - -interrupts_flags_t *cycles_if; - -/* instance of the main struct */ -cycles_t cycles = {0, 0, 0, 0}; - -#define CYCLES_PAUSES 256 - -/* hard sync stuff (for remote connection) */ -uint8_t cycles_hs_mode = 0; - -/* type of next */ -typedef enum { - CYCLES_NEXT_TYPE_CYCLES, - CYCLES_NEXT_TYPE_CYCLES_HS, - CYCLES_NEXT_TYPE_DMA, -} cycles_next_type_enum_e; - -/* closest next and its type */ -uint_fast32_t cycles_very_next; -cycles_next_type_enum_e cycles_next_type; - -/* set hard sync mode. sync is given by the remote peer + local timer */ -void cycles_start_hs() -{ - utils_log("Hard sync mode ON\n"); - - /* boolean set to on */ - cycles_hs_mode = 1; -} - -void cycles_stop_hs() -{ - utils_log("Hard sync mode OFF\n"); - - /* boolean set to on */ - cycles_hs_mode = 0; -} - -/* set double or normal speed */ -void cycles_set_speed(char dbl) -{ - /* set global */ - global_cpu_double_speed = dbl; - - /* update clock */ - if (global_cpu_double_speed) - cycles.clock = 4194304 * 2; - else - cycles.clock = 4194304; - - /* calculate the mask */ - cycles_change_emulation_speed(); -} - -/* set emulation speed */ -void cycles_change_emulation_speed() -{ - cycles.step = ((4194304 / CYCLES_PAUSES) - << global_cpu_double_speed); -} - -void cycles_closest_next() -{ - int_fast32_t diff = cycles.cnt - cycles.next; - - /* init */ - cycles_very_next = cycles.next; - cycles_next_type = CYCLES_NEXT_TYPE_CYCLES; - - int_fast32_t diff_new = cycles.cnt - mmu.dma_next; - - /* DMA? */ - if (diff_new < diff) - { - /* this is the new lowest */ - cycles_very_next = mmu.dma_next; - cycles_next_type = CYCLES_NEXT_TYPE_DMA; - } -} - -/* this function is gonna be called every M-cycle = 4 ticks of CPU */ -void cycles_step() -{ - cycles.cnt += 4; - cycles.sampleclock += 2 >> global_cpu_double_speed; - - /* - while (cycles.cnt >= cycles_very_next) - { - switch (cycles_next_type) - { - case CYCLES_NEXT_TYPE_CYCLES: - - deadline.tv_nsec += 1000000000 / CYCLES_PAUSES; - - if (deadline.tv_nsec > 1000000000) - { - deadline.tv_sec += 1; - deadline.tv_nsec -= 1000000000; - } - - clock_nanosleep(CLOCK_MONOTONIC, TIMER_ABSTIME, - &deadline, NULL); - - cycles.next += cycles.step; - - if (cycles.cnt % cycles.clock == 0) - cycles.seconds++; - - break; - - case CYCLES_NEXT_TYPE_DMA: - - memcpy(&mmu.memory[0xFE00], &mmu.memory[mmu.dma_address], 160); - - mmu.dma_address = 0x0000; - - mmu.dma_next = 1; - - break; - } - - cycles_closest_next(); - } -*/ - - /* 65536 == cpu clock / CYCLES_PAUSES pauses every second */ - if (cycles.cnt == cycles.next) - { - cycles.next += cycles.step; - } - - /* hard sync next step */ - if (cycles.cnt == cycles.hs_next) - { - /* set cycles for hard sync */ - cycles.hs_next += ((4096 * 4) << global_cpu_double_speed); - - /* hard sync is on? */ - if (cycles_hs_mode) - { - /* send my status and wait for peer status back */ - serial_send_byte(); - - /* wait for reply */ - serial_wait_data(); - - /* verify if we need to trigger an interrupt */ - serial_verify_intr(); - } - } - - /* DMA */ - if (mmu.dma_next == cycles.cnt) - { - memcpy(&mmu.memory[0xFE00], &mmu.memory[mmu.dma_address], 160); - - /* reset address */ - mmu.dma_address = 0x0000; - - /* reset */ - mmu.dma_next = 1; - } - - /* update GPU state */ - if (gpu.next == cycles.cnt) - gpu_step(); - - /* fs clock */ - if (sound.fs_cycles_next == cycles.cnt) - sound_step_fs(); - - /* channel one */ - if (sound.channel_one.duty_cycles_next == cycles.cnt) - sound_step_ch1(); - - /* channel two */ - if (sound.channel_two.duty_cycles_next == cycles.cnt) - sound_step_ch2(); - - /* channel three */ - if (sound.channel_three.cycles_next <= cycles.cnt) - sound_step_ch3(); - - /* channel four */ - if (sound.channel_four.cycles_next == cycles.cnt) - sound_step_ch4(); - - /* update timer state */ - if (cycles.cnt == timer.next) - { - timer.next += 256; - timer.div++; - } - - /* timer is on? */ - if (timer.sub_next == cycles.cnt) - { - timer.sub_next += timer.threshold; - timer.cnt++; - - /* cnt value > 255? trigger an interrupt */ - if (timer.cnt > 255) - { - timer.cnt = timer.mod; - - /* trigger timer interrupt */ - cycles_if->timer = 1; - } - } - - /* update serial state */ - if (serial.next == cycles.cnt) - { - /* nullize serial next */ - serial.next -= 1; - - /* reset counter */ - serial.bits_sent = 0; - - /* gotta reply with 0xff when asking for ff01 */ - serial.data = 0xFF; - - /* reset transfer_start flag to yell I'M DONE */ - serial.transfer_start = 0; - - /* if not connected, trig the fucking interrupt */ - cycles_if->serial_io = 1; - } -} - -/* things to do when vsync kicks in */ -void cycles_vblank() -{ - return; -} - -/* stuff tied to entering into hblank state */ -void cycles_hdma() -{ - /* HDMA (only CGB) */ - if (mmu.hdma_to_transfer) - { - /* hblank transfer */ - if (mmu.hdma_transfer_mode) - { - /* transfer when line is changed and we're into HBLANK phase */ - if (mmu.memory[0xFF44] < 143 && - mmu.hdma_current_line != mmu.memory[0xFF44] && - (mmu.memory[0xFF41] & 0x03) == 0x00) - { - /* update current line */ - mmu.hdma_current_line = mmu.memory[0xFF44]; - - /* copy 0x10 bytes */ - if (mmu.vram_idx) - memcpy(mmu_addr_vram1() + mmu.hdma_dst_address - 0x8000, - &mmu.memory[mmu.hdma_src_address], 0x10); - else - memcpy(mmu_addr_vram0() + mmu.hdma_dst_address - 0x8000, - &mmu.memory[mmu.hdma_src_address], 0x10); - - /* decrease bytes to transfer */ - mmu.hdma_to_transfer -= 0x10; - - /* increase pointers */ - mmu.hdma_dst_address += 0x10; - mmu.hdma_src_address += 0x10; - } - } - } -} - -char cycles_init() -{ - cycles.inited = 1; - - /* interrupt registers */ - cycles_if = mmu_addr(0xFF0F); - - /* init clock and counter */ - cycles.clock = 4194304; - cycles.cnt = 0; - cycles.hs_next = 70224; - - /* mask for pauses cycles fast calc */ - cycles.step = 4194304 / CYCLES_PAUSES; - cycles.next = 4194304 / CYCLES_PAUSES; - - return 0; -} diff --git a/waterbox/pizza/lib/cycles.h b/waterbox/pizza/lib/cycles.h deleted file mode 100644 index 58c7c2bb4c..0000000000 --- a/waterbox/pizza/lib/cycles.h +++ /dev/null @@ -1,68 +0,0 @@ -/* - - This file is part of Emu-Pizza - - Emu-Pizza is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Emu-Pizza is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Emu-Pizza. If not, see . - -*/ - -#ifndef __CYCLES_HDR__ -#define __CYCLES_HDR__ - -#include -#include - -typedef struct cycles_s -{ - /* am i init'ed? */ - uint_fast32_t inited; - - /* ticks counter */ - uint64_t cnt; - - // CPU clock. advances at 4MHz or 8MHz depending on current cgb setting - uint_fast32_t clock; - - /* handy for calculation */ - uint64_t next; - - /* step varying on cpu and emulation speed */ - uint_fast32_t step; - - /* 2 spares */ - uint64_t hs_next; - - // reference clock. advances at 2MHz always - uint64_t sampleclock; -} cycles_t; - -extern cycles_t cycles; - -// extern uint8_t cycles_hs_local_cnt; -// extern uint8_t cycles_hs_peer_cnt; - -/* callback function */ -typedef void (*cycles_send_cb_t)(uint32_t v); - -/* prototypes */ -void cycles_change_emulation_speed(); -void cycles_hdma(); -char cycles_init(); -void cycles_set_speed(char dbl); -void cycles_start_hs(); -void cycles_step(); -void cycles_stop_hs(); -void cycles_vblank(); - -#endif diff --git a/waterbox/pizza/lib/gameboy.c b/waterbox/pizza/lib/gameboy.c deleted file mode 100644 index be64e6436d..0000000000 --- a/waterbox/pizza/lib/gameboy.c +++ /dev/null @@ -1,235 +0,0 @@ -/* - - This file is part of Emu-Pizza - - Emu-Pizza is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Emu-Pizza is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Emu-Pizza. If not, see . - -*/ - -#include -#include -#include "cartridge.h" -#include "sound.h" -#include "mmu.h" -#include "cycles.h" -#include "gpu.h" -#include "global.h" -#include "input.h" -#include "timer.h" -#include "serial.h" -#include "utils.h" -#include "z80_gameboy_regs.h" -#include "z80_gameboy.h" - -char gameboy_inited = 0; - -void gameboy_init() -{ - /* init z80 */ - z80_init(); - - /* init cycles syncronizer */ - cycles_init(); - - /* init timer */ - timer_init(); - - /* init serial */ - serial_init(); - - /* init sound (this will start audio thread) */ - sound_init(); - - /* reset GPU counters */ - gpu_reset(); - - /* reset to default values */ - mmu_write_no_cyc(0xFF05, 0x00); - mmu_write_no_cyc(0xFF06, 0x00); - mmu_write_no_cyc(0xFF07, 0x00); - mmu_write_no_cyc(0xFF10, 0x80); - mmu_write_no_cyc(0xFF11, 0xBF); - mmu_write_no_cyc(0xFF12, 0xF3); - mmu_write_no_cyc(0xFF14, 0xBF); - mmu_write_no_cyc(0xFF16, 0x3F); - mmu_write_no_cyc(0xFF17, 0x00); - mmu_write_no_cyc(0xFF19, 0xBF); - mmu_write_no_cyc(0xFF1A, 0x7F); - mmu_write_no_cyc(0xFF1B, 0xFF); - mmu_write_no_cyc(0xFF1C, 0x9F); - mmu_write_no_cyc(0xFF1E, 0xBF); - mmu_write_no_cyc(0xFF20, 0xFF); - mmu_write_no_cyc(0xFF21, 0x00); - mmu_write_no_cyc(0xFF22, 0x00); - mmu_write_no_cyc(0xFF23, 0xBF); - mmu_write_no_cyc(0xFF24, 0x77); - mmu_write_no_cyc(0xFF25, 0xF3); - mmu_write_no_cyc(0xFF26, 0xF1); - mmu_write_no_cyc(0xFF40, 0x91); - mmu_write_no_cyc(0xFF41, 0x80); - mmu_write_no_cyc(0xFF42, 0x00); - mmu_write_no_cyc(0xFF43, 0x00); - mmu_write_no_cyc(0xFF44, 0x00); - mmu_write_no_cyc(0xFF45, 0x00); - mmu_write_no_cyc(0xFF47, 0xFC); - mmu_write_no_cyc(0xFF48, 0xFF); - mmu_write_no_cyc(0xFF49, 0xFF); - mmu_write_no_cyc(0xFF4A, 0x00); - mmu_write_no_cyc(0xFF4B, 0x00); - mmu_write_no_cyc(0xFF98, 0xDC); - mmu_write_no_cyc(0xFFFF, 0x00); - mmu_write_no_cyc(0xC000, 0x08); - mmu_write_no_cyc(0xFFFE, 0x69); - - if (global_cgb) - state.a = 0x11; - else - state.a = 0x00; - - state.b = 0x00; - state.c = 0x13; - state.d = 0x00; - state.e = 0xd8; - state.h = 0x01; - state.l = 0x4d; - state.pc = 0x0100; - state.sp = 0xFFFE; - *state.f = 0xB0; - - /* reset counter */ - cycles.cnt = 0; - /* start at normal speed */ - global_cpu_double_speed = 0; - - /* mark as inited */ - gameboy_inited = 1; - - return; -} - -void gameboy_run(uint64_t target) -{ - uint8_t op; - - /* get interrupt flags and interrupt enables */ - uint8_t *int_e; - uint8_t *int_f; - - /* pointers to memory location of interrupt enables/flags */ - int_e = mmu_addr(0xFFFF); - int_f = mmu_addr(0xFF0F); - - /* run stuff! */ - /* mechanism is simple. */ - /* 1) execute instruction 2) update cycles counter 3) check interrupts */ - /* and repeat forever */ - while (cycles.sampleclock < target) - { - /* get op */ - op = mmu_read(state.pc); - - /* print out CPU state if enabled by debug flag */ - if (global_debug) - { - utils_log("OP: %02x F: %02x PC: %04x:%02x:%02x SP: %04x:%02x:%02x ", - op, *state.f & 0xd0, state.pc, - mmu_read_no_cyc(state.pc + 1), - mmu_read_no_cyc(state.pc + 2), state.sp, - mmu_read_no_cyc(state.sp), - mmu_read_no_cyc(state.sp + 1)); - - utils_log("A: %02x BC: %04x DE: %04x HL: %04x FF41: %02x " - "FF44: %02x ENAB: %02x INTE: %02x INTF: %02x\n", - state.a, *state.bc, - *state.de, *state.hl, - mmu_read_no_cyc(0xFF41), - mmu_read_no_cyc(0xFF44), - state.int_enable, - *int_e, *int_f); - } - - /* execute instruction by the GB Z80 version */ - z80_execute(op); - - /* if last op was Interrupt Enable (0xFB) */ - /* we need to check for INTR on next cycle */ - if (op == 0xFB) - continue; - - /* interrupts filtered by enable flags */ - uint8_t int_r = (*int_f & *int_e); - - /* check for interrupts */ - if ((state.int_enable || op == 0x76) && (int_r != 0)) - { - /* discard useless bits */ - if ((int_r & 0x1F) == 0x00) - continue; - - /* beware of instruction that doesn't move PC! */ - /* like HALT (0x76) */ - if (op == 0x76) - { - state.pc++; - - if (state.int_enable == 0) - continue; - } - - /* reset int-enable flag, it will be restored after a RETI op */ - state.int_enable = 0; - - if ((int_r & 0x01) == 0x01) - { - /* vblank interrupt triggers RST 5 */ - - /* reset flag */ - *int_f &= 0xFE; - - /* handle the interrupt */ - z80_intr(0x0040); - } - else if ((int_r & 0x02) == 0x02) - { - /* LCD Stat interrupt */ - - /* reset flag */ - *int_f &= 0xFD; - - /* handle the interrupt! */ - z80_intr(0x0048); - } - else if ((int_r & 0x04) == 0x04) - { - /* timer interrupt */ - - /* reset flag */ - *int_f &= 0xFB; - - /* handle the interrupt! */ - z80_intr(0x0050); - } - else if ((int_r & 0x08) == 0x08) - { - /* serial interrupt */ - - /* reset flag */ - *int_f &= 0xF7; - - /* handle the interrupt! */ - z80_intr(0x0058); - } - } - } -} diff --git a/waterbox/pizza/lib/gameboy.h b/waterbox/pizza/lib/gameboy.h deleted file mode 100644 index 06efa026a8..0000000000 --- a/waterbox/pizza/lib/gameboy.h +++ /dev/null @@ -1,28 +0,0 @@ -/* - - This file is part of Emu-Pizza - - Emu-Pizza is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Emu-Pizza is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Emu-Pizza. If not, see . - -*/ - -#ifndef __GAMEBOY_HDR__ -#define __GAMEBOY_HDR__ - -/* prototypes */ -void gameboy_init(); -void gameboy_run(uint64_t target); -void gameboy_stop(); - -#endif diff --git a/waterbox/pizza/lib/global.c b/waterbox/pizza/lib/global.c deleted file mode 100644 index e14d158dc3..0000000000 --- a/waterbox/pizza/lib/global.c +++ /dev/null @@ -1,47 +0,0 @@ -/* - - This file is part of Emu-Pizza - - Emu-Pizza is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Emu-Pizza is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Emu-Pizza. If not, see . - -*/ - -#include -#include - -#include "global.h" - -char global_cart_name[256]; -char global_cgb; // if true, in CGB mode -char global_sgb; // if true, in SGB mode -char global_cpu_double_speed; -char global_debug; -char global_rumble; -char global_window; // if true, show window -int global_lagged; -void (*global_input_callback)(void); -int64_t global_currenttime; - -void global_init() -{ - global_window = 1; - global_debug = 0; - global_cgb = 0; - global_sgb = 0; - global_cpu_double_speed = 0; - global_rumble = 0; - global_lagged = 0; - global_input_callback = NULL; - sprintf(global_cart_name, "NOCARTIRDGE"); -} diff --git a/waterbox/pizza/lib/global.h b/waterbox/pizza/lib/global.h deleted file mode 100644 index 06e3cff320..0000000000 --- a/waterbox/pizza/lib/global.h +++ /dev/null @@ -1,40 +0,0 @@ -/* - - This file is part of Emu-Pizza - - Emu-Pizza is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Emu-Pizza is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Emu-Pizza. If not, see . - -*/ - -#ifndef __GLOBAL__ -#define __GLOBAL__ - -#include - -extern char global_window; -extern char global_debug; -extern char global_cgb; -extern char global_sgb; -// extern char global_started; -extern char global_cpu_double_speed; -extern char global_rumble; -extern char global_cart_name[256]; -extern int global_lagged; -extern void (*global_input_callback)(void); -extern int64_t global_currenttime; - -/* prototypes */ -void global_init(); - -#endif diff --git a/waterbox/pizza/lib/gpu.c b/waterbox/pizza/lib/gpu.c deleted file mode 100644 index 44859f824d..0000000000 --- a/waterbox/pizza/lib/gpu.c +++ /dev/null @@ -1,1072 +0,0 @@ -/* - - This file is part of Emu-Pizza - - Emu-Pizza is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Emu-Pizza is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Emu-Pizza. If not, see . - -*/ - -#include -#include - -#include "cycles.h" -#include "gameboy.h" -#include "global.h" -#include "gpu.h" -#include "interrupt.h" -#include "mmu.h" -#include "utils.h" -#include "sgb.h" - -/* Gameboy OAM 4 bytes data */ -typedef struct gpu_oam_s -{ - uint8_t y; - uint8_t x; - uint8_t pattern; - - uint8_t palette_cgb : 3; - uint8_t vram_bank : 1; - uint8_t palette : 1; - uint8_t x_flip : 1; - uint8_t y_flip : 1; - uint8_t priority : 1; - -} gpu_oam_t; - -/* Gameboy Color additional tile attributes */ -typedef struct gpu_cgb_bg_tile_s -{ - uint8_t palette : 3; - uint8_t vram_bank : 1; - uint8_t spare : 1; - uint8_t x_flip : 1; - uint8_t y_flip : 1; - uint8_t priority : 1; - -} gpu_cgb_bg_tile_t; - -/* ordered sprite list */ -typedef struct oam_list_s -{ - int idx; - struct oam_list_s *next; -} oam_list_t; - -/* pointer to interrupt flags (handy) */ -interrupts_flags_t *gpu_if; - -/* internal functions prototypes */ -void gpu_draw_sprite_line(gpu_oam_t *oam, - uint8_t sprites_size, - uint8_t line); -void gpu_draw_window_line(int tile_idx, uint8_t frame_x, - uint8_t frame_y, uint8_t line); - -/* 2 bit to 8 bit color lookup */ -// TODO: hook these up to the same color logic that that the other GB core uses -static const uint32_t gpu_color_lookup[] = {0xffffffff, 0xffaaaaaa, 0xff555555, 0xff000000}; - -/* function to call when frame is ready */ -gpu_frame_ready_cb_t gpu_frame_ready_cb; - -/* global state of GPU */ -gpu_t gpu; - -void gpu_dump_oam() -{ - /* make it point to the first OAM object */ - gpu_oam_t *oam = (gpu_oam_t *)mmu_addr(0xFE00); - - int i; - - for (i = 0; i < 40; i++) - { - if (oam[i].x != 0 && oam[i].y != 0) - printf("OAM X %d Y %d VRAM %d PATTERN %d\n", oam[i].x, oam[i].y, - oam[i].vram_bank, - oam[i].pattern); - } -} - -/* init pointers */ -void gpu_init_pointers() -{ - /* make gpu field points to the related memory area */ - gpu.lcd_ctrl = mmu_addr(0xFF40); - gpu.lcd_status = mmu_addr(0xFF41); - gpu.scroll_y = mmu_addr(0xFF42); - gpu.scroll_x = mmu_addr(0xFF43); - gpu.window_y = mmu_addr(0xFF4A); - gpu.window_x = mmu_addr(0xFF4B); - gpu.ly = mmu_addr(0xFF44); - gpu.lyc = mmu_addr(0xFF45); - gpu_if = mmu_addr(0xFF0F); -} - -/* reset */ -void gpu_reset() -{ - /* init counters */ - gpu.next = 456 << global_cpu_double_speed; - gpu.frame_counter = 0; -} - -/* init GPU states */ -void gpu_init(gpu_frame_ready_cb_t cb) -{ - /* reset gpu structure */ - bzero(&gpu, sizeof(gpu_t)); - - /* init memory pointers */ - gpu_init_pointers(); - - /* init counters */ - gpu.next = 456 << global_cpu_double_speed; - gpu.frame_counter = 0; - - /* step for normal CPU speed */ - gpu.step = 4; - - /* init palette */ - memcpy(gpu.bg_palette, gpu_color_lookup, sizeof(uint32_t) * 4); - memcpy(gpu.obj_palette_0, gpu_color_lookup, sizeof(uint32_t) * 4); - memcpy(gpu.obj_palette_1, gpu_color_lookup, sizeof(uint32_t) * 4); - - /* set callback */ - gpu_frame_ready_cb = cb; -} - -/* turn on/off lcd */ -void gpu_toggle(uint8_t state) -{ - /* from off to on */ - if (state & 0x80) - { - /* LCD turned on */ - gpu.next = cycles.cnt + (456 << global_cpu_double_speed); - *gpu.ly = 0; - (*gpu.lcd_status).mode = 0x00; - (*gpu.lcd_status).ly_coincidence = 0x00; - } - else - { - /* LCD turned off - reset stuff */ - gpu.next = cycles.cnt - 1; // + (80 << global_cpu_double_speed); - *gpu.ly = 0; - (*gpu.lcd_status).mode = 0x00; - } -} - -/* push frame on screen */ -void gpu_draw_frame() -{ - /* increase frame counter */ - gpu.frame_counter++; - - /* is it the case to push samples? */ - /*if ((global_emulation_speed == GLOBAL_EMULATION_SPEED_DOUBLE && - (gpu.frame_counter & 0x0001) != 0) || - (global_emulation_speed == GLOBAL_EMULATION_SPEED_4X && - (gpu.frame_counter & 0x0003) != 0)) - return;*/ - - if (global_sgb) - { - sgb_take_frame(gpu.frame_buffer); - } - - /* call the callback */ - if (gpu_frame_ready_cb) - (*gpu_frame_ready_cb)(); - - /* reset priority matrix */ - bzero(gpu.priority, 160 * 144); - bzero(gpu.palette_idx, 160 * 144); - - return; -} - -/* draw a single line */ -void gpu_draw_line(uint8_t line) -{ - /* avoid mess */ - if (line > 144) - return; - - /* is it the case to push samples? */ - /*if ((global_emulation_speed == GLOBAL_EMULATION_SPEED_DOUBLE && - (gpu.frame_counter & 0x0001) != 0) || - (global_emulation_speed == GLOBAL_EMULATION_SPEED_4X && - (gpu.frame_counter & 0x0003) != 0)) - return;*/ - - int i, t, y, px_start, px_drawn; - uint8_t *tiles_map, tile_subline, palette_idx, x_flip, priority; - uint16_t tiles_addr, tile_n, tile_idx, tile_line; - uint16_t tile_y; - - /* gotta show BG? Answer is always YES in case of Gameboy Color */ - if ((*gpu.lcd_ctrl).bg || global_cgb) - { - gpu_cgb_bg_tile_t *tiles_map_cgb = NULL; - uint8_t *tiles = NULL; - uint32_t *palette; - - if (global_cgb) - { - /* CGB tile map into VRAM0 */ - tiles_map = mmu_addr_vram0() + ((*gpu.lcd_ctrl).bg_tiles_map ? 0x1C00 : 0x1800); - - /* additional attribute table is into VRAM1 */ - tiles_map_cgb = mmu_addr_vram1() + ((*gpu.lcd_ctrl).bg_tiles_map ? 0x1C00 : 0x1800); - } - else - { - /* never flip */ - x_flip = 0; - - /* get tile map offset */ - tiles_map = mmu_addr((*gpu.lcd_ctrl).bg_tiles_map ? 0x9C00 : 0x9800); - - if ((*gpu.lcd_ctrl).bg_tiles) - tiles_addr = 0x8000; - else - tiles_addr = 0x9000; - - /* get absolute address of tiles area */ - tiles = mmu_addr(tiles_addr); - - /* monochrome GB uses a single BG palette */ - palette = gpu.bg_palette; - - /* always priority = 0 */ - priority = 0; - } - - /* calc tile y */ - tile_y = (*(gpu.scroll_y) + line) & 0xFF; - - /* calc first tile idx */ - tile_idx = ((tile_y >> 3) * 32) + (*(gpu.scroll_x) / 8); - - /* tile line because if we reach the end of the line, */ - /* we have to rewind to the first tile of the same line */ - tile_line = ((tile_y >> 3) * 32); - - /* calc first pixel of frame buffer of the current line */ - uint_fast16_t pos_fb = line * 160; - uint_fast16_t pos; - - /* calc tile subline */ - tile_subline = tile_y % 8; - - /* walk through different tiles */ - for (t = 0; t < 21; t++) - { - /* resolv tile data memory area */ - if ((*gpu.lcd_ctrl).bg_tiles == 0) - tile_n = (int8_t)tiles_map[tile_idx]; - else - tile_n = (tiles_map[tile_idx] & 0x00FF); - - /* if color gameboy, resolv which palette is bound */ - if (global_cgb) - { - /* extract palette index (0-31) */ - palette_idx = tiles_map_cgb[tile_idx].palette; - - /* get palette pointer to 4 (16bit) colors */ - palette = &gpu.cgb_palette_bg_rgb888[palette_idx * 4]; - - /* get priority of the tile */ - priority = tiles_map_cgb[tile_idx].priority; - - if (tiles_map_cgb[tile_idx].vram_bank) - tiles = mmu_addr_vram1() + - ((*gpu.lcd_ctrl).bg_tiles ? 0x0000 : 0x1000); - else - tiles = mmu_addr_vram0() + - ((*gpu.lcd_ctrl).bg_tiles ? 0x0000 : 0x1000); - - /* calc subline in case of flip_y */ - if (tiles_map_cgb[tile_idx].y_flip) - tile_subline = 7 - (tile_y % 8); - else - tile_subline = tile_y % 8; - - /* save x_flip */ - x_flip = tiles_map_cgb[tile_idx].x_flip; - } - - /* calc tile data pointer */ - int16_t tile_ptr = (tile_n * 16) + (tile_subline * 2); - - /* pixels are handled in a super shitty way */ - /* bit 0 of the pixel is taken from even position tile bytes */ - /* bit 1 of the pixel is taken from odd position tile bytes */ - - uint8_t pxa[8]; - uint8_t shft; - uint8_t b1 = *(tiles + tile_ptr); - uint8_t b2 = *(tiles + tile_ptr + 1); - - for (y = 0; y < 8; y++) - { - if (x_flip) - shft = (1 << (7 - y)); - else - shft = (1 << y); - - pxa[y] = ((b1 & shft) ? 1 : 0) | - ((b2 & shft) ? 2 : 0); - } - - /* particular cases for first and last tile */ - /* (could be shown just a part) */ - if (t == 0) - { - px_start = (*(gpu.scroll_x) % 8); - - px_drawn = 8 - px_start; - - /* set n pixels */ - for (i = 0; i < px_drawn; i++) - { - pos = pos_fb + (px_drawn - i - 1); - - gpu.priority[pos] = priority; - gpu.palette_idx[pos] = pxa[i]; - gpu.frame_buffer[pos] = palette[pxa[i]]; - } - } - else if (t == 20) - { - px_drawn = *(gpu.scroll_x) % 8; - - /* set n pixels */ - for (i = 0; i < px_drawn; i++) - { - pos = pos_fb + (px_drawn - i - 1); - - gpu.priority[pos] = priority; - gpu.palette_idx[pos] = pxa[i]; - gpu.frame_buffer[pos] = palette[pxa[i + (8 - px_drawn)]]; - } - } - else - { - /* set 8 pixels */ - for (i = 0; i < 8; i++) - { - pos = pos_fb + (7 - i); - - gpu.priority[pos] = priority; - gpu.palette_idx[pos] = pxa[i]; - gpu.frame_buffer[pos] = palette[pxa[i]]; - } - - px_drawn = 8; - } - - /* go to the next tile and rewind in case we reached the 32th */ - tile_idx++; - - /* don't go to the next line, just rewind */ - if (tile_idx == (tile_line + 32)) - tile_idx = tile_line; - - /* go to the next block of 8 pixels of the frame buffer */ - pos_fb += px_drawn; - } - } - - /* gotta show sprites? */ - if ((*gpu.lcd_ctrl).sprites) - { - /* make it point to the first OAM object */ - gpu_oam_t *oam = (gpu_oam_t *)mmu_addr(0xFE00); - - /* calc sprite height */ - uint8_t h = ((*gpu.lcd_ctrl).sprites_size + 1) * 8; - - int sort[40]; - int j = 0; - - /* prepare sorted list of oams */ - for (i = 0; i < 40; i++) - sort[i] = -1; - - for (i = 0; i < 40; i++) - { - /* the sprite intersects the current line? */ - if (oam[i].x != 0 && oam[i].y != 0 && - oam[i].x < 168 && oam[i].y < 160 && - line < (oam[i].y + h - 16) && - line >= (oam[i].y - 16)) - { - /* color GB uses memory position as priority criteria */ - if (global_cgb) - { - sort[j++] = i; - continue; - } - - /* find its position on sort array */ - for (j = 0; j < 40; j++) - { - if (sort[j] == -1) - { - sort[j] = i; - break; - } - - if (global_cgb) - continue; - - if ((oam[i].y < oam[sort[j]].y) || - ((oam[i].y == oam[sort[j]].y) && - (oam[i].x < oam[sort[j]].x))) - { - int z; - - for (z = 40; z > j; z--) - sort[z] = sort[z - 1]; - - sort[j] = i; - break; - } - } - } - } - - /* draw ordered sprite list */ - for (i = 0; i < 40 && sort[i] != -1; i++) - gpu_draw_sprite_line(&oam[sort[i]], - (*gpu.lcd_ctrl).sprites_size, line); - } - - /* wanna show window? */ - if (global_window && (*gpu.lcd_ctrl).window) - { - /* at least the current line is covering the window area? */ - if (line < *(gpu.window_y)) - return; - - /* TODO - reset this in a better place */ - if (line == *(gpu.window_y)) - gpu.window_skipped_lines = 0; - - int z, first_z; - uint8_t tile_pos_x, tile_pos_y; - - /* gotta draw a window? check if it is inside screen coordinates */ - if (*(gpu.window_y) >= 144 || - *(gpu.window_x) >= 160) - { - gpu.window_skipped_lines++; - return; - } - - /* calc the first interesting tile */ - first_z = ((line - *(gpu.window_y) - - gpu.window_skipped_lines) >> - 3) - << 5; - - for (z = first_z; z < first_z + 21; z++) - { - /* calc tile coordinates on frame buffer */ - tile_pos_x = ((z & 0x1F) << 3) + *(gpu.window_x) - 7; - tile_pos_y = ((z >> 5) << 3) + *(gpu.window_y) + - gpu.window_skipped_lines; - - /* gone over the current line? */ - if (tile_pos_y > line) - break; - - if (tile_pos_y < (line - 7)) - continue; - - /* gone over the screen visible X? */ - /* being between last column and first one is valid */ - if (tile_pos_x >= 160 && tile_pos_x < 248) - break; - - /* gone over the screen visible section? stop it */ - if (tile_pos_y >= 144) // || (tile_pos_x >= 160)) - break; - - /* put tile on frame buffer */ - gpu_draw_window_line(z, (uint8_t)tile_pos_x, - (uint8_t)tile_pos_y, line); - } - } -} - -/* draw a tile in x,y coordinates */ -void gpu_draw_window_line(int tile_idx, uint8_t frame_x, - uint8_t frame_y, uint8_t line) -{ - int i, p, y, pos; - int16_t tile_n; - uint8_t *tiles_map; - gpu_cgb_bg_tile_t *tiles_map_cgb = NULL; - uint8_t *tiles, x_flip; - uint32_t *palette; - - if (global_cgb) - { - /* CGB tile map into VRAM0 */ - tiles_map = mmu_addr_vram0() + ((*gpu.lcd_ctrl).window_tiles_map ? 0x1C00 : 0x1800); - - /* additional attribute table is into VRAM1 */ - tiles_map_cgb = mmu_addr_vram1() + ((*gpu.lcd_ctrl).window_tiles_map ? 0x1C00 : 0x1800); - - /* get palette index */ - uint8_t palette_idx = tiles_map_cgb[tile_idx].palette; - x_flip = tiles_map_cgb[tile_idx].x_flip; - - /* get palette pointer to 4 (16bit) colors */ - palette = &gpu.cgb_palette_bg_rgb888[palette_idx * 4]; - - /* attribute table will tell us where is the tile */ - if (tiles_map_cgb[tile_idx].vram_bank) - tiles = mmu_addr_vram1() + - ((*gpu.lcd_ctrl).bg_tiles ? 0x0000 : 0x1000); - else - tiles = mmu_addr_vram0() + - ((*gpu.lcd_ctrl).bg_tiles ? 0x0000 : 0x1000); - } - else - { - /* get tile map offset */ - tiles_map = mmu_addr((*gpu.lcd_ctrl).window_tiles_map ? 0x9C00 : 0x9800); - - /* get tile offset */ - if ((*gpu.lcd_ctrl).bg_tiles) - tiles = mmu_addr(0x8000); - else - tiles = mmu_addr(0x9000); - - /* monochrome GB uses a single BG palette */ - palette = gpu.bg_palette; - - /* never flip */ - x_flip = 0; - } - - /* obtain tile number */ - if ((*gpu.lcd_ctrl).bg_tiles == 0) - tile_n = (int8_t)tiles_map[tile_idx]; - else - tile_n = (tiles_map[tile_idx] & 0x00ff); - - /* calc vertical offset INSIDE the tile */ - p = (line - frame_y) * 2; - - /* calc frame position buffer for 4 pixels */ - uint32_t pos_fb = (line * 160); - - /* calc tile pointer */ - int16_t tile_ptr = (tile_n * 16) + p; - - /* pixels are handled in a super shitty way */ - /* bit 0 of the pixel is taken from even position tile bytes */ - /* bit 1 of the pixel is taken from odd position tile bytes */ - - uint8_t pxa[8]; - uint8_t shft; - - for (y = 0; y < 8; y++) - { - //uint8_t shft = (1 << y); - - if (x_flip) - shft = (1 << (7 - y)); - else - shft = (1 << y); - - pxa[y] = ((*(tiles + tile_ptr) & shft) ? 1 : 0) | - ((*(tiles + tile_ptr + 1) & shft) ? 2 : 0); - } - - /* set 8 pixels (full tile line) */ - for (i = 0; i < 8; i++) - { - /* over the last column? */ - uint8_t x = frame_x + (7 - i); - - if (x > 159) - continue; - - /* calc position on frame buffer */ - pos = pos_fb + x; - - /* can overwrite sprites? depends on pixel priority */ - if (gpu.priority[pos] != 0x02) - gpu.frame_buffer[pos] = palette[pxa[i]]; - } -} - -/* draw a sprite tile in x,y coordinates */ -void gpu_draw_sprite_line(gpu_oam_t *oam, uint8_t sprites_size, uint8_t line) -{ - int_fast32_t x, y, pos, fb_x, off; - uint_fast16_t p, i, j; - uint8_t sprite_bytes; - int16_t tile_ptr; - uint32_t *palette; - uint8_t *tiles; - - /* REMEMBER! position of sprites is relative to the visible screen area */ - /* ... and y is shifted by 16 pixels, x by 8 */ - y = oam->y - 16; - x = oam->x - 8; - - if (x < -7) - return; - - /* first pixel on frame buffer position */ - uint32_t tile_pos_fb = (y * 160) + x; - - /* choose palette */ - if (global_cgb) - { - uint8_t palette_idx = oam->palette_cgb; - - /* get palette pointer to 4 (16bit) colors */ - palette = &gpu.cgb_palette_oam_rgb888[palette_idx * 4]; - - /* tiles are into vram0 */ - if (oam->vram_bank) - tiles = mmu_addr_vram1(); - else - tiles = mmu_addr_vram0(); - } - else - { - /* tiles are int fixed 0x8000 address */ - tiles = mmu_addr(0x8000); - - if (oam->palette) - palette = gpu.obj_palette_1; - else - palette = gpu.obj_palette_0; - } - - /* calc sprite in byte */ - sprite_bytes = 16 * (sprites_size + 1); - - /* walk through 8x8 pixels (2bit per pixel -> 4 pixels per byte) */ - /* 1 line is 8 pixels -> 2 bytes per line */ - for (p = 0; p < sprite_bytes; p += 2) - { - uint8_t tile_y = p / 2; - - if (tile_y + y != line) - continue; - - /* calc frame position buffer for 4 pixels */ - uint32_t pos_fb = (tile_pos_fb + (tile_y * 160)) & 0xFFFF; //% 65536; - - /* calc tile pointer */ - if (oam->y_flip) - tile_ptr = (oam->pattern * 16) + (sprite_bytes - p - 2); - else - tile_ptr = (oam->pattern * 16) + p; - - /* pixels are handled in a super shitty way */ - /* bit 0 of the pixel is taken from even position tile bytes */ - /* bit 1 of the pixel is taken from odd position tile bytes */ - - uint8_t pxa[8]; - - for (j = 0; j < 8; j++) - { - uint8_t shft = (1 << j); - - pxa[j] = ((*(tiles + tile_ptr) & shft) ? 1 : 0) | - ((*(tiles + tile_ptr + 1) & shft) ? 2 : 0); - } - - /* set 8 pixels (full tile line) */ - for (i = 0; i < 8; i++) - { - if (oam->x_flip) - off = i; - else - off = 7 - i; - - /* is it on screen? */ - fb_x = x + off; - - if (fb_x < 0 || fb_x > 160) - continue; - - /* set serial position on frame buffer */ - pos = pos_fb + off; - - /* is it inside the screen? */ - if (pos >= 144 * 160 || pos < 0) - continue; - - if (global_cgb) - { - /* sprite color 0 = transparent */ - if (pxa[i] != 0x00) - { - /* flag clr = sprites always on top of bg and window */ - if ((*gpu.lcd_ctrl).bg == 0) - { - gpu.frame_buffer[pos] = palette[pxa[i]]; - gpu.priority[pos] = 0x02; - } - else - { - if (((gpu.priority[pos] == 0) && - (oam->priority == 0 || - (oam->priority == 1 && - gpu.palette_idx[pos] == 0x00))) || - (gpu.priority[pos] == 1 && - gpu.palette_idx[pos] == 0x00)) - { - gpu.frame_buffer[pos] = palette[pxa[i]]; - gpu.priority[pos] = (oam->priority ? 0x00 : 0x02); - } - } - } - } - else - { - /* push on screen pixels not set to zero (transparent) */ - /* and if the priority is set to one, overwrite just */ - /* bg pixels set to zero */ - if ((pxa[i] != 0x00) && - (oam->priority == 0 || - (oam->priority == 1 && - gpu.frame_buffer[pos] == gpu.bg_palette[0x00]))) - { - gpu.frame_buffer[pos] = palette[pxa[i]]; - gpu.priority[pos] = (oam->priority ? 0x00 : 0x02); - } - } - } - } -} - -/* update GPU internal state given CPU T-states */ -void gpu_step() -{ - char ly_changed = 0; - char mode_changed = 0; - - /* take different action based on current state */ - switch ((*gpu.lcd_status).mode) - { - /* - * during HBLANK (CPU can access VRAM) - */ - case 0: - /* handle HDMA stuff during hblank */ - cycles_hdma(); - - /* - * if current line == 143 (and it's about to turn 144) - * enter mode 01 (VBLANK) - */ - if (*gpu.ly == 143) - { - /* notify mode has changes */ - mode_changed = 1; - - (*gpu.lcd_status).mode = 0x01; - - /* mode one lasts 456 cycles */ - gpu.next = cycles.cnt + - (456 << global_cpu_double_speed); - - /* DRAW! TODO */ - /* CHECK INTERRUPTS! TODO */ - cycles_vblank(); - - /* set VBLANK interrupt flag */ - gpu_if->lcd_vblank = 1; - - /* apply gameshark patches */ - //mmu_apply_gs(); - - /* and finally push it on screen! */ - gpu_draw_frame(); - } - else - { - /* notify mode has changed */ - mode_changed = 1; - - /* enter OAM mode */ - (*gpu.lcd_status).mode = 0x02; - - /* mode 2 needs 80 cycles */ - gpu.next = cycles.cnt + - (80 << global_cpu_double_speed); - } - - /* notify mode has changed */ - ly_changed = 1; - - /* inc current line */ - (*gpu.ly)++; - - // cycles_hblank(*gpu.ly); - - break; - - /* - * during VBLANK (CPU can access VRAM) - */ - case 1: - /* notify ly has changed */ - ly_changed = 1; - - /* inc current line */ - (*gpu.ly)++; - - /* reached the bottom? */ - if ((*gpu.ly) > 153) - { - /* go back to line 0 */ - (*gpu.ly) = 0; - - /* switch to OAM mode */ - (*gpu.lcd_status).mode = 0x02; - - /* */ - gpu.next = - cycles.cnt + (80 << global_cpu_double_speed); - } - else - gpu.next = - cycles.cnt + (456 << global_cpu_double_speed); - - break; - - /* - * during OAM (LCD access FE00-FE90, so CPU cannot) - */ - case 2: - /* reset clock counter */ - gpu.next = - cycles.cnt + (172 << global_cpu_double_speed); - - /* notify mode has changed */ - mode_changed = 1; - - /* switch to VRAM mode */ - (*gpu.lcd_status).mode = 0x03; - - break; - - /* - * during VRAM (LCD access both OAM and VRAM, so CPU cannot) - */ - case 3: - /* reset clock counter */ - gpu.next = - cycles.cnt + (204 << global_cpu_double_speed); - - /* notify mode has changed */ - mode_changed = 1; - - /* go back to HBLANK mode */ - (*gpu.lcd_status).mode = 0x00; - - /* draw line */ - gpu_draw_line(*gpu.ly); - - /* notify cycles */ - // cycles_hblank(*gpu.ly); - - //printf("COLLA %d\n", *gpu.ly); - - break; - } - - /* ly changed? is it the case to trig an interrupt? */ - if (ly_changed) - { - /* check if we gotta trigger an interrupt */ - if ((*gpu.ly) == (*gpu.lyc)) - { - /* set lcd status flags indicating there's a concidence */ - (*gpu.lcd_status).ly_coincidence = 1; - - /* an interrupt is desiderable? */ - if ((*gpu.lcd_status).ir_ly_coincidence) - gpu_if->lcd_ctrl = 1; - } - else - { - /* set lcd status flags indicating there's NOT a concidence */ - (*gpu.lcd_status).ly_coincidence = 0; - } - } - - /* mode changed? is is the case to trig an interrupt? */ - if (mode_changed) - { - if ((*gpu.lcd_status).mode == 0x00 && - (*gpu.lcd_status).ir_mode_00) - gpu_if->lcd_ctrl = 1; - else if ((*gpu.lcd_status).mode == 0x01 && - (*gpu.lcd_status).ir_mode_01) - gpu_if->lcd_ctrl = 1; - else if ((*gpu.lcd_status).mode == 0x02 && - (*gpu.lcd_status).ir_mode_10) - gpu_if->lcd_ctrl = 1; - } -} - -uint8_t gpu_read_reg(uint16_t a) -{ - switch (a) - { - case 0xFF68: - - return (gpu.cgb_palette_bg_autoinc << 7 | gpu.cgb_palette_bg_idx); - - case 0xFF69: - - if ((gpu.cgb_palette_bg_idx & 0x01) == 0x00) - return gpu.cgb_palette_bg[gpu.cgb_palette_bg_idx / 2] & - 0x00ff; - else - return (gpu.cgb_palette_bg[gpu.cgb_palette_bg_idx / 2] & - 0xff00) >> - 8; - - case 0xFF6A: - - return (gpu.cgb_palette_oam_autoinc << 7 | gpu.cgb_palette_oam_idx); - - case 0xFF6B: - - if ((gpu.cgb_palette_oam_idx & 0x01) == 0x00) - return gpu.cgb_palette_oam[gpu.cgb_palette_oam_idx / 2] & - 0x00ff; - else - return (gpu.cgb_palette_oam[gpu.cgb_palette_oam_idx / 2] & - 0xff00) >> - 8; - } - - return 0x00; -} - -static uint32_t makecol(uint16_t c) -{ - // TODO: hook this up to the same color logic that the other cores use - return c >> 7 & 0xf8 | c >> 12 & 0x07 - | c << 6 & 0xf800 | c << 1 & 0x0700 - | c << 19 & 0xf80000 | c << 14 & 0x070000 - | 0xff000000; -} - -void gpu_write_reg(uint16_t a, uint8_t v) -{ - int i; - switch (a) - { - case 0xFF47: - gpu.bg_palette[0] = gpu_color_lookup[v & 0x03]; - gpu.bg_palette[1] = gpu_color_lookup[(v & 0x0c) >> 2]; - gpu.bg_palette[2] = gpu_color_lookup[(v & 0x30) >> 4]; - gpu.bg_palette[3] = gpu_color_lookup[(v & 0xc0) >> 6]; - break; - - case 0xFF48: - gpu.obj_palette_0[0] = gpu_color_lookup[v & 0x03]; - gpu.obj_palette_0[1] = gpu_color_lookup[(v & 0x0c) >> 2]; - gpu.obj_palette_0[2] = gpu_color_lookup[(v & 0x30) >> 4]; - gpu.obj_palette_0[3] = gpu_color_lookup[(v & 0xc0) >> 6]; - break; - - case 0xFF49: - gpu.obj_palette_1[0] = gpu_color_lookup[v & 0x03]; - gpu.obj_palette_1[1] = gpu_color_lookup[(v & 0x0c) >> 2]; - gpu.obj_palette_1[2] = gpu_color_lookup[(v & 0x30) >> 4]; - gpu.obj_palette_1[3] = gpu_color_lookup[(v & 0xc0) >> 6]; - break; - - case 0xFF68: - gpu.cgb_palette_bg_idx = (v & 0x3f); - gpu.cgb_palette_bg_autoinc = ((v & 0x80) == 0x80); - break; - - case 0xFF69: - i = gpu.cgb_palette_bg_idx / 2; - - if ((gpu.cgb_palette_bg_idx & 0x01) == 0x00) - { - gpu.cgb_palette_bg[i] &= 0xff00; - gpu.cgb_palette_bg[i] |= v; - } - else - { - gpu.cgb_palette_bg[i] &= 0x00ff; - gpu.cgb_palette_bg[i] |= (v << 8); - } - - gpu.cgb_palette_bg_rgb888[i] = makecol(gpu.cgb_palette_bg[i]); - - if (gpu.cgb_palette_bg_autoinc) - gpu.cgb_palette_bg_idx = (gpu.cgb_palette_bg_idx + 1) & 0x3f; - - break; - - case 0xFF6A: - gpu.cgb_palette_oam_idx = v & 0x3f; - gpu.cgb_palette_oam_autoinc = ((v & 0x80) == 0x80); - break; - - case 0xFF6B: - i = gpu.cgb_palette_oam_idx / 2; - - if ((gpu.cgb_palette_oam_idx & 0x01) == 0x00) - { - gpu.cgb_palette_oam[i] &= 0xff00; - gpu.cgb_palette_oam[i] |= v; - } - else - { - gpu.cgb_palette_oam[i] &= 0x00ff; - gpu.cgb_palette_oam[i] |= (v << 8); - } - - gpu.cgb_palette_oam_rgb888[i] = makecol(gpu.cgb_palette_oam[i]); - - if (gpu.cgb_palette_oam_autoinc) - gpu.cgb_palette_oam_idx = (gpu.cgb_palette_oam_idx + 1) & 0x3f; - - break; - } -} - -void gpu_set_speed(char speed) -{ - if (speed == 1) - gpu.step = 2; - else - gpu.step = 4; -} diff --git a/waterbox/pizza/lib/gpu.h b/waterbox/pizza/lib/gpu.h deleted file mode 100644 index 1fd8105d4e..0000000000 --- a/waterbox/pizza/lib/gpu.h +++ /dev/null @@ -1,133 +0,0 @@ -/* - - This file is part of Emu-Pizza - - Emu-Pizza is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Emu-Pizza is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Emu-Pizza. If not, see . - -*/ - -#ifndef __GPU_HDR__ -#define __GPU_HDR__ - -#include -#include - -/* callback function */ -typedef void (*gpu_frame_ready_cb_t) (); - -/* prototypes */ -void gpu_dump_oam(); -void gpu_init(gpu_frame_ready_cb_t cb); -void gpu_reset(); -void gpu_set_speed(char speed); -void gpu_step(); -void gpu_toggle(uint8_t state); -void gpu_write_reg(uint16_t a, uint8_t v); -uint8_t gpu_read_reg(uint16_t a); - - -/* Gameboy LCD Control - R/W accessing 0xFF40 address */ -typedef struct gpu_lcd_ctrl_s -{ - uint8_t bg:1; /* 0 = BG off, 1 = BG on */ - uint8_t sprites:1; /* ??? */ - uint8_t sprites_size:1; /* 0 = 8x8, 1 = 8x16 */ - uint8_t bg_tiles_map:1; /* 0 = 9800-9BFF, 1 = 9C00-9FFF */ - uint8_t bg_tiles:1; /* 0 = 8800-97FF, 1 = 8000-8FFF */ - uint8_t window:1; /* 0 = window off, 1 = on */ - uint8_t window_tiles_map:1; /* 0 = 9800-9BFF, 1 = 9C00-9FFF */ - uint8_t display:1; /* 0 = LCD off, 1 = LCD on */ -} gpu_lcd_ctrl_t; - -/* Gameboy LCD Status - R/W accessing 0xFF41 address */ -typedef struct gpu_lcd_status_s -{ - uint8_t mode:2; - uint8_t ly_coincidence:1; - uint8_t ir_mode_00:1; - uint8_t ir_mode_01:1; - uint8_t ir_mode_10:1; - uint8_t ir_ly_coincidence:1; - uint8_t spare:1; -} gpu_lcd_status_t; - -/* RGB color */ -typedef struct rgb_s -{ - uint8_t r; - uint8_t g; - uint8_t b; - uint8_t a; -} rgb_t; - -/* Gameboy GPU status */ -typedef struct gpu_s -{ - gpu_lcd_ctrl_t *lcd_ctrl; - gpu_lcd_status_t *lcd_status; - - /* scroll positions */ - uint8_t *scroll_x; - uint8_t *scroll_y; - - /* window position */ - uint8_t *window_x; - uint8_t *window_y; - - /* current scanline and it's compare values */ - uint8_t *ly; - uint8_t *lyc; - - /* clocks counter */ - uint64_t next; - - /* gpu step span */ - uint_fast32_t step; - - /* window last drawn lines */ - uint8_t window_last_ly; - uint8_t window_skipped_lines; - uint16_t spare; - - /* frame counter */ - uint_fast16_t frame_counter; - - /* BG palette */ - uint32_t bg_palette[4]; - - /* Obj palette 0/1 */ - uint32_t obj_palette_0[4]; - uint32_t obj_palette_1[4]; - - /* CGB palette for background */ - uint32_t cgb_palette_bg_rgb888[0x20]; - uint16_t cgb_palette_bg[0x20]; - uint8_t cgb_palette_bg_idx; - uint8_t cgb_palette_bg_autoinc; - - /* CGB palette for sprites */ - uint32_t cgb_palette_oam_rgb888[0x20]; - uint16_t cgb_palette_oam[0x20]; - uint8_t cgb_palette_oam_idx; - uint8_t cgb_palette_oam_autoinc; - - /* frame buffer */ - uint32_t frame_buffer[160 * 144]; - uint8_t priority[160 * 144]; - uint8_t palette_idx[160 * 144]; -} gpu_t; - -extern gpu_t gpu; - -#endif diff --git a/waterbox/pizza/lib/input.c b/waterbox/pizza/lib/input.c deleted file mode 100644 index 4dfde8d5aa..0000000000 --- a/waterbox/pizza/lib/input.c +++ /dev/null @@ -1,50 +0,0 @@ -/* - - This file is part of Emu-Pizza - - Emu-Pizza is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Emu-Pizza is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Emu-Pizza. If not, see . - -*/ - -#include "global.h" -#include "utils.h" - -#include - -/* button states */ -static uint8_t input_keys; - -void input_set_keys(uint8_t keys) -{ - // 7......0 - // DULRSsBA - input_keys = keys & 0xff; -} - -uint8_t input_get_keys(uint8_t line) -{ - uint8_t v = line | 0x0f; - - if ((line & 0x30) == 0x20) - { - v ^= input_keys >> 4; - } - - if ((line & 0x30) == 0x10) - { - v ^= input_keys & 0x0f; - } - - return v | 0xc0; -} diff --git a/waterbox/pizza/lib/input.h b/waterbox/pizza/lib/input.h deleted file mode 100644 index 3f678ea009..0000000000 --- a/waterbox/pizza/lib/input.h +++ /dev/null @@ -1,27 +0,0 @@ -/* - - This file is part of Emu-Pizza - - Emu-Pizza is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Emu-Pizza is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Emu-Pizza. If not, see . - -*/ - -#ifndef __INPUT_HDR__ -#define __INPUT_HDR__ - -/* prototypes */ -uint8_t input_get_keys(uint8_t line); -void input_set_keys(uint8_t keys); - -#endif diff --git a/waterbox/pizza/lib/interrupt.h b/waterbox/pizza/lib/interrupt.h deleted file mode 100644 index 0fbc4b0873..0000000000 --- a/waterbox/pizza/lib/interrupt.h +++ /dev/null @@ -1,35 +0,0 @@ -/* - - This file is part of Emu-Pizza - - Emu-Pizza is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Emu-Pizza is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Emu-Pizza. If not, see . - -*/ - -#ifndef __INTERRUPTS_HDR__ -#define __INTERRUPTS_HDR__ - -#include - -typedef struct interrupts_flags_s -{ - uint8_t lcd_vblank:1; - uint8_t lcd_ctrl:1; - uint8_t timer:1; - uint8_t serial_io:1; - uint8_t pins1013:1; - uint8_t spare:3; -} interrupts_flags_t; - -#endif \ No newline at end of file diff --git a/waterbox/pizza/lib/mmu.c b/waterbox/pizza/lib/mmu.c deleted file mode 100644 index 8a8bc9b30b..0000000000 --- a/waterbox/pizza/lib/mmu.c +++ /dev/null @@ -1,1029 +0,0 @@ -/* - - This file is part of Emu-Pizza - - Emu-Pizza is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Emu-Pizza is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Emu-Pizza. If not, see . - -*/ - -#include "cycles.h" -#include "global.h" -#include "gpu.h" -#include "interrupt.h" -#include "input.h" -#include "mmu.h" -#include "sound.h" -#include "serial.h" -#include "timer.h" -#include "utils.h" - -#include -#include -#include -#include -#include "sgb.h" -#include - -/* GAMEBOY MEMORY AREAS - -0x0000 - 0x00FF - BIOS -0x0000 - 0x3FFF - First 16k of game ROM (permanent) -0x4000 - 0x7FFF - ROM banks (switchable) -0x8000 - 0x9FFF - Video RAM (8kb - keeps pixels data) -0xA000 - 0xBFFF - External RAM (switchable, it was on cartridge, - 8kb banks, max 32k, NON volatile) -0xC000 - 0xDFFF - Gameboy RAM -0xE000 - 0xEFFF - ???????????????? -0xFE00 - 0xFF7F - I/O -0xFF80 - 0xFFFE - Temp RAM -0xFFFF - Turn on/off interrupts - -*/ - -/* cartridge memory (max 8MB) */ -uint8_t* cart_memory; - -/* RAM memory area */ -uint8_t *ram; -uint32_t ram_sz; - -/* main struct */ -mmu_t mmu; - -/* function to call when rumble */ -mmu_rumble_cb_t mmu_rumble_cb = NULL; - - -/* return absolute memory address */ -void *mmu_addr(uint16_t a) -{ - return (void *) &mmu.memory[a]; -} - -/* return absolute memory address */ -void *mmu_addr_vram0() -{ - return (void *) &mmu.vram0; -} - -/* return absolute memory address */ -void *mmu_addr_vram1() -{ - return (void *) &mmu.vram1; -} - -/* debug purposes */ -void mmu_dump_all() -{ - int i; - - printf("#### MAIN MEMORY ####\n\n"); - - for (i=0; i<0x10000; i++) - { - if ((i & 0x0f) == 0x00) - printf("\n%04x: ", i); - printf(" %02x", mmu.memory[i]); - } - - if (global_cgb) - { - printf("#### VRAM 0 ####\n\n"); - - for (i=0; i<0x2000; i++) - { - if ((i & 0x0f) == 0x00) - printf("\n%04x: ", i); - printf(" %02x", mmu.vram0[i]); - } - - printf("#### VRAM 1 ####\n\n"); - - for (i=0; i<0x2000; i++) - { - if ((i & 0x0f) == 0x00) - printf("\n%04x: ", i); - printf(" %02x", mmu.vram1[i]); - } - } -} - -/* init (alloc) system state.memory */ -void mmu_init(uint8_t c, uint8_t rn) -{ - mmu.rom_current_bank = 0x01; - mmu.ram_current_bank = 0x00; - - /* set ram to NULL */ - ram = NULL; - - /* save carttype and qty of ROM blocks */ - mmu.carttype = c; - mmu.roms = rn; - - mmu.vram_idx = 0; - mmu.wram_current_bank = 1; - mmu.ram_current_bank = 0; - mmu.ram_external_enabled = 0; - mmu.dma_cycles = 0; - mmu.dma_address = 0; - mmu.rtc_mode = 0; - - /* reset memory */ - bzero(mmu.memory, 65536); -} - -/* init (alloc) system state.memory */ -void mmu_init_ram(uint32_t c) -{ - ram_sz = c; - - ram = malloc(c); - - bzero(ram, c); -} - -/* load data in a certain address */ -void mmu_load(uint8_t *data, size_t sz, uint16_t a) -{ - memcpy(&mmu.memory[a], data, sz); -} - -/* load full cartridge */ -void mmu_load_cartridge(const uint8_t *data, size_t sz) -{ - /* copy max 32k into working memory */ - memcpy(mmu.memory, data, 2 << 14); - - cart_memory = alloc_sealed(1 << 22); - /* copy full cartridge */ - memcpy(cart_memory, data, sz); -} - -/* move 8 bit from s to d */ -void mmu_move(uint16_t d, uint16_t s) -{ - mmu_write(d, mmu_read(s)); -} - -/* read 8 bit data from a memory addres */ -uint8_t mmu_read(uint16_t a) -{ - /* always takes 4 cycles */ - cycles_step(); - - /* 90% of the read is in the ROM area */ - if (a < 0x8000) - return mmu.memory[a]; - - /* test VRAM */ - if (a < 0xA000) - { - if (global_cgb) - { - if (mmu.vram_idx == 0) - return mmu.vram0[a - 0x8000]; - else - return mmu.vram1[a - 0x8000]; - } - - return mmu.memory[a]; - } - - if (a < 0xC000) - { - if (mmu.rtc_mode != 0x00) - { - int64_t diff = mmu.rtc_latch_time - mmu.rtc_time; - - switch (mmu.rtc_mode) - { - case 0x08: - return (diff % 60); - case 0x09: - return ((diff / 60) % 60); - case 0x0A: - return (diff / 3600) % 24; - case 0x0B: - return (diff / (3600 * 24)) & 0x00FF; - case 0x0C: - return ((diff / (3600 * 24)) & 0xFF00) >> 8; - } - } - else - return mmu.memory[a]; - } - - /* RAM */ - if (a < 0xE000) - return mmu.memory[a]; - - /* RAM mirror */ - if (a < 0xFE00) - return mmu.memory[a - 0x2000]; - - switch (a) - { - /* serial registers */ - case 0xFF01: - case 0xFF02: - return serial_read_reg(a); - - /* don't ask me why.... */ - case 0xFF44: - return (mmu.memory[0xFF44] == 153 ? 0 : mmu.memory[0xFF44]); - - /* sound registers */ - case 0xFF10 ... 0xFF3F: - return sound_read_reg(a, mmu.memory[a]); - - /* joypad reading */ - case 0xFF00: - global_lagged = 0; - if (global_input_callback) - global_input_callback(); - return global_sgb ? sgb_read_ff00(cycles.sampleclock) : input_get_keys(mmu.memory[a]); - - /* CGB HDMA transfer */ - case 0xFF55: - - if (!global_cgb) break; - - /* HDMA result */ - if (mmu.hdma_to_transfer) - return (mmu.hdma_to_transfer / 0x10 - 0x01); - else - return 0xFF; - - /* CGB color palette registers */ - case 0xFF68: - case 0xFF69: - case 0xFF6A: - case 0xFF6B: - - if (!global_cgb) break; - - /* color palettes registers */ - return gpu_read_reg(a); - - /* timer registers */ - case 0xFF04 ... 0xFF07: - return timer_read_reg(a); - - } - - return mmu.memory[a]; -} - -/* read 16 bit data from a memory addres */ -unsigned int mmu_read_16(uint16_t a) -{ - return (mmu_read(a) | (mmu_read(a + 1) << 8)); -} - -/* read 8 bit data from a memory addres (not affecting cycles) */ -uint8_t mmu_read_no_cyc(uint16_t a) -{ - if (a >= 0xE000 && a <= 0xFDFF) - return mmu.memory[a - 0x2000]; - - return mmu.memory[a]; -} - -static int has_saveram(void) -{ - return mmu.carttype == 0x03 || - mmu.carttype == 0x06 || - mmu.carttype == 0x09 || - mmu.carttype == 0x0D || - mmu.carttype == 0x0F || - mmu.carttype == 0x10 || - mmu.carttype == 0x13 || - mmu.carttype == 0x17 || - mmu.carttype == 0x1B || - mmu.carttype == 0x1E || - mmu.carttype == 0x22 || - mmu.carttype == 0xFF; -} - -int mmu_saveram_size(void) -{ - return has_saveram() ? ram_sz : 0; -} - -void mmu_restore_saveram(const uint8_t* data, int sz) -{ - if (sz == mmu_saveram_size()) - { - if (ram_sz <= 0x2000) - { - memcpy(&mmu.memory[0xa000], data, ram_sz); - } - else - { - memcpy(ram, data, ram_sz); - if (mmu.ram_external_enabled) - memcpy(&mmu.memory[0xa000], &ram[0x2000 * mmu.ram_current_bank], 0x2000); - } - } -} - -void mmu_save_saveram(uint8_t* dest, int sz) -{ - if (sz == mmu_saveram_size()) - { - if (ram_sz <= 0x2000) - { - memcpy(dest, &mmu.memory[0xa000], ram_sz); - } - else - { - memcpy(dest, ram, ram_sz); - if (mmu.ram_external_enabled) - memcpy(&dest[0x2000 * mmu.ram_current_bank], &mmu.memory[0xa000], 0x2000); - } - } -} - -void mmu_set_rumble_cb(mmu_rumble_cb_t cb) -{ - mmu_rumble_cb = cb; -} - -/* write 16 bit block on a memory address */ -void mmu_write(uint16_t a, uint8_t v) -{ - /* update cycles AFTER memory set */ - cycles_step(); - - /* color gameboy stuff */ - if (global_cgb) - { - /* VRAM write? */ - if (a >= 0x8000 && a < 0xA000) - { - if (mmu.vram_idx == 0) - mmu.vram0[a - 0x8000] = v; - else - mmu.vram1[a - 0x8000] = v; - - return; - } - else - { - /* wanna access to RTC register? */ - if (a >= 0xA000 && a <= 0xBFFF && mmu.rtc_mode != 0x00) - { - int64_t t,s1,s2,m1,m2,h1,h2,d1,d2,days; - - t = global_currenttime; - - /* extract parts in seconds from current and ref times */ - s1 = t % 60; - s2 = mmu.rtc_time % 60; - - m1 = (t - s1) % (60 * 60); - m2 = (mmu.rtc_time - s2) % (60 * 60); - - h1 = (t - m1 - s1) % (60 * 60 * 24); - h2 = (mmu.rtc_time - m2 - s2) % (60 * 60 * 24); - - d1 = t - h1 - m1 - s1; - d2 = mmu.rtc_time - h2 - m2 - s2; - - switch (mmu.rtc_mode) - { - case 0x08: - - /* remove seconds from current time */ - mmu.rtc_time -= s2; - - /* set new seconds */ - mmu.rtc_time += (s1 - v); - - return; - - case 0x09: - - /* remove seconds from current time */ - mmu.rtc_time -= m2; - - /* set new seconds */ - mmu.rtc_time += (m1 - (v * 60)); - - return; - - case 0x0A: - - /* remove seconds from current time */ - mmu.rtc_time -= h2; - - /* set new seconds */ - mmu.rtc_time += (h1 - (v * 60 * 24)); - - return; - - case 0x0B: - - days = (((d1 - d2) / - (60 * 60 * 24)) & 0xFF00) | v; - - /* remove seconds from current time */ - mmu.rtc_time -= d2; - - /* set new seconds */ - mmu.rtc_time += (d1 - (days * 60 * 60 * 24)); - - return; - - case 0x0C: - - days = (((d1 - d2) / - (60 * 60 * 24)) & 0xFEFF) | (v << 8); - - /* remove seconds from current time */ - mmu.rtc_time -= d2; - - /* set new seconds */ - mmu.rtc_time += (d1 - (days * 60 * 60 * 24)); - - return; - } - } - } - - /* switch WRAM */ - if (a == 0xFF70) - { - /* number goes from 1 to 7 */ - uint8_t new = (v & 0x07); - - if (new == 0) - new = 1; - - if (new == mmu.wram_current_bank) - return; - - /* save current bank */ - memcpy(&mmu.wram[0x1000 * mmu.wram_current_bank], - &mmu.memory[0xD000], 0x1000); - - mmu.wram_current_bank = new; - - /* move new ram bank */ - memcpy(&mmu.memory[0xD000], - &mmu.wram[0x1000 * mmu.wram_current_bank], - 0x1000); - - /* save current bank */ - mmu.memory[0xFF70] = new; - - return; - } - - if (a == 0xFF4F) - { - /* extract VRAM index from last bit */ - mmu.vram_idx = (v & 0x01); - - /* save current VRAM bank */ - mmu.memory[0xFF4F] = mmu.vram_idx; - - return; - } - } - - /* wanna write on ROM? */ - if (a < 0x8000) - { - /* return in case of ONLY ROM */ - if (mmu.carttype == 0x00) - return; - - /* TODO - MBC strategies */ - uint8_t b = mmu.rom_current_bank; - - switch (mmu.carttype) - { - /* MBC1 */ - case 0x01: - case 0x02: - case 0x03: - - if (a >= 0x2000 && a <= 0x3FFF) - { - /* reset 5 bits */ - b = mmu.rom_current_bank & 0xE0; - - /* set them with new value */ - b |= v & 0x1F; - - /* doesn't fit on max rom number? */ - if (b > (2 << mmu.roms)) - { - /* filter result to get a value < max rom number */ - b %= (2 << mmu.roms); - } - - /* 0x00 is not valid, switch it to 0x01 */ - if (b == 0x00) - b = 0x01; - } - else if (a >= 0x4000 && a <= 0x5FFF) - { - /* ROM banking? it's about 2 higher bits */ - if (mmu.banking == 0) - { - /* reset 5 bits */ - b = mmu.rom_current_bank & 0x1F; - - /* set them with new value */ - b |= (v << 5); - - /* doesn't fit on max rom number? */ - if (b > (2 << mmu.roms)) - { - /* filter result to get a value < max rom number */ - b %= (2 << mmu.roms); - } - } - else - { - if ((0x2000 * v) < ram_sz) - { - /* save current bank */ - memcpy(&ram[0x2000 * mmu.ram_current_bank], - &mmu.memory[0xA000], 0x2000); - - mmu.ram_current_bank = v; - - /* move new ram bank */ - memcpy(&mmu.memory[0xA000], - &ram[0x2000 * mmu.ram_current_bank], - 0x2000); - } - } - } - else if (a >= 0x6000 && a <= 0x7FFF) - mmu.banking = v; - - break; - - /* MBC2 */ - case 0x05: - case 0x06: - - if (a >= 0x2000 && a <= 0x3FFF) - { - /* use lower nibble to set current bank */ - b = v & 0x0f; - - /*if (b != rom_current_bank) - memcpy(&memory[0x4000], - &cart_memory[b * 0x4000], 0x4000); - - rom_current_bank = b;*/ - } - - break; - - /* MBC3 */ - case 0x10: - case 0x13: - - if (a >= 0x0000 && a <= 0x1FFF) - { - if (v == 0x0A) - { - /* already enabled? */ - if (mmu.ram_external_enabled) - return; - - /* restore external ram bank */ - memcpy(&mmu.memory[0xA000], - &ram[0x2000 * mmu.ram_current_bank], - 0x2000); - - /* set external RAM eanbled flag */ - mmu.ram_external_enabled = 1; - - return; - } - - if (v == 0x00) - { - /* already disabled? */ - if (mmu.ram_external_enabled == 0) - return; - - /* save current bank */ - memcpy(&ram[0x2000 * mmu.ram_current_bank], - &mmu.memory[0xA000], 0x2000); - - /* clear external RAM eanbled flag */ - mmu.ram_external_enabled = 0; - } - } - else if (a >= 0x2000 && a <= 0x3FFF) - { - /* set them with new value */ - b = v & 0x7F; - - /* doesn't fit on max rom number? */ - if (b > (2 << mmu.roms)) - { - /* filter result to get a value < max rom number */ - b %= (2 << mmu.roms); - } - - /* 0x00 is not valid, switch it to 0x01 */ - if (b == 0x00) - b = 0x01; - } - else if (a >= 0x4000 && a <= 0x5FFF) - { - /* 0x00 to 0x07 is referred to RAM bank */ - if (v < 0x08) - { - /* not on RTC mode anymore */ - mmu.rtc_mode = 0x00; - - if ((0x2000 * (v & 0x0f)) < ram_sz) - { - /* save current bank */ - memcpy(&ram[0x2000 * mmu.ram_current_bank], - &mmu.memory[0xA000], 0x2000); - - mmu.ram_current_bank = v & 0x0f; - - /* move new ram bank */ - memcpy(&mmu.memory[0xA000], - &ram[0x2000 * mmu.ram_current_bank], - 0x2000); - } - } - else if (v < 0x0d) - { - /* from 0x08 to 0x0C trigger RTC mode */ - mmu.rtc_mode = v; - } - - } - else if (a >= 0x6000 && a <= 0x7FFF) - { - /* latch clock data. move clock data to RTC registers */ - mmu.rtc_latch_time = global_currenttime; - } - - - break; - - /* MBC5 */ - case 0x19: - case 0x1A: - case 0x1B: - case 0x1C: - case 0x1D: - case 0x1E: - - if (a >= 0x0000 && a <= 0x1FFF) - { - if (v == 0x0A) - { - /* we got external RAM? some stupid game try */ - /* to access it despite it doesn't have it */ - if (ram_sz == 0) - return; - - /* already enabled? */ - if (mmu.ram_external_enabled) - return; - - /* restore external ram bank */ - memcpy(&mmu.memory[0xA000], - &ram[0x2000 * mmu.ram_current_bank], - 0x2000); - - /* set external RAM eanbled flag */ - mmu.ram_external_enabled = 1; - - return; - } - - if (v == 0x00) - { - /* we got external RAM? some stpd game try to do shit */ - if (ram_sz == 0) - return; - - /* already disabled? */ - if (mmu.ram_external_enabled == 0) - return; - - /* save current bank */ - memcpy(&ram[0x2000 * mmu.ram_current_bank], - &mmu.memory[0xA000], 0x2000); - - /* clear external RAM eanbled flag */ - mmu.ram_external_enabled = 0; - } - } - if (a >= 0x2000 && a <= 0x2FFF) - { - /* set them with new value */ - b = (mmu.rom_current_bank & 0xFF00) | v; - - /* doesn't fit on max rom number? */ - if (b > (2 << mmu.roms)) - { - /* filter result to get a value < max rom number */ - b %= (2 << mmu.roms); - } - } - else if (a >= 0x3000 && a <= 0x3FFF) - { - /* set them with new value */ - b = (mmu.rom_current_bank & 0x00FF) | ((v & 0x01) << 8); - - /* doesn't fit on max rom number? */ - if (b > (2 << mmu.roms)) - { - /* filter result to get a value < max rom number */ - b %= (2 << mmu.roms); - } - } - else if (a >= 0x4000 && a <= 0x5FFF) - { - uint8_t mask = 0x0F; - - if (global_rumble) - { - mask = 0x07; - - if (mmu_rumble_cb) - (*mmu_rumble_cb) ((v & 0x08) ? 1 : 0); - - /* check if we want to appizz the motor */ -/* if (v & 0x08) - printf("APPIZZ MOTOR\n"); - else - printf("SPEGN MOTOR\n");*/ - } - - if ((0x2000 * (v & mask)) < ram_sz) - { - /* is externa RAM enabled? */ - if (!mmu.ram_external_enabled) - break; - - /* wanna switch on the same bank? =\ just discard it */ - if ((v & 0x0f) == mmu.ram_current_bank) - break; - - /* save current bank */ - memcpy(&ram[0x2000 * mmu.ram_current_bank], - &mmu.memory[0xA000], 0x2000); - - mmu.ram_current_bank = (v & 0x0f); - - /* move new ram bank */ - memcpy(&mmu.memory[0xA000], - &ram[0x2000 * mmu.ram_current_bank], - 0x2000); - } - } - - break; - - } - - /* need to switch? */ - if (b != mmu.rom_current_bank) - { - /* copy from cartridge rom to GB switchable bank area */ - memcpy(&mmu.memory[0x4000], &cart_memory[b * 0x4000], 0x4000); - - /* save new current bank */ - mmu.rom_current_bank = b; - } - - return; - } - - if (a >= 0xE000) - { - /* changes on sound registers? */ - if (a >= 0xFF10 && a <= 0xFF3F) - { - /* set memory */ - sound_write_reg(a, v); - - return; - } - - /* mirror area */ - if (a >= 0xE000 && a <= 0xFDFF) - { - mmu.memory[a - 0x2000] = v; - return; - } - - /* TODO - put them all */ - switch(a) - { - case 0xFF00: - sgb_write_ff00(v, cycles.sampleclock); - break; - case 0xFF01: - case 0xFF02: - serial_write_reg(a, v); - return; - case 0xFF04 ... 0xFF07: - timer_write_reg(a, v); - return; - } - - /* LCD turned on/off? */ - if (a == 0xFF40) - { - if ((v ^ mmu.memory[0xFF40]) & 0x80) - gpu_toggle(v); - } - - /* only 5 high bits are writable */ - if (a == 0xFF41) - { - mmu.memory[a] = (mmu.memory[a] & 0x07) | (v & 0xf8); - return; - } - - /* palette update */ - if ((a >= 0xFF47 && a <= 0xFF49) || - (a >= 0xFF68 && a <= 0xFF6B)) - gpu_write_reg(a, v); - - /* CGB only registers */ - if (global_cgb) - { - switch (a) - { - case 0xFF4D: - - /* wanna switch speed? */ - if (v & 0x01) - { - global_cpu_double_speed ^= 0x01; - - /* update new clock */ - // cycles_clock = 4194304 << global_double_speed; - cycles_set_speed(1); - sound_set_speed(1); - gpu_set_speed(1); - - /* save into memory i'm working at double speed */ - if (global_cpu_double_speed) - mmu.memory[a] = 0x80; - else - mmu.memory[a] = 0x00; - } - - return; - - case 0xFF52: - - /* high byte of HDMA source address */ - mmu.hdma_src_address &= 0xff00; - - /* lower 4 bits are ignored */ - mmu.hdma_src_address |= (v & 0xf0); - - break; - - case 0xFF51: - - /* low byte of HDMA source address */ - mmu.hdma_src_address &= 0x00ff; - - /* highet 3 bits are ignored (always 100 binary) */ - mmu.hdma_src_address |= (v << 8); - - break; - - case 0xFF54: - - /* high byte of HDMA source address */ - mmu.hdma_dst_address &= 0xff00; - - /* lower 4 bits are ignored */ - mmu.hdma_dst_address |= (v & 0xf0); - - break; - - case 0xFF53: - - /* low byte of HDMA source address */ - mmu.hdma_dst_address &= 0x00ff; - - /* highet 3 bits are ignored (always 100 binary) */ - mmu.hdma_dst_address |= ((v & 0x1f) | 0x80) << 8; - - break; - - case 0xFF55: - - /* wanna stop HBLANK transfer? a zero on 7th bit will do */ - if ((v & 0x80) == 0 && - mmu.hdma_transfer_mode == 0x01 && - mmu.hdma_to_transfer) - { - mmu.hdma_to_transfer = 0x00; - mmu.hdma_transfer_mode = 0x00; - - return; - } - - /* general (0) or hblank (1) ? */ - mmu.hdma_transfer_mode = ((v & 0x80) ? 1 : 0); - - /* calc how many bytes gotta be transferred */ - uint16_t to_transfer = ((v & 0x7f) + 1) * 0x10; - - /* general must be done immediately */ - if (mmu.hdma_transfer_mode == 0) - { - /* copy right now */ - if (mmu.vram_idx) - memcpy(mmu_addr_vram1() + - (mmu.hdma_dst_address - 0x8000), - &mmu.memory[mmu.hdma_src_address], - to_transfer); - else - memcpy(mmu_addr_vram0() + - (mmu.hdma_dst_address - 0x8000), - &mmu.memory[mmu.hdma_src_address], - to_transfer); - - /* reset to_transfer var */ - mmu.hdma_to_transfer = 0; - - /* move forward src and dst addresses =| */ - mmu.hdma_src_address += to_transfer; - mmu.hdma_dst_address += to_transfer; - } - else - { - mmu.hdma_to_transfer = to_transfer; - - /* check if we're already into hblank phase */ - cycles_hdma(); - } - - break; - } - } - - /* finally set memory byte with data */ - mmu.memory[a] = v; - - /* DMA access */ - if (a == 0xFF46) - { - /* calc source address */ - mmu.dma_address = v * 256; - - /* initialize counter, DMA needs 672 ticks */ - mmu.dma_next = cycles.cnt + 4; // 168 / 2; - } - } - else - mmu.memory[a] = v; -} - -/* write 16 bit block on a memory address */ -void mmu_write_16(uint16_t a, uint16_t v) -{ - mmu.memory[a] = (uint8_t) (v & 0x00ff); - mmu.memory[a + 1] = (uint8_t) (v >> 8); - - /* 16 bit write = +8 cycles */ - cycles_step(); - cycles_step(); -} - - -/* write 16 bit block on a memory address (no cycles affected) */ -void mmu_write_no_cyc(uint16_t a, uint8_t v) -{ - mmu.memory[a] = v; -} diff --git a/waterbox/pizza/lib/mmu.h b/waterbox/pizza/lib/mmu.h deleted file mode 100644 index cc36b8e0cc..0000000000 --- a/waterbox/pizza/lib/mmu.h +++ /dev/null @@ -1,112 +0,0 @@ -/* - - This file is part of Emu-Pizza - - Emu-Pizza is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Emu-Pizza is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Emu-Pizza. If not, see . - -*/ - -#ifndef __MMU_HDR__ -#define __MMU_HDR__ - -#include -#include - -typedef struct mmu_s -{ - /* main 64K of memory */ - uint8_t memory[65536]; - - /* vram in standby */ - uint8_t vram0[0x2000]; - uint8_t vram1[0x2000]; - - /* vram current idx */ - uint8_t vram_idx; - uint8_t spare; - uint16_t spare2; - - // cartridge RAM - uint8_t ram_external_enabled; - uint8_t ram_current_bank; - - /* cartridge type */ - uint8_t carttype; - - /* number of switchable roms */ - uint8_t roms; - - /* current ROM bank */ - uint8_t rom_current_bank; - - /* type of banking */ - uint8_t banking; - - /* working RAM (only CGB) */ - uint8_t wram[0x8000]; - - /* current WRAM bank (only CGB) */ - uint8_t wram_current_bank; - uint8_t spare3; - uint16_t spare4; - - /* DMA transfer stuff */ - uint_fast16_t dma_address; - uint_fast16_t dma_cycles; - - /* HDMA transfer stuff */ - uint16_t hdma_src_address; - uint16_t hdma_dst_address; - uint16_t hdma_to_transfer; - uint8_t hdma_transfer_mode; - uint8_t hdma_current_line; - - /* RTC stuff */ - uint8_t rtc_mode; - int64_t rtc_time; - int64_t rtc_latch_time; - - uint64_t dma_next; -} mmu_t; - -extern mmu_t mmu; - -/* callback function */ -typedef void (*mmu_rumble_cb_t)(uint8_t onoff); - -/* functions prototypes */ -void *mmu_addr(uint16_t a); -void *mmu_addr_vram0(); -void *mmu_addr_vram1(); -void mmu_dump_all(); -void mmu_init(uint8_t c, uint8_t rn); -void mmu_init_ram(uint32_t c); -void mmu_load(uint8_t *data, size_t sz, uint16_t a); -void mmu_load_cartridge(const uint8_t *data, size_t sz); -void mmu_move(uint16_t d, uint16_t s); -uint8_t mmu_read_no_cyc(uint16_t a); -uint8_t mmu_read(uint16_t a); -unsigned int mmu_read_16(uint16_t a); -int mmu_saveram_size(void); -void mmu_restore_saveram(const uint8_t *data, int sz); -void mmu_save_saveram(uint8_t *dest, int sz); -void mmu_restore_rtc(char *fn); -void mmu_save_rtc(char *fn); -void mmu_set_rumble_cb(mmu_rumble_cb_t cb); -void mmu_step(); -void mmu_write_no_cyc(uint16_t a, uint8_t v); -void mmu_write(uint16_t a, uint8_t v); -void mmu_write_16(uint16_t a, uint16_t v); - -#endif diff --git a/waterbox/pizza/lib/serial.c b/waterbox/pizza/lib/serial.c deleted file mode 100644 index 497d8a65c1..0000000000 --- a/waterbox/pizza/lib/serial.c +++ /dev/null @@ -1,192 +0,0 @@ -/* - - This file is part of Emu-Pizza - - Emu-Pizza is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Emu-Pizza is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Emu-Pizza. If not, see . - -*/ - -#include "cycles.h" -#include "interrupt.h" -#include "mmu.h" -#include "serial.h" -#include "utils.h" - -/* main variable */ -serial_t serial; - -/* function to call when frame is ready */ -serial_data_send_cb_t serial_data_send_cb; - -interrupts_flags_t *serial_if; - -/* second message before the first was handled? */ -uint8_t serial_second_set = 0; -uint8_t serial_second_data = 0; -uint8_t serial_second_clock = 0; -uint8_t serial_second_transfer_start = 0; -uint8_t serial_waiting_data = 0; - -void serial_verify_intr() -{ - if (serial.data_recv && serial.data_sent) - { - serial.data_recv = 0; - serial.data_sent = 0; - - /* valid couple of messages for a serial interrupt? */ - if ((serial.data_recv_clock != serial.data_sent_clock) && - serial.data_recv_transfer_start && - serial.data_sent_transfer_start) - { - /* put received data into 0xFF01 (serial.data) */ - /* and notify with an interrupt */ - serial.transfer_start = 0; - serial.data = serial.data_to_recv; - - serial_if->serial_io = 1; - } - - /* a message is already on queue? */ - if (serial_second_set) - { - serial_second_set = 0; - serial.data_recv = 1; - serial.data_to_recv = serial_second_data; - serial.data_recv_clock = serial_second_clock; - serial.data_recv_transfer_start = serial_second_transfer_start; - } - } -} - -void serial_init() -{ - /* pointer to interrupt flags */ - serial_if = mmu_addr(0xFF0F); - - /* init counters */ - serial.bits_sent = 0; - - /* start as not connected */ - serial.peer_connected = 0; -} - -void serial_write_reg(uint16_t a, uint8_t v) -{ - switch (a) - { - case 0xFF01: - serial.data = v; - return; - case 0xFF02: - serial.clock = v & 0x01; - serial.speed = (v & 0x02) ? 0x01 : 0x00; - serial.spare = ((v >> 2) & 0x1F); - serial.transfer_start = (v & 0x80) ? 0x01 : 0x00; - - /* reset? */ - serial.data_sent = 0; - break; - } - - if (serial.transfer_start && - !serial.peer_connected && - serial.clock) - { - if (serial.speed) - serial.next = cycles.cnt + 8 * 8; - else - serial.next = cycles.cnt + 256 * 8; - } -} - -uint8_t serial_read_reg(uint16_t a) -{ - uint8_t v = 0xFF; - - switch (a) - { - case 0xFF01: v = serial.data; break; - case 0xFF02: v = ((serial.clock) ? 0x01 : 0x00) | - ((serial.speed) ? 0x02 : 0x00) | - (serial.spare << 2) | - ((serial.transfer_start) ? 0x80 : 0x00); - } - - return v; -} - -void serial_recv_byte(uint8_t v, uint8_t clock, uint8_t transfer_start) -{ - /* second message during same span time? */ - if (serial.data_recv) - { - /* store it. handle it later */ - serial_second_set = 1; - serial_second_data = v; - serial_second_clock = clock; - serial_second_transfer_start = transfer_start; - return; - } - - /* received side OK */ - serial.data_recv = 1; - serial.data_recv_clock = clock; - serial.data_to_recv = v; - serial.data_recv_transfer_start = transfer_start; - - /* notify main thread in case it's waiting */ - //if (serial_waiting_data) - //pthread_cond_signal(&serial_cond); -} - -void serial_send_byte() -{ - serial.data_sent = 1; - serial.data_to_send = serial.data; - serial.data_sent_clock = serial.clock; - serial.data_sent_transfer_start = serial.transfer_start; - - if (serial_data_send_cb) - (*serial_data_send_cb) (serial.data, serial.clock, - serial.transfer_start); -} - -void serial_set_send_cb(serial_data_send_cb_t cb) -{ - serial_data_send_cb = cb; -} - -void serial_wait_data() -{ - if (serial.data_sent && serial.data_recv == 0) - { - /* wait max 3 seconds */ - //struct timespec wait; - - //wait.tv_sec = time(NULL) + 3; - - /* this is very important to avoid EINVAL return! */ - //wait.tv_nsec = 0; - - /* declare i'm waiting for data */ - //serial_waiting_data = 1; - - /* notify something has arrived */ - // pthread_cond_timedwait(&serial_cond, &serial_mutex, &wait); - - /* not waiting anymore */ - //serial_waiting_data = 0; - } -} diff --git a/waterbox/pizza/lib/serial.h b/waterbox/pizza/lib/serial.h deleted file mode 100644 index d4cfb918eb..0000000000 --- a/waterbox/pizza/lib/serial.h +++ /dev/null @@ -1,92 +0,0 @@ -/* - - This file is part of Emu-Pizza - - Emu-Pizza is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Emu-Pizza is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Emu-Pizza. If not, see . - -*/ - -#ifndef __SERIAL_HDR__ -#define __SERIAL_HDR__ - -#include -#include - -typedef struct serial_ctrl_s -{ - uint8_t clock; - uint8_t speed; - uint8_t spare; - uint8_t transfer_start; -} serial_ctrl_t; - -typedef struct serial_s { - - /* pointer to serial controller register */ - // serial_ctrl_t ctrl; - - uint8_t clock; - uint8_t speed; - uint8_t spare; - uint8_t transfer_start; - - /* pointer to FF01 data */ - uint8_t data; - - /* sent bits */ - uint8_t bits_sent; - - /* data to send */ - uint8_t data_to_send; - - /* peer clock */ - uint8_t data_to_recv; - - /* counter */ - uint64_t next; - - /* peer connected? */ - uint8_t peer_connected:1; - uint8_t data_sent:1; - uint8_t data_sent_clock:1; - uint8_t data_sent_transfer_start:1; - uint8_t data_recv:1; - uint8_t data_recv_clock:1; - uint8_t data_recv_transfer_start:1; - uint8_t spare10:1; - - uint_fast32_t last_send_cnt; - -} serial_t; - -extern serial_t serial; - -/* callback when receive something on serial */ -typedef void (*serial_data_send_cb_t) (uint8_t v, uint8_t clock, - uint8_t transfer_start); - -/* prototypes */ -void serial_init(); -void serial_lock(); -void serial_write_reg(uint16_t a, uint8_t v); -void serial_verify_intr(); -uint8_t serial_read_reg(uint16_t a); -void serial_recv_byte(uint8_t v, uint8_t clock, uint8_t transfer_start); -void serial_recv_clock(); -void serial_send_byte(); -void serial_set_send_cb(serial_data_send_cb_t cb); -void serial_unlock(); -void serial_wait_data(); - -#endif diff --git a/waterbox/pizza/lib/sgb.c b/waterbox/pizza/lib/sgb.c deleted file mode 100644 index 68b516babc..0000000000 --- a/waterbox/pizza/lib/sgb.c +++ /dev/null @@ -1,999 +0,0 @@ -#include "sgb.h" -#include "utils.h" -#include -#include -#include "snes_spc/spc.h" - -const uint8_t iplrom[64] = { - /*ffc0*/ 0xcd, 0xef, //mov x,#$ef - /*ffc2*/ 0xbd, //mov sp,x - /*ffc3*/ 0xe8, 0x00, //mov a,#$00 - /*ffc5*/ 0xc6, //mov (x),a - /*ffc6*/ 0x1d, //dec x - /*ffc7*/ 0xd0, 0xfc, //bne $ffc5 - /*ffc9*/ 0x8f, 0xaa, 0xf4, //mov $f4,#$aa - /*ffcc*/ 0x8f, 0xbb, 0xf5, //mov $f5,#$bb - /*ffcf*/ 0x78, 0xcc, 0xf4, //cmp $f4,#$cc - /*ffd2*/ 0xd0, 0xfb, //bne $ffcf - /*ffd4*/ 0x2f, 0x19, //bra $ffef - /*ffd6*/ 0xeb, 0xf4, //mov y,$f4 - /*ffd8*/ 0xd0, 0xfc, //bne $ffd6 - /*ffda*/ 0x7e, 0xf4, //cmp y,$f4 - /*ffdc*/ 0xd0, 0x0b, //bne $ffe9 - /*ffde*/ 0xe4, 0xf5, //mov a,$f5 - /*ffe0*/ 0xcb, 0xf4, //mov $f4,y - /*ffe2*/ 0xd7, 0x00, //mov ($00)+y,a - /*ffe4*/ 0xfc, //inc y - /*ffe5*/ 0xd0, 0xf3, //bne $ffda - /*ffe7*/ 0xab, 0x01, //inc $01 - /*ffe9*/ 0x10, 0xef, //bpl $ffda - /*ffeb*/ 0x7e, 0xf4, //cmp y,$f4 - /*ffed*/ 0x10, 0xeb, //bpl $ffda - /*ffef*/ 0xba, 0xf6, //movw ya,$f6 - /*fff1*/ 0xda, 0x00, //movw $00,ya - /*fff3*/ 0xba, 0xf4, //movw ya,$f4 - /*fff5*/ 0xc4, 0xf4, //mov $f4,a - /*fff7*/ 0xdd, //mov a,y - /*fff8*/ 0x5d, //mov x,a - /*fff9*/ 0xd0, 0xdb, //bne $ffd6 - /*fffb*/ 0x1f, 0x00, 0x00, //jmp ($0000+x) - /*fffe*/ 0xc0, 0xff //reset vector location ($ffc0) -}; - -// the "reference clock" is tied to the GB cpu. 35112 of these should equal one GB LCD frame. -// it is always increasing and never resets/rebases - -const int refclocks_per_spc_sample = 67; // ~32055hz - -typedef struct -{ - // writes to FF00 - uint64_t last_write_time; // last write time relative to reference clock - uint8_t last_write_value; - - // recv packets - uint8_t read_index; // 0-127, index of the next bit read. if 255, not currently reading - uint8_t packet[16]; // a packet in the process of being formed - - uint8_t command[16 * 7]; // a command in the process of being formed - uint8_t expected_packets; // total number of packets expected for a command - uint8_t next_packet; // index of the next packet to be read - - // joypad reading - uint8_t joypad_index; // index of currently reading joypad - uint8_t num_joypads; // number of currently selected joypads (MLT_REQ) - uint8_t joypad_data[4]; // data for each joypad - uint8_t joypad_has_been_read; // state for advancing joypad_index. extermely weird; logic lifted from VBA and probably wrong - - // palettes - uint32_t palette[8][16]; - uint32_t auxpalette[512][4]; - - // border - uint8_t tiles[256][64]; // tiles stored in packed form - uint16_t tilemap[32 * 32]; - - // frame data - uint8_t frame[160 * 144]; // the most recent obtained full frame - uint32_t frozenframe[256 * 224]; // the most recent saved full frame (MASK_EN) - uint8_t attr[20 * 18]; // current attr map for the GB screen - uint8_t auxattr[45][20 * 18]; // 45 attr files - - // MASK_EN - uint8_t active_mask; // true if mask is currently being used - - // audio - SNES_SPC *spc; - uint64_t frame_start; // when the current audio frame started relative to reference clock - uint32_t clock_remainder; // number of reference clocks not sent to the SPC last frame - uint8_t sound_control[4]; // TODO... - - // transfers - uint32_t waiting_transfer; -#define TRN_NONE 0 -#define TRN_SOUND 1 -#define TRN_PAL 2 -#define TRN_CHR_LOW 3 -#define TRN_CHR_HI 4 -#define TRN_PCT 5 -#define TRN_ATTR 6 - int32_t transfer_countdown; // number of frames until transfer. not entirely accurate -} sgb_t; - -static sgb_t sgb; - -static uint32_t makecol(uint16_t c) -{ - return c >> 7 & 0xf8 | c >> 12 & 0x07 | c << 6 & 0xf800 | c << 1 & 0x0700 | c << 19 & 0xf80000 | c << 14 & 0x070000 | 0xff000000; -} - -static void cmd_trn(uint32_t which) -{ - if ((sgb.command[0] & 7) == 1) - { - if (sgb.waiting_transfer == TRN_NONE) - { - sgb.waiting_transfer = which; - sgb.transfer_countdown = 4; - } - else - { - utils_log("SGB: TRN already queued!\n"); - } - } - else - { - utils_log("SGB: cmd_trn bad length\n"); - } -} - -static void cmd_pal(int a, int b) -{ - if ((sgb.command[0] & 7) == 1) - { - uint32_t c[7]; - for (int i = 0; i < 7; i++) - c[i] = makecol(sgb.command[i * 2 + 1] | sgb.command[i * 2 + 2] << 8); - sgb.palette[0][0] = c[0]; - sgb.palette[1][0] = c[0]; - sgb.palette[2][0] = c[0]; - sgb.palette[3][0] = c[0]; - sgb.palette[a][1] = c[1]; - sgb.palette[a][2] = c[2]; - sgb.palette[a][3] = c[3]; - sgb.palette[b][1] = c[4]; - sgb.palette[b][2] = c[5]; - sgb.palette[b][3] = c[6]; - } - else - { - utils_log("SGB: cmd_pal bad length\n"); - } -} - -static void cmd_pal_set(void) -{ - if ((sgb.command[0] & 7) == 1) - { - int p0 = sgb.command[1] | sgb.command[2] << 8 & 0x100; - for (int i = 0; i < 4; i++) - { - int p = sgb.command[i * 2 + 1] | sgb.command[i * 2 + 2] << 8 & 0x100; - sgb.palette[i][0] = sgb.auxpalette[p0][0]; - sgb.palette[i][1] = sgb.auxpalette[p][1]; - sgb.palette[i][2] = sgb.auxpalette[p][2]; - sgb.palette[i][3] = sgb.auxpalette[p][3]; - } - if (sgb.command[9] & 0x80) // change attribute - { - int attr = sgb.command[9] & 0x3f; - if (attr >= 45) - attr = 44; - memcpy(sgb.attr, sgb.auxattr[attr], sizeof(sgb.attr)); - } - if (sgb.command[9] & 0x40) // cancel mask - { - sgb.active_mask = 0; - } - } - else - { - utils_log("SGB: cmd_pal bad length\n"); - } -} - -static void cmd_attr_blk() -{ - int nset = sgb.command[1]; - if (nset <= 0 || nset >= 19) - { - utils_log("SGB: cmd_attr_blk bad nset\n"); - return; - } - int npacket = (nset * 6 + 16) / 16; - if ((sgb.command[0] & 7) != npacket) - { - utils_log("SGB: cmd_attr_blk bad length\n"); - return; - } - for (int i = 0; i < nset; i++) - { - int ctrl = sgb.command[i * 6 + 2] & 7; - int pals = sgb.command[i * 6 + 3]; - int x1 = sgb.command[i * 6 + 4]; - int y1 = sgb.command[i * 6 + 5]; - int x2 = sgb.command[i * 6 + 6]; - int y2 = sgb.command[i * 6 + 7]; - int inside = ctrl & 1; - int line = ctrl & 2; - int outside = ctrl & 4; - int insidepal = pals & 3; - int linepal = pals >> 2 & 3; - int outsidepal = pals >> 4 & 3; - if (ctrl == 1) - { - ctrl = 3; - linepal = insidepal; - } - else if (ctrl == 4) - { - ctrl = 6; - linepal = outsidepal; - } - uint8_t *dst = sgb.attr; - for (int y = 0; y < 18; y++) - { - for (int x = 0; x < 20; x++) - { - if (outside && (x < x1 || x > x2 || y < y1 || y > y2)) - *dst = outsidepal; - else if (inside && x > x1 && x < x2 && y > y1 && y < y2) - *dst = insidepal; - else if (line) - *dst = linepal; - dst++; - } - } - } -} - -static void cmd_attr_lin() -{ - int nset = sgb.command[1]; - if (nset <= 0 || nset >= 111) - { - utils_log("SGB: cmd_attr_lin bad nset\n"); - return; - } - int npacket = (nset + 17) / 16; - if ((sgb.command[0] & 7) != npacket) - { - utils_log("SGB: cmd_attr_lin bad length\n"); - return; - } - for (int i = 0; i < nset; i++) - { - uint8_t v = sgb.command[i + 2]; - int line = v & 31; - int a = v >> 5 & 3; - if (v & 0x80) // horizontal - { - if (line > 17) - line = 17; - memset(sgb.attr + line * 20, a, 20); - } - else // vertical - { - if (line > 19) - line = 19; - uint8_t *dst = sgb.attr + line; - for (int i = 0; i < 18; i++, dst += 20) - dst[0] = a; - } - } -} - -static void cmd_attr_div() -{ - if ((sgb.command[0] & 7) == 1) - { - uint8_t v = sgb.command[1]; - - int c = v & 3; - int a = v >> 2 & 3; - int b = v >> 4 & 3; - - int pos = sgb.command[2]; - uint8_t *dst = sgb.attr; - if (v & 0x40) // horizontal - { - if (pos > 17) - pos = 17; - int i; - for (i = 0; i < pos; i++, dst += 20) - memset(dst, a, 20); - memset(dst, b, 20); - i++, dst += 20; - for (; i < 18; i++, dst += 20) - memset(dst, c, 20); - } - else // vertical - { - if (pos > 19) - pos = 19; - for (int j = 0; j < 18; j++) - { - int i; - for (i = 0; i < pos; i++) - *dst++ = a; - *dst++ = b; - i++; - for (; i < 20; i++) - *dst++ = c; - } - } - } - else - { - utils_log("SGB: cmd_attr_div bad length\n"); - } -} - -static void cmd_attr_chr() -{ - int x = sgb.command[1]; - int y = sgb.command[2]; - int n = sgb.command[3] | sgb.command[4] << 8; - if (n > 360) - { - utils_log("SGB: cmd_attr_chr bad n\n"); - return; - } - int npacket = (n + 87) / 64; - if ((sgb.command[0] & 7) != npacket) - { - utils_log("SGB: cmd_attr_chr bad length\n"); - return; - } - uint8_t *dst = sgb.attr; - if (x > 19) - x = 19; - if (y > 17) - y = 17; - int vertical = sgb.command[5]; - for (int i = 0; i < 360; i++) - { - uint8_t v = i / 4 + 6; - int a = v >> (2 * (3 - (i & 3))) & 3; - dst[y * 20 + x] = a; - if (vertical) - { - y++; - if (y == 18) - { - y = 0; - x++; - if (x == 20) - return; - } - } - else - { - x++; - if (x == 20) - { - x = 0; - y++; - if (y == 18) - return; - } - } - } -} - -static void cmd_attr_set() -{ - if ((sgb.command[0] & 7) == 1) - { - int attr = sgb.command[1] & 0x3f; - if (attr >= 45) - attr = 44; - memcpy(sgb.attr, sgb.auxattr[attr], sizeof(sgb.attr)); - if (sgb.command[1] & 0x40) - { - sgb.active_mask = 0; - } - } - else - { - utils_log("SGB: cmd_attr_set bad length\n"); - } -} - -static void cmd_mlt_req(void) -{ - if ((sgb.command[0] & 7) == 1) - { - switch (sgb.command[1] & 3) - { - case 0: - case 2: - sgb.num_joypads = 1; - sgb.joypad_index = 0; - break; - case 1: - sgb.num_joypads = 2; - sgb.joypad_index = 1; - break; - case 3: - sgb.num_joypads = 4; - sgb.joypad_index = 1; - break; - } - utils_log("SGB: %u joypads\n", sgb.num_joypads); - } - else - { - utils_log("SGB: cmd_mlt_req bad length\n"); - } -} - -static void cmd_mask(void) -{ - if ((sgb.command[0] & 7) == 1) - { - switch (sgb.command[1] & 3) - { - case 0: - sgb.active_mask = 0; - break; - case 1: - sgb.active_mask = 1; - break; - case 2: - case 3: - sgb.active_mask = 1; - for (int i = 0; i < 256 * 224; i++) - sgb.frozenframe[i] = sgb.palette[0][0]; - break; - } - } - else - { - utils_log("SGB: cmd_mask bad length\n"); - } -} - -static void cmd_sound(void) -{ - if ((sgb.command[0] & 7) == 1) - { - sgb.sound_control[1] = sgb.command[1]; - sgb.sound_control[2] = sgb.command[2]; - sgb.sound_control[3] = sgb.command[3]; - sgb.sound_control[0] = sgb.command[4]; - } - else - { - utils_log("SGB: cmd_sound bad length\n"); - } -} - -static void do_command(void) -{ - const int command = sgb.command[0] >> 3; - switch (command) - { - default: - utils_log("SGB: Unknown or unimplemented command %02xh\n", command); - break; - - case 0x00: // PAL01 - utils_log("SGB: PAL01\n"); - cmd_pal(0, 1); - break; - case 0x01: // PAL23 - utils_log("SGB: PAL23\n"); - cmd_pal(2, 3); - break; - case 0x02: // PAL03 - utils_log("SGB: PAL03\n"); - cmd_pal(0, 3); - break; - case 0x03: // PAL12 - utils_log("SGB: PAL12\n"); - cmd_pal(1, 2); - break; - case 0x0a: // PAL_SET - utils_log("SGB: PAL_SET\n"); - cmd_pal_set(); - break; - - case 0x04: // ATTR_BLK - utils_log("SGB: ATTR_BLK\n"); - cmd_attr_blk(); - break; - case 0x05: // ATTR_LIN - utils_log("SGB: ATTR_LIN\n"); - cmd_attr_lin(); - break; - case 0x06: // ATTR_DIV - utils_log("SGB: ATTR_DIV\n"); - cmd_attr_div(); - break; - case 0x07: // ATTR_CHR - utils_log("SGB: ATTR_CHR\n"); - cmd_attr_chr(); - break; - case 0x16: // ATTR_SET - utils_log("SGB: ATTR_SET\n"); - cmd_attr_set(); - break; - - case 0x17: // MASK_EN - utils_log("SGB: MASK_EN\n"); - cmd_mask(); - break; - - // unknown functions - case 0x0c: // ATRC_EN - utils_log("SGB: ATRC_EN??\n"); - break; - case 0x0d: // TEST_EN - utils_log("SGB: TEST_EN??\n"); - break; - case 0x0e: // ICON_EN - utils_log("SGB: ICON_EN??\n"); - break; - case 0x18: // OBJ_TRN - // no game used this - utils_log("SGB: OBJ_TRN??\n"); - break; - - // unimplementable functions - case 0x0f: // DATA_SND - // TODO: Is it possible for this (and DATA_TRN) to write data to - // memory areas used for the attribute file, etc? - // If so, do games do this? - utils_log("SGB: DATA_SND!! %02x:%02x%02x [%02x]\n", sgb.command[3], sgb.command[2], sgb.command[1], sgb.command[4]); - break; - case 0x10: // DATA_TRN - utils_log("SGB: DATA_TRN!!\n"); - break; - case 0x12: // JUMP - utils_log("SGB: JUMP!!\n"); - break; - - // joypad - case 0x11: // MLT_REQ - utils_log("SGB: MLT_REQ\n"); - cmd_mlt_req(); - break; - - // sound - case 0x08: // SOUND - utils_log("SGB: SOUND %02x %02x %02x %02x\n", sgb.command[1], sgb.command[2], sgb.command[3], sgb.command[4]); - cmd_sound(); - break; - - // all vram transfers - case 0x09: // SOU_TRN - utils_log("SGB: SOU_TRN\n"); - cmd_trn(TRN_SOUND); - break; - case 0x0b: // PAL_TRN - utils_log("SGB: PAL_TRN\n"); - cmd_trn(TRN_PAL); - break; - case 0x13: // CHR_TRN - utils_log("SGB: CHR_TRN\n"); - cmd_trn(sgb.command[1] & 1 ? TRN_CHR_HI : TRN_CHR_LOW); - break; - case 0x14: // PCT_TRN - utils_log("SGB: PCT_TRN\n"); - cmd_trn(TRN_PCT); - break; - case 0x15: // ATTR_TRN - utils_log("SGB: ATTR_TRN\n"); - cmd_trn(TRN_ATTR); - break; - } -} - -static void do_packet(void) -{ - memcpy(sgb.command + sgb.next_packet * 16, sgb.packet, sizeof(sgb.packet)); - sgb.next_packet++; - - if (sgb.expected_packets == 0) // not in the middle of a command - sgb.expected_packets = sgb.command[0] & 7; - - if (sgb.expected_packets == 0) // huh? - { - utils_log("SGB: zero packet command\n"); - sgb.expected_packets = 0; - sgb.next_packet = 0; - } - else if (sgb.next_packet == sgb.expected_packets) - { - do_command(); - sgb.expected_packets = 0; - sgb.next_packet = 0; - } -} - -int sgb_init(const uint8_t *spc, int length) -{ - memset(&sgb, 0, sizeof(sgb)); - sgb.read_index = 255; - sgb.num_joypads = 1; - sgb.palette[0][0] = 0xffffffff; - sgb.palette[0][1] = 0xffaaaaaa; - sgb.palette[0][2] = 0xff555555; - sgb.palette[0][3] = 0xff000000; - - sgb.spc = spc_new(); - spc_init_rom(sgb.spc, iplrom); - spc_reset(sgb.spc); - if (spc_load_spc(sgb.spc, spc, length) != NULL) - { - utils_log("SGB: Failed to load SPC\n"); - return 0; - } - - return 1; -} - -void sgb_write_ff00(uint8_t val, uint64_t time) -{ - val &= 0x30; - - //utils_log("ZZ: %02x, %llu", val, time); - const int p14_fell = (val & 0x10) < (sgb.last_write_value & 0x10); - const int p15_fell = (val & 0x20) < (sgb.last_write_value & 0x20); - const int p14_rose = (val & 0x10) > (sgb.last_write_value & 0x10); - const int p15_rose = (val & 0x20) > (sgb.last_write_value & 0x20); - - if (val == 0) // reset command processing - { - sgb.read_index = 0; - memset(sgb.packet, 0, sizeof(sgb.packet)); - } - else if (sgb.read_index != 255) // currently reading a packet - { - if (p14_fell || p15_fell) - { - if (sgb.read_index == 128) // end of packet - { - if (p14_fell) - do_packet(); - else - utils_log("SGB: Stop bit not present\n"); - sgb.read_index = 255; - } - else - { - if (p15_fell) - { - int byte = sgb.read_index >> 3; - int bit = sgb.read_index & 7; - sgb.packet[byte] |= 1 << bit; - } - sgb.read_index++; - } - } - } - else // joypad processing - { - if (val == 0x10) - sgb.joypad_has_been_read |= 2; // reading P15 - if (val == 0x20) - sgb.joypad_has_been_read |= 1; // reading P14 - if (val == 0x30 && (p14_rose || p15_rose)) - { - if (sgb.joypad_has_been_read == 7) - { - sgb.joypad_has_been_read = 0; - sgb.joypad_index++; - sgb.joypad_index &= sgb.num_joypads - 1; - //utils_log("SGB: joypad index to %u", sgb.joypad_index); - } - else - { - sgb.joypad_has_been_read &= 3; // the other line must be asserted and a read must happen before joypad_index inc?? - } - } - } - - sgb.last_write_value = val; - sgb.last_write_time = time; -} - -uint8_t sgb_read_ff00(uint64_t time) -{ - uint8_t ret = sgb.last_write_value & 0xf0 | 0xc0; - const int p14 = !(ret & 0x10); - const int p15 = !(ret & 0x20); - const int ji = sgb.joypad_index; - - // TODO: is this "reset" correct? - sgb.joypad_has_been_read |= 4; // read occured - sgb.read_index = 255; - sgb.next_packet = 0; - sgb.expected_packets = 0; - - if (!p14 && !p15) - { - //utils_log("SGB: SCAN%u", ji); - // scan id - return ret | (15 - ji); - } - else - { - // get data - const uint8_t j = sgb.joypad_data[ji]; - if (p14) - ret |= j >> 4; - if (p15) - ret |= j & 0x0f; - //utils_log("SGB: READ%u %02x", ji, ret ^ 0x0f); - return ret ^ 0x0f; - } -} - -// for each of 4 joypads: -// 7......0 -// DULRSsBA -void sgb_set_controller_data(const uint8_t *buttons) -{ - memcpy(sgb.joypad_data, buttons, sizeof(sgb.joypad_data)); -} - -static void trn_sound(const uint8_t* data) -{ - int len = data[0] | data[1] << 8; - int addr = data[2] | data[3] << 8; - utils_log("TRN_SOUND %04x %04x\n", addr, len); - uint8_t* dst = spc_get_ram(sgb.spc); - - if (len > 0xffc) - { - utils_log("TRN_SOUND src overflow\n"); - return; - } - if (len + addr >= 0x10000) - { - utils_log("TRN_SOUND dst overflow\n"); - return; - } - memcpy(dst + addr, data + 4, len); -} - -static void trn_pal(const uint8_t *data) -{ - const uint16_t *src = (const uint16_t *)data; - uint32_t *dst = sgb.auxpalette[0]; - for (int i = 0; i < 2048; i++) - dst[i] = makecol(src[i]); -} - -static void trn_attr(const uint8_t *data) -{ - uint8_t *dst = sgb.auxattr[0]; - for (int n = 0; n < 45 * 90; n++) - { - uint8_t s = *data++; - *dst++ = s >> 6 & 3; - *dst++ = s >> 4 & 3; - *dst++ = s >> 2 & 3; - *dst++ = s >> 0 & 3; - } -} - -static void trn_pct(const uint8_t *data) -{ - memcpy(sgb.tilemap, data, sizeof(sgb.tilemap)); - const uint16_t *palettes = (const uint16_t *)(data + sizeof(sgb.tilemap)); - uint32_t *dst = sgb.palette[4]; - for (int i = 0; i < 64; i++) - dst[i] = makecol(palettes[i]); -} - -static void trn_chr(const uint8_t *data, int bank) -{ - uint8_t *dst = sgb.tiles[128 * bank]; - for (int n = 0; n < 128; n++) - { - for (int y = 0; y < 8; y++) - { - int a = data[0]; - int b = data[1] << 1; - int c = data[16] << 2; - int d = data[17] << 3; - for (int x = 7; x >= 0; x--) - { - dst[x] = a & 1 | b & 2 | c & 4 | d & 8; - a >>= 1; - b >>= 1; - c >>= 1; - d >>= 1; - } - dst += 8; - data += 2; - } - data += 16; - } -} - -static void do_vram_transfer(void) -{ - uint8_t vram[4096]; - for (int tilenum = 0; tilenum < 256; tilenum++) - { - const int ty = tilenum / 20; - const int tx = tilenum % 20; - const uint8_t *src = sgb.frame + ty * 8 * 160 + tx * 8; - uint8_t *dst = vram + 16 * tilenum; - for (int j = 0; j < 8; j++) - { - uint32_t a = 0, b = 0; - a |= (src[7] & 1) << 0; - a |= (src[6] & 1) << 1; - a |= (src[5] & 1) << 2; - a |= (src[4] & 1) << 3; - a |= (src[3] & 1) << 4; - a |= (src[2] & 1) << 5; - a |= (src[1] & 1) << 6; - a |= (src[0] & 1) << 7; - - b |= (src[7] & 2) >> 1; - b |= (src[6] & 2) << 0; - b |= (src[5] & 2) << 1; - b |= (src[4] & 2) << 2; - b |= (src[3] & 2) << 3; - b |= (src[2] & 2) << 4; - b |= (src[1] & 2) << 5; - b |= (src[0] & 2) << 6; - *dst++ = a; - *dst++ = b; - src += 160; - } - } - - switch (sgb.waiting_transfer) - { - case TRN_SOUND: - trn_sound(vram); - break; - case TRN_PAL: - trn_pal(vram); - break; - case TRN_CHR_LOW: - trn_chr(vram, 0); - break; - case TRN_CHR_HI: - trn_chr(vram, 1); - break; - case TRN_PCT: - trn_pct(vram); - break; - case TRN_ATTR: - trn_attr(vram); - break; - } -} - -static void sgb_render_frame_gb(uint32_t *vbuff) -{ - const uint8_t *attr = sgb.attr; - const uint8_t *src = sgb.frame; - uint32_t *dst = vbuff + ((224 - 144) / 2 * 256 + (256 - 160) / 2); - - for (int j = 0; j < 144; j++) - { - const uint8_t *attr_line = attr + j / 8 * 20; - for (int i = 0; i < 160; i++) - { - const int attr_index = i / 8; - *dst++ = sgb.palette[attr_line[attr_index]][*src++]; - } - dst += 256 - 160; - } -} - -static void draw_tile(uint16_t entry, uint32_t *dest) -{ - const uint8_t *tile = sgb.tiles[entry & 0xff]; - const uint32_t *palette = sgb.palette[entry >> 10 & 7]; - int hflip = entry & 0x4000; - int vflip = entry & 0x8000; - int hinc, vinc; - if (hflip) - { - hinc = -1; - dest += 7; - } - else - { - hinc = 1; - } - if (vflip) - { - vinc = -256; - dest += 7 * 256; - } - else - { - vinc = 256; - } - vinc -= 8 * hinc; - for (int y = 0; y < 8; y++, dest += vinc) - { - for (int x = 0; x < 8; x++, dest += hinc) - { - int c = *tile++; - if (c) - *dest = palette[c]; - } - } -} - -static void sgb_render_border(uint32_t *vbuff) -{ - const uint16_t *tilemap = sgb.tilemap; - for (int n = 0; n < 32 * 28; n++) - { - draw_tile(*tilemap++, vbuff); - vbuff += 8; - if ((n & 31) == 31) - vbuff += 256 * 7; - } -} - -// 160x144 32bpp pixel data -// assumed to contain exact pixel values 00, 55, aa, ff -void sgb_take_frame(uint32_t *vbuff) -{ - for (int i = 0; i < 160 * 144; i++) - { - sgb.frame[i] = 3 - (vbuff[i] >> 6 & 3); // 0, 1, 2, or 3 for each pixel - } - if (sgb.waiting_transfer != TRN_NONE) - { - if (!--sgb.transfer_countdown) - { - do_vram_transfer(); - sgb.waiting_transfer = TRN_NONE; - } - } - if (!sgb.active_mask) - { - // render the frame now - for (int i = 0; i < 256 * 224; i++) - sgb.frozenframe[i] = sgb.palette[0][0]; - sgb_render_frame_gb(sgb.frozenframe); - sgb_render_border(sgb.frozenframe); - } -} - -void sgb_render_frame(uint32_t *vbuff) -{ - memcpy(vbuff, sgb.frozenframe, sizeof(sgb.frozenframe)); -} - -void sgb_render_audio(uint64_t time, void (*callback)(int16_t l, int16_t r, uint64_t time)) -{ - int16_t sound_buffer[4096]; - uint32_t diff = time - sgb.frame_start + sgb.clock_remainder; - //utils_log("%ul", diff); - - uint32_t samples = diff / refclocks_per_spc_sample; - uint32_t new_remainder = diff % refclocks_per_spc_sample; - - spc_set_output(sgb.spc, sound_buffer, sizeof(sound_buffer) / sizeof(sound_buffer[0])); - int p; - for (p = 0; p < 4; p++) - { - if (spc_read_port(sgb.spc, 0, p) != sgb.sound_control[p]) - break; - } - if (p == 4) // recived - { - sgb.sound_control[0] = 0; - sgb.sound_control[1] = 0; - sgb.sound_control[2] = 0; - } - for (p = 0; p < 4; p++) - { - spc_write_port(sgb.spc, 0, p, sgb.sound_control[p]); - } - - spc_end_frame(sgb.spc, samples * 32); - - uint64_t t = sgb.frame_start + refclocks_per_spc_sample - sgb.clock_remainder; - for (int i = 0; i < samples; i++, t += refclocks_per_spc_sample) - callback(sound_buffer[i * 2], sound_buffer[i * 2] + 1, t); - - sgb.frame_start = time; - sgb.clock_remainder = new_remainder; -} diff --git a/waterbox/pizza/lib/sgb.h b/waterbox/pizza/lib/sgb.h deleted file mode 100644 index 35e76dcad9..0000000000 --- a/waterbox/pizza/lib/sgb.h +++ /dev/null @@ -1,36 +0,0 @@ -#pragma once -#include - -// whenever a time is asked for, it is relative to a clock that ticks 35112 times -// per nominal frame on the GB lcd, starts at 0 when emulation begins, and never resets/rebases - -// write to MMIO ff00. only bits 4 and 5 are used -void sgb_write_ff00(uint8_t val, uint64_t time); - -// read from MMIO ff00. supplies data for all 8 bits -uint8_t sgb_read_ff00(uint64_t time); - -// set controller data to be used by subsequent controller reads -// buttons[0] = controller 1, buttons[3] = controller 4 -// 7......0 -// DULRSsBA -void sgb_set_controller_data(const uint8_t* buttons); - -// initialize the SGB module. pass an SPC file that results from the real S-CPU initialization, -// and the length of that file -int sgb_init(const uint8_t* spc, int length); - -// call whenever the gameboy has finished producing a video frame -// data is 32bpp 160x144 screen data. for each pixel: -//31 7 0 -// xxxxxxxx xxxxxxxx xxxxxxxx DDxxxxxx -- DD = 0, 1, 2, or 3. x = don't care -void sgb_take_frame(uint32_t* vbuff); - -// copy the finished video frame to an output buffer. pixel format is 32bpp xrgb -// can be called at any time, including right after sgb_take_frame -void sgb_render_frame(uint32_t* vbuff); - -// call to finish a frame's worth of audio. should be called once every 35112 time units (some jitter is OK) -// callback will be called with L and R sample values for various time points -// between the last time sgb_render_audio was called and now -void sgb_render_audio(uint64_t time, void(*callback)(int16_t l, int16_t r, uint64_t time)); diff --git a/waterbox/pizza/lib/snes_spc/SNES_SPC.cpp b/waterbox/pizza/lib/snes_spc/SNES_SPC.cpp deleted file mode 100644 index fb3b147ae8..0000000000 --- a/waterbox/pizza/lib/snes_spc/SNES_SPC.cpp +++ /dev/null @@ -1,564 +0,0 @@ -// Core SPC emulation: CPU, timers, SMP registers, memory - -// snes_spc 0.9.0. http://www.slack.net/~ant/ - -#include "SNES_SPC.h" - -#include - -/* Copyright (C) 2004-2007 Shay Green. This module is free software; you -can redistribute it and/or modify it under the terms of the GNU Lesser -General Public License as published by the Free Software Foundation; either -version 2.1 of the License, or (at your option) any later version. This -module is distributed in the hope that it will be useful, but WITHOUT ANY -WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more -details. You should have received a copy of the GNU Lesser General Public -License along with this module; if not, write to the Free Software Foundation, -Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ - -#include "blargg_source.h" - -#define RAM (m.ram.ram) -#define REGS (m.smp_regs [0]) -#define REGS_IN (m.smp_regs [1]) - -// (n ? n : 256) -#define IF_0_THEN_256( n ) ((uint8_t) ((n) - 1) + 1) - -// Note: SPC_MORE_ACCURACY exists mainly so I can run my validation tests, which -// do crazy echo buffer accesses. -#ifndef SPC_MORE_ACCURACY - #define SPC_MORE_ACCURACY 0 -#endif - -#ifdef BLARGG_ENABLE_OPTIMIZER - #include BLARGG_ENABLE_OPTIMIZER -#endif - - -//// Timers - -#if SPC_DISABLE_TEMPO - #define TIMER_DIV( t, n ) ((n) >> t->prescaler) - #define TIMER_MUL( t, n ) ((n) << t->prescaler) -#else - #define TIMER_DIV( t, n ) ((n) / t->prescaler) - #define TIMER_MUL( t, n ) ((n) * t->prescaler) -#endif - -SNES_SPC::Timer* SNES_SPC::run_timer_( Timer* t, rel_time_t time ) -{ - int elapsed = TIMER_DIV( t, time - t->next_time ) + 1; - t->next_time += TIMER_MUL( t, elapsed ); - - if ( t->enabled ) - { - int remain = IF_0_THEN_256( t->period - t->divider ); - int divider = t->divider + elapsed; - int over = elapsed - remain; - if ( over >= 0 ) - { - int n = over / t->period; - t->counter = (t->counter + 1 + n) & 0x0F; - divider = over - n * t->period; - } - t->divider = (uint8_t) divider; - } - return t; -} - -inline SNES_SPC::Timer* SNES_SPC::run_timer( Timer* t, rel_time_t time ) -{ - if ( time >= t->next_time ) - t = run_timer_( t, time ); - return t; -} - - -//// ROM - -void SNES_SPC::enable_rom( int enable ) -{ - if ( m.rom_enabled != enable ) - { - m.rom_enabled = enable; - if ( enable ) - memcpy( m.hi_ram, &RAM [rom_addr], sizeof m.hi_ram ); - memcpy( &RAM [rom_addr], (enable ? m.rom : m.hi_ram), rom_size ); - // TODO: ROM can still get overwritten when DSP writes to echo buffer - } -} - - -//// DSP - -#if SPC_LESS_ACCURATE - int const max_reg_time = 29; - - signed char const SNES_SPC::reg_times_ [256] = - { - -1, 0,-11,-10,-15,-11, -2, -2, 4, 3, 14, 14, 26, 26, 14, 22, - 2, 3, 0, 1,-12, 0, 1, 1, 7, 6, 14, 14, 27, 14, 14, 23, - 5, 6, 3, 4, -1, 3, 4, 4, 10, 9, 14, 14, 26, -5, 14, 23, - 8, 9, 6, 7, 2, 6, 7, 7, 13, 12, 14, 14, 27, -4, 14, 24, - 11, 12, 9, 10, 5, 9, 10, 10, 16, 15, 14, 14, -2, -4, 14, 24, - 14, 15, 12, 13, 8, 12, 13, 13, 19, 18, 14, 14, -2,-36, 14, 24, - 17, 18, 15, 16, 11, 15, 16, 16, 22, 21, 14, 14, 28, -3, 14, 25, - 20, 21, 18, 19, 14, 18, 19, 19, 25, 24, 14, 14, 14, 29, 14, 25, - - 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, - 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, - 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, - 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, - 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, - 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, - 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, - 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, - }; - - #define RUN_DSP( time, offset ) \ - int count = (time) - (offset) - m.dsp_time;\ - if ( count >= 0 )\ - {\ - int clock_count = (count & ~(clocks_per_sample - 1)) + clocks_per_sample;\ - m.dsp_time += clock_count;\ - dsp.run( clock_count );\ - } -#else - #define RUN_DSP( time, offset ) \ - {\ - int count = (time) - m.dsp_time;\ - if ( !SPC_MORE_ACCURACY || count )\ - {\ - assert( count > 0 );\ - m.dsp_time = (time);\ - dsp.run( count );\ - }\ - } -#endif - -int SNES_SPC::dsp_read( rel_time_t time ) -{ - RUN_DSP( time, reg_times [REGS [r_dspaddr] & 0x7F] ); - - int result = dsp.read( REGS [r_dspaddr] & 0x7F ); - - #ifdef SPC_DSP_READ_HOOK - SPC_DSP_READ_HOOK( spc_time + time, (REGS [r_dspaddr] & 0x7F), result ); - #endif - - return result; -} - -inline void SNES_SPC::dsp_write( int data, rel_time_t time ) -{ - RUN_DSP( time, reg_times [REGS [r_dspaddr]] ) - #if SPC_LESS_ACCURATE - else if ( m.dsp_time == skipping_time ) - { - int r = REGS [r_dspaddr]; - if ( r == SPC_DSP::r_kon ) - m.skipped_kon |= data & ~dsp.read( SPC_DSP::r_koff ); - - if ( r == SPC_DSP::r_koff ) - { - m.skipped_koff |= data; - m.skipped_kon &= ~data; - } - } - #endif - - #ifdef SPC_DSP_WRITE_HOOK - SPC_DSP_WRITE_HOOK( m.spc_time + time, REGS [r_dspaddr], (uint8_t) data ); - #endif - - if ( REGS [r_dspaddr] <= 0x7F ) - dsp.write( REGS [r_dspaddr], data ); - else if ( !SPC_MORE_ACCURACY ) - dprintf( "SPC wrote to DSP register > $7F\n" ); -} - - -//// Memory access extras - -#if SPC_MORE_ACCURACY - #define MEM_ACCESS( time, addr ) \ - {\ - if ( time >= m.dsp_time )\ - {\ - RUN_DSP( time, max_reg_time );\ - }\ - } -#elif !defined (NDEBUG) - // Debug-only check for read/write within echo buffer, since this might result in - // inaccurate emulation due to the DSP not being caught up to the present. - - bool SNES_SPC::check_echo_access( int addr ) - { - if ( !(dsp.read( SPC_DSP::r_flg ) & 0x20) ) - { - int start = 0x100 * dsp.read( SPC_DSP::r_esa ); - int size = 0x800 * (dsp.read( SPC_DSP::r_edl ) & 0x0F); - int end = start + (size ? size : 4); - if ( start <= addr && addr < end ) - { - if ( !m.echo_accessed ) - { - m.echo_accessed = 1; - return true; - } - } - } - return false; - } - - #define MEM_ACCESS( time, addr ) check( !check_echo_access( (uint16_t) addr ) ); -#else - #define MEM_ACCESS( time, addr ) -#endif - - -//// CPU write - -#if SPC_MORE_ACCURACY -static unsigned char const glitch_probs [3] [256] = -{ - 0xC3,0x92,0x5B,0x1C,0xD1,0x92,0x5B,0x1C,0xDB,0x9C,0x72,0x18,0xCD,0x5C,0x38,0x0B, - 0xE1,0x9C,0x74,0x17,0xCF,0x75,0x45,0x0C,0xCF,0x6E,0x4A,0x0D,0xA3,0x3A,0x1D,0x08, - 0xDB,0xA0,0x82,0x19,0xD9,0x73,0x3C,0x0E,0xCB,0x76,0x52,0x0B,0xA5,0x46,0x1D,0x09, - 0xDA,0x74,0x55,0x0F,0xA2,0x3F,0x21,0x05,0x9A,0x40,0x20,0x07,0x63,0x1E,0x10,0x01, - 0xDF,0xA9,0x85,0x1D,0xD3,0x84,0x4B,0x0E,0xCF,0x6F,0x49,0x0F,0xB3,0x48,0x1E,0x05, - 0xD8,0x77,0x52,0x12,0xB7,0x49,0x23,0x06,0xAA,0x45,0x28,0x07,0x7D,0x28,0x0F,0x07, - 0xCC,0x7B,0x4A,0x0E,0xB2,0x4F,0x24,0x07,0xAD,0x43,0x2C,0x06,0x86,0x29,0x11,0x07, - 0xAE,0x48,0x1F,0x0A,0x76,0x21,0x19,0x05,0x76,0x21,0x14,0x05,0x44,0x11,0x0B,0x01, - 0xE7,0xAD,0x96,0x23,0xDC,0x86,0x59,0x0E,0xDC,0x7C,0x5F,0x15,0xBB,0x53,0x2E,0x09, - 0xD6,0x7C,0x4A,0x16,0xBB,0x4A,0x25,0x08,0xB3,0x4F,0x28,0x0B,0x8E,0x23,0x15,0x08, - 0xCF,0x7F,0x57,0x11,0xB5,0x4A,0x23,0x0A,0xAA,0x42,0x28,0x05,0x7D,0x22,0x12,0x03, - 0xA6,0x49,0x28,0x09,0x82,0x2B,0x0D,0x04,0x7A,0x20,0x0F,0x04,0x3D,0x0F,0x09,0x03, - 0xD1,0x7C,0x4C,0x0F,0xAF,0x4E,0x21,0x09,0xA8,0x46,0x2A,0x07,0x85,0x1F,0x0E,0x07, - 0xA6,0x3F,0x26,0x07,0x7C,0x24,0x14,0x07,0x78,0x22,0x16,0x04,0x46,0x12,0x0A,0x02, - 0xA6,0x41,0x2C,0x0A,0x7E,0x28,0x11,0x05,0x73,0x1B,0x14,0x05,0x3D,0x11,0x0A,0x02, - 0x70,0x22,0x17,0x05,0x48,0x13,0x08,0x03,0x3C,0x07,0x0D,0x07,0x26,0x07,0x06,0x01, - - 0xE0,0x9F,0xDA,0x7C,0x4F,0x18,0x28,0x0D,0xE9,0x9F,0xDA,0x7C,0x4F,0x18,0x1F,0x07, - 0xE6,0x97,0xD8,0x72,0x64,0x13,0x26,0x09,0xDC,0x67,0xA9,0x38,0x21,0x07,0x15,0x06, - 0xE9,0x91,0xD2,0x6B,0x63,0x14,0x2B,0x0E,0xD6,0x61,0xB7,0x41,0x2B,0x0E,0x10,0x09, - 0xCF,0x59,0xB0,0x2F,0x35,0x08,0x0F,0x07,0xB6,0x30,0x7A,0x21,0x17,0x07,0x09,0x03, - 0xE7,0xA3,0xE5,0x6B,0x65,0x1F,0x34,0x09,0xD8,0x6B,0xBE,0x45,0x27,0x07,0x10,0x07, - 0xDA,0x54,0xB1,0x39,0x2E,0x0E,0x17,0x08,0xA9,0x3C,0x86,0x22,0x16,0x06,0x07,0x03, - 0xD4,0x51,0xBC,0x3D,0x38,0x0A,0x13,0x06,0xB2,0x37,0x79,0x1C,0x17,0x05,0x0E,0x06, - 0xA7,0x31,0x74,0x1C,0x11,0x06,0x0C,0x02,0x6D,0x1A,0x38,0x10,0x0B,0x05,0x06,0x03, - 0xEB,0x9A,0xE1,0x7A,0x6F,0x13,0x34,0x0E,0xE6,0x75,0xC5,0x45,0x3E,0x0B,0x1A,0x05, - 0xD8,0x63,0xC1,0x40,0x3C,0x1B,0x19,0x06,0xB3,0x42,0x83,0x29,0x18,0x0A,0x08,0x04, - 0xD4,0x58,0xBA,0x43,0x3F,0x0A,0x1F,0x09,0xB1,0x33,0x8A,0x1F,0x1F,0x06,0x0D,0x05, - 0xAF,0x3C,0x7A,0x1F,0x16,0x08,0x0A,0x01,0x72,0x1B,0x52,0x0D,0x0B,0x09,0x06,0x01, - 0xCF,0x63,0xB7,0x47,0x40,0x10,0x14,0x06,0xC0,0x41,0x96,0x20,0x1C,0x09,0x10,0x05, - 0xA6,0x35,0x82,0x1A,0x20,0x0C,0x0E,0x04,0x80,0x1F,0x53,0x0F,0x0B,0x02,0x06,0x01, - 0xA6,0x31,0x81,0x1B,0x1D,0x01,0x08,0x08,0x7B,0x20,0x4D,0x19,0x0E,0x05,0x07,0x03, - 0x6B,0x17,0x49,0x07,0x0E,0x03,0x0A,0x05,0x37,0x0B,0x1F,0x06,0x04,0x02,0x07,0x01, - - 0xF0,0xD6,0xED,0xAD,0xEC,0xB1,0xEB,0x79,0xAC,0x22,0x47,0x1E,0x6E,0x1B,0x32,0x0A, - 0xF0,0xD6,0xEA,0xA4,0xED,0xC4,0xDE,0x82,0x98,0x1F,0x50,0x13,0x52,0x15,0x2A,0x0A, - 0xF1,0xD1,0xEB,0xA2,0xEB,0xB7,0xD8,0x69,0xA2,0x1F,0x5B,0x18,0x55,0x18,0x2C,0x0A, - 0xED,0xB5,0xDE,0x7E,0xE6,0x85,0xD3,0x59,0x59,0x0F,0x2C,0x09,0x24,0x07,0x15,0x09, - 0xF1,0xD6,0xEA,0xA0,0xEC,0xBB,0xDA,0x77,0xA9,0x23,0x58,0x14,0x5D,0x12,0x2F,0x09, - 0xF1,0xC1,0xE3,0x86,0xE4,0x87,0xD2,0x4E,0x68,0x15,0x26,0x0B,0x27,0x09,0x15,0x02, - 0xEE,0xA6,0xE0,0x5C,0xE0,0x77,0xC3,0x41,0x67,0x1B,0x3C,0x07,0x2A,0x06,0x19,0x07, - 0xE4,0x75,0xC6,0x43,0xCC,0x50,0x95,0x23,0x35,0x09,0x14,0x04,0x15,0x05,0x0B,0x04, - 0xEE,0xD6,0xED,0xAD,0xEC,0xB1,0xEB,0x79,0xAC,0x22,0x56,0x14,0x5A,0x12,0x26,0x0A, - 0xEE,0xBB,0xE7,0x7E,0xE9,0x8D,0xCB,0x49,0x67,0x11,0x34,0x07,0x2B,0x0B,0x14,0x07, - 0xED,0xA7,0xE5,0x76,0xE3,0x7E,0xC4,0x4B,0x77,0x14,0x34,0x08,0x27,0x07,0x14,0x04, - 0xE7,0x8B,0xD2,0x4C,0xCA,0x56,0x9E,0x31,0x36,0x0C,0x11,0x07,0x14,0x04,0x0A,0x02, - 0xF0,0x9B,0xEA,0x6F,0xE5,0x81,0xC4,0x43,0x74,0x10,0x30,0x0B,0x2D,0x08,0x1B,0x06, - 0xE6,0x83,0xCA,0x48,0xD9,0x56,0xA7,0x23,0x3B,0x09,0x12,0x09,0x15,0x07,0x0A,0x03, - 0xE5,0x5F,0xCB,0x3C,0xCF,0x48,0x91,0x22,0x31,0x0A,0x17,0x08,0x15,0x04,0x0D,0x02, - 0xD1,0x43,0x91,0x20,0xA9,0x2D,0x54,0x12,0x17,0x07,0x09,0x02,0x0C,0x04,0x05,0x03, -}; -#endif - -// divided into multiple functions to keep rarely-used functionality separate -// so often-used functionality can be optimized better by compiler - -// If write isn't preceded by read, data has this added to it -int const no_read_before_write = 0x2000; - -void SNES_SPC::cpu_write_smp_reg_( int data, rel_time_t time, int addr ) -{ - switch ( addr ) - { - case r_t0target: - case r_t1target: - case r_t2target: { - Timer* t = &m.timers [addr - r_t0target]; - int period = IF_0_THEN_256( data ); - if ( t->period != period ) - { - t = run_timer( t, time ); - #if SPC_MORE_ACCURACY - // Insane behavior when target is written just after counter is - // clocked and counter matches new period and new period isn't 1, 2, 4, or 8 - if ( t->divider == (period & 0xFF) && - t->next_time == time + TIMER_MUL( t, 1 ) && - ((period - 1) | ~0x0F) & period ) - { - //dprintf( "SPC pathological timer target write\n" ); - - // If the period is 3, 5, or 9, there's a probability this behavior won't occur, - // based on the previous period - int prob = 0xFF; - int old_period = t->period & 0xFF; - if ( period == 3 ) prob = glitch_probs [0] [old_period]; - if ( period == 5 ) prob = glitch_probs [1] [old_period]; - if ( period == 9 ) prob = glitch_probs [2] [old_period]; - - // The glitch suppresses incrementing of one of the counter bits, based on - // the lowest set bit in the new period - int b = 1; - while ( !(period & b) ) - b <<= 1; - - if ( (rand() >> 4 & 0xFF) <= prob ) - t->divider = (t->divider - b) & 0xFF; - } - #endif - t->period = period; - } - break; - } - - case r_t0out: - case r_t1out: - case r_t2out: - if ( !SPC_MORE_ACCURACY ) - dprintf( "SPC wrote to counter %d\n", (int) addr - r_t0out ); - - if ( data < no_read_before_write / 2 ) - run_timer( &m.timers [addr - r_t0out], time - 1 )->counter = 0; - break; - - // Registers that act like RAM - case 0x8: - case 0x9: - REGS_IN [addr] = (uint8_t) data; - break; - - case r_test: - if ( (uint8_t) data != 0x0A ) - dprintf( "SPC wrote to test register\n" ); - break; - - case r_control: - // port clears - if ( data & 0x10 ) - { - REGS_IN [r_cpuio0] = 0; - REGS_IN [r_cpuio1] = 0; - } - if ( data & 0x20 ) - { - REGS_IN [r_cpuio2] = 0; - REGS_IN [r_cpuio3] = 0; - } - - // timers - { - for ( int i = 0; i < timer_count; i++ ) - { - Timer* t = &m.timers [i]; - int enabled = data >> i & 1; - if ( t->enabled != enabled ) - { - t = run_timer( t, time ); - t->enabled = enabled; - if ( enabled ) - { - t->divider = 0; - t->counter = 0; - } - } - } - } - enable_rom( data & 0x80 ); - break; - } -} - -void SNES_SPC::cpu_write_smp_reg( int data, rel_time_t time, int addr ) -{ - if ( addr == r_dspdata ) // 99% - dsp_write( data, time ); - else - cpu_write_smp_reg_( data, time, addr ); -} - -void SNES_SPC::cpu_write_high( int data, int i, rel_time_t time ) -{ - if ( i < rom_size ) - { - m.hi_ram [i] = (uint8_t) data; - if ( m.rom_enabled ) - RAM [i + rom_addr] = m.rom [i]; // restore overwritten ROM - } - else - { - assert( RAM [i + rom_addr] == (uint8_t) data ); - RAM [i + rom_addr] = cpu_pad_fill; // restore overwritten padding - cpu_write( data, i + rom_addr - 0x10000, time ); - } -} - -int const bits_in_int = CHAR_BIT * sizeof (int); - -void SNES_SPC::cpu_write( int data, int addr, rel_time_t time ) -{ - MEM_ACCESS( time, addr ) - - // RAM - RAM [addr] = (uint8_t) data; - int reg = addr - 0xF0; - if ( reg >= 0 ) // 64% - { - // $F0-$FF - if ( reg < reg_count ) // 87% - { - REGS [reg] = (uint8_t) data; - - // Ports - #ifdef SPC_PORT_WRITE_HOOK - if ( (unsigned) (reg - r_cpuio0) < port_count ) - SPC_PORT_WRITE_HOOK( m.spc_time + time, (reg - r_cpuio0), - (uint8_t) data, ®S [r_cpuio0] ); - #endif - - // Registers other than $F2 and $F4-$F7 - //if ( reg != 2 && reg != 4 && reg != 5 && reg != 6 && reg != 7 ) - // TODO: this is a bit on the fragile side - if ( ((~0x2F00 << (bits_in_int - 16)) << reg) < 0 ) // 36% - cpu_write_smp_reg( data, time, reg ); - } - // High mem/address wrap-around - else - { - reg -= rom_addr - 0xF0; - if ( reg >= 0 ) // 1% in IPL ROM area or address wrapped around - cpu_write_high( data, reg, time ); - } - } -} - - -//// CPU read - -inline int SNES_SPC::cpu_read_smp_reg( int reg, rel_time_t time ) -{ - int result = REGS_IN [reg]; - reg -= r_dspaddr; - // DSP addr and data - if ( (unsigned) reg <= 1 ) // 4% 0xF2 and 0xF3 - { - result = REGS [r_dspaddr]; - if ( (unsigned) reg == 1 ) - result = dsp_read( time ); // 0xF3 - } - return result; -} - -int SNES_SPC::cpu_read( int addr, rel_time_t time ) -{ - MEM_ACCESS( time, addr ) - - // RAM - int result = RAM [addr]; - int reg = addr - 0xF0; - if ( reg >= 0 ) // 40% - { - reg -= 0x10; - if ( (unsigned) reg >= 0xFF00 ) // 21% - { - reg += 0x10 - r_t0out; - - // Timers - if ( (unsigned) reg < timer_count ) // 90% - { - Timer* t = &m.timers [reg]; - if ( time >= t->next_time ) - t = run_timer_( t, time ); - result = t->counter; - t->counter = 0; - } - // Other registers - else if ( reg < 0 ) // 10% - { - result = cpu_read_smp_reg( reg + r_t0out, time ); - } - else // 1% - { - assert( reg + (r_t0out + 0xF0 - 0x10000) < 0x100 ); - result = cpu_read( reg + (r_t0out + 0xF0 - 0x10000), time ); - } - } - } - - return result; -} - - -//// Run - -// Prefix and suffix for CPU emulator function -#define SPC_CPU_RUN_FUNC \ -BOOST::uint8_t* SNES_SPC::run_until_( time_t end_time )\ -{\ - rel_time_t rel_time = m.spc_time - end_time;\ - assert( rel_time <= 0 );\ - m.spc_time = end_time;\ - m.dsp_time += rel_time;\ - m.timers [0].next_time += rel_time;\ - m.timers [1].next_time += rel_time;\ - m.timers [2].next_time += rel_time; - -#define SPC_CPU_RUN_FUNC_END \ - m.spc_time += rel_time;\ - m.dsp_time -= rel_time;\ - m.timers [0].next_time -= rel_time;\ - m.timers [1].next_time -= rel_time;\ - m.timers [2].next_time -= rel_time;\ - assert( m.spc_time <= end_time );\ - return ®S [r_cpuio0];\ -} - -int const cpu_lag_max = 12 - 1; // DIV YA,X takes 12 clocks - -void SNES_SPC::end_frame( time_t end_time ) -{ - // Catch CPU up to as close to end as possible. If final instruction - // would exceed end, does NOT execute it and leaves m.spc_time < end. - if ( end_time > m.spc_time ) - run_until_( end_time ); - - m.spc_time -= end_time; - m.extra_clocks += end_time; - - // Greatest number of clocks early that emulation can stop early due to - // not being able to execute current instruction without going over - // allowed time. - assert( -cpu_lag_max <= m.spc_time && m.spc_time <= 0 ); - - // Catch timers up to CPU - for ( int i = 0; i < timer_count; i++ ) - run_timer( &m.timers [i], 0 ); - - // Catch DSP up to CPU - if ( m.dsp_time < 0 ) - { - RUN_DSP( 0, max_reg_time ); - } - - // Save any extra samples beyond what should be generated - if ( m.buf_begin ) - save_extra(); -} - -// Inclusion here allows static memory access functions and better optimization -#include "SPC_CPU.h" diff --git a/waterbox/pizza/lib/snes_spc/SNES_SPC.h b/waterbox/pizza/lib/snes_spc/SNES_SPC.h deleted file mode 100644 index fb1ad18a45..0000000000 --- a/waterbox/pizza/lib/snes_spc/SNES_SPC.h +++ /dev/null @@ -1,284 +0,0 @@ -// SNES SPC-700 APU emulator - -// snes_spc 0.9.0 -#ifndef SNES_SPC_H -#define SNES_SPC_H - -#include "SPC_DSP.h" -#include "blargg_endian.h" -#include - -struct SNES_SPC { -public: - typedef BOOST::uint8_t uint8_t; - - // Must be called once before using - blargg_err_t init(); - - // Sample pairs generated per second - enum { sample_rate = 32000 }; - -// Emulator use - - // Sets IPL ROM data. Library does not include ROM data. Most SPC music files - // don't need ROM, but a full emulator must provide this. - enum { rom_size = 0x40 }; - void init_rom( uint8_t const rom [rom_size] ); - - // Sets destination for output samples - typedef short sample_t; - void set_output( sample_t* out, int out_size ); - - // Number of samples written to output since last set - int sample_count() const; - - // Resets SPC to power-on state. This resets your output buffer, so you must - // call set_output() after this. - void reset(); - - // Emulates pressing reset switch on SNES. This resets your output buffer, so - // you must call set_output() after this. - void soft_reset(); - - // 1024000 SPC clocks per second, sample pair every 32 clocks - typedef int time_t; - enum { clock_rate = 1024000 }; - enum { clocks_per_sample = 32 }; - - // Emulated port read/write at specified time - enum { port_count = 4 }; - int read_port ( time_t, int port ); - void write_port( time_t, int port, int data ); - - // Runs SPC to end_time and starts a new time frame at 0 - void end_frame( time_t end_time ); - - uint8_t* get_ram(); - -// Sound control - - // Mutes voices corresponding to non-zero bits in mask (issues repeated KOFF events). - // Reduces emulation accuracy. - enum { voice_count = 8 }; - void mute_voices( int mask ); - - // If true, prevents channels and global volumes from being phase-negated. - // Only supported by fast DSP. - void disable_surround( bool disable = true ); - - // Sets tempo, where tempo_unit = normal, tempo_unit / 2 = half speed, etc. - enum { tempo_unit = 0x100 }; - void set_tempo( int ); - -// SPC music files - - // Loads SPC data into emulator - enum { spc_min_file_size = 0x10180 }; - enum { spc_file_size = 0x10200 }; - blargg_err_t load_spc( void const* in, long size ); - - // Clears echo region. Useful after loading an SPC as many have garbage in echo. - void clear_echo(); - - // Plays for count samples and write samples to out. Discards samples if out - // is NULL. Count must be a multiple of 2 since output is stereo. - blargg_err_t play( int count, sample_t* out ); - - // Skips count samples. Several times faster than play() when using fast DSP. - blargg_err_t skip( int count ); - -// State save/load (only available with accurate DSP) - -#if !SPC_NO_COPY_STATE_FUNCS - // Saves/loads state - enum { state_size = 67 * 1024L }; // maximum space needed when saving - typedef SPC_DSP::copy_func_t copy_func_t; - void copy_state( unsigned char** io, copy_func_t ); - - // Writes minimal header to spc_out - static void init_header( void* spc_out ); - - // Saves emulator state as SPC file data. Writes spc_file_size bytes to spc_out. - // Does not set up SPC header; use init_header() for that. - void save_spc( void* spc_out ); - - // Returns true if new key-on events occurred since last check. Useful for - // trimming silence while saving an SPC. - bool check_kon(); -#endif - -public: - BLARGG_DISABLE_NOTHROW - - typedef BOOST::uint16_t uint16_t; - - // Time relative to m_spc_time. Speeds up code a bit by eliminating need to - // constantly add m_spc_time to time from CPU. CPU uses time that ends at - // 0 to eliminate reloading end time every instruction. It pays off. - typedef int rel_time_t; - - struct Timer - { - rel_time_t next_time; // time of next event - int prescaler; - int period; - int divider; - int enabled; - int counter; - }; - enum { reg_count = 0x10 }; - enum { timer_count = 3 }; - enum { extra_size = SPC_DSP::extra_size }; - - enum { signature_size = 35 }; - -private: - SPC_DSP dsp; - - #if SPC_LESS_ACCURATE - static signed char const reg_times_ [256]; - signed char reg_times [256]; - #endif - - struct state_t - { - Timer timers [timer_count]; - - uint8_t smp_regs [2] [reg_count]; - - struct - { - int pc; - int a; - int x; - int y; - int psw; - int sp; - } cpu_regs; - - rel_time_t dsp_time; - time_t spc_time; - bool echo_accessed; - - int tempo; - int skipped_kon; - int skipped_koff; - const char* cpu_error; - - int extra_clocks; - sample_t* buf_begin; - sample_t const* buf_end; - sample_t* extra_pos; - sample_t extra_buf [extra_size]; - - int rom_enabled; - uint8_t rom [rom_size]; - uint8_t hi_ram [rom_size]; - - unsigned char cycle_table [256]; - - struct - { - // padding to neutralize address overflow - union { - uint8_t padding1 [0x100]; - uint16_t align; // makes compiler align data for 16-bit access - } padding1 [1]; - uint8_t ram [0x10000]; - uint8_t padding2 [0x100]; - } ram; - }; - state_t m; - - enum { rom_addr = 0xFFC0 }; - - enum { skipping_time = 127 }; - - // Value that padding should be filled with - enum { cpu_pad_fill = 0xFF }; - - enum { - r_test = 0x0, r_control = 0x1, - r_dspaddr = 0x2, r_dspdata = 0x3, - r_cpuio0 = 0x4, r_cpuio1 = 0x5, - r_cpuio2 = 0x6, r_cpuio3 = 0x7, - r_f8 = 0x8, r_f9 = 0x9, - r_t0target = 0xA, r_t1target = 0xB, r_t2target = 0xC, - r_t0out = 0xD, r_t1out = 0xE, r_t2out = 0xF - }; - - void timers_loaded(); - void enable_rom( int enable ); - void reset_buf(); - void save_extra(); - void load_regs( uint8_t const in [reg_count] ); - void ram_loaded(); - void regs_loaded(); - void reset_time_regs(); - void reset_common( int timer_counter_init ); - - Timer* run_timer_ ( Timer* t, rel_time_t ); - Timer* run_timer ( Timer* t, rel_time_t ); - int dsp_read ( rel_time_t ); - void dsp_write ( int data, rel_time_t ); - void cpu_write_smp_reg_( int data, rel_time_t, int addr ); - void cpu_write_smp_reg ( int data, rel_time_t, int addr ); - void cpu_write_high ( int data, int i, rel_time_t ); - void cpu_write ( int data, int addr, rel_time_t ); - int cpu_read_smp_reg ( int i, rel_time_t ); - int cpu_read ( int addr, rel_time_t ); - unsigned CPU_mem_bit ( uint8_t const* pc, rel_time_t ); - - bool check_echo_access ( int addr ); - uint8_t* run_until_( time_t end_time ); - - struct spc_file_t - { - char signature [signature_size]; - uint8_t has_id666; - uint8_t version; - uint8_t pcl, pch; - uint8_t a; - uint8_t x; - uint8_t y; - uint8_t psw; - uint8_t sp; - char text [212]; - uint8_t ram [0x10000]; - uint8_t dsp [128]; - uint8_t unused [0x40]; - uint8_t ipl_rom [0x40]; - }; - - static char const signature [signature_size + 1]; - - void save_regs( uint8_t out [reg_count] ); -}; - -#include - -inline uint8_t* SNES_SPC::get_ram() { return m.ram.ram; } - -inline int SNES_SPC::sample_count() const { return (m.extra_clocks >> 5) * 2; } - -inline int SNES_SPC::read_port( time_t t, int port ) -{ - assert( (unsigned) port < port_count ); - return run_until_( t ) [port]; -} - -inline void SNES_SPC::write_port( time_t t, int port, int data ) -{ - assert( (unsigned) port < port_count ); - run_until_( t ) [0x10 + port] = data; -} - -inline void SNES_SPC::mute_voices( int mask ) { dsp.mute_voices( mask ); } - -inline void SNES_SPC::disable_surround( bool disable ) { dsp.disable_surround( disable ); } - -#if !SPC_NO_COPY_STATE_FUNCS -inline bool SNES_SPC::check_kon() { return dsp.check_kon(); } -#endif - -#endif diff --git a/waterbox/pizza/lib/snes_spc/SNES_SPC_misc.cpp b/waterbox/pizza/lib/snes_spc/SNES_SPC_misc.cpp deleted file mode 100644 index 87288ab8ee..0000000000 --- a/waterbox/pizza/lib/snes_spc/SNES_SPC_misc.cpp +++ /dev/null @@ -1,380 +0,0 @@ -// SPC emulation support: init, sample buffering, reset, SPC loading - -// snes_spc 0.9.0. http://www.slack.net/~ant/ - -#include "SNES_SPC.h" - -#include - -/* Copyright (C) 2004-2007 Shay Green. This module is free software; you -can redistribute it and/or modify it under the terms of the GNU Lesser -General Public License as published by the Free Software Foundation; either -version 2.1 of the License, or (at your option) any later version. This -module is distributed in the hope that it will be useful, but WITHOUT ANY -WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more -details. You should have received a copy of the GNU Lesser General Public -License along with this module; if not, write to the Free Software Foundation, -Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ - -#include "blargg_source.h" - -#define RAM (m.ram.ram) -#define REGS (m.smp_regs [0]) -#define REGS_IN (m.smp_regs [1]) - -// (n ? n : 256) -#define IF_0_THEN_256( n ) ((uint8_t) ((n) - 1) + 1) - - -//// Init - -blargg_err_t SNES_SPC::init() -{ - memset( &m, 0, sizeof m ); - dsp.init( RAM ); - - m.tempo = tempo_unit; - - // Most SPC music doesn't need ROM, and almost all the rest only rely - // on these two bytes - m.rom [0x3E] = 0xFF; - m.rom [0x3F] = 0xC0; - - static unsigned char const cycle_table [128] = - {// 01 23 45 67 89 AB CD EF - 0x28,0x47,0x34,0x36,0x26,0x54,0x54,0x68, // 0 - 0x48,0x47,0x45,0x56,0x55,0x65,0x22,0x46, // 1 - 0x28,0x47,0x34,0x36,0x26,0x54,0x54,0x74, // 2 - 0x48,0x47,0x45,0x56,0x55,0x65,0x22,0x38, // 3 - 0x28,0x47,0x34,0x36,0x26,0x44,0x54,0x66, // 4 - 0x48,0x47,0x45,0x56,0x55,0x45,0x22,0x43, // 5 - 0x28,0x47,0x34,0x36,0x26,0x44,0x54,0x75, // 6 - 0x48,0x47,0x45,0x56,0x55,0x55,0x22,0x36, // 7 - 0x28,0x47,0x34,0x36,0x26,0x54,0x52,0x45, // 8 - 0x48,0x47,0x45,0x56,0x55,0x55,0x22,0xC5, // 9 - 0x38,0x47,0x34,0x36,0x26,0x44,0x52,0x44, // A - 0x48,0x47,0x45,0x56,0x55,0x55,0x22,0x34, // B - 0x38,0x47,0x45,0x47,0x25,0x64,0x52,0x49, // C - 0x48,0x47,0x56,0x67,0x45,0x55,0x22,0x83, // D - 0x28,0x47,0x34,0x36,0x24,0x53,0x43,0x40, // E - 0x48,0x47,0x45,0x56,0x34,0x54,0x22,0x60, // F - }; - - // unpack cycle table - for ( int i = 0; i < 128; i++ ) - { - int n = cycle_table [i]; - m.cycle_table [i * 2 + 0] = n >> 4; - m.cycle_table [i * 2 + 1] = n & 0x0F; - } - - #if SPC_LESS_ACCURATE - memcpy( reg_times, reg_times_, sizeof reg_times ); - #endif - - reset(); - return 0; -} - -void SNES_SPC::init_rom( uint8_t const in [rom_size] ) -{ - memcpy( m.rom, in, sizeof m.rom ); -} - -void SNES_SPC::set_tempo( int t ) -{ - m.tempo = t; - int const timer2_shift = 4; // 64 kHz - int const other_shift = 3; // 8 kHz - - #if SPC_DISABLE_TEMPO - m.timers [2].prescaler = timer2_shift; - m.timers [1].prescaler = timer2_shift + other_shift; - m.timers [0].prescaler = timer2_shift + other_shift; - #else - if ( !t ) - t = 1; - int const timer2_rate = 1 << timer2_shift; - int rate = (timer2_rate * tempo_unit + (t >> 1)) / t; - if ( rate < timer2_rate / 4 ) - rate = timer2_rate / 4; // max 4x tempo - m.timers [2].prescaler = rate; - m.timers [1].prescaler = rate << other_shift; - m.timers [0].prescaler = rate << other_shift; - #endif -} - -// Timer registers have been loaded. Applies these to the timers. Does not -// reset timer prescalers or dividers. -void SNES_SPC::timers_loaded() -{ - int i; - for ( i = 0; i < timer_count; i++ ) - { - Timer* t = &m.timers [i]; - t->period = IF_0_THEN_256( REGS [r_t0target + i] ); - t->enabled = REGS [r_control] >> i & 1; - t->counter = REGS_IN [r_t0out + i] & 0x0F; - } - - set_tempo( m.tempo ); -} - -// Loads registers from unified 16-byte format -void SNES_SPC::load_regs( uint8_t const in [reg_count] ) -{ - memcpy( REGS, in, reg_count ); - memcpy( REGS_IN, REGS, reg_count ); - - // These always read back as 0 - REGS_IN [r_test ] = 0; - REGS_IN [r_control ] = 0; - REGS_IN [r_t0target] = 0; - REGS_IN [r_t1target] = 0; - REGS_IN [r_t2target] = 0; -} - -// RAM was just loaded from SPC, with $F0-$FF containing SMP registers -// and timer counts. Copies these to proper registers. -void SNES_SPC::ram_loaded() -{ - m.rom_enabled = 0; - load_regs( &RAM [0xF0] ); - - // Put STOP instruction around memory to catch PC underflow/overflow - memset( m.ram.padding1, cpu_pad_fill, sizeof m.ram.padding1 ); - memset( m.ram.padding2, cpu_pad_fill, sizeof m.ram.padding2 ); -} - -// Registers were just loaded. Applies these new values. -void SNES_SPC::regs_loaded() -{ - enable_rom( REGS [r_control] & 0x80 ); - timers_loaded(); -} - -void SNES_SPC::reset_time_regs() -{ - m.cpu_error = 0; - m.echo_accessed = 0; - m.spc_time = 0; - m.dsp_time = 0; - #if SPC_LESS_ACCURATE - m.dsp_time = clocks_per_sample + 1; - #endif - - for ( int i = 0; i < timer_count; i++ ) - { - Timer* t = &m.timers [i]; - t->next_time = 1; - t->divider = 0; - } - - regs_loaded(); - - m.extra_clocks = 0; - reset_buf(); -} - -void SNES_SPC::reset_common( int timer_counter_init ) -{ - int i; - for ( i = 0; i < timer_count; i++ ) - REGS_IN [r_t0out + i] = timer_counter_init; - - // Run IPL ROM - memset( &m.cpu_regs, 0, sizeof m.cpu_regs ); - m.cpu_regs.pc = rom_addr; - - REGS [r_test ] = 0x0A; - REGS [r_control] = 0xB0; // ROM enabled, clear ports - for ( i = 0; i < port_count; i++ ) - REGS_IN [r_cpuio0 + i] = 0; - - reset_time_regs(); -} - -void SNES_SPC::soft_reset() -{ - reset_common( 0 ); - dsp.soft_reset(); -} - -void SNES_SPC::reset() -{ - memset( RAM, 0xFF, 0x10000 ); - ram_loaded(); - reset_common( 0x0F ); - dsp.reset(); -} - -char const SNES_SPC::signature [signature_size + 1] = - "SNES-SPC700 Sound File Data v0.30\x1A\x1A"; - -blargg_err_t SNES_SPC::load_spc( void const* data, long size ) -{ - spc_file_t const* const spc = (spc_file_t const*) data; - - // be sure compiler didn't insert any padding into fle_t - assert( sizeof (spc_file_t) == spc_min_file_size + 0x80 ); - - // Check signature and file size - if ( size < signature_size || memcmp( spc, signature, 27 ) ) - return "Not an SPC file"; - - if ( size < spc_min_file_size ) - return "Corrupt SPC file"; - - // CPU registers - m.cpu_regs.pc = spc->pch * 0x100 + spc->pcl; - m.cpu_regs.a = spc->a; - m.cpu_regs.x = spc->x; - m.cpu_regs.y = spc->y; - m.cpu_regs.psw = spc->psw; - m.cpu_regs.sp = spc->sp; - - // RAM and registers - memcpy( RAM, spc->ram, 0x10000 ); - ram_loaded(); - - // DSP registers - dsp.load( spc->dsp ); - - reset_time_regs(); - - return 0; -} - -void SNES_SPC::clear_echo() -{ - if ( !(dsp.read( SPC_DSP::r_flg ) & 0x20) ) - { - int addr = 0x100 * dsp.read( SPC_DSP::r_esa ); - int end = addr + 0x800 * (dsp.read( SPC_DSP::r_edl ) & 0x0F); - if ( end > 0x10000 ) - end = 0x10000; - memset( &RAM [addr], 0xFF, end - addr ); - } -} - - -//// Sample output - -void SNES_SPC::reset_buf() -{ - // Start with half extra buffer of silence - sample_t* out = m.extra_buf; - while ( out < &m.extra_buf [extra_size / 2] ) - *out++ = 0; - - m.extra_pos = out; - m.buf_begin = 0; - - dsp.set_output( 0, 0 ); -} - -void SNES_SPC::set_output( sample_t* out, int size ) -{ - require( (size & 1) == 0 ); // size must be even - - m.extra_clocks &= clocks_per_sample - 1; - if ( out ) - { - sample_t const* out_end = out + size; - m.buf_begin = out; - m.buf_end = out_end; - - // Copy extra to output - sample_t const* in = m.extra_buf; - while ( in < m.extra_pos && out < out_end ) - *out++ = *in++; - - // Handle output being full already - if ( out >= out_end ) - { - // Have DSP write to remaining extra space - out = dsp.extra(); - out_end = &dsp.extra() [extra_size]; - - // Copy any remaining extra samples as if DSP wrote them - while ( in < m.extra_pos ) - *out++ = *in++; - assert( out <= out_end ); - } - - dsp.set_output( out, out_end - out ); - } - else - { - reset_buf(); - } -} - -void SNES_SPC::save_extra() -{ - // Get end pointers - sample_t const* main_end = m.buf_end; // end of data written to buf - sample_t const* dsp_end = dsp.out_pos(); // end of data written to dsp.extra() - if ( m.buf_begin <= dsp_end && dsp_end <= main_end ) - { - main_end = dsp_end; - dsp_end = dsp.extra(); // nothing in DSP's extra - } - - // Copy any extra samples at these ends into extra_buf - sample_t* out = m.extra_buf; - sample_t const* in; - for ( in = m.buf_begin + sample_count(); in < main_end; in++ ) - *out++ = *in; - for ( in = dsp.extra(); in < dsp_end ; in++ ) - *out++ = *in; - - m.extra_pos = out; - assert( out <= &m.extra_buf [extra_size] ); -} - -blargg_err_t SNES_SPC::play( int count, sample_t* out ) -{ - require( (count & 1) == 0 ); // must be even - if ( count ) - { - set_output( out, count ); - end_frame( count * (clocks_per_sample / 2) ); - } - - const char* err = m.cpu_error; - m.cpu_error = 0; - return err; -} - -blargg_err_t SNES_SPC::skip( int count ) -{ - #if SPC_LESS_ACCURATE - if ( count > 2 * sample_rate * 2 ) - { - set_output( 0, 0 ); - - // Skip a multiple of 4 samples - time_t end = count; - count = (count & 3) + 1 * sample_rate * 2; - end = (end - count) * (clocks_per_sample / 2); - - m.skipped_kon = 0; - m.skipped_koff = 0; - - // Preserve DSP and timer synchronization - // TODO: verify that this really preserves it - int old_dsp_time = m.dsp_time + m.spc_time; - m.dsp_time = end - m.spc_time + skipping_time; - end_frame( end ); - m.dsp_time = m.dsp_time - skipping_time + old_dsp_time; - - dsp.write( SPC_DSP::r_koff, m.skipped_koff & ~m.skipped_kon ); - dsp.write( SPC_DSP::r_kon , m.skipped_kon ); - clear_echo(); - } - #endif - - return play( count, 0 ); -} diff --git a/waterbox/pizza/lib/snes_spc/SNES_SPC_state.cpp b/waterbox/pizza/lib/snes_spc/SNES_SPC_state.cpp deleted file mode 100644 index a8052b6587..0000000000 --- a/waterbox/pizza/lib/snes_spc/SNES_SPC_state.cpp +++ /dev/null @@ -1,129 +0,0 @@ -// SPC emulation state save/load: copy_state(), save_spc() -// Separate file to avoid linking in unless needed - -// snes_spc 0.9.0. http://www.slack.net/~ant/ - -#include "SNES_SPC.h" - -#if !SPC_NO_COPY_STATE_FUNCS - -#include - -/* Copyright (C) 2004-2007 Shay Green. This module is free software; you -can redistribute it and/or modify it under the terms of the GNU Lesser -General Public License as published by the Free Software Foundation; either -version 2.1 of the License, or (at your option) any later version. This -module is distributed in the hope that it will be useful, but WITHOUT ANY -WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more -details. You should have received a copy of the GNU Lesser General Public -License along with this module; if not, write to the Free Software Foundation, -Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ - -#include "blargg_source.h" - -#define RAM (m.ram.ram) -#define REGS (m.smp_regs [0]) -#define REGS_IN (m.smp_regs [1]) - -void SNES_SPC::save_regs( uint8_t out [reg_count] ) -{ - // Use current timer counter values - for ( int i = 0; i < timer_count; i++ ) - out [r_t0out + i] = m.timers [i].counter; - - // Last written values - memcpy( out, REGS, r_t0out ); -} - -void SNES_SPC::init_header( void* spc_out ) -{ - spc_file_t* const spc = (spc_file_t*) spc_out; - - spc->has_id666 = 26; // has none - spc->version = 30; - memcpy( spc, signature, sizeof spc->signature ); - memset( spc->text, 0, sizeof spc->text ); -} - -void SNES_SPC::save_spc( void* spc_out ) -{ - spc_file_t* const spc = (spc_file_t*) spc_out; - - // CPU - spc->pcl = (uint8_t) (m.cpu_regs.pc >> 0); - spc->pch = (uint8_t) (m.cpu_regs.pc >> 8); - spc->a = m.cpu_regs.a; - spc->x = m.cpu_regs.x; - spc->y = m.cpu_regs.y; - spc->psw = m.cpu_regs.psw; - spc->sp = m.cpu_regs.sp; - - // RAM, ROM - memcpy( spc->ram, RAM, sizeof spc->ram ); - if ( m.rom_enabled ) - memcpy( spc->ram + rom_addr, m.hi_ram, sizeof m.hi_ram ); - memset( spc->unused, 0, sizeof spc->unused ); - memcpy( spc->ipl_rom, m.rom, sizeof spc->ipl_rom ); - - // SMP registers - save_regs( &spc->ram [0xF0] ); - int i; - for ( i = 0; i < port_count; i++ ) - spc->ram [0xF0 + r_cpuio0 + i] = REGS_IN [r_cpuio0 + i]; - - // DSP registers - for ( i = 0; i < SPC_DSP::register_count; i++ ) - spc->dsp [i] = dsp.read( i ); -} - -void SNES_SPC::copy_state( unsigned char** io, copy_func_t copy ) -{ - SPC_State_Copier copier( io, copy ); - - // Make state data more readable by putting 64K RAM, 16 SMP registers, - // then DSP (with its 128 registers) first - - // RAM - enable_rom( 0 ); // will get re-enabled if necessary in regs_loaded() below - copier.copy( RAM, 0x10000 ); - - { - // SMP registers - uint8_t out_ports [port_count]; - uint8_t regs [reg_count]; - memcpy( out_ports, ®S [r_cpuio0], sizeof out_ports ); - save_regs( regs ); - copier.copy( regs, sizeof regs ); - copier.copy( out_ports, sizeof out_ports ); - load_regs( regs ); - regs_loaded(); - memcpy( ®S [r_cpuio0], out_ports, sizeof out_ports ); - } - - // CPU registers - SPC_COPY( uint16_t, m.cpu_regs.pc ); - SPC_COPY( uint8_t, m.cpu_regs.a ); - SPC_COPY( uint8_t, m.cpu_regs.x ); - SPC_COPY( uint8_t, m.cpu_regs.y ); - SPC_COPY( uint8_t, m.cpu_regs.psw ); - SPC_COPY( uint8_t, m.cpu_regs.sp ); - copier.extra(); - - SPC_COPY( int16_t, m.spc_time ); - SPC_COPY( int16_t, m.dsp_time ); - - // DSP - dsp.copy_state( io, copy ); - - // Timers - for ( int i = 0; i < timer_count; i++ ) - { - Timer* t = &m.timers [i]; - SPC_COPY( int16_t, t->next_time ); - SPC_COPY( uint8_t, t->divider ); - copier.extra(); - } - copier.extra(); -} -#endif diff --git a/waterbox/pizza/lib/snes_spc/SPC_CPU.h b/waterbox/pizza/lib/snes_spc/SPC_CPU.h deleted file mode 100644 index 664fc4886e..0000000000 --- a/waterbox/pizza/lib/snes_spc/SPC_CPU.h +++ /dev/null @@ -1,1220 +0,0 @@ -// snes_spc 0.9.0. http://www.slack.net/~ant/ - -/* Copyright (C) 2004-2007 Shay Green. This module is free software; you -can redistribute it and/or modify it under the terms of the GNU Lesser -General Public License as published by the Free Software Foundation; either -version 2.1 of the License, or (at your option) any later version. This -module is distributed in the hope that it will be useful, but WITHOUT ANY -WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more -details. You should have received a copy of the GNU Lesser General Public -License along with this module; if not, write to the Free Software Foundation, -Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ - -//// Memory access - -#if SPC_MORE_ACCURACY - #define SUSPICIOUS_OPCODE( name ) ((void) 0) -#else - #define SUSPICIOUS_OPCODE( name ) dprintf( "SPC: suspicious opcode: " name "\n" ) -#endif - -#define CPU_READ( time, offset, addr )\ - cpu_read( addr, time + offset ) - -#define CPU_WRITE( time, offset, addr, data )\ - cpu_write( data, addr, time + offset ) - -#if SPC_MORE_ACCURACY - #define CPU_READ_TIMER( time, offset, addr, out )\ - { out = CPU_READ( time, offset, addr ); } - -#else - // timers are by far the most common thing read from dp - #define CPU_READ_TIMER( time, offset, addr_, out )\ - {\ - rel_time_t adj_time = time + offset;\ - int dp_addr = addr_;\ - int ti = dp_addr - (r_t0out + 0xF0);\ - if ( (unsigned) ti < timer_count )\ - {\ - Timer* t = &m.timers [ti];\ - if ( adj_time >= t->next_time )\ - t = run_timer_( t, adj_time );\ - out = t->counter;\ - t->counter = 0;\ - }\ - else\ - {\ - out = ram [dp_addr];\ - int i = dp_addr - 0xF0;\ - if ( (unsigned) i < 0x10 )\ - out = cpu_read_smp_reg( i, adj_time );\ - }\ - } -#endif - -#define TIME_ADJ( n ) (n) - -#define READ_TIMER( time, addr, out ) CPU_READ_TIMER( rel_time, TIME_ADJ(time), (addr), out ) -#define READ( time, addr ) CPU_READ ( rel_time, TIME_ADJ(time), (addr) ) -#define WRITE( time, addr, data ) CPU_WRITE( rel_time, TIME_ADJ(time), (addr), (data) ) - -#define DP_ADDR( addr ) (dp + (addr)) - -#define READ_DP_TIMER( time, addr, out ) CPU_READ_TIMER( rel_time, TIME_ADJ(time), DP_ADDR( addr ), out ) -#define READ_DP( time, addr ) READ ( time, DP_ADDR( addr ) ) -#define WRITE_DP( time, addr, data ) WRITE( time, DP_ADDR( addr ), data ) - -#define READ_PROG16( addr ) GET_LE16( ram + (addr) ) - -#define SET_PC( n ) (pc = ram + (n)) -#define GET_PC() (pc - ram) -#define READ_PC( pc ) (*(pc)) -#define READ_PC16( pc ) GET_LE16( pc ) - -// TODO: remove non-wrapping versions? -#define SPC_NO_SP_WRAPAROUND 0 - -#define SET_SP( v ) (sp = ram + 0x101 + (v)) -#define GET_SP() (sp - 0x101 - ram) - -#if SPC_NO_SP_WRAPAROUND -#define PUSH16( v ) (sp -= 2, SET_LE16( sp, v )) -#define PUSH( v ) (void) (*--sp = (uint8_t) (v)) -#define POP( out ) (void) ((out) = *sp++) - -#else -#define PUSH16( data )\ -{\ - int addr = (sp -= 2) - ram;\ - if ( addr > 0x100 )\ - {\ - SET_LE16( sp, data );\ - }\ - else\ - {\ - ram [(uint8_t) addr + 0x100] = (uint8_t) data;\ - sp [1] = (uint8_t) (data >> 8);\ - sp += 0x100;\ - }\ -} - -#define PUSH( data )\ -{\ - *--sp = (uint8_t) (data);\ - if ( sp - ram == 0x100 )\ - sp += 0x100;\ -} - -#define POP( out )\ -{\ - out = *sp++;\ - if ( sp - ram == 0x201 )\ - {\ - out = sp [-0x101];\ - sp -= 0x100;\ - }\ -} - -#endif - -#define MEM_BIT( rel ) CPU_mem_bit( pc, rel_time + rel ) - -unsigned SNES_SPC::CPU_mem_bit( uint8_t const* pc, rel_time_t rel_time ) -{ - unsigned addr = READ_PC16( pc ); - unsigned t = READ( 0, addr & 0x1FFF ) >> (addr >> 13); - return t << 8 & 0x100; -} - -//// Status flag handling - -// Hex value in name to clarify code and bit shifting. -// Flag stored in indicated variable during emulation -int const n80 = 0x80; // nz -int const v40 = 0x40; // psw -int const p20 = 0x20; // dp -int const b10 = 0x10; // psw -int const h08 = 0x08; // psw -int const i04 = 0x04; // psw -int const z02 = 0x02; // nz -int const c01 = 0x01; // c - -int const nz_neg_mask = 0x880; // either bit set indicates N flag set - -#define GET_PSW( out )\ -{\ - out = psw & ~(n80 | p20 | z02 | c01);\ - out |= c >> 8 & c01;\ - out |= dp >> 3 & p20;\ - out |= ((nz >> 4) | nz) & n80;\ - if ( !(uint8_t) nz ) out |= z02;\ -} - -#define SET_PSW( in )\ -{\ - psw = in;\ - c = in << 8;\ - dp = in << 3 & 0x100;\ - nz = (in << 4 & 0x800) | (~in & z02);\ -} - -SPC_CPU_RUN_FUNC -{ - uint8_t* const ram = RAM; - int a = m.cpu_regs.a; - int x = m.cpu_regs.x; - int y = m.cpu_regs.y; - uint8_t const* pc; - uint8_t* sp; - int psw; - int c; - int nz; - int dp; - - SET_PC( m.cpu_regs.pc ); - SET_SP( m.cpu_regs.sp ); - SET_PSW( m.cpu_regs.psw ); - - goto loop; - - - // Main loop - -cbranch_taken_loop: - pc += *(BOOST::int8_t const*) pc; -inc_pc_loop: - pc++; -loop: -{ - unsigned opcode; - unsigned data; - - check( (unsigned) a < 0x100 ); - check( (unsigned) x < 0x100 ); - check( (unsigned) y < 0x100 ); - - opcode = *pc; - if ( (rel_time += m.cycle_table [opcode]) > 0 ) - goto out_of_time; - - #ifdef SPC_CPU_OPCODE_HOOK - SPC_CPU_OPCODE_HOOK( GET_PC(), opcode ); - #endif - /* - //SUB_CASE_COUNTER( 1 ); - #define PROFILE_TIMER_LOOP( op, addr, len )\ - if ( opcode == op )\ - {\ - int cond = (unsigned) ((addr) - 0xFD) < 3 &&\ - pc [len] == 0xF0 && pc [len+1] == 0xFE - len;\ - SUB_CASE_COUNTER( op && cond );\ - } - - PROFILE_TIMER_LOOP( 0xEC, GET_LE16( pc + 1 ), 3 ); - PROFILE_TIMER_LOOP( 0xEB, pc [1], 2 ); - PROFILE_TIMER_LOOP( 0xE4, pc [1], 2 ); - */ - - // TODO: if PC is at end of memory, this will get wrong operand (very obscure) - data = *++pc; - switch ( opcode ) - { - -// Common instructions - -#define BRANCH( cond )\ -{\ - pc++;\ - pc += (BOOST::int8_t) data;\ - if ( cond )\ - goto loop;\ - pc -= (BOOST::int8_t) data;\ - rel_time -= 2;\ - goto loop;\ -} - - case 0xF0: // BEQ - BRANCH( !(uint8_t) nz ) // 89% taken - - case 0xD0: // BNE - BRANCH( (uint8_t) nz ) - - case 0x3F:{// CALL - int old_addr = GET_PC() + 2; - SET_PC( READ_PC16( pc ) ); - PUSH16( old_addr ); - goto loop; - } - - case 0x6F:// RET - #if SPC_NO_SP_WRAPAROUND - { - SET_PC( GET_LE16( sp ) ); - sp += 2; - } - #else - { - int addr = sp - ram; - SET_PC( GET_LE16( sp ) ); - sp += 2; - if ( addr < 0x1FF ) - goto loop; - - SET_PC( sp [-0x101] * 0x100 + ram [(uint8_t) addr + 0x100] ); - sp -= 0x100; - } - #endif - goto loop; - - case 0xE4: // MOV a,dp - ++pc; - // 80% from timer - READ_DP_TIMER( 0, data, a = nz ); - goto loop; - - case 0xFA:{// MOV dp,dp - int temp; - READ_DP_TIMER( -2, data, temp ); - data = temp + no_read_before_write ; - } - // fall through - case 0x8F:{// MOV dp,#imm - int temp = READ_PC( pc + 1 ); - pc += 2; - - #if !SPC_MORE_ACCURACY - { - int i = dp + temp; - ram [i] = (uint8_t) data; - i -= 0xF0; - if ( (unsigned) i < 0x10 ) // 76% - { - REGS [i] = (uint8_t) data; - - // Registers other than $F2 and $F4-$F7 - //if ( i != 2 && i != 4 && i != 5 && i != 6 && i != 7 ) - if ( ((~0x2F00 << (bits_in_int - 16)) << i) < 0 ) // 12% - cpu_write_smp_reg( data, rel_time, i ); - } - } - #else - WRITE_DP( 0, temp, data ); - #endif - goto loop; - } - - case 0xC4: // MOV dp,a - ++pc; - #if !SPC_MORE_ACCURACY - { - int i = dp + data; - ram [i] = (uint8_t) a; - i -= 0xF0; - if ( (unsigned) i < 0x10 ) // 39% - { - unsigned sel = i - 2; - REGS [i] = (uint8_t) a; - - if ( sel == 1 ) // 51% $F3 - dsp_write( a, rel_time ); - else if ( sel > 1 ) // 1% not $F2 or $F3 - cpu_write_smp_reg_( a, rel_time, i ); - } - } - #else - WRITE_DP( 0, data, a ); - #endif - goto loop; - -#define CASE( n ) case n: - -// Define common address modes based on opcode for immediate mode. Execution -// ends with data set to the address of the operand. -#define ADDR_MODES_( op )\ - CASE( op - 0x02 ) /* (X) */\ - data = x + dp;\ - pc--;\ - goto end_##op;\ - CASE( op + 0x0F ) /* (dp)+Y */\ - data = READ_PROG16( data + dp ) + y;\ - goto end_##op;\ - CASE( op - 0x01 ) /* (dp+X) */\ - data = READ_PROG16( ((uint8_t) (data + x)) + dp );\ - goto end_##op;\ - CASE( op + 0x0E ) /* abs+Y */\ - data += y;\ - goto abs_##op;\ - CASE( op + 0x0D ) /* abs+X */\ - data += x;\ - CASE( op - 0x03 ) /* abs */\ - abs_##op:\ - data += 0x100 * READ_PC( ++pc );\ - goto end_##op;\ - CASE( op + 0x0C ) /* dp+X */\ - data = (uint8_t) (data + x); - -#define ADDR_MODES_NO_DP( op )\ - ADDR_MODES_( op )\ - data += dp;\ - end_##op: - -#define ADDR_MODES( op )\ - ADDR_MODES_( op )\ - CASE( op - 0x04 ) /* dp */\ - data += dp;\ - end_##op: - -// 1. 8-bit Data Transmission Commands. Group I - - ADDR_MODES_NO_DP( 0xE8 ) // MOV A,addr - a = nz = READ( 0, data ); - goto inc_pc_loop; - - case 0xBF:{// MOV A,(X)+ - int temp = x + dp; - x = (uint8_t) (x + 1); - a = nz = READ( -1, temp ); - goto loop; - } - - case 0xE8: // MOV A,imm - a = data; - nz = data; - goto inc_pc_loop; - - case 0xF9: // MOV X,dp+Y - data = (uint8_t) (data + y); - case 0xF8: // MOV X,dp - READ_DP_TIMER( 0, data, x = nz ); - goto inc_pc_loop; - - case 0xE9: // MOV X,abs - data = READ_PC16( pc ); - ++pc; - data = READ( 0, data ); - case 0xCD: // MOV X,imm - x = data; - nz = data; - goto inc_pc_loop; - - case 0xFB: // MOV Y,dp+X - data = (uint8_t) (data + x); - case 0xEB: // MOV Y,dp - // 70% from timer - pc++; - READ_DP_TIMER( 0, data, y = nz ); - goto loop; - - case 0xEC:{// MOV Y,abs - int temp = READ_PC16( pc ); - pc += 2; - READ_TIMER( 0, temp, y = nz ); - //y = nz = READ( 0, temp ); - goto loop; - } - - case 0x8D: // MOV Y,imm - y = data; - nz = data; - goto inc_pc_loop; - -// 2. 8-BIT DATA TRANSMISSION COMMANDS, GROUP 2 - - ADDR_MODES_NO_DP( 0xC8 ) // MOV addr,A - WRITE( 0, data, a ); - goto inc_pc_loop; - - { - int temp; - case 0xCC: // MOV abs,Y - temp = y; - goto mov_abs_temp; - case 0xC9: // MOV abs,X - temp = x; - mov_abs_temp: - WRITE( 0, READ_PC16( pc ), temp ); - pc += 2; - goto loop; - } - - case 0xD9: // MOV dp+Y,X - data = (uint8_t) (data + y); - case 0xD8: // MOV dp,X - WRITE( 0, data + dp, x ); - goto inc_pc_loop; - - case 0xDB: // MOV dp+X,Y - data = (uint8_t) (data + x); - case 0xCB: // MOV dp,Y - WRITE( 0, data + dp, y ); - goto inc_pc_loop; - -// 3. 8-BIT DATA TRANSMISSIN COMMANDS, GROUP 3. - - case 0x7D: // MOV A,X - a = x; - nz = x; - goto loop; - - case 0xDD: // MOV A,Y - a = y; - nz = y; - goto loop; - - case 0x5D: // MOV X,A - x = a; - nz = a; - goto loop; - - case 0xFD: // MOV Y,A - y = a; - nz = a; - goto loop; - - case 0x9D: // MOV X,SP - x = nz = GET_SP(); - goto loop; - - case 0xBD: // MOV SP,X - SET_SP( x ); - goto loop; - - //case 0xC6: // MOV (X),A (handled by MOV addr,A in group 2) - - case 0xAF: // MOV (X)+,A - WRITE_DP( 0, x, a + no_read_before_write ); - x++; - goto loop; - -// 5. 8-BIT LOGIC OPERATION COMMANDS - -#define LOGICAL_OP( op, func )\ - ADDR_MODES( op ) /* addr */\ - data = READ( 0, data );\ - case op: /* imm */\ - nz = a func##= data;\ - goto inc_pc_loop;\ - { unsigned addr;\ - case op + 0x11: /* X,Y */\ - data = READ_DP( -2, y );\ - addr = x + dp;\ - goto addr_##op;\ - case op + 0x01: /* dp,dp */\ - data = READ_DP( -3, data );\ - case op + 0x10:{/*dp,imm*/\ - uint8_t const* addr2 = pc + 1;\ - pc += 2;\ - addr = READ_PC( addr2 ) + dp;\ - }\ - addr_##op:\ - nz = data func READ( -1, addr );\ - WRITE( 0, addr, nz );\ - goto loop;\ - } - - LOGICAL_OP( 0x28, & ); // AND - - LOGICAL_OP( 0x08, | ); // OR - - LOGICAL_OP( 0x48, ^ ); // EOR - -// 4. 8-BIT ARITHMETIC OPERATION COMMANDS - - ADDR_MODES( 0x68 ) // CMP addr - data = READ( 0, data ); - case 0x68: // CMP imm - nz = a - data; - c = ~nz; - nz &= 0xFF; - goto inc_pc_loop; - - case 0x79: // CMP (X),(Y) - data = READ_DP( -2, y ); - nz = READ_DP( -1, x ) - data; - c = ~nz; - nz &= 0xFF; - goto loop; - - case 0x69: // CMP dp,dp - data = READ_DP( -3, data ); - case 0x78: // CMP dp,imm - nz = READ_DP( -1, READ_PC( ++pc ) ) - data; - c = ~nz; - nz &= 0xFF; - goto inc_pc_loop; - - case 0x3E: // CMP X,dp - data += dp; - goto cmp_x_addr; - case 0x1E: // CMP X,abs - data = READ_PC16( pc ); - pc++; - cmp_x_addr: - data = READ( 0, data ); - case 0xC8: // CMP X,imm - nz = x - data; - c = ~nz; - nz &= 0xFF; - goto inc_pc_loop; - - case 0x7E: // CMP Y,dp - data += dp; - goto cmp_y_addr; - case 0x5E: // CMP Y,abs - data = READ_PC16( pc ); - pc++; - cmp_y_addr: - data = READ( 0, data ); - case 0xAD: // CMP Y,imm - nz = y - data; - c = ~nz; - nz &= 0xFF; - goto inc_pc_loop; - - { - int addr; - case 0xB9: // SBC (x),(y) - case 0x99: // ADC (x),(y) - pc--; // compensate for inc later - data = READ_DP( -2, y ); - addr = x + dp; - goto adc_addr; - case 0xA9: // SBC dp,dp - case 0x89: // ADC dp,dp - data = READ_DP( -3, data ); - case 0xB8: // SBC dp,imm - case 0x98: // ADC dp,imm - addr = READ_PC( ++pc ) + dp; - adc_addr: - nz = READ( -1, addr ); - goto adc_data; - -// catch ADC and SBC together, then decode later based on operand -#undef CASE -#define CASE( n ) case n: case (n) + 0x20: - ADDR_MODES( 0x88 ) // ADC/SBC addr - data = READ( 0, data ); - case 0xA8: // SBC imm - case 0x88: // ADC imm - addr = -1; // A - nz = a; - adc_data: { - int flags; - if ( opcode >= 0xA0 ) // SBC - data ^= 0xFF; - - flags = data ^ nz; - nz += data + (c >> 8 & 1); - flags ^= nz; - - psw = (psw & ~(v40 | h08)) | - (flags >> 1 & h08) | - ((flags + 0x80) >> 2 & v40); - c = nz; - if ( addr < 0 ) - { - a = (uint8_t) nz; - goto inc_pc_loop; - } - WRITE( 0, addr, /*(uint8_t)*/ nz ); - goto inc_pc_loop; - } - - } - -// 6. ADDITION & SUBTRACTION COMMANDS - -#define INC_DEC_REG( reg, op )\ - nz = reg op;\ - reg = (uint8_t) nz;\ - goto loop; - - case 0xBC: INC_DEC_REG( a, + 1 ) // INC A - case 0x3D: INC_DEC_REG( x, + 1 ) // INC X - case 0xFC: INC_DEC_REG( y, + 1 ) // INC Y - - case 0x9C: INC_DEC_REG( a, - 1 ) // DEC A - case 0x1D: INC_DEC_REG( x, - 1 ) // DEC X - case 0xDC: INC_DEC_REG( y, - 1 ) // DEC Y - - case 0x9B: // DEC dp+X - case 0xBB: // INC dp+X - data = (uint8_t) (data + x); - case 0x8B: // DEC dp - case 0xAB: // INC dp - data += dp; - goto inc_abs; - case 0x8C: // DEC abs - case 0xAC: // INC abs - data = READ_PC16( pc ); - pc++; - inc_abs: - nz = (opcode >> 4 & 2) - 1; - nz += READ( -1, data ); - WRITE( 0, data, /*(uint8_t)*/ nz ); - goto inc_pc_loop; - -// 7. SHIFT, ROTATION COMMANDS - - case 0x5C: // LSR A - c = 0; - case 0x7C:{// ROR A - nz = (c >> 1 & 0x80) | (a >> 1); - c = a << 8; - a = nz; - goto loop; - } - - case 0x1C: // ASL A - c = 0; - case 0x3C:{// ROL A - int temp = c >> 8 & 1; - c = a << 1; - nz = c | temp; - a = (uint8_t) nz; - goto loop; - } - - case 0x0B: // ASL dp - c = 0; - data += dp; - goto rol_mem; - case 0x1B: // ASL dp+X - c = 0; - case 0x3B: // ROL dp+X - data = (uint8_t) (data + x); - case 0x2B: // ROL dp - data += dp; - goto rol_mem; - case 0x0C: // ASL abs - c = 0; - case 0x2C: // ROL abs - data = READ_PC16( pc ); - pc++; - rol_mem: - nz = c >> 8 & 1; - nz |= (c = READ( -1, data ) << 1); - WRITE( 0, data, /*(uint8_t)*/ nz ); - goto inc_pc_loop; - - case 0x4B: // LSR dp - c = 0; - data += dp; - goto ror_mem; - case 0x5B: // LSR dp+X - c = 0; - case 0x7B: // ROR dp+X - data = (uint8_t) (data + x); - case 0x6B: // ROR dp - data += dp; - goto ror_mem; - case 0x4C: // LSR abs - c = 0; - case 0x6C: // ROR abs - data = READ_PC16( pc ); - pc++; - ror_mem: { - int temp = READ( -1, data ); - nz = (c >> 1 & 0x80) | (temp >> 1); - c = temp << 8; - WRITE( 0, data, nz ); - goto inc_pc_loop; - } - - case 0x9F: // XCN - nz = a = (a >> 4) | (uint8_t) (a << 4); - goto loop; - -// 8. 16-BIT TRANSMISION COMMANDS - - case 0xBA: // MOVW YA,dp - a = READ_DP( -2, data ); - nz = (a & 0x7F) | (a >> 1); - y = READ_DP( 0, (uint8_t) (data + 1) ); - nz |= y; - goto inc_pc_loop; - - case 0xDA: // MOVW dp,YA - WRITE_DP( -1, data, a ); - WRITE_DP( 0, (uint8_t) (data + 1), y + no_read_before_write ); - goto inc_pc_loop; - -// 9. 16-BIT OPERATION COMMANDS - - case 0x3A: // INCW dp - case 0x1A:{// DECW dp - int temp; - // low byte - data += dp; - temp = READ( -3, data ); - temp += (opcode >> 4 & 2) - 1; // +1 for INCW, -1 for DECW - nz = ((temp >> 1) | temp) & 0x7F; - WRITE( -2, data, /*(uint8_t)*/ temp ); - - // high byte - data = (uint8_t) (data + 1) + dp; - temp = (uint8_t) ((temp >> 8) + READ( -1, data )); - nz |= temp; - WRITE( 0, data, temp ); - - goto inc_pc_loop; - } - - case 0x7A: // ADDW YA,dp - case 0x9A:{// SUBW YA,dp - int lo = READ_DP( -2, data ); - int hi = READ_DP( 0, (uint8_t) (data + 1) ); - int result; - int flags; - - if ( opcode == 0x9A ) // SUBW - { - lo = (lo ^ 0xFF) + 1; - hi ^= 0xFF; - } - - lo += a; - result = y + hi + (lo >> 8); - flags = hi ^ y ^ result; - - psw = (psw & ~(v40 | h08)) | - (flags >> 1 & h08) | - ((flags + 0x80) >> 2 & v40); - c = result; - a = (uint8_t) lo; - result = (uint8_t) result; - y = result; - nz = (((lo >> 1) | lo) & 0x7F) | result; - - goto inc_pc_loop; - } - - case 0x5A: { // CMPW YA,dp - int temp = a - READ_DP( -1, data ); - nz = ((temp >> 1) | temp) & 0x7F; - temp = y + (temp >> 8); - temp -= READ_DP( 0, (uint8_t) (data + 1) ); - nz |= temp; - c = ~temp; - nz &= 0xFF; - goto inc_pc_loop; - } - -// 10. MULTIPLICATION & DIVISON COMMANDS - - case 0xCF: { // MUL YA - unsigned temp = y * a; - a = (uint8_t) temp; - nz = ((temp >> 1) | temp) & 0x7F; - y = temp >> 8; - nz |= y; - goto loop; - } - - case 0x9E: // DIV YA,X - { - unsigned ya = y * 0x100 + a; - - psw &= ~(h08 | v40); - - if ( y >= x ) - psw |= v40; - - if ( (y & 15) >= (x & 15) ) - psw |= h08; - - if ( y < x * 2 ) - { - a = ya / x; - y = ya - a * x; - } - else - { - a = 255 - (ya - x * 0x200) / (256 - x); - y = x + (ya - x * 0x200) % (256 - x); - } - - nz = (uint8_t) a; - a = (uint8_t) a; - - goto loop; - } - -// 11. DECIMAL COMPENSATION COMMANDS - - case 0xDF: // DAA - SUSPICIOUS_OPCODE( "DAA" ); - if ( a > 0x99 || c & 0x100 ) - { - a += 0x60; - c = 0x100; - } - - if ( (a & 0x0F) > 9 || psw & h08 ) - a += 0x06; - - nz = a; - a = (uint8_t) a; - goto loop; - - case 0xBE: // DAS - SUSPICIOUS_OPCODE( "DAS" ); - if ( a > 0x99 || !(c & 0x100) ) - { - a -= 0x60; - c = 0; - } - - if ( (a & 0x0F) > 9 || !(psw & h08) ) - a -= 0x06; - - nz = a; - a = (uint8_t) a; - goto loop; - -// 12. BRANCHING COMMANDS - - case 0x2F: // BRA rel - pc += (BOOST::int8_t) data; - goto inc_pc_loop; - - case 0x30: // BMI - BRANCH( (nz & nz_neg_mask) ) - - case 0x10: // BPL - BRANCH( !(nz & nz_neg_mask) ) - - case 0xB0: // BCS - BRANCH( c & 0x100 ) - - case 0x90: // BCC - BRANCH( !(c & 0x100) ) - - case 0x70: // BVS - BRANCH( psw & v40 ) - - case 0x50: // BVC - BRANCH( !(psw & v40) ) - - #define CBRANCH( cond )\ - {\ - pc++;\ - if ( cond )\ - goto cbranch_taken_loop;\ - rel_time -= 2;\ - goto inc_pc_loop;\ - } - - case 0x03: // BBS dp.bit,rel - case 0x23: - case 0x43: - case 0x63: - case 0x83: - case 0xA3: - case 0xC3: - case 0xE3: - CBRANCH( READ_DP( -4, data ) >> (opcode >> 5) & 1 ) - - case 0x13: // BBC dp.bit,rel - case 0x33: - case 0x53: - case 0x73: - case 0x93: - case 0xB3: - case 0xD3: - case 0xF3: - CBRANCH( !(READ_DP( -4, data ) >> (opcode >> 5) & 1) ) - - case 0xDE: // CBNE dp+X,rel - data = (uint8_t) (data + x); - // fall through - case 0x2E:{// CBNE dp,rel - int temp; - // 61% from timer - READ_DP_TIMER( -4, data, temp ); - CBRANCH( temp != a ) - } - - case 0x6E: { // DBNZ dp,rel - unsigned temp = READ_DP( -4, data ) - 1; - WRITE_DP( -3, (uint8_t) data, /*(uint8_t)*/ temp + no_read_before_write ); - CBRANCH( temp ) - } - - case 0xFE: // DBNZ Y,rel - y = (uint8_t) (y - 1); - BRANCH( y ) - - case 0x1F: // JMP [abs+X] - SET_PC( READ_PC16( pc ) + x ); - // fall through - case 0x5F: // JMP abs - SET_PC( READ_PC16( pc ) ); - goto loop; - -// 13. SUB-ROUTINE CALL RETURN COMMANDS - - case 0x0F:{// BRK - int temp; - int ret_addr = GET_PC(); - SUSPICIOUS_OPCODE( "BRK" ); - SET_PC( READ_PROG16( 0xFFDE ) ); // vector address verified - PUSH16( ret_addr ); - GET_PSW( temp ); - psw = (psw | b10) & ~i04; - PUSH( temp ); - goto loop; - } - - case 0x4F:{// PCALL offset - int ret_addr = GET_PC() + 1; - SET_PC( 0xFF00 | data ); - PUSH16( ret_addr ); - goto loop; - } - - case 0x01: // TCALL n - case 0x11: - case 0x21: - case 0x31: - case 0x41: - case 0x51: - case 0x61: - case 0x71: - case 0x81: - case 0x91: - case 0xA1: - case 0xB1: - case 0xC1: - case 0xD1: - case 0xE1: - case 0xF1: { - int ret_addr = GET_PC(); - SET_PC( READ_PROG16( 0xFFDE - (opcode >> 3) ) ); - PUSH16( ret_addr ); - goto loop; - } - -// 14. STACK OPERATION COMMANDS - - { - int temp; - case 0x7F: // RET1 - temp = *sp; - SET_PC( GET_LE16( sp + 1 ) ); - sp += 3; - goto set_psw; - case 0x8E: // POP PSW - POP( temp ); - set_psw: - SET_PSW( temp ); - goto loop; - } - - case 0x0D: { // PUSH PSW - int temp; - GET_PSW( temp ); - PUSH( temp ); - goto loop; - } - - case 0x2D: // PUSH A - PUSH( a ); - goto loop; - - case 0x4D: // PUSH X - PUSH( x ); - goto loop; - - case 0x6D: // PUSH Y - PUSH( y ); - goto loop; - - case 0xAE: // POP A - POP( a ); - goto loop; - - case 0xCE: // POP X - POP( x ); - goto loop; - - case 0xEE: // POP Y - POP( y ); - goto loop; - -// 15. BIT OPERATION COMMANDS - - case 0x02: // SET1 - case 0x22: - case 0x42: - case 0x62: - case 0x82: - case 0xA2: - case 0xC2: - case 0xE2: - case 0x12: // CLR1 - case 0x32: - case 0x52: - case 0x72: - case 0x92: - case 0xB2: - case 0xD2: - case 0xF2: { - int bit = 1 << (opcode >> 5); - int mask = ~bit; - if ( opcode & 0x10 ) - bit = 0; - data += dp; - WRITE( 0, data, (READ( -1, data ) & mask) | bit ); - goto inc_pc_loop; - } - - case 0x0E: // TSET1 abs - case 0x4E: // TCLR1 abs - data = READ_PC16( pc ); - pc += 2; - { - unsigned temp = READ( -2, data ); - nz = (uint8_t) (a - temp); - temp &= ~a; - if ( opcode == 0x0E ) - temp |= a; - WRITE( 0, data, temp ); - } - goto loop; - - case 0x4A: // AND1 C,mem.bit - c &= MEM_BIT( 0 ); - pc += 2; - goto loop; - - case 0x6A: // AND1 C,/mem.bit - c &= ~MEM_BIT( 0 ); - pc += 2; - goto loop; - - case 0x0A: // OR1 C,mem.bit - c |= MEM_BIT( -1 ); - pc += 2; - goto loop; - - case 0x2A: // OR1 C,/mem.bit - c |= ~MEM_BIT( -1 ); - pc += 2; - goto loop; - - case 0x8A: // EOR1 C,mem.bit - c ^= MEM_BIT( -1 ); - pc += 2; - goto loop; - - case 0xEA: // NOT1 mem.bit - data = READ_PC16( pc ); - pc += 2; - { - unsigned temp = READ( -1, data & 0x1FFF ); - temp ^= 1 << (data >> 13); - WRITE( 0, data & 0x1FFF, temp ); - } - goto loop; - - case 0xCA: // MOV1 mem.bit,C - data = READ_PC16( pc ); - pc += 2; - { - unsigned temp = READ( -2, data & 0x1FFF ); - unsigned bit = data >> 13; - temp = (temp & ~(1 << bit)) | ((c >> 8 & 1) << bit); - WRITE( 0, data & 0x1FFF, temp + no_read_before_write ); - } - goto loop; - - case 0xAA: // MOV1 C,mem.bit - c = MEM_BIT( 0 ); - pc += 2; - goto loop; - -// 16. PROGRAM PSW FLAG OPERATION COMMANDS - - case 0x60: // CLRC - c = 0; - goto loop; - - case 0x80: // SETC - c = ~0; - goto loop; - - case 0xED: // NOTC - c ^= 0x100; - goto loop; - - case 0xE0: // CLRV - psw &= ~(v40 | h08); - goto loop; - - case 0x20: // CLRP - dp = 0; - goto loop; - - case 0x40: // SETP - dp = 0x100; - goto loop; - - case 0xA0: // EI - SUSPICIOUS_OPCODE( "EI" ); - psw |= i04; - goto loop; - - case 0xC0: // DI - SUSPICIOUS_OPCODE( "DI" ); - psw &= ~i04; - goto loop; - -// 17. OTHER COMMANDS - - case 0x00: // NOP - goto loop; - - case 0xFF:{// STOP - // handle PC wrap-around - unsigned addr = GET_PC() - 1; - if ( addr >= 0x10000 ) - { - addr &= 0xFFFF; - SET_PC( addr ); - dprintf( "SPC: PC wrapped around\n" ); - goto loop; - } - } - // fall through - case 0xEF: // SLEEP - SUSPICIOUS_OPCODE( "STOP/SLEEP" ); - --pc; - rel_time = 0; - m.cpu_error = "SPC emulation error"; - goto stop; - } // switch - - assert( 0 ); // catch any unhandled instructions -} -out_of_time: - rel_time -= m.cycle_table [*pc]; // undo partial execution of opcode -stop: - - // Uncache registers - if ( GET_PC() >= 0x10000 ) - dprintf( "SPC: PC wrapped around\n" ); - m.cpu_regs.pc = (uint16_t) GET_PC(); - m.cpu_regs.sp = ( uint8_t) GET_SP(); - m.cpu_regs.a = ( uint8_t) a; - m.cpu_regs.x = ( uint8_t) x; - m.cpu_regs.y = ( uint8_t) y; - { - int temp; - GET_PSW( temp ); - m.cpu_regs.psw = (uint8_t) temp; - } -} -SPC_CPU_RUN_FUNC_END diff --git a/waterbox/pizza/lib/snes_spc/SPC_DSP.cpp b/waterbox/pizza/lib/snes_spc/SPC_DSP.cpp deleted file mode 100644 index dd180506fc..0000000000 --- a/waterbox/pizza/lib/snes_spc/SPC_DSP.cpp +++ /dev/null @@ -1,1018 +0,0 @@ -// snes_spc 0.9.0. http://www.slack.net/~ant/ - -#include "SPC_DSP.h" - -#include "blargg_endian.h" -#include - -/* Copyright (C) 2007 Shay Green. This module is free software; you -can redistribute it and/or modify it under the terms of the GNU Lesser -General Public License as published by the Free Software Foundation; either -version 2.1 of the License, or (at your option) any later version. This -module is distributed in the hope that it will be useful, but WITHOUT ANY -WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more -details. You should have received a copy of the GNU Lesser General Public -License along with this module; if not, write to the Free Software Foundation, -Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ - -#include "blargg_source.h" - -#ifdef BLARGG_ENABLE_OPTIMIZER - #include BLARGG_ENABLE_OPTIMIZER -#endif - -#if INT_MAX < 0x7FFFFFFF - #error "Requires that int type have at least 32 bits" -#endif - -// TODO: add to blargg_endian.h -#define GET_LE16SA( addr ) ((BOOST::int16_t) GET_LE16( addr )) -#define GET_LE16A( addr ) GET_LE16( addr ) -#define SET_LE16A( addr, data ) SET_LE16( addr, data ) - -static BOOST::uint8_t const initial_regs [SPC_DSP::register_count] = -{ - 0x45,0x8B,0x5A,0x9A,0xE4,0x82,0x1B,0x78,0x00,0x00,0xAA,0x96,0x89,0x0E,0xE0,0x80, - 0x2A,0x49,0x3D,0xBA,0x14,0xA0,0xAC,0xC5,0x00,0x00,0x51,0xBB,0x9C,0x4E,0x7B,0xFF, - 0xF4,0xFD,0x57,0x32,0x37,0xD9,0x42,0x22,0x00,0x00,0x5B,0x3C,0x9F,0x1B,0x87,0x9A, - 0x6F,0x27,0xAF,0x7B,0xE5,0x68,0x0A,0xD9,0x00,0x00,0x9A,0xC5,0x9C,0x4E,0x7B,0xFF, - 0xEA,0x21,0x78,0x4F,0xDD,0xED,0x24,0x14,0x00,0x00,0x77,0xB1,0xD1,0x36,0xC1,0x67, - 0x52,0x57,0x46,0x3D,0x59,0xF4,0x87,0xA4,0x00,0x00,0x7E,0x44,0x9C,0x4E,0x7B,0xFF, - 0x75,0xF5,0x06,0x97,0x10,0xC3,0x24,0xBB,0x00,0x00,0x7B,0x7A,0xE0,0x60,0x12,0x0F, - 0xF7,0x74,0x1C,0xE5,0x39,0x3D,0x73,0xC1,0x00,0x00,0x7A,0xB3,0xFF,0x4E,0x7B,0xFF -}; - -// if ( io < -32768 ) io = -32768; -// if ( io > 32767 ) io = 32767; -#define CLAMP16( io )\ -{\ - if ( (int16_t) io != io )\ - io = (io >> 31) ^ 0x7FFF;\ -} - -// Access global DSP register -#define REG(n) m.regs [r_##n] - -// Access voice DSP register -#define VREG(r,n) r [v_##n] - -#define WRITE_SAMPLES( l, r, out ) \ -{\ - out [0] = l;\ - out [1] = r;\ - out += 2;\ - if ( out >= m.out_end )\ - {\ - check( out == m.out_end );\ - check( m.out_end != &m.extra [extra_size] || \ - (m.extra <= m.out_begin && m.extra < &m.extra [extra_size]) );\ - out = m.extra;\ - m.out_end = &m.extra [extra_size];\ - }\ -}\ - -void SPC_DSP::set_output( sample_t* out, int size ) -{ - require( (size & 1) == 0 ); // must be even - if ( !out ) - { - out = m.extra; - size = extra_size; - } - m.out_begin = out; - m.out = out; - m.out_end = out + size; -} - -// Volume registers and efb are signed! Easy to forget int8_t cast. -// Prefixes are to avoid accidental use of locals with same names. - -// Gaussian interpolation - -static short const gauss [512] = -{ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, - 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 5, 5, 5, 5, - 6, 6, 6, 6, 7, 7, 7, 8, 8, 8, 9, 9, 9, 10, 10, 10, - 11, 11, 11, 12, 12, 13, 13, 14, 14, 15, 15, 15, 16, 16, 17, 17, - 18, 19, 19, 20, 20, 21, 21, 22, 23, 23, 24, 24, 25, 26, 27, 27, - 28, 29, 29, 30, 31, 32, 32, 33, 34, 35, 36, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, - 58, 59, 60, 61, 62, 64, 65, 66, 67, 69, 70, 71, 73, 74, 76, 77, - 78, 80, 81, 83, 84, 86, 87, 89, 90, 92, 94, 95, 97, 99, 100, 102, - 104, 106, 107, 109, 111, 113, 115, 117, 118, 120, 122, 124, 126, 128, 130, 132, - 134, 137, 139, 141, 143, 145, 147, 150, 152, 154, 156, 159, 161, 163, 166, 168, - 171, 173, 175, 178, 180, 183, 186, 188, 191, 193, 196, 199, 201, 204, 207, 210, - 212, 215, 218, 221, 224, 227, 230, 233, 236, 239, 242, 245, 248, 251, 254, 257, - 260, 263, 267, 270, 273, 276, 280, 283, 286, 290, 293, 297, 300, 304, 307, 311, - 314, 318, 321, 325, 328, 332, 336, 339, 343, 347, 351, 354, 358, 362, 366, 370, - 374, 378, 381, 385, 389, 393, 397, 401, 405, 410, 414, 418, 422, 426, 430, 434, - 439, 443, 447, 451, 456, 460, 464, 469, 473, 477, 482, 486, 491, 495, 499, 504, - 508, 513, 517, 522, 527, 531, 536, 540, 545, 550, 554, 559, 563, 568, 573, 577, - 582, 587, 592, 596, 601, 606, 611, 615, 620, 625, 630, 635, 640, 644, 649, 654, - 659, 664, 669, 674, 678, 683, 688, 693, 698, 703, 708, 713, 718, 723, 728, 732, - 737, 742, 747, 752, 757, 762, 767, 772, 777, 782, 787, 792, 797, 802, 806, 811, - 816, 821, 826, 831, 836, 841, 846, 851, 855, 860, 865, 870, 875, 880, 884, 889, - 894, 899, 904, 908, 913, 918, 923, 927, 932, 937, 941, 946, 951, 955, 960, 965, - 969, 974, 978, 983, 988, 992, 997,1001,1005,1010,1014,1019,1023,1027,1032,1036, -1040,1045,1049,1053,1057,1061,1066,1070,1074,1078,1082,1086,1090,1094,1098,1102, -1106,1109,1113,1117,1121,1125,1128,1132,1136,1139,1143,1146,1150,1153,1157,1160, -1164,1167,1170,1174,1177,1180,1183,1186,1190,1193,1196,1199,1202,1205,1207,1210, -1213,1216,1219,1221,1224,1227,1229,1232,1234,1237,1239,1241,1244,1246,1248,1251, -1253,1255,1257,1259,1261,1263,1265,1267,1269,1270,1272,1274,1275,1277,1279,1280, -1282,1283,1284,1286,1287,1288,1290,1291,1292,1293,1294,1295,1296,1297,1297,1298, -1299,1300,1300,1301,1302,1302,1303,1303,1303,1304,1304,1304,1304,1304,1305,1305, -}; - -inline int SPC_DSP::interpolate( voice_t const* v ) -{ - // Make pointers into gaussian based on fractional position between samples - int offset = v->interp_pos >> 4 & 0xFF; - short const* fwd = gauss + 255 - offset; - short const* rev = gauss + offset; // mirror left half of gaussian - - int const* in = &v->buf [(v->interp_pos >> 12) + v->buf_pos]; - int out; - out = (fwd [ 0] * in [0]) >> 11; - out += (fwd [256] * in [1]) >> 11; - out += (rev [256] * in [2]) >> 11; - out = (int16_t) out; - out += (rev [ 0] * in [3]) >> 11; - - CLAMP16( out ); - out &= ~1; - return out; -} - - -//// Counters - -int const simple_counter_range = 2048 * 5 * 3; // 30720 - -static unsigned const counter_rates [32] = -{ - simple_counter_range + 1, // never fires - 2048, 1536, - 1280, 1024, 768, - 640, 512, 384, - 320, 256, 192, - 160, 128, 96, - 80, 64, 48, - 40, 32, 24, - 20, 16, 12, - 10, 8, 6, - 5, 4, 3, - 2, - 1 -}; - -static unsigned const counter_offsets [32] = -{ - 1, 0, 1040, - 536, 0, 1040, - 536, 0, 1040, - 536, 0, 1040, - 536, 0, 1040, - 536, 0, 1040, - 536, 0, 1040, - 536, 0, 1040, - 536, 0, 1040, - 536, 0, 1040, - 0, - 0 -}; - -inline void SPC_DSP::init_counter() -{ - m.counter = 0; -} - -inline void SPC_DSP::run_counters() -{ - if ( --m.counter < 0 ) - m.counter = simple_counter_range - 1; -} - -inline unsigned SPC_DSP::read_counter( int rate ) -{ - return ((unsigned) m.counter + counter_offsets [rate]) % counter_rates [rate]; -} - - -//// Envelope - -inline void SPC_DSP::run_envelope( voice_t* const v ) -{ - int env = v->env; - if ( v->env_mode == env_release ) // 60% - { - if ( (env -= 0x8) < 0 ) - env = 0; - v->env = env; - } - else - { - int rate; - int env_data = VREG(v->regs,adsr1); - if ( m.t_adsr0 & 0x80 ) // 99% ADSR - { - if ( v->env_mode >= env_decay ) // 99% - { - env--; - env -= env >> 8; - rate = env_data & 0x1F; - if ( v->env_mode == env_decay ) // 1% - rate = (m.t_adsr0 >> 3 & 0x0E) + 0x10; - } - else // env_attack - { - rate = (m.t_adsr0 & 0x0F) * 2 + 1; - env += rate < 31 ? 0x20 : 0x400; - } - } - else // GAIN - { - int mode; - env_data = VREG(v->regs,gain); - mode = env_data >> 5; - if ( mode < 4 ) // direct - { - env = env_data * 0x10; - rate = 31; - } - else - { - rate = env_data & 0x1F; - if ( mode == 4 ) // 4: linear decrease - { - env -= 0x20; - } - else if ( mode < 6 ) // 5: exponential decrease - { - env--; - env -= env >> 8; - } - else // 6,7: linear increase - { - env += 0x20; - if ( mode > 6 && (unsigned) v->hidden_env >= 0x600 ) - env += 0x8 - 0x20; // 7: two-slope linear increase - } - } - } - - // Sustain level - if ( (env >> 8) == (env_data >> 5) && v->env_mode == env_decay ) - v->env_mode = env_sustain; - - v->hidden_env = env; - - // unsigned cast because linear decrease going negative also triggers this - if ( (unsigned) env > 0x7FF ) - { - env = (env < 0 ? 0 : 0x7FF); - if ( v->env_mode == env_attack ) - v->env_mode = env_decay; - } - - if ( !read_counter( rate ) ) - v->env = env; // nothing else is controlled by the counter - } -} - - -//// BRR Decoding - -inline void SPC_DSP::decode_brr( voice_t* v ) -{ - // Arrange the four input nybbles in 0xABCD order for easy decoding - int nybbles = m.t_brr_byte * 0x100 + m.ram [(v->brr_addr + v->brr_offset + 1) & 0xFFFF]; - - int const header = m.t_brr_header; - - // Write to next four samples in circular buffer - int* pos = &v->buf [v->buf_pos]; - int* end; - if ( (v->buf_pos += 4) >= brr_buf_size ) - v->buf_pos = 0; - - // Decode four samples - for ( end = pos + 4; pos < end; pos++, nybbles <<= 4 ) - { - // Extract nybble and sign-extend - int s = (int16_t) nybbles >> 12; - - // Shift sample based on header - int const shift = header >> 4; - s = (s << shift) >> 1; - if ( shift >= 0xD ) // handle invalid range - s = (s >> 25) << 11; // same as: s = (s < 0 ? -0x800 : 0) - - // Apply IIR filter (8 is the most commonly used) - int const filter = header & 0x0C; - int const p1 = pos [brr_buf_size - 1]; - int const p2 = pos [brr_buf_size - 2] >> 1; - if ( filter >= 8 ) - { - s += p1; - s -= p2; - if ( filter == 8 ) // s += p1 * 0.953125 - p2 * 0.46875 - { - s += p2 >> 4; - s += (p1 * -3) >> 6; - } - else // s += p1 * 0.8984375 - p2 * 0.40625 - { - s += (p1 * -13) >> 7; - s += (p2 * 3) >> 4; - } - } - else if ( filter ) // s += p1 * 0.46875 - { - s += p1 >> 1; - s += (-p1) >> 5; - } - - // Adjust and write sample - CLAMP16( s ); - s = (int16_t) (s * 2); - pos [brr_buf_size] = pos [0] = s; // second copy simplifies wrap-around - } -} - - -//// Misc - -#define MISC_CLOCK( n ) inline void SPC_DSP::misc_##n() - -MISC_CLOCK( 27 ) -{ - m.t_pmon = REG(pmon) & 0xFE; // voice 0 doesn't support PMON -} -MISC_CLOCK( 28 ) -{ - m.t_non = REG(non); - m.t_eon = REG(eon); - m.t_dir = REG(dir); -} -MISC_CLOCK( 29 ) -{ - if ( (m.every_other_sample ^= 1) != 0 ) - m.new_kon &= ~m.kon; // clears KON 63 clocks after it was last read -} -MISC_CLOCK( 30 ) -{ - if ( m.every_other_sample ) - { - m.kon = m.new_kon; - m.t_koff = REG(koff) | m.mute_mask; - } - - run_counters(); - - // Noise - if ( !read_counter( REG(flg) & 0x1F ) ) - { - int feedback = (m.noise << 13) ^ (m.noise << 14); - m.noise = (feedback & 0x4000) ^ (m.noise >> 1); - } -} - - -//// Voices - -#define VOICE_CLOCK( n ) void SPC_DSP::voice_##n( voice_t* const v ) - -inline VOICE_CLOCK( V1 ) -{ - m.t_dir_addr = m.t_dir * 0x100 + m.t_srcn * 4; - m.t_srcn = VREG(v->regs,srcn); -} -inline VOICE_CLOCK( V2 ) -{ - // Read sample pointer (ignored if not needed) - uint8_t const* entry = &m.ram [m.t_dir_addr]; - if ( !v->kon_delay ) - entry += 2; - m.t_brr_next_addr = GET_LE16A( entry ); - - m.t_adsr0 = VREG(v->regs,adsr0); - - // Read pitch, spread over two clocks - m.t_pitch = VREG(v->regs,pitchl); -} -inline VOICE_CLOCK( V3a ) -{ - m.t_pitch += (VREG(v->regs,pitchh) & 0x3F) << 8; -} -inline VOICE_CLOCK( V3b ) -{ - // Read BRR header and byte - m.t_brr_byte = m.ram [(v->brr_addr + v->brr_offset) & 0xFFFF]; - m.t_brr_header = m.ram [v->brr_addr]; // brr_addr doesn't need masking -} -VOICE_CLOCK( V3c ) -{ - // Pitch modulation using previous voice's output - if ( m.t_pmon & v->vbit ) - m.t_pitch += ((m.t_output >> 5) * m.t_pitch) >> 10; - - if ( v->kon_delay ) - { - // Get ready to start BRR decoding on next sample - if ( v->kon_delay == 5 ) - { - v->brr_addr = m.t_brr_next_addr; - v->brr_offset = 1; - v->buf_pos = 0; - m.t_brr_header = 0; // header is ignored on this sample - m.kon_check = true; - } - - // Envelope is never run during KON - v->env = 0; - v->hidden_env = 0; - - // Disable BRR decoding until last three samples - v->interp_pos = 0; - if ( --v->kon_delay & 3 ) - v->interp_pos = 0x4000; - - // Pitch is never added during KON - m.t_pitch = 0; - } - - // Gaussian interpolation - { - int output = interpolate( v ); - - // Noise - if ( m.t_non & v->vbit ) - output = (int16_t) (m.noise * 2); - - // Apply envelope - m.t_output = (output * v->env) >> 11 & ~1; - v->t_envx_out = (uint8_t) (v->env >> 4); - } - - // Immediate silence due to end of sample or soft reset - if ( REG(flg) & 0x80 || (m.t_brr_header & 3) == 1 ) - { - v->env_mode = env_release; - v->env = 0; - } - - if ( m.every_other_sample ) - { - // KOFF - if ( m.t_koff & v->vbit ) - v->env_mode = env_release; - - // KON - if ( m.kon & v->vbit ) - { - v->kon_delay = 5; - v->env_mode = env_attack; - } - } - - // Run envelope for next sample - if ( !v->kon_delay ) - run_envelope( v ); -} -inline void SPC_DSP::voice_output( voice_t const* v, int ch ) -{ - // Apply left/right volume - int amp = (m.t_output * (int8_t) VREG(v->regs,voll + ch)) >> 7; - - // Add to output total - m.t_main_out [ch] += amp; - CLAMP16( m.t_main_out [ch] ); - - // Optionally add to echo total - if ( m.t_eon & v->vbit ) - { - m.t_echo_out [ch] += amp; - CLAMP16( m.t_echo_out [ch] ); - } -} -VOICE_CLOCK( V4 ) -{ - // Decode BRR - m.t_looped = 0; - if ( v->interp_pos >= 0x4000 ) - { - decode_brr( v ); - - if ( (v->brr_offset += 2) >= brr_block_size ) - { - // Start decoding next BRR block - assert( v->brr_offset == brr_block_size ); - v->brr_addr = (v->brr_addr + brr_block_size) & 0xFFFF; - if ( m.t_brr_header & 1 ) - { - v->brr_addr = m.t_brr_next_addr; - m.t_looped = v->vbit; - } - v->brr_offset = 1; - } - } - - // Apply pitch - v->interp_pos = (v->interp_pos & 0x3FFF) + m.t_pitch; - - // Keep from getting too far ahead (when using pitch modulation) - if ( v->interp_pos > 0x7FFF ) - v->interp_pos = 0x7FFF; - - // Output left - voice_output( v, 0 ); -} -inline VOICE_CLOCK( V5 ) -{ - // Output right - voice_output( v, 1 ); - - // ENDX, OUTX, and ENVX won't update if you wrote to them 1-2 clocks earlier - int endx_buf = REG(endx) | m.t_looped; - - // Clear bit in ENDX if KON just began - if ( v->kon_delay == 5 ) - endx_buf &= ~v->vbit; - m.endx_buf = (uint8_t) endx_buf; -} -inline VOICE_CLOCK( V6 ) -{ - (void) v; // avoid compiler warning about unused v - m.outx_buf = (uint8_t) (m.t_output >> 8); -} -inline VOICE_CLOCK( V7 ) -{ - // Update ENDX - REG(endx) = m.endx_buf; - - m.envx_buf = v->t_envx_out; -} -inline VOICE_CLOCK( V8 ) -{ - // Update OUTX - VREG(v->regs,outx) = m.outx_buf; -} -inline VOICE_CLOCK( V9 ) -{ - // Update ENVX - VREG(v->regs,envx) = m.envx_buf; -} - -// Most voices do all these in one clock, so make a handy composite -inline VOICE_CLOCK( V3 ) -{ - voice_V3a( v ); - voice_V3b( v ); - voice_V3c( v ); -} - -// Common combinations of voice steps on different voices. This greatly reduces -// code size and allows everything to be inlined in these functions. -VOICE_CLOCK(V7_V4_V1) { voice_V7(v); voice_V1(v+3); voice_V4(v+1); } -VOICE_CLOCK(V8_V5_V2) { voice_V8(v); voice_V5(v+1); voice_V2(v+2); } -VOICE_CLOCK(V9_V6_V3) { voice_V9(v); voice_V6(v+1); voice_V3(v+2); } - - -//// Echo - -// Current echo buffer pointer for left/right channel -#define ECHO_PTR( ch ) (&m.ram [m.t_echo_ptr + ch * 2]) - -// Sample in echo history buffer, where 0 is the oldest -#define ECHO_FIR( i ) (m.echo_hist_pos [i]) - -// Calculate FIR point for left/right channel -#define CALC_FIR( i, ch ) ((ECHO_FIR( i + 1 ) [ch] * (int8_t) REG(fir + i * 0x10)) >> 6) - -#define ECHO_CLOCK( n ) inline void SPC_DSP::echo_##n() - -inline void SPC_DSP::echo_read( int ch ) -{ - int s = GET_LE16SA( ECHO_PTR( ch ) ); - // second copy simplifies wrap-around handling - ECHO_FIR( 0 ) [ch] = ECHO_FIR( 8 ) [ch] = s >> 1; -} - -ECHO_CLOCK( 22 ) -{ - // History - if ( ++m.echo_hist_pos >= &m.echo_hist [echo_hist_size] ) - m.echo_hist_pos = m.echo_hist; - - m.t_echo_ptr = (m.t_esa * 0x100 + m.echo_offset) & 0xFFFF; - echo_read( 0 ); - - // FIR (using l and r temporaries below helps compiler optimize) - int l = CALC_FIR( 0, 0 ); - int r = CALC_FIR( 0, 1 ); - - m.t_echo_in [0] = l; - m.t_echo_in [1] = r; -} -ECHO_CLOCK( 23 ) -{ - int l = CALC_FIR( 1, 0 ) + CALC_FIR( 2, 0 ); - int r = CALC_FIR( 1, 1 ) + CALC_FIR( 2, 1 ); - - m.t_echo_in [0] += l; - m.t_echo_in [1] += r; - - echo_read( 1 ); -} -ECHO_CLOCK( 24 ) -{ - int l = CALC_FIR( 3, 0 ) + CALC_FIR( 4, 0 ) + CALC_FIR( 5, 0 ); - int r = CALC_FIR( 3, 1 ) + CALC_FIR( 4, 1 ) + CALC_FIR( 5, 1 ); - - m.t_echo_in [0] += l; - m.t_echo_in [1] += r; -} -ECHO_CLOCK( 25 ) -{ - int l = m.t_echo_in [0] + CALC_FIR( 6, 0 ); - int r = m.t_echo_in [1] + CALC_FIR( 6, 1 ); - - l = (int16_t) l; - r = (int16_t) r; - - l += (int16_t) CALC_FIR( 7, 0 ); - r += (int16_t) CALC_FIR( 7, 1 ); - - CLAMP16( l ); - CLAMP16( r ); - - m.t_echo_in [0] = l & ~1; - m.t_echo_in [1] = r & ~1; -} -inline int SPC_DSP::echo_output( int ch ) -{ - int out = (int16_t) ((m.t_main_out [ch] * (int8_t) REG(mvoll + ch * 0x10)) >> 7) + - (int16_t) ((m.t_echo_in [ch] * (int8_t) REG(evoll + ch * 0x10)) >> 7); - CLAMP16( out ); - return out; -} -ECHO_CLOCK( 26 ) -{ - // Left output volumes - // (save sample for next clock so we can output both together) - m.t_main_out [0] = echo_output( 0 ); - - // Echo feedback - int l = m.t_echo_out [0] + (int16_t) ((m.t_echo_in [0] * (int8_t) REG(efb)) >> 7); - int r = m.t_echo_out [1] + (int16_t) ((m.t_echo_in [1] * (int8_t) REG(efb)) >> 7); - - CLAMP16( l ); - CLAMP16( r ); - - m.t_echo_out [0] = l & ~1; - m.t_echo_out [1] = r & ~1; -} -ECHO_CLOCK( 27 ) -{ - // Output - int l = m.t_main_out [0]; - int r = echo_output( 1 ); - m.t_main_out [0] = 0; - m.t_main_out [1] = 0; - - // TODO: global muting isn't this simple (turns DAC on and off - // or something, causing small ~37-sample pulse when first muted) - if ( REG(flg) & 0x40 ) - { - l = 0; - r = 0; - } - - // Output sample to DAC - #ifdef SPC_DSP_OUT_HOOK - SPC_DSP_OUT_HOOK( l, r ); - #else - sample_t* out = m.out; - WRITE_SAMPLES( l, r, out ); - m.out = out; - #endif -} -ECHO_CLOCK( 28 ) -{ - m.t_echo_enabled = REG(flg); -} -inline void SPC_DSP::echo_write( int ch ) -{ - if ( !(m.t_echo_enabled & 0x20) ) - SET_LE16A( ECHO_PTR( ch ), m.t_echo_out [ch] ); - m.t_echo_out [ch] = 0; -} -ECHO_CLOCK( 29 ) -{ - m.t_esa = REG(esa); - - if ( !m.echo_offset ) - m.echo_length = (REG(edl) & 0x0F) * 0x800; - - m.echo_offset += 4; - if ( m.echo_offset >= m.echo_length ) - m.echo_offset = 0; - - // Write left echo - echo_write( 0 ); - - m.t_echo_enabled = REG(flg); -} -ECHO_CLOCK( 30 ) -{ - // Write right echo - echo_write( 1 ); -} - - -//// Timing - -// Execute clock for a particular voice -#define V( clock, voice ) voice_##clock( &m.voices [voice] ); - -/* The most common sequence of clocks uses composite operations -for efficiency. For example, the following are equivalent to the -individual steps on the right: - -V(V7_V4_V1,2) -> V(V7,2) V(V4,3) V(V1,5) -V(V8_V5_V2,2) -> V(V8,2) V(V5,3) V(V2,4) -V(V9_V6_V3,2) -> V(V9,2) V(V6,3) V(V3,4) */ - -// Voice 0 1 2 3 4 5 6 7 -#define GEN_DSP_TIMING \ -PHASE( 0) V(V5,0)V(V2,1)\ -PHASE( 1) V(V6,0)V(V3,1)\ -PHASE( 2) V(V7_V4_V1,0)\ -PHASE( 3) V(V8_V5_V2,0)\ -PHASE( 4) V(V9_V6_V3,0)\ -PHASE( 5) V(V7_V4_V1,1)\ -PHASE( 6) V(V8_V5_V2,1)\ -PHASE( 7) V(V9_V6_V3,1)\ -PHASE( 8) V(V7_V4_V1,2)\ -PHASE( 9) V(V8_V5_V2,2)\ -PHASE(10) V(V9_V6_V3,2)\ -PHASE(11) V(V7_V4_V1,3)\ -PHASE(12) V(V8_V5_V2,3)\ -PHASE(13) V(V9_V6_V3,3)\ -PHASE(14) V(V7_V4_V1,4)\ -PHASE(15) V(V8_V5_V2,4)\ -PHASE(16) V(V9_V6_V3,4)\ -PHASE(17) V(V1,0) V(V7,5)V(V4,6)\ -PHASE(18) V(V8_V5_V2,5)\ -PHASE(19) V(V9_V6_V3,5)\ -PHASE(20) V(V1,1) V(V7,6)V(V4,7)\ -PHASE(21) V(V8,6)V(V5,7) V(V2,0) /* t_brr_next_addr order dependency */\ -PHASE(22) V(V3a,0) V(V9,6)V(V6,7) echo_22();\ -PHASE(23) V(V7,7) echo_23();\ -PHASE(24) V(V8,7) echo_24();\ -PHASE(25) V(V3b,0) V(V9,7) echo_25();\ -PHASE(26) echo_26();\ -PHASE(27) misc_27(); echo_27();\ -PHASE(28) misc_28(); echo_28();\ -PHASE(29) misc_29(); echo_29();\ -PHASE(30) misc_30();V(V3c,0) echo_30();\ -PHASE(31) V(V4,0) V(V1,2)\ - -#if !SPC_DSP_CUSTOM_RUN - -void SPC_DSP::run( int clocks_remain ) -{ - require( clocks_remain > 0 ); - - int const phase = m.phase; - m.phase = (phase + clocks_remain) & 31; - switch ( phase ) - { - loop: - - #define PHASE( n ) if ( n && !--clocks_remain ) break; case n: - GEN_DSP_TIMING - #undef PHASE - - if ( --clocks_remain ) - goto loop; - } -} - -#endif - - -//// Setup - -void SPC_DSP::init( void* ram_64k ) -{ - m.ram = (uint8_t*) ram_64k; - mute_voices( 0 ); - disable_surround( false ); - set_output( 0, 0 ); - reset(); - - #ifndef NDEBUG - // be sure this sign-extends - assert( (int16_t) 0x8000 == -0x8000 ); - - // be sure right shift preserves sign - assert( (-1 >> 1) == -1 ); - - // check clamp macro - int i; - i = +0x8000; CLAMP16( i ); assert( i == +0x7FFF ); - i = -0x8001; CLAMP16( i ); assert( i == -0x8000 ); - - blargg_verify_byte_order(); - #endif -} - -void SPC_DSP::soft_reset_common() -{ - require( m.ram ); // init() must have been called already - - m.noise = 0x4000; - m.echo_hist_pos = m.echo_hist; - m.every_other_sample = 1; - m.echo_offset = 0; - m.phase = 0; - - init_counter(); -} - -void SPC_DSP::soft_reset() -{ - REG(flg) = 0xE0; - soft_reset_common(); -} - -void SPC_DSP::load( uint8_t const regs [register_count] ) -{ - memcpy( m.regs, regs, sizeof m.regs ); - memset( &m.regs [register_count], 0, offsetof (state_t,ram) - register_count ); - - // Internal state - for ( int i = voice_count; --i >= 0; ) - { - voice_t* v = &m.voices [i]; - v->brr_offset = 1; - v->vbit = 1 << i; - v->regs = &m.regs [i * 0x10]; - } - m.new_kon = REG(kon); - m.t_dir = REG(dir); - m.t_esa = REG(esa); - - soft_reset_common(); -} - -void SPC_DSP::reset() { load( initial_regs ); } - - -//// State save/load - -#if !SPC_NO_COPY_STATE_FUNCS - -void SPC_State_Copier::copy( void* state, size_t size ) -{ - func( buf, state, size ); -} - -int SPC_State_Copier::copy_int( int state, int size ) -{ - BOOST::uint8_t s [2]; - SET_LE16( s, state ); - func( buf, &s, size ); - return GET_LE16( s ); -} - -void SPC_State_Copier::skip( int count ) -{ - if ( count > 0 ) - { - char temp [64]; - memset( temp, 0, sizeof temp ); - do - { - int n = sizeof temp; - if ( n > count ) - n = count; - count -= n; - func( buf, temp, n ); - } - while ( count ); - } -} - -void SPC_State_Copier::extra() -{ - int n = 0; - SPC_State_Copier& copier = *this; - SPC_COPY( uint8_t, n ); - skip( n ); -} - -void SPC_DSP::copy_state( unsigned char** io, copy_func_t copy ) -{ - SPC_State_Copier copier( io, copy ); - - // DSP registers - copier.copy( m.regs, register_count ); - - // Internal state - - // Voices - int i; - for ( i = 0; i < voice_count; i++ ) - { - voice_t* v = &m.voices [i]; - - // BRR buffer - int i; - for ( i = 0; i < brr_buf_size; i++ ) - { - int s = v->buf [i]; - SPC_COPY( int16_t, s ); - v->buf [i] = v->buf [i + brr_buf_size] = s; - } - - SPC_COPY( uint16_t, v->interp_pos ); - SPC_COPY( uint16_t, v->brr_addr ); - SPC_COPY( uint16_t, v->env ); - SPC_COPY( int16_t, v->hidden_env ); - SPC_COPY( uint8_t, v->buf_pos ); - SPC_COPY( uint8_t, v->brr_offset ); - SPC_COPY( uint8_t, v->kon_delay ); - { - int m = v->env_mode; - SPC_COPY( uint8_t, m ); - v->env_mode = (enum env_mode_t) m; - } - SPC_COPY( uint8_t, v->t_envx_out ); - - copier.extra(); - } - - // Echo history - for ( i = 0; i < echo_hist_size; i++ ) - { - int j; - for ( j = 0; j < 2; j++ ) - { - int s = m.echo_hist_pos [i] [j]; - SPC_COPY( int16_t, s ); - m.echo_hist [i] [j] = s; // write back at offset 0 - } - } - m.echo_hist_pos = m.echo_hist; - memcpy( &m.echo_hist [echo_hist_size], m.echo_hist, echo_hist_size * sizeof m.echo_hist [0] ); - - // Misc - SPC_COPY( uint8_t, m.every_other_sample ); - SPC_COPY( uint8_t, m.kon ); - - SPC_COPY( uint16_t, m.noise ); - SPC_COPY( uint16_t, m.counter ); - SPC_COPY( uint16_t, m.echo_offset ); - SPC_COPY( uint16_t, m.echo_length ); - SPC_COPY( uint8_t, m.phase ); - - SPC_COPY( uint8_t, m.new_kon ); - SPC_COPY( uint8_t, m.endx_buf ); - SPC_COPY( uint8_t, m.envx_buf ); - SPC_COPY( uint8_t, m.outx_buf ); - - SPC_COPY( uint8_t, m.t_pmon ); - SPC_COPY( uint8_t, m.t_non ); - SPC_COPY( uint8_t, m.t_eon ); - SPC_COPY( uint8_t, m.t_dir ); - SPC_COPY( uint8_t, m.t_koff ); - - SPC_COPY( uint16_t, m.t_brr_next_addr ); - SPC_COPY( uint8_t, m.t_adsr0 ); - SPC_COPY( uint8_t, m.t_brr_header ); - SPC_COPY( uint8_t, m.t_brr_byte ); - SPC_COPY( uint8_t, m.t_srcn ); - SPC_COPY( uint8_t, m.t_esa ); - SPC_COPY( uint8_t, m.t_echo_enabled ); - - SPC_COPY( int16_t, m.t_main_out [0] ); - SPC_COPY( int16_t, m.t_main_out [1] ); - SPC_COPY( int16_t, m.t_echo_out [0] ); - SPC_COPY( int16_t, m.t_echo_out [1] ); - SPC_COPY( int16_t, m.t_echo_in [0] ); - SPC_COPY( int16_t, m.t_echo_in [1] ); - - SPC_COPY( uint16_t, m.t_dir_addr ); - SPC_COPY( uint16_t, m.t_pitch ); - SPC_COPY( int16_t, m.t_output ); - SPC_COPY( uint16_t, m.t_echo_ptr ); - SPC_COPY( uint8_t, m.t_looped ); - - copier.extra(); -} -#endif diff --git a/waterbox/pizza/lib/snes_spc/SPC_DSP.h b/waterbox/pizza/lib/snes_spc/SPC_DSP.h deleted file mode 100644 index 4522ace915..0000000000 --- a/waterbox/pizza/lib/snes_spc/SPC_DSP.h +++ /dev/null @@ -1,304 +0,0 @@ -// Highly accurate SNES SPC-700 DSP emulator - -// snes_spc 0.9.0 -#ifndef SPC_DSP_H -#define SPC_DSP_H - -#include "blargg_common.h" - -extern "C" { typedef void (*dsp_copy_func_t)( unsigned char** io, void* state, size_t ); } - -class SPC_DSP { -public: - typedef BOOST::uint8_t uint8_t; - -// Setup - - // Initializes DSP and has it use the 64K RAM provided - void init( void* ram_64k ); - - // Sets destination for output samples. If out is NULL or out_size is 0, - // doesn't generate any. - typedef short sample_t; - void set_output( sample_t* out, int out_size ); - - // Number of samples written to output since it was last set, always - // a multiple of 2. Undefined if more samples were generated than - // output buffer could hold. - int sample_count() const; - -// Emulation - - // Resets DSP to power-on state - void reset(); - - // Emulates pressing reset switch on SNES - void soft_reset(); - - // Reads/writes DSP registers. For accuracy, you must first call run() - // to catch the DSP up to present. - int read ( int addr ) const; - void write( int addr, int data ); - - // Runs DSP for specified number of clocks (~1024000 per second). Every 32 clocks - // a pair of samples is be generated. - void run( int clock_count ); - -// Sound control - - // Mutes voices corresponding to non-zero bits in mask (issues repeated KOFF events). - // Reduces emulation accuracy. - enum { voice_count = 8 }; - void mute_voices( int mask ); - -// State - - // Resets DSP and uses supplied values to initialize registers - enum { register_count = 128 }; - void load( uint8_t const regs [register_count] ); - - // Saves/loads exact emulator state - enum { state_size = 640 }; // maximum space needed when saving - typedef dsp_copy_func_t copy_func_t; - void copy_state( unsigned char** io, copy_func_t ); - - // Returns non-zero if new key-on events occurred since last call - bool check_kon(); - -// DSP register addresses - - // Global registers - enum { - r_mvoll = 0x0C, r_mvolr = 0x1C, - r_evoll = 0x2C, r_evolr = 0x3C, - r_kon = 0x4C, r_koff = 0x5C, - r_flg = 0x6C, r_endx = 0x7C, - r_efb = 0x0D, r_pmon = 0x2D, - r_non = 0x3D, r_eon = 0x4D, - r_dir = 0x5D, r_esa = 0x6D, - r_edl = 0x7D, - r_fir = 0x0F // 8 coefficients at 0x0F, 0x1F ... 0x7F - }; - - // Voice registers - enum { - v_voll = 0x00, v_volr = 0x01, - v_pitchl = 0x02, v_pitchh = 0x03, - v_srcn = 0x04, v_adsr0 = 0x05, - v_adsr1 = 0x06, v_gain = 0x07, - v_envx = 0x08, v_outx = 0x09 - }; - -public: - enum { extra_size = 16 }; - sample_t* extra() { return m.extra; } - sample_t const* out_pos() const { return m.out; } - void disable_surround( bool ) { } // not supported -public: - BLARGG_DISABLE_NOTHROW - - typedef BOOST::int8_t int8_t; - typedef BOOST::int16_t int16_t; - - enum { echo_hist_size = 8 }; - - enum env_mode_t { env_release, env_attack, env_decay, env_sustain }; - enum { brr_buf_size = 12 }; - struct voice_t - { - int buf [brr_buf_size*2];// decoded samples (twice the size to simplify wrap handling) - int buf_pos; // place in buffer where next samples will be decoded - int interp_pos; // relative fractional position in sample (0x1000 = 1.0) - int brr_addr; // address of current BRR block - int brr_offset; // current decoding offset in BRR block - uint8_t* regs; // pointer to voice's DSP registers - int vbit; // bitmask for voice: 0x01 for voice 0, 0x02 for voice 1, etc. - int kon_delay; // KON delay/current setup phase - env_mode_t env_mode; - int env; // current envelope level - int hidden_env; // used by GAIN mode 7, very obscure quirk - uint8_t t_envx_out; - }; -private: - enum { brr_block_size = 9 }; - - struct state_t - { - uint8_t regs [register_count]; - - // Echo history keeps most recent 8 samples (twice the size to simplify wrap handling) - int echo_hist [echo_hist_size * 2] [2]; - int (*echo_hist_pos) [2]; // &echo_hist [0 to 7] - - int every_other_sample; // toggles every sample - int kon; // KON value when last checked - int noise; - int counter; - int echo_offset; // offset from ESA in echo buffer - int echo_length; // number of bytes that echo_offset will stop at - int phase; // next clock cycle to run (0-31) - bool kon_check; // set when a new KON occurs - - // Hidden registers also written to when main register is written to - int new_kon; - uint8_t endx_buf; - uint8_t envx_buf; - uint8_t outx_buf; - - // Temporary state between clocks - - // read once per sample - int t_pmon; - int t_non; - int t_eon; - int t_dir; - int t_koff; - - // read a few clocks ahead then used - int t_brr_next_addr; - int t_adsr0; - int t_brr_header; - int t_brr_byte; - int t_srcn; - int t_esa; - int t_echo_enabled; - - // internal state that is recalculated every sample - int t_dir_addr; - int t_pitch; - int t_output; - int t_looped; - int t_echo_ptr; - - // left/right sums - int t_main_out [2]; - int t_echo_out [2]; - int t_echo_in [2]; - - voice_t voices [voice_count]; - - // non-emulation state - uint8_t* ram; // 64K shared RAM between DSP and SMP - int mute_mask; - sample_t* out; - sample_t* out_end; - sample_t* out_begin; - sample_t extra [extra_size]; - }; - state_t m; - - void init_counter(); - void run_counters(); - unsigned read_counter( int rate ); - - int interpolate( voice_t const* v ); - void run_envelope( voice_t* const v ); - void decode_brr( voice_t* v ); - - void misc_27(); - void misc_28(); - void misc_29(); - void misc_30(); - - void voice_output( voice_t const* v, int ch ); - void voice_V1( voice_t* const ); - void voice_V2( voice_t* const ); - void voice_V3( voice_t* const ); - void voice_V3a( voice_t* const ); - void voice_V3b( voice_t* const ); - void voice_V3c( voice_t* const ); - void voice_V4( voice_t* const ); - void voice_V5( voice_t* const ); - void voice_V6( voice_t* const ); - void voice_V7( voice_t* const ); - void voice_V8( voice_t* const ); - void voice_V9( voice_t* const ); - void voice_V7_V4_V1( voice_t* const ); - void voice_V8_V5_V2( voice_t* const ); - void voice_V9_V6_V3( voice_t* const ); - - void echo_read( int ch ); - int echo_output( int ch ); - void echo_write( int ch ); - void echo_22(); - void echo_23(); - void echo_24(); - void echo_25(); - void echo_26(); - void echo_27(); - void echo_28(); - void echo_29(); - void echo_30(); - - void soft_reset_common(); -}; - -#include - -inline int SPC_DSP::sample_count() const { return m.out - m.out_begin; } - -inline int SPC_DSP::read( int addr ) const -{ - assert( (unsigned) addr < register_count ); - return m.regs [addr]; -} - -inline void SPC_DSP::write( int addr, int data ) -{ - assert( (unsigned) addr < register_count ); - - m.regs [addr] = (uint8_t) data; - switch ( addr & 0x0F ) - { - case v_envx: - m.envx_buf = (uint8_t) data; - break; - - case v_outx: - m.outx_buf = (uint8_t) data; - break; - - case 0x0C: - if ( addr == r_kon ) - m.new_kon = (uint8_t) data; - - if ( addr == r_endx ) // always cleared, regardless of data written - { - m.endx_buf = 0; - m.regs [r_endx] = 0; - } - break; - } -} - -inline void SPC_DSP::mute_voices( int mask ) { m.mute_mask = mask; } - -inline bool SPC_DSP::check_kon() -{ - bool old = m.kon_check; - m.kon_check = 0; - return old; -} - -#if !SPC_NO_COPY_STATE_FUNCS - -class SPC_State_Copier { - SPC_DSP::copy_func_t func; - unsigned char** buf; -public: - SPC_State_Copier( unsigned char** p, SPC_DSP::copy_func_t f ) { func = f; buf = p; } - void copy( void* state, size_t size ); - int copy_int( int state, int size ); - void skip( int count ); - void extra(); -}; - -#define SPC_COPY( type, state )\ -{\ - state = (BOOST::type) copier.copy_int( state, sizeof (BOOST::type) );\ - assert( (BOOST::type) state == state );\ -} - -#endif - -#endif diff --git a/waterbox/pizza/lib/snes_spc/SPC_Filter.cpp b/waterbox/pizza/lib/snes_spc/SPC_Filter.cpp deleted file mode 100644 index b3d5770822..0000000000 --- a/waterbox/pizza/lib/snes_spc/SPC_Filter.cpp +++ /dev/null @@ -1,68 +0,0 @@ -// snes_spc 0.9.0. http://www.slack.net/~ant/ - -#include "SPC_Filter.h" - -#include - -/* Copyright (C) 2007 Shay Green. This module is free software; you -can redistribute it and/or modify it under the terms of the GNU Lesser -General Public License as published by the Free Software Foundation; either -version 2.1 of the License, or (at your option) any later version. This -module is distributed in the hope that it will be useful, but WITHOUT ANY -WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more -details. You should have received a copy of the GNU Lesser General Public -License along with this module; if not, write to the Free Software Foundation, -Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ - -#include "blargg_source.h" - -void SPC_Filter::clear() { memset( ch, 0, sizeof ch ); } - -SPC_Filter::SPC_Filter() -{ - gain = gain_unit; - bass = bass_norm; - clear(); -} - -void SPC_Filter::run( short* io, int count ) -{ - require( (count & 1) == 0 ); // must be even - - int const gain = this->gain; - int const bass = this->bass; - chan_t* c = &ch [2]; - do - { - // cache in registers - int sum = (--c)->sum; - int pp1 = c->pp1; - int p1 = c->p1; - - for ( int i = 0; i < count; i += 2 ) - { - // Low-pass filter (two point FIR with coeffs 0.25, 0.75) - int f = io [i] + p1; - p1 = io [i] * 3; - - // High-pass filter ("leaky integrator") - int delta = f - pp1; - pp1 = f; - int s = sum >> (gain_bits + 2); - sum += (delta * gain) - (sum >> bass); - - // Clamp to 16 bits - if ( (short) s != s ) - s = (s >> 31) ^ 0x7FFF; - - io [i] = (short) s; - } - - c->p1 = p1; - c->pp1 = pp1; - c->sum = sum; - ++io; - } - while ( c != ch ); -} diff --git a/waterbox/pizza/lib/snes_spc/SPC_Filter.h b/waterbox/pizza/lib/snes_spc/SPC_Filter.h deleted file mode 100644 index d5c83cb8f1..0000000000 --- a/waterbox/pizza/lib/snes_spc/SPC_Filter.h +++ /dev/null @@ -1,47 +0,0 @@ -// Simple low-pass and high-pass filter to better match sound output of a SNES - -// snes_spc 0.9.0 -#ifndef SPC_FILTER_H -#define SPC_FILTER_H - -#include "blargg_common.h" - -struct SPC_Filter { -public: - - // Filters count samples of stereo sound in place. Count must be a multiple of 2. - typedef short sample_t; - void run( sample_t* io, int count ); - -// Optional features - - // Clears filter to silence - void clear(); - - // Sets gain (volume), where gain_unit is normal. Gains greater than gain_unit - // are fine, since output is clamped to 16-bit sample range. - enum { gain_unit = 0x100 }; - void set_gain( int gain ); - - // Sets amount of bass (logarithmic scale) - enum { bass_none = 0 }; - enum { bass_norm = 8 }; // normal amount - enum { bass_max = 31 }; - void set_bass( int bass ); - -public: - SPC_Filter(); - BLARGG_DISABLE_NOTHROW -private: - enum { gain_bits = 8 }; - int gain; - int bass; - struct chan_t { int p1, pp1, sum; }; - chan_t ch [2]; -}; - -inline void SPC_Filter::set_gain( int g ) { gain = g; } - -inline void SPC_Filter::set_bass( int b ) { bass = b; } - -#endif diff --git a/waterbox/pizza/lib/snes_spc/blargg_common.h b/waterbox/pizza/lib/snes_spc/blargg_common.h deleted file mode 100644 index 75edff3914..0000000000 --- a/waterbox/pizza/lib/snes_spc/blargg_common.h +++ /dev/null @@ -1,186 +0,0 @@ -// Sets up common environment for Shay Green's libraries. -// To change configuration options, modify blargg_config.h, not this file. - -// snes_spc 0.9.0 -#ifndef BLARGG_COMMON_H -#define BLARGG_COMMON_H - -#include -#include -#include -#include - -#undef BLARGG_COMMON_H -// allow blargg_config.h to #include blargg_common.h -#include "blargg_config.h" -#ifndef BLARGG_COMMON_H -#define BLARGG_COMMON_H - -// BLARGG_RESTRICT: equivalent to restrict, where supported -#if defined (__GNUC__) || _MSC_VER >= 1100 - #define BLARGG_RESTRICT __restrict -#else - #define BLARGG_RESTRICT -#endif - -// STATIC_CAST(T,expr): Used in place of static_cast (expr) -#ifndef STATIC_CAST - #define STATIC_CAST(T,expr) ((T) (expr)) -#endif - -// blargg_err_t (0 on success, otherwise error string) -#ifndef blargg_err_t - typedef const char* blargg_err_t; -#endif - -// blargg_vector - very lightweight vector of POD types (no constructor/destructor) -template -class blargg_vector { - T* begin_; - size_t size_; -public: - blargg_vector() : begin_( 0 ), size_( 0 ) { } - ~blargg_vector() { free( begin_ ); } - size_t size() const { return size_; } - T* begin() const { return begin_; } - T* end() const { return begin_ + size_; } - blargg_err_t resize( size_t n ) - { - // TODO: blargg_common.cpp to hold this as an outline function, ugh - void* p = realloc( begin_, n * sizeof (T) ); - if ( p ) - begin_ = (T*) p; - else if ( n > size_ ) // realloc failure only a problem if expanding - return "Out of memory"; - size_ = n; - return 0; - } - void clear() { void* p = begin_; begin_ = 0; size_ = 0; free( p ); } - T& operator [] ( size_t n ) const - { - assert( n <= size_ ); // <= to allow past-the-end value - return begin_ [n]; - } -}; - -#ifndef BLARGG_DISABLE_NOTHROW - // throw spec mandatory in ISO C++ if operator new can return NULL - #if __cplusplus >= 199711 || defined (__GNUC__) - #define BLARGG_THROWS( spec ) throw spec - #else - #define BLARGG_THROWS( spec ) - #endif - #define BLARGG_DISABLE_NOTHROW \ - void* operator new ( size_t s ) BLARGG_THROWS(()) { return malloc( s ); }\ - void operator delete ( void* p ) { free( p ); } - #define BLARGG_NEW new -#else - #include - #define BLARGG_NEW new (std::nothrow) -#endif - -// BLARGG_4CHAR('a','b','c','d') = 'abcd' (four character integer constant) -#define BLARGG_4CHAR( a, b, c, d ) \ - ((a&0xFF)*0x1000000L + (b&0xFF)*0x10000L + (c&0xFF)*0x100L + (d&0xFF)) - -// BOOST_STATIC_ASSERT( expr ): Generates compile error if expr is 0. -#ifndef BOOST_STATIC_ASSERT - #ifdef _MSC_VER - // MSVC6 (_MSC_VER < 1300) fails for use of __LINE__ when /Zl is specified - #define BOOST_STATIC_ASSERT( expr ) \ - void blargg_failed_( int (*arg) [2 / (int) !!(expr) - 1] ) - #else - // Some other compilers fail when declaring same function multiple times in class, - // so differentiate them by line - #define BOOST_STATIC_ASSERT( expr ) \ - void blargg_failed_( int (*arg) [2 / !!(expr) - 1] [__LINE__] ) - #endif -#endif - -// BLARGG_COMPILER_HAS_BOOL: If 0, provides bool support for old compiler. If 1, -// compiler is assumed to support bool. If undefined, availability is determined. -#ifndef BLARGG_COMPILER_HAS_BOOL - #if defined (__MWERKS__) - #if !__option(bool) - #define BLARGG_COMPILER_HAS_BOOL 0 - #endif - #elif defined (_MSC_VER) - #if _MSC_VER < 1100 - #define BLARGG_COMPILER_HAS_BOOL 0 - #endif - #elif defined (__GNUC__) - // supports bool - #elif __cplusplus < 199711 - #define BLARGG_COMPILER_HAS_BOOL 0 - #endif -#endif -#if defined (BLARGG_COMPILER_HAS_BOOL) && !BLARGG_COMPILER_HAS_BOOL - // If you get errors here, modify your blargg_config.h file - typedef int bool; - const bool true = 1; - const bool false = 0; -#endif - -// blargg_long/blargg_ulong = at least 32 bits, int if it's big enough - -#if INT_MAX < 0x7FFFFFFF || LONG_MAX == 0x7FFFFFFF - typedef long blargg_long; -#else - typedef int blargg_long; -#endif - -#if UINT_MAX < 0xFFFFFFFF || ULONG_MAX == 0xFFFFFFFF - typedef unsigned long blargg_ulong; -#else - typedef unsigned blargg_ulong; -#endif - -// BOOST::int8_t etc. - -// HAVE_STDINT_H: If defined, use for int8_t etc. -#if defined (HAVE_STDINT_H) - #include - #define BOOST - -// HAVE_INTTYPES_H: If defined, use for int8_t etc. -#elif defined (HAVE_INTTYPES_H) - #include - #define BOOST - -#else - struct BOOST - { - #if UCHAR_MAX == 0xFF && SCHAR_MAX == 0x7F - typedef signed char int8_t; - typedef unsigned char uint8_t; - #else - // No suitable 8-bit type available - typedef struct see_blargg_common_h int8_t; - typedef struct see_blargg_common_h uint8_t; - #endif - - #if USHRT_MAX == 0xFFFF - typedef short int16_t; - typedef unsigned short uint16_t; - #else - // No suitable 16-bit type available - typedef struct see_blargg_common_h int16_t; - typedef struct see_blargg_common_h uint16_t; - #endif - - #if ULONG_MAX == 0xFFFFFFFF - typedef long int32_t; - typedef unsigned long uint32_t; - #elif UINT_MAX == 0xFFFFFFFF - typedef int int32_t; - typedef unsigned int uint32_t; - #else - // No suitable 32-bit type available - typedef struct see_blargg_common_h int32_t; - typedef struct see_blargg_common_h uint32_t; - #endif - }; -#endif - -#endif -#endif diff --git a/waterbox/pizza/lib/snes_spc/blargg_config.h b/waterbox/pizza/lib/snes_spc/blargg_config.h deleted file mode 100644 index 9dc69db836..0000000000 --- a/waterbox/pizza/lib/snes_spc/blargg_config.h +++ /dev/null @@ -1,24 +0,0 @@ -// snes_spc 0.9.0 user configuration file. Don't replace when updating library. - -// snes_spc 0.9.0 -#ifndef BLARGG_CONFIG_H -#define BLARGG_CONFIG_H - -// Uncomment to disable debugging checks -//#define NDEBUG 1 - -// Uncomment to enable platform-specific (and possibly non-portable) optimizations -//#define BLARGG_NONPORTABLE 1 - -// Uncomment if automatic byte-order determination doesn't work -//#define BLARGG_BIG_ENDIAN 1 - -// Uncomment if you get errors in the bool section of blargg_common.h -//#define BLARGG_COMPILER_HAS_BOOL 1 - -// Use standard config.h if present -#ifdef HAVE_CONFIG_H - #include "config.h" -#endif - -#endif diff --git a/waterbox/pizza/lib/snes_spc/blargg_endian.h b/waterbox/pizza/lib/snes_spc/blargg_endian.h deleted file mode 100644 index f2daca6416..0000000000 --- a/waterbox/pizza/lib/snes_spc/blargg_endian.h +++ /dev/null @@ -1,185 +0,0 @@ -// CPU Byte Order Utilities - -// snes_spc 0.9.0 -#ifndef BLARGG_ENDIAN -#define BLARGG_ENDIAN - -#include "blargg_common.h" - -// BLARGG_CPU_CISC: Defined if CPU has very few general-purpose registers (< 16) -#if defined (_M_IX86) || defined (_M_IA64) || defined (__i486__) || \ - defined (__x86_64__) || defined (__ia64__) || defined (__i386__) - #define BLARGG_CPU_X86 1 - #define BLARGG_CPU_CISC 1 -#endif - -#if defined (__powerpc__) || defined (__ppc__) || defined (__POWERPC__) || defined (__powerc) - #define BLARGG_CPU_POWERPC 1 - #define BLARGG_CPU_RISC 1 -#endif - -// BLARGG_BIG_ENDIAN, BLARGG_LITTLE_ENDIAN: Determined automatically, otherwise only -// one may be #defined to 1. Only needed if something actually depends on byte order. -#if !defined (BLARGG_BIG_ENDIAN) && !defined (BLARGG_LITTLE_ENDIAN) -#ifdef __GLIBC__ - // GCC handles this for us - #include - #if __BYTE_ORDER == __LITTLE_ENDIAN - #define BLARGG_LITTLE_ENDIAN 1 - #elif __BYTE_ORDER == __BIG_ENDIAN - #define BLARGG_BIG_ENDIAN 1 - #endif -#else - -#if defined (LSB_FIRST) || defined (__LITTLE_ENDIAN__) || BLARGG_CPU_X86 || \ - (defined (LITTLE_ENDIAN) && LITTLE_ENDIAN+0 != 1234) - #define BLARGG_LITTLE_ENDIAN 1 -#endif - -#if defined (MSB_FIRST) || defined (__BIG_ENDIAN__) || defined (WORDS_BIGENDIAN) || \ - defined (__sparc__) || BLARGG_CPU_POWERPC || \ - (defined (BIG_ENDIAN) && BIG_ENDIAN+0 != 4321) - #define BLARGG_BIG_ENDIAN 1 -#elif !defined (__mips__) - // No endian specified; assume little-endian, since it's most common - #define BLARGG_LITTLE_ENDIAN 1 -#endif -#endif -#endif - -#if BLARGG_LITTLE_ENDIAN && BLARGG_BIG_ENDIAN - #undef BLARGG_LITTLE_ENDIAN - #undef BLARGG_BIG_ENDIAN -#endif - -inline void blargg_verify_byte_order() -{ - #ifndef NDEBUG - #if BLARGG_BIG_ENDIAN - volatile int i = 1; - assert( *(volatile char*) &i == 0 ); - #elif BLARGG_LITTLE_ENDIAN - volatile int i = 1; - assert( *(volatile char*) &i != 0 ); - #endif - #endif -} - -inline unsigned get_le16( void const* p ) -{ - return (unsigned) ((unsigned char const*) p) [1] << 8 | - (unsigned) ((unsigned char const*) p) [0]; -} - -inline unsigned get_be16( void const* p ) -{ - return (unsigned) ((unsigned char const*) p) [0] << 8 | - (unsigned) ((unsigned char const*) p) [1]; -} - -inline blargg_ulong get_le32( void const* p ) -{ - return (blargg_ulong) ((unsigned char const*) p) [3] << 24 | - (blargg_ulong) ((unsigned char const*) p) [2] << 16 | - (blargg_ulong) ((unsigned char const*) p) [1] << 8 | - (blargg_ulong) ((unsigned char const*) p) [0]; -} - -inline blargg_ulong get_be32( void const* p ) -{ - return (blargg_ulong) ((unsigned char const*) p) [0] << 24 | - (blargg_ulong) ((unsigned char const*) p) [1] << 16 | - (blargg_ulong) ((unsigned char const*) p) [2] << 8 | - (blargg_ulong) ((unsigned char const*) p) [3]; -} - -inline void set_le16( void* p, unsigned n ) -{ - ((unsigned char*) p) [1] = (unsigned char) (n >> 8); - ((unsigned char*) p) [0] = (unsigned char) n; -} - -inline void set_be16( void* p, unsigned n ) -{ - ((unsigned char*) p) [0] = (unsigned char) (n >> 8); - ((unsigned char*) p) [1] = (unsigned char) n; -} - -inline void set_le32( void* p, blargg_ulong n ) -{ - ((unsigned char*) p) [0] = (unsigned char) n; - ((unsigned char*) p) [1] = (unsigned char) (n >> 8); - ((unsigned char*) p) [2] = (unsigned char) (n >> 16); - ((unsigned char*) p) [3] = (unsigned char) (n >> 24); -} - -inline void set_be32( void* p, blargg_ulong n ) -{ - ((unsigned char*) p) [3] = (unsigned char) n; - ((unsigned char*) p) [2] = (unsigned char) (n >> 8); - ((unsigned char*) p) [1] = (unsigned char) (n >> 16); - ((unsigned char*) p) [0] = (unsigned char) (n >> 24); -} - -#if BLARGG_NONPORTABLE - // Optimized implementation if byte order is known - #if BLARGG_LITTLE_ENDIAN - #define GET_LE16( addr ) (*(BOOST::uint16_t*) (addr)) - #define GET_LE32( addr ) (*(BOOST::uint32_t*) (addr)) - #define SET_LE16( addr, data ) (void) (*(BOOST::uint16_t*) (addr) = (data)) - #define SET_LE32( addr, data ) (void) (*(BOOST::uint32_t*) (addr) = (data)) - #elif BLARGG_BIG_ENDIAN - #define GET_BE16( addr ) (*(BOOST::uint16_t*) (addr)) - #define GET_BE32( addr ) (*(BOOST::uint32_t*) (addr)) - #define SET_BE16( addr, data ) (void) (*(BOOST::uint16_t*) (addr) = (data)) - #define SET_BE32( addr, data ) (void) (*(BOOST::uint32_t*) (addr) = (data)) - - #if BLARGG_CPU_POWERPC - // PowerPC has special byte-reversed instructions - #if defined (__MWERKS__) - #define GET_LE16( addr ) (__lhbrx( addr, 0 )) - #define GET_LE32( addr ) (__lwbrx( addr, 0 )) - #define SET_LE16( addr, in ) (__sthbrx( in, addr, 0 )) - #define SET_LE32( addr, in ) (__stwbrx( in, addr, 0 )) - #elif defined (__GNUC__) - #define GET_LE16( addr ) ({unsigned ppc_lhbrx_; asm( "lhbrx %0,0,%1" : "=r" (ppc_lhbrx_) : "r" (addr), "0" (ppc_lhbrx_) ); ppc_lhbrx_;}) - #define GET_LE32( addr ) ({unsigned ppc_lwbrx_; asm( "lwbrx %0,0,%1" : "=r" (ppc_lwbrx_) : "r" (addr), "0" (ppc_lwbrx_) ); ppc_lwbrx_;}) - #define SET_LE16( addr, in ) ({asm( "sthbrx %0,0,%1" : : "r" (in), "r" (addr) );}) - #define SET_LE32( addr, in ) ({asm( "stwbrx %0,0,%1" : : "r" (in), "r" (addr) );}) - #endif - #endif - #endif -#endif - -#ifndef GET_LE16 - #define GET_LE16( addr ) get_le16( addr ) - #define SET_LE16( addr, data ) set_le16( addr, data ) -#endif - -#ifndef GET_LE32 - #define GET_LE32( addr ) get_le32( addr ) - #define SET_LE32( addr, data ) set_le32( addr, data ) -#endif - -#ifndef GET_BE16 - #define GET_BE16( addr ) get_be16( addr ) - #define SET_BE16( addr, data ) set_be16( addr, data ) -#endif - -#ifndef GET_BE32 - #define GET_BE32( addr ) get_be32( addr ) - #define SET_BE32( addr, data ) set_be32( addr, data ) -#endif - -// auto-selecting versions - -inline void set_le( BOOST::uint16_t* p, unsigned n ) { SET_LE16( p, n ); } -inline void set_le( BOOST::uint32_t* p, blargg_ulong n ) { SET_LE32( p, n ); } -inline void set_be( BOOST::uint16_t* p, unsigned n ) { SET_BE16( p, n ); } -inline void set_be( BOOST::uint32_t* p, blargg_ulong n ) { SET_BE32( p, n ); } -inline unsigned get_le( BOOST::uint16_t* p ) { return GET_LE16( p ); } -inline blargg_ulong get_le( BOOST::uint32_t* p ) { return GET_LE32( p ); } -inline unsigned get_be( BOOST::uint16_t* p ) { return GET_BE16( p ); } -inline blargg_ulong get_be( BOOST::uint32_t* p ) { return GET_BE32( p ); } - -#endif diff --git a/waterbox/pizza/lib/snes_spc/blargg_source.h b/waterbox/pizza/lib/snes_spc/blargg_source.h deleted file mode 100644 index 5e45c4fb42..0000000000 --- a/waterbox/pizza/lib/snes_spc/blargg_source.h +++ /dev/null @@ -1,100 +0,0 @@ -/* Included at the beginning of library source files, after all other #include lines. -Sets up helpful macros and services used in my source code. They don't need -module an annoying module prefix on their names since they are defined after -all other #include lines. */ - -// snes_spc 0.9.0 -#ifndef BLARGG_SOURCE_H -#define BLARGG_SOURCE_H - -// If debugging is enabled, abort program if expr is false. Meant for checking -// internal state and consistency. A failed assertion indicates a bug in the module. -// void assert( bool expr ); -#include - -// If debugging is enabled and expr is false, abort program. Meant for checking -// caller-supplied parameters and operations that are outside the control of the -// module. A failed requirement indicates a bug outside the module. -// void require( bool expr ); -#undef require -#define require( expr ) assert( expr ) - -// Like printf() except output goes to debug log file. Might be defined to do -// nothing (not even evaluate its arguments). -// void dprintf( const char* format, ... ); -static inline void blargg_dprintf_( const char*, ... ) { } -#undef dprintf -#define dprintf (1) ? (void) 0 : blargg_dprintf_ - -// If enabled, evaluate expr and if false, make debug log entry with source file -// and line. Meant for finding situations that should be examined further, but that -// don't indicate a problem. In all cases, execution continues normally. -#undef check -#define check( expr ) ((void) 0) - -// If expr yields error string, return it from current function, otherwise continue. -#undef RETURN_ERR -#define RETURN_ERR( expr ) do { \ - blargg_err_t blargg_return_err_ = (expr); \ - if ( blargg_return_err_ ) return blargg_return_err_; \ - } while ( 0 ) - -// If ptr is 0, return out of memory error string. -#undef CHECK_ALLOC -#define CHECK_ALLOC( ptr ) do { if ( (ptr) == 0 ) return "Out of memory"; } while ( 0 ) - -// Avoid any macros which evaluate their arguments multiple times -#undef min -#undef max - -#define DEF_MIN_MAX( type ) \ - static inline type min( type x, type y ) { if ( x < y ) return x; return y; }\ - static inline type max( type x, type y ) { if ( y < x ) return x; return y; } - -DEF_MIN_MAX( int ) -DEF_MIN_MAX( unsigned ) -DEF_MIN_MAX( long ) -DEF_MIN_MAX( unsigned long ) -DEF_MIN_MAX( float ) -DEF_MIN_MAX( double ) - -#undef DEF_MIN_MAX - -/* -// using const references generates crappy code, and I am currenly only using these -// for built-in types, so they take arguments by value - -// TODO: remove -inline int min( int x, int y ) -template -inline T min( T x, T y ) -{ - if ( x < y ) - return x; - return y; -} - -template -inline T max( T x, T y ) -{ - if ( x < y ) - return y; - return x; -} -*/ - -// TODO: good idea? bad idea? -#undef byte -#define byte byte_ -typedef unsigned char byte; - -// deprecated -#define BLARGG_CHECK_ALLOC CHECK_ALLOC -#define BLARGG_RETURN_ERR RETURN_ERR - -// BLARGG_SOURCE_BEGIN: If defined, #included, allowing redefition of dprintf and check -#ifdef BLARGG_SOURCE_BEGIN - #include BLARGG_SOURCE_BEGIN -#endif - -#endif diff --git a/waterbox/pizza/lib/snes_spc/changes.txt b/waterbox/pizza/lib/snes_spc/changes.txt deleted file mode 100644 index 33661832b4..0000000000 --- a/waterbox/pizza/lib/snes_spc/changes.txt +++ /dev/null @@ -1,107 +0,0 @@ -snes_spc Change Log -------------------- - -snes_spc 0.9.0 --------------- -- Improved documentation - -- SPC: Added spc_skip() function for quickly seeking in an SPC music -file. Runs 3-4x faster than normal playback using the fast DSP (or about -43-60X real-time on my 400 MHz Mac). - -- SPC: Added spc_set_tempo() to change tempo of SPC music playback. - -- SPC: Sample generation is now corrected to generate exactly one pair -of samples every 32 clocks without exception. Before it could generate a -few samples more or less depending on how far ahead or behind DSP was at -the moment. - -- SPC: Changed spc_reset() and spc_soft_reset() to also reset output -buffer (see spc.h). - -- SPC: Fixed minor timer counting bug. - -- SPC: Stack pointer wrap-around is now emulated (and without any -noticeable performance hit). - -- SPC: Runs about 5% faster due to various optimizations. - -- SPC: Found way to make fast DSP register accesses cycle-accurate in -most cases, without reducing performance. Allows fast DSP to pass most -of my validation tests. - -- DSP: Added surround disable support to fast DSP again. - -- DSP: Improved voice un-muting to take effect immediately on fast DSP. - -- DSP: Noise shift register now starts at 0x4000 instead of 0x4001 as it -incorrectly did before. - -- Converted library to C++ code internally. A C interface is still -included in spc.h and dsp.h. Note that these are different than the -previous interface, so your code will require minor changes: - - Old SPC code New SPC code - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - #include "spc/spc.h" #include "snes_spc/spc.h" - - snes_spc_t* spc; SNES_SPC* spc; - spc = malloc( sizeof (snes_spc_t) ); spc = spc_new(); - spc_init( spc ); - - spc_end_frame( time ); spc_end_frame( spc, time ); - /* etc. */ - - /* done using SPC */ spc_delete( spc ); - - - Old DSP code New DSP code - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - #include "spc/spc_dsp.h" #include "snes_spc/dsp.h" - - spc_dsp_init( ram ); SPC_DSP* dsp; - dsp = spc_dsp_new(); - spc_dsp_init( dsp, ram ); - - spc_dsp_run( count ); spc_dsp_run( dsp, count ); - /* etc. */ - - /* done using DSP */ spc_dsp_delete( dsp ); - - -snes_spc 0.8.0 --------------- -- Added several demos - -- Added high-pass/low-pass filter to better match SNES sound - -- Added save state functionality for SPC and accurate DSP (but not fast -DSP) - -- Added emulation of reset switch on NES (soft reset) - -- Made source more compatible with pre-C99 compilers by eliminating -mid-block declarations - -- SPC: Many S-SMP accuracy improvements, mostly in memory access times - -- SPC: S-SMP speed improvements - -- SPC: Added SPC load/save functions and KON checking to help trim -silence from beginning - -- SPC: Changed spc_init() to have you allocate most of the memory used -by the library so you have more control over it - -- DSP: New highly accurate DSP and faster version derived from same code - -- DSP: Changed prefix from dsp_ to spc_dsp_. Your DSP code will require -changes. - -- DSP: Removed surround disable and gain. Gain can now be done with the -dsp_filter module, and surround disable will probably only be -implemented in the fast DSP at some point. - -- DSP: Changed interface to work in clocks rather than samples, -necessary for the new accurate DSP. Sample output is now done with -separate functions. Your DSP code will require changes. diff --git a/waterbox/pizza/lib/snes_spc/dsp.cpp b/waterbox/pizza/lib/snes_spc/dsp.cpp deleted file mode 100644 index 99d0cf5c5e..0000000000 --- a/waterbox/pizza/lib/snes_spc/dsp.cpp +++ /dev/null @@ -1,48 +0,0 @@ -// snes_spc 0.9.0. http://www.slack.net/~ant/ - -#include "dsp.h" - -#include "SPC_DSP.h" - -/* Copyright (C) 2007 Shay Green. This module is free software; you -can redistribute it and/or modify it under the terms of the GNU Lesser -General Public License as published by the Free Software Foundation; either -version 2.1 of the License, or (at your option) any later version. This -module is distributed in the hope that it will be useful, but WITHOUT ANY -WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more -details. You should have received a copy of the GNU Lesser General Public -License along with this module; if not, write to the Free Software Foundation, -Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ - -#include "blargg_source.h" - -SPC_DSP* spc_dsp_new( void ) -{ - // be sure constants match - assert( spc_dsp_voice_count == (int) SPC_DSP::voice_count ); - assert( spc_dsp_register_count == (int) SPC_DSP::register_count ); - #if !SPC_NO_COPY_STATE_FUNCS - assert( spc_dsp_state_size == (int) SPC_DSP::state_size ); - #endif - - return new SPC_DSP; -} - -void spc_dsp_delete ( SPC_DSP* s ) { delete s; } -void spc_dsp_init ( SPC_DSP* s, void* ram_64k ) { s->init( ram_64k ); } -void spc_dsp_set_output ( SPC_DSP* s, spc_dsp_sample_t* p, int n ) { s->set_output( p, n ); } -int spc_dsp_sample_count( SPC_DSP const* s ) { return s->sample_count(); } -void spc_dsp_reset ( SPC_DSP* s ) { s->reset(); } -void spc_dsp_soft_reset ( SPC_DSP* s ) { s->soft_reset(); } -int spc_dsp_read ( SPC_DSP const* s, int addr ) { return s->read( addr ); } -void spc_dsp_write ( SPC_DSP* s, int addr, int data ) { s->write( addr, data ); } -void spc_dsp_run ( SPC_DSP* s, int clock_count ) { s->run( clock_count ); } -void spc_dsp_mute_voices ( SPC_DSP* s, int mask ) { s->mute_voices( mask ); } -void spc_dsp_disable_surround( SPC_DSP* s, int disable ) { s->disable_surround( disable ); } -void spc_dsp_load ( SPC_DSP* s, unsigned char const regs [spc_dsp_register_count] ) { s->load( regs ); } - -#if !SPC_NO_COPY_STATE_FUNCS -void spc_dsp_copy_state ( SPC_DSP* s, unsigned char** p, spc_dsp_copy_func_t f ) { s->copy_state( p, f ); } -int spc_dsp_check_kon ( SPC_DSP* s ) { return s->check_kon(); } -#endif diff --git a/waterbox/pizza/lib/snes_spc/dsp.h b/waterbox/pizza/lib/snes_spc/dsp.h deleted file mode 100644 index 59867d92f9..0000000000 --- a/waterbox/pizza/lib/snes_spc/dsp.h +++ /dev/null @@ -1,83 +0,0 @@ -/* SNES SPC-700 DSP emulator C interface (also usable from C++) */ - -/* snes_spc 0.9.0 */ -#ifndef DSP_H -#define DSP_H - -#include - -#ifdef __cplusplus - extern "C" { -#endif - -typedef struct SPC_DSP SPC_DSP; - -/* Creates new DSP emulator. NULL if out of memory. */ -SPC_DSP* spc_dsp_new( void ); - -/* Frees DSP emulator */ -void spc_dsp_delete( SPC_DSP* ); - -/* Initializes DSP and has it use the 64K RAM provided */ -void spc_dsp_init( SPC_DSP*, void* ram_64k ); - -/* Sets destination for output samples. If out is NULL or out_size is 0, -doesn't generate any. */ -typedef short spc_dsp_sample_t; -void spc_dsp_set_output( SPC_DSP*, spc_dsp_sample_t* out, int out_size ); - -/* Number of samples written to output since it was last set, always -a multiple of 2. Undefined if more samples were generated than -output buffer could hold. */ -int spc_dsp_sample_count( SPC_DSP const* ); - - -/**** Emulation *****/ - -/* Resets DSP to power-on state */ -void spc_dsp_reset( SPC_DSP* ); - -/* Emulates pressing reset switch on SNES */ -void spc_dsp_soft_reset( SPC_DSP* ); - -/* Reads/writes DSP registers. For accuracy, you must first call spc_dsp_run() */ -/* to catch the DSP up to present. */ -int spc_dsp_read ( SPC_DSP const*, int addr ); -void spc_dsp_write( SPC_DSP*, int addr, int data ); - -/* Runs DSP for specified number of clocks (~1024000 per second). Every 32 clocks */ -/* a pair of samples is be generated. */ -void spc_dsp_run( SPC_DSP*, int clock_count ); - - -/**** Sound control *****/ - -/* Mutes voices corresponding to non-zero bits in mask. Reduces emulation accuracy. */ -enum { spc_dsp_voice_count = 8 }; -void spc_dsp_mute_voices( SPC_DSP*, int mask ); - -/* If true, prevents channels and global volumes from being phase-negated. -Only supported by fast DSP; has no effect on accurate DSP. */ -void spc_dsp_disable_surround( SPC_DSP*, int disable ); - - -/**** State save/load *****/ - -/* Resets DSP and uses supplied values to initialize registers */ -enum { spc_dsp_register_count = 128 }; -void spc_dsp_load( SPC_DSP*, unsigned char const regs [spc_dsp_register_count] ); - -/* Saves/loads exact emulator state (accurate DSP only) */ -enum { spc_dsp_state_size = 640 }; /* maximum space needed when saving */ -typedef void (*spc_dsp_copy_func_t)( unsigned char** io, void* state, size_t ); -void spc_dsp_copy_state( SPC_DSP*, unsigned char** io, spc_dsp_copy_func_t ); - -/* Returns non-zero if new key-on events occurred since last call (accurate DSP only) */ -int spc_dsp_check_kon( SPC_DSP* ); - - -#ifdef __cplusplus - } -#endif - -#endif diff --git a/waterbox/pizza/lib/snes_spc/license.txt b/waterbox/pizza/lib/snes_spc/license.txt deleted file mode 100644 index 5faba9d48c..0000000000 --- a/waterbox/pizza/lib/snes_spc/license.txt +++ /dev/null @@ -1,504 +0,0 @@ - GNU LESSER GENERAL PUBLIC LICENSE - Version 2.1, February 1999 - - Copyright (C) 1991, 1999 Free Software Foundation, Inc. - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - -[This is the first released version of the Lesser GPL. It also counts - as the successor of the GNU Library Public License, version 2, hence - the version number 2.1.] - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -Licenses are intended to guarantee your freedom to share and change -free software--to make sure the software is free for all its users. - - This license, the Lesser General Public License, applies to some -specially designated software packages--typically libraries--of the -Free Software Foundation and other authors who decide to use it. You -can use it too, but we suggest you first think carefully about whether -this license or the ordinary General Public License is the better -strategy to use in any particular case, based on the explanations below. - - When we speak of free software, we are referring to freedom of use, -not price. Our General Public Licenses are designed to make sure that -you have the freedom to distribute copies of free software (and charge -for this service if you wish); that you receive source code or can get -it if you want it; that you can change the software and use pieces of -it in new free programs; and that you are informed that you can do -these things. - - To protect your rights, we need to make restrictions that forbid -distributors to deny you these rights or to ask you to surrender these -rights. These restrictions translate to certain responsibilities for -you if you distribute copies of the library or if you modify it. - - For example, if you distribute copies of the library, whether gratis -or for a fee, you must give the recipients all the rights that we gave -you. You must make sure that they, too, receive or can get the source -code. If you link other code with the library, you must provide -complete object files to the recipients, so that they can relink them -with the library after making changes to the library and recompiling -it. And you must show them these terms so they know their rights. - - We protect your rights with a two-step method: (1) we copyright the -library, and (2) we offer you this license, which gives you legal -permission to copy, distribute and/or modify the library. - - To protect each distributor, we want to make it very clear that -there is no warranty for the free library. Also, if the library is -modified by someone else and passed on, the recipients should know -that what they have is not the original version, so that the original -author's reputation will not be affected by problems that might be -introduced by others. - - Finally, software patents pose a constant threat to the existence of -any free program. We wish to make sure that a company cannot -effectively restrict the users of a free program by obtaining a -restrictive license from a patent holder. Therefore, we insist that -any patent license obtained for a version of the library must be -consistent with the full freedom of use specified in this license. - - Most GNU software, including some libraries, is covered by the -ordinary GNU General Public License. This license, the GNU Lesser -General Public License, applies to certain designated libraries, and -is quite different from the ordinary General Public License. We use -this license for certain libraries in order to permit linking those -libraries into non-free programs. - - When a program is linked with a library, whether statically or using -a shared library, the combination of the two is legally speaking a -combined work, a derivative of the original library. The ordinary -General Public License therefore permits such linking only if the -entire combination fits its criteria of freedom. The Lesser General -Public License permits more lax criteria for linking other code with -the library. - - We call this license the "Lesser" General Public License because it -does Less to protect the user's freedom than the ordinary General -Public License. It also provides other free software developers Less -of an advantage over competing non-free programs. These disadvantages -are the reason we use the ordinary General Public License for many -libraries. However, the Lesser license provides advantages in certain -special circumstances. - - For example, on rare occasions, there may be a special need to -encourage the widest possible use of a certain library, so that it becomes -a de-facto standard. To achieve this, non-free programs must be -allowed to use the library. A more frequent case is that a free -library does the same job as widely used non-free libraries. In this -case, there is little to gain by limiting the free library to free -software only, so we use the Lesser General Public License. - - In other cases, permission to use a particular library in non-free -programs enables a greater number of people to use a large body of -free software. For example, permission to use the GNU C Library in -non-free programs enables many more people to use the whole GNU -operating system, as well as its variant, the GNU/Linux operating -system. - - Although the Lesser General Public License is Less protective of the -users' freedom, it does ensure that the user of a program that is -linked with the Library has the freedom and the wherewithal to run -that program using a modified version of the Library. - - The precise terms and conditions for copying, distribution and -modification follow. Pay close attention to the difference between a -"work based on the library" and a "work that uses the library". The -former contains code derived from the library, whereas the latter must -be combined with the library in order to run. - - GNU LESSER GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License Agreement applies to any software library or other -program which contains a notice placed by the copyright holder or -other authorized party saying it may be distributed under the terms of -this Lesser General Public License (also called "this License"). -Each licensee is addressed as "you". - - A "library" means a collection of software functions and/or data -prepared so as to be conveniently linked with application programs -(which use some of those functions and data) to form executables. - - The "Library", below, refers to any such software library or work -which has been distributed under these terms. A "work based on the -Library" means either the Library or any derivative work under -copyright law: that is to say, a work containing the Library or a -portion of it, either verbatim or with modifications and/or translated -straightforwardly into another language. (Hereinafter, translation is -included without limitation in the term "modification".) - - "Source code" for a work means the preferred form of the work for -making modifications to it. For a library, complete source code means -all the source code for all modules it contains, plus any associated -interface definition files, plus the scripts used to control compilation -and installation of the library. - - Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running a program using the Library is not restricted, and output from -such a program is covered only if its contents constitute a work based -on the Library (independent of the use of the Library in a tool for -writing it). Whether that is true depends on what the Library does -and what the program that uses the Library does. - - 1. You may copy and distribute verbatim copies of the Library's -complete source code as you receive it, in any medium, provided that -you conspicuously and appropriately publish on each copy an -appropriate copyright notice and disclaimer of warranty; keep intact -all the notices that refer to this License and to the absence of any -warranty; and distribute a copy of this License along with the -Library. - - You may charge a fee for the physical act of transferring a copy, -and you may at your option offer warranty protection in exchange for a -fee. - - 2. You may modify your copy or copies of the Library or any portion -of it, thus forming a work based on the Library, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) The modified work must itself be a software library. - - b) You must cause the files modified to carry prominent notices - stating that you changed the files and the date of any change. - - c) You must cause the whole of the work to be licensed at no - charge to all third parties under the terms of this License. - - d) If a facility in the modified Library refers to a function or a - table of data to be supplied by an application program that uses - the facility, other than as an argument passed when the facility - is invoked, then you must make a good faith effort to ensure that, - in the event an application does not supply such function or - table, the facility still operates, and performs whatever part of - its purpose remains meaningful. - - (For example, a function in a library to compute square roots has - a purpose that is entirely well-defined independent of the - application. Therefore, Subsection 2d requires that any - application-supplied function or table used by this function must - be optional: if the application does not supply it, the square - root function must still compute square roots.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Library, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Library, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote -it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Library. - -In addition, mere aggregation of another work not based on the Library -with the Library (or with a work based on the Library) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may opt to apply the terms of the ordinary GNU General Public -License instead of this License to a given copy of the Library. To do -this, you must alter all the notices that refer to this License, so -that they refer to the ordinary GNU General Public License, version 2, -instead of to this License. (If a newer version than version 2 of the -ordinary GNU General Public License has appeared, then you can specify -that version instead if you wish.) Do not make any other change in -these notices. - - Once this change is made in a given copy, it is irreversible for -that copy, so the ordinary GNU General Public License applies to all -subsequent copies and derivative works made from that copy. - - This option is useful when you wish to copy part of the code of -the Library into a program that is not a library. - - 4. You may copy and distribute the Library (or a portion or -derivative of it, under Section 2) in object code or executable form -under the terms of Sections 1 and 2 above provided that you accompany -it with the complete corresponding machine-readable source code, which -must be distributed under the terms of Sections 1 and 2 above on a -medium customarily used for software interchange. - - If distribution of object code is made by offering access to copy -from a designated place, then offering equivalent access to copy the -source code from the same place satisfies the requirement to -distribute the source code, even though third parties are not -compelled to copy the source along with the object code. - - 5. A program that contains no derivative of any portion of the -Library, but is designed to work with the Library by being compiled or -linked with it, is called a "work that uses the Library". Such a -work, in isolation, is not a derivative work of the Library, and -therefore falls outside the scope of this License. - - However, linking a "work that uses the Library" with the Library -creates an executable that is a derivative of the Library (because it -contains portions of the Library), rather than a "work that uses the -library". The executable is therefore covered by this License. -Section 6 states terms for distribution of such executables. - - When a "work that uses the Library" uses material from a header file -that is part of the Library, the object code for the work may be a -derivative work of the Library even though the source code is not. -Whether this is true is especially significant if the work can be -linked without the Library, or if the work is itself a library. The -threshold for this to be true is not precisely defined by law. - - If such an object file uses only numerical parameters, data -structure layouts and accessors, and small macros and small inline -functions (ten lines or less in length), then the use of the object -file is unrestricted, regardless of whether it is legally a derivative -work. (Executables containing this object code plus portions of the -Library will still fall under Section 6.) - - Otherwise, if the work is a derivative of the Library, you may -distribute the object code for the work under the terms of Section 6. -Any executables containing that work also fall under Section 6, -whether or not they are linked directly with the Library itself. - - 6. As an exception to the Sections above, you may also combine or -link a "work that uses the Library" with the Library to produce a -work containing portions of the Library, and distribute that work -under terms of your choice, provided that the terms permit -modification of the work for the customer's own use and reverse -engineering for debugging such modifications. - - You must give prominent notice with each copy of the work that the -Library is used in it and that the Library and its use are covered by -this License. You must supply a copy of this License. If the work -during execution displays copyright notices, you must include the -copyright notice for the Library among them, as well as a reference -directing the user to the copy of this License. Also, you must do one -of these things: - - a) Accompany the work with the complete corresponding - machine-readable source code for the Library including whatever - changes were used in the work (which must be distributed under - Sections 1 and 2 above); and, if the work is an executable linked - with the Library, with the complete machine-readable "work that - uses the Library", as object code and/or source code, so that the - user can modify the Library and then relink to produce a modified - executable containing the modified Library. (It is understood - that the user who changes the contents of definitions files in the - Library will not necessarily be able to recompile the application - to use the modified definitions.) - - b) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (1) uses at run time a - copy of the library already present on the user's computer system, - rather than copying library functions into the executable, and (2) - will operate properly with a modified version of the library, if - the user installs one, as long as the modified version is - interface-compatible with the version that the work was made with. - - c) Accompany the work with a written offer, valid for at - least three years, to give the same user the materials - specified in Subsection 6a, above, for a charge no more - than the cost of performing this distribution. - - d) If distribution of the work is made by offering access to copy - from a designated place, offer equivalent access to copy the above - specified materials from the same place. - - e) Verify that the user has already received a copy of these - materials or that you have already sent this user a copy. - - For an executable, the required form of the "work that uses the -Library" must include any data and utility programs needed for -reproducing the executable from it. However, as a special exception, -the materials to be distributed need not include anything that is -normally distributed (in either source or binary form) with the major -components (compiler, kernel, and so on) of the operating system on -which the executable runs, unless that component itself accompanies -the executable. - - It may happen that this requirement contradicts the license -restrictions of other proprietary libraries that do not normally -accompany the operating system. Such a contradiction means you cannot -use both them and the Library together in an executable that you -distribute. - - 7. You may place library facilities that are a work based on the -Library side-by-side in a single library together with other library -facilities not covered by this License, and distribute such a combined -library, provided that the separate distribution of the work based on -the Library and of the other library facilities is otherwise -permitted, and provided that you do these two things: - - a) Accompany the combined library with a copy of the same work - based on the Library, uncombined with any other library - facilities. This must be distributed under the terms of the - Sections above. - - b) Give prominent notice with the combined library of the fact - that part of it is a work based on the Library, and explaining - where to find the accompanying uncombined form of the same work. - - 8. You may not copy, modify, sublicense, link with, or distribute -the Library except as expressly provided under this License. Any -attempt otherwise to copy, modify, sublicense, link with, or -distribute the Library is void, and will automatically terminate your -rights under this License. However, parties who have received copies, -or rights, from you under this License will not have their licenses -terminated so long as such parties remain in full compliance. - - 9. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Library or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Library (or any work based on the -Library), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Library or works based on it. - - 10. Each time you redistribute the Library (or any work based on the -Library), the recipient automatically receives a license from the -original licensor to copy, distribute, link with or modify the Library -subject to these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties with -this License. - - 11. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Library at all. For example, if a patent -license would not permit royalty-free redistribution of the Library by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Library. - -If any portion of this section is held invalid or unenforceable under any -particular circumstance, the balance of the section is intended to apply, -and the section as a whole is intended to apply in other circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 12. If the distribution and/or use of the Library is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Library under this License may add -an explicit geographical distribution limitation excluding those countries, -so that distribution is permitted only in or among countries not thus -excluded. In such case, this License incorporates the limitation as if -written in the body of this License. - - 13. The Free Software Foundation may publish revised and/or new -versions of the Lesser General Public License from time to time. -Such new versions will be similar in spirit to the present version, -but may differ in detail to address new problems or concerns. - -Each version is given a distinguishing version number. If the Library -specifies a version number of this License which applies to it and -"any later version", you have the option of following the terms and -conditions either of that version or of any later version published by -the Free Software Foundation. If the Library does not specify a -license version number, you may choose any version ever published by -the Free Software Foundation. - - 14. If you wish to incorporate parts of the Library into other free -programs whose distribution conditions are incompatible with these, -write to the author to ask for permission. For software which is -copyrighted by the Free Software Foundation, write to the Free -Software Foundation; we sometimes make exceptions for this. Our -decision will be guided by the two goals of preserving the free status -of all derivatives of our free software and of promoting the sharing -and reuse of software generally. - - NO WARRANTY - - 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO -WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. -EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR -OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY -KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE -LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME -THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN -WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY -AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU -FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR -CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE -LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING -RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A -FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF -SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH -DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Libraries - - If you develop a new library, and you want it to be of the greatest -possible use to the public, we recommend making it free software that -everyone can redistribute and change. You can do so by permitting -redistribution under these terms (or, alternatively, under the terms of the -ordinary General Public License). - - To apply these terms, attach the following notices to the library. It is -safest to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least the -"copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - -Also add information on how to contact you by electronic and paper mail. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the library, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the - library `Frob' (a library for tweaking knobs) written by James Random Hacker. - - , 1 April 1990 - Ty Coon, President of Vice - -That's all there is to it! - - diff --git a/waterbox/pizza/lib/snes_spc/readme.txt b/waterbox/pizza/lib/snes_spc/readme.txt deleted file mode 100644 index 979913f0ac..0000000000 --- a/waterbox/pizza/lib/snes_spc/readme.txt +++ /dev/null @@ -1,86 +0,0 @@ -snes_spc 0.9.0: SNES SPC-700 APU Emulator ------------------------------------------ -This library includes a full SPC emulator and an S-DSP emulator that can -be used on its own. Two S-DSP emulators are available: a highly accurate -one for use in a SNES emulator, and a 3x faster one for use in an SPC -music player or a resource-limited SNES emulator. - -* Can be used from C and C++ code -* Full SPC-700 APU emulator with cycle accuracy in most cases -* Loads, plays, and saves SPC music files -* Can save and load exact full emulator state -* DSP voice muting, surround sound disable, and song tempo adjustment -* Uses 7% CPU average on 400 MHz Mac to play an SPC using fast DSP - -The accurate DSP emulator is based on past research by others and -hundreds of hours of recent research by me. It passes over a hundred -strenuous timing and behavior validation tests that were also run on the -SNES. As far as I know, it's the first DSP emulator with cycle accuracy, -properly emulating every DSP register and memory access at the exact SPC -cycle it occurs at, whereas previous DSP emulators emulated these only -to the nearest sample (which occurs every 32 clocks). - -Author : Shay Green -Website: http://www.slack.net/~ant/ -Forum : http://groups.google.com/group/blargg-sound-libs -License: GNU Lesser General Public License (LGPL) - - -Getting Started ---------------- -Build a program consisting of demo/play_spc.c, demo/demo_util.c, -demo/wave_writer.c, and all source files in snes_spc/. Put an SPC music -file in the same directory and name it "test.spc". Running the program -should generate the recording "out.wav". - -Read snes_spc.txt for more information. Post to the discussion forum for -assistance. - - -Files ------ -snes_spc.txt Documentation -changes.txt Change log -license.txt GNU LGPL license - -demo/ - play_spc.c Records SPC file to wave sound file - benchmark.c Finds how fast emulator runs on your computer - trim_spc.c Trims silence off beginning of an SPC file - save_state.c Saves/loads exact emulator state to/from file - comm.c Communicates with SPC how SNES would - demo_util.h General utility functions used by demos - demo_util.c - wave_writer.h WAVE sound file writer used for demo output - wave_writer.c - -fast_dsp/ Optional standalone fast DSP emulator - SPC_DSP.h To use with full SPC emulator, move into - SPC_DSP.cpp snes_spc/ and replace original files - -snes_spc/ Library sources - blargg_config.h Configuration (modify as necessary) - - spc.h C interface to SPC emulator and sound filter - spc.cpp - - SPC_Filter.h Optional filter to make sound more authentic - SPC_Filter.cpp - - SNES_SPC.h Full SPC emulator - SNES_SPC.cpp - SNES_SPC_misc.cpp - SNES_SPC_state.cpp - SPC_CPU.h - - dsp.h C interface to DSP emulator - dsp.cpp - - SPC_DSP.h Standalone accurate DSP emulator - SPC_DSP.cpp - blargg_common.h - blargg_endian.h - blargg_source.h - --- -Shay Green diff --git a/waterbox/pizza/lib/snes_spc/snes_spc.txt b/waterbox/pizza/lib/snes_spc/snes_spc.txt deleted file mode 100644 index d37b34347f..0000000000 --- a/waterbox/pizza/lib/snes_spc/snes_spc.txt +++ /dev/null @@ -1,318 +0,0 @@ -snes_spc 0.9.0: SNES SPC-700 APU Emulator ------------------------------------------ -Author : Shay Green -Website: http://www.slack.net/~ant/ -Forum : http://groups.google.com/group/blargg-sound-libs -License: GNU Lesser General Public License (LGPL) - - -Contents --------- -* C and C++ Interfaces -* Overview -* Full SPC Emulation -* DSP Emulation -* SPC Music Playback -* State Copying -* Library Compilation -* Error handling -* Solving Problems -* Accurate S-DSP Limitations -* Fast S-DSP Limitations -* S-SMP Limitations -* To Do -* Thanks - - -C and C++ Interfaces --------------------- -The library includes a C interface in spc.h and dsp.h, which can be used -from C and C++. This C interface is referred to in the following -documentation. If you're building this as a shared library (rather than -linking statically), you should use the C interface since it will change -less in future versions. - -The native C++ interface is in the header files SNES_SPC.h, SPC_DSP.h, -and SPC_Filter.h, and the two interfaces can be freely mixed in C++ -code. Conversion between the two interfaces generally follows a pattern: - - C interface C++ interface - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - SNES_SPC* spc; SNES_SPC* spc; - - spc = spc_new(); spc = new SNES_SPC; - - spc_play( spc, count, buf ); spc->play( count, buf ); - - spc_sample_rate SNES_SPC::sample_rate - - spc_delete( spc ); delete spc; - - -Overview --------- -There are three main roles for this library: -* Full SPC emulation in a SNES emulator -* DSP emulation in a SNES emulator (where you emulate the SMP CPU) -* SPC playback in an SPC music file player - -Each of these uses are described separately below. - - -Full SPC Emulation ------------------- -See spc.h for full function reference (SNES_SPC.h if using C++). - -* Create SPC emulator with spc_new() and check for NULL. - -* Call spc_init_rom() with a pointer to the 64-byte IPL ROM dump (not -included with library). - -* When your emulated SNES is powered on, call spc_reset(). When the -reset switch is pressed, call spc_soft_reset(). - -* Call spc_set_output() with your output buffer, then do emulation. - -* When the SNES CPU accesses APU ports, call spc_read_port() and -spc_write_port(). - -* When your emulator's timebase is going back to 0, call -spc_end_frame(), usually at the end of a video frame or scanline. - -* Periodically play samples from your buffer. Use spc_sample_count() to -find out how many samples have been written, then spc_set_output() after -you've made more space in your buffer. - -* Save/load full emulator state with spc_copy_state(). - -* You can save as an SPC music file with spc_save_spc(). - -* When done, use spc_delete() to free memory. - - -DSP Emulation -------------- -See dsp.h for full function reference (SPC_DSP.h if using C++). - -* Create DSP emulator with spc_dsp_new() and check for NULL. - -* Let the DSP know where your 64K RAM is with spc_dsp_init(). - -* When your emulated SNES is powered on, call spc_dsp_reset(). When the -reset switch is pressed, call spc_dsp_soft_reset(). - -* Call spc_dsp_set_output() with your output buffer, then do emulation. - -* Use spc_dsp_run() to run DSP for specified number of clocks (1024000 -per second). Every 32 clocks a pair of samples is added to your output -buffer. - -* Use spc_dsp_read() and spc_dsp_write() to handle DSP reads/writes from -the S-SMP. Before calling these always catch the DSP up to present time -with spc_dsp_run(). - -* Periodically play samples from your buffer. Use spc_dsp_sample_count() -to find out how many samples have been written, then -spc_dsp_set_output() after you've made more space in your buffer. - -* Use spc_dsp_copy_state() to save/load full DSP state. - -* When done, use spc_delete() to free memory. - - -SPC Music Playback ------------------- -See spc.h for full function reference (SNES_SPC.h if using C++). - -* Create SPC emulator with spc_new() and check for NULL. - -* Load SPC with spc_load_spc() and check for error. - -* Optionally cear echo buffer with spc_clear_echo(). Many SPCs have -garbage in echo buffer, which causes noise at the beginning. - -* Generate samples as needed with spc_play(). - -* When done, use spc_delete() to free memory. - -* For a more complete game music playback library, use Game_Music_Emu - - -State Copying -------------- -The SPC and DSP modules include state save/load functions. They take a -pointer to a pointer to a buffer to store state, and a copy function. -This copy function can either copy data to the buffer or from it, -allowing state save and restore with the same library function. The -internal save state format allows for future expansion without making -previous save states unusable. - -The SPC save state format puts the most important parts first to make it -easier to manually examine. It's organized as follows: - -Offset Size Data -- - - - - - - - - - - - - - - - - - - 0 $10000 SPC RAM -$10000 $10 SMP $F0-$FF registers -$10010 4 SMP $F4-$F8 output registers -$10014 2 PC -$10016 1 A -$10017 1 X -$10018 1 Y -$10019 1 PSW -$1001A 1 SP -$1001B 5 internal -$10020 $80 DSP registers -$100A0 ... internal - - -Library Compilation -------------------- -While this library is in C++, it has been written to easily link in a C -program *without* needing the standard C++ library. It doesn't use -exception handling or run-time type information (RTTI), so you can -disable these in your C++ compiler to increase efficiency. - -If you're building a shared library (DLL), I recommend only exporting -the C interfaces in spc.h and dsp.h, as the C++ interfaces expose -implementation details that will break link compatibility across -versions. - -If you're using C and compiling with GCC, I recommend the following -command-line options when compiling the library source, otherwise GCC -will insert calls to the standard C++ library and require that it be -linked in: - - -fno-rtti -fno-exceptions - -For maximum optimization, see the NDEBUG and BLARGG_NONPORTABLE options -in blargg_config. If using GCC, you can enable these by adding the -following command-line options when you invoke gcc. If you encounter -problems, try without -DBLARGG_NONPORTABLE; if that works, contact me so -I can figure out why BLARGG_NONPORTABLE was causing it to fail. - - -O3 -DNDEBUG -DBLARGG_NONPORTABLE -fno-rtti -fno-exceptions - - - -Error handling --------------- -Functions which can fail have a return type of spc_err_t (blargg_err_t -in the C++ interfaces), which is a pointer to an error string (const -char*). If a function is successful it returns NULL. Errors that you can -easily avoid are checked with debug assertions; spc_err_t return values -are only used for genuine run-time errors that can't be easily predicted -in advance (out of memory, I/O errors, incompatible file data). Your -code should check all error values. - -To improve usability for C programmers, C++ programmers unfamiliar with -exceptions, and compatibility with older C++ compilers, the library does -*not* throw any C++ exceptions and uses malloc() instead of the standard -operator new. This means that you *must* check for NULL when creating a -library object with the new operator. - - -Solving Problems ----------------- -If you're having problems, try the following: - -* If you're getting garbled sound, try this simple siren generator in -place of your call to play(). This will quickly tell whether the problem -is in the library or in your code. - - static void play_siren( long count, short* out ) - { - static double a, a2; - while ( count-- ) - *out++ = 0x2000 * sin( a += .1 + .05*sin( a2+=.00005 ) ); - } - -* Enable debugging support in your environment. This enables assertions -and other run-time checks. - -* Turn the compiler's optimizer is off. Sometimes an optimizer generates -bad code. - -* If multiple threads are being used, ensure that only one at a time is -accessing a given set of objects from the library. This library is not -in general thread-safe, though independent objects can be used in -separate threads. - -* If all else fails, see if the demos work. - - -Accurate S-DSP Limitations --------------------------- -* Power-up and soft reset behavior might have slight inaccuracies. - -* Muting (FLG bit 6) behavior when toggling bit very rapidly is not -emulated properly. - -* No other known inaccuracies. Has passed 100+ strenuous tests. - - -Fast S-DSP Limitations ----------------------- -* Uses faster sample calculations except in cases where exact value is -actually important (BRR decoding, and gaussian interpolation combined -with pitch modulation). - -* Stops decoding BRR data when a voice's envelope has released to -silence. - -* Emulates 32 clocks at a time, so DSP register and memory accesses are -all done in a bunch rather than spread out. Even though, some clever -code makes register accesses separated by 40 or so clocks occur with -cycle-accurate timing. - - -S-SMP Limitations ------------------ -* Opcode fetches and indirect pointers are always read directly from -memory, even for the $F0-$FF region, and the DSP is not caught up for -these fetches. - -* Attempts to perversely execute data in registers or an area being -modified by echo will not be emulated properly. - -* Has not been thoroughly tested. - -* Test register ($F0) is not implemented. - -* Echo buffer can overwrite IPL ROM area, and does not correctly update -extra RAM there. - - -To Do ------ -* I'd like feedback on the interface and any ways to improve it. In -particular, the differing features between the accurate and fast DSP -emulators might make it harder to cleanly switch between them without -modifying source code. - -* Finish thorough tests on SMP memory access times. - -* Finish thorough tests on SMP instruction behavior (flags, registers). - -* Finish thorough tests on SMP timers. - -* Finish power-up and reset behavior testing. - -* Come up with best starting conditions to play an SPC and implement in -hardware SNES SPC player for verification. - - -Thanks ------- -Thanks to Anti-Resonance's SPC2ROM and help getting SPCs playing on my -SNES in the first place, then Brad Martin's openspc and Chris Moeller's -openspc++ C++ adaptation, giving me a good SPC emulator to start with -several years ago. Thanks to Richard Bannister, Mahendra Tallur, Shazz, -nenolod, theHobbit, Johan Samuelsson, nes6502, and Micket for helping -test my Game_Music_Emu library. Thanks to hcs for help in converting to -C for the Rockbox port. Thanks to byuu (bsnes author) and pagefault and -Nach (zsnes team) for testing and using my new rewritten DSP in their -emulators. Thanks to anomie for his good SNES documentation and -discussions with me to keep it up to date with my latest findings. --- -Shay Green diff --git a/waterbox/pizza/lib/snes_spc/spc.cpp b/waterbox/pizza/lib/snes_spc/spc.cpp deleted file mode 100644 index 4e5a77ef15..0000000000 --- a/waterbox/pizza/lib/snes_spc/spc.cpp +++ /dev/null @@ -1,74 +0,0 @@ -// snes_spc 0.9.0. http://www.slack.net/~ant/ - -#include "spc.h" - -#include "SNES_SPC.h" -#include "SPC_Filter.h" - -/* Copyright (C) 2004-2007 Shay Green. This module is free software; you -can redistribute it and/or modify it under the terms of the GNU Lesser -General Public License as published by the Free Software Foundation; either -version 2.1 of the License, or (at your option) any later version. This -module is distributed in the hope that it will be useful, but WITHOUT ANY -WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS -FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more -details. You should have received a copy of the GNU Lesser General Public -License along with this module; if not, write to the Free Software Foundation, -Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ - -#include "blargg_source.h" - -SNES_SPC* spc_new( void ) -{ - // be sure constants match - assert( spc_sample_rate == (int) SNES_SPC::sample_rate ); - assert( spc_rom_size == (int) SNES_SPC::rom_size ); - assert( spc_clock_rate == (int) SNES_SPC::clock_rate ); - assert( spc_clocks_per_sample == (int) SNES_SPC::clocks_per_sample ); - assert( spc_port_count == (int) SNES_SPC::port_count ); - assert( spc_voice_count == (int) SNES_SPC::voice_count ); - assert( spc_tempo_unit == (int) SNES_SPC::tempo_unit ); - assert( spc_file_size == (int) SNES_SPC::spc_file_size ); - #if !SPC_NO_COPY_STATE_FUNCS - assert( spc_state_size == (int) SNES_SPC::state_size ); - #endif - - SNES_SPC* s = new SNES_SPC; - if ( s && s->init() ) - { - delete s; - s = 0; - } - return s; -} - -void spc_delete ( SNES_SPC* s ) { delete s; } -void spc_init_rom ( SNES_SPC* s, unsigned char const r [64] ) { s->init_rom( r ); } -void spc_set_output ( SNES_SPC* s, spc_sample_t* p, int n ) { s->set_output( p, n ); } -int spc_sample_count ( SNES_SPC const* s ) { return s->sample_count(); } -void spc_reset ( SNES_SPC* s ) { s->reset(); } -void spc_soft_reset ( SNES_SPC* s ) { s->soft_reset(); } -int spc_read_port ( SNES_SPC* s, spc_time_t t, int p ) { return s->read_port( t, p ); } -void spc_write_port ( SNES_SPC* s, spc_time_t t, int p, int d ) { s->write_port( t, p, d ); } -void spc_end_frame ( SNES_SPC* s, spc_time_t t ) { s->end_frame( t ); } -void spc_mute_voices ( SNES_SPC* s, int mask ) { s->mute_voices( mask ); } -void spc_disable_surround( SNES_SPC* s, int disable ) { s->disable_surround( disable ); } -void spc_set_tempo ( SNES_SPC* s, int tempo ) { s->set_tempo( tempo ); } -uint8_t* spc_get_ram(SNES_SPC* s) { return s->get_ram(); } -spc_err_t spc_load_spc ( SNES_SPC* s, void const* p, long n ) { return s->load_spc( p, n ); } -void spc_clear_echo ( SNES_SPC* s ) { s->clear_echo(); } -spc_err_t spc_play ( SNES_SPC* s, int count, short* out ) { return s->play( count, out ); } -spc_err_t spc_skip ( SNES_SPC* s, int count ) { return s->skip( count ); } -#if !SPC_NO_COPY_STATE_FUNCS -void spc_copy_state ( SNES_SPC* s, unsigned char** p, spc_copy_func_t f ) { s->copy_state( p, f ); } -void spc_init_header ( void* spc_out ) { SNES_SPC::init_header( spc_out ); } -void spc_save_spc ( SNES_SPC* s, void* spc_out ) { s->save_spc( spc_out ); } -int spc_check_kon ( SNES_SPC* s ) { return s->check_kon(); } -#endif - -SPC_Filter* spc_filter_new( void ) { return new SPC_Filter; } -void spc_filter_delete( SPC_Filter* f ) { delete f; } -void spc_filter_run( SPC_Filter* f, spc_sample_t* p, int s ) { f->run( p, s ); } -void spc_filter_clear( SPC_Filter* f ) { f->clear(); } -void spc_filter_set_gain( SPC_Filter* f, int gain ) { f->set_gain( gain ); } -void spc_filter_set_bass( SPC_Filter* f, int bass ) { f->set_bass( bass ); } diff --git a/waterbox/pizza/lib/snes_spc/spc.h b/waterbox/pizza/lib/snes_spc/spc.h deleted file mode 100644 index cf23f3c945..0000000000 --- a/waterbox/pizza/lib/snes_spc/spc.h +++ /dev/null @@ -1,149 +0,0 @@ -/* SNES SPC-700 APU emulator C interface (also usable from C++) */ - -/* snes_spc 0.9.0 */ -#ifndef SPC_H -#define SPC_H - -#include -#include - -#ifdef __cplusplus - extern "C" { -#endif - -/* Error string return. NULL if success, otherwise error message. */ -typedef const char* spc_err_t; - -typedef struct SNES_SPC SNES_SPC; - -/* Creates new SPC emulator. NULL if out of memory. */ -SNES_SPC* spc_new( void ); - -/* Frees SPC emulator */ -void spc_delete( SNES_SPC* ); - -/* Sample pairs generated per second */ -enum { spc_sample_rate = 32000 }; - - -/**** Emulator use ****/ - -/* Sets IPL ROM data. Library does not include ROM data. Most SPC music files -don't need ROM, but a full emulator must provide this. */ -enum { spc_rom_size = 0x40 }; -void spc_init_rom( SNES_SPC*, unsigned char const rom [spc_rom_size] ); - -/* Sets destination for output samples */ -typedef short spc_sample_t; -void spc_set_output( SNES_SPC*, spc_sample_t* out, int out_size ); - -/* Number of samples written to output since last set */ -int spc_sample_count( SNES_SPC const* ); - -/* Resets SPC to power-on state. This resets your output buffer, so you must -call spc_set_output() after this. */ -void spc_reset( SNES_SPC* ); - -/* Emulates pressing reset switch on SNES. This resets your output buffer, so -you must call spc_set_output() after this. */ -void spc_soft_reset( SNES_SPC* ); - -/* 1024000 SPC clocks per second, sample pair every 32 clocks */ -typedef int spc_time_t; -enum { spc_clock_rate = 1024000 }; -enum { spc_clocks_per_sample = 32 }; - -/* Reads/writes port at specified time */ -enum { spc_port_count = 4 }; -int spc_read_port ( SNES_SPC*, spc_time_t, int port ); -void spc_write_port( SNES_SPC*, spc_time_t, int port, int data ); - -/* Runs SPC to end_time and starts a new time frame at 0 */ -void spc_end_frame( SNES_SPC*, spc_time_t end_time ); - -uint8_t* spc_get_ram(SNES_SPC*); - -/**** Sound control ****/ - -/*Mutes voices corresponding to non-zero bits in mask. Reduces emulation accuracy. */ -enum { spc_voice_count = 8 }; -void spc_mute_voices( SNES_SPC*, int mask ); - -/* If true, prevents channels and global volumes from being phase-negated. -Only supported by fast DSP; has no effect on accurate DSP. */ -void spc_disable_surround( SNES_SPC*, int disable ); - -/* Sets tempo, where spc_tempo_unit = normal, spc_tempo_unit / 2 = half speed, etc. */ -enum { spc_tempo_unit = 0x100 }; -void spc_set_tempo( SNES_SPC*, int ); - - -/**** SPC music playback *****/ - -/* Loads SPC data into emulator. Returns NULL on success, otherwise error string. */ -spc_err_t spc_load_spc( SNES_SPC*, void const* spc_in, long size ); - -/* Clears echo region. Useful after loading an SPC as many have garbage in echo. */ -void spc_clear_echo( SNES_SPC* ); - -/* Plays for count samples and write samples to out. Discards samples if out -is NULL. Count must be a multiple of 2 since output is stereo. */ -spc_err_t spc_play( SNES_SPC*, int count, short* out ); - -/* Skips count samples. Several times faster than spc_play(). */ -spc_err_t spc_skip( SNES_SPC*, int count ); - - -/**** State save/load (only available with accurate DSP) ****/ - -/* Saves/loads exact emulator state */ -enum { spc_state_size = 67 * 1024L }; /* maximum space needed when saving */ -typedef void (*spc_copy_func_t)( unsigned char** io, void* state, size_t ); -void spc_copy_state( SNES_SPC*, unsigned char** io, spc_copy_func_t ); - -/* Writes minimal SPC file header to spc_out */ -void spc_init_header( void* spc_out ); - -/* Saves emulator state as SPC file data. Writes spc_file_size bytes to spc_out. -Does not set up SPC header; use spc_init_header() for that. */ -enum { spc_file_size = 0x10200 }; /* spc_out must have this many bytes allocated */ -void spc_save_spc( SNES_SPC*, void* spc_out ); - -/* Returns non-zero if new key-on events occurred since last check. Useful for -trimming silence while saving an SPC. */ -int spc_check_kon( SNES_SPC* ); - - -/**** SPC_Filter ****/ - -typedef struct SPC_Filter SPC_Filter; - -/* Creates new filter. NULL if out of memory. */ -SPC_Filter* spc_filter_new( void ); - -/* Frees filter */ -void spc_filter_delete( SPC_Filter* ); - -/* Filters count samples of stereo sound in place. Count must be a multiple of 2. */ -void spc_filter_run( SPC_Filter*, spc_sample_t* io, int count ); - -/* Clears filter to silence */ -void spc_filter_clear( SPC_Filter* ); - -/* Sets gain (volume), where spc_filter_gain_unit is normal. Gains greater than -spc_filter_gain_unit are fine, since output is clamped to 16-bit sample range. */ -enum { spc_filter_gain_unit = 0x100 }; -void spc_filter_set_gain( SPC_Filter*, int gain ); - -/* Sets amount of bass (logarithmic scale) */ -enum { spc_filter_bass_none = 0 }; -enum { spc_filter_bass_norm = 8 }; /* normal amount */ -enum { spc_filter_bass_max = 31 }; -void spc_filter_set_bass( SPC_Filter*, int bass ); - - -#ifdef __cplusplus - } -#endif - -#endif diff --git a/waterbox/pizza/lib/sound.c b/waterbox/pizza/lib/sound.c deleted file mode 100644 index 183e07a6b7..0000000000 --- a/waterbox/pizza/lib/sound.c +++ /dev/null @@ -1,1159 +0,0 @@ -/* - - This file is part of Emu-Pizza - - Emu-Pizza is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Emu-Pizza is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Emu-Pizza. If not, see . - -*/ - -#include "cycles.h" -#include "global.h" -#include "gpu.h" -#include "mmu.h" -#include "sound.h" -#include "utils.h" -#include "sound_output.h" - -#include -#include -#include - -/* super variable for audio controller */ -sound_t sound; - -// functions to connect to blip buf -static int16_t last_sample[8]; - -#define BLIP_LEFT(v,i) if(1){int32_t d = (v)-last_sample[(i)*2];blip_left(d);last_sample[(i)*2] = (v);} -#define BLIP_RIGHT(v,i) if(1){int32_t d = (v)-last_sample[(i)*2+1];blip_right(d);last_sample[(i)*2+1] = (v);} - -static void blip_ch1() -{ - if (sound.channel_one.active) - { - if (sound.nr51->ch1_to_so1) - BLIP_RIGHT(sound.channel_one.sample, 0); - if (sound.nr51->ch1_to_so2) - BLIP_LEFT(sound.channel_one.sample, 0); - } -} -static void blip_ch2() -{ - if (sound.channel_two.active) - { - if (sound.nr51->ch2_to_so1) - BLIP_RIGHT(sound.channel_two.sample, 1); - if (sound.nr51->ch2_to_so2) - BLIP_LEFT(sound.channel_two.sample, 1); - } -} -static void blip_ch3() -{ - if (sound.channel_three.active) - { - uint16_t sample; - uint8_t shift = sound.nr32->volume_code == 0 ? 4 : sound.nr32->volume_code - 1; - - /* volume is zero in any case */ - if (shift == 4) - sample = 0; - else - { - /* apply volume change */ - uint8_t idx = sound.channel_three.index; - uint16_t s; - - /* extract current sample */ - if ((idx & 0x01) == 0) - s = (sound.wave_table[idx >> 1] & 0xf0) >> 4; - else - s = sound.wave_table[idx >> 1] & 0x0f; - - /* transform it into signed 16 bit sample */ - sample = ((s * 0x222) >> shift); - } - - if (sound.nr51->ch3_to_so1) - BLIP_RIGHT(sample, 2); - if (sound.nr51->ch3_to_so2) - BLIP_LEFT(sample, 2); - } -} -static void blip_ch4() -{ - if (sound.channel_four.active) - { - if (sound.nr51->ch4_to_so1) - BLIP_RIGHT(sound.channel_four.sample, 3); - if (sound.nr51->ch4_to_so2) - BLIP_LEFT(sound.channel_four.sample, 3); - } -} - -/* internal prototypes */ -void sound_envelope_step(); -void sound_length_ctrl_step(); -void sound_sweep_step(); -void sound_write_wave(uint16_t a, uint8_t v); - -void sound_init_pointers() -{ - /* point sound structures to their memory areas */ - sound.nr10 = (nr10_t *) mmu_addr(0xFF10); - sound.nr11 = (nr11_t *) mmu_addr(0xFF11); - sound.nr12 = (nr12_t *) mmu_addr(0xFF12); - sound.nr13 = (nr13_t *) mmu_addr(0xFF13); - sound.nr14 = (nr14_t *) mmu_addr(0xFF14); - - sound.nr21 = (nr21_t *) mmu_addr(0xFF16); - sound.nr22 = (nr22_t *) mmu_addr(0xFF17); - sound.nr23 = (nr23_t *) mmu_addr(0xFF18); - sound.nr24 = (nr24_t *) mmu_addr(0xFF19); - - sound.nr30 = (nr30_t *) mmu_addr(0xFF1A); - sound.nr31 = (nr31_t *) mmu_addr(0xFF1B); - sound.nr32 = (nr32_t *) mmu_addr(0xFF1C); - sound.nr33 = (nr33_t *) mmu_addr(0xFF1D); - sound.nr34 = (nr34_t *) mmu_addr(0xFF1E); - - sound.nr41 = (nr41_t *) mmu_addr(0xFF20); - sound.nr42 = (nr42_t *) mmu_addr(0xFF21); - sound.nr43 = (nr43_t *) mmu_addr(0xFF22); - sound.nr44 = (nr44_t *) mmu_addr(0xFF23); - - sound.nr50 = mmu_addr(0xFF24); - sound.nr51 = mmu_addr(0xFF25); - sound.nr52 = mmu_addr(0xFF26); - - sound.wave_table = mmu_addr(0xFF30); -} - -/* init sound states */ -void sound_init() -{ - /* reset structure */ - bzero(&sound, sizeof(sound_t)); - - /* point sound structures to their memory areas */ - sound_init_pointers(); - - /* how many cpu cycles we need to emit a 512hz clock (frame sequencer) */ - sound.fs_cycles = 4194304 / 512; - - /* how many cpu cycles to generate a single frame seq clock? */ - sound.fs_cycles_next = sound.fs_cycles; -} - -void sound_set_speed(char dbl) -{ -} - -/* update sound internal state given CPU T-states */ -void sound_step_fs() -{ - /* rotate from 0 to 7 */ - sound.fs_cycles_idx = (sound.fs_cycles_idx + 1) & 0x07; - - /* reset fs cycles counter */ - sound.fs_cycles_next = cycles.cnt + - (sound.fs_cycles << global_cpu_double_speed); - - /* length controller works at 256hz */ - if ((sound.fs_cycles_idx & 0x01) == 0) - sound_length_ctrl_step(); - - /* sweep works at 128hz */ - if (sound.fs_cycles_idx == 2 || sound.fs_cycles_idx == 6) - sound_sweep_step(); - - /* envelope works at 64hz */ - if (sound.fs_cycles_idx == 7) - sound_envelope_step(); - blip_ch1(); - blip_ch2(); - blip_ch3(); - blip_ch4(); -} - -/* update all channels */ -void sound_step_ch1() -{ - /* recalc current samples */ - if ((sound.channel_one.duty >> sound.channel_one.duty_idx) & 0x01) - sound.channel_one.sample = sound.channel_one.volume; - else - sound.channel_one.sample = -sound.channel_one.volume; - - /* step to the next duty value */ - sound.channel_one.duty_idx = - (sound.channel_one.duty_idx + 1) & 0x07; - - /* go back */ - sound.channel_one.duty_cycles_next += sound.channel_one.duty_cycles; - blip_ch1(); -} - -void sound_step_ch2() -{ - /* recalc current samples */ - if ((sound.channel_two.duty >> sound.channel_two.duty_idx) & 0x01) - sound.channel_two.sample = sound.channel_two.volume; - else - sound.channel_two.sample = -sound.channel_two.volume; - - /* step to the next duty value */ - sound.channel_two.duty_idx = - (sound.channel_two.duty_idx + 1) & 0x07; - - /* go back */ - sound.channel_two.duty_cycles_next += sound.channel_two.duty_cycles; - blip_ch2(); -} - -void sound_step_ch3() -{ - /* switch to the next wave sample */ - sound.channel_three.index = (sound.channel_three.index + 1) & 0x1F; - - /* set the new current sample */ - sound.channel_three.sample = - sound.channel_three.wave[sound.channel_three.index]; - - /* reload new period */ - uint_fast16_t freq = sound.nr33->frequency_lsb | - (sound.nr34->frequency_msb << 8); - - /* qty of cpu ticks needed for a wave sample change */ - sound.channel_three.cycles = ((2048 - freq) * 2) << global_cpu_double_speed; - sound.channel_three.cycles_next += sound.channel_three.cycles; - blip_ch3(); -} - -void sound_step_ch4() -{ - /* update LSFR */ - if (sound.nr43->shift < 14) - { - /* shift register one bit right */ - uint16_t s = sound.channel_four.reg >> 1; - - /* xor current register and the shifted version */ - /* and extract bit zero */ - uint16_t x = (sound.channel_four.reg ^ s) & 1; - - /* update register */ - sound.channel_four.reg = s | x << 14; - - /* if width is set... */ - if (sound.nr43->width) - sound.channel_four.reg = - (sound.channel_four.reg & 0xBF) | x << 6; - } - - /* update sample */ - if (sound.channel_four.reg & 0x01) - sound.channel_four.sample = -sound.channel_four.volume; - else - sound.channel_four.sample = sound.channel_four.volume; - - /* qty of cpu ticks needed for a wave sample change */ - sound.channel_four.cycles_next += sound.channel_four.period_lfsr; - blip_ch4(); -} - -/* update length of channel1 */ -void static inline sound_length_ctrl_step_ch(char length_enable, - uint_fast32_t *length, - uint8_t *active) -{ - if (length_enable && *length != 0) - { - (*length)--; - - /* if ZERO is reached, turn off the channel */ - if (*length == 0) - *active = 0; - } -} - -/* length controller step */ -void sound_length_ctrl_step() -{ - /* step every channel */ - sound_length_ctrl_step_ch(sound.nr14->length_enable, - &sound.channel_one.length, - &sound.channel_one.active); - - sound_length_ctrl_step_ch(sound.nr24->length_enable, - &sound.channel_two.length, - &sound.channel_two.active); - - sound_length_ctrl_step_ch(sound.nr34->length_enable, - &sound.channel_three.length, - &sound.channel_three.active); - - sound_length_ctrl_step_ch(sound.nr44->length_enable, - &sound.channel_four.length, - &sound.channel_four.active); -} - -/* calc the new frequency by sweep module */ -uint_fast32_t sound_sweep_calc() -{ - uint_fast32_t new_freq; - - /* time to update frequency */ - uint_fast32_t diff = - sound.channel_one.sweep_shadow_frequency >> - sound.nr10->shift; - - /* the calculated diff must be summed or subtracted to frequency */ - if (sound.nr10->negate) - { - new_freq = sound.channel_one.sweep_shadow_frequency - diff; - sound.channel_one.sweep_neg = 1; - } - else - new_freq = sound.channel_one.sweep_shadow_frequency + diff; - - /* if freq > 2047, turn off the channel */ - if (new_freq > 2047) - sound.channel_one.active = 0; - - return new_freq; -} - -/* set channel one new frequency */ -void sound_set_frequency(uint_fast32_t new_freq) -{ - /* too high? */ - if (new_freq > 2047) - { - sound.channel_one.active = 0; - return; - } - - /* update with the new frequency */ - sound.channel_one.frequency = new_freq; - - /* update them also into memory */ - sound.nr13->frequency_lsb = (uint8_t) (new_freq & 0x000000ff); - sound.nr14->frequency_msb = (uint8_t) ((new_freq >> 8) & 0x00000007); - - /* update the duty cycles */ - sound.channel_one.duty_cycles = - ((2048 - new_freq) * 4) << global_cpu_double_speed; - - /* and reset them */ - sound.channel_one.duty_cycles_next = - cycles.cnt + sound.channel_one.duty_cycles; -} - -/* step of frequency sweep at 128hz */ -void sound_sweep_step() -{ - uint_fast32_t new_freq; - - if (sound.channel_one.active && - sound.channel_one.sweep_active) - { - /* make it rotate from 0 to 8 */ - sound.channel_one.sweep_cnt++; - - /* enough cycles? */ - if (sound.channel_one.sweep_cnt == sound.channel_one.sweep_next) - { - /* reload the next step - 0 is treated as 8 */ - sound.channel_one.sweep_next = - sound.nr10->sweep_period ? - sound.nr10->sweep_period : 8; - - /* reset sweep counter */ - sound.channel_one.sweep_cnt = 0; - - /* period must be > 0 if new freq gotta be updated */ - if (sound.nr10->sweep_period == 0) - return; - - /* calc new frequency */ - new_freq = sound_sweep_calc(); - - /* set it only if < 2048 and shift != 0 */ - if (sound.nr10->shift && - new_freq < 2048) - { - /* copy new_freq into shadow register */ - sound.channel_one.sweep_shadow_frequency = new_freq; - - /* update all the stuff related to new frequency */ - sound_set_frequency(new_freq); - - /* update freq again (but only in shadow register) */ - sound_sweep_calc(); - } - } - } -} - -/* step of envelope at 64hz */ -void sound_envelope_step() -{ - if (sound.channel_one.active && sound.nr12->period) - { - /* update counter */ - sound.channel_one.envelope_cnt++; - - /* if counter reaches period, update volume */ - if (sound.channel_one.envelope_cnt == sound.nr12->period) - { - if (sound.nr12->add) - { - if (sound.channel_one.volume < (14 * 0x111)) - sound.channel_one.volume += 0x111; - } - else - { - if (sound.channel_one.volume >= 0x111) - sound.channel_one.volume -= 0x111; - } - - /* reset counter */ - sound.channel_one.envelope_cnt = 0; - } - } - - if (sound.channel_two.active && sound.nr22->period) - { - /* update counter */ - sound.channel_two.envelope_cnt++; - - /* if counter reaches period, update volume */ - if (sound.channel_two.envelope_cnt == sound.nr22->period) - { - if (sound.nr22->add) - { - if (sound.channel_two.volume < (14 * 0x111)) - sound.channel_two.volume += 0x111; - } - else - { - if (sound.channel_two.volume >= 0x111) - sound.channel_two.volume -= 0x111; - } - - /* reset counter */ - sound.channel_two.envelope_cnt = 0; - } - } - - if (sound.channel_four.active && sound.nr42->period) - { - /* update counter */ - sound.channel_four.envelope_cnt++; - - /* if counter reaches period, update volume */ - if (sound.channel_four.envelope_cnt == sound.nr42->period) - { - if (sound.nr42->add) - { - if (sound.channel_four.volume < (14 * 0x111)) - sound.channel_four.volume += 0x111; - } - else - { - if (sound.channel_four.volume > 0x111) - sound.channel_four.volume -= 0x111; - } - - /* reset counter */ - sound.channel_four.envelope_cnt = 0; - } - } -} - -uint8_t sound_read_reg(uint16_t a, uint8_t v) -{ - switch (a) - { - /* NR1X */ - case 0xFF10: return v | 0x80; - case 0xFF11: return v | 0x3F; - case 0xFF12: return v; - case 0xFF13: return v | 0xFF; - case 0xFF14: return v | 0xBF; - /* NR2X */ - case 0xFF15: return v | 0xFF; - case 0xFF16: return v | 0x3F; - case 0xFF17: return v; - case 0xFF18: return v | 0xFF; - case 0xFF19: return v | 0xBF; - /* NR3X */ - case 0xFF1A: return v | 0x7F; - case 0xFF1B: return v | 0xFF; - case 0xFF1C: return v | 0x9F; - case 0xFF1D: return v | 0xFF; - case 0xFF1E: return v | 0xBF; - /* NR4X */ - case 0xFF1F: return v | 0xFF; - case 0xFF20: return v | 0xFF; - case 0xFF21: return v; - case 0xFF22: return v; - case 0xFF23: return v | 0xBF; - /* NR5X */ - case 0xFF24: return v; - case 0xFF25: return v; - case 0xFF26: - if (sound.nr52->power) - return 0xf0 | - sound.channel_one.active | - (sound.channel_two.active << 1) | - (sound.channel_three.active << 2) | - (sound.channel_four.active << 3); - else - return 0x70; - case 0xFF27: - case 0xFF28: - case 0xFF29: - case 0xFF2A: - case 0xFF2B: - case 0xFF2C: - case 0xFF2D: - case 0xFF2E: - case 0xFF2F: return 0xFF; - case 0xFF30: - case 0xFF31: - case 0xFF32: - case 0xFF33: - case 0xFF34: - case 0xFF35: - case 0xFF36: - case 0xFF37: - case 0xFF38: - case 0xFF39: - case 0xFF3A: - case 0xFF3B: - case 0xFF3C: - case 0xFF3D: - case 0xFF3E: - case 0xFF3F: - if (sound.channel_three.active) - { -/* if (!global_cgb && sound.channel_three.ram_access != 0) - { - printf("RAM ACCESSO NON ZERO %u - CNT %d NEXT %d\n", - sound.channel_three.ram_access, cycles.cnt, sound.channel_three.ram_access_next); - return 0xFF; - }*/ - if (!global_cgb && - cycles.cnt < sound.channel_three.ram_access_next) - return 0xFF; - - return sound.wave_table[sound.channel_three.index >> 1]; - } - - default: return v; - } -} - -void sound_write_reg(uint16_t a, uint8_t v) -{ - /* when turned off, only write to NR52 (0xFF26) is legit */ - if (!sound.nr52->power && a != 0xFF26) - { - /* CGB mode doesnt allow any write on register during power off */ - if (global_cgb) - return; - - /* in DMG mode, update length is legit while no power */ - switch (a) - { - case 0xFF11: sound.channel_one.length = 64 - (v & 0x3f); return; - case 0xFF16: sound.channel_two.length = 64 - (v & 0x3f); return; - case 0xFF1B: sound.channel_three.length = 256 - v; return; - case 0xFF20: sound.channel_four.length = 64 - (v & 0x3f); return; - default: return; - } - } - - /* wave write */ - if (a >= 0xFF30 && a <= 0xFF3F) - return sound_write_wave(a, v); - - /* save old value */ - uint8_t old = *((uint8_t *) mmu_addr(a)); - - /* confirm write on memory */ - *((uint8_t *) mmu_addr(a)) = v; - - switch (a) - { - case 0xFF10: - - if (!sound.nr10->negate && sound.channel_one.sweep_neg) - sound.channel_one.active = 0; - - break; - - case 0xFF11: - - /* set length as 64 - length_load */ - sound.channel_one.length = 64 - sound.nr11->length_load; - - /* update duty type */ - switch (sound.nr11->duty) - { - /* 12.5 % */ - case 0x00: sound.channel_one.duty = 0x80; - break; - - /* 25% */ - case 0x01: sound.channel_one.duty = 0x81; - break; - - /* 50% */ - case 0x02: sound.channel_one.duty = 0xE1; - break; - - /* 75% */ - case 0x03: sound.channel_one.duty = 0x7E; - break; - } - - break; - - case 0xFF12: - - /* volume 0 = turn off the DAC = turn off channeru */ - if (sound.nr12->volume == 0 && - sound.nr12->add == 0) - sound.channel_one.active = 0; - - break; - - case 0xFF13: - - /* update frequncy */ - sound.channel_one.frequency = sound.nr13->frequency_lsb | - (sound.nr14->frequency_msb << 8); - - /* update duty cycles */ - sound.channel_one.duty_cycles = - ((2048 - sound.channel_one.frequency) * 4) - << global_cpu_double_speed; - - break; - - case 0xFF14: - - /* length counter turned on */ - if (sound.nr14->length_enable) - { - nr14_t *old_nr14 = (nr14_t *) &old; - - /* give an extra length clock if */ - /* 1) we switched from off to on the len counter */ - /* 2) we are in the first half of len clock */ - /* 3) actual length is not zero */ - if ((old_nr14->length_enable == 0) && - ((sound.fs_cycles_idx & 0x01) == 0x00) && - (sound.channel_one.length != 0)) - sound_length_ctrl_step_ch(sound.nr14->length_enable, - &sound.channel_one.length, - &sound.channel_one.active); - } - - /* always update frequency, even if it's not a trigger */ - sound.channel_one.frequency = sound.nr13->frequency_lsb | - (sound.nr14->frequency_msb << 8); - - /* qty of cpu ticks needed for a duty change */ - /* (1/8 of wave cycle) */ - sound.channel_one.duty_cycles = - ((2048 - sound.channel_one.frequency) * 4) - << global_cpu_double_speed; - - if (v & 0x80) - { - /* if we switch from OFF to ON, reset duty idx */ - if (sound.channel_two.active == 0) - sound.channel_two.duty_idx = 0; - - /* setting internal modules data with stuff taken from memory */ - sound.channel_one.active = 1; - sound.channel_one.duty_cycles_next = - cycles.cnt + sound.channel_one.duty_cycles; - - /* set the 8 phase of a duty cycle by setting 8 bits */ - switch (sound.nr11->duty) - { - /* 12.5 % */ - case 0x00: sound.channel_one.duty = 0x80; - break; - - /* 25% */ - case 0x01: sound.channel_one.duty = 0x81; - break; - - /* 50% */ - case 0x02: sound.channel_one.duty = 0xE1; - break; - - /* 75% */ - case 0x03: sound.channel_one.duty = 0x7E; - break; - } - - /* calc length */ - if (sound.channel_one.length == 0) - sound.channel_one.length = 64; - - /* base volume */ - sound.channel_one.volume = - sound.nr12->volume * 0x111; - - /* reset envelope counter */ - sound.channel_one.envelope_cnt = 0; - - /* save current freq into sweep shadow register */ - sound.channel_one.sweep_shadow_frequency = - sound.channel_one.frequency; - - /* reset sweep timer */ - sound.channel_one.sweep_cnt = 0; - - /* reset sweep neg bool */ - sound.channel_one.sweep_neg = 0; - - /* reload the next step */ - sound.channel_one.sweep_next = sound.nr10->sweep_period ? - sound.nr10->sweep_period : 8; - - /* set sweep as active if period != 0 or shift != 0 */ - if (sound.nr10->sweep_period != 0 || - sound.nr10->shift != 0) - sound.channel_one.sweep_active = 1; - else - sound.channel_one.sweep_active = 0; - - /* if shift is != 0, calc the new frequency */ - if (sound.nr10->shift != 0) - { - uint32_t new_freq = sound_sweep_calc(); - - /* update all the stuff related to new frequency */ - sound_set_frequency(new_freq); - } - - /* if DAC is off, turn off the channel */ - if (sound.nr12->add == 0 && - sound.nr12->volume == 0) - sound.channel_one.active = 0; - - /* extra length clock if length == 64 */ - /* and FS is in the fist half */ - if ((sound.fs_cycles_idx & 0x01) == 0x00 && - sound.channel_one.length == 64) - sound_length_ctrl_step_ch(sound.nr14->length_enable, - &sound.channel_one.length, - &sound.channel_one.active); - } - - - break; - - case 0xFF16: - - sound.channel_two.length = 64 - sound.nr21->length_load; - - /* update duty type */ - switch (sound.nr21->duty) - { - /* 12.5 % */ - case 0x00: sound.channel_two.duty = 0x80; - break; - - /* 25% */ - case 0x01: sound.channel_two.duty = 0x81; - break; - - /* 50% */ - case 0x02: sound.channel_two.duty = 0xE1; - break; - - /* 75% */ - case 0x03: sound.channel_two.duty = 0x7E; - break; - } - - break; - - case 0xFF17: - - /* volume 0 = turn off the DAC = turn off channeru */ - if (sound.nr22->volume == 0 && - sound.nr22->add == 0) - sound.channel_two.active = 0; - - break; - - case 0xFF18: - - /* update frequncy */ - sound.channel_two.frequency = (sound.nr23->frequency_lsb | - (sound.nr24->frequency_msb << 8)); - - /* update duty cycles */ - sound.channel_two.duty_cycles = - ((2048 - sound.channel_two.frequency) * 4) - << global_cpu_double_speed; - - break; - - case 0xFF19: - - /* length counter turned on */ - if (sound.nr24->length_enable) - { - nr24_t *old_nr24 = (nr24_t *) &old; - - /* give an extra length clock if */ - /* 1) we switched from off to on the len counter */ - /* 2) we are in the first half of len clock */ - /* 3) actual length is not zero */ - if ((old_nr24->length_enable == 0) && - ((sound.fs_cycles_idx & 0x01) == 0x00) && - (sound.channel_two.length != 0)) - sound_length_ctrl_step_ch(sound.nr24->length_enable, - &sound.channel_two.length, - &sound.channel_two.active); - } - - /* always update frequency, even if it's not a trigger */ - sound.channel_two.frequency = sound.nr23->frequency_lsb | - (sound.nr24->frequency_msb << 8); - - /* qty of cpu ticks needed for a duty change */ - /* (1/8 of wave cycle) */ - sound.channel_two.duty_cycles = - ((2048 - sound.channel_two.frequency) * 4) - << global_cpu_double_speed; - - if (v & 0x80) - { - /* if we switch from OFF to ON, reset duty idx */ - if (sound.channel_two.active == 0) - sound.channel_two.duty_idx = 0; - - /* setting internal modules data with stuff taken from memory */ - sound.channel_two.active = 1; - sound.channel_two.duty_cycles_next = - cycles.cnt + sound.channel_two.duty_cycles; - - /* set the 8 phase of a duty cycle by setting 8 bits */ - switch (sound.nr21->duty) - { - /* 12.5 % */ - case 0x00: sound.channel_two.duty = 0x80; - break; - - /* 25% */ - case 0x01: sound.channel_two.duty = 0x81; - break; - - /* 50% */ - case 0x02: sound.channel_two.duty = 0xE1; - break; - - /* 75% */ - case 0x03: sound.channel_two.duty = 0x7E; - break; - } - - /* calc length */ - if (sound.channel_two.length == 0) - sound.channel_two.length = 64; - - /* base volume */ - sound.channel_two.volume = - sound.nr22->volume * 0x111; - - /* reset envelope counter */ - sound.channel_two.envelope_cnt = 0; - - /* if DAC is off, turn off the channel */ - if (sound.nr22->add == 0 && - sound.nr22->volume == 0) - sound.channel_two.active = 0; - - /* extra length clock if length == 64 */ - /* and FS is in the fist half */ - if ((sound.fs_cycles_idx & 0x01) == 0x00 && - sound.channel_two.length == 64) - sound_length_ctrl_step_ch(sound.nr24->length_enable, - &sound.channel_two.length, - &sound.channel_two.active); - } - - break; - - case 0xFF1A: - - /* if DAC is off, disable the channel */ - if (sound.nr30->dac == 0) - sound.channel_three.active = 0; - - break; - - case 0xFF1B: - - sound.channel_three.length = - 256 - sound.nr31->length_load; - - break; - - case 0xFF1C: - - break; - - case 0xFF1E: - - /* length counter turned on */ - if (sound.nr34->length_enable) - { - nr34_t *old_nr34 = (nr34_t *) &old; - - /* give an extra length clock if */ - /* 1) we switched from off to on the len counter */ - /* 2) we are in the first half of len clock */ - /* 3) actual length is not zero */ - if ((old_nr34->length_enable == 0) && - ((sound.fs_cycles_idx & 0x01) == 0x00) && - (sound.channel_three.length != 0)) - sound_length_ctrl_step_ch(sound.nr34->length_enable, - &sound.channel_three.length, - &sound.channel_three.active); - } - - if (v & 0x80) - { - uint16_t freq = sound.nr33->frequency_lsb | - (sound.nr34->frequency_msb << 8); - - /* setting internal modules data with stuff taken from memory */ - sound.channel_three.active = 1; - - uint_fast32_t old_cycles = sound.channel_three.cycles; - - /* qty of cpu ticks needed for a wave sample change */ - sound.channel_three.cycles = - (((2048 - freq) * 2) + 6) << global_cpu_double_speed; - - - /* treat obscure behaviours.... */ - if (!global_cgb && - cycles.cnt + 8 == sound.channel_three.cycles_next + - sound.channel_three.cycles - - old_cycles) - { - uint8_t next = - ((sound.channel_three.index + 1) & 0x1F) >> 1; - - if (next < 4) - sound.wave_table[0] = sound.wave_table[next]; - else - memcpy(sound.wave_table, - &sound.wave_table[next & 0xfc], 4); - } - - /* init wave table index */ - sound.channel_three.index = 0; - sound.channel_three.cycles_next = - cycles.cnt + sound.channel_three.cycles; - - /* calc length */ - if (sound.channel_three.length == 0) - sound.channel_three.length = 256; - - /* if DAC is off, disable the channel */ - if (sound.nr30->dac == 0) - sound.channel_three.active = 0; - - /* extra length clock if length == 256 */ - /* and FS is in the fist half */ - if ((sound.fs_cycles_idx & 0x01) == 0x00 && - sound.channel_three.length == 256) - sound_length_ctrl_step_ch(sound.nr34->length_enable, - &sound.channel_three.length, - &sound.channel_three.active); - - /* i accessed to the wave RAM... */ - sound.channel_three.ram_access = sound.channel_three.cycles; - - if (sound.channel_three.cycles % 4 == 0) - sound.channel_three.ram_access_next = - cycles.cnt + sound.channel_three.cycles; - else - sound.channel_three.ram_access_next = -1; - -/* printf("RAM ACCESS RICARICATO %u - CNT %d CYCLES %d \n", - sound.channel_three.ram_access, - cycles.cnt, sound.channel_three.cycles);*/ - } - break; - - case 0xFF20: - - sound.channel_four.length = 64 - sound.nr41->length_load; - - break; - - case 0xFF21: - - /* highest 5 bits cleared = turn off the DAC = turn off channeru */ - if (sound.nr42->volume == 0 && - sound.nr42->add == 0) - sound.channel_four.active = 0; - - break; - - case 0xFF23: - - /* length counter turned on */ - if (sound.nr44->length_enable) - { - nr44_t *old_nr44 = (nr44_t *) &old; - - /* give an extra length clock if */ - /* 1) we switched from off to on the len counter */ - /* 2) we are in the first half of len clock */ - /* 3) actual length is not zero */ - if ((old_nr44->length_enable == 0) && - ((sound.fs_cycles_idx & 0x01) == 0x00) && - (sound.channel_four.length != 0)) - sound_length_ctrl_step_ch(sound.nr44->length_enable, - &sound.channel_four.length, - &sound.channel_four.active); - } - - if (v & 0x80) - { - /* setting internal modules data with stuff taken from memory */ - sound.channel_four.active = 1; - - /* calc length */ - if (sound.channel_four.length == 0) - sound.channel_four.length = 64; - - uint16_t divisor; - - /* calc LFSR period */ - switch (sound.nr43->divisor) - { - case 0: divisor = 8; break; - case 1: divisor = 16; break; - case 2: divisor = 32; break; - case 3: divisor = 48; break; - case 4: divisor = 64; break; - case 5: divisor = 80; break; - case 6: divisor = 96; break; - case 7: divisor = 112; break; - } - - /* calc LFSR period */ - sound.channel_four.period_lfsr = divisor << sound.nr43->shift; - sound.channel_four.cycles_next = - cycles.cnt + sound.channel_four.period_lfsr; - - /* init reg to all bits to 1 */ - sound.channel_four.reg = 0x7FFF; - - /* base volume */ - sound.channel_four.volume = - sound.nr42->volume * 0x111; - - /* reset envelope counter */ - sound.channel_four.envelope_cnt = 0; - - /* if DAC is off, turn off the channel */ - if (sound.nr42->add == 0 && - sound.nr42->volume == 0) - sound.channel_four.active = 0; - - /* extra length clock if length == 64 */ - /* and FS is in the fist half */ - if ((sound.fs_cycles_idx & 0x01) == 0x00 && - sound.channel_four.length == 64) - sound_length_ctrl_step_ch(sound.nr44->length_enable, - &sound.channel_four.length, - &sound.channel_four.active); - } - - break; - - case 0xFF26: - - if (v & 0x80) - { - /* power from off to on! */ - if (!(old & 0x80)) - { - /* reset frame sequencer so the next step will be zero */ - sound.fs_cycles_idx = 7; - - /* reset wave index */ - sound.channel_three.index = 0; - - /* wave samples are resetted */ - bzero(sound.wave_table, 16); - } - } - else - { - /* power off */ - - /* clear all the sound memory */ - bzero(mmu_addr(0xFF10), 22); - - if (global_cgb) - { - sound.nr41->length_load = 0; - sound.channel_four.length = 0; - } - - /* turn off every channeru */ - sound.channel_one.active = 0; - sound.channel_two.active = 0; - sound.channel_three.active = 0; - sound.channel_four.active = 0; - } - - } -} - -void sound_write_wave(uint16_t a, uint8_t v) -{ - if (sound.channel_three.active) - { -// if (!global_cgb && sound.channel_three.ram_access != 0) -// return; - if (!global_cgb && cycles.cnt < sound.channel_three.ram_access_next) - return; - - sound.wave_table[sound.channel_three.index >> 1] = v; - - return; - } - - sound.wave_table[a - 0xFF30] = v; -} diff --git a/waterbox/pizza/lib/sound.h b/waterbox/pizza/lib/sound.h deleted file mode 100644 index 226b8650bd..0000000000 --- a/waterbox/pizza/lib/sound.h +++ /dev/null @@ -1,300 +0,0 @@ -/* - - This file is part of Emu-Pizza - - Emu-Pizza is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Emu-Pizza is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Emu-Pizza. If not, see . - -*/ - -#ifndef __SOUND_HDR__ -#define __SOUND_HDR__ - -#define SOUND_SAMPLES 4096 - -typedef struct nr10_s -{ - uint8_t shift:3; - uint8_t negate:1; - uint8_t sweep_period:3; - uint8_t spare:1; - -} nr10_t; - -typedef struct nr11_s -{ - uint8_t length_load:6; - uint8_t duty:2; - -} nr11_t; - -typedef struct nr12_s -{ - uint8_t period:3; - uint8_t add:1; - uint8_t volume:4; - -} nr12_t; - -typedef struct nr13_s -{ - uint8_t frequency_lsb; - -} nr13_t; - -typedef struct nr14_s -{ - uint8_t frequency_msb:3; - uint8_t spare:3; - uint8_t length_enable:1; - uint8_t trigger:1; - -} nr14_t; - -typedef struct nr21_s -{ - uint8_t length_load:6; - uint8_t duty:2; - -} nr21_t; - -typedef struct nr22_s -{ - uint8_t period:3; - uint8_t add:1; - uint8_t volume:4; - -} nr22_t; - -typedef struct nr23_s -{ - uint8_t frequency_lsb; - -} nr23_t; - -typedef struct nr24_s -{ - uint8_t frequency_msb:3; - uint8_t spare:3; - uint8_t length_enable:1; - uint8_t trigger:1; - -} nr24_t; - - -typedef struct nr30_s -{ - uint8_t spare:7; - uint8_t dac:1; - -} nr30_t; - -typedef struct nr31_s -{ - uint8_t length_load; - -} nr31_t; - -typedef struct nr32_s -{ - uint8_t spare:5; - uint8_t volume_code:2; - uint8_t spare2:1; - -} nr32_t; - -typedef struct nr33_s -{ - uint8_t frequency_lsb; - -} nr33_t; - -typedef struct nr34_s -{ - uint8_t frequency_msb:3; - uint8_t spare:3; - uint8_t length_enable:1; - uint8_t trigger:1; - -} nr34_t; - -typedef struct nr41_s -{ - uint8_t length_load:6; - uint8_t spare:2; - -} nr41_t; - -typedef struct nr42_s -{ - uint8_t period:3; - uint8_t add:1; - uint8_t volume:4; - -} nr42_t; - -typedef struct nr43_s -{ - uint8_t divisor:3; - uint8_t width:1; - uint8_t shift:4; - -} nr43_t; - -typedef struct nr44_s -{ - uint8_t spare:6; - uint8_t length_enable:1; - uint8_t trigger:1; - -} nr44_t; - -typedef struct nr50_s -{ - uint8_t so1_volume:3; - uint8_t vin_to_so1:1; - uint8_t so2_volume:3; - uint8_t vin_to_so2:1; -} nr50_t; - -typedef struct nr51_s -{ - uint8_t ch1_to_so1:1; - uint8_t ch2_to_so1:1; - uint8_t ch3_to_so1:1; - uint8_t ch4_to_so1:1; - uint8_t ch1_to_so2:1; - uint8_t ch2_to_so2:1; - uint8_t ch3_to_so2:1; - uint8_t ch4_to_so2:1; -} nr51_t; - -typedef struct nr52_s -{ - uint8_t spare:7; - uint8_t power:1; -} nr52_t; - -typedef struct channel_square_s -{ - uint8_t active; - uint8_t duty; - uint8_t duty_idx; - uint8_t envelope_cnt; - uint_fast16_t duty_cycles; - uint64_t duty_cycles_next; - uint_fast32_t length; - uint_fast32_t frequency; - int16_t sample; - int16_t spare; - uint_fast16_t sweep_active; - uint_fast16_t sweep_cnt; - uint_fast16_t sweep_neg; - uint_fast16_t sweep_next; - int16_t volume; - int16_t spare2; - uint32_t sweep_shadow_frequency; - -} channel_square_t; - -typedef struct channel_wave_s -{ - uint8_t active; - uint8_t index; - uint16_t ram_access; - int16_t sample; - int16_t spare; - int16_t wave[32]; - uint_fast32_t cycles; - uint64_t cycles_next; - uint_fast32_t ram_access_next; - uint_fast32_t length; - -} channel_wave_t; - -typedef struct channel_noise_s -{ - uint8_t active; - uint8_t envelope_cnt; - uint16_t spare; - uint_fast32_t length; - uint_fast16_t period_lfsr; - uint64_t cycles_next; - int16_t volume; - int16_t sample; - uint16_t reg; - uint16_t spare2; - -} channel_noise_t; - -typedef struct sound_s -{ - nr10_t *nr10; - nr11_t *nr11; - nr12_t *nr12; - nr13_t *nr13; - nr14_t *nr14; - - nr21_t *nr21; - nr22_t *nr22; - nr23_t *nr23; - nr24_t *nr24; - - nr30_t *nr30; - nr31_t *nr31; - nr32_t *nr32; - nr33_t *nr33; - nr34_t *nr34; - - nr41_t *nr41; - nr42_t *nr42; - nr43_t *nr43; - nr44_t *nr44; - - nr50_t *nr50; - nr51_t *nr51; - nr52_t *nr52; - - uint8_t *wave_table; - - channel_square_t channel_one; - channel_square_t channel_two; - channel_wave_t channel_three; - channel_noise_t channel_four; - - /* emulation speed stuff */ - uint_fast16_t frame_counter; - - /* output rate */ - uint_fast32_t output_rate; - - /* CPU cycles to internal cycles counters */ - uint_fast32_t fs_cycles; - uint_fast32_t fs_cycles_idx; - uint64_t fs_cycles_next; -} sound_t; - -extern sound_t sound; - -/* prototypes */ -void sound_init(); -uint8_t sound_read_reg(uint16_t a, uint8_t v); -void sound_set_speed(char dbl); -void sound_step_fs(); -void sound_step_ch1(); -void sound_step_ch2(); -void sound_step_ch3(); -void sound_step_ch4(); -void sound_write_reg(uint16_t a, uint8_t v); - -#endif diff --git a/waterbox/pizza/lib/sound_output.c b/waterbox/pizza/lib/sound_output.c deleted file mode 100644 index cf9d32c949..0000000000 --- a/waterbox/pizza/lib/sound_output.c +++ /dev/null @@ -1,57 +0,0 @@ -#include "../blip_buf/blip_buf.h" -#include "sound_output.h" -#include "cycles.h" -#include "sgb.h" -#include "global.h" - -static blip_t* lb; -static blip_t* rb; -static uint64_t startclock; - -#define RELATIVECLOCK (cycles.sampleclock - startclock) - -void blip_left(int delta) -{ - if (delta) - blip_add_delta(lb, RELATIVECLOCK, delta); -} -void blip_right(int delta) -{ - if (delta) - blip_add_delta(rb, RELATIVECLOCK, delta); -} - -void sound_output_init(double clock_rate, double sample_rate) -{ - lb = blip_new(1024); - rb = blip_new(1024); - blip_set_rates(lb, clock_rate, sample_rate); - blip_set_rates(rb, clock_rate, sample_rate); -} - -static int32_t sgb_last_l; -static int32_t sgb_last_r; - -static void sgb_audio_callback(int16_t l, int16_t r, uint64_t time) -{ - uint64_t t = time - startclock; - int32_t ld = l - sgb_last_l; - int32_t rd = r - sgb_last_r; - blip_add_delta(lb, t, ld); - blip_add_delta(rb, t, rd); - sgb_last_l = l; - sgb_last_r = r; -} - -int sound_output_read(int16_t* output) -{ - if (global_sgb) - sgb_render_audio(cycles.sampleclock, sgb_audio_callback); - - blip_end_frame(lb, RELATIVECLOCK); - blip_end_frame(rb, RELATIVECLOCK); - startclock = cycles.sampleclock; - int ret = blip_read_samples(lb, output, 2048, 1); - blip_read_samples(rb, output + 1, 2048, 1); - return ret; -} diff --git a/waterbox/pizza/lib/sound_output.h b/waterbox/pizza/lib/sound_output.h deleted file mode 100644 index 91561da49a..0000000000 --- a/waterbox/pizza/lib/sound_output.h +++ /dev/null @@ -1,9 +0,0 @@ -#pragma once - -#include - -void blip_left(int delta); -void blip_right(int delta); - -void sound_output_init(double clock_rate, double sample_rate); -int sound_output_read(int16_t* output); diff --git a/waterbox/pizza/lib/timer.c b/waterbox/pizza/lib/timer.c deleted file mode 100644 index a46c224bda..0000000000 --- a/waterbox/pizza/lib/timer.c +++ /dev/null @@ -1,79 +0,0 @@ -/* - - This file is part of Emu-Pizza - - Emu-Pizza is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Emu-Pizza is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Emu-Pizza. If not, see . - -*/ - -#include "cycles.h" -#include "interrupt.h" -#include "mmu.h" -#include "timer.h" - -/* pointer to interrupt flags (handy) */ -interrupts_flags_t *timer_if; - - -void timer_init() -{ - /* reset values */ - timer.next = 256; - timer.sub = 0; - - /* pointer to interrupt flags */ - timer_if = mmu_addr(0xFF0F); -} - -void timer_write_reg(uint16_t a, uint8_t v) -{ - switch (a) - { - case 0xFF04: timer.div = 0; return; - case 0xFF05: timer.cnt = v; return; - case 0xFF06: timer.mod = v; return; - case 0xFF07: timer.ctrl = v; - } - - if (timer.ctrl & 0x04) - timer.active = 1; - else - timer.active = 0; - - switch (timer.ctrl & 0x03) - { - case 0x00: timer.threshold = 1024; break; - case 0x01: timer.threshold = 16; break; - case 0x02: timer.threshold = 64; break; - case 0x03: timer.threshold = 256; break; - } - - if (timer.active) - timer.sub_next = cycles.cnt + timer.threshold; -} - -uint8_t timer_read_reg(uint16_t a) -{ - switch (a) - { - case 0xFF04: return timer.div; - case 0xFF05: return timer.cnt; - case 0xFF06: return timer.mod; - case 0xFF07: return timer.ctrl; - } - - return 0xFF; -} - - diff --git a/waterbox/pizza/lib/timer.h b/waterbox/pizza/lib/timer.h deleted file mode 100644 index 531116121b..0000000000 --- a/waterbox/pizza/lib/timer.h +++ /dev/null @@ -1,63 +0,0 @@ -/* - - This file is part of Emu-Pizza - - Emu-Pizza is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Emu-Pizza is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Emu-Pizza. If not, see . - -*/ - -#ifndef __TIMER_HDR__ -#define __TIMER_HDR__ - -#include - -/* timer status */ -typedef struct timer_gb_s -{ - /* is it active? */ - uint8_t active; - - /* divider - 0xFF04 */ - uint8_t div; - - /* modulo - 0xFF06 */ - uint8_t mod; - - /* control - 0xFF07 */ - uint8_t ctrl; - - /* counter - 0xFF05 */ - uint_fast32_t cnt; - - /* threshold */ - uint32_t threshold; - - /* current value */ - uint_fast32_t sub; - uint64_t next; - - /* spare */ - uint_fast32_t sub_next; -} timer_gb_t; - -/* global status of timer */ -timer_gb_t timer; - -/* prototypes */ -void timer_init(); -void timer_step(); -void timer_write_reg(uint16_t a, uint8_t v); -uint8_t timer_read_reg(uint16_t a); - -#endif diff --git a/waterbox/pizza/lib/utils.c b/waterbox/pizza/lib/utils.c deleted file mode 100644 index e413d644cc..0000000000 --- a/waterbox/pizza/lib/utils.c +++ /dev/null @@ -1,75 +0,0 @@ -/* - - This file is part of Emu-Pizza - - Emu-Pizza is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Emu-Pizza is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Emu-Pizza. If not, see . - -*/ - -#include -#include - -#include -#include - -#include "cycles.h" -#include "gpu.h" -#include "utils.h" - -uint64_t prev_cycles = 0; - -void utils_log(const char *format, ...) -{ - char buf[256]; - - va_list args; - va_start(args, format); - vsnprintf(buf, 256, format, args); - fputs(buf, stdout); - va_end(args); -} - - -void utils_log_urgent(const char *format, ...) -{ - char buf[256]; - - va_list args; - va_start(args, format); - vsnprintf(buf, 256, format, args); - fputs(buf, stdout); - va_end(args); -} - -void utils_ts_log(const char *format, ...) -{ - va_list args; - va_start(args, format); - - char buf[256]; - char buf2[512]; - struct timeval tv; - - - vsprintf(buf, format, args); - //gettimeofday(&tv, NULL); -// printf("%ld - %s\n", tv.tv_sec, buf); - sprintf(buf2, "LINE %u - CYCLES %lu - DIFF %lu - %ld:%06ld - %s", - *(gpu.ly), cycles.cnt, cycles.cnt - prev_cycles, - tv.tv_sec, tv.tv_usec, buf); - _debug_puts(buf2); - prev_cycles = cycles.cnt; - - va_end(args); -} diff --git a/waterbox/pizza/lib/utils.h b/waterbox/pizza/lib/utils.h deleted file mode 100644 index 17e632de51..0000000000 --- a/waterbox/pizza/lib/utils.h +++ /dev/null @@ -1,27 +0,0 @@ -/* - - This file is part of Emu-Pizza - - Emu-Pizza is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Emu-Pizza is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Emu-Pizza. If not, see . - -*/ - -#ifndef __UTILS_HDR__ -#define __UTILS_HDR__ - -void utils_log(const char *format, ...); -void utils_log_urgent(const char *format, ...); -void utils_ts_log(const char *format, ...); - -#endif diff --git a/waterbox/pizza/lib/z80_gameboy.h b/waterbox/pizza/lib/z80_gameboy.h deleted file mode 100644 index db8c78c66d..0000000000 --- a/waterbox/pizza/lib/z80_gameboy.h +++ /dev/null @@ -1,2480 +0,0 @@ -/* - - This file is part of Emu-Pizza - - Emu-Pizza is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Emu-Pizza is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Emu-Pizza. If not, see . - -*/ - -#include -#include -#include -#include -#include -#include "mmu.h" -#include "z80_gameboy_regs.h" - -/* main struct describing CPU state */ - -typedef struct z80_state_s -{ - uint8_t spare; - uint8_t a; -#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ - uint8_t c; - uint8_t b; -#else - uint8_t b; - uint8_t c; -#endif -#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ - uint8_t e; - uint8_t d; -#else - uint8_t d; - uint8_t e; -#endif -#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ - uint8_t l; - uint8_t h; -#else - uint8_t h; - uint8_t l; -#endif - - uint16_t sp; - uint16_t pc; - - /* shortcuts */ - uint16_t *bc; - uint16_t *de; - uint16_t *hl; - uint8_t *f; - - uint32_t spare4; - uint32_t skip_cycle; - - z80_flags_t flags; - uint8_t int_enable; - - /* latest T-state */ - uint16_t spare3; - - /* total cycles */ - uint64_t cycles; - -} z80_state_t; - -#define Z80_MAX_MEMORY 65536 - - -/* state of the Z80 CPU */ -z80_state_t state; - -/* precomputed flags masks */ -uint8_t zc[1 << 9]; -uint8_t z[1 << 9]; - -/* macro to access addresses passed as parameters */ -#define ADDR mmu_read_16(state.pc + 1) -#define NN mmu_read_16(state.pc + 2) - -/* dummy value for 0x06 regs resulution table */ -uint8_t dummy; - -/* Registers table */ -uint8_t **regs_dst; -uint8_t **regs_src; - -#define FLAG_MASK_Z (1 << FLAG_OFFSET_Z) -#define FLAG_MASK_AC (1 << FLAG_OFFSET_AC) -#define FLAG_MASK_N (1 << FLAG_OFFSET_N) -#define FLAG_MASK_CY (1 << FLAG_OFFSET_CY) - - -/********************************/ -/* */ -/* FLAGS OPS */ -/* */ -/********************************/ - -/* calc flags SZ with 16 bit param */ -void static inline z80_set_flags_z(unsigned int v) -{ - state.flags.z = (v & 0xff) == 0; -} - -/* calc flags SZC with 16 bit param */ -void static inline z80_set_flags_zc(unsigned int v) -{ - state.flags.z = (v & 0xff) == 0; - state.flags.cy = (v > 0xff); -} - -/* calc flags SZC with 32 bit result */ -void static inline z80_set_flags_zc_16(unsigned int v) -{ - state.flags.z = (v & 0xffff) == 0; - state.flags.cy = (v > 0xffff); -} - -/* calc AC for given operands */ -void static inline z80_set_flags_ac(uint8_t a, uint8_t b, - unsigned int r) -{ - /* calc xor for AC and overflow */ - unsigned int c = (a ^ b ^ r); - - /* set AC */ - state.flags.ac = ((c & 0x10) != 0); - - return; -} - -/* calc AC and overflow flag given operands (16 bit flavour) */ -void static inline z80_set_flags_ac_16(unsigned int a, - unsigned int b, - unsigned int r) -{ - /* calc xor for AC and overflow */ - unsigned int c = (a ^ b ^ r); - - /* set AC */ - state.flags.ac = ((c & 0x01000) != 0); - - return; -} - -/* calc AC flag given operands and result */ -char static inline z80_calc_ac(uint8_t a, uint8_t b, unsigned int r) -{ - /* calc xor for AC and overflow */ - unsigned int c = a ^ b ^ r; - - /* AC */ - if (c & 0x10) - return 1; - - return 0; -} - -/* calculate flags mask array */ -void static z80_calc_flags_mask_array() -{ - z80_flags_t f; - unsigned int i; - - // bzero(sz53pc, sizeof(sz53pc)); - - /* create a mask for bit 5 and 3 and its reverse */ -/* f.spare = 0= 1; f.z = 1; f.u5 = 0; f.ac = 1; f.u3 = 0; f.p = 1; f.n = 1; f.cy = 1; - u53_mask = *((uint8_t *) &f); - r53_mask = ~(u53_mask); */ - - bzero(&f, 1); - - for (i=0; i<512; i++) - { - f.z = ((i & 0xff) == 0); - f.cy = (i > 0xff); - - zc[i] = *((uint8_t *) &f); - - f.cy = 0; - - z[i] = *((uint8_t *) &f); - - /* no CY and parity */ -/* f.cy = 0; - f.p = parity[i & 0xff]; - sz53p[i] = *((uint8_t *) &f); -*/ - /* similar but with no u3 and u5 */ -/* f.u3 = 0; - f.u5 = 0; - szp[i] = *((uint8_t *) &f); -*/ - /* similar but with carry and no p */ -/* f.cy = (i > 0xff); - f.p = 0; - szc[i] = *((uint8_t *) &f); */ - } -} - - -/********************************/ -/* */ -/* INSTRUCTIONS SEGMENT */ -/* ordered by name */ -/* */ -/********************************/ - - -/* add A register, b parameter and Carry flag, then calculate flags */ -void static inline z80_adc(uint8_t b) -{ - /* calc result */ - unsigned int result = state.a + b + state.flags.cy; - - /* set flags - SZ5H3V0C */ - *state.f = zc[result & 0x1ff]; - - /* set AC and overflow flags */ - z80_set_flags_ac(state.a, b, result); - - /* save result into A register */ - state.a = (uint8_t) result; - - return; -} - -/* add a and b parameters (both 16 bits) and the carry, thencalculate flags */ -unsigned int static inline z80_adc_16(unsigned int a, unsigned int b) -{ - /* calc result */ - unsigned int result = a + b + state.flags.cy; - - /* set them - SZ5H3V0C */ - z80_set_flags_zc_16(result); - state.flags.n = 0; - - /* get only high byte */ - // unsigned int r16 = (result >> 8); - - /* set AC and overflow flags */ - z80_set_flags_ac_16(a, b, result); - - return result; -} - -/* add A register and b parameter and calculate flags */ -void static inline z80_add(uint8_t b) -{ - /* calc result */ - unsigned int result = state.a + b; - - /* set them - SZ5H3P0C */ - *state.f = zc[result & 0x1ff]; - - /* set AC and overflow flags - given AC and V set to 0 */ - z80_set_flags_ac(state.a, b, result); - - /* save result into A register */ - state.a = result; - - return; -} - -/* add a and b parameters (both 16 bits), then calculate flags */ -unsigned int static inline z80_add_16(unsigned int a, unsigned int b) -{ - /* calc result */ - unsigned int result = a + b; - - /* get only high byte */ - // uint8_t r16 = (result >> 8); - - /* not a subtraction */ - state.flags.n = 0; - - /* calc xor for AC */ - z80_set_flags_ac(a, b, result); - - /* set CY */ - state.flags.cy = (result > 0xffff); - - return result; -} - -/* b AND A register and calculate flags */ -void static inline z80_ana(uint8_t b) -{ - /* calc result */ - uint8_t result = state.a & b; - - /* set them */ - *state.f = zc[result] | FLAG_MASK_AC; - - /* save result into A register */ - state.a = result; - - return; -} - -/* BIT instruction, test pos-th bit and set flags */ -void static inline z80_bit(uint8_t *v, uint8_t pos, uint8_t muffa) -{ - uint8_t r = *v & (0x01 << pos); - - /* set flags AC,Z, N = 0 */ - state.flags.n = 0; - state.flags.ac = 1; - state.flags.z = (r == 0) ; - - return; -} - -/* push the current PC on the stack and move PC to the function addr */ -int static inline z80_call(unsigned int addr) -{ - /* move to the next instruction */ - state.pc += 3; - - /* add 4 more cycles */ - cycles_step(); - - /* save it into stack */ - mmu_write_16(state.sp - 2, state.pc); - - /* update stack pointer */ - state.sp -= 2; - - /* move PC to the called function address */ - state.pc = addr; - - return 0; -} - -/* compare b parameter against A register and calculate flags */ -void static inline z80_cmp(uint8_t b) -{ - /* calc result */ - unsigned int result = state.a - b; - - /* set flags - SZ5H3PN* */ - *state.f = zc[result & 0x1ff] | - FLAG_MASK_N; - - /* set AC and overflow flags */ - z80_set_flags_ac(state.a, b, result); - - return; -} - -/* compare b parameter against A register and calculate flags */ -void static inline z80_cpid(uint8_t b, int8_t add) -{ - /* calc result */ - unsigned int result = state.a - b; - - /* calc AC */ - state.flags.ac = z80_calc_ac(state.a, b, result); - - /* increase (add = +1) or decrease (add = -1) HL */ - *state.hl += add; - - /* decrease BC */ - *state.bc = *state.bc - 1; - - /* calc n as result - half carry flag */ - // unsigned int n = result - state.flags.ac; - - /* set flags - SZ5H3P1* */ - state.flags.z = (result & 0xff) == 0; - -// z80_set_flags_z(result); - - /* cmp = subtraction */ - state.flags.n = 1; - - /* set P if BC != 0 */ - // state.flags.p = (*state.bc != 0); - - /* flag 3 and 5 are taken from (result - ac) and not the result */ - /* and u5 is taken exceptionally from the bit 1 */ -// state.flags.u5 = (n & 0x0002) != 0; -// state.flags.u3 = (n & 0x0008) != 0; - - return; -} - -/* DAA instruction... what else? */ -void static inline z80_daa() -{ - unsigned int a = state.a; - uint8_t al = state.a & 0x0f; - - if (state.flags.n) - { - if (state.flags.ac) - a = (a - 6) & 0xFF; - - if (state.flags.cy) - a -= 0x60; - } - else - { - if (al > 9 || state.flags.ac) - { - state.flags.ac = (al > 9); - a += 6; - } - - if (state.flags.cy || ((a & 0x1f0) > 0x90)) - a += 0x60; - } - - if (a & 0x0100) state.flags.cy = 1; - - /* set computer A value */ - state.a = a & 0xff; - - state.flags.ac = 0; - state.flags.z = (state.a == 0); - - return; -} - -/* DAA instruction... what else? */ -void static inline z80_daa_ignore_n() -{ - unsigned int a = state.a; - uint8_t al = state.a & 0x0f; - - if (al > 9 || state.flags.ac) - { - state.flags.ac = (al > 9); - a += 6; - } - - if (state.flags.cy || ((a & 0x1f0) > 0x90)) - a += 0x60; - - if (a & 0x0100) state.flags.cy = 1; - - /* set computer A value */ - state.a = a & 0xff; - - /* reset H flag */ - state.flags.z = (state.a == 0x00); - state.flags.ac = 0; - - /* and its flags */ - // z80_set_flags_sz53p(state.a); - - return; -} - -/* add a and b parameters (both 16 bits) and the carry, thencalculate flags */ -unsigned int static inline dad_16(unsigned int a, unsigned int b) -{ - /* calc result */ - unsigned int result = a + b; - - /* reset n */ - state.flags.n = 0; - - /* calc xor for AC and overflow */ - unsigned int c = a ^ b ^ result; - - /* set AC */ - state.flags.ac = ((c & 0x1000) != 0); - - /* set CY */ - state.flags.cy = (result > 0xffff); - - return result; -} - -/* dec the operand and return result increased by one */ -uint8_t static inline z80_dcr(uint8_t b) -{ - unsigned int result = b - 1; - - /* set flags - SZ5H3V1* */ - z80_set_flags_z(result); - - /* it's a subtraction */ - state.flags.n = 1; - - /* set overflow and AC */ - z80_set_flags_ac(b, 1, result); - -// state.flags.ac = 0; - - return result; -} - -/* inc the operand and return result increased by one */ -uint8_t static inline z80_inr(uint8_t b) -{ - unsigned int result = b + 1; - - /* set flags - SZ5H3V1* */ - z80_set_flags_z(result); - - /* it's not a subtraction */ - state.flags.n = 0; - - /* set overflow and AC */ - z80_set_flags_ac(1, b, result); - - return result; -} - -/* same as call, but save on the stack the current PC instead of next instr */ -int static inline z80_intr(unsigned int addr) -{ - /* push the current PC into stack */ - mmu_write_16(state.sp - 2, state.pc); - - cycles_step(); - - /* update stack pointer */ - state.sp -= 2; - - /* move PC to the called function address */ - state.pc = addr; - - return 0; -} - -/* copy (HL) in (DE) and decrease HL, DE and BC */ -void static inline z80_ldd() -{ - uint8_t byte; - - /* copy! */ - mmu_move(*state.de, *state.hl); - - /* get last moved byte and sum A */ - byte = mmu_read(*state.de); - byte += state.a; - - /* decrease HL, DE and BC */ - *state.hl = *state.hl - 1; - *state.de = *state.de - 1; - *state.bc = *state.bc - 1; - - /* reset flags - preserve ZC */ - *state.f &= FLAG_MASK_Z | - FLAG_MASK_CY; - - return; -} - -/* copy (HL) in (DE) and increase HL and DE. BC is decreased */ -void static inline z80_ldi() -{ - uint8_t byte; - - /* copy! */ - mmu_move(*state.de, *state.hl); - - /* get last moved byte and sum A */ - byte = mmu_read(*state.de); - byte += state.a; - - /* u5 flag is bit 1 of last moved byte + A (WTF?) */ - // state.flags.u5 = (byte & 0x02) >> 1; - - /* u3 flag is bit 3 of last moved byte + A (WTF?) */ - // state.flags.u3 = (byte & 0x08) >> 3; - - /* decrease HL, DE and BC */ - *state.hl = *state.hl + 1; - *state.de = *state.de + 1; - *state.bc = *state.bc - 1; - - /* reset negative, half carry and parity flags */ - state.flags.n = 0; - state.flags.ac = 0; - // state.flags.p = (*state.bc != 0); - - return; -} - -/* negate register A */ -void static inline z80_neg() -{ - /* calc result */ - unsigned int result = 0 - state.a; - - /* set flags - SZ5H3V1C */ - *state.f = zc[result & 0x1ff] | FLAG_MASK_N; - - /* set AC and overflow */ - z80_set_flags_ac(0, state.a, result); - - /* save result into A register */ - state.a = (uint8_t) result; - - return; -} - -/* OR b parameter and A register and calculate flags */ -void static inline z80_ora(uint8_t b) -{ - state.a |= b; - - /* set them SZ503P0C */ - *state.f = zc[state.a]; - - return; -} - -/* RES instruction, put a 0 on pos-th bit and set flags */ -uint8_t static inline z80_res(uint8_t *v, uint8_t pos) -{ - *v &= ~(0x01 << pos); - - return *v; -} - -/* pop the return address from the stack and move PC to that address */ -int static inline z80_ret() -{ - state.pc = mmu_read_16(state.sp); - state.sp += 2; - - /* add 4 cycles */ - cycles_step(); - - return 0; -} - -/* RL (Rotate Left) instruction */ -uint8_t static inline z80_rl(uint8_t *v, char with_carry) -{ - uint8_t carry; - - /* apply RLC to the memory pointed byte */ - carry = (*v & 0x80) >> 7; - *v = *v << 1; - - if (with_carry) - *v |= carry; - else - *v |= state.flags.cy; - - /* set flags - SZ503P0C */ - *state.f = 0; // sz53p[*v]; - - state.flags.z = (*v == 0); - state.flags.cy = carry; - - return *v; -} - -/* RLA instruction */ -uint8_t static inline z80_rla(uint8_t *v, char with_carry) -{ - uint8_t carry; - - /* apply RLA to the memory pointed byte */ - carry = (*v & 0x80) >> 7; - *v = *v << 1; - - if (with_carry) - *v |= carry; - else - *v |= state.flags.cy; - - /* reset flags */ - *state.f = 0; - - /* just set carry */ - state.flags.cy = carry; - - return *v; -} - -/* RLD instruction */ -void static inline z80_rld() -{ - uint8_t hl = mmu_read(*state.hl); - - /* save lowest A 4 bits */ - uint8_t al = state.a & 0x0f; - - /* A lowest bits are overwritten by (HL) highest ones */ - state.a &= 0xf0; - state.a |= (hl >> 4); - - /* (HL) highest bits are overwritten by (HL) lowest ones */ - hl <<= 4; - - /* finally, (HL) lowest bits are overwritten by A lowest */ - hl &= 0xf0; - hl |= al; - - /* set (HL) with his new value ((HL) low | A low) */ - mmu_write(*state.hl, hl); - - /* reset flags - preserve CY */ - *state.f &= FLAG_MASK_CY; - - /* set flags - SZ503P0* */ - *state.f |= z[state.a]; - - return; -} - -/* RR instruction */ -uint8_t static inline z80_rr(uint8_t *v, char with_carry) -{ - uint8_t carry; - - /* apply RRC to the memory pointed byte */ - carry = *v & 0x01; - *v = (*v >> 1); - - /* 7th bit taken from old bit 0 or from CY */ - if (with_carry) - *v |= (carry << 7); - else - *v |= (state.flags.cy << 7); - - /* set flags - SZ503P0C */ - *state.f = z[*v]; - - state.flags.cy = carry; - - return *v; -} - -/* RRA instruction */ -uint8_t static inline z80_rra(uint8_t *v, char with_carry) -{ - uint8_t carry; - - /* apply RRC to the memory pointed byte */ - carry = *v & 0x01; - *v = (*v >> 1); - - /* 7th bit taken from old bit 0 or from CY */ - if (with_carry) - *v |= (carry << 7); - else - *v |= (state.flags.cy << 7); - - /* reset flags */ - *state.f = 0; - - state.flags.cy = carry; - -// state.flags.n = 0; -// state.flags.ac = 0; - - /* copy bit 3 and 5 of the result */ - // state.flags.u3 = ((*v & 0x08) != 0); - // state.flags.u5 = ((*v & 0x20) != 0); - - return *v; -} - -/* RRD instruction */ -void static inline z80_rrd() -{ - uint8_t hl = mmu_read(*state.hl); - - /* save lowest (HL) 4 bits */ - uint8_t hll = hl & 0x0f; - - /* (HL) lowest bits are overwritten by (HL) highest ones */ - hl >>= 4; - - /* (HL) highest bits are overwritten by A lowest ones */ - hl |= ((state.a & 0x0f) << 4); - - /* set (HL) with his new value (A low | (HL) high) */ - mmu_write(*state.hl, hl); - - /* finally, A lowest bits are overwritten by (HL) lowest */ - state.a &= 0xf0; - state.a |= hll; - - /* reset flags - preserve CY */ - *state.f &= FLAG_MASK_CY; - - /* set flags - SZ503P0* */ - *state.f |= z[state.a]; - - return; -} - -/* subtract b parameter and Carry from A register and calculate flags */ -void static inline z80_sbc(uint8_t b) -{ - /* calc result */ - unsigned int result = state.a - b - state.flags.cy; - - /* set flags - ZC and N = 1 */ - *state.f = zc[result & 0x1ff] | FLAG_MASK_N; - - /* set AC */ - z80_set_flags_ac(state.a, b, result); - - /* save result into A register */ - state.a = (uint8_t) result; - - return; -} - -/* subtract a and b parameters (both 16 bits) and the carry, then calculate flags */ -unsigned int static inline z80_sbc_16(unsigned int a, unsigned int b) -{ - /* calc result */ - unsigned int result = a - b - state.flags.cy; - - /* set flags - SZ5H3V1C */ - z80_set_flags_zc_16(result); - state.flags.n = 1; - - /* get only high byte */ - // unsigned int r16 = (result >> 8); - - /* set AC and overflow flags */ - z80_set_flags_ac_16(a, b, result); - - return result; -} - -/* SET instruction, put a 1 on pos-th bit and set flags */ -uint8_t static inline z80_set(uint8_t *v, uint8_t pos) -{ - *v |= (0x01 << pos); - - return *v; -} - -/* SL instruction (SLA = v * 2, SLL = v * 2 + 1) */ -uint8_t static inline z80_sl(uint8_t *v, char one_insertion) -{ - /* move pointed value to local (gives an huge boost in perf!) */ - uint8_t l = *v; - - /* apply SL to the memory pointed byte */ - uint8_t cy = (l & 0x80) != 0; - l = (l << 1) | one_insertion; - - /* set flags - SZ503P0C */ - *state.f = z[l]; - - state.flags.cy = cy; - - /* re-assign local value */ - *v = l; - - return l; -} - -/* SR instruction (SRA = preserve 8th bit, SRL = discard 8th bit) */ -uint8_t static inline z80_sr(uint8_t *v, char preserve) -{ - uint8_t bit = 0; - - /* save the bit 0 */ - uint8_t cy = (*v & 0x01); - - /* apply SL to the memory pointed byte */ - if (preserve) - bit = *v & 0x80; - - /* move 1 pos right and restore highest bit (in case of SRA) */ - *v = (*v >> 1) | bit; - - /* set flags - SZ503P0C */ - *state.f = z[*v]; - - state.flags.cy = cy; - - return *v; -} - -/* subtract b parameter from A register and calculate flags */ -void static inline z80_sub(uint8_t b) -{ - /* calc result */ - unsigned int result = state.a - b; - - /* set them - SZ5H3V1C */ - *state.f = zc[result & 0x1ff] | FLAG_MASK_N; - - /* set AC and overflow flags */ - z80_set_flags_ac(state.a, b, result); - - /* save result into A register */ - state.a = (uint8_t) result; - - return; -} - -/* xor b parameter and A register and calculate flags */ -void static inline z80_xra(uint8_t b) -{ - /* calc result */ - state.a ^= b; - - /* set them SZ503P00 */ - *state.f = z[state.a]; - - return; -} - - - -/********************************/ -/* */ -/* INSTRUCTIONS BRANCHES */ -/* */ -/********************************/ - - -/* Z80 extended OPs */ -int static inline z80_ext_cb_execute() -{ - uint8_t byte = 1; - int b = 2; - - /* CB family (ROT, BIT, RES, SET) */ - uint8_t cbfam; - - /* CB operation */ - uint8_t cbop; - - /* choosen register */ - uint8_t reg; - - /* get CB code */ - uint8_t code = mmu_read(state.pc + 1); - - /* extract family */ - cbfam = code >> 6; - - /* extract involved register */ - reg = code & 0x07; - - /* if reg == 0x06, refresh the pointer */ - // if (reg == 0x06 && code != 0x36) - // { - /* add 4 more cycles for reading data from memory */ - // cycles_step(); - - // regs_src[0x06] = mmu_addr(*state.hl); - // } - - switch (cbfam) - { - /* Rotate Family */ - case 0x00: cbop = code & 0xf8; - - switch(cbop) - { - /* RLC REG */ - case 0x00: if (reg == 0x06) - { - byte = mmu_read(*state.hl); - mmu_write(*state.hl, z80_rl(&byte, 1)); - } - else - z80_rl(regs_src[reg], 1); - break; - - /* RRC REG */ - case 0x08: if (reg == 0x06) - { - byte = mmu_read(*state.hl); - mmu_write(*state.hl, z80_rr(&byte, 1)); - } - else - z80_rr(regs_src[reg], 1); - - break; - - /* RL REG */ - case 0x10: if (reg == 0x06) - { - byte = mmu_read(*state.hl); - mmu_write(*state.hl, z80_rl(&byte, 0)); - } - else - z80_rl(regs_src[reg], 0); - - break; - - /* RR REG */ - case 0x18: if (reg == 0x06) - { - byte = mmu_read(*state.hl); - mmu_write(*state.hl, z80_rr(&byte, 0)); - } - else - z80_rr(regs_src[reg], 0); - - break; - - /* SLA REG */ - case 0x20: if (reg == 0x06) - { - byte = mmu_read(*state.hl); - mmu_write(*state.hl, z80_sl(&byte, 0)); - } - else - z80_sl(regs_src[reg], 0); - - break; - - /* SRA REG */ - case 0x28: if (reg == 0x06) - { - byte = mmu_read(*state.hl); - mmu_write(*state.hl, z80_sr(&byte, 1)); - } - else - z80_sr(regs_src[reg], 1); - - break; - - /* SWAP */ - case 0x30: - switch (code & 0x37) - { - /* SWAP B */ - case 0x30: byte = state.b; - state.b = ((byte & 0xf0) >> 4) | - ((byte & 0x0f) << 4); - break; - - /* SWAP C */ - case 0x31: byte = state.c; - state.c = ((byte & 0xf0) >> 4) | - ((byte & 0x0f) << 4); - break; - - /* SWAP D */ - case 0x32: byte = state.d; - state.d = ((byte & 0xf0) >> 4) | - ((byte & 0x0f) << 4); - break; - - /* SWAP E */ - case 0x33: byte = state.e; - state.e = ((byte & 0xf0) >> 4) | - ((byte & 0x0f) << 4); - break; - - /* SWAP H */ - case 0x34: byte = state.h; - state.h = ((byte & 0xf0) >> 4) | - ((byte & 0x0f) << 4); - break; - - /* SWAP L */ - case 0x35: byte = state.l; - state.l = ((byte & 0xf0) >> 4) | - ((byte & 0x0f) << 4); - break; - - /* SWAP *HL */ - case 0x36: byte = mmu_read(*state.hl); - mmu_write(*state.hl, - ((byte & 0xf0) >> 4) | - ((byte & 0x0f) << 4)); - - break; - - /* SWAP A */ - case 0x37: - byte = state.a; - state.a = ((byte & 0xf0) >> 4) | - ((byte & 0x0f) << 4); - break; - - } - - /* swap functions set Z flags */ - state.flags.z = (byte == 0x00); - - /* reset all the others */ - state.flags.ac = 0; - state.flags.cy = 0; - state.flags.n = 0; - - break; - - /* SRL REG */ - case 0x38: if (reg == 0x06) - { - byte = mmu_read(*state.hl); - mmu_write(*state.hl, z80_sr(&byte, 0)); - } - else - z80_sr(regs_src[reg], 0); - - break; - } - - /* accessing HL needs more T-cycles */ - //if (reg == 0x06 && code != 0x36) - // cycles_step(); - - /* accessing HL needs more T-cycles */ -// if (reg == 0x06) -// cycles_step(); - - break; - - /* BIT Family */ - case 0x01: if (reg == 0x06) - { - byte = mmu_read(*state.hl); - z80_bit(&byte, (code >> 3) & 0x07, - (uint8_t) *state.hl); - } - else - z80_bit(regs_src[reg], (code >> 3) & 0x07, - *regs_src[reg]); - break; - - /* RES Family */ - case 0x02: if (reg == 0x06) - { - byte = mmu_read(*state.hl); - mmu_write(*state.hl, z80_res(&byte, (code >> 3) & 0x07)); - } - else - z80_res(regs_src[reg], (code >> 3) & 0x07); - - break; - - /* SET Family */ - case 0x03: if (reg == 0x06) - { - byte = mmu_read(*state.hl); - mmu_write(*state.hl, z80_set(&byte, (code >> 3) & 0x07)); - } - else - z80_set(regs_src[reg], (code >> 3) & 0x07); - - break; - -// default: printf("Unimplemented CB family: %02x\n", -// cbfam); - - } - - return b; -} - - -/* really execute the OP. Could be ran by normal execution or * - * because an interrupt occours */ -int static inline z80_execute(unsigned char code) -{ - int b = 1; - uint8_t *p; - uint8_t byte = 1; - uint8_t byte2 = 1; - unsigned int result; - uint_fast16_t addr; - - switch (code) - { - /* NOP */ - case 0x00: break; - - /* LXI B */ - case 0x01: *state.bc = ADDR; - b = 3; - break; - - /* STAX B */ - case 0x02: mmu_write(*state.bc, state.a); - break; - - /* INX B */ - case 0x03: (*state.bc)++; - cycles_step(); - break; - - /* INR B */ - case 0x04: state.b = z80_inr(state.b); - break; - - /* DCR B */ - case 0x05: state.b = z80_dcr(state.b); - break; - - /* MVI B */ - case 0x06: state.b = mmu_read(state.pc + 1); - b = 2; - break; - - /* RLCA */ - case 0x07: z80_rla(&state.a, 1); - break; - - /* LD (NN),SP */ - case 0x08: mmu_write_16(ADDR, state.sp); - b = 3; - break; - - /* DAD B */ - case 0x09: *state.hl = dad_16(*state.hl, *state.bc); - - /* needs 4 more cycles */ - cycles_step(); - - break; - - /* LDAX B */ - case 0x0A: state.a = mmu_read(*state.bc); - break; - - /* DCX B */ - case 0x0B: (*state.bc)--; - cycles_step(); - break; - - /* INR C */ - case 0x0C: state.c = z80_inr(state.c); - break; - - /* DCR C */ - case 0x0D: state.c = z80_dcr(state.c); - break; - - /* MVI C */ - case 0x0E: state.c = mmu_read(state.pc + 1); - b = 2; - break; - - /* RRC */ - case 0x0F: z80_rra(&state.a, 1); - break; - - /* STOP */ - case 0x10: b = 2; - break; - - /* LXI D */ - case 0x11: *state.de = ADDR; - b = 3; - break; - - /* STAX D */ - case 0x12: mmu_write(*state.de, state.a); - break; - - /* INX D */ - case 0x13: (*state.de)++; - cycles_step(); - break; - - /* INR D */ - case 0x14: state.d = z80_inr(state.d); - break; - - /* DCR D */ - case 0x15: state.d = z80_dcr(state.d); - break; - - /* MVI D */ - case 0x16: state.d = mmu_read(state.pc + 1); - b = 2; - break; - - /* RLA */ - case 0x17: z80_rla(&state.a, 0); - break; - - /* JR */ - case 0x18: cycles_step(); - state.pc += (int8_t) mmu_read(state.pc + 1); - b = 2; - break; - - /* DAD D */ - case 0x19: *state.hl = dad_16(*state.hl, *state.de); - - /* needs 4 more cycles */ - cycles_step(); - - break; - - /* LDAX D */ - case 0x1A: state.a = mmu_read(*state.de); - break; - - /* DCX D */ - case 0x1B: (*state.de)--; - cycles_step(); - break; - - /* INR E */ - case 0x1C: state.e = z80_inr(state.e); - break; - - /* DCR E */ - case 0x1D: state.e = z80_dcr(state.e); - break; - - /* MVI E */ - case 0x1E: state.e = mmu_read(state.pc + 1); - b = 2; - break; - - /* RRA */ - case 0x1F: z80_rra(&state.a, 0); - break; - - /* JRNZ */ - case 0x20: cycles_step(); - - if (!state.flags.z) - state.pc += (int8_t) mmu_read(state.pc + 1); - - b = 2; - break; - - /* LXI H */ - case 0x21: *state.hl = ADDR; - b = 3; - break; - - /* LDI (HL), A */ - case 0x22: mmu_write(*state.hl, state.a); - (*state.hl)++; - break; - - /* INX H */ - case 0x23: (*state.hl)++; - cycles_step(); - break; - - /* INR H */ - case 0x24: state.h = z80_inr(state.h); - break; - - /* DCR H */ - case 0x25: state.h = z80_dcr(state.h); - break; - - /* MVI H */ - case 0x26: state.h = mmu_read(state.pc + 1); - b = 2; - break; - - /* DAA */ - case 0x27: z80_daa(); - break; - - /* JRZ */ - case 0x28: cycles_step(); - if (state.flags.z) - state.pc += (int8_t) mmu_read(state.pc + 1); - - b = 2; - break; - - /* DAD H */ - case 0x29: *state.hl = dad_16(*state.hl, *state.hl); - - /* needs 4 more cycles */ - cycles_step(); - - break; - - /* LDI A,(HL) */ - case 0x2A: state.a = mmu_read(*state.hl); - (*state.hl)++; - break; - - /* DCX H */ - case 0x2B: (*state.hl)--; - cycles_step(); - break; - - /* INR L */ - case 0x2C: state.l = z80_inr(state.l); - break; - - /* DCR L */ - case 0x2D: state.l = z80_dcr(state.l); - break; - - /* MVI L */ - case 0x2E: state.l = mmu_read(state.pc + 1); - b = 2; - break; - - /* CMA A */ - case 0x2F: state.a = ~state.a; - state.flags.ac = 1; - state.flags.n = 1; - break; - - /* JRNC */ - case 0x30: cycles_step(); - - if (!state.flags.cy) - state.pc += (int8_t) mmu_read(state.pc + 1); - - b = 2; - break; - - /* LXI SP */ - case 0x31: state.sp = ADDR; - b = 3; - break; - - /* LDD (HL), A */ - case 0x32: mmu_write(*state.hl, state.a); - (*state.hl)--; - break; - - /* INX SP */ - case 0x33: state.sp++; - cycles_step(); - break; - - /* INR M */ - case 0x34: mmu_write(*state.hl, z80_inr(mmu_read(*state.hl))); - break; - - /* DCR M */ - case 0x35: mmu_write(*state.hl, z80_dcr(mmu_read(*state.hl))); - break; - - /* MVI M */ - case 0x36: mmu_move(*state.hl, state.pc + 1); - b = 2; - break; - - /* STC */ - case 0x37: state.flags.cy = 1; - state.flags.ac = 0; - state.flags.n = 0; - break; - - /* JRC */ - case 0x38: cycles_step(); - if (state.flags.cy) - state.pc += (int8_t) mmu_read(state.pc + 1); - - b = 2; - break; - - /* DAD SP */ - case 0x39: *state.hl = dad_16(*state.hl, state.sp); - - /* needs 4 more cycles */ - cycles_step(); - - break; - - /* LDD A,(HL) */ - case 0x3A: state.a = mmu_read(*state.hl); - (*state.hl)--; - break; - - /* DCX SP */ - case 0x3B: state.sp--; - cycles_step(); - break; - - /* INR A */ - case 0x3C: state.a = z80_inr(state.a); - break; - - /* DCR A */ - case 0x3D: state.a = z80_dcr(state.a); - break; - - /* MVI A */ - case 0x3E: state.a = mmu_read(state.pc + 1); - b = 2; - break; - - /* CCF */ - case 0x3F: state.flags.ac = 0; - state.flags.cy = !state.flags.cy; - state.flags.n = 0; - - break; - - /* MOV B,B */ - case 0x40: state.b = state.b; - break; - - /* MOV B,C */ - case 0x41: state.b = state.c; - break; - - /* MOV B,D */ - case 0x42: state.b = state.d; - break; - - /* MOV B,E */ - case 0x43: state.b = state.e; - break; - - /* MOV B,H */ - case 0x44: state.b = state.h; - break; - - /* MOV B,L */ - case 0x45: state.b = state.l; - break; - - /* MOV B,M */ - case 0x46: state.b = mmu_read(*state.hl); - break; - - /* MOV B,A */ - case 0x47: state.b = state.a; - break; - - /* MOV C,B */ - case 0x48: state.c = state.b; - break; - - /* MOV C,C */ - case 0x49: state.c = state.c; - break; - - /* MOV C,D */ - case 0x4A: state.c = state.d; - break; - - /* MOV C,E */ - case 0x4B: state.c = state.e; - break; - - /* MOV C,H */ - case 0x4C: state.c = state.h; - break; - - /* MOV C,L */ - case 0x4D: state.c = state.l; - break; - - /* MOV C,M */ - case 0x4E: state.c = mmu_read(*state.hl); - break; - - /* MOV C,A */ - case 0x4F: state.c = state.a; - break; - - /* MOV D,B */ - case 0x50: state.d = state.b; - break; - - /* MOV D,C */ - case 0x51: state.d = state.c; - break; - - /* MOV D,D */ - case 0x52: state.d = state.d; - break; - - /* MOV D,E */ - case 0x53: state.d = state.e; - break; - - /* MOV D,H */ - case 0x54: state.d = state.h; - break; - - /* MOV D,L */ - case 0x55: state.d = state.l; - break; - - /* MOV D,M */ - case 0x56: state.d = mmu_read(*state.hl); - break; - - /* MOV D,A */ - case 0x57: state.d = state.a; - break; - - /* MOV E,B */ - case 0x58: state.e = state.b; - break; - - /* MOV E,C */ - case 0x59: state.e = state.c; - break; - - /* MOV E,D */ - case 0x5A: state.e = state.d; - break; - - /* MOV E,E */ - case 0x5B: state.e = state.e; - break; - - /* MOV E,H */ - case 0x5C: state.e = state.h; - break; - - /* MOV E,L */ - case 0x5D: state.e = state.l; - break; - - /* MOV E,M */ - case 0x5E: state.e = mmu_read(*state.hl); - break; - - /* MOV E,A */ - case 0x5F: state.e = state.a; - break; - - /* MOV H,B */ - case 0x60: state.h = state.b; - break; - - /* MOV H,C */ - case 0x61: state.h = state.c; - break; - - /* MOV H,D */ - case 0x62: state.h = state.d; - break; - - /* MOV H,E */ - case 0x63: state.h = state.e; - break; - - /* MOV H,H */ - case 0x64: state.h = state.h; - break; - - /* MOV H,L */ - case 0x65: state.h = state.l; - break; - - /* MOV H,M */ - case 0x66: state.h = mmu_read(*state.hl); - break; - - /* MOV H,A */ - case 0x67: state.h = state.a; - break; - - /* MOV L,B */ - case 0x68: state.l = state.b; - break; - - /* MOV L,C */ - case 0x69: state.l = state.c; - break; - - /* MOV L,D */ - case 0x6A: state.l = state.d; - break; - - /* MOV L,E */ - case 0x6B: state.l = state.e; - break; - - /* MOV L,H */ - case 0x6C: state.l = state.h; - break; - - /* MOV L,L */ - case 0x6D: state.l = state.l; - break; - - /* MOV L,M */ - case 0x6E: state.l = mmu_read(*state.hl); - break; - - /* MOV L,A */ - case 0x6F: state.l = state.a; - break; - - /* MOV M,B */ - case 0x70: mmu_write(*state.hl, state.b); - break; - - /* MOV M,C */ - case 0x71: mmu_write(*state.hl, state.c); - break; - - /* MOV M,D */ - case 0x72: mmu_write(*state.hl, state.d); - break; - - /* MOV M,E */ - case 0x73: mmu_write(*state.hl, state.e); - break; - - /* MOV M,H */ - case 0x74: mmu_write(*state.hl, state.h); - break; - - /* MOV M,L */ - case 0x75: mmu_write(*state.hl, state.l); - break; - - /* HLT */ - case 0x76: return 1; - - /* MOV M,A */ - case 0x77: mmu_write(*state.hl, state.a); - break; - - /* MOV A,B */ - case 0x78: state.a = state.b; - break; - - /* MOV A,C */ - case 0x79: state.a = state.c; - break; - - /* MOV A,D */ - case 0x7A: state.a = state.d; - break; - - /* MOV A,E */ - case 0x7B: state.a = state.e; - break; - - /* MOV A,H */ - case 0x7C: state.a = state.h; - break; - - /* MOV A,L */ - case 0x7D: state.a = state.l; - break; - - /* MOV A,M */ - case 0x7E: state.a = mmu_read(*state.hl); - break; - - /* MOV A,A */ - case 0x7F: state.a = state.a; - break; - - /* ADD B */ - case 0x80: z80_add(state.b); - break; - - /* ADD C */ - case 0x81: z80_add(state.c); - break; - - /* ADD D */ - case 0x82: z80_add(state.d); - break; - - /* ADD E */ - case 0x83: z80_add(state.e); - break; - - /* ADD H */ - case 0x84: z80_add(state.h); - break; - - /* ADD L */ - case 0x85: z80_add(state.l); - break; - - /* ADD M */ - case 0x86: z80_add(mmu_read(*state.hl)); - break; - - /* ADD A */ - case 0x87: z80_add(state.a); - break; - - /* ADC B */ - case 0x88: z80_adc(state.b); - break; - - /* ADC C */ - case 0x89: z80_adc(state.c); - break; - - /* ADC D */ - case 0x8A: z80_adc(state.d); - break; - - /* ADC E */ - case 0x8B: z80_adc(state.e); - break; - - /* ADC H */ - case 0x8C: z80_adc(state.h); - break; - - /* ADC L */ - case 0x8D: z80_adc(state.l); - break; - - /* ADC M */ - case 0x8E: z80_adc(mmu_read(*state.hl)); - break; - - /* ADC A */ - case 0x8F: z80_adc(state.a); - break; - - /* SUB B */ - case 0x90: z80_sub(state.b); - break; - - /* SUB C */ - case 0x91: z80_sub(state.c); - break; - - /* SUB D */ - case 0x92: z80_sub(state.d); - break; - - /* SUB E */ - case 0x93: z80_sub(state.e); - break; - - /* SUB H */ - case 0x94: z80_sub(state.h); - break; - - /* SUB L */ - case 0x95: z80_sub(state.l); - break; - - /* SUB M */ - case 0x96: z80_sub(mmu_read(*state.hl)); - break; - - /* SUB A */ - case 0x97: z80_sub(state.a); - break; - - /* SBC B */ - case 0x98: z80_sbc(state.b); - break; - - /* SBC C */ - case 0x99: z80_sbc(state.c); - break; - - /* SBC D */ - case 0x9a: z80_sbc(state.d); - break; - - /* SBC E */ - case 0x9b: z80_sbc(state.e); - break; - - /* SBC H */ - case 0x9c: z80_sbc(state.h); - break; - - /* SBC L */ - case 0x9d: z80_sbc(state.l); - break; - - /* SBC M */ - case 0x9E: z80_sbc(mmu_read(*state.hl)); - break; - - /* SBC A */ - case 0x9f: z80_sbc(state.a); - break; - - /* ANA B */ - case 0xA0: z80_ana(state.b); - break; - - /* ANA C */ - case 0xA1: z80_ana(state.c); - break; - - /* ANA D */ - case 0xA2: z80_ana(state.d); - break; - - /* ANA E */ - case 0xA3: z80_ana(state.e); - break; - - /* ANA H */ - case 0xA4: z80_ana(state.h); - break; - - /* ANA L */ - case 0xA5: z80_ana(state.l); - break; - - /* ANA M */ - case 0xA6: z80_ana(mmu_read(*state.hl)); - break; - - /* ANA A */ - case 0xA7: z80_ana(state.a); - break; - - /* XRA B */ - case 0xA8: z80_xra(state.b); - break; - - /* XRA C */ - case 0xA9: z80_xra(state.c); - break; - - /* XRA D */ - case 0xAA: z80_xra(state.d); - break; - - /* XRA E */ - case 0xAB: z80_xra(state.e); - break; - - /* XRA H */ - case 0xAC: z80_xra(state.h); - break; - - /* XRA L */ - case 0xAD: z80_xra(state.l); - break; - - /* XRA M */ - case 0xAE: z80_xra(mmu_read(*state.hl)); - break; - - /* XRA A */ - case 0xAF: z80_xra(state.a); - break; - - /* ORA B */ - case 0xB0: z80_ora(state.b); - break; - - /* ORA C */ - case 0xB1: z80_ora(state.c); - break; - - /* ORA D */ - case 0xB2: z80_ora(state.d); - break; - - /* ORA E */ - case 0xB3: z80_ora(state.e); - break; - - /* ORA H */ - case 0xB4: z80_ora(state.h); - break; - - /* ORA L */ - case 0xB5: z80_ora(state.l); - break; - - /* ORA M */ - case 0xB6: z80_ora(mmu_read(*state.hl)); - break; - - /* ORA A */ - case 0xB7: z80_ora(state.a); - break; - - /* CMP B */ - case 0xB8: z80_cmp(state.b); - break; - - /* CMP C */ - case 0xB9: z80_cmp(state.c); - break; - - /* CMP D */ - case 0xBA: z80_cmp(state.d); - break; - - /* CMP E */ - case 0xBB: z80_cmp(state.e); - break; - - /* CMP H */ - case 0xBC: z80_cmp(state.h); - break; - - /* CMP L */ - case 0xBD: z80_cmp(state.l); - break; - - /* CMP M */ - case 0xBE: z80_cmp(mmu_read(*state.hl)); - break; - - /* CMP A */ - case 0xBF: z80_cmp(state.a); - break; - - /* RNZ */ - case 0xC0: cycles_step(); - - if (state.flags.z == 0) - return z80_ret(); - - break; - - /* POP B */ - case 0xC1: *state.bc = mmu_read_16(state.sp); - state.sp += 2; - break; - - /* JNZ addr */ - case 0xC2: /* this will add 8 cycles */ - addr = ADDR; - - if (state.flags.z == 0) - { - /* add 4 more cycles */ - cycles_step(); - - state.pc = addr; - return 0; - } - - b = 3; - break; - - /* JMP addr */ - case 0xC3: state.pc = ADDR; - - /* add 4 cycles */ - cycles_step(); - - return 0; - - /* CNZ */ - case 0xC4: addr = ADDR; - - if (state.flags.z == 0) - return z80_call(addr); - - b = 3; - break; - - /* PUSH B */ - case 0xC5: cycles_step(); - mmu_write_16(state.sp - 2, *state.bc); - state.sp -= 2; - break; - - /* ADI */ - case 0xC6: z80_add(mmu_read(state.pc + 1)); - b = 2; - break; - - /* RST 0 */ - case 0xC7: state.pc++; - return z80_intr(0x0008 * 0); - - /* RZ */ - case 0xC8: cycles_step(); - - if (state.flags.z) - return z80_ret(); - - break; - - /* RET */ - case 0xC9: return z80_ret(); - - /* JZ */ - case 0xCA: /* add 8 cycles */ - addr = ADDR; - - if (state.flags.z) - { - /* add 4 more cycles */ - cycles_step(); - - state.pc = addr; - return 0; - } - - b = 3; - break; - - /* CB */ - case 0xCB: b = z80_ext_cb_execute(); - break; - - /* CZ */ - case 0xCC: addr = ADDR; - - if (state.flags.z) - return z80_call(addr); - - b = 3; - break; - - /* CALL addr */ - case 0xCD: return z80_call(ADDR); - - /* ACI */ - case 0xCE: z80_adc(mmu_read(state.pc + 1)); - b = 2; - break; - - /* RST 1 */ - case 0xCF: state.pc++; - return z80_intr(0x0008 * 1); - - /* RNC */ - case 0xD0: cycles_step(); - - if (state.flags.cy == 0) - return z80_ret(); - - break; - - /* POP D */ - case 0xD1: *state.de = mmu_read_16(state.sp); - state.sp += 2; - break; - - /* JNC */ - case 0xD2: /* add 8 cycles */ - addr = ADDR; - - if (state.flags.cy == 0) - { - /* add 4 more cycles */ - cycles_step(); - - state.pc = addr; - return 0; - } - - b = 3; - break; - - /* not present */ - case 0xD3: // b = 2; - break; - - /* CNC */ - case 0xD4: addr = ADDR; - - if (state.flags.cy == 0) - return z80_call(addr); - - b = 3; - break; - - /* PUSH D */ - case 0xD5: cycles_step(); - mmu_write_16(state.sp - 2, *state.de); - state.sp -= 2; - break; - - /* SUI */ - case 0xD6: z80_sub(mmu_read(state.pc + 1)); - b = 2; - break; - - /* RST 2 */ - case 0xD7: state.pc++; - return z80_intr(0x0008 * 2); - - /* RC */ - case 0xD8: cycles_step(); - - if (state.flags.cy) - return z80_ret(); - - break; - - /* RETI */ - case 0xD9: state.int_enable = 1; - return z80_ret(); - break; - - /* JC */ - case 0xDA: /* add 8 cycles */ - addr = ADDR; - - if (state.flags.cy) - { - /* add 4 more cycles */ - cycles_step(); - - state.pc = addr; - return 0; - } - - b = 3; - break; - - /* not present */ - case 0xDB: break; - - /* CC */ - case 0xDC: addr = ADDR; - - if (state.flags.cy) - return z80_call(addr); - - b = 3; - break; - - /* SBI */ - case 0xDE: z80_sbc(mmu_read(state.pc + 1)); - b = 2; - break; - - /* RST 3 */ - case 0xDF: state.pc++; - return z80_intr(0x0008 * 3); - - /* LD (FF00+N),A */ - case 0xE0: mmu_write(0xFF00 + mmu_read(state.pc + 1), state.a); - b = 2; - break; - - /* POP H */ - case 0xE1: *state.hl = mmu_read_16(state.sp); - state.sp += 2; - break; - - /* LD (FF00+C),A */ - case 0xE2: mmu_write(0xFF00 + state.c, state.a); - break; - - /* not present on Gameboy Z80 */ - case 0xE3: - case 0xE4: break; - - /* PUSH H */ - case 0xE5: cycles_step(); - mmu_write_16(state.sp - 2, *state.hl); - state.sp -= 2; - break; - - /* ANI */ - case 0xE6: z80_ana(mmu_read(state.pc + 1)); - b = 2; - break; - - /* RST 4 */ - case 0xE7: state.pc++; - return z80_intr(0x0008 * 4); - - /* ADD SP,dd */ - case 0xE8: byte = mmu_read(state.pc + 1); - byte2 = (uint8_t) (state.sp & 0x00ff); - result = byte2 + byte; - - state.flags.z = 0; - state.flags.n = 0; - - state.flags.cy = (result > 0xff); - - /* add 8 cycles */ - cycles_step(); - cycles_step(); - - /* calc xor for AC */ - z80_set_flags_ac(byte2, byte, result); - - /* set sp */ - state.sp += (int8_t) byte; // result & 0xffff; - - b = 2; - break; - - /* PCHL */ - case 0xE9: state.pc = *state.hl; - return 0; - - /* LD (NN),A */ - case 0xEA: mmu_write(ADDR, state.a); - b = 3; - break; - - /* not present on Gameboy Z80 */ - case 0xEB: - case 0xEC: - case 0xED: break; - - /* XRI */ - case 0xEE: z80_xra(mmu_read(state.pc + 1)); - b = 2; - break; - - /* RST 5 */ - case 0xEF: state.pc++; - return z80_intr(0x0008 * 5); - - /* LD A,(FF00+N) */ - case 0xF0: state.a = mmu_read(0xFF00 + mmu_read(state.pc + 1)); - b = 2; - break; - - /* POP PSW */ - case 0xF1: p = (uint8_t *) &state.flags; - *p = (mmu_read(state.sp) & 0xf0); - state.a = mmu_read(state.sp + 1); - - state.sp += 2; - break; - - /* LD A,(FF00+C) */ - case 0xF2: state.a = mmu_read(0xFF00 + state.c); - break; - - /* DI */ - case 0xF3: state.int_enable = 0; - break; - - /* not present on Gameboy Z80 */ - case 0xF4: break; - - /* PUSH PSW */ - case 0xF5: p = (uint8_t *) &state.flags; - - cycles_step(); - - mmu_write(state.sp - 1, state.a); - mmu_write(state.sp - 2, *p); - state.sp -= 2; - break; - - /* ORI */ - case 0xF6: z80_ora(mmu_read(state.pc + 1)); - b = 2; - break; - - /* RST 6 */ - case 0xF7: state.pc++; - return z80_intr(0x0008 * 6); - - /* LD HL,SP+dd */ - case 0xF8: byte = mmu_read(state.pc + 1); - byte2 = (uint8_t) (state.sp & 0x00ff); - result = byte2 + byte; - - state.flags.z = 0; - state.flags.n = 0; - - state.flags.cy = (result > 0xff); - - /* add 4 cycles */ - cycles_step(); - - /* calc xor for AC */ - z80_set_flags_ac(byte2, byte, result); - - /* set sp */ - *state.hl = state.sp + (int8_t) byte; // result & 0xffff; - - b = 2; - break; - - /* SPHL */ - case 0xF9: cycles_step(); - state.sp = *state.hl; - break; - - /* LD A, (NN) */ - case 0xFA: state.a = mmu_read(ADDR); - b = 3; - break; - - /* EI */ - case 0xFB: state.int_enable = 1; - break; - - /* not present on Gameboy Z80 */ - case 0xFC: - case 0xFD: break; - - /* CPI */ - case 0xFE: z80_cmp(mmu_read(state.pc + 1)); - b = 2; - break; - - /* RST 7 */ - case 0xFF: state.pc++; - return z80_intr(0x0008 * 7); - - default: return 1; - } - - /* make the PC points to the next instruction */ - state.pc += b; - - return 0; -} - -/* init registers, flags and state.memory of Gameboy Z80 CPU */ -z80_state_t static *z80_init() -{ - /* wipe all the structs */ - bzero(&state, sizeof(z80_state_t)); - -/* 16 bit values just point to the first reg of the pairs */ -#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ - state.hl = (uint16_t *) &state.l; - state.bc = (uint16_t *) &state.c; - state.de = (uint16_t *) &state.e; -#else - state.hl = (uint16_t *) &state.h; - state.bc = (uint16_t *) &state.b; - state.de = (uint16_t *) &state.d; -#endif - - state.sp = 0xffff; - state.a = 0xff; - - state.b = 0x7f; - state.c = 0xbc; - state.d = 0x00; - state.e = 0x00; - state.h = 0x34; - state.l = 0xc0; - - regs_dst = malloc(8 * sizeof(uint8_t *)); - - regs_dst[0x00] = &state.b; - regs_dst[0x01] = &state.c; - regs_dst[0x02] = &state.d; - regs_dst[0x03] = &state.e; - regs_dst[0x04] = &state.h; - regs_dst[0x05] = &state.l; - regs_dst[0x06] = &dummy; - regs_dst[0x07] = &state.a; - - regs_src = malloc(8 * sizeof(uint8_t *)); - - regs_src[0x00] = &state.b; - regs_src[0x01] = &state.c; - regs_src[0x02] = &state.d; - regs_src[0x03] = &state.e; - regs_src[0x04] = &state.h; - regs_src[0x05] = &state.l; - regs_src[0x06] = mmu_addr(*state.hl); - regs_src[0x07] = &state.a; - - state.flags.cy = 1; - state.flags.n = 1; - state.flags.ac = 1; - state.flags.z = 1; - - /* flags shortcut */ - state.f = (uint8_t *) &state.flags; - - /* flags mask array */ - z80_calc_flags_mask_array(); - - return &state; -} diff --git a/waterbox/pizza/lib/z80_gameboy_regs.h b/waterbox/pizza/lib/z80_gameboy_regs.h deleted file mode 100644 index 6b403005f1..0000000000 --- a/waterbox/pizza/lib/z80_gameboy_regs.h +++ /dev/null @@ -1,48 +0,0 @@ -/* - - This file is part of Emu-Pizza - - Emu-Pizza is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Emu-Pizza is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Emu-Pizza. If not, see . - -*/ - - -#ifndef Z80_REGS_H -#define Z80_REGS_H - -#include - -/* structs emulating z80 registers and flags */ -typedef struct z80_flags_s -{ - uint8_t spare:4; - uint8_t cy:1; - uint8_t ac:1; - uint8_t n:1; - uint8_t z:1; -} z80_flags_t; - - -/* flags offsets */ -#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ - - #define FLAG_OFFSET_CY 4 - #define FLAG_OFFSET_AC 5 - #define FLAG_OFFSET_N 6 - #define FLAG_OFFSET_Z 7 - -#endif - - -#endif diff --git a/waterbox/pizza/pizza.c b/waterbox/pizza/pizza.c deleted file mode 100644 index e88a33d59a..0000000000 --- a/waterbox/pizza/pizza.c +++ /dev/null @@ -1,194 +0,0 @@ -/* - - This file is part of Emu-Pizza - - Emu-Pizza is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - Emu-Pizza is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with Emu-Pizza. If not, see . - -*/ - -#include -#include -#include -#include "../emulibc/emulibc.h" -#include "../emulibc/waterboxcore.h" -#include - -#define EXPORT ECL_EXPORT - -#include "cartridge.h" -#include "cycles.h" -#include "gameboy.h" -#include "global.h" -#include "gpu.h" -#include "input.h" -#include "sound.h" -#include "serial.h" -#include "utils.h" -#include "mmu.h" -#include "sound_output.h" -#include "sgb.h" - -/* proto */ -void frame_cb(); -void connected_cb(); -void disconnected_cb(); -void rumble_cb(uint8_t rumble); -void network_send_data(uint8_t v); -void *start_thread(void *args); -void *start_thread_network(void *args); - -/* cartridge name */ -char cart_name[64]; - -int main(void) -{ -} - -EXPORT int Init(const void *rom, int romlen, int sgb, const void *spc, int spclen) -{ - /* init global variables */ - global_init(); - - /* first, load cartridge */ - char ret = cartridge_load(rom, romlen); - - if (ret != 0) - return 0; // failure - global_sgb = !!sgb; - if (global_sgb && global_cgb) - utils_log("Warn: CGB game in SGB mode\n"); - if (sgb && !sgb_init((const uint8_t*)spc, spclen)) - return 0; - - gameboy_init(); - - /* init GPU */ - gpu_init(frame_cb); - - /* set rumble cb */ - mmu_set_rumble_cb(&rumble_cb); - - sound_output_init(global_sgb ? 2147727 : 2097152, 44100); - - return 1; -} - -typedef struct -{ - uint32_t *VideoBuffer; - int16_t *SoundBuffer; - int64_t Cycles; - int32_t Width; - int32_t Height; - int32_t Samples; - int32_t Lagged; - int64_t Time; - uint32_t Keys; -} MyFrameInfo; - -static uint32_t *current_vbuff; -static uint64_t overflow; - -EXPORT void FrameAdvance(MyFrameInfo *frame) -{ - if (global_sgb) - sgb_set_controller_data((uint8_t *)&frame->Keys); - else - input_set_keys(frame->Keys); - current_vbuff = frame->VideoBuffer; - global_lagged = 1; - global_currenttime = frame->Time; - - uint64_t current = cycles.sampleclock; - uint64_t target = current + 35112 - overflow; - gameboy_run(target); - uint64_t elapsed = cycles.sampleclock - current; - frame->Cycles = elapsed; - overflow = cycles.sampleclock - target; - - frame->Samples = sound_output_read(frame->SoundBuffer); - if (global_sgb) - { - frame->Width = 256; - frame->Height = 224; - } - else - { - frame->Width = 160; - frame->Height = 144; - } - frame->Lagged = global_lagged; - current_vbuff = NULL; -} - -EXPORT int IsCGB(void) -{ - return global_cgb; -} - -EXPORT void SetInputCallback(void (*callback)(void)) -{ - global_input_callback = callback; -} - -EXPORT void GetMemoryAreas(MemoryArea *m) -{ - m[0].Data = mmu.memory; - m[0].Name = "Fake System Bus"; - m[0].Size = 0x10000; - m[0].Flags = MEMORYAREA_FLAGS_PRIMARY | MEMORYAREA_FLAGS_WRITABLE | MEMORYAREA_FLAGS_WORDSIZE1; -} - -EXPORT int GetSaveramSize(void) -{ - return mmu_saveram_size(); -} - -EXPORT void PutSaveram(const uint8_t* data, int size) -{ - mmu_restore_saveram(data, size); -} - -EXPORT void GetSaveram(uint8_t* data, int size) -{ - mmu_save_saveram(data, size); -} - -void frame_cb() -{ - if (global_sgb) - { - sgb_render_frame(current_vbuff); - } - else - { - memcpy(current_vbuff, gpu.frame_buffer, sizeof(gpu.frame_buffer)); - } -} - -void connected_cb() -{ - utils_log("Connected\n"); -} - -void disconnected_cb() -{ - utils_log("Disconnected\n"); -} - -void rumble_cb(uint8_t rumble) -{ - if (rumble) - printf("RUMBLE\n"); -} From 7a0295e48fe64e39e462837de7d0d55b2feced89 Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Fri, 21 Jul 2017 19:28:44 -0400 Subject: [PATCH 66/93] Update A7800 Hawk Schema --- .../VirtualPads/schema/A7800HawkSchema.cs | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/BizHawk.Client.EmuHawk/tools/VirtualPads/schema/A7800HawkSchema.cs b/BizHawk.Client.EmuHawk/tools/VirtualPads/schema/A7800HawkSchema.cs index 6e2545f634..299262e983 100644 --- a/BizHawk.Client.EmuHawk/tools/VirtualPads/schema/A7800HawkSchema.cs +++ b/BizHawk.Client.EmuHawk/tools/VirtualPads/schema/A7800HawkSchema.cs @@ -12,12 +12,13 @@ namespace BizHawk.Client.EmuHawk { private string UnpluggedControllerName => typeof(UnpluggedController).DisplayName(); private string StandardControllerName => typeof(StandardController).DisplayName(); + private string ProLineControllerName => typeof(ProLineController).DisplayName(); public IEnumerable GetPadSchemas(IEmulator core) { - var intvSyncSettings = ((A7800Hawk)core).GetSyncSettings().Clone(); - var port1 = intvSyncSettings.Port1; - var port2 = intvSyncSettings.Port2; + var A78SyncSettings = ((A7800Hawk)core).GetSyncSettings().Clone(); + var port1 = A78SyncSettings.Port1; + var port2 = A78SyncSettings.Port2; if (port1 == StandardControllerName) { @@ -28,7 +29,17 @@ namespace BizHawk.Client.EmuHawk { yield return JoystickController(2); } - + + if (port1 == ProLineControllerName) + { + yield return ProLineController(1); + } + + if (port2 == ProLineControllerName) + { + yield return ProLineController(2); + } + } private static PadSchema ProLineController(int controller) From d8b13d21b8b42a79956f929a4dcf7b6ed75f41cb Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Fri, 21 Jul 2017 19:30:00 -0400 Subject: [PATCH 67/93] Update RomLoader.cs --- BizHawk.Client.Common/RomLoader.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BizHawk.Client.Common/RomLoader.cs b/BizHawk.Client.Common/RomLoader.cs index 3523776d36..7e16f579cf 100644 --- a/BizHawk.Client.Common/RomLoader.cs +++ b/BizHawk.Client.Common/RomLoader.cs @@ -948,7 +948,7 @@ namespace BizHawk.Client.Common { nextEmulator = Global.Config.A78_UseEmu7800 ? nextEmulator = new Atari7800(nextComm, game, rom.RomData, gamedbpath) - : nextEmulator = new A7800Hawk(nextComm, game, rom.RomData, gamedbpath); + : nextEmulator = new A7800Hawk(nextComm, game, rom.RomData, gamedbpathGetCoreSettings(), GetCoreSyncSettings()); } break; From 2ae9de98effb0cd1bc8de81c37e56bee876cee26 Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Fri, 21 Jul 2017 19:32:50 -0400 Subject: [PATCH 68/93] A7800Hawk: Updates and Bug Fixes -Fix save states -Fix sync settings -Controller Support / improvements --- .../Atari/A7800Hawk/A7800Hawk.IStatable.cs | 1 + .../Consoles/Atari/A7800Hawk/A7800Hawk.cs | 5 +- .../Atari/A7800Hawk/A7800HawkControllers.cs | 67 +++++++++++++++++++ .../Consoles/Atari/A7800Hawk/Maria.cs | 2 +- .../Consoles/Atari/A7800Hawk/MemoryMap.cs | 9 ++- 5 files changed, 81 insertions(+), 3 deletions(-) diff --git a/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/A7800Hawk.IStatable.cs b/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/A7800Hawk.IStatable.cs index 36b9fa3455..55b92185c4 100644 --- a/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/A7800Hawk.IStatable.cs +++ b/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/A7800Hawk.IStatable.cs @@ -51,6 +51,7 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk tia.SyncState(ser); maria.SyncState(ser); m6532.SyncState(ser); + mapper.SyncState(ser); ser.BeginSection("Atari7800"); ser.Sync("core", ref core, false); diff --git a/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/A7800Hawk.cs b/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/A7800Hawk.cs index 005bb59f94..0996293d93 100644 --- a/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/A7800Hawk.cs +++ b/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/A7800Hawk.cs @@ -48,7 +48,7 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk public M6532 m6532; public TIA tia; - public A7800Hawk(CoreComm comm, GameInfo game, byte[] rom, string gameDbFn) + public A7800Hawk(CoreComm comm, GameInfo game, byte[] rom, string gameDbFn, object settings, object syncSettings) { var ser = new BasicServiceProvider(this); @@ -72,6 +72,9 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk CoreComm = comm; + _settings = (A7800Settings)settings ?? new A7800Settings(); + _syncSettings = (A7800SyncSettings)syncSettings ?? new A7800SyncSettings(); + _controllerDeck = new A7800HawkControllerDeck(_syncSettings.Port1, _syncSettings.Port2); byte[] highscoreBios = comm.CoreFileProvider.GetFirmware("A78", "Bios_HSC", false, "Some functions may not work without the high score BIOS."); diff --git a/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/A7800HawkControllers.cs b/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/A7800HawkControllers.cs index 6db22121c6..93b79d2246 100644 --- a/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/A7800HawkControllers.cs +++ b/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/A7800HawkControllers.cs @@ -108,6 +108,73 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk return result; } + public byte ReadFire2x(IController c) + { + return 0; // only applicable for 2 button mode + } + + public ControllerDefinition Definition { get; } + + + public void SyncState(Serializer ser) + { + // Nothing todo, I think + } + + private static readonly string[] BaseDefinition = + { + "U", "D", "L", "R", "Fire" + }; + + private static byte[] HandControllerButtons = + { + 0x0, // UP + 0x0, // Down + 0x0, // Left + 0x0, // Right + }; + } + + [DisplayName("ProLine Controller")] + public class ProLineController : IPort + { + public ProLineController(int portNum) + { + PortNum = portNum; + Definition = new ControllerDefinition + { + BoolButtons = BaseDefinition + .Select(b => "P" + PortNum + " " + b) + .ToList() + }; + } + + public int PortNum { get; } + + public byte Read(IController c) + { + byte result = 0xF; + for (int i = 0; i < 4; i++) + { + if (c.IsPressed(Definition.BoolButtons[i])) + { + result -= (byte)(1 << i); + } + } + + if (PortNum == 1) + { + result = (byte)(result << 4); + } + + return result; + } + + public byte ReadFire(IController c) + { + return 0x80; + } + public byte ReadFire2x(IController c) { byte result = 0; diff --git a/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/Maria.cs b/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/Maria.cs index 9e9ca302ea..50f9a71d8c 100644 --- a/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/Maria.cs +++ b/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/Maria.cs @@ -218,7 +218,7 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk if (cycle == 453 && !sl_DMA_complete && do_dma && (DMA_phase == DMA_GRAPHICS || DMA_phase == DMA_HEADER)) { overrun_dma = true; - //Console.WriteLine(scanline); + Console.WriteLine(scanline); if (current_DLL_offset == 0) { DMA_phase = DMA_SHUTDOWN_LAST; diff --git a/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/MemoryMap.cs b/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/MemoryMap.cs index 164391b25f..f8229d38c5 100644 --- a/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/MemoryMap.cs +++ b/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/MemoryMap.cs @@ -124,7 +124,14 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk if (temp == 4) // WSYNC cpu.RDY = false; - + /* + for (int i = 0; i < 0x20; i++) + { + Console.Write(Maria_regs[i]); + Console.Write(" "); + } + Console.WriteLine(maria.scanline); + */ } else { From abf60e57b840c16b9aaf81d90a32d96107cc0d94 Mon Sep 17 00:00:00 2001 From: nattthebear Date: Fri, 21 Jul 2017 19:35:00 -0400 Subject: [PATCH 69/93] forgot to commit this --- BizHawk.Emulation.Cores/BizHawk.Emulation.Cores.csproj | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/BizHawk.Emulation.Cores/BizHawk.Emulation.Cores.csproj b/BizHawk.Emulation.Cores/BizHawk.Emulation.Cores.csproj index 5e03c074f4..065cba0972 100644 --- a/BizHawk.Emulation.Cores/BizHawk.Emulation.Cores.csproj +++ b/BizHawk.Emulation.Cores/BizHawk.Emulation.Cores.csproj @@ -539,9 +539,7 @@ - - @@ -1333,4 +1331,4 @@ --> - + \ No newline at end of file From 4b38d13ef4a5a61cb62a37baf6b1959032118d4c Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Fri, 21 Jul 2017 19:43:46 -0400 Subject: [PATCH 70/93] Update RomLoader.cs --- BizHawk.Client.Common/RomLoader.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BizHawk.Client.Common/RomLoader.cs b/BizHawk.Client.Common/RomLoader.cs index 7e16f579cf..ae69793fbf 100644 --- a/BizHawk.Client.Common/RomLoader.cs +++ b/BizHawk.Client.Common/RomLoader.cs @@ -948,7 +948,7 @@ namespace BizHawk.Client.Common { nextEmulator = Global.Config.A78_UseEmu7800 ? nextEmulator = new Atari7800(nextComm, game, rom.RomData, gamedbpath) - : nextEmulator = new A7800Hawk(nextComm, game, rom.RomData, gamedbpathGetCoreSettings(), GetCoreSyncSettings()); + : nextEmulator = new A7800Hawk(nextComm, game, rom.RomData, gamedbpath, GetCoreSettings(), GetCoreSyncSettings()); } break; From 3ca8f9da9f12b1e0dd0802272b52b3fa392a1cbd Mon Sep 17 00:00:00 2001 From: zeromus Date: Fri, 21 Jul 2017 18:48:33 -0500 Subject: [PATCH 71/93] add 64bit openal dlls --- output/dll/OpenAL32.dll | Bin 0 -> 122904 bytes output/dll/wrap_oal.dll | Bin 0 -> 466456 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 output/dll/OpenAL32.dll create mode 100644 output/dll/wrap_oal.dll diff --git a/output/dll/OpenAL32.dll b/output/dll/OpenAL32.dll new file mode 100644 index 0000000000000000000000000000000000000000..259177ac33f588b814978693e809a9a221810449 GIT binary patch literal 122904 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 HI_m!cAzX;b literal 0 HcmV?d00001 diff --git a/output/dll/wrap_oal.dll b/output/dll/wrap_oal.dll new file mode 100644 index 0000000000000000000000000000000000000000..2713dae65a6f245af350084de6f294317d312fc2 GIT binary patch literal 466456 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

    gh0!ge|1X)&lpWU*z&C?5PBzVmv*!h#J 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�C#-BMZk@UCMrY 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 z

    2Xk_}x!=RKs-pHpU0q>C*qDL2QNXBFg;pe^wrNwJMgbTqIQgBATP1}gen8ldRE zwE=>T0r}PjD5bYGK=@UR!LMRSj2~Nq7FcO1x92mqqO1%JTMC9)#DAQ*+)`FDM?nKMX^PLSj1i^;Y2Fw!CPv`0F+mlQml~ZO?wzCO2v&@Ob#(eN-k}87tBqBY!uy7Ot z%w^^2X4q1()XA{TvG|V7Tbv>OzYqhyd-IyjZ&+O;mnZX~FDce{g%QehnGcyBS5QVX zeVROxu~1_%MKT77Ug-dYX)JHi&<;v0DU_=ywv# z#-A;J@J$)sj&GtX_$IH?KalnWr)_vyUb?~;5sPCB`pxJ6hZ}LZ^{`J%eoSckJsdX# z@2lN&qfzMLNVf%9_HUhC4REoAKFz=k?cZi0mc$js%Y`gp*%F zz)zubDXsjg5g)=0qMK5Ky*4A|i|+{Gw?E4N`$rGEeY|#9Otu-fQ*j6O=)L&w#G!Hg zcRK2*%b^DAoW+O4^kWR7+g@^q89shw%?NzQNGh`~>b@ZzqaNMx>hMRtY(4xv|9WBd z6Gw;TU+FXq-zgF%U;kow-MoGJ#thm&s%XK}sx zx_{Nd*q<()OOL|$mk@6f+_juPvHXUp2j|wkI_bynWLd3ewtv)N!|*kt->^jDPcOMX z2Cpee>rcLWNsezgT#_<6`ppk~_eP5SWsRMG(*`Gpkewg;KKCW=8J{^CywT3TF#p$0 zvv!^GePchXxz^{xLksNuTT4fE_|CH?cAZE1-~m1IVmhw=xOU6;Gh;V(*cfqHXDnFm zRpWBd@?_joo3CsgwC>3^Rl{OC{B&(d!jr4BFE`Ab`q|em&EK6l`f}V;TZ`VvdXkyC z>|5OKLhvgoj}G^%eBT(;eMtD{69(+xIeOn4>C+Bxdgxp4NxwW<_2zwsMcdoG;`MXe z1Ml3IwZvt)IdQ>|h5kqPe{w!O-FtZWifak~Jaf-8wbgE6o4u}Hbh>gme)VFf!xP$; zti87I!qkl+5vfm@`nkU2c>Z&-o?HH3w7AXnq-7rQi`!i~yJqTK{gTXIJWi}l9JPJV zKl+{s48G7%QgnXKmJfZaK4aA(9}NGzWA)xcT`Pwgmd$tA{6_U#*)?JPzqwBl-jFo; z*?9_oO}o`z3l;u`q+iTWJ$uUcsTZhzKe|@q%r<`Le9HIvj$;1SK;fL5RGfR72?TR(Zzq?hpeG+%GC+-&g8vpMpZP>mt(S4|%yV>_e{6O?;FTBWI_J`AT z9&h8l+%;@C&)sa7lqRCrojt_ev|iyqa=-J-+}%Dez)s~$zAXS@ zeY7yc>y619cjpR=MvNQs!`YF-^60pT^=>nT70x|B)L$qN+;@%fO8mJ%7@zR&k7v(~ z5ni~z_ld_pOhdnh_|fs}zvysO$Xs2yH+9}J!Cc9g$)Zwh|ChfD#|bzUw?Bif zbFf9_4^|sL65Xl_*DW=u{KuBosQfHj9nK7P{%X7Y8*F}2?$b8Em~WlUFOGA^ZGO4F zpJ!sfsF-UnlXX1s3mU%z&?>l0V5wWNRV%G6#r zFWACGd$WyuRK|^%zAgUm8&4m&d}WL+y=afTKM)y0e=)L^%74TC6{9V_-t%m8-R#-6 zvH81$Th9~Z#0uBC{PJ?*EBn-I8_2arT-{D?!%um8$Th?q<8oOiKE~_6;j5l+5?$Z6 z<}Gq-dL

    {;4P5;qkvse2?7f)(1}VaA*GyxZgSML+%f`_Y}E?%9ZuxA|GxiHJvYh zME>mc>^!;I58lV?*LpTev_r?k z+-*2+_?*I7|3loZi5`BD{04`8+|8al;0y9My!tYCv$uC?Qkmb=xfgl~BIiEFr<9p(5ho-SiLcdMT}#$A0tk8g=y{dN_1 zvv*zQuC*avwD**?vfZot6C`15)xI7ZM!Eky!f9~-hkk#et6(|#>dMt?qJ)eSb6fi# zj})pW&PtlS`^yoPslAV0-!)WNy5!fo(zpBt_v+OTee_$R5c1*gJ01ENgyBanbpNDa zm@wn3Cok+YMF^j4>f)BKO%zI9->q;zHCZToR9EiRK0%lk{OTvqCngKym)&eNWaUUH zpGm^Hw%ZN_MUD}+S3L92i`zqm8Ri1tzCw&(y%G7(nm^)%;(&G43nL~7@BDsq%bxVn z0?X<&-?`$e5e-3a>60ru3b_MTz2Lb#TF4Kb{>OlR6NHA*KJOZjwiVX5dNKCPf6fs6 zcYono_e`;H!pr4Y_wFV^S9db@>hDQH$j3{QhZc+zcD{3BTIcE+LXPwFmu9RemiU_> zgsh+a#oFK`q4!{~la}1kLfd!uz2e%@B$;{nL@*FJD(cxjZvul^6d=glxf1= zuU#9pg9-%QxlhYV51NIz&#bL4c#ao-jQso$M;^zwVWQ-%*PY<@XJTZZ=IYj z&JT`X=i`d?=OrhkeBS47;Qo{3)`YC(^9pO`bUx11MEBt1jP>Fb?i!Ld@bRYR(HuVB zShu$2O49VpHdEx8bWA?&?2w=Hr(&G=;l04Nr;Vnf4RzHZ1AD z$1~J}IKJIj$6a>jGI#ZTdh&6t=9ih=H5j&Xw_5uxcN?VniR_XIuuregnQQGdSU5Ia zyW((pzVPDPRjcoLd#dnUzZ1sZ+KEC~hF|1;Z{`Y5%`Gq3nwcYf_2AAOGrA@VYwo*m z|A9yD5zeijw7g4ri7;DpYSiz}#llZb&yBn=V5V@R{SQrzJqm?M?JkTuw%A7qi=MS> zd{dIJV&I;e{i^eXS*|myHeAY)@|h{5k6Zi5k_j_~oBOxjdu(WqV0vHUeCo7Wi0S;n z&I6Z=1XJsj6;G5F34{9`{VE>)``LT0`2TcKFZ>kJeOJTY;lj~`&@XjcN`!+kwXXy` zKUL^{|9pSDjZ=i|XSXlTpCJgQ@3wzk!AgYZSNyin&v~Hm;lc0UjJ=vI zEXsWK8>ekqLVnh(BQAZPBCNl+?QgNqCJ4(Xq!=!=FBGQco^{*&v_bghi{F84!aVCIS9UNj2#9Y2=&nPnp=k32*qKvG)+y?MpX{F45>$elIr3@9?|ZU)}AmWYf6Y zU)}AmsNeeU^jDSdei}9CnR`QrytIkWn{U^Dq2KBs2BQn?6UX=UMfaB|*>%ng7}#yY zli2&!TBAF@7Zv)0M!(~uAEUOs*lk{q`_Dyv{hq@w2?=h7N#E@~d~nSNQ8!O?n9y18 zWLUcV$kJ1xTcRHSIdIqL0pCUq>b&8h8()r%n)Uv|9x-iSkIL~GFlE|USKhB;Yw}P| zUI{;9l=fE+z3NUIQ469ng)2eWe>$W&UpR;Moi<+Rw~Jkxd~n~eb-(Ov_;Q38e|^;S z0={2$Xz4dii2tkblX?C>u|IXN^5r2*_k7z~h?#mK;Zx_A-uTC{<3(XvG>Xvo}Wqi(Dy`mRky->AtEt3tO;=@a$lkD-}Mj(mAYa-(oniCC0=ch_70 zsq3tHH})@if8b)no%Wrx7CzJNL+==aY$*!2X7zjg{2}|KgC~VIbaM?Mmqm;oMsBv| z@pN)SKO9^@ZvI2T3&>6TI`LU@OIvN+M((i}7QRJpRow8;$W3c~{yMo!cQbc7@*TBh zQZTujPF#y1x9;i>Y2;RgyG|$9B{+3Hxi`)vJj3ZOSGREg=NsN6ci-0CXUPrQ*6jy! zx6gmsB?j)&Q*Y8&^;rIZeOYkVkzEEb9_| zt~~tQ{Z}%h1GYZ*%IRZcqBH*yH~nM%6w-_0$NQtSitYT|$>rBTF9QOXt_$Y&HStOc zx36O*qJ33f676f$!=im{lI+VW*;n0vf_;U)aYQ$6^$6kj zQIEgL>W<<(>bU_aFU;R26r@*~8ZW&q7!N1x-?a8!Vclt;oXbt8gkHkrvB9%6QFYfJ zNgs2rQSh0XQ<>Y!H|odEXS_~N&WOr<>W6VYdthIF*`w!NoDg+t>x`^ju&)(^?_ciD z9*kO6v(@`)*jLg+hpv--`E>5tmh9`JeEGY z!3X;>%kN!V6^Z?r(`Bu;Hh%iH(7#_A!q-QA{M`5-XC5AZC~??JX_?r6*_Uu4c4Ydp zga6fii~njmiC>vdnXf2`9|3zSHtEH-VvS-o3!|9zK>+t=td9aufc7NtH1>&bcgFfW zo?nb&hBa{4!~YVVw<2r@up6{}aNht9gZ>u6={yi;e^#998E{5dgLAhUoS9j1K2?Le z6E$?N;Yav?g^Pu0!I`0}JztL0SqzaKz57P?xwJI0;apS1+JmPe6AoX9T=o2^p$m`K zM|yZ1j@&T$x5!g79*j)?IXcq$qa~4*(>f0A@W!{1O+z0U+GF63$oNgGB7=Uq6ln}w z7CCZOb>zh7It|S_|7~Q=x9<&opa;lw4XCX>58XvTn~e5rJhpV(OlF|H!b- z5izWE$MB}#9~|`Z=AHsD;^8Wn;W_SmA~l|ALvhcG*PFRlSQzaWhE+!LbB;R6h5hjA zj4dgPuPm@gciiz!>hipjGP7B{fQ=Ys6~&fN+_fAAUb6S`x##;{+^bVpP|8XJW3Ja5S3W~YxB=-Q4yST)nHy4*wOwZSs zm*(U_UPPyRvxTY(Q`T31yZW-pZWfi7ZWQa=k`Ja!@Cs$$zg{28a>A&bSmZ`LwiIHb zIN*Ok1cg`d*PqCGT4Lz)%{irFP84s*pU648K#`E^t|i^zJEkkQnEoW)AWBz?S9A2U z3d$@MIfX4sB5m>lh%dB@JJf$x36`A&mVPiEIC=}c@MYtx|4>TTB6kViVxhKBj+fB% zCjLT?7?)Zg%IPoF6S@erA6O36j(tm|c)Xq}P_h&ce{9%NVBxQhkVVW?rlI(Et{*9p z2``Pdu);e8Ptg<<&6RfsWoEn{ikA?@=ASNgLQpCe-bDpyXfQ^y0cr*n#TDgLsk3wb z2fG5u6UOWHw(Y@O3{9347vbF^Ngj&N>-DzrbIPXU9hYKDxlMYC&)eHHdY6zIbZJRJ zv4xv9b$e!R)%f;wL0(x&IbN32k1ya-#`fx^m+K=*>Pwq5%U9Xshe2X_hS+O2zNkDk4H_vza&tp9+4;e!Sbi5MC=Z1@Nv$`BnBi_eFQ z9F;hFOj2@6YTDTJ4CA=*6DCfYd{5?-sae@Mxp^k@wCVW;GiDYR6_=FWTUKtVm^Hg{ z&VBdKePG^v{TrEW@f?4+-#J z`M$e+4_>|>k3nUCSa!?*@9u~E=kABd_aUQU%BrWhxb+vzJ9GuW{-FO z?EVbzce1dtk_%(Yno|t)2g2C2GW1HIO)DxfksW5`&nYdz?Z2!%e7gYtLX#MdV7|7V zCXyMZaQt%-dFBGVwTySnaruG@A(#8HTDR%{~Fk%97a`7QR>^`nYm)S!(VKWRuvk zz?BbR5uTJ&Ziz-2voO6XtssH%16`zv*|B82@t!l?98*#$ro<<|(pzR3V5(@UFQ-m>+TZQFP3e0A6EJ$v`@HZyY>SbNI-cwQs$B z^w{xt-aYZ&`zPx@`0!Ny>5o1>^U2vy&wY0OLc`}5zi9mO(&Z~(eSP(te|`JiweNqp z-t^;7Ki~M}*WYg9k0G%C?gIYK3-rIVfdAi?|9`vu|91WVyA6~(hw}}T|84n4jfyNP zifsALmI=S!`egj{^e_iM-dvKC`1UeTpxd_tC-Q>S zL;jREL!Oi$P|T9?DLLc?w~Qe@rC}L4_&$zF{Ki~DS%LI~bCLXtvT~abe-G4bDmE(! zMr>jEn_kQ^3U7caC1I67hn z>A?pdbi^4?m^IB>h25ag?h$Ddtk@sICQ@2j6_V;htyNZ}V%SE?&(C*pajq;aon2b0 z+CS>wWo$}x3f^b#l9-Z!xa8tP7jQE;9goBh*aCN861;+C;+)qbss=TLib8#%+E9C_ zMARj!6g5i~jGvyq-$Nh1)QeM8eG+|=qok}m1>&cVEyS^kepCUz2n4Oo(c>dUd1VEq zauj_Go%D#2qRYy1=12*Z^p+$zOwxyn`5Nbxn(Z?~NH#y((BspNn0({7g1(ESpAM5S zi5X`XSVqc_pQD_~yENm{NfKNreE}QoLEY;)&Fs$42>oHDA*l?C63; z=?K6?AF&dTbLfCZu0ED6$7?zLz-doQjBInhEXrSEQ4#-7MYpdf1%Ij01R8*Q(7H1c)JIhWt8WYKW;z#j}vMWp$oYK)pv#^HOaJ_I0Ids&i%s^3fE#<=~ZkJvZz%Ezt4J+e{;k5z3s@=CV_-qUMiIQnjt&qHA zL(u1}Ty7z9K(=Hty5hMX&eo##`ZiM89O74+nM}F@iFhI=rhQH`GNN$bfR!gp4N*5@(HBx#X$?qY#E|RO0Tqe0U z1I7HWN$xk2dqr{^CAUFx&q?kX$*q^%I>|jDxyK~8R&r}3_kiT?liXdByIpd(NbV-d zT_?HKlDkTBS4i&DlDkxLACufF$z3G5R>_?!xs{S@k=%UAohZ3!l53FMP{|FHTqd~< zZN&Pkk=$y@wMuTbjy!z4FEaswsTMRKpS z67xSMxz&0mt)lB+!W^|I|Oen*#ySYsA4IGe}j*%9vGP81U zc;;*bW|ia=_ANEhKB@9oxxtB5c5qUXY|mOeEmeeV!gHO%FGr+2#x!@ZgA2;OB3)baD@ps{{zY`zyW zG0KR&h+8kP)-*fzYfd>^>AiAEWWI($%l1DUd~cp^p(@j zKq+o4J_&f}!3)DFy2TZXBxg03oceJM?y#Zrb4q%^NMOUO((lx%0%-7_?Ji?ur zE{6C)9qfaJZgLR+5PTIDO_k77zBBl0g^!O0ur$P*0X)X}#UZ-VAMV4#k-jg|cU+-k zfk^L%^qxrXg7iAO^cr6s^9}b$efj>Svh`R4M*?!$D*s<7TNR&qK~BiJ0(c1LI@PdCs+JF*V7PN;u($mNFmcLg5^&qa7oKi0F!m33=$W5M5#)4dWAi>f$kXY zt`5U>8-_4SL;X(nMmz$mQjw1IgfMS}xgpFE{HnrH=hrsjZq-ZZ$3o=#a#hhZ-VU%S z$QdKrN;cx&2V99qe5PfL@>J5ez1Y!EPU&XYz{`xCqjIR<$VZ=zK37TCbn{`|n%c48 z#`dgZeFxUIwj*n8>4G}!j5^e#4m&YTgddA&f*m!&j_P4YwXh@DMr-uXenwx!^Fus; zrs?Cy`uvr6UA>^&KhasRC(3b!?%gEadqDSOgI-K`5xQUE%a&B?*u(jboS$~!rw#fM zfAk~X;Kv=hccyq70@()iG1bOaY$W;|0ew!dCU4fg(T8=Z_hp@G{a8DsYlA-4KfE>b z*0f=~KK`9e?P$$*p!|&}e|4i53vKdbA@$y<7a!D1E7VH>>cwBG7hk5?8_4#eKOeEl zkqyN7+Ox?Qb?FD*{gEaBX@Za@5NX;VO>5L;E2in;!+JEqwj2MXp1OG>A7x)d?ZiXs zYrMod*z3pkLRY<@m+sJC7wE4O>Z=`e*9LXv58Zi_?#>6Y^HrEvRXVey`7UfwlRxX< z7{Gegw_@FDTeDzG8`cp#wl#v+@V3lP(@tzVh|dszdk+mW4$!cP-N{Dr!nD%wtz+JZ z=V}*EbG0?QiZU)B{|MAgAJk2El-mVmc0zgWP+l99=a2HdQJ$uQJ8Z%QHsQ(T^fIEK zMt{Ql3+hL1NACbT0=*ULMH!!u+fAN~L4ORoW6+&EUNh*9p4ly$5vfg7iAO^cpv<*dK8|X*{9+jQB^tdPHpJ>}d^)0IH}wsUKC+ zH2z}$u9O2uYfKvkTMuw%0T_?GEK;51g4Wrcb*|E~wv`SD(;>`TY(r}hMtPxLyihN$ z;o^89*6;1dJJM;`OByx_=-mVS$@3%hqe?o@7h@(LPtgBSAExQ#&N_jIAn@RCf!rpw z-1;pVHU;qLDc18$?vRX&X_l;XdQH{1KPS1+P*5S ziDuuH={ccZR| z7t$BvI6_}ax=mjeq?PnVY4v+x_dr!I(gEZ^S{04>v8N$j^bJ%2d%Q z-hK_M1(f-#Xj1-4nmCq|jG|o;pLMTk*zbUSc}luy>(U%YA!F$Q4SN!Jx;M#)H3gpc z0&}?^c2VmJx!qa78yc1X7&#qdKG9*vw}vrwT$%@yy(7NkE%~5M!+q6dl6~6Ks16%3 zkEnNHN`5u199gR-C+1^B`#mDfV^G($7AifcVRL}`2$WCt2${*B`L>4Dkqk7qL0rB* zf(}*jQ4iV2H0)o1p^sQE^t|I84bzj~Rf~SypNHFMde}x|57=QZ^ntz6|MgYn5i|r> zkL!D~UZy^*d-y=~gZ=pYQ?C*2wB}v(yPAs_3DCRe7S?{{JQjhIU#%oAZQ zCLdL}rky)$hjF`2J;uOVjDZ%K2Ve~3bpv}ot6>#@OJ7kYdVUsYqB5Pd=qns}xQ)i` z&r6k#_owx)tUcx>{^(2X=fytfG%N!smCB&!J-|frbKUy!a2t*5)(yIKXUepE{tX%R zkfS~N=s=Sf3&5D-b5X1>eS?OL2KG_Deoo8}?cdV~8^gR%8OH4%{R1BpFy8Qavu*rQ zuV={qeZJMOSRk#RSV#0c2^h}(u={$z1lu>d@p!f{;sIfv2y?U#qk3#YU#iGk)76!A zZFI!?$Qg4@7v>x8%{tK3w5ueQ5`}Tjz&+WOw0SmCamci zU6?;~=7l;`u3_qa&@k8Q8s-y5vcl$|1BUum(J61x9qs6RU5K%)4Q$LGcIXYelx>Z# zXDqj_SEznVZ)(^9U^_39vDn`=>^td@vVlg}x{Nb1{EaoS-0aE@s6VI3IOE{2PL`tO&>+ zNcExR{iurOP3uAIhe2-YPgP+^&qB1UKVTUkrAIt9jraxZ=>v3Z0O&N9D&uQfQ`>N5 zz9_3@uL&E)lJ7fLr$U2#@e_=#lgZ^F_hucA;6Z5U5Jx6J+Gt-sLL?2@^y0VGX z=SzJ%=du1#rXQkZgMl+t#yd{z9pe(_4!W-PF;$qRwF_+QN$6xL=CDtI*T*@JbrG>FVJ%D%yxsAaDL0YgN2 z=(*cylq31+xqOV4U6JK6`SEZYjrR3xy#=`~8gEQQpEw46A~vXvDePLZmK{ye zvN)Qz(!RPfEv5O>_?VB|$4B1kJhAttDg$@a$7|SkVZ)r* zFz^`&9$dgH@k!x&N|)}&(ouE<UD-iZUaYDznBAA(h27gU3iIL7IO9lS zUBfeA7pdGXsx@TOm}8-D-DG~VZlW0o?l z#??VJeqS?TpTGs= z1fE;=7fDx3pVqQNzzs@AIzhWt(m216gT`2SPL%cx$^x3wkw!Tuf?TRF2BE#TMc;z{ zITU4vqD(!?3`Che zDAUERJWV?%>^qNPZNgKSKiYn02L5kget#tZ^5D$y82Zh9Z6Hq|1wXFfN0p9`kpffY&F4r4%pYPnpA=@KGAJ%&Q1Ywk z?Z$dH4P&8=!&ylE2&T70u^>$>M+f_fzE&8G_=mQ(=#chfG0@;3tZBe--C*}c4nkL$h zMOQhpVUc9J4j8omlHitP8Op;#8)^oLW5|)wnod-RK~;|LxfK zNB^)9{hWB#<;0ZXTyF^Xp!op$5Lq6+S1I*_8h+M~`7-7Woe#FQW_>MAtOsZz z5{=rZA;f{r?~3xHNT0B6sSZ^103APnbHv4t*8HgA3bxJ=U-_&u$b(A~iM{dXq^`Ycp zkOS*F*nwFoFPR4gO{_;d9*|E>gad0cRL#4J#-fljn%fl@gx=;Zf_c3=~Uwo=Ddg63T1tftS> zu~|s(yaM}2$~8?t$0}BP}sBEfFvJ(Z( zHur%JG=8{mf$)~|U?|h%z*2ya7)f@VAFF6QPc=>B?!es1Mqv0~y?i^Ws375^qYS; zu)aXZWaLF_J4COyIyM(hK9yU%R6bAj_DFnrn`>0Ll#Ha zfs)S05Xeb3LigR|Hl^3;STbOsw0xYy9;OjzR|-0xU%+=}9I{4SYtPKi4bn1AL1 zNu$B1)W;}ke4YT?mFEeposNyee5XCx61ClY%vF>$ZmVjV=0h*`;R-jlrplc?myi2A zmiD;A)B$?w$eiW-AZ~?()c_N>)O`Rx|Vpp7O7+P!*#4WNwSAZM>UP|v7>1^=~$owFd!hNE2ta~)_qI{$@N}8sF1M7e^x{I)5XUxrG97?s=bo+O*Ux|b4KwZ4(YWy8= zCeN5ISgdpXDBQ(KRP(Q*NxZ0Nkh^9K+Io_XosiD8==r&1^bwMuo_nUE{ga>P;mpHr zH0l$ou>Mr0Biaf_Ro18p&41>DcEJ(Fdj=f4(>2&z34^njs!+ z2-fS}v0m?pdtQFH=Ox~Iqn+duO`|qkS^n3ChX;ofCN0~b8zbnhtIO8tGMNy{hSvuA(SI4eRB7V@V z;JFmILS;&NxP=CrP^W_&u;nll@|vc$WfhI&wRp0y={gn;@Vl@mlb*){)>M%PdY%Xr zlAre(9z0w{t94PQYvqJ?i@6ErCH(#{(#vIV9WEq!#qzEBI<^Rq%cti}z&S;EDp~;T zjkqvxMgGb>ct3>mXR5!t88|O4#8{U`vY#3Sl*Kp$}jS<;}28 zk;7_(VMASRjnm}Cnh+-t=>rhQ2XQ=*kBhM@?7y2Tzo7PXw%?uCT?6Wl?_bIJBaP2| z9qSGJS=p*MKYFnr|Dc4E1kaCxf7*Yi_JcN|r1ASFu;-S$ zo#MQm($+ktV?O}=emmU77nDUN>DjezSp3$)TwUb7Wa@XxL1t3eeykInfE5_ zdA;$xj_FrPywe&7Jj?r}rJ&DyLC4Qte5o(SIzvwT-D=zism7cfpr7w;?#9S*A6cVg zJAgWXex&E6YcX~L`%IFJpuUte-!_i8yM((KutQJinDWvhUF|y92T;0R%*z?B04$aK zly}_**v}@kp>dL)VdqMkxaRib^9qVz{gRFy14=1A@1tGSG_qmvqKwD)olsZGvod^x zmDK|4C?6?}k|xe&#dal^gYU31cffw0sigD%eJ9p34e0e6()8E``x=k> z^2HrH&}qMeN%2(SLv?H@(mEncN!N75J89^jXpPVJ+Z$mQ*pn&Utz)wR@s15F2f8Bv z>%gc9D38WL&>WFgMepp!IwOzv$fFJVJU7mhn<_s|kuxho+oOArZNgjDnKk=#Y{GsW ztD*cE_^73|3ic_KbT{1Z0iEw(DCnAY*gryk0m#>z_Ky~d?Iink9Sc67Q{8=1(liN< zECF@q1Dl}!nwN_X#{8MMGL;I&puM_EFrJ3+kBL zAj)cmy7R$0%pJO>ay9%N2CPXy_XpieqKi7oguZiG-C-R|eG@v7_)+=WV6NGiiSb(< zFKDP28`^Xa#_%buf9+K4<7TlQrfiJkIq0ABc>jD%3%Pr_v0nMV;~ergtSxS$?*Gs* zqeh!ur(-jKr8K_`bz`9j?2DX_*@JaPcn5?BSsb(;h~t7h zbm2@@mbgFGtl?u6@rU}qb{g-mek{#($qq0M)4Pc(I`u#HH0pcpXguGGV!mN#F;_Wf zH}6%@c-$k<5#>`R&J*<)&}M-&TGQ)r#%=LoN?MQ}<3c#im3(;}V+qJ*sA<6d2cS%+ zq)BtpQr^E|?iPl&lnfl8a%f)&G#$n)B|WGE&QcWfJDQh?=^a_ampb+ppuY#{L8s@N zfD8F~A1j92XjHEzNAx3jhd_~5dx=? z5kK3n>exY`n)uOU9~kz}-zPvDQHJq-7_SSq>p;ip0W1kfNYxxQVzS(hffht-HZ+IsQ+slNs5IJ|Qy zzw;@Vz2qA9Wxj`<0`%i!L#}e|edjra-*p}93}j2LrW5vl>T&NKF_5_Fu8WdqfRP;lQii#VKipmkxsHlJo|KHPH z4MW6p&ineF@4MdXPv^RG-%oW_b#-msQ`KF4k!mrxQQscNE>K;$UUnkg?MZiA`sJ2f zFPrrtj^6cu2zQYN(j)g;MtXw6)Jm|=N)P&JP;ojvHe>&3HzPguNe|DlW%C|7?ZFce zhnXJzzM_n;_6q0OV&0qTRoD29mmeOc)&g@ZT^YIxyY+RtP0;tt{?l$3@!OPZPF>DJ z#!PF6&#yy#z9g`3<1{mGsBF3Gv_ItIg@ZZHxz)_pc3=uU(jW100fgI6u*|>|tt;*wR1muW#5(E)G*A;wE*GW7U_s z&u{Uw{M)#vI7WGK9C;oulre_D_=6e-8~3W#vE7}*)Xl&;w&>=a!;~}m%(2Dp5yjk# zxYauLS^m#)?7;Y2jBcz(A8W2g9Ew!2`&+0Xds;Fc(u%TaP1&@eY`wP?b1fVwQl ziQ+hB|5^K8U3tH^8T}{s>-3+Iy8krBJLEdjn09bc9mcE7=hH9jW6paul6P14hw?k( zudhqN(h0;lk@^W_lX~Pv zKLBc`>#`)Rfo{ee5q(eK^B^jLcdbGE48jnH=mDUQ*v7rW1%GxUj=*r{7`x67V_g5A z|Bj}&RO2Uwsnwtc$kqgY0@$xQb3QI~-elUnq-9ownw7w{g#Nfb`4qu#u)zI6Eh1D4 zu0Kt={xszJQ^y#e;z-%t2Tci61A&eEbo1FpeZP~yy+^>l7A-^gt;lZ^T~}UUtj&P>0)r*k!GE$@{vhC#X;a~-Kq{4&R6g*%A< zPSdCxKsG6ZeDqpy*6;iPH*?-rk2U>^_}eCjsW{*Tfm>x4^FAdqmES$JHgZila8EqP zK3R)LHfx=lNVKi18JDp`|FhQO3G^pp0oLXZh(_F2& z4{4TdnC2;(XKK#YoTqu6<^s)IHSf{=6UYZyi;?D=GB^)YtGg@Me{Mu12so!ZmGGR=09}(|5Eb- z&97>%r|Vfu&6n$NRyyC+>Hb>to?7RzoRxWH8O~Z?DNqmdr6yKDt?jJF29HTip8qHB zs$=k9e(^w^{>GE>jf1sHK0L^G2@)Xnh+05&qvsB14bW6ouB}OP-I=NGPdcP3^`vEUGUIaQ#HG&9QpJYb=((=5(qE)qWtldm z9@Q4X2s1p{ofWG#o^i9HQqLN0r1b2_)OO3=i0)zI{3fPmo2REHj~+L6tnoRCe#$t- z_~f}M8L8^QkjcsE*(2v=PGr5zj8t=(-VwQ~O~{$B&nfw6WP-6;E^GhF9@B7TrqAP~ z7pnLmQawC}Pc+Uw?Qd$x#EjHbx4J@g13w#pzs?oRO2t6aR7+^X9M!Fvpvl8mo?o%T=kFS$v{nL~g7q6kC5iQ&PbI zYe<6ijXLel*USQrWjSVtOq$CF5y|qD5!T1aMy6*NpF49&j{fEDzQLoj;!^p7%rg&*%?=vpBJ1ocLCo7QR+Q$8#8a->>T$<{Z&XBtE_!pEqka?ELWR4oUdl` zO?$Oe(l~ZrN=`~LfOt{DmQc!k%Q#2+aTm(Km#v zt(mL|guDAG#;Uf{GZdKc-^&;cIuMol%2>0)$Fl<77QxEboOj40VQj}e{AOVNjHLS5 zHr!cb%|IaxR1slI(2UR@rG$SdNaa5kr2K@lt;2ql zc)Zx`lQn{DthXa;>&RLOvfhELc_Hi9$XYbAc8;upBWt+G8WZ^^(X0jGXWl?@-m;#6 zyniff0C+Fqm_Xip>3i zfV;q2Pz;_1FN1f%m*6K5wt)AHKnKtZ#DKA23P=Ol;AU_q@Pcws1zrSif`i~|@Cyj$ zxvcu273d1&Ijs?33P=YF!3wY%l!I-+2VMp5fJ5LUXtolv|_p&F^istGNSu_V=8 zMXDC6rE0}nfNfM;)lS*f#j3r!M0HRdRVUS%v8XPr&3!3rdUsbnSi#$&da7Qkx9X$% zs(z|JW90+XKsAUpzF8-nHtbZfYM2_X;?xK=QjKDr$IG#NeVeaWwD#t&YyJC-V8~8L3&aKRru6N^B~lhmxK*L+p8c=sPuYWU_oe;f#G% zDz|HLrrD)(T$Bw{;3~-L`I-jRcyxX&p>kIHo{Z#}ks2{+ zDPBzJO6C*pXIm1N-kHJoR|1VQySQD-Iel@ryi7)u^{4fESDog0EPuJUv5PmU9l<-04= zRIR|~&*DJaNcjxo$6!Es{StI^jw`Pn@o^Ac0(Fd0kK08D74Q)WGCgx<3Whs^m7lrfN|I!?Y z{O#1Kbqr8T@+Va7jQMm?Ld?5AojNrv>5D;oaZ4P~XRvu{HBJVoW0dmx_@^XX{$VrR zjZJ$DeQn>qA!B|$b!uMYTL!+t{&|f<264x!diQ=3?`MY__=g#eFhk{d_nwe&A%ptj zzv$t(LEI@4?#Dlca}htgjC9^Gq;AYg;*oTQhnnf+EwOVR&q^n|V8$1!;4-CJP89LUDUppYScDN2Y+zmtSa1N>4 zJmv^_RrkG(gFnIjp4~sOssisI?yLAyxOzHV{HKeYy?ghL=|%b^9L}fGR(&&=)o2N~ z?oZ)xHntmv40O(%Srk)5I`7$?Gx#k6CJxv-n3*clnSMH4J8UVxk@%B8h*I;GtC`C-&g-a1e-XMPz|JDp8*y?$+9H|GsQ zE{_>TxMRO348D_al3rHGWlKDrFGOJE%MZF7rXFXr)5$rm}El!qLT zer(notAd^7nf)ARIUJ^zmw^v+jGnon59j9Lln|YFJY0U|tPWJtHaxvziF? z`hD8;7~(yXFIGL1bV|BnC{HQB0vev=Co7Pgv%cVLY&Q%EkG=KC<1u$rZqhHw>!(sb zS+zvhPqQ4Xbh>qYsr%mTv7|F*Jmn_!>tUlE{xn$T2c>>Kw6=wjPAgoxuAjFa`JVQd z7PC^fqi}sZR!3ozzVpoS)XV1gc^E@5szuF9XWM>l^V{CoUv2GgX4*c>wwZRNwi!z> z{ClnNO-(yr+l)aN`#qL_9lu-Kj7J#zleEn^g<-oa{|!vrscptGjQvsCW*ow>ZQ5r1 z!myRL8UHZsnitLUWt_sW{n}>y!mz8g%@~GZ`>g$sns%kO8S60id$rA2hhgVi{@0tf zN860E82jDYW~{}qleEpai($L8&6tc~JGIT2jA1*p&Df7&+qKQwriN|PHe)h|t+dU! ziecC6(dV!C`?bxOi?P32+l;>$woluP;TU$M6+YZ753jZvBQo~qYnyeQ4cnt_#*Yl! zt!>7V3_D5Nj58Uw%L;$Qw4K^!%*fd9&^F^mhHck2<4A^W(>7yGhOI3B5oY+B7tHf# z%*ojA*EVBOhFz^~#;Xjw%Cf&TZLhW&t1|ZIYn$;n!}e&Ku{*uWIeD*=?RLV}eF}e#NCo*dJTu>5QL`19uZd*_?`4{O`Cz_br&TjiSeUTs%uyGq;ch35W}TKm`3+MlOw z*CNw@uC{$Qns%DDYZjY!qPCN6GVOS6+m@Jiw6-g?9i?s8&F20{ZF@bY9ii2A|@XxqNhv~Ak1 zx!tsDcA4pOYP(w7*8WOuSKeXzH!f)b|GauXm%>xxoUd)mOI|HIx0an&%TCfZw+hDQ zs%1xOJ6L{Xu-UEsM(t%r!rHIx<2%js3(@vrZHH?6fVNFv+-+&w{Q4R1{%gCA_Ftmy z3$*Rkc3o}fYrDR-J=$)dZMU`?YCBQec5OSgeX+KqwB26Yk=njQ+Y#FCpzWIH%rohz zZNIj8wa3`1wcT0UK5a*7yHeYH;=|ay+IDC=U)wfqd$iq1+iq<))^?J%n`qmm?WWp} z*7il(wrjhYwr$#GSlZZ*?=a7gN8^mmukB!M@6~pQwkx&GkhZa{vBGQHqwNUurdg$F zJ51XyZC|MEXl*ypwq4tev~AONklj39gtmjVef(K7{UO?}(RQe|{o1x^yIR|gwC&S& zV{Mmc+iIQp+BUC_yb_~rv$tnHO50X@aBACX4^i4SQ_1fQZCmXjLfck*IR1?3GeVcw zVQpLOqgvZmeW}v6RbRZ?w(5(=^3OfAY>AeCZ96Uh+O})ks$a*qo9VIQJFIOpHkL5d zc97R}*{khfZC7eLMB8h$9ja}Qw!^gT*0$1HqPDI0o!YkIkJ7dkzfId#{Ku=z^jq;C z)^<>(d4L1j4%YTwZHH*PO535@_G(-C%-~0Z2WvaR z@~`c~Pn+ov)poVE!?azg?Qm_cvHUYDC7Z|cuk9quzqXy)uA}WJZAWO^rtJ%~UGtQg zp1RuJtL+Q5?bUWYZRcw{$YUf&d9-a>yrO08*A6ai>&uaf(zdRi%2q49vcl{5Yqpu` zv*JIXZJDK$&8O{PZI@^}MB7$4i>qHfJHDz~c1bOJO)cAs$6}A(&s?uf+|snooUUQJ zw9UM(VMo`p?N<0M=Kct4e^=A4dBsdGbI3+`zhz%<+SS@-zS-FC(>C+WhFzj<=9vvU z-?F1j+oNsfrj7k>Z8JA**h$)E&f2i!E!%0@4l8_n)3$4yd2qwOP20?g8}{+NI{!PE zwv~?-kDF)LPimPiqvy`&v&1QUsoj`IP?l|t&0Dt2B1j0!Hs|D&iXAh2+K6$J#*UZ} zn=oQp?3gjrMkFTK16@atA9uzrF=5*9SXaWN2_sBD*ds>D`&DwkWkHT(ZQY;vco*79 z%M_L^ru!4u3dD{X`BW1DTE;m%mb|8g(I`=>}_Xp$){=_eH#1#l=4Z@(e?MJ;$FSyj!A;);wfj8mu|VKsPg8XXYnO`|qdAn%}h2C3Bn-w>8fhmdAB)j&5hU1#Q3P5a-kUlP~3`qjYxOUhB^XeDlIo;ENI)|_pi zo0*O?^SAOW0sH@U{j%nNi?WKsWIlIRC8E`ful#`2SbsXw6|8>B6(jV+W?en$r$+6TgA;+vdK1 zzkdByeg$5Kq#R|AT#jYUlLw~3nlle{6Tj!`?;CV~V(5^%5Au-ifA9BD;4!Q@csZ6e z4lp%x+j@>b+^x-eroggIHqt>_&Y54%|4x48 ztWhcp^xE)A_qCUD-M-fT*3A9p+>RX6`rYnO)`+l~k{&U!S4~e&nU*YXr8%>*Q=Cp? z$GQBaTCaa;e@5Pz(VYH2O&%&?%Uk!6oVxmYc}$^n3=TkN;7 z^0QJm=5%{i+~>Y<#{zjSXmtF`cgu5O_tx_j%5zD*2F89I2ERM#H&zrov-!R-N5223 zxaM|iB;7oQq)oPxKg@9tNwaLZ+LmXuWQ*6fJbNWurEM#}w6oFf z+$A5xUB+9)j@9;XZM$FzGeNt{?|JdhD`7_bSHp7b3?S}vfE~Djlu;&-w90u%dOSeV zyj1ftSoYrnWdCv?@vH(}z@yq;4@>$AfE=$Fh`*WJ z{OHTC7&CUHlRFu>S`W_5UvF|K(L8zs$Uk zU?oMP`zWA;PFl8b*~L0Xi#{>M`a+YJKIS(r0nQ~JgG=!L{KgM9+O_}MwDb?t#i@DQ zzv(|#`+o}mZ)`ZUp{4p_!{H6r)Q(=Aj(^E|BgBzU^-%Qb)9-fZ!2!gw(2FtVrzNeO*U(4ox;H>cX*0S%bWz#&2`ywwarjL&^o}=A) zW!czfYWKmK8)#UndUdOd%U*a(DrTmIJ_QiY;r#+TVw5>uKn}rJY(CS`4ZDqH|cOaG=HQ0 z$LswAwL7nt8=IAnv$enG+I@+R*UGoG+RoAO4AB00b=}x{>u@(|d!6>zNZZHt{_nJX zLfc;L?{OVJpFA?Q2erG5$H?Z_{;l$r`*hiM=>6a8c&D4rYKnH3dt%w%)cg5dm9h2H z@%^g#2h&;c+Ptw@_3&dI?wHn%imjzS>{4wppsc*g`ZvZ<=bJ=C(S# z{@JeVZ=3xe{gtsr>ECD8@69N`x!?M|=|5!J?X>^IZ%y0!JzEfA_SYBd{p+-CzRSb9 zRN9u`Dzc@0VTQNL`!2m--z2K#+NOUsHkVFMTW!0)G{ZO6cDAZ|Nqst?#D9qeQ$MRvt94gyjSxc%|6XLG*@Y^)Lf$3t2tk@M{~C3G|efRlQd7& zoTxcLvrF?B&GDM!G&?m9)*P+bq1mpvspfi`t@uN={aYjR{Eulqtl6)*TC-1cmFBIQ zOEl+e_GrFkcy;=9;k_I`Zl@{y%*-C~tf0WfF z8%~xTWCak{vwT<~&t|zS1qL~L@1HI4uPE#5wH3S#pzS6Z#?BYOQe`(AIg`|WW~d(ETU+?SSYdhwBTXZ5wecl@H|%JD6Z z+~U09f%ono-XQGmE?XXTp4jD$`(|n5dzLQS?%Xx_ouW5Rjc%8_`)%jEm;87A!}H3h zXYMPB-Er&eNu3AW{fpbbc-W4QR~|g^$gfA1lwCP|{g?AU-}gh8%a$+g6c=S{UUq!5 z?eiD+oQykCy#L2vj(mFgqWj+%k-G2YRSk+Zds}?Iab*3}=Jj%xuE?4HO8nTwVTX$E z8!)JE)f3-L99#UwwL@OKcF>)V-aF;gwM8}S?Y@M?N@nz^}UU5`FA{KO3I*5#^3$m z+{U;36!XH{-BMe8me~C1H@}amZg|P^QLRQ*yjc8gjI-#e^o%WG&-Gt%B&PR}9m5uV z@y_a9?|v1t`}f~pPhQ?=!M^fCF_(?G=F_ozcCNnv%U5FV-7|4ePTXrvcRsWw=HRSn zRu34lsqN!$td8k$$xEN@cxF(~qqF>`; zI>Z$IV?bf&uWv5t8go;{`a?TX7LTm{c+$`rH-_)KBw@iVr&cW;vg+i(7K>(d9NyDc zG5F%!-;7>1>cJ}Y`+I{v%1exB_4wh>R}_T|dTIHHVRfEbo74Zp9s_&d(E6=QKJ4}F z==>=Iif-HKoBToHvZ4*!dVQAmM5E#fkHua6w5?mm(TBSC>ob1h=GSL;yyxoB0^h;i zH~o6}rM8cLl{aPbs=>Qlx3rHOcSY*--*35ROZe)W8Xf9>@Uhq5+8g?D(E($GOvXWF zvsm){{Ps_BfG%@9KjNy}GIA8fbBPRGM70Yy_{y&I5oqC?fI@rV89nKz(QbGc9k(0p zf-@Lwlkbta;Z>lXJ>1|f{pok`BYXo`hZf$hwXiMPbQgX`YvJn#nC`;CbY>D(I7w^a zomvaGqoWi*!uz!rKB2X6)4@vJg&$!j5dXr-K+-Jy3pj?m@Nk}v`3Nn1uhzofX)S!; zP}7g_@EGkM{!MG)sZP^fc!$=)?P5)L;diwb{#9$?$YDzDBMriFK+@xauLpOLX5lx+ za16BYQ7{HA966RbUbGz^2*khe=E=Ozh8Erj_M(N4gEeURaLyqhWm*GAO=Tb777)-WoB;Zug%^Vevs}HpH!xuB? zFLglHEX@K_F9|pJ54004JTqUZZfM~}pfy@p))z5(VuYv29lFzscyTDYm@DwlxodhoehevQ;@E5>~yKwz7+7w#2 zuhzmNwHCfcYvEa7G5+0fi*nMB7Itmo6G~{|4>!|iil3(lyIm>Oku<;?cTi{0mGD*{ zVbDG}au4Z8+hO1TVID=?;l=MzAJ887@O$(N=o)zF`?T??3+;fL|BipO9sVsWNbNv->IA8a>IbQHQMkh;U4qmh+$-UPUO_6cGi@I}HJi0$ z(Zbo>XgbisJGfbmMEl@PbAybwTn#7AGj$StFOWXR3rD$wR382va1kg#SHhicFtr2T z0CtEw+&((ZbJxP_*!YRY7V$Vf}E%y+LXW?r!)PkYlO)g4A6= zbUyqWh`b#4)j=v61n?Got zyR7@01*EU@z|U(fYxf>sWBQTxelviSg{&3)q1LjV?{^OoKkl-|udMA`g%&=<8o$y8 zWv$GBtN}d08>9~7N7n!SVm)~xVPRQo*l4rx9@ZKbKeFa@g_d=QuLbqGh8uhY zeGGTu>o*0dkI=$TgS}|sk3c0_c-Cg}2QB;vxC<@39V|u*FRdgW(ZW?=Dw?%$)Nf!7 z#}&?foVtM)ejG%jh2PRz_(!dUn?7Os5$>+F@FWmLSXrZa9gz5iBcG(K(ZW{(H(EGX zYvISV7Jf-<;ZL*{uCtZ(r3ou*Hy;GcDI;0Kx&Ait1$W_}!5*}5lc$2zR(88-g4gO{A=huJ_cj4^qoG)5<6^KI1TG4xe#3_8~Gx$Rbmw_a- z@NVEj%evCP1Bp{OZU_AfS~wZ3LCbp6tHA1R+-Jg1gT-j!rq2bbG_>$YkboB60HV>t zkAo<*@cW=1TKFh9M*PBKcA9>KlfWU|h3A3&k_LF8=xFi;p867NU=xq9?`8TQwD8q? zX@lq__#5Et9&YgCuLdbQS~zkaX+R6#^B#2$|H8Y#QHckxbAWj8Bi#3W$`mbJ3^LHd zd%;w+aKjHwci~7N?shl_L~!jBeh?hPUAXc?+BsVI3s8*~4*Q7nLCc!u6M>ts!cT!j zwD9^*C?~Y=G0+Ds+|D1QI-ptON?i`B(84!`oX=qvV{DL1z6KNB^6&%N1xXwxP6D=GKs?owLwY#j9 zp7NV{Ub1HT4p2!v!ozw?jl7ce z+V=n(ZC}`NL9jZGAK}aEvVJ^Tcsi&?%i8V_0T=#-@0Yde(ZWvvJ6hJS4`Kpd`fyo8 zezMlGmc6W3FV_O$DAuZ%>yE5h|FhPzZoRB`FMfneS=(N;ta0Cvb?rsV`u5Y9FgD_W zA7{OK!$15qYv{{yWi9<{SW7=wjs^d!wX8S)7!Y^Xs8Uz73^w{b7n}v;KGp+Qv@+c* z;a#nDoN)g(rn?i~2gH9h+^($-3$F#$#4mjEV&Xyz_irDpR-ZFWUjSZ?RSoY4^6hHj z3p-Kv_z}K>b@NNm!c)N-wD4?@hn98rBcptD`!$-4cUfsM4udjI!yGxJ1vYIn{Hcj4QB11U!C_z`lkpqKO)4p5_;4XtH7umj^3_ z7S6hYbl^ugXe@02E!+U?K?^qlThYQ%paAWFKLZ_zrv`p`9CecGxbP?*)Uu<6KfIcA zL<^T($FcA)TrZh&L<@HSd(py!K>=Dg17xFxmxE|@KD-vlJ%ey5*nt+#NZ}Z0;akBP zwD1m)hZa5xGSD?}%T((0fN+DIY4k0)3nv0UItgx>PX8%>U-wD2Yng%+;5 zp7KS@H#df4P)2CsZu2P*v;+PINZYT0S1uqg28J6vVj=0nkMJvZlRs$Te}KJc;R{xB z473gI2;vDVoDLjl;g5kG?S~WY;hKRK{sdH@g}(vo(8Ay4lRs$T65 zB%t%*UEnxcxXb<2RkZLJupjM$6M&qfaKuC8$sqa-cs2+{%lAuO1{rAKc@LBCXyGlO z4_esALxyo^;WvS}`@Q7tdfk`8`C1D<2VATYExe_Gd_W67QbqX^R=5iI(ZYv8KDq|Z z-cH*YBKO|GYQZy{16uetFc>Y|;aSQWEqvEO;v|0I4Zx2UJ^`xH!dpM%cxd6! ki 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 literal 0 HcmV?d00001 From 569730a61bfa218dd9bf0fb2257081b2ec1cf89e Mon Sep 17 00:00:00 2001 From: nattthebear Date: Sat, 22 Jul 2017 10:55:17 -0400 Subject: [PATCH 72/93] picodrive: region select. closes #929 --- BizHawk.Client.EmuHawk/MainForm.cs | 9 +- .../Consoles/Sega/PicoDrive/LibPicoDrive.cs | 11 ++- .../Consoles/Sega/PicoDrive/PicoDrive.cs | 85 ++++++++++++++++-- output/dll/picodrive.wbx.gz | Bin 317036 -> 317207 bytes waterbox/picodrive/bizhawk.c | 5 +- 5 files changed, 95 insertions(+), 15 deletions(-) diff --git a/BizHawk.Client.EmuHawk/MainForm.cs b/BizHawk.Client.EmuHawk/MainForm.cs index 611c693e20..13f72ae46f 100644 --- a/BizHawk.Client.EmuHawk/MainForm.cs +++ b/BizHawk.Client.EmuHawk/MainForm.cs @@ -1690,10 +1690,7 @@ namespace BizHawk.Client.EmuHawk switch (system) { case "GEN": - if (!(Emulator is PicoDrive)) // Currently PicoDrive doesn't support anything in this menu - { - GenesisSubMenu.Visible = true; - } + GenesisSubMenu.Visible = true; break; case "TI83": TI83SubMenu.Visible = true; @@ -3355,7 +3352,7 @@ namespace BizHawk.Client.EmuHawk AbortAv(); } - HANDLE_AUTODUMP: + HANDLE_AUTODUMP: if (argParse._autoDumpLength > 0) { argParse._autoDumpLength--; @@ -3544,7 +3541,7 @@ namespace BizHawk.Client.EmuHawk if (result) { - + string loaderName = "*" + OpenAdvancedSerializer.Serialize(ioa); Emulator = loader.LoadedEmulator; Global.Game = loader.Game; diff --git a/BizHawk.Emulation.Cores/Consoles/Sega/PicoDrive/LibPicoDrive.cs b/BizHawk.Emulation.Cores/Consoles/Sega/PicoDrive/LibPicoDrive.cs index 820ce63e14..425e99eb76 100644 --- a/BizHawk.Emulation.Cores/Consoles/Sega/PicoDrive/LibPicoDrive.cs +++ b/BizHawk.Emulation.Cores/Consoles/Sega/PicoDrive/LibPicoDrive.cs @@ -20,6 +20,15 @@ namespace BizHawk.Emulation.Cores.Consoles.Sega.PicoDrive [UnmanagedFunctionPointer(CC)] public delegate void CDReadCallback(int lba, IntPtr dest, bool audio); + public enum Region : int + { + Auto = 0, + JapanNTSC = 1, + JapanPAL = 2, + US = 4, + Europe = 8 + } + ///

    /// /// @@ -28,7 +37,7 @@ namespace BizHawk.Emulation.Cores.Consoles.Sega.PicoDrive /// 32X games will still run, but will not have memory domains /// [BizImport(CC)] - public abstract bool Init(bool cd, bool _32xPreinit); + public abstract bool Init(bool cd, bool _32xPreinit, Region regionAutoOrder, Region regionOverride); [BizImport(CC)] public abstract void SetCDReadCallback(CDReadCallback callback); diff --git a/BizHawk.Emulation.Cores/Consoles/Sega/PicoDrive/PicoDrive.cs b/BizHawk.Emulation.Cores/Consoles/Sega/PicoDrive/PicoDrive.cs index ddca184c04..826e3b1298 100644 --- a/BizHawk.Emulation.Cores/Consoles/Sega/PicoDrive/PicoDrive.cs +++ b/BizHawk.Emulation.Cores/Consoles/Sega/PicoDrive/PicoDrive.cs @@ -8,12 +8,14 @@ using System.Runtime.InteropServices; using System.Text; using System.Threading.Tasks; using System.IO; +using BizHawk.Common; +using System.ComponentModel; namespace BizHawk.Emulation.Cores.Consoles.Sega.PicoDrive { [Core("PicoDrive", "notaz", true, true, "0e352905c7aa80b166933970abbcecfce96ad64e", "https://github.com/notaz/picodrive", false)] - public class PicoDrive : WaterboxCore, IDriveLight, IRegionable + public class PicoDrive : WaterboxCore, IDriveLight, IRegionable, ISettable { private LibPicoDrive _core; private LibPicoDrive.CDReadCallback _cdcallback; @@ -22,15 +24,15 @@ namespace BizHawk.Emulation.Cores.Consoles.Sega.PicoDrive private bool _isPal; [CoreConstructor("GEN")] - public PicoDrive(CoreComm comm, GameInfo game, byte[] rom, bool deterministic) - :this(comm, game, rom, null, deterministic) + public PicoDrive(CoreComm comm, GameInfo game, byte[] rom, bool deterministic, SyncSettings syncSettings) + : this(comm, game, rom, null, deterministic, syncSettings) { } - public PicoDrive(CoreComm comm, GameInfo game, Disc cd, bool deterministic) - :this(comm, game, null, cd, deterministic) + public PicoDrive(CoreComm comm, GameInfo game, Disc cd, bool deterministic, SyncSettings syncSettings) + : this(comm, game, null, cd, deterministic, syncSettings) { } - private PicoDrive(CoreComm comm, GameInfo game, byte[] rom, Disc cd, bool deterministic) + private PicoDrive(CoreComm comm, GameInfo game, byte[] rom, Disc cd, bool deterministic, SyncSettings syncSettings) : base(comm, new Configuration { MaxSamples = 2048, @@ -49,6 +51,8 @@ namespace BizHawk.Emulation.Cores.Consoles.Sega.PicoDrive throw new InvalidOperationException("32X BIOS files are required for deterministic mode"); deterministic |= has32xBios; + _syncSettings = syncSettings ?? new SyncSettings(); + _core = PreInit(new PeRunnerOptions { Filename = "picodrive.wbx", @@ -83,7 +87,12 @@ namespace BizHawk.Emulation.Cores.Consoles.Sega.PicoDrive _exe.AddReadonlyFile(rom, "romfile.md"); } - if (!_core.Init(cd != null, game["32X"])) + var regionAutoOrder = (LibPicoDrive.Region)( + (int)_syncSettings.FirstChoice | + (int)_syncSettings.SecondChoice << 4 | + (int)_syncSettings.ThirdChoice << 8); + + if (!_core.Init(cd != null, game["32X"], regionAutoOrder, _syncSettings.RegionOverride)) throw new InvalidOperationException("Core rejected the file!"); if (cd != null) @@ -174,6 +183,68 @@ namespace BizHawk.Emulation.Cores.Consoles.Sega.PicoDrive _core.SetCDReadCallback(_cdcallback); } + #region ISettable + + public class SyncSettings + { + [DefaultValue(LibPicoDrive.Region.Auto)] + [Description("If set, force the console to this region")] + public LibPicoDrive.Region RegionOverride { get; set; } + + [DefaultValue(LibPicoDrive.Region.Auto)] + [Description("When region is set to automatic, highest priority region to use if the game supports multiple regions")] + public LibPicoDrive.Region FirstChoice { get; set; } + + [DefaultValue(LibPicoDrive.Region.Auto)] + [Description("When region is set to automatic, second highest priority region to use if the game supports multiple regions")] + public LibPicoDrive.Region SecondChoice { get; set; } + + [DefaultValue(LibPicoDrive.Region.Auto)] + [Description("When region is set to automatic, lowest priority region to use if the game supports multiple regions")] + public LibPicoDrive.Region ThirdChoice { get; set; } + + public SyncSettings Clone() + { + return (SyncSettings)MemberwiseClone(); + } + + public static bool NeedsReboot(SyncSettings x, SyncSettings y) + { + return !DeepEquality.DeepEquals(x, y); + } + + public SyncSettings() + { + SettingsUtil.SetDefaultValues(this); + } + } + + private SyncSettings _syncSettings; + + public object GetSettings() + { + return new object(); + } + + public SyncSettings GetSyncSettings() + { + return _syncSettings.Clone(); + } + + public bool PutSettings(object o) + { + return false; + } + + public bool PutSyncSettings(SyncSettings o) + { + var ret = SyncSettings.NeedsReboot(_syncSettings, o); + _syncSettings = o; + return ret; + } + + #endregion + #region IDriveLight public bool DriveLightEnabled { get; private set; } diff --git a/output/dll/picodrive.wbx.gz b/output/dll/picodrive.wbx.gz index d6e2dbd967b5ae7fb0cf740731240a74f020e806..d1426e85ab794bee081a8e797a17fa4e761ced20 100644 GIT binary patch literal 317207 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
    ~|}@Gr^y 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

    -C*8%O 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 z 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 diff --git a/waterbox/picodrive/bizhawk.c b/waterbox/picodrive/bizhawk.c index 187723f14f..35e52d3059 100644 --- a/waterbox/picodrive/bizhawk.c +++ b/waterbox/picodrive/bizhawk.c @@ -138,8 +138,11 @@ static const uint8_t *TryLoadBios(const char *name) return ret; } -ECL_EXPORT int Init(int cd, int _32xPreinit) +ECL_EXPORT int Init(int cd, int _32xPreinit, int regionAutoOrder, int regionOverride) { + PicoAutoRgnOrder = regionAutoOrder; + PicoRegionOverride = regionOverride; + p32x_bios_g = TryLoadBios("32x.g"); p32x_bios_m = TryLoadBios("32x.m"); p32x_bios_s = TryLoadBios("32x.s"); From 0edebe167e232c7246a58d57827ac75262b86bd3 Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Sat, 22 Jul 2017 12:24:56 -0400 Subject: [PATCH 73/93] A7800Hawk: Update game DB --- Assets/gamedb/gamedb_a7800.txt | 56 ++++++++++++++++++---------------- 1 file changed, 29 insertions(+), 27 deletions(-) diff --git a/Assets/gamedb/gamedb_a7800.txt b/Assets/gamedb/gamedb_a7800.txt index e5e7c0ca82..19214c873a 100644 --- a/Assets/gamedb/gamedb_a7800.txt +++ b/Assets/gamedb/gamedb_a7800.txt @@ -2,6 +2,8 @@ ;0 = normal cart (no banking or pokey or RAM) ;1 = Super Game mapper (standard mapper) ;2 = Super Game with extra ROM +;3 = F-18 Hornet Mapper +;4 = Double Dragon and Rampage md5:91041AADD1700A7A4076F4005F2C362F Diagnostics A78 NTSC=true;board=0 md5:89E7B20E7E0C629D00C6CA68949A216F Test Rom A78 NTSC=true;board=0 @@ -11,13 +13,13 @@ md5:0be996d25144966d5541c9eb4919b289 Ace of Aces A78 NTSC=true;board=1 md5:aadde920b3aaba03bc10b40bd0619c94 Ace of Aces A78 PAL=true;board=1 md5:877dcc97a775ed55081864b2dbf5f1e2 Alien Brigade A78 NTSC=true;board=2 md5:de3e9496cb7341f865f27e5a72c7f2f5 Alien Brigade A78 PAL=true;board=2 -md5:0a9e58ef5eb9ff93246e0fff684dc7f1 Arkanoid (0911) A78 NTSC=true;board=0P +md5:0a9e58ef5eb9ff93246e0fff684dc7f1 Arkanoid (0911) A78 NTSC=true;board=0;Pokey=true md5:f9fb84658c5586df159a0c75cc46b54c Asteroids Deluxe A78 NTSC=true;board=0 md5:a65f79ad4a0bbdecd59d5f7eb3623fd7 Asteroids Deluxe A78 NTSC=true;board=0 md5:1baf41de200f26ec643625021290bec2 Asteroids Deluxe A78 PAL=true;board=0 md5:07342c78619ba6ffcc61c10e907e3b50 Asteroids A78 NTSC=true;board=0 -md5:8fc3a695eaea3984912d98ed4a543376 Ballblazer A78 NTSC=true;board=0P -md5:b558814d54904ce0582e2f6a801d03af Ballblazer A78 PAL=true;board=0P +md5:8fc3a695eaea3984912d98ed4a543376 Ballblazer A78 NTSC=true;board=0;Pokey=true +md5:b558814d54904ce0582e2f6a801d03af Ballblazer A78 PAL=true;board=0;Pokey=true md5:42682415906c21c6af80e4198403ffda Barnyard Blaster A78 NTSC=true;board=1 md5:babe2bc2976688bafb8b23c192658126 Barnyard Blaster A78 PAL=true;board=1 md5:f5f6b69c5eb4b55fc163158d1a6b423e Basketbrawl A78 NTSC=true;board=1 @@ -31,8 +33,8 @@ md5:38c056a48472d9a9e16ebda5ed91dae7 Centipede A78 PAL=true;board=0 md5:93e4387864b014c155d7c17877990d1e Choplifter! A78 NTSC=true;board=0 md5:59d4edb0230b5acc918b94f6bc94779f Choplifter! A78 PAL=true;board=0 md5:441ac404cdc7bcbd4d787f911df7bf0d Color Test A78 NTSC=true;board=0 -md5:2e8e28f6ad8b9b9267d518d880c73ebb Commando A78 NTSC=true;board=1P -md5:55da6c6c3974d013f517e725aa60f48e Commando A78 PAL=true;board=1P +md5:2e8e28f6ad8b9b9267d518d880c73ebb Commando A78 NTSC=true;board=1;Pokey=true +md5:55da6c6c3974d013f517e725aa60f48e Commando A78 PAL=true;board=1;Pokey=true md5:db691469128d9a4217ec7e315930b646 Crack'ed A78 NTSC=true;board=1 md5:7cbe78fa06f47ba6516a67a4b003c9ee Crack'ed A78 PAL=true;board=1 md5:0c9b124355d5328697a3b9e0011353f2 Crazy Brix A78 NTSC=true;board=0 @@ -50,10 +52,10 @@ md5:5e332fbfc1e0fc74223d2e73271ce650 Donkey Kong Junior A78 NTSC=true;board=0 md5:4dc5f88243250461bd61053b13777060 Donkey Kong Junior A78 PAL=true;board=0 md5:19f1ee292a23636bd57d408b62de79c7 Donkey Kong A78 NTSC=true;board=0 md5:8e96ef14ce9b5d84bcbc996b66d6d4c7 Donkey Kong A78 PAL=true;board=0 -md5:de2ebafcf0e37aaa9d0e9525a7f4dd62 Double Dragon A78 PAL=true;board=A78AC -md5:543484c00ba233736bcaba2da20eeea9 Double Dragon A78 NTSC=true;board=A78AC -md5:2251a6a0f3aec84cc0aff66fc9fa91e8 F-18 Hornet A78 NTSC=true;board=A78AB -md5:e7709da8e49d3767301947a0a0b9d2e6 F-18 Hornet A78 PAL=true;board=A78AB +md5:de2ebafcf0e37aaa9d0e9525a7f4dd62 Double Dragon A78 PAL=true;board=4 +md5:543484c00ba233736bcaba2da20eeea9 Double Dragon A78 NTSC=true;board=4 +md5:2251a6a0f3aec84cc0aff66fc9fa91e8 F-18 Hornet A78 NTSC=true;board=3 +md5:e7709da8e49d3767301947a0a0b9d2e6 F-18 Hornet A78 PAL=true;board=3 md5:6287727ab36391a62f728bbdee88675c FailSafe A78 NTSC=true;board=0 md5:d2bb22f704f1610a4c396c51f5188e15 FailSafe A78 NTSC=true;board=0 md5:d25d5d19188e9f149977c49eb0367cd1 Fatal Run A78 NTSC=true;board=1 @@ -70,17 +72,17 @@ md5:0baec96787ce17f390e204de1a136e59 Hat Trick A78 PAL=true;board=0 md5:fd9e78e201b6baafddfd3e1fbfe6ba31 Hat Trick A78 NTSC=true;board=0 md5:c3672482ca93f70eafd9134b936c3feb Ikari Warriors A78 NTSC=true;board=1 md5:8c2c2a1ea6e9a928a44c3151ba5c1ce3 Ikari Warriors A78 PAL=true;board=1 -md5:1745feadabb24e7cefc375904c73fa4c Impossible Mission Fixed A78 NTSC=true;board=1R -md5:baebc9246c087e893dfa489632157180 Impossible Mission A78 NTSC=true;board=1R -md5:80dead01ea2db5045f6f4443faa6fce8 Impossible Mission A78 PAL=true;board=1R -md5:045fd12050b7f2b842d5970f2414e912 Jinks A78 NTSC=true;board=1R -md5:dfb86f4d06f05ad00cf418f0a59a24f7 Jinks A78 PAL=true;board=1R +md5:1745feadabb24e7cefc375904c73fa4c Impossible Mission Fixed A78 NTSC=true;board=1;RAM=8 +md5:baebc9246c087e893dfa489632157180 Impossible Mission A78 NTSC=true;board=1;RAM=8 +md5:80dead01ea2db5045f6f4443faa6fce8 Impossible Mission A78 PAL=true;board=1;RAM=8 +md5:045fd12050b7f2b842d5970f2414e912 Jinks A78 NTSC=true;board=1;RAM=8 +md5:dfb86f4d06f05ad00cf418f0a59a24f7 Jinks A78 PAL=true;board=1;RAM=8 md5:f18b3b897a25ab3885b43b4bd141b396 Joust A78 NTSC=true;board=0 md5:f2dae0264a4b4a73762b9d7177e989f6 Joust A78 PAL=true;board=0 -md5:548ba2e54e4fc45ab84ed634d702c136 Jr. Ms. Pac-Man A78 NTSC=true;board=0P -md5:6bc2daeb48e28d103a4298a276e7e551 Jr. Pac-Man (Tunnels) A78 NTSC=true;board=0P -md5:0b3baf47886915dd2eec5da7671bfa63 Jr. Pac-Man A78 NTSC=true;board=1R -md5:8281ab17fa3bfc0a6c497d6a4f350061 Jr. Pac-Man A78 NTSC=true;board=1R +md5:548ba2e54e4fc45ab84ed634d702c136 Jr. Ms. Pac-Man A78 NTSC=true;board=0;Pokey=true +md5:6bc2daeb48e28d103a4298a276e7e551 Jr. Pac-Man (Tunnels) A78 NTSC=true;board=0;Pokey=true +md5:0b3baf47886915dd2eec5da7671bfa63 Jr. Pac-Man A78 NTSC=true;board=1;RAM=8 +md5:8281ab17fa3bfc0a6c497d6a4f350061 Jr. Pac-Man A78 NTSC=true;board=1;RAM=8 md5:17b3b764d33eae9b5260f01df7bb9d2f KLAX A78 NTSC=true;board=1 md5:5e0a1e832bbcea6facb832fde23a440a Karateka A78 PAL=true;board=1 md5:c3a5a8692a423d43d9d28dd5b7d109d9 Karateka A78 NTSC=true;board=0 @@ -116,11 +118,11 @@ md5:1a5207870dec6fae9111cb747e20d8e3 Pete Rose Baseball A78 NTSC=true;board=0 md5:05f43244465943ce819780a71a5b572a Pitfighter A78 NTSC=true;board=1 md5:33aea1e2b6634a1dec8c7006d9afda22 Planet Smashers A78 NTSC=true;board=1 md5:2837a8fd49b7fc7ccd70fd45b69c5099 Planet Smashers A78 PAL=true;board=1 -md5:86546808dc60961cdb1b20e761c50ab1 Plutos A78 NTSC=true;board=1R +md5:86546808dc60961cdb1b20e761c50ab1 Plutos A78 NTSC=true;board=1;RAM=8 md5:584582bb09ee8122e7fc09dc7d1ed813 Pole Position II A78 NTSC=true;board=0 md5:865457e0e0f48253b08f77b9e18f93b2 Pole Position II A78 PAL=true;board=0 md5:66e7230f7ef9d14db82d76b06b241bc0 Q-bert A78 NTSC=true;board=0 -md5:ac03806cef2558fc795a7d5d8dba7bc0 Rampage A78 NTSC=true;board=A78AC +md5:ac03806cef2558fc795a7d5d8dba7bc0 Rampage A78 NTSC=true;board=4 md5:383ed9bd1efb9b6cb3388a777678c928 Realsports Baseball A78 NTSC=true;board=1 md5:8f7eb10ad0bd75474abf0c6c36c08486 Rescue on Fractalus A78 NTSC=true;board=0 md5:43525a0405184875c2ecfd0196886a34 Rip Off A78 NTSC=true;board=0 @@ -134,13 +136,13 @@ md5:1ee26fc6b06b4c9ba74931914b7e719d Scramble A78 PAL=true;board=0 md5:65fe82f419f6583a0f9a736242cb303d Scramble A78 PAL=true;board=0 md5:980c35ae9625773a450aa7ef51751c04 Scrapyard Dog A78 NTSC=true;board=1 md5:53db322c201323fe2ca8f074c0a2bf86 Scrapyard Dog A78 PAL=true;board=1 -md5:b697d9c2d1b9f6cb21041286d1bbfa7f Sentinel A78 NTSC=true;board=1P -md5:5469b4de0608f23a5c4f98f331c9e75f Sentinel A78 PAL=true;board=1P -md5:2d643ac548c40e58c99d0fe433ba4ba0 Sirius A78 NTSC=true;board=1R +md5:b697d9c2d1b9f6cb21041286d1bbfa7f Sentinel A78 NTSC=true;board=1;Pokey=true +md5:5469b4de0608f23a5c4f98f331c9e75f Sentinel A78 PAL=true;board=1;Pokey=true +md5:2d643ac548c40e58c99d0fe433ba4ba0 Sirius A78 NTSC=true;board=1;RAM=8 md5:a84c1b2300fbfbf21b1c02387f613dad Space Duel A78 PAL=true;board=0 md5:771cb4609347657f63e6f0eb26036e35 Space Duel A78 NTSC=true;board=0 md5:6adf79558a3d7f5beca1bb8d34337417 Space Invaders A78 NTSC=true;board=0 -md5:cbb0746192540a13b4c7775c7ce2021f Summer Games A78 NTSC=true;board=1R +md5:cbb0746192540a13b4c7775c7ce2021f Summer Games A78 NTSC=true;board=1;RAM=16 md5:cc18e3b37a507c4217eb6cb1de8c8538 Super Huey UH-IX A78 NTSC=true;board=0 md5:162f9c953f0657689cc74ab20b40280f Super Huey UH-IX A78 PAL=true;board=0 md5:59b5793bece1c80f77b55d60fb39cb94 Super Skateboardin' A78 NTSC=true;board=0 @@ -151,11 +153,11 @@ md5:1af475ff6429a160752b592f0f92b287 Titlematch Pro Wrestling A78 NTSC=true;bo md5:c3903ab01a51222a52197dbfe6538ecf Tomcat F14 A78 NTSC=true;board=0 md5:682338364243b023ecc9d24f0abfc9a7 Tomcat F14 A78 PAL=true;board=0 md5:208ef955fa90a29815eb097bce89bace Touchdown Football A78 NTSC=true;board=1 -md5:8d64763db3100aadc552db5e6868506a Tower Toppler A78 NTSC=true;board=1R -md5:32a37244a9c6cc928dcdf02b45365aa8 Tower Toppler A78 PAL=true;board=1R +md5:8d64763db3100aadc552db5e6868506a Tower Toppler A78 NTSC=true;board=1;RAM=8 +md5:32a37244a9c6cc928dcdf02b45365aa8 Tower Toppler A78 PAL=true;board=1;RAM=8 md5:412cc5bfa08bd03244b9c4e8d46cd0a0 Wasp (Standard Edition) A78 NTSC=true;board=0 md5:427cb05d0a1abb068998e2760d77f4fb Water Ski A78 NTSC=true;board=1 -md5:3799d72f78dda2ee87b0ef8bf7b91186 Winter Games A78 NTSC=true;board=1R +md5:3799d72f78dda2ee87b0ef8bf7b91186 Winter Games A78 NTSC=true;board=1;RAM=16 md5:6813ffff510f930c867b3f0aba78ac85 Worm (0703) A78 NTSC=true;board=0 md5:05fb699db9eef564e2fe45c568746dbc Xenophobe A78 NTSC=true;board=1 md5:70937c3184f0be33d06f7f4382ca54de Xenophobe A78 PAL=true;board=1 From f6b8d2b8e3ed1619d2506cd5d3f5a025e9a52773 Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Sat, 22 Jul 2017 12:26:37 -0400 Subject: [PATCH 74/93] A7800Hawk: More mappers Also Cart RAM and Pokey Detection --- .../Atari/A7800Hawk/Mappers/MapperF18.cs | 107 ++++++++++++++ .../Atari/A7800Hawk/Mappers/MapperRampage.cs | 133 ++++++++++++++++++ .../Atari/A7800Hawk/Mappers/MapperSG.cs | 67 +++++++-- 3 files changed, 295 insertions(+), 12 deletions(-) create mode 100644 BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/Mappers/MapperF18.cs create mode 100644 BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/Mappers/MapperRampage.cs diff --git a/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/Mappers/MapperF18.cs b/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/Mappers/MapperF18.cs new file mode 100644 index 0000000000..fa00abe0a9 --- /dev/null +++ b/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/Mappers/MapperF18.cs @@ -0,0 +1,107 @@ +using BizHawk.Common; +using BizHawk.Common.NumberExtensions; +using System; + +namespace BizHawk.Emulation.Cores.Atari.A7800Hawk +{ + // Mapper only used by F-18 Hornet + public class MapperF18 : MapperBase + { + public byte bank = 0; + + public override byte ReadMemory(ushort addr) + { + if (addr >= 0x1000 && addr < 0x1800) + { + //could be hsbios RAM here + if (Core._hsbios != null) + { + return Core._hsram[addr - 0x1000]; + } + return 0xFF; + } + else if (addr < 0x4000) + { + // could be either RAM mirror or ROM + if (addr >= 0x3000 && Core._hsbios != null) + { + return Core._hsbios[addr - 0x3000]; + } + else + { + return Core.RAM[0x800 + addr & 0x7FF]; + } + } + else + { + // cartridge and other OPSYS + if (addr >= (0x10000 - Core._bios.Length) && !Core.A7800_control_register.Bit(2)) + { + return Core._bios[addr - (0x10000 - Core._bios.Length)]; + } + else + { + if (addr >= 0x8000) + { + // top 32k is fixed + return Core._rom[Core._rom.Length - (0x10000 - addr)]; + } + else + { + // return whichever extra 16k bank is swapped in + int temp_addr = addr - 0x4000; + + return Core._rom[temp_addr + bank * 0x4000]; + } + } + } + } + + public override byte PeekMemory(ushort addr) + { + return ReadMemory(addr); + } + + public override void WriteMemory(ushort addr, byte value) + { + if (addr >= 0x1000 && addr < 0x1800) + { + //could be hsbios RAM here + if (Core._hsbios != null) + { + Core._hsram[addr - 0x1000] = value; + } + } + else if (addr < 0x4000) + { + // could be either RAM mirror or ROM + if (addr >= 0x3000 && Core._hsbios != null) + { + } + else + { + Core.RAM[0x800 + addr & 0x7FF] = value; + } + } + else + { + // cartridge and other OPSYS + if (addr == 0x8000) // might be other addresses, but only 0x8000 is used + { + bank = (byte)(value & 3); + bank -= 1; + } + } + } + + public override void PokeMemory(ushort addr, byte value) + { + WriteMemory(addr, value); + } + + public override void SyncState(Serializer ser) + { + ser.Sync("Bank", ref bank); + } + } +} diff --git a/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/Mappers/MapperRampage.cs b/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/Mappers/MapperRampage.cs new file mode 100644 index 0000000000..bd9d342f33 --- /dev/null +++ b/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/Mappers/MapperRampage.cs @@ -0,0 +1,133 @@ +using BizHawk.Common; +using BizHawk.Common.NumberExtensions; +using System; + +namespace BizHawk.Emulation.Cores.Atari.A7800Hawk +{ + // Mapper only used by Rampage and Double Dragon + public class MapperRampage : MapperBase + { + public byte bank = 0; + + public override byte ReadMemory(ushort addr) + { + if (addr >= 0x1000 && addr < 0x1800) + { + //could be hsbios RAM here + if (Core._hsbios != null) + { + return Core._hsram[addr - 0x1000]; + } + return 0xFF; + } + else if (addr < 0x4000) + { + // could be either RAM mirror or ROM + if (addr >= 0x3000 && Core._hsbios != null) + { + return Core._hsbios[addr - 0x3000]; + } + else + { + return Core.RAM[0x800 + addr & 0x7FF]; + } + } + else + { + // cartridge and other OPSYS + if (addr >= (0x10000 - Core._bios.Length) && !Core.A7800_control_register.Bit(2)) + { + return Core._bios[addr - (0x10000 - Core._bios.Length)]; + } + else + { + /* + $4000 -$5fff second 8kb of bank 6 + $6000 -$7fff first 8kb of bank 6 + $8000 -$9fff second 8kb of bank 7 + $e000 -$ffff first 8kb of bank 7 + + $a000-$dfff Banked + */ + + if (addr >= 0x4000 && addr < 0x6000) + { + int temp_addr = addr - 0x4000; + + return Core._rom[6 * 0x4000 + 0x2000 + temp_addr]; + } + else if (addr >= 0x6000 && addr < 0x8000) + { + int temp_addr = addr - 0x6000; + + return Core._rom[6 * 0x4000 + temp_addr]; + } + else if (addr >= 0x8000 && addr < 0xA000) + { + int temp_addr = addr - 0x8000; + + return Core._rom[7 * 0x4000 + 0x2000 + temp_addr]; + } + else if (addr >= 0xA000 && addr < 0xE000) + { + int temp_addr = addr - 0xA000; + + return Core._rom[bank * 0x4000 + temp_addr]; + } + else + { + int temp_addr = addr - 0xE000; + + return Core._rom[7 * 0x4000 + temp_addr]; + } + } + } + } + + public override byte PeekMemory(ushort addr) + { + return ReadMemory(addr); + } + + public override void WriteMemory(ushort addr, byte value) + { + if (addr >= 0x1000 && addr < 0x1800) + { + //could be hsbios RAM here + if (Core._hsbios != null) + { + Core._hsram[addr - 0x1000] = value; + } + } + else if (addr < 0x4000) + { + // could be either RAM mirror or ROM + if (addr >= 0x3000 && Core._hsbios != null) + { + } + else + { + Core.RAM[0x800 + addr & 0x7FF] = value; + } + } + else + { + // cartridge and other OPSYS + if (addr >= 0xFF80 && addr < 0xFF88) // might be other addresses, but only these are used + { + bank = (byte)(addr & 7); + } + } + } + + public override void PokeMemory(ushort addr, byte value) + { + WriteMemory(addr, value); + } + + public override void SyncState(Serializer ser) + { + ser.Sync("Bank", ref bank); + } + } +} diff --git a/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/Mappers/MapperSG.cs b/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/Mappers/MapperSG.cs index 45e68c1099..7fe0fdb1e3 100644 --- a/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/Mappers/MapperSG.cs +++ b/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/Mappers/MapperSG.cs @@ -8,6 +8,7 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk public class MapperSG : MapperBase { public byte bank = 0; + public byte[] RAM = new byte[0x4000]; public override byte ReadMemory(ushort addr) { @@ -54,25 +55,51 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk } else { - // return bank 6 - int temp_addr = addr - 0x4000; + if (Core.cart_RAM == 0 && !Core.pokey) + { + // return bank 6 + int temp_addr = addr - 0x4000; - if (!Core.small_flag) - { - return Core._rom[temp_addr + 6 * 0x4000]; - } - else - { - if (Core.PAL_Kara) + if (!Core.small_flag) { - return Core._rom[temp_addr + 2 * 0x4000]; + return Core._rom[temp_addr + 6 * 0x4000]; } else { - // Should never get here, but in case we do just return FF - return 0xFF; + if (Core.PAL_Kara) + { + return Core._rom[temp_addr + 2 * 0x4000]; + } + else + { + // Should never get here, but in case we do just return FF + return 0xFF; + } } } + else if (Core.cart_RAM > 0) + { + // return RAM + if (Core.cart_RAM==8 && addr >= 0x6000) + { + return RAM[addr - 0x6000]; + } + else if (Core.cart_RAM==16) + { + return RAM[addr - 0x4000]; + } + else + { + // this would coorespond to reading from 0x4000-0x5FFF with only 8k of RAM + // Let's just return FF for now + return 0xFF; + } + } + else + { + // pokey + return 0xFF; + } } } } @@ -111,6 +138,21 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk { bank = (byte)(value & (Core.small_flag ? 0x3 : 0x7)); } + else if (Core.pokey) + { + + } + else if (Core.cart_RAM > 0) + { + if (Core.cart_RAM==8 && addr >= 0x6000) + { + RAM[addr - 0x6000] = value; + } + else if (Core.cart_RAM==16) + { + RAM[addr - 0x4000] = value; + } + } } } @@ -122,6 +164,7 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk public override void SyncState(Serializer ser) { ser.Sync("Bank", ref bank); + ser.Sync("RAM", ref RAM, false); } } } From 1dc60e92748552f78f79a1f6bebffa28ad1718cd Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Sat, 22 Jul 2017 12:28:23 -0400 Subject: [PATCH 75/93] Atari7800Hawk: More mappers and bug fixes -Adds support for F18 and rampage -Adds support for games needing cart RAM -Fixes various bugs --- .../Atari/A7800Hawk/A7800Hawk.IEmulator.cs | 30 ++++++++++++++- .../Atari/A7800Hawk/A7800Hawk.IStatable.cs | 8 +++- .../Consoles/Atari/A7800Hawk/A7800Hawk.cs | 38 +++++++++++++++++++ .../Consoles/Atari/A7800Hawk/Maria.cs | 31 +++++++-------- 4 files changed, 89 insertions(+), 18 deletions(-) diff --git a/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/A7800Hawk.IEmulator.cs b/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/A7800Hawk.IEmulator.cs index 06ea64f01f..2feb31cb69 100644 --- a/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/A7800Hawk.IEmulator.cs +++ b/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/A7800Hawk.IEmulator.cs @@ -27,6 +27,10 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk public byte p1_fire_2x; public byte p2_fire_2x; public byte con_state; + public bool left_toggle; + public bool right_toggle; + public bool left_was_pressed; + public bool right_was_pressed; // there are 4 maria cycles in a CPU cycle (fast access, both NTSC and PAL) // if the 6532 or TIA are accessed (PC goes to one of those addresses) the next access will be slower by 1/2 a CPU cycle @@ -171,12 +175,34 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk if (controller.IsPressed("Right Difficulty")) { - result |= (1 << 7); + if (!right_was_pressed) + { + right_toggle = !right_toggle; + } + right_was_pressed = true; + result |= (byte)((right_toggle ? 1 : 0) << 7); } + else + { + right_was_pressed = false; + result |= (byte)((right_toggle ? 1 : 0) << 7); + } + if (controller.IsPressed("Left Difficulty")) { - result |= (1 << 6); + if (!left_was_pressed) + { + left_toggle = !left_toggle; + } + left_was_pressed = true; + result |= (byte)((left_toggle ? 1 : 0) << 6); } + else + { + left_was_pressed = false; + result |= (byte)((left_toggle ? 1 : 0) << 6); + } + if (!controller.IsPressed("Pause")) { result |= (1 << 3); diff --git a/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/A7800Hawk.IStatable.cs b/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/A7800Hawk.IStatable.cs index 55b92185c4..deabc35700 100644 --- a/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/A7800Hawk.IStatable.cs +++ b/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/A7800Hawk.IStatable.cs @@ -79,8 +79,14 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk ser.Sync("slow_access", ref slow_access); ser.Sync("small flag", ref small_flag); ser.Sync("pal kara", ref PAL_Kara); + ser.Sync("Cart RAM", ref cart_RAM); + ser.Sync("pokey", ref pokey); + ser.Sync("left_toggle", ref left_toggle); + ser.Sync("right_toggle", ref right_toggle); + ser.Sync("left_was_pressed", ref left_was_pressed); + ser.Sync("right_was_pressed", ref right_was_pressed); - ser.EndSection(); + ser.EndSection(); } } } diff --git a/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/A7800Hawk.cs b/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/A7800Hawk.cs index 0996293d93..c4b2d4dc69 100644 --- a/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/A7800Hawk.cs +++ b/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/A7800Hawk.cs @@ -39,6 +39,8 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk public MapperBase mapper; public bool small_flag = false; public bool PAL_Kara = false; + public int cart_RAM = 0; + public bool pokey = false; private readonly ITraceable _tracer; @@ -117,7 +119,35 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk s_mapper = dict["board"]; } else + { throw new Exception("No Board selected for this game"); + } + + // check if the game uses pokey or RAM + if (dict.ContainsKey("RAM")) + { + int.TryParse(dict["RAM"], out cart_RAM); + Console.WriteLine(cart_RAM); + } + + if (dict.ContainsKey("Pokey")) + { + bool.TryParse(dict["Pokey"], out pokey); + } + + // some games will not function with the high score bios + // if such a game is being played, tell the user and disable it + if (dict.ContainsKey("No_HS")) + { + bool no_hs; + bool.TryParse(dict["No_HS"], out no_hs); + + if (no_hs) + { + Console.WriteLine("This game is incompatible with the High Score BIOS, disabling it"); + highscoreBios = null; + } + } } else if (is_header) { @@ -244,6 +274,14 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk { mapper = new MapperSGE(); } + if (m == "3") + { + mapper = new MapperF18(); + } + if (m == "4") + { + mapper = new MapperRampage(); + } mapper.Core = this; } diff --git a/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/Maria.cs b/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/Maria.cs index 50f9a71d8c..4de4f084e6 100644 --- a/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/Maria.cs +++ b/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/Maria.cs @@ -85,6 +85,7 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk public bool current_DLL_H8; public bool overrun_dma; + public bool global_write_mode; public int header_counter; public int[] header_counter_max = new int [2]; @@ -96,7 +97,7 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk public void RunFrame() { scanline = 0; - + global_write_mode = false; Core.Maria_regs[8] = 0x80; // indicates VBlank state // we start off in VBlank for 20 scanlines @@ -324,7 +325,7 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk { // we are in 5 Byte header mode (i.e. using the character map) GFX_Objects[GFX_index, header_counter].write_mode = temp.Bit(7); - + global_write_mode = temp.Bit(7); GFX_Objects[GFX_index, header_counter].ind_mode = temp.Bit(5); header_pointer++; temp = (byte)(ReadMemory((ushort)(current_DLL_addr + header_pointer))); @@ -372,7 +373,7 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk DMA_phase_next = DMA_GRAPHICS; - GFX_Objects[GFX_index, header_counter].write_mode = false; + GFX_Objects[GFX_index, header_counter].write_mode = global_write_mode; GFX_Objects[GFX_index, header_counter].ind_mode = false; @@ -461,7 +462,7 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk if (((current_DLL_H16 && addr_t.Bit(12)) || (current_DLL_H8 && addr_t.Bit(11))) && (addr_t >= 0x8000)) { - GFX_Objects[GFX_index, header_counter].obj[i] = 0; + GFX_Objects[GFX_index, header_counter].obj[i] = 0; graphics_read_time -= 3; } else @@ -552,7 +553,7 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk if (disp_mode == 0) { local_width = GFX_Objects[local_GFX_index, i].width; - + for (int j = 0; j < local_width; j++) { for (int k = 3; k >= 0; k--) @@ -593,7 +594,7 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk else if (disp_mode == 2) // note: 1 is not used { local_width = GFX_Objects[local_GFX_index, i].width; - + for (int j = 0; j < local_width; j++) { for (int k = 7; k >= 0; k--) @@ -643,12 +644,12 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk else { local_width = GFX_Objects[local_GFX_index, i].width; - + for (int j = 0; j < local_width; j++) { - for (int k = 7; k >= 0; k--) + for (int k = 3; k >= 0; k--) { - index = local_start * 2 + j * 8 + (7 - k); + index = local_start * 2 + j * 4 + (3 - k); if (index > 511) { @@ -661,18 +662,18 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk int temp_color = color; // this is now the color index (0-3) we choose from the palette - if (k >= 6) + if (k >= 3) { color = ((color >> 7) & 0x1); temp_color = (local_palette & 4) + ((temp_color >> 2) & 3); } - else if (k >= 4) + else if (k >= 2) { color = ((color >> 6) & 0x1); temp_color = (local_palette & 4) + ((temp_color >> 2) & 3); } - else if (k >= 2) + else if (k >= 1) { color = ((color >> 5) & 0x1); temp_color = (local_palette & 4) + (temp_color & 3); @@ -685,7 +686,7 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk if (color != 0) // transparent { - color = (temp_color << 2) + color; + color = (temp_color << 2) + 2; color = Core.Maria_regs[color]; @@ -701,7 +702,7 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk if (disp_mode == 0) { local_width = GFX_Objects[local_GFX_index, i].width; - + for (int j = 0; j < local_width; j++) { for (int k = 7; k >= 0; k--) @@ -752,7 +753,7 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk // here the palette is determined by palette bit 2 only // hence only palette 0 or 4 is available local_palette = GFX_Objects[local_GFX_index, i].palette & 0x4; - + int temp_c0 = GFX_Objects[local_GFX_index, i].palette & 0x1; int temp_c1 = GFX_Objects[local_GFX_index, i].palette & 0x2; From 0d6d8285a56caafe2e12dcb11c98e8c4fe7d0911 Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Sat, 22 Jul 2017 12:29:19 -0400 Subject: [PATCH 76/93] Update BizHawk.Emulation.Cores.csproj --- BizHawk.Emulation.Cores/BizHawk.Emulation.Cores.csproj | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/BizHawk.Emulation.Cores/BizHawk.Emulation.Cores.csproj b/BizHawk.Emulation.Cores/BizHawk.Emulation.Cores.csproj index 065cba0972..4b76b90896 100644 --- a/BizHawk.Emulation.Cores/BizHawk.Emulation.Cores.csproj +++ b/BizHawk.Emulation.Cores/BizHawk.Emulation.Cores.csproj @@ -359,6 +359,8 @@ + + A7800Hawk.cs @@ -1331,4 +1333,4 @@ --> - \ No newline at end of file + From 39254cb0d2dab48c8186ae66344f5bddbd60fc3a Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Sat, 22 Jul 2017 13:37:40 -0400 Subject: [PATCH 77/93] A7800Hawk: Fix sound --- .../Consoles/Atari/A7800Hawk/TIA_Sound/TIA.cs | 4 +++- .../Atari/A7800Hawk/TIA_Sound/Tia.ISoundProvider.cs | 6 ++---- .../Consoles/Atari/A7800Hawk/TIA_Sound/Tia.SyncState.cs | 1 + 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/TIA_Sound/TIA.cs b/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/TIA_Sound/TIA.cs index 1b95a00306..01b4f6aa3c 100644 --- a/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/TIA_Sound/TIA.cs +++ b/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/TIA_Sound/TIA.cs @@ -14,6 +14,8 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk private bool _doTicks; + private int _spf; + public int _hsyncCnt; private int _capChargeStart; private bool _capCharging; @@ -31,7 +33,7 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk _capChargeStart = 0; _capCharging = false; AudioClocks = 0; - + _spf = (Core.maria._frameHz > 55) ? 740 : 880; _doTicks = false; } diff --git a/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/TIA_Sound/Tia.ISoundProvider.cs b/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/TIA_Sound/Tia.ISoundProvider.cs index 783c5acbf2..0cdba141aa 100644 --- a/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/TIA_Sound/Tia.ISoundProvider.cs +++ b/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/TIA_Sound/Tia.ISoundProvider.cs @@ -19,8 +19,8 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk public void GetSamplesSync(out short[] samples, out int nsamp) { - short[] ret = new short[AudioClocks * 2]; - nsamp = AudioClocks; + short[] ret = new short[_spf * 2]; + nsamp = _spf; GetSamples(ret); samples = ret; } @@ -35,8 +35,6 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk AudioClocks = 0; } - private readonly int _spf; - // Exposing this as GetSamplesAsync would allow this to provide async sound // However, it does nothing special for async sound so I don't see a point private void GetSamples(short[] samples) diff --git a/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/TIA_Sound/Tia.SyncState.cs b/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/TIA_Sound/Tia.SyncState.cs index 89a2c50cfd..58fa1b875a 100644 --- a/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/TIA_Sound/Tia.SyncState.cs +++ b/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/TIA_Sound/Tia.SyncState.cs @@ -14,6 +14,7 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk ser.Sync("Bus_State", ref BusState); ser.Sync("Ticks", ref _doTicks); + ser.Sync("_spf", ref _spf); // some of these things weren't in the state because they weren't needed if // states were always taken at frame boundaries From da8856081525a41e09f7f590474370f527a75531 Mon Sep 17 00:00:00 2001 From: nattthebear Date: Sat, 22 Jul 2017 14:22:25 -0400 Subject: [PATCH 78/93] sameboy: Fix some sgb audio issues in donkey kongs. Two problems: One, due to the HLE startup, DK starts writing audio data too early and sticks the SPC in a bad state. Two, the full transfer format for SOU_TRN doesn't seem to be documented anywhere; it's acutally a 0-terminated list of regions to upload; not just a single region. --- output/dll/sameboy.wbx.gz | Bin 58625 -> 58989 bytes waterbox/sameboy/sgb.c | 74 ++++++++++++++++++++++++++++---------- 2 files changed, 56 insertions(+), 18 deletions(-) diff --git a/output/dll/sameboy.wbx.gz b/output/dll/sameboy.wbx.gz index 400fff95a3f2a05000846d0c1406de173fff44f4..10f48206a4cffba1fef9bea56731ac11982b4b3f 100644 GIT binary patch literal 58989 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 literal 58625 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 0xffc) + while (1) { - utils_log("TRN_SOUND src overflow\n"); - return; + if (data + 4 > dataend) + { + utils_log("TRN_SOUND header overflow\n"); + break; + } + int len = data[0] | data[1] << 8; + int addr = data[2] | data[3] << 8; + if (!len) + { + utils_log("TRN_SOUND END %04x\n", addr); + break; + } + data += 4; + if (data + len > dataend) + { + utils_log("TRN_SOUND src overflow\n"); + break; + } + if (addr + len >= 0x10000) + { + utils_log("TRN_SOUND dst overflow\n"); + return; + } + utils_log("TRN_SOUND addr %04x len %04x\n", addr, len); + memcpy(dst + addr, data, len); + data += len; } - if (len + addr >= 0x10000) - { - utils_log("TRN_SOUND dst overflow\n"); - return; - } - memcpy(dst + addr, data + 4, len); } static void trn_pal(const uint8_t *data) @@ -973,19 +999,31 @@ void sgb_render_audio(uint64_t time, void (*callback)(int16_t l, int16_t r, uint uint32_t new_remainder = diff % refclocks_per_spc_sample; spc_set_output(sgb.spc, sound_buffer, sizeof(sound_buffer) / sizeof(sound_buffer[0])); - int p; - for (p = 0; p < 4; p++) + int matched = 1; + for (int p = 0; p < 4; p++) { if (spc_read_port(sgb.spc, 0, p) != sgb.sound_control[p]) - break; + matched = 0; } - if (p == 4) // recived + if (matched) // recived { sgb.sound_control[0] = 0; sgb.sound_control[1] = 0; sgb.sound_control[2] = 0; } - for (p = 0; p < 4; p++) + else + { + utils_log("SPC: %02x %02x %02x %02x => %02x %02x %02x %02x\n", + spc_read_port(sgb.spc, 0, 0), + spc_read_port(sgb.spc, 0, 1), + spc_read_port(sgb.spc, 0, 2), + spc_read_port(sgb.spc, 0, 3), + sgb.sound_control[0], + sgb.sound_control[1], + sgb.sound_control[2], + sgb.sound_control[3]); + } + for (int p = 0; p < 4; p++) { spc_write_port(sgb.spc, 0, p, sgb.sound_control[p]); } From 1033995ed6e4deff3a2ab97924c4d52327fc4d6a Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Sat, 22 Jul 2017 14:49:08 -0400 Subject: [PATCH 79/93] Update Maria.cs -Fixes Xenophobe --- BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/Maria.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/Maria.cs b/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/Maria.cs index 4de4f084e6..216af94a6d 100644 --- a/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/Maria.cs +++ b/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/Maria.cs @@ -126,7 +126,7 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk for (int i=0; i<454;i++) { - if(i==0 && Core.Maria_regs[0x1C].Bit(6) && !Core.Maria_regs[0x1C].Bit(5)) + if(i==28 && Core.Maria_regs[0x1C].Bit(6) && !Core.Maria_regs[0x1C].Bit(5)) { Core.cpu_halt_pending = true; DMA_phase = DMA_START_UP; From f6cc4c17494d84398bc7659cc57a33964b5ab5d0 Mon Sep 17 00:00:00 2001 From: nattthebear Date: Sat, 22 Jul 2017 17:07:27 -0400 Subject: [PATCH 80/93] stuff --- BizHawk.Emulation.Cores/Consoles/Sega/gpgx64/GPGX.IEmulator.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/BizHawk.Emulation.Cores/Consoles/Sega/gpgx64/GPGX.IEmulator.cs b/BizHawk.Emulation.Cores/Consoles/Sega/gpgx64/GPGX.IEmulator.cs index 5e3cefb72b..e0a3ac20b1 100644 --- a/BizHawk.Emulation.Cores/Consoles/Sega/gpgx64/GPGX.IEmulator.cs +++ b/BizHawk.Emulation.Cores/Consoles/Sega/gpgx64/GPGX.IEmulator.cs @@ -26,6 +26,9 @@ namespace BizHawk.Emulation.Cores.Consoles.Sega.gpgx if (next && !_nextDiskPressed) newDisk++; + _prevDiskPressed = prev; + _nextDiskPressed = next; + if (newDisk < -1) newDisk = -1; if (newDisk >= _cds.Length) From 3062b1846779354eb3ed59e6411fa5b52869ade2 Mon Sep 17 00:00:00 2001 From: nattthebear Date: Sat, 22 Jul 2017 17:37:40 -0400 Subject: [PATCH 81/93] gpgx: disable prev and next disk for now --- BizHawk.Emulation.Cores/Consoles/Sega/gpgx64/GPGX.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BizHawk.Emulation.Cores/Consoles/Sega/gpgx64/GPGX.cs b/BizHawk.Emulation.Cores/Consoles/Sega/gpgx64/GPGX.cs index 417e0a5bcb..fafb34dde3 100644 --- a/BizHawk.Emulation.Cores/Consoles/Sega/gpgx64/GPGX.cs +++ b/BizHawk.Emulation.Cores/Consoles/Sega/gpgx64/GPGX.cs @@ -376,7 +376,7 @@ namespace BizHawk.Emulation.Cores.Consoles.Sega.gpgx if (!Core.gpgx_get_control(input, inputsize)) throw new Exception("gpgx_get_control() failed"); - ControlConverter = new GPGXControlConverter(input, _cds != null); + ControlConverter = new GPGXControlConverter(input, false); // _cds != null); ControllerDefinition = ControlConverter.ControllerDef; } From 8ea7993e04b2e357f8ad92a9e2bc0e06b0399fc0 Mon Sep 17 00:00:00 2001 From: adelikat Date: Sat, 22 Jul 2017 16:39:12 -0500 Subject: [PATCH 82/93] Multidisk bundler - Remove GEN as an option for now --- .../tools/MultiDiskBundler/MultiDiskBundler.Designer.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/BizHawk.Client.EmuHawk/tools/MultiDiskBundler/MultiDiskBundler.Designer.cs b/BizHawk.Client.EmuHawk/tools/MultiDiskBundler/MultiDiskBundler.Designer.cs index e159fc03ca..3c1e2f2e9e 100644 --- a/BizHawk.Client.EmuHawk/tools/MultiDiskBundler/MultiDiskBundler.Designer.cs +++ b/BizHawk.Client.EmuHawk/tools/MultiDiskBundler/MultiDiskBundler.Designer.cs @@ -141,7 +141,6 @@ "AppleII", "C64", "GB", - "GEN", "PCFX", "PSX", "SAT"}); From b696aaea4cac63865b234349a6e97d61184e4a33 Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Sat, 22 Jul 2017 21:31:58 -0400 Subject: [PATCH 83/93] A7800Hawk: Fix controllers --- .../Consoles/Atari/A7800Hawk/TIA_Sound/TIA.cs | 36 +++++++++++++++---- 1 file changed, 30 insertions(+), 6 deletions(-) diff --git a/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/TIA_Sound/TIA.cs b/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/TIA_Sound/TIA.cs index 01b4f6aa3c..1a9b012e4b 100644 --- a/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/TIA_Sound/TIA.cs +++ b/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/TIA_Sound/TIA.cs @@ -98,7 +98,7 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk //INPT0-3 are used to read 2 button joysticks as well for the A7800 if (maskedAddr == 0x08) // INPT0 { - if (Core.m6532._outputB == 0 && (Core.m6532._ddRb & 0x10)==0x10) + if ((Core.m6532._outputB & 0x04) == 0 && (Core.m6532._ddRb & 0x04) == 0x04) { Core._islag = false; return (byte)(Core.p1_fire_2x & 0x80); @@ -111,7 +111,7 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk if (maskedAddr == 0x09) // INPT1 { - if (Core.m6532._outputB == 0 && (Core.m6532._ddRb & 0x10) == 0x10) + if ((Core.m6532._outputB & 0x04) == 0 && (Core.m6532._ddRb & 0x04) == 0x04) { Core._islag = false; return (byte)((Core.p1_fire_2x & 0x40)<<1); @@ -124,7 +124,7 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk if (maskedAddr == 0x0A) // INPT2 { - if (Core.m6532._outputB == 0 && (Core.m6532._ddRb & 0x04) == 0x04) + if ((Core.m6532._outputB & 0x10) == 0 && (Core.m6532._ddRb & 0x10) == 0x10) { Core._islag = false; return (byte)(Core.p2_fire_2x & 0x80); @@ -137,7 +137,7 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk if (maskedAddr == 0x0B) // INPT3 { - if (Core.m6532._outputB == 0 && (Core.m6532._ddRb & 0x04) == 0x04) + if ((Core.m6532._outputB & 0x10) == 0 && (Core.m6532._ddRb & 0x10) == 0x10) { Core._islag = false; return (byte)((Core.p2_fire_2x & 0x40)<<1); @@ -151,13 +151,37 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk if (maskedAddr == 0x0C) // INPT4 { Core._islag = false; - return Core.p1_fire; + + if (!Core.p1_is_2button) + { + return Core.p1_fire; + } + else if ((Core.m6532._outputB & 0x04) != 0 || (Core.m6532._ddRb & 0x04) != 0x04) + { + return Core.p1_fire; + } + else + { + return 0x80; + } } if (maskedAddr == 0x0D) // INPT5 { Core._islag = false; - return Core.p2_fire; + + if (!Core.p2_is_2button) + { + return Core.p2_fire; + } + else if ((Core.m6532._outputB & 0x10) != 0 || (Core.m6532._ddRb & 0x10) != 0x10) + { + return Core.p2_fire; + } + else + { + return 0x80; + } } return 0; From 133d92cb6e2b3d038074da01fea744b926e750f4 Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Sat, 22 Jul 2017 21:33:21 -0400 Subject: [PATCH 84/93] Atari7800Hawk: Fix Controller detection --- .../Atari/A7800Hawk/A7800Hawk.IEmulator.cs | 4 +++ .../A7800Hawk/A7800HawkControllerDeck.cs | 10 +++++++ .../Atari/A7800Hawk/A7800HawkControllers.cs | 28 ++++++++++++++++--- .../Consoles/Atari/A7800Hawk/Maria.cs | 6 ++-- 4 files changed, 41 insertions(+), 7 deletions(-) diff --git a/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/A7800Hawk.IEmulator.cs b/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/A7800Hawk.IEmulator.cs index 2feb31cb69..50e6f2783c 100644 --- a/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/A7800Hawk.IEmulator.cs +++ b/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/A7800Hawk.IEmulator.cs @@ -31,6 +31,8 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk public bool right_toggle; public bool left_was_pressed; public bool right_was_pressed; + public bool p1_is_2button; + public bool p2_is_2button; // there are 4 maria cycles in a CPU cycle (fast access, both NTSC and PAL) // if the 6532 or TIA are accessed (PC goes to one of those addresses) the next access will be slower by 1/2 a CPU cycle @@ -167,6 +169,8 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk p2_fire = _controllerDeck.ReadFire2(controller); p1_fire_2x = _controllerDeck.ReadFire1_2x(controller); p2_fire_2x = _controllerDeck.ReadFire2_2x(controller); + p1_is_2button = _controllerDeck.Is_2_button1(controller); + p2_is_2button = _controllerDeck.Is_2_button2(controller); } public void GetConsoleState(IController controller) diff --git a/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/A7800HawkControllerDeck.cs b/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/A7800HawkControllerDeck.cs index a0e21053c1..3698015579 100644 --- a/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/A7800HawkControllerDeck.cs +++ b/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/A7800HawkControllerDeck.cs @@ -80,6 +80,16 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk return Port2.ReadFire2x(c); } + public bool Is_2_button1(IController c) + { + return Port1.Is_2_button(c); + } + + public bool Is_2_button2(IController c) + { + return Port2.Is_2_button(c); + } + public ControllerDefinition Definition { get; } public void SyncState(Serializer ser) diff --git a/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/A7800HawkControllers.cs b/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/A7800HawkControllers.cs index 93b79d2246..cdf1040ffc 100644 --- a/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/A7800HawkControllers.cs +++ b/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/A7800HawkControllers.cs @@ -9,7 +9,7 @@ using BizHawk.Emulation.Common; namespace BizHawk.Emulation.Cores.Atari.A7800Hawk { ///

    - /// Represents a controller plugged into a controller port on the intellivision + /// Represents a controller plugged into a controller port on the A7800 /// public interface IPort { @@ -19,6 +19,8 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk byte ReadFire2x(IController c); + bool Is_2_button(IController c); + ControllerDefinition Definition { get; } void SyncState(Serializer ser); @@ -53,6 +55,11 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk return 0; } + public bool Is_2_button(IController c) + { + return false; + } + public ControllerDefinition Definition { get; } public void SyncState(Serializer ser) @@ -113,8 +120,12 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk return 0; // only applicable for 2 button mode } - public ControllerDefinition Definition { get; } + public bool Is_2_button(IController c) + { + return false; + } + public ControllerDefinition Definition { get; } public void SyncState(Serializer ser) { @@ -172,7 +183,12 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk public byte ReadFire(IController c) { - return 0x80; + byte result = 0x80; + if (c.IsPressed(Definition.BoolButtons[4]) || c.IsPressed(Definition.BoolButtons[5])) + { + result = 0x00; // zero means fire is pressed + } + return result; } public byte ReadFire2x(IController c) @@ -189,8 +205,12 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk return result; } - public ControllerDefinition Definition { get; } + public bool Is_2_button(IController c) + { + return true; + } + public ControllerDefinition Definition { get; } public void SyncState(Serializer ser) { diff --git a/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/Maria.cs b/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/Maria.cs index 216af94a6d..377424577f 100644 --- a/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/Maria.cs +++ b/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/Maria.cs @@ -219,7 +219,7 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk if (cycle == 453 && !sl_DMA_complete && do_dma && (DMA_phase == DMA_GRAPHICS || DMA_phase == DMA_HEADER)) { overrun_dma = true; - Console.WriteLine(scanline); + //Console.WriteLine(scanline); if (current_DLL_offset == 0) { DMA_phase = DMA_SHUTDOWN_LAST; @@ -402,13 +402,13 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk if (Core.Maria_regs[0x1C].Bit(4)) { - graphics_read_time = 9 * GFX_Objects[GFX_index, header_counter].width + 3; + graphics_read_time = 9 * GFX_Objects[GFX_index, header_counter].width; ch_size = 2; GFX_Objects[GFX_index, header_counter].width *= 2; } else { - graphics_read_time = 6 * GFX_Objects[GFX_index, header_counter].width + 3; + graphics_read_time = 6 * GFX_Objects[GFX_index, header_counter].width; ch_size = 1; } From 759a4536a45a3629cb4153d1f091dd02c35dabc0 Mon Sep 17 00:00:00 2001 From: zeromus Date: Sat, 22 Jul 2017 23:39:27 -0500 Subject: [PATCH 85/93] fix (maybe) the bad GC bug in luainterface? --- LuaInterface/Lua/src/LuaDLL.cpp | 12 ++++++++++++ LuaInterface/LuaInterface/Lua.cs | 2 +- LuaInterface/LuaInterface/ObjectTranslator.cs | 7 +++++++ 3 files changed, 20 insertions(+), 1 deletion(-) diff --git a/LuaInterface/Lua/src/LuaDLL.cpp b/LuaInterface/Lua/src/LuaDLL.cpp index d191a1444a..67ac0c4e21 100644 --- a/LuaInterface/Lua/src/LuaDLL.cpp +++ b/LuaInterface/Lua/src/LuaDLL.cpp @@ -618,6 +618,18 @@ namespace Lua511 static void lua_atunlock(IntPtr luaState, LuaCSFunction^ unlockf); #endif + //zero 22-jul-2017 + static int lua_pushthread(IntPtr luaState) + { + return ::lua_pushthread(((lua_State *)luaState.ToPointer())); + } + + static void lua_xmove(IntPtr from, IntPtr to, int n) + { + ::lua_xmove(((lua_State *)from.ToPointer()), ((lua_State *)to.ToPointer()),n); + } + + static void lua_pushnumber(IntPtr luaState, double number) { ::lua_pushnumber(toState, number); diff --git a/LuaInterface/LuaInterface/Lua.cs b/LuaInterface/LuaInterface/Lua.cs index bf4dc94404..5e9bb9065c 100644 --- a/LuaInterface/LuaInterface/Lua.cs +++ b/LuaInterface/LuaInterface/Lua.cs @@ -68,7 +68,7 @@ namespace NLua "-- Preload the mscorlib assembly \n"+ "luanet.load_assembly(\"mscorlib\") \n"; - /*readonly */ IntPtr luaState; + /*readonly */ public IntPtr luaState; //zero 22-jul-2017 - made public ObjectTranslator translator; LuaCSFunction panicCallback, lockCallback, unlockCallback; diff --git a/LuaInterface/LuaInterface/ObjectTranslator.cs b/LuaInterface/LuaInterface/ObjectTranslator.cs index 5235c1412b..bfe99fc5d8 100644 --- a/LuaInterface/LuaInterface/ObjectTranslator.cs +++ b/LuaInterface/LuaInterface/ObjectTranslator.cs @@ -803,6 +803,13 @@ namespace NLua { ((LuaFunction)o).push(luaState); } + //zero 22-jul-2017 + else if (o is Lua) + { + var lua = o as Lua; + LuaDLL.lua_pushnil(lua.luaState); + LuaDLL.lua_xmove(lua.luaState, luaState, 1); + } else { pushObject(luaState,o,"luaNet_metatable"); From abcf627e243da98b0b77dbbfa71cd8a8af207237 Mon Sep 17 00:00:00 2001 From: zeromus Date: Sat, 22 Jul 2017 23:40:15 -0500 Subject: [PATCH 86/93] updated lua dlls with fixes (maybe) to GC bug --- output/dll/LuaInterface.dll | Bin 60928 -> 60928 bytes output/dll/lua51.dll | Bin 275968 -> 275968 bytes output/dll/nlua/KopiLua.dll | Bin 208896 -> 208896 bytes output/dll/nlua/NLua.dll | Bin 100864 -> 101376 bytes 4 files changed, 0 insertions(+), 0 deletions(-) diff --git a/output/dll/LuaInterface.dll b/output/dll/LuaInterface.dll index 3f048ff5dad829ae95032c92567cf109c2f5fe1b..96baa9427ea63c5c3d40baac469cd72c4b632830 100644 GIT binary patch delta 10003 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 L0G;uFz770eyMoP- delta 10102 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 aSM_##f)|H25H0`v&NjmUo$#OQ2K*OFx(0~= diff --git a/output/dll/lua51.dll b/output/dll/lua51.dll index fd053342d1ebb5fb0f307cf5808ce6b4c2327c4c..09644398cfa826a7b860b230d208d18897ef6176 100644 GIT binary patch delta 37944 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 Q%Hr!gMv`~EoYCz60TdfYhyVZp diff --git a/output/dll/nlua/NLua.dll b/output/dll/nlua/NLua.dll index 59fe2bc9d57b65a49a57ead9e6733d1c29538325..5bdc058e66fb68f7e8d907f08e06b6e4207d9a53 100644 GIT binary patch delta 28773 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 delta 28720 zcmb__2Ygd?`|tBRCr#5dX`3d^=%9m+bnn65$PfhCf(o*iDJ@e*T7k0X0R%)WLjgsG zpnxcXB8o36zAB2MQbonLDyVg%-sgGFNt&YG_ul`#^}{#M_Zh#v&Pc4NE4NeQ7M51>i_7*yqt52KubaxH!WM6fIY=!oH;Ui|>LEY`f09kvtQZzC1D zchjv&wCYX@Fg?)Weo>?h5oyL7UM;yQWvOT$LWxoe_bX3}_z-jjOd1v|ABiN(dz3T& zb;ExW1VQ^l7U_8*)+ukwX^6itChAD;&Nzi}6XPkyFBvUCG{vr|e!@bd z3hmj3Aop3tZfYU!JJiRN7i7KS=QL^5{Hz}?9;?-WvFA3a);wCrM)vz z`NUyWraA{GBV3hAYgYG&OUy^CPi!sDEAFHjDAy(xBEFsUl&CqhwE1BX%%$_J zQo5v+S)ayqJoi#P;G;+rNQTN|hgPR75Ll6@wCq%tRk%qPNz#XhZpoBof98F2`ugQP zInBlW%4<2>zjTo#wkf48M~Obl zmXHY1ASGuhN7~d&C0WYOwzpw= z4Q)pS*JfdRSG=O!-R@}ce^~xTY1V$XzsRq(?<*B#D+wJo`&Fkpu*%l4z_04nv7e|> zwsqVn{-d<)ROZ*u>NHgJIP^}ZAQApd4wPGU((H5`b#le4%9ouNi{nZ~mrTU1UAhJr z-<{JNRf4{04D%1A+oy%H?H&f_ zy|}c}>|AUf_ar72#{vzwCi@L<1{yL03|}jgZ*#^36$K=i9bk?tQfhB=M7ImH=Lgs) zDsSHA%$nghXVByujgyc6r)E{T=aY_s0M39>T4JLVvZnv`#tFKcVG| zR8Vy*vFP2OVfNNwNw(-M!4=%iA9H~m?g11DnNCTrcnw1g75`Bz18kPWVhraw3YliK zRVyU}68uHEb3jWR1{((?THo^f1@nZhNGVay4RDILl+Ok<*Qtv8uKuYM)1~ zIfS*9s&?|Qqy#)(>8(18j`d#FqXuMYb_ou6&qAecXq2*QSWsAyC5U~Nsj=@4OR~N| zv3iSIss~iP>CPnUi=+>>sO8$G>N}wRH0cc%wPcU0`ssIe6YCE>f9D7xs+7dL>k-Yv zbH)9K+6-?c#8b+w5%JMW@F+Evwl$sY4}pzf(sqQhO6AEB_l9tPK-ur0q~8Hv%+;#iTbQPb<-_9GKB;CJyNdtMR|Wzf%rf%k4_esl!DQPk=8OT4XZBGD#^i^$c)jQ#1!TD z=oR8arTdr;;v;3*m?ZJBvTsZearw|MW7Y_2U9m+|m|! zKEd-BUI4hi#t&(BPqaEbIIfIy`;enFn?5So@tSh>-j3o<#pLNAt}DGg>E3FLPpH8* z3o&@U#TY8G=Q|Q`rp?2CHF_El0Lc%5DIpIwyb-5j&^)}xFk18;JP~o| zFMjV}&#&YYk_ncO3=yIH=*i~tq$)kiV+_~P7AjY4QYM$jir|DP~Q|dKgZXhyvSJN zE%8~+sLjFxs~k?m%M%VV+ggG=wb+8z1WQ6z68T1;8I`_n;@;CJWQL=IrKv-tKW)1; zvFrmJE0hX1q`{K7&Oaua*3zYpAoB1xzLir_=1xoSav^jUGH>=Y88+Hz`WuUl%JtV6 z$V{gKajE}mMN5>w0$B1y$6#xsMTwoB9c}mP(W%MeqKuq=t9V^GFg?}kK&R|TTr->` zgrMM3zMOtLE;p@b6p3hM%8Wu0qdYRBd2S3kga+er5X#Tf4$F%{tS1)Lrr?TG*sbRi zeJcp6m7iv~y>V#d#j+U*O&3eq6HQ9mcAIO9VdEk*5BGMX`#jCJ1eEYNtGUQ*@ibac zA21Y~F2HT(C1S9_lSE0}?AW+CqlNrJ{C;X7d}9ylaDPzD_Z2%*(7|Lk+pRj;^BYZqAOnv4RAtD014OE_|Gp%Vru_T9 z9pe&{!1c9u5{Q|cQQY{go%!07~d98JxHavk4&aO0`jm{5%;J4;ZoT8Rit zgj!Cle?a@&t&y1y)bQ+y^iLg>tdW+;;FaV5&{?e(YxX7dp{cLaX1-#Y<4OsbL_toop!6MEQEJQL*VYH70KZ*5_hMA>!s-DWqN513${3#tZasP zwAbCFrTx&L?T3^vWF`T-;21MnV=b{+7PR{VdCdmYsCy(uus80+Mr)iUF6$ODhUNuU znDm{ZWAxZ12r1{vTCPsr5!X|EVs@zr87ed*)v{Cmk!L z4s=fjid0dWA=2#IXxB_@sqLEDgfVzB(Fw1K4D+%ATO%6@p8ImN6dI?L&XX&=V8kQ3 zwYjBv3p&hF7L7}%-I|P3*Pu?_Wd9gO$(n3QR;O-?B?YIhS}@<#4Z3;LPPL?FQLi`V zjf593bsdmA5S18?g@ZhPIVadq4jcQE?lO|@K zb7)Y9d_bJfK*y55MnI;UlA}{e6JwY!Og)t-miaBM0S6InBs3^@&5y|_z+k-h5iZTX z700;jDMW6}bmH~58~Yyb!mE0{r%2f`KOG-Hy*9sfaWOja4L2F^5CF??7(*p(gy>G! ze6oj<<%>#8Sk)9NZ5KFWiYO8{woSehs7Y_&?GSg&DGQ2mC)~9ly<-}B&D}r=h45L` zT|&vJmtxkuAee%gE~iYT*>trjdrHxcm&2Hu%FC3F>987rafD5kuEQg*jP9p6((#bZ``c0e25xWr8ia5co- zW%mT^YIg^p>tF31(bUwg1G+QT5tI!zLq#X$yPBj{ohcr#+-0nS4sTDGBzu(I-37I# zOfaZL?1~Ij@s>uhn{wMCr_yPWMY(5Du`N}-2Z{$nfBE_-rxwNL_N5Hy{s`Ch_Qv>r zEKwt>wzx zWig_&vT0dN%oJaaTqJcA^9XgfRNh$TN~!SKxlJpP(P)<-aHLG7k&-;k=Sls5_jj>L zZtk!d*kM*>_;N!>yb-Ha6r^zBo`uwn4`wlOY8kZ{Yk4xw_IXmWbJ&HXxyob9lf*pb zwdLs!FKV%W@J3if#Q^M?isJ~CR}}M#X3eTp8%~b|e7aSQ%p}d8hBMy~37#sY`-+^9 z`%#&iQBt`=sanw+@5sEdqK(+1m{)ocSFG$SHY*>m%!zpkTiu+QM&pM>Bi?0PjWZbO zX2rd#yLd;bSe2Hw5KS~x=vJ-oc`K^!lV-2NJgq^J&HW(q)L@%?f%4L-H0yd~CTY%6 zw7S=#Y;!ME{#=zK)+#xxOY(fl;kmwPavU(biqZ_j<6uM?u9{H!ma=Yjk$77K8xZCZNw+P$JPwPhhp}%WAux#((VV9``0Fk2bD+Gwv|F#DW9$FFBU5; zmC50=TVZe_UpQn2RUA>CR!Z@i_cw~$ycFZC*_Q0AxwvdA&DW*ly4!1A3_h&KQ|vP3 z-gWutSi8<4eo=a^cPVeKi^2@QSeJ+o%0kw65Jynk-sY=Tsio9kE#=|$iCF7X>y!1= z4xSpNetoQtL?wG|tdh3DrjqJ)4qOF4O1HKI$fUAPqm`c)@gU!2~^6T4O~yKGK$EQ!0`Nhn~?r1VLSRBsW$B zizCT%AE8`)EBscxo%Y*iw|GcNey}*<0%l><%X9ak3rO*?o_?4>Xt4ed{kv$X+^Woa zu$k=@cFNK@LNmkgkv!($u|71ArH*{>82R*8HAIEIfC-v4m8Pc)- z+tm7#FYS{K6Fy$6aO2~7EO@Q5WJ}UbB|3qozb)zozag_}#^11^Nyd4Y@pjC(@;xQz zA-nz}8nIn^JQVMJA4Q{HntOm6j}JfCa9Org={_4X-1gU0hPK%zL`2`4cklW;0pbIMg!d z9Z{;cx+1Z3IyWApGI1DvKyHsI=eIibS4ezZ`DSaYxX)0eVRsBYaUQtOAV=rV$z!Y1 z_2FU{&INTK`^K$$Sn%vu);*l7%zijedGTRqD&4x$juh(o1&2BwDLjXK`swk1RDPl4 z*LKCJKC?C(@zL7W;;`~*ZL;?;I(hEEmb7p7EW!`ZQ>ehbJ|m~{Lo7%Yby!9-+5Imh z8PjF=IsDAB%I??jGdooFJdN(SN8s(Jj8r+^$x|mIN!C>!K|{t}vWGG_kL$VMdvtcs zQPMY4^%*^snr+R+G3BvsmH6sSv+X_cWrYdbQ^d2%>g{)n=alQ)lf?-oYDco|7={&w zO7^+WV1XoKX0RQr)N4n!_*$90BfX6q_k`y20M_BByA0)iQ!B>bJGK&sEj+sb;OEw; z8_*99pQ6{!P`+hA_s;lv8hNc!x1-Sf4VLk7y#HW8?Fl7uXBTf#9IEh755L*^Wb0v1 z6yXp%VY2OCSyp&7o2+APzc$mum?*+q7~9)PKFjhaj9b{}_o%~hdgy1%#}vX?f5djX zQxEmc4&~wlz$n7+tnZcT;f%G97oDv3e`V=mP635^tR$CV#(Maa@p0+bAU&8O562nd zXwak}Biw17gqrA>!*OBoM*0t!^!F(gJD)RKZ6^7=ApeqR@&ru52p=X;Y?g~OF9=Gr zZ|bkjyjUCj(8C4B{?@~B55ON8RO9iHq~FB)yHZGA$?}yPl3!r?Jz7HS8BAB?k9XHo+T&HO=?nfmpQY-;MrEQ;-pwbVm->M_*Z$EkgVdd1WMDG_7 zErW)D48b69W*!Y9riVmkpX3sYg7M5+W)RDS7nub|5^DuNLp8>YVAdM`WZU`pmO%;7 z4uXWhQ_p!@OBC9JnOU8cSVxEy)o4oyOQ&Qyf>luVpD3Q)G2WGymO*B8af@v@{eK8= z83fQ787&>oO!Dsxc#8~K2D7e^$t%UmW@PII*_aW)6fAtP=m+>Z09AH9u+Xzi=I0K9UGNMuCD*Ic<4m{bs_eXw(G|~bK(22x!+T7~9*4J>EykJ+fhXV{ zW)8OPgA2^igtq-Qr?Tky= zXP<$5F0y=xaWdo2tUt@1qgj5JaS`Kh?9++mXv2Ie<3W>xNM*D@x8_uo%mhk0o$(r@ zE|E01vusHwc{IzvCC$frf1UauV&D87RvG5xKaSSxxd#xR%07&mZSE6@Thm`a&1%;f z#Kf|*h`X^RygE1+dd8}QHE5Qh4=3F!m%&{mvoXxmR?7EGwcT|-kv_2cE+mLFVvl} z4y?LT@GIg@7hyLeVcS%~h!Vm_N(qe_guBCj^+)OA{y@zc#~*&p@o>pDuqq~wFsvD2 zG+smxtok60@Kq<_G&7<1mSp;n*<7KQY!4;OPSa8|i5Am%M^7+_u7P~B($3X&jjTci8aNL-K7#vP%PRc7l zSt_Kt^J@W(e%jPyO!9b^hamcVB6PQ-z8B+VndBKP#~~&{v1<_Gg5+Ud%w}3#W6fyR z>ftFEfqF~i1Voc`FQTg7iFMM0ik8T;xDp(bD{Xejf|-aT1Yw3mcv`w2FPd*H9TB3Jh17GdAlA+Ga9419#`{4w2!c#tf!UbvpPt0oOl(Gw`VM z1-vv_o`?i$Fz^kV4z4B>n-49r-mwLNA;rfoVQ~g)>_YgbwqP)1lC2uTOTV@mAy#9H z>ZKH#uO5taX-HNOX^71LL z#_)l&3$%c48ta*BjcNf4REAwB(Dt*R#iDId0mW6LEecw~0hM`SVIeM*aJ7&Vg$0qs zMimiT1G`-Haw}NQtQx*c4}#Y46|?#9dva1#8^|kGwN?~3XPH}GoKjt_ZIT1CpC*#kWGO+W^3S0*B4QhFpOC>WX4{Png$0nR+jQh)C_n} zi_@hIfSF*TOK_}GXBXIKLNc@Y@JM73cxOSmW^9%t;68vZM_GLFj_N)H}7p<3zIclV)HU&(>2>6 zv?(x8v%P{g1r}+xA!u6%t2CPjZR=p8W?P81^-!zXwxDf2?D1;G57D>*4r<1q(6|Af z(QK6oz3mUc3z}_JLK(7uX|_R0z3m&}EzMS$REF%5W^0z%+r9~|Xtu({GGt$Cw#PBe z&G18a+JB(ha2gZc41Z|GU$JQ(1bq+HW<=YA5YDW|@DgUY1ss~~eavtRBxttO5lYTbXz6Y*rY*0|W z{5Uv!si_PK8f@PSlZbgS(ROIu2OBlxPGtMxw8jn~I{?=;)(hD|i0!Q=(-qm1&`o0s zvO`erXM^pB!FikNIS*}5LuZXGLUshonR(a1RHR2?3)2k{96j8A3?lldfvrR9<>Szr zSv5?ES+9E*4$vhX7W;i;z5EdW)pNAV7yH@0}pMtUhsx2aP zy8T7a4P@qp>1kE=mjUqBCpp<0VQQLHX)oF@L7%%+Hb3o6dmSv+m^UipL;Gj&EYmfRjrIKku4=}9 zSf{IS;BE?B13#A5%U{AJX4O!GS^NiD4_9s1aa`2HIA+ygN8490ZiH&PJF8y)8rCtZ zhAwFP2J%L#wuN5z=k{xGt42o`)Z4Gavl?rW*rx$aW)fhI07CZD}oyJzCdpq0pVy{YZthYqt z+Y{78cNE7)8AQQEl|2<78x)sSv7o)wgho$I@#vKg^1f7iQ+qrbxXX% z(Ol?esJ1urN8)RlCz(~lw1SBaw^x+UB4afqT01(j#8Hh|@@{wJh%K|#z&Vzwjy!Qr zW8dZnL817WSv7o{-%ej7+T)WPO6BGJxsDQ1%WOU#%NlH@;?}upDtDOgceD_THFin2 z)X_?KPiypA(ppCw0rOPXwiwt>G1beo8u~e&blfhEGFt;z)4|+dT+-P2@OpWm z(A`hTRKsJ~+=E0nW@})7VZA(9lxwy-aRdz!!{?JHT}QQpJH%9G>NVC-u|>5Rev7yP zL&f3wTvGMwY^aD`K!Im~uFi&u*34>ffjS&AObpXl>(FN$cZn)yr=g2O;AQ7wW}owM zV}y8x867^N(3ZSVO_Q$w?h)fOMmdZWRSS9lTYx3Sn<8Qf8>!qcJ4TA#e)hU!w0MQt ze8`P^*D+RHRc*-X9OH$dhO(gMj*XfiIx|!2J5dbN7-c_EoYNR(KS}(84C{|qGGQ;k zB>dVCB~xR#5*C5XsIlKuUVzCWQe)=S2xKuT<6_@?6H8{>2Dp)R)p4)5stvjmBk`{`vzrC3K)yXcrEj%ti9I;M;Bep^G(Owr)CdGxb{X(`9S zXBmGuW{V<~8P??MoU_GXjqS}LMz23mJAGKtFKV`^W#(0zZH_p=RBg7oYT2}+%@wa` z$L(u(AiZ)+FEK`d{-Lz2TF;jD>5oE!!<_&tw)XrWbZc$yaNsZ1L zF!l9%LME53R_wf$twbFLS)`23#&uNqr9 z9}rpFh}A%w;{MKu#S)Fth1)i^vg+YitABj)?_+ zw%B=G9MV{W>1We(;(3jE%+=CKaZY0og@O5$_)TL^M@M+gFADu5YW8nMN0?s{7LB>m zE|^{xu^JP|&Wa3;O)I`&`j;rySi0ka={3<_V}r~WOmB#u8hgLsg6T~$P-7#}_Ldl- zv9HnQeMd~vs6Fh0>0L2XWBRZYx{G3+#!kgPWBNes)7TdK1=C03n8v1rUNBu2r!^Ly zRxf`dE@|w8@YT*w#m^eE$7Ps56Shay>OPm2VgAA^@-!OKEW`YzxK(5KIZo*6#W;=a zMfSB=rm?T(pH0`q0~-4o*>_^6#(vi|H~%0`YV37nKZ%PPJBRJ`i}+GwUm^QVcyDO* zxHH52yKwGO%XX|F!~CZx(%1v>8D=5%(pYF*wIoY}G*%v;Z`MhpG!`EhY}QLv8e1IS z-fWb%Xl#30ce6=4s7GcucUXAW>Ry!l4w!78ruLb3sBc<*dTbDM?Y?JzH>~h>j zr(GJYvBk~^vs0R>u~Zyh(b5KuwJ<*HjFon2><4p%IbJ%dF-5n_nJB%toAz+54O5bV5kJGEAmeLK4{o=|nx00NXsfBsJ z_=K*Fl&`U?x>ua-q|O=(alUQtAPv=+j1#YeG+JXWWF4izm8FwZjy9}6Es$?IJ4s8} zRb6&ENwq42YW)SYy{)l{#*du%`x%c@VQQen5gXN2YQs!jpl*?FRc(e%#?PF$NTW3N zn6VxiMajId-6M5VnHSE8bEXDc56yT+ylnc;d8?m2XZq9GN7}6>gDaxm)mL)wm?H-0hkuP1V@J#Idf)P5Q7xs$-klX%$kvpG820 z^rN3;g;z?_QA(4}T1Da0q%dYR2Je$8U0{Y}XIgD|DJ2S70<$xQy3iM3rc|c7VxZMH zQ|jSo(_QyTlT=T>fj>uj*l(NXnj;-hnZfN^=$b3NqOsMRE_OIcE41sv8%}DOXoB;6WIdkXN|p$Y@w9= zjGE>OWHr(-js2eK-Q-#%E!OBrG%l77YwQ+eOQg#hOU-`RwN#2dt|k+iz1Ouuy7a8d zB0`^Yt&*~yQ(2s2lWVQiS!2!fH@OsPn8wb>ZE~%XrfTf-piN%adTF^v*XuXAHb^@) z_C@$6*8|eC8XFwC$+b~>TVsPtUw3VizS7vq@C&ZZO~%DTlIa8$W z`bu*xf!<=fpG_3K#SW=KvlU6b#ZD>md9_ZjOTW1ukzzHLEE}R9l~Od;6EoZ`wb7U& zyQ23r$?!3$i)MQki~X479n6#_P!PVBRmrSQEX5nAd!?Bg`=q!FvR6-1_H`kHie5nW zZ)PYW^R<5v1XWydWJsl!9s<&WZkajSg1ub=R}Yj!G~PY&Dz-9ey zm&vd(ho)iz_Er!i2Ggs^^reenm>MbJtNUs&Wh224ZeL~+`1f_x2X5<0JR@+wM}2+3 zda%ulD*U<)H>_HNzt&RK4-N>U{X1~PNPMdC4NN-W{5N?cjwBgA4DyeEUx0e%QL}7Z z8=CGB&3W}!ea7%XLzM&dfwSpU%))XPnZ_*YHu0RP4eB<)0`rlX#Y0*dZi{{sUWWnVqivyB=i z^G-1V$Bhm$cvuA_r|l+s5n43FuLEB~bPIc)?NSoPa^9F3EwKK>4p$ zRimyAYHB}V_A>1B^1jqW6`~1ggE{s{E(p# z5%&UIWPEd-!qkfpb+N?nj-d}edSy>_IU+ z-B@a^vE0<_@wg^H#dla%v5O#mV9IpGuU_{zx%!7Lc%K0cYCsG&Ccc}ijD5ekm!ADt zfNn~-5b=$5L?iynKx|e7zF0}vfw4PdU&bMfBN)dcM!^)uS*)pMT!R=5n-KBBk8uy{ zPa!72S=NMzSTAO9ke}{;DaiE~#4#d~BP0q$ToW>GvWoEu1FRL3L!cL`7eQcpcw; z-y>>EPfMflUbDay?#mUJ+2;H|QB$oCk}pCke#LQ#py$v_#DbhC*}FzwSQ;k_`PI^F z#A&WV#LfAw}lJRWxi z61j+Va9{KVxek=*dc;1(guh3Bix?6^Xo>z^-X;$$H0bKQa3nQcR|iMzv4}4r+Tfh2 zwa&yiiAy~R``DwK!+k#oXdFy}G5C%4CE`geP(I$)Uyreq^!pL_gr7j{VmzVSBOlCr zNq3OnF=!!E7hiZV|nE=b7UtEEGNF2b=A>N9#*ftqLn8ctw)bQiCp zE49azpjl!9));@vJ7or1H|Ng{5~8h%#?9vZ1wl*D^9o|I<(r_s;<~*dXb7SXQ|``b z_6UCgzxwpGJy^d-{9CehNoWJOI zV*3S)z1%g28E1)iQ?`PWMQ&L{1DjNe;Zd2pdY)2Tx)= z%s7jO%(I-_X~uJmXT>c2pTTFb0(!$mF*iKIKpKbP9L|&kl&6KKqMoMoML{n;Tol7n zvrscBwZMxXy_>Z_yrWq=M0>NYi0)=R5x*=U`Nxu;n8d4?^f?~S=eW4%cuc&_W8$oM z&@$QZHjfPKW8*`HzF3rmc6HWsyxehn#b_7 zj2B^4Xz!3O^mg%pzcfw6_Iji@trkg5tlNBJ3)Tj(ZBg!l#o>%T_% z%Yr(L8i)h1yGX^sJ4JNKDGco(U5{=N+Cmp1lc%?;umh5ZvedBdC>L{bPcn|?M6+3T zxhR8;j5A6|zTZK(jqy(QjKD-&=pJK#T^h-~u|O?!v)Mm0pXBe^a|1_h^>T8{nbf0U zia2WRf+bDDVK_xxh^1-SKeP)_8>|h@mvV!*A@<68GPEzZ#6_^?oWeR)6`sMOk2b2+ zIFCNxhrW-RyHR7~p=T4c0@?%(>K3~7Ktt8WV+WeB0lCzLI#oZ+gayjS zuOH}Iv!)?-jOhmN0ylVY-Qcm(z&Jvjk9^3~z}5z~(zM)XssnmlTZeB_JcC#i{sQ7V z>Hk8+cO<;{QEUAKk=}`@gIUfmOtds!M-9E-PzNjVIdC1g@p*S0yofI@)WKy&dTpT& z=mmv3pcfPBfL=(b19}mm4(J7hI-nO1FdKZspbqFggF1K>-!G^Gdas}k=zRij9ngye zb?^Z%ob)yThT)U`I-uwMxNhrWF-v;BUk9H!NORmtKF9E(a~;qF`#PWp^>z4j4f!b3 zqxd@5hmYXv;94B{Omf~~-i8bCXwn2tK&0pFSdBO=gclY&=O9T9`vQ}0VO)r^qFaU7 z+qlU*LU%ykgSaDSKWe7BpF*T3;dMaIyz79Tb=LtsDPl-+7o28`j8BFo<3PIt$+(FNkt}GgY_}nBq;~d>2o^xBmH;LB}1?veTFw5AiEY=hu z(y`(!FEy=Ee~(0)_}$^O9L)}2BS%NB3O_51Id6n_W~)sMH+>p@D;8xq^v9y~fnls4 zh3KW=C8fy`lUOyCagDsRU}eM_`T62kBQAoA&p+`v3ogPZL4<2?E4m1uh7+chei$)F z&=;~U!W|Ae|9phjIhf8B+@QDWzm6EME6_h}67odHjR+x^I3$aZ-*l=t+H0PIizS|6 z@tn6cG7MaZ2IwOaECwuV3gTdqfjCU$A`TZth@(Uc#Bri6;v~@taVq=I6x~p+VtE0_ zF6P+f9J`uh*KzDdj@^Q>UIWyMUKqAh+>UsF!wz%UQ4V{S!%lM8X%2gZvpk1UVffYC zL5P>cUc}4dIN}v?4)LmZ2k|R01FLjhtVC=;#6n9{rAZQ1sa(P;d10zVb($$rovPTd zfDEvhHOnO`)@o@}WF*dx6ud_3f|v+9pm}T>{ytlVB?o`njL-_3qH`byAIs$650RZh z%!F4F3*l|VR-lW?flgpS?8*9m5RbBVC``kTkx+v;5tbuX;tRStFdH6<>A=}^0tGYZ z1P?-1>~Q>Ia)zaf5x+?S)v@zAww5&~8F2!mPaVhN|8xUoA*i^W#J^x!>`26Qu{#9C zz9ct(5F9uOjK4p~kBsXX5#5j_1KI0C?7a6w&kHqdf#V8D183Pp} zk>x~|6U?M<&p4dXTg4x>j3*f{GeQ`-CNQ>V9L`w9Sj%{l@iHTXvp-{d#^H=rjJ1p> z880(J1p9mWqdntr#wx~I#*>Vf8NtEPY01YM!#zSv5I=UdLcA@v9pe7DZiv_7dm+Bj zobViDC1Wk)Z;VO;S!W~>mL?Lu!kRF~k67O>ne>9?rx^1XcX&DAUB*p}rOo@H>z2?# zh-=e_A^sUL0&#u#7{tU>LbY)F<0gSak9anP zD*0I`rIY2dF2RrQQ&u55~?S|HkjCmcZL`8^jB8JH+?o4v6o|oe(d{ zT_6>5p*wzWvmBPgqwqYwYX25|rI@e9r@M_UjeU&Mjb7uZ&?iEF5B=DDJnZAJpTY)& zzZ3pV_)p;w5fL#wVot=T%7AOl+l5)qB09luZ0q(`0QJI808-$L8aWD<}#3Q$6 zic2jbvJ4*#T7E92%f9gYXB?Zp@A#3j(PBVIRCusilFayDn8bfLjLoq}_T4K=tdZv) zrc$bZpOc)hCebdv_wWN@_lx!qge?%QMD39t3&fG2kk#ssQvKZSh-Im`Cf4Ky|1WKn B!NULm From d5770fb8a359ae564593d0cbf271827be81608fc Mon Sep 17 00:00:00 2001 From: zeromus Date: Sat, 22 Jul 2017 23:41:12 -0500 Subject: [PATCH 87/93] re-apply "keepalive" GC fixes to luainterface mode in emuhawk; maybe it will actually work now and not result in crashes. at least we should check it. --- BizHawk.Client.Common/lua/LuaFile.cs | 2 +- BizHawk.Client.EmuHawk/tools/Lua/Libraries/EmuLuaLibrary.cs | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/BizHawk.Client.Common/lua/LuaFile.cs b/BizHawk.Client.Common/lua/LuaFile.cs index 0358c3ffa5..63ae59c75e 100644 --- a/BizHawk.Client.Common/lua/LuaFile.cs +++ b/BizHawk.Client.Common/lua/LuaFile.cs @@ -49,7 +49,7 @@ public void Stop() { State = RunState.Disabled; - if(NLua.Lua.WhichLua == "NLua") + //if(NLua.Lua.WhichLua == "NLua") Thread.GetTable("keepalives")[Thread] = null; Thread = null; } diff --git a/BizHawk.Client.EmuHawk/tools/Lua/Libraries/EmuLuaLibrary.cs b/BizHawk.Client.EmuHawk/tools/Lua/Libraries/EmuLuaLibrary.cs index 97c8ac58dd..30b1c40f7c 100644 --- a/BizHawk.Client.EmuHawk/tools/Lua/Libraries/EmuLuaLibrary.cs +++ b/BizHawk.Client.EmuHawk/tools/Lua/Libraries/EmuLuaLibrary.cs @@ -18,7 +18,7 @@ namespace BizHawk.Client.EmuHawk public EmuLuaLibrary() { Docs = new LuaDocumentation(); - if(NLua.Lua.WhichLua == "NLua") + //if(NLua.Lua.WhichLua == "NLua") _lua["keepalives"] = _lua.NewTable(); } @@ -178,7 +178,7 @@ namespace BizHawk.Client.EmuHawk var content = File.ReadAllText(file); var main = lua.LoadString(content, "main"); lua.Push(main); // push main function on to stack for subsequent resuming - if (NLua.Lua.WhichLua == "NLua") + //if (NLua.Lua.WhichLua == "NLua") { _lua.GetTable("keepalives")[lua] = 1; //this not being run is the origin of a memory leak if you restart scripts too many times @@ -191,7 +191,7 @@ namespace BizHawk.Client.EmuHawk { _currThread = _lua.NewThread(); _currThread.DoString(command); - if (NLua.Lua.WhichLua == "NLua") + //if (NLua.Lua.WhichLua == "NLua") _lua.Pop(); } From e872fbb7daaec94953ce52585aacb20d007821c6 Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Sun, 23 Jul 2017 10:07:01 -0400 Subject: [PATCH 88/93] A7800Hawk: Fix memory domains --- .../Consoles/Atari/A7800Hawk/A7800Hawk.IMemoryDomains.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/A7800Hawk.IMemoryDomains.cs b/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/A7800Hawk.IMemoryDomains.cs index aad27675dd..551b4d5be1 100644 --- a/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/A7800Hawk.IMemoryDomains.cs +++ b/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/A7800Hawk.IMemoryDomains.cs @@ -46,16 +46,16 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk "Ram Block 0", 0xB0, MemoryDomain.Endian.Little, - addr => RAM[addr-0x840], - (addr, value) => RAM[addr-0x840] = value, + addr => RAM[addr+0x840], + (addr, value) => RAM[addr+0x840] = value, 1 ), new MemoryDomainDelegate( "Ram Block 1", 0xB0, MemoryDomain.Endian.Little, - addr => RAM[addr-0x940], - (addr, value) => RAM[addr-0x940] = value, + addr => RAM[addr+0x940], + (addr, value) => RAM[addr+0x940] = value, 1 ), new MemoryDomainDelegate( From edddf8cec0d7f4b22a2efe2e3d078a18fda61a6d Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Sun, 23 Jul 2017 10:23:12 -0400 Subject: [PATCH 89/93] A7800Hawk: clearer loading messages --- BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/A7800Hawk.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/A7800Hawk.cs b/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/A7800Hawk.cs index c4b2d4dc69..dcf2f6c921 100644 --- a/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/A7800Hawk.cs +++ b/BizHawk.Emulation.Cores/Consoles/Atari/A7800Hawk/A7800Hawk.cs @@ -88,7 +88,7 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk if (rom.Length % 1024 == 128) { - Console.WriteLine("Trimming 128 byte .a78 header..."); + Console.WriteLine("128 byte header detected"); byte[] newrom = new byte[rom.Length - 128]; is_header = true; Buffer.BlockCopy(rom, 0, header, 0, 128); @@ -151,6 +151,8 @@ namespace BizHawk.Emulation.Cores.Atari.A7800Hawk } else if (is_header) { + Console.WriteLine("ROM not in DB, inferring mapper info from header"); + byte cart_1 = header[0x35]; byte cart_2 = header[0x36]; From 471f931b7c0d60580d7825b86f7113bef83b5369 Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Sun, 23 Jul 2017 10:26:08 -0400 Subject: [PATCH 90/93] ROM Loading: keep header if game not in DB (A78) -Only for A78 games for now, so the core can parse the header if it needs too -Probably should do it for other systems as well but I don't know how it will impact them. --- BizHawk.Client.Common/RomGame.cs | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/BizHawk.Client.Common/RomGame.cs b/BizHawk.Client.Common/RomGame.cs index 61dab97402..a30e3b64c4 100644 --- a/BizHawk.Client.Common/RomGame.cs +++ b/BizHawk.Client.Common/RomGame.cs @@ -44,7 +44,7 @@ namespace BizHawk.Client.Common // assume we have a header of that size. Otherwise, assume it's just all rom. // Other 'recognized' header sizes may need to be added. int headerOffset = fileLength % BankSize; - if (headerOffset.In(0, 512) == false) + if (headerOffset.In(0, 128, 512) == false) { Console.WriteLine("ROM was not a multiple of 1024 bytes, and not a recognized header size: {0}. Assume it's purely ROM data.", headerOffset); headerOffset = 0; @@ -86,6 +86,13 @@ namespace BizHawk.Client.Common // note: this will be taking several hashes, of a potentially large amount of data.. yikes! GameInfo = Database.GetGameInfo(RomData, file.Name); + + if (GameInfo.NotInDatabase && headerOffset==128 && file.Extension == ".A78") + { + // if the game is not in the DB, add the header back in so the core can use it + // for now only .A78 games, but probably should be for other systems as well + RomData = FileData; + } CheckForPatchOptions(); From a264fa64c209e8b8a00c8c1d6e803972f1274845 Mon Sep 17 00:00:00 2001 From: alyosha-tas Date: Sun, 23 Jul 2017 10:55:17 -0400 Subject: [PATCH 91/93] Intellivision: small STIC clean up --- .../Consoles/Intellivision/STIC.cs | 43 ++++++++++--------- 1 file changed, 23 insertions(+), 20 deletions(-) diff --git a/BizHawk.Emulation.Cores/Consoles/Intellivision/STIC.cs b/BizHawk.Emulation.Cores/Consoles/Intellivision/STIC.cs index 3f5b94b041..97097e097e 100644 --- a/BizHawk.Emulation.Cores/Consoles/Intellivision/STIC.cs +++ b/BizHawk.Emulation.Cores/Consoles/Intellivision/STIC.cs @@ -492,10 +492,10 @@ namespace BizHawk.Emulation.Cores.Intellivision // also if the pixel is on set it in the collision matrix // note that the collision field is attached to the lower right corner of the BG // so we add 8 to x and 16 to y here - if ((card_col * 8 + (7-pict_col) + 8) < 167) + if ((card_col * 8 + (7 - pict_col) + 8) < 167) { - Collision[card_col * 8 + (7-pict_col) + 8, (card_row * 8 + pict_row) * 2 + 16] = 1 << 8; - Collision[card_col * 8 + (7-pict_col) + 8, (card_row * 8 + pict_row) * 2 + 16 + 1] = 1 << 8; + Collision[card_col * 8 + (7 - pict_col) + 8, (card_row * 8 + pict_row) * 2 + 16] = 1 << 8; + Collision[card_col * 8 + (7 - pict_col) + 8, (card_row * 8 + pict_row) * 2 + 16 + 1] = 1 << 8; } } else @@ -521,7 +521,7 @@ namespace BizHawk.Emulation.Cores.Intellivision int min_x = x_border == 0 ? x_delay : x_border; int min_y = y_border == 0 ? y_delay : y_border; - for (int j=input_row*8;j < (input_row * 8)+8; j++) + for (int j = input_row * 8; j < (input_row * 8) + 8; j++) { for (int i = 0; i < 159; i++) { @@ -602,8 +602,11 @@ namespace BizHawk.Emulation.Cores.Intellivision bool gram = attr.Bit(11); byte loc_color = (byte)(attr & 7); bool color_3 = attr.Bit(12); + if (color_3 && gram) + { loc_color += 8; + } bool priority = attr.Bit(13); byte loc_x = (byte)(x & 0xFF); @@ -619,7 +622,7 @@ namespace BizHawk.Emulation.Cores.Intellivision ushort y_size = (ushort)(ysiz2 * ysiz4); // setting yres implicitly uses an even card first - if (yres>1) + if (yres > 1) card &= 0xFE; // in GRAM mode only take the first 6 bits of the card number @@ -642,7 +645,7 @@ namespace BizHawk.Emulation.Cores.Intellivision } // assign the y_mob, used to double vertical resolution - if (yres>1) + if (yres > 1) { for (int j = 0; j < 8; j++) { @@ -752,15 +755,15 @@ namespace BizHawk.Emulation.Cores.Intellivision { cur_y = j * y_size + m; - if ((cur_x) < (167 - x_delay) && (loc_y * 2 + cur_y) < (208 - y_delay * 2) && pixel && vis && (cur_x) >= (8 - x_delay) && (loc_y * 2 + cur_y) >= (16 - y_delay * 2)) + if ((cur_x) < (167 - x_delay) && (loc_y * 2 + cur_y) < (208 - y_delay * 2) && pixel && vis && cur_x >= (8 - x_delay) && (loc_y * 2 + cur_y) >= (16 - y_delay * 2)) { if (!(priority && (Collision[cur_x, loc_y * 2 + cur_y]&0x100)>0)) - FrameBuffer[(loc_y * 2 + cur_y - (16 - y_delay * 2)) * 176 + (cur_x + 8) - (8 - x_delay) + BORDER_OFFSET] = ColorToRGBA(loc_color); + FrameBuffer[(loc_y * 2 + cur_y - (16 - y_delay * 2)) * 176 + cur_x + x_delay + BORDER_OFFSET] = ColorToRGBA(loc_color); } // a MOB does not need to be visible for it to be interracting // special case: a mob with x position 0 is counted as off - if (intr && pixel && (cur_x) <= 167 && (loc_y * 2 + cur_y) < 210 && loc_x != 0) + if (intr && pixel && cur_x <= 167 && (loc_y * 2 + cur_y) < 210 && loc_x != 0) { Collision[cur_x, loc_y * 2 + cur_y] |= (ushort)(1 << i); } @@ -770,7 +773,7 @@ namespace BizHawk.Emulation.Cores.Intellivision if ((cur_x + 1) < (167 - x_delay) && (loc_y * 2 + cur_y) < (208 - y_delay * 2) && pixel && vis && (cur_x + 1) >= (8 - x_delay) && (loc_y * 2 + cur_y) >= (16 - y_delay * 2)) { if (!(priority && (Collision[cur_x + 1, loc_y * 2 + cur_y] & 0x100) > 0)) - FrameBuffer[(loc_y * 2 + cur_y - (16 - y_delay * 2)) * 176 + (cur_x + 8) + 1 - (8 - x_delay) + BORDER_OFFSET] = ColorToRGBA(loc_color); + FrameBuffer[(loc_y * 2 + cur_y - (16 - y_delay * 2)) * 176 + cur_x + x_delay + 1 + BORDER_OFFSET] = ColorToRGBA(loc_color); } //a MOB does not need to be visible for it to be interracting //special case: a mob with x position 0 is counted as off @@ -797,15 +800,15 @@ namespace BizHawk.Emulation.Cores.Intellivision { cur_y = j * y_size + m; - if ((cur_x) < (167 - x_delay) && ((loc_y + 4 * y_size) * 2 + cur_y) < (208 - y_delay * 2) && pixel && vis && (cur_x) >= (8 - x_delay) && ((loc_y + 4 * y_size) * 2 + cur_y) >= (16 - y_delay * 2)) + if ((cur_x) < (167 - x_delay) && ((loc_y + 4 * y_size) * 2 + cur_y) < (208 - y_delay * 2) && pixel && vis && cur_x >= (8 - x_delay) && ((loc_y + 4 * y_size) * 2 + cur_y) >= (16 - y_delay * 2)) { if (!(priority && (Collision[cur_x, (loc_y + 4 * y_size) * 2 + cur_y] & 0x100) > 0)) - FrameBuffer[((loc_y + 4 * y_size) * 2 + cur_y - (16 - y_delay * 2)) * 176 + (cur_x + 8) - (8 - x_delay) + BORDER_OFFSET] = ColorToRGBA(loc_color); + FrameBuffer[((loc_y + 4 * y_size) * 2 + cur_y - (16 - y_delay * 2)) * 176 + cur_x + x_delay + BORDER_OFFSET] = ColorToRGBA(loc_color); } // a MOB does not need to be visible for it to be interracting // special case: a mob with x position 0 is counted as off - if (intr && pixel && (cur_x) <= 167 && ((loc_y + 4 * y_size) * 2 + cur_y) < 210 && loc_x != 0) + if (intr && pixel && cur_x <= 167 && ((loc_y + 4 * y_size) * 2 + cur_y) < 210 && loc_x != 0) { Collision[cur_x, (loc_y + 4 * y_size) * 2 + cur_y] |= (ushort)(1 << i); } @@ -815,7 +818,7 @@ namespace BizHawk.Emulation.Cores.Intellivision if ((cur_x + 1) < (167 - x_delay) && ((loc_y + 4 * y_size) * 2 + cur_y) < (208 - y_delay * 2) && pixel && vis && (cur_x + 1) >= (8 - x_delay) && ((loc_y + 4 * y_size) * 2 + cur_y) >= (16 - y_delay * 2)) { if (!(priority && (Collision[cur_x + 1, (loc_y + 4 * y_size) * 2 + cur_y] & 0x100) > 0)) - FrameBuffer[((loc_y + 4 * y_size) * 2 + cur_y - (16 - y_delay * 2)) * 176 + (cur_x + 8) + 1 - (8 - x_delay) + BORDER_OFFSET] = ColorToRGBA(loc_color); + FrameBuffer[((loc_y + 4 * y_size) * 2 + cur_y - (16 - y_delay * 2)) * 176 + cur_x + x_delay + 1 + BORDER_OFFSET] = ColorToRGBA(loc_color); } // a MOB does not need to be visible for it to be interracting @@ -833,8 +836,8 @@ namespace BizHawk.Emulation.Cores.Intellivision // by now we have collision information for all 8 mobs and the BG // so we can store data in the collision registers here - int x_border = Register[0x32].Bit(0) ? 15-x_delay : 7-x_delay; - int y_border = Register[0x32].Bit(1) ? 30-y_delay*2 : 14-y_delay*2; + int x_border = Register[0x32].Bit(0) ? 15 - x_delay : 7 - x_delay; + int y_border = Register[0x32].Bit(1) ? 30 - y_delay * 2 : 14 - y_delay * 2; int x_border_2 = Register[0x32].Bit(0) ? 8 : 0; int y_border_2 = Register[0x32].Bit(1) ? 16 : 0; @@ -844,17 +847,17 @@ namespace BizHawk.Emulation.Cores.Intellivision for (int j = 0; j < 210; j++) { // while we are here we can set collision detection bits for the border region - if (i == x_border || i == (167-x_delay)) + if (i == x_border || i == (167 - x_delay)) { Collision[i, j] |= (1 << 9); } - if (j == y_border || j == y_border+1 || j == (208-y_delay*2) || j == (208 - y_delay * 2+1)) + if (j == y_border || j == y_border + 1 || j == (208 - y_delay * 2) || j == (208 - y_delay * 2 + 1)) { Collision[i, j] |= (1 << 9); } // and also make sure the border region is all the border color - if ((i-x_delay)>=0 && (i-x_delay)<=159 && (j-y_delay*2)>=0 && (j-y_delay*2)<192) + if ((i-x_delay)>=0 && (i-x_delay) <= 159 && (j-y_delay*2) >= 0 && (j-y_delay*2) < 192) { if ((i-x_delay) < x_border_2) FrameBuffer[(j - y_delay*2) * 176 + ((i + 8) - x_delay) + BORDER_OFFSET] = ColorToRGBA(Register[0x2C] & 0xF); @@ -869,7 +872,7 @@ namespace BizHawk.Emulation.Cores.Intellivision } // the extra condition here is to ignore only border/BG collsion bit set - if (Collision[i, j] != 0 && Collision[i,j] != (1<<9) && Collision[i,j] != (1<<8)) + if (Collision[i, j] != 0 && Collision[i,j] != (1 << 9) && Collision[i,j] != (1 << 8)) { for (int k = 0; k < 8; k++) { From a0c84f4669e0225fd065d0675cbefb064d8ae4e7 Mon Sep 17 00:00:00 2001 From: zeromus Date: Sun, 23 Jul 2017 10:00:40 -0500 Subject: [PATCH 92/93] fix luainterface --- LuaInterface/LuaInterface/ObjectTranslator.cs | 2 +- output/dll/LuaInterface.dll | Bin 60928 -> 60928 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/LuaInterface/LuaInterface/ObjectTranslator.cs b/LuaInterface/LuaInterface/ObjectTranslator.cs index bfe99fc5d8..193763378f 100644 --- a/LuaInterface/LuaInterface/ObjectTranslator.cs +++ b/LuaInterface/LuaInterface/ObjectTranslator.cs @@ -807,7 +807,7 @@ namespace NLua else if (o is Lua) { var lua = o as Lua; - LuaDLL.lua_pushnil(lua.luaState); + LuaDLL.lua_pushthread(lua.luaState); LuaDLL.lua_xmove(lua.luaState, luaState, 1); } else diff --git a/output/dll/LuaInterface.dll b/output/dll/LuaInterface.dll index 96baa9427ea63c5c3d40baac469cd72c4b632830..f566c8a5a4682a32bcf3123643a87fbc463fe271 100644 GIT binary patch delta 10884 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 KBmS7Q_x}QB!SYG~ From 5d22dfac0e43ab84b02fe0997655bc89f1d6a8d7 Mon Sep 17 00:00:00 2001 From: zeromus Date: Sun, 23 Jul 2017 10:16:55 -0500 Subject: [PATCH 93/93] fix custom listview win32 structs for 64bits (not 100% sure I did this correctly) --- BizHawk.Client.EmuHawk/CustomControls/VirtualListView.cs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/BizHawk.Client.EmuHawk/CustomControls/VirtualListView.cs b/BizHawk.Client.EmuHawk/CustomControls/VirtualListView.cs index 0ae416b548..f0a2d07909 100644 --- a/BizHawk.Client.EmuHawk/CustomControls/VirtualListView.cs +++ b/BizHawk.Client.EmuHawk/CustomControls/VirtualListView.cs @@ -54,9 +54,10 @@ namespace BizHawk.Client.EmuHawk public uint dwDrawStage; public IntPtr Hdc; public RECT Rect; - public int dwItemSpec; + public IntPtr dwItemSpec; public uint ItemState; - public int lItemlParam; + private int _pad64bits; + public IntPtr lItemlParam; } [StructLayout(LayoutKind.Sequential)] @@ -596,7 +597,7 @@ namespace BizHawk.Client.EmuHawk if (QueryItemBkColor != null) { var color = Color.FromArgb(cd.ClearTextBackground & 0xFF, (cd.ClearTextBackground >> 8) & 0xFF, (cd.ClearTextBackground >> 16) & 0xFF); - QueryItemBkColor(cd.Nmcd.dwItemSpec, cd.SubItem, ref color); + QueryItemBkColor(cd.Nmcd.dwItemSpec.ToInt32(), cd.SubItem, ref color); cd.ClearTextBackground = (color.B << 16) | (color.G << 8) | color.R; Marshal.StructureToPtr(cd, m.LParam, false); }

    Bn?^yi9 zc@&(h$j7-PO2dZVbGNXa(Vt?3Ts?}zBuM>++rt(h=j7lu^^cjMTc)oN_3K0Z9o6($ z%y6ceYsFkAg6kQVv3ee~PwPHs=&pLRA$p^89dwWOTWb>6_Vt<5`k1km2t)0F^XS9f zkndz&$AdNM09kvXbwBRt=S`O}xsu262&mA`5D0V1I|tAoq4ty>n5ZBVh<$9_cLdi*BGZY zy=~Mc=E0mZliSZXi(cZlJ)d>Yu41#2LI{OL@(@vQV3#-6^Kp;ur10WEDAP@)y0*M5NL?Tcq-oRsN$Ocd-Uh>cH z|6V(j%rtE#d7=YQUhTX2z&Ci=Er7T4e(xPWhp0SjzgnN~NqL^~8HZIqQ}LKji|lp~ zD#Y)szm$)WS|r!+cKvVH>vnzf3qziCOIoGto1`6gA8DU-NIE0ARe9h;0CX;bJdwI> zk`4|nM=L`~2IEGgSZ#MiCJ`pkPGYJ}w`x!nP|p$z^@4t5UX_-{kZ%YD(`ZM>rcks; zg;J4_3$9Yn@+I3Ve8q>O0b$RN1R=C4AqH&$93 zxc6e6V+KF`*q~^`Pe%m!?Z*Y;0)&2SQ7NbfO3wj66r{a*7lRa2ndZ)$N1u0{x6Y@! zgXACByJFP@f*?91In(4IMT#^5o4{4!N=wTtE$t#P7jEHlyWH%lrG*aq}d5*Sm$Ian2rFWFE6f%*i%%qYaJE37pFVJ%t z3FRq0JrE5w(_BY7)12~uRpQJ_SH8Vy=> z=rLf#gc*bt8+IHxapA^;7ax8ec<7PGo_Ok+=U#Z}mDk>Q>z(&L_~?_*PQLo~r;_ft zEQG=^fCdA}tQCe~7=~dOhG7_nVHk$*7ewa?!!QiPgJBrXT)edZz;?Sk-03do-R&Ot zx&R>}#7K}LLyiI^D%5DuqC<}XBPPrsELgE&$AJ?UJZ?OA@d@%9gg^gMND;-9P)eU0 z-*0*vXrzf|B3fvrjdnWdq>DV=^w3KIha7Rt38$QK&IOlTam@|4+;PtXk38|r#0#&y z@y-XIe6i=7AAUKIP$G#XkyJ9trI1o8sil!tI_YJQQ6`y%WRX=i+2xQ^F7a~9Bd-J+ zYNW9ynrf!G7FuehwKm#nr@an3>ZG%hF1qTbyB>P#rCx7+^wq#Zi!8RpQp+s2!b+>G zw#HiPthd2Nn`}0+#a7#Fx5G}m%-bJ3b)*0x6a@h^48t%C!!QiPFbu;m48t&J<_?Bo z7=~dOhT(p~`tJLPbME<>-`RtY03jm8NRT2!jshhr)M(J6LyrL?CI|~wY}j$&#DyCV zUU>8wFl5A-2~%dwS+Hcqnhjfa>^X4cL~-HDjXMvXym<5BOV4}@EVOTyCzCC<+Ge{Q zcG_jPJ@%R>Ux7kJij^o;rd)+eRjSpfRi|EqMmNE)PEfc9+ym}`zklGf1YY32ed5c3 z3yUaCQ3uvDH1LAYA;3{C5G)fI7Vv`i@j&7e#NcI6!RrT5N1T`85A$ewH(K6}mUknq cyki&vfDefEQZwSyKm+j%0DSd_;0_E90AA8jMF0Q* literal 317036 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 ym-UchhO7V004 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