diff --git a/emulator/Emulator.cpp b/emulator/Emulator.cpp index fad6f12..96eb8f0 100644 --- a/emulator/Emulator.cpp +++ b/emulator/Emulator.cpp @@ -69,7 +69,8 @@ const BYTE m_arrDigitKeyScans[] = 0176, 0030, 0031, 0032, 0013, 0034, 0035, 0016, 0017, 0177 // 0, 1, ... 9 }; -const uint32_t ScreenView_StandardGRBColors[16 * 8] = +// Table for color conversion yrgb (4 bits) -> DWORD (32 bits) +const uint32_t ScreenView_StandardRGBColors[16 * 8] = { 0xFF000000, 0xFF800000, 0xFF008000, 0xFF808000, 0xFF000080, 0xFF800080, 0xFF008080, 0xFF808080, 0xFF000000, 0xFFFF0000, 0xFF00FF00, 0xFFFFFF00, 0xFF0000FF, 0xFFFF00FF, 0xFF00FFFF, 0xFFFFFFFF, @@ -88,7 +89,45 @@ const uint32_t ScreenView_StandardGRBColors[16 * 8] = 0xFF000000, 0xFF600000, 0xFF006000, 0xFF606000, 0xFF000060, 0xFF600060, 0xFF006060, 0xFF606060, 0xFF000000, 0xFFDF0000, 0xFF00DF00, 0xFFDFDF00, 0xFF0000DF, 0xFFDF00DF, 0xFF00DFDF, 0xFFDFDFDF, }; - +const uint32_t ScreenView_StandardGRBColors[16 * 8] = +{ + 0xFF000000, 0xFF800000, 0xFF000080, 0xFF800080, 0xFF008000, 0xFF808000, 0xFF008080, 0xFF808080, + 0xFF000000, 0xFFFF0000, 0xFF0000FF, 0xFFFF00FF, 0xFF00FF00, 0xFFFFFF00, 0xFF00FFFF, 0xFFFFFFFF, + 0xFF000000, 0xFF600000, 0xFF000080, 0xFF600080, 0xFF008000, 0xFF608000, 0xFF008080, 0xFF608080, + 0xFF000000, 0xFFDF0000, 0xFF0000FF, 0xFFDF00FF, 0xFF00FF00, 0xFFDFFF00, 0xFF00FFFF, 0xFFDFFFFF, + 0xFF000000, 0xFF800000, 0xFF000060, 0xFF800060, 0xFF008000, 0xFF808000, 0xFF008060, 0xFF808060, + 0xFF000000, 0xFFFF0000, 0xFF0000DF, 0xFFFF00DF, 0xFF00FF00, 0xFFFFFF00, 0xFF00FFDF, 0xFFFFFFDF, + 0xFF000000, 0xFF600000, 0xFF000060, 0xFF600060, 0xFF008000, 0xFF608000, 0xFF008060, 0xFF608060, + 0xFF000000, 0xFFDF0000, 0xFF0000DF, 0xFFDF00DF, 0xFF00FF00, 0xFFDFFF00, 0xFF00FFDF, 0xFFDFFFDF, + 0xFF000000, 0xFF800000, 0xFF000080, 0xFF800080, 0xFF006000, 0xFF806000, 0xFF006080, 0xFF806080, + 0xFF000000, 0xFFFF0000, 0xFF0000FF, 0xFFFF00FF, 0xFF00DF00, 0xFFFFDF00, 0xFF00DFFF, 0xFFFFDFFF, + 0xFF000000, 0xFF600000, 0xFF000080, 0xFF600080, 0xFF006000, 0xFF606000, 0xFF006080, 0xFF606080, + 0xFF000000, 0xFFDF0000, 0xFF0000FF, 0xFFDF00FF, 0xFF00DF00, 0xFFDFDF00, 0xFF00DFFF, 0xFFDFDFFF, + 0xFF000000, 0xFF800000, 0xFF000060, 0xFF800060, 0xFF006000, 0xFF806000, 0xFF006060, 0xFF806060, + 0xFF000000, 0xFFFF0000, 0xFF0000DF, 0xFFFF00DF, 0xFF00DF00, 0xFFFFDF00, 0xFF00DFDF, 0xFFFFDFDF, + 0xFF000000, 0xFF600000, 0xFF000060, 0xFF600060, 0xFF006000, 0xFF606000, 0xFF006060, 0xFF606060, + 0xFF000000, 0xFFDF0000, 0xFF0000DF, 0xFFDF00DF, 0xFF00DF00, 0xFFDFDF00, 0xFF00DFDF, 0xFFDFDFDF, +}; +// Table for color conversion, gray (black and white) display +const uint32_t ScreenView_StandardGrayColors[16 * 8] = +{ + 0xFF000000, 0xFF242424, 0xFF484848, 0xFF6C6C6C, 0xFF909090, 0xFFB4B4B4, 0xFFD8D8D8, 0xFFFFFFFF, + 0xFF000000, 0xFF242424, 0xFF484848, 0xFF6C6C6C, 0xFF909090, 0xFFB4B4B4, 0xFFD8D8D8, 0xFFFFFFFF, + 0xFF000000, 0xFF242424, 0xFF484848, 0xFF6C6C6C, 0xFF909090, 0xFFB4B4B4, 0xFFD8D8D8, 0xFFFFFFFF, + 0xFF000000, 0xFF242424, 0xFF484848, 0xFF6C6C6C, 0xFF909090, 0xFFB4B4B4, 0xFFD8D8D8, 0xFFFFFFFF, + 0xFF000000, 0xFF242424, 0xFF484848, 0xFF6C6C6C, 0xFF909090, 0xFFB4B4B4, 0xFFD8D8D8, 0xFFFFFFFF, + 0xFF000000, 0xFF242424, 0xFF484848, 0xFF6C6C6C, 0xFF909090, 0xFFB4B4B4, 0xFFD8D8D8, 0xFFFFFFFF, + 0xFF000000, 0xFF242424, 0xFF484848, 0xFF6C6C6C, 0xFF909090, 0xFFB4B4B4, 0xFFD8D8D8, 0xFFFFFFFF, + 0xFF000000, 0xFF242424, 0xFF484848, 0xFF6C6C6C, 0xFF909090, 0xFFB4B4B4, 0xFFD8D8D8, 0xFFFFFFFF, + 0xFF000000, 0xFF242424, 0xFF484848, 0xFF6C6C6C, 0xFF909090, 0xFFB4B4B4, 0xFFD8D8D8, 0xFFFFFFFF, + 0xFF000000, 0xFF242424, 0xFF484848, 0xFF6C6C6C, 0xFF909090, 0xFFB4B4B4, 0xFFD8D8D8, 0xFFFFFFFF, + 0xFF000000, 0xFF242424, 0xFF484848, 0xFF6C6C6C, 0xFF909090, 0xFFB4B4B4, 0xFFD8D8D8, 0xFFFFFFFF, + 0xFF000000, 0xFF242424, 0xFF484848, 0xFF6C6C6C, 0xFF909090, 0xFFB4B4B4, 0xFFD8D8D8, 0xFFFFFFFF, + 0xFF000000, 0xFF242424, 0xFF484848, 0xFF6C6C6C, 0xFF909090, 0xFFB4B4B4, 0xFFD8D8D8, 0xFFFFFFFF, + 0xFF000000, 0xFF242424, 0xFF484848, 0xFF6C6C6C, 0xFF909090, 0xFFB4B4B4, 0xFFD8D8D8, 0xFFFFFFFF, + 0xFF000000, 0xFF242424, 0xFF484848, 0xFF6C6C6C, 0xFF909090, 0xFFB4B4B4, 0xFFD8D8D8, 0xFFFFFFFF, + 0xFF000000, 0xFF242424, 0xFF484848, 0xFF6C6C6C, 0xFF909090, 0xFFB4B4B4, 0xFFD8D8D8, 0xFFFFFFFF, +}; ////////////////////////////////////////////////////////////////////// diff --git a/emulator/Emulator.h b/emulator/Emulator.h index 4a08a21..c4ca91f 100644 --- a/emulator/Emulator.h +++ b/emulator/Emulator.h @@ -30,7 +30,10 @@ extern uint16_t g_wEmulatorPrevCpuPC; // Previous PC value extern uint16_t g_wEmulatorPpuPC; // Current PC value extern uint16_t g_wEmulatorPrevPpuPC; // Previous PC value +extern const uint32_t ScreenView_StandardRGBColors[16 * 8]; extern const uint32_t ScreenView_StandardGRBColors[16 * 8]; +extern const uint32_t ScreenView_StandardGrayColors[16 * 8]; + ////////////////////////////////////////////////////////////////////// diff --git a/emulator/Main.h b/emulator/Main.h index a00bc7e..7404545 100644 --- a/emulator/Main.h +++ b/emulator/Main.h @@ -77,6 +77,8 @@ void Settings_SetCartridgeFilePath(int slot, LPCTSTR sFilePath); void Settings_GetCartridgeFilePath(int slot, LPTSTR buffer); void Settings_SetHardFilePath(int slot, LPCTSTR sFilePath); void Settings_GetHardFilePath(int slot, LPTSTR buffer); +void Settings_SetScreenViewMode(int mode); +int Settings_GetScreenViewMode(); void Settings_SetScreenshotMode(int mode); int Settings_GetScreenshotMode(); BOOL Settings_GetDebugCpuPpu(); @@ -159,6 +161,14 @@ void ImGuiMainMenu(); void ControlView_ImGuiWidget(); // ScreenView + +enum ScreenViewMode +{ + RGBScreen = 0, + GRBScreen = 1, + GrayScreen = 2, +}; + void ScreenView_Init(); void ScreenView_Done(); void ScreenView_ImGuiWidget(); diff --git a/emulator/MainWindow.cpp b/emulator/MainWindow.cpp index 7026641..fa2585c 100644 --- a/emulator/MainWindow.cpp +++ b/emulator/MainWindow.cpp @@ -23,6 +23,7 @@ void ImGuiSettingsPopup(); void ImGuiAboutPopup(); void MainWindow_DoEmulatorSpeed(WORD speed); +void MainWindow_DoScreenViewMode(ScreenViewMode mode); void MainWindow_DoFloppyImageSelect(int slot); void MainWindow_DoFloppyImageEject(int slot); void MainWindow_DoCartridgeSelect(int slot); @@ -102,6 +103,20 @@ void ImGuiMainMenu() } if (ImGui::BeginMenu("View")) { + int viewmode = Settings_GetScreenViewMode(); + bool checkedRGB = viewmode == 0; + ImGui::BeginDisabled(checkedRGB); + if (ImGui::MenuItem("RGB Screen", nullptr, &checkedRGB)) MainWindow_DoScreenViewMode(RGBScreen); + ImGui::EndDisabled(); + bool checkedGRB = viewmode == 1; + ImGui::BeginDisabled(checkedGRB); + if (ImGui::MenuItem("GRB Screen", nullptr, &checkedGRB)) MainWindow_DoScreenViewMode(GRBScreen); + ImGui::EndDisabled(); + bool checkedGray = viewmode == 2; + ImGui::BeginDisabled(checkedGray); + if (ImGui::MenuItem("Grayscale Screen", nullptr, &checkedGray)) MainWindow_DoScreenViewMode(GrayScreen); + ImGui::EndDisabled(); + ImGui::EndMenu(); } if (ImGui::BeginMenu("Emulator")) @@ -292,6 +307,24 @@ void ControlView_ImGuiWidget() if (ImGui::Button("Max")) MainWindow_DoEmulatorSpeed(0); ImGui::EndDisabled(); + ImGui::SeparatorText("Video"); + int viewmode = Settings_GetScreenViewMode(); + ImGui::BeginDisabled(viewmode == 0); + if (ImGui::Button("RGB")) MainWindow_DoScreenViewMode(RGBScreen); + ImGui::EndDisabled(); + ImGui::SameLine(0.0f, 0.0f); + ImGui::BeginDisabled(viewmode == 1); + if (ImGui::Button("GRB")) MainWindow_DoScreenViewMode(GRBScreen); + ImGui::EndDisabled(); + ImGui::SameLine(0.0f, 0.0f); + ImGui::BeginDisabled(viewmode == 2); + if (ImGui::Button("Gray")) MainWindow_DoScreenViewMode(GrayScreen); + ImGui::EndDisabled(); + + //ImGui::TextDisabled("X: "); + //ImGui::SameLine(); + //ImGui::TextDisabled("Y: "); + ImGui::SeparatorText("Floppies"); for (int floppyslot = 0; floppyslot < 4; floppyslot++) { @@ -399,6 +432,11 @@ void MainWindow_DoEmulatorSpeed(WORD speed) Emulator_SetSpeed(speed); } +void MainWindow_DoScreenViewMode(ScreenViewMode mode) +{ + Settings_SetScreenViewMode(mode); +} + void MainWindow_DoFloppyImageSelect(int slot) { // File Open dialog diff --git a/emulator/Settings.cpp b/emulator/Settings.cpp index 1631da8..3bffcf0 100644 --- a/emulator/Settings.cpp +++ b/emulator/Settings.cpp @@ -323,7 +323,7 @@ void Settings_SetCartridgeFilePath(int slot, LPCTSTR sFilePath) Settings_SaveStringValue(bufValueName, sFilePath); } -SETTINGS_GETSET_DWORD(ScreenViewMode, _T("ScreenViewMode"), int, 0); +SETTINGS_GETSET_DWORD(ScreenViewMode, _T("ScreenViewMode"), int, 1); SETTINGS_GETSET_DWORD(ScreenHeightMode, _T("ScreenHeightMode"), int, 0); diff --git a/emulator/main.cpp b/emulator/main.cpp index c68de55..8e81e8b 100644 --- a/emulator/main.cpp +++ b/emulator/main.cpp @@ -330,7 +330,16 @@ int main(int, char**) //TODO: Move to ScreenView IM_ASSERT(m_bits != nullptr); - Emulator_PrepareScreenRGB32(m_bits, ScreenView_StandardGRBColors); + int viewmode = Settings_GetScreenViewMode(); + const uint32_t* palette; + if (viewmode == RGBScreen) + palette = ScreenView_StandardRGBColors; + else if (viewmode == GrayScreen) + palette = ScreenView_StandardGrayColors; + else + palette = ScreenView_StandardGRBColors; + + Emulator_PrepareScreenRGB32(m_bits, palette); glBindTexture(GL_TEXTURE_2D, screen_texture); glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, UKNC_SCREEN_WIDTH, UKNC_SCREEN_HEIGHT, GL_RGBA, GL_UNSIGNED_BYTE, m_bits);