Du bist hier: Snippet-Verzeichnis » DOS (8)
Sprache:

IDE for DOS

Sprache: English
Programmiersprache: Pascal
Veröffentlicht von: cinek [nicht registriert]
Letzte Änderung: 15.05.2006
Aufrufe: 1138


Beschreibung

This is a Pascal Unit for DOS. Look at the way how IDE devices canbe accessed.

Code

1 unit IDE; 2 interface 3 4 const IDE_PORT:array[0..1] of word=($1F0,$170); 5 6 const IDEPORT_DATA =$0; {16 bits (opt.) read/write} 7 IDEPORT_ERROR =$1; {read} 8 IDEPORT_FEATURE =$1; {write} 9 IDEPORT_SECTORCOUNT =$2; {read/write} 10 IDEPORT_SEC =$3; {read/write} 11 IDEPORT_CYL =$4; {16 bits (opt.) read/write} 12 IDEPORT_CYLLO =$4; 13 IDEPORT_CYLHI =$5; 14 IDEPORT_DRIVE =$6; {read/write} 15 IDEPORT_STATUS =$7; {read} 16 IDEPORT_COMMAND =$7; {write} 17 18 IDEPORT_STATUSEX =$206; {read} 19 IDEPORT_CONTROL =$206; {write} 20 IDEPORT_ADDRESS =$207; {read} 21 22 const CMD_EXECUTE_DRIVE_DIAGNOSTICS =$90; 23 CMD_FORMAT_TRACK =$50; 24 CMD_INIT_DRIVE_PARAMETERS =$91; 25 CMD_RECALIBRATE =$10; { $10-$1F} 26 CMD_READ_SECTORS_REP =$20; 27 CMD_READ_SECTORS =$21; 28 CMD_READ_LONG_REP =$22; 29 CMD_READ_LONG =$23; 30 CMD_READ_VERIFY_SECTORS_REP =$40; 31 CMD_READ_VERIFY_SECTORS =$41; 32 CMD_SEEK =$70; { $70-$7F} 33 CMD_WRITE_SECTORS_REP =$30; 34 CMD_WRITE_SECTORS =$31; 35 CMD_WRITE_LONG_REP =$32; 36 CMD_WRITE_LONG =$33; 37 38 CMD_ACK_MEDIA_CHANGE =$DB; 39 CMD_CHECK_POWER_MODE =$98; {optional} 40 CMD_CHECK_POWER_MODE2 =$E5; 41 CMD_DOOR_LOCK =$DE; 42 CMD_DOOR_UNLOCK =$DF; 43 CMD_IDENTIFY_DRIVE =$EC; 44 CMD_IDENTIFY_ATAPI_DRIVE =$A1; 45 CMD_IDLE =$97; {optional} 46 CMD_IDLE2 =$E3; 47 CMD_IDLE_IMMEDIATE =$95; {optional} 48 CMD_IDLE_IMMEDIATE2 =$E1; 49 CMD_READ_BUFFER =$E4; 50 CMD_READ_DMA_REP =$C8; 51 CMD_READ_DMA =$C9; 52 CMD_READ_DRIVE_STATE =$E9; 53 CMD_READ_MULTIPLE =$C4; 54 CMD_REST =$E7; 55 CMD_RESTORE_DRIVE_STATE =$EA; 56 CMD_SET_FEATURES =$EF; 57 CMD_SET_MULTIPLE_MODE =$C6; 58 CMD_SLEEP =$99; {optional} 59 CMD_SLEEP2 =$E6; 60 CMD_STANDBY =$96; {optional} 61 CMD_STANDBY2 =$E2; 62 CMD_STANDBY_IMMEDIATE =$94; {optional} 63 CMD_STANDBY_IMMEDIATE2 =$E0; 64 CMD_WRITE_BUFFER =$E8; 65 CMD_WRITE_DMA_REP =$CA; 66 CMD_WRITE_DMA =$CB; 67 CMD_WRITE_MULTIPLE =$C5; 68 CMD_WRITE_SAME =$E9; 69 CMD_WRITE_VERIFY =$3C; 70 CMD_ATAPI_SOFTRESET =$08; 71 72 procedure SendCommand(IDEPort:byte;Command:byte); 73 function DriveBusy(IDEPort:byte):boolean; 74 function DriveReady(IDEPort:byte):boolean; 75 function DriveWriteFault(IDEPort:byte):boolean; 76 function DriveSeekComplete(IDEPort:byte):boolean; 77 function DataRequest(IDEPort:byte):boolean; 78 function CorrectedData(IDEPort:byte):boolean; 79 function DriveIndexMark(IDEPort:byte):boolean; 80 function DriveError(IDEPort:byte):boolean; 81 function GetErrorFlags(IDEPort:byte):byte; 82 function DriveErrorText(IDEPort:byte):string; 83 procedure DriveSetResetandInterrupt(IDEPort:byte;ResetOn,IntrOn:Boolean); 84 function DriveWriteAccess(IDEPort:byte):boolean; 85 function DriveSelectedHead(IDEPort:byte):byte; 86 function MasterDriveSelected(IDEPort:byte):boolean; 87 function SlaveDriveSelected(IDEPort:byte):boolean; 88 procedure SelectDriveHead(IDEPort:byte;b:byte); 89 procedure SelectMasterDrive(IDEPort:byte); 90 procedure SelectSlaveDrive(IDEPort:byte); 91 procedure SelectLBAMode(IDEPort:byte;On:Boolean); 92 function WaitBusy(IDEPort:byte):boolean; 93 function GetBufferByte(IDEPort:byte):byte; 94 function GetBufferWord(IDEPort:byte):word; 95 procedure SetDriveControl(IDEPort:byte;Controlbyte:byte); 96 procedure SetBufferByte(IDEPort,b:byte); 97 procedure SetBufferWord(IDEPort:byte;w:word); 98 99 100 implementation 101 102 103 104 105 procedure SendCommand(IDEPort:byte;Command:byte); 106 begin 107 Port[IDE_PORT[IDEPort]+IDEPORT_COMMAND]:=Command; 108 end; 109 function DriveBusy(IDEPort:byte):boolean; 110 begin 111 DriveBusy:=((Port[IDE_PORT[IDEPort]+IDEPORT_STATUS] and $80)=$80); 112 end; 113 function DriveReady(IDEPort:byte):boolean; 114 begin 115 DriveReady:=((Port[IDE_PORT[IDEPort]+IDEPORT_STATUS] and $40)=$40); 116 end; 117 function DriveWriteFault(IDEPort:byte):boolean; 118 begin 119 DriveWriteFault:=((Port[IDE_PORT[IDEPort]+IDEPORT_STATUS] and $20)=$20); 120 end; 121 function DriveSeekComplete(IDEPort:byte):boolean; 122 begin 123 DriveSeekComplete:=((Port[IDE_PORT[IDEPort]+IDEPORT_STATUS] and $10)=$10); 124 end; 125 function DataRequest(IDEPort:byte):boolean; 126 begin 127 DataRequest:=((Port[IDE_PORT[IDEPort]+IDEPORT_STATUS] and $8)=$8); 128 end; 129 function CorrectedData(IDEPort:byte):boolean; 130 begin 131 CorrectedData:=((Port[IDE_PORT[IDEPort]+IDEPORT_STATUS] and $4)=$4); 132 end; 133 function DriveIndexMark(IDEPort:byte):boolean; 134 begin 135 DriveIndexMark:=((Port[IDE_PORT[IDEPort]+IDEPORT_STATUS] and $2)=$2); 136 end; 137 function DriveError(IDEPort:byte):boolean; 138 begin 139 DriveError:=((Port[IDE_PORT[IDEPort]+IDEPORT_STATUS] and $1)=$1); 140 end; 141 function GetErrorFlags(IDEPort:byte):byte; 142 begin 143 GetErrorFlags:=Port[IDE_PORT[IDEPort]+IDEPORT_ERROR]; 144 end; 145 function DriveErrorText(IDEPort:byte):string; 146 var err:string; 147 errval:byte; 148 begin 149 err:=''; 150 errval:=GetErrorFlags(IDEPort); 151 if (errval and $80)=$80 then err:=err+'Fehlermarke gefunden,'; 152 if (errval and $40)=$40 then err:=err+'ECC-Korrekturfehler,'; 153 if (errval and $20)=$20 then err:=err+'Medium gewechselt,'; 154 if (errval and $10)=$10 then err:=err+'ID nicht gefunden,'; 155 if (errval and $8)=$8 then err:=err+'Medium mu gewechselt werden,'; 156 if (errval and $4)=$4 then err:=err+'Unerlaubtes Kommando,'; 157 if (errval and $2)=$2 then err:=err+'Boottrack nicht gefunden,'; 158 if (errval and $1)=$1 then err:=err+'Adressmarke nicht gefunden,'; 159 DriveErrorText:=err; 160 end; 161 procedure DriveSetResetandInterrupt(IDEPort:byte;ResetOn,IntrOn:Boolean); 162 var b:byte; 163 begin 164 if ResetOn then b:=4 else b:=0; 165 if IntrOn then b:=b or 2; 166 Port[IDE_PORT[IDEPort]+IDEPORT_CONTROL]:=b; 167 end; 168 function DriveWriteAccess(IDEPort:byte):boolean; 169 begin 170 DriveWriteAccess:=(Port[IDE_PORT[IDEPort]+IDEPORT_ADDRESS] and $40)=0; 171 end; 172 function DriveSelectedHead(IDEPort:byte):byte; 173 begin 174 DriveSelectedHead:=(Port[IDE_PORT[IDEPort]+IDEPORT_ADDRESS] shr 2)and $f; 175 end; 176 function MasterDriveSelected(IDEPort:byte):boolean; 177 begin 178 MasterDriveSelected:=(Port[IDE_PORT[IDEPort]+IDEPORT_ADDRESS] and 1)=0; 179 end; 180 function SlaveDriveSelected(IDEPort:byte):boolean; 181 begin 182 SlaveDriveSelected:=(Port[IDE_PORT[IDEPort]+IDEPORT_ADDRESS] and 2)=0; 183 end; 184 procedure SelectDriveHead(IDEPort:byte;b:byte); 185 begin 186 Port[IDEPORT_DRIVE]:= 187 (Port[IDE_PORT[IDEPort]+IDEPORT_DRIVE] and $F0)or (b and $F); 188 end; 189 procedure SelectMasterDrive(IDEPort:byte); 190 begin 191 Port[IDE_PORT[IDEPort]+IDEPORT_DRIVE]:= 192 Port[IDE_PORT[IDEPort]+IDEPORT_DRIVE] and $EF; 193 end; 194 procedure SelectSlaveDrive(IDEPort:byte); 195 begin 196 Port[IDE_PORT[IDEPort]+IDEPORT_DRIVE]:= 197 Port[IDE_PORT[IDEPort]+IDEPORT_DRIVE] or $10; 198 end; 199 procedure SelectLBAMode(IDEPort:byte;On:Boolean); 200 begin 201 if On then Port[IDE_PORT[IDEPort]+IDEPORT_DRIVE]:= 202 Port[IDE_PORT[IDEPort]+IDEPORT_DRIVE] or $40 else 203 Port[IDE_PORT[IDEPort]+IDEPORT_DRIVE]:= 204 Port[IDE_PORT[IDEPort]+IDEPORT_DRIVE] and $BF; 205 206 end; 207 function WaitBusy(IDEPort:byte):boolean; 208 var Index:word; 209 begin 210 Index:=$FFFF; 211 while (DriveBusy(IDEPort) or (not DriveReady(IDEPort))) 212 and(Index>0) do Dec(Index); 213 if Index=0 then WaitBusy:=false else WaitBusy:=true; 214 end; 215 function GetBufferByte(IDEPort:byte):byte; 216 begin 217 GetBufferByte:=Port[IDE_PORT[IDEPort]+IDEPORT_DATA]; 218 end; 219 function GetBufferWord(IDEPort:byte):word; 220 begin 221 GetBufferWord:=Portw[IDE_PORT[IDEPort]+IDEPORT_DATA]; 222 end; 223 procedure SetBufferByte(IDEPort,b:byte); 224 begin 225 Port[IDE_PORT[IDEPort]+IDEPORT_DATA]:=b; 226 end; 227 procedure SetBufferWord(IDEPort:byte;w:word); 228 begin 229 Portw[IDE_PORT[IDEPort]+IDEPORT_DATA]:=w; 230 end; 231 procedure SetDriveControl(IDEPort:byte;Controlbyte:byte); 232 begin 233 Port[IDE_PORT[IDEPort]+IDEPORT_CONTROL]:=Controlbyte; 234 end; 235 236 end. 237

Noch kein Kommentar vorhanden

Dieses Snippet kommentieren

Name *  

E-Mail (wird nicht angezeigt) *    

Website  

Kommentar *  

Sicherheitscode Sicherheitscode *    

RSS