www.pudn.com > cwin.rar > INITENV.C
/*------------------------------------------------------------------
函数 init_hanenv : 初始化 HANENV 系统
------------------------------------------------------------------*/
#include
/*-- 全局变量定义 ------------------------------------------------*/
#ifndef ERR_NO
#define ERR_NO
int _ErrorNo = 0;
#endif
int _ScreenTop = 0; /* 当前屏幕首行位置 */
int _ScreenWidth = 80; /* 逻辑屏幕宽度(以字节为单位) */
int _ScreenHigh = 480; /* 逻辑屏幕高度(以象素为单位) */
int _WindowLeft = 0; /* 屏幕显示窗口列坐标 */
int _WindowTop = 0; /* 屏幕显示窗口行坐标 */
int _WindowHigh = 480; /* 屏幕显示窗口高度 */
int _MouseLeft = 0; /* 鼠标活动左边界 */
int _MouseTop = 0; /* 鼠标活动上边界 */
int _MouseRight = 639; /* 鼠标活动右边界 */
int _MouseBottom = 479; /* 鼠标活动下边界 */
int _MouseSpeed = 200; /* 鼠标响应速度 */
int _TextCol = 0; /* 光标当前列 */
int _TextLine = 0; /* 光标当前行 */
int _TextWinLeft = 0; /* 正文窗口左边界 */
int _TextWinTop = 0; /* 正文窗口上边界 */
int _TextWinRight = 79; /* 正文窗口右边界 */
int _TextWinBottom = 480; /* 正文窗口下边界 */
int _TextColor = LIGHTGRAY; /* 正文字符颜色 */
int _Background = BLACK; /* 正文区背景色 */
int _EditColor = BLACK; /* 编辑字符颜色 */
int _EditBk = LIGHTGRAY; /* 编辑区背景色 */
int _TitleColor = WHITE; /* 标题字符颜色 */
int _TitleBk = BLUE; /* 标题区背景色 */
int _TabColor = RED; /* 表格颜色 */
int _TabBk = WHITE; /* 表格背景色 */
int _Xtimes = 1; /* 横向放大倍数 */
int _Ytimes = 1; /* 纵向放大倍数 */
int _VideoBusy = NO; /* 显示卡寄存器组工作标志 */
HZK *_CurrentHZK = NULL; /* 当前汉字库 */
int _BoxLineColor = BLACK; /* 框线颜色 */
unsigned _BarColor = GRAY_BAR; /* 按键颜色 */
void interrupt far (*_Oldint1CH)(); /* 原BIOS 中断INT1CH 地址 */
void interrupt far (*_Oldint09H)(); /* 原BIOS 中断INT09H 地址 */
void interrupt far (*_Oldint23H)(); /* 原中断 INT23H(^C) 地址 */
void far (*_Int1CHfun[10])(); /* 时钟处理程序向量 */
extern void _Cdecl _SmoothScroll(int x,int y);
extern void _Cdecl set_mode_ctrl(void);
/*-----------------------------------------------------------
函数 emptyfunction : 空函数,用于定时器中
-----------------------------------------------------------*/
unsigned _Cdecl emptyfunction(unsigned h)
{
return h;
}
/*-----------------------------------------------------------
函数 _Newint1CH : 新1CH中断处理
-----------------------------------------------------------*/
void interrupt _Newint1CH(void)
{
static int i;
for(i = 0;i < 10; i++)
if(_Int1CHfun[i])
(*_Int1CHfun[i])();
(*_Oldint1CH)();
}
/*-----------------------------------------------------------
函数 _Newint23H : 新23H中断处理(^C & ^Break)
-----------------------------------------------------------*/
void interrupt _Newint09H(void)
{
unsigned char ch = inportb(0x60);
unsigned char excode = peekb(0x40,0x17);
if((ch==224 || ch==46) && excode&4)
pokeb(0x40,0x17,excode&0xfb);
(*_Oldint09H)();
}
/*-----------------------------------------------------------
函数 _Newint23H : 新23H中断处理(^C & ^Break)
-----------------------------------------------------------*/
void interrupt _Newint23H(void)
{
}
/*-----------------------------------------------------------
函数 init_hanenv : 初始化HANENV系统的汉字处理环境
-----------------------------------------------------------*/
void _Cdecl init_hanenv(void)
{
int i;
/*-- 存储原西文屏幕信息 ---------------*/
_SaveEnv();
/*- 设置VGA的图形模式12H(640×480×16) */
_AH = 0x00;
_AL = 0x12;
geninterrupt(0x10);
/*-- 设置逻辑屏幕宽度 -----------------*/
if(_ScreenWidth > 80)
{
_VideoBusy = YES;
outportb(0x3d4,0x13);
outportb(0x3d5,_ScreenWidth/2);
poke(0,0x44a,_ScreenWidth);
set_mode_ctrl();
_SmoothScroll(_WindowLeft,_ScreenTop);
_VideoBusy = NO;
}
/*-- 设置屏幕分割 ---------------------*/
if(_WindowHigh<480)
{
_SplitScreen(_WindowHigh);
_ScreenTop = 480-_WindowHigh;
smooth_scroll(_WindowLeft,_ScreenTop);
}
/*-- 设置鼠标 -------------------------*/
reset_mouse();
set_mouse_range(0,0,_ScreenWidth*8-1,_ScreenHigh-1);
light_mouse();
/*-- 设置新的BIOS中断1CH --------------*/
_Triggers[0].press_key = 1; /* 触发器0专为定时器而保留 */
_Triggers[0].trigger = emptyfunction;
for(i=0;i<10;i++)
_Int1CHfun[i] = NULL;
_Oldint1CH = getvect(0x1c); /* 保存原中断1CH的指针 */
setvect(0x1c,_Newint1CH);
/*-- 设置新的中断23H ------------------*/
_Oldint09H = getvect(0x09);
setvect(0x09,_Newint09H);
_Oldint23H = getvect(0x23);
setvect(0x23,_Newint23H);
}