Read from Floppy
Posted: Mon Aug 21, 2006 7:02 pm
Why I can't Read some from Floppy
I want read the first sector's data to 0x500 in the code,But It refuse work.
In Protect mode I call by this:
the Floppy.inc:
Why?[/code]
I want read the first sector's data to 0x500 in the code,But It refuse work.
In Protect mode I call by this:
Code: Select all
Call FloppyReset
Call FloppyReadSector
Code: Select all
;**********************************************************
;Floppy.
;**********************************************************
FdcDor equ 0x3f2
FdcMsr equ 0x3f4
FdcData equ 0x3f5
FloppyReset: ;reset
pusha
xor ax,ax
mov dx,0x3f2
push dx
out dx,ax
mov dx,0x3f4;7
out dx,ax
pop dx
mov al,0x0c
out dx,al
Call Wait_Interrupt_Fdc ;wait interrupt
mov ax,0x03 ;FD_SPECIFY
Call Floppy_SendByte ;If error then al=0
mov ax,0xDF
Call Floppy_SendByte
mov ax,0x02 ;
Call Floppy_SendByte
popa
ret
Wait_Interrupt_Fdc:
mov ecx,0xFFFF ;in time
Wait_loop1:
mov al,[FdcInt1]
Cmp al,0x01
jz Interrupt_OK
Loop Wait_loop1
Interrupt_OK:
ret
;**********************************************************
;Send data
;**********************************************************
Floppy_SendByte:
push ax
mov ecx,0xFFFF
Wait_Send_Loop:
mov dx,FdcMsr
in al,dx
and al,0xc0
cmp al,0x80
jz FSendBegin
mov dx,0x80
in al,dx
loop Wait_Send_Loop
pop ax
xor al,al
jmp Result_Send
FSendBegin:
pop ax
mov dx,FdcData
out dx,ax
xor al,al
inc al
Result_Send:
ret
FloppyTurnOn:
mov dx,FdcDor
mov ax,0x1c
out dx,ax
mov cx,0xff
SleepTurnOn:
nop
loop SleepTurnOn
ret
FloppyTurnOff:
mov dx,FdcDor
mov ax,0x0c
out dx,ax
ret
FloppySeekTrace:
push ax
mov ax,0x7
Call Floppy_SendByte
xor ax,ax
Call Floppy_SendByte
pop ax
Call Floppy_SendByte
mov cx,0xff
SleepSeekTrace:
nop
loop SleepSeekTrace
ret
DMAOpen:
mov dx,0x0A
mov ax,0x06
out dx,ax
mov dx,0x0C
xor ax,ax
out dx,ax ;stop DMA
mov dx,0x0B ;0a or 0b
mov ax,0x46 ;read 0x46,write 0x4A
out dx,ax
mov dx,0x04
xor ax,ax
out dx,ax ;addr
mov ax,0x05
out dx,ax ;addr 0x500
mov dx,0x81
xor ax,ax
out dx,ax ;addr
mov dx,0x05
xor ax,ax
out dx,ax
mov ax,0x02 ; read 512B
out dx,ax
mov dx,0x0A
mov ax,0x02
out dx,ax
ret
DMAClose:
mov dx,0xa
mov ax,0x6
out dx,ax
mov dx,0xc
xor ax,ax
out dx,ax
ret
;**********************************************************
;read
;**********************************************************
FloppyReadSector:
cli
Call FloppyTurnOn
xor ax,ax
Call FloppySeekTrace
Call DMAOpen
mov ax,0x66
Call Floppy_SendByte
mov ax,0x05
Call Floppy_SendByte
xor ax,ax
Call Floppy_SendByte
xor ax,ax
Call Floppy_SendByte
xor ax,ax
inc ax
Call Floppy_SendByte
mov ax,0x2
Call Floppy_SendByte
mov ax,18
Call Floppy_SendByte
mov ax,27
Call Floppy_SendByte
mov ax,0xFF
Call Floppy_SendByte
sti
xor al,al
mov [FdcInt1],al
Call Wait_Interrupt_Fdc
Call DMAClose
Call FloppyTurnOff
ret
Why?[/code]