[DCMOTO/MESS] Freeze HNY2013

Couvre tous les domaines de l'émulation ou de la virtualisation ainsi que les discussions sur les divers outils associés.

Modérateurs : Papy.G, fneck, Carl

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

Re: [DCMOTO/MESS] Freeze HNY2013

Message par Daniel »

En optimisant j'ai réussi à inverser la FAT à la lecture et à l'écriture en utilisant au total 30 octets. Il reste 8 octets libres dans l'EPROM de SDDRIVE.
La démo Elvis Live, modifiée pour forcer l'octet densité à zéro, fonctionne.
dcmoto_20210210.zip
(1.2 Mio) Téléchargé 103 fois

Code : Tout sélectionner

;------------------------------------------------------
; Ecriture de la FAT
;------------------------------------------------------
ECRFA
  LDX   <DK_FAT        ; adresse de la FAT
  BSR   INVFA          ; inversion de la FAT
  LDA   #$02
  STA   <DK_SEC        ; secteur 2
  LDB   #$14
  CLRA  
  STD   <DK_TRK        ; piste 20
  STX   <DK_BUF        ; adresse du buffer secteur
  BSR   ECRSE          ; ecriture secteur
  BLO   FINTR9         ; erreur ecriture
  CLR   <DKWF0         ; indicateur cloture fichier
FINTR9
  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

Ce n'est pas encore fini (ni gagné), car de nombreuses routines du scratch dos lisent et modifie la FAT. Il faut les contrôler une à une pour s'assurer qu'elles fonctionnent encore avec les deux moitiés de la FAT inversées. J'ai bon espoir, car l'accès semble utiliser des adresses du style B,Y ou B,X, il n'y a peut-être rien à changer. Sauf que le nombre de blocs semble limité à 80, comme avec les disquettes 40 pistes, alors qu'il devrait être limité à 160 pour les disquettes à 80 pistes. C'est un autre bug que je n'avais pas vu, preuve que le scratch dos est rarement utilisé. Peut-être quelques fois en lecture et jamais en écriture, sinon ces anomalies auraient été découvertes plus tôt.

Exemples :

Code : Tout sélectionner

;------------------------------------------------------
; ALLOB = allocation d'un bloc
;------------------------------------------------------
ALLOB
  LDB   <DK_BLK        ; numero de bloc
  CMPB  #$50
  BHI   ALLOB3
ALLOB1
  TSTB  
ALLOB2
  BEQ   ALLOB4
  LDA   B,Y
  CMPA  #$ff
  BEQ   ALLOB8
  DECB  
  CMPB  #$50
  BLS   ALLOB1
ALLOB3
  ADDB  #$02
  CMPB  #$A1
  BRA   ALLOB2
ALLOB4
  LDB   #$50  
ALLOB5
  LDA   #$05
  CMPB  #$A0
  LBHI  RETERR
  LDA   B,Y
  CMPA  #$ff
  BEQ   ALLOB8
  PSHS  B
  SUBB  #$50
  NEGB  
  ADDB  #$50
  LDA   B,Y
  CMPA  #$ff
  BEQ   ALLOB6
  PULS  B  
  INCB  
  BRA   ALLOB5
ALLOB6
  LEAS  $01,S 
ALLOB8
  CLR   B,Y
  DECB  
  STB   <DKWF9         ; numero de bloc alloue
ALLOB9
  CLRA
  RTS

Code : Tout sélectionner

;------------------------------------------------------
; RECUP = liberation d'un bloc
;------------------------------------------------------
RECUP
  LDA   $0d,Y
  STA   <DK_BLK        ; numero de bloc
  CLR   ,Y
  LBSR  ECRSE
  BLO   ALLOD5
  LDY   <DK_FAT        ; adresse de la FAT
  LDB   <DK_BLK        ; numero de bloc
RECUP1
  INCB  
  LDA   B,Y
  CLR   B,Y
  DEC   B,Y
  TFR   A,B
  CMPA  #$c0
  BLO   RECUP1
  BRA   ALLOB9
Daniel
L'obstacle augmente mon ardeur.
__sam__
Messages : 6799
Inscription : 18 sept. 2010 12:08
Localisation : Brest et parfois les Flandres

