Zestaw oprogramowania umożliwiający transmisje plików miedzy komputerami
Wykonawcy:
Piotr Knapczyk
Grzegorz Bernacki
Spis treści:
Założenia................................................................. 3
2. Adnotacja do założeń.............................................. 4
3. Schemat blokowy programu: master...................... 5
4. Schemat blokowy programu: slave......................... 6
5. Format bloku transmisyjnego................................. 7
6. Spis nagłówków procedur programu master.......... 8
7. Spis nagłówków procedur programu slave............. 9
8. Spis ograniczeń programów.................................... 10
9. Instrukcja obsługi programów................................ 11
10.Wydruk programu: master.................................... 12
11.Wydruk programu: slave....................................... 15
1. Założenia.
1. Zestaw stanowią dwa niezależne nierezydentne programy: master i slave.
2. Program Slave udostępnia pliki z katalogu domyślnego z którego był
uruchomiony.
3. W programie master wpisujemy nazwę pliku, który chcemy skopiować. Slave
odpowiada czy taki plik istnieje.
4. Wszystkie atrybuty kopiowanego pliku musza być odziedziczone po pliku
kopiowanym.
5. Transmisja podzielona musi być na bloki po 512 do 4096B z testowana suma
kontrolna każdego bloku.
6. W przypadku błędu sumy kontrolnej blok należy powtórzyć. Trzecie błędne
powtórzenie tego samego bloku przerywa transmisje.
7. Brak odpowiedzi na telegram w czasie dłuższym jak 1 sekunda przerywa
transmisje.
8. Naciśniecie przycisku Esc kończy program po czasie nie dłuższym jak 2
sekundy na dowolnym etapie jego działania.
9. Transmisja ma działać jak najszybciej wykorzystując pełne możliwości
złącza (8250 lub ARCNET).
2. Adnotacje do założeń.
Mimo wielu założeń i wysokim stopniu problemów, autorom programów udało się spełnić wszystkie stawiane założenia. Programy komunikują się dzięki złączu 8250.
W każdym z programów, każdorazowe naciśnięcie klawisza Esc , kończy działanie programu (programu w którym został naciśnięty). Drugi program działa dalej oczekując na możliwość nadejścia ponownych informacji (takie udogodnienie daje możliwość sprawdzenia zasobów twardego dysku, nie wyłączając obydwu programów). O braku sygnału przychodzącego, użytkownik informowany jest natychmiastowo. Brak sygnału kończy wykonywana operacji i wraca do początku programu (daje to możliwość ponownego kopiowania, bez ponownego uruchomiania programów).
3. Schemat blokowy
programu: master.
4. Schemat blokowy
programu: master.
5. Format bloku transmisyjnego.
W obydwu programach występują dwa typy bloków transmisyjnych:
standardowy
bajty zawierane informacja .
0..511 bity kopiowanego pliku
suma kontrolna wcześniejszych 512 bajtów
b) niestandardowy
bajty zawierane informacja .
0..(512..1023) ostatnie bity kopiowanego pliku
(512..1024) suma kontrolna wcześniejszych 512 bajtów
Typ niestandardowy używany jest do przesłania reszty bitów (wielkość pliku/512), razem z ostatnim pakietem po 512.
Istnieje jeszcze możliwość wystąpienia trzeciego rodzaju typu w momencie gdy wielkość pliku < 512
bajty zawierane informacja .
0..(0..511) ostatnie bity kopiowanego pliku
(1..512) suma kontrolna wcześniejszych 512 bajtów
6. Spis nagłówków wszystkich procedur programu master.
Nazwa procedury |
Opis wykonywanej funkcji |
Wejscie |
Wyjscie |
Wyslij |
wysyłanie bajtu |
al - wysyłany bajt |
---------- |
Odbierz |
odebranie bajtu |
---------- |
al - odebrany bajt bl - jest/brak sygnału |
Wskaznik |
rysowanie wskaźnika |
suma - ile narysowanych czesc - ile dodac |
---------- |
Odbierz_pakiet |
odebranie pakietu |
---------- |
ile_p - ile powtorzen |
Przesylaj |
przesyłanie pakietu |
---------- |
---------- |
Sprawdz_telegram |
sprawdzanie telegramu |
---------- |
---------- |
Wyslij_n |
wysłanie nazwy i odebranie telegramu |
---------- |
---------- |
Podaj |
wpisanie nazwy |
---------- |
---------- |
Czysc_ekran |
czyszczenie ekranu |
---------- |
---------- |
Exit |
wyjście z programy |
---------- |
---------- |
Napis |
wypisanie napisu |
dh - numer wiersza cx - offset tekstu |
---------- |
Kreska |
rysowanie kreski |
poz - pozycja kreski zmienna - kolor |
---------- |
Czyszczenie_portu |
czyszczenie portu |
---------- |
---------- |
Inicjacja |
inicjacja portu |
---------- |
---------- |
Czysc_tab |
czyszczenie tablicy |
di - offset tablicy |
---------- |
Sprwadz_bufor |
sprawdzenie buforu klawiatury |
---------- |
---------- |
7. Spis nagłówków wszystkich procedur programu slave.
Nazwa procedury |
Opis wykonywanej funkcji |
Wejscie |
Wyjscie |
Wyslij |
wysyłanie bajtu |
al - wysyłany bajt |
---------- |
Odbierz |
odebranie bajtu |
---------- |
al - odebrany bajt bl - jest/brak sygnału |
Wyslij_pakiet |
odebranie pakietu |
---------- |
ile_p - ile powtorzen |
Kreska |
rysowanie kreski |
poz - pozycja kreski zmienna - kolor |
---------- |
Kopiowanie |
tworzenie pakietow |
---------- |
---------- |
Wyslij_odp |
wysyłanie odpowiedzi |
---------- |
---------- |
Sprawdzanie |
sprawdzenie istnienia pliku |
---------- |
---------- |
Czysc_ekran |
czyszczenie ekranu |
---------- |
---------- |
Czysc_tab |
czyszczenie tablicy |
di - offset tablicy |
---------- |
Exit |
wyjście z programy |
---------- |
---------- |
Czyszczenie_portu |
czyszczenie portu |
---------- |
---------- |
Sprwadz_bufor |
sprawdzenie buforu klawiatury |
---------- |
---------- |
8. Spis ograniczeń programów.
Programy master i slave w pełni odpowiadają odgórnym założeniom. Jedynym ograniczeniem tych programów jest wielkość przesyłanych plików. Wielkość ta nie powinna przekraczać 30Mb. Niesprawność ta wynika z wielkości przesyłanego pakietu. Żeby zwiększyć ten rozmiar trzeba zmienić wielkość pakietu (zabieg ten nie opłaca się, gdyż już 30Mb pliki, na złączu 8250, będą kopiowane sporą ilość czasu).
9. Instrukcja obsługi programów.
Zarówno program master jak i slave działają w systemie MS-DOS.
Master:
Po zainicjowaniu systemu, wchodzimy do katalogu w którym znajduje się plik master.exe. Po wpisaniu master.exe i naciśnięciu klawisza Enter program zostaje uruchomiony. W początkowym menu mamy do dyspozycji dwie funkcje: nazwa i wyślij. Klawisz Tab umożliwia nam przemieszczanie między funkcjami. Użycie klawisza Esc, w każdym momencie kończy działanie programu. Do zaakceptowania funkcji służy klawisz Enter. Funkcja nazwa umożliwia nam wpisanie nazwy pliku kopiowanego. Nazwę wpisujemy wciskając kolejno klawisze z klawiatury. Użycie Backspace kasuje ostatnio wpisany znak, Esc - kończy działanie programu, a Enter - akceptuje wpisaną nazwę. Funkcja wyślij przesyła, do programu slave, wcześniej ustaloną nazwę pliku oraz odbiera przysyłane informacje. Jeżeli wystąpi brak sygnałów przychodzących użytkownik zostanie poinformowany, a program skoczy do głównego menu. W czasie kopiowania dostępy jest tylko klawisz Esc - zakańczający działanie programu. Po skopiowaniu pliku program powraca do głównego menu umożliwiając skopiowanie innego pliku. Klawisz Esc - kończy dzialanie programu.
Slave:
Po zainicjowaniu systemu, wchodzimy do katalogu w którym znajduje się plik slave.exe. Po wpisaniu slave.exe i naciśnięciu klawisza Enter program zostaje uruchomiony. Program działa w pętli, oczekując na przyjście informacji lub wciśnięcie klawisza Esc. Po przyjściu informacji z programu master, zostają odsyłane bity kopiowanego pliku. Jeżeli wystąpi zanik przesyłu informacji użytkownik zostanie poinformowany, a program skoczy do początkowej pętli. Naciśnięcie klawisza Esc, kończy działanie programu w dowolnym etapie jego wykonywania.
10. Wydruk programu: master.
fb equ 02fbh
f8 equ 02f8h
f9 equ 02f9h
fd equ 02fdh
Kod Segment
Assume cs:kod
text db ' TAB - nastepna pozycja, ENTER - akceptuj, ESC - koniec','$'
blad_z db 'Wystapil blad zapisu na dysk ','$'
wyjscie db ' ESC - rezygnacja ','$'
nzw_plk db ' Plik : ','$'
czysta db ' ','$'
funkcje db ' Nazwa Wyslij ','$'
podaj_d db ' Podaj nazwe pliku: ','$'
brak_s db ' Brak sygnalu ','$'
brak_p db ' Brak pliku ','$'
skala db ' 0% 50% 100%',10,13,' $'
no_ok db ' Wystapily problemy z kopiowaniem; sprobuj jeszcze raz','$'
ok db ' Plik skopiowany ','$'
poz db 1
zmienna db 0
uchwyt dw 0
atrybut db 0
ile dw 0
ile_p dw 0
ile_w dw 0
xoor db 0
czesc dw 0
suma dw 0
reszta dw 0
bufor db 0
tablica db 1025 dup(0)
nazwa db 14 dup(0)
odp dw 3 dup(0)
Start:
push cs
pop ds
push cs
pop es
call inicjacja
call czysc_ekran
mov dh,5
lea cx,funkcje
call napis
mov dh,23
lea cx,text
call napis
rys_kreska:
mov zmienna,7
call kreska
klawisz:
mov ah,0
int 16h
jz klawisz
push ax
mov dh,12
lea cx,czysta
call napis
pop ax
cmp al,27
je koniec
cmp al,9
je nastepny
cmp al,13
je _enter
jmp klawisz
nastepny:
mov zmienna,0
call kreska
inc poz
cmp poz,3
jb rys_kreska
mov poz,1
jmp rys_kreska
_enter:
cmp poz,1
jne nie_1
call podaj
jmp rys_kreska
nie_1:
call wyslij_n
call czyszczenie_portu
jmp rys_kreska
koniec:
call exit
;*******************************************************************
Wyslij Proc
mov dx,f8
out dx,al
mov ah,83h
mov al,0
lea bx,bufor
mov cx,0
mov dx,10000
int 15h
czekaj_wy:
mov dx,fd
in al,dx
and al,0100000b
cmp al,32
jne czekaj_wy
mov ah,83h
mov al,1
int 15h
ret
Wyslij Endp
Odbierz Proc
mov bufor,0
mov ah,83h
mov al,0
lea bx,bufor
mov cx,0fh
mov dx,0a000h
int 15h
czekaj_odb:
mov al,bufor
and al,10000000b
jz jeszcze_nie
mov ile_p,3
mov bl,0
push ax
jmp koniec_odb
jeszcze_nie:
mov dx,fd
in al,dx
and al,00000001b
jz czekaj_odb
mov dx,f8
in al,dx
mov bl,1
push ax
koniec_odb:
mov ah,83h
mov al,1
int 15h
pop ax
ret
Odbierz Endp
Wskaznik Proc
mov ah,02h
mov bh,0
mov dh,13
mov dl,18
int 10h
mov ax,suma
add ax,czesc
mov suma,ax
shr ax,8
cmp ax,0
je nie_rysuj
mov cx,ax
mov ah,0ah
mov bh,0
mov al,219
mov bl,15
int 10h
nie_rysuj:
ret
Wskaznik Endp
Odbierz_pakiet Proc
mov ile_p,0
pakiet:
inc ile_p
lea di,tablica
mov xoor,0
mov cx,ile_w
jeden: push cx
call odbierz
pop cx
cmp bl,0
je ok_p
stosb
xor xoor,al
loop jeden
call odbierz
cmp bl,0
je ok_p
push ax
call Sprwadz_bufor
pop ax
cmp xoor,al
je dobrze_odeb
mov al,'z'
call wyslij
cmp ile_p,3
je ok_p
jmp pakiet
dobrze_odeb:
mov ah,40h
mov bx,uchwyt
lea dx,tablica
mov cx,ile_w
int 21h
jb blad_zapisu
mov al,'d'
call wyslij
ok_p:
ret
blad_zapisu:
call czysc_ekran
mov dh,1
lea cx,blad_z
call napis
mov ah,4ch
int 21h
Odbierz_pakiet Endp
Przesylaj Proc
mov dh,12
lea cx,skala
call napis
mov cx,40
mov ah,0ah
mov bh,0
mov al,176
mov bl,7
int 10h
xor dx,dx
mov bx,ile
mov ax,40*256
div bx
mov czesc,ax
mov ah,3ch
lea dx,nazwa
xor cx,cx
int 21h
mov uchwyt,ax
mov al,'g'
call wyslij
mov suma,0
dec ile
cmp ile,0
je od_reszte
od_pakiet_c:
mov ile_w,512
call odbierz_pakiet
cmp ile_p,3
je zla_transmisja
call wskaznik
dec ile
jne od_pakiet_c
od_reszte:
cmp reszta,0
je zamknij_plik
mov bx,reszta
mov ile_w,bx
call odbierz_pakiet
cmp ile_p,3
je zla_transmisja
call wskaznik
mov ah,02h
mov bh,0
mov dh,13
mov dl,18
int 10h
mov cx,40
mov ah,0ah
mov bh,0
mov al,219
mov bl,7
int 10h
mov dh,12
lea cx,ok
call napis
mov dh,13
lea cx,czysta
call napis
mov ah,3eh
mov bx,uchwyt
int 21h
mov ah,43h
mov al,01
lea dx,nazwa
xor cx,cx
mov cl,atrybut
int 21h
jmp koniec_bez
zla_transmisja:
mov dh,12
lea cx,no_ok
call napis
mov dh,13
lea cx,czysta
call napis
mov ah,41h
lea dx,nazwa
int 21h
zamknij_plik:
mov ah,3eh
mov bx,uchwyt
int 21h
koniec_bez:
ret
Przesylaj Endp
Sprawdz_telegram Proc
lea di,odp
mov ax,cs:[di]
cmp ah,1000b
jne nie_ma_pliku
mov atrybut,al
mov ax,cs:[di+2]
mov ile,ax
mov ax,cs:[di+4]
mov reszta,ax
call przesylaj
jmp koniec_spr_t
nie_ma_pliku:
mov dh,12
lea cx,brak_p
call napis
koniec_spr_t:
ret
Sprawdz_telegram Endp
Wyslij_n Proc
lea si,nazwa
wys_nazwe:
lodsb
cmp al,0
je end_w_nazwy
call wyslij
jmp wys_nazwe
end_w_nazwy:
call wyslij
lea di,odp
mov cx,6
tab_szesc:
push cx
call odbierz
pop cx
cmp bl,0
je brak_sygnalu
stosb
loop tab_szesc
call sprawdz_telegram
jmp koniec_wysylania
brak_sygnalu:
mov dh,12
lea cx,brak_s
call napis
koniec_wysylania:
ret
Wyslij_n Endp
Podaj Proc
mov dh,23
lea cx,wyjscie
call napis
mov dh,10
lea cx,czysta
call napis
mov dh,10
lea cx,podaj_d
call napis
lea di,nazwa
call czysc_tab
lea bp,nazwa
mov si,1
znak:
mov ah,08h
int 21h
cmp al,13
je powrot
cmp al,8
je kasuj
cmp al,27
je exit
cmp al,0
jne dobrze
mov ah,07h
int 21h
jmp znak
dobrze:
cmp al,33
jb znak
cmp al,127
ja znak
cmp si,13
jne nie_dod
mov si,12
mov ah,02h
mov bh,0
mov dh,10
mov dl,44
int 10h
nie_dod:
mov byte ptr cs:[bp+si-1],al
inc si
mov ah,06
mov dl,al
int 21h
jmp znak
kasuj:
dec si
cmp si,0
jne nie_zero
mov si,1
jmp znak
nie_zero:
mov ah,02h
mov bh,0
mov dh,10
mov dl,32
add dx,si
int 10h
mov ah,06
mov dl,' '
int 21h
mov ah,02h
mov bh,0
mov dh,10
mov dl,32
add dx,si
int 10h
mov byte ptr cs:[bp+si-1],0
jmp znak
powrot:
mov dh,10
lea cx,nzw_plk
call napis
mov dh,23
lea cx,text
call napis
ret
Podaj Endp
Exit Proc
call czysc_ekran
mov ah,4ch
int 21h
ret
Exit Endp
Czysc_ekran Proc
mov cx,25
czysc: push cx
mov ah,02h
mov bl,0
mov dl,0
mov dh,cl
dec dh
int 10h
mov al,' '
mov ah,0ah
mov bh,0
mov bl,15
mov cx,80
int 10h
pop cx
loop czysc
ret
Czysc_ekran Endp
Napis Proc
mov ah,02h
mov bh,0
mov dl,0
int 10h
mov dx,cx
mov ah,09h
int 21h
ret
Napis Endp
Kreska Proc
mov dl,poz
dec dl
shl dl,4
add dl,16
mov ah,02h
mov bh,0
mov dh,6
int 10h
mov al,205
mov ah,09h
mov bh,0
mov bl,zmienna
mov cx,10
int 10h
ret
Kreska Endp
Czyszczenie_portu Proc
mov dx,fb
mov al,00000011b
out dx,al
mov dx,fd
in al,dx
and al,00000001b
jz nic_nie_ma
mov dx,f8
in al,dx
nic_nie_ma:
ret
Czyszczenie_portu Endp
Inicjacja Proc
mov dx,fb
mov al,10000011b
out dx,al
mov dx,f8
mov al,1
out dx,al
mov dx,f9
mov al,0
out dx,al
call czyszczenie_portu
ret
Inicjacja Endp
Czysc_tab Proc
mov ax,0
mov cx,14
rep stosb
ret
Czysc_tab Endp
Sprwadz_bufor Proc
jeszczer_raz:
mov ah,0bh
int 21h
cmp al,0ffh
jnz nie_ma_klawisza
mov ah,08h
int 21h
cmp al,27
jnz jeszczer_raz
jmp exit
nie_ma_klawisza:
ret
Sprwadz_bufor Endp
Kod Ends
End Start
11. Wydruk programu: slave.
fb equ 03fbh
f8 equ 03f8h
f9 equ 03f9h
fd equ 03fdh
kod segment
assume cs:kod
inf1 db 10,13,'Oczekiwanie na przyjscie informacji, ESC - rezygnacja',10,13,'$'
inf2 db 'Odebrany plik: ','$'
brak_p db 10,13,'Brak pliku w biezacym katalogu',10,13,'$'
copy db 10,13,'Kopiuje plik ',10,13,'$'
skala db 10,13,' 0% 50% 100%',10,13,' $'
odstep db ' ','$'
pocz db 13,'$'
no_ok db 10,13,'Wystapily problemy z kopiowaniem, sprobuj jeszcze raz',10,13,'$'
ok db 10,13,'Plik skopiowany',10,13,'$'
tablica db 1025 dup(0)
nazwa db 14 dup(0)
odp dw 3 dup(0)
wh dw 0
wl dw 0
uchwyt dw 0
reszta dw 0
ile dw 0
suma dw 0
czesc dw 0
ile_w dw 0
ile_p dw 0
ile_b dw 0
bufor db 0
start:
push cs
pop ds
push cs
pop es
call czysc_ekran
mov ah,02
mov bh,0
mov dh,0
mov dl,0
int 10h
mov dx,fb
mov al,10000011b
out dx,al
mov dx,f8
mov al,1
out dx,al
mov dx,f9
mov al,0
out dx,al
mov dx,fb
mov al,00000011b
out dx,al
inny_p:
call czyszczenie_portu
call czysc_tab
mov ah,0ch
mov al,05
int 21h
lea dx,inf1
mov ah,09h
int 21h
lea di,nazwa
Czekaj:
in al,60h
cmp al,1
jne brak_k
jmp exit
Brak_k:
mov dx,fd
in al,dx
and al,00000001b
je czekaj
mov dx,f8
in al,dx
stosb
cmp al,0
jne czekaj
mov al,'$'
stosb
lea dx,inf2
mov ah,09h
int 21h
lea dx,nazwa
mov ah,09
int 21h
call sprawdzanie
jmp inny_p
call exit
;*****************************************************************
Wyslij Proc
push bx
mov dx,f8
out dx,al
mov ah,83h
mov al,0
lea bx,bufor
mov cx,0
mov dx,10000
int 15h
czekaj_wy:
mov dx,fd
in al,dx
and al,0100000b
cmp al,32
jne czekaj_wy
mov ah,83h
mov al,1
int 15h
pop bx
ret
Wyslij Endp
Odbierz Proc
mov bufor,0
mov ah,83h
mov al,0
lea bx,bufor
mov cx,0fh
mov dx,4000h
int 15h
czekaj_odb:
mov al,bufor
and al,10000000b
jz jeszcze_nie
mov ile_p,3
mov bl,0
push ax
jmp koniec_odb
jeszcze_nie:
mov dx,fd
in al,dx
and al,00000001b
jz czekaj_odb
mov dx,f8
in al,dx
mov bl,1
push ax
koniec_odb:
mov ah,83h
mov al,1
int 15h
pop ax
ret
Odbierz Endp
Wyslij_pakiet Proc
mov ile_p,0
mov ah,3fh
mov bx,uchwyt
lea dx,tablica
mov cx,ile_w
int 21h
pakiet:
inc ile_p
lea si,tablica
mov bx,si
add bx,ile_w
mov byte ptr cs:[bx],0
mov cx,ile_w
inc cx
jeden: push cx
lodsb
xor cs:[bx],al
call wyslij
pop cx
loop jeden
call odbierz
cmp bl,0
je ok_p
push ax
call sprwadz_bufor
pop ax
cmp al,'d'
je ok_p
cmp ile_p,3
je ok_p
jmp pakiet
ok_p:
ret
Wyslij_pakiet Endp
Kreska Proc
mov ax,suma
add ax,czesc
mov suma,ax
shr ax,8
cmp ax,0
je nie_rysuj
push ax
lea dx,odstep
mov ah,9h
int 21h
pop ax
mov cx,ax
mov ah,0ah
mov bh,0
mov al,219
mov bl,15
int 10h
lea dx,pocz
mov ah,9h
int 21h
nie_rysuj:
ret
Kreska Endp
Kopiowanie Proc
lea dx,skala
mov ah,9h
int 21h
mov cx,40
mov ah,0ah
mov bh,0
mov al,176
mov bl,7
int 10h
lea dx,pocz
mov ah,9h
int 21h
mov dx,wh
mov ax,wl
mov bx,512
div bx
add dx,512
mov reszta,dx
inc ax
mov cs:[di+2],ax
mov cs:[di+4],dx
mov ile,ax
xor dx,dx
mov bx,ax
inc bx
mov ax,40*256
div bx
mov czesc,ax
call wyslij_odp
call odbierz
cmp bl,0
je zla_transmisja
mov cx,ile
dec cx
mov suma,0
cmp cx,0
je ereszta
e512: push cx
mov ax,512
mov ile_w,ax
call wyslij_pakiet
pop cx
cmp ile_p,3
je zla_transmisja
push cx
call kreska
pop cx
loop e512
ereszta:
mov ax,reszta
mov ile_w,ax
call wyslij_pakiet
cmp ile_p,3
je zla_transmisja
lea dx,odstep
mov ah,9h
int 21h
mov cx,40
mov ah,0ah
mov bh,0
mov al,219
mov bl,7
int 10h
lea dx,ok
mov ah,9h
int 21h
jmp zamknij_plik
zla_transmisja:
lea dx,no_ok
mov ah,9h
int 21h
zamknij_plik:
mov ah,3eh
mov bx,uchwyt
int 21h
ret
Kopiowanie Endp
Wyslij_odp Proc
lea si,odp
mov cx,6
wys_odp: push cx
lodsb
call wyslij
pop cx
loop wys_odp
ret
Wyslij_odp Endp
Sprawdzanie Proc
mov ah,43h
mov al,0
lea dx,nazwa
int 21h
jb nie_ma
mov ah,1000b
lea di,odp
mov cs:[di],ax
mov ah,3dh
mov al,0
lea dx,nazwa
int 21h
mov uchwyt,ax
mov bx,ax
mov ah,42h
mov al,2
mov cx,0
mov dx,0
int 21h
mov wh,dx
mov wl,ax
mov ah,42h
mov al,0
mov cx,0
mov dx,0
int 21h
call kopiowanie
jmp koniec_spr
nie_ma:
mov ax,0
lea di,odp
mov cs:[di],ax
call wyslij_odp
lea dx,brak_p
mov ah,09h
int 21h
koniec_spr:
ret
Sprawdzanie Endp
Czysc_ekran Proc
mov cx,25
czysc: push cx
mov ah,02h
mov bl,0
mov dl,0
mov dh,cl
dec dh
int 10h
mov al,' '
mov ah,0ah
mov bh,0
mov bl,15
mov cx,80
int 10h
pop cx
loop czysc
ret
Czysc_ekran Endp
Czysc_tab Proc
lea di,nazwa
mov ax,0
mov cx,14
rep stosb
ret
Czysc_tab Endp
Exit Proc
mov ah,0ch
mov al,05
int 21h
mov ah,4ch
int 21h
Exit Endp
Czyszczenie_portu Proc
mov dx,fb
mov al,00000011b
out dx,al
mov dx,fd
in al,dx
and al,00000001b
jz nic_nie_ma
mov dx,f8
in al,dx
nic_nie_ma:
ret
Czyszczenie_portu Endp
Sprwadz_bufor Proc
jeszczer_raz:
mov ah,0bh
int 21h
cmp al,0ffh
jnz nie_ma_klawisza
mov ah,08h
int 21h
cmp al,27
jnz jeszczer_raz
jmp exit
nie_ma_klawisza:
ret
Sprwadz_bufor Endp
kod ends
end start
1
16