diff --git a/.gitattributes b/.gitattributes index 8ea93df7b00..438501a13e6 100644 --- a/.gitattributes +++ b/.gitattributes @@ -7651,7 +7651,6 @@ src/mess/machine/cococart.c svneol=native#text/plain src/mess/machine/cococart.h svneol=native#text/plain src/mess/machine/coleco.c svneol=native#text/plain src/mess/machine/coleco.h svneol=native#text/plain -src/mess/machine/compis.c svneol=native#text/plain src/mess/machine/compiskb.c svneol=native#text/plain src/mess/machine/compiskb.h svneol=native#text/plain src/mess/machine/comxpl80.c svneol=native#text/plain diff --git a/src/mess/drivers/compis.c b/src/mess/drivers/compis.c index 0e48d8f8660..dc997fc9fbf 100644 --- a/src/mess/drivers/compis.c +++ b/src/mess/drivers/compis.c @@ -41,16 +41,6 @@ ******************************************************************************/ #include "includes/compis.h" -#include "formats/mfi_dsk.h" - -UINT32 compis_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) -{ - bitmap.fill(RGB_BLACK, cliprect); - - m_crtc->screen_update(screen, bitmap, cliprect); - - return 0; -} static UPD7220_DISPLAY_PIXELS( hgdc_display_pixels ) { @@ -58,7 +48,7 @@ static UPD7220_DISPLAY_PIXELS( hgdc_display_pixels ) UINT8 i,gfx = state->m_video_ram[address]; for(i=0; i<8; i++) - bitmap.pix32(y, x + i) = RGB_MONOCHROME_GREEN_HIGHLIGHT[BIT((gfx >> i), 0)]; + bitmap.pix32(y, x + i) = RGB_MONOCHROME_GREEN_HIGHLIGHT[BIT(gfx,i )]; } static UPD7220_INTERFACE( hgdc_intf ) @@ -70,6 +60,14 @@ static UPD7220_INTERFACE( hgdc_intf ) DEVCB_NULL }; + +WRITE8_MEMBER( compis_state::tape_mon_w ) +{ + cassette_state state = BIT(data, 0) ? CASSETTE_MOTOR_ENABLED : CASSETTE_MOTOR_DISABLED; + + m_cassette->change_state(state, CASSETTE_MASK_MOTOR); +} + READ16_MEMBER( compis_state::isbx0_tdma_r ) { if (ACCESSING_BITS_0_7) @@ -226,35 +224,52 @@ WRITE16_MEMBER( compis_state::isbx1_dack_w ) } -/* TODO: why it writes to ROM region? */ -WRITE8_MEMBER( compis_state::vram_w ) +READ8_MEMBER( compis_state::vram_r ) { - m_video_ram[offset+0x20000] = data; + return m_video_ram[offset]; } -static ADDRESS_MAP_START( compis_mem , AS_PROGRAM, 16, compis_state ) + +WRITE8_MEMBER( compis_state::vram_w ) +{ + m_video_ram[offset] = data; +} + + + +//************************************************************************** +// ADDRESS MAPS +//************************************************************************** + +//------------------------------------------------- +// ADDRESS_MAP( compis_mem ) +//------------------------------------------------- + +static ADDRESS_MAP_START( compis_mem, AS_PROGRAM, 16, compis_state ) ADDRESS_MAP_UNMAP_HIGH - AM_RANGE(0x00000, 0x3ffff) AM_RAM - AM_RANGE(0x40000, 0x4ffff) AM_RAM - AM_RANGE(0x50000, 0x5ffff) AM_RAM - AM_RANGE(0x60000, 0x6ffff) AM_RAM - AM_RANGE(0x70000, 0x7ffff) AM_RAM - AM_RANGE(0xe8000, 0xeffff) AM_ROM AM_REGION("maincpu",0) - AM_RANGE(0xf0000, 0xfffff) AM_ROM AM_REGION("maincpu",0) AM_WRITE8(vram_w, 0xffff) + AM_RANGE(0x00000, 0x1ffff) AM_RAM + AM_RANGE(0x40000, 0x5ffff) AM_RAM AM_READWRITE8(vram_r, vram_w, 0xffff) + AM_RANGE(0xe8000, 0xeffff) AM_ROM AM_REGION(I80186_TAG, 0) + AM_RANGE(0xf0000, 0xfffff) AM_ROM AM_REGION(I80186_TAG, 0) ADDRESS_MAP_END + +//------------------------------------------------- +// ADDRESS_MAP( compis_io ) +//------------------------------------------------- + static ADDRESS_MAP_START( compis_io, AS_IO, 16, compis_state ) ADDRESS_MAP_UNMAP_HIGH - AM_RANGE(0x0000, 0x0007) /* PCS0 */ AM_MIRROR(0x78) AM_DEVREADWRITE8("ppi8255", i8255_device, read, write, 0xff00) - AM_RANGE(0x0080, 0x0087) /* PCS1 */ AM_MIRROR(0x78) AM_DEVREADWRITE8("pit8253", pit8253_device, read, write, 0x00ff) - AM_RANGE(0x0100, 0x011f) /* PCS2 */ AM_MIRROR(0x60) AM_DEVREADWRITE8("mm58274c", mm58274c_device, read, write, 0x00ff) + AM_RANGE(0x0000, 0x0007) /* PCS0 */ AM_MIRROR(0x78) AM_DEVREADWRITE8(I8255_TAG, i8255_device, read, write, 0xff00) + AM_RANGE(0x0080, 0x0087) /* PCS1 */ AM_MIRROR(0x78) AM_DEVREADWRITE8(I8253_TAG, pit8253_device, read, write, 0x00ff) + AM_RANGE(0x0100, 0x011f) /* PCS2 */ AM_MIRROR(0x60) AM_DEVREADWRITE8(MM58174A_TAG, mm58274c_device, read, write, 0x00ff) //AM_RANGE(0x0180, 0x0181) /* PCS3 */ AM_MIRROR(0x7e) //AM_RANGE(0x0200, 0x0201) /* PCS4 */ AM_MIRROR(0x7e) AM_RANGE(0x0280, 0x0283) /* PCS5 */ AM_MIRROR(0x70) AM_DEVREADWRITE8("pic8259_master", pic8259_device, read, write, 0x00ff) /* 80150/80130 */ AM_RANGE(0x0288, 0x028f) /* PCS5 */ AM_MIRROR(0x70) AM_DEVREADWRITE8("pit8254", pit8254_device, read, write, 0x00ff) /* 80150/80130 */ AM_RANGE(0x0300, 0x0301) /* PCS6:0 */ AM_MIRROR(0xe) AM_WRITE8(tape_mon_w, 0x00ff) - AM_RANGE(0x0310, 0x0311) /* PCS6:3 */ AM_MIRROR(0xc) AM_DEVREADWRITE8("uart", i8251_device, data_r, data_w, 0xff00) - AM_RANGE(0x0312, 0x0313) /* PCS6:3 */ AM_MIRROR(0xc) AM_DEVREADWRITE8("uart", i8251_device, status_r, control_w, 0xff00) + AM_RANGE(0x0310, 0x0311) /* PCS6:3 */ AM_MIRROR(0xc) AM_DEVREADWRITE8(I8251A_TAG, i8251_device, data_r, data_w, 0xff00) + AM_RANGE(0x0312, 0x0313) /* PCS6:3 */ AM_MIRROR(0xc) AM_DEVREADWRITE8(I8251A_TAG, i8251_device, status_r, control_w, 0xff00) AM_RANGE(0x0320, 0x032f) AM_READWRITE(isbx0_tdma_r, isbx0_tdma_w) AM_RANGE(0x0330, 0x033f) AM_READWRITE(isbx1_tdma_r, isbx1_tdma_w) AM_RANGE(0x0340, 0x034f) AM_READWRITE(isbx0_cs_r, isbx0_cs_w) @@ -279,39 +294,200 @@ static ADDRESS_MAP_START( compis_io, AS_IO, 16, compis_state ) #endif ADDRESS_MAP_END -static INPUT_PORTS_START (compis) + +//------------------------------------------------- +// ADDRESS_MAP( upd7220_map ) +//------------------------------------------------- + +static ADDRESS_MAP_START( upd7220_map, AS_0, 8, compis_state ) + ADDRESS_MAP_GLOBAL_MASK(0x1ffff) + AM_RANGE(0x00000, 0x1ffff) AM_RAM AM_SHARE("video_ram") +ADDRESS_MAP_END + + + +//************************************************************************** +// INPUT PORTS +//************************************************************************** + +//------------------------------------------------- +// INPUT_PORTS( compis ) +//------------------------------------------------- + +static INPUT_PORTS_START( compis ) PORT_START("DSW0") PORT_DIPNAME( 0x18, 0x00, "S8 Test mode") PORT_DIPSETTING( 0x00, DEF_STR( Normal ) ) PORT_DIPSETTING( 0x08, "Remote" ) PORT_DIPSETTING( 0x10, "Stand alone" ) PORT_DIPSETTING( 0x18, "Reserved" ) - - PORT_START("DSW1") - PORT_DIPNAME( 0x01, 0x00, "iSBX-218A DMA") - PORT_DIPSETTING( 0x01, "Enabled" ) - PORT_DIPSETTING( 0x00, "Disabled" ) INPUT_PORTS_END -static const mm58274c_interface compis_mm58274c_interface = +//************************************************************************** +// DEVICE CONFIGURATION +//************************************************************************** + +//------------------------------------------------- +// I80186_INTERFACE( cpu_intf ) +//------------------------------------------------- + +READ8_MEMBER( compis_state::compis_irq_callback ) { - 0, /* mode 24*/ - 1 /* first day of week */ + return m_8259m->inta_r(); +} + +WRITE_LINE_MEMBER( compis_state::tmr0_w ) +{ + m_tmr0 = state; + + m_cassette->output(m_tmr0 ? -1 : 1); +} + + +//------------------------------------------------- +// I80130_INTERFACE( osp_intf ) +//------------------------------------------------- + +WRITE_LINE_MEMBER( compis_state::tmr2_w ) +{ + m_uart->rxc_w(state); + m_uart->txc_w(state); +} + +static const struct pit8253_interface osp_pit_intf = +{ + { + { XTAL_16MHz/2, DEVCB_LINE_VCC, DEVCB_NULL /*DEVCB_DEVICE_LINE_MEMBER("pic8259_master", pic8259_device, ir3_w)*/ }, // SYSTICK + { XTAL_16MHz/2, DEVCB_LINE_VCC, DEVCB_DEVICE_LINE_MEMBER("pic8259_master", pic8259_device, ir7_w) }, // DELAY + { 7932659, DEVCB_LINE_VCC, DEVCB_DRIVER_LINE_MEMBER(compis_state, tmr2_w) } // BAUD + } }; //------------------------------------------------- -// cassette_interface compis_cassette_interface +// pit8253_interface pit_intf //------------------------------------------------- -static const cassette_interface compis_cassette_interface = +WRITE_LINE_MEMBER( compis_state::tmr3_w ) { - cassette_default_formats, - NULL, - (cassette_state)(CASSETTE_STOPPED | CASSETTE_MOTOR_DISABLED | CASSETTE_SPEAKER_MUTED), - NULL, - NULL + m_mpsc->rxtxcb_w(state); +} + +WRITE_LINE_MEMBER( compis_state::tmr4_w ) +{ +} + +WRITE_LINE_MEMBER( compis_state::tmr5_w ) +{ + m_mpsc->rxca_w(state); + m_mpsc->txca_w(state); +} + +static const struct pit8253_interface pit_intf = +{ + { + { XTAL_16MHz/8, DEVCB_LINE_VCC, DEVCB_DRIVER_LINE_MEMBER(compis_state, tmr3_w) }, + { XTAL_16MHz/8, DEVCB_LINE_VCC, DEVCB_DRIVER_LINE_MEMBER(compis_state, tmr4_w) }, + { XTAL_16MHz/8, DEVCB_LINE_VCC, DEVCB_DRIVER_LINE_MEMBER(compis_state, tmr5_w) } + } +}; + + +//------------------------------------------------- +// i8251_interface usart_intf +//------------------------------------------------- + +static const i8251_interface usart_intf = +{ + DEVCB_DEVICE_LINE_MEMBER(COMPIS_KEYBOARD_TAG, compis_keyboard_device, so_r), + DEVCB_DEVICE_LINE_MEMBER(COMPIS_KEYBOARD_TAG, compis_keyboard_device, si_w), + DEVCB_NULL, + DEVCB_NULL, + DEVCB_NULL, + DEVCB_DEVICE_LINE_MEMBER("pic8259_master", pic8259_device, ir2_w), + DEVCB_NULL, //DEVCB_DEVICE_LINE_MEMBER(I80186_TAG, i80186_cpu_device, int1_w), + DEVCB_NULL, + DEVCB_NULL +}; + + +//------------------------------------------------- +// I8255A_INTERFACE( ppi_intf ) +//------------------------------------------------- + +READ8_MEMBER( compis_state::ppi_pb_r ) +{ + /* + + bit description + + 0 J5-4 + 1 J5-5 + 2 J6-3 Cassette read + 3 J2-6 DSR / S8-4 Test + 4 J4-6 DSR / S8-3 Test + 5 J7-11 Centronics BUSY + 6 J7-13 Centronics SELECT + 7 Tmr0 + + */ + + UINT8 data = 0; + + /* DIP switch - Test mode */ + data = ioport("DSW0")->read(); + + // cassette + data |= (m_cassette->input() > 0.0) << 2; + + /* Centronics busy */ + data |= m_centronics->busy_r() << 5; + data |= m_centronics->vcc_r() << 6; + + // TMR0 + data |= m_tmr0 << 7; + + return data; +} + +WRITE8_MEMBER( compis_state::ppi_pc_w ) +{ + /* + + bit description + + 0 J5-1 + 1 J5-2 + 2 Select: 1=time measure, DSR from J2/J4 pin 6. 0=read cassette + 3 Datex: Tristate datex output (low) + 4 V2-5 Floppy motor on/off + 5 J7-1 Centronics STROBE + 6 V2-4 Floppy Soft reset + 7 V2-3 Floppy Terminal count + + */ + + m_isbx0->opt1_w(BIT(data, 4)); + + m_centronics->strobe_w(BIT(data, 5)); + + if (BIT(data, 6)) + { + m_isbx0->reset(); + } + + m_isbx0->opt0_w(BIT(data, 7)); +} + +static I8255A_INTERFACE( ppi_intf ) +{ + DEVCB_NULL, + DEVCB_DEVICE_MEMBER(CENTRONICS_TAG, centronics_device, write), + DEVCB_DRIVER_MEMBER(compis_state, ppi_pb_r), + DEVCB_NULL, + DEVCB_NULL, + DEVCB_DRIVER_MEMBER(compis_state, ppi_pc_w) }; @@ -337,7 +513,18 @@ static I8274_INTERFACE( mpsc_intf ) DEVCB_NULL, DEVCB_NULL, - DEVCB_DEVICE_LINE_MEMBER("maincpu", i80186_cpu_device, int3_w) + DEVCB_DEVICE_LINE_MEMBER(I80186_TAG, i80186_cpu_device, int3_w) +}; + + +//------------------------------------------------- +// mm58274c_interface rtc_intf +//------------------------------------------------- + +static const mm58274c_interface rtc_intf = +{ + 0, /* mode 24*/ + 1 /* first day of week */ }; @@ -368,119 +555,142 @@ static const rs232_port_interface rs232b_intf = DEVCB_DEVICE_LINE_MEMBER(I8274_TAG, z80dart_device, ctsb_w) }; -static ADDRESS_MAP_START( upd7220_map, AS_0, 8, compis_state ) - ADDRESS_MAP_GLOBAL_MASK(0x3ffff) - AM_RANGE(0x00000, 0x3ffff) AM_RAM AM_SHARE("video_ram") -ADDRESS_MAP_END + +//------------------------------------------------- +// cassette_interface compis_cassette_interface +//------------------------------------------------- + +TIMER_DEVICE_CALLBACK_MEMBER( compis_state::tape_tick ) +{ + m_maincpu->tmrin0_w(m_cassette->input() > 0.0); +} + +static const cassette_interface compis_cassette_interface = +{ + cassette_default_formats, + NULL, + (cassette_state)(CASSETTE_STOPPED | CASSETTE_MOTOR_DISABLED | CASSETTE_SPEAKER_MUTED), + NULL, + NULL +}; + + + +//************************************************************************** +// MACHINE INITIALIZATION +//************************************************************************** + +//------------------------------------------------- +// machine_start +//------------------------------------------------- + +void compis_state::machine_start() +{ + if (m_ram->size() == 256*1024) + { + m_maincpu->space(AS_PROGRAM).install_ram(0x20000, 0x3ffff, NULL); + } +} + + +//------------------------------------------------- +// machine_reset +//------------------------------------------------- + +void compis_state::machine_reset() +{ + m_uart->reset(); + m_mpsc->reset(); + m_ppi->reset(); + m_isbx0->reset(); + m_isbx1->reset(); +} + + + +//************************************************************************** +// MACHINE DRIVERS +//************************************************************************** + +//------------------------------------------------- +// MACHINE_CONFIG( compis ) +//------------------------------------------------- static MACHINE_CONFIG_START( compis, compis_state ) - /* basic machine hardware */ - MCFG_CPU_ADD("maincpu", I80186, XTAL_16MHz) + // basic machine hardware + MCFG_CPU_ADD(I80186_TAG, I80186, XTAL_16MHz) MCFG_CPU_PROGRAM_MAP(compis_mem) MCFG_CPU_IO_MAP(compis_io) MCFG_80186_IRQ_SLAVE_ACK(DEVREAD8(DEVICE_SELF, compis_state, compis_irq_callback)) MCFG_80186_TMROUT0_HANDLER(DEVWRITELINE(DEVICE_SELF, compis_state, tmr0_w)) - /* video hardware */ + // video hardware MCFG_VIDEO_ATTRIBUTES(VIDEO_UPDATE_BEFORE_VBLANK) - MCFG_SCREEN_ADD("screen", RASTER) + MCFG_SCREEN_ADD(SCREEN_TAG, RASTER) MCFG_SCREEN_REFRESH_RATE(50) - MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */ - MCFG_SCREEN_SIZE(640, 480) - MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 0, 480-1) - MCFG_SCREEN_UPDATE_DEVICE("upd7220", upd7220_device, screen_update) - - /* Devices */ - MCFG_PIT8253_ADD( "pit8253", compis_pit8253_config ) - MCFG_PIT8254_ADD( "pit8254", compis_pit8254_config ) - MCFG_PIC8259_ADD( "pic8259_master", DEVWRITELINE("maincpu", i80186_cpu_device, int0_w), VCC, NULL ) - MCFG_I8255_ADD( "ppi8255", compis_ppi_interface ) - MCFG_UPD7220_ADD("upd7220", XTAL_4_433619MHz/2, hgdc_intf, upd7220_map) //unknown clock - MCFG_CENTRONICS_PRINTER_ADD("centronics", standard_centronics) - MCFG_I8251_ADD("uart", compis_usart_interface) - MCFG_MM58274C_ADD("mm58274c", compis_mm58274c_interface) - MCFG_CASSETTE_ADD(CASSETTE_TAG, compis_cassette_interface) - MCFG_TIMER_DRIVER_ADD_PERIODIC("tape", compis_state, tape_tick, attotime::from_hz(44100)) - MCFG_I8274_ADD(I8274_TAG, XTAL_16MHz/4, mpsc_intf) - MCFG_RS232_PORT_ADD(RS232_A_TAG, rs232a_intf, default_rs232_devices, NULL) - MCFG_RS232_PORT_ADD(RS232_B_TAG, rs232b_intf, default_rs232_devices, NULL) - MCFG_ISBX_SLOT_ADD(ISBX_0_TAG, 0, isbx_cards, "fdc") - MCFG_ISBX_SLOT_MINTR0_CALLBACK(DEVWRITELINE("pic8259_master", pic8259_device, ir1_w)) - MCFG_ISBX_SLOT_MINTR1_CALLBACK(DEVWRITELINE("pic8259_master", pic8259_device, ir0_w)) - MCFG_ISBX_SLOT_MDRQT_CALLBACK(DEVWRITELINE("maincpu", i80186_cpu_device, drq0_w)) - MCFG_ISBX_SLOT_ADD(ISBX_1_TAG, 0, isbx_cards, NULL) - MCFG_ISBX_SLOT_MINTR0_CALLBACK(DEVWRITELINE("pic8259_master", pic8259_device, ir6_w)) - MCFG_ISBX_SLOT_MINTR1_CALLBACK(DEVWRITELINE("pic8259_master", pic8259_device, ir5_w)) - MCFG_ISBX_SLOT_MDRQT_CALLBACK(DEVWRITELINE("maincpu", i80186_cpu_device, drq1_w)) - MCFG_COMPIS_KEYBOARD_ADD(NULL) - - /* software lists */ - MCFG_SOFTWARE_LIST_ADD("flop_list", "compis") -MACHINE_CONFIG_END - -static MACHINE_CONFIG_START( compis2, compis_state ) - /* basic machine hardware */ - MCFG_CPU_ADD("maincpu", I80186, XTAL_16MHz) - MCFG_CPU_PROGRAM_MAP(compis_mem) - MCFG_CPU_IO_MAP(compis_io) - MCFG_80186_IRQ_SLAVE_ACK(DEVREAD8(DEVICE_SELF, compis_state, compis_irq_callback)) - MCFG_80186_TMROUT0_HANDLER(DEVWRITELINE(DEVICE_SELF, compis_state, tmr0_w)) - - /* video hardware */ - MCFG_VIDEO_ATTRIBUTES(VIDEO_UPDATE_BEFORE_VBLANK) - MCFG_SCREEN_ADD("screen", RASTER) - MCFG_SCREEN_REFRESH_RATE(50) - MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */ + MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) // not accurate MCFG_SCREEN_SIZE(640, 400) MCFG_SCREEN_VISIBLE_AREA(0, 640-1, 0, 400-1) - MCFG_SCREEN_UPDATE_DRIVER(compis_state, screen_update) - - /* Devices */ - MCFG_PIT8253_ADD( "pit8253", compis_pit8253_config ) - MCFG_PIT8254_ADD( "pit8254", compis_pit8254_config ) - MCFG_PIC8259_ADD( "pic8259_master", DEVWRITELINE("maincpu", i80186_cpu_device, int0_w), VCC, NULL ) - MCFG_I8255_ADD( "ppi8255", compis_ppi_interface ) + MCFG_SCREEN_UPDATE_DEVICE("upd7220", upd7220_device, screen_update) MCFG_UPD7220_ADD("upd7220", XTAL_4_433619MHz/2, hgdc_intf, upd7220_map) //unknown clock - MCFG_CENTRONICS_PRINTER_ADD("centronics", standard_centronics) - MCFG_I8251_ADD("uart", compis_usart_interface) - MCFG_MM58274C_ADD("mm58274c", compis_mm58274c_interface) - MCFG_CASSETTE_ADD(CASSETTE_TAG, compis_cassette_interface) - MCFG_TIMER_DRIVER_ADD_PERIODIC("tape", compis_state, tape_tick, attotime::from_hz(44100)) + + // devices + MCFG_PIC8259_ADD("pic8259_master", DEVWRITELINE(I80186_TAG, i80186_cpu_device, int0_w), VCC, NULL ) // inside 80130 + MCFG_PIT8254_ADD("pit8254", osp_pit_intf ) // inside 80130 + MCFG_PIT8253_ADD(I8253_TAG, pit_intf ) + MCFG_I8255_ADD(I8255_TAG, ppi_intf ) + MCFG_I8251_ADD(I8251A_TAG, usart_intf) MCFG_I8274_ADD(I8274_TAG, XTAL_16MHz/4, mpsc_intf) + MCFG_MM58274C_ADD(MM58174A_TAG, rtc_intf) + MCFG_CASSETTE_ADD(CASSETTE_TAG, compis_cassette_interface) MCFG_RS232_PORT_ADD(RS232_A_TAG, rs232a_intf, default_rs232_devices, NULL) MCFG_RS232_PORT_ADD(RS232_B_TAG, rs232b_intf, default_rs232_devices, NULL) + MCFG_CENTRONICS_PRINTER_ADD(CENTRONICS_TAG, standard_centronics) + MCFG_TIMER_DRIVER_ADD_PERIODIC("tape", compis_state, tape_tick, attotime::from_hz(44100)) MCFG_ISBX_SLOT_ADD(ISBX_0_TAG, 0, isbx_cards, "fdc") MCFG_ISBX_SLOT_MINTR0_CALLBACK(DEVWRITELINE("pic8259_master", pic8259_device, ir1_w)) MCFG_ISBX_SLOT_MINTR1_CALLBACK(DEVWRITELINE("pic8259_master", pic8259_device, ir0_w)) - MCFG_ISBX_SLOT_MDRQT_CALLBACK(DEVWRITELINE("maincpu", i80186_cpu_device, drq0_w)) + MCFG_ISBX_SLOT_MDRQT_CALLBACK(DEVWRITELINE(I80186_TAG, i80186_cpu_device, drq0_w)) MCFG_ISBX_SLOT_ADD(ISBX_1_TAG, 0, isbx_cards, NULL) MCFG_ISBX_SLOT_MINTR0_CALLBACK(DEVWRITELINE("pic8259_master", pic8259_device, ir6_w)) MCFG_ISBX_SLOT_MINTR1_CALLBACK(DEVWRITELINE("pic8259_master", pic8259_device, ir5_w)) - MCFG_ISBX_SLOT_MDRQT_CALLBACK(DEVWRITELINE("maincpu", i80186_cpu_device, drq1_w)) + MCFG_ISBX_SLOT_MDRQT_CALLBACK(DEVWRITELINE(I80186_TAG, i80186_cpu_device, drq1_w)) MCFG_COMPIS_KEYBOARD_ADD(NULL) - /* software lists */ + // software lists MCFG_SOFTWARE_LIST_ADD("flop_list", "compis") + + // internal ram + MCFG_RAM_ADD(RAM_TAG) + MCFG_RAM_DEFAULT_SIZE("128K") + MCFG_RAM_EXTRA_OPTIONS("256K") MACHINE_CONFIG_END -/*************************************************************************** +//************************************************************************** +// ROMS +//************************************************************************** - Game driver(s) - -***************************************************************************/ +//------------------------------------------------- +// ROM( compis ) +//------------------------------------------------- ROM_START( compis ) - ROM_REGION16_LE( 0x10000, "maincpu", 0 ) + ROM_REGION16_LE( 0x10000, I80186_TAG, 0 ) ROM_LOAD16_BYTE( "sa883003.u40", 0x0000, 0x4000, CRC(195ef6bf) SHA1(eaf8ae897e1a4b62d3038ff23777ce8741b766ef) ) ROM_LOAD16_BYTE( "sa883003.u36", 0x0001, 0x4000, CRC(7c918f56) SHA1(8ba33d206351c52f44f1aa76cc4d7f292dcef761) ) ROM_LOAD16_BYTE( "sa883003.u39", 0x8000, 0x4000, CRC(3cca66db) SHA1(cac36c9caa2f5bb42d7a6d5b84f419318628935f) ) ROM_LOAD16_BYTE( "sa883003.u35", 0x8001, 0x4000, CRC(43c38e76) SHA1(f32e43604107def2c2259898926d090f2ed62104) ) ROM_END + +//------------------------------------------------- +// ROM( compis2 ) +//------------------------------------------------- + ROM_START( compis2 ) - ROM_REGION16_LE( 0x10000, "maincpu", 0 ) + ROM_REGION16_LE( 0x10000, I80186_TAG, 0 ) ROM_DEFAULT_BIOS( "v303" ) ROM_SYSTEM_BIOS( 0, "v302", "Compis II v3.02 (1986-09-09)" ) @@ -492,6 +702,12 @@ ROM_START( compis2 ) ROMX_LOAD( "rysa094.u35", 0x0001, 0x8000, CRC(b0694026) SHA1(eb6b2e3cb0f42fd5ffdf44f70e652ecb9714ce30), ROM_BIOS(2) | ROM_SKIP(1) ) ROM_END -/* YEAR NAME PARENT COMPAT MACHINE INPUT INIT COMPANY FULLNAME */ + + +//************************************************************************** +// SYSTEM DRIVERS +//************************************************************************** + +// YEAR NAME PARENT COMPAT MACHINE INPUT INIT COMPANY FULLNAME FLAGS COMP(1985, compis, 0, 0, compis, compis, driver_device, 0, "Telenova", "Compis" , GAME_NOT_WORKING ) -COMP(1986, compis2, compis, 0, compis2, compis, driver_device, 0, "Telenova", "Compis II" , GAME_NOT_WORKING ) +COMP(1986, compis2, compis, 0, compis, compis, driver_device, 0, "Telenova", "Compis II" , GAME_NOT_WORKING ) diff --git a/src/mess/includes/compis.h b/src/mess/includes/compis.h index d47c6e63976..4b6ba635e2d 100644 --- a/src/mess/includes/compis.h +++ b/src/mess/includes/compis.h @@ -9,8 +9,10 @@ * ****************************************************************************/ -#ifndef COMPIS_H_ -#define COMPIS_H_ +#pragma once + +#ifndef __COMPIS__ +#define __COMPIS__ #include "emu.h" #include "bus/isbx/isbx.h" @@ -24,35 +26,45 @@ #include "machine/mm58274c.h" #include "machine/pic8259.h" #include "machine/pit8253.h" +#include "machine/ram.h" #include "machine/serial.h" #include "machine/z80dart.h" #include "video/upd7220.h" +#define I80186_TAG "ic1" +#define I80130_TAG "ic15" +#define I8251A_TAG "ic59" +#define I8253_TAG "ic60" #define I8274_TAG "ic65" +#define MM58174A_TAG "ic66" +#define I8255_TAG "ic69" #define RS232_A_TAG "rs232a" #define RS232_B_TAG "rs232b" #define CASSETTE_TAG "cassette" +#define CENTRONICS_TAG "centronics" #define ISBX_0_TAG "isbx0" #define ISBX_1_TAG "isbx1" +#define SCREEN_TAG "screen" class compis_state : public driver_device { public: compis_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag), - m_maincpu(*this, "maincpu"), - m_8253(*this, "pit8253"), + m_maincpu(*this, I80186_TAG), + m_8253(*this, I8253_TAG), m_8254(*this, "pit8254"), m_8259m(*this, "pic8259_master"), - m_8255(*this, "ppi8255"), + m_ppi(*this, I8255_TAG), m_mpsc(*this, I8274_TAG), - m_centronics(*this, "centronics"), - m_uart(*this, "uart"), - m_rtc(*this, "mm58274c"), + m_centronics(*this, CENTRONICS_TAG), + m_uart(*this, I8251A_TAG), + m_rtc(*this, MM58174A_TAG), m_crtc(*this, "upd7220"), m_cassette(*this, CASSETTE_TAG), m_isbx0(*this, ISBX_0_TAG), m_isbx1(*this, ISBX_1_TAG), + m_ram(*this, RAM_TAG), m_video_ram(*this, "video_ram") { } @@ -60,7 +72,7 @@ public: required_device m_8253; required_device m_8254; required_device m_8259m; - required_device m_8255; + required_device m_ppi; required_device m_mpsc; required_device m_centronics; required_device m_uart; @@ -69,7 +81,13 @@ public: required_device m_cassette; required_device m_isbx0; required_device m_isbx1; + required_device m_ram; + required_shared_ptr m_video_ram; + virtual void machine_start(); + virtual void machine_reset(); + + DECLARE_WRITE8_MEMBER( tape_mon_w ); DECLARE_READ16_MEMBER( isbx0_tdma_r ); DECLARE_WRITE16_MEMBER( isbx0_tdma_w ); DECLARE_READ16_MEMBER( isbx1_tdma_r ); @@ -82,37 +100,26 @@ public: DECLARE_WRITE16_MEMBER( isbx1_cs_w ); DECLARE_READ16_MEMBER( isbx1_dack_r ); DECLARE_WRITE16_MEMBER( isbx1_dack_w ); + DECLARE_READ8_MEMBER( vram_r ); + DECLARE_WRITE8_MEMBER( vram_w ); - DECLARE_WRITE8_MEMBER(vram_w); - DECLARE_READ8_MEMBER(compis_ppi_port_b_r); - DECLARE_WRITE8_MEMBER(compis_ppi_port_c_w); - UINT8 *m_p_videoram; - DECLARE_WRITE_LINE_MEMBER(tmr0_w); - DECLARE_WRITE_LINE_MEMBER(tmr2_w); - DECLARE_WRITE_LINE_MEMBER(tmr3_w); - DECLARE_WRITE_LINE_MEMBER(tmr4_w); - DECLARE_WRITE_LINE_MEMBER(tmr5_w); - DECLARE_WRITE8_MEMBER(tape_mon_w); - TIMER_DEVICE_CALLBACK_MEMBER(tape_tick); + DECLARE_READ8_MEMBER( compis_irq_callback ); - void fdc_irq(bool state); - void fdc_drq(bool state); + DECLARE_READ8_MEMBER( ppi_pb_r ); + DECLARE_WRITE8_MEMBER( ppi_pc_w ); - required_shared_ptr m_video_ram; - virtual void machine_start(); - virtual void machine_reset(); - UINT32 screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); - DECLARE_READ8_MEMBER(compis_irq_callback); + DECLARE_WRITE_LINE_MEMBER( tmr0_w ); + DECLARE_WRITE_LINE_MEMBER( tmr2_w ); + + DECLARE_WRITE_LINE_MEMBER( tmr3_w ); + DECLARE_WRITE_LINE_MEMBER( tmr4_w ); + DECLARE_WRITE_LINE_MEMBER( tmr5_w ); + + TIMER_DEVICE_CALLBACK_MEMBER( tape_tick ); int m_tmr0; }; -/*----------- defined in machine/compis.c -----------*/ -extern const i8255_interface compis_ppi_interface; -extern const struct pit8253_interface compis_pit8253_config; -extern const struct pit8253_interface compis_pit8254_config; -extern const i8251_interface compis_usart_interface; - -#endif /* COMPIS_H_ */ +#endif diff --git a/src/mess/machine/compis.c b/src/mess/machine/compis.c deleted file mode 100644 index 57d63be4037..00000000000 --- a/src/mess/machine/compis.c +++ /dev/null @@ -1,198 +0,0 @@ -/****************************************************************************** - - compis.c - machine driver - - Per Ola Ingvarsson - Tomas Karlsson - - ******************************************************************************/ - -/*-------------------------------------------------------------------------*/ -/* Include files */ -/*-------------------------------------------------------------------------*/ - -#include "includes/compis.h" - -/* Main emulation */ - -/*-------------------------------------------------------------------------*/ -/* Bit 0: J5-4 */ -/* Bit 1: J5-5 */ -/* Bit 2: J6-3 Cassette read */ -/* Bit 3: J2-6 DSR / S8-4 Test */ -/* Bit 4: J4-6 DSR / S8-3 Test */ -/* Bit 5: J7-11 Centronics BUSY */ -/* Bit 6: J7-13 Centronics SELECT */ -/* Bit 7: Tmr0 */ -/*-------------------------------------------------------------------------*/ -READ8_MEMBER( compis_state::compis_ppi_port_b_r ) -{ - UINT8 data; - - /* DIP switch - Test mode */ - data = ioport("DSW0")->read(); - - // cassette - data |= (m_cassette->input() > 0.0) << 2; - - /* Centronics busy */ - data |= m_centronics->busy_r() << 5; - data |= m_centronics->vcc_r() << 6; - - // TMR0 - data |= m_tmr0 << 7; - - return data; -} - -/*-------------------------------------------------------------------------*/ -/* Bit 0: J5-1 */ -/* Bit 1: J5-2 */ -/* Bit 2: Select: 1=time measure, DSR from J2/J4 pin 6. 0=read cassette */ -/* Bit 3: Datex: Tristate datex output (low) */ -/* Bit 4: V2-5 Floppy motor on/off */ -/* Bit 5: J7-1 Centronics STROBE */ -/* Bit 6: V2-4 Floppy Soft reset */ -/* Bit 7: V2-3 Floppy Terminal count */ -/*-------------------------------------------------------------------------*/ -WRITE8_MEMBER( compis_state::compis_ppi_port_c_w ) -{ - m_isbx0->opt1_w(BIT(data, 4)); - - m_centronics->strobe_w(BIT(data, 5)); - - if (BIT(data, 6)) - m_isbx0->reset(); - - m_isbx0->opt0_w(BIT(data, 7)); -} - -I8255A_INTERFACE( compis_ppi_interface ) -{ - DEVCB_NULL, - DEVCB_DEVICE_MEMBER("centronics", centronics_device, write), - DEVCB_DRIVER_MEMBER(compis_state, compis_ppi_port_b_r), - DEVCB_NULL, - DEVCB_NULL, - DEVCB_DRIVER_MEMBER(compis_state, compis_ppi_port_c_w) -}; - - -/*-------------------------------------------------------------------------*/ -/* PIT 8253 */ -/*-------------------------------------------------------------------------*/ - -WRITE_LINE_MEMBER( compis_state::tmr3_w ) -{ - m_mpsc->rxtxcb_w(state); -} - -WRITE_LINE_MEMBER( compis_state::tmr4_w ) -{ -} - -WRITE_LINE_MEMBER( compis_state::tmr5_w ) -{ - m_mpsc->rxca_w(state); - m_mpsc->txca_w(state); -} - -const struct pit8253_interface compis_pit8253_config = -{ - { - /* Timer0 */ - {XTAL_16MHz/8, DEVCB_LINE_VCC, DEVCB_DRIVER_LINE_MEMBER(compis_state, tmr3_w) }, - /* Timer1 */ - {XTAL_16MHz/8, DEVCB_LINE_VCC, DEVCB_DRIVER_LINE_MEMBER(compis_state, tmr4_w) }, - /* Timer2 */ - {XTAL_16MHz/8, DEVCB_LINE_VCC, DEVCB_DRIVER_LINE_MEMBER(compis_state, tmr5_w) } - } -}; - -WRITE_LINE_MEMBER( compis_state::tmr2_w ) -{ - m_uart->rxc_w(state); - m_uart->txc_w(state); -} - -const struct pit8253_interface compis_pit8254_config = -{ - { - /* Timer0 */ - {XTAL_16MHz/2, DEVCB_LINE_VCC, DEVCB_NULL /*DEVCB_DEVICE_LINE_MEMBER("pic8259_master", pic8259_device, ir3_w)*/ }, // SYSTICK - /* Timer1 */ - {XTAL_16MHz/2, DEVCB_LINE_VCC, DEVCB_DEVICE_LINE_MEMBER("pic8259_master", pic8259_device, ir7_w) }, // DELAY - /* Timer2 */ - {7932659, DEVCB_LINE_VCC, DEVCB_DRIVER_LINE_MEMBER(compis_state, tmr2_w) } // BAUD - } -}; - - -/*-------------------------------------------------------------------------*/ -/* USART 8251 */ -/*-------------------------------------------------------------------------*/ -const i8251_interface compis_usart_interface= -{ - DEVCB_DEVICE_LINE_MEMBER(COMPIS_KEYBOARD_TAG, compis_keyboard_device, so_r), - DEVCB_DEVICE_LINE_MEMBER(COMPIS_KEYBOARD_TAG, compis_keyboard_device, si_w), - DEVCB_NULL, - DEVCB_NULL, - DEVCB_NULL, - DEVCB_DEVICE_LINE_MEMBER("pic8259_master", pic8259_device, ir2_w), - DEVCB_NULL, //DEVCB_DEVICE_LINE_MEMBER("maincpu", i80186_cpu_device, int1_w), - DEVCB_NULL, - DEVCB_NULL -}; - -/*-------------------------------------------------------------------------*/ -/* Name: compis */ -/* Desc: Driver - Init */ -/*-------------------------------------------------------------------------*/ - -/************************************************************* - * - * pic8259 configuration - * - *************************************************************/ - -READ8_MEMBER(compis_state::compis_irq_callback) -{ - return m_8259m->inta_r(); -} - -WRITE_LINE_MEMBER( compis_state::tmr0_w ) -{ - m_tmr0 = state; - - m_cassette->output(m_tmr0 ? -1 : 1); -} - -WRITE8_MEMBER( compis_state::tape_mon_w ) -{ - cassette_state state = BIT(data, 0) ? CASSETTE_MOTOR_ENABLED : CASSETTE_MOTOR_DISABLED; - - m_cassette->change_state(state, CASSETTE_MASK_MOTOR); -} - -TIMER_DEVICE_CALLBACK_MEMBER( compis_state::tape_tick ) -{ - m_maincpu->tmrin0_w(m_cassette->input() > 0.0); -} - -void compis_state::machine_start() -{ -} - -/*-------------------------------------------------------------------------*/ -/* Name: compis */ -/* Desc: Machine - Init */ -/*-------------------------------------------------------------------------*/ -void compis_state::machine_reset() -{ - m_uart->reset(); - m_mpsc->reset(); - m_8255->reset(); - m_isbx0->reset(); - m_isbx1->reset(); -} diff --git a/src/mess/mess.mak b/src/mess/mess.mak index 437dabf9228..4ba4158144f 100644 --- a/src/mess/mess.mak +++ b/src/mess/mess.mak @@ -1900,7 +1900,6 @@ $(MESSOBJ)/tektroni.a: \ $(MESSOBJ)/telenova.a: \ $(MESS_DRIVERS)/compis.o \ - $(MESS_MACHINE)/compis.o \ $(MESS_MACHINE)/compiskb.o \ $(MESSOBJ)/telercas.a: \