1. Äocòóï ê ïocëeäoâaòeëüíoìó ïopòó.
Ïpè acèíxpoííoé câÿçè ìaøèía ïocûëaeò èëè ïpèíèìaeò áaéòû èíôopìaöèè
ïo oäíoìó áèòó. Bpeìeííûe èíòepâaëû ìeæäó áaéòaìè ïpè ýòoì
íecóùecòâeííû, ío âpeìeía ìeæäó oòäeëüíûìè áèòaìè áaéòa o÷eíü âaæíû.
Cèãíaë ía ëèíèè ìoæeò áûòü âûcoêoão èëè íèçêoão ópoâíÿ, ÷òo
cooòâeòcòâóeò ëoãè÷ecêèì íóëþ è eäèíèöe, è ãoâopÿò, ÷òo ëèíèÿ oòìe÷eía
(marking), êoãäa ópoâeíü âûcoêèé, è ïócòaÿ (spacing), êoãäa ópoâeíü
íèçêèé.
Ëèíèÿ ïoääepæèâaeòcÿ â oòìe÷eííoì cocòoÿíèè, êoãäa ïo íeé íeò
ïepeäa÷è äaííûx. Ïpè ía÷aëe ïepeäa÷è áaéòa äaííûx cèãíaë ïaäaeò â 0,
oòìe÷aÿ còapòoâûé áèò. Çaòeì cëeäóþò âoceìü áèòoâ äaííûx (èíoãäa
ìeíüøe) â âèäe íaáopa âûcoêèx è íèçêèx ópoâíeé. Ïocëeäíèé áèò äaííûx
ìoæeò coïpoâoæäaòücÿ áèòoì ÷eòíocòè, ècïoëüçóeìûì äëÿ oáíapóæeíèÿ
oøèáoê, a çaòeì â ïocëeäoâaòeëüíocòü âêëþ÷aþòcÿ 1 èëè áoëee còoï-áèòoâ,
êoòopûì cooòâeòcòâóeò âûcoêèé ópoâeíü. Ýòè còoï-áèòû ía÷èíaþò
oòìe÷eííoe cocòoÿíèe, êoòopoe áóäeò coxpaíÿòücÿ äo òex ïop, ïoêa íe
ía÷íeòcÿ ïepeäa÷a cëeäóþùeão áaéòa äaííûx; ÷ècëo ècïoëüçóeìûx
còoï-áèòoâ cóùecòâeíío, ïocêoëüêó oíè ócòaíaâëèâaþò ìèíèìaëüíoe âpeìÿ,
êoòopoe äoëæío ïpoéòè ïepeä cëeäóþùèì còapòoâûì áèòoì.
Koíe÷ío, ïepeäaþùaÿ è ïpèeìíaÿ còaíöèè äoëæíû ècïoëüçoâaòü oäèí è
òoò æe ïpoòoêoë äëÿ ýòèx öeïo÷eê áèòoâ è oíè äoëæíû paáo- òaòü c oäíoé
è òoé æe cêopocòüþ oáìeía (èçìepÿeìoé â áèòax â ceêóíäó, íaçûâaeìûx
òaêæe áoäaìè). Ïpè oáìeíe ìoãóò ëeãêo âoçíèêaòü oøèáêè, ïoýòoìó êoììó-
íèêaöèoííoe oáopóäoâaíèe ïpeäocòaâëÿeò paçíooápaçíóþ èíôopìaöèþ o
còaòóce êaê caìoão ïopòa, òaê è ïpècoeäèíeííoão ê íeìó ìoäeìa. Çaäa÷eé
ìoäeìa ÿâëÿeòcÿ ïpeoápaçoâa- íèe cèãíaëa, ãeíepèpóeìoão ïopòoì êoììó-
íèêaöèè, â aêócòè÷ecêèé cèãíaë, êoòopûé ìoæeò çaòeì áûòü ïepeäaí ïo
òeëeôoííoìó êaíaëó. Áoëüøèícòâo ìoäeìoâ ïpeäocòaâëÿþò òaêæe
äoïoëíèòeëüíûe êoììóíèêa- öèoííûe âoçìoæíocòè, òaêèe êaê aâòoìaòè÷ecêèé
âûçoâ è oòâeò, êoòopûe íe ïoääepæèâaþòcÿ caìèì ïopòoì êoììóíèêaöèè.
2. Ïpoãpaììèpoâaíèe ìèêpocxeìû UART 8250.
Ïocëeäoâaòeëüíaÿ câÿçü íacòoëüêo cëoæía, ÷òo áûëè paçpaáoòaíû
cïeöèaëüíûe ìèêpocxeìû, âûïoëíÿþùèe paáoòó ïo ôopìèpoâaíèþ è
cèíxpoíèçaöèè còpoê áèòoâ, cocòaâëÿþùèx ïocëeäoâaòeëüíûe äaííûe. Taêèe
ìèêpocxeìû íaçûâaþò óíèâepcaëüíûì acèíxpoííûì ïpèeìíèêoì-ïepeäaò÷èêoì
(universal asynchronous receiver transmitter èëè UART). IBM PC ècïoëü-
çóeò UART 8250 ôèpìû Intel.
Oïepaöèoííaÿ cècòeìa ïoääepæèâaeò 2 ïopòa êoììóíèêaöèè, ïoýòo- ìó â
ìaøèíe èìeþòcÿ 2 ìèêpocxeìû. Èx áaçoâûe aäpeca xpaíÿòcÿ â ÿ÷eéêe
0040:0000 äëÿ COM1 è 0040:0002 äëÿ COM2. (Áaçoâûé aäpec ýòo 2-xáaéòoâûé
aäpec ïopòa, êoòopûé ÿâëÿeòcÿ ìëaäøèì èç ãpóïïû aäpecoâ ïopòoâ, äaþùèx
äocòóï ê UART.) Ha âcex ìaøèíax COM1 èìeeò áaçoâûé aäpec 3F8H, a COM2 -
2F8H;
Mèêpocxeìa 8250 èìeeò 10 ïpoãpaììèpóeìûx oäíoáaéòíûx peãècòpoâ, c
ïoìoùüþ êoòopûx óïpaâëÿeòcÿ è êoíòpoëèpóeòcÿ ïopò êoììóíèêaöèè. Áoëü-
øèícòâo èç íèx çaíèìaþòcÿ èíèöèaëèçaöèeé ïopòa, ïpo- öeccoì, êoòopûé
ìoæeò áûòü o÷eíü cëoæíûì. Äocòóï ê ýòèì 10 pe- ãècòpaì ocóùecòâëÿeòcÿ
÷epeç ceìü aäpecoâ ïopòoâ c íoìepaìè 3F8H - 3FEH (èëè 2F8H - 2FEH). B
ïÿòè cëó÷aÿx peãècòp, ê êoòopoìó ïoëó÷aeì äocòóï ÷epeç äaííûé ïopò,
çaâècèò oò òoão, êaê ócòaíoâëeí áèò 7 â peãècòpe êoíòpoëÿ ëèíèè,
êoòopûé ÿâëÿeòcÿ eäèícòâeííûì peãècòpoì c aäpecoì ïopòa 3FBH. Boò ýòè
peãècòpû:
- 2 -
3F8H (OUT, áèò 7 = 0 â 3FBH) Peãècòp xpaíeíèÿ ïepeäaò÷èêa
3F8H (IN, áèò 7 = 0 â 3FBH) Peãècòp äaííûx ïpèeìíèêa
3F8H (OUT, áèò 7 = 1 â 3FBH) Äeëèòeëü cêopocòè oáìeía (ìëaäøèé)
3F9H (IN, áèò 7 = 1 â 3FBH) Äeëèòeëü cêopocòè oáìeía (còapøèé)
3F9H (OUT, áèò 7 = 0 â 3FBH) Peãècòp paçpeøeíèÿ ïpepûâaíèÿ
3FAH (IN) Peãècòp èäeíòèôèêaöèè ïpepûâaíèÿ
3FBH (OUT) Peãècòp óïpaâëeíèÿ ëèíèè
3FCH (OUT) Peãècòp óïpaâëeíèÿ ìoäeìoì
3FDH (IN) Peãècòp còaòóca ëèíèè
3FEH (IN) Peãècòp còaòóca ìoäeìa
Èç äecÿòè peãècòpoâ òoëüêo øecòü íeoáxoäèìû äëÿ ïpocòoé ïocëe-
äoâaòeëüíoé câÿçè. Peãècòp xpaíeíèÿ ïepeäaò÷èêa coäepæèò áaéò äaííûx,
êoòopûe áóäóò ïocëaíû, a peãècòp äaííûx ïpèeìíèêa - ïocëeäíèé
ïoëó÷eííûé áaéò äaííûx. Peãècòpû óïpaâëeíèÿ è còaòóca ëèíèè èíèöèaëè-
çèpóþò è óïpaâëÿþò ëèíèeé câÿçè, ècïoëüçóÿ cêopocòü oáìeía,
coäepæaùóþcÿ â äâóx peãècòpax äeëèòeëÿ cêopocòè oáìeía. Èç ocòaâøèxcÿ
÷eòûpex peãècòpoâ peãècòpû óïpaâëe- íèÿ è còaòóca ìoäeìa ècïoëüçóþòcÿ
òoëüêo äëÿ câÿçè ÷epeç ìoäeì , a äâa peãècòpa, câÿçaííûx c ïpepûâaíèÿìè
ècïoëüçóþòcÿ òoëüêo â ïpoöeäópax, óïpaâëÿeìûx ïpepûâaíèÿìè.
Ïpepûâaíèÿ ècïoëüçóþòcÿ ïpè câÿçè â öeëÿx ýôôeêòèâíocòè. Oáû÷íaÿ
êoììóíèêaöèoííaÿ ïpoöeäópa íeïpepûâío ïpoâepÿeò peãècòp còa- òóca ëè-
íèè, oæèäaÿ ââoäèìoão cèìâoëa èëè óêaçaíèèÿ, ÷òo âce ãoòo- âo äëÿ
ïepeäa÷è cëeäóþùeão áaéòa äaííûx. Ïocêoëüêó ïpoöeccop íaìíoão áûcòpee,
÷eì oáû÷íûe cêopocòè c êoòopûìè ïepeäaþòcÿ ïoc- ëeäoâaòeëüíûe äaííûe,
òo ýòoò ìeòoä íaïpacío pacxoäóeò ïpoöeccop- íoe âpeìÿ, êoòopoe ìoæeò
ècïoëüçoâaòücÿ äëÿ oápaáoòêè ïocòóïaþùèx èëè ïepeäaâaeìûx äaííûx. Ïo
ýòoé ïpè÷èíe ìèêpocxeìa 8250 ìoæeò áûòü ócòaíoâëeía â peæèì, âûçûâaþùèé
ïpepûâaíèe ïpè ïoÿâëeíèè cèìâoëa, âoçíèêíoâeíèè oøèáêè è ò.ï. Ýòo
ïpepûâaíèe ìoìeíòaëüío âûçoâeò ïpoöeäópó Baøeé ïpoãpaììû, êoòopaÿ,
cêaæeì, áóäeò ïepeäa- âaòü cëeäóþùèé cèìâoë èç êoììóíèêaöèoííoão
áóôepa.
3. Èíèöèaëèçaöèÿ ïocëeäoâaòeëüíoão ïopòa.
Ïpè èíèöèaëèçaöèè ïopòa êoììóíèêaöèè ("oòêpûòèè") ócòaíaâëèâaþòcÿ
âce eão ïapaìeòpû. Ýòè ïapaìeòpû äëèíó cëoâa, ÷ècëo còoï-áèòoâ,
ócòaíoâêó ÷eòíocòè è cêopocòü oáìeía. Äëèía cëoâa ýòo ÷ècëo áèòoâ,
êoòopoe oápaçóeò ocíoâíóþ eäèíèöó äaííûx. Ecëè ìû paáoòaeì c ïpèâû÷íûìè
ïopöèÿìè ïo 8 áèòoâ, òo 7 áèòoâ äocòaòo÷íû äëÿ còaíäapòíûx ôaéëoâ ASCII
(â êoòopûx âce cèìâoëû èìeþò êoäû, íe ïpeâûøaþùèe ASCII 128), â òo
âpeìÿ êaê äëÿ ïepeäa÷è ÷ècëeííûx äaííûx äocòaòo÷ío ïopöèé ïo 4 áèòa.
Cpeäíèé ópoâeíü.
Ôóíêöèÿ 0 ïpepûâaíèÿ 14H BIOS èíèöèaëèçèpóeò ïopò êoììóíèêa- öèè. B
DX äoëæeí äaâaòücÿ íoìep êoììóíèêaöèoííoão êaíaëa (COM1 = 0, COM2 = 1).
B AL äoëæeí coäepæaòücÿ áaéò èíèöèaëèçaöèoííûx äaííûx, çía÷eíèe áèòoâ
êoòopoão cëeäóþùee:
áèòû 1-0 äëèía cëoâa. 10 = 7 áèòoâ, 11 = 8 áèòoâ.
2 ÷ècëo còoï-áèòoâ. 0 = 1, 1 = 2.
4-3 ÷eòíocòü. 00 èëè 10 = íeò, 01 = íe÷eò., 11 = ÷eò.
7-5 cêopocòü oáìeía. 000 = 110 áoä
001 = 150 áoä
010 = 300 áoä
011 = 600 áoä
100 = 1200 áoä
101 = 2400 áoä
- 3 -
110 = 4800 áoä
111 = 9600 áoä
B äaííoì ïpèìepe ïopò èíèöèaëèçèpóeòcÿ co cëoâoì â 8 áèòoâ, oäíèì
còoï-áèòoì è ÷eòíoé ÷eòíocòüþ. Cêopocòü oáìeía 1200 áoä.
;---ïpècâaèâaeì çía÷eíèÿ ïapaìeòpoâ ïepeìeííûì
MOV WORDLENGTH,00000011B ;äëèía cëoâa 8 áèòoâ
MOV STOPBITS,00000000B ;1 còoï-áèò
MOV PARITY,00011000B ;÷eòíaÿ ÷eòíocòü
MOV BAUDRATE,10000000B ;cêopocòü 1200 áoä
;---èíèöèaëèçèpóeì COM1
MOV AL,0 ;÷ècòèì AL
OR AL,WORDLENGTH ;ócòaíaâëèâaeì íóæíûe áèòû
OR AL,STOPBITS ;
OR AL,PARITY ;
OR AL,BAUDRATE ;
MOV AH,0 ;ôóíêöèÿ èíèöèaëèçaöèè ïopòa
MOV DX,0 ;âûáèpaeì COM1
INT 14H ;èíèöèaëèçèpóeì ïopò
Hèçêèé ópoâeíü.
Heçaâècèìo oò òoão, çaíèìaeìcÿ ëè ìû ââoäoì èëè âûâoäoì, êaê ìèíèìóì
4 peãècòpa ìèêpocxeìû 8250 äoëæíû áûòü èíèöèaëèçèpoâaíû äëÿ oïepaöèé
oáìeía. Ýòo peãècòpû äeëèòeëÿ cêopocòè oáìeía, pe- ãècòp êoíòpoëÿ ëèíèè
è peãècòp paçpeøeíèÿ ïpepûâaíèÿ.
Äeëèòeëü cêopocòè oáìeía ýòo ÷ècëo, ía êoòopoe íaäo paçäeëèòü
÷acòoòó cècòeìíûx ÷acoâ (1190000 ãepö), ÷òoáû ïoëó÷èòü æeëaeìóþ
cêopocòü oáìeía. Haïpèìep, äëÿ cêopocòè oáìeía 1200 áoä äeëèòeëü
cêopocòè oáìeía äoëæeí áûòü paâeí 96, ïocêoëüêó 1190000/96 ïpèáëèæeíío
paâío 1200. ×eì áoëüøe äeëèòeëü, òeì ìeíüøe cêopocòü oáìeía. Cêopocòè
oáìeía 300 è ìeíüøe òpeáóþò äâóxáaéòíoão ÷ècëa äëÿ äeëèòeëÿ. Còapøèé
áaéò ïocûëaeòcÿ â 3F9H (èëè 2F9H), a ìëaäøèé â 3F8H (2F8H). B oáoèx
cëó÷aÿx áèò 7 peãècòpa óïpaâëeíèÿ ëèíèè äoëæeí áûòü ócòaíoâëeí â 1
ïepeä çacûëêoé çía÷eíèé; â ïpo- òèâíoì cëó÷ae ïo ýòèì äâóì aäpecaì
çía÷eíèÿ áóäóò aäpecoâaíû â äpóãèe peãècòpû (cì. [7.1.0]). Boò
íeêoòopûe çía÷eíèÿ, òpeáóeìûe äëÿ oáû÷íûx cêopocòeé oáìeía:
Cêopocòü oáìeía 3F9H 3F8H
110 04H 17H
300 01H 80H
600 00H C0H
1200 00H 60H
1800 00H 40H
2400 00H 30H
3600 00H 20H
4800 00H 18H
9600 00H 0CH
Bceãäa ócòaíaâëèâaéòe peãècòpû cêopocòè oáìeía ïepâûìè, òaê êaê oíè
eäèícòâeííûe, êoòopûe òpeáóþò, ÷òoáû áûë ócòaíoâëeí áèò 7 â peãècòpe
êoíòpoëÿ ëèíèè. Ïocëe ýòoão íaäo èçìeíèòü coäepæèìoe peãècòpa êoíòpoëÿ
ëèíèè, cápacûâaÿ 7-é áèò, ÷òoáû âce ocòaëüíûe äocòóïû ê peãècòpaì áûëè
ïpaâèëüíûìè. Ïocêoëüêó peãècòp êoíòpoëÿ ëèíèè ÿâëÿeòcÿ peãècòpoì òoëüêo
äëÿ çaïècè, òo íeò cïocoáa âep- íóòü áèò 7 oápaòío â 1 áeç
oäíoâpeìeííoé ócòaíoâêè âcex ocòaëüíûx áèòoâ ýòoão peãècòpa.
- 4 -
Çía÷eíèe áèòoâ peãècòpa êoíòpoëÿ ëèíèè, aäpec ïopòa êoòopoão paâeí
3FBH (èëè 2FBH), cëeäóþùee:
áèòû 1-0 Äëèía cèìâoëa. 00 = 5 áèòoâ, 01 = 6 áèòoâ
10 = 7 áèòoâ, 11 = 8 áèòoâ
2 ×ècëo còoï-áèòoâ. 0 = 1, 1 = 1.5, ecëè äëèía
ïÿòè, èía÷e 2.
3 ×eòíocòü. 1 = ãeíepèpóeòcÿ áèò ÷eòíocòè, 0 = íeò.
4 Tèï ÷eòíocòè. 0 = íe÷eòíaÿ, 1 = ÷eòíaÿ
5 Ôèêcaöèÿ ÷eòíocòè. Çacòaâëÿeò áèò ÷eòíocòè âceãäa
áûòü 0 èëè 1. 0 = oòìeíeía
1 = âceãäa 1, ecëè áèò 3 = 1 & áèò 4 = 0
èëè 1 = âceãäa 0, ecëè áèò 3 = 1 & áèò 4 = 1
èëè 1 = íeò ÷eòíocòè, ecëè áèò 3 = 0
6 Ócòaíoâêa ïepepûâa. Bûçûâaeò âûâoä còpoêè íóëeé
â êa÷ecòâe cèãíaëa oòäaëeííoé còaíöèè.
0 = çaïpeùeío, 1 = ïepepûâ
7 Meíÿeò aäpeca ïopòoâ äpóãèx peãècòpoâ
Oáû÷ío áèòû 5-7 cápoøeíû â 0. Ocòaëüíûe oïècûâaþò çía÷eíèÿ, oïpe-
äeëÿeìûe ïpoòoêoëoì oáìeía.
Äaæe ecëè Bû íe ècïoëüçóeòe ïpepûâaíèÿ, âce paâío Bû äoëæíû
ïpoèçâecòè çaïècü â peãècòp paçpeøeíèÿ ïpepûâaíèÿ, ÷òoáû áûòü
óâepeííûì, ÷òo ïpepûâaíèÿ çaïpeùeíû. Ïpocòo ïoìecòèòe â ýòoò peãècòp 0.
Peãècòp èäeíòèôèêaöèè ïpepûâaíèÿ ìoæío èãíopèpoâaòü.
Èíèöèaëèçaöèÿ ocòaëüíûx peãècòpoâ câÿçaía c ìoäeìaìè. ßcío, ÷òo
ìoäeìû íóæíû òoëüêo äëÿ câÿçè c óäaëeííûìè ócòpoécòâaìè, a íe äëÿ
óïpaâëeíèÿ áëèçëeæaùèìè ócòpoécòâaìè, òaêèìè êaê ïocëeäoâa- òeëüíûé
ïpèíòep.
B äaííoì ïpèìepe èç oáëacòè äaííûx BIOS áepeòcÿ áaçoâûé aäpec COM1,
ïocëe ÷eão paçëè÷íûe peãècòpû èíèöèaëèçèpóþòcÿ äëÿ cêopocòè oáìeía 1200
áoä, ceìèáèòíûx äaííûx, ÷eòíoé ÷eòíocòè è oäíoão còoï-áèòa.
;---ïoëó÷aeì áaçoâûé aäpec COM1
MOV AX,40H ;ES óêaçûâaeò ía oáëacòü äaííûx BIOS
MOV ES,AX ;
MOV DX,ES:[0] ;ïoëó÷aeì áaçoâûé aäpec COM1
;---èíèöèaëèçèpóeè peãècòpû äeëèòeëÿ cêopocòè oáìeía ía 1200 áoä
ADD DX,3 ;óêaçûâaeì ía peãècòp êoíòpoëÿ ëèíèè
MOV AL,10000000B ;ócòaíaâëèâaeì áèò 7
OUT DX,AL ;ïocûëaeì áaéò
DEC DX ;óêaçûâaeì ía còapøèé áaéò äeëèòeëÿ
DEC DX ;cêopocòè oáìeía
MOV AL,0 ;còapøèé áaéò äëÿ 1200 áoä
OUT DX,AL ;ïocûëaeì còapøèé áaéò äëÿ 1200 áoä
DEC DX ;óêaçûâaeì ía ìëaäøèé áaéò äeëèòeëÿ
MOV AL,60H ;ìëaäøèé áaéò äeëèòeëÿ äëÿ 1200 áoä
OUT DX,AL ;ïocûëaeì ìëaäøèé áaéò
;---èíèöèaëèçèpóeì peãècòp êoíòpoëÿ ëèíèè
MOV AL,0 ;oáíóëÿeì AL
OR AL,10B ;äëèía äaííûx 7 áèòoâ
OR AL,000B ;1 còoï-áèò
OR AL,1000B ;ãeíepèpóeòcÿ áèò ÷eòíocòè
OR AL,10000B ;÷eòíaÿ ÷eòíocòü
ADD DX,3 ;óêaçûâae ía peãècòp êoíòpoëÿ ëèíèè
OUT DX,AL ;ïocûëaeì èíèöèaëèçaöèoííoe çía÷eíèe
;---èíèöèaëèçèpóeì peãècòp paçpeøeíèÿ ïpepûâaíèÿ
DEC DX ;óêaçûâaeì ía peãècòp paçpeøeíèÿ
- 5 -
DEC DX ;ïpepûâaíèÿ
MOV AL,0 ;çaïpeùaeì ïpepûâaíèÿ
OUT DX,AL ;ïocûëaeì áaéò
4. Ócòaíoâêa òeêóùeão êoììóíèêaöèoííoão ïopòa.
Èìeþòcÿ äâa cïocoáa, êoòopûìè ïpoãpaììa ìoæeò oïpeäeëèòü, êaêoé èç
êoììóíèêaöèoííûx ïopòoâ äoëæeí ècïoëüçoâaòücÿ. Oäèí èç cïocoáoâ cocòoèò
â óêaçaíèè íoìepa êaíaëa â oïepaòope ïpoãpaììû. Bòopoé cïocoá cocòoèò â
íaïècaíèè ïpoãpaììû äëÿ oáìeía ÷epeç ïopò COM1, ío èçìeíeíèè êoììó-
íèêaöèoííoão aäaïòepa, äocòóï ê êoòopoìó èäeò ÷epeç COM1.
Oáëacòü äaííûx BIOS coäepæèò ìecòo äëÿ ÷eòûpex 2-xáaéòíûx
ïepeìeííûx, êoòopûe coäepæaò áaçoâûe aäpeca êoììóíèêaöèoííûx êaíaëoâ
(MS DOS ïoääepæèâaeò òoëüêo ïepâûe äâa èç íèx). Áaçoâûé aäpec ïopòa ýòo
ìëaäøèé èç ãpóïïû aäpecoâ ïopòoâ, ÷epeç êoòopûe ìoæío ïoëó÷èòü äocòóï ê
äaííoìó êoììóíèêaöèoííoìó êaíaëó. Áaçoâûé aäpec äëÿ COM1 xpaíèòcÿ â
ÿ÷eéêe 0040:0000, a äëÿ COM2 - â ÿ÷eéêe 0040:0002. Äëÿ cìeíû êoììó-
íèêaöèoííûx ïopòoâ íaäo ïpocòo ïoìeíÿòü ýòè äâa çía÷eíèÿ. Ïoâòopíaÿ
cìeía çía÷eíèé ïpèâeäeò ê ïepâoía- ÷aëüíoìó íaçía÷eíèþ ïopòoâ.
Cpeäíèé ópoâeíü.
Ecëè ïpoãpaììa oápaùaeòcÿ ê êoììóíèêaöèoííoìó ïopòó ÷epeç ïpepûâaíèe
14H BIOS, òo COM ïopò oïpeäeëÿeòcÿ coäepæèìûì DX, êoòopoe paâío 0 èëè 1
(äëÿ COM1 èëè COM2). Bìecòo òoão, ÷òoáû ïpècâaèâaòü DX íeïocpeäcòâeííoe
çía÷eíèe, çaïoëíÿéòe eão èç ïepe- ìeííoé, êoòopoé ìoæeò áûòü ïpècâoeío
çía÷eíèe 0 èëè 1. Ïpoãpaììû, ècïoëüçóþùèe êoììóíèêaöèoííûe ôóíêöèè 3 è
4 ïpepûâaíèÿ 21H âceãäa aäpecóþòcÿ ê COM1. B ýòoì cëó÷ae íaäo ïoìeíÿòü
áaçoâûe aäpeca:
;---oáìeí áaçoâûx aäpecoâ äëÿ COM1 è COM2
MOV AX,40H ;ES óêaçûâaeò ía oáëacòü äaííûx BIOS
MOV ES,AX ;
MOV DX,ES:[0] ;ïoìeùaeì 1-é áaçoâûé aäpec â DX
MOV AX,ES:[2] ;ïoìeùaeì 2-é áaçoâûé aäpec â AX
MOV ES:[0],AX ;oáìeíèâaeì aäpeca
MOV ES:[2],DX ;
5. Oïpeäeëeíèe còaòóca êoììóíèêaöèoííoão ïopòa.
Peãècòp còaòóca ëèíèè ìèêpocxeìû UART 8250 oïpeäeëÿeò ïpoòoêoë câÿ-
çè. Ýòoò peãècòp èìeeò aäpec ïopòa ía 5 áoëüøe, ÷eì áaçoâûé aäpec
äaííoão êaíaëa. Oáû÷ío oí ïocòoÿíío ïpocìaòpèâaeòcÿ â ïpo- öecce êoììó-
íèêaöèoííoão oáìeía. Ïpè ïepeäa÷e äaííûx peãècòp cooáùaeò, ÷òo ïpeäûäó-
ùèé cèìâoë óæe ïocëaí, ïoçâoëÿÿ ïpoãpaììe çaïècaòü íoâûé cèìâoë ïoâepx
eão. Ïpè ïpèeìe äaííûx peãècòp èíôopìèpóeò ïpoãpaììó o ïocòóïëeíèè
cëeäóþùeão cèìâoëa, c òeì ÷òoáû ïpoãpaììa ìoãëa ïpo÷èòaòü eão ïpeæäe
÷eì oí áóäeò óíè÷òoæeí cëe- äóþùèì ïpèáûâøèì. Çía÷eíèe áèòoâ ýòoão
peãècòpa cëeäóþùee:
áèò 0 1 = áaéò äaííûx ïoëó÷eí
1 1 = ïoëó÷eííûe äaííûe áûëè ïepeçaïècaíû (ïpeäûäóùèé
cèìâoë íe áûë âoâpeìÿ c÷èòaí)
2 1 = oøèáêa ÷eòíocòè (âepoÿòío, èç-ça øóìa â ëèíèè)
3 1 = oøèáêa oêpóæeíèÿ (ïepeäa÷a íe cèíxpoíèçoâaía)
4 1 = oáíapóæeí ïepepûâ (ïoëó÷eía äëèííaÿ còpoêa eäèíèö,
èíäèöèpóþùaÿ, ÷òo äpóãaÿ còaíöèÿ çaïpaøèâaeò
êoíeö ïepeäa÷è)
5 1 = peãècòp xpaíeíèÿ ïepeäaò÷èêa ïócò (â ýòoò peãècòp
- 6 -
äoëæíû ïoìeùaòücÿ ïepeäaâaeìûe äaííûe)
6 1 = peãècòp cäâèãa ïepeäaò÷èêa ïócò (ýòoò peãècòp ïo-
ëó÷aeò äaííûe èç peãècòpa xpaíeíèÿ è ïpeoápaçóeò
èx â ïocëeäoâaòeëüíûé âèä)
7 1 = òaéìaóò (ócòpoécòâo íe câÿçaío c ìaøèíoé)
Cpeäíèé ópoâeíü.
Ôóíêöèÿ 3 ïpepûâaíèÿ 14H BIOS âoçâpaùaeò â AH peãècòp còaòóca ëèíèè
(AL ïoëó÷aeò peãècòp còaòóca ìoäeìa [7.1.5]). Ïpè âxoäe DX äoëæeí
coäepæaòü íoìep êoììóíèêaöèoííoão ïopòa, ê êoòopoìó ocóùecòâëÿeòcÿ
äocòóï, ãäe COM1 = 0, a COM2 = 1. Kaê è ïpeäûäóùèé ïpèìep, ýòoò
ïpoâepÿeò íaëè÷èe ïepepûâa:
MOV AH,3 ;íoìep ôóíêöèè
MOV DX,1 ;âûáèpaeì COM2
INT 14H ;ïoëó÷aeì áaéò còaòóca
TEST AH,10000B ;oáíapóæeí ïepepûâ?
JNZ BREAK_DETECT ;ecëè äa, òo ía ïpoöeäópó oápaáoòêè
Hèçêèé ópoâeíü.
Èç oáëacòè äaííûx BIOS c÷èòûâaeòcÿ áaçoâûé aäpec êoììóíèêaöèoííoão
êaíaëa, ê íeìó äoáaâëÿeòcÿ 5, a çaòeì èç ïoëó÷eííoão aäpeca ïopòa c÷è-
òûâaeòcÿ áaéò còaòóca.
MOV AX,40H ;ES óêaçûâaeò ía oáëacòü äaííûx BIOS
MOV ES,AX ;
MOV DX,ES:[2] ;ïoëó÷aeì áaçoâûé aäpec COM2
ADD DX,5 ;äoáaâëÿeì 5 äëÿ peãècòpa còaòóca
IN AL,DX ;ïoëó÷aeì áaéò còaòóca
TEST AL,10000B ;áèò 5 ócòaíoâëeí?
JNZ BREAK_DETECT ;ecëè äa, òo ía oápaáoòêó ïepepûâa
6. Èíèöèaëèçaöèÿ è óïpaâëeíèe ìoäeìoì.
Èìeeòcÿ 6 ëèíèé, ïo êoòopûì ìoäeìû câÿçûâaþòcÿ c êoìïüþòepoì
(ócoâepøeícòâoâaííûe ìoäeëè ìoãóò èìeòü äoáaâo÷íûe ëèíèè ïo èíòepôeécó
RS232). Boò èx íaçâaíèÿ, coêpaùeíèÿ è ôóíêöèè:
Oò êoìïüþòepa ê ìoäeìó:
Data Terminal Ready (DTR) Èíôopìèpóeò ìoäeì, ÷òo êoìïüþòep
Ãoòoâíocòü êoìïüþòepa âêëþ÷eí è ãoòoâ ê câÿçè.
Request To Send (RTS) Èíôopìèpóeò ìoäeì, ÷òo êoìïüþòep
Çaïpoc ía ïocûëêó oæèäaeò ïocûëêè äaííûx.
Oò ìoäeìa ê êoìïüþòepó:
Data Set Ready (DSR) Èíôopìèpóeò êoìïüþòep, ÷òo ìoäeì
Ãoòoâíocòü ìoäeìa âêëþ÷eí è ãoòoâ.
Clear To Send (CTS) Èíôopìèpóeò êoìïüþòep, ÷òo ìoäeì
Ãoòoâíocòü ê ïocûëêe ãoòoâ ía÷aòü ïepeäa÷ó äaííûx.
Data Carrier Detect (DCD) Èíôopìèpóeò êoìïüþòep, ÷òo ìoäeì
Oáíapóæeí íocèòeëü äaííûx câÿçaí c äpóãèì ìoäeìoì.
- 7 -
Ring Indicator (RI) Èíôopìèpóeò êoìïüþòep, ÷òo òeëe-
Èíäèêaòop çâoíêa ôoííaÿ ëèíèÿ, ïo êoòopoé ïpècoe-
äèíeí ìoäeì èìeeò çâoíoê.
Cía÷aëa êoìïüþòep ócòaíaâëèâaeò cèãíaë DTR, a çaòeì èícòóêòèpóeò
ìoäeì câÿçaòücÿ c óäaëeííoé còaíöèeé. Ïocëe òoão, êaê ìoäeì ócòaíoâèë
câÿçü oí ócòaíaâëèâaeò cèãíaë DSR. Ýòoò cèãíaë èíôopìèpóeò êoìïüþòep,
÷òo ìoäeì ãoòoâ ê câÿçè è â ýòoò ìoìeíò êoìïüþòep ìoæeò ócòaíoâèòü
cèãíaë RTS. Koãäa ìoäeì oòâeòèò cèãíaëoì CTS, òo ïepeäa÷a ía÷èíaeòcÿ.
Äâe còaíäapòíûe ëèíèè, ïo êoòopûì êoìïüþòep óïpaâëÿeò ìoäeìoì,
äocòóïíû ÷epeç peãècòp êoíòpoëÿ ìoäeìa ìèêpocxeìû UART 8250. Ýòoò
peãècòp èìeeò aäpec ïopòa ía 4 áoëüøe, ÷eì áaçoâûé aäpec ècïoëüçóeìoão
êoììóíèêaöèoííoão êaíaëa. Boò çía÷eíèe eão áèòoâ:
Peãècòp êoíòpoëÿ ìoäeìa:
áèòû 7-5 (âceãäa 0)
4 1 = âûxoä UART çaìêíóò ía âxoä
3 äoáaâo÷íûé ïoëüçoâaòeëü íaçía÷eí ía âûâoä #2
2 äoáaâo÷íûé ïoëüçoâaòeëü íaçía÷eí ía âûâoä #1
1 1 = "çaïpoc ía ïocûëêó" aêòèâeí
0 1 = "ãoòoâíocòü êoìïüþòepa" aêòèâía
Oáû÷ío ócòaíoâëeíû áèòû 0 è 1 peãècòpa êoíòpoëÿ ìoäeìa, a ocòaëüíûe
paâíû 0. Áèò 2 paâeí 0, ça ècêëþ÷eíèeì cëó÷aeâ, êoãäa ïpoèçâoäèòeëü
ìoäeìa ïpeäíaçía÷èë eão äëÿ cïeöèaëüíoão ècïoëüço- âaíèÿ. Áèò 3
ócòaíoâëeí òoëüêo â cëó÷ae, êoãäa ècïoëüçóþòcÿ ïpe- pûâaíèÿ [7.1.8].
Haêoíeö, áèò 4 ïpeäocòaâëÿeò âoçìoæíocòü òecòèpoâaíèÿ êoììóíèêaöèoííûx
ïpoãpaìì áeç ócòaíoâëeíèÿ peaëüíoé câÿçè. Bûxoäíoé cèãíaë ìèêpocxeìû
UART ïoäaeòcÿ ía âxoä, êaê áóäòo UART ïpèíèìaeò ïocëeäoâaòeëüíûe
äaííûe. Ýòo câoécòâo ìoæío èc- ïoëüçoâaòü äëÿ òecòèpoâaíèÿ ïpaâèëüíocòè
paáoòû caìoé ìèêpocxeìû. Oío íeäocòóïío ïpè ècïoëüçoâaíèè êoììó-
íèêaöèoííûx ïpoöeäóp ïpepûâaíèÿ 14H BIOS.
×eòûpe ëèíèè, ïo êoòopûì ìoäeì ïocûëaþò èíôopìaöèþ êoìïüþòepó,
óïpaâëÿþòcÿ peãècòpoì còaòóca ìoäeìa. Ýòoò peãècòp pacïoëoæeí ïo aäpecó
ïopòa ía 6 áoëüøe, ÷eì áaçoâûé aäpec ècïoëüçóeìoão êoììóíèêaöèoííoão
aäaïòepa. Boò çía÷eíèe eão áèòoâ:
Peãècòp còaòóca ìoäeìa:
áèò 7 1 = DCD
6 1 = RI
5 1 = DSR
4 1 = CTS
3 1 = èçìeíeíèe â DCD
2 1 = èçìeíeíèe â RI
1 1 = èçìeíeíèe â DSR
0 1 = èçìeíeíèe â CTS
Ïpoãpaììa íeïpepûâío ïpoâepÿeò ýòè áèòû â xoäe êoììóíèêaöèoííûx
oïepaöèé. Oòìeòèì, ÷òo 4 ìëaäøèx áèòa ïapaëëeëüíû còapøèì ÷eòûpeì
áèòaì. Ýòè áèòû ócòaíaâëèâaþòcÿ â 1 òoëüêo òoãäa, êoãäa ïpoècxoäèò
èçìeíeíèe â còaòóce cooòâeòcòâóþùeão còapøeão áèòa c òex ïop, êoãäa
peãècòp ÷èòaëcÿ ïocëeäíèé paç. Bce 4 ìëaäøèx áèòa aâòoìaòè÷ecêè
cápacûâaþòcÿ ïpè ÷òeíèè peãècòpa. Ïpoãpaììû ëþáoão ópoâíÿ ìoãóò ïpÿìo
÷èòaòü ýòoò peãècòp. Äpóãoé âoçìoæíocòüþ ÿâëÿeòcÿ ècïoëüçoâaíèe ôóíêöèè
3 ïpepûâaíèÿ 14H BIOS, êoòopaÿ âoçâpaùaeò peãècòp còaòóca ìoäeìa â AL
(ïpè ýòoì â AH áóäeò coäep- æaòücÿ peãècòp còaòóca ëèíèè). Ïpè âxoäe DX
äoëæeí coäepæaòü íoìep êoììóíèêaöèoííoão êaíaëa (0 èëè 1).
- 8 -
Áoëüøèícòâo ìoäeìoâ èìeeò íaìíoão áoëüøe âoçìoæíocòeé, ïo cpaâíeíèþ
c òeìè, ÷òo oòpaæeíû â äâóx câÿçaííûx c ìoäeìoì peãècòpax. Èìeþòcÿ
âoçìoæíocòè aâòoìaòè÷ecêoé câÿçè è aâòoìaòè÷ecêoão oòâeòa, êoòopûe
êoíòpoëèpóþòcÿ óïpaâëÿþùeé còpoêoé. Ýòa còpoêa ïocûëaeòcÿ â ìoäeì, êaê
áóäòo ïepeäaþòcÿ oáû÷íûe äaííûe. Moäeì âûäeëÿeò ýòó còpoêó èç äaííûx ïo
cïeöèaëüíoìó cèìâoëó, ècïoëüçóe- ìoìó òoëüêo äëÿ óêaçaíèÿ ía÷aëa
óïpaâëÿþùeé còpoêè. Ýòoò cèìâoë ìoæeò áûòü ïpeäoïpeäeëeííûì (÷acòo
ècïoëüçóeòcÿ êoä Esc - ASCII 27) èëè âûáèpaeìûì ïoëüçoâaòeëeì. Moäeì
cïocoáeí oïpeäeëèòü íac- êoëüêo äëèííoé äoëæía áûòü êaæäaÿ còpoêa,
ïoýòoìó ïo oêoí÷aíèè còpoêè oí oïÿòü paccìaòpèâaeò âxoäÿùèé ïoòoê
èíôopìaöèè êaê äaííûe. Kaæäûé ìoäeì èìeeò câoé íaáop êoìaíä.
Hèçêèé ópoâeíü.
Boò òa æe caìaÿ cxeìa ía ÿçûêe acceìáëepa:
;---ócòaíaâëèâaeì cèãíaë DTR
MOV DX,BASE_ADDRESS ;ía÷èíaeì c áaçoâoão aäpeca
ADD DX,4 ;óêaçûâaeì ía peãècòp êoíòpoëÿ ìoäeìa
MOV AL,1 ;ócòaíaâëèâaeì áèò 1
OUT DX,AL ;ïocûëaeì â ïopò
;---ïocûëaeì óïpaâëÿþùóþ còpoêó ìoäeìó äëÿ âûçoâa
.
(ýòoò êoä paçíûé äëÿ paçíûx ìoäeìoâ)
.
;---oæèäaeì ïoêa áóäeò ócòaíoâëeí cèãíaë DSR
INC DX ;óêaçûâaeì ía peãècòp còaòóca ìoäeìa
INC DX ;
TRY_AGAIN: IN AL,DX ;ïoëó÷aeì coäepæèìoe
TEST AL,10B ;ïpoâepÿeì âòopoé áèò
JZ TRY_AGAIN ;æäeì ïoêa oí íe áóäeò paâeí 1
;---ócòaíaâëèâaeì áèò RTS
DEC DX ;âoçâpaùaeìcÿ ê peãècòpó óïpaâëeíèÿ
DEC DX ;
MOV AL,3 ;ócòaíaâëèâaeì cèãíaë RTS
OUT DX,AL ;ïocûëaeì â ïopò
;---oæèäaeì cèãíaëa CTS
INC DX ;âoçâpaùaeìcÿ ê peãècòpó còaòóca
INC DX ;
ONCE_MORE: IN AL,DX ;ïoëó÷aeì áaéò còaòóca
TEST AL,1 ;ïpoâepÿeì áèò CTS
JZ ONCE_MORE ;íe ïpoäoëæaeì ïoêa oí íe ócòaíoâëeí
;---òeïepü ìoæío ïocûëaòü äaííûe
6. Ïepeäa÷a äaííûx.
Ïepeäa÷a äaííûx ïpoùe ÷eì ïpèeì, ïocêoëüêó ïpoãpaììa èìeeò ïoëíûé
êoíòpoëü íaä cocòaâoì äaííûx è cêopocòüþ, c êoòopoé oíè äoëæíû
ïocûëaòücÿ. Teì íe ìeíee ïpoöeäópû ïepeäa÷è ìoãóò áûòü äocòaòo÷ío
cëoæíûìè, ecëè oíè oápaáaòûâaþò äaííûe ïo ìepe òoão, êaê oíè
ïocûëaþòcÿ. Moãóò áûòü òaêæe ïpoáëeìû c cèíxpoíèçaöèeé ïpè
ècïoëüçoâaíèè ïpoòoêoëa XON/XOFF. Ýòoò ïpoòoêoë ècïoëüçóeò êoäû ASCII
17(XON) è 19(XOFF), äëÿ òoão ÷òoáû cèãíaëèçèpoâaòü ïpèíèìaþùeé còaíöèè,
÷òo ïepeäaò÷èê xo÷eò ïpoäoëæèòü ïepeäa÷ó âpeìeíío ïpepâaííoão ïoòoêa
äaííûx. ×òoáû ïpèíÿòü ýòè cèãíaëû, ïpoãpaììa äoëæía íeïpepûâío aíaëè-
çèpoâaòü ïpèíèìaeìûe cèìâoëû ïpè ïepeäa÷e (â ïoëíoäóïëeêcíoì peæèìe, â
êoòopoì oáû÷ío paáoòaþò ìoäeìû, cèãíaëû oäíoâpeìeíío èäóò â oáe còopoíû
ïo òeëeôoííoìó êaíaëó). Kpoìe òoão, ÷òoáû oáíapóæèòü, ÷òo óäaëeííaÿ
- 9 -
còaíöèÿ ïocûëaeò còpoêó íóëeé, â êa÷ecòâe cèãíaëa ïepepûâa, äoëæeí
íeïpe- pûâío aíaëèçèpoâaòücÿ còaòóc áèòa ïepepûâa (íoìep 4) peãècòpa
còaòóca ëèíèè.
Cpeäíèé ópoâeíü.
Ôóíêöèÿ 1 ïpepûâaíèÿ 14H BIOS ïocûëaeò cèìâoë, coäepæaùèécÿ â AL â
êoììóíèêaöèoííûé êaíaë. Ïpè âxoäe DX coäepæèò íoìep ïopòa (0 èëè 1).
Ïpè âoçâpaòe AH coäepæèò áaéò còaòóca, â êoòopoì áèò 7 = 1, ecëè
oïepaöèÿ íeócïeøía. B ýòoì cëó÷ae èìeþò çía÷eíèe cëeäóþùèe áèòû:
áèò 4 oáíapóæeí ïepepûâ (cèãíaë "còoï" oò ïpèíèìaþùeé còaíöèè)
5 peãècòp cäâèãa ïepeäaò÷èêa ïócò
6 peãècòp xpaíeíèÿ ïepeäaò÷èêa ïócò
MS DOS èìeeò ôóíêöèþ äëÿ ïepeäa÷è ïo êoììóíèêaöèoííoìó êaíaëó
cèìâoëa, ïoìeùaeìoão â DL. Ýòo ôóíêöèÿ íoìep 4 ïpepûâaíèÿ 21H, ío oía
íe èìeeò íèêaêèx ïpeèìóùecòâ ïepeä ôóíêöèeé BIOS; oía íe âoçâpaùaeò
còaòócíoé èíôopìaöèè è íe ïoçâoëÿeò íaçía÷aòü êaêoé èç êoììóíèêaöèoííûx
ïopòoâ íaäo ècïoëüçoâaòü (âceãäa ècïoëüçóeòcÿ COM1).
×òoáû âûâecòè còpoêó äaííûç ècïoëüçóéòe ôóíêöèþ 40H ïpepûâaíèÿ 21H.
Ýòo oáû÷íaÿ ôóíêöèÿ âûâoäa äëÿ âcex ôaéëoâ è ócòpoécòâ ïpè
ècïoëüçoâaíèè ìeòoäa äocòóïa äecêpèïòopa ôaéëoâ. COM1 èìeeò ïpe-
ëoïpeäeëeííûé íoìep #3. Ïoìecòèòe íoìep ôaéëa â BX, a ÷ècëo ïepe-
äaâaeìûx áaéòoâ â CX. Ïócòü DS:DX óêaçûâaþò ía áóôep âûâoäèìûx äaííûx è
âûçûâaéòe ôóíêöèþ.
MOV AH,40H ;íoìep ôóíêöèè
MOV BX,3 ;ïpeäoïpeäeëeííûé íoìep ôaéëa äëÿ COM1
MOV CX,50 ;âûâoäèì 50 áaéòoâ
LEA DX,DATA_BUFFER ;DS:DX óêaçûâaþò ía áóôep äaííûx
INT 21H ;ïocûëaeì äaííûe
JC COM_ERROR ;óxoä ía oápaáoòêó oøèáêè
Hèçêèé ópoâeíü.
Koãäa áaéò äaííûx ïoìeùaeòcÿ â peãècòp xpaíeíèÿ ïepeäaò÷èêa, òo oí
aâòoìaòè÷ecêè âûâoäèòcÿ â ïocëeäoâaòeëüíûé êaíaë ÷epeç peãècòp cäâèãa
ïepeäaò÷èêa, êoòopûé cepèaëèçóeò äaííûe. Heò íeoáxoäèìocòè â èìïóëüce
áèòa còpoáa, êaê ýòo äeëaeòcÿ â cëó÷ae ïa- paëëeëüíoão aäaïòepa. Áèò 5
peãècòpa còaòóca ëèíèè ïoêaçûâaeò câoáoäeí ëè peãècòp xpaíeíèÿ
ïepeäaò÷èêa äëÿ ïpèeìa äaííûx. Pe- ãècòp ïocòoÿíío ïpoâepÿeòcÿ äo òex
ïop, ïoêa áèò 5 íe còaíeò paâíûì 1. Ïocëe ýòoão â peãècòp xpaíeíèÿ
ïepeäaò÷èêa ïocûëaeòcÿ o÷epeäíoé áaéò èç òoão ìecòa, oòêóäa oíè
áepóòcÿ. B ïpoöecce ïepeäa÷è áèò 5 paâeí 0 è òoëüêo êoãäa oí oïÿòü
còaíeò paâíûì 1, òo â peãècòp xpaíeíèÿ ïepeäaò÷èêa ìoæeò áûòü ïocëaí
cëeäóþùèé cèìâoë. Ýòoò ïpoöecc ïoâòopÿeòcÿ äo òex ïop, ïoêa ýòo íóæío.
B cëeäóþùeì ïpèìepe äaíû ocíoâíûe ïoíÿòèÿ oá ýòoé ïpoöeäópe.
Koíe÷ío, oía ìoæeò áûòü cäeëaía íeoáû÷aéío cëoæíoé (â ÷acòíocòè,
ïpoãpaììèpoâaíèe câÿçè òpeáóeò ocoáo òùaòeëüíûx ïpoöeäóp oáíapóæeíèÿ
oøèáoê è âoccòaíoâëeíèÿ ïpè cáoÿx). B ïpèìepe ïpeäïoëaãaeòcÿ, ÷òo
êoììóíèêaöèoííûé ïopò è ìoäeì óæe èíèöèaëèçèpoâaíû.
;---æäeì ïoêa âce áóäeò ãoòoâo äëÿ ïocûëêè cèìâoëa
KEEP_TRYING: MOV DX,BASE_ADDRESS ;áaçoâûé aäpec
ADD DX,5 ;óêaçûâaeì ía peãècòp còaòóca ëèíèè
IN AL,DX ;ïoëó÷aeì áaéò còaòóca
TEST AL,00011110B ;ïpoâepÿeì ía oøèáêó
JNZ ERROR_ROUTINE ;ecëè ecòü, òo ía ïpoöeäópó oápaáoòêè
TEST AL,00000001B ;ïpoâepÿeì ïoëó÷eíû ëè äaííûe
- 10 -
JNZ RECEIVE ;ecëè äa, òo ía ïpoöeäópó ïpèeìa
TEST AL,00100000B ;ïpoâepÿeì ãoòoâíocòü ê ïepeäa÷e
JZ KEEP_TRYING ;ecëè íeò, òo âoçâpaùaeìcÿ íaçaä
;---ïepeäaeì cèìâoë ïpèíèìaeìûé c êëaâèaòópû
MOV AH,1 ;ôóíêöèÿ ïpoâepêè íaæaòèÿ êëaâèøè
INT 16H ;ïpepûâaíèe êëaâèaòópû BIOS
JZ KEEP_TRYING ;âoçâpaò, ecëè íe áûëo íaæaòèÿ
MOV AH,0 ;ôóíêöèÿ ïoëó÷eíèÿ êoäa c êëaâèaòópû
INT 16H ;òeïepü íóæíûé cèìâoë â AL
SUB DX,5 ;aäpec peãècòpa xpaíeíèÿ ïepeäaò÷èêa
OUT DX,AL ;ïocûëaeì cèìâoë
JMP SHORT KEEP_TRYING ;âoçâpaùaeìcÿ ê ía÷aëó öèêëa
7. Ïoëó÷eíèe äaííûx.
Koììóíèêaöèoííaÿ ïpoãpaììa ãoòoâa ïpèíèìaòü äaííûe êaê òoëüêo èíè-
öèaëèçèpoâaí êoììóíèêaöèoííûé ïopò è ócòaíoâëeía câÿçü c óäaëeííoé
còaíöèeé. Ïpèeì äaííûx íèêoãäa ïoëíocòüþ íe oòäeëeí oò ïepeäa÷è äaííûx,
ïocêoëüêó ïpoãpaììe ìoæeò ïoòpeáo- âaòücÿ ïocëaòü cèãíaë XOFF (ASCII
19), ÷òoáû ocòaíoâèòü ïoòoê äaííûx, ecëè oíè ïocòóïaþò cëèøêoì áûcòpo è
oía íe ócïeâaeò èx oápaáaòûâaòü. Koä XON (ASCII 17) cooáùaeò óäaëeííoé
còaíöèè, ÷òo ìoæío ïpoäoëæèòü ïepeäa÷ó.
B çaâècèìocòè oò cëoæíocòè ècïoëüçóeìoão ïpoòoêoëa oáìeía,
ïpèíèìaeìûe äaííûe ìoãóò òpeáoâaòü ïpocòoé èëè cëoæíoé oápaáoòêè. Te èç
íèx, êoòopûe ÿâëÿþòcÿ oãpaíè÷èòeëÿìè äaííûx ÷aùe oáíapóæèâaþòcÿ ïpè
cèíxpoííoì oáìeíe. Ïpè âûâoäe ïoëó÷aeìûx cèìâoëoâ ía ýêpaí ó÷èòûâaéòe
âëèÿíèe cèìâoëoâ ïepeâoäa còpoêè (ASCII 10), ïocêoëüêó íeêoòopûe ÿçûêè
(âêëþ÷aÿ Áeécèê) aâòoìaòè÷ecêè âcòaâëÿþò ïepeâoä còpoêè ïocëe âoçâpaòa
êapeòêè; â ýòoì cëó÷ae ècêëþ÷aéòe ïepeâoäû còpoêè èç ïpèíèìaeìûx
äaííûx, ÷òoáû èçáeæaòü ïócòûx còpoê ïpè âûâoäe.
Cpeäíèé ópoâeíü.
Ôóíêöèÿ 2 ïpepûâaíèÿ 14H BIOS oæèäaeò cèìâoë èç ïocëeäoâaòeëüíoão
ïopòa, ïoìeùaeò eão â AL ïpè ïoëó÷eíèè è çaòeì âoçâpaùaeòcÿ â
ïpoãpaììó. Ïpè âxoäe íaäo ïoìecòèòü íoìep ïopòa (0-1) â DX. Ïpè
âoçâpaòe AX paâeí íóëþ, ecëè íe áûëo oøèáêè. Ecëè AH íe paâeí 0, òo
ìoæeò áûòü âoçâpaùeí áaéò còaòóca, â êoòopoì èìeþò çía÷eíèe òoëüêo 5
áèòoâ. Ýòo cëeäóþùèe áèòû:
áèò 1 oøèáêa ïepeïoëíeíèÿ (íoâûé cèìâoë ïocòóïèë paíüøe, ÷eì
áûë óäaëeí còapûé)
2 oøèáêa ÷eòíocòè (âepoÿòío, èç-ça ïpoáëeì â ëèíèè)
3 oøèáêa oôopìëeíèÿ (còapòoâûé èëè còoï-áèòû íeâepíû)
4 oáíapóæeí ïepepûâ (ïoëó÷eía äëèííaÿ còpoêa áèòoâ 0)
5 oøèáêa òaéìaóòa (íe ïoëó÷eí cèãíaë DSR)
MS DOS òaêæe ïpeäocòaâëÿeò êoììóíèêaöèoííóþ ôóíêöèþ äëÿ ïpèeìa
oäíoão cèìâoëa, ýòo ôóíêöèÿ 3 ïpepûâaíèÿ 21H. Ôóíêöèÿ oæèäaeò cèìâoë èç
COM1 è ïoìeùaeò eão â AL. Oòìeòèì, ÷òo ïpè ýòoì íeò ôóíêöèè èíè-
öèaëèçaöèè ïopòa, êoòopóþ íaäo äeëaòü ÷epeç ïpoöeäópó BIOS èëè
íeïocpeäcòâeíío, êaê ïoêaçaío â [7.1.2]. Ïo óìoë÷aíèþ ïopò èíèöèaëè-
çèpóeòcÿ co çía÷eíèÿìè 2400 áoä, íeò êoíòpoëÿ ÷eòíocòè, oäèí còoï-áèò è
8 áèòoâ ía cèìâoë. Ýòa ôóíêöèÿ íe èìeeò íèêaêèx äocòoèícòâ ïo cpaâíeíèþ
c ôóíêöèeé BIOS è íe âoçâpaùaeò èíôopìaöèè o còaòóce.
Hèçêèé ópoâeíü.
Ïpè ïoëó÷eíèè äaííûx áeç ècïoëüçoâaíèÿ êoììóíèêaöèoííoão ïpe-
- 11 -
pûâaíèÿ ïpoãpaììa äoëæía ïocòoÿíío ïpoâepÿòü peãècòp còaòóca ëèíèè,
aäpec ïopòa êoòopoão ía 5 áoëüøe áaçoâoão aäpeca ècïoëüçóeìoão êoììó-
íèêaöèoííoão aäaïòepa. Áèò 0 ýòoão peãècòpa áóäeò paâeí íóëþ, äo òex
ïop ïoêa íe áóäeò ïoëó÷eí cèìâoë â pe- ãècòp äaííûx ïpèeìíèêa. Koãäa
áèò 0 còaíoâèòcÿ paâíûì 1, òo íaäo íeìeäëeíío c÷èòaòü eão èç peãècòpa,
c òeì ÷òoáû ía íeão íe íaëo- æèëcÿ cëeäóþùèé ïpèíèìaeìûé cèìâoë. Ïocëe
òoão êaê cèìâoë c÷èòaí, áèò 0 oïÿòü còaíoâèòcÿ paâíûì 0 è ocòaeòcÿ
òaêoâûì, ïoêa íe ïpèáóäeò íoâûé cèìâoë.
Xoòÿ çäecü oá ýòoì íe ãoâopèëocü, ío êoììóíèêaöèoííûe ïpoöeäópû
oáû÷ío coçäaþò öèêëè÷ecêèé áóôep äëÿ cáopa ïocòóïaþùèx cèìâo- ëoâ. Bû
äoëæíû òaêæe çíaòü, ÷òo ecëè ïocòóïaþùèe äaííûe ïoäaâaòü ía ýêpaí co
cêopocòüþ 1200 áoä, òo ïpoöeäópa cäâèãa ýêpaía BIOS íe áóäeò ócïe- âaòü
è ïpoèçoéäeò ïepeïoëíeíèe. Ïpocòoe peøeíèe ýòèx ïpoáëeì cocòoèò â
ècïoëüçoâaíèè êoììóíèêaöèoííoão ïpepûâaíèÿ.
Cëeäóþùèé ïpèìep ÷acòè÷ío äóáëèpóeò coäepæèìoe ïpeäûäóùeão paçäeëa,
oòíocÿùeãocÿ ê ïepeäa÷e cèìâoëoâ. Kaê è â òoì cëó÷ae êoä ía÷èíaeòcÿ c
áecêoíe÷íoão öèêëa.
KEEP_TRYING: MOV DX,BASE_ADDRESS ;áaçoâûé aäpec
ADD DX,5 ;óêaçûâaeì ía peãècòp còaòóca ëèíèè
IN AL,DX ;ïoëó÷aeì áaéò còaòóca
TEST AL,00011110B ;ïpoâepÿeì ía oøèáêó
JNZ ERROR_ROUTINE ;ecëè äa, òo ía oápaáoòêó oøèáêè
TEST AL,00000001B ;ïpoâepÿeì ïoëó÷eíû ëè äaííûe
JNZ RECEIVE ;ía ïpoöeäópó ïpèeìa äaííûx
TEST AL,00100000B ;ïpoâepÿeì ãoòoâíocòü ê ïepeäa÷e
JZ KEEP_TRYING ;ecëè íeò, òo ê ía÷aëó öèêëa
.
(çäecü pacïoëoæeía ïpoöeäópa ïepeäa÷è - cì. [7.1.6])
.
;---ïoëó÷aeì äaííûe è âûâoäèì èx ía ýêpaí
RECEIVE: MOV DX,BASE_ADDRESS ;áaçoâûé aäpec
IN AL,DX ;÷èòaeì ïoëó÷eííûé cèìâoë
CMP AL,19 ;ïpoâepêa ía XOFF
JE XOFF_ROUTINE ;
.
(è ò.ä.)
.
MOV DL,AL ;ãoòoâèì cèìâoë äëÿ âûâoäa ía ýêpaí
MOV AH,2 ;ôóíêöèÿ âûâoäa cèìâoëa
INT 21H ;âûâoäèì eão
JMP SHORT KEEP_TRYING ;âoçâpaùaeìcÿ ía ía÷aëo öèêëa
8. Ïocûëêa/ïoëó÷eíèe äaííûx c ïoìoùüþ êoììóíèêaöèoííoão ïpepûâaíèÿ.
Xopoøaÿ êoììóíèêaöèoííaÿ ïpoãpaììa èìeeò cëèøêoì ìíoão paáoòû, ÷òoáû
ïocâÿòèòü ceáÿ öeëèêoì ââoäó/âûâoäó. Ïocòóïaþùèe äaííûe äoëæíû aíaëè-
çèpoâaòücÿ, ïepeäaâaeìûe äaííûe äoëæíû coáèpaòücÿ, a áoëüøèe áëoêè
äaííûx ìoãóò çaïècûâaòücÿ ía äècê èëè c÷èòûâaòücÿ c íeão. Koììó-
íèêaöèoííoe ïpepûâaíèe ïoçâoëÿeò ïpoãpaììe íe òpaòèòü ía ââoä/âûâoä
áoëüøe âpeìeíè, ÷eì oí òoão òpeáóeò. Haïpèìep, ïocëe ócòaíoâêè
ïpepûâaíèÿ, óïpaâëeíèe ïepeäaeòcÿ ïpoöeäópe ïepe- äa÷è äaííûç òoëüêo â
òoì cëó÷ae, êoãäa peãècòp xpaíeíèÿ ïepeäaò÷èêa ïócò è âoçâpaùaeòcÿ
ïpoãpaììe, êaê òoëüêo ïocëaí áaéò äaííûx, ïoçâoëÿÿ eé ïpoäoëæaòü câoþ
paáoòó äo òex ïop, ïoêa peãècòp xpaíeíèÿ ïepeäaò÷èêa íe áóäeò cíoâa
ãoòoâ.
IBM PC oòâoäèò äâa aïïapaòíûx ïpepûâaíèÿ äëÿ êoììóíèêaöèoííûx
êaíaëoâ, íoìep 3 (COM1) è 4 (COM2). Mèêpocxeìa UART 8250 äoïócêaeò 4
- 12 -
êëacca ïpepûâaíèé äëÿ êaæäoão êaíaëa, ècïoëüçóÿ cëe- äóþùèe äâoè÷íûe
êoäoâûe ÷ècëa:
00 èçìeíeíèe â peãècòpe còaòóca ìoäeìa
01 peãècòp xpaíeíèÿ ïepeäaò÷èêa ïócò
10 ïoëó÷eíû äaííûe
11 oøèáêa ïpèeìa, èëè ïoëó÷eío ócëoâèe ïepepûâa
Ýòè êoäû coäepæaòcÿ â áèòax 2-1 peãècòpa èäeíòèôèêaöèè ïpepûâa- íèÿ,
aäpec ïopòa êoòopoão ía 2 áoëüøe, ÷eì áaçoâûé aäpec ècïoëüçóeìoão
êoììóíèêaöèoííoão aäaïòepa. Áèò 0 ýòoão peãècòpa ócòaíaâëèâaeòcÿ ïpè
âoçíèêíoâeíèè ïpepûâaíèÿ, a ocòaëüíûe áèòû íe èc- ïoëüçóþòcÿ è âceãäa
paâíû 0.
×òoáû âûápaòü oäío èëè áoëee ïpepûâaíèé, íaäo çaïpoãpaììèpo- âaòü
peãècòp paçpeøeíèÿ ïpepûâaíèÿ, aäpec êoòopoão ía 1 áoëüøe áaçoâoão
aäpeca. Çía÷eíèe eão áèòoâ òaêoe:
áèò 0 1 = ïpepûâaíèe ïpè ïoëó÷eíèè äaííûx
1 1 = ïpepûâaíèe êoãäa peãècòp xpaíeíèÿ ïepeäaò÷èêa ïócò
2 1 = ïpepûâaíèe ïpè oøèáêe ïpèeìa äaííûx
3 1 = ïpepûâaíèe ïpè èçìeíeíèè peãècòpa còaòóca ìoäeìa
7-4 íe ècïoëüçóþòcÿ, âceãäa 0
Koãäa oäío èç ýòèx coáûòèé ïpoècxoäèò, òo èíèöèèpóeòcÿ aïïapaòíoe
ïpepûâaíèe, âoçíèêaþùee â ìèêpocxeìe oápaáoòêè ïpepûâaíèé 8259 ïo
êaíaëó 3 äëÿ COM1 è ïo êaíaëó 4 äëÿ COM2. Ïpoöeäópa oápaáoòêè
ïpepûâaíèé ïepeäaeò óïpaâëeíèe òoìó êoäó, ía êoòopûé óêaçûâaeò
cooòâeòcòâóþùèé âeêòop ïpepûâaíèÿ. Ïocêoëüêó ýòo aïïapaòíoe ïpe-
pûâaíèe, òo oío ìoæeò áûòü ìacêèpoâaío. Ïoìíèòe, ÷òo ïpoöeäópa
oápaáoòêè ïpepûâaíèÿ äoëæía çaâepøaòücÿ còaíäapòíûì êoäoì âûxoäa èç
aïïapaòíoão ïpepûâaíèÿ MOV AL,20H/OUT 20H,AL. Ha pèc. 7-3 ïoêaçaío
êoììóíèêaöèoííoe ïpepûâaíèe.
Ëþáoe ÷ècëo òèïoâ ïpepûâaíèÿ ìoæeò áûòü paçpeøeío oäíoâpeìeíío. Ho
ecëè paçpeøeí áoëee ÷eì oäèí òèï, òo ïpoöeäópa oápaáoòêè ïpepûâaíèÿ
äoëæía caìa oïpeäeëÿòü êaêoé èç òèïoâ ïpepûâaíèÿ ïpoèçoøeë, ïpoâepÿÿ
peãècòp èäeíòèôèêaöèè ïpepûâaíèÿ. Oäíoâpeìeíío ìoãóò ïpoècxoäèòü áoëee
÷eì oäío ïpepûâaíèe, ïoýòoìó áèò 0 pe- ãècòpa èäeíòèôèêaöèè cooáùaeò o
òoì, ÷òo ïocòóïèëo eùe oäío ïpe- pûâaíèe. Koãäa äâa èëè áoëee
ïpepûâaíèé ïocòóïèëo â oäèí è òoò æe ìoìeíò âpeìeíè, òo oíè
oápaáaòûâaþòcÿ â ïopÿäêe, óêaçaííoì â íèæeïpèâeäeííoé òaáëèöe.
Äoáaâo÷íûe ïpepûâaíèÿ äoëæíû áûòü oápa- áoòaíû äo çaâepøeíèÿ ïpoöeäópû
oápaáoòêè ïpepûâaíèÿ. Ócëoâèÿ ïpeäøecòâóþùèx ïpepûâaíèé "oòìeíÿþòcÿ" c
ïoìoùüþ äeécòâèé, ïpèâeäeííûx â ïpaâoì còoëáöe cëeäóþùeé òaáëèöû:
Koä Tèï Äeécòâèÿ äëÿ "cápoca"
11 oøèáêa èëè ïepepûâ ÷òeíèe peãècòpa còaòóca ëèíèè
10 ïoëó÷eíû äaííûe ÷òeíèe peãècòpa ïpèeìíèêa äaííûx
01 ïepeäaò÷èê ãoòoâ âûâoä cèìâoëa â peãècòp xpaíeíèÿ
ïepeäaò÷èêa
00 èçìeíeíèe còaòóca ìoäeìa ÷òeíèe peãècòpa còaòóca ìoäeìa
Hèçêèé ópoâeíü.
Boò oáùaÿ ôopìa ïpoãpaììû, oápaáaòûâaþùeé êoììóíèêaöèoííûe
ïpepûâaíèÿ:
;---ócòaíoâêa âeêòopa êoììóíèêaöèoííoão ïpepûâaíèÿ
PUSH DS ;coxpaíÿeì DS
- 13 -
MOV DX,OFFSET IO_INT ;DS:DX óêaçûâaþò ía ïpoöeäópó
MOV AX,SEG IO_INT ;
MOV DS,AX ;
MOV AL,0BH ;íoìep âeêòopa äëÿ COM1
MOV AH,25H ;ôóíêöèÿ èçìeíeíèÿ âeêòopa
INT 21H ;ìeíÿeì âeêòop ïpepûâaíèÿ
;---èíèöèaëèçaöèÿ peãècòpa paçpeøeíèÿ ïpepûâaíèÿ (COM1)
MOV AX,40H ;DS óêaçûâaeò ía äaííûe BIOS
MOV DS,AX ;
MOV DX,DS:[0] ;ïoëó÷aeì áaçoâûé aäpec COM1
INC DX ;óêaçûâaeì ía peãècòp paçpeøeíèÿ
MOV AL,3 ;ïpepûâaíèé è paçpeøaeì ïpepûâaíèÿ
OUT DX,AL ;ïpèeìa è ïepeäa÷è
POP DS ;âoccòaíaâëèâaeì peãècòp
;---ïpoöeäópa oápaáoòêè ïpepûâaíèÿ - cía÷aëa oïpeäeëÿeì eão òèï
IO_INT PROC FAR
NEXT_INT: MOV DX,BASEADDRESS ;áaçoâûé aäpec
INC DX ;óêaçûâaeì ía peãècòp èäeíòèôèêaöèè
INC DX ;ïpepûâaíèÿ
IN AL,DX ;÷èòaeì eão çía÷eíèe
TEST AL,10B ;ýòo ïpepûâaíèe ïepeäaò÷èêa?
JNZ TRANSMIT ;ecëè äa, òo ía ïepeäa÷ó
RECEIVE: ;èía÷e ía ïpèeì
.
.
JMP SHORT ANOTHER ;ïpoâepÿeì íeò ëè äpóãoão ïpepûâaíèÿ
TRANSMIT: ;çäecü êoä äëÿ ïepeäa÷è
.
.
;---ïepeä âûxoäoì, ïpoâepÿeì íeò ëè äpóãoão ïpepûâaíèÿ
ANOTHER: MOV DX,BASEADDRESS ;áaçoâûé aäpec
INC DX ;óêaçûâaeì ía peãècòp èäeíòèôèêaöèè
INC DX ;ïpepûâaíèÿ
IN AL,DX ;÷èòaeì eão çía÷eíèe
TEST AL,1 ;ïpoâepÿeì áèò 1
JNZ NEXT_INT ;ecëè oí ócòaíoâëeí, òo ía ía÷aëo
MOV AL,20H ;èía÷e êoä çaâepøeíèÿ aïïapaòíoão
OUT 20H,AL ;ïpepûâaíèÿ
IRET
IO_INT ENDP
|