From aed3be3b804bde100ed82d59bb24ec6d8f600baa Mon Sep 17 00:00:00 2001 From: meepingsnesroms Date: Mon, 25 Nov 2019 23:00:28 -0800 Subject: [PATCH] Add backlight for m500, clean up m515 backlight Also backup gradiant code. --- src/dbvz.c | 85 ++++++++++++++++++++++++++++------- src/dbvz.h | 1 - src/dbvzRegisterAccessors.c.h | 4 -- src/emulator.c | 6 ++- src/sed1376.c | 8 +++- src/sed1376.h | 1 + src/sed1376Accessors.c.h | 6 --- 7 files changed, 83 insertions(+), 28 deletions(-) diff --git a/src/dbvz.c b/src/dbvz.c index 5e49443..7b73a86 100644 --- a/src/dbvz.c +++ b/src/dbvz.c @@ -9,6 +9,7 @@ #include "flx68000.h" #include "ads7846.h" #include "sdCard.h" +#include "sed1376.h" #include "audio/blip_buf.h" #include "m68k/m68k.h" @@ -57,8 +58,32 @@ static int32_t audioGetFramePercentage(void); #include "dbvzRegisterAccessors.c.h" #include "dbvzTiming.c.h" +uint16_t rgb16From24(uint8_t r, uint8_t g, uint8_t b){ + uint16_t color = r >> 3 << 11 & 0xF800; + color |= g >> 2 << 5 & 0x07E0; + color |= b >> 3 & 0x001F; + return color; +} + +void rgb24From16(uint16_t color, uint8_t* r, uint8_t* g, uint8_t* b){ + *r = (color >> 11 & 0x1F) << 3; + *g = (color >> 5 & 0x3F) << 2; + *b = (color & 0x1F) << 3; +} + +uint16_t gradiantPoint(uint16_t start, uint16_t end, uint16_t range, uint16_t positon){ + uint8_t rgbStart[3]; + uint8_t rgbEnd[3]; + float percent = positon / (float)range; + + rgb24From16(start, &rgbStart[0], &rgbStart[1], &rgbStart[2]); + rgb24From16(end, &rgbEnd[0], &rgbEnd[1], &rgbEnd[2]); + + return rgb16From24(rgbStart[0] * (1.0 - percent) + rgbEnd[0] * percent, rgbStart[1] * (1.0 - percent) + rgbEnd[1] * percent, rgbStart[2] * (1.0 - percent) + rgbEnd[2] * percent); +} + void dbvzLcdRender(void){ - static const uint16_t masterColorLut[16] = {0xFFFF, 0xEEEE, 0xDDDD, 0xCCCC, 0xBBBB, 0xAAAA, 0x9999, 0x8888, 0x7777, 0x6666, 0x5555, 0x4444, 0x3333, 0x2222, 0x1111, 0x0000};//TODO: get a real LUT + static /*const*/ uint16_t masterColorLut[16] = {0x746D, 0x6C0C, 0x63CB, 0x5B8A, 0x534A, 0x4AE9, 0x42A8, 0x3A67, 0x3A27, 0x31C6, 0x2985, 0x2144, 0x1904, 0x10A3, 0x0862, 0x0000}; static const uint8_t bppLut[4] = {1, 2, 4, 0}; uint16_t colorLut2Bpp[4];//stores indexes to masterColorLut uint32_t startAddress = registerArrayRead32(LSSA); @@ -71,6 +96,44 @@ void dbvzLcdRender(void){ uint16_t y; uint16_t x; + /* + Color out:0x746D(printed 1 times) + Color out:0x6C0C(printed 1 times) + Color out:0x63CB(printed 1 times) + Color out:0x5B8A(printed 1 times) + Color out:0x534A(printed 1 times) + Color out:0x4AE9(printed 1 times) + Color out:0x42A8(printed 1 times) + Color out:0x3A67(printed 1 times) + Color out:0x3A27(printed 1 times) + Color out:0x31C6(printed 1 times) + Color out:0x2985(printed 1 times) + Color out:0x2144(printed 1 times) + Color out:0x1904(printed 1 times) + Color out:0x10A3(printed 1 times) + Color out:0x0862(printed 1 times) + Color out:0x0021(printed 1 times) + */ +/* + //debugLog("Color out:0x%04X\n", gradiantPoint(0x2222, 0xFFFF, 100, 40)); + //0x2222 <-> 0x0000 + for(x = 0; x < 16; x++){ + uint8_t rgb[3]; + //masterColorLut[x] = gradiantPoint(gradiantPoint(0x2222, 0xFFFF, 100, 30), 0x0000, 15, x);//good! + //masterColorLut[x] = gradiantPoint(0x746D, 0x0000, 15, x); + rgb24From16(0x746D, &rgb[0], &rgb[1], &rgb[2]); + masterColorLut[x] = rgb16From24(rgb[0] - (rgb[0] / 15) * x, rgb[1] - (rgb[1] / 15) * x, rgb[2] - (rgb[2] / 15) * x); + debugLog("Color out:0x%04X\n", masterColorLut[x]); + } + + for(y = 0; y < 160; y++){ + for(x = 0; x < 160; x++){ + dbvzFramebuffer[y * dbvzFramebufferWidth + x] = masterColorLut[y / 10]; + } + } + return; + //*/ + //dont render if LCD controller is disabled if(!(registerArrayRead8(LCKCON) & 0x80)){ memset(dbvzFramebuffer, 0x00, dbvzFramebufferWidth * dbvzFramebufferHeight * sizeof(uint16_t)); @@ -135,16 +198,6 @@ void dbvzLcdRender(void){ } } -bool dbvzLcdEnabled(void){ - //if LSSA is set to something other than the Palm OS constant render from it instead of the SED1376 - //the enable bit is perpously ignored because it is managed by the OS and apps may not set it - //return palmAllowInvalidBehavior && registerArrayRead32(LSSA) != 0xBADC0DE0; - //return palmAllowInvalidBehavior && registerArrayRead8(LCKCON) & 0x80; - //return false; - //return true; - return registerArrayRead8(LCKCON) & 0x80; -} - bool dbvzIsPllOn(void){ return !(dbvzSysclksPerClk32 < 1.0); } @@ -771,6 +824,8 @@ void dbvzSetRegister8(uint32_t address, uint8_t value){ //write without the top 2 bits registerArrayWrite8(address, value & 0x3F); updateAds7846ChipSelectStatus(); + if(palmEmulatingM500) + palmMisc.backlightLevel = !!(getPortGValue() & 0x02) * 100; return; case PJSEL: @@ -786,7 +841,8 @@ void dbvzSetRegister8(uint32_t address, uint8_t value){ registerArrayWrite8(address, value); checkPortDInterrupts(); updateVibratorStatus(); - updateBacklightAmplifierStatus(); + if(!palmEmulatingM500) + sed1376UpdateLcdStatus(); return; case PMSEL: @@ -1410,7 +1466,8 @@ void dbvzReset(void){ updateVibratorStatus(); updateAds7846ChipSelectStatus(); updateSdCardChipSelectStatus(); - updateBacklightAmplifierStatus(); + if(!palmEmulatingM500) + sed1376UpdateLcdStatus(); dbvzSysclksPerClk32 = sysclksPerClk32(); @@ -1462,8 +1519,6 @@ uint32_t dbvzStateSize(void){ size += sizeof(uint8_t) * 6;//pwm1Fifo[6] size += sizeof(uint8_t) * 2;//pwm1(Read/Write) - //debugLog("size is:%d\n", size); - return size; } diff --git a/src/dbvz.h b/src/dbvz.h index 74f7fd6..c752727 100644 --- a/src/dbvz.h +++ b/src/dbvz.h @@ -72,7 +72,6 @@ extern uint16_t dbvzFramebufferHeight; //CPU void dbvzLcdRender(void); -bool dbvzLcdEnabled(void); bool dbvzIsPllOn(void); bool m515BacklightAmplifierState(void); bool dbvzAreRegistersXXFFMapped(void); diff --git a/src/dbvzRegisterAccessors.c.h b/src/dbvzRegisterAccessors.c.h index f1befb7..d8b2581 100644 --- a/src/dbvzRegisterAccessors.c.h +++ b/src/dbvzRegisterAccessors.c.h @@ -989,10 +989,6 @@ static void updateSdCardChipSelectStatus(void){ sdCardSetChipSelect(!!(getPortJValue() & 0x08)); } -static void updateBacklightAmplifierStatus(void){ - palmMisc.backlightLevel = (palmMisc.backlightLevel > 0) ? (50 + m515BacklightAmplifierState() * 50) : 0; -} - static void updateTouchState(void){ if(!(registerArrayRead8(PFSEL) & registerArrayRead8(PFDIR) & 0x02)){ if((ads7846PenIrqEnabled ? !palmInput.touchscreenTouched : true) == !!(registerArrayRead16(ICR) & 0x0080)) diff --git a/src/emulator.c b/src/emulator.c index add480f..42c358e 100644 --- a/src/emulator.c +++ b/src/emulator.c @@ -772,7 +772,11 @@ void emulatorRunFrame(void){ if(palmEmulatingM500){ dbvzLcdRender(); - //TODO: backlight level + if(palmMisc.backlightLevel == 100){ + MULTITHREAD_LOOP(index) for(index = 0; index < 160 * 160; index++){ + palmFramebuffer[index] = palmFramebuffer[index] & 0xF81F | palmFramebuffer[index] + 0x02E0 & 0x07E0; + } + } } else{ sed1376Render(); diff --git a/src/sed1376.c b/src/sed1376.c index 1e7d581..6014d6e 100644 --- a/src/sed1376.c +++ b/src/sed1376.c @@ -4,6 +4,7 @@ #include "emulator.h" #include "portability.h" #include "dbvz.h" +#include "sed1376.h" #include "flx68000.h"//for flx68000GetPc() @@ -283,7 +284,7 @@ void sed1376SetRegister(uint8_t address, uint8_t value){ case GPIO_CONF_0: case GPIO_CONT_0: sed1376Registers[address] = value & 0x7F; - updateLcdStatus(); + sed1376UpdateLcdStatus(); return; case GPIO_CONF_1: @@ -420,3 +421,8 @@ void sed1376Render(void){ debugLog("Cant draw screen, LCD on:%s, PLL on:%s, power save on:%s, forced blank on:%s\n", palmMisc.lcdOn ? "true" : "false", dbvzIsPllOn() ? "true" : "false", sed1376PowerSaveEnabled() ? "true" : "false", !!(sed1376Registers[DISP_MODE] & 0x80) ? "true" : "false"); } } + +void sed1376UpdateLcdStatus(void){ + palmMisc.lcdOn = !!(sed1376Registers[GPIO_CONT_0] & sed1376Registers[GPIO_CONF_0] & 0x20); + palmMisc.backlightLevel = !!(sed1376Registers[GPIO_CONT_0] & sed1376Registers[GPIO_CONF_0] & 0x10) ? (50 + m515BacklightAmplifierState() * 50) : 0; +} diff --git a/src/sed1376.h b/src/sed1376.h index 4fa0a8f..259de57 100644 --- a/src/sed1376.h +++ b/src/sed1376.h @@ -19,5 +19,6 @@ uint8_t sed1376GetRegister(uint8_t address); void sed1376SetRegister(uint8_t address, uint8_t value); void sed1376Render(void); +void sed1376UpdateLcdStatus(void); #endif diff --git a/src/sed1376Accessors.c.h b/src/sed1376Accessors.c.h index 7ee12b1..e99d79c 100644 --- a/src/sed1376Accessors.c.h +++ b/src/sed1376Accessors.c.h @@ -121,9 +121,3 @@ static void selectRenderer(bool color, uint8_t bpp){ } } } - -//updaters -static void updateLcdStatus(void){ - palmMisc.lcdOn = !!(sed1376Registers[GPIO_CONT_0] & sed1376Registers[GPIO_CONF_0] & 0x20); - palmMisc.backlightLevel = !!(sed1376Registers[GPIO_CONT_0] & sed1376Registers[GPIO_CONF_0] & 0x10) ? (50 + m515BacklightAmplifierState() * 50) : 0; -}