📄 pc.c.rtf
字号:
PC.H
*********************************************************************************************************
* CONSTANTS
* COLOR ATTRIBUTES FOR VGA MONITOR
*Description: These #defines are used in the PC_Disp???() functions. The 'color' argument in these
* function MUST specify a 'foreground' color, a 'background' and whether the display will
* blink or not. If you don't specify a background color, BLACK is assumed. You would
* specify a color combination as follows:
* PC_DispChar(0, 0, 'A', DISP_FGND_WHITE + DISP_BGND_BLUE + DISP_BLINK);
* To have the ASCII character 'A' blink with a white letter on a blue background.
*********************************************************************************************************
#define DISP_FGND_BLACK 0x00
#define DISP_FGND_BLUE 0x01
#define DISP_FGND_GREEN 0x02
#define DISP_FGND_CYAN 0x03
#define DISP_FGND_RED 0x04
#define DISP_FGND_PURPLE 0x05
#define DISP_FGND_BROWN 0x06
#define DISP_FGND_LIGHT_GRAY 0x07
#define DISP_FGND_DARK_GRAY 0x08
#define DISP_FGND_LIGHT_BLUE 0x09
#define DISP_FGND_LIGHT_GREEN 0x0A
#define DISP_FGND_LIGHT_CYAN 0x0B
#define DISP_FGND_LIGHT_RED 0x0C
#define DISP_FGND_LIGHT_PURPLE 0x0D
#define DISP_FGND_YELLOW 0x0E
#define DISP_FGND_WHITE 0x0F
#define DISP_BGND_BLACK 0x00
#define DISP_BGND_BLUE 0x10
#define DISP_BGND_GREEN 0x20
#define DISP_BGND_CYAN 0x30
#define DISP_BGND_RED 0x40
#define DISP_BGND_PURPLE 0x50
#define DISP_BGND_BROWN 0x60
#define DISP_BGND_LIGHT_GRAY 0x70
#define DISP_BLINK 0x80
void PC_DispClrScr(INT8U bgnd_color);
void PC_DispClrLine(INT8U y, INT8U bgnd_color);
void PC_DispChar(INT8U x, INT8U y, INT8U c, INT8U color);
void PC_DispStr(INT8U x, INT8U y, INT8U *s, INT8U color);
void PC_DOSReturn(void);
void PC_DOSSaveReturn(void);
void PC_ElapsedInit(void);
void PC_ElapsedStart(void);
INT16U PC_ElapsedStop(void);
void PC_GetDateTime(char *s);
BOOLEAN PC_GetKey(INT16S *c);
void PC_SetTickRate(INT16U freq);
void *PC_VectGet(INT8U vect);
void PC_VectSet(INT8U vect, void (*isr)(void));
PC.C
#include "includes.h"
#define DISP_BASE 0xB800 /* Base segment of display (0xB800=VGA, 0xB000=Mono) */
#define DISP_MAX_X 80 /* Maximum number of columns */
#define DISP_MAX_Y 25 /* Maximum number of rows */
#define TICK_T0_8254_CWR 0x43 /* 8254 PIT Control Word Register address. */
#define TICK_T0_8254_CTR0 0x40 /* 8254 PIT Timer 0 Register address. */
#define TICK_T0_8254_CTR1 0x41 /* 8254 PIT Timer 1 Register address. */
#define TICK_T0_8254_CTR2 0x42 /* 8254 PIT Timer 2 Register address. */
#define TICK_T0_8254_CTR0_MODE3 0x36 /* 8254 PIT Binary Mode 3 for Counter 0 control word. */
#define TICK_T0_8254_CTR2_MODE0 0xB0 /* 8254 PIT Binary Mode 0 for Counter 2 control word. */
#define TICK_T0_8254_CTR2_LATCH 0x80 /* 8254 PIT Latch command control word */
#define VECT_TICK 0x08 /* Vector number for 82C54 timer tick */
#define VECT_DOS_CHAIN 0x81 /* Vector number used to chain DOS */
static INT16U PC_ElapsedOverhead;
static jmp_buf PC_JumpBuf;
static BOOLEAN PC_ExitFlag;
void (*PC_TickISR)(void);
*********************************************************************************************************
* CLEAR SCREEN
*
* Description : This function clears the PC's screen by directly accessing video RAM instead of using
* the BIOS. It assumed that the video adapter is VGA compatible. Video RAM starts at
* absolute address 0x000B8000. Each character on the screen is composed of two bytes:
* the ASCII character to appear on the screen followed by a video attribute. An attribute
* of 0x07 displays the character in WHITE with a black background.
* Arguments : color specifies the foreground/background color combination to use (see PC.H for available choices)
*********************************************************************************************************
void PC_DispClrScr (INT8U color)
{
INT8U far *pscr;
INT16U i;
pscr = MK_FP(DISP_BASE, 0x0000);
for (i = 0; i < (DISP_MAX_X * DISP_MAX_Y); i++) { /* PC display has 80 columns and 25 lines */
*pscr++ = ' '; /* Put ' ' character in video RAM */
*pscr++ = color; /* Put video attribute in video RAM */
}
}
*********************************************************************************************************
* CLEAR A LINE
* Description : This function clears one of the 25 lines on the PC's screen by directly accessing video
* RAM instead of using the BIOS. It assumed that the video adapter is VGA compatible.
* Video RAM starts at absolute address 0x000B8000. Each character on the screen is
* composed of two bytes: the ASCII character to appear on the screen followed by a video
* attribute. An attribute of 0x07 displays the character in WHITE with a black background.
*Arguments : y corresponds to the desired line to clear. Valid line numbers are from
* 0 to 24. Line 0 corresponds to the topmost line.
* color specifies the foreground/background color combination to use
* (see PC.H for available choices)
**********************************************************************************************************
void PC_DispClrLine (INT8U y, INT8U color)
{
INT8U far *pscr;
INT8U i;
pscr = MK_FP(DISP_BASE, (INT16U)y * DISP_MAX_X * 2);
for (i = 0; i < DISP_MAX_X; i++) {
*pscr++ = ' '; /* Put ' ' character in video RAM */
*pscr++ = color; /* Put video attribute in video RAM */
}
}
*********************************************************************************************************
* DISPLAY A SINGLE CHARACTER AT 'X' & 'Y' COORDINATE
*Description : This function writes a single character anywhere on the PC's screen. This function
* writes directly to video RAM instead of using the BIOS for speed reasons. It assumed
* that the video adapter is VGA compatible. Video RAM starts at absolute address
* 0x000B8000. Each character on the screen is composed of two bytes: the ASCII character
* to appear on the screen followed by a video attribute. An attribute of 0x07 displays
* the character in WHITE with a black background.
*Arguments : x corresponds to the desired column on the screen. Valid columns numbers are from
* 0 to 79. Column 0 corresponds to the leftmost column.
* y corresponds to the desired row on the screen. Valid row numbers are from 0 to 24.
* Line 0 corresponds to the topmost row.
* c Is the ASCII character to display. You can also specify a character with a
* numeric value higher than 128. In this case, special character based graphics
* will be displayed.
* color specifies the foreground/background color to use (see PC.H for available choices)
* and whether the character will blink or not.
*
*********************************************************************************************************
void PC_DispChar (INT8U x, INT8U y, INT8U c, INT8U color)
{
INT8U far *pscr;
INT16U offset;
offset = (INT16U)y * DISP_MAX_X * 2 + (INT16U)x * 2; /* Calculate position on the screen */
pscr = MK_FP(DISP_BASE, offset);
*pscr++ = c; /* Put character in video RAM */
*pscr = color; /* Put video attribute in video RAM */
}
*********************************************************************************************************
* DISPLAY A STRING AT 'X' & 'Y' COORDINATE
* Description : This function writes an ASCII string anywhere on the PC's screen. This function writes
* directly to video RAM instead of using the BIOS for speed reasons. It assumed that the
* video adapter is VGA compatible. Video RAM starts at absolute address 0x000B8000. Each
* character on the screen is composed of two bytes: the ASCII character to appear on the
* screen followed by a video attribute. An attribute of 0x07 displays the character in
* WHITE with a black background.
* Arguments : x corresponds to the desired column on the screen. Valid columns numbers are from
* 0 to 79. Column 0 corresponds to the leftmost column.
* y corresponds to the desired row on the screen. Valid row numbers are from 0 to 24.
* Line 0 corresponds to the topmost row.
* s Is the ASCII string to display. You can also specify a string containing
* characters with numeric values higher than 128. In this case, special character
* based graphics will be displayed.
* color specifies the foreground/background color to use (see PC.H for available choices)
* and whether the characters will blink or not.
**********************************************************************************************************
void PC_DispStr (INT8U x, INT8U y, INT8U *s, INT8U color)
{
INT8U far *pscr;
INT16U offset;
offset = (INT16U)y * DISP_MAX_X * 2 + (INT16U)x * 2; /* Calculate position of 1st character */
pscr = MK_FP(DISP_BASE, offset);
while (*s) {
*pscr++ = *s++; /* Put character in video RAM */
*pscr++ = color; /* Put video attribute in video RAM */
}
}
*********************************************************************************************************
* RETURN TO DOS
*Description : This functions returns control back to DOS by doing a 'long jump' back to the saved
* location stored in 'PC_JumpBuf'. The saved location was established by the function
* 'PC_DOSSaveReturn()'. After execution of the long jump, execution will resume at the
* line following the 'set jump' back in 'PC_DOSSaveReturn()'. Setting the flag
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -