// Copyright 2004 Marc Plouhinec /* This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ // OBJLIB_2_82P par Marc Plouhinec le 03/07/2004 // Convertisseur .OBJ (librairie seulement) en .82P pour SNG v1.0 // www.thebestof.tk // m_plouhinec@yahoo.fr #include "stdafx.h" #include #include #include #include #include char *PointeurVersChaine; char nom[50]; FILE* fichier_obj; FILE* fichier_82p; FILE* fichier_tabl; char nom_du_fichier_82p[13]={0,0,0,0,0,0,0,0,0,0,0,0,0}; char compteur; unsigned char TailleTable=0; fpos_t pos; int c,d; unsigned long checksum = 0; // Fonction venant de string85 par Dan Eble void fputc_and_sum(int c) { fputc(c, fichier_82p); checksum += c; } char* nom_tabl( char *chaine ) { PointeurVersChaine = chaine; for (int Temp = 0; *(PointeurVersChaine+Temp)!='.';Temp++) { nom[Temp]=*(PointeurVersChaine+Temp); } nom[Temp]='.'; nom[Temp+1]='T'; nom[Temp+2]='A'; nom[Temp+3]='B'; nom[Temp+4]='L'; nom[Temp+5]=0; return nom; } int main(int argc, char* argv[]) { printf("OBJLIB_2_82P par Marc Plouhinec le 03/07/2004\nConvertisseur .OBJ (librairie) en .82P pour SNG v1.0\nSite: www.thebestof.tk Email: m_plouhinec@yahoo.fr\n\n"); _fmode=_O_BINARY; //On vérifie si le programme a été lancé avec un argument if (argc != 2) { printf("Syntaxe: OBJLIB_2_82P \n"); return 1; } //On ouvre le fichier .OBJ en lecture if (!(fichier_obj = fopen(argv[1], "r"))) { fprintf(stderr, "Erreur: Impossible de lire: %s\n", argv[1]); return 2; } //On ouvre le fichier tabl if (!(fichier_tabl = fopen(nom_tabl(argv[1]), "r"))) { fprintf(stderr, "Erreur: Impossible d'ouvrir le fichier: %s\n", nom_tabl(argv[1])); return 2; } //On prend le nom du fichier OBJ avec des lettres majuscules tronqué à 8 lettres. nom_du_fichier_82p[0]=*argv[1]; compteur=0; for( int i = 0; i < 8; i++ ) { nom_du_fichier_82p[compteur]=*argv[1]; //si le caractère n'est pas une lettre ou un chiffre, on s'arrete if (nom_du_fichier_82p[compteur] < 0x30 || nom_du_fichier_82p[compteur]==0x40 || (nom_du_fichier_82p[compteur] > 0x5A && nom_du_fichier_82p[compteur] <0x61) || nom_du_fichier_82p[compteur] > 0x7a) { nom_du_fichier_82p[compteur]=0;i=8;compteur--; } //si le caractère est une lettre minuscule, on la transforme en lettre majuscule if (nom_du_fichier_82p[compteur] >0x61 && nom_du_fichier_82p[compteur] <0x7a) { nom_du_fichier_82p[compteur]=nom_du_fichier_82p[compteur]-0x20; } argv[1]++;compteur++; } //On complete le nom par .82P nom_du_fichier_82p[compteur ]='.'; nom_du_fichier_82p[compteur+1]='8'; nom_du_fichier_82p[compteur+2]='2'; nom_du_fichier_82p[compteur+3]='P'; if (!(fichier_82p = fopen(nom_du_fichier_82p, "wb"))) { fprintf(stderr, "Erreur: Impossible de creer le fichier: %s\n", nom_du_fichier_82p); return 3; } //On remplit le fichier 82p: //Merci à Romain Liévin (roms@lpg.ticalc.org) et Tim Singer (tsinger@gladstone.uoregon.edu) pour TIxx_guide //header fputs("**TI82**\x1A\x0A", fichier_82p); fputc(0x00, fichier_82p); //Commentaire (42 octets) fputs("Programme ASM pour SNG par Marc Plouhinec ", fichier_82p); //Calcule la taille de la table fgetpos( fichier_tabl, &pos ); while ((c = fgetc(fichier_tabl)) != EOF) { if (c==10) TailleTable++; } fsetpos( fichier_tabl, &pos ); //calcule la taille du fichier .obj for (i = 0; fgetc(fichier_obj) != EOF; i++); i=i+TailleTable*2+2;//Le 2 est le mot 00 rajouté à la fin de la table //taille du fichier +17+5 à l'envers fputc((unsigned char)(i+17+5), fichier_82p); fputc((i+17+5) >> 8, fichier_82p); //Toujours 0x0B et 0x00 fputc_and_sum(0x0b); fputc_and_sum(0x00); //Taille du fichier +5+2 à l'envers fputc_and_sum((unsigned char)(i + 5+2)); fputc_and_sum((i + 5+2) >> 8); //Type et nom du programme(au max 8 caractères) fputc_and_sum(0x06); for (int t=0 ; t> 8); fputc_and_sum((unsigned char)i + 5); fputc_and_sum((i+ 5) >> 8); //Le programme commence ici ( 5 octets) fputc_and_sum(0xD9); //stop fputc_and_sum(0x3F); //saut de ligne fputc_and_sum('L'); fputc_and_sum('I'); fputc_and_sum('B'); //On recopie la table char A,B,C,D; while ((c = fgetc(fichier_tabl)) != EOF) { if(c <=0x39) A=c-0x30; else A=c-0x41+10; c = fgetc(fichier_tabl); if(c <=0x39) B=c-0x30; else B=c-0x41+10; c = fgetc(fichier_tabl); if(c <=0x39) C=c-0x30; else C=c-0x41+10; c = fgetc(fichier_tabl); if(c <=0x39) D=c-0x30; else D=c-0x41+10; fputc_and_sum(C*0x10+D); fputc_and_sum(A*0x10+B); fgetc(fichier_tabl);// fgetc(fichier_tabl);//On passe le saut de ligne } fputc_and_sum(0x00); fputc_and_sum(0x00); //Copie le fichier .OBJ rewind(fichier_obj); while ((c = fgetc(fichier_obj)) != EOF) fputc_and_sum(c); //Ecrit le checksum fputc((unsigned char)checksum, fichier_82p); fputc(checksum >> 8, fichier_82p); //Et voila! fprintf(stderr, "Creation du fichier: %s\n" ,nom_du_fichier_82p); return 0; }