Banner

Date: 198x
Type: Program
Platform(s): TS 2068
Tags: Banner

This program prints a user-supplied message as large banner text using the printer (LPRINT). Each character of the input is looked up in a DATA table that stores five 7-bit column values representing a 5×7 dot-matrix font; each column value is then decoded into a row of printed characters using a binary decomposition routine (lines 200–330). The decomposition walks through bit weights 64, 32, 16, 8, 4, 2, and 1 in sequence, calling subroutine 500 to append four copies of the character (producing wide dots) or subroutine 510 to append four spaces for zero bits. Each column is printed twice (two LPRINT calls in line 340), giving tall, blocky output. A notable anomaly exists in the DATA for “W” and “X” (lines 1230–1240), which share identical column values, meaning “X” will print as “W”.


Program Analysis

Program Structure

The program is divided into four logical sections:

  1. Input and character loop (lines 20–50): Accepts a message string, iterates over each character, and scans the DATA table to find a matching entry.
  2. Column dispatch (lines 100–150): For each matched character, calls the binary decoder subroutine five times — once per font column — then prints two blank lines and restores the DATA pointer for the next character.
  3. Binary decoder (lines 200–340): Converts a 7-bit column value into a printed row by testing each bit weight (64, 32, 16, 8, 4, 2, 1) and appending either four copies of the character or four spaces.
  4. DATA table (lines 1000–1390): Stores letter/digit entries as a character key followed by five integers representing the dot-matrix column bitmaps of a 5×7 font.

Font Encoding

Each glyph is stored as five column values, each a 7-bit integer (0–127). Bit 64 is the topmost row and bit 1 is the bottommost. The decoder in lines 200–330 walks down the bit weights in order. Subroutine 500 appends four copies of the input character (A$) to P$, and subroutine 510 appends four spaces, producing wide dots. Line 340 then LPRINTs P$ twice, doubling the row height for a tall, bold appearance.

Binary Decomposition Technique

Rather than using bitwise operators (unavailable in standard Sinclair BASIC), the decoder manually tests each power of two with subtraction and branching. The pattern repeats seven times:

  • If X - weight >= 0, call subroutine 500 (dot) and subtract the weight from X.
  • If X - weight < 0, call subroutine 510 (space).

Because both the >=0 and <0 branches fall through to the next test line rather than branching around it, the second IF on each pair of lines is always evaluated. This is correct in practice because after a successful subtraction the new X will always be less than the original weight, making the <0 branch false — but it is slightly wasteful.

DATA Table and RESTORE Usage

All font data is stored in DATA statements beginning at line 1000. The inner loop at lines 40–50 uses sequential READ to scan for a matching character. After each complete character is rendered, line 150 calls RESTORE to reset the DATA pointer to the beginning, ready for the next character lookup. This means every character search always starts from line 1000, giving O(n) scan time per character where n is the position of the glyph in the table.

Notable Bugs and Anomalies

IssueLocationDetail
Duplicate “W”/”X” dataLines 1230–1240Both entries share identical column values 127,32,16,32,127, so printing “X” produces the same glyph as “W”.
Missing “0” keyLine 1390The digit zero entry uses DATA 0,62,81,73,69,62; the key is the number 0 rather than the string "0", so READ X$ will read it as the string "0" in practice — this works on most Sinclair BASIC interpreters but is inconsistent with the other entries.
Unmatched characters cause infinite loopLines 40–50If the input contains a character not present in the DATA table (e.g., lowercase letters or punctuation other than space), READ will exhaust all DATA and produce an error rather than gracefully skipping the character.

Key BASIC Idioms

  • M$(L TO L) — single-character substring extraction using the slice syntax.
  • RESTORE at line 150 resets the DATA pointer after each character, enabling repeated table scans within a single run.
  • P$ is built up as a string buffer then flushed with two LPRINT calls, minimizing the number of print operations per row.
  • Five separate GO SUB 200 calls (lines 100–140) handle the five columns of each glyph, keeping the decoder subroutine simple and single-purpose.

Content

Appears On

Related Products

Related Articles

Related Content

Image Gallery

Source Code

   20 CLS : LET P$="": INPUT "MESSAGE?";M$
   30 FOR L=1 TO LEN M$: LET A$=M$(L TO L): PRINT A$;
   40 READ X$,L1,L2,L3,L4,L5: IF A$=X$ THEN GO TO 100
   50 GO TO 40
  100 LET X=L1: GO SUB 200
  110 LET X=L2: GO SUB 200
  120 LET X=L3: GO SUB 200
  130 LET X=L4: GO SUB 200
  140 LET X=L5: GO SUB 200
  150 LPRINT : LPRINT :: RESTORE : NEXT L : STOP 
  200 IF X-64>=0 THEN GO SUB 500: LET X=X-64: GO TO 220
  210 IF X-64<0 THEN GO SUB 510
  220 IF X-32>=0 THEN GO SUB 500: LET X=X-32: GO TO 240
  230 IF X-32<0 THEN GO SUB 510
  240 IF X-16>=0 THEN GO SUB 500: LET X=X-16: GO TO 260
  250 IF X-16<0 THEN GO SUB 510
  260 IF X-8>=0 THEN GO SUB 500: LET X=X-8: GO TO 280
  270 IF X-8<0 THEN GO SUB 510
  280 IF X-4>=0 THEN GO SUB 500: LET X=X-4: GO TO 300
  290 IF X-4<0 THEN GO SUB 510
  300 IF X-2>=0 THEN GO SUB 500: LET X=X-2: GO TO 320
  310 IF X-2<0 THEN GO SUB 510
  320 IF X-1>=0 THEN GO SUB 500
  330 IF X-1<0 THEN GO SUB 510
  340 LPRINT P$: LPRINT P$: LET P$="": RETURN 
  500 LET P$=P$+A$+A$+A$+A$: RETURN 
  510 LET P$=P$+"    ": RETURN 
 1000 DATA " ",0,0,0,0,0
 1010 DATA "A",124,18,17,18,124
 1020 DATA "B",65,127,73,73,54
 1030 DATA "C",62,65,65,65,34
 1040 DATA "D",65,127,65,65,62
 1050 DATA "E",127,73,73,65,65
 1060 DATA "F",127,9,9,1,1
 1070 DATA "G",62,65,65,73,121
 1080 DATA "H",127,8,8,8,127
 1090 DATA "I",0,65,127,65,0
 1100 DATA "J",32,64,64,64,63
 1110 DATA "K",127,8,20,34,65
 1120 DATA "L",127,64,64,64,64
 1130 DATA "M",127,2,12,2,127
 1140 DATA "N",127,2,4,8,127
 1150 DATA "O",62,65,65,65,62
 1160 DATA "P",127,9,9,9,6
 1170 DATA "Q",62,65,81,33,94
 1180 DATA "R",127,9,25,41,70
 1190 DATA "S",38,73,73,73,50
 1200 DATA "T",1,1,127,1,1
 1210 DATA "U",63,64,64,64,63
 1220 DATA "V",7,24,96,24,7
 1230 DATA "W",127,32,16,32,127
 1240 DATA "X",127,32,16,32,127
 1250 DATA "Y",3,4,120,4,3
 1260 DATA "Z",97,81,73,69,67
 1300 DATA "1",0,66,127,64,0
 1310 DATA "2",114,73,73,73,70
 1320 DATA "3",34,65,73,73,54
 1330 DATA "4",24,20,18,127,16
 1340 DATA "5",39,69,69,69,57
 1350 DATA "6",60,74,73,73,48
 1360 DATA "7",1,113,9,5,3
 1370 DATA "8",54,73,73,73,54
 1380 DATA "9",6,73,73,41,30
 1390 DATA 0,62,81,73,69,62
 9998 SAVE "BANNER"

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

People

No people associated with this content.

Scroll to Top