; *------------------------------------------------------------------------* ; * T_FAT * ; *------------------------------------------------------------------------* ; Lit un fichier sur une disquette. ; Le fichier lu est INFOS.TXT et doit être placé dans le répertoire racine de la disquette. ; La procédure FIC_char_donnees affiche à l'écran ce qu'elle a chargée. Ceci sert pour le débuggage. Il suffit de commenter cette partie et décommenter la partie au dessus pour retrouver un fonctionnement normal de la fonction. T_FAT SEGMENT ORG 100h ASSUME CS:T_FAT JMP debut ;--Variables et constantes---------------------------------------------------- FIC_offs_bpb: ;--FAT--Bloc de paramŠtres BIOS----------OFFSet_BPB (FICHIER) FIC_saut_boot DB 3 DUP (0) ;--FAT--Jump vers routine de boot--------SAUT_BOOT (FICHIER) FIC_fabr_version DB 8 DUP (0) ;--FAT--Nom fabricant et version---------FABRicant_VERSION (FICHIER) FIC_nomb_octSecteur DW 0 ;--FAT--Octets par secteur---------------NOMBre_OCTSERCTEUR (FICHIER) FIC_nomb_secCluster DB 0 ;--FAT--Secteurs par clusteur------------NOMBre_SECCLUSTER (FICHIER) FIC_nomb_reserves DW 0 ;--FAT--Nombre secteur r‚serv‚s----------NOMBre_RESERVES (FICHIER) FIC_nomb_FAT DB 0 ;--FAT--Nombre de File Allocation Table--NOMBre_FAT (FICHIER) FIC_nomb_entrees DW 0 ;--FAT--Nombre entr‚es racine------------NOMBre_ENTREES (FICHIER) FIC_nomb_secVolume DW 0 ;--FAT--Nombre secteurs dans volume------NOMBre_SECVOLUME (FICHIER) FIC_desc_support DB 0 ;--FAT--Descripteur de support-----------DESCripteur_SUPPORT (FICHIER) FIC_nomb_secFAT DW 0 ;--FAT--Nombre secteur par FAT-----------NOMBre_SECFAT (FICHIER) FIC_nomb_secPiste DW 0 ;--FAT--Secteur par piste----------------NOMBre_SECPISTE (FICHIER) FIC_nomb_tete DW 0 ;--FAT--Nombre tˆte lecture/‚criture-----NOMBre_TETE (FICHIER) FIC_dist_volume DW 0 ;--FAT--Distance BPB/m‚moire masse-------DISTance_VOLUME (FICHIER) FIC_offs_entrees: ;--FAT--Entr‚e de r‚pertoire-------------OFFSet_ENTREES (FICHIER) FIC_name_entree DB 8 DUP (0) ;--FAT--Nom de l'entr‚e------------------NAME_ENTREE (FICHIER) FIC_exte_entree DB 3 DUP (0) ;--FAT--Extension de l'entr‚e------------EXTEnsion_ENTREE (FICHIER) FIC_attr_entree DB 0 ;--FAT--Attribut de l'entr‚e-------------ATTRibut_ENTREE (FICHIER) FIC_octe_reserve DB 10 DUP (0) ;--FAT--Octet r‚serv‚s-------------------OCTEt_RESERVE (FICHIER) FIC_heur_modif DW 0 ;--FAT--Heure de modification------------HEURe_MODIF (FICHIER) FIC_date_modif DW 0 ;--FAT--Date de modification-------------DATE_MODIF (FICHIER) FIC_prem_cluster DW 0 ;--FAT--Premier cluster------------------PREMier_CLUSTER (FICHIER) FIC_tail_basse DW 0 ;--FAT--Taille basse---------------------TAILle_BASSE (FICHIER) FIC_tail_haute DW 0 ;--FAT--Taille haute---------------------TAILle_HAUTE (FICHIER) FIC_name_courant DB 11 DUP (32) ;--NAME_FAT (FICHIER) FIC_offs_buffer DW 0 ;--OFFSet_BUFFER (FICHIER) FIC_offs_fat DW 0 ;--OFFSet_FAT (FICHIER) FIC_sect_courant DB 0FFh ;--SECTeur_COURANT (FICHIER) FIC_nume_entree DB 0FFh ;--NUMEro_ENTREE (FICHIER) FIC_lect_courant DB 0 ;--LECTeur_COURANT (FICHIER) FIC_nomb_erreur DB 5 ;--NOMBre_ERREUR (FICHIER) FIC_clus_courant DW 0 ;--CLUSter_COURANT (FICHIER) FIC_clus_suivant DW 0 ;--CLUSter_SUIVANT (FICHIER) FIC_nume_secteur DW 0 ;--NUMEro_SECTEUR (FICHIER) FIC_sect_fat DB 2 ;--SECTeur_FAT (FICHIER) FIC_pist_fat DB 0 ;--PISTe_FAT (FICHIER) FIC_face_fat DB 0 ;--FACE_FAT (FICHIER) FIC_sect_racine DB 1 ;--SECTeur_RACINE (FICHIER) FIC_pist_racine DB 0 ;--PISTe_RACINE (FICHIER) FIC_face_racine DB 1 ;--FACE_RACINE (FICHIER) FIC_sect_donnees DB 0 ;--SECTeur_DONNEES (FICHIER) FIC_pist_donnees DB 0 ;--PISTe_DONNEES (FICHIER) FIC_face_donnees DB 0 ;--FACE_DONNEES (FICHIER) FIC_prog_charge DB 0 ;--PROGramme_CHARGE (FICHIER) FIC_char_demarrage DB 'INFOS.TXT', 0 ;--CHARge_DEMARRAGE (FICHIER) offset_fat DB 4608 DUP (0) offset_buffer DB 512 DUP (0) MES_buff_nombre DB 5 DUP (0) MES_text_erreur DB 13, 10, '*!* Erreur N°', 0 MES_init_lecteur DB 'Initialise le lecteur...', 13, 10, 0 MES_rech_fichier DB 'Recherche le fichier...', 13, 10, 0 MES_char_fichier DB 'Charge le fichier...', 13, 10, 0 ;----------------------------------------------------------------------------- ;--Proc‚dures----------------------------------------------------------------- affiche PROC ; Affiche une chaine de type ASCIIZ. ; SI doit contenir l'adresse de la chaine. PUSH AX ; Sauve les registres PUSH BX ; utilisés dans la procédure PUSH SI ; CLD ; LODSB incrémente SI aff_retour: LODSB ; Charge le premier caractère OR AL, AL ; Est-ce l'ASCIIZ JZ aff_saut ; OUI MOV AH, 0Eh ; NON on prépare l'interruption MOV BX, 0007h ; INT 10h ; Et on affiche JMP aff_retour ; On recommence aff_saut: POP SI ; On récupère les registres POP BX ; sauvés précédement POP AX ; RET affiche ENDP ;--- FIC_init_lecteurDK PROC ;--INITialise_LECTEURDK (FICHIER) ; Initialise le lecteur de disquette ; Entrée(s): DL: numéro de lecteur ; Sortie(s): CF = 1 si erreur avec AX numéro de l'erreur et DL = FFh ; Utilise: rien ; Préparation pour les interruptions PUSH BX ; Sauve les registres PUSH CX ; utilisés par la procédure PUSH DX ; PUSH SI ; PUSH DI ; PUSH DS ; PUSH ES ; MOV AX, CS ; CS = DS = ES MOV DS, AX ; MOV ES, AX ; XOR AX, AX ; Reset du lecteur INT 13h ; MOV FIC_nomb_erreur, 5 ; Initialise le compteur d'erreur INIT_lecture_bpb_dk: MOV AX, 0201h ; Lecture secteur boot MOV DH, 0 ; Tête 0 MOV CH, 0 ; Piste 0 MOV CL, 1 ; Secteur 1 MOV BX, FIC_offs_buffer ; Offset INT 13h ; JNC INIT_recopie_bpb_dk ; Tout s'est bien passé... XOR AX, AX ; Reset du lecteur INT 13h ; DEC FIC_nomb_erreur ; Relance 5 fois CMP FIC_nomb_erreur, 0 ; si erreur JNE INIT_lecture_bpb_dk ; ;--Erreur: lecteur absent ou hors service MOV AX, 6 ; Numéro de l'erreur dans AX STC ; Met CF à 1 MOV DL, 0FFh ; Met FFh comme numéro de lecteur JMP INIT_fin_dk ; Stop INIT_recopie_bpb_dk: MOV SI, FIC_offs_buffer ; Recopie les variables MOV DI, FIC_offs_bpb ; du BPB MOV CX, 15 ; REP MOVSW ; CMP FIC_desc_support, 0F0h ; Est-ce le bon support ? JE INIT_descripteur_dk_ok ; OUI ;--Erreur: type de support non reconnu MOV AX, 10 ; Numéro de l'erreur dans AX STC ; Met CF à 1 MOV DL, 0FFh ; Met FFh comme num‚ro de lecteur JMP INIT_fin_dk ; Stop INIT_descripteur_dk_ok: XOR DX, DX ; Calcule le nombre de cluster XOR BX, BX ; contenu dans le volume MOV AX, FIC_nomb_secVolume ; MOV BL, FIC_nomb_secCluster ; DIV BX ; CMP AX, 4096 ; Vérifie si supporté par la FAT12 JNA INIT_cluster_dk_ok ; OUI ;--Erreur: système de fichier non reconnu MOV AX, 11 ; Numéro de l'erreur dans AX STC ; Met CF à 1 MOV DL, 0FFh ; Met FFh comme numéro de lecteur JMP INIT_fin_dk ; Stop INIT_cluster_dk_ok: CMP FIC_nomb_reserves, 1 ; Vérifi si il n'y a pas plus d'un JE INIT_nomb_reserves_ok ; secteur réservé ;--Erreur: Impossible de lire correctement ce support MOV AX, 20 ; Numéro de l'erreur dans AX STC ; Met CF à 1 MOV DL, 0FFh ; Met FFh comme numéro de lecteur JMP INIT_fin_dk ; Stop INIT_nomb_reserves_ok: MOV FIC_nomb_erreur, 5 ; Initialise le compteur d'erreur INIT_charge_fat: MOV AX, 0209h ; On lit les secteurs de la FAT MOV DL, FIC_lect_courant ; MOV DH, 0 ; Face 0 MOV CH, 0 ; Piste 0 MOV CL, 2 ; Piste 2 MOV BX, FIC_offs_fat ; Offset INT 13h ; JNC INIT_charge_fat_ok ; Tout s'est bien pass‚... MOV AH, 0 ; Reset lecteur MOV DL, FIC_lect_courant ; de disquette INT 13h ; DEC FIC_nomb_erreur ; Relance 5 fois CMP FIC_nomb_erreur, 0 ; si erreur JNE INIT_charge_fat ; ;--Erreur: problŠme de lecture sur le lecteur courant MOV AX, 14 ; Num‚ro de l'erreur dans AX STC ; Met CF … 1 MOV DL, 0FFh ; Met FFh comme num‚ro de lecteur JMP CHAR_fin ; Stop INIT_charge_fat_ok: CLC ; Met CF à 0 XOR AX, AX ; AX = 0 car pas d'erreur MOV FIC_lect_courant, DL ; Change le lecteur courant INIT_fin_dk: POP ES ; Récupère les registres POP DS ; POP DI ; POP SI ; POP DX ; POP CX ; POP BX ; RET FIC_init_lecteurDK ENDP ;--- FIC_conv_nom PROC ;--CONVerti_NOM (FICHIER) ; Converti le nom d'un fichier pour recherche FAT et la place dans FIC_name_courant ; Entrée(s): SI: offset nom du fichier ; Sortie(s): SI: offset nom du fichier converti stock‚ dans FIC_name_courant ; Utilise: rien ; Préparation pour les interruptions PUSH AX PUSH CX PUSH DX PUSH DI PUSH ES MOV AX, DS MOV ES, AX MOV AL, 32 MOV DX, OFFSET FIC_name_courant MOV DI, DX MOV CX, 11 CLD REP STOSB MOV CX, 1 MOV DI, DX CONV_nom: LODSB CMP AL, 0 JE CONV_nom_ok CMP AL, '.' JE CONV_fin_nom STOSB CMP CL, 9 JE CONV_nom_ok INC CL JMP CONV_nom CONV_fin_nom: MOV DI, DX ADD DI, 8 MOV CX, 1 CONV_extension: LODSB CMP AL, 0 JE CONV_nom_ok STOSB CMP CL, 3 JE CONV_nom_ok INC CL JMP CONV_extension CONV_nom_ok: MOV SI, DI POP ES POP DI POP DX POP CX POP AX RET FIC_conv_nom ENDP ;--- FIC_rech_nom PROC ; Recherche un nom de fichier et fournit son 1er cluster ; Entr‚e(s): FIC_name_courant doit contenir le fichier recherch‚ ; Sortie(s): CF = 1 si erreur avec AX num‚ro erreur, AX: 1er cluster si OK ; Utilise: rien PUSH BX ; Sauve les registres utilis‚s PUSH CX ; PUSH DX ; PUSH SI ; PUSH DS ; PUSH DI ; PUSH ES ; MOV AX, CS ; CS = DS = ES MOV DS, AX ; MOV ES, AX ; MOV FIC_nume_secteur, 0 ; Num‚ro de secteur = 0 MOV FIC_sect_racine, 1 ; Secteur = 1 MOV FIC_face_racine, 1 ; Face = 1 MOV FIC_pist_racine, 0 ; Piste = 0 RECH_lecture_repertoire: INC FIC_nume_secteur ; Incr‚mente le nombre de secteur lus CMP FIC_nume_secteur, 34 ; Nbre secteur < 34 JB RECH_analyse_secteur ; OUI JMP RECH_fichier_pas_trouve ; NON Pas trouv‚ RECH_analyse_secteur: MOV FIC_nume_entree, 0FFh ; R‚initialise le compteur d'entr,e INC FIC_sect_racine ; Incr‚mente et v‚rifie si le num‚ro MOV AX, FIC_nomb_secPiste ; de secteur ne d‚passe pas le nombre CMP FIC_sect_racine, AL ; max de secteur par piste JNA RECH_lecture_secteur ; NON MOV FIC_sect_racine, 1 ; OUI XOR FIC_face_racine, 1 ; R‚initialise num‚ro secteur, change INC FIC_pist_racine ; la face et incr‚mente la piste MOV FIC_nomb_erreur, 5 ; R‚initialise le compteur d'erreur RECH_lecture_secteur: MOV AH, 02h ; Lecture entr‚es racine MOV DL, FIC_lect_courant ; Lecteur courant MOV DH, FIC_face_racine ; Face courante MOV CH, FIC_pist_racine ; Piste courante MOV CL, FIC_sect_racine ; Secteur courant MOV AL, 1 ; 1 seul secteur MOV BX, FIC_offs_buffer ; Offset INT 13h ; JNC RECH_analyse ; Tout s'est bien pass‚... MOV AH, 0 ; Reset lecteur MOV DL, FIC_lect_courant ; de disquette INT 13h ; DEC FIC_nomb_erreur ; Relance 5 fois CMP FIC_nomb_erreur, 0 ; si erreur JNE RECH_lecture_secteur ; ;--Erreur: problŠme de lecture sur le lecteur courant MOV AX, 14 ; Num‚ro de l'erreur dans AX STC ; Met CF … 1 JMP RECH_fin ; Stop RECH_analyse: INC FIC_nume_entree ; V‚rifie si le nombre d'entr‚es CMP FIC_nume_entree, 16 ; dans un secteur n'est pas d‚pass‚ JE RECH_lecture_repertoire MOV AL, 32 ; D‚cale l'offset pour passer … MUL FIC_nume_entree ; l'entr‚e suivante dans le secteur MOV SI, FIC_offs_buffer ; ADD SI, AX ; RECH_analyse_repertoire: MOV DI, OFFSET FIC_offs_entrees ; Recopie les entr‚es du MOV CX, 16 ; r‚pertoire racine REP MOVSW ; MOV SI, OFFSET FIC_name_entree ; Charge le premier octet LODSB ; CMP AL, 0 ; Test s'il y a encore une entr‚e JNE RECH_analyse_supprime ; OUI JMP RECH_fichier_pas_trouve ; NON RECH_analyse_supprime: CMP AL, 0E5H ; Test si c'est un fichier supprim‚ JE RECH_analyse ; OUI MOV AL, FIC_attr_entree ; Test si le fichier CMP AL, 0FH ; est un nom long JE RECH_analyse ; OUI MOV SI, OFFSET FIC_name_courant ; Vérifie si c'est le MOV DI, OFFSET FIC_name_entree ; fichier recherch‚ MOV CX, 11 ; REP CMPSB ; JNE RECH_analyse ; NON JMP RECH_fichier_trouve ; OUI Lecture... RECH_fichier_pas_trouve: ;--Erreur: fichier non trouvé MOV AX, 15 ; Num‚ro de l'erreur dans AX STC ; Met CF … 1 JMP RECH_fin ; Stop RECH_fichier_trouve: CLC ; Met CF … 0 MOV AX, FIC_prem_cluster ; Premier cluster dans AX RECH_fin: POP ES ; Restaure les registres utilis‚ POP DI ; POP DS ; POP SI ; POP DX ; POP CX ; POP BX ; RET FIC_rech_nom ENDP ;--- FIC_char_donnees PROC ; Charge les donn‚es d'un fichier … une adresse m‚moire ; Entr‚e(s): AX: 1er cluster du fichier, ES:DI: adresse du code en m‚moire ; Sortie(s): CF = 1 si erreur avec AX num‚ro de l'erreur, AX: 0 si OK ; Utilise: rien PUSH BX PUSH CX PUSH DX PUSH SI PUSH DS PUSH DI PUSH ES ; MOV PGM_segm_memoire, ES ; Initialise les variables ; MOV PGM_offs_memoire, DI ; de chargement du programme MOV FIC_clus_courant, AX ; 1er cluster = cluster courant MOV AX, CS ; CS = DS = ES MOV DS, AX ; MOV ES, AX ; CHAR_analyse_fat: MOV AX, FIC_clus_courant ; AX contient le numéro de cluster MOV BX, 3 ; Multipli par 3 puis divise par 2 MUL BX ; MOV BX, 2 ; Ce qui revient … multiplier par 3/2 DIV BX ; MOV SI, FIC_offs_fat ; Pointe SI sur la partie de la FAT … lire ADD SI, AX ; Ajoute le r‚sultat … SI LODSW ; Charge le prochain cluster CMP AX, FF8h ; Est-ce terminé ? JB CHAR_non_termine ; NON JMP CHAR_fin_chargement CHAR_non_termine: CMP DX, 0 ; Test si c'est un nombre entier JE CHAR_cluster_entier ; SHR AX, 4 ; NON, décale de 4 bits vers la droite CHAR_cluster_entier: AND AX, 0FFFh ; On fait un ET logique MOV FIC_clus_suivant, AX ; Initialise le cluster suivant CHAR_lecture_donnees: MOV CX, FIC_nomb_reserves ; Calcule la distance du premier secteur MOV AH, 0 ; du volume: Nbre de secteurs reserv‚s + MOV AL, FIC_nomb_fat ; (nbre de FATs * Nbre de secteurs par FAT) MOV BX, FIC_nomb_secFAT ; MUL BL ; ADD CX, AX ; MOV AX, FIC_nomb_entrees ; On multiplie le nombre d'entr‚es possible MOV BX, 32 ; par 32 octets que l'on divise ensuite MUL BX ; par 512 ce qui donne le nombre de MOV BX, 512 ; secteurs occup‚s par les entr‚es de XOR DX, DX ; r‚pertoire DIV BX ; ADD CX, AX ; Additionne le tout au r‚sutat calcul‚ plus haut MOV AX, FIC_clus_courant ; D‚cremente le cluster courant de 2 SUB AX, 2 ; et additionne le r‚sultat ADD CX, AX ; MOV AX, FIC_nomb_secPiste ; Multiplie le nombre de secteur par piste MOV BX, FIC_nomb_tete ; par le nombre de tˆte MUL BX ; MOV BX, AX ; Divise le r‚sultat du calcul pr‚c‚dent MOV AX, CX ; par le calcul trouv‚ ici XOR DX, DX ; DIV BX ; Ce qui donne le nombre de piste MOV FIC_pist_donnees, AL ; et le stocke dans la variable MOV AX, DX ; On divise le reste par le nombre MOV BX, FIC_nomb_secPiste ; de secteur par piste XOR DX, DX ; DIV BX ; Ce qui donne le num‚ro de t‚te et le MOV FIC_face_donnees, AL ; stocke dans la variable INC DX ; le reste donne le num‚ro de secteur MOV FIC_sect_donnees, DL ; et le stocke dans la variable MOV FIC_nomb_erreur, 5 ; R‚initialise le compteur d'erreur MOV AX, CS ; ES = CS pour FIC_offs_buffer MOV ES, AX ; CHAR_lecture_sect_donnees: MOV AX, 0201h ; Pr‚pare l'interruption et lance MOV DL, FIC_lect_courant ; la lecture du secteur MOV DH, FIC_face_donnees ; MOV CL, FIC_sect_donnees ; MOV CH, FIC_pist_donnees ; MOV BX, FIC_offs_buffer ; INT 13h ; JNC CHAR_verif_taille ; Tout s'est bien pass‚... MOV AH, 0 ; Reset lecteur MOV DL, FIC_lect_courant ; de disquette INT 13h ; DEC FIC_nomb_erreur ; Relance 5 fois CMP FIC_nomb_erreur, 0 ; si erreur JNE CHAR_lecture_sect_donnees ; ;--Erreur: problŠme de lecture sur le lecteur courant MOV AX, 14 ; Num‚ro de l'erreur dans AX STC ; Met CF … 1 JMP CHAR_fin ; Stop CHAR_verif_taille: CMP FIC_tail_haute, 0 ; Est-ce un fichier de plus de 65536 octets JNE CHAR_charge_encore ; OUI CMP FIC_tail_basse, 512 ; Est-ce un fichier de moins de 512 octets JA CHAR_charge_encore ; NON JMP CHAR_fin_chargement ; OUI CHAR_charge_encore: ; MOV ES, PGM_segm_memoire ; Recopie les donn‚es du buffer au ; MOV DI, PGM_offs_memoire ; segment de programme ; MOV SI, FIC_offs_buffer ; ; MOV CX, 256 ; ; REP MOVSW ; ; ADD PGM_offs_memoire, 512 ; Incr‚mente le pointeur de donn‚es XOR BX, BX ; Récupère la position du curseur MOV AH, 3 ; (Ceci sert pour le débuggage) INT 10h ; MOV AX, 1301h ; Affiche le contenu du buffer MOV BL, 0Eh ; (Ceci sert pour le débuggage) MOV CX, 512 ; MOV BP, FIC_offs_buffer ; INT 10h ; MOV AX, FIC_clus_suivant ; Fait passer le cluster suivant MOV FIC_clus_courant, AX ; en cluster courant CMP FIC_tail_basse, 512 ; FIC_tail_basse >= 512 ? JAE CHAR_charge_suite ; OUI DEC FIC_tail_haute ; 65536 octets de moins ; ADD PGM_segm_memoire, 1000h ; Change de segment ; MOV PGM_offs_memoire, 0000h ; R‚initialise l'offset CHAR_charge_suite: SUB FIC_tail_basse, 512 ; 512 octets de moins JMP CHAR_analyse_fat ; On repart CHAR_fin_chargement: ; MOV ES, PGM_segm_memoire ; Recopie les données du buffer au ; MOV DI, PGM_offs_memoire ; segment de programme ; MOV SI, FIC_offs_buffer ; ; MOV CX, FIC_tail_basse ; ; REP MOVSB ; XOR BX, BX ; Récupère la position du curseur MOV AH, 3 ; (Ceci sert pour le débuggage) INT 10h ; MOV AX, 1301h ; Affiche le contenu du buffer MOV BL, 0Eh ; (Ceci sert pour le débuggage) MOV CX, FIC_tail_basse ; MOV BP, FIC_offs_buffer ; INT 10h ; CLC ; Tout est OK, CF = 0 MOV AX, 0 ; et AX = 0 CHAR_fin: POP ES ; On r‚cupŠre les registres utilis‚s POP DI ; ; MOV PGM_segm_memoire, ES ; Replace le pointeur au d‚but du ; MOV PGM_offs_memoire, DI ; code en m‚moire POP DS ; POP SI ; POP DX ; POP CX ; POP BX ; RET FIC_charg_donnees ENDP ;--- SYS_conv_chaine PROC ;--CONVertion_CHAINE (SYSTEME) ; Converti un nombre en chaŒne ; Entr‚e(s): AX: nombre, SI: offset chaine ; Sortie(s): SI: nombre en ASCII ; Utilise: rien PUSH AX PUSH BX PUSH CX PUSH DX PUSH SI MOV BX, 10 MOV CX, 0 CONV_decompose: MOV DX, 0 DIV BX PUSH DX INC CX CMP AX, 0 JNE CONV_decompose CONV_recompose_ascii: POP AX ADD AX, 48 MOV DS:[SI], AX DEC CX INC SI CMP CX, 0 JNE CONV_recompose_ascii INC SI MOV BYTE PTR DS:[SI], 0 POP SI POP DX POP CX POP BX POP AX RET SYS_conv_chaine ENDP ;----------------------------------------------------------------------------- erreur: ;--Erreur--------------------------------------------------------------------- MOV SI, OFFSET MES_text_erreur CALL affiche MOV SI, OFFSET MES_buff_nombre CALL SYS_conv_chaine CALL affiche INT 20h ;----------------------------------------------------------------------------- debut: ;--Code de test--------------------------------------------------------------- MOV FIC_offs_fat, OFFSET offset_fat MOV FIC_offs_buffer, OFFSET offset_buffer MOV SI, OFFSET MES_init_lecteur CALL affiche MOV DL, 0 CALL FIC_init_lecteurDK ; Initialise le lecteur de disquette JC erreur ; Erreur ? JMP recherche ; Va à la recherche de la ligne de commande recherche: MOV SI, OFFSET MES_rech_fichier CALL affiche MOV FIC_lect_courant, 0 MOV SI, OFFSET FIC_char_demarrage ; Nom du programme à chercher CALL FIC_conv_nom ; Conversion format FAT CALL FIC_rech_nom ; Recherche le fichier JNC charge ; Erreur ? JMP erreur ; Indique l'erreur charge: MOV SI, OFFSET MES_char_fichier CALL affiche CALL FIC_char_donnees ; Charge le programme JNC ok ; Erreur ? JMP erreur ok: INT 20h ; Finit ;----------------------------------------------------------------------------- T_FAT ENDS END