From 58be6a8079faa29a8e7b9b7e36397364d4fe04c5 Mon Sep 17 00:00:00 2001 From: Alexander Martinelle Date: Sat, 21 Sep 2019 17:24:09 +0200 Subject: [PATCH] OLED support added OLED support added back in with extra update call to refresh the display on single core devices. New macro added to allow 1581 tests in the Pi Zero experimental build. --- src/DiskCaddy.cpp | 18 ++++++++--------- src/DiskCaddy.h | 18 +++++++++++------ src/FileBrowser.cpp | 49 +++++++++++---------------------------------- src/FileBrowser.h | 10 +-------- src/InputMappings.h | 6 +++--- src/Pi1581.cpp | 4 ++-- src/defs.h | 4 +++- src/main.cpp | 30 ++++++++++++++------------- 8 files changed, 58 insertions(+), 81 deletions(-) diff --git a/src/DiskCaddy.cpp b/src/DiskCaddy.cpp index 1954106..2cc9781 100644 --- a/src/DiskCaddy.cpp +++ b/src/DiskCaddy.cpp @@ -53,7 +53,7 @@ bool DiskCaddy::Empty() snprintf(buffer, 256, "Saving %s\r\n", disks[index].GetName()); screen->PrintText(false, x, y, buffer, RGBA(0xff, 0xff, 0xff, 0xff), red); } - +#endif if (screenLCD) { RGBA BkColour = RGBA(0, 0, 0, 0xFF); @@ -68,7 +68,6 @@ bool DiskCaddy::Empty() screenLCD->PrintText(false, x, y, buffer, RGBA(0xff, 0xff, 0xff, 0xff), red); screenLCD->SwapBuffers(); } -#endif } disks[index].Close(); } @@ -84,7 +83,7 @@ bool DiskCaddy::Empty() snprintf(buffer, 256, "Saving Complete \r\n"); screen->PrintText(false, x, y, buffer, RGBA(0xff, 0xff, 0xff, 0xff), red); } - +#endif if (screenLCD) { RGBA BkColour = RGBA(0, 0, 0, 0xFF); @@ -99,7 +98,6 @@ bool DiskCaddy::Empty() screenLCD->PrintText(false, x, y, buffer, RGBA(0xff, 0xff, 0xff, 0xff), red); screenLCD->SwapBuffers(); } -#endif } disks.clear(); @@ -125,6 +123,7 @@ bool DiskCaddy::Insert(const FILINFO* fileInfo, bool readOnly) snprintf(buffer, 256, "Loading %s\r\n", fileInfo->fname); screen->PrintText(false, x, y, buffer, RGBA(0xff, 0xff, 0xff, 0xff), red); } +#endif if (screenLCD) { @@ -140,7 +139,6 @@ bool DiskCaddy::Insert(const FILINFO* fileInfo, bool readOnly) screenLCD->PrintText(false, x, y, buffer, RGBA(0xff, 0xff, 0xff, 0xff), red); screenLCD->SwapBuffers(); } -#endif u32 bytesRead; SetACTLed(true); f_read(&fp, DiskImage::readBuffer, READBUFFER_SIZE, &bytesRead); @@ -303,6 +301,8 @@ void DiskCaddy::ShowSelectedImage(u32 index) snprintf(buffer, 256, "*"); screen->PrintText(false, x, y, buffer, white, red); } +#endif + if (screenLCD) { unsigned numberOfImages = GetNumberOfImages(); @@ -351,7 +351,6 @@ void DiskCaddy::ShowSelectedImage(u32 index) } screenLCD->SwapBuffers(); } -#endif } bool DiskCaddy::Update() @@ -368,15 +367,16 @@ bool DiskCaddy::Update() y = screen->ScaleY(screenPosYCaddySelections) + 16 + 16 * oldCaddyIndex; snprintf(buffer, 256, " "); screen->PrintText(false, x, y, buffer, red, red); - oldCaddyIndex = caddyIndex; - ShowSelectedImage(oldCaddyIndex); } +#endif + + oldCaddyIndex = caddyIndex; + ShowSelectedImage(oldCaddyIndex); if (screenLCD) { } -#endif return true; } return false; diff --git a/src/DiskCaddy.h b/src/DiskCaddy.h index fb86de4..b59247b 100644 --- a/src/DiskCaddy.h +++ b/src/DiskCaddy.h @@ -30,15 +30,17 @@ public: : selectedIndex(0) #if not defined(EXPERIMENTALZERO) , screen(0) - , screenLCD(0) #endif + , screenLCD(0) { } -#if defined(EXPERIMENTALZERO) - void SetScreen() { } -#else - void SetScreen(Screen* screen, ScreenBase* screenLCD) { this->screen = screen; this->screenLCD = screenLCD; } + void SetScreen(Screen* screen, ScreenBase* screenLCD) + { +#if not defined(EXPERIMENTALZERO) + this->screen = screen; #endif + this->screenLCD = screenLCD; + } bool Empty(); @@ -46,6 +48,9 @@ public: DiskImage* GetCurrentDisk() { +#if defined(EXPERIMENTALZERO) + Update(); +#endif if (selectedIndex < disks.size()) return &disks[selectedIndex]; @@ -55,6 +60,7 @@ public: DiskImage* NextDisk() { selectedIndex = (selectedIndex + 1) % (u32)disks.size(); + auto ret = GetCurrentDisk(); return GetCurrentDisk(); } @@ -108,8 +114,8 @@ private: u32 oldCaddyIndex; #if not defined(EXPERIMENTALZERO) ScreenBase* screen; - ScreenBase* screenLCD; #endif + ScreenBase* screenLCD; }; #endif \ No newline at end of file diff --git a/src/FileBrowser.cpp b/src/FileBrowser.cpp index 9eb6969..b14c186 100644 --- a/src/FileBrowser.cpp +++ b/src/FileBrowser.cpp @@ -82,7 +82,6 @@ void FileBrowser::BrowsableListView::RefreshLine(u32 entryIndex, u32 x, u32 y, b if (entryIndex < list->entries.size()) { FileBrowser::BrowsableList::Entry* entry = &list->entries[entryIndex]; -#if not defined(EXPERIMENTALZERO) if (screen->IsLCD()) { // pre-clear line on OLED @@ -112,10 +111,8 @@ void FileBrowser::BrowsableListView::RefreshLine(u32 entryIndex, u32 x, u32 y, b { snprintf(buffer2, 256, "%s", entry->filImage.fname); } -#endif int len = strlen(buffer2 + highlightScrollOffset); strncpy(buffer1, buffer2 + highlightScrollOffset, sizeof(buffer1)); -#if not defined(EXPERIMENTALZERO) if (!screen->IsLCD()) { // space pad the remainder of the line (but not on OLED) @@ -123,56 +120,44 @@ void FileBrowser::BrowsableListView::RefreshLine(u32 entryIndex, u32 x, u32 y, b buffer1[len++] = ' '; buffer1[columnsMax] = 0; } -#endif if (selected) { if (entry->filImage.fattrib & AM_DIR) { -#if not defined(EXPERIMENTALZERO) screen->PrintText(false, x, y, buffer1, palette[VIC2_COLOUR_INDEX_LBLUE], RGBA(0xff, 0xff, 0xff, 0xff)); -#endif } else { colour = RGBA(0xff, 0, 0, 0xff); if (entry->filImage.fattrib & AM_RDO) colour = palette[VIC2_COLOUR_INDEX_RED]; -#if not defined(EXPERIMENTALZERO) screen->PrintText(false, x, y, buffer1, colour, RGBA(0xff, 0xff, 0xff, 0xff)); -#endif } } else { if (entry->filImage.fattrib & AM_DIR) { -#if not defined(EXPERIMENTALZERO) screen->PrintText(false, x, y, buffer1, palette[VIC2_COLOUR_INDEX_LBLUE], BkColour); -#endif } else { colour = palette[VIC2_COLOUR_INDEX_LGREY]; if (entry->filImage.fattrib & AM_RDO) colour = palette[VIC2_COLOUR_INDEX_PINK]; -#if not defined(EXPERIMENTALZERO) screen->PrintText(false, x, y, buffer1, colour, BkColour); -#endif } } } else // line is blank, write spaces { memset(buffer1, ' ', columnsMax); -#if not defined(EXPERIMENTALZERO) screen->PrintText(false, x, y, buffer1, BkColour, BkColour); -#endif } } void FileBrowser::BrowsableListView::Refresh() { -#if not defined(EXPERIMENTALZERO) u32 index; u32 entryIndex; u32 x = positionX; @@ -197,7 +182,6 @@ void FileBrowser::BrowsableListView::Refresh() } screen->SwapBuffers(); -#endif } void FileBrowser::BrowsableListView::RefreshHighlightScroll() @@ -205,7 +189,6 @@ void FileBrowser::BrowsableListView::RefreshHighlightScroll() char buffer2[256] = { 0 }; FileBrowser::BrowsableList::Entry* entry = list->current; -#if not defined(EXPERIMENTALZERO) if (screen->IsMonocrome()) { if (entry->filImage.fattrib & AM_DIR) @@ -268,7 +251,6 @@ void FileBrowser::BrowsableListView::RefreshHighlightScroll() screen->RefreshRows(rowIndex, 1); } -#endif } bool FileBrowser::BrowsableListView::CheckBrowseNavigation(bool pageOnly) @@ -516,11 +498,14 @@ FileBrowser::FileBrowser(InputMappings* inputMappings, DiskCaddy* diskCaddy, ROM , displayPNGIcons(displayPNGIcons) #if not defined(EXPERIMENTALZERO) , screenMain(screenMain) - , screenLCD(screenLCD) #endif + , screenLCD(screenLCD) , scrollHighlightRate(scrollHighlightRate) , displayingDevices(false) { + + folder.scrollHighlightRate = scrollHighlightRate; + #if not defined(EXPERIMENTALZERO) u32 columns = screenMain->ScaleX(80); u32 rows = (int)(38.0f * screenMain->GetScaleY()); @@ -530,7 +515,6 @@ FileBrowser::FileBrowser(InputMappings* inputMappings, DiskCaddy* diskCaddy, ROM if (rows < 1) rows = 1; - folder.scrollHighlightRate = scrollHighlightRate; folder.AddView(screenMain, inputMappings, columns, rows, positionX, positionY, false); positionX = screenMain->ScaleX(1024 - 320); @@ -538,17 +522,17 @@ FileBrowser::FileBrowser(InputMappings* inputMappings, DiskCaddy* diskCaddy, ROM caddySelections.AddView(screenMain, inputMappings, columns, rows, positionX, positionY, false); +#endif if (screenLCD) { - columns = screenLCD->Width() / 8; - rows = screenLCD->Height() / screenLCD->GetFontHeight(); - positionX = 0; - positionY = 0; + u32 columns = screenLCD->Width() / 8; + u32 rows = screenLCD->Height() / screenLCD->GetFontHeight(); + u32 positionX = 0; + u32 positionY = 0; folder.AddView(screenLCD, inputMappings, columns, rows, positionX, positionY, true); } -#endif } u32 FileBrowser::Colour(int index) @@ -709,7 +693,6 @@ void FileBrowser::DeviceSwitched() m_IEC_Commands.SetDisplayingDevices(displayingDevices); FolderChanged(); } -#if not defined(EXPERIMENTALZERO) /* void FileBrowser::RefeshDisplayForBrowsableList(FileBrowser::BrowsableList* browsableList, int xOffset, bool showSelected) { @@ -788,7 +771,6 @@ void FileBrowser::RefeshDisplayForBrowsableList(FileBrowser::BrowsableList* brow } } */ -#endif void FileBrowser::RefeshDisplay() { #if not defined(EXPERIMENTALZERO) @@ -800,11 +782,9 @@ void FileBrowser::RefeshDisplay() screenMain->DrawRectangle(0, 0, (int)screenMain->Width(), 17, bgColour); screenMain->PrintText(false, 0, 0, buffer, textColour, bgColour); } -#if not defined(EXPERIMENTALZERO) //u32 offsetX = screenMain->ScaleX(1024 - 320); //RefeshDisplayForBrowsableList(&folder, 0); //RefeshDisplayForBrowsableList(&caddySelections, offsetX, false); -#endif folder.RefreshViews(); caddySelections.RefreshViews(); @@ -816,14 +796,14 @@ void FileBrowser::RefeshDisplay() u32 y = screenMain->ScaleY(STATUS_BAR_POSITION_Y); screenMain->PrintText(false, 0, y, folder.searchPrefix, textColour, bgColour); } +#else + folder.RefreshViews(); + caddySelections.RefreshViews(); #endif } bool FileBrowser::CheckForPNG(const char* filename, FILINFO& filIcon) { -#if defined(EXPERIMENTALZERO) - return false; -#else bool foundValid = false; filIcon.fname[0] = 0; @@ -845,7 +825,6 @@ bool FileBrowser::CheckForPNG(const char* filename, FILINFO& filIcon) } } return foundValid; -#endif } void FileBrowser::DisplayPNG(FILINFO& filIcon, int x, int y) @@ -1457,11 +1436,7 @@ void FileBrowser::DisplayDiskInfo(DiskImage* diskImage, const char* filenameForI char name[17] = { 0 }; unsigned char buffer[260] = { 0 }; int charIndex; -#if defined(EXPERIMENTALZERO) - u32 fontHeight = 16; -#else u32 fontHeight = screenMain->GetFontHeightDirectoryDisplay(); -#endif u32 x = 0; u32 y = 0; char bufferOut[128] = { 0 }; diff --git a/src/FileBrowser.h b/src/FileBrowser.h index bfc9c7f..9a9ec4b 100644 --- a/src/FileBrowser.h +++ b/src/FileBrowser.h @@ -63,9 +63,7 @@ public: BrowsableListView(BrowsableList* list, InputMappings* inputMappings, ScreenBase* screen, u32 columns, u32 rows, u32 positionX, u32 positionY, bool lcdPgUpDown) : list(list) , inputMappings(inputMappings) -#if not defined(EXPERIMENTALZERO) , screen(screen) -#endif , columns(columns) , rows(rows) , positionX(positionX) @@ -86,9 +84,7 @@ public: BrowsableList* list; u32 offset; InputMappings* inputMappings; -#if not defined(EXPERIMENTALZERO) ScreenBase* screen; -#endif u32 columns; u32 rows; u32 positionX; @@ -215,14 +211,10 @@ private: void RefreshFolderEntries(); void UpdateInputFolders(); -#if not defined(EXPERIMENTALZERO) //void UpdateInputDiskCaddy(); -#endif void UpdateCurrentHighlight(); -#if not defined(EXPERIMENTALZERO) //void RefeshDisplayForBrowsableList(FileBrowser::BrowsableList* browsableList, int xOffset, bool showSelected = true); -#endif bool FillCaddyWithSelections(); bool AddToCaddy(FileBrowser::BrowsableList::Entry* current); @@ -256,8 +248,8 @@ private: BrowsableList caddySelections; #if not defined(EXPERIMENTALZERO) ScreenBase* screenMain; - ScreenBase* screenLCD; #endif + ScreenBase* screenLCD; float scrollHighlightRate; bool displayingDevices; diff --git a/src/InputMappings.h b/src/InputMappings.h index 69977fa..7cdf5c6 100644 --- a/src/InputMappings.h +++ b/src/InputMappings.h @@ -106,17 +106,17 @@ public: #if defined(EXPERIMENTALZERO) inline bool Exit() { - return /*KeyboardFlag(ESC_FLAG) | UartFlag(ESC_FLAG) |*/ ButtonFlag(ESC_FLAG); + return ButtonFlag(ESC_FLAG); } inline bool NextDisk() { - return /*KeyboardFlag(NEXT_FLAG) | UartFlag(NEXT_FLAG) |*/ ButtonFlag(NEXT_FLAG); + return ButtonFlag(NEXT_FLAG); } inline bool PrevDisk() { - return /*KeyboardFlag(PREV_FLAG) | UartFlag(PREV_FLAG) |*/ ButtonFlag(PREV_FLAG); + return ButtonFlag(PREV_FLAG); } #else inline bool Exit() diff --git a/src/Pi1581.cpp b/src/Pi1581.cpp index ff2b068..930ab5a 100644 --- a/src/Pi1581.cpp +++ b/src/Pi1581.cpp @@ -93,7 +93,7 @@ extern u16 pc; u8 read6502_1581(u16 address) { u8 value = 0; -#if not defined(EXPERIMENTALZERO) +#if defined(PI1581SUPPORT) if (address & 0x8000) { value = roms.Read1581(address); @@ -129,7 +129,7 @@ u8 peek6502_1581(u16 address) void write6502_1581(u16 address, const u8 value) { -#if not defined(EXPERIMENTALZERO) +#if defined(PI1581SUPPORT) if (address & 0x8000) { return; diff --git a/src/defs.h b/src/defs.h index 7462bdb..1e6f84d 100644 --- a/src/defs.h +++ b/src/defs.h @@ -2,7 +2,9 @@ #define DEFS_H #include "debug.h" - +#ifndef EXPERIMENTALZERO +#define PI1581SUPPORT 1 +#endif // Indicates a Pi with the 40 pin GPIO connector // so that additional functionality (e.g. test pins) can be enabled #if defined(RPIZERO) || defined(RPIBPLUS) || defined(RPI2) || defined(RPI3) diff --git a/src/main.cpp b/src/main.cpp index 91bc238..33aee90 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -101,7 +101,7 @@ u8 s_u8Memory[0xc000]; int numberOfUSBMassStorageDevices = 0; DiskCaddy diskCaddy; Pi1541 pi1541; -#if not defined(EXPERIMENTALZERO) +#if defined(PI1581SUPPORT) Pi1581 pi1581; #endif CEMMCDevice m_EMMC; @@ -250,7 +250,6 @@ void InitialiseHardware() void InitialiseLCD() { -#if not defined(EXPERIMENTALZERO) FILINFO filLcdIcon; int i2cBusMaster = options.I2CBusMaster(); @@ -312,7 +311,6 @@ void InitialiseLCD() screenLCD->RefreshScreen(); } else -#endif { screenLCD = 0; } @@ -612,7 +610,7 @@ EmulatingMode BeginEmulating(FileBrowser* fileBrowser, const char* filenameForIc DiskImage* diskImage = diskCaddy.SelectFirstImage(); if (diskImage) { -#if not defined(EXPERIMENTALZERO) +#if defined(PI1581SUPPORT) if (diskImage->IsD81()) { pi1581.Insert(diskImage); @@ -673,7 +671,7 @@ void GlobalSetDeviceID(u8 id) deviceID = id; m_IEC_Commands.SetDeviceId(id); pi1541.SetDeviceID(id); -#if not defined(EXPERIMENTALZERO) +#if defined(PI1581SUPPORT) pi1581.SetDeviceID(id); #endif } @@ -719,6 +717,8 @@ EXIT_TYPE Emulate1541(FileBrowser* fileBrowser) if (numberOfImagesMax > 10) numberOfImagesMax = 10; + diskCaddy.Display(); + inputMappings->directDiskSwapRequest = 0; // Force an update on all the buttons now before we start emulation mode. IEC_Bus::ReadBrowseMode(); @@ -1053,8 +1053,9 @@ EXIT_TYPE Emulate1541(FileBrowser* fileBrowser) } return exitReason; } +#endif - +#if defined(PI1581SUPPORT) EXIT_TYPE Emulate1581(FileBrowser* fileBrowser) { EXIT_TYPE exitReason = EXIT_UNKNOWN; @@ -1251,11 +1252,7 @@ void emulator() roms.lastManualSelectedROMIndex = 0; -#if defined(EXPERIMENTALZERO) - diskCaddy.SetScreen(); -#else diskCaddy.SetScreen(&screen, screenLCD); -#endif fileBrowser = new FileBrowser(inputMappings, &diskCaddy, &roms, &deviceID, options.DisplayPNGIcons(), &screen, screenLCD, options.ScrollHighlightRate()); fileBrowser->DisplayRoot(); pi1541.Initialise(); @@ -1405,7 +1402,7 @@ void emulator() { if (emulating == EMULATING_1541) exitReason = Emulate1541(fileBrowser); -#if not defined(EXPERIMENTALZERO) +#if defined(PI1581SUPPORT) else exitReason = Emulate1581(fileBrowser); #endif @@ -1865,8 +1862,14 @@ void DisplayMessage(int x, int y, bool LCD, const char* message, u32 textColour, screenLCD->SwapBuffers(); core0RefreshingScreen.Release(); - } +#else + RGBA BkColour = RGBA(0, 0, 0, 0xFF); + + screenLCD->Clear(BkColour); + screenLCD->PrintText(false, x, y, (char*)message, textColour, backgroundColour); + screenLCD->SwapBuffers(); + #endif } @@ -1984,10 +1987,9 @@ extern "C" pi1541.drive.SetVIA(&pi1541.VIA[1]); pi1541.VIA[0].GetPortB()->SetPortOut(0, IEC_Bus::PortB_OnPortOut); IEC_Bus::Initialise(); -#if not defined(EXPERIMENTALZERO) if (screenLCD) screenLCD->ClearInit(0); -#endif + #ifdef HAS_MULTICORE start_core(3, _spin_core); start_core(2, _spin_core);