Allez, je vous met ici un post que j'ai commencé dans un autre forum de reprog. la prochaine fois, ca sera moins technique, je vous mettrais des photos de maps
Voici un autre methode de recheche de map que je vais utiliser pour sortir mes maps. J'ai deja commencé et ca donne de très bons resultats
Le but est d'obtenir un fichier complet incluant le code + les données pour les maps et de passer tout ca au desassembleur.
En desassemblant, le desassembleur va positionner des étiquettes sur les adresses de base des maps et des variables dans la zone de data et grace au code assembleur on peut mieux comprendre ce que le calculateur fait (bon ok, pas toujours facile)
Je suis parti d'un calculateur IAW48P2 qui est celui utilisé dans ma 206S16 et que je voudrais reprogrammer au final mais adapté a quelques modifications (par exemple en mettant une admission de 206RC et donc surement en modifiant une map de pression d'admission ou MAF que je n'ai pas encore trouvé)
EPISODE 0 : Architecture software du calculateur
$00000 - $01FFF :
- Initialisation des variables et des registres du microcontrolleur
- Calcul des CRC
- Vide a partir de $1BE4
$02000 - $04000 :
- Creation de buffers pour les echanges CAN
- Vide a partir de $37B8
$04000 - $07FFF
- Données ??
$08000 - $5FFFF
- Initialisation de variables et registres
- Fonctions calculateur
- Calcul des maps
- ... ?
- Vide a partir de $33E68
- Checksum de cette partie en $5FFFC
$60000 - $6FFFF- Partie data avec les maps
- Checksum en $6FFF8
$70000 - $7FFFF
- Reset
- Initialisation de la RAM et registres
- Appel de fonctions
- Vide a partir de $704E2
EPISODE 1 : Le checksum de la zone data (maps)
Positionné en $6FFF8 sur 4 bytes
ROM:0006FFF8 word_6FFF8: dc.w $AA8D ; DATA XREF: sub_C22+36r
ROM:0006FFFA dc.b $55 ; U
ROM:0006FFFB unk_6FFFB: dc.b $72 ; r ; DATA XREF: sub_53A+3Ao
=> Cette étiquette est utilisée en sub_C22+36 donc je suppose que le calcul de CRC se trouve a cet endroit et effectivement !
ROM:00000C46 move.l #unk_6FFFB,-(sp)
ROM:00000C4C move.l #byte_60000,-(sp)
ROM:00000C52 jsr sub_76C
ROM:00000C56 move.w d0,d2
ROM:00000C58 cmp.w (word_6FFF8).l,d2
=> Le CRC est donc calculé de $60000 a $6FFFB (donc incluant le Checksum lui même !!) et comparé au contenu stocké en $6FFF8 sur 2 bytes (et non sur 4).
En regardant de plus prêt on voit que le CRC est $AA8D et les 2 suivant $55$72. En fait c'est l'inverse du Checksum : $55 = ~$AA et $72 = ~$8D
On voit aussi que la routine de calcul est appelée en sub_76C
ROM:0000076C sub_76C: ; CODE XREF: sub_A8A+130p
ROM:0000076C ; sub_C22+14p ...
ROM:0000076C
ROM:0000076C arg_0 = 4
ROM:0000076C arg_4 = 8
ROM:0000076C
ROM:0000076C move.l d7,-(sp)
ROM:0000076E move.l 4+arg_4(sp),d0
ROM:00000772 clr.w d1
ROM:00000774 move.l 4+arg_0(sp),d7
ROM:00000778 movea.l d7,a4
ROM:0000077A bra.s loc_792
ROM:0000077C ; ---------------------------------------------------------------------------
ROM:0000077C
ROM:0000077C loc_77C: ; CODE XREF: sub_76C+2Aj
ROM:0000077C move.b #$55,($FFFA27).l ; 'U'
ROM:00000784 move.b #$AA,($FFFA27).l
ROM:0000078C clr.l d7
ROM:0000078E move.b (a4)+,d7
ROM:00000790 add.w d7,d1
ROM:00000792
ROM:00000792 loc_792: ; CODE XREF: sub_76C+Ej
ROM:00000792 move.l a4,d7
ROM:00000794 cmp.l d0,d7
ROM:00000796 bls.s loc_77C
ROM:00000798 move.w d1,d0
ROM:0000079A move.l (sp)+,d7
ROM:0000079C rts
ROM:0000079C ; End of function sub_76C
=> Pendant le calcul, le $55 et $AA en FFFA27 est la remise a 0 du watchdog. et on voit ensuite que chaque byte stocké en A4 avec A4=A4+1 a chaque tour est additionné dans un WORD (16 bits) donc c'est un checksum byte a byte stocké sur 16 bits
Voila pour vérifier le Checksum !!
Pour le regénérer, il faut que l'addition des 4 bytes de checksum donne $1FE.
Donc :
Checksum en 6FFF8 sur 2 bytes = (Addition entre $60000 a $6FFF7) + 1FE = A88F + 1FE = $AA8D
Checksum en 6FFFA sur 2 bytes = Inverse du word precedent = ~$AA8D = $5572
:):)
EPISODE 2 : Le rupteur
Sur la 206S16 il est limité a 6550 tr/min et 6550 = $1996 donc je cherche cette valeur dans la zone data
ROM:000628FE word_628FE: dc.w $1996 ; DATA XREF: sub_18BC4+202r
ROM:00062900 dc.b $19
ROM:00062901 dc.b $96 ; û
ROM:00062902 dc.b $19
ROM:00062903 dc.b $96 ; û
ROM:00062904 dc.b $19
ROM:00062905 dc.b $96 ; û
ROM:00062906 dc.b $19
ROM:00062907 dc.b $96 ; û
ROM:00062908 dc.b $19
ROM:00062909 dc.b $96 ; û
ROM:0006290A dc.b $19
ROM:0006290B dc.b $96 ; û
Paf! il est copié plein de fois ... pourquoi ??? ca serait pour regler le rupteur en fonction de la vitesse ? en tout cas, c'est géré en sub_18BC4+202. alors voir ca :
=>
ROM:00018DC0 loc_18DC0: ; CODE XREF: sub_18BC4+1ECj
ROM:00018DC0 ; sub_18BC4+1F4j
ROM:00018DC0 clr.l d1
ROM:00018DC2 move.w $1068(a5),d1
ROM:00018DC6 move.w word_628FE(d1.l*2),
$CE6(a5) ; c'est ici le sub_18BC4+202
ROM:00018DD0 movem.l (sp)+,d2-d3/a1-a3
ROM:00018DD4 unlk a6
ROM:00018DD6 rts
=> une variable $1068(A5) contient l'offset pour la valeur du rupteur.
=> Le rupteur est donc stocké en $CE6 on en sait pas plus. Je recherche donc ou cette variable $CE6(a5) est utilisée
Je trouve seulement 3 emplacements dont celui au dessus donc en fait 2 emplacements :
Emplacement 1 :
ROM:0002C91A move.w $CC8(a5),d3
ROM:0002C91E move.w $CE6(a5),d2
ROM:0002C922 cmp.w d2,d3
ROM:0002C924 bcs.s loc_2C962
=> $CC8(A5) est comparé a $CE6(A5) et si ca depasse il y a une action ! Je parie que le
CC8(A5) est le nb de tr/min ! on revient dessus plus tard
Emplacement 2 :
ROM:0001925C move.w $CC8(a5),d7
ROM:00019260 cmp.w (word_6291C).l,d7
ROM:00019266 bls.s loc_192B4
ROM:00019268 move.w $CC8(a5),d7
ROM:0001926C addi.w #$1F4,d7
ROM:00019270 cmp.w $CE6(a5),d7
ROM:00019274 bcc.s loc_192B4
=> Tiens le RPM est comparé a word_6291C (qui est egal a $9C4 = 2500tr/min) ... Il se passe quelque chose a 2500tr/min mais quoi ?? la je ne sais pas ou pas encore trouvé
=> Ensuite le RPM+$1F4 donc RPM+500 est comparé au rupteur ... Donc encore il se passe quelque chose mais je n'ai pas plus creusé
=> Donc le rupteur est bien stocké en 682FE et il faut changer toute la table quand on veut le changer
=> Ca me permet de voir aussi dans quelle variable est stocké le RPM qui va me servir ensuite pour trouver des maps ...
Episode 3 : Recherche de toutes les maps
Une fois le code desassemblé et les adresses memoire affectée par des etiquettes, c'est maintenant facile de trouver les adresses de debut des maps et de fin des maps
voici un extrait de fichier qui fait voir des petites maps 2D :
ROM:00061612 word_61612: dc.w 0 ; DATA XREF: sub_1185A+52r
ROM:00061614 dc.b 0
ROM:00061615 dc.b $B4 ; ¦
ROM:00061616 dc.b 1
ROM:00061617 dc.b $18
ROM:00061618 dc.b 1
ROM:00061619 dc.b $5E ; ^
ROM:0006161A dc.b 1
ROM:0006161B dc.b $90 ; É
ROM:0006161C dc.b 1
ROM:0006161D dc.b $C2 ; -
ROM:0006161E dc.b 2
ROM:0006161F dc.b $26 ; &
ROM:00061620 dc.b 2
ROM:00061621 dc.b $6C ; l
ROM:00061622 dc.b 2
ROM:00061623 dc.b $EE ; ¯
ROM:00061624 dc.b 3
ROM:00061625 dc.b $20
ROM:00061626 dc.b 3
ROM:00061627 dc.b $52 ; R
ROM:00061628 dc.b 3
ROM:00061629 dc.b $A2 ; ó
ROM:0006162A dc.b 4
ROM:0006162B dc.b 0
ROM:0006162C unk_6162C: dc.b 0 ; DATA XREF: sub_11E6A+10o
ROM:0006162C ; sub_11E6A+22o
ROM:0006162D dc.b $87 ; ç
ROM:0006162E dc.b 0
ROM:0006162F dc.b $87 ; ç
ROM:00061630 dc.b 0
ROM:00061631 dc.b $87 ; ç
ROM:00061632 dc.b 0
ROM:00061633 dc.b $87 ; ç
ROM:00061634 dc.b 0
ROM:00061635 dc.b $C8 ; +
ROM:00061636 dc.b 1
ROM:00061637 dc.b $2C ; ,
ROM:00061638 dc.b 1
ROM:00061639 dc.b $C1 ; -
ROM:0006163A dc.b 1
ROM:0006163B dc.b $C1 ; -
ROM:0006163C dc.b 2
ROM:0006163D dc.b $26 ; &
ROM:0006163E dc.b 2
ROM:0006163F dc.b $58 ; X
ROM:00061640 dc.b 2
ROM:00061641 dc.b $30 ; 0
ROM:00061642 dc.b 2
ROM:00061643 dc.b $30 ; 0
ROM:00061644 unk_61644: dc.b 2 ; DATA XREF: sub_11E6A+34o
ROM:00061645 dc.b $F8 ; °
ROM:00061646 dc.b 3
ROM:00061647 dc.b $29 ; )
ROM:00061648 dc.b 3
ROM:00061649 dc.b $29 ; )
ROM:0006164A dc.b 3
ROM:0006164B dc.b $29 ; )
ROM:0006164C dc.b 3
ROM:0006164D dc.b $C
ROM:0006164E dc.b 2
ROM:0006164F dc.b $26 ; &
ROM:00061650 dc.b 1
ROM:00061651 dc.b $DA ; +
ROM:00061652 dc.b 1
ROM:00061653 dc.b $DA ; +
ROM:00061654 dc.b 1
ROM:00061655 dc.b $5E ; ^
ROM:00061656 dc.b 1
ROM:00061657 dc.b $2C ; ,
ROM:00061658 dc.b 1
ROM:00061659 dc.b $22 ; "
ROM:0006165A dc.b 1
ROM:0006165B dc.b $22 ; "
ROM:0006165C unk_6165C: dc.b 3 ; DATA XREF: sub_11E6A+4Eo
ROM:0006165D dc.b $98 ; ÿ
=> Toutes les etiquettes unk_ ou word_ sont les adresses de debut des maps et la suivante etant la fin de la map. donc facile a utiliser dans winols
=> Tout les sub_ sont les routines de traitement de ces variables donc utile pour voir les variables d'entrées (RPM, Load, ...) mais il faut les connaitres et ca c'est dur !
206 S16, 207 Relais et future G...