MCUME/MCUME_teensy41/teensyaiie/plf-display.cpp

113 wiersze
3.0 KiB
C++

#include "plf-display.h"
extern "C" {
#include "emuapi.h"
#include "platform_config.h"
}
#include <Arduino.h>
#include "bios-font.h"
typedef uint16_t Pixel;
#define RGBVAL(r,g,b) RGBVAL16(r,g,b)
#include "globals.h"
#include "applevm.h"
#define BLACK RGBVAL(0,0,0) //0x0000 // 0 black
#define MAGENTA RGBVAL(192,0,48) //0xC006 // 1 magenta
#define DARK_BLUE RGBVAL(0,0,128) //0x0010 // 2 dark blue
#define PURPLE RGBVAL(160,52,168) //0xA1B5 // 3 purple
#define DARK_GREEN RGBVAL(0,144,0) //0x0480 // 4 dark green
#define DARK_GREY RGBVAL(104,104,104) //0x6B4D // 5 dark grey
#define BLUE RGBVAL(24,112,248) //0x1B9F // 6 med blue
#define LIGHT_BLUE RGBVAL(8,188,232) //0x0DFD // 7 light blue
#define BROWN RGBVAL(144,84,40) //0x92A5 // 8 brown
#define ORANGE RGBVAL(248,24,40) //0xF8C5 // 9 orange
#define LIGHT_GREY RGBVAL(144,168,168) //0x9555 // 10 light gray
#define PINK RGBVAL(248,156,144) //0xFCF2 // 11 pink
#define GREEN RGBVAL(0,252,0) //0x07E0 // 12 green
#define YELLOW RGBVAL(248,252,0) //0xFFE0 // 13 yellow
#define AQUA RGBVAL(128,252,128) //0x87F0 // 14 aqua
#define WHITE RGBVAL(248,252,248) //0xFFFF // 15 white
// RGB map of each of the lowres colors
const Pixel loresPixelColors[16] = {
BLACK, // 0 black
MAGENTA, // 1 magenta
DARK_BLUE, // 2 dark blue
PURPLE, // 3 purple
DARK_GREEN, // 4 dark green
DARK_GREY, // 5 dark grey
BLUE, // 6 med blue
LIGHT_BLUE, // 7 light blue
BROWN, // 8 brown
ORANGE, // 9 orange
LIGHT_GREY, // 10 light gray
PINK, // 11 pink
GREEN, // 12 green
YELLOW, // 13 yellow
AQUA, // 14 aqua
WHITE // 15 white
};
Pixel backgroundColor;
PlfDisplay::PlfDisplay()
{
/*
for (int i = 0; i<16; i++) {
uint16_t val = loresPixelColors[i];
uint16_t r = ((val >> (6+5))&0x1f)<<3;
uint16_t g = ((val >> (5))&0x3f)<<2;
uint16_t b = ((val)&0x1f)<<3;
printf("c %i RGBVAL(%u,%u,%u)\n", i,r,g,b);
}
*/
backgroundColor = DARK_BLUE;
}
PlfDisplay::~PlfDisplay()
{
}
void PlfDisplay::redraw()
{
}
static Pixel linebuffer[DISPLAYWIDTH];
void PlfDisplay::blit(AiieRect r)
{
uint8_t *videoBuffer = g_vm->videoBuffer; // FIXME: poking deep
uint16_t pixel;
for (uint8_t y=r.top; y<=r.bottom; y++) {
Pixel * scrlinept = &linebuffer[0]; // (Pixel *)emu_LineBuffer(y);
scrlinept += (DISPLAYWIDTH - (r.right - r.left))/2;
for (uint16_t x=r.left; x<=r.right; x++) {
pixel = y * (DISPLAYRUN >> 1) + (x >> 1);
uint8_t colorIdx;
if (!(x & 0x01)) {
colorIdx = videoBuffer[pixel] >> 4;
} else {
colorIdx = videoBuffer[pixel] & 0x0F;
}
scrlinept[x] = loresPixelColors[colorIdx];
}
emu_DrawLine16(&linebuffer[0], DISPLAYWIDTH, 200 /*DISPLAYHEIGHT*/, y);
}
}
void PlfDisplay::drawDriveDoor(uint8_t which, bool isOpen)
{
}
void PlfDisplay::setDriveIndicator(uint8_t which, bool isRunning)
{
}
void PlfDisplay::drawBatteryStatus(uint8_t percent)
{
}