А.В. Гордеев, А.Ю. Молчанов. Системное программное обеспечение. – СПб.: Питер, 2001.
Гук М. Аппаратные средства IBM PC. Энциклопедия, 2-е изд.– СПб.: Питер, 2001
Фаронов В.В. Турбо Паскаль 7.0. Учебное пособие. Издание 7-е, переработанное. –М.: «Нолидж», 2000
Юров В. Ю78 Assembler: специальный справочник – СПб: Питер, 2001
DOS варіант програми.
{$N+}
uses crt, dos;
const
ratebuf: array[1..10] of word = { масив дільників швидкостей }
(1047,192,96,48,24,12,6,3,2,1); {передавання}
var
com1, com2:word; { адреси портів СОМ1 та СОМ2}
t1, t2, freq: comp; { змінні для визначення часу }
inbuf: array[1..128] of byte; { буфер для отриманих байтів }
ff: TEXT;
{--------- процедура иніціалізаціїї портів ----------------}
procedure InitCom(com:word);
begin
port[com+3]:=$03; { встановлення кількості бітів даних та стоп бітів}
port[com+1]:=$01; { встановлення переривання по прйому символа}
port[com+4]:=$1F; {встановлення діагностичного режиму}
end;
{-------- процедура встановлення швидкості обміну ----------}
procedure SetRate(rate: word; com: word);
var
rr: byte;
begin
port[com+1]:=port[com+1] or $80;
port[com]:=Lo(rate); { запис молодшої частини дільника}
port[com+1]:=Hi(rate); { запис старшої частини дільника }
port[com+1]:=port[com+1] and $7F;
rr:=port[com];
rr:=port[com];
end;
{-------- процедура виведення індикатора процесу перевірки ----------------------}
procedure indicate(i: byte);
var
c: byte;
begin
gotoxy(20, WhereY); {переміщення курсору}
if odd(i) then write('/')
else write('');
end;
{--------- процедура зчитування поточного такту процесора ---}
function Timer:comp ; assembler;
asm
dw $310F {Clock to edx:eax}
mov bx, sp
db $66 ; push dx
db $66 ; push ax
db $36, $DF, $6F, $F8 {fild qword ptr ss:[bx-8]}
add sp, 8
end;
{------------ процедура передачі/прийому байта -------------------------------------}
procedure PortRT(com: word);
var
i,j, err,er: byte;
s: string;
tt1, tt2, tt:comp;
begin
err:=0; {кількість загальних помилок}
for i:=1 to 10 do
begin
indicate(i); {виведення індікатора процесу}
er:=0;
SetRate(ratebuf[i], com); {встановлення швидкості}
str(115200 div ratebuf[i], s);
writeln(ff,'rate: ', s);
tt1 := Timer; {запис кількості тактів процесора}
for j:=0 to 127 do
begin
repeat until (port[com+5] and $20) <> 0;
port[com]:=j; {передача байту}
repeat until (port[com+5] and $01) <> 0;
inbuf[j+1]:=port[com]; {прийом байту}
end;
tt2 := Timer; {запис кількості тактів процесора}
tt:= tt2-tt1; {визначення часу передачі}
write(ff,'Sent: ');
for j:=0 to 127 do
write(ff,chr(j));
writeln(ff);
write(ff,'Received: ');
for j:=1 to 128 do
begin
if(j-1) <> inbuf[j] then {порівняння прийнятої}
begin {та переданої}
inc(err); {послідовності байтів}
inc(er);
end;
write(ff,chr(inbuf[j])); {запис в файл}
end;
if er = 0 then writeln(ff,' OK')
else writeln(ff,' ',er,' errors');
writeln(ff,' time of transmition: ', tt/freq,' sec');
end;
if err=0 then writeln(' OK')
else writeln(' ',err,' errors');
end;
begin
clrscr;
t1 := Timer; {визначення}
Delay(1000); {тактової частоти}
t2 := Timer; { процесора}
freq := t2-t1;
com1:=memw[$40:$00]; {визначення адрес портів}
com2:=memw[$40:$02]; {СОМ1 та СОМ2}
if(com1=$03F8) then
writeln('COM1 presents');
if(com2=$02F8) then
writeln('COM2 presents');
assign(ff, 'result.txt'); {відкриття/створення }
rewrite(ff); {файлу для запису результатів}
writeln(ff,'COM1');
write('checking COM1...');
InitCom(com1); {перевірка}
PortRT(com1); {порту}
writeln(ff); {СОМ1}
writeln(ff);
gotoxy(wherex-1,wherey);
writeln(' ');
writeln(ff,'COM2');
write('checking COM2...'); {перевірка}
InitCom(com2); {порту}
PortRT(com2); {СОМ2}
gotoxy(wherex-1,wherey);
writeln(' ');
close(ff);
writeln('Process complit... (see result.txt)');
readln;
end.