[Résolu] Le désarchivage laborieux...

Hell ô Ève Riz Beau Dit !
Cela fait maintenant une semaine que je cherche, j'ai avancé dans mes recherches mais il me manque des informations, voilà le problème (ne vous faites pas décourager par la longueur du post, il y a beaucoup d'images, de code etc...) :
Vous le savez peut-être déjà mais je suis en train de faire en sorte qu'on puisse éditer les programmes archivés grâce à PHASM. J'ai décidé pour cela de faire la chose suivante :
- Grâce à un menu hook, on désarchive quand l'user demande à éditer un programme archivé dans la liste des programmes
- On laisse l'user faire ce qu'il veut dans l'edit buffer
- quand il a fini, on réarchive le programme ni vu ni connu
Malheureusement, ce n'est pas aussi facile que je ne le croyais, et j'ai vite découvert que le simple fait de désarchiver (l'archivage marche sans problème) détruit en partie le programme unARC. voici une image du code avant et après (à noter que c'est toujours au même endroit que les caractères bizarres apparaissent, et à seulement cet endroit là pour le programme) :
Donc ce désarchivage se fait au moment où l'user a sélectionné un Item dans le menu d'édition des programmes, juste avant que l'OS n'affiche soit l'edit buffer, soit "Err:Archived".
J'ai fait un taaas de recherches, pendant 1 semaine, et voici ce que j'ai pu noter :
Ce n'est qu'un résumé, et après cela j'en ai tiré une conclusion : ce problème survient car un buffer est ouvert, et qui dit buffer ouvert, dit aucune allocation mémoire possible ! Je ne suis pas sûr à 100% mais tout colle et pousse à dire que c'est à cause de ça, lisez le spoiler si vous avez le courage d'affronter des explications floues :
Ok tout cela peut vous être un peu flou, c'est dur de résumer 15h de recherches en 5 lignes. Mais le principal est que vous ayez compris qu'il y a beaucoup de chances que ça vienne d'un buffer ouvert qui empêche ARC_UNARC d'allouer de la mémoire dans la RAM.
Alors, on a une piste, maintenant, qu'est-ce qu'on fait ? Ben on trouve une solution ! Malheureusement, malgré mes efforts, ce fut vain. J'ai essayé de fermer un possible buffer en cours avec
Bon, je pense avoir tout dit, donc voilà le code utilisé qui est censé marcher :
À la moindre question, le moindre doute, même si vous pensez que c'est complétement con, n'hésitez pas ! Si vous avez des tests à me proposer aussi, je me ferai un plaisir d'essayer !
Cela fait maintenant une semaine que je cherche, j'ai avancé dans mes recherches mais il me manque des informations, voilà le problème (ne vous faites pas décourager par la longueur du post, il y a beaucoup d'images, de code etc...) :
Vous le savez peut-être déjà mais je suis en train de faire en sorte qu'on puisse éditer les programmes archivés grâce à PHASM. J'ai décidé pour cela de faire la chose suivante :
- Grâce à un menu hook, on désarchive quand l'user demande à éditer un programme archivé dans la liste des programmes
- On laisse l'user faire ce qu'il veut dans l'edit buffer
- quand il a fini, on réarchive le programme ni vu ni connu
Malheureusement, ce n'est pas aussi facile que je ne le croyais, et j'ai vite découvert que le simple fait de désarchiver (l'archivage marche sans problème) détruit en partie le programme unARC. voici une image du code avant et après (à noter que c'est toujours au même endroit que les caractères bizarres apparaissent, et à seulement cet endroit là pour le programme) :
Donc ce désarchivage se fait au moment où l'user a sélectionné un Item dans le menu d'édition des programmes, juste avant que l'OS n'affiche soit l'edit buffer, soit "Err:Archived".
J'ai fait un taaas de recherches, pendant 1 semaine, et voici ce que j'ai pu noter :
It works :
- Si on vient d'archiver la variable, que ce soit dans le hook ou par le menu de l'OS, sans passer parou autre
- Si on UNARC dans un endroit où il n'y a pas l'air d'y avoir un buffer d'ouvert (c-à-d dans graphe ou dans Trace)
It does not work :
- Les tokens bizarres apparaissent toujours au token environ 56.
Ce n'est qu'un résumé, et après cela j'en ai tiré une conclusion : ce problème survient car un buffer est ouvert, et qui dit buffer ouvert, dit aucune allocation mémoire possible ! Je ne suis pas sûr à 100% mais tout colle et pousse à dire que c'est à cause de ça, lisez le spoiler si vous avez le courage d'affronter des explications floues :
Show/Hide spoilerAfficher/Masquer le spoiler
on peut archiver sans problème, quand on est dans un menu qui ne nécessite pas de buffer, ça marche, les tokens bizarres apparaissent toujours au même endroit. Pourquoi au même endroit ? Parce que la RAM ne détruit pas au moment de l'archivage le programme qui était en RAM pour les performances, et le désarchivage ne fait que changer un pointeur, mais pendant ce temps là, quelque chose est allé s'installer ici, d'où aussi la nécessité de ne pas aller dans des endroits qui utilisent des buffers juste après l'archivage (Si on vient d'archiver la variable, que ce soit dans le hook ou par le menu de l'OS, sans passer par
ou autre) (c'est ma théorie).
![[f(x)/y=] :f11:](./images/smilies/z80/11.png)
Ok tout cela peut vous être un peu flou, c'est dur de résumer 15h de recherches en 5 lignes. Mais le principal est que vous ayez compris qu'il y a beaucoup de chances que ça vienne d'un buffer ouvert qui empêche ARC_UNARC d'allouer de la mémoire dans la RAM.
Alors, on a une piste, maintenant, qu'est-ce qu'on fait ? Ben on trouve une solution ! Malheureusement, malgré mes efforts, ce fut vain. J'ai essayé de fermer un possible buffer en cours avec
call _closeEditBuf
et call _releaseBuffer
mais toujours le même problème : des caractères bizarres apparaissent au même endroit. Vraiment incompréhensible... cela ne viendrait pas d'un buffer ? De plus, quelque chose me dérange... si on fait dans cet ordre :- Archiver le programme avec le menu de l'OS
- Aller directement dans le menu qui liste les programme à éditer
- Éditer le programme qu'on vient d'archiver
Bon, je pense avoir tout dit, donc voilà le code utilisé qui est censé marcher :
- Code: Select all
MenuHook:
.db 83h ; Commun à tous les hooks
cp 3 ; Si on est dans la sélection d'un élément dans un menu
jr nz,quit
ld a,(menuCurrent) ; On verifie qu'on est bien dans le menu qui liste les programmes à éditer
cp mProgramHome
jr nz,quit
ld a,(menuCurrent+1)
cp mPrgm_Edit
jr nz,quit
push bc ; BC doit revenir tel quel à la fin de l'exécution du hook
push de ; à DE se trouve le nom de l'item sélectionné (donc le nom du programme)
call _ReleaseBuffer ; On évacue le buffer en cours
pop de
ld hl,-9
add hl,de
call _mov9toop1 ; nom du programme dans OP1
ld a,5
ld (OP1),a
call _chkfindsym ; pas spécialement dur à comprendre...
call _chkInRam
call nz,_ARC_UNARC
pop bc
quit:
cp a ; On met le flag Z à un pour dire à l'OS qu'il ne doit pas annuler l'action en cours
ret
endHook:
À la moindre question, le moindre doute, même si vous pensez que c'est complétement con, n'hésitez pas ! Si vous avez des tests à me proposer aussi, je me ferai un plaisir d'essayer !