home *** CD-ROM | disk | FTP | other *** search
/ Nibble Magazine / nib40a.dsk / JANUARY.1991 / CLOCK.DEMO.bas next >
BASIC Source File  |  2023-02-26  |  9KB  |  162 lines

  1. 100  REM * CLOCK.DEMO
  2. 110  REM * By John R. Vokey
  3. 120  REM * (c) 1991 by MindCraft Publ. Corp.
  4. 130  LOMEM: 17000
  5. 140  TEXT : PRINT  CHR$(14) CHR$(21): HOME : REM 40-col
  6. 150 DOS = ( PEEK(978) = 157): REM Set operating system:0-Prodos; 1-DOS
  7. 160 DOS$ =  MID$ ("PRODOS",DOS *3 +1,3) +".MOUSE"
  8. 170  REM ==========
  9. 180  REM Find Mouse
  10. 190  REM ==========
  11. 200 MSLOT = 0: FOR I = 1 TO 7:LOC = 256 *(192 +I)
  12. 210  IF  PEEK(LOC +12) = 32  AND  PEEK(LOC +251) = 214  THEN MSLOT = I
  13. 220  NEXT I
  14. 230 INSTALL = 16283: IF DOS  THEN INSTALL = 16316
  15. 240  IF   NOT MSLOT  THEN  VTAB 12: HTAB 15: PRINT "NO MOUSE...": VTAB 23: END 
  16. 250  REM ===========================
  17. 260  REM Alter MOUSE.CLOCK for MSLOT
  18. 270  REM ===========================
  19. 280  IF   NOT  PEEK(0)  THEN 320: REM If installed, go
  20. 290  PRINT  CHR$(4)"BLOAD"DOS$
  21. 300  POKE 16416,192 +MSLOT: POKE 16421,192 +MSLOT: POKE 16423,MSLOT *16: POKE 16427,192 +MSLOT
  22. 310  CALL INSTALL:MFLG = 1:CTYPE = 0
  23. 320 HMEM =  PEEK(116) *256: HIMEM: HMEM
  24. 330  REM ===================
  25. 340  REM Declare Subroutines
  26. 350  REM ===================
  27. 360 ESC$ =  CHR$(27):BS$ =  CHR$(8):DL$ =  CHR$(127):CR$ =  CHR$(13)
  28. 370  IF DOS  THEN STARTMOUSE = 39936
  29. 380  IF   NOT DOS  THEN STARTMOUSE = HMEM +4 *256
  30. 390  IF   NOT  PEEK(0)  THEN STARTMOUSE =  PEEK(1) *256: REM use old address, if one
  31. 400 OFFMOUSE = STARTMOUSE +24
  32. 410 ASSIGN = STARTMOUSE +216
  33. 420 DISPLAY = STARTMOUSE +233
  34. 430 HOUR = STARTMOUSE +192
  35. 440 SCREEN = STARTMOUSE +171
  36. 450 DSPTGL = STARTMOUSE +191
  37. 460 TIMLOC = STARTMOUSE +196
  38. 470  IF   NOT  PEEK(0)  THEN  CALL STARTMOUSE:CTYPE = 0: POKE TIMLOC,24:MFLG = 1: IF  PEEK(DSPTGL)  THEN  CALL DISPLAY: REM restore default values if needed
  39. 480  HOME : POKE 0,0: POKE 1,STARTMOUSE/256: REM flag MOUSE.CLOCK address for subsequent RUNs
  40. 490  CALL ASSIGN,TIME$: REM Assign time to TIME$
  41. 500  REM Move display to line 2
  42. 510  VTAB 2:LOC =  PEEK(40) + PEEK(40 +1) *256 +29:HBYTE =  INT(LOC/256):LBYTE = LOC -HBYTE *256: POKE SCREEN,LBYTE: POKE SCREEN +1,HBYTE
  43. 520 OV% = 2:OH% = 29: FOR I = 0 TO 10:C(I) =  PEEK(LOC +I): NEXT 
  44. 530  REM ========
  45. 540  REM Get Date
  46. 550  REM ========
  47. 560 DTE$ = "<NO DATE>": IF DOS  THEN 650
  48. 570 DTE =  PEEK(49040) + PEEK(49041) *256
  49. 580 YEAR =  INT(DTE/(2 ^9))
  50. 590 MNTH =  INT((DTE -YEAR *(2 ^9))/(2 ^5))
  51. 600 DAY = DTE -YEAR *(2 ^9) -MNTH *(2 ^5)
  52. 610  IF YEAR >84  AND YEAR <100  AND MNTH >0  AND MNTH <13  AND DAY >0  AND DAY <32  THEN DTE$ =  RIGHT$("0" + STR$(DAY),2) +"-" + MID$ ("JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC",MNTH *3 -2,3) +"-" + STR$(YEAR)
  53. 620  REM =============
  54. 630  REM Create Screen
  55. 640  REM =============
  56. 650  VTAB 1: HTAB 6: PRINT "MOUSE.CLOCK (C) 1991 MINDCRAFT"
  57. 660  PRINT "DATE: "DTE$;: HTAB 24: PRINT "TIME: ": CALL DISPLAY
  58. 670 LIN$ = "----------------------------------------"
  59. 680  PRINT LIN$: POKE 34,3
  60. 690  VTAB 23: PRINT LIN$;: VTAB 18: PRINT : VTAB 24: PRINT "ESC-EXITS";: HTAB 16: PRINT "SELECT:";: HTAB 33: PRINT  MID$ (" PRODOS 3.3",DOS *4 +1,7);: POKE 35,22: HOME 
  61. 700  REM =========
  62. 710  REM Main Menu
  63. 720  REM =========
  64. 730 MENU$ = "MOUSE.CLOCK": GOSUB 1710
  65. 740  VTAB 9: HTAB 10: PRINT "D - SET DATE": PRINT : HTAB 10: PRINT "T - SET TIME": PRINT 
  66. 750  HTAB 10: PRINT "C - CLOCK PARAMETERS": PRINT : HTAB 10: PRINT "E - EVENT TIMER DEMO": PRINT 
  67. 760  HTAB 10: PRINT "M - MOUSING AROUND": PRINT : HTAB 10: PRINT "Q - QUIT"
  68. 770 CMD$ = ESC$ +"DTCEMQ": GOSUB 1540
  69. 780  ON CMD GOTO 1450,820,970,1080,1220,1320,1450
  70. 790  REM ========
  71. 800  REM Set Date
  72. 810  REM ========
  73. 820 MENU$ = "SET DATE": GOSUB 1710
  74. 830  VTAB 12: HTAB 15: PRINT "DD-MMM-YY";:COL = 15:NCHR = 2:F$ = "": GOSUB 1620: IF Q$ = ESC$  THEN 730
  75. 840 DAY =  INT( VAL(F$)): IF DAY <1  OR DAY >31  THEN  PRINT  CHR$(7);: GOTO 830
  76. 850  HTAB 18: PRINT "MMM-YY";:COL = 18:F$ = "":NCHR = 3: GOSUB 1620: IF Q$ = ESC$  THEN 830
  77. 860  FOR I = 1 TO 12: IF F$ < > MID$ ("JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC",I *3 -2,3)  THEN  NEXT : PRINT  CHR$(7);: GOTO 850
  78. 870 MNTH = I:MNTH$ = F$:I = 13: NEXT 
  79. 880  HTAB 22: PRINT "YY";:NCHR = 2:COL = 22:F$ = "": GOSUB 1620: IF Q$ = ESC$  THEN 850
  80. 890 YEAR =  INT( VAL(F$)): IF YEAR <85  OR YEAR >99  THEN  PRINT  CHR$(7);: GOTO 880
  81. 900 DTE$ =  RIGHT$("0" + STR$(DAY),2) +"-" +MNTH$ +"-" + STR$(YEAR)
  82. 910  VTAB 2: HTAB 7: PRINT DTE$;
  83. 920  IF   NOT DOS  THEN DTE = YEAR *(2 ^9) +MNTH *(2 ^5) +DAY: POKE 49041,DTE/256: POKE 49040,DTE - PEEK(49041) *256
  84. 930  GOTO 820
  85. 940  REM ========
  86. 950  REM Set Time
  87. 960  REM ========
  88. 970 MENU$ = "SET TIME": GOSUB 1710
  89. 980  VTAB 12: HTAB 16: PRINT "HH:MM:SS";:COL = 16:NCHR = 2:F$ = "": GOSUB 1620: IF Q$ = ESC$  THEN 730
  90. 990 HR =  INT( VAL(F$)): IF HR <0  OR HR >23  OR (CTYPE  AND (HR <1  OR HR >12))  THEN  PRINT  CHR$(7);: GOTO 980
  91. 1000  HTAB 19: PRINT "MM:SS";:COL = 19:F$ = "":NCHR = 2: GOSUB 1620: IF Q$ = ESC$  THEN 980
  92. 1010 MIN =  INT( VAL(F$)): IF MIN <0  OR MIN >59  THEN  PRINT  CHR$(7);: GOTO 1000
  93. 1020  HTAB 22: PRINT "SS";:NCHR = 2:COL = 22:F$ = "": GOSUB 1620: IF Q$ = ESC$  THEN 1000
  94. 1030 SEC =  INT( VAL(F$)): IF SEC <0  OR SEC >59  THEN  PRINT  CHR$(7);: GOTO 1020
  95. 1040  POKE HOUR,HR: POKE HOUR +1,MIN: POKE HOUR +2,SEC: GOTO 970
  96. 1050  REM ================
  97. 1060  REM Clock Parameters
  98. 1070  REM ================
  99. 1080 MENU$ = "CLOCK PARAMETERS": GOSUB 1710
  100. 1090  VTAB 10: HTAB 10: PRINT "C - CLOCK ON / OFF": PRINT : HTAB 10: PRINT "D - DISPLAY ON / OFF": PRINT : HTAB 10: PRINT "T - CLOCK TYPE: ";: INVERSE : PRINT  MID$ ("2412",CTYPE *2 +1,2)"-HOUR": NORMAL 
  101. 1100 CMD$ = ESC$ +"CDT": GOSUB 1540
  102. 1110  ON CMD GOTO 730,1120,1150,1180
  103. 1120  IF MFLG  THEN  CALL OFFMOUSE
  104. 1130  IF   NOT MFLG  THEN  CALL STARTMOUSE
  105. 1140 MFLG =   NOT MFLG: GOTO 1080
  106. 1150 LOC =  PEEK(SCREEN) + PEEK(SCREEN +1) *256: IF   NOT  PEEK(DSPTGL)  THEN  FOR I = 0 TO 10:C(I) =  PEEK(LOC +I): NEXT 
  107. 1160  CALL DISPLAY: IF   NOT  PEEK(DSPTGL)  THEN  FOR I = 0 TO 10: POKE LOC +I,C(I): NEXT 
  108. 1170  GOTO 1080
  109. 1180 CTYPE =   NOT CTYPE: POKE TIMLOC,24 -11 *CTYPE: GOTO 1080
  110. 1190  REM ================
  111. 1200  REM Event Timer Demo
  112. 1210  REM ================
  113. 1220 MENU$ = "EVENT TIMER DEMO": GOSUB 1710
  114. 1230  VTAB 21: PRINT "PRESS <SPACE> TO START AND STOP": VTAB 12: PRINT "START:": VTAB 14: PRINT " STOP:": VTAB 16: PRINT "ELAPSED TIME:"
  115. 1240 CMD$ = ESC$ +" ": GOSUB 1540: ON CMD GOTO 730,1250
  116. 1250 X$ = TIME$: VTAB 12: HTAB 8: PRINT X$: VTAB 14: HTAB 8: CALL  -868: VTAB 16: HTAB 15: CALL  -868: GOSUB 1540: ON CMD GOTO 730,1260
  117. 1260 Y$ = TIME$: VTAB 14: HTAB 8: PRINT Y$
  118. 1270 ET =  VAL( LEFT$(Y$,2)) *3600 + VAL( MID$ (Y$,4,2)) *60 + VAL( MID$ (Y$,7,2)) + VAL( RIGHT$(Y$,2))/100 - VAL( LEFT$(X$,2)) *3600 - VAL( MID$ (X$,4,2)) *60 - VAL( MID$ (X$,7,2)) - VAL( RIGHT$(X$,2))/100
  119. 1280  VTAB 16: HTAB 15: PRINT  INT(ET *100 +.5)/100" SECONDS": CALL  -868: GOTO 1240
  120. 1290  REM ==============
  121. 1300  REM Mousing Around
  122. 1310  REM ==============
  123. 1320 MENU$ = "MOUSING AROUND": GOSUB 1710
  124. 1330  VTAB 14: HTAB 6: PRINT "USE MOUSE TO MOVE TIME DISPLAY": CALL STARTMOUSE:MFLG = 1
  125. 1340  PRINT  CHR$(4)"IN#"MSLOT: IF   NOT  PEEK(DSPTGL)  THEN LOC =  PEEK(SCREEN) + PEEK(SCREEN +1) *256: FOR I = 0 TO 10:C(I) =  PEEK(LOC +I): NEXT : CALL DISPLAY
  126. 1350  FOR MOUSE = 0 TO 1
  127. 1360  VTAB 4: HTAB 1: INPUT "";X,Y,BTN
  128. 1370 CV% = Y/43 +1:CH% = X/35: IF CV% = OV%  AND CH% = OH%  THEN 1400
  129. 1380  CALL DISPLAY: VTAB OV%:LOC =  PEEK(40) + PEEK(41) *256 +OH%: FOR I = 0 TO 10: POKE LOC +I,C(I): NEXT : VTAB CV%:LOC =  PEEK(40) + PEEK(41) *256 +CH%: FOR I = 0 TO 10:C(I) =  PEEK(LOC +I): NEXT :OV% = CV%:OH% = CH%
  130. 1390  POKE SCREEN +1,LOC/256: POKE SCREEN,LOC - PEEK(SCREEN +1) *256: CALL DISPLAY
  131. 1400 MOUSE = (BTN <3): NEXT MOUSE
  132. 1410  POKE  -16368,0: HOME : PRINT  CHR$(4)"IN#0": GOTO 730
  133. 1420  REM ====
  134. 1430  REM Quit
  135. 1440  REM ====
  136. 1450 MENU$ = "QUIT": GOSUB 1710
  137. 1460  VTAB 10: HTAB 5: PRINT "THIS MENU EXITS TO BASIC."
  138. 1470  PRINT : HTAB 5: PRINT "MOUSE.CLOCK IS INSTALLED AT:": PRINT : HTAB 15: PRINT STARTMOUSE
  139. 1480  VTAB 22: PRINT "PRESS <RETURN> TO QUIT...";
  140. 1490 CMD$ = ESC$ +CR$: GOSUB 1540: ON CMD GOTO 700
  141. 1500  TEXT : HOME : VTAB 23: END 
  142. 1510  REM ==========
  143. 1520  REM Select Sub
  144. 1530  REM ==========
  145. 1540  VTAB 24: HTAB 16: INVERSE : PRINT "SELECT:";: NORMAL : HTAB 24
  146. 1550  GET Q$:Q =  ASC(Q$):Q = Q -32 *(Q >96  AND Q <123)
  147. 1560  FOR CMD = 1 TO  LEN(CMD$): IF Q < > ASC( MID$ (CMD$,CMD,1))  THEN  NEXT : PRINT  CHR$(7);: GOTO 1550
  148. 1570  IF Q >31  THEN  PRINT  CHR$(Q);
  149. 1580  VTAB 24: HTAB 16: PRINT "SELECT:";: RETURN 
  150. 1590  REM =========
  151. 1600  REM Input Sub
  152. 1610  REM =========
  153. 1620  HTAB COL: PRINT F$;: IF  LEN(F$) > = NCHR  THEN  RETURN 
  154. 1630  GET Q$: IF  ASC(Q$) >96  AND  ASC(Q$) <123  THEN Q$ =  CHR$( ASC(Q$) -32)
  155. 1640  IF Q$ = ESC$  THEN F$ = "": RETURN 
  156. 1650  IF Q$ = BS$  OR Q$ = DL$  THEN Q$ = BS$: IF  LEN(F$)  THEN  PRINT Q$;:F$ =  MID$ (F$,1, LEN(F$) -1)
  157. 1660  IF Q$ > = " "  THEN F$ = F$ +Q$
  158. 1670  GOTO 1620
  159. 1680  REM ========
  160. 1690  REM New Menu
  161. 1700  REM ========
  162. 1710  HOME : VTAB 5: HTAB (41 - LEN(MENU$))/2: INVERSE : PRINT MENU$: NORMAL : RETURN