mirror of
https://github.com/mauiaaron/apple2.git
synced 2024-09-27 09:56:08 +00:00
Make use of the video memory dirty bit
This commit is contained in:
parent
5ce91fa96d
commit
7ef70e7943
144
src/display.c
144
src/display.c
@ -778,28 +778,76 @@ static void (*_textpage_plotter(uint32_t currswitches, uint32_t txtflags))(uint1
|
|||||||
return plotFn;
|
return plotFn;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline drawpage_mode_t _currentMainMode(uint32_t currswitches) {
|
||||||
|
if (currswitches & SS_TEXT) {
|
||||||
|
return DRAWPAGE_TEXT;
|
||||||
|
} else {
|
||||||
|
if (currswitches & SS_HIRES) {
|
||||||
|
return DRAWPAGE_HIRES;
|
||||||
|
} else {
|
||||||
|
return DRAWPAGE_TEXT; // (LORES)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline drawpage_mode_t _currentMixedMode(uint32_t currswitches) {
|
||||||
|
if (currswitches & (SS_TEXT|SS_MIXED)) {
|
||||||
|
return DRAWPAGE_TEXT;
|
||||||
|
} else {
|
||||||
|
if (currswitches & SS_HIRES) {
|
||||||
|
return DRAWPAGE_HIRES;
|
||||||
|
} else {
|
||||||
|
return DRAWPAGE_TEXT; // (LORES)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
GLUE_C_WRITE(video__write_2e_text0)
|
GLUE_C_WRITE(video__write_2e_text0)
|
||||||
{
|
{
|
||||||
base_textwrt[ea] = b;
|
base_textwrt[ea] = b;
|
||||||
video_setDirty(A2_DIRTY_FLAG);
|
drawpage_mode_t mode = _currentMainMode(softswitches);
|
||||||
|
if (mode == DRAWPAGE_HIRES) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (!(softswitches & SS_PAGE2)) {
|
||||||
|
video_setDirty(A2_DIRTY_FLAG);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
GLUE_C_WRITE(video__write_2e_text0_mixed)
|
GLUE_C_WRITE(video__write_2e_text0_mixed)
|
||||||
{
|
{
|
||||||
base_textwrt[ea] = b;
|
base_textwrt[ea] = b;
|
||||||
video_setDirty(A2_DIRTY_FLAG);
|
drawpage_mode_t mode = _currentMixedMode(softswitches);
|
||||||
|
if (mode == DRAWPAGE_HIRES) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (!(softswitches & SS_PAGE2)) {
|
||||||
|
video_setDirty(A2_DIRTY_FLAG);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
GLUE_C_WRITE(video__write_2e_text1)
|
GLUE_C_WRITE(video__write_2e_text1)
|
||||||
{
|
{
|
||||||
base_ramwrt[ea] = b;
|
base_ramwrt[ea] = b;
|
||||||
video_setDirty(A2_DIRTY_FLAG);
|
drawpage_mode_t mode = _currentMainMode(softswitches);
|
||||||
|
if (mode == DRAWPAGE_HIRES) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (softswitches & SS_PAGE2) {
|
||||||
|
video_setDirty(A2_DIRTY_FLAG);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
GLUE_C_WRITE(video__write_2e_text1_mixed)
|
GLUE_C_WRITE(video__write_2e_text1_mixed)
|
||||||
{
|
{
|
||||||
base_ramwrt[ea] = b;
|
base_ramwrt[ea] = b;
|
||||||
video_setDirty(A2_DIRTY_FLAG);
|
drawpage_mode_t mode = _currentMixedMode(softswitches);
|
||||||
|
if (mode == DRAWPAGE_HIRES) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (softswitches & SS_PAGE2) {
|
||||||
|
video_setDirty(A2_DIRTY_FLAG);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
@ -1037,49 +1085,97 @@ static void (*_hirespage_plotter(uint32_t currswitches))(uint16_t, int, int, boo
|
|||||||
GLUE_C_WRITE(video__write_2e_even0)
|
GLUE_C_WRITE(video__write_2e_even0)
|
||||||
{
|
{
|
||||||
base_hgrwrt[ea] = b;
|
base_hgrwrt[ea] = b;
|
||||||
video_setDirty(A2_DIRTY_FLAG);
|
drawpage_mode_t mode = _currentMainMode(softswitches);
|
||||||
|
if (mode == DRAWPAGE_TEXT) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (!(softswitches & SS_PAGE2)) {
|
||||||
|
video_setDirty(A2_DIRTY_FLAG);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
GLUE_C_WRITE(video__write_2e_even0_mixed)
|
GLUE_C_WRITE(video__write_2e_even0_mixed)
|
||||||
{
|
{
|
||||||
base_hgrwrt[ea] = b;
|
base_hgrwrt[ea] = b;
|
||||||
video_setDirty(A2_DIRTY_FLAG);
|
drawpage_mode_t mode = _currentMixedMode(softswitches);
|
||||||
|
if (mode == DRAWPAGE_TEXT) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (!(softswitches & SS_PAGE2)) {
|
||||||
|
video_setDirty(A2_DIRTY_FLAG);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
GLUE_C_WRITE(video__write_2e_odd0)
|
GLUE_C_WRITE(video__write_2e_odd0)
|
||||||
{
|
{
|
||||||
base_hgrwrt[ea] = b;
|
base_hgrwrt[ea] = b;
|
||||||
video_setDirty(A2_DIRTY_FLAG);
|
drawpage_mode_t mode = _currentMainMode(softswitches);
|
||||||
|
if (mode == DRAWPAGE_TEXT) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (!(softswitches & SS_PAGE2)) {
|
||||||
|
video_setDirty(A2_DIRTY_FLAG);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
GLUE_C_WRITE(video__write_2e_odd0_mixed)
|
GLUE_C_WRITE(video__write_2e_odd0_mixed)
|
||||||
{
|
{
|
||||||
base_hgrwrt[ea] = b;
|
base_hgrwrt[ea] = b;
|
||||||
video_setDirty(A2_DIRTY_FLAG);
|
drawpage_mode_t mode = _currentMixedMode(softswitches);
|
||||||
|
if (mode == DRAWPAGE_TEXT) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (!(softswitches & SS_PAGE2)) {
|
||||||
|
video_setDirty(A2_DIRTY_FLAG);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
GLUE_C_WRITE(video__write_2e_even1)
|
GLUE_C_WRITE(video__write_2e_even1)
|
||||||
{
|
{
|
||||||
base_ramwrt[ea] = b;
|
base_ramwrt[ea] = b;
|
||||||
video_setDirty(A2_DIRTY_FLAG);
|
drawpage_mode_t mode = _currentMainMode(softswitches);
|
||||||
|
if (mode == DRAWPAGE_TEXT) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (softswitches & SS_PAGE2) {
|
||||||
|
video_setDirty(A2_DIRTY_FLAG);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
GLUE_C_WRITE(video__write_2e_even1_mixed)
|
GLUE_C_WRITE(video__write_2e_even1_mixed)
|
||||||
{
|
{
|
||||||
base_ramwrt[ea] = b;
|
base_ramwrt[ea] = b;
|
||||||
video_setDirty(A2_DIRTY_FLAG);
|
drawpage_mode_t mode = _currentMixedMode(softswitches);
|
||||||
|
if (mode == DRAWPAGE_TEXT) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (softswitches & SS_PAGE2) {
|
||||||
|
video_setDirty(A2_DIRTY_FLAG);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
GLUE_C_WRITE(video__write_2e_odd1)
|
GLUE_C_WRITE(video__write_2e_odd1)
|
||||||
{
|
{
|
||||||
base_ramwrt[ea] = b;
|
base_ramwrt[ea] = b;
|
||||||
video_setDirty(A2_DIRTY_FLAG);
|
drawpage_mode_t mode = _currentMainMode(softswitches);
|
||||||
|
if (mode == DRAWPAGE_TEXT) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (softswitches & SS_PAGE2) {
|
||||||
|
video_setDirty(A2_DIRTY_FLAG);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
GLUE_C_WRITE(video__write_2e_odd1_mixed)
|
GLUE_C_WRITE(video__write_2e_odd1_mixed)
|
||||||
{
|
{
|
||||||
base_ramwrt[ea] = b;
|
base_ramwrt[ea] = b;
|
||||||
video_setDirty(A2_DIRTY_FLAG);
|
drawpage_mode_t mode = _currentMixedMode(softswitches);
|
||||||
|
if (mode == DRAWPAGE_TEXT) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (softswitches & SS_PAGE2) {
|
||||||
|
video_setDirty(A2_DIRTY_FLAG);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
@ -1169,30 +1265,6 @@ bool video_loadState(StateHelper_s *helper) {
|
|||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
static inline drawpage_mode_t _currentMainMode(uint32_t currswitches) {
|
|
||||||
if (currswitches & SS_TEXT) {
|
|
||||||
return DRAWPAGE_TEXT;
|
|
||||||
} else {
|
|
||||||
if (currswitches & SS_HIRES) {
|
|
||||||
return DRAWPAGE_HIRES;
|
|
||||||
} else {
|
|
||||||
return DRAWPAGE_TEXT; // (LORES)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline drawpage_mode_t _currentMixedMode(uint32_t currswitches) {
|
|
||||||
if (currswitches & (SS_TEXT|SS_MIXED)) {
|
|
||||||
return DRAWPAGE_TEXT;
|
|
||||||
} else {
|
|
||||||
if (currswitches & SS_HIRES) {
|
|
||||||
return DRAWPAGE_HIRES;
|
|
||||||
} else {
|
|
||||||
return DRAWPAGE_TEXT; // (LORES)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void _currentPageAndBank(uint32_t currswitches, drawpage_mode_t mode, OUTPARM int *page, OUTPARM int *bank) {
|
static inline void _currentPageAndBank(uint32_t currswitches, drawpage_mode_t mode, OUTPARM int *page, OUTPARM int *bank) {
|
||||||
// UTAIIe : 5-25
|
// UTAIIe : 5-25
|
||||||
if (currswitches & SS_80STORE) {
|
if (currswitches & SS_80STORE) {
|
||||||
|
@ -310,8 +310,6 @@ static void glvideo_render(void) {
|
|||||||
if (!cpu_isPaused()) {
|
if (!cpu_isPaused()) {
|
||||||
// check if a2 video memory is dirty
|
// check if a2 video memory is dirty
|
||||||
unsigned long wasDirty = video_clearDirty(A2_DIRTY_FLAG);
|
unsigned long wasDirty = video_clearDirty(A2_DIRTY_FLAG);
|
||||||
wasDirty = 1;
|
|
||||||
#warning HACK FIXME TODO ... always setting A2 video memory dirty bit for now ...
|
|
||||||
if (wasDirty) {
|
if (wasDirty) {
|
||||||
fb = video_scan();
|
fb = video_scan();
|
||||||
}
|
}
|
||||||
|
24
src/vm.c
24
src/vm.c
@ -159,9 +159,10 @@ GLUE_C_READ(iie_page2_on)
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
softswitches |= SS_SCREEN;
|
softswitches |= SS_SCREEN;
|
||||||
video_setDirty(A2_DIRTY_FLAG);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
video_setDirty(A2_DIRTY_FLAG);
|
||||||
|
|
||||||
return floating_bus();
|
return floating_bus();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -174,6 +175,7 @@ GLUE_C_READ(read_switch_graphics)
|
|||||||
{
|
{
|
||||||
if (softswitches & SS_TEXT) {
|
if (softswitches & SS_TEXT) {
|
||||||
softswitches &= ~SS_TEXT;
|
softswitches &= ~SS_TEXT;
|
||||||
|
video_setDirty(A2_DIRTY_FLAG);
|
||||||
}
|
}
|
||||||
return floating_bus();
|
return floating_bus();
|
||||||
}
|
}
|
||||||
@ -182,6 +184,7 @@ GLUE_C_READ(read_switch_text)
|
|||||||
{
|
{
|
||||||
if (!(softswitches & SS_TEXT)) {
|
if (!(softswitches & SS_TEXT)) {
|
||||||
softswitches |= SS_TEXT;
|
softswitches |= SS_TEXT;
|
||||||
|
video_setDirty(A2_DIRTY_FLAG);
|
||||||
}
|
}
|
||||||
return floating_bus();
|
return floating_bus();
|
||||||
}
|
}
|
||||||
@ -195,6 +198,7 @@ GLUE_C_READ(read_switch_no_mixed)
|
|||||||
{
|
{
|
||||||
if (softswitches & SS_MIXED) {
|
if (softswitches & SS_MIXED) {
|
||||||
softswitches &= ~SS_MIXED;
|
softswitches &= ~SS_MIXED;
|
||||||
|
video_setDirty(A2_DIRTY_FLAG);
|
||||||
}
|
}
|
||||||
return floating_bus();
|
return floating_bus();
|
||||||
}
|
}
|
||||||
@ -203,6 +207,7 @@ GLUE_C_READ(read_switch_mixed)
|
|||||||
{
|
{
|
||||||
if (!(softswitches & SS_MIXED)) {
|
if (!(softswitches & SS_MIXED)) {
|
||||||
softswitches |= SS_MIXED;
|
softswitches |= SS_MIXED;
|
||||||
|
video_setDirty(A2_DIRTY_FLAG);
|
||||||
}
|
}
|
||||||
return floating_bus();
|
return floating_bus();
|
||||||
}
|
}
|
||||||
@ -240,6 +245,8 @@ GLUE_C_READ(iie_hires_off)
|
|||||||
softswitches |= SS_HGRWRT;
|
softswitches |= SS_HGRWRT;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
video_setDirty(A2_DIRTY_FLAG);
|
||||||
|
|
||||||
return floating_bus();
|
return floating_bus();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -263,6 +270,8 @@ GLUE_C_READ(iie_hires_on)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
video_setDirty(A2_DIRTY_FLAG);
|
||||||
|
|
||||||
return floating_bus();
|
return floating_bus();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -536,9 +545,10 @@ GLUE_C_READ(iie_80store_off)
|
|||||||
|
|
||||||
if (softswitches & SS_PAGE2) {
|
if (softswitches & SS_PAGE2) {
|
||||||
softswitches |= SS_SCREEN;
|
softswitches |= SS_SCREEN;
|
||||||
video_setDirty(A2_DIRTY_FLAG);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
video_setDirty(A2_DIRTY_FLAG);
|
||||||
|
|
||||||
return floating_bus();
|
return floating_bus();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -601,6 +611,8 @@ GLUE_C_READ(iie_ramrd_main)
|
|||||||
base_hgrrd = apple_ii_64k[0];
|
base_hgrrd = apple_ii_64k[0];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
video_setDirty(A2_DIRTY_FLAG);
|
||||||
|
|
||||||
return floating_bus();
|
return floating_bus();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -624,6 +636,8 @@ GLUE_C_READ(iie_ramrd_aux)
|
|||||||
base_hgrrd = apple_ii_64k[1];
|
base_hgrrd = apple_ii_64k[1];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
video_setDirty(A2_DIRTY_FLAG);
|
||||||
|
|
||||||
return floating_bus();
|
return floating_bus();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -733,6 +747,7 @@ GLUE_C_READ(iie_80col_off)
|
|||||||
}
|
}
|
||||||
|
|
||||||
softswitches &= ~SS_80COL;
|
softswitches &= ~SS_80COL;
|
||||||
|
video_setDirty(A2_DIRTY_FLAG);
|
||||||
|
|
||||||
return floating_bus();
|
return floating_bus();
|
||||||
}
|
}
|
||||||
@ -744,6 +759,7 @@ GLUE_C_READ(iie_80col_on)
|
|||||||
}
|
}
|
||||||
|
|
||||||
softswitches |= SS_80COL;
|
softswitches |= SS_80COL;
|
||||||
|
video_setDirty(A2_DIRTY_FLAG);
|
||||||
|
|
||||||
return floating_bus();
|
return floating_bus();
|
||||||
}
|
}
|
||||||
@ -758,6 +774,7 @@ GLUE_C_READ(iie_altchar_off)
|
|||||||
if (softswitches & SS_ALTCHAR) {
|
if (softswitches & SS_ALTCHAR) {
|
||||||
softswitches &= ~SS_ALTCHAR;
|
softswitches &= ~SS_ALTCHAR;
|
||||||
video_loadfont(0x40,0x40,ucase_glyphs,3);
|
video_loadfont(0x40,0x40,ucase_glyphs,3);
|
||||||
|
video_setDirty(A2_DIRTY_FLAG);
|
||||||
}
|
}
|
||||||
return floating_bus();
|
return floating_bus();
|
||||||
}
|
}
|
||||||
@ -768,6 +785,7 @@ GLUE_C_READ(iie_altchar_on)
|
|||||||
softswitches |= SS_ALTCHAR;
|
softswitches |= SS_ALTCHAR;
|
||||||
video_loadfont(0x40,0x20,mousetext_glyphs,1);
|
video_loadfont(0x40,0x20,mousetext_glyphs,1);
|
||||||
video_loadfont(0x60,0x20,lcase_glyphs,2);
|
video_loadfont(0x60,0x20,lcase_glyphs,2);
|
||||||
|
video_setDirty(A2_DIRTY_FLAG);
|
||||||
}
|
}
|
||||||
return floating_bus();
|
return floating_bus();
|
||||||
}
|
}
|
||||||
@ -799,6 +817,7 @@ GLUE_C_READ(iie_dhires_on)
|
|||||||
{
|
{
|
||||||
if (!(softswitches & SS_DHIRES)) {
|
if (!(softswitches & SS_DHIRES)) {
|
||||||
softswitches |= SS_DHIRES;
|
softswitches |= SS_DHIRES;
|
||||||
|
video_setDirty(A2_DIRTY_FLAG);
|
||||||
}
|
}
|
||||||
return floating_bus();
|
return floating_bus();
|
||||||
}
|
}
|
||||||
@ -807,6 +826,7 @@ GLUE_C_READ(iie_dhires_off)
|
|||||||
{
|
{
|
||||||
if (softswitches & SS_DHIRES) {
|
if (softswitches & SS_DHIRES) {
|
||||||
softswitches &= ~SS_DHIRES;
|
softswitches &= ~SS_DHIRES;
|
||||||
|
video_setDirty(A2_DIRTY_FLAG);
|
||||||
}
|
}
|
||||||
return floating_bus();
|
return floating_bus();
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user