/********************************************************************** * INT10_HandleVESA * * Handler for VESA functions (int10 function 0x4f). */ static void INT10_HandleVESA( CONTEXT *context ) { BIOSDATA *data = DOSVM_BiosData(); switch(AL_reg(context)) { case 0x00: /* RETURN CONTROLLER INFORMATION */ TRACE( "VESA RETURN CONTROLLER INFORMATION\n" ); { BYTE *ptr = CTX_SEG_OFF_TO_LIN(context, context->SegEs, context->Edi); INT10_FillControllerInformation( ptr ); SET_AL( context, 0x4f ); SET_AH( context, 0x00 ); /* 0x00 = successful 0x01 = failed */ } break; case 0x01: /* RETURN MODE INFORMATION */ TRACE( "VESA RETURN MODE INFORMATION %04x\n", CX_reg(context) ); { struct _ModeInfoBlock *ptr = CTX_SEG_OFF_TO_LIN(context, context->SegEs, context->Edi); SET_AL( context, 0x4f ); if (INT10_FillModeInformation( ptr, CX_reg(context) )) SET_AH( context, 0x00 ); /* status: success */ else SET_AH( context, 0x01 ); /* status: failed */ } break; case 0x02: /* SET SuperVGA VIDEO MODE */ TRACE( "Set VESA video mode %04x\n", BX_reg(context) ); SET_AL( context, 0x4f ); /* function supported */ if (INT10_SetVideoMode( data, BX_reg(context) )) SET_AH( context, 0x00 ); /* success */ else SET_AH( context, 0x01 ); /* failed */ break; case 0x03: /* VESA SuperVGA BIOS - GET CURRENT VIDEO MODE */ SET_AL( context, 0x4f ); SET_AH( context, 0x00 ); SET_BX( context, INT10_GetHeap()->VesaCurrentMode ); break; case 0x04: /* VESA SuperVGA BIOS - SAVE/RESTORE SuperVGA VIDEO STATE */ ERR("VESA SAVE/RESTORE Video State - Not Implemented\n"); /* AL_reg(context) = 0x4f; = supported so not set since not implemented */ /* maybe we should do this instead ? */ /* AH_reg(context = 0x01; not implemented so just fail */ break; case 0x05: /* VESA SuperVGA BIOS - CPU VIDEO MEMORY CONTROL */ /* * This subfunction supports only Window A (BL_reg == 0) and * it assumes that window granularity is 64k. */ switch(BH_reg(context)) { case 0x00: /* select video memory window */ SET_AL( context, 0x4f ); /* function supported */ if(BL_reg(context) == 0) { VGA_SetWindowStart(DX_reg(context) * 64 * 1024); SET_AH( context, 0x00 ); /* status: successful */ } else SET_AH( context, 0x01 ); /* status: failed */ break; case 0x01: /* get video memory window */ SET_AL( context, 0x4f ); /* function supported */ if(BL_reg(context) == 0) { SET_DX( context, VGA_GetWindowStart() / 64 / 1024 ); SET_AH( context, 0x00 ); /* status: successful */ } else SET_AH( context, 0x01 ); /* status: failed */ break; default: INT_BARF( context, 0x10 ); } break; case 0x06: /* VESA GET/SET LOGICAL SCAN LINE LENGTH */ ERR("VESA GET/SET LOGICAL SCAN LINE LENGTH - Not Implemented\n"); /* AL_reg(context) = 0x4f; = supported so not set since not implemented */ /* maybe we should do this instead ? */ /* AH_reg(context = 0x001; not implemented so just fail */ break; case 0x07: /* GET/SET DISPLAY START */ ERR("VESA GET/SET DISPLAY START - Not Implemented\n"); /* AL_reg(context) = 0x4f; = supported so not set since not implemented */ /* maybe we should do this instead ? */ /* AH_reg(context = 0x001; not implemented so just fail */ break; case 0x08: /* GET/SET DAC PALETTE CONTROL */ ERR("VESA GET/SET DAC PALETTE CONTROL- Not Implemented\n"); /* AL_reg(context) = 0x4f; = supported so not set since not implemented */ /* maybe we should do this instead ? */ /* AH_reg(context = 0x001; not implemented so just fail */ break; case 0x09: /* SET PALETTE ENTRIES */ FIXME("VESA Set palette entries - not implemented\n"); break; case 0x0a: /* GET PROTECTED-MODE CODE */ FIXME("VESA Get protected-mode code - not implemented\n"); break; case 0x10: /* Display Power Management Extensions */ FIXME("VESA Display Power Management Extensions - not implemented\n"); break; case 0xef: /* get video mode for hercules-compatibles */ /* There's no reason to really support this */ /* is there?....................(A.C.) */ TRACE("Just report the video not hercules compatible\n"); SET_DX( context, 0xffff ); break; case 0xff: /* Turn VESA ON/OFF */ /* I don't know what to do */ break; default: FIXME("VESA Function (0x%x) - Not Supported\n", AH_reg(context)); break; } }
BYTE VGA_ioport_in( WORD port ) { BYTE ret; switch (port) { case 0x3c1: FIXME("Unsupported index, register 0x3c0: 0x%02x\n", vga_index_3c0); return 0xff; case 0x3c5: switch(vga_index_3c4) { case 0x04: /* Sequencer: Memory Mode Register */ return (VGA_GetWindowStart() == -1) ? 0xf7 : 0xff; default: FIXME("Unsupported index, register 0x3c4: 0x%02x\n", vga_index_3c4); return 0xff; } case 0x3cf: FIXME("Unsupported index, register 0x3ce: 0x%02x\n", vga_index_3ce); return 0xff; case 0x3d5: FIXME("Unsupported index, register 0x3d4: 0x%02x\n", vga_index_3d4); return 0xff; case 0x3da: /* * Read from this register resets register 0x3c0 address flip-flop. */ vga_address_3c0 = TRUE; /* * Read from this register returns following bits: * xxxx1xxx = Vertical retrace in progress if set. * xxxxx1xx = Light pen switched on. * xxxxxx1x = Light pen trigger set. * xxxxxxx1 = Either vertical or horizontal retrace * in progress if set. */ ret = 0; if (vga_retrace_vertical) ret |= 9; if (vga_retrace_horizontal) ret |= 3; /* * If VGA mode has been set, vertical retrace is * turned on once a frame and cleared after each read. * This might cause applications that synchronize with * vertical retrace to actually skip one frame but that * is probably not a problem. * * If no VGA mode has been set, vertical retrace is faked * by toggling the value after every read. */ if (VGA_IsTimerRunning()) vga_retrace_vertical = FALSE; else vga_retrace_vertical = !vga_retrace_vertical; /* * Toggle horizontal retrace. */ vga_retrace_horizontal = !vga_retrace_horizontal; break; default: ret=0xff; FIXME("Unsupported VGA register: 0x%04x\n", port); } return ret; }