Драйвер жесткого диска
Рефераты >> Программирование и компьютеры >> Драйвер жесткого диска

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


Страница: