This program is a menu-loader for a collection of seven ZX81/TS1000 games, part of a “Synchro-Sette” compilation dated March 1984. It draws a decorative bordered screen using block-graphic characters to frame both an outer border and an inner title box, then displays a numbered list of available programs. An animated scrolling prompt — “PICK ONE” — cycles through the menu column using a rotating string technique, and the user’s keypress (codes 29–35, corresponding to keys 1–7) selects which program to LOAD. The loader saves itself back to tape at line 9998 before the final RUN restart.
Program Analysis
Program Structure
The program divides into four logical phases:
- Screen construction (lines 10–170): Switches to
FASTmode, clears the screen, and builds a complete block-graphic display — a filled background, outer border, inner title panel, and the game menu list. - Animation loop (lines 200–370): Returns to
SLOWmode and repeatedly scrolls a “PICK ONE” message alongside the menu entries while pollingINKEY$for a valid selection. - Dispatch (lines 500–7000): Switches back to
FAST, computes the target line number from the key pressed, and branches to the appropriateLOADstatement. - Utility lines (9997–9999): A
STOPsentinel, aSAVE "LOADER"line for re-saving the menu itself, and aRUNrestart.
Screen Drawing Techniques
The background fill (lines 30–50) uses a FOR/NEXT loop that PRINTs 44 rows of the solid block character \@@ (█) with a trailing semicolon to suppress newlines, rapidly painting the entire display area solid.
Line 60 overwrites the top and bottom rows with horizontal border strips built from alternating block-graphic pairs (\ . ▖, \..▄, etc.) to create a decorative double-pixel-height ruled line. Lines 70–90 place left (\ : ▌) and right (\: ▐) vertical border characters down each side.
Lines 100 constructs an inner title box using corner and edge block graphics, and the game title text within it is rendered entirely in inverse video using the % escape sequences (e.g. %S%Y%N%C%H%R%O = “SYNCHRO” in inverse), making the panel stand out against the solid background.
Menu items in lines 110–170 also use selective inverse video on their final character — e.g. BOMB-CATCHE%R — a cosmetic touch common in ZX81 title screens.
Animated “PICK ONE” Prompt
The string A$ defined at line 200 holds the message "PICK ONE" padded and doubled up so that each character appears twice consecutively. The loop at lines 300–370 prints one character of A$ per iteration beside each menu row using A$(N*2-1), giving the impression of vertically scrolling text alongside the list. The rotation at line 360,
LET A$=A$(2 TO )+A$(1)
shifts the string left by one character each full pass, implementing a classic circular-buffer scroll with no array or extra variable.
Input Handling and Dispatch
Key detection (lines 320–340) reads INKEY$ and checks whether its CODE falls between 29 and 35 inclusive. On the ZX81, CODE "1" through CODE "7" map to 29–35, so this neatly accepts exactly the seven valid menu choices while ignoring all other keys.
Line 510 uses the idiom GOTO VAL P$*1000: multiplying the numeric value of the pressed key character by 1000 produces the line numbers 1000, 2000 … 7000, each of which holds the matching LOAD statement. This avoids a chain of IF/THEN branches.
Key Data Summary
| Key | CODE | Target line | Program loaded |
|---|---|---|---|
| 1 | 29 | 1000 | BOMB-CATCHER |
| 2 | 30 | 2000 | LAND-MINE |
| 3 | 31 | 3000 | SLOT-MACHINE |
| 4 | 32 | 4000 | BOWLING |
| 5 | 33 | 5000 | MINICALC |
| 6 | 34 | 6000 | ARVOLFORM |
| 7 | 35 | 7000 | BULLETIN |
Content
Source Code
10 FAST
20 CLS
30 FOR N=1 TO 44
40 PRINT "\@@\@@\@@\@@\@@\@@\@@\@@\@@\@@\@@\@@\@@\@@\@@\@@";
50 NEXT N
60 PRINT AT 0,0;"\ .\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\. ";AT 21,0;"\ '\''\''\''\''\''\''\''\''\''\''\''\''\''\''\''\''\''\''\''\''\''\''\''\''\''\''\''\''\''\''\' "
70 FOR N=1 TO 20
80 PRINT AT N,0;"\ :";AT N,31;"\: "
90 NEXT N
100 PRINT AT 2,7;"\:'\''\''\''\''\''\''\''\''\''\''\''\''\''\''\':";AT 3,7;"\: %S%Y%N%C%H%R%O%-%S%E%T%T%E% \ :";AT 4,7;"\: % % %L%O%A%D%E%R% %F%O%R% % \ :";AT 5,7;"\: % % %M%A%R%C%H% %1%9%8%4% % \ :";AT 6,7;"\:.\..\..\..\..\..\..\..\..\..\..\..\..\..\..\.:"
110 PRINT AT 8,2;" BOMB-CATCHE%R ";TAB 27;" 1 "
120 PRINT AT 10,2;" LAND-MIN%E ";TAB 27;" 2 "
130 PRINT AT 12,2;" SLOT-MACHIN%E ";TAB 27;" 3 "
140 PRINT AT 14,2;" BOWLIN%G ";TAB 27;" 4 "
150 PRINT AT 16,2;" MINICAL%C ";TAB 27;" 5 "
160 PRINT AT 18,2;" ARVOLFOR%M ";TAB 27;" 6 "
170 PRINT AT 20,2;" BULLETI%N ";TAB 27;" 7 "
200 LET A$=" P%PI%IC%CK%K % O%ON%NE%E "
210 SLOW
300 FOR N=1 TO 13
310 PRINT AT N+7,20;A$(N*2-1)
320 LET P$=INKEY$
330 IF CODE P$<29 OR CODE P$>35 THEN GOTO 350
340 GOTO 500
350 NEXT N
360 LET A$=A$(2 TO )+A$(1)
370 GOTO 300
500 FAST
510 GOTO VAL P$*1000
\n1000 LOAD "BOMB-CATCHE%R"
\n2000 LOAD "LAND-MIN%E"
\n3000 LOAD "SLOT-MACHIN%E"
\n4000 LOAD "BOWLIN%G"
\n5000 LOAD "MINICAL%C"
\n6000 LOAD "ARVOLFOR%M"
\n7000 LOAD "BULLETI%N"
\n9997 STOP
\n9998 SAVE "LOADE%R"
\n9999 RUN
Note: Type-in program listings on this website use ZMAKEBAS notation for graphics characters.
