home *** CD-ROM | disk | FTP | other *** search
/ Shareware Overload / ShartewareOverload.cdr / educ / pc_touch.zip / PC-TOUCH.BAS next >
BASIC Source File  |  1983-12-31  |  12KB  |  405 lines

  1. 100 '
  2. 200 ' PC-TOUCH ---- Program to help you practice touch-typing,
  3. 300 '                     by Dean Hannotte (July, 1983).
  4. 400 '
  5. 500 '         This program has been given free of charge and "as is" to the
  6. 600 '    New York IBM Personal Computer User Group. Please share it with as
  7. 700 '    many people as you like. If you'd like to request enhancements, or
  8. 800 '    just want to talk about it, I can be reached at (212) 674-5848 be-
  9. 900 '    tween 9AM and 9PM.
  10. 1000 '
  11. 1100 '         I also do contract programming.
  12. 1200 '
  13. 1300 ' Constants:
  14. 1400 '
  15. 1500 Y = -1 : N = 0                'Logical variables
  16. 1600 ENTER$ = CHR$(17)+CHR$(196)+CHR$(217)  'Picture of ENTER key
  17. 1700 ESC$ = "ESC"                           'Picture of ESC key
  18. 1800 F1$ = "F1"                             'Picture of F1 key
  19. 1900 '
  20. 2000 CR$     = CHR$(13)             'Carriage return character
  21. 2100 CURSOR$ = CHR$(95)             'Cursor character
  22. 2200 '
  23. 2300 ' System Variables:
  24. 2400 '
  25. 2500 TRACE = N                   'Display critical variables?
  26. 2600 '
  27. 2700 ' Execution-time Parameters:
  28. 2800 '
  29. 2900 NO.SOUND = N               'Silent operation?
  30. 3000 NO.MUSIC = Y               'Musical keyboard?
  31. 3100 'COLOR Foreground/Background settings for all monitor types:
  32. 3200 WHITE = 7
  33. 3300 BLACK = 0
  34. 3400 HILIT = 8                   'Add this to foreground white only
  35. 3500 BLINK = 16                'Add this to foreground white only
  36. 3600 GOTO 14600 'Branch around subroutines
  37. 3700 '
  38. 3800 ' Wait for Keystroke Subroutine:
  39. 3900 '
  40. 4000 INK$ = INKEY$
  41. 4100 IF INK$ <> "" GOTO 4600
  42. 4200 COLOR BLACK,WHITE
  43. 4300 LOCATE 22,37
  44. 4400 PRINT TIME$;
  45. 4500 GOTO 4000
  46. 4600 IF LEN(INK$) = 2 GOTO 5200         'Special key hit
  47. 4700 IF INK$ = CR$ GOTO 5100            'ENTER key hit
  48. 4800 IF ASC(INK$) = 27 GOTO 35300        'ESC key hit
  49. 4900 IF ASC(INK$) < 32 GOTO 4000        'Ignore control characters
  50. 5000 IF ASC(INK$) > 126 GOTO 4000        '
  51. 5100 RETURN
  52. 5200 IF ASC(RIGHT$(INK$,1)) = 59 GOTO 5400    'F1 key hit
  53. 5300 GOTO 4000
  54. 5400 IF NOT HALTABLE GOTO 4000
  55. 5500 HALT.HH = VAL(LEFT$(TIME$,2))
  56. 5600 HALT.MM = VAL(MID$(TIME$,4,2))
  57. 5700 HALT.SS = VAL(RIGHT$(TIME$,2))
  58. 5800 LOCATE 20,34
  59. 5900 COLOR BLACK+BLINK,WHITE
  60. 6000 PRINT F1$;
  61. 6100 IF NOT TRACE GOTO 6500
  62. 6200 LOCATE 21,52
  63. 6300 COLOR WHITE,BLACK
  64. 6400 PRINT "H:" HALT.HH HALT.MM HALT.SS;
  65. 6500 INK$ = INKEY$
  66. 6600 IF INK$ <> "" GOTO 7100
  67. 6700 LOCATE 22,37
  68. 6800 COLOR BLACK,WHITE
  69. 6900 PRINT TIME$;
  70. 7000 GOTO 6500
  71. 7100 IF LEN(INK$) <> 2 GOTO 6500
  72. 7200 IF ASC(RIGHT$(INK$,1)) <> 59 GOTO 6500
  73. 7300 RESTART.HH = VAL(LEFT$(TIME$,2))
  74. 7400 RESTART.MM = VAL(MID$(TIME$,4,2))
  75. 7500 RESTART.SS = VAL(RIGHT$(TIME$,2))
  76. 7600 IF NOT TRACE GOTO 8000
  77. 7700 LOCATE 21,67
  78. 7800 COLOR WHITE,BLACK
  79. 7900 PRINT "R:" RESTART.HH RESTART.MM RESTART.SS;
  80. 8000 CHANGE.HH = RESTART.HH-HALT.HH
  81. 8100 CHANGE.MM = RESTART.MM-HALT.MM
  82. 8200 CHANGE.SS = RESTART.SS-HALT.SS
  83. 8300 IF CHANGE.SS < 0 THEN CHANGE.SS = CHANGE.SS+60:CHANGE.MM = CHANGE.MM-1
  84. 8400 IF CHANGE.MM < 0 THEN CHANGE.MM = CHANGE.MM+60:CHANGE.HH = CHANGE.HH-1
  85. 8500 IF CHANGE.HH < 0 THEN CHANGE.HH = CHANGE.MM+24
  86. 8600 START.SS = START.SS+CHANGE.SS
  87. 8700 START.MM = START.MM+CHANGE.MM
  88. 8800 START.HH = START.HH+CHANGE.HH
  89. 8900 IF START.SS > 59 THEN START.SS = START.SS-60:START.MM = START.MM+1
  90. 9000 IF START.MM > 59 THEN START.MM = START.MM-60:START.HH = START.HH+1
  91. 9100 LOCATE 20,34
  92. 9200 COLOR BLACK,WHITE
  93. 9300 PRINT F1$;
  94. 9400 IF NOT TRACE GOTO 9800
  95. 9500 LOCATE 21,35
  96. 9600 COLOR WHITE,BLACK
  97. 9700 PRINT "S:" START.HH START.MM START.SS;
  98. 9800 GOTO 4000
  99. 9900 '
  100. 10000 ' Update Line Statistics Subroutine:
  101. 10100 '
  102. 10200 COLOR BLACK,WHITE
  103. 10300 LOCATE 23,36
  104. 10400 PRINT DATE$
  105. 10500 IF KEY.STROKES = 0 GOTO 10700
  106. 10600 ACCURACY = (KEY.STROKES-ERRORS)*100/KEY.STROKES
  107. 10700 LOCATE 22,72
  108. 10800 PRINT USING "###.##";ACCURACY
  109. 10900 HH = VAL(LEFT$(TIME$,2))
  110. 11000 MM = VAL(MID$(TIME$,4,2))
  111. 11100 SS = VAL(RIGHT$(TIME$,2))
  112. 11200 IF SS < START.SS THEN SS = SS+60:MM=MM-1
  113. 11300 IF MM < START.MM THEN MM = MM+60:HH=HH-1
  114. 11400 IF HH < START.HH THEN HH = HH+24
  115. 11500 TOTAL.SS = SS-START.SS
  116. 11600 TOTAL.SS = TOTAL.SS+60*(MM-START.MM)
  117. 11700 TOTAL.SS = TOTAL.SS+3600*(HH-START.HH)
  118. 11800 TOTAL.MM = TOTAL.SS/60
  119. 11900 TOTAL.HH = TOTAL.SS/3600
  120. 12000 WPM = WORDS/TOTAL.MM
  121. 12100 LOCATE 23,72
  122. 12200 PRINT USING "###.##";WPM
  123. 12300 IF NOT TRACE GOTO 12700
  124. 12400 LOCATE 21,12
  125. 12500 COLOR WHITE,BLACK
  126. 12600 PRINT USING "MINUTES: ###.##"; TOTAL.MM
  127. 12700 RETURN
  128. 12800 '
  129. 12900 ' Hit ENTER to go on Subroutine:
  130. 13000 '
  131. 13100 PRINT
  132. 13200 PRINT
  133. 13300 LOCATE ,33
  134. 13400 PRINT "Hit ";
  135. 13500 COLOR BLACK+BLINK,WHITE
  136. 13600 PRINT ENTER$;
  137. 13700 COLOR WHITE,BLACK
  138. 13800 PRINT " to go on";
  139. 13900 R = CSRLIN
  140. 14000 GOSUB 4000 'Wait for ENTER
  141. 14100 IF INK$ <> CR$ GOTO 14000
  142. 14200 COLOR WHITE,BLACK
  143. 14300 LOCATE R,1
  144. 14400 PRINT SPACE$(79)
  145. 14500 RETURN
  146. 14600 '
  147. 14700 ' Start doing things:
  148. 14800 '
  149. 14900 COLOR WHITE,BLACK
  150. 15000 CLS
  151. 15100 KEY OFF
  152. 15200 PLAY "mb ms l64"
  153. 15300 COLOR BLACK,WHITE
  154. 15400 LOCATE 1,1,0
  155. 15500 PRINT "PC-TOUCH " STRING$(28,"-");
  156. 15600 PRINT " Program to help you practice touch-typing"
  157. 15700 LOCATE 22,1
  158. 15800 PRINT "Keystrokes     0" SPACE$(42);
  159. 15900 PRINT "Accuracy     100.00 %"
  160. 16000 LOCATE 23,1
  161. 16100 PRINT "Errors         0" SPACE$(42);
  162. 16200 PRINT "Words/Minute   0.00  "
  163. 16300 LOCATE 22,37
  164. 16400 PRINT TIME$
  165. 16500 LOCATE 23,36
  166. 16600 PRINT DATE$
  167. 16700 R = 1
  168. 16800 COLOR WHITE,BLACK
  169. 16900 LOCATE 20,1
  170. 17000 PRINT "Hit ";
  171. 17100 COLOR BLACK,WHITE
  172. 17200 PRINT ENTER$;
  173. 17300 COLOR WHITE,BLACK
  174. 17400 PRINT " to go on";
  175. 17500 LOCATE ,30
  176. 17600 PRINT "Hit ";
  177. 17700 COLOR BLACK,WHITE
  178. 17800 PRINT F1$;
  179. 17900 COLOR WHITE,BLACK
  180. 18000 PRINT " to Halt/Restart";
  181. 18100 LOCATE ,65
  182. 18200 PRINT "Hit ";
  183. 18300 COLOR BLACK,WHITE
  184. 18400 PRINT ESC$;
  185. 18500 COLOR WHITE,BLACK
  186. 18600 PRINT " to stop"
  187. 18700 LOCATE R+3,6
  188. 18800 PRINT "This program  will display  on the screen  lines of";
  189. 18900 PRINT " text  for you to type."
  190. 19000 PRINT "You can't correct mistakes  as you go along,  because that";
  191. 19100 PRINT " won't help you learn"
  192. 19200 PRINT "how not to make them  in the first place.  Just do the best";
  193. 19300 PRINT " you can, and as you"
  194. 19400 PRINT "continue  you will find yourself  making fewer and  fewer";
  195. 19500 PRINT " errors.  And remember"
  196. 19600 PRINT "that when you are just learning to type, accuracy is more";
  197. 19700 PRINT " important than speed."
  198. 19800 FOR K = 1 TO 1
  199. 19900 KEY K,""
  200. 20000 NEXT K
  201. 20100 '
  202. 20200 ' FINDFILE -- Routine for dynamically allocating input files:
  203. 20300 '
  204. 20400 MAX.F = 0
  205. 20500 DIM FILENAME$(1),FILEID$(1)
  206. 20600 FILENAME$(0) = "pc-touch.fil"
  207. 20700 FOR F = 0 TO MAX.F
  208. 20800 FOR M = 0 TO 7
  209. 20900 MODE$ = CHR$(ASC("a")+M)
  210. 21000 FILEID$(F) = MODE$+":"+FILENAME$(F)
  211. 21100 ON ERROR GOTO 21500
  212. 21200 OPEN FILEID$(F) FOR INPUT AS #1
  213. 21300 ON ERROR GOTO 0
  214. 21400 GOTO 21900
  215. 21500 RESUME 21600
  216. 21600 NEXT M
  217. 21700 FILEID$(F) = ""
  218. 21800 GOTO 22000
  219. 21900 CLOSE #1
  220. 22000 NEXT F
  221. 22100 FOR F = 0 TO MAX.F
  222. 22200 IF FILEID$(F) <> "" GOTO 22700
  223. 22300 IF FINDFILE.FAILED GOTO 22600
  224. 22400 FINDFILE.FAILED = -1
  225. 22500 CLS
  226. 22600 PRINT "*** CAN'T FIND " FILENAME$(F) " FILE ***"
  227. 22700 NEXT F
  228. 22800 IF NOT FINDFILE.FAILED GOTO 23200
  229. 22900 PRINT
  230. 23000 PRINT "*** CHANGE DISKETTES AND TRY AGAIN ***"
  231. 23100 SYSTEM
  232. 23200 '
  233. 23300 ' End of FINDFILE Routine:
  234. 23400 '
  235. 23500 PRINT
  236. 23600 PRINT
  237. 23700 GOSUB 12800 'Hit ENTER to go on
  238. 23800 HALTABLE = Y
  239. 23900 COLOR WHITE,BLACK
  240. 24000 LOCATE 13,1
  241. 24100 PRINT SPACE$(79)
  242. 24200 LOCATE 12,21
  243. 24300 PRINT "TYPE THE FOLLOWING LINE EXACTLY AS SHOWN:"
  244. 24400 START.HH = VAL(LEFT$(TIME$,2))
  245. 24500 START.MM = VAL(MID$(TIME$,4,2))
  246. 24600 START.SS = VAL(RIGHT$(TIME$,2))
  247. 24700 IF NOT TRACE GOTO 25100
  248. 24800 LOCATE 21,35
  249. 24900 COLOR WHITE,BLACK
  250. 25000 PRINT "S:" START.HH START.MM START.SS
  251. 25100 '
  252. 25200 ' Open (or re-open) the input file:
  253. 25300 '
  254. 25400 OPEN FILEID$(0) FOR INPUT AS #1
  255. 25500 '
  256. 25600 ' Read the source file:
  257. 25700 '
  258. 25800 IF EOF(1) GOTO 34700
  259. 25900 LINE INPUT #1,RECORD$
  260. 26000 IF RECORD$ = "" GOTO 25800
  261. 26100 RC = 0                  'Define Record Column within buffer
  262. 26200 CC = 41 - LEN(RECORD$)/2          'Define Cursor Column within display area
  263. 26300 COLOR WHITE+HILIT,BLACK
  264. 26400 LOCATE 14,1
  265. 26500 PRINT SPACE$(79)
  266. 26600 LOCATE 14,CC
  267. 26700 PRINT RECORD$
  268. 26800 LOCATE 16,1
  269. 26900 PRINT SPACE$(79)
  270. 27000 LOCATE 16,CC
  271. 27100 PRINT CURSOR$        'Print a cursor
  272. 27200 IN.A.WORD = N
  273. 27300 CC = CC - 1
  274. 27400 '
  275. 27500 ' Wait for a keystroke:
  276. 27600 '
  277. 27700 RC = RC + 1
  278. 27800 CC = CC + 1
  279. 27900 GOSUB 4000 'Wait for keystroke
  280. 28000 IF INK$ = CR$ GOTO 34200             'ENTER key hit
  281. 28100 IF NO.MUSIC GOTO 28700
  282. 28200 IF INK$ < "A" OR  INK$ > "z" GOTO 28700
  283. 28300 IF INK$ > "Z" AND INK$ < "a" GOTO 28700
  284. 28400 N = ASC(INK$) - 65
  285. 28500 IF INK$ < "a" THEN N = N + 32
  286. 28600 PLAY "n=n;"
  287. 28700 '
  288. 28800 ' Display the character:
  289. 28900 '
  290. 29000 LOCATE 16,CC
  291. 29100 OUTK$ = MID$(RECORD$,RC,1)
  292. 29200 IF INK$ <> OUTK$ GOTO 29900
  293. 29300 COLOR WHITE+HILIT,BLACK
  294. 29400 PRINT INK$;
  295. 29500 GOTO 31000
  296. 29600 '
  297. 29700 ' Flag incorrect character:
  298. 29800 '
  299. 29900 COLOR BLACK+BLINK,WHITE
  300. 30000 PRINT INK$;
  301. 30100 ERRORS = ERRORS + 1
  302. 30200 COLOR BLACK,WHITE
  303. 30300 LOCATE 23,11
  304. 30400 PRINT USING "#####,";ERRORS
  305. 30500 IF NO.SOUND GOTO 31000
  306. 30600 BEEP
  307. 30700 '
  308. 30800 ' Update keystroke statistics:
  309. 30900 '
  310. 31000 COLOR WHITE+HILIT,BLACK
  311. 31100 LOCATE 16,CC+1
  312. 31200 PRINT CURSOR$       'Print a cursor
  313. 31300 KEY.STROKES = KEY.STROKES + 1
  314. 31400 COLOR BLACK,WHITE
  315. 31500 LOCATE 22,11
  316. 31600 PRINT USING "#####,";KEY.STROKES
  317. 31700 '
  318. 31800 ' See where we are syntactically:
  319. 31900 '
  320. 32000 IF OUTK$ >= "a" AND OUTK$ <= "z" GOTO 33100
  321. 32100 IF OUTK$ >= "A" AND OUTK$ <= "Z" GOTO 33100
  322. 32200 IF OUTK$ >= "0" AND OUTK$ <= "9" GOTO 33100
  323. 32300 '
  324. 32400 ' We're not in a word:
  325. 32500 '
  326. 32600 IN.A.WORD = N
  327. 32700 GOTO 34100
  328. 32800 '
  329. 32900 ' We're in a word:
  330. 33000 '
  331. 33100 IF IN.A.WORD GOTO 34100
  332. 33200 IN.A.WORD = Y
  333. 33300 WORDS = WORDS + 1
  334. 33400 IF NOT TRACE GOTO 34100
  335. 33500 LOCATE 21,1
  336. 33600 COLOR WHITE,BLACK
  337. 33700 PRINT "WORDS:" WORDS
  338. 33800 '
  339. 33900 ' Loop back to read next character:
  340. 34000 '
  341. 34100 GOTO 27700
  342. 34200 '
  343. 34300 ' End of line:
  344. 34400 '
  345. 34500 GOSUB 10200 'Update Line Statistics
  346. 34600 GOTO 25500 'Loop back to read next record
  347. 34700 '
  348. 34800 ' End of File Routine:
  349. 34900 '
  350. 35000 CLOSE #1
  351. 35100 FREE = FRE(" ")                   'Reorganize string space
  352. 35200 GOTO 25100            'Loop back and re-open the file
  353. 35300 '
  354. 35400 ' User has hit the ESC key:
  355. 35500 '
  356. 35600 CLOSE #1
  357. 35700 '
  358. 35800 ' End of Program:
  359. 35900 '
  360. 36000 HALTABLE = N
  361. 36100 COLOR WHITE,BLACK
  362. 36200 FOR R = 2 TO 21
  363. 36300 LOCATE R,1
  364. 36400 PRINT SPACE$(79)
  365. 36500 NEXT R
  366. 36600 LOCATE 4,6
  367. 36700 PRINT "Thank you for using PC-TOUCH. Feel free to call me at ";
  368. 36800 PRINT "212/674-5848 any day"
  369. 36900 PRINT "between 9AM and 9PM to talk about:"
  370. 37000 PRINT ""
  371. 37100 PRINT ""
  372. 37200 PRINT TAB(11) "1) this program;"
  373. 37300 PRINT TAB(11) "2) the quotations I used;"
  374. 37400 PRINT TAB(11) "3) Bach's Chaconne in d-minor;"
  375. 37500 PRINT TAB(11) "4) dinosaurs in children's literature;"
  376. 37600 PRINT TAB(11) "5) anything that's made your life beautiful lately."
  377. 37700 PRINT
  378. 37800 PRINT
  379. 37900 PRINT TAB(21) "Sincerely,"
  380. 38000 PRINT
  381. 38100 PRINT TAB(21) "Dean Hannotte"
  382. 38200 PRINT TAB(21) "324 East Ninth Street" TAB(55) "(To return to DOS,"
  383. 38300 PRINT TAB(21) "New York, NY 10003"    TAB(57) "just hit ";
  384. 38400 LOCATE ,,0
  385. 38500 COLOR BLACK+BLINK,WHITE
  386. 38600 PRINT ENTER$;
  387. 38700 COLOR WHITE,BLACK
  388. 38800 PRINT ")"
  389. 38900 LOCATE 8,67:PRINT "\";:LOCATE ,69:PRINT "/"
  390. 39000 LOCATE 9,66:PRINT "-- --"
  391. 39100 LOCATE 10,67:PRINT "/";:LOCATE ,69:PRINT "\"
  392. 39200 COLOR WHITE+HILIT+BLINK,BLACK
  393. 39300 LOCATE 7,66:PRINT "*";:LOCATE ,70:PRINT "*"
  394. 39400 LOCATE 9,64:PRINT "*";:LOCATE ,72:PRINT "*"
  395. 39500 LOCATE 11,66:PRINT "*";:LOCATE ,70:PRINT "*"
  396. 39600 GOSUB 4000 'Wait for ENTER
  397. 39700 IF INK$ <> CR$ GOTO 39600
  398. 39800 COLOR WHITE,BLACK           'Scroll off the screen
  399. 39900 LOCATE 23,1              'all but statistics lines.
  400. 40000 FOR X = 1 TO 21              '(Must be 21 for BASCOM)
  401. 40100 PRINT
  402. 40200 NEXT X
  403. 40300 SYSTEM
  404.    'all but statistics lines.
  405. 40000 FOR X = 1 TO 21              '(Must b