Update to v079 release.

byuu says:

This release includes Nintendo Super System DIP switch emulation and
improved PPU rendering accuracy, among other things.

Changelog:
- added Nintendo Super System DIP switch emulation [requires XML setting
  maps]
- emulated Super Game Boy $6001 VRAM offset selection port [ikari_01]
- fixed randomness initialization of S-SMP port registers [fixes
  DBZ:Hyper Dimension and Ninja Warriors]
- mosaic V-countdown caches BGOFS registers (fixes Super Turrican
  2 effect) [reported by zal16]
- non-mosaic BGOFS registers are always cached at H=60 (fixes NHL '94
  and Super Mario World flickering)
- fixed 2xSaI family of renderers on 64-bit systems
- cleaned up SMP source code
- phoenix: fixed a bug when closing bsnes while minimized

Please note that the mosaic BGOFS fix is only for the accuracy profile.
Unfortunately the older scanline-based compatibility renderer's code is
nearly unmaintainable at this point, so I haven't yet been able to
backport the fixes.

Also, I have written a new cycle-accurate SMP core that does not use
libco. The aim is to implement it into Snes9X v1.54. But it would of
course be prudent to test the new core first.

[...then in the next post...]

Decided to keep that Super Mario World part a surprise, so ... surprise!

Realized while working on the Super Turrican 2 mosaic fix, and from
looking at NHL '94 and Dai Kaijuu Monogatari 2's behavior, that BGOFS
registers must be cached between H=0 and H=88 for the entire scanline
... they can't work otherwise, and it'd be stupid for the PPU to re-add
the offset to the position on every pixel anyway. I chose H=60 for now.
Once I am set up with the RGB monitor and the North American cartridge
dumping is completed, I'll set it on getting exact timings for all these
things. It'll probably require a smallish speed hit to allow exact-cycle
timing events for everything in the PPU.
This commit is contained in:
Tim Allen 2011-06-05 13:45:04 +10:00
parent d129b72ced
commit 2a90e12999
38 changed files with 784 additions and 219 deletions

View File

