Conversion Jeux Thomson TO au format SD

Cette catégorie traite de développements récents pour nos vieilles machines, applications, jeux ou démos... Amis programmeurs, c'est ici que vous pourrez enfin devenir célèbres!

Modérateurs : Papy.G, fneck, Carl

Daniel
Messages : 17316
Inscription : 01 mai 2007 18:30
Localisation : Vaucluse
Contact :

Re: Conversion Jeux Thomson TO au format SD

Message par Daniel »

Il y a des chances que l'erreur soit dans le "scratchdos" du contrôleur SDDRIVE, puisqu'il est différent de celui du TO8.
Au départ j'ai recopié le contrôleur CD90-640, en passant le nombre de pistes de 40 à 80 et en supprimant la simple densité.
Dernièrement j'ai fait une modification pour inverser les deux moitiés de FAT en RAM, et j'ai simplifié la routine d'allocation d'un bloc.
En comparant avec les routines du TO8 on devrait trouver des différences et peut-être la cause du plantage.
C'est probablement subtil, car "La Marque Jaune" se charge correctement depuis l'inversion de la FAT.
Les Dieux de la Glisse doivent avoir une autre particularité.

Code : Tout sélectionner

;------------------------------------------------------
; SCRATCH DOS
;------------------------------------------------------
SCRDOS
  FCC   "SCRATCH "
  FCC   "DOS"

;------------------------------------------------------
; FINTR = cloture d'ecriture
;------------------------------------------------------
FINTR
  LDB   <DK_MOD        ; code operation logique   
  CMPB  #$02
  BEQ   ECRFA          ; ecriture de la FAT
  DEC   <DK_MOD        ; code operation logique
  BSR   RECFI          ; ouverture fichier
  BCS   ECRFA9         ; erreur d'ouverture
  TSTB  
  BEQ   FINTR1
  LBSR  RECUP          ; effacement d'un fichier
  BCS   ECRFA9         ; erreur d'effacement
FINTR1
  INC   <DK_MOD        ; code operation logique
  BSR   RECFI          ; ouverture d'un fichier
  BCS   ECRFA9         ; erreur d'ouverture
  LDB   #$0a           ; boucle pour 11 octets
  LDX   <DK_NAM        ; pointeur sur nom+ext fichier
FINTR2
  LDA   B,X            ; octet du nom+extension 
  STA   B,Y            ; copie dans le repertoire
  DECB                 ; decremente indice
  BGE   FINTR2         ; octet suivant
  BSR   ECRSE          ; ecriture secteur
  BCS   ECRFA9         ; erreur d'ecriture

;------------------------------------------------------
; Ecriture de la FAT
;------------------------------------------------------
ECRFA
  LDX   <DK_FAT        ; adresse de la FAT
  BSR   INVFA          ; inversion de la FAT
  LDA   #$02           ; n° secteur de la FAT (sect 2)
  STA   <DK_SEC        ; stocke le numero de secteur
  LDB   #$14           ; piste de la FAT (piste 20)
  CLRA                 ; poids fort du numero de piste 
  STD   <DK_TRK        ; stocke le numero de piste
  STX   <DK_BUF        ; adresse du buffer secteur
  BSR   ECRSE          ; ecriture secteur
  BCS   ECRFA9         ; erreur ecriture
  CLR   <DK_MOD        ; indicateur cloture fichier
ECRFA9
  RTS   

;------------------------------------------------------
; LECFA = Chargement de la FAT
;------------------------------------------------------
LECFA
  LDX   <DK_FAT        ; adresse de la FAT
  STX   <DK_BUF        ; adresse du buffer secteur
  LDA   #$02           ; numero secteur a lire
  BSR   LSEC20         ; lecture secteur piste 20
  LEAX  128,X          ; ajout de $80
  STX   <DK_FAT        ; stocker le nouveau pointeur

;------------------------------------------------------
; INVFA = Inversion des deux moities de la FAT
; En entree X pointe au milieu du buffer de la FAT
; En sortie X pointe sur le buffer de la FAT 
;------------------------------------------------------
INVFA
  LDY   #$80           ; nombre de boucles
INVFA1    
  LDA   -128,X         ; octet premiere moitie 
  LDB   ,X             ; octet deuxieme moitie
  STB   -128,X         ; 2ere moitie dans 1ere
  STA   ,X+            ; 1ere moitie dans 2eme
  LEAY  -1,Y           ; decrementation compteur 
  BNE   INVFA1         ; nouvelle boucle
  LEAX  -$0100,X       ; X pointe sur le buffer de la FAT
  RTS                  ; retour

;------------------------------------------------------
; Sortie en erreur
;------------------------------------------------------
RETERR
  STA   <DK_ERR        ; code erreur
  COMA                 ; set carry
  COMA                 ; restaure valeur de A
  RTS   

;------------------------------------------------------
; Chargement 1er secteur catalogue
;------------------------------------------------------
LDIR0
  LDA   #$03           ; numero de secteur catalogue
  LDX   <DK_CAT        ; pointeur sur buffer
  STX   <DK_BUF        ; adresse buffer

;------------------------------------------------------
; Chargement secteur piste 20
;------------------------------------------------------
LSEC20
  STA   <DK_SEC        ; numero de secteur
  LDB   #$14           ; piste 20
  CLRA                 ; zero dans poids fort
  STD   <DK_TRK        ; numero de piste
  LDA   #$02           ; code operation lecture secteur
  BRA   SECTIO         ; operation sur secteur

