Beschreibung der Datenpakete
Beschreibung der Datenpakete Beschreibung zum Aufbau der Datenpakete zwischen dem Laufwerkstreiber und der Applikation
Die Kommunikation mit dem Laufwerkstreiber erfolgt über Datenpakete, die mit Hilfe der Msx-Befehle gelesen bzw. erstellt werden können. Erfolgt eine Aktion auf dem Laufwerk wird vom Laufwerkstreiber ein Datenpaket gesendet. Das Datenpaket hat folgenden Aufbau:
<MessageID>
<ItemHeader>
<ProtocolID>
<ProtocolVersion>
...
Die <MessageID> ist eine Nummer, die das Ereignis auf dem Laufwerk identifiziert (siehe Ereignisse des Laufwerkstreibers ). Die folgenden Werte sind fest vorgegeben (<ItemHeader> =1000, <ProtocolID> =0xF3A49E52, <ProtocolVersion> =0x00040000). Mit diesen Werten kann festgestellt werden, ob die korrekte Version des Laufwerkstreibers installiert ist. Der Kopf des Datenpakets kann über folgende Anweisungen gelesen werden:
tDrvMsxRead # MsxOpen(_MsxSocket | _MsxRead, tSck);
tDrvMsxRead->MsxRead(_MsxMessage, tRequestMessageId);
tDrvMsxRead->MsxRead(_MsxItem, tItemHeader);
tDrvMsxRead->MsxRead(_MsxData, tRequestHeaderProtocolId);
tDrvMsxRead->MsxRead(_MsxData, tRequestHeaderProtocolVersion);
...
Abhängig vom Ereignis folgen anschließend weitere Informationen. Diese Informationen werden immer durch ein Msx-Item (vom Datentyp int) eingeleitet. Abhängig von dem Msx-Item können dann die Informationen gelesen werden. Welche Informationen zur Verfügung stehen, ist in den entsprechenden Ereignissen beschrieben. Für das Auslesen der Items und der dazugehörenden Informationen, bietet sich eine Schleife an, die solange liest, bis das komplette Datenpaket ausgewertet wurde. Eine komplette Liste der Informationsbereiche befindet sich im Abschnitt _DrvItem....
tDrvMsxRead # MsxOpen(_MsxSocket | _MsxRead, tSck);
tDrvMsxRead->MsxRead(_MsxMessage, tRequestMessageId);
for tDrvMsxRead->MsxRead(_MsxItem, tItemId);
loop tDrvMsxRead->MsxRead(_MsxItem, tItemId);
while (tItemId > 0)
{
switch (tItemId)
{
case _DrvItemHeader :
{
tDrvMsxRead->MsxRead(_MsxData, tRequestHeaderProtocolId);
tDrvMsxRead->MsxRead(_MsxData, tRequestHeaderProtocolVersion);
}
case _DrvItemResult :
{
tDrvMsxRead->MsxRead(_MsxData, tRequestResult);
}
...
}
}
tDrvMsxRead->MsxClose();
Der Laufwerkstreiber wartet immer auf eine Antwort auf seine Nachricht. Die Nachricht enthält immer eine Message-Id, Informationen über das Protokoll und einen Resultatwert. Weitere Inhalte hängen von dem entsprechenden Ereignis ab und sind dort beschrieben.
<MessageID>
<ItemHeader>
<ProtocolID>
<ProtocolVersion>
...
<ItemResult>
<Result>
Im Beispiel eine Antwort auf das Initialisierungsereignis nach dem Starten des Laufwerkstreibers:
tDrvMsxWrite # MsxOpen(_MsxSocket | _MsxWrite, tSck);
tDrvMsxWrite->MsxWrite(_MsxMessage, (tRequestMessageId + 100));
tDrvMsxWrite->MsxWrite(_MsxItem, _DrvItemHeader); // ItemHeader
tDrvMsxWrite->MsxWrite(_MsxData, 0xF3A49E52); // ProtocolId
tDrvMsxWrite->MsxWrite(_MsxData, 0x00040000); // ProtocolVersion
tDrvMsxWrite->MsxWrite(_MsxItem, _DrvItemCfgMountLocal); // mount local drive
tDrvMsxWrite->MsxWrite(_MsxData, StrCnv(StrCnv('T', _StrToUTF8), _StrFromANSI)); // drive letter
tDrvMsxWrite->MsxWrite(_MsxItem, _DrvItemCfgCacheDisk); // define the cache size of the disc
tDrvMsxWrite->MsxWrite(_MsxData, 1000000000\b); // 1 GB
tDrvMsxWrite->MsxWrite(_MsxItem, _DrvItemResult); // Write result
tDrvMsxWrite->MsxWrite(_MsxData, _ErrOk);
tDrvMsxWrite->MsxWrite(_MsxEnd, 0);
tDrvMsxWrite->MsxClose();
Die Reihenfolge, in der die einzelnen Bereiche (Msx-Items) in der Antwort definiert werden, spielt keine Rolle. Alle Zeichenketten innerhalb der Datenpakete sind im UTF-8-Format und müssen entsprechend gewandelt werden.