Olympiad

This file is part of and Long Island Sinclair Timex (LIST) User Group Library Tape #2. Download the collection to get this file.
Date: 198x
Type: Program
Platform(s): TS 2068
Tags: Demo

This program displays a title screen for “Olympiad XXIII” and plays the Olympic fanfare melody using BEEP commands. It draws five interlocking Olympic rings using the CIRCLE command, rendered with double-thickness by looping twice with radii 21 and 22. A custom UDG character “A” is defined via POKE USR to render a smiley-face icon that tracks note positions across a 30-character display string. The melody data is stored in DATA statements and read in multiple passes, including a RESTORE to repeat the first section before continuing to the second half of the tune.


Program Analysis

Program Structure

The program is organized into several functional blocks: initialization and screen setup (lines 1–20), Olympic ring drawing (lines 30–90), border decoration (lines 100–140), title text display (lines 160), UDG definition (lines 170–240), main melody loop (lines 900–1910), a display subroutine (lines 2000–2030), and melody DATA (lines 3000–3001), with a SAVE/VERIFY sequence at lines 9998–9999.

Screen Setup and Graphics

Lines 1–11 set the color scheme (yellow paper, blue ink, yellow border) and display a decorative REM banner using block graphic characters around the title “OLYPIAD XXIII” — note the missing “M” in the REM at line 10 is a minor typo in the banner text, though line 160 correctly prints “OLYMPIAD”. Lines 100–140 draw a border of CHR$ 143 (the full block graphic) around the entire 22×32 display area. The five Olympic rings are drawn with CIRCLE at lines 30–90; the loop runs twice with radii 21 and 22 to produce thicker outlines.

UDG Definition

Lines 170–240 define UDG “A” (character code 144) by POKEing eight bytes into USR "A". The bit pattern describes a smiley face: a circle outline with eyes and a smile. This character is used in the melody display subroutine as a moving position indicator.

Melody Playback

The DATA at lines 3000–3001 encodes the Olympic fanfare as pairs of (note, duration) values, where each note is a semitone offset and each duration is in seconds. The outer loop at line 950 runs twice (variable I), playing 15 notes, then a RESTORE at line 1050 rewinds the DATA pointer to repeat the opening phrase before proceeding to the second half at lines 1200–1350. After completing the full fanfare, a PAUSE 200 at line 1900 precedes a GO TO 950 to loop indefinitely.

Note Indicator Subroutine

The subroutine at lines 2000–2030 animates the UDG “A” marker across row 19 in sync with each note. It copies the 30-character string A$ into B$, places CHR$ 144 (UDG A) at position A+10 within the string, and prints it at AT 19,1. Before each call, the previous position is erased with a space printed at AT 19,A+10. This gives the visual impression of a cursor moving left-to-right across the screen as each note is played.

Notable Techniques

  • Double-pass CIRCLE drawing (loop variable adds 1 or 2 to radius) for visually thicker rings without machine code.
  • Using a full-width string A$(30) as a scratch buffer to position a single UDG character without clearing the whole row.
  • PAUSE B with B=4 (a fixed ~0.23 second pause) between notes provides rhythmic spacing independent of BEEP duration.
  • RESTORE is used mid-sequence to replay the opening phrase, implementing the repeated A-section of the fanfare without duplicating DATA.
  • The LET A=0 at line 20 and later at line 1360 resets the note position variable, but A is also reused as the note-pitch variable throughout the DATA read loop — the initial zero is quickly overwritten by READ A.

Bugs and Anomalies

  • Line 1200 uses FOR I=N TO 28, where N retains the value 16 (one past the last value in the inner loop at line 1000 which runs 1 to 15). This means the second DATA segment reads items 16 through 28 — a deliberate but implicit use of loop variable persistence.
  • Line 9997 (STOP) is present to prevent the interpreter from accidentally running into the SAVE/VERIFY lines during normal execution.
  • The REM banner at line 10 reads “OLYPIAD XXIII” (missing “M”), which is a typo in the decorative border text only; the actual printed title at line 160 is spelled correctly.
  • At line 1310, LET A=3: GO SUB 2000 hardcodes the indicator position to column 13 for the penultimate notes, bypassing the READ loop — a manual adjustment to keep the marker within bounds for the final phrase.

