diff options
-rw-r--r-- | constants/wram_constants.asm | 32 | ||||
-rwxr-xr-x | engine/main_menu.asm | 2 | ||||
-rwxr-xr-x | engine/math.asm | 4 | ||||
-rwxr-xr-x | engine/move_mon.asm | 6 | ||||
-rw-r--r-- | home.asm | 398 | ||||
-rw-r--r-- | home/math.asm | 47 | ||||
-rwxr-xr-x | home/print_num.asm | 303 | ||||
-rwxr-xr-x | home/print_text.asm | 149 | ||||
-rw-r--r-- | home/text.asm | 2 | ||||
-rw-r--r-- | wram.asm | 2 |
10 files changed, 514 insertions, 431 deletions
diff --git a/constants/wram_constants.asm b/constants/wram_constants.asm index 77fd516b..6b739c6c 100644 --- a/constants/wram_constants.asm +++ b/constants/wram_constants.asm @@ -14,18 +14,26 @@ AUTO_INPUT EQU $ff const TEMPMON ; 3 const WILDMON ; 4 -; wOptions: ; cfcc -FAST_TEXT EQU 0 -MED_TEXT EQU 1 -SLOW_TEXT EQU 2 -NO_TEXT_SCROLL EQU 4 -; bits -STEREO EQU 5 -BATTLE_SHIFT EQU 6 -BATTLE_SCENE EQU 7 - -; Options2: -MENU_ACCOUNT EQU 0 +; wOptions:: ; cfcc +TEXT_DELAY_MASK EQU %111 + const_def 4 + const NO_TEXT_SCROLL ; 4 + const STEREO ; 5 + const BATTLE_SHIFT ; 6 + const BATTLE_SCENE ; 7 + +TEXT_DELAY_FAST EQU %001 ; 1 +TEXT_DELAY_MED EQU %011 ; 3 +TEXT_DELAY_SLOW EQU %101 ; 5 + +; wOptions2:: + const_def + const MENU_ACCOUNT ; 0 + +; wTextboxFlags:: + const_def + const FAST_TEXT_DELAY_F ; 0 + const NO_TEXT_DELAY_F ; 1 ; GBPrinter: PRINT_LIGHTEST EQU $00 diff --git a/engine/main_menu.asm b/engine/main_menu.asm index 08242ad1..7e22a02e 100755 --- a/engine/main_menu.asm +++ b/engine/main_menu.asm @@ -8,7 +8,7 @@ MainMenu_: call PlayMusic .asm_5a60 xor a - ld [wc1d6], a + ld [wDisableTextAcceleration], a call Function5bf7 ld b, $8 call GetSGBLayout diff --git a/engine/math.asm b/engine/math.asm index 7cc35eb4..6f584edf 100755 --- a/engine/math.asm +++ b/engine/math.asm @@ -1,4 +1,4 @@ -Multiply_:: ; 67bd +_Multiply:: ; 67bd ; hMultiplier is one byte. ld a, 8 @@ -80,7 +80,7 @@ Multiply_:: ; 67bd ret -Divide_:: ; 681d +_Divide:: ; 681d xor a ld [hMathBuffer + 0], a ld [hMathBuffer + 1], a diff --git a/engine/move_mon.asm b/engine/move_mon.asm index 70e62498..aae1390b 100755 --- a/engine/move_mon.asm +++ b/engine/move_mon.asm @@ -1130,7 +1130,7 @@ RemoveMonFromPartyOrBox: ; e03f (3:603f) jr z, .asm_e096 ld bc, sBoxMonNicknames .asm_e096 - call Function3231 + call CopyDataUntil ld hl, wPartyMon1 ld bc, PARTYMON_STRUCT_LENGTH ld a, [wPokemonWithdrawDepositParameter] @@ -1156,7 +1156,7 @@ RemoveMonFromPartyOrBox: ; e03f (3:603f) add hl, bc ld bc, wPartyMonOT .asm_e0c9 - call Function3231 + call CopyDataUntil ld hl, wPartyMonNicknames ld a, [wPokemonWithdrawDepositParameter] and a @@ -1176,7 +1176,7 @@ RemoveMonFromPartyOrBox: ; e03f (3:603f) jr z, .asm_e0f3 ld bc, sBoxEnd .asm_e0f3 - call Function3231 + call CopyDataUntil .asm_e0f6 ld a, [wPokemonWithdrawDepositParameter] and a @@ -179,394 +179,20 @@ IsInArray:: .InArray: scf ret - -INCLUDE "home/math.asm" - -Function31e2:: ; 31e2 (0:31e2) - ld a, [wOptions] - bit 4, a - ret nz - ld a, [wTextboxFlags] - bit 1, a - ret z - push hl - push de - push bc - ld hl, hOAMUpdate - ld a, [hl] - push af - ld [hl], a - ld a, [wTextboxFlags] - bit 0, a - jr z, .asm_3205 - ld a, [wOptions] - and $7 - jr .asm_3207 - -.asm_3205 - ld a, $1 -.asm_3207 - ld [wTextDelayFrames], a -.asm_320a - call GetJoypad - ld a, [wc1d6] - and a - jr nz, .asm_3224 - ld a, [hJoyDown] - bit 0, a - jr z, .asm_321b - jr .asm_321f - -.asm_321b - bit 1, a - jr z, .asm_3224 -.asm_321f - call DelayFrame - jr .asm_322a - -.asm_3224 - ld a, [wTextDelayFrames] - and a - jr nz, .asm_320a -.asm_322a - pop af - ld [hOAMUpdate], a - pop bc - pop de - pop hl - ret - -Function3231:: -.asm_3231 - ld a, [hli] - ld [de], a - inc de - ld a, h - cp b - jr nz, .asm_3231 - ld a, l - cp c - jr nz, .asm_3231 - ret - -PrintNum:: ; 323d (0:323d) - push bc - bit 5, b - jr z, .asm_324f - bit 7, b - jr nz, .asm_324a - bit 6, b - jr z, .asm_324f -.asm_324a - ld a, $f0 - ld [hli], a - res 5, b -.asm_324f - xor a - ld [hPrintNum1], a - ld [hMultiplicand], a - ld [hStringCmpString2], a - ld a, b - and $f - cp $1 - jr z, .asm_3277 - cp $2 - jr z, .asm_326e - ld a, [de] - ld [hQuotient], a - inc de - ld a, [de] - ld [hPrintNum3], a - inc de - ld a, [de] - ld [hPrintNum4], a - jr .asm_327a - -.asm_326e - ld a, [de] - ld [hStringCmpString2], a - inc de - ld a, [de] - ld [hPrintNum4], a - jr .asm_327a - -.asm_3277 - ld a, [de] - ld [hPrintNum4], a -.asm_327a - push de - ld d, b - ld a, c - swap a - and $f - ld e, a - ld a, c - and $f - ld b, a - ld c, $0 - cp $2 - jr z, .asm_32f2 - cp $3 - jr z, .asm_32e2 - cp $4 - jr z, .asm_32d1 - cp $5 - jr z, .asm_32c0 - cp $6 - jr z, .asm_32ae - ld a, $f - ld [hMultiplier], a - ld a, $42 - ld [hPrintNum6], a - ld a, $40 - ld [hPrintNum7], a - call Function3341 - call Function33c0 -.asm_32ae - ld a, $1 - ld [hPrintNum5], a - ld a, $86 - ld [hPrintNum6], a - ld a, $a0 - ld [hPrintNum7], a - call Function3341 - call Function33c0 -.asm_32c0 - xor a - ld [hRemainder], a - ld a, $27 - ld [hMathBuffer], a - ld a, $10 - ld [hPrintNum7], a - call Function3341 - call Function33c0 -.asm_32d1 - xor a - ld [hMultiplier], a - ld a, $3 - ld [hPrintNum6], a - ld a, $e8 - ld [hPrintNum7], a - call Function3341 - call Function33c0 -.asm_32e2 - xor a - ld [hMultiplier], a - xor a - ld [hMathBuffer], a - ld a, $64 - ld [hPrintNum7], a - call Function3341 - call Function33c0 -.asm_32f2 - dec e - jr nz, .asm_32f9 - ld a, $f6 - ld [hPastLeadingZeroes], a -.asm_32f9 - ld c, $0 - ld a, [hPrintNum4] -.asm_32fd - cp $a - jr c, .asm_3306 - sub $a - inc c - jr .asm_32fd - -.asm_3306 - ld b, a - ld a, [hPrintNum1] - or c - jr nz, .asm_3311 - call Function33ba - jr .asm_3323 - -.asm_3311 - call Function3330 - push af - ld a, $f6 - add c - ld [hl], a - pop af - ld [hDividend], a - inc e - dec e - jr nz, .asm_3323 - inc hl - ld [hl], $e8 -.asm_3323 - call Function33c0 - call Function3330 - ld a, $f6 - add b - ld [hli], a - pop de - pop bc - ret - -Function3330:: ; 3330 (0:3330) - push af - ld a, [hPastLeadingZeroes] - and a - jr nz, .asm_333f - bit 5, d - jr z, .asm_333f - ld a, $f0 - ld [hli], a - res 5, d -.asm_333f - pop af - ret - -Function3341:: ; 3341 (0:3341) - dec e - jr nz, .asm_3348 - ld a, $f6 - ld [hProduct], a -.asm_3348 - ld c, $0 -.asm_334a - ld a, [hPrintNum5] - ld b, a - ld a, [hMultiplicand] - ld [hPrintNum8], a - cp b - jr c, .asm_339a - sub b - ld [hPrintNum2], a - ld a, [hPrintNum6] - ld b, a - ld a, [hPrintNum3] - ld [hPrintNum9], a - cp b - jr nc, .asm_336c - ld a, [hPrintNum2] - or $0 - jr z, .asm_3396 - dec a - ld [hPrintNum2], a - ld a, [hStringCmpString2] -.asm_336c - sub b - ld [hPrintNum3], a - ld a, [hPrintNum7] - ld b, a - ld a, [hPrintNum4] - ld [hPrintNum10], a - cp b - jr nc, .asm_338c - ld a, [hStringCmpString2] - and a - jr nz, .asm_3387 - ld a, [hQuotient] - and a - jr z, .asm_3392 - dec a - ld [hMultiplicand], a - xor a -.asm_3387 - dec a - ld [hPrintNum3], a - ld a, [hPrintNum4] -.asm_338c - sub b - ld [hPrintNum4], a - inc c - jr .asm_334a - -.asm_3392 - ld a, [hPrintNum9] - ld [hStringCmpString2], a -.asm_3396 - ld a, [hPrintNum8] - ld [hPrintNum2], a -.asm_339a - ld a, [hDividend] - or c - jr z, Function33ba - ld a, [hPrintNum1] - and a - jr nz, .asm_33ad - bit 5, d - jr z, .asm_33ad - ld a, $f0 - ld [hli], a - res 5, d -.asm_33ad - ld a, $f6 - add c - ld [hl], a - ld [hPrintNum1], a - inc e - dec e - ret nz - inc hl - ld [hl], $e8 - ret - -Function33ba:: ; 33ba (0:33ba) - bit 7, d - ret z - ld [hl], $f6 - ret - -Function33c0:: ; 33c0 (0:33c0) - bit 7, d - jr nz, .asm_33cc - bit 6, d - jr z, .asm_33cc - ld a, [hProduct] + +SkipNames:: +; Skip a names. + ld bc, NAME_LENGTH and a ret z -.asm_33cc - inc hl - ret - -Function33ce:: -; Print c-digit hex number from de to hl -.asm_33ce - push bc - call Function33d7 - pop bc - dec c - jr nz, .asm_33ce - ret - -Function33d7:: ; 33d7 (0:33d7) - ld a, [de] - swap a - and $f - call Function33e9 - ld [hli], a - ld a, [de] - and $f - call Function33e9 - ld [hli], a - inc de - ret - -Function33e9:: ; 33e9 (0:33e9) - ld bc, .digits - add c - ld c, a - ld a, $0 - adc b - ld b, a - ld a, [bc] +.loop + add hl, bc + dec a + jr nz, .loop ret -.digits db "0123456789ABCDEF" - -FarPrintText:: - ld [wBuffer], a - ld a, [hROMBank] - push af - ld a, [wBuffer] - rst Bankswitch - call PrintText - pop af - rst Bankswitch - ret +INCLUDE "home/math.asm" +INCLUDE "home/print_text.asm" Function3414:: ld a, [hROMBank] @@ -1668,7 +1294,7 @@ PrintBCDNumber:: ; 3ade (0:3ade) inc hl .asm_3b0e ld [hl], $f6 - call Function31e2 + call PrintLetterDelay inc hl .asm_3b14 ret @@ -1689,7 +1315,7 @@ Function3b15:: ; 3b15 (0:3b15) .asm_3b29 add $f6 ld [hli], a - jp Function31e2 + jp PrintLetterDelay .asm_3b2f bit 7, b diff --git a/home/math.asm b/home/math.asm index ffa3c282..71de08f9 100644 --- a/home/math.asm +++ b/home/math.asm @@ -1,71 +1,68 @@ -SkipNames:: - ld bc, $b +AddNTimes:: +; Add bc * a to hl. and a ret z -.asm_319e +.loop add hl, bc dec a - jr nz, .asm_319e - ret - -AddNTimes:: ; 31a3 (0:31a3) - and a - ret z -.asm_31a5 - add hl, bc - dec a - jr nz, .asm_31a5 + jr nz, .loop ret SimpleMultiply:: +; Return a * c. and a ret z + push bc ld b, a xor a -.asm_31af +.loop add c dec b - jr nz, .asm_31af + jr nz, .loop pop bc ret - -SimpleDivide:: ; 31b5 (0:31b5) - ld b, $0 -.asm_31b7 + +SimpleDivide:: +; Divide a by c. Return quotient b and remainder a. + ld b, 0 +.loop inc b sub c - jr nc, .asm_31b7 + jr nc, .loop dec b add c ret Multiply:: +; Multiply hMultiplicand (3 bytes) by hMultiplier. Result in hProduct. +; All values are big endian. push hl push bc - callfar Multiply_ ; 1:67bd + callfar _Multiply pop bc pop hl ret Divide:: +; Divide hDividend length b (max 4 bytes) by hDivisor. Result in hQuotient. +; All values are big endian. push hl push de push bc - - homecall Divide_ ; 1:681d - + homecall _Divide pop bc pop de pop hl ret SubtractSigned:: +; Return a - b, sign in carry. sub b ret nc cpl - add $1 + add 1 scf ret diff --git a/home/print_num.asm b/home/print_num.asm new file mode 100755 index 00000000..70f07607 --- /dev/null +++ b/home/print_num.asm @@ -0,0 +1,303 @@ +PrintNum:: +; Print c digits of the b-byte value from de to hl. +; Allows 2 to 7 digits. For 1-digit numbers, add +; the value to char "0" instead of calling PrintNum. +; The high nybble of the c register specifies how many of the total amount of +; digits will be in front of the decimal point. +; Some extra flags can be given in bits 5-7 of b. +; Bit 5: money if set (unless left-aligned without leading zeros) +; Bit 6: left-aligned if set +; Bit 7: print leading zeros if set + + push bc + + bit 5, b + jr z, .main + bit 7, b + jr nz, .moneyflag + bit 6, b + jr z, .main + +.moneyflag ; 101xxxxx or 011xxxxx + ld a, "¥" + ld [hli], a + res 5, b ; 100xxxxx or 010xxxxx + +.main + xor a + ldh [$ffb5], a + ldh [$ffb6], a + ldh [$ffb7], a + ld a, b + and $f + cp 1 + jr z, .byte + cp 2 + jr z, .word +; maximum 3 bytes +.long + ld a, [de] + ldh [$ffb6], a + inc de + ld a, [de] + ldh [$ffb7], a + inc de + ld a, [de] + ldh [$ffb8], a + jr .start + +.word + ld a, [de] + ldh [$ffb7], a + inc de + ld a, [de] + ldh [$ffb8], a + jr .start + +.byte + ld a, [de] + ldh [$ffb8], a + +.start + push de + + ld d, b + ld a, c + swap a + and $f + ld e, a + ld a, c + and $f + ld b, a + ld c, 0 + cp 2 + jr z, .two + cp 3 + jr z, .three + cp 4 + jr z, .four + cp 5 + jr z, .five + cp 6 + jr z, .six + +.seven + ld a, HIGH(1000000 >> 8) + ldh [$ffb9], a + ld a, HIGH(1000000) ; mid + ldh [$ffba], a + ld a, LOW(1000000) + ldh [$ffbb], a + call .PrintDigit + call .AdvancePointer + +.six + ld a, HIGH(100000 >> 8) + ldh [$ffb9], a + ld a, HIGH(100000) ; mid + ldh [$ffba], a + ld a, LOW(100000) + ldh [$ffbb], a + call .PrintDigit + call .AdvancePointer + +.five + xor a ; HIGH(10000 >> 8) + ldh [$ffb9], a + ld a, HIGH(10000) ; mid + ldh [$ffba], a + ld a, LOW(10000) + ldh [$ffbb], a + call .PrintDigit + call .AdvancePointer + +.four + xor a ; HIGH(1000 >> 8) + ldh [$ffb9], a + ld a, HIGH(1000) ; mid + ldh [$ffba], a + ld a, LOW(1000) + ldh [$ffbb], a + call .PrintDigit + call .AdvancePointer + +.three + xor a ; HIGH(100 >> 8) + ldh [$ffb9], a + xor a ; HIGH(100) ; mid + ldh [$ffba], a + ld a, LOW(100) + ldh [$ffbb], a + call .PrintDigit + call .AdvancePointer + +.two + dec e + jr nz, .two_skip + ld a, "0" + ldh [$ffb5], a + +.two_skip + ld c, 0 + ldh a, [$ffb8] + +.mod_10 + cp 10 + jr c, .modded_10 + sub 10 + inc c + jr .mod_10 + +.modded_10 + ld b, a + ldh a, [$ffb5] + or c + jr nz, .money + call .PrintLeadingZero + jr .money_leading_zero + +.money + call .PrintYen + push af + ld a, "0" + add c + ld [hl], a + pop af + ldh [$ffb5], a + inc e + dec e + jr nz, .money_leading_zero + inc hl + ld [hl], $e8 + +.money_leading_zero + call .AdvancePointer + call .PrintYen + ld a, "0" + add b + ld [hli], a + + pop de + pop bc + ret + +.PrintYen: + push af + ldh a, [$ffb5] + and a + jr nz, .stop + bit 5, d + jr z, .stop + ld a, "¥" + ld [hli], a + res 5, d + +.stop + pop af + ret + +.PrintDigit: + dec e + jr nz, .ok + ld a, "0" + ldh [$ffb5], a +.ok + ld c, 0 +.loop + ldh a, [$ffb9] + ld b, a + ldh a, [$ffb6] + ldh [$ffbc], a + cp b + jr c, .skip1 + sub b + ldh [$ffb6], a + ldh a, [$ffba] + ld b, a + ldh a, [$ffb7] + ldh [$ffbd], a + cp b + jr nc, .skip2 + ldh a, [$ffb6] + or 0 + jr z, .skip3 + dec a + ldh [$ffb6], a + ldh a, [$ffb7] +.skip2 + sub b + ldh [$ffb7], a + ldh a, [$ffbb] + ld b, a + ldh a, [$ffb8] + ldh [$ffbe], a + cp b + jr nc, .skip4 + ldh a, [$ffb7] + and a + jr nz, .skip5 + ldh a, [$ffb6] + and a + jr z, .skip6 + dec a + ldh [$ffb6], a + xor a +.skip5 + dec a + ldh [$ffb7], a + ldh a, [$ffb8] +.skip4 + sub b + ldh [$ffb8], a + inc c + jr .loop +.skip6 + ldh a, [$ffbd] + ldh [$ffb7], a +.skip3 + ldh a, [$ffbc] + ldh [$ffb6], a +.skip1 + ldh a, [$ffb5] + or c + jr z, .PrintLeadingZero + ldh a, [$ffb5] + and a + jr nz, .done + bit 5, d + jr z, .done + ld a, "¥" + ld [hli], a + res 5, d +.done + ld a, "0" + add c + ld [hl], a + ldh [$ffb5], a + inc e + dec e + ret nz + inc hl + ld [hl], $e8 + ret + +.PrintLeadingZero: +; prints a leading zero unless they are turned off in the flags + bit 7, d ; print leading zeroes? + ret z + ld [hl], "0" + ret + +.AdvancePointer: +; increments the pointer unless leading zeroes are not being printed, +; the number is left-aligned, and no nonzero digits have been printed yet + bit 7, d ; print leading zeroes? + jr nz, .inc + bit 6, d ; left alignment or right alignment? + jr z, .inc + ldh a, [$ffb5] + and a + ret z +.inc + inc hl + ret
\ No newline at end of file diff --git a/home/print_text.asm b/home/print_text.asm new file mode 100755 index 00000000..31cbd744 --- /dev/null +++ b/home/print_text.asm @@ -0,0 +1,149 @@ +PrintLetterDelay:: +; Wait before printing the next letter. + +; The text speed setting in wOptions is actually a frame count: +; fast: 1 frame +; mid: 3 frames +; slow: 5 frames + +; wTextboxFlags[!0] and A or B override text speed with a one-frame delay. +; wOptions[4] and wTextboxFlags[!1] disable the delay. + + ld a, [wOptions] + bit NO_TEXT_SCROLL, a + ret nz + +; non-scrolling text? + ld a, [wTextboxFlags] + bit NO_TEXT_DELAY_F, a + ret z + + push hl + push de + push bc + + ld hl, hOAMUpdate + ld a, [hl] + push af + +; orginally turned oam update off... +; ld a, 1 + ld [hl], a + +; force fast scroll? + ld a, [wTextboxFlags] + bit FAST_TEXT_DELAY_F, a + jr z, .fast + +; text speed + ld a, [wOptions] + and %111 + jr .updatedelay + +.fast + ld a, TEXT_DELAY_FAST + +.updatedelay + ld [wTextDelayFrames], a + +.checkjoypad + call GetJoypad + +; input override + ld a, [wDisableTextAcceleration] + and a + jr nz, .wait + +; Wait one frame if holding A or B. + ldh a, [hJoyDown] + bit A_BUTTON_F, a + jr z, .checkb + jr .delay +.checkb + bit B_BUTTON_F, a + jr z, .wait + +.delay + call DelayFrame + jr .end + +.wait + ld a, [wTextDelayFrames] + and a + jr nz, .checkjoypad + +.end + pop af + ldh [hOAMUpdate], a + pop bc + pop de + pop hl + ret + +CopyDataUntil:: +; Copy [hl .. bc) to de. + +; In other words, the source data is +; from hl up to but not including bc, +; and the destination is de. + + ld a, [hli] + ld [de], a + inc de + ld a, h + cp b + jr nz, CopyDataUntil + ld a, l + cp c + jr nz, CopyDataUntil + ret + +INCLUDE "home/print_num.asm" + +Function33ce:: +; Print c-digit hex number from de to hl +.asm_33ce + push bc + call Function33d7 + pop bc + dec c + jr nz, .asm_33ce + ret + +Function33d7:: ; 33d7 (0:33d7) + ld a, [de] + swap a + and $f + call Function33e9 + ld [hli], a + ld a, [de] + and $f + call Function33e9 + ld [hli], a + inc de + ret + +Function33e9:: ; 33e9 (0:33e9) + ld bc, .digits + add c + ld c, a + ld a, $0 + adc b + ld b, a + ld a, [bc] + ret + +.digits db "0123456789ABCDEF" + +FarPrintText:: + ld [wBuffer], a + ld a, [hROMBank] + push af + ld a, [wBuffer] + rst Bankswitch + + call PrintText + + pop af + rst Bankswitch + ret
\ No newline at end of file diff --git a/home/text.asm b/home/text.asm index a1bc5b08..d1cee382 100644 --- a/home/text.asm +++ b/home/text.asm @@ -247,7 +247,7 @@ endm call Diacritic .place ld [hli], a - call Function31e2 + call PrintLetterDelay jp NextChar print_name: macro @@ -138,7 +138,7 @@ wMapTimeOfDay:: ds 1 ; c1cf wPrinterConnectionOpen:: ds 1 wPrinterOpcode:: ds 1 ; c1d4 wc1d5:: ds 1 ; c1d5 -wc1d6:: ds 1 ; c1d6 +wDisableTextAcceleration:: ds 1 ; c1d6 wc1d7:: ds 1 ; c1d7 wc1d8:: ds 1 ; c1d8 wc1d9:: ds 1 ; c1d9 |