Ä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
|