This program renders a stylized “GTO” graphic on screen using block graphics characters and inverse video text. The image is built up in stages: first a diamond/oval outline is drawn using diagonal block graphic pairs (▖▝ and ▘▗) in nested FOR loops that shift the column variable to create slanted edges, then the interior is filled with checkerboard-pattern inverse spaces to suggest a grille or mesh. A border of inverse asterisks is drawn around the full screen perimeter via the GOSUB 2000 subroutine before the main graphic is rendered. The lettering “GTO” is spelled out with block graphics and solid-fill characters (▄▄ sequences), with each letter element revealed using a short delay loop at line 1000.
Program Analysis
Program Structure
The program is organised into a main drawing sequence (lines 0–600), a short delay subroutine (lines 1000–1020), and a border-drawing subroutine (lines 2000–2120), followed by some unreachable utility lines (2130–2160). Execution begins at line 15 with a call to the border routine, then proceeds to draw the oval outline, fill the interior, add the “GTO” lettering with inter-step delays, and finish with credits and a POKE.
Outline Drawing with Diagonal Block Graphics
The oval/diamond outline of the badge is constructed in four quadrants using FOR loops that simultaneously advance the row (F) and adjust the column (G) by ±1 each iteration. Two block graphic pairs are used:
▖▝(\.'\ '— bottom-left + top-right quadrant blocks) for the left-leaning edges▘▗(\'\ .— top-left + bottom-right quadrant blocks) for the right-leaning edges
Lines 40–70 draw the upper-left diagonal (column decreasing), lines 90–120 draw the lower-left diagonal (column increasing), lines 140–170 draw the lower-right diagonal (column increasing), and lines 190–220 draw the upper-right diagonal (column decreasing). The top edge (line 20) is a straight row of ▄▄ blocks.
Interior Fill Pattern
The interior of the badge is filled with a checkerboard-like pattern of inverse spaces (% % — an inverse space followed by a normal space) using three nested groups of PRINT statements at lines 230–360. Each group covers a horizontal band and steps in increments of 4 columns (STEP 4), creating a regularly spaced dot-grid effect suggestive of a car grille.
GTO Lettering
The solid body of the badge is laid in at lines 370–430 using rows of \## (solid filled blocks, i.e. ██) bordered by \,, characters. The “GTO” letters are then cut out of this solid area by overprinting with a mix of block graphic characters and spaces at lines 450–550. Each letter segment is printed in sequence, with a call to the delay subroutine (GOSUB 1000) between each, producing a slow animated reveal:
- Line 450: Top of G, T, O
- Line 470: Middle body row 1
- Line 490: Middle body row 2
- Line 510: Bottom of G, T, O
- Lines 530–540: Right side of O filled in
Delay Subroutine
The subroutine at lines 1000–1020 is a simple busy-wait loop iterating 20 times with an empty body (FOR D=1 TO 20: NEXT D). It is called six times during the lettering phase to pace the reveal.
Border Subroutine
The GOSUB 2000 routine draws a rectangular border of inverse asterisks (%*) around the full 31×21 screen perimeter by traversing all four sides in sequence: top (line 2010), right (line 2040), bottom (line 2070), left (line 2100). Each side uses its own FOR loop and PRINT AT.
Credits and Termination
Line 560 prints AW/83 (author initials “Anthony Willing” and year 1983) in inverse video at the bottom-right, and line 580 prints 1966 in inverse video near the top — the year the Pontiac GTO was introduced. Line 590 executes POKE 16384,74, writing the value 74 (ASCII ‘J’) to the first byte of the display file, which on the Spectrum alters the top-left character cell. The program then halts with STOP.
Unreachable Lines
Lines 2130–2160 are never reached by normal execution flow:
- Line 2130:
STOP— redundant guard - Line 2140:
CLEAR— utility line - Line 2150:
SAVE "1019%8"— save command with an inverse character in the filename - Line 2160:
RUN— auto-restart utility
Notable Techniques and Anomalies
- The diagonal outline technique — incrementing/decrementing both row and column in a single loop — is an efficient way to approximate curves using block graphics without lookup tables.
- The
\##sequences used for the solid badge body are block graphic characters that render as fully filled (██) cells, giving a high-contrast filled rectangle. - Using
GOSUB 1000as a timed delay between drawing steps is a common BASIC animation idiom; the loop count of 20 is short enough to be barely perceptible. - The POKE to address 16384 is a minor cosmetic effect on the top-left display cell and does not affect program execution.
- The
\,,sequences appear throughout the badge border rows; these are not standard zmakebas block graphic escapes and may render as literal comma characters or as artefacts depending on the character set — possibly intended as a specific graphic character code.
Content
Source Code
0 REM "GTO" GRAPHIC BY ANTHONY WILLING
10 REM "GTO"
15 GOSUB 2000
20 PRINT AT 3,10;"...................."
30 LET G=9
40 FOR F=4 TO 8
50 PRINT AT F,G;".'"
60 LET G=G-1
70 NEXT F
80 LET G=5
90 FOR F=9 TO 18
100 PRINT AT F,G;"'."
110 LET G=G+1
120 NEXT F
130 LET G=15
140 FOR F=18 TO 9 STEP -1
150 PRINT AT F,G;".'"
160 LET G=G+1
170 NEXT F
180 LET G=24
190 FOR F=8 TO 4 STEP -1
200 PRINT AT F,G;"'."
210 LET G=G-1
220 NEXT F
230 FOR S=8 TO 20 STEP 4
240 PRINT AT 9,S;"% % "
250 PRINT AT 10,S;"% % "
260 NEXT S
270 FOR S=10 TO 18 STEP 4
280 PRINT AT 11,S;"% % "
290 PRINT AT 12,S;"% % "
300 NEXT S
310 FOR S=12 TO 16 STEP 4
320 PRINT AT 13,S;"% % "
330 PRINT AT 14,S;"% % "
340 NEXT S
350 PRINT AT 15,14;"% % "
360 PRINT AT 16,14;"% % "
370 FOR H=11 TO 18
380 PRINT AT 4,H;",,"
390 NEXT H
400 PRINT AT 5,9;",,####################,,"
410 PRINT AT 6,8;",,########################,,"
420 PRINT AT 7,7;",,############################,,"
430 PRINT AT 8,6;",,################################,,"
440 GOSUB 1000
450 PRINT AT 5,10;"~~~~~~,, ,,~~~~~~"
460 GOSUB 1000
470 PRINT AT 6,10;" ###### ## "
480 GOSUB 1000
490 PRINT AT 7,10;" ## ## ## "
500 GOSUB 1000
510 PRINT AT 8,10;",,,,,,##,,,,##,,,,,,"
520 GOSUB 1000
530 PRINT AT 6,18;"##"
540 PRINT AT 7,18;"##"
550 GOSUB 1000
560 PRINT AT 19,24;"%A%W/83"
570 GOSUB 1000
580 PRINT AT 2,13;"%1%9%6%6"
590 POKE 16384,74
600 STOP
1000 FOR D=1 TO 20
1010 NEXT D
1020 RETURN
2000 FOR O=0 TO 30
2010 PRINT AT 0,O;"%*"
2020 NEXT O
2030 FOR D=1 TO 20
2040 PRINT AT D,30;"%*"
2050 NEXT D
2060 FOR U=30 TO 0 STEP -1
2070 PRINT AT 20,U;"%*"
2080 NEXT U
2090 FOR Q=20 TO 1 STEP -1
2100 PRINT AT Q,0;"%*"
2110 NEXT Q
2120 RETURN
2130 STOP
2140 CLEAR
2150 SAVE "1019%8"
2160 RUN
Note: Type-in program listings on this website use ZMAKEBAS notation for graphics characters.
