[MZ-700] Expérimentation avec le SDLEP-READER

Placez ici vos trucs et astuces, étalez sans retenue votre savoir-faire et votre science qui va nous permettre de redonner une apparence neuve et fonctionnelle à nos bouzes.

Modérateurs : Papy.G, fneck, Carl

Avatar de l’utilisateur
hlide
Messages : 3469
Inscription : 29 nov. 2017 10:23

[MZ-700] Expérimentation avec le SDLEP-READER

Message par hlide »

Je me suis pris plusieurs Arduini (UNO et MEGA) pour pouvoir les programmer et rajouter des fonctionalités autres que le DIP 7-bit.

Je suis parvenu à faire un montage avec un UNO après l'avoir programmé avec l'INO de Daniel qui se trouve dans la page dédié au SDLEP-READER et qui fonctionne.
IMG_20180218_103834[1].jpg
IMG_20180218_103834[1].jpg (1.27 Mio) Consulté 3656 fois
---

Première modification : inverser le signal MOTOR dans le programme.

Pour rappel, je devais mettre ce signal (et celui de SENSE) à la masse pour que SDLEP-READER démarre la diffusion. Le source INO met en pause la diffusion si MOTOR est à l'état HAUT en effet.

Si je regarde le source du MONITOR du MZ-700,

Code : Tout sélectionner

   1224/     69F :                      ;	MOTOR ON
   1225/     69F :                      ;	IN  D=@W@ :WRITE
   1226/     69F :                      ;	     =@R@ :READ
   1227/     69F :                      ;	EXIT CF=0 OK
   1228/     69F :                      ;	       =1 BREAK
   1229/     69F :                      
   1230/     69F :  C5                  MOTOR:  PUSH    BC
   1231/     6A0 :  D5                          PUSH    DE
   1232/     6A1 :  E5                          PUSH    HL
   1233/     6A2 :  06 0A                       LD      B,0AH
   1234/     6A4 :  3A 02 E0            MOT1:   LD      A,(CSTR)
   1235/     6A7 :  E6 10                       AND     10H             ; Vérifie si le signal MOTOR (PC4) est BAS -> il ne tourne pas
   1236/     6A9 :  28 0E                       JR      Z,MOT4
   1237/     6AB :  06 FF               MOT2:   LD      B,0FFH		; 2 SEC DELAY
   1238/     6AD :  CD 96 09            L06AD:  CALL    DLY12		; 7 MSEC DELAY
   1239/     6B0 :  18 02                       JR      L06B4		; MOTOR ENTRY ADJUST
   1240/     6B2 :                      
   1241/     6B2 :  18 EB                       JR      MOTOR		; ORG 06B2H
   1242/     6B4 :                      
   1243/     6B4 :  10 F7               L06B4:  DJNZ    L06AD
   1244/     6B6 :  AF                          XOR     A
   1245/     6B7 :  18 E2               MOT7:   JR      RET3
   1246/     6B9 :                      
   1247/     6B9 :  3E 06               MOT4:   LD      A,06H           ; Code 0(single bit manipulation)-xxx(unused)-111(PC3)-0(clear) pour mettre le signal M-ON (PC3) à l'état bas -> démarre le moteur (à condition que SENSE soit à la masse) 
   1248/     6BB :  21 03 E0                    LD      HL,CSTPT
   1249/     6BE :  77                          LD      (HL),A
   1250/     6BF :  3C                          INC     A               ; Code 0(single bit manipulation)-xxx(unused)-111(PC3)-1(set) pour mettre le signal M-ON à l'état HAUT
   1251/     6C0 :  77                          LD      (HL),A
   1252/     6C1 :  10 E1                       DJNZ    MOT1            ; Retente l'essai
   1253/     6C3 :  CD 09 00                    CALL    NL
   1254/     6C6 :  7A                          LD      A,D
   1255/     6C7 :  FE D7                       CP      0D7H		; "W"
   1256/     6C9 :  28 05                       JR      Z,MOT8
   1257/     6CB :  11 FB 03                    LD      DE,MSGN1	; Affiche le symbole PLAY MARK
   1258/     6CE :  18 07                       JR      MOT9
   1259/     6D0 :                      
   1260/     6D0 :  11 02 04            MOT8:   LD      DE,MSGN3	; "RECORD."
   1261/     6D3 :  DF                          RST     18H		; CALL MSGX
   1262/     6D4 :  11 FD 03                    LD      DE,MSGN2	; "PLAY"
   1263/     6D7 :  DF                  MOT9:   RST     18H		; CALL MSGX
   1264/     6D8 :  3A 02 E0            MOT5:   LD      A,(CSTR)
   1265/     6DB :  E6 10                       AND     10H             ; Vérifie si le signal MOTOR (PC4) est HAUT -> moteur activé mais il faut attendre 2 secondes avant de sortir de cette fonction !?
   1266/     6DD :  20 CC                       JR      NZ,MOT2
   1267/     6DF :  CD 32 0A                    CALL    QBRK
   1268/     6E2 :  20 F4                       JR      NZ,MOT5
   1269/     6E4 :  37                          SCF     
   1270/     6E5 :  18 D0                       JR      MOT7   
