|
Playing With Sound - TestSnd exampleThis is a very simple program that I had put together to test out what sounds the watch can make. The program doesn't really do a lot except poke the hardware a little. It does use the update routine without the blinking. Unlike programs which play a tune, this goes straight to the hardware to test out the capabilities and is completely independent of any sound scheme that you might have loaded. ;Name: Test Sound ;Version: TESTSND ;Description: This routine tests the various sound capabilities of the datalink. ;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 ; CURRENT_VAL EQU $61 ; ; (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 DOEVENT0 db TABLE0-TABLE0 L0127: jmp DOEVENT1 db TABLE1-TABLE0 ; ; (3) Program strings S6_SOUND: timex6 "SOUND " S6_TEST: timex6 " TEST " S8_TOEBES: timex "J.TOEBES" ; ; (4) State Table ; TABLE0: db 0 db EVT_ENTER,TIM_LONG,0 ; Initial state db EVT_RESUME,TIM_ONCE,0 ; Resume from a nested app db EVT_TIMER2,TIM_ONCE,0 ; db EVT_DNNEXT,TIM_ONCE,1 ; Next button db EVT_DNPREV,TIM_ONCE,1 ; Prev button db EVT_MODE,TIM_ONCE,$FF ; Mode button db EVT_DNSET,TIM_ONCE,0 ; Set button db EVT_UPSET,TIM_ONCE,0 ; db EVT_END TABLE1: db 1 db EVT_UPNEXT,TIM_ONCE,1 ; Releasing the next button db EVT_UPPREV,TIM_ONCE,1 ; Releasing the prev button db EVT_USER0,TIM_ONCE,0 ; Return to the main state table db EVT_END ; End of table ; ; (5) State Table 0 Handler ; This is called to process the state events. ; We see ENTER, TIMER2, and RESUME events ; DOEVENT0: bset 1,APP_FLAGS ; Allow us to be suspended lda BTNSTATE ; Get the event cmp #EVT_RESUME ; Did another app get called in the meantime? beq REFRESH ; We will refresh the display in this case cmp #EVT_TIMER2 ; Did the initial timer expire? beq REFRESH ; Yes, clean up the screen cmp #EVT_ENTER ; Is this the initial state? beq INITBANNER ; Yes, put up the banner cmp #EVT_DNSET ; Did they hit the set button beq PLAYIT cmp #EVT_UPSET beq SILENCE rts ; ; (6) Sound playing code. Note that we go straight to the hardware here for this one ; PLAYIT: lda #ROW_NOTE ; Turn on the little note symbol sta DISP_ROW bset COL_NOTE,DISP_COL lda CURRENT_VAL sta $28 rts SILENCE: lda #ROW_NOTE ; Turn off the little note symbol sta DISP_ROW bclr COL_NOTE,DISP_COL lda #15 sta $28 rts REFRESH: jsr CLEARALL ; Clear the display lda #S6_SOUND-START ; Put "SOUND" on the top of the display jsr PUT6TOP ldx CURRENT_VAL jsr FMTX jsr PUTMID34 bra JBANNER INITBANNER: jsr CLEARALL ; Clear the display lda #S6_SOUND-START ; Put 'SOUND ' on the top line jsr PUT6TOP lda #S6_TEST-START ; Put ' TEST ' on the second line jsr PUT6MID JBANNER lda #S8_TOEBES-START jmp BANNER8 ; ; (7) This is the main initialization routine which is called when we first get the app into memory ; MAIN: bset 7,WRISTAPP_FLAGS ; Tell them that we are a live application clr CURRENT_VAL rts ; ; (8) State Table 1 Handler ; ; This is called when we press the prev/next button or when the timer fires during that event ; DOEVENT1: lda BTNSTATE cmp #EVT_DNPREV beq GO_DOWN cmp #EVT_DNNEXT beq GO_UP lda #EVT_USER0 jmp POSTEVENT GO_DOWN bclr 0,SYSFLAGS ; Mark update direction as down bra DOUPDN GO_UP bset 0,SYSFLAGS ; Mark update direction as up DOUPDN clra jsr CLEARMID sta UPDATE_MIN lda #99 sta UPDATE_MAX ldx #CURRENT_VAL lda #UPD_MID34 jsr START_UPDATEP bset 4,BTNFLAGS rts This code has a few notable sections.
|