AlphaTutor and VowelTutor are a paired set of educational programs designed to teach children letter recognition and vowel sounds through a picture-matching quiz format. Each round randomly selects three images drawn entirely in block graphics, displays them with numbered labels, and prompts the child to identify which picture matches a highlighted letter or vowel shown in a bordered box. The programs use computed GOSUB targets (e.g., `GOSUB 200*L(K)+500` and `GOSUB 700*LS+100*L(K)+30*Z`) to dispatch to one of 26 picture-drawing subroutines covering letters A–Z and multiple vowel-sound variants. VowelTutor extends the concept with separate long and short vowel word sets per letter, selected by a random or user-chosen mode flag, and includes an animated nose-sniffing and hat/smile flip routine via `USR 16514`, pointing to a small machine-code delay loop stored in the REM statement at line 1.
Program Analysis
This listing contains two related programs: AlphaTutor and VowelTutor, both credited to Lou Goldstein / SoftSync Inc., 1982. AlphaTutor covers all 26 letters of the alphabet; VowelTutor extends the concept to long and short vowel sounds, offering multiple word variants per vowel. Both share the same core quiz loop and picture-rendering architecture.
Program Structure
Both programs follow the same top-level flow:
- Title/splash screen (lines 12–14), then
RANDto seed the RNG. - Initialise arrays
P(3),W$(3,10),L(3)(lines 18–20). - Main loop (lines 30–200): pick three distinct random indices, choose one as the target, dispatch to a drawing subroutine for each, display a letter/vowel prompt box, read a numeric answer, give feedback, pause, clear and repeat.
- Drawing subroutines: one per picture subject, each printing block-graphic art, setting
P(K)(label column) andW$(K)(word string).
VowelTutor adds a mode-selection screen (lines 23–27) offering long vowels, short vowels, or both, stored in LS, and allows the user to return to mode selection by entering 9.
Computed GOSUB Dispatch
The most architecturally notable feature is the use of arithmetic expressions as GOSUB targets to select picture subroutines without IF/THEN chains:
- AlphaTutor:
GOSUB 200*L(K)+500— withL(K)in 0–25, this generates targets 500 (A=ambulance), 700 (B=boy), 900 (C=car) … 5500 (Z=zigzag), spaced 200 apart. - VowelTutor:
GOSUB 700*LS+100*L(K)+30*Z— theLSfactor (1=long, 2=short) shifts into a separate bank of subroutines;L(K)selects the vowel (1–5 = A/E/I/O/U);Z(0–2) selects one of up to three word variants per vowel per length.
This is a compact and efficient dispatch mechanism that avoids long IF/THEN chains entirely, at the cost of requiring subroutines to be placed at exactly the computed line numbers.
Machine Code Usage
Line 1 in both programs is a AlphaTutor and VowelTutor are a paired set of educational programs designed to teach children letter recognition and vowel sounds through a picture-matching quiz format. Each round randomly selects three images drawn entirely in block graphics, displays them with numbered labels, and prompts the child to identify which picture matches a highlighted letter or vowel shown in a bordered box. The programs use computed GOSUB targets (e.g., `GOSUB 200*L(K)+500` and `GOSUB 700*LS+100*L(K)+30*Z`) to dispatch to one of 26 picture-drawing subroutines covering letters A–Z and multiple vowel-sound variants. VowelTutor extends the concept with separate long and short vowel word sets per letter, selected by a random or user-chosen mode flag, and includes an animated nose-sniffing and hat/smile flip routine via `USR 16514`, pointing to a small machine-code delay loop stored in the REM statement at line 1. This listing contains two related programs: AlphaTutor and VowelTutor, both credited to Lou Goldstein / SoftSync Inc., 1982. AlphaTutor covers all 26 letters of the alphabet; VowelTutor extends the concept to long and short vowel sounds, offering multiple word variants per vowel. Both share the same core quiz loop and picture-rendering architecture. Both programs follow the same top-level flow: VowelTutor adds a mode-selection screen (lines 23–27) offering long vowels, short vowels, or both, stored in The most architecturally notable feature is the use of arithmetic expressions as GOSUB targets to select picture subroutines without IF/THEN chains: This is a compact and efficient dispatch mechanism that avoids long IF/THEN chains entirely, at the cost of requiring subroutines to be placed at exactly the computed line numbers. Line 1 in both programs is a This routine is called via In VowelTutor, word labels use a space character as a placeholder for the missing vowel (e.g., AlphaTutor’s GIRL subroutine (line 1700) is shared with BOY (line 700): the BOY subroutine calls Note: Type-in program listings on this website use ZMAKEBAS notation for graphics characters.REM statement whose body encodes a short Z80 machine-code routine. The sequence itemtype='https://schema.org/Blog' itemscope='itemscope' class="wp-singular computer_media-template-default single single-computer_media postid-56671 wp-custom-logo wp-embed-responsive wp-theme-astra wp-child-theme-astra-child ast-desktop ast-separate-container ast-left-sidebar astra-4.12.6 group-blog ast-blog-single-style-1 ast-custom-post-type ast-single-post ast-inherit-site-logo-transparent ast-hfb-header ast-full-width-primary-header ast-box-layout ast-normal-title-enabled astra-addon-4.12.4"\C5
Skip to content
disassembles as:Computer Tutor
Program Analysis
Program Structure
RAND to seed the RNG.P(3), W$(3,10), L(3) (lines 18–20).P(K) (label column) and W$(K) (word string).LS, and allows the user to return to mode selection by entering 9.Computed GOSUB Dispatch
GOSUB 200*L(K)+500 — with L(K) in 0–25, this generates targets 500 (A=ambulance), 700 (B=boy), 900 (C=car) … 5500 (Z=zigzag), spaced 200 apart.GOSUB 700*LS+100*L(K)+30*Z — the LS factor (1=long, 2=short) shifts into a separate bank of subroutines; L(K) selects the vowel (1–5 = A/E/I/O/U); Z (0–2) selects one of up to three word variants per vowel per length.Machine Code Usage
REM statement whose body encodes a short Z80 machine-code routine. The sequence \06\01\C5\06\64\00\10\FD\C1\10\F7\C9 disassembles as:
LD B,1 — outer loop countPUSH BCLD B,100 ; LD C,0 — inner delay count (25600 iterations)DJNZ $ — inner loopPOP BC ; DJNZ … — outer loopRETLET E=USR 16514 (the address of the REM body in the VowelTutor variant is slightly longer, hence a different offset in practice). It is used as a simple software delay in animation sequences — for example, the hat flip in AlphaTutor (lines 1901–1906), the smile animation (lines 4101–4106), and the nose-sniffing effect (lines 1163–1168 in VowelTutor).Key BASIC Idioms
\ ., \:., \'', etc.L(1)=L(2) OR L(1)=L(3) OR L(2)=L(3) and loop back if any two indices collide, ensuring three distinct pictures appear each round.LET X=10*K-5 (line 110) distributes the three picture columns evenly across the 32-character screen (columns 5, 15, 25).AT positioning.PLOT with pixel coordinates to draw vertical lines, since the block graphic resolution is insufficient for narrow strokes.VowelTutor Word-Embedding Technique
"TR% IN" for TRAIN, "K% TE" for KITE). After the round is set up, lines 151–155 scan W$(C) character-by-character to find the first "% " (space) position, then replace it with the actual vowel character A$ — effectively filling in the blank dynamically. This lets the same word string serve as both a gapped display and, after substitution, the correct spelled form.Notable Subroutine Sharing
GOSUB 1700 to draw the upper body, then the shared routine checks IF L(K)=1 THEN RETURN (line 1710) to exit early for BOY, or continues to draw the skirt/legs for GIRL. Similarly, VowelTutor’s WOMAN subroutine (line 4900) reuses the MAN subroutine (line 2900) for the head and torso, then overprints with different lower-body graphics.Array Sizing
Array Dimensions Purpose P(3)3 elements Column position for each picture’s word label W$(3,10)3 strings × 10 chars Word associated with each picture slot L(3) / L(5)3 (Alpha) / 5 (Vowel) Random index for picture selection Potential Anomalies
200*0+500=500) — this is correct; L(K)=INT(RND*26) yields 0–25, mapping to lines 500–5500.GOSUB 700*LS+100*L(K)+30*Z for LS=2 (short vowels) can yield targets like 1400+30*Z (lines 1400, 1430, 1460) which are not all defined in the listing — some short-vowel variant slots appear absent, which would cause a BASIC error if selected. This may reflect incomplete subroutine coverage in the original listing.PAUSE 33000 at line 14 provides a long title-screen pause (~30 seconds at normal speed) but any key press does not skip it — the user must wait it out unless they press BREAK.\## sequences in several subroutines (e.g., lines 1232, 1262, 1532) are not standard zmakebas escape sequences and likely represent inverse-video block characters or UDGs in the original tape file that were not fully decoded in this transcription.Content
Source Code
1 REM \06\01\C5\06\64\00\10\FD\C1\10\F7\C9\2E\2E\2E\2E\2E\2E
2 SAVE "AB%C"
12 PRINT AT 8,11;"ALPHATUTOR";AT 10,2;"COPYRIGHT 1982 LOU GOLDSTEIN";AT 12,6;"% %F%R%O%M% %S%O%F%T%S%Y%N%C% %I%N%C% "
13 PRINT AT 20,5;"PRESS ""ENTER"" TO START"
14 PAUSE 33000
15 RAND
17 CLS
18 DIM P(3)
19 DIM W$(3,10)
20 DIM L(3)
30 FOR K=1 TO 3
40 LET L(K)=INT (RND*26)
50 NEXT K
60 IF L(1)=L(2) OR L(1)=L(3) OR L(2)=L(3) THEN GOTO 30
80 LET C=INT (RND*3)+1
90 LET A$=CHR$ (L(C)+38)
100 FOR K=1 TO 3
110 LET X=10*K-5
120 GOSUB 200*L(K)+500
121 PRINT AT 10,P(K);"% ";W$(K,2 TO )
130 PRINT AT 15,X;K
140 NEXT K
150 PRINT AT 19,14;"\:'\''\':";AT 20,14;"\: ";A$;"\ :";AT 21,14;"\:.\..\.:"
160 INPUT R
170 IF R<>C THEN PRINT AT 16,10*C-9;"% % % % % % % % % "
180 IF R=C THEN PRINT AT 16,10*C-9;"*********"
185 PRINT AT 13,P(C);W$(C)
190 PAUSE 250
195 CLS
200 GOTO 30
500 PRINT AT 3,X-3;"\..\..\..\..";AT 4,X-3;"\: \ . \ :";AT 5,X-3;"\: \':\' \ '\''\':";AT 6,X-3;"\:.\..\..\..\..\.:";AT 7,X-3;"\' \' "
501 LET P(K)=X-4
502 LET W$(K)="AMBULANCE"
510 RETURN
700 GOSUB 1700
710 PRINT AT 4,X;"\ :";AT 5,X;"\.'\. ";AT 6,X-1;"\.' \ '\. ";AT 7,X-2;"\.' \ '\. "
711 LET P(K)=X-1
712 LET W$(K)="BOY"
720 RETURN
900 PRINT AT 5,X-3;"\ :% % % ";AT 6,X-3;"\ :% % % % % ";AT 7,X-2;"\' \ '"
901 LET P(K)=X-1
902 LET W$(K)="CAR"
910 RETURN
1100 PRINT AT 1,X-4;"\ . \:.\. ";AT 2,X-3;"\'. % \. ";AT 3,X-2;"% % % ";AT 4,X-2;"\:'\''\':";AT 5,X-2;"\: \ :"
1101 LET P(K)=X-1
1102 LET W$(K)="DOG"
1110 RETURN
1300 PRINT AT 1,X-4;"\ .% % % \..";AT 2,X-4;"% % % % \.:";AT 3,X-4;"\':% % \:'\ '\..\' ";AT 4,X-4;"\ : \: "
1301 LET P(K)=X-4
1302 LET W$(K)="ELEPHANT"
1310 RETURN
1500 PRINT AT 1,X-4;"\ . \ .\..";AT 2,X-4;"\ :\:.\.:% % \':\. ";AT 3,X-4;"\ :% % % % % \. ";AT 4,X-4;"\ :\' \ '\':\:'\' "
1501 LET P(K)=X-2
1502 LET W$(K)="FISH"
1510 RETURN
1700 PRINT AT 0,X;"% \: ";AT 1,X;"\':\' ";AT 2,X-1;"\ .\':\'.";AT 3,X-1;"\' \ : \' "
1710 IF L(K)=1 THEN RETURN
1720 PRINT AT 4,X;"\.:\. ";AT 5,X-1;"\.:% % \. ";AT 6,X-2;"\ '\:'\''\''\:'";AT 7,X-1;"\: \: "
1721 LET P(K)=X-2
1722 LET W$(K)="GIRL"
1730 RETURN
1900 PRINT AT 1,X-2;">\ .\..\..\. <";AT 2,X-1;"\.:% % \:.";AT 3,X-1;"\ :..\: ";AT 4,X-1;"\ : \: ";AT 5,X-1;"\ :\ '\' \: ";AT 6,X;"\''\''"
1901 FOR F=1 TO 2
1902 PRINT AT 1,X-1;" ";AT 2,X-1;"\ .\..\..\. "
1903 LET E=USR 16514
1904 PRINT AT 1,X-1;"\ .\..\..\. ";AT 2,X-1;"\.:% % \:."
1905 LET E=USR 16514
1906 NEXT F
1907 LET P(K)=X-1
1908 LET W$(K)="HAT"
1910 RETURN
2100 PRINT AT 1,X-1;"\ :";AT 2,X-1;"\ :";AT 3,X-2;"\ .\''\''\''\. ";AT 4,X-2;"\ :\~~\~~\~~\: ";AT 5,X-2;"\ :\ ' \' \: ";AT 6,X-2;"\ :\ .\..\. \: ";AT 7,X-2;"\ '\..\..\..\' "
2101 LET P(K)=X-3
2102 LET W$(K)="INDIAN"
2110 RETURN
2300 PRINT AT 1,X-3;"---\:.";AT 2,X-3;"\':\..\..\.:\:.\..";AT 3,X-3;"\ :\..\..\..\..\..% >";AT 4,X-3;"---\ .\:'";AT 5,X-3;"---\:'"
2301 LET P(K)=X-1
2302 LET W$(K)="JET"
2310 RETURN
2500 LET P(K)=X-2
2522 LET W$(K)="KING"
2523 PRINT AT 1,X-2;"\. \. \. \. \. ";AT 2,X-2;"\':\''\''\':\' ";AT 3,X-2;"\ :\ '\ '\ :";AT 4,X-2;"\ : \' \ :";AT 5,X-2;"\ :\ '\''\ :";AT 6,X-1;"\':% \' "
2530 RETURN
2700 PRINT AT 2,X-3;"A B C D";AT 3,X-2;"E F G"
2701 LET P(K)=X-4
2702 LET W$(K)="LETTERS"
2710 RETURN
2900 PRINT AT 1,X;"% \: ";AT 2,X;"\':\' ";AT 3,X-1;"% % % \: ";AT 4,X-1;"\: % \: \: ";AT 5,X-1;"\' % \: \' "
2910 IF L(K)=22 THEN RETURN
2920 PRINT AT 6,X-1;"\ :% % ";AT 7,X-1;"\ :\: % ";AT 8,X-1;"\ :\: % "
2921 LET P(K)=X-1
2922 LET W$(K)="MAN"
2930 RETURN
3100 PRINT AT 3,X-3;"1 2 3 4";AT 4,X-2;"5 6 7"
3101 LET P(K)=X-3
3102 LET W$(K)="NUMBERS"
3110 RETURN
3300 PRINT AT 1,X-4;"\. ";AT 2,X-4;"\ '\'. \.:\. \..\. ";AT 3,X-2;"\':% % \''";AT 4,X-4;"\ .\.'\':% % \.. \.'";AT 5,X-4;"\' \ .\.'\.'\.'\. \''";AT 6,X-4;"\ .\' \ .\' \'.\ '\'.";AT 7,X-4;"\' \ .\' \ '\. "
3301 LET P(K)=X-3
3302 LET W$(K)="OCTOPUS"
3310 RETURN
3500 PRINT AT 5,X-2;"\..\..\..\..% ";AT 4,X+2;"*";AT 3,X+2;"*"
3501 LET P(K)=X-1
3502 LET W$(K)="PIPE"
3510 RETURN
3700 GOSUB 2500
3710 FOR Y=38 TO 29 STEP -1
3720 PLOT 2*X-4,Y
3730 PLOT 2*X+4,Y
3740 NEXT Y
3751 LET P(K)=X-2
3752 LET W$(K)="QUEEN"
3760 RETURN
3900 PRINT AT 1,X;"A";AT 2,X;"% ";AT 3,X;"% ";AT 4,X;"% ";AT 5,X;"% ";AT 6,X-1;"\..% \..";AT 7,X-1;"\' *\ '";AT 8,X;"*"
3901 LET P(K)=X-3
3902 LET W$(K)="ROCKET"
3910 RETURN
4100 PRINT AT 1,X-1;"\..\..\..";AT 2,X-2;"\ :\ . \. \: ";AT 3,X-2;"\ : \: ";AT 4,X-3;">\ :\ . \. \: <";AT 5,X-2;"\ : \'' \: ";AT 6,X-1;"\''\''\''"
4101 FOR F=1 TO 2
4102 PRINT AT 4,X-1;" ";AT 5,X-1;"\ '\''\' "
4103 LET E=USR 16514
4104 PRINT AT 4,X-1;"\ . \. ";AT 5,X-1;" \'' "
4105 LET E=USR 16514
4106 NEXT F
4107 LET P(K)=X-2
4108 LET W$(K)="SMILE"
4110 RETURN
4300 PRINT AT 1,X-1;"\ .% \. ";AT 2,X-2;"\ .% % % \. ";AT 3,X-2;"% % % % % ";AT 4,X-2;"\ '% % % \' ";AT 5,X-1;"\ '% \' ";AT 6,X;"% ";AT 7,X-1;"\ .% \. "
4301 LET P(K)=X-2
4302 LET W$(K)="TREE"
4310 RETURN
4500 PRINT AT 1,X;"\.:\. ";AT 2,X-1;"\.'\ :\ '\. ";AT 3,X;"\ :";AT 4,X;"\ :"
4501 LET P(K)=X-1
4502 LET W$(K)="UP"
4510 RETURN
4700 PRINT AT 2,X-2;"\ .\. \..";AT 3,X-2;"% % \. \.:% \: ";AT 4,X-2;"\':% % % % \' ";AT 5,X-1;"\':% % \' ";AT 6,X;"\':\' "
4701 LET P(K)=X-4
4702 LET W$(K)="VALENTINE"
4710 RETURN
4900 GOSUB 2900
4910 PRINT AT 6,X-1;"\.:% % \. ";AT 7,X-2;"\.:% % % % \. ";AT 8,X-1;"\ :\: % "
4911 LET P(K)=X-2
4912 LET W$(K)="WOMAN"
4920 RETURN
5100 PRINT AT 1,X-3;"\: \: \: \: \: \: \: ";AT 2,X-3;"\: \: \: \: \: \' ";AT 3,X-3;"\: \: \: \' \. ";AT 4,X-3;"\: \' \. /";AT 5,X-1;"/"
5101 LET P(K)=X-4
5102 LET W$(K)="XYLOPHONE"
5110 RETURN
5300 PRINT AT 1,X-1;"\ .% \. ";AT 2,X-1;"% % \':";AT 3,X-1;"% % % \. <";AT 4,X-1;"% % \''<";AT 5,X-1;"% % \.. <";AT 6,X-1;"\ :% "
5301 LET P(K)=X-1
5302 LET W$(K)="YELL"
5310 RETURN
5500 PRINT AT 3,X-2;"\.'\. \.'";AT 4,X-3;"\ ' \ '\. \.'\.'";AT 5,X;"\ '"
5501 LET P(K)=X-3
5502 LET W$(K)="ZIGZAG"
5510 RETURN
1 REM \06\01\C5\06\64\00\10\FD\C1\10\F7\C9\2E\2E\2E\2E\2E\2E\2E\2E\2E\2E\2E
2 SAVE "VOWE%L"
12 PRINT AT 8,11;"VOWELTUTOR";AT 10,2;"COPYRIGHT 1982 LOU GOLDSTEIN";AT 12,7;"% %F%R%O%M% %S%O%F%T%S%Y%N%C% %I%N%C% "
13 PRINT AT 20,5;"PRESS ""ENTER"" TO START"
14 PAUSE 33000
15 RAND
16 LET V$="AEIOU"
17 CLS
18 DIM P(3)
19 DIM W$(3,10)
20 DIM L(5)
23 PRINT AT 6,0;"WHICH VOWELS DO YOU WANT TO USE?1=LONG",,"2=SHORT",,"3=BOTH",,"4=EXIT PROGRAM"
24 INPUT O
25 LET LS=O
26 CLS
27 IF O=4 THEN STOP
30 IF O=3 THEN LET LS=INT (RND*2)+1
31 FOR K=1 TO 3
32 FAST
40 LET L(K)=INT (RND*5)+1
50 NEXT K
60 IF L(1)=L(2) OR L(1)=L(3) OR L(2)=L(3) THEN GOTO 31
80 LET C=INT (RND*3)+1
90 LET A$=V$(L(C))
99 SLOW
100 FOR K=1 TO 3
105 LET Z=INT (RND*3)
110 LET X=10*K-5
120 GOSUB 700*LS+100*L(K)+30*Z
121 PRINT AT 10,P(K);W$(K)
130 PRINT AT 15,X;K
140 NEXT K
150 PRINT AT 19,14;"\:'\''\':";AT 20,14;"\: ";A$;"\ :";AT 21,14;"\:.\..\.:"
151 FOR J=1 TO 10
152 IF W$(C,J)="% " THEN GOTO 155
153 NEXT J
155 LET W$(C,J)=A$
156 INPUT R
157 IF R=9 THEN CLS
160 IF R=9 THEN GOTO 23
170 IF R<>C THEN PRINT AT 16,10*C-9;"% % % % % % % % % "
180 IF R=C THEN PRINT AT 16,10*C-9;"*********"
185 PRINT AT 13,P(C);W$(C)
190 PAUSE 250
195 CLS
200 GOTO 30
800 LET W$(K)="TR% IN"
801 LET P(K)=X-2
802 PRINT AT 2,X-1;"*";AT 3,X;"*";AT 4,X;"\ :\..\. ";AT 5,X-4;"\ :% \.:% \.:% % >";AT 6,X-4;"\ '\ '\ '\ '\ ' \ '"
803 RETURN
830 LET W$(K)="C% NE"
831 LET P(K)=X-1
832 PRINT AT 1,X+1;"\' ";AT 0,X-1;"\ .\''\. "
833 FOR Y=41 TO 30 STEP -1
834 PLOT 2*X-1,Y
835 NEXT Y
836 RETURN
860 LET W$(K)="D% YS"
861 LET P(K)=X-2
862 PRINT AT 2,X-1;"FRI.";AT 4,X-1;"SAT.";AT 6,X-1;"SUN."
863 RETURN
900 LET W$(K)="K% Y"
901 LET P(K)=X-1
902 PRINT AT 3,X-3;"% % ";AT 4,X-3;"% % \:'\''\':% % \' ";AT 5,X-3;"% % \ '\ :\ '"
903 RETURN
930 LET W$(K)="THR% E"
931 LET P(K)=X-2
932 PRINT AT 3,X-1;"\''\''\: ";AT 4,X+1;"\: ";AT 5,X-1;"\ '\''\: ";AT 6,X+1;"\: ";AT 7,X-1;"\''\''\' "
933 RETURN
960 LET W$(K)="KN% E"
961 LET P(K)=X-2
962 PRINT AT 0,X+1;"% \: ";AT 1,X+1;"\':\' ";AT 2,X+1;"\: ";AT 3,X;"\ :\ '\..\. ";AT 4,X;"\: ";AT 5,X-1;"\ :\ '\. ";AT 6,X-1;"\ : \ '\. <";AT 7,X-2;"\ .\' \: ";AT 8,X-2;"\'. \''"
968 RETURN
1000 LET W$(K)="F% VE"
1001 LET P(K)=X-2
1002 PRINT AT 2,X-1;"\:'\''\' ";AT 3,X-1;"\:.\. ";AT 4,X;"\ '\. ";AT 5,X-1;"\. \ .\' ";AT 6,X-1;"\ '\' "
1003 RETURN
1030 LET W$(K)="K% TE"
1031 LET P(K)=X-2
1032 PRINT AT 0,X;"\.:\. ";AT 1,X-1;"\ .\':\'.";AT 2,X-1;"\.:\.:\.:\. ";AT 3,X-1;"\ :\ :\ :";AT 4,X;"% \: ";AT 5,X;"\ :";AT 6,X+1;"\'.";AT 7,X+1;"\.'";AT 8,X+1;"\ '"
1033 RETURN
1060 LET W$(K)="N% NE"
1061 LET P(K)=X-2
1063 PRINT AT 2,X-1;"\:'\''\: ";AT 3,X-1;"\: \: ";AT 4,X-1;"\''\''\: ";AT 5,X-1;"\. \: ";AT 6,X-1;"\''\''\' "
1064 RETURN
1100 LET W$(K)="B% AT"
1101 LET P(K)=X-2
1102 PRINT AT 1,X-2;"\..\..\..\..\. ";AT 2,X-2;"\ '\. \ '\. ";AT 3,X-1;"\.' \.'";AT 4,X-2;"\ '\''\':\''\''";AT 5,X-4;"\..\..\..\..\.:\..\..\..>";AT 6,X-4;"\':% % % % % \:'";AT 7,X-3;"\''\''\''\''\''"
1103 RETURN
1130 LET W$(K)="THR% W"
1131 LET P(K)=X-2
1132 PRINT AT 2,X+2;">";AT 3,X-2;"\ :% >\ '";AT 4,X-2;"\ '\:' \.'";AT 5,X-3;"\ .\''\:'\''";AT 6,X-3;"\' \: ";AT 7,X-2;"\.'\ '\. ";AT 8,X-3;"\ ' \ '"
1133 RETURN
1160 LET W$(K)="N% SE"
1161 LET P(K)=X-2
1162 PRINT AT 1,X-1;"\ .% \. ";AT 2,X-1;"% \:.\:.";AT 3,X-1;"% % \' ";AT 4,X-1;"\':\:'\' "
1163 FOR G=1 TO 3
1164 PRINT AT 2,1+X;"\: "
1165 LET U=USR 16514
1166 PRINT AT 2,X+1;"\:."
1167 LET U=USR 16514
1168 NEXT G
1169 RETURN
1200 LET W$(K)="% NITED"
1201 LET P(K)=X-3
1202 PRINT AT 1,X-3;"\..\..\..\..\..\. \.:";AT 2,X-4;"\ .% % % % % % \.:% ";AT 3,X-4;"\ :AMERICA\: ";AT 4,X-4;"\ '% % % % % % % \: ";AT 5,X-3;"\''\''% % % % % \: ";AT 6,X;"\':\:' \: ";AT 7,X+1;"\' "
1203 PRINT AT 11,P(K);"STATES"
1204 RETURN
1230 LET W$(K)="F% EL"
1231 LET P(K)=X-2
1232 PRINT AT 1,X-4;"\##\##\##";AT 2,X-4;"\##%G\##";AT 3,X-4;"\##%A\##";AT 4,X-4;"\##%S\##\'. \:'\''\':";AT 5,X-4;"\##\##\##\ '\..\:.\..\.:";AT 6,X-4;"\##\##\## % % % ";AT 7,X-4;"\##\##\## \: \ :"
1233 RETURN
1260 LET W$(K)="T% BE"
1261 LET P(K)=X-2
1262 PRINT AT 2,X-4;"\ .\..\..\..\..\..\..\..\. ";AT 3,X-4;"\ :\##TOOTH\##\:.";AT 4,X-4;"\ :\##PASTE\##\:'";AT 5,X-4;"\ '\''\''\''\''\''\''\''\' "
1263 RETURN
1500 LET W$(K)="FL% G"
1501 LET P(K)=X-2
1503 LET B=X-4
1504 PRINT AT 0,B;"\ .\..\..\..\..\..\..\..";AT 1,B;"\ :***\:'\''\''\':";AT 2,B;"\ :***\:'\''\''\':";AT 3,B;"\ :\''\''\''\''\''\''\':";AT 4,B;"\ :\''\''\''\''\''\''\':";AT 5,B;"\ :\''\''\''\''\''\''\''";AT 6,B;"\ :"
1505 RETURN
1530 LET W$(K)="% DD"
1531 LET P(K)=X-1
1532 PRINT AT 1,X-2;"3+2=\##";AT 3,X;"75";AT 4,X-1;"+23";AT 5,X-1;"\''\''\''"
1533 RETURN
1560 LET W$(K)="P% N"
1561 LET P(K)=X-1
1562 PRINT AT 3,X-3;"\..\..\..\..";AT 4,X-4;"\ :\' \ '\:.\..\..\..";AT 5,X-4;"\ :\:.\..\..\.:\: ";AT 6,X-4;"\ '% % % % \' "
1563 RETURN
1600 LET W$(K)="T% N"
1601 LET P(K)=X-1
1602 LET B=X-2
1603 PRINT AT 2,B;"\ : \:'\''\':";AT 3,B;"\ : \: \ :";AT 4,B;"\ : \: \ :";AT 5,B;"\ : \:.\..\.:"
1604 RETURN
1630 LET W$(K)="DR% SS"
1631 LET P(K)=X-2
1632 PRINT AT 1,X-2;"\.:\:.\.:\:.";AT 2,X-3;"\ '\:'% % \':\' ";AT 3,X-2;"\ .% % \. ";AT 4,X-3;"\ .% % % % \. ";AT 5,X-4;"\ .% % % % % % \. "
1633 RETURN
1660 LET W$(K)="L% G"
1661 LET P(K)=X-1
1662 LET B=X-1
1663 PRINT AT 0,X;"% \: ";AT 1,X;"\':\' ";AT 2,B;"% % % \: ";AT 3,B;"\: % \: \: ";AT 4,B;"\' % \: \' ";AT 5,B;"\ :% % ";AT 6,B;"\ :\: \##<";AT 7,B;"\ :\: \##<"
1664 RETURN
1700 LET W$(K)="S% X"
1701 LET P(K)=X-1
1702 LET B=X-1
1703 PRINT AT 1,X;"\..";AT 2,B;"\.' \' ";AT 3,B;"\: ";AT 4,B;"\:.\''\'.";AT 5,B;"\: \ :";AT 6,B;"\ '\..\' "
1704 RETURN
1730 LET W$(K)="SH% P"
1731 LET P(K)=X-2
1732 PRINT AT 3,X-3;"\..\:.\:.\. ";AT 4,X-5;"\ .\..% \:'% \:'% \:'% \:'";AT 5,X-4;"\':\:.% \:.% \:.% \:'";AT 6,X-5;"\@@\@@\@@\@@\@@\@@\@@\@@\@@\@@"
1733 RETURN
1760 LET W$(K)="WR% ST"
1761 LET P(K)=X-2
1762 LET B=X-1
1763 PRINT AT 0,B;"\..\..\..";AT 1,B;"\:'% \':";AT 2,B;"% \''% ";AT 3,B;"\''% \''"
1764 LET B=X-2
1765 PRINT AT 4,B;"% % % % % ";AT 5,B;"% \ :% \: % ";AT 6,B-1;">\##\ :% \: \##<";AT 7,B;"W W"
1766 RETURN
1800 LET W$(K)="P% T"
1801 LET P(K)=X-1
1802 PRINT AT 1,X-2;"\..";AT 2,X-4;"\ .\'' \''\. ";AT 3,X-4;"\:. \.:\..\..\..";AT 4,X-4;"% % \..% % ";AT 5,X-4;"\':% % % \:'";AT 6,X-3;"\ '\''\' "
1803 RETURN
1830 LET W$(K)="CL% CK"
1831 LET P(K)=X-3
1832 PRINT AT 1,X;"\..\. ";AT 2,X-2;"\ .\''\ .\ '\'.";AT 3,X-2;"\: \ : \: ";AT 4,X-3;"\ : \ :\..\. \ :";AT 5,X-3;"\ '\. \.'";AT 6,X-2;"\'. \ .\' ";AT 7,X-1;"\''\..\.'\' "
1833 RETURN
1860 LET W$(K)="ST% P"
1861 LET P(K)=X-2
1862 PRINT AT 0,X-2;"\ .% % \. ";AT 1,X-3;"\ .% % % % \. ";AT 2,X-3;"% ST P% ";AT 3,X-3;"% % % % % % ";AT 4,X-3;"\ '% % % % \' ";AT 5,X-2;"\ '% % \' ";AT 6,X-1;"\ :\: ";AT 7,X-1;"\ :\: "
1863 RETURN
1900 LET W$(K)="G% N"
1901 LET P(K)=X-1
1902 LET B=X-4
1903 PRINT AT 2,B;"\ :% % % % % -->";AT 3,B;"\ :\: \: \:'\''";AT 4,B;"\ :\:.\..\: ";AT 5,B;"\ :\: "
1904 RETURN
1930 LET W$(K)="DR% M"
1931 LET P(K)=X-2
1932 PRINT AT 0,X+2;"/";AT 1,X-1;"\.. \ ' /";AT 2,X-3;"\ .\'' \''\. \ '";AT 3,X-3;"\:. \.:";AT 4,X-3;"% % \..% % ";AT 5,X-3;"\':% % % \:'";AT 6,X-2;"\ '\''\' "
1933 RETURN
1960 LET W$(K)="B% S"
1961 LET P(K)=X-1
1962 LET B=X-3
1963 PRINT AT 2,B;"% \''\:'\':\''% % ";AT 3,B;"% \..\:.\.:\..% \ :% ";AT 4,B;"% % % % % % \.:% ";AT 5,B+1;"\' \ '"
1964 RETURN
People
LD B,1— outer loop countPUSH BCLD B,100 ; LD C,0— inner delay count (25600 iterations)DJNZ $— inner loopPOP BC ; DJNZ …— outer loopRET
This routine is called via LET E=USR 16514 (the address of the REM body in the VowelTutor variant is slightly longer, hence a different offset in practice). It is used as a simple software delay in animation sequences — for example, the hat flip in AlphaTutor (lines 1901–1906), the smile animation (lines 4101–4106), and the nose-sniffing effect (lines 1163–1168 in VowelTutor).
Key BASIC Idioms
- Block graphic art: All pictures are rendered using the ZX81/TS1000 block graphic characters (2×2 pixel sub-characters), encoded here as zmakebas escape sequences such as
\ .,\:.,\'', etc. - Distinct random selection: Lines 60 check
L(1)=L(2) OR L(1)=L(3) OR L(2)=L(3)and loop back if any two indices collide, ensuring three distinct pictures appear each round. - Column positioning via formula:
LET X=10*K-5(line 110) distributes the three picture columns evenly across the 32-character screen (columns 5, 15, 25). - Answer box: The target letter is displayed in a bordered box drawn with block graphics at lines 19–21 using
ATpositioning. - PLOT for QUEEN and CONE: The subroutines at lines 3700 and 830 use
PLOTwith pixel coordinates to draw vertical lines, since the block graphic resolution is insufficient for narrow strokes.
VowelTutor Word-Embedding Technique
In VowelTutor, word labels use a space character as a placeholder for the missing vowel (e.g., "TR% IN" for TRAIN, "K% TE" for KITE). After the round is set up, lines 151–155 scan W$(C) character-by-character to find the first "% " (space) position, then replace it with the actual vowel character A$ — effectively filling in the blank dynamically. This lets the same word string serve as both a gapped display and, after substitution, the correct spelled form.
Notable Subroutine Sharing
AlphaTutor’s GIRL subroutine (line 1700) is shared with BOY (line 700): the BOY subroutine calls GOSUB 1700 to draw the upper body, then the shared routine checks IF L(K)=1 THEN RETURN (line 1710) to exit early for BOY, or continues to draw the skirt/legs for GIRL. Similarly, VowelTutor’s WOMAN subroutine (line 4900) reuses the MAN subroutine (line 2900) for the head and torso, then overprints with different lower-body graphics.
Array Sizing
| Array | Dimensions | Purpose |
|---|---|---|
P(3) | 3 elements | Column position for each picture’s word label |
W$(3,10) | 3 strings × 10 chars | Word associated with each picture slot |
L(3) / L(5) | 3 (Alpha) / 5 (Vowel) | Random index for picture selection |
Potential Anomalies
- AlphaTutor has no subroutine at the computed target for letter index 0 (line 500 handles A=0, as
200*0+500=500) — this is correct;L(K)=INT(RND*26)yields 0–25, mapping to lines 500–5500. - VowelTutor’s
GOSUB 700*LS+100*L(K)+30*ZforLS=2(short vowels) can yield targets like 1400+30*Z (lines 1400, 1430, 1460) which are not all defined in the listing — some short-vowel variant slots appear absent, which would cause a BASIC error if selected. This may reflect incomplete subroutine coverage in the original listing. - The
PAUSE 33000at line 14 provides a long title-screen pause (~30 seconds at normal speed) but any key press does not skip it — the user must wait it out unless they press BREAK. - In VowelTutor, the
\##sequences in several subroutines (e.g., lines 1232, 1262, 1532) are not standard zmakebas escape sequences and likely represent inverse-video block characters or UDGs in the original tape file that were not fully decoded in this transcription.
Content
Source Code
1 REM itemtype='https://schema.org/Blog' itemscope='itemscope' class="wp-singular computer_media-template-default single single-computer_media postid-56671 wp-custom-logo wp-embed-responsive wp-theme-astra wp-child-theme-astra-child ast-desktop ast-separate-container ast-left-sidebar astra-4.12.6 group-blog ast-blog-single-style-1 ast-custom-post-type ast-single-post ast-inherit-site-logo-transparent ast-hfb-header ast-full-width-primary-header ast-box-layout ast-normal-title-enabled astra-addon-4.12.4"\C5
Skip to content
Computer Tutor
Products: Computer Tutors: Alpha/Vowel Tutors
Developer(s): Lou Goldstein
Date: 1982
Type: Cassette
Platform(s): TS 1000
Tags: Education
AlphaTutor and VowelTutor are a paired set of educational programs designed to teach children letter recognition and vowel sounds through a picture-matching quiz format. Each round randomly selects three images drawn entirely in block graphics, displays them with numbered labels, and prompts the child to identify which picture matches a highlighted letter or vowel shown in a bordered box. The programs use computed GOSUB targets (e.g., `GOSUB 200*L(K)+500` and `GOSUB 700*LS+100*L(K)+30*Z`) to dispatch to one of 26 picture-drawing subroutines covering letters A–Z and multiple vowel-sound variants. VowelTutor extends the concept with separate long and short vowel word sets per letter, selected by a random or user-chosen mode flag, and includes an animated nose-sniffing and hat/smile flip routine via `USR 16514`, pointing to a small machine-code delay loop stored in the REM statement at line 1.
Program Analysis
This listing contains two related programs: AlphaTutor and VowelTutor, both credited to Lou Goldstein / SoftSync Inc., 1982. AlphaTutor covers all 26 letters of the alphabet; VowelTutor extends the concept to long and short vowel sounds, offering multiple word variants per vowel. Both share the same core quiz loop and picture-rendering architecture.
Program Structure
Both programs follow the same top-level flow:
- Title/splash screen (lines 12–14), then
RAND to seed the RNG.
- Initialise arrays
P(3), W$(3,10), L(3) (lines 18–20).
- Main loop (lines 30–200): pick three distinct random indices, choose one as the target, dispatch to a drawing subroutine for each, display a letter/vowel prompt box, read a numeric answer, give feedback, pause, clear and repeat.
- Drawing subroutines: one per picture subject, each printing block-graphic art, setting
P(K) (label column) and W$(K) (word string).
VowelTutor adds a mode-selection screen (lines 23–27) offering long vowels, short vowels, or both, stored in LS, and allows the user to return to mode selection by entering 9.
Computed GOSUB Dispatch
The most architecturally notable feature is the use of arithmetic expressions as GOSUB targets to select picture subroutines without IF/THEN chains:
- AlphaTutor:
GOSUB 200*L(K)+500 — with L(K) in 0–25, this generates targets 500 (A=ambulance), 700 (B=boy), 900 (C=car) … 5500 (Z=zigzag), spaced 200 apart.
- VowelTutor:
GOSUB 700*LS+100*L(K)+30*Z — the LS factor (1=long, 2=short) shifts into a separate bank of subroutines; L(K) selects the vowel (1–5 = A/E/I/O/U); Z (0–2) selects one of up to three word variants per vowel per length.
This is a compact and efficient dispatch mechanism that avoids long IF/THEN chains entirely, at the cost of requiring subroutines to be placed at exactly the computed line numbers.
Machine Code Usage
Line 1 in both programs is a REM statement whose body encodes a short Z80 machine-code routine. The sequence \06\01\C5\06\64\00\10\FD\C1\10\F7\C9 disassembles as:
LD B,1 — outer loop count
PUSH BC
LD B,100 ; LD C,0 — inner delay count (25600 iterations)
DJNZ $ — inner loop
POP BC ; DJNZ … — outer loop
RET
This routine is called via LET E=USR 16514 (the address of the REM body in the VowelTutor variant is slightly longer, hence a different offset in practice). It is used as a simple software delay in animation sequences — for example, the hat flip in AlphaTutor (lines 1901–1906), the smile animation (lines 4101–4106), and the nose-sniffing effect (lines 1163–1168 in VowelTutor).
Key BASIC Idioms
- Block graphic art: All pictures are rendered using the ZX81/TS1000 block graphic characters (2×2 pixel sub-characters), encoded here as zmakebas escape sequences such as
\ ., \:., \'', etc.
- Distinct random selection: Lines 60 check
L(1)=L(2) OR L(1)=L(3) OR L(2)=L(3) and loop back if any two indices collide, ensuring three distinct pictures appear each round.
- Column positioning via formula:
LET X=10*K-5 (line 110) distributes the three picture columns evenly across the 32-character screen (columns 5, 15, 25).
- Answer box: The target letter is displayed in a bordered box drawn with block graphics at lines 19–21 using
AT positioning.
- PLOT for QUEEN and CONE: The subroutines at lines 3700 and 830 use
PLOT with pixel coordinates to draw vertical lines, since the block graphic resolution is insufficient for narrow strokes.
VowelTutor Word-Embedding Technique
In VowelTutor, word labels use a space character as a placeholder for the missing vowel (e.g., "TR% IN" for TRAIN, "K% TE" for KITE). After the round is set up, lines 151–155 scan W$(C) character-by-character to find the first "% " (space) position, then replace it with the actual vowel character A$ — effectively filling in the blank dynamically. This lets the same word string serve as both a gapped display and, after substitution, the correct spelled form.
Notable Subroutine Sharing
AlphaTutor’s GIRL subroutine (line 1700) is shared with BOY (line 700): the BOY subroutine calls GOSUB 1700 to draw the upper body, then the shared routine checks IF L(K)=1 THEN RETURN (line 1710) to exit early for BOY, or continues to draw the skirt/legs for GIRL. Similarly, VowelTutor’s WOMAN subroutine (line 4900) reuses the MAN subroutine (line 2900) for the head and torso, then overprints with different lower-body graphics.
Array Sizing
Array Dimensions Purpose P(3)3 elements Column position for each picture’s word label W$(3,10)3 strings × 10 chars Word associated with each picture slot L(3) / L(5)3 (Alpha) / 5 (Vowel) Random index for picture selection
Potential Anomalies
- AlphaTutor has no subroutine at the computed target for letter index 0 (line 500 handles A=0, as
200*0+500=500) — this is correct; L(K)=INT(RND*26) yields 0–25, mapping to lines 500–5500.
- VowelTutor’s
GOSUB 700*LS+100*L(K)+30*Z for LS=2 (short vowels) can yield targets like 1400+30*Z (lines 1400, 1430, 1460) which are not all defined in the listing — some short-vowel variant slots appear absent, which would cause a BASIC error if selected. This may reflect incomplete subroutine coverage in the original listing.
- The
PAUSE 33000 at line 14 provides a long title-screen pause (~30 seconds at normal speed) but any key press does not skip it — the user must wait it out unless they press BREAK.
- In VowelTutor, the
\## sequences in several subroutines (e.g., lines 1232, 1262, 1532) are not standard zmakebas escape sequences and likely represent inverse-video block characters or UDGs in the original tape file that were not fully decoded in this transcription.
Content
Source Code
1 REM \06\01\C5\06\64\00\10\FD\C1\10\F7\C9\2E\2E\2E\2E\2E\2E
2 SAVE "AB%C"
12 PRINT AT 8,11;"ALPHATUTOR";AT 10,2;"COPYRIGHT 1982 LOU GOLDSTEIN";AT 12,6;"% %F%R%O%M% %S%O%F%T%S%Y%N%C% %I%N%C% "
13 PRINT AT 20,5;"PRESS ""ENTER"" TO START"
14 PAUSE 33000
15 RAND
17 CLS
18 DIM P(3)
19 DIM W$(3,10)
20 DIM L(3)
30 FOR K=1 TO 3
40 LET L(K)=INT (RND*26)
50 NEXT K
60 IF L(1)=L(2) OR L(1)=L(3) OR L(2)=L(3) THEN GOTO 30
80 LET C=INT (RND*3)+1
90 LET A$=CHR$ (L(C)+38)
100 FOR K=1 TO 3
110 LET X=10*K-5
120 GOSUB 200*L(K)+500
121 PRINT AT 10,P(K);"% ";W$(K,2 TO )
130 PRINT AT 15,X;K
140 NEXT K
150 PRINT AT 19,14;"\:'\''\':";AT 20,14;"\: ";A$;"\ :";AT 21,14;"\:.\..\.:"
160 INPUT R
170 IF R<>C THEN PRINT AT 16,10*C-9;"% % % % % % % % % "
180 IF R=C THEN PRINT AT 16,10*C-9;"*********"
185 PRINT AT 13,P(C);W$(C)
190 PAUSE 250
195 CLS
200 GOTO 30
500 PRINT AT 3,X-3;"\..\..\..\..";AT 4,X-3;"\: \ . \ :";AT 5,X-3;"\: \':\' \ '\''\':";AT 6,X-3;"\:.\..\..\..\..\.:";AT 7,X-3;"\' \' "
501 LET P(K)=X-4
502 LET W$(K)="AMBULANCE"
510 RETURN
700 GOSUB 1700
710 PRINT AT 4,X;"\ :";AT 5,X;"\.'\. ";AT 6,X-1;"\.' \ '\. ";AT 7,X-2;"\.' \ '\. "
711 LET P(K)=X-1
712 LET W$(K)="BOY"
720 RETURN
900 PRINT AT 5,X-3;"\ :% % % ";AT 6,X-3;"\ :% % % % % ";AT 7,X-2;"\' \ '"
901 LET P(K)=X-1
902 LET W$(K)="CAR"
910 RETURN
1100 PRINT AT 1,X-4;"\ . \:.\. ";AT 2,X-3;"\'. % \. ";AT 3,X-2;"% % % ";AT 4,X-2;"\:'\''\':";AT 5,X-2;"\: \ :"
1101 LET P(K)=X-1
1102 LET W$(K)="DOG"
1110 RETURN
1300 PRINT AT 1,X-4;"\ .% % % \..";AT 2,X-4;"% % % % \.:";AT 3,X-4;"\':% % \:'\ '\..\' ";AT 4,X-4;"\ : \: "
1301 LET P(K)=X-4
1302 LET W$(K)="ELEPHANT"
1310 RETURN
1500 PRINT AT 1,X-4;"\ . \ .\..";AT 2,X-4;"\ :\:.\.:% % \':\. ";AT 3,X-4;"\ :% % % % % \. ";AT 4,X-4;"\ :\' \ '\':\:'\' "
1501 LET P(K)=X-2
1502 LET W$(K)="FISH"
1510 RETURN
1700 PRINT AT 0,X;"% \: ";AT 1,X;"\':\' ";AT 2,X-1;"\ .\':\'.";AT 3,X-1;"\' \ : \' "
1710 IF L(K)=1 THEN RETURN
1720 PRINT AT 4,X;"\.:\. ";AT 5,X-1;"\.:% % \. ";AT 6,X-2;"\ '\:'\''\''\:'";AT 7,X-1;"\: \: "
1721 LET P(K)=X-2
1722 LET W$(K)="GIRL"
1730 RETURN
1900 PRINT AT 1,X-2;">\ .\..\..\. <";AT 2,X-1;"\.:% % \:.";AT 3,X-1;"\ :..\: ";AT 4,X-1;"\ : \: ";AT 5,X-1;"\ :\ '\' \: ";AT 6,X;"\''\''"
1901 FOR F=1 TO 2
1902 PRINT AT 1,X-1;" ";AT 2,X-1;"\ .\..\..\. "
1903 LET E=USR 16514
1904 PRINT AT 1,X-1;"\ .\..\..\. ";AT 2,X-1;"\.:% % \:."
1905 LET E=USR 16514
1906 NEXT F
1907 LET P(K)=X-1
1908 LET W$(K)="HAT"
1910 RETURN
2100 PRINT AT 1,X-1;"\ :";AT 2,X-1;"\ :";AT 3,X-2;"\ .\''\''\''\. ";AT 4,X-2;"\ :\~~\~~\~~\: ";AT 5,X-2;"\ :\ ' \' \: ";AT 6,X-2;"\ :\ .\..\. \: ";AT 7,X-2;"\ '\..\..\..\' "
2101 LET P(K)=X-3
2102 LET W$(K)="INDIAN"
2110 RETURN
2300 PRINT AT 1,X-3;"---\:.";AT 2,X-3;"\':\..\..\.:\:.\..";AT 3,X-3;"\ :\..\..\..\..\..% >";AT 4,X-3;"---\ .\:'";AT 5,X-3;"---\:'"
2301 LET P(K)=X-1
2302 LET W$(K)="JET"
2310 RETURN
2500 LET P(K)=X-2
2522 LET W$(K)="KING"
2523 PRINT AT 1,X-2;"\. \. \. \. \. ";AT 2,X-2;"\':\''\''\':\' ";AT 3,X-2;"\ :\ '\ '\ :";AT 4,X-2;"\ : \' \ :";AT 5,X-2;"\ :\ '\''\ :";AT 6,X-1;"\':% \' "
2530 RETURN
2700 PRINT AT 2,X-3;"A B C D";AT 3,X-2;"E F G"
2701 LET P(K)=X-4
2702 LET W$(K)="LETTERS"
2710 RETURN
2900 PRINT AT 1,X;"% \: ";AT 2,X;"\':\' ";AT 3,X-1;"% % % \: ";AT 4,X-1;"\: % \: \: ";AT 5,X-1;"\' % \: \' "
2910 IF L(K)=22 THEN RETURN
2920 PRINT AT 6,X-1;"\ :% % ";AT 7,X-1;"\ :\: % ";AT 8,X-1;"\ :\: % "
2921 LET P(K)=X-1
2922 LET W$(K)="MAN"
2930 RETURN
3100 PRINT AT 3,X-3;"1 2 3 4";AT 4,X-2;"5 6 7"
3101 LET P(K)=X-3
3102 LET W$(K)="NUMBERS"
3110 RETURN
3300 PRINT AT 1,X-4;"\. ";AT 2,X-4;"\ '\'. \.:\. \..\. ";AT 3,X-2;"\':% % \''";AT 4,X-4;"\ .\.'\':% % \.. \.'";AT 5,X-4;"\' \ .\.'\.'\.'\. \''";AT 6,X-4;"\ .\' \ .\' \'.\ '\'.";AT 7,X-4;"\' \ .\' \ '\. "
3301 LET P(K)=X-3
3302 LET W$(K)="OCTOPUS"
3310 RETURN
3500 PRINT AT 5,X-2;"\..\..\..\..% ";AT 4,X+2;"*";AT 3,X+2;"*"
3501 LET P(K)=X-1
3502 LET W$(K)="PIPE"
3510 RETURN
3700 GOSUB 2500
3710 FOR Y=38 TO 29 STEP -1
3720 PLOT 2*X-4,Y
3730 PLOT 2*X+4,Y
3740 NEXT Y
3751 LET P(K)=X-2
3752 LET W$(K)="QUEEN"
3760 RETURN
3900 PRINT AT 1,X;"A";AT 2,X;"% ";AT 3,X;"% ";AT 4,X;"% ";AT 5,X;"% ";AT 6,X-1;"\..% \..";AT 7,X-1;"\' *\ '";AT 8,X;"*"
3901 LET P(K)=X-3
3902 LET W$(K)="ROCKET"
3910 RETURN
4100 PRINT AT 1,X-1;"\..\..\..";AT 2,X-2;"\ :\ . \. \: ";AT 3,X-2;"\ : \: ";AT 4,X-3;">\ :\ . \. \: <";AT 5,X-2;"\ : \'' \: ";AT 6,X-1;"\''\''\''"
4101 FOR F=1 TO 2
4102 PRINT AT 4,X-1;" ";AT 5,X-1;"\ '\''\' "
4103 LET E=USR 16514
4104 PRINT AT 4,X-1;"\ . \. ";AT 5,X-1;" \'' "
4105 LET E=USR 16514
4106 NEXT F
4107 LET P(K)=X-2
4108 LET W$(K)="SMILE"
4110 RETURN
4300 PRINT AT 1,X-1;"\ .% \. ";AT 2,X-2;"\ .% % % \. ";AT 3,X-2;"% % % % % ";AT 4,X-2;"\ '% % % \' ";AT 5,X-1;"\ '% \' ";AT 6,X;"% ";AT 7,X-1;"\ .% \. "
4301 LET P(K)=X-2
4302 LET W$(K)="TREE"
4310 RETURN
4500 PRINT AT 1,X;"\.:\. ";AT 2,X-1;"\.'\ :\ '\. ";AT 3,X;"\ :";AT 4,X;"\ :"
4501 LET P(K)=X-1
4502 LET W$(K)="UP"
4510 RETURN
4700 PRINT AT 2,X-2;"\ .\. \..";AT 3,X-2;"% % \. \.:% \: ";AT 4,X-2;"\':% % % % \' ";AT 5,X-1;"\':% % \' ";AT 6,X;"\':\' "
4701 LET P(K)=X-4
4702 LET W$(K)="VALENTINE"
4710 RETURN
4900 GOSUB 2900
4910 PRINT AT 6,X-1;"\.:% % \. ";AT 7,X-2;"\.:% % % % \. ";AT 8,X-1;"\ :\: % "
4911 LET P(K)=X-2
4912 LET W$(K)="WOMAN"
4920 RETURN
5100 PRINT AT 1,X-3;"\: \: \: \: \: \: \: ";AT 2,X-3;"\: \: \: \: \: \' ";AT 3,X-3;"\: \: \: \' \. ";AT 4,X-3;"\: \' \. /";AT 5,X-1;"/"
5101 LET P(K)=X-4
5102 LET W$(K)="XYLOPHONE"
5110 RETURN
5300 PRINT AT 1,X-1;"\ .% \. ";AT 2,X-1;"% % \':";AT 3,X-1;"% % % \. <";AT 4,X-1;"% % \''<";AT 5,X-1;"% % \.. <";AT 6,X-1;"\ :% "
5301 LET P(K)=X-1
5302 LET W$(K)="YELL"
5310 RETURN
5500 PRINT AT 3,X-2;"\.'\. \.'";AT 4,X-3;"\ ' \ '\. \.'\.'";AT 5,X;"\ '"
5501 LET P(K)=X-3
5502 LET W$(K)="ZIGZAG"
5510 RETURN
1 REM \06\01\C5\06\64\00\10\FD\C1\10\F7\C9\2E\2E\2E\2E\2E\2E\2E\2E\2E\2E\2E
2 SAVE "VOWE%L"
12 PRINT AT 8,11;"VOWELTUTOR";AT 10,2;"COPYRIGHT 1982 LOU GOLDSTEIN";AT 12,7;"% %F%R%O%M% %S%O%F%T%S%Y%N%C% %I%N%C% "
13 PRINT AT 20,5;"PRESS ""ENTER"" TO START"
14 PAUSE 33000
15 RAND
16 LET V$="AEIOU"
17 CLS
18 DIM P(3)
19 DIM W$(3,10)
20 DIM L(5)
23 PRINT AT 6,0;"WHICH VOWELS DO YOU WANT TO USE?1=LONG",,"2=SHORT",,"3=BOTH",,"4=EXIT PROGRAM"
24 INPUT O
25 LET LS=O
26 CLS
27 IF O=4 THEN STOP
30 IF O=3 THEN LET LS=INT (RND*2)+1
31 FOR K=1 TO 3
32 FAST
40 LET L(K)=INT (RND*5)+1
50 NEXT K
60 IF L(1)=L(2) OR L(1)=L(3) OR L(2)=L(3) THEN GOTO 31
80 LET C=INT (RND*3)+1
90 LET A$=V$(L(C))
99 SLOW
100 FOR K=1 TO 3
105 LET Z=INT (RND*3)
110 LET X=10*K-5
120 GOSUB 700*LS+100*L(K)+30*Z
121 PRINT AT 10,P(K);W$(K)
130 PRINT AT 15,X;K
140 NEXT K
150 PRINT AT 19,14;"\:'\''\':";AT 20,14;"\: ";A$;"\ :";AT 21,14;"\:.\..\.:"
151 FOR J=1 TO 10
152 IF W$(C,J)="% " THEN GOTO 155
153 NEXT J
155 LET W$(C,J)=A$
156 INPUT R
157 IF R=9 THEN CLS
160 IF R=9 THEN GOTO 23
170 IF R<>C THEN PRINT AT 16,10*C-9;"% % % % % % % % % "
180 IF R=C THEN PRINT AT 16,10*C-9;"*********"
185 PRINT AT 13,P(C);W$(C)
190 PAUSE 250
195 CLS
200 GOTO 30
800 LET W$(K)="TR% IN"
801 LET P(K)=X-2
802 PRINT AT 2,X-1;"*";AT 3,X;"*";AT 4,X;"\ :\..\. ";AT 5,X-4;"\ :% \.:% \.:% % >";AT 6,X-4;"\ '\ '\ '\ '\ ' \ '"
803 RETURN
830 LET W$(K)="C% NE"
831 LET P(K)=X-1
832 PRINT AT 1,X+1;"\' ";AT 0,X-1;"\ .\''\. "
833 FOR Y=41 TO 30 STEP -1
834 PLOT 2*X-1,Y
835 NEXT Y
836 RETURN
860 LET W$(K)="D% YS"
861 LET P(K)=X-2
862 PRINT AT 2,X-1;"FRI.";AT 4,X-1;"SAT.";AT 6,X-1;"SUN."
863 RETURN
900 LET W$(K)="K% Y"
901 LET P(K)=X-1
902 PRINT AT 3,X-3;"% % ";AT 4,X-3;"% % \:'\''\':% % \' ";AT 5,X-3;"% % \ '\ :\ '"
903 RETURN
930 LET W$(K)="THR% E"
931 LET P(K)=X-2
932 PRINT AT 3,X-1;"\''\''\: ";AT 4,X+1;"\: ";AT 5,X-1;"\ '\''\: ";AT 6,X+1;"\: ";AT 7,X-1;"\''\''\' "
933 RETURN
960 LET W$(K)="KN% E"
961 LET P(K)=X-2
962 PRINT AT 0,X+1;"% \: ";AT 1,X+1;"\':\' ";AT 2,X+1;"\: ";AT 3,X;"\ :\ '\..\. ";AT 4,X;"\: ";AT 5,X-1;"\ :\ '\. ";AT 6,X-1;"\ : \ '\. <";AT 7,X-2;"\ .\' \: ";AT 8,X-2;"\'. \''"
968 RETURN
1000 LET W$(K)="F% VE"
1001 LET P(K)=X-2
1002 PRINT AT 2,X-1;"\:'\''\' ";AT 3,X-1;"\:.\. ";AT 4,X;"\ '\. ";AT 5,X-1;"\. \ .\' ";AT 6,X-1;"\ '\' "
1003 RETURN
1030 LET W$(K)="K% TE"
1031 LET P(K)=X-2
1032 PRINT AT 0,X;"\.:\. ";AT 1,X-1;"\ .\':\'.";AT 2,X-1;"\.:\.:\.:\. ";AT 3,X-1;"\ :\ :\ :";AT 4,X;"% \: ";AT 5,X;"\ :";AT 6,X+1;"\'.";AT 7,X+1;"\.'";AT 8,X+1;"\ '"
1033 RETURN
1060 LET W$(K)="N% NE"
1061 LET P(K)=X-2
1063 PRINT AT 2,X-1;"\:'\''\: ";AT 3,X-1;"\: \: ";AT 4,X-1;"\''\''\: ";AT 5,X-1;"\. \: ";AT 6,X-1;"\''\''\' "
1064 RETURN
1100 LET W$(K)="B% AT"
1101 LET P(K)=X-2
1102 PRINT AT 1,X-2;"\..\..\..\..\. ";AT 2,X-2;"\ '\. \ '\. ";AT 3,X-1;"\.' \.'";AT 4,X-2;"\ '\''\':\''\''";AT 5,X-4;"\..\..\..\..\.:\..\..\..>";AT 6,X-4;"\':% % % % % \:'";AT 7,X-3;"\''\''\''\''\''"
1103 RETURN
1130 LET W$(K)="THR% W"
1131 LET P(K)=X-2
1132 PRINT AT 2,X+2;">";AT 3,X-2;"\ :% >\ '";AT 4,X-2;"\ '\:' \.'";AT 5,X-3;"\ .\''\:'\''";AT 6,X-3;"\' \: ";AT 7,X-2;"\.'\ '\. ";AT 8,X-3;"\ ' \ '"
1133 RETURN
1160 LET W$(K)="N% SE"
1161 LET P(K)=X-2
1162 PRINT AT 1,X-1;"\ .% \. ";AT 2,X-1;"% \:.\:.";AT 3,X-1;"% % \' ";AT 4,X-1;"\':\:'\' "
1163 FOR G=1 TO 3
1164 PRINT AT 2,1+X;"\: "
1165 LET U=USR 16514
1166 PRINT AT 2,X+1;"\:."
1167 LET U=USR 16514
1168 NEXT G
1169 RETURN
1200 LET W$(K)="% NITED"
1201 LET P(K)=X-3
1202 PRINT AT 1,X-3;"\..\..\..\..\..\. \.:";AT 2,X-4;"\ .% % % % % % \.:% ";AT 3,X-4;"\ :AMERICA\: ";AT 4,X-4;"\ '% % % % % % % \: ";AT 5,X-3;"\''\''% % % % % \: ";AT 6,X;"\':\:' \: ";AT 7,X+1;"\' "
1203 PRINT AT 11,P(K);"STATES"
1204 RETURN
1230 LET W$(K)="F% EL"
1231 LET P(K)=X-2
1232 PRINT AT 1,X-4;"\##\##\##";AT 2,X-4;"\##%G\##";AT 3,X-4;"\##%A\##";AT 4,X-4;"\##%S\##\'. \:'\''\':";AT 5,X-4;"\##\##\##\ '\..\:.\..\.:";AT 6,X-4;"\##\##\## % % % ";AT 7,X-4;"\##\##\## \: \ :"
1233 RETURN
1260 LET W$(K)="T% BE"
1261 LET P(K)=X-2
1262 PRINT AT 2,X-4;"\ .\..\..\..\..\..\..\..\. ";AT 3,X-4;"\ :\##TOOTH\##\:.";AT 4,X-4;"\ :\##PASTE\##\:'";AT 5,X-4;"\ '\''\''\''\''\''\''\''\' "
1263 RETURN
1500 LET W$(K)="FL% G"
1501 LET P(K)=X-2
1503 LET B=X-4
1504 PRINT AT 0,B;"\ .\..\..\..\..\..\..\..";AT 1,B;"\ :***\:'\''\''\':";AT 2,B;"\ :***\:'\''\''\':";AT 3,B;"\ :\''\''\''\''\''\''\':";AT 4,B;"\ :\''\''\''\''\''\''\':";AT 5,B;"\ :\''\''\''\''\''\''\''";AT 6,B;"\ :"
1505 RETURN
1530 LET W$(K)="% DD"
1531 LET P(K)=X-1
1532 PRINT AT 1,X-2;"3+2=\##";AT 3,X;"75";AT 4,X-1;"+23";AT 5,X-1;"\''\''\''"
1533 RETURN
1560 LET W$(K)="P% N"
1561 LET P(K)=X-1
1562 PRINT AT 3,X-3;"\..\..\..\..";AT 4,X-4;"\ :\' \ '\:.\..\..\..";AT 5,X-4;"\ :\:.\..\..\.:\: ";AT 6,X-4;"\ '% % % % \' "
1563 RETURN
1600 LET W$(K)="T% N"
1601 LET P(K)=X-1
1602 LET B=X-2
1603 PRINT AT 2,B;"\ : \:'\''\':";AT 3,B;"\ : \: \ :";AT 4,B;"\ : \: \ :";AT 5,B;"\ : \:.\..\.:"
1604 RETURN
1630 LET W$(K)="DR% SS"
1631 LET P(K)=X-2
1632 PRINT AT 1,X-2;"\.:\:.\.:\:.";AT 2,X-3;"\ '\:'% % \':\' ";AT 3,X-2;"\ .% % \. ";AT 4,X-3;"\ .% % % % \. ";AT 5,X-4;"\ .% % % % % % \. "
1633 RETURN
1660 LET W$(K)="L% G"
1661 LET P(K)=X-1
1662 LET B=X-1
1663 PRINT AT 0,X;"% \: ";AT 1,X;"\':\' ";AT 2,B;"% % % \: ";AT 3,B;"\: % \: \: ";AT 4,B;"\' % \: \' ";AT 5,B;"\ :% % ";AT 6,B;"\ :\: \##<";AT 7,B;"\ :\: \##<"
1664 RETURN
1700 LET W$(K)="S% X"
1701 LET P(K)=X-1
1702 LET B=X-1
1703 PRINT AT 1,X;"\..";AT 2,B;"\.' \' ";AT 3,B;"\: ";AT 4,B;"\:.\''\'.";AT 5,B;"\: \ :";AT 6,B;"\ '\..\' "
1704 RETURN
1730 LET W$(K)="SH% P"
1731 LET P(K)=X-2
1732 PRINT AT 3,X-3;"\..\:.\:.\. ";AT 4,X-5;"\ .\..% \:'% \:'% \:'% \:'";AT 5,X-4;"\':\:.% \:.% \:.% \:'";AT 6,X-5;"\@@\@@\@@\@@\@@\@@\@@\@@\@@\@@"
1733 RETURN
1760 LET W$(K)="WR% ST"
1761 LET P(K)=X-2
1762 LET B=X-1
1763 PRINT AT 0,B;"\..\..\..";AT 1,B;"\:'% \':";AT 2,B;"% \''% ";AT 3,B;"\''% \''"
1764 LET B=X-2
1765 PRINT AT 4,B;"% % % % % ";AT 5,B;"% \ :% \: % ";AT 6,B-1;">\##\ :% \: \##<";AT 7,B;"W W"
1766 RETURN
1800 LET W$(K)="P% T"
1801 LET P(K)=X-1
1802 PRINT AT 1,X-2;"\..";AT 2,X-4;"\ .\'' \''\. ";AT 3,X-4;"\:. \.:\..\..\..";AT 4,X-4;"% % \..% % ";AT 5,X-4;"\':% % % \:'";AT 6,X-3;"\ '\''\' "
1803 RETURN
1830 LET W$(K)="CL% CK"
1831 LET P(K)=X-3
1832 PRINT AT 1,X;"\..\. ";AT 2,X-2;"\ .\''\ .\ '\'.";AT 3,X-2;"\: \ : \: ";AT 4,X-3;"\ : \ :\..\. \ :";AT 5,X-3;"\ '\. \.'";AT 6,X-2;"\'. \ .\' ";AT 7,X-1;"\''\..\.'\' "
1833 RETURN
1860 LET W$(K)="ST% P"
1861 LET P(K)=X-2
1862 PRINT AT 0,X-2;"\ .% % \. ";AT 1,X-3;"\ .% % % % \. ";AT 2,X-3;"% ST P% ";AT 3,X-3;"% % % % % % ";AT 4,X-3;"\ '% % % % \' ";AT 5,X-2;"\ '% % \' ";AT 6,X-1;"\ :\: ";AT 7,X-1;"\ :\: "
1863 RETURN
1900 LET W$(K)="G% N"
1901 LET P(K)=X-1
1902 LET B=X-4
1903 PRINT AT 2,B;"\ :% % % % % -->";AT 3,B;"\ :\: \: \:'\''";AT 4,B;"\ :\:.\..\: ";AT 5,B;"\ :\: "
1904 RETURN
1930 LET W$(K)="DR% M"
1931 LET P(K)=X-2
1932 PRINT AT 0,X+2;"/";AT 1,X-1;"\.. \ ' /";AT 2,X-3;"\ .\'' \''\. \ '";AT 3,X-3;"\:. \.:";AT 4,X-3;"% % \..% % ";AT 5,X-3;"\':% % % \:'";AT 6,X-2;"\ '\''\' "
1933 RETURN
1960 LET W$(K)="B% S"
1961 LET P(K)=X-1
1962 LET B=X-3
1963 PRINT AT 2,B;"% \''\:'\':\''% % ";AT 3,B;"% \..\:.\.:\..% \ :% ";AT 4,B;"% % % % % % \.:% ";AT 5,B+1;"\' \ '"
1964 RETURN
Note: Type-in program listings on this website use ZMAKEBAS notation for graphics characters.
People
\FD\C1\F7\C9
Skip to content
Computer Tutor
Products: Computer Tutors: Alpha/Vowel Tutors
Developer(s): Lou Goldstein
Date: 1982
Type: Cassette
Platform(s): TS 1000
Tags: Education
AlphaTutor and VowelTutor are a paired set of educational programs designed to teach children letter recognition and vowel sounds through a picture-matching quiz format. Each round randomly selects three images drawn entirely in block graphics, displays them with numbered labels, and prompts the child to identify which picture matches a highlighted letter or vowel shown in a bordered box. The programs use computed GOSUB targets (e.g., `GOSUB 200*L(K)+500` and `GOSUB 700*LS+100*L(K)+30*Z`) to dispatch to one of 26 picture-drawing subroutines covering letters A–Z and multiple vowel-sound variants. VowelTutor extends the concept with separate long and short vowel word sets per letter, selected by a random or user-chosen mode flag, and includes an animated nose-sniffing and hat/smile flip routine via `USR 16514`, pointing to a small machine-code delay loop stored in the REM statement at line 1.
Program Analysis
This listing contains two related programs: AlphaTutor and VowelTutor, both credited to Lou Goldstein / SoftSync Inc., 1982. AlphaTutor covers all 26 letters of the alphabet; VowelTutor extends the concept to long and short vowel sounds, offering multiple word variants per vowel. Both share the same core quiz loop and picture-rendering architecture.
Program Structure
Both programs follow the same top-level flow:
- Title/splash screen (lines 12–14), then
RAND to seed the RNG.
- Initialise arrays
P(3), W$(3,10), L(3) (lines 18–20).
- Main loop (lines 30–200): pick three distinct random indices, choose one as the target, dispatch to a drawing subroutine for each, display a letter/vowel prompt box, read a numeric answer, give feedback, pause, clear and repeat.
- Drawing subroutines: one per picture subject, each printing block-graphic art, setting
P(K) (label column) and W$(K) (word string).
VowelTutor adds a mode-selection screen (lines 23–27) offering long vowels, short vowels, or both, stored in LS, and allows the user to return to mode selection by entering 9.
Computed GOSUB Dispatch
The most architecturally notable feature is the use of arithmetic expressions as GOSUB targets to select picture subroutines without IF/THEN chains:
- AlphaTutor:
GOSUB 200*L(K)+500 — with L(K) in 0–25, this generates targets 500 (A=ambulance), 700 (B=boy), 900 (C=car) … 5500 (Z=zigzag), spaced 200 apart.
- VowelTutor:
GOSUB 700*LS+100*L(K)+30*Z — the LS factor (1=long, 2=short) shifts into a separate bank of subroutines; L(K) selects the vowel (1–5 = A/E/I/O/U); Z (0–2) selects one of up to three word variants per vowel per length.
This is a compact and efficient dispatch mechanism that avoids long IF/THEN chains entirely, at the cost of requiring subroutines to be placed at exactly the computed line numbers.
Machine Code Usage
Line 1 in both programs is a REM statement whose body encodes a short Z80 machine-code routine. The sequence \06\01\C5\06\64\00\10\FD\C1\10\F7\C9 disassembles as:
LD B,1 — outer loop count
PUSH BC
LD B,100 ; LD C,0 — inner delay count (25600 iterations)
DJNZ $ — inner loop
POP BC ; DJNZ … — outer loop
RET
This routine is called via LET E=USR 16514 (the address of the REM body in the VowelTutor variant is slightly longer, hence a different offset in practice). It is used as a simple software delay in animation sequences — for example, the hat flip in AlphaTutor (lines 1901–1906), the smile animation (lines 4101–4106), and the nose-sniffing effect (lines 1163–1168 in VowelTutor).
Key BASIC Idioms
- Block graphic art: All pictures are rendered using the ZX81/TS1000 block graphic characters (2×2 pixel sub-characters), encoded here as zmakebas escape sequences such as
\ ., \:., \'', etc.
- Distinct random selection: Lines 60 check
L(1)=L(2) OR L(1)=L(3) OR L(2)=L(3) and loop back if any two indices collide, ensuring three distinct pictures appear each round.
- Column positioning via formula:
LET X=10*K-5 (line 110) distributes the three picture columns evenly across the 32-character screen (columns 5, 15, 25).
- Answer box: The target letter is displayed in a bordered box drawn with block graphics at lines 19–21 using
AT positioning.
- PLOT for QUEEN and CONE: The subroutines at lines 3700 and 830 use
PLOT with pixel coordinates to draw vertical lines, since the block graphic resolution is insufficient for narrow strokes.
VowelTutor Word-Embedding Technique
In VowelTutor, word labels use a space character as a placeholder for the missing vowel (e.g., "TR% IN" for TRAIN, "K% TE" for KITE). After the round is set up, lines 151–155 scan W$(C) character-by-character to find the first "% " (space) position, then replace it with the actual vowel character A$ — effectively filling in the blank dynamically. This lets the same word string serve as both a gapped display and, after substitution, the correct spelled form.
Notable Subroutine Sharing
AlphaTutor’s GIRL subroutine (line 1700) is shared with BOY (line 700): the BOY subroutine calls GOSUB 1700 to draw the upper body, then the shared routine checks IF L(K)=1 THEN RETURN (line 1710) to exit early for BOY, or continues to draw the skirt/legs for GIRL. Similarly, VowelTutor’s WOMAN subroutine (line 4900) reuses the MAN subroutine (line 2900) for the head and torso, then overprints with different lower-body graphics.
Array Sizing
Array Dimensions Purpose P(3)3 elements Column position for each picture’s word label W$(3,10)3 strings × 10 chars Word associated with each picture slot L(3) / L(5)3 (Alpha) / 5 (Vowel) Random index for picture selection
Potential Anomalies
- AlphaTutor has no subroutine at the computed target for letter index 0 (line 500 handles A=0, as
200*0+500=500) — this is correct; L(K)=INT(RND*26) yields 0–25, mapping to lines 500–5500.
- VowelTutor’s
GOSUB 700*LS+100*L(K)+30*Z for LS=2 (short vowels) can yield targets like 1400+30*Z (lines 1400, 1430, 1460) which are not all defined in the listing — some short-vowel variant slots appear absent, which would cause a BASIC error if selected. This may reflect incomplete subroutine coverage in the original listing.
- The
PAUSE 33000 at line 14 provides a long title-screen pause (~30 seconds at normal speed) but any key press does not skip it — the user must wait it out unless they press BREAK.
- In VowelTutor, the
\## sequences in several subroutines (e.g., lines 1232, 1262, 1532) are not standard zmakebas escape sequences and likely represent inverse-video block characters or UDGs in the original tape file that were not fully decoded in this transcription.
Content
Source Code
1 REM \06\01\C5\06\64\00\10\FD\C1\10\F7\C9\2E\2E\2E\2E\2E\2E
2 SAVE "AB%C"
12 PRINT AT 8,11;"ALPHATUTOR";AT 10,2;"COPYRIGHT 1982 LOU GOLDSTEIN";AT 12,6;"% %F%R%O%M% %S%O%F%T%S%Y%N%C% %I%N%C% "
13 PRINT AT 20,5;"PRESS ""ENTER"" TO START"
14 PAUSE 33000
15 RAND
17 CLS
18 DIM P(3)
19 DIM W$(3,10)
20 DIM L(3)
30 FOR K=1 TO 3
40 LET L(K)=INT (RND*26)
50 NEXT K
60 IF L(1)=L(2) OR L(1)=L(3) OR L(2)=L(3) THEN GOTO 30
80 LET C=INT (RND*3)+1
90 LET A$=CHR$ (L(C)+38)
100 FOR K=1 TO 3
110 LET X=10*K-5
120 GOSUB 200*L(K)+500
121 PRINT AT 10,P(K);"% ";W$(K,2 TO )
130 PRINT AT 15,X;K
140 NEXT K
150 PRINT AT 19,14;"\:'\''\':";AT 20,14;"\: ";A$;"\ :";AT 21,14;"\:.\..\.:"
160 INPUT R
170 IF R<>C THEN PRINT AT 16,10*C-9;"% % % % % % % % % "
180 IF R=C THEN PRINT AT 16,10*C-9;"*********"
185 PRINT AT 13,P(C);W$(C)
190 PAUSE 250
195 CLS
200 GOTO 30
500 PRINT AT 3,X-3;"\..\..\..\..";AT 4,X-3;"\: \ . \ :";AT 5,X-3;"\: \':\' \ '\''\':";AT 6,X-3;"\:.\..\..\..\..\.:";AT 7,X-3;"\' \' "
501 LET P(K)=X-4
502 LET W$(K)="AMBULANCE"
510 RETURN
700 GOSUB 1700
710 PRINT AT 4,X;"\ :";AT 5,X;"\.'\. ";AT 6,X-1;"\.' \ '\. ";AT 7,X-2;"\.' \ '\. "
711 LET P(K)=X-1
712 LET W$(K)="BOY"
720 RETURN
900 PRINT AT 5,X-3;"\ :% % % ";AT 6,X-3;"\ :% % % % % ";AT 7,X-2;"\' \ '"
901 LET P(K)=X-1
902 LET W$(K)="CAR"
910 RETURN
1100 PRINT AT 1,X-4;"\ . \:.\. ";AT 2,X-3;"\'. % \. ";AT 3,X-2;"% % % ";AT 4,X-2;"\:'\''\':";AT 5,X-2;"\: \ :"
1101 LET P(K)=X-1
1102 LET W$(K)="DOG"
1110 RETURN
1300 PRINT AT 1,X-4;"\ .% % % \..";AT 2,X-4;"% % % % \.:";AT 3,X-4;"\':% % \:'\ '\..\' ";AT 4,X-4;"\ : \: "
1301 LET P(K)=X-4
1302 LET W$(K)="ELEPHANT"
1310 RETURN
1500 PRINT AT 1,X-4;"\ . \ .\..";AT 2,X-4;"\ :\:.\.:% % \':\. ";AT 3,X-4;"\ :% % % % % \. ";AT 4,X-4;"\ :\' \ '\':\:'\' "
1501 LET P(K)=X-2
1502 LET W$(K)="FISH"
1510 RETURN
1700 PRINT AT 0,X;"% \: ";AT 1,X;"\':\' ";AT 2,X-1;"\ .\':\'.";AT 3,X-1;"\' \ : \' "
1710 IF L(K)=1 THEN RETURN
1720 PRINT AT 4,X;"\.:\. ";AT 5,X-1;"\.:% % \. ";AT 6,X-2;"\ '\:'\''\''\:'";AT 7,X-1;"\: \: "
1721 LET P(K)=X-2
1722 LET W$(K)="GIRL"
1730 RETURN
1900 PRINT AT 1,X-2;">\ .\..\..\. <";AT 2,X-1;"\.:% % \:.";AT 3,X-1;"\ :..\: ";AT 4,X-1;"\ : \: ";AT 5,X-1;"\ :\ '\' \: ";AT 6,X;"\''\''"
1901 FOR F=1 TO 2
1902 PRINT AT 1,X-1;" ";AT 2,X-1;"\ .\..\..\. "
1903 LET E=USR 16514
1904 PRINT AT 1,X-1;"\ .\..\..\. ";AT 2,X-1;"\.:% % \:."
1905 LET E=USR 16514
1906 NEXT F
1907 LET P(K)=X-1
1908 LET W$(K)="HAT"
1910 RETURN
2100 PRINT AT 1,X-1;"\ :";AT 2,X-1;"\ :";AT 3,X-2;"\ .\''\''\''\. ";AT 4,X-2;"\ :\~~\~~\~~\: ";AT 5,X-2;"\ :\ ' \' \: ";AT 6,X-2;"\ :\ .\..\. \: ";AT 7,X-2;"\ '\..\..\..\' "
2101 LET P(K)=X-3
2102 LET W$(K)="INDIAN"
2110 RETURN
2300 PRINT AT 1,X-3;"---\:.";AT 2,X-3;"\':\..\..\.:\:.\..";AT 3,X-3;"\ :\..\..\..\..\..% >";AT 4,X-3;"---\ .\:'";AT 5,X-3;"---\:'"
2301 LET P(K)=X-1
2302 LET W$(K)="JET"
2310 RETURN
2500 LET P(K)=X-2
2522 LET W$(K)="KING"
2523 PRINT AT 1,X-2;"\. \. \. \. \. ";AT 2,X-2;"\':\''\''\':\' ";AT 3,X-2;"\ :\ '\ '\ :";AT 4,X-2;"\ : \' \ :";AT 5,X-2;"\ :\ '\''\ :";AT 6,X-1;"\':% \' "
2530 RETURN
2700 PRINT AT 2,X-3;"A B C D";AT 3,X-2;"E F G"
2701 LET P(K)=X-4
2702 LET W$(K)="LETTERS"
2710 RETURN
2900 PRINT AT 1,X;"% \: ";AT 2,X;"\':\' ";AT 3,X-1;"% % % \: ";AT 4,X-1;"\: % \: \: ";AT 5,X-1;"\' % \: \' "
2910 IF L(K)=22 THEN RETURN
2920 PRINT AT 6,X-1;"\ :% % ";AT 7,X-1;"\ :\: % ";AT 8,X-1;"\ :\: % "
2921 LET P(K)=X-1
2922 LET W$(K)="MAN"
2930 RETURN
3100 PRINT AT 3,X-3;"1 2 3 4";AT 4,X-2;"5 6 7"
3101 LET P(K)=X-3
3102 LET W$(K)="NUMBERS"
3110 RETURN
3300 PRINT AT 1,X-4;"\. ";AT 2,X-4;"\ '\'. \.:\. \..\. ";AT 3,X-2;"\':% % \''";AT 4,X-4;"\ .\.'\':% % \.. \.'";AT 5,X-4;"\' \ .\.'\.'\.'\. \''";AT 6,X-4;"\ .\' \ .\' \'.\ '\'.";AT 7,X-4;"\' \ .\' \ '\. "
3301 LET P(K)=X-3
3302 LET W$(K)="OCTOPUS"
3310 RETURN
3500 PRINT AT 5,X-2;"\..\..\..\..% ";AT 4,X+2;"*";AT 3,X+2;"*"
3501 LET P(K)=X-1
3502 LET W$(K)="PIPE"
3510 RETURN
3700 GOSUB 2500
3710 FOR Y=38 TO 29 STEP -1
3720 PLOT 2*X-4,Y
3730 PLOT 2*X+4,Y
3740 NEXT Y
3751 LET P(K)=X-2
3752 LET W$(K)="QUEEN"
3760 RETURN
3900 PRINT AT 1,X;"A";AT 2,X;"% ";AT 3,X;"% ";AT 4,X;"% ";AT 5,X;"% ";AT 6,X-1;"\..% \..";AT 7,X-1;"\' *\ '";AT 8,X;"*"
3901 LET P(K)=X-3
3902 LET W$(K)="ROCKET"
3910 RETURN
4100 PRINT AT 1,X-1;"\..\..\..";AT 2,X-2;"\ :\ . \. \: ";AT 3,X-2;"\ : \: ";AT 4,X-3;">\ :\ . \. \: <";AT 5,X-2;"\ : \'' \: ";AT 6,X-1;"\''\''\''"
4101 FOR F=1 TO 2
4102 PRINT AT 4,X-1;" ";AT 5,X-1;"\ '\''\' "
4103 LET E=USR 16514
4104 PRINT AT 4,X-1;"\ . \. ";AT 5,X-1;" \'' "
4105 LET E=USR 16514
4106 NEXT F
4107 LET P(K)=X-2
4108 LET W$(K)="SMILE"
4110 RETURN
4300 PRINT AT 1,X-1;"\ .% \. ";AT 2,X-2;"\ .% % % \. ";AT 3,X-2;"% % % % % ";AT 4,X-2;"\ '% % % \' ";AT 5,X-1;"\ '% \' ";AT 6,X;"% ";AT 7,X-1;"\ .% \. "
4301 LET P(K)=X-2
4302 LET W$(K)="TREE"
4310 RETURN
4500 PRINT AT 1,X;"\.:\. ";AT 2,X-1;"\.'\ :\ '\. ";AT 3,X;"\ :";AT 4,X;"\ :"
4501 LET P(K)=X-1
4502 LET W$(K)="UP"
4510 RETURN
4700 PRINT AT 2,X-2;"\ .\. \..";AT 3,X-2;"% % \. \.:% \: ";AT 4,X-2;"\':% % % % \' ";AT 5,X-1;"\':% % \' ";AT 6,X;"\':\' "
4701 LET P(K)=X-4
4702 LET W$(K)="VALENTINE"
4710 RETURN
4900 GOSUB 2900
4910 PRINT AT 6,X-1;"\.:% % \. ";AT 7,X-2;"\.:% % % % \. ";AT 8,X-1;"\ :\: % "
4911 LET P(K)=X-2
4912 LET W$(K)="WOMAN"
4920 RETURN
5100 PRINT AT 1,X-3;"\: \: \: \: \: \: \: ";AT 2,X-3;"\: \: \: \: \: \' ";AT 3,X-3;"\: \: \: \' \. ";AT 4,X-3;"\: \' \. /";AT 5,X-1;"/"
5101 LET P(K)=X-4
5102 LET W$(K)="XYLOPHONE"
5110 RETURN
5300 PRINT AT 1,X-1;"\ .% \. ";AT 2,X-1;"% % \':";AT 3,X-1;"% % % \. <";AT 4,X-1;"% % \''<";AT 5,X-1;"% % \.. <";AT 6,X-1;"\ :% "
5301 LET P(K)=X-1
5302 LET W$(K)="YELL"
5310 RETURN
5500 PRINT AT 3,X-2;"\.'\. \.'";AT 4,X-3;"\ ' \ '\. \.'\.'";AT 5,X;"\ '"
5501 LET P(K)=X-3
5502 LET W$(K)="ZIGZAG"
5510 RETURN
1 REM \06\01\C5\06\64\00\10\FD\C1\10\F7\C9\2E\2E\2E\2E\2E\2E\2E\2E\2E\2E\2E
2 SAVE "VOWE%L"
12 PRINT AT 8,11;"VOWELTUTOR";AT 10,2;"COPYRIGHT 1982 LOU GOLDSTEIN";AT 12,7;"% %F%R%O%M% %S%O%F%T%S%Y%N%C% %I%N%C% "
13 PRINT AT 20,5;"PRESS ""ENTER"" TO START"
14 PAUSE 33000
15 RAND
16 LET V$="AEIOU"
17 CLS
18 DIM P(3)
19 DIM W$(3,10)
20 DIM L(5)
23 PRINT AT 6,0;"WHICH VOWELS DO YOU WANT TO USE?1=LONG",,"2=SHORT",,"3=BOTH",,"4=EXIT PROGRAM"
24 INPUT O
25 LET LS=O
26 CLS
27 IF O=4 THEN STOP
30 IF O=3 THEN LET LS=INT (RND*2)+1
31 FOR K=1 TO 3
32 FAST
40 LET L(K)=INT (RND*5)+1
50 NEXT K
60 IF L(1)=L(2) OR L(1)=L(3) OR L(2)=L(3) THEN GOTO 31
80 LET C=INT (RND*3)+1
90 LET A$=V$(L(C))
99 SLOW
100 FOR K=1 TO 3
105 LET Z=INT (RND*3)
110 LET X=10*K-5
120 GOSUB 700*LS+100*L(K)+30*Z
121 PRINT AT 10,P(K);W$(K)
130 PRINT AT 15,X;K
140 NEXT K
150 PRINT AT 19,14;"\:'\''\':";AT 20,14;"\: ";A$;"\ :";AT 21,14;"\:.\..\.:"
151 FOR J=1 TO 10
152 IF W$(C,J)="% " THEN GOTO 155
153 NEXT J
155 LET W$(C,J)=A$
156 INPUT R
157 IF R=9 THEN CLS
160 IF R=9 THEN GOTO 23
170 IF R<>C THEN PRINT AT 16,10*C-9;"% % % % % % % % % "
180 IF R=C THEN PRINT AT 16,10*C-9;"*********"
185 PRINT AT 13,P(C);W$(C)
190 PAUSE 250
195 CLS
200 GOTO 30
800 LET W$(K)="TR% IN"
801 LET P(K)=X-2
802 PRINT AT 2,X-1;"*";AT 3,X;"*";AT 4,X;"\ :\..\. ";AT 5,X-4;"\ :% \.:% \.:% % >";AT 6,X-4;"\ '\ '\ '\ '\ ' \ '"
803 RETURN
830 LET W$(K)="C% NE"
831 LET P(K)=X-1
832 PRINT AT 1,X+1;"\' ";AT 0,X-1;"\ .\''\. "
833 FOR Y=41 TO 30 STEP -1
834 PLOT 2*X-1,Y
835 NEXT Y
836 RETURN
860 LET W$(K)="D% YS"
861 LET P(K)=X-2
862 PRINT AT 2,X-1;"FRI.";AT 4,X-1;"SAT.";AT 6,X-1;"SUN."
863 RETURN
900 LET W$(K)="K% Y"
901 LET P(K)=X-1
902 PRINT AT 3,X-3;"% % ";AT 4,X-3;"% % \:'\''\':% % \' ";AT 5,X-3;"% % \ '\ :\ '"
903 RETURN
930 LET W$(K)="THR% E"
931 LET P(K)=X-2
932 PRINT AT 3,X-1;"\''\''\: ";AT 4,X+1;"\: ";AT 5,X-1;"\ '\''\: ";AT 6,X+1;"\: ";AT 7,X-1;"\''\''\' "
933 RETURN
960 LET W$(K)="KN% E"
961 LET P(K)=X-2
962 PRINT AT 0,X+1;"% \: ";AT 1,X+1;"\':\' ";AT 2,X+1;"\: ";AT 3,X;"\ :\ '\..\. ";AT 4,X;"\: ";AT 5,X-1;"\ :\ '\. ";AT 6,X-1;"\ : \ '\. <";AT 7,X-2;"\ .\' \: ";AT 8,X-2;"\'. \''"
968 RETURN
1000 LET W$(K)="F% VE"
1001 LET P(K)=X-2
1002 PRINT AT 2,X-1;"\:'\''\' ";AT 3,X-1;"\:.\. ";AT 4,X;"\ '\. ";AT 5,X-1;"\. \ .\' ";AT 6,X-1;"\ '\' "
1003 RETURN
1030 LET W$(K)="K% TE"
1031 LET P(K)=X-2
1032 PRINT AT 0,X;"\.:\. ";AT 1,X-1;"\ .\':\'.";AT 2,X-1;"\.:\.:\.:\. ";AT 3,X-1;"\ :\ :\ :";AT 4,X;"% \: ";AT 5,X;"\ :";AT 6,X+1;"\'.";AT 7,X+1;"\.'";AT 8,X+1;"\ '"
1033 RETURN
1060 LET W$(K)="N% NE"
1061 LET P(K)=X-2
1063 PRINT AT 2,X-1;"\:'\''\: ";AT 3,X-1;"\: \: ";AT 4,X-1;"\''\''\: ";AT 5,X-1;"\. \: ";AT 6,X-1;"\''\''\' "
1064 RETURN
1100 LET W$(K)="B% AT"
1101 LET P(K)=X-2
1102 PRINT AT 1,X-2;"\..\..\..\..\. ";AT 2,X-2;"\ '\. \ '\. ";AT 3,X-1;"\.' \.'";AT 4,X-2;"\ '\''\':\''\''";AT 5,X-4;"\..\..\..\..\.:\..\..\..>";AT 6,X-4;"\':% % % % % \:'";AT 7,X-3;"\''\''\''\''\''"
1103 RETURN
1130 LET W$(K)="THR% W"
1131 LET P(K)=X-2
1132 PRINT AT 2,X+2;">";AT 3,X-2;"\ :% >\ '";AT 4,X-2;"\ '\:' \.'";AT 5,X-3;"\ .\''\:'\''";AT 6,X-3;"\' \: ";AT 7,X-2;"\.'\ '\. ";AT 8,X-3;"\ ' \ '"
1133 RETURN
1160 LET W$(K)="N% SE"
1161 LET P(K)=X-2
1162 PRINT AT 1,X-1;"\ .% \. ";AT 2,X-1;"% \:.\:.";AT 3,X-1;"% % \' ";AT 4,X-1;"\':\:'\' "
1163 FOR G=1 TO 3
1164 PRINT AT 2,1+X;"\: "
1165 LET U=USR 16514
1166 PRINT AT 2,X+1;"\:."
1167 LET U=USR 16514
1168 NEXT G
1169 RETURN
1200 LET W$(K)="% NITED"
1201 LET P(K)=X-3
1202 PRINT AT 1,X-3;"\..\..\..\..\..\. \.:";AT 2,X-4;"\ .% % % % % % \.:% ";AT 3,X-4;"\ :AMERICA\: ";AT 4,X-4;"\ '% % % % % % % \: ";AT 5,X-3;"\''\''% % % % % \: ";AT 6,X;"\':\:' \: ";AT 7,X+1;"\' "
1203 PRINT AT 11,P(K);"STATES"
1204 RETURN
1230 LET W$(K)="F% EL"
1231 LET P(K)=X-2
1232 PRINT AT 1,X-4;"\##\##\##";AT 2,X-4;"\##%G\##";AT 3,X-4;"\##%A\##";AT 4,X-4;"\##%S\##\'. \:'\''\':";AT 5,X-4;"\##\##\##\ '\..\:.\..\.:";AT 6,X-4;"\##\##\## % % % ";AT 7,X-4;"\##\##\## \: \ :"
1233 RETURN
1260 LET W$(K)="T% BE"
1261 LET P(K)=X-2
1262 PRINT AT 2,X-4;"\ .\..\..\..\..\..\..\..\. ";AT 3,X-4;"\ :\##TOOTH\##\:.";AT 4,X-4;"\ :\##PASTE\##\:'";AT 5,X-4;"\ '\''\''\''\''\''\''\''\' "
1263 RETURN
1500 LET W$(K)="FL% G"
1501 LET P(K)=X-2
1503 LET B=X-4
1504 PRINT AT 0,B;"\ .\..\..\..\..\..\..\..";AT 1,B;"\ :***\:'\''\''\':";AT 2,B;"\ :***\:'\''\''\':";AT 3,B;"\ :\''\''\''\''\''\''\':";AT 4,B;"\ :\''\''\''\''\''\''\':";AT 5,B;"\ :\''\''\''\''\''\''\''";AT 6,B;"\ :"
1505 RETURN
1530 LET W$(K)="% DD"
1531 LET P(K)=X-1
1532 PRINT AT 1,X-2;"3+2=\##";AT 3,X;"75";AT 4,X-1;"+23";AT 5,X-1;"\''\''\''"
1533 RETURN
1560 LET W$(K)="P% N"
1561 LET P(K)=X-1
1562 PRINT AT 3,X-3;"\..\..\..\..";AT 4,X-4;"\ :\' \ '\:.\..\..\..";AT 5,X-4;"\ :\:.\..\..\.:\: ";AT 6,X-4;"\ '% % % % \' "
1563 RETURN
1600 LET W$(K)="T% N"
1601 LET P(K)=X-1
1602 LET B=X-2
1603 PRINT AT 2,B;"\ : \:'\''\':";AT 3,B;"\ : \: \ :";AT 4,B;"\ : \: \ :";AT 5,B;"\ : \:.\..\.:"
1604 RETURN
1630 LET W$(K)="DR% SS"
1631 LET P(K)=X-2
1632 PRINT AT 1,X-2;"\.:\:.\.:\:.";AT 2,X-3;"\ '\:'% % \':\' ";AT 3,X-2;"\ .% % \. ";AT 4,X-3;"\ .% % % % \. ";AT 5,X-4;"\ .% % % % % % \. "
1633 RETURN
1660 LET W$(K)="L% G"
1661 LET P(K)=X-1
1662 LET B=X-1
1663 PRINT AT 0,X;"% \: ";AT 1,X;"\':\' ";AT 2,B;"% % % \: ";AT 3,B;"\: % \: \: ";AT 4,B;"\' % \: \' ";AT 5,B;"\ :% % ";AT 6,B;"\ :\: \##<";AT 7,B;"\ :\: \##<"
1664 RETURN
1700 LET W$(K)="S% X"
1701 LET P(K)=X-1
1702 LET B=X-1
1703 PRINT AT 1,X;"\..";AT 2,B;"\.' \' ";AT 3,B;"\: ";AT 4,B;"\:.\''\'.";AT 5,B;"\: \ :";AT 6,B;"\ '\..\' "
1704 RETURN
1730 LET W$(K)="SH% P"
1731 LET P(K)=X-2
1732 PRINT AT 3,X-3;"\..\:.\:.\. ";AT 4,X-5;"\ .\..% \:'% \:'% \:'% \:'";AT 5,X-4;"\':\:.% \:.% \:.% \:'";AT 6,X-5;"\@@\@@\@@\@@\@@\@@\@@\@@\@@\@@"
1733 RETURN
1760 LET W$(K)="WR% ST"
1761 LET P(K)=X-2
1762 LET B=X-1
1763 PRINT AT 0,B;"\..\..\..";AT 1,B;"\:'% \':";AT 2,B;"% \''% ";AT 3,B;"\''% \''"
1764 LET B=X-2
1765 PRINT AT 4,B;"% % % % % ";AT 5,B;"% \ :% \: % ";AT 6,B-1;">\##\ :% \: \##<";AT 7,B;"W W"
1766 RETURN
1800 LET W$(K)="P% T"
1801 LET P(K)=X-1
1802 PRINT AT 1,X-2;"\..";AT 2,X-4;"\ .\'' \''\. ";AT 3,X-4;"\:. \.:\..\..\..";AT 4,X-4;"% % \..% % ";AT 5,X-4;"\':% % % \:'";AT 6,X-3;"\ '\''\' "
1803 RETURN
1830 LET W$(K)="CL% CK"
1831 LET P(K)=X-3
1832 PRINT AT 1,X;"\..\. ";AT 2,X-2;"\ .\''\ .\ '\'.";AT 3,X-2;"\: \ : \: ";AT 4,X-3;"\ : \ :\..\. \ :";AT 5,X-3;"\ '\. \.'";AT 6,X-2;"\'. \ .\' ";AT 7,X-1;"\''\..\.'\' "
1833 RETURN
1860 LET W$(K)="ST% P"
1861 LET P(K)=X-2
1862 PRINT AT 0,X-2;"\ .% % \. ";AT 1,X-3;"\ .% % % % \. ";AT 2,X-3;"% ST P% ";AT 3,X-3;"% % % % % % ";AT 4,X-3;"\ '% % % % \' ";AT 5,X-2;"\ '% % \' ";AT 6,X-1;"\ :\: ";AT 7,X-1;"\ :\: "
1863 RETURN
1900 LET W$(K)="G% N"
1901 LET P(K)=X-1
1902 LET B=X-4
1903 PRINT AT 2,B;"\ :% % % % % -->";AT 3,B;"\ :\: \: \:'\''";AT 4,B;"\ :\:.\..\: ";AT 5,B;"\ :\: "
1904 RETURN
1930 LET W$(K)="DR% M"
1931 LET P(K)=X-2
1932 PRINT AT 0,X+2;"/";AT 1,X-1;"\.. \ ' /";AT 2,X-3;"\ .\'' \''\. \ '";AT 3,X-3;"\:. \.:";AT 4,X-3;"% % \..% % ";AT 5,X-3;"\':% % % \:'";AT 6,X-2;"\ '\''\' "
1933 RETURN
1960 LET W$(K)="B% S"
1961 LET P(K)=X-1
1962 LET B=X-3
1963 PRINT AT 2,B;"% \''\:'\':\''% % ";AT 3,B;"% \..\:.\.:\..% \ :% ";AT 4,B;"% % % % % % \.:% ";AT 5,B+1;"\' \ '"
1964 RETURN
Note: Type-in program listings on this website use ZMAKEBAS notation for graphics characters.
People
E
Skip to content
Computer Tutor
Products: Computer Tutors: Alpha/Vowel Tutors
Developer(s): Lou Goldstein
Date: 1982
Type: Cassette
Platform(s): TS 1000
Tags: Education
AlphaTutor and VowelTutor are a paired set of educational programs designed to teach children letter recognition and vowel sounds through a picture-matching quiz format. Each round randomly selects three images drawn entirely in block graphics, displays them with numbered labels, and prompts the child to identify which picture matches a highlighted letter or vowel shown in a bordered box. The programs use computed GOSUB targets (e.g., `GOSUB 200*L(K)+500` and `GOSUB 700*LS+100*L(K)+30*Z`) to dispatch to one of 26 picture-drawing subroutines covering letters A–Z and multiple vowel-sound variants. VowelTutor extends the concept with separate long and short vowel word sets per letter, selected by a random or user-chosen mode flag, and includes an animated nose-sniffing and hat/smile flip routine via `USR 16514`, pointing to a small machine-code delay loop stored in the REM statement at line 1.
Program Analysis
This listing contains two related programs: AlphaTutor and VowelTutor, both credited to Lou Goldstein / SoftSync Inc., 1982. AlphaTutor covers all 26 letters of the alphabet; VowelTutor extends the concept to long and short vowel sounds, offering multiple word variants per vowel. Both share the same core quiz loop and picture-rendering architecture.
Program Structure
Both programs follow the same top-level flow:
- Title/splash screen (lines 12–14), then
RAND to seed the RNG.
- Initialise arrays
P(3), W$(3,10), L(3) (lines 18–20).
- Main loop (lines 30–200): pick three distinct random indices, choose one as the target, dispatch to a drawing subroutine for each, display a letter/vowel prompt box, read a numeric answer, give feedback, pause, clear and repeat.
- Drawing subroutines: one per picture subject, each printing block-graphic art, setting
P(K) (label column) and W$(K) (word string).
VowelTutor adds a mode-selection screen (lines 23–27) offering long vowels, short vowels, or both, stored in LS, and allows the user to return to mode selection by entering 9.
Computed GOSUB Dispatch
The most architecturally notable feature is the use of arithmetic expressions as GOSUB targets to select picture subroutines without IF/THEN chains:
- AlphaTutor:
GOSUB 200*L(K)+500 — with L(K) in 0–25, this generates targets 500 (A=ambulance), 700 (B=boy), 900 (C=car) … 5500 (Z=zigzag), spaced 200 apart.
- VowelTutor:
GOSUB 700*LS+100*L(K)+30*Z — the LS factor (1=long, 2=short) shifts into a separate bank of subroutines; L(K) selects the vowel (1–5 = A/E/I/O/U); Z (0–2) selects one of up to three word variants per vowel per length.
This is a compact and efficient dispatch mechanism that avoids long IF/THEN chains entirely, at the cost of requiring subroutines to be placed at exactly the computed line numbers.
Machine Code Usage
Line 1 in both programs is a REM statement whose body encodes a short Z80 machine-code routine. The sequence \06\01\C5\06\64\00\10\FD\C1\10\F7\C9 disassembles as:
LD B,1 — outer loop count
PUSH BC
LD B,100 ; LD C,0 — inner delay count (25600 iterations)
DJNZ $ — inner loop
POP BC ; DJNZ … — outer loop
RET
This routine is called via LET E=USR 16514 (the address of the REM body in the VowelTutor variant is slightly longer, hence a different offset in practice). It is used as a simple software delay in animation sequences — for example, the hat flip in AlphaTutor (lines 1901–1906), the smile animation (lines 4101–4106), and the nose-sniffing effect (lines 1163–1168 in VowelTutor).
Key BASIC Idioms
- Block graphic art: All pictures are rendered using the ZX81/TS1000 block graphic characters (2×2 pixel sub-characters), encoded here as zmakebas escape sequences such as
\ ., \:., \'', etc.
- Distinct random selection: Lines 60 check
L(1)=L(2) OR L(1)=L(3) OR L(2)=L(3) and loop back if any two indices collide, ensuring three distinct pictures appear each round.
- Column positioning via formula:
LET X=10*K-5 (line 110) distributes the three picture columns evenly across the 32-character screen (columns 5, 15, 25).
- Answer box: The target letter is displayed in a bordered box drawn with block graphics at lines 19–21 using
AT positioning.
- PLOT for QUEEN and CONE: The subroutines at lines 3700 and 830 use
PLOT with pixel coordinates to draw vertical lines, since the block graphic resolution is insufficient for narrow strokes.
VowelTutor Word-Embedding Technique
In VowelTutor, word labels use a space character as a placeholder for the missing vowel (e.g., "TR% IN" for TRAIN, "K% TE" for KITE). After the round is set up, lines 151–155 scan W$(C) character-by-character to find the first "% " (space) position, then replace it with the actual vowel character A$ — effectively filling in the blank dynamically. This lets the same word string serve as both a gapped display and, after substitution, the correct spelled form.
Notable Subroutine Sharing
AlphaTutor’s GIRL subroutine (line 1700) is shared with BOY (line 700): the BOY subroutine calls GOSUB 1700 to draw the upper body, then the shared routine checks IF L(K)=1 THEN RETURN (line 1710) to exit early for BOY, or continues to draw the skirt/legs for GIRL. Similarly, VowelTutor’s WOMAN subroutine (line 4900) reuses the MAN subroutine (line 2900) for the head and torso, then overprints with different lower-body graphics.
Array Sizing
Array Dimensions Purpose P(3)3 elements Column position for each picture’s word label W$(3,10)3 strings × 10 chars Word associated with each picture slot L(3) / L(5)3 (Alpha) / 5 (Vowel) Random index for picture selection
Potential Anomalies
- AlphaTutor has no subroutine at the computed target for letter index 0 (line 500 handles A=0, as
200*0+500=500) — this is correct; L(K)=INT(RND*26) yields 0–25, mapping to lines 500–5500.
- VowelTutor’s
GOSUB 700*LS+100*L(K)+30*Z for LS=2 (short vowels) can yield targets like 1400+30*Z (lines 1400, 1430, 1460) which are not all defined in the listing — some short-vowel variant slots appear absent, which would cause a BASIC error if selected. This may reflect incomplete subroutine coverage in the original listing.
- The
PAUSE 33000 at line 14 provides a long title-screen pause (~30 seconds at normal speed) but any key press does not skip it — the user must wait it out unless they press BREAK.
- In VowelTutor, the
\## sequences in several subroutines (e.g., lines 1232, 1262, 1532) are not standard zmakebas escape sequences and likely represent inverse-video block characters or UDGs in the original tape file that were not fully decoded in this transcription.
Content
Source Code
1 REM \06\01\C5\06\64\00\10\FD\C1\10\F7\C9\2E\2E\2E\2E\2E\2E
2 SAVE "AB%C"
12 PRINT AT 8,11;"ALPHATUTOR";AT 10,2;"COPYRIGHT 1982 LOU GOLDSTEIN";AT 12,6;"% %F%R%O%M% %S%O%F%T%S%Y%N%C% %I%N%C% "
13 PRINT AT 20,5;"PRESS ""ENTER"" TO START"
14 PAUSE 33000
15 RAND
17 CLS
18 DIM P(3)
19 DIM W$(3,10)
20 DIM L(3)
30 FOR K=1 TO 3
40 LET L(K)=INT (RND*26)
50 NEXT K
60 IF L(1)=L(2) OR L(1)=L(3) OR L(2)=L(3) THEN GOTO 30
80 LET C=INT (RND*3)+1
90 LET A$=CHR$ (L(C)+38)
100 FOR K=1 TO 3
110 LET X=10*K-5
120 GOSUB 200*L(K)+500
121 PRINT AT 10,P(K);"% ";W$(K,2 TO )
130 PRINT AT 15,X;K
140 NEXT K
150 PRINT AT 19,14;"\:'\''\':";AT 20,14;"\: ";A$;"\ :";AT 21,14;"\:.\..\.:"
160 INPUT R
170 IF R<>C THEN PRINT AT 16,10*C-9;"% % % % % % % % % "
180 IF R=C THEN PRINT AT 16,10*C-9;"*********"
185 PRINT AT 13,P(C);W$(C)
190 PAUSE 250
195 CLS
200 GOTO 30
500 PRINT AT 3,X-3;"\..\..\..\..";AT 4,X-3;"\: \ . \ :";AT 5,X-3;"\: \':\' \ '\''\':";AT 6,X-3;"\:.\..\..\..\..\.:";AT 7,X-3;"\' \' "
501 LET P(K)=X-4
502 LET W$(K)="AMBULANCE"
510 RETURN
700 GOSUB 1700
710 PRINT AT 4,X;"\ :";AT 5,X;"\.'\. ";AT 6,X-1;"\.' \ '\. ";AT 7,X-2;"\.' \ '\. "
711 LET P(K)=X-1
712 LET W$(K)="BOY"
720 RETURN
900 PRINT AT 5,X-3;"\ :% % % ";AT 6,X-3;"\ :% % % % % ";AT 7,X-2;"\' \ '"
901 LET P(K)=X-1
902 LET W$(K)="CAR"
910 RETURN
1100 PRINT AT 1,X-4;"\ . \:.\. ";AT 2,X-3;"\'. % \. ";AT 3,X-2;"% % % ";AT 4,X-2;"\:'\''\':";AT 5,X-2;"\: \ :"
1101 LET P(K)=X-1
1102 LET W$(K)="DOG"
1110 RETURN
1300 PRINT AT 1,X-4;"\ .% % % \..";AT 2,X-4;"% % % % \.:";AT 3,X-4;"\':% % \:'\ '\..\' ";AT 4,X-4;"\ : \: "
1301 LET P(K)=X-4
1302 LET W$(K)="ELEPHANT"
1310 RETURN
1500 PRINT AT 1,X-4;"\ . \ .\..";AT 2,X-4;"\ :\:.\.:% % \':\. ";AT 3,X-4;"\ :% % % % % \. ";AT 4,X-4;"\ :\' \ '\':\:'\' "
1501 LET P(K)=X-2
1502 LET W$(K)="FISH"
1510 RETURN
1700 PRINT AT 0,X;"% \: ";AT 1,X;"\':\' ";AT 2,X-1;"\ .\':\'.";AT 3,X-1;"\' \ : \' "
1710 IF L(K)=1 THEN RETURN
1720 PRINT AT 4,X;"\.:\. ";AT 5,X-1;"\.:% % \. ";AT 6,X-2;"\ '\:'\''\''\:'";AT 7,X-1;"\: \: "
1721 LET P(K)=X-2
1722 LET W$(K)="GIRL"
1730 RETURN
1900 PRINT AT 1,X-2;">\ .\..\..\. <";AT 2,X-1;"\.:% % \:.";AT 3,X-1;"\ :..\: ";AT 4,X-1;"\ : \: ";AT 5,X-1;"\ :\ '\' \: ";AT 6,X;"\''\''"
1901 FOR F=1 TO 2
1902 PRINT AT 1,X-1;" ";AT 2,X-1;"\ .\..\..\. "
1903 LET E=USR 16514
1904 PRINT AT 1,X-1;"\ .\..\..\. ";AT 2,X-1;"\.:% % \:."
1905 LET E=USR 16514
1906 NEXT F
1907 LET P(K)=X-1
1908 LET W$(K)="HAT"
1910 RETURN
2100 PRINT AT 1,X-1;"\ :";AT 2,X-1;"\ :";AT 3,X-2;"\ .\''\''\''\. ";AT 4,X-2;"\ :\~~\~~\~~\: ";AT 5,X-2;"\ :\ ' \' \: ";AT 6,X-2;"\ :\ .\..\. \: ";AT 7,X-2;"\ '\..\..\..\' "
2101 LET P(K)=X-3
2102 LET W$(K)="INDIAN"
2110 RETURN
2300 PRINT AT 1,X-3;"---\:.";AT 2,X-3;"\':\..\..\.:\:.\..";AT 3,X-3;"\ :\..\..\..\..\..% >";AT 4,X-3;"---\ .\:'";AT 5,X-3;"---\:'"
2301 LET P(K)=X-1
2302 LET W$(K)="JET"
2310 RETURN
2500 LET P(K)=X-2
2522 LET W$(K)="KING"
2523 PRINT AT 1,X-2;"\. \. \. \. \. ";AT 2,X-2;"\':\''\''\':\' ";AT 3,X-2;"\ :\ '\ '\ :";AT 4,X-2;"\ : \' \ :";AT 5,X-2;"\ :\ '\''\ :";AT 6,X-1;"\':% \' "
2530 RETURN
2700 PRINT AT 2,X-3;"A B C D";AT 3,X-2;"E F G"
2701 LET P(K)=X-4
2702 LET W$(K)="LETTERS"
2710 RETURN
2900 PRINT AT 1,X;"% \: ";AT 2,X;"\':\' ";AT 3,X-1;"% % % \: ";AT 4,X-1;"\: % \: \: ";AT 5,X-1;"\' % \: \' "
2910 IF L(K)=22 THEN RETURN
2920 PRINT AT 6,X-1;"\ :% % ";AT 7,X-1;"\ :\: % ";AT 8,X-1;"\ :\: % "
2921 LET P(K)=X-1
2922 LET W$(K)="MAN"
2930 RETURN
3100 PRINT AT 3,X-3;"1 2 3 4";AT 4,X-2;"5 6 7"
3101 LET P(K)=X-3
3102 LET W$(K)="NUMBERS"
3110 RETURN
3300 PRINT AT 1,X-4;"\. ";AT 2,X-4;"\ '\'. \.:\. \..\. ";AT 3,X-2;"\':% % \''";AT 4,X-4;"\ .\.'\':% % \.. \.'";AT 5,X-4;"\' \ .\.'\.'\.'\. \''";AT 6,X-4;"\ .\' \ .\' \'.\ '\'.";AT 7,X-4;"\' \ .\' \ '\. "
3301 LET P(K)=X-3
3302 LET W$(K)="OCTOPUS"
3310 RETURN
3500 PRINT AT 5,X-2;"\..\..\..\..% ";AT 4,X+2;"*";AT 3,X+2;"*"
3501 LET P(K)=X-1
3502 LET W$(K)="PIPE"
3510 RETURN
3700 GOSUB 2500
3710 FOR Y=38 TO 29 STEP -1
3720 PLOT 2*X-4,Y
3730 PLOT 2*X+4,Y
3740 NEXT Y
3751 LET P(K)=X-2
3752 LET W$(K)="QUEEN"
3760 RETURN
3900 PRINT AT 1,X;"A";AT 2,X;"% ";AT 3,X;"% ";AT 4,X;"% ";AT 5,X;"% ";AT 6,X-1;"\..% \..";AT 7,X-1;"\' *\ '";AT 8,X;"*"
3901 LET P(K)=X-3
3902 LET W$(K)="ROCKET"
3910 RETURN
4100 PRINT AT 1,X-1;"\..\..\..";AT 2,X-2;"\ :\ . \. \: ";AT 3,X-2;"\ : \: ";AT 4,X-3;">\ :\ . \. \: <";AT 5,X-2;"\ : \'' \: ";AT 6,X-1;"\''\''\''"
4101 FOR F=1 TO 2
4102 PRINT AT 4,X-1;" ";AT 5,X-1;"\ '\''\' "
4103 LET E=USR 16514
4104 PRINT AT 4,X-1;"\ . \. ";AT 5,X-1;" \'' "
4105 LET E=USR 16514
4106 NEXT F
4107 LET P(K)=X-2
4108 LET W$(K)="SMILE"
4110 RETURN
4300 PRINT AT 1,X-1;"\ .% \. ";AT 2,X-2;"\ .% % % \. ";AT 3,X-2;"% % % % % ";AT 4,X-2;"\ '% % % \' ";AT 5,X-1;"\ '% \' ";AT 6,X;"% ";AT 7,X-1;"\ .% \. "
4301 LET P(K)=X-2
4302 LET W$(K)="TREE"
4310 RETURN
4500 PRINT AT 1,X;"\.:\. ";AT 2,X-1;"\.'\ :\ '\. ";AT 3,X;"\ :";AT 4,X;"\ :"
4501 LET P(K)=X-1
4502 LET W$(K)="UP"
4510 RETURN
4700 PRINT AT 2,X-2;"\ .\. \..";AT 3,X-2;"% % \. \.:% \: ";AT 4,X-2;"\':% % % % \' ";AT 5,X-1;"\':% % \' ";AT 6,X;"\':\' "
4701 LET P(K)=X-4
4702 LET W$(K)="VALENTINE"
4710 RETURN
4900 GOSUB 2900
4910 PRINT AT 6,X-1;"\.:% % \. ";AT 7,X-2;"\.:% % % % \. ";AT 8,X-1;"\ :\: % "
4911 LET P(K)=X-2
4912 LET W$(K)="WOMAN"
4920 RETURN
5100 PRINT AT 1,X-3;"\: \: \: \: \: \: \: ";AT 2,X-3;"\: \: \: \: \: \' ";AT 3,X-3;"\: \: \: \' \. ";AT 4,X-3;"\: \' \. /";AT 5,X-1;"/"
5101 LET P(K)=X-4
5102 LET W$(K)="XYLOPHONE"
5110 RETURN
5300 PRINT AT 1,X-1;"\ .% \. ";AT 2,X-1;"% % \':";AT 3,X-1;"% % % \. <";AT 4,X-1;"% % \''<";AT 5,X-1;"% % \.. <";AT 6,X-1;"\ :% "
5301 LET P(K)=X-1
5302 LET W$(K)="YELL"
5310 RETURN
5500 PRINT AT 3,X-2;"\.'\. \.'";AT 4,X-3;"\ ' \ '\. \.'\.'";AT 5,X;"\ '"
5501 LET P(K)=X-3
5502 LET W$(K)="ZIGZAG"
5510 RETURN
1 REM \06\01\C5\06\64\00\10\FD\C1\10\F7\C9\2E\2E\2E\2E\2E\2E\2E\2E\2E\2E\2E
2 SAVE "VOWE%L"
12 PRINT AT 8,11;"VOWELTUTOR";AT 10,2;"COPYRIGHT 1982 LOU GOLDSTEIN";AT 12,7;"% %F%R%O%M% %S%O%F%T%S%Y%N%C% %I%N%C% "
13 PRINT AT 20,5;"PRESS ""ENTER"" TO START"
14 PAUSE 33000
15 RAND
16 LET V$="AEIOU"
17 CLS
18 DIM P(3)
19 DIM W$(3,10)
20 DIM L(5)
23 PRINT AT 6,0;"WHICH VOWELS DO YOU WANT TO USE?1=LONG",,"2=SHORT",,"3=BOTH",,"4=EXIT PROGRAM"
24 INPUT O
25 LET LS=O
26 CLS
27 IF O=4 THEN STOP
30 IF O=3 THEN LET LS=INT (RND*2)+1
31 FOR K=1 TO 3
32 FAST
40 LET L(K)=INT (RND*5)+1
50 NEXT K
60 IF L(1)=L(2) OR L(1)=L(3) OR L(2)=L(3) THEN GOTO 31
80 LET C=INT (RND*3)+1
90 LET A$=V$(L(C))
99 SLOW
100 FOR K=1 TO 3
105 LET Z=INT (RND*3)
110 LET X=10*K-5
120 GOSUB 700*LS+100*L(K)+30*Z
121 PRINT AT 10,P(K);W$(K)
130 PRINT AT 15,X;K
140 NEXT K
150 PRINT AT 19,14;"\:'\''\':";AT 20,14;"\: ";A$;"\ :";AT 21,14;"\:.\..\.:"
151 FOR J=1 TO 10
152 IF W$(C,J)="% " THEN GOTO 155
153 NEXT J
155 LET W$(C,J)=A$
156 INPUT R
157 IF R=9 THEN CLS
160 IF R=9 THEN GOTO 23
170 IF R<>C THEN PRINT AT 16,10*C-9;"% % % % % % % % % "
180 IF R=C THEN PRINT AT 16,10*C-9;"*********"
185 PRINT AT 13,P(C);W$(C)
190 PAUSE 250
195 CLS
200 GOTO 30
800 LET W$(K)="TR% IN"
801 LET P(K)=X-2
802 PRINT AT 2,X-1;"*";AT 3,X;"*";AT 4,X;"\ :\..\. ";AT 5,X-4;"\ :% \.:% \.:% % >";AT 6,X-4;"\ '\ '\ '\ '\ ' \ '"
803 RETURN
830 LET W$(K)="C% NE"
831 LET P(K)=X-1
832 PRINT AT 1,X+1;"\' ";AT 0,X-1;"\ .\''\. "
833 FOR Y=41 TO 30 STEP -1
834 PLOT 2*X-1,Y
835 NEXT Y
836 RETURN
860 LET W$(K)="D% YS"
861 LET P(K)=X-2
862 PRINT AT 2,X-1;"FRI.";AT 4,X-1;"SAT.";AT 6,X-1;"SUN."
863 RETURN
900 LET W$(K)="K% Y"
901 LET P(K)=X-1
902 PRINT AT 3,X-3;"% % ";AT 4,X-3;"% % \:'\''\':% % \' ";AT 5,X-3;"% % \ '\ :\ '"
903 RETURN
930 LET W$(K)="THR% E"
931 LET P(K)=X-2
932 PRINT AT 3,X-1;"\''\''\: ";AT 4,X+1;"\: ";AT 5,X-1;"\ '\''\: ";AT 6,X+1;"\: ";AT 7,X-1;"\''\''\' "
933 RETURN
960 LET W$(K)="KN% E"
961 LET P(K)=X-2
962 PRINT AT 0,X+1;"% \: ";AT 1,X+1;"\':\' ";AT 2,X+1;"\: ";AT 3,X;"\ :\ '\..\. ";AT 4,X;"\: ";AT 5,X-1;"\ :\ '\. ";AT 6,X-1;"\ : \ '\. <";AT 7,X-2;"\ .\' \: ";AT 8,X-2;"\'. \''"
968 RETURN
1000 LET W$(K)="F% VE"
1001 LET P(K)=X-2
1002 PRINT AT 2,X-1;"\:'\''\' ";AT 3,X-1;"\:.\. ";AT 4,X;"\ '\. ";AT 5,X-1;"\. \ .\' ";AT 6,X-1;"\ '\' "
1003 RETURN
1030 LET W$(K)="K% TE"
1031 LET P(K)=X-2
1032 PRINT AT 0,X;"\.:\. ";AT 1,X-1;"\ .\':\'.";AT 2,X-1;"\.:\.:\.:\. ";AT 3,X-1;"\ :\ :\ :";AT 4,X;"% \: ";AT 5,X;"\ :";AT 6,X+1;"\'.";AT 7,X+1;"\.'";AT 8,X+1;"\ '"
1033 RETURN
1060 LET W$(K)="N% NE"
1061 LET P(K)=X-2
1063 PRINT AT 2,X-1;"\:'\''\: ";AT 3,X-1;"\: \: ";AT 4,X-1;"\''\''\: ";AT 5,X-1;"\. \: ";AT 6,X-1;"\''\''\' "
1064 RETURN
1100 LET W$(K)="B% AT"
1101 LET P(K)=X-2
1102 PRINT AT 1,X-2;"\..\..\..\..\. ";AT 2,X-2;"\ '\. \ '\. ";AT 3,X-1;"\.' \.'";AT 4,X-2;"\ '\''\':\''\''";AT 5,X-4;"\..\..\..\..\.:\..\..\..>";AT 6,X-4;"\':% % % % % \:'";AT 7,X-3;"\''\''\''\''\''"
1103 RETURN
1130 LET W$(K)="THR% W"
1131 LET P(K)=X-2
1132 PRINT AT 2,X+2;">";AT 3,X-2;"\ :% >\ '";AT 4,X-2;"\ '\:' \.'";AT 5,X-3;"\ .\''\:'\''";AT 6,X-3;"\' \: ";AT 7,X-2;"\.'\ '\. ";AT 8,X-3;"\ ' \ '"
1133 RETURN
1160 LET W$(K)="N% SE"
1161 LET P(K)=X-2
1162 PRINT AT 1,X-1;"\ .% \. ";AT 2,X-1;"% \:.\:.";AT 3,X-1;"% % \' ";AT 4,X-1;"\':\:'\' "
1163 FOR G=1 TO 3
1164 PRINT AT 2,1+X;"\: "
1165 LET U=USR 16514
1166 PRINT AT 2,X+1;"\:."
1167 LET U=USR 16514
1168 NEXT G
1169 RETURN
1200 LET W$(K)="% NITED"
1201 LET P(K)=X-3
1202 PRINT AT 1,X-3;"\..\..\..\..\..\. \.:";AT 2,X-4;"\ .% % % % % % \.:% ";AT 3,X-4;"\ :AMERICA\: ";AT 4,X-4;"\ '% % % % % % % \: ";AT 5,X-3;"\''\''% % % % % \: ";AT 6,X;"\':\:' \: ";AT 7,X+1;"\' "
1203 PRINT AT 11,P(K);"STATES"
1204 RETURN
1230 LET W$(K)="F% EL"
1231 LET P(K)=X-2
1232 PRINT AT 1,X-4;"\##\##\##";AT 2,X-4;"\##%G\##";AT 3,X-4;"\##%A\##";AT 4,X-4;"\##%S\##\'. \:'\''\':";AT 5,X-4;"\##\##\##\ '\..\:.\..\.:";AT 6,X-4;"\##\##\## % % % ";AT 7,X-4;"\##\##\## \: \ :"
1233 RETURN
1260 LET W$(K)="T% BE"
1261 LET P(K)=X-2
1262 PRINT AT 2,X-4;"\ .\..\..\..\..\..\..\..\. ";AT 3,X-4;"\ :\##TOOTH\##\:.";AT 4,X-4;"\ :\##PASTE\##\:'";AT 5,X-4;"\ '\''\''\''\''\''\''\''\' "
1263 RETURN
1500 LET W$(K)="FL% G"
1501 LET P(K)=X-2
1503 LET B=X-4
1504 PRINT AT 0,B;"\ .\..\..\..\..\..\..\..";AT 1,B;"\ :***\:'\''\''\':";AT 2,B;"\ :***\:'\''\''\':";AT 3,B;"\ :\''\''\''\''\''\''\':";AT 4,B;"\ :\''\''\''\''\''\''\':";AT 5,B;"\ :\''\''\''\''\''\''\''";AT 6,B;"\ :"
1505 RETURN
1530 LET W$(K)="% DD"
1531 LET P(K)=X-1
1532 PRINT AT 1,X-2;"3+2=\##";AT 3,X;"75";AT 4,X-1;"+23";AT 5,X-1;"\''\''\''"
1533 RETURN
1560 LET W$(K)="P% N"
1561 LET P(K)=X-1
1562 PRINT AT 3,X-3;"\..\..\..\..";AT 4,X-4;"\ :\' \ '\:.\..\..\..";AT 5,X-4;"\ :\:.\..\..\.:\: ";AT 6,X-4;"\ '% % % % \' "
1563 RETURN
1600 LET W$(K)="T% N"
1601 LET P(K)=X-1
1602 LET B=X-2
1603 PRINT AT 2,B;"\ : \:'\''\':";AT 3,B;"\ : \: \ :";AT 4,B;"\ : \: \ :";AT 5,B;"\ : \:.\..\.:"
1604 RETURN
1630 LET W$(K)="DR% SS"
1631 LET P(K)=X-2
1632 PRINT AT 1,X-2;"\.:\:.\.:\:.";AT 2,X-3;"\ '\:'% % \':\' ";AT 3,X-2;"\ .% % \. ";AT 4,X-3;"\ .% % % % \. ";AT 5,X-4;"\ .% % % % % % \. "
1633 RETURN
1660 LET W$(K)="L% G"
1661 LET P(K)=X-1
1662 LET B=X-1
1663 PRINT AT 0,X;"% \: ";AT 1,X;"\':\' ";AT 2,B;"% % % \: ";AT 3,B;"\: % \: \: ";AT 4,B;"\' % \: \' ";AT 5,B;"\ :% % ";AT 6,B;"\ :\: \##<";AT 7,B;"\ :\: \##<"
1664 RETURN
1700 LET W$(K)="S% X"
1701 LET P(K)=X-1
1702 LET B=X-1
1703 PRINT AT 1,X;"\..";AT 2,B;"\.' \' ";AT 3,B;"\: ";AT 4,B;"\:.\''\'.";AT 5,B;"\: \ :";AT 6,B;"\ '\..\' "
1704 RETURN
1730 LET W$(K)="SH% P"
1731 LET P(K)=X-2
1732 PRINT AT 3,X-3;"\..\:.\:.\. ";AT 4,X-5;"\ .\..% \:'% \:'% \:'% \:'";AT 5,X-4;"\':\:.% \:.% \:.% \:'";AT 6,X-5;"\@@\@@\@@\@@\@@\@@\@@\@@\@@\@@"
1733 RETURN
1760 LET W$(K)="WR% ST"
1761 LET P(K)=X-2
1762 LET B=X-1
1763 PRINT AT 0,B;"\..\..\..";AT 1,B;"\:'% \':";AT 2,B;"% \''% ";AT 3,B;"\''% \''"
1764 LET B=X-2
1765 PRINT AT 4,B;"% % % % % ";AT 5,B;"% \ :% \: % ";AT 6,B-1;">\##\ :% \: \##<";AT 7,B;"W W"
1766 RETURN
1800 LET W$(K)="P% T"
1801 LET P(K)=X-1
1802 PRINT AT 1,X-2;"\..";AT 2,X-4;"\ .\'' \''\. ";AT 3,X-4;"\:. \.:\..\..\..";AT 4,X-4;"% % \..% % ";AT 5,X-4;"\':% % % \:'";AT 6,X-3;"\ '\''\' "
1803 RETURN
1830 LET W$(K)="CL% CK"
1831 LET P(K)=X-3
1832 PRINT AT 1,X;"\..\. ";AT 2,X-2;"\ .\''\ .\ '\'.";AT 3,X-2;"\: \ : \: ";AT 4,X-3;"\ : \ :\..\. \ :";AT 5,X-3;"\ '\. \.'";AT 6,X-2;"\'. \ .\' ";AT 7,X-1;"\''\..\.'\' "
1833 RETURN
1860 LET W$(K)="ST% P"
1861 LET P(K)=X-2
1862 PRINT AT 0,X-2;"\ .% % \. ";AT 1,X-3;"\ .% % % % \. ";AT 2,X-3;"% ST P% ";AT 3,X-3;"% % % % % % ";AT 4,X-3;"\ '% % % % \' ";AT 5,X-2;"\ '% % \' ";AT 6,X-1;"\ :\: ";AT 7,X-1;"\ :\: "
1863 RETURN
1900 LET W$(K)="G% N"
1901 LET P(K)=X-1
1902 LET B=X-4
1903 PRINT AT 2,B;"\ :% % % % % -->";AT 3,B;"\ :\: \: \:'\''";AT 4,B;"\ :\:.\..\: ";AT 5,B;"\ :\: "
1904 RETURN
1930 LET W$(K)="DR% M"
1931 LET P(K)=X-2
1932 PRINT AT 0,X+2;"/";AT 1,X-1;"\.. \ ' /";AT 2,X-3;"\ .\'' \''\. \ '";AT 3,X-3;"\:. \.:";AT 4,X-3;"% % \..% % ";AT 5,X-3;"\':% % % \:'";AT 6,X-2;"\ '\''\' "
1933 RETURN
1960 LET W$(K)="B% S"
1961 LET P(K)=X-1
1962 LET B=X-3
1963 PRINT AT 2,B;"% \''\:'\':\''% % ";AT 3,B;"% \..\:.\.:\..% \ :% ";AT 4,B;"% % % % % % \.:% ";AT 5,B+1;"\' \ '"
1964 RETURN
Note: Type-in program listings on this website use ZMAKEBAS notation for graphics characters.
People
E
Skip to content
Computer Tutor
Products: Computer Tutors: Alpha/Vowel Tutors
Developer(s): Lou Goldstein
Date: 1982
Type: Cassette
Platform(s): TS 1000
Tags: Education
AlphaTutor and VowelTutor are a paired set of educational programs designed to teach children letter recognition and vowel sounds through a picture-matching quiz format. Each round randomly selects three images drawn entirely in block graphics, displays them with numbered labels, and prompts the child to identify which picture matches a highlighted letter or vowel shown in a bordered box. The programs use computed GOSUB targets (e.g., `GOSUB 200*L(K)+500` and `GOSUB 700*LS+100*L(K)+30*Z`) to dispatch to one of 26 picture-drawing subroutines covering letters A–Z and multiple vowel-sound variants. VowelTutor extends the concept with separate long and short vowel word sets per letter, selected by a random or user-chosen mode flag, and includes an animated nose-sniffing and hat/smile flip routine via `USR 16514`, pointing to a small machine-code delay loop stored in the REM statement at line 1.
Program Analysis
This listing contains two related programs: AlphaTutor and VowelTutor, both credited to Lou Goldstein / SoftSync Inc., 1982. AlphaTutor covers all 26 letters of the alphabet; VowelTutor extends the concept to long and short vowel sounds, offering multiple word variants per vowel. Both share the same core quiz loop and picture-rendering architecture.
Program Structure
Both programs follow the same top-level flow:
- Title/splash screen (lines 12–14), then
RAND to seed the RNG.
- Initialise arrays
P(3), W$(3,10), L(3) (lines 18–20).
- Main loop (lines 30–200): pick three distinct random indices, choose one as the target, dispatch to a drawing subroutine for each, display a letter/vowel prompt box, read a numeric answer, give feedback, pause, clear and repeat.
- Drawing subroutines: one per picture subject, each printing block-graphic art, setting
P(K) (label column) and W$(K) (word string).
VowelTutor adds a mode-selection screen (lines 23–27) offering long vowels, short vowels, or both, stored in LS, and allows the user to return to mode selection by entering 9.
Computed GOSUB Dispatch
The most architecturally notable feature is the use of arithmetic expressions as GOSUB targets to select picture subroutines without IF/THEN chains:
- AlphaTutor:
GOSUB 200*L(K)+500 — with L(K) in 0–25, this generates targets 500 (A=ambulance), 700 (B=boy), 900 (C=car) … 5500 (Z=zigzag), spaced 200 apart.
- VowelTutor:
GOSUB 700*LS+100*L(K)+30*Z — the LS factor (1=long, 2=short) shifts into a separate bank of subroutines; L(K) selects the vowel (1–5 = A/E/I/O/U); Z (0–2) selects one of up to three word variants per vowel per length.
This is a compact and efficient dispatch mechanism that avoids long IF/THEN chains entirely, at the cost of requiring subroutines to be placed at exactly the computed line numbers.
Machine Code Usage
Line 1 in both programs is a REM statement whose body encodes a short Z80 machine-code routine. The sequence \06\01\C5\06\64\00\10\FD\C1\10\F7\C9 disassembles as:
LD B,1 — outer loop count
PUSH BC
LD B,100 ; LD C,0 — inner delay count (25600 iterations)
DJNZ $ — inner loop
POP BC ; DJNZ … — outer loop
RET
This routine is called via LET E=USR 16514 (the address of the REM body in the VowelTutor variant is slightly longer, hence a different offset in practice). It is used as a simple software delay in animation sequences — for example, the hat flip in AlphaTutor (lines 1901–1906), the smile animation (lines 4101–4106), and the nose-sniffing effect (lines 1163–1168 in VowelTutor).
Key BASIC Idioms
- Block graphic art: All pictures are rendered using the ZX81/TS1000 block graphic characters (2×2 pixel sub-characters), encoded here as zmakebas escape sequences such as
\ ., \:., \'', etc.
- Distinct random selection: Lines 60 check
L(1)=L(2) OR L(1)=L(3) OR L(2)=L(3) and loop back if any two indices collide, ensuring three distinct pictures appear each round.
- Column positioning via formula:
LET X=10*K-5 (line 110) distributes the three picture columns evenly across the 32-character screen (columns 5, 15, 25).
- Answer box: The target letter is displayed in a bordered box drawn with block graphics at lines 19–21 using
AT positioning.
- PLOT for QUEEN and CONE: The subroutines at lines 3700 and 830 use
PLOT with pixel coordinates to draw vertical lines, since the block graphic resolution is insufficient for narrow strokes.
VowelTutor Word-Embedding Technique
In VowelTutor, word labels use a space character as a placeholder for the missing vowel (e.g., "TR% IN" for TRAIN, "K% TE" for KITE). After the round is set up, lines 151–155 scan W$(C) character-by-character to find the first "% " (space) position, then replace it with the actual vowel character A$ — effectively filling in the blank dynamically. This lets the same word string serve as both a gapped display and, after substitution, the correct spelled form.
Notable Subroutine Sharing
AlphaTutor’s GIRL subroutine (line 1700) is shared with BOY (line 700): the BOY subroutine calls GOSUB 1700 to draw the upper body, then the shared routine checks IF L(K)=1 THEN RETURN (line 1710) to exit early for BOY, or continues to draw the skirt/legs for GIRL. Similarly, VowelTutor’s WOMAN subroutine (line 4900) reuses the MAN subroutine (line 2900) for the head and torso, then overprints with different lower-body graphics.
Array Sizing
Array Dimensions Purpose P(3)3 elements Column position for each picture’s word label W$(3,10)3 strings × 10 chars Word associated with each picture slot L(3) / L(5)3 (Alpha) / 5 (Vowel) Random index for picture selection
Potential Anomalies
- AlphaTutor has no subroutine at the computed target for letter index 0 (line 500 handles A=0, as
200*0+500=500) — this is correct; L(K)=INT(RND*26) yields 0–25, mapping to lines 500–5500.
- VowelTutor’s
GOSUB 700*LS+100*L(K)+30*Z for LS=2 (short vowels) can yield targets like 1400+30*Z (lines 1400, 1430, 1460) which are not all defined in the listing — some short-vowel variant slots appear absent, which would cause a BASIC error if selected. This may reflect incomplete subroutine coverage in the original listing.
- The
PAUSE 33000 at line 14 provides a long title-screen pause (~30 seconds at normal speed) but any key press does not skip it — the user must wait it out unless they press BREAK.
- In VowelTutor, the
\## sequences in several subroutines (e.g., lines 1232, 1262, 1532) are not standard zmakebas escape sequences and likely represent inverse-video block characters or UDGs in the original tape file that were not fully decoded in this transcription.
Content
Source Code
1 REM \06\01\C5\06\64\00\10\FD\C1\10\F7\C9\2E\2E\2E\2E\2E\2E
2 SAVE "AB%C"
12 PRINT AT 8,11;"ALPHATUTOR";AT 10,2;"COPYRIGHT 1982 LOU GOLDSTEIN";AT 12,6;"% %F%R%O%M% %S%O%F%T%S%Y%N%C% %I%N%C% "
13 PRINT AT 20,5;"PRESS ""ENTER"" TO START"
14 PAUSE 33000
15 RAND
17 CLS
18 DIM P(3)
19 DIM W$(3,10)
20 DIM L(3)
30 FOR K=1 TO 3
40 LET L(K)=INT (RND*26)
50 NEXT K
60 IF L(1)=L(2) OR L(1)=L(3) OR L(2)=L(3) THEN GOTO 30
80 LET C=INT (RND*3)+1
90 LET A$=CHR$ (L(C)+38)
100 FOR K=1 TO 3
110 LET X=10*K-5
120 GOSUB 200*L(K)+500
121 PRINT AT 10,P(K);"% ";W$(K,2 TO )
130 PRINT AT 15,X;K
140 NEXT K
150 PRINT AT 19,14;"\:'\''\':";AT 20,14;"\: ";A$;"\ :";AT 21,14;"\:.\..\.:"
160 INPUT R
170 IF R<>C THEN PRINT AT 16,10*C-9;"% % % % % % % % % "
180 IF R=C THEN PRINT AT 16,10*C-9;"*********"
185 PRINT AT 13,P(C);W$(C)
190 PAUSE 250
195 CLS
200 GOTO 30
500 PRINT AT 3,X-3;"\..\..\..\..";AT 4,X-3;"\: \ . \ :";AT 5,X-3;"\: \':\' \ '\''\':";AT 6,X-3;"\:.\..\..\..\..\.:";AT 7,X-3;"\' \' "
501 LET P(K)=X-4
502 LET W$(K)="AMBULANCE"
510 RETURN
700 GOSUB 1700
710 PRINT AT 4,X;"\ :";AT 5,X;"\.'\. ";AT 6,X-1;"\.' \ '\. ";AT 7,X-2;"\.' \ '\. "
711 LET P(K)=X-1
712 LET W$(K)="BOY"
720 RETURN
900 PRINT AT 5,X-3;"\ :% % % ";AT 6,X-3;"\ :% % % % % ";AT 7,X-2;"\' \ '"
901 LET P(K)=X-1
902 LET W$(K)="CAR"
910 RETURN
1100 PRINT AT 1,X-4;"\ . \:.\. ";AT 2,X-3;"\'. % \. ";AT 3,X-2;"% % % ";AT 4,X-2;"\:'\''\':";AT 5,X-2;"\: \ :"
1101 LET P(K)=X-1
1102 LET W$(K)="DOG"
1110 RETURN
1300 PRINT AT 1,X-4;"\ .% % % \..";AT 2,X-4;"% % % % \.:";AT 3,X-4;"\':% % \:'\ '\..\' ";AT 4,X-4;"\ : \: "
1301 LET P(K)=X-4
1302 LET W$(K)="ELEPHANT"
1310 RETURN
1500 PRINT AT 1,X-4;"\ . \ .\..";AT 2,X-4;"\ :\:.\.:% % \':\. ";AT 3,X-4;"\ :% % % % % \. ";AT 4,X-4;"\ :\' \ '\':\:'\' "
1501 LET P(K)=X-2
1502 LET W$(K)="FISH"
1510 RETURN
1700 PRINT AT 0,X;"% \: ";AT 1,X;"\':\' ";AT 2,X-1;"\ .\':\'.";AT 3,X-1;"\' \ : \' "
1710 IF L(K)=1 THEN RETURN
1720 PRINT AT 4,X;"\.:\. ";AT 5,X-1;"\.:% % \. ";AT 6,X-2;"\ '\:'\''\''\:'";AT 7,X-1;"\: \: "
1721 LET P(K)=X-2
1722 LET W$(K)="GIRL"
1730 RETURN
1900 PRINT AT 1,X-2;">\ .\..\..\. <";AT 2,X-1;"\.:% % \:.";AT 3,X-1;"\ :..\: ";AT 4,X-1;"\ : \: ";AT 5,X-1;"\ :\ '\' \: ";AT 6,X;"\''\''"
1901 FOR F=1 TO 2
1902 PRINT AT 1,X-1;" ";AT 2,X-1;"\ .\..\..\. "
1903 LET E=USR 16514
1904 PRINT AT 1,X-1;"\ .\..\..\. ";AT 2,X-1;"\.:% % \:."
1905 LET E=USR 16514
1906 NEXT F
1907 LET P(K)=X-1
1908 LET W$(K)="HAT"
1910 RETURN
2100 PRINT AT 1,X-1;"\ :";AT 2,X-1;"\ :";AT 3,X-2;"\ .\''\''\''\. ";AT 4,X-2;"\ :\~~\~~\~~\: ";AT 5,X-2;"\ :\ ' \' \: ";AT 6,X-2;"\ :\ .\..\. \: ";AT 7,X-2;"\ '\..\..\..\' "
2101 LET P(K)=X-3
2102 LET W$(K)="INDIAN"
2110 RETURN
2300 PRINT AT 1,X-3;"---\:.";AT 2,X-3;"\':\..\..\.:\:.\..";AT 3,X-3;"\ :\..\..\..\..\..% >";AT 4,X-3;"---\ .\:'";AT 5,X-3;"---\:'"
2301 LET P(K)=X-1
2302 LET W$(K)="JET"
2310 RETURN
2500 LET P(K)=X-2
2522 LET W$(K)="KING"
2523 PRINT AT 1,X-2;"\. \. \. \. \. ";AT 2,X-2;"\':\''\''\':\' ";AT 3,X-2;"\ :\ '\ '\ :";AT 4,X-2;"\ : \' \ :";AT 5,X-2;"\ :\ '\''\ :";AT 6,X-1;"\':% \' "
2530 RETURN
2700 PRINT AT 2,X-3;"A B C D";AT 3,X-2;"E F G"
2701 LET P(K)=X-4
2702 LET W$(K)="LETTERS"
2710 RETURN
2900 PRINT AT 1,X;"% \: ";AT 2,X;"\':\' ";AT 3,X-1;"% % % \: ";AT 4,X-1;"\: % \: \: ";AT 5,X-1;"\' % \: \' "
2910 IF L(K)=22 THEN RETURN
2920 PRINT AT 6,X-1;"\ :% % ";AT 7,X-1;"\ :\: % ";AT 8,X-1;"\ :\: % "
2921 LET P(K)=X-1
2922 LET W$(K)="MAN"
2930 RETURN
3100 PRINT AT 3,X-3;"1 2 3 4";AT 4,X-2;"5 6 7"
3101 LET P(K)=X-3
3102 LET W$(K)="NUMBERS"
3110 RETURN
3300 PRINT AT 1,X-4;"\. ";AT 2,X-4;"\ '\'. \.:\. \..\. ";AT 3,X-2;"\':% % \''";AT 4,X-4;"\ .\.'\':% % \.. \.'";AT 5,X-4;"\' \ .\.'\.'\.'\. \''";AT 6,X-4;"\ .\' \ .\' \'.\ '\'.";AT 7,X-4;"\' \ .\' \ '\. "
3301 LET P(K)=X-3
3302 LET W$(K)="OCTOPUS"
3310 RETURN
3500 PRINT AT 5,X-2;"\..\..\..\..% ";AT 4,X+2;"*";AT 3,X+2;"*"
3501 LET P(K)=X-1
3502 LET W$(K)="PIPE"
3510 RETURN
3700 GOSUB 2500
3710 FOR Y=38 TO 29 STEP -1
3720 PLOT 2*X-4,Y
3730 PLOT 2*X+4,Y
3740 NEXT Y
3751 LET P(K)=X-2
3752 LET W$(K)="QUEEN"
3760 RETURN
3900 PRINT AT 1,X;"A";AT 2,X;"% ";AT 3,X;"% ";AT 4,X;"% ";AT 5,X;"% ";AT 6,X-1;"\..% \..";AT 7,X-1;"\' *\ '";AT 8,X;"*"
3901 LET P(K)=X-3
3902 LET W$(K)="ROCKET"
3910 RETURN
4100 PRINT AT 1,X-1;"\..\..\..";AT 2,X-2;"\ :\ . \. \: ";AT 3,X-2;"\ : \: ";AT 4,X-3;">\ :\ . \. \: <";AT 5,X-2;"\ : \'' \: ";AT 6,X-1;"\''\''\''"
4101 FOR F=1 TO 2
4102 PRINT AT 4,X-1;" ";AT 5,X-1;"\ '\''\' "
4103 LET E=USR 16514
4104 PRINT AT 4,X-1;"\ . \. ";AT 5,X-1;" \'' "
4105 LET E=USR 16514
4106 NEXT F
4107 LET P(K)=X-2
4108 LET W$(K)="SMILE"
4110 RETURN
4300 PRINT AT 1,X-1;"\ .% \. ";AT 2,X-2;"\ .% % % \. ";AT 3,X-2;"% % % % % ";AT 4,X-2;"\ '% % % \' ";AT 5,X-1;"\ '% \' ";AT 6,X;"% ";AT 7,X-1;"\ .% \. "
4301 LET P(K)=X-2
4302 LET W$(K)="TREE"
4310 RETURN
4500 PRINT AT 1,X;"\.:\. ";AT 2,X-1;"\.'\ :\ '\. ";AT 3,X;"\ :";AT 4,X;"\ :"
4501 LET P(K)=X-1
4502 LET W$(K)="UP"
4510 RETURN
4700 PRINT AT 2,X-2;"\ .\. \..";AT 3,X-2;"% % \. \.:% \: ";AT 4,X-2;"\':% % % % \' ";AT 5,X-1;"\':% % \' ";AT 6,X;"\':\' "
4701 LET P(K)=X-4
4702 LET W$(K)="VALENTINE"
4710 RETURN
4900 GOSUB 2900
4910 PRINT AT 6,X-1;"\.:% % \. ";AT 7,X-2;"\.:% % % % \. ";AT 8,X-1;"\ :\: % "
4911 LET P(K)=X-2
4912 LET W$(K)="WOMAN"
4920 RETURN
5100 PRINT AT 1,X-3;"\: \: \: \: \: \: \: ";AT 2,X-3;"\: \: \: \: \: \' ";AT 3,X-3;"\: \: \: \' \. ";AT 4,X-3;"\: \' \. /";AT 5,X-1;"/"
5101 LET P(K)=X-4
5102 LET W$(K)="XYLOPHONE"
5110 RETURN
5300 PRINT AT 1,X-1;"\ .% \. ";AT 2,X-1;"% % \':";AT 3,X-1;"% % % \. <";AT 4,X-1;"% % \''<";AT 5,X-1;"% % \.. <";AT 6,X-1;"\ :% "
5301 LET P(K)=X-1
5302 LET W$(K)="YELL"
5310 RETURN
5500 PRINT AT 3,X-2;"\.'\. \.'";AT 4,X-3;"\ ' \ '\. \.'\.'";AT 5,X;"\ '"
5501 LET P(K)=X-3
5502 LET W$(K)="ZIGZAG"
5510 RETURN
1 REM \06\01\C5\06\64\00\10\FD\C1\10\F7\C9\2E\2E\2E\2E\2E\2E\2E\2E\2E\2E\2E
2 SAVE "VOWE%L"
12 PRINT AT 8,11;"VOWELTUTOR";AT 10,2;"COPYRIGHT 1982 LOU GOLDSTEIN";AT 12,7;"% %F%R%O%M% %S%O%F%T%S%Y%N%C% %I%N%C% "
13 PRINT AT 20,5;"PRESS ""ENTER"" TO START"
14 PAUSE 33000
15 RAND
16 LET V$="AEIOU"
17 CLS
18 DIM P(3)
19 DIM W$(3,10)
20 DIM L(5)
23 PRINT AT 6,0;"WHICH VOWELS DO YOU WANT TO USE?1=LONG",,"2=SHORT",,"3=BOTH",,"4=EXIT PROGRAM"
24 INPUT O
25 LET LS=O
26 CLS
27 IF O=4 THEN STOP
30 IF O=3 THEN LET LS=INT (RND*2)+1
31 FOR K=1 TO 3
32 FAST
40 LET L(K)=INT (RND*5)+1
50 NEXT K
60 IF L(1)=L(2) OR L(1)=L(3) OR L(2)=L(3) THEN GOTO 31
80 LET C=INT (RND*3)+1
90 LET A$=V$(L(C))
99 SLOW
100 FOR K=1 TO 3
105 LET Z=INT (RND*3)
110 LET X=10*K-5
120 GOSUB 700*LS+100*L(K)+30*Z
121 PRINT AT 10,P(K);W$(K)
130 PRINT AT 15,X;K
140 NEXT K
150 PRINT AT 19,14;"\:'\''\':";AT 20,14;"\: ";A$;"\ :";AT 21,14;"\:.\..\.:"
151 FOR J=1 TO 10
152 IF W$(C,J)="% " THEN GOTO 155
153 NEXT J
155 LET W$(C,J)=A$
156 INPUT R
157 IF R=9 THEN CLS
160 IF R=9 THEN GOTO 23
170 IF R<>C THEN PRINT AT 16,10*C-9;"% % % % % % % % % "
180 IF R=C THEN PRINT AT 16,10*C-9;"*********"
185 PRINT AT 13,P(C);W$(C)
190 PAUSE 250
195 CLS
200 GOTO 30
800 LET W$(K)="TR% IN"
801 LET P(K)=X-2
802 PRINT AT 2,X-1;"*";AT 3,X;"*";AT 4,X;"\ :\..\. ";AT 5,X-4;"\ :% \.:% \.:% % >";AT 6,X-4;"\ '\ '\ '\ '\ ' \ '"
803 RETURN
830 LET W$(K)="C% NE"
831 LET P(K)=X-1
832 PRINT AT 1,X+1;"\' ";AT 0,X-1;"\ .\''\. "
833 FOR Y=41 TO 30 STEP -1
834 PLOT 2*X-1,Y
835 NEXT Y
836 RETURN
860 LET W$(K)="D% YS"
861 LET P(K)=X-2
862 PRINT AT 2,X-1;"FRI.";AT 4,X-1;"SAT.";AT 6,X-1;"SUN."
863 RETURN
900 LET W$(K)="K% Y"
901 LET P(K)=X-1
902 PRINT AT 3,X-3;"% % ";AT 4,X-3;"% % \:'\''\':% % \' ";AT 5,X-3;"% % \ '\ :\ '"
903 RETURN
930 LET W$(K)="THR% E"
931 LET P(K)=X-2
932 PRINT AT 3,X-1;"\''\''\: ";AT 4,X+1;"\: ";AT 5,X-1;"\ '\''\: ";AT 6,X+1;"\: ";AT 7,X-1;"\''\''\' "
933 RETURN
960 LET W$(K)="KN% E"
961 LET P(K)=X-2
962 PRINT AT 0,X+1;"% \: ";AT 1,X+1;"\':\' ";AT 2,X+1;"\: ";AT 3,X;"\ :\ '\..\. ";AT 4,X;"\: ";AT 5,X-1;"\ :\ '\. ";AT 6,X-1;"\ : \ '\. <";AT 7,X-2;"\ .\' \: ";AT 8,X-2;"\'. \''"
968 RETURN
1000 LET W$(K)="F% VE"
1001 LET P(K)=X-2
1002 PRINT AT 2,X-1;"\:'\''\' ";AT 3,X-1;"\:.\. ";AT 4,X;"\ '\. ";AT 5,X-1;"\. \ .\' ";AT 6,X-1;"\ '\' "
1003 RETURN
1030 LET W$(K)="K% TE"
1031 LET P(K)=X-2
1032 PRINT AT 0,X;"\.:\. ";AT 1,X-1;"\ .\':\'.";AT 2,X-1;"\.:\.:\.:\. ";AT 3,X-1;"\ :\ :\ :";AT 4,X;"% \: ";AT 5,X;"\ :";AT 6,X+1;"\'.";AT 7,X+1;"\.'";AT 8,X+1;"\ '"
1033 RETURN
1060 LET W$(K)="N% NE"
1061 LET P(K)=X-2
1063 PRINT AT 2,X-1;"\:'\''\: ";AT 3,X-1;"\: \: ";AT 4,X-1;"\''\''\: ";AT 5,X-1;"\. \: ";AT 6,X-1;"\''\''\' "
1064 RETURN
1100 LET W$(K)="B% AT"
1101 LET P(K)=X-2
1102 PRINT AT 1,X-2;"\..\..\..\..\. ";AT 2,X-2;"\ '\. \ '\. ";AT 3,X-1;"\.' \.'";AT 4,X-2;"\ '\''\':\''\''";AT 5,X-4;"\..\..\..\..\.:\..\..\..>";AT 6,X-4;"\':% % % % % \:'";AT 7,X-3;"\''\''\''\''\''"
1103 RETURN
1130 LET W$(K)="THR% W"
1131 LET P(K)=X-2
1132 PRINT AT 2,X+2;">";AT 3,X-2;"\ :% >\ '";AT 4,X-2;"\ '\:' \.'";AT 5,X-3;"\ .\''\:'\''";AT 6,X-3;"\' \: ";AT 7,X-2;"\.'\ '\. ";AT 8,X-3;"\ ' \ '"
1133 RETURN
1160 LET W$(K)="N% SE"
1161 LET P(K)=X-2
1162 PRINT AT 1,X-1;"\ .% \. ";AT 2,X-1;"% \:.\:.";AT 3,X-1;"% % \' ";AT 4,X-1;"\':\:'\' "
1163 FOR G=1 TO 3
1164 PRINT AT 2,1+X;"\: "
1165 LET U=USR 16514
1166 PRINT AT 2,X+1;"\:."
1167 LET U=USR 16514
1168 NEXT G
1169 RETURN
1200 LET W$(K)="% NITED"
1201 LET P(K)=X-3
1202 PRINT AT 1,X-3;"\..\..\..\..\..\. \.:";AT 2,X-4;"\ .% % % % % % \.:% ";AT 3,X-4;"\ :AMERICA\: ";AT 4,X-4;"\ '% % % % % % % \: ";AT 5,X-3;"\''\''% % % % % \: ";AT 6,X;"\':\:' \: ";AT 7,X+1;"\' "
1203 PRINT AT 11,P(K);"STATES"
1204 RETURN
1230 LET W$(K)="F% EL"
1231 LET P(K)=X-2
1232 PRINT AT 1,X-4;"\##\##\##";AT 2,X-4;"\##%G\##";AT 3,X-4;"\##%A\##";AT 4,X-4;"\##%S\##\'. \:'\''\':";AT 5,X-4;"\##\##\##\ '\..\:.\..\.:";AT 6,X-4;"\##\##\## % % % ";AT 7,X-4;"\##\##\## \: \ :"
1233 RETURN
1260 LET W$(K)="T% BE"
1261 LET P(K)=X-2
1262 PRINT AT 2,X-4;"\ .\..\..\..\..\..\..\..\. ";AT 3,X-4;"\ :\##TOOTH\##\:.";AT 4,X-4;"\ :\##PASTE\##\:'";AT 5,X-4;"\ '\''\''\''\''\''\''\''\' "
1263 RETURN
1500 LET W$(K)="FL% G"
1501 LET P(K)=X-2
1503 LET B=X-4
1504 PRINT AT 0,B;"\ .\..\..\..\..\..\..\..";AT 1,B;"\ :***\:'\''\''\':";AT 2,B;"\ :***\:'\''\''\':";AT 3,B;"\ :\''\''\''\''\''\''\':";AT 4,B;"\ :\''\''\''\''\''\''\':";AT 5,B;"\ :\''\''\''\''\''\''\''";AT 6,B;"\ :"
1505 RETURN
1530 LET W$(K)="% DD"
1531 LET P(K)=X-1
1532 PRINT AT 1,X-2;"3+2=\##";AT 3,X;"75";AT 4,X-1;"+23";AT 5,X-1;"\''\''\''"
1533 RETURN
1560 LET W$(K)="P% N"
1561 LET P(K)=X-1
1562 PRINT AT 3,X-3;"\..\..\..\..";AT 4,X-4;"\ :\' \ '\:.\..\..\..";AT 5,X-4;"\ :\:.\..\..\.:\: ";AT 6,X-4;"\ '% % % % \' "
1563 RETURN
1600 LET W$(K)="T% N"
1601 LET P(K)=X-1
1602 LET B=X-2
1603 PRINT AT 2,B;"\ : \:'\''\':";AT 3,B;"\ : \: \ :";AT 4,B;"\ : \: \ :";AT 5,B;"\ : \:.\..\.:"
1604 RETURN
1630 LET W$(K)="DR% SS"
1631 LET P(K)=X-2
1632 PRINT AT 1,X-2;"\.:\:.\.:\:.";AT 2,X-3;"\ '\:'% % \':\' ";AT 3,X-2;"\ .% % \. ";AT 4,X-3;"\ .% % % % \. ";AT 5,X-4;"\ .% % % % % % \. "
1633 RETURN
1660 LET W$(K)="L% G"
1661 LET P(K)=X-1
1662 LET B=X-1
1663 PRINT AT 0,X;"% \: ";AT 1,X;"\':\' ";AT 2,B;"% % % \: ";AT 3,B;"\: % \: \: ";AT 4,B;"\' % \: \' ";AT 5,B;"\ :% % ";AT 6,B;"\ :\: \##<";AT 7,B;"\ :\: \##<"
1664 RETURN
1700 LET W$(K)="S% X"
1701 LET P(K)=X-1
1702 LET B=X-1
1703 PRINT AT 1,X;"\..";AT 2,B;"\.' \' ";AT 3,B;"\: ";AT 4,B;"\:.\''\'.";AT 5,B;"\: \ :";AT 6,B;"\ '\..\' "
1704 RETURN
1730 LET W$(K)="SH% P"
1731 LET P(K)=X-2
1732 PRINT AT 3,X-3;"\..\:.\:.\. ";AT 4,X-5;"\ .\..% \:'% \:'% \:'% \:'";AT 5,X-4;"\':\:.% \:.% \:.% \:'";AT 6,X-5;"\@@\@@\@@\@@\@@\@@\@@\@@\@@\@@"
1733 RETURN
1760 LET W$(K)="WR% ST"
1761 LET P(K)=X-2
1762 LET B=X-1
1763 PRINT AT 0,B;"\..\..\..";AT 1,B;"\:'% \':";AT 2,B;"% \''% ";AT 3,B;"\''% \''"
1764 LET B=X-2
1765 PRINT AT 4,B;"% % % % % ";AT 5,B;"% \ :% \: % ";AT 6,B-1;">\##\ :% \: \##<";AT 7,B;"W W"
1766 RETURN
1800 LET W$(K)="P% T"
1801 LET P(K)=X-1
1802 PRINT AT 1,X-2;"\..";AT 2,X-4;"\ .\'' \''\. ";AT 3,X-4;"\:. \.:\..\..\..";AT 4,X-4;"% % \..% % ";AT 5,X-4;"\':% % % \:'";AT 6,X-3;"\ '\''\' "
1803 RETURN
1830 LET W$(K)="CL% CK"
1831 LET P(K)=X-3
1832 PRINT AT 1,X;"\..\. ";AT 2,X-2;"\ .\''\ .\ '\'.";AT 3,X-2;"\: \ : \: ";AT 4,X-3;"\ : \ :\..\. \ :";AT 5,X-3;"\ '\. \.'";AT 6,X-2;"\'. \ .\' ";AT 7,X-1;"\''\..\.'\' "
1833 RETURN
1860 LET W$(K)="ST% P"
1861 LET P(K)=X-2
1862 PRINT AT 0,X-2;"\ .% % \. ";AT 1,X-3;"\ .% % % % \. ";AT 2,X-3;"% ST P% ";AT 3,X-3;"% % % % % % ";AT 4,X-3;"\ '% % % % \' ";AT 5,X-2;"\ '% % \' ";AT 6,X-1;"\ :\: ";AT 7,X-1;"\ :\: "
1863 RETURN
1900 LET W$(K)="G% N"
1901 LET P(K)=X-1
1902 LET B=X-4
1903 PRINT AT 2,B;"\ :% % % % % -->";AT 3,B;"\ :\: \: \:'\''";AT 4,B;"\ :\:.\..\: ";AT 5,B;"\ :\: "
1904 RETURN
1930 LET W$(K)="DR% M"
1931 LET P(K)=X-2
1932 PRINT AT 0,X+2;"/";AT 1,X-1;"\.. \ ' /";AT 2,X-3;"\ .\'' \''\. \ '";AT 3,X-3;"\:. \.:";AT 4,X-3;"% % \..% % ";AT 5,X-3;"\':% % % \:'";AT 6,X-2;"\ '\''\' "
1933 RETURN
1960 LET W$(K)="B% S"
1961 LET P(K)=X-1
1962 LET B=X-3
1963 PRINT AT 2,B;"% \''\:'\':\''% % ";AT 3,B;"% \..\:.\.:\..% \ :% ";AT 4,B;"% % % % % % \.:% ";AT 5,B+1;"\' \ '"
1964 RETURN
Note: Type-in program listings on this website use ZMAKEBAS notation for graphics characters.
People
E
Skip to content
Computer Tutor
Products: Computer Tutors: Alpha/Vowel Tutors
Developer(s): Lou Goldstein
Date: 1982
Type: Cassette
Platform(s): TS 1000
Tags: Education
AlphaTutor and VowelTutor are a paired set of educational programs designed to teach children letter recognition and vowel sounds through a picture-matching quiz format. Each round randomly selects three images drawn entirely in block graphics, displays them with numbered labels, and prompts the child to identify which picture matches a highlighted letter or vowel shown in a bordered box. The programs use computed GOSUB targets (e.g., `GOSUB 200*L(K)+500` and `GOSUB 700*LS+100*L(K)+30*Z`) to dispatch to one of 26 picture-drawing subroutines covering letters A–Z and multiple vowel-sound variants. VowelTutor extends the concept with separate long and short vowel word sets per letter, selected by a random or user-chosen mode flag, and includes an animated nose-sniffing and hat/smile flip routine via `USR 16514`, pointing to a small machine-code delay loop stored in the REM statement at line 1.
Program Analysis
This listing contains two related programs: AlphaTutor and VowelTutor, both credited to Lou Goldstein / SoftSync Inc., 1982. AlphaTutor covers all 26 letters of the alphabet; VowelTutor extends the concept to long and short vowel sounds, offering multiple word variants per vowel. Both share the same core quiz loop and picture-rendering architecture.
Program Structure
Both programs follow the same top-level flow:
- Title/splash screen (lines 12–14), then
RAND to seed the RNG.
- Initialise arrays
P(3), W$(3,10), L(3) (lines 18–20).
- Main loop (lines 30–200): pick three distinct random indices, choose one as the target, dispatch to a drawing subroutine for each, display a letter/vowel prompt box, read a numeric answer, give feedback, pause, clear and repeat.
- Drawing subroutines: one per picture subject, each printing block-graphic art, setting
P(K) (label column) and W$(K) (word string).
VowelTutor adds a mode-selection screen (lines 23–27) offering long vowels, short vowels, or both, stored in LS, and allows the user to return to mode selection by entering 9.
Computed GOSUB Dispatch
The most architecturally notable feature is the use of arithmetic expressions as GOSUB targets to select picture subroutines without IF/THEN chains:
- AlphaTutor:
GOSUB 200*L(K)+500 — with L(K) in 0–25, this generates targets 500 (A=ambulance), 700 (B=boy), 900 (C=car) … 5500 (Z=zigzag), spaced 200 apart.
- VowelTutor:
GOSUB 700*LS+100*L(K)+30*Z — the LS factor (1=long, 2=short) shifts into a separate bank of subroutines; L(K) selects the vowel (1–5 = A/E/I/O/U); Z (0–2) selects one of up to three word variants per vowel per length.
This is a compact and efficient dispatch mechanism that avoids long IF/THEN chains entirely, at the cost of requiring subroutines to be placed at exactly the computed line numbers.
Machine Code Usage
Line 1 in both programs is a REM statement whose body encodes a short Z80 machine-code routine. The sequence \06\01\C5\06\64\00\10\FD\C1\10\F7\C9 disassembles as:
LD B,1 — outer loop count
PUSH BC
LD B,100 ; LD C,0 — inner delay count (25600 iterations)
DJNZ $ — inner loop
POP BC ; DJNZ … — outer loop
RET
This routine is called via LET E=USR 16514 (the address of the REM body in the VowelTutor variant is slightly longer, hence a different offset in practice). It is used as a simple software delay in animation sequences — for example, the hat flip in AlphaTutor (lines 1901–1906), the smile animation (lines 4101–4106), and the nose-sniffing effect (lines 1163–1168 in VowelTutor).
Key BASIC Idioms
- Block graphic art: All pictures are rendered using the ZX81/TS1000 block graphic characters (2×2 pixel sub-characters), encoded here as zmakebas escape sequences such as
\ ., \:., \'', etc.
- Distinct random selection: Lines 60 check
L(1)=L(2) OR L(1)=L(3) OR L(2)=L(3) and loop back if any two indices collide, ensuring three distinct pictures appear each round.
- Column positioning via formula:
LET X=10*K-5 (line 110) distributes the three picture columns evenly across the 32-character screen (columns 5, 15, 25).
- Answer box: The target letter is displayed in a bordered box drawn with block graphics at lines 19–21 using
AT positioning.
- PLOT for QUEEN and CONE: The subroutines at lines 3700 and 830 use
PLOT with pixel coordinates to draw vertical lines, since the block graphic resolution is insufficient for narrow strokes.
VowelTutor Word-Embedding Technique
In VowelTutor, word labels use a space character as a placeholder for the missing vowel (e.g., "TR% IN" for TRAIN, "K% TE" for KITE). After the round is set up, lines 151–155 scan W$(C) character-by-character to find the first "% " (space) position, then replace it with the actual vowel character A$ — effectively filling in the blank dynamically. This lets the same word string serve as both a gapped display and, after substitution, the correct spelled form.
Notable Subroutine Sharing
AlphaTutor’s GIRL subroutine (line 1700) is shared with BOY (line 700): the BOY subroutine calls GOSUB 1700 to draw the upper body, then the shared routine checks IF L(K)=1 THEN RETURN (line 1710) to exit early for BOY, or continues to draw the skirt/legs for GIRL. Similarly, VowelTutor’s WOMAN subroutine (line 4900) reuses the MAN subroutine (line 2900) for the head and torso, then overprints with different lower-body graphics.
Array Sizing
Array Dimensions Purpose P(3)3 elements Column position for each picture’s word label W$(3,10)3 strings × 10 chars Word associated with each picture slot L(3) / L(5)3 (Alpha) / 5 (Vowel) Random index for picture selection
Potential Anomalies
- AlphaTutor has no subroutine at the computed target for letter index 0 (line 500 handles A=0, as
200*0+500=500) — this is correct; L(K)=INT(RND*26) yields 0–25, mapping to lines 500–5500.
- VowelTutor’s
GOSUB 700*LS+100*L(K)+30*Z for LS=2 (short vowels) can yield targets like 1400+30*Z (lines 1400, 1430, 1460) which are not all defined in the listing — some short-vowel variant slots appear absent, which would cause a BASIC error if selected. This may reflect incomplete subroutine coverage in the original listing.
- The
PAUSE 33000 at line 14 provides a long title-screen pause (~30 seconds at normal speed) but any key press does not skip it — the user must wait it out unless they press BREAK.
- In VowelTutor, the
\## sequences in several subroutines (e.g., lines 1232, 1262, 1532) are not standard zmakebas escape sequences and likely represent inverse-video block characters or UDGs in the original tape file that were not fully decoded in this transcription.
Content
Source Code
1 REM \06\01\C5\06\64\00\10\FD\C1\10\F7\C9\2E\2E\2E\2E\2E\2E
2 SAVE "AB%C"
12 PRINT AT 8,11;"ALPHATUTOR";AT 10,2;"COPYRIGHT 1982 LOU GOLDSTEIN";AT 12,6;"% %F%R%O%M% %S%O%F%T%S%Y%N%C% %I%N%C% "
13 PRINT AT 20,5;"PRESS ""ENTER"" TO START"
14 PAUSE 33000
15 RAND
17 CLS
18 DIM P(3)
19 DIM W$(3,10)
20 DIM L(3)
30 FOR K=1 TO 3
40 LET L(K)=INT (RND*26)
50 NEXT K
60 IF L(1)=L(2) OR L(1)=L(3) OR L(2)=L(3) THEN GOTO 30
80 LET C=INT (RND*3)+1
90 LET A$=CHR$ (L(C)+38)
100 FOR K=1 TO 3
110 LET X=10*K-5
120 GOSUB 200*L(K)+500
121 PRINT AT 10,P(K);"% ";W$(K,2 TO )
130 PRINT AT 15,X;K
140 NEXT K
150 PRINT AT 19,14;"\:'\''\':";AT 20,14;"\: ";A$;"\ :";AT 21,14;"\:.\..\.:"
160 INPUT R
170 IF R<>C THEN PRINT AT 16,10*C-9;"% % % % % % % % % "
180 IF R=C THEN PRINT AT 16,10*C-9;"*********"
185 PRINT AT 13,P(C);W$(C)
190 PAUSE 250
195 CLS
200 GOTO 30
500 PRINT AT 3,X-3;"\..\..\..\..";AT 4,X-3;"\: \ . \ :";AT 5,X-3;"\: \':\' \ '\''\':";AT 6,X-3;"\:.\..\..\..\..\.:";AT 7,X-3;"\' \' "
501 LET P(K)=X-4
502 LET W$(K)="AMBULANCE"
510 RETURN
700 GOSUB 1700
710 PRINT AT 4,X;"\ :";AT 5,X;"\.'\. ";AT 6,X-1;"\.' \ '\. ";AT 7,X-2;"\.' \ '\. "
711 LET P(K)=X-1
712 LET W$(K)="BOY"
720 RETURN
900 PRINT AT 5,X-3;"\ :% % % ";AT 6,X-3;"\ :% % % % % ";AT 7,X-2;"\' \ '"
901 LET P(K)=X-1
902 LET W$(K)="CAR"
910 RETURN
1100 PRINT AT 1,X-4;"\ . \:.\. ";AT 2,X-3;"\'. % \. ";AT 3,X-2;"% % % ";AT 4,X-2;"\:'\''\':";AT 5,X-2;"\: \ :"
1101 LET P(K)=X-1
1102 LET W$(K)="DOG"
1110 RETURN
1300 PRINT AT 1,X-4;"\ .% % % \..";AT 2,X-4;"% % % % \.:";AT 3,X-4;"\':% % \:'\ '\..\' ";AT 4,X-4;"\ : \: "
1301 LET P(K)=X-4
1302 LET W$(K)="ELEPHANT"
1310 RETURN
1500 PRINT AT 1,X-4;"\ . \ .\..";AT 2,X-4;"\ :\:.\.:% % \':\. ";AT 3,X-4;"\ :% % % % % \. ";AT 4,X-4;"\ :\' \ '\':\:'\' "
1501 LET P(K)=X-2
1502 LET W$(K)="FISH"
1510 RETURN
1700 PRINT AT 0,X;"% \: ";AT 1,X;"\':\' ";AT 2,X-1;"\ .\':\'.";AT 3,X-1;"\' \ : \' "
1710 IF L(K)=1 THEN RETURN
1720 PRINT AT 4,X;"\.:\. ";AT 5,X-1;"\.:% % \. ";AT 6,X-2;"\ '\:'\''\''\:'";AT 7,X-1;"\: \: "
1721 LET P(K)=X-2
1722 LET W$(K)="GIRL"
1730 RETURN
1900 PRINT AT 1,X-2;">\ .\..\..\. <";AT 2,X-1;"\.:% % \:.";AT 3,X-1;"\ :..\: ";AT 4,X-1;"\ : \: ";AT 5,X-1;"\ :\ '\' \: ";AT 6,X;"\''\''"
1901 FOR F=1 TO 2
1902 PRINT AT 1,X-1;" ";AT 2,X-1;"\ .\..\..\. "
1903 LET E=USR 16514
1904 PRINT AT 1,X-1;"\ .\..\..\. ";AT 2,X-1;"\.:% % \:."
1905 LET E=USR 16514
1906 NEXT F
1907 LET P(K)=X-1
1908 LET W$(K)="HAT"
1910 RETURN
2100 PRINT AT 1,X-1;"\ :";AT 2,X-1;"\ :";AT 3,X-2;"\ .\''\''\''\. ";AT 4,X-2;"\ :\~~\~~\~~\: ";AT 5,X-2;"\ :\ ' \' \: ";AT 6,X-2;"\ :\ .\..\. \: ";AT 7,X-2;"\ '\..\..\..\' "
2101 LET P(K)=X-3
2102 LET W$(K)="INDIAN"
2110 RETURN
2300 PRINT AT 1,X-3;"---\:.";AT 2,X-3;"\':\..\..\.:\:.\..";AT 3,X-3;"\ :\..\..\..\..\..% >";AT 4,X-3;"---\ .\:'";AT 5,X-3;"---\:'"
2301 LET P(K)=X-1
2302 LET W$(K)="JET"
2310 RETURN
2500 LET P(K)=X-2
2522 LET W$(K)="KING"
2523 PRINT AT 1,X-2;"\. \. \. \. \. ";AT 2,X-2;"\':\''\''\':\' ";AT 3,X-2;"\ :\ '\ '\ :";AT 4,X-2;"\ : \' \ :";AT 5,X-2;"\ :\ '\''\ :";AT 6,X-1;"\':% \' "
2530 RETURN
2700 PRINT AT 2,X-3;"A B C D";AT 3,X-2;"E F G"
2701 LET P(K)=X-4
2702 LET W$(K)="LETTERS"
2710 RETURN
2900 PRINT AT 1,X;"% \: ";AT 2,X;"\':\' ";AT 3,X-1;"% % % \: ";AT 4,X-1;"\: % \: \: ";AT 5,X-1;"\' % \: \' "
2910 IF L(K)=22 THEN RETURN
2920 PRINT AT 6,X-1;"\ :% % ";AT 7,X-1;"\ :\: % ";AT 8,X-1;"\ :\: % "
2921 LET P(K)=X-1
2922 LET W$(K)="MAN"
2930 RETURN
3100 PRINT AT 3,X-3;"1 2 3 4";AT 4,X-2;"5 6 7"
3101 LET P(K)=X-3
3102 LET W$(K)="NUMBERS"
3110 RETURN
3300 PRINT AT 1,X-4;"\. ";AT 2,X-4;"\ '\'. \.:\. \..\. ";AT 3,X-2;"\':% % \''";AT 4,X-4;"\ .\.'\':% % \.. \.'";AT 5,X-4;"\' \ .\.'\.'\.'\. \''";AT 6,X-4;"\ .\' \ .\' \'.\ '\'.";AT 7,X-4;"\' \ .\' \ '\. "
3301 LET P(K)=X-3
3302 LET W$(K)="OCTOPUS"
3310 RETURN
3500 PRINT AT 5,X-2;"\..\..\..\..% ";AT 4,X+2;"*";AT 3,X+2;"*"
3501 LET P(K)=X-1
3502 LET W$(K)="PIPE"
3510 RETURN
3700 GOSUB 2500
3710 FOR Y=38 TO 29 STEP -1
3720 PLOT 2*X-4,Y
3730 PLOT 2*X+4,Y
3740 NEXT Y
3751 LET P(K)=X-2
3752 LET W$(K)="QUEEN"
3760 RETURN
3900 PRINT AT 1,X;"A";AT 2,X;"% ";AT 3,X;"% ";AT 4,X;"% ";AT 5,X;"% ";AT 6,X-1;"\..% \..";AT 7,X-1;"\' *\ '";AT 8,X;"*"
3901 LET P(K)=X-3
3902 LET W$(K)="ROCKET"
3910 RETURN
4100 PRINT AT 1,X-1;"\..\..\..";AT 2,X-2;"\ :\ . \. \: ";AT 3,X-2;"\ : \: ";AT 4,X-3;">\ :\ . \. \: <";AT 5,X-2;"\ : \'' \: ";AT 6,X-1;"\''\''\''"
4101 FOR F=1 TO 2
4102 PRINT AT 4,X-1;" ";AT 5,X-1;"\ '\''\' "
4103 LET E=USR 16514
4104 PRINT AT 4,X-1;"\ . \. ";AT 5,X-1;" \'' "
4105 LET E=USR 16514
4106 NEXT F
4107 LET P(K)=X-2
4108 LET W$(K)="SMILE"
4110 RETURN
4300 PRINT AT 1,X-1;"\ .% \. ";AT 2,X-2;"\ .% % % \. ";AT 3,X-2;"% % % % % ";AT 4,X-2;"\ '% % % \' ";AT 5,X-1;"\ '% \' ";AT 6,X;"% ";AT 7,X-1;"\ .% \. "
4301 LET P(K)=X-2
4302 LET W$(K)="TREE"
4310 RETURN
4500 PRINT AT 1,X;"\.:\. ";AT 2,X-1;"\.'\ :\ '\. ";AT 3,X;"\ :";AT 4,X;"\ :"
4501 LET P(K)=X-1
4502 LET W$(K)="UP"
4510 RETURN
4700 PRINT AT 2,X-2;"\ .\. \..";AT 3,X-2;"% % \. \.:% \: ";AT 4,X-2;"\':% % % % \' ";AT 5,X-1;"\':% % \' ";AT 6,X;"\':\' "
4701 LET P(K)=X-4
4702 LET W$(K)="VALENTINE"
4710 RETURN
4900 GOSUB 2900
4910 PRINT AT 6,X-1;"\.:% % \. ";AT 7,X-2;"\.:% % % % \. ";AT 8,X-1;"\ :\: % "
4911 LET P(K)=X-2
4912 LET W$(K)="WOMAN"
4920 RETURN
5100 PRINT AT 1,X-3;"\: \: \: \: \: \: \: ";AT 2,X-3;"\: \: \: \: \: \' ";AT 3,X-3;"\: \: \: \' \. ";AT 4,X-3;"\: \' \. /";AT 5,X-1;"/"
5101 LET P(K)=X-4
5102 LET W$(K)="XYLOPHONE"
5110 RETURN
5300 PRINT AT 1,X-1;"\ .% \. ";AT 2,X-1;"% % \':";AT 3,X-1;"% % % \. <";AT 4,X-1;"% % \''<";AT 5,X-1;"% % \.. <";AT 6,X-1;"\ :% "
5301 LET P(K)=X-1
5302 LET W$(K)="YELL"
5310 RETURN
5500 PRINT AT 3,X-2;"\.'\. \.'";AT 4,X-3;"\ ' \ '\. \.'\.'";AT 5,X;"\ '"
5501 LET P(K)=X-3
5502 LET W$(K)="ZIGZAG"
5510 RETURN
1 REM \06\01\C5\06\64\00\10\FD\C1\10\F7\C9\2E\2E\2E\2E\2E\2E\2E\2E\2E\2E\2E
2 SAVE "VOWE%L"
12 PRINT AT 8,11;"VOWELTUTOR";AT 10,2;"COPYRIGHT 1982 LOU GOLDSTEIN";AT 12,7;"% %F%R%O%M% %S%O%F%T%S%Y%N%C% %I%N%C% "
13 PRINT AT 20,5;"PRESS ""ENTER"" TO START"
14 PAUSE 33000
15 RAND
16 LET V$="AEIOU"
17 CLS
18 DIM P(3)
19 DIM W$(3,10)
20 DIM L(5)
23 PRINT AT 6,0;"WHICH VOWELS DO YOU WANT TO USE?1=LONG",,"2=SHORT",,"3=BOTH",,"4=EXIT PROGRAM"
24 INPUT O
25 LET LS=O
26 CLS
27 IF O=4 THEN STOP
30 IF O=3 THEN LET LS=INT (RND*2)+1
31 FOR K=1 TO 3
32 FAST
40 LET L(K)=INT (RND*5)+1
50 NEXT K
60 IF L(1)=L(2) OR L(1)=L(3) OR L(2)=L(3) THEN GOTO 31
80 LET C=INT (RND*3)+1
90 LET A$=V$(L(C))
99 SLOW
100 FOR K=1 TO 3
105 LET Z=INT (RND*3)
110 LET X=10*K-5
120 GOSUB 700*LS+100*L(K)+30*Z
121 PRINT AT 10,P(K);W$(K)
130 PRINT AT 15,X;K
140 NEXT K
150 PRINT AT 19,14;"\:'\''\':";AT 20,14;"\: ";A$;"\ :";AT 21,14;"\:.\..\.:"
151 FOR J=1 TO 10
152 IF W$(C,J)="% " THEN GOTO 155
153 NEXT J
155 LET W$(C,J)=A$
156 INPUT R
157 IF R=9 THEN CLS
160 IF R=9 THEN GOTO 23
170 IF R<>C THEN PRINT AT 16,10*C-9;"% % % % % % % % % "
180 IF R=C THEN PRINT AT 16,10*C-9;"*********"
185 PRINT AT 13,P(C);W$(C)
190 PAUSE 250
195 CLS
200 GOTO 30
800 LET W$(K)="TR% IN"
801 LET P(K)=X-2
802 PRINT AT 2,X-1;"*";AT 3,X;"*";AT 4,X;"\ :\..\. ";AT 5,X-4;"\ :% \.:% \.:% % >";AT 6,X-4;"\ '\ '\ '\ '\ ' \ '"
803 RETURN
830 LET W$(K)="C% NE"
831 LET P(K)=X-1
832 PRINT AT 1,X+1;"\' ";AT 0,X-1;"\ .\''\. "
833 FOR Y=41 TO 30 STEP -1
834 PLOT 2*X-1,Y
835 NEXT Y
836 RETURN
860 LET W$(K)="D% YS"
861 LET P(K)=X-2
862 PRINT AT 2,X-1;"FRI.";AT 4,X-1;"SAT.";AT 6,X-1;"SUN."
863 RETURN
900 LET W$(K)="K% Y"
901 LET P(K)=X-1
902 PRINT AT 3,X-3;"% % ";AT 4,X-3;"% % \:'\''\':% % \' ";AT 5,X-3;"% % \ '\ :\ '"
903 RETURN
930 LET W$(K)="THR% E"
931 LET P(K)=X-2
932 PRINT AT 3,X-1;"\''\''\: ";AT 4,X+1;"\: ";AT 5,X-1;"\ '\''\: ";AT 6,X+1;"\: ";AT 7,X-1;"\''\''\' "
933 RETURN
960 LET W$(K)="KN% E"
961 LET P(K)=X-2
962 PRINT AT 0,X+1;"% \: ";AT 1,X+1;"\':\' ";AT 2,X+1;"\: ";AT 3,X;"\ :\ '\..\. ";AT 4,X;"\: ";AT 5,X-1;"\ :\ '\. ";AT 6,X-1;"\ : \ '\. <";AT 7,X-2;"\ .\' \: ";AT 8,X-2;"\'. \''"
968 RETURN
1000 LET W$(K)="F% VE"
1001 LET P(K)=X-2
1002 PRINT AT 2,X-1;"\:'\''\' ";AT 3,X-1;"\:.\. ";AT 4,X;"\ '\. ";AT 5,X-1;"\. \ .\' ";AT 6,X-1;"\ '\' "
1003 RETURN
1030 LET W$(K)="K% TE"
1031 LET P(K)=X-2
1032 PRINT AT 0,X;"\.:\. ";AT 1,X-1;"\ .\':\'.";AT 2,X-1;"\.:\.:\.:\. ";AT 3,X-1;"\ :\ :\ :";AT 4,X;"% \: ";AT 5,X;"\ :";AT 6,X+1;"\'.";AT 7,X+1;"\.'";AT 8,X+1;"\ '"
1033 RETURN
1060 LET W$(K)="N% NE"
1061 LET P(K)=X-2
1063 PRINT AT 2,X-1;"\:'\''\: ";AT 3,X-1;"\: \: ";AT 4,X-1;"\''\''\: ";AT 5,X-1;"\. \: ";AT 6,X-1;"\''\''\' "
1064 RETURN
1100 LET W$(K)="B% AT"
1101 LET P(K)=X-2
1102 PRINT AT 1,X-2;"\..\..\..\..\. ";AT 2,X-2;"\ '\. \ '\. ";AT 3,X-1;"\.' \.'";AT 4,X-2;"\ '\''\':\''\''";AT 5,X-4;"\..\..\..\..\.:\..\..\..>";AT 6,X-4;"\':% % % % % \:'";AT 7,X-3;"\''\''\''\''\''"
1103 RETURN
1130 LET W$(K)="THR% W"
1131 LET P(K)=X-2
1132 PRINT AT 2,X+2;">";AT 3,X-2;"\ :% >\ '";AT 4,X-2;"\ '\:' \.'";AT 5,X-3;"\ .\''\:'\''";AT 6,X-3;"\' \: ";AT 7,X-2;"\.'\ '\. ";AT 8,X-3;"\ ' \ '"
1133 RETURN
1160 LET W$(K)="N% SE"
1161 LET P(K)=X-2
1162 PRINT AT 1,X-1;"\ .% \. ";AT 2,X-1;"% \:.\:.";AT 3,X-1;"% % \' ";AT 4,X-1;"\':\:'\' "
1163 FOR G=1 TO 3
1164 PRINT AT 2,1+X;"\: "
1165 LET U=USR 16514
1166 PRINT AT 2,X+1;"\:."
1167 LET U=USR 16514
1168 NEXT G
1169 RETURN
1200 LET W$(K)="% NITED"
1201 LET P(K)=X-3
1202 PRINT AT 1,X-3;"\..\..\..\..\..\. \.:";AT 2,X-4;"\ .% % % % % % \.:% ";AT 3,X-4;"\ :AMERICA\: ";AT 4,X-4;"\ '% % % % % % % \: ";AT 5,X-3;"\''\''% % % % % \: ";AT 6,X;"\':\:' \: ";AT 7,X+1;"\' "
1203 PRINT AT 11,P(K);"STATES"
1204 RETURN
1230 LET W$(K)="F% EL"
1231 LET P(K)=X-2
1232 PRINT AT 1,X-4;"\##\##\##";AT 2,X-4;"\##%G\##";AT 3,X-4;"\##%A\##";AT 4,X-4;"\##%S\##\'. \:'\''\':";AT 5,X-4;"\##\##\##\ '\..\:.\..\.:";AT 6,X-4;"\##\##\## % % % ";AT 7,X-4;"\##\##\## \: \ :"
1233 RETURN
1260 LET W$(K)="T% BE"
1261 LET P(K)=X-2
1262 PRINT AT 2,X-4;"\ .\..\..\..\..\..\..\..\. ";AT 3,X-4;"\ :\##TOOTH\##\:.";AT 4,X-4;"\ :\##PASTE\##\:'";AT 5,X-4;"\ '\''\''\''\''\''\''\''\' "
1263 RETURN
1500 LET W$(K)="FL% G"
1501 LET P(K)=X-2
1503 LET B=X-4
1504 PRINT AT 0,B;"\ .\..\..\..\..\..\..\..";AT 1,B;"\ :***\:'\''\''\':";AT 2,B;"\ :***\:'\''\''\':";AT 3,B;"\ :\''\''\''\''\''\''\':";AT 4,B;"\ :\''\''\''\''\''\''\':";AT 5,B;"\ :\''\''\''\''\''\''\''";AT 6,B;"\ :"
1505 RETURN
1530 LET W$(K)="% DD"
1531 LET P(K)=X-1
1532 PRINT AT 1,X-2;"3+2=\##";AT 3,X;"75";AT 4,X-1;"+23";AT 5,X-1;"\''\''\''"
1533 RETURN
1560 LET W$(K)="P% N"
1561 LET P(K)=X-1
1562 PRINT AT 3,X-3;"\..\..\..\..";AT 4,X-4;"\ :\' \ '\:.\..\..\..";AT 5,X-4;"\ :\:.\..\..\.:\: ";AT 6,X-4;"\ '% % % % \' "
1563 RETURN
1600 LET W$(K)="T% N"
1601 LET P(K)=X-1
1602 LET B=X-2
1603 PRINT AT 2,B;"\ : \:'\''\':";AT 3,B;"\ : \: \ :";AT 4,B;"\ : \: \ :";AT 5,B;"\ : \:.\..\.:"
1604 RETURN
1630 LET W$(K)="DR% SS"
1631 LET P(K)=X-2
1632 PRINT AT 1,X-2;"\.:\:.\.:\:.";AT 2,X-3;"\ '\:'% % \':\' ";AT 3,X-2;"\ .% % \. ";AT 4,X-3;"\ .% % % % \. ";AT 5,X-4;"\ .% % % % % % \. "
1633 RETURN
1660 LET W$(K)="L% G"
1661 LET P(K)=X-1
1662 LET B=X-1
1663 PRINT AT 0,X;"% \: ";AT 1,X;"\':\' ";AT 2,B;"% % % \: ";AT 3,B;"\: % \: \: ";AT 4,B;"\' % \: \' ";AT 5,B;"\ :% % ";AT 6,B;"\ :\: \##<";AT 7,B;"\ :\: \##<"
1664 RETURN
1700 LET W$(K)="S% X"
1701 LET P(K)=X-1
1702 LET B=X-1
1703 PRINT AT 1,X;"\..";AT 2,B;"\.' \' ";AT 3,B;"\: ";AT 4,B;"\:.\''\'.";AT 5,B;"\: \ :";AT 6,B;"\ '\..\' "
1704 RETURN
1730 LET W$(K)="SH% P"
1731 LET P(K)=X-2
1732 PRINT AT 3,X-3;"\..\:.\:.\. ";AT 4,X-5;"\ .\..% \:'% \:'% \:'% \:'";AT 5,X-4;"\':\:.% \:.% \:.% \:'";AT 6,X-5;"\@@\@@\@@\@@\@@\@@\@@\@@\@@\@@"
1733 RETURN
1760 LET W$(K)="WR% ST"
1761 LET P(K)=X-2
1762 LET B=X-1
1763 PRINT AT 0,B;"\..\..\..";AT 1,B;"\:'% \':";AT 2,B;"% \''% ";AT 3,B;"\''% \''"
1764 LET B=X-2
1765 PRINT AT 4,B;"% % % % % ";AT 5,B;"% \ :% \: % ";AT 6,B-1;">\##\ :% \: \##<";AT 7,B;"W W"
1766 RETURN
1800 LET W$(K)="P% T"
1801 LET P(K)=X-1
1802 PRINT AT 1,X-2;"\..";AT 2,X-4;"\ .\'' \''\. ";AT 3,X-4;"\:. \.:\..\..\..";AT 4,X-4;"% % \..% % ";AT 5,X-4;"\':% % % \:'";AT 6,X-3;"\ '\''\' "
1803 RETURN
1830 LET W$(K)="CL% CK"
1831 LET P(K)=X-3
1832 PRINT AT 1,X;"\..\. ";AT 2,X-2;"\ .\''\ .\ '\'.";AT 3,X-2;"\: \ : \: ";AT 4,X-3;"\ : \ :\..\. \ :";AT 5,X-3;"\ '\. \.'";AT 6,X-2;"\'. \ .\' ";AT 7,X-1;"\''\..\.'\' "
1833 RETURN
1860 LET W$(K)="ST% P"
1861 LET P(K)=X-2
1862 PRINT AT 0,X-2;"\ .% % \. ";AT 1,X-3;"\ .% % % % \. ";AT 2,X-3;"% ST P% ";AT 3,X-3;"% % % % % % ";AT 4,X-3;"\ '% % % % \' ";AT 5,X-2;"\ '% % \' ";AT 6,X-1;"\ :\: ";AT 7,X-1;"\ :\: "
1863 RETURN
1900 LET W$(K)="G% N"
1901 LET P(K)=X-1
1902 LET B=X-4
1903 PRINT AT 2,B;"\ :% % % % % -->";AT 3,B;"\ :\: \: \:'\''";AT 4,B;"\ :\:.\..\: ";AT 5,B;"\ :\: "
1904 RETURN
1930 LET W$(K)="DR% M"
1931 LET P(K)=X-2
1932 PRINT AT 0,X+2;"/";AT 1,X-1;"\.. \ ' /";AT 2,X-3;"\ .\'' \''\. \ '";AT 3,X-3;"\:. \.:";AT 4,X-3;"% % \..% % ";AT 5,X-3;"\':% % % \:'";AT 6,X-2;"\ '\''\' "
1933 RETURN
1960 LET W$(K)="B% S"
1961 LET P(K)=X-1
1962 LET B=X-3
1963 PRINT AT 2,B;"% \''\:'\':\''% % ";AT 3,B;"% \..\:.\.:\..% \ :% ";AT 4,B;"% % % % % % \.:% ";AT 5,B+1;"\' \ '"
1964 RETURN
Note: Type-in program listings on this website use ZMAKEBAS notation for graphics characters.
People
E
Skip to content
Computer Tutor
Products: Computer Tutors: Alpha/Vowel Tutors
Developer(s): Lou Goldstein
Date: 1982
Type: Cassette
Platform(s): TS 1000
Tags: Education
AlphaTutor and VowelTutor are a paired set of educational programs designed to teach children letter recognition and vowel sounds through a picture-matching quiz format. Each round randomly selects three images drawn entirely in block graphics, displays them with numbered labels, and prompts the child to identify which picture matches a highlighted letter or vowel shown in a bordered box. The programs use computed GOSUB targets (e.g., `GOSUB 200*L(K)+500` and `GOSUB 700*LS+100*L(K)+30*Z`) to dispatch to one of 26 picture-drawing subroutines covering letters A–Z and multiple vowel-sound variants. VowelTutor extends the concept with separate long and short vowel word sets per letter, selected by a random or user-chosen mode flag, and includes an animated nose-sniffing and hat/smile flip routine via `USR 16514`, pointing to a small machine-code delay loop stored in the REM statement at line 1.
Program Analysis
This listing contains two related programs: AlphaTutor and VowelTutor, both credited to Lou Goldstein / SoftSync Inc., 1982. AlphaTutor covers all 26 letters of the alphabet; VowelTutor extends the concept to long and short vowel sounds, offering multiple word variants per vowel. Both share the same core quiz loop and picture-rendering architecture.
Program Structure
Both programs follow the same top-level flow:
- Title/splash screen (lines 12–14), then
RAND to seed the RNG.
- Initialise arrays
P(3), W$(3,10), L(3) (lines 18–20).
- Main loop (lines 30–200): pick three distinct random indices, choose one as the target, dispatch to a drawing subroutine for each, display a letter/vowel prompt box, read a numeric answer, give feedback, pause, clear and repeat.
- Drawing subroutines: one per picture subject, each printing block-graphic art, setting
P(K) (label column) and W$(K) (word string).
VowelTutor adds a mode-selection screen (lines 23–27) offering long vowels, short vowels, or both, stored in LS, and allows the user to return to mode selection by entering 9.
Computed GOSUB Dispatch
The most architecturally notable feature is the use of arithmetic expressions as GOSUB targets to select picture subroutines without IF/THEN chains:
- AlphaTutor:
GOSUB 200*L(K)+500 — with L(K) in 0–25, this generates targets 500 (A=ambulance), 700 (B=boy), 900 (C=car) … 5500 (Z=zigzag), spaced 200 apart.
- VowelTutor:
GOSUB 700*LS+100*L(K)+30*Z — the LS factor (1=long, 2=short) shifts into a separate bank of subroutines; L(K) selects the vowel (1–5 = A/E/I/O/U); Z (0–2) selects one of up to three word variants per vowel per length.
This is a compact and efficient dispatch mechanism that avoids long IF/THEN chains entirely, at the cost of requiring subroutines to be placed at exactly the computed line numbers.
Machine Code Usage
Line 1 in both programs is a REM statement whose body encodes a short Z80 machine-code routine. The sequence \06\01\C5\06\64\00\10\FD\C1\10\F7\C9 disassembles as:
LD B,1 — outer loop count
PUSH BC
LD B,100 ; LD C,0 — inner delay count (25600 iterations)
DJNZ $ — inner loop
POP BC ; DJNZ … — outer loop
RET
This routine is called via LET E=USR 16514 (the address of the REM body in the VowelTutor variant is slightly longer, hence a different offset in practice). It is used as a simple software delay in animation sequences — for example, the hat flip in AlphaTutor (lines 1901–1906), the smile animation (lines 4101–4106), and the nose-sniffing effect (lines 1163–1168 in VowelTutor).
Key BASIC Idioms
- Block graphic art: All pictures are rendered using the ZX81/TS1000 block graphic characters (2×2 pixel sub-characters), encoded here as zmakebas escape sequences such as
\ ., \:., \'', etc.
- Distinct random selection: Lines 60 check
L(1)=L(2) OR L(1)=L(3) OR L(2)=L(3) and loop back if any two indices collide, ensuring three distinct pictures appear each round.
- Column positioning via formula:
LET X=10*K-5 (line 110) distributes the three picture columns evenly across the 32-character screen (columns 5, 15, 25).
- Answer box: The target letter is displayed in a bordered box drawn with block graphics at lines 19–21 using
AT positioning.
- PLOT for QUEEN and CONE: The subroutines at lines 3700 and 830 use
PLOT with pixel coordinates to draw vertical lines, since the block graphic resolution is insufficient for narrow strokes.
VowelTutor Word-Embedding Technique
In VowelTutor, word labels use a space character as a placeholder for the missing vowel (e.g., "TR% IN" for TRAIN, "K% TE" for KITE). After the round is set up, lines 151–155 scan W$(C) character-by-character to find the first "% " (space) position, then replace it with the actual vowel character A$ — effectively filling in the blank dynamically. This lets the same word string serve as both a gapped display and, after substitution, the correct spelled form.
Notable Subroutine Sharing
AlphaTutor’s GIRL subroutine (line 1700) is shared with BOY (line 700): the BOY subroutine calls GOSUB 1700 to draw the upper body, then the shared routine checks IF L(K)=1 THEN RETURN (line 1710) to exit early for BOY, or continues to draw the skirt/legs for GIRL. Similarly, VowelTutor’s WOMAN subroutine (line 4900) reuses the MAN subroutine (line 2900) for the head and torso, then overprints with different lower-body graphics.
Array Sizing
Array Dimensions Purpose P(3)3 elements Column position for each picture’s word label W$(3,10)3 strings × 10 chars Word associated with each picture slot L(3) / L(5)3 (Alpha) / 5 (Vowel) Random index for picture selection
Potential Anomalies
- AlphaTutor has no subroutine at the computed target for letter index 0 (line 500 handles A=0, as
200*0+500=500) — this is correct; L(K)=INT(RND*26) yields 0–25, mapping to lines 500–5500.
- VowelTutor’s
GOSUB 700*LS+100*L(K)+30*Z for LS=2 (short vowels) can yield targets like 1400+30*Z (lines 1400, 1430, 1460) which are not all defined in the listing — some short-vowel variant slots appear absent, which would cause a BASIC error if selected. This may reflect incomplete subroutine coverage in the original listing.
- The
PAUSE 33000 at line 14 provides a long title-screen pause (~30 seconds at normal speed) but any key press does not skip it — the user must wait it out unless they press BREAK.
- In VowelTutor, the
\## sequences in several subroutines (e.g., lines 1232, 1262, 1532) are not standard zmakebas escape sequences and likely represent inverse-video block characters or UDGs in the original tape file that were not fully decoded in this transcription.
Content
Source Code
1 REM \06\01\C5\06\64\00\10\FD\C1\10\F7\C9\2E\2E\2E\2E\2E\2E
2 SAVE "AB%C"
12 PRINT AT 8,11;"ALPHATUTOR";AT 10,2;"COPYRIGHT 1982 LOU GOLDSTEIN";AT 12,6;"% %F%R%O%M% %S%O%F%T%S%Y%N%C% %I%N%C% "
13 PRINT AT 20,5;"PRESS ""ENTER"" TO START"
14 PAUSE 33000
15 RAND
17 CLS
18 DIM P(3)
19 DIM W$(3,10)
20 DIM L(3)
30 FOR K=1 TO 3
40 LET L(K)=INT (RND*26)
50 NEXT K
60 IF L(1)=L(2) OR L(1)=L(3) OR L(2)=L(3) THEN GOTO 30
80 LET C=INT (RND*3)+1
90 LET A$=CHR$ (L(C)+38)
100 FOR K=1 TO 3
110 LET X=10*K-5
120 GOSUB 200*L(K)+500
121 PRINT AT 10,P(K);"% ";W$(K,2 TO )
130 PRINT AT 15,X;K
140 NEXT K
150 PRINT AT 19,14;"\:'\''\':";AT 20,14;"\: ";A$;"\ :";AT 21,14;"\:.\..\.:"
160 INPUT R
170 IF R<>C THEN PRINT AT 16,10*C-9;"% % % % % % % % % "
180 IF R=C THEN PRINT AT 16,10*C-9;"*********"
185 PRINT AT 13,P(C);W$(C)
190 PAUSE 250
195 CLS
200 GOTO 30
500 PRINT AT 3,X-3;"\..\..\..\..";AT 4,X-3;"\: \ . \ :";AT 5,X-3;"\: \':\' \ '\''\':";AT 6,X-3;"\:.\..\..\..\..\.:";AT 7,X-3;"\' \' "
501 LET P(K)=X-4
502 LET W$(K)="AMBULANCE"
510 RETURN
700 GOSUB 1700
710 PRINT AT 4,X;"\ :";AT 5,X;"\.'\. ";AT 6,X-1;"\.' \ '\. ";AT 7,X-2;"\.' \ '\. "
711 LET P(K)=X-1
712 LET W$(K)="BOY"
720 RETURN
900 PRINT AT 5,X-3;"\ :% % % ";AT 6,X-3;"\ :% % % % % ";AT 7,X-2;"\' \ '"
901 LET P(K)=X-1
902 LET W$(K)="CAR"
910 RETURN
1100 PRINT AT 1,X-4;"\ . \:.\. ";AT 2,X-3;"\'. % \. ";AT 3,X-2;"% % % ";AT 4,X-2;"\:'\''\':";AT 5,X-2;"\: \ :"
1101 LET P(K)=X-1
1102 LET W$(K)="DOG"
1110 RETURN
1300 PRINT AT 1,X-4;"\ .% % % \..";AT 2,X-4;"% % % % \.:";AT 3,X-4;"\':% % \:'\ '\..\' ";AT 4,X-4;"\ : \: "
1301 LET P(K)=X-4
1302 LET W$(K)="ELEPHANT"
1310 RETURN
1500 PRINT AT 1,X-4;"\ . \ .\..";AT 2,X-4;"\ :\:.\.:% % \':\. ";AT 3,X-4;"\ :% % % % % \. ";AT 4,X-4;"\ :\' \ '\':\:'\' "
1501 LET P(K)=X-2
1502 LET W$(K)="FISH"
1510 RETURN
1700 PRINT AT 0,X;"% \: ";AT 1,X;"\':\' ";AT 2,X-1;"\ .\':\'.";AT 3,X-1;"\' \ : \' "
1710 IF L(K)=1 THEN RETURN
1720 PRINT AT 4,X;"\.:\. ";AT 5,X-1;"\.:% % \. ";AT 6,X-2;"\ '\:'\''\''\:'";AT 7,X-1;"\: \: "
1721 LET P(K)=X-2
1722 LET W$(K)="GIRL"
1730 RETURN
1900 PRINT AT 1,X-2;">\ .\..\..\. <";AT 2,X-1;"\.:% % \:.";AT 3,X-1;"\ :..\: ";AT 4,X-1;"\ : \: ";AT 5,X-1;"\ :\ '\' \: ";AT 6,X;"\''\''"
1901 FOR F=1 TO 2
1902 PRINT AT 1,X-1;" ";AT 2,X-1;"\ .\..\..\. "
1903 LET E=USR 16514
1904 PRINT AT 1,X-1;"\ .\..\..\. ";AT 2,X-1;"\.:% % \:."
1905 LET E=USR 16514
1906 NEXT F
1907 LET P(K)=X-1
1908 LET W$(K)="HAT"
1910 RETURN
2100 PRINT AT 1,X-1;"\ :";AT 2,X-1;"\ :";AT 3,X-2;"\ .\''\''\''\. ";AT 4,X-2;"\ :\~~\~~\~~\: ";AT 5,X-2;"\ :\ ' \' \: ";AT 6,X-2;"\ :\ .\..\. \: ";AT 7,X-2;"\ '\..\..\..\' "
2101 LET P(K)=X-3
2102 LET W$(K)="INDIAN"
2110 RETURN
2300 PRINT AT 1,X-3;"---\:.";AT 2,X-3;"\':\..\..\.:\:.\..";AT 3,X-3;"\ :\..\..\..\..\..% >";AT 4,X-3;"---\ .\:'";AT 5,X-3;"---\:'"
2301 LET P(K)=X-1
2302 LET W$(K)="JET"
2310 RETURN
2500 LET P(K)=X-2
2522 LET W$(K)="KING"
2523 PRINT AT 1,X-2;"\. \. \. \. \. ";AT 2,X-2;"\':\''\''\':\' ";AT 3,X-2;"\ :\ '\ '\ :";AT 4,X-2;"\ : \' \ :";AT 5,X-2;"\ :\ '\''\ :";AT 6,X-1;"\':% \' "
2530 RETURN
2700 PRINT AT 2,X-3;"A B C D";AT 3,X-2;"E F G"
2701 LET P(K)=X-4
2702 LET W$(K)="LETTERS"
2710 RETURN
2900 PRINT AT 1,X;"% \: ";AT 2,X;"\':\' ";AT 3,X-1;"% % % \: ";AT 4,X-1;"\: % \: \: ";AT 5,X-1;"\' % \: \' "
2910 IF L(K)=22 THEN RETURN
2920 PRINT AT 6,X-1;"\ :% % ";AT 7,X-1;"\ :\: % ";AT 8,X-1;"\ :\: % "
2921 LET P(K)=X-1
2922 LET W$(K)="MAN"
2930 RETURN
3100 PRINT AT 3,X-3;"1 2 3 4";AT 4,X-2;"5 6 7"
3101 LET P(K)=X-3
3102 LET W$(K)="NUMBERS"
3110 RETURN
3300 PRINT AT 1,X-4;"\. ";AT 2,X-4;"\ '\'. \.:\. \..\. ";AT 3,X-2;"\':% % \''";AT 4,X-4;"\ .\.'\':% % \.. \.'";AT 5,X-4;"\' \ .\.'\.'\.'\. \''";AT 6,X-4;"\ .\' \ .\' \'.\ '\'.";AT 7,X-4;"\' \ .\' \ '\. "
3301 LET P(K)=X-3
3302 LET W$(K)="OCTOPUS"
3310 RETURN
3500 PRINT AT 5,X-2;"\..\..\..\..% ";AT 4,X+2;"*";AT 3,X+2;"*"
3501 LET P(K)=X-1
3502 LET W$(K)="PIPE"
3510 RETURN
3700 GOSUB 2500
3710 FOR Y=38 TO 29 STEP -1
3720 PLOT 2*X-4,Y
3730 PLOT 2*X+4,Y
3740 NEXT Y
3751 LET P(K)=X-2
3752 LET W$(K)="QUEEN"
3760 RETURN
3900 PRINT AT 1,X;"A";AT 2,X;"% ";AT 3,X;"% ";AT 4,X;"% ";AT 5,X;"% ";AT 6,X-1;"\..% \..";AT 7,X-1;"\' *\ '";AT 8,X;"*"
3901 LET P(K)=X-3
3902 LET W$(K)="ROCKET"
3910 RETURN
4100 PRINT AT 1,X-1;"\..\..\..";AT 2,X-2;"\ :\ . \. \: ";AT 3,X-2;"\ : \: ";AT 4,X-3;">\ :\ . \. \: <";AT 5,X-2;"\ : \'' \: ";AT 6,X-1;"\''\''\''"
4101 FOR F=1 TO 2
4102 PRINT AT 4,X-1;" ";AT 5,X-1;"\ '\''\' "
4103 LET E=USR 16514
4104 PRINT AT 4,X-1;"\ . \. ";AT 5,X-1;" \'' "
4105 LET E=USR 16514
4106 NEXT F
4107 LET P(K)=X-2
4108 LET W$(K)="SMILE"
4110 RETURN
4300 PRINT AT 1,X-1;"\ .% \. ";AT 2,X-2;"\ .% % % \. ";AT 3,X-2;"% % % % % ";AT 4,X-2;"\ '% % % \' ";AT 5,X-1;"\ '% \' ";AT 6,X;"% ";AT 7,X-1;"\ .% \. "
4301 LET P(K)=X-2
4302 LET W$(K)="TREE"
4310 RETURN
4500 PRINT AT 1,X;"\.:\. ";AT 2,X-1;"\.'\ :\ '\. ";AT 3,X;"\ :";AT 4,X;"\ :"
4501 LET P(K)=X-1
4502 LET W$(K)="UP"
4510 RETURN
4700 PRINT AT 2,X-2;"\ .\. \..";AT 3,X-2;"% % \. \.:% \: ";AT 4,X-2;"\':% % % % \' ";AT 5,X-1;"\':% % \' ";AT 6,X;"\':\' "
4701 LET P(K)=X-4
4702 LET W$(K)="VALENTINE"
4710 RETURN
4900 GOSUB 2900
4910 PRINT AT 6,X-1;"\.:% % \. ";AT 7,X-2;"\.:% % % % \. ";AT 8,X-1;"\ :\: % "
4911 LET P(K)=X-2
4912 LET W$(K)="WOMAN"
4920 RETURN
5100 PRINT AT 1,X-3;"\: \: \: \: \: \: \: ";AT 2,X-3;"\: \: \: \: \: \' ";AT 3,X-3;"\: \: \: \' \. ";AT 4,X-3;"\: \' \. /";AT 5,X-1;"/"
5101 LET P(K)=X-4
5102 LET W$(K)="XYLOPHONE"
5110 RETURN
5300 PRINT AT 1,X-1;"\ .% \. ";AT 2,X-1;"% % \':";AT 3,X-1;"% % % \. <";AT 4,X-1;"% % \''<";AT 5,X-1;"% % \.. <";AT 6,X-1;"\ :% "
5301 LET P(K)=X-1
5302 LET W$(K)="YELL"
5310 RETURN
5500 PRINT AT 3,X-2;"\.'\. \.'";AT 4,X-3;"\ ' \ '\. \.'\.'";AT 5,X;"\ '"
5501 LET P(K)=X-3
5502 LET W$(K)="ZIGZAG"
5510 RETURN
1 REM \06\01\C5\06\64\00\10\FD\C1\10\F7\C9\2E\2E\2E\2E\2E\2E\2E\2E\2E\2E\2E
2 SAVE "VOWE%L"
12 PRINT AT 8,11;"VOWELTUTOR";AT 10,2;"COPYRIGHT 1982 LOU GOLDSTEIN";AT 12,7;"% %F%R%O%M% %S%O%F%T%S%Y%N%C% %I%N%C% "
13 PRINT AT 20,5;"PRESS ""ENTER"" TO START"
14 PAUSE 33000
15 RAND
16 LET V$="AEIOU"
17 CLS
18 DIM P(3)
19 DIM W$(3,10)
20 DIM L(5)
23 PRINT AT 6,0;"WHICH VOWELS DO YOU WANT TO USE?1=LONG",,"2=SHORT",,"3=BOTH",,"4=EXIT PROGRAM"
24 INPUT O
25 LET LS=O
26 CLS
27 IF O=4 THEN STOP
30 IF O=3 THEN LET LS=INT (RND*2)+1
31 FOR K=1 TO 3
32 FAST
40 LET L(K)=INT (RND*5)+1
50 NEXT K
60 IF L(1)=L(2) OR L(1)=L(3) OR L(2)=L(3) THEN GOTO 31
80 LET C=INT (RND*3)+1
90 LET A$=V$(L(C))
99 SLOW
100 FOR K=1 TO 3
105 LET Z=INT (RND*3)
110 LET X=10*K-5
120 GOSUB 700*LS+100*L(K)+30*Z
121 PRINT AT 10,P(K);W$(K)
130 PRINT AT 15,X;K
140 NEXT K
150 PRINT AT 19,14;"\:'\''\':";AT 20,14;"\: ";A$;"\ :";AT 21,14;"\:.\..\.:"
151 FOR J=1 TO 10
152 IF W$(C,J)="% " THEN GOTO 155
153 NEXT J
155 LET W$(C,J)=A$
156 INPUT R
157 IF R=9 THEN CLS
160 IF R=9 THEN GOTO 23
170 IF R<>C THEN PRINT AT 16,10*C-9;"% % % % % % % % % "
180 IF R=C THEN PRINT AT 16,10*C-9;"*********"
185 PRINT AT 13,P(C);W$(C)
190 PAUSE 250
195 CLS
200 GOTO 30
800 LET W$(K)="TR% IN"
801 LET P(K)=X-2
802 PRINT AT 2,X-1;"*";AT 3,X;"*";AT 4,X;"\ :\..\. ";AT 5,X-4;"\ :% \.:% \.:% % >";AT 6,X-4;"\ '\ '\ '\ '\ ' \ '"
803 RETURN
830 LET W$(K)="C% NE"
831 LET P(K)=X-1
832 PRINT AT 1,X+1;"\' ";AT 0,X-1;"\ .\''\. "
833 FOR Y=41 TO 30 STEP -1
834 PLOT 2*X-1,Y
835 NEXT Y
836 RETURN
860 LET W$(K)="D% YS"
861 LET P(K)=X-2
862 PRINT AT 2,X-1;"FRI.";AT 4,X-1;"SAT.";AT 6,X-1;"SUN."
863 RETURN
900 LET W$(K)="K% Y"
901 LET P(K)=X-1
902 PRINT AT 3,X-3;"% % ";AT 4,X-3;"% % \:'\''\':% % \' ";AT 5,X-3;"% % \ '\ :\ '"
903 RETURN
930 LET W$(K)="THR% E"
931 LET P(K)=X-2
932 PRINT AT 3,X-1;"\''\''\: ";AT 4,X+1;"\: ";AT 5,X-1;"\ '\''\: ";AT 6,X+1;"\: ";AT 7,X-1;"\''\''\' "
933 RETURN
960 LET W$(K)="KN% E"
961 LET P(K)=X-2
962 PRINT AT 0,X+1;"% \: ";AT 1,X+1;"\':\' ";AT 2,X+1;"\: ";AT 3,X;"\ :\ '\..\. ";AT 4,X;"\: ";AT 5,X-1;"\ :\ '\. ";AT 6,X-1;"\ : \ '\. <";AT 7,X-2;"\ .\' \: ";AT 8,X-2;"\'. \''"
968 RETURN
1000 LET W$(K)="F% VE"
1001 LET P(K)=X-2
1002 PRINT AT 2,X-1;"\:'\''\' ";AT 3,X-1;"\:.\. ";AT 4,X;"\ '\. ";AT 5,X-1;"\. \ .\' ";AT 6,X-1;"\ '\' "
1003 RETURN
1030 LET W$(K)="K% TE"
1031 LET P(K)=X-2
1032 PRINT AT 0,X;"\.:\. ";AT 1,X-1;"\ .\':\'.";AT 2,X-1;"\.:\.:\.:\. ";AT 3,X-1;"\ :\ :\ :";AT 4,X;"% \: ";AT 5,X;"\ :";AT 6,X+1;"\'.";AT 7,X+1;"\.'";AT 8,X+1;"\ '"
1033 RETURN
1060 LET W$(K)="N% NE"
1061 LET P(K)=X-2
1063 PRINT AT 2,X-1;"\:'\''\: ";AT 3,X-1;"\: \: ";AT 4,X-1;"\''\''\: ";AT 5,X-1;"\. \: ";AT 6,X-1;"\''\''\' "
1064 RETURN
1100 LET W$(K)="B% AT"
1101 LET P(K)=X-2
1102 PRINT AT 1,X-2;"\..\..\..\..\. ";AT 2,X-2;"\ '\. \ '\. ";AT 3,X-1;"\.' \.'";AT 4,X-2;"\ '\''\':\''\''";AT 5,X-4;"\..\..\..\..\.:\..\..\..>";AT 6,X-4;"\':% % % % % \:'";AT 7,X-3;"\''\''\''\''\''"
1103 RETURN
1130 LET W$(K)="THR% W"
1131 LET P(K)=X-2
1132 PRINT AT 2,X+2;">";AT 3,X-2;"\ :% >\ '";AT 4,X-2;"\ '\:' \.'";AT 5,X-3;"\ .\''\:'\''";AT 6,X-3;"\' \: ";AT 7,X-2;"\.'\ '\. ";AT 8,X-3;"\ ' \ '"
1133 RETURN
1160 LET W$(K)="N% SE"
1161 LET P(K)=X-2
1162 PRINT AT 1,X-1;"\ .% \. ";AT 2,X-1;"% \:.\:.";AT 3,X-1;"% % \' ";AT 4,X-1;"\':\:'\' "
1163 FOR G=1 TO 3
1164 PRINT AT 2,1+X;"\: "
1165 LET U=USR 16514
1166 PRINT AT 2,X+1;"\:."
1167 LET U=USR 16514
1168 NEXT G
1169 RETURN
1200 LET W$(K)="% NITED"
1201 LET P(K)=X-3
1202 PRINT AT 1,X-3;"\..\..\..\..\..\. \.:";AT 2,X-4;"\ .% % % % % % \.:% ";AT 3,X-4;"\ :AMERICA\: ";AT 4,X-4;"\ '% % % % % % % \: ";AT 5,X-3;"\''\''% % % % % \: ";AT 6,X;"\':\:' \: ";AT 7,X+1;"\' "
1203 PRINT AT 11,P(K);"STATES"
1204 RETURN
1230 LET W$(K)="F% EL"
1231 LET P(K)=X-2
1232 PRINT AT 1,X-4;"\##\##\##";AT 2,X-4;"\##%G\##";AT 3,X-4;"\##%A\##";AT 4,X-4;"\##%S\##\'. \:'\''\':";AT 5,X-4;"\##\##\##\ '\..\:.\..\.:";AT 6,X-4;"\##\##\## % % % ";AT 7,X-4;"\##\##\## \: \ :"
1233 RETURN
1260 LET W$(K)="T% BE"
1261 LET P(K)=X-2
1262 PRINT AT 2,X-4;"\ .\..\..\..\..\..\..\..\. ";AT 3,X-4;"\ :\##TOOTH\##\:.";AT 4,X-4;"\ :\##PASTE\##\:'";AT 5,X-4;"\ '\''\''\''\''\''\''\''\' "
1263 RETURN
1500 LET W$(K)="FL% G"
1501 LET P(K)=X-2
1503 LET B=X-4
1504 PRINT AT 0,B;"\ .\..\..\..\..\..\..\..";AT 1,B;"\ :***\:'\''\''\':";AT 2,B;"\ :***\:'\''\''\':";AT 3,B;"\ :\''\''\''\''\''\''\':";AT 4,B;"\ :\''\''\''\''\''\''\':";AT 5,B;"\ :\''\''\''\''\''\''\''";AT 6,B;"\ :"
1505 RETURN
1530 LET W$(K)="% DD"
1531 LET P(K)=X-1
1532 PRINT AT 1,X-2;"3+2=\##";AT 3,X;"75";AT 4,X-1;"+23";AT 5,X-1;"\''\''\''"
1533 RETURN
1560 LET W$(K)="P% N"
1561 LET P(K)=X-1
1562 PRINT AT 3,X-3;"\..\..\..\..";AT 4,X-4;"\ :\' \ '\:.\..\..\..";AT 5,X-4;"\ :\:.\..\..\.:\: ";AT 6,X-4;"\ '% % % % \' "
1563 RETURN
1600 LET W$(K)="T% N"
1601 LET P(K)=X-1
1602 LET B=X-2
1603 PRINT AT 2,B;"\ : \:'\''\':";AT 3,B;"\ : \: \ :";AT 4,B;"\ : \: \ :";AT 5,B;"\ : \:.\..\.:"
1604 RETURN
1630 LET W$(K)="DR% SS"
1631 LET P(K)=X-2
1632 PRINT AT 1,X-2;"\.:\:.\.:\:.";AT 2,X-3;"\ '\:'% % \':\' ";AT 3,X-2;"\ .% % \. ";AT 4,X-3;"\ .% % % % \. ";AT 5,X-4;"\ .% % % % % % \. "
1633 RETURN
1660 LET W$(K)="L% G"
1661 LET P(K)=X-1
1662 LET B=X-1
1663 PRINT AT 0,X;"% \: ";AT 1,X;"\':\' ";AT 2,B;"% % % \: ";AT 3,B;"\: % \: \: ";AT 4,B;"\' % \: \' ";AT 5,B;"\ :% % ";AT 6,B;"\ :\: \##<";AT 7,B;"\ :\: \##<"
1664 RETURN
1700 LET W$(K)="S% X"
1701 LET P(K)=X-1
1702 LET B=X-1
1703 PRINT AT 1,X;"\..";AT 2,B;"\.' \' ";AT 3,B;"\: ";AT 4,B;"\:.\''\'.";AT 5,B;"\: \ :";AT 6,B;"\ '\..\' "
1704 RETURN
1730 LET W$(K)="SH% P"
1731 LET P(K)=X-2
1732 PRINT AT 3,X-3;"\..\:.\:.\. ";AT 4,X-5;"\ .\..% \:'% \:'% \:'% \:'";AT 5,X-4;"\':\:.% \:.% \:.% \:'";AT 6,X-5;"\@@\@@\@@\@@\@@\@@\@@\@@\@@\@@"
1733 RETURN
1760 LET W$(K)="WR% ST"
1761 LET P(K)=X-2
1762 LET B=X-1
1763 PRINT AT 0,B;"\..\..\..";AT 1,B;"\:'% \':";AT 2,B;"% \''% ";AT 3,B;"\''% \''"
1764 LET B=X-2
1765 PRINT AT 4,B;"% % % % % ";AT 5,B;"% \ :% \: % ";AT 6,B-1;">\##\ :% \: \##<";AT 7,B;"W W"
1766 RETURN
1800 LET W$(K)="P% T"
1801 LET P(K)=X-1
1802 PRINT AT 1,X-2;"\..";AT 2,X-4;"\ .\'' \''\. ";AT 3,X-4;"\:. \.:\..\..\..";AT 4,X-4;"% % \..% % ";AT 5,X-4;"\':% % % \:'";AT 6,X-3;"\ '\''\' "
1803 RETURN
1830 LET W$(K)="CL% CK"
1831 LET P(K)=X-3
1832 PRINT AT 1,X;"\..\. ";AT 2,X-2;"\ .\''\ .\ '\'.";AT 3,X-2;"\: \ : \: ";AT 4,X-3;"\ : \ :\..\. \ :";AT 5,X-3;"\ '\. \.'";AT 6,X-2;"\'. \ .\' ";AT 7,X-1;"\''\..\.'\' "
1833 RETURN
1860 LET W$(K)="ST% P"
1861 LET P(K)=X-2
1862 PRINT AT 0,X-2;"\ .% % \. ";AT 1,X-3;"\ .% % % % \. ";AT 2,X-3;"% ST P% ";AT 3,X-3;"% % % % % % ";AT 4,X-3;"\ '% % % % \' ";AT 5,X-2;"\ '% % \' ";AT 6,X-1;"\ :\: ";AT 7,X-1;"\ :\: "
1863 RETURN
1900 LET W$(K)="G% N"
1901 LET P(K)=X-1
1902 LET B=X-4
1903 PRINT AT 2,B;"\ :% % % % % -->";AT 3,B;"\ :\: \: \:'\''";AT 4,B;"\ :\:.\..\: ";AT 5,B;"\ :\: "
1904 RETURN
1930 LET W$(K)="DR% M"
1931 LET P(K)=X-2
1932 PRINT AT 0,X+2;"/";AT 1,X-1;"\.. \ ' /";AT 2,X-3;"\ .\'' \''\. \ '";AT 3,X-3;"\:. \.:";AT 4,X-3;"% % \..% % ";AT 5,X-3;"\':% % % \:'";AT 6,X-2;"\ '\''\' "
1933 RETURN
1960 LET W$(K)="B% S"
1961 LET P(K)=X-1
1962 LET B=X-3
1963 PRINT AT 2,B;"% \''\:'\':\''% % ";AT 3,B;"% \..\:.\.:\..% \ :% ";AT 4,B;"% % % % % % \.:% ";AT 5,B+1;"\' \ '"
1964 RETURN
Note: Type-in program listings on this website use ZMAKEBAS notation for graphics characters.
People
E
Skip to content
Computer Tutor
Products: Computer Tutors: Alpha/Vowel Tutors
Developer(s): Lou Goldstein
Date: 1982
Type: Cassette
Platform(s): TS 1000
Tags: Education
AlphaTutor and VowelTutor are a paired set of educational programs designed to teach children letter recognition and vowel sounds through a picture-matching quiz format. Each round randomly selects three images drawn entirely in block graphics, displays them with numbered labels, and prompts the child to identify which picture matches a highlighted letter or vowel shown in a bordered box. The programs use computed GOSUB targets (e.g., `GOSUB 200*L(K)+500` and `GOSUB 700*LS+100*L(K)+30*Z`) to dispatch to one of 26 picture-drawing subroutines covering letters A–Z and multiple vowel-sound variants. VowelTutor extends the concept with separate long and short vowel word sets per letter, selected by a random or user-chosen mode flag, and includes an animated nose-sniffing and hat/smile flip routine via `USR 16514`, pointing to a small machine-code delay loop stored in the REM statement at line 1.
Program Analysis
This listing contains two related programs: AlphaTutor and VowelTutor, both credited to Lou Goldstein / SoftSync Inc., 1982. AlphaTutor covers all 26 letters of the alphabet; VowelTutor extends the concept to long and short vowel sounds, offering multiple word variants per vowel. Both share the same core quiz loop and picture-rendering architecture.
Program Structure
Both programs follow the same top-level flow:
- Title/splash screen (lines 12–14), then
RAND to seed the RNG.
- Initialise arrays
P(3), W$(3,10), L(3) (lines 18–20).
- Main loop (lines 30–200): pick three distinct random indices, choose one as the target, dispatch to a drawing subroutine for each, display a letter/vowel prompt box, read a numeric answer, give feedback, pause, clear and repeat.
- Drawing subroutines: one per picture subject, each printing block-graphic art, setting
P(K) (label column) and W$(K) (word string).
VowelTutor adds a mode-selection screen (lines 23–27) offering long vowels, short vowels, or both, stored in LS, and allows the user to return to mode selection by entering 9.
Computed GOSUB Dispatch
The most architecturally notable feature is the use of arithmetic expressions as GOSUB targets to select picture subroutines without IF/THEN chains:
- AlphaTutor:
GOSUB 200*L(K)+500 — with L(K) in 0–25, this generates targets 500 (A=ambulance), 700 (B=boy), 900 (C=car) … 5500 (Z=zigzag), spaced 200 apart.
- VowelTutor:
GOSUB 700*LS+100*L(K)+30*Z — the LS factor (1=long, 2=short) shifts into a separate bank of subroutines; L(K) selects the vowel (1–5 = A/E/I/O/U); Z (0–2) selects one of up to three word variants per vowel per length.
This is a compact and efficient dispatch mechanism that avoids long IF/THEN chains entirely, at the cost of requiring subroutines to be placed at exactly the computed line numbers.
Machine Code Usage
Line 1 in both programs is a REM statement whose body encodes a short Z80 machine-code routine. The sequence \06\01\C5\06\64\00\10\FD\C1\10\F7\C9 disassembles as:
LD B,1 — outer loop count
PUSH BC
LD B,100 ; LD C,0 — inner delay count (25600 iterations)
DJNZ $ — inner loop
POP BC ; DJNZ … — outer loop
RET
This routine is called via LET E=USR 16514 (the address of the REM body in the VowelTutor variant is slightly longer, hence a different offset in practice). It is used as a simple software delay in animation sequences — for example, the hat flip in AlphaTutor (lines 1901–1906), the smile animation (lines 4101–4106), and the nose-sniffing effect (lines 1163–1168 in VowelTutor).
Key BASIC Idioms
- Block graphic art: All pictures are rendered using the ZX81/TS1000 block graphic characters (2×2 pixel sub-characters), encoded here as zmakebas escape sequences such as
\ ., \:., \'', etc.
- Distinct random selection: Lines 60 check
L(1)=L(2) OR L(1)=L(3) OR L(2)=L(3) and loop back if any two indices collide, ensuring three distinct pictures appear each round.
- Column positioning via formula:
LET X=10*K-5 (line 110) distributes the three picture columns evenly across the 32-character screen (columns 5, 15, 25).
- Answer box: The target letter is displayed in a bordered box drawn with block graphics at lines 19–21 using
AT positioning.
- PLOT for QUEEN and CONE: The subroutines at lines 3700 and 830 use
PLOT with pixel coordinates to draw vertical lines, since the block graphic resolution is insufficient for narrow strokes.
VowelTutor Word-Embedding Technique
In VowelTutor, word labels use a space character as a placeholder for the missing vowel (e.g., "TR% IN" for TRAIN, "K% TE" for KITE). After the round is set up, lines 151–155 scan W$(C) character-by-character to find the first "% " (space) position, then replace it with the actual vowel character A$ — effectively filling in the blank dynamically. This lets the same word string serve as both a gapped display and, after substitution, the correct spelled form.
Notable Subroutine Sharing
AlphaTutor’s GIRL subroutine (line 1700) is shared with BOY (line 700): the BOY subroutine calls GOSUB 1700 to draw the upper body, then the shared routine checks IF L(K)=1 THEN RETURN (line 1710) to exit early for BOY, or continues to draw the skirt/legs for GIRL. Similarly, VowelTutor’s WOMAN subroutine (line 4900) reuses the MAN subroutine (line 2900) for the head and torso, then overprints with different lower-body graphics.
Array Sizing
Array Dimensions Purpose P(3)3 elements Column position for each picture’s word label W$(3,10)3 strings × 10 chars Word associated with each picture slot L(3) / L(5)3 (Alpha) / 5 (Vowel) Random index for picture selection
Potential Anomalies
- AlphaTutor has no subroutine at the computed target for letter index 0 (line 500 handles A=0, as
200*0+500=500) — this is correct; L(K)=INT(RND*26) yields 0–25, mapping to lines 500–5500.
- VowelTutor’s
GOSUB 700*LS+100*L(K)+30*Z for LS=2 (short vowels) can yield targets like 1400+30*Z (lines 1400, 1430, 1460) which are not all defined in the listing — some short-vowel variant slots appear absent, which would cause a BASIC error if selected. This may reflect incomplete subroutine coverage in the original listing.
- The
PAUSE 33000 at line 14 provides a long title-screen pause (~30 seconds at normal speed) but any key press does not skip it — the user must wait it out unless they press BREAK.
- In VowelTutor, the
\## sequences in several subroutines (e.g., lines 1232, 1262, 1532) are not standard zmakebas escape sequences and likely represent inverse-video block characters or UDGs in the original tape file that were not fully decoded in this transcription.
Content
Source Code
1 REM \06\01\C5\06\64\00\10\FD\C1\10\F7\C9\2E\2E\2E\2E\2E\2E
2 SAVE "AB%C"
12 PRINT AT 8,11;"ALPHATUTOR";AT 10,2;"COPYRIGHT 1982 LOU GOLDSTEIN";AT 12,6;"% %F%R%O%M% %S%O%F%T%S%Y%N%C% %I%N%C% "
13 PRINT AT 20,5;"PRESS ""ENTER"" TO START"
14 PAUSE 33000
15 RAND
17 CLS
18 DIM P(3)
19 DIM W$(3,10)
20 DIM L(3)
30 FOR K=1 TO 3
40 LET L(K)=INT (RND*26)
50 NEXT K
60 IF L(1)=L(2) OR L(1)=L(3) OR L(2)=L(3) THEN GOTO 30
80 LET C=INT (RND*3)+1
90 LET A$=CHR$ (L(C)+38)
100 FOR K=1 TO 3
110 LET X=10*K-5
120 GOSUB 200*L(K)+500
121 PRINT AT 10,P(K);"% ";W$(K,2 TO )
130 PRINT AT 15,X;K
140 NEXT K
150 PRINT AT 19,14;"\:'\''\':";AT 20,14;"\: ";A$;"\ :";AT 21,14;"\:.\..\.:"
160 INPUT R
170 IF R<>C THEN PRINT AT 16,10*C-9;"% % % % % % % % % "
180 IF R=C THEN PRINT AT 16,10*C-9;"*********"
185 PRINT AT 13,P(C);W$(C)
190 PAUSE 250
195 CLS
200 GOTO 30
500 PRINT AT 3,X-3;"\..\..\..\..";AT 4,X-3;"\: \ . \ :";AT 5,X-3;"\: \':\' \ '\''\':";AT 6,X-3;"\:.\..\..\..\..\.:";AT 7,X-3;"\' \' "
501 LET P(K)=X-4
502 LET W$(K)="AMBULANCE"
510 RETURN
700 GOSUB 1700
710 PRINT AT 4,X;"\ :";AT 5,X;"\.'\. ";AT 6,X-1;"\.' \ '\. ";AT 7,X-2;"\.' \ '\. "
711 LET P(K)=X-1
712 LET W$(K)="BOY"
720 RETURN
900 PRINT AT 5,X-3;"\ :% % % ";AT 6,X-3;"\ :% % % % % ";AT 7,X-2;"\' \ '"
901 LET P(K)=X-1
902 LET W$(K)="CAR"
910 RETURN
1100 PRINT AT 1,X-4;"\ . \:.\. ";AT 2,X-3;"\'. % \. ";AT 3,X-2;"% % % ";AT 4,X-2;"\:'\''\':";AT 5,X-2;"\: \ :"
1101 LET P(K)=X-1
1102 LET W$(K)="DOG"
1110 RETURN
1300 PRINT AT 1,X-4;"\ .% % % \..";AT 2,X-4;"% % % % \.:";AT 3,X-4;"\':% % \:'\ '\..\' ";AT 4,X-4;"\ : \: "
1301 LET P(K)=X-4
1302 LET W$(K)="ELEPHANT"
1310 RETURN
1500 PRINT AT 1,X-4;"\ . \ .\..";AT 2,X-4;"\ :\:.\.:% % \':\. ";AT 3,X-4;"\ :% % % % % \. ";AT 4,X-4;"\ :\' \ '\':\:'\' "
1501 LET P(K)=X-2
1502 LET W$(K)="FISH"
1510 RETURN
1700 PRINT AT 0,X;"% \: ";AT 1,X;"\':\' ";AT 2,X-1;"\ .\':\'.";AT 3,X-1;"\' \ : \' "
1710 IF L(K)=1 THEN RETURN
1720 PRINT AT 4,X;"\.:\. ";AT 5,X-1;"\.:% % \. ";AT 6,X-2;"\ '\:'\''\''\:'";AT 7,X-1;"\: \: "
1721 LET P(K)=X-2
1722 LET W$(K)="GIRL"
1730 RETURN
1900 PRINT AT 1,X-2;">\ .\..\..\. <";AT 2,X-1;"\.:% % \:.";AT 3,X-1;"\ :..\: ";AT 4,X-1;"\ : \: ";AT 5,X-1;"\ :\ '\' \: ";AT 6,X;"\''\''"
1901 FOR F=1 TO 2
1902 PRINT AT 1,X-1;" ";AT 2,X-1;"\ .\..\..\. "
1903 LET E=USR 16514
1904 PRINT AT 1,X-1;"\ .\..\..\. ";AT 2,X-1;"\.:% % \:."
1905 LET E=USR 16514
1906 NEXT F
1907 LET P(K)=X-1
1908 LET W$(K)="HAT"
1910 RETURN
2100 PRINT AT 1,X-1;"\ :";AT 2,X-1;"\ :";AT 3,X-2;"\ .\''\''\''\. ";AT 4,X-2;"\ :\~~\~~\~~\: ";AT 5,X-2;"\ :\ ' \' \: ";AT 6,X-2;"\ :\ .\..\. \: ";AT 7,X-2;"\ '\..\..\..\' "
2101 LET P(K)=X-3
2102 LET W$(K)="INDIAN"
2110 RETURN
2300 PRINT AT 1,X-3;"---\:.";AT 2,X-3;"\':\..\..\.:\:.\..";AT 3,X-3;"\ :\..\..\..\..\..% >";AT 4,X-3;"---\ .\:'";AT 5,X-3;"---\:'"
2301 LET P(K)=X-1
2302 LET W$(K)="JET"
2310 RETURN
2500 LET P(K)=X-2
2522 LET W$(K)="KING"
2523 PRINT AT 1,X-2;"\. \. \. \. \. ";AT 2,X-2;"\':\''\''\':\' ";AT 3,X-2;"\ :\ '\ '\ :";AT 4,X-2;"\ : \' \ :";AT 5,X-2;"\ :\ '\''\ :";AT 6,X-1;"\':% \' "
2530 RETURN
2700 PRINT AT 2,X-3;"A B C D";AT 3,X-2;"E F G"
2701 LET P(K)=X-4
2702 LET W$(K)="LETTERS"
2710 RETURN
2900 PRINT AT 1,X;"% \: ";AT 2,X;"\':\' ";AT 3,X-1;"% % % \: ";AT 4,X-1;"\: % \: \: ";AT 5,X-1;"\' % \: \' "
2910 IF L(K)=22 THEN RETURN
2920 PRINT AT 6,X-1;"\ :% % ";AT 7,X-1;"\ :\: % ";AT 8,X-1;"\ :\: % "
2921 LET P(K)=X-1
2922 LET W$(K)="MAN"
2930 RETURN
3100 PRINT AT 3,X-3;"1 2 3 4";AT 4,X-2;"5 6 7"
3101 LET P(K)=X-3
3102 LET W$(K)="NUMBERS"
3110 RETURN
3300 PRINT AT 1,X-4;"\. ";AT 2,X-4;"\ '\'. \.:\. \..\. ";AT 3,X-2;"\':% % \''";AT 4,X-4;"\ .\.'\':% % \.. \.'";AT 5,X-4;"\' \ .\.'\.'\.'\. \''";AT 6,X-4;"\ .\' \ .\' \'.\ '\'.";AT 7,X-4;"\' \ .\' \ '\. "
3301 LET P(K)=X-3
3302 LET W$(K)="OCTOPUS"
3310 RETURN
3500 PRINT AT 5,X-2;"\..\..\..\..% ";AT 4,X+2;"*";AT 3,X+2;"*"
3501 LET P(K)=X-1
3502 LET W$(K)="PIPE"
3510 RETURN
3700 GOSUB 2500
3710 FOR Y=38 TO 29 STEP -1
3720 PLOT 2*X-4,Y
3730 PLOT 2*X+4,Y
3740 NEXT Y
3751 LET P(K)=X-2
3752 LET W$(K)="QUEEN"
3760 RETURN
3900 PRINT AT 1,X;"A";AT 2,X;"% ";AT 3,X;"% ";AT 4,X;"% ";AT 5,X;"% ";AT 6,X-1;"\..% \..";AT 7,X-1;"\' *\ '";AT 8,X;"*"
3901 LET P(K)=X-3
3902 LET W$(K)="ROCKET"
3910 RETURN
4100 PRINT AT 1,X-1;"\..\..\..";AT 2,X-2;"\ :\ . \. \: ";AT 3,X-2;"\ : \: ";AT 4,X-3;">\ :\ . \. \: <";AT 5,X-2;"\ : \'' \: ";AT 6,X-1;"\''\''\''"
4101 FOR F=1 TO 2
4102 PRINT AT 4,X-1;" ";AT 5,X-1;"\ '\''\' "
4103 LET E=USR 16514
4104 PRINT AT 4,X-1;"\ . \. ";AT 5,X-1;" \'' "
4105 LET E=USR 16514
4106 NEXT F
4107 LET P(K)=X-2
4108 LET W$(K)="SMILE"
4110 RETURN
4300 PRINT AT 1,X-1;"\ .% \. ";AT 2,X-2;"\ .% % % \. ";AT 3,X-2;"% % % % % ";AT 4,X-2;"\ '% % % \' ";AT 5,X-1;"\ '% \' ";AT 6,X;"% ";AT 7,X-1;"\ .% \. "
4301 LET P(K)=X-2
4302 LET W$(K)="TREE"
4310 RETURN
4500 PRINT AT 1,X;"\.:\. ";AT 2,X-1;"\.'\ :\ '\. ";AT 3,X;"\ :";AT 4,X;"\ :"
4501 LET P(K)=X-1
4502 LET W$(K)="UP"
4510 RETURN
4700 PRINT AT 2,X-2;"\ .\. \..";AT 3,X-2;"% % \. \.:% \: ";AT 4,X-2;"\':% % % % \' ";AT 5,X-1;"\':% % \' ";AT 6,X;"\':\' "
4701 LET P(K)=X-4
4702 LET W$(K)="VALENTINE"
4710 RETURN
4900 GOSUB 2900
4910 PRINT AT 6,X-1;"\.:% % \. ";AT 7,X-2;"\.:% % % % \. ";AT 8,X-1;"\ :\: % "
4911 LET P(K)=X-2
4912 LET W$(K)="WOMAN"
4920 RETURN
5100 PRINT AT 1,X-3;"\: \: \: \: \: \: \: ";AT 2,X-3;"\: \: \: \: \: \' ";AT 3,X-3;"\: \: \: \' \. ";AT 4,X-3;"\: \' \. /";AT 5,X-1;"/"
5101 LET P(K)=X-4
5102 LET W$(K)="XYLOPHONE"
5110 RETURN
5300 PRINT AT 1,X-1;"\ .% \. ";AT 2,X-1;"% % \':";AT 3,X-1;"% % % \. <";AT 4,X-1;"% % \''<";AT 5,X-1;"% % \.. <";AT 6,X-1;"\ :% "
5301 LET P(K)=X-1
5302 LET W$(K)="YELL"
5310 RETURN
5500 PRINT AT 3,X-2;"\.'\. \.'";AT 4,X-3;"\ ' \ '\. \.'\.'";AT 5,X;"\ '"
5501 LET P(K)=X-3
5502 LET W$(K)="ZIGZAG"
5510 RETURN
1 REM \06\01\C5\06\64\00\10\FD\C1\10\F7\C9\2E\2E\2E\2E\2E\2E\2E\2E\2E\2E\2E
2 SAVE "VOWE%L"
12 PRINT AT 8,11;"VOWELTUTOR";AT 10,2;"COPYRIGHT 1982 LOU GOLDSTEIN";AT 12,7;"% %F%R%O%M% %S%O%F%T%S%Y%N%C% %I%N%C% "
13 PRINT AT 20,5;"PRESS ""ENTER"" TO START"
14 PAUSE 33000
15 RAND
16 LET V$="AEIOU"
17 CLS
18 DIM P(3)
19 DIM W$(3,10)
20 DIM L(5)
23 PRINT AT 6,0;"WHICH VOWELS DO YOU WANT TO USE?1=LONG",,"2=SHORT",,"3=BOTH",,"4=EXIT PROGRAM"
24 INPUT O
25 LET LS=O
26 CLS
27 IF O=4 THEN STOP
30 IF O=3 THEN LET LS=INT (RND*2)+1
31 FOR K=1 TO 3
32 FAST
40 LET L(K)=INT (RND*5)+1
50 NEXT K
60 IF L(1)=L(2) OR L(1)=L(3) OR L(2)=L(3) THEN GOTO 31
80 LET C=INT (RND*3)+1
90 LET A$=V$(L(C))
99 SLOW
100 FOR K=1 TO 3
105 LET Z=INT (RND*3)
110 LET X=10*K-5
120 GOSUB 700*LS+100*L(K)+30*Z
121 PRINT AT 10,P(K);W$(K)
130 PRINT AT 15,X;K
140 NEXT K
150 PRINT AT 19,14;"\:'\''\':";AT 20,14;"\: ";A$;"\ :";AT 21,14;"\:.\..\.:"
151 FOR J=1 TO 10
152 IF W$(C,J)="% " THEN GOTO 155
153 NEXT J
155 LET W$(C,J)=A$
156 INPUT R
157 IF R=9 THEN CLS
160 IF R=9 THEN GOTO 23
170 IF R<>C THEN PRINT AT 16,10*C-9;"% % % % % % % % % "
180 IF R=C THEN PRINT AT 16,10*C-9;"*********"
185 PRINT AT 13,P(C);W$(C)
190 PAUSE 250
195 CLS
200 GOTO 30
800 LET W$(K)="TR% IN"
801 LET P(K)=X-2
802 PRINT AT 2,X-1;"*";AT 3,X;"*";AT 4,X;"\ :\..\. ";AT 5,X-4;"\ :% \.:% \.:% % >";AT 6,X-4;"\ '\ '\ '\ '\ ' \ '"
803 RETURN
830 LET W$(K)="C% NE"
831 LET P(K)=X-1
832 PRINT AT 1,X+1;"\' ";AT 0,X-1;"\ .\''\. "
833 FOR Y=41 TO 30 STEP -1
834 PLOT 2*X-1,Y
835 NEXT Y
836 RETURN
860 LET W$(K)="D% YS"
861 LET P(K)=X-2
862 PRINT AT 2,X-1;"FRI.";AT 4,X-1;"SAT.";AT 6,X-1;"SUN."
863 RETURN
900 LET W$(K)="K% Y"
901 LET P(K)=X-1
902 PRINT AT 3,X-3;"% % ";AT 4,X-3;"% % \:'\''\':% % \' ";AT 5,X-3;"% % \ '\ :\ '"
903 RETURN
930 LET W$(K)="THR% E"
931 LET P(K)=X-2
932 PRINT AT 3,X-1;"\''\''\: ";AT 4,X+1;"\: ";AT 5,X-1;"\ '\''\: ";AT 6,X+1;"\: ";AT 7,X-1;"\''\''\' "
933 RETURN
960 LET W$(K)="KN% E"
961 LET P(K)=X-2
962 PRINT AT 0,X+1;"% \: ";AT 1,X+1;"\':\' ";AT 2,X+1;"\: ";AT 3,X;"\ :\ '\..\. ";AT 4,X;"\: ";AT 5,X-1;"\ :\ '\. ";AT 6,X-1;"\ : \ '\. <";AT 7,X-2;"\ .\' \: ";AT 8,X-2;"\'. \''"
968 RETURN
1000 LET W$(K)="F% VE"
1001 LET P(K)=X-2
1002 PRINT AT 2,X-1;"\:'\''\' ";AT 3,X-1;"\:.\. ";AT 4,X;"\ '\. ";AT 5,X-1;"\. \ .\' ";AT 6,X-1;"\ '\' "
1003 RETURN
1030 LET W$(K)="K% TE"
1031 LET P(K)=X-2
1032 PRINT AT 0,X;"\.:\. ";AT 1,X-1;"\ .\':\'.";AT 2,X-1;"\.:\.:\.:\. ";AT 3,X-1;"\ :\ :\ :";AT 4,X;"% \: ";AT 5,X;"\ :";AT 6,X+1;"\'.";AT 7,X+1;"\.'";AT 8,X+1;"\ '"
1033 RETURN
1060 LET W$(K)="N% NE"
1061 LET P(K)=X-2
1063 PRINT AT 2,X-1;"\:'\''\: ";AT 3,X-1;"\: \: ";AT 4,X-1;"\''\''\: ";AT 5,X-1;"\. \: ";AT 6,X-1;"\''\''\' "
1064 RETURN
1100 LET W$(K)="B% AT"
1101 LET P(K)=X-2
1102 PRINT AT 1,X-2;"\..\..\..\..\. ";AT 2,X-2;"\ '\. \ '\. ";AT 3,X-1;"\.' \.'";AT 4,X-2;"\ '\''\':\''\''";AT 5,X-4;"\..\..\..\..\.:\..\..\..>";AT 6,X-4;"\':% % % % % \:'";AT 7,X-3;"\''\''\''\''\''"
1103 RETURN
1130 LET W$(K)="THR% W"
1131 LET P(K)=X-2
1132 PRINT AT 2,X+2;">";AT 3,X-2;"\ :% >\ '";AT 4,X-2;"\ '\:' \.'";AT 5,X-3;"\ .\''\:'\''";AT 6,X-3;"\' \: ";AT 7,X-2;"\.'\ '\. ";AT 8,X-3;"\ ' \ '"
1133 RETURN
1160 LET W$(K)="N% SE"
1161 LET P(K)=X-2
1162 PRINT AT 1,X-1;"\ .% \. ";AT 2,X-1;"% \:.\:.";AT 3,X-1;"% % \' ";AT 4,X-1;"\':\:'\' "
1163 FOR G=1 TO 3
1164 PRINT AT 2,1+X;"\: "
1165 LET U=USR 16514
1166 PRINT AT 2,X+1;"\:."
1167 LET U=USR 16514
1168 NEXT G
1169 RETURN
1200 LET W$(K)="% NITED"
1201 LET P(K)=X-3
1202 PRINT AT 1,X-3;"\..\..\..\..\..\. \.:";AT 2,X-4;"\ .% % % % % % \.:% ";AT 3,X-4;"\ :AMERICA\: ";AT 4,X-4;"\ '% % % % % % % \: ";AT 5,X-3;"\''\''% % % % % \: ";AT 6,X;"\':\:' \: ";AT 7,X+1;"\' "
1203 PRINT AT 11,P(K);"STATES"
1204 RETURN
1230 LET W$(K)="F% EL"
1231 LET P(K)=X-2
1232 PRINT AT 1,X-4;"\##\##\##";AT 2,X-4;"\##%G\##";AT 3,X-4;"\##%A\##";AT 4,X-4;"\##%S\##\'. \:'\''\':";AT 5,X-4;"\##\##\##\ '\..\:.\..\.:";AT 6,X-4;"\##\##\## % % % ";AT 7,X-4;"\##\##\## \: \ :"
1233 RETURN
1260 LET W$(K)="T% BE"
1261 LET P(K)=X-2
1262 PRINT AT 2,X-4;"\ .\..\..\..\..\..\..\..\. ";AT 3,X-4;"\ :\##TOOTH\##\:.";AT 4,X-4;"\ :\##PASTE\##\:'";AT 5,X-4;"\ '\''\''\''\''\''\''\''\' "
1263 RETURN
1500 LET W$(K)="FL% G"
1501 LET P(K)=X-2
1503 LET B=X-4
1504 PRINT AT 0,B;"\ .\..\..\..\..\..\..\..";AT 1,B;"\ :***\:'\''\''\':";AT 2,B;"\ :***\:'\''\''\':";AT 3,B;"\ :\''\''\''\''\''\''\':";AT 4,B;"\ :\''\''\''\''\''\''\':";AT 5,B;"\ :\''\''\''\''\''\''\''";AT 6,B;"\ :"
1505 RETURN
1530 LET W$(K)="% DD"
1531 LET P(K)=X-1
1532 PRINT AT 1,X-2;"3+2=\##";AT 3,X;"75";AT 4,X-1;"+23";AT 5,X-1;"\''\''\''"
1533 RETURN
1560 LET W$(K)="P% N"
1561 LET P(K)=X-1
1562 PRINT AT 3,X-3;"\..\..\..\..";AT 4,X-4;"\ :\' \ '\:.\..\..\..";AT 5,X-4;"\ :\:.\..\..\.:\: ";AT 6,X-4;"\ '% % % % \' "
1563 RETURN
1600 LET W$(K)="T% N"
1601 LET P(K)=X-1
1602 LET B=X-2
1603 PRINT AT 2,B;"\ : \:'\''\':";AT 3,B;"\ : \: \ :";AT 4,B;"\ : \: \ :";AT 5,B;"\ : \:.\..\.:"
1604 RETURN
1630 LET W$(K)="DR% SS"
1631 LET P(K)=X-2
1632 PRINT AT 1,X-2;"\.:\:.\.:\:.";AT 2,X-3;"\ '\:'% % \':\' ";AT 3,X-2;"\ .% % \. ";AT 4,X-3;"\ .% % % % \. ";AT 5,X-4;"\ .% % % % % % \. "
1633 RETURN
1660 LET W$(K)="L% G"
1661 LET P(K)=X-1
1662 LET B=X-1
1663 PRINT AT 0,X;"% \: ";AT 1,X;"\':\' ";AT 2,B;"% % % \: ";AT 3,B;"\: % \: \: ";AT 4,B;"\' % \: \' ";AT 5,B;"\ :% % ";AT 6,B;"\ :\: \##<";AT 7,B;"\ :\: \##<"
1664 RETURN
1700 LET W$(K)="S% X"
1701 LET P(K)=X-1
1702 LET B=X-1
1703 PRINT AT 1,X;"\..";AT 2,B;"\.' \' ";AT 3,B;"\: ";AT 4,B;"\:.\''\'.";AT 5,B;"\: \ :";AT 6,B;"\ '\..\' "
1704 RETURN
1730 LET W$(K)="SH% P"
1731 LET P(K)=X-2
1732 PRINT AT 3,X-3;"\..\:.\:.\. ";AT 4,X-5;"\ .\..% \:'% \:'% \:'% \:'";AT 5,X-4;"\':\:.% \:.% \:.% \:'";AT 6,X-5;"\@@\@@\@@\@@\@@\@@\@@\@@\@@\@@"
1733 RETURN
1760 LET W$(K)="WR% ST"
1761 LET P(K)=X-2
1762 LET B=X-1
1763 PRINT AT 0,B;"\..\..\..";AT 1,B;"\:'% \':";AT 2,B;"% \''% ";AT 3,B;"\''% \''"
1764 LET B=X-2
1765 PRINT AT 4,B;"% % % % % ";AT 5,B;"% \ :% \: % ";AT 6,B-1;">\##\ :% \: \##<";AT 7,B;"W W"
1766 RETURN
1800 LET W$(K)="P% T"
1801 LET P(K)=X-1
1802 PRINT AT 1,X-2;"\..";AT 2,X-4;"\ .\'' \''\. ";AT 3,X-4;"\:. \.:\..\..\..";AT 4,X-4;"% % \..% % ";AT 5,X-4;"\':% % % \:'";AT 6,X-3;"\ '\''\' "
1803 RETURN
1830 LET W$(K)="CL% CK"
1831 LET P(K)=X-3
1832 PRINT AT 1,X;"\..\. ";AT 2,X-2;"\ .\''\ .\ '\'.";AT 3,X-2;"\: \ : \: ";AT 4,X-3;"\ : \ :\..\. \ :";AT 5,X-3;"\ '\. \.'";AT 6,X-2;"\'. \ .\' ";AT 7,X-1;"\''\..\.'\' "
1833 RETURN
1860 LET W$(K)="ST% P"
1861 LET P(K)=X-2
1862 PRINT AT 0,X-2;"\ .% % \. ";AT 1,X-3;"\ .% % % % \. ";AT 2,X-3;"% ST P% ";AT 3,X-3;"% % % % % % ";AT 4,X-3;"\ '% % % % \' ";AT 5,X-2;"\ '% % \' ";AT 6,X-1;"\ :\: ";AT 7,X-1;"\ :\: "
1863 RETURN
1900 LET W$(K)="G% N"
1901 LET P(K)=X-1
1902 LET B=X-4
1903 PRINT AT 2,B;"\ :% % % % % -->";AT 3,B;"\ :\: \: \:'\''";AT 4,B;"\ :\:.\..\: ";AT 5,B;"\ :\: "
1904 RETURN
1930 LET W$(K)="DR% M"
1931 LET P(K)=X-2
1932 PRINT AT 0,X+2;"/";AT 1,X-1;"\.. \ ' /";AT 2,X-3;"\ .\'' \''\. \ '";AT 3,X-3;"\:. \.:";AT 4,X-3;"% % \..% % ";AT 5,X-3;"\':% % % \:'";AT 6,X-2;"\ '\''\' "
1933 RETURN
1960 LET W$(K)="B% S"
1961 LET P(K)=X-1
1962 LET B=X-3
1963 PRINT AT 2,B;"% \''\:'\':\''% % ";AT 3,B;"% \..\:.\.:\..% \ :% ";AT 4,B;"% % % % % % \.:% ";AT 5,B+1;"\' \ '"
1964 RETURN
Note: Type-in program listings on this website use ZMAKEBAS notation for graphics characters.
People
E
2 SAVE "AB%C"
12 PRINT AT 8,11;"ALPHATUTOR";AT 10,2;"COPYRIGHT 1982 LOU GOLDSTEIN";AT 12,6;"% %F%R%O%M% %S%O%F%T%S%Y%N%C% %I%N%C% "
13 PRINT AT 20,5;"PRESS ""ENTER"" TO START"
14 PAUSE 33000
15 RAND
17 CLS
18 DIM P(3)
19 DIM W$(3,10)
20 DIM L(3)
30 FOR K=1 TO 3
40 LET L(K)=INT (RND*26)
50 NEXT K
60 IF L(1)=L(2) OR L(1)=L(3) OR L(2)=L(3) THEN GOTO 30
80 LET C=INT (RND*3)+1
90 LET A$=CHR$ (L(C)+38)
100 FOR K=1 TO 3
110 LET X=10*K-5
120 GOSUB 200*L(K)+500
121 PRINT AT 10,P(K);"% ";W$(K,2 TO )
130 PRINT AT 15,X;K
140 NEXT K
150 PRINT AT 19,14;"\:'\''\':";AT 20,14;"\: ";A$;"\ :";AT 21,14;"\:.\..\.:"
160 INPUT R
170 IF R<>C THEN PRINT AT 16,10*C-9;"% % % % % % % % % "
180 IF R=C THEN PRINT AT 16,10*C-9;"*********"
185 PRINT AT 13,P(C);W$(C)
190 PAUSE 250
195 CLS
200 GOTO 30
500 PRINT AT 3,X-3;"\..\..\..\..";AT 4,X-3;"\: \ . \ :";AT 5,X-3;"\: \':\' \ '\''\':";AT 6,X-3;"\:.\..\..\..\..\.:";AT 7,X-3;"\' \' "
501 LET P(K)=X-4
502 LET W$(K)="AMBULANCE"
510 RETURN
700 GOSUB 1700
710 PRINT AT 4,X;"\ :";AT 5,X;"\.'\. ";AT 6,X-1;"\.' \ '\. ";AT 7,X-2;"\.' \ '\. "
711 LET P(K)=X-1
712 LET W$(K)="BOY"
720 RETURN
900 PRINT AT 5,X-3;"\ :% % % ";AT 6,X-3;"\ :% % % % % ";AT 7,X-2;"\' \ '"
901 LET P(K)=X-1
902 LET W$(K)="CAR"
910 RETURN
\n1100 PRINT AT 1,X-4;"\ . \:.\. ";AT 2,X-3;"\'. % \. ";AT 3,X-2;"% % % ";AT 4,X-2;"\:'\''\':";AT 5,X-2;"\: \ :"
\n1101 LET P(K)=X-1
\n1102 LET W$(K)="DOG"
\n1110 RETURN
\n1300 PRINT AT 1,X-4;"\ .% % % \..";AT 2,X-4;"% % % % \.:";AT 3,X-4;"\':% % \:'\ '\..\' ";AT 4,X-4;"\ : \: "
\n1301 LET P(K)=X-4
\n1302 LET W$(K)="ELEPHANT"
\n1310 RETURN
\n1500 PRINT AT 1,X-4;"\ . \ .\..";AT 2,X-4;"\ :\:.\.:% % \':\. ";AT 3,X-4;"\ :% % % % % \. ";AT 4,X-4;"\ :\' \ '\':\:'\' "
\n1501 LET P(K)=X-2
\n1502 LET W$(K)="FISH"
\n1510 RETURN
\n1700 PRINT AT 0,X;"% \: ";AT 1,X;"\':\' ";AT 2,X-1;"\ .\':\'.";AT 3,X-1;"\' \ : \' "
\n1710 IF L(K)=1 THEN RETURN
\n1720 PRINT AT 4,X;"\.:\. ";AT 5,X-1;"\.:% % \. ";AT 6,X-2;"\ '\:'\''\''\:'";AT 7,X-1;"\: \: "
\n1721 LET P(K)=X-2
\n1722 LET W$(K)="GIRL"
\n1730 RETURN
\n1900 PRINT AT 1,X-2;">\ .\..\..\. <";AT 2,X-1;"\.:% % \:.";AT 3,X-1;"\ :..\: ";AT 4,X-1;"\ : \: ";AT 5,X-1;"\ :\ '\' \: ";AT 6,X;"\''\''"
\n1901 FOR F=1 TO 2
\n1902 PRINT AT 1,X-1;" ";AT 2,X-1;"\ .\..\..\. "
\n1903 LET E=USR 16514
\n1904 PRINT AT 1,X-1;"\ .\..\..\. ";AT 2,X-1;"\.:% % \:."
\n1905 LET E=USR 16514
\n1906 NEXT F
\n1907 LET P(K)=X-1
\n1908 LET W$(K)="HAT"
\n1910 RETURN
\n2100 PRINT AT 1,X-1;"\ :";AT 2,X-1;"\ :";AT 3,X-2;"\ .\''\''\''\. ";AT 4,X-2;"\ :\~~\~~\~~\: ";AT 5,X-2;"\ :\ ' \' \: ";AT 6,X-2;"\ :\ .\..\. \: ";AT 7,X-2;"\ '\..\..\..\' "
\n2101 LET P(K)=X-3
\n2102 LET W$(K)="INDIAN"
\n2110 RETURN
\n2300 PRINT AT 1,X-3;"---\:.";AT 2,X-3;"\':\..\..\.:\:.\..";AT 3,X-3;"\ :\..\..\..\..\..% >";AT 4,X-3;"---\ .\:'";AT 5,X-3;"---\:'"
\n2301 LET P(K)=X-1
\n2302 LET W$(K)="JET"
\n2310 RETURN
\n2500 LET P(K)=X-2
\n2522 LET W$(K)="KING"
\n2523 PRINT AT 1,X-2;"\. \. \. \. \. ";AT 2,X-2;"\':\''\''\':\' ";AT 3,X-2;"\ :\ '\ '\ :";AT 4,X-2;"\ : \' \ :";AT 5,X-2;"\ :\ '\''\ :";AT 6,X-1;"\':% \' "
\n2530 RETURN
\n2700 PRINT AT 2,X-3;"A B C D";AT 3,X-2;"E F G"
\n2701 LET P(K)=X-4
\n2702 LET W$(K)="LETTERS"
\n2710 RETURN
\n2900 PRINT AT 1,X;"% \: ";AT 2,X;"\':\' ";AT 3,X-1;"% % % \: ";AT 4,X-1;"\: % \: \: ";AT 5,X-1;"\' % \: \' "
\n2910 IF L(K)=22 THEN RETURN
\n2920 PRINT AT 6,X-1;"\ :% % ";AT 7,X-1;"\ :\: % ";AT 8,X-1;"\ :\: % "
\n2921 LET P(K)=X-1
\n2922 LET W$(K)="MAN"
\n2930 RETURN
\n3100 PRINT AT 3,X-3;"1 2 3 4";AT 4,X-2;"5 6 7"
\n3101 LET P(K)=X-3
\n3102 LET W$(K)="NUMBERS"
\n3110 RETURN
\n3300 PRINT AT 1,X-4;"\. ";AT 2,X-4;"\ '\'. \.:\. \..\. ";AT 3,X-2;"\':% % \''";AT 4,X-4;"\ .\.'\':% % \.. \.'";AT 5,X-4;"\' \ .\.'\.'\.'\. \''";AT 6,X-4;"\ .\' \ .\' \'.\ '\'.";AT 7,X-4;"\' \ .\' \ '\. "
\n3301 LET P(K)=X-3
\n3302 LET W$(K)="OCTOPUS"
\n3310 RETURN
\n3500 PRINT AT 5,X-2;"\..\..\..\..% ";AT 4,X+2;"*";AT 3,X+2;"*"
\n3501 LET P(K)=X-1
\n3502 LET W$(K)="PIPE"
\n3510 RETURN
\n3700 GOSUB 2500
\n3710 FOR Y=38 TO 29 STEP -1
\n3720 PLOT 2*X-4,Y
\n3730 PLOT 2*X+4,Y
\n3740 NEXT Y
\n3751 LET P(K)=X-2
\n3752 LET W$(K)="QUEEN"
\n3760 RETURN
\n3900 PRINT AT 1,X;"A";AT 2,X;"% ";AT 3,X;"% ";AT 4,X;"% ";AT 5,X;"% ";AT 6,X-1;"\..% \..";AT 7,X-1;"\' *\ '";AT 8,X;"*"
\n3901 LET P(K)=X-3
\n3902 LET W$(K)="ROCKET"
\n3910 RETURN
\n4100 PRINT AT 1,X-1;"\..\..\..";AT 2,X-2;"\ :\ . \. \: ";AT 3,X-2;"\ : \: ";AT 4,X-3;">\ :\ . \. \: <";AT 5,X-2;"\ : \'' \: ";AT 6,X-1;"\''\''\''"
\n4101 FOR F=1 TO 2
\n4102 PRINT AT 4,X-1;" ";AT 5,X-1;"\ '\''\' "
\n4103 LET E=USR 16514
\n4104 PRINT AT 4,X-1;"\ . \. ";AT 5,X-1;" \'' "
\n4105 LET E=USR 16514
\n4106 NEXT F
\n4107 LET P(K)=X-2
\n4108 LET W$(K)="SMILE"
\n4110 RETURN
\n4300 PRINT AT 1,X-1;"\ .% \. ";AT 2,X-2;"\ .% % % \. ";AT 3,X-2;"% % % % % ";AT 4,X-2;"\ '% % % \' ";AT 5,X-1;"\ '% \' ";AT 6,X;"% ";AT 7,X-1;"\ .% \. "
\n4301 LET P(K)=X-2
\n4302 LET W$(K)="TREE"
\n4310 RETURN
\n4500 PRINT AT 1,X;"\.:\. ";AT 2,X-1;"\.'\ :\ '\. ";AT 3,X;"\ :";AT 4,X;"\ :"
\n4501 LET P(K)=X-1
\n4502 LET W$(K)="UP"
\n4510 RETURN
\n4700 PRINT AT 2,X-2;"\ .\. \..";AT 3,X-2;"% % \. \.:% \: ";AT 4,X-2;"\':% % % % \' ";AT 5,X-1;"\':% % \' ";AT 6,X;"\':\' "
\n4701 LET P(K)=X-4
\n4702 LET W$(K)="VALENTINE"
\n4710 RETURN
\n4900 GOSUB 2900
\n4910 PRINT AT 6,X-1;"\.:% % \. ";AT 7,X-2;"\.:% % % % \. ";AT 8,X-1;"\ :\: % "
\n4911 LET P(K)=X-2
\n4912 LET W$(K)="WOMAN"
\n4920 RETURN
\n5100 PRINT AT 1,X-3;"\: \: \: \: \: \: \: ";AT 2,X-3;"\: \: \: \: \: \' ";AT 3,X-3;"\: \: \: \' \. ";AT 4,X-3;"\: \' \. /";AT 5,X-1;"/"
\n5101 LET P(K)=X-4
\n5102 LET W$(K)="XYLOPHONE"
\n5110 RETURN
\n5300 PRINT AT 1,X-1;"\ .% \. ";AT 2,X-1;"% % \':";AT 3,X-1;"% % % \. <";AT 4,X-1;"% % \''<";AT 5,X-1;"% % \.. <";AT 6,X-1;"\ :% "
\n5301 LET P(K)=X-1
\n5302 LET W$(K)="YELL"
\n5310 RETURN
\n5500 PRINT AT 3,X-2;"\.'\. \.'";AT 4,X-3;"\ ' \ '\. \.'\.'";AT 5,X;"\ '"
\n5501 LET P(K)=X-3
\n5502 LET W$(K)="ZIGZAG"
\n5510 RETURN
1 REM itemtype='https://schema.org/Blog' itemscope='itemscope' class="wp-singular computer_media-template-default single single-computer_media postid-56671 wp-custom-logo wp-embed-responsive wp-theme-astra wp-child-theme-astra-child ast-desktop ast-separate-container ast-left-sidebar astra-4.12.6 group-blog ast-blog-single-style-1 ast-custom-post-type ast-single-post ast-inherit-site-logo-transparent ast-hfb-header ast-full-width-primary-header ast-box-layout ast-normal-title-enabled astra-addon-4.12.4"\C5
Skip to content
Computer Tutor
Products: Computer Tutors: Alpha/Vowel Tutors
Developer(s): Lou Goldstein
Date: 1982
Type: Cassette
Platform(s): TS 1000
Tags: Education
AlphaTutor and VowelTutor are a paired set of educational programs designed to teach children letter recognition and vowel sounds through a picture-matching quiz format. Each round randomly selects three images drawn entirely in block graphics, displays them with numbered labels, and prompts the child to identify which picture matches a highlighted letter or vowel shown in a bordered box. The programs use computed GOSUB targets (e.g., `GOSUB 200*L(K)+500` and `GOSUB 700*LS+100*L(K)+30*Z`) to dispatch to one of 26 picture-drawing subroutines covering letters A–Z and multiple vowel-sound variants. VowelTutor extends the concept with separate long and short vowel word sets per letter, selected by a random or user-chosen mode flag, and includes an animated nose-sniffing and hat/smile flip routine via `USR 16514`, pointing to a small machine-code delay loop stored in the REM statement at line 1.
Program Analysis
This listing contains two related programs: AlphaTutor and VowelTutor, both credited to Lou Goldstein / SoftSync Inc., 1982. AlphaTutor covers all 26 letters of the alphabet; VowelTutor extends the concept to long and short vowel sounds, offering multiple word variants per vowel. Both share the same core quiz loop and picture-rendering architecture.
Program Structure
Both programs follow the same top-level flow:
- Title/splash screen (lines 12–14), then
RAND to seed the RNG.
- Initialise arrays
P(3), W$(3,10), L(3) (lines 18–20).
- Main loop (lines 30–200): pick three distinct random indices, choose one as the target, dispatch to a drawing subroutine for each, display a letter/vowel prompt box, read a numeric answer, give feedback, pause, clear and repeat.
- Drawing subroutines: one per picture subject, each printing block-graphic art, setting
P(K) (label column) and W$(K) (word string).
VowelTutor adds a mode-selection screen (lines 23–27) offering long vowels, short vowels, or both, stored in LS, and allows the user to return to mode selection by entering 9.
Computed GOSUB Dispatch
The most architecturally notable feature is the use of arithmetic expressions as GOSUB targets to select picture subroutines without IF/THEN chains:
- AlphaTutor:
GOSUB 200*L(K)+500 — with L(K) in 0–25, this generates targets 500 (A=ambulance), 700 (B=boy), 900 (C=car) … 5500 (Z=zigzag), spaced 200 apart.
- VowelTutor:
GOSUB 700*LS+100*L(K)+30*Z — the LS factor (1=long, 2=short) shifts into a separate bank of subroutines; L(K) selects the vowel (1–5 = A/E/I/O/U); Z (0–2) selects one of up to three word variants per vowel per length.
This is a compact and efficient dispatch mechanism that avoids long IF/THEN chains entirely, at the cost of requiring subroutines to be placed at exactly the computed line numbers.
Machine Code Usage
Line 1 in both programs is a REM statement whose body encodes a short Z80 machine-code routine. The sequence \06\01\C5\06\64\00\10\FD\C1\10\F7\C9 disassembles as:
LD B,1 — outer loop count
PUSH BC
LD B,100 ; LD C,0 — inner delay count (25600 iterations)
DJNZ $ — inner loop
POP BC ; DJNZ … — outer loop
RET
This routine is called via LET E=USR 16514 (the address of the REM body in the VowelTutor variant is slightly longer, hence a different offset in practice). It is used as a simple software delay in animation sequences — for example, the hat flip in AlphaTutor (lines 1901–1906), the smile animation (lines 4101–4106), and the nose-sniffing effect (lines 1163–1168 in VowelTutor).
Key BASIC Idioms
- Block graphic art: All pictures are rendered using the ZX81/TS1000 block graphic characters (2×2 pixel sub-characters), encoded here as zmakebas escape sequences such as
\ ., \:., \'', etc.
- Distinct random selection: Lines 60 check
L(1)=L(2) OR L(1)=L(3) OR L(2)=L(3) and loop back if any two indices collide, ensuring three distinct pictures appear each round.
- Column positioning via formula:
LET X=10*K-5 (line 110) distributes the three picture columns evenly across the 32-character screen (columns 5, 15, 25).
- Answer box: The target letter is displayed in a bordered box drawn with block graphics at lines 19–21 using
AT positioning.
- PLOT for QUEEN and CONE: The subroutines at lines 3700 and 830 use
PLOT with pixel coordinates to draw vertical lines, since the block graphic resolution is insufficient for narrow strokes.
VowelTutor Word-Embedding Technique
In VowelTutor, word labels use a space character as a placeholder for the missing vowel (e.g., "TR% IN" for TRAIN, "K% TE" for KITE). After the round is set up, lines 151–155 scan W$(C) character-by-character to find the first "% " (space) position, then replace it with the actual vowel character A$ — effectively filling in the blank dynamically. This lets the same word string serve as both a gapped display and, after substitution, the correct spelled form.
Notable Subroutine Sharing
AlphaTutor’s GIRL subroutine (line 1700) is shared with BOY (line 700): the BOY subroutine calls GOSUB 1700 to draw the upper body, then the shared routine checks IF L(K)=1 THEN RETURN (line 1710) to exit early for BOY, or continues to draw the skirt/legs for GIRL. Similarly, VowelTutor’s WOMAN subroutine (line 4900) reuses the MAN subroutine (line 2900) for the head and torso, then overprints with different lower-body graphics.
Array Sizing
Array Dimensions Purpose P(3)3 elements Column position for each picture’s word label W$(3,10)3 strings × 10 chars Word associated with each picture slot L(3) / L(5)3 (Alpha) / 5 (Vowel) Random index for picture selection
Potential Anomalies
- AlphaTutor has no subroutine at the computed target for letter index 0 (line 500 handles A=0, as
200*0+500=500) — this is correct; L(K)=INT(RND*26) yields 0–25, mapping to lines 500–5500.
- VowelTutor’s
GOSUB 700*LS+100*L(K)+30*Z for LS=2 (short vowels) can yield targets like 1400+30*Z (lines 1400, 1430, 1460) which are not all defined in the listing — some short-vowel variant slots appear absent, which would cause a BASIC error if selected. This may reflect incomplete subroutine coverage in the original listing.
- The
PAUSE 33000 at line 14 provides a long title-screen pause (~30 seconds at normal speed) but any key press does not skip it — the user must wait it out unless they press BREAK.
- In VowelTutor, the
\## sequences in several subroutines (e.g., lines 1232, 1262, 1532) are not standard zmakebas escape sequences and likely represent inverse-video block characters or UDGs in the original tape file that were not fully decoded in this transcription.
Content
Source Code
1 REM \06\01\C5\06\64\00\10\FD\C1\10\F7\C9\2E\2E\2E\2E\2E\2E
2 SAVE "AB%C"
12 PRINT AT 8,11;"ALPHATUTOR";AT 10,2;"COPYRIGHT 1982 LOU GOLDSTEIN";AT 12,6;"% %F%R%O%M% %S%O%F%T%S%Y%N%C% %I%N%C% "
13 PRINT AT 20,5;"PRESS ""ENTER"" TO START"
14 PAUSE 33000
15 RAND
17 CLS
18 DIM P(3)
19 DIM W$(3,10)
20 DIM L(3)
30 FOR K=1 TO 3
40 LET L(K)=INT (RND*26)
50 NEXT K
60 IF L(1)=L(2) OR L(1)=L(3) OR L(2)=L(3) THEN GOTO 30
80 LET C=INT (RND*3)+1
90 LET A$=CHR$ (L(C)+38)
100 FOR K=1 TO 3
110 LET X=10*K-5
120 GOSUB 200*L(K)+500
121 PRINT AT 10,P(K);"% ";W$(K,2 TO )
130 PRINT AT 15,X;K
140 NEXT K
150 PRINT AT 19,14;"\:'\''\':";AT 20,14;"\: ";A$;"\ :";AT 21,14;"\:.\..\.:"
160 INPUT R
170 IF R<>C THEN PRINT AT 16,10*C-9;"% % % % % % % % % "
180 IF R=C THEN PRINT AT 16,10*C-9;"*********"
185 PRINT AT 13,P(C);W$(C)
190 PAUSE 250
195 CLS
200 GOTO 30
500 PRINT AT 3,X-3;"\..\..\..\..";AT 4,X-3;"\: \ . \ :";AT 5,X-3;"\: \':\' \ '\''\':";AT 6,X-3;"\:.\..\..\..\..\.:";AT 7,X-3;"\' \' "
501 LET P(K)=X-4
502 LET W$(K)="AMBULANCE"
510 RETURN
700 GOSUB 1700
710 PRINT AT 4,X;"\ :";AT 5,X;"\.'\. ";AT 6,X-1;"\.' \ '\. ";AT 7,X-2;"\.' \ '\. "
711 LET P(K)=X-1
712 LET W$(K)="BOY"
720 RETURN
900 PRINT AT 5,X-3;"\ :% % % ";AT 6,X-3;"\ :% % % % % ";AT 7,X-2;"\' \ '"
901 LET P(K)=X-1
902 LET W$(K)="CAR"
910 RETURN
1100 PRINT AT 1,X-4;"\ . \:.\. ";AT 2,X-3;"\'. % \. ";AT 3,X-2;"% % % ";AT 4,X-2;"\:'\''\':";AT 5,X-2;"\: \ :"
1101 LET P(K)=X-1
1102 LET W$(K)="DOG"
1110 RETURN
1300 PRINT AT 1,X-4;"\ .% % % \..";AT 2,X-4;"% % % % \.:";AT 3,X-4;"\':% % \:'\ '\..\' ";AT 4,X-4;"\ : \: "
1301 LET P(K)=X-4
1302 LET W$(K)="ELEPHANT"
1310 RETURN
1500 PRINT AT 1,X-4;"\ . \ .\..";AT 2,X-4;"\ :\:.\.:% % \':\. ";AT 3,X-4;"\ :% % % % % \. ";AT 4,X-4;"\ :\' \ '\':\:'\' "
1501 LET P(K)=X-2
1502 LET W$(K)="FISH"
1510 RETURN
1700 PRINT AT 0,X;"% \: ";AT 1,X;"\':\' ";AT 2,X-1;"\ .\':\'.";AT 3,X-1;"\' \ : \' "
1710 IF L(K)=1 THEN RETURN
1720 PRINT AT 4,X;"\.:\. ";AT 5,X-1;"\.:% % \. ";AT 6,X-2;"\ '\:'\''\''\:'";AT 7,X-1;"\: \: "
1721 LET P(K)=X-2
1722 LET W$(K)="GIRL"
1730 RETURN
1900 PRINT AT 1,X-2;">\ .\..\..\. <";AT 2,X-1;"\.:% % \:.";AT 3,X-1;"\ :..\: ";AT 4,X-1;"\ : \: ";AT 5,X-1;"\ :\ '\' \: ";AT 6,X;"\''\''"
1901 FOR F=1 TO 2
1902 PRINT AT 1,X-1;" ";AT 2,X-1;"\ .\..\..\. "
1903 LET E=USR 16514
1904 PRINT AT 1,X-1;"\ .\..\..\. ";AT 2,X-1;"\.:% % \:."
1905 LET E=USR 16514
1906 NEXT F
1907 LET P(K)=X-1
1908 LET W$(K)="HAT"
1910 RETURN
2100 PRINT AT 1,X-1;"\ :";AT 2,X-1;"\ :";AT 3,X-2;"\ .\''\''\''\. ";AT 4,X-2;"\ :\~~\~~\~~\: ";AT 5,X-2;"\ :\ ' \' \: ";AT 6,X-2;"\ :\ .\..\. \: ";AT 7,X-2;"\ '\..\..\..\' "
2101 LET P(K)=X-3
2102 LET W$(K)="INDIAN"
2110 RETURN
2300 PRINT AT 1,X-3;"---\:.";AT 2,X-3;"\':\..\..\.:\:.\..";AT 3,X-3;"\ :\..\..\..\..\..% >";AT 4,X-3;"---\ .\:'";AT 5,X-3;"---\:'"
2301 LET P(K)=X-1
2302 LET W$(K)="JET"
2310 RETURN
2500 LET P(K)=X-2
2522 LET W$(K)="KING"
2523 PRINT AT 1,X-2;"\. \. \. \. \. ";AT 2,X-2;"\':\''\''\':\' ";AT 3,X-2;"\ :\ '\ '\ :";AT 4,X-2;"\ : \' \ :";AT 5,X-2;"\ :\ '\''\ :";AT 6,X-1;"\':% \' "
2530 RETURN
2700 PRINT AT 2,X-3;"A B C D";AT 3,X-2;"E F G"
2701 LET P(K)=X-4
2702 LET W$(K)="LETTERS"
2710 RETURN
2900 PRINT AT 1,X;"% \: ";AT 2,X;"\':\' ";AT 3,X-1;"% % % \: ";AT 4,X-1;"\: % \: \: ";AT 5,X-1;"\' % \: \' "
2910 IF L(K)=22 THEN RETURN
2920 PRINT AT 6,X-1;"\ :% % ";AT 7,X-1;"\ :\: % ";AT 8,X-1;"\ :\: % "
2921 LET P(K)=X-1
2922 LET W$(K)="MAN"
2930 RETURN
3100 PRINT AT 3,X-3;"1 2 3 4";AT 4,X-2;"5 6 7"
3101 LET P(K)=X-3
3102 LET W$(K)="NUMBERS"
3110 RETURN
3300 PRINT AT 1,X-4;"\. ";AT 2,X-4;"\ '\'. \.:\. \..\. ";AT 3,X-2;"\':% % \''";AT 4,X-4;"\ .\.'\':% % \.. \.'";AT 5,X-4;"\' \ .\.'\.'\.'\. \''";AT 6,X-4;"\ .\' \ .\' \'.\ '\'.";AT 7,X-4;"\' \ .\' \ '\. "
3301 LET P(K)=X-3
3302 LET W$(K)="OCTOPUS"
3310 RETURN
3500 PRINT AT 5,X-2;"\..\..\..\..% ";AT 4,X+2;"*";AT 3,X+2;"*"
3501 LET P(K)=X-1
3502 LET W$(K)="PIPE"
3510 RETURN
3700 GOSUB 2500
3710 FOR Y=38 TO 29 STEP -1
3720 PLOT 2*X-4,Y
3730 PLOT 2*X+4,Y
3740 NEXT Y
3751 LET P(K)=X-2
3752 LET W$(K)="QUEEN"
3760 RETURN
3900 PRINT AT 1,X;"A";AT 2,X;"% ";AT 3,X;"% ";AT 4,X;"% ";AT 5,X;"% ";AT 6,X-1;"\..% \..";AT 7,X-1;"\' *\ '";AT 8,X;"*"
3901 LET P(K)=X-3
3902 LET W$(K)="ROCKET"
3910 RETURN
4100 PRINT AT 1,X-1;"\..\..\..";AT 2,X-2;"\ :\ . \. \: ";AT 3,X-2;"\ : \: ";AT 4,X-3;">\ :\ . \. \: <";AT 5,X-2;"\ : \'' \: ";AT 6,X-1;"\''\''\''"
4101 FOR F=1 TO 2
4102 PRINT AT 4,X-1;" ";AT 5,X-1;"\ '\''\' "
4103 LET E=USR 16514
4104 PRINT AT 4,X-1;"\ . \. ";AT 5,X-1;" \'' "
4105 LET E=USR 16514
4106 NEXT F
4107 LET P(K)=X-2
4108 LET W$(K)="SMILE"
4110 RETURN
4300 PRINT AT 1,X-1;"\ .% \. ";AT 2,X-2;"\ .% % % \. ";AT 3,X-2;"% % % % % ";AT 4,X-2;"\ '% % % \' ";AT 5,X-1;"\ '% \' ";AT 6,X;"% ";AT 7,X-1;"\ .% \. "
4301 LET P(K)=X-2
4302 LET W$(K)="TREE"
4310 RETURN
4500 PRINT AT 1,X;"\.:\. ";AT 2,X-1;"\.'\ :\ '\. ";AT 3,X;"\ :";AT 4,X;"\ :"
4501 LET P(K)=X-1
4502 LET W$(K)="UP"
4510 RETURN
4700 PRINT AT 2,X-2;"\ .\. \..";AT 3,X-2;"% % \. \.:% \: ";AT 4,X-2;"\':% % % % \' ";AT 5,X-1;"\':% % \' ";AT 6,X;"\':\' "
4701 LET P(K)=X-4
4702 LET W$(K)="VALENTINE"
4710 RETURN
4900 GOSUB 2900
4910 PRINT AT 6,X-1;"\.:% % \. ";AT 7,X-2;"\.:% % % % \. ";AT 8,X-1;"\ :\: % "
4911 LET P(K)=X-2
4912 LET W$(K)="WOMAN"
4920 RETURN
5100 PRINT AT 1,X-3;"\: \: \: \: \: \: \: ";AT 2,X-3;"\: \: \: \: \: \' ";AT 3,X-3;"\: \: \: \' \. ";AT 4,X-3;"\: \' \. /";AT 5,X-1;"/"
5101 LET P(K)=X-4
5102 LET W$(K)="XYLOPHONE"
5110 RETURN
5300 PRINT AT 1,X-1;"\ .% \. ";AT 2,X-1;"% % \':";AT 3,X-1;"% % % \. <";AT 4,X-1;"% % \''<";AT 5,X-1;"% % \.. <";AT 6,X-1;"\ :% "
5301 LET P(K)=X-1
5302 LET W$(K)="YELL"
5310 RETURN
5500 PRINT AT 3,X-2;"\.'\. \.'";AT 4,X-3;"\ ' \ '\. \.'\.'";AT 5,X;"\ '"
5501 LET P(K)=X-3
5502 LET W$(K)="ZIGZAG"
5510 RETURN
1 REM \06\01\C5\06\64\00\10\FD\C1\10\F7\C9\2E\2E\2E\2E\2E\2E\2E\2E\2E\2E\2E
2 SAVE "VOWE%L"
12 PRINT AT 8,11;"VOWELTUTOR";AT 10,2;"COPYRIGHT 1982 LOU GOLDSTEIN";AT 12,7;"% %F%R%O%M% %S%O%F%T%S%Y%N%C% %I%N%C% "
13 PRINT AT 20,5;"PRESS ""ENTER"" TO START"
14 PAUSE 33000
15 RAND
16 LET V$="AEIOU"
17 CLS
18 DIM P(3)
19 DIM W$(3,10)
20 DIM L(5)
23 PRINT AT 6,0;"WHICH VOWELS DO YOU WANT TO USE?1=LONG",,"2=SHORT",,"3=BOTH",,"4=EXIT PROGRAM"
24 INPUT O
25 LET LS=O
26 CLS
27 IF O=4 THEN STOP
30 IF O=3 THEN LET LS=INT (RND*2)+1
31 FOR K=1 TO 3
32 FAST
40 LET L(K)=INT (RND*5)+1
50 NEXT K
60 IF L(1)=L(2) OR L(1)=L(3) OR L(2)=L(3) THEN GOTO 31
80 LET C=INT (RND*3)+1
90 LET A$=V$(L(C))
99 SLOW
100 FOR K=1 TO 3
105 LET Z=INT (RND*3)
110 LET X=10*K-5
120 GOSUB 700*LS+100*L(K)+30*Z
121 PRINT AT 10,P(K);W$(K)
130 PRINT AT 15,X;K
140 NEXT K
150 PRINT AT 19,14;"\:'\''\':";AT 20,14;"\: ";A$;"\ :";AT 21,14;"\:.\..\.:"
151 FOR J=1 TO 10
152 IF W$(C,J)="% " THEN GOTO 155
153 NEXT J
155 LET W$(C,J)=A$
156 INPUT R
157 IF R=9 THEN CLS
160 IF R=9 THEN GOTO 23
170 IF R<>C THEN PRINT AT 16,10*C-9;"% % % % % % % % % "
180 IF R=C THEN PRINT AT 16,10*C-9;"*********"
185 PRINT AT 13,P(C);W$(C)
190 PAUSE 250
195 CLS
200 GOTO 30
800 LET W$(K)="TR% IN"
801 LET P(K)=X-2
802 PRINT AT 2,X-1;"*";AT 3,X;"*";AT 4,X;"\ :\..\. ";AT 5,X-4;"\ :% \.:% \.:% % >";AT 6,X-4;"\ '\ '\ '\ '\ ' \ '"
803 RETURN
830 LET W$(K)="C% NE"
831 LET P(K)=X-1
832 PRINT AT 1,X+1;"\' ";AT 0,X-1;"\ .\''\. "
833 FOR Y=41 TO 30 STEP -1
834 PLOT 2*X-1,Y
835 NEXT Y
836 RETURN
860 LET W$(K)="D% YS"
861 LET P(K)=X-2
862 PRINT AT 2,X-1;"FRI.";AT 4,X-1;"SAT.";AT 6,X-1;"SUN."
863 RETURN
900 LET W$(K)="K% Y"
901 LET P(K)=X-1
902 PRINT AT 3,X-3;"% % ";AT 4,X-3;"% % \:'\''\':% % \' ";AT 5,X-3;"% % \ '\ :\ '"
903 RETURN
930 LET W$(K)="THR% E"
931 LET P(K)=X-2
932 PRINT AT 3,X-1;"\''\''\: ";AT 4,X+1;"\: ";AT 5,X-1;"\ '\''\: ";AT 6,X+1;"\: ";AT 7,X-1;"\''\''\' "
933 RETURN
960 LET W$(K)="KN% E"
961 LET P(K)=X-2
962 PRINT AT 0,X+1;"% \: ";AT 1,X+1;"\':\' ";AT 2,X+1;"\: ";AT 3,X;"\ :\ '\..\. ";AT 4,X;"\: ";AT 5,X-1;"\ :\ '\. ";AT 6,X-1;"\ : \ '\. <";AT 7,X-2;"\ .\' \: ";AT 8,X-2;"\'. \''"
968 RETURN
1000 LET W$(K)="F% VE"
1001 LET P(K)=X-2
1002 PRINT AT 2,X-1;"\:'\''\' ";AT 3,X-1;"\:.\. ";AT 4,X;"\ '\. ";AT 5,X-1;"\. \ .\' ";AT 6,X-1;"\ '\' "
1003 RETURN
1030 LET W$(K)="K% TE"
1031 LET P(K)=X-2
1032 PRINT AT 0,X;"\.:\. ";AT 1,X-1;"\ .\':\'.";AT 2,X-1;"\.:\.:\.:\. ";AT 3,X-1;"\ :\ :\ :";AT 4,X;"% \: ";AT 5,X;"\ :";AT 6,X+1;"\'.";AT 7,X+1;"\.'";AT 8,X+1;"\ '"
1033 RETURN
1060 LET W$(K)="N% NE"
1061 LET P(K)=X-2
1063 PRINT AT 2,X-1;"\:'\''\: ";AT 3,X-1;"\: \: ";AT 4,X-1;"\''\''\: ";AT 5,X-1;"\. \: ";AT 6,X-1;"\''\''\' "
1064 RETURN
1100 LET W$(K)="B% AT"
1101 LET P(K)=X-2
1102 PRINT AT 1,X-2;"\..\..\..\..\. ";AT 2,X-2;"\ '\. \ '\. ";AT 3,X-1;"\.' \.'";AT 4,X-2;"\ '\''\':\''\''";AT 5,X-4;"\..\..\..\..\.:\..\..\..>";AT 6,X-4;"\':% % % % % \:'";AT 7,X-3;"\''\''\''\''\''"
1103 RETURN
1130 LET W$(K)="THR% W"
1131 LET P(K)=X-2
1132 PRINT AT 2,X+2;">";AT 3,X-2;"\ :% >\ '";AT 4,X-2;"\ '\:' \.'";AT 5,X-3;"\ .\''\:'\''";AT 6,X-3;"\' \: ";AT 7,X-2;"\.'\ '\. ";AT 8,X-3;"\ ' \ '"
1133 RETURN
1160 LET W$(K)="N% SE"
1161 LET P(K)=X-2
1162 PRINT AT 1,X-1;"\ .% \. ";AT 2,X-1;"% \:.\:.";AT 3,X-1;"% % \' ";AT 4,X-1;"\':\:'\' "
1163 FOR G=1 TO 3
1164 PRINT AT 2,1+X;"\: "
1165 LET U=USR 16514
1166 PRINT AT 2,X+1;"\:."
1167 LET U=USR 16514
1168 NEXT G
1169 RETURN
1200 LET W$(K)="% NITED"
1201 LET P(K)=X-3
1202 PRINT AT 1,X-3;"\..\..\..\..\..\. \.:";AT 2,X-4;"\ .% % % % % % \.:% ";AT 3,X-4;"\ :AMERICA\: ";AT 4,X-4;"\ '% % % % % % % \: ";AT 5,X-3;"\''\''% % % % % \: ";AT 6,X;"\':\:' \: ";AT 7,X+1;"\' "
1203 PRINT AT 11,P(K);"STATES"
1204 RETURN
1230 LET W$(K)="F% EL"
1231 LET P(K)=X-2
1232 PRINT AT 1,X-4;"\##\##\##";AT 2,X-4;"\##%G\##";AT 3,X-4;"\##%A\##";AT 4,X-4;"\##%S\##\'. \:'\''\':";AT 5,X-4;"\##\##\##\ '\..\:.\..\.:";AT 6,X-4;"\##\##\## % % % ";AT 7,X-4;"\##\##\## \: \ :"
1233 RETURN
1260 LET W$(K)="T% BE"
1261 LET P(K)=X-2
1262 PRINT AT 2,X-4;"\ .\..\..\..\..\..\..\..\. ";AT 3,X-4;"\ :\##TOOTH\##\:.";AT 4,X-4;"\ :\##PASTE\##\:'";AT 5,X-4;"\ '\''\''\''\''\''\''\''\' "
1263 RETURN
1500 LET W$(K)="FL% G"
1501 LET P(K)=X-2
1503 LET B=X-4
1504 PRINT AT 0,B;"\ .\..\..\..\..\..\..\..";AT 1,B;"\ :***\:'\''\''\':";AT 2,B;"\ :***\:'\''\''\':";AT 3,B;"\ :\''\''\''\''\''\''\':";AT 4,B;"\ :\''\''\''\''\''\''\':";AT 5,B;"\ :\''\''\''\''\''\''\''";AT 6,B;"\ :"
1505 RETURN
1530 LET W$(K)="% DD"
1531 LET P(K)=X-1
1532 PRINT AT 1,X-2;"3+2=\##";AT 3,X;"75";AT 4,X-1;"+23";AT 5,X-1;"\''\''\''"
1533 RETURN
1560 LET W$(K)="P% N"
1561 LET P(K)=X-1
1562 PRINT AT 3,X-3;"\..\..\..\..";AT 4,X-4;"\ :\' \ '\:.\..\..\..";AT 5,X-4;"\ :\:.\..\..\.:\: ";AT 6,X-4;"\ '% % % % \' "
1563 RETURN
1600 LET W$(K)="T% N"
1601 LET P(K)=X-1
1602 LET B=X-2
1603 PRINT AT 2,B;"\ : \:'\''\':";AT 3,B;"\ : \: \ :";AT 4,B;"\ : \: \ :";AT 5,B;"\ : \:.\..\.:"
1604 RETURN
1630 LET W$(K)="DR% SS"
1631 LET P(K)=X-2
1632 PRINT AT 1,X-2;"\.:\:.\.:\:.";AT 2,X-3;"\ '\:'% % \':\' ";AT 3,X-2;"\ .% % \. ";AT 4,X-3;"\ .% % % % \. ";AT 5,X-4;"\ .% % % % % % \. "
1633 RETURN
1660 LET W$(K)="L% G"
1661 LET P(K)=X-1
1662 LET B=X-1
1663 PRINT AT 0,X;"% \: ";AT 1,X;"\':\' ";AT 2,B;"% % % \: ";AT 3,B;"\: % \: \: ";AT 4,B;"\' % \: \' ";AT 5,B;"\ :% % ";AT 6,B;"\ :\: \##<";AT 7,B;"\ :\: \##<"
1664 RETURN
1700 LET W$(K)="S% X"
1701 LET P(K)=X-1
1702 LET B=X-1
1703 PRINT AT 1,X;"\..";AT 2,B;"\.' \' ";AT 3,B;"\: ";AT 4,B;"\:.\''\'.";AT 5,B;"\: \ :";AT 6,B;"\ '\..\' "
1704 RETURN
1730 LET W$(K)="SH% P"
1731 LET P(K)=X-2
1732 PRINT AT 3,X-3;"\..\:.\:.\. ";AT 4,X-5;"\ .\..% \:'% \:'% \:'% \:'";AT 5,X-4;"\':\:.% \:.% \:.% \:'";AT 6,X-5;"\@@\@@\@@\@@\@@\@@\@@\@@\@@\@@"
1733 RETURN
1760 LET W$(K)="WR% ST"
1761 LET P(K)=X-2
1762 LET B=X-1
1763 PRINT AT 0,B;"\..\..\..";AT 1,B;"\:'% \':";AT 2,B;"% \''% ";AT 3,B;"\''% \''"
1764 LET B=X-2
1765 PRINT AT 4,B;"% % % % % ";AT 5,B;"% \ :% \: % ";AT 6,B-1;">\##\ :% \: \##<";AT 7,B;"W W"
1766 RETURN
1800 LET W$(K)="P% T"
1801 LET P(K)=X-1
1802 PRINT AT 1,X-2;"\..";AT 2,X-4;"\ .\'' \''\. ";AT 3,X-4;"\:. \.:\..\..\..";AT 4,X-4;"% % \..% % ";AT 5,X-4;"\':% % % \:'";AT 6,X-3;"\ '\''\' "
1803 RETURN
1830 LET W$(K)="CL% CK"
1831 LET P(K)=X-3
1832 PRINT AT 1,X;"\..\. ";AT 2,X-2;"\ .\''\ .\ '\'.";AT 3,X-2;"\: \ : \: ";AT 4,X-3;"\ : \ :\..\. \ :";AT 5,X-3;"\ '\. \.'";AT 6,X-2;"\'. \ .\' ";AT 7,X-1;"\''\..\.'\' "
1833 RETURN
1860 LET W$(K)="ST% P"
1861 LET P(K)=X-2
1862 PRINT AT 0,X-2;"\ .% % \. ";AT 1,X-3;"\ .% % % % \. ";AT 2,X-3;"% ST P% ";AT 3,X-3;"% % % % % % ";AT 4,X-3;"\ '% % % % \' ";AT 5,X-2;"\ '% % \' ";AT 6,X-1;"\ :\: ";AT 7,X-1;"\ :\: "
1863 RETURN
1900 LET W$(K)="G% N"
1901 LET P(K)=X-1
1902 LET B=X-4
1903 PRINT AT 2,B;"\ :% % % % % -->";AT 3,B;"\ :\: \: \:'\''";AT 4,B;"\ :\:.\..\: ";AT 5,B;"\ :\: "
1904 RETURN
1930 LET W$(K)="DR% M"
1931 LET P(K)=X-2
1932 PRINT AT 0,X+2;"/";AT 1,X-1;"\.. \ ' /";AT 2,X-3;"\ .\'' \''\. \ '";AT 3,X-3;"\:. \.:";AT 4,X-3;"% % \..% % ";AT 5,X-3;"\':% % % \:'";AT 6,X-2;"\ '\''\' "
1933 RETURN
1960 LET W$(K)="B% S"
1961 LET P(K)=X-1
1962 LET B=X-3
1963 PRINT AT 2,B;"% \''\:'\':\''% % ";AT 3,B;"% \..\:.\.:\..% \ :% ";AT 4,B;"% % % % % % \.:% ";AT 5,B+1;"\' \ '"
1964 RETURN
Note: Type-in program listings on this website use ZMAKEBAS notation for graphics characters.
People
\FD\C1\F7\C9
Skip to content
Computer Tutor
Products: Computer Tutors: Alpha/Vowel Tutors
Developer(s): Lou Goldstein
Date: 1982
Type: Cassette
Platform(s): TS 1000
Tags: Education
AlphaTutor and VowelTutor are a paired set of educational programs designed to teach children letter recognition and vowel sounds through a picture-matching quiz format. Each round randomly selects three images drawn entirely in block graphics, displays them with numbered labels, and prompts the child to identify which picture matches a highlighted letter or vowel shown in a bordered box. The programs use computed GOSUB targets (e.g., `GOSUB 200*L(K)+500` and `GOSUB 700*LS+100*L(K)+30*Z`) to dispatch to one of 26 picture-drawing subroutines covering letters A–Z and multiple vowel-sound variants. VowelTutor extends the concept with separate long and short vowel word sets per letter, selected by a random or user-chosen mode flag, and includes an animated nose-sniffing and hat/smile flip routine via `USR 16514`, pointing to a small machine-code delay loop stored in the REM statement at line 1.
Program Analysis
This listing contains two related programs: AlphaTutor and VowelTutor, both credited to Lou Goldstein / SoftSync Inc., 1982. AlphaTutor covers all 26 letters of the alphabet; VowelTutor extends the concept to long and short vowel sounds, offering multiple word variants per vowel. Both share the same core quiz loop and picture-rendering architecture.
Program Structure
Both programs follow the same top-level flow:
- Title/splash screen (lines 12–14), then
RAND to seed the RNG.
- Initialise arrays
P(3), W$(3,10), L(3) (lines 18–20).
- Main loop (lines 30–200): pick three distinct random indices, choose one as the target, dispatch to a drawing subroutine for each, display a letter/vowel prompt box, read a numeric answer, give feedback, pause, clear and repeat.
- Drawing subroutines: one per picture subject, each printing block-graphic art, setting
P(K) (label column) and W$(K) (word string).
VowelTutor adds a mode-selection screen (lines 23–27) offering long vowels, short vowels, or both, stored in LS, and allows the user to return to mode selection by entering 9.
Computed GOSUB Dispatch
The most architecturally notable feature is the use of arithmetic expressions as GOSUB targets to select picture subroutines without IF/THEN chains:
- AlphaTutor:
GOSUB 200*L(K)+500 — with L(K) in 0–25, this generates targets 500 (A=ambulance), 700 (B=boy), 900 (C=car) … 5500 (Z=zigzag), spaced 200 apart.
- VowelTutor:
GOSUB 700*LS+100*L(K)+30*Z — the LS factor (1=long, 2=short) shifts into a separate bank of subroutines; L(K) selects the vowel (1–5 = A/E/I/O/U); Z (0–2) selects one of up to three word variants per vowel per length.
This is a compact and efficient dispatch mechanism that avoids long IF/THEN chains entirely, at the cost of requiring subroutines to be placed at exactly the computed line numbers.
Machine Code Usage
Line 1 in both programs is a REM statement whose body encodes a short Z80 machine-code routine. The sequence \06\01\C5\06\64\00\10\FD\C1\10\F7\C9 disassembles as:
LD B,1 — outer loop count
PUSH BC
LD B,100 ; LD C,0 — inner delay count (25600 iterations)
DJNZ $ — inner loop
POP BC ; DJNZ … — outer loop
RET
This routine is called via LET E=USR 16514 (the address of the REM body in the VowelTutor variant is slightly longer, hence a different offset in practice). It is used as a simple software delay in animation sequences — for example, the hat flip in AlphaTutor (lines 1901–1906), the smile animation (lines 4101–4106), and the nose-sniffing effect (lines 1163–1168 in VowelTutor).
Key BASIC Idioms
- Block graphic art: All pictures are rendered using the ZX81/TS1000 block graphic characters (2×2 pixel sub-characters), encoded here as zmakebas escape sequences such as
\ ., \:., \'', etc.
- Distinct random selection: Lines 60 check
L(1)=L(2) OR L(1)=L(3) OR L(2)=L(3) and loop back if any two indices collide, ensuring three distinct pictures appear each round.
- Column positioning via formula:
LET X=10*K-5 (line 110) distributes the three picture columns evenly across the 32-character screen (columns 5, 15, 25).
- Answer box: The target letter is displayed in a bordered box drawn with block graphics at lines 19–21 using
AT positioning.
- PLOT for QUEEN and CONE: The subroutines at lines 3700 and 830 use
PLOT with pixel coordinates to draw vertical lines, since the block graphic resolution is insufficient for narrow strokes.
VowelTutor Word-Embedding Technique
In VowelTutor, word labels use a space character as a placeholder for the missing vowel (e.g., "TR% IN" for TRAIN, "K% TE" for KITE). After the round is set up, lines 151–155 scan W$(C) character-by-character to find the first "% " (space) position, then replace it with the actual vowel character A$ — effectively filling in the blank dynamically. This lets the same word string serve as both a gapped display and, after substitution, the correct spelled form.
Notable Subroutine Sharing
AlphaTutor’s GIRL subroutine (line 1700) is shared with BOY (line 700): the BOY subroutine calls GOSUB 1700 to draw the upper body, then the shared routine checks IF L(K)=1 THEN RETURN (line 1710) to exit early for BOY, or continues to draw the skirt/legs for GIRL. Similarly, VowelTutor’s WOMAN subroutine (line 4900) reuses the MAN subroutine (line 2900) for the head and torso, then overprints with different lower-body graphics.
Array Sizing
Array Dimensions Purpose P(3)3 elements Column position for each picture’s word label W$(3,10)3 strings × 10 chars Word associated with each picture slot L(3) / L(5)3 (Alpha) / 5 (Vowel) Random index for picture selection
Potential Anomalies
- AlphaTutor has no subroutine at the computed target for letter index 0 (line 500 handles A=0, as
200*0+500=500) — this is correct; L(K)=INT(RND*26) yields 0–25, mapping to lines 500–5500.
- VowelTutor’s
GOSUB 700*LS+100*L(K)+30*Z for LS=2 (short vowels) can yield targets like 1400+30*Z (lines 1400, 1430, 1460) which are not all defined in the listing — some short-vowel variant slots appear absent, which would cause a BASIC error if selected. This may reflect incomplete subroutine coverage in the original listing.
- The
PAUSE 33000 at line 14 provides a long title-screen pause (~30 seconds at normal speed) but any key press does not skip it — the user must wait it out unless they press BREAK.
- In VowelTutor, the
\## sequences in several subroutines (e.g., lines 1232, 1262, 1532) are not standard zmakebas escape sequences and likely represent inverse-video block characters or UDGs in the original tape file that were not fully decoded in this transcription.
Content
Source Code
1 REM \06\01\C5\06\64\00\10\FD\C1\10\F7\C9\2E\2E\2E\2E\2E\2E
2 SAVE "AB%C"
12 PRINT AT 8,11;"ALPHATUTOR";AT 10,2;"COPYRIGHT 1982 LOU GOLDSTEIN";AT 12,6;"% %F%R%O%M% %S%O%F%T%S%Y%N%C% %I%N%C% "
13 PRINT AT 20,5;"PRESS ""ENTER"" TO START"
14 PAUSE 33000
15 RAND
17 CLS
18 DIM P(3)
19 DIM W$(3,10)
20 DIM L(3)
30 FOR K=1 TO 3
40 LET L(K)=INT (RND*26)
50 NEXT K
60 IF L(1)=L(2) OR L(1)=L(3) OR L(2)=L(3) THEN GOTO 30
80 LET C=INT (RND*3)+1
90 LET A$=CHR$ (L(C)+38)
100 FOR K=1 TO 3
110 LET X=10*K-5
120 GOSUB 200*L(K)+500
121 PRINT AT 10,P(K);"% ";W$(K,2 TO )
130 PRINT AT 15,X;K
140 NEXT K
150 PRINT AT 19,14;"\:'\''\':";AT 20,14;"\: ";A$;"\ :";AT 21,14;"\:.\..\.:"
160 INPUT R
170 IF R<>C THEN PRINT AT 16,10*C-9;"% % % % % % % % % "
180 IF R=C THEN PRINT AT 16,10*C-9;"*********"
185 PRINT AT 13,P(C);W$(C)
190 PAUSE 250
195 CLS
200 GOTO 30
500 PRINT AT 3,X-3;"\..\..\..\..";AT 4,X-3;"\: \ . \ :";AT 5,X-3;"\: \':\' \ '\''\':";AT 6,X-3;"\:.\..\..\..\..\.:";AT 7,X-3;"\' \' "
501 LET P(K)=X-4
502 LET W$(K)="AMBULANCE"
510 RETURN
700 GOSUB 1700
710 PRINT AT 4,X;"\ :";AT 5,X;"\.'\. ";AT 6,X-1;"\.' \ '\. ";AT 7,X-2;"\.' \ '\. "
711 LET P(K)=X-1
712 LET W$(K)="BOY"
720 RETURN
900 PRINT AT 5,X-3;"\ :% % % ";AT 6,X-3;"\ :% % % % % ";AT 7,X-2;"\' \ '"
901 LET P(K)=X-1
902 LET W$(K)="CAR"
910 RETURN
1100 PRINT AT 1,X-4;"\ . \:.\. ";AT 2,X-3;"\'. % \. ";AT 3,X-2;"% % % ";AT 4,X-2;"\:'\''\':";AT 5,X-2;"\: \ :"
1101 LET P(K)=X-1
1102 LET W$(K)="DOG"
1110 RETURN
1300 PRINT AT 1,X-4;"\ .% % % \..";AT 2,X-4;"% % % % \.:";AT 3,X-4;"\':% % \:'\ '\..\' ";AT 4,X-4;"\ : \: "
1301 LET P(K)=X-4
1302 LET W$(K)="ELEPHANT"
1310 RETURN
1500 PRINT AT 1,X-4;"\ . \ .\..";AT 2,X-4;"\ :\:.\.:% % \':\. ";AT 3,X-4;"\ :% % % % % \. ";AT 4,X-4;"\ :\' \ '\':\:'\' "
1501 LET P(K)=X-2
1502 LET W$(K)="FISH"
1510 RETURN
1700 PRINT AT 0,X;"% \: ";AT 1,X;"\':\' ";AT 2,X-1;"\ .\':\'.";AT 3,X-1;"\' \ : \' "
1710 IF L(K)=1 THEN RETURN
1720 PRINT AT 4,X;"\.:\. ";AT 5,X-1;"\.:% % \. ";AT 6,X-2;"\ '\:'\''\''\:'";AT 7,X-1;"\: \: "
1721 LET P(K)=X-2
1722 LET W$(K)="GIRL"
1730 RETURN
1900 PRINT AT 1,X-2;">\ .\..\..\. <";AT 2,X-1;"\.:% % \:.";AT 3,X-1;"\ :..\: ";AT 4,X-1;"\ : \: ";AT 5,X-1;"\ :\ '\' \: ";AT 6,X;"\''\''"
1901 FOR F=1 TO 2
1902 PRINT AT 1,X-1;" ";AT 2,X-1;"\ .\..\..\. "
1903 LET E=USR 16514
1904 PRINT AT 1,X-1;"\ .\..\..\. ";AT 2,X-1;"\.:% % \:."
1905 LET E=USR 16514
1906 NEXT F
1907 LET P(K)=X-1
1908 LET W$(K)="HAT"
1910 RETURN
2100 PRINT AT 1,X-1;"\ :";AT 2,X-1;"\ :";AT 3,X-2;"\ .\''\''\''\. ";AT 4,X-2;"\ :\~~\~~\~~\: ";AT 5,X-2;"\ :\ ' \' \: ";AT 6,X-2;"\ :\ .\..\. \: ";AT 7,X-2;"\ '\..\..\..\' "
2101 LET P(K)=X-3
2102 LET W$(K)="INDIAN"
2110 RETURN
2300 PRINT AT 1,X-3;"---\:.";AT 2,X-3;"\':\..\..\.:\:.\..";AT 3,X-3;"\ :\..\..\..\..\..% >";AT 4,X-3;"---\ .\:'";AT 5,X-3;"---\:'"
2301 LET P(K)=X-1
2302 LET W$(K)="JET"
2310 RETURN
2500 LET P(K)=X-2
2522 LET W$(K)="KING"
2523 PRINT AT 1,X-2;"\. \. \. \. \. ";AT 2,X-2;"\':\''\''\':\' ";AT 3,X-2;"\ :\ '\ '\ :";AT 4,X-2;"\ : \' \ :";AT 5,X-2;"\ :\ '\''\ :";AT 6,X-1;"\':% \' "
2530 RETURN
2700 PRINT AT 2,X-3;"A B C D";AT 3,X-2;"E F G"
2701 LET P(K)=X-4
2702 LET W$(K)="LETTERS"
2710 RETURN
2900 PRINT AT 1,X;"% \: ";AT 2,X;"\':\' ";AT 3,X-1;"% % % \: ";AT 4,X-1;"\: % \: \: ";AT 5,X-1;"\' % \: \' "
2910 IF L(K)=22 THEN RETURN
2920 PRINT AT 6,X-1;"\ :% % ";AT 7,X-1;"\ :\: % ";AT 8,X-1;"\ :\: % "
2921 LET P(K)=X-1
2922 LET W$(K)="MAN"
2930 RETURN
3100 PRINT AT 3,X-3;"1 2 3 4";AT 4,X-2;"5 6 7"
3101 LET P(K)=X-3
3102 LET W$(K)="NUMBERS"
3110 RETURN
3300 PRINT AT 1,X-4;"\. ";AT 2,X-4;"\ '\'. \.:\. \..\. ";AT 3,X-2;"\':% % \''";AT 4,X-4;"\ .\.'\':% % \.. \.'";AT 5,X-4;"\' \ .\.'\.'\.'\. \''";AT 6,X-4;"\ .\' \ .\' \'.\ '\'.";AT 7,X-4;"\' \ .\' \ '\. "
3301 LET P(K)=X-3
3302 LET W$(K)="OCTOPUS"
3310 RETURN
3500 PRINT AT 5,X-2;"\..\..\..\..% ";AT 4,X+2;"*";AT 3,X+2;"*"
3501 LET P(K)=X-1
3502 LET W$(K)="PIPE"
3510 RETURN
3700 GOSUB 2500
3710 FOR Y=38 TO 29 STEP -1
3720 PLOT 2*X-4,Y
3730 PLOT 2*X+4,Y
3740 NEXT Y
3751 LET P(K)=X-2
3752 LET W$(K)="QUEEN"
3760 RETURN
3900 PRINT AT 1,X;"A";AT 2,X;"% ";AT 3,X;"% ";AT 4,X;"% ";AT 5,X;"% ";AT 6,X-1;"\..% \..";AT 7,X-1;"\' *\ '";AT 8,X;"*"
3901 LET P(K)=X-3
3902 LET W$(K)="ROCKET"
3910 RETURN
4100 PRINT AT 1,X-1;"\..\..\..";AT 2,X-2;"\ :\ . \. \: ";AT 3,X-2;"\ : \: ";AT 4,X-3;">\ :\ . \. \: <";AT 5,X-2;"\ : \'' \: ";AT 6,X-1;"\''\''\''"
4101 FOR F=1 TO 2
4102 PRINT AT 4,X-1;" ";AT 5,X-1;"\ '\''\' "
4103 LET E=USR 16514
4104 PRINT AT 4,X-1;"\ . \. ";AT 5,X-1;" \'' "
4105 LET E=USR 16514
4106 NEXT F
4107 LET P(K)=X-2
4108 LET W$(K)="SMILE"
4110 RETURN
4300 PRINT AT 1,X-1;"\ .% \. ";AT 2,X-2;"\ .% % % \. ";AT 3,X-2;"% % % % % ";AT 4,X-2;"\ '% % % \' ";AT 5,X-1;"\ '% \' ";AT 6,X;"% ";AT 7,X-1;"\ .% \. "
4301 LET P(K)=X-2
4302 LET W$(K)="TREE"
4310 RETURN
4500 PRINT AT 1,X;"\.:\. ";AT 2,X-1;"\.'\ :\ '\. ";AT 3,X;"\ :";AT 4,X;"\ :"
4501 LET P(K)=X-1
4502 LET W$(K)="UP"
4510 RETURN
4700 PRINT AT 2,X-2;"\ .\. \..";AT 3,X-2;"% % \. \.:% \: ";AT 4,X-2;"\':% % % % \' ";AT 5,X-1;"\':% % \' ";AT 6,X;"\':\' "
4701 LET P(K)=X-4
4702 LET W$(K)="VALENTINE"
4710 RETURN
4900 GOSUB 2900
4910 PRINT AT 6,X-1;"\.:% % \. ";AT 7,X-2;"\.:% % % % \. ";AT 8,X-1;"\ :\: % "
4911 LET P(K)=X-2
4912 LET W$(K)="WOMAN"
4920 RETURN
5100 PRINT AT 1,X-3;"\: \: \: \: \: \: \: ";AT 2,X-3;"\: \: \: \: \: \' ";AT 3,X-3;"\: \: \: \' \. ";AT 4,X-3;"\: \' \. /";AT 5,X-1;"/"
5101 LET P(K)=X-4
5102 LET W$(K)="XYLOPHONE"
5110 RETURN
5300 PRINT AT 1,X-1;"\ .% \. ";AT 2,X-1;"% % \':";AT 3,X-1;"% % % \. <";AT 4,X-1;"% % \''<";AT 5,X-1;"% % \.. <";AT 6,X-1;"\ :% "
5301 LET P(K)=X-1
5302 LET W$(K)="YELL"
5310 RETURN
5500 PRINT AT 3,X-2;"\.'\. \.'";AT 4,X-3;"\ ' \ '\. \.'\.'";AT 5,X;"\ '"
5501 LET P(K)=X-3
5502 LET W$(K)="ZIGZAG"
5510 RETURN
1 REM \06\01\C5\06\64\00\10\FD\C1\10\F7\C9\2E\2E\2E\2E\2E\2E\2E\2E\2E\2E\2E
2 SAVE "VOWE%L"
12 PRINT AT 8,11;"VOWELTUTOR";AT 10,2;"COPYRIGHT 1982 LOU GOLDSTEIN";AT 12,7;"% %F%R%O%M% %S%O%F%T%S%Y%N%C% %I%N%C% "
13 PRINT AT 20,5;"PRESS ""ENTER"" TO START"
14 PAUSE 33000
15 RAND
16 LET V$="AEIOU"
17 CLS
18 DIM P(3)
19 DIM W$(3,10)
20 DIM L(5)
23 PRINT AT 6,0;"WHICH VOWELS DO YOU WANT TO USE?1=LONG",,"2=SHORT",,"3=BOTH",,"4=EXIT PROGRAM"
24 INPUT O
25 LET LS=O
26 CLS
27 IF O=4 THEN STOP
30 IF O=3 THEN LET LS=INT (RND*2)+1
31 FOR K=1 TO 3
32 FAST
40 LET L(K)=INT (RND*5)+1
50 NEXT K
60 IF L(1)=L(2) OR L(1)=L(3) OR L(2)=L(3) THEN GOTO 31
80 LET C=INT (RND*3)+1
90 LET A$=V$(L(C))
99 SLOW
100 FOR K=1 TO 3
105 LET Z=INT (RND*3)
110 LET X=10*K-5
120 GOSUB 700*LS+100*L(K)+30*Z
121 PRINT AT 10,P(K);W$(K)
130 PRINT AT 15,X;K
140 NEXT K
150 PRINT AT 19,14;"\:'\''\':";AT 20,14;"\: ";A$;"\ :";AT 21,14;"\:.\..\.:"
151 FOR J=1 TO 10
152 IF W$(C,J)="% " THEN GOTO 155
153 NEXT J
155 LET W$(C,J)=A$
156 INPUT R
157 IF R=9 THEN CLS
160 IF R=9 THEN GOTO 23
170 IF R<>C THEN PRINT AT 16,10*C-9;"% % % % % % % % % "
180 IF R=C THEN PRINT AT 16,10*C-9;"*********"
185 PRINT AT 13,P(C);W$(C)
190 PAUSE 250
195 CLS
200 GOTO 30
800 LET W$(K)="TR% IN"
801 LET P(K)=X-2
802 PRINT AT 2,X-1;"*";AT 3,X;"*";AT 4,X;"\ :\..\. ";AT 5,X-4;"\ :% \.:% \.:% % >";AT 6,X-4;"\ '\ '\ '\ '\ ' \ '"
803 RETURN
830 LET W$(K)="C% NE"
831 LET P(K)=X-1
832 PRINT AT 1,X+1;"\' ";AT 0,X-1;"\ .\''\. "
833 FOR Y=41 TO 30 STEP -1
834 PLOT 2*X-1,Y
835 NEXT Y
836 RETURN
860 LET W$(K)="D% YS"
861 LET P(K)=X-2
862 PRINT AT 2,X-1;"FRI.";AT 4,X-1;"SAT.";AT 6,X-1;"SUN."
863 RETURN
900 LET W$(K)="K% Y"
901 LET P(K)=X-1
902 PRINT AT 3,X-3;"% % ";AT 4,X-3;"% % \:'\''\':% % \' ";AT 5,X-3;"% % \ '\ :\ '"
903 RETURN
930 LET W$(K)="THR% E"
931 LET P(K)=X-2
932 PRINT AT 3,X-1;"\''\''\: ";AT 4,X+1;"\: ";AT 5,X-1;"\ '\''\: ";AT 6,X+1;"\: ";AT 7,X-1;"\''\''\' "
933 RETURN
960 LET W$(K)="KN% E"
961 LET P(K)=X-2
962 PRINT AT 0,X+1;"% \: ";AT 1,X+1;"\':\' ";AT 2,X+1;"\: ";AT 3,X;"\ :\ '\..\. ";AT 4,X;"\: ";AT 5,X-1;"\ :\ '\. ";AT 6,X-1;"\ : \ '\. <";AT 7,X-2;"\ .\' \: ";AT 8,X-2;"\'. \''"
968 RETURN
1000 LET W$(K)="F% VE"
1001 LET P(K)=X-2
1002 PRINT AT 2,X-1;"\:'\''\' ";AT 3,X-1;"\:.\. ";AT 4,X;"\ '\. ";AT 5,X-1;"\. \ .\' ";AT 6,X-1;"\ '\' "
1003 RETURN
1030 LET W$(K)="K% TE"
1031 LET P(K)=X-2
1032 PRINT AT 0,X;"\.:\. ";AT 1,X-1;"\ .\':\'.";AT 2,X-1;"\.:\.:\.:\. ";AT 3,X-1;"\ :\ :\ :";AT 4,X;"% \: ";AT 5,X;"\ :";AT 6,X+1;"\'.";AT 7,X+1;"\.'";AT 8,X+1;"\ '"
1033 RETURN
1060 LET W$(K)="N% NE"
1061 LET P(K)=X-2
1063 PRINT AT 2,X-1;"\:'\''\: ";AT 3,X-1;"\: \: ";AT 4,X-1;"\''\''\: ";AT 5,X-1;"\. \: ";AT 6,X-1;"\''\''\' "
1064 RETURN
1100 LET W$(K)="B% AT"
1101 LET P(K)=X-2
1102 PRINT AT 1,X-2;"\..\..\..\..\. ";AT 2,X-2;"\ '\. \ '\. ";AT 3,X-1;"\.' \.'";AT 4,X-2;"\ '\''\':\''\''";AT 5,X-4;"\..\..\..\..\.:\..\..\..>";AT 6,X-4;"\':% % % % % \:'";AT 7,X-3;"\''\''\''\''\''"
1103 RETURN
1130 LET W$(K)="THR% W"
1131 LET P(K)=X-2
1132 PRINT AT 2,X+2;">";AT 3,X-2;"\ :% >\ '";AT 4,X-2;"\ '\:' \.'";AT 5,X-3;"\ .\''\:'\''";AT 6,X-3;"\' \: ";AT 7,X-2;"\.'\ '\. ";AT 8,X-3;"\ ' \ '"
1133 RETURN
1160 LET W$(K)="N% SE"
1161 LET P(K)=X-2
1162 PRINT AT 1,X-1;"\ .% \. ";AT 2,X-1;"% \:.\:.";AT 3,X-1;"% % \' ";AT 4,X-1;"\':\:'\' "
1163 FOR G=1 TO 3
1164 PRINT AT 2,1+X;"\: "
1165 LET U=USR 16514
1166 PRINT AT 2,X+1;"\:."
1167 LET U=USR 16514
1168 NEXT G
1169 RETURN
1200 LET W$(K)="% NITED"
1201 LET P(K)=X-3
1202 PRINT AT 1,X-3;"\..\..\..\..\..\. \.:";AT 2,X-4;"\ .% % % % % % \.:% ";AT 3,X-4;"\ :AMERICA\: ";AT 4,X-4;"\ '% % % % % % % \: ";AT 5,X-3;"\''\''% % % % % \: ";AT 6,X;"\':\:' \: ";AT 7,X+1;"\' "
1203 PRINT AT 11,P(K);"STATES"
1204 RETURN
1230 LET W$(K)="F% EL"
1231 LET P(K)=X-2
1232 PRINT AT 1,X-4;"\##\##\##";AT 2,X-4;"\##%G\##";AT 3,X-4;"\##%A\##";AT 4,X-4;"\##%S\##\'. \:'\''\':";AT 5,X-4;"\##\##\##\ '\..\:.\..\.:";AT 6,X-4;"\##\##\## % % % ";AT 7,X-4;"\##\##\## \: \ :"
1233 RETURN
1260 LET W$(K)="T% BE"
1261 LET P(K)=X-2
1262 PRINT AT 2,X-4;"\ .\..\..\..\..\..\..\..\. ";AT 3,X-4;"\ :\##TOOTH\##\:.";AT 4,X-4;"\ :\##PASTE\##\:'";AT 5,X-4;"\ '\''\''\''\''\''\''\''\' "
1263 RETURN
1500 LET W$(K)="FL% G"
1501 LET P(K)=X-2
1503 LET B=X-4
1504 PRINT AT 0,B;"\ .\..\..\..\..\..\..\..";AT 1,B;"\ :***\:'\''\''\':";AT 2,B;"\ :***\:'\''\''\':";AT 3,B;"\ :\''\''\''\''\''\''\':";AT 4,B;"\ :\''\''\''\''\''\''\':";AT 5,B;"\ :\''\''\''\''\''\''\''";AT 6,B;"\ :"
1505 RETURN
1530 LET W$(K)="% DD"
1531 LET P(K)=X-1
1532 PRINT AT 1,X-2;"3+2=\##";AT 3,X;"75";AT 4,X-1;"+23";AT 5,X-1;"\''\''\''"
1533 RETURN
1560 LET W$(K)="P% N"
1561 LET P(K)=X-1
1562 PRINT AT 3,X-3;"\..\..\..\..";AT 4,X-4;"\ :\' \ '\:.\..\..\..";AT 5,X-4;"\ :\:.\..\..\.:\: ";AT 6,X-4;"\ '% % % % \' "
1563 RETURN
1600 LET W$(K)="T% N"
1601 LET P(K)=X-1
1602 LET B=X-2
1603 PRINT AT 2,B;"\ : \:'\''\':";AT 3,B;"\ : \: \ :";AT 4,B;"\ : \: \ :";AT 5,B;"\ : \:.\..\.:"
1604 RETURN
1630 LET W$(K)="DR% SS"
1631 LET P(K)=X-2
1632 PRINT AT 1,X-2;"\.:\:.\.:\:.";AT 2,X-3;"\ '\:'% % \':\' ";AT 3,X-2;"\ .% % \. ";AT 4,X-3;"\ .% % % % \. ";AT 5,X-4;"\ .% % % % % % \. "
1633 RETURN
1660 LET W$(K)="L% G"
1661 LET P(K)=X-1
1662 LET B=X-1
1663 PRINT AT 0,X;"% \: ";AT 1,X;"\':\' ";AT 2,B;"% % % \: ";AT 3,B;"\: % \: \: ";AT 4,B;"\' % \: \' ";AT 5,B;"\ :% % ";AT 6,B;"\ :\: \##<";AT 7,B;"\ :\: \##<"
1664 RETURN
1700 LET W$(K)="S% X"
1701 LET P(K)=X-1
1702 LET B=X-1
1703 PRINT AT 1,X;"\..";AT 2,B;"\.' \' ";AT 3,B;"\: ";AT 4,B;"\:.\''\'.";AT 5,B;"\: \ :";AT 6,B;"\ '\..\' "
1704 RETURN
1730 LET W$(K)="SH% P"
1731 LET P(K)=X-2
1732 PRINT AT 3,X-3;"\..\:.\:.\. ";AT 4,X-5;"\ .\..% \:'% \:'% \:'% \:'";AT 5,X-4;"\':\:.% \:.% \:.% \:'";AT 6,X-5;"\@@\@@\@@\@@\@@\@@\@@\@@\@@\@@"
1733 RETURN
1760 LET W$(K)="WR% ST"
1761 LET P(K)=X-2
1762 LET B=X-1
1763 PRINT AT 0,B;"\..\..\..";AT 1,B;"\:'% \':";AT 2,B;"% \''% ";AT 3,B;"\''% \''"
1764 LET B=X-2
1765 PRINT AT 4,B;"% % % % % ";AT 5,B;"% \ :% \: % ";AT 6,B-1;">\##\ :% \: \##<";AT 7,B;"W W"
1766 RETURN
1800 LET W$(K)="P% T"
1801 LET P(K)=X-1
1802 PRINT AT 1,X-2;"\..";AT 2,X-4;"\ .\'' \''\. ";AT 3,X-4;"\:. \.:\..\..\..";AT 4,X-4;"% % \..% % ";AT 5,X-4;"\':% % % \:'";AT 6,X-3;"\ '\''\' "
1803 RETURN
1830 LET W$(K)="CL% CK"
1831 LET P(K)=X-3
1832 PRINT AT 1,X;"\..\. ";AT 2,X-2;"\ .\''\ .\ '\'.";AT 3,X-2;"\: \ : \: ";AT 4,X-3;"\ : \ :\..\. \ :";AT 5,X-3;"\ '\. \.'";AT 6,X-2;"\'. \ .\' ";AT 7,X-1;"\''\..\.'\' "
1833 RETURN
1860 LET W$(K)="ST% P"
1861 LET P(K)=X-2
1862 PRINT AT 0,X-2;"\ .% % \. ";AT 1,X-3;"\ .% % % % \. ";AT 2,X-3;"% ST P% ";AT 3,X-3;"% % % % % % ";AT 4,X-3;"\ '% % % % \' ";AT 5,X-2;"\ '% % \' ";AT 6,X-1;"\ :\: ";AT 7,X-1;"\ :\: "
1863 RETURN
1900 LET W$(K)="G% N"
1901 LET P(K)=X-1
1902 LET B=X-4
1903 PRINT AT 2,B;"\ :% % % % % -->";AT 3,B;"\ :\: \: \:'\''";AT 4,B;"\ :\:.\..\: ";AT 5,B;"\ :\: "
1904 RETURN
1930 LET W$(K)="DR% M"
1931 LET P(K)=X-2
1932 PRINT AT 0,X+2;"/";AT 1,X-1;"\.. \ ' /";AT 2,X-3;"\ .\'' \''\. \ '";AT 3,X-3;"\:. \.:";AT 4,X-3;"% % \..% % ";AT 5,X-3;"\':% % % \:'";AT 6,X-2;"\ '\''\' "
1933 RETURN
1960 LET W$(K)="B% S"
1961 LET P(K)=X-1
1962 LET B=X-3
1963 PRINT AT 2,B;"% \''\:'\':\''% % ";AT 3,B;"% \..\:.\.:\..% \ :% ";AT 4,B;"% % % % % % \.:% ";AT 5,B+1;"\' \ '"
1964 RETURN
Note: Type-in program listings on this website use ZMAKEBAS notation for graphics characters.
People
E
Skip to content
Computer Tutor
Products: Computer Tutors: Alpha/Vowel Tutors
Developer(s): Lou Goldstein
Date: 1982
Type: Cassette
Platform(s): TS 1000
Tags: Education
AlphaTutor and VowelTutor are a paired set of educational programs designed to teach children letter recognition and vowel sounds through a picture-matching quiz format. Each round randomly selects three images drawn entirely in block graphics, displays them with numbered labels, and prompts the child to identify which picture matches a highlighted letter or vowel shown in a bordered box. The programs use computed GOSUB targets (e.g., `GOSUB 200*L(K)+500` and `GOSUB 700*LS+100*L(K)+30*Z`) to dispatch to one of 26 picture-drawing subroutines covering letters A–Z and multiple vowel-sound variants. VowelTutor extends the concept with separate long and short vowel word sets per letter, selected by a random or user-chosen mode flag, and includes an animated nose-sniffing and hat/smile flip routine via `USR 16514`, pointing to a small machine-code delay loop stored in the REM statement at line 1.
Program Analysis
This listing contains two related programs: AlphaTutor and VowelTutor, both credited to Lou Goldstein / SoftSync Inc., 1982. AlphaTutor covers all 26 letters of the alphabet; VowelTutor extends the concept to long and short vowel sounds, offering multiple word variants per vowel. Both share the same core quiz loop and picture-rendering architecture.
Program Structure
Both programs follow the same top-level flow:
- Title/splash screen (lines 12–14), then
RAND to seed the RNG.
- Initialise arrays
P(3), W$(3,10), L(3) (lines 18–20).
- Main loop (lines 30–200): pick three distinct random indices, choose one as the target, dispatch to a drawing subroutine for each, display a letter/vowel prompt box, read a numeric answer, give feedback, pause, clear and repeat.
- Drawing subroutines: one per picture subject, each printing block-graphic art, setting
P(K) (label column) and W$(K) (word string).
VowelTutor adds a mode-selection screen (lines 23–27) offering long vowels, short vowels, or both, stored in LS, and allows the user to return to mode selection by entering 9.
Computed GOSUB Dispatch
The most architecturally notable feature is the use of arithmetic expressions as GOSUB targets to select picture subroutines without IF/THEN chains:
- AlphaTutor:
GOSUB 200*L(K)+500 — with L(K) in 0–25, this generates targets 500 (A=ambulance), 700 (B=boy), 900 (C=car) … 5500 (Z=zigzag), spaced 200 apart.
- VowelTutor:
GOSUB 700*LS+100*L(K)+30*Z — the LS factor (1=long, 2=short) shifts into a separate bank of subroutines; L(K) selects the vowel (1–5 = A/E/I/O/U); Z (0–2) selects one of up to three word variants per vowel per length.
This is a compact and efficient dispatch mechanism that avoids long IF/THEN chains entirely, at the cost of requiring subroutines to be placed at exactly the computed line numbers.
Machine Code Usage
Line 1 in both programs is a REM statement whose body encodes a short Z80 machine-code routine. The sequence \06\01\C5\06\64\00\10\FD\C1\10\F7\C9 disassembles as:
LD B,1 — outer loop count
PUSH BC
LD B,100 ; LD C,0 — inner delay count (25600 iterations)
DJNZ $ — inner loop
POP BC ; DJNZ … — outer loop
RET
This routine is called via LET E=USR 16514 (the address of the REM body in the VowelTutor variant is slightly longer, hence a different offset in practice). It is used as a simple software delay in animation sequences — for example, the hat flip in AlphaTutor (lines 1901–1906), the smile animation (lines 4101–4106), and the nose-sniffing effect (lines 1163–1168 in VowelTutor).
Key BASIC Idioms
- Block graphic art: All pictures are rendered using the ZX81/TS1000 block graphic characters (2×2 pixel sub-characters), encoded here as zmakebas escape sequences such as
\ ., \:., \'', etc.
- Distinct random selection: Lines 60 check
L(1)=L(2) OR L(1)=L(3) OR L(2)=L(3) and loop back if any two indices collide, ensuring three distinct pictures appear each round.
- Column positioning via formula:
LET X=10*K-5 (line 110) distributes the three picture columns evenly across the 32-character screen (columns 5, 15, 25).
- Answer box: The target letter is displayed in a bordered box drawn with block graphics at lines 19–21 using
AT positioning.
- PLOT for QUEEN and CONE: The subroutines at lines 3700 and 830 use
PLOT with pixel coordinates to draw vertical lines, since the block graphic resolution is insufficient for narrow strokes.
VowelTutor Word-Embedding Technique
In VowelTutor, word labels use a space character as a placeholder for the missing vowel (e.g., "TR% IN" for TRAIN, "K% TE" for KITE). After the round is set up, lines 151–155 scan W$(C) character-by-character to find the first "% " (space) position, then replace it with the actual vowel character A$ — effectively filling in the blank dynamically. This lets the same word string serve as both a gapped display and, after substitution, the correct spelled form.
Notable Subroutine Sharing
AlphaTutor’s GIRL subroutine (line 1700) is shared with BOY (line 700): the BOY subroutine calls GOSUB 1700 to draw the upper body, then the shared routine checks IF L(K)=1 THEN RETURN (line 1710) to exit early for BOY, or continues to draw the skirt/legs for GIRL. Similarly, VowelTutor’s WOMAN subroutine (line 4900) reuses the MAN subroutine (line 2900) for the head and torso, then overprints with different lower-body graphics.
Array Sizing
Array Dimensions Purpose P(3)3 elements Column position for each picture’s word label W$(3,10)3 strings × 10 chars Word associated with each picture slot L(3) / L(5)3 (Alpha) / 5 (Vowel) Random index for picture selection
Potential Anomalies
- AlphaTutor has no subroutine at the computed target for letter index 0 (line 500 handles A=0, as
200*0+500=500) — this is correct; L(K)=INT(RND*26) yields 0–25, mapping to lines 500–5500.
- VowelTutor’s
GOSUB 700*LS+100*L(K)+30*Z for LS=2 (short vowels) can yield targets like 1400+30*Z (lines 1400, 1430, 1460) which are not all defined in the listing — some short-vowel variant slots appear absent, which would cause a BASIC error if selected. This may reflect incomplete subroutine coverage in the original listing.
- The
PAUSE 33000 at line 14 provides a long title-screen pause (~30 seconds at normal speed) but any key press does not skip it — the user must wait it out unless they press BREAK.
- In VowelTutor, the
\## sequences in several subroutines (e.g., lines 1232, 1262, 1532) are not standard zmakebas escape sequences and likely represent inverse-video block characters or UDGs in the original tape file that were not fully decoded in this transcription.
Content
Source Code
1 REM \06\01\C5\06\64\00\10\FD\C1\10\F7\C9\2E\2E\2E\2E\2E\2E
2 SAVE "AB%C"
12 PRINT AT 8,11;"ALPHATUTOR";AT 10,2;"COPYRIGHT 1982 LOU GOLDSTEIN";AT 12,6;"% %F%R%O%M% %S%O%F%T%S%Y%N%C% %I%N%C% "
13 PRINT AT 20,5;"PRESS ""ENTER"" TO START"
14 PAUSE 33000
15 RAND
17 CLS
18 DIM P(3)
19 DIM W$(3,10)
20 DIM L(3)
30 FOR K=1 TO 3
40 LET L(K)=INT (RND*26)
50 NEXT K
60 IF L(1)=L(2) OR L(1)=L(3) OR L(2)=L(3) THEN GOTO 30
80 LET C=INT (RND*3)+1
90 LET A$=CHR$ (L(C)+38)
100 FOR K=1 TO 3
110 LET X=10*K-5
120 GOSUB 200*L(K)+500
121 PRINT AT 10,P(K);"% ";W$(K,2 TO )
130 PRINT AT 15,X;K
140 NEXT K
150 PRINT AT 19,14;"\:'\''\':";AT 20,14;"\: ";A$;"\ :";AT 21,14;"\:.\..\.:"
160 INPUT R
170 IF R<>C THEN PRINT AT 16,10*C-9;"% % % % % % % % % "
180 IF R=C THEN PRINT AT 16,10*C-9;"*********"
185 PRINT AT 13,P(C);W$(C)
190 PAUSE 250
195 CLS
200 GOTO 30
500 PRINT AT 3,X-3;"\..\..\..\..";AT 4,X-3;"\: \ . \ :";AT 5,X-3;"\: \':\' \ '\''\':";AT 6,X-3;"\:.\..\..\..\..\.:";AT 7,X-3;"\' \' "
501 LET P(K)=X-4
502 LET W$(K)="AMBULANCE"
510 RETURN
700 GOSUB 1700
710 PRINT AT 4,X;"\ :";AT 5,X;"\.'\. ";AT 6,X-1;"\.' \ '\. ";AT 7,X-2;"\.' \ '\. "
711 LET P(K)=X-1
712 LET W$(K)="BOY"
720 RETURN
900 PRINT AT 5,X-3;"\ :% % % ";AT 6,X-3;"\ :% % % % % ";AT 7,X-2;"\' \ '"
901 LET P(K)=X-1
902 LET W$(K)="CAR"
910 RETURN
1100 PRINT AT 1,X-4;"\ . \:.\. ";AT 2,X-3;"\'. % \. ";AT 3,X-2;"% % % ";AT 4,X-2;"\:'\''\':";AT 5,X-2;"\: \ :"
1101 LET P(K)=X-1
1102 LET W$(K)="DOG"
1110 RETURN
1300 PRINT AT 1,X-4;"\ .% % % \..";AT 2,X-4;"% % % % \.:";AT 3,X-4;"\':% % \:'\ '\..\' ";AT 4,X-4;"\ : \: "
1301 LET P(K)=X-4
1302 LET W$(K)="ELEPHANT"
1310 RETURN
1500 PRINT AT 1,X-4;"\ . \ .\..";AT 2,X-4;"\ :\:.\.:% % \':\. ";AT 3,X-4;"\ :% % % % % \. ";AT 4,X-4;"\ :\' \ '\':\:'\' "
1501 LET P(K)=X-2
1502 LET W$(K)="FISH"
1510 RETURN
1700 PRINT AT 0,X;"% \: ";AT 1,X;"\':\' ";AT 2,X-1;"\ .\':\'.";AT 3,X-1;"\' \ : \' "
1710 IF L(K)=1 THEN RETURN
1720 PRINT AT 4,X;"\.:\. ";AT 5,X-1;"\.:% % \. ";AT 6,X-2;"\ '\:'\''\''\:'";AT 7,X-1;"\: \: "
1721 LET P(K)=X-2
1722 LET W$(K)="GIRL"
1730 RETURN
1900 PRINT AT 1,X-2;">\ .\..\..\. <";AT 2,X-1;"\.:% % \:.";AT 3,X-1;"\ :..\: ";AT 4,X-1;"\ : \: ";AT 5,X-1;"\ :\ '\' \: ";AT 6,X;"\''\''"
1901 FOR F=1 TO 2
1902 PRINT AT 1,X-1;" ";AT 2,X-1;"\ .\..\..\. "
1903 LET E=USR 16514
1904 PRINT AT 1,X-1;"\ .\..\..\. ";AT 2,X-1;"\.:% % \:."
1905 LET E=USR 16514
1906 NEXT F
1907 LET P(K)=X-1
1908 LET W$(K)="HAT"
1910 RETURN
2100 PRINT AT 1,X-1;"\ :";AT 2,X-1;"\ :";AT 3,X-2;"\ .\''\''\''\. ";AT 4,X-2;"\ :\~~\~~\~~\: ";AT 5,X-2;"\ :\ ' \' \: ";AT 6,X-2;"\ :\ .\..\. \: ";AT 7,X-2;"\ '\..\..\..\' "
2101 LET P(K)=X-3
2102 LET W$(K)="INDIAN"
2110 RETURN
2300 PRINT AT 1,X-3;"---\:.";AT 2,X-3;"\':\..\..\.:\:.\..";AT 3,X-3;"\ :\..\..\..\..\..% >";AT 4,X-3;"---\ .\:'";AT 5,X-3;"---\:'"
2301 LET P(K)=X-1
2302 LET W$(K)="JET"
2310 RETURN
2500 LET P(K)=X-2
2522 LET W$(K)="KING"
2523 PRINT AT 1,X-2;"\. \. \. \. \. ";AT 2,X-2;"\':\''\''\':\' ";AT 3,X-2;"\ :\ '\ '\ :";AT 4,X-2;"\ : \' \ :";AT 5,X-2;"\ :\ '\''\ :";AT 6,X-1;"\':% \' "
2530 RETURN
2700 PRINT AT 2,X-3;"A B C D";AT 3,X-2;"E F G"
2701 LET P(K)=X-4
2702 LET W$(K)="LETTERS"
2710 RETURN
2900 PRINT AT 1,X;"% \: ";AT 2,X;"\':\' ";AT 3,X-1;"% % % \: ";AT 4,X-1;"\: % \: \: ";AT 5,X-1;"\' % \: \' "
2910 IF L(K)=22 THEN RETURN
2920 PRINT AT 6,X-1;"\ :% % ";AT 7,X-1;"\ :\: % ";AT 8,X-1;"\ :\: % "
2921 LET P(K)=X-1
2922 LET W$(K)="MAN"
2930 RETURN
3100 PRINT AT 3,X-3;"1 2 3 4";AT 4,X-2;"5 6 7"
3101 LET P(K)=X-3
3102 LET W$(K)="NUMBERS"
3110 RETURN
3300 PRINT AT 1,X-4;"\. ";AT 2,X-4;"\ '\'. \.:\. \..\. ";AT 3,X-2;"\':% % \''";AT 4,X-4;"\ .\.'\':% % \.. \.'";AT 5,X-4;"\' \ .\.'\.'\.'\. \''";AT 6,X-4;"\ .\' \ .\' \'.\ '\'.";AT 7,X-4;"\' \ .\' \ '\. "
3301 LET P(K)=X-3
3302 LET W$(K)="OCTOPUS"
3310 RETURN
3500 PRINT AT 5,X-2;"\..\..\..\..% ";AT 4,X+2;"*";AT 3,X+2;"*"
3501 LET P(K)=X-1
3502 LET W$(K)="PIPE"
3510 RETURN
3700 GOSUB 2500
3710 FOR Y=38 TO 29 STEP -1
3720 PLOT 2*X-4,Y
3730 PLOT 2*X+4,Y
3740 NEXT Y
3751 LET P(K)=X-2
3752 LET W$(K)="QUEEN"
3760 RETURN
3900 PRINT AT 1,X;"A";AT 2,X;"% ";AT 3,X;"% ";AT 4,X;"% ";AT 5,X;"% ";AT 6,X-1;"\..% \..";AT 7,X-1;"\' *\ '";AT 8,X;"*"
3901 LET P(K)=X-3
3902 LET W$(K)="ROCKET"
3910 RETURN
4100 PRINT AT 1,X-1;"\..\..\..";AT 2,X-2;"\ :\ . \. \: ";AT 3,X-2;"\ : \: ";AT 4,X-3;">\ :\ . \. \: <";AT 5,X-2;"\ : \'' \: ";AT 6,X-1;"\''\''\''"
4101 FOR F=1 TO 2
4102 PRINT AT 4,X-1;" ";AT 5,X-1;"\ '\''\' "
4103 LET E=USR 16514
4104 PRINT AT 4,X-1;"\ . \. ";AT 5,X-1;" \'' "
4105 LET E=USR 16514
4106 NEXT F
4107 LET P(K)=X-2
4108 LET W$(K)="SMILE"
4110 RETURN
4300 PRINT AT 1,X-1;"\ .% \. ";AT 2,X-2;"\ .% % % \. ";AT 3,X-2;"% % % % % ";AT 4,X-2;"\ '% % % \' ";AT 5,X-1;"\ '% \' ";AT 6,X;"% ";AT 7,X-1;"\ .% \. "
4301 LET P(K)=X-2
4302 LET W$(K)="TREE"
4310 RETURN
4500 PRINT AT 1,X;"\.:\. ";AT 2,X-1;"\.'\ :\ '\. ";AT 3,X;"\ :";AT 4,X;"\ :"
4501 LET P(K)=X-1
4502 LET W$(K)="UP"
4510 RETURN
4700 PRINT AT 2,X-2;"\ .\. \..";AT 3,X-2;"% % \. \.:% \: ";AT 4,X-2;"\':% % % % \' ";AT 5,X-1;"\':% % \' ";AT 6,X;"\':\' "
4701 LET P(K)=X-4
4702 LET W$(K)="VALENTINE"
4710 RETURN
4900 GOSUB 2900
4910 PRINT AT 6,X-1;"\.:% % \. ";AT 7,X-2;"\.:% % % % \. ";AT 8,X-1;"\ :\: % "
4911 LET P(K)=X-2
4912 LET W$(K)="WOMAN"
4920 RETURN
5100 PRINT AT 1,X-3;"\: \: \: \: \: \: \: ";AT 2,X-3;"\: \: \: \: \: \' ";AT 3,X-3;"\: \: \: \' \. ";AT 4,X-3;"\: \' \. /";AT 5,X-1;"/"
5101 LET P(K)=X-4
5102 LET W$(K)="XYLOPHONE"
5110 RETURN
5300 PRINT AT 1,X-1;"\ .% \. ";AT 2,X-1;"% % \':";AT 3,X-1;"% % % \. <";AT 4,X-1;"% % \''<";AT 5,X-1;"% % \.. <";AT 6,X-1;"\ :% "
5301 LET P(K)=X-1
5302 LET W$(K)="YELL"
5310 RETURN
5500 PRINT AT 3,X-2;"\.'\. \.'";AT 4,X-3;"\ ' \ '\. \.'\.'";AT 5,X;"\ '"
5501 LET P(K)=X-3
5502 LET W$(K)="ZIGZAG"
5510 RETURN
1 REM \06\01\C5\06\64\00\10\FD\C1\10\F7\C9\2E\2E\2E\2E\2E\2E\2E\2E\2E\2E\2E
2 SAVE "VOWE%L"
12 PRINT AT 8,11;"VOWELTUTOR";AT 10,2;"COPYRIGHT 1982 LOU GOLDSTEIN";AT 12,7;"% %F%R%O%M% %S%O%F%T%S%Y%N%C% %I%N%C% "
13 PRINT AT 20,5;"PRESS ""ENTER"" TO START"
14 PAUSE 33000
15 RAND
16 LET V$="AEIOU"
17 CLS
18 DIM P(3)
19 DIM W$(3,10)
20 DIM L(5)
23 PRINT AT 6,0;"WHICH VOWELS DO YOU WANT TO USE?1=LONG",,"2=SHORT",,"3=BOTH",,"4=EXIT PROGRAM"
24 INPUT O
25 LET LS=O
26 CLS
27 IF O=4 THEN STOP
30 IF O=3 THEN LET LS=INT (RND*2)+1
31 FOR K=1 TO 3
32 FAST
40 LET L(K)=INT (RND*5)+1
50 NEXT K
60 IF L(1)=L(2) OR L(1)=L(3) OR L(2)=L(3) THEN GOTO 31
80 LET C=INT (RND*3)+1
90 LET A$=V$(L(C))
99 SLOW
100 FOR K=1 TO 3
105 LET Z=INT (RND*3)
110 LET X=10*K-5
120 GOSUB 700*LS+100*L(K)+30*Z
121 PRINT AT 10,P(K);W$(K)
130 PRINT AT 15,X;K
140 NEXT K
150 PRINT AT 19,14;"\:'\''\':";AT 20,14;"\: ";A$;"\ :";AT 21,14;"\:.\..\.:"
151 FOR J=1 TO 10
152 IF W$(C,J)="% " THEN GOTO 155
153 NEXT J
155 LET W$(C,J)=A$
156 INPUT R
157 IF R=9 THEN CLS
160 IF R=9 THEN GOTO 23
170 IF R<>C THEN PRINT AT 16,10*C-9;"% % % % % % % % % "
180 IF R=C THEN PRINT AT 16,10*C-9;"*********"
185 PRINT AT 13,P(C);W$(C)
190 PAUSE 250
195 CLS
200 GOTO 30
800 LET W$(K)="TR% IN"
801 LET P(K)=X-2
802 PRINT AT 2,X-1;"*";AT 3,X;"*";AT 4,X;"\ :\..\. ";AT 5,X-4;"\ :% \.:% \.:% % >";AT 6,X-4;"\ '\ '\ '\ '\ ' \ '"
803 RETURN
830 LET W$(K)="C% NE"
831 LET P(K)=X-1
832 PRINT AT 1,X+1;"\' ";AT 0,X-1;"\ .\''\. "
833 FOR Y=41 TO 30 STEP -1
834 PLOT 2*X-1,Y
835 NEXT Y
836 RETURN
860 LET W$(K)="D% YS"
861 LET P(K)=X-2
862 PRINT AT 2,X-1;"FRI.";AT 4,X-1;"SAT.";AT 6,X-1;"SUN."
863 RETURN
900 LET W$(K)="K% Y"
901 LET P(K)=X-1
902 PRINT AT 3,X-3;"% % ";AT 4,X-3;"% % \:'\''\':% % \' ";AT 5,X-3;"% % \ '\ :\ '"
903 RETURN
930 LET W$(K)="THR% E"
931 LET P(K)=X-2
932 PRINT AT 3,X-1;"\''\''\: ";AT 4,X+1;"\: ";AT 5,X-1;"\ '\''\: ";AT 6,X+1;"\: ";AT 7,X-1;"\''\''\' "
933 RETURN
960 LET W$(K)="KN% E"
961 LET P(K)=X-2
962 PRINT AT 0,X+1;"% \: ";AT 1,X+1;"\':\' ";AT 2,X+1;"\: ";AT 3,X;"\ :\ '\..\. ";AT 4,X;"\: ";AT 5,X-1;"\ :\ '\. ";AT 6,X-1;"\ : \ '\. <";AT 7,X-2;"\ .\' \: ";AT 8,X-2;"\'. \''"
968 RETURN
1000 LET W$(K)="F% VE"
1001 LET P(K)=X-2
1002 PRINT AT 2,X-1;"\:'\''\' ";AT 3,X-1;"\:.\. ";AT 4,X;"\ '\. ";AT 5,X-1;"\. \ .\' ";AT 6,X-1;"\ '\' "
1003 RETURN
1030 LET W$(K)="K% TE"
1031 LET P(K)=X-2
1032 PRINT AT 0,X;"\.:\. ";AT 1,X-1;"\ .\':\'.";AT 2,X-1;"\.:\.:\.:\. ";AT 3,X-1;"\ :\ :\ :";AT 4,X;"% \: ";AT 5,X;"\ :";AT 6,X+1;"\'.";AT 7,X+1;"\.'";AT 8,X+1;"\ '"
1033 RETURN
1060 LET W$(K)="N% NE"
1061 LET P(K)=X-2
1063 PRINT AT 2,X-1;"\:'\''\: ";AT 3,X-1;"\: \: ";AT 4,X-1;"\''\''\: ";AT 5,X-1;"\. \: ";AT 6,X-1;"\''\''\' "
1064 RETURN
1100 LET W$(K)="B% AT"
1101 LET P(K)=X-2
1102 PRINT AT 1,X-2;"\..\..\..\..\. ";AT 2,X-2;"\ '\. \ '\. ";AT 3,X-1;"\.' \.'";AT 4,X-2;"\ '\''\':\''\''";AT 5,X-4;"\..\..\..\..\.:\..\..\..>";AT 6,X-4;"\':% % % % % \:'";AT 7,X-3;"\''\''\''\''\''"
1103 RETURN
1130 LET W$(K)="THR% W"
1131 LET P(K)=X-2
1132 PRINT AT 2,X+2;">";AT 3,X-2;"\ :% >\ '";AT 4,X-2;"\ '\:' \.'";AT 5,X-3;"\ .\''\:'\''";AT 6,X-3;"\' \: ";AT 7,X-2;"\.'\ '\. ";AT 8,X-3;"\ ' \ '"
1133 RETURN
1160 LET W$(K)="N% SE"
1161 LET P(K)=X-2
1162 PRINT AT 1,X-1;"\ .% \. ";AT 2,X-1;"% \:.\:.";AT 3,X-1;"% % \' ";AT 4,X-1;"\':\:'\' "
1163 FOR G=1 TO 3
1164 PRINT AT 2,1+X;"\: "
1165 LET U=USR 16514
1166 PRINT AT 2,X+1;"\:."
1167 LET U=USR 16514
1168 NEXT G
1169 RETURN
1200 LET W$(K)="% NITED"
1201 LET P(K)=X-3
1202 PRINT AT 1,X-3;"\..\..\..\..\..\. \.:";AT 2,X-4;"\ .% % % % % % \.:% ";AT 3,X-4;"\ :AMERICA\: ";AT 4,X-4;"\ '% % % % % % % \: ";AT 5,X-3;"\''\''% % % % % \: ";AT 6,X;"\':\:' \: ";AT 7,X+1;"\' "
1203 PRINT AT 11,P(K);"STATES"
1204 RETURN
1230 LET W$(K)="F% EL"
1231 LET P(K)=X-2
1232 PRINT AT 1,X-4;"\##\##\##";AT 2,X-4;"\##%G\##";AT 3,X-4;"\##%A\##";AT 4,X-4;"\##%S\##\'. \:'\''\':";AT 5,X-4;"\##\##\##\ '\..\:.\..\.:";AT 6,X-4;"\##\##\## % % % ";AT 7,X-4;"\##\##\## \: \ :"
1233 RETURN
1260 LET W$(K)="T% BE"
1261 LET P(K)=X-2
1262 PRINT AT 2,X-4;"\ .\..\..\..\..\..\..\..\. ";AT 3,X-4;"\ :\##TOOTH\##\:.";AT 4,X-4;"\ :\##PASTE\##\:'";AT 5,X-4;"\ '\''\''\''\''\''\''\''\' "
1263 RETURN
1500 LET W$(K)="FL% G"
1501 LET P(K)=X-2
1503 LET B=X-4
1504 PRINT AT 0,B;"\ .\..\..\..\..\..\..\..";AT 1,B;"\ :***\:'\''\''\':";AT 2,B;"\ :***\:'\''\''\':";AT 3,B;"\ :\''\''\''\''\''\''\':";AT 4,B;"\ :\''\''\''\''\''\''\':";AT 5,B;"\ :\''\''\''\''\''\''\''";AT 6,B;"\ :"
1505 RETURN
1530 LET W$(K)="% DD"
1531 LET P(K)=X-1
1532 PRINT AT 1,X-2;"3+2=\##";AT 3,X;"75";AT 4,X-1;"+23";AT 5,X-1;"\''\''\''"
1533 RETURN
1560 LET W$(K)="P% N"
1561 LET P(K)=X-1
1562 PRINT AT 3,X-3;"\..\..\..\..";AT 4,X-4;"\ :\' \ '\:.\..\..\..";AT 5,X-4;"\ :\:.\..\..\.:\: ";AT 6,X-4;"\ '% % % % \' "
1563 RETURN
1600 LET W$(K)="T% N"
1601 LET P(K)=X-1
1602 LET B=X-2
1603 PRINT AT 2,B;"\ : \:'\''\':";AT 3,B;"\ : \: \ :";AT 4,B;"\ : \: \ :";AT 5,B;"\ : \:.\..\.:"
1604 RETURN
1630 LET W$(K)="DR% SS"
1631 LET P(K)=X-2
1632 PRINT AT 1,X-2;"\.:\:.\.:\:.";AT 2,X-3;"\ '\:'% % \':\' ";AT 3,X-2;"\ .% % \. ";AT 4,X-3;"\ .% % % % \. ";AT 5,X-4;"\ .% % % % % % \. "
1633 RETURN
1660 LET W$(K)="L% G"
1661 LET P(K)=X-1
1662 LET B=X-1
1663 PRINT AT 0,X;"% \: ";AT 1,X;"\':\' ";AT 2,B;"% % % \: ";AT 3,B;"\: % \: \: ";AT 4,B;"\' % \: \' ";AT 5,B;"\ :% % ";AT 6,B;"\ :\: \##<";AT 7,B;"\ :\: \##<"
1664 RETURN
1700 LET W$(K)="S% X"
1701 LET P(K)=X-1
1702 LET B=X-1
1703 PRINT AT 1,X;"\..";AT 2,B;"\.' \' ";AT 3,B;"\: ";AT 4,B;"\:.\''\'.";AT 5,B;"\: \ :";AT 6,B;"\ '\..\' "
1704 RETURN
1730 LET W$(K)="SH% P"
1731 LET P(K)=X-2
1732 PRINT AT 3,X-3;"\..\:.\:.\. ";AT 4,X-5;"\ .\..% \:'% \:'% \:'% \:'";AT 5,X-4;"\':\:.% \:.% \:.% \:'";AT 6,X-5;"\@@\@@\@@\@@\@@\@@\@@\@@\@@\@@"
1733 RETURN
1760 LET W$(K)="WR% ST"
1761 LET P(K)=X-2
1762 LET B=X-1
1763 PRINT AT 0,B;"\..\..\..";AT 1,B;"\:'% \':";AT 2,B;"% \''% ";AT 3,B;"\''% \''"
1764 LET B=X-2
1765 PRINT AT 4,B;"% % % % % ";AT 5,B;"% \ :% \: % ";AT 6,B-1;">\##\ :% \: \##<";AT 7,B;"W W"
1766 RETURN
1800 LET W$(K)="P% T"
1801 LET P(K)=X-1
1802 PRINT AT 1,X-2;"\..";AT 2,X-4;"\ .\'' \''\. ";AT 3,X-4;"\:. \.:\..\..\..";AT 4,X-4;"% % \..% % ";AT 5,X-4;"\':% % % \:'";AT 6,X-3;"\ '\''\' "
1803 RETURN
1830 LET W$(K)="CL% CK"
1831 LET P(K)=X-3
1832 PRINT AT 1,X;"\..\. ";AT 2,X-2;"\ .\''\ .\ '\'.";AT 3,X-2;"\: \ : \: ";AT 4,X-3;"\ : \ :\..\. \ :";AT 5,X-3;"\ '\. \.'";AT 6,X-2;"\'. \ .\' ";AT 7,X-1;"\''\..\.'\' "
1833 RETURN
1860 LET W$(K)="ST% P"
1861 LET P(K)=X-2
1862 PRINT AT 0,X-2;"\ .% % \. ";AT 1,X-3;"\ .% % % % \. ";AT 2,X-3;"% ST P% ";AT 3,X-3;"% % % % % % ";AT 4,X-3;"\ '% % % % \' ";AT 5,X-2;"\ '% % \' ";AT 6,X-1;"\ :\: ";AT 7,X-1;"\ :\: "
1863 RETURN
1900 LET W$(K)="G% N"
1901 LET P(K)=X-1
1902 LET B=X-4
1903 PRINT AT 2,B;"\ :% % % % % -->";AT 3,B;"\ :\: \: \:'\''";AT 4,B;"\ :\:.\..\: ";AT 5,B;"\ :\: "
1904 RETURN
1930 LET W$(K)="DR% M"
1931 LET P(K)=X-2
1932 PRINT AT 0,X+2;"/";AT 1,X-1;"\.. \ ' /";AT 2,X-3;"\ .\'' \''\. \ '";AT 3,X-3;"\:. \.:";AT 4,X-3;"% % \..% % ";AT 5,X-3;"\':% % % \:'";AT 6,X-2;"\ '\''\' "
1933 RETURN
1960 LET W$(K)="B% S"
1961 LET P(K)=X-1
1962 LET B=X-3
1963 PRINT AT 2,B;"% \''\:'\':\''% % ";AT 3,B;"% \..\:.\.:\..% \ :% ";AT 4,B;"% % % % % % \.:% ";AT 5,B+1;"\' \ '"
1964 RETURN
Note: Type-in program listings on this website use ZMAKEBAS notation for graphics characters.
People
E
Skip to content
Computer Tutor
Products: Computer Tutors: Alpha/Vowel Tutors
Developer(s): Lou Goldstein
Date: 1982
Type: Cassette
Platform(s): TS 1000
Tags: Education
AlphaTutor and VowelTutor are a paired set of educational programs designed to teach children letter recognition and vowel sounds through a picture-matching quiz format. Each round randomly selects three images drawn entirely in block graphics, displays them with numbered labels, and prompts the child to identify which picture matches a highlighted letter or vowel shown in a bordered box. The programs use computed GOSUB targets (e.g., `GOSUB 200*L(K)+500` and `GOSUB 700*LS+100*L(K)+30*Z`) to dispatch to one of 26 picture-drawing subroutines covering letters A–Z and multiple vowel-sound variants. VowelTutor extends the concept with separate long and short vowel word sets per letter, selected by a random or user-chosen mode flag, and includes an animated nose-sniffing and hat/smile flip routine via `USR 16514`, pointing to a small machine-code delay loop stored in the REM statement at line 1.
Program Analysis
This listing contains two related programs: AlphaTutor and VowelTutor, both credited to Lou Goldstein / SoftSync Inc., 1982. AlphaTutor covers all 26 letters of the alphabet; VowelTutor extends the concept to long and short vowel sounds, offering multiple word variants per vowel. Both share the same core quiz loop and picture-rendering architecture.
Program Structure
Both programs follow the same top-level flow:
- Title/splash screen (lines 12–14), then
RAND to seed the RNG.
- Initialise arrays
P(3), W$(3,10), L(3) (lines 18–20).
- Main loop (lines 30–200): pick three distinct random indices, choose one as the target, dispatch to a drawing subroutine for each, display a letter/vowel prompt box, read a numeric answer, give feedback, pause, clear and repeat.
- Drawing subroutines: one per picture subject, each printing block-graphic art, setting
P(K) (label column) and W$(K) (word string).
VowelTutor adds a mode-selection screen (lines 23–27) offering long vowels, short vowels, or both, stored in LS, and allows the user to return to mode selection by entering 9.
Computed GOSUB Dispatch
The most architecturally notable feature is the use of arithmetic expressions as GOSUB targets to select picture subroutines without IF/THEN chains:
- AlphaTutor:
GOSUB 200*L(K)+500 — with L(K) in 0–25, this generates targets 500 (A=ambulance), 700 (B=boy), 900 (C=car) … 5500 (Z=zigzag), spaced 200 apart.
- VowelTutor:
GOSUB 700*LS+100*L(K)+30*Z — the LS factor (1=long, 2=short) shifts into a separate bank of subroutines; L(K) selects the vowel (1–5 = A/E/I/O/U); Z (0–2) selects one of up to three word variants per vowel per length.
This is a compact and efficient dispatch mechanism that avoids long IF/THEN chains entirely, at the cost of requiring subroutines to be placed at exactly the computed line numbers.
Machine Code Usage
Line 1 in both programs is a REM statement whose body encodes a short Z80 machine-code routine. The sequence \06\01\C5\06\64\00\10\FD\C1\10\F7\C9 disassembles as:
LD B,1 — outer loop count
PUSH BC
LD B,100 ; LD C,0 — inner delay count (25600 iterations)
DJNZ $ — inner loop
POP BC ; DJNZ … — outer loop
RET
This routine is called via LET E=USR 16514 (the address of the REM body in the VowelTutor variant is slightly longer, hence a different offset in practice). It is used as a simple software delay in animation sequences — for example, the hat flip in AlphaTutor (lines 1901–1906), the smile animation (lines 4101–4106), and the nose-sniffing effect (lines 1163–1168 in VowelTutor).
Key BASIC Idioms
- Block graphic art: All pictures are rendered using the ZX81/TS1000 block graphic characters (2×2 pixel sub-characters), encoded here as zmakebas escape sequences such as
\ ., \:., \'', etc.
- Distinct random selection: Lines 60 check
L(1)=L(2) OR L(1)=L(3) OR L(2)=L(3) and loop back if any two indices collide, ensuring three distinct pictures appear each round.
- Column positioning via formula:
LET X=10*K-5 (line 110) distributes the three picture columns evenly across the 32-character screen (columns 5, 15, 25).
- Answer box: The target letter is displayed in a bordered box drawn with block graphics at lines 19–21 using
AT positioning.
- PLOT for QUEEN and CONE: The subroutines at lines 3700 and 830 use
PLOT with pixel coordinates to draw vertical lines, since the block graphic resolution is insufficient for narrow strokes.
VowelTutor Word-Embedding Technique
In VowelTutor, word labels use a space character as a placeholder for the missing vowel (e.g., "TR% IN" for TRAIN, "K% TE" for KITE). After the round is set up, lines 151–155 scan W$(C) character-by-character to find the first "% " (space) position, then replace it with the actual vowel character A$ — effectively filling in the blank dynamically. This lets the same word string serve as both a gapped display and, after substitution, the correct spelled form.
Notable Subroutine Sharing
AlphaTutor’s GIRL subroutine (line 1700) is shared with BOY (line 700): the BOY subroutine calls GOSUB 1700 to draw the upper body, then the shared routine checks IF L(K)=1 THEN RETURN (line 1710) to exit early for BOY, or continues to draw the skirt/legs for GIRL. Similarly, VowelTutor’s WOMAN subroutine (line 4900) reuses the MAN subroutine (line 2900) for the head and torso, then overprints with different lower-body graphics.
Array Sizing
Array Dimensions Purpose P(3)3 elements Column position for each picture’s word label W$(3,10)3 strings × 10 chars Word associated with each picture slot L(3) / L(5)3 (Alpha) / 5 (Vowel) Random index for picture selection
Potential Anomalies
- AlphaTutor has no subroutine at the computed target for letter index 0 (line 500 handles A=0, as
200*0+500=500) — this is correct; L(K)=INT(RND*26) yields 0–25, mapping to lines 500–5500.
- VowelTutor’s
GOSUB 700*LS+100*L(K)+30*Z for LS=2 (short vowels) can yield targets like 1400+30*Z (lines 1400, 1430, 1460) which are not all defined in the listing — some short-vowel variant slots appear absent, which would cause a BASIC error if selected. This may reflect incomplete subroutine coverage in the original listing.
- The
PAUSE 33000 at line 14 provides a long title-screen pause (~30 seconds at normal speed) but any key press does not skip it — the user must wait it out unless they press BREAK.
- In VowelTutor, the
\## sequences in several subroutines (e.g., lines 1232, 1262, 1532) are not standard zmakebas escape sequences and likely represent inverse-video block characters or UDGs in the original tape file that were not fully decoded in this transcription.
Content
Source Code
1 REM \06\01\C5\06\64\00\10\FD\C1\10\F7\C9\2E\2E\2E\2E\2E\2E
2 SAVE "AB%C"
12 PRINT AT 8,11;"ALPHATUTOR";AT 10,2;"COPYRIGHT 1982 LOU GOLDSTEIN";AT 12,6;"% %F%R%O%M% %S%O%F%T%S%Y%N%C% %I%N%C% "
13 PRINT AT 20,5;"PRESS ""ENTER"" TO START"
14 PAUSE 33000
15 RAND
17 CLS
18 DIM P(3)
19 DIM W$(3,10)
20 DIM L(3)
30 FOR K=1 TO 3
40 LET L(K)=INT (RND*26)
50 NEXT K
60 IF L(1)=L(2) OR L(1)=L(3) OR L(2)=L(3) THEN GOTO 30
80 LET C=INT (RND*3)+1
90 LET A$=CHR$ (L(C)+38)
100 FOR K=1 TO 3
110 LET X=10*K-5
120 GOSUB 200*L(K)+500
121 PRINT AT 10,P(K);"% ";W$(K,2 TO )
130 PRINT AT 15,X;K
140 NEXT K
150 PRINT AT 19,14;"\:'\''\':";AT 20,14;"\: ";A$;"\ :";AT 21,14;"\:.\..\.:"
160 INPUT R
170 IF R<>C THEN PRINT AT 16,10*C-9;"% % % % % % % % % "
180 IF R=C THEN PRINT AT 16,10*C-9;"*********"
185 PRINT AT 13,P(C);W$(C)
190 PAUSE 250
195 CLS
200 GOTO 30
500 PRINT AT 3,X-3;"\..\..\..\..";AT 4,X-3;"\: \ . \ :";AT 5,X-3;"\: \':\' \ '\''\':";AT 6,X-3;"\:.\..\..\..\..\.:";AT 7,X-3;"\' \' "
501 LET P(K)=X-4
502 LET W$(K)="AMBULANCE"
510 RETURN
700 GOSUB 1700
710 PRINT AT 4,X;"\ :";AT 5,X;"\.'\. ";AT 6,X-1;"\.' \ '\. ";AT 7,X-2;"\.' \ '\. "
711 LET P(K)=X-1
712 LET W$(K)="BOY"
720 RETURN
900 PRINT AT 5,X-3;"\ :% % % ";AT 6,X-3;"\ :% % % % % ";AT 7,X-2;"\' \ '"
901 LET P(K)=X-1
902 LET W$(K)="CAR"
910 RETURN
1100 PRINT AT 1,X-4;"\ . \:.\. ";AT 2,X-3;"\'. % \. ";AT 3,X-2;"% % % ";AT 4,X-2;"\:'\''\':";AT 5,X-2;"\: \ :"
1101 LET P(K)=X-1
1102 LET W$(K)="DOG"
1110 RETURN
1300 PRINT AT 1,X-4;"\ .% % % \..";AT 2,X-4;"% % % % \.:";AT 3,X-4;"\':% % \:'\ '\..\' ";AT 4,X-4;"\ : \: "
1301 LET P(K)=X-4
1302 LET W$(K)="ELEPHANT"
1310 RETURN
1500 PRINT AT 1,X-4;"\ . \ .\..";AT 2,X-4;"\ :\:.\.:% % \':\. ";AT 3,X-4;"\ :% % % % % \. ";AT 4,X-4;"\ :\' \ '\':\:'\' "
1501 LET P(K)=X-2
1502 LET W$(K)="FISH"
1510 RETURN
1700 PRINT AT 0,X;"% \: ";AT 1,X;"\':\' ";AT 2,X-1;"\ .\':\'.";AT 3,X-1;"\' \ : \' "
1710 IF L(K)=1 THEN RETURN
1720 PRINT AT 4,X;"\.:\. ";AT 5,X-1;"\.:% % \. ";AT 6,X-2;"\ '\:'\''\''\:'";AT 7,X-1;"\: \: "
1721 LET P(K)=X-2
1722 LET W$(K)="GIRL"
1730 RETURN
1900 PRINT AT 1,X-2;">\ .\..\..\. <";AT 2,X-1;"\.:% % \:.";AT 3,X-1;"\ :..\: ";AT 4,X-1;"\ : \: ";AT 5,X-1;"\ :\ '\' \: ";AT 6,X;"\''\''"
1901 FOR F=1 TO 2
1902 PRINT AT 1,X-1;" ";AT 2,X-1;"\ .\..\..\. "
1903 LET E=USR 16514
1904 PRINT AT 1,X-1;"\ .\..\..\. ";AT 2,X-1;"\.:% % \:."
1905 LET E=USR 16514
1906 NEXT F
1907 LET P(K)=X-1
1908 LET W$(K)="HAT"
1910 RETURN
2100 PRINT AT 1,X-1;"\ :";AT 2,X-1;"\ :";AT 3,X-2;"\ .\''\''\''\. ";AT 4,X-2;"\ :\~~\~~\~~\: ";AT 5,X-2;"\ :\ ' \' \: ";AT 6,X-2;"\ :\ .\..\. \: ";AT 7,X-2;"\ '\..\..\..\' "
2101 LET P(K)=X-3
2102 LET W$(K)="INDIAN"
2110 RETURN
2300 PRINT AT 1,X-3;"---\:.";AT 2,X-3;"\':\..\..\.:\:.\..";AT 3,X-3;"\ :\..\..\..\..\..% >";AT 4,X-3;"---\ .\:'";AT 5,X-3;"---\:'"
2301 LET P(K)=X-1
2302 LET W$(K)="JET"
2310 RETURN
2500 LET P(K)=X-2
2522 LET W$(K)="KING"
2523 PRINT AT 1,X-2;"\. \. \. \. \. ";AT 2,X-2;"\':\''\''\':\' ";AT 3,X-2;"\ :\ '\ '\ :";AT 4,X-2;"\ : \' \ :";AT 5,X-2;"\ :\ '\''\ :";AT 6,X-1;"\':% \' "
2530 RETURN
2700 PRINT AT 2,X-3;"A B C D";AT 3,X-2;"E F G"
2701 LET P(K)=X-4
2702 LET W$(K)="LETTERS"
2710 RETURN
2900 PRINT AT 1,X;"% \: ";AT 2,X;"\':\' ";AT 3,X-1;"% % % \: ";AT 4,X-1;"\: % \: \: ";AT 5,X-1;"\' % \: \' "
2910 IF L(K)=22 THEN RETURN
2920 PRINT AT 6,X-1;"\ :% % ";AT 7,X-1;"\ :\: % ";AT 8,X-1;"\ :\: % "
2921 LET P(K)=X-1
2922 LET W$(K)="MAN"
2930 RETURN
3100 PRINT AT 3,X-3;"1 2 3 4";AT 4,X-2;"5 6 7"
3101 LET P(K)=X-3
3102 LET W$(K)="NUMBERS"
3110 RETURN
3300 PRINT AT 1,X-4;"\. ";AT 2,X-4;"\ '\'. \.:\. \..\. ";AT 3,X-2;"\':% % \''";AT 4,X-4;"\ .\.'\':% % \.. \.'";AT 5,X-4;"\' \ .\.'\.'\.'\. \''";AT 6,X-4;"\ .\' \ .\' \'.\ '\'.";AT 7,X-4;"\' \ .\' \ '\. "
3301 LET P(K)=X-3
3302 LET W$(K)="OCTOPUS"
3310 RETURN
3500 PRINT AT 5,X-2;"\..\..\..\..% ";AT 4,X+2;"*";AT 3,X+2;"*"
3501 LET P(K)=X-1
3502 LET W$(K)="PIPE"
3510 RETURN
3700 GOSUB 2500
3710 FOR Y=38 TO 29 STEP -1
3720 PLOT 2*X-4,Y
3730 PLOT 2*X+4,Y
3740 NEXT Y
3751 LET P(K)=X-2
3752 LET W$(K)="QUEEN"
3760 RETURN
3900 PRINT AT 1,X;"A";AT 2,X;"% ";AT 3,X;"% ";AT 4,X;"% ";AT 5,X;"% ";AT 6,X-1;"\..% \..";AT 7,X-1;"\' *\ '";AT 8,X;"*"
3901 LET P(K)=X-3
3902 LET W$(K)="ROCKET"
3910 RETURN
4100 PRINT AT 1,X-1;"\..\..\..";AT 2,X-2;"\ :\ . \. \: ";AT 3,X-2;"\ : \: ";AT 4,X-3;">\ :\ . \. \: <";AT 5,X-2;"\ : \'' \: ";AT 6,X-1;"\''\''\''"
4101 FOR F=1 TO 2
4102 PRINT AT 4,X-1;" ";AT 5,X-1;"\ '\''\' "
4103 LET E=USR 16514
4104 PRINT AT 4,X-1;"\ . \. ";AT 5,X-1;" \'' "
4105 LET E=USR 16514
4106 NEXT F
4107 LET P(K)=X-2
4108 LET W$(K)="SMILE"
4110 RETURN
4300 PRINT AT 1,X-1;"\ .% \. ";AT 2,X-2;"\ .% % % \. ";AT 3,X-2;"% % % % % ";AT 4,X-2;"\ '% % % \' ";AT 5,X-1;"\ '% \' ";AT 6,X;"% ";AT 7,X-1;"\ .% \. "
4301 LET P(K)=X-2
4302 LET W$(K)="TREE"
4310 RETURN
4500 PRINT AT 1,X;"\.:\. ";AT 2,X-1;"\.'\ :\ '\. ";AT 3,X;"\ :";AT 4,X;"\ :"
4501 LET P(K)=X-1
4502 LET W$(K)="UP"
4510 RETURN
4700 PRINT AT 2,X-2;"\ .\. \..";AT 3,X-2;"% % \. \.:% \: ";AT 4,X-2;"\':% % % % \' ";AT 5,X-1;"\':% % \' ";AT 6,X;"\':\' "
4701 LET P(K)=X-4
4702 LET W$(K)="VALENTINE"
4710 RETURN
4900 GOSUB 2900
4910 PRINT AT 6,X-1;"\.:% % \. ";AT 7,X-2;"\.:% % % % \. ";AT 8,X-1;"\ :\: % "
4911 LET P(K)=X-2
4912 LET W$(K)="WOMAN"
4920 RETURN
5100 PRINT AT 1,X-3;"\: \: \: \: \: \: \: ";AT 2,X-3;"\: \: \: \: \: \' ";AT 3,X-3;"\: \: \: \' \. ";AT 4,X-3;"\: \' \. /";AT 5,X-1;"/"
5101 LET P(K)=X-4
5102 LET W$(K)="XYLOPHONE"
5110 RETURN
5300 PRINT AT 1,X-1;"\ .% \. ";AT 2,X-1;"% % \':";AT 3,X-1;"% % % \. <";AT 4,X-1;"% % \''<";AT 5,X-1;"% % \.. <";AT 6,X-1;"\ :% "
5301 LET P(K)=X-1
5302 LET W$(K)="YELL"
5310 RETURN
5500 PRINT AT 3,X-2;"\.'\. \.'";AT 4,X-3;"\ ' \ '\. \.'\.'";AT 5,X;"\ '"
5501 LET P(K)=X-3
5502 LET W$(K)="ZIGZAG"
5510 RETURN
1 REM \06\01\C5\06\64\00\10\FD\C1\10\F7\C9\2E\2E\2E\2E\2E\2E\2E\2E\2E\2E\2E
2 SAVE "VOWE%L"
12 PRINT AT 8,11;"VOWELTUTOR";AT 10,2;"COPYRIGHT 1982 LOU GOLDSTEIN";AT 12,7;"% %F%R%O%M% %S%O%F%T%S%Y%N%C% %I%N%C% "
13 PRINT AT 20,5;"PRESS ""ENTER"" TO START"
14 PAUSE 33000
15 RAND
16 LET V$="AEIOU"
17 CLS
18 DIM P(3)
19 DIM W$(3,10)
20 DIM L(5)
23 PRINT AT 6,0;"WHICH VOWELS DO YOU WANT TO USE?1=LONG",,"2=SHORT",,"3=BOTH",,"4=EXIT PROGRAM"
24 INPUT O
25 LET LS=O
26 CLS
27 IF O=4 THEN STOP
30 IF O=3 THEN LET LS=INT (RND*2)+1
31 FOR K=1 TO 3
32 FAST
40 LET L(K)=INT (RND*5)+1
50 NEXT K
60 IF L(1)=L(2) OR L(1)=L(3) OR L(2)=L(3) THEN GOTO 31
80 LET C=INT (RND*3)+1
90 LET A$=V$(L(C))
99 SLOW
100 FOR K=1 TO 3
105 LET Z=INT (RND*3)
110 LET X=10*K-5
120 GOSUB 700*LS+100*L(K)+30*Z
121 PRINT AT 10,P(K);W$(K)
130 PRINT AT 15,X;K
140 NEXT K
150 PRINT AT 19,14;"\:'\''\':";AT 20,14;"\: ";A$;"\ :";AT 21,14;"\:.\..\.:"
151 FOR J=1 TO 10
152 IF W$(C,J)="% " THEN GOTO 155
153 NEXT J
155 LET W$(C,J)=A$
156 INPUT R
157 IF R=9 THEN CLS
160 IF R=9 THEN GOTO 23
170 IF R<>C THEN PRINT AT 16,10*C-9;"% % % % % % % % % "
180 IF R=C THEN PRINT AT 16,10*C-9;"*********"
185 PRINT AT 13,P(C);W$(C)
190 PAUSE 250
195 CLS
200 GOTO 30
800 LET W$(K)="TR% IN"
801 LET P(K)=X-2
802 PRINT AT 2,X-1;"*";AT 3,X;"*";AT 4,X;"\ :\..\. ";AT 5,X-4;"\ :% \.:% \.:% % >";AT 6,X-4;"\ '\ '\ '\ '\ ' \ '"
803 RETURN
830 LET W$(K)="C% NE"
831 LET P(K)=X-1
832 PRINT AT 1,X+1;"\' ";AT 0,X-1;"\ .\''\. "
833 FOR Y=41 TO 30 STEP -1
834 PLOT 2*X-1,Y
835 NEXT Y
836 RETURN
860 LET W$(K)="D% YS"
861 LET P(K)=X-2
862 PRINT AT 2,X-1;"FRI.";AT 4,X-1;"SAT.";AT 6,X-1;"SUN."
863 RETURN
900 LET W$(K)="K% Y"
901 LET P(K)=X-1
902 PRINT AT 3,X-3;"% % ";AT 4,X-3;"% % \:'\''\':% % \' ";AT 5,X-3;"% % \ '\ :\ '"
903 RETURN
930 LET W$(K)="THR% E"
931 LET P(K)=X-2
932 PRINT AT 3,X-1;"\''\''\: ";AT 4,X+1;"\: ";AT 5,X-1;"\ '\''\: ";AT 6,X+1;"\: ";AT 7,X-1;"\''\''\' "
933 RETURN
960 LET W$(K)="KN% E"
961 LET P(K)=X-2
962 PRINT AT 0,X+1;"% \: ";AT 1,X+1;"\':\' ";AT 2,X+1;"\: ";AT 3,X;"\ :\ '\..\. ";AT 4,X;"\: ";AT 5,X-1;"\ :\ '\. ";AT 6,X-1;"\ : \ '\. <";AT 7,X-2;"\ .\' \: ";AT 8,X-2;"\'. \''"
968 RETURN
1000 LET W$(K)="F% VE"
1001 LET P(K)=X-2
1002 PRINT AT 2,X-1;"\:'\''\' ";AT 3,X-1;"\:.\. ";AT 4,X;"\ '\. ";AT 5,X-1;"\. \ .\' ";AT 6,X-1;"\ '\' "
1003 RETURN
1030 LET W$(K)="K% TE"
1031 LET P(K)=X-2
1032 PRINT AT 0,X;"\.:\. ";AT 1,X-1;"\ .\':\'.";AT 2,X-1;"\.:\.:\.:\. ";AT 3,X-1;"\ :\ :\ :";AT 4,X;"% \: ";AT 5,X;"\ :";AT 6,X+1;"\'.";AT 7,X+1;"\.'";AT 8,X+1;"\ '"
1033 RETURN
1060 LET W$(K)="N% NE"
1061 LET P(K)=X-2
1063 PRINT AT 2,X-1;"\:'\''\: ";AT 3,X-1;"\: \: ";AT 4,X-1;"\''\''\: ";AT 5,X-1;"\. \: ";AT 6,X-1;"\''\''\' "
1064 RETURN
1100 LET W$(K)="B% AT"
1101 LET P(K)=X-2
1102 PRINT AT 1,X-2;"\..\..\..\..\. ";AT 2,X-2;"\ '\. \ '\. ";AT 3,X-1;"\.' \.'";AT 4,X-2;"\ '\''\':\''\''";AT 5,X-4;"\..\..\..\..\.:\..\..\..>";AT 6,X-4;"\':% % % % % \:'";AT 7,X-3;"\''\''\''\''\''"
1103 RETURN
1130 LET W$(K)="THR% W"
1131 LET P(K)=X-2
1132 PRINT AT 2,X+2;">";AT 3,X-2;"\ :% >\ '";AT 4,X-2;"\ '\:' \.'";AT 5,X-3;"\ .\''\:'\''";AT 6,X-3;"\' \: ";AT 7,X-2;"\.'\ '\. ";AT 8,X-3;"\ ' \ '"
1133 RETURN
1160 LET W$(K)="N% SE"
1161 LET P(K)=X-2
1162 PRINT AT 1,X-1;"\ .% \. ";AT 2,X-1;"% \:.\:.";AT 3,X-1;"% % \' ";AT 4,X-1;"\':\:'\' "
1163 FOR G=1 TO 3
1164 PRINT AT 2,1+X;"\: "
1165 LET U=USR 16514
1166 PRINT AT 2,X+1;"\:."
1167 LET U=USR 16514
1168 NEXT G
1169 RETURN
1200 LET W$(K)="% NITED"
1201 LET P(K)=X-3
1202 PRINT AT 1,X-3;"\..\..\..\..\..\. \.:";AT 2,X-4;"\ .% % % % % % \.:% ";AT 3,X-4;"\ :AMERICA\: ";AT 4,X-4;"\ '% % % % % % % \: ";AT 5,X-3;"\''\''% % % % % \: ";AT 6,X;"\':\:' \: ";AT 7,X+1;"\' "
1203 PRINT AT 11,P(K);"STATES"
1204 RETURN
1230 LET W$(K)="F% EL"
1231 LET P(K)=X-2
1232 PRINT AT 1,X-4;"\##\##\##";AT 2,X-4;"\##%G\##";AT 3,X-4;"\##%A\##";AT 4,X-4;"\##%S\##\'. \:'\''\':";AT 5,X-4;"\##\##\##\ '\..\:.\..\.:";AT 6,X-4;"\##\##\## % % % ";AT 7,X-4;"\##\##\## \: \ :"
1233 RETURN
1260 LET W$(K)="T% BE"
1261 LET P(K)=X-2
1262 PRINT AT 2,X-4;"\ .\..\..\..\..\..\..\..\. ";AT 3,X-4;"\ :\##TOOTH\##\:.";AT 4,X-4;"\ :\##PASTE\##\:'";AT 5,X-4;"\ '\''\''\''\''\''\''\''\' "
1263 RETURN
1500 LET W$(K)="FL% G"
1501 LET P(K)=X-2
1503 LET B=X-4
1504 PRINT AT 0,B;"\ .\..\..\..\..\..\..\..";AT 1,B;"\ :***\:'\''\''\':";AT 2,B;"\ :***\:'\''\''\':";AT 3,B;"\ :\''\''\''\''\''\''\':";AT 4,B;"\ :\''\''\''\''\''\''\':";AT 5,B;"\ :\''\''\''\''\''\''\''";AT 6,B;"\ :"
1505 RETURN
1530 LET W$(K)="% DD"
1531 LET P(K)=X-1
1532 PRINT AT 1,X-2;"3+2=\##";AT 3,X;"75";AT 4,X-1;"+23";AT 5,X-1;"\''\''\''"
1533 RETURN
1560 LET W$(K)="P% N"
1561 LET P(K)=X-1
1562 PRINT AT 3,X-3;"\..\..\..\..";AT 4,X-4;"\ :\' \ '\:.\..\..\..";AT 5,X-4;"\ :\:.\..\..\.:\: ";AT 6,X-4;"\ '% % % % \' "
1563 RETURN
1600 LET W$(K)="T% N"
1601 LET P(K)=X-1
1602 LET B=X-2
1603 PRINT AT 2,B;"\ : \:'\''\':";AT 3,B;"\ : \: \ :";AT 4,B;"\ : \: \ :";AT 5,B;"\ : \:.\..\.:"
1604 RETURN
1630 LET W$(K)="DR% SS"
1631 LET P(K)=X-2
1632 PRINT AT 1,X-2;"\.:\:.\.:\:.";AT 2,X-3;"\ '\:'% % \':\' ";AT 3,X-2;"\ .% % \. ";AT 4,X-3;"\ .% % % % \. ";AT 5,X-4;"\ .% % % % % % \. "
1633 RETURN
1660 LET W$(K)="L% G"
1661 LET P(K)=X-1
1662 LET B=X-1
1663 PRINT AT 0,X;"% \: ";AT 1,X;"\':\' ";AT 2,B;"% % % \: ";AT 3,B;"\: % \: \: ";AT 4,B;"\' % \: \' ";AT 5,B;"\ :% % ";AT 6,B;"\ :\: \##<";AT 7,B;"\ :\: \##<"
1664 RETURN
1700 LET W$(K)="S% X"
1701 LET P(K)=X-1
1702 LET B=X-1
1703 PRINT AT 1,X;"\..";AT 2,B;"\.' \' ";AT 3,B;"\: ";AT 4,B;"\:.\''\'.";AT 5,B;"\: \ :";AT 6,B;"\ '\..\' "
1704 RETURN
1730 LET W$(K)="SH% P"
1731 LET P(K)=X-2
1732 PRINT AT 3,X-3;"\..\:.\:.\. ";AT 4,X-5;"\ .\..% \:'% \:'% \:'% \:'";AT 5,X-4;"\':\:.% \:.% \:.% \:'";AT 6,X-5;"\@@\@@\@@\@@\@@\@@\@@\@@\@@\@@"
1733 RETURN
1760 LET W$(K)="WR% ST"
1761 LET P(K)=X-2
1762 LET B=X-1
1763 PRINT AT 0,B;"\..\..\..";AT 1,B;"\:'% \':";AT 2,B;"% \''% ";AT 3,B;"\''% \''"
1764 LET B=X-2
1765 PRINT AT 4,B;"% % % % % ";AT 5,B;"% \ :% \: % ";AT 6,B-1;">\##\ :% \: \##<";AT 7,B;"W W"
1766 RETURN
1800 LET W$(K)="P% T"
1801 LET P(K)=X-1
1802 PRINT AT 1,X-2;"\..";AT 2,X-4;"\ .\'' \''\. ";AT 3,X-4;"\:. \.:\..\..\..";AT 4,X-4;"% % \..% % ";AT 5,X-4;"\':% % % \:'";AT 6,X-3;"\ '\''\' "
1803 RETURN
1830 LET W$(K)="CL% CK"
1831 LET P(K)=X-3
1832 PRINT AT 1,X;"\..\. ";AT 2,X-2;"\ .\''\ .\ '\'.";AT 3,X-2;"\: \ : \: ";AT 4,X-3;"\ : \ :\..\. \ :";AT 5,X-3;"\ '\. \.'";AT 6,X-2;"\'. \ .\' ";AT 7,X-1;"\''\..\.'\' "
1833 RETURN
1860 LET W$(K)="ST% P"
1861 LET P(K)=X-2
1862 PRINT AT 0,X-2;"\ .% % \. ";AT 1,X-3;"\ .% % % % \. ";AT 2,X-3;"% ST P% ";AT 3,X-3;"% % % % % % ";AT 4,X-3;"\ '% % % % \' ";AT 5,X-2;"\ '% % \' ";AT 6,X-1;"\ :\: ";AT 7,X-1;"\ :\: "
1863 RETURN
1900 LET W$(K)="G% N"
1901 LET P(K)=X-1
1902 LET B=X-4
1903 PRINT AT 2,B;"\ :% % % % % -->";AT 3,B;"\ :\: \: \:'\''";AT 4,B;"\ :\:.\..\: ";AT 5,B;"\ :\: "
1904 RETURN
1930 LET W$(K)="DR% M"
1931 LET P(K)=X-2
1932 PRINT AT 0,X+2;"/";AT 1,X-1;"\.. \ ' /";AT 2,X-3;"\ .\'' \''\. \ '";AT 3,X-3;"\:. \.:";AT 4,X-3;"% % \..% % ";AT 5,X-3;"\':% % % \:'";AT 6,X-2;"\ '\''\' "
1933 RETURN
1960 LET W$(K)="B% S"
1961 LET P(K)=X-1
1962 LET B=X-3
1963 PRINT AT 2,B;"% \''\:'\':\''% % ";AT 3,B;"% \..\:.\.:\..% \ :% ";AT 4,B;"% % % % % % \.:% ";AT 5,B+1;"\' \ '"
1964 RETURN
Note: Type-in program listings on this website use ZMAKEBAS notation for graphics characters.
People
E
Skip to content
Computer Tutor
Products: Computer Tutors: Alpha/Vowel Tutors
Developer(s): Lou Goldstein
Date: 1982
Type: Cassette
Platform(s): TS 1000
Tags: Education
AlphaTutor and VowelTutor are a paired set of educational programs designed to teach children letter recognition and vowel sounds through a picture-matching quiz format. Each round randomly selects three images drawn entirely in block graphics, displays them with numbered labels, and prompts the child to identify which picture matches a highlighted letter or vowel shown in a bordered box. The programs use computed GOSUB targets (e.g., `GOSUB 200*L(K)+500` and `GOSUB 700*LS+100*L(K)+30*Z`) to dispatch to one of 26 picture-drawing subroutines covering letters A–Z and multiple vowel-sound variants. VowelTutor extends the concept with separate long and short vowel word sets per letter, selected by a random or user-chosen mode flag, and includes an animated nose-sniffing and hat/smile flip routine via `USR 16514`, pointing to a small machine-code delay loop stored in the REM statement at line 1.
Program Analysis
This listing contains two related programs: AlphaTutor and VowelTutor, both credited to Lou Goldstein / SoftSync Inc., 1982. AlphaTutor covers all 26 letters of the alphabet; VowelTutor extends the concept to long and short vowel sounds, offering multiple word variants per vowel. Both share the same core quiz loop and picture-rendering architecture.
Program Structure
Both programs follow the same top-level flow:
- Title/splash screen (lines 12–14), then
RAND to seed the RNG.
- Initialise arrays
P(3), W$(3,10), L(3) (lines 18–20).
- Main loop (lines 30–200): pick three distinct random indices, choose one as the target, dispatch to a drawing subroutine for each, display a letter/vowel prompt box, read a numeric answer, give feedback, pause, clear and repeat.
- Drawing subroutines: one per picture subject, each printing block-graphic art, setting
P(K) (label column) and W$(K) (word string).
VowelTutor adds a mode-selection screen (lines 23–27) offering long vowels, short vowels, or both, stored in LS, and allows the user to return to mode selection by entering 9.
Computed GOSUB Dispatch
The most architecturally notable feature is the use of arithmetic expressions as GOSUB targets to select picture subroutines without IF/THEN chains:
- AlphaTutor:
GOSUB 200*L(K)+500 — with L(K) in 0–25, this generates targets 500 (A=ambulance), 700 (B=boy), 900 (C=car) … 5500 (Z=zigzag), spaced 200 apart.
- VowelTutor:
GOSUB 700*LS+100*L(K)+30*Z — the LS factor (1=long, 2=short) shifts into a separate bank of subroutines; L(K) selects the vowel (1–5 = A/E/I/O/U); Z (0–2) selects one of up to three word variants per vowel per length.
This is a compact and efficient dispatch mechanism that avoids long IF/THEN chains entirely, at the cost of requiring subroutines to be placed at exactly the computed line numbers.
Machine Code Usage
Line 1 in both programs is a REM statement whose body encodes a short Z80 machine-code routine. The sequence \06\01\C5\06\64\00\10\FD\C1\10\F7\C9 disassembles as:
LD B,1 — outer loop count
PUSH BC
LD B,100 ; LD C,0 — inner delay count (25600 iterations)
DJNZ $ — inner loop
POP BC ; DJNZ … — outer loop
RET
This routine is called via LET E=USR 16514 (the address of the REM body in the VowelTutor variant is slightly longer, hence a different offset in practice). It is used as a simple software delay in animation sequences — for example, the hat flip in AlphaTutor (lines 1901–1906), the smile animation (lines 4101–4106), and the nose-sniffing effect (lines 1163–1168 in VowelTutor).
Key BASIC Idioms
- Block graphic art: All pictures are rendered using the ZX81/TS1000 block graphic characters (2×2 pixel sub-characters), encoded here as zmakebas escape sequences such as
\ ., \:., \'', etc.
- Distinct random selection: Lines 60 check
L(1)=L(2) OR L(1)=L(3) OR L(2)=L(3) and loop back if any two indices collide, ensuring three distinct pictures appear each round.
- Column positioning via formula:
LET X=10*K-5 (line 110) distributes the three picture columns evenly across the 32-character screen (columns 5, 15, 25).
- Answer box: The target letter is displayed in a bordered box drawn with block graphics at lines 19–21 using
AT positioning.
- PLOT for QUEEN and CONE: The subroutines at lines 3700 and 830 use
PLOT with pixel coordinates to draw vertical lines, since the block graphic resolution is insufficient for narrow strokes.
VowelTutor Word-Embedding Technique
In VowelTutor, word labels use a space character as a placeholder for the missing vowel (e.g., "TR% IN" for TRAIN, "K% TE" for KITE). After the round is set up, lines 151–155 scan W$(C) character-by-character to find the first "% " (space) position, then replace it with the actual vowel character A$ — effectively filling in the blank dynamically. This lets the same word string serve as both a gapped display and, after substitution, the correct spelled form.
Notable Subroutine Sharing
AlphaTutor’s GIRL subroutine (line 1700) is shared with BOY (line 700): the BOY subroutine calls GOSUB 1700 to draw the upper body, then the shared routine checks IF L(K)=1 THEN RETURN (line 1710) to exit early for BOY, or continues to draw the skirt/legs for GIRL. Similarly, VowelTutor’s WOMAN subroutine (line 4900) reuses the MAN subroutine (line 2900) for the head and torso, then overprints with different lower-body graphics.
Array Sizing
Array Dimensions Purpose P(3)3 elements Column position for each picture’s word label W$(3,10)3 strings × 10 chars Word associated with each picture slot L(3) / L(5)3 (Alpha) / 5 (Vowel) Random index for picture selection
Potential Anomalies
- AlphaTutor has no subroutine at the computed target for letter index 0 (line 500 handles A=0, as
200*0+500=500) — this is correct; L(K)=INT(RND*26) yields 0–25, mapping to lines 500–5500.
- VowelTutor’s
GOSUB 700*LS+100*L(K)+30*Z for LS=2 (short vowels) can yield targets like 1400+30*Z (lines 1400, 1430, 1460) which are not all defined in the listing — some short-vowel variant slots appear absent, which would cause a BASIC error if selected. This may reflect incomplete subroutine coverage in the original listing.
- The
PAUSE 33000 at line 14 provides a long title-screen pause (~30 seconds at normal speed) but any key press does not skip it — the user must wait it out unless they press BREAK.
- In VowelTutor, the
\## sequences in several subroutines (e.g., lines 1232, 1262, 1532) are not standard zmakebas escape sequences and likely represent inverse-video block characters or UDGs in the original tape file that were not fully decoded in this transcription.
Content
Source Code
1 REM \06\01\C5\06\64\00\10\FD\C1\10\F7\C9\2E\2E\2E\2E\2E\2E
2 SAVE "AB%C"
12 PRINT AT 8,11;"ALPHATUTOR";AT 10,2;"COPYRIGHT 1982 LOU GOLDSTEIN";AT 12,6;"% %F%R%O%M% %S%O%F%T%S%Y%N%C% %I%N%C% "
13 PRINT AT 20,5;"PRESS ""ENTER"" TO START"
14 PAUSE 33000
15 RAND
17 CLS
18 DIM P(3)
19 DIM W$(3,10)
20 DIM L(3)
30 FOR K=1 TO 3
40 LET L(K)=INT (RND*26)
50 NEXT K
60 IF L(1)=L(2) OR L(1)=L(3) OR L(2)=L(3) THEN GOTO 30
80 LET C=INT (RND*3)+1
90 LET A$=CHR$ (L(C)+38)
100 FOR K=1 TO 3
110 LET X=10*K-5
120 GOSUB 200*L(K)+500
121 PRINT AT 10,P(K);"% ";W$(K,2 TO )
130 PRINT AT 15,X;K
140 NEXT K
150 PRINT AT 19,14;"\:'\''\':";AT 20,14;"\: ";A$;"\ :";AT 21,14;"\:.\..\.:"
160 INPUT R
170 IF R<>C THEN PRINT AT 16,10*C-9;"% % % % % % % % % "
180 IF R=C THEN PRINT AT 16,10*C-9;"*********"
185 PRINT AT 13,P(C);W$(C)
190 PAUSE 250
195 CLS
200 GOTO 30
500 PRINT AT 3,X-3;"\..\..\..\..";AT 4,X-3;"\: \ . \ :";AT 5,X-3;"\: \':\' \ '\''\':";AT 6,X-3;"\:.\..\..\..\..\.:";AT 7,X-3;"\' \' "
501 LET P(K)=X-4
502 LET W$(K)="AMBULANCE"
510 RETURN
700 GOSUB 1700
710 PRINT AT 4,X;"\ :";AT 5,X;"\.'\. ";AT 6,X-1;"\.' \ '\. ";AT 7,X-2;"\.' \ '\. "
711 LET P(K)=X-1
712 LET W$(K)="BOY"
720 RETURN
900 PRINT AT 5,X-3;"\ :% % % ";AT 6,X-3;"\ :% % % % % ";AT 7,X-2;"\' \ '"
901 LET P(K)=X-1
902 LET W$(K)="CAR"
910 RETURN
1100 PRINT AT 1,X-4;"\ . \:.\. ";AT 2,X-3;"\'. % \. ";AT 3,X-2;"% % % ";AT 4,X-2;"\:'\''\':";AT 5,X-2;"\: \ :"
1101 LET P(K)=X-1
1102 LET W$(K)="DOG"
1110 RETURN
1300 PRINT AT 1,X-4;"\ .% % % \..";AT 2,X-4;"% % % % \.:";AT 3,X-4;"\':% % \:'\ '\..\' ";AT 4,X-4;"\ : \: "
1301 LET P(K)=X-4
1302 LET W$(K)="ELEPHANT"
1310 RETURN
1500 PRINT AT 1,X-4;"\ . \ .\..";AT 2,X-4;"\ :\:.\.:% % \':\. ";AT 3,X-4;"\ :% % % % % \. ";AT 4,X-4;"\ :\' \ '\':\:'\' "
1501 LET P(K)=X-2
1502 LET W$(K)="FISH"
1510 RETURN
1700 PRINT AT 0,X;"% \: ";AT 1,X;"\':\' ";AT 2,X-1;"\ .\':\'.";AT 3,X-1;"\' \ : \' "
1710 IF L(K)=1 THEN RETURN
1720 PRINT AT 4,X;"\.:\. ";AT 5,X-1;"\.:% % \. ";AT 6,X-2;"\ '\:'\''\''\:'";AT 7,X-1;"\: \: "
1721 LET P(K)=X-2
1722 LET W$(K)="GIRL"
1730 RETURN
1900 PRINT AT 1,X-2;">\ .\..\..\. <";AT 2,X-1;"\.:% % \:.";AT 3,X-1;"\ :..\: ";AT 4,X-1;"\ : \: ";AT 5,X-1;"\ :\ '\' \: ";AT 6,X;"\''\''"
1901 FOR F=1 TO 2
1902 PRINT AT 1,X-1;" ";AT 2,X-1;"\ .\..\..\. "
1903 LET E=USR 16514
1904 PRINT AT 1,X-1;"\ .\..\..\. ";AT 2,X-1;"\.:% % \:."
1905 LET E=USR 16514
1906 NEXT F
1907 LET P(K)=X-1
1908 LET W$(K)="HAT"
1910 RETURN
2100 PRINT AT 1,X-1;"\ :";AT 2,X-1;"\ :";AT 3,X-2;"\ .\''\''\''\. ";AT 4,X-2;"\ :\~~\~~\~~\: ";AT 5,X-2;"\ :\ ' \' \: ";AT 6,X-2;"\ :\ .\..\. \: ";AT 7,X-2;"\ '\..\..\..\' "
2101 LET P(K)=X-3
2102 LET W$(K)="INDIAN"
2110 RETURN
2300 PRINT AT 1,X-3;"---\:.";AT 2,X-3;"\':\..\..\.:\:.\..";AT 3,X-3;"\ :\..\..\..\..\..% >";AT 4,X-3;"---\ .\:'";AT 5,X-3;"---\:'"
2301 LET P(K)=X-1
2302 LET W$(K)="JET"
2310 RETURN
2500 LET P(K)=X-2
2522 LET W$(K)="KING"
2523 PRINT AT 1,X-2;"\. \. \. \. \. ";AT 2,X-2;"\':\''\''\':\' ";AT 3,X-2;"\ :\ '\ '\ :";AT 4,X-2;"\ : \' \ :";AT 5,X-2;"\ :\ '\''\ :";AT 6,X-1;"\':% \' "
2530 RETURN
2700 PRINT AT 2,X-3;"A B C D";AT 3,X-2;"E F G"
2701 LET P(K)=X-4
2702 LET W$(K)="LETTERS"
2710 RETURN
2900 PRINT AT 1,X;"% \: ";AT 2,X;"\':\' ";AT 3,X-1;"% % % \: ";AT 4,X-1;"\: % \: \: ";AT 5,X-1;"\' % \: \' "
2910 IF L(K)=22 THEN RETURN
2920 PRINT AT 6,X-1;"\ :% % ";AT 7,X-1;"\ :\: % ";AT 8,X-1;"\ :\: % "
2921 LET P(K)=X-1
2922 LET W$(K)="MAN"
2930 RETURN
3100 PRINT AT 3,X-3;"1 2 3 4";AT 4,X-2;"5 6 7"
3101 LET P(K)=X-3
3102 LET W$(K)="NUMBERS"
3110 RETURN
3300 PRINT AT 1,X-4;"\. ";AT 2,X-4;"\ '\'. \.:\. \..\. ";AT 3,X-2;"\':% % \''";AT 4,X-4;"\ .\.'\':% % \.. \.'";AT 5,X-4;"\' \ .\.'\.'\.'\. \''";AT 6,X-4;"\ .\' \ .\' \'.\ '\'.";AT 7,X-4;"\' \ .\' \ '\. "
3301 LET P(K)=X-3
3302 LET W$(K)="OCTOPUS"
3310 RETURN
3500 PRINT AT 5,X-2;"\..\..\..\..% ";AT 4,X+2;"*";AT 3,X+2;"*"
3501 LET P(K)=X-1
3502 LET W$(K)="PIPE"
3510 RETURN
3700 GOSUB 2500
3710 FOR Y=38 TO 29 STEP -1
3720 PLOT 2*X-4,Y
3730 PLOT 2*X+4,Y
3740 NEXT Y
3751 LET P(K)=X-2
3752 LET W$(K)="QUEEN"
3760 RETURN
3900 PRINT AT 1,X;"A";AT 2,X;"% ";AT 3,X;"% ";AT 4,X;"% ";AT 5,X;"% ";AT 6,X-1;"\..% \..";AT 7,X-1;"\' *\ '";AT 8,X;"*"
3901 LET P(K)=X-3
3902 LET W$(K)="ROCKET"
3910 RETURN
4100 PRINT AT 1,X-1;"\..\..\..";AT 2,X-2;"\ :\ . \. \: ";AT 3,X-2;"\ : \: ";AT 4,X-3;">\ :\ . \. \: <";AT 5,X-2;"\ : \'' \: ";AT 6,X-1;"\''\''\''"
4101 FOR F=1 TO 2
4102 PRINT AT 4,X-1;" ";AT 5,X-1;"\ '\''\' "
4103 LET E=USR 16514
4104 PRINT AT 4,X-1;"\ . \. ";AT 5,X-1;" \'' "
4105 LET E=USR 16514
4106 NEXT F
4107 LET P(K)=X-2
4108 LET W$(K)="SMILE"
4110 RETURN
4300 PRINT AT 1,X-1;"\ .% \. ";AT 2,X-2;"\ .% % % \. ";AT 3,X-2;"% % % % % ";AT 4,X-2;"\ '% % % \' ";AT 5,X-1;"\ '% \' ";AT 6,X;"% ";AT 7,X-1;"\ .% \. "
4301 LET P(K)=X-2
4302 LET W$(K)="TREE"
4310 RETURN
4500 PRINT AT 1,X;"\.:\. ";AT 2,X-1;"\.'\ :\ '\. ";AT 3,X;"\ :";AT 4,X;"\ :"
4501 LET P(K)=X-1
4502 LET W$(K)="UP"
4510 RETURN
4700 PRINT AT 2,X-2;"\ .\. \..";AT 3,X-2;"% % \. \.:% \: ";AT 4,X-2;"\':% % % % \' ";AT 5,X-1;"\':% % \' ";AT 6,X;"\':\' "
4701 LET P(K)=X-4
4702 LET W$(K)="VALENTINE"
4710 RETURN
4900 GOSUB 2900
4910 PRINT AT 6,X-1;"\.:% % \. ";AT 7,X-2;"\.:% % % % \. ";AT 8,X-1;"\ :\: % "
4911 LET P(K)=X-2
4912 LET W$(K)="WOMAN"
4920 RETURN
5100 PRINT AT 1,X-3;"\: \: \: \: \: \: \: ";AT 2,X-3;"\: \: \: \: \: \' ";AT 3,X-3;"\: \: \: \' \. ";AT 4,X-3;"\: \' \. /";AT 5,X-1;"/"
5101 LET P(K)=X-4
5102 LET W$(K)="XYLOPHONE"
5110 RETURN
5300 PRINT AT 1,X-1;"\ .% \. ";AT 2,X-1;"% % \':";AT 3,X-1;"% % % \. <";AT 4,X-1;"% % \''<";AT 5,X-1;"% % \.. <";AT 6,X-1;"\ :% "
5301 LET P(K)=X-1
5302 LET W$(K)="YELL"
5310 RETURN
5500 PRINT AT 3,X-2;"\.'\. \.'";AT 4,X-3;"\ ' \ '\. \.'\.'";AT 5,X;"\ '"
5501 LET P(K)=X-3
5502 LET W$(K)="ZIGZAG"
5510 RETURN
1 REM \06\01\C5\06\64\00\10\FD\C1\10\F7\C9\2E\2E\2E\2E\2E\2E\2E\2E\2E\2E\2E
2 SAVE "VOWE%L"
12 PRINT AT 8,11;"VOWELTUTOR";AT 10,2;"COPYRIGHT 1982 LOU GOLDSTEIN";AT 12,7;"% %F%R%O%M% %S%O%F%T%S%Y%N%C% %I%N%C% "
13 PRINT AT 20,5;"PRESS ""ENTER"" TO START"
14 PAUSE 33000
15 RAND
16 LET V$="AEIOU"
17 CLS
18 DIM P(3)
19 DIM W$(3,10)
20 DIM L(5)
23 PRINT AT 6,0;"WHICH VOWELS DO YOU WANT TO USE?1=LONG",,"2=SHORT",,"3=BOTH",,"4=EXIT PROGRAM"
24 INPUT O
25 LET LS=O
26 CLS
27 IF O=4 THEN STOP
30 IF O=3 THEN LET LS=INT (RND*2)+1
31 FOR K=1 TO 3
32 FAST
40 LET L(K)=INT (RND*5)+1
50 NEXT K
60 IF L(1)=L(2) OR L(1)=L(3) OR L(2)=L(3) THEN GOTO 31
80 LET C=INT (RND*3)+1
90 LET A$=V$(L(C))
99 SLOW
100 FOR K=1 TO 3
105 LET Z=INT (RND*3)
110 LET X=10*K-5
120 GOSUB 700*LS+100*L(K)+30*Z
121 PRINT AT 10,P(K);W$(K)
130 PRINT AT 15,X;K
140 NEXT K
150 PRINT AT 19,14;"\:'\''\':";AT 20,14;"\: ";A$;"\ :";AT 21,14;"\:.\..\.:"
151 FOR J=1 TO 10
152 IF W$(C,J)="% " THEN GOTO 155
153 NEXT J
155 LET W$(C,J)=A$
156 INPUT R
157 IF R=9 THEN CLS
160 IF R=9 THEN GOTO 23
170 IF R<>C THEN PRINT AT 16,10*C-9;"% % % % % % % % % "
180 IF R=C THEN PRINT AT 16,10*C-9;"*********"
185 PRINT AT 13,P(C);W$(C)
190 PAUSE 250
195 CLS
200 GOTO 30
800 LET W$(K)="TR% IN"
801 LET P(K)=X-2
802 PRINT AT 2,X-1;"*";AT 3,X;"*";AT 4,X;"\ :\..\. ";AT 5,X-4;"\ :% \.:% \.:% % >";AT 6,X-4;"\ '\ '\ '\ '\ ' \ '"
803 RETURN
830 LET W$(K)="C% NE"
831 LET P(K)=X-1
832 PRINT AT 1,X+1;"\' ";AT 0,X-1;"\ .\''\. "
833 FOR Y=41 TO 30 STEP -1
834 PLOT 2*X-1,Y
835 NEXT Y
836 RETURN
860 LET W$(K)="D% YS"
861 LET P(K)=X-2
862 PRINT AT 2,X-1;"FRI.";AT 4,X-1;"SAT.";AT 6,X-1;"SUN."
863 RETURN
900 LET W$(K)="K% Y"
901 LET P(K)=X-1
902 PRINT AT 3,X-3;"% % ";AT 4,X-3;"% % \:'\''\':% % \' ";AT 5,X-3;"% % \ '\ :\ '"
903 RETURN
930 LET W$(K)="THR% E"
931 LET P(K)=X-2
932 PRINT AT 3,X-1;"\''\''\: ";AT 4,X+1;"\: ";AT 5,X-1;"\ '\''\: ";AT 6,X+1;"\: ";AT 7,X-1;"\''\''\' "
933 RETURN
960 LET W$(K)="KN% E"
961 LET P(K)=X-2
962 PRINT AT 0,X+1;"% \: ";AT 1,X+1;"\':\' ";AT 2,X+1;"\: ";AT 3,X;"\ :\ '\..\. ";AT 4,X;"\: ";AT 5,X-1;"\ :\ '\. ";AT 6,X-1;"\ : \ '\. <";AT 7,X-2;"\ .\' \: ";AT 8,X-2;"\'. \''"
968 RETURN
1000 LET W$(K)="F% VE"
1001 LET P(K)=X-2
1002 PRINT AT 2,X-1;"\:'\''\' ";AT 3,X-1;"\:.\. ";AT 4,X;"\ '\. ";AT 5,X-1;"\. \ .\' ";AT 6,X-1;"\ '\' "
1003 RETURN
1030 LET W$(K)="K% TE"
1031 LET P(K)=X-2
1032 PRINT AT 0,X;"\.:\. ";AT 1,X-1;"\ .\':\'.";AT 2,X-1;"\.:\.:\.:\. ";AT 3,X-1;"\ :\ :\ :";AT 4,X;"% \: ";AT 5,X;"\ :";AT 6,X+1;"\'.";AT 7,X+1;"\.'";AT 8,X+1;"\ '"
1033 RETURN
1060 LET W$(K)="N% NE"
1061 LET P(K)=X-2
1063 PRINT AT 2,X-1;"\:'\''\: ";AT 3,X-1;"\: \: ";AT 4,X-1;"\''\''\: ";AT 5,X-1;"\. \: ";AT 6,X-1;"\''\''\' "
1064 RETURN
1100 LET W$(K)="B% AT"
1101 LET P(K)=X-2
1102 PRINT AT 1,X-2;"\..\..\..\..\. ";AT 2,X-2;"\ '\. \ '\. ";AT 3,X-1;"\.' \.'";AT 4,X-2;"\ '\''\':\''\''";AT 5,X-4;"\..\..\..\..\.:\..\..\..>";AT 6,X-4;"\':% % % % % \:'";AT 7,X-3;"\''\''\''\''\''"
1103 RETURN
1130 LET W$(K)="THR% W"
1131 LET P(K)=X-2
1132 PRINT AT 2,X+2;">";AT 3,X-2;"\ :% >\ '";AT 4,X-2;"\ '\:' \.'";AT 5,X-3;"\ .\''\:'\''";AT 6,X-3;"\' \: ";AT 7,X-2;"\.'\ '\. ";AT 8,X-3;"\ ' \ '"
1133 RETURN
1160 LET W$(K)="N% SE"
1161 LET P(K)=X-2
1162 PRINT AT 1,X-1;"\ .% \. ";AT 2,X-1;"% \:.\:.";AT 3,X-1;"% % \' ";AT 4,X-1;"\':\:'\' "
1163 FOR G=1 TO 3
1164 PRINT AT 2,1+X;"\: "
1165 LET U=USR 16514
1166 PRINT AT 2,X+1;"\:."
1167 LET U=USR 16514
1168 NEXT G
1169 RETURN
1200 LET W$(K)="% NITED"
1201 LET P(K)=X-3
1202 PRINT AT 1,X-3;"\..\..\..\..\..\. \.:";AT 2,X-4;"\ .% % % % % % \.:% ";AT 3,X-4;"\ :AMERICA\: ";AT 4,X-4;"\ '% % % % % % % \: ";AT 5,X-3;"\''\''% % % % % \: ";AT 6,X;"\':\:' \: ";AT 7,X+1;"\' "
1203 PRINT AT 11,P(K);"STATES"
1204 RETURN
1230 LET W$(K)="F% EL"
1231 LET P(K)=X-2
1232 PRINT AT 1,X-4;"\##\##\##";AT 2,X-4;"\##%G\##";AT 3,X-4;"\##%A\##";AT 4,X-4;"\##%S\##\'. \:'\''\':";AT 5,X-4;"\##\##\##\ '\..\:.\..\.:";AT 6,X-4;"\##\##\## % % % ";AT 7,X-4;"\##\##\## \: \ :"
1233 RETURN
1260 LET W$(K)="T% BE"
1261 LET P(K)=X-2
1262 PRINT AT 2,X-4;"\ .\..\..\..\..\..\..\..\. ";AT 3,X-4;"\ :\##TOOTH\##\:.";AT 4,X-4;"\ :\##PASTE\##\:'";AT 5,X-4;"\ '\''\''\''\''\''\''\''\' "
1263 RETURN
1500 LET W$(K)="FL% G"
1501 LET P(K)=X-2
1503 LET B=X-4
1504 PRINT AT 0,B;"\ .\..\..\..\..\..\..\..";AT 1,B;"\ :***\:'\''\''\':";AT 2,B;"\ :***\:'\''\''\':";AT 3,B;"\ :\''\''\''\''\''\''\':";AT 4,B;"\ :\''\''\''\''\''\''\':";AT 5,B;"\ :\''\''\''\''\''\''\''";AT 6,B;"\ :"
1505 RETURN
1530 LET W$(K)="% DD"
1531 LET P(K)=X-1
1532 PRINT AT 1,X-2;"3+2=\##";AT 3,X;"75";AT 4,X-1;"+23";AT 5,X-1;"\''\''\''"
1533 RETURN
1560 LET W$(K)="P% N"
1561 LET P(K)=X-1
1562 PRINT AT 3,X-3;"\..\..\..\..";AT 4,X-4;"\ :\' \ '\:.\..\..\..";AT 5,X-4;"\ :\:.\..\..\.:\: ";AT 6,X-4;"\ '% % % % \' "
1563 RETURN
1600 LET W$(K)="T% N"
1601 LET P(K)=X-1
1602 LET B=X-2
1603 PRINT AT 2,B;"\ : \:'\''\':";AT 3,B;"\ : \: \ :";AT 4,B;"\ : \: \ :";AT 5,B;"\ : \:.\..\.:"
1604 RETURN
1630 LET W$(K)="DR% SS"
1631 LET P(K)=X-2
1632 PRINT AT 1,X-2;"\.:\:.\.:\:.";AT 2,X-3;"\ '\:'% % \':\' ";AT 3,X-2;"\ .% % \. ";AT 4,X-3;"\ .% % % % \. ";AT 5,X-4;"\ .% % % % % % \. "
1633 RETURN
1660 LET W$(K)="L% G"
1661 LET P(K)=X-1
1662 LET B=X-1
1663 PRINT AT 0,X;"% \: ";AT 1,X;"\':\' ";AT 2,B;"% % % \: ";AT 3,B;"\: % \: \: ";AT 4,B;"\' % \: \' ";AT 5,B;"\ :% % ";AT 6,B;"\ :\: \##<";AT 7,B;"\ :\: \##<"
1664 RETURN
1700 LET W$(K)="S% X"
1701 LET P(K)=X-1
1702 LET B=X-1
1703 PRINT AT 1,X;"\..";AT 2,B;"\.' \' ";AT 3,B;"\: ";AT 4,B;"\:.\''\'.";AT 5,B;"\: \ :";AT 6,B;"\ '\..\' "
1704 RETURN
1730 LET W$(K)="SH% P"
1731 LET P(K)=X-2
1732 PRINT AT 3,X-3;"\..\:.\:.\. ";AT 4,X-5;"\ .\..% \:'% \:'% \:'% \:'";AT 5,X-4;"\':\:.% \:.% \:.% \:'";AT 6,X-5;"\@@\@@\@@\@@\@@\@@\@@\@@\@@\@@"
1733 RETURN
1760 LET W$(K)="WR% ST"
1761 LET P(K)=X-2
1762 LET B=X-1
1763 PRINT AT 0,B;"\..\..\..";AT 1,B;"\:'% \':";AT 2,B;"% \''% ";AT 3,B;"\''% \''"
1764 LET B=X-2
1765 PRINT AT 4,B;"% % % % % ";AT 5,B;"% \ :% \: % ";AT 6,B-1;">\##\ :% \: \##<";AT 7,B;"W W"
1766 RETURN
1800 LET W$(K)="P% T"
1801 LET P(K)=X-1
1802 PRINT AT 1,X-2;"\..";AT 2,X-4;"\ .\'' \''\. ";AT 3,X-4;"\:. \.:\..\..\..";AT 4,X-4;"% % \..% % ";AT 5,X-4;"\':% % % \:'";AT 6,X-3;"\ '\''\' "
1803 RETURN
1830 LET W$(K)="CL% CK"
1831 LET P(K)=X-3
1832 PRINT AT 1,X;"\..\. ";AT 2,X-2;"\ .\''\ .\ '\'.";AT 3,X-2;"\: \ : \: ";AT 4,X-3;"\ : \ :\..\. \ :";AT 5,X-3;"\ '\. \.'";AT 6,X-2;"\'. \ .\' ";AT 7,X-1;"\''\..\.'\' "
1833 RETURN
1860 LET W$(K)="ST% P"
1861 LET P(K)=X-2
1862 PRINT AT 0,X-2;"\ .% % \. ";AT 1,X-3;"\ .% % % % \. ";AT 2,X-3;"% ST P% ";AT 3,X-3;"% % % % % % ";AT 4,X-3;"\ '% % % % \' ";AT 5,X-2;"\ '% % \' ";AT 6,X-1;"\ :\: ";AT 7,X-1;"\ :\: "
1863 RETURN
1900 LET W$(K)="G% N"
1901 LET P(K)=X-1
1902 LET B=X-4
1903 PRINT AT 2,B;"\ :% % % % % -->";AT 3,B;"\ :\: \: \:'\''";AT 4,B;"\ :\:.\..\: ";AT 5,B;"\ :\: "
1904 RETURN
1930 LET W$(K)="DR% M"
1931 LET P(K)=X-2
1932 PRINT AT 0,X+2;"/";AT 1,X-1;"\.. \ ' /";AT 2,X-3;"\ .\'' \''\. \ '";AT 3,X-3;"\:. \.:";AT 4,X-3;"% % \..% % ";AT 5,X-3;"\':% % % \:'";AT 6,X-2;"\ '\''\' "
1933 RETURN
1960 LET W$(K)="B% S"
1961 LET P(K)=X-1
1962 LET B=X-3
1963 PRINT AT 2,B;"% \''\:'\':\''% % ";AT 3,B;"% \..\:.\.:\..% \ :% ";AT 4,B;"% % % % % % \.:% ";AT 5,B+1;"\' \ '"
1964 RETURN
Note: Type-in program listings on this website use ZMAKEBAS notation for graphics characters.
People
E
Skip to content
Computer Tutor
Products: Computer Tutors: Alpha/Vowel Tutors
Developer(s): Lou Goldstein
Date: 1982
Type: Cassette
Platform(s): TS 1000
Tags: Education
AlphaTutor and VowelTutor are a paired set of educational programs designed to teach children letter recognition and vowel sounds through a picture-matching quiz format. Each round randomly selects three images drawn entirely in block graphics, displays them with numbered labels, and prompts the child to identify which picture matches a highlighted letter or vowel shown in a bordered box. The programs use computed GOSUB targets (e.g., `GOSUB 200*L(K)+500` and `GOSUB 700*LS+100*L(K)+30*Z`) to dispatch to one of 26 picture-drawing subroutines covering letters A–Z and multiple vowel-sound variants. VowelTutor extends the concept with separate long and short vowel word sets per letter, selected by a random or user-chosen mode flag, and includes an animated nose-sniffing and hat/smile flip routine via `USR 16514`, pointing to a small machine-code delay loop stored in the REM statement at line 1.
Program Analysis
This listing contains two related programs: AlphaTutor and VowelTutor, both credited to Lou Goldstein / SoftSync Inc., 1982. AlphaTutor covers all 26 letters of the alphabet; VowelTutor extends the concept to long and short vowel sounds, offering multiple word variants per vowel. Both share the same core quiz loop and picture-rendering architecture.
Program Structure
Both programs follow the same top-level flow:
- Title/splash screen (lines 12–14), then
RAND to seed the RNG.
- Initialise arrays
P(3), W$(3,10), L(3) (lines 18–20).
- Main loop (lines 30–200): pick three distinct random indices, choose one as the target, dispatch to a drawing subroutine for each, display a letter/vowel prompt box, read a numeric answer, give feedback, pause, clear and repeat.
- Drawing subroutines: one per picture subject, each printing block-graphic art, setting
P(K) (label column) and W$(K) (word string).
VowelTutor adds a mode-selection screen (lines 23–27) offering long vowels, short vowels, or both, stored in LS, and allows the user to return to mode selection by entering 9.
Computed GOSUB Dispatch
The most architecturally notable feature is the use of arithmetic expressions as GOSUB targets to select picture subroutines without IF/THEN chains:
- AlphaTutor:
GOSUB 200*L(K)+500 — with L(K) in 0–25, this generates targets 500 (A=ambulance), 700 (B=boy), 900 (C=car) … 5500 (Z=zigzag), spaced 200 apart.
- VowelTutor:
GOSUB 700*LS+100*L(K)+30*Z — the LS factor (1=long, 2=short) shifts into a separate bank of subroutines; L(K) selects the vowel (1–5 = A/E/I/O/U); Z (0–2) selects one of up to three word variants per vowel per length.
This is a compact and efficient dispatch mechanism that avoids long IF/THEN chains entirely, at the cost of requiring subroutines to be placed at exactly the computed line numbers.
Machine Code Usage
Line 1 in both programs is a REM statement whose body encodes a short Z80 machine-code routine. The sequence \06\01\C5\06\64\00\10\FD\C1\10\F7\C9 disassembles as:
LD B,1 — outer loop count
PUSH BC
LD B,100 ; LD C,0 — inner delay count (25600 iterations)
DJNZ $ — inner loop
POP BC ; DJNZ … — outer loop
RET
This routine is called via LET E=USR 16514 (the address of the REM body in the VowelTutor variant is slightly longer, hence a different offset in practice). It is used as a simple software delay in animation sequences — for example, the hat flip in AlphaTutor (lines 1901–1906), the smile animation (lines 4101–4106), and the nose-sniffing effect (lines 1163–1168 in VowelTutor).
Key BASIC Idioms
- Block graphic art: All pictures are rendered using the ZX81/TS1000 block graphic characters (2×2 pixel sub-characters), encoded here as zmakebas escape sequences such as
\ ., \:., \'', etc.
- Distinct random selection: Lines 60 check
L(1)=L(2) OR L(1)=L(3) OR L(2)=L(3) and loop back if any two indices collide, ensuring three distinct pictures appear each round.
- Column positioning via formula:
LET X=10*K-5 (line 110) distributes the three picture columns evenly across the 32-character screen (columns 5, 15, 25).
- Answer box: The target letter is displayed in a bordered box drawn with block graphics at lines 19–21 using
AT positioning.
- PLOT for QUEEN and CONE: The subroutines at lines 3700 and 830 use
PLOT with pixel coordinates to draw vertical lines, since the block graphic resolution is insufficient for narrow strokes.
VowelTutor Word-Embedding Technique
In VowelTutor, word labels use a space character as a placeholder for the missing vowel (e.g., "TR% IN" for TRAIN, "K% TE" for KITE). After the round is set up, lines 151–155 scan W$(C) character-by-character to find the first "% " (space) position, then replace it with the actual vowel character A$ — effectively filling in the blank dynamically. This lets the same word string serve as both a gapped display and, after substitution, the correct spelled form.
Notable Subroutine Sharing
AlphaTutor’s GIRL subroutine (line 1700) is shared with BOY (line 700): the BOY subroutine calls GOSUB 1700 to draw the upper body, then the shared routine checks IF L(K)=1 THEN RETURN (line 1710) to exit early for BOY, or continues to draw the skirt/legs for GIRL. Similarly, VowelTutor’s WOMAN subroutine (line 4900) reuses the MAN subroutine (line 2900) for the head and torso, then overprints with different lower-body graphics.
Array Sizing
Array Dimensions Purpose P(3)3 elements Column position for each picture’s word label W$(3,10)3 strings × 10 chars Word associated with each picture slot L(3) / L(5)3 (Alpha) / 5 (Vowel) Random index for picture selection
Potential Anomalies
- AlphaTutor has no subroutine at the computed target for letter index 0 (line 500 handles A=0, as
200*0+500=500) — this is correct; L(K)=INT(RND*26) yields 0–25, mapping to lines 500–5500.
- VowelTutor’s
GOSUB 700*LS+100*L(K)+30*Z for LS=2 (short vowels) can yield targets like 1400+30*Z (lines 1400, 1430, 1460) which are not all defined in the listing — some short-vowel variant slots appear absent, which would cause a BASIC error if selected. This may reflect incomplete subroutine coverage in the original listing.
- The
PAUSE 33000 at line 14 provides a long title-screen pause (~30 seconds at normal speed) but any key press does not skip it — the user must wait it out unless they press BREAK.
- In VowelTutor, the
\## sequences in several subroutines (e.g., lines 1232, 1262, 1532) are not standard zmakebas escape sequences and likely represent inverse-video block characters or UDGs in the original tape file that were not fully decoded in this transcription.
Content
Source Code
1 REM \06\01\C5\06\64\00\10\FD\C1\10\F7\C9\2E\2E\2E\2E\2E\2E
2 SAVE "AB%C"
12 PRINT AT 8,11;"ALPHATUTOR";AT 10,2;"COPYRIGHT 1982 LOU GOLDSTEIN";AT 12,6;"% %F%R%O%M% %S%O%F%T%S%Y%N%C% %I%N%C% "
13 PRINT AT 20,5;"PRESS ""ENTER"" TO START"
14 PAUSE 33000
15 RAND
17 CLS
18 DIM P(3)
19 DIM W$(3,10)
20 DIM L(3)
30 FOR K=1 TO 3
40 LET L(K)=INT (RND*26)
50 NEXT K
60 IF L(1)=L(2) OR L(1)=L(3) OR L(2)=L(3) THEN GOTO 30
80 LET C=INT (RND*3)+1
90 LET A$=CHR$ (L(C)+38)
100 FOR K=1 TO 3
110 LET X=10*K-5
120 GOSUB 200*L(K)+500
121 PRINT AT 10,P(K);"% ";W$(K,2 TO )
130 PRINT AT 15,X;K
140 NEXT K
150 PRINT AT 19,14;"\:'\''\':";AT 20,14;"\: ";A$;"\ :";AT 21,14;"\:.\..\.:"
160 INPUT R
170 IF R<>C THEN PRINT AT 16,10*C-9;"% % % % % % % % % "
180 IF R=C THEN PRINT AT 16,10*C-9;"*********"
185 PRINT AT 13,P(C);W$(C)
190 PAUSE 250
195 CLS
200 GOTO 30
500 PRINT AT 3,X-3;"\..\..\..\..";AT 4,X-3;"\: \ . \ :";AT 5,X-3;"\: \':\' \ '\''\':";AT 6,X-3;"\:.\..\..\..\..\.:";AT 7,X-3;"\' \' "
501 LET P(K)=X-4
502 LET W$(K)="AMBULANCE"
510 RETURN
700 GOSUB 1700
710 PRINT AT 4,X;"\ :";AT 5,X;"\.'\. ";AT 6,X-1;"\.' \ '\. ";AT 7,X-2;"\.' \ '\. "
711 LET P(K)=X-1
712 LET W$(K)="BOY"
720 RETURN
900 PRINT AT 5,X-3;"\ :% % % ";AT 6,X-3;"\ :% % % % % ";AT 7,X-2;"\' \ '"
901 LET P(K)=X-1
902 LET W$(K)="CAR"
910 RETURN
1100 PRINT AT 1,X-4;"\ . \:.\. ";AT 2,X-3;"\'. % \. ";AT 3,X-2;"% % % ";AT 4,X-2;"\:'\''\':";AT 5,X-2;"\: \ :"
1101 LET P(K)=X-1
1102 LET W$(K)="DOG"
1110 RETURN
1300 PRINT AT 1,X-4;"\ .% % % \..";AT 2,X-4;"% % % % \.:";AT 3,X-4;"\':% % \:'\ '\..\' ";AT 4,X-4;"\ : \: "
1301 LET P(K)=X-4
1302 LET W$(K)="ELEPHANT"
1310 RETURN
1500 PRINT AT 1,X-4;"\ . \ .\..";AT 2,X-4;"\ :\:.\.:% % \':\. ";AT 3,X-4;"\ :% % % % % \. ";AT 4,X-4;"\ :\' \ '\':\:'\' "
1501 LET P(K)=X-2
1502 LET W$(K)="FISH"
1510 RETURN
1700 PRINT AT 0,X;"% \: ";AT 1,X;"\':\' ";AT 2,X-1;"\ .\':\'.";AT 3,X-1;"\' \ : \' "
1710 IF L(K)=1 THEN RETURN
1720 PRINT AT 4,X;"\.:\. ";AT 5,X-1;"\.:% % \. ";AT 6,X-2;"\ '\:'\''\''\:'";AT 7,X-1;"\: \: "
1721 LET P(K)=X-2
1722 LET W$(K)="GIRL"
1730 RETURN
1900 PRINT AT 1,X-2;">\ .\..\..\. <";AT 2,X-1;"\.:% % \:.";AT 3,X-1;"\ :..\: ";AT 4,X-1;"\ : \: ";AT 5,X-1;"\ :\ '\' \: ";AT 6,X;"\''\''"
1901 FOR F=1 TO 2
1902 PRINT AT 1,X-1;" ";AT 2,X-1;"\ .\..\..\. "
1903 LET E=USR 16514
1904 PRINT AT 1,X-1;"\ .\..\..\. ";AT 2,X-1;"\.:% % \:."
1905 LET E=USR 16514
1906 NEXT F
1907 LET P(K)=X-1
1908 LET W$(K)="HAT"
1910 RETURN
2100 PRINT AT 1,X-1;"\ :";AT 2,X-1;"\ :";AT 3,X-2;"\ .\''\''\''\. ";AT 4,X-2;"\ :\~~\~~\~~\: ";AT 5,X-2;"\ :\ ' \' \: ";AT 6,X-2;"\ :\ .\..\. \: ";AT 7,X-2;"\ '\..\..\..\' "
2101 LET P(K)=X-3
2102 LET W$(K)="INDIAN"
2110 RETURN
2300 PRINT AT 1,X-3;"---\:.";AT 2,X-3;"\':\..\..\.:\:.\..";AT 3,X-3;"\ :\..\..\..\..\..% >";AT 4,X-3;"---\ .\:'";AT 5,X-3;"---\:'"
2301 LET P(K)=X-1
2302 LET W$(K)="JET"
2310 RETURN
2500 LET P(K)=X-2
2522 LET W$(K)="KING"
2523 PRINT AT 1,X-2;"\. \. \. \. \. ";AT 2,X-2;"\':\''\''\':\' ";AT 3,X-2;"\ :\ '\ '\ :";AT 4,X-2;"\ : \' \ :";AT 5,X-2;"\ :\ '\''\ :";AT 6,X-1;"\':% \' "
2530 RETURN
2700 PRINT AT 2,X-3;"A B C D";AT 3,X-2;"E F G"
2701 LET P(K)=X-4
2702 LET W$(K)="LETTERS"
2710 RETURN
2900 PRINT AT 1,X;"% \: ";AT 2,X;"\':\' ";AT 3,X-1;"% % % \: ";AT 4,X-1;"\: % \: \: ";AT 5,X-1;"\' % \: \' "
2910 IF L(K)=22 THEN RETURN
2920 PRINT AT 6,X-1;"\ :% % ";AT 7,X-1;"\ :\: % ";AT 8,X-1;"\ :\: % "
2921 LET P(K)=X-1
2922 LET W$(K)="MAN"
2930 RETURN
3100 PRINT AT 3,X-3;"1 2 3 4";AT 4,X-2;"5 6 7"
3101 LET P(K)=X-3
3102 LET W$(K)="NUMBERS"
3110 RETURN
3300 PRINT AT 1,X-4;"\. ";AT 2,X-4;"\ '\'. \.:\. \..\. ";AT 3,X-2;"\':% % \''";AT 4,X-4;"\ .\.'\':% % \.. \.'";AT 5,X-4;"\' \ .\.'\.'\.'\. \''";AT 6,X-4;"\ .\' \ .\' \'.\ '\'.";AT 7,X-4;"\' \ .\' \ '\. "
3301 LET P(K)=X-3
3302 LET W$(K)="OCTOPUS"
3310 RETURN
3500 PRINT AT 5,X-2;"\..\..\..\..% ";AT 4,X+2;"*";AT 3,X+2;"*"
3501 LET P(K)=X-1
3502 LET W$(K)="PIPE"
3510 RETURN
3700 GOSUB 2500
3710 FOR Y=38 TO 29 STEP -1
3720 PLOT 2*X-4,Y
3730 PLOT 2*X+4,Y
3740 NEXT Y
3751 LET P(K)=X-2
3752 LET W$(K)="QUEEN"
3760 RETURN
3900 PRINT AT 1,X;"A";AT 2,X;"% ";AT 3,X;"% ";AT 4,X;"% ";AT 5,X;"% ";AT 6,X-1;"\..% \..";AT 7,X-1;"\' *\ '";AT 8,X;"*"
3901 LET P(K)=X-3
3902 LET W$(K)="ROCKET"
3910 RETURN
4100 PRINT AT 1,X-1;"\..\..\..";AT 2,X-2;"\ :\ . \. \: ";AT 3,X-2;"\ : \: ";AT 4,X-3;">\ :\ . \. \: <";AT 5,X-2;"\ : \'' \: ";AT 6,X-1;"\''\''\''"
4101 FOR F=1 TO 2
4102 PRINT AT 4,X-1;" ";AT 5,X-1;"\ '\''\' "
4103 LET E=USR 16514
4104 PRINT AT 4,X-1;"\ . \. ";AT 5,X-1;" \'' "
4105 LET E=USR 16514
4106 NEXT F
4107 LET P(K)=X-2
4108 LET W$(K)="SMILE"
4110 RETURN
4300 PRINT AT 1,X-1;"\ .% \. ";AT 2,X-2;"\ .% % % \. ";AT 3,X-2;"% % % % % ";AT 4,X-2;"\ '% % % \' ";AT 5,X-1;"\ '% \' ";AT 6,X;"% ";AT 7,X-1;"\ .% \. "
4301 LET P(K)=X-2
4302 LET W$(K)="TREE"
4310 RETURN
4500 PRINT AT 1,X;"\.:\. ";AT 2,X-1;"\.'\ :\ '\. ";AT 3,X;"\ :";AT 4,X;"\ :"
4501 LET P(K)=X-1
4502 LET W$(K)="UP"
4510 RETURN
4700 PRINT AT 2,X-2;"\ .\. \..";AT 3,X-2;"% % \. \.:% \: ";AT 4,X-2;"\':% % % % \' ";AT 5,X-1;"\':% % \' ";AT 6,X;"\':\' "
4701 LET P(K)=X-4
4702 LET W$(K)="VALENTINE"
4710 RETURN
4900 GOSUB 2900
4910 PRINT AT 6,X-1;"\.:% % \. ";AT 7,X-2;"\.:% % % % \. ";AT 8,X-1;"\ :\: % "
4911 LET P(K)=X-2
4912 LET W$(K)="WOMAN"
4920 RETURN
5100 PRINT AT 1,X-3;"\: \: \: \: \: \: \: ";AT 2,X-3;"\: \: \: \: \: \' ";AT 3,X-3;"\: \: \: \' \. ";AT 4,X-3;"\: \' \. /";AT 5,X-1;"/"
5101 LET P(K)=X-4
5102 LET W$(K)="XYLOPHONE"
5110 RETURN
5300 PRINT AT 1,X-1;"\ .% \. ";AT 2,X-1;"% % \':";AT 3,X-1;"% % % \. <";AT 4,X-1;"% % \''<";AT 5,X-1;"% % \.. <";AT 6,X-1;"\ :% "
5301 LET P(K)=X-1
5302 LET W$(K)="YELL"
5310 RETURN
5500 PRINT AT 3,X-2;"\.'\. \.'";AT 4,X-3;"\ ' \ '\. \.'\.'";AT 5,X;"\ '"
5501 LET P(K)=X-3
5502 LET W$(K)="ZIGZAG"
5510 RETURN
1 REM \06\01\C5\06\64\00\10\FD\C1\10\F7\C9\2E\2E\2E\2E\2E\2E\2E\2E\2E\2E\2E
2 SAVE "VOWE%L"
12 PRINT AT 8,11;"VOWELTUTOR";AT 10,2;"COPYRIGHT 1982 LOU GOLDSTEIN";AT 12,7;"% %F%R%O%M% %S%O%F%T%S%Y%N%C% %I%N%C% "
13 PRINT AT 20,5;"PRESS ""ENTER"" TO START"
14 PAUSE 33000
15 RAND
16 LET V$="AEIOU"
17 CLS
18 DIM P(3)
19 DIM W$(3,10)
20 DIM L(5)
23 PRINT AT 6,0;"WHICH VOWELS DO YOU WANT TO USE?1=LONG",,"2=SHORT",,"3=BOTH",,"4=EXIT PROGRAM"
24 INPUT O
25 LET LS=O
26 CLS
27 IF O=4 THEN STOP
30 IF O=3 THEN LET LS=INT (RND*2)+1
31 FOR K=1 TO 3
32 FAST
40 LET L(K)=INT (RND*5)+1
50 NEXT K
60 IF L(1)=L(2) OR L(1)=L(3) OR L(2)=L(3) THEN GOTO 31
80 LET C=INT (RND*3)+1
90 LET A$=V$(L(C))
99 SLOW
100 FOR K=1 TO 3
105 LET Z=INT (RND*3)
110 LET X=10*K-5
120 GOSUB 700*LS+100*L(K)+30*Z
121 PRINT AT 10,P(K);W$(K)
130 PRINT AT 15,X;K
140 NEXT K
150 PRINT AT 19,14;"\:'\''\':";AT 20,14;"\: ";A$;"\ :";AT 21,14;"\:.\..\.:"
151 FOR J=1 TO 10
152 IF W$(C,J)="% " THEN GOTO 155
153 NEXT J
155 LET W$(C,J)=A$
156 INPUT R
157 IF R=9 THEN CLS
160 IF R=9 THEN GOTO 23
170 IF R<>C THEN PRINT AT 16,10*C-9;"% % % % % % % % % "
180 IF R=C THEN PRINT AT 16,10*C-9;"*********"
185 PRINT AT 13,P(C);W$(C)
190 PAUSE 250
195 CLS
200 GOTO 30
800 LET W$(K)="TR% IN"
801 LET P(K)=X-2
802 PRINT AT 2,X-1;"*";AT 3,X;"*";AT 4,X;"\ :\..\. ";AT 5,X-4;"\ :% \.:% \.:% % >";AT 6,X-4;"\ '\ '\ '\ '\ ' \ '"
803 RETURN
830 LET W$(K)="C% NE"
831 LET P(K)=X-1
832 PRINT AT 1,X+1;"\' ";AT 0,X-1;"\ .\''\. "
833 FOR Y=41 TO 30 STEP -1
834 PLOT 2*X-1,Y
835 NEXT Y
836 RETURN
860 LET W$(K)="D% YS"
861 LET P(K)=X-2
862 PRINT AT 2,X-1;"FRI.";AT 4,X-1;"SAT.";AT 6,X-1;"SUN."
863 RETURN
900 LET W$(K)="K% Y"
901 LET P(K)=X-1
902 PRINT AT 3,X-3;"% % ";AT 4,X-3;"% % \:'\''\':% % \' ";AT 5,X-3;"% % \ '\ :\ '"
903 RETURN
930 LET W$(K)="THR% E"
931 LET P(K)=X-2
932 PRINT AT 3,X-1;"\''\''\: ";AT 4,X+1;"\: ";AT 5,X-1;"\ '\''\: ";AT 6,X+1;"\: ";AT 7,X-1;"\''\''\' "
933 RETURN
960 LET W$(K)="KN% E"
961 LET P(K)=X-2
962 PRINT AT 0,X+1;"% \: ";AT 1,X+1;"\':\' ";AT 2,X+1;"\: ";AT 3,X;"\ :\ '\..\. ";AT 4,X;"\: ";AT 5,X-1;"\ :\ '\. ";AT 6,X-1;"\ : \ '\. <";AT 7,X-2;"\ .\' \: ";AT 8,X-2;"\'. \''"
968 RETURN
1000 LET W$(K)="F% VE"
1001 LET P(K)=X-2
1002 PRINT AT 2,X-1;"\:'\''\' ";AT 3,X-1;"\:.\. ";AT 4,X;"\ '\. ";AT 5,X-1;"\. \ .\' ";AT 6,X-1;"\ '\' "
1003 RETURN
1030 LET W$(K)="K% TE"
1031 LET P(K)=X-2
1032 PRINT AT 0,X;"\.:\. ";AT 1,X-1;"\ .\':\'.";AT 2,X-1;"\.:\.:\.:\. ";AT 3,X-1;"\ :\ :\ :";AT 4,X;"% \: ";AT 5,X;"\ :";AT 6,X+1;"\'.";AT 7,X+1;"\.'";AT 8,X+1;"\ '"
1033 RETURN
1060 LET W$(K)="N% NE"
1061 LET P(K)=X-2
1063 PRINT AT 2,X-1;"\:'\''\: ";AT 3,X-1;"\: \: ";AT 4,X-1;"\''\''\: ";AT 5,X-1;"\. \: ";AT 6,X-1;"\''\''\' "
1064 RETURN
1100 LET W$(K)="B% AT"
1101 LET P(K)=X-2
1102 PRINT AT 1,X-2;"\..\..\..\..\. ";AT 2,X-2;"\ '\. \ '\. ";AT 3,X-1;"\.' \.'";AT 4,X-2;"\ '\''\':\''\''";AT 5,X-4;"\..\..\..\..\.:\..\..\..>";AT 6,X-4;"\':% % % % % \:'";AT 7,X-3;"\''\''\''\''\''"
1103 RETURN
1130 LET W$(K)="THR% W"
1131 LET P(K)=X-2
1132 PRINT AT 2,X+2;">";AT 3,X-2;"\ :% >\ '";AT 4,X-2;"\ '\:' \.'";AT 5,X-3;"\ .\''\:'\''";AT 6,X-3;"\' \: ";AT 7,X-2;"\.'\ '\. ";AT 8,X-3;"\ ' \ '"
1133 RETURN
1160 LET W$(K)="N% SE"
1161 LET P(K)=X-2
1162 PRINT AT 1,X-1;"\ .% \. ";AT 2,X-1;"% \:.\:.";AT 3,X-1;"% % \' ";AT 4,X-1;"\':\:'\' "
1163 FOR G=1 TO 3
1164 PRINT AT 2,1+X;"\: "
1165 LET U=USR 16514
1166 PRINT AT 2,X+1;"\:."
1167 LET U=USR 16514
1168 NEXT G
1169 RETURN
1200 LET W$(K)="% NITED"
1201 LET P(K)=X-3
1202 PRINT AT 1,X-3;"\..\..\..\..\..\. \.:";AT 2,X-4;"\ .% % % % % % \.:% ";AT 3,X-4;"\ :AMERICA\: ";AT 4,X-4;"\ '% % % % % % % \: ";AT 5,X-3;"\''\''% % % % % \: ";AT 6,X;"\':\:' \: ";AT 7,X+1;"\' "
1203 PRINT AT 11,P(K);"STATES"
1204 RETURN
1230 LET W$(K)="F% EL"
1231 LET P(K)=X-2
1232 PRINT AT 1,X-4;"\##\##\##";AT 2,X-4;"\##%G\##";AT 3,X-4;"\##%A\##";AT 4,X-4;"\##%S\##\'. \:'\''\':";AT 5,X-4;"\##\##\##\ '\..\:.\..\.:";AT 6,X-4;"\##\##\## % % % ";AT 7,X-4;"\##\##\## \: \ :"
1233 RETURN
1260 LET W$(K)="T% BE"
1261 LET P(K)=X-2
1262 PRINT AT 2,X-4;"\ .\..\..\..\..\..\..\..\. ";AT 3,X-4;"\ :\##TOOTH\##\:.";AT 4,X-4;"\ :\##PASTE\##\:'";AT 5,X-4;"\ '\''\''\''\''\''\''\''\' "
1263 RETURN
1500 LET W$(K)="FL% G"
1501 LET P(K)=X-2
1503 LET B=X-4
1504 PRINT AT 0,B;"\ .\..\..\..\..\..\..\..";AT 1,B;"\ :***\:'\''\''\':";AT 2,B;"\ :***\:'\''\''\':";AT 3,B;"\ :\''\''\''\''\''\''\':";AT 4,B;"\ :\''\''\''\''\''\''\':";AT 5,B;"\ :\''\''\''\''\''\''\''";AT 6,B;"\ :"
1505 RETURN
1530 LET W$(K)="% DD"
1531 LET P(K)=X-1
1532 PRINT AT 1,X-2;"3+2=\##";AT 3,X;"75";AT 4,X-1;"+23";AT 5,X-1;"\''\''\''"
1533 RETURN
1560 LET W$(K)="P% N"
1561 LET P(K)=X-1
1562 PRINT AT 3,X-3;"\..\..\..\..";AT 4,X-4;"\ :\' \ '\:.\..\..\..";AT 5,X-4;"\ :\:.\..\..\.:\: ";AT 6,X-4;"\ '% % % % \' "
1563 RETURN
1600 LET W$(K)="T% N"
1601 LET P(K)=X-1
1602 LET B=X-2
1603 PRINT AT 2,B;"\ : \:'\''\':";AT 3,B;"\ : \: \ :";AT 4,B;"\ : \: \ :";AT 5,B;"\ : \:.\..\.:"
1604 RETURN
1630 LET W$(K)="DR% SS"
1631 LET P(K)=X-2
1632 PRINT AT 1,X-2;"\.:\:.\.:\:.";AT 2,X-3;"\ '\:'% % \':\' ";AT 3,X-2;"\ .% % \. ";AT 4,X-3;"\ .% % % % \. ";AT 5,X-4;"\ .% % % % % % \. "
1633 RETURN
1660 LET W$(K)="L% G"
1661 LET P(K)=X-1
1662 LET B=X-1
1663 PRINT AT 0,X;"% \: ";AT 1,X;"\':\' ";AT 2,B;"% % % \: ";AT 3,B;"\: % \: \: ";AT 4,B;"\' % \: \' ";AT 5,B;"\ :% % ";AT 6,B;"\ :\: \##<";AT 7,B;"\ :\: \##<"
1664 RETURN
1700 LET W$(K)="S% X"
1701 LET P(K)=X-1
1702 LET B=X-1
1703 PRINT AT 1,X;"\..";AT 2,B;"\.' \' ";AT 3,B;"\: ";AT 4,B;"\:.\''\'.";AT 5,B;"\: \ :";AT 6,B;"\ '\..\' "
1704 RETURN
1730 LET W$(K)="SH% P"
1731 LET P(K)=X-2
1732 PRINT AT 3,X-3;"\..\:.\:.\. ";AT 4,X-5;"\ .\..% \:'% \:'% \:'% \:'";AT 5,X-4;"\':\:.% \:.% \:.% \:'";AT 6,X-5;"\@@\@@\@@\@@\@@\@@\@@\@@\@@\@@"
1733 RETURN
1760 LET W$(K)="WR% ST"
1761 LET P(K)=X-2
1762 LET B=X-1
1763 PRINT AT 0,B;"\..\..\..";AT 1,B;"\:'% \':";AT 2,B;"% \''% ";AT 3,B;"\''% \''"
1764 LET B=X-2
1765 PRINT AT 4,B;"% % % % % ";AT 5,B;"% \ :% \: % ";AT 6,B-1;">\##\ :% \: \##<";AT 7,B;"W W"
1766 RETURN
1800 LET W$(K)="P% T"
1801 LET P(K)=X-1
1802 PRINT AT 1,X-2;"\..";AT 2,X-4;"\ .\'' \''\. ";AT 3,X-4;"\:. \.:\..\..\..";AT 4,X-4;"% % \..% % ";AT 5,X-4;"\':% % % \:'";AT 6,X-3;"\ '\''\' "
1803 RETURN
1830 LET W$(K)="CL% CK"
1831 LET P(K)=X-3
1832 PRINT AT 1,X;"\..\. ";AT 2,X-2;"\ .\''\ .\ '\'.";AT 3,X-2;"\: \ : \: ";AT 4,X-3;"\ : \ :\..\. \ :";AT 5,X-3;"\ '\. \.'";AT 6,X-2;"\'. \ .\' ";AT 7,X-1;"\''\..\.'\' "
1833 RETURN
1860 LET W$(K)="ST% P"
1861 LET P(K)=X-2
1862 PRINT AT 0,X-2;"\ .% % \. ";AT 1,X-3;"\ .% % % % \. ";AT 2,X-3;"% ST P% ";AT 3,X-3;"% % % % % % ";AT 4,X-3;"\ '% % % % \' ";AT 5,X-2;"\ '% % \' ";AT 6,X-1;"\ :\: ";AT 7,X-1;"\ :\: "
1863 RETURN
1900 LET W$(K)="G% N"
1901 LET P(K)=X-1
1902 LET B=X-4
1903 PRINT AT 2,B;"\ :% % % % % -->";AT 3,B;"\ :\: \: \:'\''";AT 4,B;"\ :\:.\..\: ";AT 5,B;"\ :\: "
1904 RETURN
1930 LET W$(K)="DR% M"
1931 LET P(K)=X-2
1932 PRINT AT 0,X+2;"/";AT 1,X-1;"\.. \ ' /";AT 2,X-3;"\ .\'' \''\. \ '";AT 3,X-3;"\:. \.:";AT 4,X-3;"% % \..% % ";AT 5,X-3;"\':% % % \:'";AT 6,X-2;"\ '\''\' "
1933 RETURN
1960 LET W$(K)="B% S"
1961 LET P(K)=X-1
1962 LET B=X-3
1963 PRINT AT 2,B;"% \''\:'\':\''% % ";AT 3,B;"% \..\:.\.:\..% \ :% ";AT 4,B;"% % % % % % \.:% ";AT 5,B+1;"\' \ '"
1964 RETURN
Note: Type-in program listings on this website use ZMAKEBAS notation for graphics characters.
People
E
Skip to content
Computer Tutor
Products: Computer Tutors: Alpha/Vowel Tutors
Developer(s): Lou Goldstein
Date: 1982
Type: Cassette
Platform(s): TS 1000
Tags: Education
AlphaTutor and VowelTutor are a paired set of educational programs designed to teach children letter recognition and vowel sounds through a picture-matching quiz format. Each round randomly selects three images drawn entirely in block graphics, displays them with numbered labels, and prompts the child to identify which picture matches a highlighted letter or vowel shown in a bordered box. The programs use computed GOSUB targets (e.g., `GOSUB 200*L(K)+500` and `GOSUB 700*LS+100*L(K)+30*Z`) to dispatch to one of 26 picture-drawing subroutines covering letters A–Z and multiple vowel-sound variants. VowelTutor extends the concept with separate long and short vowel word sets per letter, selected by a random or user-chosen mode flag, and includes an animated nose-sniffing and hat/smile flip routine via `USR 16514`, pointing to a small machine-code delay loop stored in the REM statement at line 1.
Program Analysis
This listing contains two related programs: AlphaTutor and VowelTutor, both credited to Lou Goldstein / SoftSync Inc., 1982. AlphaTutor covers all 26 letters of the alphabet; VowelTutor extends the concept to long and short vowel sounds, offering multiple word variants per vowel. Both share the same core quiz loop and picture-rendering architecture.
Program Structure
Both programs follow the same top-level flow:
- Title/splash screen (lines 12–14), then
RAND to seed the RNG.
- Initialise arrays
P(3), W$(3,10), L(3) (lines 18–20).
- Main loop (lines 30–200): pick three distinct random indices, choose one as the target, dispatch to a drawing subroutine for each, display a letter/vowel prompt box, read a numeric answer, give feedback, pause, clear and repeat.
- Drawing subroutines: one per picture subject, each printing block-graphic art, setting
P(K) (label column) and W$(K) (word string).
VowelTutor adds a mode-selection screen (lines 23–27) offering long vowels, short vowels, or both, stored in LS, and allows the user to return to mode selection by entering 9.
Computed GOSUB Dispatch
The most architecturally notable feature is the use of arithmetic expressions as GOSUB targets to select picture subroutines without IF/THEN chains:
- AlphaTutor:
GOSUB 200*L(K)+500 — with L(K) in 0–25, this generates targets 500 (A=ambulance), 700 (B=boy), 900 (C=car) … 5500 (Z=zigzag), spaced 200 apart.
- VowelTutor:
GOSUB 700*LS+100*L(K)+30*Z — the LS factor (1=long, 2=short) shifts into a separate bank of subroutines; L(K) selects the vowel (1–5 = A/E/I/O/U); Z (0–2) selects one of up to three word variants per vowel per length.
This is a compact and efficient dispatch mechanism that avoids long IF/THEN chains entirely, at the cost of requiring subroutines to be placed at exactly the computed line numbers.
Machine Code Usage
Line 1 in both programs is a REM statement whose body encodes a short Z80 machine-code routine. The sequence \06\01\C5\06\64\00\10\FD\C1\10\F7\C9 disassembles as:
LD B,1 — outer loop count
PUSH BC
LD B,100 ; LD C,0 — inner delay count (25600 iterations)
DJNZ $ — inner loop
POP BC ; DJNZ … — outer loop
RET
This routine is called via LET E=USR 16514 (the address of the REM body in the VowelTutor variant is slightly longer, hence a different offset in practice). It is used as a simple software delay in animation sequences — for example, the hat flip in AlphaTutor (lines 1901–1906), the smile animation (lines 4101–4106), and the nose-sniffing effect (lines 1163–1168 in VowelTutor).
Key BASIC Idioms
- Block graphic art: All pictures are rendered using the ZX81/TS1000 block graphic characters (2×2 pixel sub-characters), encoded here as zmakebas escape sequences such as
\ ., \:., \'', etc.
- Distinct random selection: Lines 60 check
L(1)=L(2) OR L(1)=L(3) OR L(2)=L(3) and loop back if any two indices collide, ensuring three distinct pictures appear each round.
- Column positioning via formula:
LET X=10*K-5 (line 110) distributes the three picture columns evenly across the 32-character screen (columns 5, 15, 25).
- Answer box: The target letter is displayed in a bordered box drawn with block graphics at lines 19–21 using
AT positioning.
- PLOT for QUEEN and CONE: The subroutines at lines 3700 and 830 use
PLOT with pixel coordinates to draw vertical lines, since the block graphic resolution is insufficient for narrow strokes.
VowelTutor Word-Embedding Technique
In VowelTutor, word labels use a space character as a placeholder for the missing vowel (e.g., "TR% IN" for TRAIN, "K% TE" for KITE). After the round is set up, lines 151–155 scan W$(C) character-by-character to find the first "% " (space) position, then replace it with the actual vowel character A$ — effectively filling in the blank dynamically. This lets the same word string serve as both a gapped display and, after substitution, the correct spelled form.
Notable Subroutine Sharing
AlphaTutor’s GIRL subroutine (line 1700) is shared with BOY (line 700): the BOY subroutine calls GOSUB 1700 to draw the upper body, then the shared routine checks IF L(K)=1 THEN RETURN (line 1710) to exit early for BOY, or continues to draw the skirt/legs for GIRL. Similarly, VowelTutor’s WOMAN subroutine (line 4900) reuses the MAN subroutine (line 2900) for the head and torso, then overprints with different lower-body graphics.
Array Sizing
Array Dimensions Purpose P(3)3 elements Column position for each picture’s word label W$(3,10)3 strings × 10 chars Word associated with each picture slot L(3) / L(5)3 (Alpha) / 5 (Vowel) Random index for picture selection
Potential Anomalies
- AlphaTutor has no subroutine at the computed target for letter index 0 (line 500 handles A=0, as
200*0+500=500) — this is correct; L(K)=INT(RND*26) yields 0–25, mapping to lines 500–5500.
- VowelTutor’s
GOSUB 700*LS+100*L(K)+30*Z for LS=2 (short vowels) can yield targets like 1400+30*Z (lines 1400, 1430, 1460) which are not all defined in the listing — some short-vowel variant slots appear absent, which would cause a BASIC error if selected. This may reflect incomplete subroutine coverage in the original listing.
- The
PAUSE 33000 at line 14 provides a long title-screen pause (~30 seconds at normal speed) but any key press does not skip it — the user must wait it out unless they press BREAK.
- In VowelTutor, the
\## sequences in several subroutines (e.g., lines 1232, 1262, 1532) are not standard zmakebas escape sequences and likely represent inverse-video block characters or UDGs in the original tape file that were not fully decoded in this transcription.
Content
Source Code
1 REM \06\01\C5\06\64\00\10\FD\C1\10\F7\C9\2E\2E\2E\2E\2E\2E
2 SAVE "AB%C"
12 PRINT AT 8,11;"ALPHATUTOR";AT 10,2;"COPYRIGHT 1982 LOU GOLDSTEIN";AT 12,6;"% %F%R%O%M% %S%O%F%T%S%Y%N%C% %I%N%C% "
13 PRINT AT 20,5;"PRESS ""ENTER"" TO START"
14 PAUSE 33000
15 RAND
17 CLS
18 DIM P(3)
19 DIM W$(3,10)
20 DIM L(3)
30 FOR K=1 TO 3
40 LET L(K)=INT (RND*26)
50 NEXT K
60 IF L(1)=L(2) OR L(1)=L(3) OR L(2)=L(3) THEN GOTO 30
80 LET C=INT (RND*3)+1
90 LET A$=CHR$ (L(C)+38)
100 FOR K=1 TO 3
110 LET X=10*K-5
120 GOSUB 200*L(K)+500
121 PRINT AT 10,P(K);"% ";W$(K,2 TO )
130 PRINT AT 15,X;K
140 NEXT K
150 PRINT AT 19,14;"\:'\''\':";AT 20,14;"\: ";A$;"\ :";AT 21,14;"\:.\..\.:"
160 INPUT R
170 IF R<>C THEN PRINT AT 16,10*C-9;"% % % % % % % % % "
180 IF R=C THEN PRINT AT 16,10*C-9;"*********"
185 PRINT AT 13,P(C);W$(C)
190 PAUSE 250
195 CLS
200 GOTO 30
500 PRINT AT 3,X-3;"\..\..\..\..";AT 4,X-3;"\: \ . \ :";AT 5,X-3;"\: \':\' \ '\''\':";AT 6,X-3;"\:.\..\..\..\..\.:";AT 7,X-3;"\' \' "
501 LET P(K)=X-4
502 LET W$(K)="AMBULANCE"
510 RETURN
700 GOSUB 1700
710 PRINT AT 4,X;"\ :";AT 5,X;"\.'\. ";AT 6,X-1;"\.' \ '\. ";AT 7,X-2;"\.' \ '\. "
711 LET P(K)=X-1
712 LET W$(K)="BOY"
720 RETURN
900 PRINT AT 5,X-3;"\ :% % % ";AT 6,X-3;"\ :% % % % % ";AT 7,X-2;"\' \ '"
901 LET P(K)=X-1
902 LET W$(K)="CAR"
910 RETURN
1100 PRINT AT 1,X-4;"\ . \:.\. ";AT 2,X-3;"\'. % \. ";AT 3,X-2;"% % % ";AT 4,X-2;"\:'\''\':";AT 5,X-2;"\: \ :"
1101 LET P(K)=X-1
1102 LET W$(K)="DOG"
1110 RETURN
1300 PRINT AT 1,X-4;"\ .% % % \..";AT 2,X-4;"% % % % \.:";AT 3,X-4;"\':% % \:'\ '\..\' ";AT 4,X-4;"\ : \: "
1301 LET P(K)=X-4
1302 LET W$(K)="ELEPHANT"
1310 RETURN
1500 PRINT AT 1,X-4;"\ . \ .\..";AT 2,X-4;"\ :\:.\.:% % \':\. ";AT 3,X-4;"\ :% % % % % \. ";AT 4,X-4;"\ :\' \ '\':\:'\' "
1501 LET P(K)=X-2
1502 LET W$(K)="FISH"
1510 RETURN
1700 PRINT AT 0,X;"% \: ";AT 1,X;"\':\' ";AT 2,X-1;"\ .\':\'.";AT 3,X-1;"\' \ : \' "
1710 IF L(K)=1 THEN RETURN
1720 PRINT AT 4,X;"\.:\. ";AT 5,X-1;"\.:% % \. ";AT 6,X-2;"\ '\:'\''\''\:'";AT 7,X-1;"\: \: "
1721 LET P(K)=X-2
1722 LET W$(K)="GIRL"
1730 RETURN
1900 PRINT AT 1,X-2;">\ .\..\..\. <";AT 2,X-1;"\.:% % \:.";AT 3,X-1;"\ :..\: ";AT 4,X-1;"\ : \: ";AT 5,X-1;"\ :\ '\' \: ";AT 6,X;"\''\''"
1901 FOR F=1 TO 2
1902 PRINT AT 1,X-1;" ";AT 2,X-1;"\ .\..\..\. "
1903 LET E=USR 16514
1904 PRINT AT 1,X-1;"\ .\..\..\. ";AT 2,X-1;"\.:% % \:."
1905 LET E=USR 16514
1906 NEXT F
1907 LET P(K)=X-1
1908 LET W$(K)="HAT"
1910 RETURN
2100 PRINT AT 1,X-1;"\ :";AT 2,X-1;"\ :";AT 3,X-2;"\ .\''\''\''\. ";AT 4,X-2;"\ :\~~\~~\~~\: ";AT 5,X-2;"\ :\ ' \' \: ";AT 6,X-2;"\ :\ .\..\. \: ";AT 7,X-2;"\ '\..\..\..\' "
2101 LET P(K)=X-3
2102 LET W$(K)="INDIAN"
2110 RETURN
2300 PRINT AT 1,X-3;"---\:.";AT 2,X-3;"\':\..\..\.:\:.\..";AT 3,X-3;"\ :\..\..\..\..\..% >";AT 4,X-3;"---\ .\:'";AT 5,X-3;"---\:'"
2301 LET P(K)=X-1
2302 LET W$(K)="JET"
2310 RETURN
2500 LET P(K)=X-2
2522 LET W$(K)="KING"
2523 PRINT AT 1,X-2;"\. \. \. \. \. ";AT 2,X-2;"\':\''\''\':\' ";AT 3,X-2;"\ :\ '\ '\ :";AT 4,X-2;"\ : \' \ :";AT 5,X-2;"\ :\ '\''\ :";AT 6,X-1;"\':% \' "
2530 RETURN
2700 PRINT AT 2,X-3;"A B C D";AT 3,X-2;"E F G"
2701 LET P(K)=X-4
2702 LET W$(K)="LETTERS"
2710 RETURN
2900 PRINT AT 1,X;"% \: ";AT 2,X;"\':\' ";AT 3,X-1;"% % % \: ";AT 4,X-1;"\: % \: \: ";AT 5,X-1;"\' % \: \' "
2910 IF L(K)=22 THEN RETURN
2920 PRINT AT 6,X-1;"\ :% % ";AT 7,X-1;"\ :\: % ";AT 8,X-1;"\ :\: % "
2921 LET P(K)=X-1
2922 LET W$(K)="MAN"
2930 RETURN
3100 PRINT AT 3,X-3;"1 2 3 4";AT 4,X-2;"5 6 7"
3101 LET P(K)=X-3
3102 LET W$(K)="NUMBERS"
3110 RETURN
3300 PRINT AT 1,X-4;"\. ";AT 2,X-4;"\ '\'. \.:\. \..\. ";AT 3,X-2;"\':% % \''";AT 4,X-4;"\ .\.'\':% % \.. \.'";AT 5,X-4;"\' \ .\.'\.'\.'\. \''";AT 6,X-4;"\ .\' \ .\' \'.\ '\'.";AT 7,X-4;"\' \ .\' \ '\. "
3301 LET P(K)=X-3
3302 LET W$(K)="OCTOPUS"
3310 RETURN
3500 PRINT AT 5,X-2;"\..\..\..\..% ";AT 4,X+2;"*";AT 3,X+2;"*"
3501 LET P(K)=X-1
3502 LET W$(K)="PIPE"
3510 RETURN
3700 GOSUB 2500
3710 FOR Y=38 TO 29 STEP -1
3720 PLOT 2*X-4,Y
3730 PLOT 2*X+4,Y
3740 NEXT Y
3751 LET P(K)=X-2
3752 LET W$(K)="QUEEN"
3760 RETURN
3900 PRINT AT 1,X;"A";AT 2,X;"% ";AT 3,X;"% ";AT 4,X;"% ";AT 5,X;"% ";AT 6,X-1;"\..% \..";AT 7,X-1;"\' *\ '";AT 8,X;"*"
3901 LET P(K)=X-3
3902 LET W$(K)="ROCKET"
3910 RETURN
4100 PRINT AT 1,X-1;"\..\..\..";AT 2,X-2;"\ :\ . \. \: ";AT 3,X-2;"\ : \: ";AT 4,X-3;">\ :\ . \. \: <";AT 5,X-2;"\ : \'' \: ";AT 6,X-1;"\''\''\''"
4101 FOR F=1 TO 2
4102 PRINT AT 4,X-1;" ";AT 5,X-1;"\ '\''\' "
4103 LET E=USR 16514
4104 PRINT AT 4,X-1;"\ . \. ";AT 5,X-1;" \'' "
4105 LET E=USR 16514
4106 NEXT F
4107 LET P(K)=X-2
4108 LET W$(K)="SMILE"
4110 RETURN
4300 PRINT AT 1,X-1;"\ .% \. ";AT 2,X-2;"\ .% % % \. ";AT 3,X-2;"% % % % % ";AT 4,X-2;"\ '% % % \' ";AT 5,X-1;"\ '% \' ";AT 6,X;"% ";AT 7,X-1;"\ .% \. "
4301 LET P(K)=X-2
4302 LET W$(K)="TREE"
4310 RETURN
4500 PRINT AT 1,X;"\.:\. ";AT 2,X-1;"\.'\ :\ '\. ";AT 3,X;"\ :";AT 4,X;"\ :"
4501 LET P(K)=X-1
4502 LET W$(K)="UP"
4510 RETURN
4700 PRINT AT 2,X-2;"\ .\. \..";AT 3,X-2;"% % \. \.:% \: ";AT 4,X-2;"\':% % % % \' ";AT 5,X-1;"\':% % \' ";AT 6,X;"\':\' "
4701 LET P(K)=X-4
4702 LET W$(K)="VALENTINE"
4710 RETURN
4900 GOSUB 2900
4910 PRINT AT 6,X-1;"\.:% % \. ";AT 7,X-2;"\.:% % % % \. ";AT 8,X-1;"\ :\: % "
4911 LET P(K)=X-2
4912 LET W$(K)="WOMAN"
4920 RETURN
5100 PRINT AT 1,X-3;"\: \: \: \: \: \: \: ";AT 2,X-3;"\: \: \: \: \: \' ";AT 3,X-3;"\: \: \: \' \. ";AT 4,X-3;"\: \' \. /";AT 5,X-1;"/"
5101 LET P(K)=X-4
5102 LET W$(K)="XYLOPHONE"
5110 RETURN
5300 PRINT AT 1,X-1;"\ .% \. ";AT 2,X-1;"% % \':";AT 3,X-1;"% % % \. <";AT 4,X-1;"% % \''<";AT 5,X-1;"% % \.. <";AT 6,X-1;"\ :% "
5301 LET P(K)=X-1
5302 LET W$(K)="YELL"
5310 RETURN
5500 PRINT AT 3,X-2;"\.'\. \.'";AT 4,X-3;"\ ' \ '\. \.'\.'";AT 5,X;"\ '"
5501 LET P(K)=X-3
5502 LET W$(K)="ZIGZAG"
5510 RETURN
1 REM \06\01\C5\06\64\00\10\FD\C1\10\F7\C9\2E\2E\2E\2E\2E\2E\2E\2E\2E\2E\2E
2 SAVE "VOWE%L"
12 PRINT AT 8,11;"VOWELTUTOR";AT 10,2;"COPYRIGHT 1982 LOU GOLDSTEIN";AT 12,7;"% %F%R%O%M% %S%O%F%T%S%Y%N%C% %I%N%C% "
13 PRINT AT 20,5;"PRESS ""ENTER"" TO START"
14 PAUSE 33000
15 RAND
16 LET V$="AEIOU"
17 CLS
18 DIM P(3)
19 DIM W$(3,10)
20 DIM L(5)
23 PRINT AT 6,0;"WHICH VOWELS DO YOU WANT TO USE?1=LONG",,"2=SHORT",,"3=BOTH",,"4=EXIT PROGRAM"
24 INPUT O
25 LET LS=O
26 CLS
27 IF O=4 THEN STOP
30 IF O=3 THEN LET LS=INT (RND*2)+1
31 FOR K=1 TO 3
32 FAST
40 LET L(K)=INT (RND*5)+1
50 NEXT K
60 IF L(1)=L(2) OR L(1)=L(3) OR L(2)=L(3) THEN GOTO 31
80 LET C=INT (RND*3)+1
90 LET A$=V$(L(C))
99 SLOW
100 FOR K=1 TO 3
105 LET Z=INT (RND*3)
110 LET X=10*K-5
120 GOSUB 700*LS+100*L(K)+30*Z
121 PRINT AT 10,P(K);W$(K)
130 PRINT AT 15,X;K
140 NEXT K
150 PRINT AT 19,14;"\:'\''\':";AT 20,14;"\: ";A$;"\ :";AT 21,14;"\:.\..\.:"
151 FOR J=1 TO 10
152 IF W$(C,J)="% " THEN GOTO 155
153 NEXT J
155 LET W$(C,J)=A$
156 INPUT R
157 IF R=9 THEN CLS
160 IF R=9 THEN GOTO 23
170 IF R<>C THEN PRINT AT 16,10*C-9;"% % % % % % % % % "
180 IF R=C THEN PRINT AT 16,10*C-9;"*********"
185 PRINT AT 13,P(C);W$(C)
190 PAUSE 250
195 CLS
200 GOTO 30
800 LET W$(K)="TR% IN"
801 LET P(K)=X-2
802 PRINT AT 2,X-1;"*";AT 3,X;"*";AT 4,X;"\ :\..\. ";AT 5,X-4;"\ :% \.:% \.:% % >";AT 6,X-4;"\ '\ '\ '\ '\ ' \ '"
803 RETURN
830 LET W$(K)="C% NE"
831 LET P(K)=X-1
832 PRINT AT 1,X+1;"\' ";AT 0,X-1;"\ .\''\. "
833 FOR Y=41 TO 30 STEP -1
834 PLOT 2*X-1,Y
835 NEXT Y
836 RETURN
860 LET W$(K)="D% YS"
861 LET P(K)=X-2
862 PRINT AT 2,X-1;"FRI.";AT 4,X-1;"SAT.";AT 6,X-1;"SUN."
863 RETURN
900 LET W$(K)="K% Y"
901 LET P(K)=X-1
902 PRINT AT 3,X-3;"% % ";AT 4,X-3;"% % \:'\''\':% % \' ";AT 5,X-3;"% % \ '\ :\ '"
903 RETURN
930 LET W$(K)="THR% E"
931 LET P(K)=X-2
932 PRINT AT 3,X-1;"\''\''\: ";AT 4,X+1;"\: ";AT 5,X-1;"\ '\''\: ";AT 6,X+1;"\: ";AT 7,X-1;"\''\''\' "
933 RETURN
960 LET W$(K)="KN% E"
961 LET P(K)=X-2
962 PRINT AT 0,X+1;"% \: ";AT 1,X+1;"\':\' ";AT 2,X+1;"\: ";AT 3,X;"\ :\ '\..\. ";AT 4,X;"\: ";AT 5,X-1;"\ :\ '\. ";AT 6,X-1;"\ : \ '\. <";AT 7,X-2;"\ .\' \: ";AT 8,X-2;"\'. \''"
968 RETURN
1000 LET W$(K)="F% VE"
1001 LET P(K)=X-2
1002 PRINT AT 2,X-1;"\:'\''\' ";AT 3,X-1;"\:.\. ";AT 4,X;"\ '\. ";AT 5,X-1;"\. \ .\' ";AT 6,X-1;"\ '\' "
1003 RETURN
1030 LET W$(K)="K% TE"
1031 LET P(K)=X-2
1032 PRINT AT 0,X;"\.:\. ";AT 1,X-1;"\ .\':\'.";AT 2,X-1;"\.:\.:\.:\. ";AT 3,X-1;"\ :\ :\ :";AT 4,X;"% \: ";AT 5,X;"\ :";AT 6,X+1;"\'.";AT 7,X+1;"\.'";AT 8,X+1;"\ '"
1033 RETURN
1060 LET W$(K)="N% NE"
1061 LET P(K)=X-2
1063 PRINT AT 2,X-1;"\:'\''\: ";AT 3,X-1;"\: \: ";AT 4,X-1;"\''\''\: ";AT 5,X-1;"\. \: ";AT 6,X-1;"\''\''\' "
1064 RETURN
1100 LET W$(K)="B% AT"
1101 LET P(K)=X-2
1102 PRINT AT 1,X-2;"\..\..\..\..\. ";AT 2,X-2;"\ '\. \ '\. ";AT 3,X-1;"\.' \.'";AT 4,X-2;"\ '\''\':\''\''";AT 5,X-4;"\..\..\..\..\.:\..\..\..>";AT 6,X-4;"\':% % % % % \:'";AT 7,X-3;"\''\''\''\''\''"
1103 RETURN
1130 LET W$(K)="THR% W"
1131 LET P(K)=X-2
1132 PRINT AT 2,X+2;">";AT 3,X-2;"\ :% >\ '";AT 4,X-2;"\ '\:' \.'";AT 5,X-3;"\ .\''\:'\''";AT 6,X-3;"\' \: ";AT 7,X-2;"\.'\ '\. ";AT 8,X-3;"\ ' \ '"
1133 RETURN
1160 LET W$(K)="N% SE"
1161 LET P(K)=X-2
1162 PRINT AT 1,X-1;"\ .% \. ";AT 2,X-1;"% \:.\:.";AT 3,X-1;"% % \' ";AT 4,X-1;"\':\:'\' "
1163 FOR G=1 TO 3
1164 PRINT AT 2,1+X;"\: "
1165 LET U=USR 16514
1166 PRINT AT 2,X+1;"\:."
1167 LET U=USR 16514
1168 NEXT G
1169 RETURN
1200 LET W$(K)="% NITED"
1201 LET P(K)=X-3
1202 PRINT AT 1,X-3;"\..\..\..\..\..\. \.:";AT 2,X-4;"\ .% % % % % % \.:% ";AT 3,X-4;"\ :AMERICA\: ";AT 4,X-4;"\ '% % % % % % % \: ";AT 5,X-3;"\''\''% % % % % \: ";AT 6,X;"\':\:' \: ";AT 7,X+1;"\' "
1203 PRINT AT 11,P(K);"STATES"
1204 RETURN
1230 LET W$(K)="F% EL"
1231 LET P(K)=X-2
1232 PRINT AT 1,X-4;"\##\##\##";AT 2,X-4;"\##%G\##";AT 3,X-4;"\##%A\##";AT 4,X-4;"\##%S\##\'. \:'\''\':";AT 5,X-4;"\##\##\##\ '\..\:.\..\.:";AT 6,X-4;"\##\##\## % % % ";AT 7,X-4;"\##\##\## \: \ :"
1233 RETURN
1260 LET W$(K)="T% BE"
1261 LET P(K)=X-2
1262 PRINT AT 2,X-4;"\ .\..\..\..\..\..\..\..\. ";AT 3,X-4;"\ :\##TOOTH\##\:.";AT 4,X-4;"\ :\##PASTE\##\:'";AT 5,X-4;"\ '\''\''\''\''\''\''\''\' "
1263 RETURN
1500 LET W$(K)="FL% G"
1501 LET P(K)=X-2
1503 LET B=X-4
1504 PRINT AT 0,B;"\ .\..\..\..\..\..\..\..";AT 1,B;"\ :***\:'\''\''\':";AT 2,B;"\ :***\:'\''\''\':";AT 3,B;"\ :\''\''\''\''\''\''\':";AT 4,B;"\ :\''\''\''\''\''\''\':";AT 5,B;"\ :\''\''\''\''\''\''\''";AT 6,B;"\ :"
1505 RETURN
1530 LET W$(K)="% DD"
1531 LET P(K)=X-1
1532 PRINT AT 1,X-2;"3+2=\##";AT 3,X;"75";AT 4,X-1;"+23";AT 5,X-1;"\''\''\''"
1533 RETURN
1560 LET W$(K)="P% N"
1561 LET P(K)=X-1
1562 PRINT AT 3,X-3;"\..\..\..\..";AT 4,X-4;"\ :\' \ '\:.\..\..\..";AT 5,X-4;"\ :\:.\..\..\.:\: ";AT 6,X-4;"\ '% % % % \' "
1563 RETURN
1600 LET W$(K)="T% N"
1601 LET P(K)=X-1
1602 LET B=X-2
1603 PRINT AT 2,B;"\ : \:'\''\':";AT 3,B;"\ : \: \ :";AT 4,B;"\ : \: \ :";AT 5,B;"\ : \:.\..\.:"
1604 RETURN
1630 LET W$(K)="DR% SS"
1631 LET P(K)=X-2
1632 PRINT AT 1,X-2;"\.:\:.\.:\:.";AT 2,X-3;"\ '\:'% % \':\' ";AT 3,X-2;"\ .% % \. ";AT 4,X-3;"\ .% % % % \. ";AT 5,X-4;"\ .% % % % % % \. "
1633 RETURN
1660 LET W$(K)="L% G"
1661 LET P(K)=X-1
1662 LET B=X-1
1663 PRINT AT 0,X;"% \: ";AT 1,X;"\':\' ";AT 2,B;"% % % \: ";AT 3,B;"\: % \: \: ";AT 4,B;"\' % \: \' ";AT 5,B;"\ :% % ";AT 6,B;"\ :\: \##<";AT 7,B;"\ :\: \##<"
1664 RETURN
1700 LET W$(K)="S% X"
1701 LET P(K)=X-1
1702 LET B=X-1
1703 PRINT AT 1,X;"\..";AT 2,B;"\.' \' ";AT 3,B;"\: ";AT 4,B;"\:.\''\'.";AT 5,B;"\: \ :";AT 6,B;"\ '\..\' "
1704 RETURN
1730 LET W$(K)="SH% P"
1731 LET P(K)=X-2
1732 PRINT AT 3,X-3;"\..\:.\:.\. ";AT 4,X-5;"\ .\..% \:'% \:'% \:'% \:'";AT 5,X-4;"\':\:.% \:.% \:.% \:'";AT 6,X-5;"\@@\@@\@@\@@\@@\@@\@@\@@\@@\@@"
1733 RETURN
1760 LET W$(K)="WR% ST"
1761 LET P(K)=X-2
1762 LET B=X-1
1763 PRINT AT 0,B;"\..\..\..";AT 1,B;"\:'% \':";AT 2,B;"% \''% ";AT 3,B;"\''% \''"
1764 LET B=X-2
1765 PRINT AT 4,B;"% % % % % ";AT 5,B;"% \ :% \: % ";AT 6,B-1;">\##\ :% \: \##<";AT 7,B;"W W"
1766 RETURN
1800 LET W$(K)="P% T"
1801 LET P(K)=X-1
1802 PRINT AT 1,X-2;"\..";AT 2,X-4;"\ .\'' \''\. ";AT 3,X-4;"\:. \.:\..\..\..";AT 4,X-4;"% % \..% % ";AT 5,X-4;"\':% % % \:'";AT 6,X-3;"\ '\''\' "
1803 RETURN
1830 LET W$(K)="CL% CK"
1831 LET P(K)=X-3
1832 PRINT AT 1,X;"\..\. ";AT 2,X-2;"\ .\''\ .\ '\'.";AT 3,X-2;"\: \ : \: ";AT 4,X-3;"\ : \ :\..\. \ :";AT 5,X-3;"\ '\. \.'";AT 6,X-2;"\'. \ .\' ";AT 7,X-1;"\''\..\.'\' "
1833 RETURN
1860 LET W$(K)="ST% P"
1861 LET P(K)=X-2
1862 PRINT AT 0,X-2;"\ .% % \. ";AT 1,X-3;"\ .% % % % \. ";AT 2,X-3;"% ST P% ";AT 3,X-3;"% % % % % % ";AT 4,X-3;"\ '% % % % \' ";AT 5,X-2;"\ '% % \' ";AT 6,X-1;"\ :\: ";AT 7,X-1;"\ :\: "
1863 RETURN
1900 LET W$(K)="G% N"
1901 LET P(K)=X-1
1902 LET B=X-4
1903 PRINT AT 2,B;"\ :% % % % % -->";AT 3,B;"\ :\: \: \:'\''";AT 4,B;"\ :\:.\..\: ";AT 5,B;"\ :\: "
1904 RETURN
1930 LET W$(K)="DR% M"
1931 LET P(K)=X-2
1932 PRINT AT 0,X+2;"/";AT 1,X-1;"\.. \ ' /";AT 2,X-3;"\ .\'' \''\. \ '";AT 3,X-3;"\:. \.:";AT 4,X-3;"% % \..% % ";AT 5,X-3;"\':% % % \:'";AT 6,X-2;"\ '\''\' "
1933 RETURN
1960 LET W$(K)="B% S"
1961 LET P(K)=X-1
1962 LET B=X-3
1963 PRINT AT 2,B;"% \''\:'\':\''% % ";AT 3,B;"% \..\:.\.:\..% \ :% ";AT 4,B;"% % % % % % \.:% ";AT 5,B+1;"\' \ '"
1964 RETURN
Note: Type-in program listings on this website use ZMAKEBAS notation for graphics characters.
People
E
Skip to content
Computer Tutor
Products: Computer Tutors: Alpha/Vowel Tutors
Developer(s): Lou Goldstein
Date: 1982
Type: Cassette
Platform(s): TS 1000
Tags: Education
AlphaTutor and VowelTutor are a paired set of educational programs designed to teach children letter recognition and vowel sounds through a picture-matching quiz format. Each round randomly selects three images drawn entirely in block graphics, displays them with numbered labels, and prompts the child to identify which picture matches a highlighted letter or vowel shown in a bordered box. The programs use computed GOSUB targets (e.g., `GOSUB 200*L(K)+500` and `GOSUB 700*LS+100*L(K)+30*Z`) to dispatch to one of 26 picture-drawing subroutines covering letters A–Z and multiple vowel-sound variants. VowelTutor extends the concept with separate long and short vowel word sets per letter, selected by a random or user-chosen mode flag, and includes an animated nose-sniffing and hat/smile flip routine via `USR 16514`, pointing to a small machine-code delay loop stored in the REM statement at line 1.
Program Analysis
This listing contains two related programs: AlphaTutor and VowelTutor, both credited to Lou Goldstein / SoftSync Inc., 1982. AlphaTutor covers all 26 letters of the alphabet; VowelTutor extends the concept to long and short vowel sounds, offering multiple word variants per vowel. Both share the same core quiz loop and picture-rendering architecture.
Program Structure
Both programs follow the same top-level flow:
- Title/splash screen (lines 12–14), then
RAND to seed the RNG.
- Initialise arrays
P(3), W$(3,10), L(3) (lines 18–20).
- Main loop (lines 30–200): pick three distinct random indices, choose one as the target, dispatch to a drawing subroutine for each, display a letter/vowel prompt box, read a numeric answer, give feedback, pause, clear and repeat.
- Drawing subroutines: one per picture subject, each printing block-graphic art, setting
P(K) (label column) and W$(K) (word string).
VowelTutor adds a mode-selection screen (lines 23–27) offering long vowels, short vowels, or both, stored in LS, and allows the user to return to mode selection by entering 9.
Computed GOSUB Dispatch
The most architecturally notable feature is the use of arithmetic expressions as GOSUB targets to select picture subroutines without IF/THEN chains:
- AlphaTutor:
GOSUB 200*L(K)+500 — with L(K) in 0–25, this generates targets 500 (A=ambulance), 700 (B=boy), 900 (C=car) … 5500 (Z=zigzag), spaced 200 apart.
- VowelTutor:
GOSUB 700*LS+100*L(K)+30*Z — the LS factor (1=long, 2=short) shifts into a separate bank of subroutines; L(K) selects the vowel (1–5 = A/E/I/O/U); Z (0–2) selects one of up to three word variants per vowel per length.
This is a compact and efficient dispatch mechanism that avoids long IF/THEN chains entirely, at the cost of requiring subroutines to be placed at exactly the computed line numbers.
Machine Code Usage
Line 1 in both programs is a REM statement whose body encodes a short Z80 machine-code routine. The sequence \06\01\C5\06\64\00\10\FD\C1\10\F7\C9 disassembles as:
LD B,1 — outer loop count
PUSH BC
LD B,100 ; LD C,0 — inner delay count (25600 iterations)
DJNZ $ — inner loop
POP BC ; DJNZ … — outer loop
RET
This routine is called via LET E=USR 16514 (the address of the REM body in the VowelTutor variant is slightly longer, hence a different offset in practice). It is used as a simple software delay in animation sequences — for example, the hat flip in AlphaTutor (lines 1901–1906), the smile animation (lines 4101–4106), and the nose-sniffing effect (lines 1163–1168 in VowelTutor).
Key BASIC Idioms
- Block graphic art: All pictures are rendered using the ZX81/TS1000 block graphic characters (2×2 pixel sub-characters), encoded here as zmakebas escape sequences such as
\ ., \:., \'', etc.
- Distinct random selection: Lines 60 check
L(1)=L(2) OR L(1)=L(3) OR L(2)=L(3) and loop back if any two indices collide, ensuring three distinct pictures appear each round.
- Column positioning via formula:
LET X=10*K-5 (line 110) distributes the three picture columns evenly across the 32-character screen (columns 5, 15, 25).
- Answer box: The target letter is displayed in a bordered box drawn with block graphics at lines 19–21 using
AT positioning.
- PLOT for QUEEN and CONE: The subroutines at lines 3700 and 830 use
PLOT with pixel coordinates to draw vertical lines, since the block graphic resolution is insufficient for narrow strokes.
VowelTutor Word-Embedding Technique
In VowelTutor, word labels use a space character as a placeholder for the missing vowel (e.g., "TR% IN" for TRAIN, "K% TE" for KITE). After the round is set up, lines 151–155 scan W$(C) character-by-character to find the first "% " (space) position, then replace it with the actual vowel character A$ — effectively filling in the blank dynamically. This lets the same word string serve as both a gapped display and, after substitution, the correct spelled form.
Notable Subroutine Sharing
AlphaTutor’s GIRL subroutine (line 1700) is shared with BOY (line 700): the BOY subroutine calls GOSUB 1700 to draw the upper body, then the shared routine checks IF L(K)=1 THEN RETURN (line 1710) to exit early for BOY, or continues to draw the skirt/legs for GIRL. Similarly, VowelTutor’s WOMAN subroutine (line 4900) reuses the MAN subroutine (line 2900) for the head and torso, then overprints with different lower-body graphics.
Array Sizing
Array Dimensions Purpose P(3)3 elements Column position for each picture’s word label W$(3,10)3 strings × 10 chars Word associated with each picture slot L(3) / L(5)3 (Alpha) / 5 (Vowel) Random index for picture selection
Potential Anomalies
- AlphaTutor has no subroutine at the computed target for letter index 0 (line 500 handles A=0, as
200*0+500=500) — this is correct; L(K)=INT(RND*26) yields 0–25, mapping to lines 500–5500.
- VowelTutor’s
GOSUB 700*LS+100*L(K)+30*Z for LS=2 (short vowels) can yield targets like 1400+30*Z (lines 1400, 1430, 1460) which are not all defined in the listing — some short-vowel variant slots appear absent, which would cause a BASIC error if selected. This may reflect incomplete subroutine coverage in the original listing.
- The
PAUSE 33000 at line 14 provides a long title-screen pause (~30 seconds at normal speed) but any key press does not skip it — the user must wait it out unless they press BREAK.
- In VowelTutor, the
\## sequences in several subroutines (e.g., lines 1232, 1262, 1532) are not standard zmakebas escape sequences and likely represent inverse-video block characters or UDGs in the original tape file that were not fully decoded in this transcription.
Content
Source Code
1 REM \06\01\C5\06\64\00\10\FD\C1\10\F7\C9\2E\2E\2E\2E\2E\2E
2 SAVE "AB%C"
12 PRINT AT 8,11;"ALPHATUTOR";AT 10,2;"COPYRIGHT 1982 LOU GOLDSTEIN";AT 12,6;"% %F%R%O%M% %S%O%F%T%S%Y%N%C% %I%N%C% "
13 PRINT AT 20,5;"PRESS ""ENTER"" TO START"
14 PAUSE 33000
15 RAND
17 CLS
18 DIM P(3)
19 DIM W$(3,10)
20 DIM L(3)
30 FOR K=1 TO 3
40 LET L(K)=INT (RND*26)
50 NEXT K
60 IF L(1)=L(2) OR L(1)=L(3) OR L(2)=L(3) THEN GOTO 30
80 LET C=INT (RND*3)+1
90 LET A$=CHR$ (L(C)+38)
100 FOR K=1 TO 3
110 LET X=10*K-5
120 GOSUB 200*L(K)+500
121 PRINT AT 10,P(K);"% ";W$(K,2 TO )
130 PRINT AT 15,X;K
140 NEXT K
150 PRINT AT 19,14;"\:'\''\':";AT 20,14;"\: ";A$;"\ :";AT 21,14;"\:.\..\.:"
160 INPUT R
170 IF R<>C THEN PRINT AT 16,10*C-9;"% % % % % % % % % "
180 IF R=C THEN PRINT AT 16,10*C-9;"*********"
185 PRINT AT 13,P(C);W$(C)
190 PAUSE 250
195 CLS
200 GOTO 30
500 PRINT AT 3,X-3;"\..\..\..\..";AT 4,X-3;"\: \ . \ :";AT 5,X-3;"\: \':\' \ '\''\':";AT 6,X-3;"\:.\..\..\..\..\.:";AT 7,X-3;"\' \' "
501 LET P(K)=X-4
502 LET W$(K)="AMBULANCE"
510 RETURN
700 GOSUB 1700
710 PRINT AT 4,X;"\ :";AT 5,X;"\.'\. ";AT 6,X-1;"\.' \ '\. ";AT 7,X-2;"\.' \ '\. "
711 LET P(K)=X-1
712 LET W$(K)="BOY"
720 RETURN
900 PRINT AT 5,X-3;"\ :% % % ";AT 6,X-3;"\ :% % % % % ";AT 7,X-2;"\' \ '"
901 LET P(K)=X-1
902 LET W$(K)="CAR"
910 RETURN
1100 PRINT AT 1,X-4;"\ . \:.\. ";AT 2,X-3;"\'. % \. ";AT 3,X-2;"% % % ";AT 4,X-2;"\:'\''\':";AT 5,X-2;"\: \ :"
1101 LET P(K)=X-1
1102 LET W$(K)="DOG"
1110 RETURN
1300 PRINT AT 1,X-4;"\ .% % % \..";AT 2,X-4;"% % % % \.:";AT 3,X-4;"\':% % \:'\ '\..\' ";AT 4,X-4;"\ : \: "
1301 LET P(K)=X-4
1302 LET W$(K)="ELEPHANT"
1310 RETURN
1500 PRINT AT 1,X-4;"\ . \ .\..";AT 2,X-4;"\ :\:.\.:% % \':\. ";AT 3,X-4;"\ :% % % % % \. ";AT 4,X-4;"\ :\' \ '\':\:'\' "
1501 LET P(K)=X-2
1502 LET W$(K)="FISH"
1510 RETURN
1700 PRINT AT 0,X;"% \: ";AT 1,X;"\':\' ";AT 2,X-1;"\ .\':\'.";AT 3,X-1;"\' \ : \' "
1710 IF L(K)=1 THEN RETURN
1720 PRINT AT 4,X;"\.:\. ";AT 5,X-1;"\.:% % \. ";AT 6,X-2;"\ '\:'\''\''\:'";AT 7,X-1;"\: \: "
1721 LET P(K)=X-2
1722 LET W$(K)="GIRL"
1730 RETURN
1900 PRINT AT 1,X-2;">\ .\..\..\. <";AT 2,X-1;"\.:% % \:.";AT 3,X-1;"\ :..\: ";AT 4,X-1;"\ : \: ";AT 5,X-1;"\ :\ '\' \: ";AT 6,X;"\''\''"
1901 FOR F=1 TO 2
1902 PRINT AT 1,X-1;" ";AT 2,X-1;"\ .\..\..\. "
1903 LET E=USR 16514
1904 PRINT AT 1,X-1;"\ .\..\..\. ";AT 2,X-1;"\.:% % \:."
1905 LET E=USR 16514
1906 NEXT F
1907 LET P(K)=X-1
1908 LET W$(K)="HAT"
1910 RETURN
2100 PRINT AT 1,X-1;"\ :";AT 2,X-1;"\ :";AT 3,X-2;"\ .\''\''\''\. ";AT 4,X-2;"\ :\~~\~~\~~\: ";AT 5,X-2;"\ :\ ' \' \: ";AT 6,X-2;"\ :\ .\..\. \: ";AT 7,X-2;"\ '\..\..\..\' "
2101 LET P(K)=X-3
2102 LET W$(K)="INDIAN"
2110 RETURN
2300 PRINT AT 1,X-3;"---\:.";AT 2,X-3;"\':\..\..\.:\:.\..";AT 3,X-3;"\ :\..\..\..\..\..% >";AT 4,X-3;"---\ .\:'";AT 5,X-3;"---\:'"
2301 LET P(K)=X-1
2302 LET W$(K)="JET"
2310 RETURN
2500 LET P(K)=X-2
2522 LET W$(K)="KING"
2523 PRINT AT 1,X-2;"\. \. \. \. \. ";AT 2,X-2;"\':\''\''\':\' ";AT 3,X-2;"\ :\ '\ '\ :";AT 4,X-2;"\ : \' \ :";AT 5,X-2;"\ :\ '\''\ :";AT 6,X-1;"\':% \' "
2530 RETURN
2700 PRINT AT 2,X-3;"A B C D";AT 3,X-2;"E F G"
2701 LET P(K)=X-4
2702 LET W$(K)="LETTERS"
2710 RETURN
2900 PRINT AT 1,X;"% \: ";AT 2,X;"\':\' ";AT 3,X-1;"% % % \: ";AT 4,X-1;"\: % \: \: ";AT 5,X-1;"\' % \: \' "
2910 IF L(K)=22 THEN RETURN
2920 PRINT AT 6,X-1;"\ :% % ";AT 7,X-1;"\ :\: % ";AT 8,X-1;"\ :\: % "
2921 LET P(K)=X-1
2922 LET W$(K)="MAN"
2930 RETURN
3100 PRINT AT 3,X-3;"1 2 3 4";AT 4,X-2;"5 6 7"
3101 LET P(K)=X-3
3102 LET W$(K)="NUMBERS"
3110 RETURN
3300 PRINT AT 1,X-4;"\. ";AT 2,X-4;"\ '\'. \.:\. \..\. ";AT 3,X-2;"\':% % \''";AT 4,X-4;"\ .\.'\':% % \.. \.'";AT 5,X-4;"\' \ .\.'\.'\.'\. \''";AT 6,X-4;"\ .\' \ .\' \'.\ '\'.";AT 7,X-4;"\' \ .\' \ '\. "
3301 LET P(K)=X-3
3302 LET W$(K)="OCTOPUS"
3310 RETURN
3500 PRINT AT 5,X-2;"\..\..\..\..% ";AT 4,X+2;"*";AT 3,X+2;"*"
3501 LET P(K)=X-1
3502 LET W$(K)="PIPE"
3510 RETURN
3700 GOSUB 2500
3710 FOR Y=38 TO 29 STEP -1
3720 PLOT 2*X-4,Y
3730 PLOT 2*X+4,Y
3740 NEXT Y
3751 LET P(K)=X-2
3752 LET W$(K)="QUEEN"
3760 RETURN
3900 PRINT AT 1,X;"A";AT 2,X;"% ";AT 3,X;"% ";AT 4,X;"% ";AT 5,X;"% ";AT 6,X-1;"\..% \..";AT 7,X-1;"\' *\ '";AT 8,X;"*"
3901 LET P(K)=X-3
3902 LET W$(K)="ROCKET"
3910 RETURN
4100 PRINT AT 1,X-1;"\..\..\..";AT 2,X-2;"\ :\ . \. \: ";AT 3,X-2;"\ : \: ";AT 4,X-3;">\ :\ . \. \: <";AT 5,X-2;"\ : \'' \: ";AT 6,X-1;"\''\''\''"
4101 FOR F=1 TO 2
4102 PRINT AT 4,X-1;" ";AT 5,X-1;"\ '\''\' "
4103 LET E=USR 16514
4104 PRINT AT 4,X-1;"\ . \. ";AT 5,X-1;" \'' "
4105 LET E=USR 16514
4106 NEXT F
4107 LET P(K)=X-2
4108 LET W$(K)="SMILE"
4110 RETURN
4300 PRINT AT 1,X-1;"\ .% \. ";AT 2,X-2;"\ .% % % \. ";AT 3,X-2;"% % % % % ";AT 4,X-2;"\ '% % % \' ";AT 5,X-1;"\ '% \' ";AT 6,X;"% ";AT 7,X-1;"\ .% \. "
4301 LET P(K)=X-2
4302 LET W$(K)="TREE"
4310 RETURN
4500 PRINT AT 1,X;"\.:\. ";AT 2,X-1;"\.'\ :\ '\. ";AT 3,X;"\ :";AT 4,X;"\ :"
4501 LET P(K)=X-1
4502 LET W$(K)="UP"
4510 RETURN
4700 PRINT AT 2,X-2;"\ .\. \..";AT 3,X-2;"% % \. \.:% \: ";AT 4,X-2;"\':% % % % \' ";AT 5,X-1;"\':% % \' ";AT 6,X;"\':\' "
4701 LET P(K)=X-4
4702 LET W$(K)="VALENTINE"
4710 RETURN
4900 GOSUB 2900
4910 PRINT AT 6,X-1;"\.:% % \. ";AT 7,X-2;"\.:% % % % \. ";AT 8,X-1;"\ :\: % "
4911 LET P(K)=X-2
4912 LET W$(K)="WOMAN"
4920 RETURN
5100 PRINT AT 1,X-3;"\: \: \: \: \: \: \: ";AT 2,X-3;"\: \: \: \: \: \' ";AT 3,X-3;"\: \: \: \' \. ";AT 4,X-3;"\: \' \. /";AT 5,X-1;"/"
5101 LET P(K)=X-4
5102 LET W$(K)="XYLOPHONE"
5110 RETURN
5300 PRINT AT 1,X-1;"\ .% \. ";AT 2,X-1;"% % \':";AT 3,X-1;"% % % \. <";AT 4,X-1;"% % \''<";AT 5,X-1;"% % \.. <";AT 6,X-1;"\ :% "
5301 LET P(K)=X-1
5302 LET W$(K)="YELL"
5310 RETURN
5500 PRINT AT 3,X-2;"\.'\. \.'";AT 4,X-3;"\ ' \ '\. \.'\.'";AT 5,X;"\ '"
5501 LET P(K)=X-3
5502 LET W$(K)="ZIGZAG"
5510 RETURN
1 REM \06\01\C5\06\64\00\10\FD\C1\10\F7\C9\2E\2E\2E\2E\2E\2E\2E\2E\2E\2E\2E
2 SAVE "VOWE%L"
12 PRINT AT 8,11;"VOWELTUTOR";AT 10,2;"COPYRIGHT 1982 LOU GOLDSTEIN";AT 12,7;"% %F%R%O%M% %S%O%F%T%S%Y%N%C% %I%N%C% "
13 PRINT AT 20,5;"PRESS ""ENTER"" TO START"
14 PAUSE 33000
15 RAND
16 LET V$="AEIOU"
17 CLS
18 DIM P(3)
19 DIM W$(3,10)
20 DIM L(5)
23 PRINT AT 6,0;"WHICH VOWELS DO YOU WANT TO USE?1=LONG",,"2=SHORT",,"3=BOTH",,"4=EXIT PROGRAM"
24 INPUT O
25 LET LS=O
26 CLS
27 IF O=4 THEN STOP
30 IF O=3 THEN LET LS=INT (RND*2)+1
31 FOR K=1 TO 3
32 FAST
40 LET L(K)=INT (RND*5)+1
50 NEXT K
60 IF L(1)=L(2) OR L(1)=L(3) OR L(2)=L(3) THEN GOTO 31
80 LET C=INT (RND*3)+1
90 LET A$=V$(L(C))
99 SLOW
100 FOR K=1 TO 3
105 LET Z=INT (RND*3)
110 LET X=10*K-5
120 GOSUB 700*LS+100*L(K)+30*Z
121 PRINT AT 10,P(K);W$(K)
130 PRINT AT 15,X;K
140 NEXT K
150 PRINT AT 19,14;"\:'\''\':";AT 20,14;"\: ";A$;"\ :";AT 21,14;"\:.\..\.:"
151 FOR J=1 TO 10
152 IF W$(C,J)="% " THEN GOTO 155
153 NEXT J
155 LET W$(C,J)=A$
156 INPUT R
157 IF R=9 THEN CLS
160 IF R=9 THEN GOTO 23
170 IF R<>C THEN PRINT AT 16,10*C-9;"% % % % % % % % % "
180 IF R=C THEN PRINT AT 16,10*C-9;"*********"
185 PRINT AT 13,P(C);W$(C)
190 PAUSE 250
195 CLS
200 GOTO 30
800 LET W$(K)="TR% IN"
801 LET P(K)=X-2
802 PRINT AT 2,X-1;"*";AT 3,X;"*";AT 4,X;"\ :\..\. ";AT 5,X-4;"\ :% \.:% \.:% % >";AT 6,X-4;"\ '\ '\ '\ '\ ' \ '"
803 RETURN
830 LET W$(K)="C% NE"
831 LET P(K)=X-1
832 PRINT AT 1,X+1;"\' ";AT 0,X-1;"\ .\''\. "
833 FOR Y=41 TO 30 STEP -1
834 PLOT 2*X-1,Y
835 NEXT Y
836 RETURN
860 LET W$(K)="D% YS"
861 LET P(K)=X-2
862 PRINT AT 2,X-1;"FRI.";AT 4,X-1;"SAT.";AT 6,X-1;"SUN."
863 RETURN
900 LET W$(K)="K% Y"
901 LET P(K)=X-1
902 PRINT AT 3,X-3;"% % ";AT 4,X-3;"% % \:'\''\':% % \' ";AT 5,X-3;"% % \ '\ :\ '"
903 RETURN
930 LET W$(K)="THR% E"
931 LET P(K)=X-2
932 PRINT AT 3,X-1;"\''\''\: ";AT 4,X+1;"\: ";AT 5,X-1;"\ '\''\: ";AT 6,X+1;"\: ";AT 7,X-1;"\''\''\' "
933 RETURN
960 LET W$(K)="KN% E"
961 LET P(K)=X-2
962 PRINT AT 0,X+1;"% \: ";AT 1,X+1;"\':\' ";AT 2,X+1;"\: ";AT 3,X;"\ :\ '\..\. ";AT 4,X;"\: ";AT 5,X-1;"\ :\ '\. ";AT 6,X-1;"\ : \ '\. <";AT 7,X-2;"\ .\' \: ";AT 8,X-2;"\'. \''"
968 RETURN
1000 LET W$(K)="F% VE"
1001 LET P(K)=X-2
1002 PRINT AT 2,X-1;"\:'\''\' ";AT 3,X-1;"\:.\. ";AT 4,X;"\ '\. ";AT 5,X-1;"\. \ .\' ";AT 6,X-1;"\ '\' "
1003 RETURN
1030 LET W$(K)="K% TE"
1031 LET P(K)=X-2
1032 PRINT AT 0,X;"\.:\. ";AT 1,X-1;"\ .\':\'.";AT 2,X-1;"\.:\.:\.:\. ";AT 3,X-1;"\ :\ :\ :";AT 4,X;"% \: ";AT 5,X;"\ :";AT 6,X+1;"\'.";AT 7,X+1;"\.'";AT 8,X+1;"\ '"
1033 RETURN
1060 LET W$(K)="N% NE"
1061 LET P(K)=X-2
1063 PRINT AT 2,X-1;"\:'\''\: ";AT 3,X-1;"\: \: ";AT 4,X-1;"\''\''\: ";AT 5,X-1;"\. \: ";AT 6,X-1;"\''\''\' "
1064 RETURN
1100 LET W$(K)="B% AT"
1101 LET P(K)=X-2
1102 PRINT AT 1,X-2;"\..\..\..\..\. ";AT 2,X-2;"\ '\. \ '\. ";AT 3,X-1;"\.' \.'";AT 4,X-2;"\ '\''\':\''\''";AT 5,X-4;"\..\..\..\..\.:\..\..\..>";AT 6,X-4;"\':% % % % % \:'";AT 7,X-3;"\''\''\''\''\''"
1103 RETURN
1130 LET W$(K)="THR% W"
1131 LET P(K)=X-2
1132 PRINT AT 2,X+2;">";AT 3,X-2;"\ :% >\ '";AT 4,X-2;"\ '\:' \.'";AT 5,X-3;"\ .\''\:'\''";AT 6,X-3;"\' \: ";AT 7,X-2;"\.'\ '\. ";AT 8,X-3;"\ ' \ '"
1133 RETURN
1160 LET W$(K)="N% SE"
1161 LET P(K)=X-2
1162 PRINT AT 1,X-1;"\ .% \. ";AT 2,X-1;"% \:.\:.";AT 3,X-1;"% % \' ";AT 4,X-1;"\':\:'\' "
1163 FOR G=1 TO 3
1164 PRINT AT 2,1+X;"\: "
1165 LET U=USR 16514
1166 PRINT AT 2,X+1;"\:."
1167 LET U=USR 16514
1168 NEXT G
1169 RETURN
1200 LET W$(K)="% NITED"
1201 LET P(K)=X-3
1202 PRINT AT 1,X-3;"\..\..\..\..\..\. \.:";AT 2,X-4;"\ .% % % % % % \.:% ";AT 3,X-4;"\ :AMERICA\: ";AT 4,X-4;"\ '% % % % % % % \: ";AT 5,X-3;"\''\''% % % % % \: ";AT 6,X;"\':\:' \: ";AT 7,X+1;"\' "
1203 PRINT AT 11,P(K);"STATES"
1204 RETURN
1230 LET W$(K)="F% EL"
1231 LET P(K)=X-2
1232 PRINT AT 1,X-4;"\##\##\##";AT 2,X-4;"\##%G\##";AT 3,X-4;"\##%A\##";AT 4,X-4;"\##%S\##\'. \:'\''\':";AT 5,X-4;"\##\##\##\ '\..\:.\..\.:";AT 6,X-4;"\##\##\## % % % ";AT 7,X-4;"\##\##\## \: \ :"
1233 RETURN
1260 LET W$(K)="T% BE"
1261 LET P(K)=X-2
1262 PRINT AT 2,X-4;"\ .\..\..\..\..\..\..\..\. ";AT 3,X-4;"\ :\##TOOTH\##\:.";AT 4,X-4;"\ :\##PASTE\##\:'";AT 5,X-4;"\ '\''\''\''\''\''\''\''\' "
1263 RETURN
1500 LET W$(K)="FL% G"
1501 LET P(K)=X-2
1503 LET B=X-4
1504 PRINT AT 0,B;"\ .\..\..\..\..\..\..\..";AT 1,B;"\ :***\:'\''\''\':";AT 2,B;"\ :***\:'\''\''\':";AT 3,B;"\ :\''\''\''\''\''\''\':";AT 4,B;"\ :\''\''\''\''\''\''\':";AT 5,B;"\ :\''\''\''\''\''\''\''";AT 6,B;"\ :"
1505 RETURN
1530 LET W$(K)="% DD"
1531 LET P(K)=X-1
1532 PRINT AT 1,X-2;"3+2=\##";AT 3,X;"75";AT 4,X-1;"+23";AT 5,X-1;"\''\''\''"
1533 RETURN
1560 LET W$(K)="P% N"
1561 LET P(K)=X-1
1562 PRINT AT 3,X-3;"\..\..\..\..";AT 4,X-4;"\ :\' \ '\:.\..\..\..";AT 5,X-4;"\ :\:.\..\..\.:\: ";AT 6,X-4;"\ '% % % % \' "
1563 RETURN
1600 LET W$(K)="T% N"
1601 LET P(K)=X-1
1602 LET B=X-2
1603 PRINT AT 2,B;"\ : \:'\''\':";AT 3,B;"\ : \: \ :";AT 4,B;"\ : \: \ :";AT 5,B;"\ : \:.\..\.:"
1604 RETURN
1630 LET W$(K)="DR% SS"
1631 LET P(K)=X-2
1632 PRINT AT 1,X-2;"\.:\:.\.:\:.";AT 2,X-3;"\ '\:'% % \':\' ";AT 3,X-2;"\ .% % \. ";AT 4,X-3;"\ .% % % % \. ";AT 5,X-4;"\ .% % % % % % \. "
1633 RETURN
1660 LET W$(K)="L% G"
1661 LET P(K)=X-1
1662 LET B=X-1
1663 PRINT AT 0,X;"% \: ";AT 1,X;"\':\' ";AT 2,B;"% % % \: ";AT 3,B;"\: % \: \: ";AT 4,B;"\' % \: \' ";AT 5,B;"\ :% % ";AT 6,B;"\ :\: \##<";AT 7,B;"\ :\: \##<"
1664 RETURN
1700 LET W$(K)="S% X"
1701 LET P(K)=X-1
1702 LET B=X-1
1703 PRINT AT 1,X;"\..";AT 2,B;"\.' \' ";AT 3,B;"\: ";AT 4,B;"\:.\''\'.";AT 5,B;"\: \ :";AT 6,B;"\ '\..\' "
1704 RETURN
1730 LET W$(K)="SH% P"
1731 LET P(K)=X-2
1732 PRINT AT 3,X-3;"\..\:.\:.\. ";AT 4,X-5;"\ .\..% \:'% \:'% \:'% \:'";AT 5,X-4;"\':\:.% \:.% \:.% \:'";AT 6,X-5;"\@@\@@\@@\@@\@@\@@\@@\@@\@@\@@"
1733 RETURN
1760 LET W$(K)="WR% ST"
1761 LET P(K)=X-2
1762 LET B=X-1
1763 PRINT AT 0,B;"\..\..\..";AT 1,B;"\:'% \':";AT 2,B;"% \''% ";AT 3,B;"\''% \''"
1764 LET B=X-2
1765 PRINT AT 4,B;"% % % % % ";AT 5,B;"% \ :% \: % ";AT 6,B-1;">\##\ :% \: \##<";AT 7,B;"W W"
1766 RETURN
1800 LET W$(K)="P% T"
1801 LET P(K)=X-1
1802 PRINT AT 1,X-2;"\..";AT 2,X-4;"\ .\'' \''\. ";AT 3,X-4;"\:. \.:\..\..\..";AT 4,X-4;"% % \..% % ";AT 5,X-4;"\':% % % \:'";AT 6,X-3;"\ '\''\' "
1803 RETURN
1830 LET W$(K)="CL% CK"
1831 LET P(K)=X-3
1832 PRINT AT 1,X;"\..\. ";AT 2,X-2;"\ .\''\ .\ '\'.";AT 3,X-2;"\: \ : \: ";AT 4,X-3;"\ : \ :\..\. \ :";AT 5,X-3;"\ '\. \.'";AT 6,X-2;"\'. \ .\' ";AT 7,X-1;"\''\..\.'\' "
1833 RETURN
1860 LET W$(K)="ST% P"
1861 LET P(K)=X-2
1862 PRINT AT 0,X-2;"\ .% % \. ";AT 1,X-3;"\ .% % % % \. ";AT 2,X-3;"% ST P% ";AT 3,X-3;"% % % % % % ";AT 4,X-3;"\ '% % % % \' ";AT 5,X-2;"\ '% % \' ";AT 6,X-1;"\ :\: ";AT 7,X-1;"\ :\: "
1863 RETURN
1900 LET W$(K)="G% N"
1901 LET P(K)=X-1
1902 LET B=X-4
1903 PRINT AT 2,B;"\ :% % % % % -->";AT 3,B;"\ :\: \: \:'\''";AT 4,B;"\ :\:.\..\: ";AT 5,B;"\ :\: "
1904 RETURN
1930 LET W$(K)="DR% M"
1931 LET P(K)=X-2
1932 PRINT AT 0,X+2;"/";AT 1,X-1;"\.. \ ' /";AT 2,X-3;"\ .\'' \''\. \ '";AT 3,X-3;"\:. \.:";AT 4,X-3;"% % \..% % ";AT 5,X-3;"\':% % % \:'";AT 6,X-2;"\ '\''\' "
1933 RETURN
1960 LET W$(K)="B% S"
1961 LET P(K)=X-1
1962 LET B=X-3
1963 PRINT AT 2,B;"% \''\:'\':\''% % ";AT 3,B;"% \..\:.\.:\..% \ :% ";AT 4,B;"% % % % % % \.:% ";AT 5,B+1;"\' \ '"
1964 RETURN
Note: Type-in program listings on this website use ZMAKEBAS notation for graphics characters.
People
E
Skip to content
Computer Tutor
Products: Computer Tutors: Alpha/Vowel Tutors
Developer(s): Lou Goldstein
Date: 1982
Type: Cassette
Platform(s): TS 1000
Tags: Education
AlphaTutor and VowelTutor are a paired set of educational programs designed to teach children letter recognition and vowel sounds through a picture-matching quiz format. Each round randomly selects three images drawn entirely in block graphics, displays them with numbered labels, and prompts the child to identify which picture matches a highlighted letter or vowel shown in a bordered box. The programs use computed GOSUB targets (e.g., `GOSUB 200*L(K)+500` and `GOSUB 700*LS+100*L(K)+30*Z`) to dispatch to one of 26 picture-drawing subroutines covering letters A–Z and multiple vowel-sound variants. VowelTutor extends the concept with separate long and short vowel word sets per letter, selected by a random or user-chosen mode flag, and includes an animated nose-sniffing and hat/smile flip routine via `USR 16514`, pointing to a small machine-code delay loop stored in the REM statement at line 1.
Program Analysis
This listing contains two related programs: AlphaTutor and VowelTutor, both credited to Lou Goldstein / SoftSync Inc., 1982. AlphaTutor covers all 26 letters of the alphabet; VowelTutor extends the concept to long and short vowel sounds, offering multiple word variants per vowel. Both share the same core quiz loop and picture-rendering architecture.
Program Structure
Both programs follow the same top-level flow:
- Title/splash screen (lines 12–14), then
RAND to seed the RNG.
- Initialise arrays
P(3), W$(3,10), L(3) (lines 18–20).
- Main loop (lines 30–200): pick three distinct random indices, choose one as the target, dispatch to a drawing subroutine for each, display a letter/vowel prompt box, read a numeric answer, give feedback, pause, clear and repeat.
- Drawing subroutines: one per picture subject, each printing block-graphic art, setting
P(K) (label column) and W$(K) (word string).
VowelTutor adds a mode-selection screen (lines 23–27) offering long vowels, short vowels, or both, stored in LS, and allows the user to return to mode selection by entering 9.
Computed GOSUB Dispatch
The most architecturally notable feature is the use of arithmetic expressions as GOSUB targets to select picture subroutines without IF/THEN chains:
- AlphaTutor:
GOSUB 200*L(K)+500 — with L(K) in 0–25, this generates targets 500 (A=ambulance), 700 (B=boy), 900 (C=car) … 5500 (Z=zigzag), spaced 200 apart.
- VowelTutor:
GOSUB 700*LS+100*L(K)+30*Z — the LS factor (1=long, 2=short) shifts into a separate bank of subroutines; L(K) selects the vowel (1–5 = A/E/I/O/U); Z (0–2) selects one of up to three word variants per vowel per length.
This is a compact and efficient dispatch mechanism that avoids long IF/THEN chains entirely, at the cost of requiring subroutines to be placed at exactly the computed line numbers.
Machine Code Usage
Line 1 in both programs is a REM statement whose body encodes a short Z80 machine-code routine. The sequence \06\01\C5\06\64\00\10\FD\C1\10\F7\C9 disassembles as:
LD B,1 — outer loop count
PUSH BC
LD B,100 ; LD C,0 — inner delay count (25600 iterations)
DJNZ $ — inner loop
POP BC ; DJNZ … — outer loop
RET
This routine is called via LET E=USR 16514 (the address of the REM body in the VowelTutor variant is slightly longer, hence a different offset in practice). It is used as a simple software delay in animation sequences — for example, the hat flip in AlphaTutor (lines 1901–1906), the smile animation (lines 4101–4106), and the nose-sniffing effect (lines 1163–1168 in VowelTutor).
Key BASIC Idioms
- Block graphic art: All pictures are rendered using the ZX81/TS1000 block graphic characters (2×2 pixel sub-characters), encoded here as zmakebas escape sequences such as
\ ., \:., \'', etc.
- Distinct random selection: Lines 60 check
L(1)=L(2) OR L(1)=L(3) OR L(2)=L(3) and loop back if any two indices collide, ensuring three distinct pictures appear each round.
- Column positioning via formula:
LET X=10*K-5 (line 110) distributes the three picture columns evenly across the 32-character screen (columns 5, 15, 25).
- Answer box: The target letter is displayed in a bordered box drawn with block graphics at lines 19–21 using
AT positioning.
- PLOT for QUEEN and CONE: The subroutines at lines 3700 and 830 use
PLOT with pixel coordinates to draw vertical lines, since the block graphic resolution is insufficient for narrow strokes.
VowelTutor Word-Embedding Technique
In VowelTutor, word labels use a space character as a placeholder for the missing vowel (e.g., "TR% IN" for TRAIN, "K% TE" for KITE). After the round is set up, lines 151–155 scan W$(C) character-by-character to find the first "% " (space) position, then replace it with the actual vowel character A$ — effectively filling in the blank dynamically. This lets the same word string serve as both a gapped display and, after substitution, the correct spelled form.
Notable Subroutine Sharing
AlphaTutor’s GIRL subroutine (line 1700) is shared with BOY (line 700): the BOY subroutine calls GOSUB 1700 to draw the upper body, then the shared routine checks IF L(K)=1 THEN RETURN (line 1710) to exit early for BOY, or continues to draw the skirt/legs for GIRL. Similarly, VowelTutor’s WOMAN subroutine (line 4900) reuses the MAN subroutine (line 2900) for the head and torso, then overprints with different lower-body graphics.
Array Sizing
Array Dimensions Purpose P(3)3 elements Column position for each picture’s word label W$(3,10)3 strings × 10 chars Word associated with each picture slot L(3) / L(5)3 (Alpha) / 5 (Vowel) Random index for picture selection
Potential Anomalies
- AlphaTutor has no subroutine at the computed target for letter index 0 (line 500 handles A=0, as
200*0+500=500) — this is correct; L(K)=INT(RND*26) yields 0–25, mapping to lines 500–5500.
- VowelTutor’s
GOSUB 700*LS+100*L(K)+30*Z for LS=2 (short vowels) can yield targets like 1400+30*Z (lines 1400, 1430, 1460) which are not all defined in the listing — some short-vowel variant slots appear absent, which would cause a BASIC error if selected. This may reflect incomplete subroutine coverage in the original listing.
- The
PAUSE 33000 at line 14 provides a long title-screen pause (~30 seconds at normal speed) but any key press does not skip it — the user must wait it out unless they press BREAK.
- In VowelTutor, the
\## sequences in several subroutines (e.g., lines 1232, 1262, 1532) are not standard zmakebas escape sequences and likely represent inverse-video block characters or UDGs in the original tape file that were not fully decoded in this transcription.
Content
Source Code
1 REM \06\01\C5\06\64\00\10\FD\C1\10\F7\C9\2E\2E\2E\2E\2E\2E
2 SAVE "AB%C"
12 PRINT AT 8,11;"ALPHATUTOR";AT 10,2;"COPYRIGHT 1982 LOU GOLDSTEIN";AT 12,6;"% %F%R%O%M% %S%O%F%T%S%Y%N%C% %I%N%C% "
13 PRINT AT 20,5;"PRESS ""ENTER"" TO START"
14 PAUSE 33000
15 RAND
17 CLS
18 DIM P(3)
19 DIM W$(3,10)
20 DIM L(3)
30 FOR K=1 TO 3
40 LET L(K)=INT (RND*26)
50 NEXT K
60 IF L(1)=L(2) OR L(1)=L(3) OR L(2)=L(3) THEN GOTO 30
80 LET C=INT (RND*3)+1
90 LET A$=CHR$ (L(C)+38)
100 FOR K=1 TO 3
110 LET X=10*K-5
120 GOSUB 200*L(K)+500
121 PRINT AT 10,P(K);"% ";W$(K,2 TO )
130 PRINT AT 15,X;K
140 NEXT K
150 PRINT AT 19,14;"\:'\''\':";AT 20,14;"\: ";A$;"\ :";AT 21,14;"\:.\..\.:"
160 INPUT R
170 IF R<>C THEN PRINT AT 16,10*C-9;"% % % % % % % % % "
180 IF R=C THEN PRINT AT 16,10*C-9;"*********"
185 PRINT AT 13,P(C);W$(C)
190 PAUSE 250
195 CLS
200 GOTO 30
500 PRINT AT 3,X-3;"\..\..\..\..";AT 4,X-3;"\: \ . \ :";AT 5,X-3;"\: \':\' \ '\''\':";AT 6,X-3;"\:.\..\..\..\..\.:";AT 7,X-3;"\' \' "
501 LET P(K)=X-4
502 LET W$(K)="AMBULANCE"
510 RETURN
700 GOSUB 1700
710 PRINT AT 4,X;"\ :";AT 5,X;"\.'\. ";AT 6,X-1;"\.' \ '\. ";AT 7,X-2;"\.' \ '\. "
711 LET P(K)=X-1
712 LET W$(K)="BOY"
720 RETURN
900 PRINT AT 5,X-3;"\ :% % % ";AT 6,X-3;"\ :% % % % % ";AT 7,X-2;"\' \ '"
901 LET P(K)=X-1
902 LET W$(K)="CAR"
910 RETURN
1100 PRINT AT 1,X-4;"\ . \:.\. ";AT 2,X-3;"\'. % \. ";AT 3,X-2;"% % % ";AT 4,X-2;"\:'\''\':";AT 5,X-2;"\: \ :"
1101 LET P(K)=X-1
1102 LET W$(K)="DOG"
1110 RETURN
1300 PRINT AT 1,X-4;"\ .% % % \..";AT 2,X-4;"% % % % \.:";AT 3,X-4;"\':% % \:'\ '\..\' ";AT 4,X-4;"\ : \: "
1301 LET P(K)=X-4
1302 LET W$(K)="ELEPHANT"
1310 RETURN
1500 PRINT AT 1,X-4;"\ . \ .\..";AT 2,X-4;"\ :\:.\.:% % \':\. ";AT 3,X-4;"\ :% % % % % \. ";AT 4,X-4;"\ :\' \ '\':\:'\' "
1501 LET P(K)=X-2
1502 LET W$(K)="FISH"
1510 RETURN
1700 PRINT AT 0,X;"% \: ";AT 1,X;"\':\' ";AT 2,X-1;"\ .\':\'.";AT 3,X-1;"\' \ : \' "
1710 IF L(K)=1 THEN RETURN
1720 PRINT AT 4,X;"\.:\. ";AT 5,X-1;"\.:% % \. ";AT 6,X-2;"\ '\:'\''\''\:'";AT 7,X-1;"\: \: "
1721 LET P(K)=X-2
1722 LET W$(K)="GIRL"
1730 RETURN
1900 PRINT AT 1,X-2;">\ .\..\..\. <";AT 2,X-1;"\.:% % \:.";AT 3,X-1;"\ :..\: ";AT 4,X-1;"\ : \: ";AT 5,X-1;"\ :\ '\' \: ";AT 6,X;"\''\''"
1901 FOR F=1 TO 2
1902 PRINT AT 1,X-1;" ";AT 2,X-1;"\ .\..\..\. "
1903 LET E=USR 16514
1904 PRINT AT 1,X-1;"\ .\..\..\. ";AT 2,X-1;"\.:% % \:."
1905 LET E=USR 16514
1906 NEXT F
1907 LET P(K)=X-1
1908 LET W$(K)="HAT"
1910 RETURN
2100 PRINT AT 1,X-1;"\ :";AT 2,X-1;"\ :";AT 3,X-2;"\ .\''\''\''\. ";AT 4,X-2;"\ :\~~\~~\~~\: ";AT 5,X-2;"\ :\ ' \' \: ";AT 6,X-2;"\ :\ .\..\. \: ";AT 7,X-2;"\ '\..\..\..\' "
2101 LET P(K)=X-3
2102 LET W$(K)="INDIAN"
2110 RETURN
2300 PRINT AT 1,X-3;"---\:.";AT 2,X-3;"\':\..\..\.:\:.\..";AT 3,X-3;"\ :\..\..\..\..\..% >";AT 4,X-3;"---\ .\:'";AT 5,X-3;"---\:'"
2301 LET P(K)=X-1
2302 LET W$(K)="JET"
2310 RETURN
2500 LET P(K)=X-2
2522 LET W$(K)="KING"
2523 PRINT AT 1,X-2;"\. \. \. \. \. ";AT 2,X-2;"\':\''\''\':\' ";AT 3,X-2;"\ :\ '\ '\ :";AT 4,X-2;"\ : \' \ :";AT 5,X-2;"\ :\ '\''\ :";AT 6,X-1;"\':% \' "
2530 RETURN
2700 PRINT AT 2,X-3;"A B C D";AT 3,X-2;"E F G"
2701 LET P(K)=X-4
2702 LET W$(K)="LETTERS"
2710 RETURN
2900 PRINT AT 1,X;"% \: ";AT 2,X;"\':\' ";AT 3,X-1;"% % % \: ";AT 4,X-1;"\: % \: \: ";AT 5,X-1;"\' % \: \' "
2910 IF L(K)=22 THEN RETURN
2920 PRINT AT 6,X-1;"\ :% % ";AT 7,X-1;"\ :\: % ";AT 8,X-1;"\ :\: % "
2921 LET P(K)=X-1
2922 LET W$(K)="MAN"
2930 RETURN
3100 PRINT AT 3,X-3;"1 2 3 4";AT 4,X-2;"5 6 7"
3101 LET P(K)=X-3
3102 LET W$(K)="NUMBERS"
3110 RETURN
3300 PRINT AT 1,X-4;"\. ";AT 2,X-4;"\ '\'. \.:\. \..\. ";AT 3,X-2;"\':% % \''";AT 4,X-4;"\ .\.'\':% % \.. \.'";AT 5,X-4;"\' \ .\.'\.'\.'\. \''";AT 6,X-4;"\ .\' \ .\' \'.\ '\'.";AT 7,X-4;"\' \ .\' \ '\. "
3301 LET P(K)=X-3
3302 LET W$(K)="OCTOPUS"
3310 RETURN
3500 PRINT AT 5,X-2;"\..\..\..\..% ";AT 4,X+2;"*";AT 3,X+2;"*"
3501 LET P(K)=X-1
3502 LET W$(K)="PIPE"
3510 RETURN
3700 GOSUB 2500
3710 FOR Y=38 TO 29 STEP -1
3720 PLOT 2*X-4,Y
3730 PLOT 2*X+4,Y
3740 NEXT Y
3751 LET P(K)=X-2
3752 LET W$(K)="QUEEN"
3760 RETURN
3900 PRINT AT 1,X;"A";AT 2,X;"% ";AT 3,X;"% ";AT 4,X;"% ";AT 5,X;"% ";AT 6,X-1;"\..% \..";AT 7,X-1;"\' *\ '";AT 8,X;"*"
3901 LET P(K)=X-3
3902 LET W$(K)="ROCKET"
3910 RETURN
4100 PRINT AT 1,X-1;"\..\..\..";AT 2,X-2;"\ :\ . \. \: ";AT 3,X-2;"\ : \: ";AT 4,X-3;">\ :\ . \. \: <";AT 5,X-2;"\ : \'' \: ";AT 6,X-1;"\''\''\''"
4101 FOR F=1 TO 2
4102 PRINT AT 4,X-1;" ";AT 5,X-1;"\ '\''\' "
4103 LET E=USR 16514
4104 PRINT AT 4,X-1;"\ . \. ";AT 5,X-1;" \'' "
4105 LET E=USR 16514
4106 NEXT F
4107 LET P(K)=X-2
4108 LET W$(K)="SMILE"
4110 RETURN
4300 PRINT AT 1,X-1;"\ .% \. ";AT 2,X-2;"\ .% % % \. ";AT 3,X-2;"% % % % % ";AT 4,X-2;"\ '% % % \' ";AT 5,X-1;"\ '% \' ";AT 6,X;"% ";AT 7,X-1;"\ .% \. "
4301 LET P(K)=X-2
4302 LET W$(K)="TREE"
4310 RETURN
4500 PRINT AT 1,X;"\.:\. ";AT 2,X-1;"\.'\ :\ '\. ";AT 3,X;"\ :";AT 4,X;"\ :"
4501 LET P(K)=X-1
4502 LET W$(K)="UP"
4510 RETURN
4700 PRINT AT 2,X-2;"\ .\. \..";AT 3,X-2;"% % \. \.:% \: ";AT 4,X-2;"\':% % % % \' ";AT 5,X-1;"\':% % \' ";AT 6,X;"\':\' "
4701 LET P(K)=X-4
4702 LET W$(K)="VALENTINE"
4710 RETURN
4900 GOSUB 2900
4910 PRINT AT 6,X-1;"\.:% % \. ";AT 7,X-2;"\.:% % % % \. ";AT 8,X-1;"\ :\: % "
4911 LET P(K)=X-2
4912 LET W$(K)="WOMAN"
4920 RETURN
5100 PRINT AT 1,X-3;"\: \: \: \: \: \: \: ";AT 2,X-3;"\: \: \: \: \: \' ";AT 3,X-3;"\: \: \: \' \. ";AT 4,X-3;"\: \' \. /";AT 5,X-1;"/"
5101 LET P(K)=X-4
5102 LET W$(K)="XYLOPHONE"
5110 RETURN
5300 PRINT AT 1,X-1;"\ .% \. ";AT 2,X-1;"% % \':";AT 3,X-1;"% % % \. <";AT 4,X-1;"% % \''<";AT 5,X-1;"% % \.. <";AT 6,X-1;"\ :% "
5301 LET P(K)=X-1
5302 LET W$(K)="YELL"
5310 RETURN
5500 PRINT AT 3,X-2;"\.'\. \.'";AT 4,X-3;"\ ' \ '\. \.'\.'";AT 5,X;"\ '"
5501 LET P(K)=X-3
5502 LET W$(K)="ZIGZAG"
5510 RETURN
1 REM \06\01\C5\06\64\00\10\FD\C1\10\F7\C9\2E\2E\2E\2E\2E\2E\2E\2E\2E\2E\2E
2 SAVE "VOWE%L"
12 PRINT AT 8,11;"VOWELTUTOR";AT 10,2;"COPYRIGHT 1982 LOU GOLDSTEIN";AT 12,7;"% %F%R%O%M% %S%O%F%T%S%Y%N%C% %I%N%C% "
13 PRINT AT 20,5;"PRESS ""ENTER"" TO START"
14 PAUSE 33000
15 RAND
16 LET V$="AEIOU"
17 CLS
18 DIM P(3)
19 DIM W$(3,10)
20 DIM L(5)
23 PRINT AT 6,0;"WHICH VOWELS DO YOU WANT TO USE?1=LONG",,"2=SHORT",,"3=BOTH",,"4=EXIT PROGRAM"
24 INPUT O
25 LET LS=O
26 CLS
27 IF O=4 THEN STOP
30 IF O=3 THEN LET LS=INT (RND*2)+1
31 FOR K=1 TO 3
32 FAST
40 LET L(K)=INT (RND*5)+1
50 NEXT K
60 IF L(1)=L(2) OR L(1)=L(3) OR L(2)=L(3) THEN GOTO 31
80 LET C=INT (RND*3)+1
90 LET A$=V$(L(C))
99 SLOW
100 FOR K=1 TO 3
105 LET Z=INT (RND*3)
110 LET X=10*K-5
120 GOSUB 700*LS+100*L(K)+30*Z
121 PRINT AT 10,P(K);W$(K)
130 PRINT AT 15,X;K
140 NEXT K
150 PRINT AT 19,14;"\:'\''\':";AT 20,14;"\: ";A$;"\ :";AT 21,14;"\:.\..\.:"
151 FOR J=1 TO 10
152 IF W$(C,J)="% " THEN GOTO 155
153 NEXT J
155 LET W$(C,J)=A$
156 INPUT R
157 IF R=9 THEN CLS
160 IF R=9 THEN GOTO 23
170 IF R<>C THEN PRINT AT 16,10*C-9;"% % % % % % % % % "
180 IF R=C THEN PRINT AT 16,10*C-9;"*********"
185 PRINT AT 13,P(C);W$(C)
190 PAUSE 250
195 CLS
200 GOTO 30
800 LET W$(K)="TR% IN"
801 LET P(K)=X-2
802 PRINT AT 2,X-1;"*";AT 3,X;"*";AT 4,X;"\ :\..\. ";AT 5,X-4;"\ :% \.:% \.:% % >";AT 6,X-4;"\ '\ '\ '\ '\ ' \ '"
803 RETURN
830 LET W$(K)="C% NE"
831 LET P(K)=X-1
832 PRINT AT 1,X+1;"\' ";AT 0,X-1;"\ .\''\. "
833 FOR Y=41 TO 30 STEP -1
834 PLOT 2*X-1,Y
835 NEXT Y
836 RETURN
860 LET W$(K)="D% YS"
861 LET P(K)=X-2
862 PRINT AT 2,X-1;"FRI.";AT 4,X-1;"SAT.";AT 6,X-1;"SUN."
863 RETURN
900 LET W$(K)="K% Y"
901 LET P(K)=X-1
902 PRINT AT 3,X-3;"% % ";AT 4,X-3;"% % \:'\''\':% % \' ";AT 5,X-3;"% % \ '\ :\ '"
903 RETURN
930 LET W$(K)="THR% E"
931 LET P(K)=X-2
932 PRINT AT 3,X-1;"\''\''\: ";AT 4,X+1;"\: ";AT 5,X-1;"\ '\''\: ";AT 6,X+1;"\: ";AT 7,X-1;"\''\''\' "
933 RETURN
960 LET W$(K)="KN% E"
961 LET P(K)=X-2
962 PRINT AT 0,X+1;"% \: ";AT 1,X+1;"\':\' ";AT 2,X+1;"\: ";AT 3,X;"\ :\ '\..\. ";AT 4,X;"\: ";AT 5,X-1;"\ :\ '\. ";AT 6,X-1;"\ : \ '\. <";AT 7,X-2;"\ .\' \: ";AT 8,X-2;"\'. \''"
968 RETURN
1000 LET W$(K)="F% VE"
1001 LET P(K)=X-2
1002 PRINT AT 2,X-1;"\:'\''\' ";AT 3,X-1;"\:.\. ";AT 4,X;"\ '\. ";AT 5,X-1;"\. \ .\' ";AT 6,X-1;"\ '\' "
1003 RETURN
1030 LET W$(K)="K% TE"
1031 LET P(K)=X-2
1032 PRINT AT 0,X;"\.:\. ";AT 1,X-1;"\ .\':\'.";AT 2,X-1;"\.:\.:\.:\. ";AT 3,X-1;"\ :\ :\ :";AT 4,X;"% \: ";AT 5,X;"\ :";AT 6,X+1;"\'.";AT 7,X+1;"\.'";AT 8,X+1;"\ '"
1033 RETURN
1060 LET W$(K)="N% NE"
1061 LET P(K)=X-2
1063 PRINT AT 2,X-1;"\:'\''\: ";AT 3,X-1;"\: \: ";AT 4,X-1;"\''\''\: ";AT 5,X-1;"\. \: ";AT 6,X-1;"\''\''\' "
1064 RETURN
1100 LET W$(K)="B% AT"
1101 LET P(K)=X-2
1102 PRINT AT 1,X-2;"\..\..\..\..\. ";AT 2,X-2;"\ '\. \ '\. ";AT 3,X-1;"\.' \.'";AT 4,X-2;"\ '\''\':\''\''";AT 5,X-4;"\..\..\..\..\.:\..\..\..>";AT 6,X-4;"\':% % % % % \:'";AT 7,X-3;"\''\''\''\''\''"
1103 RETURN
1130 LET W$(K)="THR% W"
1131 LET P(K)=X-2
1132 PRINT AT 2,X+2;">";AT 3,X-2;"\ :% >\ '";AT 4,X-2;"\ '\:' \.'";AT 5,X-3;"\ .\''\:'\''";AT 6,X-3;"\' \: ";AT 7,X-2;"\.'\ '\. ";AT 8,X-3;"\ ' \ '"
1133 RETURN
1160 LET W$(K)="N% SE"
1161 LET P(K)=X-2
1162 PRINT AT 1,X-1;"\ .% \. ";AT 2,X-1;"% \:.\:.";AT 3,X-1;"% % \' ";AT 4,X-1;"\':\:'\' "
1163 FOR G=1 TO 3
1164 PRINT AT 2,1+X;"\: "
1165 LET U=USR 16514
1166 PRINT AT 2,X+1;"\:."
1167 LET U=USR 16514
1168 NEXT G
1169 RETURN
1200 LET W$(K)="% NITED"
1201 LET P(K)=X-3
1202 PRINT AT 1,X-3;"\..\..\..\..\..\. \.:";AT 2,X-4;"\ .% % % % % % \.:% ";AT 3,X-4;"\ :AMERICA\: ";AT 4,X-4;"\ '% % % % % % % \: ";AT 5,X-3;"\''\''% % % % % \: ";AT 6,X;"\':\:' \: ";AT 7,X+1;"\' "
1203 PRINT AT 11,P(K);"STATES"
1204 RETURN
1230 LET W$(K)="F% EL"
1231 LET P(K)=X-2
1232 PRINT AT 1,X-4;"\##\##\##";AT 2,X-4;"\##%G\##";AT 3,X-4;"\##%A\##";AT 4,X-4;"\##%S\##\'. \:'\''\':";AT 5,X-4;"\##\##\##\ '\..\:.\..\.:";AT 6,X-4;"\##\##\## % % % ";AT 7,X-4;"\##\##\## \: \ :"
1233 RETURN
1260 LET W$(K)="T% BE"
1261 LET P(K)=X-2
1262 PRINT AT 2,X-4;"\ .\..\..\..\..\..\..\..\. ";AT 3,X-4;"\ :\##TOOTH\##\:.";AT 4,X-4;"\ :\##PASTE\##\:'";AT 5,X-4;"\ '\''\''\''\''\''\''\''\' "
1263 RETURN
1500 LET W$(K)="FL% G"
1501 LET P(K)=X-2
1503 LET B=X-4
1504 PRINT AT 0,B;"\ .\..\..\..\..\..\..\..";AT 1,B;"\ :***\:'\''\''\':";AT 2,B;"\ :***\:'\''\''\':";AT 3,B;"\ :\''\''\''\''\''\''\':";AT 4,B;"\ :\''\''\''\''\''\''\':";AT 5,B;"\ :\''\''\''\''\''\''\''";AT 6,B;"\ :"
1505 RETURN
1530 LET W$(K)="% DD"
1531 LET P(K)=X-1
1532 PRINT AT 1,X-2;"3+2=\##";AT 3,X;"75";AT 4,X-1;"+23";AT 5,X-1;"\''\''\''"
1533 RETURN
1560 LET W$(K)="P% N"
1561 LET P(K)=X-1
1562 PRINT AT 3,X-3;"\..\..\..\..";AT 4,X-4;"\ :\' \ '\:.\..\..\..";AT 5,X-4;"\ :\:.\..\..\.:\: ";AT 6,X-4;"\ '% % % % \' "
1563 RETURN
1600 LET W$(K)="T% N"
1601 LET P(K)=X-1
1602 LET B=X-2
1603 PRINT AT 2,B;"\ : \:'\''\':";AT 3,B;"\ : \: \ :";AT 4,B;"\ : \: \ :";AT 5,B;"\ : \:.\..\.:"
1604 RETURN
1630 LET W$(K)="DR% SS"
1631 LET P(K)=X-2
1632 PRINT AT 1,X-2;"\.:\:.\.:\:.";AT 2,X-3;"\ '\:'% % \':\' ";AT 3,X-2;"\ .% % \. ";AT 4,X-3;"\ .% % % % \. ";AT 5,X-4;"\ .% % % % % % \. "
1633 RETURN
1660 LET W$(K)="L% G"
1661 LET P(K)=X-1
1662 LET B=X-1
1663 PRINT AT 0,X;"% \: ";AT 1,X;"\':\' ";AT 2,B;"% % % \: ";AT 3,B;"\: % \: \: ";AT 4,B;"\' % \: \' ";AT 5,B;"\ :% % ";AT 6,B;"\ :\: \##<";AT 7,B;"\ :\: \##<"
1664 RETURN
1700 LET W$(K)="S% X"
1701 LET P(K)=X-1
1702 LET B=X-1
1703 PRINT AT 1,X;"\..";AT 2,B;"\.' \' ";AT 3,B;"\: ";AT 4,B;"\:.\''\'.";AT 5,B;"\: \ :";AT 6,B;"\ '\..\' "
1704 RETURN
1730 LET W$(K)="SH% P"
1731 LET P(K)=X-2
1732 PRINT AT 3,X-3;"\..\:.\:.\. ";AT 4,X-5;"\ .\..% \:'% \:'% \:'% \:'";AT 5,X-4;"\':\:.% \:.% \:.% \:'";AT 6,X-5;"\@@\@@\@@\@@\@@\@@\@@\@@\@@\@@"
1733 RETURN
1760 LET W$(K)="WR% ST"
1761 LET P(K)=X-2
1762 LET B=X-1
1763 PRINT AT 0,B;"\..\..\..";AT 1,B;"\:'% \':";AT 2,B;"% \''% ";AT 3,B;"\''% \''"
1764 LET B=X-2
1765 PRINT AT 4,B;"% % % % % ";AT 5,B;"% \ :% \: % ";AT 6,B-1;">\##\ :% \: \##<";AT 7,B;"W W"
1766 RETURN
1800 LET W$(K)="P% T"
1801 LET P(K)=X-1
1802 PRINT AT 1,X-2;"\..";AT 2,X-4;"\ .\'' \''\. ";AT 3,X-4;"\:. \.:\..\..\..";AT 4,X-4;"% % \..% % ";AT 5,X-4;"\':% % % \:'";AT 6,X-3;"\ '\''\' "
1803 RETURN
1830 LET W$(K)="CL% CK"
1831 LET P(K)=X-3
1832 PRINT AT 1,X;"\..\. ";AT 2,X-2;"\ .\''\ .\ '\'.";AT 3,X-2;"\: \ : \: ";AT 4,X-3;"\ : \ :\..\. \ :";AT 5,X-3;"\ '\. \.'";AT 6,X-2;"\'. \ .\' ";AT 7,X-1;"\''\..\.'\' "
1833 RETURN
1860 LET W$(K)="ST% P"
1861 LET P(K)=X-2
1862 PRINT AT 0,X-2;"\ .% % \. ";AT 1,X-3;"\ .% % % % \. ";AT 2,X-3;"% ST P% ";AT 3,X-3;"% % % % % % ";AT 4,X-3;"\ '% % % % \' ";AT 5,X-2;"\ '% % \' ";AT 6,X-1;"\ :\: ";AT 7,X-1;"\ :\: "
1863 RETURN
1900 LET W$(K)="G% N"
1901 LET P(K)=X-1
1902 LET B=X-4
1903 PRINT AT 2,B;"\ :% % % % % -->";AT 3,B;"\ :\: \: \:'\''";AT 4,B;"\ :\:.\..\: ";AT 5,B;"\ :\: "
1904 RETURN
1930 LET W$(K)="DR% M"
1931 LET P(K)=X-2
1932 PRINT AT 0,X+2;"/";AT 1,X-1;"\.. \ ' /";AT 2,X-3;"\ .\'' \''\. \ '";AT 3,X-3;"\:. \.:";AT 4,X-3;"% % \..% % ";AT 5,X-3;"\':% % % \:'";AT 6,X-2;"\ '\''\' "
1933 RETURN
1960 LET W$(K)="B% S"
1961 LET P(K)=X-1
1962 LET B=X-3
1963 PRINT AT 2,B;"% \''\:'\':\''% % ";AT 3,B;"% \..\:.\.:\..% \ :% ";AT 4,B;"% % % % % % \.:% ";AT 5,B+1;"\' \ '"
1964 RETURN
Note: Type-in program listings on this website use ZMAKEBAS notation for graphics characters.
People
E
Skip to content
Computer Tutor
Products: Computer Tutors: Alpha/Vowel Tutors
Developer(s): Lou Goldstein
Date: 1982
Type: Cassette
Platform(s): TS 1000
Tags: Education
AlphaTutor and VowelTutor are a paired set of educational programs designed to teach children letter recognition and vowel sounds through a picture-matching quiz format. Each round randomly selects three images drawn entirely in block graphics, displays them with numbered labels, and prompts the child to identify which picture matches a highlighted letter or vowel shown in a bordered box. The programs use computed GOSUB targets (e.g., `GOSUB 200*L(K)+500` and `GOSUB 700*LS+100*L(K)+30*Z`) to dispatch to one of 26 picture-drawing subroutines covering letters A–Z and multiple vowel-sound variants. VowelTutor extends the concept with separate long and short vowel word sets per letter, selected by a random or user-chosen mode flag, and includes an animated nose-sniffing and hat/smile flip routine via `USR 16514`, pointing to a small machine-code delay loop stored in the REM statement at line 1.
Program Analysis
This listing contains two related programs: AlphaTutor and VowelTutor, both credited to Lou Goldstein / SoftSync Inc., 1982. AlphaTutor covers all 26 letters of the alphabet; VowelTutor extends the concept to long and short vowel sounds, offering multiple word variants per vowel. Both share the same core quiz loop and picture-rendering architecture.
Program Structure
Both programs follow the same top-level flow:
- Title/splash screen (lines 12–14), then
RAND to seed the RNG.
- Initialise arrays
P(3), W$(3,10), L(3) (lines 18–20).
- Main loop (lines 30–200): pick three distinct random indices, choose one as the target, dispatch to a drawing subroutine for each, display a letter/vowel prompt box, read a numeric answer, give feedback, pause, clear and repeat.
- Drawing subroutines: one per picture subject, each printing block-graphic art, setting
P(K) (label column) and W$(K) (word string).
VowelTutor adds a mode-selection screen (lines 23–27) offering long vowels, short vowels, or both, stored in LS, and allows the user to return to mode selection by entering 9.
Computed GOSUB Dispatch
The most architecturally notable feature is the use of arithmetic expressions as GOSUB targets to select picture subroutines without IF/THEN chains:
- AlphaTutor:
GOSUB 200*L(K)+500 — with L(K) in 0–25, this generates targets 500 (A=ambulance), 700 (B=boy), 900 (C=car) … 5500 (Z=zigzag), spaced 200 apart.
- VowelTutor:
GOSUB 700*LS+100*L(K)+30*Z — the LS factor (1=long, 2=short) shifts into a separate bank of subroutines; L(K) selects the vowel (1–5 = A/E/I/O/U); Z (0–2) selects one of up to three word variants per vowel per length.
This is a compact and efficient dispatch mechanism that avoids long IF/THEN chains entirely, at the cost of requiring subroutines to be placed at exactly the computed line numbers.
Machine Code Usage
Line 1 in both programs is a REM statement whose body encodes a short Z80 machine-code routine. The sequence \06\01\C5\06\64\00\10\FD\C1\10\F7\C9 disassembles as:
LD B,1 — outer loop count
PUSH BC
LD B,100 ; LD C,0 — inner delay count (25600 iterations)
DJNZ $ — inner loop
POP BC ; DJNZ … — outer loop
RET
This routine is called via LET E=USR 16514 (the address of the REM body in the VowelTutor variant is slightly longer, hence a different offset in practice). It is used as a simple software delay in animation sequences — for example, the hat flip in AlphaTutor (lines 1901–1906), the smile animation (lines 4101–4106), and the nose-sniffing effect (lines 1163–1168 in VowelTutor).
Key BASIC Idioms
- Block graphic art: All pictures are rendered using the ZX81/TS1000 block graphic characters (2×2 pixel sub-characters), encoded here as zmakebas escape sequences such as
\ ., \:., \'', etc.
- Distinct random selection: Lines 60 check
L(1)=L(2) OR L(1)=L(3) OR L(2)=L(3) and loop back if any two indices collide, ensuring three distinct pictures appear each round.
- Column positioning via formula:
LET X=10*K-5 (line 110) distributes the three picture columns evenly across the 32-character screen (columns 5, 15, 25).
- Answer box: The target letter is displayed in a bordered box drawn with block graphics at lines 19–21 using
AT positioning.
- PLOT for QUEEN and CONE: The subroutines at lines 3700 and 830 use
PLOT with pixel coordinates to draw vertical lines, since the block graphic resolution is insufficient for narrow strokes.
VowelTutor Word-Embedding Technique
In VowelTutor, word labels use a space character as a placeholder for the missing vowel (e.g., "TR% IN" for TRAIN, "K% TE" for KITE). After the round is set up, lines 151–155 scan W$(C) character-by-character to find the first "% " (space) position, then replace it with the actual vowel character A$ — effectively filling in the blank dynamically. This lets the same word string serve as both a gapped display and, after substitution, the correct spelled form.
Notable Subroutine Sharing
AlphaTutor’s GIRL subroutine (line 1700) is shared with BOY (line 700): the BOY subroutine calls GOSUB 1700 to draw the upper body, then the shared routine checks IF L(K)=1 THEN RETURN (line 1710) to exit early for BOY, or continues to draw the skirt/legs for GIRL. Similarly, VowelTutor’s WOMAN subroutine (line 4900) reuses the MAN subroutine (line 2900) for the head and torso, then overprints with different lower-body graphics.
Array Sizing
Array Dimensions Purpose P(3)3 elements Column position for each picture’s word label W$(3,10)3 strings × 10 chars Word associated with each picture slot L(3) / L(5)3 (Alpha) / 5 (Vowel) Random index for picture selection
Potential Anomalies
- AlphaTutor has no subroutine at the computed target for letter index 0 (line 500 handles A=0, as
200*0+500=500) — this is correct; L(K)=INT(RND*26) yields 0–25, mapping to lines 500–5500.
- VowelTutor’s
GOSUB 700*LS+100*L(K)+30*Z for LS=2 (short vowels) can yield targets like 1400+30*Z (lines 1400, 1430, 1460) which are not all defined in the listing — some short-vowel variant slots appear absent, which would cause a BASIC error if selected. This may reflect incomplete subroutine coverage in the original listing.
- The
PAUSE 33000 at line 14 provides a long title-screen pause (~30 seconds at normal speed) but any key press does not skip it — the user must wait it out unless they press BREAK.
- In VowelTutor, the
\## sequences in several subroutines (e.g., lines 1232, 1262, 1532) are not standard zmakebas escape sequences and likely represent inverse-video block characters or UDGs in the original tape file that were not fully decoded in this transcription.
Content
Source Code
1 REM \06\01\C5\06\64\00\10\FD\C1\10\F7\C9\2E\2E\2E\2E\2E\2E
2 SAVE "AB%C"
12 PRINT AT 8,11;"ALPHATUTOR";AT 10,2;"COPYRIGHT 1982 LOU GOLDSTEIN";AT 12,6;"% %F%R%O%M% %S%O%F%T%S%Y%N%C% %I%N%C% "
13 PRINT AT 20,5;"PRESS ""ENTER"" TO START"
14 PAUSE 33000
15 RAND
17 CLS
18 DIM P(3)
19 DIM W$(3,10)
20 DIM L(3)
30 FOR K=1 TO 3
40 LET L(K)=INT (RND*26)
50 NEXT K
60 IF L(1)=L(2) OR L(1)=L(3) OR L(2)=L(3) THEN GOTO 30
80 LET C=INT (RND*3)+1
90 LET A$=CHR$ (L(C)+38)
100 FOR K=1 TO 3
110 LET X=10*K-5
120 GOSUB 200*L(K)+500
121 PRINT AT 10,P(K);"% ";W$(K,2 TO )
130 PRINT AT 15,X;K
140 NEXT K
150 PRINT AT 19,14;"\:'\''\':";AT 20,14;"\: ";A$;"\ :";AT 21,14;"\:.\..\.:"
160 INPUT R
170 IF R<>C THEN PRINT AT 16,10*C-9;"% % % % % % % % % "
180 IF R=C THEN PRINT AT 16,10*C-9;"*********"
185 PRINT AT 13,P(C);W$(C)
190 PAUSE 250
195 CLS
200 GOTO 30
500 PRINT AT 3,X-3;"\..\..\..\..";AT 4,X-3;"\: \ . \ :";AT 5,X-3;"\: \':\' \ '\''\':";AT 6,X-3;"\:.\..\..\..\..\.:";AT 7,X-3;"\' \' "
501 LET P(K)=X-4
502 LET W$(K)="AMBULANCE"
510 RETURN
700 GOSUB 1700
710 PRINT AT 4,X;"\ :";AT 5,X;"\.'\. ";AT 6,X-1;"\.' \ '\. ";AT 7,X-2;"\.' \ '\. "
711 LET P(K)=X-1
712 LET W$(K)="BOY"
720 RETURN
900 PRINT AT 5,X-3;"\ :% % % ";AT 6,X-3;"\ :% % % % % ";AT 7,X-2;"\' \ '"
901 LET P(K)=X-1
902 LET W$(K)="CAR"
910 RETURN
1100 PRINT AT 1,X-4;"\ . \:.\. ";AT 2,X-3;"\'. % \. ";AT 3,X-2;"% % % ";AT 4,X-2;"\:'\''\':";AT 5,X-2;"\: \ :"
1101 LET P(K)=X-1
1102 LET W$(K)="DOG"
1110 RETURN
1300 PRINT AT 1,X-4;"\ .% % % \..";AT 2,X-4;"% % % % \.:";AT 3,X-4;"\':% % \:'\ '\..\' ";AT 4,X-4;"\ : \: "
1301 LET P(K)=X-4
1302 LET W$(K)="ELEPHANT"
1310 RETURN
1500 PRINT AT 1,X-4;"\ . \ .\..";AT 2,X-4;"\ :\:.\.:% % \':\. ";AT 3,X-4;"\ :% % % % % \. ";AT 4,X-4;"\ :\' \ '\':\:'\' "
1501 LET P(K)=X-2
1502 LET W$(K)="FISH"
1510 RETURN
1700 PRINT AT 0,X;"% \: ";AT 1,X;"\':\' ";AT 2,X-1;"\ .\':\'.";AT 3,X-1;"\' \ : \' "
1710 IF L(K)=1 THEN RETURN
1720 PRINT AT 4,X;"\.:\. ";AT 5,X-1;"\.:% % \. ";AT 6,X-2;"\ '\:'\''\''\:'";AT 7,X-1;"\: \: "
1721 LET P(K)=X-2
1722 LET W$(K)="GIRL"
1730 RETURN
1900 PRINT AT 1,X-2;">\ .\..\..\. <";AT 2,X-1;"\.:% % \:.";AT 3,X-1;"\ :..\: ";AT 4,X-1;"\ : \: ";AT 5,X-1;"\ :\ '\' \: ";AT 6,X;"\''\''"
1901 FOR F=1 TO 2
1902 PRINT AT 1,X-1;" ";AT 2,X-1;"\ .\..\..\. "
1903 LET E=USR 16514
1904 PRINT AT 1,X-1;"\ .\..\..\. ";AT 2,X-1;"\.:% % \:."
1905 LET E=USR 16514
1906 NEXT F
1907 LET P(K)=X-1
1908 LET W$(K)="HAT"
1910 RETURN
2100 PRINT AT 1,X-1;"\ :";AT 2,X-1;"\ :";AT 3,X-2;"\ .\''\''\''\. ";AT 4,X-2;"\ :\~~\~~\~~\: ";AT 5,X-2;"\ :\ ' \' \: ";AT 6,X-2;"\ :\ .\..\. \: ";AT 7,X-2;"\ '\..\..\..\' "
2101 LET P(K)=X-3
2102 LET W$(K)="INDIAN"
2110 RETURN
2300 PRINT AT 1,X-3;"---\:.";AT 2,X-3;"\':\..\..\.:\:.\..";AT 3,X-3;"\ :\..\..\..\..\..% >";AT 4,X-3;"---\ .\:'";AT 5,X-3;"---\:'"
2301 LET P(K)=X-1
2302 LET W$(K)="JET"
2310 RETURN
2500 LET P(K)=X-2
2522 LET W$(K)="KING"
2523 PRINT AT 1,X-2;"\. \. \. \. \. ";AT 2,X-2;"\':\''\''\':\' ";AT 3,X-2;"\ :\ '\ '\ :";AT 4,X-2;"\ : \' \ :";AT 5,X-2;"\ :\ '\''\ :";AT 6,X-1;"\':% \' "
2530 RETURN
2700 PRINT AT 2,X-3;"A B C D";AT 3,X-2;"E F G"
2701 LET P(K)=X-4
2702 LET W$(K)="LETTERS"
2710 RETURN
2900 PRINT AT 1,X;"% \: ";AT 2,X;"\':\' ";AT 3,X-1;"% % % \: ";AT 4,X-1;"\: % \: \: ";AT 5,X-1;"\' % \: \' "
2910 IF L(K)=22 THEN RETURN
2920 PRINT AT 6,X-1;"\ :% % ";AT 7,X-1;"\ :\: % ";AT 8,X-1;"\ :\: % "
2921 LET P(K)=X-1
2922 LET W$(K)="MAN"
2930 RETURN
3100 PRINT AT 3,X-3;"1 2 3 4";AT 4,X-2;"5 6 7"
3101 LET P(K)=X-3
3102 LET W$(K)="NUMBERS"
3110 RETURN
3300 PRINT AT 1,X-4;"\. ";AT 2,X-4;"\ '\'. \.:\. \..\. ";AT 3,X-2;"\':% % \''";AT 4,X-4;"\ .\.'\':% % \.. \.'";AT 5,X-4;"\' \ .\.'\.'\.'\. \''";AT 6,X-4;"\ .\' \ .\' \'.\ '\'.";AT 7,X-4;"\' \ .\' \ '\. "
3301 LET P(K)=X-3
3302 LET W$(K)="OCTOPUS"
3310 RETURN
3500 PRINT AT 5,X-2;"\..\..\..\..% ";AT 4,X+2;"*";AT 3,X+2;"*"
3501 LET P(K)=X-1
3502 LET W$(K)="PIPE"
3510 RETURN
3700 GOSUB 2500
3710 FOR Y=38 TO 29 STEP -1
3720 PLOT 2*X-4,Y
3730 PLOT 2*X+4,Y
3740 NEXT Y
3751 LET P(K)=X-2
3752 LET W$(K)="QUEEN"
3760 RETURN
3900 PRINT AT 1,X;"A";AT 2,X;"% ";AT 3,X;"% ";AT 4,X;"% ";AT 5,X;"% ";AT 6,X-1;"\..% \..";AT 7,X-1;"\' *\ '";AT 8,X;"*"
3901 LET P(K)=X-3
3902 LET W$(K)="ROCKET"
3910 RETURN
4100 PRINT AT 1,X-1;"\..\..\..";AT 2,X-2;"\ :\ . \. \: ";AT 3,X-2;"\ : \: ";AT 4,X-3;">\ :\ . \. \: <";AT 5,X-2;"\ : \'' \: ";AT 6,X-1;"\''\''\''"
4101 FOR F=1 TO 2
4102 PRINT AT 4,X-1;" ";AT 5,X-1;"\ '\''\' "
4103 LET E=USR 16514
4104 PRINT AT 4,X-1;"\ . \. ";AT 5,X-1;" \'' "
4105 LET E=USR 16514
4106 NEXT F
4107 LET P(K)=X-2
4108 LET W$(K)="SMILE"
4110 RETURN
4300 PRINT AT 1,X-1;"\ .% \. ";AT 2,X-2;"\ .% % % \. ";AT 3,X-2;"% % % % % ";AT 4,X-2;"\ '% % % \' ";AT 5,X-1;"\ '% \' ";AT 6,X;"% ";AT 7,X-1;"\ .% \. "
4301 LET P(K)=X-2
4302 LET W$(K)="TREE"
4310 RETURN
4500 PRINT AT 1,X;"\.:\. ";AT 2,X-1;"\.'\ :\ '\. ";AT 3,X;"\ :";AT 4,X;"\ :"
4501 LET P(K)=X-1
4502 LET W$(K)="UP"
4510 RETURN
4700 PRINT AT 2,X-2;"\ .\. \..";AT 3,X-2;"% % \. \.:% \: ";AT 4,X-2;"\':% % % % \' ";AT 5,X-1;"\':% % \' ";AT 6,X;"\':\' "
4701 LET P(K)=X-4
4702 LET W$(K)="VALENTINE"
4710 RETURN
4900 GOSUB 2900
4910 PRINT AT 6,X-1;"\.:% % \. ";AT 7,X-2;"\.:% % % % \. ";AT 8,X-1;"\ :\: % "
4911 LET P(K)=X-2
4912 LET W$(K)="WOMAN"
4920 RETURN
5100 PRINT AT 1,X-3;"\: \: \: \: \: \: \: ";AT 2,X-3;"\: \: \: \: \: \' ";AT 3,X-3;"\: \: \: \' \. ";AT 4,X-3;"\: \' \. /";AT 5,X-1;"/"
5101 LET P(K)=X-4
5102 LET W$(K)="XYLOPHONE"
5110 RETURN
5300 PRINT AT 1,X-1;"\ .% \. ";AT 2,X-1;"% % \':";AT 3,X-1;"% % % \. <";AT 4,X-1;"% % \''<";AT 5,X-1;"% % \.. <";AT 6,X-1;"\ :% "
5301 LET P(K)=X-1
5302 LET W$(K)="YELL"
5310 RETURN
5500 PRINT AT 3,X-2;"\.'\. \.'";AT 4,X-3;"\ ' \ '\. \.'\.'";AT 5,X;"\ '"
5501 LET P(K)=X-3
5502 LET W$(K)="ZIGZAG"
5510 RETURN
1 REM \06\01\C5\06\64\00\10\FD\C1\10\F7\C9\2E\2E\2E\2E\2E\2E\2E\2E\2E\2E\2E
2 SAVE "VOWE%L"
12 PRINT AT 8,11;"VOWELTUTOR";AT 10,2;"COPYRIGHT 1982 LOU GOLDSTEIN";AT 12,7;"% %F%R%O%M% %S%O%F%T%S%Y%N%C% %I%N%C% "
13 PRINT AT 20,5;"PRESS ""ENTER"" TO START"
14 PAUSE 33000
15 RAND
16 LET V$="AEIOU"
17 CLS
18 DIM P(3)
19 DIM W$(3,10)
20 DIM L(5)
23 PRINT AT 6,0;"WHICH VOWELS DO YOU WANT TO USE?1=LONG",,"2=SHORT",,"3=BOTH",,"4=EXIT PROGRAM"
24 INPUT O
25 LET LS=O
26 CLS
27 IF O=4 THEN STOP
30 IF O=3 THEN LET LS=INT (RND*2)+1
31 FOR K=1 TO 3
32 FAST
40 LET L(K)=INT (RND*5)+1
50 NEXT K
60 IF L(1)=L(2) OR L(1)=L(3) OR L(2)=L(3) THEN GOTO 31
80 LET C=INT (RND*3)+1
90 LET A$=V$(L(C))
99 SLOW
100 FOR K=1 TO 3
105 LET Z=INT (RND*3)
110 LET X=10*K-5
120 GOSUB 700*LS+100*L(K)+30*Z
121 PRINT AT 10,P(K);W$(K)
130 PRINT AT 15,X;K
140 NEXT K
150 PRINT AT 19,14;"\:'\''\':";AT 20,14;"\: ";A$;"\ :";AT 21,14;"\:.\..\.:"
151 FOR J=1 TO 10
152 IF W$(C,J)="% " THEN GOTO 155
153 NEXT J
155 LET W$(C,J)=A$
156 INPUT R
157 IF R=9 THEN CLS
160 IF R=9 THEN GOTO 23
170 IF R<>C THEN PRINT AT 16,10*C-9;"% % % % % % % % % "
180 IF R=C THEN PRINT AT 16,10*C-9;"*********"
185 PRINT AT 13,P(C);W$(C)
190 PAUSE 250
195 CLS
200 GOTO 30
800 LET W$(K)="TR% IN"
801 LET P(K)=X-2
802 PRINT AT 2,X-1;"*";AT 3,X;"*";AT 4,X;"\ :\..\. ";AT 5,X-4;"\ :% \.:% \.:% % >";AT 6,X-4;"\ '\ '\ '\ '\ ' \ '"
803 RETURN
830 LET W$(K)="C% NE"
831 LET P(K)=X-1
832 PRINT AT 1,X+1;"\' ";AT 0,X-1;"\ .\''\. "
833 FOR Y=41 TO 30 STEP -1
834 PLOT 2*X-1,Y
835 NEXT Y
836 RETURN
860 LET W$(K)="D% YS"
861 LET P(K)=X-2
862 PRINT AT 2,X-1;"FRI.";AT 4,X-1;"SAT.";AT 6,X-1;"SUN."
863 RETURN
900 LET W$(K)="K% Y"
901 LET P(K)=X-1
902 PRINT AT 3,X-3;"% % ";AT 4,X-3;"% % \:'\''\':% % \' ";AT 5,X-3;"% % \ '\ :\ '"
903 RETURN
930 LET W$(K)="THR% E"
931 LET P(K)=X-2
932 PRINT AT 3,X-1;"\''\''\: ";AT 4,X+1;"\: ";AT 5,X-1;"\ '\''\: ";AT 6,X+1;"\: ";AT 7,X-1;"\''\''\' "
933 RETURN
960 LET W$(K)="KN% E"
961 LET P(K)=X-2
962 PRINT AT 0,X+1;"% \: ";AT 1,X+1;"\':\' ";AT 2,X+1;"\: ";AT 3,X;"\ :\ '\..\. ";AT 4,X;"\: ";AT 5,X-1;"\ :\ '\. ";AT 6,X-1;"\ : \ '\. <";AT 7,X-2;"\ .\' \: ";AT 8,X-2;"\'. \''"
968 RETURN
1000 LET W$(K)="F% VE"
1001 LET P(K)=X-2
1002 PRINT AT 2,X-1;"\:'\''\' ";AT 3,X-1;"\:.\. ";AT 4,X;"\ '\. ";AT 5,X-1;"\. \ .\' ";AT 6,X-1;"\ '\' "
1003 RETURN
1030 LET W$(K)="K% TE"
1031 LET P(K)=X-2
1032 PRINT AT 0,X;"\.:\. ";AT 1,X-1;"\ .\':\'.";AT 2,X-1;"\.:\.:\.:\. ";AT 3,X-1;"\ :\ :\ :";AT 4,X;"% \: ";AT 5,X;"\ :";AT 6,X+1;"\'.";AT 7,X+1;"\.'";AT 8,X+1;"\ '"
1033 RETURN
1060 LET W$(K)="N% NE"
1061 LET P(K)=X-2
1063 PRINT AT 2,X-1;"\:'\''\: ";AT 3,X-1;"\: \: ";AT 4,X-1;"\''\''\: ";AT 5,X-1;"\. \: ";AT 6,X-1;"\''\''\' "
1064 RETURN
1100 LET W$(K)="B% AT"
1101 LET P(K)=X-2
1102 PRINT AT 1,X-2;"\..\..\..\..\. ";AT 2,X-2;"\ '\. \ '\. ";AT 3,X-1;"\.' \.'";AT 4,X-2;"\ '\''\':\''\''";AT 5,X-4;"\..\..\..\..\.:\..\..\..>";AT 6,X-4;"\':% % % % % \:'";AT 7,X-3;"\''\''\''\''\''"
1103 RETURN
1130 LET W$(K)="THR% W"
1131 LET P(K)=X-2
1132 PRINT AT 2,X+2;">";AT 3,X-2;"\ :% >\ '";AT 4,X-2;"\ '\:' \.'";AT 5,X-3;"\ .\''\:'\''";AT 6,X-3;"\' \: ";AT 7,X-2;"\.'\ '\. ";AT 8,X-3;"\ ' \ '"
1133 RETURN
1160 LET W$(K)="N% SE"
1161 LET P(K)=X-2
1162 PRINT AT 1,X-1;"\ .% \. ";AT 2,X-1;"% \:.\:.";AT 3,X-1;"% % \' ";AT 4,X-1;"\':\:'\' "
1163 FOR G=1 TO 3
1164 PRINT AT 2,1+X;"\: "
1165 LET U=USR 16514
1166 PRINT AT 2,X+1;"\:."
1167 LET U=USR 16514
1168 NEXT G
1169 RETURN
1200 LET W$(K)="% NITED"
1201 LET P(K)=X-3
1202 PRINT AT 1,X-3;"\..\..\..\..\..\. \.:";AT 2,X-4;"\ .% % % % % % \.:% ";AT 3,X-4;"\ :AMERICA\: ";AT 4,X-4;"\ '% % % % % % % \: ";AT 5,X-3;"\''\''% % % % % \: ";AT 6,X;"\':\:' \: ";AT 7,X+1;"\' "
1203 PRINT AT 11,P(K);"STATES"
1204 RETURN
1230 LET W$(K)="F% EL"
1231 LET P(K)=X-2
1232 PRINT AT 1,X-4;"\##\##\##";AT 2,X-4;"\##%G\##";AT 3,X-4;"\##%A\##";AT 4,X-4;"\##%S\##\'. \:'\''\':";AT 5,X-4;"\##\##\##\ '\..\:.\..\.:";AT 6,X-4;"\##\##\## % % % ";AT 7,X-4;"\##\##\## \: \ :"
1233 RETURN
1260 LET W$(K)="T% BE"
1261 LET P(K)=X-2
1262 PRINT AT 2,X-4;"\ .\..\..\..\..\..\..\..\. ";AT 3,X-4;"\ :\##TOOTH\##\:.";AT 4,X-4;"\ :\##PASTE\##\:'";AT 5,X-4;"\ '\''\''\''\''\''\''\''\' "
1263 RETURN
1500 LET W$(K)="FL% G"
1501 LET P(K)=X-2
1503 LET B=X-4
1504 PRINT AT 0,B;"\ .\..\..\..\..\..\..\..";AT 1,B;"\ :***\:'\''\''\':";AT 2,B;"\ :***\:'\''\''\':";AT 3,B;"\ :\''\''\''\''\''\''\':";AT 4,B;"\ :\''\''\''\''\''\''\':";AT 5,B;"\ :\''\''\''\''\''\''\''";AT 6,B;"\ :"
1505 RETURN
1530 LET W$(K)="% DD"
1531 LET P(K)=X-1
1532 PRINT AT 1,X-2;"3+2=\##";AT 3,X;"75";AT 4,X-1;"+23";AT 5,X-1;"\''\''\''"
1533 RETURN
1560 LET W$(K)="P% N"
1561 LET P(K)=X-1
1562 PRINT AT 3,X-3;"\..\..\..\..";AT 4,X-4;"\ :\' \ '\:.\..\..\..";AT 5,X-4;"\ :\:.\..\..\.:\: ";AT 6,X-4;"\ '% % % % \' "
1563 RETURN
1600 LET W$(K)="T% N"
1601 LET P(K)=X-1
1602 LET B=X-2
1603 PRINT AT 2,B;"\ : \:'\''\':";AT 3,B;"\ : \: \ :";AT 4,B;"\ : \: \ :";AT 5,B;"\ : \:.\..\.:"
1604 RETURN
1630 LET W$(K)="DR% SS"
1631 LET P(K)=X-2
1632 PRINT AT 1,X-2;"\.:\:.\.:\:.";AT 2,X-3;"\ '\:'% % \':\' ";AT 3,X-2;"\ .% % \. ";AT 4,X-3;"\ .% % % % \. ";AT 5,X-4;"\ .% % % % % % \. "
1633 RETURN
1660 LET W$(K)="L% G"
1661 LET P(K)=X-1
1662 LET B=X-1
1663 PRINT AT 0,X;"% \: ";AT 1,X;"\':\' ";AT 2,B;"% % % \: ";AT 3,B;"\: % \: \: ";AT 4,B;"\' % \: \' ";AT 5,B;"\ :% % ";AT 6,B;"\ :\: \##<";AT 7,B;"\ :\: \##<"
1664 RETURN
1700 LET W$(K)="S% X"
1701 LET P(K)=X-1
1702 LET B=X-1
1703 PRINT AT 1,X;"\..";AT 2,B;"\.' \' ";AT 3,B;"\: ";AT 4,B;"\:.\''\'.";AT 5,B;"\: \ :";AT 6,B;"\ '\..\' "
1704 RETURN
1730 LET W$(K)="SH% P"
1731 LET P(K)=X-2
1732 PRINT AT 3,X-3;"\..\:.\:.\. ";AT 4,X-5;"\ .\..% \:'% \:'% \:'% \:'";AT 5,X-4;"\':\:.% \:.% \:.% \:'";AT 6,X-5;"\@@\@@\@@\@@\@@\@@\@@\@@\@@\@@"
1733 RETURN
1760 LET W$(K)="WR% ST"
1761 LET P(K)=X-2
1762 LET B=X-1
1763 PRINT AT 0,B;"\..\..\..";AT 1,B;"\:'% \':";AT 2,B;"% \''% ";AT 3,B;"\''% \''"
1764 LET B=X-2
1765 PRINT AT 4,B;"% % % % % ";AT 5,B;"% \ :% \: % ";AT 6,B-1;">\##\ :% \: \##<";AT 7,B;"W W"
1766 RETURN
1800 LET W$(K)="P% T"
1801 LET P(K)=X-1
1802 PRINT AT 1,X-2;"\..";AT 2,X-4;"\ .\'' \''\. ";AT 3,X-4;"\:. \.:\..\..\..";AT 4,X-4;"% % \..% % ";AT 5,X-4;"\':% % % \:'";AT 6,X-3;"\ '\''\' "
1803 RETURN
1830 LET W$(K)="CL% CK"
1831 LET P(K)=X-3
1832 PRINT AT 1,X;"\..\. ";AT 2,X-2;"\ .\''\ .\ '\'.";AT 3,X-2;"\: \ : \: ";AT 4,X-3;"\ : \ :\..\. \ :";AT 5,X-3;"\ '\. \.'";AT 6,X-2;"\'. \ .\' ";AT 7,X-1;"\''\..\.'\' "
1833 RETURN
1860 LET W$(K)="ST% P"
1861 LET P(K)=X-2
1862 PRINT AT 0,X-2;"\ .% % \. ";AT 1,X-3;"\ .% % % % \. ";AT 2,X-3;"% ST P% ";AT 3,X-3;"% % % % % % ";AT 4,X-3;"\ '% % % % \' ";AT 5,X-2;"\ '% % \' ";AT 6,X-1;"\ :\: ";AT 7,X-1;"\ :\: "
1863 RETURN
1900 LET W$(K)="G% N"
1901 LET P(K)=X-1
1902 LET B=X-4
1903 PRINT AT 2,B;"\ :% % % % % -->";AT 3,B;"\ :\: \: \:'\''";AT 4,B;"\ :\:.\..\: ";AT 5,B;"\ :\: "
1904 RETURN
1930 LET W$(K)="DR% M"
1931 LET P(K)=X-2
1932 PRINT AT 0,X+2;"/";AT 1,X-1;"\.. \ ' /";AT 2,X-3;"\ .\'' \''\. \ '";AT 3,X-3;"\:. \.:";AT 4,X-3;"% % \..% % ";AT 5,X-3;"\':% % % \:'";AT 6,X-2;"\ '\''\' "
1933 RETURN
1960 LET W$(K)="B% S"
1961 LET P(K)=X-1
1962 LET B=X-3
1963 PRINT AT 2,B;"% \''\:'\':\''% % ";AT 3,B;"% \..\:.\.:\..% \ :% ";AT 4,B;"% % % % % % \.:% ";AT 5,B+1;"\' \ '"
1964 RETURN
Note: Type-in program listings on this website use ZMAKEBAS notation for graphics characters.
People
E
Skip to content
Computer Tutor
Products: Computer Tutors: Alpha/Vowel Tutors
Developer(s): Lou Goldstein
Date: 1982
Type: Cassette
Platform(s): TS 1000
Tags: Education
AlphaTutor and VowelTutor are a paired set of educational programs designed to teach children letter recognition and vowel sounds through a picture-matching quiz format. Each round randomly selects three images drawn entirely in block graphics, displays them with numbered labels, and prompts the child to identify which picture matches a highlighted letter or vowel shown in a bordered box. The programs use computed GOSUB targets (e.g., `GOSUB 200*L(K)+500` and `GOSUB 700*LS+100*L(K)+30*Z`) to dispatch to one of 26 picture-drawing subroutines covering letters A–Z and multiple vowel-sound variants. VowelTutor extends the concept with separate long and short vowel word sets per letter, selected by a random or user-chosen mode flag, and includes an animated nose-sniffing and hat/smile flip routine via `USR 16514`, pointing to a small machine-code delay loop stored in the REM statement at line 1.
Program Analysis
This listing contains two related programs: AlphaTutor and VowelTutor, both credited to Lou Goldstein / SoftSync Inc., 1982. AlphaTutor covers all 26 letters of the alphabet; VowelTutor extends the concept to long and short vowel sounds, offering multiple word variants per vowel. Both share the same core quiz loop and picture-rendering architecture.
Program Structure
Both programs follow the same top-level flow:
- Title/splash screen (lines 12–14), then
RAND to seed the RNG.
- Initialise arrays
P(3), W$(3,10), L(3) (lines 18–20).
- Main loop (lines 30–200): pick three distinct random indices, choose one as the target, dispatch to a drawing subroutine for each, display a letter/vowel prompt box, read a numeric answer, give feedback, pause, clear and repeat.
- Drawing subroutines: one per picture subject, each printing block-graphic art, setting
P(K) (label column) and W$(K) (word string).
VowelTutor adds a mode-selection screen (lines 23–27) offering long vowels, short vowels, or both, stored in LS, and allows the user to return to mode selection by entering 9.
Computed GOSUB Dispatch
The most architecturally notable feature is the use of arithmetic expressions as GOSUB targets to select picture subroutines without IF/THEN chains:
- AlphaTutor:
GOSUB 200*L(K)+500 — with L(K) in 0–25, this generates targets 500 (A=ambulance), 700 (B=boy), 900 (C=car) … 5500 (Z=zigzag), spaced 200 apart.
- VowelTutor:
GOSUB 700*LS+100*L(K)+30*Z — the LS factor (1=long, 2=short) shifts into a separate bank of subroutines; L(K) selects the vowel (1–5 = A/E/I/O/U); Z (0–2) selects one of up to three word variants per vowel per length.
This is a compact and efficient dispatch mechanism that avoids long IF/THEN chains entirely, at the cost of requiring subroutines to be placed at exactly the computed line numbers.
Machine Code Usage
Line 1 in both programs is a REM statement whose body encodes a short Z80 machine-code routine. The sequence \06\01\C5\06\64\00\10\FD\C1\10\F7\C9 disassembles as:
LD B,1 — outer loop count
PUSH BC
LD B,100 ; LD C,0 — inner delay count (25600 iterations)
DJNZ $ — inner loop
POP BC ; DJNZ … — outer loop
RET
This routine is called via LET E=USR 16514 (the address of the REM body in the VowelTutor variant is slightly longer, hence a different offset in practice). It is used as a simple software delay in animation sequences — for example, the hat flip in AlphaTutor (lines 1901–1906), the smile animation (lines 4101–4106), and the nose-sniffing effect (lines 1163–1168 in VowelTutor).
Key BASIC Idioms
- Block graphic art: All pictures are rendered using the ZX81/TS1000 block graphic characters (2×2 pixel sub-characters), encoded here as zmakebas escape sequences such as
\ ., \:., \'', etc.
- Distinct random selection: Lines 60 check
L(1)=L(2) OR L(1)=L(3) OR L(2)=L(3) and loop back if any two indices collide, ensuring three distinct pictures appear each round.
- Column positioning via formula:
LET X=10*K-5 (line 110) distributes the three picture columns evenly across the 32-character screen (columns 5, 15, 25).
- Answer box: The target letter is displayed in a bordered box drawn with block graphics at lines 19–21 using
AT positioning.
- PLOT for QUEEN and CONE: The subroutines at lines 3700 and 830 use
PLOT with pixel coordinates to draw vertical lines, since the block graphic resolution is insufficient for narrow strokes.
VowelTutor Word-Embedding Technique
In VowelTutor, word labels use a space character as a placeholder for the missing vowel (e.g., "TR% IN" for TRAIN, "K% TE" for KITE). After the round is set up, lines 151–155 scan W$(C) character-by-character to find the first "% " (space) position, then replace it with the actual vowel character A$ — effectively filling in the blank dynamically. This lets the same word string serve as both a gapped display and, after substitution, the correct spelled form.
Notable Subroutine Sharing
AlphaTutor’s GIRL subroutine (line 1700) is shared with BOY (line 700): the BOY subroutine calls GOSUB 1700 to draw the upper body, then the shared routine checks IF L(K)=1 THEN RETURN (line 1710) to exit early for BOY, or continues to draw the skirt/legs for GIRL. Similarly, VowelTutor’s WOMAN subroutine (line 4900) reuses the MAN subroutine (line 2900) for the head and torso, then overprints with different lower-body graphics.
Array Sizing
Array Dimensions Purpose P(3)3 elements Column position for each picture’s word label W$(3,10)3 strings × 10 chars Word associated with each picture slot L(3) / L(5)3 (Alpha) / 5 (Vowel) Random index for picture selection
Potential Anomalies
- AlphaTutor has no subroutine at the computed target for letter index 0 (line 500 handles A=0, as
200*0+500=500) — this is correct; L(K)=INT(RND*26) yields 0–25, mapping to lines 500–5500.
- VowelTutor’s
GOSUB 700*LS+100*L(K)+30*Z for LS=2 (short vowels) can yield targets like 1400+30*Z (lines 1400, 1430, 1460) which are not all defined in the listing — some short-vowel variant slots appear absent, which would cause a BASIC error if selected. This may reflect incomplete subroutine coverage in the original listing.
- The
PAUSE 33000 at line 14 provides a long title-screen pause (~30 seconds at normal speed) but any key press does not skip it — the user must wait it out unless they press BREAK.
- In VowelTutor, the
\## sequences in several subroutines (e.g., lines 1232, 1262, 1532) are not standard zmakebas escape sequences and likely represent inverse-video block characters or UDGs in the original tape file that were not fully decoded in this transcription.
Content
Source Code
1 REM \06\01\C5\06\64\00\10\FD\C1\10\F7\C9\2E\2E\2E\2E\2E\2E
2 SAVE "AB%C"
12 PRINT AT 8,11;"ALPHATUTOR";AT 10,2;"COPYRIGHT 1982 LOU GOLDSTEIN";AT 12,6;"% %F%R%O%M% %S%O%F%T%S%Y%N%C% %I%N%C% "
13 PRINT AT 20,5;"PRESS ""ENTER"" TO START"
14 PAUSE 33000
15 RAND
17 CLS
18 DIM P(3)
19 DIM W$(3,10)
20 DIM L(3)
30 FOR K=1 TO 3
40 LET L(K)=INT (RND*26)
50 NEXT K
60 IF L(1)=L(2) OR L(1)=L(3) OR L(2)=L(3) THEN GOTO 30
80 LET C=INT (RND*3)+1
90 LET A$=CHR$ (L(C)+38)
100 FOR K=1 TO 3
110 LET X=10*K-5
120 GOSUB 200*L(K)+500
121 PRINT AT 10,P(K);"% ";W$(K,2 TO )
130 PRINT AT 15,X;K
140 NEXT K
150 PRINT AT 19,14;"\:'\''\':";AT 20,14;"\: ";A$;"\ :";AT 21,14;"\:.\..\.:"
160 INPUT R
170 IF R<>C THEN PRINT AT 16,10*C-9;"% % % % % % % % % "
180 IF R=C THEN PRINT AT 16,10*C-9;"*********"
185 PRINT AT 13,P(C);W$(C)
190 PAUSE 250
195 CLS
200 GOTO 30
500 PRINT AT 3,X-3;"\..\..\..\..";AT 4,X-3;"\: \ . \ :";AT 5,X-3;"\: \':\' \ '\''\':";AT 6,X-3;"\:.\..\..\..\..\.:";AT 7,X-3;"\' \' "
501 LET P(K)=X-4
502 LET W$(K)="AMBULANCE"
510 RETURN
700 GOSUB 1700
710 PRINT AT 4,X;"\ :";AT 5,X;"\.'\. ";AT 6,X-1;"\.' \ '\. ";AT 7,X-2;"\.' \ '\. "
711 LET P(K)=X-1
712 LET W$(K)="BOY"
720 RETURN
900 PRINT AT 5,X-3;"\ :% % % ";AT 6,X-3;"\ :% % % % % ";AT 7,X-2;"\' \ '"
901 LET P(K)=X-1
902 LET W$(K)="CAR"
910 RETURN
1100 PRINT AT 1,X-4;"\ . \:.\. ";AT 2,X-3;"\'. % \. ";AT 3,X-2;"% % % ";AT 4,X-2;"\:'\''\':";AT 5,X-2;"\: \ :"
1101 LET P(K)=X-1
1102 LET W$(K)="DOG"
1110 RETURN
1300 PRINT AT 1,X-4;"\ .% % % \..";AT 2,X-4;"% % % % \.:";AT 3,X-4;"\':% % \:'\ '\..\' ";AT 4,X-4;"\ : \: "
1301 LET P(K)=X-4
1302 LET W$(K)="ELEPHANT"
1310 RETURN
1500 PRINT AT 1,X-4;"\ . \ .\..";AT 2,X-4;"\ :\:.\.:% % \':\. ";AT 3,X-4;"\ :% % % % % \. ";AT 4,X-4;"\ :\' \ '\':\:'\' "
1501 LET P(K)=X-2
1502 LET W$(K)="FISH"
1510 RETURN
1700 PRINT AT 0,X;"% \: ";AT 1,X;"\':\' ";AT 2,X-1;"\ .\':\'.";AT 3,X-1;"\' \ : \' "
1710 IF L(K)=1 THEN RETURN
1720 PRINT AT 4,X;"\.:\. ";AT 5,X-1;"\.:% % \. ";AT 6,X-2;"\ '\:'\''\''\:'";AT 7,X-1;"\: \: "
1721 LET P(K)=X-2
1722 LET W$(K)="GIRL"
1730 RETURN
1900 PRINT AT 1,X-2;">\ .\..\..\. <";AT 2,X-1;"\.:% % \:.";AT 3,X-1;"\ :..\: ";AT 4,X-1;"\ : \: ";AT 5,X-1;"\ :\ '\' \: ";AT 6,X;"\''\''"
1901 FOR F=1 TO 2
1902 PRINT AT 1,X-1;" ";AT 2,X-1;"\ .\..\..\. "
1903 LET E=USR 16514
1904 PRINT AT 1,X-1;"\ .\..\..\. ";AT 2,X-1;"\.:% % \:."
1905 LET E=USR 16514
1906 NEXT F
1907 LET P(K)=X-1
1908 LET W$(K)="HAT"
1910 RETURN
2100 PRINT AT 1,X-1;"\ :";AT 2,X-1;"\ :";AT 3,X-2;"\ .\''\''\''\. ";AT 4,X-2;"\ :\~~\~~\~~\: ";AT 5,X-2;"\ :\ ' \' \: ";AT 6,X-2;"\ :\ .\..\. \: ";AT 7,X-2;"\ '\..\..\..\' "
2101 LET P(K)=X-3
2102 LET W$(K)="INDIAN"
2110 RETURN
2300 PRINT AT 1,X-3;"---\:.";AT 2,X-3;"\':\..\..\.:\:.\..";AT 3,X-3;"\ :\..\..\..\..\..% >";AT 4,X-3;"---\ .\:'";AT 5,X-3;"---\:'"
2301 LET P(K)=X-1
2302 LET W$(K)="JET"
2310 RETURN
2500 LET P(K)=X-2
2522 LET W$(K)="KING"
2523 PRINT AT 1,X-2;"\. \. \. \. \. ";AT 2,X-2;"\':\''\''\':\' ";AT 3,X-2;"\ :\ '\ '\ :";AT 4,X-2;"\ : \' \ :";AT 5,X-2;"\ :\ '\''\ :";AT 6,X-1;"\':% \' "
2530 RETURN
2700 PRINT AT 2,X-3;"A B C D";AT 3,X-2;"E F G"
2701 LET P(K)=X-4
2702 LET W$(K)="LETTERS"
2710 RETURN
2900 PRINT AT 1,X;"% \: ";AT 2,X;"\':\' ";AT 3,X-1;"% % % \: ";AT 4,X-1;"\: % \: \: ";AT 5,X-1;"\' % \: \' "
2910 IF L(K)=22 THEN RETURN
2920 PRINT AT 6,X-1;"\ :% % ";AT 7,X-1;"\ :\: % ";AT 8,X-1;"\ :\: % "
2921 LET P(K)=X-1
2922 LET W$(K)="MAN"
2930 RETURN
3100 PRINT AT 3,X-3;"1 2 3 4";AT 4,X-2;"5 6 7"
3101 LET P(K)=X-3
3102 LET W$(K)="NUMBERS"
3110 RETURN
3300 PRINT AT 1,X-4;"\. ";AT 2,X-4;"\ '\'. \.:\. \..\. ";AT 3,X-2;"\':% % \''";AT 4,X-4;"\ .\.'\':% % \.. \.'";AT 5,X-4;"\' \ .\.'\.'\.'\. \''";AT 6,X-4;"\ .\' \ .\' \'.\ '\'.";AT 7,X-4;"\' \ .\' \ '\. "
3301 LET P(K)=X-3
3302 LET W$(K)="OCTOPUS"
3310 RETURN
3500 PRINT AT 5,X-2;"\..\..\..\..% ";AT 4,X+2;"*";AT 3,X+2;"*"
3501 LET P(K)=X-1
3502 LET W$(K)="PIPE"
3510 RETURN
3700 GOSUB 2500
3710 FOR Y=38 TO 29 STEP -1
3720 PLOT 2*X-4,Y
3730 PLOT 2*X+4,Y
3740 NEXT Y
3751 LET P(K)=X-2
3752 LET W$(K)="QUEEN"
3760 RETURN
3900 PRINT AT 1,X;"A";AT 2,X;"% ";AT 3,X;"% ";AT 4,X;"% ";AT 5,X;"% ";AT 6,X-1;"\..% \..";AT 7,X-1;"\' *\ '";AT 8,X;"*"
3901 LET P(K)=X-3
3902 LET W$(K)="ROCKET"
3910 RETURN
4100 PRINT AT 1,X-1;"\..\..\..";AT 2,X-2;"\ :\ . \. \: ";AT 3,X-2;"\ : \: ";AT 4,X-3;">\ :\ . \. \: <";AT 5,X-2;"\ : \'' \: ";AT 6,X-1;"\''\''\''"
4101 FOR F=1 TO 2
4102 PRINT AT 4,X-1;" ";AT 5,X-1;"\ '\''\' "
4103 LET E=USR 16514
4104 PRINT AT 4,X-1;"\ . \. ";AT 5,X-1;" \'' "
4105 LET E=USR 16514
4106 NEXT F
4107 LET P(K)=X-2
4108 LET W$(K)="SMILE"
4110 RETURN
4300 PRINT AT 1,X-1;"\ .% \. ";AT 2,X-2;"\ .% % % \. ";AT 3,X-2;"% % % % % ";AT 4,X-2;"\ '% % % \' ";AT 5,X-1;"\ '% \' ";AT 6,X;"% ";AT 7,X-1;"\ .% \. "
4301 LET P(K)=X-2
4302 LET W$(K)="TREE"
4310 RETURN
4500 PRINT AT 1,X;"\.:\. ";AT 2,X-1;"\.'\ :\ '\. ";AT 3,X;"\ :";AT 4,X;"\ :"
4501 LET P(K)=X-1
4502 LET W$(K)="UP"
4510 RETURN
4700 PRINT AT 2,X-2;"\ .\. \..";AT 3,X-2;"% % \. \.:% \: ";AT 4,X-2;"\':% % % % \' ";AT 5,X-1;"\':% % \' ";AT 6,X;"\':\' "
4701 LET P(K)=X-4
4702 LET W$(K)="VALENTINE"
4710 RETURN
4900 GOSUB 2900
4910 PRINT AT 6,X-1;"\.:% % \. ";AT 7,X-2;"\.:% % % % \. ";AT 8,X-1;"\ :\: % "
4911 LET P(K)=X-2
4912 LET W$(K)="WOMAN"
4920 RETURN
5100 PRINT AT 1,X-3;"\: \: \: \: \: \: \: ";AT 2,X-3;"\: \: \: \: \: \' ";AT 3,X-3;"\: \: \: \' \. ";AT 4,X-3;"\: \' \. /";AT 5,X-1;"/"
5101 LET P(K)=X-4
5102 LET W$(K)="XYLOPHONE"
5110 RETURN
5300 PRINT AT 1,X-1;"\ .% \. ";AT 2,X-1;"% % \':";AT 3,X-1;"% % % \. <";AT 4,X-1;"% % \''<";AT 5,X-1;"% % \.. <";AT 6,X-1;"\ :% "
5301 LET P(K)=X-1
5302 LET W$(K)="YELL"
5310 RETURN
5500 PRINT AT 3,X-2;"\.'\. \.'";AT 4,X-3;"\ ' \ '\. \.'\.'";AT 5,X;"\ '"
5501 LET P(K)=X-3
5502 LET W$(K)="ZIGZAG"
5510 RETURN
1 REM \06\01\C5\06\64\00\10\FD\C1\10\F7\C9\2E\2E\2E\2E\2E\2E\2E\2E\2E\2E\2E
2 SAVE "VOWE%L"
12 PRINT AT 8,11;"VOWELTUTOR";AT 10,2;"COPYRIGHT 1982 LOU GOLDSTEIN";AT 12,7;"% %F%R%O%M% %S%O%F%T%S%Y%N%C% %I%N%C% "
13 PRINT AT 20,5;"PRESS ""ENTER"" TO START"
14 PAUSE 33000
15 RAND
16 LET V$="AEIOU"
17 CLS
18 DIM P(3)
19 DIM W$(3,10)
20 DIM L(5)
23 PRINT AT 6,0;"WHICH VOWELS DO YOU WANT TO USE?1=LONG",,"2=SHORT",,"3=BOTH",,"4=EXIT PROGRAM"
24 INPUT O
25 LET LS=O
26 CLS
27 IF O=4 THEN STOP
30 IF O=3 THEN LET LS=INT (RND*2)+1
31 FOR K=1 TO 3
32 FAST
40 LET L(K)=INT (RND*5)+1
50 NEXT K
60 IF L(1)=L(2) OR L(1)=L(3) OR L(2)=L(3) THEN GOTO 31
80 LET C=INT (RND*3)+1
90 LET A$=V$(L(C))
99 SLOW
100 FOR K=1 TO 3
105 LET Z=INT (RND*3)
110 LET X=10*K-5
120 GOSUB 700*LS+100*L(K)+30*Z
121 PRINT AT 10,P(K);W$(K)
130 PRINT AT 15,X;K
140 NEXT K
150 PRINT AT 19,14;"\:'\''\':";AT 20,14;"\: ";A$;"\ :";AT 21,14;"\:.\..\.:"
151 FOR J=1 TO 10
152 IF W$(C,J)="% " THEN GOTO 155
153 NEXT J
155 LET W$(C,J)=A$
156 INPUT R
157 IF R=9 THEN CLS
160 IF R=9 THEN GOTO 23
170 IF R<>C THEN PRINT AT 16,10*C-9;"% % % % % % % % % "
180 IF R=C THEN PRINT AT 16,10*C-9;"*********"
185 PRINT AT 13,P(C);W$(C)
190 PAUSE 250
195 CLS
200 GOTO 30
800 LET W$(K)="TR% IN"
801 LET P(K)=X-2
802 PRINT AT 2,X-1;"*";AT 3,X;"*";AT 4,X;"\ :\..\. ";AT 5,X-4;"\ :% \.:% \.:% % >";AT 6,X-4;"\ '\ '\ '\ '\ ' \ '"
803 RETURN
830 LET W$(K)="C% NE"
831 LET P(K)=X-1
832 PRINT AT 1,X+1;"\' ";AT 0,X-1;"\ .\''\. "
833 FOR Y=41 TO 30 STEP -1
834 PLOT 2*X-1,Y
835 NEXT Y
836 RETURN
860 LET W$(K)="D% YS"
861 LET P(K)=X-2
862 PRINT AT 2,X-1;"FRI.";AT 4,X-1;"SAT.";AT 6,X-1;"SUN."
863 RETURN
900 LET W$(K)="K% Y"
901 LET P(K)=X-1
902 PRINT AT 3,X-3;"% % ";AT 4,X-3;"% % \:'\''\':% % \' ";AT 5,X-3;"% % \ '\ :\ '"
903 RETURN
930 LET W$(K)="THR% E"
931 LET P(K)=X-2
932 PRINT AT 3,X-1;"\''\''\: ";AT 4,X+1;"\: ";AT 5,X-1;"\ '\''\: ";AT 6,X+1;"\: ";AT 7,X-1;"\''\''\' "
933 RETURN
960 LET W$(K)="KN% E"
961 LET P(K)=X-2
962 PRINT AT 0,X+1;"% \: ";AT 1,X+1;"\':\' ";AT 2,X+1;"\: ";AT 3,X;"\ :\ '\..\. ";AT 4,X;"\: ";AT 5,X-1;"\ :\ '\. ";AT 6,X-1;"\ : \ '\. <";AT 7,X-2;"\ .\' \: ";AT 8,X-2;"\'. \''"
968 RETURN
1000 LET W$(K)="F% VE"
1001 LET P(K)=X-2
1002 PRINT AT 2,X-1;"\:'\''\' ";AT 3,X-1;"\:.\. ";AT 4,X;"\ '\. ";AT 5,X-1;"\. \ .\' ";AT 6,X-1;"\ '\' "
1003 RETURN
1030 LET W$(K)="K% TE"
1031 LET P(K)=X-2
1032 PRINT AT 0,X;"\.:\. ";AT 1,X-1;"\ .\':\'.";AT 2,X-1;"\.:\.:\.:\. ";AT 3,X-1;"\ :\ :\ :";AT 4,X;"% \: ";AT 5,X;"\ :";AT 6,X+1;"\'.";AT 7,X+1;"\.'";AT 8,X+1;"\ '"
1033 RETURN
1060 LET W$(K)="N% NE"
1061 LET P(K)=X-2
1063 PRINT AT 2,X-1;"\:'\''\: ";AT 3,X-1;"\: \: ";AT 4,X-1;"\''\''\: ";AT 5,X-1;"\. \: ";AT 6,X-1;"\''\''\' "
1064 RETURN
1100 LET W$(K)="B% AT"
1101 LET P(K)=X-2
1102 PRINT AT 1,X-2;"\..\..\..\..\. ";AT 2,X-2;"\ '\. \ '\. ";AT 3,X-1;"\.' \.'";AT 4,X-2;"\ '\''\':\''\''";AT 5,X-4;"\..\..\..\..\.:\..\..\..>";AT 6,X-4;"\':% % % % % \:'";AT 7,X-3;"\''\''\''\''\''"
1103 RETURN
1130 LET W$(K)="THR% W"
1131 LET P(K)=X-2
1132 PRINT AT 2,X+2;">";AT 3,X-2;"\ :% >\ '";AT 4,X-2;"\ '\:' \.'";AT 5,X-3;"\ .\''\:'\''";AT 6,X-3;"\' \: ";AT 7,X-2;"\.'\ '\. ";AT 8,X-3;"\ ' \ '"
1133 RETURN
1160 LET W$(K)="N% SE"
1161 LET P(K)=X-2
1162 PRINT AT 1,X-1;"\ .% \. ";AT 2,X-1;"% \:.\:.";AT 3,X-1;"% % \' ";AT 4,X-1;"\':\:'\' "
1163 FOR G=1 TO 3
1164 PRINT AT 2,1+X;"\: "
1165 LET U=USR 16514
1166 PRINT AT 2,X+1;"\:."
1167 LET U=USR 16514
1168 NEXT G
1169 RETURN
1200 LET W$(K)="% NITED"
1201 LET P(K)=X-3
1202 PRINT AT 1,X-3;"\..\..\..\..\..\. \.:";AT 2,X-4;"\ .% % % % % % \.:% ";AT 3,X-4;"\ :AMERICA\: ";AT 4,X-4;"\ '% % % % % % % \: ";AT 5,X-3;"\''\''% % % % % \: ";AT 6,X;"\':\:' \: ";AT 7,X+1;"\' "
1203 PRINT AT 11,P(K);"STATES"
1204 RETURN
1230 LET W$(K)="F% EL"
1231 LET P(K)=X-2
1232 PRINT AT 1,X-4;"\##\##\##";AT 2,X-4;"\##%G\##";AT 3,X-4;"\##%A\##";AT 4,X-4;"\##%S\##\'. \:'\''\':";AT 5,X-4;"\##\##\##\ '\..\:.\..\.:";AT 6,X-4;"\##\##\## % % % ";AT 7,X-4;"\##\##\## \: \ :"
1233 RETURN
1260 LET W$(K)="T% BE"
1261 LET P(K)=X-2
1262 PRINT AT 2,X-4;"\ .\..\..\..\..\..\..\..\. ";AT 3,X-4;"\ :\##TOOTH\##\:.";AT 4,X-4;"\ :\##PASTE\##\:'";AT 5,X-4;"\ '\''\''\''\''\''\''\''\' "
1263 RETURN
1500 LET W$(K)="FL% G"
1501 LET P(K)=X-2
1503 LET B=X-4
1504 PRINT AT 0,B;"\ .\..\..\..\..\..\..\..";AT 1,B;"\ :***\:'\''\''\':";AT 2,B;"\ :***\:'\''\''\':";AT 3,B;"\ :\''\''\''\''\''\''\':";AT 4,B;"\ :\''\''\''\''\''\''\':";AT 5,B;"\ :\''\''\''\''\''\''\''";AT 6,B;"\ :"
1505 RETURN
1530 LET W$(K)="% DD"
1531 LET P(K)=X-1
1532 PRINT AT 1,X-2;"3+2=\##";AT 3,X;"75";AT 4,X-1;"+23";AT 5,X-1;"\''\''\''"
1533 RETURN
1560 LET W$(K)="P% N"
1561 LET P(K)=X-1
1562 PRINT AT 3,X-3;"\..\..\..\..";AT 4,X-4;"\ :\' \ '\:.\..\..\..";AT 5,X-4;"\ :\:.\..\..\.:\: ";AT 6,X-4;"\ '% % % % \' "
1563 RETURN
1600 LET W$(K)="T% N"
1601 LET P(K)=X-1
1602 LET B=X-2
1603 PRINT AT 2,B;"\ : \:'\''\':";AT 3,B;"\ : \: \ :";AT 4,B;"\ : \: \ :";AT 5,B;"\ : \:.\..\.:"
1604 RETURN
1630 LET W$(K)="DR% SS"
1631 LET P(K)=X-2
1632 PRINT AT 1,X-2;"\.:\:.\.:\:.";AT 2,X-3;"\ '\:'% % \':\' ";AT 3,X-2;"\ .% % \. ";AT 4,X-3;"\ .% % % % \. ";AT 5,X-4;"\ .% % % % % % \. "
1633 RETURN
1660 LET W$(K)="L% G"
1661 LET P(K)=X-1
1662 LET B=X-1
1663 PRINT AT 0,X;"% \: ";AT 1,X;"\':\' ";AT 2,B;"% % % \: ";AT 3,B;"\: % \: \: ";AT 4,B;"\' % \: \' ";AT 5,B;"\ :% % ";AT 6,B;"\ :\: \##<";AT 7,B;"\ :\: \##<"
1664 RETURN
1700 LET W$(K)="S% X"
1701 LET P(K)=X-1
1702 LET B=X-1
1703 PRINT AT 1,X;"\..";AT 2,B;"\.' \' ";AT 3,B;"\: ";AT 4,B;"\:.\''\'.";AT 5,B;"\: \ :";AT 6,B;"\ '\..\' "
1704 RETURN
1730 LET W$(K)="SH% P"
1731 LET P(K)=X-2
1732 PRINT AT 3,X-3;"\..\:.\:.\. ";AT 4,X-5;"\ .\..% \:'% \:'% \:'% \:'";AT 5,X-4;"\':\:.% \:.% \:.% \:'";AT 6,X-5;"\@@\@@\@@\@@\@@\@@\@@\@@\@@\@@"
1733 RETURN
1760 LET W$(K)="WR% ST"
1761 LET P(K)=X-2
1762 LET B=X-1
1763 PRINT AT 0,B;"\..\..\..";AT 1,B;"\:'% \':";AT 2,B;"% \''% ";AT 3,B;"\''% \''"
1764 LET B=X-2
1765 PRINT AT 4,B;"% % % % % ";AT 5,B;"% \ :% \: % ";AT 6,B-1;">\##\ :% \: \##<";AT 7,B;"W W"
1766 RETURN
1800 LET W$(K)="P% T"
1801 LET P(K)=X-1
1802 PRINT AT 1,X-2;"\..";AT 2,X-4;"\ .\'' \''\. ";AT 3,X-4;"\:. \.:\..\..\..";AT 4,X-4;"% % \..% % ";AT 5,X-4;"\':% % % \:'";AT 6,X-3;"\ '\''\' "
1803 RETURN
1830 LET W$(K)="CL% CK"
1831 LET P(K)=X-3
1832 PRINT AT 1,X;"\..\. ";AT 2,X-2;"\ .\''\ .\ '\'.";AT 3,X-2;"\: \ : \: ";AT 4,X-3;"\ : \ :\..\. \ :";AT 5,X-3;"\ '\. \.'";AT 6,X-2;"\'. \ .\' ";AT 7,X-1;"\''\..\.'\' "
1833 RETURN
1860 LET W$(K)="ST% P"
1861 LET P(K)=X-2
1862 PRINT AT 0,X-2;"\ .% % \. ";AT 1,X-3;"\ .% % % % \. ";AT 2,X-3;"% ST P% ";AT 3,X-3;"% % % % % % ";AT 4,X-3;"\ '% % % % \' ";AT 5,X-2;"\ '% % \' ";AT 6,X-1;"\ :\: ";AT 7,X-1;"\ :\: "
1863 RETURN
1900 LET W$(K)="G% N"
1901 LET P(K)=X-1
1902 LET B=X-4
1903 PRINT AT 2,B;"\ :% % % % % -->";AT 3,B;"\ :\: \: \:'\''";AT 4,B;"\ :\:.\..\: ";AT 5,B;"\ :\: "
1904 RETURN
1930 LET W$(K)="DR% M"
1931 LET P(K)=X-2
1932 PRINT AT 0,X+2;"/";AT 1,X-1;"\.. \ ' /";AT 2,X-3;"\ .\'' \''\. \ '";AT 3,X-3;"\:. \.:";AT 4,X-3;"% % \..% % ";AT 5,X-3;"\':% % % \:'";AT 6,X-2;"\ '\''\' "
1933 RETURN
1960 LET W$(K)="B% S"
1961 LET P(K)=X-1
1962 LET B=X-3
1963 PRINT AT 2,B;"% \''\:'\':\''% % ";AT 3,B;"% \..\:.\.:\..% \ :% ";AT 4,B;"% % % % % % \.:% ";AT 5,B+1;"\' \ '"
1964 RETURN
Note: Type-in program listings on this website use ZMAKEBAS notation for graphics characters.
People
E
Skip to content
Computer Tutor
Products: Computer Tutors: Alpha/Vowel Tutors
Developer(s): Lou Goldstein
Date: 1982
Type: Cassette
Platform(s): TS 1000
Tags: Education
AlphaTutor and VowelTutor are a paired set of educational programs designed to teach children letter recognition and vowel sounds through a picture-matching quiz format. Each round randomly selects three images drawn entirely in block graphics, displays them with numbered labels, and prompts the child to identify which picture matches a highlighted letter or vowel shown in a bordered box. The programs use computed GOSUB targets (e.g., `GOSUB 200*L(K)+500` and `GOSUB 700*LS+100*L(K)+30*Z`) to dispatch to one of 26 picture-drawing subroutines covering letters A–Z and multiple vowel-sound variants. VowelTutor extends the concept with separate long and short vowel word sets per letter, selected by a random or user-chosen mode flag, and includes an animated nose-sniffing and hat/smile flip routine via `USR 16514`, pointing to a small machine-code delay loop stored in the REM statement at line 1.
Program Analysis
This listing contains two related programs: AlphaTutor and VowelTutor, both credited to Lou Goldstein / SoftSync Inc., 1982. AlphaTutor covers all 26 letters of the alphabet; VowelTutor extends the concept to long and short vowel sounds, offering multiple word variants per vowel. Both share the same core quiz loop and picture-rendering architecture.
Program Structure
Both programs follow the same top-level flow:
- Title/splash screen (lines 12–14), then
RAND to seed the RNG.
- Initialise arrays
P(3), W$(3,10), L(3) (lines 18–20).
- Main loop (lines 30–200): pick three distinct random indices, choose one as the target, dispatch to a drawing subroutine for each, display a letter/vowel prompt box, read a numeric answer, give feedback, pause, clear and repeat.
- Drawing subroutines: one per picture subject, each printing block-graphic art, setting
P(K) (label column) and W$(K) (word string).
VowelTutor adds a mode-selection screen (lines 23–27) offering long vowels, short vowels, or both, stored in LS, and allows the user to return to mode selection by entering 9.
Computed GOSUB Dispatch
The most architecturally notable feature is the use of arithmetic expressions as GOSUB targets to select picture subroutines without IF/THEN chains:
- AlphaTutor:
GOSUB 200*L(K)+500 — with L(K) in 0–25, this generates targets 500 (A=ambulance), 700 (B=boy), 900 (C=car) … 5500 (Z=zigzag), spaced 200 apart.
- VowelTutor:
GOSUB 700*LS+100*L(K)+30*Z — the LS factor (1=long, 2=short) shifts into a separate bank of subroutines; L(K) selects the vowel (1–5 = A/E/I/O/U); Z (0–2) selects one of up to three word variants per vowel per length.
This is a compact and efficient dispatch mechanism that avoids long IF/THEN chains entirely, at the cost of requiring subroutines to be placed at exactly the computed line numbers.
Machine Code Usage
Line 1 in both programs is a REM statement whose body encodes a short Z80 machine-code routine. The sequence \06\01\C5\06\64\00\10\FD\C1\10\F7\C9 disassembles as:
LD B,1 — outer loop count
PUSH BC
LD B,100 ; LD C,0 — inner delay count (25600 iterations)
DJNZ $ — inner loop
POP BC ; DJNZ … — outer loop
RET
This routine is called via LET E=USR 16514 (the address of the REM body in the VowelTutor variant is slightly longer, hence a different offset in practice). It is used as a simple software delay in animation sequences — for example, the hat flip in AlphaTutor (lines 1901–1906), the smile animation (lines 4101–4106), and the nose-sniffing effect (lines 1163–1168 in VowelTutor).
Key BASIC Idioms
- Block graphic art: All pictures are rendered using the ZX81/TS1000 block graphic characters (2×2 pixel sub-characters), encoded here as zmakebas escape sequences such as
\ ., \:., \'', etc.
- Distinct random selection: Lines 60 check
L(1)=L(2) OR L(1)=L(3) OR L(2)=L(3) and loop back if any two indices collide, ensuring three distinct pictures appear each round.
- Column positioning via formula:
LET X=10*K-5 (line 110) distributes the three picture columns evenly across the 32-character screen (columns 5, 15, 25).
- Answer box: The target letter is displayed in a bordered box drawn with block graphics at lines 19–21 using
AT positioning.
- PLOT for QUEEN and CONE: The subroutines at lines 3700 and 830 use
PLOT with pixel coordinates to draw vertical lines, since the block graphic resolution is insufficient for narrow strokes.
VowelTutor Word-Embedding Technique
In VowelTutor, word labels use a space character as a placeholder for the missing vowel (e.g., "TR% IN" for TRAIN, "K% TE" for KITE). After the round is set up, lines 151–155 scan W$(C) character-by-character to find the first "% " (space) position, then replace it with the actual vowel character A$ — effectively filling in the blank dynamically. This lets the same word string serve as both a gapped display and, after substitution, the correct spelled form.
Notable Subroutine Sharing
AlphaTutor’s GIRL subroutine (line 1700) is shared with BOY (line 700): the BOY subroutine calls GOSUB 1700 to draw the upper body, then the shared routine checks IF L(K)=1 THEN RETURN (line 1710) to exit early for BOY, or continues to draw the skirt/legs for GIRL. Similarly, VowelTutor’s WOMAN subroutine (line 4900) reuses the MAN subroutine (line 2900) for the head and torso, then overprints with different lower-body graphics.
Array Sizing
Array Dimensions Purpose P(3)3 elements Column position for each picture’s word label W$(3,10)3 strings × 10 chars Word associated with each picture slot L(3) / L(5)3 (Alpha) / 5 (Vowel) Random index for picture selection
Potential Anomalies
- AlphaTutor has no subroutine at the computed target for letter index 0 (line 500 handles A=0, as
200*0+500=500) — this is correct; L(K)=INT(RND*26) yields 0–25, mapping to lines 500–5500.
- VowelTutor’s
GOSUB 700*LS+100*L(K)+30*Z for LS=2 (short vowels) can yield targets like 1400+30*Z (lines 1400, 1430, 1460) which are not all defined in the listing — some short-vowel variant slots appear absent, which would cause a BASIC error if selected. This may reflect incomplete subroutine coverage in the original listing.
- The
PAUSE 33000 at line 14 provides a long title-screen pause (~30 seconds at normal speed) but any key press does not skip it — the user must wait it out unless they press BREAK.
- In VowelTutor, the
\## sequences in several subroutines (e.g., lines 1232, 1262, 1532) are not standard zmakebas escape sequences and likely represent inverse-video block characters or UDGs in the original tape file that were not fully decoded in this transcription.
Content
Source Code
1 REM \06\01\C5\06\64\00\10\FD\C1\10\F7\C9\2E\2E\2E\2E\2E\2E
2 SAVE "AB%C"
12 PRINT AT 8,11;"ALPHATUTOR";AT 10,2;"COPYRIGHT 1982 LOU GOLDSTEIN";AT 12,6;"% %F%R%O%M% %S%O%F%T%S%Y%N%C% %I%N%C% "
13 PRINT AT 20,5;"PRESS ""ENTER"" TO START"
14 PAUSE 33000
15 RAND
17 CLS
18 DIM P(3)
19 DIM W$(3,10)
20 DIM L(3)
30 FOR K=1 TO 3
40 LET L(K)=INT (RND*26)
50 NEXT K
60 IF L(1)=L(2) OR L(1)=L(3) OR L(2)=L(3) THEN GOTO 30
80 LET C=INT (RND*3)+1
90 LET A$=CHR$ (L(C)+38)
100 FOR K=1 TO 3
110 LET X=10*K-5
120 GOSUB 200*L(K)+500
121 PRINT AT 10,P(K);"% ";W$(K,2 TO )
130 PRINT AT 15,X;K
140 NEXT K
150 PRINT AT 19,14;"\:'\''\':";AT 20,14;"\: ";A$;"\ :";AT 21,14;"\:.\..\.:"
160 INPUT R
170 IF R<>C THEN PRINT AT 16,10*C-9;"% % % % % % % % % "
180 IF R=C THEN PRINT AT 16,10*C-9;"*********"
185 PRINT AT 13,P(C);W$(C)
190 PAUSE 250
195 CLS
200 GOTO 30
500 PRINT AT 3,X-3;"\..\..\..\..";AT 4,X-3;"\: \ . \ :";AT 5,X-3;"\: \':\' \ '\''\':";AT 6,X-3;"\:.\..\..\..\..\.:";AT 7,X-3;"\' \' "
501 LET P(K)=X-4
502 LET W$(K)="AMBULANCE"
510 RETURN
700 GOSUB 1700
710 PRINT AT 4,X;"\ :";AT 5,X;"\.'\. ";AT 6,X-1;"\.' \ '\. ";AT 7,X-2;"\.' \ '\. "
711 LET P(K)=X-1
712 LET W$(K)="BOY"
720 RETURN
900 PRINT AT 5,X-3;"\ :% % % ";AT 6,X-3;"\ :% % % % % ";AT 7,X-2;"\' \ '"
901 LET P(K)=X-1
902 LET W$(K)="CAR"
910 RETURN
1100 PRINT AT 1,X-4;"\ . \:.\. ";AT 2,X-3;"\'. % \. ";AT 3,X-2;"% % % ";AT 4,X-2;"\:'\''\':";AT 5,X-2;"\: \ :"
1101 LET P(K)=X-1
1102 LET W$(K)="DOG"
1110 RETURN
1300 PRINT AT 1,X-4;"\ .% % % \..";AT 2,X-4;"% % % % \.:";AT 3,X-4;"\':% % \:'\ '\..\' ";AT 4,X-4;"\ : \: "
1301 LET P(K)=X-4
1302 LET W$(K)="ELEPHANT"
1310 RETURN
1500 PRINT AT 1,X-4;"\ . \ .\..";AT 2,X-4;"\ :\:.\.:% % \':\. ";AT 3,X-4;"\ :% % % % % \. ";AT 4,X-4;"\ :\' \ '\':\:'\' "
1501 LET P(K)=X-2
1502 LET W$(K)="FISH"
1510 RETURN
1700 PRINT AT 0,X;"% \: ";AT 1,X;"\':\' ";AT 2,X-1;"\ .\':\'.";AT 3,X-1;"\' \ : \' "
1710 IF L(K)=1 THEN RETURN
1720 PRINT AT 4,X;"\.:\. ";AT 5,X-1;"\.:% % \. ";AT 6,X-2;"\ '\:'\''\''\:'";AT 7,X-1;"\: \: "
1721 LET P(K)=X-2
1722 LET W$(K)="GIRL"
1730 RETURN
1900 PRINT AT 1,X-2;">\ .\..\..\. <";AT 2,X-1;"\.:% % \:.";AT 3,X-1;"\ :..\: ";AT 4,X-1;"\ : \: ";AT 5,X-1;"\ :\ '\' \: ";AT 6,X;"\''\''"
1901 FOR F=1 TO 2
1902 PRINT AT 1,X-1;" ";AT 2,X-1;"\ .\..\..\. "
1903 LET E=USR 16514
1904 PRINT AT 1,X-1;"\ .\..\..\. ";AT 2,X-1;"\.:% % \:."
1905 LET E=USR 16514
1906 NEXT F
1907 LET P(K)=X-1
1908 LET W$(K)="HAT"
1910 RETURN
2100 PRINT AT 1,X-1;"\ :";AT 2,X-1;"\ :";AT 3,X-2;"\ .\''\''\''\. ";AT 4,X-2;"\ :\~~\~~\~~\: ";AT 5,X-2;"\ :\ ' \' \: ";AT 6,X-2;"\ :\ .\..\. \: ";AT 7,X-2;"\ '\..\..\..\' "
2101 LET P(K)=X-3
2102 LET W$(K)="INDIAN"
2110 RETURN
2300 PRINT AT 1,X-3;"---\:.";AT 2,X-3;"\':\..\..\.:\:.\..";AT 3,X-3;"\ :\..\..\..\..\..% >";AT 4,X-3;"---\ .\:'";AT 5,X-3;"---\:'"
2301 LET P(K)=X-1
2302 LET W$(K)="JET"
2310 RETURN
2500 LET P(K)=X-2
2522 LET W$(K)="KING"
2523 PRINT AT 1,X-2;"\. \. \. \. \. ";AT 2,X-2;"\':\''\''\':\' ";AT 3,X-2;"\ :\ '\ '\ :";AT 4,X-2;"\ : \' \ :";AT 5,X-2;"\ :\ '\''\ :";AT 6,X-1;"\':% \' "
2530 RETURN
2700 PRINT AT 2,X-3;"A B C D";AT 3,X-2;"E F G"
2701 LET P(K)=X-4
2702 LET W$(K)="LETTERS"
2710 RETURN
2900 PRINT AT 1,X;"% \: ";AT 2,X;"\':\' ";AT 3,X-1;"% % % \: ";AT 4,X-1;"\: % \: \: ";AT 5,X-1;"\' % \: \' "
2910 IF L(K)=22 THEN RETURN
2920 PRINT AT 6,X-1;"\ :% % ";AT 7,X-1;"\ :\: % ";AT 8,X-1;"\ :\: % "
2921 LET P(K)=X-1
2922 LET W$(K)="MAN"
2930 RETURN
3100 PRINT AT 3,X-3;"1 2 3 4";AT 4,X-2;"5 6 7"
3101 LET P(K)=X-3
3102 LET W$(K)="NUMBERS"
3110 RETURN
3300 PRINT AT 1,X-4;"\. ";AT 2,X-4;"\ '\'. \.:\. \..\. ";AT 3,X-2;"\':% % \''";AT 4,X-4;"\ .\.'\':% % \.. \.'";AT 5,X-4;"\' \ .\.'\.'\.'\. \''";AT 6,X-4;"\ .\' \ .\' \'.\ '\'.";AT 7,X-4;"\' \ .\' \ '\. "
3301 LET P(K)=X-3
3302 LET W$(K)="OCTOPUS"
3310 RETURN
3500 PRINT AT 5,X-2;"\..\..\..\..% ";AT 4,X+2;"*";AT 3,X+2;"*"
3501 LET P(K)=X-1
3502 LET W$(K)="PIPE"
3510 RETURN
3700 GOSUB 2500
3710 FOR Y=38 TO 29 STEP -1
3720 PLOT 2*X-4,Y
3730 PLOT 2*X+4,Y
3740 NEXT Y
3751 LET P(K)=X-2
3752 LET W$(K)="QUEEN"
3760 RETURN
3900 PRINT AT 1,X;"A";AT 2,X;"% ";AT 3,X;"% ";AT 4,X;"% ";AT 5,X;"% ";AT 6,X-1;"\..% \..";AT 7,X-1;"\' *\ '";AT 8,X;"*"
3901 LET P(K)=X-3
3902 LET W$(K)="ROCKET"
3910 RETURN
4100 PRINT AT 1,X-1;"\..\..\..";AT 2,X-2;"\ :\ . \. \: ";AT 3,X-2;"\ : \: ";AT 4,X-3;">\ :\ . \. \: <";AT 5,X-2;"\ : \'' \: ";AT 6,X-1;"\''\''\''"
4101 FOR F=1 TO 2
4102 PRINT AT 4,X-1;" ";AT 5,X-1;"\ '\''\' "
4103 LET E=USR 16514
4104 PRINT AT 4,X-1;"\ . \. ";AT 5,X-1;" \'' "
4105 LET E=USR 16514
4106 NEXT F
4107 LET P(K)=X-2
4108 LET W$(K)="SMILE"
4110 RETURN
4300 PRINT AT 1,X-1;"\ .% \. ";AT 2,X-2;"\ .% % % \. ";AT 3,X-2;"% % % % % ";AT 4,X-2;"\ '% % % \' ";AT 5,X-1;"\ '% \' ";AT 6,X;"% ";AT 7,X-1;"\ .% \. "
4301 LET P(K)=X-2
4302 LET W$(K)="TREE"
4310 RETURN
4500 PRINT AT 1,X;"\.:\. ";AT 2,X-1;"\.'\ :\ '\. ";AT 3,X;"\ :";AT 4,X;"\ :"
4501 LET P(K)=X-1
4502 LET W$(K)="UP"
4510 RETURN
4700 PRINT AT 2,X-2;"\ .\. \..";AT 3,X-2;"% % \. \.:% \: ";AT 4,X-2;"\':% % % % \' ";AT 5,X-1;"\':% % \' ";AT 6,X;"\':\' "
4701 LET P(K)=X-4
4702 LET W$(K)="VALENTINE"
4710 RETURN
4900 GOSUB 2900
4910 PRINT AT 6,X-1;"\.:% % \. ";AT 7,X-2;"\.:% % % % \. ";AT 8,X-1;"\ :\: % "
4911 LET P(K)=X-2
4912 LET W$(K)="WOMAN"
4920 RETURN
5100 PRINT AT 1,X-3;"\: \: \: \: \: \: \: ";AT 2,X-3;"\: \: \: \: \: \' ";AT 3,X-3;"\: \: \: \' \. ";AT 4,X-3;"\: \' \. /";AT 5,X-1;"/"
5101 LET P(K)=X-4
5102 LET W$(K)="XYLOPHONE"
5110 RETURN
5300 PRINT AT 1,X-1;"\ .% \. ";AT 2,X-1;"% % \':";AT 3,X-1;"% % % \. <";AT 4,X-1;"% % \''<";AT 5,X-1;"% % \.. <";AT 6,X-1;"\ :% "
5301 LET P(K)=X-1
5302 LET W$(K)="YELL"
5310 RETURN
5500 PRINT AT 3,X-2;"\.'\. \.'";AT 4,X-3;"\ ' \ '\. \.'\.'";AT 5,X;"\ '"
5501 LET P(K)=X-3
5502 LET W$(K)="ZIGZAG"
5510 RETURN
1 REM \06\01\C5\06\64\00\10\FD\C1\10\F7\C9\2E\2E\2E\2E\2E\2E\2E\2E\2E\2E\2E
2 SAVE "VOWE%L"
12 PRINT AT 8,11;"VOWELTUTOR";AT 10,2;"COPYRIGHT 1982 LOU GOLDSTEIN";AT 12,7;"% %F%R%O%M% %S%O%F%T%S%Y%N%C% %I%N%C% "
13 PRINT AT 20,5;"PRESS ""ENTER"" TO START"
14 PAUSE 33000
15 RAND
16 LET V$="AEIOU"
17 CLS
18 DIM P(3)
19 DIM W$(3,10)
20 DIM L(5)
23 PRINT AT 6,0;"WHICH VOWELS DO YOU WANT TO USE?1=LONG",,"2=SHORT",,"3=BOTH",,"4=EXIT PROGRAM"
24 INPUT O
25 LET LS=O
26 CLS
27 IF O=4 THEN STOP
30 IF O=3 THEN LET LS=INT (RND*2)+1
31 FOR K=1 TO 3
32 FAST
40 LET L(K)=INT (RND*5)+1
50 NEXT K
60 IF L(1)=L(2) OR L(1)=L(3) OR L(2)=L(3) THEN GOTO 31
80 LET C=INT (RND*3)+1
90 LET A$=V$(L(C))
99 SLOW
100 FOR K=1 TO 3
105 LET Z=INT (RND*3)
110 LET X=10*K-5
120 GOSUB 700*LS+100*L(K)+30*Z
121 PRINT AT 10,P(K);W$(K)
130 PRINT AT 15,X;K
140 NEXT K
150 PRINT AT 19,14;"\:'\''\':";AT 20,14;"\: ";A$;"\ :";AT 21,14;"\:.\..\.:"
151 FOR J=1 TO 10
152 IF W$(C,J)="% " THEN GOTO 155
153 NEXT J
155 LET W$(C,J)=A$
156 INPUT R
157 IF R=9 THEN CLS
160 IF R=9 THEN GOTO 23
170 IF R<>C THEN PRINT AT 16,10*C-9;"% % % % % % % % % "
180 IF R=C THEN PRINT AT 16,10*C-9;"*********"
185 PRINT AT 13,P(C);W$(C)
190 PAUSE 250
195 CLS
200 GOTO 30
800 LET W$(K)="TR% IN"
801 LET P(K)=X-2
802 PRINT AT 2,X-1;"*";AT 3,X;"*";AT 4,X;"\ :\..\. ";AT 5,X-4;"\ :% \.:% \.:% % >";AT 6,X-4;"\ '\ '\ '\ '\ ' \ '"
803 RETURN
830 LET W$(K)="C% NE"
831 LET P(K)=X-1
832 PRINT AT 1,X+1;"\' ";AT 0,X-1;"\ .\''\. "
833 FOR Y=41 TO 30 STEP -1
834 PLOT 2*X-1,Y
835 NEXT Y
836 RETURN
860 LET W$(K)="D% YS"
861 LET P(K)=X-2
862 PRINT AT 2,X-1;"FRI.";AT 4,X-1;"SAT.";AT 6,X-1;"SUN."
863 RETURN
900 LET W$(K)="K% Y"
901 LET P(K)=X-1
902 PRINT AT 3,X-3;"% % ";AT 4,X-3;"% % \:'\''\':% % \' ";AT 5,X-3;"% % \ '\ :\ '"
903 RETURN
930 LET W$(K)="THR% E"
931 LET P(K)=X-2
932 PRINT AT 3,X-1;"\''\''\: ";AT 4,X+1;"\: ";AT 5,X-1;"\ '\''\: ";AT 6,X+1;"\: ";AT 7,X-1;"\''\''\' "
933 RETURN
960 LET W$(K)="KN% E"
961 LET P(K)=X-2
962 PRINT AT 0,X+1;"% \: ";AT 1,X+1;"\':\' ";AT 2,X+1;"\: ";AT 3,X;"\ :\ '\..\. ";AT 4,X;"\: ";AT 5,X-1;"\ :\ '\. ";AT 6,X-1;"\ : \ '\. <";AT 7,X-2;"\ .\' \: ";AT 8,X-2;"\'. \''"
968 RETURN
1000 LET W$(K)="F% VE"
1001 LET P(K)=X-2
1002 PRINT AT 2,X-1;"\:'\''\' ";AT 3,X-1;"\:.\. ";AT 4,X;"\ '\. ";AT 5,X-1;"\. \ .\' ";AT 6,X-1;"\ '\' "
1003 RETURN
1030 LET W$(K)="K% TE"
1031 LET P(K)=X-2
1032 PRINT AT 0,X;"\.:\. ";AT 1,X-1;"\ .\':\'.";AT 2,X-1;"\.:\.:\.:\. ";AT 3,X-1;"\ :\ :\ :";AT 4,X;"% \: ";AT 5,X;"\ :";AT 6,X+1;"\'.";AT 7,X+1;"\.'";AT 8,X+1;"\ '"
1033 RETURN
1060 LET W$(K)="N% NE"
1061 LET P(K)=X-2
1063 PRINT AT 2,X-1;"\:'\''\: ";AT 3,X-1;"\: \: ";AT 4,X-1;"\''\''\: ";AT 5,X-1;"\. \: ";AT 6,X-1;"\''\''\' "
1064 RETURN
1100 LET W$(K)="B% AT"
1101 LET P(K)=X-2
1102 PRINT AT 1,X-2;"\..\..\..\..\. ";AT 2,X-2;"\ '\. \ '\. ";AT 3,X-1;"\.' \.'";AT 4,X-2;"\ '\''\':\''\''";AT 5,X-4;"\..\..\..\..\.:\..\..\..>";AT 6,X-4;"\':% % % % % \:'";AT 7,X-3;"\''\''\''\''\''"
1103 RETURN
1130 LET W$(K)="THR% W"
1131 LET P(K)=X-2
1132 PRINT AT 2,X+2;">";AT 3,X-2;"\ :% >\ '";AT 4,X-2;"\ '\:' \.'";AT 5,X-3;"\ .\''\:'\''";AT 6,X-3;"\' \: ";AT 7,X-2;"\.'\ '\. ";AT 8,X-3;"\ ' \ '"
1133 RETURN
1160 LET W$(K)="N% SE"
1161 LET P(K)=X-2
1162 PRINT AT 1,X-1;"\ .% \. ";AT 2,X-1;"% \:.\:.";AT 3,X-1;"% % \' ";AT 4,X-1;"\':\:'\' "
1163 FOR G=1 TO 3
1164 PRINT AT 2,1+X;"\: "
1165 LET U=USR 16514
1166 PRINT AT 2,X+1;"\:."
1167 LET U=USR 16514
1168 NEXT G
1169 RETURN
1200 LET W$(K)="% NITED"
1201 LET P(K)=X-3
1202 PRINT AT 1,X-3;"\..\..\..\..\..\. \.:";AT 2,X-4;"\ .% % % % % % \.:% ";AT 3,X-4;"\ :AMERICA\: ";AT 4,X-4;"\ '% % % % % % % \: ";AT 5,X-3;"\''\''% % % % % \: ";AT 6,X;"\':\:' \: ";AT 7,X+1;"\' "
1203 PRINT AT 11,P(K);"STATES"
1204 RETURN
1230 LET W$(K)="F% EL"
1231 LET P(K)=X-2
1232 PRINT AT 1,X-4;"\##\##\##";AT 2,X-4;"\##%G\##";AT 3,X-4;"\##%A\##";AT 4,X-4;"\##%S\##\'. \:'\''\':";AT 5,X-4;"\##\##\##\ '\..\:.\..\.:";AT 6,X-4;"\##\##\## % % % ";AT 7,X-4;"\##\##\## \: \ :"
1233 RETURN
1260 LET W$(K)="T% BE"
1261 LET P(K)=X-2
1262 PRINT AT 2,X-4;"\ .\..\..\..\..\..\..\..\. ";AT 3,X-4;"\ :\##TOOTH\##\:.";AT 4,X-4;"\ :\##PASTE\##\:'";AT 5,X-4;"\ '\''\''\''\''\''\''\''\' "
1263 RETURN
1500 LET W$(K)="FL% G"
1501 LET P(K)=X-2
1503 LET B=X-4
1504 PRINT AT 0,B;"\ .\..\..\..\..\..\..\..";AT 1,B;"\ :***\:'\''\''\':";AT 2,B;"\ :***\:'\''\''\':";AT 3,B;"\ :\''\''\''\''\''\''\':";AT 4,B;"\ :\''\''\''\''\''\''\':";AT 5,B;"\ :\''\''\''\''\''\''\''";AT 6,B;"\ :"
1505 RETURN
1530 LET W$(K)="% DD"
1531 LET P(K)=X-1
1532 PRINT AT 1,X-2;"3+2=\##";AT 3,X;"75";AT 4,X-1;"+23";AT 5,X-1;"\''\''\''"
1533 RETURN
1560 LET W$(K)="P% N"
1561 LET P(K)=X-1
1562 PRINT AT 3,X-3;"\..\..\..\..";AT 4,X-4;"\ :\' \ '\:.\..\..\..";AT 5,X-4;"\ :\:.\..\..\.:\: ";AT 6,X-4;"\ '% % % % \' "
1563 RETURN
1600 LET W$(K)="T% N"
1601 LET P(K)=X-1
1602 LET B=X-2
1603 PRINT AT 2,B;"\ : \:'\''\':";AT 3,B;"\ : \: \ :";AT 4,B;"\ : \: \ :";AT 5,B;"\ : \:.\..\.:"
1604 RETURN
1630 LET W$(K)="DR% SS"
1631 LET P(K)=X-2
1632 PRINT AT 1,X-2;"\.:\:.\.:\:.";AT 2,X-3;"\ '\:'% % \':\' ";AT 3,X-2;"\ .% % \. ";AT 4,X-3;"\ .% % % % \. ";AT 5,X-4;"\ .% % % % % % \. "
1633 RETURN
1660 LET W$(K)="L% G"
1661 LET P(K)=X-1
1662 LET B=X-1
1663 PRINT AT 0,X;"% \: ";AT 1,X;"\':\' ";AT 2,B;"% % % \: ";AT 3,B;"\: % \: \: ";AT 4,B;"\' % \: \' ";AT 5,B;"\ :% % ";AT 6,B;"\ :\: \##<";AT 7,B;"\ :\: \##<"
1664 RETURN
1700 LET W$(K)="S% X"
1701 LET P(K)=X-1
1702 LET B=X-1
1703 PRINT AT 1,X;"\..";AT 2,B;"\.' \' ";AT 3,B;"\: ";AT 4,B;"\:.\''\'.";AT 5,B;"\: \ :";AT 6,B;"\ '\..\' "
1704 RETURN
1730 LET W$(K)="SH% P"
1731 LET P(K)=X-2
1732 PRINT AT 3,X-3;"\..\:.\:.\. ";AT 4,X-5;"\ .\..% \:'% \:'% \:'% \:'";AT 5,X-4;"\':\:.% \:.% \:.% \:'";AT 6,X-5;"\@@\@@\@@\@@\@@\@@\@@\@@\@@\@@"
1733 RETURN
1760 LET W$(K)="WR% ST"
1761 LET P(K)=X-2
1762 LET B=X-1
1763 PRINT AT 0,B;"\..\..\..";AT 1,B;"\:'% \':";AT 2,B;"% \''% ";AT 3,B;"\''% \''"
1764 LET B=X-2
1765 PRINT AT 4,B;"% % % % % ";AT 5,B;"% \ :% \: % ";AT 6,B-1;">\##\ :% \: \##<";AT 7,B;"W W"
1766 RETURN
1800 LET W$(K)="P% T"
1801 LET P(K)=X-1
1802 PRINT AT 1,X-2;"\..";AT 2,X-4;"\ .\'' \''\. ";AT 3,X-4;"\:. \.:\..\..\..";AT 4,X-4;"% % \..% % ";AT 5,X-4;"\':% % % \:'";AT 6,X-3;"\ '\''\' "
1803 RETURN
1830 LET W$(K)="CL% CK"
1831 LET P(K)=X-3
1832 PRINT AT 1,X;"\..\. ";AT 2,X-2;"\ .\''\ .\ '\'.";AT 3,X-2;"\: \ : \: ";AT 4,X-3;"\ : \ :\..\. \ :";AT 5,X-3;"\ '\. \.'";AT 6,X-2;"\'. \ .\' ";AT 7,X-1;"\''\..\.'\' "
1833 RETURN
1860 LET W$(K)="ST% P"
1861 LET P(K)=X-2
1862 PRINT AT 0,X-2;"\ .% % \. ";AT 1,X-3;"\ .% % % % \. ";AT 2,X-3;"% ST P% ";AT 3,X-3;"% % % % % % ";AT 4,X-3;"\ '% % % % \' ";AT 5,X-2;"\ '% % \' ";AT 6,X-1;"\ :\: ";AT 7,X-1;"\ :\: "
1863 RETURN
1900 LET W$(K)="G% N"
1901 LET P(K)=X-1
1902 LET B=X-4
1903 PRINT AT 2,B;"\ :% % % % % -->";AT 3,B;"\ :\: \: \:'\''";AT 4,B;"\ :\:.\..\: ";AT 5,B;"\ :\: "
1904 RETURN
1930 LET W$(K)="DR% M"
1931 LET P(K)=X-2
1932 PRINT AT 0,X+2;"/";AT 1,X-1;"\.. \ ' /";AT 2,X-3;"\ .\'' \''\. \ '";AT 3,X-3;"\:. \.:";AT 4,X-3;"% % \..% % ";AT 5,X-3;"\':% % % \:'";AT 6,X-2;"\ '\''\' "
1933 RETURN
1960 LET W$(K)="B% S"
1961 LET P(K)=X-1
1962 LET B=X-3
1963 PRINT AT 2,B;"% \''\:'\':\''% % ";AT 3,B;"% \..\:.\.:\..% \ :% ";AT 4,B;"% % % % % % \.:% ";AT 5,B+1;"\' \ '"
1964 RETURN
Note: Type-in program listings on this website use ZMAKEBAS notation for graphics characters.
People
E
2 SAVE "VOWE%L"
12 PRINT AT 8,11;"VOWELTUTOR";AT 10,2;"COPYRIGHT 1982 LOU GOLDSTEIN";AT 12,7;"% %F%R%O%M% %S%O%F%T%S%Y%N%C% %I%N%C% "
13 PRINT AT 20,5;"PRESS ""ENTER"" TO START"
14 PAUSE 33000
15 RAND
16 LET V$="AEIOU"
17 CLS
18 DIM P(3)
19 DIM W$(3,10)
20 DIM L(5)
23 PRINT AT 6,0;"WHICH VOWELS DO YOU WANT TO USE?1=LONG",,"2=SHORT",,"3=BOTH",,"4=EXIT PROGRAM"
24 INPUT O
25 LET LS=O
26 CLS
27 IF O=4 THEN STOP
30 IF O=3 THEN LET LS=INT (RND*2)+1
31 FOR K=1 TO 3
32 FAST
40 LET L(K)=INT (RND*5)+1
50 NEXT K
60 IF L(1)=L(2) OR L(1)=L(3) OR L(2)=L(3) THEN GOTO 31
80 LET C=INT (RND*3)+1
90 LET A$=V$(L(C))
99 SLOW
100 FOR K=1 TO 3
105 LET Z=INT (RND*3)
110 LET X=10*K-5
120 GOSUB 700*LS+100*L(K)+30*Z
121 PRINT AT 10,P(K);W$(K)
130 PRINT AT 15,X;K
140 NEXT K
150 PRINT AT 19,14;"\:'\''\':";AT 20,14;"\: ";A$;"\ :";AT 21,14;"\:.\..\.:"
151 FOR J=1 TO 10
152 IF W$(C,J)="% " THEN GOTO 155
153 NEXT J
155 LET W$(C,J)=A$
156 INPUT R
157 IF R=9 THEN CLS
160 IF R=9 THEN GOTO 23
170 IF R<>C THEN PRINT AT 16,10*C-9;"% % % % % % % % % "
180 IF R=C THEN PRINT AT 16,10*C-9;"*********"
185 PRINT AT 13,P(C);W$(C)
190 PAUSE 250
195 CLS
200 GOTO 30
800 LET W$(K)="TR% IN"
801 LET P(K)=X-2
802 PRINT AT 2,X-1;"*";AT 3,X;"*";AT 4,X;"\ :\..\. ";AT 5,X-4;"\ :% \.:% \.:% % >";AT 6,X-4;"\ '\ '\ '\ '\ ' \ '"
803 RETURN
830 LET W$(K)="C% NE"
831 LET P(K)=X-1
832 PRINT AT 1,X+1;"\' ";AT 0,X-1;"\ .\''\. "
833 FOR Y=41 TO 30 STEP -1
834 PLOT 2*X-1,Y
835 NEXT Y
836 RETURN
860 LET W$(K)="D% YS"
861 LET P(K)=X-2
862 PRINT AT 2,X-1;"FRI.";AT 4,X-1;"SAT.";AT 6,X-1;"SUN."
863 RETURN
900 LET W$(K)="K% Y"
901 LET P(K)=X-1
902 PRINT AT 3,X-3;"% % ";AT 4,X-3;"% % \:'\''\':% % \' ";AT 5,X-3;"% % \ '\ :\ '"
903 RETURN
930 LET W$(K)="THR% E"
931 LET P(K)=X-2
932 PRINT AT 3,X-1;"\''\''\: ";AT 4,X+1;"\: ";AT 5,X-1;"\ '\''\: ";AT 6,X+1;"\: ";AT 7,X-1;"\''\''\' "
933 RETURN
960 LET W$(K)="KN% E"
961 LET P(K)=X-2
962 PRINT AT 0,X+1;"% \: ";AT 1,X+1;"\':\' ";AT 2,X+1;"\: ";AT 3,X;"\ :\ '\..\. ";AT 4,X;"\: ";AT 5,X-1;"\ :\ '\. ";AT 6,X-1;"\ : \ '\. <";AT 7,X-2;"\ .\' \: ";AT 8,X-2;"\'. \''"
968 RETURN
\n1000 LET W$(K)="F% VE"
\n1001 LET P(K)=X-2
\n1002 PRINT AT 2,X-1;"\:'\''\' ";AT 3,X-1;"\:.\. ";AT 4,X;"\ '\. ";AT 5,X-1;"\. \ .\' ";AT 6,X-1;"\ '\' "
\n1003 RETURN
\n1030 LET W$(K)="K% TE"
\n1031 LET P(K)=X-2
\n1032 PRINT AT 0,X;"\.:\. ";AT 1,X-1;"\ .\':\'.";AT 2,X-1;"\.:\.:\.:\. ";AT 3,X-1;"\ :\ :\ :";AT 4,X;"% \: ";AT 5,X;"\ :";AT 6,X+1;"\'.";AT 7,X+1;"\.'";AT 8,X+1;"\ '"
\n1033 RETURN
\n1060 LET W$(K)="N% NE"
\n1061 LET P(K)=X-2
\n1063 PRINT AT 2,X-1;"\:'\''\: ";AT 3,X-1;"\: \: ";AT 4,X-1;"\''\''\: ";AT 5,X-1;"\. \: ";AT 6,X-1;"\''\''\' "
\n1064 RETURN
\n1100 LET W$(K)="B% AT"
\n1101 LET P(K)=X-2
\n1102 PRINT AT 1,X-2;"\..\..\..\..\. ";AT 2,X-2;"\ '\. \ '\. ";AT 3,X-1;"\.' \.'";AT 4,X-2;"\ '\''\':\''\''";AT 5,X-4;"\..\..\..\..\.:\..\..\..>";AT 6,X-4;"\':% % % % % \:'";AT 7,X-3;"\''\''\''\''\''"
\n1103 RETURN
\n1130 LET W$(K)="THR% W"
\n1131 LET P(K)=X-2
\n1132 PRINT AT 2,X+2;">";AT 3,X-2;"\ :% >\ '";AT 4,X-2;"\ '\:' \.'";AT 5,X-3;"\ .\''\:'\''";AT 6,X-3;"\' \: ";AT 7,X-2;"\.'\ '\. ";AT 8,X-3;"\ ' \ '"
\n1133 RETURN
\n1160 LET W$(K)="N% SE"
\n1161 LET P(K)=X-2
\n1162 PRINT AT 1,X-1;"\ .% \. ";AT 2,X-1;"% \:.\:.";AT 3,X-1;"% % \' ";AT 4,X-1;"\':\:'\' "
\n1163 FOR G=1 TO 3
\n1164 PRINT AT 2,1+X;"\: "
\n1165 LET U=USR 16514
\n1166 PRINT AT 2,X+1;"\:."
\n1167 LET U=USR 16514
\n1168 NEXT G
\n1169 RETURN
\n1200 LET W$(K)="% NITED"
\n1201 LET P(K)=X-3
\n1202 PRINT AT 1,X-3;"\..\..\..\..\..\. \.:";AT 2,X-4;"\ .% % % % % % \.:% ";AT 3,X-4;"\ :AMERICA\: ";AT 4,X-4;"\ '% % % % % % % \: ";AT 5,X-3;"\''\''% % % % % \: ";AT 6,X;"\':\:' \: ";AT 7,X+1;"\' "
\n1203 PRINT AT 11,P(K);"STATES"
\n1204 RETURN
\n1230 LET W$(K)="F% EL"
\n1231 LET P(K)=X-2
\n1232 PRINT AT 1,X-4;"\##\##\##";AT 2,X-4;"\##%G\##";AT 3,X-4;"\##%A\##";AT 4,X-4;"\##%S\##\'. \:'\''\':";AT 5,X-4;"\##\##\##\ '\..\:.\..\.:";AT 6,X-4;"\##\##\## % % % ";AT 7,X-4;"\##\##\## \: \ :"
\n1233 RETURN
\n1260 LET W$(K)="T% BE"
\n1261 LET P(K)=X-2
\n1262 PRINT AT 2,X-4;"\ .\..\..\..\..\..\..\..\. ";AT 3,X-4;"\ :\##TOOTH\##\:.";AT 4,X-4;"\ :\##PASTE\##\:'";AT 5,X-4;"\ '\''\''\''\''\''\''\''\' "
\n1263 RETURN
\n1500 LET W$(K)="FL% G"
\n1501 LET P(K)=X-2
\n1503 LET B=X-4
\n1504 PRINT AT 0,B;"\ .\..\..\..\..\..\..\..";AT 1,B;"\ :***\:'\''\''\':";AT 2,B;"\ :***\:'\''\''\':";AT 3,B;"\ :\''\''\''\''\''\''\':";AT 4,B;"\ :\''\''\''\''\''\''\':";AT 5,B;"\ :\''\''\''\''\''\''\''";AT 6,B;"\ :"
\n1505 RETURN
\n1530 LET W$(K)="% DD"
\n1531 LET P(K)=X-1
\n1532 PRINT AT 1,X-2;"3+2=\##";AT 3,X;"75";AT 4,X-1;"+23";AT 5,X-1;"\''\''\''"
\n1533 RETURN
\n1560 LET W$(K)="P% N"
\n1561 LET P(K)=X-1
\n1562 PRINT AT 3,X-3;"\..\..\..\..";AT 4,X-4;"\ :\' \ '\:.\..\..\..";AT 5,X-4;"\ :\:.\..\..\.:\: ";AT 6,X-4;"\ '% % % % \' "
\n1563 RETURN
\n1600 LET W$(K)="T% N"
\n1601 LET P(K)=X-1
\n1602 LET B=X-2
\n1603 PRINT AT 2,B;"\ : \:'\''\':";AT 3,B;"\ : \: \ :";AT 4,B;"\ : \: \ :";AT 5,B;"\ : \:.\..\.:"
\n1604 RETURN
\n1630 LET W$(K)="DR% SS"
\n1631 LET P(K)=X-2
\n1632 PRINT AT 1,X-2;"\.:\:.\.:\:.";AT 2,X-3;"\ '\:'% % \':\' ";AT 3,X-2;"\ .% % \. ";AT 4,X-3;"\ .% % % % \. ";AT 5,X-4;"\ .% % % % % % \. "
\n1633 RETURN
\n1660 LET W$(K)="L% G"
\n1661 LET P(K)=X-1
\n1662 LET B=X-1
\n1663 PRINT AT 0,X;"% \: ";AT 1,X;"\':\' ";AT 2,B;"% % % \: ";AT 3,B;"\: % \: \: ";AT 4,B;"\' % \: \' ";AT 5,B;"\ :% % ";AT 6,B;"\ :\: \##<";AT 7,B;"\ :\: \##<"
\n1664 RETURN
\n1700 LET W$(K)="S% X"
\n1701 LET P(K)=X-1
\n1702 LET B=X-1
\n1703 PRINT AT 1,X;"\..";AT 2,B;"\.' \' ";AT 3,B;"\: ";AT 4,B;"\:.\''\'.";AT 5,B;"\: \ :";AT 6,B;"\ '\..\' "
\n1704 RETURN
\n1730 LET W$(K)="SH% P"
\n1731 LET P(K)=X-2
\n1732 PRINT AT 3,X-3;"\..\:.\:.\. ";AT 4,X-5;"\ .\..% \:'% \:'% \:'% \:'";AT 5,X-4;"\':\:.% \:.% \:.% \:'";AT 6,X-5;"\@@\@@\@@\@@\@@\@@\@@\@@\@@\@@"
\n1733 RETURN
\n1760 LET W$(K)="WR% ST"
\n1761 LET P(K)=X-2
\n1762 LET B=X-1
\n1763 PRINT AT 0,B;"\..\..\..";AT 1,B;"\:'% \':";AT 2,B;"% \''% ";AT 3,B;"\''% \''"
\n1764 LET B=X-2
\n1765 PRINT AT 4,B;"% % % % % ";AT 5,B;"% \ :% \: % ";AT 6,B-1;">\##\ :% \: \##<";AT 7,B;"W W"
\n1766 RETURN
\n1800 LET W$(K)="P% T"
\n1801 LET P(K)=X-1
\n1802 PRINT AT 1,X-2;"\..";AT 2,X-4;"\ .\'' \''\. ";AT 3,X-4;"\:. \.:\..\..\..";AT 4,X-4;"% % \..% % ";AT 5,X-4;"\':% % % \:'";AT 6,X-3;"\ '\''\' "
\n1803 RETURN
\n1830 LET W$(K)="CL% CK"
\n1831 LET P(K)=X-3
\n1832 PRINT AT 1,X;"\..\. ";AT 2,X-2;"\ .\''\ .\ '\'.";AT 3,X-2;"\: \ : \: ";AT 4,X-3;"\ : \ :\..\. \ :";AT 5,X-3;"\ '\. \.'";AT 6,X-2;"\'. \ .\' ";AT 7,X-1;"\''\..\.'\' "
\n1833 RETURN
\n1860 LET W$(K)="ST% P"
\n1861 LET P(K)=X-2
\n1862 PRINT AT 0,X-2;"\ .% % \. ";AT 1,X-3;"\ .% % % % \. ";AT 2,X-3;"% ST P% ";AT 3,X-3;"% % % % % % ";AT 4,X-3;"\ '% % % % \' ";AT 5,X-2;"\ '% % \' ";AT 6,X-1;"\ :\: ";AT 7,X-1;"\ :\: "
\n1863 RETURN
\n1900 LET W$(K)="G% N"
\n1901 LET P(K)=X-1
\n1902 LET B=X-4
\n1903 PRINT AT 2,B;"\ :% % % % % -->";AT 3,B;"\ :\: \: \:'\''";AT 4,B;"\ :\:.\..\: ";AT 5,B;"\ :\: "
\n1904 RETURN
\n1930 LET W$(K)="DR% M"
\n1931 LET P(K)=X-2
\n1932 PRINT AT 0,X+2;"/";AT 1,X-1;"\.. \ ' /";AT 2,X-3;"\ .\'' \''\. \ '";AT 3,X-3;"\:. \.:";AT 4,X-3;"% % \..% % ";AT 5,X-3;"\':% % % \:'";AT 6,X-2;"\ '\''\' "
\n1933 RETURN
\n1960 LET W$(K)="B% S"
\n1961 LET P(K)=X-1
\n1962 LET B=X-3
\n1963 PRINT AT 2,B;"% \''\:'\':\''% % ";AT 3,B;"% \..\:.\.:\..% \ :% ";AT 4,B;"% % % % % % \.:% ";AT 5,B+1;"\' \ '"
\n1964 RETURN
Note: Type-in program listings on this website use ZMAKEBAS notation for graphics characters.





