summaryrefslogtreecommitdiff
path: root/src/engine
diff options
context:
space:
mode:
Diffstat (limited to 'src/engine')
-rwxr-xr-xsrc/engine/bank1.asm251
-rwxr-xr-xsrc/engine/bank1c.asm314
-rwxr-xr-xsrc/engine/bank2.asm791
-rwxr-xr-xsrc/engine/bank20.asm133
-rwxr-xr-xsrc/engine/bank3.asm1457
-rwxr-xr-xsrc/engine/bank4.asm1147
-rwxr-xr-xsrc/engine/bank6.asm175
-rwxr-xr-xsrc/engine/bank7.asm314
-rwxr-xr-xsrc/engine/home.asm4851
9 files changed, 9433 insertions, 0 deletions
diff --git a/src/engine/bank1.asm b/src/engine/bank1.asm
new file mode 100755
index 0000000..c29a4c4
--- /dev/null
+++ b/src/engine/bank1.asm
@@ -0,0 +1,251 @@
+Func_4000: ; 4000 (1:4000)
+ di
+ ld sp, $e000
+ call ResetSerial
+ call EnableInt_VBlank
+ call EnableInt_Timer
+ call EnableExtRAM
+ ld a, [$a006]
+ ld [$ce47], a
+ ld a, [$a009]
+ ld [$ccf2], a
+ call DisableExtRAM
+ ld a, $1
+ ld [$cd0d], a
+ ei
+ farcall Func_1a6cc
+ ld a, [$ff90]
+ cp $3
+ jr z, .asm_4035
+ farcall Func_126d1
+ jr Func_4000
+.asm_4035
+ call Func_405a
+ call Func_04a2
+ ld hl, $00a2
+ call Func_2af0
+ jr c, .asm_404d
+ call EnableExtRAM
+ xor a
+ ld [$a000], a
+ call DisableExtRAM
+.asm_404d
+ jp Reset
+
+Func_4050: ; 4050 (1:4050)
+ farcall Func_1996e
+ ld a, $1
+ ld [$cd0d], a
+ ret
+
+Func_405a: ; 405a (1:405a)
+INCBIN "baserom.gbc",$405a,$406f - $405a
+
+Func_406f: ; 406f (1:406f)
+INCBIN "baserom.gbc",$406f,$409f - $406f
+
+; this function begins the duel after the opponent's
+; graphics, name and deck have been introduced
+Duel_Start: ; 409f (1:409f)
+ ld a, $c2
+ ld [$ff97], a
+ ld a, $0
+ ld [$c2f1], a
+ ld a, [$cc19]
+ ld [wOpponentDeck], a
+ call $6793
+ call Func_1c72
+ call Duel_LoadDecks
+ call Func_1c72
+ jr .asm_40ca
+
+ ld a, MUSIC_DUELTHEME1
+ ld [wDuelTheme], a
+ ld hl, $cc16
+ xor a
+ ld [hli], a
+ ld [hl], a
+ ld [wIsPracticeDuel], a
+
+.asm_40ca
+ ld hl, [sp+$0]
+ ld a, l
+ ld [$cbe5], a
+ ld a, h
+ ld [$cbe6], a
+ xor a
+ ld [$cbc6], a
+ call $420b
+ ld a, [$cc18]
+ ld [$cc08], a
+ call $70aa
+ ld a, [wDuelTheme]
+ call PlaySong
+ call $4b60
+ ret c
+
+; the loop returns here after every turn switch
+.mainDuelLoop
+ xor a
+ ld [$cbc6], a
+ call $35e6
+ call $54c8
+ call $4225
+ call $0f58
+ ld a, [$cc07]
+ or a
+ jr nz, .asm_4136
+ call $35fa
+ call $6baf
+ call $3b31
+ call $0f58
+ ld a, [$cc07]
+ or a
+ jr nz, .asm_4136
+ ld hl, $cc06
+ inc [hl]
+ ld a, [$cc09]
+ cp $80
+ jr z, .asm_4126
+.asm_4121
+ call Func_1c72
+ jr .mainDuelLoop
+
+.asm_4126
+ ld a, [wIsPracticeDuel]
+ or a
+ jr z, .asm_4121
+ ld a, [hl]
+ cp $f
+ jr c, .asm_4121
+ xor a
+ ld [$d0c3], a
+ ret
+
+.asm_4136
+ call $5990
+ call Func_04a2
+ ld a, $3
+ call $2167
+ ld hl, $0076
+ call Func_2aab
+ call Func_04a2
+ ld a, [$ff97]
+ push af
+ ld a, $c2
+ ld [$ff97], a
+ call $4a97
+ call $4ad6
+ pop af
+ ld [$ff97], a
+ call $3b21
+ ld a, [$cc07]
+ cp $1
+ jr z, .asm_4171
+ cp $2
+ jr z, .asm_4184
+ ld a, $5f
+ ld c, $1a
+ ld hl, $0077
+ jr .asm_4196
+
+.asm_4171
+ ld a, [$ff97]
+ cp $c2
+ jr nz, .asm_418a
+.asm_4177
+ xor a
+ ld [$d0c3], a
+ ld a, $5d
+ ld c, $18
+ ld hl, $0078
+ jr .asm_4196
+
+.asm_4184
+ ld a, [$ff97]
+ cp $c2
+ jr nz, .asm_4177
+
+.asm_418a
+ ld a, $1
+ ld [$d0c3], a
+ ld a, $5e
+ ld c, $19
+ ld hl, $0079
+
+.asm_4196
+ call $3b6a
+ ld a, c
+ call PlaySong
+ ld a, $c3
+ ld [$ff97], a
+ call Func_2a59
+ call EnableLCD
+.asm_41a7
+ call Func_053f
+ call Func_378a
+ or a
+ jr nz, .asm_41a7
+ ld a, [$cc07]
+ cp $3
+ jr z, .asm_41c8
+ call Func_39fc
+ call $2aae
+ call $3b31
+ call ResetSerial
+ ld a, $c2
+ ld [$ff97], a
+ ret
+
+.asm_41c8
+ call $2aae
+ call $3b31
+ ld a, [wDuelTheme]
+ call PlaySong
+ ld hl, $007a
+ call Func_2aab
+ ld a, $1
+ ld [$cc08], a
+ call $70aa
+ ld a, [$cc09]
+ cp $1
+ jr z, .asm_41f3
+ ld a, $c2
+ ld [$ff97], a
+ call $4b60
+ jp $40ee
+
+.asm_41f3
+ call $0f58
+ ld h, $c2
+ ld a, [wSerialOp]
+ cp $29
+ jr z, .asm_4201
+ ld h, $c3
+
+.asm_4201
+ ld a, h
+ ld [$ff97], a
+ call $4b60
+ jp nc, $40ee
+ ret
+; 0x420b
+
+INCBIN "baserom.gbc",$420b,$5aeb - $420b
+
+Func_5aeb: ; 5aeb (1:5aeb)
+INCBIN "baserom.gbc",$5aeb,$6785 - $5aeb
+
+Func_6785: ; 6785 (1:6785)
+INCBIN "baserom.gbc",$6785,$7354 - $6785
+
+BuildVersion: ; 7354 (1:7354)
+ db "VER 12/20 09:36",TX_END
+
+INCBIN "baserom.gbc",$7364,$7571 - $7364
+
+Func_7571: ; 7571 (1:7571)
+INCBIN "baserom.gbc",$7571,$758f - $7571
+
+Func_758f: ; 758f (1:758f)
+INCBIN "baserom.gbc",$758f,$8000 - $758f
diff --git a/src/engine/bank1c.asm b/src/engine/bank1c.asm
new file mode 100755
index 0000000..e11aaef
--- /dev/null
+++ b/src/engine/bank1c.asm
@@ -0,0 +1,314 @@
+Func_70000: ; 70000 (1c:4000)
+ ld a, [$cab4]
+ cp $1
+ ret nz
+ ld b, $1
+ ld a, $22
+ farcall Func_ca6c
+ or a
+ jr z, .asm_70013
+ ld b, $2
+.asm_70013
+ ld a, b
+ call Func_70044
+ ret
+
+Func_70018: ; 70018 (1c:4018)
+ ld a, [$cab4]
+ cp $1
+ ret nz
+ ld a, $0
+ call Func_70044
+ ret
+; 0x70024
+
+INCBIN "baserom.gbc",$70024,$70044 - $70024
+
+Func_70044: ; 70044 (1c:4044)
+ push hl
+ push bc
+ add a
+ ld c, a
+ add a
+ add c
+ ld c, a
+ ld b, $0
+ ld hl, Unknown_70057
+ add hl, bc
+ call Func_70082
+ pop bc
+ pop hl
+ ret
+
+Unknown_70057: ; 70057 (1c:4057)
+INCBIN "baserom.gbc",$70057,$70082 - $70057
+
+Func_70082: ; 70082 (1c:4082)
+ ld a, [$cab4]
+ cp $1
+ ret nz
+ push hl
+ push bc
+ ld a, [hli]
+ push hl
+ ld h, [hl]
+ ld l, a
+ call Func_700a3
+ pop hl
+ inc hl
+ ld a, [hli]
+ ld e, a
+ ld a, [hli]
+ ld d, a
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ call Func_700fe
+ call Func_701c0
+ pop bc
+ pop hl
+ ret
+
+Func_700a3: ; 700a3 (1c:40a3)
+ push hl
+ push bc
+ push de
+ push hl
+ call Func_70136
+ pop hl
+ push hl
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ ld de, $8800
+ call Func_701e9
+ call Func_701fe
+ ld hl, SGB_700de
+ call Func_70177
+ pop hl
+ ld de, $0002
+ add hl, de
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ ld a, [hli]
+ or [hl]
+ jr z, .asm_700da
+ call Func_70136
+ dec hl
+ ld de, $8800
+ call Func_701e9
+ ld hl, SGB_700ee
+ call Func_70177
+.asm_700da
+ pop de
+ pop bc
+ pop hl
+ ret
+
+; CHR_TRN: tiles $00-$7F, BG (border) tiles (from SNES $000-$FFF)
+SGB_700de: ; 700de (1c:40de)
+INCBIN "baserom.gbc",$700de,$700ee - $700de
+
+; CHR_TRN: tiles $80-$FF, BG (border) tiles (from SNES $000-$FFF)
+SGB_700ee: ; 700ee (1c:40ee)
+INCBIN "baserom.gbc",$700ee,$700fe - $700ee
+
+Func_700fe: ; 700fe (1c:40fe)
+ push hl
+ push bc
+ push de
+ push hl
+ push de
+ push hl
+ call Func_70136
+ pop hl
+ ld de, $8800
+ call Func_701e9
+ pop hl
+ ld de, $9000
+ call Func_701e9
+ call Func_701fe
+ pop hl
+ call Func_70214
+ ld hl, SGB_70126
+ call Func_70177
+ pop de
+ pop bc
+ pop hl
+ ret
+
+; PCT_TRN: read tile map & palette data into VRAM (from SNES $000-$87F)
+SGB_70126: ; 70126 (1c:4126)
+INCBIN "baserom.gbc",$70126,$70136 - $70126
+
+Func_70136: ; 70136 (1c:4136)
+ push hl
+ push bc
+ push de
+ ld a, [$ff92]
+ ld [$d41d], a
+ ld a, [$ff93]
+ ld [$d41e], a
+ ld a, [$cabc]
+ ld [$d41f], a
+ ld a, [$cabb]
+ ld [$d420], a
+ di
+ ld hl, SGB_MASK_EN_ON_701a0
+ call SendSGB
+ call DisableLCD
+ ld a, [$cabb]
+ and $41
+ or $1
+ ld [$cabb], a
+ ld a, $e4
+ ld [rBGP], a
+ call Func_040c
+ xor a
+ ld [hSCX], a
+ ld [rSCX], a
+ ld [hSCY], a
+ ld [rSCY], a
+ pop de
+ pop bc
+ pop hl
+ ret
+
+Func_70177: ; 70177 (1c:4177)
+ push hl
+ push bc
+ push de
+ push hl
+ call EnableLCD
+ pop hl
+ call SendSGB
+ ld a, [$d41d]
+ ld [hSCX], a
+ ld a, [$d41e]
+ ld [hSCY], a
+ ld a, [$d41f]
+ call Func_040c
+ ld a, [$d420]
+ ld [$cabb], a
+ call DisableLCD
+ ei
+ pop de
+ pop bc
+ pop hl
+ ret
+
+; MASK_EN on
+SGB_MASK_EN_ON_701a0: ; 701a0 (1c:41a0)
+INCBIN "baserom.gbc",$701a0,$701b0 - $701a0
+
+; MASK_EN off
+SGB_MASK_EN_OFF_701b0: ; 701b0 (1c:41b0)
+INCBIN "baserom.gbc",$701b0,$701c0 - $701b0
+
+Func_701c0: ; 701c0 (1c:41c0)
+ push hl
+ push bc
+ call DisableLCD
+ xor a
+ ld c, $10
+ ld hl, $9000
+.asm_701cb
+ ld [hli], a
+ dec c
+ jr nz, .asm_701cb
+ ld a, [$cab6]
+ push af
+ xor a
+ ld [$cab6], a
+ call Func_04a2
+ pop af
+ ld [$cab6], a
+ di
+ ld hl, SGB_MASK_EN_OFF_701b0
+ call SendSGB
+ ei
+ pop bc
+ pop hl
+ ret
+
+Func_701e9: ; 701e9 (1c:41e9)
+ ld a, [hli]
+ ld c, a
+ ld a, [hli]
+ ld b, a
+ or c
+ ret z
+ push de
+ push bc
+ ld e, l
+ ld d, h
+ ld b, $c0
+ call Func_08bf
+ pop bc
+ pop de
+ call Func_08de
+ ret
+
+Func_701fe: ; 701fe (1c:41fe)
+ ld hl, $9800
+ ld de, $000c
+ ld a, $80
+ ld c, $d
+.asm_70208
+ ld b, $14
+.asm_7020a
+ ld [hli], a
+ inc a
+ dec b
+ jr nz, .asm_7020a
+ add hl, de
+ dec c
+ jr nz, .asm_70208
+ ret
+
+Func_70214: ; 70214 (1c:4214)
+ ld a, l
+ cp $dc
+ ret nz
+ ld a, h
+ cp $49
+ ret nz
+ ld hl, Unknown_7024a
+ ld a, $10
+ farcall Func_ca6c
+ ld c, $8
+.asm_70227
+ push bc
+ push hl
+ push af
+ bit 7, a
+ jr z, .asm_7023e
+ ld c, $9
+.asm_70230
+ push bc
+ ld e, [hl]
+ inc hl
+ ld d, [hl]
+ inc hl
+ ld a, [hli]
+ ld [de], a
+ inc de
+ ld a, [hli]
+ ld [de], a
+ pop bc
+ dec c
+ jr nz, .asm_70230
+.asm_7023e
+ pop af
+ rlca
+ pop hl
+ ld bc, $0024
+ add hl, bc
+ pop bc
+ dec c
+ jr nz, .asm_70227
+ ret
+
+Unknown_7024a: ; 7024a (1c:424a)
+INCBIN "baserom.gbc",$7024a,$74000 - $7024a
diff --git a/src/engine/bank2.asm b/src/engine/bank2.asm
new file mode 100755
index 0000000..1c82b47
--- /dev/null
+++ b/src/engine/bank2.asm
@@ -0,0 +1,791 @@
+INCBIN "baserom.gbc",$8000,$8cd4 - $8000
+
+Func_8cd4: ; 8cd4 (2:4cd4)
+ push bc
+ call EnableExtRAM
+ ld b, $3c
+.asm_8cda
+ ld a, [de]
+ inc de
+ ld [hli], a
+ dec b
+ jr nz, .asm_8cda
+ xor a
+ ld [hl], a
+ call DisableExtRAM
+ pop bc
+ ret
+; 0x8ce7
+
+INCBIN "baserom.gbc",$8ce7,$8cf9 - $8ce7
+
+Func_8cf9: ; 8cf9 (2:4cf9)
+ call EnableExtRAM
+ xor a
+ ld hl, $b703
+ ld [hli], a
+ inc a
+ ld [hli], a
+ ld [hli], a
+ ld [hl], a
+ ld [$b701], a
+ call DisableExtRAM
+Func_8d0b: ; 8d0b (2:4d0b)
+ ld hl, Unknown_8d15
+ ld de, $9380
+ call Func_92ad
+ ret
+
+Unknown_8d15: ; 8d15 (2:4d15)
+INCBIN "baserom.gbc",$8d15,$8d56 - $8d15
+
+Func_8d56: ; 8d56 (2:4d56)
+ xor a
+ ld [$cab6], a
+ call Func_04a2
+ call Func_099c
+ ld a, $1
+ ld [$cac0], a
+ call Func_2119
+ call Func_20b0
+ call Func_8d0b
+ bank1call Func_5aeb
+ ld de, $3cbf
+ call Func_2275
+ ret
+; 0x8d78
+
+INCBIN "baserom.gbc",$8d78,$8d9d - $8d78
+
+Func_8d9d: ; 8d9d (2:4d9d)
+ ld de, $cfd1
+ ld b, $7
+.asm_8da2
+ ld a, [hli]
+ ld [de], a
+ inc de
+ dec b
+ jr nz, .asm_8da2
+ ret
+
+Unknown_8da9: ; 8da9 (2:4da9)
+INCBIN "baserom.gbc",$8da9,$8db0 - $8da9
+
+Func_8db0: ; 8db0 (2:4db0)
+ ld hl, Unknown_8da9
+ call Func_8d9d
+ ld a, $ff
+ call Func_9168
+ xor a
+
+Func_8dbc: ; 8dbc (2:4dbc)
+ ld hl, Unknown_8de2
+ call Func_2636
+ ld hl, $0224
+ call Func_2a59
+.asm_8dc8
+ call Func_053f
+ jr c, Func_8dbc
+ call Func_8dea
+ jr c, Func_8dbc
+ call Func_264b
+ jr nc, .asm_8dc8
+ ld a, [$ffb1]
+ cp $ff
+ ret z
+ ld [$ceb1], a
+ jp Func_8e42
+
+Unknown_8de2: ; 8de2 (2:4de2)
+INCBIN "baserom.gbc",$8de2,$8dea - $8de2
+
+Func_8dea: ; 8dea (2:4dea)
+ ld a, [hButtonsPressed2]
+ and $8
+ ret z
+ ld a, [$cd10]
+ ld [$ceb1], a
+ call Func_8ff2
+ jp nc, Func_8e05
+ ld a, $ff
+ call Func_90fb
+ call Func_8fe8
+ scf
+ ret
+
+Func_8e05: ; 8e05 (2:4e05)
+ ld a, $1
+ call Func_90fb
+ call Func_9048
+ push hl
+ call Func_9038
+ pop de
+ call Func_8e1f
+ ld a, $ff
+ call Func_9168
+ ld a, [$ceb1]
+ scf
+ ret
+
+Func_8e1f: ; 8e1f (2:4e1f)
+ push de
+ ld de, $cfb9
+ call Func_92b4
+ pop de
+ ld hl, $cf17
+ call Func_8cd4
+ ld a, $9
+ ld hl, $cebb
+ call Func_9843
+ ld a, $3c
+ ld [$cecc], a
+ ld hl, $cebb
+ ld [hl], a
+ call Func_9e41
+ ret
+
+Func_8e42: ; 8e42 (2:4e42)
+ call Func_2a9e
+ ld hl, Unknown_9027
+ call Func_2c08
+ call Func_905a
+.asm_8e4e
+ call Func_053f
+ call Func_9065
+ jp nc, .asm_8e4e
+ cp $ff
+ jr nz, .asm_8e64
+ call Func_90d8
+ ld a, [$ceb1]
+ jp Func_8dbc
+.asm_8e64
+ ld a, [$ceaf]
+ or a
+ jp nz, Func_8f8a
+ ld a, [$ceb0]
+ or a
+ jp nz, .asm_8ecf
+ call Func_9048
+ ld e, l
+ ld d, h
+ ld hl, $cf17
+ call Func_8cd4
+ ld a, $14
+ ld hl, $cfb9
+ call Func_9843
+ ld de, $cfb9
+ call Func_9038
+ call Func_92b4
+ call Func_9345
+ jr nc, .asm_8ec4
+ call EnableExtRAM
+ ld hl, $cf17
+ call Func_910a
+ call Func_9048
+ call Func_9152
+ ld e, l
+ ld d, h
+ ld hl, $cf17
+ ld b, $3c
+.asm_8ea9
+ ld a, [hli]
+ ld [de], a
+ inc de
+ dec b
+ jr nz, .asm_8ea9
+ call Func_9038
+ ld d, h
+ ld e, l
+ ld hl, $cfb9
+ call Func_92ad
+ call Func_9038
+ ld a, [hl]
+ call DisableExtRAM
+ or a
+ jr z, .asm_8edb
+.asm_8ec4
+ ld a, $ff
+ call Func_9168
+ ld a, [$ceb1]
+ jp Func_8dbc
+.asm_8ecf
+ call Func_8ff2
+ jp nc, .asm_8edb
+ call Func_8fe8
+ jp Func_8dbc
+.asm_8edb
+ ld a, $14
+ ld hl, $cfb9
+ call Func_9843
+ ld de, $cfb9
+ call Func_9038
+ call Func_92b4
+ call Func_8f05
+ call Func_9038
+ ld d, h
+ ld e, l
+ ld hl, $cfb9
+ call Func_92b4
+ ld a, $ff
+ call Func_9168
+ ld a, [$ceb1]
+ jp Func_8dbc
+
+Func_8f05: ; 8f05 (2:4f05)
+ ld a, [$ceb1]
+ or a
+ jr nz, .asm_8f10
+ ld hl, Unknown_a763
+ jr .asm_8f23
+.asm_8f10
+ dec a
+ jr nz, .asm_8f18
+ ld hl, Unknown_a76c
+ jr .asm_8f23
+.asm_8f18
+ dec a
+ jr nz, .asm_8f20
+ ld hl, Unknown_a775
+ jr .asm_8f23
+.asm_8f20
+ ld hl, Unknown_a77e
+.asm_8f23
+ ld a, $14
+ ld bc, $0401
+ ld de, $cfb9
+ farcall Func_1ad89
+ ld a, [$cfb9]
+ or a
+ ret nz
+ call Func_8f38
+ ret
+
+Func_8f38: ; 8f38 (2:4f38)
+ ld hl, $b701
+ call EnableExtRAM
+ ld a, [hli]
+ ld h, [hl]
+ call DisableExtRAM
+ ld l, a
+ ld de, $c590
+ call Func_0663
+ ld hl, $cfb9
+ ld [hl], $6
+ inc hl
+ ld [hl], $44
+ inc hl
+ ld [hl], $65
+ inc hl
+ ld [hl], $63
+ inc hl
+ ld [hl], $6b
+ inc hl
+ ld [hl], $20
+ inc hl
+ ld de, $c592
+ ld a, [de]
+ inc de
+ ld [hli], a
+ ld a, [de]
+ inc de
+ ld [hli], a
+ ld a, [de]
+ ld [hli], a
+ xor a
+ ld [hl], a
+ ld hl, $b701
+ call EnableExtRAM
+ ld e, [hl]
+ inc hl
+ ld d, [hl]
+ ld a, $3
+ cp d
+ jr nz, .asm_8f82
+ ld a, $e7
+ cp e
+ jr nz, .asm_8f82
+ ld de, $0000
+.asm_8f82
+ inc de
+ ld [hl], d
+ dec hl
+ ld [hl], e
+ call DisableExtRAM
+ ret
+
+Func_8f8a: ; 8f8a (2:4f8a)
+ ld a, [$ceb0]
+ or a
+ jp nz, Func_9026
+ call Func_8ff2
+ jp nc, Func_8f9d
+ call Func_8fe8
+ jp Func_8dbc
+
+Func_8f9d: ; 8f9d (2:4f9d)
+ call EnableExtRAM
+ ld a, [$b700]
+ call DisableExtRAM
+ ld h, $3
+ ld l, a
+ call Func_0879
+ ld e, l
+ inc e
+ ld d, $2
+ xor a
+ ld hl, $0000
+ ld bc, $0202
+ call Func_1f5f
+ ld a, [$ceb1]
+ call EnableExtRAM
+ ld [$b700], a
+ call DisableExtRAM
+ call Func_9326
+ call Func_9038
+ call EnableExtRAM
+ call Func_9253
+ call DisableExtRAM
+ xor a
+ ld [$ce3f], a
+ ld [$ce40], a
+ ld hl, $022a
+ call Func_2aab
+ ld a, [$ceb1]
+ jp Func_8dbc
+
+Func_8fe8: ; 8fe8 (2:4fe8)
+ ld hl, $022f
+ call Func_2aab
+ ld a, [$ceb1]
+ ret
+
+Func_8ff2: ; 8ff2 (2:4ff2)
+ ld a, [$ceb1]
+ ld hl, $ceb2
+ ld b, $0
+ ld c, a
+ add hl, bc
+ ld a, [hl]
+ or a
+ ret nz
+ scf
+ ret
+; 0x9001
+
+INCBIN "baserom.gbc",$9001,$9026 - $9001
+
+Func_9026: ; 9026 (2:5026)
+ ret
+
+Unknown_9027: ; 9027 (2:5027)
+INCBIN "baserom.gbc",$9027,$9038 - $9027
+
+Func_9038: ; 9038 (2:5038)
+ ld a, [$ceb1]
+ ld h, a
+ ld l, $54
+ call Func_0879
+ push de
+ ld de, $a200
+ add hl, de
+ pop de
+ ret
+
+Func_9048: ; 9048 (2:5048)
+ push af
+ ld a, [$ceb1]
+ ld h, a
+ ld l, $54
+ call Func_0879
+ push de
+ ld de, $a218
+ add hl, de
+ pop de
+ pop af
+ ret
+
+Func_905a: ; 905a (2:505a)
+ xor a
+ ld [$ceaf], a
+ ld [$ceb0], a
+ ld [$cea3], a
+ ret
+
+Func_9065: ; 9065 (2:5065)
+ xor a
+ ld [$cfe3], a
+ ld a, [$ceaf]
+ ld d, a
+ ld a, [$ceb0]
+ ld e, a
+ ld a, [hButtonsPressed2]
+ or a
+ jr z, .asm_90a6
+ bit 5, a
+ jr nz, .asm_907e
+ bit 4, a
+ jr z, .asm_9084
+.asm_907e
+ ld a, d
+ xor $1
+ ld d, a
+ jr .asm_9090
+.asm_9084
+ bit 6, a
+ jr nz, .asm_908c
+ bit 7, a
+ jr z, .asm_90a6
+.asm_908c
+ ld a, e
+ xor $1
+ ld e, a
+.asm_9090
+ ld a, $1
+ ld [$cfe3], a
+ push de
+ call Func_90d8
+ pop de
+ ld a, d
+ ld [$ceaf], a
+ ld a, e
+ ld [$ceb0], a
+ xor a
+ ld [$cea3], a
+.asm_90a6
+ ld a, [$ff91]
+ and $3
+ jr z, .asm_90c1
+ and $1
+ jr nz, .asm_90b7
+ ld a, $ff
+ call Func_90fb
+ scf
+ ret
+.asm_90b7
+ call Func_90f7
+ ld a, $1
+ call Func_90fb
+ scf
+ ret
+.asm_90c1
+ ld a, [$cfe3]
+ or a
+ jr z, .asm_90ca
+ call Func_3796
+.asm_90ca
+ ld hl, $cea3
+ ld a, [hl]
+ inc [hl]
+ and $f
+ ret nz
+ ld a, $f
+ bit 4, [hl]
+ jr z, asm_90da
+Func_90d8: ; 90d8 (2:50d8)
+ ld a, $0
+asm_90da
+ ld e, a
+ ld a, $a
+ ld l, a
+ ld a, [$ceaf]
+ ld h, a
+ call Func_0879
+ ld a, l
+ add $1
+ ld b, a
+ ld a, [$ceb0]
+ sla a
+ add $e
+ ld c, a
+ ld a, e
+ call Func_06c3
+ or a
+ ret
+
+Func_90f7: ; 90f7 (2:50f7)
+ ld a, $f
+ jr asm_90da
+
+Func_90fb: ; 90fb (2:50fb)
+ push af
+ inc a
+ jr z, .asm_9103
+ ld a, $2
+ jr .asm_9105
+.asm_9103
+ ld a, $3
+.asm_9105
+ call Func_3796
+ pop af
+ ret
+
+Func_910a: ; 910a (2:510a)
+ push hl
+ ld b, $0
+ ld d, $3c
+.asm_910f
+ ld a, [hli]
+ or a
+ jr z, .asm_911e
+ ld c, a
+ push hl
+ ld hl, $a100
+ add hl, bc
+ dec [hl]
+ pop hl
+ dec d
+ jr nz, .asm_910f
+.asm_911e
+ pop hl
+ ret
+; 0x9120
+
+INCBIN "baserom.gbc",$9120,$9152 - $9120
+
+Func_9152: ; 9152 (2:5152)
+ push hl
+ ld b, $0
+ ld d, $3c
+.asm_9157
+ ld a, [hli]
+ or a
+ jr z, .asm_9166
+ ld c, a
+ push hl
+ ld hl, $a100
+ add hl, bc
+ inc [hl]
+ pop hl
+ dec d
+ jr nz, .asm_9157
+.asm_9166
+ pop hl
+ ret
+
+Func_9168: ; 9168 (2:5168)
+ ;ld [$ffb5], a
+ db $ea, $b5, $ff
+ call Func_8d56
+ ld de, $0000
+ ld bc, $1404
+ call Func_1e7c
+ ld de, $0003
+ ld bc, $1404
+ call Func_1e7c
+ ld de, $0006
+ ld bc, $1404
+ call Func_1e7c
+ ld de, $0009
+ ld bc, $1404
+ call Func_1e7c
+ ld hl, Unknown_9242
+ call Func_2c08
+ ld a, $4
+ ld hl, $ceb2
+ call Func_9843
+ ;ld a, [$ffb5]
+ db $fa, $b5, $ff
+ bit 0, a
+ jr z, .asm_91b0
+ ld hl, $a200
+ ld de, $0602
+ call Func_926e
+.asm_91b0
+ ld hl, $a218
+ call Func_9314
+ jr c, .asm_91bd
+ ld a, $1
+ ld [$ceb2], a
+.asm_91bd
+ ;ld a, [$ffb5]
+ db $fa, $b5, $ff
+ bit 1, a
+ jr z, .asm_91cd
+ ld hl, $a254
+ ld de, $0605
+ call Func_926e
+.asm_91cd
+ ld hl, $a26c
+ call Func_9314
+ jr c, .asm_91da
+ ld a, $1
+ ld [$ceb3], a
+.asm_91da
+ ;ld a, [$ffb5]
+ db $fa, $b5, $ff
+ bit 2, a
+ jr z, .asm_91ea
+ ld hl, $a2a8
+ ld de, $0608
+ call Func_926e
+.asm_91ea
+ ld hl, $a2c0
+ call Func_9314
+ jr c, .asm_91f7
+ ld a, $1
+ ld [$ceb4], a
+.asm_91f7
+ ;ld a, [$ffb5]
+ db $fa, $b5, $ff
+ bit 3, a
+ jr z, .asm_9207
+ ld hl, $a2fc
+ ld de, $060b
+ call Func_926e
+.asm_9207
+ ld hl, $a314
+ call Func_9314
+ jr c, .asm_9214
+ ld a, $1
+ ld [$ceb5], a
+.asm_9214
+ call EnableExtRAM
+ ld a, [$b700]
+ ld c, a
+ ld b, $0
+ ld d, $2
+.asm_921f
+ ld hl, $ceb2
+ add hl, bc
+ ld a, [hl]
+ or a
+ jr nz, .asm_9234
+ inc c
+ ld a, $4
+ cp c
+ jr nz, .asm_921f
+ ld c, $0
+ dec d
+ jr z, .asm_9234
+ jr .asm_921f
+.asm_9234
+ ld a, c
+ ld [$b700], a
+ call DisableExtRAM
+ call Func_9326
+ call EnableLCD
+ ret
+
+Unknown_9242: ; 9242 (2:5242)
+INCBIN "baserom.gbc",$9242,$9253 - $9242
+
+Func_9253: ; 9253 (2:5253)
+ ld de, $c590
+ call Func_92ad
+ ld hl, $c590
+ call Func_23c1
+ ld b, $0
+ ld hl, $c590
+ add hl, bc
+ ld d, h
+ ld e, l
+ ld hl, Unknown_92a7
+ call Func_92ad
+ ret
+
+Func_926e: ; 926e (2:526e)
+ push hl
+ call Func_9314
+ pop hl
+ jr c, .asm_929c
+ push de
+ ld de, $c590
+ call Func_92b4
+ ld hl, $c590
+ call Func_23c1
+ ld b, $0
+ ld hl, $c590
+ add hl, bc
+ ld d, h
+ ld e, l
+ ld hl, Unknown_92a7
+ call Func_92ad
+ pop de
+ ld hl, $c590
+ call Func_22ae
+ call Func_21c5
+ or a
+ ret
+.asm_929c
+ call Func_22ae
+ ld hl, $0223
+ call Func_2c29
+ scf
+ ret
+
+Unknown_92a7: ; 92a7 (2:52a7)
+INCBIN "baserom.gbc",$92a7,$92ad - $92a7
+
+Func_92ad: ; 92ad (2:52ad)
+ ld a, [hli]
+ ld [de], a
+ or a
+ ret z
+ inc de
+ jr Func_92ad
+
+Func_92b4: ; 92b4 (2:52b4)
+ call EnableExtRAM
+ call Func_92ad
+ call DisableExtRAM
+ ret
+; 0x92be
+
+INCBIN "baserom.gbc",$92be,$9314 - $92be
+
+Func_9314: ; 9314 (2:5314)
+ ld bc, $0018
+ add hl, bc
+ call EnableExtRAM
+ ld a, [hl]
+ call DisableExtRAM
+ or a
+ jr nz, .asm_9324
+ scf
+ ret
+.asm_9324
+ or a
+ ret
+
+Func_9326: ; 9326 (2:5326)
+ call EnableExtRAM
+ ld a, [$b700]
+ call DisableExtRAM
+ ld h, $3
+ ld l, a
+ call Func_0879
+ ld e, l
+ inc e
+ ld d, $2
+ ld a, $38
+ ld hl, $0102
+ ld bc, $0202
+ call Func_1f5f
+ ret
+
+Func_9345: ; 9345 (2:5345)
+INCBIN "baserom.gbc",$9345,$9843 - $9345
+
+Func_9843: ; 9843 (2:5843)
+INCBIN "baserom.gbc",$9843,$9e41 - $9843
+
+Func_9e41: ; 9e41 (2:5e41)
+INCBIN "baserom.gbc",$9e41,$a288 - $9e41
+
+Func_a288: ; a288 (2:6288)
+INCBIN "baserom.gbc",$a288,$a763 - $a288
+
+Unknown_a763: ; a763 (2:6763)
+INCBIN "baserom.gbc",$a763,$a76c - $a763
+
+Unknown_a76c: ; a76c (2:676c)
+INCBIN "baserom.gbc",$a76c,$a775 - $a76c
+
+Unknown_a775: ; a775 (2:6775)
+INCBIN "baserom.gbc",$a775,$a77e - $a775
+
+Unknown_a77e: ; a77e (2:677e)
+INCBIN "baserom.gbc",$a77e,$b177 - $a77e
+
+Func_b177: ; b177 (2:7177)
+INCBIN "baserom.gbc",$b177,$c000 - $b177
diff --git a/src/engine/bank20.asm b/src/engine/bank20.asm
new file mode 100755
index 0000000..11ca29a
--- /dev/null
+++ b/src/engine/bank20.asm
@@ -0,0 +1,133 @@
+Func_80000: ; 80000 (20:4000)
+INCBIN "baserom.gbc",$80000,$80028 - $80000
+
+Func_80028: ; 80028 (20:4028)
+INCBIN "baserom.gbc",$80028,$8020f - $80028
+
+Func_8020f: ; 8020f (20:420f)
+ push bc
+ push af
+ ld bc, MapDataPointers
+ ld h, $0
+ add hl, bc
+ ld c, [hl]
+ inc hl
+ ld b, [hl]
+ pop af
+ ld l, a
+ ld h, $0
+ sla l
+ rl h
+ sla l
+ rl h
+ add hl, bc
+ pop bc
+ ret
+
+Func_80229: ; 80229 (20:4229)
+ ld a, [hli]
+ ld [$d4c4], a
+ ld a, [hli]
+ ld [$d4c5], a
+ ld a, [hli]
+ add $20
+ ld [$d4c6], a
+ ret
+; 0x80238
+
+INCBIN "baserom.gbc",$80238,$8025b - $80238
+
+Func_8025b: ; 8025b (20:425b)
+ push hl
+ ld l, $4
+ call Func_8020f
+ call Func_80229
+ ld a, [hl]
+ push af
+ ld [$d4c8], a
+ ld a, $10
+ ld [$d4c7], a
+ call Func_80274
+ pop af
+ pop hl
+ ret
+
+Func_80274: ; 80274 (20:4274)
+ call Func_8029f
+ jr asm_8027c
+
+Func_80279: ; 80279 (20:4279)
+ call Func_802bb
+asm_8027c
+ push hl
+ push bc
+ push de
+ ld a, [$d4c8]
+ ld b, a
+ ld a, [$d4c7]
+ ld c, a
+ ld hl, $d4c2
+ ld e, [hl]
+ inc hl
+ ld d, [hl]
+ ld hl, $d4c4
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ inc hl
+ inc hl
+ call Func_395a
+ call BankswitchVRAM_0
+ pop de
+ pop bc
+ pop hl
+ ret
+
+Func_8029f: ; 8029f (20:429f)
+ ld a, [$d4ca]
+ swap a
+ push af
+ and $f0
+ ld [$d4c2], a
+ pop af
+ and $f
+ add $80
+ ld [$d4c3], a
+ ld a, [$d4cb]
+ and $1
+ call BankswitchVRAM
+ ret
+
+Func_802bb: ; 802bb (20:42bb)
+ ld a, [$d4ca]
+ push af
+ xor $80
+ ld [$d4ca], a
+ call Func_8029f
+ ld a, [$d4c3]
+ add $8
+ ld [$d4c3], a
+ pop af
+ ld [$d4ca], a
+ ret
+; 0x802d4
+
+INCBIN "baserom.gbc",$802d4,$80418 - $802d4
+
+Func_80418: ; 80418 (20:4418)
+INCBIN "baserom.gbc",$80418,$80480 - $80418
+
+Func_80480: ; 80480 (20:4480)
+INCBIN "baserom.gbc",$80480,$804d8 - $80480
+
+Func_804d8: ; 804d8 (20:44d8)
+INCBIN "baserom.gbc",$804d8,$80b7a - $804d8
+
+Func_80b7a: ; 80b7a (20:4b7a)
+INCBIN "baserom.gbc",$80b7a,$80e5a - $80b7a
+
+Unknown_80e5a: ; 80e5a (20:4e5a)
+INCBIN "baserom.gbc",$80e5a,$80e5d - $80e5a
+
+MapDataPointers: ; 80e5d (20:4e5d)
+INCBIN "baserom.gbc",$80e5d,$84000 - $80e5d
diff --git a/src/engine/bank3.asm b/src/engine/bank3.asm
new file mode 100755
index 0000000..38a56cd
--- /dev/null
+++ b/src/engine/bank3.asm
@@ -0,0 +1,1457 @@
+LoadMap: ; c000 (3:4000)
+ call DisableLCD
+ call EnableExtRAM
+ bank1call Func_6785
+ call DisableExtRAM
+ ld a, $0
+ ld [$d0b5], a
+ xor a
+ ld [$d10f], a
+ ld [$d110], a
+ ld [$d113], a
+ farcall Func_10a9b
+ call Func_c1a4
+ call Func_099c
+ xor a
+ ld [$cab6], a
+ call Func_2119
+ call Set_OBJ_8x8
+ xor a
+ ld [$cd08], a
+ xor a
+ ld [$d291], a
+.asm_c037
+ farcall Func_10ab4
+ call Func_c1a4
+ call Func_c241
+ call Func_04a2
+ call Func_3ca0
+ ld a, $c2
+ ld [$ff97], a
+ farcall Func_1c440
+ ld a, [$d0bb]
+ ld [wCurMap], a
+ ld a, [$d0bc]
+ ld [wPlayerXCoord], a
+ ld a, [$d0bd]
+ ld [wPlayerYCoord], a
+ call Func_c36a
+ call Func_c184
+ call Func_c49c
+ farcall Func_80000
+ call Func_c4b9
+ call Func_c943
+ call Func_c158
+ farcall Func_80480
+ call Func_c199
+ xor a
+ ld [$d0b4], a
+ ld [$d0c1], a
+ call Func_39fc
+ farcall Func_10af9
+ call Func_c141
+ call Func_c17a
+.asm_c092
+ call Func_3c48
+ call Func_c491
+ call Func_c0ce
+ ld hl, $d0b4
+ ld a, [hl]
+ and $d0
+ jr z, .asm_c092
+ call Func_3c48
+ ld hl, $d0b4
+ ld a, [hl]
+ bit 4, [hl]
+ jr z, .asm_c0b6
+ ld a, $c
+ call Func_3796
+ jp .asm_c037
+.asm_c0b6
+ farcall Func_10ab4
+ call Func_c1a0
+ ld a, [$d113]
+ or a
+ jr z, .asm_c0ca
+ call Func_c280
+ farcall Duel_Init
+.asm_c0ca
+ call Func_c280
+ ret
+
+Func_c0ce: ; c0ce (3:40ce)
+ ld a, [$d0bf]
+ res 7, a
+ rlca
+ add PointerTable_c0e0 & $ff
+ ld l, a
+ ld a, PointerTable_c0e0 >> $8
+ adc $0
+ ld h, a
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ jp [hl]
+
+PointerTable_c0e0: ; c0e0 (3:40e0)
+ dw Func_c0e8
+ dw Func_c0ed
+ dw Func_c0f1
+ dw Func_c10a
+
+Func_c0e8: ; c0e8 (3:40e8)
+ farcall Func_10e55
+ ret
+
+Func_c0ed: ; c0ed (3:40ed)
+ call Func_c510
+ ret
+
+Func_c0f1: ; c0f1 (3:40f1)
+ ld a, [$d3b6]
+ ld [$d3aa], a
+ farcall Func_1c768
+ ld a, c
+ ld [$d0c6], a
+ ld a, b
+ ld [$d0c7], a
+ ld a, $3
+ ld [$d0bf], a
+ jr Func_c10a
+
+Func_c10a: ; c10a (3:410a)
+ ld hl, $d0c6
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ jp [hl]
+
+Func_c111: ; c111 (3:4111)
+ ld a, [$d0c1]
+ bit 0, a
+ call nz, Func_c135
+ ld a, [$d0c1]
+ bit 1, a
+ jr z, .asm_c12a
+ ld a, [$d3b6]
+ ld [$d3aa], a
+ farcall Func_1c5e9
+.asm_c12a
+ xor a
+ ld [$d0c1], a
+ ld a, [$d0c0]
+ ld [$d0bf], a
+ ret
+
+Func_c135: ; c135 (3:4135)
+ push hl
+ farcall Func_80028
+ ld hl, $d0c1
+ res 0, [hl]
+ pop hl
+ ret
+
+Func_c141: ; c141 (3:4141)
+ ld hl, $d0c2
+ ld a, [hl]
+ or a
+ ret z
+ push af
+ xor a
+ ld [hl], a
+ pop af
+ dec a
+ ld hl, PointerTable_c152
+ jp JumpToFunctionInTable
+
+PointerTable_c152: ; c152 (3:4152)
+ dw Func_c9bc
+ dw Func_fc2b
+ dw Func_fcad
+
+Func_c158: ; c158 (3:4158)
+ ld a, [$d0c2]
+ cp $1
+ ret nz
+ ld a, [$d0c4]
+ ld [$d3ab], a
+ call Func_39c3
+ jr c, .asm_c179
+ ld a, [$d3aa]
+ ld l, $4
+ call Func_39ad
+ ld a, [$d0c5]
+ ld [hl], a
+ farcall Func_1c58e
+.asm_c179
+ ret
+
+Func_c17a: ; c17a (3:417a)
+ ld a, [$d0bf]
+ cp $3
+ ret z
+ call Func_c9b8
+ ret
+
+Func_c184: ; c184 (3:4184)
+ push bc
+ ld c, $1
+ ld a, [wCurMap]
+ cp OVERWORLD_MAP
+ jr nz, .asm_c190
+ ld c, $0
+.asm_c190
+ ld a, c
+ ld [$d0bf], a
+ ld [$d0c0], a
+ pop bc
+ ret
+
+Func_c199: ; c199 (3:4199)
+ ld hl, Func_380e
+ call Func_3bd2
+ ret
+
+Func_c1a0: ; c1a0 (3:41a0)
+ call Func_3bdb
+ ret
+
+Func_c1a4: ; c1a4 (3:41a4)
+ xor a
+ call Func_040c
+ xor a
+ call Set_OBP0
+ xor a
+ call Set_OBP1
+ ret
+
+Func_c1b1: ; c1b1 (3:41b1)
+ ld a, $c
+ ld [$d32e], a
+ ld a, $0
+ ld [$d0bb], a
+ ld a, $c
+ ld [$d0bc], a
+ ld a, $c
+ ld [$d0bd], a
+ ld a, $2
+ ld [$d0be], a
+ call Func_c9cb
+ call Func_c9dd
+ farcall Func_80b7a
+ farcall Func_1c82e
+ farcall Func_131b3
+ xor a
+ ld [wCounter + 0], a
+ ld [wCounter + 1], a
+ ld [wCounter + 2], a
+ ld [wCounter + 3], a
+ ld [wCounter + 4], a
+ ret
+
+Func_c1ed: ; c1ed (3:41ed)
+ call Func_c9cb
+ farcall Func_11416
+ call Func_c9dd
+ ret
+
+Func_c1f8: ; c1f8 (3:41f8)
+ xor a
+ ld [$d0b8], a
+ ld [$d0b9], a
+ ld [$d0ba], a
+ ld [$d11b], a
+ ld [$d0c2], a
+ ld [$d111], a
+ ld [$d112], a
+ ld [$d3b8], a
+ call EnableExtRAM
+ ld a, [$a007]
+ ld [$d421], a
+ ld a, [$a006]
+ ld [$ce47], a
+ call DisableExtRAM
+ farcall Func_10756
+ ret
+
+Func_c228: ; c228 (3:4228)
+ ld a, [wCurMap]
+ ld [$d0bb], a
+ ld a, [wPlayerXCoord]
+ ld [$d0bc], a
+ ld a, [wPlayerYCoord]
+ ld [$d0bd], a
+ ld a, [$d334]
+ ld [$d0be], a
+ ret
+
+Func_c241: ; c241 (3:4241)
+ push hl
+ push bc
+ push de
+ ld de, $307f
+ call Func_2275
+ call Func_c258
+ pop de
+ pop bc
+ pop hl
+ ret
+
+Func_c251: ; c251 (3:4251)
+ ld a, [$ffb0]
+ push af
+ ld a, $1
+ jr asm_c25d
+
+Func_c258: ; c258 (3:4258)
+ ld a, [$ffb0]
+ push af
+ ld a, $2
+asm_c25d
+ ld [$ffb0], a
+ push hl
+ call Func_c268
+ pop hl
+ pop af
+ ld [$ffb0], a
+ ret
+
+Func_c268: ; c268 (3:4268)
+ ld hl, Unknown_c27c
+.asm_c26b
+ push hl
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ or h
+ jr z, .asm_c27a
+ call Func_2c29
+ pop hl
+ inc hl
+ inc hl
+ jr .asm_c26b
+.asm_c27a
+ pop hl
+ ret
+
+Unknown_c27c: ; c27c (3:427c)
+INCBIN "baserom.gbc",$c27c,$c280 - $c27c
+
+Func_c280: ; c280 (3:4280)
+ call Func_c228
+ call Func_3ca0
+ call Func_099c
+ ld hl, $cac0
+ inc [hl]
+ call EnableLCD
+ call Func_3c48
+ call DisableLCD
+ farcall Func_12871
+ ret
+
+Func_c29b: ; c29b (3:429b)
+ push hl
+ ld hl, $d0c1
+ or [hl]
+ ld [hl], a
+ pop hl
+ ret
+
+Func_c2a3: ; c2a3 (3:42a3)
+ push hl
+ push bc
+ push de
+ call Func_c335
+ farcall Func_10ab4
+ ld a, $80
+ call Func_c29b
+ ld de, $307f
+ call Func_2275
+ farcall Func_12ba7
+ call Func_3ca0
+ call Func_099c
+ ld a, $1
+ ld [$cac0], a
+ call EnableLCD
+ call Func_3c48
+ call DisableLCD
+ pop de
+ pop bc
+ pop hl
+ ret
+; 0xc2d4
+
+INCBIN "baserom.gbc",$c2d4,$c2db - $c2d4
+
+Func_c2db: ; c2db (3:42db)
+ push hl
+ push bc
+ push de
+ call DisableLCD
+ call Set_OBJ_8x8
+ call Func_3ca0
+ farcall Func_12bcd
+ ld a, $c2
+ ld [$ff97], a
+ call Func_c241
+ call Func_04a2
+ ld a, [$d111]
+ push af
+ farcall Func_80000
+ pop af
+ ld [$d111], a
+ ld hl, $d0c1
+ res 0, [hl]
+ call Func_c34e
+ farcall Func_12c5e
+ farcall Func_1c6f8
+ ld hl, $d0c1
+ res 7, [hl]
+ ld hl, $d10f
+ ld a, [hli]
+ or [hl]
+ jr z, .asm_c323
+ ld a, [hld]
+ ld l, [hl]
+ ld h, a
+ call Func_3c45
+.asm_c323
+ farcall Func_10af9
+ pop de
+ pop bc
+ pop hl
+ ret
+
+Func_c32b: ; c32b (3:432b)
+ ld a, l
+ ld [$d10f], a
+ ld a, h
+ ld [$d110], a
+ jr Func_c2db
+
+Func_c335: ; c335 (3:4335)
+ ld a, [$cabd]
+ ld [$d10c], a
+ ld a, [$cabe]
+ ld [$d10d], a
+ ld hl, $cb30
+ ld de, $d0cc
+ ld bc, $0040
+ call CopyData_SaveRegisters
+ ret
+
+Func_c34e: ; c34e (3:434e)
+ ld a, [$d10c]
+ ld [$cabd], a
+ ld a, [$d10d]
+ ld [$cabe], a
+ ld hl, $d0cc
+ ld de, $cb30
+ ld bc, $0040
+ call CopyData_SaveRegisters
+ call Func_0404
+ ret
+
+Func_c36a: ; c36a (3:436a)
+ xor a
+ ld [$d323], a
+ ld a, [wCurMap]
+ cp POKEMON_DOME_ENTRANCE
+ jr nz, .asm_c379
+ xor a
+ ld [$d324], a
+.asm_c379
+ ret
+; 0xc37a
+
+INCBIN "baserom.gbc",$c37a,$c41c - $c37a
+
+Func_c41c: ; c41c (3:441c)
+ ld a, [$d332]
+ sub $40
+ ld [$d235], a
+ ld a, [$d333]
+ sub $40
+ ld [$d236], a
+ call Func_c430
+ ret
+
+Func_c430: ; c430 (3:4430)
+ push bc
+ ld a, [$d237]
+ sla a
+ sla a
+ sla a
+ ld b, a
+ ld a, [$d235]
+ cp $b1
+ jr c, .asm_c445
+ xor a
+ jr .asm_c449
+.asm_c445
+ cp b
+ jr c, .asm_c449
+ ld a, b
+.asm_c449
+ ld [$d235], a
+ ld a, [$d238]
+ sla a
+ sla a
+ sla a
+ ld b, a
+ ld a, [$d236]
+ cp $b9
+ jr c, .asm_c460
+ xor a
+ jr .asm_c464
+.asm_c460
+ cp b
+ jr c, .asm_c464
+ ld a, b
+.asm_c464
+ ld [$d236], a
+ pop bc
+ ret
+
+Func_c469: ; c469 (3:4469)
+ ld a, [$d235]
+ add $4
+ and $f8
+ rrca
+ rrca
+ rrca
+ ld [$d233], a
+ ld a, [$d236]
+ add $4
+ and $f8
+ rrca
+ rrca
+ rrca
+ ld [$d234], a
+ ret
+
+Func_c484: ; c484 (3:4484)
+ ld a, [$d235]
+ ld [$d0b6], a
+ ld a, [$d236]
+ ld [$d0b7], a
+ ret
+
+Func_c491: ; c491 (3:4491)
+ ld a, [$d0b6]
+ ld [$ff92], a
+ ld a, [$d0b7]
+ ld [$ff93], a
+ ret
+
+Func_c49c: ; c49c (3:449c)
+ ld a, [wPlayerXCoord]
+ and $1f
+ ld [wPlayerXCoord], a
+ rlca
+ rlca
+ rlca
+ ld [$d332], a
+ ld a, [wPlayerYCoord]
+ and $1f
+ ld [wPlayerYCoord], a
+ rlca
+ rlca
+ rlca
+ ld [$d333], a
+ ret
+
+Func_c4b9: ; c4b9 (3:44b9)
+ xor a
+ ld [$d4ca], a
+ ld [$d4cb], a
+ ld a, $1d
+ farcall Func_80418
+ ld b, $0
+ ld a, [$cab4]
+ cp $2
+ jr nz, .asm_c4d1
+ ld b, $1e
+.asm_c4d1
+ ld a, b
+ ld [$d337], a
+ ld a, $0
+ farcall Func_1299f
+ ld a, [$d4cf]
+ ld [$d336], a
+ ld b, $2
+ ld a, [wCurMap]
+ cp OVERWORLD_MAP
+ jr z, .asm_c4ee
+ ld a, [$d0be]
+ ld b, a
+.asm_c4ee
+ ld a, b
+ ld [$d334], a
+ call Func_c5e9
+ ld a, [wCurMap]
+ cp OVERWORLD_MAP
+ call nz, Func_c6f7
+ xor a
+ ld [$d335], a
+ ld [$d338], a
+ ld a, [wCurMap]
+ cp OVERWORLD_MAP
+ jr nz, .asm_c50f
+ farcall Func_10fde
+.asm_c50f
+ ret
+
+Func_c510: ; c510 (3:4510)
+ ld a, [$d336]
+ ld [$d4cf], a
+ ld a, [$d335]
+ bit 4, a
+ ret nz
+ bit 0, a
+ call z, Func_c5ac
+ ld a, [$d335]
+ or a
+ jr z, .asm_c535
+ bit 0, a
+ call nz, Func_c66c
+ ld a, [$d335]
+ bit 1, a
+ call nz, Func_c6dc
+ ret
+.asm_c535
+ ld a, [$ff91]
+ and $8
+ call nz, Func_c74d
+ ret
+; 0xc53d
+
+INCBIN "baserom.gbc",$c53d,$c554 - $c53d
+
+Func_c554: ; c554 (3:4554)
+ ld a, [$d336]
+ ld [$d4cf], a
+ ld a, [wCurMap]
+ cp OVERWORLD_MAP
+ jr nz, .asm_c566
+ farcall Func_10e28
+ ret
+.asm_c566
+ push hl
+ push bc
+ push de
+ call Func_c58b
+ ld a, [$d235]
+ ld d, a
+ ld a, [$d236]
+ ld e, a
+ ld c, $2
+ call Func_3dbf
+ ld a, [$d332]
+ sub d
+ add $8
+ ld [hli], a
+ ld a, [$d333]
+ sub e
+ add $10
+ ld [hli], a
+ pop de
+ pop bc
+ pop hl
+ ret
+
+Func_c58b: ; c58b (3:458b)
+ push hl
+ ld a, [wPlayerXCoord]
+ ld b, a
+ ld a, [wPlayerYCoord]
+ ld c, a
+ call Func_3927
+ and $10
+ push af
+ ld c, $f
+ call Func_3dbf
+ pop af
+ ld a, [hl]
+ jr z, .asm_c5a7
+ or $80
+ jr .asm_c5a9
+.asm_c5a7
+ and $7f
+.asm_c5a9
+ ld [hl], a
+ pop hl
+ ret
+
+Func_c5ac: ; c5ac (3:45ac)
+ ld a, [$ff90]
+ and $f0
+ jr z, .asm_c5bf
+ call Func_c5cb
+ call Func_c5fe
+ ld a, [$d335]
+ and $1
+ jr nz, .asm_c5ca
+.asm_c5bf
+ ld a, [$ff91]
+ and $1
+ jr z, .asm_c5ca
+ call Func_c71e
+ jr .asm_c5ca
+.asm_c5ca
+ ret
+
+Func_c5cb: ; c5cb (3:45cb)
+ call Func_c5d5
+ ld [$d334], a
+ call Func_c5e9
+ ret
+
+Func_c5d5: ; c5d5 (3:45d5)
+ push hl
+ ld hl, Unknown_c5e5
+ or a
+ jr z, .asm_c5e2
+.asm_c5dc
+ rlca
+ jr c, .asm_c5e2
+ inc hl
+ jr .asm_c5dc
+.asm_c5e2
+ ld a, [hl]
+ pop hl
+ ret
+
+Unknown_c5e5: ; c5e5 (3:45e5)
+ db $02,$00,$03,$01
+
+Func_c5e9: ; c5e9 (3:45e9)
+ push bc
+ ld a, [$d336]
+ ld [$d4cf], a
+ ld a, [$d337]
+ ld b, a
+ ld a, [$d334]
+ add b
+ farcall Func_12ab5
+ pop bc
+ ret
+
+Func_c5fe: ; c5fe (3:45fe)
+ push bc
+ call Func_c653
+ call Func_c619
+ pop bc
+ ret
+; 0xc607
+
+INCBIN "baserom.gbc",$c607,$c619 - $c607
+
+Func_c619: ; c619 (3:4619)
+ push hl
+ push bc
+ ld a, b
+ cp $1f
+ jr nc, .asm_c650
+ ld a, c
+ cp $1f
+ jr nc, .asm_c650
+ call Func_3927
+ and $c0
+ jr nz, .asm_c650
+ ld a, b
+ ld [wPlayerXCoord], a
+ ld a, c
+ ld [wPlayerYCoord], a
+ ld a, [$d335]
+ or $1
+ ld [$d335], a
+ ld a, $10
+ ld [$d338], a
+ ld c, $f
+ call Func_3dbf
+ set 2, [hl]
+ ld c, $e
+ call Func_3dbf
+ ld a, $4
+ ld [hl], a
+.asm_c650
+ pop bc
+ pop hl
+ ret
+
+Func_c653: ; c653 (3:4653)
+ ld a, [$d334]
+ rlca
+ ld c, a
+ ld b, $0
+ push hl
+ ld hl, Unknown_3973
+ add hl, bc
+ ld a, [wPlayerXCoord]
+ add [hl]
+ ld b, a
+ inc hl
+ ld a, [wPlayerYCoord]
+ add [hl]
+ ld c, a
+ pop hl
+ ret
+
+Func_c66c: ; c66c (3:466c)
+ push hl
+ push bc
+ ld c, $1
+ ld a, [$ff90]
+ bit 1, a
+ jr z, .asm_c67e
+ ld a, [$d338]
+ cp $2
+ jr c, .asm_c67e
+ inc c
+.asm_c67e
+ ld a, [$d334]
+ call Func_c694
+ pop bc
+ pop hl
+ ret
+; 0xc687
+
+INCBIN "baserom.gbc",$c687,$c694 - $c687
+
+Func_c694: ; c694 (3:4694)
+ push hl
+ push bc
+ push bc
+ rlca
+ ld c, a
+ ld b, $0
+ ld hl, Unknown_396b
+ add hl, bc
+ pop bc
+.asm_c6a0
+ push hl
+ ld a, [hli]
+ or a
+ call nz, Func_c6cc
+ ld a, [hli]
+ or a
+ call nz, Func_c6d4
+ pop hl
+ ld a, [$d338]
+ dec a
+ ld [$d338], a
+ jr z, .asm_c6b8
+ dec c
+ jr nz, .asm_c6a0
+.asm_c6b8
+ ld a, [$d338]
+ or a
+ jr nz, .asm_c6c3
+ ld hl, $d335
+ set 1, [hl]
+.asm_c6c3
+ call Func_c41c
+ call Func_c469
+ pop bc
+ pop hl
+ ret
+
+Func_c6cc: ; c6cc (3:46cc)
+ push hl
+ ld hl, $d332
+ add [hl]
+ ld [hl], a
+ pop hl
+ ret
+
+Func_c6d4: ; c6d4 (3:46d4)
+ push hl
+ ld hl, $d333
+ add [hl]
+ ld [hl], a
+ pop hl
+ ret
+
+Func_c6dc: ; c6dc (3:46dc)
+ push hl
+ ld hl, $d335
+ res 0, [hl]
+ res 1, [hl]
+ call Func_c6f7
+ call Func_3997
+ call Func_c70d
+ ld a, [$d0bf]
+ cp $1
+ call z, Func_c9c0
+ pop hl
+ ret
+
+Func_c6f7: ; c6f7 (3:46f7)
+ ld a, [$d336]
+ ld [$d4cf], a
+ ld c, $f
+ call Func_3dbf
+ res 2, [hl]
+ ld c, $e
+ call Func_3dbf
+ ld a, $ff
+ ld [hl], a
+ ret
+
+Func_c70d: ; c70d (3:470d)
+ push hl
+ ld hl, $d0bb
+ ld a, [wCurMap]
+ cp [hl]
+ jr z, .asm_c71c
+ ld hl, $d0b4
+ set 4, [hl]
+.asm_c71c
+ pop hl
+ ret
+
+Func_c71e: ; c71e (3:471e)
+ ld a, $ff
+ ld [$d3b6], a
+ call Func_c653
+ call Func_3927
+ and $40
+ jr z, .asm_c73d
+ farcall Func_1c72e
+ jr c, .asm_c73d
+ ld a, [$d3aa]
+ ld [$d3b6], a
+ ld a, $2
+ jr .asm_c748
+.asm_c73d
+ call Func_3a5e
+ jr nc, .asm_c746
+ ld a, $3
+ jr .asm_c748
+.asm_c746
+ or a
+ ret
+.asm_c748
+ ld [$d0bf], a
+ scf
+ ret
+
+Func_c74d: ; c74d (3:474d)
+ push hl
+ push bc
+ push de
+ call MainMenu_c75a
+ call Func_c111
+ pop de
+ pop bc
+ pop hl
+ ret
+
+MainMenu_c75a: ; c75a (3:475a)
+ call Func_379b
+ ld a, MUSIC_PAUSEMENU
+ call PlaySong
+ call Func_c797
+.asm_c765
+ ld a, $1
+ call Func_c29b
+.asm_c76a
+ call Func_3c48
+ call Func_264b
+ jr nc, .asm_c76a
+ ld a, e
+ ld [$d0b8], a
+ ld a, [$ffb1]
+ cp e
+ jr nz, .asm_c793
+ cp $5
+ jr z, .asm_c793
+ call Func_c2a3
+ ld a, [$d0b8]
+ ld hl, PointerTable_c7a2
+ call JumpToFunctionInTable
+ ld hl, Func_c797
+ call Func_c32b
+ jr .asm_c765
+.asm_c793
+ call Func_37a0
+ ret
+
+Func_c797: ; c797 (3:4797)
+ ld a, [$d0b8]
+ ld hl, Unknown_cd98
+ farcall Func_111e9
+ ret
+
+PointerTable_c7a2: ; c7a2 (3:47a2)
+ dw Func_c7ae
+ dw Func_c7b3
+ dw Func_c7b8
+ dw Func_c7cc
+ dw Func_c7e0
+ dw Func_c7e5
+
+Func_c7ae: ; c7ae (3:47ae)
+ farcall Func_10059
+ ret
+
+Func_c7b3: ; c7b3 (3:47b3)
+ farcall Func_100a2
+ ret
+
+Func_c7b8: ; c7b8 (3:47b8)
+ xor a
+ ld [$ff92], a
+ ld [$ff93], a
+ call Set_OBJ_8x16
+ farcall Func_1288c
+ farcall Func_8db0
+ call Set_OBJ_8x8
+ ret
+
+Func_c7cc: ; c7cc (3:47cc)
+ xor a
+ ld [$ff92], a
+ ld [$ff93], a
+ call Set_OBJ_8x16
+ farcall Func_1288c
+ farcall Func_a288
+ call Set_OBJ_8x8
+ ret
+
+Func_c7e0: ; c7e0 (3:47e0)
+ farcall Func_10548
+ ret
+
+Func_c7e5: ; c7e5 (3:47e5)
+ farcall Func_103d2
+ ret
+
+PC_c7ea: ; c7ea (3:47ea)
+ ld a, MUSIC_PCMAINMENU
+ call PlaySong
+ call Func_c241
+ call $4915
+ call Func_3c48
+ ld hl, $0352
+ call $2c73
+ call $484e
+.asm_c801
+ ld a, $1
+ call Func_c29b
+.asm_c806
+ call Func_3c48
+ call Func_264b
+ jr nc, .asm_c806
+ ld a, e
+ ld [$d0b9], a
+ ld a, [$ffb1]
+ cp e
+ jr nz, .asm_c82f
+ cp $4
+ jr z, .asm_c82f
+ call Func_c2a3
+ ld a, [$d0b9]
+ ld hl, $4846
+ call JumpToFunctionInTable
+ ld hl, $484e
+ call Func_c32b
+ jr .asm_c801
+.asm_c82f
+ call Func_c135
+ call Func_3c48
+ ld hl, $0353
+ call $4891
+ call Func_c111
+ xor a
+ ld [$d112], a
+ call Func_39fc
+ ret
+; 0xc846
+
+INCBIN "baserom.gbc",$c846,$c935 - $c846
+
+Func_c935: ; c935 (3:4935)
+ push hl
+ ld hl, $d0c6
+ ld [hl], c
+ inc hl
+ ld [hl], b
+ ld a, $3
+ ld [$d0bf], a
+ pop hl
+ ret
+
+Func_c943: ; c943 (3:4943)
+ push hl
+ push bc
+ push de
+ ld l, $0
+ call Func_3abd
+ jr nc, .asm_c98f
+.asm_c94d
+ ld a, l
+ ld [$d4c4], a
+ ld a, h
+ ld [$d4c5], a
+ ld a, $4
+ ld [$d4c6], a
+ ld de, $d3ab
+ ld bc, $0006
+ call Func_3bf5
+ ld a, [$d3ab]
+ or a
+ jr z, .asm_c98f
+ push hl
+ ld a, [$d3af]
+ ld l, a
+ ld a, [$d3b0]
+ ld h, a
+ or l
+ jr z, .asm_c97a
+ call Func_3c45
+ jr nc, .asm_c988
+.asm_c97a
+ ld a, [$d3ab]
+ farcall Func_11857
+ call Func_c998
+ farcall Func_1c485
+.asm_c988
+ pop hl
+ ld bc, $0006
+ add hl, bc
+ jr .asm_c94d
+.asm_c98f
+ ld l, $2
+ call Func_c9c2
+ pop de
+ pop bc
+ pop hl
+ ret
+
+Func_c998: ; c998 (3:4998)
+ ld a, [$d3ab]
+ cp $22
+ ret nz
+ ld a, [$d3d0]
+ or a
+ ret z
+ ld b, $4
+ ld a, [$cab4]
+ cp $2
+ jr nz, .asm_c9ae
+ ld b, $e
+.asm_c9ae
+ ld a, b
+ ld [$d3b1], a
+ ld a, $0
+ ld [$d3b2], a
+ ret
+
+Func_c9b8: ; c9b8 (3:49b8)
+ ld l, $8
+ jr Func_c9c2
+
+Func_c9bc: ; c9bc (3:49bc)
+ ld l, $a
+ jr Func_c9c2
+
+Func_c9c0: ; c9c0 (3:49c0)
+ ld l, $c
+
+Func_c9c2: ; c9c2 (3:49c2)
+ call Func_3abd
+ ret nc
+ jp [hl]
+
+Func_c9c7: ; c9c7 (3:49c7)
+ ld l, $e
+ jr Func_c9c2
+
+Func_c9cb: ; c9cb (3:49cb)
+ push hl
+ push bc
+ ld hl, $d3d2
+ ld bc, $0040
+.asm_c9d3
+ xor a
+ ld [hli], a
+ dec bc
+ ld a, b
+ or c
+ jr nz, .asm_c9d3
+ pop bc
+ pop hl
+ ret
+
+Func_c9dd: ; c9dd (3:49dd)
+ xor a
+ ld [$d411], a
+ call Func_c9e8
+ call Func_ca0e
+ ret
+
+Func_c9e8: ; c9e8 (3:49e8)
+ ld c, $0
+ call Func_ca69
+ db $13
+ cp $2
+ jr c, .asm_ca04
+.asm_c9f2
+ call Func_089b
+ and $3
+ ld c, a
+ ld b, $0
+ ld hl, Unknown_ca0a
+ add hl, bc
+ ld a, [$d0bb]
+ cp [hl]
+ jr z, .asm_c9f2
+.asm_ca04
+ ld a, c
+ call Func_ca8f
+ db $34
+ ret
+
+Unknown_ca0a: ; ca0a (3:4a04)
+INCBIN "baserom.gbc",$ca0a,$ca0e - $ca0a
+
+Func_ca0e: ; ca0e (3:4a0e)
+ ld a, [$d32e]
+ cp $b
+ jr z, .asm_ca68
+ call Func_ca69
+ db $22
+ or a
+ jr nz, .asm_ca4a
+ call Func_ca69
+ db $40
+ cp $7
+ jr z, .asm_ca68
+ or a
+ jr z, .asm_ca33
+ cp $2
+ jr z, .asm_ca62
+ ld c, $1
+ call Func_ca8f
+ db $40
+ jr .asm_ca62
+.asm_ca33
+ call Func_ca69
+ db $3f
+ cp $7
+ jr z, .asm_ca68
+ or a
+ jr z, .asm_ca68
+ cp $2
+ jr z, .asm_ca68
+ ld c, $1
+ call Func_ca8f
+ db $3f
+ jr .asm_ca68
+.asm_ca4a
+ call Func_089b
+ ld c, $1
+ and $3
+ or a
+ jr z, .asm_ca56
+ ld c, $0
+.asm_ca56
+ call Func_ca8f
+ db $41
+ jr .asm_ca5c
+.asm_ca5c
+ ld c, $7
+ call Func_ca8f
+ db $40
+.asm_ca62
+ ld c, $7
+ call Func_ca8f
+ db $3f
+.asm_ca68
+ ret
+
+Func_ca69: ; ca69 (3:4a69)
+ call Func_cab3
+Func_ca6c: ; ca6c (3:4a6c)
+ push hl
+ push bc
+ call Func_cb1d
+ ld c, [hl]
+ ld a, [$d3d1]
+.asm_ca75
+ bit 0, a
+ jr nz, .asm_ca7f
+ srl a
+ srl c
+ jr .asm_ca75
+.asm_ca7f
+ and c
+ pop bc
+ pop hl
+ or a
+ ret
+; 0xca84
+
+INCBIN "baserom.gbc",$ca84,$ca8f - $ca84
+
+Func_ca8f: ; ca8f (3:4a8f)
+ call Func_cab3
+ push hl
+ push bc
+ call Func_cb1d
+ ld a, [$d3d1]
+.asm_ca9a
+ bit 0, a
+ jr nz, .asm_caa4
+ srl a
+ sla c
+ jr .asm_ca9a
+.asm_caa4
+ ld a, [$d3d1]
+ and c
+ ld c, a
+ ld a, [$d3d1]
+ cpl
+ and [hl]
+ or c
+ ld [hl], a
+ pop bc
+ pop hl
+ ret
+
+Func_cab3: ; cab3 (3:4ab3)
+ push hl
+ ld hl, [sp+$4]
+ push bc
+ ld c, [hl]
+ inc hl
+ ld b, [hl]
+ ld a, [bc]
+ inc bc
+ ld [hl], b
+ dec hl
+ ld [hl], c
+ pop bc
+ pop hl
+ ret
+; 0xcac2
+
+INCBIN "baserom.gbc",$cac2,$cb1d - $cac2
+
+Func_cb1d: ; cb1d (3:4b1d)
+ push bc
+ ld c, a
+ ld b, $0
+ sla c
+ rl b
+ ld hl, Unknown_cb37
+ add hl, bc
+ ld a, [hli]
+ ld c, a
+ ld a, [hl]
+ ld [$d3d1], a
+ ld b, $0
+ ld hl, $d3d2
+ add hl, bc
+ pop bc
+ ret
+
+Unknown_cb37: ; cb37 (3:4b37)
+INCBIN "baserom.gbc",$cb37,$cc42 - $cb37
+
+RST20: ; cc42 (3:4c42)
+ pop hl
+ ld a, l
+ ld [$d413], a
+ ld a, h
+ ld [$d414], a
+ xor a
+ ld [$d412], a
+.asm_cc4f
+ call Func_3aed
+ ld a, [$d412]
+ or a
+ jr z, .asm_cc4f
+ ld hl, $d413
+ ld a, [hli]
+ ld c, a
+ ld b, [hl]
+ push bc
+ ret
+; 0xcc60
+
+INCBIN "baserom.gbc",$cc60,$cd98 - $cc60
+
+Unknown_cd98: ; cd98 (3:4d98)
+INCBIN "baserom.gbc",$cd98,$d336 - $cd98
+
+DeckMachine_d336: ; d336 (3:5336)
+ push bc
+ call Func_c2a3
+ call Func_379b
+ ld a, MUSIC_DECKMACHINE
+ call PlaySong
+ call Func_04a2
+ xor a
+ ld [$ff92], a
+ ld [$ff93], a
+ farcall Func_1288c
+ call EnableLCD
+ pop bc
+ ld a, c
+ or a
+ jr z, .asm_d360
+ dec a
+ ld [$d0a9], a
+ farcallx $2, $7a04
+ jr .asm_d364
+.asm_d360
+ farcallx $2, $719d
+.asm_d364
+ call Func_37a0
+ call $42d4
+ jp $4c64
+; 0xd36d
+
+INCBIN "baserom.gbc",$d36d,$fc2b - $d36d
+
+Func_fc2b: ; fc2b (3:7c2b)
+ ld a, [$d0c3]
+ cp $2
+ jr c, .asm_fc34
+ ld a, $2
+.asm_fc34
+ rlca
+ ld c, a
+ ld b, $0
+ ld hl, PointerTable_fc4c
+ add hl, bc
+ ld c, [hl]
+ inc hl
+ ld b, [hl]
+ ld a, $b0
+ ld [$d0c8], a
+ ld a, $3
+ ld [$d0c9], a
+ jp Func_c935
+
+PointerTable_fc4c: ; fc4c (3:7c4c)
+ dw Unknown_fc64
+ dw Unknown_fc68
+ dw Unknown_fc60
+
+INCBIN "baserom.gbc",$fc52,$fc60 - $fc52
+
+Unknown_fc60: ; fc60 (3:7c60)
+INCBIN "baserom.gbc",$fc60,$fc64 - $fc60
+
+Unknown_fc64: ; fc64 (3:7c64)
+INCBIN "baserom.gbc",$fc64,$fc68 - $fc64
+
+Unknown_fc68: ; fc68 (3:7c68)
+INCBIN "baserom.gbc",$fc68,$fcad - $fc68
+
+Func_fcad: ; fcad (3:7cad)
+INCBIN "baserom.gbc",$fcad,$10000 - $fcad
diff --git a/src/engine/bank4.asm b/src/engine/bank4.asm
new file mode 100755
index 0000000..f144aa6
--- /dev/null
+++ b/src/engine/bank4.asm
@@ -0,0 +1,1147 @@
+INCBIN "baserom.gbc",$10000,$10059 - $10000
+
+Func_10059: ; 10059 (4:4059)
+INCBIN "baserom.gbc",$10059,$100a2 - $10059
+
+Func_100a2: ; 100a2 (4:40a2)
+INCBIN "baserom.gbc",$100a2,$1029e - $100a2
+
+Medal_1029e: ; 1029e (4:429e)
+ sub $8
+ ld c, a
+ ld [$d115], a
+ ld a, [$d291]
+ push af
+ push bc
+ call Func_379b
+ ld a, MUSIC_STOP
+ call PlaySong
+ farcall Func_70000
+ call DisableLCD
+ call $4000
+ ld a, $fa
+ ld [$d114], a
+ call $410c
+ pop bc
+ ld a, c
+ add a
+ ld c, a
+ ld b, $0
+ ld hl, Unknown_1030b
+ add hl, bc
+ ld a, [hli]
+ ld [$ce3f], a
+ ld a, [hl]
+ ld [$ce40], a
+ call $4031
+ ld a, MUSIC_MEDAL
+ call PlaySong
+ ld a, $ff
+ ld [$d116], a
+.asm_102e2
+ call Func_3c48
+ ld a, [$d116]
+ inc a
+ ld [$d116], a
+ and $f
+ jr nz, .asm_102e2
+ call $4197
+ ld a, [$d116]
+ cp $e0
+ jr nz, .asm_102e2
+ ld hl, $038b
+ call $2c73
+ call $3c96
+ call Func_37a0
+ pop af
+ ld [$d291], a
+ ret
+
+Unknown_1030b: ; 1030b (4:430b)
+INCBIN "baserom.gbc",$1030b,$1031b - $1030b
+
+BoosterPack_1031b: ; 1031b (4:431b)
+ ld c, a
+ ld a, [$d291]
+ push af
+ push bc
+ call DisableLCD
+ call $4000
+ xor a
+ ld [$ccf3], a
+ pop bc
+ push bc
+ ld b, $0
+ ld hl, $43a5
+ add hl, bc
+ ld a, [hl]
+ ld c, a
+ add a
+ add a
+ ld c, a
+ ld hl, $43c2
+ add hl, bc
+ ld a, [hli]
+ push hl
+ ld bc, $0600
+ call $70ca
+ pop hl
+ ld a, [hli]
+ ld [$ce43], a
+ xor a
+ ld [$ce44], a
+ ld a, [hli]
+ ld [$ce3f], a
+ ld a, [hl]
+ ld [$ce40], a
+ call $4031
+ call Func_379b
+ ld a, MUSIC_BOOSTERPACK
+ call PlaySong
+ pop bc
+ ld a, c
+ farcallx $7, $61c4
+ ld hl, $0387
+ ld a, [$d117]
+ cp $1
+ jr nz, .asm_10373
+ ld hl, $0388
+.asm_10373
+ call $2c73
+ call $3c96
+ call Func_37a0
+ ld hl, $0389
+ call $2c73
+ call DisableLCD
+ call Func_1288c
+ call Func_099c
+ ld a, $1
+ ld [$cac0], a
+ ld a, $4
+ ld [$ccf3], a
+ farcallx $1, $7599
+ farcall Func_c1a4
+ call Func_3c48
+ pop af
+ ld [$d291], a
+ ret
+; 0x103a5
+
+INCBIN "baserom.gbc",$103a5,$103d2 - $103a5
+
+Func_103d2: ; 103d2 (4:43d2)
+INCBIN "baserom.gbc",$103d2,$103d3 - $103d2
+
+Duel_Init: ; 103d3 (4:43d3)
+ ld a, [$d291]
+ push af
+ call DisableLCD
+ call $4000
+ ld a, $4
+ ld [$ccf3], a
+ ld de, $000c
+ ld bc, $1406
+ call Func_1e7c ; LoadTextBoxBorder
+ ld a, [$cc19]
+ add a
+ add a
+ ld c, a
+ ld b, $0
+ ld hl, $445b
+ add hl, bc
+ ld a, [hli]
+ ld [$ce3f], a
+ ld a, [hli]
+ ld [$ce40], a
+ push hl
+ ld a, [$cc16]
+ ld [$ce41], a
+ ld a, [$cc17]
+ ld [$ce42], a
+ ld hl, $4451
+ call $51b3 ; LoadDuelistName
+ pop hl
+ ld a, [hli]
+ ld [$ce3f], a
+ ld c, a
+ ld a, [hli]
+ ld [$ce40], a
+ or c
+ jr z, .asm_10425
+ ld hl, $4456
+ call $51b3 ; LoadDeckName
+
+.asm_10425
+ ld bc, $0703
+ ld a, [$cc15]
+ call Func_3e2a ; LoadDuelistPortrait
+ ld a, [wMatchStartTheme]
+ call PlaySong
+ call $4031
+ call Func_3c48
+ ld bc, $2f1d
+ ld de, $1211
+ call Func_2a1a
+ call $2a00 ; wait for the user to press a or b
+ call $3c96
+ call Func_10ab4 ; fade out
+ pop af
+ ld [$d291], a
+ ret
+; 0x10451
+
+INCBIN "baserom.gbc",$10451,$10548 - $10451
+
+Func_10548: ; 10548 (4:4548)
+INCBIN "baserom.gbc",$10548,$10756 - $10548
+
+Func_10756: ; 10756 (4:4756)
+INCBIN "baserom.gbc",$10756,$10a9b - $10756
+
+Func_10a9b: ; 10a9b (4:4a9b)
+INCBIN "baserom.gbc",$10a9b,$10ab4 - $10a9b
+
+Func_10ab4: ; 10ab4 (4:4ab4)
+INCBIN "baserom.gbc",$10ab4,$10af9 - $10ab4
+
+Func_10af9: ; 10af9 (4:4af9)
+INCBIN "baserom.gbc",$10af9,$10e28 - $10af9
+
+Func_10e28: ; 10e28 (4:4e28)
+INCBIN "baserom.gbc",$10e28,$10e55 - $10e28
+
+Func_10e55: ; 10e55 (4:4e55)
+ ld a, [$d336]
+ ld [$d4cf], a
+ ld a, [$d33e]
+ or a
+ jr nz, .asm_10e65
+ call Func_10e71
+ ret
+.asm_10e65
+ cp $2
+ jr z, .asm_10e6d
+ call Func_11060
+ ret
+.asm_10e6d
+ call LoadOverworldMapSelection
+ ret
+
+Func_10e71: ; 10e71 (4:4e71)
+ ld a, [$ff91]
+ and $f0
+ jr z, .asm_10e83
+ farcall Func_c5d5
+ ld [$d334], a
+ call Func_10e97
+ jr .asm_10e96
+.asm_10e83
+ ld a, [$ff91]
+ and $1
+ jr z, .asm_10e96
+ ld a, $2
+ call Func_3796
+ call Func_11016
+ call Func_11024
+ jr .asm_10e96
+.asm_10e96
+ ret
+
+Func_10e97: ; 10e97 (4:4e97)
+ push hl
+ pop hl
+ ld a, [$d32e]
+ rlca
+ rlca
+ ld c, a
+ ld a, [$d334]
+ add c
+ ld c, a
+ ld b, $0
+ ld hl, Unknown_10ebc
+ add hl, bc
+ ld a, [hl]
+ or a
+ jr z, .asm_10eb9
+ ld [$d32e], a
+ call Func_10f2e
+ ld a, $1
+ call Func_3796
+.asm_10eb9
+ pop bc
+ pop hl
+ ret
+
+Unknown_10ebc: ; 10ebc (4:4ebc)
+INCBIN "baserom.gbc",$10ebc,$10efd - $10ebc
+
+Func_10efd: ; 10efd (4:4efd)
+ push hl
+ push de
+ rlca
+ ld e, a
+ ld d, $0
+ ld hl, Unknown_10f14
+ add hl, de
+ pop de
+ ld a, [hli]
+ add $8
+ add d
+ ld d, a
+ ld a, [hl]
+ add $10
+ add e
+ ld e, a
+ pop hl
+ ret
+
+Unknown_10f14: ; 10f14 (4:4f14)
+INCBIN "baserom.gbc",$10f14,$10f2e - $10f14
+
+Func_10f2e: ; 10f2e (4:4f2e)
+ push hl
+ push de
+ ld de, $0101
+ call Func_22ae
+ call Func_10f4a
+ rlca
+ ld e, a
+ ld d, $0
+ ld hl, Unknown_397b
+ add hl, de
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ call Func_2c29
+ pop de
+ pop hl
+ ret
+
+Func_10f4a: ; 10f4a (4:4f4a)
+ push bc
+ ld a, [$d32e]
+ cp $2
+ jr nz, .asm_10f5f
+ ld c, a
+ ld a, $1e
+ farcall Func_ca6c
+ or a
+ ld a, c
+ jr nz, .asm_10f5f
+ ld a, $d
+.asm_10f5f
+ pop bc
+ ret
+
+LoadOverworldMapSelection: ; 10f61 (4:4f61)
+ push hl
+ push bc
+ ld a, [$d32e]
+ rlca
+ rlca
+ ld c, a
+ ld b, $0
+ ld hl, OverworldMapIndexes
+ add hl, bc
+ ld a, [hli]
+ ld [$d0bb], a
+ ld a, [hli]
+ ld [$d0bc], a
+ ld a, [hli]
+ ld [$d0bd], a
+ ld a, $0
+ ld [$d0be], a
+ ld hl, $d0b4
+ set 4, [hl]
+ pop bc
+ pop hl
+ ret
+
+INCLUDE "data/overworld_indexes.asm"
+
+Func_10fbc: ; 10fbc (4:4fbc)
+ ld a, $25
+ farcall Func_1299f
+ ld c, $2
+ call Func_3dbf
+ ld a, $80
+ ld [hli], a
+ ld a, $10
+ ld [hl], a
+ ld b, $34
+ ld a, [$cab4]
+ cp $2
+ jr nz, .asm_10fd8
+ ld b, $37
+.asm_10fd8
+ ld a, b
+ farcall Func_12ab5
+ ret
+
+Func_10fde: ; 10fde (4:4fde)
+ ld a, [$d32e]
+ ld [$d33d], a
+ xor a
+ ld [$d33e], a
+ ld a, $25
+ call Func_1299f
+ ld a, [$d4cf]
+ ld [$d33b], a
+ ld b, $35
+ ld a, [$cab4]
+ cp $2
+ jr nz, .asm_10ffe
+ ld b, $38
+.asm_10ffe
+ ld a, b
+ ld [$d33c], a
+ call Func_12ab5
+ ld a, $3e
+ farcall Func_ca6c
+ or a
+ jr nz, .asm_11015
+ ld c, $f
+ call Func_3dbf
+ set 7, [hl]
+.asm_11015
+ ret
+
+Func_11016: ; 11016 (4:5016)
+ ld a, [$d33b]
+ ld [$d4cf], a
+ ld a, [$d33c]
+ inc a
+ call Func_12ab5
+ ret
+
+Func_11024: ; 11024 (4:5024)
+ ld a, $57
+ call Func_3796
+ ld a, [$d336]
+ ld [$d4cf], a
+ ld c, $f
+ call Func_3dbf
+ set 2, [hl]
+ ld hl, Unknown_1229f
+ ld a, [$d33d]
+ dec a
+ add a
+ ld c, a
+ ld b, $0
+ add hl, bc
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ ld a, [$d32e]
+ dec a
+ add a
+ ld c, a
+ ld b, $0
+ add hl, bc
+ ld a, [hli]
+ ld [$d33f], a
+ ld a, [hl]
+ ld [$d340], a
+ ld a, $1
+ ld [$d33e], a
+ xor a
+ ld [$d341], a
+ ret
+
+Func_11060: ; 11060 (4:5060)
+ ld a, [$d336]
+ ld [$d4cf], a
+ ld a, [$d341]
+ or a
+ jp nz, Func_11184
+ ld a, [$d33f]
+ ld l, a
+ ld a, [$d340]
+ ld h, a
+ ld a, [hli]
+ ld b, a
+ ld a, [hli]
+ ld c, a
+ and b
+ cp $ff
+ jr z, .asm_110a0
+ ld a, c
+ or b
+ jr nz, .asm_11094
+ ld a, [$d33d]
+ ld e, a
+ ld a, [$d32e]
+ cp e
+ jr z, .asm_110a0
+ ld de, $0000
+ call Func_10efd
+ ld b, d
+ ld c, e
+.asm_11094
+ ld a, l
+ ld [$d33f], a
+ ld a, h
+ ld [$d340], a
+ call Func_110a6
+ ret
+.asm_110a0
+ ld a, $2
+ ld [$d33e], a
+ ret
+
+Func_110a6: ; 110a6 (4:50a6)
+ push hl
+ push bc
+ ld c, $2
+ call Func_3dbf
+ pop bc
+ ld a, b
+ sub [hl]
+ ld [$d343], a
+ ld a, $0
+ sbc $0
+ ld [$d344], a
+ inc hl
+ ld a, c
+ sub [hl]
+ ld [$d345], a
+ ld a, $0
+ sbc $0
+ ld [$d346], a
+ ld a, [$d343]
+ ld b, a
+ ld a, [$d344]
+ bit 7, a
+ jr z, .asm_110d8
+ ld a, [$d343]
+ cpl
+ inc a
+ ld b, a
+.asm_110d8
+ ld a, [$d345]
+ ld c, a
+ ld a, [$d346]
+ bit 7, a
+ jr z, .asm_110e9
+ ld a, [$d345]
+ cpl
+ inc a
+ ld c, a
+.asm_110e9
+ ld a, b
+ cp c
+ jr c, .asm_110f2
+ call Func_11102
+ jr .asm_110f5
+.asm_110f2
+ call Func_1113e
+.asm_110f5
+ xor a
+ ld [$d347], a
+ ld [$d348], a
+ farcall Func_c5e9
+ pop hl
+ ret
+
+Func_11102: ; 11102 (4:5102)
+ ld a, b
+ ld [$d341], a
+ ld e, a
+ ld d, $0
+ ld hl, $d343
+ xor a
+ ld [hli], a
+ bit 7, [hl]
+ jr z, .asm_11115
+ dec a
+ jr .asm_11116
+.asm_11115
+ inc a
+.asm_11116
+ ld [hl], a
+ ld b, c
+ ld c, $0
+ call Func_3c5a
+ ld a, [$d346]
+ bit 7, a
+ jr z, .asm_11127
+ call Func_11179
+.asm_11127
+ ld a, c
+ ld [$d345], a
+ ld a, b
+ ld [$d346], a
+ ld hl, $d344
+ ld a, $1
+ bit 7, [hl]
+ jr z, .asm_1113a
+ ld a, $3
+.asm_1113a
+ ld [$d334], a
+ ret
+
+Func_1113e: ; 1113e (4:513e)
+ ld a, c
+ ld [$d341], a
+ ld e, a
+ ld d, $0
+ ld hl, $d345
+ xor a
+ ld [hli], a
+ bit 7, [hl]
+ jr z, .asm_11151
+ dec a
+ jr .asm_11152
+.asm_11151
+ inc a
+.asm_11152
+ ld [hl], a
+ ld c, $0
+ call Func_3c5a
+ ld a, [$d344]
+ bit 7, a
+ jr z, .asm_11162
+ call Func_11179
+.asm_11162
+ ld a, c
+ ld [$d343], a
+ ld a, b
+ ld [$d344], a
+ ld hl, $d346
+ ld a, $2
+ bit 7, [hl]
+ jr z, .asm_11175
+ ld a, $0
+.asm_11175
+ ld [$d334], a
+ ret
+
+Func_11179: ; 11179 (4:5179)
+ ld a, c
+ cpl
+ add $1
+ ld c, a
+ ld a, b
+ cpl
+ adc $0
+ ld b, a
+ ret
+
+Func_11184: ; 11184 (4:5184)
+ ld a, [$d347]
+ ld d, a
+ ld a, [$d348]
+ ld e, a
+ ld c, $2
+ call Func_3dbf
+ ld a, [$d343]
+ add d
+ ld d, a
+ ld a, [$d344]
+ adc [hl]
+ ld [hl], a
+ inc hl
+ ld a, [$d345]
+ add e
+ ld e, a
+ ld a, [$d346]
+ adc [hl]
+ ld [hl], a
+ ld a, d
+ ld [$d347], a
+ ld a, e
+ ld [$d348], a
+ ld hl, $d341
+ dec [hl]
+ ret
+; 0x111b3
+
+INCBIN "baserom.gbc",$111b3,$111e9 - $111b3
+
+Func_111e9: ; 111e9 (4:51e9)
+INCBIN "baserom.gbc",$111e9,$1124d - $111e9
+
+Func_1124d: ; 1124d (4:524d)
+INCBIN "baserom.gbc",$1124d,$11320 - $1124d
+
+Func_11320: ; 11320 (4:5320)
+INCBIN "baserom.gbc",$11320,$11416 - $11320
+
+Func_11416: ; 11416 (4:5416)
+INCBIN "baserom.gbc",$11416,$11430 - $11416
+
+Func_11430: ; 11430 (4:5430)
+INCBIN "baserom.gbc",$11430,$1162a - $11430
+
+INCLUDE "data/map_scripts.asm"
+
+INCBIN "baserom.gbc",$1184a,$11857 - $1184a
+
+Func_11857: ; 11857 (4:5857)
+INCBIN "baserom.gbc",$11857,$1217b - $11857
+
+Unknown_1217b: ; 1217b (4:617b)
+INCBIN "baserom.gbc",$1217b,$1229f - $1217b
+
+Unknown_1229f: ; 1229f (4:629f)
+INCBIN "baserom.gbc",$1229f,$126d1 - $1229f
+
+Func_126d1: ; 126d1 (4:66d1)
+ call Func_099c
+ ld hl, $cac0
+ inc [hl]
+ farcall Func_70018
+ ld a, $ff
+ ld [$d627], a
+.asm_126e1
+ ld a, $c2
+ ld [$ff97], a
+ farcall Func_c1f8
+ farcall Func_1d078
+ ld a, [$d628]
+ ld hl, PointerTable_126fc
+ call JumpToFunctionInTable
+ jr c, .asm_126e1
+ jr Func_126d1
+
+ scf
+ ret
+
+PointerTable_126fc
+ dw CardPop_12768
+ dw Func_12741
+ dw Func_12704
+ dw Func_1277e
+
+Func_12704: ; 12704 (4:6704)
+ farcall Func_c1b1
+ call Func_128a9
+ farcall Func_1996e
+ call EnableExtRAM
+ ld a, [$a007]
+ ld [$d421], a
+ ld a, [$a006]
+ ld [$ce47], a
+ call DisableExtRAM
+ ld a, MUSIC_STOP
+ call PlaySong
+ farcall Func_70000
+ ld a, $9
+ ld [$d111], a
+ call Func_39fc
+ farcall Func_1d306
+ ld a, $0
+ ld [$d0b5], a
+ farcallx $03, Func_383d
+ or a
+ ret
+
+Func_12741: ; 12741 (4:6741)
+ ld a, MUSIC_STOP
+ call PlaySong
+ call Func_11320
+ jr nc, Func_12704
+ farcall Func_c1ed
+ farcall Func_70000
+ call EnableExtRAM
+ xor a
+ ld [$ba44], a
+ call DisableExtRAM
+ ld a, $0
+ ld [$d0b5], a
+ farcallx $03, Func_383d
+ or a
+ ret
+
+CardPop_12768: ; 12768 (4:6768)
+ ld a, MUSIC_CARDPOP
+ call PlaySong
+ bank1call Func_7571
+ farcall Func_c1a4
+ call Func_3c48
+ ld a, MUSIC_STOP
+ call PlaySong
+ scf
+ ret
+
+Func_1277e: ; 1277e (4:677e)
+ ld a, MUSIC_STOP
+ call PlaySong
+ farcall Func_c9cb
+ farcallx $04, Func_3a40
+ farcall Func_70000
+ ld a, $5
+ ld [$d0b5], a
+ farcallx $03, Func_383d
+ or a
+ ret
+; 0x1279a
+
+INCBIN "baserom.gbc",$1279a,$12871 - $1279a
+
+Func_12871: ; 12871 (4:6871)
+INCBIN "baserom.gbc",$12871,$1288c - $12871
+
+Func_1288c: ; 1288c (4:688c)
+INCBIN "baserom.gbc",$1288c,$128a9 - $1288c
+
+Func_128a9: ; 128a9 (4:68a9)
+INCBIN "baserom.gbc",$128a9,$1296e - $128a9
+
+Func_1296e: ; 1296e (4:696e)
+INCBIN "baserom.gbc",$1296e,$1299f - $1296e
+
+Func_1299f: ; 1299f (4:699f)
+ push af
+ ld a, [$d5d7]
+ or a
+ jr z, .asm_129a8
+ pop af
+ ret
+.asm_129a8
+ pop af
+ push bc
+ push hl
+ call Func_12c05
+ ld [$d5d3], a
+ xor a
+ ld [$d4cf], a
+ call Func_3db7
+ ld bc, $0010
+.asm_129bb
+ ld a, [hl]
+ or a
+ jr z, .asm_129cf
+ add hl, bc
+ ld a, [$d4cf]
+ inc a
+ ld [$d4cf], a
+ cp $10
+ jr nz, .asm_129bb
+ rst $38
+ scf
+ jr .asm_129d6
+.asm_129cf
+ ld a, $1
+ ld [hl], a
+ call Func_129d9
+ or a
+.asm_129d6
+ pop hl
+ pop bc
+ ret
+
+Func_129d9: ; 129d9 (4:69d9)
+ push hl
+ push bc
+ push hl
+ inc hl
+ ld c, $f
+ xor a
+.asm_129e0
+ ld [hli], a
+ dec c
+ jr nz, .asm_129e0
+ pop hl
+ ld bc, $0004
+ add hl, bc
+ ld a, [$d5d3]
+ ld [hli], a
+ ld a, $ff
+ ld [hl], a
+ ld bc, $0009
+ add hl, bc
+ ld a, $ff
+ ld [hl], a
+ pop bc
+ pop hl
+ ret
+; 0x129fa
+
+INCBIN "baserom.gbc",$129fa,$12a21 - $129fa
+
+Func_12a21: ; 12a21 (4:6a21)
+INCBIN "baserom.gbc",$12a21,$12ab5 - $12a21
+
+Func_12ab5: ; 12ab5 (4:6ab5)
+ push hl
+ push af
+ ld c, $5
+ call Func_3dbf
+ pop af
+ cp [hl]
+ pop hl
+ ret z
+ push hl
+ call Func_12ae2
+ call Func_12b13
+ pop hl
+ ret
+; 0x12ac9
+
+INCBIN "baserom.gbc",$12ac9,$12ae2 - $12ac9
+
+Func_12ae2: ; 12ae2 (4:6ae2)
+ push bc
+ push af
+ call Func_3db7
+ pop af
+ push hl
+ ld bc, $0005
+ add hl, bc
+ ld [hli], a
+ push hl
+ ld l, $6
+ farcall Func_8020f
+ farcall Func_80229
+ pop hl
+ ld a, [$d4c6]
+ ld [hli], a
+ ld a, [$d4c4]
+ ld [hli], a
+ ld c, a
+ ld a, [$d4c5]
+ ld [hli], a
+ ld b, a
+ ld a, $3
+ add c
+ ld [hli], a
+ ld a, $0
+ adc b
+ ld [hli], a
+ pop hl
+ pop bc
+ ret
+
+Func_12b13: ; 12b13 (4:6b13)
+ push bc
+ push de
+ push hl
+.asm_12b16
+ push hl
+ ld bc, $0006
+ add hl, bc
+ ld a, [hli]
+ ld [$d4c6], a
+ inc hl
+ inc hl
+ ld a, [hl]
+ ld [$d4c4], a
+ add $4
+ ld [hli], a
+ ld a, [hl]
+ ld [$d4c5], a
+ adc $0
+ ld [hl], a
+ ld de, $d23e
+ ld bc, $0004
+ call Func_3bf5
+ pop hl
+ ld de, $d23e
+ ld a, [de]
+ call Func_12b6a
+ inc de
+ ld a, [de]
+ call Func_12b89
+ jr c, .asm_12b16
+ inc de
+ ld bc, $0002
+ add hl, bc
+ push hl
+ ld bc, $000d
+ add hl, bc
+ ld b, [hl]
+ pop hl
+ ld a, [de]
+ bit 0, b
+ jr z, .asm_12b5a
+ cpl
+ inc a
+.asm_12b5a
+ add [hl]
+ ld [hli], a
+ inc de
+ ld a, [de]
+ bit 1, b
+ jr z, .asm_12b64
+ cpl
+ inc a
+.asm_12b64
+ add [hl]
+ ld [hl], a
+ pop hl
+ pop de
+ pop bc
+ ret
+
+Func_12b6a: ; 12b6a (4:6b6a)
+ ld [$d4ca], a
+ push hl
+ push bc
+ push de
+ push hl
+ ld bc, $0006
+ add hl, bc
+ ld a, [hli]
+ ld [$d4c6], a
+ ld a, [hli]
+ ld [$d4c4], a
+ ld a, [hli]
+ ld [$d4c5], a
+ pop hl
+ call Func_3d72
+ pop de
+ pop bc
+ pop hl
+ ret
+
+Func_12b89: ; 12b89 (4:6b89)
+ push hl
+ push bc
+ ld bc, $000e
+ add hl, bc
+ ld [hl], a
+ or a
+ jr nz, .asm_12ba4
+ ld bc, $fff9
+ add hl, bc
+ ld a, [hli]
+ add $3
+ ld c, a
+ ld a, [hli]
+ adc $0
+ ld b, a
+ ld a, c
+ ld [hli], a
+ ld a, b
+ ld [hl], a
+ scf
+.asm_12ba4
+ pop bc
+ pop hl
+ ret
+
+Func_12ba7: ; 12ba7 (4:6ba7)
+INCBIN "baserom.gbc",$12ba7,$12bcd - $12ba7
+
+Func_12bcd: ; 12bcd (4:6bcd)
+INCBIN "baserom.gbc",$12bcd,$12c05 - $12bcd
+
+Func_12c05: ; 12c05 (4:6c05)
+ push hl
+ push bc
+ push de
+ ld b, a
+ ld d, $0
+ ld a, [$d618]
+ ld c, a
+ ld hl, $d5d8
+ or a
+ jr z, .asm_12c22
+.asm_12c15
+ inc hl
+ ld a, [hl]
+ cp b
+ jr z, .asm_12c3a
+ inc hl
+ ld a, [hli]
+ add [hl]
+ ld d, a
+ inc hl
+ dec c
+ jr nz, .asm_12c15
+.asm_12c22
+ ld a, [$d618]
+ cp $10
+ jr nc, .asm_12c48
+ inc a
+ ld [$d618], a
+ inc hl
+ push hl
+ ld a, b
+ ld [hli], a
+ call Func_12c4f
+ push af
+ ld a, d
+ ld [hli], a
+ pop af
+ ld [hl], a
+ pop hl
+.asm_12c3a
+ dec hl
+ inc [hl]
+ inc hl
+ inc hl
+ ld a, [hli]
+ add [hl]
+ cp $81
+ jr nc, .asm_12c48
+ ld a, d
+ or a
+ jr .asm_12c4b
+.asm_12c48
+ rst $38
+ xor a
+ scf
+.asm_12c4b
+ pop de
+ pop bc
+ pop hl
+ ret
+
+Func_12c4f: ; 12c4f (4:6c4f)
+ push af
+ xor a
+ ld [$d4cb], a
+ ld a, d
+ ld [$d4ca], a
+ pop af
+ farcall Func_8025b
+ ret
+
+Func_12c5e: ; 12c5e (4:6c5e)
+INCBIN "baserom.gbc",$12c5e,$12c7f - $12c5e
+
+Func_12c7f: ; 12c7f (4:6c7f)
+INCBIN "baserom.gbc",$12c7f,$131b3 - $12c7f
+
+Func_131b3: ; 131b3 (4:71b3)
+INCBIN "baserom.gbc",$131b3,$131d3 - $131b3
+
+Func_131d3: ; 131d3 (4:71d3)
+INCBIN "baserom.gbc",$131d3,$1344d - $131d3
+
+Func_1344d: ; 1344d (4:744d)
+ call Func_379b
+ ld a, MUSIC_MEDAL
+ call PlaySong
+ ld hl, $07e6
+ call $2c73
+ call $3c96
+ call Func_37a0
+ ret
+; 0x13462
+
+INCBIN "baserom.gbc",$13462,$13485 - $13462
+
+Func_13485: ; 13485 (4:7485)
+ call EnableExtRAM
+ ld a, [$ba68]
+ or a
+ ret z
+ ld a, [$ba56]
+ ld [$ce43], a
+ ld a, [$ba57]
+ ld [$ce44], a
+ call DisableExtRAM
+ call Func_379b
+ ld a, MUSIC_MEDAL
+ call PlaySong
+ ld hl, $07e8
+ call $2c73
+ call $3c96
+ call Func_37a0
+ ret
+; 0x134b1
+
+INCBIN "baserom.gbc",$134b1,$14000 - $134b1
diff --git a/src/engine/bank6.asm b/src/engine/bank6.asm
new file mode 100755
index 0000000..7535b3f
--- /dev/null
+++ b/src/engine/bank6.asm
@@ -0,0 +1,175 @@
+INCBIN "baserom.gbc",$18000,$1996e - $18000
+
+Func_1996e: ; 1996e (6:596e)
+ call EnableExtRAM
+ ld a, $c2
+ ld [$ff97], a
+ ld hl, $a100
+ ld bc, $1607
+.asm_1997b
+ xor a
+ ld [hli], a
+ dec bc
+ ld a, c
+ or b
+ jr nz, .asm_1997b
+ ld a, $5
+ ld hl, $a350
+ call Func_199e0
+ ld a, $7
+ ld hl, $a3a4
+ call Func_199e0
+ ld a, $9
+ ld hl, $a3f8
+ call Func_199e0
+ call EnableExtRAM
+ ld hl, $a100
+ ld a, $80
+.asm_199a2
+ ld [hl], a
+ inc l
+ jr nz, .asm_199a2
+ ld hl, $bc00
+ xor a
+ ld [hli], a
+ ld [hli], a
+ ld [hl], a
+ ld hl, $bb00
+ ld c, $10
+.asm_199b2
+ ld [hl], $0
+ ld de, $0010
+ add hl, de
+ dec c
+ jr nz, .asm_199b2
+ ld a, $2
+ ld [$a003], a
+ ld a, $2
+ ld [$a006], a
+ ld [$ce47], a
+ xor a
+ ld [$a007], a
+ ld [$a009], a
+ ld [$a004], a
+ ld [$a005], a
+ ld [$a00a], a
+ farcall Func_8cf9
+ call DisableExtRAM
+ ret
+
+Func_199e0: ; 199e0 (6:59e0)
+ push de
+ push bc
+ push hl
+ call LoadDeck
+ jr c, .asm_19a0e
+ call Func_19a12
+ pop hl
+ call EnableExtRAM
+ push hl
+ ld de, $c590
+.asm_199f3
+ ld a, [de]
+ inc de
+ ld [hli], a
+ or a
+ jr nz, .asm_199f3
+ pop hl
+ push hl
+ ld de, $0018
+ add hl, de
+ ld de, $c400
+ ld c, $3c
+.asm_19a04
+ ld a, [de]
+ inc de
+ ld [hli], a
+ dec c
+ jr nz, .asm_19a04
+ call DisableExtRAM
+ or a
+.asm_19a0e
+ pop hl
+ pop bc
+ pop de
+ ret
+
+Func_19a12: ; 19a12 (6:5a12)
+ ld hl, $cce9
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ ld de, $c590
+ call Func_2e89
+ ret
+; 0x19a1f
+
+INCBIN "baserom.gbc",$19a1f,$1a61f - $19a1f
+
+Func_1a61f: ; 1a61f (6:661f)
+ push af
+ ld de, $389f
+ call Func_2275
+ pop af
+ or a
+ jr nz, .asm_1a640
+ ld a, $40
+ call $663b
+ ld a, $5f
+ call $663b
+ ld a, $76
+ call $663b
+ ld a, $c1
+ ld hl, $0191
+ jr .asm_1a660
+.asm_1a640
+ ld hl, $018f
+ cp $1e
+ jr z, .asm_1a660
+ cp $43
+ jr z, .asm_1a660
+ ld hl, $0192
+ cp $64
+ jr z, .asm_1a660
+ ld hl, $0193
+ cp $65
+ jr z, .asm_1a660
+ cp $66
+ jr z, .asm_1a660
+ ld hl, $0190
+.asm_1a660
+ push hl
+ ld e, a
+ ld d, $0
+ call $2f10
+ call Func_379b
+ ld a, MUSIC_MEDAL
+ call PlaySong
+ ld hl, $cc27
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ bank1call $2ebb
+ ld a, $c2
+ ld [$ff97], a
+ pop hl
+ bank1call $5e5f
+.asm_1a680
+ call Func_378a
+ or a
+ jr nz, .asm_1a680
+ call Func_37a0
+ bank1call $5773
+ ret
+; 0x1a68d
+
+INCBIN "baserom.gbc",$1a68d,$1a6cc - $1a68d
+
+Func_1a6cc: ; 1a6cc (6:66cc)
+ ret
+; 0x1a6cd
+
+INCBIN "baserom.gbc",$1a6cd,$1ad89 - $1a6cd
+
+Func_1ad89: ; 1ad89 (6:6d89)
+INCBIN "baserom.gbc",$1ad89,$1c000 - $1ad89
diff --git a/src/engine/bank7.asm b/src/engine/bank7.asm
new file mode 100755
index 0000000..7622b0d
--- /dev/null
+++ b/src/engine/bank7.asm
@@ -0,0 +1,314 @@
+INCBIN "baserom.gbc",$1c000,$1c056 - $1c000
+
+Func_1c056: ; 1c056 (7:4056)
+ push hl
+ push bc
+ push de
+ ld a, [wCurMap]
+ add a
+ ld c, a
+ ld b, $0
+ ld hl, WarpDataPointers
+ add hl, bc
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ ld bc, $0005
+ ld a, [wPlayerXCoord]
+ ld d, a
+ ld a, [wPlayerYCoord]
+ ld e, a
+.asm_1c072
+ ld a, [hli]
+ or [hl]
+ jr z, .asm_1c095
+ ld a, [hld]
+ cp e
+ jr nz, .asm_1c07e
+ ld a, [hl]
+ cp d
+ jr z, .asm_1c081
+.asm_1c07e
+ add hl, bc
+ jr .asm_1c072
+.asm_1c081
+ inc hl
+ inc hl
+ ld a, [hli]
+ ld [$d0bb], a
+ ld a, [hli]
+ ld [$d0bc], a
+ ld a, [hli]
+ ld [$d0bd], a
+ ld a, [$d334]
+ ld [$d0be], a
+.asm_1c095
+ pop de
+ pop bc
+ pop hl
+ ret
+
+INCLUDE "data/warp_data.asm"
+
+Func_1c33b: ; 1c33b (7:433b)
+ push hl
+ push bc
+ push de
+ ld a, [wCurMap]
+ add a
+ ld c, a
+ add a
+ add c
+ ld c, a
+ ld b, $0
+ ld hl, MapSongs
+ add hl, bc
+ ld a, [hli]
+ ld [$d131], a
+ ld a, [hli]
+ ld c, a
+ ld a, [hli]
+ ld [$d28f], a
+ ld a, [hli]
+ ld [$d132], a
+ ld a, [hli]
+ ld [$d290], a
+ ld a, [hli]
+ ld [$d111], a
+ ld a, [$cab4]
+ cp $2
+ jr nz, .asm_1c370
+ ld a, c
+ or a
+ jr z, .asm_1c370
+ ld [$d131], a
+.asm_1c370
+ pop de
+ pop bc
+ pop hl
+ ret
+
+INCLUDE "data/map_songs.asm"
+
+Func_1c440: ; 1c440 (7:4440)
+INCBIN "baserom.gbc",$1c440,$1c485 - $1c440
+
+Func_1c485: ; 1c485 (7:4485)
+INCBIN "baserom.gbc",$1c485,$1c58e - $1c485
+
+Func_1c58e: ; 1c58e (7:458e)
+INCBIN "baserom.gbc",$1c58e,$1c5e9 - $1c58e
+
+Func_1c5e9: ; 1c5e9 (7:45e9)
+INCBIN "baserom.gbc",$1c5e9,$1c610 - $1c5e9
+
+Func_1c610: ; 1c610 (7:4610)
+INCBIN "baserom.gbc",$1c610,$1c6f8 - $1c610
+
+Func_1c6f8: ; 1c6f8 (7:46f8)
+INCBIN "baserom.gbc",$1c6f8,$1c72e - $1c6f8
+
+Func_1c72e: ; 1c72e (7:472e)
+INCBIN "baserom.gbc",$1c72e,$1c768 - $1c72e
+
+Func_1c768: ; 1c768 (7:4768)
+INCBIN "baserom.gbc",$1c768,$1c82e - $1c768
+
+Func_1c82e: ; 1c82e (7:482e)
+INCBIN "baserom.gbc",$1c82e,$1d078 - $1c82e
+
+Func_1d078: ; 1d078 (7:5078)
+ ld a, [$d627]
+ or a
+ jr z, .asm_1d0c7
+.asm_1d07e
+ ld a, MUSIC_STOP
+ call PlaySong
+ call Func_3ca0
+ call $5335
+ call $53ce
+ xor a
+ ld [$d635], a
+ ld a, $3c
+ ld [$d626], a
+.asm_1d095
+ call Func_3c48
+ call Func_089b
+ call $5614
+ ld hl, $d635
+ inc [hl]
+ call Func_378a
+ or a
+ jr nz, .asm_1d0ae
+ farcall Func_10ab4
+ jr .asm_1d07e
+.asm_1d0ae
+ ld hl, $d626
+ ld a, [hl]
+ or a
+ jr z, .asm_1d0b8
+ dec [hl]
+ jr .asm_1d095
+.asm_1d0b8
+ ld a, [$ff91]
+ and $9
+ jr z, .asm_1d095
+ ld a, $2
+ call Func_3796
+ farcall Func_10ab4
+
+.asm_1d0c7
+ call $50fa
+ call $511c
+ ld a, [$d628]
+ cp $2
+ jr nz, .asm_1d0db
+ call $5289
+ jr c, Func_1d078
+ jr .asm_1d0e7
+.asm_1d0db
+ ld a, [$d628]
+ cp $1
+ jr nz, .asm_1d0e7
+ call $52b8
+ jr c, Func_1d078
+.asm_1d0e7
+ ld a, [$d628]
+ cp $0
+ jr nz, .asm_1d0f3
+ call $52dd
+ jr c, Func_1d078
+.asm_1d0f3
+ call Func_3bdb
+ call Func_3ca0
+ ret
+; 0x1d0fa
+
+INCBIN "baserom.gbc",$1d0fa,$1d11c - $1d0fa
+
+Func_1d11c: ; 1d11c (7:511c)
+ ld a, MUSIC_PCMAINMENU
+ call PlaySong
+ call DisableLCD
+ farcallx $4, $4000
+ ld de, $308f
+ call Func_2275
+ call Func_3ca0
+ xor a
+ ld [$cd08], a
+ call $51e1
+ call $517f
+ ld a, $ff
+ ld [$d626], a
+ ld a, [$d627]
+ cp $4
+ jr c, .asm_1d14f
+ ld a, [$d624]
+ or a
+ jr z, .asm_1d14f
+ ld a, $1
+.asm_1d14f
+ ld hl, $d636
+ farcall Func_111e9
+ farcallx $4, $4031
+.asm_1d15a
+ call Func_3c48
+ call Func_089b
+ call Func_264b
+ push af
+ call $51e9
+ pop af
+ jr nc, .asm_1d15a
+ ld a, [$ffb1]
+ cp e
+ jr nz, .asm_1d15a
+ ld [$d627], a
+ ld a, [$d624]
+ or a
+ jr nz, .asm_1d17a
+ inc e
+ inc e
+.asm_1d17a
+ ld a, e
+ ld [$d628], a
+ ret
+; 0x1d17f
+
+INCBIN "baserom.gbc",$1d17f,$1d306 - $1d17f
+
+Func_1d306: ; 1d306 (7:5306)
+INCBIN "baserom.gbc",$1d306,$1d386 - $1d306
+
+Titlescreen_1d386: ; 1d386 (7:5386)
+ call Func_378a
+ or a
+ jr nz, .asm_1d39f
+ call DisableLCD
+ ld a, MUSIC_TITLESCREEN
+ call PlaySong
+ ld bc, $0000
+ ld a, $0
+ call Func_3df3
+ call Func_1d59c
+.asm_1d39f
+ call Func_3ca0
+ call Func_1d3a9
+ call EnableLCD
+ ret
+
+Func_1d3a9: ; 1d3a9 (7:53a9)
+INCBIN "baserom.gbc",$1d3a9,$1d42e - $1d3a9
+
+Func_1d42e: ; 1d42e (7:542e)
+INCBIN "baserom.gbc",$1d42e,$1d519 - $1d42e
+
+Titlescreen_1d519: ; 1d519 (7:5519)
+ ld a, MUSIC_TITLESCREEN
+ call PlaySong
+ call Func_1d42e
+ scf
+ ret
+; 0x1d523
+
+INCBIN "baserom.gbc",$1d523,$1d59c - $1d523
+
+Func_1d59c: ; 1d59c (7:559c)
+INCBIN "baserom.gbc",$1d59c,$1d6ad - $1d59c
+
+Credits_1d6ad: ; 1d6ad (7:56ad)
+ ld a, MUSIC_STOP
+ call PlaySong
+ call $5705
+ call $4858
+ xor a
+ ld [$d324], a
+ ld a, MUSIC_CREDITS
+ call PlaySong
+ farcallx $4, $4031
+ call $57fc
+.asm_1d6c8
+ call Func_3c48
+ call $5765
+ call $580b
+ ld a, [$d633]
+ cp $ff
+ jr nz, .asm_1d6c8
+ call $3c96
+ ld a, $8
+ farcallx $4, $6863
+ ld a, MUSIC_STOP
+ call PlaySong
+ farcall Func_10ab4
+ call $3ca4
+ call $02d4
+ call $5758
+ call EnableLCD
+ call Func_3c48
+ call DisableLCD
+ ld hl, $cabb
+ set 1, [hl]
+ call Func_3bdb
+ ret
+; 0x1d705
+
+INCBIN "baserom.gbc",$1d705,$20000 - $1d705
diff --git a/src/engine/home.asm b/src/engine/home.asm
new file mode 100755
index 0000000..dd06781
--- /dev/null
+++ b/src/engine/home.asm
@@ -0,0 +1,4851 @@
+GLOBAL GrassEnergyCardGfx
+GLOBAL TextOffsets
+
+; rst vectors
+SECTION "rst00",ROM0[0]
+ ret
+SECTION "rst08",ROM0[8]
+ ret
+SECTION "rst10",ROM0[$10]
+ ret
+SECTION "rst18",ROM0[$18]
+ jp RST18
+SECTION "rst20",ROM0[$20]
+ jp RST20
+SECTION "rst28",ROM0[$28]
+ jp RST28
+SECTION "rst30",ROM0[$30]
+ ret
+SECTION "rst38",ROM0[$38]
+ ret
+
+; interrupts
+SECTION "vblank",ROM0[$40]
+ jp VBlankHandler
+SECTION "lcdc",ROM0[$48]
+ call $cacd
+ reti
+SECTION "timer",ROM0[$50]
+ jp TimerHandler
+SECTION "serial",ROM0[$58]
+ jp SerialHandler
+SECTION "joypad",ROM0[$60]
+ reti
+
+SECTION "romheader",ROM0[$100]
+ nop
+ jp Start
+
+SECTION "start",ROM0[$150]
+Start: ; 0150 (0:0150)
+ di
+ ld sp, $fffe
+ push af
+ xor a
+ ld [rIF], a
+ ld [rIE], a
+ call ZeroRAM
+ ld a, $1
+ call BankswitchHome
+ xor a
+ call BankswitchRAM
+ call BankswitchVRAM_0
+ call DisableLCD
+ pop af
+ ld [wInitialA], a
+ call DetectConsole
+ ld a, $20
+ ld [wTileMapFill], a
+ call SetupVRAM
+ call SetupLCD
+ call SetupPalettes
+ call SetupSound_T
+ call SetupTimer
+ call ResetSerial
+ call CopyDMAFunction
+ call SetupExtRAM
+ ld a, BANK(Func_4000)
+ call BankswitchHome
+ ld sp, $e000
+ jp Func_4000
+
+VBlankHandler: ; 019b (0:019b)
+ push af
+ push bc
+ push de
+ push hl
+ ld a, [hBankROM]
+ push af
+ ld hl, wReentrancyFlag
+ bit 0, [hl]
+ jr nz, .done
+ set 0, [hl]
+ ld a, [wVBlankOAMCopyToggle]
+ or a
+ jr z, .no_oam_copy
+ call hDMAFunction ; DMA-copy $ca00-$ca9f to OAM memory
+ xor a
+ ld [wVBlankOAMCopyToggle], a
+.no_oam_copy
+ ; flush scaling/windowing parameters
+ ld a, [hSCX]
+ ld [rSCX], a
+ ld a, [hSCY]
+ ld [rSCY], a
+ ld a, [hWX]
+ ld [rWX], a
+ ld a, [hWY]
+ ld [rWY], a
+ ; flush LCDC
+ ld a, [wLCDC]
+ ld [rLCDC], a
+ ei
+ call $cad0
+ call FlushPalettes
+ ld hl, wVBlankCtr
+ inc [hl]
+ ld hl, wReentrancyFlag
+ res 0, [hl]
+.done
+ pop af
+ call BankswitchHome
+ pop hl
+ pop de
+ pop bc
+ pop af
+ reti
+
+TimerHandler: ; 01e6 (0:01e6)
+ push af
+ push hl
+ push de
+ push bc
+ ei
+ call SerialTimerHandler
+ ; only trigger every fourth interrupt ≈ 60.24 Hz
+ ld hl, wCounterCtr
+ ld a, [hl]
+ inc [hl]
+ and $3
+ jr nz, .done
+ ; increment the 60-60-60-255-255 counter
+ call IncrementCounter
+ ; check in-timer flag
+ ld hl, wReentrancyFlag
+ bit 1, [hl]
+ jr nz, .done
+ set 1, [hl]
+ ld a, [hBankROM]
+ push af
+ ld a, BANK(SoundTimerHandler_Ext)
+ call BankswitchHome
+ call SoundTimerHandler_Ext
+ pop af
+ call BankswitchHome
+ ; clear in-timer flag
+ ld hl, wReentrancyFlag
+ res 1, [hl]
+.done
+ pop bc
+ pop de
+ pop hl
+ pop af
+ reti
+
+; increment timer counter by a tick
+IncrementCounter: ; 021c (0:021c)
+ ld a, [wCounterEnable]
+ or a
+ ret z
+ ld hl, wCounter
+ inc [hl]
+ ld a, [hl]
+ cp 60
+ ret c
+ ld [hl], $0
+ inc hl
+ inc [hl]
+ ld a, [hl]
+ cp 60
+ ret c
+ ld [hl], $0
+ inc hl
+ inc [hl]
+ ld a, [hl]
+ cp 60
+ ret c
+ ld [hl], $0
+ inc hl
+ inc [hl]
+ ret nz
+ inc hl
+ inc [hl]
+ ret
+
+; setup timer to 16384/68 ≈ 240.94 Hz
+SetupTimer: ; 0241 (0:0241)
+ ld b, $100 - 68
+ ; ld b, $bc
+ call CheckForCGB
+ jr c, .asm_250
+ ld a, [rKEY1]
+ and $80
+ jr z, .asm_250
+ ld b, $100 - 2*68
+.asm_250
+ ld a, b
+ ld [rTMA], a
+ ld a, rTAC_16384_HZ
+ ld [rTAC], a
+ ld a, $7
+ ld [rTAC], a
+ ret
+
+; carry flag: 0 if CGB
+CheckForCGB: ; 025c (0:025c)
+ ld a, [wConsole]
+ cp CONSOLE_CGB
+ ret z
+ scf
+ ret
+
+; wait for vblank
+WaitForVBlank: ; 0264 (0:0264)
+ push hl
+ ld a, [wLCDC]
+ bit 7, a
+ jr z, .asm_275
+ ld hl, wVBlankCtr
+ ld a, [hl]
+.asm_270
+ halt
+ cp [hl]
+ jr z, .asm_270
+.asm_275
+ pop hl
+ ret
+
+; turn LCD on
+EnableLCD: ; 0277 (0:0277)
+ ld a, [wLCDC] ;
+ bit 7, a ;
+ ret nz ; assert that LCD is off
+ or $80 ;
+ ld [wLCDC], a ;
+ ld [rLCDC], a ; turn LCD on
+ ld a, $c0
+ ld [wFlushPaletteFlags], a
+ ret
+
+; wait for vblank, then turn LCD off
+DisableLCD: ; 028a (0:028a)
+ ld a, [rLCDC] ;
+ bit 7, a ;
+ ret z ; assert that LCD is on
+ ld a, [rIE]
+ ld [wIE], a
+ res 0, a ;
+ ld [rIE], a ; disable vblank interrupt
+.asm_298
+ ld a, [rLY] ;
+ cp $91 ;
+ jr nz, .asm_298 ; wait for vblank
+ ld a, [rLCDC] ;
+ and $7f ;
+ ld [rLCDC], a ;
+ ld a, [wLCDC] ;
+ and $7f ;
+ ld [wLCDC], a ; turn LCD off
+ xor a
+ ld [rBGP], a
+ ld [rOBP0], a
+ ld [rOBP1], a
+ ld a, [wIE]
+ ld [rIE], a
+ ret
+
+; set OBJ size: 8x8
+Set_OBJ_8x8: ; 02b9 (0:02b9)
+ ld a, [wLCDC]
+ and $fb
+ ld [wLCDC], a
+ ret
+
+; set OBJ size: 8x16
+Set_OBJ_8x16: ; 02c2 (0:02c2)
+ ld a, [wLCDC]
+ or $4
+ ld [wLCDC], a
+ ret
+
+; set Window Display on
+Set_WD_on: ; 02cb (0:02cb)
+ ld a, [wLCDC]
+ or $20
+ ld [wLCDC], a
+ ret
+
+; set Window Display off
+Set_WD_off: ; 02d4 (0:02d4)
+ ld a, [wLCDC]
+ and $df
+ ld [wLCDC], a
+ ret
+
+EnableInt_Timer: ; 02dd (0:02dd)
+ ld a, [rIE]
+ or $4
+ ld [rIE], a
+ ret
+
+EnableInt_VBlank: ; 02e4 (0:02e4)
+ ld a, [rIE]
+ or $1
+ ld [rIE], a
+ ret
+
+EnableInt_HBlank: ; 02eb (0:02eb)
+ ld a, [rSTAT]
+ or $8
+ ld [rSTAT], a
+ xor a
+ ld [rIF], a
+ ld a, [rIE]
+ or $2
+ ld [rIE], a
+ ret
+
+DisableInt_HBlank: ; 02fb (0:02fb)
+ ld a, [rSTAT]
+ and $f7
+ ld [rSTAT], a
+ xor a
+ ld [rIF], a
+ ld a, [rIE]
+ and $fd
+ ld [rIE], a
+ ret
+
+SetupLCD: ; 030b (0:030b)
+ xor a
+ ld [rSCY], a
+ ld [rSCX], a
+ ld [rWY], a
+ ld [rWX], a
+ ld [$cab0], a
+ ld [$cab1], a
+ ld [$cab2], a
+ ld [hSCX], a
+ ld [hSCY], a
+ ld [hWX], a
+ ld [hWY], a
+ xor a
+ ld [wReentrancyFlag], a
+ ld a, $c3 ; $c3 = jp nn
+ ld [$cacd], a
+ ld [wVBlankFunctionTrampoline], a
+ ld hl, wVBlankFunctionTrampoline + 1
+ ld [hl], NopF & $ff ;
+ inc hl ; load `jp NopF`
+ ld [hl], NopF >> $8 ;
+ ld a, $47
+ ld [wLCDC], a
+ ld a, $1
+ ld [MBC3LatchClock], a
+ ld a, $a
+ ld [MBC3SRamEnable], a
+NopF: ; 0348 (0:0348)
+ ret
+
+DetectConsole: ; 0349 (0:0349)
+ ld b, CONSOLE_CGB
+ cp GBC
+ jr z, .asm_35b
+ call DetectSGB
+ ld b, CONSOLE_DMG
+ jr nc, .asm_35b
+ call InitSGB
+ ld b, CONSOLE_SGB
+.asm_35b
+ ld a, b
+ ld [wConsole], a
+ cp CONSOLE_CGB
+ ret nz
+ ld a, CONSOLE_SGB
+ ld [rSVBK], a
+ call Func_07e7
+ ret
+
+; initialize the palettes (both monochrome and color)
+SetupPalettes: ; 036a (0:036a)
+ ld hl, wBGP
+ ld a, $e4
+ ld [rBGP], a
+ ld [hli], a
+ ld [rOBP0], a
+ ld [rOBP1], a
+ ld [hli], a
+ ld [hl], a
+ xor a
+ ld [wFlushPaletteFlags], a
+ ld a, [wConsole]
+ cp CONSOLE_CGB
+ ret nz
+ ld de, wBufPalette
+ ld c, $10
+.asm_387
+ ld hl, InitialPalette
+ ld b, $8
+.asm_38c
+ ld a, [hli]
+ ld [de], a
+ inc de
+ dec b
+ jr nz, .asm_38c
+ dec c
+ jr nz, .asm_387
+ call FlushBothCGBPalettes
+ ret
+
+InitialPalette: ; 0399 (0:0399)
+ RGB 28,28,24
+ RGB 21,21,16
+ RGB 10,10,08
+ RGB 00,00,00
+
+SetupVRAM: ; 03a1 (0:03a1)
+ call FillTileMap
+ call CheckForCGB
+ jr c, .asm_3b2
+ call BankswitchVRAM_1
+ call .asm_3b2
+ call BankswitchVRAM_0
+.asm_3b2
+ ld hl, $8000
+ ld bc, $1800
+.asm_3b8
+ xor a
+ ld [hli], a
+ dec bc
+ ld a, b
+ or c
+ jr nz, .asm_3b8
+ ret
+
+; fill VARM tile map banks with [wTileMapFill]
+FillTileMap: ; 03c0 (0:03c0)
+ call BankswitchVRAM_0
+ ld hl, $9800
+ ld bc, $0400
+.asm_3c9
+ ld a, [wTileMapFill]
+ ld [hli], a
+ dec bc
+ ld a, c
+ or b
+ jr nz, .asm_3c9
+ ld a, [wConsole]
+ cp CONSOLE_CGB
+ ret nz
+ call BankswitchVRAM_1
+ ld hl, $9800
+ ld bc, $0400
+.asm_3e1
+ xor a
+ ld [hli], a
+ dec bc
+ ld a, c
+ or b
+ jr nz, .asm_3e1
+ call BankswitchVRAM_0
+ ret
+
+; zero work RAM & stack area ($C000-$EFFF, $FF80-$FF7F)
+ZeroRAM: ; 03ec (0:03ec)
+ ld hl, $c000
+ ld bc, $2000
+.asm_3f2
+ xor a
+ ld [hli], a
+ dec bc
+ ld a, c
+ or b
+ jr nz, .asm_3f2
+ ld c, $80
+ ld b, $70
+ xor a
+.asm_3fe
+ ld [$ff00+c], a
+ inc c
+ dec b
+ jr nz, .asm_3fe
+ ret
+
+Func_0404: ; 0404 (0:0404)
+ ld a, $c0
+ jr asm_411
+
+Func_0408: ; 0408 (0:0408)
+ or $80
+ jr asm_411
+
+Func_040c: ; 040c (0:040c)
+ ld [wBGP], a
+asm_40f
+ ld a, $80
+asm_411
+ ld [wFlushPaletteFlags], a
+ ld a, [wLCDC]
+ rla
+ ret c
+ push hl
+ push de
+ push bc
+ call FlushPalettes
+ pop bc
+ pop de
+ pop hl
+ ret
+
+Set_OBP0: ; 0423 (0:0423)
+ ld [wOBP0], a
+ jr asm_40f
+
+Set_OBP1: ; 0428 (0:0428)
+ ld [wOBP1], a
+ jr asm_40f
+
+; flushes non-CGB palettes from [wBGP], [wOBP0], [wOBP1] as well as CGB
+; palettes from [wBufPalette..wBufPalette+$1f] (BG palette) and
+; [wBufPalette+$20..wBufPalette+$3f] (sprite palette).
+; only flushes if [wFlushPaletteFlags] is nonzero, and only flushes sprite
+; palette if bit6 of that location is set.
+FlushPalettes: ; 042d (0:042d)
+ ld a, [wFlushPaletteFlags]
+ or a
+ ret z
+ ; flush grayscale (non-CGB) palettes
+ ld hl, wBGP
+ ld a, [hli]
+ ld [rBGP], a
+ ld a, [hli]
+ ld [rOBP0], a
+ ld a, [hl]
+ ld [rOBP1], a
+ ld a, [wConsole]
+ cp CONSOLE_CGB
+ jr z, flushPaletteCGB
+flushPaletteDone
+ xor a
+ ld [wFlushPaletteFlags], a
+ ret
+flushPaletteCGB
+ ; flush BG palette (BGP)
+ ; if bit6 of [wFlushPaletteFlags] is set, flush OBP too
+ ld a, [wFlushPaletteFlags]
+ bit 6, a
+ jr nz, FlushBothCGBPalettes
+ ld b, $8
+ call CopyPalette
+ jr flushPaletteDone
+
+FlushBothCGBPalettes: ; 0458 (0:0458)
+ xor a
+ ld b, $40
+ ; flush BGP $00-$1f
+ call CopyPalette
+ ld a, $8
+ ld b, $40
+ ; flush OBP $00-$1f
+ call CopyPalette
+ jr flushPaletteDone
+
+CopyPalette: ; 0467 (0:0467)
+ add a
+ add a
+ add a
+ ld e, a
+ ld d, $0
+ ld hl, $caf0
+ add hl, de
+ ld c, $68
+ bit 6, a
+ jr z, .asm_479
+ ld c, $6a
+.asm_479
+ and $bf
+ ld e, a
+.asm_47c
+ ld a, e
+ ld [$ff00+c], a
+ inc c
+.asm_47f
+ ld a, [rSTAT]
+ and $2
+ jr nz, .asm_47f
+ ld a, [hl]
+ ld [$ff00+c], a
+ ld a, [$ff00+c]
+ cp [hl]
+ jr nz, .asm_47f
+ inc hl
+ dec c
+ inc e
+ dec b
+ jr nz, .asm_47c
+ ret
+
+Func_0492: ; 0492 (0:0492)
+ ld a, [hli]
+ ld b, a
+ ld a, [hli]
+ ld c, a
+ call Func_04cf
+ jr .asm_49d
+.asm_49b
+ ld [de], a
+ inc de
+.asm_49d
+ ld a, [hli]
+ or a
+ jr nz, .asm_49b
+ ret
+
+Func_04a2: ; 04a2 (0:04a2)
+ call DisableLCD
+ call FillTileMap
+ xor a
+ ld [$cac2], a
+ ld a, [wConsole]
+ cp CONSOLE_SGB
+ ret nz
+ call EnableLCD ;
+ ld hl, SGB_04bf ; send SGB data
+ call SendSGB ;
+ call DisableLCD ;
+ ret
+
+SGB_04bf: ; 04bf (0:04bf)
+INCBIN "baserom.gbc",$04bf,$04cf - $04bf
+
+Func_04cf: ; 04cf (0:04cf)
+ ld l, c
+ ld h, $0
+ add hl, hl
+ add hl, hl
+ add hl, hl
+ add hl, hl
+ add hl, hl
+ ld c, b
+ ld b, $98
+ add hl, bc
+ ld e, l
+ ld d, h
+ ret
+
+; read joypad
+ReadJoypad: ; 04de (0:04de)
+ ld a, $20
+ ld [rJOYP], a
+ ld a, [rJOYP]
+ ld a, [rJOYP]
+ cpl
+ and $f
+ swap a
+ ld b, a
+ ld a, $10
+ ld [rJOYP], a
+ ld a, [rJOYP]
+ ld a, [rJOYP]
+ ld a, [rJOYP]
+ ld a, [rJOYP]
+ ld a, [rJOYP]
+ ld a, [rJOYP]
+ cpl
+ and $f
+ or b
+ ld c, a ; joypad data
+ cpl
+ ld b, a
+ ld a, [hButtonsHeld]
+ xor c
+ and b
+ ld [hButtonsReleased], a
+ ld a, [hButtonsHeld]
+ xor c
+ and c
+ ld b, a
+ ld [hButtonsPressed], a
+ ld a, [hButtonsHeld]
+ and $f
+ cp $f
+ jr nz, asm_522 ; handle reset
+ call ResetSerial
+Reset: ; 051b (0:051b)
+ ld a, [wInitialA]
+ di
+ jp Start
+asm_522
+ ld a, c
+ ld [hButtonsHeld], a
+ ld a, $30
+ ld [rJOYP], a
+ ret
+
+; clear joypad hmem data
+ClearJoypad: ; 052a (0:052a)
+ push hl
+ ld hl, hDPadRepeat
+ xor a
+ ld [hli], a
+ ld [hli], a
+ ld [hli], a
+ ld [hli], a
+ ld [hli], a
+ pop hl
+ ret
+
+Func_0536: ; 0536 (0:0536)
+.loop
+ push af
+ call Func_053f
+ pop af
+ dec a
+ jr nz, .loop
+ ret
+
+Func_053f: ; 053f (0:053f)
+ push af
+ push hl
+ push de
+ push bc
+ ld hl, $cad3
+ call CallIndirect
+ call WaitForVBlank
+ call ReadJoypad
+ call HandleDPadRepeat
+ ld a, [$cad5]
+ or a
+ jr z, .asm_56d
+ ld a, [hButtonsPressed]
+ and $4
+ jr z, .asm_56d
+.asm_55e
+ call WaitForVBlank
+ call ReadJoypad
+ call HandleDPadRepeat
+ ld a, [hButtonsPressed]
+ and $4
+ jr z, .asm_55e
+.asm_56d
+ pop bc
+ pop de
+ pop hl
+ pop af
+ ret
+
+; handle D-pad repeatcounter
+HandleDPadRepeat: ; 0572 (0:0572)
+ ld a, [hButtonsHeld]
+ ld [hButtonsPressed2], a
+ and $f0
+ jr z, .asm_58c
+ ld hl, hDPadRepeat
+ ld a, [hButtonsPressed]
+ and $f0
+ jr z, .asm_586
+ ld [hl], 24
+ ret
+.asm_586
+ dec [hl]
+ jr nz, .asm_58c
+ ld [hl], 6
+ ret
+.asm_58c
+ ld a, [hButtonsPressed]
+ and $f
+ ld [hButtonsPressed2], a
+ ret
+
+CopyDMAFunction: ; 0593 (0:0593)
+ ld c, $83
+ ld b, JumpToFunctionInTable - DMA
+ ld hl, DMA
+.asm_59a
+ ld a, [hli]
+ ld [$ff00+c], a
+ inc c
+ dec b
+ jr nz, .asm_59a
+ ret
+
+; CopyDMAFunction copies this function to $ff83
+DMA: ; 05a1 (0:05a1)
+ ld a, $ca
+ ld [rDMA], a
+ ld a, $28
+.asm_5a7
+ dec a
+ jr nz, .asm_5a7
+ ret
+
+; jumps to index a in pointer table hl
+JumpToFunctionInTable: ; 05ab (0:05ab)
+ add a
+ add l
+ ld l, a
+ ld a, $0
+ adc h
+ ld h, a
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ jp [hl]
+
+; call function at [hl] if non-NULL
+CallIndirect: ; 05b6 (0:05b6)
+ push af
+ ld a, [hli]
+ or [hl]
+ jr nz, .asm_5bd
+ pop af
+ ret
+.asm_5bd
+ ld a, [hld]
+ ld l, [hl]
+ ld h, a
+ pop af
+ ; fallthrough
+CallF: ; 05c1 (0:05c1)
+ jp [hl]
+; 0x5c2
+
+INCBIN "baserom.gbc",$05c2,$0663 - $05c2
+
+Func_0663: ; 0663 (0:0663)
+ push bc
+ ld bc, $d8f0
+ call Func_0686
+ ld bc, $fc18
+ call Func_0686
+ ld bc, $ff9c
+ call Func_0686
+ ld bc, $fff6
+ call Func_0686
+ ld bc, $ffff
+ call Func_0686
+ xor a
+ ld [de], a
+ pop bc
+ ret
+
+Func_0686: ; 0686 (0:0686)
+ ld a, $2f
+.asm_688
+ inc a
+ add hl, bc
+ jr c, .asm_688
+ ld [de], a
+ inc de
+ ld a, l
+ sub c
+ ld l, a
+ ld a, h
+ sbc b
+ ld h, a
+ ret
+; 0x695
+
+INCBIN "baserom.gbc",$0695,$06c3 - $0695
+
+Func_06c3: ; 06c3 (0:06c3)
+ push af
+ ld a, [wLCDC]
+ rla
+ jr c, .asm_6d8
+ pop af
+ push hl
+ push de
+ push bc
+ push af
+ call Func_04cf
+ pop af
+ ld [de], a
+ pop bc
+ pop de
+ pop hl
+ ret
+.asm_6d8
+ pop af
+ push hl
+ push de
+ push bc
+ ld hl, $cac1
+ push hl
+ ld [hl], a
+ call Func_04cf
+ pop hl
+ ld b, $1
+ call MemcpyHLDE_hblank
+ pop bc
+ pop de
+ pop hl
+ ret
+; 0x6ee
+
+INCBIN "baserom.gbc",$06ee,$0709 - $06ee
+
+Func_0709: ; 0709 (0:0709)
+ jp MemcpyHLDE_hblank
+
+CopyGfxData: ; 070c (0:070c)
+ ld a, [wLCDC]
+ rla
+ jr nc, .asm_726
+.asm_712
+ push bc
+ push hl
+ push de
+ ld b, c
+ call Func_0709
+ ld b, $0
+ pop hl
+ add hl, bc
+ ld e, l
+ ld d, h
+ pop hl
+ add hl, bc
+ pop bc
+ dec b
+ jr nz, .asm_712
+ ret
+.asm_726
+ push bc
+.asm_727
+ ld a, [hli]
+ ld [de], a
+ inc de
+ dec c
+ jr nz, .asm_727
+ pop bc
+ dec b
+ jr nz, .asm_726
+ ret
+
+CopyData_SaveRegisters: ; 0732 (0:0732)
+ push hl
+ push de
+ push bc
+ call CopyData
+ pop bc
+ pop de
+ pop hl
+ ret
+
+; copies bc bytes from hl to de
+CopyData: ; 073c (0:073c)
+ ld a, [hli]
+ ld [de], a
+ inc de
+ dec bc
+ ld a, c
+ or b
+ jr nz, CopyData
+ ret
+
+; switch to rombank (A + top2 of h shifted down),
+; set top2 of H to 01,
+; return old rombank id on top-of-stack
+BankpushHome: ; 0745 (0:0745)
+ push hl
+ push bc
+ push af
+ push de
+ ld e, l
+ ld d, h
+ ld hl, [sp+$9]
+ ld b, [hl]
+ dec hl
+ ld c, [hl]
+ dec hl
+ ld [hl], b
+ dec hl
+ ld [hl], c
+ ld hl, [sp+$9]
+ ld a, [hBankROM]
+ ld [hld], a
+ ld [hl], $0
+ ld a, d
+ rlca
+ rlca
+ and $3
+ ld b, a
+ res 7, d
+ set 6, d
+ ld l, e
+ ld h, d
+ pop de
+ pop af
+ add b
+ call BankswitchHome
+ pop bc
+ ret
+; 0x76f
+
+INCBIN "baserom.gbc",$076f,$078e - $076f
+
+; restore rombank from top-of-stack
+BankpopHome: ; 078e (0:078e)
+ push hl
+ push de
+ ld hl, [sp+$7]
+ ld a, [hld]
+ call BankswitchHome
+ dec hl
+ ld d, [hl]
+ dec hl
+ ld e, [hl]
+ inc hl
+ inc hl
+ ld [hl], e
+ inc hl
+ ld [hl], d
+ pop de
+ pop hl
+ pop af
+ ret
+
+; switch ROM bank
+BankswitchHome: ; 07a3 (0:07a3)
+ ld [hBankROM], a
+ ld [MBC3RomBank], a
+ ret
+
+; switch RAM bank
+BankswitchRAM: ; 07a9 (0:07a9)
+ push af
+ ld [hBankRAM], a
+ ld [MBC3SRamBank], a
+ ld a, $a
+ ld [MBC3SRamEnable], a
+ pop af
+ ret
+
+; enable external RAM
+EnableExtRAM: ; 07b6 (0:07b6)
+ push af
+ ld a, $a
+ ld [MBC3SRamEnable], a
+ pop af
+ ret
+
+; disable external RAM
+DisableExtRAM: ; 07be (0:07be)
+ push af
+ xor a
+ ld [MBC3SRamEnable], a
+ pop af
+ ret
+
+; set current dest VRAM bank to 0
+BankswitchVRAM_0: ; 07c5 (0:07c5)
+ push af
+ xor a
+ ld [hBankVRAM], a
+ ld [rVBK], a
+ pop af
+ ret
+
+; set current dest VRAM bank to 1
+BankswitchVRAM_1: ; 07cd (0:07cd)
+ push af
+ ld a, $1
+ ld [hBankVRAM], a
+ ld [rVBK], a
+ pop af
+ ret
+
+; set current dest VRAM bank
+; a: value to write
+BankswitchVRAM: ; 07d6 (0:07d6)
+ ld [hBankVRAM], a
+ ld [rVBK], a
+ ret
+; 0x7db
+
+INCBIN "baserom.gbc",$07db,$07e7 - $07db
+
+Func_07e7: ; 07e7 (0:07e7)
+ call CheckForCGB
+ ret c
+ ld hl, rKEY1
+ bit 7, [hl]
+ ret nz
+ ld a, [rIE]
+ push af
+ xor a
+ ld [rIE], a
+ set 0, [hl]
+ xor a
+ ld [rIF], a
+ ld [rIE], a
+ ld a, $30
+ ld [rJOYP], a
+ stop
+ call SetupTimer
+ pop af
+ ld [rIE], a
+ ret
+
+SetupExtRAM: ; 080b (0:080b)
+ xor a
+ call BankswitchRAM
+ ld hl, $a000
+ ld bc, $1000
+.asm_815
+ ld a, [hli]
+ cp $41
+ jr nz, .asm_82f
+ ld a, [hli]
+ cp $93
+ jr nz, .asm_82f
+ dec bc
+ ld a, c
+ or b
+ jr nz, .asm_815
+ call Func_084d
+ scf
+ call Func_4050
+ call DisableExtRAM
+ ret
+.asm_82f
+ ld hl, $a000
+ ld a, [hli]
+ cp $4
+ jr nz, .asm_842
+ ld a, [hli]
+ cp $21
+ jr nz, .asm_842
+ ld a, [hl]
+ cp $5
+ jr nz, .asm_842
+ ret
+.asm_842
+ call Func_084d
+ or a
+ call Func_4050
+ call DisableExtRAM
+ ret
+
+Func_084d: ; 084d (0:084d)
+ ld a, $3
+.asm_84f
+ call ClearExtRAMBank
+ dec a
+ cp $ff
+ jr nz, .asm_84f
+ ld hl, $a000
+ ld [hl], $4
+ inc hl
+ ld [hl], $21
+ inc hl
+ ld [hl], $5
+ ret
+
+ClearExtRAMBank: ; 0863 (0:0863)
+ push af
+ call BankswitchRAM
+ call EnableExtRAM
+ ld hl, $a000
+ ld bc, $2000
+.asm_870
+ xor a
+ ld [hli], a
+ dec bc
+ ld a, c
+ or b
+ jr nz, .asm_870
+ pop af
+ ret
+
+Func_0879: ; 0879 (0:0879)
+ push de
+ ld a, h
+ ld e, l
+ ld d, $0
+ ld l, d
+ ld h, d
+ jr .asm_887
+.asm_882
+ add hl, de
+.asm_883
+ sla e
+ rl d
+.asm_887
+ srl a
+ jr c, .asm_882
+ jr nz, .asm_883
+ pop de
+ ret
+; 0x88f
+
+INCBIN "baserom.gbc",$088f,$089b - $088f
+
+Func_089b: ; 089b (0:089b)
+ push hl
+ push de
+ ld hl, $caca
+ ld a, [hli]
+ ld d, [hl]
+ inc hl
+ ld e, a
+ ld a, d
+ rlca
+ rlca
+ xor e
+ rra
+ push af
+ ld a, d
+ xor e
+ ld d, a
+ ld a, [hl]
+ xor e
+ ld e, a
+ pop af
+ rl e
+ rl d
+ ld a, d
+ xor e
+ inc [hl]
+ dec hl
+ ld [hl], d
+ dec hl
+ ld [hl], e
+ pop de
+ pop hl
+ ret
+
+Func_08bf: ; 08bf (0:08bf)
+ ld hl, $cad6
+ ld [hl], e
+ inc hl
+ ld [hl], d
+ ld hl, $cad8
+ ld [hl], $1
+ inc hl
+ xor a
+ ld [hli], a
+ ld [hli], a
+ ld [hli], a
+ ld [hli], a
+ ld [hl], b
+ inc hl
+ ld [hli], a
+ ld [hl], $ef
+ ld h, b
+ ld l, $0
+ xor a
+.asm_8d9
+ ld [hl], a
+ inc l
+ jr nz, .asm_8d9
+ ret
+
+Func_08de: ; 08de (0:08de)
+ push hl
+ push de
+.asm_8e0
+ push bc
+ call Func_08ef
+ ld [de], a
+ inc de
+ pop bc
+ dec bc
+ ld a, c
+ or b
+ jr nz, .asm_8e0
+ pop de
+ pop hl
+ ret
+
+Func_08ef: ; 08ef (0:08ef)
+ ld hl, $cadc
+ ld a, [hl]
+ or a
+ jr z, .asm_902
+ dec [hl]
+ inc hl
+.asm_8f8
+ ld b, [hl]
+ inc hl
+ ld c, [hl]
+ inc [hl]
+ inc hl
+ ld a, [bc]
+ ld c, [hl]
+ inc [hl]
+ ld [bc], a
+ ret
+.asm_902
+ ld hl, $cad6
+ ld c, [hl]
+ inc hl
+ ld b, [hl]
+ inc hl
+ dec [hl]
+ inc hl
+ jr nz, .asm_914
+ dec hl
+ ld [hl], $8
+ inc hl
+ ld a, [bc]
+ inc bc
+ ld [hl], a
+.asm_914
+ rl [hl]
+ ld a, [bc]
+ inc bc
+ jr nc, .asm_92a
+ ld hl, $cad6
+ ld [hl], c
+ inc hl
+ ld [hl], b
+ ld hl, $cadd
+ ld b, [hl]
+ inc hl
+ inc hl
+ ld c, [hl]
+ inc [hl]
+ ld [bc], a
+ ret
+.asm_92a
+ ld [$cade], a
+ ld hl, $cada
+ bit 0, [hl]
+ jr nz, .asm_94a
+ set 0, [hl]
+ inc hl
+ ld a, [bc]
+ inc bc
+ ld [hli], a
+ swap a
+.asm_93c
+ and $f
+ inc a
+ ld [hli], a
+ push hl
+ ld hl, $cad6
+ ld [hl], c
+ inc hl
+ ld [hl], b
+ pop hl
+ jr .asm_8f8
+.asm_94a
+ res 0, [hl]
+ inc hl
+ ld a, [hli]
+ jr .asm_93c
+; 0x950
+
+INCBIN "baserom.gbc",$0950,$099c - $0950
+
+Func_099c: ; 099c (0:099c)
+ xor a
+ ld [$cab5], a
+ ld hl, $ca00
+ ld c, $28
+ xor a
+.asm_9a6
+ ld [hli], a
+ ld [hli], a
+ inc hl
+ inc hl
+ dec c
+ jr nz, .asm_9a6
+ ret
+
+; this function affects the stack so that it returns
+; to the pointer following the rst call
+; similar to rst 28, except this always loads bank 1
+RST18: ; 09ae (0:09ae)
+ push hl
+ push hl
+ push hl
+ push hl
+ push de
+ push af
+ ld hl, [sp+$d]
+ ld d, [hl]
+ dec hl
+ ld e, [hl]
+ dec hl
+ ld [hl], $0
+ dec hl
+ ld a, [hBankROM]
+ ld [hld], a
+ ld [hl], $9
+ dec hl
+ ld [hl], $dc
+ dec hl
+ inc de
+ ld a, [de]
+ ld [hld], a
+ dec de
+ ld a, [de]
+ ld [hl], a
+ ld a, $1
+ ; fallthrough
+Func_09ce: ; 09ce (0:09ce)
+ call BankswitchHome
+ ld hl, [sp+$d]
+ inc de
+ inc de
+ ld [hl], d
+ dec hl
+ ld [hl], e
+ pop af
+ pop de
+ pop hl
+ ret
+; 0x9dc
+
+INCBIN "baserom.gbc",$09dc,$09e9 - $09dc
+
+; this function affects the stack so that it returns
+; to the three byte pointer following the rst call
+RST28: ; 09e9 (0:09e9)
+ push hl
+ push hl
+ push hl
+ push hl
+ push de
+ push af
+ ld hl, [sp+$d]
+ ld d, [hl]
+ dec hl
+ ld e, [hl]
+ dec hl
+ ld [hl], $0
+ dec hl
+ ld a, [hBankROM]
+ ld [hld], a
+ ld [hl], $9
+ dec hl
+ ld [hl], $dc
+ dec hl
+ inc de
+ inc de
+ ld a, [de]
+ ld [hld], a
+ dec de
+ ld a, [de]
+ ld [hl], a
+ dec de
+ ld a, [de]
+ inc de
+ jr Func_09ce
+
+; setup SNES memory $810-$867 and palette
+InitSGB: ; 0a0d (0:0a0d)
+ ld hl, SGB_0ad0
+ call SendSGB
+ ld hl, SGB_0a50
+ call SendSGB
+ ld hl, SGB_0a60
+ call SendSGB
+ ld hl, SGB_0a70
+ call SendSGB
+ ld hl, SGB_0a80
+ call SendSGB
+ ld hl, SGB_0a90
+ call SendSGB
+ ld hl, SGB_0aa0
+ call SendSGB
+ ld hl, SGB_0ab0
+ call SendSGB
+ ld hl, SGB_0ac0
+ call SendSGB
+ ld hl, SGB_0af0
+ call SendSGB
+ ld hl, SGB_0ae0
+ call SendSGB
+ ret
+
+SGB_0a50: ; 0a50 (0:0a50)
+INCBIN "baserom.gbc",$0a50,$0a60 - $0a50
+
+SGB_0a60: ; 0a60 (0:0a60)
+INCBIN "baserom.gbc",$0a60,$0a70 - $0a60
+
+SGB_0a70: ; 0a70 (0:0a70)
+INCBIN "baserom.gbc",$0a70,$0a80 - $0a70
+
+SGB_0a80: ; 0a80 (0:0a80)
+INCBIN "baserom.gbc",$0a80,$0a90 - $0a80
+
+SGB_0a90: ; 0a90 (0:0a90)
+INCBIN "baserom.gbc",$0a90,$0aa0 - $0a90
+
+SGB_0aa0: ; 0aa0 (0:0aa0)
+INCBIN "baserom.gbc",$0aa0,$0ab0 - $0aa0
+
+SGB_0ab0: ; 0ab0 (0:0ab0)
+INCBIN "baserom.gbc",$0ab0,$0ac0 - $0ab0
+
+SGB_0ac0: ; 0ac0 (0:0ac0)
+INCBIN "baserom.gbc",$0ac0,$0ad0 - $0ac0
+
+SGB_0ad0: ; 0ad0 (0:0ad0)
+INCBIN "baserom.gbc",$0ad0,$0ae0 - $0ad0
+
+SGB_0ae0: ; 0ae0 (0:0ae0)
+INCBIN "baserom.gbc",$0ae0,$0af0 - $0ae0
+
+SGB_0af0: ; 0af0 (0:0af0)
+INCBIN "baserom.gbc",$0af0,$0b20 - $0af0
+
+; send SGB command
+SendSGB: ; 0b20 (0:0b20)
+ ld a, [hl]
+ and $7
+ ret z
+ ld b, a
+ ld c, $0
+.asm_b27
+ push bc
+ ld a, $0
+ ld [$ff00+c], a
+ ld a, $30
+ ld [$ff00+c], a
+ ld b, $10
+.asm_b30
+ ld e, $8
+ ld a, [hli]
+ ld d, a
+.asm_b34
+ bit 0, d
+ ld a, $10
+ jr nz, .asm_b3c
+ ld a, $20
+.asm_b3c
+ ld [$ff00+c], a
+ ld a, $30
+ ld [$ff00+c], a
+ rr d
+ dec e
+ jr nz, .asm_b34
+ dec b
+ jr nz, .asm_b30
+ ld a, $20
+ ld [$ff00+c], a
+ ld a, $30
+ ld [$ff00+c], a
+ pop bc
+ dec b
+ jr nz, .asm_b27
+ ld bc, 4
+ call Wait
+ ret
+
+DetectSGB: ; 0b59 (0:0b59)
+ ld bc, 60
+ call Wait
+ ld hl, SGB_MASK_EN_ON_0bbb
+ call SendSGB
+ ld a, [rJOYP]
+ and $3
+ cp $3
+ jr nz, .asm_ba3
+ ld a, $20
+ ld [rJOYP], a
+ ld a, [rJOYP]
+ ld a, [rJOYP]
+ ld a, $30
+ ld [rJOYP], a
+ ld a, $10
+ ld [rJOYP], a
+ ld a, [rJOYP]
+ ld a, [rJOYP]
+ ld a, [rJOYP]
+ ld a, [rJOYP]
+ ld a, [rJOYP]
+ ld a, [rJOYP]
+ ld a, $30
+ ld [rJOYP], a
+ ld a, [rJOYP]
+ ld a, [rJOYP]
+ ld a, [rJOYP]
+ ld a, [rJOYP]
+ and $3
+ cp $3
+ jr nz, .asm_ba3
+ ld hl, SGB_MASK_EN_OFF_0bab
+ call SendSGB
+ or a
+ ret
+.asm_ba3
+ ld hl, SGB_MASK_EN_OFF_0bab
+ call SendSGB
+ scf
+ ret
+
+SGB_MASK_EN_OFF_0bab: ; 0bab (0:0bab)
+INCBIN "baserom.gbc",$0bab,$0bbb - $0bab
+
+SGB_MASK_EN_ON_0bbb: ; 0bbb (0:0bbb)
+INCBIN "baserom.gbc",$0bbb,$0c08 - $0bbb
+
+; loops 63000 * bc cycles (~15 * bc ms)
+Wait: ; 0c08 (0:0c08)
+ ld de, 1750
+.loop
+ nop
+ nop
+ nop
+ dec de
+ ld a, d
+ or e
+ jr nz, .loop
+ dec bc
+ ld a, b
+ or c
+ jr nz, Wait
+ ret
+
+; memcpy(DE, HL, B), but only during hblank
+MemcpyHLDE_hblank: ; 0c19 (0:0c19)
+ push bc
+.loop
+ ei
+ di
+ ld a, [rSTAT] ;
+ and $3 ;
+ jr nz, .loop ; assert hblank
+ ld a, [hl]
+ ld [de], a
+ ld a, [rSTAT] ;
+ and $3 ;
+ jr nz, .loop ; assert still in hblank
+ ei
+ inc hl
+ inc de
+ dec b
+ jr nz, .loop
+ pop bc
+ ret
+
+; memcpy(HL, DE, B), but only during hblank
+MemcpyDEHL_hblank: ; 0c32 (0:0c32)
+ push bc
+.asm_c33
+ ei
+ di
+ ld a, [rSTAT]
+ and $3
+ jr nz, .asm_c33
+ ld a, [de]
+ ld [hl], a
+ ld a, [rSTAT]
+ and $3
+ jr nz, .asm_c33
+ ei
+ inc hl
+ inc de
+ dec c
+ jr nz, .asm_c33
+ pop bc
+ ret
+; 0xc4b
+
+INCBIN "baserom.gbc",$0c4b,$0c91 - $0c4b
+
+; called at roughly 240Hz by TimerHandler
+SerialTimerHandler: ; 0c91 (0:0c91)
+ ld a, [wSerialOp]
+ cp $29
+ jr z, .begin_transfer
+ cp $12
+ jr z, .check_for_timeout
+ ret
+.begin_transfer
+ ld a, [rSC] ;
+ add a ; make sure that no serial transfer is active
+ ret c ;
+ ld a, $1
+ ld [rSC], a ; use internal clock
+ ld a, $81
+ ld [rSC], a ; use internal clock, set transfer start flag
+ ret
+.check_for_timeout
+ ; sets bit7 of [wSerialFlags] if the serial interrupt hasn't triggered
+ ; within four timer interrupts (60Hz)
+ ld a, [wSerialCounter]
+ ld hl, wSerialCounter2
+ cp [hl]
+ ld [hl], a
+ ld hl, wSerialTimeoutCounter
+ jr nz, .clear_counter
+ inc [hl]
+ ld a, [hl]
+ cp $4
+ ret c
+ ld hl, wSerialFlags
+ set 7, [hl]
+ ret
+.clear_counter
+ ld [hl], $0
+ ret
+; 0xcc5
+
+INCBIN "baserom.gbc",$0cc5,$0d26 - $0cc5
+
+SerialHandler: ; 0d26 (0:0d26)
+ push af
+ push hl
+ push de
+ push bc
+ ld a, [$ce63] ;
+ or a ;
+ jr z, .asm_d35 ; if [$ce63] nonzero:
+ call Func_3189 ; ?
+ jr .done ; return
+.asm_d35
+ ld a, [wSerialOp] ;
+ or a ;
+ jr z, .asm_d55 ; skip ahead if [$cb74] zero
+ ; send/receive a byte
+ ld a, [rSB]
+ call SerialHandleRecv
+ call SerialHandleSend ; returns byte to actually send
+ push af
+.wait_for_completion
+ ld a, [rSC]
+ add a
+ jr c, .wait_for_completion
+ pop af
+ ; end send/receive
+ ld [rSB], a ; prepare sending byte (from Func_0dc8?)
+ ld a, [wSerialOp]
+ cp $29
+ jr z, .done ; if [$cb74] != $29, use external clock
+ jr .asm_d6a ; and prepare for next byte. either way, return
+.asm_d55
+ ld a, $1
+ ld [wSerialRecvCounter], a
+ ld a, [rSB]
+ ld [wSerialRecvBuf], a
+ ld a, $ac
+ ld [rSB], a
+ ld a, [wSerialRecvBuf]
+ cp $12 ; if [$cba5] != $12, use external clock
+ jr z, .done ; and prepare for next byte. either way, return
+.asm_d6a
+ ld a, $80 ;
+ ld [rSC], a ; transfer start, use external clock
+.done
+ ld hl, wSerialCounter
+ inc [hl]
+ pop bc
+ pop de
+ pop hl
+ pop af
+ reti
+
+; handles a byte read from serial transfer by decoding it and storing it into
+; the receive buffer
+SerialHandleRecv: ; 0d77 (0:0d77)
+ ld hl, wSerialLastReadCA
+ ld e, [hl]
+ dec e
+ jr z, .last_was_ca
+ cp $ac
+ ret z ; return if read_data == $ac
+ cp $ca
+ jr z, .read_ca
+ or a
+ jr z, .read_00_or_ff
+ cp $ff
+ jr nz, .read_data
+.read_00_or_ff
+ ld hl, wSerialFlags
+ set 6, [hl]
+ ret
+.read_ca
+ inc [hl] ; inc [wSerialLastReadCA]
+ ret
+.last_was_ca
+ ; if last byte read was $ca, flip all bits of data received
+ ld [hl], $0
+ cpl
+ jr .handle_byte
+.read_data
+ ; flip top2 bits of data received
+ xor $c0
+.handle_byte
+ push af
+ ld a, [wSerialRecvIndex]
+ ld e, a
+ ld a, [$cba3]
+ dec a
+ and $1f
+ cp e
+ jr z, .set_flag_and_return
+ ld d, $0
+ ; store into receive buffer
+ ld hl, wSerialRecvBuf
+ add hl, de
+ pop af
+ ld [hl], a
+ ; increment buffer index (mod 32)
+ ld a, e
+ inc a
+ and $1f
+ ld [$cba4], a
+ ; increment received bytes counter & clear flags
+ ld hl, wSerialRecvCounter
+ inc [hl]
+ xor a
+ ld [wSerialFlags], a
+ ret
+.set_flag_and_return
+ pop af
+ ld hl, wSerialFlags
+ set 0, [hl]
+ ret
+
+; prepares a byte to send over serial transfer, either from the send-save byte
+; slot or the send buffer
+SerialHandleSend: ; 0dc8 (0:0dc8)
+ ld hl, wSerialSendSave
+ ld a, [hl]
+ or a
+ jr nz, .send_saved
+ ld hl, wSerialSendBufToggle
+ ld a, [hl]
+ or a
+ jr nz, .send_buf
+ ; no more data--send $ac to indicate this
+ ld a, $ac
+ ret
+.send_saved
+ ld a, [hl]
+ ld [hl], $0
+ ret
+.send_buf
+ ; grab byte to send from send buffer, increment buffer index
+ ; and decrement to-send length
+ dec [hl]
+ ld a, [wSerialSendBufIndex]
+ ld e, a
+ ld d, $0
+ ld hl, wSerialSendBuf
+ add hl, de
+ inc a
+ and $1f
+ ld [wSerialSendBufIndex], a
+ ld a, [hl]
+ ; flip top2 bits of sent data
+ xor $c0
+ cp $ac
+ jr z, .send_escaped
+ cp $ca
+ jr z, .send_escaped
+ cp $ff
+ jr z, .send_escaped
+ or a
+ jr z, .send_escaped
+ ret
+.send_escaped
+ ; escape tricky data by prefixing it with $ca and flipping all bits
+ ; instead of just top2
+ xor $c0
+ cpl
+ ld [wSerialSendSave], a
+ ld a, $ca
+ ret
+
+; store data in sendbuf for sending?
+Func_0e0a: ; 0e0a (0:0e0a)
+ push hl
+ push de
+ push bc
+ push af
+.asm_e0e
+ ld a, [$cb80]
+ ld e, a
+ ld a, [wSerialSendBufIndex]
+ dec a
+ and $1f
+ cp e
+ jr z, .asm_e0e
+ ld d, $0
+ ld a, e
+ inc a
+ and $1f
+ ld [$cb80], a
+ ld hl, wSerialSendBuf
+ add hl, de
+ pop af
+ ld [hl], a
+ ld hl, wSerialSendBufToggle
+ inc [hl]
+ pop bc
+ pop de
+ pop hl
+ ret
+
+; sets carry if [wSerialRecvCounter] nonzero
+Func_0e32: ; 0e32 (0:0e32)
+ ld a, [wSerialRecvCounter]
+ or a
+ ret z
+ scf
+ ret
+
+Func_0e39: ; 0e39 (0:0e39)
+ push hl
+ ld hl, wSerialRecvCounter
+ ld a, [hl]
+ or a
+ jr nz, .asm_e49
+ pop hl
+ ld a, [wSerialFlags]
+ or a
+ ret nz
+ scf
+ ret
+.asm_e49
+ push de
+ dec [hl]
+ ld a, [$cba3]
+ ld e, a
+ ld d, $0
+ ld hl, wSerialRecvBuf
+ add hl, de
+ ld a, [hl]
+ push af
+ ld a, e
+ inc a
+ and $1f
+ ld [$cba3], a
+ pop af
+ pop de
+ pop hl
+ or a
+ ret
+
+Func_0e63: ; 0e63 (0:0e63)
+ ld b, c
+.asm_e64
+ ld a, b
+ sub c
+ jr c, .asm_e6c
+ cp $1f
+ jr nc, .asm_e75
+.asm_e6c
+ inc c
+ dec c
+ jr z, .asm_e75
+ ld a, [hli]
+ call $0e0a
+ dec c
+.asm_e75
+ inc b
+ dec b
+ jr z, .asm_e81
+ call $0e39
+ jr c, .asm_e81
+ ld [de], a
+ inc de
+ dec b
+.asm_e81
+ ld a, [wSerialFlags]
+ or a
+ jr nz, .asm_e8c
+ ld a, c
+ or b
+ jr nz, .asm_e64
+ ret
+.asm_e8c
+ scf
+ ret
+
+; go into slave mode (external clock) for serial transfer?
+Func_0e8e: ; 0e8e (0:0e8e)
+ call ClearSerialData
+ ld a, $12
+ ld [rSB], a ; send $12
+ ld a, $80
+ ld [rSC], a ; use external clock, set transfer start flag
+ ld a, [rIF]
+ and $f7
+ ld [rIF], a ; clear serial interrupt flag
+ ld a, [rIE]
+ or $8 ; enable serial interrupt
+ ld [rIE], a
+ ret
+
+ResetSerial: ; 0ea6 (0:0ea6)
+ ld a, [rIE]
+ and $f7
+ ld [rIE], a
+ xor a
+ ld [rSB], a
+ ld [rSC], a
+ ; fallthrough
+ClearSerialData: ; 0eb1 (0:0eb1)
+ ld hl, wSerialOp
+ ld bc, $0051
+.loop
+ xor a
+ ld [hli], a
+ dec bc
+ ld a, c
+ or b
+ jr nz, .loop
+ ret
+; 0xebf
+
+INCBIN "baserom.gbc",$0ebf,$1072 - $0ebf
+
+; copies the deck pointed to by de to $c400 or $c480
+CopyDeckData: ; 1072 (0:1072)
+ ld hl, $c400
+ ld a, [$ff97]
+ cp $c2
+ jr z, .asm_107e
+ ld hl, $c480
+.asm_107e
+ ; start by putting a terminator at the end of the deck
+ push hl
+ ld bc, 59
+ add hl, bc
+ ld [hl], $0
+ pop hl
+ push hl
+.nextCard
+ ld a, [de]
+ inc de
+ ld b, a
+ or a
+ jr z, .done
+ ld a, [de]
+ inc de
+ ld c, a
+.cardQuantityLoop
+ ld [hl], c
+ inc hl
+ dec b
+ jr nz, .cardQuantityLoop
+ jr .nextCard
+.done
+ ld hl, $cce9
+ ld a, [de]
+ inc de
+ ld [hli], a
+ ld a, [de]
+ ld [hl], a
+ pop hl
+ ld bc, 59
+ add hl, bc
+ ld a, [hl]
+ or a
+ ret nz
+ rst $38
+ scf
+ ret
+; 0x10aa
+
+INCBIN "baserom.gbc",$10aa,$160b - $10aa
+
+Func_160b: ; 160b (0:160b)
+ ld l, a
+ ld a, [$ff97]
+ ld h, a
+ ld a, [hl]
+ ret
+
+Func_1611: ; 1611 (0:1611)
+ ld l, a
+ ld a, [$ff97]
+ ld h, $c3
+ cp $c2
+ jr z, .asm_161c
+ ld h, $c2
+
+.asm_161c
+ ld a, [hl]
+ ret
+; 0x161e
+
+INCBIN "baserom.gbc",$161e,$1c72 - $161e
+
+Func_1c72: ; 1c72 (0:1c72)
+ push af
+ push hl
+ call Func_1611
+ ld a, h
+ ld [$ff97], a
+ pop hl
+ pop af
+ ret
+
+Func_1c7d: ; 1c7d (0:1c7d)
+ call EnableExtRAM
+ ld hl, $a010
+asm_1c83
+ ld a, [hli]
+ ld [de], a
+ inc de
+ or a
+ jr nz, asm_1c83
+ dec de
+ call DisableExtRAM
+ ret
+
+Func_1c8e: ; 1c8e (0:1c8e)
+ ld hl, $cc16
+ ld a, [hli]
+ or [hl]
+ jr z, .asm_1c9b
+ ld a, [hld]
+ ld l, [hl]
+ ld h, a
+ jp Func_2e89
+.asm_1c9b
+ ld hl, $c500
+ ld a, [hl]
+ or a
+ jr z, .asm_1ca4
+ jr asm_1c83
+.asm_1ca4
+ ld hl, $0092
+ jp Func_2e89
+; 0x1caa
+
+INCBIN "baserom.gbc",$1caa,$1dca - $1caa
+
+; memcpy(HL, DE, C)
+Memcpy: ; 1dca (0:1dca)
+ ld a, [$cabb] ;
+ bit 7, a ;
+ jr nz, .asm_1dd8 ; assert that LCD is on
+.asm_1dd1
+ ld a, [de]
+ inc de
+ ld [hli], a
+ dec c
+ jr nz, .asm_1dd1
+ ret
+.asm_1dd8
+ jp MemcpyDEHL_hblank
+
+Func_1ddb: ; 1ddb (0:1ddb)
+ ld l, e
+ ld h, $0
+ add hl, hl
+ add hl, hl
+ add hl, hl
+ add hl, hl
+ add hl, hl
+ ld a, l
+ add d
+ ld l, a
+ ld a, h
+ adc $98
+ ld h, a
+ ret
+
+Func_1deb: ; 1deb (0:1deb)
+ push af
+ ld a, [$ff92]
+ rra
+ rra
+ rra
+ and $1f
+ add d
+ ld d, a
+ ld a, [$ff93]
+ rra
+ rra
+ rra
+ and $1f
+ add e
+ ld e, a
+ pop af
+ ret
+; 0x1e00
+
+INCBIN "baserom.gbc",$1e00,$1e7c - $1e00
+
+Func_1e7c: ; 1e7c (0:1e7c)
+ ld a, [wConsole]
+ cp CONSOLE_CGB
+ jr z, asm_1ec9
+ cp CONSOLE_SGB
+ jp z, Func_1f0f
+Func_1e88: ; 1e88 (0:1e88)
+ call Func_1ddb
+ ld a, $1c
+ ld de, $1819
+ call Func_1ea5
+ dec c
+ dec c
+.asm_1e95
+ ld a, $0
+ ld de, $1e1f
+ call Func_1ea5
+ dec c
+ jr nz, .asm_1e95
+ ld a, $1d
+ ld de, $1a1b
+Func_1ea5: ; 1ea5 (0:1ea5)
+ add sp, $e0
+ push hl
+ push bc
+ ld hl, [sp+$4]
+ dec b
+ dec b
+ push hl
+ ld [hl], d
+ inc hl
+.asm_1eb0
+ ld [hli], a
+ dec b
+ jr nz, .asm_1eb0
+ ld [hl], e
+ pop de
+ pop bc
+ pop hl
+ push hl
+ push bc
+ ld c, b
+ ld b, $0
+ call Memcpy
+ pop bc
+ pop de
+ ld hl, $0020
+ add hl, de
+ add sp, $20
+ ret
+asm_1ec9
+ call Func_1ddb
+ ld a, $1c
+ ld de, $1819
+ call Func_1efb
+ dec c
+ dec c
+.asm_1ed6
+ ld a, $0
+ ld de, $1e1f
+ push hl
+ call Func_1ea5
+ pop hl
+ call BankswitchVRAM_1
+ ld a, [$ccf3]
+ ld e, a
+ ld d, a
+ xor a
+ call Func_1ea5
+ call BankswitchVRAM_0
+ dec c
+ jr nz, .asm_1ed6
+ ld a, $1d
+ ld de, $1a1b
+ call Func_1efb
+ ret
+
+Func_1efb: ; 1efb (0:1efb)
+ push hl
+ call Func_1ea5
+ pop hl
+ call BankswitchVRAM_1
+ ld a, [$ccf3]
+ ld e, a
+ ld d, a
+ call Func_1ea5
+ call BankswitchVRAM_0
+ ret
+
+Func_1f0f: ; 1f0f (0:1f0f)
+ push bc
+ push de
+ call Func_1e88
+ pop de
+ pop bc
+ ld a, [$ccf3]
+ or a
+ ret z
+ push bc
+ push de
+ ld hl, $cae0
+ ld de, Unknown_1f4f
+ ld c, $10
+.asm_1f25
+ ld a, [de]
+ inc de
+ ld [hli], a
+ dec c
+ jr nz, .asm_1f25
+ pop de
+ pop bc
+ ld hl, $cae4
+ ld [hl], d
+ inc hl
+ ld [hl], e
+ inc hl
+ ld a, d
+ add b
+ dec a
+ ld [hli], a
+ ld a, e
+ add c
+ dec a
+ ld [hli], a
+ ld a, [$ccf3]
+ and $80
+ jr z, .asm_1f48
+ ld a, $2
+ ld [$cae2], a
+.asm_1f48
+ ld hl, $cae0
+ call SendSGB
+ ret
+
+Unknown_1f4f: ; 1f4f (0:1f4f)
+INCBIN "baserom.gbc",$1f4f,$1f5f - $1f4f
+
+Func_1f5f: ; 1f5f (0:1f5f)
+ push de
+ push af
+ push hl
+ add sp, $e0
+ call Func_1ddb
+.asm_1f67
+ push hl
+ push bc
+ ld hl, [sp+$25]
+ ld d, [hl]
+ ld hl, [sp+$27]
+ ld a, [hl]
+ ld hl, [sp+$4]
+ push hl
+.asm_1f72
+ ld [hli], a
+ add d
+ dec b
+ jr nz, .asm_1f72
+ pop de
+ pop bc
+ pop hl
+ push hl
+ push bc
+ ld c, b
+ ld b, $0
+ call Memcpy
+ ld hl, [sp+$24]
+ ld a, [hl]
+ ld hl, [sp+$27]
+ add [hl]
+ ld [hl], a
+ pop bc
+ pop de
+ ld hl, $0020
+ add hl, de
+ dec c
+ jr nz, .asm_1f67
+ add sp, $24
+ pop de
+ ret
+; 0x1f96
+
+INCBIN "baserom.gbc",$1f96,$20b0 - $1f96
+
+Func_20b0: ; 20b0 (0:20b0)
+ ld hl, $2fe8
+ ld a, [wConsole]
+ cp CONSOLE_CGB
+ jr nz, .asm_20bd
+ ld hl, $37f8
+.asm_20bd
+ ld de, $8d00
+ ld b, $30
+ jr asm_2121
+
+Func_20c4: ; 20c4 (0:20c4)
+ ld hl, $3028
+ ld a, [wConsole]
+ cp CONSOLE_CGB
+ jr nz, .asm_20d1
+ ld hl, $3838
+.asm_20d1
+ ld de, $8d40
+ ld b, $c
+ jr asm_2121
+
+Func_20d8: ; 20d8 (0:20d8)
+ ld b, $10
+ jr asm_20de
+
+Func_20dc: ; 20dc (0:20dc)
+ ld b, $24
+asm_20de
+ ld hl, $32e8
+ ld a, [wConsole]
+ cp CONSOLE_CGB
+ jr nz, .asm_20eb
+ ld hl, $3af8
+.asm_20eb
+ ld de, $8d00
+ jr asm_2121
+
+Func_20f0: ; 20f0 (0:20f0)
+ ld hl, $4008
+ ld de, $8a00
+ ld b, $d
+ call asm_2121
+ ld hl, $3528
+ ld a, [wConsole]
+ cp CONSOLE_CGB
+ jr nz, .asm_2108
+ ld hl, $3d38
+.asm_2108
+ ld de, $8d00
+ ld b, $30
+ jr asm_2121
+
+Func_210f: ; 210f (0:210f)
+ ld hl, $40d8
+ ld de, $9300
+ ld b, $8
+ jr asm_2121
+
+Func_2119: ; 2119 (0:2119)
+ ld hl, DuelGraphics - Fonts
+ ld de, $9000 ; destination
+ ld b, $38 ; number of tiles
+asm_2121
+ ld a, BANK(Fonts)
+ call BankpushHome
+ ld c, $10
+ call CopyGfxData
+ call BankpopHome
+ ret
+; 0x212f
+
+INCBIN "baserom.gbc",$212f,$21c5 - $212f
+
+Func_21c5: ; 21c5 (0:21c5)
+ push de
+ push bc
+ call Func_2298
+ jr .asm_21e8
+.asm_21cc
+ cp $5
+ jr c, .asm_21d9
+ cp $10
+ jr nc, .asm_21d9
+ call Func_21f2
+ jr .asm_21e8
+.asm_21d9
+ ld e, a
+ ld d, [hl]
+ call Func_2546
+ jr nc, .asm_21e1
+ inc hl
+.asm_21e1
+ call Func_22ca
+ xor a
+ call Func_21f2
+.asm_21e8
+ ld a, [hli]
+ or a
+ jr nz, .asm_21cc
+ call Func_230f
+ pop bc
+ pop de
+ ret
+
+Func_21f2: ; 21f2 (0:21f2)
+ or a
+ jr z, .asm_2241
+ cp $e
+ jr z, .asm_2221
+ cp $f
+ jr z, .asm_2221
+ cp $a
+ jr z, .asm_224d
+ cp $5
+ jr z, .asm_2225
+ cp $6
+ jr z, .asm_220f
+ cp $7
+ jr z, .asm_2215
+ scf
+ ret
+.asm_220f
+ ld a, $1
+ ld [$cd0a], a
+ ret
+.asm_2215
+ call Func_230f
+ xor a
+ ld [$cd0a], a
+ ld a, $f
+ ld [$ffaf], a
+ ret
+.asm_2221
+ ld [$ffaf], a
+ xor a
+ ret
+.asm_2225
+ ld a, [$cd0a]
+ push af
+ ld a, $1
+ ld [$cd0a], a
+ call Func_230f
+ pop af
+ ld [$cd0a], a
+ ld a, [$ffb0]
+ or a
+ jr nz, .asm_2240
+ ld a, [hl]
+ push hl
+ call Func_22f2
+ pop hl
+.asm_2240
+ inc hl
+.asm_2241
+ ld a, [$ffae]
+ or a
+ ret z
+ ld b, a
+ ld a, [$ffac]
+ cp b
+ jr z, .asm_224d
+ xor a
+ ret
+.asm_224d
+ call Func_230f
+ ld a, [$cd08]
+ or a
+ call z, .asm_2257
+.asm_2257
+ xor a
+ ld [$ffac], a
+ ld a, [$ffad]
+ add $20
+ ld b, a
+ ld a, [$ffaa]
+ and $e0
+ add b
+ ld [$ffaa], a
+ ld a, [$ffab]
+ adc $0
+ ld [$ffab], a
+ ld a, [$cd09]
+ inc a
+ ld [$cd09], a
+ xor a
+ ret
+
+Func_2275: ; 2275 (0:2275)
+ ld a, d
+ dec a
+ ld [$cd04], a
+ ld a, e
+ ld [$ffa8], a
+ call Func_2298
+ xor a
+ ld [$ffb0], a
+ ld [$ffa9], a
+ ld a, $88
+ ld [$cd06], a
+ ld a, $80
+ ld [$cd07], a
+ ld hl, $c600
+.asm_2292
+ xor a
+ ld [hl], a
+ inc l
+ jr nz, .asm_2292
+ ret
+
+Func_2298: ; 2298 (0:2298)
+ xor a
+ ld [$cd0a], a
+ ld [$ffac], a
+ ld [$cd0b], a
+ ld a, $f
+ ld [$ffaf], a
+ ret
+
+Func_22a6: ; 22a6 (0:22a6)
+ push af
+ call Func_22ae
+ pop af
+ ld [$ffae], a
+ ret
+
+Func_22ae: ; 22ae (0:22ae)
+ push hl
+ ld a, d
+ ld [$ffad], a
+ xor a
+ ld [$ffae], a
+ ld [$cd09], a
+ call Func_1ddb
+ ld a, l
+ ld [$ffaa], a
+ ld a, h
+ ld [$ffab], a
+ call Func_2298
+ xor a
+ ld [$cd0b], a
+ pop hl
+ ret
+
+Func_22ca: ; 22ca (0:22ca)
+ push hl
+ push de
+ push bc
+ ld a, [$ffb0]
+ and $1
+ jr nz, .asm_22ed
+ call Func_2325
+ jr c, .asm_22de
+ or a
+ jr nz, .asm_22e9
+ call Func_24ac
+.asm_22de
+ ld a, [$ffb0]
+ and $2
+ jr nz, .asm_22e9
+ ld a, [$ffa9]
+ call Func_22f2
+.asm_22e9
+ pop bc
+ pop de
+ pop hl
+ ret
+.asm_22ed
+ call Func_235e
+ jr .asm_22e9
+
+Func_22f2: ; 22f2 (0:22f2)
+ ld [$cd05], a
+ ld hl, $ffaa
+ ld e, [hl]
+ inc hl
+ ld d, [hl]
+ inc de
+ ld [hl], d
+ dec hl
+ ld [hl], e
+ dec de
+ ld l, e
+ ld h, d
+ ld de, $cd05
+ ld c, $1
+ call Memcpy
+ ld hl, $ffac
+ inc [hl]
+ ret
+
+Func_230f: ; 230f (0:230f)
+ ld a, [$cd0a]
+ or a
+ ret z
+ ld a, [$cd0b]
+ or a
+ ret z
+ push hl
+ push de
+ push bc
+ ld e, $20
+ call Func_22ca
+ pop bc
+ pop de
+ pop hl
+ ret
+
+Func_2325: ; 2325 (0:2325)
+ call Func_235e
+ ret c
+ or a
+ ret nz
+ ld a, [$ffa8]
+ ld hl, $cd04
+ cp [hl]
+ jr nz, .asm_2345
+ ld a, [$ffa9]
+ ld h, $c8
+.asm_2337
+ ld l, a
+ ld a, [hl]
+ or a
+ jr nz, .asm_2337
+ ld h, $c9
+ ld c, [hl]
+ ld b, $c8
+ xor a
+ ld [bc], a
+ jr .asm_234a
+.asm_2345
+ inc [hl]
+ jr nz, .asm_2349
+ inc [hl]
+.asm_2349
+ ld l, [hl]
+.asm_234a
+ ld a, [$ffa9]
+ ld c, a
+ ld b, $c9
+ ld a, l
+ ld [$ffa9], a
+ ld [bc], a
+ ld h, $c8
+ ld [hl], c
+ ld h, $c6
+ ld [hl], e
+ inc h
+ ld [hl], d
+ ld b, l
+ xor a
+ ret
+
+; search linked-list for letters e/d (regisers), if found hoist the result to
+; head of list and return it. carry flag denotes success.
+Func_235e: ; 235e (0:235e)
+ ld a, [$cd0a] ;
+ or a ;
+ jr z, .asm_2376 ; if [$cd0a] nonzero:
+ call Uppercase ; uppercase e
+ ld a, [$cd0b]
+ ld d, a
+ or a
+ jr nz, .asm_2376 ; if [$cd0b] is zero:
+ ld a, e ;
+ ld [$cd0b], a ; [$cd0b] ← e
+ ld a, $1 ;
+ or a ; return a = 1
+ ret
+.asm_2376
+ xor a
+ ld [$cd0b], a ; [$cd0b] ← 0
+ ld a, [$ffa9]
+ ld l, a ; l ← [$ffa9]; index to to linked-list head
+.asm_237d
+ ld h, $c6 ;
+ ld a, [hl] ; a ← key1[l] ;
+ or a ;
+ ret z ; if NULL, return a = 0 ;
+ cp e ; loop for e/d key in
+ jr nz, .asm_238a ; ; linked list
+ inc h ; ;
+ ld a, [hl] ; if key1[l] == e and ;
+ cp d ; key2[l] == d: ;
+ jr z, .asm_238f ; break ;
+.asm_238a ;
+ ld h, $c8 ; ;
+ ld l, [hl] ; l ← next[l] ;
+ jr .asm_237d
+.asm_238f
+ ld a, [$ffa9]
+ cp l
+ jr z, .asm_23af ; assert at least one iteration
+ ld c, a
+ ld b, $c9
+ ld a, l
+ ld [bc], a ; prev[i0] ← i
+ ld [$ffa9], a ; [$ffa9] ← i (update linked-list head)
+ ld h, $c9
+ ld b, [hl]
+ ld [hl], $0 ; prev[i] ← 0
+ ld h, $c8
+ ld a, c
+ ld c, [hl]
+ ld [hl], a ; next[i] ← i0
+ ld l, b
+ ld [hl], c ; next[prev[i]] ← next[i]
+ ld h, $c9
+ inc c
+ dec c
+ jr z, .asm_23af ; if next[i] != NULL:
+ ld l, c ; l ← next[i]
+ ld [hl], b ; prev[next[i]] ← prev[i]
+.asm_23af
+ scf ; set carry to indicate success
+ ret ; (return new linked-list head in a)
+
+; uppercases e if [wUppercaseFlag] is nonzero
+Uppercase: ; 23b1 (0:23b1)
+ ld a, [wUppercaseFlag]
+ or a
+ ret z
+ ld a, e
+ cp $60
+ ret c
+ cp $7b
+ ret nc
+ sub $20
+ ld e, a
+ ret
+
+Func_23c1: ; 23c1 (0:23c1)
+ ld a, [hl]
+ cp $6
+ jr nz, .asm_23cf
+ call Func_23d3
+ inc b
+ srl b
+ xor a
+ sub b
+ ret
+.asm_23cf
+ xor a
+ ld [$cd0a], a
+Func_23d3: ; 23d3 (0:23d3)
+ push hl
+ push de
+ ld bc, $0000
+.asm_23d8
+ ld a, [hli]
+ or a
+ jr z, .asm_23f8
+ inc c
+ cp $5
+ jr c, .asm_23ec
+ cp $10
+ jr nc, .asm_23ec
+ cp $5
+ jr nz, .asm_23d8
+ inc b
+ jr .asm_23f4
+.asm_23ec
+ ld e, a
+ ld d, [hl]
+ inc b
+ call Func_2546
+ jr nc, .asm_23d8
+.asm_23f4
+ inc c
+ inc hl
+ jr .asm_23d8
+.asm_23f8
+ xor a
+ sub b
+ pop de
+ pop hl
+ ret
+; 0x23fd
+
+INCBIN "baserom.gbc",$23fd,$245d - $23fd
+
+Func_245d: ; 245d (0:245d)
+ push de
+ push bc
+ ld de, $caa0
+ push de
+ ld bc, $d8f0
+ call Func_2499
+ ld bc, $fc18
+ call Func_2499
+ ld bc, $ff9c
+ call Func_2499
+ ld bc, $fff6
+ call Func_2499
+ ld bc, $ffff
+ call Func_2499
+ xor a
+ ld [de], a
+ pop hl
+ ld e, $5
+.asm_2486
+ inc hl
+ ld a, [hl]
+ cp $20
+ jr nz, .asm_2495
+ ld [hl], $0
+ inc hl
+ dec e
+ jr nz, .asm_2486
+ dec hl
+ ld [hl], $20
+.asm_2495
+ dec hl
+ pop bc
+ pop de
+ ret
+
+Func_2499: ; 2499 (0:2499)
+ ld a, $5
+ ld [de], a
+ inc de
+ ld a, $1f
+.asm_249f
+ inc a
+ add hl, bc
+ jr c, .asm_249f
+ ld [de], a
+ inc de
+ ld a, l
+ sub c
+ ld l, a
+ ld a, h
+ sbc b
+ ld h, a
+ ret
+
+Func_24ac: ; 24ac (0:24ac)
+ push hl
+ push de
+ push bc
+ ld a, [$cd0a]
+ or a
+ jr nz, .asm_24bf
+ call Func_2510
+ call Memcpy
+.asm_24bb
+ pop bc
+ pop de
+ pop hl
+ ret
+.asm_24bf
+ call Func_24ca
+ call Func_2518
+ call Memcpy
+ jr .asm_24bb
+
+Func_24ca: ; 24ca (0:24ca)
+ push bc
+ ld a, [hBankROM]
+ push af
+ ld a, BANK(VWF)
+ call BankswitchHome
+ push de
+ ld a, e
+ ld de, $ccf4
+ call Func_24fa
+ pop de
+ ld a, d
+ ld de, $ccf5
+ call Func_24fa
+ ld hl, $ccf4
+ ld b, $8
+.asm_24e8
+ ld a, [hli]
+ swap a
+ or [hl]
+ dec hl
+ ld [hli], a
+ ld [hli], a
+ dec b
+ jr nz, .asm_24e8
+ call BankpopHome
+ pop bc
+ ld de, $ccf4
+ ret
+
+Func_24fa: ; 24fa (0:24fa)
+ sub $20
+ ld l, a
+ ld h, $0
+ add hl, hl
+ add hl, hl
+ add hl, hl
+ ld bc, VWF
+ add hl, bc
+ ld b, $8
+.asm_2508
+ ld a, [hli]
+ ld [de], a
+ inc de
+ inc de
+ dec b
+ jr nz, .asm_2508
+ ret
+
+Func_2510: ; 2510 (0:2510)
+ push bc
+ call Func_256d
+ call Func_252e
+ pop bc
+Func_2518: ; 2518 (0:2518)
+ ld hl, $cd07
+ ld a, b
+ xor [hl]
+ ld h, $0
+ ld l, a
+ add hl, hl
+ add hl, hl
+ add hl, hl
+ add hl, hl
+ ld a, [$cd06]
+ ld b, a
+ ld c, $0
+ add hl, bc
+ ld c, $10
+ ret
+
+Func_252e: ; 252e (0:252e)
+ ld a, $1d
+ call BankpushHome
+ ld de, $ccf4
+ push de
+ ld c, $8
+.asm_2539
+ ld a, [hli]
+ ld [de], a
+ inc de
+ ld [de], a
+ inc de
+ dec c
+ jr nz, .asm_2539
+ pop de
+ call BankpopHome
+ ret
+
+Func_2546: ; 2546 (0:2546)
+ ld a, [$cd0a]
+ or a
+ jr nz, .asm_255f
+ ld a, e
+ cp $10
+ jr c, .asm_2561
+ cp $60
+ jr nc, .asm_2565
+ ld a, [$ffaf]
+ cp $f
+ jr nz, .asm_2565
+ ld d, $f
+ or a
+ ret
+.asm_255f
+ or a
+ ret
+.asm_2561
+ cp $5
+ jr c, .asm_2569
+.asm_2565
+ ld d, $0
+ or a
+ ret
+.asm_2569
+ ld e, d
+ ld d, a
+ scf
+ ret
+
+Func_256d: ; 256d (0:256d)
+ ld bc, $0280
+ ld a, d
+ cp $e
+ jr z, .asm_2580
+ cp $f
+ jr nz, .asm_2582
+ ld bc, $0000
+ ld a, e
+ sub $10
+ ld e, a
+.asm_2580
+ ld d, $0
+.asm_2582
+ ld l, e
+ ld h, d
+ add hl, hl
+ add hl, hl
+ add hl, hl
+ add hl, bc
+ ret
+; 0x2589
+
+INCBIN "baserom.gbc",$2589,$2636 - $2589
+
+Func_2636: ; 2636 (0:2636)
+ ld [$cd10], a
+ ld [$ffb1], a
+ ld de, $cd11
+ ld b, $8
+.asm_2640
+ ld a, [hli]
+ ld [de], a
+ inc de
+ dec b
+ jr nz, .asm_2640
+ xor a
+ ld [$cd0f], a
+ ret
+
+Func_264b: ; 264b (0:264b)
+ xor a
+ ld [$cd99], a
+ ld a, [hButtonsPressed2]
+ or a
+ jr z, .asm_2685
+ ld b, a
+ ld a, [$cd14]
+ ld c, a
+ ld a, [$cd10]
+ bit 6, b
+ jr z, .asm_266b
+ dec a
+ bit 7, a
+ jr z, .asm_2674
+ ld a, [$cd14]
+ dec a
+ jr .asm_2674
+.asm_266b
+ bit 7, b
+ jr z, .asm_2685
+ inc a
+ cp c
+ jr c, .asm_2674
+ xor a
+.asm_2674
+ push af
+ ld a, $1
+ ld [$cd99], a
+ call Func_26e9
+ pop af
+ ld [$cd10], a
+ xor a
+ ld [$cd0f], a
+.asm_2685
+ ld a, [$cd10]
+ ld [$ffb1], a
+ ld hl, $cd17
+ ld a, [hli]
+ or [hl]
+ jr z, .asm_26a9
+ ld a, [hld]
+ ld l, [hl]
+ ld h, a
+ ld a, [$ffb1]
+ call CallF
+ jr nc, asm_26d1
+.asm_269b
+ call Func_270b
+ call Func_26c0
+ ld a, [$cd10]
+ ld e, a
+ ld a, [$ffb1]
+ scf
+ ret
+.asm_26a9
+ ld a, [hButtonsPressed]
+ and $3
+ jr z, asm_26d1
+ and $1
+ jr nz, .asm_269b
+ ld a, [$cd10]
+ ld e, a
+ ld a, $ff
+ ld [$ffb1], a
+ call Func_26c0
+ scf
+ ret
+
+Func_26c0: ; 26c0 (0:26c0)
+ push af
+ ld a, [$ffb1]
+ inc a
+ jr z, .asm_26ca
+ ld a, $2
+ jr .asm_26cc
+.asm_26ca
+ ld a, $3
+.asm_26cc
+ call Func_3796
+ pop af
+ ret
+asm_26d1
+ ld a, [$cd99]
+ or a
+ jr z, Func_26da
+ call Func_3796
+
+Func_26da: ; 26da (0:26da)
+ ld hl, $cd0f
+ ld a, [hl]
+ inc [hl]
+ and $f
+ ret nz
+ ld a, [$cd15]
+ bit 4, [hl]
+ jr z, asm_26ec
+Func_26e9: ; 26e9 (0:26e9)
+ ld a, [$cd16]
+asm_26ec
+ ld c, a
+ ld a, [$cd13]
+ ld l, a
+ ld a, [$cd10]
+ ld h, a
+ call Func_0879
+ ld a, l
+ ld hl, $cd11
+ ld d, [hl]
+ inc hl
+ add [hl]
+ ld e, a
+ call Func_1deb
+ ld a, c
+ ld c, e
+ ld b, d
+ call Func_06c3
+ or a
+ ret
+
+Func_270b: ; 270b (0:270b)
+ ld a, [$cd15]
+ jr asm_26ec
+; 0x2710
+
+INCBIN "baserom.gbc",$2710,$2a1a - $2710
+
+Func_2a1a: ; 2a1a (0:2a1a)
+ xor a
+ ld hl, $cd10
+ ld [hli], a
+ ld [hl], d
+ inc hl
+ ld [hl], e
+ inc hl
+ ld [hl], $0
+ inc hl
+ ld [hl], $1
+ inc hl
+ ld [hl], b
+ inc hl
+ ld [hl], c
+ ld [$cd0f], a
+ ret
+; 0x2a30
+
+INCBIN "baserom.gbc",$2a30,$2a3e - $2a30
+
+Func_2a3e: ; 2a3e (0:2a3e)
+ push hl
+ call Func_2a6f
+ ld a, $b
+ ld de, $010e
+ call Func_1deb
+ call Func_22a6
+ pop hl
+ ld a, l
+ or h
+ jp nz, Func_2e76
+ ld hl, $c590
+ jp Func_21c5
+
+Func_2a59: ; 2a59 (0:2a59)
+ push hl
+ call Func_2a9e
+ ld a, $13
+ ld de, $010e
+ call Func_1deb
+ call Func_22a6
+ call EnableLCD
+ pop hl
+ jp Func_2e41
+
+Func_2a6f: ; 2a6f (0:2a6f)
+ ld de, $000c
+ ld bc, $0c06
+ call Func_1deb
+ call Func_1e7c
+ ret
+; 0x2a7c
+
+INCBIN "baserom.gbc",$2a7c,$2a9e - $2a7c
+
+Func_2a9e: ; 2a9e (0:2a9e)
+ ld de, $000c
+ ld bc, $1406
+ call Func_1deb
+ call Func_1e7c
+ ret
+
+Func_2aab: ; 2aab (0:2aab)
+ call Func_2a59
+ xor a
+ ld hl, Unknown_2ac8
+ call Func_2636
+ call EnableLCD
+.asm_2ab8
+ call Func_053f
+ call Func_26da
+ ld a, [hButtonsPressed]
+ and $3
+ jr z, .asm_2ab8
+ call Func_26e9
+ ret
+
+Unknown_2ac8: ; 2ac8 (0:2ac8)
+INCBIN "baserom.gbc",$2ac8,$2af0 - $2ac8
+
+Func_2af0: ; 2af0 (0:2af0)
+ call Func_2a59
+ ld de, $0710
+ call Func_2b66
+ ld de, $0610
+ jr .asm_2b0a
+ call Func_2a3e
+ ld de, $0310
+ call Func_2b66
+ ld de, $0210
+.asm_2b0a
+ ld a, d
+ ld [$cd98], a
+ ld bc, $0f00
+ call Func_2a1a
+ ld a, [$cd9a]
+ ld [$cd10], a
+ call EnableLCD
+ jr .asm_2b39
+.asm_2b1f
+ call Func_053f
+ call Func_26da
+ ld a, [hButtonsPressed]
+ bit 0, a
+ jr nz, .asm_2b50
+ ld a, [hButtonsPressed2]
+ and $30
+ jr z, .asm_2b1f
+ ld a, $1
+ call Func_3796
+ call Func_26e9
+.asm_2b39
+ ld a, [$cd98]
+ ld c, a
+ ld hl, $cd10
+ ld a, [hl]
+ xor $1
+ ld [hl], a
+ add a
+ add a
+ add c
+ ld [$cd11], a
+ xor a
+ ld [$cd0f], a
+ jr .asm_2b1f
+.asm_2b50
+ ld a, [$cd10]
+ ld [$ffb1], a
+ or a
+ jr nz, .asm_2b5c
+ ld [$cd9a], a
+ ret
+.asm_2b5c
+ xor a
+ ld [$cd9a], a
+ ld a, $1
+ ld [$ffb1], a
+ scf
+ ret
+
+Func_2b66: ; 2b66 (0:2b66)
+ call Func_1deb
+ ld hl, $002f
+ call Func_2c1b
+ ret
+; 0x2b70
+
+INCBIN "baserom.gbc",$2b70,$2b78 - $2b70
+
+Duel_LoadDecks: ; 2b78 (0:2b78)
+ xor a
+ ld [wIsPracticeDuel], a
+ ld a, [wOpponentDeck]
+ cp SAMS_NORMAL_DECK - 2
+ jr z, .normalSamDuel
+ or a ; cp SAMS_PRACTICE_DECK - 2
+ jr nz, .notPracticeDuel
+
+; only practice duels will display help messages, but
+; any duel with Sam will force the PRACTICE_PLAYER_DECK
+;.practiceSamDuel
+ inc a
+ ld [wIsPracticeDuel], a
+
+.normalSamDuel
+ xor a
+ ld [wOpponentDeck], a
+ call Func_1c72
+ ld a, PRACTICE_PLAYER_DECK
+ call LoadDeck
+ call Func_1c72
+ ld hl, $caca
+ ld a, $57
+ ld [hli], a
+ ld [hli], a
+ ld [hl], a
+ xor a
+
+.notPracticeDuel
+ inc a
+ inc a
+ call LoadDeck
+ ld a, [wOpponentDeck]
+ cp NUMBER_OF_DECKS
+ jr c, .validDeck
+ ld a, PRACTICE_PLAYER_DECK - 2
+ ld [wOpponentDeck], a
+
+.validDeck
+ ld a, $f1
+ call Func_160b
+ ld a, [wOpponentDeck]
+ or $80
+ ld [hl], a
+ ret
+; 0x2bbf
+
+INCBIN "baserom.gbc",$2bbf,$2c08 - $2bbf
+
+Func_2c08: ; 2c08 (0:2c08)
+ ld d, [hl]
+ inc hl
+ bit 7, d
+ ret nz
+ ld e, [hl]
+ inc hl
+ call Func_22ae
+ push hl
+ call Func_2c23
+ pop hl
+ inc hl
+ inc hl
+ jr Func_2c08
+
+Func_2c1b: ; 2c1b (0:2c1b)
+ call Func_22ae
+ jr Func_2c29
+
+Func_2c20: ; 2c20 (0:2c20)
+ call Func_22ae
+Func_2c23: ; 2c23 (0:2c23)
+ ld a, [hli]
+ or [hl]
+ ret z
+ ld a, [hld]
+ ld l, [hl]
+ ld h, a
+Func_2c29: ; 2c29 (0:2c29)
+ ld a, [hBankROM]
+ push af
+ call ReadTextOffset
+ call Func_21c5
+ pop af
+ call BankswitchHome
+ ret
+; 0x2c37
+
+INCBIN "baserom.gbc",$2c37,$2cc8 - $2c37
+
+Func_2cc8: ; 2cc8 (0:2cc8)
+ xor a
+ ld [$ce48], a
+ ld [$ce49], a
+ ld [$ce4a], a
+ ld a, $f
+ ;ld [$ffaf], a
+ db $ea, $af, $ff
+Func_2cd7: ; 2cd7 (0:2cd7)
+ push hl
+ call Func_2d06
+ pop bc
+ ;ld a, [$ffaf]
+ db $fa, $af, $ff
+ ld [hli], a
+ ld a, [$cd0a]
+ ld [hli], a
+ ld a, [hBankROM]
+ ld [hli], a
+ ld [hl], c
+ inc hl
+ ld [hl], b
+ ret
+
+Func_2ceb: ; 2ceb (0:2ceb)
+ call Func_2cd7
+ ld hl, $ce48
+ inc [hl]
+ ret
+
+Func_2cf3: ; 2cf3 (0:2cf3)
+ call Func_2d06
+ ld a, [hli]
+ ;ld [$ffaf], a
+ db $ea, $af, $ff
+ ld a, [hli]
+ ld [$cd0a], a
+ ld a, [hli]
+ call BankswitchHome
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ ret
+
+Func_2d06: ; 2d06 (0:2d06)
+ ld a, [$ce48]
+ ld e, a
+ add a
+ add a
+ add e
+ ld e, a
+ ld d, $0
+ ld hl, $ce2b
+ add hl, de
+ ret
+; 0x2d15
+
+INCBIN "baserom.gbc",$2d15,$2d43 - $2d15
+
+Func_2d43: ; 2d43 (0:2d43)
+ call Func_2cf3
+ ld a, [hli]
+ or a
+ jr z, .asm_2d79
+ cp $5
+ jr c, .asm_2d65
+ cp $10
+ jr nc, .asm_2d65
+ call Func_21f2
+ jr nc, .asm_2d74
+ cp $9
+ jr z, .asm_2dc8
+ cp $b
+ jr z, .asm_2d8a
+ cp $c
+ jr z, .asm_2db3
+ jr .asm_2d74
+.asm_2d65
+ ld e, a
+ ld d, [hl]
+ call Func_2546
+ jr nc, .asm_2d6d
+ inc hl
+.asm_2d6d
+ call Func_22ca
+ xor a
+ call Func_21f2
+.asm_2d74
+ call Func_2cd7
+ or a
+ ret
+.asm_2d79
+ ld a, [$ce48]
+ or a
+ jr z, .asm_2d85
+ dec a
+ ld [$ce48], a
+ jr Func_2d43
+.asm_2d85
+ call Func_230f
+ scf
+ ret
+.asm_2d8a
+ call Func_2ceb
+ ld a, $f
+ ;ld [$ffaf], a
+ db $ea, $af, $ff
+ xor a
+ ld [$cd0a], a
+ ld de, $ce3f
+ ld hl, $ce49
+ call Func_2de0
+ ld a, l
+ or h
+ jr z, .asm_2dab
+ call ReadTextOffset
+ call Func_2cd7
+ jr Func_2d43
+.asm_2dab
+ ld hl, $c590
+ call Func_2cd7
+ jr Func_2d43
+.asm_2db3
+ call Func_2ceb
+ ld de, $ce43
+ ld hl, $ce4a
+ call Func_2de0
+ call Func_2e12
+ call Func_2cd7
+ jp Func_2d43
+.asm_2dc8
+ call Func_2ceb
+ call Func_2e2c
+ ld a, [$caa0]
+ cp $6
+ jr z, .asm_2dda
+ ld a, $7
+ call Func_21f2
+.asm_2dda
+ call Func_2cd7
+ jp Func_2d43
+
+Func_2de0: ; 2de0 (0:2de0)
+ push de
+ ld a, [hl]
+ inc [hl]
+ add a
+ ld e, a
+ ld d, $0
+ pop hl
+ add hl, de
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ ret
+
+; uses the two byte text id in hl to read the three byte text offset
+; loads the correct bank for the specific text and returns the pointer in hl
+ReadTextOffset: ; 2ded (0:2ded)
+ push de
+ ld e, l
+ ld d, h
+ add hl, hl
+ add hl, de
+ set 6, h ; hl = (hl * 3) + $4000
+ ld a, BANK(TextOffsets)
+ call BankswitchHome
+ ld e, [hl]
+ inc hl
+ ld d, [hl]
+ inc hl
+ ld a, [hl]
+ ld h, d
+ rl h
+ rla
+ rl h
+ rla
+ add BANK(TextOffsets)
+ call BankswitchHome
+ res 7, d
+ set 6, d ; $4000 ≤ de ≤ $7fff
+ ld l, e
+ ld h, d
+ pop de
+ ret
+
+Func_2e12: ; 2e12 (0:2e12)
+ ld a, [$cd0a]
+ or a
+ jp z, Func_245d
+ ld de, $caa0
+ push de
+ call Func_0663
+ pop hl
+ ld c, $4
+.asm_2e23
+ ld a, [hl]
+ cp $30
+ ret nz
+ inc hl
+ dec c
+ jr nz, .asm_2e23
+ ret
+
+Func_2e2c: ; 2e2c (0:2e2c)
+ ld de, $caa0
+ push de
+ ld a, [$ff97]
+ cp $c3
+ jp z, .asm_2e3c
+ call Func_1c7d
+ pop hl
+ ret
+.asm_2e3c
+ call Func_1c8e
+ pop hl
+ ret
+
+Func_2e41: ; 2e41 (0:2e41)
+ ld a, l
+ or h
+ jr z, .asm_2e53
+ ld a, [hBankROM]
+ push af
+ call ReadTextOffset
+ call .asm_2e56
+ pop af
+ call BankswitchHome
+ ret
+.asm_2e53
+ ld hl, $c590
+.asm_2e56
+ call Func_2cc8
+.asm_2e59
+ ld a, [$ff90]
+ ld b, a
+ ld a, [$ce47]
+ inc a
+ cp $3
+ jr nc, .asm_2e6d
+ bit 1, b
+ jr nz, .asm_2e70
+ jr .asm_2e6d
+.asm_2e6a
+ call Func_053f
+.asm_2e6d
+ dec a
+ jr nz, .asm_2e6a
+.asm_2e70
+ call Func_2d43
+ jr nc, .asm_2e59
+ ret
+
+Func_2e76: ; 2e76 (0:2e76)
+ ld a, [hBankROM]
+ push af
+ call ReadTextOffset
+ call Func_2cc8
+.asm_2e7f
+ call Func_2d43
+ jr nc, .asm_2e7f
+ pop af
+ call BankswitchHome
+ ret
+
+Func_2e89: ; 2e89 (0:2e89)
+ ld a, l
+ or h
+ jr z, .asm_2e9f
+ ld a, [hBankROM]
+ push af
+ call ReadTextOffset
+.asm_2e93
+ ld a, [hli]
+ ld [de], a
+ inc de
+ or a
+ jr nz, .asm_2e93
+ pop af
+ call BankswitchHome
+ dec de
+ ret
+.asm_2e9f
+ ld a, [$ff97]
+ cp $c3
+ jp z, Func_1c8e
+ jp Func_1c7d
+; 0x2ea9
+
+INCBIN "baserom.gbc",$2ea9,$2fa0 - $2ea9
+
+LoadCardGfx: ; 2fa0 (0:2fa0)
+ ld a, [hBankROM]
+ push af
+ push hl
+ srl h
+ srl h
+ srl h
+ ld a, BANK(GrassEnergyCardGfx)
+ add h
+ call BankswitchHome
+ pop hl
+ add hl, hl
+ add hl, hl
+ add hl, hl
+ res 7, h
+ set 6, h
+ call CopyGfxData
+ ld b, $8 ; length of palette
+ ld de, $ce23
+.copyCardPalette
+ ld a, [hli]
+ ld [de], a
+ inc de
+ dec b
+ jr nz, .copyCardPalette
+ pop af
+ call BankswitchHome
+ ret
+; 0x2fcb
+
+INCBIN "baserom.gbc",$2fcb,$302c - $2fcb
+
+; loads the deck id in a from DeckPointers
+; sets carry flag if an invalid deck id is used
+LoadDeck: ; 302c (0:302c)
+ push hl
+ ld l, a
+ ld h, $0
+ ld a, [hBankROM]
+ push af
+ ld a, BANK(DeckPointers)
+ call BankswitchHome
+ add hl, hl
+ ld de, DeckPointers
+ add hl, de
+ ld e, [hl]
+ inc hl
+ ld d, [hl]
+ ld a, d
+ or e
+ jr z, .nullPointer
+ call CopyDeckData
+ pop af
+ call BankswitchHome
+ pop hl
+ or a
+ ret
+.nullPointer
+ pop af
+ call BankswitchHome
+ pop hl
+ scf
+ ret
+; 0x3055
+
+Func_3055: ; 3055 (0:3055)
+ push hl
+ ld hl, $ccb9
+ add [hl]
+ ld [hli], a
+ ld a, $0
+ adc [hl]
+ ld [hl], a
+ pop hl
+ ret
+
+Func_3061: ; 3061 (0:3061)
+ push de
+ push hl
+ ld e, a
+ ld hl, $ccb9
+ ld a, [hl]
+ sub e
+ ld [hli], a
+ ld a, [hl]
+ sbc $0
+ ld [hl], a
+ pop hl
+ pop de
+ ret
+
+Func_3071: ; 3071 (0:3071)
+ push hl
+ ld hl, $ce4e
+ ld [hl], e
+ inc hl
+ ld [hl], d
+ rst $18
+ xor l
+ ld [hl], c
+ pop hl
+ ret
+
+Func_307d: ; 307d (0:307d)
+ push hl
+ ld hl, $ce4e
+ ld [hl], e
+ inc hl
+ ld [hl], d
+ ld a, $1
+ rst $18
+ xor l
+ ld [hl], c
+ ld hl, $cac2
+ ld [hl], $0
+ pop hl
+ ret
+
+Func_3090: ; 3090 (0:3090)
+ ld a, d
+ cp b
+ ret nz
+ ld a, e
+ cp c
+ ret
+
+Func_3096: ; 3096 (0:3096)
+ ld a, [hBankROM]
+ push af
+ ld a, $2
+ call BankswitchHome
+ call $4000
+ pop af
+ call BankswitchHome
+ ret
+
+Func_30a6: ; 30a6 (0:30a6)
+ ld a, [hBankROM]
+ push af
+ ld a, $6
+ call BankswitchHome
+ ld a, $1
+ ld [$ce60], a
+ call $40d5
+ pop bc
+ ld a, b
+ call BankswitchHome
+ ret
+
+Func_30bc: ; 30bc (0:30bc)
+ ld a, h
+ ld [$ce50], a
+ ld a, l
+ ld [$ce51], a
+ ld a, [hBankROM]
+ push af
+ ld a, $2
+ call BankswitchHome
+ call $4211
+ call Func_2a9e
+ pop af
+ call BankswitchHome
+ ret
+
+Func_30d7: ; 30d7 (0:30d7)
+ ld a, [hBankROM]
+ push af
+ ld a, $2
+ call BankswitchHome
+ call $433c
+ pop af
+ call BankswitchHome
+ ret
+
+Func_30e7: ; 30e7 (0:30e7)
+ ld a, [hBankROM]
+ push af
+ ld a, $2
+ call BankswitchHome
+ call $4764
+ ld b, a
+ pop af
+ call BankswitchHome
+ ld a, b
+ ret
+
+Func_30f9: ; 30f9 (0:30f9)
+ ld b, a
+ ld a, [hBankROM]
+ push af
+ ld a, $2
+ call BankswitchHome
+ call $4932
+ pop af
+ call BankswitchHome
+ ret
+
+Func_310a: ; 310a (0:310a)
+ ld [$ce59], a
+ ld a, [hBankROM]
+ push af
+ ld a, $2
+ call BankswitchHome
+ call $4aaa
+ pop af
+ call BankswitchHome
+ ret
+
+Func_311d: ; 311d (0:311d)
+ ld a, [hBankROM]
+ push af
+ ld a, $2
+ call BankswitchHome
+ call $4b85
+ pop af
+ call BankswitchHome
+ ret
+
+Func_312d: ; 312d (0:312d) ; serial transfer-related
+ push hl
+ ld hl, $ce64
+ ld a, $88
+ ld [hli], a ; [$ce64] ← $88
+ ld a, $33
+ ld [hli], a ; [$ce65] ← $33
+ ld [hl], d ; [$ce66] ← d
+ inc hl
+ ld [hl], e ; [$ce67] ← e
+ inc hl
+ ld [hl], c ; [$ce68] ← c
+ inc hl
+ ld [hl], b ; [$ce69] ← b
+ inc hl
+ pop de
+ ld [hl], e ; [$ce6a] ← l
+ inc hl
+ ld [hl], d ; [$ce6b] ← h
+ inc hl
+ ld de, $ff45
+ ld [hl], e ; [$ce6c] ← $45
+ inc hl
+ ld [hl], d ; [$ce6d] ← $ff
+ ld hl, $ce70
+ ld [hl], $64 ; [$ce70] ← $64
+ inc hl
+ ld [hl], $ce ; [$ce71] ← $ce
+ call Func_0e8e
+ ld a, $1
+ ld [$ce63], a ; [$ce63] ← 1
+ call Func_31fc
+.asm_315d
+ call Func_053f
+ ld a, [$ce63]
+ or a
+ jr nz, .asm_315d
+ call ResetSerial
+ ld bc, $05dc
+.asm_316c
+ dec bc
+ ld a, b
+ or c
+ jr nz, .asm_316c
+ ld a, [$ce6e]
+ cp $81
+ jr nz, .asm_3182
+ ld a, [$ce6f]
+ ld l, a
+ and $f1
+ ld a, l
+ ret z
+ scf
+ ret
+.asm_3182
+ ld a, $ff
+ ld [$ce6f], a
+ scf
+ ret
+
+Func_3189: ; 3189 (0:3189)
+ ld hl, PointerTable_3190
+ dec a
+ jp JumpToFunctionInTable
+
+PointerTable_3190: ; 3190 (0:3190)
+ dw Func_31a8
+ dw Func_31a8
+ dw Func_31a8
+ dw Func_31a8
+ dw Func_31a8
+ dw Func_31b0
+ dw Func_31ca
+ dw Func_31dd
+ dw Func_31e5
+ dw Func_31ef
+ dw Func_31ea
+ dw Func_31f2
+
+Func_31a8: ; 31a8 (0:31a8)
+ call Func_31fc
+Func_31ab: ; 31ab (0:31ab)
+ ld hl, $ce63
+ inc [hl]
+ ret
+
+Func_31b0: ; 31b0 (0:31b0)
+ call Func_31ab
+ ld hl, $ce68
+ ld a, [hli]
+ or [hl]
+ jr nz, .asm_31bf
+ call Func_31ab
+ jr Func_31dd
+.asm_31bf
+ ld hl, $ce6a
+ ld de, $ce70
+ ld a, [hli]
+ ld [de], a
+ inc de
+ ld a, [hl]
+ ld [de], a
+
+Func_31ca: ; 31ca (0:31ca)
+ call Func_31fc
+ ld hl, $ce68
+ ld a, [hl]
+ dec [hl]
+ or a
+ jr nz, .asm_31d8
+ inc hl
+ dec [hl]
+ dec hl
+.asm_31d8
+ ld a, [hli]
+ or [hl]
+ jr z, Func_31ab
+ ret
+
+Func_31dd: ; 31dd (0:31dd)
+ ld a, [$ce6c]
+Func_31e0: ; 31e0 (0:31e0)
+ call Func_3212
+ jr Func_31ab
+
+Func_31e5: ; 31e5 (0:31e5)
+ ld a, [$ce6d]
+ jr Func_31e0
+
+Func_31ea: ; 31ea (0:31ea)
+ ld a, [rSB]
+ ld [$ce6e], a
+Func_31ef: ; 31ef (0:31ef)
+ xor a
+ jr Func_31e0
+
+Func_31f2: ; 31f2 (0:31f2)
+ ld a, [rSB]
+ ld [$ce6f], a
+ xor a
+ ld [$ce63], a
+ ret
+
+Func_31fc: ; 31fc (0:31fc)
+ ld hl, $ce70
+ ld e, [hl]
+ inc hl
+ ld d, [hl]
+ ld a, [de]
+ inc de
+ ld [hl], d
+ dec hl
+ ld [hl], e
+ ld e, a
+ ld hl, $ce6c
+ add [hl]
+ ld [hli], a
+ ld a, $0
+ adc [hl]
+ ld [hl], a
+ ld a, e
+ ; fallthrough
+Func_3212: ; 3212 (0:3212)
+ ld [rSB], a
+ ld a, $1
+ ld [rSC], a
+ ld a, $81
+ ld [rSC], a
+ ret
+; 0x321d
+
+INCBIN "baserom.gbc",$321d,$377f - $321d
+
+SetupSound_T: ; 377f (0:377f)
+ farcall SetupSound_Ext
+ ret
+
+Func_3784: ; 3784 (0:3784)
+ xor a
+PlaySong: ; 3785 (0:3785)
+ farcall Func_f4006
+ ret
+
+Func_378a: ; 378a (0:378a)
+ farcall Func_f400f
+ ret
+
+Func_378f: ; 378f (0:378f)
+ farcall Func_f4012
+ ret
+
+Func_3794: ; 3794 (0:3794)
+ ld a, $04
+Func_3796: ; 3796 (0:3796)
+ farcall Func_f4009
+ ret
+
+Func_379b: ; 379b (0:379b)
+ farcall Func_f401b
+ ret
+
+Func_37a0: ; 37a0 (0:37a0)
+ farcall Func_f401e
+ ret
+; 0x37a5
+
+INCBIN "baserom.gbc",$37a5,$380e - $37a5
+
+Func_380e: ; 380e (0:380e)
+ ld a, [$d0c1]
+ bit 7, a
+ ret nz
+ ld a, [hBankROM]
+ push af
+ ld a, BANK(Func_c484)
+ call BankswitchHome
+ call Func_c484
+ call Func_c554
+ ld a, BANK(Func_1c610)
+ call BankswitchHome
+ call Func_1c610
+ call Func_3cb4
+ ld a, BANK(Func_804d8)
+ call BankswitchHome
+ call Func_804d8
+ call Func_089b
+ pop af
+ call BankswitchHome
+ ret
+
+Func_383d: ; 383d (0:383d)
+ ld a, $1
+ ld [wCounterEnable], a
+ ld a, [hBankROM]
+ push af
+.asm_3845
+ call Func_3855
+ jr nc, .asm_3850
+ farcall LoadMap
+ jr .asm_3845
+.asm_3850
+ pop af
+ call BankswitchHome
+ ret
+
+Func_3855: ; 3855 (0:3855)
+ ld a, [$d0b5]
+ cp $7
+ jr c, .asm_385e
+ ld a, $6
+.asm_385e
+ ld hl, PointerTable_3864
+ jp JumpToFunctionInTable
+
+PointerTable_3864: ; 3864 (0:3864)
+ dw Func_3874
+ dw Func_38c0
+ dw Func_38a3
+ dw Func_3876
+ dw Credits_3911
+ dw Func_38fb
+ dw Func_38db
+ dw Func_3874
+
+Func_3874: ; 3874 (0:3874)
+ scf
+ ret
+
+Func_3876: ; 3876 (0:3876)
+ ld a, [hBankROM]
+ push af
+ call Func_379b
+ ld a, MUSIC_CARDPOP
+ call PlaySong
+ ld a, $3
+ ld [$d0c2], a
+ ld a, [$d10e]
+ or $10
+ ld [$d10e], a
+ farcall Func_b177
+ ld a, [$d10e]
+ and $ef
+ ld [$d10e], a
+ call Func_37a0
+ pop af
+ call BankswitchHome
+ scf
+ ret
+
+Func_38a3: ; 38a3 (0:38a3)
+ ld a, $2
+ ld [$d0c2], a
+ xor a
+ ld [$d112], a
+ ld a, $ff
+ ld [$d0c3], a
+ ld a, $2
+ ld [$cc1a], a
+ ld a, MUSIC_CARDPOP
+ call PlaySong
+ bank1call Func_758f
+ scf
+ ret
+
+Func_38c0: ; 38c0 (0:38c0)
+ ld a, $1
+ ld [$d0c2], a
+ xor a
+ ld [$d112], a
+ call EnableExtRAM
+ xor a
+ ld [$ba44], a
+ call DisableExtRAM
+ call Func_3a3b
+ bank1call Duel_Start
+ scf
+ ret
+
+Func_38db: ; 38db (0:38db)
+ ld a, $6
+ ld [$d111], a
+ call Func_39fc
+ call EnableExtRAM
+ xor a
+ ld [$ba44], a
+ call DisableExtRAM
+asm_38ed
+ farcall Func_131d3
+ ld a, $9
+ ld [$d111], a
+ call Func_39fc
+ scf
+ ret
+
+Func_38fb: ; 38fb (0:38fb)
+ xor a
+ ld [$d112], a
+ bank1call Func_406f
+ call EnableExtRAM
+ ld a, [$ba44]
+ call DisableExtRAM
+ cp $ff
+ jr z, asm_38ed
+ scf
+ ret
+
+Credits_3911: ; 3911 (0:3911)
+ farcall Credits_1d6ad
+ or a
+ ret
+; 0x3917
+
+INCBIN "baserom.gbc",$3917,$3927 - $3917
+
+Func_3927: ; 3927 (0:3927)
+ push hl
+ call Func_3946
+ ld a, [hl]
+ pop hl
+ ret
+; 0x392e
+
+INCBIN "baserom.gbc",$392e,$3946 - $392e
+
+Func_3946: ; 3946 (0:3946)
+ push bc
+ srl b
+ srl c
+ swap c
+ ld a, c
+ and $f0
+ or b
+ ld c, a
+ ld b, $0
+ ld hl, $d133
+ add hl, bc
+ pop bc
+ ret
+
+Func_395a: ; 395a (0:395a)
+ ld a, [hBankROM]
+ push af
+ ld a, [$d4c6]
+ call BankswitchHome
+ call CopyGfxData
+ pop af
+ call BankswitchHome
+ ret
+
+Unknown_396b: ; 396b (0:396b)
+INCBIN "baserom.gbc",$396b,$3973 - $396b
+
+Unknown_3973: ; 3973 (0:3973)
+INCBIN "baserom.gbc",$3973,$397b - $3973
+
+Unknown_397b: ; 397b (0:397b)
+INCBIN "baserom.gbc",$397b,$3997 - $397b
+
+Func_3997: ; 3997 (0:3997)
+ ld a, [hBankROM]
+ push af
+ ld a, BANK(Func_1c056)
+ call BankswitchHome
+ call Func_1c056
+ pop af
+ call BankswitchHome
+ ret
+; 0x39a7
+
+INCBIN "baserom.gbc",$39a7,$39ad - $39a7
+
+Func_39ad: ; 39ad (0:39ad)
+ push bc
+ cp $8
+ jr c, .asm_39b4
+ rst $38
+ xor a
+.asm_39b4
+ add a
+ add a
+ ld h, a
+ add a
+ add h
+ add l
+ ld l, a
+ ld h, $0
+ ld bc, $d34a
+ add hl, bc
+ pop bc
+ ret
+
+Func_39c3: ; 39c3 (0:39c3)
+ push hl
+ push bc
+ push de
+ xor a
+ ld [$d3aa], a
+ ld b, a
+ ld c, $8
+ ld de, $000c
+ ld hl, $d34a
+ ld a, [$d3ab]
+.asm_39d6
+ cp [hl]
+ jr z, .asm_39e1
+ add hl, de
+ inc b
+ dec c
+ jr nz, .asm_39d6
+ scf
+ jr z, .asm_39e6
+.asm_39e1
+ ld a, b
+ ld [$d3aa], a
+ or a
+.asm_39e6
+ pop de
+ pop bc
+ pop hl
+ ret
+; 0x39ea
+
+INCBIN "baserom.gbc",$39ea,$39fc - $39ea
+
+Func_39fc: ; 39fc (0:39fc)
+ push hl
+ push bc
+ call Func_378a
+ or a
+ push af
+ call Func_3a1f
+ ld c, a
+ pop af
+ jr z, .asm_3a11
+ ld a, c
+ ld hl, $d112
+ cp [hl]
+ jr z, .asm_3a1c
+.asm_3a11
+ ld a, c
+ cp $1f
+ jr nc, .asm_3a1c
+ ld [$d112], a
+ call PlaySong
+.asm_3a1c
+ pop bc
+ pop hl
+ ret
+
+Func_3a1f: ; 3a1f (0:3a1f)
+ ld a, [$d3b8]
+ or a
+ jr z, .asm_3a37
+ ld a, [$d32e]
+ cp $2
+ jr z, .asm_3a37
+ cp $b
+ jr z, .asm_3a37
+ cp $c
+ jr z, .asm_3a37
+ ld a, MUSIC_RONALD
+ ret
+.asm_3a37
+ ld a, [$d111]
+ ret
+
+Func_3a3b: ; 3a3b (0:3a3b)
+ farcall Func_1124d
+ ret
+
+Func_3a40: ; 3a40 (0:3a40)
+ farcall Func_11430
+ ret
+; 0x3a45
+
+INCBIN "baserom.gbc",$3a45,$3a5e - $3a45
+
+Func_3a5e: ; 3a5e (0:3a5e)
+ ld a, [hBankROM]
+ push af
+ ld l, $4
+ call Func_3abd
+ jr nc, .asm_3ab3
+ ld a, BANK(Func_c653)
+ call BankswitchHome
+ call Func_c653
+ ld a, $4
+ call BankswitchHome
+ ld a, [$d334]
+ ld d, a
+.asm_3a79
+ ld a, [hli]
+ bit 7, a
+ jr nz, .asm_3ab3
+ push bc
+ push hl
+ cp d
+ jr nz, .asm_3aab
+ ld a, [hli]
+ cp b
+ jr nz, .asm_3aab
+ ld a, [hli]
+ cp c
+ jr nz, .asm_3aab
+ ld a, [hli]
+ ld [$d0c6], a
+ ld a, [hli]
+ ld [$d0c7], a
+ ld a, [hli]
+ ld [$d0ca], a
+ ld a, [hli]
+ ld [$d0cb], a
+ ld a, [hli]
+ ld [$d0c8], a
+ ld a, [hli]
+ ld [$d0c9], a
+ pop hl
+ pop bc
+ pop af
+ call BankswitchHome
+ scf
+ ret
+.asm_3aab
+ pop hl
+ ld bc, $0008
+ add hl, bc
+ pop bc
+ jr .asm_3a79
+.asm_3ab3
+ pop af
+ call BankswitchHome
+ ld l, $6
+ call $49c2
+ ret
+
+Func_3abd: ; 3abd (0:3abd)
+ push bc
+ push hl
+ ld a, [wCurMap]
+ ld l, a
+ ld h, $0
+ add hl, hl
+ add hl, hl
+ add hl, hl
+ add hl, hl
+ ld bc, MapScripts
+ add hl, bc
+ pop bc
+ ld b, $0
+ add hl, bc
+ ld a, [hBankROM]
+ push af
+ ld a, BANK(MapScripts)
+ call BankswitchHome
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ pop af
+ call BankswitchHome
+ ld a, l
+ or h
+ jr nz, .asm_3ae5
+ scf
+.asm_3ae5
+ ccf
+ pop bc
+ ret
+; 0x3ae8
+
+INCBIN "baserom.gbc",$3ae8,$3aed - $3ae8
+
+Func_3aed: ; 3aed (0:3aed)
+ ld hl, $d413
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ ld a, [hli]
+ ld c, [hl]
+ inc hl
+ ld b, [hl]
+ push bc
+ rlca
+ ld c, a
+ ld b, $0
+ ld hl, Unknown_1217b
+ add hl, bc
+ ld a, [hBankROM]
+ push af
+ ld a, BANK(Unknown_1217b)
+ call BankswitchHome
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ pop af
+ call BankswitchHome
+ pop bc
+ jp [hl]
+; 0x3b11
+
+INCBIN "baserom.gbc",$3b11,$3bd2 - $3b11
+
+Func_3bd2: ; 3bd2 (0:3bd2)
+ ld a, l
+ ld [$cad3], a
+ ld a, h
+ ld [$cad4], a
+ ret
+
+Func_3bdb: ; 3bdb (0:3bdb)
+ push hl
+ ld hl, $0000
+ call Func_3bd2
+ pop hl
+ ret
+; 0x3be4
+
+INCBIN "baserom.gbc",$3be4,$3bf5 - $3be4
+
+Func_3bf5: ; 3bf5 (0:3bf5)
+ ld a, [hBankROM]
+ push af
+ push hl
+ ld a, [$d4c6]
+ call BankswitchHome
+ ld a, [$d4c4]
+ ld l, a
+ ld a, [$d4c5]
+ ld h, a
+ call CopyData_SaveRegisters
+ pop hl
+ pop af
+ call BankswitchHome
+ ret
+; 0x3c10
+
+INCBIN "baserom.gbc",$3c10,$3c45 - $3c10
+
+Func_3c45: ; 3c45 (0:3c45)
+ jp [hl]
+; 0x3c46
+
+INCBIN "baserom.gbc",$3c46,$3c48 - $3c46
+
+Func_3c48: ; 3c48 (0:3c48)
+ push af
+ ld a, [rLCDC]
+ bit 7, a
+ jr z, .asm_3c58
+ push bc
+ push de
+ push hl
+ call Func_053f
+ pop hl
+ pop de
+ pop bc
+.asm_3c58
+ pop af
+ ret
+
+Func_3c5a: ; 3c5a (0:3c5a)
+ ld hl, $0000
+ rl c
+ rl b
+ ld a, $10
+.asm_3c63
+ ld [$ffb6], a
+ rl l
+ rl h
+ push hl
+ ld a, l
+ sub e
+ ld l, a
+ ld a, h
+ sbc d
+ ccf
+ jr nc, .asm_3c78
+ ld h, a
+ add sp, $2
+ scf
+ jr .asm_3c79
+.asm_3c78
+ pop hl
+.asm_3c79
+ rl c
+ rl b
+ ld a, [$ffb6]
+ dec a
+ jr nz, .asm_3c63
+ ret
+; 0x3c83
+
+INCBIN "baserom.gbc",$3c83,$3ca0 - $3c83
+
+Func_3ca0: ; 3ca0 (0:3ca0)
+ xor a
+ ld [$d5d7], a
+ ld a, [hBankROM]
+ push af
+ ld a, BANK(Func_1296e)
+ call BankswitchHome
+ call Func_1296e
+ pop af
+ call BankswitchHome
+ ret
+
+Func_3cb4: ; 3cb4 (0:3cb4)
+ ld a, [hBankROM]
+ push af
+ ld a, BANK(Func_12a21)
+ call BankswitchHome
+ call Func_12a21
+ pop af
+ call BankswitchHome
+ ret
+; 0x3cc4
+
+INCBIN "baserom.gbc",$3cc4,$3d72 - $3cc4
+
+Func_3d72: ; 3d72 (0:3d72)
+ ld a, [hBankROM]
+ push af
+ push hl
+ push hl
+ ld a, [$d4ca]
+ cp $ff
+ jr nz, .asm_3d84
+ ld de, Unknown_80e5a
+ xor a
+ jr .asm_3da1
+.asm_3d84
+ ld a, [$d4c4]
+ ld l, a
+ ld a, [$d4c5]
+ ld h, a
+ ld a, [$d4c6]
+ call BankswitchHome
+ ld a, [hli]
+ push af
+ ld a, [$d4ca]
+ rlca
+ ld e, [hl]
+ add e
+ ld e, a
+ inc hl
+ ld a, [hl]
+ adc $0
+ ld d, a
+ pop af
+.asm_3da1
+ add BANK(Unknown_80e5a)
+ pop hl
+ ld bc, $000b
+ add hl, bc
+ ld [hli], a
+ call BankswitchHome
+ ld a, [de]
+ ld [hli], a
+ inc de
+ ld a, [de]
+ ld [hl], a
+ pop hl
+ pop af
+ call BankswitchHome
+ ret
+
+Func_3db7: ; 3db7 (0:3db7)
+ push bc
+ ld c, $0
+ call Func_3dbf
+ pop bc
+ ret
+
+Func_3dbf: ; 3dbf (0:3dbf)
+ ld a, [$d4cf]
+ cp $10
+ jr c, .asm_3dc9
+ rst $38
+ ld a, $f
+.asm_3dc9
+ push bc
+ swap a
+ push af
+ and $f
+ ld b, a
+ pop af
+ and $f0
+ or c
+ ld c, a
+ ld hl, $d4d0
+ add hl, bc
+ pop bc
+ ret
+; 0x3ddb
+
+INCBIN "baserom.gbc",$3ddb,$3df3 - $3ddb
+
+Func_3df3: ; 3df3 (0:3df3)
+ push af
+ ld a, [hBankROM]
+ push af
+ push hl
+ ld a, BANK(Func_12c7f)
+ call BankswitchHome
+ ld hl, [sp+$5]
+ ld a, [hl]
+ call Func_12c7f
+ call Func_0404
+ pop hl
+ pop af
+ call BankswitchHome
+ pop af
+ ld a, [$d61b]
+ ret
+; 0x3e10
+
+INCBIN "baserom.gbc",$3e10,$3e17 - $3e10
+
+Func_3e17: ; 3e17 (0:3e17)
+ ld [$d131], a
+ ld a, [hBankROM]
+ push af
+ ld a, $4
+ call BankswitchHome
+ call $6fc6
+ pop af
+ call BankswitchHome
+ ret
+
+Func_3e2a: ; 3e2a (0:3e2a)
+ ld [$d61e], a
+ ld a, $63
+ jr Func_3e17
+; 0x3e31
+
+INCBIN "baserom.gbc",$3e31,$3fe0 - $3e31
+
+; jumps to 3f:hl
+Bankswitch3dTo3f:: ; 3fe0 (0:3fe0)
+ push af
+ ld a, $3f
+ ld [hBankROM], a
+ ld [MBC3RomBank], a
+ pop af
+ ld bc, Bankswitch3d
+ push bc
+ jp [hl]
+
+Bankswitch3d: ; 3fe0 (0:3fe0)
+ ld a, $3d
+ ld [hBankROM], a
+ ld [MBC3RomBank], a
+ ret
+
+rept $a
+db $ff
+endr