|
Getting InputA program which just does output and really takes no input is not very useful. The first stage in making a program more useful is to figure out how to allow the user to enter a value. With this first numbers program, we allow you to enter a number by pressing the PREV/NEXT key to advance it by one each time you press the key. This allows us to see how basic input works and a couple of the formatting/display routines. ;Name: Numbers
;Version: NUMBER
;Description: This is a simple number count 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 that we want to show the segments instead of the message
;
CURVAL EQU $62 ; The current value we are displaying
START EQU *
;
; (2) System entry point vectors
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_NUMBER: timex6 "NUMBER"
S6_COUNT: timex6 "COUNT "
;
; (4) State Table
STATETAB:
db 0
db EVT_ENTER,TIM2_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_DNNEXT,TIM_ONCE,0 ; Next button
db EVT_DNPREV,TIM_ONCE,0 ; Prev button
db EVT_DNSET,TIM_ONCE,0 ; Set button
db EVT_MODE,TIM_ONCE,$FF ; Mode button
db EVT_END
;
; (5) State Table 0 Handler
; This is called to process the state events. We will see ENTER, RESUME, DNNEXT, DNPREV, DNSET, and TIMER2
;
HANDLE_STATE0:
bset 1,APP_FLAGS ; Indicate that we can be suspended
lda BTNSTATE ; Get the event
cmp #EVT_DNNEXT ; Did they press the next button?
beq DO_NEXT ; Yes, increment the counter
cmp #EVT_DNPREV ; How about the PREV button
beq DO_PREV ; handle it
cmp #EVT_DNSET ; Maybe the set button?
beq DO_SET ; Deal with it!
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_NUMBER-START
jsr PUT6TOP
lda #S6_COUNT-START
jsr PUT6MID
lda #SYS8_MODE
jmp PUTMSGBOT
;
; (6) Our only real working code...
DO_NEXT
inc CURVAL
lda CURVAL
cmp #100
bne SHOWVAL
DO_SET
clr CURVAL
SHOWVAL
brset 1,FLAGBYTE,NOCLEAR
REFRESH
jsr CLEARALL
bset 1,FLAGBYTE
NOCLEAR
ldx CURVAL
jsr FMTXLEAD0
jmp PUTMID34
DO_PREV
lda CURVAL
beq WRAPUP
dec CURVAL
bra SHOWVAL
WRAPUP
lda #99
sta CURVAL
bra SHOWVAL
;
; (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
We have the same 7 basic sections, but some of them are a little more filled out.
Just pressing a button for each increment can be tedious. Learn how to make it better with: Better Input - Update |