CPS-2 internals, Reversing Super Street Fighter 2 Turbo, and Retro

Transcription

CPS-2 internals, Reversing Super Street Fighter 2 Turbo, and Retro
CPS-2 internals,
Reversing Super Street Fighter 2 Turbo,
and Retro-Arcade Cabinet Hacking :)
NoConName 2014
Pau Oliva Fora - <[email protected]>
@pof
Agenda
Basic elements
Controllers: buttons, sticks, microswitches
Cabinets: jamma
CPS2
History
Encryption
Phoenix edition boards
Super Street Fighter II Turbo
Versions, netplay, etc..
Debugging the game, writing cheats, lua
How not to suck at ST
BASIC ELEMENTS
Joysticks
Top (balltop & battop)
top handle
Brands
Happ, Seimitsu LS-32, Sanwa JLF
Buttons
Sanwa OBSF-24
Seimitsu PS-14-DN
Happ Horizontal, Happ Competition, Sanwa
OBSN-30
Buttons
Sanwa OBSF-30
Switches
Cherry microswitches, Sanwa small switches,
Seimitsu small switches, Seimitsu large
switches, Sanwa long switches
PCB
PS360+
PCB
Joystick
JAMMA
OUTPUT
Monitor
Mono Audio
Coin Counters
INPUT
2 joysticks /w 3 buttons each
2 start buttons
2 coin triggers from coin mech
1 test switch
1 service switch
Power (12V, 5V, -5V, Ground)
JAMMA: Japan Amusement Machinery Manufacturers Association
JAMMA
Cabinet 101
Cabinet 101
Cabinet 101
Cabinet 101
Cabinet 101
Cabinet 101
Super Turbo Cabinet
AstroCity
SuperGun
SuperGun
SuperGun
Mak Strike
SuperGun
CAPCOM PLAY SYSTEM 2
CPS2
CPS2
A & B boards
UD-CPS2
UD-CPS2
http://forums.shoryuken.com/discussion/146685/ud-cps2-fullyconsolized-capcom-play-system-2/p1
CPS2 - Regions
Green: Japan
Blue: North America & Europe
Orange: South America
Grey: Asia
Pink: Brazil
Yellow: All (Rent version)
Black: All in one unit
Green & Blue boards are totally interchangeable.
Grey & Orange boards require 'A' board of matching color
Yellow 'B' boards are rent version and were made to fit 'A' boards as
required.
CPS-2 Specs
Primary CPU: Motorola 68000 @ 16 MHz
Sound CPU: Z80 @ 8 MHz
Sound Chips: Q-Sound @ 4 MHz
Display:
Resolution: Raster, 384x224 @ 59.6294 Hz
Color Depth: 12 bit RGB with a 4 bit brightness value
(4096 colors)
2048 On-screen colors (128 global palettes with 16
colors each)
CPS-2 History
CPS-1 games where easy to copy & botleggs
(unauthorized game copies) appeared
(02/1991) Street Fighter II: The World Warrior
CPS-2 == CPS-1 with a faster processor and
encrypted game ROMs
(09/1993) Super Street Fighter II: The New Challengers
(02/1994) Super Street Fighter II Turbo
(12/2003) Hyper Street Fighter II: The Anniversary Edition
CPS-2
Suicide battery
The CPSa battery-backed memory
(SRAM) containing
decryption keys needed
for the games to run
When the battery dies, the
games will no longer work
--> blue screen
3.6V Lithium battery
Size: 1/2 AA
(Elfa part #69-282-12)
CPS-2
Suicide battery
CPS-2
Encryption
In January 2001, the CPS-2 Shock group (Charles
MacDonald, Ange Albertini and Razoola)
obtained unencrypted program data by hacking
into the hardware
They distributed XOR difference tables (8GiB) to
produce unencrypted data from the original
ROM images --> Emulation possible
CPS-2
Encryption
In January 2007, the encryption method was fully
reverse-engineered by Andreas Naive and Nicola
Salmoria (Mame author).
http://andreasnaive.blogspot.com.es/2006_12_01_archive.html
http://andreasnaive.blogspot.com.es/2007_01_01_archive.html
The encryption only affects opcodes, not data.
The encryption consists of two 4-round Feistel
networks with a 64-bit key and involves both the
16-bit opcode and the low 16 bits of the address.
The algorithm was thereafter implemented in this
state for all known CPS-2 games in MAME.
CPS-2
Encryption
For more info read the MAME source:
mame/machine/cps2crpt.c
http://www.mamedev.org/source/src/mame/machine/cps2crpt.c.html
mame/drivers/cps2.c
http://www.mamedev.org/source/src/mame/drivers/cps2.c.html
CPS2
Memory Map
0x000000 - 0x3FFFFF
Main Program
0x400000 - 0x40000A
Encryption (the battery memory)
0x618000 - 0x619FFF
Shared RAM for the Z80
(tells what sfx or music to play)
0x660000 - 0x663FFF
0x900000 -
Network Memory
Start of Graphic memory
(can change with each game)
Super Turbo:
0x900000 - 0x903FFF
Palette
0x904000 - 0x907FFF
16x16
0x908000 - 0x90BFFF
32x32
0x90C000 - 0x90FFFF
8x8
0x910000 - 0x913FFF
16x16 mainly hud and character
names on select screen
0xFF0000 - 0xFFFFFF
Main Memory
Revive
Dead B-Boards
Decrypt all encrypted data so that you end up with a
fully decrypted ROM image.
Patch the program code so that all read and writes to
the 0x400000-0x40000A memory region are
changed to 0xFFFFF0-0xFFFFFA (bottom of the
normal WORK RAM)
Patch all routines not to clear this region during any
memory clearing activities
Patch every part of the game that uses this region of
WORK RAM (to store variables and such) to use a
different region.
Phoenixed
boards
Project to bring dead CPS-2 game boards back to
A power on splash screen
Ability to change region (stored to EEPROM)
A basic Jukebox to listen to game music
68000 exception handling (helps to find errors)
Freeplay option added to regions that missed it
Removal of time locks for certain code activations
Stronger test mode EEPROM memory checks
Phoenixed
boards
To phoenix a board:
Purchase the phoenixed EPROMs/data from Razoola
Reprogram the appropriate program EPROMs with the
Phoenix ROM data
Desolder/Remove the Battery (bottom right corner of the
board)
Short the 2 leads of the electrolytic capacitor next to where
the + terminal was together for several seconds. This will
drain the juice left in the circuit and allow the phoenix
code to operate properly.
Boot up the title. A phoenix logo should appear - at this
point, pressing the test button will let the you change the
region
decrypted ROMs
Decrypted CPS2 images by L_Oliveira, MottZilla
and idc/Team Avalaunch:
http://cps2.avalaunch.net/
Alternative to Phoenix Edition ROMs
They revive dead boards, but are "clean" because
they don't have all the extra features that
Razoola put in (region change, jukebox, etc.)
STREET FIGHTER
Which is the
best version?
Super Street Fighter II X: Grand Master
Challenge (Jap. CPS-2)
Running on CPS-2, not emulated!!
NO input LAG
Super Street Fighter II Turbo (North
American version)
Dreamcast port
SSF2T HDR (HD Remix)* on PS3 &
XBOX360
Netplay
GGPO
Windows only
Adobe Air
Supercade
Windows Only
.NET
HDR
Xbox / PS3
Netplay
GGPO
GGPO.py
Windows only
Adobe Air
Supercade
Windows Only
.NET
HDR
Xbox / PS3
http://poliva.github.io/ggpo/
GGPO.py
GGPO.py
Protocol reverse engineered from the original
(windows) GGPO client
Support for Linux & MacOS X
Vulnerabilities found in GGPO server
Start a match without the peer accepting
Start a match even when peer is away
pyQTggpo
GUI client
Windows, Linux & OSX
Ground work (protocol) based on ggpo.py
https://github.com/doctorguile/pyqtggpo
GGPO Server
- Official GGPO server was down for ~1week
- Not actively maintained by its author anymore :(
-
GGPO Server
- Official GGPO server was down for ~1week
- Not actively maintained by its author anymore :(
FEATURES:
- Announcing GGPO-NG:
http://www.ggpo-ng.com
Source code available on github:
https://github.com/poliva/ggposrv
-UDP hole punching
(no port forwarding)
-Record & playback games
Debugging ST
mame ssf2xj -debug
Ctrl+M to open memory window
Adress 0xFF844E
Offset for P2 base is 0x400
Debugging ST
Debugging ST
Debugging ST
Scripting:
mame-rr lua
memory.readbyte(), memory.readword(),
memory.writebyte(), memory.writeword()
gui.text(), emu.frameadvance()
Lua Scripting
Cheats
RAM cheats usually change the data the game
has in RAM (ie: change the value in a fixed
memory address)
force the game engine take a different path
Cheats
<cheat desc="Infinite Time">
<script state="run">
<action>maincpu.pb@FF8DCE=99</action>
</script>
</cheat>
1. maincpu: This is the tag of the CPU whose
memory you want to poke, maincpu is in 99%
of cases the tag you will need
Cheats
<cheat desc="Infinite Time">
<script state="run">
<action>maincpu.pb@FF8DCE=99</action>
</script>
</cheat>
2. p : memory space that needs to be poked, there are 7 possibilities:
p = program write (most RAM cheats need this)
m = region write (most ROM cheats use this)
r = RAM write (use this for ROM cheats if m doesn't work or for RAM
cheats if p doesn't work)
o = Opcode Write (use this for ROM cheats if m and r don't work - often
used for encrypted memory)
d = data write (don't think I've ever used this)
i = i/o write (don't think I've ever used this)
3 = SPACE3 write (I've definitely never used this)
Cheats
<cheat desc="Infinite Time">
<script state="run">
<action>maincpu.pb@FF8DCE=99</action>
</script>
</cheat>
3. b : memory size of what's being poked,
there are four possibilities:
b (byte)
w (word=2 bytes)
d (doubleword=4 bytes)
q (quadword=8 bytes)
Cheats
<cheat desc="Invincibility P1">
<script state="run">
<action>maincpu.pb@FF860D=01</action>
</script>
</cheat>
More examples: https://github.com/poliva/ssf2xj
Cheats
How to find the right addresses to poke?
search for all bytes that have decreased by one since we did the cheatinit command
Cheats
Watchpoints:
wpset 0xFF87DC,1,r,1,{printf "P1 Read @ %X=%X with PC=%X", wpaddr, pb@FF87DC, PC; go}
Patching m68k
for dummies
NOP = 0x4e71
BEQ = 0x67XXYYYYZZZZ where XXYYYYZZZZ indicates
how far we will jump forward if the previous comparison
instruction (usually a TST) was found to be equal.
BNE = 0x66XXYYYYZZZZ where XXYYYYZZZZ indicates
how far we will jump forward if the previous comparison
instruction (usually a TST) was not equal.
So if we need to invert the logic we can change the BEQ for
BNE by swapping a 67 for a 66 on the first byte of the
opcode.
If we want to always force a certain code path we can just
NOP the branch instruction
Training mode
Infinite time
Health/energy recharge
Disable K.O. slowdown
Dizzy OK
Dummy actions (useful to train combos):
Neutral
Block: everything or only ground attacks
http://pof.eslack.org/2014/04/22/ssf2t-the-quest-for-theperfect-training-mode/
Want MOAR?
ST-Revival (US):
http://strevival.com
Gamespot Versus (JP):
https://www.youtube.com/user/supersf2turbo/videos
Tournament of Legends & Xmania:
Evo 2012:
http://youtu.be/HJ0SR6Y9GHM
Evo 2014:
http://www.strevival.com/tol2/
http://youtu.be/2c93mDy0HFU
Want MOAR?
Shoryuken wiki:
http://wiki.shoryuken.com/Super_Street_Fighter_2_Tu
rbo
Shoryuken forum:
http://forums.shoryuken.com/categories/super-streetfighter-ii-turbo
The 48 killing arts of yoga:
http://www.youtube.com/watch?v=x4cgh6eRmCE
Questions?
Bibliography
http://www.slagcoin.com/joystick.html
http://www.youtube.com/watch?v=-zIhPV0F_B4
http://en.wikipedia.org/wiki/CP_System_II
http://cps2shock.emu-france.info/
http://forums.shoryuken.com/discussion/169077/hacking-the-st-rom/p1
http://www.mamecheat.co.uk/forums/viewtopic.php?p=13271#p13271