This program renders a detailed pixel-art falcon graphic on screen using ZX Spectrum block graphics characters, building the image line by line with timed delays between drawing steps to create an animated reveal effect. The main graphic is assembled using a combination of block graphics (▖, ▘, ▀, ▌, █, etc.) and inverse-video characters to form the bird’s body, wings, and talons. Two delay subroutines at lines 2000 and 3000 provide coarse timing — 30-iteration and 10-iteration busy loops respectively — controlling the pace of each drawing step. An introductory animation at line 5000 simulates a diving or landing effect by printing and erasing dots in a V-shaped spreading pattern before the main bird is drawn.
Program Analysis
Program Structure
The program divides into four logical sections:
- Lines 0–10: REM headers crediting the author and naming the piece.
- Lines 15–540: Main drawing routine — calls the intro subroutine, then draws the falcon body, wings, talons, and labels sequentially, interspersed with delay calls.
- Lines 2000–3020: Two timing subroutines — a slow delay (
FOR P=1 TO 30) and a fast delay (FOR P=1 TO 10). - Lines 5000–5170: Intro animation subroutine, followed by dead code (
STOP,CLEAR,SAVE,RUN) that is never reached in normal execution.
Intro Animation (Lines 5000–5130)
The subroutine at line 5000 animates a simple diving/approach effect before the bird is drawn. It first prints a * at column 19, then steps down rows 0–4 printing and immediately erasing a . at the same column, giving a flicker. From rows 5 to 12 it symmetrically expands outward: dots are printed one column to the left (T-1) and one to the right (V+1) of centre, then immediately erased, widening a V-shape on each row. This simulates a bird approaching from a distance.
Block Graphics Usage
The artwork makes heavy use of ZX Spectrum block graphic escape sequences. The main body text of the falcon is rendered with combinations of these characters:
\##— full block █\~~/\,,— various quarter-block characters used for diagonal edges\:.,\::,\..,\.:— additional block graphics for shading and body contour\;;— inverse space / solid block variant used for fill%— space character used for spacing/clearing within PRINT strings
The wing sweep (lines 150–180) is drawn programmatically: a FOR G=16 TO 7 STEP -1 loop prints \:. (▙) diagonally upward-left, with F incrementing each iteration to step one row down per column — tracing the swept leading edge of a wing.
Delay Subroutines
Two busy-wait subroutines control drawing pace:
| Subroutine | Loop count | Relative delay | Usage |
|---|---|---|---|
GOSUB 2000 | 30 | Longer pause | Between major body sections |
GOSUB 3000 | 10 | Shorter pause | Between fine detail strokes |
Both subroutines share the loop variable P, which causes no conflict since they are never nested.
Inverse Video Text
Several labels are printed using the %X inverse-video escape: %F, %O, %R, %D spell “FORD” in inverse video at lines 480–510, and %A%W/83 at line 530 signs the artwork “AW/83” (Anthony Willing, 1983) in inverse characters at the bottom-right of the screen.
POKE to Display RAM
Line 540 executes POKE 16384,74. Address 16384 is the very first byte of the display file. Writing 74 (binary 01001010) sets specific pixels in the top-left character cell of the screen — a small finishing touch or signature pixel tweak applied after the drawing is complete.
Dead Code (Lines 5140–5170)
Following the RETURN at line 5130, lines 5140–5170 contain STOP, CLEAR, SAVE "1019%6", and RUN. These are unreachable in normal program flow and represent leftover development/save scaffolding. The SAVE filename encodes %6 as an inverse-video digit.
Notable Techniques
- Programmatic diagonal line drawing with paired loop variables (
FandG) for both the wing sweep and the expanding intro V-shape. - Immediate erase-after-draw within the same loop iteration in the intro animation (
PRINT AT … "." … PRINT AT … " "), achieving animation without screen clearing. - All timing done with FOR/NEXT busy loops — no
PAUSEstatement used. - The horizontal ground line (lines 200–230) is drawn with a
FOR Z=6 TO 29loop plus a final out-of-loop print at column 30, suggesting the loop boundary was adjusted but the extra cell added manually.
Content
Source Code
0 REM "FALCON" GRAPHIC BY ANTHONY WILLING (5/83)
10 REM "FALCON"
15 GOSUB 5000
20 PRINT AT 12,10;"\,,\,, \##"
30 GOSUB 2000
40 PRINT AT 13,10;"\## \~~\~~\## \## \##\~~ \##\~~\## \##\~~\##"
50 GOSUB 2000
60 PRINT AT 14,10;"\##\,, \,,\,,\## \## \## \## \## \## \##"
70 GOSUB 2000
80 PRINT AT 15,10;"\## \## \## \## \## \## \## \## \##"
90 GOSUB 2000
100 PRINT AT 16,10;"\## \##\,,\## \##\,, \##\,, \##\,,\## \## \##"
110 GOSUB 2000
120 GOSUB 2000
130 PRINT AT 4,17;"\. "
135 PRINT AT 5,17;"\' "
140 LET F=5
150 FOR G=16 TO 7 STEP -1
160 PRINT AT F,G;"\.:"
170 LET F=F+1
180 NEXT G
190 GOSUB 2000
200 FOR Z=6 TO 29
210 PRINT AT 17,Z;"\''"
220 NEXT Z
230 PRINT AT 17,30;"\''"
240 GOSUB 2000
250 PRINT AT 17,2;"\ '"
260 PRINT AT 16,2;"\ :\:'% % % % % % \@@% % \@@\;;\@@% \@@\;;% \@@\;;% \@@\;;\@@\..\@@\..\@@"
265 GOSUB 2000
270 PRINT AT 15,2;"\ .\:'% % % % % % \@@% % \@@% \@@% \@@\..\..\@@ \@@ \@@ \@@ \@@"
275 GOSUB 2000
280 PRINT AT 14,8;"% % \@@\;;\:.\,,\,,\## \## \## \## \## \## \##"
290 GOSUB 2000
300 PRINT AT 13,9;"% \@@% \: "
310 GOSUB 2000
320 PRINT AT 12,9;"\.:\;;\;;\:'"
330 GOSUB 2000
340 LET F=11
350 FOR G=11 TO 7 STEP -1
360 PRINT AT G,F;"% "
370 LET F=F+1
380 NEXT G
383 PRINT AT 11,12;"% "
386 PRINT AT 10,13;"% "
390 GOSUB 2000
400 PRINT AT 6,16;"\:'"
405 GOSUB 3000
410 PRINT AT 7,16;"\' "
415 GOSUB 3000
420 PRINT AT 8,15;"\: "
425 GOSUB 3000
430 PRINT AT 9,14;"\:'"
435 GOSUB 3000
440 PRINT AT 10,14;"\' "
445 GOSUB 3000
450 PRINT AT 11,13;"\: "
460 GOSUB 2000
470 GOSUB 2000
475 PRINT AT 14,4;"/"
480 PRINT AT 9,4;"%F"
485 GOSUB 3000
490 PRINT AT 9,5;"%O"
495 GOSUB 3000
500 PRINT AT 9,6;"%R"
505 GOSUB 3000
510 PRINT AT 9,7;"%D"
520 GOSUB 2000
530 PRINT AT 21,27;"%A%W/83"
540 POKE 16384,74
\n2000 FOR P=1 TO 30
\n2010 NEXT P
\n2020 RETURN
\n3000 FOR P=1 TO 10
\n3010 NEXT P
\n3020 RETURN
\n5000 PRINT AT 4,19;"*"
\n5010 GOSUB 2000
\n5020 FOR A=0 TO 4
\n5030 PRINT AT A,19;"."
\n5040 PRINT AT A,19;" "
\n5050 NEXT A
\n5060 LET T=19
\n5065 LET V=19
\n5070 FOR S=5 TO 12
\n5080 PRINT AT S,T-1;".";AT S,V+1;"."
\n5090 PRINT AT S,T-1;" "
\n5095 PRINT AT S,V+1;" "
\n5100 LET T=T-1
\n5110 LET V=V+1
\n5120 NEXT S
\n5130 RETURN
\n5140 STOP
\n5150 CLEAR
\n5160 SAVE "1019%6"
\n5170 RUN
Note: Type-in program listings on this website use ZMAKEBAS notation for graphics characters.
