[mess] pc.c: make the tandys and other pc compatibles use the am9517a

They can read floppies and boot now.
This commit is contained in:
cracyc 2012-12-30 00:14:43 +00:00
parent ca57cd9929
commit 13d9f05bab
4 changed files with 74 additions and 49 deletions

View File

@ -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)

View File

@ -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)

View File

@ -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<am9517a_device> m_dma8237;
device_t *m_pit8253;
optional_device<pc_kbdc_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;

View File

@ -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<pc_fdc_interface>("fdc")->tc_w(state);
break;
case 0:
case 1:
case 3:
default:
break;
}
}
WRITE_LINE_MEMBER(pc_state::pc_dma8237_out_eop)
{
machine().device<pc_fdc_interface>("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<pc_state>();
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<cpu_device>("maincpu" );
m_maincpu->set_irq_acknowledge_callback(pc_irq_callback);
pc_fdc_interface *fdc = machine().device<pc_fdc_interface>("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<cpu_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;