pentzy

Date: 1984
Type: Program
Platform(s): TS 2068
Tags: Dice

Pentzy is a computerized implementation of Yahtzee-style dice scoring for up to six players, with optional computer-controlled players for any seat. The game manages three rounds of dice rolling per turn across twelve rounds, tracking seven scoring categories: ones through sixes, Quadzy (four of a kind), Full House, Straight, High, Low, and Pentzy (five of a kind). User-defined graphics are initialized via a subroutine at line 5400, which uses PEEK of system variables 23637–23638 to locate the UDG table and then POKEs the UDG address into 23675–23676, effectively remapping the UDG base pointer. The computer AI (lines 2440–3930) uses a sorted copy of the current dice values in array v() to evaluate which dice to re-roll, applying a priority-ordered decision tree spanning over 1,400 lines of BASIC to maximize scoring across all categories. A bubble-sort routine at lines 1530–1540 and 2470–2510 keeps dice values ordered for easier combination detection.


Program Structure

The program is organized into several broad regions:

  1. Lines 0–10: REM header and UDG initialization subroutine call (GO SUB to line 5400).
  2. Lines 20–210: Setup — title screen, player count input, and per-player name/computer-control configuration.
  3. Lines 220–270: Array dimensioning for scores (a$, w$, q$, f$, t$, h$, l$, c$), totals (T, n, m), dice (d, v), and category counts (y).
  4. Lines 280–1520: Main game loop — two nested loops over 12 rounds (e) and p players (z). Each turn covers up to three dice rolls, human input or AI selection of dice to re-roll, and score placement.
  5. Lines 1530–1690: Utility subroutines: bubble-sort pass (1530), dice re-roll validation and animation (1550–1690).
  6. Lines 1700–1770: Numeric score accumulator and display for the six pip categories.
  7. Lines 1780–2020: Dice face drawing subroutines using UDG block graphics, one routine per pip value (1, 2, 3, 4, 5, 6), each drawing a 3-row by 4-character die face at position x.
  8. Lines 2030–2430: Scorecard screen redraw subroutine, reading category labels and current scores from DATA statements.
  9. Lines 2440–3930: Computer AI decision engine — determines which dice to hold or re-roll.
  10. Lines 3940–5200: Computer AI scoring subroutine — decides which category to fill after the final roll.
  11. Lines 5210–5340: Short display-update helper subroutines for each scoring slot.
  12. Lines 5345: Clears the roll-label display area.
  13. Lines 5400–5430: UDG initialization — locates and POKEs the UDG base address.
  14. Lines 5440: UDG bitmap data embedded as a REM statement.
  15. Lines 5500–5520: LOAD of a separate SCREEN$ file, then SAVE commands for the two-part program.

Scoring Categories

KeyNameConditionPoints
16Ones through SixesSum of matching pip valuesVariable
qQuadzyFour of a kind25
fFull House3+2 or 2+3 matching25
sStraightFive consecutive values25
hHighTotal > 21, higher than LowSum of dice
lLowTotal > 20, lower than HighSum of dice
pPentzyFive of a kind30
(auto)BonusPip total > 6225

Array Usage

Score state is held entirely in string arrays, initialized to two spaces (" ") as a sentinel for “not yet scored.” The main pip scores are stored in a$(6*p, 2), indexed as a$(l+g) where l = 6*z-6 is the player offset and g is the die face value. Special categories use separate two-character string arrays per player: w$ (Quadzy), f$ (Full), t$ (Straight), h$ (High), l$ (Low), c$ (Pentzy), and q$ (Bonus). Totals use numeric arrays T(p), n(p) (count of pip categories filled), and m(p) (running pip total).

Dice Rolling and Animation

The rolling animation at lines 1610–1690 iterates 6 + INT(RND*5) times, randomizing selected dice values each frame using d(w) = INT(RND*6+1) and immediately dispatching to the appropriate die-face drawing subroutine at 1750 + d(w)*40 — a computed GO SUB that selects among the six face-drawing routines spaced exactly 40 lines apart (1790, 1830, 1870, 1910, 1950, 1990). A short BEEP with increasing pitch shift (.005+j*.001) accompanies each animation frame.

Computer AI — Dice Selection

The AI (lines 2440–3930) first copies the current d() array to v() and sorts it descending using a bubble sort (lines 2470–2510). The sorted copy v() is used purely for pattern matching; the unsorted d() is used to build the re-roll string d$. A helper at lines 3870–3930 translates logical “which ranked positions to keep” (stored in v$) back into actual die slot indices in d$, clearing d(j)=0 to prevent double-matching. The priority order for the AI’s dice-selection strategy is:

  1. Pentzy (five of a kind) if not yet scored
  2. Pip categories (1–6) for five-of-a-kind sets
  3. Quadzy and Full House detection
  4. Straight attempts
  5. High/Low score management
  6. Three-of-a-kind pip fills
  7. Two-of-a-kind pip fills
  8. Fallback zero-scoring of low-value categories

Computer AI — Score Placement

Lines 3940–5200 implement the AI’s scoring decision after all rolls are exhausted. This section mirrors the human scoring validation logic but uses the live d() array directly. Notably, variables n(z) and m(z) track how many pip categories have been filled and their running total respectively, allowing the AI to estimate whether the bonus threshold of 63 is reachable and to decide whether to sacrifice a pip slot or take the bonus early.

Scoreboard Display

The scorecard is redrawn by subroutine 2030, which reads category names and current score strings from DATA statements (lines 2370–2430) using a FOR loop with READ. The RESTORE at line 2280 resets the DATA pointer each time the subroutine is called. Column positions are fixed: pip names and scores appear at columns 0 and 9, special category names at column 11, and their scores at column 25. Dice-placeholder graphics (lines 2300–2360) are only drawn when T(z)=0, i.e., at the very start of a player’s game.

UDG Initialization

The subroutine at line 5400 defines two FN functions — FN h(x) and FN l(x) — for extracting the high and low bytes of a 16-bit address. It then reads the system variable at addresses 23637–23638 (the RAMTOP pointer), adds 6, and POKEs the result into 23675–23676 (the UDG pointer), effectively placing the UDG table immediately above RAMTOP. The actual UDG bitmap data is embedded in the REM statement at line 5440.

Player Sorting (Final Scores)

After all 12 rounds, if there are multiple players, a bubble sort (lines 1340–1400) sorts the T() and z$() arrays together in descending score order. The variable r is used as the shrinking upper bound of the sort, a standard optimized bubble sort technique. The player’s original color index is preserved in column 11 of z$(i) (set at line 190 as STR$(7-i)) so the final leaderboard can redisplay each player’s name in their original PAPER color.

