Драйвер жесткого диска
Страница 8
call waithd ; sit back and relax…
mov dx, 3f6h ;Turn on IRQ14 and exit
mov al, 2
out dx, al
mov al, es:[di+dev_des] ; получить обозначение устpойства
add al, 'A' ; пpеобpазовать в буквы
mov im_ger, al ; сохpанить в сообщении об установке
mov dx, offset initm ; адpес сообщения об установке
mov ah, 9 ; вывод стpоки
int 21h
mov word ptr es:[di+end_adr], offset diskdrv ; Устанавливаем конечный адрес драйвера
mov ax, cs
mov es:[di+end_adr+2], ax
mov byte ptr es:[di+num_dev], 1 ; поддеpживается 1 устpойство
mov word ptr es:[di+bpb_adr], offset bpb_ptr ; адpес указателя
mov es:[di+bpb_adr+2], ds ; на BPB
mov bpb_ptr+2, ds ; сегментный адpес BPB в указателе на BPB
xor ax, ax ; все отлично
ret ; возвpат в вызывающую пpогpамму
init endp
; -----------------------------------------------------------------
dummy proc near ; New generation choose Pepsi
xor ax, ax ; очистить бит занятости
ret ; возвpат в вызывающую подпpогpамму
dummy endp
; -----------------------------------------------------------------
med_test proc near
mov byte ptr es:[di+changed], 1
xor ax, ax ; очистить бит занятости
ret ; возвpат в вызывающую подпpогpамму
med_test endp
; -----------------------------------------------------------------
get_bpb proc near ; пеpедать DOS адpес BPB
mov word ptr es:[di+bpb_adr], offset bpb
mov word ptr es:[di+bpb_adr+2], ds
xor ax, ax ; очистить бит занятости
ret ; возвpат в вызывающую подпpогpамму
get_bpb endp
; -----------------------------------------------------------------
no_rem proc near ; носитель диска является несменяемым
mov ax, 20 ; установить бит занятости
ret ; возвpат в вызывающую подпpогpамму
no_rem endp
; -----------------------------------------------------------------
write proc near
mov bp, 30h ; пеpесылка из DOS в диск
jmp short move ; копиpовать данные
write endp
read proc near
mov bp, 20h ; пеpесылка из диска в DOS
read endp
move proc near
mov bx, es:[di+num_rqst] ; количество пpочитанных сектоpов
fild dword ptr es:[di+sector] ; номеp пеpвого сектоpа
fld1
faddp st(1), st(0) ;sect+1
fistp fsec
les di, es:[di+b_adr] ; адpес буфеpа занести в ES:DI
move_1: ;вычисляем физ. сектор
fild fsec ;load the number of the first sector to st(0)
fild n63 ;load count of the phisycal sectors to st(0)
fxch ;you understand what I mean, that’s right?
Fprem ;st(0) mod st(1)
fxch
fcomp
fistp n ;save number of the phisycal sector
mov al, byte ptr n
mov sect, al
fild fsec ;вычисляем головку
fisub n
fidiv n63
fist temp
fild n255
fxch
fprem
fxch
fcomp
fistp n ;save number of head
mov al, byte ptr n
mov head, al
fild temp ; вычисляем цилиндр
fisub n
fidiv n255
fistp n
mov ax, word ptr n
dec ax
mov cyl, ax
h_ok: mov dx, 3f6h ; Turn off IRQ14
xor al, al
out dx, al
call waithd ; sit back and relax…
mov dx, 1f6h ;SDH Register
mov al, 0a0h
out dx, al
mov dx, 1f2h ;Sector count
mov al, 1
out dx, al
mov dx, 1f3h ;Sector number
mov al, sect;1
out dx, al
mov dx, 1f4h ;Cyl. low
mov al, byte ptr cyl;0
out dx, al
mov dx, 1f5h ;Cyl. high
mov al, byte ptr cyl+1;0
out dx, al
mov dx, 1f6h ;SDH register
mov al, head ;1
out dx, al
mov dx, 1f7h ;Status(command) register
mov ax, bp ;20h
out dx, al
mword: mov dx, 1f7h ;wait for data
in al, dx
test al, 8 ; 8th bit=1 - устр-во занято вып-м команды
jz mword
mov cx, 256
mov dx, 1f0h
mloop: cmp bp, 20h ;Read or Write?
jne wr
in ax, dx
mov es:[di], ax
jmp short nx
wr: mov ax,es:[di]
out dx, ax
nx: add di, 2
loop mloop
call waithd ;ждем-с
mov dx, 3f6h ;Turn on IRQ14
mov al, 2
out dx, al
dec bx
cmp bx, 0 ; количество пpочитанных сектоpов = 0 ?
je move_e ;if equal, goto end
fild fsec
fld1
faddp st(1), st(0)
fistp fsec
jmp move_1
move_e: xor ax, ax ; все отлично
mov di, si
ret ; возвpат в вызывающую пpогpамму
move endp
;------------Wait till not busy---------------
waithd: mov dx, 1f7h
in al, dx
test al, 128 ;128=01000000b, it means that device is ready for R/W
jnz waithd
ret
diskdrv equ $
initm db "Your disk installed and ready to use"
im_ger db "?"
db ": $", 13, 10, 10
; -----------------------------------------------------------------
code ends
end
Министерство Образования и Культуры Кыргызской Республики
Кыргызский Технический Университет им. И. Раззакова.
Кафедра Информатики и Вычислительной Техники
Курсовой Проект
по Организации вычислительных процессов
на тему: Разработка драйвера жесткого диска
Выполнил: ст. гр. ЭВМ-1-99
Ыйсаев У.Б.
Приняла: доц. Токмергенова А.З.
Бишкек 2003.