[EMULATION AMSTRAD CPC] AMSpiriT - work in Progress
Modérateurs : Papy.G, fneck, Carl
Re: [EMULATION AMSTRAD CPC] AMSpiriT - work in Progress
@sam : tu tiens certainement l’explication. J’échantillonne à 62,5 kHz. Certaines démos sonores exploitent cette possibilité pour générer des sample plus réaliste. Il se peut qu’il y ait un repliement de spectre comme tu l’indiques. Après c’est trop technique pour moi. J’ai vu que ça coince à haute fréquence dans mon outil de test du PSG (dispo sur l’émulateur) où je peux générer un son carré sur toute la plage de fréquence autorisé (quelques Hz ou 56/kHz je crois). En deçà de la valeur 5 du registre R0 du PSG (soit autours de 20 kHz, le son redevient plus grave, ce qui n’est pas logique du tout…
@seb : le problème de lecture des fichiers disquette vient certainement du fait que je ne gère pas les protections mais il y a peut être d’autres causes. Je regarderai. L’émulation du FDC reste encore très partielle.
@ Zebulon : pour druid, le cdt est complètement atypique. Il contient plus de 65535 blocs là où un fichier normal en contient 200 max. Ca explose la mémoire, c’est bien le mot…
Bon, ben j’ai du boulot. Merci messieurs…
@seb : le problème de lecture des fichiers disquette vient certainement du fait que je ne gère pas les protections mais il y a peut être d’autres causes. Je regarderai. L’émulation du FDC reste encore très partielle.
@ Zebulon : pour druid, le cdt est complètement atypique. Il contient plus de 65535 blocs là où un fichier normal en contient 200 max. Ca explose la mémoire, c’est bien le mot…
Bon, ben j’ai du boulot. Merci messieurs…
Re: [EMULATION AMSTRAD CPC] AMSpiriT - work in Progress
Me revoilà après quelques jours d'investigations. Il me semble avoir compris l'origine des sifflements dans les aigus. Dans les cas en question, le AY est programmé pour jouer un son sur une fréquence normalement inaudible (31.25 ou 62.50 kHz) et c'est juste la variation rapide du volume de la voie qui créé la mélodie. Le son aigu vient de la fréquence "porteuse" à plus de 20kHz qui est mal rendue (en échantillonnant qu'à 62,5 kHz, il doit y avoir un repliement de spectre...). J'ai supprimé ce son aigu en "trichant" un peu. A plus de 20 kHz, je considère que le son est inaudible et que le signal porteur est un signal de volume constant. cela me permet de neutraliser les sifflements parasites dans les aigus sans dénaturer le rendu sonore au final.
A toi de me dire Zebulon si le rendu sonore est plus conforme à ce que tu attends.
Concernant "Druid", j'ai du réécrire en parti le module de conversion d'un fichier CDT au format WAV (car j'ai besoin de faire cette conversion pour lire l'enregistrement natif comme sur une vraie cassette). Auparavant j'allouais une zone en mémoire par bloc d'enregistrements lu. Désormais la conversion se fait en direct sans passer par la création de buffers en mémoire. La conversion est plus rapide et plus de soucis de fuite de mémoire. ça fonctionne beaucoup mieux maintenant.
c'est tout pour aujourd'hui.
Je vous laisse tester cette nouvelle version qui porte désormais le numéro v0.429b...en première page de ce post.
A toi de me dire Zebulon si le rendu sonore est plus conforme à ce que tu attends.
Concernant "Druid", j'ai du réécrire en parti le module de conversion d'un fichier CDT au format WAV (car j'ai besoin de faire cette conversion pour lire l'enregistrement natif comme sur une vraie cassette). Auparavant j'allouais une zone en mémoire par bloc d'enregistrements lu. Désormais la conversion se fait en direct sans passer par la création de buffers en mémoire. La conversion est plus rapide et plus de soucis de fuite de mémoire. ça fonctionne beaucoup mieux maintenant.
c'est tout pour aujourd'hui.
Je vous laisse tester cette nouvelle version qui porte désormais le numéro v0.429b...en première page de ce post.
Dernière modification par Dmanu78 le 09 sept. 2021 14:07, modifié 1 fois.
Re: [EMULATION AMSTRAD CPC] AMSpiriT - work in Progress
Super merci beaucoup pour cette version. Je teste ça et je te reviens mais on sent bien que tu maîtrises ton code et les arcanes du CPC.
Re: [EMULATION AMSTRAD CPC] AMSpiriT - work in Progress
Hello. J'ai commencé mes tests sur la dernière version et les sifflements ont bien disparu, la musique est impeccable. Je suis en train de charger Druid sur cassette avec la musique, émulation impeccable (je me suis toujours demandé comment c'était possible de faire les deux en même temps). Encore bravo !
Re: [EMULATION AMSTRAD CPC] AMSpiriT - work in Progress
Super. Merci pour tes retours Zebulon. Je pense que l’émulation sonore est quasiment au point maintenant.
N’hésite pas si tu constates d’autres anomalies. L’émulation ne pourra que s’améliorer...
Effectivement c’est impressionnant de pouvoir jouer de la musique durant le chargement d’un jeux sur cassette car contrairement à une disquette, il n’y a pas de possibilité de relire l’enregistrement à la volée en cas d’erreur de lecture. Et les timing de lecture sont très serrés. C’est pour cela que les interruptions sont normalement bloquées durant une lecture cassette.
Ce qui est amusant, c’est que le son qui sort du haut parleur du CPC 464 durant le chargement d’une cassette ne provient absolument pas du AY mais est provoqué par une interférence dû au design même de la carte mère du CPC. La piste qui transmet les informations du lecteur de cassette est juste à côté de celle qui transmet le son vers le haut parleur et la parasite. Il semblerait qu’il y ait un défaut d’isolation de la masse mais ce n’est pas si surprenant, le design du CPC est assez ´low cost’. Les concepteurs du CPC ont du trouver ça intéressant et n’ont pas cherché à corriger le design.. Le son est produit naturellement sans consommer aucune ressource.
https://www.cpcwiki.eu/forum/amstrad-c ... he-cpc-464
Je vais désormais m’atteler à un autre chantier qui va me prendre un peu de temps : améliorer l’émulation du FDC afin de pouvoir charger les disquettes protégées…ce sera pour de prochaines versions
N’hésite pas si tu constates d’autres anomalies. L’émulation ne pourra que s’améliorer...
Effectivement c’est impressionnant de pouvoir jouer de la musique durant le chargement d’un jeux sur cassette car contrairement à une disquette, il n’y a pas de possibilité de relire l’enregistrement à la volée en cas d’erreur de lecture. Et les timing de lecture sont très serrés. C’est pour cela que les interruptions sont normalement bloquées durant une lecture cassette.
Ce qui est amusant, c’est que le son qui sort du haut parleur du CPC 464 durant le chargement d’une cassette ne provient absolument pas du AY mais est provoqué par une interférence dû au design même de la carte mère du CPC. La piste qui transmet les informations du lecteur de cassette est juste à côté de celle qui transmet le son vers le haut parleur et la parasite. Il semblerait qu’il y ait un défaut d’isolation de la masse mais ce n’est pas si surprenant, le design du CPC est assez ´low cost’. Les concepteurs du CPC ont du trouver ça intéressant et n’ont pas cherché à corriger le design.. Le son est produit naturellement sans consommer aucune ressource.
https://www.cpcwiki.eu/forum/amstrad-c ... he-cpc-464
Je vais désormais m’atteler à un autre chantier qui va me prendre un peu de temps : améliorer l’émulation du FDC afin de pouvoir charger les disquettes protégées…ce sera pour de prochaines versions
DSK for big formats? (Vortex, Dobbertin)
Großartige Arbeit! Ich habe es jetzt zufällig gefunden und den ganzen Verlauf gelesen.
Werden Sie bei der FDC-Emulation auch die großen Formate bedienen? Vortex, Dobbertin und das Format des Klons aus der DDR? Es hat 80 Spuren, aber im Emulator kann man noch mehr Spuren einrichten.
-
- Messages : 7989
- Inscription : 18 sept. 2010 12:08
- Localisation : Brest et parfois les Flandres
Re: DSK for big formats? (Vortex, Dobbertin)
Hmm.. après un petit passage dans www.deepl.com....ThomasR a écrit : ↑22 sept. 2021 17:00 Großartige Arbeit! Ich habe es jetzt zufällig gefunden und den ganzen Verlauf gelesen.
Werden Sie bei der FDC-Emulation auch die großen Formate bedienen? Vortex, Dobbertin und das Format des Klons aus der DDR? Es hat 80 Spuren, aber im Emulator kann man noch mehr Spuren einrichten.KCcompact.png
Auf Französisch a écrit :Excellent travail ! Je l'ai trouvé par hasard maintenant et j'ai lu tout le processus.
Allez-vous également proposer les grands formats pour l'émulation FDC ? Vortex, Dobbertin et le format du clone de la RDA ? Il possède 80 pistes, mais dans l'émulateur, vous pouvez configurer encore plus de pistes.
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
A500 Vampire V2+ ^8^, A1200 (030@50mhz/fpu/64mb/cf 8go),
A500 GVP530(MMU/FPU) h.s., R-Pi, TO9, TO8D, TO8.Démos
Re: [EMULATION AMSTRAD CPC] AMSpiriT - work in Progress
De rien et j'en profite pour restaurer le titre du fil de discussion...
Re: [EMULATION AMSTRAD CPC] AMSpiriT - work in Progress
Excusez-moi ! Je m'étais appuyé sur la fonction de traduction du forum pour le transférer.
Re: [EMULATION AMSTRAD CPC] AMSpiriT - work in Progress
@ThomasR, merci pour le compliment.
oh oui, c'est faisable. L'objectif à terme est que l'émulateur puisse lire à minima tous les fichiers DSK. Il arrive déjà à lire des fichiers DSK formatés en double face et 80 pistes.
C'est plus compliqué avec les pistes protégées (protections GAP ...) mais j'y travaille
Je suis notamment tombé sur ce super site qui explique en détail les protections disques utilisées sur CPC...ça me permet de télécharger sans trop d'efforts de recherche les fichiers DSK contenant une protection spécifique et d'améliorer petit à petit l'émulation du FDC...J'arrive depuis peu à lire certains disques protégés par la protection KBI et GAP, mais pas encore sur toutes les variantes de la protection.
https://www.cpc-power.com/cpcarchives/i ... es&num=180
ça avance lentement mais surement
oh oui, c'est faisable. L'objectif à terme est que l'émulateur puisse lire à minima tous les fichiers DSK. Il arrive déjà à lire des fichiers DSK formatés en double face et 80 pistes.
C'est plus compliqué avec les pistes protégées (protections GAP ...) mais j'y travaille
Je suis notamment tombé sur ce super site qui explique en détail les protections disques utilisées sur CPC...ça me permet de télécharger sans trop d'efforts de recherche les fichiers DSK contenant une protection spécifique et d'améliorer petit à petit l'émulation du FDC...J'arrive depuis peu à lire certains disques protégés par la protection KBI et GAP, mais pas encore sur toutes les variantes de la protection.
https://www.cpc-power.com/cpcarchives/i ... es&num=180
ça avance lentement mais surement
Re: [EMULATION AMSTRAD CPC] AMSpiriT - work in Progress
Hello,
Je n'étais pas venu depuis un moment, mais je vois que tout ça avance sacrément bien !
Bon courage pour le FDC... Si tu veux mon expérience, la bonne approche n'est pas de comprendre chaque protection (même si c'est aussi intéressant et formateur), mais plutôt la manière dont marche le FDC.
Spoil : Simuler une piste MFM qui tourne, c'est une solution qui permet de supporter toutes les protections sans réfléchir trop sur chacune !
Le vrai problème venant ensuite du format supporté : Le passage de DSK/EDSK a MFM est... Assez difficile (mais possible !).
Les formats HFE et CTRAW sont de bon candidats, sinon, le format étant directement MFM.
Si tu as besoin d'aide ou d'un retour d'expérience (je n'ai pas l'impression que tu ais besoin de beaucoup d'aide ), n'hésite pas !
Thomas
Je n'étais pas venu depuis un moment, mais je vois que tout ça avance sacrément bien !
Bon courage pour le FDC... Si tu veux mon expérience, la bonne approche n'est pas de comprendre chaque protection (même si c'est aussi intéressant et formateur), mais plutôt la manière dont marche le FDC.
Spoil : Simuler une piste MFM qui tourne, c'est une solution qui permet de supporter toutes les protections sans réfléchir trop sur chacune !
Le vrai problème venant ensuite du format supporté : Le passage de DSK/EDSK a MFM est... Assez difficile (mais possible !).
Les formats HFE et CTRAW sont de bon candidats, sinon, le format étant directement MFM.
Si tu as besoin d'aide ou d'un retour d'expérience (je n'ai pas l'impression que tu ais besoin de beaucoup d'aide ), n'hésite pas !
Thomas
Re: [EMULATION AMSTRAD CPC] AMSpiriT - work in Progress
Hello Lone,
Content de te relire.
Je te remercie pour ces pistes. Effectivement pour l’émulation du FDC, j’ai pris le parti de convertir en mémoire le fichier DSK au format MFM. Intellectuellement c’est plus satisfaisant puisque je reproduis ‘logiciellement’ le vrai fonctionnement d’un FDC. Je simule une rotation du disque en lisant chaque octet tous les 29 microsecondes et en rebouclant après lecture de x octets afin de faire un tour de piste 5 fois par seconde.
J’ai noté quelques bizarreries dans la conversion puisque dans la littérature il est indiqué qu’une piste occupe environ 6250 octets (200 ms par piste / 32 microsecondes par octet) mais après conversion de certains DSK j’arrive à plus de 7.000 octets par piste…il semblerait que la taille de la GAP3 indiquée dans le DSK soit erronée ou que la lecture soit plus rapide que les 32 micros indiquées. J’ai pris une valeur de 29 micros qui semble un bon compromis.
Mais je suis d’accord avec toi, en passant par la conversion MFM, les protections type GAP par exemple notamment se lisent tout naturellement sans aucun autre artifice…
En vérité, mon principal problème semble venir de la conversion DSK-> MFM dans certaines situations. J’ai l’impression qu’il me manque des informations sur le format DSK non standard.
Les rares doc disponibles sont assez laconiques au niveau de la description de la structure du fichier DSK et notamment lorsque le champs ‘data length d’un secteur est different de la valeur déclarée (très fréquent sur les pistes protégées). Je ne sais pas encore bien retranscrire cette information. (La longueur de la data contient elle les octets du CRC, les donnees GAP3..?)..
De même, les ´weak’ sector restent un peu mystérieux pour moi.
Mais avec un peu de temps et en expérimentant un peu, je trouverai bien une solution satisfaisante
Content de te relire.
Je te remercie pour ces pistes. Effectivement pour l’émulation du FDC, j’ai pris le parti de convertir en mémoire le fichier DSK au format MFM. Intellectuellement c’est plus satisfaisant puisque je reproduis ‘logiciellement’ le vrai fonctionnement d’un FDC. Je simule une rotation du disque en lisant chaque octet tous les 29 microsecondes et en rebouclant après lecture de x octets afin de faire un tour de piste 5 fois par seconde.
J’ai noté quelques bizarreries dans la conversion puisque dans la littérature il est indiqué qu’une piste occupe environ 6250 octets (200 ms par piste / 32 microsecondes par octet) mais après conversion de certains DSK j’arrive à plus de 7.000 octets par piste…il semblerait que la taille de la GAP3 indiquée dans le DSK soit erronée ou que la lecture soit plus rapide que les 32 micros indiquées. J’ai pris une valeur de 29 micros qui semble un bon compromis.
Mais je suis d’accord avec toi, en passant par la conversion MFM, les protections type GAP par exemple notamment se lisent tout naturellement sans aucun autre artifice…
En vérité, mon principal problème semble venir de la conversion DSK-> MFM dans certaines situations. J’ai l’impression qu’il me manque des informations sur le format DSK non standard.
Les rares doc disponibles sont assez laconiques au niveau de la description de la structure du fichier DSK et notamment lorsque le champs ‘data length d’un secteur est different de la valeur déclarée (très fréquent sur les pistes protégées). Je ne sais pas encore bien retranscrire cette information. (La longueur de la data contient elle les octets du CRC, les donnees GAP3..?)..
De même, les ´weak’ sector restent un peu mystérieux pour moi.
Mais avec un peu de temps et en expérimentant un peu, je trouverai bien une solution satisfaisante
Re: [EMULATION AMSTRAD CPC] AMSpiriT - work in Progress
Bonsoir !
Peut-être que les épisodes consacrés au FDC peuvent apporter des informations précieuses pour ton émulateur :
https://64nops.wordpress.com
Peut-être que les épisodes consacrés au FDC peuvent apporter des informations précieuses pour ton émulateur :
https://64nops.wordpress.com
Re: [EMULATION AMSTRAD CPC] AMSpiriT - work in Progress
Ah je vois que tu reparcours tout le chemin que j'ai tant arpenté !
Quelques points qui peuvent t'aider sur les dsk et les disquettes :
La totalité des dumps de disquettes que j'ai pu avoir contiennent 100 000 bits MFM par piste. A 2-3% près, au max. Même les dsk qui semblent contenir 7000 bytes (donc, 112000 bits MFM) peuvent tenir dans ces fameux 100k bits. Pour que ça marche, les points à vérifier :
- La taille de certain GAP peuvent être réduite.
- Les secteurs dumpés dans les DSK peuvent se chevaucher (on a parfois un secteur taille 6 - qui n'en fait en réalité que beaucoup moins - suivi de plein de secteurs, dumpé eux aussi, qui donnent l'illusion d'une taille plus grande. Parfois, un secteur va en fait "boucler" autours du trou d'index, et contenir, dans le dsk, des données du début de la piste.)
En gros, j'ai donc construit un algo qui va chercher les débuts de secteurs logique, et tenter de rabouter entre eux les différents secteurs. Attention, piège ! Le DSK ne donne qu'un bit sur deux (MFM), le bit qu'il pense être le bit de data. Sauf qu'en passant sur un GAP, c'est pas obligé, et on peut basculer sur les bits de clock. Il faut vérifier les deux cas.
La bonne nouvelle, c'est que c'est quelque chose qui est déterministe : Une fois l'algo fonctionnel, l'intégralité des DSK a ma disposition (l'intégralité des dsk sans bricolage qui peuvent rendre le dump foireux !) a généré une piste MFM correcte (c'est à dire fonctinnelle, et dans la limite des ~100k bits). La mauvaise, c'est qu'il faut gérer pas mal de cas un peu tordu, à cause d'une génération de dsk aléatoire.
Si tu galère, si tu as besoin d'inspiration, mes recherches sont dispo sur github : https://github.com/Tom1975/CPCCore
Spécifiquement, la méthode FormatTypeEDSK::FillTrackMfm du fichier https://github.com/Tom1975/CPCCore/blob ... peEDSK.cpp
Problème suivant, les weak bits. La encore mon idée était d'analyser les multiples révolutions dispo (classique du DSK/CTRAW) et déterminer les bits qui changent, sachant que tous les weaks bits ne sont pas toujours présents à chaque révolution (ça serait trop simple, sinon).
La encore, fonction void IDisk::CreateTrackFromMultiRevolutions(), fichier CPCCoreEmu/IDisk.cpp
Bon courage (parce qu'on va pas se mentir, ça a été un sacré casse tête !!)
Quelques points qui peuvent t'aider sur les dsk et les disquettes :
La totalité des dumps de disquettes que j'ai pu avoir contiennent 100 000 bits MFM par piste. A 2-3% près, au max. Même les dsk qui semblent contenir 7000 bytes (donc, 112000 bits MFM) peuvent tenir dans ces fameux 100k bits. Pour que ça marche, les points à vérifier :
- La taille de certain GAP peuvent être réduite.
- Les secteurs dumpés dans les DSK peuvent se chevaucher (on a parfois un secteur taille 6 - qui n'en fait en réalité que beaucoup moins - suivi de plein de secteurs, dumpé eux aussi, qui donnent l'illusion d'une taille plus grande. Parfois, un secteur va en fait "boucler" autours du trou d'index, et contenir, dans le dsk, des données du début de la piste.)
En gros, j'ai donc construit un algo qui va chercher les débuts de secteurs logique, et tenter de rabouter entre eux les différents secteurs. Attention, piège ! Le DSK ne donne qu'un bit sur deux (MFM), le bit qu'il pense être le bit de data. Sauf qu'en passant sur un GAP, c'est pas obligé, et on peut basculer sur les bits de clock. Il faut vérifier les deux cas.
La bonne nouvelle, c'est que c'est quelque chose qui est déterministe : Une fois l'algo fonctionnel, l'intégralité des DSK a ma disposition (l'intégralité des dsk sans bricolage qui peuvent rendre le dump foireux !) a généré une piste MFM correcte (c'est à dire fonctinnelle, et dans la limite des ~100k bits). La mauvaise, c'est qu'il faut gérer pas mal de cas un peu tordu, à cause d'une génération de dsk aléatoire.
Si tu galère, si tu as besoin d'inspiration, mes recherches sont dispo sur github : https://github.com/Tom1975/CPCCore
Spécifiquement, la méthode FormatTypeEDSK::FillTrackMfm du fichier https://github.com/Tom1975/CPCCore/blob ... peEDSK.cpp
Problème suivant, les weak bits. La encore mon idée était d'analyser les multiples révolutions dispo (classique du DSK/CTRAW) et déterminer les bits qui changent, sachant que tous les weaks bits ne sont pas toujours présents à chaque révolution (ça serait trop simple, sinon).
La encore, fonction void IDisk::CreateTrackFromMultiRevolutions(), fichier CPCCoreEmu/IDisk.cpp
Bon courage (parce qu'on va pas se mentir, ça a été un sacré casse tête !!)
Re: [EMULATION AMSTRAD CPC] AMSpiriT - work in Progress
Merci pour ces nombreuses tips
Impressionnant. Tu as poussé très loin l’émulation du FDC en prenant en compte les bits d’impulsion MFM.
Je me contente juste de traiter un cran en dessous de toi, au niveau de l’octet et non du bit. Ça doit être suffisant, quoique à te lire, j’en doute maintenant …
J’ai regardé rapidement ton code source qui est déjà bien complexe. Chapeau bas. J’apprécie l’exploit à sa juste valeur.
Bon, il reste du taff. Mon but n’est pas de reprendre ton source justement mais bien de comprendre en profondeur les rouages du fonctionnement du FDC afin d’en recréer ma propre émulation…Vaste chantier.
Je vais donc travailler laborieusement de mon côté pour l’apprivoiser…mais tu as raison ça va prendre un peu de temps. La prochaine release majeure de l’émulateur attendra encore un peu et si je bloque je te glisserai un mot…
PS: @tot0, Les articles de « Roudoudou » sur le fonctionnement du FDC sont très intéressants. Merci pour le lien.
Impressionnant. Tu as poussé très loin l’émulation du FDC en prenant en compte les bits d’impulsion MFM.
Je me contente juste de traiter un cran en dessous de toi, au niveau de l’octet et non du bit. Ça doit être suffisant, quoique à te lire, j’en doute maintenant …
J’ai regardé rapidement ton code source qui est déjà bien complexe. Chapeau bas. J’apprécie l’exploit à sa juste valeur.
Bon, il reste du taff. Mon but n’est pas de reprendre ton source justement mais bien de comprendre en profondeur les rouages du fonctionnement du FDC afin d’en recréer ma propre émulation…Vaste chantier.
Je vais donc travailler laborieusement de mon côté pour l’apprivoiser…mais tu as raison ça va prendre un peu de temps. La prochaine release majeure de l’émulateur attendra encore un peu et si je bloque je te glisserai un mot…
PS: @tot0, Les articles de « Roudoudou » sur le fonctionnement du FDC sont très intéressants. Merci pour le lien.