Banners

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

Draws one giant letter or digit to fill the screen each time you press a key (A–Z, 1–9 or the apostrophe, in caps mode). The letters are turned sideways, so a run of screen copies on the 2040 printer reads as a banner down the paper. After a letter appears, press Z to COPY it to the printer and clear the screen, or any other key to clear it without printing. Press the space bar at the letter prompt to print a blank screen as a gap between words. Diagonals and rounded corners are made from triangular UDGs.

Program Analysis

Program Structure

The autostart line is 14. Lines 14–30 READ 128 bytes of DATA into the UDG area from 65368, defining 16 UDGs (a–p) as right-angled triangles in various orientations and sizes. Lines 100–135 show the instructions. Lines 4001–4023 build the shape strings, line 4210 waits for a key with PAUSE 0, and lines 4215–4405 send each key to a drawing subroutine (5220–5400). Lines 5000–5011 are shared pieces: the top and bottom double bars, the four rounded corners and the short vertical strokes.

Shape Strings

The shapes are built from long strings with embedded INVERSE 1/INVERSE 0 control codes, so inverse spaces print as solid blocks. The listing tools don’t show these codes. Each string is longer than 32 characters and is printed with AT so that it wraps onto the following lines at the same column. For example, a$ is 4 solid cells, 28 spaces, 4 solid, 28 spaces and 4 solid, which draws a 4×3 block in one PRINT. Other strings draw bars and the four corner pieces. Each letter subroutine is a list of these pieces placed with AT on a grid four columns wide and three rows high.

Notable Techniques

  • Every piece is printed with OVER 1, so printing a block over another one erases it. Letters such as C, G and Q are made by cutting notches out of a previously drawn O.
  • Multi-row shapes are drawn with one PRINT by letting padded strings wrap round the screen.
  • Inverse control codes are stored inside string literals instead of being set with INVERSE statements.
  • Sixteen triangular UDGs supply the diagonal strokes for K, M, N, V, W, X, Y, Z and the digits.

Potential Issues

  • The instructions mention 0, but line 4215 makes the 0 key clear the screen instead of drawing a digit.
  • Line 1 is GO TO 100, so starting with a plain RUN skips the UDG setup at lines 14–30. Only the autostart (or RUN 14) defines the triangle graphics.
  • The subroutines for E, F and Q end with OVER 1 where OVER 0 was clearly meant, so OVER stays switched on afterwards.

It comes from a Larken disk in the TS User Group’s collection (disk l-24). For this release it was converted to load and run from tape on a stock TS2068: the LKDOS PRINT USR 100 prefix on the SAVE line was removed. It was tested in ZEsarUX.

Image Gallery