mz8255.gif
mz8255.gif (6.97 Kio) Consulté 3656 fois
j'ai les informations suivantes :
- le signal MOTOR (PC4) est à l'état HAUT quand on demande le démarrage du moteur. C'est ce signal qui est à brancher sur MOTOR de SDLEP-READER.
- le signal M-ON (PC3) pilote le signal "CK" d'un LS74 pour produire le signal PC4 et le signal MOTOR de SDLEP-READER.

Le schéma suivant donne une idée sur l'influence de SENSE:
mz8255-2.gif
mz8255-2.gif (23.74 Kio) Consulté 3656 fois
Le signal SENSE opère sur les signaux PR et CL du LS74. Là où j'ai une difficulté à comprendre, c'est sur quelle valeur de SENSE, le CK est effectif et comment donc Q varie (ce signal servant à alimenter le signal MOTOR de SDLEP-READER).

J'ai donc tenté d'inverser la prise en compte du signal MOTOR dans le source INO : on met en pause si MOTOR est à BAS et non HAUT comme initialement. Mais quand je démarre le MZ-700, SDLEP-READER se met à diffuser comme avant sans que je lui donne l'ordre de charger. Je dois avoir rater quelque chose là...
Avatar de l’utilisateur
hlide
Messages : 3469
Inscription : 29 nov. 2017 10:23

Re: [MZ-700] Expérimentation avec le SDLEP-READER

Message par hlide »

Donc après avoir inversé le signal MOTOR dans le FW de l'Arduino, j'obtiens les résultats suivants :

1) je mets MOTOR sur la masse : ça ne démarre pas. Normal comme comportement.
2) je mets MOTOR sur 5V : ça démarre dès l'allumage. Normal comme comportement.
3) je mets MOTOR sur MOTOR du MZ-700 : ça démarre dès l'allumage sans que je demande explicitement la lecture. Anormal.

Il y a cependant bien une coupure moteur après le chargement du jeu qui fait mettre en pause SDLEP-READER (pas de clignotement) à cause de la seconde copie qui suit en cas d'erreur de checksum que je n'avais pas quand j'avais pas l'inversion dans le FW (SDLEP-READER continuait à diffuser).

Quand je fais RESET, il démarre même si je n'ai pas demandé la lecture. J'y perd mon latin.
Avatar de l’utilisateur
hlide
Messages : 3469
Inscription : 29 nov. 2017 10:23

Re: [MZ-700] Expérimentation avec le SDLEP-READER

Message par hlide »

Tout porte à croire que le signal MOTOR est à l'état HAUT au lancement du MZ-700. Conséquence du SENSE mis sur la masse ?

Voyons le 7417 :

Code : Tout sélectionner

 A | Y
---+---
 H | Hi-Z
 L | L

Si Q du LS74 sort un H alors MOTOR nous sort du H à cause du pullup à 5V ?
Sinon MOTOR nous sort un L.

Voyons le LS04 :

Code : Tout sélectionner

 A | Y
---+---
 H | L
 L | H
Bon un inverseur, donc on va inverser le signal de SENSE pour le CL du LS74 et le B du LS00 ?

B = NOT(SENSE)
CL = NOT(SENSE)

Voyons le LS00 :

Code : Tout sélectionner

 A | B | Y
---+---+---
 H | H | L
 L | x | H
 x | L | H
