MSX Village forum

L'école comprendre de zéro le fonctionnement d'une cartouche MSX

yabikoo33 Membre non connecté

Vagabond

Rang

Avatar

Inscrit le : 14/11/2020 à 17h25

Messages: 18

Le 04/12/2020 à 09h25

Reprise du message précédent

Salut , je vais essayer de résumer le code et de le commenter. J'oubliais,il génère aussi un fichier CSV pour me résumer les switchs correspondant à chaque jeu .

Voici une version simplifiée de la fonction,soit juste la partie qui :
- Ouvre un fichier
- Décale les datas si le 4eme octet n'est pas à 0x00h
- ajoute des 0xFFh si nécessaire à la fin pour que le nouveau fichier rentre pile poil dans une bank de 64Ko quelle que soit la taille du jeu (8ko,16ko,32,64 ou tout autre) .
-et enfin concatene les 128 fichiers de 64ko en un seul de 8mo/64mb.

Je précise que j'ai programmé cette fonction hier rapidement, elle n'est pas optimale ni très bien codée,mais ça marche :

Code CPP :
 
void msxconcatenation(){
 
        // Le fichier concaténé s'appellera fic.bin,s'il existe déjà on le supprime
        if(SD.exists("/fic.bin")){SD.remove("/fic.bin");Serial.println("suppression du fic.bin existant");}
 
 
        File track = SD.open("/fic.bin",FILE_WRITE); // On créé le fichier contenant la concaténation
 
        File msxdir = SD.open("/msx"); // les fichiers à concaténer sont dans le répertoire /msx
 
 
 
         byte gamescount = 0; //variable pour s'assurer qu'on ne dépasse pas les 128 jeux
        File msxgame = msxdir.openNextFile(); msxgame va prendre tour à tour la valeur de chacune des roms
        unsigned int countfilesize = 0;
        while(msxgame = msxdir.openNextFile()){ // Une boucle pour ouvrir les jeux un par un
          if(gamescount<128  && !msxgame.isDirectory() && (msxgame.size()<=65536)){ // si tout est ok
 
              uint8_t datasd[4];     // on va traiter les datas du fichier 4 octets par 4 octets
              const uint8_t memoriseoctet[4]={255,255,255,255}; // 4 octets de FF pour faire du remplissage en cas de besoin
              bool firstlaunch = true;  // au premier lancement de la boucle ci-dessous on va vérifier l'octet 4 et ne le faire
                                                   // qu'une seule fois
              unsigned int provicompte = 0; // pour compter les octets du fichier,cette variable est reinitialisée pour chaque
                                                            // nouvelle rom
              while(msxgame.read(datasd,sizeof(datasd)) && provicompte < 65536){ // tant qu'il y a des datas à lire dans le
                                                                  //fichier,on les envoi dans data à chaque passage dans la boucle
 
                            if(firstlaunch == true){ // Pour les 4 premiers octets uniquement
                                 int decal = datasd[3] * 0x100; // on lit la valeur du 4eme octet et la multiplie par 0x100h
                                 if(decal>0){
                                 provicompte = 4;   
 
                                 track.write(datasd,sizeof(datasd)); // on écrit quoi qu'il en soit sur les 4 1ers octets dans fic.bin
                                 countfilesize = countfilesize + 4;
 
                                       while(provicompte < decal){ // On remplit avec des 0xFFh l'espace de décalage (par exemple
                                                                                  // 0x4000h ou 0x8000h
                                             track.write(memoriseoctet,sizeof(memoriseoctet));// on écrit 4 octets par 4 octets
                                             countfilesize = countfilesize + 4; // et on incrémente 4 octets par 4 octets
                                             provicompte = provicompte + 4;
                                       }
                                 }
                            }
                            // Maintenant qu'on a fait le décalage nécessaire,on écrit les données
                            track.write(datasd,sizeof(datasd));
                            countfilesize = countfilesize + 4;
                            provicompte = provicompte + 4;
                            firstlaunch = false;
              }
             // On a fini d'écrire le code du fichier; si la nouvelle bank générée ne fait pas encore 65536 octets,
             // On la remplie de 0xFFh jusqu'à ce qu'elle soit à la bonne taille
              if(provicompte < 65536){
                while(provicompte < 65536){
                     track.write(memoriseoctet,sizeof(memoriseoctet));
                     countfilesize = countfilesize + 4;
                     provicompte = provicompte + 4;
                }
              }
 
              gamescount++;  // On va passer au jeu suivant dans la boucle
          }
        }
 
        Serial.print(gamescount);Serial.println(" jeux concatenes   "); // C'est fait 
}
 

