home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / CPM / EDUCATIN / TTYPE3.LBR / TTYPE3.BQS / TTYPE3.BAS
BASIC Source File  |  2000-06-30  |  22KB  |  758 lines

  1. 1    '**********************************************************************
  2. 2    '* PROGRAM FUNCTION: Touch Typing Tutor.                  *
  3. 3    '* VERSION       : 3.0  (Remove all references to I/O ports.)       *
  4. 4    '* DATE WRITTEN    : 16th April 1982.                                 *
  5. 5    '*    BY       : Tim Pearce & Richard Berthet.              *
  6. 6    '*                                      *
  7. 7    '* ADDRESS       : 15/5 Cottonwood Cr., North Ryde 2113.          *
  8. 8    '* PHONE           : (61-2)-88-1640.                      *
  9. 12    '*                                      *
  10. 13    '*        Please leave this notice on the programme.          *    
  11. 14    '**********************************************************************
  12. 15    '
  13. 20    '            ######################## 
  14. 21    '            ###### SECTION 1  ######
  15. 22    '            ######################## 
  16. 23    '
  17. 48    '>>>>>>>>>>>>>>>>>>>>> ADM-31 ASCII CONTROL CODES <<<<<<<<<<<<<<<<<<<<<
  18. 49    '
  19. 50    '    ***************************************************************
  20. 51    '    FUNCTION NAME        STRING NAME        ASCII CODE
  21. 52    '    ***************************************************************
  22. 53    '
  23. 72    '    Return
  24. 73                    RET$        =    CHR$ (13)
  25. 74    '
  26. 75    '    Escape
  27. 76                    ESC$        =    CHR$ (27)
  28. 77    '
  29. 85    '    ------ DYNAMIC VIDEO ATTRIBUTE CONTROL STRINGS ------
  30. 86    '    
  31. 87    '    ***************************************************************
  32. 88    '        FUNCTION NAME        STANDARD CHAR. GEN.     ALT. CHAR. GEN.
  33. 89    '    ***************************************************************
  34. 90    '    
  35. 91    '    Reset to Normal Video                          
  36. 92        STDVID$        =    ESC$+"G"+"0"                          
  37. 94    '
  38. 110    '    Reversing of Area
  39. 111        REVSTD$        =    ESC$+"G"+"4"
  40. 113    '
  41. 126    '    ------ DYNAMIC EDITING CONTROL STRINGS ------
  42. 127    '
  43. 128    '    ***************************************************************
  44. 129    '    OPERATION        HOW TO EXECUTE        DESCRIPTION
  45. 130    '    ***************************************************************
  46. 131    '    
  47. 132    '    Clear Screen                     Clears to SPACES
  48. 133        CLRSCR$        =    ESC$+"+"
  49. 134    '
  50. 157    '    Line Erase
  51. 158        LINERA$        =    ESC$+"T"
  52. 159    '
  53. 160    '    Character Delete
  54. 170        CHRDEL$        =    ESC$+"W"
  55. 180    '
  56. 181    '    Definition of CURSOR LOAD Function.
  57.              i.e. Pushing the Cursor Around Onscreen.
  58. 182        DEF FNCSRLD$ (ROW%,COLUMN%) =
  59.                  ESC$+"="+CHR$ (ROW%+31)+CHR$ (COLUMN%+31)
  60. 183    '
  61. 200    '    Write Protect Mode On
  62. 201        WRTPRTON$    =    ESC$+")"
  63. 203    '    Write Protect Mode Off
  64. 204        WRTPRTOFF$    =    ESC$+"("
  65. 205    '
  66. 900    '**********************************************************************
  67. 910    '
  68. 915    '            ########################
  69. 920    '            ###### SECTION 2  ######
  70. 925    '            ########################
  71. 930    '
  72. 1000    '>>>>>>>>>>>>>>>>>>>>>>>>>> ALTERATIONS <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  73. 1010    '
  74. 1020    '    Date.            Description.  
  75. 1030    '
  76. 1040    '     28/06/82        Reformat HELP presentation.              RB
  77. 3950    '     29/06/82        Added SECTION headings.                 RB
  78. 3951    '     03/07/82        Added [%] to PARAGRAPH variable in Paragraph
  79. 3952    '            read portion of Section 5.             
  80. 3953    '                 Subroutine [9]: Added missing <"> on string. 
  81. 3954    '                 Erase line before End of Exercise printed.   
  82. 3955    '                 Replace NEWLINE% variable in PARAGRAPH check,
  83. 3956    '            with LINESINPARA%                 RB
  84. 3957    '     04/07/82        Moved "End of Exercise" message to Exercise
  85. 3958    '            Row.                         
  86. 3959    '            Renovated Subroutine [7] to print 5 COMMENT
  87. 3960    '            lines each call, I found the scrolling NG.   RB
  88. 3961    '     10/05/86        Removed all references to I/O ports in order
  89. 3962    '            to make program system-independant.
  90. 3963    '            (Keith Petersen, W8SDZ)            KBP
  91. 4000    '**********************************************************************
  92. 4010    '
  93. 4012    '            ########################
  94. 4015    '            ###### SECTION 3  ######
  95. 4017    '            ########################
  96. 4020    '
  97. 4050    '>>>>>>>>>>>>>>>>>>>>>>> INITIALISING BLOCK <<<<<<<<<<<<<<<<<<<<<<<<<<<
  98. 4100    '
  99. 4150    '
  100. 4160    DIM           PARAGRAPHIN$ (20),ADDRESS% (140,2)
  101. 4170    DIM           DISPLAYCHAR% (127),COMMENT$(5)
  102. 4180    '
  103. 4200    'The following addresses and values are system dependant.
  104. 4250    '
  105. 4300    '
  106. 4400    '
  107. 4450    ESCTYPE%      =  127            'ASCII escape character from
  108.                          typing exercise mode.
  109. 4500    ESCCHR$      =  "RUB"        'String to print name of above
  110.                          character.
  111. 4660    FILENUM1%      =  1            'Filenumber for exercise files.
  112. 4670    FILENUM2%    =  2            'Filenumber for help files.
  113. 4680    FILENUM3%    =  3            'Filenumber for keyboard data.
  114. 4700    EXLINELENGTH%     =  80     
  115. 4750    COMMENTSTACK%     =  0     
  116. 4800    NUMOFREPEATS%    =  0     
  117. 4850    PARAGRAPH%     =  0     
  118. 4900    ARRAYROWS%     =  1     
  119. 4950    ARRAYCOLUMNS%    =  2
  120. 5100    '
  121. 5150    WIDTH 255                'Remove  <CR>'s from long lines
  122. 5160    ON ERROR GOTO 40000            'Error handling department.
  123. 5170    DELAY%        =  50            'Time delay factor (See 34100)
  124. 5180    '
  125. 5200    '                SCREEN ADDRESSES
  126. 5250    '
  127. 5300    LHS%          =  1            'Set the left hand side of the
  128.                           screen
  129. 5310    RHS%        =  80
  130. 5350    TOP%          =  1            'Set the top of the screen
  131. 5400    ROWOFFSET%     =  TOP%+15         'Keyboard display
  132. 5450    COLUMNOFFSET%     =  LHS%+10            'Keyboard display
  133. 5500    EXERCISEROW%     =  ROWOFFSET%+5        'Exercise line     
  134. 5550    EXERCISECOLUMN% =  LHS%                'Exercise line
  135. 5600    ECHOROW%     =  EXERCISEROW%+1     'Typing Echo
  136. 5650    ECHOCOLUMN%     =  EXERCISECOLUMN%     'Typing Echo
  137. 5700    COMMENTROW%     =  ROWOFFSET%-7         'Comment area
  138. 5710    COMMENTCOLUMN%    =  EXERCISECOLUMN%    'Comment area
  139. 5850    '
  140. 5900    '**********************************************************************
  141. 5950    '
  142. 5951    '            ########################
  143. 5952    '            ###### SECTION 4  ######
  144. 5953    '            ########################
  145. 5954    '
  146. 5955    '>>>>>>>>>>>>>>>>>>>> START OF ACTIVE PROGRAM CODE <<<<<<<<<<<<<<<<<<<<
  147. 6050    '###### 4a ###### 
  148. 6100    '
  149. 6150    '    First Screenful of instructions
  150. 6200    '
  151. 6250    PRINT    CLRSCR$
  152. 6260    IF CHARACTER$ = "N"
  153.          THEN
  154.             6760
  155. 6300    HELPNUM$    = "0":
  156.      GOSUB 23300
  157. 6550    GOSUB 21400        '[1]:CAPITAL LETTER
  158. 6600    IF CHARACTER$    = "N"
  159.          THEN
  160.             65529
  161.          ELSE
  162.              IF CHARACTER$     = "?"
  163.                  THEN
  164.                      HELPNUM$ = "1":
  165.                      GOSUB 23300: 
  166.                      GOTO 6550        
  167. 6650    '
  168. 6700    '----------------------------------------------------------------------
  169. 6750    '###### 4b ######
  170. 6752    '
  171. 6760    GOSUB    39500        '[9]:PRINT HELP MENU
  172. 6800    PRINT    FNCSRLD$ (ROWOFFSET%,10);
  173.          LINERA$;
  174.          "Error break ?";
  175. 6810    GOSUB 23385 ' GET CHARACTER
  176. 6900    GOSUB 21400        '[1]:CAPITAL LETTER
  177. 6950    IF CHARACTER$    = "Y"
  178.          THEN
  179.              ERRORFLAG% = 1
  180.          ELSE
  181.              IF CHARACTER$     = "?"
  182.                  THEN
  183.                      HELPNUM$ = "2":
  184.                      GOSUB 23300:
  185.                      GOTO 6900
  186.           ELSE
  187.              ERRORFLAG% = 0    
  188. 7000    '
  189. 7050    '----------------------------------------------------------------------
  190. 7100    '###### 4c ######
  191. 7105    '
  192. 7110    GOSUB    39500        '[9]:PRINT HELP MENU
  193. 7115    PRINT    FNCSRLD$ (COMMENTROW%,COMMENTCOLUMN%);
  194.          LINERA$;
  195. "Any LETTER is a valid exercise but presently (28/06/82) only A-J exist."
  196. 7150    PRINT    FNCSRLD$ (ROWOFFSET%,10);
  197.          LINERA$;
  198.          "Which Exercise ?";
  199. 7200    GOSUB 23385 ' GET CHARACTER
  200. 7250    GOSUB 21400        '[1]:CAPITAL LETTER
  201. 7300    IF CHARACTER$ < "A" OR CHARACTER$ > "J"
  202.          THEN
  203.              7150
  204. 7400    PRINT    FNCSRLD$ (COMMENTROW%,COMMENTCOLUMN%);
  205.          LINERA$;
  206. 8050    FILE$         =  "TTYPEX"+CHARACTER$+".DAT"  
  207. 8051    '
  208. 8052    '----------------------------------------------------------------------
  209. 8053    '###### 4d ######
  210. 8054    '
  211. 8060    GOSUB    39500        '[9]:PRINT HELP MENU
  212. 8100    PRINT    FNCSRLD$ (13,1);
  213.          LINERA$;
  214.          FNCSRLD$ (ROWOFFSET%,10);
  215.          LINERA$;
  216.          "Echo ?";
  217. 8110    GOSUB 23385 ' GET CHARACTER
  218. 8200    GOSUB 21400        '[1]:CAPITAL LETTER
  219. 8250    ECHOFLAG%     = 0    
  220. 8300    IF CHARACTER$    = "N"
  221.          THEN
  222.              ECHOFLAG% = 1
  223.          ELSE
  224.              IF CHARACTER$     = "?"
  225.                  THEN
  226.                      HELPNUM$ = "3":
  227.                      GOSUB 23300:
  228.                      GOTO 8200        
  229. 8350    '
  230. 8400    '**********************************************************************
  231. 8450    '
  232. 8451    '            ########################
  233. 8452    '                       ###### SECTION 5  ######
  234. 8453    '            ########################
  235. 8454    '
  236. 8460    '>>>>>>>>>>>>>>>>>>>  SET UP & CHECK EXERCISE FILE <<<<<<<<<<<<<<<<<<<<
  237. 8465    '
  238. 8500    PRINT    CLRSCR$         
  239. 8550    '                       
  240. 8600    GOSUB 29500        '[5]:PRINT KEYBOARD
  241. 10950    '
  242. 11300    '    set up input file.
  243. 11400    OPEN "I",#FILENUM1%,FILE$
  244. 11500    '
  245. 11550    '    Remove old line
  246. 11600    ECHOCOLUMN%     = LHS%     
  247. 11650    LINEFLAG%     = 0
  248. 11700    PRINT    FNCSRLD$ (EXERCISEROW%,EXERCISECOLUMN%);
  249.          LINERA$;
  250.          FNCSRLD$ (ECHOROW%,ECHOCOLUMN%);
  251.          LINERA$; 
  252. 11750    TYPEDIN$    = ""
  253. 11800    '    Check that it is not a paragraph
  254. 11850    IF PARAGRAPH%    = 0
  255.          THEN
  256.              12300
  257. 11900    ALINE$         = PARAGRAPHIN$ (NUMOFTEXTLINES%):
  258.     NUMOFTEXTLINES%     = NUMOFTEXTLINES% +1:
  259.     IF NUMOFTEXTLINES% = LINESINPARA%+1
  260.          THEN
  261.              NUMOFREPEATS% = NUMOFREPEATS%-1:
  262.              NUMOFTEXTLINES%     = 1:
  263.              IF NUMOFREPEATS%    = 0
  264.                  THEN
  265.                      PARAGRAPH% = 0
  266. 12150    '
  267. 12200    GOTO 12700    
  268. 12250    '
  269. 12300    IF NUMOFREPEATS%    = 0
  270.          THEN
  271.              12550
  272. 12350    NUMOFREPEATS%        = NUMOFREPEATS% -1:
  273.      GOTO 14050
  274. 12500    '
  275. 12550    IF EOF (FILENUM1%)
  276.          THEN
  277.              PRINT     FNCSRLD$(EXERCISEROW%,EXERCISECOLUMN%+15);
  278.                  LINERA$;
  279.                  "END of EXERCISE, Please WAIT for MENU.";:
  280.              GOSUB 34100:
  281.               GOTO 17200
  282. 12600    '
  283. 12650    LINE INPUT# FILENUM1%,ALINE$
  284. 12700    ALINE$      = ALINE$+CHR$ (13)
  285. 12750    IF PARAGRAPH%     = 0
  286.          THEN
  287.              NEWLINE% = NEWLINE%+1
  288. 12800    EXLINELENGTH%     = LEN (ALINE$)
  289. 12850    '    CHECK for repeated line.
  290. 12900    IF LEFT$ (ALINE$,1) <> "|"
  291.          THEN
  292.              13950
  293. 12950    CHARACTER$     = MID$ (ALINE$,2,1)     
  294. 13000    GOSUB 21400        '[1]:CAPITAL LETTER
  295. 13050    IF CHARACTER$     = "P"
  296.          THEN
  297.              13400
  298. 13100    NUMOFREPEATS%    = VAL (CHARACTER$)-1
  299. 13150    EXLINELENGTH%     = EXLINELENGTH%-2     
  300. 13200    ALINE$         = RIGHT$ (ALINE$,EXLINELENGTH%)
  301. 13250    '
  302. 13300    GOTO 13950
  303. 13350    '
  304. 13400    '    Paragraph Read In. 
  305. 13450    NUMOFREPEATS%    = VAL (MID$ (ALINE$,3,1))     
  306. 13500    LINESINPARA%      = VAL (MID$ (ALINE$,5,2))     
  307. 13550    PARAGRAPH%     = 1    
  308. 13600    NUMOFTEXTLINES%    = 1
  309. 13650    FOR ILOOP% = 1 TO  LINESINPARA% 
  310. 13660        'PARAGRAPHIN$ contains up to 20 lines of input for repeating
  311.          whole paragraphs.
  312. 13700        LINE INPUT# FILENUM1%,PARAGRAPHIN$ (ILOOP%)     
  313. 13750    NEXT ILOOP%
  314. 13800    '
  315. 13850    GOTO 11550
  316. 13900    '
  317. 13950    '    CHECK FOR COMMENT
  318. 14000    IF LEFT$ (ALINE$,2) = "!#"
  319.         THEN
  320.              GOSUB 33020:
  321.              GOTO 11550
  322. 14050    CHARCOUNT%     = EXLINELENGTH%
  323. 14100    PRINT     FNCSRLD$ (EXERCISEROW%,EXERCISECOLUMN%)
  324. 14150    PRINT     FNCSRLD$ (EXERCISEROW%,EXERCISECOLUMN%);
  325.           LEFT$ (ALINE$,EXLINELENGTH%-1)
  326. 14200    '
  327. 14201    '**********************************************************************
  328. 14202    '
  329. 14203    '            ########################
  330. 14204    '                       ###### SECTION 6  ######
  331. 14205    '                       ########################
  332. 14206    '
  333. 14250    '>>>>>>>>>>>>>>>>>>>>>>>> KEYBOARD SCAN SECTION <<<<<<<<<<<<<<<<<<<<<<<
  334. 14300    '             I.E. The actual exercise begins here
  335. 14350    '
  336. 14400    FOR ILOOP% = 1 TO EXLINELENGTH%
  337. 14450        IF ILOOP%     =  EXLINELENGTH%
  338.              THEN
  339.                  LINEFLAG% = 1
  340. 14500        CHARACTER$     =  MID$ (ALINE$,ILOOP%,1)
  341. 14550        ASCIINUMBER%     =  ASC (CHARACTER$)
  342. 14600        '    Change ROW% and COLUMN% for different 
  343.              Direct Cursor Addressing.
  344. 14650        ROW%         =  ADDRESS% (ASCIINUMBER%,ARRAYROWS%)     
  345. 14700         COLUMN%     =  ADDRESS% (ASCIINUMBER%,ARRAYCOLUMNS%) 
  346. 14750        PRINT    FNCSRLD$ (ROW%,COLUMN%-1);
  347.              REVSTD$;
  348.              CHARACTER$;
  349.              STDVID$;
  350. 14760        PRINT     FNCSRLD$ (ECHOROW%,ECHOCOLUMN%); 
  351. 14800        '    Program waits for change of input status.
  352. 14850        WAITCHR$ = INKEY$ : IF WAITCHR$="" THEN 14850
  353. 14900        NUMOFWORDS     =  NUMOFWORDS+.2
  354. 14950        '    Program reads data from dataport.
  355. 15000        KEYBDCHAR%    =  ASC(WAITCHR$)
  356. 15050        PRINT     FNCSRLD$ (ROW%,COLUMN%-1);
  357.              WRTPRTON$;
  358.              STDVID$;
  359.              CHR$ (DISPLAYCHAR% (ASCIINUMBER%));
  360.              WRTPRTOFF$
  361. 15100        IF KEYBDCHAR%    =  ESCTYPE%
  362.              THEN
  363.                  17200
  364. 15150        IF KEYBDCHAR%    =  13
  365.              THEN
  366.                  LINEFLAG% = 1:
  367.                  GOTO 16250
  368. 15200        '
  369. 15300        '
  370. 15350        IF ECHOFLAG%     =  1
  371.              THEN
  372.                  TYPEDIN$ = TYPEDIN$+CHR$ (KEYBDCHAR%):
  373.              IF KEYBDCHAR%    =  ASCIINUMBER%
  374.                  THEN
  375.                      16250
  376.                  ELSE
  377.                      15700
  378. 15450        '    Change the typing Echo definition in the next line for
  379.              different Dir Cus Adr.
  380. 15550         PRINT     FNCSRLD$ (ECHOROW%,ECHOCOLUMN%);
  381.              CHR$ (KEYBDCHAR%);
  382. 15600        ECHOCOLUMN%     =  ECHOCOLUMN%+1 
  383. 15650        IF KEYBDCHAR%    =  ASCIINUMBER%
  384.              THEN
  385.                  16250
  386. 15700        '    Error
  387. 15750        ERRORCOUNT%     =  ERRORCOUNT%+1
  388. 15800         CHARCOUNT%     =  CHARCOUNT%+1
  389. 15850        IF ERRORFLAG%     =  0
  390.              THEN
  391.                  16250
  392. 15900        ECHOCOLUMN%     =  ECHOCOLUMN%-1
  393. 15950        PRINT         CHR$ (7)
  394. 16100        IF ECHOCOLUMN%     <  0
  395.              THEN
  396.                  ECHOCOLUMN% = 0
  397. 16150        '
  398. 16200        GOTO 14750
  399. 16250        '
  400. 16300        IF LINEFLAG%     =  0
  401.              THEN
  402.                  16950
  403. 16350        IF ECHOFLAG%     =  0
  404.              THEN
  405.                  11550
  406. 16400        '    Display line that was typed in but not echoed
  407.              previously
  408. 16450        PRINT     FNCSRLD$ (ECHOROW%,ECHOCOLUMN%);
  409.               TYPEDIN$ 
  410. 16500        '    Program waits for change of input status.
  411. 16550        WAITCHR$ = INKEY$ : IF WAITCHR$="" THEN 16500
  412. 16600        '    Program reads data from dataport.
  413. 16650        KEYBDCHR%    =  ASC(INKEY$)
  414. 16700        IF KEYBDCHAR%    =  13
  415.              THEN
  416.                  11550
  417. 16750        IF KEYBDCHAR%    =  ESCTYPE%
  418.              THEN
  419.                  17200
  420. 16800        '
  421. 16850        GOTO 16550
  422. 16900        '
  423. 16950    NEXT ILOOP%
  424. 17000    '
  425. 17050    '    End of keyboard scan 
  426. 17100    '
  427. 17150    GOTO 11550
  428. 17151    '
  429. 17160    '**********************************************************************
  430. 17200    '    
  431. 17201    '            ########################
  432. 17202    '                       ###### SECTION 7  ######
  433. 17203    '                       ########################
  434. 17204    '
  435. 17210    '>>>>>>>>>>>>>>>>>>> SECTION PROVIDES POSSIBILITIES <<<<<<<<<<<<<<<<<<<
  436. 17220    '                 TO ESCAPE OR ALTER PROGRAM FLOW. 
  437. 17230    '
  438. 17250    HELPNUM$ = "4":
  439.              GOSUB 23300:
  440.              GOTO 17450
  441. 17450    CHARACTER$     = CHARACTER$+"e"
  442. 17500   GOSUB 21400        '[1]:CAPITAL LETTER
  443. 17510    '
  444. 17550    IF CHARACTER$     = "N"
  445.          THEN
  446.              CLOSE  FILENUM1%:
  447.              GOTO 4300
  448. 17560    '
  449. 17760    '
  450. 17800    IF CHARACTER$     = "R"
  451.          THEN
  452.              NUMOFREPEATS% = NUMOFREPEATS% +1:
  453.              GOSUB 29500:
  454.              GOTO 11550
  455. 17850    '
  456. 17900    IF CHARACTER$     = CHR$(13)
  457.          THEN
  458.              GOSUB 29500:
  459.              GOTO  11550
  460. 17930    '
  461. 17990    '
  462. 18000    IF CHARACTER$     = "M"
  463.          THEN
  464.              HELPNUM$ = "5":
  465.              GOSUB 23300:
  466.              GOTO 17450
  467. 18040    '
  468. 18050    IF CHARACTER$     = "S"
  469.          THEN
  470.              GOSUB 32110:
  471.              GOSUB 29500:
  472.              GOTO 11550
  473. 18090    '    
  474. 18100    IF CHARACTER$     = "L"
  475.          THEN
  476.              PRINT     FNCSRLD$(COMMENTROW%,COMMENTCOLUMN%+10);
  477.              " Exercise line Number is;  "; NEWLINE%;:
  478.              GOSUB 34100:
  479.              GOTO 17250
  480. 18145    '
  481. 18150    IF CHARACTER$     = "W"
  482.          THEN
  483.              18160
  484.          ELSE
  485.              18250
  486. 18160            GOSUB 21900    '[2]:ERROR COUNT
  487. 18165            PRINT FNCSRLD$(COMMENTROW%,COMMENTCOLUMN%+10);
  488.                     LINERA$;
  489.                 "Reset ERROR count (Y/N) ?";
  490. 18166            GOSUB 23385 ' GET CHARACTER
  491. 18170            GOSUB 21400    '[1]:CAPITAL LETTER
  492. 18190            IF CHARACTER$     = "Y"
  493.                  THEN
  494.                      NUMOFWORDS = 0:
  495.                      ERRORCOUNT% = 0:
  496.                      GOTO 17250
  497. 18196    '
  498. 18197    '
  499. 18198    '
  500. 18250    IF CHARACTER$     = "Q"
  501.          THEN
  502.              SYSTEM
  503. 18300    '
  504. 18320    IF CHARACTER$    = "E"
  505.         THEN
  506.              GOTO 65529
  507. 18350    GOTO 17250    'IF NOT MATCHED, RETURN TO MENU
  508. 20800    '
  509. 21150    '
  510. 21200    '**********************************************************************
  511. 21250    '
  512. 21251    '            ########################
  513. 21252    '                       ###### SECTION 8  ######
  514. 21253    '                       ########################
  515. 21254    '
  516. 21255    '>>>>>>>>>>>>>>>>>>>>>>>>>>>> SUBROUTINES <<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  517. 21300    '
  518. 21350    '
  519. 21400    '    Subroutine [1]: Returns  first letter of a string as a CAPITAL.
  520. 21450    '
  521. 21500    CHARACTER$     = LEFT$ (CHARACTER$,1)
  522. 21550    IF CHARACTER$     > "`"
  523.          THEN
  524.              IF CHARACTER$ < "{"
  525.                  THEN
  526.                      21650
  527. 21600    RETURN
  528. 21650    CHARACTER$     = CHR$ (ASC (CHARACTER$)-32)
  529. 21700    RETURN
  530. 21750    '
  531. 21800    '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  532. 21850    '
  533. 21900    '    Subroutine [2]: Prints ERROR COUNT message and total.
  534. 21950    '
  535. 22000    PRINT     CLRSCR$    
  536. 22050    PRINT     FNCSRLD$(COMMENTROW%,COMMENTCOLUMN%+10);
  537.          ERRORCOUNT%;
  538.          " ERRORS in";
  539.          NUMOFWORDS;
  540.          " Words ";:
  541.          GOSUB 34100 
  542. 22100    IF ERRORCOUNT%     = 0
  543.          THEN
  544.              RETURN
  545. 22150    PRINT     " I.E.";
  546.          NUMOFWORDS/ERRORCOUNT%;
  547.          " Words per error":
  548.          GOSUB 34100    
  549. 22200    RETURN
  550. 22250    '
  551. 22300    '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  552. 22350    '
  553. 22400    '    Subroutine [3]: Changes the INSTRUCTION line ADDRESS.
  554. 22450    '
  555. 22460    '    +++++ THIS SUBROUTINE NOT USED IN THIS VERSION +++++        
  556. 22470    '
  557. 22500    'IF INSTCOLUMN%     < 70
  558.          THEN
  559.              RETURN
  560. 22550    'INSTCOLUMN%     = LHS%
  561. 22600    'INSTROW%     = INSTROW%+1
  562. 22650    'PRINT 
  563. 22700    'IF INSTROW%       >=   TOP%+6
  564.          THEN
  565.              INSTROW% = TOP%
  566. 22750    'RETURN
  567. 22800    '
  568. 22850    '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  569. 23270    '
  570. 23300    '    Subroutine [4]: Access and PRINT HELP Files.
  571. 23310    '
  572. 23320    PRINT     CLRSCR$
  573. 23330    OPEN "I", # FILENUM2%, "TTHELP"+HELPNUM$+".DAT"
  574. 23340    IF EOF (FILENUM2%)
  575.          THEN
  576.              GOSUB 23385:
  577.              CLOSE # FILENUM2%:
  578.              PRINT     CLRSCR$:
  579.              RETURN
  580. 23350    LINE INPUT # FILENUM2%, LINES$
  581. 23360    IF LEFT$ (LINES$,1) = "#"
  582.          THEN
  583.              WHILE INKEY$ <> RET$:
  584.              WEND:
  585.              PRINT     CLRSCR$:
  586.              GOTO  23340
  587. 23370    PRINT     LINES$
  588. 23380    GOTO 23340
  589. 23382    '
  590. 23385    CHARACTER$ = INKEY$ : IF CHARACTER$="" THEN 23385
  591. 23390    RETURN
  592. 23400    '
  593. 29450    '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  594. 29460    '
  595. 29500    '    Subroutine [5]: Set up Addresses & Keyboard locations          
  596. 29550    '               and PRINT KEYBOARD.
  597. 29600    '
  598. 29605    PRINT    FNCSRLD$ (1,25);
  599.          LINERA$;
  600.          WRTPRTON$;
  601.          "Hit "+ESCCHR$+" key for MENU";
  602. 29606    '
  603. 29610    OPEN "I",# FILENUM3%,"TTKEYBD.DAT"
  604. 29620    '
  605. 29650    ROW%     = ROWOFFSET%
  606. 29700    COLUMN% = COLUMNOFFSET%
  607. 29750    FOR ILOOP%= 1 TO 140
  608. 29800        ADDRESS% (ILOOP%, 1) = 1
  609. 29850        ADDRESS% (ILOOP%, 2) = 1
  610. 29900    NEXT ILOOP%
  611. 29950      '    ADDRESS% contains the character addresses. DISPLAYCHAR%
  612. 30000    '     contains the displayed character corresponding to that address.
  613. 30050    '
  614. 30100    FOR JLOOP% = 1 TO 5
  615. 30150        INPUT # FILENUM3%, NUMOFKEYS%
  616. 30250        ADDCHAR$ = ""
  617. 30300        FOR ILOOP% = 1 TO NUMOFKEYS%
  618. 30350            INPUT # FILENUM3%, CHARACTER$
  619. 30400            ASCIINUMBER% = ASC (CHARACTER$)
  620. 30450            '    Save character address
  621. 30500            ADDRESS% (ASCIINUMBER%,ARRAYROWS%) = ROW%     
  622. 30550            ADDRESS% (ASCIINUMBER%,ARRAYCOLUMNS%) = COLUMN%
  623. 30600            PRINT     FNCSRLD$ (ROW%,COLUMN%);
  624.                   CHARACTER$; 
  625. 30650            '    Keep record of character corresponding to this
  626.                  address
  627. 30700            ADDCHAR$     = ADDCHAR$+CHARACTER$     
  628. 30750            DISPLAYCHAR% (ASCIINUMBER%)     = ASCIINUMBER%
  629. 30800              COLUMN%     = COLUMN%+4 
  630. 30850        NEXT ILOOP%
  631. 30900        COLUMN% = COLUMN%-4*NUMOFKEYS% 
  632. 30950        FOR ILOOP% = 1 TO NUMOFKEYS%     
  633. 31000            INPUT # FILENUM3%, CHARACTER$
  634. 31050            '    SAVE shift character address (BASIC can't get
  635.                  a " from data)
  636. 31100            IF ILOOP% = 2
  637.                  THEN
  638.                      IF JLOOP% = 1
  639.                          THEN
  640.                              CHARACTER$ = CHR$ (34)
  641. 31150            ASCIINUMBER% = ASC (CHARACTER$)    
  642. 31200            ADDRESS% (ASCIINUMBER%,ARRAYROWS%) = ROW%    
  643. 31250            ADDRESS% (ASCIINUMBER%,ARRAYCOLUMNS%) = COLUMN%
  644. 31300            DISPLAYCHAR% (ASCIINUMBER%) =
  645.                      ASC (MID$ (ADDCHAR$,ILOOP%,1))
  646. 31350            '    DISPLAYCHAR% (ASCIINUMBER%) now contains the
  647.                  normally displayed char. at the pos'n of l$
  648. 31400            COLUMN% = COLUMN%+4 
  649. 31450        NEXT ILOOP%
  650. 31500        COLUMN% = COLUMN%-4*NUMOFKEYS%+2     
  651. 31550        ROW%     = ROW%+1 
  652. 31600    NEXT JLOOP%
  653. 31610    PRINT     WRTPRTOFF$
  654. 31620    CLOSE FILENUM3%
  655. 31650    '    End of keyboard setup
  656. 31700    '
  657. 31750    RETURN
  658. 31760    '
  659. 32000    '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  660. 32100    '
  661. 32110    '    Subroutine [6]: SKIP Exercise LINES.
  662. 32120    '
  663. 32130    PRINT FNCSRLD$(COMMENTROW%,COMMENTCOLUMN%+10);
  664.         "Number of lines to SKIP ?";
  665. 32135    WAITCHR$ = INKEY$ : IF WAITCHR$="" THEN 32135
  666. 32136    NUMOFLINES% = ASC(WAITCHR$)
  667. 32140    FOR ILOOP% = 1 TO  NUMOFLINES% 
  668. 32150        IF EOF (FILENUM1%)
  669.              THEN
  670.                  12550
  671. 32160        LINE INPUT# FILENUM1%,INPCHAR$
  672. 32170    NEXT ILOOP%
  673. 32180    NUMOFREPEATS%    = 0
  674. 32190    NEWLINE%     = NEWLINE%+NUMOFLINES% 
  675. 32200    '
  676. 32210    PRINT    FNCSRLD$ (COMMENTROW%,COMMENTCOLUMN%+10);
  677.         LINERA$;
  678. 32220    RETURN
  679. 32230    '
  680. 33000    '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  681. 33002    '
  682. 33020    '    Subroutine [7]: COMMENT PRINT
  683. 33025    '
  684. 33070    IF EOF(FILENUM1%)
  685.         THEN
  686.             RETURN
  687. 33080    '
  688. 33082    COMMENT$(0)    = MID$(ALINE$,3)
  689. 33084    FOR ILOOP%    = 1 TO 4
  690. 33090        LINE INPUT #FILENUM1%,ALINE$
  691. 33095        COMMENT$(ILOOP%)    = MID$(ALINE$,3)
  692. 33100    NEXT ILOOP%
  693. 33101    '
  694. 33105    FOR ILOOP%    = 0 TO 4
  695. 33110        PRINT FNCSRLD$(COMMENTROW%+ILOOP%,COMMENTCOLUMN%);
  696.                LINERA$;
  697.                COMMENT$(ILOOP%)
  698. 33120    NEXT ILOOP%
  699. 33130    '        
  700. 33180    RETURN
  701. 33190    '
  702. 34000    '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  703. 34050    '
  704. 34100    '    Subroutine [8]: TIME DELAY.
  705. 34150    '
  706. 34200    FOR TIMEOUT% = 1 TO DELAY%
  707. 34210            FOR MORE% = DELAY% TO 1 STEP -1
  708. 34220                WASTE% = WASTE%+1
  709. 34230            NEXT MORE%
  710. 34300    NEXT TIMEOUT%
  711. 34350    RETURN
  712. 39000    '
  713. 39010    '~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  714. 39020    '
  715. 39500    '    Subroutine [9]: PRINT HELP MENU.
  716. 39510    '
  717. 39520    PRINT     FNCSRLD$ (TOP%,10);
  718.          "<?> - Will PRINT an explanation of the question. "
  719. 39530    PRINT    FNCSRLD$ (TOP%+2,10);
  720.          "<Y> - ENABLES the function."
  721. 39540    PRINT    FNCSRLD$ (TOP%+4,10);
  722.          "<N> - DISABLES the function."
  723. 39550    PRINT    FNCSRLD$ (TOP%+6,10);
  724.          "<RETURN> - Is the DEFAULT condition."
  725. 39900    '
  726. 39905    RETURN
  727. 39910    '
  728. 39999    '**********************************************************************
  729. 40000    '
  730. 40001    '            ########################
  731. 40002    '                       ###### SECTION 9  ######
  732. 40003    '                       ########################
  733. 40004    '
  734. 40005    '>>>>>>>>>>>>>>>>>>>>>>>>>> ERROR TRAPPING <<<<<<<<<<<<<<<<<<<<<<<<<<<<
  735. 40020    '
  736. 40030    DRIVE$    ="B:"
  737. 40100    IF ERR = 53 AND ERL = 11400
  738.         THEN
  739.              CLOSE #FILENUM1%:
  740.              OPEN "I",#FILENUM1%,DRIVE$+FILE$:
  741.              RESUME 11600    
  742. 40400    '
  743. 40410    IF ERR = 53 AND ERL = 29610
  744.         THEN
  745.              CLOSE #FILENUM3%:
  746.              OPEN "I",#FILENUM3%,DRIVE$+"TTKEYBD.DAT":
  747.              RESUME 29650
  748. 40500    '
  749. 40510    IF ERR    = 53 AND ERL = 23330
  750.         THEN
  751.              CLOSE #FILENUM2%:
  752.              OPEN "I",#FILENUM2%,DRIVE$+"TTHELP"+HELPNUM$+".DAT":
  753.              RESUME 23340             
  754. 65500    '**********************************************************************
  755. 65529    END
  756. PNUM$+".DAT":
  757.              RESUME 23340             
  758. 65500    '**********