Blog literacki, portal erotyczny - seks i humor nie z tej ziemi


Turbo Pascal

Tomasz G©bala

CD-ROM zataäczy, jak mu zagramy

Ka¼dy nap©d CD-ROM potrafi odtwarza† zwykˆe pˆyty audio CD.
Czy mo¼na zmusi† go do tego, na przykˆad z pomoc¡ Turbo Pascala?
Przyznam, ¼e jest to troch© zagmatwane, ale do zrealizowania.

Wersje «r¢dˆowe odtwarzacza pˆyt audio pod Windows byˆy ju¼
prezentowane na ˆamach PCkuriera - to programistyczna ˆatwizna (gotowe
procedury w Visual Co˜tam). Poniewa¼ czuj© niewytˆumaczaln¡ niech©† do
wersji okienkowych program¢w, proponuj© czytelnikom napisanie programu
dla DOS, z minimaln¡ liczb¡ tajemniczych wska«nik¢w i w dodatku bez
obiekt¢w. B©dzie to wprawdzie wymaga† zdobycia wiekszej wiedzy oraz
minimalnej znajomo˜ci programowania w asemblerze, ale my˜l©, ¼e warto
si© potrudzi†.

Uruchamiany PC wykonuje kolejno komendy z dw¢ch plik¢w: CONFIG.SYS,
AUTOEXEC.BAT. By zainstalowa† CD-ROM w pececie nale¼y dopisa† do
CONFIG.SYS np. tak¡ lini©:

DEVICE=cdromdrv.sys /d:CDROM0001

a w AUTOEXEC.BAT:

MSCDEX.EXE /d:CDROM0001

Pierwsza instaluje w pami©ci rezydentny sterownik CD-ROM-u,
charakterystyczny dla danego typu nap©du; druga - tzw. MicroSoft CDrom
EXtensions, czyli uniwersalny sterownik dla wszystkich nap©d¢w CD-ROM.
Oba sterowniki s¡ ze sob¡ poˆ¡czone nazw¡ urz¡dzenia (np.: CDROM0001)

Sterownik rezydentny jest zbiorem procedur (lub tylko jedn¡), kt¢rych
zadaniem jest wpisywanie odpowiednich warto˜ci do odpowiednich port¢w
nap©du. Sterownik uniwersalny jest "lini¡ przesyˆow¡", kt¢ra ˆ¡czy
program ze sterownikiem *.sys. Ta pozorna komplikacja wynika z faktu,
¼e w˜r¢d port¢w CD-ROM-¢w nie ma standaryzacji, np. takiej jak dla
kart grafiki VGA (ale nie SVGA), i nie wiadomo co gdzie wpisywa†. Na
szcz©˜cie producenci CD-ROM-¢w dostarczaj¡ sterowniki *.sys, kt¢re
martwi¡ si© o to za nas.

My nie b©dziemy programowa† CD-ROM-u poprzez porty; do nas nale¼y
tylko(!) nauczy† si© wykorzystywa† MSCDEX.EXE, drugi z niezb©dnych
sterownik¢w. Na pocz¡tku zastan¢wmy si©, jak zbydowany jest dowolny
driver.sys oraz jak przekazuje si© mu dane i polecenia.

Ka¼dy driver.sys jest plikiem binarnym, ale w przeciwieästwie do
plik¢w *.com jego pocz¡tek nie zaczyna si© pod offsetem 100h, lecz
000h. Pod tym adresem znajduje si© 18-bitowy nagˆ¢wek (Device_Header),
zbudowany tak:

Offset Rozmiar Zawarto˜†

+0 4 segment:offset (daleki (FAR) adres nast©pnej procedury,
je˜li offset=0ffffh, wtedy jest to jedyna procedura w
pliku)

+4 2 zawiera atrybuty urz¡dzenia (Device_Attribute)

+6 2 offset punktu wej˜cia dla procedury Strategy drivera

+8 2 offset punktu wej˜cia dla procedury Interrupt drivera

+0a 8 nazwa urz¡dzenia (Device_Name)

Pole Device_Attribute zawiera w poszczeg¢lnych bitach
informacje o rodzaju urz¡dzenia, kt¢re obsˆuguje i sposobach
wsp¢ˆpracy. Dla nas interesuj¡ce s¡ nast©puj¡ce bity:

14: 1= potrafi wsp¢ˆpracowa† z DOS-owym przerwaniem 21h
funkcjami 4402h i 4403h

15: 1= urz¡dzenie znakowe, 0= urz¡dzenie blokowe.

Wbrew podpowiedzim intucji nap©d CD-ROM nie jest jeszcze
jednym dyskiem (czyt. urz¡dzeniem blokowym), ale urz¡dzeniem znakowym
takim jak drukarka czy klawiatura! Wymaga wi©c innego formatu danych
ni¼ urz¡dzenia blokowe.

Pola Strategy i Interrupt s¡ 16-bitowymi wska«nikami do wn©trza
drivera wzgl©dem Device_Header (segment wywoˆania procedury jest taki
sam, jak segment pocz¡tku kodu drivera). Ka¼de odwoˆanie DOS-owe
(tak¼e to pochodz¡ce od MSCDEX.EXE) najpierw wywoˆuje procedur© Strategy
(skacze do miejsca wewn¡trz drivera wskazanego przez pole Strategy) i
przekazuje w rejestrach ES:BX adres pakietu danych
(Device_Driver_Request) potrzebnych driverowi, a nast©pnie wywoˆuje
procedur© Interrupt.

Pakiet danych (Device_Driver_Request) mo¼e mie† r¢¼n¡ dˆugo˜†, ale zawsze
zaczyna si© 13-bitowym nagˆ¢wkiem (Request_Header):

