============================================================================

		Hinweise für die Programmierung des 'hidedisk.device'

============================================================================

1. Kommandos
============================================================================

Die Befehlsübermittlung erfolgt analog zum 'trackdisk.device' mittels
IOStdReq bei Standard-IO (CMD_.. bzw. TD_..) bzw. IOExtTD bei erweiterten
Funktionen (ETD_..).


1.1 Befehlssatz:
-------------------------------------------------

Die Befehlsopcodes werden hinter dem Kommandonamen in Klammern aufgeführt.


    1.1.1 CMD_INVALID (0)
    -------------------------------------------------

    Kommandoaufbau: 
        IO_COMMAND      = CMD_INVALID.

    Funktion:
        keine.

    Ergebnis:
        IO_ERROR        = IOERR_NOCMD.

    Anmerkungen:
		Ungültiges Kommando.
        


    1.1.2 CMD_RESET (1)
    -------------------------------------------------

    Kommandoaufbau: 
        IO_COMMAND      = CMD_RESET.

    Funktion:
        keine.

    Ergebnis:
        IO_ERROR        = IOERR_NOCMD.

    Anmerkungen:
		Ungültiges Kommando.



    1.1.3 CMD_READ/ETD_READ (2 / $8002)
    -------------------------------------------------

    Kommandoaufbau: 
        IO_COMMAND      = CMD_READ / ETD_READ.
        IO_LENGTH       = Anzahl zu lesender Bytes.
        IO_OFFSET       = ByteOffset des Startsektors.
        IO_DATA         = Zielpuffer für Lesevorgang.

        IOTD_COUNT      = changecount (nur ETD_)
		IOTD_SECLABEL	= Optionaler Zielpuffer Sector-Label (nur ETD_)

    Funktion:
        Lese ab Offset IO_OFFSET IO_LENGTH Bytes vom Medium
        und speichere Daten in IO_DATA.

		Bei ETD_READ und gesetztem IOTD_SECLABEL werden die
		Sectorlabel - Daten der zu übertragenden Sektoren
		dort abgelegt.

    Ergebnis:
        IO_ERROR        = 0, wenn Lesen erfolgreich oder Fehlercode
                          TDERR_/IOERR_.

        IO_ACTUAL       = Anzahl gelesener Bytes.

    Anmerkungen:
		Sowohl IO_DATA als auch der optionale IOTD_SECLABEL - Ein-
		trag müssen weder im Chipmemory noch auf Wortgrenze liegen.
		Die korrekte Verwaltung von Fastmemory und/oder ungeraden
		Zieladressen wird komplett vom Device übernommen.

		Im High-Density Modus (HD19/HD20) und ETD_READ mit gesetztem 
		IOTD_SECLABEL wird dieser Bereich immer mit Nullen gefüllt,
		da im HD-Format kein Sectorlabel existiert.

        IO_LENGTH muß mindestens ein Sektor = 512 Bytes betragen.
		IO_LENGTH muß ohne Rest durch 512 teilbar sein.

        IO_OFFSET muß auf Sektorgrenze (n * 512) liegen. Zum Beispiel
		ist ein Offset von 200 ungültig (Fehler IOERR_BADLENGTH).

		IO_OFFSET selbst und IO_OFFSET + IO_LENGTH dürfen die Kapa-
		zität des jeweiligen Formats nicht übersteigen. 

        Bei ETD_READ muß IOTD_COUNT größer oder gleich dem aktuellen
		ChangeCount des Laufwerks sein, sonst wird der Fehlercode
		TDERR_DiskChanged zurückgeliefert.

		Bei gesetztem IOTD_SECLABEL und ETD_READ muß der übergebene
		Puffer mindestens (IO_LENGTH / 512) * 16 Bytes groß sein,
		da zu jedem 'echten' Sektor ein Sectorlabel von 16 Bytes
		Länge übertragen wird.



    1.1.4 CMD_WRITE/ETD_WRITE (3 / $8003)
    -------------------------------------------------

    Kommandoaufbau: 
        IO_COMMAND      = CMD_WRITE / ETD_WRITE.
        IO_LENGTH       = Anzahl zu schreibender Bytes.
        IO_OFFSET       = ByteOffset des Startsektors.
        IO_DATA         = Quellpuffer für Schreibvorgang.

        IOTD_COUNT      = changecount (nur ETD_)
		IOTD_SECLABEL	= Optionaler Quellpuffer Sector-Label (nur ETD_)

    Funktion:
        Schreibe ab Offset IO_OFFSET IO_LENGTH Bytes von IO_DATA
        auf Medium.

		Bei ETD_WRITE und gesetztem IOTD_SECLABEL werden die
		Sectorlabel - Daten der zu schreibenden Sektoren in
		den Sectorlabel - Bereich des Sektors geschrieben.

    Ergebnis:
        IO_ERROR        = 0, wenn Schreiben erfolgreich oder Fehlercode
                          TDERR_/IOERR_.

        IO_ACTUAL       = Anzahl geschriebener Bytes.

    Anmerkungen:
        Es gelten die gleichen Bedingungen wie unter CMD_READ/ETD_READ.

		ETD_WRITE mit gesetztem IOTD_SECLABEL ist NOOP in HDxx Modi,
		da kein Sectorlabel bei HDxx existiert.



    1.1.5 CMD_UPDATE/ETD_UPDATE (4 / $8004)
    -------------------------------------------------

    Kommandoaufbau: 
        IO_COMMAND      = CMD_UPDATE/ETD_UPDATE.

    Funktion:
		Schreibe interne Puffer auf Medium.

    Ergebnis:
        IO_ERROR        = 0, wenn erfolgreich oder TDERR_.

    Anmerkungen:
		Bei ETD_UPDATE muß IOTD_COUNT größer oder gleich dem
		ChangeCount des Laufwerks sein.

		CMD_/ETD_UPDATE sollte zumindest nach Abschluss des letzten
		Schreibkommandos CMD_/ETD_WRITE aufgerufen werden, da sonst
		nicht sichergestellt ist, daß die zuletzt uebertragenen
		Daten auf die Diskette geschrieben worden sind.

		Ein CloseDevice() des letzten Benutzers einer Unit bewirkt ein
		automatisches Update.



	1.1.6 CMD_CLEAR/ETD_CLEAR (5 / $8005)
    -------------------------------------------------

    Kommandoaufbau: 
        IO_COMMAND      = CMD_CLEAR/ETD_CLEAR.

    Funktion:
		Erkläre interne Puffer als ungültig.

    Ergebnis:
        IO_ERROR        = 0.

    Anmerkungen:



    1.1.7 CMD_STOP (6)
    -------------------------------------------------

    Kommandoaufbau: 
        IO_COMMAND      = CMD_STOP.

    Funktion:
        Unterbinde weitere Kommandoausführung auf diesem
        Laufwerk.

    Ergebnis:
        IO_ERROR        = 0, wenn erfolgreich oder TDERR_.

    Anmerkungen:
		CMD_STOP bewirkt ein internes CMD_UPDATE (1.1.5) und
		CMD_CLEAR (1.1.6). IO_ERROR - Werte ungleich 0 werden
		durch CMD_UPDATE gesetzt.

        Stops können nicht verschachtelt werden. Das erste
        folgende CMD_START (1.1.8) wird das Laufwerk wieder
		aktivieren.

        Bis zum Eintreffen von CMD_START werden alle folgenden
        IORequests, die nicht sofort ausgeführt werden können
		(no immediate) in die Warteschlange der Unittask
		eingereiht.



    1.1.8 CMD_START (7)
    -------------------------------------------------

    Kommandoaufbau: 
        IO_COMMAND      = CMD_START.

    Funktion:
        Reaktiviere Laufwerk für Kommandoausführung.

    Ergebnis:
        IO_ERROR        = 0.

    Anmerkungen:



    1.1.9 CMD_FLUSH (8)
    -------------------------------------------------

    Kommandoaufbau: 
        IO_COMMAND      = CMD_FLUSH.

    Funktion:
        keine.

    Ergebnis:
        IO_ERROR        = IOERR_NOCMD.

    Anmerkungen:
		Ungültiges Kommando.



    1.1.10 TD_MOTOR/ETD_MOTOR (9 / $8009)
    -------------------------------------------------

    Kommandoaufbau: 
        IO_COMMAND      = TD_MOTOR / ETD_MOTOR.
        IO_LENGTH       = 0 -> schalte motor ab.
                        = 1 -> schalte motor an.

        IOTD_COUNT      = diskchangecount (nur ETD_)

    Funktion:
        Aktiviere/deaktiviere Laufwerksmotor.

    Ergebnis:
        IO_ERROR        = 0.
        IO_ACTUAL       = alter Motorstatus (0 aus / != 0 an)

    Anmerkungen:
        Bei ETD_MOTOR muß IOTD_COUNT größer oder gleich dem aktuellen
		ChangeCount des Laufwerks sein, sonst wird der Fehlercode
		TDERR_DiskChanged zurückgeliefert.



    1.1.11 TD_SEEK/ETD_SEEK (10 / $800A)
    -------------------------------------------------

    Kommandoaufbau: 
        IO_COMMAND      = TD_SEEK / ETD_SEEK.
        IO_OFFSET       = Byteadresse des anzusteuernden Sektors.

        IOTD_COUNT      = diskchangecount (nur ETD_)

    Funktion:
        Positioniere Schreib/Leseköpfe an angegebene
        Sektorposition.

    Ergebnis:
        IO_ERROR        = 0 wenn erfolgreich oder Fehlercode.

    Anmerkungen:
        Für IO_OFFSET gelten dieselben Beschränkungen wie unter
        1.1.3 mit Ausnahme, daß IO_OFFSET automatisch auf Track-
		grenze gerechnet wird (n * secspertrack).

        Bei ETD_SEEK muß IOTD_COUNT größer oder gleich dem aktuellen
		ChangeCount des Laufwerks sein, sonst wird der Fehlercode
		TDERR_DiskChanged zurückgeliefert.



    1.1.12 TD_FORMAT/ETD_FORMAT (11 / $800B)
    -------------------------------------------------

    Kommandoaufbau: 
        IO_COMMAND      = TD_FORMAT / ETD_FORMAT.
        IO_LENGTH       = Bytelänge zu schreibender Sektoren.
        IO_DATA         = Quelldaten.
        IO_OFFSET       = Byteadresse des 1. anzusteuernden Tracks.

        IOTD_COUNT      = diskchangecount (nur ETD_)

    Funktion:
		Formatiere IO_LENGTH / (Bytespertrack) Tracks ab Track-
		position in IO_OFFSET.

    Ergebnis:
        IO_ERROR        = 0 wenn erfolgreich oder Fehlercode.
        IO_ACTUAL       = 0.

    Anmerkungen:
		Für IO_DATA gelten dieselben Bedingungen wie unter 1.1.3.

		IO_LENGTH muß mindestens die Länge eines Tracks betragen.
		IO_OFFSET muß durch die Tracklänge restlos teilbar sein.

		(E)TD_FORMAT erklaert den internen Trackpuffer nach Schrei-
		ben des letzten gewuenschten Tracks automatisch als ungueltig,
		um beim Zuruecklesen die Daten nicht aus dem Puffer, sondern
		wirklich von Disk zu verifizieren.

        Bei ETD_FORMAT muß IOTD_COUNT größer oder gleich dem aktuellen
		ChangeCount des Laufwerks sein, sonst wird der Fehlercode
		TDERR_DiskChanged zurückgeliefert.



    1.1.13 TD_REMOVE (12)
    -------------------------------------------------

    Kommandoaufbau: 
        IO_COMMAND      = TD_REMOVE.
        IO_DATA         = Interrupt-Struktur.

    Funktion:
        Hänge Interrupt-Struktur, die bei Diskwechsel aktiviert 
        werden soll, in Unit ein.

    Ergebnis:
        IO_ERROR        = 0.

    Anmerkungen:
		Die Verwaltung der Interrupts ist wegen der Doppelbenutzung
		des physikalischen Laufwerks zweigeteilt. Beim Herausnehmen
		einer Diskette werden grundsaetzlich alle vorhandenen Inter-
		rupts aktiviert, da ein Herausnehmen fuer DD und HDxx Be-
		nutzer relevant ist. Dagegen werden nach dem Einlegen und Fest-
		stellen des Disktyps lediglich die Benutzer des eingelegten
		Disktyps informiert.


    1.1.14 TD_CHANGENUM (13)
    -------------------------------------------------

    Kommandoaufbau: 
        IO_COMMAND      = TD_CHANGENUM.

    Funktion:
        Gebe aktuellen Diskchangecounter zurück.

    Ergebnis:
        IO_ERROR        = 0 oder TDERR_DiskChanged, wenn kein Medium
                          in Laufwerk.

        IO_ACTUAL       = DiskChangeCounter.

    Anmerkungen:



    1.1.15 TD_CHANGESTATE (14)
    -------------------------------------------------

    Kommandoaufbau: 
        IO_COMMAND      = TD_CHANGESTATE.

    Funktion:
        Untersuche, ob Medium in Laufwerk vorhanden ist.

    Ergebnis:
        IO_ERROR        = 0.

        IO_ACTUAL       = 0, wenn Medium in Laufwerk, sonst != 0.

    Anmerkungen:
        


    1.1.16 TD_PROTSTATUS (15)
    -------------------------------------------------

    Kommandoaufbau: 
        IO_COMMAND      = TD_PROTSTATUS.

    Funktion:
        Untersuche, ob Laufwerk schreibgeschützt ist.

    Ergebnis:
        IO_ERROR        = 0 oder Fehlercode.

        IO_ACTUAL       = 0, wenn Schreiben erlaubt, sonst != 0.

    Anmerkungen:


        
    1.1.17 TD_RAWREAD/ETD_RAWREAD (16 / $8010)
    -------------------------------------------------

    Kommandoaufbau: 
		IO_FLAGS		= Moegliche Flags unter Anmerkungen.
        IO_COMMAND      = TD_RAWREAD/ETD_RAWREAD.
		IO_LENGTH		= Laenge des Zielpuffers in Bytes.
		IO_DATA			= Zielpuffer.
		IO_OFFSET		= Tracknummer des zu lesenden Tracks.
		
        IOTD_COUNT      = diskchangecount (nur ETD_RAWREAD)
		IOTD_SECLABEL	= alternatives Syncwort bei (E)TD_RAWREAD 
						  mit gesetztem IOHDB_ALTWORDSYNC (siehe
						  Anmerkungen).
						  
    Funktion:
		Lese in angegebenem Modus (IO_FLAGS) IO_LENGTH Bytes von
		Disk bei Track IO_OFFSET und speichere Daten in IO_DATA.

    Ergebnis:
        IO_ERROR        = 0 oder Fehlercode.

    Anmerkungen:
		Dieser Befehl liest die Daten im angegebenen Modus von der
		Diskette und liefert sie ohne Dekodierung oder sonstiger
		Prüfung in IO_DATA zurueck.

		Bestimmung des Lesemodus in IO_FLAGS:

		Ist IOHDB_INDEXSYNC gesetzt, wird die Disk DMA nach Auftreten
		des naechsten Index-Interrupts (Indexloch) gestartet. 

		Ist IOHDB_WORDSYNC gesetzt, wird die Disk DMA mit dem jeweils
		voreingestellten Syncwort gestartet ($4489 DD, $DBFF HD19,
		$F249 HD20).

		Wird zusätzlich zu IOHDB_WORDSYNC IOHDB_ALTWORDSYNC gesetzt,
		wird ein in den unteren 16 Bit von IOTD_SECLABEL angegebenes
		alternatives Syncwort verwendet.

		Sind IOHDB_INDEXSYNC und IOHDB_WORDSYNC (+ IOHDB_ALTWORDSYNC)
		gesetzt, beginnt die DMA nach dem Indexloch mit der Synchroni-
		sation mit dem voreingestellten (definierten) Syncwort.

		Ist keines der Flags gesetzt, wird ohne jegliche Synchronisation
		gelesen.

		Die Verbindung von IOHDB_WORDSYNC/IOHDB_ALTWORDSYNC ermöglicht
		die Verwaltung eines komplett eigenen Diskformats mit eigener Sync 
		über hidedisk.device. Dies ist in dieser Form noch nicht reali-
		siert worden.

		IO_LENGTH muß kleiner als 32 KByte sein (max. 32766 Bytes).
		Ungerade Werte werden automatisch gerade gemacht (die
		Disk DMA kann nur Worte lesen).

		IO_DATA MUß im Chipmemory und auf Wortgrenze liegen.

		IO_OFFSET muß zwischen 0 bis einschließlich Trackanzahl - 1
		liegen. Da das Trackformat dem Device nicht bekannt ist, macht
		ein logischer IO_OFFSET mit n * Blocklaenge keinen Sinn.
		
        Bei ETD_RAWREAD muß IOTD_COUNT größer oder gleich dem aktuellen
		ChangeCount des Laufwerks sein, sonst wird der Fehlercode
		TDERR_DiskChanged zurückgeliefert.

		Für die Definition von IO_FLAGS - Werten mittels IOHDB_..
		muß zur Absendung des Requests direkt BeginIO aufgerufen
		werden, da DoIO/SendIO IO_FLAGS auf 1 setzen, bzw löschen.


    1.1.18 TD_RAWWRITE/ETD_RAWWRITE (17 / $8011)
    -------------------------------------------------

    Kommandoaufbau: 
		IO_FLAGS		= Moegliche Flags unter Anmerkungen.
        IO_COMMAND      = TD_RAWWRITE/ETD_RAWWRITE.
		IO_LENGTH		= Laenge des Quellpuffers in Bytes.
		IO_DATA			= Quellpuffer.
		IO_OFFSET		= Tracknummer des zu schreibenden Tracks.
		
        IOTD_COUNT      = diskchangecount (nur ETD_RAWWRITE)

    Funktion:
		Schreibe in angegebenem Modus (IO_FLAGS) IO_LENGTH Bytes
		von IO_DATA auf Disk bei Track IO_OFFSET.

    Ergebnis:
        IO_ERROR        = 0 oder Fehlercode.

    Anmerkungen:
		Dieser Befehl schreibt die Daten im angegebenen Modus ohne
		Aenderung auf die Diskette.

		Bestimmung des Schreibmodus in IO_FLAGS:

		Ist IOHDB_INDEXSYNC gesetzt, wird die Disk DMA nach Auftreten
		des naechsten Index-Interrupts (Indexloch) gestartet. 

		Sonst beginnt der Schreibvorgang ohne Synchronisation.

		IOHDB_WORDSYNC/IOHDB_ALTWORDSYNC koennen gesetzt sein, haben
		hier jedoch keinen Zweck (man kann nicht mit Wordsync schrei-
		ben).

		IO_LENGTH muß kleiner als 32 KByte sein (max. 32766 Bytes).
		Ungerade Werte werden automatisch gerade gemacht (die Disk
		DMA kann nur Worte schreiben).

		IO_DATA MUß im Chipmemory und auf Wortgrenze liegen.

		IO_OFFSET muß zwischen 0 bis einschließlich Trackanzahl - 1
		liegen. Da das Trackformat dem Device nicht bekannt ist, macht
		ein logischer IO_OFFSET mit n * Blocklaenge keinen Sinn.
		
        Bei ETD_RAWWRITE muß IOTD_COUNT größer oder gleich dem aktuellen
		ChangeCount des Laufwerks sein, sonst wird der Fehlercode
		TDERR_DiskChanged zurückgeliefert.



    1.1.19 TD_GETDRIVETYPE (18)
    -------------------------------------------------

    Kommandoaufbau: 
        IO_COMMAND      = TD_GETDRIVETYPE.

    Funktion:
        Ermittle Typ des Laufwerks.

    Ergebnis:
        IO_ERROR        = 0.
        
        IO_ACTUAL       = DRIVE3_5 		im DD   Modus.
						= DRIVE3_5_HD19	im HD19 Modus.
						= DRIVE3_5_HD20	im HD20 Modus.

    Anmerkungen:



    1.1.20 TD_GETNUMTRACKS (19)
    -------------------------------------------------

    Kommandoaufbau: 
        IO_COMMAND      = TD_GETNUMTRACKS.

    Funktion:
        Ermittle Anzahl an Spuren (Tracks) des Laufwerks.

    Ergebnis:
        IO_ERROR        = 0.
        
        IO_ACTUAL       = Anzahl an Tracks.

    Anmerkungen:
		IO_ACTUAL ist 160 im DD Modus, 164 in den HD Modi.


    1.1.21 TD_ADDCHANGEINT (20)
    -------------------------------------------------

    Kommandoaufbau: 
        IO_COMMAND      = TD_ADDCHANGEINT.
        IO_DATA         = Interrupt-Struktur.

    Funktion:
        Hänge IOStdReq (!!) in Unit-Liste der Software-
		Interrupts ein.

    Ergebnis:
        IO_ERROR        = 0.

    Anmerkungen:
        Mit diesem Kommando ist es, im Gegensatz zu
        TD_REMOVE möglich, mehrere Interrupts für ein
        Laufwerk anzumelden, die dann im Falle eines
        Diskwechsels automatisch aktiviert werden.

        Der eingehende IOStdReq bleibt bis zum Abmelden
        mittels TD_REMCHANGEINT Teil einer internen Device -
        Liste und darf daher NICHT für andere Kommandos
        verwendet werden !!!

		Fuer die Aktivierung der Interrupts gelten die Anmer-
		kungen unter TD_REMOVE (1.1.13).



    1.1.22 TD_REMCHANGEINT (21)
    -------------------------------------------------

    Kommandoaufbau: 
        IO_COMMAND      = TD_REMCHANGEINT.

    Funktion:
        Entferne IOStdReq (!!) aus der Liste der Software-
		Interrupts.

    Ergebnis:
        IO_ERROR        = 0.

    Anmerkungen:



2. OpenDevice()
============================================================================

OpenDevice() erfolgt wie bei 'trackdisk.device'. Die gültigen Laufwerk-
nummern sind 0..3 für DD Units und 4..7 für HD Units. Die maximale
Laufwerknummer is 7.

Mögliche Flags bei OpenDevice():

    PUUOF_NOTBSY (Bit 4) schaltet den hidedisk.device Burstmodus ab.
    Voreinstellung ist immer BSY.

    PUUOF_DOKLICK (Bit 5) schaltet den Quietmodus ab, der DiskChange-
    Check bei nicht eingelegter Diskette wird hörbar. Voreinstellung
    ist immer NOKLICk.

    TDF_ALLOW_NON_3_5 (Bit 0) hat keine Bedeutung bei hidedisk.device,
    da es nicht für 5.25 Zoll Laufwerke ausgelegt ist.

============================================================================
