当前位置: 代码迷 >> 综合 >> MSDOS下编程8250串口芯片通信程序
  详细解决方案

MSDOS下编程8250串口芯片通信程序

热度:65   发布时间:2024-02-26 23:55:20.0

使用C++ 语言在MSDOS操作系统下编程PC机的8250串口芯片和设备进行通信。

 


#include <conio.h>
#include <bios.h>
#include <dos.h>
#include <dir.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#ifdef __cplusplus#define __CPPARGS ...
#else#define __CPPARGS
#endif
#define DOUBLE_X 				205
#define DOUBLE_Y 				186
#define DOUBLE_LEFT_UP  		201
#define DOUBLE_LEFT_DOWN  		187
#define DOUBLE_RIGHT_UP  		200
#define DOUBLE_RIGHT_DOWN  		188
#define SIGNAL_X  				196
#define SIGNAL_Y  				179
#define SIGNAL_LEFT_UP  		218
#define SIGNAL_LEFT_DOWN  		191
#define SIGNAL_RIGHT_UP  		192
#define SIGNAL_RIGHT_DOWN  		217
#define MSCOMM_BUFFER_LENGTH 	503
#define RECIVE_BUFFER_LENGTH ((MSCOMM_BUFFER_LENGTH-3)*10)
#define STRING_LENGTH  			80#define BLACK_RED   			0x04
#define BLACK_WHITE 			0x07
#define BLACK_GREEN 			0x02
#define BLACK_YELLOW			0x0E
#define BLUE_LIGHTING_WHITE 	0x1F
#define BLUE_WHITE 				0x17
#define BLUE_YELLOW 			0x1E
#define BLUE_GRAY   			0x18
#define RED_WHITE				0x47
#define RED_BLACK				0x40
#define GREEN_BLACK				0x30
#define GREEN_WHITE    			0x37
#define GREEN_GRAY				0x38
#define WHITE_BLACK 			0x70
#define WHITE_GRAY  			0x78
#define WHITE_BLUE  			0x71
#define WHITE_LIGHTING_BLUE		0x79
#define WHITE_PINK				0x75
#define WHITE_LIGHTING_PINK     0x7D
#define WHITE_RED   			0x74
#define WHITE_LIGHTING_RED		0x7C
#define WHITE_GREEN				0x72
#define WHITE_LIGHTING_GREEN	0x7A#define WARNING_BLACK 			0x40
#define WARNING_WHITE			0x47
#define SHADOW_ATTR  			0x07
#define DESKTOP_ATTR 			0x71
#define WINDOW_ATTR  			0x70
#define STATUS_ATTR  			0x70
#define SCROLL_ATTR  			0x1E
#define BLANK 					0x20
#define DESKTOP_CHAR 			0xB0
#define WINDOW_CHAR  			0X20
#define STATUS_CHAR 			0X20
#define SCROLL_CHAR  			219
#define QUES_CHAR 				0x3F
#define DOT_CHAR     			0x2E
#define COMMA_CHAR				0x2C
#define CLOCK_CHAR				0x01
#define COLON_CHAR				0x3A	//	:
#define MIN_DESKTOP_X			0x00
#define MAX_DESKTOP_X			0x18
#define MAX_WINDOW_X			0x17
#define MIN_WINDOW_X			0x01
#define MAX_DESKTOP_Y			0x4F
#define MIN_DESKTOP_Y			0x00
#define MAX_WINDOW_Y			0x4F
#define MIN_WINDOW_Y			0x00
#define CLOCK_WINDOW_Y			0x48#define ESC						0x011B
#define _COM_CHR7 				0x02
#define _COM_CHR8 				0x03
#define _COM_STOP1      		0x00
#define _COM_STOP2      		0x04
#define _COM_NOPARITY   		0x00
#define _COM_EVENPARITY 		0x18
#define _COM_ODDPARITY  		0x08
/**************************************************************************
/*								8250
/*************************************************************************/
#define TXR             		0
#define RXR             		0
#define IER             		1
#define IIR             		2
#define FCR						2
#define LCR            			3
#define MCR             		4
#define LSR             		5
#define MSR             		6
#define DLL             		0
#define DLH             		1
#define SREG(__COM_BASE,x)   	((unsigned)(__COM_BASE + (unsigned)x))
#define RX_INT          0x01
#define TX_INT			0x02
#define RX_TX_INT		0x03
#define RX_ID           0x04
#define RX_MASK         0x07
#define TX_ID			0x02
#define DTR						0x01
#define RTS						0x02
#define MC_INT					0x08
#define XMTRDY					0x20
/**************************************************************************8259 Programmable Interrupt Controller (PIC).
/**************************************************************************/
#define INTC_MASK 		0x21
#define INTC_EOI  		0x20
#define COM1_BASE 		0x03F8
#define COM1_IRQ_MASK 	0xEF
#define COM1_INT_NUM 	0x0C
#define COM2_BASE 		0x02F8
#define COM2_IRQ_MASK 	0xF7
#define COM2_INT_NUM 	0x0B
#define IRQ_EOI			0x20void _far _interrupt UartInt(__CPPARGS) ;
void _far _interrupt ClockInt(__CPPARGS) ;typedef enum RECIVE_STATUS { RECIVE_WAIT , RECIVE_OK , RECIVE_ERROR } ;
typedef enum MSCOMM_COM { COM1 , COM2 } ;
typedef enum STOP_BIT { STOP_1 , STOP_2} ;
typedef enum CHAR_BIT { CHR7 , CHR8 };
typedef enum PARITY_BIT {NO_PARITY , EVEN_PARITY , ODD_PARITY} ;
typedef enum BOOL { False , True } ;
typedef enum BAUD { BAUD_50    ,BAUD_300   ,BAUD_600   ,BAUD_2400,BAUD_4800  ,BAUD_9600  ,BAUD_19200 ,BAUD_38400 ,BAUD_57600 ,BAUD_115200 } ;
unsigned char baud[10][2] =	{
   {0x00,0x09} , {0x80,0x01} , {0xC0,0x00},{0x30,0x00} , {0x18,0x00} , {0x0C,0x00},{0x06,0x00} , {0x03,0x00} , {0x02,0x00},{0x01,0x00}} ;
