From 1b1dc40e098541c6894cf036d1d363ee6f0acd98 Mon Sep 17 00:00:00 2001 From: cracyc Date: Sun, 28 Jan 2018 08:47:54 -0600 Subject: fmtowns: use msm/rtc58321 (nw) --- src/mame/drivers/fmtowns.cpp | 115 ++++++++++++++----------------------------- 1 file changed, 37 insertions(+), 78 deletions(-) diff --git a/src/mame/drivers/fmtowns.cpp b/src/mame/drivers/fmtowns.cpp index fbc44631e7d..9b61722d8e9 100644 --- a/src/mame/drivers/fmtowns.cpp +++ b/src/mame/drivers/fmtowns.cpp @@ -267,34 +267,6 @@ void towns_state::init_serial_rom() m_towns_serial_rom[25] = 0x10; } -void towns_state::init_rtc() -{ - system_time systm; - - machine().base_datetime(systm); - - // seconds - m_towns_rtc_reg[0] = systm.local_time.second % 10; - m_towns_rtc_reg[1] = systm.local_time.second / 10; - // minutes - m_towns_rtc_reg[2] = systm.local_time.minute % 10; - m_towns_rtc_reg[3] = systm.local_time.minute / 10; - // hours - m_towns_rtc_reg[4] = systm.local_time.hour % 10; - m_towns_rtc_reg[5] = systm.local_time.hour / 10; - // weekday - m_towns_rtc_reg[6] = systm.local_time.weekday; - // day - m_towns_rtc_reg[7] = systm.local_time.mday % 10; - m_towns_rtc_reg[8] = systm.local_time.mday / 10; - // month - m_towns_rtc_reg[9] = (systm.local_time.month + 1) % 10; - m_towns_rtc_reg[10] = (systm.local_time.month + 1) / 10; - // year - m_towns_rtc_reg[11] = (systm.local_time.year - 2000) % 10; - m_towns_rtc_reg[12] = (systm.local_time.year - 2000) / 10; -} - READ8_MEMBER(towns_state::towns_system_r) { uint8_t ret = 0; @@ -417,9 +389,6 @@ void towns_state::device_timer(emu_timer &timer, device_timer_id id, int param, { switch(id) { - case TIMER_RTC: - rtc_second(); - break; case TIMER_FREERUN: freerun_inc(); break; @@ -1956,67 +1925,49 @@ WRITE8_MEMBER(towns_state::towns_cdrom_w) */ READ8_MEMBER(towns_state::towns_rtc_r) { - return 0x80 | m_towns_rtc_reg[m_towns_rtc_select]; + return (m_rtc_busy ? 0 : 0x80) | m_rtc_d; } WRITE8_MEMBER(towns_state::towns_rtc_w) { - m_towns_rtc_data = data; + m_rtc->d0_w(data & 1 ? ASSERT_LINE : CLEAR_LINE); + m_rtc->d1_w(data & 2 ? ASSERT_LINE : CLEAR_LINE); + m_rtc->d2_w(data & 4 ? ASSERT_LINE : CLEAR_LINE); + m_rtc->d3_w(data & 8 ? ASSERT_LINE : CLEAR_LINE); } WRITE8_MEMBER(towns_state::towns_rtc_select_w) { - if(data & 0x80) - { - if(data & 0x01) - m_towns_rtc_select = m_towns_rtc_data & 0x0f; - } + m_rtc->cs1_w(data & 0x80 ? ASSERT_LINE : CLEAR_LINE); + m_rtc->cs2_w(data & 0x80 ? ASSERT_LINE : CLEAR_LINE); + m_rtc->read_w(data & 4 ? ASSERT_LINE : CLEAR_LINE); + m_rtc->write_w(data & 2 ? ASSERT_LINE : CLEAR_LINE); + m_rtc->address_write_w(data & 1 ? ASSERT_LINE : CLEAR_LINE); } -void towns_state::rtc_hour() +WRITE_LINE_MEMBER(towns_state::rtc_d0_w) { - m_towns_rtc_reg[4]++; - if(m_towns_rtc_reg[4] > 4 && m_towns_rtc_reg[5] == 2) - { - m_towns_rtc_reg[4] = 0; - m_towns_rtc_reg[5] = 0; - } - else if(m_towns_rtc_reg[4] > 9) - { - m_towns_rtc_reg[4] = 0; - m_towns_rtc_reg[5]++; - } + m_rtc_d = (m_rtc_d & ~1) | (state == ASSERT_LINE ? 1 : 0); } -void towns_state::rtc_minute() +WRITE_LINE_MEMBER(towns_state::rtc_d1_w) { - m_towns_rtc_reg[2]++; - if(m_towns_rtc_reg[2] > 9) - { - m_towns_rtc_reg[2] = 0; - m_towns_rtc_reg[3]++; - if(m_towns_rtc_reg[3] > 5) - { - m_towns_rtc_reg[3] = 0; - rtc_hour(); - } - } + m_rtc_d = (m_rtc_d & ~2) | (state == ASSERT_LINE ? 2 : 0); } -void towns_state::rtc_second() +WRITE_LINE_MEMBER(towns_state::rtc_d2_w) { - // increase RTC time by one second - m_towns_rtc_reg[0]++; - if(m_towns_rtc_reg[0] > 9) - { - m_towns_rtc_reg[0] = 0; - m_towns_rtc_reg[1]++; - if(m_towns_rtc_reg[1] > 5) - { - m_towns_rtc_reg[1] = 0; - rtc_minute(); - } - } + m_rtc_d = (m_rtc_d & ~4) | (state == ASSERT_LINE ? 4 : 0); +} + +WRITE_LINE_MEMBER(towns_state::rtc_d3_w) +{ + m_rtc_d = (m_rtc_d & ~8) | (state == ASSERT_LINE ? 8 : 0); +} + +WRITE_LINE_MEMBER(towns_state::rtc_busy_w) +{ + m_rtc_busy = state == ASSERT_LINE ? true : false; } // SCSI controller - I/O ports 0xc30 and 0xc32 @@ -2690,8 +2641,6 @@ void towns_state::driver_start() //towns_sprram = std::make_unique(0x20000); m_towns_serial_rom = std::make_unique(256/8); init_serial_rom(); - init_rtc(); - m_towns_rtc_timer = timer_alloc(TIMER_RTC); m_towns_kb_timer = timer_alloc(TIMER_KEYBOARD); m_towns_mouse_timer = timer_alloc(TIMER_MOUSE); m_towns_wait_timer = timer_alloc(TIMER_WAIT); @@ -2750,10 +2699,11 @@ void towns_state::machine_reset() m_intervaltimer2_timeout_flag = 0; m_intervaltimer2_timeout_flag2 = 0; m_intervaltimer2_irqmask = 1; // masked - m_towns_rtc_timer->adjust(attotime::zero,0,attotime::from_hz(1)); m_towns_kb_timer->adjust(attotime::zero,0,attotime::from_msec(10)); m_towns_freerun_counter->adjust(attotime::zero,0,attotime::from_usec(1)); m_serial_irq_source = 0; + m_rtc_d = 0; + m_rtc_busy = false; } READ8_MEMBER(towns_state::get_slave_ack) @@ -2918,6 +2868,15 @@ MACHINE_CONFIG_START(towns_state::towns_base) MCFG_RAM_ADD(RAM_TAG) MCFG_RAM_DEFAULT_SIZE("6M") MCFG_RAM_EXTRA_OPTIONS("2M,4M,8M,16M,32M,64M,96M") + + MCFG_DEVICE_ADD("rtc58321", MSM58321, 32768_Hz_XTAL) + MCFG_MSM58321_D0_HANDLER(WRITELINE(towns_state, rtc_d0_w)) + MCFG_MSM58321_D1_HANDLER(WRITELINE(towns_state, rtc_d1_w)) + MCFG_MSM58321_D2_HANDLER(WRITELINE(towns_state, rtc_d2_w)) + MCFG_MSM58321_D3_HANDLER(WRITELINE(towns_state, rtc_d3_w)) + MCFG_MSM58321_BUSY_HANDLER(WRITELINE(towns_state, rtc_busy_w)) + MCFG_MSM58321_YEAR0(2000) + MCFG_MSM58321_DEFAULT_24H(true) MACHINE_CONFIG_END MACHINE_CONFIG_START(towns_state::towns) -- cgit v1.2.3