Edité par yabikoo33 Le 04/12/2020 à 14h12
   
yabikoo33 Membre non connecté

Vagabond

Rang

Avatar

Inscrit le : 14/11/2020 à 17h25

Messages: 18

Le 04/12/2020 à 09h27
Ah mince,le système a supprimé l'indentation, c'est illisible , désolé
   
aoineko Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 02/01/2011 à 21h17

Messages: 2698

Le 04/12/2020 à 10h40
yabikoo33 :
Ah mince,le système a supprimé l'indentation, c'est illisible , désolé


Tu peux utiliser la balise [code=cpp][/code] pour afficher correctement ton code.
Ca ajoute même de la coloration syntaxique. :)


On est toujours ignorant avant de savoir.
Github    
yabikoo33 Membre non connecté

Vagabond

Rang

Avatar

Inscrit le : 14/11/2020 à 17h25

Messages: 18

Le 04/12/2020 à 10h44
Super , merci ! C'est beaucoup mieux :) Edité par yabikoo33 Le 04/12/2020 à 11h21
   
Bastion Rebel Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 21/09/2013 à 07h42

Messages: 1717

Le 04/12/2020 à 17h45
simpa mais une question comment choisi tu telle ou telle ROM ???

l'interface arduino te sert a programmé la FLASH ?? et tu choisi via les Jumpers ??


TURBO-R FS-A1ST 512/128ko MSX2+ NMS 8250 F4 /Fix Audio /Ram 1/4Mb VDP9958 VRAM 192ko 2FDD SANYO WAVY PHC35J MSX2 NMS 8280 Ram 4Mb VDP9938 VRAM 192ko 2FDD NMS 8250 128/128ko 2FDD VG8235/39 128/128ko 1FDD SONY HB-F700D MSX1 MC810 32/16k VG 8020 64k HB75F 64k HX-22 64k RS232/ CX5M 32k HB501F EXT : My Exp 4X/[b] MegaFlashSCC 512ko/BERT R2/BEER CF/SUNRISE 2CF/FUNRICE V2.01/MAXIOL/MEGASCSI HDD-CD/SDMSX 1SD/FMPAC SRAM/NMS1205+1160/RS 232 Harukaze/GR8NET/DOS2/ HOMER V2 RAM512ko/Floppy Pack/MAXduino/ROM1664/FM Pak /GR8NET /AMIGA/ PC/ RaspB Pi(B) / ARDUINO
E-mail    
yabikoo33 Membre non connecté

Vagabond

Rang

Avatar

Inscrit le : 14/11/2020 à 17h25

Messages: 18

Le 04/12/2020 à 20h00
c'est ca ,l'arduino concatene les datas (met les roms les unes à la suite des autres tout simplement) en banks de 64ko et génère un seul fichier de 8mo. Puis il programme la flash avec ce "gros" fichier.

Les 16 premières pins d'adresse sont directement reliées au msx qui controle donc 2^16=64ko soit une bank complète. Les 7 pins suivantes sont reliées au dip switch, ce qui fait qu'on découpe virtuellement la flash de 64mb/8mo en 128 banks de 64ko. En fonction de la configuration des pins ,le msx voit donc une bank ou une autre et croit que c'est juste un jeu complet.

C'est assez simple une fois qu'on a compris le principe :)
   
Bastion Rebel Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 21/09/2013 à 07h42

Messages: 1717

Le 05/12/2020 à 09h15
salut

donc ta flash tu l'as configure en mode Byte ou Word pin Q15/A1 et BYTE (MX29LV160) mais sur la tienne ca doit etre pareil !!

en Byte c'est des blocks de 64kb et D0/d7
en word D0/D16 inutilisable sur MSX

tu aurais un schéma rapide de la flash


TURBO-R FS-A1ST 512/128ko MSX2+ NMS 8250 F4 /Fix Audio /Ram 1/4Mb VDP9958 VRAM 192ko 2FDD SANYO WAVY PHC35J MSX2 NMS 8280 Ram 4Mb VDP9938 VRAM 192ko 2FDD NMS 8250 128/128ko 2FDD VG8235/39 128/128ko 1FDD SONY HB-F700D MSX1 MC810 32/16k VG 8020 64k HB75F 64k HX-22 64k RS232/ CX5M 32k HB501F EXT : My Exp 4X/[b] MegaFlashSCC 512ko/BERT R2/BEER CF/SUNRISE 2CF/FUNRICE V2.01/MAXIOL/MEGASCSI HDD-CD/SDMSX 1SD/FMPAC SRAM/NMS1205+1160/RS 232 Harukaze/GR8NET/DOS2/ HOMER V2 RAM512ko/Floppy Pack/MAXduino/ROM1664/FM Pak /GR8NET /AMIGA/ PC/ RaspB Pi(B) / ARDUINO
E-mail    
yabikoo33 Membre non connecté