Notable Idioms and Anomalies

  • SGN PI is used throughout as a constant equal to 1, and PI evaluates to 3 (truncated in array index contexts), serving as literal index values without storing named constants.
  • NOT PI evaluates to 0, used for INK/PAPER color 0 and AT column 0.
  • VAL "d(1)+d(2)+d(3)+d(4)+d(5)" at line 720 computes the dice total via string evaluation — an unusual but valid technique.
  • The straight detection at line 860 has a logic error: the condition d(SGN PI)=d(2)+1 AND d(PI)+1=d(2) AND d(4)+1=d(PI) AND d(4)=d(5)+1 contains a redundant and partially contradictory check (d(1)=d(2)+1 and d(3)+1=d(2) simultaneously require d(1)=d(2)+1 and d(2)=d(3)+1, which is consistent, but the unsorted d() array means this only works if dice happen to be in descending order).
  • Lines 583 and 586 are inserted between lines 580 and 590 as utility subroutines, demonstrating the common BASIC technique of using non-round line numbers to insert code between existing round-numbered lines.
  • The two-part load system (line 5500 LOADs a separate SCREEN$ file) suggests the game shipped on tape as at least two files: the BASIC program and a title/background screen.

Image Gallery

Source Code

    0 REM Pentzy \* P.Erentz 1984
   10 GO SUB VAL "5400"
   20 RANDOMIZE 
   30 PRINT #0; INK NOT PI; PAPER 7; FLASH 1;"     PRESS ANY KEY TO PLAY",:PAUSE NOT PI
   40 INK NOT PI:PAPER VAL "7":CLS :PRINT ;"   PENTZY BY P.A.ERENTZ"; AT PI* PI, PI;"Number of players? ";
   50 IF INKEY$ <>"" THEN GO TO VAL "50"
   60 IF INKEY$="" THEN GO TO VAL "60"
   70 LET k$= INKEY$:IF k$ <>"1" AND k$ <>"2" AND k$ <>"3" AND k$ <>"4" AND k$ <>"5" AND k$ <>"6" THEN GO TO VAL "70"
   80 PRINT k$:LET p= VAL k$:DIM P(p):DIM p$(p,11):DIM z$(p,11)
   90 FOR i= SGN PI TO p
  100 CLS :PRINT AT 15, NOT PI;" Do you want the Spectrum to "'" play for player ";i;"? ";
  110 IF INKEY$ <>"" THEN GO TO VAL "110"
  120 IF INKEY$="" THEN GO TO VAL "120"
  130 LET k$= INKEY$
  140 IF k$ <>"y" AND k$ <>"n" THEN GO TO 130
  150 IF k$="y" THEN LET P(i)=1:PRINT "Yes"
  160 IF k$="n" THEN PRINT "No"
  170 POKE VAL "23658", VAL "8":INPUT " Enter player's name please"'" (10 letters maximum)"; LINE p$(i)
  180 POKE VAL "23658", NOT PI
  190 LET p$(i,11)= STR$ (7-i)
  200 PRINT AT 19, NOT PI;"         "
  210 NEXT i
  220 DIM a$(6*p,2)
  230 DIM w$(p,2):DIM q$(p,2):DIM f$(p,2):DIM t$(p,2):DIM h$(p,2):DIM l$(p,2):DIM c$(p,2)
  240 LET hi=0:LET lo=hi
  250 DIM T(p):DIM n(p):DIM m(p)
  260 DIM d(5):DIM v(5)
  270 DIM y(6)
  280 FOR e=1 TO 12
  290 FOR z=1 TO p
  300 LET l=6*z-6
  310 GO SUB 2030
  320 LET d$="12345"
  330 PRINT AT 19, NOT PI; INK NOT PI; PAPER 7;"1st"'"ROLL"
  350 GO SUB 583
  360 GO SUB 1610
  370 GO SUB 5345
  380 IF P(z)=1 THEN GO SUB 2440:GO TO 440
  390 IF P(z)=0 THEN INPUT "2nd throw,which dice?"; LINE d$
  400 IF d$="0" THEN GO TO 680
  410 FOR i=1 TO LEN d$
  420 IF d$(i) <>"1" THEN IF d$(i) <>"2" THEN IF d$(i) <>"3" THEN IF d$(i) <>"4" THEN IF d$(i) <>"5" THEN GO TO 390
  430 NEXT i
  440 IF d$="0" THEN GO TO 680
  450 GO SUB 586
  460 LET r=2
  470 PRINT AT 19, NOT PI; INK NOT PI; PAPER 7;"2nd"'"ROLL"
  490 FOR i=1 TO LEN d$:PRINT AT 17,(VAL d$(i))*5+1; PAPER 7; INK 0;d$(i):NEXT i
  500 GO SUB 1550
  510 GO SUB 5345
  520 IF P(z)=1 THEN GO SUB 2440:GO TO 590
  530 GO SUB 583
  540 IF P(z)=0 THEN INPUT "3rd throw,which dice?"; LINE d$
  550 IF d$="0" THEN GO TO 680
  560 FOR i=1 TO LEN d$
  570 IF d$(i) <>"1" THEN IF d$(i) <>"2" THEN IF d$(i) <>"3" THEN IF d$(i) <>"4" THEN IF d$(i) <>"5" THEN GO TO 540
  580 NEXT i:GO TO 590
  583 FOR i=1 TO 5:PRINT AT 17,i*5+1; PAPER 7; INK 0;i:NEXT i:RETURN 
  586 FOR i=1 TO 5:PRINT AT 17,i*5+1; PAPER 7;" ":NEXT i:RETURN 
  590 IF d$="0" THEN GO TO 680
  600 GO SUB 586
  610 LET r=3
  620 PRINT AT 19, NOT PI; INK NOT PI; PAPER 7;"3rd"'"ROLL"
  640 FOR i=1 TO LEN d$:PRINT AT 17,(VAL d$(i))*5+1; PAPER 7; INK 0;d$(i):NEXT i
  650 GO SUB 1550
  660 GO SUB 5345
  670 GO SUB 586
  680 FOR i=1 TO 4:GO SUB 1530:NEXT i
  690 FOR i=1 TO 3:GO SUB 1530:NEXT i
  700 FOR i=1 TO 2:GO SUB 1530:NEXT i
  710 FOR i=1 TO 1:GO SUB 1530:NEXT i
  720 LET di= VAL "d(1)+d(2)+d(3)+d(4)+d(5)"
  730 INK 0:PAPER 7:FLASH 1
  740 IF P(z)=1 THEN GO SUB 3940:GO TO 1090
  750 INPUT "Where do you want to score?"; LINE s$
  760 IF s$="" THEN GO TO 750
  770 IF w$(z) <>"  " THEN GO TO 810
  780 IF s$="q" THEN IF d(SGN PI)=d(4) THEN LET w$(z)="25":PRINT AT 2,25;w$(z):GO TO 1090
  790 IF s$="q" THEN IF d(2)=d(5) THEN LET w$(z)="25":PRINT AT 2,25;w$(z):GO TO 1090
  800 IF s$="q" THEN LET w$(z)=" 0":PRINT AT 2,25;w$(z):GO TO 1090
  810 IF f$(z) <>"  " THEN GO TO 850
  820 IF s$(SGN PI)="f" THEN IF d(SGN PI)=d(2) AND d(PI)=d(5) THEN LET f$(z)="25":PRINT AT 4,25;f$(z):GO TO 1090
  830 IF s$(SGN PI)="f" THEN IF d(SGN PI)=d(PI) AND d(4)=d(5) THEN LET f$(z)="25":PRINT AT 4,25;f$(z):GO TO 1090
  840 IF s$(SGN PI)="f" THEN LET f$(z)=" 0":PRINT AT 4,25;f$(z):GO TO 1090
  850 IF t$(z) <>"  " THEN GO TO 880
  860 IF s$(SGN PI)="s" THEN IF d(SGN PI)=d(2)+1 AND d(PI)+1=d(2) AND d(4)+1=d(PI) AND d(4)=d(5)+1 THEN LET t$(z)="25":PRINT AT 6,25;t$(z):GO TO 1090
  870 IF s$(SGN PI)="s" THEN LET t$(z)=" 0":PRINT AT 6,25;t$(z):GO TO 1090
  880 IF h$(z) <>"  " THEN GO TO 920
  890 IF s$(SGN PI)="h" THEN LET hi=di:IF hi>21 AND l$(z)="  " THEN LET h$(z)= STR$ hi:PRINT AT 8,25;h$(z):GO TO 1090
  900 IF s$(SGN PI)="h" THEN LET hi=di:IF hi>21 AND hi> VAL l$(z) THEN LET h$(z)= STR$ hi:PRINT AT 8,25;h$(z):GO TO 1090
  910 IF s$(SGN PI)="h" THEN LET h$(z)=" 0":PRINT AT 8,25;h$(z):GO TO 1090
  920 IF l$(z) <>"  " THEN GO TO 970
  930 IF s$(SGN PI)="l" THEN LET lo=di
  940 IF s$(SGN PI)="l" THEN IF h$(z,1)=" " THEN IF lo>20 THEN LET l$(z)= STR$ lo:PRINT AT 10,25;l$(z):GO TO 1090
  950 IF s$(SGN PI)="l" THEN IF h$(z,1) <>" " THEN IF lo< VAL h$(z) AND lo>20 THEN LET l$(z)= STR$ lo:PRINT AT 10,25;l$(z):GO TO 1090
  960 IF s$(SGN PI)="l" THEN LET l$(z)=" 0":PRINT AT 10,25;l$(z):GO TO 1090
  970 IF c$(z) <>"  " THEN GO TO 1000
  980 IF s$="p" THEN IF d(SGN PI)=d(5) THEN LET c$(z)="30":PRINT AT 12,25;c$(z):GO TO 1090
  990 IF s$="p" THEN LET c$(z)=" 0":PRINT AT 12,25;c$(z):GO TO 1090
 1000 IF s$ <>"1" AND s$ <>"2" AND s$ <>"3" AND s$ <>"4" AND s$ <>"5" AND s$ <>"6" THEN GO TO 750
 1010 IF s$="1" AND a$(1+l) <>"  " THEN GO TO 750
 1020 IF s$="2" AND a$(2+l) <>"  " THEN GO TO 750
 1030 IF s$="3" AND a$(3+l) <>"  " THEN GO TO 750
 1040 IF s$="4" AND a$(4+l) <>"  " THEN GO TO 750
 1050 IF s$="5" AND a$(5+l) <>"  " THEN GO TO 750
 1060 IF s$="6" AND a$(6+l) <>"  " THEN GO TO 750
 1070 LET g= VAL s$
 1080 GO SUB 1700
 1090 FLASH NOT PI
 1100 IF e <>12 THEN GO TO 1500
 1110 LET T(z)=0
 1120 FOR i=1 TO 6
 1130 LET T(z)=T(z)+ VAL a$(z*6-6+i)
 1140 NEXT i
 1150 LET q$(z)=" 0"
 1160 IF T(z)>62 THEN LET q$(z)="25":LET T(z)=T(z)+ VAL q$(z)
 1170 LET T(z)=T(z)+ VAL w$(z)+ VAL f$(z)+ VAL t$(z)+ VAL h$(z)+ VAL l$(z)+ VAL c$(z)
 1180 PRINT AT 14,9; INK 0; PAPER 7; FLASH 1;q$(z):PAUSE 150
 1190 GO SUB 2030
 1200 INK 0:PAPER 7
 1210 IF LEN (STR$ T(z))=3 THEN PRINT AT 14,24;T(z)
 1220 IF LEN (STR$ T(z))=2 THEN PRINT AT 14,25;T(z)
 1230 PRINT AT 19,2; PAPER NOT PI; INK 7;"PRESS ANY KEY TO CONTINUE":PAUSE NOT PI
 1240 IF z <>p THEN GO TO 1510
 1250 PAPER 7
 1260 CLS 
 1270 PRINT AT 0,8; INK 0;"FINAL SCORES"
 1280 PRINT TAB 8; INK 2;"____________"
 1290 FOR i=1 TO p
 1300 PRINT AT i+2,2; PAPER 7-i; INK 9;p$(i, TO 10); PAPER 7; INK 0;"  ";T(i)
 1310 LET z$(i)=p$(i)
 1320 NEXT i
 1330 IF p=1 THEN GO TO 1460
 1340 LET r=p-1
 1350 FOR i=1 TO p-1
 1360 FOR j=1 TO r
 1370 IF T(j)<T(j+1) THEN LET t=T(j+1):LET k$=z$(j+1):LET T(j+1)=T(j):LET z$(j+1)=z$(j):LET T(j)=t:LET z$(j)=k$
 1380 NEXT j
 1390 LET r=r-1
 1400 NEXT i
 1410 PRINT AT 10,8; INK 0;"FINAL ORDER"
 1420 PRINT TAB 8; INK 2;"____________"
 1430 FOR i=1 TO p
 1440 PRINT AT i+12,2; PAPER VAL z$(i,11); INK 9;z$(i, TO 10); PAPER 7; INK 0;"  ";T(i)
 1450 NEXT i
 1460 INPUT "Another game with the same"'"players (y/n)?"; LINE r$
 1470 IF r$="y" THEN GO TO 220
 1480 IF r$="n" THEN CLS :GO TO 40
 1490 GO TO 1460
 1500 PAUSE 150
 1510 NEXT z
 1520 NEXT e
 1530 IF d(i)<d(i+1) THEN LET d=d(i+1):LET d(i+1)=d(i):LET d(i)=d
 1540 RETURN 
 1550 LET q=0:FOR i=1 TO LEN d$
 1560 FOR j=1 TO 5
 1570 IF d$(i)= STR$ j THEN LET q=q+1
 1580 NEXT j:NEXT i
 1590 IF q <> LEN d$ THEN IF r=2 THEN GO TO 390
 1600 IF q <> LEN d$ THEN IF r=3 THEN GO TO 540
 1610 FOR j=1 TO 6+ INT (RND*5)
 1620 FOR k=1 TO LEN d$
 1630 LET w= VAL d$(k)
 1640 LET d(w)= INT (RND*6+1)
 1650 LET x=w*5
 1660 PAPER 6:INK 2:BEEP .005+j*.001,-20:GO SUB 1750+d(w)*40
 1670 NEXT k
 1680 NEXT j
 1690 RETURN 
 1700 FOR i=1 TO 5
 1710 IF d(i)=g THEN LET y(g)=y(g)+g
 1720 NEXT i
 1730 IF y(g)>9 THEN LET a$(l+g)= STR$ y(g)
 1740 IF y(g)<10 THEN LET a$(l+g)=" "+ STR$ y(g)
 1750 PRINT AT g*2,9; INK 0; PAPER 7; FLASH 1;a$(l+g)
 1760 LET y(g)=0
 1770 RETURN 
 1780 REM \{20}\{1}PRINT dice \{20}\{0}
 1790 PRINT AT 18,x;"\::\::\::"
 1800 PRINT AT 19,x;"\::\a\::"
 1810 PRINT AT 20,x;"\::\::\::"
 1820 RETURN 
 1830 PRINT AT 18,x;"\a\::\::"
 1840 PRINT AT 19,x;"\::\::\::"
 1850 PRINT AT 20,x;"\::\::\a"
 1860 RETURN 
 1870 PRINT AT 18,x;"\a\::\::"
 1880 PRINT AT 19,x;"\::\a\::"
 1890 PRINT AT 20,x;"\::\::\a"
 1900 RETURN 
 1910 PRINT AT 18,x;"\a\::\a"
 1920 PRINT AT 19,x;"\::\::\::"
 1930 PRINT AT 20,x;"\a\::\a"
 1940 RETURN 
 1950 PRINT AT 18,x;"\a\::\a"
 1960 PRINT AT 19,x;"\::\a\::"
 1970 PRINT AT 20,x;"\a\::\a"
 1980 RETURN 
 1990 PRINT AT 18,x;"\a\::\a"
 2000 PRINT AT 19,x;"\a\::\a"
 2010 PRINT AT 20,x;"\a\::\a"
 2020 RETURN 
 2030 CLS 
 2040 PAPER 7-z:INK 9
 2050 PRINT AT 0,0;p$(z, TO 10); PAPER 7; INK 7-z;"\r"; AT 0,13; PAPER 7-z; INK 9;"PENTZY"; PAPER 7; INK 7-z;"\r"
 2060 PRINT AT 1,0;"\f\b\b\b\b\b\b\b\b\b\b\b\l\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\g"; PAPER 7; INK 7-z;"\r"
 2070 FOR j=2 TO 10 STEP 2
 2080 READ e$,g$,b$,m$
 2090 PRINT AT j,0;e$
 2100 PRINT AT j,9; PAPER 7; INK 0;g$
 2110 PRINT AT j,11;b$
 2120 PRINT AT j,25; PAPER 7; INK 0;m$; PAPER 7-z; INK 9;" \e"; PAPER 7; INK 7-z;"\q"
 2130 PRINT AT j+1,0;"\d           \e               \e"; PAPER 7; INK 7-z;"\q"
 2140 NEXT j
 2150 READ e$,g$,b$,m$
 2160 PRINT AT 12,0;e$
 2170 PRINT AT 12,9; PAPER 7; INK 0;g$
 2180 PRINT AT 12,11;b$
 2190 PRINT AT 12,25; PAPER 7; INK 0;m$; PAPER 7-z; INK 9;" \e"; PAPER 7; INK 7-z;"\q"
 2200 PRINT AT 13,0;"\d           \j\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\k"; PAPER 7; INK 7-z;"\q"
 2210 READ e$,g$,b$
 2220 PRINT AT 14,0;e$
 2230 PRINT AT 14,9; PAPER 7; INK 0;g$
 2240 PRINT AT 14,11;b$
 2250 PRINT AT 14,24; PAPER 7; INK 0;"   "; PAPER 7-z; INK 9;" \e"; PAPER 7; INK 7-z;"\q"
 2260 PRINT AT 15,0;"\h\c\c\c\c\c\c\c\c\c\c\c\m\c\c\c\c\c\c\c\c\c\c\c\c\c\c\c\i"; PAPER 7; INK 7-z;"\q"
 2270 PRINT AT 16,0; PAPER 7; INK 7-z;"\n\o\o\o\o\o\o\o\o\o\o\o\o\o\o\o\o\o\o\o\o\o\o\o\o\o\o\o\o\p"
 2280 RESTORE 
 2290 IF T(z)>0 THEN RETURN 
 2300 FOR i=5 TO 25 STEP 5
 2310 PRINT AT 21,i; PAPER 7; INK 2;"\n\o\o\p"
 2320 PRINT AT 20,i+ PI; PAPER 7; INK 2;"\q"
 2330 PRINT AT 19,i+ PI; PAPER 7; INK 2;"\q"
 2340 PRINT AT 18,i+ PI; PAPER 7; INK 2;"\r"
 2350 NEXT i
 2360 RETURN 
 2370 DATA "\dONE     ",a$(l+1)," \e  QUADZY    ",w$(z)
 2380 DATA "\dTWO     ",a$(l+2)," \e  FULL      ",f$(z)
 2390 DATA "\dTHREE   ",a$(l+ PI)," \e  STRAIGHT  ",t$(z)
 2400 DATA "\dFOUR    ",a$(l+4)," \e  HIGH      ",h$(z)
 2410 DATA "\dFIVE    ",a$(l+5)," \e  LOW       ",l$(z)
 2420 DATA "\dSIX     ",a$(l+6)," \e  PENTZY    ",c$(z)
 2430 DATA "\dBONUS   ",q$(z)," \e  TOTAL    "
 2440 FOR i=1 TO 5
 2450 LET v(i)=d(i)
 2460 NEXT i
 2470 FOR j=4 TO 1 STEP -1
 2480 FOR i=1 TO j
 2490 IF v(i)<v(i+1) THEN LET v=v(i+1):LET v(i+1)=v(i):LET v(i)=v
 2500 NEXT i
 2510 NEXT j
 2520 LET vi=v(SGN PI)+v(2)+v(PI)+v(4)+v(5)
 2530 LET v$=""
 2540 LET d$=""
 2550 IF c$(z)="  " THEN GO SUB 2840:IF d$ <>"" THEN RETURN 
 2560 FOR i=1 TO 6
 2570 IF a$(i+l)="  " THEN GO SUB 2880:IF d$ <>"" THEN RETURN 
 2580 NEXT i
 2590 IF h$(z)="  " THEN IF vi>27 THEN LET d$="0":RETURN 
 2600 IF w$(z)="  " THEN GO SUB 2950:IF d$ <>"" THEN RETURN 
 2610 IF f$(z)="  " THEN GO SUB 2920:IF d$ <>"" THEN RETURN 
 2620 IF t$(z)="  " THEN GO SUB 2980:IF d$ <>"" THEN RETURN 
 2630 FOR i=1 TO 6
 2640 IF a$(i+l)="  " THEN GO SUB 3040:IF d$ <>"" THEN RETURN 
 2650 NEXT i
 2660 IF f$(z)="  " THEN GO SUB 3080:IF d$ <>"" THEN RETURN 
 2670 IF w$(z)="  " THEN GO SUB 3110:IF d$ <>"" THEN RETURN 
 2680 IF t$(z)="  " AND l$(z)="  " THEN GO SUB 3150:IF d$ <>"" THEN RETURN 
 2690 FOR i=6 TO 1 STEP -1
 2700 IF a$(i+l)="  " THEN GO SUB 3200:IF d$ <>"" THEN RETURN 
 2710 NEXT i
 2720 IF t$(z)="  " THEN GO SUB 3520:IF d$ <>"" THEN RETURN 
 2730 IF h$(z)="  " AND l$(z) <>"  " THEN GO SUB 3250:IF d$ <>"" THEN RETURN 
 2740 IF h$(z)="  " AND l$(z)="  " THEN GO SUB 3340:IF d$ <>"" THEN RETURN 
 2750 IF h$(z) <>"  " AND l$(z)="  " THEN GO SUB 3430:IF d$ <>"" THEN RETURN 
 2760 FOR i=6 TO 1 STEP -1
 2770 IF a$(i+l)="  " THEN GO SUB 3610:IF d$ <>"" THEN RETURN 
 2780 NEXT i
 2790 IF c$(z)="  " THEN GO SUB 3670:IF d$ <>"" THEN RETURN 
 2800 IF w$(z)="  " THEN GO SUB 3710:IF d$ <>"" THEN RETURN 
 2810 IF t$(z)="  " THEN GO SUB 3760:IF d$ <>"" THEN RETURN 
 2820 IF c$(z)="  " OR f$(z)="  " THEN GO SUB 3710:IF d$ <>"" THEN RETURN 
 2830 LET d$="12345":RETURN 
 2840 IF v(SGN PI)=v(5) THEN LET d$="0":RETURN 
 2850 IF v(SGN PI)=v(4) THEN LET v$="5":GO SUB 3870:RETURN 
 2860 IF v(2)=v(5) THEN LET v$="1":GO SUB 3870:RETURN 
 2870 RETURN 
 2880 IF i=v(SGN PI) AND i=v(5) THEN LET d$="0":RETURN 
 2890 IF i=v(SGN PI) AND i=v(4) THEN LET v$="5":GO SUB 3870:RETURN 
 2900 IF i=v(2) AND i=v(5) THEN LET v$="1":GO SUB 3870:RETURN 
 2910 RETURN 
 2920 IF v(SGN PI)=v(PI) AND v(4)=v(5) THEN LET d$="0":RETURN 
 2930 IF v(SGN PI)=v(2) AND v(PI)=v(5) THEN LET d$="0":RETURN 
 2940 RETURN 
 2950 IF v(SGN PI)=v(4) THEN LET d$="0":RETURN 
 2960 IF v(2)=v(5) THEN LET d$="0":RETURN 
 2970 RETURN 
 2980 IF v(SGN PI)=v(2)+1 AND v(2)=v(PI)+1 AND v(PI)=v(4)+1 AND v(4)=v(5)+1 THEN LET d$="0":RETURN 
 2990 IF v(SGN PI)=5 AND v(2)=5 AND v(PI)=4 AND v(4)=3 AND v(5)=2 THEN LET v$="2":GO SUB 3870:RETURN 
 3000 IF v(SGN PI)=5 AND v(2)=4 AND v(PI)=4 AND v(4)=3 AND v(5)=2 THEN LET v$="2":GO SUB 3870:RETURN 
 3010 IF v(SGN PI)=5 AND v(2)=4 AND v(PI)=3 AND v(4)=3 AND v(5)=2 THEN LET v$="3":GO SUB 3870:RETURN 
 3020 IF v(SGN PI)=5 AND v(2)=4 AND v(PI)=3 AND v(4)=2 AND v(5)=2 THEN LET v$="4":GO SUB 3870:RETURN 
 3030 RETURN 
 3040 IF i=v(SGN PI) AND i=v(PI) THEN LET v$="45":GO SUB 3870:RETURN 
 3050 IF i=v(2) AND i=v(4) THEN LET v$="15":GO SUB 3870:RETURN 
 3060 IF i=v(PI) AND i=v(5) THEN LET v$="12":GO SUB 3870:RETURN 
 3070 RETURN 
 3080 IF v(SGN PI)=v(2) AND v(5)=v(4) THEN LET v$="3":GO SUB 3870:RETURN 
 3090 IF v(SGN PI)=v(2) AND v(PI)=v(4) THEN LET v$="5":GO SUB 3870:RETURN 
 3100 IF v(PI)=v(2) AND v(5)=v(4) THEN LET v$="1":GO SUB 3870:RETURN 
 3110 IF v(SGN PI)=v(PI) THEN LET v$="45":GO SUB 3870:RETURN 
 3120 IF v(2)=v(4) THEN LET v$="15":GO SUB 3870:RETURN 
 3130 IF v(PI)=v(5) THEN LET v$="12":GO SUB 3870:RETURN 
 3140 RETURN 
 3150 IF v(SGN PI)=6 AND v(2)=6 AND v(PI)=5 AND v(4)=4 AND v(5)=3 THEN LET v$="1":GO SUB 3870:RETURN 
 3160 IF v(SGN PI)=6 AND v(2)=5 AND v(PI)=5 AND v(4)=4 AND v(5)=3 THEN LET v$="2":GO SUB 3870:RETURN 
 3170 IF v(SGN PI)=6 AND v(2)=5 AND v(PI)=4 AND v(4)=4 AND v(5)=3 THEN LET v$="3":GO SUB 3870:RETURN 
 3180 IF v(SGN PI)=6 AND v(2)=5 AND v(PI)=4 AND v(4)=3 AND v(5)=1 THEN LET v$="5":GO SUB 3870:RETURN 
 3190 RETURN 
 3200 IF i=v(SGN PI) AND i=v(2) THEN LET v$="345":GO SUB 3870:RETURN 
 3210 IF i=v(2) AND i=v(PI) THEN LET v$="145":GO SUB 3870:RETURN 
 3220 IF i=v(PI) AND i=v(4) THEN LET v$="125":GO SUB 3870:RETURN 
 3230 IF i=v(4) AND i=v(5) THEN LET v$="123":GO SUB 3870:RETURN 
 3240 RETURN 
 3250 IF vi> VAL l$(z) AND v(5)>1 AND vi-v(5)< VAL l$(z) THEN LET d$="0":RETURN 
 3260 IF vi> VAL l$(z) AND v(5)=1 THEN LET v$="5":GO SUB 3870:RETURN 
 3270 IF vi> VAL l$(z) AND vi-v(5) >= VAL l$(z) THEN LET v$="5":GO SUB 3870:RETURN 
 3280 IF v(SGN PI)<5 THEN RETURN 
 3290 IF v(2)<5 THEN LET v$="2345":GO SUB 3870:RETURN 
 3300 IF v(PI)<5 THEN LET v$="345":GO SUB 3870:RETURN 
 3310 IF v(4)<5 THEN LET v$="45":GO SUB 3870:RETURN 
 3320 IF v(5)<5 THEN LET v$="5":GO SUB 3870:RETURN 
 3330 RETURN 
 3340 IF vi>20 AND v(5)>1 THEN LET d$="0":RETURN 
 3350 IF vi>21 AND v(5)>2 THEN LET d$="0":RETURN 
 3360 IF vi>22 AND v(5)>3 THEN LET d$="0":RETURN 
 3370 IF vi>20 THEN LET v$="5":GO SUB 3870:RETURN 
 3380 IF v(SGN PI)<5 THEN RETURN 
 3390 IF v(2)<5 THEN LET v$="2345":GO SUB 3870:RETURN 
 3400 IF v(PI)<5 THEN LET v$="345":GO SUB 3870:RETURN 
 3410 IF v(4)<5 THEN LET v$="45":GO SUB 3870:RETURN 
 3420 RETURN 
 3430 IF vi>20 THEN IF vi< VAL h$(z) THEN IF VAL h$(z)-vi<6 THEN LET d$="0":RETURN 
 3440 IF vi>20 THEN IF vi< VAL h$(z) THEN LET v$="5":GO SUB 3870:RETURN 
 3450 IF vi>20 THEN IF vi >= VAL h$(z) THEN LET v$="45":GO SUB 3870:RETURN 
 3460 IF v(SGN PI)<5 THEN RETURN 
 3470 IF v(2)<5 THEN LET v$="2345":GO SUB 3870:RETURN 
 3480 IF v(PI)<5 THEN LET v$="345":GO SUB 3870:RETURN 
 3490 IF v(4)<5 THEN LET v$="45":GO SUB 3870:RETURN 
 3500 IF v(5)<5 THEN LET v$="5":GO SUB 3870:RETURN 
 3510 RETURN 
 3520 IF v(SGN PI)=v(2) THEN LET v$="1"
 3530 IF v(PI)=v(2) THEN LET v$=v$+"2"
 3540 IF v(PI)=v(4) THEN LET v$=v$+"3"
 3550 IF v(5)=v(4) THEN LET v$=v$+"4"
 3560 IF LEN v$>1 THEN LET v$="":GO TO 3600
 3570 IF LEN v$=1 AND v(SGN PI)-v(5)>4 THEN LET v$="":GO TO 3600
 3580 IF LEN v$=1 THEN GO SUB 3870:RETURN 
 3590 IF v$="" THEN LET v$="5":GO SUB 3870:RETURN 
 3600 RETURN 
 3610 IF i=v(SGN PI) THEN LET v$="2345":GO SUB 3870:RETURN 
 3620 IF i=v(2) THEN LET v$="1345":GO SUB 3870:RETURN 
 3630 IF i=v(PI) THEN LET v$="1245":GO SUB 3870:RETURN 
 3640 IF i=v(4) THEN LET v$="1235":GO SUB 3870:RETURN 
 3650 IF i=v(5) THEN LET v$="1234":GO SUB 3870:RETURN 
 3660 RETURN 
 3670 IF v(SGN PI)=v(PI) THEN LET v$="45":GO SUB 3870:RETURN 
 3680 IF v(2)=v(4) THEN LET v$="15":GO SUB 3870:RETURN 
 3690 IF v(PI)=v(5) THEN LET v$="12":GO SUB 3870:RETURN 
 3700 IF c$(z) <>"  " AND f$(z) <>"  " THEN GO TO 3750
 3710 IF v(SGN PI)=v(2) THEN LET v$="345":GO SUB 3870:RETURN 
 3720 IF v(PI)=v(2) THEN LET v$="145":GO SUB 3870:RETURN 
 3730 IF v(PI)=v(4) THEN LET v$="125":GO SUB 3870:RETURN 
 3740 IF v(5)=v(4) THEN LET v$="123":GO SUB 3870:RETURN 
 3750 RETURN 
 3760 FOR i=1 TO 3
 3770 IF v(i)=v(i+1) THEN GO TO 3830
 3780 IF v(i+1)=v(i+2) THEN GO TO 3830
 3790 IF v(i)-v(i+2)>4 THEN GO TO 3830
 3800 IF i=1 THEN LET v$="45":GO SUB 3870:RETURN 
 3810 IF i=2 THEN LET v$="15":GO SUB 3870:RETURN 
 3820 IF i=3 THEN LET v$="12":GO SUB 3870:RETURN 
 3830 NEXT i
 3840 IF v(SGN PI)=v(2) AND v(PI)=v(4) AND v(SGN PI)-v(5)<5 AND v(SGN PI)>v(PI) AND v(PI)>v(5) THEN LET v$="24":GO SUB 3870:RETURN 
 3850 IF v(PI)=v(2) AND v(5)=v(4) AND v(SGN PI)-v(5)<5 AND v(SGN PI)>v(PI) AND v(PI)>v(5) THEN LET v$="24":GO SUB 3870:RETURN 
 3860 RETURN 
 3870 FOR i=1 TO LEN v$
 3880 LET o= VAL v$(i)
 3890 FOR j=1 TO 5
 3900 IF d(j)=v(o) THEN LET d$=d$+ STR$ j:LET d(j)=0:GO TO 3920
 3910 NEXT j
 3920 NEXT i
 3930 RETURN 
 3940 IF c$(z) <>"  " THEN GO TO 3960
 3950 IF d(SGN PI)=d(5) THEN LET c$(z)="30":PRINT AT 12,25;c$(z):RETURN 
 3960 IF t$(z) <>"  " THEN GO TO 3980
 3970 IF d(SGN PI)=d(2)+1 AND d(2)+1=d(PI)+2 AND d(PI)+2=d(4)+3 AND d(4)+3=d(5)+4 THEN LET t$(z)="25":PRINT AT 6,25;t$(z):RETURN 
 3980 IF n(z) <>5 THEN GO TO 4050
 3990 IF d(SGN PI) <>d(5) THEN GO TO 4050
 4000 IF a$(d(SGN PI)+l) <>"  " THEN GO TO 4050
 4010 FOR i=0 TO 2
 4020 IF i*d(SGN PI)+m(z)>62 THEN LET w$(z)="25":GO SUB 5220:RETURN 
 4030 NEXT i
 4040 IF 3*d(SGN PI)>62 THEN LET i=d(SGN PI):LET a$(i+l)= STR$ (5*i):GO SUB 5210:RETURN 
 4050 FOR i=1 TO 6
 4060 IF a$(i+l) <>"  " THEN GO TO 4100
 4070 LET aa=3- LEN (STR$ (5*i))
 4080 IF i=1 AND w$(z)="  " THEN IF d(SGN PI)=d(5) THEN LET w$(z)="25":GO SUB 5220:RETURN 
 4090 IF i=d(SGN PI) AND i=d(5) THEN LET a$(i+l,aa TO 2)= STR$ (5*i):GO SUB 5210:RETURN 
 4100 NEXT i
 4110 IF d(SGN PI) <>d(4) AND d(2) <>d(5) THEN GO TO 4240
 4120 IF n(z) <>5 THEN GO TO 4180
 4130 IF a$(d(PI)+l) <>"  " THEN GO TO 4180
 4140 IF w$(z) <>"  " THEN GO TO 4180
 4150 FOR i=0 TO 2
 4160 IF i*d(PI)+m(z)>62 THEN LET w$(z)="25":GO SUB 5220:RETURN 
 4170 NEXT i
 4180 IF 4*d(PI)>62 AND 3*d(PI)<63 THEN LET i=d(PI):LET a$(i+l)= STR$ (4*i):GO SUB 5210:RETURN 
 4190 LET i=d(PI)
 4200 LET ab=3- LEN (STR$ (4*i))
 4210 IF d(PI)>3 THEN IF a$(i+l)="  " THEN LET a$(i+l)= STR$ (4*i):GO SUB 5210:RETURN 
 4220 IF w$(z)="  " THEN LET w$(z)="25":GO SUB 5220:RETURN 
 4230 IF a$(i+l)="  " THEN LET a$(i+l,ab TO 2)= STR$ (4*i):GO SUB 5210:RETURN 
 4240 IF h$(z) <>"  " THEN GO TO 4260
 4250 IF di>26 THEN LET h$(z)= STR$ di:PRINT AT 8,25;h$(z):RETURN 
 4260 IF f$(z) <>"  " THEN GO TO 4290
 4270 IF d(SGN PI)=d(2) THEN IF d(PI)=d(5) THEN LET f$(z)="25":PRINT AT 4,25;f$(z):RETURN 
 4280 IF d(SGN PI)=d(PI) THEN IF d(4)=d(5) THEN LET f$(z)="25":PRINT AT 4,25;f$(z):RETURN 
 4290 IF n(z) <>5 THEN GO TO 4410
 4300 FOR i=1 TO 6
 4310 IF a$(i+l) <>"  " THEN GO TO 4400
 4320 FOR j=1 TO 3
 4330 IF i=d(j) AND i=d(j+2) THEN IF m(z)+3*i<63 AND m(z)+4*i>62 THEN GO TO 4360
 4340 NEXT j
 4350 GO TO 4410
 4360 IF h$(z)="  " AND l$(z)="  " THEN GO SUB 5280:IF h$(z) <>"  " OR l$(z) <>"  " THEN RETURN 
 4370 IF h$(z)="  " AND l$(z) <>"  " THEN GO SUB 5310:IF h$(z) <>"  " THEN RETURN 
 4380 IF l$(z)="  " AND h$(z) <>"  " THEN GO SUB 5330:IF l$(z) <>"  " THEN RETURN 
 4390 IF c$(z)="  " THEN LET c$(z)=" 0":GO SUB 5270:RETURN 
 4400 NEXT i
 4410 FOR i=1 TO 6
 4420 IF a$(i+l) <>"  " THEN GO TO 4470
 4430 LET aa=3- LEN (STR$ (i*3))
 4440 FOR j=1 TO 3
 4450 IF i=d(j) AND i=d(j+2) THEN LET a$(i+l,aa TO 2)= STR$ (3*i):GO SUB 5210:RETURN 
 4460 NEXT j
 4470 NEXT i
 4480 IF h$(z)="  " AND l$(z)="  " THEN GO SUB 5280:IF h$(z) <>"  " OR l$(z) <>"  " THEN RETURN 
 4490 IF h$(z)="  " AND l$(z) <>"  " THEN GO SUB 5310:IF h$(z) <>"  " THEN RETURN 
 4500 IF l$(z)="  " AND h$(z) <>"  " THEN GO SUB 5330:IF l$(z) <>"  " THEN RETURN 
 4510 IF n(z) <>5 THEN GO TO 4750
 4520 FOR i=1 TO 6
 4530 IF a$(i+l) <>"  " THEN GO TO 4740
 4540 LET u=0
 4550 FOR j=1 TO 4
 4560 IF i=d(j) AND i=d(j+1) THEN LET u=2*i:IF m(z)+2*d(j)<63 THEN IF m(z)+3*d(j)>62 THEN GO TO 4670
 4570 NEXT j
 4580 IF u=2*i THEN GO TO 4640
 4590 FOR j=1 TO 5
 4600 IF i=d(j) THEN LET u=d(j):IF m(z)+d(j)<63 THEN IF m(z)+3*d(j)>62 THEN GO TO 4670
 4610 NEXT j
 4620 IF u=i THEN GO TO 4640
 4630 LET u=0:IF m(z)<63 THEN IF m(z)+3*i>62 THEN GO TO 4670
 4640 IF m(z)+u<63 THEN IF m(z)+4*i>62 THEN IF c$(z)="  " THEN LET c$(z)=" 0":GO SUB 5270:RETURN 
 4650 IF u>9 THEN LET a$(i+l)= STR$ u:GO SUB 5210:RETURN 
 4660 IF u<10 THEN LET a$(i+l)=" "+ STR$ u:GO SUB 5210:RETURN 
 4670 IF c$(z)="  " THEN LET c$(z)=" 0":GO SUB 5270:RETURN 
 4680 IF t$(z)="  " THEN LET t$(z)=" 0":GO SUB 5240:RETURN 
 4690 IF w$(z)="  " THEN LET w$(z)=" 0":GO SUB 5220:RETURN 
 4700 IF f$(z)="  " THEN LET f$(z)=" 0":GO SUB 5230:RETURN 
 4710 IF h$(z)="  " THEN LET h$(z)=" 0":GO SUB 5250:RETURN 
 4720 IF l$(z)="  " THEN LET l$(z)=" 0":GO SUB 5260:RETURN 
 4730 GO TO 4650
 4740 NEXT i
 4750 FOR i=1 TO 3
 4760 IF a$(i+l) <>"  " THEN GO TO 4850
 4770 FOR j=1 TO 4
 4780 IF i=d(j) AND i=d(j+1) THEN LET a$(i+l)=" "+ STR$ (2*i):GO SUB 5210:RETURN 
 4790 NEXT j
 4800 IF i <>1 THEN GO TO 4840
 4810 FOR k=1 TO 5
 4820 IF d(k)=1 THEN LET a$(1+l)=" 1":PRINT AT 2,9;a$(1+l):LET n(z)=n(z)+1:LET m(z)=m(z)+1:RETURN 
 4830 NEXT k
 4840 IF i=2 THEN IF a$(1+l)="  " THEN LET a$(1+l)=" 0":PRINT AT 2,9;a$(1+l):LET n(z)=n(z)+1:RETURN 
 4850 NEXT i
 4860 FOR i=1 TO 3
 4870 IF a$(i+l) <>"  " THEN GO TO 4930
 4880 FOR j=1 TO 5
 4890 IF i=d(j) THEN LET a$(i+l)=" "+ STR$ i:GO SUB 5210:RETURN 
 4900 IF i>1 THEN GO TO 4920
 4910 IF a$(1+l)="  " THEN LET a$(1+l)=" 0":PRINT AT 2,9;a$(1+l):LET n(z)=n(z)+1:RETURN 
 4920 NEXT j
 4930 NEXT i
 4940 FOR i=1 TO 2
 4950 IF a$(i+l) <>"  " THEN GO TO 4970
 4960 LET a$(i+l)=" 0":GO SUB 5210:RETURN 
 4970 NEXT i
 4980 IF c$(z)="  " THEN LET c$(z)=" 0":PRINT AT 12,25;c$(z):RETURN 
 4990 IF t$(z)="  " THEN LET t$(z)=" 0":PRINT AT 6,25;t$(z):RETURN 
 5000 FOR i=4 TO 6
 5010 IF a$(i+l) <>"  " THEN GO TO 5060
 5020 LET aa=3- LEN (STR$ (i*2))
 5030 FOR j=1 TO 4
 5040 IF i=d(j) AND i=d(j+1) THEN LET a$(i+l,aa TO 2)= STR$ (2*i):GO SUB 5210:RETURN 
 5050 NEXT j
 5060 NEXT i
 5070 FOR i=4 TO 6
 5080 IF a$(i+l) <>"  " THEN GO TO 5120
 5090 FOR j=1 TO 5
 5100 IF i=d(j) THEN LET a$(i+l)=" "+ STR$ i:GO SUB 5210:RETURN 
 5110 NEXT j
 5120 NEXT i
 5130 IF w$(z)="  " THEN LET w$(z)=" 0":GO SUB 5220:RETURN 
 5140 IF f$(z)="  " THEN LET f$(z)=" 0":PRINT AT 4,25;f$(z):RETURN 
 5150 FOR i=3 TO 6
 5160 IF a$(i+l) <>"  " THEN GO TO 5180
 5170 LET a$(i+l)=" 0":GO SUB 5210:RETURN 
 5180 NEXT i
 5190 IF l$(z)="  " THEN LET l$(z)=" 0":PRINT AT 10,25;l$(z):RETURN 
 5200 IF h$(z)="  " THEN LET h$(z)=" 0":PRINT AT 8,25;h$(z):RETURN 
 5210 PRINT AT i*2,9;a$(i+l):LET n(z)=n(z)+1:LET m(z)=m(z)+ VAL a$(i+l):RETURN 
 5220 PRINT AT 2,25;w$(z):RETURN 
 5230 PRINT AT 4,25;f$(z):RETURN 
 5240 PRINT AT 6,25;t$(z):RETURN 
 5250 PRINT AT 8,25;h$(z):RETURN 
 5260 PRINT AT 10,25;l$(z):RETURN 
 5270 PRINT AT 12,25;c$(z):RETURN 
 5280 IF di>24 THEN LET h$(z)= STR$ di:PRINT AT 8,25;h$(z):RETURN 
 5290 IF di>20 THEN LET l$(z)= STR$ di:PRINT AT 10,25;l$(z)
 5300 RETURN 
 5310 IF di> VAL l$(z) THEN IF di>20 THEN LET h$(z)= STR$ di:PRINT AT 8,25;h$(z)
 5320 RETURN 
 5330 IF di< VAL h$(z) THEN IF di>20 THEN LET l$(z)= STR$ di:PRINT AT 10,25;l$(z)
 5340 RETURN 
 5345 PRINT AT 19, NOT PI; INK NOT PI; PAPER 7;"    "'"    ":RETURN 
 5400 REM \{20}\{1} UDGs \{20}\{0}
 5410 DEF FN h(x)= INT (x/256):DEF FN l(x)=x-256* FN h(x)
 5420 :
 5430 LET x= VAL "(PEEK 23637+ PEEK 23638*256)+6":POKE 23675, FN l(x):POKE 23676, FN h(x):RETURN 
 5440 REM  COPY COPY NOT NOT NOT NOT COPY COPY \{0}\{0}COPY \{0}\{0}\{0}\{0}\{0}\{0}\{0}\{0}\{0}\{0}COPY \{0}\{0}        \{4}\{4}\{4}\{4}\{4}\{4}\{4}\{4}\{0}\{0}?     \{0}\{0}DRAW \{4}\{4}\{4}\{4}\{4}     ?\{0}\{0}\{4}\{4}\{4}\{4}\{4}DRAW \{0}\{0}\{4}\{4}\{7}\{4}\{4}\{4}\{4}\{4}\{4}\{4}DRAW \{4}\{4}\{4}\{4}\{4}\{0}\{0}COPY \{4}\{4}\{4}\{4}\{4}\{4}\{4}\{4}\{4}\{4}COPY \{0}\{0}\{0}\*?\{31}\{15}\{7}\{3}\{1}\{0}COPY COPY COPY COPY COPY COPY COPY \*IN OUT LOAD RUN CLS CLEAR RETURN \*\*\*\*\*\*\*\*\{0}@`px|~\*\{0}<@<\{2}B<\{0}\{0}RETURN \{16}\{16}\{16}\{16}\{16}\{0}\{0}BBBBB<\{0}
 5500 LOAD "pentzy C"SCREEN$ :PAPER 6:GO TO 1
 5510 REM LOAD ""SCREEN$ :SAVE "pentzy" LINE 1:SAVE "code"SCREEN$ 
 5520 SAVE "pentzy" LINE 5500

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