;------------------------------------------------------
; ECRSE = Ecriture d'un secteur
;------------------------------------------------------
ECRSE
  LDA   #$08           ; code operation ecriture secteur

;------------------------------------------------------
; Operation sur secteur (code operation dans A)
;------------------------------------------------------
SECTIO
  STA   <DK_OPC        ; code operation
  LDY   <DK_CAT        ; pointeur sur buffer
  LBSR  OPTABL         ; execution fonction standard
  LDA   #$03           ; A=$03
  RTS   

;------------------------------------------------------
; RECFI = Ouverture d'un fichier
;------------------------------------------------------
RECFI
  BSR   LDIR0          ; charge 1er secteur catalogue 
RECFI1
  BCS   RETERR         ; sort si erreur
  LDX   #$0008         ; compteur de noms dans X
  LDY   <DK_CAT        ; pointeur sur buffer
RECFI2
  LDU   <DK_NAM        ; pointeur sur nom de fichier
  LDB   <DK_MOD        ; code operation logique
  CMPB  #$03
  BNE   RECFI3
  LEAU  SCRDOS,PCR     ; adresse du nom de fichier
RECFI3
  CLRB  
RECFI4
  CMPB  #$0b
  BCC   RECFI8
  LDA   B,Y            ; octet de la FAT
  CMPA  #$ff          
  BEQ   RECFI7
  INCB  
  CMPA  ,U+
  BEQ   RECFI4
  LEAY  $20,Y          ; adresse fichier suivant
  LEAX  -$01,X         ; decrementation indice 
  BNE   RECFI2         ; lecture entree suivante 
  INC   <DK_SEC        ; secteur suivant
  LDA   <DK_SEC        ; A = n° secteur
  CMPA  #$10           ; comparaison a 16
  BHI   RECFI7         ; superieur a 16
  LBSR  OPTABL         ; lecture secteur
  LDA   #$03           ; erreur I/O
  BRA   RECFI1         ; secteur suivant
RECFI7
  CLRB                 ; raz n° secteur
  BRA   RECFI9         ; sortie
RECFI8
  LDB   $0b,Y          ; type de fichier (catalogue)
  CMPB  <DK_TYP        ; type de fichier
  BNE   RECFI7
  LDB   $0c,Y          ; flag de fichier (catalogue)
  CMPB  <DK_FLG        ; flag de fichier
  BNE   RECFI7
  LDB   <DK_SEC        ; numero de secteur
  LDA   $0d,Y          ; numero de bloc (catalogue)
  STA   <DK_BLK        ; numero de bloc
  CLR   <DK_SCT        ; numero de secteur
  LDX   $0e,Y          ; taille dernier secteur (catalogue)
  STX   <DK_TDS        ; nbre d'octets du dernier secteur du fichier
  STY   <DK_PSB        ; numero du premier secteur du bloc
RECFI9
  STB   <DK_IFA        ; numero de bloc alloue
  CLRA
  RTS

;------------------------------------------------------
; ALLOD = allocation d'un fichier
;------------------------------------------------------
ALLOD
  LDY   <DK_FAT        ; adresse de la FAT
; BSR   ALLOB4         ; test place libre version CD90-640
  BSR   ALLOB          ; test place libre version carte SD
ALLOD1
  BCS   RECFI1         ; erreur plus de place
  STB   <DK_BLK        ; numero de bloc
  LBSR  LDIR0          ; charge debut directory
ALLOD2  
  BCS   ALLOD1         ; sortie en erreur
  LDY   <DK_CAT        ; pointeur sur buffer
  LDX   #$0008         ; compteur de noms dans X
ALLOD3
  LDB   ,Y             ; premier octet du nom 
  BEQ   ALLOD6         ; $00=fichier efface --> OK
  LDA   #$05
  CMPB  #$ff           ; test fin de repertoire
  BEQ   ALLOD6         ; $FF=fin de repertoire --> OK
  LEAY  $20,Y          ; entree suivante dans le repertoire 
  LEAX  -$01,X         ; decrementation compteur
  BNE   ALLOD3         ; traitement entree suivante
  INC   <DK_SEC        ; secteur suivant du repertoire
  LDA   <DK_SEC        ; A=numero de secteur
  CMPA  #$10           ; test 16
  BHI   ALLOD4         ; plus de place dans le repertoire
  LBSR  OPTABL         ; charge le secteur suivant 
  LDA   #$03           ; code erreur 3
  BRA   ALLOD2         ; sortie en erreur
ALLOD4
  LDA   #$05           ; code "disque plein"
ALLOD5
  BRA   ALLOD1         ; sort avec erreur
ALLOD6
  LDX   <DK_NAM        ; pointeur sur nom de fichier
  LDB   <DK_MOD        ; code operation logique
  CMPB  #$03
  BNE   ALLOD7
  LEAX  SCRDOS,PCR     ; adresse nom de fichier
ALLOD7
  LDB   #$0a           ; pour 11 octets (nom+extension)
ALLOD8
  LDA   B,X            ; recopie le nom et l'extension
  STA   B,Y            ; dans le catalogue
  DECB                 ; decrementation compteur
  BGE   ALLOD8         ; caractere suivant
  LDA   <DK_TYP        ; type de fichier 
  STA   $0b,Y          ; stocke en 12e position
  LDA   <DK_FLG        ; flag de fichier
  LDB   <DK_BLK        ; numero de bloc
  STD   $0c,Y          ; stocke en 13e position
  LBRA  ECRSE          ; ecriture du repertoire

;------------------------------------------------------
; ALLOB = allocation d'un bloc (version carte SD)
; Remarque : la FAT commence par un octet $00
; Il y a un décalage de 1 entre le numero de bloc
; et son indice dans la FAT (bloc 0 = indice 1)  
;------------------------------------------------------
ALLOB
  LDD   #$FF00          ; A=255 B=0
ALLOB1
  INCB                  ; bloc suivant
  CMPA  B,Y             ; bloc B libre ?
  BEQ   ALLOB2          ; oui ==> trouvé
  CMPB  #$A0            ; test dernier bloc  
  BNE   ALLOB1          ; bloc suivant 
  LDA   #$05            ; erreur pas de d'entrée trouvées
  LBRA  RETERR          ; sortie en erreur
ALLOB2
  CLR   B,Y             ; on marque le bloc comme occupé
  DECB                  ; mise a jour du
  STB   <DK_IFA         ; numero de bloc alloue
ALLOB9
  CLRA
  RTS

;------------------------------------------------------
; RECUP = effacement d'un fichier
;------------------------------------------------------
RECUP
  LDA   $0D,Y          ; numero du 1er bloc a liberer
  STA   <DK_BLK        ; numero de bloc
  CLR   ,Y             ; raz 1er caractere du nom de fichier
  LBSR  ECRSE          ; ecriture du repertoire 
  BCS   ALLOD5         ; erreur d'ecriture
  LDY   <DK_FAT        ; adresse de la FAT
  LDB   <DK_BLK        ; numero de bloc
RECUP1
  INCB                 ; bloc+1
  LDA   B,Y            ; A = octet de la FAT
  CLR   B,Y            ; octet FAT = $00
  DEC   B,Y            ; octet FAT = $FF (bloc libre)
  TFR   A,B            ; B = ancien octet de la FAT
  CMPA  #$c0           ; bloc de fin du fichier ?
  BCS   RECUP1         ; sinon bloc suivant
  BRA   ALLOB9         ; retour

;------------------------------------------------------
; MAJCL = Mise a jour cluster
;------------------------------------------------------
MAJCL
  LDB   <DK_BLK          ; numero du bloc                              
  CLRA                   ; A=0 
  LSRB                   ; divise par 2 (carry = b0) 
  STD   <DK_PBC          ; numero piste (carry inchange)
  INCA                   ; A=1          (carry inchange)
  STA   <DK_SCT          ; secteur=1    (carry inchange) 
  BCC   MAJCL9           ; branchement si n° de bloc pair
  LDA   #$09             ; secteur=9 pour les blocs impairs
MAJCL9
  STA   <DK_PSB          ; numero du premier secteur du bloc
  RTS   
Daniel
L'obstacle augmente mon ardeur.
__sam__
Messages : 7923
Inscription : 18 sept. 2010 12:08
Localisation : Brest et parfois les Flandres

Re: Conversion Jeux Thomson TO au format SD

Message par __sam__ »

__sam__ a écrit : 12 mars 2021 18:16 Le FD présente un problème avec la version DCMoto 2021.03.12 sur TO8 + CD90-351.

Je fais:
1) Une épreuve >> Saut à ski
2) Nom Joueurs >> je saisis A (une seule lettre), puis Entrer
3) Jeux

Apparait alors le message "Erreur Disque", et si on appuie sur une touche ca refait "Erreur disque".. on peu appuyer plusieurs fois et ca affiche "Chargement terminé" et plante totale du jeu (reboot nécessaire voire automatique).
C'est très curieux.. Neotenien arrives à y jouer.

Aussi j'essaye avec la version de ton site. :arrow: Aucun problème avec le scénario que j'avais trouvé pour reproduire le bug. Je re-essaye avec la version de ton ZIP de ce fil.. et bim ca re-plante! Très bien, on a deux versions qui doivent marcher à l'identique et qui ne le font pas. C'est un bon point de départ pour comprendre ce qu'il se passe.

Je regarde les fichiers sur disk.. Ah ben d'accord: le FD qui marche (de ton site) fait 640Ko... Celui de ce fil: 320Ko... Ok il manque la face 1: sur laquelle se trouve le jeu 1:SAUT.BIN, le saut à ski. C'est précisément le jeu qui est choisi dans mon scénario. Mystère résolu !

Par curiosité je regarde le SD de ton zip, et effectivement la face 1: est vide. Ton SD n'est pas une conversion du bon fichier FD. :?

Je convertis le bon FD en SD (voir attachement).... bon, on a bien la face 1: complète dedans :) Mais ca plante (presque) comme avant :? et c'est logique :idea: car les fichiers que le boot-loader tente de charger sont sur la face 0:.

Je dis presque dans la mesure ou l'écran de plante n'est pas le même. En fait dans ton SD on a pas le menu de choix "Dieux de la glisse" / "Dieux de la mer".. dans le mien on a bel et bien ce menu de boot et il faut appuyer sur 2 pour les Dieux de la glisse. Dans ton SD, ca plante lors du "chargement en cours" écrit en blanc sur fond noir, en affichant un artefact de 2 octets dans la mémoire forme. Dans mon SD, ca plante après le choix du jeu 2 avec un fond bleu-clair sans texte ni artefact.

