Le Trident de Neptune

Par Dominique Pessan.


Bonjour!

je vous propose aujourd'hui, de réaliser le transfert de cassette à disquette du jeu "Le trident de Neptune".

Comme les choses seraient simples, sans cette maudite page quatre ( n'est-ce pas Mr Spock ? ). Dans le cas du jeu "Orion" de Loriciels, que nous avons transféré la fois précédente, la page quatre n'était utilisée que pour les protections et pour charger les autres modules du jeu. La solution la plus simple était donc de la supprimer purement et simplement. Ici la page quatre est utilisée en cours de jeu, donc pas question de la supprimer. La solution que j'ai choisie, est de la charger en page cinq, puis de la transférer à sa place définitive juste avant de lancer le jeu.

Faisons tout d'abord l'état des lieux. Le jeu est composé de six modules dont les adresses sont les suivantes:

 

1 - # 281 à # 2BF à supprimer .
2 - # F3D à # 4362 Contient le programme BASIC et la présentation
3 - # 61A5 à # 70E4 Module L.M
4 - # 752D à # 7A58 Module L.M
5 - # 7CFD à # 9344 Module L.M
6 - # 0406 à # 049C Module L.M



2 - Appuyez sur la touche PLAY de votre magnétophone
3 - Quand le premier module est chargé, appuyez sur la touche STOP du magnétophone.
4 - Rebootez l'ORIC
5 - Chargez l'utilitaire STOP LOAD"STOP"
6 - Tapez CLOAD"

7 - Appuyez sur la touche PLAY de votre magnétophone
8 - Tapez successivement 3 fois CLOAD" pour charger les 3 modules suivants ( Ne chargez pas le dernier )

 

Traitement du deuxième module: ( #F3D / # 4362 )

1 - POKE #140A,#10 : CALL # 13DF :
POKE # 140A, #1A
2 - DOKE # 64, #14A8
3 - CALL # 144F

Tapez PRINT HEX$( PEEK(#141F )) , vous devez obtenir #D8, si vous obtenez autre chose, c'est que vous vous êtes trompé, il ne vous reste qu'a recommencer . ( Depuis le début. )

4 - POKE # 1428,#10 : CALL #1419 : POKE # 1428, #1A

 

Traitement du troisième module: ( #61A5/ #70E4 )

1 - POKE #140A,#10 : CALL # 13DF :
POKE # 140A, #1A
2 - DOKE #1494, #61A8
3 - DOKE #64, #61A8
4 - CALL #142A
5 - CALL #144F

Tapez PRINT HEX$( PEEK(#141F )) , vous devez obtenir # 86, si vous obtenez autre chose, c'est que vous vous êtes trompé, il ne vous reste qu'a recommencer . ( Depuis le début.)

6 - POKE # 1428,#10 : CALL #1419 :
POKE # 1428, #1A
7 - CALL #1392
8 - POKE # 6D12, #10

Traitement du quatrième module:(#752D / #7A58 )

1 -POKE #140A,#10 : CALL # 13DF :
POKE # 140A, #1A
2 - POKE #13B1,#60:CALL#13A1:POKE#13B1,#20
3 - DOKE#64, #7530
4 - CALL #144F

Tapez PRINT HEX$( PEEK(#141F )) , vous devez obtenir # E2, si vous obtenez autre chose, c'est que vous vous êtes trompé, il ne vous reste qu'a recommencer . ( Depuis le début .)

5 - POKE # 1428,#10 : CALL #1419 :
POKE # 1428, #1A
6 - CALL #13B4

Traitement du 5ème module:( #7CFD / # 9344 )

1 - POKE #140A,#10 : CALL # 13DF :
POKE # 140A, #1A
2 - POKE #13DB,#60:CALL#13C2:
POKE#13DB,#20
3 - DOKE # 64, # 7D00
4 - CALL # 144F

Tapez PRINT HEX$( PEEK(#141F )) , vous devez obtenir # 9A, si vous obtenez autre chose, c'est que vous vous êtes trompé, il ne vous reste qu'a recommencer . ( Depuis le début.)

5 - POKE # 1428,#10 : CALL #1419 :
POKE # 1428, #1A

Entrez maintenant la routine de transfert de la page quatre. Elle sera implantée en #600.

Pour ceux qui ont un moniteur assembleur, voici le code désassemblé.

0600   A9 00       LDA #$00 P. basse adresses
0602   85 0C       STA $0C Départ
0604   85 0E       STA $0E Arrivée
0606   85 11       STA $11 Partie haute longueur
0608   A9 05       LDA #$05 Partie H Départ
060A   85 0D       STA $0D  dans $0D
060C   A9 04       LDA #$04 Partie H Arrivée
060E   85 0F       STA $0F  dans $0F
0610   A9 FF       LDA #$FF Partie basse longueur
0612   85 10       STA $10  dans $10
0614   20 C4 ED    JSR $EDC4Appel MOVE
0617   60          RTS      Fin du transfert

Cette Partie réalise la mise à jour de TXTTAB (Début programme BASIC ) et effectue un RUN.


0618  A9 A9    LDA #$A9   Début BASIC en
061A  85 9A    STA $9A    $14A9
061C  A9 14    LDA #$14
061E  85 9B    STA $9B
0620  A0 00    LDY #$00   Implante code:RUN 00
0622  B9 2E 06 LDA $062E,Y
0625  91 E9    STA ($E9),Yà l'emplacement pointé 
0627  C8       INY        par TXTPTR
0628  C9 00    CMP #$00
062A  D0 F6    BNE $0622
062C  60       RTS 
062D  EA       NOP

062E   3A Code ASCII de  : 
062F      98 Token de RUN
0630      00 0 fin de commande.

Pour ceux qui préfèrent le BASIC, voici un chargeur qui implantera le code en mémoire.

SAVE"NEPT",A#700,E#9344

Rebootez l'Oric

Entrez le court listing suivant

10 DATA A9,00,85,0C,85,0E,85,11,A9,05,85,0D
20 DATA A9,04,85,0F,A9,FF,85,10,20,C4,ED,60
30 DATA A9,A9,85,9A,A9,14,85,9B,A0,00,B9,2E
40 DATA 06,91,E9,C8,C9,00,D0,F6,60,EA,3A,98
50 DATA 00
60 FOR I=0 TO 48: READ A$: A=VAL( "#"+A$)
70 POKE #600+I, A: NEXT

Lancez le par RUN.puis Tapez NEPT


Nous allons maintenant sauvegarder cette première partie de notre travail sur une disquette par:

SAVE"NEPT2",A #600,E #9344.

Traitement du sixième module: ( # 406 / # 49C )

1 - Rebooter l'Oric
2 - CLOAD"STOP
3 - CLOAD"NEPTUNE
4 - CLOAD"":CLOAD"":CLOAD""
5 - CALL #E76A:CALL#E4AC:DOKE#2AB,#59C:DOKE#2A9,#506:CALL#E4E0:CALL#E93D
6 - NEPT2
7 - POKE #1465, # 05
8 - POKE#1469,#60:CALL#145F:POKE#1469,#20
9 - POKE# 1465,#04
10 - DOKE #64, #509
11 - CALL #144F

Tapez PRINT HEX$( PEEK(#141F )) , vous devez obtenir # 0A, si vous obtenez autre chose, c'est que vous vous êtes trompé, il ne vous reste qu'a recommencer . ( Uniquement cette partie.)

12 - POKE # 1428,#10 : CALL #1419 : POKE # 1428, #1A
13 - POKE #140A,#10 : CALL # 13DF : POKE # 140A, #1A:POKE #14C9, #31
14 - DOKE #9C, # 435B

15 - EDIT 1 ( 1 HIMEM 24500: ACCENT OFF: QUIT : CALL # 600 )
16 - SAVE"NEPTUNE", A #500, E # 9344, T # 618


En principe, c'est terminé, vous pouvez vérifier en rebootant votre Oric et en entrant tout simplement NEPTUNE ...

Vous constaterez au passage que toutes les protections ont disparu ( bien que cela n'aie pas été la but de la manoeuvre). Vous pouvez arrêter le jeu par un simple RESET et reprendre en tapant GOTO 3.


-"D'accord, mais j'aimerais bien comprendre!"


Qu'a-t'on fait exactement ?

Chaque module était sauvegardé en mode AUTO sur la cassette et réalisait "en gros" les opérations suivantes

 

1 - JSR $13DF : mise a jour pointeurs BASIC

2 - Mise à jour d'une adresse en $64/$65

3 -JSR$144F :Calcul d'une somme de contrôle entre $1356 et $1356+$F6, or dans cette zone se trouvent deux protections :

1407 LDA#$01

1409 STA$ 1A et

1425 LDA#$01

1427 STA $ 1A

Ces protections devant, bien sûr être présentes lors du calcul de la somme de contrôle, mais absentes lors des autres opérations, sous peine de blocage du système. D'où une certaine "jonglerie" sur les cases mémoire $140A et $1428.

4 - Addition de cette somme de contrôle en $141F,puis, à l'adresse $1419, addition du contenu de $141F aux $F6 premiers octets à partir de l'adresse contenue dans $64/$65 ( D'ou le PEEK$141F et le DOKE $64 à chaque étape. )

 

Plus diverses petites choses comme par exemple:

1471 LDA #$31

1473 STA $14C9

qui modifie le listing BASIC de 3 GOTO 37000 en 3 GOTO 17000... Allez faire un tour 37000 pour voir : - )

 

Pour le point 5 du sixième module, j'ai trouvé l'astuce de chargement d'un programme à une adresse choisie, dans le MAG N° 29 de septembre 1992. ( Achetez la collection complète si vous ne l'avez pas, c'est une mine d'or ! )

 

Le transfert de la page 5 vers la page 4 utilise la routine MOVE comme préconisé dans le manuel de l'Oric d'André Chenière.


La prochaine fois


J'ai tenté le transfert du "Diamant de l'île maudite"

C'est un cas différent des deux que nous venons d'aborder .Dans ce jeu, si la page 4 est utilisée pendant la partie, il n'est pas question de la laisser à sa place originelle, car on doit pouvoir a tout moment sauvegarder une partie sur disquette, la page quatre doit donc être disponible pour le DOS.

Mais c'est une autre histoire... A bientôt ....


La suite !!!! vite !!!!