Multi-Media Commands - 6 Kapitel 6.12. Das MODE SENSE (10) Command gibt verschiedene Parameter des Gerätes zurück. Für die Beschreibung des Commands wird auf die SCSI Primary Commands - 3 (SPC-3) verwiesen. Dort findet sich in Kapitel 6.10 MODE SENSE (10) Command eine Beschreibung des Command Descriptor Blocks, wobei im weiteren Bezug auf Kapitel 6.9 MODE SENSE (6) command genommen wird.
Der MODE SENSE (10) Command Descriptor Block:
| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
| 0 | Operation Code ($5A) | |||||||
| 1 | Reserviert | LLBAA | DBD | Reserviert | ||||
| 2 | PC | PAGE CODE | ||||||
| 3 | SUBPAGE CODE | |||||||
| 4 | Reserviert | |||||||
| 5 | ||||||||
| 6 | ||||||||
| 7 | Allocation Length | |||||||
| 8 | ||||||||
| 9 | Control | |||||||
Byte 0: Operation Code - $5A
Byte 1: LLBAA - Long LBA Accepted
Long Logical Block Addressing - Ist theoretisch bei einer Speicherkapazität von über 2,1 Terabyte notwendig.
Praktisch bei XP wohl schon bei 990 Gigabyte.
Byte 1: DBD - Disable Block Descriptor
Bei Wert 0 werden keine oder mehrere Block Descriptors in den MODE SENSE Data zurückgegeben. Bei Wert 1 werden
keine Block Descriptoren zurückgegeben.
Byte 2: PC - Page Control
Byte 2 und 3: Page Code und Subpage Code
Die Codes sind in SCSI Primary Commands - 3 (SPC-3) Anhang D.6 und darin in Tabelle D.12 aufgeführt. Für CD
Capabilities and Mechanical Status ist die Page $2A und die Sub Page $00.
Byte 7 und 8: Länge der Antwortstruktur
Als Antwort erhält man eine Mode Parameter List, welche vom Gerätetyp und dem unterstützten Multi Media Command
Standard abhängig ist. Sie beginnt mit einem acht Byte langen Mode Parameter (10) Header. Diesem schließt sich bis
MMC-2 eine 22 Byte lange Struktur an. In MMC-3 wurde diese Struktur erweitert und kann deutlich länger sein. Deshalb
wird die Länge mit $FF angegeben. Die tatsächliche Länge kann dem Mode Parameter (10) Header entnommen und der
Aufruf muss gegebenenfalls mit korrigiertem Wert wiederholt werden. Eine Beschreibung des Mode Parameter (10) Header
kann den Multi-Media Commands - 6 Kapitel 7.2 wie folgt entnommen werden:
| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
| 0 | Mode Data Length | |||||||
| 1 | ||||||||
| 2 | Reserviert | |||||||
| 3 | ||||||||
| 4 | ||||||||
| 5 | ||||||||
| 6 | Block Descriptor Length = 0 | |||||||
| 7 | ||||||||
Mode Data Length
Gibt in Bytes an, wie lang die folgende Datenstruktur ist.
Block Descriptor Length
Die Länge ist 0, da Multimediageräte keine Block Descriptors unterstützen. Für ältere SCSI logical Units sind es 8.
CD/DVD Capabilities and Mechanical Status Page (Page Code 2Ah)
Die Beschreibung der CD/DVD Capabiblities and Mechanical Status Page (Page Code $2A) findet sich in den
SCSI Multimedia Commands – 3 (MMC-3) in Kapitel 6.3.11:
| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
| 0 | PS | Reserviert | Page Code ($2A) | |||||
| 1 | Page Length (28 + 4 * (maximum number of n)) | |||||||
| 2 | Reserved | DVD-RAM Read | DVD-R Read | DVD-ROM Read | Method 2 | CD-RW Read | CD-R Read | |
| 3 | Reserved | DVD-RAM Write | DVD-R Write | Reserved | Test Write | CD-RW Write | CD-R Write | |
| 4 | BUF | Multi Session | Mode2 Form2 | Mode2 Form1 | Digital Port (2) | Digital Port (1) | Composite | Audio Play |
| 5 | Read Bar Code | UPC | ISRC | C2 Pointers supported | RW Deinter- leaved & corrected | RW Supported | CD-DA Stream is Accurate | CD-DA Cmds Supported |
| 6 | Loading Mechanism Type | Reserved | Eject (Individual /Magazine) | Prevent Jumper | Lock State | Lock | ||
| 7 | Reserved | RW in Lead-In | Side Change Capable | S/W Slot Selection (SSS) | Changer Supports Disc Present | Separate Channel Mute | Separate Volume Levels | |
| 8 | Maximum Read Speed Supported (Veraltet) | |||||||
| 9 | ||||||||
| 10 | Number of Volume Levels Supported | |||||||
| 11 | ||||||||
| 12 | Buffer Size Supported | |||||||
| 13 | ||||||||
| 14 | Current Reed Speed Selected (Veraltet) | |||||||
| 15 | ||||||||
| 16 | Reserviert | |||||||
| 17 | Reserviert | Length | LSBF | RCK | BCKF | Reserviert | ||
| 18 | Maximum Write Speed (Veraltet) | |||||||
| 19 | ||||||||
| 20 | Current Write Speed Selected (Veraltet) | |||||||
| 21 | ||||||||
| 22 | Copy Management Revision Supported | |||||||
| 23 | ||||||||
| 24 | Reserved | |||||||
| 25 | ||||||||
| 26 | ||||||||
| 27 | Reserved | Rotation Control Selected | ||||||
| 28 | Current Write Speed Selected | |||||||
| 29 | ||||||||
| 30 | Number of Logical Unit Write Speed Performance Descriptor Tables (n) | |||||||
| 31 | ||||||||
| 32 | Logical Unit Write Speed Performance Descriptor Block #1 | |||||||
| 33 | ||||||||
| 34 | ||||||||
| 35 | ||||||||
| 36 | Logical Unit Write Speed Performance Descriptor Block #2 | |||||||
| 37 | ||||||||
| 38 | ||||||||
| 39 | ||||||||
| . . |
||||||||
| n * 4 + 28 | Logical Unit Write Speed Performance Descriptor Block #n | |||||||
| n * 4 + 29 | ||||||||
| n * 4 + 30 | ||||||||
| n * 4 + 31 | ||||||||
| Padding | ||||||||
PS (Parameters Savable): Gibt an, ob die logische Einheit die mode page an einer hersteller spezifischen Speicherstelle speichern kann.
Page Code: Code der zurückgegebenenen Seite.
Page Length: Gibt die noch folgenden Bytes an.
DVD-RAM Read: Gibt an, ob das Gerät DVD-RAM Medien lesen kann.
DVD-R Read: Gibt an, ob das Gerät DVD-R Medien lesen kann.
DVD-ROM Read: Gibt an,ob das Gerät DVD-ROM Medien lesen kann.
Method 2: Gibt an, ob das Lesen von fixed packed tracks unterstützt wird.
CD-RW Read: Gibt an, ob CD-RW gelesen werden können.
CD-R Read: Gibt an, ob CD-R gelesen werden können.
DVD-RAM Write: Gibt an, ob DVD-RAM Medien beschrieben werden können.
DVD-R Write: Gibt an, ob DVD-R Medien beschrieben werden können.
Test Write: Gibt an, ob die Test Write function unterstützt wird.
CD-RW Write: Gibt an, ob CD-RW Medien beschrieben werden können.
CD-R Write: Gibt an, ob CD-R Medien beschrieben werden können.
Audio Play: Gibt an, ob Analog Audio abgespielt werden kann.
Composite: Gibt an, ob ein Composite Audio- und Videostream an einem unabhängigen Digitalport wiedergegeben werden können.
Digital Port (1): Gibt an, ob eine Digitalausgabe nach IEC958 auf dem Anschluss 1 unterstützt wird.
Digital Port (2): Gibt an, ob eine Digitalausgabe nach IEC958 auf dem Anschluss 2 unterstützt wird.
Mode2 Form1: gibt an, ob CD-Sektoren im Mode 2 Form 1 Format gelesen werden können.
Mode2 Form2: gibt an, ob CD-Sektoren im Mode 2 Form 2 Format gelesen werden können.
Multi Session: Gibt an, ob CDs mit mehreren Sessions gelesen werden können.
BUF: Gibt an, ob für CD-R/W Buffer Underrun freie Aufnahmen unterstützt werden.
CD-DA Cmds Supported: Gibt an, das Lesen von CD Audiosektoren mit dem READ CD Command unterstützt wird.
CD-DA Stream is Accurate Gibt an, ob nach einem Lesefehler weitergelesen werden kann.
Sub Channels R-W Reading Supported: gibt an, ob die R-W Sub-Channel mit dem READ CD Command gelesen werden können.
R-W Sub Channels Deinterleaved & corrected: Gibt an, ob die R-W Sub-Channels mit dem READ CD Command mit unverschachtelten und korrigierten Daten gelesen werden können.
C2 Pointers supported: Gibt an, ob C2 Fehlerpointer und C2 Blockfehlerflags über den READ CD Command unterstützt wird.
ISRC: Gibt an, ob das Auslesen von International Standard Recording Code Information über den READ SUB-CHANNEL Command unterstützt wird.
UPC: Gibt an, ob das Lesen der Media Catalog Number mit dem READ SUB-CHANNEL Command unterstützt werden.
Read Bar Code: Gibt an, ob das Lesen des Disc Bar Code und die Rückgabe der Information über den READ DISC INFORMATION Command unterstützt wird.
Lock: Gibt an, ob das Sperren des Gerät mit den PREVENT ALLOW MEDIUM REMOVAL Command unterstützt wird.
Lock State: Wenn Lock gesetzt ist, gibt es an, ob das Laufwerk gesperrt ist.
Prevent Jumper: Gibt an, ob das Gerät einen physikalischen Schalter zum Sperren für den Auswurf besitzt.
Eject (Individual /Magazine): Gibt an, ob der Auswurf der Medien über das START STOP UNIT Command mit dem LoEj Bit unterstützt wird. Wenn es sich um einen Wechsler mit Magazinen handelt, gibt es an, ob dieses Magazin entfernt werden kann.
Loading Mechanism Type: Gibt den Typ des Mechanismus an:
| 7 | 6 | 5 | Loading Mechanism Type |
| 0 | 0 | 0 | Caddy type loading mechanism |
| 0 | 0 | 1 | Tray type loading mechanism |
| 0 | 1 | 0 | Popup type loading mechanism |
| 0 | 1 | 1 | Reserviert |
| 1 | 0 | 0 | Changer with individually changeable discs |
| 1 | 0 | 1 | Changer using a Magazine mechanism |
| 1 | 1 | 0 | Reserviert |
| 1 | 1 | 1 | Reserviert |
Separate Volume Levels: Gibt an, ob die Lautstärkregelung für jeden Kanal über die Audio control Page
unterstützt wird.
Separate Channel Mute: Gibt an, ob die unabhängige Stummschaltung eines jeden Audiokanals über die CD Audio Control Page unterstützt wird.
Changer Supports Disc Present: Gibt an, ob das Gerät einen Wechsler enthält.
Software Slot Selection: Kontrolliert das Verhalten des LOAD/UNLOAD MEDIUM Command.
Side Change Capable: gibt an, ob das Gerät zweiseitige Medien unterstützt. Dies trifft normalerweise nur für Wechsler zu.
RW in Lead-In: Gibt an, ob die rohe R-W Sub-Channel Informationen aus dem Lead-In gelesen werden können.
Maximum Read Speed Supported: Die höchste unterstützte Lesegeshwindigkeit. Sie ist vom eingelegten Medium abhängig. Obwohl als veraltet bezeichnet, wird sie meist noch angegeben.
Number of Volume Levels Supported: Gibt die Anzahl der unterstützten diskrete Lautstärkelevel an. Bei Audio an und aus sind dies zwei.
Buffer Size Supported: Gibt die Größe des Speicherpuffers in kByte an.
Current Reed Speed Selected: Die gegenwärtig eingestellte Lesegeschwindigkeit. Sie ist vom eingelegten Medium abhängig. Obwohl als veraltet bezeichnet, wird sie meist noch angegeben.
Length, LSBF, RCK, BCKF: Die Flags sind nur gültig, wenn Digital Port (1) oder Digital Port (2) gesetzt sind.
Length: Die Flags sind nur gültig, wenn Digital Port (1) oder Digital Port (2) gesetzt sind.
LSBF: Die Flags sind nur gültig, wenn Digital Port (1) oder Digital Port (2) gesetzt sind.
RCK: Die Flags sind nur gültig, wenn Digital Port (1) oder Digital Port (2) gesetzt sind.
Maximum Write Speed: Die höchste unterstützte Schreibgeschwindigkeit. Sie ist vom eingelegten Medium abhängig. Obwohl als veraltet bezeichnet, wird sie meist noch angegeben.
Copy Management Revision Supported Gibt die Revision des Kopierschutzschemas an. Wenn für DVD CSS pder DPPM unterstützt wird, soll der Wert $0001 betragen.
Rotation Control Selected: Gibt an, wie die Rotation controlliert wird:
| Wert | Beschreibung |
| 00b | Media default rotation control |
| 01b | CAV |
| Andere | Reserviert |
Current Write Speed Selected: Die gegenwärtig eingelegte Schreibgeschwindigkeit. Sie ist vom eingelegten
Medium abhängig. In der alten Version der Code Page belegt das Feld die Bytes 20 und 21. In der neuen Version wird
es als veraltet bezeichnet, wird jedoch meist angegeben. In der neuen Version belegt das Feld die Bytes 28 und 29.
Hinzu ist das Feld Rotation Control Selected in Byte 27 gekommen.
Number of Logical Unit Write Speed Performance Descriptor Tables (n): Gibt die Anzahl der folgenden Logical Unit Write Speed Performance Descriptor Blocks an.
Logical Unit Write Speed Performance Descriptor Block - Struktur:
| 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
| 0 | Reserved | |||||||
| 1 | Reserved | Rotation Control | ||||||
| 2 | Write Speed Supported (kbytes/sec) | |||||||
| 3 | ||||||||
Hier bedeutet die Rotation Control:
| Wert | Beschreibung |
| 00b | CLV |
| 01b | CAV |
| 10b | Reserviert |
| 11b |
Padding: Sind Bytes zur Auffüllung.
{
* Für die Auswertung.
}
type
TModeParameterHeader = record
ModeDataLength : Word;
BlockDescLength : Word;
end;
type
TLogUnitWriteSpeedPerfDescBlock = record
Rotation : Byte;
WriteSpeed : Word;
end;
type
TCapabilities = record
PS : Boolean;
PageCode : Byte;
PageLength : Byte;
DVDRAMRead : Boolean;
DVDRRead : Boolean;
DVDROMRead : Boolean;
Method2 : Boolean;
CDRWRead : Boolean;
CDRRead : Boolean;
DVDRAMWrite : Boolean;
DVDRWrite : Boolean;
TestWrite : Boolean;
CDRWWrite : Boolean;
CDRWrite : Boolean;
BUF : Boolean;
MultiSession : Boolean;
Mode2Form2 : Boolean;
Mode2Form1 : Boolean;
DigitalPort2 : Boolean;
DigitalPort1 : Boolean;
Composite : Boolean;
AudioPlay : Boolean;
ReadBarCode : Boolean;
UPC : Boolean;
ISRC : Boolean;
C2PSup : Boolean;
RWDeIntlvd : Boolean;
RWSupported : Boolean;
CDDAStrIsAcc : Boolean;
CDDACmdsSupp : Boolean;
LoadMechType : Byte;
Eject : Boolean;
PrevJumper : Boolean;
LockState : Boolean;
Lock : Boolean;
RWLeadIn : Boolean;
SideChCap : Boolean;
SWSlotSel : Boolean;
ChSDiscPres : Boolean;
SepChMute : Boolean;
SepVolLvl : Boolean;
NOfVolLvlSup : Word;
BufSizeSup : Word;
Length : Byte;
LSBF : Boolean;
RCK : Boolean;
BCKF : Boolean;
CpyManRevSup : Word;
RotCtrlSel : Byte;
CurWriSpeSel : Word;
NumLUWSPDT : Word;
LUWSPDBlock : array of TLogUnitWriteSpeedPerfDescBlock;
{ Ab MMC-3 als veraltet bezeichnet }
SpeedReadMax : Word;
SpeedReadCur : Word;
SpeedWriteMax : Word;
SpeedWriteCur : Word;
end;
TCapabilitiesMechStatus = record
ModeParameterHeader : TModeParameterHeader;
Capabilities : TCapabilities;
end;
...
{
* Für den Befehl.
}
const
SCSIOP_MODE_SENSE10 = $5A;
SCSIPC_CAPABILITIES = $2A;
type
TMODE_SENSE10_CDB = record
OperationCode : Byte;
PC_PageCode : Byte;
SubpageCode : Byte;
AllocationLength : Word;
end;
type
TCAPABILITIES_MECHSTATUS = record
ModeParameterHeader : array[0..7] of Byte;
Data : array[0..$FF] of Byte;
end;
Nach dem Ausfüllen des Command Descriptors Blockes wird die Abfrage ausgeführt und die Antwort ausgewertet. Es werden auch die als veraltet bezeichneten Felder ausgewertet.
...
begin
...
{
* Den Command Descriptor Block füllen.
}
ZeroMemory(@MODE_SENSE10_CDB, SizeOf(MODE_SENSE10_CDB));
MODE_SENSE10_CDB.OperationCode := SCSIOP_MODE_SENSE10;
MODE_SENSE10_CDB.PC_PageCode := SCSIPC_CAPABILITIES;
MODE_SENSE10_CDB.AllocationLength := SizeOf(TMODE_SENSE10_DATA);
{
* Den Command Descriptor Block übertragen.
}
SetLength(aCDB, 10);
aCDB[0] := MODE_SENSE10_CDB.OperationCode;
aCDB[2] := MODE_SENSE10_CDB.PC_PageCode;
aCDB[3] := MODE_SENSE10_CDB.SubpageCode;
aCDB[7] := HiByte(MODE_SENSE10_CDB.AllocationLength);
aCDB[8] := LoByte(MODE_SENSE10_CDB.AllocationLength);
{
* Befehl ausführen
}
ZeroMemory(@CAPABILITIES_MECHSTATUS, SizeOf(CAPABILITIES_MECHSTATUS));
if GET_SCSI_PASS_THROUGH_DIRECT(aDrive, aCDB, @CAPABILITIES_MECHSTATUS,
SizeOf(TCAPABILITIES_MECHSTATUS))
then begin
with Capabilities.ModeParameterHeader
do begin
ModeDataLength := CAPABILITIES_MECHSTATUS.ModeParameterHeader[0] shl 8 or
CAPABILITIES_MECHSTATUS.ModeParameterHeader[1];
BlockDescLength := CAPABILITIES_MECHSTATUS.ModeParameterHeader[6] shl 8 or
CAPABILITIES_MECHSTATUS.ModeParameterHeader[7];
end;
with Capabilities.Capabilities
do begin
PS := CAPABILITIES_MECHSTATUS.Data[0] and $80 > 0;
PageCode := CAPABILITIES_MECHSTATUS.Data[0] and $3F;
PageLength := CAPABILITIES_MECHSTATUS.Data[1];
DVDRAMRead := CAPABILITIES_MECHSTATUS.Data[2] and $20 > 0;
DVDRRead := CAPABILITIES_MECHSTATUS.Data[2] and $10 > 0;
DVDROMRead := CAPABILITIES_MECHSTATUS.Data[2] and $08 > 0;
Method2 := CAPABILITIES_MECHSTATUS.Data[2] and $04 > 0;
CDRWRead := CAPABILITIES_MECHSTATUS.Data[2] and $02 > 0;
CDRRead := CAPABILITIES_MECHSTATUS.Data[2] and $01 > 0;
DVDRAMWrite := CAPABILITIES_MECHSTATUS.Data[3] and $20 > 0;
DVDRWrite := CAPABILITIES_MECHSTATUS.Data[3] and $10 > 0;
TestWrite := CAPABILITIES_MECHSTATUS.Data[3] and $04 > 0;
CDRWWrite := CAPABILITIES_MECHSTATUS.Data[3] and $02 > 0;
CDRWrite := CAPABILITIES_MECHSTATUS.Data[3] and $01 > 0;
BUF := CAPABILITIES_MECHSTATUS.Data[4] and $80 > 0;
MultiSession := CAPABILITIES_MECHSTATUS.Data[4] and $40 > 0;
Mode2Form2 := CAPABILITIES_MECHSTATUS.Data[4] and $20 > 0;
Mode2Form1 := CAPABILITIES_MECHSTATUS.Data[4] and $10 > 0;
DigitalPort2 := CAPABILITIES_MECHSTATUS.Data[4] and $08 > 0;
DigitalPort1 := CAPABILITIES_MECHSTATUS.Data[4] and $04 > 0;
Composite := CAPABILITIES_MECHSTATUS.Data[4] and $02 > 0;
AudioPlay := CAPABILITIES_MECHSTATUS.Data[4] and $01 > 0;
ReadBarCode := CAPABILITIES_MECHSTATUS.Data[5] and $80 > 0;
UPC := CAPABILITIES_MECHSTATUS.Data[5] and $40 > 0;
ISRC := CAPABILITIES_MECHSTATUS.Data[5] and $20 > 0;
C2PSup := CAPABILITIES_MECHSTATUS.Data[5] and $10 > 0;
RWDeIntlvd := CAPABILITIES_MECHSTATUS.Data[5] and $08 > 0;
RWSupported := CAPABILITIES_MECHSTATUS.Data[5] and $04 > 0;
CDDAStrIsAcc := CAPABILITIES_MECHSTATUS.Data[5] and $02 > 0;
CDDACmdsSupp := CAPABILITIES_MECHSTATUS.Data[5] and $01 > 0;
LoadMechType := CAPABILITIES_MECHSTATUS.Data[6] and $E0 shr 5;
Eject := CAPABILITIES_MECHSTATUS.Data[6] and $08 > 0;
PrevJumper := CAPABILITIES_MECHSTATUS.Data[6] and $04 > 0;
LockState := CAPABILITIES_MECHSTATUS.Data[6] and $02 > 0;
Lock := CAPABILITIES_MECHSTATUS.Data[6] and $01 > 0;
RWLeadIn := CAPABILITIES_MECHSTATUS.Data[7] and $20 > 0;
SideChCap := CAPABILITIES_MECHSTATUS.Data[7] and $10 > 0;
SWSlotSel := CAPABILITIES_MECHSTATUS.Data[7] and $08 > 0;
ChSDiscPres := CAPABILITIES_MECHSTATUS.Data[7] and $04 > 0;
SepChMute := CAPABILITIES_MECHSTATUS.Data[7] and $02 > 0;
SepVolLvl := CAPABILITIES_MECHSTATUS.Data[7] and $01 > 0;
SpeedReadMax := CAPABILITIES_MECHSTATUS.Data[8] shl 8 or
CAPABILITIES_MECHSTATUS.Data[9];
NOfVolLvlSup := CAPABILITIES_MECHSTATUS.Data[10] shl 8 or
CAPABILITIES_MECHSTATUS.Data[11];
BufSizeSup := CAPABILITIES_MECHSTATUS.Data[12] shl 8 or
CAPABILITIES_MECHSTATUS.Data[13];
SpeedReadCur := CAPABILITIES_MECHSTATUS.Data[14] shl 8 or
CAPABILITIES_MECHSTATUS.Data[15];
Length := CAPABILITIES_MECHSTATUS.Data[17] and $31 shr 4;
LSBF := CAPABILITIES_MECHSTATUS.Data[17] and $08 > 0;
RCK := CAPABILITIES_MECHSTATUS.Data[17] and $04 > 0;
BCKF := CAPABILITIES_MECHSTATUS.Data[17] and $02 > 0;
SpeedWriteMax := CAPABILITIES_MECHSTATUS.Data[18] shl 8 or
CAPABILITIES_MECHSTATUS.Data[19];
SpeedWriteCur := CAPABILITIES_MECHSTATUS.Data[20] shl 8 or
CAPABILITIES_MECHSTATUS.Data[21];
CpyManRevSup := CAPABILITIES_MECHSTATUS.Data[22] shl 8 or
CAPABILITIES_MECHSTATUS.Data[23];
RotCtrlSel := CAPABILITIES_MECHSTATUS.Data[27] and $03;
CurWriSpeSel := CAPABILITIES_MECHSTATUS.Data[28] shl 8 or
CAPABILITIES_MECHSTATUS.Data[29];
NumLUWSPDT := CAPABILITIES_MECHSTATUS.Data[30] shl 8 or
CAPABILITIES_MECHSTATUS.Data[31];
{
* Blöcke
}
if NumLUWSPDT > 0
then begin
SetLength(LUWSPDBlock, NumLUWSPDT);
for n := 1 to NumLUWSPDT
do begin
LUWSPDBlock[n - 1].Rotation
:= CAPABILITIES_MECHSTATUS.Data[n * 4 + 29] and $07;
LUWSPDBlock[n - 1].WriteSpeed
:= CAPABILITIES_MECHSTATUS.Data[n * 4 + 30] shl 8 or
CAPABILITIES_MECHSTATUS.Data[n * 4 + 31];
end;
end;
end;
end;
...
end;
Hier könnte man noch einige Plausibilitätsprüfungen einbauen. Zum Beispiel kann man die Werte für die Mode Data
Length, den Page Code und die Page Length überprüfen.
Demo, welche diese Funktion nutzt:

Hardware Parameter Capabilities (podHardCapa.7z - 262 kb) MD5 (1 kb). Stand: 27. Januar 2012
Fr_An - Erstellt: 6. Januar 2012 - Letzte Änderung: 27. Januar 2012
seit 28. Juli 2010