Re: [DCMOTO/MESS] Freeze HNY2013

Message par __sam__ »

ALLOB me semble curieusement complexe. Il y a 2 boucles.

La premiere entre ALLOB1,B2,B3 recherche un emplacement de libre "vers le bas" si le bloc courant est avant la FAT (bloc 80), et vers le haut si le bloc courant est après la FAT. Il y a une astuce où l'on fait B-1+2 pour remonter vers le haut. Ensuite la boucle ALLOB4 fait la recherche sur l'autre moitié, mais comme elle ne sait pas si elle vient d'au dessus ou en dessous la FAT, elle vérifie les deux!!

Code : Tout sélectionner

ALLOB4
  LDB   #$50            ; bloc=FAT
ALLOB5
  LDA   #$05            ; erreur si pas de place
  CMPB  #$A0
  LBHI  RETERR          ; fin disk atteinte ==> plus de place
  LDA   B,Y             ; test bloc au dessus fat 
  CMPA  #$ff            ; libre ?
  BEQ   ALLOB8          ; ok trouvé
  PSHS  B               ; non, passe au bloc symétrique par rapport à la FAT
  SUBB  #$50            ; \
  NEGB                  ;  |==> Façon super inefficace de faire SUBB #$A0 + NEGB
  ADDB  #$50            ; /
  LDA   B,Y             ; test 160-B
  CMPA  #$ff            ; libre ?
  BEQ   ALLOB6          ; trouvé!!!
  PULS  B               
  INCB                  ; on passe au suivant
  BRA   ALLOB5
ALLOB6
  LEAS  $01,S           ; correction pile
ALLOB8
   (on a trouvé le bloc, on le marque comme réservé, etc..)
Ce code me semble complètement inefficace. :evil:

Déjà au niveau implementation, le calcule de 160-B est totalement tordu (on fait -(B-80) + 80 au lieu de "SUBB #160 + NEGB"). Ensuite, on fait des "LDA B,Y + CMPA #255", alors qu'on gagnerait à avoir 255 dans A et faire CMPA B,Y directement. Enfin la 1ere boucle aurait été plus propre en la séparant en deux cas plus compacts suivant qu'on est avant ou après la FAT. La factorisation qui est faite là est consommatrice de rom sans raison :(

Ensuite au niveau algorithmique, on fait une 1ere passe concernant la moitié de dans laquelle le bloc courant se trouve, et si cette moitié est pleine, on teste ensuite les deux moitiés dessus/dessous. Or c'est idiot vu qu'au moins l'une de ces deux moitiés est déjà pleine. Ok ca fait le job de tester l'autre moitié, mais c'est sacrément inefficace et surtout hyper consommateur de ROM. Beurk!

J'imagine que l'algo de descendre les blocs quand on est sous la fat et de remonter quand on est dessus est une optimisation par rapport à la mécanique du bras de lecture en cas de disk fragmenté: en restant dans la même moitié, le bras n'a pas à aller d'un bout à l'autre du disk lors de la lecture d'un fichier fragmenté. C'est bien pour un contrôleur floppy physique, mais sur un contrôleur SD c'est totalement inutile!

Dans le contrôleur SD, je pense qu'on se se restreindre à une seule politique de parcours du disk: on commence par la piste max et on descend vers la 0. C'est tout petit et aussi efficace

Code : Tout sélectionner

;------------------------------------------------------
; ALLOB = allocation d'un bloc
;------------------------------------------------------
ALLOB
  LDD   #$FFA0          ; A=255 B=160 bloc max
ALLOB1
  CMPA  B,Y             ; bloc B libre ?
  BEQ   ALLOB2          ; oui ==> trouvé
  DECB                  ; non on regarde B-1 
  BNE   ALLOB1          ; si fin disk 
  LDA   #15             ; erreur pas de d'entrée trouvées
  LBRA  RETERR
ALLOB2
  CLR   B,Y             ; on marque le bloc comme occupé
  DECB                  ; mise a jour du
  STB   <DKWF9          ; numero de bloc alloue
  CLRA
  RTS
Remarquons que cette stratégie peut rendre une organisation disk un peu moins efficace sur les floppy fragmentées, mais d'une part, pour fragmenter une floppy avec quelques fichiers, il faut vraiment le vouloir; et d'autre part ici on travail sur SD ou la fragmentation n'a aucun impact. Enfin je pense que ca n'est pas dramatique si l'on converti le SD en vrai floppy plus tard. Bref, je pense que cet algo est plus rapide, (beaucoup) plus court et globalement avantageux pour le contrôleur SD. T'en penses quoi Daniel ?
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 : 15449
Inscription : 01 mai 2007 18:30
Localisation : Vaucluse
Contact :

Re: [DCMOTO/MESS] Freeze HNY2013

Message par Daniel »

L'algorithme d'allocation d'un bloc est celui du contrôleur CD90-640. Il privilégie les blocs autour de la piste 20 pour minimiser les déplacements de la tête. Ça n'a effectivement aucun intérêt pour les fichiers .sd puisqu'il n'y a pas de mécanique. Par contre je préférerais privilégier les premières pistes plutôt que les dernières, pour une meilleure compatibilité avec les disquettes 5"1/4 à 40 pistes.

On peut donc simplifier la routine d'allocation d'un bloc. Les disquettes créées à partir des fichiers .sd ne seront pas optimisées, mais aucun utilisateur ne le remarquera, c'est sûr et certain.

Je vais préparer une nouvelle version du contrôleur SDDRIVE, sans précipitation pour prendre le temps de bien vérifier chaque modification. J'en profiterai pour rétablir le code densité à zéro en $6058, ça évitera de modifier spécifiquement les fichiers .sd. Il faut que je trouve un autre octet libre, ce n'est pas simple.

Tout ça pour la satisfaction intellectuelle, car en pratique la version actuelle peut être utilisée sans crainte, elle est uniquement mise en défaut par les programmes utilisant le scratch dos. Pour ma part je n'ai pas encore vu de problème dans les logiciels commerciaux. Si un utilisateur en rencontre il faut le signaler.
Daniel
L'obstacle augmente mon ardeur.
Asic512
Messages : 110
Inscription : 30 juin 2019 21:13

Re: [DCMOTO/MESS] Freeze HNY2013

Message par Asic512 »

Bonjour,

J'avais testé (il y a déjà quelque temps) un certain nombre de fichiers SD (sur TO8 + SDDRIVE) sans relever précisément ce qui fonctionnait ou non. Je me souviens que je ne suis jamais arrivé à faire fonctionner la "marque jaune" alors qu'il me semble que ce fichier passe sur dcmoto. Mais c'est peut-être un problème de protection comme on en avait discuté dans un fil (très) antérieur.
Asic512
__sam__
Messages : 6799
Inscription : 18 sept. 2010 12:08
Localisation : Brest et parfois les Flandres

Re: [DCMOTO/MESS] Freeze HNY2013

Message par __sam__ »

Il serait intéressant de connaitre les programmes utilisant le minidos. Il y a colorpaint, j'en suis certain. Pour les autres j'imagine qu'il suffit de vérifier s'ils permettent d'utiliser le floppy sur TO7/70. Pour l'instant j'ai trouvé:
  • Colorpaint
  • Prologue, que je ne connaissais pas sur thomson (j'en ai fait en école d'ingé et dans mon 1er job.) Il faudra que je joue avec à un moment, mais le manuel est ardu à lire (surtout que le symbole logique /\ ("et") est parfois manquant dans le fichier djvu).
  • Gerez vos fiches -- personne ne doit s'en servir
  • Gestion privée -- pas bien passionnant
  • possiblement Colorcalc mais qui plante lors des accès diskette (ou alors j'ai mal compris)
  • Caractor 2 -- le 1 pourrait marcher car il y a des icones "disk", mais elles sont grisées.
  • Compactor
Ce sont +/- des logiciels professionnels, donc que personne n'utilise plus de nos jours.
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 : 15449
Inscription : 01 mai 2007 18:30
Localisation : Vaucluse
Contact :

Re: [DCMOTO/MESS] Freeze HNY2013

Message par Daniel »

Dans La Marque Jaune il y a un autre problème. Je viens de m'apercevoir que même le fichier .fd ne fonctionne plus avec la dernière version de dcmoto en mode TO8D. Par contre il fonctionne en mode TO9+, en version .sd comme en version .fd. Il est difficile de comprendre pourquoi. Le problème de fond est mon incompréhension de la protection. Il faudrait ouvrir un sujet spécifique pour en discuter, car c'est indépendant du contrôleur SDDRIVE.

L'utilisation du minidos n'est pas exclue : En fichier .sd sur TO9+, il fonctionne avec la version 2021.02.10 de dcmoto (qui inverse les deux moitiés de la FAT), mais il ne fonctionne pas avec les précédentes (qui ne les inverse pas). Ce n'est pas une preuve, mais un bon indice.

Les logiciels listés par __sam__ ne doivent pas être couramment utilisés par les joueurs du forum, sauf peut-être Colorpaint. Mais comme ils utilisent le minidos il est important qu'il soit bien émulé par SDDRIVE. C'est l'objectif...
Daniel
L'obstacle augmente mon ardeur.
Daniel
Messages : 15449
Inscription : 01 mai 2007 18:30
Localisation : Vaucluse
Contact :

Re: [DCMOTO/MESS] Freeze HNY2013

Message par Daniel »

Le contrôleur SDDRIVE a été modifié
- Pour mettre 0 dans le code densité en $2058/$6058.
- Pour inverser les deux moitiés de la FAT chargée en mémoire.
- Pour rechercher les blocs libres à partir de la piste 0 jusqu'à la piste 79.

La version 2021.02.11 de dcmoto intègre ces modifications, ainsi que la correction d'un bug sur les IRQ clavier.
Les démos HNY2013 et Elvis Live fonctionnent en version .sd non modifiée (conforme aux fichiers .fd officiels de 2013).
dcmoto_20210211.zip
(1.3 Mio) Téléchargé 104 fois

J'ai peur que la nouvelle allocation des blocs soit un peu plus longue que l'ancienne lors de l'écriture d'un fichier de plusieurs blocs :
- L'ancienne version commençait la recherche à partir du dernier bloc alloué à ce fichier.
- La nouvelle version commence toujours à la piste 0, et réexamine donc les mêmes blocs inutilement à chaque nouvelle allocation.

Mais d'une part ce n'est peut-être pas très long car le test est simple, d'autre part il doit y avoir très peu de programmes utilisant le scratch dos pour écrire un fichier.

Toutes les modifications effectuées sont assez périlleuses car elles n'ont pas été beaucoup testées. J'attendrai encore quelques semaines avant de les diffuser officiellement. Si vous détectez la moindre anomalie n'hésitez pas à la signaler, c'est le meilleur moyen pour trouver les bugs.
Daniel
L'obstacle augmente mon ardeur.
Daniel
Messages : 15449
Inscription : 01 mai 2007 18:30
Localisation : Vaucluse
Contact :

Re: [DCMOTO/MESS] Freeze HNY2013

Message par Daniel »

Retour sur "La Marque Jaune" en version .fd et .sd :

1) Un bug (régression) de l'émulateur dcmoto a empêché La Marque Jaune de fonctionner, depuis la version 20210604 jusqu'à la version 20210212.
La version 20210216 de dcmoto résout le problème, les fichiers .fd et .sd fonctionnent bien.
http://dcmoto.free.fr/emulateur/index.html

2) L'erreur en version .sd était provoquée par la non inversion de la FAT chargée en mémoire. La version 20210212 du contrôleur SDDRIVE corrige le problème d'Elvis Live, mais aussi celui de La Marque Jaune. Avec cette nouvelle version le fichier .sd fonctionne aussi avec les vrais TO8/TO8D/TO9+.
http://dcmoto.free.fr/bricolage/sddrive/index.html
Daniel
L'obstacle augmente mon ardeur.
__sam__
Messages : 6799
Inscription : 18 sept. 2010 12:08
Localisation : Brest et parfois les Flandres

