mirror of
https://github.com/holub/mame
synced 2025-07-03 00:56:03 +03:00
(mess) pcd: doesn't display anything yet but almost completes post (nw)
This commit is contained in:
parent
c0177c6790
commit
7c8cb9ef5a
@ -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:
|
||||
|
@ -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:
|
||||
|
@ -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)
|
||||
|
@ -940,6 +940,7 @@ $(MESSOBJ)/mame.a: \
|
||||
$(MAME_VIDEO)/vectrex.o \
|
||||
$(MAME_DRIVERS)/cps1.o \
|
||||
$(MAME_VIDEO)/cps1.o \
|
||||
$(MAME_VIDEO)/scn2674.o \
|
||||
|
||||
|
||||
#-------------------------------------------------
|
||||
|
Loading…
Reference in New Issue
Block a user