Quand je regarde l'AUTO.BAT de "ma version", je vois que le code fait

Code : Tout sélectionner

2410 DEVICE "1:"
2500 CLEAR&H7FFF:LOADM"BOOT",,R
Je ne sais pas si c'est significatif, mas peut-être que la version qui est est supposée travailler sur le DEVICE 1: avec le minidos provoque un bug légèrement différent: on ne voit pas le texte "Chargement en cours". La RAM vidéo est à 0, strictement aucun texte n'est affiché.

A suivre...
Pièces jointes
les-dieux-de-la-glisse_to8_complet.zip
(169.58 Kio) Téléchargé 115 fois
Samuel.
A500 Vampire V2+ ^8^, A1200 (030@50mhz/fpu/64mb/cf 8go),
A500 GVP530(MMU/FPU) h.s., R-Pi, TO9, TO8D, TO8.Démos
__sam__
Messages : 7923
Inscription : 18 sept. 2010 12:08
Localisation : Brest et parfois les Flandres

Re: Conversion Jeux Thomson TO au format SD

Message par __sam__ »

Bon j'essaye d'avancer pour voir "un truc bizzare". De ce que j'ai compris l'artefact écran se produit au moment de la plante. Il est causé par le passage du PC par

Code : Tout sélectionner

DFF6 FFFFFF     STU    $FFFF              
DFF9 FFFFFF     STU    $FFFF              
DFFC FFFFFF     STU    $FFFF              
DFFF FF4D54     STU    $4D54              
E002 44         LSRA                      
E003 3A         ABX                       
E004 16006F     LBRA   $E076              
Malheureusement ca vient probablement d'avant $DFF6.. mais comme c'est suite à un JMP "fou" et qu'on a pas d'historique du PC on ne sait pas depuis l'où on vient. Peut-être qu'il serait bien d'avoir une liste dans le débuggeur avec les adresses des dernières instruction modifiant le PC de façon explicite: B<cc>/JMP/JSR/RTS et aussi "TFR reg,PC". Ca serait utile pour tracer ces JMPs "fous".

Bon par contre je constate que cela plante sur le chargement de "0:PRESH1.BIN", à priori après la lecture de la piste $0000, secteur 10.

Ce que je faire (demain, enfin tout à l'heure car là c'est trop tard) est de mettre un point d'arrêt sur la lecture d'un secteur dans 2 émulateurs parallèles. L'un avec le FD, l'autre avec le SD.. et tracer les accès à ce secteur 10 (dommage qu'on ne sache pas faire un point d'arrêt conditionnel style: break lors des appels en $E004 lorsque $604C==$a..). Une fois ce secteur chargé, une execution pas à pas devrait montrer une différence entre les deux émulateurs et donner un indice fort sur ce qui ne va pas. Sur le papier ca devrait marcher, mais je crains que le traçage de l'écriture de $0000 dans $604A-$604B et 10 en $604c ne soit pénible (vraiment les points d'arrêts conditionnels, ou détectant la présence d'un certain motif sur plusieurs octets (contigus?) en mémoire manquent pour ce genre de trucs.)
Samuel.
A500 Vampire V2+ ^8^, A1200 (030@50mhz/fpu/64mb/cf 8go),
A500 GVP530(MMU/FPU) h.s., R-Pi, TO9, TO8D, TO8.Démos
Avatar de l’utilisateur
6502man
Messages : 12286
Inscription : 12 avr. 2007 22:46
Localisation : VAR
Contact :

Re: Conversion Jeux Thomson TO au format SD

Message par 6502man »

Sur DCmoto tu à le trace qui te permet de remonté dans "l'historique" de PC :wink:

Il faut penser à "raffraichir" l'historique au moment de l'arrêt :wink:
Phil.

www.6502man.com

To bit or not to bit.
1 or 0.
Daniel
Messages : 17316
Inscription : 01 mai 2007 18:30
Localisation : Vaucluse
Contact :

Re: Conversion Jeux Thomson TO au format SD

Message par Daniel »

Effectivement ce n'est pas simple, de mon côté je n'ai pas plus avancé : le chargement de "0:PRESH1.BIN" plante, mais où et pourquoi, je n'ai pas encore trouvé.

A propos des différences, il faut savoir que les disquettes d'origine MEGASOFT 2 et LES ATHLETES 2 ont deux faces, avec Les Dieux de la Mer sur la première face et Les Dieux de la Glisse sur la deuxième. Ces deux disquettes sont identiques. Sur le site dcmoto, elles ont été déprotégées, car à l'origine elles testaient un formatage spécial de la piste 79. Elles contiennent aussi des fichiers de scores, preuve qu'elles ont été modifiées avant le transfert sur PC.

La disquette que j'essaye de faire fonctionner a uniquement Les Dieux de la Glisse sur la face 0:. Je ne connais pas son origine. Elle a peut-être été (mal) reconstituée à partir de la face 1: de MEGASOFT 2, ce qui pourrait expliquer le problème de chargement de SAUT.BIN.

Mais le premier problème à résoudre n'est pas là : c'est le plantage du chargement en version .sd alors qu'il fonctionne en version .fd.

