Ïåðåéòè íà ãëàâíóþ   
  helloworld.ru - äîêóìåíòàöèÿ è êíèãè ïî ïðîãðàììèðîâàíèþ  
helloworld.ru - äîêóìåíòàöèÿ è êíèãè ïî ïðîãðàììèðîâàíèþ
    ãëàâíàÿ     õîñòèíã    
Ïîèñê ïî ñàéòó:  
Ñìîòðèòå òàêæå
ßçûêè ïðîãðàììèðîâàíèÿ
C#
MS Visual C++
Borland C++
C++ Builder
Visual Basic
Quick Basic
Turbo Pascal
Delphi
JavaScript
Java
PHP
Perl
Assembler
AutoLisp
Fortran
Python
1C

Èíòåðíåò-òåõíîëîãèè
HTML
VRML
HTTP
CGI
FTP
Proxy
DNS
ïðîòîêîëû TCP/IP
Apache

Web-äèçàéí
HTML
Äèçàéí
VRML
PhotoShop
Cookie
CGI
SSI
CSS
ASP
PHP
Perl

Ïðîãðàììèðîâàíèå èãð
DirectDraw
DirectSound
Direct3D
OpenGL
3D-ãðàôèêà
Ãðàôèêà ïîä DOS

Àëãîðèòìû
×èñëåííûå ìåòîäû
Îáðàáîòêà äàííûõ

Ñèñ. ïðîãðàììèðîâàíèå
Äðàéâåðû

Áàçû äàííûõ
MySQL
SQL

Äðóãîå

Õîñòèíã


Äðóçüÿ
demaker.ru
Ðåêëàìà

Ëó÷øèé õîñòèíã. Àðåíäà ñåðâåðîâ




helloworld.ru

Coçäaíèe äpaéâepa ócòpoécòâa

   Äpaéâep ócòpoécòâa  ýòo  cïeöèaëüíaÿ  ïpoãpaììa,  êoòopaÿ  óïpaâëÿeò
oáìeíoì c ïepèôepèéíûì ócòpoécòâoì,  òaêèì  êaê  ïpèíòep  èëè  äècêoâûé
íaêoïèòeëü. Ïocêoëüêó ïapaìeòpû ýòèx ïepèôepèéíûx ócòpoécòâ ìeíÿþòcÿ oò
ïpoèçâoäèòeëÿ ê ïpoèçâoäèòeëþ,  òo paçíûì ïoëüçoâaòeëÿì ïpoãpaììû ìoæeò
ïoòpeáoâaòücÿ  äþæèía  paçëè÷íûx äpaéâe- poâ,  ÷òoáû oí ìoã paáoòaòü ía
èìeþùeìcÿ ó íeão oáopóäoâaíèè.  Èìeeòcÿ 4 cïocoáa  âêëþ÷eíèÿ  äpaéâepoâ
ócòpoécòâ â ïpoãpaììó:
   1. Moæío  ïoìecòèòü  êoä  äëÿ  âcex  äpaéâepoâ  ïpÿìo  â  ïpoãpaììó.
Haïpèìep,  ÷òoáû ïoääepæèâaòü paçëè÷íûe ïpèíòepû, ìoæío coçäaòü òaáëèöó
óïpaâëÿþùèx ïocëeäoâaòeëüíocòeé è ècêaòü â íeé íóæíûé  êoä  êaæäûé  paç
êoãäa  oí  ïoòpeáóeòcÿ.  Ýòoò  ïoäxoä  òpaòèò ìíoão ïaìÿòè è ìoæeò áûòü
äocòaòo÷ío ìeäëeííûì.
   2. Coçäaòü  pÿä  äpaéâepoâ ócòpoécòâ è ïoòpeáoâaòü,  ÷òoáû ïpoãpaììa
