summaryrefslogtreecommitdiffstats
path: root/update/update.asm
blob: 930fcec2981e648f72170b32fdbdee2180b0b4de (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
;Name: Update	
;Version: UPDATE	
;Description: This is a simple number update 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 1 indicates that we need to clear the display first	
;	
CURVAL  EQU   $62  	; The current value we are displaying	
;	
; (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     STATETAB,X ; The state table get routine - WRIST_GETSTATE	
        rts	
	
L0123:  jmp     HANDLE_STATE0	
        db      STATETAB-STATETAB	
;	
; (3) Program strings	
S6_UPDATE:      timex6  "UPDATE"	
S6_SAMPLE:      timex6  "SAMPLE"	
;	
; (4) State Table	
;	
STATETAB:	
        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_DNANY4,TIM_ONCE,0           ; NEXT, PREV, SET, MODE button pressed	
        db      EVT_UPANY4,TIM_ONCE,0           ; NEXT, PREV, SET, MODE button released	
        db      EVT_END	
;	
; (5) State Table 0 Handler	
; This is called to process the state events.	
; We see ENTER, TIMER2, RESUME, DNANY4 and UPANY4 events	
;	
HANDLE_STATE0:	
        bset    1,APP_FLAGS	                  ; Indicate that we can be suspended	
        lda     BTNSTATE                        ; Get the event	
        cmp     #EVT_DNANY4                     ; Did they press a button?	
        bne     CHKENTER                        ; No, pass on to see what else there might be	
        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_SET                        ; Perhaps the SET button	
        beq     DO_SET                          ; If so, handle it	
        ; In reality, we can't reach here since we handled all three buttons	
        ; in the above code (the MODE button is handled before we get here and the	
        ; GLOW button doesn't send in an event for this).  We can just fall through	
        ; and take whatever we get from it.	
CHKENTER	
        cmp     #EVT_ENTER                      ; Is this our initial entry?	
        bne     REFRESH	
;	
; 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_UPDATE-START	
        jsr     PUT6TOP	
        lda     #S6_SAMPLE-START	
        jsr     PUT6MID	
        lda     #SYS8_MODE	
        jmp     PUTMSGBOT	
;	
; (6) 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)	
        ldx     #CURVAL         ; Point to our value to be updated	
        lda     #UPD_MID34      ; Request updating in the middle of the display	
        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_SET	
        clr     CURVAL          ; When they hit the set button, we just clear to zero	
SHOWVAL	
        brset   1,FLAGBYTE,NOCLEAR ; Do we need to clear the display first?	
REFRESH	
        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	
        ldx     CURVAL          ; Get the current value	
        jsr     FMTXLEAD0       ; Convert it to the two ascii digits	
        jmp     PUTMID34        ; And put it on the screen in the right place	
;	
; (7) 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     CURVAL	
        rts