From 2c39120098dfd447bfa5d65c0be5e52e7a4aff1e Mon Sep 17 00:00:00 2001 From: Peter Evans Date: Tue, 16 Jan 2018 16:13:50 -0600 Subject: [PATCH] Rename video_mode -> display_mode This also changes the _kind_ of field from an incrementally enumerated one to a collection of bit flags. --- include/apple2.h | 59 ++++++++++++++++++++++++++++++++++++++---------- src/apple2.c | 18 ++++++--------- tests/apple2.c | 37 ++++++++---------------------- 3 files changed, 63 insertions(+), 51 deletions(-) diff --git a/include/apple2.h b/include/apple2.h index 2d5a15d..8f6de09 100644 --- a/include/apple2.h +++ b/include/apple2.h @@ -35,15 +35,6 @@ */ #define APPLE2_APPLESOFT_MAIN 0xE000 -enum video_modes { - VIDEO_40COL_TEXT, - VIDEO_LORES, - VIDEO_HIRES, - VIDEO_80COL_TEXT, - VIDEO_DOUBLE_LORES, - VIDEO_DOUBLE_HIRES, -}; - enum color_modes { COLOR_GREEN, COLOR_AMBER, @@ -154,6 +145,50 @@ enum memory_mode { MEMORY_SLOTC3ROM = 0x80, }; +enum display_mode { + DISPLAY_DEFAULT = 0x0, + + /* + * Display text in the "alternate" character set + */ + DISPLAY_ALTCHAR = 0x1, + + /* + * Show text in 80 columns, rather than the default 40 columns + */ + DISPLAY_80COL = 0x2, + + /* + * Display only text. By default, we display lo-res graphics and + * perhaps mixed graphics and text if the MIXED bit is high. + */ + DISPLAY_TEXT = 0x4, + + /* + * If TEXT is not high, then we are directed to display both text + * and graphics. + */ + DISPLAY_MIXED = 0x8, + + /* + * If this is high, we will show high-resolution graphics; if not, + * low-resolution. This bit is overridden by TEXT; if TEXT is high, + * we will only show text. + */ + DISPLAY_HIRES = 0x10, + + /* + * Enable IOU access for $C058..$C05F when this bit is on; NOTE: the + * tech ref says that this is left on by the firmware + */ + DISPLAY_IOUDIS = 0x20, + + /* + * Display double-high-resolution graphics + */ + DISPLAY_DHIRES = 0x40, +}; + enum bank_switch { /* * In nominal bank-switch mode, reads in the bank-switchable address @@ -243,9 +278,9 @@ typedef struct { /* * This is the mode in which we must interpret graphics. This will * tell us not only if we're in lo- or hi-res, but also if we are in - * single or double view mode. + * single or double view mode. Among other things! */ - int video_mode; + vm_8bit display_mode; /* * This is the color mode we want to emulate. You can have a few @@ -288,6 +323,6 @@ extern void apple2_run_loop(apple2 *); extern void apple2_set_bank_switch(apple2 *, vm_8bit); extern void apple2_set_color(apple2 *, int); extern void apple2_set_memory_mode(apple2 *, vm_8bit); -extern void apple2_set_video(apple2 *, int); +extern void apple2_set_display(apple2 *, vm_8bit); #endif diff --git a/src/apple2.c b/src/apple2.c index 88d227b..7c13442 100644 --- a/src/apple2.c +++ b/src/apple2.c @@ -125,7 +125,7 @@ apple2_create(int width, int height) apple2_set_color(mach, COLOR_FULL); // We default to lo-res mode. - apple2_set_video(mach, VIDEO_LORES); + apple2_set_display(mach, DISPLAY_DEFAULT); // Let's install our bitmap font. mach->sysfont = vm_bitfont_create(mach->screen, @@ -193,9 +193,7 @@ bool apple2_is_double_video(apple2 *mach) { return - mach->video_mode == VIDEO_DOUBLE_HIRES || - mach->video_mode == VIDEO_DOUBLE_LORES || - mach->video_mode == VIDEO_80COL_TEXT; + mach->display_mode & DISPLAY_DHIRES; } /* @@ -255,7 +253,7 @@ apple2_reset(apple2 *mach) mach->cpu->S = 0; // Switch video mode back to 40 column text - apple2_set_video(mach, VIDEO_40COL_TEXT); + apple2_set_display(mach, DISPLAY_DEFAULT); // Switch us back to defaults apple2_set_bank_switch(mach, BANK_DEFAULT); @@ -388,15 +386,15 @@ apple2_set_color(apple2 *mach, int mode) } /* - * Set the video mode of the display. This would be the type of + * Set the display mode of the display. This would be the type of * resolution (text by which number of columns, lo-res, hi-res, etc.) */ void -apple2_set_video(apple2 *mach, int mode) +apple2_set_display(apple2 *mach, vm_8bit mode) { int width, height; - mach->video_mode = mode; + mach->display_mode = mode; // In the traditional video modes that Apple II first came in, you // would have a maximum width of 280 pixels. (In lo-res, you have @@ -407,9 +405,7 @@ apple2_set_video(apple2 *mach, int mode) // In double video modes, the width is effectively doubled, but the // height is untouched. - if (mach->video_mode == VIDEO_DOUBLE_LORES || - mach->video_mode == VIDEO_DOUBLE_HIRES - ) { + if (apple2_is_double_video(mach)) { width = 560; } diff --git a/tests/apple2.c b/tests/apple2.c index 1ad6329..7d4961d 100644 --- a/tests/apple2.c +++ b/tests/apple2.c @@ -34,29 +34,10 @@ Test(apple2, create) Test(apple2, is_double_video) { - for (int i = 0; i <= VIDEO_DOUBLE_HIRES; i++) { - mach->video_mode = i; - switch (i) { - case VIDEO_40COL_TEXT: - cr_assert_eq(apple2_is_double_video(mach), false); - break; - case VIDEO_LORES: - cr_assert_eq(apple2_is_double_video(mach), false); - break; - case VIDEO_HIRES: - cr_assert_eq(apple2_is_double_video(mach), false); - break; - case VIDEO_80COL_TEXT: - cr_assert_eq(apple2_is_double_video(mach), true); - break; - case VIDEO_DOUBLE_LORES: - cr_assert_eq(apple2_is_double_video(mach), true); - break; - case VIDEO_DOUBLE_HIRES: - cr_assert_eq(apple2_is_double_video(mach), true); - break; - } - } + mach->display_mode = DISPLAY_DEFAULT; + cr_assert_eq(apple2_is_double_video(mach), false); + mach->display_mode = DISPLAY_DHIRES; + cr_assert_eq(apple2_is_double_video(mach), true); } Test(apple2, boot) @@ -109,12 +90,12 @@ Test(apple2, set_color) cr_assert_eq(mach->color_mode, COLOR_FULL); } -Test(apple2, set_video) +Test(apple2, set_display) { - apple2_set_video(mach, VIDEO_DOUBLE_HIRES); - cr_assert_eq(mach->video_mode, VIDEO_DOUBLE_HIRES); - apple2_set_video(mach, VIDEO_LORES); - cr_assert_eq(mach->video_mode, VIDEO_LORES); + apple2_set_display(mach, DISPLAY_DHIRES); + cr_assert_eq(mach->display_mode, DISPLAY_DHIRES); + apple2_set_display(mach, DISPLAY_TEXT); + cr_assert_eq(mach->display_mode, DISPLAY_TEXT); } Test(apple2, set_bank_switch)