;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 ; 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 !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 !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