Zlika / theodore

Libretro core for Thomson MO/TO emulation / Core Libretro pour l'émulation des ordinateurs Thomson MO/TO.
GNU General Public License v3.0
16 stars 24 forks source link

Crash sur chargement d'un fichier .fd #28

Closed bhrousseau closed 3 years ago

bhrousseau commented 3 years ago

Je génère mes propres fichiers .fd avec secteur de boot pour TO8 Le fichier en pièce jointe fonctionne parfaitement sous DCMOTO ou sur mon TO8 avec SDDRIVE. Par contre avec theodore, l'application crash. Le secteur de boot contient un code de fondu palette vers la couleur noire. Ce code ne semble pas exécuté et theodore plante. Il y a donc un problème au chargement du secteur de boot en $6200. TEST.zip

Je précise que le fichier FD ne comporte pas de FAT.

Merci d'avance !

Zlika commented 3 years ago

Bonjour, Merci pour ce retour, je regarde ça dès que possible.

Zlika commented 3 years ago

Il s'agit visiblement d'une corruption mémoire dans la gestion de l'affichage vidéo. Je ne sais pas si j'aurai le temps de regarder ça plus en détail ce week-end, mais je vais essayer de corriger le problème dès que possible. Ce programme fait quelque chose de particulier / atypique qui expliquerait que le plantage ne se produise pas sur tous les autres jeux que j'ai pu testés ? (par exemple, utilisation d'un mode vidéo peu courant qui ne serait pas géré correctement par l'émulateur...)

bhrousseau commented 3 years ago

Je t'ai mis en pj le code source qui est encodé dans le secteur de boot. Je commence par un fondu de palette, je ne touche pas de suite au mode vidéo. On devrait voir l'écran qui noirci.

Je ne sais pas si ça plante quand mon code est exécuté ou avant son lancement quand le TO charge le secteur de boot et le décode.

Tu as moyen de savoir si on va jusqu'a l'appel en $6200 qui est exécuté à la fin du chargement de secteur de boot ?

Le ven. 5 mars 2021 à 18:50, Thomas Lorblanchès notifications@github.com a écrit :

Il s'agit visiblement d'une corruption mémoire dans la gestion de l'affichage vidéo. Je ne sais pas si j'aurai le temps de regarder ça plus en détail ce week-end, mais je vais essayer de corriger le problème dès que possible. Ce programme fait quelque chose de particulier / atypique qui expliquerait que le plantage ne se produise pas sur tous les autres jeux que j'ai pu testés ? (par exemple, utilisation d'un mode vidéo peu courant qui ne serait pas géré correctement par l'émulateur...)

— You are receiving this because you authored the thread. Reply to this email directly, view it on GitHub https://github.com/Zlika/theodore/issues/28#issuecomment-791580106, or unsubscribe https://github.com/notifications/unsubscribe-auth/ANROXGPMPD4RAGQS3KGISO3TCEKV7ANCNFSM4YVLOSAQ .

Zlika commented 3 years ago

