Fatal Fury 2: Difference between revisions
Jump to navigation
Jump to search
No edit summary |
(Build date) |
||
(3 intermediate revisions by 2 users not shown) | |||
Line 17: | Line 17: | ||
|aes_release_jp=y | |aes_release_jp=y | ||
|aes_release_en=y | |aes_release_en=y | ||
|aes_romset=fatfury2 | |||
|aes_date=05/03/93 | |aes_date=05/03/93 | ||
|cd_release=y | |cd_release=y | ||
Line 23: | Line 24: | ||
|cd_date=09/09/94 | |cd_date=09/09/94 | ||
}} | }} | ||
<center> | |||
<gallery widths="320" heights="240"> | |||
File:FF2build.png|Fatal Fury 2 build date. | |||
</gallery> | |||
</center> | |||
==Protection== | |||
Uses {{Chipname|PRO-CT0}} as a protection chip. | |||
If one of the multiple protection checks fail, a flag is silently set. The game runs correctly during the first match, but the opponent in the second match will not be able to get hit, and the timer in next matches will be set to 2 seconds. | |||
If this happens on a real system, the cartridge might be a [[bootleg]] or simply defective. | |||
==Protection code== | |||
Uses lots of bogus addresses to confuse hackers. | |||
<syntaxhighlight> | |||
00296A: | |||
move #$5555,$255552 ;LOAD | |||
move.b $255551,$10AC2E ;Read GAD/GBD: $FF | |||
move.b d0,$255551 ;Clock | |||
move.b $2FFFF1,$10AC2F ;Read GAD/GBD: $00 | |||
move.b d0,$2FFFF1 ;Clock | |||
move.b $200001,$10AC30 ;Read GAD/GBD: $FF | |||
move.b d0,$2FF001 ;Clock | |||
move.b $2FF001,$10AC31 ;Read GAD/GBD: $00 | |||
cmpi.l #$FF00FF00,$10AC2E ;Compare reads | |||
beq + | |||
move #$3328,24580(a5) ;Lock up flag ? | |||
+: | |||
rts | |||
</syntaxhighlight> | |||
<pre> | |||
Load C: 00110011001100110011001100110011 ($33333333) | |||
PRO-CT0 serialize: | |||
00110011 3 | |||
00110011 2 | |||
00110011 1 | |||
00110011 0 | |||
GAD/GBD to D7~D0 remap (no effect): | |||
00110011 1 | |||
00110011 0 | |||
00110011 3 | |||
00110011 2 | |||
|||||||| | |||
00FF00FF -> | |||
</pre> | |||
<syntaxhighlight> | |||
012530: | |||
move #$1234,$256782 ;LOAD C $366A061A (00110110 01101010 00000110 00011010) | |||
move.b $236001,18642(a5) ;Read GAD/GBD | |||
move.b #$20,$236001 ;Clock | |||
move.b $236001,18643(a5) ;Read GAD/GBD | |||
move.b #$20,$236001 ;Clock | |||
move.b $236001,18644(a5) ;Read GAD/GBD | |||
move.b #$20,$236001 ;Clock | |||
move.b $236001,18645(a5) ;Read GAD/GBD | |||
move.b #$20,$236001 ;Clock | |||
move.l 18642(a5),d0 | |||
subi.l #$F05A3601,d0 ;Compare reads | |||
rts | |||
</syntaxhighlight> | |||
<pre> | |||
Load C: 00110110011010100000011000011010 ($366A061A) | |||
PRO-CT0 serialize: | |||
00110110 3 | |||
01101010 2 | |||
00000110 1 | |||
00011010 0 | |||
GAD/GBD to D7~D0 remap: | |||
00000110 1 | |||
00011010 0 | |||
00110110 3 | |||
01101010 2 | |||
|||||||| | |||
01365AF0 -> | |||
</pre> | |||
<syntaxhighlight> | |||
move #$1824,$242812 ;LOAD C | |||
move.b $236009,18642(a5) ;Read GAD/GBD with H (reverse) | |||
move.b #$20,$236009 ;Clock | |||
move.b $236009,18643(a5) ;Read GAD/GBD with H (reverse) | |||
move.b #$20,$236009 ;Clock | |||
move.b $236009,18644(a5) ;Read GAD/GBD with H (reverse) | |||
move.b #$20,$236009 ;Clock | |||
move.b $236009,18645(a5) ;Read GAD/GBD with H (reverse) | |||
move.b #$20,$236009 ;Clock | |||
move.l 18642(a5),d0 | |||
subi.l #$81422418,d0 ;Compare reads | |||
rts | |||
</syntaxhighlight> | |||
<pre> | |||
Load C: 00100100100000010100001000011000 ($24814218) | |||
PRO-CT0 serialize: | |||
00100100 3 | |||
10000001 2 | |||
01000010 1 | |||
00011000 0 | |||
GAD/GBD to D7~D0 remap: | |||
01000010 1 | |||
00011000 0 | |||
00100100 3 | |||
10000001 2 | |||
|||||||| | |||
18244281 <- | |||
</pre> | |||
<syntaxhighlight> | |||
move #$1234,$256782 ;LOAD C | |||
move.b $236005,18642(a5) ;Read GAD/GBD with EVEN (nibble swap) | |||
move.b #$20,$236005 ;Clock | |||
move.b $236005,18643(a5) ;Read GAD/GBD with EVEN (nibble swap) | |||
move.b #$20,$236005 ;Clock | |||
move.b $236005,18644(a5) ;Read GAD/GBD with EVEN (nibble swap) | |||
move.b #$20,$236005 ;Clock | |||
move.b $236005,18645(a5) ;Read GAD/GBD with EVEN (nibble swap) | |||
move.b #$20,$236005 ;Clock | |||
move.l 18642(a5),d0 | |||
subi.l #$0FA56310,d0 ;Compare reads | |||
rts | |||
</syntaxhighlight> | |||
<pre> | |||
Load C: 00110110011010100000011000011010 ($366A061A) | |||
PRO-CT0 serialize: | |||
00110110 3 | |||
01101010 2 | |||
00000110 1 | |||
00011010 0 | |||
GAD/GBD to D7~D0 remap: | |||
00000110 1 | |||
00011010 0 | |||
00110110 3 | |||
01101010 2 | |||
|||||||| | |||
01365AF0 nibble swap: 1063A50F -> | |||
</pre> | |||
<syntaxhighlight> | |||
move #$1824,$242812 ;LOAD C | |||
move.b $23600D,18642(a5) ;Read GAD/GBD with H and EVEN | |||
move.b #$20,$23600D ;Clock | |||
move.b $23600D,18643(a5) ;Read GAD/GBD with H and EVEN | |||
move.b #$20,$23600D ;Clock | |||
move.b $23600D,18644(a5) ;Read GAD/GBD with H and EVEN | |||
move.b #$20,$23600D ;Clock | |||
move.b $23600D,18645(a5) ;Read GAD/GBD with H and EVEN | |||
move.b #$20,$23600D ;Clock | |||
move.l 18642(a5),d0 | |||
subi.l #$18244281,d0 ;Compare reads | |||
rts | |||
</syntaxhighlight> | |||
<pre> | |||
Load C: 00100100100000010100001000011000 ($24814218) | |||
PRO-CT0 serialize: | |||
00100100 3 | |||
10000001 2 | |||
01000010 1 | |||
00011000 0 | |||
GAD/GBD to D7~D0 remap: | |||
01000010 1 | |||
00011000 0 | |||
00100100 3 | |||
10000001 2 | |||
|||||||| | |||
18244281 nibble swap: <- 81422418 | |||
</pre> | |||
[[Category:Games]] | [[Category:Games]] |
Latest revision as of 10:55, 22 October 2018
General Info | |
USA Title | Fatal Fury 2 |
Japanese Title | Garou Densetsu 2 - arata-naru tatakai
(餓狼伝説 2) |
European Title | Fatal Fury 2 |
NGH | 047 |
Developer | SNK |
Editor | SNK |
Meg count | 106 |
TCRF page | None |
MVS Release | |
Release date | 1992 |
PROG Board | PROG-G2 |
CHA Board | CHA42G-1 |
Protection Chip | none |
MAME romset | fatfury2 |
AES Release | |
Release date | 05/03/93 |
PROG Board | Unknown |
CHA Board | Unknown |
Protection Chip | Unknown |
MAME romset | Unknown |
CD Release | |
Release date | 09/09/94 |
-
Fatal Fury 2 build date.
Protection
Uses PRO-CT0 as a protection chip.
If one of the multiple protection checks fail, a flag is silently set. The game runs correctly during the first match, but the opponent in the second match will not be able to get hit, and the timer in next matches will be set to 2 seconds.
If this happens on a real system, the cartridge might be a bootleg or simply defective.
Protection code
Uses lots of bogus addresses to confuse hackers.
00296A:
move #$5555,$255552 ;LOAD
move.b $255551,$10AC2E ;Read GAD/GBD: $FF
move.b d0,$255551 ;Clock
move.b $2FFFF1,$10AC2F ;Read GAD/GBD: $00
move.b d0,$2FFFF1 ;Clock
move.b $200001,$10AC30 ;Read GAD/GBD: $FF
move.b d0,$2FF001 ;Clock
move.b $2FF001,$10AC31 ;Read GAD/GBD: $00
cmpi.l #$FF00FF00,$10AC2E ;Compare reads
beq +
move #$3328,24580(a5) ;Lock up flag ?
+:
rts
Load C: 00110011001100110011001100110011 ($33333333) PRO-CT0 serialize: 00110011 3 00110011 2 00110011 1 00110011 0 GAD/GBD to D7~D0 remap (no effect): 00110011 1 00110011 0 00110011 3 00110011 2 |||||||| 00FF00FF ->
012530:
move #$1234,$256782 ;LOAD C $366A061A (00110110 01101010 00000110 00011010)
move.b $236001,18642(a5) ;Read GAD/GBD
move.b #$20,$236001 ;Clock
move.b $236001,18643(a5) ;Read GAD/GBD
move.b #$20,$236001 ;Clock
move.b $236001,18644(a5) ;Read GAD/GBD
move.b #$20,$236001 ;Clock
move.b $236001,18645(a5) ;Read GAD/GBD
move.b #$20,$236001 ;Clock
move.l 18642(a5),d0
subi.l #$F05A3601,d0 ;Compare reads
rts
Load C: 00110110011010100000011000011010 ($366A061A) PRO-CT0 serialize: 00110110 3 01101010 2 00000110 1 00011010 0 GAD/GBD to D7~D0 remap: 00000110 1 00011010 0 00110110 3 01101010 2 |||||||| 01365AF0 ->
move #$1824,$242812 ;LOAD C
move.b $236009,18642(a5) ;Read GAD/GBD with H (reverse)
move.b #$20,$236009 ;Clock
move.b $236009,18643(a5) ;Read GAD/GBD with H (reverse)
move.b #$20,$236009 ;Clock
move.b $236009,18644(a5) ;Read GAD/GBD with H (reverse)
move.b #$20,$236009 ;Clock
move.b $236009,18645(a5) ;Read GAD/GBD with H (reverse)
move.b #$20,$236009 ;Clock
move.l 18642(a5),d0
subi.l #$81422418,d0 ;Compare reads
rts
Load C: 00100100100000010100001000011000 ($24814218) PRO-CT0 serialize: 00100100 3 10000001 2 01000010 1 00011000 0 GAD/GBD to D7~D0 remap: 01000010 1 00011000 0 00100100 3 10000001 2 |||||||| 18244281 <-
move #$1234,$256782 ;LOAD C
move.b $236005,18642(a5) ;Read GAD/GBD with EVEN (nibble swap)
move.b #$20,$236005 ;Clock
move.b $236005,18643(a5) ;Read GAD/GBD with EVEN (nibble swap)
move.b #$20,$236005 ;Clock
move.b $236005,18644(a5) ;Read GAD/GBD with EVEN (nibble swap)
move.b #$20,$236005 ;Clock
move.b $236005,18645(a5) ;Read GAD/GBD with EVEN (nibble swap)
move.b #$20,$236005 ;Clock
move.l 18642(a5),d0
subi.l #$0FA56310,d0 ;Compare reads
rts
Load C: 00110110011010100000011000011010 ($366A061A) PRO-CT0 serialize: 00110110 3 01101010 2 00000110 1 00011010 0 GAD/GBD to D7~D0 remap: 00000110 1 00011010 0 00110110 3 01101010 2 |||||||| 01365AF0 nibble swap: 1063A50F ->
move #$1824,$242812 ;LOAD C
move.b $23600D,18642(a5) ;Read GAD/GBD with H and EVEN
move.b #$20,$23600D ;Clock
move.b $23600D,18643(a5) ;Read GAD/GBD with H and EVEN
move.b #$20,$23600D ;Clock
move.b $23600D,18644(a5) ;Read GAD/GBD with H and EVEN
move.b #$20,$23600D ;Clock
move.b $23600D,18645(a5) ;Read GAD/GBD with H and EVEN
move.b #$20,$23600D ;Clock
move.l 18642(a5),d0
subi.l #$18244281,d0 ;Compare reads
rts
Load C: 00100100100000010100001000011000 ($24814218) PRO-CT0 serialize: 00100100 3 10000001 2 01000010 1 00011000 0 GAD/GBD to D7~D0 remap: 01000010 1 00011000 0 00100100 3 10000001 2 |||||||| 18244281 nibble swap: <- 81422418