Data Organization

LinesDATA itemsNotes playedPurpose
300030 pairs (60 values)30 notesMain fanfare body
30014 pairs (8 values)4 notesClosing phrase extension

Content

Appears On

Track the OSCAR 10 satellite, design Bézier curves interactively, take a geography quiz on a hand-drawn map of North America, or hear the Olympic fanfare — LIST Library Tape 2 is a well-curated selection of practical and creative programs.

Related Products

Related Articles

Related Content

Image Gallery

Source Code

    1 BORDER 5: PAPER 6: INK 1
    9 REM \::\::\::\::\::\::\::\::\::\::\::\::\::\::\::\::\::
   10 REM \::\::OLYPIAD XXIII\::\::
   11 REM \::\::\::\::\::\::\::\::\::\::\::\::\::\::\::\::\::
   20 CLS : LET A=0
   30 FOR I=1 TO 2
   40 CIRCLE 75,100,20+I
   50 CIRCLE 100,75,20+I
   60 CIRCLE 125,100,20+I
   70 CIRCLE 150,75,20+I
   80 CIRCLE 175,100,20+I
   90 NEXT I
  100 FOR N=0 TO 31
  110 PRINT AT 0,N;CHR$ 143;AT 21,N;CHR$ 143
  120 IF N>21 THEN GO TO 140
  130 PRINT AT N,0;CHR$ 143;AT N,31;CHR$ 143
  140 NEXT N
  150 DIM A$(30)
  160 PRINT AT 2,8;"O L Y M P I A D";AT 4,11;"X X I I I"
  170 POKE USR "A",BIN 00111100
  180 POKE USR "A"+1,BIN 01000010
  190 POKE USR "A"+2,BIN 10100101
  200 POKE USR "A"+3,BIN 10000001
  210 POKE USR "A"+4,BIN 11000011
  220 POKE USR "A"+5,BIN 10111101
  230 POKE USR "A"+6,BIN 01000010
  240 POKE USR "A"+7,BIN 00111100
  900 LET B=4
  950 FOR I=1 TO 2
 1000 FOR N=1 TO 15
 1010 PRINT AT 19,A+10;" ": READ A: READ C
 1020 GO SUB 2000
 1030 BEEP C,A: PAUSE B
 1040 NEXT N: IF I=2 THEN GO TO 1100
 1050 RESTORE 
 1060 PAUSE 10
 1070 NEXT I
 1100 PAUSE 10
 1200 FOR I=N TO 28
 1210 PRINT AT 19,A+10;" ": READ A: READ C
 1220 GO SUB 2000
 1230 BEEP C,A: PAUSE B
 1240 NEXT I
 1250 PAUSE 10
 1260 RESTORE 
 1270 FOR N=1 TO 13
 1280 PRINT AT 19,A+10;" ": READ A: READ C
 1290 GO SUB 2000
 1300 BEEP C,A: PAUSE B
 1310 NEXT N: LET A=3: GO SUB 2000
 1320 BEEP .1,A: PAUSE B
 1330 PRINT AT 19,A+10;" ": GO SUB 2000
 1340 BEEP .8,3: PAUSE B
 1350 PRINT AT 19,A+10;" "
 1360 LET A=0
 1370 RESTORE 
 1900 PAUSE 200
 1910 GO TO 950
 2000 LET B$=A$
 2010 LET B$(A+10)=CHR$ (144)
 2020 PRINT AT 19,1;B$
 2030 RETURN 
 3000 DATA 10,.8,3,.8,5,.3,7,.1,8,.1,7,.3,3,.4,5,.3,7,.1,8,.1,7,.3,3,.3,5,.6,-2,.8,5,.8,10,.6,8,.1,7,.3,5,.3,3,.3,2,.2,0,.8,12,.4,10,.1,8,.2,7,.2,5,.6
 3001 DATA 10,.1,8,.2,7,.2,5,.6
 9997 STOP 
 9998 SAVE "OLYMPIAD" LINE 1
 9999 CLS : PRINT AT 10,6;"REWIND TO VERIFY": PAUSE 200: VERIFY "OLYMPIAD"

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

People

No people associated with this content.

Scroll to Top