Vous voyez bien sur la routine que la pile est très bien gérée.
De toutes façon j'ai réussi à faire ma routine d'une autre manière, donc la résolution de ce bug n'est plus importante pour moi.
Mais ça reste intéressant, donc cherchons l'erreur
***************************************
(la nouvelle fonction pour les curieux:; *****************************************************************
; *** Récupération d'un fichier :)) ***
; *****************************************************************
; *** Nécessite 2 paramètres :
; *** a5 = pointeur sur le nom du folder où se situait le fichier
; *** a6 = pointeur sur le nom du fichier en VAT virtuelle
; *****************************************************************
recuperation:
movem.l d0-a6,-(a7) ; on sauve les registres
lea (a5),a0 ; a0 pointe sur le nom du folder où était la var
bsr Chercher_Folder ; teste l'existence du folder qui contenait le fichier
tst.w d7 ; déjà là ?
bne.s ContinuerRecup ; alors on continue
jsr filelib::createfolder ; sinon on le recrée
bsr Chercher_Folder ; on va chercher le handle de ce folder
ContinuerRecup:
move.w d7,d3 ; d3.w = handle du folder de l'ancienne variable
lea Folder_Tempo(pc),a0 ; a0 pointe sur le nom du dossier temporaire dans lequel la variable va être récupérée
NouveauFichier (a0),(a6),a4 ; on re-crée la variable invisible
move.w 12(a4),d2 ; d2.w = handle du nouveau fichier
jsr filelib::hdltoindex ; recherche de son index dans le dossier
lsl.w #2,d2 ; d2.w = adresse relative du handle de la nouvelle var
move.l doorsos::Heap,a1 ; a1 pointe sur la table des handles
move.l 12(a6),0(a1,d2.w) ; au handle du nouveau fichier correspond l'adresse de l'ancien
lea Folder_Tempo(pc),a0 ; a0 pointe sur le nom du dossier temporaire dans lequel la variable a été récupérée
bsr Chercher_Folder ; recherche du handle du folder temporaire
move.w d7,d0 ; d0.w = handle du folder temporaire
move.w d3,d2 ; d2.w = handle du folder de l'ancienne variable
jsr filelib::move ; déplacement du fichier restauré dans son folder d'origine
move.w d0,d2 ; d2.w = handle du folder temporaire
jsr filelib::hdltoindex ; recherche de l'index de ce folder dans la FAT
jsr filelib::delete ; effacement du dossier temporaire
lea (a5),a0 ; a0 pointe sur le nom du folder de la var restaurée
lea (a6),a1 ; a1 pointe sur le nom de la var elle-même
bsr Tester_Exist ; recherche de l'adresse de son entrée en VAT
lea (a6),a4 ; a4 pointe sur l'entrée en VAT de la variable restaurée
move.w Nombre_de_Recups(pc),d0 ; d0.w = nombre de fichiers récupérés jusqu'ici
lsl.w #2,d0 ; d0.w = adresse relative des coordonnées à ajouter
lea Liste_Recups(pc),a6 ; a6 pointe sur la liste des vars récupérées
move.l a4,0(a6,d0.w) ; écriture de l'adresse de l'entrée en VAT
move.w Nombre_de_Recups(pc),d0 ; d0.w = nombre de fichiers récupérés jusqu'ici
beq.s FinRecup ; aucun ? Alors on se barre
subq.w #1,d0 ; -1 pour... pfff j'en ai marre
LoopCorrectionAE:
move.l (a6)+,d1 ; d1.l = adresse de l'entrée en VAT d'un des fichiers déjà récupérés
cmp.l a4,d1 ; on la compare avec celle du fichier qui vient d'être restauré
bcc.s CorrigerAddEntry ; si celui-ci est situé devant, il faut corriger l'AdEeVAT du fichier déjà récupéré
dbf d0,LoopCorrectionAE ; passage au fichier récupéré suivant
bra.s FinRecup ; correction terminée :)
CorrigerAddEntry:
add.l #14,-4(a6) ; correction de l'adresse de l'entrée en VAT d'un fichier déjà récupéré
dbf d0,LoopCorrectionAE ; passage au fichier récupéré suivant
FinRecup:
addq.w #1,Nombre_de_Recups ; mise à jour du nombre de fichiers récupérés
movem.l (a7)+,d0-a6 ; on restaure les registres
rts ; voilà c'est fini :)
; **************************
)