Re: [DCMOTO/MESS] Freeze HNY2013

Message par __sam__ »

Pour la culture générale, quel était le soucis avec l'ancien DCMoto ? Le bug de l'ACIA (clavier sur TO9) qui interférait avec la marque jaune ?
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 : 15449
Inscription : 01 mai 2007 18:30
Localisation : Vaucluse
Contact :

Re: [DCMOTO/MESS] Freeze HNY2013

Message par Daniel »

Le bug était très simple : Le loader BOOT.BIN de La Marque Jaune est exécuté en mémoire vidéo forme.
Au chargement d'une disquette, dcmoto initialise, en fonction de la densité, la banque du contrôleur externe (ou la banque système si c'est un contrôleur interne) en écrivant en $E7C3. Par erreur il remettait le bit 0 à zéro, ce qui sélectionnait la mémoire vidéo couleur. Le loader se chargeait en mémoire vidéo couleur (et pas forme). On imagine la suite...

Ce loader utilise le scratch dos du contrôleur pour charger d'autres fichiers. En version .fd, avec le contrôleur de disquette interne il a toujours bien fonctionné. En version .sd, avec l'ancien contrôleur SDDRIVE (qui n'inversait pas la FAT) il ne fonctionnait pas. Avec le nouveau contrôleur SDDRIVE (20210212) la FAT est inversée et il fonctionne bien.
Daniel
L'obstacle augmente mon ardeur.
__sam__
Messages : 6799
Inscription : 18 sept. 2010 12:08
Localisation : Brest et parfois les Flandres

Re: [DCMOTO/MESS] Freeze HNY2013

Message par __sam__ »

Comme quoi il n'y a finalement pas que les premiers progiciels à utiliser le dos du contrôleur. Même certains jeux tardifs (1988) le font aussi. Les Ripoux, Maxi Bourse International, Meurtres sur l'Atlantique et Turlogh le Rôdeur sont du même éditeur (cobrasoft), avec un même "réalisateur" (Bertrand Brocard) et sensiblement de la même époque. Je me demande s'ils tapent dans le scratch.dos/minidos eux aussi.
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 : 15449
Inscription : 01 mai 2007 18:30
Localisation : Vaucluse
Contact :

Re: [DCMOTO/MESS] Freeze HNY2013

Message par Daniel »

C'est bien possible, et ça peut expliquer le non fonctionnement de plusieurs autres jeux au format .sd avec l'ancienne version du contrôleur.
Si les fichiers ne vont pas au-delà de la piste 63, il n'y a pas de problème. Après la piste 63 bonjour les dégâts.
C'était un bug subtil, il a fallu trois ans pour le trouver. Maintenant c'est du passé, la nouvelle version semble bonne.
Le problème, c'est que 2 x 64 = 128. Comprenne qui pourra :wink:
Daniel
L'obstacle augmente mon ardeur.
Asic512
Messages : 110
Inscription : 30 juin 2019 21:13

Re: [DCMOTO/MESS] Freeze HNY2013

Message par Asic512 »

Félicitations Daniel pour toutes ces corrections !

Je regrette un peu de ne pas avoir plus prêté attention à ce qui ne fonctionnait pas parmi les conversions en .sd. Il faudra que j'attende de prochaines vacances pour avoir à nouveau un TO8 sous la main.

PS : pourra-t-on dans le futur "upgrader" les anciens SDDRIVE ?
Asic512
Daniel
Messages : 15449
Inscription : 01 mai 2007 18:30
Localisation : Vaucluse
Contact :

Re: [DCMOTO/MESS] Freeze HNY2013

Message par Daniel »

Il est possible d'upgrader le contrôleur SDDRIVE dès maintenant :
- Soit en reprogrammant l'EPROM. Les fichiers binaires sont ici --> http://dcmoto.free.fr/bricolage/sddrive/index.html
- Soit en achetant la nouvelle EPROM. La procédure est ici --> https://forum.system-cfg.com/viewtopic.php?f=10&t=9196
Daniel
L'obstacle augmente mon ardeur.
cosmos99
Messages : 956
Inscription : 22 juil. 2012 20:15
Localisation : Chatenay-Malabry(92)

Re: [DCMOTO/MESS] Freeze HNY2013

Message par cosmos99 »

Je n'avais pas vu le sujet , je ferais quelques tests des que possible.
Eric
Répondre