From 0115e66f09193ef106ef9ff0d941569c7d606cfc Mon Sep 17 00:00:00 2001 From: penfold42 Date: Sat, 11 Aug 2018 17:14:17 +1000 Subject: [PATCH] use bitmap view of the BAM (rather than characters) scale bitmap view to PNG size guess 40 track format for BAM display rename ClearArea to DrawRectangle --- src/FileBrowser.cpp | 100 +++++++++++++++++++++++++++++--------------- src/Screen.cpp | 6 +-- src/Screen.h | 2 +- src/ScreenBase.h | 2 +- src/ScreenLCD.cpp | 2 +- src/ScreenLCD.h | 2 +- 6 files changed, 74 insertions(+), 40 deletions(-) diff --git a/src/FileBrowser.cpp b/src/FileBrowser.cpp index 61fa47e..13eec75 100644 --- a/src/FileBrowser.cpp +++ b/src/FileBrowser.cpp @@ -713,7 +713,7 @@ void FileBrowser::RefeshDisplay() char buffer[1024]; if (f_getcwd(buffer, 1024) == FR_OK) { - screenMain->ClearArea(0, 0, (int)screenMain->Width(), 17, bgColour); + screenMain->DrawRectangle(0, 0, (int)screenMain->Width(), 17, bgColour); screenMain->PrintText(false, 0, 0, buffer, textColour, bgColour); } @@ -801,8 +801,8 @@ void FileBrowser::DisplayPNG() if (displayPNGIcons && folder.current) { FileBrowser::BrowsableList::Entry* current = folder.current; - u32 x = screenMain->ScaleX(1024 - 320); - u32 y = screenMain->ScaleY(666) - 240; + u32 x = screenMain->ScaleX(1024) - PNG_WIDTH; + u32 y = screenMain->ScaleY(666) - PNG_HEIGHT; DisplayPNG(current->filIcon, x, y); } } @@ -1304,8 +1304,13 @@ void FileBrowser::DisplayDiskInfo(DiskImage* diskImage, const char* filenameForI u32 usedColour = palette[VIC2_COLOUR_INDEX_RED]; u32 freeColour = palette[VIC2_COLOUR_INDEX_LGREEN]; + u32 thisColour = 0; u32 BAMOffsetX = screenMain->ScaleX(400); + u32 bmBAMOffsetX = screenMain->ScaleX(1024) - PNG_WIDTH; + u32 x_px = 0; + u32 y_px = 0; + ClearScreen(); if (diskImage->GetDecodedSector(track, sectorNo, buffer)) @@ -1319,49 +1324,78 @@ void FileBrowser::DisplayDiskInfo(DiskImage* diskImage, const char* filenameForI //165,166 ($A5,$A6) $32,$41 ASCII chars "2A" DOS indicator //167-170 ($A7-$AA) $A0 Shift Space //171-255 ($AB-$FF) $00 Not used, filled with zero (The bytes 180 to 191 can have the contents "blocks free" on many disks.) + //AB-FF: Normally unused ($00), except for 40 track extended format, + // see the following two entries: + //AC-BF: DOLPHIN DOS track 36-40 BAM entries (only for 40 track) + //C0-D3: SPEED DOS track 36-40 BAM entries (only for 40 track) strncpy(name, (char*)&buffer[144], 16); int blocksFree = 0; int bamTrack; - int lastTrackUsed = (int)diskImage->LastTrackUsed() >> 1; - for (bamTrack = 0; bamTrack < 35; ++bamTrack) - { - if ((bamTrack + 1) != 18) - blocksFree += buffer[BAM_OFFSET + bamTrack * BAM_ENTRY_SIZE]; + int lastTrackUsed = (int)diskImage->LastTrackUsed() >> 1; // 0..34 (or 39) + int bamOffset = BAM_OFFSET; + int guess40 = 0; - x = BAMOffsetX; + x_px = bmBAMOffsetX; + int x_size = PNG_WIDTH/lastTrackUsed; + int y_size = PNG_HEIGHT/21; + +// try to guess the 40 track format + if (lastTrackUsed == 39) + { + int dolphin_sum = 0; + int speeddos_sum = 0; + for (int i=0; i<20; i++) + { + dolphin_sum += buffer[0xac+i]; + speeddos_sum += buffer[0xc0+i]; + } + if ( dolphin_sum == 0 && speeddos_sum != 0) + guess40 = 0xc0; + if ( dolphin_sum != 0 && speeddos_sum == 0) + guess40 = 0xac; + +// debugging +//snprintf(bufferOut, 128, "LTU %d dd %d sd %d g40 %d", lastTrackUsed, dolphin_sum, speeddos_sum, guess40); +//screenMain->PrintText(false, x_px, PNG_HEIGHT+30, bufferOut, textColour, bgColour); + } + + + for (bamTrack = 0; bamTrack <= lastTrackUsed; ++bamTrack) + { + if (bamTrack >= 35) + bamOffset = guess40; + else + bamOffset = BAM_OFFSET; + + if (bamOffset && (bamTrack + 1) != 18) + blocksFree += buffer[bamOffset + bamTrack * BAM_ENTRY_SIZE]; + + y_px = 0; for (int bit = 0; bit < DiskImage::SectorsPerTrack[bamTrack]; bit++) { - u32 bits = buffer[BAM_OFFSET + 1 + (bit >> 3) + bamTrack * BAM_ENTRY_SIZE]; - bool used = (bits & (1 << (bit & 0x7))) == 0; + u32 bits = buffer[bamOffset + 1 + (bit >> 3) + bamTrack * BAM_ENTRY_SIZE]; - if (!used) - { - snprintf(bufferOut, 128, "%c", screen2petscii(87)); - screenMain->PrintText(true, x, y, bufferOut, usedColour, bgColour); - } + if (!guess40 && bamTrack>= 35) + thisColour = 0; + else if (bits & (1 << (bit & 0x7))) + thisColour = freeColour; else - { - snprintf(bufferOut, 128, "%c", screen2petscii(81)); - screenMain->PrintText(true, x, y, bufferOut, freeColour, bgColour); - } - x += 8; + thisColour = usedColour; + +// highight track 18 + if ((bamTrack + 1) == 18) + screenMain->DrawRectangle(x_px, y_px, x_px+x_size, y_px+y_size, textColour); + + screenMain->DrawRectangle(x_px+1, y_px+1, x_px+x_size-1, y_px+y_size-1, thisColour); + + y_px += y_size; bits <<= 1; } - y += fontHeight; - } - for (; bamTrack < lastTrackUsed; ++bamTrack) - { - x = BAMOffsetX; - for (int bit = 0; bit < DiskImage::SectorsPerTrack[bamTrack]; bit++) - { - snprintf(bufferOut, 128, "%c", screen2petscii(87)); - screenMain->PrintText(true, x, y, bufferOut, usedColour, bgColour); - x += 8; - } - y += fontHeight; + x_px += x_size; } + x = 0; y = 0; snprintf(bufferOut, 128, "0"); diff --git a/src/Screen.cpp b/src/Screen.cpp index c4aa6be..638eae6 100644 --- a/src/Screen.cpp +++ b/src/Screen.cpp @@ -146,7 +146,7 @@ void Screen::PlotPixel8(u32 pixel_offset, RGBA Colour) framebuffer[pixel_offset++] = RED(Colour); } -void Screen::ClearArea(u32 x1, u32 y1, u32 x2, u32 y2, RGBA colour) +void Screen::DrawRectangle(u32 x1, u32 y1, u32 x2, u32 y2, RGBA colour) { ClipRect(x1, y1, x2, y2); @@ -182,7 +182,7 @@ void Screen::ScrollArea(u32 x1, u32 y1, u32 x2, u32 y2) void Screen::Clear(RGBA colour) { - ClearArea(0, 0, width, height, colour); + DrawRectangle(0, 0, width, height, colour); } u32 Screen::GetFontHeight() @@ -299,7 +299,7 @@ u32 Screen::PrintText(bool petscii, u32 x, u32 y, char *ptr, RGBA TxtColour, RGB { if (!measureOnly) { - ClearArea(xCursor, yCursor, xCursor + BitFontWth, yCursor + fontHeight, BkColour); + DrawRectangle(xCursor, yCursor, xCursor + BitFontWth, yCursor + fontHeight, BkColour); WriteChar(petscii, xCursor, yCursor, c, TxtColour); } xCursor += BitFontWth; diff --git a/src/Screen.h b/src/Screen.h index 78be877..794c3fa 100644 --- a/src/Screen.h +++ b/src/Screen.h @@ -32,7 +32,7 @@ public: void Open(u32 width, u32 height, u32 colourDepth); - void ClearArea(u32 x1, u32 y1, u32 x2, u32 y2, RGBA colour); + void DrawRectangle(u32 x1, u32 y1, u32 x2, u32 y2, RGBA colour); void Clear(RGBA colour); void ScrollArea(u32 x1, u32 y1, u32 x2, u32 y2); diff --git a/src/ScreenBase.h b/src/ScreenBase.h index 99840b0..b98440f 100644 --- a/src/ScreenBase.h +++ b/src/ScreenBase.h @@ -46,7 +46,7 @@ public: { } - virtual void ClearArea(u32 x1, u32 y1, u32 x2, u32 y2, RGBA colour) = 0; + virtual void DrawRectangle(u32 x1, u32 y1, u32 x2, u32 y2, RGBA colour) = 0; virtual void Clear(RGBA colour) = 0; virtual void ScrollArea(u32 x1, u32 y1, u32 x2, u32 y2) = 0; diff --git a/src/ScreenLCD.cpp b/src/ScreenLCD.cpp index 36b4a2f..ac599a8 100644 --- a/src/ScreenLCD.cpp +++ b/src/ScreenLCD.cpp @@ -47,7 +47,7 @@ void ScreenLCD::Open(u32 widthDesired, u32 heightDesired, u32 colourDepth, int B opened = true; } -void ScreenLCD::ClearArea(u32 x1, u32 y1, u32 x2, u32 y2, RGBA colour) +void ScreenLCD::DrawRectangle(u32 x1, u32 y1, u32 x2, u32 y2, RGBA colour) { ClipRect(x1, y1, x2, y2); } diff --git a/src/ScreenLCD.h b/src/ScreenLCD.h index b81d114..fd77137 100644 --- a/src/ScreenLCD.h +++ b/src/ScreenLCD.h @@ -35,7 +35,7 @@ public: void Open(u32 width, u32 height, u32 colourDepth, int BSCMaster, int LCDAddress, int LCDFlip, LCD_MODEL LCDType); - void ClearArea(u32 x1, u32 y1, u32 x2, u32 y2, RGBA colour); + void DrawRectangle(u32 x1, u32 y1, u32 x2, u32 y2, RGBA colour); void Clear(RGBA colour); void ClearInit(RGBA colour);