@6502man : Malheureusement la trace de dcmoto est limitée aux dernières instructions et ne permet pas toujours de remonter assez loin dans l'historique d'un plantage. J'ai l'intention de supprimer cette limite en écrivant la trace complète dans un fichier, mais j'ai tellement de projets en cours que le temps me manque. De même pour la suggestion de __sam__ (utiliser des plages d'adresses pour les points d'arrêt, plutôt que des adresses simples).
Daniel
L'obstacle augmente mon ardeur.
Avatar de l’utilisateur
6502man
Messages : 12286
Inscription : 12 avr. 2007 22:46
Localisation : VAR
Contact :

Re: Conversion Jeux Thomson TO au format SD

Message par 6502man »

Les points d'arrêts par plages est une très bonne idée, ca aiderais pas mal au débogage :wink:
Phil.

www.6502man.com

To bit or not to bit.
1 or 0.
__sam__
Messages : 7923
Inscription : 18 sept. 2010 12:08
Localisation : Brest et parfois les Flandres

Re: Conversion Jeux Thomson TO au format SD

Message par __sam__ »

6502man a écrit : 14 mars 2021 09:58 Sur DCmoto tu à le trace qui te permet de remonté dans "l'historique" de PC :wink:
Mince c'était devant mes yeux et je voyais pas!! Lol :lol:

Sinon, il y a un truc que je ne pige pas avec SDDrive sous DCMOTO. Si je boot en mode TO8 avec le débuggeur allumé et un point d'arrêt en $8086, que j'appuie sur B pour lancer le chargement du jeu.. Quasi systématiquement j'ai une erreur au niveau du basic "NO Disk". Parfois ca passe, et parfois pas. Parfois on voit le "Appuyez sur une touche", ce qu'on fait "pas tout de suite" (il faut attendre un peu), et boom retour au basic avec un fugace "No Disk" qui s'affiche (la zone texte étant réduite aux 2 premières lignes de texte en haut de l'écran. A l'inverse si le débuggeur n'est pas en marche, on va systématique sur le "Appuyez sur une touche" via la touche B du menu.. on peut alors faire réapparaitre le débuggeur (F9) et si on ne traine pas trop à l'appui sur une touche, le point d'arrest $8086 s'enclenche. Si on traine trop on a encore le "No disk" fugace (retour au basic). Bref: on a un truc aléatoire qui fait disparaitre le disk quand le débuggeur est en route. Cet aspect aléatoire apparait même plus tard après un reset à froid de la machine dès l'appui sur la touche B du menu: le basic dit "no disk" alors qu'on a bel et bien SDDrive en place. C'est vraiment étrange.

Au fait pourquoi ce point d'arrêt en $8086 ? Et bien, en ce point là du code on est sur une zone charnière du loader de fichier BIN. Il s'apprête à décoder un bloc logique. Le registre Y contient la longueur du bloc logique (souvent quelques octets, et 128 au max -- ca fait penser aux binaires générés par la cartouche Assembler qui ne sait pas faire de blocs logiques plus gros que 128 octets) , et X l'adresse de chargement. Cela me permet de voir que le 1er fichier qui est chargé (INCLPAGE.BIN -- ce nom est visible en $80B8) charge des trucs depuis $6400, et le PRESH1.BIN à partir de $9F00. J'ai constaté avec la version FD, au bout de pas mal d'arrêts en $8086 qu'à un moment il y a un bloc logique de 1 octet (Y=1) en X=$E7E7 qui y écrit $5C... Voilà un truc qui assurément nous refait passer sur le controleur interne. La vacherie est que cela n'est pas du code, mais c'est le fichier binaire qui contient ainsi un bloc logique pour changer dynamiquement $E7E7. J'ai essayé de mettre un point d'arrêt sur $E7E7 en mode SDDrive, mais je n'obtiens que des "No Disk" sans atteindre ce point d'arrêt. Mais à part ca je pense bien que c'est là un excellent suspect de l'échec de chargement avec SDDrive si l'on bascule sur un contrôleur interne inexistant (TO8) en cours de chargement.

A noter une particularité de leur format BIN. Ce dernier contient aussi un type de bloc logique de longueur vide, mais qui s'interprète comme l'appel à une sous-routine pointée par X durant le chargement. C'est une extension du format binaire thomson original très intelligente, mais qui ne va pas nous aider à débugger le jeu (le loader pouvant charger une routine, l'exécuter et reprendre le chargement en écrasant la routine précédemment chargée).
Samuel.
A500 Vampire V2+ ^8^, A1200 (030@50mhz/fpu/64mb/cf 8go),
A500 GVP530(MMU/FPU) h.s., R-Pi, TO9, TO8D, TO8.Démos
__sam__
Messages : 7923
Inscription : 18 sept. 2010 12:08
Localisation : Brest et parfois les Flandres

Re: Conversion Jeux Thomson TO au format SD

Message par __sam__ »