@ -1673,6 +1673,10 @@
</cheat>
<cheat>
<description>Have Fezi-copter</description>
<code>6DAC-6FDD</code>
</cheat>
<cheat>
<description>Have Fezi-copter (alt)</description>
<code>7E0064FF</code>
</cheat>
<cheat>
@ -3535,7 +3539,6 @@
<cheat>
<description>Invincibility</description>
<code>2D87-AD04</code>
<code>EDA6-AFDD</code>
</cheat>
<cheat>
<description>Infinite lives</description>
@ -5042,6 +5045,10 @@
</cartridge>
<cartridge sha256="de1de85ad549a6aaf0431cceb47cbd07e1f6e81f9e16fd62575305e2c1f06240">
<name>BioMetal (USA)</name>
<cheat>
<description>Invincibility (blinking)</description>
<code>406D-DDD2</code>
</cheat>
<cheat>
<description>Infinite lives</description>
<code>C26E-6D02</code>
@ -9409,6 +9416,14 @@
</cartridge>
<cartridge sha256="7c722f9941957630467c1784d0eb3f92fbfc0a2a1da3c8f5c27f593eca2a5a04">
<name>Cutthroat Island (USA)</name>
<cheat>
<description>Stage select menu after character select screen</description>
<code>3C6B-479E</code>
</cheat>
<cheat>
<description>Stage select menu after character select screen (alt)</description>
<code>878C9DEA</code>
</cheat>
<cheat>
<description>Infinite health - P1</description>
<code>7E09F428</code>
@ -17330,6 +17345,18 @@
<description>Infinite time</description>
<code>A2C0-A7D0</code>
</cheat>
<cheat>
<description>Hit anywhere</description>
<code>3CA4-0FD0</code>
<code>40AD-04A0</code>
<code>7DA4-0F00</code>
<code>89A4-0D60</code>
<code>F9A4-0DA0</code>
</cheat>
<cheat>
<description>Enemies never get knocked down, attack until they die</description>
<code>7E0D7000</code>
</cheat>
<cheat>
<description>Slower timer</description>
<code>D4C9-AFD0</code>
@ -17338,10 +17365,6 @@
<description>Faster timer</description>
<code>DDC9-AFD0</code>
</cheat>
<cheat>
<description>Enemies never get knocked down, hit them until they die</description>
<code>7E0D7000</code>
</cheat>
<cheat>
<description>Enemy 1 has no health</description>
<code>7E101400</code>
@ -24315,6 +24338,19 @@
<description>Infinite Arrows</description>
<code>17E5-22E6</code>
</cheat>
<cheat>
<description>Hit anywhere (disable before fighting Ganon, use the Boomerang instead of Sword to hit switches)</description>
<code>40E2-6D96</code>
<code>6D3E-A7FC</code>
<code>403F-DD28</code>
<code>40EC-AF26</code>
<code>6D34-D7F8</code>
<code>4068-A0E6</code>
</cheat>
<cheat>
<description>Get items from anywhere</description>
<code>402F-07B6</code>
</cheat>
<cheat>
<description>Always get Faerie at the Pond Of Happiness (as if you threw in 100 rupees)</description>
<code>7EF36A64</code>
@ -24336,7 +24372,7 @@
<code>DDB5-049E</code>
</cheat>
<cheat>
<description>Enemies that normally drop items will drop them 100% of the time</description>
<description>100% enemy drop rate (from enemies that normally drop items)</description>
<code>DDE8-142C</code>
</cheat>
<cheat>
@ -30756,6 +30792,10 @@
<description>One hit kills</description>
<code>40DE-7FD2</code>
</cheat>
<cheat>
<description>Hit anywhere</description>
<code>6DD8-7DD2</code>
</cheat>
<cheat>
<description>Multi-jump</description>
<code>1DFC-E400</code>
@ -30805,6 +30845,10 @@
<description>One hit kills (most enemies)</description>
<code>6DB5-CD97</code>
</cheat>
<cheat>
<description>Hit anywhere</description>
<code>40B1-34F4</code>
</cheat>
<cheat>
<description>Immune to drain attack</description>
<code>C2AD-4401</code>
@ -30890,10 +30934,6 @@
<description>Infinite lives (alt)</description>
<code>7E1F8009</code>
</cheat>
<cheat>
<description>Start with all weapons and all enemies defeated (except Sigma)</description>
<code>23BD-3F07</code>
</cheat>
<cheat>
<description>Infinite weapons once obtained</description>
<code>C9B3-4769</code>
@ -30902,6 +30942,10 @@
<description>One hit kills (most enemies)</description>
<code>6DB5-CD97</code>
</cheat>
<cheat>
<description>Hit anywhere</description>
<code>40B1-34F4</code>
</cheat>
<cheat>
<description>Have all equipment</description>
<code>7E1F99FF</code>
@ -30944,6 +30988,10 @@
<description>Weapon charges to 1st power level faster</description>
<code>DDB1-4F61</code>
</cheat>
<cheat>
<description>Start with all weapons and all enemies defeated (except Sigma)</description>
<code>23BD-3F07</code>
</cheat>
<cheat>
<description>Start with less health</description>
<code>D6BE-47AF</code>
@ -31063,6 +31111,12 @@
<description>Have sub-tank 4 full</description>
<code>7E1FB9FF</code>
</cheat>
<cheat>
<description>Hit anywhere</description>
<code>4028-A73F</code>
<code>C222-6734</code>
<code>D4E7-DDFB</code>
</cheat>
<cheat>
<description>One hit kills</description>
<code>6D2D-AF14</code>
@ -31084,10 +31138,6 @@
<description>Infinite health</description>
<code>C2AD-6FF7</code>
</cheat>
<cheat>
<description>Start with max health bar</description>
<code>F02A-ADF4</code>
</cheat>
<cheat>
<description>Infinite lives</description>
<code>7E1FB409</code>
@ -31108,14 +31158,14 @@
<code>82CB-0D2F</code>
<code>82CA-0F2F</code>
</cheat>
<cheat>
<description>Always Super Shot</description>
<code>7E0A6702</code>
</cheat>
<cheat>
<description>Infinite Air Dash</description>
<code>7E0A3478</code>
</cheat>
<cheat>
<description>Always have Super Shot</description>
<code>7E0A6702</code>
</cheat>
<cheat>
<description>Have Zero-Saber</description>
<code>7E1FB2FC</code>
@ -31129,8 +31179,10 @@
<code>7E0CF801</code>
</cheat>
<cheat>
<description>Skip bosses at start of game and proceed to stage select</description>
<code>B933-DF6C</code>
<description>Hit anywhere</description>
<code>40AC-A7B4</code>
<code>6DA0-ADF7</code>
<code>6DAF-AD97</code>
</cheat>
<cheat>
<description>Multi-jump</description>
@ -31150,6 +31202,14 @@
<description>Ultra mega-jump</description>
<code>D886-6F26</code>
</cheat>
<cheat>
<description>Skip bosses at start of game and proceed to stage select</description>
<code>B933-DF6C</code>
</cheat>
<cheat>
<description>Start with max health bar</description>
<code>F02A-ADF4</code>
</cheat>
</cartridge>
<cartridge sha256="d4f2cb6b209db29f7aec62e5a23846681c14665fb007e94d7bcfc7b5611e938b">
<name>Metal Combat - Falcon's Revenge (USA)</name>
@ -31984,6 +32044,13 @@
<description>First strike of any kind wins round</description>
<code>DDBC-370F</code>
</cheat>
<cheat>
<description>Hit anywhere - P1</description>
<code>3DBF-3D0F</code>
<code>27BF-3D6F</code>
<code>F6BF-3DAF</code>
<code>74BF-3F0F</code>
</cheat>
<cheat>
<description>All throws do more damage</description>
<code>56B9-4DAD</code>
@ -32507,13 +32574,37 @@
<code>C239-CD62</code>
</cheat>
<cheat>
<description>First round / one button fatalities</description>
<description>First round and one button fatalities</description>
<code>7E3AF001</code>
</cheat>
<cheat>
<description>Infinite continues</description>
<code>A220-3FB6</code>
</cheat>
<cheat>
<description>P1 takes all damage</description>
<code>DD37-CF62</code>
</cheat>
<cheat>
<description>P2 takes all damage</description>
<code>6D37-CF02</code>
</cheat>
<cheat>
<description>Hit anywhere - P1</description>
<code>0AE6-3F0E</code>
<code>0AE6-340E</code>
<code>0AE6-34DE</code>
<code>39E6-346E</code>
<code>39E6-3FAE</code>
<code>3DE6-3DDE</code>
<code>6D30-1462</code>
<code>C4E6-3F6E</code>
<code>D4E6-3D0E</code>
<code>DDE6-3D6E</code>
<code>EDE6-3DAE</code>
<code>D7E6-3FDE</code>
<code>EE30-14A2</code>
</cheat>
<cheat>
<description>Press A on main menu for Sound Test</description>
<code>D42E-44D8</code>
@ -32530,14 +32621,6 @@
<description>Press X on main menu for Scott's Menu</description>
<code>D42B-1FD8</code>
</cheat>
<cheat>
<description>P1 takes all damage</description>
<code>DD37-CF62</code>
</cheat>
<cheat>
<description>P2 takes all damage</description>
<code>6D37-CF02</code>
</cheat>
<cheat>
<description>Always fight Kano</description>
<code>CE8F-3FB7</code>
@ -32710,6 +32793,10 @@
<description>Infinite time</description>
<code>6DC7-1DAA</code>
</cheat>
<cheat>
<description>Infinite continues</description>
<code>C2C4-47AA</code>
</cheat>
<cheat>
<description>No health - P1</description>
<code>DDB1-1FF7</code>
@ -32719,12 +32806,15 @@
<code>DDB5-1FF7</code>
</cheat>
<cheat>
<description>Have 127x more fatality time</description>
<code>5EC2-CF02</code>
<description>Hit anywhere - P1</description>
<code>0DB0-4F97</code>
<code>2DB0-4FF7</code>
<code>3DB0-4D97</code>
<code>DDB0-4DB7</code>
</cheat>
<cheat>
<description>Infinite continues</description>
<code>C2C4-47AA</code>
<description>Have 127x more fatality time</description>
<code>5EC2-CF02</code>
</cheat>
<cheat>
<description>Disable throws - 2P mode</description>
@ -44004,6 +44094,13 @@
<code>DD80-7FAD</code>
<code>D580-74DD</code>
</cheat>
<cheat>
<description>Hit anywhere (except projectiles) - P1</description>
<code>3DC7-8D0D</code>
<code>6DC7-8D6D</code>
<code>BDC7-8FDD</code>
<code>DBC7-8DAD</code>
</cheat>
</cartridge>
<cartridge sha256="2b34161e96ef3f0f48cecd67e531a9bb94310652d8686f301bac426e4ab97e77">
<name>Street Fighter II (USA)</name>
@ -44017,6 +44114,13 @@
<description>Win 1 bout to win the match instead of 2 out of 3 (disable before fighting M. Bison)</description>
<code>DF80-AD64</code>
</cheat>
<cheat>
<description>Hit anywhere (except projectiles) - P1</description>
<code>3D29-A4A7</code>
<code>8D29-A767</code>
<code>DD29-A7D7</code>
<code>D329-A707</code>
</cheat>
<cheat>
<description>Dizziness wears off very quickly</description>
<code>EDBE-0F09</code>
@ -44389,6 +44493,13 @@
<description>Infinite time (alt)</description>
<code>7E18F399</code>
</cheat>
<cheat>
<description>Hit anywhere (except projectiles) - P1</description>
<code>3D98-8704</code>
<code>8D9A-8DD4</code>
<code>DD98-8764</code>
<code>D598-87A4</code>
</cheat>
<cheat>
<description>Select same character - both players</description>
<code>7E184820</code>
@ -46655,19 +46766,19 @@
<cartridge sha256="bcced1be76ef920b562a555696bcb4583d1c8cea4d4b057cab6e0e09be8ef8c4">
<name>Super Double Dragon (USA)</name>
<cheat>
<description>Invincibility</description>
<code>C267-0DD6</code>
</cheat>
<cheat>
<description>Infinite health</description>
<description>Invincibility - both players</description>
<code>1D6F-0766</code>
</cheat>
<cheat>
<description>Infinite lives</description>
<code>C286-6F05</code>
<description>Invincibility - P1</description>
<code>C267-0DD6</code>
</cheat>
<cheat>
<description>Infinite lives - P1</description>
<code>C286-6F05</code>
</cheat>
<cheat>
<description>Infinite lives - P1 (alt)</description>
<code>4A86-6F05</code>
</cheat>
<cheat>
@ -46706,6 +46817,30 @@
<description>1 life - 2P game A</description>
<code>DF88-0D6B</code>
</cheat>
<cheat>
<description>Start on Mission 2 (enable on Mode Seclect screen, then disable)</description>
<code>7E001C14</code>
</cheat>
<cheat>
<description>Start on Mission 3 (enable on Mode Seclect screen, then disable)</description>
<code>7E001C17</code>
</cheat>
<cheat>
<description>Start on Mission 4 (enable on Mode Seclect screen, then disable)</description>
<code>7E001C1C</code>
</cheat>
<cheat>
<description>Start on Mission 5 (enable on Mode Seclect screen, then disable)</description>
<code>7E001C1D</code>
</cheat>
<cheat>
<description>Start on Mission 6 (enable on Mode Seclect screen, then disable)</description>
<code>7E001C1F</code>
</cheat>
<cheat>
<description>Start on Mission 7 (enable on Mode Seclect screen, then disable)</description>
<code>7E001C20</code>
</cheat>
</cartridge>
<cartridge sha256="7468c271d7240cf4e0d08c16e9969a1b1b1caf5adc0e5adc568d93c92651a057">
<name>Super Ghouls'n Ghosts (USA)</name>
@ -46896,6 +47031,11 @@
<name>Super Mario All-Stars (USA)</name>
<cheat>
<description>(SMB) Invincibility</description>
<code>62E7-A7D2</code>
<code>2DE7-A7A2</code>
</cheat>
<cheat>
<description>(SMB) Invincibility (Starman effect)</description>
<code>292B-67DE</code>
</cheat>
<cheat>
@ -46923,16 +47063,27 @@
<code>6D84-DF03</code>
</cheat>
<cheat>
<description>(SMB) Play as Big Mario</description>
<code>7E07AE05</code>
</cheat>
<cheat>
<description>(SMB) Play as Fire Mario</description>
<code>23C2BB03</code>
<description>(SMB) Always Fiery Mario after first hit</description>
<code>CB29-AF0E</code>
<code>D429-AF6E</code>
<code>CB8B-676A</code>
<code>DD8B-67AA</code>
</cheat>
<cheat>
<description>(SMB) Multi-jump</description>
<code>23C2BB02</code>
<code>2D8E-D7D2</code>
</cheat>
<cheat>
<description>(SMB) Fireballs hit anywhere</description>
<code>4028-D4DE</code>
</cheat>
<cheat>
<description>(SMB) Fireballs can kill Bullet Bill</description>
<code>4025-07AE</code>
</cheat>
<cheat>
<description>(SMB) Fireballs can kill Buzzy Beetle</description>
<code>6D2E-DD6E</code>
</cheat>
<cheat>
<description>(SMB) Run without holding the dash button</description>
@ -47022,13 +47173,21 @@
<code>7E00853B</code>
</cheat>
<cheat>
<description>(SMB2) Always big</description>
<description>(SMB2) Infinite hearts</description>
<code>DD32-6966</code>
</cheat>
<cheat>
<description>(SMB2) Always big Mario</description>
<code>7E04C31F</code>
</cheat>
<cheat>
<description>(SMB2) Always small</description>
<description>(SMB2) Always small Mario</description>
<code>7E04C30F</code>
</cheat>
<cheat>
<description>(SMB2) Infinite lives</description>
<code>C26E-D5A6</code>
</cheat>
<cheat>
<description>(SMB2) Multi-jump - all characters</description>
<code>D966-6166</code>
@ -47061,10 +47220,6 @@
<description>(SMB2) 99 lives after continue</description>
<code>1761-05D0</code>
</cheat>
<cheat>
<description>(SMB2) Infinite lives</description>
<code>C26E-D5A6</code>
</cheat>
<cheat>
<description>(SMB2) Continue with 3 hearts instead of 2</description>
<code>DF6B-A9A1</code>
@ -47073,10 +47228,6 @@
<description>(SMB2) Continue with 4 hearts</description>
<code>D46B-A9A1</code>
</cheat>
<cheat>
<description>(SMB2) Never lose hearts</description>
<code>DD32-6966</code>
</cheat>
<cheat>
<description>(SMB2) Jumping in place charges super jump</description>
<code>7A60-A966</code>
@ -47097,38 +47248,55 @@
<description>(SMB3) Invincibility (Starman)</description>
<code>7E0553FF</code>
</cheat>
<cheat>
<description>(SMB3) Infinite lives</description>
<code>82BB-0C6D</code>
</cheat>
<cheat>
<description>(SMB3) Infinite time</description>
<code>6D3D-6619</code>
</cheat>
<cheat>
<description>(SMB3) Play as Small Mario</description>
<description>(SMB3) Always Small Mario</description>
<code>7E00BB00</code>
</cheat>
<cheat>
<description>(SMB3) Play as Big Mario</description>
<description>(SMB3) Always Big Mario</description>
<code>7E00BB01</code>
</cheat>
<cheat>
<description>(SMB3) Play as Fire Mario</description>
<description>(SMB3) Always Fire Mario</description>
<code>7E00BB02</code>
</cheat>
<cheat>
<description>(SMB3) Play as Raccoon Mario</description>
<description>(SMB3) Always Raccoon Mario</description>
<code>7E00BB03</code>
</cheat>
<cheat>
<description>(SMB3) Play as Frog Mario</description>
<description>(SMB3) Always Frog Mario</description>
<code>7E00BB04</code>
</cheat>
<cheat>
<description>(SMB3) Play as Tanooki Mario</description>
<description>(SMB3) Always Tanooki Mario</description>
<code>7E00BB05</code>
</cheat>
<cheat>
<description>(SMB3) Play as Hammer Bros. Mario</description>
<description>(SMB3) Always Hammer Bros. Mario</description>
<code>7E00BB06</code>
</cheat>
<cheat>
<description>(SMB3) Fireballs hit anywhere</description>
<code>4083-D8F3</code>
<code>408D-08F3</code>
</cheat>
<cheat>
<description>(SMB3) Tail hits anywhere</description>
<code>40C4-6C22</code>
</cheat>
<cheat>
<description>(SMB3) Fireballs can kill most enemies</description>
<code>4084-0BB3</code>
</cheat>
<cheat>
<description>(SMB3) Have Magic Whistle</description>
<code>7E1D800C</code>
@ -47146,7 +47314,7 @@
<code>DDAF-A8A3</code>
</cheat>
<cheat>
<description>(SMB3) Fly for an unlimited amount of time</description>
<description>(SMB3) Infinite flying time</description>
<code>EEA4-AB63</code>
</cheat>
<cheat>
@ -47216,10 +47384,6 @@
<description>(SMB3) After getting star, invincible until end of level (may have to disable to jump)</description>
<code>C23B-680D</code>
</cheat>
<cheat>
<description>(SMB3) Infinite lives</description>
<code>82BB-0C6D</code>
</cheat>
<cheat>
<description>(SMB3) 1 life after continue</description>
<code>DFBB-DBAF</code>
@ -47289,13 +47453,13 @@
<name>Super Mario All-Stars + Super Mario World (USA)</name>
<cheat>
<description>(SMB) Invincibility</description>
<code>292B-67DE</code>
</cheat>
<cheat>
<description>(SMB) Invincibility (alt)</description>
<code>62E7-A7D2</code>
<code>2DE7-A7A2</code>
</cheat>
<cheat>
<description>(SMB) Invincibility (Starman effect)</description>
<code>292B-67DE</code>
</cheat>
<cheat>
<description>(SMB) Invincibility (Starman)</description>
<code>7E07AF0F</code>
@ -47305,21 +47469,28 @@
<code>7E075A05</code>
</cheat>
<cheat>
<description>(SMB) Play as Big Mario</description>
<code>7E07AE05</code>
</cheat>
<cheat>
<description>(SMB) Play as Big Mario (alt)</description>
<code>23C2BB02</code>
</cheat>
<cheat>
<description>(SMB) Play as Fire Mario</description>
<code>23C2BB03</code>
<description>(SMB) Always Fiery Mario after first hit</description>
<code>CB29-AF0E</code>
<code>D429-AF6E</code>
<code>CB8B-676A</code>
<code>DD8B-67AA</code>
</cheat>
<cheat>
<description>(SMB) Multi-jump</description>
<code>2D8E-D7D2</code>
</cheat>
<cheat>
<description>(SMB) Fireballs hit anywhere</description>
<code>4028-D4DE</code>
</cheat>
<cheat>
<description>(SMB) Fireballs can kill Bullet Bill</description>
<code>4025-07AE</code>
</cheat>
<cheat>
<description>(SMB) Fireballs can kill Buzzy Beetle</description>
<code>6D2E-DD6E</code>
</cheat>
<cheat>
<description>(SMB) Run without holding the dash button</description>
<code>DD8E-D702</code>
@ -47341,17 +47512,9 @@
<code>C26E-D5A6</code>
</cheat>
<cheat>
<description>(SMB2) Never lose hearts</description>
<description>(SMB2) Infinite hearts</description>
<code>DD32-6966</code>
</cheat>
<cheat>
<description>(SMB2) Always Big</description>
<code>7E04C31F</code>
</cheat>
<cheat>
<description>(SMB2) Always Small</description>
<code>7E04C30F</code>
</cheat>
<cheat>
<description>(SMB2) Multi-jump - all characters</description>
<code>D966-6166</code>
@ -47381,33 +47544,37 @@
<code>7E0553FF</code>
</cheat>
<cheat>
<description>(SMB3) Play as Small Mario</description>
<description>(SMB3) Always Small Mario</description>
<code>7E00BB00</code>
</cheat>
<cheat>
<description>(SMB3) Play as Big Mario</description>
<description>(SMB3) Always Big Mario</description>
<code>7E00BB01</code>
</cheat>
<cheat>
<description>(SMB3) Play as Fire Mario</description>
<description>(SMB3) Always Fiery Mario</description>
<code>7E00BB02</code>
</cheat>
<cheat>
<description>(SMB3) Play as Raccoon Mario</description>
<description>(SMB3) Always Raccoon Mario</description>
<code>7E00BB03</code>
</cheat>
<cheat>
<description>(SMB3) Play as Frog Mario</description>
<description>(SMB3) Always Frog Mario</description>
<code>7E00BB04</code>
</cheat>
<cheat>
<description>(SMB3) Play as Tanooki Mario</description>
<description>(SMB3) Always Tanooki Mario</description>
<code>7E00BB05</code>
</cheat>
<cheat>
<description>(SMB3) Play as Hammer Bros Mario</description>
<description>(SMB3) Always Hammer Bros Mario</description>
<code>7E00BB06</code>
</cheat>
<cheat>
<description>(SMB3) Infinite flying time</description>
<code>23CB26FF</code>
</cheat>
<cheat>
<description>(SMB3) Have Magic Whistle</description>
<code>7E1D800C</code>
@ -47417,12 +47584,17 @@
<code>7E056EFF</code>
</cheat>
<cheat>
<description>(SMB3) Fly at anytime (run meter always full)</description>
<code>23CB1F00</code>
<description>(SMB3) Fireballs hit anywhere</description>
<code>4083-D8F3</code>
<code>408D-08F3</code>
</cheat>
<cheat>
<description>(SMB3) Fly for an unlimited amount of time</description>
<code>23CB26FF</code>
<description>(SMB3) Tail hits anywhere</description>
<code>40C4-6C22</code>
</cheat>
<cheat>
<description>(SMB3) Fireballs can kill most enemies</description>
<code>4084-0BB3</code>
</cheat>
<cheat>
<description>(SMW) Invincibility</description>
@ -47445,9 +47617,13 @@
<code>7E001902</code>
</cheat>
<cheat>
<description>(SMW) Always Fire Mario</description>
<description>(SMW) Always Fiery Mario</description>
<code>7E001903</code>
</cheat>
<cheat>
<description>(SMW) Always have Yoshi</description>
<code>7E0DC101</code>
</cheat>
<cheat>
<description>(SMW) Infinite time</description>
<code>7E0F3109</code>
@ -47458,10 +47634,6 @@
<description>(SMW) Infinite P-Balloon time</description>
<code>7E1891FF</code>
</cheat>
<cheat>
<description>(SMW) Always have Yoshi</description>
<code>7E0DC101</code>
</cheat>
<cheat>
<description>(SMW) Infinite flying time for Yoshi</description>
<code>C2EC-0700</code>
@ -47892,6 +48064,10 @@
<code>89E4-AFD9</code>
<code>89C6-D4DB</code>
</cheat>
<cheat>
<description>Infinite lives</description>
<code>C222-D4DD</code>
</cheat>
<cheat>
<description>Infinite flying time for Yoshi</description>
<code>C2EC-0700</code>
@ -47905,8 +48081,24 @@
<code>7E1891FF</code>
</cheat>
<cheat>
<description>Infinite lives</description>
<code>C222-D4DD</code>
<description>Always Small Mario</description>
<code>7E001900</code>
</cheat>
<cheat>
<description>Always Big Mario</description>
<code>7E001901</code>
</cheat>
<cheat>
<description>Always Cape Mario</description>
<code>7E001902</code>
</cheat>
<cheat>
<description>Always Fiery Mario</description>
<code>7E001903</code>
</cheat>
<cheat>
<description>Always have Yoshi</description>
<code>7E0DC101</code>
</cheat>
<cheat>
<description>Multi-jump</description>
@ -47921,6 +48113,31 @@
<code>F53F-6767</code>
<code>DD3F-67A7</code>
</cheat>
<cheat>
<description>Cape hit anywhere</description>
<code>40BE-AD66</code>
</cheat>
<cheat>
<description>Fireballs hits anywhere</description>
<code>40C2-D7A6</code>
</cheat>
<cheat>
<description>Fireballs shoot straight</description>
<code>DDEA-6F07</code>
<code>DDB2-AFD8</code>
</cheat>
<cheat>
<description>Fireballs turn most enemies into Flowers</description>
<code>59C4-0466</code>
</cheat>
<cheat>
<description>Fireballs turn most enemies into 1-Up Mushrooms</description>
<code>56C4-0466</code>
</cheat>
<cheat>
<description>Fireballs turn most enemies into Starmen</description>
<code>51C4-0466</code>
</cheat>
<cheat>
<description>Low-jump</description>
<code>D02C-AF6F</code>
@ -47933,26 +48150,6 @@
<description>Mega-jump</description>
<code>DF2C-AF6F</code>
</cheat>
<cheat>
<description>Always Small Mario</description>
<code>7E001900</code>
</cheat>
<cheat>
<description>Always Big Mario</description>
<code>7E001901</code>
</cheat>
<cheat>
<description>Always Cape Mario</description>
<code>7E001902</code>
</cheat>
<cheat>
<description>Always Fire Mario</description>
<code>7E001903</code>
</cheat>
<cheat>
<description>Always have Yoshi</description>
<code>7E0DC101</code>
</cheat>
<cheat>
<description>Little Yoshi grows after eating 1 enemy instead of 5</description>
<code>DFCE-64A0</code>
@ -47969,11 +48166,6 @@
<description>Little Yoshi grows after eating 4 enemies</description>
<code>D0CE-64A0</code>
</cheat>
<cheat>
<description>Shoot fireballs straight</description>
<code>DDEA-6F07</code>
<code>DDB2-AFD8</code>
</cheat>
<cheat>
<description>Activate green blocks (disable before entering the Green Switch Palace)</description>
<code>7E1F2701</code>
@ -48477,6 +48669,11 @@
<description>Super-jumps don't drain energy</description>
<code>C22A-456D</code>
</cheat>
<cheat>
<description>Enemies die on contact (Speed Booster effect)</description>
<code>6DC8-4CDF</code>
<code>6DCC-4BDF</code>
</cheat>
<cheat>
<description>Kill most enemies on contact (prevents bomb-bouncing)</description>
<code>7E0A6E0F</code>
@ -50434,6 +50631,13 @@
<description>Instant win - P1</description>
<code>7E0771FF</code>
</cheat>
<cheat>
<description>Hit anywhere (except projectiles) - P1</description>
<code>3D1D-5DDF</code>
<code>8D1D-5DAF</code>
<code>0D1D-5D0F</code>
<code>D51D-5D6F</code>
</cheat>
<cheat>
<description>No charging required for some special moves</description>
<code>D002-EDD5</code>
@ -54788,13 +54992,29 @@
<code>7D7B-FE7C</code>
</cheat>
<cheat>
<description>First round / one button fatalities</description>
<description>First round and one button fatalities</description>
<code>7E3BE301</code>
</cheat>
<cheat>
<description>Max fatality time</description>
<code>DF73-2A7C</code>
</cheat>
<cheat>
<description>Hit anywhere - P1</description>
<code>0AEB-3F97</code>
<code>0AEB-34F7</code>
<code>31EB-34B7</code>
<code>35EB-3F27</code>
<code>3DEB-3DF7</code>
<code>46EB-3FB7</code>
<code>84EB-3497</code>
<code>BD3C-C49F</code>
<code>D4EB-3D97</code>
<code>DDEB-3DB7</code>
<code>D7EB-3FF7</code>
<code>EDEB-3D27</code>
<code>EE3C-C4BF</code>
</cheat>
<cheat>
<description>Blank versus screen</description>
<code>EE37-CF02</code>
@ -55467,6 +55687,21 @@
<code>7E1B8963</code>
</cheat>
</cartridge>
<cartridge sha256="8b3ff3a0ca1c85facb71f42886291dfa916ca74245702c79ca8ae635f28bc864">
<name>Ushio to Tora (Japan)</name>
<cheat>
<description>Invincibility</description>
<code>7E022226</code>
</cheat>
<cheat>
<description>Infinite health</description>
<code>7E021E40</code>
</cheat>
<cheat>
<description>Infinite lives</description>
<code>7E060863</code>
</cheat>
</cartridge>
<cartridge sha256="2500d6c846c78bcb729f15535bf2b852a120411891cabaaaa6fc407906d0214e">
<name>Utopia - The Creation of a Nation (USA)</name>
<cheat>
@ -57692,15 +57927,15 @@
</cheat>
</cartridge>
<cartridge sha256="25414de02c6805ca62574cfb39c23bf292b3d8c4ff33eb8f212ccdbcd61c5ae3">
<name>Zool - Ninja of the Nth Dimension (USA)</name>
<name>Zool - Ninja of the 'Nth' Dimension (USA)</name>
<cheat>
<description>Invincibility</description>
<code>7E05DCFF</code>
</cheat>
<cheat>
<description>Invincibility (blinking)</description>
<code>7E1D8B49</code>
</cheat>
<cheat>
<description>Invincibility (not blinking)</description>
<code>7E05DCFF</code>
</cheat>
<cheat>
<description>Infinite health</description>
<code>7E1CF1FA</code>

View File

@ -42,20 +42,21 @@ struct directory {
if(wcscmp(data.cFileName, L".") && wcscmp(data.cFileName, L"..")) {
if(data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
string name = (const char*)utf8_t(data.cFileName);
if(wildcard(name, pattern)) list.append(string(name, "/"));
if(wildcard(name, pattern)) list.append(name);
}
}
while(FindNextFile(handle, &data) != false) {
if(wcscmp(data.cFileName, L".") && wcscmp(data.cFileName, L"..")) {
if(data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
string name = (const char*)utf8_t(data.cFileName);
if(wildcard(name, pattern)) list.append(string(name, "/"));
if(wildcard(name, pattern)) list.append(name);
}
}
}
FindClose(handle);
}
if(list.size() > 0) sort(&list[0], list.size());
foreach(name, list) name.append("/"); //must append after sorting
return list;
}
@ -109,14 +110,14 @@ struct directory {
if(!strcmp(ep->d_name, ".")) continue;
if(!strcmp(ep->d_name, "..")) continue;
if(ep->d_type & DT_DIR) {
if(wildcard(ep->d_name, pattern)) list.append(string(ep->d_name, "/"));
if(wildcard(ep->d_name, pattern)) list.append(ep->d_name);
}
}
closedir(dp);
}
if(list.size() > 0) sort(&list[0], list.size());
foreach(name, list) name.append("/"); //must append after sorting
return list;
}
inline lstring directory::files(const string &pathname, const string &pattern) {

View File

@ -1,15 +1,7 @@
#ifndef NALL_FILE_HPP
#define NALL_FILE_HPP
#include <stdio.h>
#include <string.h>
#if !defined(_WIN32)
#include <unistd.h>
#else
#include <io.h>
#endif
#include <nall/platform.hpp>
#include <nall/stdint.hpp>
#include <nall/string.hpp>
#include <nall/utf8.hpp>
@ -28,6 +20,7 @@ namespace nall {
public:
enum class mode : unsigned { read, write, readwrite, writeread };
enum class index : unsigned { absolute, relative };
enum class time : unsigned { create, modify, access };
uint8_t read() {
if(!fp) return 0xff; //file not open
@ -142,52 +135,60 @@ namespace nall {
return file_offset >= file_size;
}
static bool exists(const char *fn) {
static bool exists(const char *filename) {
#if !defined(_WIN32)
FILE *fp = fopen(fn, "rb");
struct stat64 data;
return stat64(filename, &data) == 0;
#else
FILE *fp = _wfopen(utf16_t(fn), L"rb");
struct __stat64 data;
return _wstat64(utf16_t(filename), &data) == 0;
#endif
if(fp) {
fclose(fp);
return true;
}
return false;
}
static unsigned size(const char *fn) {
static uintmax_t size(const char *filename) {
#if !defined(_WIN32)
FILE *fp = fopen(fn, "rb");
struct stat64 data;
stat64(filename, &data);
#else
FILE *fp = _wfopen(utf16_t(fn), L"rb");
struct __stat64 data;
_wstat64(utf16_t(filename), &data);
#endif
unsigned filesize = 0;
if(fp) {
fseek(fp, 0, SEEK_END);
filesize = ftell(fp);
fclose(fp);
return S_ISREG(data.st_mode) ? data.st_size : 0u;
}
static time_t timestamp(const char *filename, file::time mode = file::time::create) {
#if !defined(_WIN32)
struct stat64 data;
stat64(filename, &data);
#else
struct __stat64 data;
_wstat64(utf16_t(filename), &data);
#endif
switch(mode) { default:
case file::time::create: return data.st_ctime;
case file::time::modify: return data.st_mtime;
case file::time::access: return data.st_atime;
}
return filesize;
}
bool open() {
return fp;
}
bool open(const char *fn, mode mode_) {
bool open(const char *filename, mode mode_) {
if(fp) return false;
switch(file_mode = mode_) {
#if !defined(_WIN32)
case mode::read: fp = fopen(fn, "rb"); break;
case mode::write: fp = fopen(fn, "wb+"); break; //need read permission for buffering
case mode::readwrite: fp = fopen(fn, "rb+"); break;
case mode::writeread: fp = fopen(fn, "wb+"); break;
case mode::read: fp = fopen(filename, "rb" ); break;
case mode::write: fp = fopen(filename, "wb+"); break; //need read permission for buffering
case mode::readwrite: fp = fopen(filename, "rb+"); break;
case mode::writeread: fp = fopen(filename, "wb+"); break;
#else
case mode::read: fp = _wfopen(utf16_t(fn), L"rb"); break;
case mode::write: fp = _wfopen(utf16_t(fn), L"wb+"); break;
case mode::readwrite: fp = _wfopen(utf16_t(fn), L"rb+"); break;
case mode::writeread: fp = _wfopen(utf16_t(fn), L"wb+"); break;
case mode::read: fp = _wfopen(utf16_t(filename), L"rb" ); break;
case mode::write: fp = _wfopen(utf16_t(filename), L"wb+"); break;
case mode::readwrite: fp = _wfopen(utf16_t(filename), L"rb+"); break;
case mode::writeread: fp = _wfopen(utf16_t(filename), L"wb+"); break;
#endif
}
if(!fp) return false;

View File

@ -1,6 +1,12 @@
#ifndef NALL_PLATFORM_HPP
#define NALL_PLATFORM_HPP
#if defined(_WIN32)
//minimum version needed for _wstat64, etc
#undef __MSVCRT_VERSION__
#define __MSVCRT_VERSION__ 0x0601
#endif
#include <nall/utf8.hpp>
//=========================
@ -18,16 +24,19 @@
#include <string.h>
#include <time.h>
#include <sys/types.h>
#include <sys/stat.h>
#if defined(_WIN32)
#include <io.h>
#include <direct.h>
#include <shlobj.h>
#include <wchar.h>
#undef interface
#define dllexport __declspec(dllexport)
#else
#include <unistd.h>
#include <pwd.h>
#include <sys/stat.h>
#define dllexport
#endif
@ -53,11 +62,11 @@
#if defined(_WIN32)
#define getcwd _getcwd
#define ftruncate _chsize
#define putenv _putenv
#define mkdir(n, m) _wmkdir(nall::utf16_t(n))
#define putenv _putenv
#define rmdir _rmdir
#define vsnprintf _vsnprintf
#define usleep(n) Sleep(n / 1000)
#define vsnprintf _vsnprintf
#endif
//================

View File

@ -6,8 +6,10 @@ namespace nall {
//this is needed, as C++0x does not support explicit template specialization inside classes
template<> inline const char* to_string<bool> (bool v) { return v ? "true" : "false"; }
template<> inline const char* to_string<signed int> (signed int v) { static char temp[256]; snprintf(temp, 255, "%+d", v); return temp; }
template<> inline const char* to_string<unsigned int> (unsigned int v) { static char temp[256]; snprintf(temp, 255, "%u", v); return temp; }
template<> inline const char* to_string<double> (double v) { static char temp[256]; snprintf(temp, 255, "%f", v); return temp; }
template<> inline const char* to_string<unsigned int> (unsigned int v) { static char temp[256]; snprintf(temp, 255, "%u", v); return temp; }
template<> inline const char* to_string<intmax_t> (intmax_t v) { static char temp[256]; snprintf(temp, 255, "%+lld", (long long)v); return temp; }
template<> inline const char* to_string<uintmax_t> (uintmax_t v) { static char temp[256]; snprintf(temp, 255, "%llu", (unsigned long long)v); return temp; }
template<> inline const char* to_string<double> (double v) { static char temp[256]; snprintf(temp, 255, "%f", v); return temp; }
template<> inline const char* to_string<char*> (char *v) { return v; }
template<> inline const char* to_string<const char*> (const char *v) { return v; }
template<> inline const char* to_string<string> (string v) { return v; }

View File

@ -34,6 +34,10 @@ void Font::setSize(unsigned size) { state.size = size; return p.setSize(size); }
void Font::setUnderline(bool underline) { state.underline = underline; return p.setUnderline(underline); }
Font::Font() : state(*new State), p(*new pFont(*this)) { p.constructor(); }
void Timer::setEnabled(bool enabled) { state.enabled = enabled; return p.setEnabled(enabled); }
void Timer::setInterval(unsigned milliseconds) { state.milliseconds = milliseconds; return p.setInterval(milliseconds); }
Timer::Timer() : state(*new State), p(*new pTimer(*this)) { p.constructor(); }
MessageWindow::Response MessageWindow::information(Window &parent, const string &text, MessageWindow::Buttons buttons) { return pMessageWindow::information(parent, text, buttons); }
MessageWindow::Response MessageWindow::question(Window &parent, const string &text, MessageWindow::Buttons buttons) { return pMessageWindow::question(parent, text, buttons); }
MessageWindow::Response MessageWindow::warning(Window &parent, const string &text, MessageWindow::Buttons buttons) { return pMessageWindow::warning(parent, text, buttons); }

View File

@ -6,6 +6,7 @@ struct Widget;
struct pOS;
struct pFont;
struct pTimer;
struct pWindow;
struct pAction;
struct pMenu;
@ -82,6 +83,18 @@ struct Font : Object {
pFont &p;
};
struct Timer : Object {
nall::function<void ()> onTimeout;
void setEnabled(bool enabled = true);
void setInterval(unsigned milliseconds);
Timer();
struct State;
State &state;
pTimer &p;
};
struct MessageWindow : Object {
enum class Buttons : unsigned {
Ok,

View File

@ -69,10 +69,6 @@ Geometry VerticalLayout::minimumLayoutGeometry() {
return { 0, 0, maximumWidth ? MaximumSize : margin * 2 + width, maximumHeight ? MaximumSize : margin * 2 + height };
}
void VerticalLayout::reset() {
children.reset();
}
void VerticalLayout::setGeometry(const Geometry &containerGeometry) {
auto children = this->children;
foreach(child, children) {

View File

@ -5,7 +5,6 @@ struct VerticalLayout : public Layout {
void append(Widget &widget, unsigned width, unsigned height, unsigned spacing = 0);
Geometry minimumGeometry();
Geometry minimumLayoutGeometry();
void reset();
void setGeometry(const Geometry &geometry);
void setMargin(unsigned margin);
void setParent(Window &parent);

View File

@ -13,6 +13,16 @@ struct Font::State {
}
};
struct Timer::State {
bool enabled;
unsigned milliseconds;
State() {
enabled = false;
milliseconds = 0;
}
};
struct Window::State {
bool backgroundColor;
unsigned backgroundColorRed, backgroundColorGreen, backgroundColorBlue;

View File

@ -2,6 +2,7 @@
#include "settings.cpp"
#include "font.cpp"
#include "timer.cpp"
#include "message-window.cpp"
#include "window.cpp"
@ -31,10 +32,29 @@
Font pOS::defaultFont;
Geometry pOS::availableGeometry() {
//TODO: is there a GTK+ function for this?
//should return desktopGeometry() sans panels, toolbars, docks, etc.
Geometry geometry = desktopGeometry();
return { geometry.x + 64, geometry.y + 64, geometry.width - 128, geometry.height - 128 };
Display *display = XOpenDisplay(0);
int screen = DefaultScreen(display);
static Atom atom = X11None;
if(atom == X11None) atom = XInternAtom(display, "_NET_WORKAREA", True);
int format;
unsigned char *data = 0;
unsigned long items, after;
Atom returnAtom;
int result = XGetWindowProperty(
display, RootWindow(display, screen), atom, 0, 4, False, XA_CARDINAL, &returnAtom, &format, &items, &after, &data
);
XCloseDisplay(display);
if(result == Success && returnAtom == XA_CARDINAL && format == 32 && items == 4) {
unsigned long *workarea = (unsigned long*)data;
return { (signed)workarea[0], (signed)workarea[1], (unsigned)workarea[2], (unsigned)workarea[3] };
}
return desktopGeometry();
}
Geometry pOS::desktopGeometry() {

View File

@ -57,6 +57,16 @@ struct pFont : public pObject {
void constructor();
};
struct pTimer : public pObject {
Timer &timer;
void setEnabled(bool enabled);
void setInterval(unsigned milliseconds);
pTimer(Timer &timer) : timer(timer) {}
void constructor();
};
struct pMessageWindow : public pObject {
static MessageWindow::Response information(Window &parent, const string &text, MessageWindow::Buttons buttons);
static MessageWindow::Response question(Window &parent, const string &text, MessageWindow::Buttons buttons);

24
bsnes/phoenix/gtk/timer.cpp Executable file
View File

@ -0,0 +1,24 @@
static guint Timer_trigger(pTimer *self) {
//timer may have been disabled prior to triggering, so check state
if(self->timer.state.enabled) {
if(self->timer.onTimeout) self->timer.onTimeout();
}
//callback may have disabled timer, so check state again
if(self->timer.state.enabled) {
g_timeout_add(self->timer.state.milliseconds, (GSourceFunc)Timer_trigger, (gpointer)self);
}
//kill this timer instance (it is spawned above if needed again)
return false;
}
void pTimer::setEnabled(bool enabled) {
if(enabled) {
g_timeout_add(timer.state.milliseconds, (GSourceFunc)Timer_trigger, (gpointer)this);
}
}
void pTimer::setInterval(unsigned milliseconds) {
}
void pTimer::constructor() {
}

View File

@ -1,3 +1,6 @@
#ifndef PHOENIX_CPP
#define PHOENIX_CPP
#if defined(PHOENIX_WINDOWS)
#define UNICODE
#define WINVER 0x0501
@ -14,13 +17,15 @@
#include <QApplication>
#include <QtGui>
#elif defined(PHOENIX_GTK)
#define None X11None
#define None
#define Window X11Window
#define X11None 0L
#include <gtk/gtk.h>
#include <gdk/gdkx.h>
#include <cairo.h>
#include <gdk/gdkkeysyms.h>
#include <X11/Xatom.h>
#undef None
#undef Window
@ -35,3 +40,5 @@ using namespace nall;
namespace phoenix {
#include "core/core.cpp"
}
#endif

View File

@ -1,3 +1,6 @@
#ifndef PHOENIX_HPP
#define PHOENIX_HPP
#include <nall/array.hpp>
#include <nall/config.hpp>
#include <nall/foreach.hpp>
@ -11,3 +14,5 @@
namespace phoenix {
#include "core/core.hpp"
}
#endif

View File

@ -3,6 +3,7 @@
#include "settings.cpp"
#include "font.cpp"
#include "timer.cpp"
#include "message-window.cpp"
#include "window.cpp"

View File

@ -1,7 +1,7 @@
/****************************************************************************
** Meta object code from reading C++ file 'qt.moc.hpp'
**
** Created: Wed Mar 23 16:17:23 2011
** Created: Tue May 24 19:33:16 2011
** by: The Qt Meta Object Compiler version 62 (Qt 4.7.0)
**
** WARNING! All changes made in this file will be lost!
@ -16,6 +16,67 @@
#endif
QT_BEGIN_MOC_NAMESPACE
static const uint qt_meta_data_pTimer[] = {
// content:
5, // revision
0, // classname
0, 0, // classinfo
1, 14, // methods
0, 0, // properties
0, 0, // enums/sets
0, 0, // constructors
0, // flags
0, // signalCount
// slots: signature, parameters, type, tag, flags
8, 7, 7, 7, 0x0a,
0 // eod
};
static const char qt_meta_stringdata_pTimer[] = {
"pTimer\0\0onTimeout()\0"
};
const QMetaObject pTimer::staticMetaObject = {
{ &QObject::staticMetaObject, qt_meta_stringdata_pTimer,
qt_meta_data_pTimer, 0 }
};
#ifdef Q_NO_DATA_RELOCATION
const QMetaObject &pTimer::getStaticMetaObject() { return staticMetaObject; }
#endif //Q_NO_DATA_RELOCATION
const QMetaObject *pTimer::metaObject() const
{
return QObject::d_ptr->metaObject ? QObject::d_ptr->metaObject : &staticMetaObject;
}
void *pTimer::qt_metacast(const char *_clname)
{
if (!_clname) return 0;
if (!strcmp(_clname, qt_meta_stringdata_pTimer))
return static_cast<void*>(const_cast< pTimer*>(this));
if (!strcmp(_clname, "pObject"))
return static_cast< pObject*>(const_cast< pTimer*>(this));
return QObject::qt_metacast(_clname);
}
int pTimer::qt_metacall(QMetaObject::Call _c, int _id, void **_a)
{
_id = QObject::qt_metacall(_c, _id, _a);
if (_id < 0)
return _id;
if (_c == QMetaObject::InvokeMetaMethod) {
switch (_id) {
case 0: onTimeout(); break;
default: ;
}
_id -= 1;
}
return _id;
}
static const uint qt_meta_data_pWindow[] = {
// content:

View File

@ -56,6 +56,23 @@ struct pFont : public pObject {
void update();
};
struct pTimer : public QObject, public pObject {
Q_OBJECT
public:
Timer &timer;
QTimer *qtTimer;
void setEnabled(bool enabled);
void setInterval(unsigned milliseconds);
pTimer(Timer &timer) : timer(timer) {}
void constructor();
public slots:
void onTimeout();
};
struct pMessageWindow : public pObject {
static MessageWindow::Response information(Window &parent, const string &text, MessageWindow::Buttons buttons);
static MessageWindow::Response question(Window &parent, const string &text, MessageWindow::Buttons buttons);

21
bsnes/phoenix/qt/timer.cpp Executable file
View File

@ -0,0 +1,21 @@
void pTimer::setEnabled(bool enabled) {
if(enabled) {
qtTimer->start();
} else {
qtTimer->stop();
}
}
void pTimer::setInterval(unsigned milliseconds) {
qtTimer->setInterval(milliseconds);
}
void pTimer::constructor() {
qtTimer = new QTimer;
qtTimer->setInterval(0);
connect(qtTimer, SIGNAL(timeout()), SLOT(onTimeout()));
}
void pTimer::onTimeout() {
if(timer.onTimeout) timer.onTimeout();
}

View File

@ -1,3 +1,7 @@
Geometry pFont::geometry(const string &text) {
return { 0, 0, 0, 0 };
}
void pFont::setBold(bool bold) {
}

View File

@ -1,6 +1,7 @@
#include "reference.hpp"
#include "font.cpp"
#include "timer.cpp"
#include "message-window.cpp"
#include "window.cpp"
@ -13,6 +14,7 @@
#include "widget/widget.cpp"
#include "widget/button.cpp"
#include "widget/canvas.cpp"
#include "widget/check-box.cpp"
#include "widget/combo-box.cpp"
#include "widget/hex-edit.cpp"

View File

@ -29,6 +29,7 @@ struct pOS : public pObject {
struct pFont : public pObject {
Font &font;
Geometry geometry(const string &text);
void setBold(bool bold);
void setFamily(const string &family);
void setItalic(bool italic);
@ -39,6 +40,16 @@ struct pFont : public pObject {
void constructor();
};
struct pTimer : public pObject {
Timer &timer;
void setEnabled(bool enabled);
void setInterval(unsigned milliseconds);
pTimer(Timer &timer) : timer(timer) {}
void constructor();
};
struct pMessageWindow : public pObject {
static MessageWindow::Response information(Window &parent, const string &text, MessageWindow::Buttons buttons);
static MessageWindow::Response question(Window &parent, const string &text, MessageWindow::Buttons buttons);
@ -136,6 +147,8 @@ struct pWidget : public pObject {
Widget &widget;
bool enabled();
Font& font();
Geometry minimumGeometry();
void setEnabled(bool enabled);
void setFocused();
void setFont(Font &font);
@ -155,6 +168,16 @@ struct pButton : public pWidget {
void constructor();
};
struct pCanvas : public pWidget {
Canvas &canvas;
uint32_t* buffer();
void update();
pCanvas(Canvas &canvas) : pWidget(canvas), canvas(canvas) {}
void constructor();
};
struct pCheckBox : public pWidget {
CheckBox &checkBox;

View File

@ -0,0 +1,8 @@
void pTimer::setEnabled(bool enabled) {
}
void pTimer::setInterval(unsigned milliseconds) {
}
void pTimer::constructor() {
}

View File

@ -0,0 +1,9 @@
uint32_t* pCanvas::buffer() {
return 0;
}
void pCanvas::update() {
}
void pCanvas::constructor() {
}

View File

@ -2,6 +2,14 @@ bool pWidget::enabled() {
return false;
}
Font& pWidget::font() {
throw;
}
Geometry pWidget::minimumGeometry() {
return { 0, 0, 0, 0 };
}
void pWidget::setEnabled(bool enabled) {
}

31
bsnes/phoenix/windows/timer.cpp Executable file
View File

@ -0,0 +1,31 @@
static linear_vector<pTimer*> timers;
static void CALLBACK Timer_timeoutProc(HWND hwnd, UINT msg, UINT_PTR timerID, DWORD time) {
foreach(timer, timers) {
if(timer->htimer == timerID) {
if(timer->timer.onTimeout) timer->timer.onTimeout();
return;
}
}
}
void pTimer::setEnabled(bool enabled) {
if(htimer) {
KillTimer(NULL, htimer);
htimer = 0;
}
if(enabled == true) {
htimer = SetTimer(NULL, 0U, timer.state.milliseconds, Timer_timeoutProc);
}
}
void pTimer::setInterval(unsigned milliseconds) {
//destroy and recreate timer if interval changed
setEnabled(timer.state.enabled);
}
void pTimer::constructor() {
timers.append(this);
htimer = 0;
}

View File

@ -36,8 +36,11 @@ Geometry pWindow::frameMargin() {
Geometry pWindow::geometry() {
Geometry margin = frameMargin();
RECT rc;
GetWindowRect(hwnd, &rc);
//note: GetWindowRect returns -32000(x),-32000(y) when window is minimized
WINDOWPLACEMENT wp;
GetWindowPlacement(hwnd, &wp);
RECT rc = wp.rcNormalPosition;
signed x = rc.left + margin.x;
signed y = rc.top + margin.y;

View File

@ -2,6 +2,7 @@
#include "object.cpp"
#include "font.cpp"
#include "timer.cpp"
#include "message-window.cpp"
#include "window.cpp"

View File

@ -49,6 +49,17 @@ struct pFont : public pObject {
void constructor();
};
struct pTimer : public pObject {
Timer &timer;
UINT_PTR htimer;
void setEnabled(bool enabled);
void setInterval(unsigned milliseconds);
pTimer(Timer &timer) : timer(timer) {}
void constructor();
};
struct pMessageWindow : public pObject {
static MessageWindow::Response information(Window &parent, const string &text, MessageWindow::Buttons buttons);
static MessageWindow::Response question(Window &parent, const string &text, MessageWindow::Buttons buttons);

View File

@ -2,10 +2,16 @@
#include "mode7.cpp"
//V = 0, H = 0
void PPU::Background::frame() {
}
//H = 0
void PPU::Background::scanline() {
}
//H = 60
void PPU::Background::begin() {
bool hires = (self.regs.bgmode == 5 || self.regs.bgmode == 6);
x = -7;
y = self.vcounter();
@ -13,20 +19,26 @@ void PPU::Background::scanline() {
if(y == 1) {
mosaic.vcounter = regs.mosaic + 1;
mosaic.voffset = 1;
mosaic.vscroll = regs.voffset;
mosaic.hscroll = regs.hoffset;
cache.hoffset = regs.hoffset;
cache.voffset = regs.voffset;
} else if(--mosaic.vcounter == 0) {
mosaic.vcounter = regs.mosaic + 1;
mosaic.voffset += regs.mosaic + 1;
mosaic.vscroll = regs.voffset;
mosaic.hscroll = regs.hoffset;
cache.hoffset = regs.hoffset;
cache.voffset = regs.voffset;
}
tile_counter = (7 - (mosaic.hscroll & 7)) << hires;
tile_counter = (7 - (cache.hoffset & 7)) << hires;
for(unsigned n = 0; n < 8; n++) data[n] = 0;
mosaic.hcounter = regs.mosaic + 1;
mosaic.hoffset = 0;
if(regs.mode == Mode::Mode7) return begin_mode7();
if(regs.mosaic == 0) {
cache.hoffset = regs.hoffset;
cache.voffset = regs.voffset;
}
}
void PPU::Background::get_tile() {
@ -53,8 +65,8 @@ void PPU::Background::get_tile() {
unsigned px = x << hires;
unsigned py = (regs.mosaic == 0 ? y : mosaic.voffset);
unsigned hscroll = mosaic.hscroll;
unsigned vscroll = mosaic.vscroll;
unsigned hscroll = cache.hoffset;
unsigned vscroll = cache.voffset;
if(hires) {
hscroll <<= 1;
if(self.regs.interlace) py = (py << 1) + self.field();
@ -67,8 +79,8 @@ void PPU::Background::get_tile() {
uint16 offset_x = (x + (hscroll & 7));
if(offset_x >= 8) {
unsigned hval = self.bg3.get_tile((offset_x - 8) + (self.bg3.regs.hoffset & ~7), self.bg3.regs.voffset + 0);
unsigned vval = self.bg3.get_tile((offset_x - 8) + (self.bg3.regs.hoffset & ~7), self.bg3.regs.voffset + 8);
unsigned hval = self.bg3.get_tile((offset_x - 8) + (self.bg3.cache.hoffset & ~7), self.bg3.cache.voffset + 0);
unsigned vval = self.bg3.get_tile((offset_x - 8) + (self.bg3.cache.hoffset & ~7), self.bg3.cache.voffset + 8);
unsigned valid_mask = (id == ID::BG1 ? 0x2000 : 0x4000);
if(self.regs.bgmode == 4) {
@ -205,6 +217,9 @@ void PPU::Background::reset() {
regs.hoffset = random(0x0000);
regs.voffset = random(0x0000);
cache.hoffset = 0;
cache.voffset = 0;
output.main.palette = 0;
output.main.priority = 0;
output.sub.palette = 0;
@ -216,10 +231,8 @@ void PPU::Background::reset() {
mosaic.vcounter = 0;
mosaic.voffset = 0;
mosaic.vscroll = 0;
mosaic.hcounter = 0;
mosaic.hoffset = 0;
mosaic.hscroll = 0;
x = 0;
y = 0;

View File

@ -25,6 +25,11 @@ class Background {
uint16 voffset;
} regs;
struct Cache {
uint16 hoffset;
uint16 voffset;
} cache;
struct Output {
struct Pixel {
unsigned priority; //0 = none (transparent)
@ -36,10 +41,8 @@ class Background {
struct Mosaic : Output::Pixel {
unsigned vcounter;
unsigned voffset;
unsigned vscroll;
unsigned hcounter;
unsigned hoffset;
unsigned hscroll;
} mosaic;
struct {
@ -56,6 +59,7 @@ class Background {
void frame();
void scanline();
void begin();
void run(bool screen);
void reset();
@ -63,6 +67,7 @@ class Background {
unsigned get_tile_color();
unsigned get_tile(unsigned x, unsigned y);
signed clip(signed n);
void begin_mode7();
void run_mode7();
void serialize(serializer&);

View File

@ -5,6 +5,12 @@ signed PPU::Background::clip(signed n) {
return n & 0x2000 ? (n | ~1023) : (n & 1023);
}
//H = 60
void PPU::Background::begin_mode7() {
cache.hoffset = self.regs.mode7_hoffset;
cache.voffset = self.regs.mode7_voffset;
}
void PPU::Background::run_mode7() {
signed a = sclip<16>(self.regs.m7a);
signed b = sclip<16>(self.regs.m7b);
@ -13,8 +19,8 @@ void PPU::Background::run_mode7() {
signed cx = sclip<13>(self.regs.m7x);
signed cy = sclip<13>(self.regs.m7y);
signed hoffset = sclip<13>(self.regs.mode7_hoffset);
signed voffset = sclip<13>(self.regs.mode7_voffset);
signed hoffset = sclip<13>(cache.hoffset);
signed voffset = sclip<13>(cache.voffset);
if(Background::x++ & ~255) return;
unsigned x = mosaic.hoffset;

View File

@ -39,6 +39,10 @@ void PPU::enter() {
scanline();
add_clocks(60);
bg1.begin();
bg2.begin();
bg3.begin();
bg4.begin();
if(vcounter() <= 239) {
for(signed pixel = -7; pixel <= 255; pixel++) {

View File

@ -109,6 +109,9 @@ void PPU::Background::serialize(serializer &s) {
s.integer(regs.hoffset);
s.integer(regs.voffset);
s.integer(cache.hoffset);
s.integer(cache.voffset);
s.integer(output.main.priority);
s.integer(output.main.palette);
s.integer(output.main.tile);
@ -126,10 +129,8 @@ void PPU::Background::serialize(serializer &s) {
s.integer(mosaic.vcounter);
s.integer(mosaic.voffset);
s.integer(mosaic.vscroll);
s.integer(mosaic.hcounter);
s.integer(mosaic.hoffset);
s.integer(mosaic.hscroll);
s.integer(tile_counter);
s.integer(tile);

View File

@ -1,7 +1,7 @@
namespace SNES {
namespace Info {
static const char Name[] = "bsnes";
static const char Version[] = "078.07";
static const char Version[] = "079";
static const unsigned SerializerVersion = 20;
}
}

View File

@ -28,5 +28,5 @@ dllexport void filter_render(
}
}
_2xSaI32((unsigned char*)temp, 1024, 0, (unsigned char*)output, outpitch, width, height);
_2xSaI32((unsigned char*)temp, width * sizeof(uint32_t), 0, (unsigned char*)output, outpitch, width, height);
}

View File

@ -28,5 +28,5 @@ dllexport void filter_render(
}
}
Super2xSaI32((unsigned char*)temp, 1024, 0, (unsigned char*)output, outpitch, width, height);
Super2xSaI32((unsigned char*)temp, width * sizeof(uint32_t), 0, (unsigned char*)output, outpitch, width, height);
}

View File

@ -28,5 +28,5 @@ dllexport void filter_render(
}
}
SuperEagle32((unsigned char*)temp, 1024, 0, (unsigned char*)output, outpitch, width, height);
SuperEagle32((unsigned char*)temp, width * sizeof(uint32_t), 0, (unsigned char*)output, outpitch, width, height);
}