diff options
Diffstat (limited to 'from_toebes/passwd/passwd.asm')
-rw-r--r-- | from_toebes/passwd/passwd.asm | 237 |
1 files changed, 237 insertions, 0 deletions
diff --git a/from_toebes/passwd/passwd.asm b/from_toebes/passwd/passwd.asm new file mode 100644 index 0000000..26ea9bf --- /dev/null +++ b/from_toebes/passwd/passwd.asm @@ -0,0 +1,237 @@ +;Name: Password +;Version: PASSWD +;Description: This is a simple number update/passwd program +;by John A. Toebes, VIII +; +;TIP: Download your watch faster: Download a WristApp once, then do not send it again. It stays in the watch! +;HelpFile: watchapp.hlp +;HelpTopic: 106 + INCLUDE "WRISTAPP.I" +; +; (1) Program specific constants +; +FLAGBYTE EQU $61 +; Bit 0 indicates which digit we are working on (SET=SECOND DIGIT) +; Bit 1 indicates that we need to clear the display first +; +DIGIT0 EQU $62 ; The first digit to enter +DIGIT1 EQU $63 ; The second digit to enter +;SYSTEMP0 EQU $A0 +;SYSTEMP1 EQU $A1 +; +; (2) System entry point vectors +; +START EQU * +L0110: jmp MAIN ; The main entry point - WRIST_MAIN +L0113: rts ; Called when we are suspended for any reason - WRIST_SUSPEND + nop + nop +L0116: rts ; Called to handle any timers or time events - WRIST_DOTIC + nop + nop +L0119: rts ; Called when the COMM app starts and we have timers pending - WRIST_INCOMM + nop + nop +L011c: rts ; Called when the COMM app loads new data - WRIST_NEWDATA + nop + nop + +L011f: lda STATETAB0,X ; The state table get routine - WRIST_GETSTATE + rts + +L0123: jmp HANDLE_STATE0 + db STATETAB0-STATETAB0 +L0127: jmp HANDLE_STATE1 + db STATETAB1-STATETAB0 +; +; (3) Program strings +S6_TOEBES: timex6 "TOEBES" +S6_SAMPLE: timex6 "SAMPLE" +S6_PRESS: timex6 "PRESS " +S8_PASSWORD: timex "PASSWORD" +SX_MESSAGE timex "BY JOHN A. TOEBES, VIII" + db SEPARATOR +; +; (4) State Table +; +STATETAB0: + db 0 + db EVT_ENTER,TIM_2_8TIC,0 ; Initial state + db EVT_TIMER2,TIM_ONCE,0 ; The timer from the enter event + db EVT_RESUME,TIM_ONCE,0 ; Resume from a nested app + db EVT_MODE,TIM_ONCE,$FF ; Mode button + db EVT_SET,TIM_ONCE,1 ; SET button pressed + db EVT_END + +STATETAB1: + db 1 + db EVT_RESUME,TIM_ONCE,1 ; Resume from a nested app + db EVT_DNANY4,TIM_ONCE,1 ; NEXT, PREV, SET, MODE button pressed + db EVT_UPANY4,TIM_ONCE,1 ; NEXT, PREV, SET, MODE button released + db EVT_USER2,TIM_ONCE,0 + db EVT_END +; +; (5) State Table 0 Handler +; This is called to process the state events. +; We see ENTER, TIMER2, and RESUME events +; +HANDLE_STATE0: + bset 1,APP_FLAGS ; Indicate that we can be suspended + lda BTNSTATE ; Get the event + cmp #EVT_ENTER ; Is this our initial entry? + bne REFRESH0 +; +; This is the initial event for starting us +; +DO_ENTER + bclr 1,FLAGBYTE ; Indicate that we need to clear the display + jsr CLEARSYM ; Clear the display + lda #S6_TOEBES-START + jsr PUT6TOP + lda #S6_SAMPLE-START + jsr PUT6MID + ; JMM the original had + ; lda #S8_PASSWORD + ; JMM this doesn't work on my hardware and I think it's a bug, + ; JMM instead + lda #S8_PASSWORD-START + ; JMM WFM + jmp BANNER8 +; +; We come here for a RESUME or TIMER2 event. For this we want to reset the display +; +REFRESH0 + brset 1,FLAGBYTE,NOCLEAR0 ; Do we need to clear the display first? + bset 1,FLAGBYTE + jsr CLEARSYM +NOCLEAR0 + lda #S6_PRESS-START + jsr PUT6TOP + lda #SYS6_SET + jsr PUTMSG2 + lda #SX_MESSAGE-START + jmp SETUP_SCROLL +; +; (6) State Table 1 Handler +; This is called to process the state events. +; We see SET, RESUME, DNANY4, and UPANY4 events +; +HANDLE_STATE1: + bset 1,APP_FLAGS ; Indicate that we can be suspended + lda BTNSTATE ; Get the event + cmp #EVT_UPANY4 + beq REFRESH + cmp #EVT_DNANY4 ; Is this our initial entry? + bne FORCEFRESH + lda BTN_PRESSED ; Let's see what the button they pressed was + cmp #EVT_PREV ; How about the PREV button + beq DO_PREV ; handle it + cmp #EVT_NEXT ; Maybe the NEXT button? + beq DO_NEXT ; Deal with it! + cmp #EVT_MODE ; Perhaps the MODE button + beq DO_MODE ; If so, handle it + ; It must be the set button, so take us out of this state + lda #EVT_USER2 + jmp POSTEVENT +; +; (7) Our real working code... +DO_NEXT + bset 0,SYSFLAGS ; Mark our update direction as up + bra DO_UPD +DO_PREV + bclr 0,SYSFLAGS ; Mark our update direction as down +DO_UPD + clra + sta UPDATE_MIN ; Our low end is 0 + lda #99 + sta UPDATE_MAX ; and the high end is 99 (the max since this is a 2 digit value) + brset 0,FLAGBYTE,UPD1 + ldx DIGIT1 + jsr FMTXLEAD0 + jsr PUTMID34 + ldx #DIGIT0 ; Point to our value to be updated + lda #UPD_MID12 ; Request updating in the middle of the display + bra UPD2 +UPD1 + ldx DIGIT0 + jsr FMTXLEAD0 + jsr PUTMID12 + ldx #DIGIT1 + lda #UPD_MID34 +UPD2 + jsr START_UPDATEP ; And prepare the update routine + bset 4,BTNFLAGS ; Mark that the update is now pending + bclr 1,FLAGBYTE + lda #SYS8_SET_MODE + jmp PUTMSGBOT + +DO_MODE + lda FLAGBYTE + eor #1 + sta FLAGBYTE + +REFRESH + brset 1,FLAGBYTE,NOCLEAR ; Do we need to clear the display first? +FORCEFRESH + jsr CLEARALL ; Yes, clear everything before we start + bset 1,FLAGBYTE ; And remember that we have already done that +NOCLEAR + bclr 7,BTNFLAGS ; Turn off any update routine that might be pending + brset 0,FLAGBYTE,SET1 + ldx DIGIT1 + jsr FMTXLEAD0 + jsr PUTMID34 + ldx #DIGIT0 + lda #BLINK_MID12 + bra SET2 +SET1 + ldx DIGIT0 + jsr FMTXLEAD0 + jsr PUTMID12 + ldx #DIGIT1 + lda #BLINK_MID34 +SET2 + jsr START_BLINKP + bset 2,BTNFLAGS ; Mark a blink routine as pending + rts +; +; (8) This is the main initialization routine which is called when we first get the app into memory +; +MAIN: + lda #$c0 ; We want button beeps and to indicate that we have been loaded + sta WRISTAPP_FLAGS + clr FLAGBYTE ; start with a clean slate + clr DIGIT0 + clr DIGIT1 + rts +; +; (9) This subroutine is useful for getting a scrolling string on the screen +; +;---------------------------------------------------------------------- +; Routine: +; SETUP_SCROLL +; Parameters: +; X - Offset from Start to the string +; Returns: +; MSGBUF - contains copied string +; Purpose +; This copies the current string into MSGBUF and calls the appropriate routines +; to start it scrolling on the bottom line. +;---------------------------------------------------------------------- +SETUP_SCROLL: + clr SYSTEMP0 + sta SYSTEMP1 +DO_COPY: + ldx SYSTEMP1 ; Get the pointer to the source character + lda START,X ; Get the character that we are copying + ldx SYSTEMP0 ; Get the pointer to the output buffer + sta MSGBUF,X ; and store the character away + inc SYSTEMP0 ; Increment our count + inc SYSTEMP1 ; As well as the pointer to the character + cmp #SEPARATOR ; Did we get a terminator character + bne DO_COPY ; No, go back for more + ; + ; The string is now in a buffer terminated by a separator character + ; + jsr PUTSCROLLMSG ; Initialize the scrolling support + jmp SCROLLMSG ; And tell it to actually start scrolling |