million-perfect-letters/src/ui.demo.a

315 lines
6.9 KiB
Plaintext

;license:MIT
;(c) 2020-2 by 4am
;
; self-running demo
;
; Public functions:
; - RunDemo
;
DemoDispatchLo
!byte <DemoOnEXIT
!byte <DemoOnLOAD
!byte <DemoOnSHOW
!byte <DemoOnHIDE
!byte <DemoOnLEFT
!byte <DemoOnRIGHT
!byte <DemoOnUP
!byte <DemoOnDOWN
!byte <DemoOnWAIT
!byte <DemoOnNEXT
!byte <DemoOnTYPE
DemoDispatchHi
!byte >DemoOnEXIT
!byte >DemoOnLOAD
!byte >DemoOnSHOW
!byte >DemoOnHIDE
!byte >DemoOnLEFT
!byte >DemoOnRIGHT
!byte >DemoOnUP
!byte >DemoOnDOWN
!byte >DemoOnWAIT
!byte >DemoOnNEXT
!byte >DemoOnTYPE
; opcodes
EXIT = 0
LOAD = 1
SHOW = 2
HIDE = 3
LEFT = 4
RIGHT = 5
UP = 6
DOWN = 7
WAIT = 8
NEXT = 9
TYPE = 10
DemoCode
!byte WAIT ,20
!byte HIDE
!byte LOAD ,0,0
!byte WAIT ,30
!byte HIDE
!byte DOWN
!byte WAIT ,2
!byte RIGHT
!byte WAIT ,2
!byte RIGHT
!byte WAIT ,2
!byte DOWN
; A C
; --v-
; LOUD
; ----
; ITLE
; B H
!byte SHOW ,<sHelpHeader1,>sHelpHeader1
!byte WAIT ,30
!byte HIDE
!byte LEFT
!byte WAIT ,2
!byte LEFT
!byte WAIT ,2
!byte UP
!byte WAIT ,2
!byte RIGHT
!byte WAIT ,2
!byte DOWN
!byte WAIT ,2
!byte DOWN
!byte WAIT ,2
!byte RIGHT
!byte WAIT ,2
!byte DOWN
!byte WAIT ,2
!byte RIGHT
!byte WAIT ,2
!byte DOWN
; OC
; TUD
; ---v
; ABLE
; ----
; L H
; I
!byte WAIT ,30
!byte DOWN
!byte WAIT ,2
!byte LEFT
!byte UP
!byte WAIT ,2
!byte UP
!byte WAIT ,2
!byte LEFT
!byte WAIT ,2
!byte UP
!byte WAIT ,2
!byte LEFT
!byte WAIT ,2
!byte DOWN
!byte WAIT ,2
!byte DOWN
; A D
; LO E
; v---
; ITCH
; ----
; BU
; L
!byte NEXT
!byte SHOW ,<sHelpHeader2,>sHelpHeader2
!byte WAIT ,30
!byte HIDE
!byte LOAD ,1,4
!byte WAIT ,30
!byte HIDE
!byte TYPE ,2
!byte WAIT ,20
!byte TYPE ,3
!byte WAIT ,20
!byte TYPE ,0
!byte WAIT ,20
!byte TYPE ,1
!byte NEXT
!byte LOAD ,2,1
!byte WAIT ,30
!byte HIDE
!byte TYPE ,2
!byte WAIT ,20
!byte TYPE ,1
!byte WAIT ,20
!byte TYPE ,0
!byte NEXT
!byte LOAD ,3,6
!byte WAIT ,30
!byte HIDE
!byte TYPE ,3
!byte WAIT ,20
!byte TYPE ,1
!byte WAIT ,20
!byte TYPE ,2
!byte WAIT ,20
!byte TYPE ,0
!byte NEXT
!byte LOAD ,4,11
!byte WAIT ,30
!byte HIDE
!byte TYPE ,1
!byte WAIT ,20
!byte TYPE ,3
!byte WAIT ,20
!byte TYPE ,0
!byte WAIT ,20
!byte TYPE ,4
!byte WAIT ,20
!byte TYPE ,2
!byte NEXT
!byte LOAD ,5,3
!byte WAIT ,30
!byte HIDE
!byte TYPE ,0
!byte WAIT ,20
!byte TYPE ,1
!byte WAIT ,20
!byte TYPE ,2
!byte NEXT
!byte EXIT
;------------------------------------------------------------------------------
; RunDemo
; run self-running demo until keypress or completion
;
; in: none
; out: Z = 0
; all other registers & flags clobbered
;------------------------------------------------------------------------------
RunDemo
jsr Home
lda #7
sta targetVTAB
lda #10
sta minHTAB
+LDADDR sDemoIntro
jsr HeavySilkReveal
jsr SetShowingMessage
jsr LoadDemoPuzzles
+LDADDR DemoCode
+ST16 GetNextDemoByte+1
- jsr GetNextDemoByte
lda DemoDispatchLo, x
sta @j+1
lda DemoDispatchHi, x
sta @j+2
@j jsr $FDFD ; SMC
lda KBD
bpl -
jsr DemoOnEXIT ; does not return
LoadDemoPuzzles
+LDADDR demoPuzzles
+ST16 $FC
+LDADDR WORLDDATA
+ST16 $FE
ldx #2
ldy #0
- lda ($FC), y
sta ($FE), y
iny
bne -
inc $FD
inc $FF
dex
bne -
jmp PreParseWorldData
DrawDemoPuzzleChrome
+PRINT_AT sDemo, 2, 33
lda gPuzzleID
clc
adc #$31
sta @s+1
+LDADDR @s
jsr DrawHeavySilkString
jmp DrawPuzzleChromeCommon
@s !byte 1,$FD
DemoOnEXIT
; out: pops 2 bytes off stack
; A = FF
; Z = 0
; other flags & registers unknown, assume clobbered
pla
pla
lda #$FF
sta WorldFileLoaded ; invalidate cache
rts
DemoOnLOAD
jsr GetNextDemoByte
stx gPuzzleID
jsr GetNextDemoByte
stx gWorldID
lda kWorldLeftMargins, x
sta GlobalLeftMargin
lda kPuzzleWidths, x
jsr InitPuzzleStorage
jsr InitPuzzleSound
ldx gPuzzleID
jsr LoadPuzzleFromMemory
lda #0
sta gSelectedLogicalColumn
jsr DrawDemoPuzzleChrome
jsr DrawPuzzle
jsr AnimatePuzzleIntoPlace
jmp DrawColumnSelectionIndicator
DemoOnSHOW
jsr GetNextDemoByte
txa
pha
jsr GetNextDemoByte
txa
tay
pla
jsr SetNextMessage
jmp ShowMessage
DemoOnHIDE=HideMessage
DemoOnLEFT=PlayEventLeftArrow
DemoOnRIGHT=PlayEventRightArrow
DemoOnUP=PlayEventUpArrow
DemoOnDOWN=PlayEventDownArrow
DemoOnWAIT
jsr GetNextDemoByte
jmp LongWaitForKeyWithTimeout
DemoOnNEXT=AnimatePuzzleCompleted
DemoOnTYPE
jsr GetNextDemoByte
txa
asl
asl
asl
- tax
pha
lda target_words, x
beq +
sta gLastKeyPressed
jsr PlayEventLetter
pla
clc
adc #1
bcc -
+ pla
rts
GetNextDemoByte
ldx $FDFD ; SMC
inc GetNextDemoByte+1
bne +
inc GetNextDemoByte+2
+ rts