#define TAILLE_FICHIER_DATA 84369 // Taille du fichier GFX2.DAT #include #include "const.h" #include "struct.h" #include "global.h" #include "modesvdo.h" #include "graph.h" #include "boutons.h" #include "palette.h" #include "aide.h" #include "operatio.h" #include #include #include #include #include #include #include #include "divers.h" // On déclare méchamment le prototype de Erreur pour éviter de faire un // fichier "main.h": void Erreur(int Code); // Chercher le répertoire contenant GFX2.EXE void Chercher_repertoire_du_programme(char * Chaine) { int Position; strcpy(Repertoire_du_programme,Chaine); for (Position=strlen(Repertoire_du_programme);Repertoire_du_programme[Position]!='\\';Position--); Repertoire_du_programme[Position+1]='\0'; } word Drive_Touche[26]= { 0x041E, 0x0430, 0x042E, 0x0420, 0x0412, 0x0421, 0x0422, 0x0423, 0x0417, 0x0424, 0x0425, 0x0426, 0x0432, 0x0431, 0x0418, 0x0419, 0x0410, 0x0413, 0x041F, 0x0414, 0x0416, 0x042F, 0x0411, 0x042D, 0x0415, 0x042C }; // Ajouter un lecteur … la liste de lecteurs void Ajouter_lecteur(byte Numero, byte Type) { Drive[Nb_drives].Lettre=Numero+65; Drive[Nb_drives].Type =Type; Drive[Nb_drives].Touche=Drive_Touche[Numero]; Nb_drives++; } // Rechercher la liste et le type des lecteurs de la machine void Rechercher_drives(void) { byte Lecteur; byte Nb_lecteurs_disquettes; byte Lecteur_de_disquettes; byte Type_de_lecteur=42; //char Bidon[256]; Nb_drives=0; Nb_lecteurs_disquettes=(Type_de_lecteur_de_disquette(0)>0)+(Type_de_lecteur_de_disquette(1)>0); // Test du type des lecteurs A: et B: if (Nb_lecteurs_disquettes==2) for (Lecteur=0; Lecteur<=1; Lecteur++) { switch (Type_de_lecteur_de_disquette(Lecteur)) { case 1 : case 2 : Ajouter_lecteur(Lecteur,DRIVE_FLOPPY_5_25); break; default: Ajouter_lecteur(Lecteur,DRIVE_FLOPPY_3_5); } } else // On n'a pas 2 lecteurs donc on regarde si "logiquement" c'est A: ou B: if (Nb_lecteurs_disquettes==1) { if (Disk_map(2)==Disk_map(1)) { // Il n'y a pas de lecteur émulé par un SUBST Lecteur_de_disquettes=Disk_map(1)-1; for (Lecteur=0; Lecteur<=1; Lecteur++) { switch (Type_de_lecteur_de_disquette(Lecteur)) { case 0 : break; case 1 : case 2 : Ajouter_lecteur(Lecteur_de_disquettes,DRIVE_FLOPPY_5_25); break; default: Ajouter_lecteur(Lecteur_de_disquettes,DRIVE_FLOPPY_3_5); } } } else { // Il y a un lecteur émulé par un SUBST Lecteur_de_disquettes=Disk_map(1)-1; // On cherche d'abord sur quel lecteur le lecteur physique est dispo for (Lecteur=0; Lecteur<=1; Lecteur++) { switch (Type_de_lecteur_de_disquette(Lecteur)) { case 0 : break; case 1 : case 2 : Type_de_lecteur=DRIVE_FLOPPY_5_25; break; default: Type_de_lecteur=DRIVE_FLOPPY_3_5; } } // On déclare les trucs maintenant if (Lecteur_de_disquettes==0) { // Situation : On a un lecteur A: qui est réel et un lecteur B: émulé Ajouter_lecteur(0,Type_de_lecteur); Ajouter_lecteur(1,DRIVE_NETWORK); } else { // Situation : On a un lecteur A: qui est réel et un lecteur B: émulé Ajouter_lecteur(0,DRIVE_NETWORK); Ajouter_lecteur(1,Type_de_lecteur); } } } else // Il n'y a pas de lecteur de D7 physique, mais on vérifie s'il n'y en a // pas qui seraient émulés par SUBST for (Lecteur=0; Lecteur<=1; Lecteur++) { switch (Freespace(Lecteur+1)) { case -1: break; default: Ajouter_lecteur(Lecteur,DRIVE_NETWORK); } } // Test de la présence d'autres lecteurs (HDD, CD, Réseau) // On les met tous en réseau avant de tester leur vrai type. for (Lecteur=2; Lecteur<=25; Lecteur++) { if (Disque_dur_present(Lecteur-2)) Ajouter_lecteur(Lecteur,DRIVE_HDD); else if (Lecteur_CDROM_present(Lecteur)) Ajouter_lecteur(Lecteur,DRIVE_CDROM); else if (Freespace(Lecteur+1)!=-1) Ajouter_lecteur(Lecteur,DRIVE_NETWORK); } } // Fonction de décryptage #define DECRYPT_TAILLE_CLE 14 byte Decrypt_compteur=0; char Decrypt_cle[DECRYPT_TAILLE_CLE]="Sunset Design"; byte Decrypt(byte Octet) { byte Temp; Temp=Octet ^ Decrypt_cle[Decrypt_compteur]; if ((++Decrypt_compteur)>=(DECRYPT_TAILLE_CLE-1)) Decrypt_compteur=0; return Temp; } // Décryptage d'une donnée void Decrypte(byte * Donnee,int Taille) { int Indice; for (Indice=0;Indicest_size; if (Taille_fichier!=TAILLE_FICHIER_DATA) Erreur(ERREUR_DAT_CORROMPU); if (read(Handle,Palette_defaut,sizeof(T_Palette))!=sizeof(T_Palette)) Erreur(ERREUR_DAT_CORROMPU); Decrypte((byte *)Palette_defaut,sizeof(T_Palette)); if (read(Handle,BLOCK_MENU,LARGEUR_MENU*HAUTEUR_MENU)!=LARGEUR_MENU*HAUTEUR_MENU) Erreur(ERREUR_DAT_CORROMPU); Decrypte((byte *)BLOCK_MENU,LARGEUR_MENU*HAUTEUR_MENU); if (read(Handle,SPRITE_EFFET,LARGEUR_SPRITE_MENU*HAUTEUR_SPRITE_MENU*NB_SPRITES_EFFETS)!= LARGEUR_SPRITE_MENU*HAUTEUR_SPRITE_MENU*NB_SPRITES_EFFETS) Erreur(ERREUR_DAT_CORROMPU); Decrypte((byte *)SPRITE_EFFET,LARGEUR_SPRITE_MENU*HAUTEUR_SPRITE_MENU*NB_SPRITES_EFFETS); if (read(Handle,SPRITE_CURSEUR,LARGEUR_SPRITE_CURSEUR*HAUTEUR_SPRITE_CURSEUR*NB_SPRITES_CURSEUR)!= LARGEUR_SPRITE_CURSEUR*HAUTEUR_SPRITE_CURSEUR*NB_SPRITES_CURSEUR) Erreur(ERREUR_DAT_CORROMPU); Decrypte((byte *)SPRITE_CURSEUR,LARGEUR_SPRITE_CURSEUR*HAUTEUR_SPRITE_CURSEUR*NB_SPRITES_CURSEUR); if (read(Handle,SPRITE_MENU,LARGEUR_SPRITE_MENU*HAUTEUR_SPRITE_MENU*NB_SPRITES_MENU)!= LARGEUR_SPRITE_MENU*HAUTEUR_SPRITE_MENU*NB_SPRITES_MENU) Erreur(ERREUR_DAT_CORROMPU); Decrypte((byte *)SPRITE_MENU,LARGEUR_SPRITE_MENU*HAUTEUR_SPRITE_MENU*NB_SPRITES_MENU); if (read(Handle,SPRITE_PINCEAU,LARGEUR_PINCEAU*HAUTEUR_PINCEAU*NB_SPRITES_PINCEAU)!= LARGEUR_PINCEAU*HAUTEUR_PINCEAU*NB_SPRITES_PINCEAU) Erreur(ERREUR_DAT_CORROMPU); Decrypte((byte *)SPRITE_PINCEAU,LARGEUR_PINCEAU*HAUTEUR_PINCEAU*NB_SPRITES_PINCEAU); if (read(Handle,SPRITE_DRIVE,LARGEUR_SPRITE_DRIVE*HAUTEUR_SPRITE_DRIVE*NB_SPRITES_DRIVES)!= LARGEUR_SPRITE_DRIVE*HAUTEUR_SPRITE_DRIVE*NB_SPRITES_DRIVES) Erreur(ERREUR_DAT_CORROMPU); Decrypte((byte *)SPRITE_DRIVE,LARGEUR_SPRITE_DRIVE*HAUTEUR_SPRITE_DRIVE*NB_SPRITES_DRIVES); if (!(Logo_GrafX2=(byte *)malloc(231*56))) Erreur(ERREUR_MEMOIRE); if (read(Handle,Logo_GrafX2,231*56)!=(231*56)) Erreur(ERREUR_DAT_CORROMPU); Decrypte(Logo_GrafX2,231*56); if (read(Handle,TRAME_PREDEFINIE,2*16*NB_TRAMES_PREDEFINIES)!=2*16*NB_TRAMES_PREDEFINIES) Erreur(ERREUR_DAT_CORROMPU); Decrypte((byte *)TRAME_PREDEFINIE,2*16*NB_TRAMES_PREDEFINIES); // Lecture des fontes 8x8: if (!(Fonte_temporaire=(byte *)malloc(2048))) Erreur(ERREUR_MEMOIRE); // Lecture de la fonte systŠme if (read(Handle,Fonte_temporaire,2048)!=2048) Erreur(ERREUR_DAT_CORROMPU); Decrypte(Fonte_temporaire,2048); for (Indice=0;Indice<256;Indice++) for (Pos_X=0;Pos_X<8;Pos_X++) for (Pos_Y=0;Pos_Y<8;Pos_Y++) Fonte_systeme[(Indice<<6)+(Pos_X<<3)+Pos_Y]=( ((*(Fonte_temporaire+(Indice*8)+Pos_Y))&(0x80>>Pos_X)) ? 1 : 0); // Lecture de la fonte alternative if (read(Handle,Fonte_temporaire,2048)!=2048) Erreur(ERREUR_DAT_CORROMPU); Decrypte(Fonte_temporaire,2048); for (Indice=0;Indice<256;Indice++) for (Pos_X=0;Pos_X<8;Pos_X++) for (Pos_Y=0;Pos_Y<8;Pos_Y++) Fonte_fun[(Indice<<6)+(Pos_X<<3)+Pos_Y]=( ((*(Fonte_temporaire+(Indice*8)+Pos_Y))&(0x80>>Pos_X)) ? 1 : 0); free(Fonte_temporaire); Fonte=Fonte_systeme; // Lecture de la fonte 6x8: (spéciale aide) if (read(Handle,Fonte_help,(315*6*8))!=(315*6*8)) Erreur(ERREUR_DAT_CORROMPU); Decrypte((byte*)Fonte_help,(315*6*8)); // Lecture des différentes sections de l'aide: // Pour chaque section "Indice" de l'aide: for (Indice=0;Indice>1); Pinceau_predefini_Decalage_Y[Indice]=(Pinceau_predefini_Hauteur[Indice]>>1); } Curseur_Decalage_X[FORME_CURSEUR_FLECHE]=0; Curseur_Decalage_Y[FORME_CURSEUR_FLECHE]=0; Curseur_Decalage_X[FORME_CURSEUR_CIBLE]=7; Curseur_Decalage_Y[FORME_CURSEUR_CIBLE]=7; Curseur_Decalage_X[FORME_CURSEUR_CIBLE_PIPETTE]=7; Curseur_Decalage_Y[FORME_CURSEUR_CIBLE_PIPETTE]=7; Curseur_Decalage_X[FORME_CURSEUR_SABLIER]=7; Curseur_Decalage_Y[FORME_CURSEUR_SABLIER]=7; Curseur_Decalage_X[FORME_CURSEUR_MULTIDIRECTIONNEL]=7; Curseur_Decalage_Y[FORME_CURSEUR_MULTIDIRECTIONNEL]=7; Curseur_Decalage_X[FORME_CURSEUR_HORIZONTAL]=7; Curseur_Decalage_Y[FORME_CURSEUR_HORIZONTAL]=3; Curseur_Decalage_X[FORME_CURSEUR_CIBLE_FINE]=7; Curseur_Decalage_Y[FORME_CURSEUR_CIBLE_FINE]=7; Curseur_Decalage_X[FORME_CURSEUR_CIBLE_PIPETTE_FINE]=7; Curseur_Decalage_Y[FORME_CURSEUR_CIBLE_PIPETTE_FINE]=7; } // Initialisation des boutons: // Action factice: void Rien_du_tout(void) {} // Initialiseur d'un bouton: void Initialiser_bouton(byte Numero, word Decalage_X , word Decalage_Y, word Largeur , word Hauteur, byte Forme, fonction_action Gauche , fonction_action Droite, fonction_action Desenclencher, byte Famille) { Bouton[Numero].Decalage_X =Decalage_X; Bouton[Numero].Decalage_Y =Decalage_Y; Bouton[Numero].Largeur =Largeur-1; Bouton[Numero].Hauteur =Hauteur-1; Bouton[Numero].Enfonce =0; Bouton[Numero].Forme =Forme; Bouton[Numero].Gauche =Gauche; Bouton[Numero].Droite =Droite; Bouton[Numero].Desenclencher =Desenclencher; Bouton[Numero].Famille =Famille; } // Initiliseur de tous les boutons: void Initialisation_des_boutons(void) { byte Indice_bouton; for (Indice_bouton=0;Indice_boutonst_size; if ( (Taille_fichier>8) { case 0 : Config_Touche[Ordonnancement[Indice2]&0xFF]=CFG_Infos_touche.Touche; break; case 1 : Bouton[Ordonnancement[Indice2]&0xFF].Raccourci_gauche=CFG_Infos_touche.Touche; break; case 2 : Bouton[Ordonnancement[Indice2]&0xFF].Raccourci_droite=CFG_Infos_touche.Touche; break; } } else goto Erreur_lecture_config; } } } else { if (lseek(Handle,Chunk.Taille,SEEK_CUR)==-1) goto Erreur_lecture_config; } break; case CHUNK_MODES_VIDEO: // Modes vidéo if ((Chunk.Taille/sizeof(CFG_Mode_video))!=NB_MODES_VIDEO) goto Erreur_lecture_config; for (Indice=1; Indice<=NB_MODES_VIDEO; Indice++) { if (read(Handle,&CFG_Mode_video,sizeof(CFG_Mode_video))!=sizeof(CFG_Mode_video)) goto Erreur_lecture_config; else { for (Indice2=0; ( (Indice2>6)) ) ); Indice2++); if (Indice2>8) { case 0 : CFG_Infos_touche.Touche=Config_Touche[Ordonnancement[Indice]&0xFF]; break; case 1 : CFG_Infos_touche.Touche=Bouton[Ordonnancement[Indice]&0xFF].Raccourci_gauche; break; case 2 : CFG_Infos_touche.Touche=Bouton[Ordonnancement[Indice]&0xFF].Raccourci_droite; break; } CFG_Infos_touche.Touche2=0x00FF; if (write(Handle,&CFG_Infos_touche,sizeof(CFG_Infos_touche))!=sizeof(CFG_Infos_touche)) goto Erreur_sauvegarde_config; } // Sauvegarde de l'état de chaque mode vidéo Chunk.Numero=CHUNK_MODES_VIDEO; Chunk.Taille=NB_MODES_VIDEO*sizeof(CFG_Mode_video); if (write(Handle,&Chunk,sizeof(Chunk))!=sizeof(Chunk)) goto Erreur_sauvegarde_config; for (Indice=0; Indice