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.

Czytaj To

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
w3cw3c
automatyka przemysłowa