heu... on a ça ?
A = SENSE
B = NOT(SENSE)

Là, je ne pige pas trop la subtilité...

Voyons enfin le LS74 :

Code : Tout sélectionner

 PR | CL | CK | D | Q | nQ
----+----+----+---+---+-----
 L  | H  | x  | x | H |  L |
 H  | L  | x  | x | L |  H |
 L  | L  | x  | x | * |  * | [*] : Hi-Z ?
 H  | H  | ^  | H | H |  L | [^] : on rising edge
 H  | H  | ^  | L | L |  H |
 H  | H  | L  | x | - |  - | [-] : no change
Bon là ça se corse carrément...
CL = not(SENSE)
PR = H

Code : Tout sélectionner

 PR | CL | CK | D | Q | nQ
----+----+----+---+---+-----
 H  | L  | x  | x | L |  H |
 H  | H  | ^  | H | H |  L | [^] : on rising edge
 H  | H  | ^  | L | L |  H |
 H  | H  | L  | x | - |  - | [-] : no change
Donc:
si SENSE = H, alors Q et MOTOR L (OFF)
si SENSE = L et nQ = H, alors MOTOR H (on) et nQ = L
si SENSE = L et nQ = L, alors MOTOR L (off) et nQ = H

hum... se peut-il que Q serait initialement à H avant que la première bascule ne l'affecte ?
Avatar de l’utilisateur
hlide
Messages : 3469
Inscription : 29 nov. 2017 10:23

Re: [MZ-700] Expérimentation avec le SDLEP-READER

Message par hlide »

La vache ! j'ai rajouté un fil entre le signal SENSE du MZ-700 et le pin A0 de l'Arduino que j'ai mis pour l'occasion en OUTPUT. Initialement, je mets ce signal à HIGH et ce n'est qu'au moment où il trouve un fichier à diffuser que je mets ce signal à LOW. Comme par hasard, il attend que je lance la commande de chargement pour qu'il se met en route !
Avatar de l’utilisateur
6502man
Messages : 12286
Inscription : 12 avr. 2007 22:46
Localisation : VAR
Contact :

Re: [MZ-700] Expérimentation avec le SDLEP-READER

Message par 6502man »

Donc tu as solutionné le problème ?
Phil.

www.6502man.com

To bit or not to bit.
1 or 0.
Avatar de l’utilisateur
Totor le Butor
Messages : 2224
Inscription : 07 sept. 2011 16:14
Localisation : Paris - Mezels

Re: [MZ-700] Expérimentation avec le SDLEP-READER

Message par Totor le Butor »

