home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / sigm / sigmv083.ark / TTYPE.BAS < prev    next >
Encoding:
BASIC Source File  |  1984-04-29  |  21.5 KB  |  757 lines

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