From 6c0c210d434e25682297452d73f604caa10a044e Mon Sep 17 00:00:00 2001 From: Robbbert Date: Sun, 25 Aug 2013 09:39:28 +0000 Subject: [PATCH] (MESS) New skeleton [Cowering, Robbbert] ------------------------------------------------- Telcon Zorba --- .gitattributes | 1 + src/mess/drivers/onyx.c | 18 +- src/mess/drivers/zorba.c | 459 +++++++++++++++++++++++++++++++++++++++ src/mess/mess.lst | 1 + src/mess/mess.mak | 1 + 5 files changed, 471 insertions(+), 9 deletions(-) create mode 100644 src/mess/drivers/zorba.c diff --git a/.gitattributes b/.gitattributes index 155e755b475..4e2b1d62aa9 100644 --- a/.gitattributes +++ b/.gitattributes @@ -6647,6 +6647,7 @@ src/mess/drivers/z88.c svneol=native#text/plain src/mess/drivers/z9001.c svneol=native#text/plain src/mess/drivers/zaurus.c svneol=native#text/plain src/mess/drivers/zexall.c svneol=native#text/plain +src/mess/drivers/zorba.c svneol=native#text/plain src/mess/drivers/zrt80.c svneol=native#text/plain src/mess/drivers/zsbc3.c svneol=native#text/plain src/mess/drivers/zx.c svneol=native#text/plain diff --git a/src/mess/drivers/onyx.c b/src/mess/drivers/onyx.c index bbd45385794..40c7088b08d 100644 --- a/src/mess/drivers/onyx.c +++ b/src/mess/drivers/onyx.c @@ -427,18 +427,18 @@ ROM_START( c8002 ) ROM_LOAD("459-3", 0x0000, 0x0800, CRC(c8906653) SHA1(7dea9fffa974479ef5926df567261f2aaa7a3283)) ROM_LOAD("460-3", 0x0800, 0x0800, CRC(ce6c0214) SHA1(f69ee4c6c0d1e72574a9cf828dbb3e08f06d029a)) - ROM_REGION( 0x200, "proms", 0 ) + ROM_REGION( 0x900, "proms", 0 ) // for main cpu ROM_LOAD("468-a", 0x000, 0x100, CRC(89781491) SHA1(f874d0cf42a733eb2b92b15647aeac7178d7b9b1)) - ROM_LOAD("469-a", 0x000, 0x100, CRC(45e439de) SHA1(4f1af44332ae709d92e919c9e48433f29df5e632)) - ROM_LOAD("470a-3", 0x000, 0x100, CRC(c50622a9) SHA1(deda0df93fc4e4b5f4be313e4bfe0c5fc669a024)) - ROM_LOAD("471-a", 0x000, 0x100, CRC(c09ca06b) SHA1(cb99172f5342427c68a109ee108a0c49b44e7010)) - ROM_LOAD("472-a", 0x000, 0x100, CRC(e1316fed) SHA1(41ed2d822c74da4e1ce06eb229629576e7f5035f)) - ROM_LOAD("473-a", 0x000, 0x100, CRC(5e8efd7f) SHA1(647064e0c3b0d795a333febc57228472b1b32345)) - ROM_LOAD("474-a", 0x000, 0x100, CRC(0052edfd) SHA1(b5d18c9a6adce7a6d627ece40a60aab8c55a6597)) + ROM_LOAD("469-a", 0x100, 0x100, CRC(45e439de) SHA1(4f1af44332ae709d92e919c9e48433f29df5e632)) + ROM_LOAD("470a-3", 0x200, 0x100, CRC(c50622a9) SHA1(deda0df93fc4e4b5f4be313e4bfe0c5fc669a024)) + ROM_LOAD("471-a", 0x300, 0x100, CRC(c09ca06b) SHA1(cb99172f5342427c68a109ee108a0c49b44e7010)) + ROM_LOAD("472-a", 0x400, 0x100, CRC(e1316fed) SHA1(41ed2d822c74da4e1ce06eb229629576e7f5035f)) + ROM_LOAD("473-a", 0x500, 0x100, CRC(5e8efd7f) SHA1(647064e0c3b0d795a333febc57228472b1b32345)) + ROM_LOAD("474-a", 0x600, 0x100, CRC(0052edfd) SHA1(b5d18c9a6adce7a6d627ece40a60aab8c55a6597)) // for sub cpu - ROM_LOAD("453-a", 0x000, 0x100, CRC(7bc3871e) SHA1(6f75eb04911fa1ff66714276b8a88be62438a1b0)) - ROM_LOAD("454-a", 0x000, 0x100, CRC(aa2233cd) SHA1(4ec3a8c06cccda02f080e89831ecd8a9c96d3650)) + ROM_LOAD("453-a", 0x700, 0x100, CRC(7bc3871e) SHA1(6f75eb04911fa1ff66714276b8a88be62438a1b0)) + ROM_LOAD("454-a", 0x800, 0x100, CRC(aa2233cd) SHA1(4ec3a8c06cccda02f080e89831ecd8a9c96d3650)) ROM_END /* Driver */ diff --git a/src/mess/drivers/zorba.c b/src/mess/drivers/zorba.c new file mode 100644 index 00000000000..a8fecf76b3c --- /dev/null +++ b/src/mess/drivers/zorba.c @@ -0,0 +1,459 @@ +/************************************************************************************************************ + +Telcon Zorba + +2013-08-25 Skeleton + +This was one of the last CP/M-based systems, already out of date when it was released. +Because it doesn't use the standard Z80 peripherals, it uses a homebrew interrupt controller to make use + of the Z80's IM2. + +ToDo: +- Add interrupt vector hardware and masking feature +- Connect devices to the above hardware +- Fix the unholy mess surrounding the dma and crtc +- Connect up the PIT +- Connect up the keyboard - the generic ascii one can be used +- Probably lots of other things + +Note: because the 8275 isn't working, a generic video handler is being used at this time. + +*************************************************************************************************************/ + + +#include "emu.h" +#include "cpu/z80/z80.h" +#include "machine/i8251.h" +#include "machine/6821pia.h" +#include "machine/z80dma.h" +#include "machine/pit8253.h" +#include "video/i8275x.h" +#include "sound/beep.h" +#include "machine/wd_fdc.h" + +class zorba_state : public driver_device +{ +public: + zorba_state(const machine_config &mconfig, device_type type, const char *tag) + : driver_device(mconfig, type, tag) + , m_p_videoram(*this, "videoram") + , m_maincpu(*this, "maincpu") + , m_beep(*this, "beeper") + , m_dma(*this, "dma") + , m_u0(*this, "uart0") + , m_u1(*this, "uart1") + , m_u2(*this, "uart2") + , m_pia0(*this, "pia0") + , m_pia1(*this, "pia1") + , m_crtc(*this, "crtc") + , m_fdc (*this, "fdc") + , m_floppy0(*this, "fdc:0") + , m_floppy1(*this, "fdc:1") + { } + +public: + const UINT8 *m_p_chargen; + UINT32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + void palette_init_zorba(); + required_shared_ptr m_p_videoram; + DECLARE_DRIVER_INIT(zorba); + DECLARE_MACHINE_RESET(zorba); + DECLARE_READ8_MEMBER(ram_r); + DECLARE_WRITE8_MEMBER(ram_w); + DECLARE_READ8_MEMBER(rom_r); + DECLARE_WRITE8_MEMBER(rom_w); + DECLARE_WRITE8_MEMBER(intmask_w); + DECLARE_WRITE_LINE_MEMBER(busreq_w); + DECLARE_READ8_MEMBER(memory_read_byte); + DECLARE_WRITE8_MEMBER(memory_write_byte); + DECLARE_READ8_MEMBER(io_read_byte); + DECLARE_WRITE8_MEMBER(io_write_byte); + DECLARE_WRITE8_MEMBER(pia0_porta_w); +private: + UINT8 m_porta; + UINT8 m_portb; + UINT8 m_portc; + UINT8 m_port08; + required_device m_maincpu; + required_device m_beep; + required_device m_dma; + required_device m_u0; + required_device m_u1; + required_device m_u2; + required_device m_pia0; + required_device m_pia1; + required_device m_crtc; + required_device m_fdc; + required_device m_floppy0; + required_device m_floppy1; +}; + +static ADDRESS_MAP_START( zorba_mem, AS_PROGRAM, 8, zorba_state ) + AM_RANGE( 0x0000, 0x3fff ) AM_READ_BANK("bankr0") AM_WRITE_BANK("bankw0") + AM_RANGE( 0x4000, 0xf6ff ) AM_RAM + AM_RANGE( 0xf700, 0xffff ) AM_RAM AM_SHARE("videoram") +ADDRESS_MAP_END + +static ADDRESS_MAP_START( zorba_io, AS_IO, 8, zorba_state ) + ADDRESS_MAP_GLOBAL_MASK(0xff) + AM_RANGE(0x00, 0x03) AM_DEVREADWRITE("pit", pit8254_device, read, write) + AM_RANGE(0x04, 0x04) AM_READWRITE(rom_r,rom_w) + AM_RANGE(0x05, 0x05) AM_READWRITE(ram_r,ram_w) + AM_RANGE(0x10, 0x11) AM_DEVREADWRITE("crtc", i8275x_device, read, write) + AM_RANGE(0x20, 0x20) AM_DEVREADWRITE("uart0", i8251_device, data_r, data_w) + AM_RANGE(0x21, 0x21) AM_DEVREADWRITE("uart0", i8251_device, status_r, control_w) + AM_RANGE(0x22, 0x22) AM_DEVREADWRITE("uart1", i8251_device, data_r, data_w) + AM_RANGE(0x23, 0x23) AM_DEVREADWRITE("uart1", i8251_device, status_r, control_w) + AM_RANGE(0x24, 0x24) AM_DEVREADWRITE("uart2", i8251_device, data_r, data_w) + AM_RANGE(0x25, 0x25) AM_DEVREADWRITE("uart2", i8251_device, status_r, control_w) + AM_RANGE(0x26, 0x26) AM_WRITE(intmask_w) + AM_RANGE(0x30, 0x30) AM_DEVREADWRITE_LEGACY("dma", z80dma_r, z80dma_w) + AM_RANGE(0x40, 0x43) AM_DEVREADWRITE("fdc", fd1793_t, read, write) + AM_RANGE(0x50, 0x53) AM_DEVREADWRITE("pia0", pia6821_device, read, write) + AM_RANGE(0x60, 0x63) AM_DEVREADWRITE("pia1", pia6821_device, read, write) +ADDRESS_MAP_END + +READ8_MEMBER( zorba_state::ram_r ) +{ + membank("bankr0")->set_entry(0); + return 0; +} + +WRITE8_MEMBER( zorba_state::ram_w ) +{ + membank("bankr0")->set_entry(0); +} + +READ8_MEMBER( zorba_state::rom_r ) +{ + membank("bankr0")->set_entry(1); + return 0; +} + +WRITE8_MEMBER( zorba_state::rom_w ) +{ + membank("bankr0")->set_entry(1); +} + +WRITE8_MEMBER( zorba_state::intmask_w ) +{ +} + +static INPUT_PORTS_START( zorba ) +INPUT_PORTS_END + +DRIVER_INIT_MEMBER( zorba_state, zorba ) +{ + UINT8 *main = memregion("maincpu")->base(); + + membank("bankr0")->configure_entry(0, &main[0x0000]); + membank("bankr0")->configure_entry(1, &main[0x10000]); + membank("bankw0")->configure_entry(0, &main[0x0000]); +} + +//------------------------------------------------- +// Z80DMA_INTERFACE( dma_intf ) +//------------------------------------------------- + +WRITE_LINE_MEMBER( zorba_state::busreq_w ) +{ +// since our Z80 has no support for BUSACK, we assume it is granted immediately + m_maincpu->set_input_line(Z80_INPUT_LINE_BUSRQ, state); + m_maincpu->set_input_line(INPUT_LINE_HALT, state); // do we need this? + m_dma->bai_w(state); // tell dma that bus has been granted + + address_space &space = m_maincpu->space(AS_IO); + m_crtc->dack_w(space, 0, 0); // this must pass a whole row of data from the dma +} + +READ8_MEMBER(zorba_state::memory_read_byte) +{ + address_space& prog_space = m_maincpu->space(AS_PROGRAM); + return prog_space.read_byte(offset); +} + +WRITE8_MEMBER(zorba_state::memory_write_byte) +{ + address_space& prog_space = m_maincpu->space(AS_PROGRAM); + return prog_space.write_byte(offset, data); +} + +READ8_MEMBER(zorba_state::io_read_byte) +{ + address_space& prog_space = m_maincpu->space(AS_IO); + return prog_space.read_byte(offset); +} + +WRITE8_MEMBER(zorba_state::io_write_byte) +{ + address_space& prog_space = m_maincpu->space(AS_IO); + return prog_space.write_byte(offset, data); +} + +// busack on cpu connects to bai pin +static Z80DMA_INTERFACE( dma_intf ) +{ + //DEVCB_CPU_INPUT_LINE("maincpu", INPUT_LINE_HALT), //busreq - connects to busreq on cpu + DEVCB_DRIVER_LINE_MEMBER(zorba_state, busreq_w), //busreq - connects to busreq on cpu + DEVCB_CPU_INPUT_LINE("maincpu", INPUT_LINE_IRQ0), //int/pulse - connects to IRQ0 on cpu + DEVCB_NULL, //ba0 - not connected + DEVCB_DRIVER_MEMBER(zorba_state, memory_read_byte), + DEVCB_DRIVER_MEMBER(zorba_state, memory_write_byte), + DEVCB_DRIVER_MEMBER(zorba_state, io_read_byte), + DEVCB_DRIVER_MEMBER(zorba_state, io_write_byte), +}; + +static SLOT_INTERFACE_START( zorba_floppies ) + SLOT_INTERFACE( "525dd", FLOPPY_525_DD ) +SLOT_INTERFACE_END + +// COM port +static const i8251_interface u0_intf = +{ + DEVCB_NULL, + DEVCB_NULL, + DEVCB_NULL, + DEVCB_NULL, + DEVCB_NULL, + DEVCB_NULL, + DEVCB_NULL, + DEVCB_NULL, + DEVCB_NULL +}; + +// printer port +static const i8251_interface u1_intf = +{ + DEVCB_NULL, + DEVCB_NULL, + DEVCB_NULL, + DEVCB_NULL, + DEVCB_NULL, + DEVCB_NULL, + DEVCB_NULL, + DEVCB_NULL, + DEVCB_NULL +}; + +// keyboard +static const i8251_interface u2_intf = +{ + DEVCB_NULL, + DEVCB_NULL, + DEVCB_NULL, + DEVCB_NULL, + DEVCB_NULL, + DEVCB_NULL, + DEVCB_NULL, + DEVCB_NULL, + DEVCB_NULL +}; + +WRITE8_MEMBER( zorba_state::pia0_porta_w ) +{ + m_beep->set_state(BIT(data, 7)); + m_fdc->dden_w(!BIT(data, 6)); + + floppy_image_device *floppy = NULL; + if (BIT(data, 0)) floppy = m_floppy0->get_device(); + if (BIT(data, 1)) floppy = m_floppy1->get_device(); + + m_fdc->set_floppy(floppy); + + if (floppy) + { + floppy->ss_w(BIT(data, 5)); // might need inverting + } + + m_floppy0->get_device()->mon_w(BIT(data, 4)); + m_floppy1->get_device()->mon_w(BIT(data, 4)); +} + +// port A - disk select etc, beeper +// port B - parallel interface +static const pia6821_interface pia0_intf = +{ + DEVCB_NULL, /* port A input */ + DEVCB_NULL, /* port B input */ + DEVCB_NULL, /* CA1 input */ + DEVCB_NULL, /* CB1 input */ + DEVCB_NULL, /* CA2 input */ + DEVCB_NULL, /* CB2 input */ + DEVCB_DRIVER_MEMBER(zorba_state, pia0_porta_w), /* port A output */ + DEVCB_NULL, /* port B output */ + DEVCB_NULL, /* CA2 output */ + DEVCB_NULL, /* CB2 output */ + DEVCB_NULL, /* IRQA output */ + DEVCB_NULL /* IRQB output */ +}; + +// IEEE488 interface +static const pia6821_interface pia1_intf = +{ + DEVCB_NULL, /* port A input */ + DEVCB_NULL, /* port B input */ + DEVCB_NULL, /* CA1 input */ + DEVCB_NULL, /* CB1 input */ + DEVCB_NULL, /* CA2 input */ + DEVCB_NULL, /* CB2 input */ + DEVCB_NULL, /* port A output */ + DEVCB_NULL, /* port B output */ + DEVCB_NULL, /* CA2 output */ + DEVCB_NULL, /* CB2 output */ + DEVCB_NULL, /* IRQA output */ + DEVCB_NULL /* IRQB output */ +}; + +static const struct pit8253_interface pit_intf = +{ + { + { + XTAL_24MHz / 3, /* Timer 0: ? */ + DEVCB_NULL, + DEVCB_NULL + }, { + XTAL_24MHz / 3, /* Timer 1: ? */ + DEVCB_NULL, + DEVCB_NULL + }, { + XTAL_24MHz / 3, /* Timer 2: ? */ + DEVCB_NULL, + DEVCB_NULL + } + } +}; + +PALETTE_INIT_MEMBER( zorba_state, zorba ) +{ + palette_set_color_rgb( machine(), 0, 0, 0, 0 ); /* Black */ + palette_set_color_rgb( machine(), 1, 0, 255, 0 ); /* Full */ + palette_set_color_rgb( machine(), 2, 0, 128, 0 ); /* Dimmed */ +} + +// need to include highlight attr +static I8275_DISPLAY_PIXELS( zorba_update_chr ) +{ + int i; + zorba_state *state = device->machine().driver_data(); + const rgb_t *palette = palette_entry_list_raw(bitmap.palette()); + UINT8 gfx = state->m_p_chargen[(linecount & 15) + (charcode << 4)]; + + if (vsp) + gfx = 0; + + if (lten) + gfx = 0xff; + + if (rvv) + gfx ^= 0xff; + + for(i=0;i<8;i++) + bitmap.pix32(y, x + 7 - i) = palette[BIT(gfx, i) ? (hlgt ? 2 : 1) : 0]; +} + +// dack connects to busack on cpu +// drq connects to pin 25 "RDY" on z80dma +const i8275_interface crtc_intf = +{ + 8, // pixels in each char + 0, // delay + DEVCB_NULL,//DEVCB_DEVICE_LINE_MEMBER("dma", z80dma_device, rdy_w), //wrln drq + DEVCB_CPU_INPUT_LINE("maincpu", INPUT_LINE_IRQ0), //wrln irq + DEVCB_NULL, //wrln h + DEVCB_NULL, //wrln v + zorba_update_chr // output func +}; + +MACHINE_RESET_MEMBER( zorba_state, zorba ) +{ + m_beep->set_frequency(800); + m_p_chargen = memregion("chargen")->base(); + membank("bankr0")->set_entry(1); // point at rom + membank("bankw0")->set_entry(0); // always write to ram +} + +UINT32 zorba_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) +{ + UINT8 y,ra,chr,gfx; + UINT16 sy=0,ma=0,x; + + for (y = 0; y < 25; y++) + { + for (ra = 0; ra < 11; ra++) + { + UINT16 *p = &bitmap.pix16(sy++); + + for (x = 0; x < 80; x++) + { + gfx = 0; + chr = m_p_videoram[x+ma]; + + if (chr) gfx = m_p_chargen[(chr<<4) | ra ]; + + /* Display a scanline of a character */ + *p++ = BIT(gfx, 7); + *p++ = BIT(gfx, 6); + *p++ = BIT(gfx, 5); + *p++ = BIT(gfx, 4); + *p++ = BIT(gfx, 3); + *p++ = BIT(gfx, 2); + *p++ = BIT(gfx, 1); + *p++ = BIT(gfx, 0); + } + } + ma+=80; + } + return 0; +} + +static MACHINE_CONFIG_START( zorba, zorba_state ) + // basic machine hardware + MCFG_CPU_ADD("maincpu", Z80, XTAL_24MHz / 6) + MCFG_CPU_PROGRAM_MAP(zorba_mem) + MCFG_CPU_IO_MAP(zorba_io) + MCFG_MACHINE_RESET_OVERRIDE(zorba_state, zorba) + + /* video hardware */ + MCFG_SCREEN_ADD("screen", RASTER) + MCFG_SCREEN_REFRESH_RATE(60) + MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */ + //MCFG_SCREEN_UPDATE_DEVICE("crtc", i8275x_device, screen_update) // not working + MCFG_SCREEN_UPDATE_DRIVER(zorba_state, screen_update) + MCFG_SCREEN_SIZE(640, 276) + MCFG_SCREEN_VISIBLE_AREA(0, 639, 0, 275) + MCFG_PALETTE_LENGTH(3) + MCFG_PALETTE_INIT_OVERRIDE(zorba_state, zorba) + + /* sound hardware */ + MCFG_SPEAKER_STANDARD_MONO("mono") + MCFG_SOUND_ADD("beeper", BEEP, 0) + MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00) + + /* Devices */ + MCFG_Z80DMA_ADD("dma", XTAL_24MHz/6, dma_intf) + MCFG_I8251_ADD("uart0", u0_intf) + MCFG_I8251_ADD("uart1", u1_intf) + MCFG_I8251_ADD("uart2", u2_intf) + MCFG_PIA6821_ADD("pia0", pia0_intf) + MCFG_PIA6821_ADD("pia1", pia1_intf) + MCFG_PIT8254_ADD( "pit", pit_intf) + MCFG_I8275_ADD ( "crtc", 2e6, crtc_intf) + MCFG_FD1793x_ADD("fdc", XTAL_24MHz / 24) + MCFG_FLOPPY_DRIVE_ADD("fdc:0", zorba_floppies, "525dd", floppy_image_device::default_floppy_formats) + MCFG_FLOPPY_DRIVE_ADD("fdc:1", zorba_floppies, "525dd", floppy_image_device::default_floppy_formats) +MACHINE_CONFIG_END + +ROM_START( zorba ) + ROM_REGION( 0x14000, "maincpu", ROMREGION_ERASEFF ) + ROM_LOAD( "780000.u47", 0x10000, 0x1000, CRC(6d58f2c5) SHA1(7763f08c801cd36e5a761c6dc9f30a50b3bc482d) ) + + ROM_REGION( 0x1000, "chargen", 0 ) + ROM_LOAD( "773000.u5", 0x0000, 0x1000, CRC(d0a2f8fc) SHA1(29aee7ee657778c46e9800abd4955e6d4b33ef68) ) + + ROM_REGION( 0x60, "proms", 0 ) + ROM_LOAD( "74ls288.u37", 0x0000, 0x0020, CRC(0a67edd6) SHA1(c1ece8978a3a061e0130d43907fa63a71e75e75d) ) + ROM_LOAD( "74ls288.u38", 0x0020, 0x0020, CRC(5ec93ea7) SHA1(3a84c098474b05d5cbe1939a3e15f66d06470581) ) + ROM_LOAD( "74ls288.u77", 0x0040, 0x0020, CRC(946e03b0) SHA1(24240bdd7bdf507a5b51628fb36ad1266fc53a28) ) +ROM_END + +COMP( 1982, zorba, 0, 0, zorba, zorba, zorba_state, zorba, "Telcon Industries", "Zorba", GAME_NOT_WORKING ) diff --git a/src/mess/mess.lst b/src/mess/mess.lst index 0403c9dc667..a977a376fe9 100644 --- a/src/mess/mess.lst +++ b/src/mess/mess.lst @@ -2250,4 +2250,5 @@ seattle c8002 sbrain ibm6580 +zorba diff --git a/src/mess/mess.mak b/src/mess/mess.mak index 616f3f632d0..f406ef8e1d5 100644 --- a/src/mess/mess.mak +++ b/src/mess/mess.mak @@ -2444,6 +2444,7 @@ $(MESSOBJ)/skeleton.a: \ $(MESS_DRIVERS)/vta2000.o \ $(MESS_DRIVERS)/xor100.o \ $(MESS_DRIVERS)/z100.o \ + $(MESS_DRIVERS)/zorba.o \