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
PRINTby letting padded strings wrap round the screen. - Inverse control codes are stored inside string literals instead of being set with
INVERSEstatements. - 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 plainRUNskips the UDG setup at lines 14–30. Only the autostart (orRUN 14) defines the triangle graphics. - The subroutines for E, F and Q end with
OVER 1whereOVER 0was 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.
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 14Note: Type-in program listings on this website use ZMAKEBAS notation for graphics characters.


