From: George Wright Date: Sat, 7 Dec 2024 19:47:06 +0000 (-0800) Subject: quick hack to get the prom read to work for now. will need cleaning up X-Git-Url: http://git.gwright.org.uk/?a=commitdiff_plain;h=c4eb839a9a2ec7c887d54959417aecf4fb247867;p=WindEmu.git quick hack to get the prom read to work for now. will need cleaning up --- diff --git a/WindCore/sa1100/asic14.cpp b/WindCore/sa1100/asic14.cpp index 75ee9e3..f6bf18e 100644 --- a/WindCore/sa1100/asic14.cpp +++ b/WindCore/sa1100/asic14.cpp @@ -4,6 +4,40 @@ namespace SA1100 { ASIC14::ASIC14() { init_register(); + mCurrPlace = 0; + for (int i = 0; i < 0x80; i++) + prom[i] = 0; + + // defaults expected by the touchscreen code + prom[0xA] = 20; + prom[0xB] = 20; + prom[0xC] = 20; + prom[0xD] = 30; + + // some basic stuff to begin with + // set up the Psion's unique ID + prom[0x1B] = 0xDE; + prom[0x1A] = 0xAD; + prom[0x19] = 0xBE; + prom[0x18] = 0xEF; + + // give ourselves a neat custom device name + const char *key = "PSIONPSIONPSION"; + const char *name = "WindEmu!"; + prom[0x28] = strlen(name); + if (prom[0x28] > 15) + prom[0x28] = 15; + for (int i = 0; i < prom[0x28]; i++) + prom[0x29 + i] = name[i] ^ key[i]; + + // calculate the checksum + uint8_t chk = 0; + for (int i = 0; i < 0x7F; i++) + chk ^= prom[i]; + + // EPOC is expecting 66 + prom[0x7F] = chk ^ 66; + } void ASIC14::reset() { @@ -22,11 +56,12 @@ namespace SA1100 { m_IRQ_EDGE = 0; m_SPI_DATA = 0; m_SPI_FN = 0; + m_STATUS6 = (1 << 1) | (1 << 10) | (1 << 11); } void ASIC14::run() {} - uint16_t ASIC14::get_data(uint32_t const address) const { + uint16_t ASIC14::get_data(uint32_t const address) { switch (address) { case CTRL0: printf("ASIC14 read register CTRL0: %04x\n", m_CTRL0); @@ -64,12 +99,15 @@ namespace SA1100 { case IRQ_EDGE: printf("ASIC14 read register IRQ_EDGE: %04x\n", m_IRQ_EDGE); return m_IRQ_EDGE; - case STATUS6: + case STATUS6: { printf("ASIC14 read register STATUS6: %04x\n", m_STATUS6); - return m_STATUS6 | 2; + auto status = m_STATUS6; + m_STATUS6 = 0; + return status; + } case SPI_DATA: - printf("ASIC14 read register SPI_DATA: %04x\n", m_SPI_DATA); - return m_SPI_DATA; + printf("ASIC14 read register SPI_DATA: %04x\n", prom[mCurrPlace] | prom[mCurrPlace+1] << 8); + return prom[mCurrPlace++] | prom[mCurrPlace++] << 8; case SPI_FN: printf("ASIC14 read register SPI_FN: %04x\n", m_SPI_FN); return m_SPI_FN; @@ -111,7 +149,7 @@ namespace SA1100 { break; case IRQ_STATUS: printf("ASIC14 write %04x to register IRQ_STATUS\n", value); - m_IRQ_STATUS = value; + m_IRQ_STATUS &= ~value; break; case IRQ_MASK: printf("ASIC14 write %04x to register IRQ_MASK\n", value); @@ -131,8 +169,7 @@ namespace SA1100 { break; case STATUS6: printf("ASIC14 write %04x to register STATUS6\n", value); - // Clear interrupts on STATUS6 according to the bit mask provided - m_STATUS6 &= ~value; + //m_STATUS6 = value; break; case SPI_DATA: printf("ASIC14 write %04x to register SPI_DATA\n", value); @@ -140,6 +177,8 @@ namespace SA1100 { break; case SPI_FN: printf("ASIC14 write %04x to register SPI_FN\n", value); + if (value == 4 || value == 6) + m_STATUS6 = 2; m_SPI_FN = value; break; default: diff --git a/WindCore/sa1100/asic14.h b/WindCore/sa1100/asic14.h index 98d7633..7397e9d 100644 --- a/WindCore/sa1100/asic14.h +++ b/WindCore/sa1100/asic14.h @@ -40,6 +40,8 @@ class ASIC14 { typedef enum IRQMaskEnum IRQMaskEnum; private: + uint8_t prom[0x80] = {}; + int mCurrPlace = 0; enum { CTRL0 = 0x10000000, @@ -93,6 +95,7 @@ class ASIC14 { m_IRQ_EDGE = 0; m_SPI_DATA = 0; m_SPI_FN = 0; + m_STATUS6 = ~0;//(1 << 2) | (1 << 10) | (1 << 11); } public: @@ -101,7 +104,7 @@ class ASIC14 { void run(); void reset(); - uint16_t get_data(uint32_t const address) const; + uint16_t get_data(uint32_t const address); void put_data(uint32_t const address, uint16_t const value); };