__sam__ a écrit : 14 mars 2021 11:48 Sinon, il y a un truc que je ne pige pas avec SDDrive sous DCMOTO. Si je boot en mode TO8 avec le débuggeur allumé et un point d'arrêt en $8086, que j'appuie sur B pour lancer le chargement du jeu.. Quasi systématiquement j'ai une erreur au niveau du basic "NO Disk". Parfois ca passe, et parfois pas. Parfois on voit le "Appuyez sur une touche", ce qu'on fait "pas tout de suite" (il faut attendre un peu), et boom retour au basic avec un fugace "No Disk" qui s'affiche (la zone texte étant réduite aux 2 premières lignes de texte en haut de l'écran. A l'inverse si le débuggeur n'est pas en marche, on va systématique sur le "Appuyez sur une touche" via la touche B du menu.. on peut alors faire réapparaitre le débuggeur (F9) et si on ne traine pas trop à l'appui sur une touche, le point d'arrest $8086 s'enclenche. Si on traine trop on a encore le "No disk" fugace (retour au basic). Bref: on a un truc aléatoire qui fait disparaitre le disk quand le débuggeur est en route. Cet aspect aléatoire apparait même plus tard après un reset à froid de la machine dès l'appui sur la touche B du menu: le basic dit "no disk" alors qu'on a bel et bien SDDrive en place. C'est vraiment étrange.
@Daniel: je reviens là dessus car j'ai l'impression qu'il y a un soucis avec $E7E7 (en émulation TO8 ave SDDrive comme contrôleur externe). Quand j'ai "NoDisk", $6081 vaut $D4 comme attendu (controleur externe). Le DIR échoue (no disk). Si là je force $E7E7 à $D4 via la 2e fenêtre de mise au point, le DIR se remets à marcher.

Visiblement il y a eu une écriture sur $E7E7 qui a effacée le bit de poids fort, sauf que mon point d'arrêt en écriture ne s'est pas déclenché hors des endroits attendus:
- ROM où on écrit $54 (contrôleur interne absent) puis $D4 (contrôleur externe),
- puis lors de l'initialisation et le basic qui écrit $C4 puis $D4 (contrôleur externe actif dans ces deux cas) lors de la tentative de chargement de l'AUTO.BAT.
Tentative qui échoue avec " No disk", parce que visiblement c'est le contrôle interne, absent, qui est sélectionné malgré l'écriture précédente de $D4 en $E7E7 par le basic, et cela sans que le point d'arrêt en écriture sur $E7E7 se soit déclenché.

Se pourrait-il y avoir un aléatoire sur la valeur de $E7E7 suivant le présence d'un point d'arrêt en lecture ou écriture sur cette adresse, ou autre chose qui puisse expliquer cet arrivée de "No disk" quand le débuggeur tourne ?

En modifiant l'AUTO.BAT pour qu'il charge "BOOT.BIN" plus tot (sans ,,R) et qu'il lance EXEC juste après l'appui sur une touche je n'ai pas ([EDIT] non juste moins souvent) ce phénomène aléatoire et je peux débugger correctement.

Si je mets un point d'arrêt en écriture en $9F86, et que je fais des "subroutine" jusqu'en $8086, on découvre que le loader charge un bloc de 1 octet ($5C) en $E7E7. Evidemment cela désactive le contrôleur externe, ce qui fera partir en vrille le prochain chargement de bloc. A noter: après cette valeur $5C en $E7E7, le bloc suivant fait aussi 1 octet et écrit $03 en $E7C5 (commutation bank 3) suivi par un bloc de 128 octets en $A000: le loader charge des trucs en banque 3 normal, sauf que pas de chance l'écriture en $E7E7 a sélectionné le contrôleur interne (inexistant) ce qui fait charger un peu n'importe quoi en $A000. C'est je pense la cause du bug. J'aurais aimé avoir la preuve en remplaçant $5C par $DC.. mais hélas je tombe dorénavant sur du "Program not found".. argh gasp.. le fichier SD est considéré comme vide par DIR.. mais zut alors!!!

Bon je suis quand même convaincu que 1) il y a une instabilité dans l'émulateur qui se manifest sur ce fichier SD (Disk not found, disk qui devient vide) 2) le loader fait basculer sur le contrôleur interne ce qui fait échouer le chargement.

Du coup je prends mon éditeur HEXA favori .. je cherche la 1ere occurrence de $E7E7 dans le SD et je remplace le $5C qui suit par $DC.. je sauve (voir attachment), et je teste.. et là le jeu se charge!!! Par contre ca plante plus loin (message d'erreur "Disk non pret" quand on charge le jeu de saut à ski. J'investigue et je vois au tout début du démarrage du jeu

Code : Tout sélectionner

7906 10CE7DFE   LDS    #$7DFE              4
790A 865C       LDA    #$5C                2
790C B7E7E7     STA    $E7E7               5
 
et oui le jeu rebascule sur le contrôleur interne. Je recherche "86 5c b7 e7 e7" dans mon éditeur hexa, je change le $5C en $DC partout et voilà l'attachement .. totalement corrigé (?) [EDIT] non (il dit "jeu inexistant") mais ca avance...
Pièces jointes
les-dieux-de-la-glisse_to8.zip
(86.9 Kio) Téléchargé 113 fois
Samuel.
A500 Vampire V2+ ^8^, A1200 (030@50mhz/fpu/64mb/cf 8go),
A500 GVP530(MMU/FPU) h.s., R-Pi, TO9, TO8D, TO8.Démos
__sam__
Messages : 7923
Inscription : 18 sept. 2010 12:08
Localisation : Brest et parfois les Flandres

Re: Conversion Jeux Thomson TO au format SD

Message par __sam__ »

Le "Jeu inexistant" qui apparait est lié au fait que le "BSR LDIR0" en debut de RECFI semble charger un catalogue décalé de 128 octets (ou inversé ?) résultant en $FF comme 1ere entrée signifiant "fin de catalogue", donc fichier pas trouvé.
Samuel.
A500 Vampire V2+ ^8^, A1200 (030@50mhz/fpu/64mb/cf 8go),
A500 GVP530(MMU/FPU) h.s., R-Pi, TO9, TO8D, TO8.Démos
Daniel
Messages : 17316
Inscription : 01 mai 2007 18:30
Localisation : Vaucluse
Contact :

Re: Conversion Jeux Thomson TO au format SD

Message par Daniel »

Bien vu ! J'avais cherché des accès à $E7E7 dans le programme de chargement. Il y en a un, mais il tient compte de la valeur sauvegardée en $6081, donc c'est bon. Par contre le fichier binaire qui charge un octet en $E7E7 sans tester $6081, c'est le plantage assuré. J'avais déjà remarqué sur la vraie machine que le contrôleur interne était sélectionné au moment du plantage (la LED rouge de la disquette s'allumait).

Maintenant il faut s'assurer que le jeu lui-même ne cherche pas d'autres fichiers sur la mauvaise face. C'est bien possible.

Pour le bug de dcmoto je vais regarder, mais ce n'est pas facile.

Le répertoire vide, c'est peut-être parce que l'adresse physique de début du fichier .sd sur la carte est écrasée. Dans ce cas elle pointe sur une zone de la carte SD où il n'y a pas d'image de disquette et le DIR ne trouve rien. Il faudrait vérifier s'il n'y a pas une écriture en $6051-$6054, c'est là que le programme de sélection de SDDRIVE stocke le LBA du fichier .sd choisi. Mais si cette zone est écrasée, le décalage ne peut pas être de de 128 octets, c'est un multiple de 512. Il y a peut-être autre chose... (peut-être en rapport avec l'inversion de la FAT ?).
Daniel
L'obstacle augmente mon ardeur.
__sam__
Messages : 7923
Inscription : 18 sept. 2010 12:08
Localisation : Brest et parfois les Flandres

Re: Conversion Jeux Thomson TO au format SD

Message par __sam__ »

Je dis décalage de 128 octets, mais c'est peut-être autre chose. Toujours est-il que le catalogue commence par $FF, comme une diskette vide.. Et j'avais remarqué ca aussi que par moment je perdais le contenu du SD en basic lorsque je sauvais des modifs de AUTO.BAT. Par contre j'ai regardé l'évolution des 4 octets en $6051.. ils semblent stables. MAIS $6049 passe à 1 à un moment!!! Héhé, les fichiers sont chargés sur la face 1: qui est vide, ce qui explique le comportement observé.

Cette valeur est recopiée de $60EF qui est mise à 1 ici:

Code : Tout sélectionner

6DFA 8601       LDA    #$01               
6DFC B760EF     STA    $60EF              
Si je change "86 01 b7 60 ef" par "86 00 b7 60 ef" dans le SD, et bien le jeu se charge sans erreur :D Sauf que ben j'arrive pas à quitter l'épreuve du saut acrobatique (ctrl-espace me fait sans cesse redémarrer la même épreuve), mais là c'est probablement le fait que je ne connaisse pas le jeu qui est en cause :mrgreen: Quoique le saut à ski tout court affiche le décors de l'épreuve et se bloque (coincé en $7E75 sur un SYNC). J'ai peut-être cassé des trucs avec mes patchs sauvages au niveau du fichier SD. Il faudrait tout repatcher proprement il y a pas mal de $E7E7 différents dans le SD).
Pièces jointes
les-dieux-de-la-glisse_to8.zip
(86.9 Kio) Téléchargé 110 fois
Samuel.
A500 Vampire V2+ ^8^, A1200 (030@50mhz/fpu/64mb/cf 8go),
A500 GVP530(MMU/FPU) h.s., R-Pi, TO9, TO8D, TO8.Démos
Daniel
Messages : 17316
Inscription : 01 mai 2007 18:30
Localisation : Vaucluse
Contact :

Re: Conversion Jeux Thomson TO au format SD

Message par Daniel »

Tu progresses vite, bravo !
Malheureusement je n'ai pas eu beaucoup de temps libre pour chercher, mais je n'aurais pas fait mieux ni plus vite.
Ma théorie comme quoi la recherche des protections ou des bugs des jeux est plus intéressante que leur utilisation se confirme :wink:
Daniel
L'obstacle augmente mon ardeur.
__sam__
Messages : 7923
Inscription : 18 sept. 2010 12:08
Localisation : Brest et parfois les Flandres

Re: Conversion Jeux Thomson TO au format SD

Message par __sam__ »

Oui, mais j'ai rien fait d'autre aujourd'hui du coup :)

sam .oO(L'ordi est une machine qui absorbe le temps.)
Samuel.
A500 Vampire V2+ ^8^, A1200 (030@50mhz/fpu/64mb/cf 8go),
A500 GVP530(MMU/FPU) h.s., R-Pi, TO9, TO8D, TO8.Démos
__sam__
Messages : 7923
Inscription : 18 sept. 2010 12:08
Localisation : Brest et parfois les Flandres

Re: Conversion Jeux Thomson TO au format SD

Message par __sam__ »

Bon, je crois que c'est OK à présent. C'était presque bon dans l'archive plus haut sauf pour le saut à ski qui charge un secteur "pas bien lu" (un CMPA ,U+ dans la ROM SDDrive retourne faux) ce qui lève un C=1 qui a l'air d'être ignoré dans la pile des appels (enfin c'est pas clair, ca a l'air variable des fois on a "Erreur Disk", mais d'autres fois le chargement a l'air d'être ok pour le jeu malgré cela) résultant dans la plante de la partie "saut à ski" peu après l'affichage du fond de décors.

L'astuce pour faire marcher a été de simplement recopier la face 0: sur la face 1: du SD et là (coup de chance?) le CMPA ,U+ est toujours ok, et tout fonctionne comme il faut. Impec 8)

@Daniel je sais pas à quoi correspond ce CMPA,U+ (on reçoit $80 du module Catalex émulé au lieu de $84 attendu, ou l'inverse je ne sais plus). Est-ce lié au fait que le fichier SD est trop petit ? (genre: on essaye de lire au delà de la piste 80). Enfin toujours est-il qu'en doublant la face 0: sur la face 1: (doublant la taille des données dans le fichier SD) tout à l'air de marcher sans soucis à présent :D
Pièces jointes
les-dieux-de-la-glisse_to8.zip
(93.34 Kio) Téléchargé 108 fois
Samuel.
A500 Vampire V2+ ^8^, A1200 (030@50mhz/fpu/64mb/cf 8go),
A500 GVP530(MMU/FPU) h.s., R-Pi, TO9, TO8D, TO8.Démos
Daniel
Messages : 17316
Inscription : 01 mai 2007 18:30
Localisation : Vaucluse
Contact :

Re: Conversion Jeux Thomson TO au format SD

Message par Daniel »

Le CMPA ,U+ doit être celui de la routine d'ouverture d'un fichier, en $E5E0 dans la version 20210212 de SDDRIVE (voir ci-dessous).
Sinon il y en a un autre dans l'exécution d'une commande de lecture de la carte SD, mais une erreur à ce niveau est peu probable car ce serait une panne matérielle de SDDRIVE ou du module Catalex ou de la carte SD. Et comme tu as réussi ensuite à charger le jeu ce n'est pas là le problème.

Code : Tout sélectionner

;------------------------------------------------------
; RECFI = Ouverture d'un fichier
;------------------------------------------------------
RECFI
  BSR   LDIR0          ; charge 1er secteur catalogue 
RECFI1
  BCS   RETERR         ; sort si erreur
  LDX   #$0008         ; compteur de noms dans X
  LDY   <DK_CAT        ; pointeur sur buffer
RECFI2
  LDU   <DK_NAM        ; pointeur sur nom de fichier
  LDB   <DK_MOD        ; code operation logique
  CMPB  #$03
  BNE   RECFI3
  LEAU  SCRDOS,PCR     ; adresse du nom de fichier
RECFI3
  CLRB  
RECFI4
  CMPB  #$0b
  BCC   RECFI8
  LDA   B,Y            ; octet de la FAT
  CMPA  #$ff          
  BEQ   RECFI7
  INCB  
  CMPA  ,U+
  BEQ   RECFI4
  LEAY  $20,Y          ; adresse fichier suivant
  LEAX  -$01,X         ; decrementation indice 
  BNE   RECFI2         ; lecture entree suivante 
  INC   <DK_SEC        ; secteur suivant
  LDA   <DK_SEC        ; A = n° secteur
  CMPA  #$10           ; comparaison a 16
  BHI   RECFI7         ; superieur a 16
  LBSR  OPTABL         ; lecture secteur
  LDA   #$03           ; erreur I/O
  BRA   RECFI1         ; secteur suivant
RECFI7
  CLRB                 ; raz n° secteur
  BRA   RECFI9         ; sortie
RECFI8
  LDB   $0b,Y          ; type de fichier (catalogue)
  CMPB  <DK_TYP        ; type de fichier
  BNE   RECFI7
  LDB   $0c,Y          ; flag de fichier (catalogue)
  CMPB  <DK_FLG        ; flag de fichier
  BNE   RECFI7
  LDB   <DK_SEC        ; numero de secteur
  LDA   $0d,Y          ; numero de bloc (catalogue)
  STA   <DK_BLK        ; numero de bloc
  CLR   <DK_SCT        ; numero de secteur
  LDX   $0e,Y          ; taille dernier secteur (catalogue)
  STX   <DK_TDS        ; nbre d'octets du dernier secteur du fichier
  STY   <DK_PSB        ; numero du premier secteur du bloc
RECFI9
  STB   <DK_IFA        ; numero de bloc alloue
  CLRA
  RTS
Finalement ce n'était pas une bonne idée d'utiliser cette disquette bricolée pour debuguer le programme. Visiblement le jeu a été transféré de la face 1: vers la face 0: et l'unité n'a pas été modifiée partout. Il ne suffisait pas de supprimer le DEVICE "1:", la face est sélectionnée "en dur" dans les programmes. Tout comme la modification de $E7E7 sans tenir compte de $6081.

Maintenant que (presque) tout est clair, je vais patcher la version .sd de "Megasoft 02" et "Les Athlètes 2". C'est plus simple car Les Dieux de la Glisse sont déjà sur la face 2, il faut seulement rétablir la bonne valeur de $E7E7.

Cette version avec la face 0: copiée sur la face 1:, il faut soit l'oublier définitivement, soit finir proprement le travail de passage en face 0:. C'est un défi, je ne sais pas si ça a un intérêt. Il serait plus simple qu'un collectionneur transfère sur PC la disquette originale du jeu.
Daniel
L'obstacle augmente mon ardeur.
Répondre