From 7c8cb9ef5aa505c5c547d15098c7def649385d6f Mon Sep 17 00:00:00 2001 From: cracyc Date: Sun, 8 Feb 2015 21:08:26 -0600 Subject: (mess) pcd: doesn't display anything yet but almost completes post (nw) --- src/emu/cpu/i86/i186.c | 15 ++++- src/emu/machine/mc2661.c | 4 ++ src/mess/drivers/pcd.c | 172 ++++++++++++++++++++++++++++++++++++++--------- src/mess/mess.mak | 1 + 4 files changed, 156 insertions(+), 36 deletions(-) diff --git a/src/emu/cpu/i86/i186.c b/src/emu/cpu/i86/i186.c index 98003014716..52f43567902 100644 --- a/src/emu/cpu/i86/i186.c +++ b/src/emu/cpu/i86/i186.c @@ -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: diff --git a/src/emu/machine/mc2661.c b/src/emu/machine/mc2661.c index 18503452a3a..d13fe33c19f 100644 --- a/src/emu/machine/mc2661.c +++ b/src/emu/machine/mc2661.c @@ -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: diff --git a/src/mess/drivers/pcd.c b/src/mess/drivers/pcd.c index 2ca91c48c20..c9d76c80962 100644 --- a/src/mess/drivers/pcd.c +++ b/src/mess/drivers/pcd.c @@ -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 m_maincpu; @@ -60,6 +71,10 @@ private: required_device m_sasi; required_device m_fdc; required_device m_rtc; + required_device m_crtc; + required_shared_ptr 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")->set_gfx(0, global_alloc(gfx_element(machine().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 ) +{ + return m_charram[offset >> 1]; +} + +WRITE8_MEMBER( pcd_state::charram_w ) +{ + m_charram[offset >> 1] = data; +} + +READ16_MEMBER( pcd_state::nmi_io_r ) +{ + 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 ) { - logerror("crt_data_r @ %02x\n", offset); - return 0xff; } -WRITE8_MEMBER( pcd_state::crt_data_w ) +READ8_MEMBER( pcd_state::stat_r ) { - logerror("crt_data_w %02x @ %02x\n", data, offset); + return m_stat; } -READ8_MEMBER( pcd_state::crt_status_r ) +WRITE8_MEMBER( pcd_state::stat_w ) { - logerror("crt_status_r @ %02x\n", offset); - return 0xff; + 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) diff --git a/src/mess/mess.mak b/src/mess/mess.mak index 29944227106..0c25d473382 100644 --- a/src/mess/mess.mak +++ b/src/mess/mess.mak @@ -940,6 +940,7 @@ $(MESSOBJ)/mame.a: \ $(MAME_VIDEO)/vectrex.o \ $(MAME_DRIVERS)/cps1.o \ $(MAME_VIDEO)/cps1.o \ + $(MAME_VIDEO)/scn2674.o \ #------------------------------------------------- -- cgit v1.2.3