(mess) pcd: doesn't display anything yet but almost completes post (nw)

This commit is contained in:
cracyc 2015-02-08 21:08:26 -06:00
parent c0177c6790
commit 7c8cb9ef5a
4 changed files with 156 additions and 36 deletions

View File

@ -1035,11 +1035,14 @@ void i80186_cpu_device::device_timer(emu_timer &timer, device_timer_id id, int p
count = count ? count : 0x10000;
if(!(t->control & 4))
t->int_timer->adjust((attotime::from_hz(clock()/8) * count), which);
t->count = 0;
if (LOG_TIMER) logerror(" Repriming interrupt\n");
}
else
{
t->int_timer->adjust(attotime::never, which);
t->control &= ~0x8000;
}
t->count = 0;
break;
}
@ -1245,8 +1248,8 @@ void i80186_cpu_device::drq_callback(int which)
// Do the transfer, 80188 is incapable of word transfers
if ((dma->control & BYTE_WORD) && (m_program->data_width() == 16))
{
dma_word = src_space->read_word(dma->source);
dest_space->write_word(dma->dest, dma_word);
dma_word = src_space->read_word_unaligned(dma->source);
dest_space->write_word_unaligned(dma->dest, dma_word);
incdec_size = 2;
}
else
@ -1675,6 +1678,12 @@ WRITE16_MEMBER(i80186_cpu_device::internal_port_w)
if (LOG_PORTS) logerror("%05X:80186 DMA%d control = %04X\n", pc(), (offset - 0x65) / 8, data);
which = (offset - 0x65) / 8;
update_dma_control(which, data);
if((m_dma[which].control & (SYNC_MASK | ST_STOP | TIMER_DRQ)) == ST_STOP)
{
// TODO: don't do this
while(m_dma[which].control & ST_STOP)
drq_callback(which);
}
break;
case 0x7f:

View File

@ -278,7 +278,11 @@ WRITE8_MEMBER( mc2661_device::write )
m_write_txrdy(CLEAR_LINE);
}
if(COMMAND_MODE == 0x02) // loopback - the Wicat will set this after enabling the transmitter
{
m_rhr = data;
m_sr |= STATUS_RXRDY; // pcd expects this
m_write_rxrdy(ASSERT_LINE);
}
break;
case REGISTER_SYNC:

View File