Il y a une toute petite subtilité dans le montage, la sortie du LS00 est toujours à 1 car on a toujours un 0 sur au moins une des 2 entrées SAUF quand SENSE passe à 0.
En effet, l'entrée 13 du LS00 reste à 1 pendant environ 2 mS à cause de C220 et R33.
A ce moment on récupère un 1 sur la pin 12 du LS00 (et donc un 0 sur le PRESET) ainsi que sur le CLEAR du 7474 ce qui positionne Q à 1 et /Q à 0, après ~2 ms le PRESET repasse à 1, le CLEAR est lui à 1, ce qui met la bascule en position pour accepter l'horloge et faire bouger les sorties Q et /Q au rythme de l'horloge /2 (la bascule est câblée en diviseur par 2, /Q reliée à l'entrée D).
Born to bricole
[Rch] Vieux composants électroniques et circuits intégrés toute époque et vieilles cartes .
Avatar de l’utilisateur
hlide
Messages : 3469
Inscription : 29 nov. 2017 10:23

Re: [MZ-700] Expérimentation avec le SDLEP-READER

Message par hlide »

6502man a écrit : 18 févr. 2018 18:58 Donc tu à solutionné le problème ?
En partie, il ne faut pas que je positionne trop tôt l'état HIGH de SENSE. Il ne faut pas non plus que je le met à LOW trop tôt. Bref, c'est de l'équilibrisme. Si je mets à HIGH avant de rechercher un fichier et à LOW après qu'il en ait trouvé un, il attend bien que je lui demande.

Par contre, ça me crée un soucis en mode fast et turbo qui ne fonctionne plus (ne retrouve pas le header). Peut-être qu'il faut je rallonge le gap avant les tapemarks. Ou c'est quelque chose d'autre... je m'épuise...
Avatar de l’utilisateur
hlide
Messages : 3469
Inscription : 29 nov. 2017 10:23

Re: [MZ-700] Expérimentation avec le SDLEP-READER

Message par hlide »

Totor le Butor a écrit : 18 févr. 2018 19:16 En effet, l'entrée 13 du LS00 reste à 1 pendant environ 2 mS à cause de C220 et R33.
A ce moment on récupère un 1 sur la pin 12 du LS00 (et donc un 0 sur le PRESET) ainsi que sur le CLEAR du 7474 ce qui positionne Q à 1 et /Q à 0, après ~2 ms le PRESET repasse à 1, le CLEAR est lui à 1, ce qui met la bascule en position pour accepter l'horloge et faire bouger les sorties Q et /Q au rythme de l'horloge /2 (la bascule est câblée en diviseur par 2, /Q reliée à l'entrée D).
Le clock est obtenu par la manipulation du PC3 (M-ON). Normalement, il est à l'état 1, mais on passe rapidement à l'état 0 puis à 1 pour créer un front montant qui va initier une bascule. Le but étant de démarrer ou d'arrêter le moteur (MOTOR 1 ou 0). Donc, si on fait SENSE 0, on met MOTOR à 1 automatiquement sans qu'il est besoin de faire une bascule explicitement par le programme ? Parallèlement, le début de lecture peut démarrer le moteur explicitement pour une reprise (par exemple, après le header pour lire les données) si ne l'est pas ou l'arrêter à la fin d'une lecture mais à condition, bien sûr, que le signal SENSE soit resté à 0.

Ca commence à devenir un casse-tète là... il faudrait que ce SENSE à 0 soit enclenché sur l'appui d'un bouton représentant PLAY pour m'en sortir.
Avatar de l’utilisateur
hlide
Messages : 3469
Inscription : 29 nov. 2017 10:23

Re: [MZ-700] Expérimentation avec le SDLEP-READER

Message par hlide »

Totor le Butor a écrit : 18 févr. 2018 19:16...
Ah et merci pour l'explication de la subtilité. Je m'en doutais qu'il y en avait une mais je n'étais pas armé pour la trouver. ^^
Avatar de l’utilisateur
hlide
Messages : 3469
Inscription : 29 nov. 2017 10:23

Re: [MZ-700] Expérimentation avec le SDLEP-READER

Message par hlide »

Bon j'ai continué à expérimenter en modifiant pas mal le programme de départ :

- j'utilise SdFat pour lever la limitation des secteurs contigüs. Pour le futur, je souhaiterais m'essayer à l'enregistrement et à la possibilité d'utiliser un écran qui pourrait afficher le contenu.

- j'utilise Serial pour lancer l'ordre de sélection et de chargement d'un binaire par son nom, car j'ai eu un soucis avec le sélecteur à 7 interrupteurs (je comptais m'en passer un de ces jours).

Au départ, j'avais systématiquement un "checksum error". En cause, un temps trop long pour une lecture d'un octet sur le SD dans certains cas. Je m'y attendais.

Cependant - et c'est là qu'on voit la limite du LEP - il y a moyen de faire fonctionner ça sur le MZ-700 même avec le turbo x4.

Un octet de donnée est encodé avec 18 créneaux donc 18 octets LEP (9 bits dont le dernier toujours à 1). Ca fait un paquet à lire sur le SD. Le code INO d'origine ne fait pas de distinction entre les créneaux haut et bas et lit systématiquement un octet entre deux créneaux. Et c'est là que le bât blesse. La quantité de ces octet et le fait de lire un octet entre les créneaux obligent à faire des optimisations du côté du code qui lit le SD - quitte à ne pas passer par la table des FAT pour le chaînage des secteurs. Situation d'autant plus génante que la fragmentation sur un SD n'est en rien préjudiciable comparé à celle sur une disquette ou un disque dur à cause de la partie mécanique. Intellectuellement, cette limitation pour cette raison me gène.

La seule chose qui compte dans la précision de lecture du MZ-700, c'est la période de lecture entre le front montant et le front descendant. En d'autre terme, il peut se passer une seconde, une minute, une heure après le front descendant sans que cela gène la lecture. Vous voyez où je veux en venir. Il doit s'assurer de lire non pas un mais deux octets de LEP quand il va bientôt annoncer un front montant pour qu'il ait déjà la période à tenir avant de passer au front descendant. Comme ça, la période à partir du front montant jusqu'au front descendant est précise et ne souffre pas d'une latence liée à la lecture d'un octet sur le SD entre ces deux fronts. Bingo. Ca fonctionne même en turbo x4.

Alors oui, je suis toujours dans le cas où le fichier LEP généré à partir d'un binaire MZF (entête de 128 octets suivi des données du binaire) est optimal : pas de silence (donc pas d'octet LEP à 0) et sans déviations dans les périodes. Mais même avec les octets LEP à 0, ça ne devrait pas poser de problème vu la période qui en découle. Et de manière général, on a bien toujours une alternance du signe dans la suite des octets LEP qui ne devrait pas mettre en cause de lire un seul octet en avance mais dans le sens qui nous arrange.

Je me doute bien que de porter ça sur une autre machine pourrait être plus difficile :

- est-ce que la machine priviligie toujours une direction pour un bit de donnée ?
-- si oui, pourait-elle être à l'inverse d'ici ?
--- si oui, on pourrait ajouter un octet en début de fichier LEP pour aider discriminer. Par exemple: 0x01 pour front montant décisif et 0xff pour front descendant décisif (que je n'ai pas fait actuellement),
--- si non, pas de problème.
-- si non, c'est quoi cette machine intolérante !?

Techniquement, il serait aussi possible d'avoir un fichier de configuration à la racine qui indiquerait le type de machine attendu en partant du fait que l'on aurait un SD par machine. Le programme pourrait se servir de ces informations pour fonctionner correctement avec la machine attendue.

Voici le nouveau code qui est propre à la série MZ-80s/700/800 :

Code : Tout sélectionner

#include "Arduino.h"
#include "SdFat.h"

#define MZT_DI 15     // MZ-CMT WRITE (WRITE -> DI)
#define MZT_MI 16     // MZ-CMT MOTOR ON (MOTOR ON -> MI) 
#define MZT_DO 17     // MZ-CMT READ (DO -> READ)
#define MZT_CS 18     // MZ-CMT /SENSE (CS -> /SENSE) 
#define MZT_LO 19     // MZ-CMT LED OUTPUT

#define SD0_SS 10

SdFat   sd;
SdFile  file;

bool load(char filename[13])
{
  if (file.isOpen())
  {
    file.close();
  }

  return file.open(filename);
}

void play()
{
  unsigned long period;                   // période d'un créneau
  unsigned long delta;                    // différence de temps écoulé max avant de passer au créneau suivant
  unsigned long lastEdge;                 // temps écoulé depuis le dernier front montant/descendant
  bool          level = HIGH;             // niveau du signal DATA IN en sortie du lecteur cassette
  bool          led = LOW;                // led bleu indiquant la fréquence de lecture des données
  char          data, next = 0;           // octets LEP lus depuis le SD
  unsigned long count = 0;                // nombre d'octets LEP lu progressivement
  unsigned long ledPeriod = 0;            // période de clignotement pour 512 octets LEP lus
  unsigned long total = file.fileSize();  // nombre total d'octets LEP à lire
  
  digitalWrite(MZT_CS, LOW);  // le signal /SENSE à 0 pour prévenir le MZ que des données sont prêtes
  delayMicroseconds(2000); // laisser le temps au signal MOTOR de passer à 1 suite au signal /SENSE passé à 0

  digitalWrite(MZT_DO, level); // signal DATA IN à 1 initialement
  digitalWrite(MZT_LO, led); // témoin led éteint initialement

  lastEdge = micros(); // temps écoulé initial
  delta = 0;

  while (count < total) // lire tous les octets LEP du fichier
  {
    if (level == LOW && digitalRead(MZT_MI) == LOW) // MOTOR à 0, pause
    {
      digitalWrite(MZT_DO, HIGH); // signal DAT IN à 1
      digitalWrite(MZT_LO, LOW); // témoin led éteint
      
      while (digitalRead(MZT_MI) == LOW) // tant que MOTOR ne repart pas
      {
        if (Serial.available()) // mais si on demande de lire un autre fichier
        {
          return; // on quitte
        }
      }
      
      lastEdge = micros(); // réinitialisation
      delta = 2000 / 16;
    }

    if (next) // l'octet LEP suivant est immediatement disponible
    {
      data = next; // le prendre
      next = 0;
      ++count;
    }
    else
    {
      data = file.read(); // sinon on le lit depuis le SD
      ++count;

      if (data < 0) // si le nouvel octet LEP annonce un front montant à venir
      {
        next = file.read(); // on lit en avance l'octet LEP suivant
      }
    }

    /**/ if (data == 0) period = 127;   // période très longue...
    else if (data <  0) period = -data; // en valeur absolu
    else                period = +data; // en valeur absolu

    period *= 16; // convertit en microsecondes (unité 16 µs)
    
    /**/ if (data > 0) level = HIGH; // si octet LEP positif, prochain créneau à 1
    else if (data < 0) level = LOW;  // si octet LEP négatif, prochain créneau à 0
    
    while (micros() - lastEdge < delta); // on fait une pause dans la période souhaité
    
    digitalWrite(MZT_DO, level); // et on met à jour le créneau en sortie DATA IN
    
    lastEdge = micros(); // met à jour la référence de temps pour la période
    delta = period; // et la période suivante

    ++ledPeriod;
    
    if (ledPeriod & 512) // le led témoin est alterné tous les 512 octets LEP traités
    {
      led = !led; // on alterne le niveau du signal du témoin led
      digitalWrite(MZT_LO, led);
    }
  }
  digitalWrite(MZT_LO, 0); // c'est terminé, plus de témoin led.
}

void setup()
{
  Serial.begin(9600);

  pinMode(MZT_DO, OUTPUT);
  pinMode(MZT_DI, INPUT_PULLUP);
  pinMode(MZT_CS, OUTPUT);
  pinMode(MZT_MI, INPUT_PULLUP);
  pinMode(MZT_LO, OUTPUT);

  digitalWrite(MZT_DO, HIGH); // signal DATA IN à 1 initialement
  digitalWrite(MZT_CS, HIGH); // signal /SENSE à 1 (lecteur non disponible)
  digitalWrite(MZT_LO, LOW);  // témoin led éteint

  if (!sd.begin(SD0_SS, SPI_FULL_SPEED)) // accès au SD en full-speed
  {
    sd.initErrorHalt();
  }
}

void loop()
{
  Serial.println("MZTLOADER");
  Serial.println("Type a file name to load.");

  while (!Serial.available()) // on attend le nom du fichier
  {
    ::yield(); // moins de pression sur le CPU
  }

  char filename[13] = "";

  if (Serial.readBytes(filename, 8)) // on récupère le nom
  {
    strcat(filename, ".lep");

    Serial.print("Looking for ");
    Serial.print(filename);
    Serial.println("...");

    if (load(filename)) // on vérifie s'il existe et on prépare le chargement
    {
      Serial.print("Loading ");
      Serial.print(filename);
      Serial.print("... (");
      Serial.print(file.fileSize());
      Serial.println(" bytes)");

      play(); // et on joue !

      Serial.println("Done.");
    }
    else
    {
      Serial.println("File not found.");
    }
  }
  else
  {
    Serial.println("Invalid filename.");
  }

  digitalWrite(MZT_CS, HIGH); // le lecteur n'est plus disponible jusqu'à la prochaine demande  
}


Maintenant que j'ai enlevé une grosse épine avec ce SdFat, je vais pouvoir me concentrer sur d'autres aspects :

1) Plus spécifique à la série MZs : l'intégration du mzf2lep dans le programme pour pouvoir lire directement du MZF (moins en taille, moins de pression à la lecture).

2) Moins spécifique à une machine : la possibilité d'enregistrer en LEP.

3) Moins spécifique à une machine : utiliser les différents IHM à disposition pour se passer du Serial lors de la sélection du fichier.
IMG_20180325_195658.jpg
IMG_20180325_195658.jpg (1.4 Mio) Consulté 3483 fois
IMG_20180325_195707.jpg
IMG_20180325_195707.jpg (1.08 Mio) Consulté 3483 fois
Dernière modification par hlide le 25 mars 2018 20:05, modifié 1 fois.
Daniel
Messages : 17316
Inscription : 01 mai 2007 18:30
Localisation : Vaucluse
Contact :

