--- title: "Banners" id: 72077 type: "computer_media" slug: "banners-2" url: "http://localhost/computer_media/banners-2/" markdown_url: "http://localhost/computer_media/banners-2.md" published_at: "2026-10-21T05:32:00+00:00" modified_at: "2026-10-21T05:34:30+00:00" author: "David Anderson" featured_image: url: "http://localhost/wp-content/uploads/2026/10/banners-1.png" excerpt: "Press a key and a giant letter or digit fills the screen, turned sideways so successive COPYs build a long banner on the printer." post_tag: - name: "Downloadable" slug: "downloadable" taxonomy: "post_tag" url: "http://localhost/tag/downloadable/" - name: "TS 2068" slug: "ts2068" taxonomy: "post_tag" url: "http://localhost/tag/ts2068/" model: - name: "Timex/Sinclair 2068" slug: "ts-2068" taxonomy: "model" url: "http://localhost/model/ts-2068/" genre: - name: "Banner" slug: "banner" taxonomy: "genre" url: "http://localhost/type/banner/" media_type: "Program" download_url: "https://archive.org/download/timex-sinclair-software-archive/Banners%20%28198x%29%28-%29%28TS2068%29%28US%29%28Program%29.zip" tsrun_member: "Banners (198x)(-)(TS2068)(US)(Program)/Banners (198x)(-)(TS2068)(US)(Program).tap" mediadate: "198x" images: - url: "http://localhost/wp-content/uploads/2026/10/banners-1.png" - url: "http://localhost/wp-content/uploads/2026/10/banners-2.png" - url: "http://localhost/wp-content/uploads/2026/10/banners-3.png" media_type_tags: "Banner" license: false --- # Banners 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. ## 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 ```