Merge pull request #70 from penfold42/BAMbitmap

use bitmap view of the BAM (rather than characters)
This commit is contained in:
Stephen White 2018-08-12 11:24:59 +10:00 committed by GitHub
commit e7b477dbe3
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 74 additions and 40 deletions

View file

@ -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");

View file

@ -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;

View file

@ -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);

View file

@ -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;

View file

@ -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);
}

View file

@ -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);