diff options
author | cracyc <cracyc@users.noreply.github.com> | 2013-05-29 23:15:35 +0000 |
---|---|---|
committer | cracyc <cracyc@users.noreply.github.com> | 2013-05-29 23:15:35 +0000 |
commit | 5695dfc045aab66d9a4eab23d293dd4e566d853c (patch) | |
tree | d0961b6aa7219aa2e8f966e5b7ca65706053ca61 /src/mame/drivers/calchase.c | |
parent | 0a87be2f6f92f41b43a8c61aefebd680b67d0faa (diff) |
pcshare: make all the common pc hardware in various pc based drivers inherit from pcat_base_state [Carl]
Diffstat (limited to 'src/mame/drivers/calchase.c')
-rw-r--r-- | src/mame/drivers/calchase.c | 301 |
1 files changed, 33 insertions, 268 deletions
diff --git a/src/mame/drivers/calchase.c b/src/mame/drivers/calchase.c index 9f1961bf899..4e8f5bd9f24 100644 --- a/src/mame/drivers/calchase.c +++ b/src/mame/drivers/calchase.c @@ -113,48 +113,30 @@ something wrong in the disk geometry reported by calchase.chd (20,255,63) since #include "emu.h" #include "cpu/i386/i386.h" -#include "machine/8237dma.h" -#include "machine/pic8259.h" -#include "machine/pit8253.h" -#include "machine/mc146818.h" #include "machine/pci.h" -#include "machine/8042kbdc.h" #include "machine/pckeybrd.h" #include "machine/idectrl.h" #include "video/pc_vga.h" #include "sound/dac.h" +#include "machine/pcshare.h" -class calchase_state : public driver_device +class calchase_state : public pcat_base_state { public: calchase_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag), - m_maincpu(*this, "maincpu"), + : pcat_base_state(mconfig, type, tag), m_dac_l(*this, "dac_l"), - m_dac_r(*this, "dac_r") + m_dac_r(*this, "dac_r"), + m_ide(*this, "ide") { } UINT32 *m_bios_ram; UINT32 *m_bios_ext_ram; - int m_dma_channel; - UINT8 m_dma_offset[2][4]; - UINT8 m_at_pages[0x10]; UINT8 m_mxtc_config_reg[256]; UINT8 m_piix4_config_reg[4][256]; - device_t *m_pit8254; - pic8259_device *m_pic8259_1; - pic8259_device *m_pic8259_2; - i8237_device *m_dma8237_1; - i8237_device *m_dma8237_2; - UINT32 m_idle_skip_ram; - required_device<cpu_device> m_maincpu; - DECLARE_READ8_MEMBER(at_page8_r); - DECLARE_WRITE8_MEMBER(at_page8_w); - DECLARE_READ8_MEMBER(pc_dma_read_byte); - DECLARE_WRITE8_MEMBER(pc_dma_write_byte); DECLARE_WRITE32_MEMBER(bios_ext_ram_w); DECLARE_WRITE32_MEMBER(bios_ram_w); DECLARE_READ16_MEMBER(calchase_iocard1_r); @@ -164,172 +146,21 @@ public: DECLARE_READ16_MEMBER(calchase_iocard5_r); DECLARE_READ32_MEMBER(calchase_idle_skip_r); DECLARE_WRITE32_MEMBER(calchase_idle_skip_w); - DECLARE_READ8_MEMBER(at_dma8237_2_r); - DECLARE_WRITE8_MEMBER(at_dma8237_2_w); - DECLARE_WRITE_LINE_MEMBER(pc_dma_hrq_changed); - DECLARE_WRITE_LINE_MEMBER(pc_dack0_w); - DECLARE_WRITE_LINE_MEMBER(pc_dack1_w); - DECLARE_WRITE_LINE_MEMBER(pc_dack2_w); - DECLARE_WRITE_LINE_MEMBER(pc_dack3_w); + DECLARE_WRITE16_MEMBER(calchase_dac_l_w); + DECLARE_WRITE16_MEMBER(calchase_dac_r_w); + DECLARE_DRIVER_INIT(calchase); DECLARE_READ32_MEMBER(ide_r); DECLARE_WRITE32_MEMBER(ide_w); DECLARE_READ32_MEMBER(fdc_r); DECLARE_WRITE32_MEMBER(fdc_w); - DECLARE_WRITE16_MEMBER(calchase_dac_l_w); - DECLARE_WRITE16_MEMBER(calchase_dac_r_w); - DECLARE_WRITE_LINE_MEMBER(calchase_pic8259_1_set_int_line); - DECLARE_READ8_MEMBER(get_slave_ack); - DECLARE_DRIVER_INIT(calchase); - DECLARE_READ8_MEMBER(get_out2); virtual void machine_start(); virtual void machine_reset(); - IRQ_CALLBACK_MEMBER(irq_callback); void intel82439tx_init(); required_device<dac_device> m_dac_l; required_device<dac_device> m_dac_r; + required_device<ide_controller_device> m_ide; }; - - - -READ8_MEMBER(calchase_state::at_dma8237_2_r) -{ - return m_dma8237_2->i8237_r(space, offset / 2); -} - -WRITE8_MEMBER(calchase_state::at_dma8237_2_w) -{ - m_dma8237_2->i8237_w(space, offset / 2, data); -} - -READ8_MEMBER(calchase_state::at_page8_r) -{ - UINT8 data = m_at_pages[offset % 0x10]; - - switch(offset % 8) { - case 1: - data = m_dma_offset[(offset / 8) & 1][2]; - break; - case 2: - data = m_dma_offset[(offset / 8) & 1][3]; - break; - case 3: - data = m_dma_offset[(offset / 8) & 1][1]; - break; - case 7: - data = m_dma_offset[(offset / 8) & 1][0]; - break; - } - return data; -} - - -WRITE8_MEMBER(calchase_state::at_page8_w) -{ - m_at_pages[offset % 0x10] = data; - - switch(offset % 8) { - case 1: - m_dma_offset[(offset / 8) & 1][2] = data; - break; - case 2: - m_dma_offset[(offset / 8) & 1][3] = data; - break; - case 3: - m_dma_offset[(offset / 8) & 1][1] = data; - break; - case 7: - m_dma_offset[(offset / 8) & 1][0] = data; - break; - } -} - - -WRITE_LINE_MEMBER(calchase_state::pc_dma_hrq_changed) -{ - m_maincpu->set_input_line(INPUT_LINE_HALT, state ? ASSERT_LINE : CLEAR_LINE); - - /* Assert HLDA */ - m_dma8237_1->i8237_hlda_w(state); -} - - -READ8_MEMBER(calchase_state::pc_dma_read_byte) -{ - offs_t page_offset = (((offs_t) m_dma_offset[0][m_dma_channel]) << 16) - & 0xFF0000; - - return space.read_byte(page_offset + offset); -} - - -WRITE8_MEMBER(calchase_state::pc_dma_write_byte) -{ - offs_t page_offset = (((offs_t) m_dma_offset[0][m_dma_channel]) << 16) - & 0xFF0000; - - space.write_byte(page_offset + offset, data); -} - -static void set_dma_channel(device_t *device, int channel, int state) -{ - calchase_state *drvstate = device->machine().driver_data<calchase_state>(); - if (!state) drvstate->m_dma_channel = channel; -} - -WRITE_LINE_MEMBER(calchase_state::pc_dack0_w){ set_dma_channel(m_dma8237_1, 0, state); } -WRITE_LINE_MEMBER(calchase_state::pc_dack1_w){ set_dma_channel(m_dma8237_1, 1, state); } -WRITE_LINE_MEMBER(calchase_state::pc_dack2_w){ set_dma_channel(m_dma8237_1, 2, state); } -WRITE_LINE_MEMBER(calchase_state::pc_dack3_w){ set_dma_channel(m_dma8237_1, 3, state); } - -static I8237_INTERFACE( dma8237_1_config ) -{ - DEVCB_DRIVER_LINE_MEMBER(calchase_state,pc_dma_hrq_changed), - DEVCB_NULL, - DEVCB_DRIVER_MEMBER(calchase_state, pc_dma_read_byte), - DEVCB_DRIVER_MEMBER(calchase_state, pc_dma_write_byte), - { DEVCB_NULL, DEVCB_NULL, DEVCB_NULL, DEVCB_NULL }, - { DEVCB_NULL, DEVCB_NULL, DEVCB_NULL, DEVCB_NULL }, - { DEVCB_DRIVER_LINE_MEMBER(calchase_state,pc_dack0_w), DEVCB_DRIVER_LINE_MEMBER(calchase_state,pc_dack1_w), DEVCB_DRIVER_LINE_MEMBER(calchase_state,pc_dack2_w), DEVCB_DRIVER_LINE_MEMBER(calchase_state,pc_dack3_w) } -}; - -static I8237_INTERFACE( dma8237_2_config ) -{ - DEVCB_NULL, - DEVCB_NULL, - DEVCB_NULL, - DEVCB_NULL, - { DEVCB_NULL, DEVCB_NULL, DEVCB_NULL, DEVCB_NULL }, - { DEVCB_NULL, DEVCB_NULL, DEVCB_NULL, DEVCB_NULL }, - { DEVCB_NULL, DEVCB_NULL, DEVCB_NULL, DEVCB_NULL } -}; - -READ32_MEMBER(calchase_state::ide_r) -{ - device_t *device = machine().device("ide"); - return ide_controller32_r(device, space, 0x1f0/4 + offset, mem_mask); -} - -WRITE32_MEMBER(calchase_state::ide_w) -{ - device_t *device = machine().device("ide"); - ide_controller32_w(device, space, 0x1f0/4 + offset, data, mem_mask); -} - -READ32_MEMBER(calchase_state::fdc_r) -{ - device_t *device = machine().device("ide"); - return ide_controller32_r(device, space, 0x3f0/4 + offset, mem_mask); -} - -WRITE32_MEMBER(calchase_state::fdc_w) -{ - device_t *device = machine().device("ide"); - //mame_printf_debug("FDC: write %08X, %08X, %08X\n", data, offset, mem_mask); - ide_controller32_w(device, space, 0x3f0/4 + offset, data, mem_mask); -} - - // Intel 82439TX System Controller (MXTC) // TODO: change with a VIA82C585VPX (North Bridge - APOLLO Chipset) @@ -543,6 +374,27 @@ WRITE16_MEMBER(calchase_state::calchase_dac_r_w) m_dac_r->write_unsigned16((data & 0xfff) << 4); } +READ32_MEMBER(calchase_state::ide_r) +{ + return ide_controller32_r(m_ide, space, 0x1f0/4 + offset, mem_mask); +} + +WRITE32_MEMBER(calchase_state::ide_w) +{ + ide_controller32_w(m_ide, space, 0x1f0/4 + offset, data, mem_mask); +} + +READ32_MEMBER(calchase_state::fdc_r) +{ + return ide_controller32_r(m_ide, space, 0x3f0/4 + offset, mem_mask); +} + +WRITE32_MEMBER(calchase_state::fdc_w) +{ + //mame_printf_debug("FDC: write %08X, %08X, %08X\n", data, offset, mem_mask); + ide_controller32_w(m_ide, space, 0x3f0/4 + offset, data, mem_mask); +} + static ADDRESS_MAP_START( calchase_map, AS_PROGRAM, 32, calchase_state ) AM_RANGE(0x00000000, 0x0009ffff) AM_RAM AM_RANGE(0x000a0000, 0x000bffff) AM_DEVREADWRITE8("vga", trident_vga_device, mem_r, mem_w, 0xffffffff) // VGA VRAM @@ -579,14 +431,7 @@ static ADDRESS_MAP_START( calchase_map, AS_PROGRAM, 32, calchase_state ) ADDRESS_MAP_END static ADDRESS_MAP_START( calchase_io, AS_IO, 32, calchase_state ) - AM_RANGE(0x0000, 0x001f) AM_DEVREADWRITE8("dma8237_1", i8237_device, i8237_r, i8237_w, 0xffffffff) - AM_RANGE(0x0020, 0x003f) AM_DEVREADWRITE8("pic8259_1", pic8259_device, read, write, 0xffffffff) - AM_RANGE(0x0040, 0x005f) AM_DEVREADWRITE8_LEGACY("pit8254", pit8253_r, pit8253_w, 0xffffffff) - AM_RANGE(0x0060, 0x006f) AM_DEVREADWRITE8("kbdc", kbdc8042_device, data_r, data_w, 0xffffffff) - AM_RANGE(0x0070, 0x007f) AM_DEVREADWRITE8("rtc", mc146818_device, read, write, 0xffffffff) /* todo: nvram (CMOS Setup Save)*/ - AM_RANGE(0x0080, 0x009f) AM_READWRITE8(at_page8_r, at_page8_w, 0xffffffff) - AM_RANGE(0x00a0, 0x00bf) AM_DEVREADWRITE8("pic8259_2", pic8259_device, read, write, 0xffffffff) - AM_RANGE(0x00c0, 0x00df) AM_READWRITE8(at_dma8237_2_r, at_dma8237_2_w, 0xffffffff) + AM_IMPORT_FROM(pcat32_io_common) //AM_RANGE(0x00e8, 0x00eb) AM_NOP AM_RANGE(0x00e8, 0x00ef) AM_NOP //AMI BIOS write to this ports as delays between I/O ports operations sending al value -> NEWIODELAY AM_RANGE(0x0170, 0x0177) AM_NOP //To debug @@ -619,7 +464,6 @@ static ADDRESS_MAP_START( calchase_io, AS_IO, 32, calchase_state ) AM_RANGE(0x4ae8, 0x4aef) AM_NOP //To debug AM_RANGE(0x83c0, 0x83cf) AM_RAM AM_SHARE("share1") AM_RANGE(0x92e8, 0x92ef) AM_NOP //To debug - ADDRESS_MAP_END #define AT_KEYB_HELPER(bit, text, key1) \ @@ -804,70 +648,14 @@ static INPUT_PORTS_START( calchase ) INPUT_PORTS_END #endif -IRQ_CALLBACK_MEMBER(calchase_state::irq_callback) -{ - return m_pic8259_1->acknowledge(); -} - void calchase_state::machine_start() { m_bios_ram = auto_alloc_array(machine(), UINT32, 0x10000/4); m_bios_ext_ram = auto_alloc_array(machine(), UINT32, 0x10000/4); m_maincpu->set_irq_acknowledge_callback(device_irq_acknowledge_delegate(FUNC(calchase_state::irq_callback),this)); - - m_pit8254 = machine().device( "pit8254" ); - m_pic8259_1 = machine().device<pic8259_device>( "pic8259_1" ); - m_pic8259_2 = machine().device<pic8259_device>( "pic8259_2" ); - m_dma8237_1 = machine().device<i8237_device>( "dma8237_1" ); - m_dma8237_2 = machine().device<i8237_device>( "dma8237_2" ); -} - -/************************************************************* - * - * pic8259 configuration - * - *************************************************************/ - -WRITE_LINE_MEMBER(calchase_state::calchase_pic8259_1_set_int_line) -{ - m_maincpu->set_input_line(0, state ? HOLD_LINE : CLEAR_LINE); } -READ8_MEMBER(calchase_state::get_slave_ack) -{ - if (offset==2) { - return m_pic8259_2->acknowledge(); - } - return 0x00; -} - - -/************************************************************* - * - * pit8254 configuration - * - *************************************************************/ - -static const struct pit8253_config calchase_pit8254_config = -{ - { - { - 4772720/4, /* heartbeat IRQ */ - DEVCB_NULL, - DEVCB_DEVICE_LINE_MEMBER("pic8259_1", pic8259_device, ir0_w) - }, { - 4772720/4, /* dram refresh */ - DEVCB_NULL, - DEVCB_NULL - }, { - 4772720/4, /* pio port c pin 4, and speaker polling enough */ - DEVCB_NULL, - DEVCB_NULL - } - } -}; - void calchase_state::machine_reset() { //membank("bank1")->set_base(memregion("bios")->base() + 0x10000); @@ -875,43 +663,20 @@ void calchase_state::machine_reset() membank("bios_ext")->set_base(memregion("bios")->base() + 0); } -READ8_MEMBER(calchase_state::get_out2) -{ - return pit8253_get_output( m_pit8254, 2 ); -} - -static const struct kbdc8042_interface at8042 = -{ - KBDC8042_AT386, - DEVCB_CPU_INPUT_LINE("maincpu", INPUT_LINE_RESET), - DEVCB_CPU_INPUT_LINE("maincpu", INPUT_LINE_A20), - DEVCB_DEVICE_LINE_MEMBER("pic8259_1", pic8259_device, ir1_w), - DEVCB_NULL, - - DEVCB_NULL, - DEVCB_DRIVER_MEMBER(calchase_state,get_out2) -}; - static MACHINE_CONFIG_START( calchase, calchase_state ) MCFG_CPU_ADD("maincpu", PENTIUM, 133000000) // Cyrix 686MX-PR200 CPU MCFG_CPU_PROGRAM_MAP(calchase_map) MCFG_CPU_IO_MAP(calchase_io) - MCFG_PIT8254_ADD( "pit8254", calchase_pit8254_config ) - MCFG_I8237_ADD( "dma8237_1", XTAL_14_31818MHz/3, dma8237_1_config ) - MCFG_I8237_ADD( "dma8237_2", XTAL_14_31818MHz/3, dma8237_2_config ) - MCFG_PIC8259_ADD( "pic8259_1", WRITELINE(calchase_state,calchase_pic8259_1_set_int_line), VCC, READ8(calchase_state,get_slave_ack) ) - MCFG_PIC8259_ADD( "pic8259_2", DEVWRITELINE("pic8259_1", pic8259_device, ir2_w), GND, NULL ) + MCFG_FRAGMENT_ADD( pcat_common ) + MCFG_IDE_CONTROLLER_ADD("ide", ide_devices, "hdd", NULL, true) MCFG_IDE_CONTROLLER_IRQ_HANDLER(DEVWRITELINE("pic8259_2", pic8259_device, ir6_w)) - MCFG_MC146818_ADD( "rtc", MC146818_STANDARD ) MCFG_PCI_BUS_LEGACY_ADD("pcibus", 0) MCFG_PCI_BUS_LEGACY_DEVICE(0, NULL, intel82439tx_pci_r, intel82439tx_pci_w) MCFG_PCI_BUS_LEGACY_DEVICE(7, NULL, intel82371ab_pci_r, intel82371ab_pci_w) - MCFG_KBDC8042_ADD("kbdc", at8042) - /* video hardware */ MCFG_FRAGMENT_ADD( pcvideo_trident_vga ) |