Re: [MZ-700] Expérimentation avec le SDLEP-READER

Message par Daniel »

On peut résumer en disant que le format .lep, en voulant être universel, n'est pas optimal pour chaque ordinateur.

Il est évident qu'on peut compacter davantage et améliorer les performances avec un codage adapté pour chaque machine. Pour Thomson, par exemple, le format .k7 utilisé par les émulateurs est beaucoup plus compact et permet de générer les mêmes signaux en sortie de l'Arduino en lisant beaucoup moins d'octets sur la carte SD.

Le revers de la médaille est la nécessité de développer un programme spécifique pour chaque machine. C'est du travail, mais le résultat sera meilleur.

Il y a quand même un inconvénient, en particulier dans un cas que je connais bien : les cassettes Thomson pour MO. Les éditeurs ont développé des protections sophistiquées, qui changent en particulier les périodes des signaux, mais aussi la codification des octets et le format des blocs de données. Le format .lep, comme le format .wav, est indépendant du codage et convient dans tous les cas. Un programme sur mesure ne saura pas les traiter tous.
Daniel
L'obstacle augmente mon ardeur.
Avatar de l’utilisateur
hlide
Messages : 3469
Inscription : 29 nov. 2017 10:23

Re: [MZ-700] Expérimentation avec le SDLEP-READER

