--- title: "Fire Works White on Black" id: 57146 type: "computer_media" slug: "fire-works-white-on-black" url: "http://localhost/computer_media/fire-works-white-on-black/" markdown_url: "http://localhost/computer_media/fire-works-white-on-black.md" published_at: "2024-10-04T00:50:06+00:00" modified_at: "2026-03-30T21:19:30+00:00" author: "David Anderson" featured_image: url: "http://localhost/wp-content/uploads/2024/10/95_FrWrk.png" excerpt: "Watch randomly placed explosions bloom across a starfield in this compact BASIC animation using expanding eight-directional burst rings and block graphics." 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/" genre: - name: "Demo" slug: "demo" taxonomy: "genre" url: "http://localhost/type/demo/" media_contents: - id: 56733 title: "Timex Sinclair Public Domain Library Tape 1002" type: "computer_media" url: "http://localhost/computer_media/timex-sinclair-public-domain-library-tape-1002/" media_type: "Program" mediadate: "198x" images: - url: "http://localhost/wp-content/uploads/2024/10/95_FrWrk.png" media_type_tags: "Demo" --- # Fire Works White on Black This program renders an animated fireworks effect on screen using block graphics characters stored in a string variable. It first fills the entire display with a pattern of inverse-space and full-block characters to create a dark background, then draws five randomly positioned “burst” animations by expanding rings of characters outward in eight directions simultaneously. After the random bursts, a final centered explosion expands from position (10,15) with a radius of 8, before looping back to repeat. The program uses POKE 16418,0 to disable the system clock interrupt (or modify a system variable), and stores four animation-frame characters in A$ including block graphic characters for visual effect. *** ## Program Analysis ### Program Structure The program is divided into four logical phases: 1. **Initialization (lines 1–6):** Defines the animation character string `A$`, sets a system variable via `POKE 16418,0`, and fills the screen with a dense background pattern of inverse spaces and full-block graphics. 2. **Random burst loop (lines 7–27):** Iterates five times (`C=1 TO 5`), each time choosing a random screen position and animating an expanding ring of characters. 3. **Centered explosion (lines 40–45):** Performs a single large burst centered at row 10, column 15, expanding to radius 8. 4. **Loop (line 46):** Jumps to line 2 (not line 1), reusing the background without re-initialising `A$`, creating an infinite animation cycle. ### Background Fill Technique Lines 4–6 use a `FOR X=0 TO 22` loop printing a long literal string at each row using `PRINT AT X,0;`. The string contains alternating inverse-space characters (`% %`) and a long run of full-block graphic characters (`\''`), creating a solid, patterned dark background that acts as the “night sky” for the fireworks. ### Animation Frame Characters The string `A$` at line 1 contains four characters used as successive animation frames: | Index (Y) | Escape / Character | Visual | | --- | --- | --- | | 1 | `\.'` | ▞ (top-right + bottom-left block) | | 2 | `\:.` | ▙ (three-quarter block) | | 3 | `%"` | inverse quote character | | 4 | `%.` | inverse period character | Cycling through these four characters as the burst radius grows gives a crude animation effect simulating the changing density or shape of an explosion. ### Eight-Direction Expansion The core burst technique in lines 20–22 (and 42–44) prints the current frame character at eight compass positions relative to the burst centre simultaneously in a single `PRINT` statement: - Left and right: `AT A,B-Z` and `AT A,B+Z` - Up and down: `AT A-Z,B` and `AT A+Z,B` - Four diagonals: `AT A-Z,B-Z`, `AT A-Z,B+Z`, `AT A+Z,B-Z`, `AT A+Z,B+Z` Using a single `PRINT` statement with multiple `AT` items is an efficiency idiom that avoids repeated `PRINT AT` calls and their associated overhead. ### POKE 16418,0 `POKE 16418,0` writes to the ZX81/TS1000 system variable `FRAMES` (low byte), resetting the frame counter. This has no direct visual effect on the animation but may be used to synchronise timing or simply as a housekeeping step at program start. ### Loop Architecture and GOTO 40 Line 28 uses `GOTO 40` to skip the `SAVE` command at line 30 during normal execution. Line 30 is a `SAVE "1009%5"` which stores the program; the `%5` represents an inverse digit 5 in the filename. Line 31 redirects to line 1 if the save path were ever reached. The main loop at line 46 uses `GOTO 2` rather than `GOTO 1`, deliberately skipping the re-initialisation of `A$` and the `POKE`, which is correct since neither needs repeating. ### Potential Anomalies - The expanding burst in lines 20–22 does not erase previous frames — each new character simply overwrites the previous one at the same position, meaning earlier ring positions remain drawn. This is likely intentional, building up a bloom effect. - When `Z` or the random offsets place characters outside the valid screen area (rows 0–21, columns 0–31), a `PRINT AT` with out-of-range coordinates will produce an error. For the random bursts, the position is constrained (`A=INT(RND*15)+3`, `B=INT(RND*25)+3`) but `Z` runs to 3, so edge cases near borders could cause issues. The centered burst at radius 8 from (10,15) would reach column 23, still within bounds horizontally, but row 10+8=18 is safe; however row 10−8=2 and column 15−8=7 are also safe. - Line numbers jump from 9 to 14, 15 to 20, 22 to 26, and 27 to 28, leaving gaps that serve no apparent purpose other than allowing future line insertions. ## Source Code ``` 1 LET A$="\.'\:.%"%." 2 POKE 16418,0 4 FOR X=0 TO 22 5 PRINT AT X,0;"% % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % \''\''\''\''\''\''\''\''\''\''\''\''\''\''\''\''\''\''\''\''\''\''\''\''\''\''\''\''\''\''\''\''" 6 NEXT X 7 FOR C=1 TO 5 8 LET A=INT (RND*15)+3 9 LET B=INT (RND*25)+3 14 FOR Y=1 TO 4 15 PRINT AT A,B;A$(Y) 20 FOR Z=1 TO 3 21 PRINT AT A,B-Z;A$(Y);AT A,B+Z;A$(Y);AT A-Z,B;A$(Y);AT A+Z,B;A$(Y);AT A-Z,B-Z;A$(Y);AT A-Z,B+Z;A$(Y);AT A+Z,B-Z;A$(Y);AT A+Z,B+Z;A$(Y) 22 NEXT Z 26 NEXT Y 27 NEXT C 28 GOTO 40 30 SAVE "1009%5" 31 GOTO 1 40 FOR Y=1 TO 4 41 PRINT AT 10,15;A$(Y) 42 FOR Z=1 TO 8 43 PRINT AT 10,15-Z;A$(Y);AT 10,15+Z;A$(Y);AT 10-Z,15;A$(Y);AT 10+Z,15;A$(Y);AT 10-Z,15-Z;A$(Y);AT 10-Z,15+Z;A$(Y);AT 10+Z,15-Z;A$(Y);AT 10+Z,15+Z;A$(Y) 44 NEXT Z 45 NEXT Y 46 GOTO 2 ```