Word Cross

Products: Word Cross
Date: 1983
Type: Program
Platform(s): TS 2068
Tags: Game

Word Cross is a crossword-placement game in which the player positions words from a themed list onto an 18×18 grid, scoring points each time a letter overlaps (“crosses”) a letter already on the board. The program ships with six built-in word lists (Colors, States of America, Countries, Food, Clothes, Flowers) and allows the player to type in a custom list of up to 20 words of up to 10 letters each. Collision detection is handled entirely in BASIC through a flat 324-character string array that mirrors the grid, with the `fit` subroutine checking all four orthogonal adjacency directions before a placement is accepted or rejected. The logo routine at line 4000 uses CIRCLE and POINT-scanning to draw a filled circle, combined with block-graphic characters to render a stylized banner; a random border/paper color is selected at startup, with colors 2–4 excluded to ensure legibility.


Program Analysis

Program Structure

The program is organized as a collection of named subroutines, with line 10 acting as a symbol table that stores all entry-point line numbers in named variables (e.g., fit=20, squares=100, logo=4000). Line 12 jumps to start (line 75), which chains through the major initialization routines before falling into the main game loop at prog (line 500). This symbol-table pattern makes the control flow readable and allows line numbers to be changed without hunting through every GO TO.

Grid Representation

The 18×18 crossword grid is stored as a single flat string c$ of 324 characters, initialized with spaces. The mapping from grid row r and column c to a string index is q = 18*(r-2) + c-12, computed at line 20. Words placed across advance by stride s=1; words placed down advance by stride s=18. The complementary stride s2 = 19-s (either 18 or 1) is used in adjacency checks, neatly unifying across/down logic.

The fit Subroutine (Lines 20–70)

This is the collision-detection core. For each letter of the word being placed it sets six Boolean flags:

  • f — the target cell is already occupied by a different letter (hard clash)
  • f1 — there is a letter immediately ahead in the perpendicular direction (would create an illegal adjacency)
  • f2 — there is a letter immediately behind in the perpendicular direction
  • f3 — there is a letter immediately before in the placement direction (word would run into existing content)
  • f4 — there is a letter immediately after in the placement direction
  • f5 — the letter matches the existing cell content (a valid crossing)
  • f6 — signals that a crossing occurred for this specific letter, triggering a score increment and a beep

If any of f through f4 is set after iterating over all letters, the placement is rejected via the fault subroutine. A placement where every letter matches existing content (all f6, making a1 = w(n)) is caught at line 598 and routed to the cheat handler.

Word List Subsystem (Lines 2500–2566)

Six built-in word lists are stored as space-delimited strings (e.g., x$) in subroutines at lines 2510, 2520, 2530, 2540, 2550, and 2560. The item subroutine (line 2030) parses x$ by scanning for space delimiters, populating the w$() string array and w() length array. The menu at line 2500 selects a list via GO SUB 2500+10*VAL i$, a compact computed GO SUB that avoids a chain of IF statements. Custom word entry is handled by the ownlist routine (lines 120–197); re-entry is blocked by a non-empty sentinel o$.

Scoring and Game Progression

Each letter that lands on a matching existing letter scores one point (accumulated in a1 per word, a overall). Every five crossings the player is offered a stop/continue choice via the option subroutine (line 2100). Reaching 20 crossings triggers the win sequence at line 620. Up to five placement errors are allowed; the mistake counter m is tracked in the mistake subroutine (line 3030), and exhausting all five attempts routes to a game-over branch at line 3040.

Logo Routine (Lines 4000–4028)

The startup logo at line 4000 picks a random border/paper color excluding codes 2–4 (to avoid dark-on-dark combinations). It draws a filled circle using CIRCLE followed by a scanline fill: for each row from 115 to 170, the routine walks pixel-by-pixel with POINT until it hits the circle boundary, then draws a horizontal line across the diameter with DRAW. Block-graphic characters build a decorative banner. The publisher name is animated by printing it from the edges inward in a loop at lines 4016–4018.

Input Handling

The ucase subroutine (line 2000) provides a reusable uppercase-only keypress reader: it loops until a letter is detected (CODE q$ in A–Z or a–z range) and converts lowercase to uppercase by subtracting 32 from the character code. The custom word-entry routine (line 140 onward) uses a software cursor with delete support via CHR$ 12 (Spectrum DELETE), rebuilding the input string on each deletion.

Error Handling

Line 3 installs ON ERR GO TO 9990 as a global error trap. The handler at lines 9990–9993 cascades through RESET, a pause, a re-trap, and finally ON ERR CONTINUE, attempting to recover gracefully rather than halt. Line 9899 provides a PAUSE 250: RUN restart stub. Line 9900 contains the SAVE block with a machine-code companion blob saved as CODE USR "a", 168, though this code is not called within the visible BASIC listing.

Notable Bugs and Anomalies

  • Line 630 references variable col (in PAPER col) inside the win-display loop, but col is never explicitly assigned — only col2 is set during play. This will cause an error unless the error trap intervenes.
  • Line 144 is referenced by the GO TO 144+2*(i$="") idiom at line 180, but line 144 does not exist; the nearest lower line is 140. On the Spectrum, a GO TO to a non-existent line number jumps to the next higher line, so this is intentional: when i$ is non-empty it goes to line 146 (re-read key), and when empty it falls through to line 145 (draw cursor).
  • Line 152 references GO TO 144 (delete-character logic), again relying on the non-existent-line behavior to land at line 145.
  • At line 3053, after game over the replay uses GO TO 530, but line 530 does not exist; control will fall to line 540, skipping the initial CLS and variable resets in lines 500–510, potentially leaving stale state.
  • Lines 2030–2054 (item) assume words in x$ are always terminated by a space, and that there are always exactly 20 words; if fewer words are present the FOR i=1 TO w loop will attempt to index past the end of x$.

Related Products

If you enjoy the challenge of crossword puzzles, you’ll enjoy wordcross. To become an expert, you must insert words into...

Image Gallery