@ -19,7 +19,7 @@
#include "machine/wd_fdc.h"
#include "machine/mc146818.h"
#include "sound/speaker.h"
#include "video/scn2674.h"
//**************************************************************************
// TYPE DEFINITIONS
@ -36,21 +36,32 @@ public:
m_speaker(*this, "speaker"),
m_sasi(*this, "sasi"),
m_fdc(*this, "fdc"),
m_rtc(*this, "rtc")
m_rtc(*this, "rtc"),
m_crtc(*this, "crtc"),
m_vram(*this, "vram"),
m_charram(8*1024)
{ }
DECLARE_WRITE_LINE_MEMBER( pic1_irq );
DECLARE_READ8_MEMBER( pic1_slave_ack_r );
DECLARE_READ8_MEMBER( irq_callback );
TIMER_DEVICE_CALLBACK_MEMBER( timer0_tick );
DECLARE_WRITE_LINE_MEMBER( i186_timer1_w );
DECLARE_READ8_MEMBER( crt_data_r );
DECLARE_WRITE8_MEMBER( crt_data_w );
DECLARE_READ8_MEMBER( crt_status_r );
DECLARE_READ8_MEMBER( charram_r );
DECLARE_WRITE8_MEMBER( charram_w );
DECLARE_READ16_MEMBER( nmi_io_r );
DECLARE_WRITE16_MEMBER( nmi_io_w );
DECLARE_READ16_MEMBER( unk_r );
DECLARE_WRITE16_MEMBER( unk_w );
DECLARE_READ8_MEMBER( stat_r );
DECLARE_WRITE8_MEMBER( stat_w );
DECLARE_READ8_MEMBER( led_r );
DECLARE_WRITE8_MEMBER( led_w );
UINT32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
protected:
// driver_device overrides
virtual void machine_start();
virtual void machine_reset();
private:
required_device<i80186_cpu_device> m_maincpu;
@ -60,6 +71,10 @@ private:
required_device<omti5100_device> m_sasi;
required_device<wd2793_t> m_fdc;
required_device<mc146818_device> m_rtc;
required_device<scn2674_device> m_crtc;
required_shared_ptr<UINT16> m_vram;
dynamic_buffer m_charram;
UINT8 m_stat, m_led;
};
@ -67,22 +82,32 @@ private:
// MACHINE EMULATION
//**************************************************************************
static const gfx_layout pcd_charlayout =
{
8, 14, /* 8 x 14 characters */
512, /* 512 characters */
1, /* 1 bits per pixel */
{ 0 }, /* no bitplanes */
/* x offsets */
{ 0, 1, 2, 3, 4, 5, 6, 7 },
/* y offsets */
{ 0*8, 1*8, 2*8, 3*8, 4*8, 5*8, 6*8, 7*8, 8*8, 9*8, 10*8, 11*8, 12*8, 13*8, 14*8 },
8*16
};
void pcd_state::machine_start()
{
machine().device<gfxdecode_device>("gfxdecode")->set_gfx(0, global_alloc(gfx_element(machine().device<palette_device>("palette"), pcd_charlayout, m_charram, 0, 2, 0)));
}
WRITE_LINE_MEMBER( pcd_state::pic1_irq )
void pcd_state::machine_reset()
{
logerror("pic1 irq: %d\n", state);
m_maincpu->int0_w(state); // ?
m_stat = 0;
m_led = 0;
}
READ8_MEMBER( pcd_state::pic1_slave_ack_r )
READ8_MEMBER( pcd_state::irq_callback )
{
if (offset == 0) // irq 0
return m_pic2->acknowledge();
return 0x00;
return (offset ? m_pic2 : m_pic1)->acknowledge();
}
TIMER_DEVICE_CALLBACK_MEMBER( pcd_state::timer0_tick )
@ -96,23 +121,73 @@ WRITE_LINE_MEMBER( pcd_state::i186_timer1_w )
m_speaker->level_w(state);
}
READ8_MEMBER( pcd_state::crt_data_r )
READ8_MEMBER( pcd_state::charram_r )
{
logerror("crt_data_r @ %02x\n", offset);
return 0xff;
return m_charram[offset >> 1];
}
WRITE8_MEMBER( pcd_state::crt_data_w )
WRITE8_MEMBER( pcd_state::charram_w )
{
logerror("crt_data_w %02x @ %02x\n", data, offset);
m_charram[offset >> 1] = data;
}
READ8_MEMBER( pcd_state::crt_status_r )
READ16_MEMBER( pcd_state::nmi_io_r )
{
logerror("crt_status_r @ %02x\n", offset);
return 0xff;
if(space.debugger_access())
return 0;
logerror("%s: unmapped %s %04x\n", machine().describe_context(), space.name(), offset << 1);
m_stat |= 8;
m_maincpu->set_input_line(INPUT_LINE_NMI, PULSE_LINE);
return 0;
}
WRITE16_MEMBER( pcd_state::nmi_io_w )
{
if(space.debugger_access())
return;
logerror("%s: unmapped %s %04x\n", machine().describe_context(), space.name(), offset << 1);
m_stat |= 8;
m_maincpu->set_input_line(INPUT_LINE_NMI, PULSE_LINE);
}
READ16_MEMBER( pcd_state::unk_r )
{
return 0;
}
WRITE16_MEMBER( pcd_state::unk_w )
{
}
READ8_MEMBER( pcd_state::stat_r )
{
return m_stat;
}
WRITE8_MEMBER( pcd_state::stat_w )
{
m_stat = data;
}
READ8_MEMBER( pcd_state::led_r )
{
return m_led;
}
WRITE8_MEMBER( pcd_state::led_w )
{
for(int i = 0; i < 6; i++)
logerror("%c", (data & (1 << i)) ? '-' : '*');
logerror("\n");
m_led = data;
}
UINT32 pcd_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
{
//bitmap.fill(0, cliprect);
m_crtc->scn2574_draw(machine(), bitmap, cliprect, m_vram);
return 0;
}
//**************************************************************************
// ADDRESS MAPS
@ -120,17 +195,29 @@ READ8_MEMBER( pcd_state::crt_status_r )
static ADDRESS_MAP_START( pcd_map, AS_PROGRAM, 16, pcd_state )
AM_RANGE(0x00000, 0x3ffff) AM_RAM // fixed 256k for now
AM_RANGE(0xf0000, 0xf7fff) AM_RAM AM_SHARE("vram")
//AM_RANGE(0xf7000, 0xfbfff) AM_READWRITE8(charram_r, charram_w, 0xffff)
AM_RANGE(0xfc000, 0xfffff) AM_ROM AM_REGION("bios", 0)
AM_RANGE(0x00000, 0xfffff) AM_READWRITE(nmi_io_r, nmi_io_w)
ADDRESS_MAP_END
static ADDRESS_MAP_START( pcd_io, AS_IO, 16, pcd_state )
ADDRESS_MAP_UNMAP_HIGH
AM_RANGE(0xf000, 0xf7ff) AM_RAM AM_SHARE("nvram")
AM_RANGE(0xf840, 0xf841) AM_DEVREADWRITE8("pic1", pic8259_device, read, write, 0xff00)
AM_RANGE(0xf900, 0xf907) AM_DEVREADWRITE8("fdc", wd2793_t, read, write, 0x00ff)
// AM_RANGE(0xf940, 0xf941) // sasi controller here?
AM_RANGE(0xf980, 0xf981) AM_READWRITE8(crt_data_r, crt_data_w, 0x00ff) AM_READ8(crt_status_r, 0xff00)
// AM_RANGE(0xfa00, 0xfa7f) // pcs4-n (peripheral chip select)
AM_RANGE(0xf800, 0xf801) AM_DEVREADWRITE8("pic1", pic8259_device, read, write, 0xffff)
AM_RANGE(0xf820, 0xf821) AM_DEVREADWRITE8("pic2", pic8259_device, read, write, 0xffff)
AM_RANGE(0xf840, 0xf841) AM_READWRITE8(stat_r, stat_w, 0x00ff)
AM_RANGE(0xf840, 0xf841) AM_READWRITE8(led_r, led_w, 0xff00)
AM_RANGE(0xf880, 0xf88f) AM_READWRITE(unk_r, unk_w) // mmu?
AM_RANGE(0xf900, 0xf907) AM_DEVREADWRITE8("fdc", wd2793_t, read, write, 0xffff)
//AM_RANGE(0xf940, 0xf943) scsi
AM_RANGE(0xf9c0, 0xf9c3) AM_DEVREADWRITE8("usart1",mc2661_device,read,write,0xffff) // UARTs
AM_RANGE(0xf9d0, 0xf9d3) AM_DEVREADWRITE8("usart2",mc2661_device,read,write,0xffff)
AM_RANGE(0xf9e0, 0xf9e3) AM_DEVREADWRITE8("usart3",mc2661_device,read,write,0xffff)
AM_RANGE(0xf980, 0xf987) AM_DEVWRITE8("crtc", scn2674_device, mpu4_vid_scn2674_w, 0x00ff)
AM_RANGE(0xf980, 0xf987) AM_DEVREAD8("crtc", scn2674_device, mpu4_vid_scn2674_r, 0xff00)
// AM_RANGE(0xfa00, 0xfa7f) // pcs4-n (peripheral chip select)
AM_RANGE(0x0000, 0xffff) AM_READWRITE(nmi_io_r, nmi_io_w)
ADDRESS_MAP_END
@ -144,15 +231,16 @@ static SLOT_INTERFACE_START( pcd_floppies )
SLOT_INTERFACE_END
static MACHINE_CONFIG_START( pcd, pcd_state )
MCFG_CPU_ADD("maincpu", I80186, XTAL_16MHz / 2)
MCFG_CPU_ADD("maincpu", I80186, XTAL_16MHz)
MCFG_CPU_PROGRAM_MAP(pcd_map)
MCFG_CPU_IO_MAP(pcd_io)
MCFG_80186_TMROUT1_HANDLER(WRITELINE(pcd_state, i186_timer1_w))
MCFG_80186_IRQ_SLAVE_ACK(READ8(pcd_state, irq_callback))
MCFG_TIMER_DRIVER_ADD_PERIODIC("timer0_tick", pcd_state, timer0_tick, attotime::from_hz(XTAL_16MHz / 2 / 16))
MCFG_TIMER_DRIVER_ADD_PERIODIC("timer0_tick", pcd_state, timer0_tick, attotime::from_hz(XTAL_16MHz / 24)) // adjusted to pass post
MCFG_PIC8259_ADD("pic1", WRITELINE(pcd_state, pic1_irq), VCC, READ8(pcd_state, pic1_slave_ack_r))
MCFG_PIC8259_ADD("pic2", DEVWRITELINE("pic1", pic8259_device, ir0_w), GND, NULL)
MCFG_PIC8259_ADD("pic1", DEVWRITELINE("maincpu", i80186_cpu_device, int0_w), VCC, NULL)
MCFG_PIC8259_ADD("pic2", DEVWRITELINE("maincpu", i80186_cpu_device, int1_w), VCC, NULL)
#if 0
MCFG_RAM_ADD(RAM_TAG)
@ -167,7 +255,7 @@ static MACHINE_CONFIG_START( pcd, pcd_state )
MCFG_OMTI5100_ADD("sasi")
// floppy disk controller
MCFG_WD2793x_ADD("fdc", XTAL_16MHz/2/8)
MCFG_WD2793x_ADD("fdc", XTAL_16MHz/8)
MCFG_WD_FDC_INTRQ_CALLBACK(DEVWRITELINE("pic1", pic8259_device, ir6_w))
MCFG_WD_FDC_DRQ_CALLBACK(DEVWRITELINE("maincpu", i80186_cpu_device, drq1_w))
@ -188,6 +276,20 @@ static MACHINE_CONFIG_START( pcd, pcd_state )
MCFG_SOUND_ADD("speaker", SPEAKER_SOUND, 0)
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.50)
// video hardware
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_SIZE(640, 350)
MCFG_SCREEN_VISIBLE_AREA(0, 639, 0, 349)
MCFG_SCREEN_REFRESH_RATE(50)
MCFG_SCREEN_UPDATE_DRIVER(pcd_state, screen_update)
MCFG_GFXDECODE_ADD("gfxdecode", "palette", empty)
MCFG_PALETTE_ADD_BLACK_AND_WHITE("palette")
MCFG_SCN2674_VIDEO_ADD("crtc", 0, NULL);
MCFG_SCN2674_GFXDECODE("gfxdecode")
MCFG_SCN2674_PALETTE("palette")
// rtc
MCFG_MC146818_ADD("rtc", XTAL_32_768kHz)
MCFG_MC146818_IRQ_HANDLER(DEVWRITELINE("pic1", pic8259_device, ir7_w))
@ -202,6 +304,10 @@ ROM_START( pcd )
ROM_REGION(0x4000, "bios", 0)
ROM_LOAD16_BYTE("s26361-d359.d42", 0x0001, 0x2000, CRC(e20244dd) SHA1(0ebc5ddb93baacd9106f1917380de58aac64fe73))
ROM_LOAD16_BYTE("s26361-d359.d43", 0x0000, 0x2000, CRC(e03db2ec) SHA1(fcae8b0c9e7543706817b0a53872826633361fda))
ROM_FILL(0xb64, 1, 0xe2) // post expects 0xd0 fdc command to be instant, give it a delay
ROM_FILL(0xb65, 1, 0xfe)
ROM_FILL(0x3ffe, 1, 0xb4) // fix csum
ROM_FILL(0x3fff, 1, 0x22)
// gfx card (scn2674 with 8741), to be moved
ROM_REGION(0x400, "graphics", 0)

View File

@ -940,6 +940,7 @@ $(MESSOBJ)/mame.a: \
$(MAME_VIDEO)/vectrex.o \
$(MAME_DRIVERS)/cps1.o \
$(MAME_VIDEO)/cps1.o \
$(MAME_VIDEO)/scn2674.o \
#-------------------------------------------------