Floppy Disk I/O What's Wrong?
Posted: Sat Jul 06, 2002 11:00 pm
The Code:
Uses NASM
This code is run in PMode
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
mov dx, 0x03F2
mov al, 00010100b
out dx, al ; turn motor on
mrqloopa:
mov dx, 0x03F4
in al, dx
and al, 0xC0
cmp al, 0x80
jne short mrqloopa
mov dx, 0x03F5
mov al, 00000011b
out dx, al ; set timings
mov al, 11110001b
out dx, al ; Step Rate (1ms) | Head Unload Time (16ms)
mov al, 00000011b
out dx, al ; Head Load Time (2ms) | non-DMA (true)
mrqloopb:
mov dx, 0x03F4
in al, dx
and al, 0xC0
cmp al, 0x80
jne short mrqloopb
mov dx, 0x03F5
mov al, 00001111b
out dx, al ; Seek
mov al, 00000000b
out dx, al ; x x x x x Head Dr1 Dr0
mov al, 00000000b
out dx, al ; Cylinder 0
mrqloopc:
mov dx, 0x03F4
in al, dx
and al, 0xC0
cmp al, 0x80
jne short mrqloopc
mov dx, 0x03F5
mov al, 00001000b
out dx, al ; Check Interrupt Status
in al, dx
test al, 80h
in al, dx
jnz short $
seek_ok:
mov dx, 0x03F5
mov al, 01000110b
out dx, al ; read sector
mov al, 00000000b
out dx, al ; x x x x x Head DR1 DR0
mov al, 0
out dx, al ; Cylinder
mov al, 0
out dx, al ; Head
mov al, 1
out dx, al ; Sector Number
mov al, 02h
out dx, al ; Sector Size (Bytes per Sector)
mov al, 18
out dx, al ; Track Length
mov al, 27
out dx, al ; Length of GAP3
mov al, 0FFh
out dx, al ; Data Length
mov ecx, 0
iloopa:
mov dx, 0x03F5
mov al, 00001000b
out dx, al ; Check Interrupt Status
in al, dx
test al, 80h
in al, dx
jnz short iloopa
in al, dx
inc ecx
inc ecx
mov byte [gs:0xB8000 + ecx], al
jmp short iloopa
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Uses NASM
This code is run in PMode
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
mov dx, 0x03F2
mov al, 00010100b
out dx, al ; turn motor on
mrqloopa:
mov dx, 0x03F4
in al, dx
and al, 0xC0
cmp al, 0x80
jne short mrqloopa
mov dx, 0x03F5
mov al, 00000011b
out dx, al ; set timings
mov al, 11110001b
out dx, al ; Step Rate (1ms) | Head Unload Time (16ms)
mov al, 00000011b
out dx, al ; Head Load Time (2ms) | non-DMA (true)
mrqloopb:
mov dx, 0x03F4
in al, dx
and al, 0xC0
cmp al, 0x80
jne short mrqloopb
mov dx, 0x03F5
mov al, 00001111b
out dx, al ; Seek
mov al, 00000000b
out dx, al ; x x x x x Head Dr1 Dr0
mov al, 00000000b
out dx, al ; Cylinder 0
mrqloopc:
mov dx, 0x03F4
in al, dx
and al, 0xC0
cmp al, 0x80
jne short mrqloopc
mov dx, 0x03F5
mov al, 00001000b
out dx, al ; Check Interrupt Status
in al, dx
test al, 80h
in al, dx
jnz short $
seek_ok:
mov dx, 0x03F5
mov al, 01000110b
out dx, al ; read sector
mov al, 00000000b
out dx, al ; x x x x x Head DR1 DR0
mov al, 0
out dx, al ; Cylinder
mov al, 0
out dx, al ; Head
mov al, 1
out dx, al ; Sector Number
mov al, 02h
out dx, al ; Sector Size (Bytes per Sector)
mov al, 18
out dx, al ; Track Length
mov al, 27
out dx, al ; Length of GAP3
mov al, 0FFh
out dx, al ; Data Length
mov ecx, 0
iloopa:
mov dx, 0x03F5
mov al, 00001000b
out dx, al ; Check Interrupt Status
in al, dx
test al, 80h
in al, dx
jnz short iloopa
in al, dx
inc ecx
inc ecx
mov byte [gs:0xB8000 + ecx], al
jmp short iloopa
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;