Драйвер жесткого диска

Страница 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.