Написание драйверов, Для символьных устройств
Гружу Win98, запускаю NC, ввожу COPY CON JJ, и ввожу символы, жму ctrl+z, и ничего у меня не выводится, хотя файл JJ тоже не создается.. подскажите, плз, где тут ошибка?
Текст драйвера:
code segment
driv proc far
ASSUME CS:code
dd -1
dw 8000h
dw strategy
dw interrupt
db 'JJ '
strategy proc far
mov CS:req_off,BX
mov CS:req_seg,ES
retf
req label dword
req_off DW ?
req_seg DW ?
strategy endp
interrupt proc far
push ES
push DS
push AX
push BX
push CX
push DX
push SI
push DI
push BP
mov AX,CS:req_seg
mov ES,AX
mov BX,CS:req_off
mov AL, ES:[BX]+2
shl AL, 1
sub AH, AH
mov DI, AX
jmp CS:[TABLE+DI]
TABLE dw init
dw check_media
dw make_bpb
dw ioctl_in
dw input
dw nondestruct_in
dw input_status
dw clear_input
dw output_data
dw output_verify
dw output_status
dw clear_output
dw ioctl_out
dw Device_open
dw Device_close
dw Removable_media
dw 8 dup(exit)
output_data:
check_media:
make_bpb:
ioctl_in:
nondestruct_in:
input_status:
clear_input:
output_verify:
output_status:
clear_output:
ioctl_out:
Removable_media:
Device_open:
Device_close:
exit:
or ES:word ptr [BX]+3,8003h
jmp quit
input:
mov cx,[bx+18] ;сохранение в сх числа байт для ввода
push ds
lds si,[bx+14] ;в DS:SI - указатель на буфер данных
;вывод на экран символов (кроме цифр), переданных в устройство MYDRV
end_lp: ;начало цикла
lodsb ;загрузить в al байт, на
;который указывает si и увеличить si на единицу
push ax ;сохранение ах в стеке
sub al,30h ;значение в al уменьшается на 30h
cmp al,9 ;выбираются ASCII коды, превышающие 39h
jle m2 ;переход к m2 если это условие не выполняется
add al,30h ;восстановление прежнего значения в al
mov dl,al ;ASCII код символа из а1 в dl
mov ah,2 ;номер функции (2) в ah
int 21h ;вызов прерывания 21h
m2:рор ах ;восстановление значения ах из стека
loop end_lp ;конец очередной итерации цикла
;при наличии в al символа возврата каретки осуществляется
;переход па новую строку
cmp al,13 ;сравнение значения в al с числом 13
jne m3 ;если не равно, то переход к метке тЗ
mov dl,10 ;в dl число 10 - перевод строки
mov ah,2 ;номер функции (2) в ah
int 21h ;вызов прерывания 21h
m3: ;метка m3
pop ds
jmp quit
quit:
or ES:word ptr [BX]+3,100h
pop BP
pop DI
pop SI
pop DX
pop CX
pop BX
pop AX
pop DS
pop ES
retf
enddrv:
init:
mov word ptr ES:[BX+14],offset enddrv
mov word ptr ES:[BX+16],CS
push CS
pop DS
mov AH, 9
mov DX, offset initstr
int 21h
mov ax, 0
int 16h
jmp quit
initstr db 'Press Any Key...', 10,13,'$'
interrupt endp
driv endp
code ends
end