POLYCOMM.CPP
资源名称:commutil.zip [点击查看]
上传用户:xr_qian
上传日期:2007-01-05
资源大小:443k
文件大小:17k
源码类别:
通讯/手机编程
开发平台:
DOS
- // ******************************************************************** //
- // //
- // POLYCOMM.CPP //
- // Copyright (c) 1993, Michael Holmes and Bob Flanders //
- // C++ Communication Utilities //
- // //
- // Chapter 7: Receiving a FAX //
- // Last changed in chapter 7 //
- // //
- // This file contains the main function for the PolyComm //
- // program. This code is specific for the Microsoft C/C++ //
- // version 7 compiler. //
- // //
- // Compile with: CL /AC polycomm.cpp /link graphics //
- // //
- // ******************************************************************** //
- #include <stdio.h> // standard i/o library
- #include <stdarg.h> // variable argument list
- #include <string.h> // string handling routines
- #include <stdlib.h> // std conversion routines
- #include <dos.h> // dos functions
- #include <ctype.h> // character routines
- #include <conio.h> // console functions
- #include <bios.h> // bios functions
- #include <io.h> // i/o functions
- #include <direct.h> // directory routines
- #include <systypes.h> // system types definition
- #include <sysstat.h> // ..attribute bits
- #include <fcntl.h> // ..and file control
- #include <graph.h> // text mode routines
- #include "keys.h" // keyboard definitions
- #define CURSOR() _settextcursor(0x0707) // normal text cursor
- #define BIGCURSOR() _settextcursor(0x0000) // insert mode cursor
- #define NOCURSOR() _settextcursor(0x2000) // turn off cursor
- #define COUNT(x) (sizeof(x) / sizeof(x[0])) // item count
- #define NOT ! // shorthand logical
- #define BYTE char // single byte
- #define UINT unsigned int // unsigned integer
- #define UCHAR unsigned char // ..and unsigned character
- #define ULONG unsigned long // ..and unsigned long
- #define MAX_PATH 79 // maximum path length
- #define MIX(x,y) ((x << 4) + (y)) // mix colors for fg and bg
- #define FG(x) (unsigned char) x >> 4 // extract foreground color
- #define BG(x) x & 0x07 // ..and background color
- #define IN(x) _inp(base + x) // read a UART register
- #define OUT(x,y) _outp(base + x, y) // ..and write a register
- #define NULLPTR(x) &x ? x : "" // make null ptr point to null
- #define LAST(s) s[strlen(s) - 1] // last character in string
- #define SECS(x) (long) (x * 182L) / 10L // seconds to ticks conversion
- #define TRUE 1 // true value
- #define FALSE 0 // false value
- #define SOH 1 // start of header
- #define STX 2 // start of text
- #define ETX 3 // end of text
- #define EOT 4 // end of transmission
- #define ACK 6 // positive acknowledgment
- #define XOFF 19 // flow control X-OFF
- #define DLE 16 // data link escape
- #define NAK 21 // negative acknowledgment
- #define CAN 24 // cancel process
- #define MK_FP(s,o) (((long) s << 16) | (long) o) // make a long pointer
- #define INT_PARMS UINT es, UINT ds, /* interrupt calling conv */
- UINT di, UINT si,
- UINT bp, UINT sp,
- UINT bx, UINT dx,
- UINT cx, UINT ax,
- UINT ip, UINT cs,
- UINT flags
- /* ******************************************************************** *
- *
- * UART Register Definitions
- *
- * ******************************************************************** */
- // UART regs (base address +)
- #define RBR 0 // receive buffer register
- #define THR 0 // transmit holding register
- #define DLL 0 // divisor latch LSB
- #define DLM 1 // divisor latch MSB
- #define IER 1 // interrupt enable register
- #define IIR 2 // interrupt id register
- #define FCR 2 // FIFO control register
- #define AFR 2 // alternate function register
- #define LCR 3 // line control register
- #define MCR 4 // modem control register
- #define LSR 5 // line status register
- #define MSR 6 // modem status register
- #define SCR 7 // scratch register
- // interrupt enable register
- #define IER_RBF 0x01 // receive buffer full
- #define IER_TBE 0x02 // transmit buffer empty
- #define IER_LSI 0x04 // line status interrupt
- #define IER_MSI 0x08 // modem status interrupt
- #define IER_ALL 0x0f // enable all interrupts
- // interrupt id register
- #define IIR_PEND 0x01 // interrupt pending = 0
- #define IIR_II 0x06 // interrupt id bits
- // 000 = modem status change
- // 001 = trans holding empty
- // 010 = receive buffer full
- // 110 = receive fifo full
- // 011 = line status change
- #define IIR_MSI 0x00 // modem status interrupt
- #define IIR_TBE 0x02 // transmit buffer empty
- #define IIR_RBF 0x04 // receive buffer full
- #define IIR_LSI 0x06 // line status interrupt
- #define IIR_RFF 0x0c // receive fifo threshold
- // fifo control register
- #define FCR_FIFO 0x01 // fifo enable
- #define FCR_RCVR 0x02 // receiver fifo reset
- #define FCR_XMIT 0x04 // transmit fifo reset
- #define FCR_DMA 0x08 // DMA mode select
- #define FCR_TRIGGER 0xc0 // receiver trigger select
- // 00 = 1 byte
- // 01 = 4 bytes
- // 10 = 8 bytes
- // 11 = 14 bytes
- #define FCR_16550 0xc7 // 16550 fifo enable/reset
- // line control register
- #define LCR_WLEN 0x03 // word length
- // 10 = 7 bits
- // 11 = 8 bits
- #define LCR_STOP 0x04 // stop bits
- // 0 = 1 stop bit
- // 1 = 2 stop bits
- #define LCR_PARITY 0x08 // parity enable
- // 0 = no parity
- // 1 = send/check parity
- #define LCR_EVEN 0x10 // even/odd parity
- // 0 = odd parity
- // 1 = even parity
- #define LCR_BREAK 0x40 // break, set to xmit break
- #define LCR_DLAB 0x80 // divisor latch access bit
- // modem control register
- #define MCR_DTR 0x01 // DTR control
- #define MCR_RTS 0x02 // RTS control
- #define MCR_OUT2 0x08 // OUT2 control
- #define MCR_DO 0x0b // dtr, rts & out2 enabled
- // line status register
- #define LSR_DR 0x01 // data ready
- #define LSR_ORUN 0x02 // overrun error
- #define LSR_PRTY 0x04 // parity error
- #define LSR_FRM 0x08 // framing error
- #define LSR_BRK 0x10 // break interrupt
- #define LSR_THRE 0x20 // transmit holding reg empty
- #define LSR_TSRE 0x40 // transmit shift reg emtpy
- #define LSR_ERROR 0x1e // error conditions
- // modem status register
- #define MSR_DCTS 0x01 // delta clear to send
- #define MSR_DDSR 0x02 // delta data set ready
- #define MSR_TERI 0x04 // trailing edge ring indicator
- #define MSR_DCD 0x08 // delta carrier detect
- #define MSR_CTS 0x10 // clear to send
- #define MSR_DSR 0x20 // data set ready (modem ready)
- #define MSR_RI 0x40 // ring indicated
- #define MSR_CD 0x80 // carrier detected
- /* ******************************************************************** *
- *
- * 8259 Programmable Interrupt Controller Definitions
- *
- * ******************************************************************** */
- #define I8259 0x20 // control register address
- #define EOI 0x20 // end of interrupt command
- #define I8259M 0x21 // mask register
- /* ******************************************************************** *
- *
- * Routine definitions
- *
- * ******************************************************************** */
- void initialization(int, char *[]), // initialization
- status_line(void), // update status line
- wait_ms(long), // wait in milliseconds
- wait(long); // ..and wait in seconds
- int about(int, int), // about box routine
- pc_exit(int, int), // menu exit routine
- ports(int, int), // port selection menu routine
- comm_parms(int, int), // comm parms menu routine
- hangup(int, int), // hangup menu routine
- phone_list(int, int), // phonebook menu routine
- dl_xmodem(int, int), // xmodem download menu rtn
- ul_xmodem(int, int), // ..and upload menu routine
- dl_ymodem(int, int), // ymodem download menu rtn
- ul_ymodem(int, int), // ..and upload menu routine
- rcv_fax(int, int), // receive a fax
- send_fax(int, int), // .. and send a fax
- get_key(int); // get any type of key
- /* ******************************************************************** *
- *
- * Set the stack size to 8k
- *
- * ******************************************************************** */
- extern
- unsigned _stklen = 8192;
- /* ******************************************************************** *
- *
- * PolyComm includes
- *
- * ******************************************************************** */
- #include "screen.cpp" // screen handling routines
- #include "window.cpp" // window class
- #include "menu.cpp" // menu class
- #include "list.cpp" // list class
- #include "comm.cpp" // basic comm support
- #include "global.cpp" // strings and global data
- #include "utility.cpp" // utility functions
- #include "protocol.cpp" // protocol class
- #include "xmodem.cpp" // XMODEM and XMODEM/CRC class
- #include "ymodem.cpp" // YMODEM class
- #include "command.cpp" // command menu routine
- #include "dial.cpp" // dial menu routines
- #include "config.cpp" // configuration menu rtns
- #include "fax.cpp" // facsimile support
- #include "transfer.cpp" // transfer file menu rtns
- /* ******************************************************************** *
- *
- * main() -- PolyComm mainline
- *
- * ******************************************************************** */
- void main(int argc, // command line token count
- char *argv[]) // ..and command line tokens
- {
- printf(copyright); // display copyright msg
- initialization(argc, argv); // init and parse cmd line
- while(NOT quit_flag) // loop 'til user requests out
- {
- terminal_handler(); // try to get a keyboard char
- if (NOT comm->IEmpty()) // q. any incoming com chars?
- terminal_display(); // a. yes .. show input stream
- }
- rc = 0; // clear DOS errorlevel
- quit_with(done); // ..and give completion msg
- }
- /* ******************************************************************** *
- *
- * initialization() -- perform framework initializations
- *
- * ******************************************************************** */
- void initialization(int ac, // command line token count
- char *av[]) // ..and command line tokens
- {
- struct videoconfig vc; // screen info structure
- old_break = _dos_getvect(0x1b); // get old ^break handler addr
- if (ac > 2 || // q. need help..
- NOT strcmp(av[1], "/?")) // ..or want help?
- quit_with(help); // a. yes .. give help/quit
- _dos_setvect(0x1b, control_break); // set up control break
- _dos_setvect(0x24, critical_routine); // ..and DOS critical handler
- _getvideoconfig(&vc); // get current screen info
- max_lines = vc.numtextrows; // save maximum nbr of lines
- if (vc.numtextcols < 80) // q. less than 80 columns?
- quit_with(bad_width); // a. yes .. give error/quit
- if (vc.mode == _TEXTBW80 || // q. black and white mode..
- vc.mode == _TEXTMONO) // ..or monochrome mode?
- {
- main_menu.SetColors(mono_1, mono_2); // a. yes .. set up for
- term_cn = mono_2; // ..monochrome display
- term_cr = mono_1; // ..for all windows
- stat_cn = mono_1;
- }
- if (vc.mode == _TEXTMONO) // q. mono adapter?
- vid_seg = (char huge *)MK_FP(0xb000, 0);// a. yes .. use mono memory
- load_config(av[1]); // load modem config file
- load_pb(); // ..and phonebook file
- check_ports(); // check for available ports
- build_comm(); // set up Comm object
- wait_ms(500L); // wait a little bit
- full_screen = 1; // show init complete
- status_line(); // ..and display status line
- _wscroll = 1; // set scrolling mode
- term = new Window(1, 1, 80, 24, // define terminal window
- term_cn, term_cr); // ..and its colors
- term->Open(none); // ..then open w/o borders
- comm->IClear(); // ..clear input buffer
- }