Code: Select all
;----------------------------------------------------
; Программа слизывания текста с экрана |
; в режиме 80*25 при нажатии F1. |
; Считывание производится в файл C:\OUT. |
; Файл C:\OUT должен быть создан! |
;----------------------------------------------------
; Чрезвычайно капризная программа ! |
;----------------------------------------------------
CODESG SEGMENT PARA 'CODE'
ASSUME CS:CODESG,ds:codesg,ss:codesg
ORG 100H
BEGIN: JMP INIT
;------------- ДАННЫЕ -------------------------------
xmax equ 80
ymax equ 25
kbsave dd ?
file db 'c:\out',0
handle dw ?
pag db ?
x db 0
y db 0
x_old db ?
y_old db ?
string db xmax dup(' ')
db 13,10
job db 0
;-------------TRRRRRRR------------------------
TRRR proc near
in al,61h
and al,11111110b
or al,00000010b
out 61h,al
mov cx,1000
ll0: loop ll0
and al,11111101b
out 61h,al
ret
TRRR endp
;------------ ПРЕРЫВАЮЩАЯ ПРОГРАММА ----------
INTER PROC near
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH SI
PUSH DI
PUSH DS
PUSH ES
PUSH BP
PUSHF
cmp job,1
jnz beg
jmp exi
beg: in al,60h ; port 60h, keybd scan or sw1
cmp al,59 ; -------F1--------
je otkr ; Jump if not equal
jmp exit
erro: jmp err
;----------------------------------------
otkr: mov job,1
in al,61h
push ax
or al,80h
out 61h,al
pop ax
out 61h,al
mov al,20h
out 20h,al
sti
;-------
mov ax,cs
mov ds,ax
mov ah,3dh ; Открытие файла
mov al,1
lea dx,file
int 21h
jc erro
mov handle,ax ; Позициирование в конец файла
mov ax,4202h
mov bx,handle
mov cx,0
mov dx,0
int 21h
mov ah,0fh ; Чтение номера видеостраницы
int 10h
mov pag,bh ; Запомнить положение курсора
mov ah,3
int 10h
mov x_old,dl
mov y_old,dh
mov x,0
mov y,0
loo: mov ah,2 ; Установка курсора в (x,y)
mov bh,pag
mov dl,x
mov dh,y
int 10h
mov ah,8 ; Чтение символа в al
mov bh,pag
int 10h
mov bh,0
mov bl,x
mov string[bx],al
inc x
call trrr
cmp x,xmax
jnz loo
mov ah,40h ; Запись в файл
mov bx,handle
mov cx,xmax+2
lea dx,string
int 21h
jc err
cmp ax,xmax+2
jne err
mov x,0
inc y
cmp y,ymax
jnz loo
jmp ex
;--------------------------------------------
err: int 10h
in al,61h
and al,11111110b
mov bx,200
bee1: or al,00000010b
out 61h,al
mov cx,3000
l01: loop l01
and al,11111101b
out 61h,al
mov cx,3000
l11: loop l11
dec bx
jnz bee1
;----------------------------
ex: mov ah,3eh
mov bx,handle
int 21h
mov ah,2
mov bh,pag
mov dl,x_old
mov dh,y_old
int 10h
;--------------------------
mov job,0
POPF
POP BP
POP ES
POP DS
POP DI
POP SI
POP DX
POP CX
POP BX
POP AX
iret
;--------------------------
exit: mov job,0
exi: POPF
POP BP
POP ES
POP DS
POP DI
POP SI
POP DX
POP CX
POP BX
POP AX
jmp dword ptr cs:[kbsave]
INTER ENDP
;------------ ИНИЦИАЛИЗАЦИЯ --------------------
INIT PROC NEAR
CLI
mov ah,35h
mov al,9
int 21h
mov word ptr kbsave,bx
mov word ptr kbsave+2,es
mov ah,25h
mov al,9
mov dx,offset inter
int 21h
STI
MOV DX,OFFSET INIT
INT 27H ; Создание резидента
INIT ENDP
CODESG ENDS
END BEGIN