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