summaryrefslogtreecommitdiffstats
path: root/from_toebes/passwd/passwd.asm
blob: 26ea9bfae4b3cc3ad720b5c22df862ce2906d096 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
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