Colditz Castle is a two-to-five-player strategy board game in which one player controls German guards while the others control Allied prisoners of war attempting to escape from the castle. The game board is rendered entirely in BASIC PRINT statements using block graphics characters to depict walls, rooms, corridors, wire obstacles, and searchlights across a 31-column by 19-row grid. Prisoner positions, German guard positions, and the background cells they occupy are all tracked via parallel arrays and direct display-file manipulation using PEEK and POKE against the address stored at system variable 16396/16397. Equipment items — ropes, passports, keys, wire cutters, and tunnel gear — are collected from the board and consumed when navigating corresponding obstacles, with a random number generator determining which item is found on a roll of 1 or 6. The program is written in Dutch, with all prompts, rules, and messages in that language.
Program Analysis
Program Structure
The program divides into several functional blocks:
- Lines 5–30: Title screen and jump to initialization subroutine (line 1930).
- Lines 40–1030: Main POW (prisoner) turn loop — dice roll, equipment discovery, movement input, obstacle handling, capture/return logic.
- Lines 1040–1750: German guard turn loop — dice roll, movement input, capture detection.
- Lines 1760–1840: Win condition (escape) handling and game restart.
- Lines 1850–1920: Utility subroutines: delay loop (1850), message-area clear (1880/1890).
- Lines 1930–3050: Full initialization: rules display, player count input, array allocation, board drawing via PRINT, and initial POKE of piece positions.
- Lines 9989–9999: STOP, SAVE, and RUN stubs.
Board Representation and Display-File Manipulation
The castle map is drawn once at initialization (lines 2760–2950) using PRINT statements packed with block graphics characters. After drawing, the program never redraws the entire board; instead, it directly reads and writes individual character cells in the display file using PEEK and POKE. The display file base address is computed at line 2740:
LET DF=PEEK 16396+256*PEEK 16397+1
This reads the system variable D_FILE to locate the display file, adding 1 to skip the leading newline byte. Each cell is then addressed as DF + col + row*33, where 33 accounts for the 32 visible columns plus one newline byte per row. This technique allows fast in-place updates without screen flicker or full redraws.
Piece characters are stored in the display file with bit 7 set (CODE N$(I)+128) to render them in inverse video when it is their “active” (flashing) state, and without bit 7 when in normal display.
Coordinate Input Scheme
Coordinates are entered as a column number followed by a row letter (e.g., “16J”). The program decodes these at lines 270–280:
PY = CODE I$(LEN I$) - 37— converts a letter character code to a 1-based row index (ZX81 character codes: ‘A’=38, so ‘A’→1).PX = VAL I$(1 TO LEN I$-1)— extracts the numeric column.
Validation at lines 220–260 checks string length (2–3 characters), that the last character is a valid row letter (codes 38–56 = A–S), and that leading characters are digits (codes 28–37 = 0–9). Invalid input loops back with an error message.
Array Organization
| Array | Dimensions | Purpose |
|---|---|---|
P(4,4) | 4 POWs × 4 tokens | Display-file offset of each POW token |
C$(4,4) | 4 POWs × 4 tokens | Background character under each POW token |
E(4,5) | 4 POWs × 5 equipment types | Equipment inventory counts |
E$(5,16) | 5 equipment types | Equipment names (16 chars each) |
N$(4,8) | 4 POWs | Nationality labels: E=Brits, A=USA, F=Frans, C=Canada |
G(3+N*2) | variable | Display-file offsets of German guard tokens |
G$(3+N*2) | variable | Background characters under German tokens |
Initial POW positions are encoded as a compact string at line 2680 (P$), parsed three digits at a time. Guard positions are similarly encoded at line 2640. This avoids lengthy DATA/READ sequences and saves program space.
Movement and Obstacle Logic
Movement directions are entered as numpad-style digits: 5=left, 8=right, 6=down, 7=up. The new display-file offset Z is computed by adjusting the current position by ±1 (horizontal) or ±33 (vertical). The character at the destination is PEEKed and compared against a table of obstacle codes:
- Code 183 or 55 — single rope wall; costs 1 rope. Code 183 costs 2 ropes (
Y=1+(P=183)). - Code 181 — door requiring a passport (equipment type 2).
- Code 176 — door requiring a key (equipment type 3).
- Code 60 — wire requiring wire cutters (equipment type 4).
- Code 185 — tunnel entrance/exit; costs tunnel equipment and teleports the token (
Z=Z-SGN(Z-404)*8). - Code 57 — escape point; triggers win condition at line 1760.
- Codes 136, 0, 8, 56, 27 — passable open floor or path characters.
If a POW lacks the required equipment for an obstacle, control jumps to line 895 and the token is returned to a random central position.
Searchlight and Capture Mechanics
A POW rolling 1 or 6 on the dice triggers an equipment find (lines 100–160), using a probability table driven by a single random number S. The background character C$(I,J) is checked: if it equals "[▒]" (searchlight) or "S" (safe zone), the POW cannot be moved through certain obstacles without triggering the return-to-base penalty. During the German turn (line 1440), a POW standing on a searchlight square (C$(I,K)="[▒]") is immune to capture.
The capture animation at lines 1510–1590 flashes the POW token five times by alternately POKEing the inverse and normal character codes, then moves the token to a random central square (codes 136 = open courtyard).
Turn Structure and Step Counting
Both POW turns and German turns use a shared dice variable D counting down remaining steps. After each successful move, D is decremented (line 777 / line 1702). The player may switch to a different token mid-turn by entering direction 9, provided steps remain. When D reaches 0, control advances to the next player or phase. The computed GOTO at line 820 (GOTO 270+560*(D=0)+200*(D=0 AND P<>56)) elegantly handles the transition without explicit IF statements.
Notable Techniques
- Compact data encoding: All initial positions are stored as fixed-width decimal strings and extracted with
VAL P$(Z*3-2 TO Z*3), avoiding DATA statements entirely. - Boolean arithmetic in GOTO: Expressions like
GOTO 270+560*(D=0)+200*(D=0 AND P<>8)andGOTO 1080+(D=0)+630use the fact that boolean conditions evaluate to 1 (true) or 0 (false) to select branch targets mathematically. - Display file as game state: The screen itself serves as the authoritative map; no separate map array exists. Piece presence, obstacle type, and open floor are all read back from display memory via PEEK.
- Message area management: Subroutine at line 1890 clears lines 20–21 with spaces and repositions the cursor to line 19 before printing status messages, keeping the map visible while providing a clean prompt area.
- Delay subroutine: Line 1850 uses an empty
FOR/NEXTloop (FOR L=1 TO 80) as a simple busy-wait delay, called before and after messages to give the player reading time.
Bugs and Anomalies
- Line 1660 duplicate condition:
IF P<>55 AND P<>55 ...— the value 55 is tested twice, almost certainly a typo; the second occurrence was likely intended to be a different obstacle code (possibly 183). - Variable
Pdual use:Pis used both as a step-counter flag (line 205,LET P=0) and as the PEEKed cell value (line 500,LET P=PEEK (...)). These uses are separated by control flow, but the naming is potentially confusing. - Line 935/940 flash loop: The capture flash loop at lines 930–950 POKEs the inverse then normal character on every iteration of a 5-step loop, but line 960 then POKEs the background character after the loop — the token visually disappears at the old location correctly, but the loop itself does not restore the background between flashes, so only the token itself flickers rather than a true blink effect.
- Line 2210 stray hash:
PRINT ,,"5) GRAAFUITRUSTING VOOR HE#"contains a literal#that appears to be a truncated word (“HE#” should probably be “HET”), suggesting a line-length editing artifact.
Content
Image Gallery
Source Code
5 CLS
10 REM ▛▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▜ ▌ COLDITZ CASTLE ▐ ▌ LOGICAL COMPUTERS ▐ ▙▄▄▄▄▄▄ 9 9 9 0 ▄▄▄▄▄▄▟
30 GOSUB 1930
40 FOR I=1 TO N
50 LET D=INT (RND*6)+1
60 LET X=D
70 GOSUB 1890
80 PRINT N$(I);" ZET ";D;" STAP";"PEN" AND D>1;"."
90 IF D<>1 AND D<>6 THEN GOTO 175
100 LET S=RND
110 LET R=5
120 IF S>.08 THEN LET R=4
130 IF S>.28 THEN LET R=3
140 IF S>.51 THEN LET R=2
150 IF S>.74 THEN LET R=1
160 PRINT "JE VOND ";E$(R)
170 LET E(I,R)=E(I,R)+1
175 GOSUB 1850
180 GOSUB 1890
190 PRINT "VOER KOORDINATEN VAN DE P.O.W."
200 PRINT "DIE JE WIL VERPLAATSEN"
205 LET P=0
210 INPUT I$
220 IF LEN I$<2 OR LEN I$>3 THEN GOTO 860
230 IF CODE I$(LEN I$)<38 OR CODE I$(LEN I$)>56 THEN GOTO 860
240 FOR V=1 TO LEN I$-1
250 IF CODE I$(V)<28 OR CODE I$(V)>37 THEN GOTO 860
260 NEXT V
270 LET PY=CODE I$(LEN I$)-37
280 LET PX=VAL I$(1 TO LEN I$-1)
290 IF PX<1 OR PX>31 THEN GOTO 860
300 IF PEEK (DF+PX+PY*33)<>CODE N$(I)+128 AND PEEK (DF+PX+PY*33)<>CODE N$(I) THEN GOTO 860
310 FOR J=1 TO 4
320 IF P(I,J)=PX+33*PY THEN GOTO 340
330 NEXT J
340 GOSUB 1890
350 PRINT "STAP ";X-D+1;",VOER RICHTING IN"
360 PRINT "OF 9 VOOR ANDERE P.O.W."
370 INPUT M$
380 IF LEN M$<>1 OR CODE M$<28 OR CODE M$>37 THEN GOTO 866
390 LET M=VAL M$
400 IF M<>9 THEN GOTO 430
410 IF D>0 AND P<>8 THEN GOTO 180
420 GOTO 830+(P<>8)*200
430 LET Z=P(I,J)
450 IF M=5 AND PX>1 THEN LET Z=Z-1
460 IF M=8 AND PX<31 THEN LET Z=Z+1
470 IF M=6 AND PY<19 THEN LET Z=Z+33
480 IF M=7 AND PY>1 THEN LET Z=Z-33
490 IF Z=P(I,J) THEN GOTO 865
500 LET P=PEEK (DF+Z)
510 IF (C$(I,J)="." OR C$(I,J)="[R]") AND P<>27 AND P<>57 THEN GOTO 865
520 IF P=185 THEN GOTO 720
530 IF P=183 OR P=55 THEN GOTO 590
540 IF P=181 THEN GOTO 630
550 IF P=176 THEN GOTO 660
560 IF P=60 THEN GOTO 690
570 IF P<>136 AND P<>57 AND P<>0 AND P<>8 AND P<>56 AND P<>27 THEN GOTO 865
580 GOTO 760
590 LET Y=1+(P=183)
600 IF E(I,1)<Y THEN GOTO 895
610 LET E(I,1)=E(I,1)-Y
620 GOTO 770
630 IF E(I,2)=0 THEN GOTO 895
640 LET E(I,2)=E(I,2)-1
650 GOTO 770
660 IF E(I,3)=0 THEN GOTO 895
670 LET E(I,3)=E(I,3)-1
680 GOTO 770
690 IF E(I,4)=0 THEN GOTO 895
700 LET E(I,4)=E(I,4)-1
710 GOTO 770
720 IF E(I,5)=0 THEN GOTO 895
730 LET E(I,5)=E(I,5)-1
740 LET Z=Z-SGN (Z-404)*8
750 GOTO 770
760 IF P=57 THEN GOTO 1760
770 POKE DF+P(I,J),CODE C$(I,J)
777 LET D=D-1
780 LET P(I,J)=Z
790 LET C$(I,J)=CHR$ P
800 POKE DF+Z,CODE N$(I)+128*(P=56)
810 LET I$=STR$ (Z-INT (Z/33)*33)+CHR$ (37+INT (Z/33))
820 GOTO 270+560*(D=0)+200*(D=0 AND P<>8)
830 GOSUB 1890
840 PRINT "DOOR ZOEKLICHT GERAAKT."
845 GOSUB 1850
850 GOTO 910
860 GOSUB 1890
861 LET S=0
862 GOTO 870
866 LET S=160
868 GOSUB 1890
870 PRINT "VERKEERDE ZET. NOG EENS."
880 GOSUB 1850
890 IF D>0 THEN GOTO 180+S
895 GOSUB 1890
900 PRINT "P.O.W. ZONDER UITRUSTING"
910 PRINT "KEERT TERUG NAAR CENTRALE PLAATS"
912 GOSUB 1850
915 LET CX=INT (RND*4)+16
920 LET CY=INT (RND*4)+9
925 IF PEEK (DF+33*CY+CX)<>136 THEN GOTO 915
930 FOR D=1 TO 5
935 POKE DF+P(I,J),CODE N$(I)+128
940 POKE DF+P(I,J),CODE N$(I)
950 NEXT D
960 POKE DF+P(I,J),CODE C$(I,J)
970 LET P(I,J)=33*CY+CX
980 LET C$(I,J)="█"
990 FOR D=1 TO 5
995 POKE DF+P(I,J),CODE N$(I)+128
1000 POKE DF+P(I,J),CODE N$(I)
1002 NEXT D
1030 NEXT I
1040 GOSUB 1890
1050 LET D=INT (RND*6)+1
1060 LET X=D
1070 PRINT "DUITSERS KUNNEN ";D;" STAP";"PEN" AND D>1;"."
1075 GOSUB 1850
1080 GOSUB 1890
1090 PRINT "VOER KOORDINATEN VAN DUITSER"
1100 PRINT "DIE JE WILT VERPLAATSEN."
1110 INPUT I$
1120 IF LEN I$<2 OR LEN I$>3 OR CODE I$(LEN I$)<38 OR CODE I$(LEN I$)>56 THEN GOTO 1720
1130 FOR V=1 TO LEN I$-1
1140 IF CODE I$(V)<28 OR CODE I$(V)>37 THEN GOTO 1720
1150 NEXT V
1160 LET PY=CODE I$(LEN I$)-37
1170 LET PX=VAL I$(1 TO LEN I$-1)
1180 IF PX<1 OR PX>31 THEN GOTO 1720
1190 IF PEEK (DF+PX+33*PY)<>44 THEN GOTO 1720
1200 FOR J=1 TO N*2+3
1210 IF G(J)=PX+PY*33 THEN GOTO 1230
1220 NEXT J
1230 GOSUB 1890
1240 PRINT "STAP ";X-D+1;",VOER RICHTING IN"
1250 PRINT "OF 9 VOOR EEN ANDERE DUITSER."
1260 INPUT M$
1270 IF LEN M$<>1 OR CODE M$<33 OR CODE M$>37 THEN GOTO 1728
1280 LET M=VAL M$
1290 IF M=9 THEN GOTO 1080+(D=0)+630
1300 LET Z=G(J)
1320 IF M=5 AND PX>1 THEN LET Z=Z-1
1330 IF M=8 AND PX<31 THEN LET Z=Z+1
1340 IF M=6 AND PY<19 THEN LET Z=Z+33
1350 IF M=7 AND PY>1 THEN LET Z=Z-33
1360 IF Z=G(J) THEN GOTO 1727
1370 LET P=PEEK (DF+Z)
1380 IF P<>38 AND P<>42 AND P<>43 AND P<>40 THEN GOTO 1660
1390 FOR I=1 TO 4
1400 FOR K=1 TO 4
1410 IF Z=P(I,K) THEN GOTO 1440
1420 NEXT K
1430 NEXT I
1440 IF C$(I,K)="S" OR C$(I,K)="[▒]" THEN GOTO 1727
1450 GOSUB 1890
1460 PRINT N$(I);" P.O.W. GEVANGEN."
1470 PRINT "TERUG NAAR CENTRALE PLAATS"
1480 LET CX=INT (RND*4)+16
1490 LET CY=INT (RND*4)+9
1500 IF PEEK (DF+CX+33*CY)<>136 THEN GOTO 1480
1510 FOR D=1 TO 5
1520 POKE DF+P(I,K),CODE N$(I)+128
1530 POKE DF+P(I,K),CODE N$(I)
1540 NEXT D
1550 LET P(I,K)=33*CY+CX
1560 FOR D=1 TO 5
1570 POKE DF+P(I,K),CODE N$(I)+128
1580 POKE DF+P(I,K),CODE N$(I)
1590 NEXT D
1600 POKE DF+Z,44
1610 POKE DF+G(J),CODE G$(J)
1620 LET G$(J)=C$(I,K)
1630 LET C$(I,K)="[▒]"
1640 LET G(J)=Z
1650 GOTO 1740
1660 IF P<>55 AND P<>55 AND P<>0 AND P<>8 AND P<>27 AND P<>57 AND P<>60 AND P<>176 AND P<>181 AND P<>183 THEN GOTO 1727
1670 POKE DF+Z,44
1680 POKE DF+G(J),CODE G$(J)
1690 LET G(J)=Z
1700 LET G$(J)=CHR$ P
1702 LET D=D-1
1705 LET I$=STR$ (Z-INT (Z/33)*33)+CHR$ (37+INT (Z/33))
1710 GOTO 1230-(D=0)*1190
1720 GOSUB 1890
1723 LET S=0
1725 GOTO 1730
1728 LET S=150
1729 GOSUB 1890
1730 PRINT "VERKEERDE ZET. NOG EENS."
1731 GOSUB 1880
1732 GOTO 1090+S
1740 GOSUB 1880
1750 GOTO 40
1760 GOSUB 1890
1764 POKE DF+P(I,J),27
1766 POKE DF+Z,CODE N$(I)
1770 PRINT "EINDE SPEL.GEVANGENE KON"
1780 PRINT "ONTSNAPPEN. NOG EENS? J/N."
1790 INPUT V$
1800 IF CODE V$=51 THEN STOP
1810 IF CODE V$<>47 THEN GOTO 1790
1820 CLS
1830 CLEAR
1840 GOTO 10
1850 FOR L=1 TO 80
1860 NEXT L
1870 RETURN
1880 GOSUB 1850
1890 PRINT AT 20,0;" "
1900 PRINT AT 21,0;" "
1910 PRINT AT 19,0
1920 RETURN
1930 PRINT TAB 4; "▛▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▜ ▌ COLDITZ CASTLE ▐ ▌ LOGICAL COMPUTERS ▐ ▙▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▟"
1940 PRINT ,,,,"WIL JE EERST DE SPELREGELS ZIEN?"
1950 INPUT V$
1960 IF CODE V$=51 THEN GOTO 2370
1970 IF CODE V$<>47 THEN GOTO 1940
1980 CLS
1985 PRINT "COLDITZ CASTLE-LOGICAL COMPUTERS▀▀▀▀▀▀▀▀▀▀▀▀▀▀ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀"
1990 PRINT ,,"ER SPELEN 2-5 SPELERS."
2000 PRINT "EEN ALS DUITSER,DE REST ALS"
2010 PRINT "GROEP GEVANGENEN (POW)."
2020 PRINT "DE POWS MOETEN UIT HET KASTEEL"
2030 PRINT "OP DOEL ""T"" KOMEN,TERWIJL"
2040 PRINT "DE DUITSERS HEN MOET STOPPEN."
2060 PRINT ,,"VERZAMEL ALS POW "
2070 PRINT "DE VOLGENDE UITRUSTINGEN:"
2080 PRINT "1) TOUWEN VOOR OVER MUREN -"
2090 PRINT " EEN TOUW VOOR EEN ""R"""
2100 PRINT " TWEE VOOR EEN ""[R]"""
2110 PRINT "2) PASSEN OM DEUREN TE "
2120 PRINT " PASSEREN (=""[P]"")"
2130 PRINT "3) SLEUTELS OM ANDERE DEUREN"
2140 PRINT " TE PASSEREN (=""[K]"")"
2150 PRINT "4) NIJPTANGEN OM DRADEN DOOR"
2160 PRINT " TE KNIPPEN (""[W]"")"
2170 PRINT AT 21,0;"▌DRUK OP EEN WILLEKEURIGE TOETS▐"
2180 IF INKEY$ ="" THEN GOTO 2180
2190 CLS
2200 PRINT "OF,HET MINST WAARSCHIJNLIJK,"
2210 PRINT ,,"5) GRAAFUITRUSTING VOOR HE#"
2220 PRINT " GRAVEN VAN TUNNEL. POW MET"
2230 PRINT " DIT GAAT DIREKT VAN EEN ""[T]"""
2240 PRINT " NAAR EEN ANDERE ""[T]""."
2260 PRINT ,,"N.B. UITRUSTING IS EENMALIG."
2270 PRINT "ELKE POW DIE UITRUSTING ZOEKT"
2280 PRINT "MAAR DAT NIET HEEFT,KAN DOOR"
2290 PRINT "EEN ZOEKLICHT (=""[▒]"") GEPAKT"
2300 PRINT "WORDEN,OF DOOR DUITSER TERUG-"
2310 PRINT "GEBRACHT NAAR CENTRALE PLAATS"
2320 PRINT "OP PUNT ""S"" IS EEN POW VEILIG"
2330 PRINT "EENMAAL BUITEN,MOET EEN POW"
2340 PRINT "HET PAD "".."" VOLGEN,EN KAN"
2350 PRINT "NIET TERUGKEREN,TENZIJ HIJ"
2360 PRINT "DOOR DUITSERS WORDT GEPAKT."
2370 PRINT AT 21,0;"HOEVEEL SPELERS? 2-5"
2380 INPUT Z$
2390 IF LEN Z$<>1 OR CODE Z$<30 OR CODE Z$>33 THEN GOTO 2380
2400 LET N=VAL Z$-1
2410 CLS
2420 PRINT "WACHT EVEN A.U.B."
2430 DIM P(4,4)
2440 DIM E(4,5)
2450 DIM G(3+N*2)
2460 DIM E$(5,16)
2470 DIM N$(4,8)
2480 DIM C$(4,4)
2490 DIM G$(3+N*2)
2500 FOR Z=1 TO 4
2510 FOR Y=1 TO 4
2520 LET C$(Z,Y)="[▒]"
2530 NEXT Y
2540 NEXT Z
2550 LET P$="E=BRITS A=USA F=FRANS C=CANADA"
2560 FOR Z=1 TO 4
2570 LET N$(Z)=P$(Z*8-7 TO Z*8)
2580 NEXT Z
2590 LET P$="TOUW PASPOORT SLEUTEL NIJPTANG TUNNELUITRUSTING"
2600 FOR Z=1 TO 5
2610 LET E$(Z)=P$(Z*16-15 TO Z*16)
2620 NEXT Z
2630 PRINT ,,"IK MOET EVEN REKENEN"
2640 LET P$="079236323469484209193337619220546"
2650 FOR Z=1 TO 3+N*2
2660 LET G(Z)=VAL P$(Z*3-2 TO Z*3)
2670 NEXT Z
2680 LET P$="313349381413314348382412315347379415316346380414"
2690 FOR Z=1 TO 4
2700 FOR Y=1 TO 4
2710 LET P(Z,Y)=VAL P$(Z*12+Y*3-14 TO Z*12+Y*3-12)
2720 NEXT Y
2730 NEXT Z
2740 LET DF=PEEK 16396+256*PEEK 16397+1
2750 CLS
2760 PRINT " 1234567890123456789012345678901"
2770 PRINT "A.... ████[C][O][L][D][I][T][Z]████*** ....T.."
2780 PRINT "B. . █S S [K] R W..*** ."
2790 PRINT "C. █[R]██ ▛▀▜ ▙▄▄▄▟ █ █ **** W..."
2800 PRINT "DT █ [K] [P] S █ [▒][▒][▒] *** "
2810 PRINT "E. █[P]▀▜R▙▄▟ ▛ ▜ ▛▀▜ ████R██ * "
2820 PRINT "F. █ S▌ ▌ ▐ ▐ [P] S█ * "
2830 PRINT "G. █ ▛▘ ▙[P]▟▀▜ ▟ ▙▟ ▛▀▀█R█ W."
2840 PRINT "H. █ ▛▜ ▌S ▙ [K] [P] █ *."
2850 PRINT "I. █[▒]▌ S ▙ ▛ [▒][▒][▒][▒] ▛ ▛ ▜ █ *."
2860 PRINT "J..[▒][▒]▙▟ R ▛▜ ▌ [▒][▒][▒][▒] ▙ S▐[K]▙█R█."
2870 PRINT "K. █[▒] ▛ S▐ ▌ [▒][▒][▒][▒] ▙▄▟ █."
2880 PRINT "L..[T] ▌ [T]▐ ▙ [▒][▒][▒][▒] ▛ ▛▜ █."
2890 PRINT "M. █[P]▛▀▀▜▀▀▀▛ ▌ ▛▀▜ ▌S █T"
2900 PRINT "N. █ ▌ ▜ ▛▀▜ ▛▘ ▙S▐[K]▙███."
2910 PRINT "O. █ ▙ ▐[R]▙▄▄▙▄▟ ▌ ▐ [R]..."
2920 PRINT "PT █ ▐..[R] [P] [K] █R███R████* ."
2930 PRINT "Q. █[R]███.████████[P]██ [▒][▒] * ."
2940 PRINT "R. . . ..W [▒][▒] W.."
2950 PRINT "S.... ...T...... *********** "
2960 FOR I=1 TO N
2970 POKE DF+P(I,1),CODE N$(I)
2980 POKE DF+P(I,2),CODE N$(I)
2990 POKE DF+P(I,3),CODE N$(I)
3000 POKE DF+P(I,4),CODE N$(I)
3010 NEXT I
3020 FOR I=1 TO 3+N*2
3030 POKE DF+G(I),44
3040 NEXT I
3050 RETURN
9989 STOP
9990 SAVE "COLDIT[Z]"
9999 RUN
Note: Type-in program listings on this website use ZMAKEBAS notation for graphics characters.