Czytaj To
-- Sebastian Pawlak
Przedstawiłem tu kod asemblerowy programu służącego do przeglądania
plików tekstowych.
Pisząc ten program, zależało mi na minimalizacji jego objętości.
Przeglądarka wyposażona jest w licznik procentowy.
Program wywołuje się z parametrem stanowiącym nazwę pliku.
Jeśli nie podano parametru, to program szuka w aktualnym katalogu
pliku "CZYTAJ.TXT".
Program ilustruje również jak załadować polskie znaki diakrytyczne w trybie tekstowym.
Kod SEGMENT Assume Cs:Kod org 100h Start: push cs pop ds mov ax,03h ;tryb int 10h mov ah,01h ;kursor mov ch,20h int 10h mov ah,02h mov bh,0 mov dh,24 mov dl,0 int 10h mov dx,offset Pl_Wait mov ah,09h int 21h jmp Main FileName DB 'CZYTAJ.TXT',0,0,0,0,0,0,0 ;nazwa pliku Dane DW 100h+1500 ;seg w pamieci na dane Pozycja DW 0 ;pozycja w tekscie Max_line DW 0 ;ilosc przeczytanych linii Linia DW 0 Nr_bajtu_ekr DW 0 Nr_bajtu_danych DW 0 Poz_dane DW 0 _DX DW 0 Procent DB 0 A DW 0 Kod_wyjscia DB 0 Dlugosc_tekstu DB 14 Tekst DB 'Blad plikowy.','$' DB 'Czytaj 1.0 autor Sebastian Pawlak','$' Pl_Wait DB 'Prosze czekac ...','$' Pasek DW 475,6994,4965,6497,4964,475,4982,6501,4978,6446,6432,6449,4910 DW 6960,4896,4896,4896,7970,4896,475,475,475,475,475,475,475,475,475 DW 475,475,475,475,475,475,475,475,475,475,475,4888,4889 DW 4908,475,4936,4975,4973,4965,4908,475,4933,4974,4964,4908,475 DW 4944,4967,4949,4976,4908,475,4944,4967,4932,4974,4908,475,4933 DW 4979,4963,475,475,475,475,475,475,475,475,475,7973,475 Fonty DB 0,0,16,56,108,198,198,254,198,198,198,198,4,8,9,6 ;{A} DB 12,24,60,102,194,192,192,192,192,194,102,60,0,0,0,0 ;{C} DB 0,0,254,102,98,104,120,104,96,98,102,254,4,8,9,6 ;{E} DB 0,0,240,96,96,102,108,120,112,98,102,254,0,0,0,0 ;{L} DB 12,24,230,230,246,254,222,206,198,198,198,198,0,0,0,0 ;{N} DB 12,24,124,198,198,198,198,198,198,198,198,124,0,0,0,0 ;{O} DB 12,24,124,198,198,96,56,12,6,198,198,124,0,0,0,0 ;{S} DB 12,24,254,198,134,12,24,48,96,194,198,254,0,0,0,0 ;{Z zi} DB 24,24,254,198,134,12,24,48,96,194,198,254,0,0,0,0 ;{Z rz} DB 0,0,0,0,0,120,12,124,204,204,204,118,4,8,9,6 ;{a} DB 0,0,0,12,24,124,198,192,192,192,198,124,0,0,0,0 ;{c} DB 0,0,0,0,0,124,198,254,192,192,198,124,4,8,9,6 ;{e} DB 0,0,58,30,28,24,56,120,88,24,24,60,0,0,0,0 ;{l} DB 0,0,0,12,24,220,102,102,102,102,102,102,0,0,0,0 ;{n} DB 0,0,0,12,24,124,198,198,198,198,198,124,0,0,0,0 ;{o} DB 0,0,0,12,24,124,198,96,56,12,198,124,0,0,0,0 ;{s} DB 0,0,0,24,24,254,204,24,48,96,198,254,0,0,0,0 ;{z rz} DB 0,0,0,12,24,254,204,24,48,96,198,254,0,0,0,0 ;{z zi} Adresy DB 143,149,144,156,165,163,152,160,161,134,141,145,146,164,162,158,167,166 Main: ;**************************************************** ;* Odczyt PSP - sprawdzanie czy sa podane parametry * ;**************************************************** mov ah,62h int 21h mov es,bx mov di,80h ;offset parametru wywolania mov ch,0 mov cl,es:[di] ;ilosc przekazanych znakow cmp cl,0 je Nie_ma_parametru cmp cl,14 jbe Param_maly jmp Koniec Param_maly: mov si,offset [FileName] inc di push cx Do_tablicy: ;parametr do tablicy inc di mov al,es:[di] mov ds:[si],al inc si loop Do_tablicy pop cx mov ax,15 sub ax,cx mov cx,ax mov al,0 dec si Dopelnij_zera: mov ds:[si],al inc si loop Dopelnij_zera Nie_ma_parametru: ;****************** ;* Odczyt z pliku * ;****************** mov Kod_wyjscia,0 ;**** otwiera plik mov ah,3dh mov al,0 mov dx,offset [FileName] int 21h mov bx,ax jae Plik_otwarty jmp Koniec Plik_otwarty: mov dx,Dane mov _DX,dx mov si,dx mov al,13 mov ds:[si],al Nastepny_znak_pliku: mov ah,3fh mov cx,1 int 21h cmp ax,1 jne Przeczytany jb Przeczytany mov si,dx mov al,ds:[si] cmp al,10 jne Jeszcze_nie_koniec_linii add _Dx,80 ;tu koniec linii -obsluga mov dx,_DX inc Max_line cmp Max_line,750 ja Przeczytany jmp Omin_obsluge_konca_linii Jeszcze_nie_koniec_linii: inc dx Omin_obsluge_konca_linii: jmp Nastepny_znak_pliku Przeczytany: mov al,ds:[si] cmp al,10 je Jesli_10 mov al,13 inc si mov ds:[si],al inc Max_line Jesli_10: mov ah,3eh ;zamyka plik int 21h jae Plik_zamkniety jmp Koniec Plik_zamkniety: ;********************************************* ;* Instalacja polskich znakow diakrytycznych * ;********************************************* push cs pop es mov bp,offset [Fonty] mov ah,11h ;parametry do wywolania funkcji zaladunku matrycy mov al,0 mov bl,0 ;nr matrycy mov bh,16 ;il. bajtow do def. znaku mov cx,18 mov si,offset [Adresy] mov dh,0 Nastepny_znak_matrycy: push cx mov cx,1 mov dl,[si] inc si int 10h add bp,16 pop cx loop Nastepny_znak_matrycy ;************************************************** ;* Obsluga wyrzucania na ekran i obslugi podgladu * ;************************************************** mov Linia,1 mov ax,0b800h mov es,ax mov di,160*24 mov cx,80 mov si,offset Pasek Nastepny_znak_paska: mov ax,ds:[si] mov es:[di],ax inc di inc di inc si inc si loop Nastepny_znak_paska ;nazwa pliku mov si,offset FileName mov di,3876 mov ah,31 Nastepny_znak_nazwy_pl: mov al,[si] cmp al,0 je Koniec_nazwy_pl cmp al,32 je Koniec_nazwy_pl mov es:[di],ax inc si inc di inc di jmp Nastepny_znak_nazwy_pl Koniec_nazwy_pl: mov al,'"' mov es:[di],ax Petla_glowna: mov di,0 dec Linia mov ax,Linia inc Linia mov bx,80 mul bx mov si,Dane add si,ax mov Poz_dane,si cmp Max_line,24 ja Ekran_24 mov cx,Max_line jmp Omin_obsl_linii_ekr Ekran_24: mov cx,24 Omin_obsl_linii_ekr: mov Nr_bajtu_ekr,0 mov Nr_bajtu_danych,0 mov ah,15 Nastepna_linia: push cx mov cx,80 Nastepny_znak: mov al,[si] cmp al,13 je _10 mov es:[di],ax inc di inc di inc si loop Nastepny_znak jmp Omin_10 _10: mov al,0 Dopelnij: mov es:[di],al inc di inc di loop Dopelnij add Nr_bajtu_ekr,160 mov di,Nr_bajtu_ekr add Nr_bajtu_danych,80 mov si,Nr_bajtu_danych add si,Poz_dane Omin_10: pop cx loop Nastepna_linia ;obsluga procentow %%%%%%%%%%%%%%%%% mov dx,0 mov ax,linia dec ax mov bx,100 mul bx mov bx,Max_line dec bx cmp bx,23 ja Wiecej_niz_23_l mov ax,100 mov bx,1 jmp Nie_0_ok Wiecej_niz_23_l: sub bx,23 Nie_0_ok: div bx mov bl,10 mov cx,2 Nastepne_obliczenie: mov ah,0 div bl push ax loop Nastepne_obliczenie mov ah,0 div bl mov al,ah mov ah,31 mov di,3988 add al,48 mov es:[di],ax mov cx,2 Nastepny_znak_procent: pop ax mov al,ah mov ah,31 inc di inc di add al,48 mov es:[di],ax loop Nastepny_znak_procent ;odczyt klawiszy mov ah,10h int 16h cmp Max_line,23 ;jesli mniej niz 23 linie to nie ma ruchu jae Nie_ma_ruchu_sk jmp Nie_ma_ruchu Nie_ma_ruchu_sk: cmp ah,72 ;strzalka gora jne Nie_72 dec Linia cmp Linia,0 jne Nie_72 mov Linia,1 Nie_72: cmp ah,80 ;strzalka dol jne Nie_80 inc Linia mov bx,Linia add bx,23 cmp bx,Max_Line jbe Nie_80 dec Linia Nie_80: cmp ah,71 ;home jne Nie_71 mov Linia,1 Nie_71: cmp ah,79 ;end jne Nie_79 mov bx,Max_Line sub bx,23 mov Linia,bx Nie_79: cmp ah,73 ;PgUp jne Nie_73 cmp Linia,24 jbe Obsl_jesli_mniej_24 sub Linia,24 jmp Nie_73 Obsl_jesli_mniej_24: mov Linia,1 Nie_73: cmp ah,81 ;PgDn jne Nie_81 add Linia,24 mov bx,Max_Line sub bx,23 cmp Linia,bx jbe Nie_81 mov Linia,bx Nie_81: Nie_ma_ruchu: cmp al,27 jne Nie_Enter mov Kod_wyjscia,1 jmp Koniec Nie_Enter: jmp Petla_glowna ;********** ;* KONIEC * ;********** Koniec: mov ax,3h int 10h mov dx,0 mov ah,0 mov al,Dlugosc_tekstu mul Kod_wyjscia add ax,Offset [Tekst] mov dx,ax mov ah,09h int 21h mov ah,02h mov bh,0 mov dh,1 mov dl,0 int 10h mov ah,4ch int 21h ends end Start