Le Diamant de l'île maudite...

Par Dominique Pessan.

 


Comme promis la dernière fois, nous allons essayer de transférer le Diamant de l'île Maudite sur disquette. Ce jeu est composé de quatre parties principales, qui sont : La présentation, la première partie du jeu , la deuxième partie du jeu et la fin du jeu. Chaque partie, est à son tour composée d'un nombre variable de modules.

 


 

Démo

Première partie

Deuxième partie

Fin du jeu

1 - #281 à #2CB

1 - #281 à #2CB

1 - #501 à #4EE5

1 - #501 à #7D0

2 - #B800 à #BFE0

2 - #B800 à #BFE0

2 - #400 à #4FF

2 - #9DEE à #B888

3 - #501 à #8AD

 3 - #501 à #56F

3 - #554B à #9FF4

 

4 - #8E5 à #2C04

4 - #6A2 à #B0B

 

 

5 - #501 à #297D

5 - #501 à #78BF

 

 

6 - #2AF8 à #6B80

6 - #400 à #4FF

 

 

7 - #400 à #4FF

7- #7FBB à #9FF4

 

 

 

La page quatre devant rester disponible pour le DOS ( Sauvegarde d'une partie en cours ) , nous allons implanter les modules l'utilisant ( 7, 6 et 2 ) ailleurs en mémoire. Il faudra alors, dérouter tout appel à une adresse de cette page vers son nouvel emplacement et ce, dans le BASIC comme dans les modules en L.M. A la vue des adresses des modules de chacune des parties, on se rend compte que pour la Démo, on peut choisir facilement une page libre ( entre $6C00 et $ B700). Par contre, pour les première et deuxième parties du jeu, Il faudra chercher...Car si les adresses entre $7900 et $7EFF et celles entre $4F00 et $5400 semlent libres, se sont de fausses amies, utilisées par le programme, pour les variables. La fin du jeu n'utilise pas la page quatre et semble facile à transférer... Eh bien, j'ai du réfléchir un

bon moment avant de comprendre, car après le chargement du deuxième module ($9DEE-$B888 ), il était impossible de sauvegarder .J'obtenais systématiquement le message: "OUT OF MEMORY ERROR. En fait, c'est un module en L.M sauvegardé comme un programme BASIC, mais les pointeurs BASIC n'étant pas mis à jour...
J'ai donc modifié l'utilitaire Stop de manière à ce qu'il force aussi à 1 la case mémoire $2AE, indiquant à l'interpréteur qu'il ne s'agit pas d'un programme BASIC. (Un peu plus tard, je me suis rendu compte qu'un simple NEW après le chargement du module en question, avait le même effet :-)))
Pour les modifications, les points de suspension dans les lignes BASIC signifient que le reste de la ligne est inchangé.

Voici le nouveau listing de STOP:

10 FORI=#221TO#22F
20 READA:POKEI,A:NEXT
30 DOKE#245,#221
40 DATA#48,#A9,0,#8D,#AD,#02,#A9,1,#8D,#AE,#02, #68,#4C,#22,#EE
50 NEW

Et celui de la Moulinette à changer les adresses

5 N=#74
10 FORI=#7400TO#74FF
20 IFPEEK(I)=#04THEN F=1:A=PEEK(I-2)
30 IFF=1ANDA=#AETHENPOKEI,N:F=0 :'LDX$
40 IFF=1ANDA=#8ETHENPOKEI,N:F=0 :'STX$
50 IFF=1ANDA=#ADTHENPOKEI,N:F=0 :'LDA$
60 IFF=1ANDA=#8DTHENPOKEI,N:F=0 :'STA$
70 IFF=1ANDA=#6DTHENPOKEI,N:F=0 :'ADC$
80 IFF=1ANDA=#CDTHENPOKEI,N:F=0 :'CMP$

90 IFF=1ANDA=#ACTHENPOKEI,N:F=0 :'LDY$
100 IFF=1ANDA=#8CTHENPOKEI,N:F=0 :'STY$
110 IFF=1ANDA=#CCTHENPOKEI,N:F=0 :'CPY$
120 IFF=1ANDA=#EETHENPOKEI,N:F=0 :'INC$
130 IFF=1ANDA=#4CTHENPOKEI,N:F=0 :'JMP$
140 IFF=1ANDA=#ECTHENPOKEI,N:F=0 :'CPX$
150 IFF=1ANDA=#EDTHENPOKEI,N:F=0 :'SBC$
160 IFF=1ANDA=#CETHENPOKEI,N:F=0 :'DEC$
170 IFF=1ANDA=#B9THENPOKEI,N:F=0 :'LDA$,Y
180 IFF=1ANDA=#20THENPOKEI,N:F=0 :'JSR$
190 F=0
200 NEXT

Pour accélérer l'exécution ( qui est très très lente ), ne tapez pas les REM. Toutes les instructions de l'assembleur 6502 n'y sont pas, mais seulement celles nécessaires et suffisantes pour le cas qui nous intéresse. A vous de la compléter pour d'autres applications ,si vous le souhaitez : - ).Enregistrez ces deux listings en AUTO sur la disquette.

Traitement de la Démo.

