--- title: "Generala" id: 72159 type: "computer_media" slug: "generala" url: "http://localhost/computer_media/generala/" markdown_url: "http://localhost/computer_media/generala.md" published_at: "2026-10-22T16:16:44+00:00" modified_at: "2026-10-22T16:16:45+00:00" author: "David Anderson" featured_image: url: "http://localhost/wp-content/uploads/2026/10/mus-1.png" excerpt: "Generala, the Latin American cousin of Yahtzee, for up to three players or against a computer opponent, with UDG dice, automatic scoring and a running games-won tally." 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: "Dice" slug: "dice" taxonomy: "genre" url: "http://localhost/type/dice/" media_type: "Program" download_url: "https://archive.org/download/timex-sinclair-software-archive/Generala%20%281984%29%28-%29%28TS2068%29%28US%29%28Program%29.zip" tsrun_member: "Generala (1984)(-)(TS2068)(US)(Program)/Generala (1984)(-)(TS2068)(US)(Program).tap" mediadate: "1984" images: - url: "http://localhost/wp-content/uploads/2026/10/mus-1.png" - url: "http://localhost/wp-content/uploads/2026/10/mus-2.png" - url: "http://localhost/wp-content/uploads/2026/10/gen-2.png" article_media: - id: 23128 title: "Reviewer Corner: Generala" type: "article" url: "http://localhost/article/reviewer-corner-generala/" related_products: - id: 37143 title: "Generala" type: "product" url: "http://localhost/product/generala/" media_type_tags: "Dice" --- # Generala Plays Generala, the Latin American dice game related to Yahtzee, for one to three players, with the computer able to take a seat. The options are one player against the computer, two players, two players and the computer, or three players, and each player types a name. A turn allows up to three throws of five dice, drawn from 2×2 blocks of UDGs. Between throws each die can be saved (`X`) or rolled (`R`), or you can roll all (`ENTER`) or reset (`0`). To score, you choose Digits (the 1–6 boxes) or Figures, and the program picks the box. The figures are Straight (20), Full (30), Poker (40), Generala (50) and Double Generala (100), with more for a figure made on the first throw (25, 40, 60 and 80). A Double Generala on the first throw ends the game at once. If a throw fits nothing, a box is crossed out. After eleven rounds the program announces the winner or a draw and shows how many games each player has won. The title screen shows “Rel#: 30” and “© 1984” but names no author. Some REMs are in Spanish, such as `REM rutina de escalera buscada` (“sought-straight routine”). A Generala program was reviewed in the [Reviewer Corner: Generala](/article/reviewer-corner-generala/) column. ## Program Analysis ### Structure - Lines 7999–8968: sets RAMTOP to 65000, clears the statistics area and POKEs 136 bytes of UDG data (17 characters) to 65368. - Lines 9005–9446: option menu, player names, the scorecard screen and the variables. - Lines 1000–1060: the round loop. `t$` holds the turn order for each option (`"1400"`, `"1200"`, `"1240"`, `"1230"`), where 4 means the computer. - Lines 1200–1537: dice throw, dice display, save markers and the running total. - Lines 3000–3710: a human turn and the scoring of digits, figures and crossed-out boxes. - Lines 3800–3955: digit sum and an insertion sort of the dice into `q$`. - Lines 4000–7812: the computer player. - Lines 6500–6710: winner or draw, the games-won statistics and the replay options. ### Scorecard Each player’s card is a 33-character row of `U$(3,33)`, three characters per box in the order 1–6, ST, FL, PK, GL and DG. `"XXX"` marks a crossed-out box, and line 1515 totals the row with `VAL`. The card’s labels come from slicing `S$=" 1 2 3 4 5 6STFLPKGLDG"`. ### Computer Player The computer sorts its dice, looks for generala, poker, three of a kind, two pairs or a straight, and then marks dice to keep in `f$` according to which boxes are still open. For straights it compares its dice with three patterns in `m$`: 1-2-3-4-5, 2-3-4-5-6 and 1-3-4-5-6. It has separate strategies for the last two rounds (lines 7200 and 7700). ### Persistent Statistics Lines 8000–8001 POKE the RAMTOP system variable (23730/23731) to 65000 directly. Games won, the player names and their lengths, and the chosen option are then stored at 65001–65037, so they survive the `CLEAR` used when a new game starts with the same players. ## Notable Techniques - Line numbers are kept in named variables (`player=3000`, `Throw=1200`, `score=3200`, `cpu=5000`, `Rubout=3600`, `Finale=6500`…) and called with `GO SUB Throw` or `GO TO score`. Most targets are one less than the first real line of the routine. - `GO TO 3415+VAL (q$(i))*15` jumps straight to the scoring code for the repeated digit. - TS2068 `SOUND` statements drive the AY chip for the dice-roll noise and a fanfare, alongside `BEEP` tunes. - Each die face is a 2×2 block built from the 17 UDGs. - `POKE 23658,0` turns caps lock off so the lower-case key codes in the `INKEY$` tests match. ## Potential Issues - Line 4005 tests `h$="13456"` twice. The second test was probably meant to be `"23456"`. - The human straight check (line 3366) accepts only 1-2-3-4-5 and 2-3-4-5-6, but the computer also treats 1-3-4-5-6 as a straight (lines 5910 and 7402). When the computer sends that hand to be scored, the straight is refused and, if it was chasing a straight, its straight box appears to be crossed out. - Line 7602 compares the three-character slice `U$(q,25 TO 27)` with two spaces, and line 7610 compares the single character `U$(3,24)` with two spaces. Neither can ever be equal, so those last-round shortcuts never fire. - Line 7642 reads `CONTINUE 7648`. That is not a valid jump in Sinclair BASIC and appears to be a corrupted `GO TO 7648`. - Line 7776 is garbled (`VAL q$3)=VAL q$(0)`) but cannot be reached. - When the same players start a new game, line 6653 POKEs 1, 2 and 3 into 65003, 65013 and 65023. Those addresses hold player 3’s win count and the tenth character of names 1 and 2, so that win count is overwritten. - Turns are entered with `GO SUB player` or `GO SUB cpu` but leave with `GO TO 1050`, so each turn leaves an entry on the GO SUB stack. - The `LET` after `GO TO 3670` in line 3662 can never run. This copy comes from Bob Swoger’s Larken games disk. For tape, the `RANDOMIZE USR 100` calls and the LOGICALL load were removed from the save and load lines at 9997–9998, and the program now autostarts at line 1. It was tested in ZEsarUX. ## Source Code ``` 1 RESTORE : POKE 23658,0: GO TO 7999 900 LET h$="00000" 902 FOR i=1 TO 5 904 LET h$(i)=q$(i) 906 NEXT i 908 RETURN 1010 FOR x=1 TO 4 1015 LET count=0 1020 IF VAL t$(n,x)=0 THEN GO TO 1052 1030 IF VAL t$(n,x)=4 THEN GO SUB cpu 1035 LET q=VAL t$(n,x) 1040 GO SUB player 1050 GO SUB Total 1052 NEXT x 1054 LET End=End+1 1056 IF End=11 THEN GO TO Finale 1060 GO TO 1000 1190 FOR i=18 TO 20 1192 INK 1: PRINT AT i,1;"::::::::::::::::::::::::::::" 1194 NEXT i 1196 RETURN 1201 SOUND 6,31;7,7;8,3;9,3;10,16;11,30;12,3;13,8 1202 IF count>1 THEN GO SUB 1400 1205 FOR i=1 TO 5 1207 IF f$(i)="x" THEN GO TO 1215 1210 LET d(i)=INT (RND*6)+1 1213 GO SUB 1220+i*10 1215 NEXT i 1220 RETURN 1231 PAPER 7 1232 GO SUB 2000+(d(i)*100) 1234 PRINT AT 5,2;a$(1) 1236 PRINT AT 6,2;a$(2) 1237 BEEP .05,22: PAPER 6 1238 RETURN 1241 PAPER 7 1242 GO SUB 2000+(d(i)*100) 1244 PRINT AT 8,5;a$(1) 1246 PRINT AT 9,5;a$(2) 1247 BEEP .05,22: PAPER 6 1248 RETURN 1251 PAPER 7 1252 GO SUB 2000+(d(i)*100) 1254 PRINT AT 12,7;a$(1) 1256 PRINT AT 13,7;a$(2) 1257 BEEP .05,22: PAPER 6 1258 RETURN 1261 PAPER 7 1262 GO SUB 2000+(d(i)*100) 1264 PRINT AT 8,9;a$(1) 1266 PRINT AT 9,9;a$(2) 1267 BEEP .05,22: PAPER 6 1268 RETURN 1271 PAPER 7 1272 GO SUB 2000+(d(i)*100) 1274 PRINT AT 5,12;a$(1) 1276 PRINT AT 6,12;a$(2) 1277 BEEP .05,22: PAPER 6 1278 RETURN 1305 LET e=4*i-3 1310 FLASH 1: INK 0: PRINT AT VAL o$(e TO e+1),VAL o$(e+2 TO e+3);i 1315 RETURN 1355 FLASH 0: INK 4: PRINT AT VAL o$(e TO e+1),VAL o$(e+2 TO e+3);"::" 1360 RETURN 1402 FOR i=1 TO 5 1404 IF f$(i)="x" THEN GO TO 1418 1406 FOR j=1 TO 5 1408 LET p=i*4-3 1410 PRINT AT VAL k$(p TO p+1),VAL k$(p+2 TO p+3);"::::" 1412 PRINT AT VAL k$(p TO p+1)+1,VAL k$(p+2 TO p+3);"::::" 1414 INK 4 1416 NEXT j 1418 NEXT i 1419 INK 0 1420 RETURN 1502 LET Z(q)=0 1505 FOR i=1 TO 31 STEP 3 1510 IF U$(q,i TO i+2)="XXX" OR U$(q,i TO i+2)=" " THEN GO TO 1520 1515 LET Z(q)=Z(q)+VAL U$(q,i TO i+2) 1520 NEXT i 1522 IF Z(q)>=100 THEN GO TO 1536 1526 IF Z(q)>=10 THEN GO TO 1534 1532 PRINT AT 20,q+(3*(q+6));Z(q) 1533 RETURN 1534 PRINT AT 20,q+(3*(q+6))-1;Z(q) 1535 RETURN 1536 PRINT AT 20,q+(3*(q+6))-2;Z(q) 1537 RETURN 2110 LET a$(1)="bc" 2120 LET a$(2)="de" 2130 RETURN 2210 LET a$(1)="af" 2220 LET a$(2)="ga" 2230 RETURN 2310 LET a$(1)="bh" 2320 LET a$(2)="ie" 2330 RETURN 2410 LET a$(1)="jf" 2420 LET a$(2)="gk" 2430 RETURN 2510 LET a$(1)="lh" 2520 LET a$(2)="im" 2530 RETURN 2610 LET a$(1)="np" 2620 LET a$(2)="oq" 2630 RETURN 3001 PRINT #1;AT 1,0;"TURN: ";N$(q) 3002 LET count=count+1 3003 IF count>1 THEN GO TO 3006 3004 FOR i=3 TO 16: INK 4: PRINT AT i,1;" ": NEXT i 3005 INK 0 3006 GO SUB Throw 3007 SOUND 8,0;9,0;10,0 3010 IF count=3 THEN GO TO 3200 3012 PRINT AT 18,1;"____SELECT____" 3013 PRINT AT 19,1;"S to Score " 3014 PRINT AT 20,1;"ENTER to Roll" 3015 IF INKEY$=CHR$ 115 THEN GO TO 3200 3016 IF INKEY$=CHR$ 13 THEN GO TO 3018 3017 GO TO 3015 3018 GO SUB 1190 3025 FOR i=1 TO 5 3026 INK 0: PRINT AT 18,1;"X=Save R=Roll" 3027 PRINT AT 19,1;"ENTER=Roll All" 3028 PRINT AT 20,1;"0=Reset all" 3029 IF f$(i)="x" THEN GO TO 3038 3030 GO SUB Fix 3031 IF INKEY$="" THEN GO TO 3031 3032 IF INKEY$=CHR$ 48 THEN GO TO 3040 3033 IF INKEY$=CHR$ 114 OR INKEY$=CHR$ 120 THEN GO TO 3036 3034 IF INKEY$=CHR$ 13 THEN GO TO 3042 3035 GO TO 3031 3036 LET f$(i)=INKEY$ 3037 GO SUB Blank 3038 NEXT i 3039 GO TO 3043 3040 LET f$="00000": GO SUB Blank 3041 FLASH 0: GO TO 3025 3042 LET f$="00000": GO SUB Blank: FLASH 0 3043 GO SUB 1190 3044 GO TO 3000 3201 LET f$="00000" 3202 FLASH 0 3205 GO SUB Seq 3210 IF fl=1 THEN GO TO 3228 3212 GO SUB 1190 3214 IF End=10 THEN GO TO 3230 3216 PRINT AT 18,1;"____SELECT____" 3218 PRINT AT 19,1;"1 - Digits " 3220 PRINT AT 20,1;"F - Figures " 3222 IF INKEY$=CHR$ 49 THEN GO TO 3400 3224 IF INKEY$=CHR$ 102 THEN GO TO 3230 3226 GO TO 3222 3228 LET fl=0 3231 GO SUB 1190 3234 IF q$(1)<>q$(5) THEN GO TO 3280 3236 IF U$(q,29)="X" THEN GO TO 3280 3238 IF U$(q,29)<>" " THEN GO TO 3250 3240 IF count=1 THEN GO TO 3246 3242 LET U$(q,28 TO 30)=" 50" 3243 PRINT AT 17,16+q*4;" 50": GO SUB Music 3244 GO TO 1050 3246 LET U$(q,28 TO 30)=" 80" 3247 PRINT AT 17,16+q*4;" 80": GO SUB Music 3248 GO TO 1050 3250 IF U$(q,31)<>" " THEN GO TO 3280 3254 LET U$(q,31 TO 33)="100" 3256 PRINT AT 18,16+q*4;"100" 3257 GO SUB Total: IF count=1 THEN GO TO Finale 3258 GO SUB Music 3260 PRINT #1;AT 1,0;"DO YOU CONCEDE DEFEAT?(Y/N)" 3262 IF INKEY$="" THEN GO TO 3262 3263 IF INKEY$=CHR$ 121 THEN GO TO 6700 3264 PRINT #1;AT 1,0;" " 3270 GO TO 1052 3282 IF q$(1)<>q$(4) AND q$(2)<>q$(5) THEN GO TO 3320 3284 IF U$(q,26)<>" " THEN GO TO 3320 3285 IF VAL q$(3)=6 AND U$(q,16 TO 18)=" " THEN GO TO 3505 3286 IF count=1 THEN GO TO 3300 3290 LET U$(q,25 TO 27)=" 40" 3292 PRINT AT 16,16+q*4;" 40" 3294 GO TO 1050 3300 LET U$(q,25 TO 27)=" 60" 3302 PRINT AT 16,16+q*4;" 60" 3303 GO SUB Mus2 3304 GO TO 1050 3322 IF q$(1)=q$(3) AND q$(4)=q$(5) OR q$(1)=q$(2) AND q$(3)=q$(5) THEN GO TO 3326 3324 GO TO 3360 3326 IF U$(q,23)<>" " THEN GO TO 3360 3328 IF count=1 THEN GO TO 3340 3330 LET U$(q,22 TO 24)=" 30" 3332 PRINT AT 15,16+q*4;" 30" 3334 GO TO 1050 3340 LET U$(q,22 TO 24)=" 40" 3342 PRINT AT 15,16+q*4;" 40" 3343 GO SUB Mus2 3344 GO TO 1050 3361 IF U$(q,20)<>" " THEN GO TO 3400 3362 LET h$="00000" 3363 FOR i=1 TO 5 3364 LET h$(i)=q$(i) 3365 NEXT i 3366 IF h$="12345" OR h$="23456" THEN GO TO 3370 3367 IF fstr=1 THEN GO TO 3664 3368 GO TO 3400 3370 IF count=1 THEN GO TO 3380 3372 LET U$(q,19 TO 21)=" 20" 3374 PRINT AT 14,16+q*4;" 20" 3376 GO TO 1050 3380 LET U$(q,19 TO 21)=" 25" 3382 PRINT AT 14,16+q*4;" 25" 3383 GO SUB Mus2 3384 GO TO 1050 3401 GO SUB 1190 3405 FOR i=1 TO 3 3410 IF q$(i)=q$(i+2) THEN GO TO 3415+VAL (q$(i))*15 3415 NEXT i 3420 FOR i=1 TO 4 3422 IF q$(i)=q$(i+1) THEN GO TO 3415+VAL (q$(i))*15 3424 NEXT i 3425 GO TO Rubout 3432 IF U$(q,3)<>" " THEN GO TO Rubout 3433 LET v=1 3434 GO SUB Sum 3436 LET U$(q,3)=STR$ Add 3438 PRINT AT 8,18+q*4;STR$ Add 3440 GO TO 1050 3447 IF U$(q,5 TO 6)<>" " THEN GO TO Rubout 3448 LET v=2 3449 GO SUB Sum 3451 IF Add=10 THEN GO TO 3456 3452 LET U$(q,6)=STR$ Add 3453 PRINT AT 9,18+q*4;STR$ Add 3454 GO TO 1050 3456 LET U$(q,5 TO 6)=STR$ Add 3457 PRINT AT 9,17+q*4;STR$ Add 3458 GO TO 1050 3462 IF U$(q,8 TO 9)<>" " THEN GO TO Rubout 3463 LET v=3 3464 GO SUB Sum 3466 IF Add>=12 THEN GO TO 3471 3468 LET U$(q,9)=STR$ Add 3469 PRINT AT 10,18+q*4;STR$ Add 3470 GO TO 1050 3471 LET U$(q,8 TO 9)=STR$ Add 3472 PRINT AT 10,17+q*4;STR$ Add 3474 GO TO 1050 3476 IF U$(q,11 TO 12)<>" " THEN GO TO Rubout 3478 LET v=4 3479 GO SUB Sum 3480 IF Add>=12 THEN GO TO 3485 3482 LET U$(q,12)=STR$ Add 3483 PRINT AT 11,18+q*4;STR$ Add 3484 GO TO 1050 3485 LET U$(q,11 TO 12)=STR$ Add 3486 PRINT AT 11,17+q*4;STR$ Add 3487 GO TO 1050 3491 IF U$(q,14 TO 15)<>" " THEN GO TO Rubout 3492 LET v=5 3494 GO SUB Sum 3496 IF Add>=10 THEN GO TO 3501 3497 LET U$(q,15)="5" 3498 PRINT AT 12,18+q*4;"5" 3499 GO TO 1050 3501 LET U$(q,14 TO 15)=STR$ Add 3502 PRINT AT 12,17+q*4;STR$ Add 3503 GO TO 1050 3506 IF U$(q,17 TO 18)<>" " THEN GO TO Rubout 3507 LET v=6 3509 GO SUB Sum 3511 IF Add>=12 THEN GO TO 3516 3512 LET U$(q,18)="6" 3513 PRINT AT 13,18+q*4;"6" 3514 GO TO 1050 3516 LET U$(q,17 TO 18)=STR$ Add 3517 PRINT AT 13,17+q*4;STR$ Add 3518 GO TO 1050 3605 IF U$(q,31)<>" " THEN GO TO 3610 3606 LET U$(q,31 TO )="XXX" 3607 PRINT AT 18,16+q*4;"XXX" 3608 GO TO 1050 3611 LET b=0 3612 FOR i=1 TO 4 3615 FOR j=1 TO 5 3620 IF q$(j)=STR$ i THEN LET b=b+1 3625 IF j=5 AND b<>0 THEN GO TO 3650 3630 NEXT j 3635 NEXT i 3636 FOR i=1 TO 4 3637 IF U$(q,3*i-2 TO 3*i)=" " THEN GO TO 3640 3638 NEXT i 3639 GO TO 3660 3640 LET U$(q,3*i-2 TO 3*i)="XXX" 3642 PRINT AT i+7,16+q*4;"XXX" 3644 GO TO 1050 3650 IF U$(q,3*i-1 TO 3*i)<>" " THEN GO TO 3656 3652 LET U$(q,i+2*i)=STR$ (b*i) 3653 PRINT AT i+7,18+q*4;STR$ (b*i) 3654 GO TO 1050 3656 LET b=0 3658 GO TO 3635 3662 IF U$(q,19 TO 21)<>" " THEN GO TO 3670: LET U$(q,19 TO 21)="XXX" 3664 LET U$(q,19 TO 21)="XXX" 3666 PRINT AT 14,16+q*4;"XXX" 3668 GO TO 1050 3672 FOR i=5 TO 6 3674 FOR j=1 TO 5 3676 IF q$(j)=STR$ i THEN LET b=b+1 3678 IF j=5 AND b<>0 THEN GO TO 3690 3680 NEXT j 3681 NEXT i 3682 FOR i=5 TO 6 3683 IF U$(q,3*i-2 TO 3*i)=" " THEN GO TO 3640 3684 NEXT i 3685 GO TO 3700 3690 IF U$(q,3*i-1 TO 3*i)=" " THEN GO TO 3696 3692 LET b=0: GO TO 3681 3696 LET U$(q,3*i-1 TO 3*i)=STR$ (b*i) 3698 PRINT AT i+7,19-LEN STR$ (b*i)+q*4;STR$ (b*i) 3699 GO TO 1050 3702 FOR g=23 TO 29 STEP 3 3704 IF U$(q,g)=" " THEN GO TO 3708 3706 NEXT g 3708 LET U$(q,g-1 TO g+1)="XXX" 3709 PRINT AT ((g-20)/3)+14,16+q*4;"XXX" 3710 GO TO 1050 3805 LET b=0 3810 FOR i=1 TO 5 3815 IF q$(i)=STR$ v THEN LET b=b+1 3820 NEXT i 3825 LET Add=b*v 3830 LET b=0 3835 RETURN 3905 FOR i=1 TO 5 3910 LET q$(i)=STR$ d(i) 3915 NEXT i 3920 FOR j=2 TO 5 3925 LET w$=q$(j) 3930 FOR i=j-1 TO 1 STEP -1 3935 IF q$(i)" " THEN GO TO 5000 4002 LET flagstr=0 4003 IF count=1 THEN GO TO 4010 4004 GO SUB 900 4005 IF h$="12345" OR h$="13456" OR h$="13456" THEN GO TO score 4010 LET zero=0 4012 FOR i=2 TO 5 4014 IF q$(i)=q$(i-1) THEN GO SUB 4025 4016 NEXT i 4018 IF zero>1 THEN GO TO 5000 4020 GO TO 4030 4025 LET q$(i-1)="0" 4026 LET zero=zero+1 4027 RETURN 4030 FOR j=2 TO 5 4032 LET b$=q$(j) 4034 FOR i=j-1 TO 1 STEP -1 4036 IF q$(i)1 THEN GO TO 5010 5007 FOR i=3 TO 16: INK 4: PRINT AT i,1;" ": NEXT i 5008 INK 0 5010 GO SUB Throw 5011 SOUND 8,0;9,0;10,0 5012 LET f$="00000" 5015 IF count=3 THEN GO TO score 5020 GO SUB Seq 5021 IF End=9 THEN GO TO 7700 5022 IF End=10 THEN GO TO 7200 5024 IF flagstr=1 THEN GO TO 4000 5025 IF q$(1)=q$(5) THEN GO TO 5100 5030 IF q$(1)=q$(4) OR q$(2)=q$(5) THEN GO TO 5300 5035 FOR i=1 TO 3 5036 IF q$(i)=q$(i+2) THEN GO TO 5500 5037 NEXT i 5040 IF q$(1)=q$(2) AND q$(3)=q$(4) THEN GO TO 5700 5045 IF q$(2)=q$(3) AND q$(4)=q$(5) THEN GO TO 5700 5050 IF q$(1)=q$(2) AND q$(4)=q$(5) THEN GO TO 5700 5055 GO TO 5900 5105 IF U$(q,28 TO 30)=" " THEN GO TO score 5110 IF U$(q,29)="X" THEN GO TO 5300 5115 IF U$(q,31 TO 33)=" " THEN GO TO score 5120 GO TO score 5302 IF count<>1 THEN GO TO 5308 5304 LET rand=INT (RND*2)+1 5306 IF U$(q,25 TO 27)=" " AND rand=2 THEN GO TO score 5308 IF U$(q,29)<>"X" THEN GO TO 5330 5310 IF U$(q,25 TO 27)=" " THEN GO TO score 5315 LET dig=VAL q$(3) 5320 IF U$(q,(3*dig)-2 TO 3*dig)=" " THEN GO TO 5330 5322 IF U$(q,30)<>"X" AND U$(q,31 TO 33)=" " THEN GO TO 5330 5328 GO TO 5000 5330 FOR j=1 TO 5 STEP 4 5332 IF q$(j)<>q$(3) THEN GO TO 5335 5333 NEXT j 5335 FOR i=1 TO 5 5336 IF d(i)<>VAL q$(j) THEN LET f$(i)="x" 5337 NEXT i 5340 GO TO 5000 5505 FOR j=2 TO 4 5510 IF q$(j)=q$(j-1) AND q$(j)=q$(j+1) THEN GO TO 5525 5515 NEXT j 5525 IF j<>3 THEN GO TO 5570 5530 LET dig=VAL q$(j) 5532 IF count=1 AND U$(q,29)<>" " THEN GO TO 5540 5535 IF U$(q,(3*dig)-2 TO 3*dig)<>" " AND U$(q,26)<>" " THEN GO TO 5000 5540 FOR i=1 TO 5 5542 IF d(i)=VAL q$(3) THEN LET f$(i)="x" 5544 NEXT i 5546 GO TO 5000 5570 IF j=2 AND q$(4)=q$(5) THEN GO TO 5573 5571 IF j=4 AND q$(1)=q$(2) THEN GO TO 5573 5572 GO TO 5574 5573 IF U$(q,22 TO 24)=" " THEN GO TO score 5574 LET dig=VAL q$(3) 5575 IF U$(q,(3*dig)-2 TO 3*dig)=" " OR U$(q,23)=" " OR U$(q,26)=" " OR U$(q,29)=" " THEN GO TO 5600 5576 IF U$(q,29)<>"X" AND U$(q,31)=" " THEN GO TO 5600 5578 GO TO 5000 5600 FOR i=1 TO 5 5605 IF d(i)=VAL q$(3) THEN LET f$(i)="x" 5610 NEXT i 5620 GO TO 5000 5702 FOR j=1 TO 5 STEP 2 5704 IF q$(j)<>q$(2) AND q$(j)<>q$(4) THEN GO TO 5710 5706 NEXT j 5710 IF U$(q,23)=" " THEN GO TO 5750 5711 IF j=3 THEN GO TO 5725 5712 IF j=5 THEN GO TO 5735 5714 LET dig=VAL q$(2) 5715 IF U$(q,(3*dig)-2 TO 3*dig)<>" " THEN GO TO 5720 5716 FOR i=1 TO 5 5717 IF d(i)=VAL q$(2) THEN LET f$(i)="x" 5718 NEXT i 5719 GO TO 5000 5720 LET dig=VAL q$(4) 5721 IF U$(q,(3*dig)-2 TO 3*dig)<>" " THEN GO TO 5000 5722 FOR i=1 TO 5: IF d(i)=VAL q$(4) THEN LET f$(i)="x" 5723 NEXT i 5724 GO TO 5000 5725 LET dig=VAL q$(1) 5726 IF U$(q,(3*dig)-2 TO 3*dig)<>" " THEN GO TO 5730 5727 FOR i=1 TO 5 5728 IF d(i)=VAL q$(1) THEN LET f$(i)="x" 5729 NEXT i: GO TO 5000 5730 LET dig=VAL q$(4) 5732 IF U$(q,(3*dig)-2 TO 3*dig)<>" " THEN GO TO 5000 5733 FOR i=1 TO 5: IF d(i)=VAL q$(4) THEN LET f$(i)="x" 5734 NEXT i: GO TO 5000 5735 LET dig=VAL q$(1) 5736 IF U$(q,(3*dig)-2 TO 3*dig)<>" " THEN GO TO 5740 5737 GO TO 5727 5740 LET dig=VAL q$(3) 5742 IF U$(q,(3*dig)-2 TO 3*dig)<>" " THEN GO TO 5000 5744 GO TO 5733 5750 FOR i=1 TO 5 5752 IF d(i)<>VAL q$(j) THEN LET f$(i)="x" 5758 NEXT i 5760 GO TO 5000 5902 LET h$="00000" 5904 FOR i=1 TO 5 5906 LET h$(i)=q$(i) 5908 NEXT i 5910 IF h$="12345" OR h$="23456" OR h$="13456" THEN GO TO 5955 5915 FOR i=1 TO 4 5920 IF q$(i)=q$(i+1) THEN GO TO 5930 5922 NEXT i 5924 GO TO 4000 5930 LET dig=VAL q$(i) 5935 IF U$(q,(3*dig)-2 TO 3*dig)<>" " THEN GO TO 4000 5940 FOR j=1 TO 5 5943 IF d(j)=VAL q$(i) THEN LET f$(j)="x" 5946 NEXT j 5950 GO TO 5000 5955 IF U$(q,20 TO 21)<>" " THEN GO TO 5000 5960 GO TO score 6505 BORDER 0: PAPER 5: INK 0: CLS 6510 FOR i=2 TO 3 6515 IF Z(i)>=Z(1) THEN GO TO 6530 6520 NEXT i 6525 LET q=1: GO TO 6700 6530 FOR i=1 TO 3 STEP 2 6535 IF Z(i)>=Z(2) THEN GO TO 6550 6540 NEXT i 6545 LET q=2: GO TO 6700 6550 FOR i=1 TO 2 6555 IF Z(i)>=Z(3) THEN GO TO 6570 6560 NEXT i 6565 LET q=3: GO TO 6700 6570 FOR i=0 TO 7 6575 BORDER i: FLASH 1: PRINT AT 10,10;"DRAW GAME!!!": BEEP .01,5: BEEP .01,10: BEEP .01,15: BEEP .01,20: BEEP .01,25: BEEP .01,30 6580 NEXT i 6585 FLASH 0 6590 GO TO 6605 6600 LET v(q)=PEEK (65000+q)+1 6602 POKE 65000+q,v(q) 6605 BORDER 4: PAPER 4: INK 0: CLS 6610 PRINT AT 5,5;" CURRENT STATISTICS " 6615 FOR i=1 TO 3 6620 PRINT AT 8+(2*i),5;"* ";N$(i);" won ";PEEK (65000+i);" games" 6625 NEXT i 6630 PRINT AT 18,5;"Another Game?"; FLASH 1;" y/n " 6635 IF INKEY$="" THEN GO TO 6635 6636 IF INKEY$=CHR$ 121 THEN GO TO 6639 6637 IF INKEY$="n" THEN STOP 6638 GO TO 6635 6639 PRINT AT 18,5;" ": PAUSE 60 6640 PRINT AT 18,5;"Same Players?"; FLASH 1;"::y/n " 6641 IF INKEY$=CHR$ 121 THEN GO TO 6650 6642 IF INKEY$<>CHR$ 110 THEN GO TO 6640 6643 FOR i=1 TO 3 6644 POKE 65000+i,0 6645 NEXT i 6646 CLEAR 6648 GO TO 9005 6650 CLEAR 6651 DIM N$(3,10) 6652 LET i=1 6653 FOR j=65003 TO 65023 STEP 10: POKE j,i 6654 FOR x=1 TO PEEK (65033+i) 6655 LET N$(i,x TO x)=CHR$ (PEEK (j+x)) 6656 NEXT x 6657 LET i=i+1 6658 NEXT j 6660 GO TO 9100 6702 FOR i=0 TO 6 6704 BORDER i: PAPER 4: INK 0: PRINT AT 10,5;" WINNER : "; FLASH 1;N$(q) 6706 FOR x=5 TO 35 STEP 5: BEEP .01,x: NEXT x 6708 NEXT i 6710 GO TO 6600 7002 SOUND 7,56;0,68;1,3;8,15 7003 SOUND 2,151;3,2;9,12 7004 SOUND 4,46;5,2;10,12 7005 BEEP .1,-5: BEEP .1,0: BEEP .1,4: BEEP .1,7: PAUSE 15: BEEP .1,7: BEEP .1,7: BEEP .1,7 7006 BEEP .1,4: PAUSE 15: BEEP .1,4: BEEP .1,4: BEEP .1,4: BEEP .3,0: BEEP .3,4: BEEP .3,0: BEEP 1,-5 7012 SOUND 8,0;9,0;10,0 7099 RETURN 7100 REM Mus2 7102 BEEP .2,14: PAUSE 10: BEEP .1,9: BEEP .1,8: BEEP .1,9: BEEP .3,10: PAUSE 5: BEEP .3,9: PAUSE 15: BEEP .2,13: PAUSE 10: BEEP .3,14 7105 RETURN 7202 IF count>=2 THEN GO TO Pointer 7204 FOR i=1 TO 31 STEP 3 7206 IF U$(q,i TO i+2)=" " THEN GO TO 7210 7208 NEXT i 7210 IF i<=16 THEN GO TO 7230 7212 IF i=19 THEN LET Pointer=7400 7214 IF i=22 THEN LET Pointer=7500 7216 IF i>=25 THEN LET Pointer=7600 7218 GO TO Pointer 7230 LET ONE=i+2 7232 LET Pointer=7300 7300 FOR j=1 TO 5 7301 IF VAL q$(j)=ONE/3 THEN LET tone=tone+1 7302 NEXT j 7303 IF TWO/3>6 THEN GO TO 7312 7304 FOR j=1 TO 5 7305 IF VAL q$(j)=TWO/3 THEN LET ttwo=ttwo+1 7306 NEXT j 7307 IF ttwo=2 THEN GO TO 7490 7405 DIM E(3) 7406 FOR i=2 TO 5 7407 IF VAL q$(i)=VAL q$(i-1) THEN LET q$(i-1)="0" 7408 NEXT i 7409 LET fstr=1 7410 FOR j=1 TO 3 7412 FOR x=1 TO 5 7414 FOR i=1 TO 5 7416 IF VAL m$(j,x)=VAL q$(i) THEN LET E(j)=E(j)+1 7418 NEXT i 7420 NEXT x 7422 NEXT j 7430 IF E(1)>=E(2) THEN GO TO 7436 7432 IF E(2)>=E(3) THEN GO TO 7446 7434 GO TO 7438 7436 IF E(1)>=E(3) THEN GO TO 7442 7438 LET ix=3 7440 GO TO 7450 7442 LET ix=1 7444 GO TO 7450 7446 LET ix=2 7450 GO SUB 900 7458 LET find=0 7460 FOR i=1 TO 5 7462 FOR x=1 TO 5 7464 IF q$(i)=m$(ix,x) THEN LET find=1 7466 NEXT x 7468 IF find=0 THEN LET q$(i)="0" 7470 LET find=0 7472 NEXT i 7474 FOR i=1 TO 5 7476 FOR x=1 TO 5 7478 IF d(i)=VAL q$(x) THEN GO TO 7486 7480 NEXT x 7482 NEXT i 7483 FLASH 0: GO SUB 1190 7484 GO TO 5000 7486 LET f$(i)="x" 7487 LET q$(x)="0" 7488 GO TO 7480 7490 FOR i=2 TO 5 7492 IF VAL q$(i)=VAL q$(i-1) THEN LET q$(i-1)="0" 7494 NEXT i 7496 GO TO 7450 7502 IF VAL q$(1)=VAL q$(2) AND VAL q$(3)=VAL q$(5) OR VAL q$(1)=VAL q$(3) AND VAL q$(4)=VAL q$(5) THEN GO TO score 7504 IF VAL q$(1)=VAL q$(3) OR VAL q$(2)=VAL q$(4) OR VAL q$(3)=VAL q$(5) THEN GO TO 7530 7506 IF VAL q$(1)=VAL q$(2) AND VAL q$(3)=VAL q$(4) OR VAL q$(1)=VAL q$(2) AND VAL q$(4)=VAL q$(5) OR VAL q$(2)=VAL q$(3) AND VAL q$(4)=VAL q$(5) THEN GO TO 7540 7510 FOR i=2 TO 5 7512 IF VAL q$(i)=VAL q$(i-1) THEN GO TO 7518 7514 NEXT i 7516 GO TO 5000 7518 FOR j=1 TO 5 7520 IF d(j)=VAL q$(i) THEN LET f$(j)="x" 7522 NEXT j 7524 GO TO 5000 7532 FOR i=1 TO 5 7534 IF d(i)=VAL q$(3) THEN LET f$(i)="x" 7536 NEXT i 7538 GO TO 5000 7542 FOR i=1 TO 5 7544 IF d(i)=VAL q$(2) OR d(i)=VAL q$(4) THEN LET f$(i)="x" 7546 NEXT i 7548 GO TO 5000 7602 IF VAL q$(1)=VAL q$(4) AND U$(q,25 TO 27)=" " THEN GO TO score 7604 IF VAL q$(1)=VAL q$(5) THEN GO TO score 7606 IF VAL q$(1)=VAL q$(3) OR VAL q$(2)=VAL q$(4) OR VAL q$(3)=VAL q$(5) THEN GO TO 7630 7608 IF VAL q$(1)=VAL q$(3) AND VAL q$(4)=VAL q$(5) OR VAL q$(1)=VAL q$(2) AND VAL q$(3)=VAL q$(5) THEN LET full=1 7610 IF full=1 AND U$(3,24)=" " THEN GO TO score 7612 FOR i=2 TO 5 7613 IF VAL q$(i)=VAL q$(i-1) THEN GO TO 7618 7614 NEXT i 7616 GO TO 5000 7618 FOR j=1 TO 5 7620 IF d(j)=VAL q$(i) THEN LET f$(j)="x" 7622 NEXT j 7624 GO TO 5000 7632 FOR i=1 TO 5 7634 IF d(i)=VAL q$(3) THEN LET f$(i)="x" 7636 NEXT i 7638 GO TO 5000 7640 FOR i=1 TO 5 STEP 2 7642 IF VAL q$(i)<>VAL q$(2) AND VAL q$(i)<>VAL q$(4) THEN CONTINUE 7648 7644 NEXT i 7648 FOR j=1 TO 5 7650 IF d(j)<>VAL q$(i) THEN LET f$(j)="x" 7652 NEXT j 7654 GO TO 5000 7660 REM Full 7666 IF VAL q$(1)=VAL q$(2) AND VAL q$(3)=VAL q$(4) OR VAL q$(1)=VAL q$(2) AND VAL q$(4)=VAL q$(5) OR VAL q$(2)=VAL q$(3) AND VAL q$(4)=VAL q$(5) THEN GO TO 7640 7668 LET PTR=7600 7670 GO TO PTR 7702 IF count>=2 THEN GO TO PTR 7710 FOR i=3 TO 33 STEP 3 7712 IF U$(3,i)=" " THEN GO TO 7716 7714 NEXT i 7716 LET ONE=i 7718 FOR i=i+3 TO 33 STEP 3 7720 IF U$(3,i)=" " THEN GO TO 7724 7722 NEXT i 7724 LET TWO=i 7730 IF ONE<=18 AND TWO<=18 THEN GO TO 7810 7732 IF ONE<=18 AND TWO>=21 THEN GO TO 7750 7734 IF ONE=21 AND TWO=24 THEN GO TO 7770 7736 IF ONE=21 AND TWO>=27 THEN GO TO 7790 7738 IF ONE=24 THEN GO TO 7660 7740 LET PTR=7600 7742 GO TO PTR 7750 LET ADDER=0 7751 FOR i=1 TO 5 7752 IF VAL q$(i)=ONE/3 THEN LET ADDER=ADDER+1 7753 NEXT i 7754 IF ADDER>=2 THEN GO TO 7810 7756 IF TWO=21 THEN GO TO 7782 7760 FOR i=2 TO 4 7762 IF VAL q$(i)=VAL q$(i-1) AND VAL q$(i)=VAL q$(i+1) THEN GO TO 7768 7764 NEXT i 7766 GO TO 7810 7768 IF TWO=21 THEN LET PTR=7400 7770 IF TWO=24 THEN LET PTR=7500 7772 IF TWO>=27 THEN LET PTR=7600 7774 GO TO PTR 7776 IF VAL q$(1)=VAL q$(2) AND VAL q$3)=VAL q$(0) OR VAL q$(1)=VAL q$(2) AND VAL q$(4)=VAL q$(5) OR VAL q$(2)=VAL q$(3) AND VAL q$(4)=VAL q$(5) THEN LET PTR=7500 7778 IF PTR<>7500 THEN LET PTR=7400 7780 GO TO PTR 7782 LET PTR=7400 7784 GO TO PTR 7790 FOR i=2 TO 4 7792 IF VAL q$(i)=VAL q$(i-1) AND VAL q$(i)=VAL q$(i+1) THEN GO TO 7800 7794 NEXT i 7796 LET PTR=7400 7798 GO TO PTR 7800 LET PTR=7600 7802 GO TO PTR 7810 LET PTR=7300 7812 GO TO PTR 7999 POKE 23658,0 8000 POKE 23730,232 8001 POKE 23731,253 8002 FOR i=65001 TO 65003 8003 POKE i,0 8004 NEXT i 8005 FOR i=65004 TO 65033 8006 POKE i,32 8007 NEXT i 8900 BORDER 4: PAPER 6: INK 0: CLS 8902 PRINT AT 10,8; FLASH 1;" INITIALIZATION " 8904 PRINT AT 18,3;"(Please wait a few seconds)" 8908 PRINT AT 5,2;"Rel#: 30";AT 5,25;"*1984" 8950 FOR i=65368 TO 65503 8952 READ u 8954 POKE i,u 8956 DATA 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,128 8958 DATA 1,0,0,0,0,0,0,0,128,0,0,0,0,0,0,0,0,0,12,12,0,0,0,0 8960 DATA 0,0,0,0,48,48,0,0,0,0,12,12,0,0,0,128,1,0,0,0,48,48,0,0 8962 DATA 0,0,48,48,0,0,0,0,0,0,0,0,12,12,0,0,0,0,48,48,0,0,0,1 8964 DATA 128,0,0,0,12,12,0,0,0,0,48,48,0,0,0,48,48,0,0,0,48,48,0,0 8966 DATA 0,0,12,12,0,0,0,12,12,0,0,0,12,12,0,0 8968 NEXT i 9005 BORDER 4: PAPER 4: INK 0 9020 CLS : INVERSE 1: PRINT AT 2,0;"Select desired option2": INVERSE 0 9025 PRINT AT 5,4;"*One Player vs Computer": INVERSE 1: PRINT AT 5,30;"1" 9030 INVERSE 0: PRINT AT 7,4;"*Two Players only": INVERSE 1: PRINT AT 7,30;"2" 9035 INVERSE 0: PRINT AT 9,4;"*Two Players and" 9040 PRINT AT 10,5;"the Computer": INVERSE 1: PRINT AT 10,30;"3" 9045 INVERSE 0: PRINT AT 12,4;"*Three Players only": INVERSE 1: PRINT AT 12,30;"4" 9050 PRINT AT 15,0;"Hit Number Indicated ": INVERSE 0 9052 IF INKEY$="" THEN GO TO 9052 9053 IF INKEY$CHR$ 52 THEN GO TO 9052 9055 LET n=VAL INKEY$ 9056 POKE 65037,n 9060 PAPER 5: CLS : DIM N$(3,10): PRINT AT 2,0;"Player 1...your name?": INPUT N$(1): PRINT N$(1) 9061 FOR i=1 TO LEN N$(1) 9062 POKE 65003+i,CODE N$(1,i) 9063 NEXT i 9064 POKE 65034,LEN N$(1) 9065 IF n=1 THEN GO TO 9090 9070 PRINT AT 5,0;"Player 2...your name?": INPUT N$(2): PRINT N$(2) 9071 FOR i=1 TO LEN N$(2) 9072 POKE 65013+i,CODE N$(2,i) 9073 NEXT i 9074 POKE 65035,LEN N$(2) 9075 IF n=2 THEN GO TO 9100 9076 IF n=3 THEN GO TO 9090 9080 PRINT AT 8,0;"Player 3...your name?": INPUT N$(3): PRINT N$(3) 9081 FOR i=1 TO LEN N$(3) 9082 POKE 65023+i,CODE N$(3,i) 9083 NEXT i 9084 POKE 65036,LEN N$(3) 9085 PAUSE 120: CLS : GO TO 9100 9090 LET N$(3)="CPU" 9091 POKE 65024,67 9092 POKE 65025,80 9093 POKE 65026,85 9094 POKE 65036,3 9101 DIM t$(4,4): RESTORE 9103 9102 FOR x=1 TO 4 9103 READ w$ 9104 LET t$(x)=w$ 9105 DATA "1400","1200","1240","1230" 9106 NEXT x 9107 DIM v(3) 9108 LET n=PEEK 65037 9109 FOR i=0 TO 21: INK 1: PRINT AT i,0;"::::::::::::::::::::::::::::::::": NEXT i 9110 FOR i=0 TO 21: INK 0: PRINT AT i,16;"::::::::::::::::::::::::::::::::": NEXT i 9115 PAPER 6: PRINT AT 1,17;"PL1:";N$(1) 9116 IF n=1 THEN GO TO 9120 9117 PRINT AT 2,17;"PL2:";N$(2) 9118 IF n=4 THEN PRINT AT 3,17;"PL3:";N$(3) 9120 PRINT AT 6,20;"PL1";AT 20,20;" ": IF n<>1 THEN PRINT AT 6,24;"PL2";AT 20,24;" " 9125 IF n=1 OR n=3 THEN PRINT AT 6,28;"CPU";AT 20,28;" " 9130 IF n=4 THEN PRINT AT 6,28;"PL3";AT 20,28;" " 9135 LET S$=" 1 2 3 4 5 6STFLPKGLDG" 9140 FOR i=8 TO 18: PRINT AT i,17;S$(i*2-15 TO i*2-14): NEXT i: PRINT AT 20,17;"TL" 9145 FOR i=8 TO 18 9146 PRINT AT i,20;" " 9147 IF n=1 THEN PRINT AT i,28;" " 9148 IF n=2 THEN PRINT AT i,24;" " 9149 IF n>=3 THEN PRINT AT i,24;" ";AT i,28;" " 9150 NEXT i 9155 FOR i=3 TO 16: INK 4: PRINT AT i,1;"::::::::::::::::::::::::::::": NEXT i 9285 DIM U$(3,33) 9290 DIM a$(2,2) 9295 DIM d(5) 9300 LET f$="00000" 9305 INK 0 9310 LET player=3000 9315 LET Throw=1200 9320 LET count=0 9325 LET score=3200 9330 LET k$=" 5 2 8 512 7 8 9 512" 9335 DIM q$(5,1) 9340 LET Rubout=3600 9345 LET Sum=3800 9350 RANDOMIZE 0 9355 LET cpu=5000 9360 LET Seq=3900 9365 LET fl=0 9370 LET End=0 9375 LET Finale=6500 9380 LET Fix=1300 9385 LET Blank=1350 9390 LET o$="07021005140710090712" 9395 DIM Z(3) 9397 DIM Z$(3,3) 9399 LET Total=1500 9405 FLASH 0: GO SUB 1190 9410 DIM m$(3,5) 9415 LET m$(1)="12345" 9420 LET m$(2)="23456" 9425 LET m$(3)="13456" 9430 LET Acc=0 9435 LET Music=7000 9436 LET Mus2=7100 9438 LET full=0 9440 LET fstr=0 9442 LET tone=0 9444 LET ttwo=0 9446 LET flagstr=0 9995 GO TO 1000 9996 STOP 9997 CLEAR : RANDOMIZE USR 100: SAVE "Genrla.B1" LINE 1 9998 CLEAR : RANDOMIZE USR 100: LOAD "L.B1" ```