This program draws a randomly sized rectangle on screen using inverse-video block characters for the border and a fill character derived from the rectangle’s own height value. The dimensions are generated with RND: width T is scaled to 54 columns and height D to 8 rows, with a bias toward smaller heights (line 6 re-rolls D if it exceeds 4). The rectangle is rendered in three passes — a top border row, D middle rows each with side borders and an interior filled with CHR$ D, and a bottom border row — all positioned with AT and TAB expressions based on T and D. After drawing, the program waits for a keypress via CODE INKEY$ before looping back to draw a new rectangle.
Program Analysis
Program Structure
The program is a tight loop spanning lines 4–110. Lines 4–6 generate random dimensions; lines 7–100 render the rectangle; line 105 provides a keypress gate; and line 110 restarts the loop. Lines 120–140 are bootstrap/save code that runs once on initial load.
- Line 4–6: Randomise width
T(0–54) and heightD(0–8), re-rollingDif it exceeds 4 to bias toward shorter rectangles. - Lines 7–35: Position the cursor with
ATand print the top border row ofTinverse-space characters. - Lines 50–70: Print
Dmiddle rows, each starting and ending with an inverse-space border character, withT-2interior cells filled byCHR$ D. - Lines 75–100: Print the bottom border row, mirroring the top.
- Line 105: Waits until no key is pressed (
NOT CODE INKEY$is true when INKEY$ is empty), then returns — though there is no correspondingGOSUB, soRETURNhere would cause an error; in practice the condition is reversed and the loop simply falls through toGOTO 4.
Dimension Generation
RND**54 uses the exponentiation operator applied twice (i.e. RND * *54 is parsed as RND ^ 54 — raising a 0–1 random number to the 54th power), which strongly biases T toward very small values near zero. Similarly RND**8 biases D toward small heights. The re-roll on line 6 (IF D>4 THEN LET D=RND**8) further skews the height distribution downward.
Rendering Technique
The border character is the inverse-video space (% in the source escaping), producing a solid block. The interior fill character is CHR$ D, meaning the actual character displayed depends on the rectangle’s own height — for small D values this will be a control or graphics character, giving the interior a somewhat unpredictable appearance.
Positioning uses the expression (1-T/2) and (1-D/2) inside AT and TAB. Since these are likely to produce values between 0 and negative numbers (given T can reach 54 and the screen is 32 columns wide on ZX81/TS1000), the coordinate arithmetic is approximate centering that may wrap or clip on smaller screens.
Key BASIC Idioms
NOT CODE INKEY$— tests whetherINKEY$is the empty string (CODE of “” = 0, NOT 0 = 1), used as a “no key pressed” sentinel.RND**N— raising RND to a power to shape the probability distribution toward smaller values.- Repeated
TAB (1-T/2)calls before each row to re-establish the horizontal position after eachPRINTstatement.
Bugs and Anomalies
| Line | Issue |
|---|---|
105 | RETURN is used without a preceding GOSUB. When NOT CODE INKEY$ is true the program will attempt to return from a non-existent subroutine call, causing a RETURN without GOSUB error. The intent was likely IF CODE INKEY$ THEN GOTO 4 or similar. |
4 | RND**54 is parsed as RND ^ 54, not RND * 54. If the intent was a width scaled to 54, the correct expression would be RND*54. The power form produces values extremely close to zero nearly all the time. |
7 | The AT row/column expressions (1-D/2) and (1-T/2) will frequently yield zero or negative values, which may be clamped or cause errors depending on the interpreter’s AT bounds checking. |
Content
Source Code
4 LET T=RND**54
5 LET D=RND*8
6 IF D>4 THEN LET D=RND**8
7 PRINT AT (1-D/2),(1-T/2);
10 FOR X=1 TO T
20 PRINT "% ";
30 NEXT X
35 PRINT TAB (1-T/2);
50 FOR X=1 TO D
55 PRINT TAB (1-T/2);
56 PRINT "% ";
57 FOR U=1 TO T-2
60 PRINT CHR$ D;
65 NEXT U
66 PRINT "% ";
70 NEXT X
75 PRINT TAB (1-T/2);
80 FOR X=1 TO T
90 PRINT "% ";
100 NEXT X
105 IF NOT CODE INKEY$ THEN RETURN
110 GOTO 4
120 CLEAR
130 SAVE "1032%1"
140 RUN
Note: Type-in program listings on this website use ZMAKEBAS notation for graphics characters.
