diff options
author | YamaArashi <shadow962@live.com> | 2012-01-24 16:10:47 -0800 |
---|---|---|
committer | YamaArashi <shadow962@live.com> | 2012-01-24 16:10:47 -0800 |
commit | 4c91afa8fdc07fa7d6be83f3fd24c2f171eeb684 (patch) | |
tree | a3038c9dfe1ed04324b4303990989d925f9ddc9b | |
parent | 5db0415c5bdc797c3ea46fd6ff082ce49f43b7e0 (diff) |
text command disasm
hg-commit-id: d23a5a12cc44
-rw-r--r-- | common.asm | 372 |
1 files changed, 370 insertions, 2 deletions
@@ -3249,7 +3249,375 @@ ProtectedDelay3: ; 0x1b3a 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 @@ -4083,7 +4451,7 @@ MoveSprite: ; 363A .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? |