a I :Jump over the INKEY subroutine1b I%    : IN.CHR$ : IN.CHR$ "" I% : Qb: Free GOSUB routine lineb :**********************************************************************b :* PROGRAM FUNCTION: Touch Typing Tutor. *$c :* VERSION : 2.0 (Direct Cursor Addressing & Help.) *sc :* DATE WRITTEN : 16th April 1982. *c :* BY : Tim Pearce & Richard Berthet. *c :* * d :* ADDRESS : 15/5 Cottonwood Cr., North Ryde 2113. *Ad :* PHONE : (61-2)-88-1640. *Zd :* *d :* Please leave this notice on the programme. * d :**********************************************************************d :e : This copy distributed by BOOG Se : -- the British Osborne Owners Group`e :e : ######################## e : ###### SECTION 1 ######e :e0 :>>>>>>>>>>>>>>>>>>>>> O1 ASCII CONTROL CODES <<<<<<<<<<<<<<<<<<<<<f1 :Of2 : ***************************************************************f3 : FUNCTION NAME STRING NAME ASCII CODEf4 : ***************************************************************f5 :fH : ReturnfI RET$ ( )gJ :gK : Escape,gL ESC$ ()5gM :tgU : ------ DYNAMIC VIDEO ATTRIBUTE CONTROL STRINGS ------~gV : gW : ***************************************************************hX : FUNCTION NAME STANDARD CHAR. GEN. ALT. CHAR. GEN.WhY : ***************************************************************ahZ : h[ : Switch to normal intensity video displayh\ STDVID$ ESC$()h^ :hn : Switch to half intensityho REVSTD$ ESC$()iq :8i~ : ------ DYNAMIC EDITING CONTROL STRINGS ------Ai :i : ***************************************************************i : OPERATION HOW TO EXECUTE DESCRIPTIONj : *************************************************************** j : 3j : Clear Screen and Home Cursorbj CLRSCR$ ESC$( )()ESC$()kj :j : Clear from current Cursor position to end of linej LINERA$ ESC$()j :j : Character Deletek CHRDEL$ ESC$() k :fk : Definition of CURSOR LOAD Function. i.e. Pushing the Cursor Around Onscreen.k CSRLD$ (ROW%,COLUMN%) ESC$()() (COLUMN%)(ROW%)k : l :**********************************************************************l ::l : ########################^l : ###### SECTION 2 ######l : ########################l :l :>>>>>>>>>>>>>>>>>>>>>>>>>> ALTERATIONS <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<l : m : Date. Description. m :Om : 28/06/82 Reformat HELP presentation. RBmn : 29/06/82 Added SECTION headings. RBmo : 03/07/82 Added [%] to PARAGRAPH variable in Paragraphmp : read portion of Section 5. 7nq : Subroutine [9]: Added missing <"> on string. unr : Erase line before End of Exercise printed. ns : Replace NEWLINE% variable in PARAGRAPH check,nt : with LINESINPARA% RBou : 04/07/82 Moved "End of Exercise" message to Exercise7ov : Row. now : Renovated Subroutine [7] to print 5 COMMENTox : lines each call, I found the scrolling NG. RBo :**********************************************************************p :%p : ########################Ip : ###### SECTION 3 ######mp : ########################vp :p :>>>>>>>>>>>>>>>>>>>>>>> INITIALISING BLOCK <<<<<<<<<<<<<<<<<<<<<<<<<<<p :p6 :q@ PARAGRAPHIN$ (),ADDRESS% (,)-qJ DISPLAYCHAR% (),COMMENT$()6qT :wqh :The following addresses and values are system dependant.q :q0 :qb ESCTYPE%  :ASCII escape character from typing exercise mode.)r ESCCHR$ "ESC" :String to print name of above character.cr4 FILENUM1%  :Filenumber for exercise files.r> FILENUM2%  :Filenumber for help files.rH FILENUM3%  :Filenumber for keyboard data.r\ EXLINELENGTH% P s COMMENTSTACK%  #s NUMOFREPEATS%  =s PARAGRAPH%  Us$ ARRAYROWS%  msV ARRAYCOLUMNS% vs :s  :Remove 's from long liness( ^ :Error handling department. t2 DELAY%  :Time delay factor (See 34100)3tP : SCREEN ADDRESSES :v? : ########################v@ : ###### SECTION 4 ######"wA : ########################+wB :zwC :>>>>>>>>>>>>>>>>>>>> START OF ACTIVE PROGRAM CODE <<<<<<<<<<<<<<<<<<<<w :###### 4a ###### w :w : First Screenful of instructionsw8 :wj CLRSCR$xt CHARACTER$ "N" hx HELPNUM$ "0": [Ax S :[1]:CAPITAL LETTERx CHARACTER$ "N"  : CHARACTER$ "?" HELPNUM$ "1": [:  x :y, :-----------------------------------------------------------------------y^ :###### 4b ######6y` :Yyh ` :[9]:PRINT HELP MENUy CSRLD$ (ROWOFFSET%, ); LINERA$; "Error break ?";y  : CHARACTER$ IN.CHR$ : WAIT STATUSPORT%,2: CHARACTER$ = CHR$(INP(DATAPORT%))z S :[1]:CAPITAL LETTERz& CHARACTER$ "Y" ERRORFLAG%  : CHARACTER$ "?" HELPNUM$ "2": [:  : ERRORFLAG%  zX :{ :----------------------------------------------------------------------,{ :###### 4c ######5{ :X{ ` :[9]:PRINT HELP MENU{ CSRLD$ ( ,COMMENTCOLUMN%); LINERA$; "Any letter A -> J is a valid exercise."{ CSRLD$ (ROWOFFSET%, ); LINERA$; "Which Exercise ?";Q|   : CHARACTER$ IN.CHR$ : WAIT STATUSPORT%,2: CHARACTER$ = CHR$(INP(DATAPORT%))s|R S :[1]:CAPITAL LETTER| CHARACTER$ "A" CHARACTER$ "J" | CSRLD$ ( ,COMMENTCOLUMN%); LINERA$; }r FILE$ "TTYPEX"CHARACTER$".DAT" }s :b}t :----------------------------------------------------------------------{}u :###### 4d ######}v :}| ` :[9]:PRINT HELP MENU~ CSRLD$ ( ,); LINERA$; CSRLD$ (ROWOFFSET%, ); LINERA$; "Echo ?";`~  : CHARACTER$ IN.CHR$ : WAIT STATUSPORT%,2: CHARACTER$ = CHR$(INP(DATAPORT%))~ S :[1]:CAPITAL LETTER~: ECHOFLAG%  l CHARACTER$ "N" ECHOFLAG%  : CHARACTER$ "?" HELPNUM$ "3": [:  % :t :**********************************************************************}! :! : ########################! : ###### SECTION 5 ######! : ########################! :U ! :>>>>>>>>>>>>>>>>>>> SET UP & CHECK EXERCISE FILE <<<<<<<<<<<<<<<<<<<<^! :v4! CLRSCR$ f! : ! s :[5]:PRINT KEYBOARD* :݀$, : set up input file., "I",#FILENUM1%,FILE$, :- : Remove old line6P- ECHOCOLUMN% LHS% J- LINEFLAG% - CSRLD$ (EXERCISEROW%,EXERCISECOLUMN%); LINERA$; CSRLD$ (ECHOROW%,ECHOCOLUMN%); LINERA$; ȁ- TYPEDIN$ "". : Check that it is not a paragraphJ. PARAGRAPH%   0 |. ALINE$ PARAGRAPHIN$ (NUMOFTEXTLINES%): NUMOFTEXTLINES% NUMOFTEXTLINES% : NUMOFTEXTLINES% LINESINPARA% NUMOFREPEATS% NUMOFREPEATS%: NUMOFTEXTLINES% : NUMOFREPEATS%  PARAGRAPH% v/ :/ 1 '/ :M 0 NUMOFREPEATS%  1}>0 NUMOFREPEATS% NUMOFREPEATS% : 60 :&1 (FILENUM1%) CSRLD$(EXERCISEROW%,EXERCISECOLUMN%); LINERA$; "END of EXERCISE, Please WAIT for MENU.";: : bC/81 :Jj1 # FILENUM1%,ALINE$i1 ALINE$ ALINE$ ( )1 PARAGRAPH%  NEWLINE% NEWLINE%2 EXLINELENGTH% (ALINE$)22 : CHECK for repeated line. d2 (ALINE$,) "|" 612 CHARACTER$ (ALINE$,,) S2 S :[1]:CAPITAL LETTERy2 CHARACTER$ "P" 4,3 NUMOFREPEATS% (CHARACTER$)ȅ^3 EXLINELENGTH% EXLINELENGTH% 3 ALINE$ (ALINE$,EXLINELENGTH%)3 :3 6&4 :,X4 : Paragraph Read In. X4 NUMOFREPEATS% ( (ALINE$,,)) 4 LINESINPARA% ( (ALINE$,,)) 4 PARAGRAPH%  5 NUMOFTEXTLINES% ׆R5 ILOOP%  LINESINPARA% 1\5 :PARAGRAPHIN$ contains up to 20 lines of input for repeating whole paragraphs.^5 # FILENUM1%,PARAGRAPHIN$ (ILOOP%) l5 ILOOP%u5 :6 P-L6 :~6 : CHECK FOR COMMENTه6 (ALINE$,) "!#" .: P-6 CHARCOUNT% EXLINELENGTH%)7 CSRLD$ (EXERCISEROW%,EXERCISECOLUMN%)yF7 CSRLD$ (EXERCISEROW%,EXERCISECOLUMN%); (ALINE$,EXLINELENGTH%)x7 :шy7 :**********************************************************************ڈz7 :{7 : ########################6|7 : ###### SECTION 6 ######n}7 : ########################w~7 :Ɖ7 :>>>>>>>>>>>>>>>>>>>>>>>> KEYBOARD SCAN SECTION <<<<<<<<<<<<<<<<<<<<<<<7 : I.E. The actual exercise begins here8 :(@8 ILOOP%  EXLINELENGTH%br8 ILOOP% EXLINELENGTH% LINEFLAG% 8 CHARACTER$ (ALINE$,ILOOP%,)8 ASCIINUMBER% (CHARACTER$)9 : Change ROW% and COLUMN% for different Direct Cursor Addressing.7:9 ROW% ADDRESS% (ASCIINUMBER%,ARRAYROWS%) ql9 COLUMN% ADDRESS% (ASCIINUMBER%,ARRAYCOLUMNS%) 9 CSRLD$ (ROW%,COLUMN%); STDVID$; CHARACTER$; REVSTD$;狨9 CSRLD$ (ECHOROW%,ECHOCOLUMN%); 9 : Program waits for change of input status.@:  : WAIT STATUSPORT%,2 f4: NUMOFWORDS NUMOFWORDSL~f: : Program reads data from dataport.֌: KEYBDCHAR% (IN.CHR$) : KEYBDCHAR% = INP (DATAPORT%)G: CSRLD$ (ROW%,COLUMN%); WRTPRTON$; REVSTD$; (DISPLAYCHAR% (ASCIINUMBER%)); STDVID$u: KEYBDCHAR% ESCTYPE% bC.; KEYBDCHAR%  LINEFLAG% : ?`; :Ǎ; :S; ECHOFLAG%  TYPEDIN$ TYPEDIN$ (KEYBDCHAR%): KEYBDCHAR% ASCIINUMBER% ? : =Z< : Change the typing Echo definition in the next line for different Dir Cus Adr.< CSRLD$ (ECHOROW%,ECHOCOLUMN%); (KEYBDCHAR%);< ECHOCOLUMN% ECHOCOLUMN% E"= KEYBDCHAR% ASCIINUMBER% ?UT= : Errory= ERRORCOUNT% ERRORCOUNT%= CHARCOUNT% CHARCOUNT%ď= ERRORFLAG%  ?> ECHOCOLUMN% ECHOCOLUMN%N> ().> ECHOCOLUMN%  ECHOCOLUMN% 8? :DH? 9Nz? :u? LINEFLAG%  6B? ECHOFLAG%  P-@ : Display line that was typed in but not echoed previouslyB@ CSRLD$ (ECHOROW%,ECHOCOLUMN%); TYPEDIN$ Ot@ : Program waits for change of input status.s@  : WAIT STATUSPORT%,2@ : Program reads data from dataport. A KEYBDCHAR% (IN.CHR$) : KEYBDCHAR% = INP (DATAPORT%) >>>>>>>>>>>>>>>>>> SECTION PROVIDES POSSIBILITIES <<<<<<<<<<<<<<<<<<<)DC : TO ESCAPE OR ALTER PROGRAM FLOW. 2NC :\bC HELPNUM$ "4": [: *D~*D CHARACTER$ CHARACTER$"e"\D S :[1]:CAPITAL LETTERfD :䔎D CHARACTER$ "N" FILENUM1%: b픘D :`E :OE CHARACTER$ "R" NUMOFREPEATS% NUMOFREPEATS% : s: P-XE :E CHARACTER$ ( ) s: P- F :FF :PF CHARACTER$ "M" HELPNUM$ "5": [: *DxF :/F CHARACTER$ "S" }: s: P-9F : ɖF CHARACTER$ "L" CSRLD$(COMMENTROW%,COMMENTCOLUMN% ); " Exercise line Number is; "; NEWLINE%;: : bCҖF :F CHARACTER$ "W" F : JG&F U :[2]:ERROR COUNTF CSRLD$(COMMENTROW%,COMMENTCOLUMN% ); LINERA$; "Reset ERROR count (Y/N) ?";F  : CHARACTER$ IN.CHR$ : WAIT STATUSPORT%,2: CHARACTER$ = CHR$(INP(DATAPORT%)) F S :[1]:CAPITAL LETTERpG CHARACTER$ "Y" NUMOFWORDS : ERRORCOUNT% : bCyG :G :G :JG CHARACTER$ "Q" |G :ޘG CHARACTER$ "E"  G bC :IF NOT MATCHED, RETURN TO MENU@Q :R :lR :**********************************************************************uS :S : ########################љS : ###### SECTION 8 ###### S : ########################S :aS :>>>>>>>>>>>>>>>>>>>>>>>>>>>> SUBROUTINES <<<<<<<<<<<<<<<<<<<<<<<<<<<<<j4S :sfS :S : Subroutine [1]: Returns first letter of a string as a CAPITAL.ŚS :S CHARACTER$ (CHARACTER$,)0.T CHARACTER$ "`" CHARACTER$ "{" T7`T bT CHARACTER$ ( (CHARACTER$) )iT rT :(U :~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ʛZU : U : Subroutine [2]: Prints ERROR COUNT message and total.U :#U CLRSCR$ "V CSRLD$(COMMENTROW%,COMMENTCOLUMN% ); ERRORCOUNT%; " ERRORS in"; NUMOFWORDS; " Words ";:  TV ERRORCOUNT%  V " I.E."; NUMOFWORDSERRORCOUNT%; " Words per error":  V V :kW :~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~tNW :W : Subroutine [3]: Changes the INSTRUCTION line ADDRESS.W :W : +++++ THIS SUBROUTINE NOT USED IN THIS VERSION +++++ W :5W :IF INSTCOLUMN% < 70 THEN RETURNQX :INSTCOLUMN% = LHS%pHX :INSTROW% = INSTROW%+1zX :PRINT X :IF INSTROW% >= TOP%+6 THEN INSTROW% = TOP%͞X :RETURN֞Y :%BY :~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~.Z :d[ : Subroutine [4]: Access and PRINT HELP Files.m[ :}[ CLRSCR$"[ "I", # FILENUM2%, "TTHELP"HELPNUM$".DAT",[ (FILENUM2%)  : CHARACTER$ IN.CHR$ : # FILENUM2% : CLRSCR$ : : WAIT STATUSPORT%, 2: CHARACTER$ = CHR$ (INP (DATAPORT%)): CLOSE # FILENUM2%: PRINT CLRSCR$: RETURN6[ # FILENUM2%, LINES$@[ (LINES$,) "#" RET$: : CLRSCR$: ,[J[ LINES$T[ ,[h[ :j s :~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ss :{ ROW% ROW% p{ JLOOP% : STDVID$;˨z{ WRTPRTOFF$ܨ{ FILENUM3%{ : End of keyboard setup{ : | | :c} :~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ld} :n} : Subroutine [6]: SKIP Exercise LINES.x} :} CSRLD$(COMMENTROW%,COMMENTCOLUMN% ); "Number of lines to SKIP ?";Z}  : NUMOFLINES% (IN.CHR$) : WAIT STATUSPORT%,2: NUMOFLINES% = VAL(CHR$(INP(DATAPORT%))) |} ILOOP%  NUMOFLINES% } (FILENUM1%) 1} # FILENUM1%,INPCHAR$Ϊ} ILOOP%媴} NUMOFREPEATS%  } NEWLINE% NEWLINE%NUMOFLINES% } :P} CSRLD$ (COMMENTROW%,COMMENTCOLUMN% ); LINERA$;W} `} : :~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ :߫ : Subroutine [7]: COMMENT PRINT :. (FILENUM1%) 8 :/: COMMENT$() (ALINE$,)E< ILOOP%  aB #FILENUM1%,ALINE$G COMMENT$(ILOOP%) (ALINE$,)L ILOOP%M :Q ILOOP%  V CSRLD$(COMMENTROW%ILOOP%,COMMENTCOLUMN%); LINERA$; COMMENT$(ILOOP%)"` ILOOP%-j : 4 = :Є :~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ :4 : Subroutine [8]: TIME DELAY.íf :୘ TIMEOUT%  DELAY% MORE% DELAY%   WASTE% WASTE%* MORE%: TIMEOUT%A. JX :b :~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~l :̮L : Subroutine [9]: PRINT HELP MENU.ծV : ` CSRLD$ (TOP%, ); "[?] - For an explanation of the question. "_j CSRLD$ (TOP%, ); "[Y] - To ENABLE the function."t CSRLD$ (TOP%, ); "[N] - To DISABLE the function."~ CSRLD$ (TOP%, ); "[RETURN] - To accept the DEFAULT in <>'s."ܛ :  :R? :**********************************************************************[@ :A : ########################B : ###### SECTION 9 ######C : ########################D :GE :>>>>>>>>>>>>>>>>>>>>>>>>>> ERROR TRAPPING <<<<<<<<<<<<<<<<<<<<<<<<<<<<PT :b^ DRIVE$ "B:" 5 , #FILENUM1%: "I",#FILENUM1%,DRIVE$FILE$: P- DZН :*ڝ 5 s #FILENUM3%: "I",#FILENUM3%,DRIVE$"TTKEYBD.DAT": s34 :> 5 "[ #FILENUM2%: "I",#FILENUM2%,DRIVE$"TTHELP"HELPNUM$".DAT": ,[ :********************************************************************** THELP"HELPNUM$".DAT": ,[ :**************