-static void
-clear_screen(struct vgamode_s *vmode_g)
-{
- switch (GET_GLOBAL(vmode_g->memmodel)) {
- case MM_TEXT:
- memset16_far(GET_GLOBAL(vmode_g->sstart), 0, 0x0720, 32*1024);
- break;
- case MM_CGA:
- memset16_far(GET_GLOBAL(vmode_g->sstart), 0, 0x0000, 32*1024);
- break;
- default:
- // XXX - old code gets/sets/restores sequ register 2 to 0xf -
- // but it should always be 0xf anyway.
- memset16_far(GET_GLOBAL(vmode_g->sstart), 0, 0x0000, 64*1024);
- }
-}
-
-int
-stdvga_set_mode(int mode, int flags)
-{
- // find the entry in the video modes
- struct vgamode_s *vmode_g = stdvga_find_mode(mode);
- dprintf(1, "mode search %02x found %p\n", mode, vmode_g);
- if (!vmode_g)
- return VBE_RETURN_STATUS_FAILED;
- struct stdvga_mode_s *stdmode_g = container_of(
- vmode_g, struct stdvga_mode_s, info);
-
- // if palette loading (bit 3 of modeset ctl = 0)
- if (!(flags & MF_NOPALETTE)) { // Set the PEL mask
- stdvga_set_pel_mask(GET_GLOBAL(stdmode_g->pelmask));
-
- // From which palette
- u8 *palette_g = GET_GLOBAL(stdmode_g->dac);
- u16 palsize = GET_GLOBAL(stdmode_g->dacsize) / 3;
-
- // Always 256*3 values
- stdvga_set_dac_regs(get_global_seg(), palette_g, 0, palsize);
- u16 i;
- for (i = palsize; i < 0x0100; i++) {
- static u8 rgb[3] VAR16;
- stdvga_set_dac_regs(get_global_seg(), rgb, i, 1);
- }
-
- if (flags & MF_GRAYSUM)
- stdvga_perform_gray_scale_summing(0x00, 0x100);
- }
-
- // Reset Attribute Ctl flip-flop
- inb(VGAREG_ACTL_RESET);
-
- // Set Attribute Ctl
- u8 *regs = GET_GLOBAL(stdmode_g->actl_regs);
- u16 i;
- for (i = 0; i <= 0x13; i++) {
- outb(i, VGAREG_ACTL_ADDRESS);
- outb(GET_GLOBAL(regs[i]), VGAREG_ACTL_WRITE_DATA);
- }
- outb(0x14, VGAREG_ACTL_ADDRESS);
- outb(0x00, VGAREG_ACTL_WRITE_DATA);
-
- // Set Sequencer Ctl
- outb(0, VGAREG_SEQU_ADDRESS);
- outb(0x03, VGAREG_SEQU_DATA);
- regs = GET_GLOBAL(stdmode_g->sequ_regs);
- for (i = 1; i <= 4; i++) {
- outb(i, VGAREG_SEQU_ADDRESS);
- outb(GET_GLOBAL(regs[i - 1]), VGAREG_SEQU_DATA);
- }
-
- // Set Grafx Ctl
- regs = GET_GLOBAL(stdmode_g->grdc_regs);
- for (i = 0; i <= 8; i++) {
- outb(i, VGAREG_GRDC_ADDRESS);
- outb(GET_GLOBAL(regs[i]), VGAREG_GRDC_DATA);
- }
-
- // Set CRTC address VGA or MDA
- u8 miscreg = GET_GLOBAL(stdmode_g->miscreg);
- u16 crtc_addr = VGAREG_VGA_CRTC_ADDRESS;
- if (!(miscreg & 1))
- crtc_addr = VGAREG_MDA_CRTC_ADDRESS;
-
- // Disable CRTC write protection
- outw(0x0011, crtc_addr);
- // Set CRTC regs
- regs = GET_GLOBAL(stdmode_g->crtc_regs);
- for (i = 0; i <= 0x18; i++) {
- outb(i, crtc_addr);
- outb(GET_GLOBAL(regs[i]), crtc_addr + 1);
- }
-
- // Set the misc register
- outb(miscreg, VGAREG_WRITE_MISC_OUTPUT);
-
- // Enable video
- outb(0x20, VGAREG_ACTL_ADDRESS);
- inb(VGAREG_ACTL_RESET);
-
- // Clear screen
- if (!(flags & MF_NOCLEARMEM))
- clear_screen(vmode_g);
-
- // Write the fonts in memory
- u8 memmodel = GET_GLOBAL(vmode_g->memmodel);
- if (memmodel == MM_TEXT)
- stdvga_load_font(get_global_seg(), vgafont16, 0x100, 0, 0, 16);
-
- // Setup BDA variables
- modeswitch_set_bda(mode, flags, vmode_g);
-
- return 0;
-}
-