From 2aabf26145fd7e7e25dad6f73daef69216a4d252 Mon Sep 17 00:00:00 2001 From: IanSB Date: Wed, 18 Dec 2019 16:36:31 +0000 Subject: [PATCH] Add support for TI-994a --- src/osd.c | 125 +++++++++++++++--- src/osd.h | 1 + .../cpld_firmware/6bit/YUV_CPLD_v32.xsvf | Bin 0 -> 53289 bytes 3 files changed, 111 insertions(+), 15 deletions(-) create mode 100644 src/scripts/cpld_firmware/6bit/YUV_CPLD_v32.xsvf diff --git a/src/osd.c b/src/osd.c index 6990c1f6..478b9da3 100644 --- a/src/osd.c +++ b/src/osd.c @@ -93,6 +93,7 @@ static const char *palette_names[] = { "Atom 6847 Emulators", "Mono (4 level)", "Mono (6 level)", + "TI-99/4a", "Just Red", "Just Green", "Just Blue", @@ -1350,7 +1351,7 @@ void osd_update_palette() { int b = (i & 4) ? 255 : 0; int i6847 = i; - if((((cpld->get_version() >> VERSION_DESIGN_BIT) & 0x0F) == DESIGN_RGB_ANALOG) && palette >= PALETTE_ATOM_MKI && palette <= PALETTE_ATOM_6847_EMULATORS) { + if((((cpld->get_version() >> VERSION_DESIGN_BIT) & 0x0F) != DESIGN_ATOM) && palette >= PALETTE_ATOM_MKI && palette <= PALETTE_ATOM_6847_EMULATORS) { //some 6847 YUV to RGB conversions based on Atom VHDL int AH = 0; @@ -1360,17 +1361,30 @@ void osd_update_palette() { int LH = 0; int LL = 0; - if ((i & 0x09) == 0x09) AH = 1; - if ((i & 0x09) == 0x00) AL = 1; - if ((i & 0x24) == 0x24) BH = 1; - if ((i & 0x24) == 0x00) BL = 1; - if ((i & 0x12) == 0x12) LH = 1; - if ((i & 0x12) != 0x00) LL = 1; + if (((cpld->get_version() >> VERSION_DESIGN_BIT) & 0x0F) == DESIGN_YUV) { + + if ((i & 0x01) == 0x01) AH = 1; + if ((i & 0x08) == 0x08) AL = 1; + if ((i & 0x04) == 0x04) BH = 1; + if ((i & 0x20) == 0x20) BL = 1; + if ((i & 0x02) == 0x02) LH = 1; + if ((i & 0x10) == 0x10) LL = 1; + + } else { + + if ((i & 0x09) == 0x09) AH = 1; + if ((i & 0x09) == 0x00) AL = 1; + if ((i & 0x24) == 0x24) BH = 1; + if ((i & 0x24) == 0x00) BL = 1; + if ((i & 0x12) == 0x12) LH = 1; + if ((i & 0x12) != 0x00) LL = 1; + + if (get_feature(F_INVERT)) { + int temp = ~LH & 1; + LH = ~LL & 1; + LL = temp; + } - if (get_feature(F_INVERT)) { // required for inverted Y when connected directly to a 6847 - int temp = ~LH & 1; - LH = ~LL & 1; - LL = temp; } int R = (~AL & ~AH & BL & ~BH) | (~AL & AH & ~BL & ~BH) | (~AL & AH & ~BL & BH) | (~AL & ~AH & ~BL & ~BH & LL) | (~AL & AH & BL & ~BH & LH) | (~AL & AH & BL & ~BH & LH) | (~AL & AH & BL & ~BH & ~LL); @@ -1380,7 +1394,6 @@ void osd_update_palette() { int temp6847 = (R & 1) | ((G & 1) << 1) | ((B & 1) << 2); - if((X & 1) != 0) { switch(temp6847) { case 0: @@ -1407,11 +1420,8 @@ void osd_update_palette() { r = (i6847 & 1) ? 255 : 0; g = (i6847 & 2) ? 255 : 0; b = (i6847 & 4) ? 255 : 0; - } - - if (paletteFlags & BIT_MODE2_PALETTE) { r = customPalette[i & 0x7f] & 0xff; @@ -1724,6 +1734,91 @@ void osd_update_palette() { } r = m; g = m; b = m; break; + + case PALETTE_TI: + r=g=b=0; + #define bp 0x24 + #define bz 0x20 + #define bm 0x00 + #define rp 0x09 + #define rz 0x08 + #define rm 0x00 + + int bits = i; + if (((cpld->get_version() >> VERSION_DESIGN_BIT) & 0x0F) == DESIGN_YUV) { + bits ^= 0x28; //AL and BL inverted in YUV cpld + } + switch (bits & 0x12) { //4 luminance levels + case 0x00: // if here then either black/dk blue/dk red/dk green + { + switch (bits & 0x2d) { + case (bz+rz): + r = 0x00;g=0x00;b=0x00; + break; + case (bp+rz): + r = 0x5b;g=0x56;b=0xd7; + break; + case (bm+rp): + r = 0xb5;g=0x60;b=0x54; + break; + case (bm+rm): + r = 0x3f;g=0x9f;b=0x45; + break; + } + } + break ; + case 0x10: // if here then either md green/lt blue/md red/magenta + { + switch (bits & 0x2d) { + case (bm+rm): + r = 0x44;g=0xb5;b=0x4e; + break; + case (bp+rz): + r = 0x81;g=0x78;b=0xea; + break; + case (bm+rp): + r = 0xd5;g=0x68;b=0x5d; + break; + case (bp+rp): + r = 0xb4;g=0x69;b=0xb2; + break; + } + } + break ; + case 0x02: // if here then either lt green/lt red/cyan/dk yellow + { + switch (bits & 0x2d) { + case (bm+rm): + r = 0x79;g=0xce;b=0x70; //?? + break; + case (bm+rp): + r = 0xf9;g=0x8c;b=0x81; + break; + case (bp+rm): + r = 0x6c;g=0xda;b=0xec; + break; + case (bm+rz): + r = 0xcc;g=0xc3;b=0x66; + break; + } + } + break; + case 0x12: //if here then either lt yellow/gray/white (can't tell grey from white) + { + switch (bits & 0x2d) { + case (bm+rz): + r = 0xde;g=0xd1;b=0x8d; + break; + case (bz+rz): + r = 0xff;g=0xff;b=0xff; + break; + } + } + break ; + } + break; + + case PALETTE_RED: m = (i & 7) * 255 / 7; r = m; g = 0; b = 0; diff --git a/src/osd.h b/src/osd.h index d65ae5d9..212c5037 100644 --- a/src/osd.h +++ b/src/osd.h @@ -40,6 +40,7 @@ enum { PALETTE_ATOM_6847_EMULATORS, PALETTE_MONO1, PALETTE_MONO2, + PALETTE_TI, PALETTE_RED, PALETTE_GREEN, PALETTE_BLUE, diff --git a/src/scripts/cpld_firmware/6bit/YUV_CPLD_v32.xsvf b/src/scripts/cpld_firmware/6bit/YUV_CPLD_v32.xsvf new file mode 100644 index 0000000000000000000000000000000000000000..667481db5e1ca6022e4e8e1fc13977ec77542364 GIT binary patch literal 53289 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 BRe1ma literal 0 HcmV?d00001