DEFINITION MODULE TrackDiskDevice;

(* Version 1.0                                                          *)
(* TrackDiskDevice enthält Routinen zum Direktzugriff auf die Diskette  *)
(* per TrackDisk-Device. Es sind einige einfache Befehle implementiert, *)
(* aber auch solche, die freie Einstellungen erlauben.                  *)
(* Die Files TrackDiskDevice.obj und TrackDiskDevice.sym sind Copyright-*)
(* frei. Sie dürfen auch in kommerziellen Produkten benutzt werden.     *)
(* Diese Files dürfen allerdings nur mit den Sourcecodes und dem Demo   *)
(* weitergegeben werden.                                                *)
(* Jeder Art Änderungen am Sourcecode oder am Definitionsfile ohne      *)
(* meine ausdrückliche Genehmigung sind verboten. Das Definitionsfile   *)
(* und der Sourcecode, sowie Teile daraus, sind Copyrightgeschützt!     *)
(*                      © 1991 by Andre Wiethoff                        *)
(*                                                                      *)
(* Bei Verbesserungsvorschlägen, Fehlern oder bei Fragen:               *)
(* Andre Wiethoff                                                       *)
(* Höhenweg 2                                                           *)
(* D-57392 Schmallenberg / Germany                                      *)


FROM SYSTEM     IMPORT ADDRESS;
FROM ExecD      IMPORT MsgPort;
FROM TrackDisk	IMPORT IOTrackDisk;


TYPE TrackDiskHandle = RECORD
       msgPort     : MsgPort;
       ioTrackDisk : IOTrackDisk;
     END;

     TrackDiskHandlePtr = POINTER TO TrackDiskHandle;



(* Diese Konstanten können für den Befehl 'Motor' benutzt werden.        *)
(* z.B.: Motor(off);                                                     *)

CONST	on  = TRUE;
	off = FALSE;


(* 'OpenTrackDisk' gibt einen Zeiger auf ein TrackDiskHandler zurück,    *)
(* den man bei den übrigen Befehlen mit übergeben muß. 'DFx' gibt das    *)
(* Laufwerk an auf das sich die Befehle beziehen sollen. So kann mit     *)
(* mehreren Laufwerken gleichzeitig gearbeitet werden. Dazu muß für      *)
(* jedes Laufwerk 'OpenTrackDisk' angewendet werden.                     *)

PROCEDURE OpenTrackDisk(DFx : LONGINT) : TrackDiskHandlePtr;



(* 'Motor' schaltet den Laufwerksmotor an/aus. TRUE oder 'on'            *)
(* (siehe Konstantendeklaration) schaltet den Motor ein, FALSE oder      *)
(*'off' aus.                                                             *)

PROCEDURE Motor(td : TrackDiskHandlePtr;
		on : BOOLEAN);



(* 'SeekBlock' positioniert den Lesekopf auf dem angegebenen Sektor. Es  *)
(* werden aber keinerlei Daten gelesen! Diese Funktion muß NICHT vor     *)
(* einem der Lese- oder Schreibbefehle stehen! 'blnr' kann bei 3 1/2     *)
(* Disks im Bereich von 0-1759 liegen.                                   *)

PROCEDURE SeekBlock(td   : TrackDiskHandlePtr;
		    blnr : LONGCARD);



(* 'ReadTrack' liest ein Track in einen angegebenen Buffer. Dieser muß   *)
(* vorher angelegt worden sein und sich im Chip-Mem befinden!!!          *)
(* (Ein Track verbraucht 5632 Bytes Speicher : 512 Bytes*11 Sector=      *)
(* 5632 Bytes/Track)                                                     *)
(* 'trnr' kann zwischen 0 und 159 liegen.                                *)
(* (0=Track 0,Seite 0 ; 1=Track 0,Seite 1 ; 2=Track 1,Seite 0 ; ...      *)

PROCEDURE ReadTrack(td     : TrackDiskHandlePtr;
		    trnr   : LONGCARD;
		    buffer : ADDRESS);



(* 'ReadBlock' ist ähnlich wie 'ReadTrack', allerdings braucht man nur   *)
(* einen 512 Bytes grossen Buffer, da nur ein Sektor eingelesen wird.    *)
(* 'blnr', wie bei 'SeekBlock', liegt für 3 1/2 Disks zwischen 0-1759.   *)

PROCEDURE ReadBlock(td     : TrackDiskHandlePtr;
		    blnr   : LONGCARD;
		    buffer : ADDRESS);



(* 'WriteTrack' hat die gleichen Parameter wie 'ReadTrack', nur wird     *)
(* eben aus dem Buffer 'buffer' auf Diskette geschrieben.                *)

PROCEDURE WriteTrack(td     : TrackDiskHandlePtr;
		     trnr   : LONGCARD;
		     buffer : ADDRESS);



(* 'WriteBlock' ist wie 'ReadBlock', nur wird wieder geschrieben.        *)

PROCEDURE WriteBlock(td     : TrackDiskHandlePtr;
		     blnr   : LONGCARD;
		     buffer : ADDRESS);



(* 'SimpleCommand' übergibt einen "einfachen" Befehl, wie z.B.           *)
(* 'getNumTracks', 'getDriveType', etc. Es wird das jeweilige Ergebnis   *)
(* aus "actual" zurückgegeben. Fehler werden ignoriert. Die Commando-    *)
(* Konstanten befinden sich im Modul TrackDisk.                          *)

PROCEDURE SimpleCommand(td      : TrackDiskHandlePtr;
			command : CARDINAL) : LONGCARD;



(* 'Command' übergibt einen "normalen" Befehl, wie zum Beispiel 'format',*)
(* etc. Es müssen 'length','offset' und 'data' übergeben werden. Bitte   *)
(* lesen sie die benötigten Daten in der Fachliteratur nach. Es gibt in  *)
(* einem SHORTINT gegebenenfalls eine Fehlermeldung zurück.              *)

PROCEDURE Command(td            : TrackDiskHandlePtr;
		  command       : CARDINAL;
		  length,offset : LONGCARD;
		  data          : ADDRESS) : SHORTINT;



(* 'ExtCommand' funktioniert wie Command, allerdings benutzt es die      *)
(* die Extenend-Befehle. Es müssen noch 'count' und 'secLabel' angeben   *)
(* werden. Der 'secLabel'-Buffer muß wiederum im Chip-Mem liegen!        *)

PROCEDURE ExtCommand(td                  : TrackDiskHandlePtr;
		     command             : CARDINAL;
		     length,offset,count : LONGCARD;
                     secLabel,data       : ADDRESS) : SHORTINT;



(* 'CloseTrackDisk' schliesst das Device wieder und gibt alle geöffneten *)
(* Resourcen wieder frei.		                                 *)

PROCEDURE CloseTrackDisk(VAR td : TrackDiskHandlePtr);


END TrackDiskDevice.

