support letter input with autoscroll

This commit is contained in:
4am
2020-05-03 14:43:03 -04:00
parent d570f3ac55
commit 17e5e09ab1
4 changed files with 175 additions and 59 deletions

View File

@@ -124,13 +124,50 @@ CheckForTargetWord
sec
rts
lettertofind = $FD
FindLetterInColumn
; in: A = letter (0x41..0x5A)
; Y = logical column to search
; out: C clear if letter was found in given column
; out: C clear if letter was found in given column, and
; A = #$FF if letter was found below center column
; A = #$01 if letter was found above center column
; A = #$00 if letter was found in center column
; C set if letter was not found
; TODO maybe calculate how far to scroll and return that?
sec
; clobbers A/X
; preserves Y
; clobbers $FD,$FE,$FF
ldx #$01
- cmp puzzle_data0, y
beq @down
cmp puzzle_data1, y
beq @down
cmp puzzle_data2, y
beq @down
cmp puzzle_data3, y
beq @down
cmp puzzle_data4, y
beq @even
cmp puzzle_data5, y
beq @up
cmp puzzle_data6, y
beq @up
cmp puzzle_data7, y
beq @up
cmp puzzle_data8, y
beq @up
ora #$80 ; check for used letters now
dex
beq - ; will only branch back once
sec ; no matches on used or unused letters, so we're done
rts
@down clc
lda #$01
rts
@up clc
lda #$FF
rts
@even clc
lda #$00
rts
ScrollPuzzleDown

View File

@@ -5,8 +5,6 @@
;
GlobalLeftMargin
; TODO other values for smaller puzzles
; $0A for 7-letter puzzles
!byte $0A
Home

View File

@@ -76,7 +76,7 @@ SelectWorld
+ST16 $FE
lda #0
sta counter
sta selectedworld ; TODO set selected world from prefs
sta selectedworld
lda #6
sta VTAB
- lda #10

View File

@@ -11,14 +11,18 @@
; - AnimatePuzzleCompleted
;
; codes returned from PlayEventLoop to explain why the event loop ended
kCompletedPuzzle = 1
kRequestedRestart = 2
; Codes returned by play event handlers
kKeepPlaying = 0 ; This code is checked with BEQ/BNE, so it must be 0
kCompletedPuzzle = 1 ; All non-zero codes will exit play event loop
kRequestedRestart = 2 ; with the code in A so caller knows what happened
kPressedEsc = 3
gSelectedLogicalColumn
!byte 0
gLastKeyPressed
!byte 0
kWorldLeftMargins
!byte 15,13,12,10
!byte 15,13,12,10
@@ -32,6 +36,36 @@ kWorldRightMargins
kStartingColor
!byte $D5,$AA
kPlayKeys
!byte $0B ; up arrow
!byte $0A ; down arrow
!byte $08 ; left arrow
!byte $15 ; right arrow
!byte $1B ; Esc
!byte $12 ; Ctrl-R
!byte $0D ; Return
!byte $00 ; A-Z
kPlayKeyHandlersLo
!byte <PlayEventUpArrow
!byte <PlayEventDownArrow
!byte <PlayEventLeftArrow
!byte <PlayEventRightArrow
!byte <PlayEventEsc
!byte <PlayEventCtrlR
!byte <PlayEventReturn
!byte <PlayEventLetter
kPlayKeyHandlersHi
!byte >PlayEventUpArrow
!byte >PlayEventDownArrow
!byte >PlayEventLeftArrow
!byte >PlayEventRightArrow
!byte >PlayEventEsc
!byte >PlayEventCtrlR
!byte >PlayEventReturn
!byte >PlayEventLetter
;------------------------------------------------------------------------------
; PlayEventLoop
; main event loop for playing a puzzle
@@ -47,29 +81,78 @@ PlayEventLoop
bpl -
bit CLEARKBD
and #$7F
cmp #$0B ; up arrow
beq @eventUpArrow
cmp #$0A ; down arrow
beq @eventDownArrow
cmp #$08 ; left arrow
beq @eventLeftArrow
cmp #$15 ; right arrow
beq @eventRightArrow
cmp #$1B ; Esc
beq @eventEsc
cmp #$12 ; Ctrl-R
beq @eventCtrlR
sta gLastKeyPressed
ldx #0
- ldy kPlayKeys, x
beq @checkForLetter
cpy gLastKeyPressed
beq @dispatch
inx
bne -
@checkForLetter
cmp #$61
bcc +
cmp #$7B
bcs PlayEventLoop
and #$DF
sta gLastKeyPressed
+ cmp #$41
bcc +
bcc PlayEventLoop
cmp #$5B
bcs +
jmp @eventLetter
+ jmp PlayEventLoop
bcs PlayEventLoop
@dispatch
lda kPlayKeyHandlersLo, x
sta @j+1
lda kPlayKeyHandlersHi, x
sta @j+2
@j jsr $FDFD ; SMC
beq PlayEventLoop
rts
@eventLeftArrow
PlayEventEsc
lda #kPressedEsc ; caller will exit play event loop
rts
PlayEventCtrlR
lda #kRequestedRestart ; caller will exit play event loop
rts
PlayEventReturn
ldy gSelectedLogicalColumn
beq +
jsr EraseColumnSelectionIndicator
jmp MoveToFirstColumn
+ lda #kKeepPlaying
rts
PlayEventUpArrow
ldy gSelectedLogicalColumn
jsr ScrollPuzzleUp
bcs @fail
jsr ScrollUp
jsr CheckForTargetWord
bcs @done
jsr MarkTargetWord
jmp CheckForPuzzleComplete
@fail jsr SoftBell
@done lda #kKeepPlaying
rts
PlayEventDownArrow
ldy gSelectedLogicalColumn
jsr ScrollPuzzleDown
bcs @fail
jsr ScrollDown
jsr CheckForTargetWord
bcs @done
jsr MarkTargetWord
jmp CheckForPuzzleComplete
@fail jsr SoftBell
@done lda #kKeepPlaying
rts
PlayEventLeftArrow
ldy gSelectedLogicalColumn
jsr EraseColumnSelectionIndicator
bne +
@@ -77,54 +160,46 @@ PlayEventLoop
+ dey
sty gSelectedLogicalColumn
jsr DrawColumnSelectionIndicator
jmp PlayEventLoop
lda #kKeepPlaying
rts
@eventRightArrow
PlayEventRightArrow
ldy gSelectedLogicalColumn
jsr EraseColumnSelectionIndicator
iny
cpy puzzle_logical_width
bcc +
MoveToFirstColumn
ldy #0
+ sty gSelectedLogicalColumn
jsr DrawColumnSelectionIndicator
jmp PlayEventLoop
lda #kKeepPlaying
rts
@eventLetter
PlayEventLetter
lda gLastKeyPressed
ldy gSelectedLogicalColumn
jsr FindLetterInColumn
; TODO
jmp PlayEventLoop
@eventEsc
lda #kPressedEsc
bcc +
jsr SoftBell ; didn't find letter, we're done
lda #kKeepPlaying
rts
@eventCtrlR
lda #kRequestedRestart
rts
@eventUpArrow
ldy gSelectedLogicalColumn
jsr ScrollPuzzleUp
bcs @fail
jsr ScrollUp
jsr CheckForTargetWord
bcc @foundTargetWord
bcs @done
@fail jsr SoftBell
@done jmp PlayEventLoop
@eventDownArrow
ldy gSelectedLogicalColumn
+ beq PlayEventRightArrow ; found letter but it's already on center row, we're done, exit through right arrow handler
bmi @up ; scroll up or down ONCE, then reassess
jsr ScrollPuzzleDown
bcs @fail
jsr ScrollDown
jsr CheckForTargetWord
bcc @foundTargetWord
bcs @done
jmp +
@up jsr ScrollPuzzleUp
jsr ScrollUp
+ jsr CheckForTargetWord
bcs PlayEventLetter ; no word, check if more scrolling is required
jsr MarkTargetWord ; show that we've finished a word
jsr CheckForPuzzleComplete
beq PlayEventLetter ; if puzzle isn't complete, check if more scrolling is required
rts ; puzzle is complete, return to caller with A = kCompletedPuzzle
@foundTargetWord
MarkTargetWord
; TODO animation here?
ldx #4
ldy #0
- lda puzzle_data4, y
@@ -132,9 +207,15 @@ PlayEventLoop
iny
cpy puzzle_logical_width
bne -
; TODO sound here?
rts
CheckForPuzzleComplete
jsr IsPuzzleComplete
bcs @done
bcs +
lda #kCompletedPuzzle
+HIDE_NEXT_2_BYTES
+ lda #kKeepPlaying
rts
;------------------------------------------------------------------------------