home *** CD-ROM | disk | FTP | other *** search
- Turbo Pascal ANSI Drivers
- Version 1.12
- Copyright (c) 1990 by Not So Serious Software
-
- Original concept by Ian Silver
- Design and implementation by Kevin Dean
-
- Turbo Pascal is a registered trademark of Borland International Inc.
- Coke is a registered trademark of Coca-Cola Ltd.
-
-
-
-
- Introduction
- "What you're getting."
-
- ------------------------------------------------------------------------------
- December 1989 (exam time)
-
- Ian : "Kev, is there any way to get the Turbo Pascal CRT unit to go to the
- modem?"
-
- Kevin: "No. The CRT unit goes straight to the video hardware. What
- are you trying to do?"
-
- Ian : "I'm writing a game as a door for a BBS and I need video control. What
- I really need is a good driver that will talk nicely to a COM port - unlike
- DOS."
-
- Kevin: "I wish you wouldn't keep doing this to me, Silver. You always come up
- with interesting ideas for me to implement when I don't have the time."
-
- Ian : "Anyhow, we do need this, here ... have a Coke." (Gratuitous bribery)
-
- Kevin: "Silver, you don't _need_ it; you want it for writing a game ... ok,
- maybe you _do_ need it."
-
- - And thus a project was born.
- ------------------------------------------------------------------------------
-
- The routines in this package are intended to replace the Turbo Pascal
- CRT unit (Turbo Pascal Version 5.0 or greater). The procedures and functions
- provided in the ANSI unit mirror many of the CRT unit functions but, instead
- of going directly to the screen or through the BIOS, these functions go
- through a user-defined text file device driver. For more information on text
- file device drivers, please read Chapter 15, "Inside Turbo Pascal", of the
- Turbo Pascal reference manual. No knowledge of text file device drivers is
- needed to use the three ANSI interface units (ANSICON, ANSICOM, and CONCOMIO)
- provided.
-
- The ANSICON unit provides an ANSI interface to the MS-DOS console and
- the MS-DOS device driver ANSI.SYS. One application of this unit is in Turbo
- Pascal programs that would be portable to generic MS-DOS environments, (e.g.
- environments that would be incompatible with the CRT unit) while still
- maintaining full control of the cursor and the video attributes.
-
- The ANSICOM unit provides an ANSI interface to a modem or serial
- device. One application (already in use as a door on a bulletin board system)
- is in text video games that would be played by remote over a phone line.
-
- The CONCOMIO unit incorporates both the ANSICON and ANSICOM units and
- gets input from the console, serial port, or both and sends output to the
- console, serial port, or both. It does this by chaining to the required input
- and output functions in the other units.
-
- Keep in mind that these drivers are mutually exclusive; you cannot use
- more than one in any one program since each takes over the standard input and
- output files and only one unit can have control of those files. Only the last
- of these units in your "uses" clause will actually have control.
-
-
-
-
- Warranty
- "Legalese - better safe than sorry."
-
- Kevin Dean (hereafter referred to as "the author") makes no warranty
- of any kind, expressed or implied, including, without limitation, any
- warranties of merchantability and/or fitness for a particular purpose. The
- author shall not be liable for any damages, whether direct, indirect, special,
- or consequential arising from a failure of this program to operate in the
- manner desired by the user. The author shall not be liable for any damage to
- data or property which may be caused directly or indirectly by use of the
- program.
-
- In no event will the author be liable to the user for any damages,
- including any lost profits, lost savings, or other incidental or consequential
- damages arising out of the use or inability to use the program, or for any
- claim by any other party.
-
-
-
-
- Registration
- "Capitalism at its finest."
-
- A lot of late nights and Cokes went into the creation of these
- routines. If you're going to use them regularly and would like to show your
- appreciation (or at least help me in the upkeep of my caffeine and sugar
- habit), please send a donation ($20 suggested) to:
-
- Kevin Dean
- Fairview Mall P.O. Box 55074
- 1800 Sheppard Avenue East
- Willowdale, Ontario
- CANADA M2J 5B9
- CompuServe ID: 76336,3114
-
- These drivers may come to you as part of the DoorLib package; if you register
- DoorLib with its author, you will automatically be registered for these
- drivers as well and no further payment will be required.
-
-
-
-
- Program Development
- "How to write your very own ANSI programs."
-
- Development of programs using these units may be done with the units
- themselves or with the CRT unit. You may use any of the standard CRT
- constants, procedures, functions, or variables with the following exceptions:
-
- Constants Procedures Functions Variables
- --------- ---------- --------- -----------
- BW40 DelLine all CRT CheckSnow
- BW80 InsLine functions DirectVideo
- Mono Sound are LastMode
- CO40 NoSound available WindMin
- CO80 TextMode WindMax
- Font8x8 Window
- C40
- C80
-
- If you develop your program using the CRT unit, just replace the "uses
- CRT;" clause at the top of all your source files with either "uses ANSI,
- ANSICON;", "uses ANSI, ANSICOM;", or "uses ANSI, CONCOMIO;" depending on
- whether you want your output to go through the standard DOS ANSI device
- driver, through a serial port to a remote terminal, or both.
-
-
-
-
- The ANSI I/O Driver
- "The heart of the system."
-
- ------------------------------------------------------------------------------
- December 1989 (Christmas time, time for rest and relaxation)
-
- Ian : "Ok, I've got the game finished, well... at least I think it's
- finished. How's that ANSI driver coming along?"
- ------------------------------------------------------------------------------
-
- The ANSI I/O driver is a generic ANSI driver designed to interface to
- any text file device driver. For more information on text file device
- drivers, please read Chapter 15, "Inside Turbo Pascal", of the Turbo Pascal
- reference manual.
-
- The best tutorial you can get in writing your own ANSI unit interface
- is by looking at the code for the three drivers included with this package.
- The structure of the code is the same in all cases, but for simplicity the
- best one to look at is ANSICON.PAS.
-
-
- The ANSI unit defines the following types:
-
- type
- IOFunc = function(var F : Text) : integer;
-
- This is a function declaration of the text file device
- driver interface to the Open, InOut, Flush, and Close
- functions in Turbo Pascal.
-
-
- type
- IOFunctions =
- record
- NextOpen, NextInOut, NextFlush, NextClose : pointer
- end;
-
- This is a record of the linked I/O functions that are
- called by the ANSI text file device drivers. These functions
- actually handle the input from and output to the system. The
- I/O functions in ANSI.PAS simply do the necessary character
- interpretation necessary, e.g. update the cursor position
- variables or change the screen color.
-
- When a call is made to the AssignANSI procedure
- (below), this record is passed as a parameter. This record is
- stored in the UserData field of the file variable, and you
- should not modify that field unless the modification merely
- changes one of the pointers.
-
- The field NextOpen should point to the Open function
- written for your text file device. It is not necessary to
- have an Open function defined for your device driver; if none
- exists (NextOpen = nil) it will be ignored and the open
- request (through a Reset or Rewrite) will proceed normally.
-
- The field NextInOut should point to the InOut function
- written for your text file device. If you do not assign a
- value to the InOut function when you call AssignANSI,
- (NextInOut = nil), you must be sure to assign a value to it
- when the file is opened, i.e. when your Open function is
- called. The Open function for ANSICON.PAS looks like this:
-
- function ConsoleOpen(var F : Text) : integer;
-
- begin
- with TextRec(F) do
- if Mode = fmInput then
- IOFunctions(UserData).NextInOut := @ConsoleIn
- else
- IOFunctions(UserData).NextInOut := @ConsoleOut;
-
- ConsoleOpen := 0
- end;
-
- Here the NextInOut pointer is assigned to a procedure to
- handle either input or output depending on the mode in which
- the file is opened. If no InOut function is defined, then any
- calls to Read or ReadLn will return an I/O result of 161
- (device read fault) and any calls to Write or WriteLn will
- return an I/O result of 160 (device write fault).
-
- The NextFlush function flushes the input or output
- buffer if necessary. It is called at the end of every read or
- write and so you are strongly advised to define it; if you do
- not, you will have to wait until the output buffer (128
- characters) is full before it is written to the screen. At
- the very least it should chain to the output function defined
- for the current file. The following is the Flush function
- from ANSICON.PAS:
-
- function ConsoleFlush(var F : Text) : integer;
-
- begin
- with TextRec(F) do
- if Mode = fmInput then
- { Ignore flush request }
- ConsoleFlush := 0
- else
- { Chain to F's default output routine }
- ConsoleFlush := IOFunc(InOutFunc)(F)
- end;
-
- I advise against calling your own output function directly
- from the flush function because by doing so you may bypass the
- ANSI output function. This will prevent the internal cursor
- position from being updated and may affect your colors as
- well.
-
- The NextClose function is called when a text file is
- closed. It is not necessary to define this function unless
- you have to do some cleanup before closing the file.
-
- Please remember that these functions in the I/O chain
- are treated just like any other text file device driver; if
- the return code is non-zero, then Turbo Pascal will signal an
- I/O error which you must check to ensure success.
-
-
- The ANSI unit defines the following character constants:
-
- const
- NUL = #0; { The NUL character }
- BRK = #3; { Ctrl-C }
- BEL = #7; { Bell }
- BS = #8; { BackSpace }
- TAB = #9; { Tab }
- LF = #10; { Line feed }
- FF = #12; { Form feed }
- CR = #13; { Carriage return }
- EOF_ = #26; { End-of-file marker }
- ESC = #27; { Escape }
-
-
- ------------------------------------------------------------------------------
- January 1990
-
- Ian : "Kev, the colors are all messed up. I do wish you'd get a color
- monitor."
- Kevin: "Ok, I'll look into it."
- Ian : "I looked at your code, the bug is right in this routine."
- Kevin: "No, there's no problem there. I'm checking something else here ..."
- Ian : "I tell you, the bug is right here!"
- Kevin: "No, that's not it. Give me a few minutes ..."
- Ian : "If you say so."
-
- (half an hour later)
-
- Kevin: "You're right. That code you were looking at _was_ the problem."
- Ian : <grin>
- ------------------------------------------------------------------------------
-
- The ANSI unit defines the following video constants:
-
- const
- Black = 0;
- Blue = 1;
- Green = 2;
- Cyan = 3;
- Red = 4;
- Magenta = 5;
- Brown = 6;
- LightGray = 7;
- DarkGray = 8;
- LightBlue = 9;
- LightGreen = 10;
- LightCyan = 11;
- LightRed = 12;
- LightMagenta = 13;
- Yellow = 14;
- White = 15;
- Blink = 128;
-
-
- The ANSI unit defines the following constants:
-
- const
- On = true;
- Off = false;
-
- These are passed to the ANSIStatus procedure to turn
- the ANSI control sequences on or off (default is On).
-
-
- The ANSI unit defines the following variables:
-
- var
- WrapAround : boolean;
-
- True if the cursor wraps around from one line to the
- next when it reaches the end of a line. Default value is
- true.
-
-
- var
- MaxX, MaxY : byte;
-
- These hold the screen dimensions. MaxX is the maximum
- number of columns (default 80) and MaxY is the maximum number
- of rows (default 25). Values of 0 mean no maximum. These
- variables are used in part to determine the current cursor
- position.
-
-
- var
- TabLength : byte;
-
- This is the distance between tab stops. Default value
- is 8.
-
-
- var
- TextAttr : byte;
-
- This defines the current screen color. It is
- compatible with the TextAttr variable in the CRT unit.
- Default value is LightGray.
-
-
- var
- ANSIFile : Text;
-
- This is the file to which all ANSI control sequences
- are written. It must be explicitly assigned to a device or
- file and opened before your program is run. Once you have
- assigned and opened this file it is advised that you make an
- explicit call to either GotoXY or ClrScr to fix the cursor in
- a known position. The internal mechanisms have no way of
- knowing what the initial position is.
-
-
- var
- CheckEOF : boolean;
-
- This variable is used by text file device drivers
- linked to the ANSI output routines. If true, the driver
- should check for the end-of-file marker (Ctrl-Z) when reading
- from its device and signal end of file if found. Default
- value is false.
-
-
- var
- CheckBreak : boolean;
-
- This variable is used by text file device drivers
- linked to the ANSI output routines. If true, the driver
- should check for Ctrl-Break or Ctrl-C when reading from its
- device and signal a break if found. Default value is true.
-
-
- The ANSI unit defines the following procedures and functions:
-
- function Redirected : boolean;
-
- This function returns true if either the standard
- input or standard output has been redirected. This may be
- useful in conjunction with the ANSICON or CONCOMIO units if
- you want to guarantee that input will come from the keyboard
- and output will go to the screen.
-
-
- procedure ANSIStatus(Status : boolean);
-
- Status is either On or Off (defined above). If On,
- ANSI control sequences are used as normal. If Off, all ANSI
- control sequences are ignored; the output is in teletype mode.
- Default mode is On.
-
-
- procedure AssignANSI(var F : Text; IOChain : IOFunctions);
-
- This assigns the file F to the ANSI text file device.
- The parameter IOChain must contain a record of valid I/O chain
- functions as described above.
-
-
- procedure ClrEol;
-
- Sends the ANSI control sequence to clear to the end of
- the current line.
-
-
- procedure ClrScr;
-
- Sends the ANSI control sequence to clear the screen.
-
-
- procedure Delay(MS : word);
-
- Delays program execution for MS milliseconds.
-
-
- procedure GotoXY(X, Y : byte);
-
- Sends the ANSI control sequence to position the cursor
- at (X, Y). If X is not in the range 1 .. MaxX or Y is not in
- the range 1 .. MaxY then this request is ignored. If MaxX and
- MaxY are both 0, no check is made and the procedure positions
- the cursor blindly.
-
-
- function WhereX : byte;
-
- Returns the current X position of the cursor. Since
- the internal mechanisms have no way of knowing what the
- initial cursor position is, this function is unreliable unless
- you make an explicit call to either GotoXY or ClrScr to fix the
- cursor in a known position.
-
-
- function WhereY : byte;
-
- Returns the current Y position of the cursor. Since
- the internal mechanisms have no way of knowing what the
- initial cursor position is, this function is unreliable unless
- you make an explicit call to either GotoXY or ClrScr to fix the
- cursor in a known position.
-
-
- procedure HighVideo;
-
- Turns on high video by setting the high video bit of
- TextAttr.
-
-
- procedure LowVideo;
-
- Turns on low video by resetting the high video bit of
- TextAttr.
-
-
- procedure NormVideo;
-
- Resets TextAttr to the original color at startup
- (LightGray).
-
-
- procedure TextBackground(Color : byte);
-
- Changes the text background to Color.
-
-
- procedure TextColor(Color : byte);
-
- Changes the text foreground to Color; the text
- background is not affected.
-
-
- Where any of the above constants, variables, procedures, or functions
- have the same name as in the CRT unit, the functionality is the same.
-
- This is a bare minimum replacement for the CRT unit. Certain
- variables, procedures, and functions cannot be handled by the ANSI unit
- because they are too tightly bound to the particular device. Two such
- functions, for example, are KeyPressed and ReadKey; these cannot be unbound
- from the device and so the ANSI unit does not implement them. It is up to you
- to create these missing variables, procedures, and functions if you need them.
- The ANSICON, ANSICOM, and CONCOMIO units provided implement some of these
- missing functions. They are described in the following sections.
-
-
-
-
- The ANSICON Console Driver
- "How to make your keyboard and screen look like any other terminal."
-
- The ANSICON console driver takes all input from the standard input
- device (the console) and sends all output to the standard output device (the
- console) via the ANSI.SYS device driver. To uses this unit, make sure you
- have the statement "DEVICE=ANSI.SYS" in your CONFIG.SYS file; for more
- information on the CONFIG.SYS file, please see your DOS manual.
-
- This unit can be used with the ANSI unit as a replacement for the
- Turbo Pascal CRT unit. Programs developed using these units may be ported to
- generic MS-DOS environments where the CRT unit may not be compatible.
-
- When you include the ANSICON unit in your program, it automatically
- assigns the standard input and output files and the ANSI file to the ANSICON
- I/O functions.
-
-
- The ANSICON unit defines the following procedures and functions:
-
- procedure AssignCON(var F : Text);
-
- This assigns the file F to the console by defining its
- I/O chain functions and then assigning the file to the ANSI
- device above.
-
-
- function KeyPressed : boolean;
-
- Returns true if a key is waiting in the keyboard
- buffer.
-
-
- function ReadKey : char;
-
- Reads the next key from the keyboard buffer.
-
-
- Where any of the above constants, variables, procedures, or functions
- have the same name as in the CRT unit, the functionality is the same.
-
-
-
-
- The ANSICOM Communications Driver
- "How to make any other terminal look like your keyboard and screen."
-
- ------------------------------------------------------------------------------
- January 1990 (back to university, second term)
-
- Ian : "Four assignments eh? That's a tough break ... so how's that code
- coming along?"
- Kevin: "SILVER!!!"
- ------------------------------------------------------------------------------
-
- The ANSICOM communications driver takes all input from and sends all
- output to a single modem or serial device. The driver is interrupt-driven,
- which means that data can be received and transmitted while the computer is
- engaged doing something else. The advantage of this unit is that it treats
- your modem almost exactly the same way as the Turbo Pascal CRT unit treats
- your keyboard and screen.
-
- When developing programs that will use the ANSICOM unit, it is best to
- design them using either the Turbo Pascal CRT unit or the ANSICON unit
- provided with this package. In this way, you can fully design, test, and
- debug your program on your own machine before committing it to the serial
- port.
-
- When you include the ANSICOM unit in your program, it automatically
- assigns the standard input and output files and the ANSI file to the ANSICOM
- I/O functions.
-
-
- ------------------------------------------------------------------------------
- Kevin: "I finally figured out why the error handler was not working properly.
- Not only had I failed to declare it as a far procedure, but it was going
- through infinite recursion: the halt procedure in the error handler called the
- flush procedure to flush the output file, which in turn called the error
- handler (because the error had not been cleared), which in turn called halt
- ... system go whiirrrrrrrrrrrrr ..."
- Ian : "Oh lovely. We should work for the government ... perpetual job
- creation."
- ------------------------------------------------------------------------------
-
- The ANSICOM unit defines the following types:
-
- type
- ErrorProc = procedure(var Error : word);
-
- This is the communications error handling procedure.
- Your error handling procedure must be of the above type and
- must be declared as a far procedure (use the {$F+} compiler
- directive). The parameter error will have one or more of the
- following flags set: ReceiveOverrun, TransmitOverrun,
- ParityError, FramingError, BreakDetect, CommTimeOut,
- NoCarrier, or CtrlBreak. These are described below. If your
- error procedure is to return control to the communications
- routines, you may want to clear some or all of the error
- flags so that you don't have to handle that error the next
- time the procedure is called. To clear all error flags set
- Error equal to NoCommError (0).
-
- To test for a communications error, mask the Error
- parameter with one or more of the above flags. For example,
-
- { Halt if lost carrier }
- if Error and NoCarrier <> 0 then
- begin
- ReleaseCOM;
- halt(1)
- end;
-
- { Ignore parity and framing errors }
- if Error and (ParityError or FramingError) <> 0 then
- Error := Error and not (ParityError or FramingError);
-
- If you want to send an error message to the console
- (not the serial port), you will have to open the console as a
- file since the ANSICOM driver redirects the standard output
- file to the modem. Thus:
-
- Assign(ConF, 'CON');
- Rewrite(ConF);
-
- if Error and NoCarrier <> 0 then
- begin
- WriteLn(ConF, 'Error : No carrier');
- ReleaseCOM;
- halt(1)
- end;
-
-
- The ANSICOM unit defines the following constants:
-
- const
- Init = true;
- NoInit = false;
-
- These constants are used when installing the
- communications routines. If the modem is to be initialized,
- i.e. its baud rate and data format has yet to be set up, then
- use Init in the call to InitCOM. If the modem is already
- initialized or on-line, use NoInit in the call to InitCOM to
- prevent the modem from losing the connection.
-
-
- const
- SyncTransmit = true;
- AsyncTransmit = false;
-
- These constants are used when installing the
- communications routines. Synchronous transmission means that
- the program output (through Write or WriteLn) waits until all
- characters have been transmitted before returning control to
- the program. This approach is advised when writing
- interactive programs such as video games; use the SyncTransmit
- constant when initializing the modem. If you don't want to
- wait for the output to be transmitted, use AsyncTransmit and
- control will be returned to your program while the ANSICOM
- unit takes care of the transmission in the background.
-
-
- const
- NoCommError = $0000;
-
- No communications error.
-
-
- const
- ReceiveOverrun = $0001;
-
- Either a character arrived over the modem before the
- ANSICOM unit had a chance to remove the previous character or
- the receive buffer is full (your program is not reading the
- data as it comes across the line).
-
-
- const
- TransmitOverrun = $0002;
-
- The transmission buffer is full. This error occurs
- only in asynchronous transmission when you write more to the
- modem than it can handle in that length of time.
-
-
- const
- ParityError = $0004;
- FramingError = $0008;
-
- Data arriving over the modem has somehow been
- corrupted. The character or characters affected were lost in
- transmission.
-
-
- const
- BreakDetect = $0010;
-
- The remote modem is requesting that you break the
- connection. Suggested action is to disconnect the modem with
- a call to the Disconnect procedure.
-
-
- const
- CommTimeOut = $0020;
-
- The modem timed-out (the remote modem has probably
- gone off-line).
-
-
- const
- NoCarrier = $0040;
-
- The modem has lost the carrier signal.
-
-
- const
- CtrlBreak = $0080;
-
- A Ctrl-C character has been received and CheckBreak
- (above) is true.
-
-
- const
- NotOnline = $0100;
-
- You are trying to read from the communications port
- without having initialized the communications routines.
-
-
- The ANSICOM unit defines the following functions and procedures:
-
- function InitCOM(COMPort : byte; Baud : integer; Bits : byte;
- Parity : char; Stop : byte; Init : boolean; Sync : boolean;
- Error : pointer) : integer;
-
- This initializes the modem, installs the
- communications interrupt, sets the desired transmission
- synchronization, and installs a user-defined error handler.
-
- The parameters are:
-
- COMPort - Port number from 1 to 4
- Baud - Desired baud rate
- Bits - Number of data bits (5 to 8)
- Parity - Parity type ('E'ven, 'O'dd, 'M'ark,
- 'S'pace, or 'N'one)
- Stop - Number of stop bits (1 or 2; to get
- 1.5 stop bits for 5 data bits, use
- 2 stop bits)
- Init - Use the constants Init to initialize
- the modem with the given data format
- or NoInit if the modem has already
- been initialized.
- Sync - Use the constants SyncTransmit for
- synchronous transmission or
- AsyncTransmit for asynchronous
- transmission (described above)
- Error - Pointer to a user-defined error
- handler of the type ErrorProc
- (defined above) or nil if no error
- handler is desired
-
- This function returns 0 if successful or 1 if not
- (invalid COM port number or data format).
-
-
- function SetBaud(Baud : integer; Bits : byte; Parity : char;
- Stop : byte) : integer;
-
- This function is useful if you want to change the data
- format on the fly, for example if the modem, previously
- initialized at 2400 baud, connects at 1200. To use this
- function, you must first have initialized it using the InitCOM
- function.
-
- The parameters are:
-
- Baud - Desired baud rate
- Bits - Number of data bits (5 to 8)
- Parity - Parity type ('E'ven, 'O'dd, 'M'ark,
- 'S'pace, or 'N'one)
- Stop - Number of stop bits (1 or 2; to get
- 1.5 stop bits for 5 data bits, use
- 2 stop bits)
-
- This function returns 0 if successful or 1 if not
- (modem not previously initialized or invalid data format).
-
-
- procedure Disconnect;
-
- Disconnects the modem by turning off the carrier.
-
-
- procedure ReleaseCOM;
-
- Releases the modem by resetting the modem state to its
- initial configuration. If the modem was initialized (by
- specifying Init in InitCOM) then it is disconnected.
-
-
- procedure AssignCOM(var F : Text);
-
- This assigns the file F to the modem by defining its
- I/O chain functions and then assigning the file to the ANSI
- device above.
-
-
- function KeyPressed : boolean;
-
- Returns true if a key is waiting in the modem input
- buffer.
-
-
- function ReadKey : char;
-
- Reads the next key from the modem input buffer.
-
-
- Where any of the above constants, variables, procedures, or functions
- have the same name as in the CRT unit, the functionality is the same.
-
-
-
-
- The CONCOMIO Console and Communications Driver
- "How to make your keyboard and screen look like any
- other terminal and vice versa."
-
- ------------------------------------------------------------------------------
- February 1990
-
- Kevin: "There. Done. Documented. It's all yours."
- Ian : "Great! Now, is there any way to get the output to go to both the
- console and the modem and to get input from both as well?"
- Kevin: "(sigh) Alright ... give me another hour ... (grumble, grumble)"
- ------------------------------------------------------------------------------
-
- The CONCOMIO driver takes its input from the console, the
- communications port, or both, depending on how CONCOMIO has been configured.
- To use this unit, you must have ANSI.SYS installed in your CONFIG.SYS file
- (see ANSICON documentation above).
-
- When you include the CONCOMIO unit in your program, it automatically
- assigns the standard input and output files and the ANSI file to the CONCOMIO
- I/O functions.
-
- All types, constants, variables, procedures, and functions defined in
- ANSICOM are also defined in CONCOMIO (with the exception of AssignCOM). As
- before, you must initialize the modem, install an error handler, etc. In
- addition to the stuff declared in ANSICOM, CONCOMIO has its own declarations
- described below.
-
- The CONCOMIO uses both the ANSICON and ANSICOM units to handle the
- input and output. The sole purpose of this unit is to direct the input and
- output calls to the correct handlers.
-
- Communications error handlers for the CONCOMIO unit function exactly
- the same way as they do for the ANSICOM unit. However, since the console is
- part of the CONCOMIO routines, you do not need to open the console as a
- separate file; instead, set the variable ActiveOutput := ConsoleActive. The
- variable ActiveOutput and constant ConsoleActive are described below.
-
-
- The CONCOMIO unit defines the following constants:
-
- const
- NoneActive = $0000;
-
- No text file device driver is active for this
- operation (input or output, see below).
-
-
- const
- ConsoleActive = $0001;
-
- The console device driver is active for this operation
- (input or output, see below).
-
-
- const
- CommActive = $0002;
-
- The communications device driver is active for this
- operation (input or output, see below).
-
-
- const
- BothActive = ConsoleActive or CommActive;
-
- Both the console and communications device drivers are
- active for this operation (input or output, see below).
-
-
- The CONCOMIO unit defines the following variables:
-
- var
- ActiveInput : word;
-
- This is the active input device. Valid values are
- NoneActive (no input allowed), ConsoleActive (input from
- console only allowed), CommActive (input from modem only
- allowed), and BothActive (input from both console and modem
- allowed).
-
- If the value is NoneActive, any Read or ReadLn
- operation will return an I/O result of 161 (device read
- fault).
-
-
- var
- ActiveOutput : word;
-
- This is the active output device. Valid values are
- NoneActive (no output allowed), ConsoleActive (output to
- console only allowed), CommActive (output to modem only
- allowed), and BothActive (output to both console and modem
- allowed).
-
- If the value is NoneActive, any Write or WriteLn
- operation will return an I/O result of 160 (device write
- fault).
-
-
- The CONCOMIO unit defines the following procedures and functions:
-
- procedure AssignCONCOM(var F : Text);
-
- This assigns the file F to the console and the modem
- by defining its I/O chain functions and then assigning the
- file to the ANSI device above.
-
-
- function KeyPressed : boolean;
-
- Returns true if a key is waiting in the keyboard or
- modem buffer, depending on the value of ActiveInput.
-
-
- function ReadKey : char;
-
- Reads the next key from the keyboard or modem buffer,
- depending on the value of ActiveInput.
-
-
- Where any of the above constants, variables, procedures, or functions
- have the same name as in the CRT unit, the functionality is the same.
-
- When using the CONCOMIO unit, you must be sure to initialize the modem
- using the InitCOM() call since CONCOMIO does in fact use the modem.
-
- WARNING: By default, the CONCOMIO startup routine sets CheckBreak to
- false. This is because a Ctrl-Break in the ANSICON driver generates INT 23h,
- the Ctrl-Break interrupt, and does not allow the communications routines to do
- any cleanup. When this happens, the communications interrupt in the ANSICOM
- driver may not be properly released and your computer may be left in an
- unknown state.
-
-
-
-
- Demonstration Programs
- "Cut-and-paste code."
-
- The files DEMOCON.EXE (source DEMOCON.PAS), DEMOCOM.EXE (source
- DEMOCOM.PAS), and DEMOBOTH.EXE (source DEMOBOTH.PAS) demonstrate simple
- applications of the ANSICON or ANSICOM units or both respectively. These
- programs handle line-oriented input and output and some simple color and
- screen control.
-
- To run DEMOCON, just type DEMOCON at the DOS prompt. After you enter
- your name, a box showing your name, current colors, and the cursor position
- will be displayed. The colors will change randomly.
-
- To run DEMOCOM, your modem must be on-line to a remote terminal. The
- baud rate at which it is connected is really immaterial since your modem will
- not be initialized by the DEMOCOM program itself. However, you must be
- connected at 8 data bits. The remote terminal will see exactly the same thing
- that you saw in the DEMOCON program.
-
- To run DEMOBOTH, your modem must be on-line to a remote terminal. The
- baud rate at which it is connected is really immaterial since your modem will
- not be initialized by the DEMOBOTH program itself. However, you must be
- connected at 8 data bits. In this case, both the remote terminal and your
- screen will display the same thing and each will have the ability to enter
- data.
-
-