aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKevin O'Connor <kevin@koconnor.net>2014-02-05 19:29:08 -0500
committerKevin O'Connor <kevin@koconnor.net>2014-02-05 19:29:08 -0500
commitda6a15762b07028926fe0d78b1b54153c4f0c560 (patch)
tree8530ba480598094dbce8258489427f30757fd488
parentf5ec1e0a5e2f0b12ed4fd250f6bfeabb0feacd25 (diff)
downloadseabios-da6a15762b07028926fe0d78b1b54153c4f0c560.zip
seabios-da6a15762b07028926fe0d78b1b54153c4f0c560.tar.gz
seabios-da6a15762b07028926fe0d78b1b54153c4f0c560.tar.bz2
vgabios: Simplify the bios save state area.
The structure of the "bios save state area" as returned by handle_101c() and vbe_104f04() does not follow any particular order. (And there does not appear to be any documentation that would require it to follow a particular order.) So, rearrange the layout of the struct to make save and restore simpler. Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
-rw-r--r--vgasrc/vgabios.c47
-rw-r--r--vgasrc/vgabios.h17
2 files changed, 13 insertions, 51 deletions
diff --git a/vgasrc/vgabios.c b/vgasrc/vgabios.c
index f70b2b6..47bfe2c 100644
--- a/vgasrc/vgabios.c
+++ b/vgasrc/vgabios.c
@@ -239,22 +239,11 @@ write_teletype(struct cursorpos *pcp, struct carattr ca)
void
save_bda_state(u16 seg, struct saveBDAstate *info)
{
- SET_FARVAR(seg, info->video_mode, GET_BDA(vbe_mode));
- SET_FARVAR(seg, info->video_cols, GET_BDA(video_cols));
- SET_FARVAR(seg, info->video_pagesize, GET_BDA(video_pagesize));
- SET_FARVAR(seg, info->crtc_address, GET_BDA(crtc_address));
- SET_FARVAR(seg, info->video_rows, GET_BDA(video_rows));
- SET_FARVAR(seg, info->char_height, GET_BDA(char_height));
- SET_FARVAR(seg, info->video_ctl, GET_BDA(video_ctl));
- SET_FARVAR(seg, info->video_switches, GET_BDA(video_switches));
- SET_FARVAR(seg, info->modeset_ctl, GET_BDA(modeset_ctl));
- SET_FARVAR(seg, info->cursor_type, GET_BDA(cursor_type));
- int i;
- for (i=0; i<8; i++)
- SET_FARVAR(seg, info->cursor_pos[i], GET_BDA(cursor_pos[i]));
- SET_FARVAR(seg, info->video_pagestart, GET_BDA(video_pagestart));
- SET_FARVAR(seg, info->video_page, GET_BDA(video_page));
- /* current font */
+ memcpy_far(seg, info->bda_0x49, SEG_BDA, (void*)0x49
+ , sizeof(info->bda_0x49));
+ memcpy_far(seg, info->bda_0x84, SEG_BDA, (void*)0x84
+ , sizeof(info->bda_0x84));
+ SET_FARVAR(seg, info->vbe_mode, GET_BDA(vbe_mode));
SET_FARVAR(seg, info->font0, GET_IVT(0x1f));
SET_FARVAR(seg, info->font1, GET_IVT(0x43));
}
@@ -262,27 +251,11 @@ save_bda_state(u16 seg, struct saveBDAstate *info)
void
restore_bda_state(u16 seg, struct saveBDAstate *info)
{
- u16 mode = GET_FARVAR(seg, info->video_mode);
- SET_BDA(vbe_mode, mode);
- if (mode < 0x100)
- SET_BDA(video_mode, mode);
- else
- SET_BDA(video_mode, 0xff);
- SET_BDA(video_cols, GET_FARVAR(seg, info->video_cols));
- SET_BDA(video_pagesize, GET_FARVAR(seg, info->video_pagesize));
- SET_BDA(crtc_address, GET_FARVAR(seg, info->crtc_address));
- SET_BDA(video_rows, GET_FARVAR(seg, info->video_rows));
- SET_BDA(char_height, GET_FARVAR(seg, info->char_height));
- SET_BDA(video_ctl, GET_FARVAR(seg, info->video_ctl));
- SET_BDA(video_switches, GET_FARVAR(seg, info->video_switches));
- SET_BDA(modeset_ctl, GET_FARVAR(seg, info->modeset_ctl));
- SET_BDA(cursor_type, GET_FARVAR(seg, info->cursor_type));
- int i;
- for (i = 0; i < 8; i++)
- SET_BDA(cursor_pos[i], GET_FARVAR(seg, info->cursor_pos[i]));
- SET_BDA(video_pagestart, GET_FARVAR(seg, info->video_pagestart));
- SET_BDA(video_page, GET_FARVAR(seg, info->video_page));
- /* current font */
+ memcpy_far(SEG_BDA, (void*)0x49, seg, info->bda_0x49
+ , sizeof(info->bda_0x49));
+ memcpy_far(SEG_BDA, (void*)0x84, seg, info->bda_0x84
+ , sizeof(info->bda_0x84));
+ SET_BDA(vbe_mode, GET_FARVAR(seg, info->vbe_mode));
SET_IVT(0x1f, GET_FARVAR(seg, info->font0));
SET_IVT(0x43, GET_FARVAR(seg, info->font1));
}
diff --git a/vgasrc/vgabios.h b/vgasrc/vgabios.h
index 800b61f..f58e498 100644
--- a/vgasrc/vgabios.h
+++ b/vgasrc/vgabios.h
@@ -20,20 +20,9 @@ struct VideoParam_s {
extern struct VideoParam_s video_param_table[29];
struct saveBDAstate {
- u16 video_mode;
- u16 video_cols;
- u16 video_pagesize;
- u16 crtc_address;
- u8 video_rows;
- u16 char_height;
- u8 video_ctl;
- u8 video_switches;
- u8 modeset_ctl;
- u16 cursor_type;
- u16 cursor_pos[8];
- u16 video_pagestart;
- u8 video_page;
- /* current font */
+ u8 bda_0x49[28];
+ u8 bda_0x84[6];
+ u16 vbe_mode;
struct segoff_s font0;
struct segoff_s font1;
};