X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=vgasrc%2Fvgafb.c;h=b6daba651ca26544caacae489610ab38571f1fcc;hb=10dff3db247d07df8fcc83806f8e660ba2b3b6c2;hp=1e1943dc2b6cb126b885a29c33d0f2ff1dbd5969;hpb=87233e9ddac7f833d14031be5d7afc705aed5f25;p=seabios.git diff --git a/vgasrc/vgafb.c b/vgasrc/vgafb.c index 1e1943d..b6daba6 100644 --- a/vgasrc/vgafb.c +++ b/vgasrc/vgafb.c @@ -7,7 +7,8 @@ #include "biosvar.h" // GET_BDA #include "util.h" // memset_far -#include "vgatables.h" // find_vga_entry +#include "vgahw.h" // vgahw_find_mode +#include "stdvga.h" // stdvga_grdc_write /**************************************************************** @@ -40,138 +41,152 @@ static void scroll_pl4(struct vgamode_s *vmode_g, int nblines, int attr , struct cursorpos ul, struct cursorpos lr) { - u8 cheight = GET_GLOBAL(vmode_g->cheight); - int stride = GET_BDA(video_cols); + int cheight = GET_GLOBAL(vmode_g->cheight); + int cwidth = 1; + int stride = GET_BDA(video_cols) * cwidth; void *src_far, *dest_far; if (nblines >= 0) { - dest_far = (void*)(ul.y * cheight * stride + ul.x); + dest_far = (void*)(ul.y * cheight * stride + ul.x * cwidth); src_far = dest_far + nblines * cheight * stride; } else { // Scroll down nblines = -nblines; - dest_far = (void*)(lr.y * cheight * stride + ul.x); + dest_far = (void*)(lr.y * cheight * stride + ul.x * cwidth); src_far = dest_far - nblines * cheight * stride; stride = -stride; } int cols = lr.x - ul.x + 1; int rows = lr.y - ul.y + 1; if (nblines < rows) { - vgahw_grdc_write(0x05, 0x01); - dest_far = memcpy_stride(SEG_GRAPH, dest_far, src_far, cols, stride - , (rows - nblines) * cheight); + stdvga_grdc_write(0x05, 0x01); + dest_far = memcpy_stride(SEG_GRAPH, dest_far, src_far, cols * cwidth + , stride, (rows - nblines) * cheight); } if (attr < 0) attr = 0; - vgahw_grdc_write(0x05, 0x02); - memset_stride(SEG_GRAPH, dest_far, attr, cols, stride, nblines * cheight); - vgahw_grdc_write(0x05, 0x00); + stdvga_grdc_write(0x05, 0x02); + memset_stride(SEG_GRAPH, dest_far, attr, cols * cwidth + , stride, nblines * cheight); + stdvga_grdc_write(0x05, 0x00); } static void scroll_cga(struct vgamode_s *vmode_g, int nblines, int attr , struct cursorpos ul, struct cursorpos lr) { - u8 cheight = GET_GLOBAL(vmode_g->cheight); - u8 bpp = GET_GLOBAL(vmode_g->pixbits); - int stride = GET_BDA(video_cols) * bpp; + int cheight = GET_GLOBAL(vmode_g->cheight) / 2; + int cwidth = GET_GLOBAL(vmode_g->depth); + int stride = GET_BDA(video_cols) * cwidth; void *src_far, *dest_far; if (nblines >= 0) { - dest_far = (void*)(ul.y * cheight * stride + ul.x * bpp); + dest_far = (void*)(ul.y * cheight * stride + ul.x * cwidth); src_far = dest_far + nblines * cheight * stride; } else { // Scroll down nblines = -nblines; - dest_far = (void*)(lr.y * cheight * stride + ul.x * bpp); + dest_far = (void*)(lr.y * cheight * stride + ul.x * cwidth); src_far = dest_far - nblines * cheight * stride; stride = -stride; } - int cols = (lr.x - ul.x + 1) * bpp; + int cols = lr.x - ul.x + 1; int rows = lr.y - ul.y + 1; if (nblines < rows) { - memcpy_stride(SEG_CTEXT, dest_far + 0x2000, src_far + 0x2000, cols - , stride, (rows - nblines) * cheight / 2); - dest_far = memcpy_stride(SEG_CTEXT, dest_far, src_far, cols - , stride, (rows - nblines) * cheight / 2); + memcpy_stride(SEG_CTEXT, dest_far+0x2000, src_far+0x2000, cols * cwidth + , stride, (rows - nblines) * cheight); + dest_far = memcpy_stride(SEG_CTEXT, dest_far, src_far, cols * cwidth + , stride, (rows - nblines) * cheight); + } + if (attr < 0) + attr = 0; + memset_stride(SEG_CTEXT, dest_far + 0x2000, attr, cols * cwidth + , stride, nblines * cheight); + memset_stride(SEG_CTEXT, dest_far, attr, cols * cwidth + , stride, nblines * cheight); +} + +static void +scroll_lin(struct vgamode_s *vmode_g, int nblines, int attr + , struct cursorpos ul, struct cursorpos lr) +{ + int cheight = 8; + int cwidth = 8; + int stride = GET_BDA(video_cols) * cwidth; + void *src_far, *dest_far; + if (nblines >= 0) { + dest_far = (void*)(ul.y * cheight * stride + ul.x * cwidth); + src_far = dest_far + nblines * cheight * stride; + } else { + // Scroll down + nblines = -nblines; + dest_far = (void*)(lr.y * cheight * stride + ul.x * cwidth); + src_far = dest_far - nblines * cheight * stride; + stride = -stride; } + int cols = lr.x - ul.x + 1; + int rows = lr.y - ul.y + 1; + if (nblines < rows) + dest_far = memcpy_stride(SEG_GRAPH, dest_far, src_far, cols * cwidth + , stride, (rows - nblines) * cheight); if (attr < 0) attr = 0; - memset_stride(SEG_CTEXT, dest_far + 0x2000, attr, cols - , stride, nblines * cheight / 2); - memset_stride(SEG_CTEXT, dest_far, attr, cols - , stride, nblines * cheight / 2); + memset_stride(SEG_GRAPH, dest_far, attr, cols * cwidth + , stride, nblines * cheight); } static void scroll_text(struct vgamode_s *vmode_g, int nblines, int attr , struct cursorpos ul, struct cursorpos lr) { - u16 nbrows = GET_BDA(video_rows) + 1; - u16 nbcols = GET_BDA(video_cols); - void *src_far, *dest_far = (void*)SCREEN_MEM_START(nbcols, nbrows, ul.page); - int stride = nbcols * 2; + int cheight = 1; + int cwidth = 2; + int stride = GET_BDA(video_cols) * cwidth; + void *src_far, *dest_far = (void*)(GET_BDA(video_pagesize) * ul.page); if (nblines >= 0) { - dest_far += ul.y * stride + ul.x * 2; - src_far = dest_far + nblines * stride; + dest_far += ul.y * cheight * stride + ul.x * cwidth; + src_far = dest_far + nblines * cheight * stride; } else { // Scroll down nblines = -nblines; - dest_far += lr.y * stride + ul.x * 2; - src_far = dest_far - nblines * stride; + dest_far += lr.y * cheight * stride + ul.x * cwidth; + src_far = dest_far - nblines * cheight * stride; stride = -stride; } - int cols = (lr.x - ul.x + 1) * 2; + int cols = lr.x - ul.x + 1; int rows = lr.y - ul.y + 1; u16 seg = GET_GLOBAL(vmode_g->sstart); if (nblines < rows) - dest_far = memcpy_stride(seg, dest_far, src_far, cols, stride - , (rows - nblines)); + dest_far = memcpy_stride(seg, dest_far, src_far, cols * cwidth + , stride, (rows - nblines) * cheight); if (attr < 0) attr = 0x07; attr = (attr << 8) | ' '; - memset16_stride(seg, dest_far, attr, cols, stride, nblines); + memset16_stride(seg, dest_far, attr, cols * cwidth + , stride, nblines * cheight); } void vgafb_scroll(int nblines, int attr, struct cursorpos ul, struct cursorpos lr) { // Get the mode - struct vgamode_s *vmode_g = find_vga_entry(GET_BDA(video_mode)); + struct vgamode_s *vmode_g = vgahw_find_mode(GET_BDA(video_mode)); if (!vmode_g) return; // FIXME gfx mode not complete switch (GET_GLOBAL(vmode_g->memmodel)) { - case CTEXT: - case MTEXT: + case MM_TEXT: scroll_text(vmode_g, nblines, attr, ul, lr); break; - case PLANAR4: - case PLANAR1: + case MM_PLANAR: scroll_pl4(vmode_g, nblines, attr, ul, lr); break; - case CGA: + case MM_CGA: scroll_cga(vmode_g, nblines, attr, ul, lr); break; - default: - dprintf(1, "Scroll in graphics mode\n"); - } -} - -void -clear_screen(struct vgamode_s *vmode_g) -{ - switch (GET_GLOBAL(vmode_g->memmodel)) { - case CTEXT: - case MTEXT: - memset16_far(GET_GLOBAL(vmode_g->sstart), 0, 0x0720, 32*1024); - break; - case CGA: - memset16_far(GET_GLOBAL(vmode_g->sstart), 0, 0x0000, 32*1024); + case MM_DIRECT: + case MM_PACKED: + scroll_lin(vmode_g, nblines, attr, ul, lr); 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); } } @@ -202,29 +217,29 @@ write_gfx_char_pl4(struct vgamode_s *vmode_g } u16 addr = cp.x + cp.y * cheight * nbcols; u16 src = ca.car * cheight; - vgahw_sequ_write(0x02, 0x0f); - vgahw_grdc_write(0x05, 0x02); + stdvga_sequ_write(0x02, 0x0f); + stdvga_grdc_write(0x05, 0x02); if (ca.attr & 0x80) - vgahw_grdc_write(0x03, 0x18); + stdvga_grdc_write(0x03, 0x18); else - vgahw_grdc_write(0x03, 0x00); + stdvga_grdc_write(0x03, 0x00); u8 i; for (i = 0; i < cheight; i++) { u8 *dest_far = (void*)(addr + i * nbcols); u8 j; for (j = 0; j < 8; j++) { u8 mask = 0x80 >> j; - vgahw_grdc_write(0x08, mask); - GET_FARVAR(SEG_GRAPH, *dest_far); + stdvga_grdc_write(0x08, mask); + GET_FARVAR(SEG_GRAPH, *(volatile u8*)dest_far); if (GET_GLOBAL(fdata_g[src + i]) & mask) SET_FARVAR(SEG_GRAPH, *dest_far, ca.attr & 0x0f); else SET_FARVAR(SEG_GRAPH, *dest_far, 0x00); } } - vgahw_grdc_write(0x08, 0xff); - vgahw_grdc_write(0x05, 0x00); - vgahw_grdc_write(0x03, 0x00); + stdvga_grdc_write(0x08, 0xff); + stdvga_grdc_write(0x05, 0x00); + stdvga_grdc_write(0x03, 0x00); } static void @@ -236,7 +251,7 @@ write_gfx_char_cga(struct vgamode_s *vmode_g return; u8 *fdata_g = vgafont8; - u8 bpp = GET_GLOBAL(vmode_g->pixbits); + u8 bpp = GET_GLOBAL(vmode_g->depth); u16 addr = (cp.x * bpp) + cp.y * 320; u16 src = ca.car * 8; u8 i; @@ -313,12 +328,9 @@ static void write_text_char(struct vgamode_s *vmode_g , struct cursorpos cp, struct carattr ca) { - // Get the dimensions - u16 nbrows = GET_BDA(video_rows) + 1; - u16 nbcols = GET_BDA(video_cols); - // Compute the address - void *address_far = (void*)(SCREEN_MEM_START(nbcols, nbrows, cp.page) + u16 nbcols = GET_BDA(video_cols); + void *address_far = (void*)(GET_BDA(video_pagesize) * cp.page + (cp.x + cp.y * nbcols) * 2); if (ca.use_attr) { @@ -333,24 +345,23 @@ void vgafb_write_char(struct cursorpos cp, struct carattr ca) { // Get the mode - struct vgamode_s *vmode_g = find_vga_entry(GET_BDA(video_mode)); + struct vgamode_s *vmode_g = vgahw_find_mode(GET_BDA(video_mode)); if (!vmode_g) return; // FIXME gfx mode not complete switch (GET_GLOBAL(vmode_g->memmodel)) { - case CTEXT: - case MTEXT: + case MM_TEXT: write_text_char(vmode_g, cp, ca); break; - case PLANAR4: - case PLANAR1: + case MM_PLANAR: write_gfx_char_pl4(vmode_g, cp, ca); break; - case CGA: + case MM_CGA: write_gfx_char_cga(vmode_g, cp, ca); break; - case LINEAR8: + case MM_DIRECT: + case MM_PACKED: write_gfx_char_lin(vmode_g, cp, ca); break; } @@ -360,22 +371,19 @@ struct carattr vgafb_read_char(struct cursorpos cp) { // Get the mode - struct vgamode_s *vmode_g = find_vga_entry(GET_BDA(video_mode)); + struct vgamode_s *vmode_g = vgahw_find_mode(GET_BDA(video_mode)); if (!vmode_g) goto fail; - if (!(GET_GLOBAL(vmode_g->memmodel) & TEXT)) { + if (GET_GLOBAL(vmode_g->memmodel) != MM_TEXT) { // FIXME gfx mode dprintf(1, "Read char in graphics mode\n"); goto fail; } - // Get the dimensions - u16 nbrows = GET_BDA(video_rows) + 1; - u16 nbcols = GET_BDA(video_cols); - // Compute the address - u16 *address_far = (void*)(SCREEN_MEM_START(nbcols, nbrows, cp.page) + u16 nbcols = GET_BDA(video_cols); + u16 *address_far = (void*)(GET_BDA(video_pagesize) * cp.page + (cp.x + cp.y * nbcols) * 2); u16 v = GET_FARVAR(GET_GLOBAL(vmode_g->sstart), *address_far); struct carattr ca = {v, v>>8, 0}; @@ -395,37 +403,34 @@ void vgafb_write_pixel(u8 color, u16 x, u16 y) { // Get the mode - struct vgamode_s *vmode_g = find_vga_entry(GET_BDA(video_mode)); + struct vgamode_s *vmode_g = vgahw_find_mode(GET_BDA(video_mode)); if (!vmode_g) return; - if (GET_GLOBAL(vmode_g->memmodel) & TEXT) - return; u8 *addr_far, mask, attr, data; switch (GET_GLOBAL(vmode_g->memmodel)) { - case PLANAR4: - case PLANAR1: + case MM_PLANAR: addr_far = (void*)(x / 8 + y * GET_BDA(video_cols)); mask = 0x80 >> (x & 0x07); - vgahw_grdc_write(0x08, mask); - vgahw_grdc_write(0x05, 0x02); - data = GET_FARVAR(SEG_GRAPH, *addr_far); + stdvga_grdc_write(0x08, mask); + stdvga_grdc_write(0x05, 0x02); + GET_FARVAR(SEG_GRAPH, *(volatile u8*)addr_far); if (color & 0x80) - vgahw_grdc_write(0x03, 0x18); + stdvga_grdc_write(0x03, 0x18); SET_FARVAR(SEG_GRAPH, *addr_far, color); - vgahw_grdc_write(0x08, 0xff); - vgahw_grdc_write(0x05, 0x00); - vgahw_grdc_write(0x03, 0x00); + stdvga_grdc_write(0x08, 0xff); + stdvga_grdc_write(0x05, 0x00); + stdvga_grdc_write(0x03, 0x00); break; - case CGA: - if (GET_GLOBAL(vmode_g->pixbits) == 2) + case MM_CGA: + if (GET_GLOBAL(vmode_g->depth) == 2) addr_far = (void*)((x >> 2) + (y >> 1) * 80); else addr_far = (void*)((x >> 3) + (y >> 1) * 80); if (y & 1) addr_far += 0x2000; data = GET_FARVAR(SEG_CTEXT, *addr_far); - if (GET_GLOBAL(vmode_g->pixbits) == 2) { + if (GET_GLOBAL(vmode_g->depth) == 2) { attr = (color & 0x03) << ((3 - (x & 0x03)) * 2); mask = 0x03 << ((3 - (x & 0x03)) * 2); } else { @@ -440,10 +445,13 @@ vgafb_write_pixel(u8 color, u16 x, u16 y) } SET_FARVAR(SEG_CTEXT, *addr_far, data); break; - case LINEAR8: + case MM_DIRECT: + case MM_PACKED: addr_far = (void*)(x + y * (GET_BDA(video_cols) * 8)); SET_FARVAR(SEG_GRAPH, *addr_far, color); break; + case MM_TEXT: + return; } } @@ -451,59 +459,40 @@ u8 vgafb_read_pixel(u16 x, u16 y) { // Get the mode - struct vgamode_s *vmode_g = find_vga_entry(GET_BDA(video_mode)); + struct vgamode_s *vmode_g = vgahw_find_mode(GET_BDA(video_mode)); if (!vmode_g) return 0; - if (GET_GLOBAL(vmode_g->memmodel) & TEXT) - return 0; u8 *addr_far, mask, attr=0, data, i; switch (GET_GLOBAL(vmode_g->memmodel)) { - case PLANAR4: - case PLANAR1: + case MM_PLANAR: addr_far = (void*)(x / 8 + y * GET_BDA(video_cols)); mask = 0x80 >> (x & 0x07); attr = 0x00; for (i = 0; i < 4; i++) { - vgahw_grdc_write(0x04, i); + stdvga_grdc_write(0x04, i); data = GET_FARVAR(SEG_GRAPH, *addr_far) & mask; if (data > 0) attr |= (0x01 << i); } break; - case CGA: + case MM_CGA: addr_far = (void*)((x >> 2) + (y >> 1) * 80); if (y & 1) addr_far += 0x2000; data = GET_FARVAR(SEG_CTEXT, *addr_far); - if (GET_GLOBAL(vmode_g->pixbits) == 2) + if (GET_GLOBAL(vmode_g->depth) == 2) attr = (data >> ((3 - (x & 0x03)) * 2)) & 0x03; else attr = (data >> (7 - (x & 0x07))) & 0x01; break; - case LINEAR8: + case MM_DIRECT: + case MM_PACKED: addr_far = (void*)(x + y * (GET_BDA(video_cols) * 8)); attr = GET_FARVAR(SEG_GRAPH, *addr_far); break; + case MM_TEXT: + return 0; } return attr; } - - -/**************************************************************** - * Font loading - ****************************************************************/ - -void -vgafb_load_font(u16 seg, void *src_far, u16 count - , u16 start, u8 destflags, u8 fontsize) -{ - get_font_access(); - u16 blockaddr = ((destflags & 0x03) << 14) + ((destflags & 0x04) << 11); - void *dest_far = (void*)(blockaddr + start*32); - u16 i; - for (i = 0; i < count; i++) - memcpy_far(SEG_GRAPH, dest_far + i*32 - , seg, src_far + i*fontsize, fontsize); - release_font_access(); -}