Index du Forum
IDENTIFICATION SERVEUR : 51.77.218.217 - CLIENT : 3.233.215.231

 FAQFAQ   RechercherRechercher   Liste des MembresListe des Membres   Groupes d'utilisateursGroupes d'utilisateurs   S'enregistrerS'enregistrer 
 ProfilProfil   Se connecter pour vérifier ses messages privésSe connecter pour vérifier ses messages privés   ConnexionConnexion 

Karateka (Broderbund, 1984) - Alt. approach (& BONUS !)
Aller à la page 1, 2  Suivante
 
Poster un nouveau sujet   Répondre au sujet     Index du Forum -> PROTECTION MALEFIQUE
Voir le sujet précédent :: Voir le sujet suivant  
Auteur Message
blk



Inscrit le: 05 Sep 2007
Messages: 114
Localisation: Zimbabwé

MessagePosté le: Jeu 21 Juil 2011, 12:54    Sujet du message: Karateka (Broderbund, 1984) - Alt. approach (& BONUS !) Répondre en citant

yeah !
Voilà, j'ai dit mon mot anglais, le reste sera en français Very Happy
\o/

Alors, karateka, c'est super... et pas seulement le jeu. La protection aussi.
Voici un aperçu de cette protection et de la procédure (en cours) de déplombage...
C'est pas fini, et j'ai pas trop de temps, mais je veux le terminer un jour ^^

Boot 0 de karateka (classique)
Code:

]CALL-151

*9600<C600.C6FFM
*96F8:0

*801L

---------------------------------------------
Recopie de la page $08 dans le buffer clavier
---------------------------------------------
0801-   A2 00       LDX   #$00
0803-   BD 00 08    LDA   $0800,X
0806-   9D 00 02    STA   $0200,X
0809-   E8          INX   
080A-   D0 F7       BNE   $0803
-------------------------------------
080C-   4C 0F 02    JMP   $020F

etc...

pour l'exemple, voici la routine une fois relogée....

020F-   A0 AB       LDY   #$AB

------------- BOUCLE 1
0211-   98          TYA         <-- A = #$AB
0212-   85 3C       STA   $3C
0214-   4A          LSR         <-- A = #$55
0215-   05 3C       ORA   $3C      <-- résultat = #$FF
0217-   C9 FF       CMP   #$FF
0219-   D0 09       BNE   $0224      <-- saut si =/= #$FF
021B-   C0 D5       CPY   #$D5      <-- Y = #$AB donc =/=
021D-   F0 05       BEQ   $0224      <-- ne saute pas
021F-   8A          TXA         <-- X = 0 donc A = 0
0220-   99 00 08    STA   $0800,Y   <-- 0 dans $08AB
0223-   E8          INX   

------------- saut
0224-   C8          INY   
0225-   D0 EA       BNE   $0211      <-- BOUCLE 1

0227-   84 3D       STY   $3D
0229-   84 26       STY   $26
022B-   A9 03       LDA   #$03
022D-   85 27       STA   $27      <-- $26 + $27 = adresse de chargement = $0300
022F-   A6 2B       LDX   $2B
0231-   20 5D 02    JSR   $025D      <-- lecture secteur
0234-   20 D1 02    JSR   $02D1      <-- décodage...
0237-   4C 01 03    JMP   $0301      <======================== *** saut BOOT 1 ***

-------------------------------------
              LECTURE
-------------------------------------
025D-   18          CLC   
025E-   08          PHP   
025F-   BD 8C C0    LDA   $C08C,X
0262-   10 FB       BPL   $025F
0264-   49 D5       EOR   #$D5
0266-   D0 F7       BNE   $025F
0268-   BD 8C C0    LDA   $C08C,X
026B-   10 FB       BPL   $0268
026D-   C9 AA       CMP   #$AA
026F-   D0 F3       BNE   $0264
0271-   EA          NOP   
0272-   BD 8C C0    LDA   $C08C,X
0275-   10 FB       BPL   $0272
0277-   C9 B5       CMP   #$B5      <-- recherche D5 AA B5
0279-   F0 09       BEQ   $0284      <-- TROUVÉ !
027B-   28          PLP   
027C-   90 DF       BCC   $025D      <-- boucle forcément
027E-   49 AD       EOR   #$AD
0280-   F0 1F       BEQ   $02A1
0282-   D0 D9       BNE   $025D

------------- TROUVÉ !
0284-   A0 03       LDY   #$03
0286-   84 2A       STY   $2A
0288-   BD 8C C0    LDA   $C08C,X
028B-   10 FB       BPL   $0288
028D-   2A          ROL   
028E-   85 3C       STA   $3C
0290-   BD 8C C0    LDA   $C08C,X
0293-   10 FB       BPL   $0290
0295-   25 3C       AND   $3C
0297-   88          DEY   
0298-   D0 EE       BNE   $0288      <-- saute 3 x 2 nibbles
----------------------------------

029A-   28          PLP   
029B-   C5 3D       CMP   $3D      <-- A=0 ? (le dernier octet lu (2 nibbles) = n° secteur)
029D-   D0 BE       BNE   $025D      <-- si non
029F-   B0 BD       BCS   $025E

----------------------------------
        LECTURE SECTEUR
----------------------------------
02A1-   A0 9A       LDY   #$9A      <-- #$9A (154) nibbles sont décryptés via une table précalculée en $0800
02A3-   84 3C       STY   $3C
02A5-   BC 8C C0    LDY   $C08C,X
02A8-   10 FB       BPL   $02A5
02AA-   59 00 08    EOR   $0800,Y
02AD-   A4 3C       LDY   $3C
02AF-   88          DEY   
02B0-   99 00 08    STA   $0800,Y
02B3-   D0 EE       BNE   $02A3

02B5-   84 3C       STY   $3C
02B7-   BC 8C C0    LDY   $C08C,X
02BA-   10 FB       BPL   $02B7
02BC-   59 00 08    EOR   $0800,Y
02BF-   A4 3C       LDY   $3C
02C1-   91 26       STA   ($26),Y   <-- stocke les datas en $0300
02C3-   C8          INY   
02C4-   D0 EF       BNE   $02B5
02C6-   BC 8C C0    LDY   $C08C,X
02C9-   10 FB       BPL   $02C6
02CB-   59 00 08    EOR   $0800,Y
02CE-   D0 8D       BNE   $025D
02D0-   60          RTS         <-- retour de lecture
----------------------------

02D1-   A8          TAY   
02D2-   A2 00       LDX   #$00
02D4-   B9 00 08    LDA   $0800,Y
02D7-   4A          LSR   
02D8-   3E CC 03    ROL   $03CC,X
02DB-   4A          LSR   
02DC-   3E 99 03    ROL   $0399,X
02DF-   85 3C       STA   $3C
02E1-   B1 26       LDA   ($26),Y
02E3-   0A          ASL   
02E4-   0A          ASL   
02E5-   0A          ASL   
02E6-   05 3C       ORA   $3C
02E8-   91 26       STA   ($26),Y
02EA-   C8          INY   
02EB-   E8          INX   
02EC-   E0 33       CPX   #$33
02EE-   D0 E4       BNE   $02D4
02F0-   C6 2A       DEC   $2A
02F2-   D0 DE       BNE   $02D2
02F4-   CC 00 03    CPY   $0300
02F7-   D0 03       BNE   $02FC      <-- si different, affiche "ERR"
02F9-   60          RTS   
02FA-   00          BRK   
02FB-   00          BRK   
02FC-   4C 2D FF    JMP   $FF2D


On voit que le saut vers la phase suivante se situe à l'adresse $0237
Donc, maintenant, il faut breaker un peu plus loin avec ceci :

*96F8:A9 FF 8D 39 08 A9 59 8D 38 08 4C 01 08

96F8-   A9 FF       LDA   #$FF
96FA-   8D 39 08    STA   $0839
96FD-   A9 59       LDA   #$59
96FF-   8D 38 08    STA   $0838
9702-   4C 01 08    JMP   $0801

Une fois le reboot effectué, au lieu de sauter à l'adresse $0301, on revient en mode moniteur.
(voir Boot1)


Karateka - boot1
Code:

On voit qu'en $0301, une petit routine reloge le code en $1000 puis exécute le tout.
celle-ci :

0301-   A0 00       LDY   #$00
0303-   B9 0F 03    LDA   $030F,Y
0306-   99 00 10    STA   $1000,Y
0309-   C8          INY   
030A-   D0 F7       BNE   $0303
030C-   4C 00 10    JMP   $1000

Il suffit de la reloger manuellement et de regarder ce que ça donne...

*1000<30F.40FM

*1000LLLLLLLLLLLLL


-----------------------
BOOT1 une fois relogé :
-----------------------
1000-   A0 00       LDY   #$00
1002-   A2 20       LDX   #$20
1004-   84 3C       STY   $3C
1006-   86 3D       STX   $3D
1008-   98          TYA   
1009-   91 3C       STA   ($3C),Y   <-- vidage de $2000 à $4000
100B-   C8          INY   
100C-   D0 FB       BNE   $1009
100E-   E6 3D       INC   $3D
1010-   CA          DEX   
1011-   D0 F6       BNE   $1009

1013-   86 FF       STX   $FF      <-- $FF = 0
1015-   BC 20 10    LDY   $1020,X
1018-   99 00 C0    STA   $C000,Y   <-- astucieux moyen d'aligner $C05F $C057 $C052 $C054 $C050 $C00C $C008 $C004 $C002
101B-   F0 0D       BEQ   $102A      <-- puis de continuer (SUITE)
101D-   E8          INX   
101E-   D0 F5       BNE   $1015
1020-   5F          ???   
1021-   57          ???   
1022-   52          ???   
1023-   54          ???   
1024-   50 0C       BVC   $1032
1026-   08          PHP   
1027-   04          ???   
1028-   02          ???   
1029-   00          BRK         <-- marqueur de fin

------------- SUITE
102A-   A6 2B       LDX   $2B
102C-   A9 06       LDA   #$06
102E-   85 01       STA   $01
1030-   A0 00       LDY   #$00
1032-   A9 02       LDA   #$02
1034-   84 02       STY   $02      <-- $01+$02 = $0006 // $02+$03 = $0200
1036-   85 03       STA   $03

-------------------------------
 Recherche marqueurs : F5 D5 DA
-------------------------------
1038-   BD 8C C0    LDA   $C08C,X
103B-   10 FB       BPL   $1038
103D-   C9 F5       CMP   #$F5
103F-   D0 F7       BNE   $1038
1041-   BD 8C C0    LDA   $C08C,X
1044-   10 FB       BPL   $1041
1046-   C9 D5       CMP   #$D5
1048-   D0 F3       BNE   $103D
104A-   BD 8C C0    LDA   $C08C,X
104D-   10 FB       BPL   $104A
104F-   C9 DA       CMP   #$DA
1051-   D0 F3       BNE   $1046

--------- décodage datas 4&4
1053-   BD 8C C0    LDA   $C08C,X
1056-   10 FB       BPL   $1053
1058-   2A          ROL   
1059-   85 00       STA   $00
105B-   BD 8C C0    LDA   $C08C,X
105E-   10 FB       BPL   $105B
1060-   25 00       AND   $00
1062-   91 02       STA   ($02),Y   <-- stocké en $0200 et plus
1064-   C8          INY   
1065-   D0 EC       BNE   $1053      <-- traite 256 nibbles (128 octets)
1067-   0E FF FF    ASL   $FFFF      <-- décalage de 6 cycles
106A-   BD 8C C0    LDA   $C08C,X
106D-   10 FB       BPL   $106A
106F-   C9 FB       CMP   #$FB      <-- marqueur #$FB entre les "secteurs" de 256 nibbles   
1071-   D0 B9       BNE   $102C      <-- *****!!! boucle à l'infini si ne trouve pas la désynchro (copie) !!!*****
1073-   E6 03       INC   $03
1075-   C6 01       DEC   $01      <-- on décode 6 fois 128 octets = 3 "vrais secteurs" / de $0200 à $04FF (buff keyb +

page TXT)
1077-   D0 DA       BNE   $1053   


1079-   8E 06 03    STX   $0306      <-- sauve le slot en $306 (On interrompt ICI la routine pour récupérer la suite !!!)
107C-   8A          TXA   
107D-   4A          LSR   
107E-   4A          LSR   
107F-   4A          LSR   
1080-   4A          LSR   
1081-   09 C0       ORA   #$C0      <================ ici, on peut mettre un LDA #$60 à la place
1083-   8D 08 03    STA   $0308      <-- ...et en $0308

---------------------------------
1086-   20 DC 03    JSR   $03DC      <-- APPEL 1 - "Nettoie" la carte langage
---------------------------------
1089-   2C 83 C0    BIT   $C083      <-- switche la carte langage en RAM
108C-   2C 83 C0    BIT   $C083
108F-   A0 09       LDY   #$09
1091-   A9 03       LDA   #$03
1093-   8C FC FF    STY   $FFFC
1096-   8D FD FF    STA   $FFFD      <-- le reset sera renvoyé à $0309
1099-   2C 80 C0    BIT   $C080      <-- passe la carte langage en lecture "modifiée avec nouveau reset"
109C-   A0 0C       LDY   #$0C
109E-   A9 03       LDA   #$03
10A0-   84 36       STY   $36
10A2-   85 37       STA   $37
10A4-   84 38       STY   $38
10A6-   85 39       STA   $39      <-- $36+$37 = $030C   //    $38+$39 = $030C

10A8-   A9 02       LDA   #$02      <-- Phase $02 (donc piste $01)
10AA-   20 B2 10    JSR   $10B2      <-- déplacement bras vers piste 1
10AD-   A9 80       LDA   #$80
10AF-   4C 00 03    JMP   $0300      <================= démarre **** BOOT2 ****

--------------------------------
  *** déplacement bras ***
--------------------------------
10B2-   85 26       STA   $26      <-- $26 = piste destination
10B4-   A5 FF       LDA   $FF
10B6-   85 27       STA   $27      <-- $27 = piste actuelle
10B8-   38          SEC   
10B9-   E5 26       SBC   $26
10BB-   F0 2C       BEQ   $10E9      <-- si égal, on est arrivé à la bonne piste, RTS : fini !
10BD-   B0 04       BCS   $10C3      <-- piste en cours trop loin : AVANCE.

10BF-   E6 FF       INC   $FF      <-- PHASE +1 ?
10C1-   90 02       BCC   $10C5      <-- piste en cours pas assez loin : RECULE.

----------------- on recule
10C3-   C6 FF       DEC   $FF      <-- PHASE -1 ?

----------------- on avance
10C5-   20 DE 10    JSR   $10DE      <-- DEPLACEMENT
10C8-   20 EA 10    JSR   $10EA      <-- WAIT
10CB-   A5 27       LDA   $27      <-- piste actuelle
10CD-   29 03       AND   #$03
10CF-   0A          ASL   
10D0-   05 2B       ORA   $2B      < ajoute le SLOT à la valeur
10D2-   A8          TAY   
10D3-   B9 80 C0    LDA   $C080,Y
10D6-   20 EA 10    JSR   $10EA      <-- WAIT
10D9-   F0 D9       BEQ   $10B4      <-- continue le déplacement
10DB-   20 EA 10    JSR   $10EA      <-- WAIT

10DE-   A5 FF       LDA   $FF      <-- track en cours
10E0-   29 03       AND   #$03
10E2-   0A          ASL   
10E3-   05 2B       ORA   $2B      <-- ORA SLOT
10E5-   A8          TAY   
10E6-   B9 81 C0    LDA   $C081,Y
10E9-   60          RTS   

--------------------------------
             WAIT
--------------------------------
10EA-   A9 28       LDA   #$28
10EC-   4C A8 FC    JMP   $FCA8


10EF-   00          BRK   
10F0-   00          BRK   
10F1-   B9 B6 C6    LDA   $C6B6,Y
10F4-   B8          CLV   
10F5-   AD A0 A0    LDA   $A0A0
10F8-   A0 C1       LDY   #$C1
10FA-   B9 A0 C6    LDA   $C6A0,Y
10FD-   C6 A0       DEC   $A0
10FF-   A0 A0       LDY   #$A0

Mettre l'original dans le disque, et modifier la routine précédente pour qu'elle charge les 3 secteurs en $1200 au lieu de

$0200 car l'adresse $0200 ne permet pas une relecture du code une fois la main reprise (zone détruite car buffer clavier..)

modifs en RAM :
*1033:12                      (au lieu de 02)
*1079:4C 59 FF                (le break)
*800:A9 60 85 2B 4C 00 10     (LDA #$60 remis dans $2B (slot) puis saut en $1000)

ça charge le boot2.


Karateka - boot2, adresses originales remises à la mano juste pour le désassemblage.

Code:

-------------------------------
BOOT2 (j'ai remis les adresses réelles d'exécution)
-------------------------------
0200-   4C 0C 02    JMP   $020C
0203-   4C 5E 02    JMP   $025E
0206-   4C A2 02    JMP   $02A2
0209-   4C 37 02    JMP   $0237

-------------------------------LOOP
020C-   A5 D0       LDA   $D0
020E-   20 00 03    JSR   $0300      <-- charge 1 secteur
0211-   D0 F9       BNE   $020C      <-- LOOP
0213-   AD FF BF    LDA   $BFFF
0216-   49 49       EOR   #$49
0218-   C5 D0       CMP   $D0
021A-   D0 F0       BNE   $020C      <-- LOOP
021C-   AD FE BF    LDA   $BFFE
021F-   49 3B       EOR   #$3B
0221-   C5 D0       CMP   $D0
0223-   D0 E7       BNE   $020C      <-- LOOP
0225-   AD FD BF    LDA   $BFFD
0228-   C5 D0       CMP   $D0
022A-   D0 E0       BNE   $020C      <-- LOOP
022C-   A5 D0       LDA   $D0
022E-   85 D2       STA   $D2
0230-   A9 40       LDA   #$40
0232-   85 07       STA   $07
0234-   4C FA BF    JMP   $BFFA
------------------------------

0237-   20 00 19    JSR   $1900
023A-   A5 07       LDA   $07
023C-   C9 20       CMP   #$20
023E-   F0 06       BEQ   $0246
0240-   20 09 76    JSR   $7609
0243-   20 00 19    JSR   $1900
0246-   20 09 76    JSR   $7609
0249-   C6 D2       DEC   $D2
024B-   20 03 03    JSR   $0303      <-- mène à HGR1
024E-   D0 F9       BNE   $0249
0250-   20 12 10    JSR   $1012
0253-   A9 01       LDA   #$01
0255-   85 D0       STA   $D0
0257-   A9 00       LDA   #$00
0259-   85 DC       STA   $DC
025B-   4C 0C 02    JMP   $020C

025E-   20 CB 02    JSR   $02CB
0261-   A2 00       LDX   #$00
0263-   A0 00       LDY   #$00
0265-   AD 10 C0    LDA   $C010
0268-   A5 C4       LDA   $C4
026A-   F0 0C       BEQ   $0278
026C-   AD 00 C0    LDA   $C000
026F-   30 43       BMI   $02B4
0271-   AD 00 C0    LDA   $C000
0274-   30 3E       BMI   $02B4
0276-   10 0E       BPL   $0286
0278-   D0 0C       BNE   $0286
027A-   AD 61 C0    LDA   $C061
027D-   30 35       BMI   $02B4
027F-   AD 62 C0    LDA   $C062
0282-   30 30       BMI   $02B4
0284-   10 00       BPL   $0286
0286-   AD 00 C0    LDA   $C000
0289-   30 29       BMI   $02B4
028B-   88          DEY   
028C-   D0 DA       BNE   $0268
028E-   CA          DEX   
028F-   D0 D7       BNE   $0268
0291-   20 09 76    JSR   $7609
0294-   A5 D2       LDA   $D2
0296-   D0 03       BNE   $029B
0298-   4C 2C 02    JMP   $022C
029B-   A9 00       LDA   #$00
029D-   85 D0       STA   $D0
029F-   4C 0C 02    JMP   $020C
02A2-   20 00 19    JSR   $1900
02A5-   A5 07       LDA   $07
02A7-   C9 20       CMP   #$20
02A9-   F0 E6       BEQ   $0291
02AB-   20 09 76    JSR   $7609
02AE-   20 00 19    JSR   $1900
02B1-   4C 91 02    JMP   $0291
02B4-   20 09 76    JSR   $7609
02B7-   A5 D2       LDA   $D2
02B9-   C9 01       CMP   #$01
02BB-   D0 05       BNE   $02C2
02BD-   85 DC       STA   $DC
02BF-   4C 2C 02    JMP   $022C
02C2-   A9 01       LDA   #$01
02C4-   85 DC       STA   $DC
02C6-   85 D0       STA   $D0
02C8-   4C 0C 02    JMP   $020C
02CB-   20 00 19    JSR   $1900
02CE-   20 E7 02    JSR   $02E7
02D1-   20 09 76    JSR   $7609
02D4-   20 00 19    JSR   $1900
02D7-   A5 07       LDA   $07
02D9-   C9 20       CMP   #$20
02DB-   F0 09       BEQ   $02E6
02DD-   20 E7 02    JSR   $02E7
02E0-   20 09 76    JSR   $7609
02E3-   20 00 19    JSR   $1900
02E6-   60          RTS   
02E7-   A9 74       LDA   #$74
02E9-   85 03       STA   $03
02EB-   A9 9A       LDA   #$9A
02ED-   85 04       STA   $04
02EF-   A9 0F       LDA   #$0F
02F1-   85 05       STA   $05
02F3-   A9 5A       LDA   #$5A
02F5-   85 06       STA   $06
02F7-   A9 01       LDA   #$01
02F9-   85 0F       STA   $0F
02FB-   4C 03 19    JMP   $1903
02FE-   19 DF 4C    ORA   $4CDF,Y


--------------------------------
            BOOT 2
--------------------------------
0300-   4C 38 03    JMP   $0338      <-- BOOT 2+

0303-   4C A5 03    JMP   $03A5      <================== on revient ici un jour ????

0306-   60          RTS   

--------------------------------
        RESET HANDLER
--------------------------------
0307-   00          BRK   
0308-   C6
0309-   A9 D2       LDA   #$A9      <============== nouvelle routine de RESET   
030B-   2C A9 D0    BIT   $D0A9      <-- ???? O_o"
030E-   48          PHA   
030F-   20 2F FB    JSR   $FB2F
0312-   20 58 FC    JSR   $FC58
0315-   68          PLA   
0316-   8D 00 04    STA   $0400
0319-   A0 00       LDY   #$00
031B-   98          TYA   
031C-   99 00 08    STA   $0800,Y
031F-   C8          INY   
0320-   D0 FA       BNE   $031C
0322-   2C 30 C0    BIT   $C030
0325-   EE 1E 03    INC   $031E
0328-   AD 1E 03    LDA   $031E
032B-   C9 C0       CMP   #$C0
032D-   90 EA       BCC   $0319
032F-   20 DC 03    JSR   $03DC
0332-   EE F4 03    INC   $03F4
0335-   6C 07 03    JMP   ($0307)   <-- saute en $0C600 (reboot)

------------------------------BOOT 2+
0338-   48          PHA         <-- empile #$80 (sauvegarde A) (et #$00 la seconde)...
0339-   20 93 03    JSR   $0393      <-- SWAP PAGE ZERO
033C-   AE 06 03    LDX   $0306      <-- x <= SLOT
033F-   20 F5 03    JSR   $03F5      <-- ALLUME (le moteur)

0342-   A9 02       LDA   #$02
0344-   85 01       STA   $01      <-- 2 secteurs à charger
0346-   A0 00       LDY   #$00
0348-   A9 40       LDA   #$40      <-- buffer de chargement = $4000
034A-   84 02       STY   $02
034C-   85 03       STA   $03      <-- $01 = $02 (nb de demi-secteurs) // $02+$03 = $4000
----------------------------------
recherche marqueurs : F5 D5 DA
----------------------------------
034E-   BD 8C C0    LDA   $C08C,X
0351-   10 FB       BPL   $034E
0353-   C9 F5       CMP   #$F5
0355-   D0 F7       BNE   $034E
0357-   BD 8C C0    LDA   $C08C,X
035A-   10 FB       BPL   $0357
035C-   C9 D5       CMP   #$D5
035E-   D0 F3       BNE   $0353
0360-   BD 8C C0    LDA   $C08C,X
0363-   10 FB       BPL   $0360
0365-   C9 DA       CMP   #$DA
0367-   D0 F3       BNE   $035C
--------------------------------- chargement
0369-   BD 8C C0    LDA   $C08C,X
036C-   10 FB       BPL   $0369
036E-   2A          ROL   
036F-   85 00       STA   $00
0371-   BD 8C C0    LDA   $C08C,X
0374-   10 FB       BPL   $0371
0376-   25 00       AND   $00
0378-   91 02       STA   ($02),Y
037A-   C8          INY   
037B-   D0 EC       BNE   $0369
037D-   0E FF FF    ASL   $FFFF      <-- désynchro !!!
0380-   BD 8C C0    LDA   $C08C,X
0383-   10 FB       BPL   $0380
0385-   C9 FB       CMP   #$FB
0387-   D0 B9       BNE   $0342      <-- boucle infinie si pas de désynchro...
0389-   E6 03       INC   $03
038B-   C6 01       DEC   $01
038D-   D0 DA       BNE   $0369
038F-   68          PLA         <-- dépile A (#$80)
0390-   20 00 40    JSR   $4000      <====================== ***** BOOT 3 *****

-----------------------------
       SWAP PAGE ZERO
-----------------------------
0393-   A2 00       LDX   #$00
0395-   B5 00       LDA   $00,X
0397-   BC 00 4F    LDY   $4F00,X
039A-   9D 00 4F    STA   $4F00,X   <-- inverse la PZ et la page $4F
039D-   94 00       STY   $00,X
039F-   E8          INX   
03A0-   D0 F3       BNE   $0395
03A2-   A9 00       LDA   #$00
03A4-   60          RTS   

------- appelé par $0303 lui-même appelé par $024B
03A5-   A9 10       LDA   #$10      <-- ????
03A7-   20 38 03    JSR   $0338      <-- chargement 1 secteur
03AA-   A9 40       LDA   #$40
03AC-   85 07       STA   $07
03AE-   20 00 19    JSR   $1900      <-- ????
03B1-   AD 55 C0    LDA   $C055      <-- commute page HGR2
03B4-   A9 A0       LDA   #$A0      <-- source = $A000
03B6-   A0 20       LDY   #$20      <-- destination = $2000
03B8-   A2 20       LDX   #$20      <-- longueur = $2000
03BA-   20 C3 03    JSR   $03C3      <-- routine NETTOYAGE utilisée pour transférer une image en de $A000 vers $2000
03BD-   AD 54 C0    LDA   $C054      <-- commute page HGR1
03C0-   A9 00       LDA   #$00
03C2-   60          RTS         <---------------- saute en $8011 ????

------------------------------
           NETTOYAGE
------------------------------
     vide une première fois
  la carte langage en remplaçant
  son contenu par celui de la ROM
 (anti routines en carte langage)
Le second appel déplace l'image HGR1
      de $A000 vers $2000
-------------------------------
03C3-   85 3D       STA   $3D
03C5-   84 3F       STY   $3F
03C7-   A0 00       LDY   #$00
03C9-   84 3C       STY   $3C
03CB-   84 3E       STY   $3E
03CD-   B1 3C       LDA   ($3C),Y
03CF-   91 3E       STA   ($3E),Y
03D1-   C8          INY   
03D2-   D0 F9       BNE   $03CD
03D4-   E6 3D       INC   $3D
03D6-   E6 3F       INC   $3F
03D8-   CA          DEX   
03D9-   D0 F2       BNE   $03CD
03DB-   60          RTS   

-------------------------------
            APPEL 1
-------------------------------
03DC-   2C 81 C0    BIT   $C081      <-- carte langage : lecture en ROM et écriture en RAM
03DF-   2C 81 C0    BIT   $C081
03E2-   A9 D0       LDA   #$D0
03E4-   A8          TAY   
03E5-   A2 30       LDX   #$30
03E7-   20 C3 03    JSR   $03C3      <-- appel NETTOYAGE plus haut
03EA-   8D 82 C0    STA   $C082      <-- carte langage : re-sélectionne la ROM
03ED-   60          RTS   
03EE-   00          BRK   
03EF-   00          BRK   
03F0-   0C          ???   
03F1-   03          ???   
03F2-   09 03       ORA   #$03
03F4-   A6          ???

-------------------------------
           ALLUME
------------------------------
03F5-   BD 89 C0    LDA   $C089,X   <-- allumage moteur   
03F8-   A9 00       LDA   #$00
03FA-   20 A8 FC    JSR   $FCA8      <-- wait
03FD-   4C A8 FC    JMP   $FCA8      <-- wait again ???
0400-   0A          ASL   


Toutes ces routines sont actuellement en $1200 (et non $0200)
il va falloir modifier cette routine (1390:4C 59 FF) et coder un petit lanceur qui :

- recalibre
- déplace la tête piste 1
- déplace la routine de $1200 vers $200 et la lance via :
LDA #$80
JMP $300


Une fois le petit lanceur codé, il charge ceci :

Cette routine charge en $5000 quatre "double-secteurs" entrelacés en 1/2 pistes, situés entre la piste 2.5 et la piste 3.5 en sautant de 1/2 piste en 1/2 piste pour chaque "pseudo secteur".

Le vocabulaire pour ce bestiau, c'est au choix... je dirais "pistes entrelacés" ou "pistes spirales"...
Code:

-------------------------------
            BOOT 3
-------------------------------
$4000 : 48      PHA      <-- sauvegarde A (#$80)
$4001 : A9 02      LDA #$02
$4003 : 85 1F      STA $1F      <-- $1F = 2 (piste courante (= 1))
$4005 : A9 04      LDA #$04   <-- piste 2 (phase 4)
$4007 : 20 BA 40   JSR $40BA   <-- SHAKE YOUR HEAD (valeur tempo = #$13)

;------------- on a déplacé le bras....
$400A : A0 00      LDY #$00
$400C : 84 04      STY $04
$400E : 84 05      STY $05      <-- miniloop debut
$4010 : B9 40 40   LDA $4040,Y   <-- valeurs #$50 ou #$00 en fonction de Y (fait 2 boucles)
$4013 : F0 08      BEQ $401D
$4015 : 20 21 40   JSR $4021   <-- LECTURE DES 4 secteurs en 1/2 pistes
$4018 : A4 05      LDY $05
$401A : C8      INY
$401B : D0 F1      BNE $400E   <-- miniloop fin
$401D : 68      PLA
$401E : 4C 00 50   JMP $5000   <========= ************* boot 4 !!!!! ***********

;----------------------------------------
; lecture de 4 double-secteurs entrelaçés
;----------------------------------------
$4021 : A0 00      LDY #$00   <-- secteur 0

$4023 : 84 06      STY $06
$4025 : 48      PHA      <-- sauve A (#$50)
$4026 : 20 42 40   JSR $4042   <-- lecture secteur à headers changeants
$4029 : A4 06      LDY $06

$402B : 18      CLC
$402C : A5 1F      LDA $1F      <-- piste courante
$402E : 79 48 41   ADC $4148,Y   <-- ajoute une variable en fonction du n° de secteur
$4031 : 20 BD 40   JSR $40BD   <-- déplace la tête (valeur tempo = #$0A)
$4034 : 68      PLA      <-- restaure A
$4035 : 18      CLC
$4036 : 69 02      ADC #$02
$4038 : A4 06      LDY $06
$403A : C8      INY      <-- secteur suivant
$403B : C0 04      CPY #$04   <-- les 4 secteurs sont ok ?
$403D : 90 E4      BCC $4023   <-- boucle si non...
$403F : 60      RTS


$4040 : 50 00      BVC $4042   <-- adresse de chargement en RAM !!!

;----------------------------------
;  Calcul des headers changeants
;----------------------------------
$4042 : 48      PHA      <-- sauve la valeur contenue dans $4040 (#$50)
$4043 : A5 04      LDA $04
$4045 : 29 07      AND #$07
$4047 : A8      TAY
$4048 : B9 4C 41   LDA $414C,Y
$404B : 85 00      STA $00
$404D : A5 04      LDA $04
$404F : 4A      LSR
$4050 : 09 AA      ORA #$AA
$4052 : 85 01      STA $01
$4054 : A5 04      LDA $04
$4056 : 09 AA      ORA #$AA
$4058 : 85 02      STA $02
$405A : AD 54 41   LDA $4154
$405D : 85 03      STA $03
$405F : 68      PLA      <-- restaure A

$4060 : E6 04      INC $04
$4062 : A2 02      LDX #$02
$4064 : 85 07      STA $07
$4066 : 8E 6A 40   STX $406A
$4069 : A2 02      LDX #$02
$406B : 86 0A      STX $0A
$406D : A0 00      LDY #$00
$406F : A5 07      LDA $07
$4071 : 84 08      STY $08
$4073 : 85 09      STA $09
$4075 : AE 06 03   LDX $0306   <-- SLOT

-------------------------------------
 lecture d'un (BIG) secteur (double)
-------------------------------------
$4078 : BD 8C C0   LDA $C08C,X
$407B : 10 FB      BPL $4078
$407D : C5 00      CMP $00      <- header1
$407F : D0 F7      BNE $4078
$4081 : BD 8C C0   LDA $C08C,X
$4084 : 10 FB      BPL $4081
$4086 : C5 01      CMP $01      <- header2
$4088 : D0 F3      BNE $407D
$408A : BD 8C C0   LDA $C08C,X
$408D : 10 FB      BPL $408A
$408F : C5 02      CMP $02      <- header3
$4091 : D0 F3      BNE $4086
$4093 : BD 8C C0   LDA $C08C,X
$4096 : 10 FB      BPL $4093
$4098 : 2A      ROL
$4099 : 85 0B      STA $0B
$409B : BD 8C C0   LDA $C08C,X
$409E : 10 FB      BPL $409B
$40A0 : 25 0B      AND $0B
$40A2 : 91 08      STA ($08),Y
$40A4 : C8      INY
$40A5 : D0 EC      BNE $4093
$40A7 : 0E FF FF   ASL $FFFF
$40AA : BD 8C C0   LDA $C08C,X
$40AD : 10 FB      BPL $40AA
$40AF : C5 03      CMP $03      <- header4 (final)
$40B1 : D0 B6      BNE $4069
$40B3 : E6 09      INC $09      <- incrémente l'adresse haute de chgt
$40B5 : C6 0A      DEC $0A      <- charge un secteur 'double' (512 bytes)
$40B7 : D0 DA      BNE $4093
$40B9 : 60      RTS

----------------------------------
SHAKE YOUR HEAD (avec A=4)
----------------------------------
$40BA : A2 13      LDX #$13   <-- 1ère valeur de temporisation
----------------------------------
$40BC : 2C A2 0A   BIT $0AA2   <-- ??? O_o" pourquoi ?

l'adresse à la ligne au dessus est à lire comme ci-dessous lors d'un appel venant de $4031 :
$40BC : 2C      ???      <-- n'est pas appelé, puisque l'appel vise $40BD
$40BD : A2 0A      LDX #$0A   <-- deuxième valeur de temporisation (via appel en $4031)
----------------------------------
$40BF : 8E 23 41   STX $4123   <-- adresse de temporisation (automodifiée deux fois : valeurs #$13 ou #$0A)
$40C2 : 8D 45 41   STA $4145   <-- piste destination (2)
$40C5 : C5 1F      CMP $1F      <-- compare à piste courante
$40C7 : F0 55      BEQ $411E   <-- si c'est égal, on y est

$40C9 : A9 00      LDA #$00   
$40CB : 8D 46 41   STA $4146   <-- n° du secteur en cours = 0

----------------------------------BOUCLE
$40CE : A5 1F      LDA $1F      <-- phase courante
$40D0 : 8D 47 41   STA $4147   <-- sauve phase courante
$40D3 : 38      SEC
$40D4 : ED 45 41   SBC $4145   <-- soustrait la destination
$40D7 : F0 35      BEQ $410E   
$40D9 : B0 06      BCS $40E1   
$40DB : 49 FF      EOR #$FF   
$40DD : E6 1F      INC $1F      <-- on avance
$40DF : 90 04      BCC $40E5   

------------ choix 1
$40E1 : 69 FE      ADC #$FE
$40E3 : C6 1F      DEC $1F      <-- on recule
------------ choix 2
$40E5 : CD 46 41   CMP $4146   <-- n° secteur ?
$40E8 : 90 03      BCC $40ED
$40EA : AD 46 41   LDA $4146   <-- n° de secteur
$40ED : C9 0C      CMP #$0C   <-- une "piste" contient au max 12 secteurs
$40EF : B0 01      BCS $40F2   <-- si >= 12, saut...
$40F1 : A8      TAY      <-- index de temporisation transféré dans Y

$40F2 : 38      SEC
$40F3 : 20 12 41   JSR $4112   <-- PHASE
$40F6 : B9 2D 41   LDA $412D,Y   <-- Timetable1
$40F9 : 20 22 41   JSR $4122   <-- TEMPO
$40FC : AD 47 41   LDA $4147   <-- variable3
$40FF : 18      CLC
$4100 : 20 14 41   JSR $4114   <-- PHASE_SUITE
$4103 : B9 39 41   LDA $4139,Y   <-- Timetable2
$4106 : 20 22 41   JSR $4122   <-- TEMPO

$4109 : EE 46 41   INC $4146   <-- variable2 = variable2 + 1
$410C : D0 C0      BNE $40CE   <-- BOUCLE tant que variable2 =/= 0

$410E : 20 22 41   JSR $4122   <-- TEMPO
$4111 : 18      CLC

-------------------------------------
PHASE
-------------------------------------
$4112 : A5 1F      LDA $1F
----------- PHASE_SUITE
$4114 : 29 03      AND #$03
$4116 : 2A      ROL
$4117 : 0D 06 03   ORA $0306   <-- SLOT
$411A : AA      TAX
$411B : BD 80 C0   LDA $C080,X   <-- PHASEOFF

-------------------------------------- ON Y EST (sur la bonne piste)
$411E : AE 06 03   LDX $0306   <-- on met le slot dans X
$4121 : 60      RTS      <-- et on revient...

-------------------------------------
TEMPO (en fonction de A)
-------------------------------------
$4122 : A2 13      LDX #$13
$4124 : CA      DEX
$4125 : D0 FD      BNE $4124
$4127 : 38      SEC
$4128 : E9 01      SBC #$01
$412A : D0 F6      BNE $4122
$412C : 60      RTS

-------------------------------------
TimeTable 1
-------------------------------------
$412D : 01 30 28 24 20 1E 1D 1C 1C 1C 1C 1C

-------------------------------------
TimeTable 2
-------------------------------------
$4139 : 70 2C 26 22 1F 1E 1D 1C 1C 1C 1C 1C

$4145 : 00      BRK
$4146 : 00      BRK
$4147 : 00      BRK

------------------------------------ variables "phase ~ 1/2 piste"
$4148 : 01 FF      ORA ($FF,X)
$414A : 01 01      ORA ($01,X)
----------------------------------- table marqueurs
$414C : D5 B5      CMP $B5,X
$414E : B7      ???
$414F : BC DF D4   LDY $D4DF,X
$4152 : B4 DB      LDY $DB,X
$4154 : F5 00      SBC $00,X
$4156 : 00      BRK


Le saut au boot 4 se trouve ici:
$401E : 4C 00 50   JMP $5000

Il suffit de le modifier comme cela pour retrouver le moniteur après le chargement.
$401E : 4C 59 FF   JMP $FF59


Il est très simple de sauvegarder ces codes sur une disquette DOS (comme pour chaque étape d'ailleurs).
Le petit soft qui positionne la tête sur la piste 1 et lance le code en $5000 nous permettra d'aller plus loin.
Pour le moment, il est temps d'analyser la routine chargée en $5000.



---------------------------------------------------------
!!! Routine en cours d'analyse. !!! (fichue real life, j'ai peu de temps...)

Cette routine charge non pas des secteurs isolés, comme le ferait la RWTS mais des pistes entières composées de 12 secteurs (et non 16)
La différence du nb de secteurs s'explique facilement, car ces secteurs sont codés en 4&4.
il faut 512 nibbles pour coder 256 octets en 4&4
il faut 384 (si ma mémoire est bonne) nibbles pour coder 256 octets en 6&2.

Dos 3.3 = 6&2 = 16x384 nibbles = 6144 nibbles (codants) par piste (on compte pas les synchros + marqueurs
Karateka = 4&4 = 12x512 nibbles = 6144 nibbles par piste (tout pareil en nb de nibbles, mais pas pareil en nb de secteurs).

Code:

-------------------
BOOT 4 de Karateka
--------------------


5000-   10 03       BPL   $5005      <-- ne saute pas la 1ere fois, car A=#$80, donc négatif mais saute la 2nde fois (A=0)
5002-   4C 00 53    JMP   $5300      <-- Appel à la 1ere exécution

5005-   C9 10       CMP   #$10      <-- A= #$10 ?
5007-   F0 0B       BEQ   $5014      <-- si oui, on charge l'image du temple..
5009-   0A          ASL         <-- sinon, on charge la partie inconnue...
500A-   0A          ASL   
500B-   0A          ASL   
500C-   69 0E       ADC   #$0E      <-- piste $07 (14/2)
500E-   A0 30       LDY   #$30      <-- index des adresses dans la table...
5010-   4C 1D 50    JMP   $501D      <-- on continue
5013-   00          BRK   

------------------------------------ suite
5014-   A9 08       LDA   #$08      <-- track $04 (phase 8) (image TEMPLE)
5016-   A0 00       LDY   #$00      <-- index sur la table = 0 (table image TEMPLE)
5018-   EA          NOP   
5019-   EA          NOP   
501A-   EA          NOP   
501B-   EA          NOP   
501C-   EA          NOP   

------------------------------------ On continue
501D-   20 00 55    JSR   $5500      <-- CHARGEMENT image TEMPLE ou partie inconnue (selon paramètres)
5020-   68          PLA   
5021-   68          PLA   

------------------------------
recrée la page zéro avec le contenu de la page $4F
------------------------------
5022-   A2 00       LDX   #$00
5024-   BD 00 4F    LDA   $4F00,X
5027-   95 00       STA   $00,X
5029-   E8          INX   
502A-   D0 F8       BNE   $5024

------------------------------
vide les adresses 'cachées' de la page graphique HGR2
------------------------------
502C-   A0 00       LDY   #$00
502E-   A9 40       LDA   #$40
5030-   A2 20       LDX   #$20
5032-   84 3C       STY   $3C
5034-   85 3D       STA   $3D
5036-   A9 00       LDA   #$00
5038-   A0 78       LDY   #$78
503A-   91 3C       STA   ($3C),Y
503C-   C8          INY   
503D-   10 FB       BPL   $503A
503F-   A0 F8       LDY   #$F8
5041-   91 3C       STA   ($3C),Y
5043-   C8          INY   
5044-   D0 FB       BNE   $5041
5046-   E6 3D       INC   $3D
5048-   CA          DEX   
5049-   D0 ED       BNE   $5038
504B-   A9 00       LDA   #$00
504D-   60          RTS         <-- revient où ??
504E-   00          BRK   
504F-   00          BRK   
5050-   00          BRK   

.
.
vide
.

 
5100-   CE D0 04    DEC   $04D0
5103-   A5 CF       LDA   $CF
5105-   F0 11       BEQ   $5118
5107-   A5 DA       LDA   $DA
5109-   85 CA       STA   $CA
510B-   A5 DB       LDA   $DB
510D-   85 CB       STA   $CB
510F-   20 2C F1    JSR   $F12C
5112-   20 FD FE    JSR   $FEFD
5115-   A6 D8       LDX   $D8
5117-   60          RTS   
-
5118-   20 3A FF    JSR   $FF3A
511B-   4C 15 F1    JMP   $F115
-
511E-   A0 CE       LDY   #$CE
5120-   84 3C       STY   $3C
5122-   C8          INY   
5123-   84 3E       STY   $3E
5125-   A0 00       LDY   #$00
5127-   84 3D       STY   $3D
5129-   84 3F       STY   $3F
512B-   60          RTS   
512C-   B5 CA       LDA   $CA,X
512E-   95 3C       STA   $3C,X
5130-   B4 4C       LDY   $4C,X
5132-   94 3E       STY   $3E,X
5134-   CA          DEX   
5135-   10 F5       BPL   $512C
5137-   A5 3E       LDA   $3E
5139-   D0 02       BNE   $513D
513B-   C6 3F       DEC   $3F
513D-   C6 3E       DEC   $3E
513F-   60          RTS   
-
5140-   86 D8       STX   $D8
5142-   38          SEC   
5143-   A2 FF       LDX   #$FF
5145-   B5 4D       LDA   $4D,X
5147-   F5 CB       SBC   $CB,X
5149-   95 CF       STA   $CF,X
514B-   E8          INX   
514C-   F0 F7       BEQ   $5145
514E-   20 1E F1    JSR   $F11E
5151-   20 CD FE    JSR   $FECD
5154-   A2 01       LDX   #$01
5156-   20 2C F1    JSR   $F12C
5159-   A9 1A       LDA   #$1A
515B-   20 CF FE    JSR   $FECF
515E-   A6 D8       LDX   $D8
5160-   60          RTS 
-
5161-   20 C4 E3    JSR   $E3C4
5164-   4C 3A FF    JMP   $FF3A
-
5167-   A5 FC       LDA   $FC
5169-   D0 03       BNE   $516E
516B-   4C A5 E8    JMP   $E8A5
516E-   C6 FC       DEC   $FC
5170-   60          RTS   
-
5171-   A9 FF       LDA   #$FF
5173-   85 A0       STA   $A0
5175-   60          RTS   
-
5176-   46 A0       LSR   $A0
5178-   60          RTS   
5179-   24 A0       BIT   $A0
517B-   10 19       BPL   $5196
517D-   A9 A3       LDA   #$A3
517F-   20 ED FD    JSR   $FDED
5182-   A0 01       LDY   #$01
5184-   B1 DC       LDA   ($DC),Y
5186-   AA          TAX   
5187-   C8          INY   
5188-   B1 DC       LDA   ($DC),Y
518A-   20 1B E5    JSR   $E51B
518D-   A9 A0       LDA   #$A0
518F-   4C ED FD    JMP   $FDED
5192-   A5 DC       LDA   $DC
5194-   A4 DD       LDY   $DD
5196-   60          RTS   
5197-   C1 00       CMP   ($00,X)
5199-   7F          ???   
519A-   D1 CC       CMP   ($CC),Y
519C-   C7          ???   
519D-   CF          ???   
519E-   CE C5 9A    DEC   $9AC5
51A1-   98          TYA   
51A2-   8D 96 95    STA   $9596
51A5-   93          ???   
51A6-   BF          ???   
51A7-   B2          ???   
51A8-   32          ???   
51A9-   12          ???   
51AA-   0F          ???   
51AB-   BC B0 AC    LDY   $ACB0,X
51AE-   BE 35 0C    LDX   $0C35,Y
51B1-   61 30       ADC   ($30,X)
51B3-   10 0B       BPL   $51C0
51B5-   DD FB A0    CMP   $A0FB,X
51B8-   00          BRK   
51B9-   20 C7 E7    JSR   $E7C7
51BC-   A9 A0       LDA   #$A0
51BE-   4C ED FD    JMP   $FDED
51C1-   00          BRK   
51C2-   00          BRK   
51C3-   00          BRK   
51C4-   00          BRK   
51C5-   00          BRK   
51C6-   00          BRK   
51C7-   00          BRK   
51C8-   00          BRK   
51C9-   A4 4A       LDY   $4A
51CB-   A5 4B       LDA   $4B
51CD-   48          PHA   
51CE-   C4 DA       CPY   $DA
51D0-   E5 DB       SBC   $DB
51D2-   B0 1C       BCS   $51F0
51D4-   68          PLA   
51D5-   84 D0       STY   $D0
51D7-   85 D1       STA   $D1
51D9-   A0 FF       LDY   #$FF
51DB-   C8          INY   
51DC-   B1 D0       LDA   ($D0),Y
51DE-   30 FB       BMI   $51DB
51E0-   C9 40       CMP   #$40
51E2-   F0 F7       BEQ   $51DB
51E4-   C8          INY   
51E5-   C8          INY   
51E6-   B1 D0       LDA   ($D0),Y
51E8-   48          PHA   
51E9-   88          DEY   
51EA-   B1 D0       LDA   ($D0),Y
51EC-   A8          TAY   
51ED-   68          PLA   
51EE-   D0 DD       BNE   $51CD
51F0-   68          PLA   
51F1-   A0 00       LDY   #$00
51F3-   B1 D0       LDA   ($D0),Y
51F5-   30 05       BMI   $51FC
51F7-   4A          LSR   
51F8-   F0 08       BEQ   $5202
51FA-   A9 A4       LDA   #$A4
51FC-   20 ED FD    JSR   $FDED
51FF-   C8          INY   
5200-   D0 F1       BNE   $51F3
5202-   A9 BD       LDA   #$BD
5204-   4C ED FD    JMP   $FDED
5207-   91 DA       STA   ($DA),Y
5209-   E8          INX   
520A-   B5 9F       LDA   $9F,X
520C-   F0 30       BEQ   $523E
520E-   4C D5 F3    JMP   $F3D5
5211-   A0 30       LDY   #$30
5213-   07          ???   
5214-   A5 DC       LDA   $DC
5216-   A4 DD       LDY   $DD
5218-   20 7D F1    JSR   $F17D
521B-   20 C9 F1    JSR   $F1C9
521E-   A6 D8       LDX   $D8
5220-   4C B7 F1    JMP   $F1B7
5223-   E8          INX   
5224-   E8          INX   
5225-   B5 9F       LDA   $9F,X
5227-   F0 1F       BEQ   $5248
5229-   4C E0 F3    JMP   $F3E0
522C-   30 07       BMI   $5235
522E-   A5 DC       LDA   $DC
5230-   A4 DD       LDY   $DD
5232-   20 7D F1    JSR   $F17D
5235-   20 C9 F1    JSR   $F1C9
5238-   A6 D8       LDX   $D8
523A-   4C 09 F4    JMP   $F409
523D-   E8          INX   
523E-   60          RTS   
523F-   20 15 E7    JSR   $E715
5242-   E6 CE       INC   $CE
5244-   D0 02       BNE   $5248
5246-   E6 CF       INC   $CF
5248-   60          RTS   
5249-   20 5B F2    JSR   $F25B
524C-   D0 15       BNE   $5263
524E-   20 53 F2    JSR   $F253
5251-   D0 10       BNE   $5263
5253-   20 82 E7    JSR   $E782
5256-   20 6F E7    JSR   $E76F
5259-   50 03       BVC   $525E
525B-   20 82 E7    JSR   $E782
525E-   20 59 E7    JSR   $E759
5261-   56 50       LSR   $50,X
5263-   4C 36 E7    JMP   $E736
5266-   20 C9 EF    JSR   $EFC9
5269-   15 4F       ORA   $4F,X
526B-   10 05       BPL   $5272
526D-   20 C9 EF    JSR   $EFC9
5270-   35 4F       AND   $4F,X
5272-   95 50       STA   $50,X
5274-   10 ED       BPL   $5263
5276-   4C C9 EF    JMP   $EFC9
5279-   20 15 E7    JSR   $E715
527C-   A4 FB       LDY   $FB
527E-   A5 CE       LDA   $CE
5280-   99 5F 01    STA   $015F,Y
5283-   A5 CF       LDA   $CF
5285-   4C 66 E9    JMP   $E966
5288-   99 50 01    STA   $0150,Y
528B-   88          DEY   
528C-   30 51       BMI   $52DF
528E-   B9 40 01    LDA   $0140,Y
5291-   D5 50       CMP   $50,X
5293-   D0 F6       BNE   $528B
5295-   B9 50 01    LDA   $0150,Y
5298-   D5 78       CMP   $78,X
529A-   D0 EF       BNE   $528B
529C-   C6 FB       DEC   $FB
529E-   B9 41 01    LDA   $0141,Y
52A1-   99 40 01    STA   $0140,Y
52A4-   B9 51 01    LDA   $0151,Y
52A7-   99 50 01    STA   $0150,Y
52AA-   B9 C1 01    LDA   $01C1,Y
52AD-   99 C0 01    STA   $01C0,Y
52B0-   B9 D1 01    LDA   $01D1,Y
52B3-   99 D0 01    STA   $01D0,Y
52B6-   B9 61 01    LDA   $0161,Y
52B9-   99 60 01    STA   $0160,Y
52BC-   B9 71 01    LDA   $0171,Y
52BF-   99 70 01    STA   $0170,Y
52C2-   B9 81 01    LDA   $0181,Y
52C5-   99 80 01    STA   $0180,Y
52C8-   B9 91 01    LDA   $0191,Y
52CB-   99 90 01    STA   $0190,Y
52CE-   B9 A1 01    LDA   $01A1,Y
52D1-   99 A0 01    STA   $01A0,Y
52D4-   B9 A1 01    LDA   $01A1,Y
52D7-   99 A0 01    STA   $01A0,Y
52DA-   C8          INY   
52DB-   C4 FB       CPY   $FB
52DD-   90 BF       BCC   $529E
52DF-   60          RTS   
52E0-   E8          INX   
52E1-   A9 00       LDA   #$00
52E3-   48          PHA   
52E4-   B5 50       LDA   $50,X
52E6-   38          SEC   
52E7-   E9 03       SBC   #$03
52E9-   85 CE       STA   $CE
52EB-   B5 78       LDA   $78,X
52ED-   E9 00       SBC   #$00
52EF-   85 CF       STA   $CF
52F1-   68          PLA   
52F2-   A0 00       LDY   #$00
52F4-   91 CE       STA   ($CE),Y
52F6-   E8          INX   
52F7-   60          RTS   
52F8-   C9 85       CMP   #$85
52FA-   B0 03       BCS   $52FF
52FC-   4C C0 E4    JMP   $E4C0
52FF-   A0

-----------------------------------
 1er appel ! - charge le CODE et revient au track 1
-----------------------------------
5300-   A2 FF       LDX   #$FF   
5302-   9A          TXS         <-- réinitialise le pointeur de pile
5303-   A0 70       LDY   #$70      <-- index table d'adresses de chgt
5305-   A9 36       LDA   #$36      <-- phase #$36 = piste #$1B
5307-   20 00 55    JSR   $5500      <-- CHARGEMENT

530A-   A2 00       LDX   #$00      <-- Vidage page zero
530C-   8A          TXA   
530D-   95 00       STA   $00,X
530F-   E8          INX   
5310-   D0 FB       BNE   $530D

5312-   A9 01       LDA   #$01      <-- passage de paramètres
5314-   85 86       STA   $86
5316-   85 4F       STA   $4F
5318-   A9 00       LDA   #$00
531A-   85 D0       STA   $D0
531C-   A9 FF       LDA   #$FF
531E-   85 D2       STA   $D2
5320-   4C 00 02    JMP   $0200      <-- second DEPART APRES CHARGEMENT (revient dans le boot2 !)

Le boot2 est cette fois appelé à l'adresse $200 (et non $300 comme la 1ere fois) qui recharge le boot3 qui recharge le boot4 et le relance en $5000.
En fait, cette routine s'auto-appelle et seule la valeur de A va permettre de changer son comportement à la relance. (voir le 1er test en $5000)
 
.
.
vide
.
.
---------------------------------
Table d'adresse de chargement lors d'un appel spécial
       (image du temple)
--------------------------------- de $A000 à $ABFF
5400-   A0 A1       LDY   #$A1
5402-   A2 A3       LDX   #$A3
5404-   A4 A5       LDY   $A5
5406-   A6 A7       LDX   $A7
5408-   A8          TAY   
5409-   A9 AA       LDA   #$AA
540B-   AB          ???   
--------------------------------- de $AC00 à $B7FF
540C-   AC AD AE    LDY   $AEAD
540F-   AF          ???   
5410-   B0 B1       BCS   $53C3
5412-   B2          ???   
5413-   B3          ???   
5414-   B4 B5       LDY   $B5,X
5416-   B6 B7       LDX   $B7,Y
-------------------------------- de $B800 à $BFFF
5418-   B8          CLV   
5419-   B9 BA BB    LDA   $BBBA,Y
541C-   BC BD BE    LDY   $BEBD,X
541F-   BF          ???   
5420-   40          RTI   
5421-   40          RTI      
5422-   40          RTI   
5423-   40          RTI   
---------------------------------
---------------------------------
5424-   00          BRK   
5425-   00          BRK   
5426-   00          BRK   
5427-   00          BRK   
5428-   00          BRK   
5429-   00          BRK   
542A-   00          BRK   
542B-   00          BRK   
542C-   00          BRK   
542D-   00          BRK   
542E-   00          BRK   
542F-   00          BRK   
---------------------------------
Table d'adresse de chargement lors du 2eme appel en $5000
 (suite du chargement du code)
-------------------------------- de $1000 à $1FFF
5430-   10 11       BPL   $5443
5432-   12          ???   
5433-   13          ???   
5434-   14          ???   
5435-   15 16       ORA   $16,X
5437-   17          ???   
5438-   18          CLC   
5439-   19 1A 1B    ORA   $1B1A,Y
543C-   1C          ???   
543D-   1D 1E 1F    ORA   $1F1E,X
--------------------------------- de $A000 à $BFFF
5440-   A0 A1       LDY   #$A1
5442-   A2 A3       LDX   #$A3
5444-   A4 A5       LDY   $A5
5446-   A6 A7       LDX   $A7
5448-   A8          TAY   
5449-   A9 AA       LDA   #$AA
544B-   AB          ???   
544C-   AC AD AE    LDY   $AEAD
544F-   AF          ???   
5450-   B0 B1       BCS   $5403
5452-   B2          ???   
5453-   B3          ???   
5454-   B4 B5       LDY   $B5,X
5456-   B6 B7       LDX   $B7,Y
5458-   B8          CLV   
5459-   B9 BA BB    LDA   $BBBA,Y
545C-   BC BD BE    LDY   $BEBD,X
545F-   BF          ???   
-----------
5460-   00          BRK   
5461-   00          BRK   
5462-   00          BRK   
5463-   00          BRK   
5464-   00          BRK   
5465-   00          BRK   
5466-   00          BRK   
5467-   00          BRK   
5468-   00          BRK   
5469-   00          BRK   
546A-   00          BRK   
546B-   00          BRK   
546C-   00          BRK   
546D-   00          BRK   
546E-   00          BRK   
546F-   00          BRK   

---- valeurs pour l'automodification (adresse haute du buffer de chargement des secteurs ?)
--------------------------------- de $0800 à $0FFF
5470-   08          PHP   
5471-   09 0A       ORA   #$0A
5473-   0B          ???   
5474-   0C          ???   
5475-   0D 0E 0F    ORA   $0F0E
--------------------------------- et de $6000 à $9FFF
5478-   60          RTS   
5479-   61 62       ADC   ($62,X)
547B-   63          ???   
----------
547C-   64          ???   
547D-   65 66       ADC   $66
547F-   67          ???   
5480-   68          PLA   
5481-   69 6A       ADC   #$6A
5483-   6B          ???   
5484-   6C 6D 6E    JMP   ($6E6D)
5487-   6F          ???   
----------
5488-   70 71       BVS   $54FB
548A-   72          ???   
548B-   73          ???   
548C-   74          ???   
548D-   75 76       ADC   $76,X
548F-   77          ???   
5490-   78          SEI   
5491-   79 7A 7B    ADC   $7B7A,Y
----------
5494-   7C          ???   
5495-   7D 7E 7F    ADC   $7F7E,X
5498-   80          ???   
5499-   81 82       STA   ($82,X)
549B-   83          ???   
549C-   84 85       STY   $85
549E-   86 87       STX   $87
----------
54A0-   88          DEY   
54A1-   89          ???   
54A2-   8A          TXA   
54A3-   8B          ???   
54A4-   8C 8D 8E    STY   $8E8D
54A7-   8F          ???   
54A8-   90 91       BCC   $543B
54AA-   92          ???   
54AB-   93          ???   
----------
54AC-   94 95       STY   $95,X
54AE-   96 97       STX   $97,Y
54B0-   98          TYA   
54B1-   99 9A 9B    STA   $9B9A,Y
54B4-   9C          ???   
54B5-   9D 9E 9F    STA   $9F9E,X

.
.
vide
.
.
---------------------------------
CHARGEMENT  (Y=#$70 / A=#$36)
---------------------------------
5500-   48          PHA         <-- PHASE disque DE DEPART (track $1B = phase $36)
5501-   84 88       STY   $88      <-- $88 = #$70 = index table adresses buffer
5503-   20 00 57    JSR   $5700      <-- SHAKE YOUR HEAD 2

----- Remplissage zone DATA à $5703 (adresses hautes de chargement des secteurs)
5506-   A2 00       LDX   #$00
5508-   A4 88       LDY   $88      <-- #$70
550A-   B9 00 54    LDA   $5400,Y   <-- $5470 et +
550D-   9D 03 57    STA   $5703,X
5510-   C8          INY   
5511-   E8          INX   
5512-   E0 0C       CPX   #$0C      <-- 12 bytes sont automodifiés
5514-   90 F4       BCC   $550A
---

5516-   20 30 55    JSR   $5530      <-- Lecture des 12 secteurs (1 piste)
5519-   A5 88       LDA   $88
551B-   18          CLC   
551C-   69 0C       ADC   #$0C
551E-   A8          TAY   
551F-   B9 00 54    LDA   $5400,Y   <-- vérifie la prochaine adresse de chgt
5522-   F0 07       BEQ   $552B      <-- si l'adresse = 0, saut à FINI
5524-   68          PLA         <-- récupère la phase
5525-   18          CLC   
5526-   69 02       ADC   #$02      <-- avance d'une piste pour les 12 prochains sects
5528-   D0 D6       BNE   $5500      <-- boucle cette routine

-------------------------------
552A-   00          BRK   

-------------------------------
            FINI
-------------------------------
552B-   4C 50 55    JMP   $5550      <-- positionne sur la piste 1 + éteint moteur + RTS
552E-   68          PLA   
552F-   60          RTS   
--------------------------------

--------------------------------
Attribution des marqueurs changeants à la routine de lecture
--------------------------------
5530-   AD 1F 00    LDA   $001F
5533-   4A          LSR   
5534-   A2 03       LDX   #$03      <-- 3 marqueurs à trouver
5536-   29 0F       AND   #$0F
5538-   A8          TAY   
5539-   B9 10 56    LDA   $5610,Y   <-- table des valeurs de headers indexée sur Y
553C-   95 A0       STA   $A0,X      <-- remplit les valeurs des headers à trouver...
553E-   C8          INY   
553F-   98          TYA   
5540-   CA          DEX   
5541-   10 F3       BPL   $5536
5543-   4C 0F 57    JMP   $570F      <- lecture de la piste
5546-   00          BRK   
5547-   00          BRK   
5548-   00          BRK   
5549-   00          BRK   
554A-   00          BRK   
554B-   00          BRK   
554C-   00          BRK   
554D-   00          BRK   
554E-   00          BRK   
554F-   00          BRK   
-------------------------------
La toute FIN
-------------------------------
5550-   A9 02       LDA   #$02      <-- Phase =2 (donc piste =1)
5552-   20 00 57    JSR   $5700      <-- déplace le bras
5555-   AE 06 03    LDX   $0306      <-- X = SLOT
5558-   BD 88 C0    LDA   $C088,X   <-- ****** éteint le moteur ******
555B-   68          PLA   
555C-   60          RTS   
-------------------------------

555D-   3D 20 8E    AND   $8E20,X
5560-   F8          SED   
5561-   AA          TAX   
5562-   BD 00 FA    LDA   $FA00,X
5565-   C5 42       CMP   $42
5567-   D0 13       BNE   $557C
5569-   BD C0 F9    LDA   $F9C0,X
556C-   C5 43       CMP   $43
556E-   D0 0C       BNE   $557C
5570-   A5 44       LDA   $44
5572-   A4 2E       LDY   $2E
5574-   C0 9D       CPY   #$9D
5576-   F0 88       BEQ   $5500      <-- CHARGEMENT
5578-   C5 2E       CMP   $2E
557A-   F0 9F       BEQ   $551B
557C-   C6 3D       DEC   $3D
557E-   D0 DC       BNE   $555C
5580-   E6 44       INC   $44
5582-   C6 35       DEC   $35
5584-   F0 D6       BEQ   $555C
5586-   A4 34       LDY   $34
5588-   98          TYA   
5589-   AA          TAX   
558A-   20 4A F9    JSR   $F94A
558D-   A9 DE       LDA   #$DE
558F-   20 ED FD    JSR   $FDED
5592-   20 3A FF    JSR   $FF3A
5595-   A9 A1       LDA   #$A1
5597-   85 33       STA   $33
5599-   20 67 FD    JSR   $FD67
559C-   20 C7 FF    JSR   $FFC7
559F-   AD 00 02    LDA   $0200
55A2-   C9 A0       CMP   #$A0
55A4-   F0 13       BEQ   $55B9
55A6-   C8          INY   
55A7-   C9 A4       CMP   #$A4
55A9-   F0 92       BEQ   $553D
55AB-   88          DEY   
55AC-   20 A7 FF    JSR   $FFA7
55AF-   C9 93       CMP   #$93
55B1-   D0 D5       BNE   $5588
55B3-   8A          TXA   
55B4-   F0 D2       BEQ   $5588
55B6-   20 78 FE    JSR   $FE78
55B9-   A9 03       LDA   #$03
55BB-   85 3D       STA   $3D
55BD-   20 34 F6    JSR   $F634
55C0-   0A          ASL   
55C1-   E9 BE       SBC   #$BE
55C3-   C9 C2       CMP   #$C2
55C5-   90 C1       BCC   $5588
55C7-   0A          ASL   
55C8-   0A          ASL   
55C9-   A2 04       LDX   #$04
55CB-   0A          ASL   
55CC-   26 42       ROL   $42
55CE-   26 43       ROL   $43
55D0-   CA          DEX   
55D1-   10 F8       BPL   $55CB
55D3-   C6 3D       DEC   $3D
55D5-   F0 F4       BEQ   $55CB
55D7-   10 E4       BPL   $55BD
55D9-   A2 05       LDX   #$05
55DB-   20 34 F6    JSR   $F634
55DE-   84 34       STY   $34
55E0-   DD B4 F9    CMP   $F9B4,X
55E3-   D0 13       BNE   $55F8
55E5-   20 34 F6    JSR   $F634
55E8-   DD BA F9    CMP   $F9BA,X
55EB-   F0 0D       BEQ   $55FA
55ED-   BD BA F9    LDA   $F9BA,X
55F0-   F0 07       BEQ   $55F9
55F2-   C9 A4       CMP   #$A4
55F4-   F0 03       BEQ   $55F9
55F6-   A4 34       LDY   $34
55F8-   18          CLC   
55F9-   88          DEY   
55FA-   26 44       ROL   $44
55FC-   E0 03       CPX   #$03
55FE-   D0 0D       BNE   $560D
5600-   ED B6 BA    SBC   $BAB6
5603-   BF          ???   
5604-   EF          ???   
5605-   DB          ???   
5606-   B7          ???   
5607-   BE AB AD    LDX   $ADAB,Y
560A-   F5 D5       SBC   $D5,X
560C-   FA          ???   
560D-   AA          TAX   
560E-   DA          ???   
560F-   FD FB F7    SBC   $F7FB,X
5612-   F6 EE       INC   $EE,X
5614-   EB          ???   
5615-   EA          NOP   
5616-   DF          ???   
5617-   DE DD D7    DEC   $D7DD,X
561A-   D6 BD       DEC   $BD,X
561C-   BB          ???   
561D-   B5 AF       LDA   $AF,X
561F-   AE 00 00    LDX   $0000

.
.
vide
.
.

56A9-   00          BRK   
56AA-   0D 08 00    ORA   $0008
56AD-   09 08       ORA   #$08
56AF-   0A          ASL   
56B0-   00          BRK   
56B1-   00          BRK   
56B2-   00          BRK   
56B3-   00          BRK   
56B4-   00          BRK   
56B5-   02          ???   
56B6-   01 06       ORA   ($06,X)
56B8-   00          BRK   
56B9-   00          BRK   
56BA-   02          ???   
56BB-   05 00       ORA   $00
56BD-   0F          ???   
56BE-   07          ???   
56BF-   03          ???   
56C0-   00          BRK   
56C1-   00          BRK   
56C2-   00          BRK   
56C3-   00          BRK   
56C4-   00          BRK   
56C5-   00          BRK   
56C6-   00          BRK   
56C7-   00          BRK   
56C8-   00          BRK   
56C9-   00          BRK   
56CA-   00          BRK   
56CB-   00          BRK   
56CC-   00          BRK   
56CD-   00          BRK   
56CE-   00          BRK   
56CF-   00          BRK   
56D0-   00          BRK   
56D1-   00          BRK   
56D2-   00          BRK   
56D3-   00          BRK   
56D4-   00          BRK   
56D5-   0B          ???   
56D6-   0A          ASL   
56D7-   0D 00 00    ORA   $0000
56DA-   0E 05 00    ASL   $0005
56DD-   07          ???   
56DE-   09 05       ORA   #$05
56E0-   00          BRK   
56E1-   00          BRK   
56E2-   00          BRK   
56E3-   00          BRK   
56E4-   00          BRK   
56E5-   00          BRK   
56E6-   00          BRK   
56E7-   00          BRK   
56E8-   00          BRK   
56E9-   00          BRK   
56EA-   02          ???   
56EB-   03          ???   
56EC-   00          BRK   
56ED-   00          BRK   
56EE-   01 04       ORA   ($04,X)
56F0-   00          BRK   
56F1-   00          BRK   
56F2-   00          BRK   
56F3-   00          BRK   
56F4-   00          BRK   
56F5-   0A          ASL   
56F6-   0C          ???   
56F7-   0F          ???   
56F8-   00          BRK   
56F9-   00          BRK   
56FA-   0C          ???   
56FB-   08          PHP   
56FC-   00          BRK   
56FD-   0F          ???   
56FE-   00          BRK   
56FF-   00          BRK   

5700-   4C 6F 57    JMP   $576F      <-- DEPLACE LE BRAS

-------------------------------
ZONE AUTOMODIFIABLE - adresses de chgt des 12 secteurs
-------------------------------
5703-   00          BRK   
5704-   00          BRK   
5705-   00          BRK   
5706-   00          BRK   
5707-   00          BRK   
5708-   00          BRK   
5709-   00          BRK   
570A-   00          BRK   
570B-   00          BRK   
570C-   00          BRK   
570D-   00          BRK   
570E-   00          BRK   

---------------------------------------------
Lecture d'une piste complète (12 secteurs à marqueurs changeants)
---------------------------------------------
570F-   A2 0C       LDX   #$0C
5711-   86 A4       STX   $A4

5713-   A0 00       LDY   #$00
5715-   8C 57 57    STY   $5757
5718-   84 A5       STY   $A5
571A-   AE 06 03    LDX   $0306      <-- SLOT
571D-   BD 8C C0    LDA   $C08C,X
5720-   10 FB       BPL   $571D
5722-   C5 A0       CMP   $A0
5724-   D0 F7       BNE   $571D
5726-   BD 8C C0    LDA   $C08C,X
5729-   10 FB       BPL   $5726
572B-   C5 A1       CMP   $A1
572D-   D0 EE       BNE   $571D
572F-   BD 8C C0    LDA   $C08C,X
5732-   10 FB       BPL   $572F
5734-   C5 A2       CMP   $A2
5736-   D0 E5       BNE   $571D
5738-   A4 A5       LDY   $A5
573A-   B9 03 57    LDA   $5703,Y
573D-   8D 58 57    STA   $5758
5740-   E6 A5       INC   $A5
5742-   BC 8C C0    LDY   $C08C,X
5745-   10 FB       BPL   $5742
5747-   B9 00 56    LDA   $5600,Y
574A-   0A          ASL   
574B-   0A          ASL   
574C-   0A          ASL   
574D-   0A          ASL   
574E-   BC 8C C0    LDY   $C08C,X
5751-   10 FB       BPL   $574E
5753-   19 00 56    ORA   $5600,Y
5756-   8D 00 FF    STA   $FF00
5759-   EE 57 57    INC   $5757
575C-   D0 E4       BNE   $5742
575E-   EE 58 57    INC   $5758
5761-   BD 8C C0    LDA   $C08C,X
5764-   10 FB       BPL   $5761
5766-   C5 A3       CMP   $A3
5768-   D0 A5       BNE   $570F
576A-   C6 A4       DEC   $A4
576C-   D0 CA       BNE   $5738
576E-   60          RTS   

----------------------------------
DEPLACE LE BRAS
----------------------------------
576F-   85 A6       STA   $A6
5771-   CD 1F 00    CMP   $001F
5774-   F0 55       BEQ   $57CB
5776-   A9 00       LDA   #$00
5778-   85 A7       STA   $A7
577A-   AD 1F 00    LDA   $001F
577D-   85 A8       STA   $A8
577F-   38          SEC   
5780-   E5 A6       SBC   $A6
5782-   F0 33       BEQ   $57B7
5784-   B0 07       BCS   $578D
5786-   49 FF       EOR   #$FF
5788-   EE 1F 00    INC   $001F
578B-   90 05       BCC   $5792
578D-   69 FE       ADC   #$FE
578F-   CE 1F 00    DEC   $001F
5792-   C5 A7       CMP   $A7
5794-   90 02       BCC   $5798
5796-   A5 A7       LDA   $A7
5798-   C9 0C       CMP   #$0C
579A-   B0 01       BCS   $579D
579C-   A8          TAY   
579D-   38          SEC   
579E-   20 BB 57    JSR   $57BB
57A1-   B9 D7 57    LDA   $57D7,Y
57A4-   20 CC 57    JSR   $57CC      <-- WAIT
57A7-   A5 A8       LDA   $A8
57A9-   18          CLC   
57AA-   20 BE 57    JSR   $57BE
57AD-   B9 E3 57    LDA   $57E3,Y
57B0-   20 CC 57    JSR   $57CC      <-- WAIT
57B3-   E6 A7       INC   $A7
57B5-   D0 C3       BNE   $577A
57B7-   20 CC 57    JSR   $57CC      <-- WAIT
57BA-   18          CLC   
57BB-   AD 1F 00    LDA   $001F
57BE-   29 03       AND   #$03
57C0-   2A          ROL   
57C1-   0D 06 03    ORA   $0306      <-- SLOT
57C4-   AA          TAX   
57C5-   BD 80 C0    LDA   $C080,X
57C8-   AE 06 03    LDX   $0306
57CB-   60          RTS   

---- WAIT
57CC-   A2 13       LDX   #$13
57CE-   CA          DEX   
57CF-   D0 FD       BNE   $57CE
57D1-   38          SEC   
57D2-   E9 01       SBC   #$01
57D4-   D0 F6       BNE   $57CC
57D6-   60          RTS   

-----------------------------
Tables de PHASEON / PHASEOFF
------------------------------
57D7-   01 30       ORA   ($30,X)
57D9-   28          PLP   
57DA-   24 20       BIT   $20
57DC-   1E 1D 1C    ASL   $1C1D,X
57DF-   1C          ???   
57E0-   1C          ???   
57E1-   1C          ???   
57E2-   1C          ???   
----------------------------
57E3-   70 2C       BVS   $5811
57E5-   26 22       ROL   $22
57E7-   1F          ???   
57E8-   1E 1D 1C    ASL   $1C1D,X
57EB-   1C          ???   
57EC-   1C          ???   
57ED-   1C          ???   
57EE-   1C          ???   
---------------------------- fin DEPLACEMENT BRAS

57EF- 00 BRK


Bon, voilà, j'espère que c'est assez clair. Il faut que je sache où le 2nd "auto-appel" de cette routine qui finit de charger la partie "code" revient au niveau du RTS... pour trouver le point d'entrée.
On peut dores et déjà démarrer le soft via un :
*B400G
Mais il faut trouver et dépiauter tous les appels au 'chargements en cours de jeu'.
Very Happy
blk
_________________
hin hin ^^


Dernière édition par blk le Jeu 28 Juil 2011, 0:13; édité 1 fois
Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé
blk



Inscrit le: 05 Sep 2007
Messages: 114
Localisation: Zimbabwé

MessagePosté le: Ven 22 Juil 2011, 9:24    Sujet du message: Répondre en citant

Fichtre, je n'ai vraiment pas de temps (même ce w.e. est pris)... du coup, Antoine va me griller.

Je peux quand même apporter un petit chouilla supplémentaire sans passer de temps sur l'apple.

J'ai repensé à un truc en bossant... le pouvoir ancestral du déplombage à l'oreille !...

On sait que la routine qui sert véritablement à charger les différentes parties se situe en $5000. On ne sait pas comment elle est appelée...

Or notre oreille nous dit qu'à chaque chargement, on a droit au "spiraling", qui produit un bruit caractéristique...
Ce spiraling sert précisément à charger la fameuse routine en $5000 qui elle, va charger les données correspondantes à un passage de paramètre.

Or qui appelle ce spiraling ?
réponse : le boot2 qui se situe entre $200 et $400.
C'est là qu'est forcément le point d'entrée pour tous les appels aux chargements.

Rappelez vous cette question laissée négligemment sur l'analyse du code :
Code:

--------------------------------
            BOOT 2
--------------------------------
0300-   4C 38 03    JMP   $0338      <-- BOOT 2+

0303-   4C A5 03    JMP   $03A5      <================== on revient ici un jour ????

0306-   60          RTS   


Eh oui, on revient ici un jour.... pour charger une image... ^^
Que fait l'adresse $03A5 ?

Code:
03A5-   A9 10       LDA   #$10      <-- (paramètre "image du temple")
03A7-   20 38 03    JSR   $0338      <-- recharge le boot 3 qui, via la lecture du spiraling recharge la routine de gestion disque (celle en $5000)
03AA-   A9 40       LDA   #$40
03AC-   85 07       STA   $07
03AE-   20 00 19    JSR   $1900      <-- ????
03B1-   AD 55 C0    LDA   $C055      <-- commute page HGR2
03B4-   A9 A0       LDA   #$A0      <-- source = $A000
03B6-   A0 20       LDY   #$20      <-- destination = $2000
03B8-   A2 20       LDX   #$20      <-- longueur = $2000
03BA-   20 C3 03    JSR   $03C3      <-- routine NETTOYAGE utilisée pour transférer une image en de $A000 vers $2000
03BD-   AD 54 C0    LDA   $C054      <-- commute page HGR1
03C0-   A9 00       LDA   #$00
03C2-   60          RTS   


Le point commun à tout cela ? :
"JSR $0338"
L'adresse $0338 semble être le point d'entrée.
Donc pour s'économiser des efforts, va falloir tenter d'injecter la nouvelle routine de chargement des images dans le coin...
Donc, il est maintenant inutile de chercher les appels aux chargements dans le code du jeu, car il est presque sûr que ces appels vont mener à $0338.

have fun.
blk.
Wink
_________________
hin hin ^^
Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé
toinet
Site Admin


Inscrit le: 15 Juin 2007
Messages: 3043
Localisation: Le Chesnay, France

MessagePosté le: Ven 22 Juil 2011, 9:34    Sujet du message: Répondre en citant

Pour savoir comment on boucle, à mon avis, il faut probablement regarder le double PLA en $5020.

Je te rejoins entièrement sur la déplombe à l'oreille. Quoi que l'on fasse, on revient dans le code à partir de $0200 qui charge $4000 qui charge $5000 qui charge ce qui va bien.

Cela peut être la réponse,
antoine
Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web de l'utilisateur
blk



Inscrit le: 05 Sep 2007
Messages: 114
Localisation: Zimbabwé

MessagePosté le: Ven 22 Juil 2011, 10:49    Sujet du message: Répondre en citant

Uh uh ^^
En fait, ça se comprend que la routine de gestion du disque située en $5000 nécessite d'être rechargée...
Comme elle est située en page HGR2 et que le déroulement du jeu utilise les 2 pages HGR (pour éviter le scintillement) en basculant d'une à l'autre, ce code est écrasé.
Smile
Le fait de dédier la partie de la protection la plus difficile à copier (le spiraling) à ce re-chargement de la routine principale d'accès disque est plutôt malin ^^ sans ce truc, le jeu ne peut pas aller bien loin..

C'était cool les années 80...
Wink
_________________
hin hin ^^
Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé
toinet
Site Admin


Inscrit le: 15 Juin 2007
Messages: 3043
Localisation: Le Chesnay, France

MessagePosté le: Ven 22 Juil 2011, 12:50    Sujet du message: Répondre en citant

blk a écrit:
Uh uh ^^
En fait, ça se comprend que la routine de gestion du disque située en $5000 nécessite d'être rechargée...
Comme elle est située en page HGR2 et que le déroulement du jeu utilise les 2 pages HGR (pour éviter le scintillement) en basculant d'une à l'autre, ce code est écrasé.
Smile

Oui, exact. Ce jeu est génial !

blk a écrit:
Le fait de dédier la partie de la protection la plus difficile à copier (le spiraling) à ce re-chargement de la routine principale d'accès disque est plutôt malin ^^ sans ce truc, le jeu ne peut pas aller bien loin..

C'était cool les années 80...
Wink

Je ne l'avais pas regardé sous cet angle-là mais tu as très probablement (pour ne pas écrire certainement) raison.

La question que je me pose : a-t-on réellement besoin de charger la piste 1 en $4000. Ne peut-on pas passer directement par le chargement de la piste 2 en $5000 ? Et même, ne peut-on pas enlever le chargement de $5000 pour charger directement la partie de jeu qui va bien ?

Je pense qu'il faut analyser le niveau de garbage que l'on a dans la zone $0200..$07FF et voir si on a la place d'avoir la routine de chargement, les données de chargement, la table de denibblization dans cet espace.

Antoine
Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web de l'utilisateur
blk



Inscrit le: 05 Sep 2007
Messages: 114
Localisation: Zimbabwé

MessagePosté le: Ven 22 Juil 2011, 19:24    Sujet du message: Répondre en citant

Coucou ^^
Je suppose qu'on pourrait se passer de recharger le tout en $4000 et $5000, mais il faut voir la place que prendrait la routine de chargement des 12 secteurs / track... je n'ai pas eu le temps de compter tout ça.
Au pire, il y aurait peut-être moyen d'exploiter la routine du contrôleur en $c65c (si ma mémoire est bonne) pour faire le boulot... en prenant soin de lui reconstruire une table de dénibbilisation au préalable...
Rolling Eyes
Ca reste à tester, bien sûr ...
_________________
hin hin ^^
Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé
blk



Inscrit le: 05 Sep 2007
Messages: 114
Localisation: Zimbabwé

MessagePosté le: Mar 26 Juil 2011, 23:13    Sujet du message: Répondre en citant

Coucou Smile

Je reviens après qu'Antoine ait fini son crack... très propre et méticuleux.

J'ai fini aussi, avec quelques différences...
- Le crack ne tourne (exprès) que sur les "vrais" apple II (][ et //e), pas sur les //c ni les IIgs !

- je ne recharge pas tous les stades de boot comme le fait apparemment Antoine... je n'avais pas envie de substituer la routine en 4&4 par une routine en 6&2 pour tous les stades de chargement... pas assez crado comme méthode...
Wink

Il me reste à mettre en ligne tout ce bazar, et j'ai vraiment pas le temps, donc ça va venir.... bientôt.
_________________
hin hin ^^
Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé
toinet
Site Admin


Inscrit le: 15 Juin 2007
Messages: 3043
Localisation: Le Chesnay, France

MessagePosté le: Mer 27 Juil 2011, 4:15    Sujet du message: Répondre en citant

blk a écrit:
Coucou Smile

Je reviens après qu'Antoine ait fini son crack... très propre et méticuleux.

J'ai fini aussi, avec quelques différences...
- Le crack ne tourne (exprès) que sur les "vrais" apple II (][ et //e), pas sur les //c ni les IIgs !

- je ne recharge pas tous les stades de boot comme le fait apparemment Antoine... je n'avais pas envie de substituer la routine en 4&4 par une routine en 6&2 pour tous les stades de chargement... pas assez crado comme méthode...
Wink

Il me reste à mettre en ligne tout ce bazar, et j'ai vraiment pas le temps, donc ça va venir.... bientôt.


C'est marrant, je me suis levé à 4h30 en me disant que ce chargement en $4000 (phase 2 ou piste 1) était inutile et je vois que je ne suis pas le seul à le penser Wink

Pourquoi ton crack ne tourne que sur les vrais Apple II ? As-tu viré sa vérif de machine et gardé le SW VBL qui va bien ?

av
Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web de l'utilisateur
blk



Inscrit le: 05 Sep 2007
Messages: 114
Localisation: Zimbabwé

MessagePosté le: Mer 27 Juil 2011, 23:42    Sujet du message: Répondre en citant

Bonsoir tout le monde.
Cette fois je prends le temps de tout poster...
Wink

Si mon crack ne tourne que sur les appleII et IIe, c'est parce que la rom du contrôleur diskII est différente sur les //c et IIgs.
Je trouvais l'idée marrante de l'utiliser afin de réserver cette version (bonus) aux vrais apple de ma prime jeunesse.

Mon approche sur la réorganisation de la disquette est évidemment identique à celle d'Antoine, que je remercie d'avoir fait le boulot, ça m'a évité de faire chauffer la RWTS pour faire la même chose.

Je suis donc parti de la routine suivante (boot 2) à modifier, afin d'en laisser le maximum intact :
En effet, le Boot 0 et le boot 1 pouvant être évités, je me suis dit qu'on pouvait simplement remettre le boot 2 en ram dès la phase de boot0, et en en modifiant un minimum...

Voici donc le boot0 qui remet "en place" la zone $0200-07ff, légèrement modifiée, et accolée sur les 6 secteurs suivants...
Le code saute alors en $0300, avec le paramètre #$80 dans l'accumulateur (comme l'original).
Code:

       .files BIN = 256   ; impératif pour générer le code
         .ORG   $0800
      
      .by $07      ; charger 7 secteurs au boot
   
;---------------------------------------
; la super signature + vidage HGR : lol
;---------------------------------------
      JSR $FC58      ; coup d'éponge....
      LDX #$00
PROUT   LDA LOL,X
      BEQ STOP
      STA $0400,X
      JSR BEEP      ; vide la page HGR et fait un vieux bruit
      INX
      JMP PROUT
   
STOP   LDA #$50
      JSR $FCA8
      DEC STOP+1
      BPL STOP
      DEC STOP+1
      BPL STOP
      
      STA $C057
      STA $C054
      STA $C050
      JSR MOVE
      
      ; vidage zone d'échange et PZ - ça fait pas de mal
      LDX #$00
      TXA
L1      STA $4F00,X
      STA $00,X
      INX
      BNE L1
      ;-----------
      
      LDA #$80
      JMP $0300      ; saute au jeu pour de vrai
      
BEEP   LDA #$40
      CMP VIDE+2
      BEQ RETOUR
      LDA #$00
      TAY
VIDE   STA $2000,Y
      INY
      BNE VIDE
      STA $C030
      INC VIDE+2
RETOUR   RTS

; maintenant qu'on est passé en HGR propre, on peut pourrir la page Text
; hop, on déplace les données vers la zone originelle : $0200 <-> $7ff

MOVE   LDX #$00
TOTO   LDA $0900,X
      STA $0200,X
      LDA $0A00,X
      STA $0300,X
      LDA $0B00,X
      STA $0400,X
      LDA $0C00,X
      STA $0500,X
      LDA $0D00,X
      STA $0600,X
      LDA $0E00,X
      STA $0700,X
      INX
      BNE TOTO
      ; fin du move
      RTS
      
LOL      .TEXT    "   (K) COCHONOU CRACK BAND 2011 (ARF !) "
      .BYTE   $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
.end


La routine en $300 est à peine modifiée, j'ai simplement injecté ce code à l'adresse $342.
Elle occupe l'espace pile poil de $342 à $392 : je n'avais que $50 octets d'utilisables pour caser cette routine, c'était rigolo.
Son mode de fonctionnement :
Elle recopie la rom contenue en $c600 vers l'adresse $4000 et modifie cette routine pour lui faire charger l'intégralité de la routine de $5000 à $5800, qui est la nouvelle routine de chargement des secteurs en 6&2 de Karateka...

Code:

 .files BIN=256   ; impératif pour générer le code hexa
 .ORG $0342
 
 ; On recommence... à un octet près ma précédente routine ne passait pas...
 ; O_o"
 ; recopie de la rom disque vers $1000
         ldx #$00
loop1                   lda $c600,x
         sta $4000,x
         dex
         bne loop1
         lda #$0A      ; secteur de départ voulu = 0A (de $0A à $0F)
         sta $3D      ; le mettre ici... pour la routine de ROM
                                                ; modification de la routine recopiée
                                                ; saute le recalibrage
boucle      lda table,x
         beq saut   ; fini
         pha         ; sauve l'opcode
         inx
         lda table,x   ; prend l'index
         tay         ; le passe à y
         pla         ; récupère l'opcode
         sta $4000,Y   ; modifie la routine
         inx
         bne boucle
         
      ; table des octets à modifier sur la routine en $c600
      ;   Valeur | Index
table                   .by $4c,$3d
         .by $a9,$2a
         .by $60,$2b
         .by $4a,$3e
         .by $40,$3f
         .by $50,$59
         .by $50,$f3
         .by $43,$1c
         .by $43,$e0
         .by $43,$e4
         .by $43,$b7
         .by $42,$b1
         .by $42,$c3
         .by $42,$d2
         .by $ea,$54
         .by $ea,$55
         .by $60,$f8
         .by $00,$00

saut      jsr $4000      ; on saute au chargement de la routine qui se trouvera en $5000...
         ; le 1er octet du premier secteur de cette routine contient le n° de secteur final
         ; ça tombe bien, c'est #$10 (évidemment)
         nop
         nop
         nop         ; j'ai même du rab de place
         nop
         nop
         pla         ; le boot suivant est chargé en $5000
         jsr $5000
         .end

_________________
hin hin ^^
Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé
blk



Inscrit le: 05 Sep 2007
Messages: 114
Localisation: Zimbabwé

MessagePosté le: Mer 27 Juil 2011, 23:52    Sujet du message: Répondre en citant

La routine de chargement qui a été modifiée se situe en $5000, comme la routine originale.
(au passage, voici l'image disque)
http://download3.mediafire.com/io7554dayorg/ktyr81vipelemgm/KARATEKA_CCB.zip

Cette routine contient un petit BONUS pour tous ceux qui trouvent le jeu trop dur, et qui veulent le parcourir aisément sans trop se fatiguer (faites-le, vous pourrez profiter de la fin qui m'a fait exploser de rire (séquence souvenir oublié et génial !)).
J'ai ajouté un PATCH (lors boot, il suffit de presser la touche "P" (une fois, c'est suffisant)). Si vous entendez un petit "pouet" au bout de qques secondes, c'est que le patch est actif.
Wink

Voici donc la routine en question :
Code:

VAL1    .equ $5700
VAL2    .equ $5701
BUFFER     .equ $5800
BASEL     .equ $B0
BASEH     .equ $B1
TRYNUM     .equ $5702
SECTOR    .equ $5705      ; 2eme valeur des 3 récupérées pour le chksum
CHECKSUM .equ $5704



       .files BIN = 6*256   ; impératif pour générer le code
         .ORG   $5000


;----------------------------------------
; A : négatif si premier chgt
; A : positif les fois suivantes
;----------------------------------------
; Y = index de la table qui correspond à ce qu'il faut charger
;----------------------------------------

L5000    BPL L5005      ; positif ?
         JMP L5300      ; sinon Premier chgt
             
L5005    CMP #$10
         BEQ L5014
         ASL
         ASL
         ASL
         ADC #$0E
         LDY #$30
         JMP L501D
             
SLOT16   .BY $60
             
L5014    LDA #$08
         LDY #$00
       STY $1F      ; force le track 0
         NOP
         NOP
         NOP
L501D    LDX #$00
       STX $1F      ; force le track 0
       JSR GO
         PLA
       PLA
;--------------------
; restore la PZ
;--------------------
      LDX #$00
TOTO   LDA $4F00,X
      STA $00,X
      INX
      BNE TOTO

      LDY #$00
      LDA #$40
      LDX #$20
      STY $3C
      STA $3D
      LDA #$00
TOTO1   LDY #$78
TOTO2   STA ($3C),Y
      INY
      BPL TOTO2
      LDY #$F8
TOTO3   STA ($3C),Y
      INY
      BNE TOTO3
      INC $3D
      DEX
      BNE TOTO1
      LDA #$00
      RTS
;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX             
             
;------------------------------------
; premier chgt
;------------------------------------
L5300    LDX #$FF       ; réinit la pile
         TXS
         LDY #$70       ; index = $70
         LDA #$36       ; phase = $36
         JSR GO
         
       LDX #$00
       TXA
YOUPI    STA $00,X
       INX
       BNE YOUPI
;-------------------------------------
; PATCH DU JEU SI L'ON APPUIE SUR "P" (comme patch"
;-------------------------------------
      pha
      LDA $c000
      cmp #$D0   ; P ?, alors patche-le
      BEQ patch      ; invincible
      jmp _fin
;-----------      
patch   lda #$4C    ; vie bloquée au max
      sta $0bc9
      lda #$d1
      sta $0bca
      lda #$0b
      sta $0bcb
;------------
      lda #$EA   ; on tue l'ennemi en 1 coup :D
      sta $0bda      
      sta $0bdb
;------------
; POUET
;------------
pouet   bit $c010   ; reset key
      txa         ; sauve X
      pha
      tya
      pha
      ldy #$70
_loop2   tya
      tax
      sta $c030
_loop   nop
      nop
      dex
      bne _loop
      dey
      bne _loop2
      pla
      tay
      pla
      tax         ; remet tout en place
_fin   pla

       LDA #$01
       STA $86
       STA $4F
       LDA #$0
       STA $D0
       LDA #$FF
       STA $D2
       JMP $0200
;XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX               
           
           
;--------------------------------------------------------------
; Y=$00
; A=$10
table    .BY $A0,$A1,$A2,$A3,$A4,$A5,$A6,$A7,$A8,$A9,$AA,$AB
         .BY $AC,$AD,$AE,$AF,$B0,$B1,$B2,$B3,$B4,$B5,$B6,$B7
         .BY $B8,$B9,$BA,$BB,$BC,$BD,$BE,$BF,$40,$40,$40,$40
         .BY $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
;--------------------------------------------------------------      
; Y=$30
; A=A*8+$0E
         .BY $10,$11,$12,$13,$14,$15,$16,$17,$18,$19,$1A,$1B
         .BY $1C,$1D,$1E,$1F,$A0,$A1,$A2,$A3,$A4,$A5,$A6,$A7
         .BY $A8,$A9,$AA,$AB,$AC,$AD,$AE,$AF,$B0,$B1,$B2,$B3
         .BY $B4,$B5,$B6,$B7,$B8,$B9,$BA,$BB,$BC,$BD,$BE,$BF
         .BY $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
         .BY $00,$00,$00,$00
;--------------------------------------------------------------      
; Y=$70
; A=$36
         .BY $08,$09,$0A,$0B,$0C,$0D,$0E,$0F,$60,$61,$62,$63
         .BY $64,$65,$66,$67,$68,$69,$6A,$6B,$6C,$6D,$6E,$6F
         .BY $70,$71,$72,$73,$74,$75,$76,$77,$78,$79,$7A,$7B
         .BY $7C,$7D,$7E,$7F,$80,$81,$82,$83,$84,$85,$86,$87
         .BY $88,$89,$8A,$8B,$8C,$8D,$8E,$8F,$90,$91,$92,$93
         .BY $94,$95,$96,$97,$98,$99,$9A,$9B,$9C,$9D,$9E,$9F
         .BY $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
         .BY $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
         .BY $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
         .BY $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
         .BY $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
         .BY $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00
;--------------------------------------------------------------
;
;

GO       PHA               ; phase
         STY $88           ; index
         JSR BRAS
             
         LDX #$00          ; Copy load table
         LDY $88
L550A    LDA table,Y
         STA MiniTable,X
         INY
         INX
         CPX #$0C         ; 12 ?
         BCC L550A
             
         JSR LOAD            ; charge la piste (12 sects)
             
         LDA $88       
         CLC
         ADC #$0C           ; augmente l'index de +12 secteurs
         TAY
         LDA table,Y       ; Jusqu'au marqueur de fin ($00)
         BEQ Stop
         PLA
         CLC
         ADC #$02          ; ajoute une piste (2 phases)
         BNE GO
             
Stop     LDA #$00          ; Revient en piste 0 (phase 0)
         JSR BRAS
         LDX SLOT16
         LDA $C088,X        ; éteint le moteur
         PLA
         RTS               ; fini
             

BRAS     JMP BougeBras      ; wrapper 1er appel

MiniTable .BY $00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00,$00



;******************************************************
; charge une piste complète (12 secteurs)
;******************************************************
LOAD     LDX #$0B          ; 12 sects (de $0b à $00 inclus) = 12 pages RAM
         STX $A4           ; n° de secteur à charger
         LDY #$00          ; adresse basse
         STY Adresse+1
           
           
LOOP     LDY $A4           ; n° de secteur & index page RAM
         LDA MiniTable,Y   ; récupère l'adresse pour le secteur en cours
         STA Adresse+2      ; la stocke
             
       JSR RdSect         ; lit le secteur ($a4) dans le buffer $5600
           
       LDX #$00          ; 256 octets = 1 sect
GetByte  LDA $5600,X      ; l'adresse du buffer pour le secteur lu ne bouge pas
Adresse  STA $FF00,X      ; adresse qui stocke en RAM les données lues...
       INX
         BNE GetByte      ; adresse basse +1
             
; on a fait un secteur
             
         DEC  $A4         ; décrémente le n° de secteur à charger
         BPL  LOOP         ; supérieur ou égal à 0 ? on boucle
         RTS            ; track fini
             
;---------------------------------
; Routine de déplacement du bras
;---------------------------------
BougeBras    STA $A6
          CMP $001F
          BEQ L57CB
          LDA #$00
          STA $A7
L577A        LDA $001F
          STA $A8
          SEC
          SBC $A6
          BEQ L57B7
          BCS L578D
          EOR #$FF
          INC $001F
          BCC L5792
L578D        ADC #$FE
          DEC $001F
L5792        CMP $A7
          BCC L5798
          LDA $A7
L5798        CMP #$0C
          BCS L579D
          TAY
L579D        SEC
          JSR L57BB
          LDA PhasON,Y
          JSR WAIT
          LDA $A8
          CLC
          JSR L57BE
          LDA PhasOFF,Y
          JSR WAIT
          INC $A7
          BNE L577A
L57B7        JSR WAIT
          CLC
L57BB        LDA $001F
L57BE        AND #$03
          ROL
          ORA SLOT16
          TAX
          LDA $C080,X
          LDX SLOT16
L57CB        RTS
                 
WAIT        LDX #$13
L57CE        DEX
          BNE L57CE
          SEC
          SBC #$01
          BNE WAIT
          RTS
                 
PhasON        .BY $01,$30,$28,$24,$20,$1E,$1D,$1C,$1C,$1C,$1C,$1C
PhasOFF        .BY $70,$2C,$26,$22,$1F,$1E,$1D,$1C,$1C,$1C,$1C,$1C

;---------------------------------------------------------------
; routine de lecture du secteur contenu à l'adresse $A4
;---------------------------------------------------------------
; ici, on doit charger le secteur concerné (dans $A4)
; choisir un buffer du genre $5600   

RdSect        LDA #$40          ; 4 x 16 essais
          STA TRYNUM
DECR        DEC TRYNUM
          BEQ ERR
          JSR READ          ; Lecture champs d'adresse
          BCS DECR
          LDX SECTOR       ; récupère le n° de secteur
          LDA TSECT,X      ; récupère le n° de secteur logique
          CMP $A4         ; celui recherché ?
          BNE DECR         ; pas le bon secteur : berk
          LDA #$56         ; adresse d'implantation = $5600
          STA BASEH        ; hop ! on va charger le bestiau en $5600
          LDA #$00
          STA BASEL         ; normal.....
          JSR LDSECTOR       ; ON LE CHARGE ... (lit les données du secteur en question)
          BCS DECR         ; si erreur
          CLC             ; ok, bien
          RTS
         
ERR        SEC              ; erf :/
          RTS


;---------------------------------------------------------------
; routine du champs d'adresse
;---------------------------------------------------------------
READ       LDX #$FC ; 4 TENTATIVES
          STX VAL1
INCR       INX
          BNE READ1
          INC VAL1
          BEQ ERROR
READ1       LDA $C0EC
          BPL READ1
R1          CMP #$D5
          BNE INCR
          BIT $FFFF
R2          LDA $C0EC
          BPL R2
          CMP #$AA
          BNE R1
          LDX #$03   ; lecture des infos + chksum
R3          LDA $C0EC
          BPL R3
          CMP #$96
          BNE R1
          LDA #$00
R4           STA VAL2
R5           LDA $C0EC
          BPL R5
          ROL
          STA VAL1
R6           LDA $C0EC
          BPL R6
          AND VAL1
          STA CHECKSUM,X
          EOR VAL2
          DEX
          BPL R4
          TAX
          BNE ERROR
R7           LDA $C0EC
          BPL R7
          CMP #$DE
          BNE ERROR
          BIT $FFFF
R8          LDA $C0EC
          BPL R8
          CMP #$AA
          BNE ERROR
          CLC
          RTS
ERROR       SEC
          RTS
         
         
;---------------------------------------------------------------
; routine de lecture d'un secteur (data field)
;---------------------------------------------------------------
LDSECTOR    LDA #$00
          LDY BASEH
          STA POS3+1
          STY POS3+2
          DEY
          LDA #$56+$56
          STA POS2+1
          STY POS2+2
          LDA #$56-$01
          STA POS1+1
          STY POS1+2
         
          LDX #$20 ; NOMBRE D'ESSAIS
DECR1        DEX
          BEQ ERROR
LDS1        LDA $C0EC
          BPL LDS1
LDS2        CMP #$D5
          BNE DECR1
          BIT $FFFF
LDS3        LDA $C0EC
          BPL LDS3
          CMP #$AA
          BNE LDS2
          BIT $FFFF
LDS4        LDA $C0EC
          BPL LDS4
          CMP #$AD
          BNE LDS2
          LDY #$100-$56
          LDA #$00
LDS5        STA VAL1
LDS6        LDX $C0EC
          BPL LDS6
          LDA _table-$96,X
          STA BUFFER,Y
          EOR VAL1
          INY
          BNE LDS5
          LDY #$100-$56
          BNE LDS7
POS1        STA POS1,Y ; DE ADR A ADR+$55
LDS7        LDX $C0EC
          BPL LDS7
          EOR _table-$96,X
          LDX BUFFER,Y
          EOR _table1,X
          INY
          BNE POS1
          PHA
          AND #%11111100
          LDY #$100-$56
LDS8        LDX $C0EC
          BPL LDS8
          EOR _table-$96,X
          LDX BUFFER,Y
          EOR _table2,X
POS2        STA POS2,Y
          INY
          BNE LDS8
LDS9        LDX $C0EC
          BPL LDS9
          AND #%11111100
          LDY #$100-$56+$02
LDS10        EOR _table-$96,X
          LDX BUFFER-$02,Y
          EOR _table3,X
POS3        STA POS3,Y
LDS11        LDX $C0EC
          BPL LDS11
          INY
          BNE LDS10
          AND #%11111100
          EOR _table-$96,X
          TAX
          BNE PB
V1           LDA $C0EC
          BPL V1
          CMP #$DE
          BEQ NOPB
PB           SEC
          .BY $24 ; BIT qui inhibe le CLC suivant ^^
NOPB        CLC
          PLA
          LDY #$56-$01
          STA (BASEL),Y
          RTS

         
;---------------------------------------------------------------
; Tables décodage
;---------------------------------------------------------------
_table        .BY $00,$04,$98,$99,$08,$0C
          .BY $9C,$10,$14,$18,$A0,$A1
          .BY $A2,$A3,$A4,$A5,$1C,$20
          .BY $A8,$A9,$AA,$24,$28,$2C
          .BY $30,$34,$B0,$B1,$38,$3C
          .BY $40,$44,$48,$4C,$B8,$50
          .BY $54,$58,$5C,$60,$64,$68
          .BY $C0,$C1,$C2,$C3,$C4,$C5
          .BY $C6,$C7,$C8,$C9,$CA,$6C
          .BY $CC,$70,$74,$78,$D0,$D1
          .BY $D2,$7C,$D4,$D5,$80,$84
          .BY $D8,$88,$8C,$90,$94,$98
          .BY $9C,$A0,$E0,$E1,$E2,$E3
          .BY $E4,$A4,$A8,$AC,$E8,$B0
          .BY $B4,$B8,$BC,$C0,$C4,$C8
          .BY $F0,$F1,$CC,$D0,$D4,$D8
          .BY $DC,$E0,$F8,$E4,$E8,$EC
          .BY $F0,$F4,$F8,$FC
         
_table1     .BY 0
_table2       .BY 0
_table3     .BY 0
          .BY 0
          .BY 2,0,0,0,1,0,0,0
          .BY 3,0,0,0,0,2,0,0
          .BY 2,2,0,0,1,2,0,0
          .BY 3,2,0,0,0,1,0,0
          .BY 2,1,0,0,1,1,0,0
          .BY 3,1,0,0,0,3,0,0
          .BY 2,3,0,0,1,3,0,0
          .BY 3,3,0,0,0,0,2,0
          .BY 2,0,2,0,1,0,2,0
          .BY 3,0,2,0,0,2,2,0
          .BY 2,2,2,0,1,2,2,0
          .BY 3,2,2,0,0,1,2,0
          .BY 2,1,2,0,1,1,2,0
          .BY 3,1,2,0,0,3,2,0
          .BY 2,3,2,0,1,3,2,0
          .BY 3,3,2,0,0,0,1,0
          .BY 2,0,1,0,1,0,1,0
          .BY 3,0,1,0,0,2,1,0
          .BY 2,2,1,0,1,2,1,0
          .BY 3,2,1,0,0,1,1,0
          .BY 2,1,1,0,1,1,1,0
          .BY 3,1,1,0,0,3,1,0
          .BY 2,3,1,0,1,3,1,0
          .BY 3,3,1,0,0,0,3,0
          .BY 2,0,3,0,1,0,3,0
          .BY 3,0,3,0,0,2,3,0
          .BY 2,2,3,0,1,2,3,0
          .BY 3,2,3,0,0,1,3,0
          .BY 2,1,3,0,1,1,3,0
          .BY 3,1,3,0,0,3,3,0
          .BY 2,3,3,0,1,3,3,0
          .BY 3,3,3,0
         
TSECT             .BY $00,$07,$0E,$06,$0D
          .BY $05,$0C,$04,$0B,$03
          .BY $0A,$02,$09,$01,$08,$0F
.end


Désolé si tout n'est pas bien aligné, mon éditeur de texte s'en charge bien, mais en copié/collé ici, c'est pas super beau...
:'(

Bon, j'espère que mon petit patch fera quelques heureux.
Very Happy
_________________
hin hin ^^
Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé
toinet
Site Admin


Inscrit le: 15 Juin 2007
Messages: 3043
Localisation: Le Chesnay, France

MessagePosté le: Jeu 28 Juil 2011, 6:26    Sujet du message: Répondre en citant

Super idée le patch ! Bien joué.

J'espérais chercher les vies infinies et tout et tout afin de tester mon crack jusqu'au bout (et courir délivrer la princesse)

Promis, j'y joue ce soir. Ah zut, c'est pas pour //gs tu as dit... je vais voir comment je peux faire...

av
Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web de l'utilisateur
flaith



Inscrit le: 30 Aoû 2007
Messages: 192
Localisation: $300:20 58 FC 60 N 300G => Vietnam

MessagePosté le: Jeu 28 Juil 2011, 8:11    Sujet du message: Répondre en citant

Excellent le patch, merci Very Happy
_________________
Je suis sur de "rien", mais ne je suis pas sur du "tout".
Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web de l'utilisateur
amauget



Inscrit le: 06 Déc 2009
Messages: 962
Localisation: Nantes

MessagePosté le: Jeu 28 Juil 2011, 20:52    Sujet du message: Répondre en citant

blk a écrit:
Cette routine contient un petit BONUS pour tous ceux qui trouvent le jeu trop dur, et qui veulent le parcourir aisément sans trop se fatiguer (faites-le, vous pourrez profiter de la fin qui m'a fait exploser de rire (séquence souvenir oublié et génial !)).
Super le patch Cool Ca se finit aussi sans Very Happy
As-tu vu les deux fins possibles ?
_________________
Antony
Apple II forever
Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé
toinet
Site Admin


Inscrit le: 15 Juin 2007
Messages: 3043
Localisation: Le Chesnay, France

MessagePosté le: Jeu 28 Juil 2011, 22:30    Sujet du message: Répondre en citant

amauget a écrit:
blk a écrit:
Cette routine contient un petit BONUS pour tous ceux qui trouvent le jeu trop dur, et qui veulent le parcourir aisément sans trop se fatiguer (faites-le, vous pourrez profiter de la fin qui m'a fait exploser de rire (séquence souvenir oublié et génial !)).
Super le patch Cool Ca se finit aussi sans Very Happy
As-tu vu les deux fins possibles ?


j'm'suis fait ni.... par l'oiseau, sale bête, vivement le patch ! je regarderai si je peux l'appliquer dans ma version,
av
Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé Visiter le site web de l'utilisateur
blk



Inscrit le: 05 Sep 2007
Messages: 114
Localisation: Zimbabwé

MessagePosté le: Jeu 28 Juil 2011, 22:50    Sujet du message: Répondre en citant

La fin qui bien m'a fait marrer, c'est la plus 'percussive' des deux Wink
C'est d'autant plus vrai que j'avais oublié ce truc... excellent !

Antoine, pour le patch, tu peux le modifier "à la main" sous applewin, dans le debugger... pour finir rapidement le jeu : ça prend 2 secondes.
Smile
Sinon, ma version tourne sous applewin aussi.... en mode apple //e...
Rolling Eyes
_________________
hin hin ^^
Revenir en haut de page
Voir le profil de l'utilisateur Envoyer un message privé
Montrer les messages depuis:   
Poster un nouveau sujet   Répondre au sujet     Index du Forum -> PROTECTION MALEFIQUE Toutes les heures sont au format GMT + 1 Heure
Aller à la page 1, 2  Suivante
Page 1 sur 2

 
Sauter vers:  
Vous ne pouvez pas poster de nouveaux sujets dans ce forum
Vous ne pouvez pas répondre aux sujets dans ce forum
Vous ne pouvez pas éditer vos messages dans ce forum
Vous ne pouvez pas supprimer vos messages dans ce forum
Vous ne pouvez pas voter dans les sondages de ce forum


Powered by phpBB © 2001, 2005 phpBB Group
Traduction par : phpBB-fr.com