diff options
author | Kevin O'Connor <kevin@koconnor.net> | 2014-04-05 22:48:05 -0400 |
---|---|---|
committer | Kevin O'Connor <kevin@koconnor.net> | 2014-04-11 11:26:23 -0400 |
commit | a02d41806e42bf42e55c0147f2ec226ba85219a4 (patch) | |
tree | e3008790fee4cbd7df16c1157b8d3080590cc21e /vgasrc/vgafb.c | |
parent | f864b6023ed7b5d6fe8355e7ef2c6f78cd23ecad (diff) | |
download | seabios-hppa-a02d41806e42bf42e55c0147f2ec226ba85219a4.zip seabios-hppa-a02d41806e42bf42e55c0147f2ec226ba85219a4.tar.gz seabios-hppa-a02d41806e42bf42e55c0147f2ec226ba85219a4.tar.bz2 |
vgabios: Introduce text_address().
Factor out code that calculates the text mode address of a given
character.
Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
Diffstat (limited to 'vgasrc/vgafb.c')
-rw-r--r-- | vgasrc/vgafb.c | 47 |
1 files changed, 19 insertions, 28 deletions
diff --git a/vgasrc/vgafb.c b/vgasrc/vgafb.c index 3c6065c..31bf5de 100644 --- a/vgasrc/vgafb.c +++ b/vgasrc/vgafb.c @@ -343,6 +343,15 @@ vgafb_read_pixel(u16 x, u16 y) * Text ops ****************************************************************/ +// Return the fb offset for the given character address when in text mode. +void * +text_address(struct cursorpos cp) +{ + int stride = GET_BDA(video_cols) * 2; + u32 pageoffset = GET_BDA(video_pagesize) * cp.page; + return (void*)pageoffset + cp.y * stride + cp.x * 2; +} + // Move characters on screen. void vgafb_move_chars(struct vgamode_s *vmode_g, struct cursorpos dest @@ -353,15 +362,10 @@ vgafb_move_chars(struct vgamode_s *vmode_g, struct cursorpos dest return; } - int cheight = 1; - int cwidth = 2; - int stride = GET_BDA(video_cols) * cwidth; - void *dest_far = (void*)(dest.y * cheight * stride + dest.x * cwidth); - void *src_far = (void*)(src.y * cheight * stride + src.x * cwidth); - u32 pageoffset = GET_BDA(video_pagesize) * dest.page; - u16 seg = GET_GLOBAL(vmode_g->sstart); - memmove_stride(seg, dest_far + pageoffset, src_far + pageoffset - , movesize.x * cwidth, stride, movesize.y * cheight); + int stride = GET_BDA(video_cols) * 2; + memmove_stride(GET_GLOBAL(vmode_g->sstart) + , text_address(dest), text_address(src) + , movesize.x * 2, stride, movesize.y); } // Clear are of screen. @@ -374,15 +378,10 @@ vgafb_clear_chars(struct vgamode_s *vmode_g, struct cursorpos dest return; } - int cheight = 1; - int cwidth = 2; - int stride = GET_BDA(video_cols) * cwidth; - void *dest_far = (void*)(dest.y * cheight * stride + dest.x * cwidth); + int stride = GET_BDA(video_cols) * 2; u16 attr = ((ca.use_attr ? ca.attr : 0x07) << 8) | ca.car; - u32 pageoffset = GET_BDA(video_pagesize) * dest.page; - u16 seg = GET_GLOBAL(vmode_g->sstart); - memset16_stride(seg, dest_far + pageoffset, attr - , clearsize.x * cwidth, stride, clearsize.y * cheight); + memset16_stride(GET_GLOBAL(vmode_g->sstart), text_address(dest), attr + , clearsize.x * 2, stride, clearsize.y); } // Write a character to the screen. @@ -398,11 +397,7 @@ vgafb_write_char(struct cursorpos cp, struct carattr ca) return; } - int cheight = 1; - int cwidth = 2; - int stride = GET_BDA(video_cols) * cwidth; - int addr = cp.y * cheight * stride + cp.x * cwidth; - void *dest_far = (void*)(GET_BDA(video_pagesize) * cp.page + addr); + void *dest_far = text_address(cp); if (ca.use_attr) { u16 dummy = (ca.attr << 8) | ca.car; SET_FARVAR(GET_GLOBAL(vmode_g->sstart), *(u16*)dest_far, dummy); @@ -425,12 +420,8 @@ vgafb_read_char(struct cursorpos cp) goto fail; } - int cheight = 1; - int cwidth = 2; - int stride = GET_BDA(video_cols) * cwidth; - int addr = cp.y * cheight * stride + cp.x * cwidth; - u16 *src_far = (void*)(GET_BDA(video_pagesize) * cp.page + addr); - u16 v = GET_FARVAR(GET_GLOBAL(vmode_g->sstart), *src_far); + u16 *dest_far = text_address(cp); + u16 v = GET_FARVAR(GET_GLOBAL(vmode_g->sstart), *dest_far); struct carattr ca = {v, v>>8, 0}; return ca; |