Vagabond

Rang

Avatar

Inscrit le : 14/11/2020 à 17h25

Messages: 18

Le 05/12/2020 à 09h43
Après test,mon code marche avec la majorité des roms mais pas toutes .

J'avais donc suivi les explications de Jipe et les roms se structurent bien au démarrage comme ca :
adresse 0 : 41
puis 42
puis adresse de démarrage (bits de poids faible)
adresse de démarrage 2(bits de poids fort) par exemple 0x40h pour démarrage à l'adresse 0x4000h

donc le code prenait ce 0x40h,le multipliait par 0x100h soit 0x4000h et décalait tout le code binaire d'autant.

Ca marchait très bien pour les fichiers ayant de valeurs classiques 0x40h ou 0x80h par exemple.

Mais certains jeux comme Juno First ou Gyrodine ont des adresses "exotiques" de respectivement 0x03h et 0x46h.

Ceux là ne bootent pas . J'ai donc ajouté ce matin à mon code un bitmask pour ne garder que le chiffre de gauche dans mon décalage :

int decal = (datasd[3] & 0xF0) * 0x100;

Gyrodine et Juno First fonctionnent désormais .

Les fichiers de 64ko ne démarrent pas non plus;je me suis dit que les opérations de décalage ne s'appliquaient pas aux eproms de 64kpuis qu'elles font la taille d'une bank complète.

J'ai donc remplacé :
if(firstlaunch == true)
par :
if(firstlaunch && (msxgame.size()<65000))

pour ne rien modifier des roms de 64ko à concatener.

J'ai ensuite comparé le fichier concaténé avec la rom originale de 64ko à l'aide d'un comparateur hexadecimal, elles sont identiques. Mais ca ne marche toujours pas. Batman notamment était le seul à booter , mais il m'affichait des bouillies de pixels en lieu et place des graphismes originaux . Désormais,il ne boot plus.

Quelqu'un aurait-il une idée ? en cartouche 64ko, j'ai testé pour l'instant Batman,break in,Dawn Patrol,Flight Deck 2.

J'ai également Simple ASM et Burger Time qui ne semblent pas fonctionner.

Je fais mes tests avec un Toshiba HX-20 pour le cas ou ca puisse avoir une conséquence


   
Bastion Rebel Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 21/09/2013 à 07h42

Messages: 1717

Le 05/12/2020 à 09h54
t'as "rom64ko" ok mais la config jumper CS1/CS2/CS12 pour une 64ko c'est pas bon il te faut le /RD sur la pin 22 /OE ;) ;)

sinon regarde dans ce post a la fin http://msxvillage.fr/forum/topic.php?id=2684#m62938

et ca aussi

http://msxvillage.fr/forum/topic.php?id=3765#m84389 Edité par Bastion Rebel Le 05/12/2020 à 09h57


TURBO-R FS-A1ST 512/128ko MSX2+ NMS 8250 F4 /Fix Audio /Ram 1/4Mb VDP9958 VRAM 192ko 2FDD SANYO WAVY PHC35J MSX2 NMS 8280 Ram 4Mb VDP9938 VRAM 192ko 2FDD NMS 8250 128/128ko 2FDD VG8235/39 128/128ko 1FDD SONY HB-F700D MSX1 MC810 32/16k VG 8020 64k HB75F 64k HX-22 64k RS232/ CX5M 32k HB501F EXT : My Exp 4X/[b] MegaFlashSCC 512ko/BERT R2/BEER CF/SUNRISE 2CF/FUNRICE V2.01/MAXIOL/MEGASCSI HDD-CD/SDMSX 1SD/FMPAC SRAM/NMS1205+1160/RS 232 Harukaze/GR8NET/DOS2/ HOMER V2 RAM512ko/Floppy Pack/MAXduino/ROM1664/FM Pak /GR8NET /AMIGA/ PC/ RaspB Pi(B) / ARDUINO
E-mail    
yabikoo33 Membre non connecté

Vagabond

Rang

Avatar

Inscrit le : 14/11/2020 à 17h25

Messages: 18

Le 05/12/2020 à 11h20
Ouaaa merci, je n'ai pas encore eu le temps de faire le tour de tout le forum,il y a vraiment beaucoup de projets; mais tu fais des milliers de trucs c'est incroyable ! :)

Lol en fait je réinvente vraiment l'eau chaude quoi :) . Faut peut-être que je progresse encore en connaissances du msx avant de me lancer bille en tête.

En tout cas,je continue de potasser,au moins terminer ce petit projet et réussir à démarrer une rom 64ko , en le gérant par arduino ca peut quand même être utile pour les projets à base de carte sd tout en un :)
   
Bastion Rebel Membre non connecté

Conseiller Municipal

Rang

Avatar

Groupe : Shoutbox

Inscrit le : 21/09/2013 à 07h42

Messages: 1717

Le 05/12/2020 à 14h07
la liaison Arduino m'interesse j'ai monter et upgrader des maxduino (fichiers CAS et TSX) via lecteur K7 cherche y as des post dessus


TURBO-R FS-A1ST 512/128ko MSX2+ NMS 8250 F4 /Fix Audio /Ram 1/4Mb VDP9958 VRAM 192ko 2FDD SANYO WAVY PHC35J MSX2 NMS 8280 Ram 4Mb VDP9938 VRAM 192ko 2FDD NMS 8250 128/128ko 2FDD VG8235/39 128/128ko 1FDD SONY HB-F700D MSX1 MC810 32/16k VG 8020 64k HB75F 64k HX-22 64k RS232/ CX5M 32k HB501F EXT : My Exp 4X/[b] MegaFlashSCC 512ko/BERT R2/BEER CF/SUNRISE 2CF/FUNRICE V2.01/MAXIOL/MEGASCSI HDD-CD/SDMSX 1SD/FMPAC SRAM/NMS1205+1160/RS 232 Harukaze/GR8NET/DOS2/ HOMER V2 RAM512ko/Floppy Pack/MAXduino/ROM1664/FM Pak /GR8NET /AMIGA/ PC/ RaspB Pi(B) / ARDUINO
E-mail    
yabikoo33 Membre non connecté

Vagabond

Rang

Avatar

Inscrit le : 14/11/2020 à 17h25

Messages: 18

Le 06/12/2020 à 11h57
Concernant les roms 64Ko , ben justement , je n'utilise pas CS1 CS2 et CS12, comme mon programme décale les datas, ce n'est pas utile. J'utilise /SLTSL comme /CE et /RD comme /OE pour tous les jeux.

Après visiblement les cartouches 64ko ne fonctionnent pas toutes de la même façon, j'ai même cru comprendre que certaines fonctionnent avec un mapper du type ASCII .

Quand je voie que Batman démarre avec le décalage .... donc la fin des 64ko doit être mappée en externe je suppose.Mais quand même je devrais pouvoir en démarrer quelques-unes ...



On sort du sujet mais arduino je connais bien , avec l'esp32 et ses sorties I2S, on peut jouer des mp3 et surtout des .Wav avec une librairie et quelques lignes de codes.J'ai notamment développé une carte (la wallbox2mp3) pour les jukebox,avant je devais utiliser une puce propriétaire (vlsi) pour sortir du son , maintenant dans la nouvelle version,avec l'esp32 ,ses 240Mhz et ses ports I2S, le wav est facile à gérer sans aucune puce. Je ne connais pas le Maxduino mais je suppose que les CAS et TSX ne contiennent que les datas du son wav original,ce pour économiser de l'espace disque et pouvoir fonctionner avec des MCU peu puissants comme un atmega328p. Avec l'esp32 en quelques lignes tu joues du .wav,c'est déconcertant de facilité :
https://hackaday.com/2020/06/14/esp32-becomes-music-player-in-under-40-lines-of-code/
Edité par yabikoo33 Le 06/12/2020 à 11h58
   
Jipe Membre non connecté

Maire-adjoint

Rang

Avatar

Association

Inscrit le : 02/10/2009 à 19h41

Messages: 10330

Le 06/12/2020 à 15h12
Batman est reconnu comme une cartouche ASCII 8k par BlueMSX

en général les cartouches ASCII 8k mappent leurs pages en :
page 0 : 6000h
page 1 : 6800h
page 2 : 7000h
page 3 : 7800h

et pourtant quand on recherche le code 32 00 60 dans ce jeu on ne le trouve pas

mais si on fouille un peu plus on voit que celui qui a programmé cette rom n'a pas mis des adresses standard

3e01 ld a,01h
321761 ld (6117h),a
3ace59 ld a,(59ceh)
320062 ld (6200h),a

3e02 ld a,02h
320062 ld (6200h),a

en effet ce n'est pas une adresse fixe qui mappe les pages mais une zone qui est faite ainsi

page 0 : 6000h à 67FFh
page 1 : 6800h à 6FFFh
page 2 : 7000h à 77FFh
page 3 : 7800h à 7FFFh



:noel
Site web    
yabikoo33 Membre non connecté

Vagabond

Rang

Avatar

Inscrit le : 14/11/2020 à 17h25

Messages: 18

Le 06/12/2020 à 17h32
Merci Jipe,c'est le genre d'info que je n'aurai jamais trouvé tout seul :)
Le MSX est vraiment passionnant , un vrai PC avant l'heure pour sa modularité.Mais du coup qu'est-ce qu'il faut connaitre et avoir de l'expérience pour commencer à faire quelque chose !

Je n'avais pas vu non plus que blue msx me donne à chaque fois le type de rom.

Du coup ca m'éclaire, je vois que les quelques jeux qui ne marchent pas,outre les roms 64ko sont de type Basic ROM.

En googlant , je viens de voir que les basic roms par défaut bootent à 0x8000h parcequ'elles utilisent le basic et ont donc besoin de le mapper . Donc si dans mon code je détecte qu'il s'agit d'une basic rom,je vais essayer de décaler le code de 8000h. Par contre je dois comprendre comment on détecte une basic rom. peut-être la valeur 80 à l'adresse 9h si l'adresse 3h est à 0 ?

et du coup je ne comprend toujours pas pourquoi une mirrored rom 64ko ne fonctionne pas sur ma carte . Mais plus qu'à régler ces deux points et je pourrai attaquer un nouveau proto avec cpld/fpga ou pourquoi pas tenter avec un esp32 pour émuler les mappers externes !

   
Jipe Membre non connecté

Maire-adjoint

Rang

Avatar

Association

Inscrit le : 02/10/2009 à 19h41

Messages: 10330

Le 06/12/2020 à 18h03
pour les roms qui sont en fait des jeux basic regarde le post de la Flashbox

http://msxvillage.fr/forum/topic.php?id=3765#m84389

sinon c'est bien expliqué ici

https://www.msx.org/wiki/Develop_a_program_in_cartridge_ROM


:noel
Site web    
yabikoo33 Membre non connecté

Vagabond

Rang

Avatar

Inscrit le : 14/11/2020 à 17h25

Messages: 18

Le 09/12/2020 à 08h23
Merci encore Jipe,oui,c'est bien expliqué mais j'avoue que ça reste encore un peu flou pour moi,je crois qu'il va falloir apprendre les rudiments du code sinon je ne pourrai pas tout comprendre. J'ai tenté de dire que si l'adresse 03h = 0 et 09h = 80 , il s'agit d'une cartouche basic et il faut décaler les datas de 8000h.

J'ai 4 roms basic et 3/4 fonctionnent désormais parfaitement (DangerX4,Comet tail et Crazy Bullet) ; Scope on démarre désormais bien mais après l'intro me met un "type mismatch" et retourne sur le basic sauf si on saute l'intro et commence à jouer directement auquel cas ça marche. Mais là je soupçonnerais bien un pb dans la rom.

Idem il devait y avoir un pb quelque part mais après avoir refait mes soudures , Break in,Dawn Patrol et Flight deck 2 fonctionnent donc les jeux 64ko standards fonctionnent.

Reste Burger time , le type mismatch de Scop on et simple asm (quoi que je me demande si simple asm ne démarrerait pas en 4000h et si les infos habituellement contenues dans les adresses 02 et 03 ne seraient pas dans les adresses 04 et 05 soit respectivement les valeurs 13 et 40 . Je suis sur que Jipe sait et ma seule question est : mais comment as-tu pu accumuler autant de connaissances sur le msx ? :)

Mais pour l'instant c'est déjà pas mal et difficile d'en comprendre plus sans maîtriser d'avantage le code .

Maintenant je vais ajouter un cpld premier prix et 5V tolerant pour essayer les mappers externes. Un CPLD est moins puissant qu'un FPGA donc il n'y aura pas de prise en charge d'un menu ni d'une carte SD. ; en revanche le coût de production de la carte sera minime , idéal pour la mise en production de jeux.



   
Répondre
Vous n'êtes pas autorisé à écrire dans cette catégorie