home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / MBUG / MBUG184.ARC / ROS34BEE.LBR / ROSBEE.IZC / ROSBEE.INC
Text File  |  1979-12-31  |  14KB  |  406 lines

  1. { ROSBEE.INC - Routines for Microbee Australia }
  2. { Includes routines from ROS.MCH ROS.MDM & ROS.CLK }
  3.  
  4. { Microbee Version 2.16r for ROS 3.4 }
  5. {     Use designed for manual BEEMODEM }
  6. { See ROSBEECH.INC for installation instructions }
  7.  
  8. { ROSMCH.INC - Remote Operating System Machine Dependent Routines }
  9.  
  10. {** Remote channel routines **}
  11.  
  12. (* ================================================================= *)
  13. (*  MODEM - Routines and Global variables for Microbee (Australia)   *)
  14. (*             Set up for TURBO based on MXOBEEnn code.              *)
  15. (*   From here to Interrupt Handler is common to Ros and QK-Kermit   *)
  16. (*                  Author - Robert Munro                            *)
  17. (* ================================================================= *)
  18.  
  19. const
  20. (* Modem Registers - Port assignment *)
  21.   ModemData    = $02 ;     (* Port B - Data Port *)
  22.   ModemControl = $03 ;     (* Port B - Control Port *)
  23.  
  24. (* Port B Data Port bit assignments *)
  25.   DTR      = $04 ;         (* RS232 Data Transmit Ready *)
  26.   CTS      = $08 ;         (* RS232 Clear to Send *)
  27.   RSin     = $10 ;         (* RS232 input char bit *)
  28.   RSout    = $20 ;         (* RS232 output char bit *)
  29.  
  30. (* Microbee serial I/O routines - Data areas used in Inline code.*)
  31. (*  Can only use 6 char size names ex .REL file *)
  32.   xflag  : boolean = false ; (* indicates if automatic XOFF sent *)
  33.   sendfl : byte = 0 ;        (* NZ while sending data *)
  34.   ndata  : byte = 8 ;        (* 8 data bits *)
  35.   npdata : byte = 8 ;        (* ndata + parity bit (if req) *)
  36.   stopbi : byte = 1 ;        (* 1 stop bit *)
  37.   bparit : byte = 1 ;        (* 1=none, 2=odd, else even *)
  38.   baud   : byte = $40 ;      (* 300 baud receive *)
  39.   bauds  : byte = $40 ;      (* 300 baud send *)
  40.   rs_rpt : integer = 0 ;     (* read pointer into buffer *)
  41.   rs_wpt : integer = 0 ;     (* write   "     "     "    *)
  42.  
  43.   DefaultBaudRate = 300 ;
  44.   MaxBuffsize = $800 ;    (* Do not alter - This size used in Inline code *)
  45.   CloseSize = $100 ;      (* When buffer has < CloseSize free then Xoff sent *)
  46.  
  47.   Gversion : string[23] = ' Microbee   2.16r      ' ;
  48.   VDate    : string[18] = '25th April 1987   ' ;
  49.  
  50. type
  51.   ParityType = (MarkP, NoneP, OddP, EvenP) ; (* 0 1 2 or 3 put in bparit *)
  52.  
  53. var
  54.   OldVCB : integer ;
  55.   BaudSend,
  56.   BaudReceive : integer ;
  57.   Parity : ParityType ;
  58.  
  59. { rs_buf : array [0..$800] of byte ;  (* data buffer *)
  60.   RWM because of interrupt difficulties with memory bank switching
  61.   rs_buf had to be made a constant to force it into the lower 32k.
  62.   It was thus removed to a separate file rather than clutter up this one.}
  63.  
  64. procedure ch_out(char: byte) ;  { Ros }
  65. { Procedure SendChar(char : byte) ; }  { Kermit }
  66.  
  67. (* -------------------------------------------------------- *)
  68. (*  Send a character thru the modem port.                   *)
  69. (*  It waits for the previous character to be sent before   *)
  70. (*  sending the current character.                          *)
  71. (* -------------------------------------------------------- *)
  72.  
  73. (* Do not put additional code between SendChar (Kermit) or chout (Ros) *)
  74. (* and inthan as there are machine code jumps across the boundaries. *)
  75. (* And remember to delete the last C9 in SendChar (Kermit) or chout (Ros) *)
  76. (* of inline code else there will be incorrect distance between these *)
  77. (* two procedures. *)
  78. Begin (* odata from MXOBEE16 is where SendChar or ch_out begin *)
  79.  
  80.   inline ( $D3/ $09/ $F5/ $C5/ $D9/ $C5/ $E5/ $D9/
  81.            $D5/ $E5/ $21/ ndata/ $46/ $58/ $2E/ $00/
  82.            $0F/ $CB/ $15/ $10/ $FB/ $3A/ bparit/ $3D/
  83.            $28/ $08/ $AD/ $EA/ *+3/ $37/ $ED/ $6A/
  84.            $1C/ $3E/ $0D/ $93/ $47/ $29/ $23/ $10/
  85.            $FC/ $3A/ stopbi/ $83/ $3C/ $5F/ $48/ $3A/
  86.            bauds/ $57/ $47/ $3E/ $04/ $32/ sendfl/ $D3/
  87.            $02/ $C3/ *+65/ $D9/ $3E/ $B7/ $10/ $64/
  88.            $D3/ $03/ $DB/ $02/ $E6/ $10/ $7C/ $20/
  89.            $03/ $CB/ $85/ $B5/ $2A/ rs_rpt/ $ED/ $4B/
  90.            rs_wpt/ $03/ $CB/ $98/ $ED/ $42/ $28/ $4E/
  91.            $ED/ $43/ rs_wpt/ $21/ rs_buf/ $09/ $77/ $3E/
  92.            $EF/ $D3/ $03/ $D9/ $0D/ $CD/ *+179/ $10/
  93.            $4B/ $1D/ $28/ $3B/ $29/ $7C/ $E6/ $20/
  94.            $F6/ $04/ $D3/ $02/ $42/ $79/ $3D/ $CA/
  95.            *-66/ $3C/ $28/ $14/ $D9/ $05/ $20/ $1F/
  96.            $DB/ $02/ $E6/ $10/ $7C/ $20/ $01/ $B5/
  97.            $67/ $CB/ $05/ $41/ $D9/ $0D/ $18/ $D6/
  98.            $3A/ sendfl/ $B7/ $CA/ *+40/ $FB/ $18/ $00/
  99.            $18/ $00/ $18/ $F0/ $7E/ $D9/ $18/ $F6/
  100.            $3E/ $FF/ $18/ $B9/ $E1/ $D1/ $AF/ $32/
  101.            sendfl/ $C3/ *-57/ $B7/ $D8/ $18/ $C1/ $3A/
  102.            sendfl/ $B7/ $20/ $F6/ $04/ $B1/ $20/ $08/
  103.            $D9/ $E1/ $C1/ $D9/ $C1/ $F1/ $FB/ $C9/
  104.            $C3/ *-81)
  105. end;
  106.  
  107. procedure inthan;
  108. begin
  109.   inline ( $F5/ $D3/ $09/ $DB/ $02/ $E6/ $10/ $20/
  110.            $04/ $F1/ $FB/ $ED/ $4D/ $3A/ sendfl/ $B7/
  111.            $28/ $1B/ $3A/ npdata/ $4F/ $D9/ $21/ $01/
  112.            $00/ $3A/ baud/ $4F/ $1F/ $81/ $47/ $28/
  113.            $03/ $D9/ $F1/ $C9/ $06/ $80/ $68/ $D9/
  114.            $0C/ $F1/ $C9/ $C5/ $47/ $3A/ npdata/ $4F/
  115.            $D9/ $C5/ $E5/ $21/ $01/ $00/ $3A/ baud/
  116.            $4F/ $1F/ $81/ $47/ $D9/ $C2/ *-152/ $D9/
  117.            $06/ $80/ $68/ $D9/ $0C/ $C3/ *-161/ $ED/
  118.            $4D)
  119. end;
  120.  
  121. procedure setvcb;
  122. begin
  123.   inline ( $21/ rs_buf/ $24/ $24/ $2E/ $00/ $4C/ $54/
  124.            $5D/ $1B/ $06/ $80/ $3E/ $C9/ $12/ $73/
  125.            $23/ $72/ $23/ $1B/ $3E/ $3C/ $10/ $F6/
  126.            $3E/ $03/ $D3/ $01/ $59/ $DB/ $02/ $E6/
  127.            $BF/ $D3/ $02/ $21/ *+56/ $01/ $03/ $04/
  128.            $F3/ $ED/ $B3/ $ED/ $5E/ $F6/ $40/ $D3/
  129.            $02/ $ED/ $57/ $57/ $7B/ $ED/ $47/ $AF/
  130.            $CD/ *+32/ $FB/ $76/ $F3/ $87/ $5F/ $7A/
  131.            $ED/ $47/ $ED/ $A3/ $ED/ $A3/ $3E/ $83/
  132.            $D3/ $01/ $ED/ $4B/ oldvcb/ $EB/ $5E/ $71/
  133.            $23/ $56/ $70/ $ED/ $53/ oldvcb/ $ED/ $4D/
  134.            $FF/ $9B/ $B7/ $BF/ $B7/ $EF)
  135. end;
  136.  
  137. (* ------------------------------------------------------------------ *)
  138. (* IntHandler - Interrupt Handler.     (ABOVE HERE)                   *)
  139. (* SetVCB - Determines loc of interrupt vector, saves and resets it   *)
  140. (*          Uses OldVCB for new vector and saves the old one there.   *)
  141. (* ------------------------------------------------------------------ *)
  142.  
  143. (* ------------------------------------------------------------------ *)
  144. (* rec_reti - to enable or re-enable interrupts.                      *)
  145. (* ------------------------------------------------------------------ *)
  146. Procedure rec_reti;
  147.  
  148. begin
  149.   port[ModemControl] := $B7; (* Set port to allow interrupts *)
  150.   port[ModemControl] := $EF;
  151.   Inline($FB/                (* ei  enable interrupt *)
  152.          $ED/$4D) ;          (* reti *)
  153. end;
  154.  
  155. (* ------------------------------------------------------------------ *)
  156. (*              End of Modem I/O code                                 *)
  157. (* ------------------------------------------------------------------ *)
  158.  
  159. procedure ch_set ;
  160. { Set the bps rate, baud, parity & no. of stop bits }
  161.  
  162.   function BaudTranslate(var BaudTemp : integer ) : byte;
  163.   { Get the baud rate factor }
  164.   Begin
  165.     Case BaudTemp of
  166.       75    : BaudTranslate := 0;
  167.       300   : BaudTranslate := 64;
  168.       600   : BaudTranslate := 32;
  169.       1200  : BaudTranslate := 16;
  170.       2400  : BaudTranslate := 8;
  171.       4800  : BaudTranslate := 4;
  172.       9600  : BaudTranslate := 2;
  173.       19200 : BaudTranslate := 1;
  174.     End
  175.   End ;
  176.  
  177. Begin { ch_set }
  178. {writeln('ch_set');}
  179.   BaudReceive := rate;
  180.   case rate of
  181.      75: begin  (* 75/1200 Baud - They Send/We Send *)
  182.            baud := BaudTranslate(rate); 
  183.            rate := 1200;
  184.            bauds := BaudTranslate(rate);
  185.          end;
  186.      80: begin  (* 1200/75 Baud *)
  187.            rate := 1200;
  188.            baud := BaudTranslate(rate);
  189.            rate := 75;
  190.            bauds := BaudTranslate(rate);
  191.            end;
  192.    else  begin
  193.            baud := BaudTranslate(rate);
  194.            bauds := baud;
  195.          end;
  196.   end;
  197.   bparit := Ord(Parity);
  198.   npdata := ndata;                         { No of data + parity bits }
  199.   if bparit > 1 then npdata := ndata + 1;  {  +1 if parity is odd/even }
  200. end ; { ch_set }
  201.  
  202. procedure ch_init;
  203. { Initialize the remote channel }
  204. begin
  205. {writeln('ch_init');}
  206. end;
  207.  
  208. procedure ch_on;
  209. { Turn on remote channel (usually by enabling DTR) }
  210. begin
  211. {writeln('ch_on');}
  212.   rec_reti;        { enable interrupts }
  213.   port[ModemData] := DTR + RSout;
  214. end;
  215.  
  216. procedure ch_off;
  217. { Turn off remote channel (usually by disabling DTR) }
  218. begin
  219. {writeln('ch_off');}
  220.   port[ModemControl] := $87 ; (* Do NOT allow interrupts *)
  221. end;
  222.  
  223. function ch_carck: boolean;
  224. { Check to see if carrier is present }
  225. begin
  226.   ch_carck := true;
  227. end;
  228.  
  229. function ch_inprdy: boolean;
  230. { Check for ready to input from port }
  231. const
  232.   Xon  = $11;
  233.   Xoff = $13 ;
  234. var
  235.   temp : integer ;
  236. begin
  237.   if rs_rpt = rs_wpt then ch_inprdy := false
  238.   else ch_inprdy := true;
  239.  
  240. { test for buffer almost full and send Xon }
  241. { when empty send Xoff }
  242.   temp := rs_wpt - rs_rpt;
  243.   if xflag then
  244.     begin
  245.     if temp = 0 then
  246.       begin  (* Buffer now empty send Xon *)
  247.       rec_reti;
  248.       ch_out(Xon);
  249.       xflag := false;
  250.       end
  251.     end
  252.     else
  253.     begin
  254.       if (temp < - CloseSize) then
  255.       else
  256.       if (temp < 0) or (temp > MaxBuffsize - CloseSize) then
  257.         begin (* Buffer close to full send Xoff *)
  258.         ch_out(Xoff);
  259.         xflag := true;
  260.         end;
  261.     end;
  262. end;
  263.  
  264. function ch_inp: byte;
  265. { Input a byte from port - no wait - assumed ready }
  266. begin
  267.   rs_rpt := rs_rpt + 1 ;
  268.   if rs_rpt = MaxBuffsize then rs_rpt := 0 ;
  269.   ch_inp := rs_buf[rs_rpt] ;
  270. end; { ch_inp }
  271.  
  272.  
  273. { ROS.MDM - Remote Operating System Modem Dependent Routines }
  274.  
  275. procedure mdinit;
  276. { Initialize modem }
  277. begin
  278. {writeln('mdinit');}
  279.   { ch_init; does nothing}
  280.   rate := DefaultBaudRate;
  281.   ch_set;
  282.   { ch_on;  for auto answer code }
  283.   ch_off; { until manual answer and rate is set }
  284. end;
  285.  
  286. function mdring: boolean;
  287. { Determine if the phone is ringing }
  288. begin
  289. {writeln('mdring');}
  290.   if delay_down then mdring := false
  291.   else mdring := true
  292. end;
  293.  
  294. procedure mdans;
  295. { Detect and set system to rate at which modem answered phone }
  296. begin
  297. {writeln('mdans');}
  298.   write('Baud Rate of user 75 <CR> or 300 <Sp>');
  299.   ch := ' ';
  300.   readln(ch);
  301.   if ch = ' ' then rate := 300 else rate := 75 ;
  302.   ch_set;
  303.   ch_on;
  304. end;
  305.  
  306. procedure mdhangup;
  307. { Hangup modem }
  308. begin
  309. {writeln('mdhangup');}
  310.   rate := DefaultBaudRate;
  311.   ch_set;
  312.   ch_off;
  313.   mdring := false
  314. end;
  315.  
  316. procedure mdbusy;
  317. { Take modem off hook to present a busy signal to incoming callers }
  318. begin
  319. {writeln('mdbusy');}
  320.   mdhangup
  321. end;
  322.  
  323. {** System routines **}
  324. var
  325.   StatusLine : string[80] absolute $F780 ; { Line 25 }
  326.  
  327. procedure system_init;
  328. { Initialization to be done once when ROS first starts }
  329. const
  330.   Scr80by25by11 : array[0..15] of byte =    { 11 scan lines per char }
  331.               ($6B,$50,$57,$37,$1B,$05,$19,$1B,$48,$0A,$2A,$0B,$20,0,0,0);
  332. var
  333.   i : byte ;
  334. begin
  335. {writeln('system_init');}
  336.   global_date[0] := 0;
  337.   global_date[1] := 0;
  338.   global_date[2] := 0;
  339.   global_date[3] := 25;
  340.   global_date[4] := 04;
  341.   global_date[5] := 88;
  342.  
  343. { Initialize fields for i/o through modem. Most are set up as constants above }
  344.   OldVCB := addr(IntHan) ;   { Where pio interrupts go to }
  345.   SetVCB ;                   { Save & set interrupt vector & set modem port }
  346.   ch_off ;                   { don't want interrupts until ready to ans call }
  347.   BaudSend := DefaultBaudRate ;
  348.   BaudReceive := DefaultBaudRate ;
  349.   FillChar(StatusLine,80,' ') ;   { Space out line 25 }
  350.   for i := 0 to 15 do        { Set 25 line screen. Line 25 is status line }
  351.     begin
  352.     port[$0C] := i ;
  353.     port[$0D] := Scr80by25by11[i] ;
  354.     end ;
  355. end ;
  356.  
  357. procedure system_de_init;
  358. { De-initialization to be done once when ROS terminates }
  359. const
  360.   Scr80by24     : array[0..15] of byte =    { 11 scan lines per char }
  361.               ($6B,$50,$57,$37,$1B,$05,$18,$1A,$48,$0A,$2A,$0A,$20,0,0,0);
  362. var
  363.   i : byte ;
  364. begin
  365. {writeln('system_de_init');}
  366.   Port[ModemData] := RSout ;  { Disable modem }
  367.   SetVCB ;                    { Restore interrupt vector from OldVCB }
  368.   ch_off ;
  369.   for i := 0 to 15 do         { Reset 24 line screen }
  370.     begin
  371.     port[$0C] := i ;
  372.     port[$0D] := Scr80by24[i] ;
  373.     end ;
  374. end ;
  375.  
  376. procedure putstat(st: StrStd);
  377. { Display 'st' on status line }
  378. begin
  379.   fillchar(StatusLine,80,' ') ;   { Space out line 25 }
  380.   move(st[1],StatusLine,length(st)) ;
  381. end;
  382.  
  383. (* ------------------------------------------------------------------ *)
  384. (*    End of MODEM routines for Microbee computers                    *)
  385. (* ------------------------------------------------------------------ *)
  386.  
  387. { ROS.CLK - Clock Routines }
  388. { If your machine does not have a real time clock (RTC), you can still
  389.   install ROS by using the following procedures for time keeping.  The
  390.   time and date are maintained in 'global_date' defined in ROSDEF.INC
  391.   While the time may be set to any value, I recommend 00:00:00.
  392.   }
  393.  
  394. procedure GetTAD(var t: tad_array);
  395. { Return a 6 element integer array of the current system time in
  396.   seconds, minutes, hours, day, month, and year. }
  397. begin
  398.   move(global_date, t, 6)
  399. end;
  400.  
  401. procedure SetTAD(var t: tad_array);
  402. { Set the system time using a 6 element integer array which contains
  403.   seconds, minutes, hours, day, month, and year. }
  404. begin
  405.   move(t, global_date, 6)
  406. end;