;------------------ directives d'assemblage pour programme .EXE ---------------- projet segment .model small .stack 200 ;ajouter la pile pour programme.EXE org 100h ;assemblage programme .EXE assume cs:projet ;------------------------------------------------------------------------------- ;------------------- sauve les registres neutralise ctrl b --------------------- start: pushf push dx push ds push bx push cx ;sauve les registres de travail push ax push es ;------------------------------------------------------------------------------- ;---------------------------- adresse m‚moire ---------------------------------- id20 dw ? ;sauve l'adresse de l'int ctrl break (1bh) id21 dw ? ;------------------------------------------------------------------------------- ;--------------------- neutralise l'action du ctrl break ----------------------- mov ax,351bh ;adresse de l'int 1bh int 21h mov [id20],es ;sauve le segment + l'offset de l'int 1bh mov [id21],bx jmp suite1 ctrlb: iret suite1: mov ah,25h mov al,1bh push cs ;supprime l'action de ctrl break (int 1bh) pop ds mov dx,offset ctrlb int 21h ;------------------------------------------------------------------------------- ;=================================== DEBUT ===================================== jmp debut ;début du programme ;------------------------------------------------------------------------------- ;------------------------------- adresses mémoire ------------------------------ id1 db 41 DUP (?) ;emplacement réservé pour le nom du fichier id2 db "...Copyright 1992 JML$" id3 dw ? ;contient le handle (nø) du fichier id46 db " ÉÍÍÍÍ ÉÍÍÍÍ$" id41 db " º ºÍÍ$" id4 db "ù º r‚ation d'un º ichier ù$" id45 db " ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ$" id44 db "ÉÍÍÍÍÍÍÍÍ»$" id42 db "º CF.exe º$" id43 db "ÈÍÍÍÍÍÍÍͼ$" id5 dw ? ;contient bx (offset id1 fichier ou id8 écriture) id51 db ? ;contient le nombre de caractère id52 db 0 ;indicateur de retour id53 db 0 ;indicateur de sauvegarde id54 db 0 ;indicateur touche [F10] id55 db 0 ;indicateur de remontée id56 db 0 ;indicateur d'effacement touche [back space] id57 db 0 ;indicateur de retour touche [F10] id6 db "FICHIER = Unité\Chemin\Nom.ext ÍÍͳ$" id62 db "ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿$" id63 db "³$" id61 db "ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ$" id64 db " $" id7 db " $" ;caractère réservé à l'effacement [back space] id71 dw 2020h id72 dw 0a0dh id8 db 80 dup (?) ;emplacement réservé à l'écriture d'une ligne id9 db"[F2]=EffaceL [F5]=Quitte [F10]=Sauve [Ù]=Valide [-]=EffaceC [" db"]=Déplace$" id91 db " ---- Suite ---- $" id10 db ? ;contient dl (nøcolonne) id11 db ? ;contient dh (nøligne) id12 db ? ;contient dl (nøcolonne effacement d'une ligne) id13 db 0 ;contient l'ancien nø de ligne id14 db 0 ;contient l'ancienne colonne id15 db 0 ;------------------------------------------------------------------------------- ;----------------- emplacement mémoire des lignes d'écriture ------------------- ligne1 db 81 dup (?) ;ligne d'écriture nø 1 col1 db ? ;contient la colonne de la ligne lig1 db ? ; nbr1 db 0 ;contient le nombre de caractères à écrire ligne2 db 81 dup (?) col2 db ? lig2 db ? nbr2 db 0 ligne3 db 81 dup (?) col3 db ? lig3 db ? nbr3 db 0 ligne4 db 81 dup (?) col4 db ? lig4 db ? nbr4 db 0 ligne5 db 81 dup (?) col5 db ? lig5 db ? nbr5 db 0 ligne6 db 81 dup (?) col6 db ? lig6 db ? nbr6 db 0 ligne7 db 81 dup (?) col7 db ? lig7 db ? nbr7 db 0 ligne8 db 81 dup (?) col8 db ? lig8 db ? nbr8 db 0 ligne9 db 81 dup (?) col9 db ? lig9 db ? nbr9 db 0 ligne10 db 81 dup (?) col10 db ? lig10 db ? nbr10 db 0 ligne11 db 81 dup (?) col11 db ? lig11 db ? nbr11 db 0 ligne12 db 81 dup (?) col12 db ? lig12 db ? nbr12 db 0 ligne13 db 81 dup (?) col13 db ? lig13 db ? nbr13 db 0 ligne14 db 81 dup (?) col14 db ? lig14 db ? nbr14 db 0 ligne15 db 81 dup (?) col15 db ? lig15 db ? nbr15 db 0 ligne16 db 81 dup (?) col16 db ? lig16 db ? nbr16 db 0 ligne17 db 81 dup (?) col17 db ? lig17 db ? nbr17 db 0 ligne18 db 81 dup (?) col18 db ? lig18 db ? nbr18 db 0 ligne19 db 81 dup (?) col19 db ? lig19 db ? nbr19 db 0 ligne20 db 81 dup (?) col20 db ? lig20 db ? nbr20 db 0 ligne21 db 81 dup (?) col21 db ? lig21 db ? nbr21 db 0 ligne22 db 81 dup (?) col22 db ? lig22 db ? nbr22 db 0 ligne23 db 81 dup (?) col23 db ? lig23 db ? nbr23 db 0 ligne24 db 81 dup (?) col24 db ? ;ligne d'écriture nø 24 lig24 db ? nbr24 db 0 ligne25 db 81 dup (?) col25 db ? lig25 db ? nbr25 db 0 ;------------------------------------------------------------------------------- ;----------------------- début gestion curseur et affichage -------------------- debut: mov ah,0h mov al,02h ;mode vidéo 80 colonnes 25 lignes CGA int 10h mov ah,6 mov al,25 mov bh,7 mov ch,0 ;décalage de 25 lignes (efface l'écran) mov cl,0 mov dh,25 mov dl,79 int 10h mov ah,01h mov ch,6 ;modifie la forme du curseur = (_) mov cl,7 int 10h mov dh,2 ;ligne 2 mov dl,58 ;colonne 58 mov ah,02h mov bh,0 int 10h mov ah,09h mov dx,offset id2 ;affiche le texte id2 int 21h mov dh,1 ;ligne nø1 mov dl,1 ;colonne nø1 mov ah,02h mov bh,0 ;place le curseur ligne 1 colonne 1 int 10h mov ah,09h mov dx,offset id44 ;affiche le texte id44 int 21h mov dh,2 ;ligne nø2 mov dl,1 ;colonne nø1 mov ah,02h mov bh,0 ;place le curseur ligne 2 colonne 1 int 10h mov ah,09h mov dx,offset id42 ;affiche le texte id42 (EDP) int 21H mov dh,3 ;ligne nø3 mov dl,1 ;colonne nø1 mov ah,02h mov bh,0 ;place le curseur ligne 3 colonne 1 int 10h mov ah,09h mov dx,offset id43 ;affiche le texte id43 int 21h mov dh,8 mov dl,18 mov ah,02h mov bh,0 int 10h mov ah,09h mov dx,offset id46 int 21h mov dh,11 ;ligne nø11 mov dl,18 ;colonne nø37 mov ah,02h mov bh,0 ;place le curseur ligne 2 colonne 37 int 10h mov ah,09h mov dx,offset id45 ;affiche le texte id45 int 21h mov dh,10 ;ligne nø10 mov dl,18 ;colonne nø26 mov ah,02h mov bh,0 ;place le curseur ligne 10 colonne 26 int 10h mov ah,09h mov dx,offset id4 ;affiche le texte id4 (CREATION de FICHIER...) int 21h mov dh,9 ;ligne nø15 mov dl,18 ;colone nø40 mov ah,02h mov bh,0 ;place le curseur ligne 15 colonne 40 int 10h mov ah,09h mov dx,offset id41 ;affiche le texte id41 int 21h mov dh,21 ;ligne nø 21 mov dl,36 ;colonne nø36 mov ah,02h mov bh,0 ;place le curseur ligne 21 colonne 36 int 10h mov ah,09h mov dx,offset id61 ;affiche le texte id61 int 21h mov dh,19 ;ligne nø19 mov dl,36 ;colonne nø36 mov ah,02h mov bh,0 ;place le curseur ligne 19 colonne 36 int 10h mov ah,09h mov dx,offset id62 ;affiche le texte id62 int 21h mov dh,20 ;ligne nø20 mov dl,79 ;colonne nø79 mov ah,02h mov bh,0 ;place le curseur ligne 20 colonne 79 int 10h mov ah,09h mov dx,offset id63 ;affiche le texte id63 int 21h mov dh,21 ;ligne nø21 mov dl,1 ;colonne nø1 mov ah,02h mov bh,0 ;place le curseur ligne 21 colonne 1 int 10h mov ah,09h mov dx,offset id64 ;affiche le texte id64 int 21h mov dh,20 ;ligne nø20 mov dl,1 ;colonne nø1 mov ah,02h mov bh,0 ;place le curseur ligne 20 colonne 1 int 10h mov ah,09h mov dx,offset id6 ;affiche le texte id6 (FICHIER = [ unité....]) int 21h mov ch,0 mov bh,0 mov bx,offset id1 ;met l'adresse du nom du fichier dans bx ;------------------------------------------------------------------------------- ;------------------------- entrée des données du fichier ----------------------- entreF: mov ch,[id10] ;récupère la position du pointeur d'écriture entreC: mov ah,0 int 16h ;entrée d'un caractère au clavier mov [bx],al ;place le code ascii du caractère dans id1 cmp ah,3fh ;compare le scan code avec la touche [F5] jnz suite2 ;si vrai fin jmp fermeF suite2: cmp ah,01h ;compare le scan code avec la touche [ESC] jnz suite3 ;si vrai entrée d'un caractére jmp entreF suite3: cmp ah,1ch ;compare le scan code de la touche avec [enter] jnz suite4 ;si comparaison vraie crée le fichier jmp creeF suite4: cmp ah,0eh ;compare le scan code avec [back space] jnz suite5a ;si comparaison vraie efface le caractére jmp effC suite5a:cmp ah,0fh ;compare le scan code avec la touche TAB jnz suite5 ;si comparaison vraie entrée d'un caractère jmp entreF suite5: cmp ch,41 ;compare le nombre de caractères entré jnz suite6 ;si vrai attente de la touche [enter] jmp entreC suite6: mov [id5],bx ;sauve bx à l'adresse id5 add bx,+1 ;additionne bx avec +1 mov dl,al mov ah,02h ;affiche le caractère entré au clavier int 21h add ch,+1 ;additionne ch (nombre de caractères entré + 1) mov [id10],ch ;sauve la position du pointeur d'écriture mov ah,01h mov ch,6 mov cl,7 ;modifie le curseur = (_) int 10h jmp entreF ;entrée d'un nouveau caractère ;------------------------------------------------------------------------------- ;-------------------------- effacement d'un caractère -------------------------- effC: cmp ch,0 ;compare le nombre de caractères entré avec 0 jnz ret1 ;aucun caractère entré au clavier jmp entreF ret1: cmp [id57],1 ;compare indicateur de retour jnz suite7 cmp ch,1 ;si retour compare le nombre de caractère avec 1 jnz suite7 jmp entreF suite7: cmp bl,18 ;compare la colonne avec 18 jnz suite8 ;si vrai limite d'effacement des caractères jmp entreF ;entrée d'un caractère suite8: dec bx ;décrémente l'adresse id1+déplacement mov [id5],bx ;sauve l'adresse id1+déplacement mov ah,03h mov bh,0 ;calcule la position du curseur int 10h dec dl ;décrémente les colonnes d'affichage mov ah,02h mov bh,0 ;positionne le curseur en colonne-1 int 10h mov ah,09h mov dx,offset id7 ;affiche un espace pour effacement colonne-1 int 21h mov ah,03h mov bh,0 ;calcule la position du curseur(dx a été utilisé int 10h ;lors de l'affichage pour effacement) dec dl mov ah,02h ;repositionne le curseur à colonne-1 mov bh,0 int 10h mov ch,[id10] dec ch ;repositionne le pointeur d'écriture mov [id10],ch mov bx,[id5] ;récupère l'adresse id1+dépacement mov ah,01h mov ch,1 mov cl,7 ;modifie le curseur = (Û) int 10h jmp entreF ;entrée d'un nouveau caractère ;------------------------------------------------------------------------------- ;---------------------- création du fichier sur le disque ---------------------- creeF: mov al,00h ;met 0 dans al mov [bx],al ;écrit 0 à l'adresse id1+déplacement ;(pour l'écriture sur disque) creeFD: mov dx,offset id1 ;met (unité+chemin+nom du fichier) dans dx mov cx,0 mov ah,3ch ;crée le fichier sur disque int 21h ;------------------------------------------------------------------------------- ;---------------------- ouverture du fichier sur le disque --------------------- mov dx,offset id1 ;met (unité\chemin\nom du fichier) dans dx mov ah,3dh mov al,42h ;ouvre le fichier sur le disque int 21h mov id3,ax ;sauve le handle du fichier dans id3 ;------------------------------------------------------------------------------- ;---------------------- efface l'écran prépare l'écriture ---------------------- mov ah,6 mov al,25 mov bh,7 mov ch,0 ;décalage de 25 lignes (efface l'écran) mov cl,0 mov dh,25 mov dl,79 int 10h mov dh,0 ;ligne 1 mov dl,0 ;colonne 0 mov ah,02h mov bh,0 ;place le curseur ligne 1 colonne 1 int 10h mov ah,09h mov dx,offset id9 ;affiche le texte id9 (Touches utilisées) int 21h mov ch,0 mov cl,0 ;initialise les regitres de travail mov bl,0 mov ah,03h mov bh,0 ;calcule la position du curseur int 10h mov dh,1 ;------------------------------------------------------------------------------- ;-------------------------- écriture dans le fichier -------------------------- ecrit1C:mov dl,0 ;écriture du premier caractère mov [id51],dl ;met à 0 le nombre de caractère mov [id55],0 ;indicateur de remonter mov [id10],dl ;sauve la colonne mov [id11],dh ;sauve la ligne ;------------------------------------------------------------------------------- ;------------------------ pointe la ligne à écrire ----------------------------- ecritFL:cmp dh,1 ;test le nø de la ligne jnz suite50 ;saut au test suivant mov ax,0 ;initialise ax mov al,[id10] ;met la colonne dans ax déplacement du pointeur mov bx,offset ligne1 ;met l'adresse de la ligne d'écriture dans bx add bx,ax ;ajoute le déplacement au pointeur jmp ecritC ;pointeur nø de ligne suite50:cmp dh,2 jnz suite51 mov ax,0 mov al,[id10] mov bx,offset ligne2 ;pointeur nø de ligne (adressage basé ds:bx) add bx,ax jmp ecritC suite51:cmp dh,3 jnz suite52 mov ax,0 mov al,[id10] mov bx,offset ligne3 add bx,ax jmp ecritC suite52:cmp dh,4 jnz suite53 mov ax,0 mov al,[id10] mov bx,offset ligne4 add bx,ax jmp ecritC suite53:cmp dh,5 jnz suite54 mov ax,0 mov al,[id10] mov bx,offset ligne5 add bx,ax jmp ecritC suite54:cmp dh,6 jnz suite55 mov ax,0 mov al,[id10] mov bx,offset ligne6 add bx,ax jmp ecritC suite55:cmp dh,7 jnz suite56 mov ax,0 mov al,[id10] mov bx,offset ligne7 add bx,ax jmp ecritC suite56:cmp dh,8 jnz suite57 mov ax,0 mov al,[id10] mov bx,offset ligne8 add bx,ax jmp ecritC suite57:cmp dh,9 jnz suite58 mov ax,0 mov al,[id10] mov bx,offset ligne9 add bx,ax jmp ecritC suite58:cmp dh,10 jnz suite59 mov ax,0 mov al,[id10] mov bx,offset ligne10 add bx,ax jmp ecritC suite59:cmp dh,11 jnz suite60 mov ax,0 mov al,[id10] mov bx,offset ligne11 add bx,ax jmp ecritC suite60:cmp dh,12 jnz suite61 mov ax,0 mov al,[id10] mov bx,offset ligne12 add bx,ax jmp ecritC suite61:cmp dh,13 jnz suite62 mov ax,0 mov al,[id10] mov bx,offset ligne13 add bx,ax jmp ecritC suite62:cmp dh,14 jnz suite63 mov ax,0 mov al,[id10] mov bx,offset ligne14 add bx,ax jmp ecritC suite63:cmp dh,15 jnz suite64 mov ax,0 mov al,[id10] mov bx,offset ligne15 add bx,ax jmp ecritC suite64:cmp dh,16 jnz suite65 mov ax,0 mov al,[id10] mov bx,offset ligne16 add bx,ax jmp ecritC suite65:cmp dh,17 jnz suite66 mov ax,0 mov al,[id10] mov bx,offset ligne17 add bx,ax jmp ecritC suite66:cmp dh,18 jnz suite67 mov ax,0 mov al,[id10] mov bx,offset ligne18 add bx,ax jmp ecritC suite67:cmp dh,19 jnz suite68 mov ax,0 mov al,[id10] mov bx,offset ligne19 add bx,ax jmp ecritC suite68:cmp dh,20 jnz suite69 mov ax,0 mov al,[id10] mov bx,offset ligne20 add bx,ax jmp ecritC suite69:cmp dh,21 jnz suite70 mov ax,0 mov al,[id10] mov bx,offset ligne21 add bx,ax jmp ecritC suite70:cmp dh,22 jnz suite71 mov ax,0 mov al,[id10] mov bx,offset ligne22 add bx,ax jmp ecritC suite71:cmp dh,23 jnz suite72 mov ax,0 mov al,[id10] mov bx,offset ligne23 add bx,ax jmp ecritC suite72:cmp dh,24 jnz suite73 mov ax,0 mov al,[id10] mov bx,offset ligne24 ;pointe la ligne nø 24 dernière ligne add bx,ax jmp ecritC suite73:cmp dh,25 jnz ecritC mov ax,0 mov al,[id10] mov bx,offset ligne25 add bx,ax jmp ecritC ;------------------------------------------------------------------------------- ;---------------- teste l'écriture des caractères fin de ligne ----------------- ecritC: cmp [id52],1 jnz ecritNB ;retour par flêche ne compte pas les caractères jmp ecrit ;------------------------------------------------------------------------------- ;--- initialise les compteurs de ligne avec le nombre de caractères à écrire --- ecritNB:cmp dh,1 ;teste la ligne d'écriture jnz suit50 ;teste suivant mov al,dl ;met la colonne dans al add al,2 ;ajoute les caractères fin de ligne (CR et LF) mov [nbr1],al ;sauve le nombre de caractères écrit dans ligne1 jmp ecrit suit50: cmp dh,2 jnz suit51 cmp [id52],1 jnz suit75 jmp ecrit suit75: mov al,dl add al,2 mov [nbr2],al jmp ecrit suit51: cmp dh,3 jnz suit52 cmp [id52],1 jnz suit76 jmp ecrit suit76: mov al,dl add al,2 mov [nbr3],al jmp ecrit suit52: cmp dh,4 jnz suit53 cmp [id52],1 jnz suit77 jmp ecrit suit77: mov al,dl add al,2 mov [nbr4],al jmp ecrit suit53: cmp dh,5 jnz suit54 cmp [id52],1 jnz suit78 jmp ecrit suit78: mov al,dl add al,2 mov [nbr5],al jmp ecrit suit54: cmp dh,6 jnz suit55 cmp [id52],1 jnz suit79 jmp ecrit suit79: mov al,dl add al,2 mov [nbr6],al jmp ecrit suit55: cmp dh,7 jnz suit56 cmp [id52],1 jnz suit80 jmp ecrit suit80: mov al,dl add al,2 mov [nbr7],al jmp ecrit suit56: cmp dh,8 jnz suit57 cmp [id52],1 jnz suit81 jmp ecrit suit81: mov al,dl add al,2 mov [nbr8],al jmp ecrit suit57: cmp dh,9 jnz suit58 cmp [id52],1 jnz suit82 jmp ecrit suit82: mov al,dl add al,2 mov [nbr9],al jmp ecrit suit58: cmp dh,10 jnz suit59 cmp [id52],1 jnz suit83 jmp ecrit suit83: mov al,dl add al,2 mov [nbr10],al jmp ecrit suit59: cmp dh,11 jnz suit60 cmp [id52],1 jnz suit84 jmp ecrit suit84: mov al,dl add al,2 mov [nbr11],al jmp ecrit suit60: cmp dh,12 jnz suit61 cmp [id52],1 jnz suit85 jmp ecrit suit85: mov al,dl add al,2 mov [nbr12],al jmp ecrit suit61: cmp dh,13 jnz suit62 cmp [id52],1 jnz suit86 jmp ecrit suit86: mov al,dl add al,2 mov [nbr13],al jmp ecrit suit62: cmp dh,14 jnz suit63 cmp [id52],1 jnz suit87 jmp ecrit suit87: mov al,dl add al,2 mov [nbr14],al jmp ecrit suit63: cmp dh,15 jnz suit64 cmp [id52],1 jnz suit88 jmp ecrit suit88: mov al,dl add al,2 mov [nbr15],al jmp ecrit suit64: cmp dh,16 jnz suit65 cmp [id52],1 jnz suit89 jmp ecrit suit89: mov al,dl add al,2 mov [nbr16],al jmp ecrit suit65: cmp dh,17 jnz suit66 cmp [id52],1 jnz suit90 jmp ecrit suit90: mov al,dl add al,2 mov [nbr17],al jmp ecrit suit66: cmp dh,18 jnz suit67 cmp [id52],1 jnz suit91 jmp ecrit suit91: mov al,dl add al,2 mov [nbr18],al jmp ecrit suit67: cmp dh,19 jnz suit68 cmp [id52],1 jnz suit92 jmp ecrit suit92: mov al,dl add al,2 mov [nbr19],al jmp ecrit suit68: cmp dh,20 jnz suit69 cmp [id52],1 jnz suit93 jmp ecrit suit93: mov al,dl add al,2 mov [nbr20],al jmp ecrit suit69: cmp dh,21 jnz suit70 cmp [id52],1 jnz suit94 jmp ecrit suit94: mov al,dl add al,2 mov [nbr21],al jmp ecrit suit70: cmp dh,22 jnz suit71 cmp [id52],1 jnz suit95 jmp ecrit suit95: mov al,dl add al,2 mov [nbr22],al jmp ecrit suit71: cmp dh,23 jnz suit72 cmp [id52],1 jnz suit96 jmp ecrit suit96: mov al,dl add al,2 mov [nbr23],al jmp ecrit suit72: cmp dh,24 jnz suit73 cmp [id52],1 jnz suit97 jmp ecrit suit97: mov al,dl add al,2 mov [nbr24],al jmp ecrit suit73: cmp dh,25 jnz ecrit cmp [id52],1 jnz suit98 jmp ecrit suit98: mov al,dl add al,2 mov [nbr25],al jmp ecrit ;------------------------------------------------------------------------------- ;---------------------- récupère les données d'affichage ----------------------- ecrit: cmp [id56],1 jnz ecriC jmp autreC ecriC: mov dl,[id10] ;récupère la colonne mov dh,[id11] ;récupère la ligne mov [id5],bx ;sauve l'adresse ligne dans id5 pour pouvoir ;effectuer ligne+déplacement (79 caractères max) mov ah,02h mov bh,0 ;positionne le curseur int 10h mov ah,01h mov ch,6 mov cl,7 ;modification du curseur = (_) int 10h autreC: add dl,+1 ;additionne + 1 à la colonne mov [id56],0 mov [id10],dl ;sauve la colonne dans id10 mov bx,[id5] ;récupère l'adresse ligne+déplacement cmp [id52],1 jnz suite45 jmp texte ;------------------------------------------------------------------------------- ;------------ met en mémoire les caractères de séparation de ligne ------------- suite45:mov word ptr [bx],0a0dh;écrit les caractères ascii (CR) et (LF) pour ;écriture sur disque (écriture sur disque en ;série mais affichage à l'écran ligne par ligne) ;------------------------------------------------------------------------------- ;----------------- met en mémoire la colonne de la ligne d'écriture ------------ cmp dh,1 jnz sui1 mov [col1],dl ;met la colonne dans id14 jmp texte sui1: cmp dh,2 jnz sui2 mov [col2],dl jmp texte sui2: cmp dh,3 jnz sui3 mov [col3],dl jmp texte sui3: cmp dh,4 jnz sui4 mov [col4],dl jmp texte sui4: cmp dh,5 jnz sui5 mov [col5],dl jmp texte sui5: cmp dh,6 jnz sui6 mov [col6],dl jmp texte sui6: cmp dh,7 jnz sui7 mov [col7],dl jmp texte sui7: cmp dh,8 jnz sui8 mov [col8],dl jmp texte sui8: cmp dh,9 jnz sui9 mov [col9],dl jmp texte sui9: cmp dh,10 jnz sui10 mov [col10],dl jmp texte sui10: cmp dh,11 jnz sui11 mov [col11],dl jmp texte sui11: cmp dh,12 jnz sui12 mov [col12],dl jmp texte sui12: cmp dh,13 jnz sui13 mov [col13],dl jmp texte sui13: cmp dh,14 jnz sui14 mov [col14],dl jmp texte sui14: cmp dh,15 jnz sui15 mov [col15],dl jmp texte sui15: cmp dh,16 jnz sui16 mov [col16],dl jmp texte sui16: cmp dh,17 jnz sui17 mov [col17],dl jmp texte sui17: cmp dh,18 jnz sui18 mov [col18],dl jmp texte sui18: cmp dh,19 jnz sui19 mov [col19],dl jmp texte sui19: cmp dh,20 jnz sui20 mov [col20],dl jmp texte sui20: cmp dh,21 jnz sui21 mov [col21],dl jmp texte sui21: cmp dh,22 jnz sui22 mov [col22],dl jmp texte sui22: cmp dh,23 jnz sui23 mov [col23],dl jmp texte sui23: cmp dh,24 jnz sui24 mov [col24],dl jmp texte sui24: cmp dh,25 jnz texte mov [col25],dl jmp texte ;------------------------------------------------------------------------------- ;---------------------- entrée des caractères à écrire ------------------------- texte: mov ah,0 int 16h ;entrée d'un caractère au clavier cmp ah,4dh ;compare le scan code (flêche direction droite) jnz suite20 jmp flecheD suite20:cmp ah,4bh ;compare le scan code (flêche direction gauche) jnz suite21 jmp flecheG suite21:cmp ah,48h ;compare le scan code (flêche direction haute) jnz suite22 jmp flecheH suite22:cmp ah,50h ;compare le scan code (flêche direction basse) jnz suite23 jmp flecheB suite23:cmp ah,44h ;compare le scan code avec la touche [F10] jnz suite9 ;si vrai création d'un nouveau fichier mov [id54],1 ;indicateur touche [F10] mov [id57],1 ;indicateur de retour jmp sauveL suite9: cmp ah,1ch ;compare le scan code avec la touche [enter] jnz suite10 ;si vrai met en mémoire et retour ligne suivante jmp memoire suite10:cmp ah,0eh ;compare le scan code avec [back space] jnz suite11 ;si vrai effacement d'un caractère jmp effaC suite11:cmp ah,3ch ;compare le scan code avec la touche [F2] jnz suite12 ;si vrai efface la ligne jmp effLI suite12:cmp ah,3fh ;compare le scan code avec la touche [F5] jnz suite13 ;si vrai ferme le fichier fin du programme jmp sauveL suite13:cmp dl,80 ;compare le nombre de caractère avec 80 jnz suite14 ;si vrai fin de ligne attente de la touche [Ù] jmp texte suite14:mov [bx],al ;met l'ascii du caractère dans ligne+déplacement mov [id5],bx ;sauve ligne+déplacement dans id5 add bx,+1 ;ajoute + 1 au déplacement de ligne(?) ;------------------------------------------------------------------------------- ;------ teste les déplacements afin d'écrire les caractères fin de ligne ------- cmp dh,1 ;teste la ligne jnz su1 cmp dl,[col1] ;compare la colonne avant déplacement par flêche jnz s1 ;et la colonne après déplacement ([col1]=avant) jnb s30 ;si dl>[col1] dépacement de colonne écrit (CR.LF) jmp saut10 ;la colonne est égale teste la ligne s1: jmp saut0 ;la colonne n'est ni égale ni plus grande s30: jmp saut3 su1: cmp dh,2 jnz su2 cmp dl,[col2] jnz s2 jnb s31 jmp saut10 s2: jmp saut0 s31: jmp saut3 su2: cmp dh,3 jnz su3 cmp dl,[col3] jnz s3 jnb s32 jmp saut10 s3: jmp saut0 s32: jmp saut3 su3: cmp dh,4 jnz su4 cmp dl,[col4] jnz s4 jnb s33 jmp saut10 s4: jmp saut0 s33: jmp saut3 su4: cmp dh,5 jnz su5 cmp dl,[col5] jnz s5 jnb s34 jmp saut10 s5: jmp saut0 s34: jmp saut3 su5: cmp dh,6 jnz su6 cmp dl,[col6] jnz s6 jnb s35 jmp saut10 s6: jmp saut0 s35: jmp saut3 su6: cmp dh,7 jnz su7 cmp dl,[col7] jnz s7 jnb s36 jmp saut10 s7: jmp saut0 s36: jmp saut3 su7: cmp dh,8 jnz su8 cmp dl,[col8] jnz s8 jnb s37 jmp saut10 s8: jmp saut0 s37: jmp saut3 su8: cmp dh,9 jnz su9 cmp dl,[col9] jnz s9 jnb s38 jmp saut10 s9: jmp saut0 s38: jmp saut3 su9: cmp dh,10 jnz su10 cmp dl,[col10] jnz s10 jnb s39 jmp saut10 s10: jmp saut0 s39: jmp saut3 su10: cmp dh,11 jnz su11 cmp dl,[col11] jnz s11 jnb s40 jmp saut10 s11: jmp saut0 s40: jmp saut3 su11: cmp dh,12 jnz su12 cmp dl,[col12] jnz s12 jnb s41 jmp saut10 s12: jmp saut0 s41: jmp saut3 su12: cmp dh,13 jnz su13 cmp dl,[col13] jnz s13 jnb s42 jmp saut10 s13: jmp saut0 s42: jmp saut3 su13: cmp dh,14 jnz su14 cmp dl,[col14] jnz s14 jnb s43 jmp saut10 s14: jmp saut0 s43: jmp saut3 su14: cmp dh,15 jnz su15 cmp dl,[col15] jnz s15 jnb s44 jmp saut10 s15: jmp saut0 s44: jmp saut3 su15: cmp dh,16 jnz su16 cmp dl,[col16] jnz s16 jnb s45 jmp saut10 s16: jmp saut0 s45: jmp saut3 su16: cmp dh,17 jnz su17 cmp dl,[col17] jnz s17 jnb s46 jmp saut10 s17: jmp saut0 s46: jmp saut3 su17: cmp dh,18 jnz su18 cmp dl,[col18] jnz s18 jnb s47 jmp saut10 s18: jmp saut0 s47: jmp saut3 su18: cmp dh,19 jnz su19 cmp dl,[col19] jnz s19 jnb s48 jmp saut10 s19: jmp saut0 s48: jmp saut3 su19: cmp dh,20 jnz su20 cmp dl,[col20] jnz s20 jnb s49 jmp saut10 s20: jmp saut0 s49: jmp saut3 su20: cmp dh,21 jnz su21 cmp dl,[col21] jnz s21 jnb s50 jmp saut10 s21: jmp saut0 s50: jmp saut3 su21: cmp dh,22 jnz su22 cmp dl,[col22] jnz s22 jnb s51 jmp saut10 s22: jmp saut0 s51: jmp saut3 su22: cmp dh,23 jnz su23 cmp dl,[col23] jnz s23 jnb s52 jmp saut10 s23: jmp saut0 s52: jmp saut3 su23: cmp dh,24 jnz su24 cmp dl,[col24] jnz s24 jnb s53 jmp saut10 s24: jmp saut0 s53: jmp saut3 su24: cmp dh,25 jnz saut0 cmp dl,[col25] jnz s25 jnb s54 jmp saut10 s25: jmp saut0 s54: jmp saut3 ;------------------------------------------------------------------------------- ;---------- choix d'écriture (oui ou non) des caractères fin de ligne ---------- saut0: cmp [id14],0 jnz saut2 jmp saut10 saut10: cmp dh,[id13] ;compare l'ancienne et la nouvelle ligne jnz saut1 jmp saut3 saut1: cmp [id13],0 ;compare si retour ligne arrière jnz saut2 jmp saut3 saut3: mov [id52],0 saut2: mov dl,al mov ah,02h ;affiche le caractère entré au clavier int 21h mov ah,01h mov ch,6 ;modification du curseur (_) mov cl,7 int 10h mov al,[id51] ;met l'ancienne colonne de la ligne d'écriture add al,1 ;qui n'a pas encore été mise en mémoire mov dl,[id10] ;récupère la colonne cmp dl,al ;compare avant déplacement jnz suite40 cmp [id55],1 ;vérifie s'il y a eu remontée de ligne jnz suite42 ;([id55]=indicateur de remontée de ligne) jmp suite41 ; si remontée de ligne n'écrit pas (CR,LF) suite42:mov [id52],0 ;écrit les caractères fin de ligne suite41:mov [id51],al ;actualise l'ancienne colonne jmp ecritC suite40:jmp ecritC ;entrée d'un nouveau caractère ;------------------------------------------------------------------------------- ;--------------------------- utilisation des flêches --------------------------- flecheD:mov dl,[id10] ;récupère la colonne cmp dl,80 ;teste le coin droit de l'écran jnz suite30 mov [id52],1 ;ne pas écrire les caractères fin de ligne jmp texte ;retour entrée de caractère suite30:mov [id10],dl ;sauve la colonne add bx,1 ;ajoute 1 au pointeur d'écriture jmp ecritC ;le retour ajoute 1 à la colonne et teste CR,LF flecheG:mov dl,[id10] cmp dl,1 ;teste le coin gauche de l'écran jnz suite31 mov [id52],1 ;ne pas écrire les caractères fin de ligne jmp texte ;retour entrée de caractère suite31:sub dl,2 ;retire 2 à la colonne (avant int 16h colonne+1) mov [id10],dl ;sauve la nouvelle colonne sub bx,1 ;retire 1 au pointeur d'écriture mov [id5],bx ;sauve le pointeur d'écriture mov [id52],1 ;ne pas écrire les caractères de fin de ligne jmp ecritC ;retour teste les compteurs et l'écriture CR,LF flecheB:mov dh,[id11] ;récupère la ligne mov [id13],dh ;sauve l'ancienne ligne (indicateur de retour) cmp dh,24 ;compare le nombre de lignes (24=bas de page) jnz suite32 jmp texte ;retour entrée de caractère suite32:mov dl,[id10] sub dl,1 ;retire 1 à la colonne (avant int 16h colonne+1) add dh,1 ;ajoute 1 à la ligne (descend d'une ligne) mov [id10],dl ;sauve la colonne mov [id11],dh ;sauve la ligne mov [id52],1 ;ne pas écrire les caractères de fin de ligne jmp ecrit1C ;; flecheH:mov dh,[id11] ;récupère la ligne mov [id13],dh ;sauve l'ancienne ligne (indicateur de retour) mov [id55],1 ;indicateur de remontée cmp dh,1 ;compare le nombre de lignes (1=haut de page) jnz suite33 jmp texte ;retour entrée de caractère suite33:mov dl,[id10] ;récupère la colonne sub dl,1 ;enlève 1 à la colonne (avant int 16h colonne+1) sub dh,1 ;enlève 1 à la ligne mov [id10],dl ;sauve la colonne mov [id11],dh ;sauve la ligne mov [id52],1 ;positionne l'indicateur ne pas écrire CR et LF jmp ecrit1C ;ecritFL ;retour pointeur nø ligne ;------------------------------------------------------------------------------- ;---------------------------- efface un caractère ------------------------------ effaC: mov ah,01h mov ch,1 mov cl,7 ;modification du curseur (Û) int 10h cmp dl,01 ;compare la colonne avec 1 aucun caractère entré jnz suite15 ;ou tous les caractères sont effacés jmp texte suite15:dec bx ;décrémente id8+déplacement mov [id5],bx ;sauve ligne+déplacement dans id5 mov ax,id72 mov word ptr [bx],ax add bx,2 mov ax,id71 mov word ptr [bx],ax mov ah,03h mov bh,0 ;calcule la position du curseur int 10h dec dl ;décrèmente la colonne mov [id51],dl ;décrèmente le nombre de caractères mov ah,02h mov bh,0 ;positionne le curseur sur le caractère à effacer int 10h mov ah,09h mov dx,offset id7 ;efface le caractère int 21h mov ah,03h mov bh,0 ;calcule la position du curseur int 10h dec dl mov ah,02h ;positionne le curseur sur le caractère effacé mov bh,0 int 10h mov bx,[id5] ;récupère ligne+déplacement mov [id56],1 mov [id52],0 jmp ecritNB ;entrée d'un nouveau caractère ;------------------------------------------------------------------------------- ;----------------------- met la ligne en mémoire ------------------------------- memoire:mov dh,[id11] ;récupère la ligne add dh,1 ;ajoute 1 mov [id11],dh ;ligne suivante mov [id52],1 ;positionne l'indicateur n'écrit pas CR et LF cmp dh,25 jnz suite16 ;teste si fin de page mov[id53],1 jmp sauveL suite16:jmp ecrit1C ;retour entrée d'un nouveau caractère ;------------------------------------------------------------------------------- ;----------------------------- sauve les lignes -------------------------------- sauveL: mov cx,0 mov cl,[nbr1] ;nombre de caractères à écrire mov ah,40h mov bx,id3 ;handle du fichier mov dx,offset ligne1 ;déplacement de la ligne à écrire int 21h ;écriture sur le disque de la ligne1 mov cx,0 mov cl,[nbr2] mov ah,40h mov bx,id3 mov dx,offset ligne2 int 21h mov cx,0 mov cl,[nbr3] mov ah,40h mov bx,id3 mov dx,offset ligne3 int 21h mov cx,0 mov cl,[nbr4] mov ah,40h mov bx,id3 mov dx,offset ligne4 int 21h mov cx,0 mov cl,[nbr5] mov ah,40h mov bx,id3 mov dx,offset ligne5 int 21h mov cx,0 mov cl,[nbr6] mov ah,40h mov bx,id3 mov dx,offset ligne6 int 21h mov cx,0 mov cl,[nbr7] mov ah,40h mov bx,id3 mov dx,offset ligne7 int 21h mov cx,0 mov cl,[nbr8] mov ah,40h mov bx,id3 mov dx,offset ligne8 int 21h mov cx,0 mov cl,[nbr9] mov ah,40h mov bx,id3 mov dx,offset ligne9 int 21h mov cx,0 mov cl,[nbr10] mov ah,40h mov bx,id3 mov dx,offset ligne10 int 21h mov cx,0 mov cl,[nbr11] mov ah,40h mov bx,id3 mov dx,offset ligne11 int 21h mov cx,0 mov cl,[nbr12] mov ah,40h mov bx,id3 mov dx,offset ligne12 int 21h mov cx,0 mov cl,[nbr13] mov ah,40h mov bx,id3 mov dx,offset ligne13 int 21h mov cx,0 mov cl,[nbr14] mov ah,40h mov bx,id3 mov dx,offset ligne14 int 21h mov cx,0 mov cl,[nbr15] mov ah,40h mov bx,id3 mov dx,offset ligne15 int 21h mov cx,0 mov cl,[nbr16] mov ah,40h mov bx,id3 mov dx,offset ligne16 int 21h mov cx,0 mov cl,[nbr17] mov ah,40h mov bx,id3 mov dx,offset ligne17 int 21h mov cx,0 mov cl,[nbr18] mov ah,40h mov bx,id3 mov dx,offset ligne18 int 21h mov cx,0 mov cl,[nbr19] mov ah,40h mov bx,id3 mov dx,offset ligne19 int 21h mov cx,0 mov cl,[nbr20] mov ah,40h mov bx,id3 mov dx,offset ligne20 int 21h mov cx,0 mov cl,[nbr21] mov ah,40h mov bx,id3 mov dx,offset ligne21 int 21h mov cx,0 mov cl,[nbr22] mov ah,40h mov bx,id3 mov dx,offset ligne22 int 21h mov cx,0 mov cl,[nbr23] mov ah,40h mov bx,id3 mov dx,offset ligne23 int 21h mov cx,0 mov cl,[nbr24] mov ah,40h mov bx,id3 mov dx,offset ligne24 int 21h mov cx,0 mov cl,[nbr25] mov ah,40h mov bx,id3 mov dx,offset ligne25 int 21h cmp [id54],1 ;teste l'action sur la touche [F10] jnz r1 jmp pageS r1: cmp [id53],1 ;indicateur de sauvegarde jnz fermeF jmp pageS ;------------------------------------------------------------------------------- ;---------------------- fermeture du fichier sur le disque --------------------- fermeF: mov ah,3eh ;ferme le fichier mov bx,id3 int 21h mov ah,6 mov al,25 mov bh,7 mov ch,0 ;efface l'écran mov cl,0 mov dh,25 mov dl,79 int 10h jmp affichR ;saut termine le programme ;------------------------------------------------------------------------------- ;------ efface l'écran et positionne le curseur pour une nouvelle page --------- pageS: mov [nbr1],0 ;met les compteurs à 0 mov [nbr2],0 mov [nbr3],0 mov [nbr4],0 mov [nbr5],0 mov [nbr6],0 mov [nbr7],0 mov [nbr8],0 mov [nbr9],0 mov [nbr10],0 mov [nbr11],0 mov [nbr12],0 mov [nbr13],0 mov [nbr14],0 mov [nbr15],0 mov [nbr16],0 mov [nbr17],0 mov [nbr18],0 mov [nbr19],0 mov [nbr20],0 mov [nbr21],0 mov [nbr22],0 mov [nbr23],0 mov [nbr24],0 mov [nbr25],0 cmp [id54],1 ;teste l'action sur la touche [F10] jnz r2 mov [id54],0 ;met l'indicateur à 0 jmp debut r2: mov ah,6 mov al,25 mov bh,7 mov ch,0 ;efface l'écran si plus de 25 lignes mov cl,0 mov dh,25 mov dl,79 int 10h mov dh,0 mov dl,7 ;place le curseur ligne 1 colonne 7 mov ah,02h ;si plus de 25 lignes mov bh,0 int 10h mov ah,09h mov dx,offset id91 ;affiche le texte id91 (SUITE) int 21h mov dh,1 ;ligne 2 mov dl,1 ;colonne 1 mov [id53],0 ;remet l'indicateur de sauvegarde … 0 jmp ecrit1C ;entrée d'une nouvelle ligne ;------------------------------------------------------------------------------- ;---------------------------- efface une ligne --------------------------------- effLI: mov dl,0 ;d‚bute par le premier caractère mov [id10],dl ;sauve la ligne mov [id11],dh ;sauve la colonne effL: mov [id12],dl ;sauve la colonne pour effacement mov ah,02h mov bh,0 ;positionne le curseur int 10h mov ah,09h mov dx,offset id7 ;efface le caractère int 21h mov dh,[id11] ;récupère la ligne mov dl,[id12] ;récupère la colonne pour effacement add dl,+1 cmp dl,80 ;compare avec le nombre de caractères max jnz suite18 ;si vrai retour entrée d'un nouveau caractère mov [id52],0 jmp ecrit1C suite18:jmp effL ;efface le caractère suivant ;------------------------------------------------------------------------------- ;--------------------------- rétablit l'affichage ------------------------------ affichR:mov dh,1 ;ligne nø 1 mov dl,1 ;colonne nø 1 mov ah,02h mov bh,0 ;remet le curseur ligne 1 colonne 1 int 10h mov ah,01h mov ch,6 ;rétablit le curseur d'origine (_) mov cl,7 int 10h ;------------------------------------------------------------------------------- ;---------------------------- rétablit ctrl break ------------------------------ mov dx,[id21] ;récupère l'adresse du ctrl break mov ds,[id20] mov ah,25h ;rétablit l'int 1bh (ctrl break) mov al,1bh int 21h pop es pop ax pop cx ;récupère les registres pop bx pop ds pop dx popf ;------------------------------------------------------------------------------- ;============================ FIN DU PROGRAMME ================================= mov ah,4ch ;termine le programme int 21h ;------------------------------------------------------------------------------- ;--------------------------- FIN POUR ASSEMBLAGE ------------------------------- projet ends ;directive d'assemblage fin du programme end start ;-------------------------------------------------------------------------------