Title: Software Examples for 5 Bit, 1.5 Stop Bits Under DOS
Keywords: DOS Data_bits Stop_bits
KDB: KDB-037
Revision: 0.00
Author: Support
Distribution: External
This file contains 3 files: cti5bit.c, z80c.h and cti5bit.mak.
These are intended to be used as samples and examples
for setting Intellicon cards into 5 bit, 1.5 stop bits under DOS.
*****************File: cti5bit.c***********************
/* Title : CTI5BIT.C
* Author : Allan Smith
* Project : Intellicon
* Date : June 10, 1994
* Revised :
*
* This program will set port 0 to 5 bits 1.5 stop bits
*
** Copyright (c) 1994 CTI, Connect Tech Inc. All Rights Reserved.
**
** THIS IS THE UNPUBLISHED PROPRIETARY SOURCE CODE OF CONNECT TECH INC.
** The copyright notice above does not evidence any actual or intended
** publication of such source code.
**
** This module contains Proprietary Information of Connect Tech, Inc
** and should be treated as Confidential.
*
******************************************************************************/
#include
#include
#include
#include
#include "z80c.h"
#define COMM_INT 0x14 /* Communications interrupt 14h */
#define ID_FN 0x06 /* function that ids our port and # of fns */
#define CTTY_FN 0x12 /* funciton that changes and reports options */
#define QUERY_FN 0x0c /* function that reads Intellicon params */
#define EINIT_FN 0x04 /* function that inits port */
#define USE_Z80CE 0x8000
#define Z80_NULL_CODE 0
#define Z80_NMI_CMD 0x0d
#define Z80_NMI_DEV 0x0c
#define NMI_STTY 2
struct z80ce_defs z80ce; /* ctty structure */
unsigned int ctiseg = 0xd000;
unsigned int ctiioport = 0x300;
void load_ce( struct z80ce_defs *z80ce_ptr, unsigned short port_no );
void set_ce( struct z80ce_defs *z80ce_ptr, unsigned short port_no );
int atoh( char *string );
void z80_command( unsigned char port, unsigned char cmd );
char get_digit( char c );
void main( int argc, char *argv[] ){
if( argc == 1 ){
printf( "USE: cti5bit [io_port] [segment]\n" );
printf( " io_port defaults to 0x300 and segment defaults to 0xd000\n" );
exit( 0 );
}
if( argc >= 3 )
ctiioport = atoh( argv[2] );
if( argc >= 4 )
ctiseg = atoh( argv[3] );
load_ce( &z80ce, atoi( argv[1] ));
z80ce.data_bits = 5;
z80ce.stop_bits = 2; /* 2 == 1.5, 3 == 2 */
set_ce( &z80ce, atoi( argv[1] ));
z80_command( (unsigned char)atoi( argv[1] ), NMI_STTY );
outp( ctiioport+1, 0 );
}
void load_ce( struct z80ce_defs *z80ce_ptr, unsigned short port_no ){
union _REGS regs;
struct _SREGS segs;
_segread( &segs );
segs.es = segs.ds;
regs.x.ax = CTTY_FN<<8;
regs.x.bx = USE_Z80CE;
regs.x.dx = port_no;
regs.x.cx = 0; /* query */
regs.x.si = (unsigned)z80ce_ptr;
_int86x( COMM_INT, ®s, ®s, &segs );
}
void set_ce( struct z80ce_defs *z80ce_ptr, unsigned short port_no ){
union _REGS regs;
struct _SREGS segs;
_segread( &segs );
segs.es = segs.ds;
regs.x.ax = CTTY_FN<<8; regs.x.bx = USE_Z80CE; regs.x.dx = port_no; regs.x.cx = USE_Z80CE; /* set */ regs.x.si = (unsigned)z80ce_ptr; _int86x( COMM_INT, ®s, ®s, &segs ); } /********************************************************************** ** Function: atoh ** ** Routine to convert an ascii string to hex number ** ** Arguments: ** string hex string to be converted into an integer **********************************************************************/ int atoh( char *string ) { int digit, result; result = 0; while( ( digit = get_digit( *string++ ) ) != -1 ) result = result * 16 + digit; return( result ); } /********************************************************************** ** Function: get_digit ** ** Routine to convert a single ascii digit to hex ** ** Arguments: ** c a single ascii digit to be converted to hex **********************************************************************/ char get_digit( char c ) { if ( ( c >= '0' ) && ( c <= '9' ) ) return( c - '0' ); if ( ( c >= 'a' ) && ( c <= 'f' ) ) return( c - 'a' + 10 ); if ( ( c >= 'A' ) && ( c <= 'F' ) )
return( c - 'A' + 10 );
return( -1 );
}
void z80_command( unsigned char port, unsigned char cmd ){
unsigned char _far *z80_cmd;
unsigned char _far *z80_dev;
long i;
z80_cmd = _MK_FP( ctiseg, Z80_NMI_CMD );
_disable();
while( 1 ){
if( *z80_cmd == Z80_NULL_CODE ) /* wait till last command is done */
break; /* exit loop */
_enable(); /* make sure ints are on while waiting */
for( i = 0; i < 100000; ++i ) /* time delay */ ; _disable(); } z80_dev = MK_FP( ctiseg, Z80_NMI_DEV ); *z80_dev = port; *z80_cmd = cmd; _enable(); } *****************End File: cti5bit.c*********************** *****************File: z80c.h*********************** /* * Z80 channel entry defs */ #pragma pack(1) struct z80ce_defs { unsigned char device; unsigned short options; unsigned char page; unsigned char type; unsigned char brk; unsigned char escape; unsigned char rubout; unsigned char cancel; unsigned char eot; unsigned char up; unsigned char right; unsigned char down; unsigned char left; unsigned char home; unsigned char clear; unsigned char function; unsigned char insert; unsigned char _delete; unsigned char row; unsigned char col; unsigned short baud; unsigned char parity; unsigned char stop_bits; unsigned char data_bits; unsigned short tty_options; unsigned short in; unsigned short out; unsigned short mdm_port_status; unsigned short out_xon_xoff; unsigned short in_xon_xoff; unsigned char line_status; unsigned short count; unsigned char inb1; unsigned char num_in; unsigned char outb1; unsigned char num_out; unsigned char misc; unsigned char reserved[10]; }; #pragma pack() *****************End File: z80c.h*********************** *****************File: cti5bit.mak*********************** # Microsoft Visual C++ generated build script - Do not modify PROJ = CTI5BIT DEBUG = 0 PROGTYPE = 6 CALLER = ARGS = DLLS = D_RCDEFINES = -d_DEBUG R_RCDEFINES = -dNDEBUG ORIGIN = MSVC ORIGIN_VER = 1.00 PROJPATH = D:\JOBS\CTISETT\ USEMFC = 0 CC = cl CPP = cl CXX = cl CCREATEPCHFLAG = CPPCREATEPCHFLAG = CUSEPCHFLAG = CPPUSEPCHFLAG = FIRSTC = FIRSTCPP = ASSIGN1A.CPP RC = rc CFLAGS_D_DEXE = /nologo /W3 /FR /G2 /Zi /D_DEBUG /Od /AM /D_DOS /Fd"CTI5BIT.PDB" CFLAGS_R_DEXE = /nologo /W3 /FR /G2 /DNDEBUG /Gs /Ox /AM /D_DOS LFLAGS_D_DEXE = /NOLOGO /ONERROR:NOEXE /NOI /CO /STACK:5120 LFLAGS_R_DEXE = /NOLOGO /ONERROR:NOEXE /NOI /STACK:5120 LIBS_D_DEXE = oldnames mlibce LIBS_R_DEXE = oldnames mlibce RCFLAGS = /nologo RESFLAGS = /nologo RUNFLAGS = OBJS_EXT = LIBS_EXT = !if "$(DEBUG)" == "1" CFLAGS = $(CFLAGS_D_DEXE) LFLAGS = $(LFLAGS_D_DEXE) LIBS = $(LIBS_D_DEXE) MAPFILE = nul RCDEFINES = $(D_RCDEFINES) !else CFLAGS = $(CFLAGS_R_DEXE) LFLAGS = $(LFLAGS_R_DEXE) LIBS = $(LIBS_R_DEXE) MAPFILE = nul RCDEFINES = $(R_RCDEFINES) !endif !if [if exist MSVC.BND del MSVC.BND] !endif SBRS = CTI5BIT.SBR CTI5BIT_DEP = d:\jobs\ctisett\z80c.h all: $(PROJ).EXE $(PROJ).BSC CTI5BIT.OBJ: CTI5BIT.C $(CTI5BIT_DEP) $(CC) $(CFLAGS) $(CUSEPCHFLAG) /c CTI5BIT.C $(PROJ).EXE:: CTI5BIT.OBJ $(OBJS_EXT) $(DEFFILE) echo >NUL @<<$(PROJ).CRF
CTI5BIT.OBJ +
$(OBJS_EXT)
$(PROJ).EXE
$(MAPFILE)
c:\msvc\lib\+
c:\msvc\mfc\lib\+
$(LIBS)
$(DEFFILE);
<<
link $(LFLAGS) @$(PROJ).CRF
run: $(PROJ).EXE
$(PROJ) $(RUNFLAGS)
$(PROJ).BSC: $(SBRS)
bscmake @<<
/o$@ $(SBRS)
*****************End File: cti5bit.mak***********************
End of KDB-037