From 13d9f05babc4a65863cbc0079812c1f0b950fbce Mon Sep 17 00:00:00 2001 From: cracyc Date: Sun, 30 Dec 2012 00:14:43 +0000 Subject: [PATCH] [mess] pc.c: make the tandys and other pc compatibles use the am9517a They can read floppies and boot now. --- src/mess/drivers/amstr_pc.c | 5 ++- src/mess/drivers/pc.c | 37 ++++++++++--------- src/mess/includes/pc.h | 10 ++++-- src/mess/machine/pc.c | 71 ++++++++++++++++++++++++------------- 4 files changed, 74 insertions(+), 49 deletions(-) diff --git a/src/mess/drivers/amstr_pc.c b/src/mess/drivers/amstr_pc.c index f37ba83c306..a52bd8fa962 100644 --- a/src/mess/drivers/amstr_pc.c +++ b/src/mess/drivers/amstr_pc.c @@ -57,7 +57,6 @@ More information can be found at http://www.seasip.info/AmstradXT/1640tech/index #include "formats/pc_dsk.h" #include "formats/mfi_dsk.h" -#include "machine/8237dma.h" #include "sound/sn76496.h" #include "machine/ram.h" @@ -81,7 +80,7 @@ static ADDRESS_MAP_START( ppc640_map, AS_PROGRAM, 16, pc_state ) ADDRESS_MAP_END static ADDRESS_MAP_START(ppc512_io, AS_IO, 16, pc_state ) - AM_RANGE(0x0000, 0x000f) AM_DEVREADWRITE8_LEGACY("dma8237", i8237_r, i8237_w, 0xffff) + AM_RANGE(0x0000, 0x000f) AM_DEVREADWRITE8("dma8237", am9517a_device, read, write, 0xffff) AM_RANGE(0x0020, 0x0021) AM_DEVREADWRITE8_LEGACY("pic8259", pic8259_r, pic8259_w, 0xffff) AM_RANGE(0x0040, 0x0043) AM_DEVREADWRITE8_LEGACY("pit8253", pit8253_r, pit8253_w, 0xffff) AM_RANGE(0x0060, 0x0065) AM_READWRITE8_LEGACY(pc1640_port60_r, pc1640_port60_w, 0xffff) @@ -110,7 +109,7 @@ static ADDRESS_MAP_START( pc200_map, AS_PROGRAM, 16, pc_state ) ADDRESS_MAP_END static ADDRESS_MAP_START(pc200_io, AS_IO, 16, pc_state ) - AM_RANGE(0x0000, 0x000f) AM_DEVREADWRITE8_LEGACY("dma8237", i8237_r, i8237_w, 0xffff) + AM_RANGE(0x0000, 0x000f) AM_DEVREADWRITE8("dma8237", am9517a_device, read, write, 0xffff) AM_RANGE(0x0020, 0x0021) AM_DEVREADWRITE8_LEGACY("pic8259", pic8259_r, pic8259_w, 0xffff) AM_RANGE(0x0040, 0x0043) AM_DEVREADWRITE8_LEGACY("pit8253", pit8253_r, pit8253_w, 0xffff) AM_RANGE(0x0060, 0x0065) AM_READWRITE8_LEGACY(pc1640_port60_r, pc1640_port60_w, 0xffff) diff --git a/src/mess/drivers/pc.c b/src/mess/drivers/pc.c index 9cc24e26e52..77bc22155d7 100644 --- a/src/mess/drivers/pc.c +++ b/src/mess/drivers/pc.c @@ -94,7 +94,7 @@ video HW too. #include "formats/mfi_dsk.h" #include "formats/pc_dsk.h" -#include "machine/8237dma.h" +#include "machine/am9517a.h" #include "sound/sn76496.h" #include "machine/wd17xx.h" @@ -192,7 +192,7 @@ ADDRESS_MAP_END static ADDRESS_MAP_START(pc8_io, AS_IO, 8, pc_state ) ADDRESS_MAP_UNMAP_HIGH - AM_RANGE(0x0000, 0x000f) AM_DEVREADWRITE_LEGACY("dma8237", i8237_r, i8237_w) + AM_RANGE(0x0000, 0x000f) AM_DEVREADWRITE("dma8237", am9517a_device, read, write) AM_RANGE(0x0020, 0x0021) AM_DEVREADWRITE_LEGACY("pic8259", pic8259_r, pic8259_w) AM_RANGE(0x0040, 0x0043) AM_DEVREADWRITE_LEGACY("pit8253", pit8253_r, pit8253_w) AM_RANGE(0x0060, 0x0063) AM_DEVREADWRITE("ppi8255", i8255_device, read, write) @@ -217,7 +217,7 @@ ADDRESS_MAP_END static ADDRESS_MAP_START(pc16_io, AS_IO, 16, pc_state ) ADDRESS_MAP_UNMAP_HIGH - AM_RANGE(0x0000, 0x000f) AM_DEVREADWRITE8_LEGACY("dma8237", i8237_r, i8237_w, 0xffff) + AM_RANGE(0x0000, 0x000f) AM_DEVREADWRITE8("dma8237", am9517a_device, read, write, 0xffff) AM_RANGE(0x0020, 0x0021) AM_DEVREADWRITE8_LEGACY("pic8259", pic8259_r, pic8259_w, 0xffff) AM_RANGE(0x0040, 0x0043) AM_DEVREADWRITE8_LEGACY("pit8253", pit8253_r, pit8253_w, 0xffff) AM_RANGE(0x0060, 0x0063) AM_DEVREADWRITE8("ppi8255", i8255_device, read, write, 0xffff) @@ -240,7 +240,7 @@ ADDRESS_MAP_END static ADDRESS_MAP_START(ec1841_io, AS_IO, 16, pc_state) ADDRESS_MAP_UNMAP_HIGH - AM_RANGE(0x0000, 0x000f) AM_DEVREADWRITE8_LEGACY("dma8237", i8237_r, i8237_w, 0xffff) + AM_RANGE(0x0000, 0x000f) AM_DEVREADWRITE8("dma8237", am9517a_device, read, write, 0xffff) AM_RANGE(0x0020, 0x0021) AM_DEVREADWRITE8_LEGACY("pic8259", pic8259_r, pic8259_w, 0xffff) AM_RANGE(0x0040, 0x0043) AM_DEVREADWRITE8_LEGACY("pit8253", pit8253_r, pit8253_w, 0xffff) AM_RANGE(0x0060, 0x0063) AM_DEVREADWRITE8("ppi8255", i8255_device, read, write, 0xffff) @@ -261,7 +261,7 @@ ADDRESS_MAP_END static ADDRESS_MAP_START(iskr1031_io, AS_IO, 16, pc_state) ADDRESS_MAP_UNMAP_HIGH - AM_RANGE(0x0000, 0x000f) AM_DEVREADWRITE8_LEGACY("dma8237", i8237_r, i8237_w, 0xffff) + AM_RANGE(0x0000, 0x000f) AM_DEVREADWRITE8("dma8237", am9517a_device, read, write, 0xffff) AM_RANGE(0x0020, 0x0021) AM_DEVREADWRITE8_LEGACY("pic8259", pic8259_r, pic8259_w, 0xffff) AM_RANGE(0x0040, 0x0043) AM_DEVREADWRITE8_LEGACY("pit8253", pit8253_r, pit8253_w, 0xffff) AM_RANGE(0x0060, 0x0063) AM_DEVREADWRITE8("ppi8255", i8255_device, read, write, 0xffff) @@ -293,7 +293,7 @@ READ8_MEMBER(pc_state::unk_r) static ADDRESS_MAP_START(ibm5550_io, AS_IO, 16, pc_state ) ADDRESS_MAP_UNMAP_HIGH - AM_RANGE(0x0000, 0x000f) AM_DEVREADWRITE8_LEGACY("dma8237", i8237_r, i8237_w, 0xffff) + AM_RANGE(0x0000, 0x000f) AM_DEVREADWRITE8("dma8237", am9517a_device, read, write, 0xffff) AM_RANGE(0x0020, 0x0021) AM_DEVREADWRITE8_LEGACY("pic8259", pic8259_r, pic8259_w, 0xffff) AM_RANGE(0x0040, 0x0043) AM_DEVREADWRITE8_LEGACY("pit8253", pit8253_r, pit8253_w, 0xffff) AM_RANGE(0x0060, 0x0063) AM_DEVREADWRITE8("ppi8255", i8255_device, read, write, 0xffff) @@ -325,7 +325,7 @@ ADDRESS_MAP_END static ADDRESS_MAP_START(europc_io, AS_IO, 8, pc_state ) - AM_RANGE(0x0000, 0x000f) AM_DEVREADWRITE_LEGACY("dma8237", i8237_r, i8237_w) + AM_RANGE(0x0000, 0x000f) AM_DEVREADWRITE("dma8237", am9517a_device, read, write) AM_RANGE(0x0020, 0x0021) AM_DEVREADWRITE_LEGACY("pic8259", pic8259_r, pic8259_w) AM_RANGE(0x0040, 0x0043) AM_DEVREADWRITE_LEGACY("pit8253", pit8253_r, pit8253_w) AM_RANGE(0x0060, 0x0063) AM_READWRITE_LEGACY(europc_pio_r, europc_pio_w) @@ -359,7 +359,7 @@ ADDRESS_MAP_END static ADDRESS_MAP_START(tandy1000_io, AS_IO, 8, pc_state ) - AM_RANGE(0x0000, 0x000f) AM_DEVREADWRITE_LEGACY("dma8237", i8237_r, i8237_w) + AM_RANGE(0x0000, 0x000f) AM_DEVREADWRITE("dma8237", am9517a_device, read, write) AM_RANGE(0x0020, 0x0021) AM_DEVREADWRITE_LEGACY("pic8259", pic8259_r, pic8259_w) AM_RANGE(0x0040, 0x0043) AM_DEVREADWRITE_LEGACY("pit8253", pit8253_r, pit8253_w) AM_RANGE(0x0060, 0x0063) AM_READWRITE_LEGACY(tandy1000_pio_r, tandy1000_pio_w) @@ -389,7 +389,7 @@ ADDRESS_MAP_END static ADDRESS_MAP_START(tandy1000_16_io, AS_IO, 16, pc_state ) - AM_RANGE(0x0000, 0x000f) AM_DEVREADWRITE8_LEGACY("dma8237", i8237_r, i8237_w, 0xffff) + AM_RANGE(0x0000, 0x000f) AM_DEVREADWRITE8("dma8237", am9517a_device, read, write, 0xffff) AM_RANGE(0x0020, 0x0021) AM_DEVREADWRITE8_LEGACY("pic8259", pic8259_r, pic8259_w, 0xffff) AM_RANGE(0x0040, 0x0043) AM_DEVREADWRITE8_LEGACY("pit8253", pit8253_r, pit8253_w, 0xffff) AM_RANGE(0x0060, 0x0063) AM_READWRITE8_LEGACY(tandy1000_pio_r, tandy1000_pio_w, 0xffff) @@ -420,7 +420,7 @@ ADDRESS_MAP_END static ADDRESS_MAP_START(tandy1000_286_io, AS_IO, 16, pc_state ) - AM_RANGE(0x0000, 0x000f) AM_DEVREADWRITE8_LEGACY("dma8237", i8237_r, i8237_w, 0xffff) + AM_RANGE(0x0000, 0x000f) AM_DEVREADWRITE8("dma8237", am9517a_device, read, write, 0xffff) AM_RANGE(0x0020, 0x0021) AM_DEVREADWRITE8_LEGACY("pic8259", pic8259_r, pic8259_w, 0xffff) AM_RANGE(0x0040, 0x0043) AM_DEVREADWRITE8_LEGACY("pit8253", pit8253_r, pit8253_w, 0xffff) AM_RANGE(0x0060, 0x0063) AM_READWRITE8_LEGACY(tandy1000_pio_r, tandy1000_pio_w, 0xffff) @@ -1141,14 +1141,17 @@ static MACHINE_CONFIG_START( t1000hx, pc_state ) MCFG_PC_FDC_XT_ADD("fdc") - MCFG_FLOPPY_DRIVE_ADD("fdc:0", ibmpc_floppies, "525dd", 0, pc_state::floppy_formats) - MCFG_FLOPPY_DRIVE_ADD("fdc:1", ibmpc_floppies, "525dd", 0, pc_state::floppy_formats) + MCFG_FLOPPY_DRIVE_ADD("fdc:0", ibmpc_floppies, "35dd", 0, pc_state::floppy_formats) /* internal ram */ MCFG_RAM_ADD(RAM_TAG) MCFG_RAM_DEFAULT_SIZE("640K") MACHINE_CONFIG_END +static MACHINE_CONFIG_DERIVED( t1000sx, t1000hx ) + MCFG_DEVICE_REMOVE("fdc:0") + MCFG_FLOPPY_DRIVE_ADD("fdc:0", ibmpc_floppies, "525dd", 0, pc_state::floppy_formats) +MACHINE_CONFIG_END static MACHINE_CONFIG_START( t1000_16, pc_state ) /* basic machine hardware */ @@ -1190,9 +1193,7 @@ static MACHINE_CONFIG_START( t1000_16, pc_state ) MCFG_PC_LPT_ADD("lpt_2", pc_lpt_config) MCFG_PC_FDC_XT_ADD("fdc") - - MCFG_FLOPPY_DRIVE_ADD("fdc:0", ibmpc_floppies, "525dd", 0, pc_state::floppy_formats) - MCFG_FLOPPY_DRIVE_ADD("fdc:1", ibmpc_floppies, "525dd", 0, pc_state::floppy_formats) + MCFG_FLOPPY_DRIVE_ADD("fdc:0", ibmpc_floppies, "35dd", 0, pc_state::floppy_formats) /* internal ram */ MCFG_RAM_ADD(RAM_TAG) @@ -1240,9 +1241,7 @@ static MACHINE_CONFIG_START( t1000_286, pc_state ) MCFG_PC_LPT_ADD("lpt_2", pc_lpt_config) MCFG_PC_FDC_XT_ADD("fdc") - - MCFG_FLOPPY_DRIVE_ADD("fdc:0", ibmpc_floppies, "525dd", 0, pc_state::floppy_formats) - MCFG_FLOPPY_DRIVE_ADD("fdc:1", ibmpc_floppies, "525dd", 0, pc_state::floppy_formats) + MCFG_FLOPPY_DRIVE_ADD("fdc:0", ibmpc_floppies, "35dd", 0, pc_state::floppy_formats) /* internal ram */ MCFG_RAM_ADD(RAM_TAG) @@ -2325,7 +2324,7 @@ COMP( 1985, ibmpcjx, ibm5150, 0, ibmpcjx, tandy1t, pc_state, // tandy 1000 COMP( 1987, t1000hx, ibm5150, 0, t1000hx, tandy1t, pc_state, t1000hx, "Tandy Radio Shack", "Tandy 1000 HX", 0) -COMP( 1987, t1000sx, ibm5150, 0, t1000hx, tandy1t, pc_state, t1000hx, "Tandy Radio Shack", "Tandy 1000 SX", GAME_NOT_WORKING) +COMP( 1987, t1000sx, ibm5150, 0, t1000sx, tandy1t, pc_state, t1000hx, "Tandy Radio Shack", "Tandy 1000 SX", GAME_NOT_WORKING) COMP( 1987, t1000tx, ibm5150, 0, t1000_286, tandy1t, pc_state, t1000hx, "Tandy Radio Shack", "Tandy 1000 TX", 0) COMP( 1989, t1000rl, ibm5150, 0, t1000_16, tandy1t, pc_state, t1000hx, "Tandy Radio Shack", "Tandy 1000 RL", 0) COMP( 1989, t1000tl2, ibm5150, 0, t1000_286, tandy1t, pc_state, t1000hx, "Tandy Radio Shack", "Tandy 1000 TL/2", 0) diff --git a/src/mess/includes/pc.h b/src/mess/includes/pc.h index 38969a04749..d9fcb9ed369 100644 --- a/src/mess/includes/pc.h +++ b/src/mess/includes/pc.h @@ -9,7 +9,7 @@ #include "machine/ins8250.h" #include "machine/i8255.h" -#include "machine/8237dma.h" +#include "machine/am9517a.h" #include "machine/serial.h" #include "machine/ser_mouse.h" #include "machine/pc_kbdc.h" @@ -20,13 +20,14 @@ class pc_state : public driver_device public: pc_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag) + , m_dma8237(*this, "dma8237") , m_pc_kbdc(*this, "pc_kbdc") { } cpu_device *m_maincpu; device_t *m_pic8259; - device_t *m_dma8237; + optional_device m_dma8237; device_t *m_pit8253; optional_device m_pc_kbdc; @@ -37,6 +38,7 @@ public: UINT8 m_memboard[4]; /* used only by ec1840 and ec1841 */ int m_dma_channel; UINT8 m_dma_offset[2][4]; + int m_cur_eop; UINT8 m_pc_spkrdata; UINT8 m_pc_input; UINT8 m_pcjr_dor; @@ -141,12 +143,14 @@ public: void fdc_interrupt(bool state); void fdc_dma_drq(bool state); + void pc_select_dma_channel(int channel, bool state); + void pc_eop_w(int channel, bool state); DECLARE_FLOPPY_FORMATS( floppy_formats ); }; /*----------- defined in machine/pc.c -----------*/ -extern const i8237_interface ibm5150_dma8237_config; +extern const struct am9517a_interface ibm5150_dma8237_config; extern const struct pit8253_config ibm5150_pit8253_config; extern const struct pit8253_config pcjr_pit8253_config; extern const struct pit8253_config mc1502_pit8253_config; diff --git a/src/mess/machine/pc.c b/src/mess/machine/pc.c index e001c4c39e1..ca2a7b0a0b7 100644 --- a/src/mess/machine/pc.c +++ b/src/mess/machine/pc.c @@ -36,7 +36,7 @@ #include "imagedev/cassette.h" #include "sound/speaker.h" -#include "machine/8237dma.h" +#include "machine/am9517a.h" #include "machine/wd17xx.h" #include "machine/ram.h" @@ -167,28 +167,29 @@ WRITE8_MEMBER(pc_state::pc_page_w) WRITE_LINE_MEMBER(pc_state::pc_dma_hrq_changed) { - device_t *device = machine().device("dma8237"); m_maincpu->set_input_line(INPUT_LINE_HALT, state ? ASSERT_LINE : CLEAR_LINE); /* Assert HLDA */ - i8237_hlda_w( device, state ); + m_dma8237->hack_w(state); } READ8_MEMBER(pc_state::pc_dma_read_byte) { - UINT8 result; + if(m_dma_channel == -1) + return 0xff; address_space& prog_space = m_maincpu->space(AS_PROGRAM); offs_t page_offset = (((offs_t) m_dma_offset[0][m_dma_channel]) << 16) & 0x0F0000; - result = prog_space.read_byte( page_offset + offset); - return result; + return prog_space.read_byte( page_offset + offset); } WRITE8_MEMBER(pc_state::pc_dma_write_byte) { + if(m_dma_channel == -1) + return; address_space& prog_space = m_maincpu->space(AS_PROGRAM); offs_t page_offset = (((offs_t) m_dma_offset[0][m_dma_channel]) << 16) & 0x0F0000; @@ -223,26 +224,50 @@ WRITE8_MEMBER(pc_state::pc_dma8237_hdc_dack_w) WRITE8_MEMBER(pc_state::pc_dma8237_0_dack_w) { m_u73_q2 = 0; - i8237_dreq0_w( m_dma8237, m_u73_q2 ); + m_dma8237->dreq0_w( m_u73_q2 ); +} + +void pc_state::pc_eop_w(int channel, bool state) +{ + switch(channel) + { + case 2: + machine().device("fdc")->tc_w(state); + break; + case 0: + case 1: + case 3: + default: + break; + } } WRITE_LINE_MEMBER(pc_state::pc_dma8237_out_eop) { - machine().device("fdc")->tc_w(state == ASSERT_LINE); + m_cur_eop = state == ASSERT_LINE; + if(m_dma_channel != -1 && m_cur_eop) + pc_eop_w(m_dma_channel, m_cur_eop ? ASSERT_LINE : CLEAR_LINE); } -static void set_dma_channel(running_machine &machine, int channel, int state) +void pc_state::pc_select_dma_channel(int channel, bool state) { - pc_state *st = machine.driver_data(); + if(!state) { + m_dma_channel = channel; + if(m_cur_eop) + pc_eop_w(channel, ASSERT_LINE ); - if (!state) st->m_dma_channel = channel; + } else if(m_dma_channel == channel) { + m_dma_channel = -1; + if(m_cur_eop) + pc_eop_w(channel, CLEAR_LINE ); + } } -WRITE_LINE_MEMBER(pc_state::pc_dack0_w){ set_dma_channel(machine(), 0, state); } -WRITE_LINE_MEMBER(pc_state::pc_dack1_w){ set_dma_channel(machine(), 1, state); } -WRITE_LINE_MEMBER(pc_state::pc_dack2_w){ set_dma_channel(machine(), 2, state); } -WRITE_LINE_MEMBER(pc_state::pc_dack3_w){ set_dma_channel(machine(), 3, state); } +WRITE_LINE_MEMBER(pc_state::pc_dack0_w){ pc_select_dma_channel(0, state); } +WRITE_LINE_MEMBER(pc_state::pc_dack1_w){ pc_select_dma_channel(1, state); } +WRITE_LINE_MEMBER(pc_state::pc_dack2_w){ pc_select_dma_channel(2, state); } +WRITE_LINE_MEMBER(pc_state::pc_dack3_w){ pc_select_dma_channel(3, state); } I8237_INTERFACE( ibm5150_dma8237_config ) { @@ -354,7 +379,7 @@ WRITE_LINE_MEMBER(pc_state::ibm5150_pit8253_out1_changed) if ( m_out1 == 0 && state == 1 && m_u73_q2 == 0 ) { m_u73_q2 = 1; - i8237_dreq0_w( m_dma8237, m_u73_q2 ); + m_dma8237->dreq0_w( m_u73_q2 ); } m_out1 = state; } @@ -1135,7 +1160,7 @@ void pc_state::fdc_interrupt(bool state) void pc_state::fdc_dma_drq(bool state) { - i8237_dreq2_w( m_dma8237, state); + m_dma8237->dreq2_w( state ); } static void pc_set_irq_line(running_machine &machine,int irq, int state) @@ -1438,8 +1463,9 @@ static IRQ_CALLBACK(pc_irq_callback) MACHINE_START_MEMBER(pc_state,pc) { m_pic8259 = machine().device("pic8259"); - m_dma8237 = machine().device("dma8237"); m_pit8253 = machine().device("pit8253"); + m_maincpu = machine().device("maincpu" ); + m_maincpu->set_irq_acknowledge_callback(pc_irq_callback); pc_fdc_interface *fdc = machine().device("fdc"); fdc->setup_intrq_cb(pc_fdc_interface::line_cb(FUNC(pc_state::fdc_interrupt), this)); @@ -1450,14 +1476,13 @@ MACHINE_START_MEMBER(pc_state,pc) MACHINE_RESET_MEMBER(pc_state,pc) { device_t *speaker = machine().device(SPEAKER_TAG); - m_maincpu = machine().device("maincpu" ); - m_maincpu->set_irq_acknowledge_callback(pc_irq_callback); m_u73_q2 = 0; m_out1 = 0; m_pc_spkrdata = 0; m_pc_input = 1; - m_dma_channel = 0; + m_dma_channel = -1; + m_cur_eop = 0; memset(m_dma_offset,0,sizeof(m_dma_offset)); m_ppi_portc_switch_high = 0; m_ppi_speaker = 0; @@ -1479,7 +1504,6 @@ MACHINE_START_MEMBER(pc_state,mc1502) m_maincpu->set_irq_acknowledge_callback(pc_irq_callback); m_pic8259 = machine().device("pic8259"); - m_dma8237 = NULL; m_pit8253 = machine().device("pit8253"); /* @@ -1507,7 +1531,6 @@ MACHINE_START_MEMBER(pc_state,pcjr) m_pic8259 = machine().device("pic8259"); - m_dma8237 = NULL; m_pit8253 = machine().device("pit8253"); } @@ -1518,7 +1541,7 @@ MACHINE_RESET_MEMBER(pc_state,pcjr) m_out1 = 0; m_pc_spkrdata = 0; m_pc_input = 1; - m_dma_channel = 0; + m_dma_channel = -1; memset(m_memboard,0xc,sizeof(m_memboard)); // check memset(m_dma_offset,0,sizeof(m_dma_offset)); m_ppi_portc_switch_high = 0;