X-Git-Url: http://wien.tomnetworks.com/gitweb/?p=seabios.git;a=blobdiff_plain;f=vgasrc%2Fstdvga.c;h=a310167aca13ee38a4dfbd2f657c7db9c68d0428;hp=9c0cba9365d04456ce60697ce12e468afcd1a6da;hb=3876b531222c53124b0eb154fb331c0c662f5e09;hpb=9961f9958cbc169c531dbdb7c3a8f71d4f79d0c1 diff --git a/vgasrc/stdvga.c b/vgasrc/stdvga.c index 9c0cba9..a310167 100644 --- a/vgasrc/stdvga.c +++ b/vgasrc/stdvga.c @@ -229,6 +229,22 @@ stdvga_get_crtc(void) return VGAREG_MDA_CRTC_ADDRESS; } +// Return the multiplication factor needed for the vga offset register. +int +stdvga_bpp_factor(struct vgamode_s *vmode_g) +{ + switch (GET_GLOBAL(vmode_g->memmodel)) { + case MM_TEXT: + return 2; + case MM_CGA: + return GET_GLOBAL(vmode_g->depth); + case MM_PLANAR: + return 1; + default: + return 4; + } +} + void stdvga_set_cursor_shape(u8 start, u8 end) { @@ -282,6 +298,21 @@ stdvga_set_window(struct vgamode_s *vmode_g, int window, int val) return -1; } +int +stdvga_get_linelength(struct vgamode_s *vmode_g) +{ + u8 val = stdvga_crtc_read(stdvga_get_crtc(), 0x13); + return val * stdvga_bpp_factor(vmode_g) * 2; +} + +int +stdvga_set_linelength(struct vgamode_s *vmode_g, int val) +{ + int factor = stdvga_bpp_factor(vmode_g) * 2; + stdvga_crtc_write(stdvga_get_crtc(), 0x13, DIV_ROUND_UP(val, factor)); + return 0; +} + /**************************************************************** * Save/Restore/Set state