somewhere » 09 май 2008, 17:27
Основная ошибка - процедуре hook передавался параметр в DX хотя надо было в DI
Я не знаю как у вас тут "периодически" работало, т.к. работать вообще не должно было. Вот подправленый и рабочий код. Я убрал хук с клавы (для тестов не нужен был) и добавил индикатор записи для себя. А так вроде все
Код: Выделить всё
.model tiny
.386
.code
org 80h
cllen = $
org 82h
cldata = $
org 100h
; Main entry
main:
jmp init
; timer handler: saves screen every -time- ticks
timerhandler:
pusha
cmp cs : elapsed, 0
jz save
dec cs : elapsed
jmp @exitint
save:
in al, 21h
or al, 1
out 21h, al
call savescreen
in al, 21h
and al, not 1
out 21h, al
mov cs:elapsed, time
@exitint:
popa
jmp dword ptr cs : oldtimer
; kb handler: loads screen at Ctrl + L pressed
kbhandler:
push ax
in al, 60h
cmp al, 26h ; 'L' key
jne exitkbh
call loadscreen
exitkbh:
pop ax
jmp dword ptr cs : oldkb
; Saves screen to buffer
savescreen:
pusha
push ds
mov ax, 0B800h
mov ds, ax
mov word ptr ds:[0], 0F41h
mov ah, 3Ch
xor cx, cx
push cs
pop ds
mov dx, offset cldata
int 21h
jc ssexit
mov bx, ax
mov ah, 40h
mov cx, -1
push 0A000h
pop ds
xor dx, dx
int 21h
mov ah, 3Eh
int 21h
ssexit:
pop ds
popa
retn
; Loads screen from buffer
loadscreen:
; Resident data
oldtimer dw ?, ? ; original timer handler
oldkb dw ?, ? ; original kb handler
time = 18 ; save to a file every 3 seconds
elapsed dw time ; elapsed ticks
oldretaddr dw ?, ? ; used in INT 8 handler
; Initialization: set hooks and stay resident
init:
xor bx, bx
mov bl, byte ptr ds : [ offset cllen ]
test bx, bx
jz showusage
mov byte ptr ds : [ offset cldata - 1 + bx ], 0
; Set hook on timer
mov bx, 8
mov ax, offset timerhandler
mov di, offset oldtimer
call hook
; Set hook on keyboard
mov bx, 9
mov ax, offset kbhandler
mov dx, offset oldkb
;call hook
;call savescreen
; Stay resident
mov ah, 27h
mov dx, offset init
int 27h
showusage:
mov ah, 9
mov dx, offset usage
int 21h
retn
usage db 13, 10
db 'Resident screen saver', 13, 10
db 'Written by Draeden', 13, 10
db 13, 10
db 'Usage: rss filename', 13, 10
db ' filename - some file to keep the screen data', 13, 10
db 36
; Sets a hook on interrupt
;
; Arguments:
;
; BX = interrupt
; AX = new handler
; DI = ( dword ) place for old handler
hook:
push bx
push ds
push 0
pop ds
shl bx, 2
push dword ptr ds : [ bx ]
pop dword ptr cs : [ di ]
push cs
push ax
pop dword ptr ds : [ bx ]
pop ds
pop bx
retn
end main
Основная ошибка - процедуре hook передавался параметр в DX хотя надо было в DI
Я не знаю как у вас тут "периодически" работало, т.к. работать вообще не должно было. Вот подправленый и рабочий код. Я убрал хук с клавы (для тестов не нужен был) и добавил индикатор записи для себя. А так вроде все
[code]
.model tiny
.386
.code
org 80h
cllen = $
org 82h
cldata = $
org 100h
; Main entry
main:
jmp init
; timer handler: saves screen every -time- ticks
timerhandler:
pusha
cmp cs : elapsed, 0
jz save
dec cs : elapsed
jmp @exitint
save:
in al, 21h
or al, 1
out 21h, al
call savescreen
in al, 21h
and al, not 1
out 21h, al
mov cs:elapsed, time
@exitint:
popa
jmp dword ptr cs : oldtimer
; kb handler: loads screen at Ctrl + L pressed
kbhandler:
push ax
in al, 60h
cmp al, 26h ; 'L' key
jne exitkbh
call loadscreen
exitkbh:
pop ax
jmp dword ptr cs : oldkb
; Saves screen to buffer
savescreen:
pusha
push ds
mov ax, 0B800h
mov ds, ax
mov word ptr ds:[0], 0F41h
mov ah, 3Ch
xor cx, cx
push cs
pop ds
mov dx, offset cldata
int 21h
jc ssexit
mov bx, ax
mov ah, 40h
mov cx, -1
push 0A000h
pop ds
xor dx, dx
int 21h
mov ah, 3Eh
int 21h
ssexit:
pop ds
popa
retn
; Loads screen from buffer
loadscreen:
; Resident data
oldtimer dw ?, ? ; original timer handler
oldkb dw ?, ? ; original kb handler
time = 18 ; save to a file every 3 seconds
elapsed dw time ; elapsed ticks
oldretaddr dw ?, ? ; used in INT 8 handler
; Initialization: set hooks and stay resident
init:
xor bx, bx
mov bl, byte ptr ds : [ offset cllen ]
test bx, bx
jz showusage
mov byte ptr ds : [ offset cldata - 1 + bx ], 0
; Set hook on timer
mov bx, 8
mov ax, offset timerhandler
mov di, offset oldtimer
call hook
; Set hook on keyboard
mov bx, 9
mov ax, offset kbhandler
mov dx, offset oldkb
;call hook
;call savescreen
; Stay resident
mov ah, 27h
mov dx, offset init
int 27h
showusage:
mov ah, 9
mov dx, offset usage
int 21h
retn
usage db 13, 10
db 'Resident screen saver', 13, 10
db 'Written by Draeden', 13, 10
db 13, 10
db 'Usage: rss filename', 13, 10
db ' filename - some file to keep the screen data', 13, 10
db 36
; Sets a hook on interrupt
;
; Arguments:
;
; BX = interrupt
; AX = new handler
; DI = ( dword ) place for old handler
hook:
push bx
push ds
push 0
pop ds
shl bx, 2
push dword ptr ds : [ bx ]
pop dword ptr cs : [ di ]
push cs
push ax
pop dword ptr ds : [ bx ]
pop ds
pop bx
retn
end main
[/code]