/* tej - changed return type to void as nothing returned */ static void InitMFS(void) { FAR_PTR LOL; FAR_PTR SDA; unsigned char _osmajor; unsigned char _osminor; state_t preg; LOL = GetListOfLists(); SDA = GetSDAPointer(); /* now get the DOS version */ pre_msdos(); HI(ax) = 0x30; call_msdos(); _osmajor = LO(ax); _osminor = HI(ax); post_msdos(); /* get DOS version into CX */ preg.ecx = _osmajor | (_osminor <<8); preg.edx = FP_OFF16(LOL); preg.es = FP_SEG16(LOL); preg.esi = FP_OFF16(SDA); preg.ds = FP_SEG16(SDA); preg.ebx = 0x500; mfs_helper(&preg); }
/* Restore and write chipset-specific registers */ static void vesa_restore_ext_regs(u_char xregs[], u_short xregs16[]) { void *lowmem; unsigned long current_int10; if (xregs16[0] == 0) return; lowmem = lowmem_heap_alloc(xregs16[0]); memcpy(lowmem, xregs, xregs16[0]); vesa_r.eax = 0x4f04; vesa_r.ebx = 0; vesa_r.es = FP_SEG32(lowmem); vesa_r.edx = 2; vesa_r.ecx = VESA_SAVE_BITMAP; /* swap int10 vectors with the original int10 vector as it was when the registers were saved to avoid conflicts with univbe */ current_int10 = MK_FP16(ISEG(0x10), IOFF(0x10)); SETIVEC(0x10, xregs16[2], xregs16[1]); do_int10_callback(&vesa_r); SETIVEC(0x10, FP_SEG16(current_int10), FP_OFF16(current_int10)); lowmem_heap_free(lowmem); }
/* vesa_reinit: a function to reinitialize in case the DOS VESA driver changes at runtime (e.g. univbe). Also called at startup */ static void vesa_reinit(void) { unsigned char *vbe_buffer, *info_buffer, *s; vesa_int10 = MK_FP16(ISEG(0x10), IOFF(0x10)); vbe_buffer = info_buffer = lowmem_heap_alloc(VBE_viSize+VBE_vmSize); vesa_r.eax = 0x4f00; vesa_r.es = FP_SEG32(vbe_buffer); vesa_r.edi = 0; VBE_viVBESig = 0x32454256; /* "VBE2" */ do_int10_callback(&vesa_r); if ((vesa_r.eax & 0xffff) != 0x4f || VBE_viVBESig != 0x41534556 /* "VESA" */ ) { v_printf("No VESA bios detected!\n"); if (config.gfxmemsize < 0) config.gfxmemsize = 256; vesa_regs_size = 0; vesa_linear_vbase = 0; goto out; } /* check if the VESA BIOS has changed */ s = MK_FP32(FP_SEG16(VBE_viOEMID), FP_OFF16(VBE_viOEMID)); if (vesa_oemstring && VBE_viOEMID == vesa_oemid && strcmp(s, vesa_oemstring) == 0) goto out; vesa_oemid = VBE_viOEMID; if (vesa_oemstring) free(vesa_oemstring); vesa_oemstring = strdup(s); if (config.gfxmemsize < 0) config.gfxmemsize = VBE_viMemory*64; vesa_version = VBE_viVESAVersion; vbe_buffer += VBE_viSize; memset(&vesa_r, 0, sizeof(vesa_r)); vesa_granularity = 64; vesa_read_write = 6; vesa_linear_vbase = 0; vesa_r.eax = 0x4f01; vesa_r.ecx = vesa_version >= 0x200 ? 0x81ff : 0x101; vesa_r.es = (size_t)vbe_buffer >> 4; vesa_r.edi = (size_t)vbe_buffer & 0xf; do_int10_callback(&vesa_r); if ((vesa_r.eax & 0xffff) == 0x4f) { vesa_granularity= VBE_vmWinGran; vesa_read_write = VBE_vmWinAAttrib & 6; if (vesa_version >= 0x200 && (VBE_vmModeAttrib & 0x80) && config.pci_video) { vesa_linear_vbase = (size_t)get_hardware_ram(VBE_vmPhysBasePtr); v_printf("VESA: physical base = %x, virtual base = %zx\n", VBE_vmPhysBasePtr, vesa_linear_vbase); } } else { v_printf("VESA: Can't get mode info\n"); } /* if not reported then guess */ if (vesa_granularity == 0) vesa_granularity = 64; vesa_regs_size = 0; vesa_r.eax = 0x4f04; vesa_r.edx = 0; vesa_r.ecx = VESA_SAVE_BITMAP; vesa_r.ebx = 0; do_int10_callback(&vesa_r); if ((vesa_r.eax & 0xffff) == 0x4f) vesa_regs_size = vesa_r.ebx * 64; out: lowmem_heap_free(info_buffer); v_printf("VESA: memory size = %lu, regs_size=%x\n", config.gfxmemsize, vesa_regs_size); }