diff options
author | Kevin O'Connor <kevin@koconnor.net> | 2014-02-05 19:29:08 -0500 |
---|---|---|
committer | Kevin O'Connor <kevin@koconnor.net> | 2014-02-05 19:29:08 -0500 |
commit | da6a15762b07028926fe0d78b1b54153c4f0c560 (patch) | |
tree | 8530ba480598094dbce8258489427f30757fd488 /vgasrc | |
parent | f5ec1e0a5e2f0b12ed4fd250f6bfeabb0feacd25 (diff) | |
download | qemu-seabios-da6a15762b07028926fe0d78b1b54153c4f0c560.tar.gz |
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>
Diffstat (limited to 'vgasrc')
-rw-r--r-- | vgasrc/vgabios.c | 47 | ||||
-rw-r--r-- | vgasrc/vgabios.h | 17 |
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; }; |