mirror of
https://github.com/thornAvery/kep-hack.git
synced 2025-11-14 00:56:40 +13:00
Merge
hg-commit-id: fb2ef1212629
This commit is contained in:
commit
274e3b5d21
222
common.asm
222
common.asm
|
|
@ -108,8 +108,79 @@ jp Start
|
||||||
|
|
||||||
Section "start",HOME[$150]
|
Section "start",HOME[$150]
|
||||||
Start: ; 0x150
|
Start: ; 0x150
|
||||||
|
cp $11 ; value that indicates Gameboy Color
|
||||||
|
jr z,.gbcDetected\@
|
||||||
|
xor a
|
||||||
|
jr .storeValue\@
|
||||||
|
.gbcDetected\@
|
||||||
|
ld a,$00
|
||||||
|
.storeValue\@
|
||||||
|
ld [$cf1a],a ; same value ($00) either way
|
||||||
|
jp InitGame
|
||||||
|
|
||||||
|
; this function directly reads the joypad I/O register
|
||||||
|
; it reads many times in order to give the joypad a chance to stabilize
|
||||||
|
; it saves a result in [$fff8] in the following format
|
||||||
|
; (set bit indicates pressed button)
|
||||||
|
; bit 0 - A button
|
||||||
|
; bit 1 - B button
|
||||||
|
; bit 2 - Select button
|
||||||
|
; bit 3 - Start button
|
||||||
|
; bit 4 - Right
|
||||||
|
; bit 5 - Left
|
||||||
|
; bit 6 - Up
|
||||||
|
; bit 7 - Down
|
||||||
|
ReadJoypadRegister: ; 15F
|
||||||
|
ld a,%00100000 ; select direction keys
|
||||||
|
ld c,$00
|
||||||
|
ld [rJOYP],a
|
||||||
|
ld a,[rJOYP]
|
||||||
|
ld a,[rJOYP]
|
||||||
|
ld a,[rJOYP]
|
||||||
|
ld a,[rJOYP]
|
||||||
|
ld a,[rJOYP]
|
||||||
|
ld a,[rJOYP]
|
||||||
|
cpl ; complement the result so that a set bit indicates a pressed key
|
||||||
|
and a,%00001111
|
||||||
|
swap a ; put direction keys in upper nibble
|
||||||
|
ld b,a
|
||||||
|
ld a,%00010000 ; select button keys
|
||||||
|
ld [rJOYP],a
|
||||||
|
ld a,[rJOYP]
|
||||||
|
ld a,[rJOYP]
|
||||||
|
ld a,[rJOYP]
|
||||||
|
ld a,[rJOYP]
|
||||||
|
ld a,[rJOYP]
|
||||||
|
ld a,[rJOYP]
|
||||||
|
ld a,[rJOYP]
|
||||||
|
ld a,[rJOYP]
|
||||||
|
ld a,[rJOYP]
|
||||||
|
ld a,[rJOYP]
|
||||||
|
cpl ; complement the result so that a set bit indicates a pressed key
|
||||||
|
and a,%00001111
|
||||||
|
or b ; put button keys in lower nibble
|
||||||
|
ld [$fff8],a ; save joypad state
|
||||||
|
ld a,%00110000 ; unselect all keys
|
||||||
|
ld [rJOYP],a
|
||||||
|
ret
|
||||||
|
|
||||||
|
; function to update the joypad state variables
|
||||||
|
; output:
|
||||||
|
; [$ffb2] = keys released since last time
|
||||||
|
; [$ffb3] = keys pressed since last time
|
||||||
|
; [$ffb4] = currently pressed keys
|
||||||
|
GetJoypadState: ; 19A
|
||||||
|
ld a, [$ffb8]
|
||||||
|
push af
|
||||||
|
ld a,$3
|
||||||
|
ld [$ffb8],a
|
||||||
|
ld [$2000],a
|
||||||
|
call $4000
|
||||||
|
pop af
|
||||||
|
ld [$ff00+$b8],a
|
||||||
|
ld [$2000],a
|
||||||
|
ret
|
||||||
|
|
||||||
INCBIN "baserom.gbc",$150,$1AE - $150
|
|
||||||
; see also MapHeaderBanks
|
; see also MapHeaderBanks
|
||||||
MapHeaderPointers: ; $01AE
|
MapHeaderPointers: ; $01AE
|
||||||
dw PalletTown_h
|
dw PalletTown_h
|
||||||
|
|
@ -419,7 +490,7 @@ OverworldLoopLessDelay: ; 402
|
||||||
ld a,[$d736]
|
ld a,[$d736]
|
||||||
bit 6,a ; jumping down a ledge?
|
bit 6,a ; jumping down a ledge?
|
||||||
call nz, HandleMidJump
|
call nz, HandleMidJump
|
||||||
ld a,[$cfc5] ; walking animation counter
|
ld a,[W_WALKCOUNTER]
|
||||||
and a
|
and a
|
||||||
jp nz,.moveAhead\@ ; if the player sprite has not yet completed the walking animation
|
jp nz,.moveAhead\@ ; if the player sprite has not yet completed the walking animation
|
||||||
call GetJoypadStateOverworld ; get joypad state (which is possibly simulated)
|
call GetJoypadStateOverworld ; get joypad state (which is possibly simulated)
|
||||||
|
|
@ -622,7 +693,7 @@ OverworldLoopLessDelay: ; 402
|
||||||
jp c,OverworldLoop
|
jp c,OverworldLoop
|
||||||
.noCollision\@
|
.noCollision\@
|
||||||
ld a,$08
|
ld a,$08
|
||||||
ld [$cfc5],a ; walking animation counter
|
ld [W_WALKCOUNTER],a
|
||||||
jr .moveAhead2\@
|
jr .moveAhead2\@
|
||||||
.moveAhead\@
|
.moveAhead\@
|
||||||
ld a,[$d736]
|
ld a,[$d736]
|
||||||
|
|
@ -645,7 +716,7 @@ OverworldLoopLessDelay: ; 402
|
||||||
call BikeSpeedup ; if riding a bike and not jumping a ledge
|
call BikeSpeedup ; if riding a bike and not jumping a ledge
|
||||||
.normalPlayerSpriteAdvancement\@
|
.normalPlayerSpriteAdvancement\@
|
||||||
call AdvancePlayerSprite
|
call AdvancePlayerSprite
|
||||||
ld a,[$cfc5] ; walking animation counter
|
ld a,[W_WALKCOUNTER]
|
||||||
and a
|
and a
|
||||||
jp nz,CheckMapConnections ; it seems like this check will never succeed (the other place where CheckMapConnections is run works)
|
jp nz,CheckMapConnections ; it seems like this check will never succeed (the other place where CheckMapConnections is run works)
|
||||||
; walking animation finished
|
; walking animation finished
|
||||||
|
|
@ -799,7 +870,7 @@ CheckWarpsNoCollisionLoop: ; 6CC
|
||||||
jr nz,WarpFound1
|
jr nz,WarpFound1
|
||||||
push de
|
push de
|
||||||
push bc
|
push bc
|
||||||
call $019a ; update joypad state
|
call GetJoypadState
|
||||||
pop bc
|
pop bc
|
||||||
pop de
|
pop de
|
||||||
ld a,[$ffb4] ; current joypad state
|
ld a,[$ffb4] ; current joypad state
|
||||||
|
|
@ -1823,7 +1894,7 @@ AdvancePlayerSprite: ; D27
|
||||||
ld b,a
|
ld b,a
|
||||||
ld a,[$c105] ; delta X
|
ld a,[$c105] ; delta X
|
||||||
ld c,a
|
ld c,a
|
||||||
ld hl,$cfc5 ; walking animation counter
|
ld hl,W_WALKCOUNTER ; walking animation counter
|
||||||
dec [hl]
|
dec [hl]
|
||||||
jr nz,.afterUpdateMapCoords\@
|
jr nz,.afterUpdateMapCoords\@
|
||||||
; if it's the end of the animation, update the player's map coordinates
|
; if it's the end of the animation, update the player's map coordinates
|
||||||
|
|
@ -1834,7 +1905,7 @@ AdvancePlayerSprite: ; D27
|
||||||
add c
|
add c
|
||||||
ld [W_XCOORD],a
|
ld [W_XCOORD],a
|
||||||
.afterUpdateMapCoords\@
|
.afterUpdateMapCoords\@
|
||||||
ld a,[$cfc5] ; walking animation counter
|
ld a,[W_WALKCOUNTER] ; walking animation counter
|
||||||
cp a,$07
|
cp a,$07
|
||||||
jp nz,.scrollBackgroundAndSprites\@
|
jp nz,.scrollBackgroundAndSprites\@
|
||||||
; if this is the first iteration of the animation
|
; if this is the first iteration of the animation
|
||||||
|
|
@ -2205,7 +2276,7 @@ GetJoypadStateOverworld: ; F4D
|
||||||
ld [$c103],a
|
ld [$c103],a
|
||||||
ld [$c105],a
|
ld [$c105],a
|
||||||
call RunMapScript
|
call RunMapScript
|
||||||
call $019a ; update joypad state
|
call GetJoypadState
|
||||||
ld a,[$d733]
|
ld a,[$d733]
|
||||||
bit 3,a ; check if a trainer wants a challenge
|
bit 3,a ; check if a trainer wants a challenge
|
||||||
jr nz,.notForcedDownwards\@
|
jr nz,.notForcedDownwards\@
|
||||||
|
|
@ -2698,7 +2769,7 @@ LoadMapData: ; 1241
|
||||||
ld [$d526],a
|
ld [$d526],a
|
||||||
ld [$ffaf],a
|
ld [$ffaf],a
|
||||||
ld [$ffae],a
|
ld [$ffae],a
|
||||||
ld [$cfc5],a
|
ld [W_WALKCOUNTER],a
|
||||||
ld [$d119],a
|
ld [$d119],a
|
||||||
ld [$d11a],a
|
ld [$d11a],a
|
||||||
ld [$d3a8],a
|
ld [$d3a8],a
|
||||||
|
|
@ -3456,7 +3527,7 @@ TextCommand09: ; 1BFF
|
||||||
; (no arguments)
|
; (no arguments)
|
||||||
TextCommand0A: ; 1C1D
|
TextCommand0A: ; 1C1D
|
||||||
push bc
|
push bc
|
||||||
call $019a ; update joypad state
|
call GetJoypadState
|
||||||
ld a,[$ffb4]
|
ld a,[$ffb4]
|
||||||
and a,%00000011 ; A and B buttons
|
and a,%00000011 ; A and B buttons
|
||||||
jr nz,.skipDelay\@
|
jr nz,.skipDelay\@
|
||||||
|
|
@ -3533,7 +3604,7 @@ TextCommand0C: ; 1C78
|
||||||
ld a,$75 ; ellipsis
|
ld a,$75 ; ellipsis
|
||||||
ld [hli],a
|
ld [hli],a
|
||||||
push de
|
push de
|
||||||
call $019a ; update joypad state
|
call GetJoypadState
|
||||||
pop de
|
pop de
|
||||||
ld a,[$ffb4] ; joypad state
|
ld a,[$ffb4] ; joypad state
|
||||||
and a,%00000011 ; is A or B button pressed?
|
and a,%00000011 ; is A or B button pressed?
|
||||||
|
|
@ -3617,7 +3688,128 @@ GetRowColAddressBgMap: ; 1CDD
|
||||||
ld h,a
|
ld h,a
|
||||||
ret
|
ret
|
||||||
|
|
||||||
INCBIN "baserom.gbc",$1CF0,$20AF - $1CF0
|
; clears a VRAM background map with blank space tiles
|
||||||
|
; INPUT: h - high byte of background tile map address in VRAM
|
||||||
|
ClearBgMap: ; 1CF0
|
||||||
|
ld a,$7f ; blank space
|
||||||
|
jr .next\@
|
||||||
|
ld a,l ; XXX does anything call this?
|
||||||
|
.next\@
|
||||||
|
ld de,$400 ; size of VRAM background map
|
||||||
|
ld l,e
|
||||||
|
.loop\@
|
||||||
|
ld [hli],a
|
||||||
|
dec e
|
||||||
|
jr nz,.loop\@
|
||||||
|
dec d
|
||||||
|
jr nz,.loop\@
|
||||||
|
ret
|
||||||
|
|
||||||
|
INCBIN "baserom.gbc",$1D01,$1F54 - $1D01
|
||||||
|
|
||||||
|
; initialization code
|
||||||
|
; explanation for %11100011 (value stored in rLCDC)
|
||||||
|
; * LCD enabled
|
||||||
|
; * Window tile map at $9C00
|
||||||
|
; * Window display enabled
|
||||||
|
; * BG and window tile data at $8800
|
||||||
|
; * BG tile map at $9800
|
||||||
|
; * 8x8 OBJ size
|
||||||
|
; * OBJ display enabled
|
||||||
|
; * BG display enabled
|
||||||
|
InitGame: ; 1F54
|
||||||
|
di
|
||||||
|
; zero I/O registers
|
||||||
|
xor a
|
||||||
|
ld [$ff0f],a
|
||||||
|
ld [$ffff],a
|
||||||
|
ld [$ff43],a
|
||||||
|
ld [$ff42],a
|
||||||
|
ld [$ff01],a
|
||||||
|
ld [$ff02],a
|
||||||
|
ld [$ff4b],a
|
||||||
|
ld [$ff4a],a
|
||||||
|
ld [$ff06],a
|
||||||
|
ld [$ff07],a
|
||||||
|
ld [$ff47],a
|
||||||
|
ld [$ff48],a
|
||||||
|
ld [$ff49],a
|
||||||
|
ld a,%10000000 ; enable LCD
|
||||||
|
ld [rLCDC],a
|
||||||
|
call DisableLCD ; why enable then disable?
|
||||||
|
ld sp,$dfff ; initialize stack pointer
|
||||||
|
ld hl,$c000 ; start of WRAM
|
||||||
|
ld bc,$2000 ; size of WRAM
|
||||||
|
.zeroWramLoop\@
|
||||||
|
ld [hl],0
|
||||||
|
inc hl
|
||||||
|
dec bc
|
||||||
|
ld a,b
|
||||||
|
or c
|
||||||
|
jr nz,.zeroWramLoop\@
|
||||||
|
call ZeroVram
|
||||||
|
ld hl,$ff80
|
||||||
|
ld bc,$007f
|
||||||
|
call $36e0 ; zero HRAM
|
||||||
|
call CleanLCD_OAM ; this is unnecessary since it was already cleared above
|
||||||
|
ld a,$01
|
||||||
|
ld [$ffb8],a
|
||||||
|
ld [$2000],a
|
||||||
|
call $4bed ; copy DMA code to HRAM
|
||||||
|
xor a
|
||||||
|
ld [$ffd7],a
|
||||||
|
ld [$ff41],a
|
||||||
|
ld [$ffae],a
|
||||||
|
ld [$ffaf],a
|
||||||
|
ld [$ff0f],a
|
||||||
|
ld a,%00001101 ; enable V-blank, timer, and serial interrupts
|
||||||
|
ld [rIE],a
|
||||||
|
ld a,$90 ; put the window off the screen
|
||||||
|
ld [$ffb0],a
|
||||||
|
ld [rWX],a
|
||||||
|
ld a,$07
|
||||||
|
ld [rWY],a
|
||||||
|
ld a,$ff
|
||||||
|
ld [$ffaa],a
|
||||||
|
ld h,$98
|
||||||
|
call ClearBgMap ; fill $9800-$9BFF (BG tile map) with $7F tiles
|
||||||
|
ld h,$9c
|
||||||
|
call ClearBgMap ; fill $9C00-$9FFF (Window tile map) with $7F tiles
|
||||||
|
ld a,%11100011
|
||||||
|
ld [rLCDC],a ; enabled LCD
|
||||||
|
ld a,$10
|
||||||
|
ld [$ff8a],a
|
||||||
|
call $200e
|
||||||
|
ei
|
||||||
|
ld a,$40
|
||||||
|
call Predef ; SGB border
|
||||||
|
ld a,$1f
|
||||||
|
ld [$c0ef],a
|
||||||
|
ld [$c0f0],a
|
||||||
|
ld a,$9c
|
||||||
|
ld [$ffbd],a
|
||||||
|
xor a
|
||||||
|
ld [$ffbc],a
|
||||||
|
dec a
|
||||||
|
ld [$cfcb],a
|
||||||
|
ld a,$32
|
||||||
|
call Predef ; display the copyrights, GameFreak logo, and battle animation
|
||||||
|
call DisableLCD
|
||||||
|
call ZeroVram
|
||||||
|
call $3ddc
|
||||||
|
call CleanLCD_OAM
|
||||||
|
ld a,%11100011
|
||||||
|
ld [rLCDC],a ; enable LCD
|
||||||
|
jp $42b7
|
||||||
|
|
||||||
|
; zeroes all VRAM
|
||||||
|
ZeroVram: ; 2004
|
||||||
|
ld hl,$8000
|
||||||
|
ld bc,$2000
|
||||||
|
xor a
|
||||||
|
jp $36e0
|
||||||
|
|
||||||
|
INCBIN "baserom.gbc",$200E,$20AF - $200E
|
||||||
|
|
||||||
DelayFrame: ; 20AF
|
DelayFrame: ; 20AF
|
||||||
; delay for one frame
|
; delay for one frame
|
||||||
|
|
@ -4101,7 +4293,7 @@ DisplayTextID: ; 2920
|
||||||
call $3865 ; wait for a button press after displaying all the text
|
call $3865 ; wait for a button press after displaying all the text
|
||||||
; loop to hold the dialogue box open as long as the player keeps holding down the A button
|
; loop to hold the dialogue box open as long as the player keeps holding down the A button
|
||||||
.holdBoxOpen\@
|
.holdBoxOpen\@
|
||||||
call $019a ; update joypad state
|
call GetJoypadState
|
||||||
ld a,[$ffb4]
|
ld a,[$ffb4]
|
||||||
bit 0,a ; is the A button being pressed?
|
bit 0,a ; is the A button being pressed?
|
||||||
jr nz,.holdBoxOpen\@
|
jr nz,.holdBoxOpen\@
|
||||||
|
|
@ -5208,7 +5400,7 @@ MainMenu: ; 0x5af2
|
||||||
ld [$FFB3],a
|
ld [$FFB3],a
|
||||||
ld [$FFB2],a
|
ld [$FFB2],a
|
||||||
ld [$FFB4],a
|
ld [$FFB4],a
|
||||||
call $19A
|
call GetJoypadState
|
||||||
ld a,[$FFB4]
|
ld a,[$FFB4]
|
||||||
bit 0,a
|
bit 0,a
|
||||||
jr nz,.next5\@
|
jr nz,.next5\@
|
||||||
|
|
@ -5226,7 +5418,7 @@ MainMenu: ; 0x5af2
|
||||||
and a
|
and a
|
||||||
jp z,$5D5F
|
jp z,$5D5F
|
||||||
ld a,[W_CURMAP] ; map ID
|
ld a,[W_CURMAP] ; map ID
|
||||||
cp a,$76 ; Hall of Fame
|
cp a,HALL_OF_FAME
|
||||||
jp nz,$5D5F
|
jp nz,$5D5F
|
||||||
xor a
|
xor a
|
||||||
ld [$D71A],a
|
ld [$D71A],a
|
||||||
|
|
|
||||||
|
|
@ -717,10 +717,15 @@ H_RAND2 EQU $FFD4
|
||||||
H_WHOSETURN EQU $FFF3 ; 0 on player’s turn, 1 on enemy’s turn
|
H_WHOSETURN EQU $FFF3 ; 0 on player’s turn, 1 on enemy’s turn
|
||||||
|
|
||||||
; hardware registers, from the pandocs http://nocash.emubase.de/pandocs.htm
|
; hardware registers, from the pandocs http://nocash.emubase.de/pandocs.htm
|
||||||
|
rJOYP EQU $FF00
|
||||||
rDIV EQU $FF04
|
rDIV EQU $FF04
|
||||||
|
rLCDC EQU $FF40
|
||||||
rBGP EQU $FF47
|
rBGP EQU $FF47
|
||||||
rOBP0 EQU $FF48
|
rOBP0 EQU $FF48
|
||||||
rOBP1 EQU $FF49
|
rOBP1 EQU $FF49
|
||||||
|
rWX EQU $FF4A
|
||||||
|
rWY EQU $FF4B
|
||||||
|
rIE EQU $FFFF
|
||||||
|
|
||||||
|
|
||||||
; pokemon name constants
|
; pokemon name constants
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue