Драйвер жесткого дискаРефераты >> Программирование и компьютеры >> Драйвер жесткого диска
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