diff options
Diffstat (limited to 'from_toebes/pick6')
l--------- | from_toebes/pick6/pick6.asm | 1 | ||||
l--------- | from_toebes/pick6/pick6.known_good | 1 | ||||
-rw-r--r-- | from_toebes/pick6/pick6.zap | 33 | ||||
-rw-r--r-- | from_toebes/pick6/pick6.zsm | 335 |
4 files changed, 370 insertions, 0 deletions
diff --git a/from_toebes/pick6/pick6.asm b/from_toebes/pick6/pick6.asm new file mode 120000 index 0000000..7e60eb8 --- /dev/null +++ b/from_toebes/pick6/pick6.asm @@ -0,0 +1 @@ +pick6.zsm
\ No newline at end of file diff --git a/from_toebes/pick6/pick6.known_good b/from_toebes/pick6/pick6.known_good new file mode 120000 index 0000000..670787d --- /dev/null +++ b/from_toebes/pick6/pick6.known_good @@ -0,0 +1 @@ +pick6.zap.app
\ No newline at end of file diff --git a/from_toebes/pick6/pick6.zap b/from_toebes/pick6/pick6.zap new file mode 100644 index 0000000..21ec223 --- /dev/null +++ b/from_toebes/pick6/pick6.zap @@ -0,0 +1,33 @@ +TDL1024972�
+PICK6�
+PICK6�
+A sample lottery number picker to pick 6 numbers out of a pool of 49 numbers (no duplicates allowed).
+ To use it, just select it as the current app and it will pick a set of 6 numbers for you. To get another set,
+ just press the next button. This is for amusement only (but if you win anything because of it, I would welcome
+ anything that you send me).
+
+by John A. Toebes, VIII
+�
+watchapp.hlp�
+100�
+none�
+Timex Data Link 150 Watch�
+CC0275139081CC0157139081819D9DD6013E81CC0180001D1D1D1F001F1D1D1D2419120C14310624191A19181718001B85001AFF008085001FFF0001FFFF1D00000000000000FFC604C1A10826B5AE05B665CD6B0DB76597D60138CD58A8BE65D60138CC587E3F651290CD577ACC0225128F1390B691A18027ECA11B27E8A11A274B4FAE06D7014E5A26FA3F65CD022DA43FB766A630B065B16625F1B666AD0A3C65B665A10626E520234CAE505C6DFE2603E7FE81E1FE25034C20F1B766E6FEB767B666E7FEB6675C4D26F081CE014FAD48CD58E0CE0150AD40CD58F0CE0151AD38CD5900CE0152AD30CD5910CE0153AD28CD5920CE0154AD20CD5930A636B71D141EA624B71D141EA636B71D101EA624B71D101EA620CC5845CC5951B663BE5042BB61B7619FB962B7624FB767A900B766B663BE46AD1DB664BE50AD17B664BE61BF63BE62BF64BE4642BB66B7619FB967B7628142BB62B7629FB966B7664FB967B76781A6C0B796B627B763B764B761A43FB76281�
+42817�
+0�
+PICK6�
+PICK6�
+A sample lottery number picker to pick 6 numbers out of a pool of 49 numbers (no duplicates allowed).
+ To use it, just select it as the current app and it will pick a set of 6 numbers for you. To get another set,
+ just press the next button. This is for amusement only (but if you win anything because of it, I would welcome
+ anything that you send me).
+
+by John A. Toebes, VIII
+�
+watchapp.hlp�
+100�
+none�
+Timex Data Link 150s Watch�
+CC0275139081CC0157139081819D9DD6013E81CC0180001D1D1D1F001F1D1D1D2419120C14310624191A19181718001B85001AFF008085001FFF0001FFFF1D00000000000000FFC604C1A10826B5AE05B665CD6B16B76597D60138CD57A9BE65D60138CC577F3F651290CD5AA0CC0225128F1390B691A18027ECA11B27E8A11A274B4FAE06D7014E5A26FA3F65CD022DA43FB766A630B065B16625F1B666AD0A3C65B665A10626E520234CAE505C6DFE2603E7FE81E1FE25034C20F1B766E6FEB767B666E7FEB6675C4D26F081CE014FAD48CD57E1CE0150AD40CD57F1CE0151AD38CD5801CE0152AD30CD5811CE0153AD28CD5821CE0154AD20CD5831A634B71D141EA622B71D141EA634B71D101EA622B71D101EA620CC5746CC5852B663BE5042BB61B7619FB962B7624FB767A900B766B663BE46AD1DB664BE50AD17B664BE61BF63BE62BF64BE4642BB66B7619FB967B7628142BB62B7629FB966B7664FB967B76781A6C0B796B627B763B764B761A43FB76281�
+62244�
+0�
\ No newline at end of file diff --git a/from_toebes/pick6/pick6.zsm b/from_toebes/pick6/pick6.zsm new file mode 100644 index 0000000..515dd8c --- /dev/null +++ b/from_toebes/pick6/pick6.zsm @@ -0,0 +1,335 @@ +;Name: PICK6 +;Version: PICK6 +;Description: A sample lottery number picker to pick 6 numbers out of a pool of 49 numbers (no duplicates allowed). +; To use it, just select it as the current app and it will pick a set of 6 numbers for you. To get another set, +; just press the next button. This is for amusement only (but if you win anything because of it, I would welcome +; anything that you send me). +; +;by John A. Toebes, VIII +; +;HelpFile: watchapp.hlp +;HelpTopic: 100 +;**************************************************************************************** +;* Copyright (C) 1997 John A. Toebes, VIII * +;* All Rights Reserved * +;* This program may not be distributed in any form without the permission of the author * +;* jtoebes@geocities.com * +;**************************************************************************************** +; (1) Program specific constants +; + INCLUDE "WRISTAPP.I" +; +; Program specific constants +; +RAND_RANGE EQU 48 ; This is the number of items to select from (1 to RAND_RANGE+1) +CURRENT_TIC EQU $27 ; Current system clock tic (Timer) +RAND_WCL EQU $61 +RAND_WCH EQU $62 +RAND_WNL EQU $63 +RAND_WNH EQU $64 +THIS_PICK EQU $65 ; We can share this with MARQ_POS since we don't do both at the same time +MARQ_POS EQU $65 +TEMPL EQU $66 +TEMPH EQU $67 +START EQU * +BASE_TAB EQU $FE +; +; (2) System entry point vectors +; +L0110: jmp MAIN ; The main entry point - WRIST_MAIN +L0113: bclr 1,BTNFLAGS ; Called when we are suspended for any reason - WRIST_SUSPEND + rts +L0116: jmp FLASH ; Called to handle any timers or time events - WRIST_DOTIC +L0119: bclr 1,BTNFLAGS ; Called when the COMM app starts and we have timers pending - WRIST_INCOMM + rts +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_MARQ timex6 " +O+ " +S8_TITLE timex " PICK-6 " + +MARQ_SEL + DB S6_MARQ+2-START + DB S6_MARQ+3-START + DB S6_MARQ+2-START + DB S6_MARQ+1-START + DB S6_MARQ-START + DB S6_MARQ+1-START +; +; (4) State Table +; +STATETAB: + db 0 + db EVT_ENTER,TIM2_16TIC,0 ; Initial state + db EVT_RESUME,TIM_ONCE,0 ; Resume from a nested app + db EVT_DNNEXT,TIM2_16TIC,0 ; Next button + db EVT_TIMER2,TIM_ONCE,0 ; Timer + db EVT_MODE,TIM_ONCE,$FF ; Mode button + db EVT_END + +PICK_VALS db 0,0,0,0,0,0,0,$FF +; +; (5) This flashes the text on the screen +; +FLASH + lda CURRENT_APP ; See which app is currently running + cmp #APP_WRIST ; Is it us? + bne L0113 ; No, so just turn off the tic timer since we don't need it + ldx #5 + lda MARQ_POS + jsr INCA_WRAPX + sta MARQ_POS + tax + lda MARQ_SEL,X + jsr PUT6MID + ldx MARQ_POS + lda MARQ_SEL,X + jmp PUT6TOP +; +; (6) They want us to do it again +; +DOITAGAIN ; Tell them we are going to do it again + clr MARQ_POS + bset 1,BTNFLAGS + jsr CLEARALL + jmp BANNER +; +; (7) State Table 0 Handler +; This is called to process the state events. +; We see ENTER, RESUME, TIMER2 and NEXT events +; +HANDLE_STATE0: + bset 1,APP_FLAGS ; Indicate that we can be suspended + bclr 1,BTNFLAGS + lda BTNSTATE + cmp #EVT_DNNEXT ; Did they press the next button? + beq DOITAGAIN + cmp #EVT_ENTER ; Or did we start out + beq DOITAGAIN + cmp #EVT_RESUME + beq REFRESH +; +; (8) Select a random answer +; +SHOWIT + clra + ldx #6 +CLEARIT + sta PICK_VALS-1,X + decx + bne CLEARIT +; +; We want to pick 6 random numbers. The first needs to be in the range 1 ... RAND_RANGE +; The second should be in the range 1 ... (RAND_RANGE-1) +; The third should be in the range 1 ... (RAND_RANGE-2) +; The fourth should be in the range 1 ... (RAND_RANGE-3) +; The fifth should be in the range 1 ... (RAND_RANGE-4) +; The sixth should be in the range 1 ... (RAND_RANGE-5) +; + clr THIS_PICK +ONE_MORE_PICK + +REPICK + jsr RAND16 + and #63 + sta TEMPL + lda #RAND_RANGE + sub THIS_PICK + cmp TEMPL + blo REPICK + lda TEMPL + bsr INSERT_NUM + + inc THIS_PICK + lda THIS_PICK + cmp #6 + bne ONE_MORE_PICK + bra REFRESH +; +; (9) Insert a number in the list +; +INSERT_NUM + inca + ldx #(PICK_VALS-1)-BASE_TAB ; Index so that we can use the short addressing mode +TRY_NEXT + incx ; Advance to the next number + tst BASE_TAB,X ; Is it an empty slot? + bne NOT_END ; No, try some more + sta BASE_TAB,X ; Yes, just toss it in there + rts ; And return +NOT_END + cmp BASE_TAB,X ; Non-empty slot, are we less than it? + blo PUT_HERE ; Yes, so we go here + inca ; No, Greater than or equal, we need to increment one and try again + bra TRY_NEXT +PUT_HERE + sta TEMPL + lda BASE_TAB,X + sta TEMPH + lda TEMPL + sta BASE_TAB,X + lda TEMPH + incx + tsta + bne PUT_HERE + rts +; +; (10) Display the currently selected random numbers +; +REFRESH + ldx PICK_VALS + bsr GOFMTX + jsr PUTTOP12 + + ldx PICK_VALS+1 + bsr GOFMTX + jsr PUTTOP34 + + ldx PICK_VALS+2 + bsr GOFMTX + jsr PUTTOP56 + + ldx PICK_VALS+3 + bsr GOFMTX + jsr PUTMID12 + + ldx PICK_VALS+4 + bsr GOFMTX + jsr PUTMID34 + + ldx PICK_VALS+5 + bsr GOFMTX + jsr PUTMID56 + + lda #ROW_MP23 + sta DISP_ROW + bset COL_MP23,DISP_COL + + lda #ROW_MP45 + sta DISP_ROW + bset COL_MP45,DISP_COL + + lda #ROW_TP23 + sta DISP_ROW + bset COL_TP23,DISP_COL + + lda #ROW_TP45 + sta DISP_ROW + bset COL_TP45,DISP_COL +BANNER + lda #S8_TITLE-START ; And show the mode on the bottom + jmp BANNER8 + +GOFMTX JMP FMTX +; (11) Here is an excellent random number generator +; it comes courtesy of Alan Beale <biljir@pobox.com> +; The following C code gives a good MWC (multiply-with-carry) +; generator. This type is generally superior to linear +; congruential generators. As a bonus, there is no particular advantage to using the high-order +; rather than the low-order bits. +; The algorithm was developed and analyzed by George +; Marsaglia, a very well-known scholar of random number lore. +; +; The code assumes 16 bit shorts and 32 bit longs (hardly surprising). +; +;static unsigned short wn,wc; /* random number and carry */ +; +;unsigned short rand() { +; unsigned long temp; +; temp = 18000*wn + wc; +; wc = temp >> 16; +; wn = temp & 0xffff; +; return wn; +;} +; +;To seed, set wn to anything you like, and wc to anything between 0 and 17999. +; +; Translating this into assembler is +;nHnL*0x4650 + RAND_WCHcL +; +; unsigned long temp; +; temp = 18000*wn + wc; +; wc = temp >> 16; +; wn = temp & 0xffff; +; return wn; +; temp = 0x4650 * n + c +; temp = 0x4650 * nHnL + cHcL +; temp = (0x4600 + 0x50) * (nH00 + nL) + cHcL +; temp = 0x4600*nH00 + 0x4600*nL + 0x50*nH00 + 0x50*nL + cHcL +; temp = 0x46*nH*0x10000 + 0x46*nL*0x100 + 0x50*nH*0x1000 + 0x50*nL + cHcL +; We construct the 32bit result into tH tL cH cL and then swap the 16 bit values +; once we have no more need of the original numbers in the calculation +; +RAND_MULT EQU 18000 ; This is for the random number generator +RAND_MULTH EQU RAND_MULT/256 +RAND_MULTL EQU RAND_MULT&255 + +RAND16 + lda RAND_WNL ; A=nL + ldx RAND_MULTL ; X=0x50 + mul ; X:A = 0x50*nL + add RAND_WCL ; A=Low(0x50nL)+cL + sta RAND_WCL ; cL=Low(0x50nL)+cL + txa ; A=High(0x50nL) + adc RAND_WCH ; A=High(0x50nL)+cH + sta RAND_WCH ; cH=High(0x50nL)+cH + clra ; A=0 + sta TEMPH ; tH=0 + adc #0 ; A=Carry(0x50nL)+cH + sta TEMPL ; tL=Carry(0x50nL)+cH + + lda RAND_WNL ; A=nL + ldx RAND_MULTH ; X=0x46 + bsr RAND_SUB ; tL:cH += 0x46*nL tH=carry(0x46*nL) + + lda RAND_WNH ; A=nH + ldx RAND_MULTL ; X=0x50 + bsr RAND_SUB ; tL:cH += 0x50*nH tH=carry(0x50*nH) + + lda RAND_WNH ; A=nH + ldx RAND_WCL ; X=cL + stx RAND_WNL ; nL=cL + ldx RAND_WCH ; X=cH + stx RAND_WNH ; hH=cH + ldx RAND_MULTH ; X=0x46 + mul ; X:A=0x46*nH + add TEMPL ; A=Low(0x46*nH)+tL + sta RAND_WCL ; nL=Low(0x46*nH)+tL + txa ; A=High(0x46*nH) + adc TEMPH ; A=High(0x46*nH)+tH + sta RAND_WCH ; nH=High(0x46*nH)+tH + rts + +RAND_SUB + mul ; Compute the values + add RAND_WCH ; A=LOW(result)+cH + sta RAND_WCH ; cH=Low(result)+cH + txa ; X=High(result) + adc TEMPL ; X=High(result)+tL+Carry(low(result)+cH) + sta TEMPL ; tL=High(result)+tL+Carry(low(result)+cH) + clra ; A=0 + adc TEMPH ; A=carry(High(result)+tL+Carry(low(result)+cH))+tH + sta TEMPH ; tH=carry(High(result)+tL+Carry(low(result)+cH))+tH + rts +; +; (12) 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 + lda CURRENT_TIC + sta RAND_WNL + sta RAND_WNH + sta RAND_WCL + and #$3f + sta RAND_WCH + rts |