GELÖST: FDC Programmierung in VirtualPC - Noch eine Frage :)



  • Hallo zusammen,

    ich habe ein paar Versuche in der Programmierung des Floppy Controllers
    unter VirtualPC unternommen.

    Nun habe ich auch hier im Forum über einige Probleme gelesen die bei virtuellen
    Maschinen aufgetreten sind.

    Mein Programm:

    Auslesen der Konfiguration des FDC:

    Controller über DOR aktivieren
    Hauptstatusregister lesen und prüfen ob der FDC Daten annehmen kann
    Befehl an Datenregister senden
    Hauptstatusregister lesen und prüfen ob der FDC Daten ausgeben möchte
    Datenregister 7x mit einem IN Befehl auslesen (7 Ergebnisbytes)

    ;	Controller aktivieren
    	mov al, 00000100b
    	mov dx, 3f2h		;ins DOR ausgeben
    	out dx, al
    
    	mov dx, 3f4h
    dio_ok1:
    	xor ax, ax
    	in al, dx
    	and al, 64d
    	or al, al
    	jnz dio_ok1	;Wenn DIO Bit gelöscht dann weiter
    
    	;Befehl zur Konfig absenden
    	mov dx, 3f5h
    	mov al, 00001111b
    	out dx, al
    
    	mov dx, 3f4h
    dio_ok2:
    	xor ax, ax
    	in al, dx
    	and al, 64d
    	or al, al
    	jz dio_ok2		;Wenn DIO Bit gesetzt dann weiter
    
    	mov dx, 3f5h		;Datenregister
    	mov bx, datenbyte	;offset datenbyte nach BX
    	mov cx, 7d		;7 Durchläufe da 7 Byte zurückgegeben werden
    einlesen:
    	in al, dx
    	mov byte [bx], al
    	inc bx
    	dec cx
    	nop
    	nop
    	nop
    	nop
    	jnz einlesen
    
    	xor ax, ax
    	xor bx, bx
    	xor cx, cx
    	xor dx, dx
    
    ; ab hier erfolgt die Ausgabe der 7 Byte auf dem Schirm als Zahl!
    ;PRINT ist eine Routine um Registerwerte in ASCII umzuwandeln	
    	mov bx, datenbyte
    	mov cx, 7d
    ausgabe:
    	mov al, byte [bx]
    	and ax, 0ffh
    	push cx
    	push dx
    	call PRINT
    	pop dx
    	pop cx
    	inc bx
    	dec cx
    	jnz ausgabe
    
    ; Controller deaktivieren	
    	xor ax, ax
    	mov dx, 3f2h		;ins DOR ausgeben
    	out dx, al
    
    ende:
    		sti
    		mov ax, 4C00h
    		int 21h
    

    Nach dem senden des Befehls wird das Busy-Bit (Befehl = aktiv) gesetzt
    und dann passiert nichts mehr im Controller, das Programm hängt in der Abfrage-
    schleife fest.

    Ist das ein bekannstes Problem bei virtuellen PC's?
    Würde ein "echtes" Laufwerk im PC abhilfe schaffen, was dann verbunden wird?

    Wenn ich das Prüfen auf Daten im FDC einfach überspringe (Zeilen 7-13
    und 22-28) und nach dem Senden des Befehls einfach
    das Datenregister auslese, erhalte ich auch 7 unterschiedliche Bytes die durchaus
    die Konfiguration enthalten könnten nach ihrem Aufbau. Das ist aber nicht der
    richtige Weg.

    Falls jemand einen Tipp hat wäre ich wie immer sehr dankbar

    Nicky



  • Nach meiner Erinnerung ist der FDC von VirtualPC vergleichsweise realitätsnah - er verhält sich also echten FDCs ähnlicher als z.B. der von qemu, VBox, etc.

    Ich habe gerade nicht die Zeit, mir deinen Code gründlicher anzusehen, aber grundsätzlich empfehle ich, einfach die Spezifikation zu befolgen. Am Ende (Kapitel 😎 sind ein paar Ablaufdiagramme, die ggf. hilfreich sind. Siehe auch:
    http://www.lowlevel.eu/w/images/2/2a/82077AA_FloppyControllerDatasheet.pdf
    http://www.lowlevel.eu/wiki/FDC



  • Hallo nochmal,

    ich habe von der Seite http://brokenthorn.com/Resources/OSDev20.html
    das Beispiel für den DMA Controller auf ASM umgeschrieben. Dazu noch das
    Beispiel aus dem Buch von Hr. Messmer für den FDC und es läuft sogar 😮

    Nun habe ich aber ein paar Fragen dazu.

    In dem Beispiel von brokenthorn.com wird das Register von DMA1 und DMA2 beschrieben.

    Laut Hr. Messmer ist der DMA2 nur der Master im AT, im PC/XT ist es der Slave.

    Kann mir das bitte jemand erklären? Sollte man nicht entweder den Master oder
    den Slave programmieren?

    Habe ich jetzt einen AT einen PC/XT oder gar ein PS2 Modell vor mir??? 💡

    Kann man mit dieser Vorgehensweise auch im PMode Disketten lesen/beschreiben?

    Gruß, Nicky


  • Mod


Anmelden zum Antworten