Offset Rozmiar Zawarto˜†

+0 1 dˆugo˜† pakietu danych razem z nagˆ¢wkiem

+1 1 numer podjednostki (tylko dla urz¡dzeä blokowych) - u nas zawsze
0

+2 1 kod komendy (czyli: co driver ma zrobi†)

+3 2 pole statusowe (Device_Status) zawieraj¡ce informacje o
zakoäczeniu wykonywania komendy i o ewentualnych bˆ©dach.

+5 8 zarezerwowane

+0d ? dane dla drivera (zale¼ne od rodzaju kodu komendy)

Bity pola statusowego (Device_Status) przechowuj¡ informacj©
o:

0-7: rodzaj ewentualnego bˆ©du

8: 1= wszystko w porz¡dku (zawsze ustawiany przy wyj˜ciu)

9: 1= urz¡dzenie zaj©te (wˆa˜nie realizuje jak¡˜ komend©, zmieniany jest
dysk lub wˆa˜nie odtwarza pˆyt© audio)

10-14: zarezerwowane
15: 1= obsˆuga zakoäczyˆa si© bˆ©dem (kod bˆ©du w bitach 0-7)

Komendy, kt¢re b©d¡ nas interesowa† to:

3: IOCTL Input (sˆu¼y do pobierania danych z urz¡dzenia)

12: IOCTL Output (sˆu¼y do wysyˆania danych i komend do urz¡dzenia)

132: Play audio (rozpoczyna odtwarzanie audio)

133: Stop/pause play (zatrzymuje odtwarzanie audio)

136: Resume play (wznawia odtwarzanie audio po uprzednim zatrzymaniu)

Dost©p do CD-ROM-u b©dziemy realizowali na dwa r¢¼ne
sposoby: za pomoc¡ DOS-owego przerwania 21h funkcjami 4402h i 4403h
(wykonywanie komend odpowiednio 3 i 12); przez wykorzystanie
przerwania 2fh, kt¢re zostaˆo przechwycone przez MSCDEX.EXE
(realizacja pozostaˆych komend oraz innych ciekawych/niezb©dnych
funkcji). Dlaczego MSCDEX.EXE nie przechwytuje tak¼e przerwaia 21h,
to temat na inny artykuˆ.

Aby wywoˆa† ¼¡dan¡ funkcj© przerwania 2fh, nale¼y poda† w rejestrze
AH=15h (znak dla drivera, ¼e to przerwanie pochodzi od MSCDEX.EXE) i
w AL=nr_funkcji.

Do interesuj¡cych funkcji, kt¢re udost©pnia MSCDEX.EXE przez
przerwanie 2fh nale¼a np.:

00h pytanie o liczb© nap©d¢w CD-ROM

01h pytanie o list© nap©d¢w (chodzi o litery, do kt¢rych s¡ przypisane
poszczeg¢lne nap©dy lub ich podjednostki)

02h pytanie o Copyright File Name, czyli producenta nap©du

0bh sprawdzenie, czy dany nap©d jest obsˆugiwany przez MSCDEX.EXE

0ch pytanie o wersj© MSCDEX.EXE

0dh pytanie o list© liter przypisanych do nap©d¢w (podobna do func. 01h)

10h przesyˆa pakiet danych (Device_Driver_Request) do drivera.

I to ju¼(?) caˆa wiedza, kt¢r¡ nale¼y posi¡˜†,
by CD-ROM zataäczyˆ jak mu zagramy.

Przejd«my jednak do konkret¢w. Sp¢jrzmy na wydruk 1 zawieraj¡cy unit
CDRom. W wiekszo˜ci nie wymaga on komentarza, ale dwie procedury:
CDIoctl oraz DriverRequest - najwa¼niejsze, bo odpowiedzialne za
przesyˆanie danych do/z drivera *.sys przez MSCDEX.EXE - wymagaj¡
om¢wienia.

Funkcja CDIoctl zwraca warto˜† TRUE, je˜li jest wykonana bez bˆ©du;
sˆu¼y do zapisu lub odczytu danych z drivera przez wspomniane
funkcje przerwania DOS-owego 21h (4402h i 4403h). W rejestrach
DS:DX podajemy adres (wska«nik) do bloku danych (do
Device_Driver_Request). Czyli: najpierw wypeˆniamy tablic©
Device_Driver_Request danymi, nie zapominaj¡c o zerowym indeksie, a
potem wywoˆujemy funkcj©.

Procedura DriverRequest wykorzystuje przechwycone przez MSCDEX.EXE
przerwanie 2fh i jego fynkcj© 10h. Podobnie jak poprzednio: najpierw
wypeˆniamy tablic© Device_Driver_Request, a potem wywoˆujemy
procedur©, podaj¡c jako Drive numer nap©du, kt¢rego operacja ma
dotyczy† (0="A", 1="B" itd.).

Pozostaˆe funkcje i procedury albo wykorzystuj¡ ju¼ opisane,
albo bezpo˜rednio wywoˆuj¡ przerwanie 2fh.

Program z unit CDRom, wykonuj¡c si©, zaczyna od odnalezienia nazwy
wˆasnej nap©du (funkcja GetDriverName), a nast©pnie odszukuje miejsce
w pami©ci komputera, gdzie jest zainstalowany sterownik nap©du
(funkcja CDGetHandle) - znajduje adres (wska«nik do) pocz¡tku
Device_Header drivera.

Na podstawie tego unitu zostaˆ napisany prosty program do obsˆugi CD-
ROM-a z linii komend (wydruk 2). Jest to tylko ilustracja u¼ycia unitu
CDRom. Napisanie bardziej artakcyjnego programu zostawiam czytelnikom.
  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • qualintaka.pev.pl
  •