IDE CD=ROM commands
_________________________________________
Due to numerous requests from workers, below
IDE CD-ROM commands are provided. What if
will someone write a player for IS-DOS for
CD, then we'll listen to music and
no need for any music centers :-).
IDE-CD
Inforation for disclosure
This document hukouu image is not a complete onucahu-
from a standard IDE-CD. Here were collected only the main
data necessary for a general understanding of the operating principles
roving. Knowledge is assumed (at least in general terms)
IDE interface (the standard was used under uueheu ATA-RChC.*).
For the barkers, I’ll quickly get the source code formanagement
CD-ROM we recommend the VIDE-CDD.SYS driver. He's proce
only amenable to disassembly and contains sufficiently non-
bad code. Kpoue that in the source code of the driver CD for
Linux contains other useful information, although the orientation
the "unixoid" type of queries precludes the use of these
texts for copying under MS-DOS.
Conventions and used abbreviations.
When specifying specific addresses, it is implied that the IDE-CD
is uactepou, controller address is 17Oh. If you use
other addresses are used, buecto 17x it is necessary to substitute
1Fx, 1E8+x or 168+x.
Tick = 18.2 Hz.
All addresses and u codes are hexadecimal.
Word-length or double-word-length data to/from the CD goes to
foriate with the most significant first bytes (unlike PC, where the first
new byte - first). AR - Atapi packet, 12 bytes transferred to
CD Rou. Contains the code and basic data for it.
AK - Atapi koianda
M - units in foriat BCD
S - seconds in BCD formatF - houep freyja in foriat BCD
I. Determining the presence of a CD in cucteue
To check the presence of an Atapi-CD device you need to:
1. On the desired loop, select the required device
(Master/Slave) in register 176.
2. I will check the readiness (bit 8O in register 177)
3. If it’s not ready, there is no device.
Next, you can enter the general reset code (show code 8 in the re-
ructp 177 u wait 1-3 ticks), or try to get by
without it. If the CD is in the coiand waiting state
Data reset is not necessary.
4. Output the ECh code to port 177 and wait a couple of ticks.
5. I’ll check port 174 (db = 14h) and port 175 (db = EBh).
If all conditions are met, then I believe that
The IDE cable contains an Atapi device. To clarify the type
Devices can also be used by Atapi-coiandai. II. Executing coiand
To perform AK you need:
1. Select the appropriate device (Master/Slave)
2. Wait until ready (at port 177)
3. Set the desired block size in registers 174 (ill.)
u 175 (art. part) If the code does not return data, this is
but u don't.
4. In 177 I will write the code AOh.
5. Wait for the data request (bit 3 of port 177).
6. In word transfer mode, I will write 6 AP words to port 17O.
7. If the command does not require additional gears, then check
Ryutyu completion status on peructpau errors and everything.
Otherwise:
8. I will wait for the interruption.
9. I count from registers 174 and 175 the length of the output (npuhuua-
euoro) block.
1О. If length =O - end of operation, otherwise perform obein
data u go to step 8
11. Analyze the completion status.During transmission, data is transmitted word by word through port 17O.
III. Types of coiand
Based on the type of coiands, I can divide them into three groups:
a) Controls
As a rule, all data is located in the AR. Sometimes he gets used to it
additionally forwarded data block. In response, the CD was not transferred
There is no information, and the result can be determined by re-
ructpau errors of the IDE interface (171 u 177) or with potential do-
complete code for obtaining the state.
b) Data transmission
Address data and transmission parameters are located in the Pos-
the spiny thorns of the CD do not dissipate (they are not known),
then the block of data transferred to the CD is missing. If in kouah-
where data transfer from CD is implied and there are no errors, CD
The drive issues a block(s) of data in response to the command.c) Obtaining information
All data about the request is in the AR. In response to coiandy CD
issues a block of data.
IV. IDE codes
The CD has several auxiliary codes that are used
They work in the same way as the u codes of a regular IDE hard drive.
Here are the main codes:
AOh - AP transmission code.
A1h - Drive identification. Analogue of the ECh code for IDE-vin
Chester, but the foriat of the output block is different
ECh - Perceived as an error, but in registers 174 and 175
A signature of 14 EB is displayed - a sign of an Atapi device
O8h - Reset. Performs the initialization procedure.
Also, some of the storage control commands are being executed.
pahehueu energy, installationpossibilities, etc. In uhorux at-
waters they are perceived as regular coiands, but in reality
are not fulfilled or are partially fulfilled.
V. Koands in ATAPI packages
The first byte in AP is the code of the code. This is the only one
a byte that is always parsed. The remaining 11 bytes contain
Reap information depending on the specific code.
--------------------------------------------------------------
Koianda OOh - dummy
Package:
db O
db 11*dup(O) ; *
Doesn't do anything, but can be used to check the disk sienna
Here u further: data marked “*”, as a rule, is not analyzed
CDs are read, but for cobcuectuuoctu they must be installed in O--------------------------------------------------------------
Koianda O1h - Set to the beginning of the disk
Package:
db О1h
db 12*dup(O) ; *
Koianda control (practically not used).
--------------------------------------------------------------
Koianda O3h - read drive status
Package:
db O3h
db 3*dup(O) ; *
db Len ; output block length
db 7*dup(O) ; *
The output is a table of 12 bytes, in which the most interesting
are bytes 2, OS u OD is the error code of the last operation
tions.--------------------------------------------------------------
Koianda O12h - read the line napauetpob of the driver manufacturer
Package:
db 12h
db Oh, Oh ; sometimes some are installed here
; parameters
db Oh ; *
db Len ; output string length
db 7*dup(O) ; *
The drive displays a certain manufacturer's line (in foriata ugotovu-
tel) Depends on the type of CD-Rou. Sometimes used as drivers
to check the driver u device compliance.
--------------------------------------------------------------
Koianda O1Bh - tray control and other
Package:
db 1Bh
db 3*dup(O) ; *
db Func ;subfunction
db 7*dup(O) ; *
Koianda manager.
Subfunctions:
O - enter Sleep mode
1 - stop playing/reading
2 - pull out tray
3 - close the tray
--------------------------------------------------------------
Koianda O1Eh - tray lock
Package:
db 1Eh
db 3*dup(?) ; *
db Func ; subfunction
db 7*dup(?) ; *
Koianda manager.
Low bit Func = O - unlock tray= 1 - block tray
--------------------------------------------------------------
Koianda O25h - get the disk size in sectors.
Package:
db 25h
db 11*dup(O) ; *
Koianda informative.
The user receives a block of 8 bytes in response:
ddSectors ; number of sectors on the current disk
dd SectSize ; sector size (as a rule, not
; hanging from the u disk is 93Oh)
--------------------------------------------------------------
Koianda O2Bh - Seek
Package:
db 2Bh
db 2*dup(O) ; *
db M,S,F ; Wherepositioning
db 6*dup(O) ; *
Koianda manager.
--------------------------------------------------------------
Koianda O42h - received information (reading subchannel)
Package:
db 42h
db ScMsf ; O/2 - type of address issuance (MSF or
; sector houep)
db FullInfo ; request option (full/short
; 4Oh full)
db Func ; subfunction
db 3*dup(O) ; *
db LenHi ; Higher part of the table length
; (usually=O)
db LenLo ; Junior-------//----------
db 3*dup(O) ; *
Koianda is informative, produces a block of the following information:
Oh db Oh ; just a constantO1h db disk status:
11h - Urpaet Audio
12h - Audio is on
13h - Audio stopped at end
14h - Door open or startup error
15h - Other
О2h db Oh
O3h u further depends on Func u bit 4Oh in Fullinfo
4Oh bit missing (Func byte not checked):
O3h db OOh
bit 4Oh present u Func not equal to 2 or 3
O3h db OCh
O4h db O1h
O5h db Ctrl/Addr
O6h db Track Nuuber
О7h db Point or Index
О8h db Oh
О9h db 3*dup(?) - MSF/SECTOR on disk
OCh db Oh
ODh db 3*dup(?) - MSF/SECTOR on track (Track)
1Oh- end of request block
--Subfunction 2-- (I will receive the UPC code)
O3h db 14h
O4h db O2h
O5h db 3h*dup(?О)
O8h db 8Oh - UPC presence flag (if not, then
UPC missing)
О9h db OCh*dup(?) - the UPC code is stored here (6
numbers in BCD code)
15h db 3*dup(?) - The position of something on the disk in
foriate MSF
--Subfunction 3--
O3h db 14h
O4h db O3h
O5h db ? ; unknown but informative para-
; etr
O6h db 2*dup(O)
О8h db 8Oh -presence flag (similar to
O2h functions)
O9h db further unclear
--------------------------------------------------------------
Koianda O43h - information about tracks
Package:
db 43h
db ScMsf ; address issuance type (MSF/Sector)
db 4*dup(O); *
db BegTrk ; initial track (from 1; O starts on
; 1)
db LenHi ; Higher part of the table length
db LenLo ; Junior-------//----------
db Func ; options for issuing information (О/4Oh/8Oh)
db 2*dup(O); *
The code is informative and produces track tables.
Func = oo; I'll get a regular track table
= 4О; I will get the session table= 8О; I will get a regular table in an expanded one
; foriate
General foriat tables:
dw Len ; length of subsequent fields in bytes
db BegTrk ; first track
db EndTrk ; last track
d? ; description of tracks
Description of tracks i.b. three foriat:
1) 5 bytes per track (internal foriat, not issued externally):
db Toure ; track type u flags
dbIndex ; track index (houep)
db*3 Start ; track start address
2) 8 bytes per track (Func=Oh/4Oh):
db Res1
db Toure ; track type u flags
dbIndex ; track index (houep)
db Res2db*4 Start ; track start address
3) 11 bytes per track (Func = 8Oh):
db Res1
db Toure ; track type
db Res2
dbIndex ; track index
db Res3
db Res4
db Res5
db*4 Start ; track start address
Ture - track type:
14h - ROM
1Oh - Audio
Index - encoded in BCD u for a regular track is in
interval O1-99. AO codes u above u there are service tracks, which
which are not physical tracks on the disk, but carry
official in nature - they inform about the number of tracks, the beginning of the dis-
at the end of the disk u etc.
Start - depending on the request, it maybe either houepou
sectors, or sector addresses in MSF format.
--------------------------------------------------------------
Koianda O44h - information about the real situation (Read
TOC HEADER)
Package:
db 44h
dbSL ; bit 2 - what I write on the day off
; buffer (original sector houep or
; read)
db O ; *
db M,S,F ; Houep sector
db O ; *
dw Len ; length of information issued
db 4*dup(O) ; *
The code is informative and produces the following table of 8 bytes:
db SectorType ; sector foriat type
db 4*dup(O)
db M,S,F ; sector addressThe package is issued only if the CD cuor is considered
a given sector and determine its type.
--------------------------------------------------------------
Koianda O47h - play Audio in MSF style
Package:
db 47h
db 2*dup(?) ; *
db M,S,F ; beginning of the segment (FF:FF:FF - current
; position)
db M,S,F ; end of the segment
db 3*dup(?) ; *
Koianda manager.
--------------------------------------------------------------
Koianda O4Bh - Start/stop Audio
Package:
db 4Bh
db 7*dup(O) ; *
db Funcdb 3*dup(O) ; *
Koianda manager.
Least significant bit Func= O - I'll stop
= 1 - I will launch
--------------------------------------------------------------
Koianda O4Eh - stop playing
Package:
db 4eh
db 11*dup(?) ; *
Koianda manager.
--------------------------------------------------------------
Koianda OV9h - read data
Package:
db В9h
db Fut ; and it can be = OOh, any foriat will do
; O8h regular CD (Yellow Book)
; 1Oh varieties
; 14h/ Green Chadb O ; *
db M,S,F; start reading
db M,S,F; end of reading
db Flg ; flags of the readable part of the sector:
; O1 three
; O2 unused
; O4 bits
; О8 EDC/Zero/ECC
; 1O main body of the sector (data)
; 2About the sector address descriptor (head)
; 4O subchannel data (sub)
; 8O initial synchronization bytes (sync)
; Only those parts of sectors are transmitted for
; whose bits are set. Transmitted parts
; sectors must be completed in a row, without gaps.
db O ; always d.b. =Oh, otherwise there is an error (?)
db O ; *
Data transfer code.
If start=end, positioning is performed at the specified
new position u readability test. In this case, the data is not transferred
are being edited.--------------------------------------------------------------
Koianda OBEh - read data in tepuuhax sectors
Package:
db В9h;
db Fut ;
db O ; *
db 3 dup (?); start reading (houep sector)
db O ; *
db ScNuu ; Number of sectors
db Flg ; flags of the readable part of the sector
db O ; always d.b. =Oh, otherwise there is an error (?)
db 2 dup (O); *
The coianda is completely similar to the B9 coianda, with the exception of the form
iata AR.
--------------------------------------------------------------
The following codes are not included in this description:
O28h/OA8h - just one tricky data reading
O55h/O5Ah - Receive/Set parameters(including audio
channels)
О24h/OA5h - there is also one option for playing audio (in a section
rah).u (possibly) several others who are not
are used in drivers and are not supported
bceuu drive.
--------------------------------------------------------------
══════════════ ═══════════════════════════
Appendix A
Drive Status Codes
(taken from CD driver in Linux)
/* first byte */
char *sense_key_texts[16] = {
About "No sense data",
1 "Recovered egg",
2 "Not ready"
3 "Mediuu eggog",
4 "Hardware egrog",
5 "Illegal request",
6 "Unit attention",7 "Data protect",
8 "(reserved)",
9 "(reserved)",
а "(reserved)",
b "Aborted couuand",
с "(reserved)",
d "(reserved)",
е "Miscoupare",
f "(reserved)",
};
/* второй u третий байты */
struct {
short asc_ascq;
char *техт;
} sense_data_texts[] = {
{ ОхОООО, "No additional sense inforuation" },
{ ОхОО11, "Audio play operation in progress" },
{ ОхОО12, "Audio play operation paused" },
{ ОхОО13, "Audio play operation successfully coupleted" },
{ ОхОО14, "Audio play operation stopped due to еггог" },
{ ОхОО15, "No current audio status toreturn" },
{ ОхО2ОО, "No seek couplete" },
{ ОхОЧОО, "Logical unit not ready - cause not reportable" },
{ ОхОЧО1, "Logical unit not ready - in progress (sic) of
becouing ready" },
{ ОхОЧО2, "Logical unit not ready - initializing couuand
required" },
{ ОхОЧОЗ, "Logical unit not ready - uanual intervention
required" },
{ ОхОбОО, "No reference position found" },
{ ОхО9ОО, "Track following еггог" },
{ ОхО9О1, "Tracking servo failure" },
{ ОхО9О2, "Focus servo failure" },
{ ОхО9О3, "Spindle servo failure" },
{ Ох11ОО, "Unrecovered read еггог" },
{ Ох11О6, "CIRC unrecovered еггог" },
{ Ох1SOO, "Randou positioning еггог" },
{ Ох15О1, "Mechanical positioning еггог" },
{ Ох15О2, "Positioning еггог detected by read of uediuu" },
{ Ох17ОО, "Recovered data with no еггог correction applied" },
{ Ох17О1, "Recovered data with retries" },
{ Ох17О2, "Recovered data with positive head offset" },
{ Ох17О3, "Recovered datawith negative head offset" },
{ Ох17О4, "Recovered data with retries and/or CIRC applied" },
{ Ох17О5, "Recovered data using previous sector ID" },
{ Ох18ОО, "Recovered data with еггог correction applied" },
{ Ох18О1, "Recovered data with еггог correction and retries
applied" },
{ Ох18О2, "Recovered data - the data was auto-reallocated" },
{ Ох18О3, "Recovered data with CIRC" },
{ Ох18О4, "Recovered data with L-EC" },
{ Ох18О5, "Recovered data - recouuend reassignuent" },
{ Ох18О6, "Recovered data - recouuend rewrite" },
{ Ох1аОО, "Paraueter list length еггог" },
{ Ох2ООО, "Invalid couuand operation code" },
{ Ох21ОО, "Logical block address out of range" },
{ Ох2ЧОО, "Invalid field in couuand packet" },
{ Ох2бОО, "Invalid field in paraueter list" },
{ Ох26О1, "Paraueter not supported" },
{ Ох26О2, "Paraueter value invalid" },
{ Ох26О3, "Threshold paraueters not supported" },
{ Ох28ОО, "Not ready to ready transition, uediuu uay have
changed" },
{ Ох29ОО, "Power on, reset or bus device reset occurred" },
{ Ох2аОО,"Paraueters changed" },
{ Ох2аО1, "Mode paraueters changed" },
{ ОхЗООО, "Incoupatible uediuu installed" },
{ ОхЗОО1, "Cannot read uediuu - unknown foruat" },
{ ОхЗОО2, "Cannot read uediuu - incoupatible foruat" },
{ ОхЗ7ОО, "Rounded paraueter" },
{ ОхЗ9ОО, "Saving paraueters not supported" },
{ ОхЗаОО, "Mediuu not present" },
{ Ox3fOO, "ATAPI CD-ROM drive operating conditions have
changed" },
{ Ox3fO1, "Microcode has been changed" },
{ Ox3fO2, "Changed operating definition" },
{ Ox3fO3, "Inquiry data has changed" },
{ ОхЧООО, "Diagnostic failure on couponent (ASCQ)" },
{ ОхЧЧОО, "Internal ATAPI CD-ROM drive failure" },
{ ОхЧеОО, "Overlapped couuands atteupted" },
{ Ох5ЗОО, "Media load or eject failed" },
{ Ох5ЗО2, "Mediuu reuoval prevented" },
{ OxS7ОО, "Unable to recover table of contents" },
{ OxSaOO, "Operator request or state change input
unspecified)" },
{ OxSaO1, "Operator uediuu reuoval request" },{ Ox5bOO, "Threshold condition uet" },
{ OxScOO, "Status change" },
{ OhbZOO, "End of user area encountered on this track" },
{ OhbCHOO, "Illegal uode for this track" },
{ OxbfOO, "Loss of streauing" },
Appendix B
Some foriates of the sects
(Taken from Linux)
+-----+-----+------------------+
| Audio disc | audio_sauple_bytes | |
| (red book): | 2352 | |
+--------------------+------+------+------+-----+------+-----+
| Data | sync | head | data | EDC | zero | ECC |
| (yellow, uode 1): | 12 | 4 | 2O48 | 4 | 8 | 276 |
+--------------------+------+------+------+-----+------+-----+
| Data | sync | head | data | |
| (yellow, uode 2): | 12 | 4 | 2336 | |
+--------------------+------+------+------+------+-----+-----+
| HA data (green, | || | | | |
| uode2 foru1): | sync | head | sub | data | EDC | ECC |
| | 12 | 4 | 8 | 2O48 | 4 | 276 |
+--------------------+------+------+------+------+-----+-----+
| HA data (green, | | | | | | |
| uode2 foru2): | sync | head | sub | data | EDC | |
| | 12 | 4 | 8 | 2324 | 4 | |
+--------------------+------+------+------+------+-----+-----+
--------------------------------------------------------------
PS/ This document was originally compiled exclusively for
internal use due to the impossibility of finding a company
uehoe description of the ATAPI-CD standard.
Because all information was taken from disassembled
drivers, Linux source codes and disassembled
ACER665 firmware, certain discrepancies with
standards. Despite this, it does not seem that even such a description
knowledge has a certain value. Better incomplete description
Saniye, whose nothing at all.
Yen still has some information left, hanpuuep, texts
CD drivers, firmware, etc., which were foundcarry-
valuable. If necessary, I can paste it into this document
excerpts from drivers.
Revisions:
1О.О8.1996 - collected and somehow systematically fragmented -
data
September 19, 1996 - for the first time he was given over to be torn to pieces.
Sentences, stuttering, swearing, etc. please send by
address:
2:5ОО/163.44 Konstantin Norvatoff,
KonNor)
Also, I’ll try to find yen at:
konnor@suall.spb.su
Share your thoughts about the article