home *** CD-ROM | disk | FTP | other *** search
/ Intermedia 1998 January / inter1_98.iso / www / rozi / RS.ZIP / RS_ODB_3.PAS < prev    next >
Pascal/Delphi Source File  |  1994-01-31  |  3KB  |  122 lines

  1. {$M 8192,0,0}
  2.  
  3. uses Dos,Crt;
  4.  
  5. var irqnr,b,ws,stary_bajt:byte;
  6.     adres_proc,stary_adr:pointer;
  7.     bufor:array[1..256] of byte;
  8.     f:file;
  9.     ps:string[5];
  10.     InDosSeg,InDosOfs,rejestr_bazowy:word;
  11.  
  12. const CR=13;
  13.       LF=10;
  14.  
  15. procedure EnableIRQ(nr:byte); far; 
  16. {zezwolenie na przerwanie sprzætowe}
  17. var IMR,maska:byte;
  18. begin
  19. maska:=not (1 shl nr);
  20. {pobranie rejestru IMR z portu kontrolera 8259}
  21. IMR:=Port[$21];
  22. {wyzerowanie odpowiedniego bitu maski}
  23. IMR:=IMR and maska;
  24. {wpisanie do rejestru IMR kontrolera}
  25. Port[$21]:=IMR; 
  26. end;
  27.  
  28. procedure DisableIRQ(nr:byte); far;
  29. var IMR,maska:byte;
  30. begin
  31. maska:=0 or (1 shl nr);
  32. IMR:=Port[$21];
  33. IMR:=IMR or maska;
  34. Port[$21]:=IMR;
  35. end;
  36.  
  37. procedure Programowanie_8250; far;
  38. begin
  39. {odczyt z rejestru bufora}
  40. b:=Port[rejestr_bazowy];
  41.  
  42. {odczyt z rejestru kontroli linii}
  43. b:=Port[rejestr_bazowy+3];
  44.  
  45. EnableIRQ(irqnr);
  46. SetIntVec(8+irqnr,adres_proc);
  47.  
  48. {ustawienie warto₧ci 01111111}
  49. Port[rejestr_bazowy+3]:=Port[rejestr_bazowy+3] and $7F;
  50.  
  51. {zezwolenie w rejestrze zezwolenia na przerwanie IRQ,
  52. gdy dane så przygotowane}
  53. Port[rejestr_bazowy+1]:=1;
  54.  
  55. {warto₧ì 00001011 w rejestrze kontroli modemu}
  56. {aktywizacja DTR, RTS i OUT2}
  57. Port[rejestr_bazowy+4]:=$0B;
  58. end;
  59.  
  60. procedure Obsluga_IRQ; interrupt;
  61. begin
  62. b:=Port[rejestr_bazowy];
  63. bufor[ws+1]:=b;
  64. Inc(ws);
  65. ws:=ws and $FF;
  66. if (ws>200) or ((b=LF) and (stary_bajt=CR)) then
  67.   begin
  68.   if b<>CR then
  69.     begin
  70.     bufor[ws-1]:=CR;
  71.     bufor[ws]:=LF;
  72.     Inc(ws);
  73.     end;
  74.   if Mem[InDosSeg:InDosOfs]=0 then
  75.     begin
  76.     DisableIRQ(irqnr);
  77.     SetIntVec(8+irqnr,stary_adr);
  78.     Assign(f,'RS_232C.OUT'); {standardowa nazwa pliku wyj₧ciowego}
  79.     Reset(f,1);
  80.     Seek(f,FileSize(f));
  81.     BlockWrite(f,bufor,ws);
  82.     Close(f);
  83.     Programowanie_8250;
  84.     ws:=0;
  85.     end;
  86.   end;
  87.   stary_bajt:=b;
  88.   Port[rejestr_bazowy+3]:=Port[rejestr_bazowy+3] and $7F;
  89.   Port[rejestr_bazowy+1]:=1;
  90.   Port[$20]:=$20; {poinformowanie PIC o zakoñczeniu obsÆugi
  91.                    przerwania sprzætowego (niespecyficzne EOI 
  92.                          dla 8259) }
  93. end;
  94.  
  95. begin
  96. {warto₧ci domy₧lne}
  97. irqnr:=4;
  98. rejestr_bazowy:=$3F8;
  99.  
  100. if ParamCount>0 then
  101.   begin
  102.   ps:=ParamStr(1); {COM1, COM2, COM3 lub COM4}
  103.    case ps[4] of
  104.     '1':begin irqnr:=3; rejestr_bazowy:=MemW[0:$400] end;
  105.     '2':begin irqnr:=4; rejestr_bazowy:=MemW[0:$402] end;
  106.     '3':begin irqnr:=3; rejestr_bazowy:=MemW[0:$404] end;
  107.     '4':begin irqnr:=4; rejestr_bazowy:=MemW[0:$406] end;
  108.    end;
  109.   end;
  110. adres_proc:=@Obsluga_IRQ;
  111. GetIntVec(8+irqnr,stary_adr);
  112. asm
  113. mov ah,34h
  114. int 21h
  115. mov InDosSeg,es
  116. mov InDosOfs,bx
  117. end;
  118. Programowanie_8250;
  119. writeln('Program zostaÆ zainstalowany rezydentnie.');
  120. Keep(0);
  121. end.
  122.