Journal Merci à l'auteur de xcpc!

Posté par  (site web personnel) . Licence CC By‑SA.
Étiquettes :
44
9
oct.
2022

Salut nal,

aujourd'hui je me suis battu avec un bug dans l'émulateur que je maintiens: Caprice32.

C'est un émulateur super cool qui à plein de fonctionnalités absolument géniales (et je pèse mes mots). Il y a pas longtemps, j'ai ajouté des outils de développement / ingénierie inverse qui sont fabuleux pour se débloquer les vies infinies ou des trucs comme ça. J'ai même fait une vidéo de démonstration (en anglais et un peu moisie, j'aurais dû la faire aussi en français). Et en ce moment (enfin, avant de bosser sur le bug), je m'intéressais au support des lightguns (si quelqu'un veut m'offrir un Sinden pour noël, j'adorerais essayer!).

Mais bon, je m'égare (comment ça je fais ma pub?). Mon émulateur a un bug, et ça craint.

C'est un bug qui a été la depuis que j'ai repris l'émulateur et importé le code sur GitHub: lorsqu'on émule un CPC464, par défaut, il devrait être en mode cassette et il était en mode disquette, comme ses grands frères le 664 et le 6128.

Ma première réaction a été de penser à un problème dans la ROM que j'utilise. Je ne vois pas comment ça pourrait venir de l'émulateur puisque c'est une différence purement interne au logiciel du CPC. J'ai donc cherché un peu partout sur le net, comparé plusieurs versions, mais non, tout semble bon. À moins que toutes les ROMs qui circulent sur internet soient foireuses?

Ensuite je me dis que c'est un problème quand je patche la ROM. Pourquoi patcher la ROM me demanderez-vous? Parce qu'il se trouve que les versions françaises et espagnoles du CPC étaient exactement les mêmes que la version UK originale, mis à part la table de caractère qui change pour s'adapter. Ça amenait des problèmes marrant, comme par exemple le fait que quand on tapait "|" sur un clavier français, ça sortait un "ù", mais en fait fallait pas s'en soucier, ça marchait quand même pour les commandes (toutes les commands AMSDOS commençaient par un |) et le code. Donc pour éviter de se coltiner 9 ROMs différentes (3 modèles * 3 langages) on a juste 3 ROMs (une par modèle, qui pour le coup sont assez différentes) et on patche juste la table de caractère. Mais peut être qu'on le fait mal et qu'on change aussi autre chose? J'en doute mais c'est facile à vérifier, il suffit d'utiliser la version UK pour laquelle on ne patche rien. Et là aussi, ça ne marche pas!

