pokecrystal-board/engine/credits.asm

622 lines
9.1 KiB
NASM
Raw Normal View History

2018-01-08 21:36:15 -08:00
INCLUDE "constants.asm"
2013-02-25 21:51:05 -08:00
SECTION "Credits", ROMX
2013-02-25 21:51:05 -08:00
2015-11-26 18:05:32 -08:00
Credits:: ; 109847
2015-12-14 17:06:41 -08:00
bit 6, b ; Hall Of Fame
ld a, $0
2015-12-14 17:06:41 -08:00
jr z, .okay
ld a, $40
2015-12-14 17:06:41 -08:00
.okay
2015-10-24 16:49:19 -07:00
ld [wJumptableIndex], a
ld a, [rSVBK]
push af
ld a, BANK(wGBCPalettes)
ld [rSVBK], a
2015-11-11 20:38:57 -08:00
call ClearBGPalettes
call ClearTileMap
call ClearSprites
2015-12-14 17:06:41 -08:00
ld hl, wCreditsFaux2bpp
ld c, $80
ld de, $ff00
2015-12-14 17:06:41 -08:00
.load_loop
ld a, e
ld [hli], a
ld a, d
ld [hli], a
dec c
2015-12-14 17:06:41 -08:00
jr nz, .load_loop
ld de, CreditsBorderGFX
2017-12-28 04:32:33 -08:00
ld hl, vTiles2 tile $20
2018-01-14 16:43:35 -08:00
lb bc, BANK(CreditsBorderGFX), 9
call Request2bpp
ld de, CopyrightGFX
2017-12-28 04:32:33 -08:00
ld hl, vTiles2 tile $60
2018-01-14 16:43:35 -08:00
lb bc, BANK(CopyrightGFX), 29
call Request2bpp
ld de, TheEndGFX
2017-12-28 04:32:33 -08:00
ld hl, vTiles2 tile $40
2018-01-14 16:43:35 -08:00
lb bc, BANK(TheEndGFX), 16
call Request2bpp
ld a, $ff
2015-12-14 17:06:41 -08:00
ld [wCreditsBorderFrame], a
xor a
2015-12-14 17:06:41 -08:00
ld [wCreditsBorderMon], a
2015-12-14 17:06:41 -08:00
call Credits_LoadBorderGFX
ld e, l
ld d, h
2017-12-28 04:32:33 -08:00
ld hl, vTiles2
2015-12-14 17:06:41 -08:00
lb bc, BANK(CreditsMonsGFX), 16
call Request2bpp
2015-12-14 17:06:41 -08:00
call ConstructCreditsTilemap
xor a
2015-12-14 17:06:41 -08:00
ld [wCreditsLYOverride], a
2018-01-23 14:39:09 -08:00
ld hl, wLYOverrides
ld bc, $100
xor a
call ByteFill
ld a, rSCX - $ff00
2016-06-13 19:53:33 -07:00
ld [hLCDCPointer], a
call GetCreditsPalette
2015-09-09 16:27:07 -07:00
call SetPalettes
2015-01-19 21:31:29 -08:00
ld a, [hVBlank]
push af
ld a, $5
2015-01-19 21:31:29 -08:00
ld [hVBlank], a
ld a, $1
2015-10-16 10:35:43 -07:00
ld [hInMenu], a
xor a
ld [hBGMapMode], a
2018-01-23 14:39:09 -08:00
ld [wCreditsPos], a
ld [wCreditsUnusedCD21], a
ld [wCreditsTimer], a
2015-12-14 17:06:41 -08:00
.execution_loop
call Credits_HandleBButton
call Credits_HandleAButton
jr nz, .exit_credits
2015-12-14 17:06:41 -08:00
call Credits_Jumptable
call DelayFrame
2015-12-14 17:06:41 -08:00
jr .execution_loop
2015-12-14 17:06:41 -08:00
.exit_credits
2015-11-11 20:38:57 -08:00
call ClearBGPalettes
xor a
2016-06-13 19:53:33 -07:00
ld [hLCDCPointer], a
ld [hBGMapAddress], a
pop af
2015-01-19 21:31:29 -08:00
ld [hVBlank], a
pop af
ld [rSVBK], a
ret
; 1098fd
2015-12-14 17:06:41 -08:00
Credits_HandleAButton: ; 1098fd
ld a, [hJoypadDown]
2015-12-14 17:06:41 -08:00
and A_BUTTON
ret z
2015-10-24 16:49:19 -07:00
ld a, [wJumptableIndex]
bit 7, a
ret
; 109908
2015-12-14 17:06:41 -08:00
Credits_HandleBButton: ; 109908
ld a, [hJoypadDown]
2015-12-14 17:06:41 -08:00
and B_BUTTON
ret z
2015-10-24 16:49:19 -07:00
ld a, [wJumptableIndex]
bit 6, a
ret z
2018-01-23 14:39:09 -08:00
ld hl, wCreditsPos
ld a, [hli]
cp $d
2015-12-14 17:06:41 -08:00
jr nc, .okay
ld a, [hli]
and a
ret z
2015-12-14 17:06:41 -08:00
.okay
2018-01-23 14:39:09 -08:00
ld hl, wCreditsTimer
ld a, [hl]
and a
ret z
dec [hl]
ret
; 109926
2015-12-14 17:06:41 -08:00
Credits_Jumptable: ; 109926
2015-10-24 16:49:19 -07:00
ld a, [wJumptableIndex]
and $f
ld e, a
ld d, 0
2015-12-14 17:06:41 -08:00
ld hl, .Jumptable
add hl, de
add hl, de
ld a, [hli]
ld h, [hl]
ld l, a
jp hl
; 109937
2015-12-14 17:06:41 -08:00
.Jumptable: ; 109937 (42:5937)
2015-12-26 18:59:03 -08:00
dw ParseCredits
dw Credits_Next
dw Credits_Next
dw Credits_PrepBGMapUpdate
dw Credits_UpdateGFXRequestPath
dw Credits_RequestGFX
dw Credits_LYOverride
dw Credits_Next
dw Credits_Next
dw Credits_Next
dw Credits_UpdateGFXRequestPath
dw Credits_RequestGFX
dw Credits_LoopBack
2015-12-14 17:06:41 -08:00
Credits_Next: ; 109951 (42:5951)
2015-10-24 16:49:19 -07:00
ld hl, wJumptableIndex
inc [hl]
ret
2015-12-14 17:06:41 -08:00
Credits_LoopBack: ; 109956 (42:5956)
2015-10-24 16:49:19 -07:00
ld hl, wJumptableIndex
ld a, [hl]
and $f0
ld [hl], a
ret
2015-12-14 17:06:41 -08:00
Credits_PrepBGMapUpdate: ; 10995e (42:595e)
xor a
ld [hBGMapMode], a
2015-12-14 17:06:41 -08:00
jp Credits_Next
2015-12-14 17:06:41 -08:00
Credits_UpdateGFXRequestPath: ; 109964 (42:5964)
call Credits_LoadBorderGFX
ld a, l
2018-01-23 14:39:09 -08:00
ld [wRequested2bppSource], a
ld a, h
2018-01-23 14:39:09 -08:00
ld [wRequested2bppSource + 1], a
2017-12-28 04:32:33 -08:00
ld a, LOW(vTiles2)
2018-01-23 14:39:09 -08:00
ld [wRequested2bppDest], a
2017-12-28 04:32:33 -08:00
ld a, HIGH(vTiles2)
2018-01-23 14:39:09 -08:00
ld [wRequested2bppDest + 1], a
2015-12-14 17:06:41 -08:00
jr Credits_RequestGFX
2015-12-14 17:06:41 -08:00
Credits_RequestGFX: ; 10997b (42:597b)
xor a
ld [hBGMapMode], a
ld a, $8
2018-01-23 14:39:09 -08:00
ld [wRequested2bpp], a
2015-12-14 17:06:41 -08:00
jp Credits_Next
2015-12-14 17:06:41 -08:00
Credits_LYOverride: ; 109986 (42:5986)
ld a, [rLY]
cp $30
2015-12-14 17:06:41 -08:00
jr c, Credits_LYOverride
ld a, [wCreditsLYOverride]
dec a
dec a
2015-12-14 17:06:41 -08:00
ld [wCreditsLYOverride], a
2018-01-23 14:39:09 -08:00
ld hl, wLYOverrides + $1f
2015-12-14 17:06:41 -08:00
call .Fill
2018-01-23 14:39:09 -08:00
ld hl, wLYOverrides + $87
2015-12-14 17:06:41 -08:00
call .Fill
jp Credits_Next
2015-12-14 17:06:41 -08:00
.Fill: ; 1099a3 (42:59a3)
ld c, $8
2015-12-14 17:06:41 -08:00
.loop
ld [hli], a
dec c
2015-12-14 17:06:41 -08:00
jr nz, .loop
ret
; 1099aa
2013-02-25 21:51:05 -08:00
ParseCredits: ; 1099aa
2015-10-24 16:49:19 -07:00
ld hl, wJumptableIndex
2013-02-25 21:51:05 -08:00
bit 7, [hl]
jp nz, .done
2013-02-25 21:51:05 -08:00
; Wait until the timer has run out to parse the next command.
2018-01-23 14:39:09 -08:00
ld hl, wCreditsTimer
2013-02-25 21:51:05 -08:00
ld a, [hl]
and a
jr z, .parse
2013-02-25 21:51:05 -08:00
; One tick has passed.
dec [hl]
jp .done
2013-02-25 21:51:05 -08:00
.parse
; First, let's clear the current text display,
; starting from line 5.
xor a
2015-11-09 13:41:09 -08:00
ld [hBGMapMode], a
2013-02-25 21:51:05 -08:00
hlcoord 0, 5
ld bc, 20 * 12
ld a, " "
call ByteFill
2013-02-25 21:51:05 -08:00
; Then read the script.
2013-02-25 21:51:05 -08:00
.loop
call .get
2013-02-25 21:51:05 -08:00
; Commands:
2013-11-27 21:55:32 -08:00
cp CREDITS_END
2013-02-25 21:51:05 -08:00
jp z, .end
cp CREDITS_WAIT
jr z, .wait
cp CREDITS_SCENE
jr z, .scene
cp CREDITS_CLEAR
jr z, .clear
cp CREDITS_MUSIC
jr z, .music
cp CREDITS_WAIT2
jr z, .wait2
cp CREDITS_THEEND
jr z, .theend
2013-02-25 21:51:05 -08:00
; If it's not a command, it's a string identifier.
2013-02-25 21:51:05 -08:00
push af
ld e, a
ld d, 0
ld hl, CreditsStrings
add hl, de
add hl, de
2013-02-25 21:51:05 -08:00
ld a, [hli]
ld d, [hl]
ld e, a
pop af
2013-02-25 21:51:05 -08:00
; Strings spanning multiple lines have special cases.
2013-02-25 21:51:05 -08:00
cp COPYRIGHT
jr z, .copyright
2013-02-25 21:51:05 -08:00
cp STAFF
jr c, .staff
2013-02-25 21:51:05 -08:00
; The rest start from line 6.
hlcoord 0, 6
jr .print
2013-02-25 21:51:05 -08:00
.copyright
hlcoord 2, 6
jr .print
2013-02-25 21:51:05 -08:00
.staff
hlcoord 0, 6
2013-02-25 21:51:05 -08:00
.print
; Print strings spaced every two lines.
call .get
ld bc, 20 * 2
call AddNTimes
call PlaceString
jr .loop
2013-02-25 21:51:05 -08:00
.theend
; Display "The End" graphic.
2015-12-14 17:06:41 -08:00
call Credits_TheEnd
2013-02-25 21:51:05 -08:00
jr .loop
2013-02-25 21:51:05 -08:00
.scene
; Update the scene number and corresponding palette.
call .get
2015-12-14 17:06:41 -08:00
ld [wCreditsBorderMon], a ; scene
2013-02-25 21:51:05 -08:00
xor a
2015-12-14 17:06:41 -08:00
ld [wCreditsBorderFrame], a ; frame
2013-02-25 21:51:05 -08:00
call GetCreditsPalette
2015-09-09 16:27:07 -07:00
call SetPalettes ; update hw pal registers
2013-02-25 21:51:05 -08:00
jr .loop
2013-02-25 21:51:05 -08:00
.clear
; Clear the banner.
ld a, $ff
2015-12-14 17:06:41 -08:00
ld [wCreditsBorderFrame], a ; frame
2013-02-25 21:51:05 -08:00
jr .loop
2013-02-25 21:51:05 -08:00
.music
; Play the credits music.
ld de, MUSIC_CREDITS
push de
ld de, MUSIC_NONE
2013-10-08 10:21:15 -07:00
call PlayMusic
2013-02-25 21:51:05 -08:00
call DelayFrame
pop de
2013-10-08 10:21:15 -07:00
call PlayMusic
2013-02-25 21:51:05 -08:00
jp .loop
2013-02-25 21:51:05 -08:00
.wait2
; Wait for some amount of ticks.
call .get
2018-01-23 14:39:09 -08:00
ld [wCreditsTimer], a
2013-02-25 21:51:05 -08:00
jr .done
2013-02-25 21:51:05 -08:00
.wait
; Wait for some amount of ticks, and do something else.
call .get
2018-01-23 14:39:09 -08:00
ld [wCreditsTimer], a
2013-02-25 21:51:05 -08:00
xor a
2015-11-09 13:41:09 -08:00
ld [hBGMapThird], a
2013-02-25 21:51:05 -08:00
ld a, 1
2015-11-09 13:41:09 -08:00
ld [hBGMapMode], a
2013-02-25 21:51:05 -08:00
.done
2015-12-14 17:06:41 -08:00
jp Credits_Next
2013-02-25 21:51:05 -08:00
.end
; Stop execution.
2015-10-24 16:49:19 -07:00
ld hl, wJumptableIndex
2013-02-25 21:51:05 -08:00
set 7, [hl]
2015-12-14 17:06:41 -08:00
ld a, 32
2018-01-23 14:39:09 -08:00
ld [wMusicFade], a
ld a, LOW(MUSIC_POST_CREDITS)
2018-01-23 14:39:09 -08:00
ld [wMusicFadeID], a
ld a, HIGH(MUSIC_POST_CREDITS)
2018-01-23 14:39:09 -08:00
ld [wMusicFadeID + 1], a
2013-02-25 21:51:05 -08:00
ret
.get
2018-01-23 14:39:09 -08:00
; Get byte wCreditsPos from CreditsScript
2013-02-25 21:51:05 -08:00
push hl
push de
2018-01-23 14:39:09 -08:00
ld a, [wCreditsPos]
2013-02-25 21:51:05 -08:00
ld e, a
2018-01-23 14:39:09 -08:00
ld a, [wCreditsPos+1]
2013-02-25 21:51:05 -08:00
ld d, a
ld hl, CreditsScript
add hl, de
2013-02-25 21:51:05 -08:00
inc de
ld a, e
2018-01-23 14:39:09 -08:00
ld [wCreditsPos], a
2013-02-25 21:51:05 -08:00
ld a, d
2018-01-23 14:39:09 -08:00
ld [wCreditsPos+1], a
2013-02-25 21:51:05 -08:00
ld a, [hl]
pop de
pop hl
ret
; 109a95
2015-12-14 17:06:41 -08:00
ConstructCreditsTilemap: ; 109a95 (42:5a95)
2013-10-01 21:53:35 -07:00
xor a
ld [hBGMapMode], a
2013-10-01 21:53:35 -07:00
ld a, $c
ld [hBGMapAddress], a
2015-12-14 17:06:41 -08:00
2013-10-01 21:53:35 -07:00
ld a, $28
hlcoord 0, 0
2015-12-14 17:06:41 -08:00
ld bc, SCREEN_HEIGHT * SCREEN_WIDTH
2013-10-01 21:53:35 -07:00
call ByteFill
2015-12-14 17:06:41 -08:00
2013-10-01 21:53:35 -07:00
ld a, $7f
hlcoord 0, 4
2015-12-14 17:06:41 -08:00
ld bc, (SCREEN_HEIGHT - 4) * SCREEN_WIDTH
2013-10-01 21:53:35 -07:00
call ByteFill
2015-12-14 17:06:41 -08:00
hlcoord 0, 4
2013-10-01 21:53:35 -07:00
ld a, $24
2015-12-14 17:06:41 -08:00
call DrawCreditsBorder
hlcoord 0, 17
2013-10-01 21:53:35 -07:00
ld a, $20
2015-12-14 17:06:41 -08:00
call DrawCreditsBorder
2018-01-23 14:39:09 -08:00
hlcoord 0, 0, wAttrMap
2015-12-14 17:06:41 -08:00
ld bc, 4 * SCREEN_WIDTH
2013-10-01 21:53:35 -07:00
xor a
call ByteFill
2015-12-14 17:06:41 -08:00
2018-01-23 14:39:09 -08:00
hlcoord 0, 4, wAttrMap
2015-12-14 17:06:41 -08:00
ld bc, SCREEN_WIDTH
2013-10-01 21:53:35 -07:00
ld a, $1
call ByteFill
2015-12-14 17:06:41 -08:00
2018-01-23 14:39:09 -08:00
hlcoord 0, 5, wAttrMap
2015-12-14 17:06:41 -08:00
ld bc, 12 * SCREEN_WIDTH
2013-10-01 21:53:35 -07:00
ld a, $2
call ByteFill
2015-12-14 17:06:41 -08:00
2018-01-23 14:39:09 -08:00
hlcoord 0, 17, wAttrMap
2015-12-14 17:06:41 -08:00
ld bc, SCREEN_WIDTH
2013-10-01 21:53:35 -07:00
ld a, $1
call ByteFill
2015-12-14 17:06:41 -08:00
2015-12-11 13:59:40 -08:00
call WaitBGMap2
2013-10-01 21:53:35 -07:00
xor a
ld [hBGMapMode], a
ld [hBGMapAddress], a
hlcoord 0, 0
2015-12-14 17:06:41 -08:00
call .InitTopPortion
2015-12-11 13:59:40 -08:00
call WaitBGMap2
2013-10-01 21:53:35 -07:00
ret
2015-12-14 17:06:41 -08:00
.InitTopPortion: ; 109aff (42:5aff)
ld b, 5
.outer_loop
2013-10-01 21:53:35 -07:00
push hl
2015-12-14 17:06:41 -08:00
ld de, SCREEN_WIDTH - 3
ld c, 4
2013-10-01 21:53:35 -07:00
xor a
2015-12-14 17:06:41 -08:00
.inner_loop
rept 3
2013-10-01 21:53:35 -07:00
ld [hli], a
inc a
2015-12-14 17:06:41 -08:00
endr
2013-10-01 21:53:35 -07:00
ld [hl], a
inc a
add hl, de
dec c
2015-12-14 17:06:41 -08:00
jr nz, .inner_loop
2013-10-01 21:53:35 -07:00
pop hl
2015-07-20 19:18:18 -07:00
rept 4
2013-10-01 21:53:35 -07:00
inc hl
2015-07-20 19:18:18 -07:00
endr
2013-10-01 21:53:35 -07:00
dec b
2015-12-14 17:06:41 -08:00
jr nz, .outer_loop
2013-10-01 21:53:35 -07:00
ret
2013-02-25 21:51:05 -08:00
2015-12-14 17:06:41 -08:00
DrawCreditsBorder: ; 109b1d (42:5b1d)
ld c, SCREEN_WIDTH / 4
.loop
2013-10-01 21:53:35 -07:00
push af
2015-12-14 17:06:41 -08:00
rept 3
2013-10-01 21:53:35 -07:00
ld [hli], a
inc a
2015-12-14 17:06:41 -08:00
endr
2013-10-01 21:53:35 -07:00
ld [hli], a
pop af
dec c
2015-12-14 17:06:41 -08:00
jr nz, .loop
2013-10-01 21:53:35 -07:00
ret
2013-02-25 21:51:05 -08:00
GetCreditsPalette: ; 109b2c
call .GetPalAddress
2013-02-25 21:51:05 -08:00
push hl
ld a, 0
call .UpdatePals
pop hl
ret
.GetPalAddress:
2013-02-25 21:51:05 -08:00
; Each set of palette data is 24 bytes long.
2015-12-14 17:06:41 -08:00
ld a, [wCreditsBorderMon] ; scene
2018-01-11 09:00:01 -08:00
and %11
2013-02-25 21:51:05 -08:00
add a
add a ; * 8
add a
ld e, a
ld d, 0
2013-11-24 01:09:17 -08:00
ld hl, CreditsPalettes
2013-02-25 21:51:05 -08:00
add hl, de
add hl, de ; * 3
add hl, de
ret
.UpdatePals:
2013-02-25 21:51:05 -08:00
; Update the first three colors in both palette buffers.
push af
push hl
2018-01-01 06:08:21 -08:00
add LOW(wBGPals1)
2013-02-25 21:51:05 -08:00
ld e, a
ld a, 0
2018-01-01 06:08:21 -08:00
adc HIGH(wBGPals1)
2013-02-25 21:51:05 -08:00
ld d, a
ld bc, 24
call CopyBytes
2013-02-25 21:51:05 -08:00
pop hl
pop af
2018-01-01 06:08:21 -08:00
add LOW(wBGPals2)
2013-02-25 21:51:05 -08:00
ld e, a
ld a, 0
2018-01-01 06:08:21 -08:00
adc HIGH(wBGPals2)
2013-02-25 21:51:05 -08:00
ld d, a
ld bc, 24
call CopyBytes
ret
2013-11-24 01:09:17 -08:00
CreditsPalettes:
INCLUDE "gfx/credits/credits.pal"
2013-02-25 21:51:05 -08:00
; 109bca
2015-12-14 17:06:41 -08:00
Credits_LoadBorderGFX: ; 109bca (42:5bca)
ld hl, wCreditsBorderFrame
ld a, [hl]
cp $ff
2015-12-14 17:06:41 -08:00
jr z, .init
2013-11-24 01:09:17 -08:00
2018-01-11 09:00:01 -08:00
and %11
ld e, a
inc a
2018-01-11 09:00:01 -08:00
and %11
ld [hl], a
2015-12-14 17:06:41 -08:00
ld a, [wCreditsBorderMon]
2018-01-11 09:00:01 -08:00
and %11
add a
add a
add e
add a
ld e, a
2013-11-24 01:09:17 -08:00
ld d, 0
2015-12-14 17:06:41 -08:00
ld hl, .Frames
add hl, de
ld a, [hli]
ld h, [hl]
ld l, a
ret
2013-11-24 01:09:17 -08:00
2015-12-14 17:06:41 -08:00
.init
ld hl, wCreditsFaux2bpp
ret
; 109bf1 (42:5bf1)
2015-12-14 17:06:41 -08:00
.Frames: ; 109bf1
2013-11-24 01:09:17 -08:00
dw CreditsPichuGFX
2015-12-14 17:06:41 -08:00
dw CreditsPichuGFX + 16 tiles
dw CreditsPichuGFX + 32 tiles
dw CreditsPichuGFX + 48 tiles
2013-11-24 01:09:17 -08:00
dw CreditsSmoochumGFX
2015-12-14 17:06:41 -08:00
dw CreditsSmoochumGFX + 16 tiles
dw CreditsSmoochumGFX + 32 tiles
dw CreditsSmoochumGFX + 48 tiles
2013-11-24 01:09:17 -08:00
dw CreditsDittoGFX
2015-12-14 17:06:41 -08:00
dw CreditsDittoGFX + 16 tiles
dw CreditsDittoGFX + 32 tiles
dw CreditsDittoGFX + 48 tiles
2013-11-24 01:09:17 -08:00
dw CreditsIgglybuffGFX
2015-12-14 17:06:41 -08:00
dw CreditsIgglybuffGFX + 16 tiles
dw CreditsIgglybuffGFX + 32 tiles
dw CreditsIgglybuffGFX + 48 tiles
2013-11-24 01:09:17 -08:00
; 109c11
2015-12-14 17:06:41 -08:00
Credits_TheEnd: ; 109c11 (42:5c11)
ld a, $40
hlcoord 6, 9
2015-12-14 17:06:41 -08:00
call .Load
hlcoord 6, 10
2015-12-14 17:06:41 -08:00
.Load: ; 109c1c (42:5c1c)
ld c, 8
.loop
ld [hli], a
inc a
dec c
2015-12-14 17:06:41 -08:00
jr nz, .loop
ret
; 109c24 (42:5c24)
2013-02-25 21:51:05 -08:00
2017-12-26 17:02:00 -08:00
CreditsBorderGFX: INCBIN "gfx/credits/border.2bpp"
CreditsMonsGFX:
CreditsPichuGFX: INCBIN "gfx/credits/pichu.2bpp"
CreditsSmoochumGFX: INCBIN "gfx/credits/smoochum.2bpp"
CreditsDittoGFX: INCBIN "gfx/credits/ditto.2bpp"
CreditsIgglybuffGFX: INCBIN "gfx/credits/igglybuff.2bpp"
INCLUDE "data/credits_script.asm"
INCLUDE "data/credits_strings.asm"