Source Code

    1 REM      Wordcross                      \  \  \  \  \  \  \  \  \  \  \      
    2 REM  \* FISHER-MARRIOTT                 #3    9/2/83                  ZX  Spectrum 48K  
    3 ON ERR GO TO 9990
    5 LET o$="": LET z$="WORDCROSS": LET a$=" 0": LET d$="\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s\s": DIM w$(20,11): DIM w(20): DIM c$(324)
   10 LET option=2100: LET clear=750: LET clever=1510: LET long=700: LET item=2030: LET prog=500: LET cheat=1500: LET replay=3050: LET mistake=3030: LET ucase=2000: LET choose=2010: LET start=75: LET ownlist=120: LET fault=3000: LET intro=1000: LET fit=20: LET squares=100: LET logo=4000: LET lists=2500
   12 GO TO start
   19 REM fit
   20 LET q=18*(r-2)+c-12
   22 IF i<>w(n) THEN GO TO 36
   25 IF q+s>324 THEN GO TO 29
   27 IF c$(q+s)="\s" THEN GO TO 36
   28 LET f5=1
   29 IF c$(q)=w$(n,i) THEN GO TO 66
   30 IF r+s=37 OR c+s=31 THEN GO TO 36
   32 LET f4=1
   36 IF i<>1 THEN GO TO 46
   37 IF q-s<1 THEN GO TO 40
   38 IF c$(q-s)="\s" THEN GO TO 46
   39 LET f5=1
   40 IF c$(q)=w$(n,i) THEN GO TO 66
   41 IF r+s=20 OR c+s=14 THEN GO TO 46
   42 LET f3=1
   46 IF c$(q)=w$(n,i) THEN GO TO 66
   47 IF q-s2<1 THEN GO TO 49
   48 IF c$(q-s2)="\s" THEN GO TO 52
   49 IF r+s=3 OR c+s=31 THEN GO TO 52
   50 LET f2=1
   52 IF q+s2>324 THEN GO TO 56
   54 IF c$(q+s2)="\s" THEN GO TO 61
   56 IF r+s=20 OR c+s=48 THEN GO TO 61
   58 LET f1=1
   61 IF c$(q)="\s" THEN GO TO 70
   63 LET f=1
   64 GO TO 70
   66 PRINT AT r,c;""+w$(n,i)+"": BEEP .25,12: LET a1=a1+1: PRINT AT 0,26-LEN STR$ (a1+a);""+STR$ (a1+a)+"": LET f6=1
   70 RETURN 
   74 REM start
   75 GO SUB logo
   76 GO SUB squares
   77 GO SUB intro
   78 GO SUB lists
   79 GO TO prog
   99 REM squares
  100 FOR i=1 TO 18: LET c$((i-1)*18+1 TO i*18)=d$: NEXT i: RETURN 
  119 REM ownlist
  120 IF o$<>"" THEN GO TO 5000
  125 CLS : PRINT "\s\a\s ";z$;AT 5,0;"\a\s\a You may",,"\a\s\a enter up",,"\a\s\a to TWENTY",,"\a\s\a words.";AT 14,0;"\s\a\s Each word",,"\s\a\s may contain",,"\s\a\s up to TEN",,"\s\a\s letters."
  127 PRINT AT 21,0;"Press any key when ready"; PAPER 8
  128 IF INKEY$="" THEN GO TO 128
  129 CLS : PRINT "\s\a\s ";z$;AT 3,0;"\a\s\a End each",,"\a\s\a word with",,"\a\s\a ""ENTER""";AT 9,0;"\s\a\s PRESS 0",,"\s\a\s if your",,"\s\a\s LAST WORD",,"\s\a\s comes",,"\s\a\s BEFORE",,"\s\a\s NUMBER 20."
  130 PRINT AT 18,0;"\a\s\a If you make",,"\a\s\a a MISTAKE,",,"\a\s\a press SHIFT",,"\a\s\a and DELETE."
  131 PRINT AT 12,20;"Press any";AT 13,20;"key  when";AT 14,20;"  ready  "
  133 IF INKEY$="" THEN GO TO 133
  134 PRINT AT 12,20;"         ";AT 13,20;"         ";AT 14,20;"         ": FOR i=1 TO 20
  138 PRINT AT i,18-(i>9);i;">          <"
  139 IF INKEY$<>"" THEN GO TO 139
  140 LET p=20: LET n$=""
  145 PRINT AT i,p;"\s"
  146 LET i$=INKEY$: IF i$="" THEN GO TO 146
  152 IF i$=CHR$ 12 AND p>20 THEN PRINT AT i,p-1;"  ": LET p=p-1: LET n$=n$( TO LEN n$-1): GO TO 144
  155 IF i$=CHR$ 13 AND n$<>"" THEN GO TO 190
  158 IF i$="0" AND n$="" AND i>2 THEN LET i=20: GO TO 194
  160 IF CODE i$<65 OR CODE i$>122 THEN GO TO 138
  161 IF CODE i$>90 AND CODE i$<97 THEN GO TO 138
  164 LET n$=n$+i$: PRINT AT i,20;n$: IF LEN n$>10 THEN GO TO 138
  166 LET p=p+1
  180 GO TO 144+2*(i$="")
  190 PRINT AT i,p;" ";AT i,30;" ": LET w$(i)=n$: LET w=i: LET w(i)=LEN n$
  194 NEXT i: LET o$="YES": CLS : PRINT AT 10,0;"\a\s\a Thank you for the words.",,,,,"\a\s\a WORDCROSS coming soon."
  197 FOR i=1 TO 100: NEXT i: RETURN 
  499 REM prog
  500 CLS : LET a=0: LET a2=0: LET a$=" 0": LET m=0: LET p=10: LET u=11-INT (w/2): LET d=u+w-1
  501 CLS : PRINT TAB 16;" Score: ";a$;" "; PAPER 8;TAB 12;" ABCDEFGHIJKLMNOPQR "
  502 FOR i=1 TO 17 STEP 2: PRINT AT i+1,12;""+CHR$ (i+64)+"";TAB 31;""+CHR$ (i+64)+"";TAB 12;""+CHR$ (i+65)+"";TAB 31;""+CHR$ (i+65)+"": NEXT i
  503 PRINT TAB 12;" ABCDEFGHIJKLMNOPQR "
  505 FOR i=0 TO 17: PRINT PAPER 0;AT i+2,13;c$(18*i+1 TO 18*i+18): NEXT i
  507 FOR i=0 TO 10-w/2: PRINT AT i,0;TAB 12: NEXT i
  510 GO SUB choose: GO SUB clear
  540 LET n=p-u+1: PRINT AT 1,0;"";w$(n, TO w(n));""; PAPER 8;AT 3,0;"Start at";AT 5,0;"Column >>?";
  541 GO SUB ucase: IF q$>"R" THEN GO TO 541
  542 PRINT CHR$ 8;"";q$;"": LET c=CODE q$-52: LET c1=c: PRINT AT 1,c;"\s";AT 20,c;"\s";AT 7,0;"Row >>>>>?";: GO SUB ucase
  544 PRINT CHR$ 8;"";q$;"";: LET r=CODE q$-63: LET r1=r: PRINT AT r,12;"\s";AT r,31;"\s";AT r,c;"*";AT 9,0;"O.K.";AT 10,0;"(Y OR N)?"
  546 GO SUB ucase: IF q$<>"Y" AND q$<>"N" THEN GO TO 546
  560 IF q$="N" THEN GO TO 501
  563 PRINT AT 9,0;"Press";AT 10,0;"A Across ";AT 11,0;"D Down"
  565 GO SUB ucase: GO TO 565+2*(q$="A" OR q$="D")
  567 PRINT AT 9,0;"     ";AT 10,0;"        ";AT 11,0;"      "
  568 LET s=(q$="A")+18*(q$="D"): LET s2=19-s
  572 IF (s=1 AND (c+w(n)>=32)) OR (s=18 AND (r+w(n)>=21)) THEN GO SUB long: GO SUB mistake: GO TO replay
  580 LET f5=0: LET a1=0: FOR i=1 TO w(n): LET f=0: LET f1=0: LET f2=0: LET f3=0: LET f4=0: LET f6=0: GO SUB fit
  582 IF f OR f1 OR f2 OR f3 OR f4 THEN GO SUB fault: GO SUB mistake: GO TO replay
  590 LET col2=INT (RND*6)+1
  592 IF f6 THEN GO TO 596
  594 PRINT PAPER col2;AT r,c;w$(n,i): BEEP .1,-12
  596 LET r=r+(s=18): LET c=c+(s=1): NEXT i
  598 IF a1=w(n) THEN GO SUB cheat: GO SUB mistake: GO TO replay
  599 IF f5 THEN GO SUB clever
  600 FOR i=w(n) TO 1 STEP -1: LET c$(q)=w$(n,i): LET q=q-s: NEXT i
  601 LET a=a+a1: IF a>=20 THEN GO TO 620
  604 IF INT (a/5)>a2 THEN LET A2=A2+1: GO TO option
  606 LET a$=(" " AND a<10)+STR$ a: PRINT PAPER 7;AT 0,24;a$
  608 IF f5 THEN GO TO 501
  610 BRIGHT 1: PRINT AT 1,c1;CHR$ (c1+52);AT 20,c1;CHR$ (c1+52);AT r1,12;CHR$ (r1+63);AT r1,31;CHR$ (r1+63): BRIGHT 0: GO TO 505
  620 PAUSE 200: CLS 
  622 PRINT AT 12,0;"Well done",,"You have made ";a;" crossings,","and you have won the game.";AT 16,0;"Press  any  key"
  626 IF INKEY$="" THEN GO TO 626
  630 CLS : BRIGHT 1: PRINT AT 1,6;"\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a": FOR i=0 TO 17: PRINT AT i+2,6;"\a"; PAPER 7;c$(18*i+1 TO 18*i+18); PAPER col;AT i+2,25;"\a": NEXT i: PRINT AT 20,6;"\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a\a": BRIGHT 0
  632 PRINT AT 1,0;"Press";AT 3,0;"C to";AT 4,0;"copy";AT 6,0;"P to";AT 7,0;"play";AT 8,0;"again";AT 9,0;"using";AT 10,0;"the";AT 11,0;"same";AT 12,0;"words";AT 14,0;"N for";AT 15,0;"a new";AT 16,0;"game";AT 19,0;"S to";AT 20,0;"stop"
  633 LET q$=INKEY$: IF q$="" THEN GO TO 633
  635 GO SUB 2006
  637 IF q$="C" THEN PRINT AT 0,5: FOR i=1 TO 20: PRINT TAB 5;" ": NEXT i: COPY : GO TO 632
  639 IF q$="P" THEN GO SUB squares: GO TO prog
  640 IF q$="N" THEN GO SUB squares: GO TO 78
  642 IF q$<>"S" THEN GO TO 633
  644 CLS : PRINT AT 10,0;"\a\s\a ";z$;AT 12,4;"If anyone wants to play,";AT 13,4;"press any key";AT 14,4;"-------------"
  648 IF INKEY$<>"" THEN RUN 
  650 GO TO 648
  699 REM long
  700 PRINT AT 15,0;w$(n, TO w(n));AT 16,0;"is too long"; PAPER 8;AT 17,0;"to fit,";AT 18,0;"going";AT 19,0;""+("across." AND s=1)+("downwards." AND s=18);AT 21,0;"Press any key"; PAPER 8
  702 IF INKEY$<>"" THEN GO TO 702
  704 IF INKEY$="" THEN GO TO 704
  706 RETURN 
  749 REM clear
  750 PRINT AT 0,0;: FOR i=0 TO 20: PRINT TAB 11;" ": NEXT i: PRINT TAB 31;" ": RETURN 
  999 REM intro
 1000 CLS : FOR i=1 TO 9: IF i=5 THEN PRINT AT 12,4;"C": BEEP .25,24: GO TO 1002
 1001 PRINT AT 7+i,4;""+z$(i)+"";: BEEP .1,12: PRINT AT 12,i-1;""+z$(i)+"": BEEP .1,12
 1002 NEXT i: BEEP .25,12
 1003 PRINT AT 2,13;"\a Your aim is to";AT 3,13;"\a fit words on";AT 4,13;"\a to a grid, making";AT 5,13;"\a them ""cross"".";AT 7,13;"\s You can choose";AT 8,13;"\s to stop after";AT 9,13;"\s 5,10,15, or 20";AT 10,13;"\s crossings.";AT 12,13;"\a Your WORDCROSS";AT 13,13;"\a will then";AT 14,13;"\a be complete."
 1004 PRINT AT 16,13;"\s But"; PAPER 8;", you are not";AT 17,13;"\s allowed more than";AT 18,13;"\s FIVE mistakes.";AT 20,13;"Press any key"; PAPER 8
 1005 IF INKEY$="" THEN GO TO 1005
 1006 RETURN 
 1499 REM cheat
 1500 CLS : PRINT AT 10,0;"\a\s\a It is no good";AT 11,4;"trying to get extra points";AT 12,4;"that way."
 1503 PRINT AT 14,0;"Over-printing is not allowed.";AT 15,0;"\''\''\''\''\''\''\''\''\''\''\''\''\''\''\''\''\''\''\''\''\''\''\''\''\''\''\''\''"; INK 9
 1504 PRINT AT 18,4;"Press any key"
 1505 IF INKEY$<>"" THEN GO TO 1505
 1506 IF INKEY$="" THEN GO TO 1506
 1508 RETURN 
 1509 REM clever
 1510 CLS : PRINT AT 10,0;"\a\s\a That is very clever,";AT 11,4;"but it is not really a";AT 12,4;z$;".";AT 16,4;"However, I will allow it.";AT 18,4;"Press any key"
 1514 IF INKEY$="" THEN GO TO 1514
 1516 RETURN 
 1999 REM ucase
 2000 IF INKEY$<>"" THEN GO TO 2000
 2002 LET q$=INKEY$: IF (q$<"a" OR q$>"z") AND (q$<"A" OR q$>"Z") THEN GO TO 2002
 2006 IF CODE q$>96 THEN LET q$=CHR$ (CODE q$-32)
 2007 RETURN 
 2009 REM choose
 2010 FOR i=1 TO w: PRINT AT u+i-1,0;" "+w$(i): NEXT i
 2012 PRINT AT 0,0;"Which"; PAPER 8;" ";"word"; PAPER 8;"?";AT p,0;">";AT 21,0;"Press U or D to move,  S to STOP"
 2015 LET q$=INKEY$: GO SUB 2006: IF q$<>"S" AND q$<>"U" AND q$<>"D" THEN GO TO 2015
 2016 IF q$="S" THEN PAPER col: GO TO 2028
 2017 PRINT PAPER col;AT p,0;" "+w$(p-u+1, TO w(p-u+1))
 2018 IF q$="D" THEN LET p=p+1: IF p>d THEN LET p=u
 2019 IF q$="U" THEN LET p=p-1: IF p<u THEN LET p=d
 2020 PRINT AT p,0;">"
 2021 PAPER 7: IF col=0 OR col=7 THEN PAPER INT (RND*6)+1
 2022 PRINT AT p,1;w$(p-u+1, TO w(p-u+1)); PAPER col: BEEP .075,-12
 2024 GO TO 2015
 2028 RETURN 
 2029 REM items
 2030 LET l=LEN x$: LET c=0: LET w=20: CLS : FOR i=1 TO w: LET s=c+1
 2042 LET c=c+1: IF x$(c)=" " THEN GO TO 2050
 2048 GO TO 2042
 2050 LET col2=INT (RND*8): IF col2=col THEN GO TO 2050
 2052 PAPER col2: LET w$(i)=x$(s TO c-1): LET w(i)=c-s: PRINT AT i,5;"Found"; PAPER col;" ";"";w$(i, TO w(i));""
 2054 NEXT i: PAUSE 200: PAPER col: RETURN 
 2099 REM option
 2100 CLS : PRINT AT 10,0;"\a You have made ";a;" crossings.";AT 12,0;"\s Choose";AT 14,5;"S to stop.";AT 16,5;"C to carry on."
 2105 IF INKEY$<>"" THEN GO TO 2105
 2110 IF INKEY$="S" OR INKEY$="s" THEN GO TO 630
 2112 IF INKEY$="C" OR INKEY$="c" THEN CLS : LET f5=1: GO TO 606
 2114 GO TO 2110
 2499 REM lists
 2500 CLS : PRINT "\a\s\a Lists for ";z$;AT 4,0;"CHOOSE",,,,,,"1  Colors",,,,"2  States of America",,,"3  Countries",,,,"4  Food",,,,"5  Clothes",,,,"6  Flowers",,,,"7  Put in your own list"
 2501 LET i$=INKEY$: IF i$="7" THEN GO SUB ownlist: RETURN 
 2502 IF i$>"0" AND i$<"7" THEN LET w=20: GO SUB 2500+10*VAL i$: GO SUB item: RETURN 
 2503 GO TO 2501
 2510 LET x$="indigo maroon red blue green yellow scarlet navy pink orange brown white black gold silver purple gray fawn sepia cream " 
 2514 LET n$="Colors"
 2516 RETURN 
 2520 LET x$="OREGON NEBRASKA ARKANSAS IDAHO WASHINGTON ILLINOIS FLORIDA LOUISIANA OKLAHOMA UTAH GEORGIA HAWAII MINNESOTA MICHIGAN MAINE CALIFORNIA NEVADA TEXAS MISSOURI KENTUCKY "
 2524 LET N$="States of America"
 2526 RETURN 
 2530 LET X$="FRANCE SPAIN PORTUGAL BRAZIL COLOMBIA CHILE CHINA INDIA BURMA AUSTRALIA ZIMBABWE ALGERIA ISRAEL TURKEY CANADA MEXICO NIGERIA GERMANY ENGLAND IRELAND "
 2534 LET N$="Countries"
 2536 RETURN 
 2540 LET x$="sugar honey peanuts popcorn cornflakes bacon egg sausage hamburgers tomatoes bread butter candy lettuce cucumber fruit vegetables cookies spaghetti beans "
 2544 LET n$="Food"
 2546 RETURN 
 2550 LET x$="slacks skirt jumper vest socks belt raincoat shoes pants shirt blouse boots sweater tights sneakers tie jeans cap slippers pajamas "
 2554 LET n$="Clothes"
 2556 RETURN 
 2560 LET x$="rose pansy carnation daffodil magnolia buttercup tulip crocus snowdrop lily daisy zinnia clematis iris poppy lilac laburnum hyacinth camellia orchid "
 2562 LET n$="Flowers"
 2566 RETURN 
 2999 REM fault
 3000 PRINT AT 14,0;
 3001 IF f THEN PRINT c$(q);" and ";w$(n,i)
 3002 IF f1 THEN PRINT w$(n,i);" and ";c$(q+s2)
 3003 IF f2 THEN PRINT c$(q-s2);" and ";w$(n,i)
 3004 IF f3 THEN PRINT c$(q-s);" and ";w$(n,i)
 3005 IF f4 THEN PRINT w$(n,i);" and ";c$(q+s)
 3006 PRINT "do not fit"; PAPER 8
 3012 PRINT AT r,c;""+w$(n,i)+""
 3014 IF f1 THEN PRINT AT r+(s=1),c+(s=18);""+c$(q+s2)+""
 3016 IF f2 THEN PRINT AT r-(s=1),c-(s=18);""+c$(q-s2)+""
 3018 IF f3 THEN PRINT AT r-(s=18),c-(s=1);""+c$(q-s)+""
 3020 IF f4 THEN PRINT AT r+(s=18),c+(s=1);""+c$(q+s)+""
 3022 IF INKEY$<>"" THEN GO TO 3022
 3025 IF f THEN PRINT AT r,c;w$(n,i): PAUSE 10: PRINT AT r,c;c$(q): PAUSE 10
 3026 PRINT AT 21,0;"Press  any  key"; PAPER 8
 3027 IF INKEY$="" THEN GO TO 3025
 3028 RETURN 
 3029 REM mistake
 3030 LET M=M+1: CLS : PRINT AT 10,0;"\a\s\a You have made ";m;" mistake"+("s" AND m>1);"."
 3031 IF m=5 THEN GO TO 3040
 3033 PRINT AT 14,0;"\a\s\a You have ";5-m;" chance"+("s" AND m<>4);" left.": GO TO 3045
 3040 PRINT AT 14,0;"\a\s\a Sorry, that was your";AT 15,4;"last chance."
 3045 PRINT AT 20,4;"Press  any  key"; PAPER 8
 3046 IF INKEY$<>"" THEN GO TO 3046
 3047 IF INKEY$="" THEN GO TO 3047
 3048 RETURN 
 3049 REM replay
 3050 IF m<5 THEN GO TO 501
 3052 CLS : PRINT AT 5,4;"\a\s\a ";z$;AT 12,4;"Press";AT 14,4;"A  To play again,";AT 15,7;"using the same words.";AT 18,4;"B  To play again,";AT 19,7;"but with new words."
 3053 GO SUB 2000: IF q$="A" THEN GO TO 530
 3055 IF q$="B" THEN GO TO 110
 3057 GO TO 3053
 4000 LET col=INT (RND*8): IF col=2 OR col=3 OR col=4 THEN GO TO 4000
 4001 BORDER col: PAPER col: CLS : INK 9: CIRCLE 128,115,56
 4002 DIM c$(324)
 4003 LET p=72: FOR i=115 TO 170
 4005 IF POINT (p,i) THEN PLOT p,i: DRAW 2*(128-p),0: BEEP .01,p-72: PLOT p,230-i: DRAW 2*(128-p),0: BEEP .01,p-72: GO TO 4007
 4006 LET p=p+1: GO TO 4005
 4007 NEXT i
 4009 IF col>3 THEN PAPER 0: INK 7: BRIGHT 1
 4010 IF col>3 THEN PAPER 7: INK 0
 4011 FOR j=4 TO 8: PRINT AT j,11;" \::\::\::\::\  \::\  \::\  ": NEXT j
 4013 PRINT AT 4,12;"\..\..\..\::\  \..\  \..";AT 6,12;"\..\..": PAPER col: INK 9: BRIGHT 0
 4014 PRINT AT 10,15;"-": FOR J=0 TO 7
 4016 PRINT AT 10,j;" FISHER";AT 10,24-j;"MARRIOTT"; PAPER col;" ": BEEP .1,42-6*j: BEEP .1,39-6*j: NEXT j
 4018 PRINT AT 10,8;" FISHER-MARRIOTT"; PAPER col;" "; INK 9
 4020 PRINT AT 16,2;"\''\''\''\''\''\''\''\''\''\''\''\''\''\''\''\''\''\''\''\''\''\''\''\''\''\''\''\''"
 4022 PRINT TAB 3;"\:    \:        \: ";TAB 3;"\:    \: \h\i\j\d\' \h\i\: \h\i\j\d\' \h\i\j\h\i\j\h\i\j";TAB 3;"\:  \:  \: \:  \: \:  \:  \: \:   \:  \:  \: \q\i\j\q\i\j";TAB 3;"\e\f\e\f\g\e\f\g\:  \e\f\: \e\f\g\:  \e\f\g\e\f\g\e\f\g";TAB 2;"\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\..\.."; INK 9
 4023 PRINT AT 12,13;"\* 1983": BEEP 1,-24: PAUSE 250
 4028 RETURN 
 5000 CLS : PRINT PAPER 7;AT 5,0;"\a\s\a Wordcross";AT 10,0;"You have already entered a      word-list."''"If you really want to enter     another list, you will          have to BREAK, and re-RUN.";AT 21,0;"Press any key"
 5002 IF INKEY$<>"" THEN GO TO 5002
 5004 IF INKEY$="" THEN GO TO 5004
 5006 GO TO start+1
 9899 PAUSE 250: RUN 
 9900 CLEAR : SAVE "wordcross" LINE 9902: SAVE " "CODE USR "a",168: STOP 
 9902 LOAD ""CODE : RUN 
 9990 ON ERR RESET 
 9991 PAUSE 100
 9992 ON ERR GO TO 9990
 9993 ON ERR CONTINUE 
 9998 STOP 
 9999 VERIFY "": VERIFY ""CODE 

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