home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Intermedia 1998 January
/
inter1_98.iso
/
www
/
rozi
/
RS.ZIP
/
RS_ODB_3.PAS
< prev
next >
Wrap
Pascal/Delphi Source File
|
1994-01-31
|
3KB
|
122 lines
{$M 8192,0,0}
uses Dos,Crt;
var irqnr,b,ws,stary_bajt:byte;
adres_proc,stary_adr:pointer;
bufor:array[1..256] of byte;
f:file;
ps:string[5];
InDosSeg,InDosOfs,rejestr_bazowy:word;
const CR=13;
LF=10;
procedure EnableIRQ(nr:byte); far;
{zezwolenie na przerwanie sprzætowe}
var IMR,maska:byte;
begin
maska:=not (1 shl nr);
{pobranie rejestru IMR z portu kontrolera 8259}
IMR:=Port[$21];
{wyzerowanie odpowiedniego bitu maski}
IMR:=IMR and maska;
{wpisanie do rejestru IMR kontrolera}
Port[$21]:=IMR;
end;
procedure DisableIRQ(nr:byte); far;
var IMR,maska:byte;
begin
maska:=0 or (1 shl nr);
IMR:=Port[$21];
IMR:=IMR or maska;
Port[$21]:=IMR;
end;
procedure Programowanie_8250; far;
begin
{odczyt z rejestru bufora}
b:=Port[rejestr_bazowy];
{odczyt z rejestru kontroli linii}
b:=Port[rejestr_bazowy+3];
EnableIRQ(irqnr);
SetIntVec(8+irqnr,adres_proc);
{ustawienie warto₧ci 01111111}
Port[rejestr_bazowy+3]:=Port[rejestr_bazowy+3] and $7F;
{zezwolenie w rejestrze zezwolenia na przerwanie IRQ,
gdy dane så przygotowane}
Port[rejestr_bazowy+1]:=1;
{warto₧ì 00001011 w rejestrze kontroli modemu}
{aktywizacja DTR, RTS i OUT2}
Port[rejestr_bazowy+4]:=$0B;
end;
procedure Obsluga_IRQ; interrupt;
begin
b:=Port[rejestr_bazowy];
bufor[ws+1]:=b;
Inc(ws);
ws:=ws and $FF;
if (ws>200) or ((b=LF) and (stary_bajt=CR)) then
begin
if b<>CR then
begin
bufor[ws-1]:=CR;
bufor[ws]:=LF;
Inc(ws);
end;
if Mem[InDosSeg:InDosOfs]=0 then
begin
DisableIRQ(irqnr);
SetIntVec(8+irqnr,stary_adr);
Assign(f,'RS_232C.OUT'); {standardowa nazwa pliku wyj₧ciowego}
Reset(f,1);
Seek(f,FileSize(f));
BlockWrite(f,bufor,ws);
Close(f);
Programowanie_8250;
ws:=0;
end;
end;
stary_bajt:=b;
Port[rejestr_bazowy+3]:=Port[rejestr_bazowy+3] and $7F;
Port[rejestr_bazowy+1]:=1;
Port[$20]:=$20; {poinformowanie PIC o zakoñczeniu obsÆugi
przerwania sprzætowego (niespecyficzne EOI
dla 8259) }
end;
begin
{warto₧ci domy₧lne}
irqnr:=4;
rejestr_bazowy:=$3F8;
if ParamCount>0 then
begin
ps:=ParamStr(1); {COM1, COM2, COM3 lub COM4}
case ps[4] of
'1':begin irqnr:=3; rejestr_bazowy:=MemW[0:$400] end;
'2':begin irqnr:=4; rejestr_bazowy:=MemW[0:$402] end;
'3':begin irqnr:=3; rejestr_bazowy:=MemW[0:$404] end;
'4':begin irqnr:=4; rejestr_bazowy:=MemW[0:$406] end;
end;
end;
adres_proc:=@Obsluga_IRQ;
GetIntVec(8+irqnr,stary_adr);
asm
mov ah,34h
int 21h
mov InDosSeg,es
mov InDosOfs,bx
end;
Programowanie_8250;
writeln('Program zostaÆ zainstalowany rezydentnie.');
Keep(0);
end.