diff options
author | mahlemiut <mahlemiut@users.noreply.github.com> | 2014-05-09 04:04:16 +0000 |
---|---|---|
committer | mahlemiut <mahlemiut@users.noreply.github.com> | 2014-05-09 04:04:16 +0000 |
commit | 2e6d84897003ed81668c7260798d8287321c81cb (patch) | |
tree | 7d8f1735e33f5b8bd527e19ca6db6374b3d527a8 /src/mess | |
parent | e9d7a93382ca9563e3c9796103feda7ee5c0c678 (diff) |
Created WD7600 chipset device.
megapc: Made into a separate driver class, hooked up WD7600. [Barry Rodewald]
Diffstat (limited to 'src/mess')
-rw-r--r-- | src/mess/drivers/at.c | 143 | ||||
-rw-r--r-- | src/mess/includes/at.h | 25 | ||||
-rw-r--r-- | src/mess/mess.mak | 1 |
3 files changed, 140 insertions, 29 deletions
diff --git a/src/mess/drivers/at.c b/src/mess/drivers/at.c index bd4ea8940c9..673481ad1a4 100644 --- a/src/mess/drivers/at.c +++ b/src/mess/drivers/at.c @@ -13,7 +13,6 @@ #include "includes/at.h" #include "bus/pc_kbd/keyboards.h" - static ADDRESS_MAP_START( at16_map, AS_PROGRAM, 16, at_state ) AM_RANGE(0x000000, 0x09ffff) AM_RAMBANK("bank10") AM_RANGE(0x0c0000, 0x0c7fff) AM_ROM @@ -195,30 +194,43 @@ static ADDRESS_MAP_START( at586_io, AS_IO, 32, at586_state ) AM_RANGE(0x0cf8, 0x0cff) AM_DEVREADWRITE("pcibus", pci_bus_device, read, write) ADDRESS_MAP_END +READ16_MEMBER( megapc_state::wd7600_ior ) +{ + if (offset < 4) + return m_isabus->dack_r(offset); + else + return m_isabus->dack16_r(offset); +} + +WRITE16_MEMBER( megapc_state::wd7600_iow ) +{ + if (offset < 4) + m_isabus->dack_w(offset, data); + else + m_isabus->dack16_w(offset, data); +} + +WRITE_LINE_MEMBER( megapc_state::wd7600_hold ) +{ + // halt cpu + m_maincpu->set_input_line(INPUT_LINE_HALT, state ? ASSERT_LINE : CLEAR_LINE); + + // and acknowledge hold + m_wd7600->hlda_w(state); +} + +static ADDRESS_MAP_START( megapc_map, AS_PROGRAM, 16, at_state ) +ADDRESS_MAP_END + +static ADDRESS_MAP_START( megapcpl_map, AS_PROGRAM, 32, at_state ) +ADDRESS_MAP_END + static ADDRESS_MAP_START( megapc_io, AS_IO, 16, at_state ) ADDRESS_MAP_UNMAP_HIGH - AM_RANGE(0x0000, 0x001f) AM_DEVREADWRITE8("dma8237_1", am9517a_device, read, write, 0xffff) - AM_RANGE(0x0020, 0x003f) AM_DEVREADWRITE8("pic8259_master", pic8259_device, read, write, 0xffff) - AM_RANGE(0x0040, 0x005f) AM_DEVREADWRITE8("pit8254", pit8254_device, read, write, 0xffff) - AM_RANGE(0x0060, 0x0063) AM_READWRITE8(at_keybc_r, at_keybc_w, 0xffff) // TODO: is this the correct type? - AM_RANGE(0x0064, 0x0067) AM_DEVREADWRITE8("keybc", at_keyboard_controller_device, status_r, command_w, 0xffff) - AM_RANGE(0x0070, 0x007f) AM_DEVREADWRITE8("rtc", mc146818_device, read, write , 0xffff) - AM_RANGE(0x0080, 0x009f) AM_READWRITE8(at_page8_r, at_page8_w, 0xffff) - AM_RANGE(0x00a0, 0x00bf) AM_DEVREADWRITE8("pic8259_slave", pic8259_device, read, write, 0xffff) - AM_RANGE(0x00c0, 0x00df) AM_READWRITE8(at_dma8237_2_r, at_dma8237_2_w, 0xffff) ADDRESS_MAP_END static ADDRESS_MAP_START( megapcpl_io, AS_IO, 32, at_state ) ADDRESS_MAP_UNMAP_HIGH - AM_RANGE(0x0000, 0x001f) AM_DEVREADWRITE8("dma8237_1", am9517a_device, read, write, 0xffffffff) - AM_RANGE(0x0020, 0x003f) AM_DEVREADWRITE8("pic8259_master", pic8259_device, read, write, 0xffffffff) - AM_RANGE(0x0040, 0x005f) AM_DEVREADWRITE8("pit8254", pit8254_device, read, write, 0xffffffff) - AM_RANGE(0x0060, 0x0063) AM_READWRITE8(at_keybc_r, at_keybc_w, 0xffff) // TODO: is this the correct type? - AM_RANGE(0x0064, 0x0067) AM_DEVREADWRITE8("keybc", at_keyboard_controller_device, status_r, command_w, 0xffff) - AM_RANGE(0x0070, 0x007f) AM_DEVREADWRITE8("rtc", mc146818_device, read, write , 0xffffffff) - AM_RANGE(0x0080, 0x009f) AM_READWRITE8(at_page8_r, at_page8_w, 0xffffffff) - AM_RANGE(0x00a0, 0x00bf) AM_DEVREADWRITE8("pic8259_slave", pic8259_device, read, write, 0xffffffff) - AM_RANGE(0x00c0, 0x00df) AM_READWRITE8(at_dma8237_2_r, at_dma8237_2_w, 0xffffffff) ADDRESS_MAP_END @@ -726,21 +738,92 @@ static MACHINE_CONFIG_DERIVED( ct386sx, neat ) MCFG_CPU_IRQ_ACKNOWLEDGE_DEVICE("pic8259_master", pic8259_device, inta_cb) MACHINE_CONFIG_END -static MACHINE_CONFIG_DERIVED( megapc, atvga ) - MCFG_CPU_REPLACE("maincpu", I386SX, XTAL_50MHz / 2) - MCFG_CPU_PROGRAM_MAP(at16_map) +static MACHINE_CONFIG_START( megapc, megapc_state ) + MCFG_CPU_ADD("maincpu", I386SX, XTAL_50MHz / 2) + MCFG_CPU_PROGRAM_MAP(megapc_map) MCFG_CPU_IO_MAP(megapc_io) - MCFG_CPU_IRQ_ACKNOWLEDGE_DEVICE("pic8259_master", pic8259_device, inta_cb) + MCFG_CPU_IRQ_ACKNOWLEDGE_DEVICE("wd7600", wd7600_device, intack_cb) + + MCFG_WD7600_ADD("wd7600",XTAL_50MHz / 2, ":maincpu", ":isa", ":bios", ":keybc") + MCFG_WD7600_HOLD(WRITELINE(megapc_state, wd7600_hold)); + MCFG_WD7600_NMI(INPUTLINE("maincpu", INPUT_LINE_NMI)); + MCFG_WD7600_INTR(INPUTLINE("maincpu", INPUT_LINE_IRQ0)); + MCFG_WD7600_CPURESET(INPUTLINE("maincpu", INPUT_LINE_RESET)); + MCFG_WD7600_A20M(INPUTLINE("maincpu", INPUT_LINE_A20)); + // isa dma + MCFG_WD7600_IOR(READ16(megapc_state, wd7600_ior)) + MCFG_WD7600_IOW(WRITE16(megapc_state, wd7600_iow)) + MCFG_WD7600_TC(WRITE8(megapc_state, wd7600_tc)) + // speaker + MCFG_WD7600_SPKR(WRITELINE(megapc_state, wd7600_spkr)) + + // on board devices + MCFG_DEVICE_ADD("isabus", ISA16, 0) + MCFG_ISA16_CPU(":maincpu") + MCFG_ISA_BUS_IOCHCK(DEVWRITELINE("wd7600", wd7600_device, iochck_w)) + MCFG_ISA_OUT_IRQ2_CB(DEVWRITELINE("wd7600", wd7600_device, irq09_w)) + MCFG_ISA_OUT_IRQ3_CB(DEVWRITELINE("wd7600", wd7600_device, irq03_w)) + MCFG_ISA_OUT_IRQ4_CB(DEVWRITELINE("wd7600", wd7600_device, irq04_w)) + MCFG_ISA_OUT_IRQ5_CB(DEVWRITELINE("wd7600", wd7600_device, irq05_w)) + MCFG_ISA_OUT_IRQ6_CB(DEVWRITELINE("wd7600", wd7600_device, irq06_w)) + MCFG_ISA_OUT_IRQ7_CB(DEVWRITELINE("wd7600", wd7600_device, irq07_w)) + MCFG_ISA_OUT_IRQ10_CB(DEVWRITELINE("wd7600", wd7600_device, irq10_w)) + MCFG_ISA_OUT_IRQ11_CB(DEVWRITELINE("wd7600", wd7600_device, irq11_w)) + MCFG_ISA_OUT_IRQ12_CB(DEVWRITELINE("wd7600", wd7600_device, irq12_w)) + MCFG_ISA_OUT_IRQ14_CB(DEVWRITELINE("wd7600", wd7600_device, irq14_w)) + MCFG_ISA_OUT_IRQ15_CB(DEVWRITELINE("wd7600", wd7600_device, irq15_w)) + MCFG_ISA_OUT_DRQ0_CB(DEVWRITELINE("wd7600", wd7600_device, dreq0_w)) + MCFG_ISA_OUT_DRQ1_CB(DEVWRITELINE("wd7600", wd7600_device, dreq1_w)) + MCFG_ISA_OUT_DRQ2_CB(DEVWRITELINE("wd7600", wd7600_device, dreq2_w)) + MCFG_ISA_OUT_DRQ3_CB(DEVWRITELINE("wd7600", wd7600_device, dreq3_w)) + MCFG_ISA_OUT_DRQ5_CB(DEVWRITELINE("wd7600", wd7600_device, dreq5_w)) + MCFG_ISA_OUT_DRQ6_CB(DEVWRITELINE("wd7600", wd7600_device, dreq6_w)) + MCFG_ISA_OUT_DRQ7_CB(DEVWRITELINE("wd7600", wd7600_device, dreq7_w)) + MCFG_ISA16_SLOT_ADD("isabus","board1", pc_isa16_cards, "fdcsmc", true) + MCFG_ISA16_SLOT_ADD("isabus","board2", pc_isa16_cards, "comat", true) + MCFG_ISA16_SLOT_ADD("isabus","board3", pc_isa16_cards, "ide", true) + MCFG_ISA16_SLOT_ADD("isabus","board4", pc_isa16_cards, "lpt", true) + MCFG_ISA16_SLOT_ADD("isabus","board5", pc_isa16_cards, "vga", true) + // ISA cards + MCFG_ISA16_SLOT_ADD("isabus","isa1", pc_isa16_cards, NULL, false) + + MCFG_DEVICE_ADD("keybc", AT_KEYBOARD_CONTROLLER, XTAL_12MHz) + MCFG_AT_KEYBOARD_CONTROLLER_SYSTEM_RESET_CB(DEVWRITELINE("wd7600", wd7600_device, kbrst_w)) + MCFG_AT_KEYBOARD_CONTROLLER_GATE_A20_CB(DEVWRITELINE("wd7600", wd7600_device, gatea20_w)) + MCFG_AT_KEYBOARD_CONTROLLER_INPUT_BUFFER_FULL_CB(DEVWRITELINE("wd7600", wd7600_device, irq01_w)) + MCFG_AT_KEYBOARD_CONTROLLER_KEYBOARD_CLOCK_CB(DEVWRITELINE("pc_kbdc", pc_kbdc_device, clock_write_from_mb)) + MCFG_AT_KEYBOARD_CONTROLLER_KEYBOARD_DATA_CB(DEVWRITELINE("pc_kbdc", pc_kbdc_device, data_write_from_mb)) + MCFG_DEVICE_ADD("pc_kbdc", PC_KBDC, 0) + MCFG_PC_KBDC_OUT_CLOCK_CB(DEVWRITELINE("keybc", at_keyboard_controller_device, keyboard_clock_w)) + MCFG_PC_KBDC_OUT_DATA_CB(DEVWRITELINE("keybc", at_keyboard_controller_device, keyboard_data_w)) + MCFG_PC_KBDC_SLOT_ADD("pc_kbdc", "kbd", pc_at_keyboards, STR_KBD_MICROSOFT_NATURAL) + + /* internal ram */ + MCFG_RAM_ADD(RAM_TAG) + MCFG_RAM_DEFAULT_SIZE("4M") + MCFG_RAM_EXTRA_OPTIONS("1M,2M,8M,15M,16M") + + // sound hardware + MCFG_SPEAKER_STANDARD_MONO("mono") + MCFG_SOUND_ADD("speaker", SPEAKER_SOUND, 0) + MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50) + + // video hardware + MCFG_PALETTE_ADD("palette", 256) // todo: really needed? /* software lists */ + MCFG_SOFTWARE_LIST_ADD("pc_disk_list","ibm5150") + MCFG_SOFTWARE_LIST_ADD("xt_disk_list","ibm5160_flop") + MCFG_SOFTWARE_LIST_ADD("at_disk_list","ibm5170") + MCFG_SOFTWARE_LIST_ADD("at_cdrom_list","ibm5170_cdrom") MCFG_SOFTWARE_LIST_ADD("disk_list","megapc") MACHINE_CONFIG_END static MACHINE_CONFIG_DERIVED( megapcpl, megapc ) MCFG_CPU_REPLACE("maincpu", I486, 66000000 / 2) - MCFG_CPU_PROGRAM_MAP(at386_map) + MCFG_CPU_PROGRAM_MAP(megapcpl_map) MCFG_CPU_IO_MAP(megapcpl_io) - MCFG_CPU_IRQ_ACKNOWLEDGE_DEVICE("pic8259_master", pic8259_device, inta_cb) + MCFG_CPU_IRQ_ACKNOWLEDGE_DEVICE("wd7600", wd7600_device, intack_cb) MACHINE_CONFIG_END @@ -1403,13 +1486,15 @@ ROM_START( aprfte ) ROM_END ROM_START( megapc ) - ROM_REGION(0x1000000,"maincpu", 0) + ROM_REGION(0x40000, "isa", ROMREGION_ERASEFF) + ROM_REGION(0x100000, "bios", 0) ROM_LOAD16_BYTE( "41651-bios lo.u18", 0xe0000, 0x10000, CRC(1e9bd3b7) SHA1(14fd39ec12df7fae99ccdb0484ee097d93bf8d95)) ROM_LOAD16_BYTE( "211253-bios hi.u19", 0xe0001, 0x10000, CRC(6acb573f) SHA1(376d483db2bd1c775d46424e1176b24779591525)) ROM_END ROM_START( megapcpl ) - ROM_REGION(0x1000000,"maincpu", 0) + ROM_REGION(0x40000, "isa", ROMREGION_ERASEFF) + ROM_REGION(0x100000, "bios", 0) ROM_LOAD16_BYTE( "41652.u18", 0xe0000, 0x10000, CRC(6f5b9a1c) SHA1(cae981a35a01234fcec99a96cb38075d7bf23474)) ROM_LOAD16_BYTE( "486slc.u19", 0xe0001, 0x10000, CRC(6fb7e3e9) SHA1(c439cb5a0d83176ceb2a3555e295dc1f84d85103)) ROM_END @@ -1464,8 +1549,8 @@ COMP ( 1990, at586, ibm5170, 0, at586, atvga, at586_state, at586, COMP ( 1990, at586x3, ibm5170, 0, at586x3, atvga, at586_state, at586, "<generic>", "PC/AT 586 (PIIX3)", GAME_NOT_WORKING ) COMP ( 1989, neat, ibm5170, 0, neat, atvga, at_state, atvga, "<generic>", "NEAT (VGA, MF2 Keyboard)", GAME_NOT_WORKING ) COMP ( 1993, ec1849, ibm5170, 0, ec1849, atcga, at_state, atcga, "<unknown>", "EC-1849", GAME_NOT_WORKING ) -COMP ( 1993, megapc, ibm5170, 0, megapc, atvga, at_state, atvga, "Amstrad plc", "MegaPC", GAME_NOT_WORKING ) -COMP ( 199?, megapcpl, ibm5170, 0, megapcpl, atvga, at_state, atvga, "Amstrad plc", "MegaPC Plus", GAME_NOT_WORKING ) +COMP ( 1993, megapc, 0, 0, megapc, 0, driver_device, 0, "Amstrad plc", "MegaPC", GAME_NOT_WORKING ) +COMP ( 199?, megapcpl, megapc, 0, megapcpl, 0, driver_device, 0, "Amstrad plc", "MegaPC Plus", GAME_NOT_WORKING ) COMP ( 1989, pc2386, ibm5170, 0, at386, atvga, at_state, atvga, "Amstrad plc", "Amstrad PC2386", GAME_NOT_WORKING ) COMP ( 1991, aprfte, ibm5170, 0, at486, atvga, at_state, atvga, "Apricot", "Apricot FT//ex 486 (J3 Motherboard)", GAME_NOT_WORKING ) COMP ( 1991, ftsserv, ibm5170, 0, at486, atvga, at_state, atvga, "Apricot", "Apricot FTs (Scorpion)", GAME_NOT_WORKING ) diff --git a/src/mess/includes/at.h b/src/mess/includes/at.h index 27100daeae6..eccae4c5894 100644 --- a/src/mess/includes/at.h +++ b/src/mess/includes/at.h @@ -22,6 +22,7 @@ #include "bus/pci/i82439tx.h" #include "machine/cs8221.h" #include "machine/pit8253.h" +#include "machine/wd7600.h" #include "machine/idectrl.h" #include "machine/at_keybc.h" @@ -161,4 +162,28 @@ public: UINT32 at_286_a20(bool state); }; +class megapc_state : public driver_device +{ +public: + megapc_state(const machine_config &mconfig, device_type type, const char *tag) + : driver_device(mconfig, type, tag), + m_maincpu(*this, "maincpu"), + m_wd7600(*this, "wd7600"), + m_isabus(*this, "isabus"), + m_speaker(*this, "speaker") + { } + +public: + required_device<cpu_device> m_maincpu; + required_device<wd7600_device> m_wd7600; + required_device<isa16_device> m_isabus; + required_device<speaker_sound_device> m_speaker; + + DECLARE_READ16_MEMBER( wd7600_ior ); + DECLARE_WRITE16_MEMBER( wd7600_iow ); + DECLARE_WRITE_LINE_MEMBER( wd7600_hold ); + DECLARE_WRITE8_MEMBER( wd7600_tc ) { m_isabus->eop_w(offset, data); } + DECLARE_WRITE_LINE_MEMBER( wd7600_spkr ) { m_speaker->level_w(state); } +}; + #endif /* AT_H_ */ diff --git a/src/mess/mess.mak b/src/mess/mess.mak index 27f9d2652b3..a1638fc85b0 100644 --- a/src/mess/mess.mak +++ b/src/mess/mess.mak @@ -527,6 +527,7 @@ MACHINES += WD11C00_17 MACHINES += WD17XX MACHINES += WD2010 MACHINES += WD33C93 +MACHINES += WD7600 MACHINES += X2212 MACHINES += X76F041 MACHINES += X76F100 |