43
« am: 11. December 2005, 17:06 »
Hi!
Das Ding heißt Intel 82078 Floppy Controller. Ich hab mal angefangen einen Treiber für zu schreiben.
; Driver for Intel 82078 Floppy Controller
; (C)Copyright 2004 by NucleusKL Team & Authors
; Authors: Christian Lins
; Published under GPL - General Public License
; Last change: 17.02.2004
;; Primary
Port0SRB db 3F1h ; R/W Status Register B
Port0DOR db 3F2h ; R/W Digital Output Register
Port0TDR db 3F3h ; R/W Tape Drive Register
Port0MSR db 3F4h ; R Main Status Register
Port0DSR db 3F4h ; W Data Rate Select Register
Port0FIFO db 3F5h ; R/W Data (FIFO)
Port0DIR db 3F7h ; R Digital Input Register
Port0CCR db 3F7h ; W Configuration Control Register
;; Secondary
Port1SRB db 371h ; R/W Status Register B
Port1DOR db 372h ; R/W Digital Output Register
Port1TDR db 373h ; R/W Tape Drive Register
Port1MSR db 374h ; R Main Status Register
Port1DSR db 374h ; W Data Rate Select Register
Port1FIFO db 375h ; R/W Data (FIFO)
Port1DIR db 377h ; R Digital Input Register
Port1CCR db 377h ; W Configuration Control Register
ActiveDrive dw 0000h ; Nummer des aktiven Laufwerks
;; Initialisiert den FC82078
_fc82078_init:
; Paramter ActiveDrive 0, 1, 2, 3
pop ax ;ActiveDrive
call _fc82078_read_msr
; Bit 2 im DOR für Reset setzen
mov dx, Port0DOR
mov al, 00000100b
out dx, al
call _fc82078_read_msr
ret
;; Aktiviert den Motor des aktiven Laufwerks
_fc82078_motor_on:
mov dx, Port0DOR
mov al, 00010000b
out dx, al ; TODO: Drive 0 gewählt, ActiveDrive sollte gewählt werden
call _fc82078_read_msr
push 0
ret
;; Deaktiviert den Motor des aktiven Laufwerks
_fc82078_motor_off:
mov dx, Port0DOR
mov al, 0x0
out dx, al ; TODO: Drive 0 gewählt, ActiveDrive sollte gewählt werden
call _fc82078_read_msr
push 0
ret
;; Wählt die Übertragungsgeschwindigkeit
_fc82078_datarate:
push ax
mov dx, Port0DSR
mov al, 00000010b
out dx, al ; TODO: 250 kbps gewählt, andere Geschwindigkeiten sollten möglich sein
push 0
ret
;; Liest das Status Register und speichert es in al
_fc82078_read_msr:
xor al, al
mov dx, Port0MSR
in al, dx
;mov MSR, al
ret
;; Liest 16 Bytes aus dem FIFO (ohne DMA)
_fc82078_read_fifo:
mov dx, Port0FIFO
__readfifo_loop:
in al, dx ; Liest ein Byte
mov ah, al
in al, dx ; Liest noch ein Byte
push ax ; Speichert das Word auf dem Stack
call _fc82078_read_msr
cmp al, 80h ; Vergleicht ob das Lesen nun zu Ende ist
jne __readfifo_loop
push 0
ret
;; Schreibt 16 Bytes in das FIFO Register (ohne DMA)
_fc82078_write_fifo:
mov dx, Port0FIFO
__writefifo_loop:
pop ax
xchg al, ah
out dx, al
xchg al, ah
out dx, al
call _fc82078_read_msr
cmp al, 80h
jne __writefifo_loop
push 0
ret
;; Schreibt einen Befehl
Zumindest das Anschalten und Ausschalten sollte funktionieren. Vielleicht hilft dir das.
C#ris