mirror of
https://github.com/holub/mame
synced 2025-06-02 02:49:44 +03:00
-psion5: Fixed up timers, now displays the Psion 5 boot screen. [Ash Wolf, Ryan Holtz]
This commit is contained in:
parent
c107559196
commit
28921545ae
@ -4,10 +4,13 @@
|
|||||||
|
|
||||||
Psion 5mx (EPOC R5) series
|
Psion 5mx (EPOC R5) series
|
||||||
|
|
||||||
Skeleton driver by Ryan Holtz, ported from work by Ash Wolf
|
Driver by Ryan Holtz, ported from work by Ash Wolf
|
||||||
|
|
||||||
TODO:
|
TODO:
|
||||||
- everything
|
- Touch inputs
|
||||||
|
- Audio
|
||||||
|
- UART support
|
||||||
|
- Probably more
|
||||||
|
|
||||||
More info:
|
More info:
|
||||||
https://github.com/Treeki/WindEmu
|
https://github.com/Treeki/WindEmu
|
||||||
@ -57,8 +60,9 @@
|
|||||||
|
|
||||||
void psion5mx_state::machine_start()
|
void psion5mx_state::machine_start()
|
||||||
{
|
{
|
||||||
m_timers[0] = timer_alloc(TID_TIMER1);
|
save_item(NAME(m_memcfg));
|
||||||
m_timers[1] = timer_alloc(TID_TIMER2);
|
save_item(NAME(m_dramcfg));
|
||||||
|
|
||||||
save_item(NAME(m_timer_reload));
|
save_item(NAME(m_timer_reload));
|
||||||
save_item(NAME(m_timer_value));
|
save_item(NAME(m_timer_value));
|
||||||
save_item(NAME(m_timer_ctrl));
|
save_item(NAME(m_timer_ctrl));
|
||||||
@ -75,13 +79,17 @@ void psion5mx_state::machine_start()
|
|||||||
|
|
||||||
save_item(NAME(m_ports));
|
save_item(NAME(m_ports));
|
||||||
|
|
||||||
|
m_timers[0] = timer_alloc(TID_TIMER1);
|
||||||
|
m_timers[1] = timer_alloc(TID_TIMER2);
|
||||||
m_periodic = timer_alloc(TID_PERIODIC);
|
m_periodic = timer_alloc(TID_PERIODIC);
|
||||||
|
|
||||||
m_rtc_ticker = timer_alloc(TID_RTC_TICKER);
|
m_rtc_ticker = timer_alloc(TID_RTC_TICKER);
|
||||||
}
|
}
|
||||||
|
|
||||||
void psion5mx_state::machine_reset()
|
void psion5mx_state::machine_reset()
|
||||||
{
|
{
|
||||||
|
memset(m_memcfg, 0, sizeof(uint32_t) * ARRAY_LENGTH(m_memcfg));
|
||||||
|
m_dramcfg = 0;
|
||||||
|
|
||||||
m_timers[0]->adjust(attotime::never);
|
m_timers[0]->adjust(attotime::never);
|
||||||
m_timers[1]->adjust(attotime::never);
|
m_timers[1]->adjust(attotime::never);
|
||||||
m_timer_reload[0] = m_timer_reload[1] = 0;
|
m_timer_reload[0] = m_timer_reload[1] = 0;
|
||||||
@ -92,7 +100,7 @@ void psion5mx_state::machine_reset()
|
|||||||
|
|
||||||
m_lcd_display_base_addr = 0;
|
m_lcd_display_base_addr = 0;
|
||||||
|
|
||||||
m_rtc = 0;
|
m_rtc = time(nullptr) - 946684800;
|
||||||
m_pwrsr = (1 << 10) | (1 << 13);
|
m_pwrsr = (1 << 10) | (1 << 13);
|
||||||
m_last_ssi_request = 0;
|
m_last_ssi_request = 0;
|
||||||
m_ssi_read_counter = 0;
|
m_ssi_read_counter = 0;
|
||||||
@ -163,7 +171,7 @@ void psion5mx_state::set_timer_ctrl(int timer, uint32_t value)
|
|||||||
m_timer_ctrl[timer] = value;
|
m_timer_ctrl[timer] = value;
|
||||||
if (changed != 0)
|
if (changed != 0)
|
||||||
{
|
{
|
||||||
attotime interval = BIT(m_timer_ctrl[timer], 3) ? attotime::from_ticks(1, 512000) : attotime::from_ticks(m_timer_reload[timer], 36000000);
|
attotime interval = BIT(m_timer_ctrl[timer], 3) ? attotime::from_ticks(1, 512000) : attotime::from_ticks(1, 2000);
|
||||||
if (BIT(old, 7) && BIT(value, 7))
|
if (BIT(old, 7) && BIT(value, 7))
|
||||||
{
|
{
|
||||||
m_timers[timer]->adjust(m_timers[timer]->remaining(), 0, interval);
|
m_timers[timer]->adjust(m_timers[timer]->remaining(), 0, interval);
|
||||||
@ -186,13 +194,16 @@ READ32_MEMBER(psion5mx_state::periphs_r)
|
|||||||
switch (reg)
|
switch (reg)
|
||||||
{
|
{
|
||||||
case REG_MEMCFG1:
|
case REG_MEMCFG1:
|
||||||
|
data = m_memcfg[0];
|
||||||
LOGMASKED(LOG_DRAM_READS, "%s: peripheral read, MEMCFG1 = %08x & %08x\n", machine().describe_context(), data, mem_mask);
|
LOGMASKED(LOG_DRAM_READS, "%s: peripheral read, MEMCFG1 = %08x & %08x\n", machine().describe_context(), data, mem_mask);
|
||||||
break;
|
break;
|
||||||
case REG_MEMCFG2:
|
case REG_MEMCFG2:
|
||||||
|
data = m_memcfg[1];
|
||||||
LOGMASKED(LOG_DRAM_READS, "%s: peripheral read, MEMCFG2 = %08x & %08x\n", machine().describe_context(), data, mem_mask);
|
LOGMASKED(LOG_DRAM_READS, "%s: peripheral read, MEMCFG2 = %08x & %08x\n", machine().describe_context(), data, mem_mask);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case REG_DRAMCFG:
|
case REG_DRAMCFG:
|
||||||
|
data = m_dramcfg;
|
||||||
LOGMASKED(LOG_DRAM_READS, "%s: peripheral read, DRAMCFG = %08x & %08x\n", machine().describe_context(), data, mem_mask);
|
LOGMASKED(LOG_DRAM_READS, "%s: peripheral read, DRAMCFG = %08x & %08x\n", machine().describe_context(), data, mem_mask);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -322,6 +333,7 @@ READ32_MEMBER(psion5mx_state::periphs_r)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case REG_SSSR:
|
case REG_SSSR:
|
||||||
|
data = 0;
|
||||||
LOGMASKED(LOG_SSP_READS, "%s: peripheral read, SSSR = %08x & %08x\n", machine().describe_context(), data, mem_mask);
|
LOGMASKED(LOG_SSP_READS, "%s: peripheral read, SSSR = %08x & %08x\n", machine().describe_context(), data, mem_mask);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -433,13 +445,16 @@ WRITE32_MEMBER(psion5mx_state::periphs_w)
|
|||||||
switch (reg)
|
switch (reg)
|
||||||
{
|
{
|
||||||
case REG_MEMCFG1:
|
case REG_MEMCFG1:
|
||||||
|
m_memcfg[0] = data;
|
||||||
LOGMASKED(LOG_DRAM_WRITES, "%s: peripheral write, MEMCFG1 = %08x & %08x\n", machine().describe_context(), data, mem_mask);
|
LOGMASKED(LOG_DRAM_WRITES, "%s: peripheral write, MEMCFG1 = %08x & %08x\n", machine().describe_context(), data, mem_mask);
|
||||||
break;
|
break;
|
||||||
case REG_MEMCFG2:
|
case REG_MEMCFG2:
|
||||||
|
m_memcfg[1] = data;
|
||||||
LOGMASKED(LOG_DRAM_WRITES, "%s: peripheral write, MEMCFG2 = %08x & %08x\n", machine().describe_context(), data, mem_mask);
|
LOGMASKED(LOG_DRAM_WRITES, "%s: peripheral write, MEMCFG2 = %08x & %08x\n", machine().describe_context(), data, mem_mask);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case REG_DRAMCFG:
|
case REG_DRAMCFG:
|
||||||
|
m_dramcfg = data;
|
||||||
LOGMASKED(LOG_DRAM_WRITES, "%s: peripheral write, DRAMCFG = %08x & %08x\n", machine().describe_context(), data, mem_mask);
|
LOGMASKED(LOG_DRAM_WRITES, "%s: peripheral write, DRAMCFG = %08x & %08x\n", machine().describe_context(), data, mem_mask);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -559,6 +574,7 @@ WRITE32_MEMBER(psion5mx_state::periphs_w)
|
|||||||
case REG_TC1LOAD:
|
case REG_TC1LOAD:
|
||||||
LOGMASKED(LOG_TIMER_WRITES, "%s: peripheral write, TC1LOAD = %08x & %08x\n", machine().describe_context(), data, mem_mask);
|
LOGMASKED(LOG_TIMER_WRITES, "%s: peripheral write, TC1LOAD = %08x & %08x\n", machine().describe_context(), data, mem_mask);
|
||||||
m_timer_reload[0] = data;
|
m_timer_reload[0] = data;
|
||||||
|
m_timer_value[0] = data;
|
||||||
break;
|
break;
|
||||||
case REG_TC1VAL:
|
case REG_TC1VAL:
|
||||||
LOGMASKED(LOG_TIMER_WRITES, "%s: peripheral write, TC1VAL = %08x & %08x\n", machine().describe_context(), data, mem_mask);
|
LOGMASKED(LOG_TIMER_WRITES, "%s: peripheral write, TC1VAL = %08x & %08x\n", machine().describe_context(), data, mem_mask);
|
||||||
@ -575,6 +591,7 @@ WRITE32_MEMBER(psion5mx_state::periphs_w)
|
|||||||
case REG_TC2LOAD:
|
case REG_TC2LOAD:
|
||||||
LOGMASKED(LOG_TIMER_WRITES, "%s: peripheral write, TC2LOAD = %08x & %08x\n", machine().describe_context(), data, mem_mask);
|
LOGMASKED(LOG_TIMER_WRITES, "%s: peripheral write, TC2LOAD = %08x & %08x\n", machine().describe_context(), data, mem_mask);
|
||||||
m_timer_reload[1] = data;
|
m_timer_reload[1] = data;
|
||||||
|
m_timer_value[1] = data;
|
||||||
break;
|
break;
|
||||||
case REG_TC2VAL:
|
case REG_TC2VAL:
|
||||||
LOGMASKED(LOG_TIMER_WRITES, "%s: peripheral write, TC2VAL = %08x & %08x\n", machine().describe_context(), data, mem_mask);
|
LOGMASKED(LOG_TIMER_WRITES, "%s: peripheral write, TC2VAL = %08x & %08x\n", machine().describe_context(), data, mem_mask);
|
||||||
@ -734,7 +751,7 @@ uint32_t psion5mx_state::screen_update(screen_device &screen, bitmap_rgb32 &bitm
|
|||||||
// fetch palette
|
// fetch palette
|
||||||
LOGMASKED(LOG_DISPLAY, "%02x %02x %02x %02x\n", lcd_buf[0], lcd_buf[1], lcd_buf[2], lcd_buf[3]);
|
LOGMASKED(LOG_DISPLAY, "%02x %02x %02x %02x\n", lcd_buf[0], lcd_buf[1], lcd_buf[2], lcd_buf[3]);
|
||||||
|
|
||||||
const int bpp = 1 << (lcd_buf[0] >> 4);
|
const int bpp = 1 << (lcd_buf[1] >> 4);
|
||||||
const int ppb = 8 / bpp;
|
const int ppb = 8 / bpp;
|
||||||
LOGMASKED(LOG_DISPLAY, "bpp: %d, ppb: %d\n", bpp, ppb);
|
LOGMASKED(LOG_DISPLAY, "bpp: %d, ppb: %d\n", bpp, ppb);
|
||||||
uint16_t palette[16] = {};
|
uint16_t palette[16] = {};
|
||||||
@ -773,7 +790,7 @@ INPUT_PORTS_END
|
|||||||
void psion5mx_state::psion5mx(machine_config &config)
|
void psion5mx_state::psion5mx(machine_config &config)
|
||||||
{
|
{
|
||||||
/* basic machine hardware */
|
/* basic machine hardware */
|
||||||
ARM710T(config, m_maincpu, 18000000); // 18MHz, per wikipedia
|
ARM710T(config, m_maincpu, 36000000); // 36MHz, per wikipedia
|
||||||
m_maincpu->set_addrmap(AS_PROGRAM, &psion5mx_state::main_map);
|
m_maincpu->set_addrmap(AS_PROGRAM, &psion5mx_state::main_map);
|
||||||
|
|
||||||
ETNA(config, m_etna);
|
ETNA(config, m_etna);
|
||||||
|
@ -171,6 +171,10 @@ private:
|
|||||||
required_shared_ptr<uint32_t> m_lcd_ram;
|
required_shared_ptr<uint32_t> m_lcd_ram;
|
||||||
|
|
||||||
emu_timer *m_timers[2];
|
emu_timer *m_timers[2];
|
||||||
|
|
||||||
|
uint32_t m_memcfg[2];
|
||||||
|
uint16_t m_dramcfg;
|
||||||
|
|
||||||
uint16_t m_timer_reload[2];
|
uint16_t m_timer_reload[2];
|
||||||
uint16_t m_timer_ctrl[2];
|
uint16_t m_timer_ctrl[2];
|
||||||
uint16_t m_timer_value[2];
|
uint16_t m_timer_value[2];
|
||||||
|
Loading…
Reference in New Issue
Block a user