Allow reading PENIRQ when in GPIO mode, more tests

This commit is contained in:
meepingsnesroms
2018-06-16 16:53:06 -07:00
parent b8282d3f5e
commit e8a97955ca
14 changed files with 149 additions and 44 deletions

View File

@@ -64,7 +64,6 @@ const char* getCpuString(){
uint8_t dragonballSubtype = getPhysicalCpuType() & CPU_M68K_TYPES;
char* dragonballTypeName;
switch(dragonballSubtype){
case CPU_M68K_328:
dragonballTypeName = "328";
break;

View File

@@ -29,7 +29,6 @@ void irdaHandleCommands(){
uint8_t irdaCommand = irdaReceiveUint8();
while(irdaCommand != IRDA_COMMAND_NONE){
switch(irdaCommand){
case IRDA_COMMAND_NONE:
break;

View File

@@ -132,7 +132,7 @@ var interrogateSpi2(){
StrPrintF(sharedDataBuffer, "PCDATA:0x%02X", readArbitraryMemory8(HW_REG_ADDR(PCDATA)));
UG_PutString(0, y, sharedDataBuffer);
y += FONT_HEIGHT + 1;
//PDDATA is buttons, not relevent to the SPI
/*PDDATA is buttons, not relevent to the SPI*/
StrPrintF(sharedDataBuffer, "PEDATA:0x%02X", readArbitraryMemory8(HW_REG_ADDR(PEDATA)));
UG_PutString(0, y, sharedDataBuffer);
y += FONT_HEIGHT + 1;
@@ -341,6 +341,12 @@ var toggleBacklight(){
if(firstRun){
firstRun = false;
debugSafeScreenClear(C_WHITE);
StrPrintF(sharedDataBuffer, "Left = SED1376");
UG_PutString(0, y, sharedDataBuffer);
y += FONT_HEIGHT + 1;
StrPrintF(sharedDataBuffer, "Right = Port G");
UG_PutString(0, y, sharedDataBuffer);
y += FONT_HEIGHT + 1;
}
if(getButtonPressed(buttonBack)){
@@ -356,12 +362,7 @@ var toggleBacklight(){
writeArbitraryMemory8(HW_REG_ADDR(PGDATA), readArbitraryMemory8(HW_REG_ADDR(PGDATA)) ^ 0x02);
}
StrPrintF(sharedDataBuffer, "Left = SED1376");
UG_PutString(0, y, sharedDataBuffer);
y += FONT_HEIGHT + 1;
StrPrintF(sharedDataBuffer, "Right = Port G");
UG_PutString(0, y, sharedDataBuffer);
y += FONT_HEIGHT + 1;
y = (FONT_HEIGHT + 1) * 2;
StrPrintF(sharedDataBuffer, "PGDATA:0x%02X", readArbitraryMemory8(HW_REG_ADDR(PGDATA)));
UG_PutString(0, y, sharedDataBuffer);
y += FONT_HEIGHT + 1;
@@ -381,7 +382,7 @@ var toggleMotor(){
if(firstRun){
firstRun = false;
debugSafeScreenClear(C_WHITE);
StrPrintF(sharedDataBuffer, "Press select to toggle motor(only works on m515)");
StrPrintF(sharedDataBuffer, "Select = Toggle Motor");
UG_PutString(0, 0, sharedDataBuffer);
}
@@ -397,4 +398,45 @@ var toggleMotor(){
return makeVar(LENGTH_0, TYPE_NULL, 0);
}
var watchPenIrq(){
static Boolean firstRun = true;
if(firstRun){
firstRun = false;
writeArbitraryMemory8(HW_REG_ADDR(PFDIR), readArbitraryMemory8(HW_REG_ADDR(PFDIR)) & 0xFD);
writeArbitraryMemory8(HW_REG_ADDR(PFSEL), readArbitraryMemory8(HW_REG_ADDR(PFSEL)) | 0x02);
debugSafeScreenClear(C_WHITE);
}
if(getButtonPressed(buttonBack)){
firstRun = true;
writeArbitraryMemory8(HW_REG_ADDR(PFSEL), readArbitraryMemory8(HW_REG_ADDR(PFSEL)) & 0xFD);
exitSubprogram();
}
StrPrintF(sharedDataBuffer, "PENIRQ State:%s", (readArbitraryMemory8(HW_REG_ADDR(PFDATA)) & 0x02) ? "true " : "false");/*"true " needs the space to clear the e from "false"*/
UG_PutString(0, 0, sharedDataBuffer);
return makeVar(LENGTH_0, TYPE_NULL, 0);
}
var watchIcr(){
static Boolean firstRun = true;
if(firstRun){
firstRun = false;
debugSafeScreenClear(C_WHITE);
}
if(getButtonPressed(buttonBack)){
firstRun = true;
writeArbitraryMemory8(HW_REG_ADDR(PFSEL), readArbitraryMemory8(HW_REG_ADDR(PFSEL)) & 0xFD);
exitSubprogram();
}
StrPrintF(sharedDataBuffer, "ICR:0x%02X", readArbitraryMemory16(HW_REG_ADDR(ICR)));
UG_PutString(0, 0, sharedDataBuffer);
return makeVar(LENGTH_0, TYPE_NULL, 0);
}

View File

@@ -13,5 +13,7 @@ var getClk32Frequency();
var getDeviceId();
var toggleBacklight();
var toggleMotor();
var watchPenIrq();
var watchIcr();
#endif

View File

@@ -70,20 +70,25 @@ uint16_t ads7846GetValue(uint8_t channel, Boolean referenceMode, Boolean mode8bi
writeArbitraryMemory16(HW_REG_ADDR(SPICONT2), spi2Control);
}
/*flush the register*/
writeArbitraryMemory16(HW_REG_ADDR(SPIDATA2), 0x0000);
writeArbitraryMemory16(HW_REG_ADDR(SPICONT2), spi2Control | 0x0100/*exchange*/ | 0x0015);
while(readArbitraryMemory16(HW_REG_ADDR(SPICONT2)) & 0x0100);
/*set data to send*/
writeArbitraryMemory16(HW_REG_ADDR(SPIDATA2), config << 8);
#if 1
/*send data*/
writeArbitraryMemory16(HW_REG_ADDR(SPICONT2), spi2Control | 0x0100/*exchange*/ | 0x0008);/*there is a 1 bit delay after the config byte before data is sent*/
writeArbitraryMemory16(HW_REG_ADDR(SPICONT2), spi2Control | 0x0100/*exchange*/ | 0x0007);
while(readArbitraryMemory16(HW_REG_ADDR(SPICONT2)) & 0x0100);
/*clear any data received in SPIDATA2 during the previous send*/
//writeArbitraryMemory16(HW_REG_ADDR(SPIDATA2), 0x0000);
/*trigger a busy event*/
writeArbitraryMemory16(HW_REG_ADDR(SPIDATA2), 0x0000);
/*trigger a busy event*//*there is a 1 bit delay after the config byte before data is sent*/
writeArbitraryMemory16(HW_REG_ADDR(SPICONT2), spi2Control | 0x0100/*exchange*/);
/*receive data, mode = 1(8 bits) or mode = 0(12 bits)*/
/*receive data, mode = 1(8 bits) or mode = 0(12 bits), 1 bit is a busy event*/
writeArbitraryMemory16(HW_REG_ADDR(SPICONT2), spi2Control | 0x0100/*exchange*/ | (mode8bit ? 0x0007 : 0x000B));
while(readArbitraryMemory16(HW_REG_ADDR(SPICONT2)) & 0x0100);
#endif
@@ -117,7 +122,6 @@ float percentageOfTimeAs1(uint32_t address, uint8_t readSize, uint8_t bitNumber,
Boolean lastClk32;
switch(readSize){
case 8:
value = readArbitraryMemory8(address);
break;

View File

@@ -150,13 +150,13 @@ CODE_SECTION("viewer") static var listModeFrame(){
if(selectedEntry + 1 < listLength)
selectedEntry++;
if(getButtonPressed(buttonLeft) && listLength > ITEM_LIST_ENTRYS)
if(getButtonPressed(buttonLeft))
if(selectedEntry - ITEM_LIST_ENTRYS >= 0)
selectedEntry -= ITEM_LIST_ENTRYS;/*flip the page*/
else
selectedEntry = 0;
if(getButtonPressed(buttonRight) && listLength > ITEM_LIST_ENTRYS)
if(getButtonPressed(buttonRight))
if(selectedEntry + ITEM_LIST_ENTRYS < listLength)
selectedEntry += ITEM_LIST_ENTRYS;/*flip the page*/
else
@@ -195,7 +195,6 @@ var valueViewer(){
debugSafeScreenClear(C_WHITE);
switch(getVarType(value)){
case TYPE_UINT:
StrPrintF(sharedDataBuffer, "uint32_t:0x%08lX", (uint32_t)varData);
UG_PutString(0, 0, sharedDataBuffer);
@@ -306,6 +305,10 @@ void resetFunctionViewer(){
hwTests[totalHwTests].testFunction = getDeviceId;
totalHwTests++;
StrNCopy(hwTests[totalHwTests].name, "Watch ICR", TEST_NAME_LENGTH);
hwTests[totalHwTests].testFunction = watchIcr;
totalHwTests++;
if(isM515){
StrNCopy(hwTests[totalHwTests].name, "Toggle Backlight", TEST_NAME_LENGTH);
hwTests[totalHwTests].testFunction = toggleBacklight;
@@ -314,6 +317,10 @@ void resetFunctionViewer(){
StrNCopy(hwTests[totalHwTests].name, "Toggle Motor", TEST_NAME_LENGTH);
hwTests[totalHwTests].testFunction = toggleMotor;
totalHwTests++;
StrNCopy(hwTests[totalHwTests].name, "Watch PENIRQ", TEST_NAME_LENGTH);
hwTests[totalHwTests].testFunction = watchPenIrq;
totalHwTests++;
}
if(unsafeMode){

View File

@@ -31,7 +31,7 @@ macx {
}
CONFIG(debug, debug|release){
DEFINES += EMU_DEBUG EMU_CUSTOM_DEBUG_LOG_HANDLER
DEFINES += EMU_MULTITHREADED EMU_DEBUG EMU_CUSTOM_DEBUG_LOG_HANDLER
# DEFINES += EMU_OPCODE_LEVEL_DEBUG EMU_LOG_APIS EMU_LOG_REGISTER_ACCESS_UNKNOWN
}

View File

@@ -870,7 +870,7 @@ uint32_t emulatorInstallPrcPdb(buffer_t file){
void emulateFrame(){
refreshInputState();
sendTouchEvents();
//sendTouchEvents();
while(palmCycleCounter < CRYSTAL_FREQUENCY / EMU_FPS){
if(palmCrystalCycles != 0.0 && !lowPowerStopActive){
@@ -899,7 +899,7 @@ bool emulateUntilDebugEventOrFrameEnd(){
#if defined(EMU_DEBUG) && defined(EMU_OPCODE_LEVEL_DEBUG)
invalidBehaviorAbort = false;
refreshInputState();
sendTouchEvents();
//sendTouchEvents();
while(palmCycleCounter < CRYSTAL_FREQUENCY / EMU_FPS){
if(palmCrystalCycles != 0.0 && !lowPowerStopActive){

View File

@@ -37,6 +37,15 @@ void frontendHandleDebugClearLogs();
#define debugLog(...)
#endif
//threads
#if defined(EMU_MULTITHREADED)
#define MULTITHREAD_LOOP _Pragma("omp parallel for")
#define MULTITHREAD_DOUBLE_LOOP _Pragma("omp parallel for collapse(2)")
#else
#define MULTITHREAD_LOOP
#define MULTITHREAD_DOUBLE_LOOP
#endif
//emu errors
enum{
EMU_ERROR_NONE = 0,

View File

@@ -48,26 +48,51 @@ bool sed1376ClockConnected(){
}
void refreshInputState(){
/*
uint16_t icr = registerArrayRead16(ICR);
bool penIrqPin = !(ads7846PenIrqEnabled && palmInput.touchscreenTouched);//penIrqPin pulled low on touch
//uint16_t icr = registerArrayRead16(ICR);
//bool penIrqPin = !(ads7846PenIrqEnabled && palmInput.touchscreenTouched);//penIrqPin pulled low on touch
/*
//IRQ set as pin function and triggered
if(!(registerArrayRead8(PFSEL) & 0x02) && penIrqPin == (bool)(icr & 0x0080))
setIprIsrBit(INT_IRQ5);
*/
/*
//IRQ set as pin function and triggered, the pen IRQ triggers when going low to high or high to low
if(!(registerArrayRead8(PFSEL) & 0x02) && (penIrqPin == (bool)(icr & 0x0080)) != (bool)(edgeTriggeredInterruptLastValue & INT_IRQ5))
setIprIsrBit(INT_IRQ5);
//if(!(registerArrayRead8(PFSEL) & 0x02) && (penIrqPin == (bool)(icr & 0x0080)) != (bool)(edgeTriggeredInterruptLastValue & INT_IRQ5))
// setIprIsrBit(INT_IRQ5);
if(penIrqPin == (bool)(icr & 0x0080))
edgeTriggeredInterruptLastValue |= INT_IRQ5;
else
edgeTriggeredInterruptLastValue &= ~INT_IRQ5;
/*
if(!(registerArrayRead8(PFSEL) & 0x02)){
if(penIrqPin == (bool)(icr & 0x0080)){
if(!(edgeTriggeredInterruptLastValue & INT_IRQ5)){
setIprIsrBit(INT_IRQ5);
edgeTriggeredInterruptLastValue |= INT_IRQ5;
}
}
else{
edgeTriggeredInterruptLastValue &= ~INT_IRQ5;
}
}
*/
if(!(registerArrayRead8(PFSEL) & 0x02)){
uint16_t icr = registerArrayRead16(ICR);
bool penIrqPin = !(ads7846PenIrqEnabled && palmInput.touchscreenTouched);//penIrqPin pulled low on touch
//switch polarity
if(icr & 0x0080)
penIrqPin = !penIrqPin;
//state changed trigger an interrupt
if(penIrqPin != (bool)(edgeTriggeredInterruptLastValue & INT_IRQ5))
setIprIsrBit(INT_IRQ5);
if(penIrqPin)
edgeTriggeredInterruptLastValue |= INT_IRQ5;
else
edgeTriggeredInterruptLastValue &= ~INT_IRQ5;
}
checkPortDInterrupts();//this calls checkInterrupts() so it doesnt need to be called above
}
@@ -446,8 +471,7 @@ uint8_t getHwRegister8(uint32_t address){
return (registerArrayRead8(PEDATA) & registerArrayRead8(PEDIR)) | ~registerArrayRead8(PEDIR);
case PFDATA:
//read outputs as is and inputs as true, floating pins are high
return (registerArrayRead8(PFDATA) & registerArrayRead8(PFDIR)) | ~registerArrayRead8(PFDIR);
return getPortFValue();
case PGDATA:
//read outputs as is and inputs as true, floating pins are high

View File

@@ -394,12 +394,27 @@ static inline uint8_t getPortDValue(){
portDValue |= 0x50;//floating pins are high
portDValue ^= portDPolarity;//only input polarity is affected by PDPOL
portDValue &= ~portDDir;//only use above pin values for inputs
portDValue &= ~portDDir;//only use above pin values for inputs, port d allows using special function pins as inputs while active unlike other ports
portDValue |= portDData & portDDir;//if a pin is an output and has its data bit set return that too
return portDValue;
}
static inline uint8_t getPortFValue(){
uint8_t portFValue = 0x00;
uint8_t portFData = registerArrayRead8(PKDATA);
uint8_t portFDir = registerArrayRead8(PKDIR);
uint8_t portFSel = registerArrayRead8(PKSEL);
bool penIrqPin = !(ads7846PenIrqEnabled && palmInput.touchscreenTouched);//penIrqPin pulled low on touch
portFValue |= penIrqPin << 1;
portFValue |= 0xFD;//floating pins are high
portFValue &= ~portFDir & portFSel;
portFValue |= portFData & portFDir & portFSel;
return portFValue;
}
static inline uint8_t getPortKValue(){
uint8_t portKValue = 0x00;
uint8_t portKData = registerArrayRead8(PKDATA);

View File

@@ -1,4 +1,5 @@
#include <stdint.h>
#include <string.h>
#include "emulator.h"
#include "hardwareRegisters.h"
@@ -359,12 +360,12 @@ static uint8_t getProperBankType(uint32_t bank){
}
void setRegisterXXFFAccessMode(){
for(uint32_t topByte = 0; topByte < 0x100; topByte++)
MULTITHREAD_LOOP for(uint32_t topByte = 0; topByte < 0x100; topByte++)
bankType[START_BANK(topByte << 24 | 0x00FFF000)] = CHIP_REGISTERS;
}
void setRegisterFFFFAccessMode(){
for(uint32_t topByte = 0; topByte < 0x100; topByte++){
MULTITHREAD_LOOP for(uint32_t topByte = 0; topByte < 0x100; topByte++){
uint32_t bank = START_BANK(topByte << 24 | 0x00FFF000);
bankType[bank] = getProperBankType(bank);
}
@@ -372,19 +373,21 @@ void setRegisterFFFFAccessMode(){
void setSed1376Attached(bool attached){
if(chips[CHIP_B_SED].enable){
memset(&bankType[START_BANK(chips[CHIP_B_SED].start)], attached ? CHIP_B_SED : CHIP_NONE, END_BANK(chips[CHIP_B_SED].start, chips[CHIP_B_SED].size) - START_BANK(chips[CHIP_B_SED].start) + 1);
/*
if(attached){
for(uint16_t bank = START_BANK(chips[CHIP_B_SED].start); bank <= END_BANK(chips[CHIP_B_SED].start, chips[CHIP_B_SED].size); bank++)
MULTITHREAD_LOOP for(uint16_t bank = START_BANK(chips[CHIP_B_SED].start); bank <= END_BANK(chips[CHIP_B_SED].start, chips[CHIP_B_SED].size); bank++)
bankType[bank] = CHIP_B_SED;
}
else{
for(uint16_t bank = START_BANK(chips[CHIP_B_SED].start); bank <= END_BANK(chips[CHIP_B_SED].start, chips[CHIP_B_SED].size); bank++)
MULTITHREAD_LOOP for(uint16_t bank = START_BANK(chips[CHIP_B_SED].start); bank <= END_BANK(chips[CHIP_B_SED].start, chips[CHIP_B_SED].size); bank++)
bankType[bank] = CHIP_NONE;
}
*/
}
}
void resetAddressSpace(){
//#pragma omp parallel for
for(uint32_t bank = 0; bank < TOTAL_MEMORY_BANKS; bank++)
MULTITHREAD_LOOP for(uint32_t bank = 0; bank < TOTAL_MEMORY_BANKS; bank++)
bankType[bank] = getProperBankType(bank);
}

View File

@@ -294,7 +294,7 @@ void sed1376Render(){
selectRenderer(color, bitDepth);
if(renderPixel){
for(uint16_t pixelY = 0; pixelY < 160; pixelY++)
MULTITHREAD_DOUBLE_LOOP for(uint16_t pixelY = 0; pixelY < 160; pixelY++)
for(uint16_t pixelX = 0; pixelX < 160; pixelX++)
palmFramebuffer[pixelY * 160 + pixelX] = renderPixel(pixelX, pixelY);
@@ -321,7 +321,7 @@ void sed1376Render(){
pipEndY = uMin(pipEndX, 160);
screenStartAddress = getPipStartAddress();
lineSize = (sed1376Registers[PIP_LINE_SZ_1] << 8 | sed1376Registers[PIP_LINE_SZ_0]) * 4;
for(uint16_t pixelY = pipStartY; pixelY < pipEndY; pixelY++)
MULTITHREAD_DOUBLE_LOOP for(uint16_t pixelY = pipStartY; pixelY < pipEndY; pixelY++)
for(uint16_t pixelX = pipStartX; pixelX < pipEndX; pixelX++)
palmFramebuffer[pixelY * 160 + pixelX] = renderPixel(pixelX, pixelY);
}
@@ -332,12 +332,12 @@ void sed1376Render(){
//software display inversion
if((sed1376Registers[DISP_MODE] & 0x30) == 0x10)
for(uint32_t count = 0; count < 160 * 160; count++)
MULTITHREAD_LOOP for(uint32_t count = 0; count < 160 * 160; count++)
palmFramebuffer[count] ^= 0xFFFF;
//backlight off, half color intensity
if(!palmMisc.backlightOn)
for(uint32_t count = 0; count < 160 * 160; count++){
MULTITHREAD_LOOP for(uint32_t count = 0; count < 160 * 160; count++){
palmFramebuffer[count] >>= 1;
palmFramebuffer[count] &= 0x7BEF;
}

View File

@@ -32,6 +32,7 @@ port g data bit 2 may need to be 0 to access ADS7846
REFREQ clock frequency in RTCCTL should slow down the RTC when enabled
port d IRQ* bits edge triggered interrupt mode is not emulated
port g backlight state readback
port d seems to allow using special function pins as inputs while active unlike other ports, this needs to be verified
Debug tools:
missing icons