summaryrefslogtreecommitdiff
path: root/src/engine/home.asm
diff options
context:
space:
mode:
authorDaniel Harding <corrnondacqb@yahoo.com>2015-03-19 00:19:59 -0400
committerDaniel Harding <corrnondacqb@yahoo.com>2015-03-19 00:19:59 -0400
commitae198f05566310d64d201bc8e5b9b54f90c27b7b (patch)
treed5fe4e6cde4cfa6d37e1a9f04ee267c384b73f42 /src/engine/home.asm
parent3c75edba47b89066383a4dae07d225cbc1cbff77 (diff)
parentd41ad62f5bf43c98d05c593d5c64a5a42b7c0cee (diff)
Merge pull request #6 from stag019/srcrgbgfx
Move source code into "src/". Update Makefile/scan_includes.
Diffstat (limited to 'src/engine/home.asm')
-rwxr-xr-xsrc/engine/home.asm4851
1 files changed, 4851 insertions, 0 deletions
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