Logicielsmoto.com http://www.logicielsmoto.com/phpBB/ |
|
Chaine de "développement" pour MO5 http://www.logicielsmoto.com/phpBB/viewtopic.php?f=3&t=635 |
Page 1 sur 1 |
Auteur: | fxrobin [ 16 Fév 2021, 14:30 ] |
Sujet du message: | Chaine de "développement" pour MO5 |
Bonjour à tous, heureux possesseur d'un MO5 depuis 1985, je possède l'interface "SD" réalisée par Daniel Coulom. La petite bête fonctionne très bien et je me remets à programmer en assembleur dessus, mais à partir de mon linux (pour plus d'efficacité) J'ai donc téléchargé "c6809" sur le site "puls". Pas de souci, ça compile bien. Avec les outils graphique de manipulation de FD de Daniel, je crée une disquette "à la main" à laquelle j'importe mon fichier .BIN. Ensuite je convertis le FD en SD, toujours avec les outils de Daniel, et je bascule le tout sur mon MO5 : ça fonctionne. Alternativement, je lance l'emultateur DCMOTO en mode MO5 avec l'image de la disquette FD, ça marche aussi parfaitement. Seulement voilà, la production de la disquette FD c'est toujours par interface graphique, c'est pas très pratique et j'aurais aimé industrialiser la production de la disquette au format FD avec le BIN incorporé ainsi que la version "SD". Mais je ne crois pas que les outils de Daniel puissent se lancer en ligne de commande. J'ai vu dans les outils de dev TO8 un générateur de disquette bootable qui déclenche automatiquement le BIN : ça me plait bien (surtout que c'est en Java et que c'est un langage que je connais "un peu"). Est-ce que cela fonctionnerait aussi sur MO5, même en mode SD ? Au passage, je vais faire un peu de pub pour mon blog, il y a quelques petites choses "retro" dessus : https://www.fxjavadevblog.fr/fr/ Bonne journée à tous. |
Auteur: | Bentoc [ 16 Fév 2021, 17:09 ] |
Sujet du message: | Re: Chaine de "développement" pour MO5 |
Regarde dans l'archive que j'ai posté hier : http://www.logicielsmoto.com/phpBB/viewtopic.php?f=3&t=620&start=15#p6749 il y a une classe dans les sources qui s'appelle FdUtil.java Elle permet d'écrire à une position particulière (unité, piste, secteur) sur le fichier fd, plus d'autres choses ... Il y a aussi une petite méthode pour produire le fichier sd correspondant. Regarde aussi BuildDisk.java, je lance le compilo + écrit le binaire dans le fd. Par contre je fais tout sans utiliser la FAT ;-) Il faut donc dans ton programme sauvegarder qq part les index disquette des données que tu veux lire. Il y a aussi les appels de routine pour lire la disquette mais c'est pour TO8 Pour le boot sur MO5 je ne sais pas si le fonctionnement est le même ... je laisse les experts répondre ;-) |
Auteur: | Samuel Devulder [ 16 Fév 2021, 19:39 ] |
Sujet du message: | Re: Chaine de "développement" pour MO5 |
Moi ce que je fais via Makefile, c'est que je crée une diskette SAP vite [EDIT:vide, pas vite ] (sapfs -c disk.sap), que je peuple au fur et a mesure avec les binaires et données compilées (sapfs -a disk.sap TOTO.BIN TOTO.DAT). Ensuite je lance DCMoto sur le disk.sap, et il me crée un disk.fd à coté. Enfin je lance FD2SD.exe. Je ne fais ces deux dernières étapes que lors du packaging final. Durant la mise au point je reste sur le SAP car sapfs est utilisable en ligne de commande. |
Auteur: | Daniel Coulom [ 17 Fév 2021, 08:24 ] |
Sujet du message: | Re: Chaine de "développement" pour MO5 |
L'utilitaire dcfdutil n'était pas prévu au départ pour une utilisation en ligne de commande. Ses nombreuses fonctions et l'interface graphique le rendent un peu complexe. Par contre si on se limite à - l'insertion d'un fichier au format Thomson - dans la face 0 d'une image de disquette 3"1/2 au format .fd ou .sd - en ligne de commande c'est extrêmement simple. Je peux essayer de créer un outil spécifique. Chaque développeur choisit la méthode qui lui convient le mieux. Pour ma part j'utilise l'assembleur A09. Il génère un fichier binaire simple (pas au format Thomson). Avec la fonction "Charger fichier binaire" de dcmoto je le charge en mémoire et je le copie dans un fichier .fd ou .sd par l'instruction SAVEM. |
Auteur: | Samuel Devulder [ 17 Fév 2021, 10:41 ] |
Sujet du message: | Re: Chaine de "développement" pour MO5 |
Ce qu'il serait carrément cool, serait de pouvoir monter une diskette FD thomson comme un disk virtuel PC à la façon de ImDisk. |
Auteur: | fxrobin [ 17 Fév 2021, 13:25 ] |
Sujet du message: | Re: Chaine de "développement" pour MO5 |
Merci pour toutes vos réponses. en fait effectivement ce qui m'intéresserait serait une utilitaire comme "sapfs" en ligne de commande mais pour générer un .fd et .sd. Si on me dit où trouver de l'information sur la structure FAT et globalement de la structure d'un .FD, je suis preneur pour créer ce genre d'outils. @bentoc : oui j'avais vu tes classes FdUtil et BuildDisk (d'ailleurs, bravo pour l'effort sur la javadoc qui va avec !) Ca pourrait m'être très intéressant. @Daniel : Est-ce qu'une image SD Bootable est possible avec l'interface SD ? (j'imagine que oui) @Daniel : j'avais tenté l'import "BIN" depuis l'interface de mise au point (F9) mais cela ne semblait avoir aucun effet sur la RAM après chargement j'avais rien à l'adresse indiquée par mon BIN (org $6000). Pour info j'ai procédé ainsi du coup : https://www.fxjavadevblog.fr/6809-thoms ... bly-linux/ En tout cas merci à tous, c'est cool de trouver des passionnés MO/TO ! J'avais un TO8 aussi, mais mon ex l'a viré à la déchetterie lors de notre séparation. J'ai quand même pu "sauver" mon MO5 et mon Atari ST j'essaye de remettre la main sur un TO8 ou TO8D, mais c'est la misère, y'a plus rien de le "coincoin" ni sur "baybay" sauf à des prix prohibitifs ! |
Auteur: | Daniel Coulom [ 17 Fév 2021, 15:15 ] |
Sujet du message: | Re: Chaine de "développement" pour MO5 |
fxrobin a écrit: j'avais tenté l'import "BIN" depuis l'interface de mise au point (F9) mais cela ne semblait avoir aucun effet sur la RAM après chargement Dans l'outil de mise au point, il faut donner l'adresse de chargement du fichier binaire.j'avais rien à l'adresse indiquée par mon BIN (org $6000). Un fichier binaire simple, sans l'en-tête Thomson, ne contient pas d'adresse de chargement. fxrobin a écrit: Est-ce qu'une image SD Bootable est possible avec l'interface SD ? Les fichiers .sd sont des images de disquettes Thomson. Si la disquette Thomson est bootable, le fichier .sd est bootable.La majorité des démos et des jeux sont bootables, sinon il se lancent automatiquement par AUTO.BAT, ou manuellement par une commande BASIC. |
Auteur: | Daniel Coulom [ 17 Fév 2021, 15:36 ] |
Sujet du message: | Re: Chaine de "développement" pour MO5 |
Je n'ai pas trop le temps de développer un outil en ligne de commande pour importer un fichier Thomson dans une image de disquette au format .fd. Par contre, si quelqu'un veut le faire, voici le code (extrait de dcfdutil) pour importer les fichiers d'un répertoire. On peut utiliser seulement la fonction d'importation d'un fichier, c'est encore plus simple. Code: /*****************************************************************************\
* IMPORT.C - Importation des fichiers d'un dossier * * Auteur : Daniel Coulom - danielcoulom@gmail.com * * Creation : Avril 2010 * \*****************************************************************************/ #include <stdio.h> #include <string.h> #include <dirent.h> #include "dcfdutil.h" //variables globales FILE *fp; char filename[256]; int filesize; int newblock; //variables externes extern FILE *fdisk; extern char *diskname; extern char diskfilename[]; extern char folder[]; extern char fat[]; extern char cat[]; extern char string[]; extern int unite; extern int type; extern int unitsize; extern int sectorsize; extern int filesectorsize; extern int blocksize; extern int fatoffset; extern int fatlength; extern int catlength; extern char cat_filename[]; extern char cat_comments[]; extern int cat_filetype; extern int cat_datatype; extern int cat_firstblock; extern int cat_lastsectorsize; extern int cat_flag; //Allocation du premier bloc d'un fichier////////////////////////////////////// void Firstalloc() { int i, blockcount; blockcount = unitsize / blocksize; i = blockcount / 2; while(i < blockcount) { if((fat[i + 1] & 0xff) == 0xff) break; i = blockcount - i; if((fat[i + 1] & 0xff) == 0xff) break; i = blockcount + 1 - i; } newblock = i; } //Allocation des blocs suivants/////////////////////////////////////////////// void Nextalloc() { int i, blockcount; i = newblock; blockcount = unitsize / blocksize; while(1) { if(i == 0) {Firstalloc(); return;} if((fat[i + 1] & 0xff) == 0xff) break; i--; if(i < blockcount / 2) continue; i += 2; if(i >= blockcount) {Firstalloc(); return;} } newblock = i; } //Mise a jour du catalogue//////////////////////////////////////////////////// int Updatecat(int n, int lastsectorsize) //retour: 0=OK, negatif=fichier existant { int i, n1, n2; //initialisation a blanc du filename thomson for(i = 0; i < 11; i++) cat_filename[i] = ' '; //determination de l'extension thomson for(n1 = strlen(filename); n1 >= 0; n1--) if(filename[n1] == '.') break; if(n1 < 0) n1 = strlen(filename); //pas d'extension if(n1 > 8) n1 = 8; //le nom du fichier est <= 8 for(i = 0; i < n1; i++) cat_filename[i] = filename[i]; //nom du fichier n2 = strlen(filename) - n1 - 1; //longueur de l'extension if(n2 > 3) n2 = 3; for(i = 0; i < n2; i++) cat_filename[8 + i] = filename[n1 + i + 1]; for(i = 0; i < 3; i++) string[i] = cat_filename[8 + i]; string[3] = 0; //recherche d'existence du fichier dans le catalogue for(i = 0; i < 112; i++) if(memcmp(cat_filename, cat + 32 * i, 11) == 0) return -1; //determination du type de fichier cat_filetype = 2; if(strcasecmp(string, "BAS") == 0) cat_filetype = 0; if(strcasecmp(string, "BAT") == 0) cat_filetype = 0; if(strcasecmp(string, "DAT") == 0) cat_filetype = 1; if(strcasecmp(string, "ASC") == 0) cat_filetype = 1; if(strcasecmp(string, "TXT") == 0) cat_filetype = 1; //determination du type de donnees cat_datatype = 0; //attention: la determination du type de donnees n'est pas correcte //if(strcasecmp(string, "BAS") == 0) cat_datatype = 255; //if(strcasecmp(string, "BAT") == 0) cat_datatype = 255; if(strcasecmp(string, "DAT") == 0) cat_datatype = 255; if(strcasecmp(string, "ASC") == 0) cat_datatype = 255; if(strcasecmp(string, "TXT") == 0) cat_datatype = 255; //initialisation des autres champs for(i = 0; i < 15; i++) cat_comments[i] = 0; cat_flag = 0; cat_firstblock = newblock; cat_lastsectorsize = lastsectorsize; if(cat_lastsectorsize == 0) cat_lastsectorsize = filesectorsize; //ecriture dans le catalogue Putcat(n); //affichage du compte-rendu for(i = 0; i < 8; i++) string[i] = cat_filename[i]; string[8] = ' '; for(i = 0; i < 3; i++) string[9 + i] = cat_filename[i + 8]; string[12] = ' '; sprintf(string + 13, "%02x %02x %02x %03x", cat_filetype, cat_datatype, cat_firstblock, cat_lastsectorsize); Display(string); return 0; } //Importation d'un bloc//////////////////////////////////////////////////////// void Importblock(int blocklength, int blocknumber) { int i; int lastsectorlength; char buffer[blocklength]; lastsectorlength = blocklength; for(i = 0; i < blocklength; i++) buffer[i] = 0; //secteurs complets for(i = 0; i < blocklength / sectorsize; i++) { fread(buffer + i * sectorsize, filesectorsize, 1, fp); lastsectorlength -= sectorsize; } //secteur incomplet if(lastsectorlength > 0) fread(buffer + i * sectorsize, lastsectorlength, 1, fp); //ecriture du bloc dans le fichier .fd fseek(fdisk, unite * unitsize + blocknumber * blocksize, SEEK_SET); fwrite(buffer, blocklength, 1, fdisk); } //Importation d'un fichier///////////////////////////////////////////////////// void Importfile() { int i, n; //int bloc; int nsectors; int nfullsectors; int incompletesectorsize; int nfullblocks; int blocksectors; int incompleteblocksectors; int currentblock; //ouverture du fichier strcpy(string, folder); strcat(string, filename); fp = fopen(string, "rb"); if(fp == NULL) {Display(string); Erreur(2); return;} //taille du fichier fseek(fp, 0, SEEK_END); filesize = ftell(fp); fseek(fp, 0, SEEK_SET); //nombre de secteurs complets nfullsectors = filesize / filesectorsize; //taille du secteur incomplet incompletesectorsize = filesize - nfullsectors * filesectorsize; //nombre total de secteurs nsectors = nfullsectors; if(incompletesectorsize > 0) nsectors++; //nombre de blocs complets blocksectors = blocksize / sectorsize; nfullblocks = nsectors / blocksectors; //nombre de secteurs du bloc incomplet incompleteblocksectors = nsectors - nfullblocks * blocksectors; //allocation du premier bloc Firstalloc(); if(newblock > 159) {Erreur(14); return;} //disquette pleine currentblock = newblock; //recherche place libre dans le catalogue for(n = 0; n < 112; n++) { if(cat[32 * n] == 0) break; if((cat[32 * n] & 0xff) == 0xff) break; } if(n > 111) {Erreur(14); return;} //disquette pleine //mise a jour du catalogue if(Updatecat(n, incompletesectorsize) < 0) {Display(filename); Erreur(15); return;} //ecriture des blocs complets (8 secteurs) for(i = 0; i < nfullblocks; i++) { //ecriture du bloc currentblock = newblock; Importblock(blocksize, currentblock); //allocation du prochain bloc fat[currentblock + 1] = 0; //pour ne pas reallouer le meme bloc Nextalloc(); fat[currentblock + 1] = newblock; } //indicateur de fin en l'absence de bloc incomplet if(incompleteblocksectors == 0) { fat[currentblock + 1] = 0xc0 + blocksectors; } //ecriture eventuelle d'un bloc de fin incomplet if(incompleteblocksectors > 0) { currentblock = newblock; Importblock(incompleteblocksectors * sectorsize, currentblock); fat[currentblock + 1] = 0xc0 + incompleteblocksectors; } fclose(fp); } //Importation des fichiers d'un repertoire///////////////////////////////////// void Import() { DIR *dp; DIR *dummy; struct dirent *ep; int i; //controle sprintf(string, "Importation unite %i disquette ", unite); if(diskname != NULL) strcat(string, diskname + 1); Display(string); if(diskname == NULL) {Erreur(1); return;} //ouverture du fichier image de disquette fdisk = fopen(diskfilename, "rb+"); if(fdisk == NULL) {Erreur(2); return;} //lecture FAT et DIR i = unite * unitsize + fatoffset; fseek(fdisk, 0, SEEK_END); if(i > ftell(fdisk)) {Erreur(10 + unite); return;} fseek(fdisk, i, SEEK_SET); fread(fat, fatlength, 1, fdisk); fread(cat, catlength, 1, fdisk); //choix du dossier if(ChoixDossier(0) < 0) {Erreur(9); return;} //boucle sur chaque fichier du dossier dp = opendir(folder); if(dp == NULL) {Erreur(3); return;} while((ep = readdir(dp))) { strcpy(filename, ep->d_name); if(filename[0] == '.') continue; //c'est un fichier supprime strcpy(string, folder); strcat(string, filename); dummy = opendir(string); if(dummy) {closedir(dummy); continue;} //c'est un repertoire Importfile(); } closedir(dp); //ecriture fat et cat fseek(fdisk, unite * unitsize + fatoffset, SEEK_SET); fwrite(fat, fatlength, 1, fdisk); fwrite(cat, catlength, 1, fdisk); fclose(fdisk); Display("Fin de l'importation des fichiers du dossier"); } |
Auteur: | fxrobin [ 17 Fév 2021, 16:27 ] |
Sujet du message: | Re: Chaine de "développement" pour MO5 |
Super merci Daniel ! |
Auteur: | PulkoMandy [ 08 Mar 2021, 09:18 ] |
Sujet du message: | Re: Chaine de "développement" pour MO5 |
Bonjour, Vous pouvez trouver une implémentation d'un convertisseur sap->fd et fd->sd sur mon github: https://github.com/pulkomandy/thomson/tree/master/tools J'utilise cela en ligne de commande sous Haiku (mais ça devrait compiler sans problème sous Linux également) pour tout faire depuis un makefile. |
Auteur: | fxrobin [ 08 Oct 2021, 14:43 ] |
Sujet du message: | Re: Chaine de "développement" pour MO5 |
j'étais passé au travers de cette réponse. Merci Pulkomandy !!!!! |
Page 1 sur 1 | Heures au format UTC + 1 heure |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |