From df2889bf95eb0ba19b3406892ce33d178bfd93a7 Mon Sep 17 00:00:00 2001 From: Shamus Hammons Date: Mon, 31 Mar 2014 13:59:37 -0500 Subject: [PATCH] Fixed Apple power state to pause CPU thread immediately. --- src/apple2.cpp | 37 +++++------------------- src/apple2.h | 1 - src/applevideo.cpp | 72 +++++++++++++++++++++++++--------------------- 3 files changed, 47 insertions(+), 63 deletions(-) diff --git a/src/apple2.cpp b/src/apple2.cpp index 9afc35f..9a659b2 100644 --- a/src/apple2.cpp +++ b/src/apple2.cpp @@ -140,6 +140,7 @@ int CPUThreadFunc(void * data) do { +// This is never set to true anywhere... if (cpuSleep) SDL_CondWait(cpuCond, cpuMutex); @@ -151,31 +152,6 @@ SDL_SemWait(mainSem); // There are exactly 800 slices of 21.333 cycles per frame, so it works out // evenly. -#if 0 - uint32_t cycles = 17066; -#ifdef CPU_THREAD_OVERFLOW_COMPENSATION -// ODD! It's closer *without* this overflow compensation. ??? WHY ??? - overflow += 0.666666667; - - if (overflow > 1.0) - { - overflow -= 1.0; - cycles++; - } -#endif - -#ifdef THREAD_DEBUGGING -WriteLog("CPU: Execute65C02(&mainCPU, cycles);\n"); -#endif - Execute65C02(&mainCPU, cycles); // how much? 1 frame (after 1 s, off by 40 cycles) not any more--it's off by as much as 240 now! - - // Adjust the sound routine's last cycle toggled time base - // Also, since we're finished executing, .clock is now valid -#ifdef THREAD_DEBUGGING -WriteLog("CPU: AdjustLastToggleCycles(mainCPU.clock);\n"); -#endif - AdjustLastToggleCycles(mainCPU.clock); -#else #ifdef THREAD_DEBUGGING WriteLog("CPU: Execute65C02(&mainCPU, cycles);\n"); #endif @@ -196,7 +172,6 @@ WriteLog("CPU: Execute65C02(&mainCPU, cycles);\n"); // Dunno if this is correct (seems to be close enough)... vbl = (i < 670 ? true : false); } -#endif #ifdef THREAD_DEBUGGING WriteLog("CPU: SDL_mutexP(cpuMutex);\n"); @@ -847,14 +822,16 @@ static void FrameCallback(void) { pauseMode = false; SoundResume(); - ResetApple2State(); + // Unlock the CPU thread... + SDL_SemPost(mainSem); } else { pauseMode = true; + // Should lock until CPU thread is waiting... + SDL_SemWait(mainSem); SoundPause(); -//NOPE SDL_SemWait(mainSem);//should lock until CPU thread is waiting... -// ResetApple2State(); + ResetApple2State(); } powerStateChangeRequested = false; @@ -902,7 +879,7 @@ if (counter == 60) uint64_t cpuCycles = GetCurrentV65C02Clock(); uint32_t cyclesBurned = (uint32_t)(cpuCycles - lastCPUCycles); WriteLog("FrameCallback: used %i cycles\n", cyclesBurned); - lastCPUCycles = cpuCycles; + lastCPUCycles = cpuCycles #endif //let's wait, then signal... diff --git a/src/apple2.h b/src/apple2.h index 0b60d62..17a1f01 100644 --- a/src/apple2.h +++ b/src/apple2.h @@ -15,7 +15,6 @@ void SetPowerState(void); extern uint8_t ram[0x10000], rom[0x10000]; // RAM & ROM pointers extern uint8_t ram2[0x10000]; // Auxillary RAM -//extern uint8_t diskRom[0x100]; // Floppy disk ROM extern uint8_t appleType; extern FloppyDrive floppyDrive; extern uint8_t lastKeyPressed; diff --git a/src/applevideo.cpp b/src/applevideo.cpp index e7672cf..f9a8b0d 100644 --- a/src/applevideo.cpp +++ b/src/applevideo.cpp @@ -35,6 +35,7 @@ #include "video.h" #include "charset.h" #include "gui/font14pt.h" +#include "gui/gui.h" /* Reference: Technote tn-iigs-063 "Master Color Values" @@ -869,43 +870,50 @@ static void RenderDHiRes(uint16_t toLine/*= 192*/) void RenderVideoFrame(void) { - if (textMode) + if (GUI::powerOnState == true) { - if (!col80Mode) - Render40ColumnText(); + if (textMode) + { + if (!col80Mode) + Render40ColumnText(); + else + Render80ColumnText(); + } else - Render80ColumnText(); + { + if (mixedMode) + { + if (hiRes) + { + RenderHiRes(160); + Render40ColumnTextLine(20); + Render40ColumnTextLine(21); + Render40ColumnTextLine(22); + Render40ColumnTextLine(23); + } + else + { + RenderLoRes(20); + Render40ColumnTextLine(20); + Render40ColumnTextLine(21); + Render40ColumnTextLine(22); + Render40ColumnTextLine(23); + } + } + else + { + if (dhires) + RenderDHiRes(); + else if (hiRes) + RenderHiRes(); + else + RenderLoRes(); + } + } } else { - if (mixedMode) - { - if (hiRes) - { - RenderHiRes(160); - Render40ColumnTextLine(20); - Render40ColumnTextLine(21); - Render40ColumnTextLine(22); - Render40ColumnTextLine(23); - } - else - { - RenderLoRes(20); - Render40ColumnTextLine(20); - Render40ColumnTextLine(21); - Render40ColumnTextLine(22); - Render40ColumnTextLine(23); - } - } - else - { - if (dhires) - RenderDHiRes(); - else if (hiRes) - RenderHiRes(); - else - RenderLoRes(); - } + memset(scrBuffer, 0, VIRTUAL_SCREEN_WIDTH * VIRTUAL_SCREEN_HEIGHT * sizeof(uint32_t)); } if (msgTicks)