Rendszerprogramozás
A DOS és szolgáltatásai - X.
A CD-meghajtó programozása
A Microsoft CD-ROM Extension (MSCDEX) a DOS egy olyan bõvítése ami lehetõvé teszi mind High Sierra, mind ISO-9660 formátumú CD-ROM lemezek olvasását. Az alkalmazásokkal való kompatibilitást biztosítandó azok a CD-ROM lemezt úgy “látják”, mintha az egy szokványos mágneses tároló (pl. floppy, winchester) lenne.
A teljes CD-rendszer két komponensbõl áll: a CD-meghajtóval szállított hardware-függõ eszközmeghajtóból (pl. SJCDAPI.SYS) és az MSCDEX.EXE nevû eszközfüggetlen programból. Az elõbbi program olyan elemei mûveletek elvégzésére képes, mint a fej mozgatása, egy szektor olvasása/írása, vagy a meghajtó állapotának lekérdezése (pl. van -e lemez az egységben), míg utóbbi egy IFS (Installable File System - telepíthetõ file-rendszer), ami “emészthetõvé” teszi a CD-lemezeket a DOS számára.
Az eszközmeghajtó
Az MSCDEX program nem közvetlenül, hanem az eszközmeghajtón keresztül kommunikál a CD-ROM meghajtóval. Ez lehetõvé teszi különbözõ eszközmeghajtók alkalmazásával különbözõ fizikai karakterisztikájú és illesztési módú CD-meghajtók egységes kezelését az MSCDEX szintjén. Az eszközmeghajtó feladata a standard MSCDEX parancsok “lefordítása” a hardver (a CD-ROM meghajtó) számára, ilyen szinten elrejti az MSCDEX elõl, hogy valójában milyen meghajtó is van a gépben.
Az eszközmeghajtó a CONFIG.SYS-ben kerül betöltésre mint akármelyik másik eszközmeghajtó. A szintaxis a következõ:
DEVICE = <filenév> /D: <eszköznév> /N: <meghajtók száma>
A megadott eszköznevet át kell adni majd az MSCDEX számára is annak indításakor, hogy az megtalálhassa a CD eszközmeghajtóját és kommunikálni tudjon vele. Az eszközmeghajtó egy ill. több CD-ROM meghajtó használatát is támogathatja. Elõbbi esetben a /N kapcsoló elhagyható, de több meghajtó használata esetén minden egyes meghajtónak külön <eszköznev>-et kell adni.
A DOS az eszközmeghajtóval (mint minden más device driverrel is) ún. IOCTL parancsok segítségével kommunikál.
Az érvényes parancskódok a következõk:
Kód |
Jelentés |
0 |
INIT |
1 |
MEDIA CHECK |
2 |
BUILD BPB |
3 |
IOCTL INPUT |
4 |
INPUT |
5 |
NON-DESTRUCTIVE INPUT NO-WAIT |
6 |
INPUT STATUS |
7 |
INPUT FLUSH |
8 |
OUTPUT |
9 |
OUTPUT WITH VERIFY |
10 |
OUTPUT STATUS |
11 |
OUTPUT FLUSH |
12 |
IOCTL INPUT |
Kód |
Jelentés |
13 |
DEVICE OPEN |
14 |
DEVICE CLOSE |
15 |
REMOVABLE MEDIA |
16 |
OUTPUT UNTIL BUSY |
128 |
READ LONG |
130 |
READ LONG PREFETCH |
131 |
SEEK |
132 |
PLAY AUDIO |
133 |
STOP AUDIO |
134 |
WRITE LONG |
135 |
WRITE LONG VERIFY |
135 |
RESUME AUDIO |
A Microsoft az MSCDEX kidolgozásakor specifikált egy minimális, minden - az MSCDEX-szel kompatiblis - CD-ROM eszközmeghajtók által ismert és értelmezett utasításcsoportot (magyarul, amelyik eszközmeghajtó ezeket nem tudja avval nem - vagy legalábbis nem helyesen - mûködik az MSCDEX). A minimális CD-ROM eszközmeghajtó Cooked Mode 1-ben (lásd késõbb) adatszektorok olvasására képes HSG címzéssel (lásd késõbb) és megfelelõen kezeli az IOCTL hívásokat. Az eszközmeghajtók által minimálisan ismertnek feltételezett parancsok és paraméterezésük a következõ.
Init
Parancskód = 0
ES:BX = ® INIT
Init |
Offset |
Típus |
Érték |
Mezõ jelentése |
|
00 |
DB |
13 dup (?) |
request header |
||
0D |
DB |
0 |
az alegységek száma (0) |
||
* |
0E |
DD |
? |
végcím |
|
*/- |
12 |
DD |
? |
mutató a BPB-re/parancssori paraméterek |
|
16 |
DB |
0 |
blokk-egységszám |
* az eszközmeghajtó állítja be a funkcióhívás alatt
Ezt a funkciót a DOS (nem az MSCDEX) csak egyszer, az eszköz installálásakor (az eszközmeghajtó betöltésekor) hívja meg. Ez az egyetlen CD-ROM eszközmeghajtó-parancs amit maga a DOS ad ki (normális esetben); a többit mindig az MSCDEX vagy a felhasználói programok használják.
Az végcímet a hívás során az eszközmeghajtónak kell beállítani a rezidenssé tenni kívánt rész méretének megfelelõen. A funkció hívásakor eszközmeghajtó paramétereire (a DEVICE= ill. DEVICEHIGH= utáni karakterekre) a BPB (BIOS Parameter Block) pointer mutat. Ez lehetõséget nyújt az eszközmeghajtó számára esetleges parancssori paraméterek átvételére. Az inicializálás alatt az eszközmeghajtónak - az esetleges paramétereknek megfelelõen - be kell állítania device header-jében az eszközmeghajtó nevet.
Read (IOCTL input)
Parancskód = 3
ES:BX = ® IOCTLI
IOCTLI |
Offset |
Típus |
Érték |
Mezõ jelentése |
|
00 |
DB |
13 dup (?) |
request header |
||
0D |
DB |
0 |
média-leíró bájt a BPB-bõl |
||
* |
0E |
DD |
? |
átviteli cím |
|
12 |
DW |
? |
átvivebdõ bájtok száma |
||
14 |
DW |
0 |
kezdõ szektor |
||
16 |
DD |
0 |
mutató a volume ID-re 0f hiba esetén |
A média-leíró, kezdõ szektor és volume ID mezõk tartalma mind 0. Az átviteli cím egy vezérlõ-blokkra (control block) mutat, amin keresztül az eszközmeghajtóval kommunikálhatunk. A felépítése a következõ:
CDIReqBuf |
Offset |
Típus |
Érték |
Mezõ jelentése |
|
00 |
DB |
? |
végrehajtandó parancs kódja |
||
01 |
DB |
n dup(?) |
a parancs paraméterei |
A parancskódok, a szükséges Request Buffer mérete (IOCTLI rekord “átvivendõ bájtok száma” mezõje) és jelentéseik a következõk:
Kód |
Méret |
Jelentés |
0 |
5 |
Device Header címének lekérdezése |
1 |
6 |
Fej pozíciójának lekérdezése |
2 |
? |
Fenntartott |
3 |
? |
Hiba-statisztika |
4 |
9 |
Információ audio-csatornáról |
5 |
130 |
Közvetlen meghajtó-vezérlés |
6 |
5 |
Eszköz állapotának lekérdezése |
7 |
4 |
Szektor-méret lekérdezése |
8 |
5 |
Lemez-méret lekérdezése |
Kód |
Méret |
Jelentés |
9 |
2 |
Lemez-csere lekérdezése |
10 |
7 |
Audio-lemez információ |
11 |
7 |
Audio-sáv információ |
12 |
11 |
Audio Q-Channel info |
13 |
13 |
Audio Sub-Channel info |
14 |
11 |
UPC Code beolvasása |
15 |
11 |
Audio-állapot lekérdezése |
16-255 |
? |
Fenntartott |
DevHeaderAddr |
Offset |
Típus |
Érték |
Mezõ jelentése |
|
00 |
DB |
0 |
Parancs-kód |
||
* |
01 |
DD |
? |
A meghajtó device header-ének címe |
A funkció meghívásásakor az eszközmeghajtó a device-header címét helyezi a request-bufferbe.
LocationOfhead |
Offset |
Típus |
Érték |
Mezõ jelentése |
|
00 |
DB |
1 |
Parancs-kód |
||
01 |
DB |
? |
Címzési mód |
||
* |
02 |
DD |
? |
Az olvasófej pozíciója |
Az eszközmeghajtó fej pozícióját adja vissza a címzési módnak megfelelõ formában.
ErrorStatistics |
Offset |
Típus |
Érték |
Mezõ jelentése |
|
00 |
DB |
3 |
Parancs-kód |
||
* |
01 |
DB |
N dup (?) |
Hiba-statisztika |
A hiba-statisztikák még nem lettek definiálva.
Audio-chnl info |
Offset |
Típus |
Érték |
Mezõ jelentése |
|
00 |
DB |
4 |
Parancs-kód |
||
* |
01 |
DB |
? |
A 0. kimeneti csatornához kapcsolódó bementi csatorna (0,1,2,3) |
|
* |
02 |
DB |
? |
A 0. kimeneti csatorna hangerõssége (0-255) |
|
* |
03 |
DB |
? |
A 1. kimeneti csatornához kapcsolódó bementi csatorna |
|
* |
04 |
DB |
? |
A 1. kimeneti csatorna hangerõssége |
|
* |
05 |
DB |
? |
A 2. kimeneti csatornához kapcsolódó bementi csatorna |
|
* |
06 |
DB |
? |
A 2. kimeneti csatorna hangerõssége |
|
* |
07 |
DB |
? |
A 3. kimeneti csatornához kapcsolódó bementi csatorna |
|
* |
08 |
DB |
? |
A 3. kimeneti csatorna hangerõssége |
Az audio-csatornák aktuális állapotát kérdezi le. Alapbeállításban minden kimeneti csatornához a vele egyezõ sorszámú bementi csatorna van hozzárendelve és minden csatorna hangereje maximális (255).
DrvDirectCtrlI |
Offset |
Típus |
Érték |
Mezõ jelentése |
|
00 |
DB |
5 |
Parancs-kód |
||
* |
01 |
DB |
? |
Átvitt bájtok száma |
|
* |
02 |
DB |
128 DUP(?) |
Adat-buffer |
E funkció és párja ( Write(IOCTL Ouput) - Közvetlen Meghajtó-vezérlés (írás) ) használatával nyílik lehetõség közvetlenül a meghajtóval való kommunikációra. A funkció hívása után az átvitt bájtok számát a megfelelõ mezõ adja meg, ez azonban nem lépheti túl a 128 bájtot. Ennél több információ átvitele több egymás után funkcióhívás alkalmazásával lehetséges.
A funkció alkalmazása és paraméterei teljesen eszközfüggõek, mindössze csak azért került definiálásra, hogy szabványos lehetõséget biztosítson a specifikációban nem definiált, de különbözõ meghajtók által támogatott funkciók használatára.
DeviceStatus |
Offset |
Típus |
Érték |
Mezõ jelentése |
|
00 |
DB |
6 |
Parancs-kód |
||
* |
01 |
DD |
? |
Státusz |
Az eszközmeghajtó által visszaadott állapot-leíró bitjeinek jelentése a következõ:
Bit |
Ha kikapcsolt (0) |
Ha bekapcsolt (1) |
0 |
A meghajtó ajta be van csukva |
A meghajtó ajta nyitva van |
1 |
A meghajtó tálcája nyitható |
A meghajtó tálcája zárva van (locked) |
2 |
Csak cooked olvasást támogat |
A raw olvasási módot is támogatja |
3 |
Csak olvasható |
Írható-olvasható |
4 |
Csak adat-sávok elérését támogatja |
Audio/video sávokat is kezel |
5 |
Nem támogatja az “szektor-fésülést” (interleaving) |
Támogatja az interleaving-et |
6 |
Fenntartott |
- |
7 |
Nem támogatja az elõre-olvasást (prefetching) |
Támogatja az elõre-olvasást |
8 |
Nem támogatja az audio-csatornák vezérlését |
Támogatja az audi-csatorna manipulációkat |
9 |
Csak a HSG címzési módot támogatja |
A HSG és a Red Book címzést is támogatja |
10-31 |
Fenntartott |
- |
SectorSize |
Offset |
Típus |
Érték |
Mezõ jelentése |
|
00 |
DB |
7 |
Parancs-kód |
||
01 |
DB |
? |
Olvasási mód (cooked/raw) |
||
* |
02 |
DW |
? |
Szektor-méret |
A szektorméret CD-ROM esetében cooked módban 2048, míg raw módban 2352 bájt.
VolumeSize |
Offset |
Típus |
Érték |
Mezõ jelentése |
|
00 |
DB |
8 |
Parancs-kód |
||
* |
01 |
DD |
? |
Lemez-méret (szektorokban) |
Az eszközmeghajtó a lemez TOC-jából (Table Of Contents - tartalomjegyzék) beolvassa a lead-out track (lásd késõbb) pozícióját és ezt adja vissza a lemezen található szektorok számaként.
MediaChange |
Offset |
Típus |
Érték |
Mezõ jelentése |
|
00 |
DB |
9 |
Parancs-kód |
||
* |
01 |
DB |
? |
Lemez-csere állapotkód |
Az eszközmeghajtó által visszadott állapotkód értelmezése:
Érték |
Jelentés |
0 |
Nem történt lemez-csere |
1 |
Nem állapítható meg lemezcsere |
255 (-1) |
Lemez-csere történt |
AudioDiskInfo |
Offset |
Típus |
Érték |
Mezõ jelentése |
|
00 |
DB |
10 |
Parancs-kód |
||
* |
01 |
DB |
? |
Legalacsonyabb sáv-sorszám |
|
* |
02 |
DB |
? |
Legmagasabb sáv-sorszám |
|
* |
03 |
DD |
? |
A lead-out track kezdõpozíciója (Red Book formátumban!) |
Az eszközmeghajtó a lemez lead-in (legelsõ) sávjából beolvasott információkat adja vissza. A sávsorszámok mind bináris értékek (nem BCD), a lead-out track pozíciója pedig Red Book formátumú cím.
AudioTrackInfo |
Offset |
Típus |
Érték |
Mezõ jelentése |
|
00 |
DB |
11 |
Parancs-kód |
||
01 |
DB |
? |
Sáv száma |
||
* |
02 |
DD |
? |
A sáv kezdõpozíciója (Red Book formátumban!) |
|
* |
06 |
DB |
? |
Sáv-típus |
Az eszközmeghajtó a megadott sáv kezdõpozícióját adja vissza Red Book formátumban. A sáv-típus értelmezése a következõ:
Bitmaszk |
Jelentés |
00x00000 |
2-csatornás, hangkiemelés nélkül |
00x10000 |
2-csatornás, hangkiemeléssel (pre-emphasis) |
10x00000 |
4-csatornás, hangkiemelés nélkül |
10x10000 |
4-csatornás, hangkiemeléssel |
01x00000 |
adat-sáv |
Bitmaszk |
Jelentés |
01x10000 |
fenntartott |
11xx0000 |
fenntartott |
xx0x0000 |
digitális másolás tilos |
xx1x0000 |
digitális másolás engedélyezve |
AudioQChnlInfo |
Offset |
Típus |
Érték |
Mezõ jelentése |
|
00 |
DB |
12 |
Parancs-kód |
||
* |
01 |
DB |
? |
Control és Adr bájt (halvány lila gõzöm sincs, hogy ez mi) |
|
* |
02 |
DB |
? |
Sávszám |
|
* |
03 |
DB |
? |
Index (essemtommi) |
|
* |
04 |
DB |
? |
MIN (Lejátszási pozíció a sávon belül) |
|
* |
05 |
DB |
? |
SEC |
|
* |
06 |
DB |
? |
FRAME |
|
* |
07 |
DB |
0 |
Fenntartott |
|
* |
08 |
DB |
? |
PMIN (Lejátszási pozíció a lemezen) |
|
* |
09 |
DB |
? |
SEC |
|
* |
0A |
DB |
? |
FRAME |
E funkció segítségével állapítható meg, hogy hol tart az audio-sáv lejátszása. A visszaadott a sávon elejéhez képesti relatív ill abszolút pozíció mezõi a Red Book címzésnek megfelelõen értelmezendõk.
SubChnlInfo |
Offset |
Típus |
Érték |
Mezõ jelentése |
|
00 |
DB |
13 |
Parancs-kód |
||
01 |
DD |
? |
Kezdõ frame címe (Red Book!) |
||
05 |
DD |
? |
Átviteli cím |
||
09 |
DD |
? |
Beolvasandó szektorok száma |
Az eszközmeghajtó a megadott kezdõpozíciótól kezdve szektoronként 96 bájt nyers sub-channel információt olvas be a memóriába a megadott átviteli címre.
SubChnlInfo |
Offset |
Típus |
Érték |
Mezõ jelentése |
|
00 |
DB |
14 |
Parancs-kód |
||
* |
01 |
DB |
? |
Control és Adr bájt (lásd fent) |
|
* |
02 |
DB |
7 DUP(?) |
UPC/EAN kód |
|
03 |
DB |
0 |
Fenntartott |
||
* |
04 |
DB |
? |
AFrame |
A funkció a CD-meghajtóban található lemez UPC-ját (Universal Product Code - Egyedi Termék Azonosító, magyarul katalogizálási szám) adja vissza. Az UPC 13 darab számjegybõl áll, melyek mindegyike 4 biten van kódólva, így az UPC utolsó 4 bitje mindig 0. Amennyiben a lemezen nem található UPC bejegyzés Sector Not Found hibakódot kapunk vissza.
AudioStatus |
Offset |
Típus |
Érték |
Mezõ jelentése |
|
00 |
DB |
15 |
Parancs-kód |
||
* |
01 |
DW |
? |
Audio-státusz (0. bit lejátszás felfüggesztve, 1.-15. fenntartva) |
|
* |
03 |
DD |
? |
Az utolsó Play v. a következõ Resume (lásd késõbb) kezõpozíciója |
|
* |
07 |
DD |
? |
Az utolsó Play v. a következõ Resume végpozíciója |
Phuuuuu... Akinek kicsit sok az tanulmányozgassa a PWRCD090.ZIPfájl tartalmát illetve az eszközmeghajtókról szóló elõzõ részeket. Legközelebb folytatjuk...
A cikk Winword DOC formátumban
A cikkhez tartozó PWRCD090.ZIP
- STING -
eMail:PC-XUser@IDG.HU, Subject: "RProg rovat"
Vissza a PC-X User 10 fôoldalához