mirror of https://github.com/bsnes-emu/bsnes.git
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:
parent
d129b72ced
commit
2a90e12999
|
@ -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>
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
||||
//================
|
||||
|
|
|
@ -7,6 +7,8 @@ namespace nall {
|
|||
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<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; }
|
||||
|
|
|
@ -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); }
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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() {
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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() {
|
||||
}
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -3,6 +3,7 @@
|
|||
|
||||
#include "settings.cpp"
|
||||
#include "font.cpp"
|
||||
#include "timer.cpp"
|
||||
#include "message-window.cpp"
|
||||
#include "window.cpp"
|
||||
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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();
|
||||
}
|
|
@ -1,3 +1,7 @@
|
|||
Geometry pFont::geometry(const string &text) {
|
||||
return { 0, 0, 0, 0 };
|
||||
}
|
||||
|
||||
void pFont::setBold(bool bold) {
|
||||
}
|
||||
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -0,0 +1,8 @@
|
|||
void pTimer::setEnabled(bool enabled) {
|
||||
}
|
||||
|
||||
void pTimer::setInterval(unsigned milliseconds) {
|
||||
}
|
||||
|
||||
void pTimer::constructor() {
|
||||
}
|
|
@ -0,0 +1,9 @@
|
|||
uint32_t* pCanvas::buffer() {
|
||||
return 0;
|
||||
}
|
||||
|
||||
void pCanvas::update() {
|
||||
}
|
||||
|
||||
void pCanvas::constructor() {
|
||||
}
|
|
@ -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) {
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
|
@ -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;
|
||||
|
|
|
@ -2,6 +2,7 @@
|
|||
|
||||
#include "object.cpp"
|
||||
#include "font.cpp"
|
||||
#include "timer.cpp"
|
||||
#include "message-window.cpp"
|
||||
#include "window.cpp"
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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&);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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++) {
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue