summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers/europc.cpp
diff options
context:
space:
mode:
author AJR <ajrhacker@users.noreply.github.com>2020-04-07 19:39:17 -0400
committer AJR <ajrhacker@users.noreply.github.com>2020-04-07 19:39:17 -0400
commit2d68e6dae91461a1d055bace066b567a6dd34e93 (patch)
tree30bf290d4eb97b4980df8916ed7b341fdc63825c /src/mame/drivers/europc.cpp
parent4f08f64bd71d8cad022dc91288ebf42857ba4575 (diff)
m3002: New device
Diffstat (limited to 'src/mame/drivers/europc.cpp')
-rw-r--r--src/mame/drivers/europc.cpp129
1 files changed, 6 insertions, 123 deletions
diff --git a/src/mame/drivers/europc.cpp b/src/mame/drivers/europc.cpp
index 63a09bb56bf..572177a0005 100644
--- a/src/mame/drivers/europc.cpp
+++ b/src/mame/drivers/europc.cpp
@@ -34,7 +34,7 @@
#include "bus/isa/aga.h"
#include "bus/isa/fdc.h"
#include "machine/genpc.h"
-#include "machine/nvram.h"
+#include "machine/m3002.h"
#include "machine/pckeybrd.h"
#include "machine/ram.h"
@@ -50,6 +50,7 @@ public:
m_mb(*this, "mb"),
m_keyboard(*this, "pc_keyboard"),
m_ram(*this, RAM_TAG),
+ m_rtc(*this, "rtc"),
m_jim_state(0),
m_port61(0)
{ }
@@ -65,6 +66,7 @@ private:
required_device<pc_noppi_mb_device> m_mb;
required_device<pc_keyboard_device> m_keyboard;
required_device<ram_device> m_ram;
+ required_device<m3002_device> m_rtc;
DECLARE_WRITE8_MEMBER( europc_pio_w );
DECLARE_READ8_MEMBER( europc_pio_r );
@@ -73,26 +75,11 @@ private:
DECLARE_READ8_MEMBER ( europc_jim_r );
DECLARE_READ8_MEMBER ( europc_jim2_r );
- DECLARE_READ8_MEMBER( europc_rtc_r );
- DECLARE_WRITE8_MEMBER( europc_rtc_w );
-
- void europc_rtc_set_time();
-
uint8_t m_jim_data[16];
uint8_t m_jim_state;
isa8_aga_device::mode_t m_jim_mode;
int m_port61; // bit 0,1 must be 0 for startup; reset?
- uint8_t m_rtc_data[0x10];
- int m_rtc_reg;
- int m_rtc_state;
-
- void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
- emu_timer* m_rtc_timer;
- enum
- {
- TIMER_RTC
- };
void europc_io(address_map &map);
void europc_map(address_map &map);
};
@@ -208,7 +195,7 @@ WRITE8_MEMBER( europc_pc_state::europc_jim_w )
}
break;
case 0xa:
- europc_rtc_w(space, 0, data);
+ m_rtc->write(data);
return;
}
logerror("jim write %.2x %.2x\n", offset, data);
@@ -222,7 +209,7 @@ READ8_MEMBER( europc_pc_state::europc_jim_r )
{
case 4: case 5: case 6: case 7: data = m_jim_data[offset]; break;
case 0: case 1: case 2: case 3: data = 0; break;
- case 0xa: return europc_rtc_r(space, 0);
+ case 0xa: return m_rtc->read();
}
return data;
}
@@ -271,99 +258,6 @@ READ8_MEMBER( europc_pc_state::europc_jim2_r )
reg 0f: 01 status ok, when not 01 written
*/
-void europc_pc_state::europc_rtc_set_time()
-{
- system_time systime;
-
- /* get the current date/time from the core */
- machine().current_datetime(systime);
-
- m_rtc_data[0] = dec_2_bcd(systime.utc_time.second);
- m_rtc_data[1] = dec_2_bcd(systime.utc_time.minute);
- m_rtc_data[2] = dec_2_bcd(systime.utc_time.hour);
-
- m_rtc_data[3] = dec_2_bcd(systime.utc_time.mday);
- m_rtc_data[4] = dec_2_bcd(systime.utc_time.month + 1);
- m_rtc_data[5] = dec_2_bcd(systime.utc_time.year % 100);
-}
-
-void europc_pc_state::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr)
-{
- int month, year;
-
- switch(id)
- {
- case TIMER_RTC:
- m_rtc_data[0]=bcd_adjust(m_rtc_data[0]+1);
- if (m_rtc_data[0]>=0x60)
- {
- m_rtc_data[0]=0;
- m_rtc_data[1]=bcd_adjust(m_rtc_data[1]+1);
- if (m_rtc_data[1]>=0x60)
- {
- m_rtc_data[1]=0;
- m_rtc_data[2]=bcd_adjust(m_rtc_data[2]+1);
- if (m_rtc_data[2]>=0x24)
- {
- m_rtc_data[2]=0;
- m_rtc_data[3]=bcd_adjust(m_rtc_data[3]+1);
- month=bcd_2_dec(m_rtc_data[4]);
- year=bcd_2_dec(m_rtc_data[5])+2000; // save for julian_days_in_month_calculation
- if (m_rtc_data[3]> gregorian_days_in_month(month, year))
- {
- m_rtc_data[3]=1;
- m_rtc_data[4]=bcd_adjust(m_rtc_data[4]+1);
- if (m_rtc_data[4]>0x12)
- {
- m_rtc_data[4]=1;
- m_rtc_data[5]=bcd_adjust(m_rtc_data[5]+1)&0xff;
- }
- }
- }
- }
- }
- break;
- }
-}
-
-READ8_MEMBER( europc_pc_state::europc_rtc_r )
-{
- int data=0;
- switch (m_rtc_state)
- {
- case 1:
- data=(m_rtc_data[m_rtc_reg]&0xf0)>>4;
- m_rtc_state++;
- break;
- case 2:
- data=m_rtc_data[m_rtc_reg]&0xf;
- m_rtc_state=0;
-// logerror("rtc read %x %.2x\n",m_rtc_reg, m_rtc_data[m_rtc_reg]);
- break;
- }
- return data;
-}
-
-WRITE8_MEMBER( europc_pc_state::europc_rtc_w )
-{
- switch (m_rtc_state)
- {
- case 0:
- m_rtc_reg=data;
- m_rtc_state=1;
- break;
- case 1:
- m_rtc_data[m_rtc_reg]=(m_rtc_data[m_rtc_reg]&~0xf0)|((data&0xf)<<4);
- m_rtc_state++;
- break;
- case 2:
- m_rtc_data[m_rtc_reg]=(m_rtc_data[m_rtc_reg]&~0xf)|(data&0xf);
- m_rtc_state=0;
-// logerror("rtc written %x %.2x\n",m_rtc_reg, m_rtc_data[m_rtc_reg]);
- break;
- }
-}
-
void europc_pc_state::init_europc()
{
uint8_t *rom = &memregion("bios")->base()[0];
@@ -380,17 +274,6 @@ void europc_pc_state::init_europc()
a += rom[i];
rom[0xffff] = 256 - a;
}
-
- memset(&m_rtc_data,0,sizeof(m_rtc_data));
- m_rtc_reg = 0;
- m_rtc_state = 0;
- m_rtc_data[0xf]=1;
-
- m_rtc_timer = timer_alloc();
- m_rtc_timer->adjust(attotime::zero, 0, attotime(1,0));
- // europc_rtc_set_time();
-
- subdevice<nvram_device>("nvram")->set_base(m_rtc_data, sizeof(m_rtc_data));
}
WRITE8_MEMBER( europc_pc_state::europc_pio_w )
@@ -591,7 +474,7 @@ void europc_pc_state::europc(machine_config &config)
PC_KEYB(config, m_keyboard);
m_keyboard->keypress().set("mb:pic8259", FUNC(pic8259_device::ir1_w));
- NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0);;
+ M3002(config, m_rtc, 32.768_kHz_XTAL);
/* internal ram */
// Machine came with 512K standard, 640K via expansion card, but BIOS offers 256K as well