mirror of
https://github.com/a2-4am/million-perfect-letters.git
synced 2024-06-13 04:29:31 +00:00
315 lines
6.9 KiB
Plaintext
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
|