📄 nvesa.h
字号:
{
mode_info_t mode_info;
struct SREGS segs;
union REGS r;
int mode = 0;
int temp;
unsigned min_mode = 0x100;
unsigned max_mode = 0x1ff;
unsigned far *p = &min_mode;
char far *modeinfo = (char far *)&mode_info;
refresh += 0; /*该参数暂时未使用*/
if (g_vbe_version < 0)
{
#ifndef NEO_sys_report_error_unused
Errinfo_t error = {"set_video_mode", N_NEO_NOT_INIT, 0};
throw_error(error);
#endif
}
temp = (flags & 0xff80) >> 7;
if (temp == 0)
{
for (; *p < max_mode; (*p)++)
{
if (get_mode_info(*p, modeinfo))
{
if (w == mode_info.x_resolution && h == mode_info.y_resolution && bpp == mode_info.bits_per_pixel)
{
mode = *p;
break;
}
}
}
if (mode == 0)
{
#ifndef NEO_sys_report_error_unused
Errinfo_t error = {"set_video_mode", ERR_VIDEO_MODE, 1};
throw_error(error);
return FALSE;
#endif
}
}
else
{
if (!get_mode_info(mode = temp, modeinfo))
{
return FALSE;
}
}
/*线性寻址 real_mode |= 0x4000;*/
/*调整刷新率real_mode |= 0x0800;*/
/*{
CRTC_T crtc;
unsigned long vclk;
double f0;
_refresh_rate_request = refresh;
calc_crtc_timing(&crtc, w, h, 0, 0);
vclk = (double)crtc.horizontal_total * crtc.vertical_total * _refresh_rate_request;
vclk = get_closest_pixel_clock(vesa_mode, vclk);
if (vclk != 0) {
f0 = (double)vclk / (crtc.horizontal_total * crtc.vertical_total);
_set_current_refresh_rate((int)(f0 + 0.5));
crtc.pixel_clock = vclk;
crtc.refresh_rate = _refresh_rate_request * 100;
r.x.di = FP_OFF(&crtc);
segs.es = FP_SEG(&crtc);
}
}*/
if (mode >= 0x100)
{ /*mode |= 0x0800;*/
mode |= g_clear_vram;
/*切换到指定图形模式*/
r.x.ax = 0x4f02;
r.x.bx = mode;
int86x(0x10, &r, &r, &segs);
if (r.x.ax != 0x4F) return FALSE; /*切换失败*/
}
else
{
if (mode == 0x13)/*该模式不支持硬件换页机制*/
{
r.h.ah=0;
r.h.al=mode;
int86(0x10,&r,&r);
g_color_depth = 8;
g_color_byte = (char)(g_color_depth / 7);
g_rect_left = g_rect_top = 0;
g_rect_right = (g_screen_h = 320) - 1;
g_rect_bottom = (g_screen_v = 200) - 1;
g_screen_size = g_screen_h * g_screen_v;
g_tptcolor = MASK_COLOR_8;
screen(0, 0, g_rect_right, g_rect_bottom);
#ifndef NEO_color_depth_8_unused
#ifndef NEO_palette_unused
update_sys_pal();
#endif
#endif
return TRUE;
}
else
return FALSE; /* 忽略其它非VESA标准模式*/
}
g_videoptr = (char far *)MK_FP(0xa000, 0);
g_green_mask = mode_info.green_mask_size;
g_color_depth = mode_info.bits_per_pixel;
g_color_byte = (char)(g_color_depth / 7);
g_rect_left = g_rect_top = 0;
g_rect_right = (g_screen_h = mode_info.x_resolution) - 1;
g_rect_bottom = (g_screen_v = mode_info.y_resolution) - 1;
g_screen_size = g_screen_h * g_screen_v;
g_page_num = get_page_num();
screen(0, 0, g_rect_right, g_rect_bottom);
g_total_surfaces = mode_info.number_of_image_pages * 2;
if (mode == 0x101) g_total_surfaces += 3;
else if (mode == 0x116 || mode == 0x117) g_total_surfaces = 3; /*处理特殊情况*/
else if (mode == 0x10e || mode == 0x111 || mode == 0x103) g_total_surfaces += 1;
if (g_page_num == -1)
{
g_page_num = g_screen_size / (bpp * 0xffff) + 1;
}
switch (g_color_depth)
{
case 8:
g_tptcolor = MASK_COLOR_8;
#ifndef NEO_color_depth_8_unused
#ifndef NEO_palette_unused
update_sys_pal();
#endif
#endif
break;
case 15:
g_tptcolor = MASK_COLOR_15;
g_green_bit= 3;
break;
case 16:
g_tptcolor = MASK_COLOR_16;
g_green_bit= 2;
break;
/*case 24:
g_tptcolor = TPT24;
break;
case 32:
g_tptcolor = TPT32;
break;*/
default:
g_tptcolor = TPT8;
break;
}
g_routines |= 1;
return TRUE;
}
/*获得SVGA的显示模式*/
int get_vbe_mode(void)
{
_AX = 0x4f03;
__int__(0x10);
return _BX;
}
void set_vga_mode(int mode)
{
_AX = mode; /*回到VGA模式下*/
__int__(0x10);
}
char get_page_num(void)
{
char pages[28] = {4, 5, 4, 8, 6, 12, 10, 20, -1, -1, -1, -1, -1, 2, 2, 3, 10, 10, 15,
15, 15, 22, 24, 24, 36, 40, 40, 60};
int tmp;
_AX = 0x4f03;
__int__(0x10);
tmp = _BX;
if (tmp >= 0x100 && tmp <= 0x11c)
{
return pages[tmp - 256];
}
else if (tmp == 0x13)
{
return 1;
}
return -1;
}
/*设置扫描线的起点*/
void set_display_start(unsigned fir_scan_dot, unsigned fir_scan_line)
{
union REGS r;
r.x.ax = 0x4f07;
r.x.bx = 0;
r.x.cx = fir_scan_dot;
r.x.dx = fir_scan_line;
int86(0x10, &r, &r);
}
/*指定剪切输出域(包括边线)*/
char screen_rect(int left, int top, int right, int bottom)
{
if(left>g_screen_h||top>g_screen_v||right<0||bottom<0||right<=left||bottom<=top)
{return -1;}
#ifndef NEO_rect_unused
if (left < 0)
{left = 0;}
if (top < 0)
{top = 0;}
if (right >= g_screen_h)
{right = g_screen_h - 1;}
if (bottom >=g_screen_v)
{bottom = g_screen_v - 1;}
g_rect_left = left;
g_rect_right = right;
g_rect_top = top;
g_rect_bottom= bottom;
#else
g_rect_left = left = g_rect_top = top = 0;
g_rect_right = right= g_screen_h - 1;
g_rect_bottom= bottom=g_screen_v - 1;
#endif
return 0;
}
#ifndef NEO_rect_unused
void rect_store(void)
{
g_temp_top = g_rect_top;
g_temp_left= g_rect_left;
g_temp_right = g_rect_right;
g_temp_bottom= g_rect_bottom;
}
void rect_restore(void)
{
g_rect_top = g_temp_top;
g_rect_left= g_temp_left;
g_rect_right = g_temp_right;
g_rect_bottom= g_temp_bottom;
}
#endif
/*显存换页函数*/
void set_vbe_page(int page)
{
if (g_cur_vbe_page != page)
{
_BX = 0;
_DX = g_cur_vbe_page = page;
_AX = 0x4f05;
__int__(0x10);
}
}
/*下面这个函数功能与上面一样,但效率似乎更高些*/
/*void set_vbe_page(int page)
{
if (g_cur_vbe_page != page)
{
_BX=0;
_DX=g_cur_vbe_page = page;
g_win_func();
}
}*/
/*void set_logic_scanl_len(unsigned length)
{
union REGS r;
r.x.ax=0x4F06;*/
/* BL = 00h Set Scan Line Length in Pixels
= 01h Get Scan Line Length
= 02h Set Scan Line Length in Bytes
= 03h Get Maximum Scan Line Length */
/*r.h.bl = 0;
r.x.cx = length;
int86(0x10, &r, &r);
}*/
#ifndef NEO_surface_unused
char surface_alloc(unsigned sur_num, int clear_flag)
{
g_alloc_surface = (sur_num <= g_total_surfaces? sur_num : g_total_surfaces);
if (clear_flag)
{
int i;
#ifndef NEO_rect_unused
rect_store();
#endif
screen(0, 0, g_screen_h - 1, g_screen_v - 1);
for (i = 1; i <= g_alloc_surface; ++i)
{
set_work_surface(i);
#ifndef NEO_basic_draw_unused
rectfill(0, 0, g_rect_right, g_rect_bottom, 0);
#endif
}
#ifndef NEO_rect_unused
rect_restore();
#endif
set_work_surface(0);
}
return g_alloc_surface;
}
char set_work_surface(unsigned sur_num)
{
if (sur_num <= g_alloc_surface && sur_num > 0)
{
g_sl_offset = g_screen_v * ((g_work_surface = sur_num) - 1) + (g_screen_v * g_reserved_page)/*跳过系统保留页*/;
}
else
{
g_work_surface = g_sl_offset = 0;
}
return g_work_surface;
}
char flip_surface(unsigned sur_num)
{ /*跳过系统保留页*/
unsigned temp = (sur_num <= g_alloc_surface && sur_num > 0)?g_screen_v * (sur_num - 1) + (g_screen_v * g_reserved_page) : 0;
#ifndef NEO_draw_smooth_unused
vsync();
#endif
if (g_routines & 2)
{
#ifndef NEO_mouse_adv_unused
hide_mouse(); /*隐藏Patch原来的光标*/
#endif
}
set_display_start(0, temp);
g_look_surface = (sur_num <= g_alloc_surface?sur_num : 0);
if (g_routines & 2)
{
#ifndef NEO_mouse_adv_unused
show_mouse(); /*绘制redraw新的光标*/
#endif
}
return g_look_surface;
}
void flip(void)
{
static unsigned last = 0; /*跳过系统保留页*/
#ifndef NEO_draw_smooth_unused
vsync();
#endif
if (g_routines & 2)
{
#ifndef NEO_mouse_adv_unused
hide_mouse();
#endif
}
set_display_start(0, last = (last == 0?g_screen_v * g_reserved_page : 0));
g_look_surface = last != 0?1 : 0;
if (g_routines & 2)
{
#ifndef NEO_mouse_adv_unused
show_mouse();
#endif
}
}
#endif
#ifndef NEO_draw_mode_unused
void set_draw_mode(int draw_mode)
{
if ((draw_mode>=COPY_PUT)&&(draw_mode<=NOT_PUT)) g_draw_mode=draw_mode;
}
#endif
void vsync(void)
{
while ( inportb(0x3da)&0x08 ) ;
while (!(inportb(0x3da)&0x08)) ;
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -