--- title: "Ford Falcon" id: 57348 type: "computer_media" slug: "ford-falcon" url: "http://localhost/computer_media/ford-falcon/" markdown_url: "http://localhost/computer_media/ford-falcon.md" published_at: "2024-10-04T08:41:54+00:00" modified_at: "2026-04-03T07:58:35+00:00" author: "David Anderson" featured_image: url: "http://localhost/wp-content/uploads/2024/09/196_Falc.png" excerpt: "A hand-crafted animated falcon built from block graphics characters reveals itself piece by piece, timed by busy-loop delays — complete with a dive-approach animation and a 1983 artist signature." category: - name: "Archived Media" slug: "archived-media" taxonomy: "category" url: "http://localhost/category/archived-media/" post_tag: - name: "Downloadable" slug: "downloadable" taxonomy: "post_tag" url: "http://localhost/tag/downloadable/" - name: "TS 1000" slug: "ts1000" taxonomy: "post_tag" url: "http://localhost/tag/ts1000/" model: - name: "Timex/Sinclair 1000" slug: "ts-1000" taxonomy: "model" url: "http://localhost/model/ts-1000/" indiv: - name: "Tony Willing" slug: "tony-willing" taxonomy: "indiv" url: "http://localhost/indiv/tony-willing/" genre: - name: "Demo" slug: "demo" taxonomy: "genre" url: "http://localhost/type/demo/" media_contents: - id: 56735 title: "Timex Sinclair Public Domain Library Tape 1004" type: "computer_media" url: "http://localhost/computer_media/timex-sinclair-public-domain-library-tape-1004/" media_type: "Program" programmers: - name: "Tony Willing" slug: "tony-willing" taxonomy: "indiv" url: "http://localhost/indiv/tony-willing/" mediadate: "198x" images: - url: "http://localhost/wp-content/uploads/2024/09/196_Falc.png" media_type_tags: "Demo" --- # Ford Falcon 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: 1. **Lines 0–10:** REM headers crediting the author and naming the piece. 2. **Lines 15–540:** Main drawing routine — calls the intro subroutine, then draws the falcon body, wings, talons, and labels sequentially, interspersed with delay calls. 3. **Lines 2000–3020:** Two timing subroutines — a slow delay (`FOR P=1 TO 30`) and a fast delay (`FOR P=1 TO 10`). 4. **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 (`F` and `G`) 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 `PAUSE` statement used. - The horizontal ground line (lines 200–230) is drawn with a `FOR Z=6 TO 29` loop plus a final out-of-loop print at column 30, suggesting the loop boundary was adjusted but the extra cell added manually. ## 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 2000 FOR P=1 TO 30 2010 NEXT P 2020 RETURN 3000 FOR P=1 TO 10 3010 NEXT P 3020 RETURN 5000 PRINT AT 4,19;"*" 5010 GOSUB 2000 5020 FOR A=0 TO 4 5030 PRINT AT A,19;"." 5040 PRINT AT A,19;" " 5050 NEXT A 5060 LET T=19 5065 LET V=19 5070 FOR S=5 TO 12 5080 PRINT AT S,T-1;".";AT S,V+1;"." 5090 PRINT AT S,T-1;" " 5095 PRINT AT S,V+1;" " 5100 LET T=T-1 5110 LET V=V+1 5120 NEXT S 5130 RETURN 5140 STOP 5150 CLEAR 5160 SAVE "1019%6" 5170 RUN ```