Et là, j'avoue que je colle un peu. Qu'est-ce qui peut bien poser problème? C'est là que j'ai eu l'idée brillante, que dis-je, l'idée de génie (n'ayons pas peur des mots): allez voir ce qui se fait chez la concurrence. La référence en la matière est probablement WinAPE mais bon, y'a Win dans le nom, tout ça. Je sors donc plutôt xcpc dont j'ai entendu parler ici il y'a quelque temps. Je le lance avec "--machine=cpc464", je tape "cat" et il me répond

Press PLAY then any key:

ce qui veut dire que lui, il marche bien.

Je suis un peu vexé qu'il fasse mieux que mon émulateur à moi, mais aussi super content, parce que du coup je peux aller voir dans le code ce qu'il fait correctement. Et je tombe dessus au bout de 2 secondes:

            case XCPC_MACHINE_TYPE_CPC464:                                                                                                                                                                                      
                {                                                                                                                                                                                                               
                    system_rom = (is_set(opt_system) ? strdup(opt_system) : build_filename("roms", "cpc464.rom"));                                                                                                              
                    amsdos_rom = (is_set(opt_amsdos) ? strdup(opt_amsdos) : NULL                                );                                                                                                              
                }                                                                                                                                                                                                               
                break;                                                                                                                                                                                                          
            case XCPC_MACHINE_TYPE_CPC664:                                                                                                                                                                                      
                {                                                                                                                                                                                                               
                    system_rom = (is_set(opt_system) ? strdup(opt_system) : build_filename("roms", "cpc664.rom"));                                                                                                              
                    amsdos_rom = (is_set(opt_amsdos) ? strdup(opt_amsdos) : build_filename("roms", "amsdos.rom"));                                                                                                              
                }                                                                                                                                                                                                               
                break;                                                                                                                                                                                                          
            case XCPC_MACHINE_TYPE_CPC6128:                                                                                                                                                                                     
                {                                                                                                                                                                                                               
                    system_rom = (is_set(opt_system) ? strdup(opt_system) : build_filename("roms", "cpc6128.rom"));                                                                                                             
                    amsdos_rom = (is_set(opt_amsdos) ? strdup(opt_amsdos) : build_filename("roms", "amsdos.rom" ));                                                                                                             
                }                                                                                                                                                                                                               
                break;    

Ben oui, comme c'est bien dit ici:

AMSDOS first appeared in 1984 on the CPC 464, with added 3 inch disk drive, and then on the CPC 664 and CPC 6128. Relatively fast and efficient for its time, AMSDOS was quicker and more effective than most of its contemporaries.

Ou encore ici:

AMSDOS could be run only with Amstrad's 3" floppy disk drive.

Donc voilà, un grand merci à Olivier Poncet, l'auteur de xcpc! La concurrence c'est cool et ça aide, surtout quand elle est open source, qu'elle marche sous linux et qu'elle est pas buggée.

Des liens pour ceux qui n'ont pas cliqué en route:

[1] xcpc, le héros du jour
[2] Caprice32, l'émulateur avec un bug en moins
[3] Un chat, il paraît que c'est bon pour l'audimat

  • # Bah oui

    Posté par  . Évalué à 3.

    Amsdos pour le 464 n'était pas dans la machine, mais dans le contrôleur DDI-1 vendu à part.
    Amstrad et les économies de bouts de chandelle…

    • [^] # Re: Bah oui

      Posté par  (site web personnel, Mastodon) . Évalué à 4.

      les économies de bouts de chandelle…

      On dit « contrôle des coûts » nom d'un croco.

      “It is seldom that liberty of any kind is lost all at once.” ― David Hume

    • [^] # Re: Bah oui

      Posté par  (site web personnel, Mastodon) . Évalué à 10.

      Je vois pas le rapport avec les économies.

      Amstrad avait prévu de pouvoir connecter un lecteur de disquettes mais ils (ou plutôt Locomotive Software qui s'occupait du logiciel) ont développé la ROM correspondante après la sortie de la machine. Ils avaient tout prévu pour le faire, avec un mécanisme générique pour ajouter des ROMs a posteriori, qui est utilisé encore aujourd'hui.

      Par exemple on peut (avec du matériel de ma conception) connecter une carte microsd ou une clé USB et y accéder avec une ROM qui remplace l'AMSDOS en apportant de nombreuses fonctionalités supplémentaires (répertoires, gestion de différents supports de stockage, …).

      Cela aurait été impossible si la gestion des disques avait été "en dur" dans la ROM interne.

      De plus, la ROM AMSDOS peut se substituer complètement au BASIC, on obtient alors un CPC qui va démarrer directement sur une disquette pour lancer un logiciel CP/M. Cela a pu être utilisé dans des applications industrielles (pilotage de chaîne de montage) ou ainsi la machine peut démarrer directement avec le logiciel dédié.

      C'est plutôt bien pensé tout ça. Et je doute que ça fasse des économies, cela a forcé à utiliser 2 ROMs (le système + l'AMSDOS) là ou ils auraient pu tout rentrer dans une seule.

  • # Bug ?

    Posté par  . Évalué à 3.

    Le journal est chouette mais du coup c'était quoi le bug ?

    • [^] # Re: Bug ?

      Posté par  (site web personnel, Mastodon) . Évalué à 4.

      le Caprice d'avoir un lecteur de disquette, en plus par défaut, pour le CPC 464
      premier lien : https://github.com/ColinPitrat/caprice32/issues/228

      “It is seldom that liberty of any kind is lost all at once.” ― David Hume

      • [^] # Re: Bug ?

        Posté par  . Évalué à 2.

        Meme si tu avais pu de toute façon utiliser Windows pour regarder le vieillissant WinAPE, il n'est pas open source donc tu n'aurais pas pu étudier la chose. Sinon, il y a aussi Caprice Reloaded. Windows only, mais au moins tu as les sources. Enfin bon, tu as fini par trouver. Bravo!

        • [^] # Re: Bug ?

          Posté par  (site web personnel, Mastodon) . Évalué à 7.

          Euh il faut pas tout mélanger, Caprice Reloaded c'est un projet sur lequel j'ai pas mal travaillé (mais pas tout seul) et ça fonctionnait sous Linux (mieux que sous Windows). Le projet était un genre de "WinAPE, mais pour Linux".

          Il y avait pas mal de problèmes dedans liés à l'utilisation de WxWidgets et WxFormsBuilder (il fallait utiliser une version patchée de ce dernier…) plus divers problèmes de fiabilité du coeur de l'émulateur malgré les efforts de Ramlaid qui en avait réécrit de gros morceaux. En particulier l'émulation du contrôleur de disquettes était assez mauvaise.

          Le projet est abandonné depuis longtemps. Tout le code de Caprice 32 avait été réécrit en C++ ce qui a rendu compliqué la collaboration avec les nombreux autres forks de Caprice 32, dont Caprice Forever vers lequel ce lien pointe.

          Le point le plus intéressant de Caprice Reloaded était d'avoir une interface graphique similaire à celle de WinAPE, avec un debugger, etc. Mais ça n'a jamais vraiment abouti.

          Aujourd'hui le projet est abandonné, les efforts se concentrent sur ACE, avec la version Haiku pour ma part et du travail en cours mais pas fini et non diffusé pour une version Linux pour les deux autres développeurs qui avaient participé à Reloaded. Malheureusement ce n'est pas sous licence libre (par choix de l'auteur de ACE qui préfère garder ses secrets).

          • [^] # Re: Bug ?

            Posté par  . Évalué à 1.

            Pour Caprice Reloaded, on dirait pourtant que la version Windows date de Juin 2022. Pour les sources, je vois des fichiers .c et des .cpp. Par contre je ne vois pas de version Linux, dommage.

            Bon, Haiku, il va vraiment falloir que j'essaie, ça me tente depuis un moment. Et le premier soft que j'installerai sera bien sur ACE.

            • [^] # Re: Bug ?

              Posté par  (site web personnel, Mastodon) . Évalué à 6.

              Je n'ai pas été clair apparemment, il y a confusion entre Caprice Forever (windows, toujours maintenu) et Caprice Reloaded (Linux et Windows, projet mort depuis 10 ans).

              Ces deux projets sont tous les deux des forks de Caprice 32 mais à part ça, ils n'ont rien en commun.

              Le lien dans votre message pointe sur une page qui s'appelle "Caprice Forever" et parle bien de Caprice Forever.

              • [^] # Re: Bug ?

                Posté par  . Évalué à 1.

                ah en effet, je confondais l'un avec l'autre.

          • [^] # Re: Bug ?

            Posté par  (site web personnel) . Évalué à 1. Dernière modification le 09 novembre 2022 à 10:14.

            Ouah je ne savais pas que tu étais un CPCaddict!

            Ton lien vers Ace m'envoyait vers une page d'erreur quand j'ai testé tout à l'heure.

            Émuler du CPC sous Haiku, le rêve du fan du has-been absolu!

            Je l'ai installé sur une machine de démonstration(pour mon Gul local notamment), il faudra peut-être dans le futur quand j'aurais le temps, que je remonte les bugs rencontrés: il fallait que j'active des options de secours pour le lancement en live, puis une fois installé et raccordé à un Grub, et là maintenant alors que je n'ai rien changé il ne démarre plus du tout

    • [^] # Re: Bug ?

      Posté par  . Évalué à 4.

      Le CPC464 n'a pas besoin de charger "amsdos.rom" si il n'y a pas de lecteur de disquette connecté, comme on peut le voir dans la 2e ligne du 1er case : amsdos_rom = null.

      Donc dans xcpc, je suppose qu'on chargeait tout le temps cette ROM même si aucun lecteur de disquette n'est connecté.

      • [^] # Re: Bug ?

        Posté par  (site web personnel) . Évalué à 3.

        Effectivement je n'ai pas été très clair mais l'extrait de code vient de xcpc. Pour le 464, il ne remplit pas la ROM amsdos.

        Dans Caprice32, la ROM amsdos était passée pour tous les modèles, d'où le bug.

  • # Ulrich Doewich / RSX

    Posté par  . Évalué à 7.

    De mémoire c'était Ulrich Doewich qui est l'auteur originel de Caprice32 (une personne très sympathique d'ailleurs). Il y a eu une passation ?

    Ça amenait des problèmes marrant, comme par exemple le fait que quand on tapait "|" sur un clavier français, ça sortait un "ù", mais en fait fallait pas s'en soucier, ça marchait quand même pour les commandes (toutes les commands AMSDOS commençaient par un |)

    Plus précisément, c'étaient ce qu'on appelait des Resident System Extensions (RSX), des commandes supplémentaires au Basic Locomotive. Par exemple, sur CPC+, |GAME (ou ùGAME en français) lançait l'excellent jeu Burnin' Rubber, stocké dans la cartouche contenant le Basic Locomotive 1.1 - qui se lançait au démarrage du CPC.

    Mais il était possible de créer ses propres RSX en assembleur. Une routine système permettait d'enregistrer la commande en associant la commande à une adresse d'appel. On pouvait passer des paramètres.

  • # Sinden Lightgun

    Posté par  (site web personnel) . Évalué à 2.

    si quelqu'un veut m'offrir un Sinden pour noël

    J'ai été voir ton site ; comment te contacter ?

  • # On parle de l'Amstrad CPC sur DLFP!

    Posté par  (site web personnel) . Évalué à 3.

    J'ai eu un peu de mal à rentrer dans le journal, au départ faut vraiment deviner de quoi ça va parler(sans doute parce que je suis allergique à Github)…

    Mon père était un des premiers à acheter un Amstrad CPC 464 en france, du coup c'était un modèle Qwerty. On chargeait un programme pour convertir le clavier en Azerty. Je l'avais amélioré avec un programme trouvé dans un de ses bouquins qui permettait de changer des caractères, sans doute avec un mécanisme proche de celui dont tu parles. Du coup, ayant fait le truc moi-même(enfin à moitié), j'avais bien compris que la modification n'était qu'une question d'affichage et que la signification des caractères en interne ne changeait pas.

    Pourquoi as-tu mis un lien archivé pour le site sur l'histoire de l'informatique?

  • # Merci pour la mention !

    Posté par  (site web personnel) . Évalué à 1.

    Merci pour la mention Colin \o/ Content que Xcpc ait pu t'aider _^

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.