b87 #include #include #include #include #include #include #include extern unsigned int vbe_mode; extern unsigned long bytes_per_scanline; extern void far (*win_func)(); extern unsigned long win_size, tail; extern unsigned char num_win; unsigned int x_res, y_res; unsigned int win_granularity; unsigned long image_size; unsigned long egacolor[16] = { 0x000000l, 0x0000AAl, 0x00AA00l, 0x00AAAAl, 0xAA0000l, 0xAA00AAl, 0xAA5500l, 0xAAAAAAl, 0x555555l, 0x5555FFl, 0x55FF55l, 0x55FFFFl, 0xFF5555l, 0xFF55FFl, 0xFFFF55l, 0xFFFFFFl }; int vbeGetInfo(struct VbeInfoBlock *vbe_info) { struct REGPACK regs; regs.r_ax = 0x4f00; regs.r_es = FP_SEG(vbe_info); regs.r_di = FP_OFF(vbe_info); intr(0x10, ®s); } int vbeGetModeInfo(int mode, struct ModeInfoBlock *mode_info) { struct REGPACK regs; regs.r_ax = 0x4f01; regs.r_cx = mode; regs.r_es = FP_SEG(mode_info); regs.r_di = FP_OFF(mode_info); intr(0x10, ®s); } int vbeSetMode(int mode) { union REGS regs; regs.x.ax = 0x4f02; regs.x.bx = mode; int86(0x10, ®s, ®s); } int vbeSetLogicalLineLength(int length) { struct REGPACK regs; regs.r_ax = 0x4f06; regs.r_bx = 0x0000; regs.r_cx = length; intr(0x10, ®s); bytes_per_scanline = (unsigned long)_BX; } int vbeGetLogicalLineLength(void) { struct REGPACK regs; regs.r_ax = 0x4f06; regs.r_bx = 0x0001; intr(0x10, ®s); return _CX; } int vbeSetDisplayStart(int x, int y, int vbsync) { struct REGPACK regs; regs.r_ax = 0x4f07; regs.r_bx = 0x0000 | (vbsync << 7); regs.r_cx = x; regs.r_dx = y; intr(0x10, ®s); } int vbeGetDisplayStart(void) { struct REGPACK regs; regs.r_ax = 0x4f07; regs.r_bx = 0x0001; intr(0x10, ®s); } extern int cur_height[], cur_type; extern unsigned long far *cursor[]; extern unsigned long txt_fgcol; int vbeInit(int mode, int set_mode) { struct ModeInfoBlock modeinfo; union REGS regs; int i, retval; vbe_mode = mode; if(set_mode) { regs.x.ax = 0x4f02; regs.x.bx = vbe_mode; int86(0x10, ®s, ®s); retval = _AX; if(retval != 0x004F) return retval; } vbeGetModeInfo(mode, &modeinfo); x_res = modeinfo.XResolution; y_res = modeinfo.YResolution; bytes_per_scanline = (unsigned long)modeinfo.BytesPerScanLine; win_granularity = modeinfo.WinGranularity; win_size = (unsigned long)modeinfo.WinSize * 1024L; win_func = modeinfo.WinFuncPtr; image_size = (unsigned long)bytes_per_scanline * (unsigned long)y_res; num_win = (unsigned char)(image_size / win_size); tail = image_size - ((unsigned long)num_win * win_size); for(i = 0; i < (8 * cur_height[cur_type]); i++) cursor[cur_type][i] = txt_fgcol; return retval; } int vbeExit(void) { union REGS regs; regs.x.ax = 0x0003; int86(0x10, ®s, ®s); } . 0