unsigned char send_array[] = "test MSCOMM ... " ;
char *stop_array[] = {"STOP=1" , "STOP=2" ,} ;
char *baud_array[] = {"50^:^","300^:^","600^:^","2400^:^","4800^:^","9600^:^","19200^:^","38400^:^","57600^:^","115200^:^",} ;
char *com_array[]  = {"COM1^:^","COM2^:^",};
char *parity_array[]={"NOPARITY^:^" ,"EVENPARITY^:^" ,"ODDPARITY^:^" ,} ;
char *char_array[] = {"7^:^" , "8^:^"} ;
char COMMON_String[STRING_LENGTH] ;BOOL PressEscapeKey(void)
{if (bioskey(1)){if (bioskey(0) == ESC)return (True);}return (False) ;
}class cWindows {public:cWindows(const unsigned char __x1 , const unsigned char __y1 , const unsigned char __x2 , const unsigned char __y2 , const BOOL __box_type , const unsigned char __box_attr , const unsigned char __window_attr , const unsigned char __title_attr) ;cWindows(const cWindows &cW) ;~cWindows(void) ;int WindowWidth(void) { return (Winy2 - Winy1 - 1 );}int WindowStartx(void) { return (Winx1 + 1 );}int WindowStarty(void) { return (Winy1 + 1 );}void DesktopInit(void) ;void WindowSaveImage(void) ;void WindowRestoreImage(void) ;void WindowInit(char *__Title , char *__String) ;void WindowClock(void);void WindowScrollUp(const unsigned char __row) ;void WindowScrollUp(const unsigned char __x1 , const unsigned char __y1 , const unsigned char __x2 , const unsigned char __y2 , const unsigned char __attr , const unsigned char __row) ;void WindowScrollDown(const unsigned char __row) ;void WindowBorder(void);void WriteString(const unsigned char __x , const unsigned char __y , const unsigned char __c , const unsigned char __attr) ;void WriteString(const unsigned char __x , const unsigned char __y , char *__String , const unsigned char __attr) ;void WindowString(const unsigned char __x , const unsigned char __y , char *__String);void WindowString(const unsigned char __x , char *__String) ;void WindowString(const char __ch) ;unsigned char ReadChar(const unsigned char __x , const unsigned char __y);unsigned char ReadAttr(const unsigned char __x , const unsigned char __y);void WriteStatusLine(char *__String1 , char *__String2) ;void CursorSave(void) ;void CursorRestore(void) ;private:char *image ;unsigned char xSave ;unsigned char ySave ;unsigned char BoxAttr ;unsigned char WindowAttr;unsigned char TitleAttr ;unsigned char Winx1 ;unsigned char Winx2 ;unsigned char Winy1 ;unsigned char Winy2 ;unsigned char disx ;unsigned char disy ;BOOL Box_Flag ;
} ;cWindows::cWindows(const unsigned char __x1 = 0 , const unsigned char __y1 = 0 , const unsigned char __x2 = 24 , const unsigned char __y2 = 79 , const BOOL __box_type = False , const unsigned char __box_attr = WHITE_BLACK , const unsigned char __window_attr = WHITE_BLACK , const unsigned char __title_attr = WHITE_BLACK)
{Winx1 = __x1 ;if (Winx1 > MAX_WINDOW_X) Winx1 = MAX_WINDOW_X ;Winy1 = __y1 ;if (Winy1 > MAX_WINDOW_Y-1) Winy1 = MAX_WINDOW_Y-1 ;Winx2 = __x2 ;if (Winx2 > MAX_DESKTOP_X) Winx2 = MAX_DESKTOP_X ;Winy2 = __y2 ;if (Winy2 > MAX_WINDOW_Y) Winy2 = MAX_WINDOW_Y ;if (Winx1>=Winx2) Winx1 = Winx2 -1 ;if (Winy1>=Winy2) Winy1 = Winy2 -1 ;disx = Winx1 + 1 ;disy = Winy1 + 2 ;Box_Flag = __box_type ;BoxAttr = __box_attr ;WindowAttr = __window_attr ;TitleAttr = __title_attr ;if ((image = new char [(Winx2-Winx1+1)*(Winy2-Winy1+1)*2+1]) == NULL){exit(-1) ;}WindowSaveImage() ;CursorSave() ;
}cWindows::~cWindows(void)
{CursorRestore() ;WindowRestoreImage() ;delete image ;
}void cWindows::CursorSave(void)
{union REGS regs ;regs.h.ah = 0x03 ;regs.h.bh = 0x00 ;int86(0x10,&regs,&regs) ;xSave = regs.h.dh ;ySave = regs.h.dl ;regs.h.ah = 0x02 ;regs.h.bh = 0x00 ;regs.h.dh = 0x40 ;regs.h.dl = 0x50 ;int86(0x10,&regs,&regs) ;
}void cWindows::CursorRestore(void)
{union REGS regs ;regs.h.ah = 0x02 ;regs.h.bh = 0x00 ;regs.h.dh = xSave ;regs.h.dl = ySave ;int86(0x10,&regs,&regs) ;
}void cWindows::WindowSaveImage(void)
{unsigned char far *image_ptr = image ;unsigned char endx= Winx2 ;unsigned char endy=Winy2 ;if (Winx2 < MAX_WINDOW_X) endx++ ;if (Winy2 < MAX_WINDOW_Y) endy = (Winy2 < MAX_WINDOW_Y-1 ? Winy2+2 : Winy2+1) ;for (unsigned char i = Winx1 ; i<=endx ; i++)for (unsigned char j=Winy1 ; j<=endy ; j++){*image_ptr++ = ReadChar(i,j) ;*image_ptr++ = ReadAttr(i,j) ;}
}void cWindows::WindowRestoreImage(void)
{unsigned char far *image_ptr = image ;unsigned char endx= Winx2 ;unsigned char endy=Winy2 ;if (Winx2 < MAX_WINDOW_X)	endx++ ;if (Winy2 < MAX_WINDOW_Y)	endy = (Winy2 < MAX_WINDOW_Y-1 ? Winy2+2 : Winy2+1) ;for (unsigned char i=Winx1 ; i<=endx ; i++)for (unsigned char j=Winy1 ; j<=endy ; j++){unsigned char c = *image_ptr++ ;unsigned char attr = *image_ptr++ ;WriteString(i,j,c,attr);}
}void cWindows::WindowClock(void)
{unsigned int year ;unsigned char month ;unsigned char day ;asm {MOV AH,2Ahint 21hMOV year,CXMOV month,DHMOV day,DL}if (month>=10 && day>=10)sprintf(COMMON_String, "%4d:%2d:%2d"  ,year,month,day) ;else if (month>=10 && day<10)sprintf(COMMON_String, "%4d:%2d:0%1d" ,year,month,day) ;else if (month<10 && day<10)sprintf(COMMON_String, "%4d:0%1d:0%1d",year,month,day) ;else if (month<10 && day>=10)sprintf(COMMON_String, "%4d:0%1d:%2d" ,year,month,day) ;WriteString(MAX_DESKTOP_X,70,COMMON_String,WHITE_BLACK);}void cWindows::WriteString(const unsigned char __x,const unsigned char __y,const unsigned char __c, const unsigned char __attr)
{asm {PUSH ESMOV  AX,0B800hMOV  ES,AXMOV  AH,__xMOV  AL,0A0hMUL  AHXCHG AX,BXXOR  AH,AHMOV  AL,__ySHL  AL,01hADD  AX,BXXCHG DI,AXMOV  AL,__cMOV  AH,__attrCLDSTOSWPOP  ES}
}void cWindows::WriteString(const unsigned char __x,const unsigned char __y,char *__String,const unsigned char __attr)
{unsigned char wx = __x ;unsigned char j = 0 ;char *ptr = __String ;BOOL color = False ;while (*ptr) {if (*ptr == '^')color = (BOOL)!color ;else if (*ptr == '|'){wx++ ;j = 0 ;}else {if (!color)WriteString(wx,__y+j++,*ptr,__attr) ;else{WriteString(wx,__y+j++,*ptr,WHITE_RED) ;}}ptr++ ;}
}void cWindows::WindowString(const unsigned char __x , const unsigned char __y , char *__String)
{if (!__x)WriteString(Winx1+__x,Winy1+__y,__String,TitleAttr) ;elseWriteString(Winx1+__x,Winy1+__y,__String,WindowAttr) ;
}void cWindows::WindowString(const unsigned char __x , char *__String)
{unsigned char y = (Winy2 - Winy1 + 1 - strlen(__String)) / 2 ;WindowString(__x,y,__String) ;
}void cWindows::WindowString(const char __ch)
{WriteString(disx,disy,__ch,WindowAttr) ;disy++ ;if (disy>=Winy2-1){disy = Winy1 + 2;disx++ ;if (disx >= Winx2){disx=Winx2-1 ;WindowScrollUp(1);}}
}unsigned char cWindows::ReadChar(const unsigned char __x , const unsigned char __y)
{asm {PUSH DSMOV  AX,0B800hMOV  DS,AXMOV  AH,__xMOV  AL,0A0hMUL  AHXCHG AX,BXXOR  AH,AHMOV  AL,__ySHL  AL,01hADD  AX,BXXCHG SI,AXCLDLODSWPOP  DS}return (_AL) ;
}unsigned char cWindows::ReadAttr(const unsigned char __x , const unsigned char __y)
{asm	{PUSH DSMOV  AX,0B800hMOV  DS,AXMOV  AH,__xMOV  AL,0A0hMUL  AHXCHG AX,BXXOR  AH,AHMOV  AL,__ySHL  AL,01hADD  AX,BXXCHG SI,AXCLDLODSWPOP  DS}return (_AH) ;
}void cWindows::DesktopInit(void)
{for (unsigned char i = MIN_DESKTOP_X ; i<=MAX_DESKTOP_X ; i++)for (unsigned char j = MIN_DESKTOP_Y ; j<=MAX_DESKTOP_Y ; j++)WriteString(i,j,DESKTOP_CHAR,DESKTOP_ATTR) ;WriteStatusLine(" Communication Interrupt test program ","^ ESC^-Exit");WindowClock() ;
}void cWindows::WindowBorder(void)
{unsigned char char_x = DOUBLE_X ;unsigned char char_y = DOUBLE_Y ;unsigned char left_up = DOUBLE_LEFT_UP ;unsigned char left_down = DOUBLE_LEFT_DOWN ;unsigned char right_up = DOUBLE_RIGHT_UP ;unsigned char right_down = DOUBLE_RIGHT_DOWN ;if (!Box_Flag){char_x = SIGNAL_X ;char_y = SIGNAL_Y ;left_up = SIGNAL_LEFT_UP ;left_down = SIGNAL_LEFT_DOWN ;right_up = SIGNAL_RIGHT_UP ;right_down = SIGNAL_RIGHT_DOWN ;}for (unsigned char i=Winy1 ; i<Winy2 ; i++) {WriteString(Winx1,i,char_x,BoxAttr) ;WriteString(Winx2,i,char_x,BoxAttr) ;}for (i=Winx1 ; i<Winx2 ; i++) {WriteString(i,Winy1,char_y,BoxAttr) ;WriteString(i,Winy2,char_y,BoxAttr) ;}WriteString(Winx1,Winy1,left_up,BoxAttr) ;WriteString(Winx1,Winy2,left_down,BoxAttr) ;WriteString(Winx2,Winy1,right_up,BoxAttr) ;WriteString(Winx2,Winy2,right_down,BoxAttr) ;
}void cWindows::WindowScrollUp(const unsigned char __row = 1)
{union REGS regs ;unsigned char row = __row ;if (row > (Winx2 - Winx1 -1))row = Winx2 - Winx1 -1 ;regs.h.ah = 0x06 ;regs.h.al = row ;regs.h.bh = WindowAttr ;regs.h.cl = Winy1 + 1 ;regs.h.ch = Winx1 + 1 ;regs.h.dl = Winy2 - 1 ;regs.h.dh = Winx2 - 1 ;int86(0x10,&regs,&regs);
}void cWindows::WindowScrollUp(const unsigned char __x1 = 14 , const unsigned char __y1 = 4, const unsigned char __x2 = 20, const unsigned char __y2 = 75, const unsigned char __attr=BLACK_RED , const unsigned char __row=1)
{union REGS regs ;unsigned char row = __row ;if (row > (__x2 - __x1 -1))row = __x2 - __x1 -1 ;regs.h.ah = 0x06 ;regs.h.al = row ;regs.h.bh = __attr ;regs.h.cl = __y1 + 1 ;regs.h.ch = __x1 + 1 ;regs.h.dl = __y2 - 1 ;regs.h.dh = __x2 - 1 ;int86(0x10,&regs,&regs);
}void cWindows::WindowScrollDown(const unsigned char __row = 1)
{union REGS regs ;unsigned char row = __row ;if (row > (Winx2 - Winx1 -1))row = Winx2 - Winx1 -1 ;regs.h.ah = 0x07 ;regs.h.al = row ;regs.h.bh = WindowAttr ;regs.h.cl = Winy1 + 1 ;regs.h.ch = Winx1 + 1 ;regs.h.dl = Winy2 - 1 ;regs.h.dh = Winx2 - 1 ;int86(0x10,&regs,&regs);
}void cWindows::WindowInit(char *__Title , char *__String)
{unsigned char ch ;unsigned char endx = Winx2 ;unsigned char endy = Winy2 ;if (Winx2 < MAX_WINDOW_X) endx++ ;if (Winy2 < MAX_WINDOW_Y) endy = (Winy2 < MAX_WINDOW_Y-1 ? Winy2+2 : Winy2+1) ;for (unsigned char i=Winx1 ; i<Winx2 ; i++)for (unsigned char j=Winy1 ; j<Winy2 ; j++)WriteString(i,j,WINDOW_CHAR,WindowAttr) ;if (endx < MAX_WINDOW_X && Winx2 < MAX_WINDOW_X){for (unsigned char j=Winy1+2 ; j<=endy ; j++){ch = ReadChar(endx,j) ;WriteString(endx,j,ch,SHADOW_ATTR) ;}}if (Winy2 < MAX_WINDOW_Y){for (i=Winx1+1 ; i<=endx ; i++){for (unsigned char j = Winy2+1 ; j<=endy ; j++){ch = ReadChar(i,j) ;WriteString(i,j,ch,SHADOW_ATTR) ;}}}WindowBorder();WindowString(0,__Title);WindowString(1,4,__String);
}void cWindows::WriteStatusLine(char *__String1 , char *__String2)
{for (unsigned char i=MIN_DESKTOP_Y ; i<=MAX_DESKTOP_Y ; i++){WriteString(MIN_DESKTOP_X,i,STATUS_CHAR,STATUS_ATTR) ;WriteString(MAX_DESKTOP_X,i,STATUS_CHAR,STATUS_ATTR) ;}WriteString(MIN_DESKTOP_X,30,__String1,STATUS_ATTR) ;WriteString(MAX_DESKTOP_X,MIN_DESKTOP_Y,__String2,STATUS_ATTR) ;
}class cInterrupt:public cWindows
{public:cInterrupt(const MSCOMM_COM __mscomm , const BAUD __baud_init , const STOP_BIT __stop_bit , const CHAR_BIT __char_bit , const PARITY_BIT __parity_bit) ;~cInterrupt(void);void Init8250(void) ;void Clear8250(void) ;void Init8259(void) ;void Restore8259(void) ;void InitVect(void) ;void RestoreVect(void) ;unsigned char Status8250IIR(void);void SendChar(unsigned char ch) ;unsigned char ReadChar(void) ;void Run(void) ;unsigned char Send_Char ;unsigned char rdisx ;unsigned char rdisy ;unsigned char rdisx_1 ;unsigned char rdisy_1 ;unsigned char Clock_Times ;void far interrupt (*clock_old_int)(__CPPARGS) ;private:unsigned int BASE ;unsigned char Setting ;unsigned char Baud_Lo ;unsigned char Baud_Hi ;unsigned char irq_mask ;unsigned int COM_Int_Num ;void far interrupt (*com_old_int)(__CPPARGS) ;BOOL Escape_Flag;
} ;cInterrupt::cInterrupt(const MSCOMM_COM __mscomm = COM1 , const BAUD __baud_init = BAUD_115200 , const STOP_BIT __stop_bit = STOP_1 , const CHAR_BIT __char_bit = CHR8 , const PARITY_BIT __parity_bit = NO_PARITY)
{Setting = 0x00 ;DesktopInit() ;BASE = (__mscomm == COM1) ? COM1_BASE : COM2_BASE ;irq_mask = (__mscomm == COM1) ? COM1_IRQ_MASK : COM2_IRQ_MASK ;COM_Int_Num = (__mscomm == COM1) ? COM1_INT_NUM : COM2_INT_NUM ;Baud_Lo = baud[__baud_init][0] ;Baud_Hi = baud[__baud_init][1] ;if (__parity_bit == NO_PARITY) Setting |= _COM_NOPARITY ;else if (__parity_bit == EVEN_PARITY) Setting |= _COM_EVENPARITY ;else Setting |= _COM_ODDPARITY ;Setting |= ((__stop_bit == STOP_1) ? _COM_STOP1:_COM_STOP2) ;Setting |= ((__char_bit == CHR7) ? _COM_CHR7 : _COM_CHR8) ;rdisx_1=5 ;rdisy_1=5 ;rdisx = 15 ;rdisy = 5 ;Clock_Times=0;Init8259() ;InitVect() ;Init8250() ;Escape_Flag = False ;unsigned char y =0 ;WriteString(0,y,com_array[__mscomm],WHITE_BLACK);y+=strlen(com_array[__mscomm]) -2 ;WriteString(0,y,parity_array[__parity_bit],WHITE_BLACK);y+=strlen(parity_array[__parity_bit]) -2 ;WriteString(0,y,baud_array[__baud_init],WHITE_BLACK);y+=strlen(baud_array[__baud_init]) -2 ;WriteString(0,y,char_array[__char_bit],WHITE_BLACK);y+=strlen(char_array[__char_bit]) -2 ;WriteString(0,y,stop_array[__stop_bit],WHITE_BLACK);
}cInterrupt::~cInterrupt(void)
{Restore8259() ;Clear8250() ;RestoreVect() ;
}void cInterrupt::Init8250(void)
{unsigned char c ;_disable() ;c = inp(SREG(BASE,LCR)) ;outp(SREG(BASE,LCR),c|0x80);outp(SREG(BASE,DLL),Baud_Lo);outp(SREG(BASE,DLH),Baud_Hi);outp(SREG(BASE,LCR),Setting);outp(SREG(BASE,MCR),MC_INT | RTS | DTR) ;outp(SREG(BASE,IER),RX_INT);_enable() ;
}void cInterrupt::Clear8250(void)
{_disable() ;outp(SREG(BASE,LCR),inp(SREG(BASE,LCR)) & 0x7F);outp(SREG(BASE,IER),0x00) ;_enable() ;
}void cInterrupt::Init8259(void)
{_disable() ;outp(INTC_MASK,inp(INTC_MASK) & irq_mask) ;_enable() ;
}void cInterrupt::Restore8259(void)
{_disable() ;outp(INTC_MASK,inp(INTC_MASK) | ~irq_mask);_enable() ;
}void cInterrupt::InitVect(void)
{_disable() ;com_old_int = _dos_getvect(COM_Int_Num) ;_dos_setvect(COM_Int_Num,UartInt) ;clock_old_int = _dos_getvect(0x1C) ;_dos_setvect(0x1C,ClockInt) ;_enable() ;
}void cInterrupt::RestoreVect(void)
{_disable() ;_dos_setvect(COM_Int_Num,com_old_int) ;_dos_setvect(0x1C,clock_old_int) ;_enable() ;
}unsigned char cInterrupt::Status8250IIR(void)
{return (inp(SREG(BASE,IIR)) & RX_MASK) ;
}unsigned char cInterrupt::ReadChar(void)
{return (inp(SREG(BASE,RXR))) ;
}void cInterrupt::SendChar(unsigned char ch)
{while ((inp(SREG(BASE,LSR)) & XMTRDY) == 0) ;outp(SREG(BASE,TXR),ch) ;
}void cInterrupt::Run(void)
{cWindows cUp(4,4,10,75,False,BLACK_WHITE,BLACK_GREEN,BLACK_GREEN) ;cUp.WindowInit(" Send Window ","");cWindows cDown(14,4,20,75,False,BLACK_WHITE,BLACK_YELLOW,BLACK_YELLOW) ;cDown.WindowInit(" Recive Window ","");while (!Escape_Flag){Escape_Flag = PressEscapeKey() ;}
}static cInterrupt cClock ;
void far interrupt UartInt(__CPPARGS)
{unsigned char c ;unsigned char ch ;_disable() ;c = cClock.Status8250IIR() ;if ( c & RX_ID){ch = cClock.ReadChar() ;cClock.WriteString(cClock.rdisx,cClock.rdisy++,ch,BLACK_YELLOW) ;if (cClock.rdisy >=74){cClock.rdisy=5;cClock.rdisx++ ;if (cClock.rdisx>=20){cClock.rdisx=15 ;for (unsigned char i=15 ; i<20 ; i++)for (unsigned char j=5 ; j<75 ; j++)cClock.WriteString(i,j,0x20,BLACK_YELLOW) ;}}}outp(INTC_EOI,IRQ_EOI) ;_enable() ;
}void far interrupt ClockInt(__CPPARGS)
{if (cClock.Clock_Times == 0){cClock.Clock_Times = 9 ;for (unsigned char i=0 ; i<16 ; i++){cClock.SendChar(send_array[i]) ;cClock.WriteString(cClock.rdisx_1,cClock.rdisy_1++,send_array[i],BLACK_GREEN) ;if (cClock.rdisy_1 >=74){cClock.rdisy_1=5;cClock.rdisx_1++ ;if (cClock.rdisx_1>=10){cClock.rdisx_1=5 ;for (unsigned char i=5 ; i<10 ; i++)for (unsigned char j=5 ; j<75 ; j++)cClock.WriteString(i,j,0x20,BLACK_GREEN) ;}}}}cClock.Clock_Times-- ;cClock.clock_old_int() ;
}void main(void)
{cClock.Run() ;
}

 

  相关解决方案