Література

 

 

А.В. Гордеев, А.Ю. Молчанов. Системное программное обеспечение. – СПб.: Питер, 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.