static void vga_init_cursor(void) { u8 val; #define CURSOR_MSL 0x09 /* cursor maximum scan line */ #define CURSOR_START 0x0A /* cursor start */ #define CURSOR_END 0x0B /* cursor end */ val = crtc_read(CURSOR_MSL) & 0x1f; crtc_write(0, CURSOR_START); crtc_write(val - 2, CURSOR_END); }
void write_vga_register(register_set_t target, uint8_t index, uint8_t value) { switch(target) { case GRAPHIC_CTRL: gctrl_write(index, value); break; case SEQUENCER: seq_write(index, value); break; case ATTRIBUTE_CTRL: attr_write(index, value); break; case CRT_CTRL: crtc_write(index, value); break; case EXTERNAL_REGISTERS: switch(index) { case MISC_OUTPUT_REGISTER: misc_output_write(value); break; case FEATURE_CONTROL_REGISTER: feature_control_write(value); break; } break; default: break; } }
void vga_setcursor(void) { int loc = y * NUM_COLS + x; crtc_write(0x0e, loc >> 8); crtc_write(0x0f, loc); }
static void vga_set_cursor(unsigned int x, unsigned int y) { unsigned int addr; addr = x + (vga_video_console.columns * y); crtc_write(addr >> 8, 0x0E); crtc_write(addr, 0x0F); }
static void vga_enable_cursor(int state) { unsigned char tmp = crtc_read(0x0a); if (state == 0) tmp |= (1 << 5); else tmp &= ~(1 << 5); crtc_write(tmp, 0x0a); }
static void vga_load_regs(const mux_reg_t *reg, unsigned short vendor, unsigned short device) { int c, r, i; while (reg->fn != FN_END) { switch (reg->fn) { case FN_ATT: attrib_write(reg->reg, reg->val); break; case FN_GRPH: grph_write(reg->reg, reg->val); break; case FN_CRTC: crtc_write(reg->reg, reg->val); break; case FN_SEQ: seq_write(reg->reg, reg->val); break; case FN_DLUT: io_base[0x3c8] = 0; for (i = 0; i < sizeof(DAC); i++) io_base[0x3c9] = DAC[i]; break; case FN_MISC: io_base[0x3c2] = reg->val; break; case FN_CMAP: for (c = 0; c < 256; c++) for (r = 0; r < 32; r++) if (r < 8) charmap[(c << 5) + r] = cmap_80[c][r]; else charmap[(c << 5) + r] = 0; break; case FN_CARD: for (i = 0; cards[i].vendor; i++) if (cards[i].vendor == vendor && cards[i].device == device) vga_load_regs(cards[i].mux, 0, 0); break; } reg++; } }
void gotoxy(struct crtc_handle *crtc, struct cga_handle *cga, uint8_t _x, uint8_t _y, int color) { uint16_t offset; if ((_y * cga->cols + _x) >= (cga->cols * cga->lines)) { /* scroll if neccessary */ memmove(cga->video_mem, cga->video_mem + 2 * cga->cols, 2 * cga->lines * cga->cols); memset(cga->video_mem + 2 * cga->lines * cga->cols, 0, 2 * cga->cols); --_y; } cga->xpos = _x; cga->ypos = _y; offset = _y * cga->cols + _x; if (cga->video_mem[2 * offset] == 0) { cga->video_mem[2 * offset + 1] = color; } crtc_write(crtc, CRTC_CURSOR_LOCATION_HIGH, (uint8_t)(offset >> 8)); crtc_write(crtc, CRTC_CURSOR_LOCATION_LOW, (uint8_t)offset); }
void crtc_writev(const char *string) { while (*string) crtc_write(*string++); }
static void setcurpos32(uint16_t newpos) { curpos32 = newpos; crtc_write(CRTC_CURPOS_LO, curpos32 & 0xFF); crtc_write(CRTC_CURPOS_HI, curpos32 >> 8); }