assume cs:kod, ds:dane dane segment witaj db 10,13,"Wcicnij 'P' aby pobrac ekran, lub 'Z' aby zakonczyc. $" ent db 10,13,"$" buforek db 4000 dup(0) ekrsave db 4000 dup(0) dane ends kod segment START: mov dx, dane mov ds, dx ;adres segmentu danych do ds jmp GO ;=============================================================================== USTAW proc mov dx, 2e1h ;rejestr rozkazow mov al, 00001101b ;define configuration, konfiguracja, dlugie i krotkie pakiety (000c101 - define configuration , c = dlugie i krotkie ; [jesli 1] out dx, al mov al, 00011110b ;clear flag, zerowanie rejestru stanu (000rp110 - zerowanie flag, r - wyzerowanie bitu POR, p - recon) out dx, al ret endp ;=============================================================================== ;=============================================================================== WYSLIJ proc push es push di mov bx, 0d000h mov es, bx mov di, 0 mov es:[di], 10000000b ;adres nadawcy pakietu mov es:[di+1], 01000000b ;adres odbiorcy pakietu mov es:[di+2], 0 mov es:[di+3], 5 mov es:[di+4], "*" CZEKAJ: mov dx, 2e0h ;rej stanu in al, dx and al, 00000001b ;sprawdz czy TA=1 (zdolny do przeslania) jz CZEKAJ mov dx, 2e1h mov al, 00000011b out dx, al pop di pop es ret endp ;=============================================================================== ;=============================================================================== ODBIERZ proc mov al, 00000100b ;Enable Receive To Page nn=00b out dx, al mov dx, 2e0h ;rej stanu CZEKAJ: in al, dx and al, 10000000b ;spr czy RI=1 (w buforze RAM jest już przekazana paczka) jz CZEKAJ JUZ: push si mov si, 5 add di, 500 mov ax, 0d000h mov ds, ax mov ax, dane mov es, ax push cx mov cx, 500 rep movsb pop cx pop si ret endp ;=============================================================================== ;=============================================================================== POKA proc ;pokazuje ekran push ds mov dx, dane ;adres bloku danych mov es, dx lea di, ekrsave call SCRTOMEM mov dx, dane mov ds, dx lea si, buforek call MEMTOSCR mov ah, 08h ;przerwanie - pobiera 1 klawisz, ale nie pokazuje na ekranie tego co wciskamy int 21h ;czekamy na wcisniecie klawisza... mov dx, dane ;Adres bloku danych mov ds, dx ;jw. lea si, ekrsave ;offset do ekrsave call MEMTOSCR ;ladujemy stan ekranu z SCRCPY pop ds ret endp ;=============================================================================== ;=============================================================================== MEMTOSCR proc ;z ds:si do pamieci ekranu push ds mov cx, 4000 ;4000 Bajtow - caly ekran mov dx, 0b800h ;pamiec ekranu mov es, dx ;pamiec ekranu ekranu jako zrodlo mov di, 0 ;offset 0 rep movsb ;kopiujemy pop ds ret endp ;=============================================================================== ;=============================================================================== SCRTOMEM proc ;Pamiec ekranu do pamici pod adres es:di push ds ;zapisz adres DS mov cx, 4000 ;4000 Bajtow - caly ekran mov dx, 0b800h ;pamiec ekranu mov ds, dx ;pamiec ekranu ekranu jako zrodlo mov si, 0 ;offset 0 rep movsb ;kopiujemy pop ds ;wczytaj adres DS ret endp ;=============================================================================== ;=============================================================================== GO: mov ah, 09h lea dx, witaj int 21h mov ah, 01h ;funkcja pobierajaca/wyswietlajaca wcisniety klawisz int 21h cmp al, "z" jz KONIEC cmp al, "Z" jz KONIEC cmp al, "p" jz POCZATEK cmp al, "P" jz POCZATEK jmp GO POCZATEK: call USTAW mov cx, "*" call WYSLIJ push di lea di, buforek sub di, 500 mov cx, 8 odb500: call ODBIERZ loop odb500 pop di call POKA KONIEC: mov ah, 09h lea dx, ent int 21h mov ah, 01h int 21h mov ax, 4c00h int 21h kod ends end start