home *** CD-ROM | disk | FTP | other *** search
- { Donated by Warren Smith, Feb 1982 }
-
- Module DC_Hayes_Modem;
-
- { This set of routines was originally written in Pascal MT+ so there may }
- { be some discrepencies you will have to iron out. In particular, there }
- { is use of some built in routines, TSTBIT, CLRBIT, SETBIT. These }
- { routines perform the following functions - }
- { TSTBIT - returns TRUE if the bit is set }
- { CLRBIT - clears the bit number specified }
- { SETBIT - sets the bit number specified }
- { All of these routines operate on variables of type BYTE = 0..255 }
-
- { PortIn and PortOut are used here even though Pascal MT+ doesn't need }
- { them. I hope the syntax is correct for your compiler. }
-
- { Port assignments for D.C. Hayes S-100 Modem board }
- Const
- Reg1Modem = $11;
- Reg2Modem = $12;
- Status_Reg_Modem= $11;
- Modem_Rcv_Reg = $10;
- Modem_Xmit_Reg = $10;
-
-
- Procedure Init_Modem;
-
- Const Char_Length = 3; { 8 data bits }
- Stop_bits = 0; { 1 stop bits }
- Parity_Inhibit = 1; { no parity }
- Parity_Type = 1; { even parity }
-
- begin { Init_Modem }
- { This routine is intended for use as an initializing routine }
- { if your serial port needs it. You should set up your port }
- { to match the comments above. }
- PortOut (Reg1Modem, Parity_Inhibit*16 + Stop_Bits*8 + Char_Length*2 +
- Parity_Type)
- end; { Init_Modem }
-
- Procedure Set_Modem (Modebyte : byte);
-
- begin { Set_Modem }
- { This routine lets you change the various modes of the modem. }
- PortOut (Reg2Modem, Modebyte)
- end; { Set_Modem }
-
- Procedure Go_Onhook (Var Modem_Mode : byte);
-
- begin { Go_Onhook }
- Clrbit (Modem_Mode, 7);
- Set_Modem (Modem_Mode)
- end; { Go_Onhook }
-
- Procedure Go_Offhook (Var Modem_Mode : byte);
-
- begin { Go_Offhook }
- SetBit (Modem_Mode, 7);
- Set_Modem (Modem_Mode)
- end; { Go_Offhook }
-
- Procedure Set_Ans_Mode (Var Modem_Mode : byte);
-
- begin { Set_Ans_Mode }
- Clrbit (Modem_Mode, 2);
- Set_Modem (Modem_Mode)
- end; { Set_Modem_Mode }
-
- Procedure Set_Org_Mode (Var Modem_Mode : byte);
-
- begin { Set_Org_Mode }
- Setbit (Modem_Mode, 2);
- Set_Modem (Modem_Mode)
- end; { Set_Org_Mode }
-
- Procedure Set_110bps (Var Modem_Mode : byte);
-
- begin { Set_110bps }
- Clrbit (Modem_Mode, 0);
- Set_Modem (Modem_Mode)
- end; { Set_110bps }
-
- Procedure Set_300bps (Var Modem_Mode : byte);
-
- begin { Set_300bps }
- Setbit (Modem_Mode, 0);
- Set_Modem (Modem_Mode)
- end; { Set_300bps }
-
- Procedure Enable_Xmit (Var Modem_Mode : byte);
-
- begin { Enable_Xmit }
- Setbit (Modem_Mode, 1);
- Set_Modem (Modem_mode)
- end; { Enable_Xmit }
-
- Procedure Disable_Xmit (Var Modem_Mode : byte);
-
- begin { Disable_Xmit }
- Clrbit (Modem_Mode, 1);
- Set_Modem (Modem_Mode)
- end; { Disable_Xmit }
-
- Function Carrier_Present : boolean;
-
- Var
- Status : byte;
-
- begin { Carrier_Present }
- PortIn (Status_Reg_Modem, Status);
- Carrier_Present := Tstbit (Status, 6)
- end; { Carrier_Present }
-
- Function Ringing : boolean;
-
- Var
- Status : byte;
-
- begin { Ringing }
- PortIn (Status_Reg_Modem, Status);
- Ringing := not Tstbit (Status, 7)
- end; { Ringing }
-
- Function Modem_Char_Rdy : boolean;
-
- Var
- Status : byte;
-
- begin { Modem_Char_Rdy }
- { Returns TRUE if data is available in the input port }
- { (does NOT read the data) }
- PortIn (Status_Reg_Modem, Status);
- Modem_Char_Rdy := Tstbit (Status, 0)
- end; { Modem_Char_Rdy }
-
- Function Modem_In : char;
-
- Var
- In_Char : byte;
-
- begin { Modem_In }
- { Reads the data port of the acoustic coupler. May have to }
- { mask off bit 7 of the data if the sender is not treating it }
- { as part of the data byte sent. }
- PortIn (Modem_Rcv_Reg, In_Char);
- Modem_In := chr(In_Char & $7F)
- end; { Modem_In }
-
- Function Modem_Out (OutChar : char) : boolean;
-
- Var
- Status : byte;
-
- Function Modem_Busy : boolean;
-
- Var
- Status : byte;
-
- begin { Modem_Busy }
- { Returns TRUE if the transmit buffer empty bit of status port }
- { indicates that the UART is still transmitting. }
- PortIn (Status_Reg_Modem, Status);
- Modem_Busy := not Tstbit (Status, 1)
- end; { Modem_Busy }
-
- begin { Modem_Out }
- While Modem_Busy do;
- If Carrier_Present then
- begin
- PortOut (Modem_Xmit_Reg, ord(OutChar));
- Modem_Out := TRUE
- end
- else
- Modem_Out := FALSE
- end; { Modem_Out }
-
- Procedure Delay; { delay's for 10 millisecond }
-
- Const
- Count = 477;
- Var
- I : integer;
- begin { Delay }
- { Very machine dependent. I am using a 5 MHz 8085, running }
- { Pascal MT+ 5.5 if that helps. }
- For I := 1 to Count do
- end; { Delay }
-
- Procedure Dial_a_Number (Var Modem_Mode : byte; Number : string);
-
- Var
- I, J, K, Pulse_Count : integer;
-
- Procedure Pulse_Line;
-
- Var
- I : integer;
- begin { Pulse_Line }
- Go_Onhook (Modem_Mode);
- For I := 1 to 5 do
- Delay; { leave on for 50 ms }
- Go_Offhook (Modem_Mode);
- For I := 1 to 5 do
- Delay { leave off for 50 ms }
- end; { Pulse_Line }
-
- begin { Dial_a_Number }
- Go_Offhook (Modem_Mode);
- For I := 1 to 100 do { Wait for dial tone }
- Delay;
- For I := 1 to Length(Number) do
- If (Number[I] < '0') OR (Number[I] > '9') then
- begin
- Write (Number[I]);
- For J := 1 to 300 do { wait 3 seconds for non_digit }
- Delay
- end
- else
- begin
- Pulse_Count := ord(Number[I]) - $30;
- If Pulse_Count = 0 then
- Pulse_Count := 10;
- Write (Number[I]);
- For J := 1 to Pulse_Count do
- Pulse_Line;
- For J := 1 to 60 do
- Delay { 600 ms delay between digits }
- end;
- Writeln
- end; { Dial_a_Number }
-
- Modend.
-