Bulletin

This file is part of and Synchro-Sette October 1982. Download the collection to get this file.
Developer(s): Gene G. Buza
Date: October 1982
Type: Program
Platform(s): TS 1000

This program displays an animated title screen for “The Synchro-Sette Bulletin Board, October 1982,” using scrolling text marquees and block-graphic borders. Two strings, A$ and B$, are scrolled horizontally across rows 9 and 13 respectively, while C$ and D$ perform opposing rotation animations (C$ scrolls left, D$ scrolls right) using substring concatenation. A machine code routine is invoked at the start via RAND USR 16514, likely to set up display strings or clear memory in a way BASIC alone cannot. The program uses ZX81 block graphics for border decorations and inverse video characters for the title text, a common technique for creating visually striking displays within the character-cell display system.


Program Analysis

Program Structure

The program is a self-contained title screen display routine that loops continuously via GOTO 1 at line 9999. It is divided into several functional phases:

  1. Initialisation (lines 1000–1006): Switches to FAST mode, calls machine code, clears rows 8–14 with E$, resets a system variable, and prints border rows.
  2. Rotation animation (lines 1010–1050): Rotates strings C$ and D$ in opposite directions across rows 9 and 13 for 28 frames.
  3. Border drawing (lines 1080–1190): Draws block-graphic side borders, an animated horizontal bar at row 11, and blank lines at rows 9 and 13.
  4. Title display and scrolling (lines 1200–1340): Prints the fixed inverse-video title text, then scrolls A$ across row 9 and B$ across row 13 in an interleaved loop.
  5. Save and loop (lines 9998–9999): Saves the program to tape and restarts.

Machine Code Usage

Line 1001 executes RAND USR 16514, invoking a machine code routine at address 16514 (0x4082). This address falls in the ZX81’s RAM area just above the system variables, suggesting the routine is stored there by prior means (possibly loaded before this BASIC program runs). Its exact function is not shown in the listing, but it is typical for such routines to initialise display strings (E$, C$, D$, A$, B$, F$) or to perform screen setup that would be slow or impossible in BASIC alone.

String Rotation Technique

Lines 1040 and 1050 implement a classic ZX81 marquee scroll using string slicing and concatenation:

  • C$=C$(2 TO LEN C$)+C$(1) — removes the first character and appends it to the end, rotating left.
  • D$=D$(LEN D$)+D$( TO LEN D$-1) — takes the last character and prepends it, rotating right.

These two strings scroll in opposite directions simultaneously, creating a visually dynamic twin-band effect. The loop runs for 28 iterations (line 1010), chosen to match the 28-column printable width after the border characters.

Scrolling Marquee (A$ and B$)

Lines 1220–1340 scroll A$ on row 9 and B$ on row 13 using a window of 30 characters (B TO B+29). The loops are interleaved: when A$‘s scroll nears its end (B > L-29), control jumps to the B$ loop at 1300, and when B$‘s scroll nears its end, control jumps back to 1210 (the title reprint), creating a continuous alternating marquee effect.

Block Graphic Border Drawing

Lines 1080–1090 print "\: " (▌ followed by a space) at column 0 and "\ :" (space followed by ▐) at column 31 for rows 8–14, forming a framed border. Lines 1110–1180 animate a horizontal bar across row 11 using "\!!\;;" and "\;;\!!" block graphic pairs, sweeping left-to-right then right-to-left in steps of 2, with inverse-space characters used to erase the trailing position.

Display Variables

VariableRole
A$Long scrolling text string for row 9
B$Long scrolling text string for row 13
C$Short rotating string printed at row 9 during intro animation
D$Short rotating string printed at row 13 during intro animation
E$Blank or space-fill string used to clear display rows
F$String printed at rows 22–23 (footer area)

POKE 16418

Line 1005 executes POKE 16418,0. Address 16418 (0x4022) is the ZX81 system variable CDFLAG, which controls SLOW/FAST mode and the display interrupt flag. Poking it to 0 here, between FAST (line 1000) and SLOW (line 1007), ensures a clean transition and prevents residual fast-mode artifacts before the animated display begins.

SAVE and Auto-Loop

Line 9998 saves the program as "BULLETIN" (the inverse-video %N in the filename string is purely a display artifact of the inverse-video N character and does not affect the save name functionally on most loaders). Line 9999 unconditionally restarts the program, making the title screen loop indefinitely when run live.

Notable Idioms

  • Use of AT row/column positioning within a single PRINT statement to update multiple screen regions in one line.
  • Substring range ( TO 31) and ( TO 30) used to enforce a fixed display width without padding.
  • FAST/SLOW bracketing of the initialisation block to speed up string setup while ensuring the visible animation runs in SLOW (display-active) mode.

Content

Appears On

Cassette to accompany the October 1982 issue of Synchro-Sette.

Related Products

Related Articles

Related Content

Image Gallery

Bulletin

Source Code

   1 REM Y% \.'\. :%KNOT $TAB \@@RND\: TAB \'.RNDTAN 
\n1000 FAST 
\n1001 RAND USR 16514
\n1002 FOR N=8 TO 14
\n1003 PRINT AT N,0;E$
\n1004 NEXT N
\n1005 POKE 16418,0
\n1006 PRINT AT 22,0;F$;AT 23,0;F$
\n1007 SLOW 
\n1010 FOR N=1 TO 28
\n1020 PRINT AT 9,0;C$( TO 31)
\n1030 PRINT AT 13,0;D$( TO 31)
\n1040 LET C$=C$(2 TO LEN C$)+C$(1)
\n1050 LET D$=D$(LEN D$)+D$( TO LEN D$-1)
\n1060 NEXT N
\n1080 FOR N=8 TO 14
\n1090 PRINT AT N,0;"\: ";AT N,31;"\ :"
\n1100 NEXT N
\n1110 FOR N=1 TO 30 STEP 2
\n1120 PRINT AT 11,N;"\!!\;;"
\n1130 NEXT N
\n1135 PRINT AT 11,31;"% "
\n1150 FOR N=29 TO 1 STEP -2
\n1160 PRINT AT 11,N;"\;;\!!"
\n1170 NEXT N
\n1180 PRINT AT 11,0;"% "
\n1190 PRINT AT 9,1;E$( TO 30);AT 13,1;E$( TO 30)
\n1200 PRINT AT 4,8;"%T%H%E% %S%Y%N%C%H%R%O%-%S%E%T%T%E";AT 19,9;"%B%U%L%L%E%T%I%N% %B%O%A%R%D";AT 22,10;"%O%C%T%O%B%E%R% %1%9%8%2"
\n1210 LET L=LEN A$
\n1220 FOR B=1 TO L
\n1230 IF B>L-29 THEN GOTO 1300
\n1240 PRINT AT 9,1;A$(B TO B+29)
\n1250 NEXT B
\n1300 LET L=LEN B$
\n1310 FOR B=1 TO L
\n1320 IF B>L-29 THEN GOTO 1210
\n1330 PRINT AT 13,1;B$(B TO B+29)
\n1340 NEXT B
\n9998 SAVE "BULLETI%N"
\n9999 GOTO 1

Note: Type-in program listings on this website use ZMAKEBAS notation for graphics characters.

Scroll to Top