Compare commits

...

12 Commits

Author SHA1 Message Date
Jorj Bauer 1c09349746 fix overlay for ra8875 2022-02-02 10:24:34 -05:00
Jorj Bauer 0a47ec63f5 fix screen fill on the 8875 2022-02-02 10:12:38 -05:00
Jorj Bauer 764a18d598 fix for text drawing being clipped... sort of 2022-02-02 10:06:19 -05:00
Jorj Bauer 413c81bed3 pass through screen fills 2022-02-02 10:05:48 -05:00
Jorj Bauer 1b43f1182e fix drive indicators on startup; fix overlay for 9341 2022-02-02 10:02:32 -05:00
Jorj Bauer 16d84320ba fix text drawing 2022-02-02 10:02:19 -05:00
Jorj Bauer 31e380526c fix drive latches on 9341 2022-02-02 09:32:30 -05:00
Jorj Bauer ec691374ea working on drive activity 2022-02-02 08:57:06 -05:00
Jorj Bauer 8cd2bc24ab abstracting and cleaning up 2022-02-02 08:14:58 -05:00
Jorj Bauer 3e2ddb725f fix off-by-one when drawing 80 column text 2022-02-02 08:03:38 -05:00
Jorj Bauer 274c93fd13 default to ILI display 2022-02-02 07:17:38 -05:00
Jorj Bauer 900e242adc dma working again w/ dynamic objects 2022-02-02 07:17:05 -05:00
18 changed files with 318 additions and 231 deletions

View File

@ -85,10 +85,9 @@ You'll also need the ILI9341_t3n library from
https://github.com/KurtE/ILI9341_t3n/ https://github.com/KurtE/ILI9341_t3n/
I'm using it at tag f1bfb81825c60e39e011e502fe5c39a04305e1dc - not As of this writing, the master branch does not work for Aiie; but the
because that tag is special, but because that's when I checked out the branch "dma_new_fix" is fine. I'd recommend checking out that branch
repo. I haven't tested newer code and if you have problems, you'll if it exists.
want to roll back to that tag.
# Running (on the Teensy) # Running (on the Teensy)

View File

@ -406,7 +406,7 @@ void AppleDisplay::redraw80ColumnText(uint8_t startingY)
cptr = xlateChar(mmu->readDirect(addr, 1), &invert); cptr = xlateChar(mmu->readDirect(addr, 1), &invert);
for (uint8_t y2 = 0; y2<8; y2++) { for (uint8_t y2 = 0; y2<8; y2++) {
uint8_t d = *(cptr + y2); uint8_t d = *(cptr + y2);
for (uint8_t x2 = 0; x2 <= 7; x2++) { for (uint8_t x2 = 0; x2 < 7; x2++) {
uint16_t basex = (col*2)*7; uint16_t basex = (col*2)*7;
bool pixelOn = (d & (1<<x2)); bool pixelOn = (d & (1<<x2));
if (pixelOn) { if (pixelOn) {
@ -423,7 +423,7 @@ void AppleDisplay::redraw80ColumnText(uint8_t startingY)
cptr = xlateChar(mmu->readDirect(addr, 0), &invert); cptr = xlateChar(mmu->readDirect(addr, 0), &invert);
for (uint8_t y2 = 0; y2<8; y2++) { for (uint8_t y2 = 0; y2<8; y2++) {
uint8_t d = *(cptr + y2); uint8_t d = *(cptr + y2);
for (uint8_t x2 = 0; x2 <= 7; x2++) { for (uint8_t x2 = 0; x2 < 7; x2++) {
uint16_t basex = (col*2+1)*7; uint16_t basex = (col*2+1)*7;
bool pixelOn = (d & (1<<x2)); bool pixelOn = (d & (1<<x2));
if (pixelOn) { if (pixelOn) {
@ -460,7 +460,6 @@ void AppleDisplay::redraw40ColumnText(uint8_t startingY)
// Only draw onscreen locations // Only draw onscreen locations
if (row >= startingY && col <= 39 && row <= 23) { if (row >= startingY && col <= 39 && row <= 23) {
const uint8_t *cptr = xlateChar(mmu->readDirect(addr, 0), &invert); const uint8_t *cptr = xlateChar(mmu->readDirect(addr, 0), &invert);
for (uint8_t y2 = 0; y2<8; y2++) { for (uint8_t y2 = 0; y2<8; y2++) {
uint8_t d = *(cptr + y2); uint8_t d = *(cptr + y2);
for (uint8_t x2 = 0; x2 < 7; x2++) { for (uint8_t x2 = 0; x2 < 7; x2++) {

View File

@ -6,9 +6,9 @@
AppleUI::AppleUI() AppleUI::AppleUI()
{ {
redrawFrame = false; redrawFrame = true;
redrawDriveLatches = false; redrawDriveLatches = true;
redrawDriveActivity = false; redrawDriveActivity = true;
driveInserted[0] = driveInserted[1] = 0; driveInserted[0] = driveInserted[1] = 0;
driveActivity[0] = driveActivity[1] = 0; driveActivity[0] = driveActivity[1] = 0;
} }
@ -117,21 +117,12 @@ void AppleUI::blit()
redrawDriveLatches = false; redrawDriveLatches = false;
g_display->drawUIImage(driveInserted[0] ? IMG_D1CLOSED : IMG_D1OPEN); g_display->drawUIImage(driveInserted[0] ? IMG_D1CLOSED : IMG_D1OPEN);
g_display->drawUIImage(driveInserted[1] ? IMG_D2CLOSED : IMG_D2OPEN); g_display->drawUIImage(driveInserted[1] ? IMG_D2CLOSED : IMG_D2OPEN);
redrawDriveActivity = true; // these overlap
} }
if (redrawDriveActivity) { if (redrawDriveActivity) {
redrawDriveActivity = false; redrawDriveActivity = false;
g_display->drawDriveActivity(driveActivity[0], driveActivity[1]);
/*
// FIXME make these bitmaps so the size/location are abstracted
for (int y=0; y<LED_HEIGHT; y++) {
for (int x=0; x<LED_WIDTH; x++) {
g_display->drawPixel(x + LED_X, y + LED1_Y, driveActivity[0] ? 0xFA00 : 0x0000);
g_display->drawPixel(x + LED_X, y + LED2_Y, driveActivity[1] ? 0xFA00 : 0x0000);
}
}
*/
} }
} }

View File

@ -1,4 +1,4 @@
const static uint8_t image_d1_open[] PROGMEM = { const static uint8_t image_d1_closed[] PROGMEM = {
0xCE,0x37, 0x20,0xC1, 0x20,0xC1, 0x20,0xC1, 0x20,0xC1, 0x20,0xC1, 0x20,0xC1, 0x20,0xC1, 0xCE,0x37, 0x20,0xC1, 0x20,0xC1, 0x20,0xC1, 0x20,0xC1, 0x20,0xC1, 0x20,0xC1, 0x20,0xC1,
0x20,0xC1, 0x20,0xC1, 0x20,0xC1, 0x20,0xC1, 0x20,0xC1, 0x20,0xC1, 0x20,0xC1, 0x20,0xC1, 0x20,0xC1, 0x20,0xC1, 0x20,0xC1, 0x20,0xC1, 0x20,0xC1, 0x20,0xC1, 0x20,0xC1, 0x20,0xC1,
0x20,0xC1, 0x20,0xC1, 0x20,0xC1, 0x20,0xC1, 0x20,0xC1, 0x20,0xC1, 0x20,0xC1, 0x20,0xC1, 0x20,0xC1, 0x20,0xC1, 0x20,0xC1, 0x20,0xC1, 0x20,0xC1, 0x20,0xC1, 0x20,0xC1, 0x20,0xC1,
@ -87,7 +87,7 @@ const static uint8_t image_d1_open[] PROGMEM = {
0x58,0xA2, 0xCD,0xD5, 0x58,0xA2, 0xCD,0xD5,
}; };
const static uint8_t image_d1_closed[] PROGMEM = { const static uint8_t image_d1_open[] PROGMEM = {
0xCE,0x37, 0x31,0x23, 0x10,0x81, 0x18,0x81, 0x20,0xC1, 0x29,0x02, 0x28,0xE2, 0x28,0xC2, 0xCE,0x37, 0x31,0x23, 0x10,0x81, 0x18,0x81, 0x20,0xC1, 0x29,0x02, 0x28,0xE2, 0x28,0xC2,
0x31,0x01, 0x29,0x01, 0x20,0xC1, 0x28,0xE1, 0x31,0x42, 0x28,0xC1, 0x20,0xA0, 0x31,0x22, 0x31,0x01, 0x29,0x01, 0x20,0xC1, 0x28,0xE1, 0x31,0x42, 0x28,0xC1, 0x20,0xA0, 0x31,0x22,
0x31,0x01, 0x28,0xE1, 0x31,0x02, 0x30,0xE1, 0x20,0xA0, 0x20,0xA0, 0x20,0xA0, 0x28,0xC1, 0x31,0x01, 0x28,0xE1, 0x31,0x02, 0x30,0xE1, 0x20,0xA0, 0x20,0xA0, 0x20,0xA0, 0x28,0xC1,
@ -176,7 +176,7 @@ const static uint8_t image_d1_closed[] PROGMEM = {
0x58,0xA2, 0xCD,0xD5, 0x58,0xA2, 0xCD,0xD5,
}; };
const static uint8_t image_d2_open[] PROGMEM = { const static uint8_t image_d2_closed[] PROGMEM = {
0xCE,0x37, 0x20,0xC1, 0x20,0xC1, 0x20,0xC1, 0x20,0xC1, 0x20,0xC1, 0x20,0xC1, 0x20,0xC1, 0xCE,0x37, 0x20,0xC1, 0x20,0xC1, 0x20,0xC1, 0x20,0xC1, 0x20,0xC1, 0x20,0xC1, 0x20,0xC1,
0x20,0xC1, 0x20,0xC1, 0x20,0xC1, 0x20,0xC1, 0x20,0xC1, 0x20,0xC1, 0x20,0xC1, 0x20,0xC1, 0x20,0xC1, 0x20,0xC1, 0x20,0xC1, 0x20,0xC1, 0x20,0xC1, 0x20,0xC1, 0x20,0xC1, 0x20,0xC1,
0x20,0xC1, 0x20,0xC1, 0x20,0xC1, 0x20,0xC1, 0x20,0xC1, 0x20,0xC1, 0x20,0xC1, 0x20,0xC1, 0x20,0xC1, 0x20,0xC1, 0x20,0xC1, 0x20,0xC1, 0x20,0xC1, 0x20,0xC1, 0x20,0xC1, 0x20,0xC1,
@ -265,7 +265,7 @@ const static uint8_t image_d2_open[] PROGMEM = {
0x58,0xA2, 0xCD,0xD5, 0x58,0xA2, 0xCD,0xD5,
}; };
const static uint8_t image_d2_closed[] PROGMEM = { const static uint8_t image_d2_open[] PROGMEM = {
0xCE,0x37, 0x31,0x23, 0x10,0x81, 0x18,0x81, 0x20,0xC1, 0x29,0x02, 0x28,0xE2, 0x28,0xC2, 0xCE,0x37, 0x31,0x23, 0x10,0x81, 0x18,0x81, 0x20,0xC1, 0x29,0x02, 0x28,0xE2, 0x28,0xC2,
0x31,0x01, 0x29,0x01, 0x20,0xC1, 0x28,0xE1, 0x31,0x42, 0x28,0xC1, 0x20,0xA0, 0x31,0x22, 0x31,0x01, 0x29,0x01, 0x20,0xC1, 0x28,0xE1, 0x31,0x42, 0x28,0xC1, 0x20,0xA0, 0x31,0x22,
0x31,0x01, 0x28,0xE1, 0x31,0x02, 0x30,0xE1, 0x20,0xA0, 0x20,0xA0, 0x20,0xA0, 0x28,0xC1, 0x31,0x01, 0x28,0xE1, 0x31,0x02, 0x30,0xE1, 0x20,0xA0, 0x20,0xA0, 0x20,0xA0, 0x28,0xC1,

View File

@ -1,114 +1,3 @@
const uint8_t image_9341_driveclosed[] PROGMEM = {
0xCE,0x12, 0xB5,0x30, 0xAC,0xEF, 0xAC,0xEF, 0xB5,0x10, 0xB5,0x10, 0xB5,0x10, 0xB5,0x0F,
0xB5,0x0F, 0xB5,0x0F, 0xB5,0x10, 0xB5,0x10, 0xB5,0x10, 0xB5,0x10, 0xB5,0x10, 0xB5,0x0F,
0xB5,0x10, 0xB5,0x10, 0xB5,0x10, 0xB5,0x0F, 0xB5,0x0F, 0xB5,0x0F, 0xB5,0x30, 0xB5,0x2F,
0xB5,0x2F, 0xB5,0x30, 0xB5,0x50, 0xBD,0x50, 0xBD,0x50, 0xB5,0x50, 0xBD,0x50, 0xBD,0x51,
0xBD,0x51, 0xBD,0x51, 0xBD,0x71, 0xBD,0x71, 0xBD,0x71, 0xBD,0x70, 0xBD,0x70, 0xC5,0x91,
0xC5,0xB1, 0xC5,0xD1, 0xDE,0x53, 0xC5,0xB1, 0x83,0x8B, 0x7B,0x4A, 0x94,0x0C, 0x8B,0xEC,
0x8B,0xEC, 0x8B,0xCB, 0x8B,0xEC, 0x8B,0xEC, 0x8B,0xEC, 0x8B,0xEC, 0x8B,0xCC, 0x8B,0xCB,
0x8B,0xEC, 0x8B,0xEC, 0x8B,0xCB, 0x8B,0xEC, 0x8B,0xCB, 0x8B,0xCB, 0x8B,0xCC, 0x8B,0xCC,
0x8B,0xCC, 0x8B,0xCB, 0x8B,0xCB, 0x8B,0xCB, 0x8B,0xCB, 0x8B,0xCB, 0x8B,0xCB, 0x8B,0xCB,
0x8B,0xEC, 0x8B,0xEC, 0x8B,0xEC, 0x8B,0xEC, 0x8B,0xEC, 0x8B,0xEC, 0x8B,0xEB, 0x8B,0xEB,
0x8B,0xEB, 0x8B,0xEB, 0x7B,0x6A, 0x7B,0x8A, 0xAC,0xCF, 0xDE,0x53, 0xC5,0xB2, 0x73,0x29,
0x9C,0x4E, 0xAC,0xCF, 0xAC,0xCF, 0xA4,0xAF, 0xA4,0xAF, 0xA4,0x8E, 0xA4,0x8E, 0xA4,0x8F,
0xA4,0x8F, 0xA4,0x8F, 0xA4,0x8F, 0xA4,0x8F, 0xA4,0x8F, 0xA4,0x8F, 0x9C,0x8E, 0xA4,0x8E,
0xA4,0x8E, 0xA4,0x8E, 0xA4,0x8E, 0xA4,0xAE, 0xA4,0x8E, 0xA4,0x8E, 0xA4,0x8E, 0xA4,0x8E,
0xA4,0x8E, 0xA4,0x8E, 0xA4,0x8E, 0xA4,0x8E, 0xA4,0x8E, 0xA4,0x8E, 0xA4,0x8E, 0xA4,0x8E,
0xA4,0x8E, 0xA4,0x8E, 0xA4,0x8E, 0xA4,0x6E, 0x9C,0x8E, 0x94,0x4D, 0x62,0xC8, 0xB5,0x10,
0xDE,0x53, 0xC5,0x91, 0x73,0x29, 0x9C,0x6F, 0xAC,0xCF, 0xAC,0xCF, 0xA4,0xAF, 0xA4,0xAE,
0xA4,0x8E, 0xA4,0x8E, 0xA4,0xAF, 0xAC,0xAF, 0xA4,0x8E, 0xA4,0x8E, 0xA4,0xAF, 0xA4,0x8E,
0xA4,0x8E, 0xA4,0x8E, 0xA4,0xAE, 0xA4,0xAE, 0xA4,0xAE, 0xA4,0xAE, 0xA4,0x8E, 0xA4,0xAE,
0xA4,0x8E, 0xA4,0xAE, 0xA4,0xAE, 0xA4,0xAE, 0xA4,0xAE, 0xA4,0xAE, 0xA4,0xAE, 0xA4,0xAE,
0xA4,0xAE, 0xA4,0x8E, 0xA4,0x8E, 0xA4,0xAE, 0xA4,0x8E, 0xA4,0x8E, 0xA4,0x8E, 0x9C,0x8E,
0x94,0x4D, 0x6A,0xE8, 0xB5,0x10, 0xDE,0x53, 0xC5,0x91, 0x7B,0x49, 0xA4,0x8F, 0xAC,0xCF,
0xAC,0xCF, 0xA4,0xAE, 0xA4,0xAE, 0xA4,0xAE, 0xA4,0xAE, 0xA4,0xAE, 0xA4,0xAE, 0xA4,0xAE,
0xA4,0xAE, 0xA4,0xAE, 0xA4,0xAE, 0xA4,0xAE, 0xA4,0x8E, 0xA4,0xAE, 0xA4,0xAE, 0xA4,0xAE,
0xA4,0xAE, 0xA4,0xAE, 0xA4,0xAE, 0xA4,0xAE, 0xA4,0x8E, 0xA4,0x8E, 0xA4,0xAE, 0xA4,0xAE,
0xA4,0x8E, 0xA4,0x8E, 0xA4,0xAE, 0xA4,0xAE, 0xA4,0xAE, 0xA4,0xAE, 0xA4,0x8E, 0xA4,0x8E,
0xA4,0x8E, 0xA4,0x8E, 0x9C,0x8D, 0x9C,0x6E, 0x6B,0x08, 0xB5,0x10, 0xDE,0x53, 0xC5,0x91,
0x73,0x29, 0xA4,0x8F, 0xAC,0xCF, 0xAC,0xCF, 0xAC,0xCF, 0xA4,0xAE, 0xA4,0xAE, 0xAC,0xCE,
0xAC,0xAE, 0xA4,0xAE, 0xA4,0xAE, 0xA4,0xAE, 0xA4,0xCE, 0xA4,0xAE, 0xA4,0xAE, 0xAC,0xAE,
0xA4,0xAE, 0xA4,0x8E, 0xAC,0xAE, 0xA4,0xAE, 0xAC,0xAE, 0xAC,0xAE, 0xA4,0xAE, 0xA4,0xAE,
0xA4,0xAE, 0xA4,0xAE, 0xAC,0xCF, 0xA4,0xAE, 0xA4,0xAE, 0xA4,0xAE, 0xA4,0xAE, 0xA4,0xAE,
0xA4,0xAE, 0xA4,0x8E, 0xA4,0x8E, 0xA4,0x8E, 0xA4,0xAE, 0x9C,0x8D, 0x9C,0x6E, 0x73,0x29,
0xB5,0x30, 0xDE,0x53, 0xBD,0x91, 0x7B,0x49, 0xAC,0xEF, 0xB5,0x0F, 0xB5,0x0F, 0xB5,0x0F,
0xB5,0x10, 0xB5,0x10, 0xB5,0x10, 0xB5,0x10, 0xB5,0x0F, 0xB5,0x0F, 0xB5,0x30, 0xB5,0x0F,
0xAD,0x0F, 0xB4,0xEF, 0xB4,0xEF, 0xAC,0xCF, 0xB4,0xEF, 0xB4,0xEF, 0xB4,0xEF, 0xB4,0xEF,
0xB4,0xEF, 0xB4,0xEF, 0xB5,0x0F, 0xB4,0xEF, 0xAC,0xEF, 0xAD,0x0F, 0xB5,0x0F, 0xB5,0x0F,
0xB5,0x0F, 0xB5,0x0F, 0xB5,0x0F, 0xB5,0x10, 0xB5,0x10, 0xB5,0x10, 0xB4,0xF0, 0xAC,0xEF,
0xA4,0xCE, 0xA4,0xAE, 0x7B,0x4A, 0xB5,0x30, 0xDE,0x53, 0xA4,0xAE, 0x72,0xE8, 0xC5,0xB2,
0xC5,0x91, 0xC5,0x91, 0xC5,0x92, 0xC5,0xB2, 0xC5,0xB2, 0xC5,0xB2, 0xC5,0x91, 0xC5,0x91,
0xC5,0x91, 0xC5,0x91, 0xC5,0x91, 0xC5,0x91, 0xC5,0x91, 0xC5,0x91, 0xC5,0x91, 0xC5,0x91,
0xC5,0x91, 0xC5,0x71, 0xC5,0x71, 0xC5,0x71, 0xC5,0x91, 0xC5,0x71, 0xC5,0x71, 0xC5,0x91,
0xC5,0x91, 0xC5,0x91, 0xC5,0x91, 0xC5,0x91, 0xC5,0x91, 0xC5,0x91, 0xC5,0x91, 0xC5,0x91,
0xC5,0x92, 0xC5,0x72, 0xC5,0x71, 0xBD,0x50, 0xBD,0x50, 0x83,0x6A, 0xB5,0x10, 0xDE,0x53,
0xA4,0xAD, 0x6A,0xC7, 0xBD,0x91, 0xBD,0x70, 0xBD,0x70, 0xBD,0x70, 0xBD,0x91, 0xBD,0x90,
0xBD,0x90, 0xBD,0x71, 0xBD,0x71, 0xBD,0x71, 0xBD,0x71, 0xBD,0x70, 0xC5,0x71, 0xC5,0x71,
0xC5,0x71, 0xC5,0x70, 0xBD,0x70, 0xBD,0x70, 0xC5,0x71, 0xBD,0x71, 0xC5,0x71, 0xC5,0x71,
0xBD,0x71, 0xC5,0x71, 0xC5,0x71, 0xC5,0x70, 0xC5,0x70, 0xC5,0x70, 0xC5,0x70, 0xC5,0x70,
0xBD,0x70, 0xC5,0x70, 0xBD,0x71, 0xBD,0x71, 0xBD,0x71, 0xBD,0x71, 0xBD,0x50, 0xBD,0x71,
0x7B,0x29, 0xC5,0x91, 0xB5,0x0E, 0xC5,0xD2, 0x6A,0xE8, 0xBD,0x70, 0xBD,0x70, 0xBD,0x70,
0xBD,0x70, 0xBD,0x70, 0xBD,0x70, 0xBD,0x70, 0xBD,0x71, 0xBD,0x71, 0xBD,0x70, 0xBD,0x70,
0xBD,0x50, 0xBD,0x70, 0xBD,0x50, 0xBD,0x50, 0xBD,0x70, 0xBD,0x70, 0xBD,0x70, 0xBD,0x50,
0xBD,0x50, 0xBD,0x50, 0xBD,0x50, 0xBD,0x50, 0xBD,0x70, 0xC5,0x70, 0xBD,0x50, 0xBD,0x50,
0xBD,0x50, 0xBD,0x50, 0xBD,0x70, 0xBD,0x50, 0xBD,0x70, 0xBD,0x70, 0xBD,0x50, 0xBD,0x70,
0xBD,0x70, 0xBD,0x50, 0xBD,0x50, 0x6A,0xE8, 0xCD,0xF2, 0xDE,0x73, 0xD6,0x33, 0x7B,0x49,
0xC5,0x91, 0xC5,0xD1, 0xC5,0xD1, 0xC5,0xD1, 0xC5,0xB1, 0xC5,0xB1, 0xBD,0x70, 0xBD,0x91,
0xC5,0xB2, 0xC5,0xB2, 0xC5,0x91, 0xC5,0x92, 0xBD,0x51, 0xBD,0x71, 0xBD,0x51, 0xBD,0x51,
0xBD,0x71, 0xBD,0x71, 0xBD,0x50, 0xBD,0x71, 0xBD,0x71, 0xBD,0x91, 0xBD,0x91, 0xBD,0x91,
0xBD,0x30, 0xBD,0x50, 0xC5,0x71, 0xBD,0x51, 0xBD,0x71, 0xBD,0x71, 0xBD,0x71, 0xBD,0x70,
0xC5,0x91, 0xC5,0x91, 0xC5,0x91, 0xC5,0x91, 0xC5,0x91, 0xBD,0x50, 0x62,0xA7, 0xBD,0x70,
0xE6,0xB4, 0xD6,0x12, 0x7B,0x49, 0xC5,0xB2, 0xCD,0xD2, 0xCD,0xD2, 0xC5,0xB2, 0xCD,0xD2,
0xBD,0x71, 0x9C,0x4D, 0xAC,0xCF, 0xAD,0x10, 0xA4,0xCF, 0x9C,0x6E, 0xB5,0x10, 0xA4,0xAF,
0x9C,0x4D, 0xA4,0x8E, 0xA4,0x8E, 0x9C,0x4D, 0x9C,0x4D, 0x9C,0x4D, 0x94,0x2C, 0xAC,0xCF,
0xA4,0x8E, 0xAC,0xEF, 0xAC,0xCF, 0xA4,0x8E, 0x9C,0x8E, 0xB5,0x10, 0xA4,0x8E, 0x9C,0x8E,
0x9C,0x4D, 0x9C,0x4D, 0xA4,0x8E, 0xC5,0x91, 0xC5,0xB2, 0xC5,0x91, 0xC5,0x91, 0xBD,0x91,
0xB5,0x2F, 0x62,0x86, 0xA4,0xAD, 0xDE,0x73, 0xC5,0x91, 0x73,0x08, 0xCD,0xF3, 0xCD,0xF3,
0xCD,0xF3, 0xCD,0xF3, 0xCD,0xF3, 0xC5,0x91, 0xBD,0x71, 0xB5,0x51, 0xB5,0x10, 0xAC,0xCF,
0xAC,0xF0, 0xBD,0x72, 0xAC,0xF0, 0xB5,0x10, 0xAC,0xF0, 0xB5,0x31, 0xAC,0xF0, 0xAC,0xF0,
0xB5,0x10, 0xAC,0xF0, 0xBD,0x51, 0xAC,0xCF, 0xB5,0x10, 0xB5,0x51, 0xB5,0x30, 0xAC,0xEF,
0xB5,0x30, 0xAD,0x10, 0xAD,0x10, 0xA4,0xCF, 0xA4,0x8E, 0xB5,0x30, 0xCD,0xF3, 0xCD,0xF3,
0xCD,0xD2, 0xCD,0xD2, 0xC5,0xB2, 0xB5,0x30, 0x5A,0x66, 0x9C,0x4C, 0xC5,0xD1, 0xAC,0xEF,
0x73,0x29, 0xE6,0x96, 0xE6,0xB6, 0xE6,0xB6, 0xE6,0xB6, 0xE6,0xB6, 0xE6,0xB6, 0xE6,0xB7,
0xE6,0xB7, 0xE6,0x96, 0xE6,0x96, 0xE6,0x97, 0xE6,0xB7, 0xE6,0x96, 0xE6,0x96, 0xE6,0x96,
0xE6,0x96, 0xE6,0x96, 0xE6,0x96, 0xE6,0x96, 0xE6,0x96, 0xDE,0x96, 0xDE,0x96, 0xDE,0x75,
0xE6,0x96, 0xDE,0x76, 0xDE,0x76, 0xDE,0x76, 0xDE,0x96, 0xDE,0x76, 0xDE,0x96, 0xE6,0x96,
0xDE,0x75, 0xE6,0x76, 0xE6,0x96, 0xD6,0x14, 0xD6,0x14, 0xCD,0xF2, 0xB5,0x10, 0x5A,0x66,
0x9C,0x4C, 0xB5,0x4F, 0xAC,0xEE, 0x7B,0x6A, 0xBD,0x51, 0xBD,0x51, 0xBD,0x51, 0xBD,0x51,
0xBD,0x51, 0xBD,0x51, 0xBD,0x51, 0xB5,0x51, 0x9C,0x6E, 0x94,0x2D, 0xAC,0xD0, 0xA4,0xAF,
0x9C,0x6E, 0x9C,0x6E, 0xB5,0x31, 0x9C,0x6D, 0x94,0x0C, 0xA4,0xAF, 0xA4,0xAF, 0x9C,0x6E,
0xAC,0xCF, 0xAC,0xCF, 0x9C,0x4D, 0x94,0x2D, 0x94,0x2D, 0x94,0x0D, 0x9C,0x4E, 0x94,0x2D,
0xA4,0xAF, 0xB5,0x31, 0xB5,0x30, 0xB5,0x30, 0xB5,0x30, 0xB5,0x30, 0xB5,0x30, 0xB5,0x30,
0xB5,0x50, 0xAC,0xCF, 0x5A,0x66, 0xA4,0x8D, 0xAC,0xEE, 0xAC,0xEF, 0x83,0x8A, 0xB5,0x10,
0xB5,0x10, 0xB5,0x10, 0xB5,0x10, 0xB5,0x10, 0xB4,0xF0, 0xB5,0x10, 0xB5,0x10, 0x9C,0x4D,
0x9C,0x6E, 0x94,0x2D, 0x94,0x0C, 0x8C,0x0C, 0x94,0x2D, 0xAC,0xCF, 0x94,0x2C, 0x8B,0xCB,
0x9C,0x6D, 0x9C,0x6D, 0x8B,0xEB, 0x9C,0x4D, 0x9C,0x6E, 0x94,0x0C, 0x8B,0xEC, 0x94,0x2D,
0x8B,0xCB, 0x8B,0xEC, 0x83,0xCB, 0x94,0x2D, 0xAC,0xEF, 0xAC,0xEF, 0xAC,0xEF, 0xAC,0xEF,
0xAC,0xEF, 0xAC,0xEF, 0xAC,0xEF, 0xB5,0x10, 0xA4,0xAE, 0x62,0xA7, 0xA4,0xAE, 0xAC,0xEE,
0xAC,0xEF, 0x8B,0xEB, 0xB5,0x10, 0xB5,0x10, 0xB5,0x10, 0xB5,0x0F, 0xAC,0xEF, 0xAC,0xEF,
0xAC,0xEF, 0xAC,0xCF, 0xA4,0xCF, 0xA4,0xCF, 0xA4,0xAF, 0xA4,0x8F, 0xA4,0x8E, 0xA4,0xAF,
0xA4,0xAF, 0xA4,0xAF, 0xA4,0x8E, 0xA4,0xAF, 0xA4,0xAF, 0xA4,0xAE, 0xA4,0xAF, 0xA4,0xAF,
0xA4,0x8E, 0xA4,0xAE, 0xA4,0xAE, 0xA4,0xAE, 0xA4,0x8E, 0xA4,0xAE, 0xAC,0xCF, 0xAC,0xCF,
0xAC,0xCF, 0xAC,0xCF, 0xAC,0xCF, 0xAC,0xEF, 0xAC,0xCF, 0xAC,0xCF, 0xAC,0xEF, 0x9C,0x4D,
0x6A,0xC7, 0xA4,0xAE, 0xAC,0xCE, 0xAC,0xEF, 0x9C,0xAD, 0xD6,0x33, 0xCD,0xD2, 0xCD,0xD2,
0xC5,0x91, 0xB5,0x30, 0xAC,0xCE, 0x9C,0x8D, 0x94,0x2C, 0x8B,0xEC, 0x8B,0xCB, 0x8B,0xEB,
0x8B,0xCB, 0x8B,0xCB, 0x8B,0xCB, 0x8B,0xCB, 0x8B,0xCB, 0x8B,0xCB, 0x8B,0xCB, 0x8B,0xCB,
0x8B,0xCB, 0x8B,0xEB, 0x8B,0xEB, 0x8C,0x0C, 0x94,0x2C, 0x94,0x2B, 0x9C,0x4C, 0x9C,0x6D,
0xA4,0x8D, 0xA4,0xAD, 0xA4,0x8E, 0xA4,0x8E, 0xA4,0xAE, 0xA4,0xAE, 0xA4,0xAE, 0xA4,0xAE,
0xA4,0xAE, 0x9C,0x4D, 0x8B,0xCB, 0x7B,0x89, 0xA4,0x8D, 0xAC,0xCE, 0xBD,0x4F, 0xC5,0xD1,
0xCD,0xD2, 0xE6,0xB5, 0xDE,0x74, 0xD6,0x33, 0xCD,0xD2, 0xC5,0xB1, 0xBD,0x50, 0xB5,0x30,
0xB5,0x0F, 0xAC,0xEF, 0xAC,0xEF, 0xAC,0xEF, 0xAD,0x0F, 0xAC,0xEF, 0xAC,0xEF, 0xAC,0xEF,
0xAC,0xEF, 0xAC,0xEF, 0xAC,0xEF, 0xAC,0xEF, 0xAC,0xEF, 0xAC,0xEF, 0xB5,0x0F, 0xB5,0x0F,
0xB5,0x2F, 0xB5,0x50, 0xBD,0x70, 0xBD,0x91, 0xC5,0x91, 0xBD,0x91, 0xBD,0x71, 0xBD,0x71,
0xBD,0x91, 0xC5,0x91, 0xC5,0x91, 0xC5,0x91, 0xC5,0x91, 0xBD,0x70, 0xB5,0x0F, 0x9C,0x6D,
0xB5,0x2F, 0xCD,0xD1, 0xE6,0x94, 0xE6,0xB5, 0xE6,0xD6, 0xE6,0xB5, 0xE6,0x95, 0xDE,0x74,
0xDE,0x74, 0xD6,0x33, 0xD6,0x33, 0xD6,0x33, 0xD6,0x13, 0xD6,0x13, 0xCE,0x13, 0xCE,0x13,
0xD6,0x33, 0xCE,0x13, 0xD6,0x33, 0xCE,0x13, 0xCE,0x13, 0xD6,0x13, 0xCE,0x13, 0xD6,0x13,
0xD6,0x13, 0xD6,0x33, 0xD6,0x33, 0xD6,0x33, 0xD6,0x33, 0xD6,0x53, 0xDE,0x54, 0xDE,0x54,
0xDE,0x54, 0xDE,0x54, 0xD6,0x53, 0xD6,0x53, 0xDE,0x53, 0xDE,0x54, 0xDE,0x54, 0xDE,0x53,
0xDE,0x53, 0xD6,0x33, 0xB5,0x2F, 0xC5,0x91,
};
const uint8_t image_9341_driveopen[] PROGMEM = { const uint8_t image_9341_driveopen[] PROGMEM = {
0xCE,0x12, 0xB5,0x30, 0xAC,0xEF, 0xAC,0xEF, 0xB5,0x10, 0xB5,0x10, 0xB5,0x10, 0xB5,0x0F, 0xCE,0x12, 0xB5,0x30, 0xAC,0xEF, 0xAC,0xEF, 0xB5,0x10, 0xB5,0x10, 0xB5,0x10, 0xB5,0x0F,
0xB5,0x0F, 0xB5,0x0F, 0xB5,0x10, 0xB5,0x10, 0xB5,0x10, 0xB5,0x10, 0xB5,0x10, 0xB5,0x0F, 0xB5,0x0F, 0xB5,0x0F, 0xB5,0x10, 0xB5,0x10, 0xB5,0x10, 0xB5,0x10, 0xB5,0x10, 0xB5,0x0F,
@ -219,3 +108,114 @@ const uint8_t image_9341_driveopen[] PROGMEM = {
0xDE,0x54, 0xDE,0x54, 0xD6,0x53, 0xD6,0x53, 0xDE,0x53, 0xDE,0x54, 0xDE,0x54, 0xDE,0x53, 0xDE,0x54, 0xDE,0x54, 0xD6,0x53, 0xD6,0x53, 0xDE,0x53, 0xDE,0x54, 0xDE,0x54, 0xDE,0x53,
0xDE,0x53, 0xD6,0x33, 0xB5,0x2F, 0xC5,0x91, 0xDE,0x53, 0xD6,0x33, 0xB5,0x2F, 0xC5,0x91,
}; };
const uint8_t image_9341_driveclosed[] PROGMEM = {
0xCE,0x12, 0xB5,0x30, 0xAC,0xEF, 0xAC,0xEF, 0xB5,0x10, 0xB5,0x10, 0xB5,0x10, 0xB5,0x0F,
0xB5,0x0F, 0xB5,0x0F, 0xB5,0x10, 0xB5,0x10, 0xB5,0x10, 0xB5,0x10, 0xB5,0x10, 0xB5,0x0F,
0xB5,0x10, 0xB5,0x10, 0xB5,0x10, 0xB5,0x0F, 0xB5,0x0F, 0xB5,0x0F, 0xB5,0x30, 0xB5,0x2F,
0xB5,0x2F, 0xB5,0x30, 0xB5,0x50, 0xBD,0x50, 0xBD,0x50, 0xB5,0x50, 0xBD,0x50, 0xBD,0x51,
0xBD,0x51, 0xBD,0x51, 0xBD,0x71, 0xBD,0x71, 0xBD,0x71, 0xBD,0x70, 0xBD,0x70, 0xC5,0x91,
0xC5,0xB1, 0xC5,0xD1, 0xDE,0x53, 0xC5,0xB1, 0x83,0x8B, 0x7B,0x4A, 0x94,0x0C, 0x8B,0xEC,
0x8B,0xEC, 0x8B,0xCB, 0x8B,0xEC, 0x8B,0xEC, 0x8B,0xEC, 0x8B,0xEC, 0x8B,0xCC, 0x8B,0xCB,
0x8B,0xEC, 0x8B,0xEC, 0x8B,0xCB, 0x8B,0xEC, 0x8B,0xCB, 0x8B,0xCB, 0x8B,0xCC, 0x8B,0xCC,
0x8B,0xCC, 0x8B,0xCB, 0x8B,0xCB, 0x8B,0xCB, 0x8B,0xCB, 0x8B,0xCB, 0x8B,0xCB, 0x8B,0xCB,
0x8B,0xEC, 0x8B,0xEC, 0x8B,0xEC, 0x8B,0xEC, 0x8B,0xEC, 0x8B,0xEC, 0x8B,0xEB, 0x8B,0xEB,
0x8B,0xEB, 0x8B,0xEB, 0x7B,0x6A, 0x7B,0x8A, 0xAC,0xCF, 0xDE,0x53, 0xC5,0xB2, 0x7B,0x49,
0xC5,0x91, 0xC5,0xD1, 0xC5,0xD1, 0xC5,0xD1, 0xC5,0xB1, 0xC5,0xB1, 0xBD,0x70, 0xBD,0x91,
0xC5,0xB2, 0xC5,0xB2, 0xC5,0x91, 0xC5,0x92, 0xBD,0x51, 0xBD,0x71, 0xBD,0x51, 0xBD,0x51,
0xBD,0x71, 0xBD,0x71, 0xBD,0x50, 0xBD,0x71, 0xBD,0x71, 0xBD,0x91, 0xBD,0x91, 0xBD,0x91,
0xBD,0x30, 0xBD,0x50, 0xC5,0x71, 0xBD,0x51, 0xBD,0x71, 0xBD,0x71, 0xBD,0x71, 0xBD,0x70,
0xC5,0x91, 0xC5,0x91, 0xC5,0x91, 0xC5,0x91, 0xC5,0x91, 0xBD,0x50, 0x62,0xA7, 0xB5,0x10,
0xDE,0x53, 0xC5,0x91, 0x7B,0x49, 0xC5,0xB2, 0xCD,0xD2, 0xCD,0xD2, 0xC5,0xB2, 0xCD,0xD2,
0xBD,0x71, 0x9C,0x4D, 0xAC,0xCF, 0xAD,0x10, 0xA4,0xCF, 0x9C,0x6E, 0xB5,0x10, 0xA4,0xAF,
0x9C,0x4D, 0xA4,0x8E, 0xA4,0x8E, 0x9C,0x4D, 0x9C,0x4D, 0x9C,0x4D, 0x94,0x2C, 0xAC,0xCF,
0xA4,0x8E, 0xAC,0xEF, 0xAC,0xCF, 0xA4,0x8E, 0x9C,0x8E, 0xB5,0x10, 0xA4,0x8E, 0x9C,0x8E,
0x9C,0x4D, 0x9C,0x4D, 0xA4,0x8E, 0xC5,0x91, 0xC5,0xB2, 0xC5,0x91, 0xC5,0x91, 0xBD,0x91,
0xB5,0x2F, 0x62,0x86, 0xB5,0x10, 0xDE,0x53, 0xC5,0x91, 0x73,0x08, 0xCD,0xF3, 0xCD,0xF3,
0xCD,0xF3, 0xCD,0xF3, 0xCD,0xF3, 0xC5,0x91, 0xBD,0x71, 0xB5,0x51, 0xB5,0x10, 0xAC,0xCF,
0xAC,0xF0, 0xBD,0x72, 0xAC,0xF0, 0xB5,0x10, 0xAC,0xF0, 0xB5,0x31, 0xAC,0xF0, 0xAC,0xF0,
0xB5,0x10, 0xAC,0xF0, 0xBD,0x51, 0xAC,0xCF, 0xB5,0x10, 0xB5,0x51, 0xB5,0x30, 0xAC,0xEF,
0xB5,0x30, 0xAD,0x10, 0xAD,0x10, 0xA4,0xCF, 0xA4,0x8E, 0xB5,0x30, 0xCD,0xF3, 0xCD,0xF3,
0xCD,0xD2, 0xCD,0xD2, 0xC5,0xB2, 0xB5,0x30, 0x5A,0x66, 0xB5,0x10, 0xDE,0x53, 0xC5,0x91,
0x73,0x29, 0xE6,0x96, 0xE6,0xB6, 0xE6,0xB6, 0xE6,0xB6, 0xE6,0xB6, 0xE6,0xB6, 0xE6,0xB7,
0xE6,0xB7, 0xE6,0x96, 0xE6,0x96, 0xE6,0x97, 0xE6,0xB7, 0xE6,0x96, 0xE6,0x96, 0xE6,0x96,
0xE6,0x96, 0xE6,0x96, 0xE6,0x96, 0xE6,0x96, 0xE6,0x96, 0xDE,0x96, 0xDE,0x96, 0xDE,0x75,
0xE6,0x96, 0xDE,0x76, 0xDE,0x76, 0xDE,0x76, 0xDE,0x96, 0xDE,0x76, 0xDE,0x96, 0xE6,0x96,
0xDE,0x75, 0xE6,0x76, 0xE6,0x96, 0xD6,0x14, 0xD6,0x14, 0xCD,0xF2, 0xB5,0x10, 0x5A,0x66,
0xB5,0x30, 0xDE,0x53, 0xBD,0x91, 0x7B,0x6A, 0xBD,0x51, 0xBD,0x51, 0xBD,0x51, 0xBD,0x51,
0xBD,0x51, 0xBD,0x51, 0xBD,0x51, 0xB5,0x51, 0x9C,0x6E, 0x94,0x2D, 0xAC,0xD0, 0xA4,0xAF,
0x9C,0x6E, 0x9C,0x6E, 0xB5,0x31, 0x9C,0x6D, 0x94,0x0C, 0xA4,0xAF, 0xA4,0xAF, 0x9C,0x6E,
0xAC,0xCF, 0xAC,0xCF, 0x9C,0x4D, 0x94,0x2D, 0x94,0x2D, 0x94,0x0D, 0x9C,0x4E, 0x94,0x2D,
0xA4,0xAF, 0xB5,0x31, 0xB5,0x30, 0xB5,0x30, 0xB5,0x30, 0xB5,0x30, 0xB5,0x30, 0xB5,0x30,
0xB5,0x50, 0xAC,0xCF, 0x5A,0x66, 0xB5,0x30, 0xDE,0x53, 0xA4,0xAE, 0x83,0x8A, 0xB5,0x10,
0xB5,0x10, 0xB5,0x10, 0xB5,0x10, 0xB5,0x10, 0xB4,0xF0, 0xB5,0x10, 0xB5,0x10, 0x9C,0x4D,
0x9C,0x6E, 0x94,0x2D, 0x94,0x0C, 0x8C,0x0C, 0x94,0x2D, 0xAC,0xCF, 0x94,0x2C, 0x8B,0xCB,
0x9C,0x6D, 0x9C,0x6D, 0x8B,0xEB, 0x9C,0x4D, 0x9C,0x6E, 0x94,0x0C, 0x8B,0xEC, 0x94,0x2D,
0x8B,0xCB, 0x8B,0xEC, 0x83,0xCB, 0x94,0x2D, 0xAC,0xEF, 0xAC,0xEF, 0xAC,0xEF, 0xAC,0xEF,
0xAC,0xEF, 0xAC,0xEF, 0xAC,0xEF, 0xB5,0x10, 0xA4,0xAE, 0x62,0xA7, 0xB5,0x10, 0xDE,0x53,
0xA4,0xAD, 0x8B,0xEB, 0xB5,0x10, 0xB5,0x10, 0xB5,0x10, 0xB5,0x0F, 0xAC,0xEF, 0xAC,0xEF,
0xAC,0xEF, 0xAC,0xCF, 0xA4,0xCF, 0xA4,0xCF, 0xA4,0xAF, 0xA4,0x8F, 0xA4,0x8E, 0xA4,0xAF,
0xA4,0xAF, 0xA4,0xAF, 0xA4,0x8E, 0xA4,0xAF, 0xA4,0xAF, 0xA4,0xAE, 0xA4,0xAF, 0xA4,0xAF,
0xA4,0x8E, 0xA4,0xAE, 0xA4,0xAE, 0xA4,0xAE, 0xA4,0x8E, 0xA4,0xAE, 0xAC,0xCF, 0xAC,0xCF,
0xAC,0xCF, 0xAC,0xCF, 0xAC,0xCF, 0xAC,0xEF, 0xAC,0xCF, 0xAC,0xCF, 0xAC,0xEF, 0x9C,0x4D,
0x6A,0xC7, 0xA4,0xAD, 0xA4,0xAD, 0xC5,0xD2, 0x52,0x67, 0x52,0x67, 0x52,0x67, 0x52,0x67,
0x52,0x67, 0x52,0x67, 0x52,0x67, 0x52,0x67, 0x52,0x67, 0x52,0x67, 0x52,0x67, 0x52,0x67,
0x52,0x67, 0x52,0x67, 0x52,0x67, 0x52,0x67, 0x52,0x67, 0x52,0x67, 0x52,0x67, 0x52,0x67,
0x52,0x67, 0x52,0x67, 0x52,0x67, 0x52,0x67, 0x52,0x67, 0x52,0x67, 0x52,0x67, 0x52,0x67,
0x52,0x67, 0x52,0x67, 0x52,0x67, 0x52,0x67, 0x52,0x67, 0x52,0x67, 0x52,0x67, 0x52,0x67,
0x52,0x67, 0x52,0x67, 0x52,0x67, 0x52,0x67, 0xA4,0xAD, 0xDE,0x53, 0xD6,0x33, 0x62,0xE9,
0x62,0xE9, 0x62,0xE9, 0x62,0xE9, 0x62,0xE9, 0x62,0xE9, 0x62,0xE9, 0x62,0xE9, 0x62,0xE9,
0x62,0xE9, 0x62,0xE9, 0x62,0xE9, 0x62,0xE9, 0x62,0xE9, 0x62,0xE9, 0x62,0xE9, 0x62,0xE9,
0x62,0xE9, 0x62,0xE9, 0x62,0xE9, 0x62,0xE9, 0x62,0xE9, 0x62,0xE9, 0x62,0xE9, 0x62,0xE9,
0x62,0xE9, 0x62,0xE9, 0x62,0xE9, 0x62,0xE9, 0x62,0xE9, 0x62,0xE9, 0x62,0xE9, 0x62,0xE9,
0x62,0xE9, 0x62,0xE9, 0x62,0xE9, 0x62,0xE9, 0x62,0xE9, 0x62,0xE9, 0x62,0xE9, 0xA4,0xAD,
0xEE,0xF6, 0xD6,0x12, 0xC5,0xD2, 0xC5,0xD2, 0xC5,0xD2, 0xC5,0xD2, 0xC5,0xD2, 0xC5,0xD2,
0xC5,0xD2, 0xC5,0xD2, 0xC5,0xD2, 0xC5,0xD2, 0xC5,0xD2, 0xC5,0xD2, 0xC5,0xD2, 0xC5,0xD2,
0xC5,0xD2, 0xC5,0xD2, 0xC5,0xD2, 0xC5,0xD2, 0xC5,0xD2, 0xC5,0xD2, 0xC5,0xD2, 0xC5,0xD2,
0xC5,0xD2, 0xC5,0xD2, 0xC5,0xD2, 0xC5,0xD2, 0xC5,0xD2, 0xC5,0xD2, 0xC5,0xD2, 0xC5,0xD2,
0xC5,0xD2, 0xC5,0xD2, 0xC5,0xD2, 0xC5,0xD2, 0xC5,0xD2, 0xC5,0xD2, 0xC5,0xD2, 0xC5,0xD2,
0xC5,0xD2, 0xC5,0xD2, 0xA4,0xAD, 0xEE,0xF6, 0xC5,0x91, 0xCD,0xF2, 0xCD,0xF2, 0xCD,0xF2,
0xCD,0xF2, 0xCD,0xF2, 0xCD,0xF2, 0xCD,0xF2, 0xCD,0xF2, 0xCD,0xF2, 0xCD,0xF2, 0xCD,0xF2,
0xCD,0xF2, 0xCD,0xF2, 0xCD,0xF2, 0xCD,0xF2, 0xCD,0xF2, 0xCD,0xF2, 0xCD,0xF2, 0xCD,0xF2,
0xCD,0xF2, 0xCD,0xF2, 0xCD,0xF2, 0xCD,0xF2, 0xCD,0xF2, 0xCD,0xF2, 0xCD,0xF2, 0xCD,0xF2,
0xCD,0xF2, 0xCD,0xF2, 0xCD,0xF2, 0xCD,0xF2, 0xCD,0xF2, 0xCD,0xF2, 0xCD,0xF2, 0xCD,0xF2,
0xCD,0xF2, 0xCD,0xF2, 0xCD,0xF2, 0xCD,0xF2, 0xCD,0xF2, 0x9C,0x4C, 0xEE,0xF6, 0xAC,0xEF,
0xD6,0x13, 0xD6,0x13, 0xD6,0x13, 0xD6,0x13, 0xD6,0x13, 0xD6,0x13, 0xD6,0x13, 0xD6,0x13,
0xD6,0x13, 0xD6,0x13, 0xD6,0x13, 0xD6,0x13, 0xD6,0x13, 0xD6,0x13, 0xD6,0x13, 0xD6,0x13,
0xD6,0x13, 0xD6,0x13, 0xD6,0x13, 0xD6,0x13, 0xD6,0x13, 0xD6,0x13, 0xD6,0x13, 0xD6,0x13,
0xD6,0x13, 0xD6,0x13, 0xD6,0x13, 0xD6,0x13, 0xD6,0x13, 0xD6,0x13, 0xD6,0x13, 0xD6,0x13,
0xD6,0x13, 0xD6,0x13, 0xD6,0x13, 0xD6,0x13, 0xD6,0x13, 0xD6,0x13, 0xD6,0x13, 0xD6,0x13,
0x9C,0x4C, 0xEE,0xF6, 0xAC,0xEE, 0xD6,0x33, 0xD6,0x33, 0xD6,0x33, 0xD6,0x33, 0xD6,0x33,
0xD6,0x33, 0xD6,0x33, 0xD6,0x33, 0xD6,0x33, 0xD6,0x33, 0xD6,0x33, 0xD6,0x33, 0xD6,0x33,
0xD6,0x33, 0xD6,0x33, 0xD6,0x33, 0xD6,0x33, 0xD6,0x33, 0xD6,0x33, 0xD6,0x33, 0xD6,0x33,
0xD6,0x33, 0xD6,0x33, 0xD6,0x33, 0xD6,0x33, 0xD6,0x33, 0xD6,0x33, 0xD6,0x33, 0xD6,0x33,
0xD6,0x33, 0xD6,0x33, 0xD6,0x33, 0xD6,0x33, 0xD6,0x33, 0xD6,0x33, 0xD6,0x33, 0xD6,0x33,
0xD6,0x33, 0xD6,0x33, 0xD6,0x33, 0xA4,0x8D, 0xDE,0x53, 0xAC,0xEF, 0xD6,0x53, 0xD6,0x53,
0xD6,0x53, 0xD6,0x53, 0xD6,0x53, 0xD6,0x53, 0xD6,0x53, 0xD6,0x53, 0xD6,0x53, 0xD6,0x53,
0xD6,0x53, 0xD6,0x53, 0xD6,0x53, 0xD6,0x53, 0xD6,0x53, 0xD6,0x53, 0xD6,0x53, 0xD6,0x53,
0xD6,0x53, 0xD6,0x53, 0xD6,0x53, 0xD6,0x53, 0xD6,0x53, 0xD6,0x53, 0xD6,0x53, 0xD6,0x53,
0xD6,0x53, 0xD6,0x53, 0xD6,0x53, 0xD6,0x53, 0xD6,0x53, 0xD6,0x53, 0xD6,0x53, 0xD6,0x53,
0xD6,0x53, 0xD6,0x53, 0xD6,0x53, 0xD6,0x53, 0xD6,0x53, 0xD6,0x53, 0xA4,0xAE, 0xDE,0x53,
0xAC,0xEF, 0xDE,0x53, 0xDE,0x53, 0xDE,0x53, 0xDE,0x53, 0xDE,0x53, 0xDE,0x53, 0xDE,0x53,
0xDE,0x53, 0xDE,0x53, 0xDE,0x53, 0xDE,0x53, 0xDE,0x53, 0xDE,0x53, 0xDE,0x53, 0xDE,0x53,
0xDE,0x53, 0xDE,0x53, 0xDE,0x53, 0xDE,0x53, 0xDE,0x53, 0xDE,0x53, 0xDE,0x53, 0xDE,0x53,
0xDE,0x53, 0xDE,0x53, 0xDE,0x53, 0xDE,0x53, 0xDE,0x53, 0xDE,0x53, 0xDE,0x53, 0xDE,0x53,
0xDE,0x53, 0xDE,0x53, 0xDE,0x53, 0xDE,0x53, 0xDE,0x53, 0xDE,0x53, 0xDE,0x53, 0xDE,0x53,
0xDE,0x53, 0xA4,0xAE, 0xDE,0x53, 0xAC,0xEF, 0xDE,0x53, 0xDE,0x53, 0xDE,0x54, 0xDE,0x54,
0xDE,0x53, 0xDE,0x53, 0xD6,0x53, 0xD6,0x53, 0xD6,0x33, 0xD6,0x33, 0xD6,0x33, 0xD6,0x33,
0xD6,0x33, 0xD6,0x33, 0xD6,0x33, 0xD6,0x33, 0xD6,0x33, 0xD6,0x33, 0xD6,0x33, 0xD6,0x33,
0xD6,0x33, 0xD6,0x33, 0xD6,0x33, 0xD6,0x33, 0xD6,0x33, 0xD6,0x33, 0xD6,0x33, 0xD6,0x53,
0xD6,0x53, 0xD6,0x53, 0xD6,0x53, 0xD6,0x53, 0xD6,0x53, 0xD6,0x53, 0xD6,0x53, 0xD6,0x53,
0xD6,0x53, 0xD6,0x53, 0xD6,0x53, 0xD6,0x33, 0xA4,0x8D, 0xDE,0x53, 0xBD,0x4F, 0xDE,0x53,
0xDE,0x53, 0xDE,0x54, 0xDE,0x53, 0xDE,0x53, 0xDE,0x53, 0xDE,0x53, 0xDE,0x53, 0xDE,0x53,
0xDE,0x53, 0xD6,0x53, 0xD6,0x53, 0xD6,0x53, 0xD6,0x53, 0xD6,0x53, 0xD6,0x53, 0xD6,0x53,
0xD6,0x53, 0xD6,0x53, 0xD6,0x53, 0xDE,0x53, 0xD6,0x53, 0xDE,0x53, 0xDE,0x53, 0xDE,0x53,
0xDE,0x53, 0xDE,0x53, 0xDE,0x53, 0xDE,0x53, 0xDE,0x53, 0xDE,0x53, 0xDE,0x53, 0xDE,0x53,
0xDE,0x53, 0xDE,0x53, 0xDE,0x53, 0xDE,0x53, 0xDE,0x53, 0xDE,0x53, 0xDE,0x53, 0x9C,0x6D,
0xDE,0x53, 0xCD,0xD1, 0xE6,0x94, 0xE6,0xB5, 0xE6,0xD6, 0xE6,0xB5, 0xE6,0x95, 0xDE,0x74,
0xDE,0x74, 0xD6,0x33, 0xD6,0x33, 0xD6,0x33, 0xD6,0x13, 0xD6,0x13, 0xCE,0x13, 0xCE,0x13,
0xD6,0x33, 0xCE,0x13, 0xD6,0x33, 0xCE,0x13, 0xCE,0x13, 0xD6,0x13, 0xCE,0x13, 0xD6,0x13,
0xD6,0x13, 0xD6,0x33, 0xCE,0x13, 0xCE,0x13, 0xD6,0x13, 0xCE,0x13, 0xD6,0x13, 0xD6,0x13,
0xD6,0x33, 0xD6,0x33, 0xD6,0x33, 0xD6,0x33, 0xD6,0x53, 0xDE,0x54, 0xDE,0x54, 0xDE,0x54,
0xDE,0x54, 0xD6,0x53, 0xB5,0x2F, 0xDE,0x53,
};

View File

@ -12,12 +12,20 @@
#define SCREENINSET_9341_X (18) #define SCREENINSET_9341_X (18)
#define SCREENINSET_9341_Y (13) #define SCREENINSET_9341_Y (13)
// Spacing and positioning of elements within the DBITMAP, used by AppleUI // drive activity LED positions
#define LED_HEIGHT 9 #define LED_HEIGHT_8875 9
#define LED_WIDTH 17 #define LED_WIDTH_8875 17
#define LED_X 48 #define LED1_X_8875 48
#define LED1_Y 68 #define LED2_X_8875 48
#define LED2_Y 117 #define LED1_Y_8875 68
#define LED2_Y_8875 117
#define LED_HEIGHT_9341 1
#define LED_WIDTH_9341 6
#define LED1_X_9341 125
#define LED2_X_9341 (125+135)
#define LED1_Y_9341 213
#define LED2_Y_9341 213
// These are the ABSTRACTED constants that AppleUI uses to tell the // These are the ABSTRACTED constants that AppleUI uses to tell the
// display what it wants redrawn via drawUIImage(uint8_t imageIdx) // display what it wants redrawn via drawUIImage(uint8_t imageIdx)

View File

@ -5,24 +5,6 @@
#include "font.h" #include "font.h"
const uint16_t loresPixelColors[16] = { 0x0000, // 0 black
0xC006, // 1 magenta
0x0010, // 2 dark blue
0xA1B5, // 3 purple
0x0480, // 4 dark green
0x6B4D, // 5 dark grey
0x1B9F, // 6 med blue
0x0DFD, // 7 light blue
0x92A5, // 8 brown
0xF8C5, // 9 orange
0x9555, // 10 light gray
0xFCF2, // 11 pink
0x07E0, // 12 green
0xFFE0, // 13 yellow
0x87F0, // 14 aqua
0xFFFF // 15 white
};
void PhysicalDisplay::drawCharacter(uint8_t mode, uint16_t x, uint16_t y, char c) void PhysicalDisplay::drawCharacter(uint8_t mode, uint16_t x, uint16_t y, char c)
{ {
int8_t xsize = 8, int8_t xsize = 8,
@ -59,7 +41,7 @@ void PhysicalDisplay::drawCharacter(uint8_t mode, uint16_t x, uint16_t y, char c
if (*ch & (1 << (x_off))) { if (*ch & (1 << (x_off))) {
drawPixel(x+x_off, y+y_off, onPixel); drawPixel(x+x_off, y+y_off, onPixel);
} else { } else {
drawPixel(x+x_off, y+y_off, onPixel); drawPixel(x+x_off, y+y_off, offPixel);
} }
} }
ch++; ch++;
@ -73,13 +55,7 @@ void PhysicalDisplay::drawString(uint8_t mode, uint16_t x, uint16_t y, const cha
for (int8_t i=0; i<strlen(str); i++) { for (int8_t i=0; i<strlen(str); i++) {
drawCharacter(mode, x, y, str[i]); drawCharacter(mode, x, y, str[i]);
x += xsize; x += xsize;
if (x >= (320-xsize)/2) break; // FIXME this is a if (x >= 320-xsize) break; // FIXME needs to know the actual display size?
// pre-scaled number, b/c
// drawCharacter is
// scaling. Klutzy. It's
// also using the ILI
// constant; what about
// the RA8875?
} }
} }

View File

@ -15,6 +15,7 @@ class PhysicalDisplay {
virtual void flush() = 0; virtual void flush() = 0;
virtual void drawUIImage(uint8_t imageIdx) = 0; virtual void drawUIImage(uint8_t imageIdx) = 0;
virtual void drawDriveActivity(bool drive0, bool drive1) = 0;
// FIXME: drawImageOfSizeAt should probably be private now // FIXME: drawImageOfSizeAt should probably be private now
virtual void drawImageOfSizeAt(const uint8_t *img, uint16_t sizex, uint16_t sizey, uint16_t wherex, uint16_t wherey) = 0; virtual void drawImageOfSizeAt(const uint8_t *img, uint16_t sizex, uint16_t sizey, uint16_t wherex, uint16_t wherey) = 0;

View File

@ -44,6 +44,8 @@ SDLDisplay::SDLDisplay()
{ {
memset(videoBuffer, 0, sizeof(videoBuffer)); memset(videoBuffer, 0, sizeof(videoBuffer));
driveIndicator[0] = driveIndicator[1] = true; // assume on so they will redraw the first time
shellImage = NULL; shellImage = NULL;
d1OpenImage = d1ClosedImage = d2OpenImage = d2ClosedImage = NULL; d1OpenImage = d1ClosedImage = d2OpenImage = d2ClosedImage = NULL;
appleImage = NULL; appleImage = NULL;
@ -111,6 +113,30 @@ void SDLDisplay::drawUIImage(uint8_t imageIdx)
} }
} }
void SDLDisplay::drawDriveActivity(bool drive0, bool drive1)
{
if (drive0 != driveIndicator[0]) {
printf("change d0\n");
for (int y=0; y<LED_HEIGHT_8875; y++) {
for (int x=0; x<LED_WIDTH_8875; x++) {
// FIXME this isn't working, not sure why
drawPixel(x+LED1_X_8875, y+LED1_Y_8875, 0xFF, 0, 0); ///*drive0 ?*/ 0xFA00/* : 0x0000*/);
}
}
driveIndicator[0] = drive0;
}
if (drive1 != driveIndicator[1]) {
for (int y=0; y<LED_HEIGHT_8875; y++) {
for (int x=0; x<LED_WIDTH_8875; x++) {
drawPixel(x+LED2_X_8875, y+LED2_Y_8875, drive0 ? 0xFA00 : 0x0000);
}
}
driveIndicator[1] = drive1;
}
}
void SDLDisplay::drawImageOfSizeAt(const uint8_t *img, void SDLDisplay::drawImageOfSizeAt(const uint8_t *img,
uint16_t sizex, uint16_t sizey, uint16_t sizex, uint16_t sizey,
uint16_t wherex, uint16_t wherey) uint16_t wherex, uint16_t wherey)
@ -158,17 +184,13 @@ void SDLDisplay::drawPixel(uint16_t x, uint16_t y, uint16_t color)
g = (color & 0x7E0) >> 3, g = (color & 0x7E0) >> 3,
b = (color & 0x1F) << 3; b = (color & 0x1F) << 3;
for (int yoff=0; yoff<2; yoff++) { putpixel(renderer, x, y, r, g, b);
putpixel(renderer, x, (y*2)+yoff, r, g, b);
}
} }
void SDLDisplay::drawPixel(uint16_t x, uint16_t y, uint8_t r, uint8_t g, uint8_t b) void SDLDisplay::drawPixel(uint16_t x, uint16_t y, uint8_t r, uint8_t g, uint8_t b)
{ {
for (int yoff=0; yoff<2; yoff++) { if (x < SDL_WIDTH && y < SDL_HEIGHT) {
if (x < SDL_WIDTH && y < SDL_HEIGHT) { putpixel(renderer, x, y, r, g, b);
putpixel(renderer, x, (y*2)+yoff, r, g, b);
}
} }
} }

View File

@ -21,6 +21,8 @@ class SDLDisplay : public PhysicalDisplay {
virtual void flush(); virtual void flush();
virtual void drawUIImage(uint8_t imageIdx); virtual void drawUIImage(uint8_t imageIdx);
virtual void drawDriveActivity(bool drive0, bool drive1);
virtual void drawImageOfSizeAt(const uint8_t *img, uint16_t sizex, uint16_t sizey, uint16_t wherex, uint16_t wherey); virtual void drawImageOfSizeAt(const uint8_t *img, uint16_t sizex, uint16_t sizey, uint16_t wherex, uint16_t wherey);
virtual void drawPixel(uint16_t x, uint16_t y, uint16_t color); virtual void drawPixel(uint16_t x, uint16_t y, uint16_t color);
@ -52,6 +54,8 @@ class SDLDisplay : public PhysicalDisplay {
uint8_t *d2ClosedImage; uint8_t *d2ClosedImage;
uint8_t *appleImage; uint8_t *appleImage;
uint16_t appleImageWidth, appleImageHeight; uint16_t appleImageWidth, appleImageHeight;
bool driveIndicator[2];
}; };
#endif #endif

View File

@ -36,6 +36,7 @@ void ILI9341_Wrap::begin(uint32_t spi_clock=30000000u, uint32_t spi_clock_read=2
void ILI9341_Wrap::fillWindow(uint16_t color = 0x0000) void ILI9341_Wrap::fillWindow(uint16_t color = 0x0000)
{ {
tft->fillScreen(color);
} }
void ILI9341_Wrap::setFrameBuffer(uint8_t *frame_buffer) void ILI9341_Wrap::setFrameBuffer(uint8_t *frame_buffer)
@ -60,18 +61,19 @@ bool ILI9341_Wrap::updateScreenAsync(bool update_cont)
void ILI9341_Wrap::drawPixel(int16_t x, int16_t y, uint16_t color) void ILI9341_Wrap::drawPixel(int16_t x, int16_t y, uint16_t color)
{ {
if (x>=320 || y>=240)
return;
frame_buffer[y*ILI9341_WIDTH+x] = color; frame_buffer[y*ILI9341_WIDTH+x] = color;
} }
void ILI9341_Wrap::drawPixel(int16_t x, int16_t y, uint8_t color)
{
frame_buffer[y*ILI9341_WIDTH+x] = _332To565(color);
}
// The 9341 is half the width we need, so this jumps through hoops to // The 9341 is half the width we need, so this jumps through hoops to
// reduce the resolution in a way that's reasonable by blending pixels // reduce the resolution in a way that's reasonable by blending pixels
void ILI9341_Wrap::cacheApplePixel(uint16_t x, uint16_t y, uint16_t color) void ILI9341_Wrap::cacheApplePixel(uint16_t x, uint16_t y, uint16_t color)
{ {
if (x>=560 || y>=192)
return;
if (x&1) { if (x&1) {
uint16_t origColor =frame_buffer[(y+SCREENINSET_9341_Y)*ILI9341_WIDTH+(x>>1)+SCREENINSET_9341_X]; uint16_t origColor =frame_buffer[(y+SCREENINSET_9341_Y)*ILI9341_WIDTH+(x>>1)+SCREENINSET_9341_X];
if (g_displayType == m_blackAndWhite) { if (g_displayType == m_blackAndWhite) {
@ -98,6 +100,9 @@ void ILI9341_Wrap::cacheApplePixel(uint16_t x, uint16_t y, uint16_t color)
void ILI9341_Wrap::cacheDoubleWideApplePixel(uint16_t x, uint16_t y, uint16_t color16) void ILI9341_Wrap::cacheDoubleWideApplePixel(uint16_t x, uint16_t y, uint16_t color16)
{ {
if (x>=280 || y>=192)
return;
frame_buffer[(y+SCREENINSET_9341_Y)*ILI9341_WIDTH + (x) + SCREENINSET_9341_X] = color16; frame_buffer[(y+SCREENINSET_9341_Y)*ILI9341_WIDTH + (x) + SCREENINSET_9341_X] = color16;
} }

View File

@ -27,7 +27,6 @@ class ILI9341_Wrap : public BaseDisplay {
virtual bool updateScreenAsync(bool update_cont = false); virtual bool updateScreenAsync(bool update_cont = false);
virtual void drawPixel(int16_t x, int16_t y, uint16_t color); virtual void drawPixel(int16_t x, int16_t y, uint16_t color);
virtual void drawPixel(int16_t x, int16_t y, uint8_t color);
virtual void cacheApplePixel(uint16_t x, uint16_t y, uint16_t color); virtual void cacheApplePixel(uint16_t x, uint16_t y, uint16_t color);
virtual void ILI9341_Wrap::cacheDoubleWideApplePixel(uint16_t x, uint16_t y, uint16_t color16); virtual void ILI9341_Wrap::cacheDoubleWideApplePixel(uint16_t x, uint16_t y, uint16_t color16);

View File

@ -87,6 +87,10 @@
* https://github-wiki-see.page/m/TeensyUser/doc/wiki/Memory-Mapping * https://github-wiki-see.page/m/TeensyUser/doc/wiki/Memory-Mapping
*/ */
// Static DMA objects that we need in RAM1
DMASetting _dmasettings[12];
DMAChannel _dmatx;
// at 8bpp, each pixel is 1 byte // at 8bpp, each pixel is 1 byte
#define COUNT_PIXELS_WRITE (RA8875_WIDTH * RA8875_HEIGHT) #define COUNT_PIXELS_WRITE (RA8875_WIDTH * RA8875_HEIGHT)
@ -94,6 +98,7 @@
#define _565toR(c) ( ((c) & 0xF800) >> 8 ) #define _565toR(c) ( ((c) & 0xF800) >> 8 )
#define _565toG(c) ( ((c) & 0x07E0) >> 3 ) #define _565toG(c) ( ((c) & 0x07E0) >> 3 )
#define _565toB(c) ( ((c) & 0x001F) << 3 ) #define _565toB(c) ( ((c) & 0x001F) << 3 )
#define _565To332(c) ((((c) & 0xe000) >> 8) | (((c) & 0x700) >> 6) | (((c) & 0x18) >> 3))
// 3 of these, one for each of the 3 busses, so that 3 separate // 3 of these, one for each of the 3 busses, so that 3 separate
// displays could be driven. FIXME: I don't really need all 3 in this // displays could be driven. FIXME: I don't really need all 3 in this
@ -282,6 +287,8 @@ void RA8875_t4::_initializeTFT()
void RA8875_t4::setFrameBuffer(uint8_t *frame_buffer) void RA8875_t4::setFrameBuffer(uint8_t *frame_buffer)
{ {
Serial.print("fb 0x");
Serial.println((uint32_t)frame_buffer, HEX);
_pfbtft = frame_buffer; _pfbtft = frame_buffer;
_dma_state &= ~RA8875_DMA_INIT; _dma_state &= ~RA8875_DMA_INIT;
} }
@ -382,35 +389,46 @@ bool RA8875_t4::updateScreenAsync(bool update_cont)
_dma_state &= ~RA8875_DMA_CONT; _dma_state &= ~RA8875_DMA_CONT;
} }
_dma_state |= RA8875_DMA_ACTIVE; _dma_state |= RA8875_DMA_ACTIVE;
// Make sure the dma settings are flushed. Otherwise bad things happen.
if ((uint32_t)_dmasettings >= 0x20200000u)
arm_dcache_flush(_dmasettings, sizeof(DMASetting)*12); // FIXME constant
return true; return true;
} }
void RA8875_t4::fillWindow(uint16_t color) void RA8875_t4::fillWindow(uint16_t color)
{ {
// FIXME: reduce color & fill appropriately if (!_pfbtft)
memset(_pfbtft, RA8875_WIDTH*RA8875_HEIGHT, 0); return;
// Reduce color to 8 bit
uint8_t c8 = _565To332(color);
memset(_pfbtft, c8, RA8875_WIDTH*RA8875_HEIGHT);
} }
// *** Remove this and convert to native 8-bit? Or make it inline?
uint8_t _color16To8bpp(uint16_t color) {
return ((color & 0xe000) >> 8) | ((color & 0x700) >> 6) | ((color & 0x18) >> 3);
}
void RA8875_t4::drawPixel(int16_t x, int16_t y, uint16_t color) void RA8875_t4::drawPixel(int16_t x, int16_t y, uint16_t color)
{ {
// FIXME: bounds checking if (x>=800 || y>=480) {
_pfbtft[y*RA8875_WIDTH+x] = _color16To8bpp(color); Serial.print("^ ");
} Serial.print(x);
Serial.print(" ");
void RA8875_t4::drawPixel(int16_t x, int16_t y, uint8_t color) Serial.println(y);
{ return;
// FIXME: bounds checking }
_pfbtft[y*RA8875_WIDTH+x] = color;
_pfbtft[y*RA8875_WIDTH+x] = _565To332(color);
} }
void RA8875_t4::cacheApplePixel(uint16_t x, uint16_t y, uint16_t color) void RA8875_t4::cacheApplePixel(uint16_t x, uint16_t y, uint16_t color)
{ {
if (x>=560 || y>=192) {
Serial.print("! ");
Serial.print(x);
Serial.print(" ");
Serial.println(y);
return;
}
// The 8875 display doubles vertically // The 8875 display doubles vertically
uint c8 = _565To332(color); uint c8 = _565To332(color);
for (int yoff=0; yoff<2; yoff++) { for (int yoff=0; yoff<2; yoff++) {
@ -420,6 +438,11 @@ void RA8875_t4::cacheApplePixel(uint16_t x, uint16_t y, uint16_t color)
void RA8875_t4::cacheDoubleWideApplePixel(uint16_t x, uint16_t y, uint16_t color16) void RA8875_t4::cacheDoubleWideApplePixel(uint16_t x, uint16_t y, uint16_t color16)
{ {
if (x>=280 || y>=192) {
Serial.println("@");
return;
}
// The RA8875 doubles Apple's pixels. // The RA8875 doubles Apple's pixels.
for (int yoff=0; yoff<2; yoff++) { for (int yoff=0; yoff<2; yoff++) {
for (int xoff=0; xoff<2; xoff++) { for (int xoff=0; xoff<2; xoff++) {

View File

@ -37,7 +37,6 @@ class RA8875_t4 : public BaseDisplay {
virtual bool updateScreenAsync(bool update_cont = false); virtual bool updateScreenAsync(bool update_cont = false);
virtual void drawPixel(int16_t x, int16_t y, uint16_t color); virtual void drawPixel(int16_t x, int16_t y, uint16_t color);
virtual void drawPixel(int16_t x, int16_t y, uint8_t color);
virtual void cacheApplePixel(uint16_t x, uint16_t y, uint16_t color16); virtual void cacheApplePixel(uint16_t x, uint16_t y, uint16_t color16);
virtual void cacheDoubleWideApplePixel(uint16_t x, uint16_t y, uint16_t color16); virtual void cacheDoubleWideApplePixel(uint16_t x, uint16_t y, uint16_t color16);
@ -81,9 +80,13 @@ private:
uint32_t _spi_clock_read; uint32_t _spi_clock_read;
uint32_t _clock; // current clock, used in starting transactions (b/c we have to slow down sometimes) uint32_t _clock; // current clock, used in starting transactions (b/c we have to slow down sometimes)
// DMA stuff // DMA stuff. The _dmasettings[] and _dmatx can't be member
DMASetting _dmasettings[12]; // variables. If they are, then the object will work if it's
DMAChannel _dmatx; // statically allocated; but dynamically allocated RA8875_t4 objects
// would be malloc()'d in RAM2, which is a problem for DMA.
// So instead they're static globals in the module.
// DMASetting _dmasettings[12];
// DMAChannel _dmatx;
uint32_t _spi_fcr_save; uint32_t _spi_fcr_save;
uint8_t *_pfbtft; uint8_t *_pfbtft;
volatile uint8_t _dma_state; volatile uint8_t _dma_state;

View File

@ -1,8 +1,6 @@
#ifndef __BASE_DISPLAY_H #ifndef __BASE_DISPLAY_H
#define __BASE_DISPLAY_H #define __BASE_DISPLAY_H
const uint16_t loresPixelColors[16];
#define RGBto565(r,g,b) ((((r) & 0xF8) << 8) | (((g) & 0xFC) << 3) | ((b) >> 3)) #define RGBto565(r,g,b) ((((r) & 0xF8) << 8) | (((g) & 0xFC) << 3) | ((b) >> 3))
#define _565toR(c) ( ((c) & 0xF800) >> 8 ) #define _565toR(c) ( ((c) & 0xF800) >> 8 )
#define _565toG(c) ( ((c) & 0x07E0) >> 3 ) #define _565toG(c) ( ((c) & 0x07E0) >> 3 )
@ -30,7 +28,6 @@ class BaseDisplay {
virtual bool updateScreenAsync(bool update_cont = false) = 0; virtual bool updateScreenAsync(bool update_cont = false) = 0;
virtual void drawPixel(int16_t x, int16_t y, uint16_t color) = 0; virtual void drawPixel(int16_t x, int16_t y, uint16_t color) = 0;
virtual void drawPixel(int16_t x, int16_t y, uint8_t color) = 0;
// Apple interface methods // Apple interface methods
virtual void cacheApplePixel(uint16_t x, uint16_t y, uint16_t color) = 0; virtual void cacheApplePixel(uint16_t x, uint16_t y, uint16_t color) = 0;

View File

@ -25,24 +25,46 @@ uint16_t *dmaBuffer16 = NULL;
#define PIN_MISO 1 #define PIN_MISO 1
#define PIN_SCK 27 #define PIN_SCK 27
const uint16_t loresPixelColors[16] = { 0x0000, // 0 black
0xC006, // 1 magenta
0x0010, // 2 dark blue
0xA1B5, // 3 purple
0x0480, // 4 dark green
0x6B4D, // 5 dark grey
0x1B9F, // 6 med blue
0x0DFD, // 7 light blue
0x92A5, // 8 brown
0xF8C5, // 9 orange
0x9555, // 10 light gray
0xFCF2, // 11 pink
0x07E0, // 12 green
0xFFE0, // 13 yellow
0x87F0, // 14 aqua
0xFFFF // 15 white
};
TeensyDisplay::TeensyDisplay() TeensyDisplay::TeensyDisplay()
{ {
driveIndicator[0] = driveIndicator[1] = false; driveIndicator[0] = driveIndicator[1] = true; // assume on so they will redraw immediately the first time
driveIndicatorDirty = true;
shellImage = NULL; shellImage = NULL;
d1OpenImage = d1ClosedImage = d2OpenImage = d2ClosedImage = NULL; d1OpenImage = d1ClosedImage = d2OpenImage = d2ClosedImage = NULL;
appleImage = NULL; appleImage = NULL;
// FIXME abstract pin number, don't hard code it // FIXME abstract pin number, don't hard code it
pinMode(11, INPUT); pinMode(11, INPUT_PULLUP);
digitalWrite(11, HIGH); // turn on pull-up delay(10); // let it rise before reading it
if (digitalRead(11)) { if (digitalRead(11)) {
// Default: use older, smaller but faster, ILI display if pin 11 is not connected to ground // Default: use older, smaller but faster, ILI display if pin 11 is not connected to ground
Serial.println(" using ILI9341 display"); Serial.println(" using ILI9341 display");
use8875 = false;
dmaBuffer16 = (uint16_t *)malloc((320*240)*2+32); // malloc() happens in the DMAMEM area (RAM2) FIXME *** CONSTANTS -- and does the +32 align properly? dmaBuffer16 = (uint16_t *)malloc((320*240)*2+32); // malloc() happens in the DMAMEM area (RAM2)
// And we have to be sure dmaBuffer16 is 32-byte aligned for DMA purposes
// so we intentionally alloc'd an extra 32 bytes in order to shift here
dmaBuffer16 = (uint16_t *)(((uintptr_t)dmaBuffer16 + 32) &
~((uintptr_t)(31)));
tft = new ILI9341_Wrap(PIN_CS, PIN_RST, PIN_MOSI, PIN_SCK, PIN_MISO, PIN_DC); tft = new ILI9341_Wrap(PIN_CS, PIN_RST, PIN_MOSI, PIN_SCK, PIN_MISO, PIN_DC);
@ -59,9 +81,14 @@ TeensyDisplay::TeensyDisplay()
} else { } else {
// If someone grounded pin 11, then use the new RA8875 display // If someone grounded pin 11, then use the new RA8875 display
Serial.println(" using RA8875 display"); Serial.println(" using RA8875 display");
use8875 = true;
dmaBuffer = (uint8_t *)malloc(800*480+32); // malloc() happens in the DMAMEM area (RAM2) FIXME *** CONSTANTS -- and does the +32 align properly? dmaBuffer = (uint8_t *)malloc(800*480+32); // malloc() happens in the DMAMEM area (RAM2)
// And we have to be sure dmaBuffer is 32-byte aligned for DMA purposes
// so we intentionally alloc'd an extra 32 bytes in order to shift here
dmaBuffer = (uint8_t *)(((uintptr_t)dmaBuffer + 32) &
~((uintptr_t)(31)));
tft = new RA8875_t4(PIN_CS, PIN_RST, PIN_MOSI, PIN_SCK, PIN_MISO); tft = new RA8875_t4(PIN_CS, PIN_RST, PIN_MOSI, PIN_SCK, PIN_MISO);
// Load the 8875 images // Load the 8875 images
@ -79,16 +106,17 @@ TeensyDisplay::TeensyDisplay()
tft->setFrameBuffer((uint8_t *)dmaBuffer); tft->setFrameBuffer((uint8_t *)dmaBuffer);
} }
Serial.print("before ");
Serial.println((uint32_t)tft);
Serial.print("after ");
Serial.println((uint32_t)tft);
tft->fillWindow(); tft->fillWindow();
Serial.println("finished filling");
} }
TeensyDisplay::~TeensyDisplay() TeensyDisplay::~TeensyDisplay()
{ {
/* FIXME: we mucked with these after alloc to align them, so we can't free them from their offset addresses; need to keep track of the original malloc'd address instead
if (dmaBuffer)
free(dmaBuffer);
if (dmaBuffer16)
free(dmaBuffer16);
*/
} }
// Take one of the abstracted image constants, figure out which one it // Take one of the abstracted image constants, figure out which one it
@ -102,16 +130,24 @@ void TeensyDisplay::drawUIImage(uint8_t imageIdx)
drawImageOfSizeAt(shellImage, shellWidth, shellHeight, 0, 0); drawImageOfSizeAt(shellImage, shellWidth, shellHeight, 0, 0);
break; break;
case IMG_D1OPEN: case IMG_D1OPEN:
drawImageOfSizeAt(d1OpenImage, driveWidth, driveHeight, 55, 216); drawImageOfSizeAt(d1OpenImage, driveWidth, driveHeight,
use8875 ? 4 : 55,
use8875 ? 67 : 216);
break; break;
case IMG_D1CLOSED: case IMG_D1CLOSED:
drawImageOfSizeAt(d1ClosedImage, driveWidth, driveHeight, 55, 216); drawImageOfSizeAt(d1ClosedImage, driveWidth, driveHeight,
use8875 ? 4 : 55,
use8875 ? 67 : 216);
break; break;
case IMG_D2OPEN: case IMG_D2OPEN:
drawImageOfSizeAt(d2OpenImage, driveWidth, driveHeight, 189, 216); drawImageOfSizeAt(d2OpenImage, driveWidth, driveHeight,
use8875 ? 4 : 189,
use8875 ? 116 : 216);
break; break;
case IMG_D2CLOSED: case IMG_D2CLOSED:
drawImageOfSizeAt(d2ClosedImage, driveWidth, driveHeight, 189, 216); drawImageOfSizeAt(d2ClosedImage, driveWidth, driveHeight,
use8875 ? 4 : 189,
use8875 ? 116 : 216);
break; break;
case IMG_APPLEBATTERY: case IMG_APPLEBATTERY:
// FIXME *** // FIXME ***
@ -119,13 +155,36 @@ void TeensyDisplay::drawUIImage(uint8_t imageIdx)
} }
} }
void TeensyDisplay::drawDriveActivity(bool drive0, bool drive1)
{
// FIXME this could be much more efficient; it's doing a lot of checking use8875 in the middle of a loop
if (drive0 != driveIndicator[0]) {
for (int y=0; y<(use8875 ? LED_HEIGHT_8875 : LED_HEIGHT_9341); y++) {
for (int x=0; x<(use8875 ? LED_WIDTH_8875 : LED_WIDTH_9341); x++) {
drawPixel(x+(use8875 ? LED1_X_8875 : LED1_X_9341), y+(use8875 ? LED1_Y_8875 : LED1_Y_9341), drive0 ? 0xFA00 : 0x0000);
}
}
driveIndicator[0] = drive0;
}
if (drive1 != driveIndicator[1]) {
for (int y=0; y<(use8875 ? LED_HEIGHT_8875 : LED_HEIGHT_9341); y++) {
for (int x=0; x<(use8875 ? LED_WIDTH_8875 : LED_WIDTH_9341); x++) {
drawPixel(x+(use8875 ? LED2_X_8875 : LED2_X_9341), y+(use8875 ? LED2_Y_8875 : LED2_Y_9341), drive0 ? 0xFA00 : 0x0000);
}
}
driveIndicator[1] = drive1;
}
}
// *** this probably needs to be private now FIXME // *** this probably needs to be private now FIXME
void TeensyDisplay::drawImageOfSizeAt(const uint8_t *img, void TeensyDisplay::drawImageOfSizeAt(const uint8_t *img,
uint16_t sizex, uint16_t sizey, uint16_t sizex, uint16_t sizey,
uint16_t wherex, uint16_t wherey) uint16_t wherex, uint16_t wherey)
{ {
uint8_t r, g, b; uint8_t r, g, b;
uint8_t *p = img; uint8_t *p = img;
for (uint16_t y=0; y<sizey; y++) { for (uint16_t y=0; y<sizey; y++) {
for (uint16_t x=0; x<sizex; x++) { for (uint16_t x=0; x<sizex; x++) {
@ -153,7 +212,11 @@ void TeensyDisplay::blit()
static uint32_t nextMessageTime = 0; static uint32_t nextMessageTime = 0;
if (millis() >= nextMessageTime) { if (millis() >= nextMessageTime) {
if (overlayMessage[0]) { if (overlayMessage[0]) {
drawString(M_SELECTDISABLED, 1, (RA8875_HEIGHT - 18)/2, overlayMessage); // FIXME this /2 is clunky b/c drawString winds up doubling if (use8875) {
drawString(M_SELECTDISABLED, 1, RA8875_HEIGHT-18, overlayMessage);
} else {
drawString(M_SELECTDISABLED, 1, ILI9341_HEIGHT - (16+12), overlayMessage);
}
} }
nextMessageTime = millis() + 1000; nextMessageTime = millis() + 1000;
} }
@ -183,11 +246,6 @@ void TeensyDisplay::cachePixel(uint16_t x, uint16_t y, uint8_t color)
tft->cacheApplePixel(x,y,loresPixelColors[color]); tft->cacheApplePixel(x,y,loresPixelColors[color]);
} }
void TeensyDisplay::cacheDoubleWidePixel(uint16_t x, uint16_t y, uint16_t color16)
{
tft->cacheDoubleWideApplePixel(x, y, color16);
}
// "DoubleWide" means "please double the X because I'm in low-res // "DoubleWide" means "please double the X because I'm in low-res
// width mode". // width mode".
void TeensyDisplay::cacheDoubleWidePixel(uint16_t x, uint16_t y, uint8_t color) void TeensyDisplay::cacheDoubleWidePixel(uint16_t x, uint16_t y, uint8_t color)

View File

@ -22,9 +22,10 @@ class TeensyDisplay : public PhysicalDisplay {
virtual void clrScr(uint8_t coloridx); virtual void clrScr(uint8_t coloridx);
virtual void drawUIImage(uint8_t imageIdx); virtual void drawUIImage(uint8_t imageIdx);
virtual void drawDriveActivity(bool drive0, bool drive1);
virtual void drawImageOfSizeAt(const uint8_t *img, uint16_t sizex, uint16_t sizey, uint16_t wherex, uint16_t wherey); virtual void drawImageOfSizeAt(const uint8_t *img, uint16_t sizex, uint16_t sizey, uint16_t wherex, uint16_t wherey);
void cacheDoubleWidePixel(uint16_t x, uint16_t y, uint16_t color16);
virtual void cacheDoubleWidePixel(uint16_t x, uint16_t y, uint8_t color); virtual void cacheDoubleWidePixel(uint16_t x, uint16_t y, uint8_t color);
virtual void cachePixel(uint16_t x, uint16_t y, uint8_t color); virtual void cachePixel(uint16_t x, uint16_t y, uint8_t color);
@ -33,9 +34,7 @@ class TeensyDisplay : public PhysicalDisplay {
virtual void drawPixel(uint16_t x, uint16_t y, uint16_t color); virtual void drawPixel(uint16_t x, uint16_t y, uint16_t color);
virtual void drawPixel(uint16_t x, uint16_t y, uint8_t r, uint8_t g, uint8_t b); virtual void drawPixel(uint16_t x, uint16_t y, uint8_t r, uint8_t g, uint8_t b);
bool needsRedraw;
bool driveIndicator[2]; bool driveIndicator[2];
bool driveIndicatorDirty;
private: private:
const uint8_t *shellImage; const uint8_t *shellImage;
@ -48,6 +47,8 @@ private:
const uint8_t *appleImage; const uint8_t *appleImage;
const uint16_t appleImageWidth, appleImageHeight; const uint16_t appleImageWidth, appleImageHeight;
bool use8875;
BaseDisplay *tft; BaseDisplay *tft;
}; };

View File

@ -358,6 +358,7 @@ void runDisplay(uint32_t now)
} }
if (!g_biosInterrupt) { if (!g_biosInterrupt) {
// FIXME this needs some love. It could be efficient, but parts are removed, so it's doing duplicative work.
g_ui->blit(); g_ui->blit();
g_vm->vmdisplay->lockDisplay(); g_vm->vmdisplay->lockDisplay();
if (g_vm->vmdisplay->needsRedraw()) { // necessary for the VM to redraw if (g_vm->vmdisplay->needsRedraw()) { // necessary for the VM to redraw