Message par hlide »

Allez hop, l'Arduino MEGA avec un écran à cristaux liquides et des boutons pour une utilisation en autonome. Toujours en turbo x4 mais avec une barre de progression, si si ! la vidéo qui le démontre est ici. Le binaire que je charge sort une musique appelée PLOP sur mon MZ-700. C'est presque parfait sauf que je vais avoir du mal à enfermer ça dans le MZ-700 avec l'écran et les boutons...
__sam__
Messages : 7923
Inscription : 18 sept. 2010 12:08
Localisation : Brest et parfois les Flandres

Re: [MZ-700] Expérimentation avec le SDLEP-READER

Message par __sam__ »

Sympa la barre de progression.
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
gleike
Messages : 1341
Inscription : 16 oct. 2014 11:12
Localisation : Ludres (54710) Meurthe & Moselle

Re: [MZ-700] Expérimentation avec le SDLEP-READER

Message par gleike »

@hlide

Comment fait tu pour afficher la barre progression pendant la lecture,
j'ai réalisé un module similaire au tien avec bouton et afficheur,(non finalisé)
mais je n’arrive pas a accéder à l'affichage sans perturber la lecture, un problème avec les interruptions.
Avatar de l’utilisateur
hlide
Messages : 3469
Inscription : 29 nov. 2017 10:23

