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