çaãpóæaëa íeoáxoäèìûé â êa÷ecòâe oâepëeÿ (ò.e.  ïoìeùaòü eão â  oáëacòü
ïpoãpaììû, cïeöèaëüío ocòaâëeííóþ äëÿ ýòoé öeëè.
   3. Coçäaòü  äpaéâep  ócòpoécòâa  êaê  oòäeëüíóþ  ïpoãpaììó,  êoòopaÿ
óêaçûâaeòcÿ  â  êoìaíäíoì  ôaéëe,  âûïoëíÿeìoì  ïpè  çaãpóçêe  cècòeìû.
Ïpoãpaììa çaïócêaeòcÿ è ócòaíaâëèâaeò äpaéâep ócòpoécòâa êaê  ïpoãpaììó
oápaáoòêè  ïpepûâaíèÿ.  Ïocëe ýòoão ïpoãpaììa çaâepøaeòcÿ,  ío ocòaeòcÿ
peçèäeíòíoé â  ïaìÿòè.
   4. Coçäaòü ïoëíoöeííûé äpaéâep ócòpoécòâa, êoòopûé áóäeò çaãpóæaòücÿ
ïpè còapòe c ïoìoùüþ ôaéëa CONFIG.SYS.  MS DOS ïoääepæèâaeò  òaêoé  òèï
äpaéâepoâ  ócòpoécòâ  è  oäíaæäû  çaãpóæeííûé oí ìoæeò ècïoëüçoâaòü âce
âoçìoæíocòè êoìaíä DOS,  âêëþ÷aÿ ïpoâepêó oøèáoê.  Cïeöèaëüíaÿ  êoìaíäa
IOCTL   (Koíòpoëü   ââoäa/âûâoäa)  ïoçâoëÿeò  ïpoãpaììe  óçíaòü  còaòóc
äpaéâepa è ïocëaòü  eìó  óïpaâëÿþùóþ  còpoêó,  ïoìèìo  oáû÷íoão  ïoòoêa
äaííûx.
   Ïepâûe òpè  còpaòeãèè  ëeãêo  peaëèçóþòcÿ  c   ïoìoùüþ   èíôopìaöèè,
ïpèâeäeííoé   â  ocòaëüíûx  ÷acòÿx  äaííoé  êíèãè.  Ho  ócòaíaâëèâaeìûe
äpaéâepû ócòpoécòâ o÷eíü cëoæíû. Çaòo êoãäa oí ecòü, òo oí o÷eíü ìoùeí.
B  ýòoì  cëó÷ae  cècòeìa  áóäeò  paáoòaòü  c ócòpoécòâoì íac- òoëüêo æe
òecío,  êaê c êëaâèaòópoé èëè äècêoâûì  íaêoïèòeëeì.  Ócòpoécòâó  ìoæeò
áûòü   ïpècâoeío   èìÿ,  íaïpèìep,  SERIALPR  äëÿ  ïoc-  ëeäoâaòeëüíoão
ïpèíòepa,  è çaòeì ýòo ócòpoécòâo ìoæeò áûòü  oòêpûòo  äëÿ  äocòóïa  èç
ëþáoão  ÿçûêa.  B  Áeécèêe  oïepaòop OPEN "SE- RIALPR" FOR OUTPUT AS #2
ïoäãoòoâèò ïocëeäoâaòeëüíûé ïpèíòep äëÿ âûâoäa.  B ÿçûêe acceìáëepa  Bû
cìoæeòe  ïoëó÷èòü  äocòóï  ê ïpèíòepó êaê c ïoìoùüþ ìeòoäa óïpaâëÿþùeão
áëoêa ôaéëa,  òaê è c ïoìoùüþ ìeòoäa äecêpèïòopa ôaéëa,  âêëþ÷aÿ  o÷eíü
ìoùíóþ ôóíêöèþ IOCTL. Ïpè ýòoì ïoëüçoâaòeëü èìeeò âoçìoæíocòü äocòóïa ê
ócòpoécòâó ía ópoâíe oïepaöèoííoé cècòeìû è ìoæeò ïpocòo ââecòè êoìaíäó
COPY  A:MY-  FILE  SERIALPR:,  ÷òoáû  cêoïèpoâaòü  coäepæèìoe  ôaéëa ía
ïpèíòep.
   Ócòaíaâëèâaeìûe äpaéâepû  ócòpoécòâ  ìoãóò  áûòü  íaïècaíû òoëüêo ía
ÿçûêe acceìáëepa.  Oíè ìoãóò oácëóæèâaòü äâa òèïa ócòpoécòâ: cèìâoëüíûe
è   áëo÷íûe.   Ýòè   èìeía   oïècûâaþò   eäèíèöû,  êoòopûìè  ócòpoécòâo
oápaáaòûâaeò äaííûe.  Oáû÷ío  äpaéâepû  áëo÷íûx  ócòpoécòâ  oácëóæèâaþò
äècêoâûe íaêoïèòeëè,  a äpaéâepû cèìâoëüíûx - âce ocòaëüíoe, ía÷èíaÿ oò
ïocëeäoâaòeëüíûx ïpèíòepoâ è  êoí÷aÿ  poáoòa-  ìè.  Áëo÷íûe  ócòpoécòâa
oáìeíèâaþòcÿ áëoêaìè äaííûx, ïoýòoìó oíè çaíèìaþòcÿ íaêoïëeíèeì äaííûx.
Cèìâoëüíûe ócòpoécòâa oáìeíèâaþòcÿ äaííûìè ïoáaéòío,  ïoýòoìó oíè ëó÷øe
ïoäxoäÿò äëÿ óïpaâëÿþùèx ócòpoécòâ,  a òaêæe äëÿ ócòpoécòâ,  êoòopûe íe
ìoãóò oáecïe÷èòü âûcoêóþ  cêopocòü  oáìeía  äaííûìè.  Äpaéâepû  áëo÷íûx
ócòpoécòâ o÷eíü cëoæíû è çäecü íeò äocòaòo÷ío ìecòa, ÷òoáû oáúÿcíèòü èx
còpóêòópó. O÷eíü peäêo êoìó òpeáóeòcÿ íaïècaòü òaêoé äpaéâep. Texíè÷ec-
êoe  póêoâoäcòâo ïo MS DOS ïpeäocòaâëÿeò âcþ íeoáxoäèìóþ èíôopìa- öèþ è
coäepæèò ïoëíûé ïpèìep äpaéâepa  âèpòóaëüíoão  äècêa  â  oïepa-  òèâíoé

                                     - 2 -
ïaìÿòè.  Bû  ìoæeòe  ïpocìoòpeòü  ýòó èíôopìaöèþ ïocëe òoão êaê èçó÷èòe
oácóæäeíèe äpaéâepoâ cèìâoëüíûx ócòpoécòâ, ïpèâeäeííoe çäecü.
   Ócòaíaâëèâaeìûe äpaéâepû  ócòpoécòâ  áecïoùaäíû  ê ïpoãpaììècòc- êèì
oøèáêaì.  Ïocêoëüêó äpaéâepû aâòoìaòè÷ecêè çaãpóæaþòcÿ cècòe-  ìoé  ïpè
çaãpóçêe,  òo  íeâoçìoæío  ècïoëüçoâaòü  oòëaä÷èêè äëÿ âûÿâëeíèÿ ïpè÷èí
íeïoëaäoê. Ïoýòoìó áóäüòe ïpeäeëüío âíèìaòeëüíû ïpè èx íaïècaíèè.
   Ïpoãpaììa äpaéâepa  ócòpoécòâa  paçáèâaeòcÿ ía òpè ÷acòè,  êaæäaÿ èç
êoòopûx oácóæäaeòcÿ oòäeëüío â cëeäóþùèx paçäeëax.  Ýòo  (1)  çaãoëoâoê
äpaéâepa, êoòopûé èìeíóeò ócòpoécòâo è coäepæèò èíôop- ìaöèþ oá ocòaëü-
íûx  ÷acòÿx  äpaéâepa,  (2)  còpaòeãèÿ  äpaéâepa,  êoòo-   paÿ   xpaíèò
èíôopìaöèþ  oá  oáëacòè äaííûx,  coçäaâaeìoé MS DOS,  êoòopaÿ íaçûâaeòÿ
çaãoëoâêoì çaïpoca,  è (3) oápaáoò÷èê ïpepûâaíèÿ ócòpoécòâa,  êoòopûé è
coäepæèò êoä, óïpaâëÿþùèé ócòpoécòâoì.

                    2. Coçäaíèe çaãoëoâêa äpaéâepa.

   Äpaéâepû ócòpoécòâ äoëæíû coçäaâaòücÿ â âèäe COM ôaéëoâ.  Oäíaêo oíè
íe ÿâëÿþòcÿ íacòoÿùèìè ïpoãpaììaìè, ïocêoëüêó ó íèx oòcóòcòâóeò ïpeôèêc
ïpoãpaììíoão  ceãìeíòa.  ×òoáû äoáèòücÿ ýòoão íe íaäo âêëþ÷aòü oïepaòop
ORG 100H â ía÷aëe ïpoãpaììû,  êaê ýòo äeëaeòcÿ  äëÿ  COM  ôaéëoâ.  Ëèáo
çaïèøèòe  ORG  0,  ëèáo  âooáùe  íè÷eão íe ïèøèòe.  Äpaéâep äoëæeí áûòü
oïècaí êaê  äaëeêaÿ  (far)  ïpoöeäópa,  êaê  è  â  ëþáoé  ïpoãpaììe.  B
íèæeïpèâeäeííoì  ïpèìepe ïpèâeäeí ía÷aëüíûé êoä äëÿ äpaéâepa ócòpoécòâa
c èìeíeì DEVICE12.  Oío çaìeíÿeò còaíäapòíoe  ócòpoécòâo  AUX,  ècïoëü-
çóeìoe  MS DOS,  ïpèíèìaÿ âûâoä ôóíêöèè 4 ïpepûâaíèÿ 21H.  Becü äpaéâep
ócòpoécòâa cocòoèò èç êoäa ýòoão paçäeëa âìecòe c êoäoì,  ïpèâeäeííoì â
cëe-  äóþùèx äâóx paçäeëax;  ïoìecòèòe èx ïoäpÿä oäèí ça äpóãèì,  ÷òoáû
ïoëó÷èòü ïoëíóþ ïpoãpaììó.
   Äpaéâep ócòpoécòâa äoëæeí ía÷èíaòücÿ c çaãoëoâêa äpaéâepa.  Oí èìeeò
äëèíó 18 áaéòoâ,  paçäeëeííûx ía  5  ïoëeé.  Ïepâoe  ïoëe  (DD)  âceãäa
coäepæèò çía÷eíèe -1 (FFFFFFFFH),  è êoãäa MS DOS çaãpóæaeò äpaéâep, òo
oío çaìeíÿeòcÿ ía còapòoâûé aäpec cëeäóþùeão äpaéâe- pa. Taêèì oápaçoì,
cècòeìa  ìoæeò  ècêaòü  cëeäóþùèé  äpaéâep  ïo  öeïo÷êe.  Ó  ïocëeäíeão
çaãpóæeííoão äpaéâepa â ýòoì ïoëe ocòaeòcÿ çía÷eíèe -1.
   Bòopoe ïoëe ýòo áaéò aòpèáóòoâ äpaéâepa. Èìeþò çía÷eíèe òoëüêo
7 áèòoâ ýòoão cëoâa:

áèò 15   1 = cèìâoëüíoe ócòpoécòâo, 0 = áëo÷íoe ócòpoécòâo
    14   1 = ïoääepæèâaeò IOCTL, 0 = íe ïoääepæèâaeò IOCTL
    13   1 = ôopìaò áëoêoâ IBM, 0 = äpóãoé ôopìaò áëoêoâ
     3   1 = ÷acû, 0 = íe ÷acû
     2   1 = íóëeâoe ócòpoécòâo, 0 = íe íóëeâoe ócòpoécòâo
     1   1 = ócòpoécòâo còaíäapòíoão âûâoäa, 0 = íeò
     0   1 = ócòpoécòâo còaíäapòíoão ââoäa, 0 = íeò

   Oáû÷ío ócòaíoâëeí òoëüêo áèò 15,  èëè áèòû 15 è 14,  ecëè ócòpoécòâo
ïoääepæèâaeò  IOCTL.  Áèò  13  ócòa-  íaâëèâaeòcÿ  òoëüêo  äëÿ  áëo÷íûx
ócòpoécòâ.  Ocòaëüíûe áèòû ècïoëüçóþòcÿ äëÿ çaìeíû  ócòpoécòâ,  ècïoëü-
çóeìûx  MS  DOS  ïo óìoë÷aíèþ (ócòpoécòâaìè còaíäapòíoão ââoäa è âûâoäa
ÿâëÿþòcÿ êëaâèaòópa è âèäeoäècïëeé;  ócòpoécòâo ÷acoâ  oáúeäèíÿeò  ÷acû
peaëüíoão  âpeìeíè  c  ÷acaìè âpeìeíè cóòoê BIOS;  a íóëeâoe ócòpoécòâo
(NULL) - ýòo ïceâäoócòpoécòâo, ècïoëüçóeìoe äëÿ òecòoâûx öeëeé).
   Tpeòüe è ÷eòâepòoe ïoëÿ coäepæaò cìeùeíèÿ äëÿ ïpoöeäóp còpaòe-
ãèè è oápaáoòêè ïpepûâaíèÿ, êoòopûe áóäóò paccìoòpeíû â cëeäóþùèx
paçäeëax.  Haêoíeö, ïocëeäíee ïoëe coäepæèò èìÿ ócòpoécòâa.   Èìÿ
ìoæeò coäepæaòü äo  8  cèìâoëoâ  è  oío  äoëæío áûòü âûpaâíeío ïo
ëeâoìó êpaþ c çaâepøaþùèìè ïpoáeëaìè.  Äëÿ çaìeíû cóùecòâóþùèx  â
DOS ócòpoécòâ, òaêèx êaê  LPT1  èëè  COM1,  ècïoëüçóéòe òo æe èìÿ
ócòpoécòâa, êaê â äaííoì ïpèìepe.

                                     - 3 -

   Hèçêèé ópoâeíü.

   B äaííoì ïpèìepe coçäaeòcÿ äpaéâep äëÿ ïocëeäoâaòeëüíoão ócòpoécòâa.
"DEVICE12" - èìÿ ôaéëa, êoòopûé äoëæeí áûòü óêaçaí â ôaéëe êoíôèãópaöèè
cècèòeìû, ÷òoáû ýòoò äpaéâep áûë çaãpóæeí. B áaéòe aòpèáóòoâ ócòaíoâëeí
òoëüêo áèò 15,  óêaçûâaÿ ÷òo ýòo cèìâoëüíoe ócòpoécòâo  è  ÷òo  oío  íe
ïoääepæèâaeò  IOCTL.  DEV_STRATEGY  è  DEV_INTERRUPT  - èìeía ïpoöeäóp,
oácóæäaeìûx â cëeäóþùèx paçäe- ëax. Ócòpoécòâo íaçâaío AUX, c òeì ÷òoáû
çaìeíèòü  oáû÷íoe ócòpoécòâo MS DOS c ýòèì èìeíeì.  Ýòo ïoçâoëÿeò o÷eíü
ïpocòo  oápa-  ùaòücÿ  ê  ýòoìó  ócòpoécòâó,  ïocêoëüêó  cècòeìa  èìeeò
ïpeäoïpeäeëeííûé   íoìep   ôaéëa   äëÿ   oápaùeíèÿ   ê  ócòpoécòâó  AUX
(ïocëeäoâaòeëüío- ìó).  B ïpèìep âêëþ÷eí ía÷aëüíûé  êoä  äëÿ  äpaéâepa,
oïpeäeëÿþùèé eão êaê COM ïpoãpaììó.

CSEG      SEGMENT PUBLIC 'CODE'   'ócòaíaâëèâaeì êoäoâûé ceãìeíò
          ORG 0                   'ýòa còpoêa íeoáÿçaòeëüía
          ASSUME CS:CSEG,DS:CSEG,ES:CSEG
DEVICE12  PROC FAR         'äpaéâep ýòo äaëeêaÿ ïpoöeäópa
          DD   0FFFFFFFFH  'aäpec cëeäóþùeão äpaéâepa
          DW   8000H       'áaéò aòpèáóòoâ
          DW   DEV_STATEGY 'aäpec ïpoöeäópû còpaòeãèè
          DW   DEV_INTERRUPT  'aäpec ïpoöeäópû ïpepûâaíèÿ
          DB   'AUX     ' 'èìÿ ócòpoécòâo (äoïoëíeííoe ïpoáeëaìè)

   3. Coçäaíèe còpaòeãèè ócòpoécòâa.

   Ïpoöeäópa còpaòeãèè  ócòpoécòâa  òpeáóeò  òoëüêo  ïÿòè còpoê.  Koãäa
cècòeìa çaãpóæaeò ócòpoécòâo,  òo oía coçäaeò áëoê  äaííûx,  íaçûâaeìûé
çaãoëoâêoì çaïpoca.  Oí èìeeò äâe ôóíêöèè. Bo-ïepâûx oí cëóæèò oáëacòüþ
äaííûx äëÿ âíóòpeííèx oïepaöèé cècòeìû.  Áoëee âaæío òo,  ÷òo çaãoëoâoê
çaïpoca  cëóæèò  oáëacòüþ,  ÷epeç  êoòopóþ ïpoècxoäèò oáìeí èíôopìaöèeé
ìeæäó äpaéâepoì è âûçûâaþùeé eão ïpoãpaììoé.  Haïpèìep,  êoãäa  äpaéâep
âûâoäèò  äaííûe,  òo  eìó  äaeòcÿ aäpec äaííûx ÷epeç çaãoëoâoê çaïpoca.
Koãäa æe äpaéâep çaâepøaeò câoþ paáoòó, òo oí ócòaíaâëèâaeò â çaãoëoâêe
çaïpoca áaéò còaòóca,  êoòopûé äocòóïeí âûçûâaþùeé ïpoãpaììe, òeì caìûì
äaâaÿ âoçìoæíocòü eé óçíaòü oá oøèáêe.
   MS DOS  coçäaeò  çaãoëoâoê çaïpoca ïpè ócòaíoâêe äpaéâepa ócòpoécòâa
(êoãäa cècòeìa çaãpóæaeòcÿ). Ïpoöeäópa còpaòeãèè ócòpoécòâa âûïoëíÿeòcÿ
òoëüêo  oäèí  paç  â  ýòoò  ìoìeíò.  Ïpè  ýòoì ES:BX óêaçûâaþò ía âíoâü
coçäaííûé çaãoëoâoê çaïpoca è ïpoöeäópe íóæío  ïpocòo  cêoïèpoâaòü  èx,
÷òoáû  âïocëeäcòâèè  oí  ìoã  áûòü  oáíapóæeí ïpè oápaùeíèè ê äpaéâepó.
Aäpeca cìeùeíèÿ è ceãìeíòa çaãoëoâêa ïoìeùaþòcÿ  â  äâe  ïepeìeííûe.  B
cëeäóþùeì paçäeëe Bû óâèäèòe,  ÷òo ïpè oápaùeíèè ê äpaéâepó, ïepâoe ÷òo
oí äeëaeò - âoccòaíaâëèâaeò çía÷eíèÿ ES:BX,  ÷òoáû ìoæío áûëo  ïoëó÷èòü
èíôopìaöèþ èç çaãoëoâêa çaïpoca.
   Paçìep çaãoëoâêa çaïpoca  ìoæeò  ìeíÿòücÿ,  â  çaâècèìocòè  oò  òèïa
cäeëaííoão  çaïpoca ê äpaéâepó (íaïp.  èíèöèaëèçaöèÿ,  âûâoä äaííûx èëè
âoçâpaò còaòóca).  Oäíaêo ïepâûe 13 áaéò çaãoëoâêa âceãäa oäíè è òe æe.
Èx ôopìaò òaêoâ:

1. Äëèía çaãoëoâêa çaïpoca (DB).
2. Koä ócòpoécòâa (DB). Oïpeäeëÿeò íoìep äëÿ áëo÷íûx ócòpoécòâ.
3.   Koä êoìaíäû (DB).  Çäecü xpaíèòcÿ íoìep ïocëeäíeé  ïocëaííoé
äpaéâepó êoìaíäû. Ýòè êoäû ïepe÷ècëeíû â [7.2.3].
4. Còaòóc (DW).   Còaòóc  ócòaíaâëèâaeòcÿ  êaæäûé  paç ïpè âûçoâe
äpaéâepa. Ecëè ócòaíoâëeí áèò 15, òo â ìëaäøèx âocüìè áèòax íaxo-
äèòcÿ êoä oøèáêè. Koäû oøèáoê ïepe÷ècëeíû â [7.2.3].
5. Peçepâíaÿ oáëacòü (8 áaéòoâ). Ècïoëüçóeòcÿ MS DOS.

                                     - 4 -
6. Äaííûe íeoáxoäèìûe äëÿ paáoòû äpaéâepa (ïepeìeííoé äëèíû).

   Hèçêèé ópoâeíü.

   Boò 5  còpoê  ïpoöeäópû  còpaòeãèè  ócòpoécòâa.  Oòìe÷aeì,  ÷òo  äâe
cëoâíûe ïepeìeííûe,  xpaíÿùèe çía÷eíèÿ ES è BX,  cëeäóþò ça èícòpóêöèeé
RET, êaê è ïoëoæeío â ôopìaòe COM.

DEV_STRATEGY:   MOV  CS:KEEP_ES,ES
                MOV  CS:KEEP_BX,BX
                RET
KEEP_CS         DW ?
KEEP_BX         DW ?

   7.2.3 Coçäaíèe oápaáoò÷èêa ïpepûâaíèÿ ócòpoécòâa.

   Äpaéâep ócòpoécòâa  ía÷èíaeòcÿ  c  äâóx  ïopöèé êoäa,  ïpèâeäeííûx â
ïpeäûäóùèx paçäeëax. Ça íèìè äoëæía cëeäoâaòü cooòâeòcòâóþùaÿ ïpoöeäópa
oápaáoòêè   ïpepûâaíèÿ.  Ha  caìoì  äeëe,  ýòo  íeâepío,  íaçûâaòü  ýòó
ïpoöeäópó ïpoöeäópoé oápaáoòêè ïpepûâaíèÿ,  òaê êaê oía âoâce íe oácëó-
æèâaeò ïpepûâaíèe è çaâepøaeòcÿ oáû÷íoé èícòpóêöèeé RET.
   Èìeeòcÿ 13 òèïoâ ôóíêöèé,  êoòopûe ìoæeò  âûïoëíÿòü  ócòaíaâëèâaeìûé
äpaéâep ócòpoécòâa. Koãäa äpaéâep âûçûâaeòcÿ ôóíêöèeé DOS (cêaæeì ôóíê-
öèeé  3FH  ïpepûâaíèÿ  21H,  êoòopaÿ  ÷èòaeò  äaííûe   èç   ôaéëa   èëè
ócòpoécòâa), òo ôóíêöèÿ ïoìeùaeò êoäoâûé íoìep oò 1 äo 13 â oäíoáaéòíoe
ïoëe ïo cìeùeíèþ 2 â çaãoëoâêe çaïpoca (äëÿ ââoäa - êoäoâûé  íoìep  5).
Çaòeì  óïpaâëeíèe  ïepeäaeòcÿ  ïpoöeäópe oápaáoòêè ïpepûâaíèÿ äpaéâepa,
aäoec êoòopoé oïpeäeëÿeòcÿ ïpè ïpocìoòpe  çaãoëoâêa  äpaéâepa  [7.2.1].
Ýòa  ïpoöeäópa â ïepâóþ o÷epeäü âoccòaíaâëèâaeò ES:BX,  c òeì ÷òoáû oíè
óêaçûâaëè ía çaão- ëoâoê çaïpoca, a çaòeì ÷èòaeò êoäoâûé íoìep êoìaíäû.
Ïo ýòoìó êoäó ïpoöeäópa oápaáoòêè ïpepûâaíèÿ âûçûâaeò íóæíóþ ïpoöeäópó,
êoòopaÿ  âûïoëíèò  òpeáóeìóþ  ôóíêöèþ.  Ïpoöeäópa  èùeòcÿ   c   ïoìoùüþ
13-cëoâíoé òaáëèöû,  coäepæaùeé cìeùeíèÿ äëÿ 13 òèïoâ ôóíêöèé.  Ôóíêöèè
âceãäa ïepe÷ècëÿþòcÿ â cëeäóþùeì ïopÿäêe:

   1. INITIALIZE (èíèöèaëèçaöèÿ)
   2. CHECK_MEDIA (ïpoâepêa íocèòeëÿ)
   3. MAKE_BPB
   4. IOCTL_IN
   5. INPUT_DATA (ââoä äaííûx)
   6. NONDESTRUCT_IN
   7. INPUT_STATUS (còaòóc ââoäa)
   8. CLEAR_INPUT (o÷ècòêa ââoäa)
   9. OUTPUT_DATA (âûâoä äaííûx)
  10. OUTPUT_VERIFY (ïpoâepêa âûâoäa)
  11. OUTPUT_STATUS (còaòóc âûâoäa)
  12. CLEAR_OUTPUT (o÷ècòêa âûâoäa)
  13. IOCTL_OUT

   Ïocëe çaâepøeíèÿ   ïpoöeäópû,   ïpoöeäópa    oápaáoòêè    ïpepûâaíèÿ
çaâepøaeòcÿ  èícòpóêöèeé  RET  è  óïpaâëeíèe  âoçâpaùaeòcÿ â âûçûâaþùóþ
ïpoãpaììó.  Äpaéâep ócòpoécòâa ìoæeò âêëþ÷aòü êoä äëÿ oápaáoòêè  òoëüêo
íeêoòopûx  ôóíêöèé,  â  çaâècèìocòè oò ócòpoécòâa è òpe- áóeìoé còeïeíè
êoíòpoëÿ oøèáoê è óïpaâëeíèÿ ócòpoécòâoì.  Hoìepa ôóíêöèé,  äëÿ êoòopûx
íe  íaïècaíû  ïpoöeäópû,  äoëæíû  çaâepøaòücÿ  âûxoäoì  èç äpaéâepa áeç
âûïoëíeíèÿ  ÷eão-ëèáo.  B  ýòoì  cëó÷ae  íaäo  òoëüêo   ïepeä   âûxoäoì
ócòaíoâèòü áèòû 15,  8,  1 è 0 â çaãoëoâêe çaïpoca, ÷òoáû èíôopìèpoâaòü
âûçûâaþùóþ çaäa÷ó,  ÷òo áûëa çaòpeáo- âaía íecóùecòâóþùaÿ ôóíêöèÿ  (áèò
15 èíäèöèpóeò oøèáêó, áèò 8 ïoêaçûâaeò, ÷òo äpaéâep paáoòaeò íopìaëüío,

                                     - 5 -
a áèòû 0  è  1  äaþò  êoä  oøèáêè  3,  ÷òo  cooòâeòcòâóeò  "íeèçâecòíoé
êoìaíäe").
   Ho oäía ôóíêöèÿ äoëæía ïpècóòcòâoâaòü âo âcex äpaéâepax ócòpoécòâ, è
ýòo  ôóíêöèÿ  íoìep  1  -  èíèöèaëèçaöèÿ.  Ýòa  ôóíêöèÿ aâòo- ìaòè÷ecêè
âûïoëíÿeòcÿ ïpè çaãpóçêe äpaéâepa,  a çaòeì íeò.  Oäía èç âaæíûx çaäa÷,
âûïoëíÿeìaÿ ýòoé ïpoöeäópoé,  cocòoèò ócòaíoâêe aäpeca êoíöa äpaéâepa â
÷eòûpex áaéòax,  ía÷èíaþùèxcÿ co cìeùeíèÿ 14  â  çaãoëoâêe  çaïpoca.  B
íèæeïpèâeäeííoì ïpèìepe êoíeö ïpoãpaììû oòìe÷eí ìeòêoé eop:. Kpoìe ýòoé
çaäa÷è,  ïpoöeäópa èíèöèaëèçaöèè äoëæía òaêæe âûïoëíèòü âcþ íeoáxoäèìóþ
äëÿ  äaííoão ócòpoécòâa èíèöèaëèçaöèþ.
   Kaêèe èç  ocòaâøèxcÿ  12-òè  ôóíêöèé  áóäóò   âêëþ÷eíû   â   äpaéâep
ócòpoécòâa çaâècèò oò òoão, ÷òo äpaéâep äoëæeí äeëaòü. Heêoòopûe, òaêèe
êaê CHECK_MEDIA è MAKE_BPB, oòíocÿòcÿ òoëüêo ê áëo÷íûì ócòpoécòâaì (oíè
ócòaíaâëèâaþò  òèï  äècêa,  paçìep  ceêòopoâ  è  ò.ä.).  Äëÿ cèìâoëüíûx
ócòpoécòâ  íaèáoëee  âaæíûìè  ÿâëÿþòcÿ  äâe   ôóíêöèè:   INPUT_DATA   è
OUTPUT_DATA  (oòìeòèì,  ÷òo  ýòè  èìeía íecóùecòâeííû - âaæía ïoçèöèÿ â
òaáëèöe ôóíêöèé,  êoòopaÿ íeèçìeíía). B oáoèx cëó÷aÿx çaãoëoâoê çaïpoca
èìeeò cëeäóþùóþ còpóêòópó:

13 áaéòoâ    còaíäapòíûé ôopìaò çaãoëoâêa çaïpoca
 1 áaéò      áaéò oïècaíèÿ cpeäû (òoëüêo äëÿ áëo÷íûx ócòpoécòâ)
 4 áaéòa     cìeùeíèe/ceãìeíò áóôepa oáìeía äaííûx
 2 áaéòa     ÷ècëo áaéòoâ, êoòopoe íaäo ïepeäaòü
 2 áaéòa     còapòoâûé íoìep ceêòopa (òoëüêo äëÿ áëo÷íûx)

  B íèæeïpèâeäeííoì  ïpèìepe  ècïoëüçóeòcÿ  ôóíêöèÿ âûâoäa.  Ïpoöeäópa,
âûïoëíÿþùaÿ âûâoä ïoëó÷aeò èç çaãoëoâêa çaïpoca aäpec áóôepa, â êoòopoì
íaxoäÿòcÿ  âûâoäèìûe  äaííûe  (cìeùeíèe 14).  Oía òaêæe c÷èòûâaeò ÷ècëo
áaéòoâ,  êoòopoe íaäo âûâecòè (cìeùeíèe 18).  Koãäa ïpoöeäópa  çaâepøèò
âûâoä  äaííûx,  òo  oía  ócòaíoâèò  cëoâo  còaòóca  â çaãoëoâêe çaïpoca
(cìeùeíèe 3) è âoçâpaòèò óïpaâëeíèe.  Ecëè oïe- paöèÿ ócïeøía,  òo íaäo
ócòaíoâèòü  áèò  8  cëoâa  còaòóca.  Äpóãèe âoçìoæíocòè áóäóò oácóæäeíû
ïoçäíee.

   Hèçêèé ópoâeíü.

   B äaííoì  ïpèìepe  ïpèâeäeía   oáùaÿ   ôopìa   ïpoöeäópû   oápaáoòêè
ïpepûâaíèÿ, íe âêëþ÷aÿ peaëüíoão êoäa, óïpaâëÿþùeão ócòpoécòâoì.

;---èíèöèaëèçaöèÿ oápaáoò÷èêa ïpepûâaíèÿ ócòpoécòâa
DEV_INTERRUPT:  PUSH ES     ;coxpaíÿeì peãècòpû
                PUSH DS
                PUSH AX
                PUSH BX
                PUSH CX
                PUSH DX
                PUSH SI
                PUSH DI
                PUSH BP
   MOV  AX,CS:KEEP_ES    ;ES:BX óêaçûâaþò ía çaãoëoâoê çaïpoca
   MOV  ES,AX            ;
   MOV  BX,CS:KEEP_BX    ;
   MOV  AL,ES:[BX]+2     ;ïoëó÷aeì êoä êoìaíäû èç çaãoëoâêa
   SHL  AL,1             ;óìíoæaeì ía 2 (ò.ê. òaáëèöa cëoâíaÿ)
   SUB  AH,AH            ;oáíóëÿeì AH
   LEA  DI,FUNCTIONS     ;DI óêaçûâaeò ía cìeùeíèe äo òaáëèöû
   ADD  DI,AX            ;äoáaâëÿeì cìeùeíèe â òaáëèöe
   JMP  WORD PTR [DI]    ;ïepexoäèì ía aäpec èç òaáëèöû


                                     - 6 -
FUNCTIONS       LABEL  WORD  ;ýòo òaáëèöa ôóíêöèé
   DW   INITIALIZE
   DW   CHECK_MEDIA
   DW   MAKE_BPB
   DW   IOCTL_IN
   DW   INPUT_DATA
   DW   NONDESTRUCT_IN

   DW   INPUT_STATUS
   DW   CLEAR_INPUT
   DW   OUTPUT_DATA
   DW   OUTPUT_VERIFY
   DW   OUTPUT_STATUS
   DW   CLEAR_OUTPUT
   DW   IOCTL_OUT

;---âûxoä èç äpaéâepa, ecëè ôóíêöèÿ íe ïoääepæèâaeòcÿ
CHECK_MEDIA:
MAKE_BPB:
IOCTL_IN:
INPUT_DATA:
NONDESTRUCT_IN:
INPUT_STATUS:
CLEAR_INPUT:
OUTPUT_VERIFY:
OUTPUT_STATUS:
CLEAR_OUTPUT:
IOCTL_OUT:
   OR   ES:WORD PTR [BX]+3,8103H   ;ìoäèôèöèpóeì còaòóc
   JMP  QUIT

;---ïpoöeäópû äëÿ äâóx ïoääepæèâaeìûx êoäoâ
INITIALIZE:   LEA  AX,E_O_P      ;cìeùeíèe êoíöa ïpoãpaììû â AX
   MOV  ES:WORD PTR [BX]+14,AX   ;ïoìeùaeì eão â çaãoëoâoê
   MOV  ES:WORD PTR [BX]+16,CS   ;
    .
   (çäecü èäeò èíèöèaëèçaöèÿ ócòpoécòâa)
    .
   JMP  QUIT

OUTPUT_DATA:  MOV  CL,ES:[BX]+18 ;ïoëó÷aeì ÷ècëo cèìâoëoâ
   CBW  CX                       ;CX ècïoëüçóeì êaê c÷eò÷èê
   MOV  AX,ES:[BX]+16            ;ïoëó÷aeì aäpec áóôepa äaííûx
   MOV  DS,AX                    ;
   MOV  DX,ES:[BX]+14            ;
    .
   (çäecü èäóò oïepaöèè ïo âûâoäó)
    .
   JMP  QUIT

;---âûxoäèì, ìoäèôèöèpóÿ áaéò còaòóca â çaãoëoâêe çaïpoca
QUIT:   OR   ES:WORD PTR [BX]+3,100H  ;ócòaíaâëèâaeì áèò 8
   POP BP                    ;âoccòaíaâëèâaeì peãècòpû
   POP DI                    ;
   POP SI                    ;
   POP DX                    ;
   POP CX                    ;
   POP BX                    ;
   POP AX                    ;

                                     - 7 -
   POP DS                    ;
   POP ES                    ;
   RET
E_O_P:              ;ìeòêa êoíöa ïpoãpaììû
DEVICE12     ENDP
CSEG         ENDS
             END    DEVICE12

   Ïepeä âoçâpaòoì äpaéâep  ócòaíaâëèâaeò  cëoâo  còaòóca  â  çaãoëoâêe
çaïpoca.  B äaííoì ïpèìepe ýòo äeëaeòcÿ â äâóx ìecòax, â çaâècèìocòè oò
òoão âûçûâaëacü ôóíêöèÿ oáecïe÷èâaeìaÿ äpaéâepoì èëè  íeò.  Ýòè  còpoêè
âûãëÿäÿò òaê: OR ES:WORD PTR [BX]+3,XXXXH. Çía÷e- íèe áèòoâ XXXX cëeäó-
þùee:

   áèòû 0-7   êoä oøèáêè (ecëè áèò 15 = 1)
   áèò    8   ócòaíaâëèâaeòcÿ â 1, êoãäa ôóíêöèÿ çaâepøeía
   áèò    9   ócòaíaâëèâaeòcÿ â 1, êoãäa äpaéâep çaíÿò
 áèòû 10-14   çapeçepâèpoâaíû MS DOS
   áèò   15   ócòaíaâëèâaeòcÿ ïpè âoçíèêíoâeíèè oøèáêè

Mëaäøèé áaéò ýòoão  cëoâa  coäepæèò  cëeäóþùèe  êoäû oøèáoê, ecëè
ócòaíoâëeí áèò 15, èíäèöèpóþùèé oøèáêó:

   0    ïoïûòêa çaïècè ía çaùèùeííoe oò çaïècè ócòpoécòâo
   1    íeèçâecòíoe ócòpoécòâo
   2    ócòpoécòâo íe ãoòoâo
   3    íeèçâecòíaÿ êoìaíäa
   4    oøèáêa ïpoâepêè ïo êoíòpoëüíoé cóììe
   5    íeâepíaÿ äëèía çaïpoca ê ócòpoécòâó
   6    oøèáêa ïoècêa
   7    íeèçâecòíûé íocèòeëü
   8    ceêòop íe íaéäeí
   9    íeò áóìaãè â ïpèíòepe
   A    oøèáêa çaïècè
   B    oøèáêa ÷òeíèÿ
   C    oáùaÿ oøèáêa

                    4 Äocòóï ê äpaéâepó ócòpoécòâa.

   Äpaéâep ócòpoécòâa  ócòaíaâëèâaeòcÿ  ïóòeì âêëþ÷eíèÿ èìeíè ãoòo- âoé
ïpoãpaììû â ôaéë êoíôèãópaöèè cècòeìû.  Äëÿ ócòaíoâêè ïpoáíoé ïpoãpaììû
ïoìecòèòe  â  ôaéë  CONFIG.SYS  còpoêó  DEVICE = DEVI- CE12.COM.  Çaòeì
ïepeçaãpóçèòe cècòeìó äëÿ ócòaíoâêè  äpaéâepa.  Ecëè  ìaøèía  íe  áóäeò
çaãpóæaòücÿ,  òo  cêopee  âceão  èìeeòcÿ  oøèáêa  â  êoäe èíèöèaëèçaöèè
äpaéâepa.
   Ïocëe òoão  êaê  äpaéâep ócòaíoâëeí,  äëÿ äocòóïa ê íeìó ïoëüçóéòecü
oáû÷íûìè  ôóíêöèÿìè  MS  DOS  ïpepûâaíèÿ  21H.  Kaêèe   ôóíêöèè   ìoæío
ècïoëüçoâaòü  çaâècèò  oò  òoão,  çaìeíÿeò  ëè  ócòpoécòâo  còaíäapòíoe
ócòpoécòâo DOS (êaê â ïpèâeäeííoì  ïpèìepe)  èëè  oío  äoáaâëÿeòcÿ  êaê
coâepøeíío íoâoe ócòpoécòâo.  Äëÿ çaìeíû còaíäapòíoão ïocëeäoâaòeëüíoão
ócòpoécòâa,  íaçoâèòe äpaéâep AUX,  ïocëe ÷eão ôóíêöèè 3 ïpepûâaíèÿ 21H
áóäóò   ocóùecòâëÿòü  cooòâeòcòâeíío  ââoä  è  âûâoä.  Ecëè  ócòpoécòâo
ïapaëëeëüíoe,  òo íaçoâèòe eão PRN, ïocëe ÷eão ôóíêöèÿ 5 áóäeò âûâoäèòü
äaííûe  ía ïpèíòep.  Äpóãoé âoçìoæíocòüþ ÿâëÿeòcÿ ècïoëüçoâaíèe ôóíêöèè
3FH äëÿ ââoäa è äëÿ âûâoäa.  B ýòoì cëó÷ae ècïoëüçóéòe íoìep ôaéëa 3  -
äëÿ  ïocëeäoâaòeëüíoão ócòpoécòâa è 4 - äëÿ ïapaëëeëüíoão.  Haïoìèíaeì,
÷òo  ïpè   ècïoëüçoâaíèè   ïpeäoïpe-   äeëeííûx   íoìepoâ   ôaéëa   íeò
íeoáxoäèìocòè oòêpûâaòü ócòpoécòâo.
   Ecëè ócòpoécòâo íe çaìeíÿeò oäío èç  còaíäapòíûx  ócòpoécòâ  MS  DOS

                                     - 8 -
(ò.e. ecëè oío íe íaçâaío oäíèì èç peçepâíûx cëoâ, òaêèì êaê PRN, AUX è
ò.ä.),  òo Bû ìoæeòe oòêpûòü ócòpoécòâo c ïoìoùüþ oäíoé èç ôóíêöèé  äëÿ
oòêpûòèÿ  ôaéëa.  Bû  ìoæeòe  ècïoëüçoâaòü  êaê ìeòoä äocòóïa c ïoìoùüþ
óïpaâëÿþùeão áëoêa ôaéëa, òaê è ìeòoä äecêpèïòopa ôaéëa, xoòÿ ïocëeäíèé
ïpeäïo÷òèòeëüíee.  ×òoáû  áûòü óâepeííûì,  ÷òo Bû ïo oøèáêe íe oòêpoeòe
äècêoâûé ôaéë,  ïoìecòèòe íoìep ôaéëa â  BX,  0  -  â  AL,  ïocäe  ÷eão
âûïoëíèòe  ôóíêöèþ  44H ïpepûâaíèÿ 21H.  Ýòo ôóíêöèÿ IOCTL è ecëè áèò 7
çía÷eíèÿ,  âoçâpaùaeìoão  â  DL  ócòaíoâëeí,  òo   äpaéâep   ócòpoécòâa
çaãpóæeí.
   IOCTL òpeáóeò, ÷òoáû â áaéòe aòpèáóòoâ äpaéâepa áûëa cooòâeòcòâóþùaÿ
ócòaíoâêa  áèòoâ  è  ÷òoáû ïo êpaéíeé ìepe ocíoâû ïpoöe- äópû oápaáoòêè
IOCTL èìeëècü â  ïpoöeäópe  oápaáoò÷èêa  ïpepûâaíèÿ  äpaéâepa.  Ôóíêöèÿ
IOCTL  èìeeò  8  ïoäôóíêöèé,  ïpoíóìepoâaííûx  oò  0  äo  7,  ïpè  ýòoì
cooòâeòcòâóþùèé êoäoâûé íoìep ïoìeùaeòcÿ â AL ïpè âûçoâe ôóíêöèè:

   0    Boçâpaòèòü èíôopìaöèþ oá ócòpoécòâe â DX
   1    Ócòaíoâèòü èíôopìaöèþ oá ócòpoécòâe, ècïoëüçóÿ DL (DH=0)
   2    C÷èòaòü CX áaéòoâ oò äpaéâepa ócòpoécòâa ÷epeç óïpaâëÿ-
        ùèé êaíaë è ïoìecòèòü èx ía÷èíaÿ c DS:DX
   3    Çaïècaòü CX áaéòoâ â äpaéâep ócòpoécòâa ÷epeç óïpaâëÿþùèé
        êaíaë, âçÿâ èx ía÷èíaÿ c DS:DX
   4    To æe, ÷òo è 2, ío ècïoëüçoâaòü íoìep íaêoïèòeëÿ â BL,
        ãäe 0 = íaêoïèòeëü ïo óìoë÷aíèþ, 1 = A è ò.ä.
   5    To æe, ÷òo è 3, ío ècïoëüçoâaòü íoìep íaêoïèòeëÿ êaê â 5
   6    Ïoëó÷èòü còaòóc ââoäa
   7    Ïoëó÷èòü còaòóc âûâoäa

   B oòâeò âoçâpaùaeòcÿ paçëè÷íaÿ èíôopìaöèÿ,  â çaâècèìocòè  oò  òoão,
êaêaÿ ôóíêöèÿ âûçâaía.  Äëÿ ïoäôóíêöèé 0 è 1 çía÷eíèe áèòoâ peãècòpa DX
cëeäóþùee (ïpè ócëoâèè, ÷òo áèò 7 = 1, ÷òo oçía÷aeò, ÷òo äocòóï ïoëó÷eí
ê ócòpoécòâó, a íe ê ôaéëó):

   0    1 = ócòpoécòâo êoícoëüíoão ââoäa
   1    1 = ócòpoécòâo êoícoëüíoão âûâoäa
   2    1 = íóëeâoe ócòpoécòâo
   3    1 = ócòpoécòâo ÷acû
   4    peçepâ
   5    1 = íeò ïpoâepêè ía Ctrl-Z, 0 = ecòü ïpoâepêa ía Ctrl-Z
   6    1 = íe êoíeö ôaéëa, 0 = êoíeö ôaéëa
   7    1 = ócòpoécòâo, 0 = äècêoâûé ôaéë
8-13    peçepâ
  14    1 = ecëè ìoæío ècïoëüçoâaòü ïoäôóíêöèè 2 è 3, 0 = íeëüçÿ
  15    peçepâ

   Ïoäôóíêöèè 2-5   ïoçâoëÿþò   ïpoãpaììe   è  ócòpoécòâó  oáìeíèâaòücÿ
ïpoèçâoëüíûìè óïpaâëÿþùèìè còpoêaìè. Ýòo ïoçâoëÿeò ïepeäaâaòü óïpaâëÿþ-
ùèe  cooáùeíèÿ  oòäeëüío  oò  ocíoâíoão ïoòoêa äaííûx,  ÷òo cóùecòâeíío
óïpoùaeò äeëo. Ïpè âoçâpaòe AX áóäeò coäepæaòü ÷ècëo ïepeäaííûx áaéòoâ.
Ïoäôóíêöèè 6-7 ïoçâoëÿþò ïpoãpaììe ïpoâepèòü,  ãoòoâo ëè ócòpoécòâo äëÿ
ââoäa èëè âûâoäa.  Äëÿ ócòpoécòâ â AL âoçâpaùaeòcÿ FF,  ecëè ócòpoécòâo
ãoòoâo è 0, ecëè íeò. Ïpè èc- ïoëüçoâaíèè c oòêpûòûì ôaéëoì (áèò 7 = 0)
â AL âoçâpaùaeòcÿ FF äo òex ïop, ïoêa íe áóäeò äocòèòãíóò êoíeö ôaéëa.

               5 Oáíapóæeíèe è aíaëèç oøèáoê ócòpoécòâa.

   Ócòpoécòâa ìoãóò oøèáaòücÿ ïo oäíoé èç òpex ïpè÷èí. Ócòpoécòâo ìoæeò
áûòü ôèçè÷ecêè ïoâpeæäeío èëè íaxoäèòücÿ íe â òoì cocòoÿíèè. Moæeò áûòü
ïëoxèì ïpoãpaììíoe oáecïe÷eíèe,  óïpaâëÿþùee ócòpoécòâoì.  È,  íaêoíeö,
ïpoãpaììa  ìoæeò  ïocëaòü  ócòpoécòâó  íeäoïóc- òèìûé çaïpoc (íaïpèìep,

                                     - 9 -
ïoïûòêa ïècaòü ía íaêoïèòeëü,  ãäe íaxo- äèòcÿ  äècêeòa  çaùèùeííaÿ  oò
çaïècè).  MS  DOS oáíapóæèâaeò è aíaëèçèpóeò áoëüøèícòâo òaêèx oøèáoê è
oáecïe÷èâaeò âoçìoæíocòè äëÿ âoccòaíoâëeíèÿ.

   Hèçêèé ópoâeíü.

   Èíoãäa äpaéâepû  ócòpoécòâ  coäepæaò  òaêèe  cepüeçíûe  oøèáêè,  ÷òo
ïpoãpaììa  ïpocòo íe ìoæeò ïpoäoëæaòücÿ,  ïoêa oíè íe áóäóò ècïpaâëeíû.
Koãäa  òaêèe  oøèáêè  ïpoècxoäÿò,  òo   cècòeìa   âûçûâaeò   oápaáoò÷èê
êpèòè÷ecêèx  oøèáoê.  Oí  ìoæeò âcòóïaòü â äeécòâèe êaê äëÿ còaíäapòíûx
ócòpoécòâ,  òaê è äëÿ ócòaíoâëeííûx äpaéâepoâ.  Ïoëüço- âaòeëü íaèáoëee
÷acòo còaëêèâaeòcÿ c íèì, êoãäa ïûòaeòcÿ ïpoèçâecòè äècêoâóþ oïepaöèþ c
äècêoâoäoì,  ó  êoòopoão  oòêpûòa  äâepöa.  B  ýòoì  cëó÷ae  ïoÿâëÿeòcÿ
cooáùeíèe: "Not ready error reading drive A - Abort, Retry, Ignore?"
   Oápaáoò÷èê êpèòè÷ecêèx oøèáoê ìoæeò áûòü ïepeïècaí,  ÷òoáû oí  ëó÷øe
oápaáaòûâaë   ócòpoécòâa,   äëÿ   êoòopûx  Bû  coçäaëè  ócòaíaâëèâaeìûe
äpaéâepû.  Beêòop ïpepûâaíèÿ 24H óêaçûâaeò ía còaíäapòíóþ ïpoöeäópó  MS
DOS,  ío Bû ìoæeòe ïepeíaïpaâèòü âeêòop ía câoþ ïpo- öeäópó. Ïpè âûçoâe
ýòoé ïpoöeäópû còapøèé áèò AH  coäepæèò  0  ecëè  oøèáêa  ïpoèçoøëa  ía
áëo÷íoì  ócòpoécòâe  è  1,  ecëè  ía  cèìâoëüíoì.  BP:SI  óêaçûâaþò  ía
çaãoëoâoê  äpaéâepa  âèíoâíoão  ócòpoécòâa,  êoòo-   pûé   ìoæeò   äaòü
äoïoëíèòeëüíóþ  èíôopìaöèþ.  Boceìü  áaéòoâ,  ía÷èíaÿ  co cìeùeíèÿ AH â
çaãoëoâêe coäepæaò  èìÿ  ócòpoécòâa,  a  oápaáoò÷èê  êpèòè÷eêèx  oøèáoê
ïoìeùaeò  êoä  oøèáêè  äëèíoé â cëoâo â DI.  Boò êoäoâûe íoìepa (oíè íe
ïpeäcòaâëÿþò áèòoâûx ïoçèöèé):

   Koä           Ïpoáëeìa

    0      ïoïûòêa ïècaòü ía äècê, çaùèùeííûé oò çaïècè
    1      íeèçâecòíoe ócòpoécòâo
    2      íaêoïèòeëü íe ãoòoâ
    3      íeèçâecòíaÿ êoìaíäa
    4      oøèáêa oáìeía äaííûìè
    5      íeâepíaÿ äëèía çaïpoca
    6      oøèáêa ïoècêa

    7      íeèçâecòíûé òèï íocèòeëÿ
    8      ceêòop íe íaéäeí
    9      íeò áóìaãè â ïpèíòepe
    A      oøèáêa ïpè çaïècè
    B      oøèáêa ïpè ÷òeíèè
    C      oáùaÿ oøèáêa

  B cëó÷ae  äècêoâoé  oøèáêè  AL coäepæèò íoìep íaêoïèòeëÿ,  ía êoòopoì
ïpoèçoøëa oøèáêa (0 = A,  1 = B è ò.ä.),  a áèòû 2-0 AH èíäèöèpóþò  òèï
oøèáêè.  Áèò 0 ócòaíaâëèâaeòcÿ, ecëè oøèáêa ïpoèçoøëa âo âpeìÿ oïepaöèè
çaïècè,  è  cápacûâaeòcÿ  -  ecëè  ïpè  ÷òeíèè.  Áèòû  2-1  co-  äepæaò
èíôopìaöèþ o òoì,  â êaêoì ìecòe äècêa ïpoèçoøëa oøèáêa, äaâaÿ 00 - äëÿ
ía÷aëüíûx ceêòopoâ DOS,  01 - äëÿ FAT,  10 - äëÿ êaòaëoãa è  11  -  äëÿ
âceão ocòaëüíoão äècêa.
   Èìeeòcÿ òpè cïocoáa,  êoòopûìè ïpoãpaììa ìoæeò âoccòaíoâèòücÿ  ïocëe
êpèòè÷ecêoé oøèáêè:

  1. Moæío  ïoïpocèòü  ïoëüçoâaòeëÿ ócòpaíèòü ïpè÷èíó oøèáêè (íaïpèìep,
çaêpûòü äâepöó íaêoïèòeëÿ),  ïocëe ÷eão cècòeìa ïpeäocòaâèò  ócòpoécòâó
âoçìoæíocòü ïoâòopèòü oïepaöèþ.
  2. Óïpaâëeíèe ìoæeò áûòü âoçâpaùeío èícòpóêöèè, cëeäóþùeé ça INT 21H,
êoòopaÿ  cäeëaëa  ïoïûòêó  oápaòèòücÿ  ê äpaéâepó.  3.  Ïpoãpaììa ìoæeò
çaâepøèòücÿ è âepíóòü óïpaâëeíèe cècòeìe.

                                     - 10 -
   Baøa ïpoöeäópa  oápaáoòêè oøèáoê ìoæeò âoccòaíoâèòü cèòóaöèþ,  âûäaâ
èícòpóêöèþ  IRET,  ïocëe  òoão,  êaê  oía  ïoìecòèëa  0  â  AL,   ÷òoáû
èãíopèpoâaòü oøèáêó, 1 - ÷òoáû ïoâòopèòü oïepaöèþ è 2 - ÷òoáû çaâepøèòü
ïpoãpaììó.  Ecëè Bû xoòèòe, ÷òoáû Baøa ïpoöeäópa ïpoâeëa âoccòaíoâëeíèe
caìa,  òo  oía  äoëæía  âoccòaíoâèòü  peãècòpû âûïoëíÿeìoé ïpoãpaììû èç
còeêa,  a çaòeì óäaëèòü co còeêa âce,  êpoìe ïocëeäíèx òpex cëoâ. Ïocëe
ýòoão èícòpóêöèÿ IRET âoçâpaòèò óïpaâëeíèe ïpoãpaììe, xoòÿ caìa cècòeìa
ocòaíeòcÿ â íecòaáèëüíoì cocòoÿíèè äo òex  ïop,  ïoêa  oía  íe  cäeëaeò
âûçoâ  ôóíêöèè  c  íoìepoì  áoëüøèì,  ÷eì  12.  Boò  êoíôèãópaöèÿ còeêa
(ía÷èíaÿ  câepxó  äo  íèça)  êoãäa  âûçûâaeòcÿ  oápaáoò÷èê  êpèòè÷ecêèx
oøèáoê:

Aäpec âoçâpaòa oápaáoò÷èêa oøèáoê:  IP, CS, ôëaãè

Ïoëüçoâaòeëücêèe peãècòpû çaäa÷è,   AX, BX, CX, DX, SI, DI, BP,
èç êoòopoé áûë âûçâaí äpaéâep:      DS, ES, IP, CS, ôëaãè

   MS DOS  oápaáaòûâaeò  òaêæe  ìíoãèe   íeêpèòè÷ecêèe   oøèáêè.   Cþäa
âêëþ÷aþòcÿ êoäû oøèáoê,  êoòopûe ìoãóò âoçâpaùaòücÿ â peãècòpax,  êoãäa
âûçûâaëacü ôóíêöèÿ DOS.  Ýòè êoäû oácóæäaþòcÿ  â  äaííoé  êíèãe  â  òex
ìecòax,  â  êoòopûx oïècûâaþòcÿ cooòâeòcòâóþùèe ôóíêöèè.  Oäíaêo èìeéòe
ââèäó,  ÷òo ía÷èíaÿ c âepcèè 3.0 MS  DOS  âoçâpaùaeò  pacøèpeííûe  êoäû
oøèáoê äëÿ ôóíêöèé,  ècïoëüçóþùèx FCB èëè äecêpèïòopû ôaéëoâ. Koãäa ïpè
âûïoëíeíèè oäíoé èç ýòèx ôóíêöèé ócòa- íaâëèâaeòcÿ ôëaã ïepeíoca,  òo â
AX  âoçâpaùaeòcÿ  oáû÷íûé  êoä  oøèáêè.  Äoïoëíèòeëüíûé pacøèpeííûé êoä
äocòóïeí ÷epeç ïpepûâaíèe 59H,  ecëè â  BX  ïoìecòèòü  0.  Ýòa  ôóíêöèÿ
cooáùaeò  òaêæe  o êpèòè÷ecêèx oøèáêax è oía ìoæeò áûòü ècïoëüçoâaía èç
oápaáoò÷èêa êpèòè÷ecêèx oøèáoê, âûçûâaeìoão ÷epeç ïpepûâaíèe 24H.
   Ôóíêöèÿ ïoìeùaeò â AX êoä oøèáêè, âçÿòûé èç oáû÷íoão cïècêa çíaêoìûx
êoäoâ oøèáoê (íaïpèìep,  "íeäocòaòo÷ío ïaìÿòè") èëè oäèí èç íoâûx êoäoâ
(íaïpèìep,  "oãpaíè÷eíèe äocòóïa" äëÿ ìíoãoïoëüço- âaòeëücêoé cècòeìû).
BH âoçâpaùaeò êoä êëacca oøèáêè, óêaçûâaÿ êaêoão òèïa oøèáêa ïpoèçoøëa.
Haïpèìep,  êoä  1 óêaçûâaeò,  ÷òo èc÷epïaíû pecópcû,  ò.e.  ÷òo ïaìÿòü,
ôaéëoâûe áóôepa èëè  ÷òo-òo  eùe  èçpacxoäoâaío.  Äpóãèe  êëaccû  ìoãóò
óêaçûâaòü ía ïpoãpaììíûe oøèáêè, ïpoáëeìû c íocèòeëÿìè, ôopìaòèpoâaíèeì
è ò.ä.  BL coäepæèò êoä,  ïpeäïoëaãaþùèé äeécòâèe  äëÿ  âoccòaíoâëeíèÿ,
òaêoe  êaê  "ïoâòopèòü",  "ïpeêpaòèòü"  èëè "çaïpocèòü ó ïoëüçoâaòeëÿ".
Haêoíeö, CH âoçâpaùaeò ÷ècëo, oïpeäeëÿþùee ìecòo ãäe âoçíèêëè ïpoáëeìû:
ía áëo÷íoì ócòpoécòâe, ía cèìâoëüíoì, â ïaìÿòè?
   Äaííûe äëÿ ýòèx êoäoâ oøèáoê âecüìa oáøèpíû. Ïoëíóþ èíôopìaöèþ o íèx
cì.  â Texíè÷ecêoì póêoâoäcòâe ïo MS DOS 3.0. Ïocêoëüêó ïpeäïoëaãaeòcÿ,
÷òo MS DOS 3.0 íe áóäeò ècïoëüçoâaòücÿ ía ìaøèíax,  áoëee  paííèx,  ÷eì
AT,  òo  ècïoëüçoâaíèe  ýòèx  êoäoâ  oãpaíè÷èâaeò  coâìecòèìocòü  Baøèx
ïpoãpaìì.  Teì íe ìeíee,  íaáop ïpoöeäóp, ïpeäíaçía÷eííûé òoëüêo äëÿ MS
DOS  3.0 ìoæeò äoïoëíÿòücÿ ïoâepx oáû÷íûx ïpoöeäóp oápaáoòêè oøèáoê.
   Haêoíeö, èìeéòe ââèäó, ÷òo ïpoöecc ìoæeò ïepeäaâaòü êoä çaâep- øeíèÿ
âûçâaâøeìó eão ïpoöeccó. Tepìèí ïpoöecc oòíocèòcÿ ê âçaèìo- äeécòâóþùèì
ïpoãpaììaì. Haïpèìep, êoãäa oäía ïpoãpaììa çaãpóæaeò è çaïócêaeò äpóãóþ
c ïoìoùüþ ôóíêöèè EXEC, òo çaïócêaeìaÿ ïpoãpaììa íaçûâaeòcÿ ïoòoìêoì, a
çaïócêaþùaÿ  ïpoãpaììa  -  poäèòeëeì.  Poäèòeëþ   ìoæeò   ïoòpeáoâaòücÿ
èíôopìaöèÿ  o  òoì,  êaê  çaâepøèëcÿ  ïoòoìoê.  ×òoáû  ècïoëüçoâaòü ýòó
âoçìoæíocòü, ïoìecòèòe æeëaeìûé êoä çaâepøeíèÿ â AL è âûïoëíèòe ôóíêöèþ
4CH  ïpepûâaíèÿ  21H  äëÿ çaâepøeíèÿ ïpoãpaììû.  Koãäa óïpaâëeíèe áóäeò
âoçâpaùeío poäèòeëþ,  òo oí âûïoëíèò ôóíêöèþ 4DH  ïpepûâaíèÿ  21H  (áeç
âxoäíûx  peãècòpoâ) è â AL áóäeò ïoëó÷eí êoä çaâepøeíèÿ,  êoòopûé ìoæeò
çaòeì áûòü ïpoaíaëèçèpoâaí. Kpoìe òoão, AH áóäeò coäepæaòü èíôopìaöèþ o
òoì,  êaê  çaâepøèëcÿ ïoòoìoê:  0 - äëÿ íopìaëüíoão çaâepøeíèÿ,  1 - ïo
Ctrl-Break,  2 - ïo êpèòè÷ecêoé oøèáêe ócòpoécòâa è 3 - c ïoìoùüþ ôóíê-
öèè 31H, ocòaâëÿþùeé çaäa÷ó peçèäeíòíoé.

                                     - 11 -
   Ecëè ïpoãpaììa çaâepøèëacü c ïoìoùüþ ýòoé ôóíêöèè (a íe 20H ), òo MS
DOS  ïoëó÷aeò  êoä âûxoäa è oí ìoæeò áûòü âêëþ÷eí â oápaáoòêó êoìaíäíûì
ôaéëoì c ïoìoùüþ ïoäêo- ìaíäû IF.  Ýòa  ïoäêoìaíäa  ïoçâoëÿeò  ócëoâíoe
ècêëþ÷eíèe    äpóãèx   êoìaíä   èç   êoìaíäíoão   ôaéëa.   Koä   âûxoäa
paccìaòpèâaeòcÿ êaê íoìep ERRORLEVEL è ócëoâíûe oïepaöèè âûïoëíÿþòcÿ  â
çaâècèìocòè oò òoão,  áoëüøe oí èëè íeò oïpeäeëeííoão ÷ècëa.  C ïoìoùüþ
ýòoé âoçìoæíocòè êoìaíäíûe ôaéëû ìoãóò ïpeêpaùaòü oápaáoòêó è  âûâoäèòü
cooáþùeíèe o âoçíèêíoâeíèè oøèáêè â oäíoé èç çaïóùeííûx ïpoãpaìì. Áoëee
ïoäpoáíaÿ èíôopìaöèÿ ïpèâeäeía â paçäeëe "Koìaíäû ïaêeòíoé oápa- áoòêè"
póêoâoäcòâa ïo oïepaöèoííoé cècòeìe.

         6. Ècïoëüçoâaíèe cïeöèaëüíûx ócòpoécòâ ââoäa/âûâoäa.

   Èìeeòcÿ oãpoìíoe  êoëè÷ecòâo  ócòpoécòâ ââoäa/âûâoäa,  êoòopûe ìoãóò
áûòü ïpècoeäèíeíû ê IBM PC,  âêëþ÷aÿ ìûøü, äæoécòèê, ãpaôo- ïocòpoèòeëè
è  ò.ä.  B  äaííoì  paçäeëe  oácóæäaþòcÿ òoëüêo òe ócòpoécòâa,  êoòopûe
cïeöèaëüío  ïoääepæèâaþòcÿ  oáopóäoâaíèeì  IBM   PC.   Cþäa   oòíocÿòcÿ
êacceòíûe ìaãíèòoôoíû, câeòoâoe ïepo è äpóãèe ócòpoécòâa, êoòopûe ìoãóò
áûòü ïpècoeäèíeíû ÷epeç èãpoâoé  ïopò.  Aäpeca  ïopòoâ,  oòíocÿùèecÿ  ê
äpóãèì   ócòpoécòâaì,   oácóæäaþòcÿ   â  äpóãèx  paçäeëax  ýòoé  êíèãè,
oòíocÿùèxcÿ èìeíío ê äaííûì ócòpoécòâaì. Pacïpeäeëeíèe aäpecoâ ïopòoâ â
ocíoâíoì oäío è òo æe äëÿ âcex òèïoâ IBM PC:

Aäpec ïopòa        Ôóíêöèÿ

  00-0F      ìèêpocxeìa DMA 8237
  20-2F      ìèêpocxeìa ïpepûâaíèé 8259 (AT êoíòpoëëep #1: 20-3F)
  40-4F      ìèêpocxeìa òaéìepa 8253/8254
  60-6F      ìèêpocxeìa PPI 8255 (AT ècïoëüçóeò òoëüêo aäpeca
             êëaâèaòópû
  70-7F      ÷acû peaëüíoão âpeìeíè (òoëüêo AT)
  A0-BF      ìèêpocxeìa ïpepûâaíèé #2 (òoëüêo AT)
  F0-FF      PCjr - êoíòpoëëep HÃMÄ, AT - óïpaâëeíèe ìaòeìaòè÷e-
             cêèì coïpoöeccopoì
1F0-1F8      ôèêcèpoâaííûé äècê AT
200-20F      èãpoâoé aäaïòep
278-27F      AT êoììóíèêaöèoííûé ïopò #2
2F8-2FF      êoììóíèêaöèoííûé ïopò COM2 (
320-32F      ôèêcèpoâaííûé äècê XT
378-37F      aäaïòep ïapaëëeëüíoão ïpèíòepa äëÿ PC, XT, AT
3B0-3BF      ìoíoxpoìíûé/ïapaëëeëüíûé aäaïòepû
3D0-3DF      öâeòíoé ãpaôè÷ecêèé aäaïòep
3F0-3F7      êoíòpoëëep HÃMÄ

 ;****************************************************
 ;*                    PROLOG                        *
 ;* THIS IS AN INSTALLABLE DEVICE DRIVER FOR AN      *
 ;* IN STORAgE DISKETTE (VIRTUAL) WITH 180K CAPACITY *
 ;****************************************************
 CSEG     SEGMENT PARA PUBLIC 'CODE'
 ;
 ;       M A C R O ( S )
 ;
 STATUS      MACRO    STATE,ERR,RC
 IFIDN   ,
         OR      ES:WORD PtR SRH_STA_FLD[BX],0100H
 ENDIF
 IFIDN   ,
         OR      ES:WORD PTR SRH_STA_FLD[BX],0200H

                                     - 12 -
 ENDIF
 IFIDN   ,
         OR      ES:WORD PTR SRH_STA_FLD[BX],1000H
 INDIF
 IFNB    
         OR      ES:WORD PTR SRH_STA_FLD[BX],RC
 ENDIF
 ENDM
 ;
 ;       E Q U A T E S
 ;
 ; READ/WRITE
 ;
 SRH            EQU    0     ;STATIC REQUEST HEADER START
 SRH_LEN        EQU    13    ;   "      "      "   length
 Srh_LEN_FLD    EQU    SRH   ;   "      "      "    "    FIELD
 SRH_UCD_FLD    EQU    SRH+1 ;   "      "      "   unit code field
 srh_CCD_FLD    EQU    SRH+2 ;   "      "      "   command code field
 srh_STA_FLD    EQU    SRH+3 ;   "      "      "   STATUS FIELD
 SRH_RES_FLD    EQU    SRH+5 ;   "      "      "   reserved area field
 ;
 MD             EQU    SRH+SRH_LEN   ;MEDIA DESCRIPTOR BYTE
 MD_LEN         EQU    1             ;  "      "      "   lenGth
 dta            equ    md+MD_LEN     ;DISK TRANSFER ADDRESS
 DTA_LEN        EQU    4             ; DTA LENGTH
 COUNT          EQU    DTA+DTA_LEN   ;BYTE/SECTOR COUNT
 COUNT_LEN      EQU    2             ;    "          "   LENGTH
 SSN            EQU    COUNT+COUNT_LEN;STARTIND SECTOR nuMBER
 SSN_LEN        EQU    2             ;   "       "      "   length
 ;
 ; MEDIA CHECK
 ;
 RET_BYTE       EQU    MD+MD_LEN  ;BYTE RETURNED FROM DRIVER
 ;
 ; BUILD BPB
 ;
 BPBA_PTR       EQU    DTA+DTA_LEN   ;POINTER TO BPB

 BPBA_PTR_LEN   EQU    4             ;   "     "  "   LENGTH
 ;
 ; INIT
 ;
 UNITS          EQU    SRH+SRH_LEN
 UNITS_LEN      EQU    1
 BR_ADDR_0      EQU    UNITS+UNITS_LEN
 BR_ADDR_1      EQU    BR_ADDR_0+2
 BR_ADDR_LEN    EQU    4
 BPB_PTR_OFF    EQU    BR_ADDR_0+BR_ADDR_LEN
 BPB_PTR_SEG    EQU    BPB_PTR_OFF+2
  ;
  ;
  VDSK           PROC   FAR
                 ASSUME    CS:CSEG,ES:CSEG,DS:CSEG
  BEGIN:
  START          EQU    $
  ;     S P E C I A L   D E V I C E   H E A D E R
 NEXT_DEV        DD     -1           ;POINTER TO NEXT DEVICE
 ATTRIBUTE       DW     2000H        ;BLOCK DEVICE (non-ibm fORmat)
 STRATEGY        DW     DEV_STRATEGY ;POINTER TO DEVICE STRATEGY

                                     - 13 -
 INTERRUPT       DW     DEV_INT      ;POINTER TO DEVICE INTERRUPT HANDLER
 DEV_NAME        DB     1            ;NUMBER OF BLOCK DEVICES
                 DB     7 DUP(?)     ;7 BYTES OF FILLER


 RH_OFF          DW     ?   ;REQUEST HEADER OFFSET
 RH_SEG          DW     ?   ;REQUEST HEADER SEGMENT
 ; BIOS PARAMETER BLOCK
 BPB             EQU     $
                 DW      512   ;SECTOR SIZE
                 DB      1     ;SECTORS/ALLOCATION UNIT
                 DW      1     ;NUMBER OF RESERVED SECTORS
                 DB      2     ;NUMBER OF FATS
                 DW      64    ;NUMBER OF DERECTORY ENTRIES
                 DW      360   ;TOTAL NUMBER OF SECTORS
                 DB      0FCH  ;MEDIA DESCRIPTOR
                 DW      2     ;NUMBER OF SECTORS OCCUPIED BY FAT
      ;
 BPB_PTR         DW  BPB  ;BIOS PARAMETER BLOCK POINTER ARRAY (1 ENTRY)
 ; CURRENT VIRTUAL DISK INFORMATION
 TOTAL           DW  ? ;TOTAL SEKTORS TO TRANSFER
 VERIFY          DB  0 ;VERIFY 1=YES,   0=NO
 START_SEC       DW  0 ;STARTING SECTOR NUMBER
 VDISK_PTR       DW  0  ;STARTING SEGMENT OF VIRTRUAL DISK
 USER_DTA        DD  ?  ;POINTER TO CALLERS DISK TRANSFER ADDRESS
 BOOT_REC        EQU $ ;DUMMY DOS BOOT RECORD
                 DB  3 DUP(0) ;3 BYTE JuMP TO BOOT CODE (NOT BOOTABLE)




 db    'IBM  2.0' ;VENDOR IDENTIFICATION

 DW    512       ;NUMBER OF BYTES IN A SECTOR
 DB    1         ;1 SECTOR PER ALLOCATION UNIT
 DW    1         ;1 RESERVED SECTOR
 DB    2         ;2 FATS
 DW    64        ;NUMBER OF DIRECTORY ENTRIES
 DW    360       ;360 TOTAL SECTORS IN IMAGE
 DB    0FCH      ;TELLS DOS THIS IS A SINGLE SIDED 9 SECTOR DISK
 DW    2         ;NUMBER OF SECTORS IN FAT
      ;
      ;    FUNCTION TABLE
      ;
      FUNTAB   LABEL   BYTE
 DW   INIT            ;INITIALIZATION
 DW   MEDIA_CHECK     ;MEDIA CHECK (BLOCK ONLY)
 DW   BUILD_BPB       ;BUILD BPB   "   "
 DW   IOCTL_IN        ;IOCTL INPUT
 DW   INPUT           ;INPUT (READ)
 DW   ND_INPUT        ;NON_DESTRUCTIVE INPUT NO WAIT (CHER ONLY)
 DW   IN_STAT         ;INPUT STATUS   "   "
 DW   IN_FLUSH        ;INPUT FLUSH  "   "
 dw   output          ;OUTPUT (WRITE)
 DW   OUT_VERIFY      ;OUTPUT (WRITE)WITH VERIFY   "   "
 DW   OUT_STAT        ;OUTPUT STATUS    "   "
 DW   OUT_FLUSH       ;OUTPUT FLUSH
 DW   IOCTL_OUT       ;IOCTL OUTPUT
     ;

                                     - 14 -
     ; L O C A L   P R O C E D U R E S
     ;
     IN_SAVE   PROC  NEAR
   MOV    AX,ES:WORD PTR DTA[BX]   ;SAVE CALLERS DTA
   MOV    CS:USER_DTA,AX
   MOV    AX,ES:WORD PTR DTA+2[BX]
   MOV    CS:USER_DTA+2,AX
   MOV    AX,ES:WORD PTR COUNT[BX] ;SET NUMBER OF SECTORS TO READ
   XOR    AH,AH
   MOV    CS:TOTAL,AX              ;MOVE NUMBER OF SECTORS TO TOTAL
   RET
      IN_SAVE        ENDP
      ;
      CALC_ADDR PROC NEAR
   MOV    AX,CS:START_SEC  ;GET STARTING SECTOR NUMBER
   MOV    CX,20H           ;MOV 512 TO CX SEGMENT STYLE
   MUL    CX               ;MULTIPLY TO GET ACTUAL SECTOR
   MOV    DX,CS:VDISK_PTR  ;GET SEGMENT OF VIRTUAL DISK
   ADD    DX,AX            ;ADD THET SEGMENT TO INITIAL SEGMENT
   MOV    DS,DX            ;SAVE THAT AS TNE ACTUAL SEGMENT
   XOR    SI,SI            ;IT,S ON A PARAGRAPH BOUNDERY
   MOV    AX,CS:TOTAL      ;TOTAL NUMBER OF SECTORS TO READ
   MOV    CX,512           ;BYTES PER SECTOR
   MUL    CX               ;MULTIPLY TO GET COPY LENGTH
   OR     AX,AX            ;CHECK FOR GREATER THEN 64K
   JNZ    MOVE_IT
   MOV    AX,0FFFFH        ;MOVE IN FOR 64K
      MOVE_IT:
   XCHG   CX,AX            ;MOVE LENGTH TO CX
   RET
      CALC_ADDR ENDP
      ;
      SECTOR_READ PROC NEAR
   CALL    CALC_ADDR        ;CALCULATE THE STARTING "SECTOR"
   MOV     ES,CS:USER_DTA+2 ;SET DESTINATION  TO POINT
   MOV     DI,CS:USER_DTA   ;TO CALLERS DTA
      ;
      ; CHECK FOR DTA WRAP IN CASE WE CEME THROUGH UIA VERIFY
      ;
   MOV    AX,DI          ;GET OFFSET OF DTA
   ADD    AX,CX          ;ADD COPY LENGTH TO IT
   JNC    READ_COPY      ;CARRY FLAG = 0, NO WRAP
   MOV    AX,0FFFFH      ;MAX LENGTH
   SUB    AX,DI          ;SUBTRACT DTA OFFSET FROM MAX
   MOV    CX,AX          ;USE THET AS COPY LENGTH TO AVDID WRAP
      READ_COPY:
   REP    MOVSB          ;DO THE "READ"
   RET
      SECTOR_READ ENDP
      ;
      SECTOR_WRITE PROC NEAR
   CALL      CALC_ADDR        ;CALCULATE STARTING "SECTOR"
   PUSH      DS
   POP       ES               ;ESATABLISH ADDRESSABILITY
   MOV       DI,SI            ; ES:DI POINT TO "DISK"
   MOV       DS,CS:USER_DTA+2 ; DS:SI POINT TO CALLERS DTA
   MOV       SI,CS:USER_DTA
      ;
      ; CHECK FOR DTA WRAP

                                     - 15 -
      ;
   MOV    AX,SI           ;MOVE DTA OFFSET TO AX
   ADD    AX,CX           ;ADD COPY LENGTH TO OFFSET
   JNC    WRITE_COPY      ;CARRY FLAG = 0, NO SEGMENT WRAP
   MOV    AX,0FFFFH       ;MOVE IN MAX COPY LENGTH
   SUB    AX,SI           ;SUBTRACT DTA OFFSET FROM MAX
   MOV    CX,AX           ;USE AS NEW COPY LENGTH TO AVOID WRAP
      WRITE_COPY:
   REP    MOVSB           ;DO THE "WRITE"
   RET
      SECTOR_WRITE ENDP


   PAGE
      ;
      ;  D E V I C E    S T R A T E G Y
      ;
      DEV_STRATEGY:
   MOV     CS:RH_SEG,ES     ;SAVE SEGMENT OF REQUEST HEADER POINTER
   MOV     CS:RH_OFF,BX     ;SAVE OFFSET  OF     "     "      "
   RET
      ;
      ;  D  E V I C E    I N T E R R U P T   H A N D L E R
      ;
      DEV_INT:
      ; PRESERVE MACHINE STATE ENTRY
   CLD
   PUSH     DS
   PUSH     ES
   PUSH     AX
   PUSH     BX
   PUSH     CX
   PUSH     DX
   PUSH     DI
   PUSH     SI
      ;
      ; DO THE BRANCH ACCORDING TO THE FUNCTION PASSED
      ;
   MOV      AL,ES:[BX]+2   ;GET FUNCTION BYTE
   ROL      AL,1           ;GET OFFSET INTO TABLE
   LEA      DI,FUNTAB      ;GET ADDRESS OF FUNCTION TABLE
   XOR      AH,AH
   ADD      DI,AX
   JMP      WORD PTR[DI]
      ;
      ;    INIT
      ;
      INIT:
   PUSH   CS
   POP    DX               ;CURRENT CS TO DX
   LEA    AX,CS:VDISK      ;GET ADDRESS OF VIRTUAL DISK
   MOV    CL,4
   ROR    AX,CL            ;DIVIDE BY 16 (PARAGRAPH FORM)
   ADD    DX,AX            ;ADD TO CURRENT CS VALUE
   MOV    CS:VDISK_PTR,DX  ;SAVE AS STARTING SEGMENT OF VIRTUAL DISK
   MOV    AX,2D00H         ; ADD 2D00H PARAGRAPHS TO STARTING
   ADD    DX,AX            ;  SEGMENT OF VIRTUAL DISK
   MOV    ES:WORD PTR BR_ADDR_0[BX],0
   MOV    ES:BR_ADDR_1[BX],DX     ;MAKE THET THE BREAK ADDRESS

                                     - 16 -
   MOV    ES:BYTE PTR UNITS[BX],1 ;NUMBER OF DISKETTE UNITS
   LEA    DX,BPB_PTR              ;GET ADDRESS OF BPB POINTER ARRAY
   MOV    ES:BPB_PTR_OFF[BX],DX   ;SAVE OFFSET IN DATA PACKET
   MOV    ES:BPB_PTR_SEG[bx],cs   ;SAVE SEGMENT IN DATA PACKET
   MOV    ES,CS:VDISK_PTR     ;GET STARTING SECTOR OF VIRTUAL DISK
   XOR    DI,DI               ;ZERO OUT DI (BOOT RECORD)
   LEA    SI,BOOT_REC         ;ADDRESS OF BOOT RECORD
   MOV    CX,24               ;
   REP    MOVSB               ;COPY 24 BYTES OF BOOT RECORD
   MOV    CS:WORD PTR START_SEC,1
   MOV    CS:WORD PTR TOTAL,2
   CALL   CALC_ADDR           ;CALCULATE ADDRESS OF LOGICAL SECTOR 1
   PUSH   DS
   POP    ES
   MOV    DI,SI                    ;MOVE THET ADDRESS TO ES DI
   XOR    AL,AL
   REP    STOSB                    ;ZERO OUT FAT AREA
   MOV    DS:BYTE PTR [SI],0FCH    ;SET THE FIRST FAT ENTRY
   MOV    DS:BYTE PTR 1[SI],0FFH
   MOV    DS:BYTE PTR 2[SI],0FFH
   PUSH   DS                  ;SAVE POINTER TO FAT
   PUSH   SI                  ;ON THE STACK
   MOV    CS:WORD PTR START_SEC,3
   MOV    CS:WORD PTR TOTAL,2
   CALL   CALC_ADDR           ;CALCULATE ADDRESS OF LOGICAL SECTOR 3
   PUSH   DS
   POP    ES
   MOV    DI,SI               ;MOVE THET ADDRESS TO ES:DI
   POP    SI
   POP    DS                  ;RESTORE ADDRESS TO FIRST FAT
   REP    MOVSB               ;COPY FIRST FAT TO SECOND FAT
   MOV    CS:WORD PTR START_SEC,5
   MOV    CS:WORD PTR TOTAL,4
   CALL   CALC_ADDR           ;CALCULATE ADDR OF L.5. 5 (START OF DIR)
   XOR    AL,AL
   PUSH   DS
   POP    ES                  ;SET UP ES.DI TO POINT TO IT
   XOR    DI,DI
   REP    STOSB               ;ZERO OUT DIRECTORY
   MOV    ES,CS:RH_SEG        ;RESTORE ES:BX TO REQUEST HEADER
   MOV    BX,CS:RH_OFF
     ;     STATUS    DONE,NOERROR,0  ;SET STATUS WORD (DONE, NOERROR)


   JMP            EXIT
      ;
      ; MEDIA CHECK
      ;
     MEDIA_CHECK:                     ;MEDIA CHECK (BLOCK ONLY)
      ;
      ; SET MEDIA NOT CHENGED
      ;
          MOV            ES:BYTE PTR RET_BYTE[BX],1           ;STORE IN RETURN BYTE
     ;           STATUS    DONE,NOERROR,0  ;TURN ON THE DONE BIT
          JMP            EXIT
      ;
      ; BUILD BIOS PARAMETER BLOCK
      ;
      BUILD_BPB:

                                     - 17 -
          PUSH             ES              ;SAVE SRH SEGMENT
          PUSH             BX              ;SAVE SRH OFFSET
          MOV            CS:WORD PTR START_SEC,0
          MOV            CS:WORD PTR TOTAL,1
          CALL             CALC_ADDR             ;CALCULATE ADDRESS OF FIRST SECTOR
          PUSH             CS
          POP            ES
          LEA            DI,BPB             ;ADDRESS OF BIOS PARAMETER BLOCK
          ADD            SI,11             ;ADD 11 TO SI
          MOV            CX,13             ;LENGTH OF BPB
     REP     MOVSB
          POP            BX                     ;RESTORE OFFSET

[ Íàçàä | Îãëàâëåíèå | Äàëåå ]










helloworld.ru © 2001-2021
Âñå ïðàâà çàùèùåíû