Re: [MZ-700] Expérimentation avec le SDLEP-READER

Message par hlide »

J'ai réécrit le firmware à ma convenance :

- les interruptions sont autorisées.
- J'ai mis une résolution de 16 µs au lieu de 50 µs et surtout j'intègre le temps des opérations comme la lecture du SD dans la boucle de période avant de passer à la pulsation suivante.

Je n'ai pass essayé à ce moment là d'intégrer le LCD mais je doute que ça aurait fonctionné.

Par la suite, j'utilise SdFat au lieu des routines de lecture SD qui sont dans le firmware (pour pouvoir se balader dans le SD et de ne pas être géné par la fragmentation de la FAT). Un problème est alors apparu. Mais je l'ai réglé pour le MZ-700 parce que je savais que le seul moment critique dont il fallait respecter la période est entre le front montant et le front descendant. Je ne lis donc le SD et n'affiche sur le LCD que hors de cette période critique. Ca revient à lire deux octets hors période critique pour que tu n'ais pas à le faire dans la période critique. mais c'est une spécificité des SHARP MZ. Les autres ordinateurs peuvent avoir leur moment critique en sens inverse (fronts descendant puis montant). Le truc, c'est de le savoir pour chaque machine. Si tu as un SD par machine, un fichier de configuration pour indiquer comment le faire dans le bon sens pourrait être une solution.

Par contre, si ta machine a des périodes critiques dans les deux sens ou peut inverser le sens du moment critique en plein milieu (proctection contre la piraterie), tu n'as peut-être aucune solution.
Répondre