Zestaw oprogramowania umożliwiający transmisję plików między komputerami złączem szeregowym.
Autorzy :
Tomasz Bochyński
Janusz Buczak
SPIS TREŚCI.
Strona:
1. |
Spis treści. |
1 |
2. |
Założenia teoretyczne projektu. |
2 |
3. |
Schemat blokowy programu Master. |
3 |
4. |
Schemat blokowy programu Slave. |
4 |
5. |
Formaty bloków transmisyjnych. |
5 |
6. |
Spis wszystkich procedur. |
6 |
7. |
Ograniczenia programów. |
7 |
8. |
Instrukcja obsługi programów. |
8 |
9. |
Tekst źródłowy programu Master. |
9 |
10. |
Tekst źródłowy programu Slave. |
13 |
|
|
|
Założenia teoretyczne projektu.
Zestaw stanowią dwa niezależne nierezydentne programy: Master i Slave.
Program Slave udostępnia pliki z katalogu domyślnego z którego był uruchomiony.
W programie Master wpisujemy nazwę pliku, który chcemy skopiować. Slave odpowiada czy taki plik istnieje.
Wszystkie atrybuty kopiowanego pliku musza być odziedziczone po pliku kopiowanym.
Transmisja podzielona musi być na bloki po 512 do 4096B z testowaną sumą kontrolną każdego bloku.
W przypadku błędu sumy kontrolnej blok należy powtórzyć. Trzecie błędne powtórzenie tego samego bloku przerywa transmisję.
Brak odpowiedzi na telegram w czasie dłuższym jak 1 sekunda przerywa transmisję.
Naciśnięcie przycisku Esc kończy program po czasie nie dłuższym jak 2 sekundy na dowolnym etapie jego działania.
Transmisja ma działać jak najszybciej wykorzystując pełne możliwości złącza (8250 lub ARCNET).
Program Master ma w trakcie pobierania pliku wyświetlać procentowe zaawansowanie transmisji.
Wszystkie założenia udało nam się spełnić. Ewentualne wątpliwości można mieć do przedostatniego punktu, gdyż program testowany był na komputerach Pentium. Nie wiemy jednak jak zachowują się one na komputerach 286 - 486 (na słabszych komputerach oprogramowanie to nie działa wcale ).
Schemat blokowy programu Master.
Rys 1. Ogólny schemat blokowy programu Master.
Schemat blokowy programu Slave.
Rys 1. Ogólny schemat blokowy programu Slave
Format bloków transmisyjnych.
Format krótkich bloków transmisyjnych.
Krótkie bloki transmisyjne przeznaczone są do transmitowania między programami potwierdzeń,
nazwy pliku i informacji o nim
Rodzaje bloków:
Jednobajtowe potwierdzenia.
Znaczenie bajtu:
0 - wystąpił błąd
1 - pozytywne potwierdzenie
fdh - nastąpi transmisja nazwy
cokolwiek - używane przy synchronizacji transmisji
Nazwa pliku
Bajt |
1 |
2 |
3 |
... |
n-2 |
n-1 |
N |
|||
Zawartość |
nazwa pliku |
0 |
$ |
Informacje o pliku.
Kolejne bajty zawierają:
1,2 - ilość całych (1024 bajty) pakietów do przesłania
3,4 - długość ostatniego pakietu
5,6 - atrybuty pliku
Format długich bloków transmisyjnych.
Długie bloki transmisyjne przeznaczone są do transmitowania między programami danych i sumy kontrolnej. Format bloków długich przedstawiono poniżej :
Pełny pakiet
Bajt |
1 |
2 |
3 |
4 |
.. |
1024 |
1025 |
|||
Zawartość |
dane transmitowane |
suma kontrolna |
Ostatni pakiet ( końcówka pliku )
Bajt |
1 |
2 |
3 |
4 |
długość ostatniego pakietu |
1025 |
|||
Zawartość |
dane transmitowane |
suma kontrolna |
Spis wszystkich procedur
Konfiguruj (Master, Slave)
Wejście:
Config = zmienna zawierająca nazwę pliku konfiguracyjnego w kodzie ASCIZ
DS: segment zawierający zmienną config
Wyjście:
Port = adresy portu szeregowego
Dzielnik = przez ile należy podzielić prędkość maksymalną
Wysylanie (Master, Slave)
Wejście:
AL = wartość bajtu do wysłania na port
Wyjście:
Brak
Odbieranie (Master, Slave)
Wejście:
DS = CS
Wyjście:
AL = wartość bajtu odebranego z portu
Procenty (Master)
Wejście:
ES:DI = adres początku pamięci ekranu
CX = Ilość pełnych pakietów do przekopiowania + 2 - Ilość przekopiowanych pakietów
DLPL[0,1] = 16 - to bitowa wartość zawierająca ilość pełnych pakietów
Wyjście:
Wypisuje na ekran procent zaawansowania transmisji
Komunikat (Master)
Wejście:
DS:SI = adres zmiennej zawierającej komunikat
ES:DI = adres pamięci ekranu od którego ma być wypisywany komunikat
CX = ilość znaków w wypisywanym komunikacie
Wyjście:
Wypisuje na ekran treść komunikatu
Ograniczenia programów.
Długość kopiowanego pliku nie może przekroczyć 63 MB (67,107,840 B). Spowodowane jest to tym, że podczas dzielenia długości pliku przez długość pakietu (w tym przypadku 1024) wynik przekroczy wartość 0ffffh i nie zmieści się w 16-to bitowym rejestrze. Nie stanowi to jednak większego ograniczenia gdyż plik o tak dużej długości przesyłałby się ponad półtorej godziny.
Na wolniejszych komputerach ( program testowano na komputerach klasy Pentium ), mogą wystąpić problemy z osiągnięciem pełnej prędkości złącza 8250. Przyczyną tego stanu rzeczy jest pętla oczekująca na dane w buforze odbiornika portu szeregowego, która dodatkowo sprawdza czy nie został przekroczony czas oczekiwania na telegram. W czasie gdy sprawdzany jest ów okres z drugiego komputera zostanie wysłany kolejny bajt danych.
Problem może nastąpić gdy pracujemy w sieci i uruchamiamy oba programy z tego samego katalogu na obu komputerach. Program Master nie będzie mógł stworzyć pliku gdyż będzie on odczytywany przez program Slave.
Instrukcja obsługi programów.
Wstęp.
Zestaw oprogramowania przeznaczony jest do transmisji plików komputerowych przy wykorzystaniu złącza RS - 232 (układ 8250). Umożliwia on transmitowanie plików nie większych niż 63 MB z bieżącego katalogu komputera na którym uruchomiony został program master.exe i utworzenie kopii tychże plików w katalogu bieżącym komputera na którym pracuje program slave.exe.
Konfiguracja.
Programy master.exe i slave.exe standardowo komunikują się poprzez port COM1 o adresie 3f8h z prędkością 115200 bodów (bitów na sekundę). Dzieje się tak wtedy gdy w katalogach, w których umieszczone są programy nie ma pliku setup.cfg lub dane w nim podane nie odpowiadają standardowi. Aby zmienić parametry pacy programów należy na samym początku pliku setup.cfg ( plik ten należy przekopiować zarówno do katalogu z programem master.exe jak i do katalogu z programem slave.exe ) kolejno wpisać:
numer portu komputera z którego uruchamiamy program
możliwości: `3f8;','2f8;' (odpowiada to portom COM1 i COM2)
prędkość komunikacji w bitach na sekundę
możliwości: `115200;','57600;','38400;',...,'300;'
Uwaga ! Należy pamiętać aby po obu elementach znajdował się średnik Przykładowy plik setup.cfg wygląda następująco:
3fb;115200;
Praca z programami.
Program master.exe po uruchomieniu nie wymaga żadnej dodatkowej obsługi. Program wykonywany jest aż do momentu naciśnięcia klawisza ESC który to kończy pracę programu.
Praca z częścią nadrzędną wymaga od użytkownika jedynie podania nazwy pliku (wraz z rozszerzeniem) do skopiowania. W razie braku możliwości dokonania przesyłu danych lub błędów transmisji program automatycznie poinformuje o tym użytkownika. Program kończy naciśnięcie klawisza ESC na dowolnym etapie jego działania.
Tekst źródłowy programu Master
jumps
.286
kod segment
assume cs:kod
adres_ekranu dw 0b800h
port dw 03f8h,03f9h,03fbh,03fdh
dzielnik dw 1
config db 'setup.cfg',0
com2 db '2f8',59
nazwa db 13 dup(0)
nr_dojscia dw 0
dlpl db 6 dup(?)
cache db 1025 dup(?)
dl_pakietu dw ?
suma_kontrolna db ?
blad db ?
podaj_nazwe db 'Podaj nazwe pliku : '
procent db 'Przeslano : %'
blad_transmisji db 'Wystapil blad transmisji. Przesylanie pzerwane.'
timeout db 'Polaczenie przerwane'
brak_pliku db 'Nie ma pliku o tej nazwie'
klawisz db 'Nacisnij jakis klawisz'
wyjscie db 'ESC - Wyjscie z programu'
bledna_operacja db 'Blad operacji na pliku'
konfigurowanie proc
mov ax,3d00h ;otwarcie pliku setup.cfg
lea dx,config
int 21h
jc opusc_config
push ax ;odczytanie 11 znakow z pliku
mov bx,ax
mov ah,3fh
mov cx,11
lea dx,cache
int 21h
pop bx
push ax
mov ah,3eh ;zamknieci pliku
int 21h
pop ax
cmp ax,7 ;sprawdzenie cz nie bylo bl©du
jb opusc_config
lea si,com2 ;sprawdzenie czy COM2
lea di,cache
mov cx,4
rep cmpsb
jnz predkosc
mov port,2f8h
mov port[2],2f9h
mov port[4],2fbh
mov port[6],2fdh
predkosc:
lea di,cache
xor ax,ax
xor si,si
predkosc0:
cmp byte ptr es:[di+4],59 ;zamiana wartosci z pliku
jz predkosc1 ;na wartosc liczbowa
mov bh,0
mov bl,es:[di+4]
sub bl,48
add ax,bx
mov bx,10
mul bx
cmp dx,0
jnz predkosc1
inc di
inc si
cmp si,6
jb predkosc0
predkosc1:
cmp dx,1 ;sprawdzenie czy 115200
jnz predkosc2
cmp ax,0c200h
jnz predkosc2
ret
predkosc2:
mov bx,10
div bx
mov dx,1 ;dielenie 115200 przez predkosc
mov bx,ax
mov ax,0c200h
div bx
cmp dx,0 ;spr czy prawidlowy dzielnik
jnz opusc_config
mov dzielnik,ax ;ustaw dzielnik jesli dobry
opusc_config:
ret
konfigurowanie endp
wysylanie proc ;procedura wysylajaca znaki na port
push ax
wyslij:
mov dx,port[6]
in al,dx
test al,00100000b
jz wyslij
pop ax
mov dx,port
out dx,al
ret
wysylanie endp
odbieranie proc
push es ;pobranie zmiennej biosu z
xor ax,ax
mov es,ax
mov bl,es:[46ch] ;licznikiem zmienianym co 55ms
odbierz:
mov dl,es:[46ch] ;jw
sub dl,bl ;obliczanie ile czasu uplynelo
cmp dl,18 ;sprawdzanie czy minela sekunda
jb odb
pop es
mov ax,adres_ekranu
mov es,ax
lea si,timeout
mov di,2780
mov cx,20
call komunikat
jmp start1
odb:
mov dx,port[6]
in al,dx
test al,1
jz odbierz
pop es
mov dx,port
in al,dx
ret
odbieranie endp
komunikat proc
mov ah,7 ;atrybut znaku
inf:
lodsb ;laduje do al z ds:[si]
stosw ;wysyla ax do es:[di]
loop inf ;powtorz cx razy
ret
komunikat endp
procenty proc ;procedura pokazujaca procent
;zaawansowania przesylanego pliku
mov ax,word ptr dlpl[0] ;zaladowanie do ax dwoch bajtow z tablicy
inc ax ;
push ax ; (il_pelnych_pakietow+2-cx)*100
sub ax,cx ; ax=------------------------------
inc ax ; il_pelnych_pakietow+1
mov bx,100 ;
xor dx,dx ; cx=il_pelnych_pakietow + 2 -
; -il_przeslanych_pakietow
mul bx ;
pop bx ;
div bx ;
mov bl,10 ; po dzieleniu al=liczba dziesiatek
div bl ; ah=liczba jednosci
add ax,0011000000110000b ;dodanie 48 do ah i al
mov es:[2330],al ;wypisanie na ekran
mov es:[2332],ah ;wypisanie na ekran
ret
procenty endp
start:
xor ax,ax
mov es,ax
mov al,es:[449h]
cmp al,7
jnz vga
mov adres_ekranu,0b000h
vga:
push cs
push cs
pop ds
pop es
call konfigurowanie
;*************************Inicjalizacja portu*********************************
mov dx,port[4]
mov al,10000000b
out dx,al
mov dx,port ;ustawienie predkosci( podzielnik w dzielnik)
mov al,byte ptr dzielnik
out dx,al
mov dx,port[2]
mov al,byte ptr dzielnik[1]
out dx,al
mov dx,port[4]
mov al,00000011b
out dx,al
mov ax,adres_ekranu
mov es,ax
jmp start2
;*************************************
start1:
lea si,klawisz
mov di,3098
mov cx,22
call komunikat
mov ah,0
int 16h
cmp al,27
jz koniec
start2:
mov ah,02h ;chowanie kursora
mov bh,0
mov dh,25
int 10h
cld
xor di,di ;czyszczenie ekranu
mov cx,2000
mov ah,7 ;atrybut znaku
mov al,255 ;znak pusty
rep stosw ;powtarza cx zaladowanie ax do es:[di]
lea si,wyjscie ;wypisuje 'ESC - wyjscie z programu
mov di,3896
mov cx,24
call komunikat
cmp nr_dojscia,0 ;nr dojscia do pliku
jz odbierz1
mov ah,3eh ;zamkniecie pliku jesli otwarty
mov bx,nr_dojscia
int 21h
odbierz1: ;wyczyszczenie bufora
mov dx,port[6] ;sprawdzenie bufora przez rejestr stanu
in al,dx
test al,1
jz filename_inf
mov dx,port
in al,dx
jmp odbierz1
filename_inf: ;wypisanie komunikatu 'Podaj nazwe..'
lea si,podaj_nazwe
mov di,1968
mov cx,20
call komunikat
mov di,0 ;ustawienie licznika
filename:
mov ah,0 ;czeka na klawisz
int 16h
cmp al,27
jz koniec
cmp al,13
jz fil2
cmp al,8 ;sprawdza czy BackSpace
jnz fil1
cmp di,0 ;sprawdza czy jest co kasowac
jz filename
dec di
shl di,1 ;pomnozenie przez 2 (przesuniecie w lewo)
mov byte ptr es:[di+2008],255 ;skasowanie litery
shr di,1 ;przywrocenie di
jmp filename
fil1: ;wypisanie znaku
cmp di,12 ;ograniczenie do 12 znakow (8.3)
jz filename
shl di,1 ;jw
mov es:[di+2008],al
shr di,1
mov nazwa[di],al ;zaladowanie nazwy do zmiennej
inc di
jmp filename
fil2:
mov nazwa[di],0 ;dopisanie zera na koniec nazwy
mov nazwa[di+1],'$'
mov al,0fdh ;wyslanie kodu gotowosci
call wysylanie
xor di,di
wyslij_nazwe: ;wyslanie nazwy
mov al,nazwa[di]
call wysylanie
inc di
cmp al,'$' ;sprawdzenie czy wyslany byl dolar '$'
jnz wyslij_nazwe
call odbieranie ;odebranie potwierdzenia istnienia pliku
cmp al,1 ;jesli 1 to plik istnieje
je istnieje
lea si,brak_pliku
mov di,2776
mov cx,25
call komunikat
jmp start1 ;powrot na poczatek
istnieje:
lea di,dlpl[0]
mov cx,6
call wysylanie
dlugosc:
call odbieranie ;odebranie danych o pliku :
mov ds:[di],al ;ilosc pelnych pakietow (1024 B),
inc di ;dlugosc ostatniego pakietu,
loop dlugosc ;atrybuty pliku
mov ah,3ch ;utworzenie pliku
lea dx,nazwa ;nazwa pliku
mov cx,word ptr dlpl[4] ;atrybut odczytany z tablicy danych o pliku
int 21h
ic blad_pliku
mov nr_dojscia,ax ;zaladowanie dojscia do pliku do zmiennej
lea si,procent ;wypisanie 'Przeslano: %'
mov di,2304
mov cx,17
call komunikat
mov cx,word ptr dlpl[0] ;odczytanie ilosci pelnych pakietow z tablicy
inc cx
et1:
push cx
mov blad,0
mov dl_pakietu,1024 ;dlugosc pakietu
cmp cx,1
jnz et2
mov ax,word ptr dlpl[2] ;odczytanie koncowki pliku
mov dl_pakietu,ax
et2:
mov suma_kontrolna,0
lea di,cache ;zaladowanie bufora dla pakietow
mov cx,dl_pakietu
inc cx
call wysylanie ;wyslanie znaku gotowosci
et3:
call odbieranie
xor suma_kontrolna,al
mov ds:[di],al
inc di ;zapisanie do bufora ds:[di] 'cache'
loop et3
et4:
mov ah,0bh ;sprawdzenie klawiatury
int 21h
cmp al,0ffh
jnz et5
mov ah,08h ;odczyt znaku z bufora
int 21h
cmp al,27
jz koniec
et5:
cmp suma_kontrolna,0 ;sprawdzenie zgodnosci sum kontrolnych
jz et6
mov al,0 ;znak sygnalizujacy powtorzenie pakietu
call wysylanie
inc blad ;licznik ilosci dopuszczalnych bledow przy
cmp blad,4 ;przesylaniu jednego pakietu
jnz et2
lea si,blad_transmisji ;wypisanie informacji o bledzie w przypadk
;powtorzenia sie bledu wiecej niz 3 razy
mov di,2754
mov cx,47
call komunikat
jmp start1 ;powrot na poczatek
et6:
mov ah,40h ;kopiowanie pakietu danych
mov bx,nr_dojscia ;do pliku
mov cx,dl_pakietu ;
lea dx,cache ;
int 21h ;
jc blad_pliku
pop cx ;ilosc pakietow
call procenty ;wypisywanie zaawansowania transmisji
mov al,1 ;potwierdzenie odebrania pakietu
call wysylanie
loop et1 ;sprawdzenie cx
mov ax,3031h ;poprawka wypisujaca 100 % zamiat :9 %
mov es:[2328],al ;
mov es:[2330],ah ;
jmp start1
koniec:
mov ah,3eh ;zamykanie pliku
mov bx,nr_dojscia
int 21h
mov ah,4ch
int 21h
blad_pliku:
lea si,bledna_operacja
mov di,2778
mov cx,22
call komunikat
jmp start1
kod ends
end start
Tekst źródłowy programu Slave
jumps
.286
kod segment
assume cs:kod
port dw 03f8h,03f9h,03fbh,03fdh
dzielnik dw 1
config db 'setup.cfg',0
com2 db '2f8',59
nazwa db 13 dup(0)
nr_dojscia dw 0
dlpl db 6 dup(?)
cache db 1025 dup(?)
dl_pakietu dw ?
suma_kontrolna db ?
time db 0
blad db ?
blad_inf db 10,13,'Blad transmisji',10,13,'$'
zerwane db 10,13,'Polaczenie zostalo przerwane',10,13,'$'
poczatek db 10,13,'Czekanie na nazwe (ESC- wyjscie)',10,13,'$'
brak_pliku db 10,13,'Nie ma takiego pliku',10,13,'$'
bledna_operacja db 10,13,'Blad operacji na pliku',10,13,'$'
konfigurowanie proc
mov ax,3d00h ;otwarcie pliku setup.cfg
lea dx,config
int 21h
jc opusc_config
push ax ;odczytanie 11 znakow z pliku
mov bx,ax
mov ah,3fh
mov cx,11
lea dx,cache
int 21h
pop bx
push ax
mov ah,3eh ;zamknieci pliku
int 21h
pop ax
cmp ax,7 ;sprawdzenie cz nie bylo bl©du
jb opusc_config
lea si,com2 ;sprawdzenie czy COM2
lea di,cache
mov cx,4
rep cmpsb
jnz predkosc
mov port,2f8h
mov port[2],2f9h
mov port[4],2fbh
mov port[6],2fdh
predkosc:
lea di,cache
xor ax,ax
xor si,si
predkosc0:
cmp byte ptr es:[di+4],59 ;zamiana wartosci z pliku
jz predkosc1 ;na wartosc liczbowa
mov bh,0
mov bl,es:[di+4]
sub bl,48
add ax,bx
mov bx,10
mul bx
cmp dx,0
jnz predkosc1
inc di
inc si
cmp si,6
jb predkosc0
predkosc1:
cmp dx,1 ;sprawdzenie czy 115200
jnz predkosc2
cmp ax,0c200h
jnz predkosc2
ret
predkosc2:
mov bx,10
div bx
mov dx,1 ;dielenie 115200 przez predkosc
mov bx,ax
mov ax,0c200h
div bx
cmp dx,0 ;spr czy prawidlowy dzielnik
jnz opusc_config
mov dzielnik,ax ;ustaw dzielnik jesli dobry
opusc_config:
ret
konfigurowanie endp
wysylanie proc
push ax
push cx
wyslij:
mov dx,port[6]
in al,dx
test al,00100000b
jz wyslij
pop cx
mov dx,port
pop ax
out dx,al
ret
wysylanie endp
odbieranie proc
push es
xor ax,ax
mov es,ax ;pobranie zmiennej biosu z
mov bl,es:[46ch] ;licznikiem zmienianym co 55ms
odbierz:
mov dl,es:[46ch] ;jw
sub dl,bl ;obliczanie ile czasu uplynelo
cmp dl,18 ;sprawdzanie czy minela sekunda
jb odb
pop es
lea dx,zerwane
mov ah,09h
int 21h
jmp start1
odb:
mov dx,port[6]
in al,dx
test al,1
jz odbierz
pop es
mov dx,port
in al,dx
ret
odbieranie endp
start:
push cs
push cs
pop ds
pop es
call konfigurowanie
;*************************Inicjalizacja portu*********************************
mov dx,port[4]
mov al,10000000b
out dx,al
mov dx,port ;ustawienie predkosci na 115000 bodow
mov ax,dzielnik
out dx,al
mov dx,port[2]
mov al,ah
out dx,al
mov dx,port[4]
mov al,00000011b
out dx,al
;**************************Pobieranie nazwy pliku***********************************
start1:
lea dx,poczatek
mov ah,09h
int 21h
cmp nr_dojscia,0
jz odbierz1
mov ah,3eh
mov bx,nr_dojscia
int 21h
mov nr_dojscia,0
odbierz1:
in al,60h
cmp al,1
jnz odb1
jmp koniec
odb1:
mov dx,port[6]
in al,dx
test al,1
jz odbierz1
mov dx,port
in al,dx
cmp al,0fdh
jnz odbierz1
lea di,nazwa
getname:
call odbieranie
stosb
cmp al,'$'
jnz getname
;**************************Wyswietlanie nazwy pliku**********
lea dx,nazwa
mov ah,09h
int 21h
mov ah,43h
xor al,al
lea dx,nazwa
int 21h
jnc istnieje
xor al,al
call wysylanie
lea dx,brak_pliku
mov ah,09h
int 21h
jmp start1
istnieje:
mov word ptr dlpl[4],cx
mov ax,3d00h
lea dx,nazwa
int 21h
jc blad_pliku
mov nr_dojscia,ax
mov ax,4202h
mov bx,nr_dojscia
xor dx,dx
xor cx,cx
int 21h
jc blad_pliku
mov cx,1024
div cx
mov word ptr dlpl[0],ax
mov word ptr dlpl[2],dx
lea si,dlpl[0]
mov cx,6
mov al,1 ;informacja, ze istnieje plik
call wysylanie
call odbieranie
dlugosc:
lodsb
call wysylanie
loop dlugosc
mov ah,42h
mov al,0
mov bx,nr_dojscia
xor cx,cx
xor dx,dx
int 21h
jc blad_pliku
mov blad,0
mov cx,word ptr dlpl[0]
inc cx
et1:
push cx
mov dl_pakietu,1024
cmp cx,1
jnz et2
mov ax,word ptr dlpl[2]
mov dl_pakietu,ax
et2:
mov ah,3fh
mov bx,nr_dojscia
lea dx,cache
mov si,dx
mov cx,dl_pakietu
int 21h
jc blad_pliku
et3:
cld
mov suma_kontrolna,0
mov cx,dl_pakietu
call odbieranie
et4:
lodsb
call wysylanie
xor suma_kontrolna,al ;suma kontrolna
loop et4
mov al,suma_kontrolna
call wysylanie
et5:
mov ah,0bh ;sprawdzenie klawiatury
int 21h
cmp al,0ffh
jnz et6
mov ah,08h ;odczyt znaku z bufora
int 21h
cmp al,27
jz koniec
jmp et5
et6:
call odbieranie
cmp al,1
jz et7
inc blad
cmp blad,4
jnz et3
lea dx,blad_inf
mov ah,09h
int 21h
jmp start1
et7:
pop cx
loop et1
jmp start1
koniec:
mov ah,3eh
mov bx,nr_dojscia
int 21h
mov ah,4ch
int 21h
blad_pliku:
lea dx,bledna_operacja
mov ah,09h
int 21h
jmp start1
kod ends
end start
1
15