Source Code

    1 GO TO 100
   14 RESTORE : DATA 1,3,7,15,31,63,127,255,128,192,224,240,248,252,254,255,255,254,252,248,240,224,192,128,255,127,63,31,15,7,3,1
   16 DATA 255,255,255,255,255,255,255,254,255,254,248,240,224,128,0,0,255,255,255,255,255,254,248,240: REM E-G
   18 DATA 248,240,224,128,0,0,0,0,255,255,255,254,248,240,224,128,224,128,0,0,0,0,0,0: REM H-J
   20 DATA 255,127,31,15,7,1,0,0,255,255,255,255,255,255,255,127,31,15,7,1,0,0,0,0: REM K-M
   22 DATA 255,255,255,255,255,127,31,15,7,1,0,0,0,0,0,0,255,255,255,127,31,15,7,1: REM N-P
   30 FOR n=65368 TO 65495: READ a: POKE n,a: NEXT n: GO TO 100
  100 PRINT "PROGRAM ""BANNERS"""
  110 PRINT '"  USE IN CAPS MODE"
  115 PRINT "  USE A TO Z  1 TO 0  AND '"
  120 PRINT "  AFTER LETTER IS ON SCREEN         HIT Z TO COPY AND CLS           HIT ANY OTHER KEY TO CLS AND    START OVER"
  122 PRINT '"  USE SPACE BAR TO PRINT A        SPACE BETWEEN LETTERS ON        PRINTER"
  125 PRINT AT 18,0;"HIT ANY KEY TO START"
  130 PAUSE 0
  135 GO TO 4000
 4001 CLS 
 4002 LET a$="                                                                    "
 4003 REM 
 4004 LET b$="    ef                              gh                             ij"
 4005 LET c$="kl                                 mn                                op" 
 4007 LET d$="kl                                mn                                 op"
 4009 LET e$="  ef                             gh                              ij    "                            
 4010 LET f$="                                                                                                                                                                                                "
 4011 LET g$="                                                                                                                                                                                                                                                                                                                                                "
 4012 LET h$="                                                                                                                                                                                                                                                                                                        "
 4014 LET i$="............................................"
 4016 LET j$="................................................"
 4018 LET k$="                                                "
 4020 LET l$="                "
 4021 REM 
 4022 LET m$="                                                                                                                                                                        " 
 4023 LET N$="a b c d e f g h i j k l m n o p q "
 4200 CLS 
 4210 PAUSE 0
 4215 IF INKEY$="0" THEN GO TO 4200
 4220 IF INKEY$="A" THEN GO SUB 5220
 4225 IF INKEY$="B" THEN GO SUB 5225
 4230 IF INKEY$="C" THEN GO SUB 5230
 4235 IF INKEY$="D" THEN GO SUB 5235
 4240 IF INKEY$="E" THEN GO SUB 5240
 4250 IF INKEY$="F" THEN GO SUB 5250
 4255 IF INKEY$="G" THEN GO SUB 5255
 4260 IF INKEY$="H" THEN GO SUB 5260
 4265 IF INKEY$="I" THEN GO SUB 5265
 4270 IF INKEY$="J" THEN GO SUB 5270
 4275 IF INKEY$="K" THEN GO SUB 5275
 4280 IF INKEY$="L" THEN GO SUB 5280
 4285 IF INKEY$="M" THEN GO SUB 5285
 4290 IF INKEY$="N" THEN GO SUB 5290
 4295 IF INKEY$="O" THEN GO SUB 5295
 4300 IF INKEY$="P" THEN GO SUB 5300
 4305 IF INKEY$="Q" THEN GO SUB 5305
 4310 IF INKEY$="R" THEN GO SUB 5310
 4315 IF INKEY$="S" THEN GO SUB 5315
 4320 IF INKEY$="T" THEN GO SUB 5320
 4325 IF INKEY$="U" THEN GO SUB 5325
 4330 IF INKEY$="V" THEN GO SUB 5330
 4335 IF INKEY$="W" THEN GO SUB 5335
 4340 IF INKEY$="X" THEN GO SUB 5340
 4345 IF INKEY$="Y" THEN GO SUB 5345
 4350 IF INKEY$="Z" THEN GO SUB 5350
 4355 IF INKEY$="1" THEN GO SUB 5355
 4360 IF INKEY$="2" THEN GO SUB 5360
 4365 IF INKEY$="3" THEN GO SUB 5365
 4370 IF INKEY$="4" THEN GO SUB 5370
 4375 IF INKEY$="5" THEN GO SUB 5375
 4380 IF INKEY$="6" THEN GO SUB 5380
 4385 IF INKEY$="7" THEN GO SUB 5385
 4390 IF INKEY$="8" THEN GO SUB 5390
 4395 IF INKEY$="9" THEN GO SUB 5395
 4400 IF INKEY$="'" THEN GO SUB 5400
 4405 IF CODE INKEY$=32 THEN COPY : GO TO 4200
 4700 PAUSE 0
 4710 IF INKEY$="Z" THEN GO SUB 4800
 4780 GO TO 4200
 4790 STOP 
 4800 COPY : CLS : RETURN 
 5000 OVER 1: PRINT AT 1,0;f$;AT 4,0;f$: OVER 0: RETURN : REM topdbl bar
 5001 OVER 1: PRINT AT 16,0;f$;AT 19,0;f$: OVER 0: RETURN : REM bot dbl bar
 5002 OVER 1: PRINT AT 1,28;c$; OVER 0: RETURN : REM cor upper rt
 5003 OVER 1: PRINT AT 19,28;e$; OVER 0: RETURN : REM cor lower rt
 5004 OVER 1: PRINT AT 1,0;b$: OVER 0: RETURN : REM cor upper left
 5005 OVER 1: PRINT AT 19,0;d$: OVER 0: RETURN : REM cor lower left
 5006 GO SUB 5003: GO SUB 5005: RETURN : REM lower left and rt cors
 5010 OVER 1: PRINT AT 7,0;g$: OVER 0: RETURN : REM short vert left
 5011 OVER 1: PRINT AT 7,24;g$: OVER 0: RETURN : REM short vert rt
 5220 GO SUB 5000: GO SUB 5001: GO SUB 5002: GO SUB 5003: OVER 1: PRINT AT 7,24;g$;AT 7,8;g$: OVER 0: RETURN : REM A
 5225 GO SUB 5000: GO SUB 5001: OVER 1: PRINT AT 7,0;g$;AT 7,16;g$;AT 7,28;h$;AT 19,16;e$;AT 19,20;d$: GO SUB 5006: OVER 0: RETURN : REM B
 5230 GO SUB 5000: GO SUB 5001: OVER 1: PRINT AT 7,24;g$;AT 7,0;g$;AT 1,0;b$;AT 1,28;c$;AT 19,0;d$;AT 19,28;e$;AT 16,12;a$;AT 16,16;a$;AT 19,12;a$;AT 19,16;a$: OVER 0: RETURN : REM C
 5235 GO SUB 5000: GO SUB 5001: GO SUB 5010: GO SUB 5011: OVER 1: PRINT AT 19,0;a$;AT 19,28;a$;AT 16,0;d$;AT 19,4;d$;AT 19,24;e$;AT 16,28;e$: OVER 0: RETURN : REM D
 5240 GO SUB 5000: GO SUB 5010: GO SUB 5011: OVER 1: PRINT AT 7,12;g$;AT 16,0;a$;AT 16,4;a$;AT 19,0;a$;AT 19,4;a$;AT 16,24;a$;AT 16,28;a$;AT 19,24;a$;AT 19,28;a$: OVER 1: RETURN : REM E 
 5250 GO SUB 5000: GO SUB 5011: OVER 1: PRINT AT 7,12;g$;AT 16,24;a$;AT 16,28;a$;AT 19,24;a$;AT 19,28;a$: OVER 1: RETURN : REM F
 5255 GO SUB 5230: OVER 1: PRINT AT 13,12;h$: OVER 0: RETURN : REM G
 5260 GO SUB 5000: GO SUB 5001: OVER 1: PRINT AT 7,12;g$: OVER 0: RETURN : REM H
 5265 OVER 1: PRINT AT 1,0;g$;AT 10,0;g$;AT 1,24;g$;AT 10,24;g$;AT 7,8;a$;AT 7,12;a$;AT 7,16;a$;AT 7,20;a$;AT 10,8;a$;AT 10,12;a$;AT 10,16;a$;AT 10,20;a$: OVER 0: RETURN : REM I
 5270 GO SUB 5001: GO SUB 5010: GO SUB 5004: GO SUB 5005: OVER 1: PRINT AT 1,0;A$;AT 1,4;A$;AT 1,8;A$;AT 4,0;A$;AT 4,4;A$;AT 4,8;A$;AT 15,8;"b";AT 7,8;"c": OVER 0: RETURN : REM J
 5275 GO SUB 5000: OVER 1: PRINT AT 7,12;e$;AT 10,8;e$;AT 13,4;e$;AT 16,0;e$;AT 7,16;a$;AT 10,12;a$;AT 10,16;a$;AT 10,20;a$;AT 13,8;a$;AT 13,24;a$;AT 16,4;a$;AT 16,28;a$;AT 19,0;a$;AT 13,12;b$;AT 16,8;b$;AT 19,4;b$;AT 7,20;d$;AT 10,24;d$;AT 13,28;d$;AT 13,20;c$;AT 16,24;c$: OVER 0: RETURN : REM K
 5280 GO SUB 5000: GO SUB 5010: OVER 1: PRINT AT 16,0;a$;AT 16,4;a$;AT 19,0;a$;AT 19,4;a$: OVER 0: RETURN : REM L
 5285 GO SUB 5000: GO SUB 5001: OVER 1: PRINT AT 7,16;g$;AT 10,12;a$;AT 7,12;e$;AT 13,12;c$;AT 7,24;b$;AT 13,24;d$;AT 4,28;e$;AT 16,28;c$: OVER 0: RETURN : REM M
 5290 GO SUB 5000: GO SUB 5001: OVER 1: PRINT AT 7,16;a$;AT 7,20;a$;AT 10,12;a$;AT 10,16;a$;AT 13,8;a$;AT 13,12;a$;AT 7,12;e$;AT 10,8;e$;AT 13,4;e$;AT 4,28;e$;AT 16,0;b$;AT 7,24;b$;AT 10,20;b$;AT 13,16;b$: OVER 0: RETURN : REM N
 5295 GO SUB 5000: GO SUB 5001: OVER 1: PRINT AT 7,24;g$;AT 7,0;g$;AT 1,0;b$;AT 1,28;c$;AT 19,0;d$;AT 19,28;e$: OVER 0: RETURN : REM O
 5300 GO SUB 5000: GO SUB 5001: OVER 1: PRINT AT 7,8;g$;AT 7,24;g$;AT 16,0;a$;AT 16,4;a$;AT 19,0;a$;AT 19,4;a$;AT 19,8;d$;AT 19,28;e$: OVER 0: RETURN : REM P
 5305 GO SUB 5295: OVER 1: PRINT AT 10,8;a$;AT 7,8;e$;AT 13,8;b$: OVER 1: RETURN : REM Q
 5310 GO SUB 5250: OVER 1: PRINT AT 19,28;e$;AT 16,12;a$;AT 16,16;a$;AT 16,20;a$;AT 19,0;a$;AT 19,16;a$;AT 19,20;a$;AT 19,12;c$;AT 10,8;a$;AT 13,4;a$;AT 13,8;a$;AT 16,0;a$;AT 16,4;a$;AT 7,8;e$;AT 10,4;e$;AT 13,0;e$;AT 16,8;b$;AT 19,4;b$: OVER 0: RETURN : REM R
 5315 GO SUB 5000: GO SUB 5001: OVER 1: PRINT AT 7,0;g$;AT 7,12;g$;AT 7,24;g$;AT 1,0;b$;AT 1,8;a$;AT 1,12;b$;AT 1,28;c$;AT 4,8;a$;AT 16,20;a$;AT 19,20;a$;AT 19,0;d$;AT 19,28;e$;AT 19,16;e$: OVER 0: RETURN : REM S
 5320 OVER 1: PRINT AT 10,0;f$;AT 1,24;g$;AT 13,24;g$;AT 9,0;k$;AT 13,0;k$;AT 8,0;i$;AT 8,22;"....";AT 14,0;j$: OVER 0: RETURN : REM T
 5325 GO SUB 5295: OVER 1: PRINT AT 7,24;g$;AT 1,28;c$;AT 19,28;e$: OVER 0: RETURN : REM U
 5330 GO SUB 5000: GO SUB 5001: OVER 1: PRINT AT 1,0;a$;AT 1,4;a$;AT 4,0;a$;AT 16,0;a$;AT 19,0;a$;AT 19,4;a$;AT 7,4;a$;AT 10,0;a$;AT 10,4;a$;AT 13,4;a$;AT 1,8;b$;AT 4,4;b$;AT 7,0;e$;AT 7,8;b$;AT 13,8;d$;AT 13,0;c$;AT 16,4;d$;AT 19,8;d$: OVER 0: RETURN : REM V
 5335 GO SUB 5000: GO SUB 5001: OVER 1: PRINT AT 7,4;g$;AT 1,0;a$;AT 19,0;a$;AT 1,4;b$;AT 4,0;b$;AT 7,0;c$;AT 13,0;e$;AT 7,8;c$;AT 13,8;e$;AT 16,0;d$;AT 19,4;d$: OVER 0: RETURN : REM W
 5340 GO SUB 5000: GO SUB 5001: OVER 1: PRINT AT 7,8;g$;AT 11,8;" ";AT 11,23;" ";AT 7,16;g$;AT 10,8;"b";AT 12,8;"c";AT 10,23;"a";AT 12,23;"d";AT 1,12;a$;AT 1,16;a$;AT 19,12;a$;AT 19,16;a$;AT 1,20;b$;AT 4,16;b$;AT 1,8;c$;AT 4,12;c$;AT 4,0;d$;AT 7,4;c$;AT 16,0;b$;AT 13,4;e$;AT 19,8;e$;AT 16,12;e$;AT 16,16;d$;AT 19,20;d$;AT 7,24;b$;AT 13,24;d$;AT 4,28;e$;AT 16,28;c$: OVER 0: RETURN : REM X
 5345 OVER 1: PRINT AT 7,15;"a";AT 8,14;"a ";AT 15,15;"d";AT 14,14;"d ";AT 9,0;l$;AT 10,0;l$;AT 11,0;l$;AT 12,0;l$;AT 13,0;l$;AT 19,24;a$;AT 7,24;b$;AT 1,20;e$;AT 1,24;a$;AT 1,28;a$;AT 4,20;a$;AT 4,24;a$;AT 4,28;b$;AT 4,16;e$;AT 10,23;"a";AT 11,23;" ";AT 12,23;"d";AT 13,24;d$;AT 16,28;d$;AT 16,20;a$;AT 16,24;a$;AT 19,28;a$;AT 16,16;c$;AT 19,20;c$;AT 7,16;g$: OVER 0: RETURN : REM Y
 5350 OVER 1: PRINT AT 19,0;a$;AT 19,4;a$;AT 19,24;a$;AT 19,28;a$;AT 1,24;g$;AT 10,24;g$;AT 1,0;g$;AT 10,0;g$;AT 4,8;a$;AT 7,8;a$;AT 7,12;a$;AT 10,12;a$;AT 10,16;a$;AT 13,16;a$;AT 13,20;a$;AT 16,20;a$;AT 1,8;d$;AT 4,12;d$;AT 7,16;d$;AT 10,20;d$;AT 10,8;c$;AT 13,12;c$;AT 16,16;c$;AT 19,20;c$: OVER 0: RETURN : REM Z
 5355 OVER 1: PRINT AT 4,0;m$;AT 4,20;m$;AT 10,0;f$;AT 13,0;f$;AT 16,0;m$;AT 4,24;c$;AT 7,28;d$: OVER 0: RETURN : REM 1
 5360 OVER 1: PRINT AT 1,0;a$;AT 4,0;g$;AT 13,0;g$;AT 1,4;d$;AT 4,8;d$;AT 7,8;g$;AT 7,12;c$;AT 13,8;d$;AT 16,12;c$;AT 13,16;g$;AT 10,16;d$;AT 19,16;d$;AT 7,24;g$;AT 1,20;a$;AT 4,20;a$;AT 4,24;a$;AT 16,24;a$;AT 1,24;d$;AT 4,28;d$;AT 16,28;b$;AT 19,24;b$: OVER 0: RETURN : REM 2
 5365 GO SUB 5230: OVER 1: PRINT AT 1,12;m$;AT 16,12;a$;AT 16,16;a$;AT 13,12;e$;AT 13,16;d$;AT 19,12;b$;AT 19,16;c$: OVER 0: RETURN : REM 3
 5370 OVER 1: PRINT AT 1,4;h$;AT 10,4;a$;AT 19,4;a$;AT 10,8;a$;AT 16,0;f$;AT 13,0;f$;AT 1,8;h$;AT 19,8;a$;AT 4,12;a$;AT 7,16;a$;AT 10,20;a$;AT 1,12;d$;AT 4,16;d$;AT 7,20;d$;AT 10,24;d$;AT 13,28;c$;AT 7,12;c$;AT 10,16;c$: OVER 0: RETURN : REM 4
 5375 OVER 1: PRINT AT 4,20;a$;AT 1,8;a$;AT 1,0;f$;AT 4,0;g$;AT 13,0;g$;AT 4,12;g$;AT 4,24;g$;AT 13,12;g$;AT 13,24;m$;AT 16,8;a$;AT 19,8;a$;AT 1,0;b$;AT 19,0;d$;AT 19,16;e$: OVER 0: RETURN : REM 5
 5380 GO SUB 5375: OVER 1: PRINT AT 1,8;a$;AT 4,8;a$;AT 1,28;c$: OVER 0: RETURN : REM 6
 5385 OVER 1: PRINT AT 1,24;G$;AT 10,24;G$;AT 19,28;A$;AT 19,24;a$;AT 1,0;a$;AT 1,4;A$;AT 4,8;A$;AT 7,12;A$;AT 10,16;A$;AT 13,20;A$;AT 4,0;C$;AT 4,4;a$;AT 7,4;c$;AT 7,8;a$;AT 10,8;c$;AT 10,12;a$;AT 13,12;c$;AT 13,16;a$;AT 16,16;c$;AT 16,20;a$;AT 19,20;c$;AT 1,8;d$;AT 4,12;d$;AT 7,16;d$;AT 10,20;d$: OVER 0: RETURN : REM 7
 5390 GO SUB 5295: OVER 1: PRINT AT 7,12;g$;AT 19,12;e$;AT 19,16;d$;AT 1,12;c$;AT 1,16;b$: OVER 0: RETURN : REM 8
 5395 GO SUB 5375: OVER 1: PRINT AT 1,0;e$;AT 1,4;a$;AT 19,16;b$;AT 19,16;a$;AT 19,20;a$;AT 19,24;a$;AT 19,28;b$;AT 16,20;a$;AT 1,28;c$;AT 1,12;b$: OVER 0: RETURN : REM 9
 5400 OVER 1: PRINT AT 4,20;A$;AT 7,24;A$;AT 10,28;A$;AT 4,24;d$;AT 7,28;d$;AT 1,20;d$;AT 7,20;c$;AT 10,24;c$;AT 13,28;c$: OVER 0: RETURN : REM '
 9900 STOP 
 9999 PRINT USR 100: SAVE "banner.B2" LINE 14

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