shithub: pokered

Download patch

ref: 4c91afa8fdc07fa7d6be83f3fd24c2f171eeb684
parent: 5db0415c5bdc797c3ea46fd6ff082ce49f43b7e0
author: YamaArashi <shadow962@live.com>
date: Tue Jan 24 11:10:47 EST 2012

text command disasm

hg-commit-id: d23a5a12cc44


--- a/common.asm
+++ b/common.asm
@@ -3249,8 +3249,376 @@
 	pop bc
 	ret
 
-INCBIN "baserom.gbc",$1B40,$20AF - $1B40
+TextCommandProcessor: ; 1B40
+	ld a,[$d358]
+	push af
+	set 1,a
+	ld e,a
+	ld a,[$fff4]
+	xor e
+	ld [$d358],a
+	ld a,c
+	ld [$cc3a],a
+	ld a,b
+	ld [$cc3b],a
 
+NextTextCommand: ; 1B55
+	ld a,[hli]
+	cp a,$50 ; terminator
+	jr nz,.doTextCommand\@
+	pop af
+	ld [$d358],a
+	ret
+.doTextCommand\@
+	push hl
+	cp a,$17
+	jp z,TextCommand17
+	cp a,$0e
+	jp nc,TextCommand0B ; if a != 0x17 and a >= 0xE, go to command 0xB
+; if a < 0xE, use a jump table
+	ld hl,TextCommandJumpTable
+	push bc
+	add a
+	ld b,$00
+	ld c,a
+	add hl,bc
+	pop bc
+	ld a,[hli]
+	ld h,[hl]
+	ld l,a
+	jp [hl]
+
+; draw box
+; 04AAAABBCC
+; AAAA = address of upper left corner
+; BB = height
+; CC = width
+TextCommand04: ; 1B78
+	pop hl
+	ld a,[hli]
+	ld e,a
+	ld a,[hli]
+	ld d,a
+	ld a,[hli]
+	ld b,a
+	ld a,[hli]
+	ld c,a
+	push hl
+	ld h,d
+	ld l,e
+	call TextBoxBorder
+	pop hl
+	jr NextTextCommand
+
+; place string inline
+; 00{string}
+TextCommand00: ; 1B8A
+	pop hl
+	ld d,h
+	ld e,l
+	ld h,b
+	ld l,c
+	call PlaceString
+	ld h,d
+	ld l,e
+	inc hl
+	jr NextTextCommand
+
+; place string from RAM
+; 01AAAA
+; AAAA = address of string
+TextCommand01: ; 1B97
+	pop hl
+	ld a,[hli]
+	ld e,a
+	ld a,[hli]
+	ld d,a
+	push hl
+	ld h,b
+	ld l,c
+	call PlaceString
+	pop hl
+	jr NextTextCommand
+
+; print BCD number
+; 02AAAABB
+; AAAA = address of BCD number
+; BB
+; bits 0-4 = length in bytes
+; bits 5-7 = unknown flags
+TextCommand02: ; 1BA5
+	pop hl
+	ld a,[hli]
+	ld e,a
+	ld a,[hli]
+	ld d,a
+	ld a,[hli]
+	push hl
+	ld h,b
+	ld l,c
+	ld c,a
+	call $15cd
+	ld b,h
+	ld c,l
+	pop hl
+	jr NextTextCommand
+
+; repoint destination address
+; 03AAAA
+; AAAA = new destination address
+TextCommand03: ; 1BB7
+	pop hl
+	ld a,[hli]
+	ld [$cc3a],a
+	ld c,a
+	ld a,[hli]
+	ld [$cc3b],a
+	ld b,a
+	jp NextTextCommand
+
+; repoint destination to second line of dialogue text box
+; 05
+; (no arguments)
+TextCommand05: ; 1BC5
+	pop hl
+	ld bc,$c4e1 ; address of second line of dialogue text box
+	jp NextTextCommand
+
+; blink arrow and wait for A or B to be pressed
+; 06
+; (no arguments)
+TextCommand06: ; 1BCC
+	ld a,[W_ISLINKBATTLE]
+	cp a,$04
+	jp z,TextCommand0D
+	ld a,$ee ; down arrow
+	ld [$c4f2],a ; place down arrow in lower right corner of dialogue text box
+	push bc
+	call $3898 ; blink arrow and wait for A or B to be pressed
+	pop bc
+	ld a,$7f ; blank space
+	ld [$c4f2],a ; overwrite down arrow with blank space
+	pop hl
+	jp NextTextCommand
+
+; scroll text up one line
+; 07
+; (no arguments)
+TextCommand07: ; 1BE7
+	ld a,$7f ; blank space
+	ld [$c4f2],a ; place blank space in lower right corner of dialogue text box
+	call $1b18 ; scroll up text
+	call $1b18
+	pop hl
+	ld bc,$c4e1 ; address of second line of dialogue text box
+	jp NextTextCommand
+
+; execute asm inline
+; 08{code}
+TextCommand08: ; 1BF9
+	pop hl
+	ld de,NextTextCommand
+	push de ; return address
+	jp [hl]
+
+; print decimal number (converted from binary number)
+; 09AAAABB
+; AAAA = address of number
+; BB
+; bits 0-3 = how many digits to display
+; bits 4-7 = how long the number is in bytes
+TextCommand09: ; 1BFF
+	pop hl
+	ld a,[hli]
+	ld e,a
+	ld a,[hli]
+	ld d,a
+	ld a,[hli]
+	push hl
+	ld h,b
+	ld l,c
+	ld b,a
+	and a,$0f
+	ld c,a
+	ld a,b
+	and a,$f0
+	swap a
+	set 6,a
+	ld b,a
+	call $3c5f
+	ld b,h
+	ld c,l
+	pop hl
+	jp NextTextCommand
+
+; wait half a second if the user doesn't hold A or B
+; 0A
+; (no arguments)
+TextCommand0A: ; 1C1D
+	push bc
+	call $019a ; update joypad state
+	ld a,[$ffb4]
+	and a,%00000011 ; A and B buttons
+	jr nz,.skipDelay\@
+	ld c,30
+	call DelayFrames
+.skipDelay\@
+	pop bc
+	pop hl
+	jp NextTextCommand
+
+; plays sounds
+; this actually handles various command ID's, not just 0B
+; (no arguments)
+TextCommand0B: ; 1C31
+	pop hl
+	push bc
+	dec hl
+	ld a,[hli]
+	ld b,a ; b = command number that got us here
+	push hl
+	ld hl,TextCommandSounds
+.loop\@
+	ld a,[hli]
+	cp b
+	jr z,.matchFound\@
+	inc hl
+	jr .loop\@
+.matchFound\@
+	cp a,$14
+	jr z,.pokemonCry\@
+	cp a,$15
+	jr z,.pokemonCry\@
+	cp a,$16
+	jr z,.pokemonCry\@
+	ld a,[hl]
+	call $23b1
+	call $3748
+	pop hl
+	pop bc
+	jp NextTextCommand
+.pokemonCry\@
+	push de
+	ld a,[hl]
+	call $13d0
+	pop de
+	pop hl
+	pop bc
+	jp NextTextCommand
+
+; format: text command ID, sound ID or cry ID
+TextCommandSounds: ; 1C64
+db $0B,$86
+db $12,$9A
+db $0E,$91
+db $0F,$86
+db $10,$89
+db $11,$94
+db $13,$98
+db $14,$A8
+db $15,$97
+db $16,$78
+
+; draw ellipses
+; 0CAA
+; AA = number of ellipses to draw
+TextCommand0C: ; 1C78
+	pop hl
+	ld a,[hli]
+	ld d,a
+	push hl
+	ld h,b
+	ld l,c
+.loop\@
+	ld a,$75 ; ellipsis
+	ld [hli],a
+	push de
+	call $019a ; update joypad state
+	pop de
+	ld a,[$ffb4] ; joypad state
+	and a,%00000011 ; is A or B button pressed?
+	jr nz,.skipDelay\@ ; if so, skip the delay
+	ld c,10
+	call DelayFrames
+.skipDelay\@
+	dec d
+	jr nz,.loop\@
+	ld b,h
+	ld c,l
+	pop hl
+	jp NextTextCommand
+
+; wait for A or B to be pressed
+; 0D
+; (no arguments)
+TextCommand0D: ; 1C9A
+	push bc
+	call $3898 ; wait for A or B to be pressed
+	pop bc
+	pop hl
+	jp NextTextCommand
+
+; process text commands in another ROM bank
+; 17AAAABB
+; AAAA = address of text commands
+; BB = bank
+TextCommand17: ; 1CA3
+	pop hl
+	ld a,[$ffb8]
+	push af
+	ld a,[hli]
+	ld e,a
+	ld a,[hli]
+	ld d,a
+	ld a,[hli]
+	ld [$ffb8],a
+	ld [$2000],a
+	push hl
+	ld l,e
+	ld h,d
+	call TextCommandProcessor
+	pop hl
+	pop af
+	ld [$ffb8],a
+	ld [$2000],a
+	jp NextTextCommand
+
+TextCommandJumpTable: ; 1CC1
+dw TextCommand00
+dw TextCommand01
+dw TextCommand02
+dw TextCommand03
+dw TextCommand04
+dw TextCommand05
+dw TextCommand06
+dw TextCommand07
+dw TextCommand08
+dw TextCommand09
+dw TextCommand0A
+dw TextCommand0B
+dw TextCommand0C
+dw TextCommand0D
+
+; this function seems to be used only once
+; it store the address of a row and column of the VRAM background map in hl
+; INPUT: h - row, l - column, b - high byte of background tile map address in VRAM
+GetRowColAddressBgMap: ; 1CDD
+	xor a
+	srl h
+	rr a
+	srl h
+	rr a
+	srl h
+	rr a
+	or l
+	ld l,a
+	ld a,b
+	or h
+	ld h,a
+	ret
+
+INCBIN "baserom.gbc",$1CF0,$20AF - $1CF0
+
 DelayFrame: ; 20AF
 ; delay for one frame
 	ld a,1
@@ -4083,7 +4451,7 @@
 
 .loop\@
 	ld a,[de]
-	ldi [hl],a
+	ld [hli],a
 	inc de
 	inc c
 	cp a,$FF ; have we reached the end of the movement data?