int vbe_get_mode_info(unsigned short mode, vbe_mode_info_t *vmi_p) { struct reg86u reg86; mmap_t memory; lm_init(); lm_alloc(VBE_MODE_INFO_SIZE, &memory); reg86.u.w.ax = 0x4F01; reg86.u.w.cx = 1 << 14 | mode; reg86.u.w.es = PB2BASE(memory.phys); reg86.u.w.di = PB2OFF(memory.phys); reg86.u.b.intno = 0x10; if(sys_int86(®86) != OK){ printf("vbe_get_mode_info: sys_int86() failed \n"); return 1; } memcpy(vmi_p, memory.virtual, VBE_MODE_INFO_SIZE); lm_free(&memory); return 0; }
int vbe_get_mode_info(unsigned short mode, vbe_mode_info_t *vmi_p) { mmap_t map; if (lm_alloc(sizeof(vbe_mode_info_t), &map) == NULL) { return 1; } struct reg86u reg86; reg86.u.b.intno = VBE_INTERRUPT_VECTOR; /* BIOS video services */ reg86.u.b.ah = VBE_FUNCTION; reg86.u.b.al = VBE_RETURN_VBE_MODE_INFO; reg86.u.w.cx = mode; reg86.u.w.es = PB2BASE(map.phys); reg86.u.w.di = PB2OFF(map.phys); if (sys_int86(®86) == OK) { if (reg86.u.w.ax == VBE_FUNCTION_SUPPORTED | VBE_FUNCTION_CALL_SUCCESSFUL) { *vmi_p = *((vbe_mode_info_t *)map.virtual); lm_free(&map); return 0; } }
int vbe_get_mode_info(unsigned short mode, vbe_mode_info_t *vmi_p) { struct reg86u registers; mmap_t address; lm_init(); lm_alloc(VBE_MODE_INFO_BLOCK_SIZE, &address); registers.u.b.ah = 0x4F; registers.u.b.al = 0x01; registers.u.w.es = PB2BASE(address.phys); registers.u.w.di = PB2OFF(address.phys); registers.u.b.intno = 0x10; registers.u.w.cx = 1 << 14 | mode; sys_int86(®isters); vbe_unpack_mode_info(address.virtual, vmi_p); lm_free(&address); return 1; }