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 set_video_mode(unsigned short mode) { struct reg86u reg; reg.u.w.ax = (VBE_IDENTIFIER<<8)|(VBE_F_SET_MODE); // VBE call, function 02 -- set VBE mode reg.u.w.bx = (BIT(LINEAR_MODEL_BIT))|mode; // set bit 14: linear framebuffer reg.u.b.intno = VIDEO_CARD_INT; if( sys_int86(®) != OK ) { printf("set_vbe_mode: sys_int86() failed \n"); return 1; } if(reg.u.b.ah == VBE_FAIL) { printf("vg_init(): Function call failed\n"); return 1; } else if(reg.u.b.ah == VBE_N_SUP) { printf("vg_init(): Function is not supported in current HW configuration\n"); return 1; } else if(reg.u.b.ah == VBE_INVALID) { printf("vg_init(): Function is invalid in current video mode\n"); return 1; } else if(reg.u.b.ah != VBE_OK) { printf("vg_init(): error setting mode %x", mode); return 1; } return 0; }
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; }
void *vg_init(unsigned short mode) { struct reg86u reg86; reg86.u.b.intno = VBE_INTERRUPT_VECTOR; /* BIOS video services */ reg86.u.b.ah = VBE_FUNCTION; reg86.u.b.al = VBE_SET_VBE_MODE; reg86.u.w.bx = mode | BIT(VBE_MODE_NUMBER_LINEAR_FLAT_FRAME_BUFFER_BIT); vbe_mode_info_t vbe_mode_info; if (sys_int86(®86) == OK) { if (reg86.u.w.ax == VBE_FUNCTION_SUPPORTED | VBE_FUNCTION_CALL_SUCCESSFUL) { if(vbe_get_mode_info(mode, &vbe_mode_info)) { return NULL; } else { int r; struct mem_range mr; unsigned mr_size; h_res = vbe_mode_info.XResolution; v_res = vbe_mode_info.YResolution; bits_per_pixel = vbe_mode_info.BitsPerPixel; /* Allow memory mapping */ mr.mr_base = vbe_mode_info.PhysBasePtr; mr_size = h_res * v_res * bits_per_pixel; mr.mr_limit = mr.mr_base + mr_size; if(sys_privctl(SELF, SYS_PRIV_ADD_MEM, &mr)) { return NULL; } /* Map memory */ video_mem = vm_map_phys(SELF, (void *)mr.mr_base, mr_size); if(video_mem != MAP_FAILED) { if ((double_buffer = malloc(h_res * v_res * bits_per_pixel / 8)) != NULL) { if ((mouse_buffer = malloc(h_res * v_res * bits_per_pixel / 8)) != NULL) { return video_mem; } } } } } } return NULL; }
void* vg_init(unsigned short mode) { struct mem_range mr; vbe_mode_info_t vmi_p; struct reg86u reg86; reg86.u.b.intno = BIOS_VIDEO; reg86.u.b.ah = VBE; reg86.u.b.al = SET_VBE; reg86.u.w.bx = BIT(LINEAR_BIT) | mode; if (sys_int86(®86)) { printf("vg_init()::bios call didn't return 0\n"); return NULL; } if (vbe_get_mode_info(mode, &vmi_p) == -1) { printf("vg_init()::failed in vbe_get_mode_info"); return NULL; } h_res = vmi_p.XResolution; v_res = vmi_p.YResolution; bits_per_pixel = vmi_p.BitsPerPixel; if (bits_per_pixel / 8 > 0) bytes_per_pixel = bits_per_pixel / 8; else bytes_per_pixel = 1; vram_size = h_res * v_res * bytes_per_pixel; int r; /* Allow memory mapping */ mr.mr_base = vmi_p.PhysBasePtr; mr.mr_limit = mr.mr_base + vram_size; if (sys_privctl(SELF, SYS_PRIV_ADD_MEM, &mr) != 0) { panic("video_txt: sys_privctl (ADD_MEM) failed: %d\n", r); return NULL; } /* Map memory */ video_mem = vm_map_phys(SELF, (void *) mr.mr_base, vram_size); buffer = malloc(vram_size); if (video_mem == MAP_FAILED) { panic("video_txt couldn't map video memory"); return NULL; } return video_mem; }
int vg_exit() { struct reg86u reg86; reg86.u.b.intno = 0x10; /* BIOS video services */ reg86.u.b.ah = 0x00; /* Set Video Mode function */ reg86.u.b.al = 0x03; /* 80x25 text mode*/ if( sys_int86(®86) != OK ) { printf("\tvg_exit(): sys_int86() failed \n"); return 1; } else return 0; }
int vg_exit() { struct reg86u reg86; reg86.u.b.intno = BIOS_VIDEO; /* BIOS video services */ reg86.u.b.ah = VIDEO; /* Set Video Mode function */ reg86.u.b.al = SET_TEXT; /* 80x25 text mode*/ if (sys_int86(®86) != OK) { printf("\tvg_exit(): sys_int86() failed \n"); return 1; } else { return 0; } }
PRIVATE int put_pixel(unsigned short x, unsigned short y, unsigned int c) { if (x<0 || x>width) return EGFX_OUT_OF_RANGE; if (y<0 || y>height) return EGFX_OUT_OF_RANGE; if (bpp == 1) c = !!c; reg86.u.b.ah = 0x0c; reg86.u.b.al = c; reg86.u.w.cx = x; reg86.u.w.dx = y; reg86.u.b.intno = 0x10; sys_int86(®86); 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; }
void * vg_init(unsigned long mode) { struct reg86u r; r.u.w.ax = 0x4F02; // VBE call, function 02 -- set VBE mode -- ah:0x4F invoking VBE function, al:0x02 function being called:set VBE mode r.u.w.bx = 1<<14|mode; // set bit 14: linear framebuffer r.u.b.intno = 0x10; if( sys_int86(&r) != OK ) { printf("set_vbe_mode: sys_int86() failed \n"); } /* vbe_mode_info_t info; if(vbe_get_mode_info(mode,&info)==1) printf("error in vbe_get_mode \n"); h_res=info.XResolution; v_res=info.YResolution; bits_per_pixel=info.BitsPerPixel; *video_mem=info.PhysBasePtr;*/ h_res=H_RES; v_res=V_RES; bits_per_pixel=BITS_PER_PIXEL; bytes_per_pixel=bits_per_pixel/8; int y; struct mem_range mr; /* Allow memory mapping */ mr.mr_base = VRAM_PHYS_ADDR; mr.mr_limit = mr.mr_base + h_res*v_res; if( OK != (y = sys_privctl(SELF, SYS_PRIV_ADD_MEM, &mr))) panic("video_txt: sys_privctl (ADD_MEM) failed: %d\n", y); /* Map memory */ video_mem = vm_map_phys(SELF, (void *)mr.mr_base, h_res*v_res); if(video_mem == MAP_FAILED) panic("video_txt couldn't map video memory"); return NULL; }
PRIVATE int set_mode(gfx_mode_t mode) { int x, r; for (x=0; mode_list[x].al; x++) { if (mode == mode_list[x].mode) break; } if (mode_list[x].al == 0) return EGFX_UNSUPPORTED_MODE; reg86.u.b.ah = 0x00; reg86.u.b.al = mode_list[x].al; reg86.u.b.intno = 0x10; r = sys_int86(®86); if (r != OK) panic(myname, "BIOS call failed", r); current_mode = mode; width = mode_list[x].width; height = mode_list[x].height; bpp = mode_list[x].bpp; return 0; }
void * vg_init(unsigned long mode) { // ----------------------- // -Non-Hardcoded Version- // ----------------------- struct reg86u reg86; vbe_mode_info_t vmi; int r; struct mem_range mr; reg86.u.w.ax = 0x4F02; reg86.u.w.bx = 1<<14|mode; reg86.u.b.intno = 0x10; if(sys_int86(®86) != OK) { printf("set_vbe_mode: sys_int86() failed\n"); return NULL; } else { vbe_get_mode_info(mode, &vmi); h_res = vmi.XResolution; v_res = vmi.YResolution; bits_per_pixel = vmi.BitsPerPixel; mr.mr_base = vmi.PhysBasePtr; mr.mr_limit = mr.mr_base + (h_res * v_res * (bits_per_pixel / 8)); if((r = sys_privctl(SELF, SYS_PRIV_ADD_MEM, &mr)) != OK) { panic("vg_init: sys_privctl (ADD_MEM) failed: %d\n", r); return NULL; } else { video_mem = vm_map_phys(SELF, (void *)mr.mr_base, (h_res * v_res * (bits_per_pixel / 8))); if(video_mem == MAP_FAILED){ panic("vg_init: Couldn't map video memory!\n"); return NULL; } else return video_mem; } } // ------------------- // -Hardcoded Version- // ------------------- /* struct reg86u reg86; vbe_mode_info_t vmi; int r; struct mem_range mr; reg86.u.w.ax = 0x4F02; reg86.u.w.bx = 1<<14|mode; reg86.u.b.intno = 0x10; if(sys_int86(®86) != OK) { printf("set_vbe_mode: sys_int86() failed\n"); return NULL; } else { h_res = H_RES; v_res = V_RES; bits_per_pixel = BITS_PER_PIXEL; mr.mr_base = VRAM_PHYS_ADDR; mr.mr_limit = mr.mr_base + (h_res * v_res * (bits_per_pixel / 8)); if((r = sys_privctl(SELF, SYS_PRIV_ADD_MEM, &mr)) != OK) { panic("vg_init: sys_privctl (ADD_MEM) failed: %d\n", r); return NULL; } else { video_mem = vm_map_phys(SELF, (void *)mr.mr_base, (h_res * v_res * (bits_per_pixel / 8))); if(video_mem == MAP_FAILED){ panic("vg_init: Couldn't map video memory!\n"); return NULL; } else return video_mem; } }*/ }
void *vg_init(unsigned short mode) { vbe_mode_info_t info; struct reg86u reg86; int r; struct mem_range mr; reg86.u.b.intno = BIOS_VIDEO_INT; /* BIOS video services */ reg86.u.w.ax = SET_VBE_MODE; /* Set Video Mode function */ reg86.u.w.bx = SET_LINEAR_MODE | mode; /* Mode */ if (sys_int86(®86) != OK) { // Sets video mode printf("\tvg_init(): sys_int86() failed \n"); return NULL; } switch (reg86.u.w.ax) { case VBE_FUNC_CALL_FAILED: printf("\tvg_init(): sys_int86() function call failed.\n"); return NULL; break; case VBE_FUNC_NOT_SUPPORTED: printf("\tvg_init(): sys_int86() function not supported.\n"); return NULL; break; case VBE_FUNC_INVALID_CUR_MODE: printf( "\tvg_init(): sys_int86() function invalid in current video mode.\n"); return NULL; break; } if (lm_init() == NULL) { printf("\tvg_init(): lm_init() failed \n"); return NULL; } if (vbe_get_mode_info(mode, &info) != OK) { // Gets info printf("\tvg_init(): vbe_get_mode_info() failed \n"); return NULL; } h_res = info.XResolution; v_res = info.YResolution; //Sets global variables bits_per_pixel = info.BitsPerPixel; //Allow memory mapping mr.mr_base = (phys_bytes)(info.PhysBasePtr); mr.mr_limit = mr.mr_base + info.XResolution * info.YResolution * info.BitsPerPixel / 8; if (OK != (r = sys_privctl(SELF, SYS_PRIV_ADD_MEM, &mr))) panic("video_txt: sys_privctl (ADD_MEM) failed: %d\n", r); // Map memory video_mem = vm_map_phys(SELF, (void *) mr.mr_base, info.XResolution * info.YResolution * info.BitsPerPixel / 8); double_buffer = malloc(h_res * v_res * sizeof(char)); /*if(video_mem == MAP_FAILED) panic("video_txt couldn't map video memory");*/ return video_mem; }
void *vg_init(unsigned short mode) { struct reg86u r; vbe_mode_info_t *info = malloc(sizeof(vbe_mode_info_t)); if (vbe_get_mode_info(mode, info) != 0) { return NULL; } h_res=info->XResolution; v_res=info->YResolution; bits_per_pixel=info->BitsPerPixel; printf("%d\n", h_res); int erro; struct mem_range mr; /* Allow memory mapping */ unsigned int vram_size = h_res * v_res * (bits_per_pixel/8); mr.mr_base = (phys_bytes)(info->PhysBasePtr); mr.mr_limit = mr.mr_base + vram_size; if( OK != (erro = sys_privctl(SELF, SYS_PRIV_ADD_MEM, &mr))) panic("video_gr: sys_privctl (ADD_MEM) failed: %d\n", erro); /* Map memory */ video_mem = vm_map_phys(SELF, (void *)mr.mr_base, vram_size); if(video_mem == MAP_FAILED) panic("video_gr couldn't map video memory"); r.u.w.ax = SET_MODE; // VBE call, function 02 -- set VBE mode r.u.w.bx = BIT(LINEAR_MODEL_BIT)|mode; // set bit 14: linear framebuffer r.u.b.intno = BIOS_SERVICE; if( sys_int86(&r) != OK ) { printf("set_vbe_mode: sys_int86() failed \n"); return NULL; } switch(r.u.b.ah){ case 0x01: printf("Function call failed \n"); return NULL; break; case 0x02: printf("Function is not supported in current HW configuration \n"); return NULL; break; case 0x03: printf("Function is invalid in current video mode \n"); return NULL; break; default: break; } vram_phisical_address = info->PhysBasePtr; return video_mem; }
PUBLIC int gfx_ioctl(message *mess) { int r; switch (mess->REQUEST) { case GFX_REQUEST_SET_MODE: r = sys_vircopy(mess->IO_ENDPT, D, (vir_bytes) mess->ADDRESS, SELF, D, (vir_bytes) &mode, sizeof(mode)); if (r != OK) return EGFX_ERROR; if ((driver->modes & mode) == 0) return EGFX_UNSUPPORTED_MODE; return driver->set_mode(mode); break; case GFX_REQUEST_PUT_PIXEL: r = sys_vircopy(mess->IO_ENDPT, D, (vir_bytes) mess->ADDRESS, SELF, D, (vir_bytes) &pixel, sizeof(pixel)); if (r != OK) return EGFX_ERROR; return driver->put_pixel(pixel.x, pixel.y, pixel.c); break; case GFX_REQUEST_DRAW_LINE: r = sys_vircopy(mess->IO_ENDPT, D, (vir_bytes) mess->ADDRESS, SELF, D, (vir_bytes) &line, sizeof(line)); if (r != OK) return EGFX_ERROR; return driver->draw_line(line.x1, line.y1, line.x2, line.y2, line.c); break; case GFX_REQUEST_DRAW_LINE_HORI: r = sys_vircopy(mess->IO_ENDPT, D, (vir_bytes) mess->ADDRESS, SELF, D, (vir_bytes) &line, sizeof(line)); if (r != OK) return EGFX_ERROR; return driver->draw_line_hori(line.x1, line.y1, line.x2, line.c); break; case GFX_REQUEST_DRAW_LINE_VERT: r = sys_vircopy(mess->IO_ENDPT, D, (vir_bytes) mess->ADDRESS, SELF, D, (vir_bytes) &line, sizeof(line)); if (r != OK) return EGFX_ERROR; return driver->draw_line_vert(line.x1, line.y1, line.y2, line.c); break; case GFX_REQUEST_CLEAR_SCREEN: return driver->clear_screen(); case GFX_REQUEST_DUMP_REGISTERS: { vga_registers_t regs; dump_registers(®s); r = sys_vircopy(SELF, D, (vir_bytes) ®s, mess->IO_ENDPT, D, (vir_bytes) mess->ADDRESS, sizeof(regs)); if (r != OK) return EGFX_ERROR; return 0; break; } case GFX_REQUEST_RESET: { struct reg86u reg86; reg86.u.b.intno = 0x10; reg86.u.w.ax = 0x0003; r = sys_int86(®86); if (r != OK) return EGFX_ERROR; return 0; break; } case GFX_REQUEST_DRAW_RECT: r = sys_vircopy(mess->IO_ENDPT, D, (vir_bytes) mess->ADDRESS, SELF, D, (vir_bytes) &rect, sizeof(rect)); if (r != OK) return EGFX_ERROR; return driver->draw_rect(rect.x1, rect.y1, rect.x2, rect.y2, rect.c); break; case GFX_REQUEST_PUT_CHAR: r = sys_vircopy(mess->IO_ENDPT, D, (vir_bytes) mess->ADDRESS, SELF, D, (vir_bytes) &chr, sizeof(chr)); if (r != OK) return EGFX_ERROR; return driver->put_char(chr.x, chr.y, chr.c, chr.chr, chr.f); break; case GFX_REQUEST_PUT_STRING: { unsigned char *s; r = sys_vircopy(mess->IO_ENDPT, D, (vir_bytes) mess->ADDRESS, SELF, D, (vir_bytes) &string, sizeof(string)); if (r != OK) return EGFX_ERROR; s = malloc(string.len); if (!s) return EGFX_OUT_OF_MEMORY; r = sys_vircopy(mess->IO_ENDPT, D, (vir_bytes) string.s, SELF, D, (vir_bytes) s, string.len); if (r != OK) { free(s); return EGFX_ERROR; } r = driver->put_string(string.x, string.y, string.c, s, string.len, string.f); free(s); return r; break; } default: break; } return 0; }