1000 'FUT'ORIC (C) 2023 Andr{ Ch{ramy
1001 'Fichier source FOREM.TXT (Version avec REM). Le Fichier source all{g{
1002 'sans les REM donne la version finale FO.COM sur disquette.
1003 'V0208-1121
1004 '
1005 'Jeu de chiffres de type Futoshiki qui veut dire "non {gal" en japonais
1006 'Pour Rom 1.1 et Sedoric (Atmos r{el, Euphoric ou Oricutron). 
1007 '
1008 'Quelques infos:
1009 'LIVE est une zone de 36 octets situ{e en Ram de #9C78 @ #9C9B  
1010 'contenant les CS (Case Status) des cases de la grille,  
1011 'soit: 0 (vide), 1 @ 6 (chiffre original), 7 (hypoth}se) ou 11-16 
1012 '(chiffre valid{ par le joueur +10)
1013 '
1014 'S/P Initialisation
1020 GOSUB 60000
1021 '
1022 '------------------------------------
10135 'Chargement de la grille (ou de la grille suivante) 
10140 NG=NG+1:IF NG>64 THEN 47080
10141 'Num{ro de Grille test{  si < 64 (Grille finale) 
10142 'Donc NG ne d{passe la limite que lors de l'incr{mentation
10143 'automatique pour passage @ la grille suivante. Si c'est le cas,  
10144 'C'est fini, affichage du score final. Lors de la r{solution de la 
10145 'derni}re grille, il y a un premier affichage de f{licitation pour 
10146 'la grille, puis incr{mentation, d{passement et affichage d'une 2e 
10147 'f{licitation pour toutes les grilles
10150 NG$=STR$(NG):NG$=RIGHT$(NG$,LEN(NG$)-1)
10152 NG$="0"+NG$:NG$=RIGHT$(NG$,2)
10154 NF$="G"+NG$+".DAT":LOAD NF$:ERREURS=0
10155 '
10156 '
10157 'Initialisations propres @ cette grille 
10160 TG=PEEK(#BFF0)
10161 'TG Taille de Grille (4, 5 ou 6)
10162 '
10180 C=1:L=1
10181 'Coordonn{es de la case o| se trouve le curseur au d{part 
10190 XO=PEEK(#BFF4):YO=PEEK(#BFF5)
10191 'XO & YO Coordonn{es du coin haut gauche de la grille 
10192 '
10193 '
10200 'Calcul des adresses effacement de ligne (A0), d'affichage des messages
10201 '"Grille No" (A1), "Vus" (A2), et "Un peu de patience s.v.p..." (A3)
10206 ON TG-3 GOTO 10208,10210,10212
10208 A0=#BF68+2:A1=#BF68+6:A2=#BF8F-8:A3=#BF68+6:GOTO 10230
10210 A0=#BF68+2:A1=#BF68+3:A2=#BF8F-6:A3=#BF68+6:GOTO 10230
10212 A0=#BF90+2:A1=#BF90+1:A2=#BFB7-4:A3=#BF90+6:GOTO 10230
10213 'De #BF68 @ #BF8F 1ere ligne de la zone texte de l'{cran Hires
10214 'De #BF90 @ #BFB7 2eme ligne de la zone texte de l'{cran Hires
10215 '
10217 '
10219 'Couleurs Encre, Couleur Papier
10230 CE=PEEK(#BFE4):CP=PEEK(#BFE5)
10340 XS=XO+7
10341 'Abscisse d'affichage du sprite dans la 1ere case 
10342 'Largeur case 23 - largeur de 2 caract}res 12 = 11
10343 '7 = INT(11/2) + 2
10350 YS=YO+4
10351 'Ordonn{e d'affichage du sprite dans la 1ere case
10352 'Hauteur case 21 - hauteur de 2 caract}res 16 = 5
10353 '2 + INT 5 / 2 = 4
10353 '
10360 GOSUB 16050
10361 'Initialisation de la zone LIVE en Ram
10370 CV=PEEK(#BFE3):CI=CV
10371 'Nombre de Chiffres Vus au d{part (CI servira pour le score) 
10380 GOSUB 12000
10381 'S/P Efface ligne puis affiche le No de la grille
10390 GOSUB 13000
10391 '13000 = S/P Affichage du nombre de chiffres vus
10400 GOTO 30110
10401 'Suite vers le programme proprement dit 
10402 '
10403 '-------------------------------------------------
10404 'S/P Tracage/effacement du cadre-curseur dans la case C,L 
10405 'Entr{es: XC,YC Coordonn{es du coin HG int{rieur de la case
11000 CURSET XC+1,YC+1,3
11010 DRAW  20,  0,2:'20 = Largeur case 23 - 3
11020 DRAW   0, 18,2:'18 = Hauteur case 21 - 3
11030 DRAW -20,  0,2:'20 = Largeur case 23 - 3
11040 DRAW   0,-18,2:'18 = Hauteur case 21 - 3
11050 RETURN
11051 'L'attribut fb=2 effectue une inversion vid{o: allum{ (1) / {teint (0)
11052 'Le cadre-curseur aparait donc trac{ ou effac{  
11053 '
11054 '-------------------------------------------------
11055 'S/P Affichage du No de grille
12000 GOSUB 17000
12001 'S/P d'effacement de la ligne d'affichage dans la zone texte
12010 NG$=STR$(NG)
12011 'NG$ commence par un espace, pas besoin d'en mettre un
12012 'CLS:POKE#26A,(PEEK(#26A)AND#FE):POKE#BF68,CP+#10:POKE#BF69,CE
12013 'POKE#BF90,CP+#10:POKE#BF91,CE:POKE#BFB8,CP+#10:POKE#BFB9,CE
12014 'CP attribut Papier, CE attribut Encre
12030 M$=O4$+NG$:LS=LEN(M$)
12031 'O4="Grille No:" ou "Grid #:"
12040 FOR K=1 TO LS:POKE A1+K,ASC(MID$(M$,K,1)):NEXT
12050 RETURN
12051 '
12052 '-------------------------------------------------
12053 'S/P Affichage de CV, le nombre de Chiffres Vus 
13000 CV$=STR$(CV):M$=O5$+CV$:LS=LEN(M$)
13001 'O5$="Vus:" ou "Seen:"
13010 FOR K=1 TO LS:POKE A2-LS+K,ASC(MID$(M$,K,1)):NEXT
13020 RETURN
13021 '
13022 '-------------------------------------------------
13023 'S/P Efface la ligne d'affichage, Affiche "Un peu de patience s.v.p..."
13100 GOSUB 17000
13101 'Efface la ligne d'affichage
13102 'CLS:POKE#26A,(PEEK(#26A)AND#FE):POKE#BF68,CP+#10:POKE#BF69,CE
13103 'POKE#BF90,CP+#10:POKE#BF91,CE:POKE#BFB8,CP+#10:POKE#BFB9,CE
13120 M$=O6$:LS=LEN(M$)
13130 FOR K=1 TO LS:POKE A3+K,ASC(MID$(M$,K,1)):NEXT
13140 RETURN
13141 '
13142 '-------------------------------------------------
13143 'S/P de calcul des coordonn{es d'affichage des grands chiffres. 
13144 'Chaque grand chiffre est un sprite form{ de 4 caract}res red{finis 
13145 'Entr{e: XC,YC Coordonn{es du coin int{rieur HG de la case ou afficher 
13146 'X1 et X2 abscisses des caract}res de gauche et de droite 
13147 'Y1 et Y2 ordonn{es des caract}res du haut et du bas
13148 'Rappel XC=XO+2+(C-1)*(Largeur Case+11)
14400 X1=XC+6:X2=XC+12
14410 'Rappel YC=YO+2+(L-1)*(Hauteur Case+11)
14411 Y1=YC+3:Y2=YC+11
14420 RETURN
14421 
14422 '-------------------------------------------------
14423 'S/P d'effacement de la case X,Y
14450 CURSET XC+ 3,YC+ 3,3:CHAR 33,1,0
14452 CURSET XC+ 9,YC+ 3,3:CHAR 33,1,0
14453 CURSET XC+15,YC+ 3,3:CHAR 33,1,0
14454 CURSET XC+ 3,YC+10,3:CHAR 33,1,0
14455 CURSET XC+ 9,YC+10,3:CHAR 33,1,0
14456 CURSET XC+15,YC+10,3:CHAR 33,1,0
14457 'Ascii 33 est un bloc de 6x8 pixels (inverse vid{o de l'espace) 
14470 RETURN
14471 '
14472 '-------------------------------------------------
14483 'S/P Affichage 1 pour le joueur 
14500 GOSUB 14400
14501 'Calcul des coordonn{es d'affichage des grands chiffres
14510 CURSET X1-1,Y1,3:CHAR 58,1,2
14511 'equiv :
14520 CURSET X2-1,Y1,3:CHAR 59,1,2
14521 'equiv ;
14530 CURSET X1-1,Y2,3:CHAR 60,1,2
14531 'equiv <
14540 CURSET X2-1,Y2,3:CHAR 61,1,2
14541 'equiv =
14550 RETURN
14551 '-------------------------------------------------
14552 'S/P Affichage 2 pour le joueur 
14600 GOSUB 14400
14610 CURSET X1,Y1,3:CHAR 62,1,2
14611 'equiv >
14620 CURSET X2,Y1,3:CHAR 63,1,2
14621 'equiv ?
14630 CURSET X1,Y2,3:CHAR 64,1,2
14631 'equiv @
14640 CURSET X2,Y2,3:CHAR 65,1,2
14641 'equiv A
14650 RETURN
14651 '-------------------------------------------------
14652 'S/P Affichage 3 pour le joueur 
14700 GOSUB 14400
14710 CURSET X1,Y1,3:CHAR 66,1,2
14711 'equiv B
14720 CURSET X2,Y1,3:CHAR 67,1,2
14721 'equiv C
14730 CURSET X1,Y2,3:CHAR 68,1,2
14731 'equiv D
14740 CURSET X2,Y2,3:CHAR 69,1,2
14741 'equiv E
14750 RETURN
14751 '-------------------------------------------------
14752 'S/P Affichage 4 pour le joueur 
14800 GOSUB 14400
14810 CURSET X1,Y1,3:CHAR 70,1,2
14811 'equiv F
14820 CURSET X2,Y1,3:CHAR 71,1,2
14821 'equiv G
14830 CURSET X1,Y2,3:CHAR 72,1,2
14831 'equiv H
14840 CURSET X2,Y2,3:CHAR 73,1,2
14841 'equiv I
14850 RETURN
14851 '-------------------------------------------------
14852 'S/P Affichage 5 pour le joueur 
14900 GOSUB 14400
14910 CURSET X1,Y1,3:CHAR 74,1,2
14911 'equiv J
14920 CURSET X2,Y1,3:CHAR 75,1,2
14921 'equiv K
14930 CURSET X1,Y2,3:CHAR 76,1,2
14931 'equiv L
14940 CURSET X2,Y2,3:CHAR 77,1,2
14941 'equiv M
14942 RETURN
14943 '-------------------------------------------------
14944 'S/P Affichage 6 pour le joueur 
14945 GOSUB 14400
14946 CURSET X1,Y1,3:CHAR 78,1,2
14947 'equiv N
14948 CURSET X2,Y1,3:CHAR 79,1,2
14949 'equiv O
14950 CURSET X1,Y2,3:CHAR 80,1,2
14951 'equiv P
14952 CURSET X2,Y2,3:CHAR 81,1,2
14953 'equiv Q
14954 RETURN
14955 '-------------------------------------------------
14956 'Affichage des hypoth}ses (1, 2, 3, 4, 5 ou 6 en taille normale) 
14957 'En Entr{e: R3, chiffre @ afficher de 1 @ 6 
14958 'XC et YC, Coordonn{es du coin int{rieur HG de la case au curseur 
14959 'C et L No de colonne et No de ligne de la case au curseur 
15000 NC=C+TG*(L-1)
15001 'Num{ro de la Case 
15010 AS=58+R3
15011 'Code Ascii pour afficher le chiffre red{fini correspondant 
15020 IF TG=4 THEN 15090
15021 'Si grille 4x4 on saute 6 lignes
15022 'Coordonn{s d'affichage des hypoth}ses pour grilles 5x5 et 6x6
15030 IF R3=1 THEN CURSET XC+ 3,YC+ 3,3:GOTO 15130
15040 IF R3=2 THEN CURSET XC+ 9,YC+ 3,3:GOTO 15130
15050 IF R3=3 THEN CURSET XC+15,YC+ 3,3:GOTO 15130
15060 IF R3=4 THEN CURSET XC+ 3,YC+10,3:GOTO 15130
15070 IF R3=5 THEN CURSET XC+ 9,YC+10,3:GOTO 15130
15080 IF R3=6 THEN CURSET XC+15,YC+10,3:GOTO 15130
15081 'Coordonn{s d'affichage des hypoth}ses pour grille 4x4
15090 IF R3=1 THEN CURSET XC+ 6,YC+ 3,3:GOTO 15130
15100 IF R3=2 THEN CURSET XC+12,YC+ 3,3:GOTO 15130
15110 IF R3=3 THEN CURSET XC+ 6,YC+11,3:GOTO 15130
15120 IF R3=4 THEN CURSET XC+12,YC+11,3
15130 CHAR AS,0,2
15131 'CURSET n'affiche rien (fb=3) et se contente de fixer la position 
15132 'CHAR AS affiche ou efface le chiffre @ la position voulue 
15133 'car fb=2 effectue une inversion vid{o des pixels
15140 FU=0:POKE#9C77+NC,7
15141 'Drapeau FUNCT d{sactiv{ et mise @ jour de la zone LIVE avec le flag 
15142 '7, soit: La case contient une ou des hypoth}ses 
15150 GOTO 31000
15151 'Reboucle @ la saisie de touche 
15152 '
15153 '
16000 'S/P d'initialisation de LIVE (36 octets de #9C78 @ #9C9B). 
16001 'LIVE indique le CS Case Status de la case
16002 'Copie 36 valeurs initiales de la grille dans LIVE
16003 'Bloc #9FB8-#9FDB vers #9C78-#9C9B
16050 FOR K=0 TO 35
16060 POKE#9C78+K,PEEK(#9FB8+K)
16070 NEXT
16080 RETURN
16081 '-------------------------------------------------
16082 '
16083 'S/P d'effacement de la ligne d'affichage dans la zone texte
17000 FOR K=1 TO 36:POKE A0+K,32:NEXT
17010 RETURN 
17011 '#BF68 d{but de la 1ere ligne de la zone texte de l'{cran Hires
17012 '#BF90 d{but de la 2eme ligne de la zone texte de l'{cran Hires
17013 '
17014 '
17015 '==================================
30000 'Entr{e du programme proprement dit 
30010 '==================================
30020 '
30100 'Affichage initial du curseur
30110 XC=XO+2:YC=YO+2
30111 'Coordonn{es Hires du coin int{rieur haut gauche de la 1e case 
30130 GOSUB 11000
30131 'Trace le cadre-curseur dans la 1e case 
30133 '
30134 '
30135 'Saisie clavier 
31000 GET R$
31010 FU=PEEK(#209):R=ASC(R$)
31011 'Scrute touche de controle, qui vaut #A5 si FUNCT press{e (hypoth}se)
31012 'et calcule le code Ascci de touche press{e
31013 '>>> Est-ce une fl}che? (seule mise @ jour pour les Coordonn{es C,L) 
31020 R1=R-7:IF R1<1 OR R1>4 THEN 32010
31021 'Si c'est pas une fl}che, suite analyse de la touche press}e en 32010
31022 'Transforme le code Ascci des fl}ches en index de 1 @ 4
31023 'Gauche=1, Droite=2, Bas=3, Haut=4
31040 GOSUB 11000
31041 'S/P Efface le cadre-curseur avant d{placement selon fl}che
31050 ON R1 GOTO 44500,44600,44700,44800
31051 'Gauche, Droite, Bas, Haut suivit de saisie de touche
31052 '
32000 '>>> Si ce n'{tait pas une fl}che on arrive ici
32001 'Analyse le Status de la case au curseur 
32010 NC=C+TG*(L-1)
32011 'Num{ro de la Case 
32020 CS=PEEK(#9C77+NC)
32021 'R{cup}re le CS Case Status dans la zone LIVE (#9C78/#9C9B)
32030 IF CS=0 THEN CAS=1
32031 'La case est vide 
32040 IF CS>0 AND CS<7 THEN CAS=2
32041 'Case contient chiffre org prot{g{ 
32050 IF CS=7 THEN CAS=3
32051 'La case contient une ou des hypoh}ses 
32060 IF CS>7 THEN CAS=4
32061 'La case contient un chiffre du joueur 
32070 IF FU=#A5 THEN 42010
32071 'Si touche FUNCT, Saute directemt @ la gestion des hypoth}ses, 
32072 'seul cas ou FUNCT entre en jeu
35000 '>>> Est-ce un chiffre de 1 @ 6? (chiffre du joueur) 
35010 R2=R-48
35011 'Transforme le code Ascci en valeur de 1 @ 6 
35020 IF R2<1 OR R2>6 THEN 41010
35030 'Suite de l'analyse si pas un chiffre de 1 @ 6 
35040 ON CAS GOTO 36010,37010,38010,39010
36000 '1::: La case est vide 
36010 POKE#9C77+NC,R2+10:CV=CV+1:GOSUB 13000
36011 'Met @ jour CS avec chiffre de 11 @ 16, incr{mente 
36012 'et affiche le nombre de Chiffres Vus 
36020 ON R2 GOSUB 14500,14600,14700,14800,14900,14945
36021 'Affiche 1,2,3,4,5 ou 6 en vid{o inverse 
36030 GOTO 40000
36031 'Teste si toutes les cases sont remplies  
37000 '2:::La case contient un chiffre original prot{g{
37010 GOTO 31000
37011 'Reboucle @ la saisie de touche sans rien faire 
38000 '3:::La case contient une ou des hypoth}ses 
38010 GOSUB 14450:POKE#9C77+NC,R2+10:CV=CV+1:GOSUB 13000
38011 'Efface case, met @ jour CS avec chiffre 
38012 'de 11 @ 16, incr{mente et affiche le nombre Chiffres Vus 
38020 GOTO 36020
38021 'Reboucle pour afficher le chiffre du joueur, etc. 
39000 '4:::La case contient d{j@ un chiffre du joueur 
39010 GOSUB 14450:POKE#9C77+NC,R2+10:GOTO 36020
39011 'Efface case, met @ jour CS avec chiffre 
39012 'de 11 @ 16, CV inchang{, reboucle pour afficher le nouveau 
39013 'chiffre du joueur, etc. 
39014 '
39015 'Teste si toutes les cases sont remplies 
40000 IF CV<TG*TG THEN 31000
40001 'Pas fini, reboucle @ la saisie de touche 
40002 'Sinon les TG*TG cases sont remplies, v{rifie avec la solution:
40003 'V = Flag chiffre du joueur = +10
40004 '13100 = Efface la ligne d'affichage puis Aff "Un peu de patience..."
40006 '#9C78 est le d{but de LIVE
40010 GOSUB 13100:FOR K=0 TO (TG*TG)-1
40020 V=PEEK(#9C78+K):IF V>10 THEN V=V-10
40030 IF PEEK(#9FDC+K)<>V THEN ERREURS=ERREURS+1
40040 NEXT
40041 'Cette boucle compare les valeurs de 
40042 'la solution  (localis{es @ partir de #9FDC) avec les valeurs de 
40043 'la zone LIVE (localis{es @ partir de #9C78)
40050 IF ERREURS=0 THEN SC=SC+(TG*TG)-CI:GOTO 47010
40051 '{cran f{licitations, chargement grille suiv, etc. 
40052 'S'il y a des erreurs:
40053 GOSUB 12000
40054 'S/P Efface ligne puis affiche le No de la grille
40060 ER$=STR$(ERREURS):M$=P3$+ER$:LS=LEN(M$)
40061 'P3$="Erreurs:" ou "Errors:"
40070 FOR K=1 TO LS:POKE A2-LS+K,ASC(MID$(M$,K,1)):NEXT
40071 'Affiche le nombre d'erreurs dans la zone Text de l'{cran Hires
40072 GET R$:GOSUB 12000:GOSUB 13000:ERREURS=0
40073 'S/P Effacement ligne, Affichage No de grille et nombre chiffres vus
40080 GOTO 31010
40081 'Reboucle @ la saisie de touche pour corrections avec GET R$ valide
41000 '>>> Est-ce le chiffre 0? (pour effacer la case) 
41010 IF R2<>0 THEN 43010
41011 'Si touche saisie <>0 saute @ la suite (touches R, S, L, B) 
41020 ON CAS GOTO 41030,41050,41070,41090
41021 '1:::La case est vide
41030 GOTO 31000
41031 'Rien @ {ffacer, reboucle @ la saisie de touche 
41040 '2:::La case contient un chiffre original prot{g{ de 1 @ 5 
41050 GOTO 31000
41051 'Impossible d'effacer, reboucle @ la saisie de touche 
41060 '3:::La case contient une ou des hypoth}ses 
41070 GOSUB 14450:POKE#9C77+NC,0:GOTO 31000
41073 'Efface case, met @ jour CS, 
41074 'CV inchang{, reboucle @ la saisie de touche 
41080 '4:::La case contient un chiffre du joueur 
41090 GOSUB 14450:POKE#9C77+NC,0:CV=CV-1:GOSUB 13000:GOTO 31000
41093 'Efface case, met @ jour LIVE, d{cr{mente et 
41094 'affiche le nombre Chiffres Vus 
41095 'Reboucle @ la saisie de touche 
42000 '>>> Est-ce une hypoth}se (FUNCT + chiffre 1 @ 6) 
42010 R3=R-48
42011 'Transforme le code Ascii en valeur de 1 @ 6 
42030 IF R3<1 OR R3>6 THEN 31000
42031 'Reboucle @ la saisie de touche si FUNCT+touche autre que 1 @ 6 
42032 IF FU=#A5 AND BR=1 THEN CALL #FB14
42033 'Son clic si hypoth}se et bruitage on 
42040 ON CAS GOTO 42050,42070,42090,42110
42041 '1::: La case est vide, l'affichage de l'hypoth}se est possible
42050 POKE#9C77+NC,7:GOTO 15000
42051 'Met @ jour CS, affiche l'hypoth}se, puis reboucle @ la 
42052 'saisie de touche. CV n'est pas alt{r{ 
42060 '2:::La case est prot{g{e (contient un chiffre original de 1 @ 6) 
42070 GOTO 31000
42071 'Impossible de modifier la case, reboucle @ la saisie de touche 
42080 '3:::La case contient d{j@ une ou des hypoth}ses 
42090 GOTO 15000
42091 'N'efface pas la case, affiche la nouvelle hypoth}se, CS et CV 
42092 'restent inchang{s. Reboucle @ la saisie de touche 
42100 '4:::La case contient un chiffre du joueur
42110 GOSUB 14450:POKE#9C77+NC,7:CV=CV-1:GOSUB 13000:GOTO 15000
42111 'Efface case, met @ jour CS, d{cr{mente et 
42112 'affiche CV, affiche hypoth}se et reboucle @ la saisie de touche 
43000 '>>> Est-ce la lettre R (RESET de la grille)? 
43010 IF R$="R" THEN 10150
43011 'Recharge grille GRILLE??.HRS 
43012 'le score reste celui de grille pr{c{dente 
43013 'Continue l'analyse ligne suivante si pas R
43200 '>>> Est-ce la lettre S (SAVE la partie en cours)? 
43210 IF R$<>"S" THEN 43410
43211 'Suite analyse si pas S
43220 GOSUB 50000
43221 'Sauvegarde la partie en cours 
43230 GOTO 31000
43231 'Puis reboucle @ la saisie de touche 
43400 '>>> Est-ce la lettre L (LOAD la partie sauvegard{e)? 
43410 IF R$<>"L" THEN 43610
43411 'Suite analyse si pas L 
43420 GOSUB 55000
43421 'Charge la partie pr{c{demment sauv{e 
43430 GOTO 31000
43431 'Puis reboucle @ la saisie de touche 
43600 '>>> Est-ce la lettre B (gestion du bruit)? 
43610 IF R$<>"B" THEN 43810
43611 'Suite analyse si pas B
43620 IF BR=0 THEN BR=1 ELSE BR=0
43621 'Bruitage on/off 
43630 GOTO 31000
43631 'Puis reboucle @ la saisie de touche 
43800 '>>> Est-ce la lettre Q (Quit)
43810 IF R$<>"Q" THEN 31000 ELSE 47180
43811 'Reboucle @ la saisie de touche si pas Q
43812 'Si Q sort du programme
43813 '
43814 '
44400 'Gestion des d{placements du curseur 
44401 '
44402 'Gauche
44403 'XO,YO coordonn{es coin ext{rieur HG de la grille 
44404 'XC,YC coordonn{es coin int{rieur HG de la Case C,L 
44405 'C No de la Colonne, L No de la Ligne
44406 'TG Taille de Grille (4, 5 ou 6)
44407 'Largeur Case = 23, Hauteur Case = 21
44408 'Calcul XC et YC en fonction de XO, YO, Largeur Case, Hauteur Case et C
44409 '34 = Largeur Case 23 + 11
44500 C=C-1
44510 IF C<1 THEN C=TG
44520 XC=XO+2+34*(C-1)
44530 GOSUB 11000
44531 'S/P Tracage du cadre-curseur dans la case cibl{e
44540 GOTO 31000
44541 'Reboucle @ la saisie de touche 
44542 '
44543 'Droite 
44600 C=C+1
44610 IF C>TG THEN C=1
44620 GOTO 44520
44621 '
44622 'Bas
44700 L=L+1
44710 IF L>TG THEN L=1
44720 YC=(YO+2)+32*(L-1)
44721 '32 = Hauteur de case 21 +2 +9
44730 GOSUB 11000
44731 'S/P Tracage du cadre-curseur dans la case cibl{e 
44740 GOTO 31000
44741 'Reboucle @ la saisie de touche 
44742 '
44743 'Haut
44800 L=L-1
44810 IF L<1 THEN L=TG
44820 GOTO 44720
44821 '
44822 '================================================================
47000 'F{licitations grille r{ussie 
47010 M2$=O8$+NG$:MESS=MESS+1:IF MESS=6 THEN MESS=1
47011 'O8$=la grille No
47012 'MESS non initialis{ au d{part vaut 0 puis boucle de 1 @ 5
47013 ME$=STR$(MESS):ME$=RIGHT$(ME$,1):ME$="FOMESS"+ME$+".HRS":LOAD ME$
47020 ON MESS GOTO 47021,47022,47023,47024,47025
47021 CP=#12:CE=#02:GOTO 47030:'Vert
47022 CP=#13:CE=#03:GOTO 47030:'Jaune
47023 CP=#14:CE=#04:GOTO 47030:'Bleu
47024 CP=#16:CE=#06:GOTO 47030:'Cyan
47025 CP=#17:CE=#07:'Blanc
47030 POKE#BF68,CP:POKE#BF69,CE
47040 POKE#BF90,CP:POKE#BF91,CE
47050 POKE#BFB8,CP:POKE#BFB9,CE
47051 'Ces POKE mettent INK et PAPER convenables dans la zone Text
47060 GOSUB 47300:GET R$
47061 'Affiche les messages de f{licitations
47070 IF NG=64 THEN 47080 ELSE 10140
47071 'Si c'{tait la Grille Finale, affiche {cran final
47072 'Sinon passe @ la grille suivante 
47080 M2$=O9$:LOAD"SCORENOIR.HRS"
47081 'O9$="la derni}re grille"  
47090 POKE#BF68,16:POKE#BF69,0
47100 POKE#BF90,16:POKE#BF91,0
47110 POKE#BFB8,16:POKE#BFB9,0
47111 'Ces POKE mettent INK et PAPER de la zone Text en noir 
47170 GOSUB 47300:GET R$
47171 'Affiche les messages de f{licitations 
47180 TEXT:PAPER 0:INK 7:CLS:CALL#F8D0
47181 'R{g{n}re les caract}res normaux (jeux 0 & 1)
47190 POKE#26A,(PEEK(#26A)OR#01):PRINT""
47191 'Curseur TEXT on
47200 END
47201 '
47202 '------------------------------------------------
47203 'S/P de d'affichage d'une chaine M$ en HIRES
47204 'X,Y coordonn{es du point d'affichage 
47205 'Nombre Maximum de caract}res qu'il est possible d'afficher = 20
47206 'M$ chaine @ afficher et N$ nom du joueur
47210 LS=LEN(M$):MG=INT((20-LS)/2)
47211 'MG marge de gauche (en caract}res de 6 pixels) 
47220 X=X+(MG*6)
47230 FOR K=1 TO LS
47240 C$=MID$(M$,K,1)
47241 'Voir si CURSET X,Y,3:CHAR ASC(MID$(M$,K,1)),0,1 ok (C$ var en moins)
47250 CURSET X,Y,3:CHAR ASC(C$),0,1
47260 X=X+6
47270 NEXT
47280 RETURN
47281 '-------------------------------------------------
47282 '
47283 'S/P de d'affichage des chaines de caract}res de f{licitations
47284 'X et Y coordonn{es du point d'affichage 
47285 'M$ message @ afficher par le S/P  
47300 X=60:Y=101:M$=O7$+N$+"!":GOSUB 47210
47301 'O7=Bravo 
47330 X=60:Y=Y+10:M$=P2$:GOSUB 47210
47331 'P2$=Vous avez  r{solu
47340 X=60:Y=Y+10:M$=M2$:GOSUB 47210
47341 'M2$ vaut O8$=la grille No ou O9$="la derni}re grille"
47350 X=60:Y=Y+10:M$=P4$:GOSUB 47210
47351 'P4$="Votre score est de"
47360 X=60:Y=Y+10:M$=STR$(SC)+P1$:GOSUB 47210
47361 'P1$=" points."
47370 RETURN
47371 '
47372 '-------------------------------------------------
47373 'S/P Sauvegarde de la partie en cours (grille + score etc)
47374 'Les principaux parametres de la grille sont plac{s dans la zone 
47375 '#BFE0-#BFFF(32 octets) qui sera sauvegard{e dans le fichier 
47376 'PARTIE.HRS qui couvre la Ram de #9C00 @ #BFFF
50000 GOSUB 13100
50001 'S/P Efface ligne puis affiche "Un peu de patience s.v.p..."
50010 AD=#BFE0:POKE AD,BR:AD=AD+1
50011 '    #BFE0 BR Bruitage on=1/off=0
50020 POKE AD,C:AD=AD+1:POKE AD,L:AD=AD+1
50021 '    #BFE1 C Abscisse de la case o| se trouve le curseur
50022 '    #BFE2 L Ordonn{e de la case o| se trouve le curseur
50030 POKE AD,CV:AD=AD+1
50031 '    #BFE3 CV Nombre de Chiffres Vus
50040 POKE AD,CE:AD=AD+1:POKE AD,CP:AD=AD+1
50041 '    #BFE4 CE Couleur Encre 
50042 '    #BFE5 CP Couleur Papier 
50050 POKE AD,CI:AD=AD+1
50051 '    #BFE6 CI calcul du score
50060 POKE AD,XC:AD=AD+1:POKE AD,YC:AD=AD+1
50061 '    #BFE7 XC Abscisse du coin HG d'une Cellule donn{e
50062 '    #BFE8 YC Ordonnee du coin HG d'une Cellule donn{e 
50070 POKE AD,FU:AD=AD+1:POKE AD,LG:AD=AD+1
50071 '    #BFE9 FU Funct (56=pas pressée)
50072 '    #BFEA LG Langage Fran|ais si LG nul, English si LG <> 0
50080 POKE AD,NC:AD=AD+1:POKE AD,NG:AD=AD+1
50081 '    #BFEB NC Numero de la case au curseur NC=C+TG*(L-1)
50082 '    #BFEC NG Numero de grille
50090 POKE AD,ER:AD=AD+1
50091 '    #BFED ER Nombre d'erreurs
50100 DOKE AD,SC:AD=AD+2
50101 '    #BFEE/#BFEF SC SCore sur deux octets
50110 POKE AD,TG:AD=AD+1:POKE AD,MESS:AD=AD+1
50111 '    #BFF0 TG Taille de Grille (4, 5 ou 6) 
50112 '    #BFF1 MESS Numéro de l'ecran de message de félicitation
50120 POKE AD,X:AD=AD+1:POKE AD,Y:AD=AD+1
50121 '    #BFF2 X Abscisse du point d'affichage Hires 
50122 '    #BFF3 Y Ordonn{e du point d'affichage Hires 
50130 POKE AD,XO:AD=AD+1:POKE AD,YO:AD=AD+1
50131 '    #BFF4 XO Abscisse X d'origine coin HG de la grille 
50132 '    #BFF5 YO Ordonnee Y d'origine coin HG de la grille 
50140 POKE AD,XS:AD=AD+1:POKE AD,YS:AD=AD+1
50141 '    #BFF6 XS Abscisse coin haut gauche du Signe < , > , ^ ou v 
50142 '    #BFF7 YS Ordonnee coin haut gauche du Signe < , > , ^ ou v 
50150 DOKE AD,A0:AD=AD+2
50151 '    #BFF8/#BFF9 A0 adresse effacement de ligne (2 octets)
50160 DOKE AD,A1:AD=AD+2
50161 '    #BFFA/#BFFB A1 adr affichage message "Grille No" (2 octets)
50170 DOKE AD,A2:AD=AD+2
50171 '    #BFFC/#BFFD A2 adr affichage message "Vus :" (2 octets)
50180 DOKE AD,A3
50181 '    #BFFE/#BFFF A3 adr aff mess "Un peu de patience s.v.p..." (2 oct)
50210 SAVEO"PARTIE.HRS",A#9C00,E#BFFF
50211 'Ecran Hires + Data
50220 GOSUB 12000
50221 'S/P Efface ligne puis affiche le No de la grille
50230 GOSUB 13000
50231 'S/P Affichage  du nombre de chiffres vus
50240 POKE#26B,CP+#10:POKE#26C,CE
50241 'Couleurs Papier et Encre des zones Hires et Text
50250 RETURN
50251 '
50252 '-------------------------------------------------
50253 'Recharge (LOAD) de la partie pr{c{demment sauv{e
55000 HIRES:POKE#26A,(PEEK(#26A)AND#FE):PRINT""
55001 'Curseur off
55010 LOAD"PARTIE.HRS"
55011 '
55012 'R{cup{ration des variables @ partir
55013 'des valeurs stock{es en Ram la zone #BFE0-#BFFF(32 octets) 
55020 AD=#BFE0
55110 BR=PEEK(AD):AD=AD+1
55111 '    #BFE0 BR Bruitage on/off
55120 C=PEEK(AD):AD=AD+1:L=PEEK(AD):AD=AD+1
55121 '    #BFE1 C Abscisse de la case o| se trouve le curseur
55122 '    #BFE2 L Ordonn{e de la case o| se trouve le curseur
55130 CV=PEEK(AD):AD=AD+1
55131 '    #BFE3 CV Nombre de Chiffres Vus et par suite CV$=STR$(CV)
55140 CE=PEEK(AD):AD=AD+1:CP=PEEK(AD):AD=AD+1
55141 '    #BFE4 CE Couleur Encre de la zone Hires 
55142 '    #BFE5 CP Couleur Papier de la zone Hires 
55150 CI=PEEK(AD):AD=AD+1
55151 '    #BFE6 CI calcul du score
55160 XC=PEEK(AD):AD=AD+1:YC=PEEK(AD):AD=AD+1
55161 '    #BFE7 XC Abscisse du coin HG d'une Cellule donn{e
55162 '    #BFE8 YC Ordonnee du coin HG d'une Cellule donn{e
55170 FU=PEEK(AD):AD=AD+1:LG=PEEK(AD):AD=AD+1
55171 '    #BFE9 FU	 Funct (56=pas pressée)
55172 '    #BFEA LG Langage Fran|ais si LG nul, English si LG <> 0
55180 NC=PEEK(AD):AD=AD+1:NG=PEEK(AD):AD=AD+1
55181 '    #BFEB NC Numero de la case au curseur NC=C+TG*(L-1)
55182 '    #BFEC NG Numero de grille
55190 ER=PEEK(AD):AD=AD+1
55191 '    #BFED ER Nombre d'erreurs
55200 SC=DEEK(AD):AD=AD+2
55201 '    #BFEE/#BFEF SC SCore sur deux octets
55210 TG=PEEK(AD):AD=AD+1:MESS=PEEK(AD):AD=AD+1
55211 '    #BFF0 TG Taille de Grille (4, 5 ou 6)
55212 '    #BFF1 MESS Numéro de l'ecran de message de félicitation
55220 X=PEEK(AD):AD=AD+1:Y=PEEK(AD):AD=AD+1
55221 '    #BFF2 X Abscisse du point d'affichage Hires
55222 '    #BFF3 Y Ordonn{e du point d'affichage Hires 
55230 XO=PEEK(AD):AD=AD+1:YO=PEEK(AD):AD=AD+1
55231 '    #BFF4 XO Abscisse X d'Origine coin HG de la grille
55232 '    #BFF5 YO Ordonn{e Y d'Origine coin HG de la grille
55240 XS=PEEK(AD):AD=AD+1:YS=PEEK(AD):AD=AD+1
55241 '    #BFF6 XS Abscisse coin haut gauche du Signe < , > , ^ ou v 
55242 '    #BFF7 YS Ordonnee coin haut gauche du Signe < , > , ^ ou v
55250 A0=DEEK(AD):AD=AD+2
55251 '    #BFF8/#BFF9 A0 adresse effacement de ligne (2 octets)
55260 A1=DEEK(AD):AD=AD+2
55261 '    #BFFA/#BFFB A1 adr affichage message "Grille No" (2 octets)
55270 A2=DEEK(AD):AD=AD+2
55271 '    #BFFC/#BFFD A2 adr affichage message "Vus :" (2 octets)
55280 A3=DEEK(AD)
55281 '    #BFFE/#BFFF A3 adr aff mess "Un peu de patience s.v.p..." (2 oct)
55282 'Initialisation des couleurs Papier et Encre de la zone Text 
55310 POKE#BF68,CP+#10:POKE#BF69,CE
55320 POKE#BF90,CP+#10:POKE#BF91,CE
55330 POKE#BFB8,CP+#10:POKE#BFB9,CE
55340 GOSUB 60660
55341 'Recharge les 6 caract}res ;<=>?@ (de Ascii 59 @ 64) du jeu 0
55350 GOSUB 12000
55351 'S/P Efface ligne puis affiche le No de la grille
55360 GOSUB 13000
55361 'S/P Affichage  du nombre de chiffres vus
55370 GOTO 31000
55371 'Suite @ la boucle de saisie de touche
55372 '
55373 '-------------------------------------------------
55364 'S/P Initialisation
60000 ACCENT SET:HIRES:FOTITRE.HRS:GET R$
60001 'N{cessaire car caract}res accentu}s dans {cran-titre
60010 PRINT:PRINT"      Fran\ais/English (F/E) ?";:GET R$:PRINT R$;
60020 IF R$="F" THEN LG=0:POKE#BFEA,LG:GOTO 60050
60030 IF R$="E" THEN LG=1:POKE#BFEA,LG:GOTO 60080
60040 CLS:GOTO 60010
60050 TEXT:LOAD"FOAID1.SCR":GET R$
60060 LOAD"FOAID2.SCR":GET R$
60070 LOAD"FOAID3.SCR":GET R$:GOTO 60110
60080 TEXT:LOAD"FOHLP1.SCR":GET R$
60090 LOAD"FOHLP2.SCR":GET R$
60100 LOAD"FOHLP3.SCR":GET R$
60110 CLS
60111 '
60112 'Initialisation des chaines de caract}res en fonction de la langue
60120 IF LG<>0 THEN 60240 ELSE ACCENT SET
60130 N1$="Votre nom S.V.P.":N2$="Voulez-vous reprendre une"
60140 N3$="partie d{j@ enregistr{e (O/N)? "
60150 N4$="    Sinon, choisissez un niveau     "
60160 N5$="           de difficult{:           "
60170 N6$="- Fastoche":N7$="- Faisable":N8$="- Fortiche":N9$="ou"
60180 O1$="- Num{ro de la grille":O2$="N de":O3$="@":O4$="  Grille No"
60190 O5$="Vus:":O6$="Un peu de patience, s.v.p..."
60200 O7$="Bravo ":O8$="la grille No":O9$="la derni}re grille"
60210 P1$=" points.":P2$="Vous avez  r{solu":P3$="Erreurs:"
60220 P4$="Votre score est de":P5$="7 caract{res maxi SVP!              "
60230 GOTO 60340
60240 N1$="Your name, please":N2$="Do you want to resume a game"
60250 N3$="   already recorded (Y/N)? "
60260 N4$="         Otherwise, choose          "
60270 N5$="         a difficulty level         "
60280 N6$="- Easy":N7$="- Harder":N8$="- Expert":N9$="or"
60290 O1$="- Grid number":O2$="N from":O3$="to":O4$="  Grid #"
60300 O5$="Seen:":O6$="A little patience, please..."
60310 O7$="Well done ":O8$="the Grid #":O9$=" the last grid! "
60320 P1$=" points.":P2$="You have solved":P3$="Errors:"
60330 P4$="Your score is":P5$="7 characters max please!            "
60331 '
60332 'Autres initialisations
60333 'Info: Num{ro de la Grille Finale = 64 
60334 'Info: Largeur case = 23, Hauteur case = 21 pixels
60335 'Info: Nombre Max de caract}res affichables dans largeur du cadre = 20
60336 'Initialisation du score, Bruitage actif
60340 SC=0:BR=1
60341 '
60342 'Par d{faut la touche FUNCT n'a pas été press{e 
60350 FU=56
60351 '
60352 'Encre noire sur fond cyan pour l'{cran Text de configuration
60360 CLS:PAPER 6:INK 0:POKE#BB80,#16:POKE#BB81,#06
60361 '
60362 'Effacement de la Ligne service
60370 FOR K=#BB82 TO #BBA7:POKE K,#20:NEXT
60371 '
60372 'Demande N1$ "Votre nom S.V.P.?" et stockage en Ram
60380 PRINT@2,10;N1$;:INPUT N$:LS=LEN(N$):IF LS<8 THEN 60410
60390 PRINT@2,10;P5$:WAIT 100:
60400 PRINT@2,10;"                                    ":GOTO 60380
60410 CLS:PRINT@INT((39-LS)/2),5;N$
60411 'Stockage de N$ en Ram de #9CF0 @ #9CFF (16 octets maxi) 
60450 M1$=LEFT$(N$+"               ",16)
60460 FOR K=1 TO 16:POKE#9CEF+K,ASC(MID$(M1$,K,1)):NEXT
60461 '
60462 'Demande si reprise d'une ancienne partie déjà enregistr}e
60463 'N2$="Voulez-vous reprendre une"
60464 'N3$="partie d{j@ enregistr{e (O/N)?" 
60470 PRINT@6,6;N2$:PRINT@3,7;N3$;:GET R$:PRINT R$ 
60480 IF R$="N" THEN 60500
60490 IF R$="O" OR R$="Y" THEN 55000 ELSE 60470
60491 ' Charge ancienne partie sauvegard{e 
60492 '
60493 'Choix d'un niveau de difficult{
60500 PRINT@2,9;N4$:PRINT N5$:PRINT
60501 'N4$="Sinon, choisissez un niveau"
60502 'N5$= "de difficult{"
60510 PRINT@12,12;CHR$(129);"1";CHR$(128);N6$
60520 PRINT@12,13;CHR$(129);"2";CHR$(128);N7$
60530 PRINT@12,14;CHR$(129);"3";CHR$(128);N8$
60540 PRINT@13,16;N9$
60541 'N6$="- Fastoche" N7$="- Faisable" N8$="- Fortiche" N9$="ou"
60550 PRINT@12,18;CHR$(129);"N";CHR$(128);O1$
60551 'O1$="- Num{ro de la grille"
60560 PRINT@13,20;"?";:GET R$:PRINT CHR$(8) R$
60570 IF R$="1" THEN NG=1:GOTO 60640
60580 IF R$="2" THEN NG=17:GOTO 60640
60590 IF R$="3" THEN NG=49:GOTO 60640
60600 IF R$<>"N" THEN 60560
60610 M$=O2$+CHR$(129)+"1"+CHR$(128)+O3$+CHR$(129)+"64"+CHR$(128)
60611 'O2$="N de", O3$="@", 64 Num{ro de la Grille Finale 
60620 PRINT@13,20;M$;:INPUT NG
60630 IF NG<1 OR NG>64 THEN 60620
60631 '64 = Num{ro de la Grille Finale 
60640 NG=NG-1
60641 'Pour raccorder avec l'incr{mentation de la routine Grille suivante
60642 '
60643 'Mise en place des polices de caract}res
60650 HIRES:LOAD"FOJ1.CHS",A#9D00
60651 'Les 50 caract}res du d{but du jeu 1 (equiv esp @ Q de Ascii 32 @ 81) 
60652 'ont {t{ red{finis en mode TEXT de #B900 @ #BA8F puis recharg{s ici
60653 'en mode HIRES de #9D00 @ #9E8F
60660 LOAD"FOJ0.CHS",A#99D8
60661 'Les 6 caract}res ;<=>?@ (de Ascii 59 @ 64) du jeu 0, situ{s de #B5D8 
60662 '@ #B607 en mode TEXT sont recharg{s ici en HIRES de #99D8 @ #9A07
60663 'Il s'agit des chiffres 1 @ 6 plus petits en hauteur
60670 RETURN
