summaryrefslogtreecommitdiff
path: root/home
diff options
context:
space:
mode:
Diffstat (limited to 'home')
-rw-r--r--home/audio.asm143
-rw-r--r--home/bankswitch.asm8
-rw-r--r--home/clear_sprites.asm23
-rw-r--r--home/copy.asm68
-rw-r--r--home/copy_tilemap.asm18
-rw-r--r--home/farcall.asm36
-rw-r--r--home/init.asm129
-rw-r--r--home/interrupts.asm26
-rw-r--r--home/lcd.asm77
-rw-r--r--home/oam_dma.asm23
-rw-r--r--home/predef.asm43
-rw-r--r--home/rst.asm25
-rw-r--r--home/serial.asm53
-rw-r--r--home/sram.asm19
-rw-r--r--home/vblank.asm29
15 files changed, 720 insertions, 0 deletions
diff --git a/home/audio.asm b/home/audio.asm
new file mode 100644
index 0000000..bb49d42
--- /dev/null
+++ b/home/audio.asm
@@ -0,0 +1,143 @@
+SECTION "Audio", ROM0[$3CBF]
+
+DisableAudio:: ; 3cbf
+ push hl
+ push de
+ push bc
+ push af
+ ldh a, [hROMBank]
+ push af
+ ld a, BANK(_DisableAudio)
+ ld [MBC3RomBank], a ; Unsafe
+ ldh [hROMBank], a
+ call _DisableAudio
+ pop af
+ ld [MBC3RomBank], a ; Unsafe
+ ldh [hROMBank], a
+ pop af
+ pop bc
+ pop de
+ pop hl
+ ret
+
+
+UpdateSound:: ; 3cdb
+ push hl
+ push de
+ push bc
+ push af
+ ldh a, [hROMBank]
+ push af
+ ld a, BANK(_UpdateSound)
+ ld [MBC3RomBank], a ; Unsafe
+ ldh [hROMBank], a
+ call _UpdateSound
+ pop af
+ ld [MBC3RomBank], a ; Unsafe
+ ldh [hROMBank], a
+ pop af
+ pop bc
+ pop de
+ pop hl
+ ret
+
+
+LoadMusicByte:: ; 3cf7
+ ld [MBC3RomBank], a ; Unsafe
+ ldh [hROMBank], a
+ ld a, [de]
+ push af
+ ld a, BANK(_UpdateSound)
+ ld [MBC3RomBank], a ; Unsafe
+ ldh [hROMBank], a
+ pop af
+ ret
+
+
+PlayMusic:: ; 3d07
+ push hl
+ push de
+ push bc
+ push af
+ ldh a, [hROMBank]
+ push af
+ ld a, BANK(_PlayMusic)
+ ld [MBC3RomBank], a ; Unsafe
+ ldh [hROMBank], a
+ call _PlayMusic
+ pop af
+ ld [MBC3RomBank], a ; Unsafe
+ ldh [hROMBank], a
+ pop af
+ pop bc
+ pop de
+ pop hl
+ ret
+
+
+PlayCryHeader:: ; 3d23
+ push hl
+ push de
+ push bc
+ push af
+ ldh a, [hROMBank]
+ push af
+
+ ld a, BANK(CryHeaders)
+ ld [MBC3RomBank], a ; Unsafe
+ ldh [hROMBank], a
+ ld hl, CryHeaders
+REPT 6
+ add hl, de
+ENDR
+ ld e, [hl]
+ inc hl
+ ld d, [hl]
+ inc hl
+ ld a, [hli]
+ ld [wCryPitch], a
+ ld a, [hli]
+ ld [wCryPitch + 1], a
+ ld a, [hli]
+ ld [wCryLength], a
+ ld a, [hl]
+ ld [wCryLength + 1], a
+
+ ld a, BANK(_PlayCryHeader)
+ ld [MBC3RomBank], a ; Unsafe
+ ldh [hROMBank], a
+ call _PlayCryHeader
+
+ pop af
+ ld [MBC3RomBank], a ; Unsafe
+ ldh [hROMBank], a
+ pop af
+ pop bc
+ pop de
+ pop hl
+ ret
+
+
+
+
+PlaySFX:: ; 3d63
+ push hl
+ push de
+ push bc
+ push af
+ ldh a, [hROMBank]
+ push af
+ ld a, BANK(PlaySFX_)
+ ld [MBC3RomBank], a ; Unsafe
+ ldh [hROMBank], a
+ call PlaySFX_
+ pop af
+ ld [MBC3RomBank], a ; Unsafe
+ ldh [hROMBank], a
+ pop af
+ pop bc
+ pop de
+ pop hl
+ ret
+
+
diff --git a/home/bankswitch.asm b/home/bankswitch.asm
new file mode 100644
index 0000000..67fae1a
--- /dev/null
+++ b/home/bankswitch.asm
@@ -0,0 +1,8 @@
+SECTION "Bankswitch", ROM0[$32C2]
+
+; Moved to a rst vector in final US releases (not sure about JP)
+; All rst vectors are unused at this point in development
+Bankswitch:: ; 32c2
+ ldh [hROMBank], a
+ ld [MBC3RomBank], a
+ ret
diff --git a/home/clear_sprites.asm b/home/clear_sprites.asm
new file mode 100644
index 0000000..9ce9a54
--- /dev/null
+++ b/home/clear_sprites.asm
@@ -0,0 +1,23 @@
+SECTION "Sprite clearing", ROM0[$32DC]
+
+ClearSprites:: ; 32dc
+ ld hl, wVirtualOAM
+ ld b, wVirtualOAMEnd - wVirtualOAM
+ xor a
+.loop
+ ld [hli], a
+ dec b
+ jr nz, .loop
+ ret
+
+HideSprites:: ; 32e7
+ ld hl, wVirtualOAM
+ ld de, SPRITEOAMSTRUCT_LENGTH
+ ld b, NUM_SPRITE_OAM_STRUCTS
+ ld a, $A0
+.loop
+ ld [hli], a
+ add hl, de
+ dec b
+ jr nz, .loop
+ ret
diff --git a/home/copy.asm b/home/copy.asm
new file mode 100644
index 0000000..f89bd49
--- /dev/null
+++ b/home/copy.asm
@@ -0,0 +1,68 @@
+SECTION "Copy functions", ROM0[$32F7]
+
+FarCopyBytes:: ; 32f7
+ ld [wBuffer], a
+ ldh a, [hROMBank]
+ push af
+ ld a, [wBuffer]
+ call Bankswitch
+ call CopyBytes
+ pop af
+ jp Bankswitch
+
+CopyBytes:: ; 330a
+ ld a, b
+ and a
+ jr z, CopyBytesSmall
+ ld a, c
+ and a
+ jr z, .next
+ inc b
+.next
+ call CopyBytesSmall
+ dec b
+ jr nz, .next
+ ret
+
+CopyBytesSmall:: ; 331a
+ ld a, [hli]
+ ld [de], a
+ inc de
+ dec c
+ jr nz, CopyBytesSmall
+ ret
+
+
+GetFarByte:: ; 3321
+ ld [wBuffer], a
+ ldh a, [hROMBank]
+ push af
+ ld a, [wBuffer]
+ call Bankswitch
+ ld a, [hl]
+ ld [wBuffer], a
+ pop af
+ call Bankswitch
+ ld a, [wBuffer]
+ ret
+
+
+ByteFill:: ; 3339
+ push af
+ ld a, b
+ and a
+ jr z, .small_fill
+ ld a, c
+ and a
+ jr z, .start_filling
+.small_fill
+ inc b
+.start_filling
+ pop af
+.loop
+ ld [hli], a
+ dec c
+ jr z, .loop
+ dec b
+ jr z, .loop
+ ret
diff --git a/home/copy_tilemap.asm b/home/copy_tilemap.asm
new file mode 100644
index 0000000..950bb24
--- /dev/null
+++ b/home/copy_tilemap.asm
@@ -0,0 +1,18 @@
+SECTION "Tilemap copy/restore funcs", ROM0[$3355]
+
+BackUpTilesToBuffer:: ; 3355
+ hlcoord 0, 0
+ decoord 0, 0, wTileMapBackup
+ ld bc, SCREEN_HEIGHT * SCREEN_WIDTH
+ jp CopyBytes
+
+ReloadTilesFromBuffer:: ; 3361
+ xor a
+ ldh [hBGMapMode], a
+ hlcoord 0, 0, wTileMapBackup
+ decoord 0, 0
+ ld bc, SCREEN_HEIGHT * SCREEN_WIDTH
+ call CopyBytes
+ ld a, 1
+ ldh [hBGMapMode], a
+ ret
diff --git a/home/farcall.asm b/home/farcall.asm
new file mode 100644
index 0000000..68f8ab0
--- /dev/null
+++ b/home/farcall.asm
@@ -0,0 +1,36 @@
+SECTION "Farcall", ROM0[$2FA8]
+
+FarCall_hl:: ; 2fa8
+ push af
+ ld a, b
+ ld [wFarCallBCBuffer], a
+ ld a, c
+ ld [wFarCallBCBuffer + 1], a
+ pop af
+ ld b, a
+ ldh a, [hROMBank]
+ push af
+ ld a, b
+ call Bankswitch
+ ld bc, .return
+ push bc
+ push hl
+ ld a, [wFarCallBCBuffer]
+ ld b, a
+ ld a, [wFarCallBCBuffer + 1]
+ ld c, a
+ ret
+
+.return
+ ld a, b
+ ld [wFarCallBCBuffer], a
+ ld a, c
+ ld [wFarCallBCBuffer + 1], a
+ pop bc
+ ld a, b
+ call Bankswitch
+ ld a, [wFarCallBCBuffer]
+ ld b, a
+ ld a, [wFarCallBCBuffer + 1]
+ ld c, a
+ ret
diff --git a/home/init.asm b/home/init.asm
new file mode 100644
index 0000000..fcafa3c
--- /dev/null
+++ b/home/init.asm
@@ -0,0 +1,129 @@
+SECTION "Entry point", ROM0[$100]
+ nop
+ jp Init
+
+SECTION "Global check value", ROM0[$14E]
+; The ROM has an incorrect global check, so set it here
+; It is not corrected by RGBFIX
+ db $21, $C6
+
+
+SECTION "Init", ROM0[$52F]
+
+Init: ; 052f
+ di
+ xor a
+ ld [rIF], a
+ ld [rIE], a
+ ld [rSCX], a
+ ld [rSCY], a
+ ld [rSB], a
+ ld [rSC], a
+ ld [rWX], a
+ ld [rWY], a
+ ld [rBGP], a
+ ld [rOBP0], a
+ ld [rOBP1], a
+ ld [rTMA], a
+ ld [rTAC], a
+ ld [wcc38], a ; Useless, since WRAM gets cleared right after
+ ld a, 1 << rTAC_ON | rTAC_4096_HZ
+ ld [rTAC], a
+ ld a, 1 << rLCDC_ENABLE
+ ld [rLCDC], a
+
+ ld sp, wStackBottom
+ call ClearVRAM
+ ld hl, WRAM0_Begin
+ ld bc, WRAM1_End - WRAM0_Begin
+.ByteFill ; 0565
+ ld [hl], 0
+ inc hl
+ dec bc
+ ld a, b
+ or c
+ jr nz, .ByteFill
+ ld hl, HRAM_Begin
+ ld bc, HRAM_End - HRAM_Begin
+ call ByteFill
+ call ClearSprites
+
+ ld a, BANK(WriteOAMDMACodeToHRAM)
+ call Bankswitch
+ call WriteOAMDMACodeToHRAM
+
+ xor a
+ ldh [hMapAnims], a
+ ldh [hSCX], a
+ ldh [hSCY], a
+ ldh [rJOYP], a
+ ld a, 1 << rSTAT_HBLANK
+ ld [rSTAT], a
+ ld a, SCREEN_HEIGHT_PX
+ ldh [hWY], a
+ ld [rWY], a
+ ld a, 7
+ ldh [hWX], a
+ ld [rWX], a
+
+ ld a, $FF
+ ldh [hLinkPlayerNumber], a
+ ld h, HIGH($9800)
+ call BlankBGMap
+ ld h, HIGH($9800)
+ call BlankBGMap
+ ld a, LCDC_DEFAULT
+ ld [rLCDC], a
+
+ call DisableAudio
+ call _2007
+ ; predef ???
+ ld a, $4B ; TODO: add predefs so the line above can be uncommented
+ call Predef
+ ld a, $1F
+ ld [rIE], a
+ ld a, HIGH($9C00)
+ ldh [hBGMapAddress + 1], a
+ xor a
+ ldh [hBGMapAddress], a
+
+ call DisableLCD
+ call ClearVRAM
+ ld a, LCDC_DEFAULT
+ ld [rLCDC], a
+ ei
+
+ ld a, SRAM_ENABLE
+ ld [MBC3SRamEnable], a
+ ld a, RTC_DH
+ ld [MBC3SRamBank], a
+ xor a
+ ld [SRAM_Begin], a
+ ld a, 0 ; Useless
+ ld [MBC3LatchClock], a
+ ld [MBC3SRamEnable], a
+ jp GameInit
+
+ClearVRAM: ; 05e6
+ ld hl, VRAM_Begin
+ ld bc, VRAM_End - VRAM_Begin
+ call ByteFill
+ ret
+
+BlankBGMap:
+ ld a, $7F
+ jr _FillBGMap
+
+FillBGMap:
+ ld a, l
+
+_FillBGMap:
+ ld de, $400
+ ld l, e
+.loop
+ ld [hli], a
+ dec e
+ jr nz, .loop
+ dec d
+ jr nz, .loop
+ ret
diff --git a/home/interrupts.asm b/home/interrupts.asm
new file mode 100644
index 0000000..91610e0
--- /dev/null
+++ b/home/interrupts.asm
@@ -0,0 +1,26 @@
+SECTION "VBlank interrupt vector", ROM0[$040]
+ jp VBlank
+
+SECTION "LCD interrupt vector", ROM0[$048]
+ jp LCD
+
+SECTION "Timer interrupt vector", ROM0[$050]
+ jp TimerDummy
+
+SECTION "Serial interrupt vector", ROM0[$058]
+ jp Serial
+
+SECTION "Joypad interrupt vector", ROM0[$060]
+ jp JoypadDummy
+
+
+SECTION "Timer dummy interrupt", ROM0[$42A]
+
+TimerDummy: ; 042a
+ reti
+
+
+SECTION "Joypad dummy interrupt", ROM0[$7F7]
+
+JoypadDummy: ; 07f7
+ reti \ No newline at end of file
diff --git a/home/lcd.asm b/home/lcd.asm
new file mode 100644
index 0000000..dcf6bfa
--- /dev/null
+++ b/home/lcd.asm
@@ -0,0 +1,77 @@
+SECTION "LCD functions", ROM0[$3AE]
+
+LCD:: ; 03ae
+ push af
+ ldh a, [hLCDCPointer]
+ and a
+ jr z, .done
+ push hl
+ rla
+ jr c, .try_hide_sprites
+ ld a, [rLY]
+ ld l, a
+ ld h, HIGH(wLYOverrides)
+ ld h, [hl]
+ ldh a, [hLCDCPointer]
+ ld l, a
+ ld a, h
+ ld h, $FF
+ ld [hl], a
+ pop hl
+ pop af
+ reti
+
+.try_hide_sprites
+ ld a, [rLY]
+ cp $80
+ jr nz, .dont_hide
+ ld hl, rLCDC
+ res 1, [hl]
+.dont_hide
+ pop hl
+ pop af
+ reti
+
+ ; Seems unused?
+ ldh a, [hSCX]
+ ld [rSCX], a
+ ldh a, [hSCY]
+ ld [rSCY], a
+ pop hl
+.done
+ pop af
+ reti
+
+
+; 0:3e1
+ sine_table 16
+
+
+DisableLCD:: ; 0401
+ ld a, [rLY]
+ bit 7, a
+ ret z
+ xor a
+ ld [rIF], a
+ ld a, [rIE]
+ ld b, a
+ res 0, a
+ ld [rIE], a
+.wait
+ ld a, [rLY]
+ cp LY_VBLANK
+ jr nz, .wait
+ ld a, [rLCDC]
+ and $7F ; Shut LCD down
+ ld [rLCDC], a
+ xor a
+ ld [rIF], a
+ ld a, b
+ ld [rIE], a
+ ret
+
+EnableLCD:: ; 0423
+ ld a, [rLCDC]
+ set 7, a
+ ld [rLCDC], a
+ ret
diff --git a/home/oam_dma.asm b/home/oam_dma.asm
new file mode 100644
index 0000000..958e88c
--- /dev/null
+++ b/home/oam_dma.asm
@@ -0,0 +1,23 @@
+SECTION "OAM DMA", ROMX[$4153],BANK[1]
+
+WriteOAMDMACodeToHRAM:: ; 4153
+ ld c, LOW(hOAMDMA)
+ ld b, .OAMDMAEnd - .OAMDMA
+ ld hl, .OAMDMA
+.loop
+ ld a, [hli]
+ ld [$ff00+c], a
+ inc c
+ dec b
+ jr nz, .loop
+ ret
+
+.OAMDMA ; 4161
+ ld a, HIGH(wVirtualOAM)
+ ldh [rDMA], a
+.wait
+ ld a, $28
+ dec a
+ jr nz, .wait
+ ret
+.OAMDMAEnd ; 416b
diff --git a/home/predef.asm b/home/predef.asm
new file mode 100644
index 0000000..6c85236
--- /dev/null
+++ b/home/predef.asm
@@ -0,0 +1,43 @@
+SECTION "Predef", ROM0[$2FDE]
+
+Predef:: ; 2fde
+ ld [wPredefID], a
+ ldh a, [hROMBank]
+ push af
+ ld a, BANK(GetPredefPointer)
+ call Bankswitch
+ call GetPredefPointer
+ call Bankswitch
+ ld hl, .return
+ push hl
+ push de
+ jr .save_regs
+
+.return
+ ld a, h
+ ld [wPredefHL], a
+ ld a, l
+ ld [wPredefHL + 1], a
+ pop hl
+ ld a, h ; Could have used `pop af` instead
+ call Bankswitch
+ ld a, [wPredefHL]
+ ld h, a
+ ld a, [wPredefHL + 1]
+ ld l, a
+ ret
+
+.save_regs
+ ld a, h
+ ld [wPredefHL], a
+ ld a, l
+ ld [wPredefHL + 1], a
+ ld a, d
+ ld [wPredefDE], a
+ ld a, e
+ ld [wPredefDE + 1], a
+ ld a, b
+ ld [wPredefBC], a
+ ld a, c
+ ld [wPredefBC + 1], a
+ ret
diff --git a/home/rst.asm b/home/rst.asm
new file mode 100644
index 0000000..851775b
--- /dev/null
+++ b/home/rst.asm
@@ -0,0 +1,25 @@
+; rst vectors
+
+SECTION "rst00", ROM0[$000]
+ rst $38
+
+SECTION "rst08", ROM0[$008]
+ rst $38
+
+SECTION "rst10", ROM0[$010]
+ rst $38
+
+SECTION "rst18", ROM0[$018]
+ rst $38
+
+SECTION "rst20", ROM0[$020]
+ rst $38
+
+SECTION "rst28", ROM0[$028]
+ rst $38
+
+SECTION "rst30", ROM0[$030]
+ rst $38
+
+SECTION "rst38", ROM0[$038]
+ jp $F080 ; Jumps in the middle of unmapped memory. Probably used to trigger a breakpoint of sorts.
diff --git a/home/serial.asm b/home/serial.asm
new file mode 100644
index 0000000..b474e5d
--- /dev/null
+++ b/home/serial.asm
@@ -0,0 +1,53 @@
+SECTION "Serial handler", ROM0[$602]
+
+Serial::
+ push af
+ push bc
+ push de
+ push hl
+ ldh a, [hLinkPlayerNumber]
+ inc a
+ jr z, .init_player_number
+
+ ld a, [rSB]
+ ldh [hSerialRecieve], a
+ ldh a, [hSerialSend]
+ ld [rSB], a
+ ldh a, [hLinkPlayerNumber]
+ cp 2
+ jr z, .done
+ ld a, 1 << rSC_ON
+ ld [rSC], a
+ jr .done
+
+.init_player_number
+ ld a, [rSB]
+ ldh [hSerialRecieve], a
+ ldh [hLinkPlayerNumber], a
+ cp 2
+ jr z, .master
+ xor a
+ ld [rSB], a
+ ld a, 3
+ ld [rDIV], a
+.wait
+ ld a, [rDIV]
+ bit 7, a
+ jr nz, .wait
+ ld a, 1 << rSC_ON
+ ld [rSC], a
+ jr .done
+.master
+ xor a
+ ld [rSC], a
+
+.done
+ ld a, 1
+ ldh [hSerialRecieved], a
+ ld a, SERIAL_NO_DATA_BYTE
+ ldh [hSerialSend], a
+ pop hl
+ pop de
+ pop bc
+ pop af
+ reti
diff --git a/home/sram.asm b/home/sram.asm
new file mode 100644
index 0000000..c204b9b
--- /dev/null
+++ b/home/sram.asm
@@ -0,0 +1,19 @@
+SECTION "SRAM functions", ROM0[$32A7]
+
+OpenSRAM:: ; 32a7
+ push af
+ ld a, 1
+ ld [MBC3LatchClock], a
+ ld a, SRAM_ENABLE
+ ld [MBC3SRamEnable], a
+ pop af
+ ld [MBC3SRamBank], a
+ ret
+
+CloseSRAM:: ; 32b7
+ push af
+ ld a, SRAM_DISABLE
+ ld [MBC3LatchClock], a
+ ld [MBC3SRamEnable], a
+ pop af
+ ret
diff --git a/home/vblank.asm b/home/vblank.asm
new file mode 100644
index 0000000..efa7196
--- /dev/null
+++ b/home/vblank.asm
@@ -0,0 +1,29 @@
+SECTION "VBlank handler", ROM0[$150]
+
+VBlank:: ; 0150
+ push af
+ push bc
+ push de
+ push hl
+ ldh a, [hVBlank]
+ and 3
+ ld e, a
+ ld d, 0
+ ld hl, .blanks
+ add hl, de
+ add hl, de
+ ld a, [hli]
+ ld h, [hl]
+ ld l, a
+ ld de, .return
+ push de
+ jp hl
+.return
+ pop hl
+ pop de
+ pop bc
+ pop af
+ reti
+
+.blanks
+ ; TODO