aboutsummaryrefslogtreecommitdiff
path: root/vgasrc/vgafb.c
diff options
context:
space:
mode:
authorKevin O'Connor <kevin@koconnor.net>2014-04-05 22:48:05 -0400
committerKevin O'Connor <kevin@koconnor.net>2014-04-11 11:26:23 -0400
commita02d41806e42bf42e55c0147f2ec226ba85219a4 (patch)
treee3008790fee4cbd7df16c1157b8d3080590cc21e /vgasrc/vgafb.c
parentf864b6023ed7b5d6fe8355e7ef2c6f78cd23ecad (diff)
downloadseabios-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.c47
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;