Je ne vois pas la pièce jointe. Oui l'adresse $6200 est bien exécutée. Puis ensuite très vite je vois qu'il va "moissonner" en mémoire, le Program Counter arrivant dans une zone qui visiblement ne contient pas de données exécutables (et c'est sans doute la cause racine du crash qui suit) :

624A 8B02     ADDA  #$02           2 A=E8 B=00 X=62E7 Y=62DB U=627F S=9FFA DP=60 CC=C8
624C B7627E   STA   $627E          5 A=EA B=00 X=62E7 Y=62DB U=627F S=9FFA DP=60 CC=C8
624F A6A4     LDA   ,Y             4 A=EA B=00 X=62E7 Y=62DB U=627F S=9FFA DP=60 CC=C8
6251 B7E7DA   STA   $E7DA          5 A=00 B=00 X=62E7 Y=62DB U=627F S=9FFA DP=60 CC=C4
6254 0000     NEG   /$00           6 A=00 B=00 X=62E7 Y=62DB U=627F S=9FFA DP=60 CC=C4
6256 0000     NEG   /$00           6 A=00 B=00 X=62E7 Y=62DB U=627F S=9FFA DP=60 CC=C4
6258 0000     NEG   /$00           6 A=00 B=00 X=62E7 Y=62DB U=627F S=9FFA DP=60 CC=C4
625A 0000     NEG   /$00           6 A=00 B=00 X=62E7 Y=62DB U=627F S=9FFA DP=60 CC=C4
625C 0000     NEG   /$00           6 A=00 B=00 X=62E7 Y=62DB U=627F S=9FFA DP=60 CC=C4
625E 0000     NEG   /$00           6 A=00 B=00 X=62E7 Y=62DB U=627F S=9FFA DP=60 CC=C4
6260 0000     NEG   /$00           6 A=00 B=00 X=62E7 Y=62DB U=627F S=9FFA DP=60 CC=C4
6262 0000     NEG   /$00           6 A=00 B=00 X=62E7 Y=62DB U=627F S=9FFA DP=60 CC=C4
6264 0000     NEG   /$00           6 A=00 B=00 X=62E7 Y=62DB U=627F S=9FFA DP=60 CC=C4
6266 87       ???                  ? A=00 B=00 X=62E7 Y=62DB U=627F S=9FFA DP=60 CC=C4
Break on illegal opcode
bhrousseau commented 3 years ago

Apparemment tout va bien jusqu'en 6251 quand on écrit dans le registre palette .. après on a des 00 00 00 00 au lieu du reste du code ! ci dessous le lst du code de boot :

 44        6200               PalInit
 45  3     6200 8E   62E7             ldx   #pal_len                 *

46 4 6203 108E 62DB ldy #pal_from *

47 6207 PalRun 48 4+0 6207 A6 A4 lda ,y

49 5 6209 B4 62EE anda pal_mask *

50 2 620C C6 00 ldb #$00 *

51 5 620E F4 62EE andb pal_mask *

52 5 6211 F7 6278 stb pal_buffer *

53 2 6214 C6 11 ldb #$11 *

54 5 6216 F4 62EE andb pal_mask *

55 5 6219 F7 6279 stb pal_buffer+1 *

56 5 621C B1 6278 cmpa pal_buffer *

57 3 621F 27 10 beq PalVRSuivante *

58 3 6221 22 07 bhi PalVRDec *

59 4+0 6223 A6 A4 lda ,y *

60 5 6225 BB 6279 adda pal_buffer+1 *

61 3 6228 20 05 bra PalVRSave *

62 622A PalVRDec 63 4+0 622A A6 A4 lda ,y *

64 5 622C B0 6279 suba pal_buffer+1 *

65 622F PalVRSave 66 4+0 622F A7 A4 sta ,y *

67 6231 PalVRSuivante 68 7 6231 73 62EE com pal_mask *

69 3 6234 2B D1 bmi PalRun *

70 71 6236 SetPalBleu 72 4+1 6236 E6 21 ldb 1,y

73 2 6238 C1 00 cmpb #$00 *

74 3 623A 27 08 beq SetPalNext *

75 3 623C 22 03 bhi SetPalBleudec *

76 2 623E 5C incb *

77 3 623F 20 01 bra SetPalSaveBleu *

78 6241 SetPalBleudec 79 2 6241 5A decb *

80 6242 SetPalSaveBleu 81 4+1 6242 E7 21 stb 1,y *

82 83 6244 SetPalNext 84 5 6244 B6 627E lda pal_idx *

85 5 6247 B7 E7DB sta $E7DB *

86 2 624A 8B 02 adda #$02 *

87 5 624C B7 627E sta pal_idx *

88 4+0 624F A6 A4 lda ,y *

89 5 6251 B7 E7DA sta $E7DA *

90 5 6254 F7 E7DA stb $E7DA *

91 5 6257 B6 627E lda pal_idx *

92 4+0 625A A1 84 cmpa ,x *

93 3 625C 26 E6 bne SetPalNext *

94 4+1 625E 31 22 leay 2,y *

95 4+1 6260 30 01 leax 1,x *

96 4 6262 8C 62ED cmpx #end_pal_len *

97 3 6265 26 A0 bne PalRun *

98 99 6267 Vsync_1 100 7 6267 7D E7E7 tst $E7E7 *

101 3 626A 2A FB bpl Vsync_1 *

102 626C Vsync_2 103 7 626C 7D E7E7 tst $E7E7 *

104 3 626F 2B FB bmi Vsync_2 *

105 106 7 6271 7A 62ED dec pal_cycles *

107 3 6274 26 8A bne PalInit *

108 3 6276 20 08 bra InitVideo *

109 110 6278 pal_buffer 111 6278 42 fcb $42 *

112 6279 41 fcb $41 *

113 627A 53 fcb $53 *

114 627B 49 fcb $49 *

115 627C 43 fcb $43 *

116 627D 32 fcb $32 *

117 118 627E pal_idx 119 627E 00 fcb $00 *

120 627F 00 fcb $00 *

121 122 ---------------------------------------->> 123 A partir de ce point le code doit comme>> 124 *---------------------------------------->> 125 126 *****>> 127 * Initialisation du mode video 128 *****>> 129 6280 InitVideo 130 2 6280 1A 50 orcc #$50 *

131 4 6282 10CE 9FFF lds #$9FFF *

132 2 6286 86 7B lda #$7B *

133 5 6288 B7 E7DC sta $E7DC 134 135 *****>> 136 * Initialisation de la commutation de pag>> 137 *****>> 138 5 628B F6 6081 ldb $6081 *

139 2 628E CA 10 orb #$10 *

140 5 6290 F7 6081 stb $6081 *

141 5 6293 F7 E7E7 stb $E7E7 *

142 2 6296 86 04 lda #$04 143 5 6298 B7 E7E5 sta $E7E5 *

144 145 *****>> 146 * Lecture des donnees depuis la disquette>> 147 *****>> 148 629B DKLecture 149 60 setdp $60 150 2 629B 86 60 lda #$60 151 6 629D 1F 8B tfr a,dp *

152 153 3 629F CC 0000 ldd #$0000 154 4 62A2 97 49 sta <$6049 *

155 5 62A4 DD 4A std <$604A *

156 2 62A6 86 02 lda #$02 157 4 62A8 97 4C sta <$604C *

158 4 62AA 97 48 sta <$6048 *

159 2 62AC 86 A0 lda #$A0 *

160 5 62AE DD 4F std <$604F 161 62B0 DKCO 162 8 62B0 BD E82A jsr $E82A *

163 6 62B3 0C 4C inc <$604C *

164 4 62B5 96 4C lda <$604C *

165 2 62B7 81 10 cmpa #$10 *

166 3 62B9 23 10 bls DKContinue *

167 2 62BB 86 01 lda #$01 *

168 4 62BD 97 4C sta <$604C *

169 6 62BF 0C 4B inc <$604B *

170 4 62C1 96 4B lda <$604B 171 2 62C3 81 4F cmpa #$4F *

172 3 62C5 23 04 bls DKContinue *

173 6 62C7 0F 4B clr <$604B *

174 6 62C9 0C 49 inc <$6049 *

175 62CB DKContinue 176 6 62CB 0C 4F inc <$604F *

177 5 62CD DC 4F ldd <$604F *

178 62CF dk_dernier_bloc 179 5 62CF 1083 A300 cmpd #boot_dernier_bloc *

180 3 62D3 23 DB bls DKCO *

181 3 62D5 CE A20B ldu #gmboot 182 4 62D8 7E A000 jmp $A000 183 184 * donnees pour le fondu de palette 185 *****>> 186 187 62DB pal_from 188 62DB 0000 fdb $0000 *

189 62DD F00F fdb $F00F *

190 62DF FF0F fdb $FF0F *

191 62E1 7707 fdb $7707 *

192 62E3 AA03 fdb $AA03 *

193 62E5 330A fdb $330A *

194 195 62E7 pal_len 196 62E7 0C fcb $0C *

197 62E8 0E fcb $0E *

198 62E9 10 fcb $10 *

199 62EA 16 fcb $16 *

200 62EB 18 fcb $18 *

201 62EC 20 fcb $20 *

202 62ED end_pal_len 203 204 62ED pal_cycles 205 62ED 0F fcb $0F *

206 207 62EE pal_mask 208 62EE 0F fcb $0F *

Le ven. 5 mars 2021 à 19:48, Benoit Rousseau bh.rousseau@gmail.com a écrit :

Je t'ai mis en pj le code source qui est encodé dans le secteur de boot. Je commence par un fondu de palette, je ne touche pas de suite au mode vidéo. On devrait voir l'écran qui noirci.

Je ne sais pas si ça plante quand mon code est exécuté ou avant son lancement quand le TO charge le secteur de boot et le décode.

Tu as moyen de savoir si on va jusqu'a l'appel en $6200 qui est exécuté à la fin du chargement de secteur de boot ?

Le ven. 5 mars 2021 à 18:50, Thomas Lorblanchès notifications@github.com a écrit :

Il s'agit visiblement d'une corruption mémoire dans la gestion de l'affichage vidéo. Je ne sais pas si j'aurai le temps de regarder ça plus en détail ce week-end, mais je vais essayer de corriger le problème dès que possible. Ce programme fait quelque chose de particulier / atypique qui expliquerait que le plantage ne se produise pas sur tous les autres jeux que j'ai pu testés ? (par exemple, utilisation d'un mode vidéo peu courant qui ne serait pas géré correctement par l'émulateur...)

— You are receiving this because you authored the thread. Reply to this email directly, view it on GitHub https://github.com/Zlika/theodore/issues/28#issuecomment-791580106, or unsubscribe https://github.com/notifications/unsubscribe-auth/ANROXGPMPD4RAGQS3KGISO3TCEKV7ANCNFSM4YVLOSAQ .

Zlika commented 3 years ago

Le code du boot et du programme de palette c'est ceux-ci : https://github.com/bhrousseau/bento8/tree/master/Bento8/ASM ?

bhrousseau commented 3 years ago

Non ce n'est pas celui ci, je t'ai envoyé le contenu du lst du code de boot qui pose problème. Tu l'as reçu ?

Le ven. 5 mars 2021 à 20:25, Thomas Lorblanchès notifications@github.com a écrit :

Le code du boot et du programme de palette c'est ceux-ci : https://github.com/bhrousseau/bento8/tree/master/Bento8/ASM ?

— You are receiving this because you authored the thread. Reply to this email directly, view it on GitHub https://github.com/Zlika/theodore/issues/28#issuecomment-791630337, or unsubscribe https://github.com/notifications/unsubscribe-auth/ANROXGM54P2BE7KUIJSCHZLTCEVZJANCNFSM4YVLOSAQ .

bhrousseau commented 3 years ago

Je te confirme qu'en retirant les deux lignes suivantes : sta $E7DA stb $E7DA qui positionnent les nouvelles valeurs de couleur palette le code s'exécute correctement et ne fait plus planter theodore.

au premier appel sta $E7DA l'émulateur semble "effacer" le contenu mémoire car les instructions suivantes deviennent toutes $00

Le ven. 5 mars 2021 à 20:31, Benoit Rousseau bh.rousseau@gmail.com a écrit :

Non ce n'est pas celui ci, je t'ai envoyé le contenu du lst du code de boot qui pose problème. Tu l'as reçu ?

Le ven. 5 mars 2021 à 20:25, Thomas Lorblanchès notifications@github.com a écrit :

Le code du boot et du programme de palette c'est ceux-ci : https://github.com/bhrousseau/bento8/tree/master/Bento8/ASM ?

— You are receiving this because you authored the thread. Reply to this email directly, view it on GitHub https://github.com/Zlika/theodore/issues/28#issuecomment-791630337, or unsubscribe https://github.com/notifications/unsubscribe-auth/ANROXGM54P2BE7KUIJSCHZLTCEVZJANCNFSM4YVLOSAQ .

Zlika commented 3 years ago

J'ai corrigé le problème, qui venait du fait que si on écrit une valeur supérieure à 15 dans le registre E7BD (palette) cela provoquait un débordement dans un tableau interne de l'émulateur. Donc maintenant je ne garde que les bits de poids faibles quand on écrit dans ce registre. Par contre je ne sais pas pourquoi ton programme écrit des valeurs supérieures à 15 dans ce registre. Sur un vrai TO8 ainsi que dans dcmoto j'imagine que les bits de poids forts sont ignorés, ce qui n'était pas fait dans theodore. Maintenant c'est fait, mais peut être qu'il y a quand même un petit bug dans ton programme, car pour moi ça n'a pas de sens d'écrire une valeur supérieure à 15.

bhrousseau commented 3 years ago

Effectivement ce n'était pas volontaire, merci beaucoup pour ton aide. Tu as bien fait de masquer les valeurs supérieures, je ne pense pas que les 3 bits de poids forts soient câblés sur qq chose, tout cas je n'ai pas trouvé de doc dessus. Encore merci !

Benoit Rousseau.

Le dim. 7 mars 2021 à 15:24, Thomas Lorblanchès notifications@github.com a écrit :

J'ai corrigé le problème, qui venait du fait que si on écrit une valeur supérieure à 15 dans le registre E7BD (palette) cela provoquait un débordement dans un tableau interne de l'émulateur. Donc maintenant je ne garde que les bits de poids faibles quand on écrit dans ce registre. Par contre je ne sais pas pourquoi ton programme écrit des valeurs supérieures à 15 dans ce registre. Sur un vrai TO8 ainsi que dans dcmoto j'imagine que les bits de poids forts sont ignorés, ce qui n'était pas fait dans theodore. Maintenant c'est fait, mais peut être qu'il y a quand même un petit bug dans ton programme, car pour moi ça n'a pas de sens d'écrire une valeur supérieure à 15.

— You are receiving this because you authored the thread. Reply to this email directly, view it on GitHub https://github.com/Zlika/theodore/issues/28#issuecomment-792287348, or unsubscribe https://github.com/notifications/unsubscribe-auth/ANROXGNNWP2PWQVPUDX4IS3TCOEDFANCNFSM4YVLOSAQ .