1 - Introduisez votre cassette du jeu dans le magnéto
2 - LOAD"STOP
3 - CLOAD"
4 - SAVE"DDEMO1",A#281,E#2CF
5 - CLOAD"":SAVE"DDEMO2",A#B800,E#BFE0
6 - CLS:CLOAD"
7 - EDIT 0 ( 0 DOKE#10,0 )
8 - EDIT 8 ( 8 POKE#8E9,1: DDEMO4 )
9 - EDIT10 ( 10 DOKE #9C,2228:.......)
10-EDIT 150 ( 150 DDEMO5 )
11-SAVE"DDEMO3",AUTO
12-CLOAD"
13-MOULINET
14-EDIT5 ( 5 N=#74 )
15-EDIT 10 ( 10 FORI=#8E5 TO #2C04 )
16-RUN

17- Allez boire un café, ça va durer un certain temps...

18-SAVE"DDEMO4",A#8E5,E#2C04

19-CLOAD"
20-Dans les lignes suivantes, remplacer toutes les adresses #4xx par #74xx. Utilisez EDIT.
21- EDIT 4,15,670,(ligne trop longue, créez 671 pour le dernier POKE),675,680,720,730,910,1000, 1010
22- EDIT 832 ( 832 A$="ADAPTATION D.PESSAN 1997 )
23- EDIT 835 ( 835 CLS:?CHR$(27);"DPour jouer, tapez < ESC>"
24- 836 <RTRN> ( Supprimez 836 )
25- EDIT 850 ( 850 RESET )
26- EDIT 5 ( 5 DDEMO6:DDEMO7: Z1=#E93D:Z2=#E76A )
27- SAVE"DDEMO5",AUTO
28- CLOAD"
29-MOULINET:EDIT10 (10FORI=#3A98 TO #3AFB )
30- RUN
31-SAVE"DDEMO6",A#2AF8,E#6B80
32- CALL#E76A:CALL#E4AC:DOKE#2AB, #74FF:DOKE#2A9,#7400:CALL#E4E0: CALL#E93D
33-MOULINET:EDIT 10 (10FORI=#7400 TO 74FF )
34-RUN
35-SAVE"DDEMO7",A#7400,E#74FF
36-NEW
37-Créez un lanceur

10 DDEMO1
15POKE#26A,PEEK(#26A)AND254
20DDEMO2
25WAIT500:'Souvenir, souvenir...
30DDEMO3
40DDEMO4
50DDEMO5

38-SAVE"DEMODIAM",AUTO

C'est terminé pour la Démo, vous pouvez tester en rebootant l'Oric et en tapant DEMODIAM. Ca marche? Super, alors on continu. SYNTAX ERROR IN XYZ ? ( les chargements cassettes sont toujours ce qu'ils étaient...)

39-Appuyez sur RESET ( ATMOS, pas drive )
40-EDIT XYZ ( Corrections )
41-SAVEO"DIAMP1",AUTO

Traitement de la première partie du jeu.

1 -LOAD"STOP
2 -CLOAD"":CLOAD"":CLOAD"":CLAOD"":CLOAD""
3 -EDIT 0 ( 1 DOKE#10,0:DOKE156,30806:HIMEM 32495:GOSUB 8499:GOSUB13000
4 - Créer 0 DIAM12:DIAM13
5 - EDIT 5444 ( 5444 D = 22560: .....)
6 - 5446 <RETURN> ( supprimer la ligne)
7 - EDIT 5447 ( 5447 PRINT"Pressez une touche.":GETA$:CLS:PRINT"Sauvegarde en cours...)
8 - EDIT5449 (5449SAVEO"DIAMANT1",A40957,E41011:..
9 - 8080 <RETURN > ( Supprimez la ligne )
10-EDIT 8090 ( 8090 PRINT"Patientez s.v.p, chargement de la 2e partie."
11-EDIT8095 ( 8095 DIAMP2:REM )
12-EDIT 8540 ( 8540 PRINT"Sauvé une partie durant la 2e"
13-EDIT 8570 ( 8570 NEXT:CLS:PRINT:PRINT"Chargement de la 2e partie.")
14-Créer 8575 POKE 40949,9:DIAMANT2:DIAMP2
15-EDIT 8710 ( 8710 CALLZ1:TXT:PRINT"Chargement en cours.":REM"Votre sauvegarde.")
16-EDIT8720 ( 8720 POKE40449,9:DIAMANT1 )
17-EDIT 8810 ( 8810 D= 28510:.....)
18-10099 <RETURN> ( Supprimer la ligne )
19-Changer les adresses #04xx en #7Fxx dans les lignes suivantes: 12501, 12502
20- SAVE"DIAMP1",AUTO
21-CALL#E76A:CALL#E4AC:DOKE#2AB,#7FFF: DOKE#2A9,#7F00:CALL#E4E0:CALL#E93D
22-MOULINET
23-EDIT 5 ( 5 N=#7F)
24-EDIT10 (10 FORI= #7F00 TO #7FBB )
25-RUN
26-SAVE"DIAM13",A#7F00,E#7FBA
27-CLOAD""
28-EDIT10 ( 10 FORI= # 7FBB TO #9FF4 )
29-RUN

30- Un autre petit café ?

31-SAVE"DIAM12",A #7FBB,E#9FF4

C'est terminé, vous pouvez essayer en tapant DIAMP1. ( RESET, si erreur de syntaxe)

La place disponible en mémoire était vraiment très limitée, car en déplaçant le HIMEM de quelques octets seulement vers le bas, on obtient un OUT OF MEMORY ERROR en cours de jeu. ( pas assez de place pour les variables). C'est pourquoi la page quatre n'a pas été conservée dans son intégralité. Je n'ai pas constaté de dysfonctionnement majeur dû à cette amputation ( de $4BB à $4FF ). Bon, il y a bien la ligne 7535 qui scrute la mémoire entre $4F2 et $ 4FF, soit 14 octets, et qui en fonction du résultat du test, vous fait marcher sur un scorpion ou non...( je crois). Tel que le jeu est là, plus de scorpion! Les puristes pourront toujours essayer de caser ces 14 octets ailleurs, et devront modifier cette ligne en conséquence.

 

Traitement de la deuxième partie du jeu

1 - LOAD"STOP
2 - CLOAD"
3 - EDIT 0 ( 0 DIAM22:DIAM21:DOKE#10,#0:IF PEEK(22790)<>10 THEN DIAM22 ELSE...)
4 - EDIT 1 ( 1 HIMEM #5546:M=2:......)
5 - Modifiez en utilisant EDIT dans toutes les lignes suivantes, les adresses de page 4 en adresses de page $64.

Lignes Adresses P 4 Adresses P $64
220 1034 et #4D3 #640A,#64D3
225 #4D3 #64D3
240 #4E8 #64E8
750 1104, 1104 #6450,#6450
770 #47A #647A
773 #4D3 #64D3
2670 1092,1092,1092 #6444,#6444,#6444
8500 #47A #647A
8510 #4E8,#4D3,#47A #64E8,#64D3,#647A
8520 #4E8,#47A #64E8,#647A
8830 1218,#4E8,#4D3 #64C2,#64E8,#64D3
9104 #1224,1230 #64C8,#64CE
10001 1146 #647A
12400 1224,1230 #64C8,#64CE
12420 1224,1230 #64C8,#64CE
13500 1109 #6455
13501 #4E8,1224,1224 #64E8,#64C8,#64C8
13505 1223,1223, #64C7,#64C7
1229,1229, #64CD,#64CD
1109,1109 #6455,#6455
13510 1230,1230 #64CE,#64CE
13515 1223,1229,1109,#4D3 #64C7,#64CD,#6455, #64D3

6 - EDIT 5310 ( 5310 REM.........)
7 - EDIT 5312 ( 5312 REM.....
8 - Créer 5315 PRINTCHR$(17):DIAMFIN
9 - Créer 9500 CAVERNE:RETURN
10-EDIT 9602 ( 9602 POKE618,2:DOKE#2F5,22508:CLS: PRINT:REMNTCHR$(......
11-EDIT 9606 ( 9606 CALL#E93D )
12-EDIT 10095 ( 10095 REM" "CHR$(....
13-EDIT10100 (10100 IFA$=CHR$(27) THEN TEXT:START2:POKE40949,9:RUN1 )
14-EDIT13000 (13000 GOSUB 20000:NR=9500)
15-EDIT14000 (14000 POKE40949,9:CALL#F8B8:PAPER0: INK7:TEXT
16-Créer 14005 PRINT"Chargement en cours. " ( 10 espaces à la fin )
17-EDIT 14010 (14010 DIAMANT2:RUN )
18-EDIT 15005 ( 15005 PRINT"Pressez une touche.":REMPréparez le magneto avec une cassette vierge
19-EDIT 15006 ( 15006 GETA$:CLS )
20-EDIT 15007 (SAVEO"DIAMANT2",A40957,E41121: HIRES:HIRES.....)

21- EDIT 20000 ( 20000 A=DEEK(156) -21 )
22- Modifiez en utilisant EDIT dans toutes les lignes suivantes, CALL NR par GOSUB NR.

800,821,830,1160,8520,8830,8835

23-SAVE"DIAMP2",AUTO
24-CALL#E76A:CALL#E4AC:DOKE#2AB,#44FF: DOKE#2A9,#4400:CALL#E4E0:CALL#E93C
25-SAVE"PROV",A#4400,E#44FF
26-MOULINET
27-EDIT 5 ( 5 N=#44 )
28-EDIT 10 ( 10 FORI=#4000 TO # 44FF )
29-RUN
30-CLOAD"":NEW
31-SAVE"PROV22",A#5547,E#9FF4
32-MOULINET
33-EDIT 5 ( 5 N=#44 )
34-EDIT 10 ( 10 FORI=#5843 TO #58B5 )
35-RUN
36-HIRES:CALL#5843:SAVE#CAVERNE",A#A002,E#B9F2
37-TEXT
38-LOAD"PROV22"
39-EDIT 5 ( 5 N=#64 )
40-EDIT 10 ( 10 FORI=#554B TO #58B5 )
41-RUN
42-EDIT 10 ( 10 FORI=#9F8D TO #9FF4 )
43-RUN
44-SAVE"DIAM22",A#5547,E#9FF4
45-LOAD"PROV",A#6400
46-EDIT 10 ( 10 FORI=#6400 TO #64FF )
47-RUN
48-SAVE"DIAM21",A#6400,E#64FF

Création de Start2

Il s'agit d'un fichier de sauvegarde "spécial" qui vous permettra de démarrer directement au début de la deuxième partie du jeu si vous le souhaitez. Voici le listing qui vous permettra de le générer.

10 A=#9FFD:F=#A0A1:L=100:REPEAT:FOR A=A TO A+15:READ C$
20 K=VAL("#"+C$):S=S+K+65536*(S+K>65535):IF A<=F THEN POKE A,K
30 NEXT:READ D$:IF S=VAL("#"+D$) THEN L=L+5:UNTIL A>F:END
40 PING:PRINT"Erreur ligne";L
50 SAVE"START2",A#9FFD,#A0A1
100 DATA 4C,BD,C9,00,00,00,00,00,00,00,00,00,08,00,00, 0D,01E7
105 DATA 00,00,00,00,00,00,0F,00,49,01,2C,26,00,00,00, 00,0292
110 DATA 00,00,00,21,00,1F,00,00,0E,00,00,00,12,00,0C, 00,02FE
115 DATA 16,00,10,00,1A,00,14,00,1E,00,18,05,00,00,1C, 25,03CE
120 DATA 00,07,00,00,00,23,00,00,00,00,00,00,32,53,00, 00,047D
125 DATA 3A,00,30,00,3A,00,00,00,00,00,34,00,4A,00,00, 00,059F
130 DATA 46,00,4C,00,00,00,44,00,42,00,40,00,00,00,00, 2D,0724
135 DATA 56,00,00,00,56,00,54,00,00,00,00,3D,00,00,5C, 51,090E
140 DATA 00,00,00,55,55,55,55,55,55,4B,40,40,40,40,40, 40,0CD7
145 DATA 00,00,00,00,00,00,00,00,00,00,00,00,00,00,02, 01,0CDA
150 DATA0A,01,00,00,02,00,00,00,00,00,00,00,00,00,00, 00,0CE7

Sauvegardez ce listing, puis lancez le, il va générer automatiquement le fichier START2.COM.

 

Traitement de la fin du jeu

1 - LOAD"STOP
2 - CLOAD"
3 - EDIT 0 ( 0 CLEAR )
4 - 1 <RETURN> ( Supprimez la ligne )
5 - EDIT 2 ( 2 HIRES: POKE#26A,PEEK(#26A)AND 254: DIAMFIN.HRS )
6 - EDIT 330 ( 330 PRINTCHR$(27);"L";CHR$(27);"D Appuyez sur une touche." )
7 - 331 GETA$:RESET
8 - SAVE"DIAMFIN",AUTO
9 - HIRES:CLOAD"
10- NEW
11- SAVE"DIAMFIN.HRS",A#9CEE,E#B888

Relions les différents morceaux.

Maintenant, créons un menu général, d'où nous pourrons lancer, à volonté, l'une des quatres parties du jeu. Ce menu est composé d'un très court listing en BASIC et d'une image écran que vous générerez, pourquoi pas, à l'aide d' ECRAN, en vous inspirant, si vous le souhaitez, de la copie d'écran présentée ci contre.

Listing de MENU.COM

0 POKE#26A,PEEK(#26A)AND254
5 POKE#BBA3,0
10 DIAM.SCR
20 GETA$:A=VAL(A$)
30 IFA<0ORA>4THEN20
40 IFA=0THEN DEMODIAM
50 IFA=1THEN DIAMP1
60 IFA=2THENPOKE40949,9:START2:DIAMP2
70 IFA=3THEN DIAMFIN
80 CLS

Sauvez ce listing par: SAVE"MENU",AUTO

 

 

Il vous reste à sauvegarder votre écran sous le nom DIAM.SCR.

Lancez la deuxième partie, faites la chasse au SYNTAX ERROR puis sauvegardez après modifications. ( SAVEO"DIAMP2",AUTO )

 

Faites le ménage

1 - DEL"PROV.COM
2 - DEL"PRO22.COM

Eh bien jouez maintenant !

-"Que faisiez vous au temps des cassettes ?"
-"Vous chargiez ? J'en suis fort aise !"
-"Eh bien jouez maintenant !"

A Bientôt...


Les articles du mois