
En laissant addq.l #3,a2 les fichiers prennent une taille "aléatoire", et le type est EXPR.
Si j'écris addq.l #2,a2 les pb de taille et de type sont réglés, mais le premier octet du fichier n'est pas écrit (ce dernier point est normal...).
J'ai signalé la ligne qui correspond au phénomène.
Si un génie passe par là

void @fopen[byte @Nom, @Mode] < fopen: move.l 4(a7),a0 move.l 8(a7),a1 movem.l d3-d5/a2/a3,-(a7) move.b -(a0),fopen_byte clr.b (a0)+ fopen_copienom_loop: tst.b (a0)+ bne.s fopen_copienom_loop pea -1(a0) moveq #0,d3 ; flags moveq #0,d4 ; pas append moveq #0,d5 ; pas mode r+ move.b (a1)+,d0 cmp.b #'w',d0 beq.s fopen_modeW cmp.b #'r',d0 beq.s fopen_modeR cmp.b #'a',d0 bne fopen_erreur fopen_modeA: moveq #-1,d4 ; append fopen_modeW: move.w #$0002,d3 bra.s fopen_modesSuite fopen_modeR: move.w #$0001,d3 fopen_modesSuite: move.b (a1)+,d0 cmp.b #'b',d0 beq.s fopen_modeB cmp.b #'t',d0 beq.s fopen_modesSuite cmp.b #'+',d0 bne.s fopen_tests_fin fopen_modeP: btst.b #0,d3 sne d5 or.w #$0003,d3 bra.s fopen_modesSuite fopen_modeB: or.w #$0040,d3 bra.s fopen_modesSuite fopen_tests_fin: tst.w d4 beq.s fopen_pasappend move.l $180(a6),a0 ; SymFind jsr (a0) tst.l d0 bne.s fopen_dejacherche bra.s fopen_ecraser fopen_pasappend: btst.l #1,d3 beq.s fopen_pascreer tst.b d5 bne.s fopen_pascreer fopen_ecraser: move.l $170(a6),a0 ; SymAdd jsr (a0) move.l d0,(a7) beq fopen_erreur move.l $1E4(a6),a0 ; DerefSym jsr (a0) move.l a0,a2 move.l #8,(a7) move.l $240(a6),a0 ; HeapAlloc jsr (a0) move.w d0,(a7) beq fopen_erreur move.w d0,12(a2) move.l $258(a6),a0 ; HeapDeref jsr (a0) move.w #2,(a0) btst.l #6,d3 bne.s fopen_suite addq.w #3,(a0) move.l #$00012000,2(a0) move.b #$E0,6(a0) bra.s fopen_suite fopen_pascreer: move.l $180(a6),a0 ; SymFind jsr (a0) fopen_dejacherche: move.l d0,(a7) beq.s fopen_erreur move.l $1E4(a6),a0 ; DerefSym jsr (a0) move.w 12(a0),(a7) move.l $258(a6),a0 ; HeapDeref jsr (a0) fopen_suite: move.l a0,a2 pea 18 move.l $288(a6),a0 ; HeapAllocPtr jsr (a0) addq.l #4,a7 move.l a0,a3 beq.s fopen_erreur move.l $268(a6),a0 ; HeapLock jsr (a0) move.w d3,10(a3) clr.w 12(a3) move.l a2,4(a3) move.w (a7),8(a3) clr.l 14(a3) move.w (a2),16(a3) addq.w #2,16(a3) tst.b d4 beq.s fopen_posdebut move.w (a2),d0 lea 0(a2,d0.w),a2 move.l a2,(a3) bra.s fopen_fin fopen_posdebut: btst.l #6,d3 bne.s fopen_binaire addq.l #3,a2 ; ==== ICI ==== fopen_binaire: addq.l #2,a2 move.l a2,(a3) bra.s fopen_fin fopen_erreur: sub.w a3,a3 fopen_fin: move.l a3,a0 addq.l #4,a7 movem.l (a7)+,d3-d5/a2/a3 move.l 4(a7),a1 move.b fopen_byte(pc),-1(a1) rts fopen_byte: dc.w 0 >
ATTENTION pour essayer sous TIGCC, remplacez tous les a6 par a5 et activez OPTIMIZE_ROM_CALL.