rendered paste bodyassume 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