summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/olympiaint/olyboss.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/olympiaint/olyboss.cpp')
-rw-r--r--src/mame/olympiaint/olyboss.cpp604
1 files changed, 604 insertions, 0 deletions
diff --git a/src/mame/olympiaint/olyboss.cpp b/src/mame/olympiaint/olyboss.cpp
new file mode 100644
index 00000000000..32a3c8e59cb
--- /dev/null
+++ b/src/mame/olympiaint/olyboss.cpp
@@ -0,0 +1,604 @@
+// license:BSD-3-Clause
+// copyright-holders: Gabriele D'Antona
+/*
+ Olympia BOSS
+ Made in Germany around 1981
+
+ The BOSS series was not a great success, as its members differed too much to be compatible:
+ First they were 8085 based, later machines used a Z80A.
+
+ Other distinguishing features were the capacity of the disk drives:
+
+ BOSS A: Two 128K floppy drives
+ BOSS B: Two 256K disk drives
+ BOSS C: Two 600K disk drives
+ BOSS D: One 600K disk drive, one 5 MB harddisk
+ BOSS M: M for multipost, up to four BOSS machines linked together for up to 20MB shared harddisk space
+
+ Olympia favoured the French Prologue operating system over CPM (cf. Olympia People PC) and supplied BAL
+ as a programming language with it.
+
+ Video is 80x28
+
+ There are no service manuals available (or no documentation in general), so everything is guesswork.
+
+ - Ports 0x80 and 0x81 seem to be related to the graphics chip and cursor position
+ The rom outs value 0x81 to port 0x81 and then the sequence <column> <row> (?) to port 0x80
+
+ - The machine boots up and shows "BOSS .." on the screen. Every keystroke is repeated on screen.
+ If you press <return>, the machine seems to go into a boot sequence (from the HD, probably)
+
+ The harddisk controller is based on a MSC-9056.
+
+ Links: http://www.old-computers.com/museum/computer.asp?c=95
+*/
+
+#include "emu.h"
+#include "cpu/z80/z80.h"
+#include "cpu/i8085/i8085.h"
+#include "imagedev/floppy.h"
+#include "machine/keyboard.h"
+#include "video/upd3301.h"
+#include "machine/i8257.h"
+#include "machine/i8255.h"
+#include "machine/am9519.h"
+#include "machine/upd765.h"
+#include "machine/pic8259.h"
+#include "machine/i8251.h"
+#include "screen.h"
+
+
+namespace {
+
+#define UPD3301_TAG "upd3301"
+#define I8257_TAG "i8257"
+#define SCREEN_TAG "screen"
+
+//**************************************************************************
+// TYPE DEFINITIONS
+//**************************************************************************
+
+class olyboss_state : public driver_device
+{
+public:
+ olyboss_state(const machine_config &mconfig, device_type type, const char *tag)
+ : driver_device(mconfig, type, tag)
+ , m_maincpu(*this, "maincpu")
+ , m_dma(*this, I8257_TAG)
+ , m_crtc(*this, UPD3301_TAG)
+ , m_fdc(*this, "fdc")
+ , m_uic(*this, "uic")
+ , m_pic(*this, "pic")
+ , m_ppi(*this, "ppi")
+ , m_fdd0(*this, "fdc:0")
+ , m_fdd1(*this, "fdc:1")
+ , m_rom(*this, "mainrom")
+ , m_lowram(*this, "lowram")
+ , m_char_rom(*this, UPD3301_TAG)
+ { }
+
+public:
+ void bossa85(machine_config &config);
+ void bossb85(machine_config &config);
+ void olybossb(machine_config &config);
+ void olybossc(machine_config &config);
+ void olybossd(machine_config &config);
+
+protected:
+ virtual void machine_start() override ATTR_COLD;
+ virtual void machine_reset() override ATTR_COLD;
+
+ TIMER_CALLBACK_MEMBER(toggle_tim);
+
+private:
+ u8 keyboard_read();
+
+ UPD3301_DRAW_CHARACTER_MEMBER( olyboss_display_pixels );
+
+ void hrq_w(int state);
+ void tc_w(int state);
+ void romdis_w(int state);
+ u8 dma_mem_r(offs_t offset);
+ void dma_mem_w(offs_t offset, u8 data);
+ u8 fdcctrl_r();
+ void fdcctrl_w(u8 data);
+ void fdcctrl85_w(u8 data);
+ u8 fdcdma_r();
+ void fdcdma_w(u8 data);
+ void crtcdma_w(u8 data);
+ u8 rom_r(offs_t offset);
+ void rom_w(offs_t offset, u8 data);
+ void vchrmap_w(offs_t offset, u8 data);
+ void vchrram_w(offs_t offset, u8 data);
+ void vchrram85_w(offs_t offset, u8 data);
+ void ppic_w(u8 data);
+ void olyboss_io(address_map &map) ATTR_COLD;
+ void olyboss_mem(address_map &map) ATTR_COLD;
+ void olyboss85_io(address_map &map) ATTR_COLD;
+
+ required_device<cpu_device> m_maincpu;
+ required_device<i8257_device> m_dma;
+ required_device<upd3301_device> m_crtc;
+ required_device<upd765a_device> m_fdc;
+ optional_device<am9519_device> m_uic;
+ optional_device<pic8259_device> m_pic;
+ optional_device<i8255_device> m_ppi;
+ required_device<floppy_connector> m_fdd0;
+ optional_device<floppy_connector> m_fdd1;
+ required_memory_region m_rom;
+ required_shared_ptr<u8> m_lowram;
+ required_memory_region m_char_rom;
+
+ bool m_keybhit;
+ u8 m_keystroke;
+ void keyboard_put(u8 data);
+ void keyboard85_put(u8 data);
+ u8 m_fdcctrl, m_fdctype;
+ u8 m_channel, m_vchrmap, m_vchrpage;
+ u16 m_vchraddr;
+ u8 m_vchrram[0x800];
+ bool m_romen, m_timstate;
+ emu_timer *m_timer;
+};
+
+void olyboss_state::machine_reset()
+{
+ m_keybhit = false;
+ m_romen = true;
+ m_timstate = false;
+
+ m_fdcctrl = 0;
+ m_vchrmap = 0;
+ m_vchrpage = 0;
+ m_timer->adjust(attotime::from_hz(30), 0, attotime::from_hz(30)); // unknown timer freq, possibly com2651 BRCLK
+}
+
+TIMER_CALLBACK_MEMBER(olyboss_state::toggle_tim)
+{
+ m_timstate = !m_timstate;
+ if(m_pic)
+ m_pic->ir0_w(m_timstate);
+ else
+ m_uic->ireq7_w(m_timstate);
+}
+
+//**************************************************************************
+// ADDRESS MAPS
+//**************************************************************************
+
+void olyboss_state::olyboss_mem(address_map &map)
+{
+ map(0x0000, 0x7ff).rw(FUNC(olyboss_state::rom_r), FUNC(olyboss_state::rom_w)).share("lowram");
+ map(0x800, 0xffff).ram();
+}
+
+void olyboss_state::olyboss_io(address_map &map)
+{
+ map.global_mask(0xff);
+ map.unmap_value_high();
+ map(0x00, 0x08).rw(m_dma, FUNC(i8257_device::read), FUNC(i8257_device::write));
+ map(0x10, 0x11).m(m_fdc, FUNC(upd765a_device::map));
+ //map(0x20, 0x20) //beeper?
+ map(0x30, 0x30).rw(m_uic, FUNC(am9519_device::data_r), FUNC(am9519_device::data_w));
+ map(0x31, 0x31).rw(m_uic, FUNC(am9519_device::stat_r), FUNC(am9519_device::cmd_w));
+ map(0x40, 0x43).rw(m_ppi, FUNC(i8255_device::read), FUNC(i8255_device::write));
+ //map(0x50, 0x53) COM2651
+ map(0x60, 0x60).rw(FUNC(olyboss_state::fdcctrl_r), FUNC(olyboss_state::fdcctrl_w));
+ map(0x80, 0x81).rw(m_crtc, FUNC(upd3301_device::read), FUNC(upd3301_device::write));
+ map(0x82, 0x84).w(FUNC(olyboss_state::vchrmap_w));
+ map(0x90, 0x9f).w(FUNC(olyboss_state::vchrram_w));
+}
+
+void olyboss_state::olyboss85_io(address_map &map)
+{
+ map.global_mask(0xff);
+ map.unmap_value_high();
+ map(0x0, 0x8).rw(m_dma, FUNC(i8257_device::read), FUNC(i8257_device::write));
+ map(0x10, 0x11).m(m_fdc, FUNC(upd765a_device::map));
+ map(0x20, 0x21).rw(m_crtc, FUNC(upd3301_device::read), FUNC(upd3301_device::write));
+ map(0x30, 0x31).rw(m_pic, FUNC(pic8259_device::read), FUNC(pic8259_device::write));
+ map(0x42, 0x42).r(FUNC(olyboss_state::keyboard_read));
+ map(0x42, 0x44).w(FUNC(olyboss_state::vchrram85_w));
+ map(0x45, 0x45).w(FUNC(olyboss_state::fdcctrl85_w));
+}
+
+static INPUT_PORTS_START( olyboss )
+ PORT_START("DSW")
+INPUT_PORTS_END
+
+u8 olyboss_state::rom_r(offs_t offset)
+{
+ return m_romen ? m_rom->as_u8(offset) : m_lowram[offset];
+}
+
+void olyboss_state::rom_w(offs_t offset, u8 data)
+{
+ m_lowram[offset] = data;
+}
+
+void olyboss_state::vchrram85_w(offs_t offset, u8 data)
+{
+ switch(offset)
+ {
+ case 0:
+ m_vchraddr = (m_vchraddr & 0x00f) | (data << 4);
+ break;
+ case 1:
+ m_vchraddr = (m_vchraddr & 0xff0) | (data & 0xf);
+ break;
+ case 2:
+ m_vchrram[m_vchraddr] = data;
+ break;
+ }
+}
+
+void olyboss_state::vchrmap_w(offs_t offset, u8 data)
+{
+ switch(offset)
+ {
+ case 0:
+ m_vchrmap = data;
+ break;
+ case 2:
+ m_vchrpage = data & 0x7f;
+ break;
+ }
+}
+
+void olyboss_state::vchrram_w(offs_t offset, u8 data)
+{
+ m_vchrram[(m_vchrpage << 4) + (offset ^ 0xf)] = data;
+}
+
+void olyboss_state::romdis_w(int state)
+{
+ m_romen = state ? false : true;
+}
+
+//**************************************************************************
+// VIDEO
+//**************************************************************************
+
+UPD3301_DRAW_CHARACTER_MEMBER( olyboss_state::olyboss_display_pixels )
+{
+ u8 data = cc & 0x7f;
+ if(cc & 0x80)
+ data = m_vchrram[(data << 4) | lc];
+ else
+ data = m_char_rom->base()[(data << 4) | lc];
+
+ //if (lc >= 8) return;
+ if (csr)
+ data = 0xff;
+
+ for (int i = 0; i < 8; i++)
+ {
+ int color = BIT(data, 7);
+ bitmap.pix(y, (sx * 8) + i) = color ? 0xffffff : 0;
+ data <<= 1;
+ }
+}
+
+//**************************************************************************
+// KEYBOARD
+//**************************************************************************
+
+u8 olyboss_state::keyboard_read()
+{
+ //logerror ("keyboard_read offs [%d]\n",offset);
+ if (m_keybhit)
+ {
+ m_keybhit=false;
+ if(m_pic)
+ m_pic->ir1_w(CLEAR_LINE);
+ return m_keystroke;
+ }
+ return 0x00;
+}
+
+void olyboss_state::ppic_w(u8 data)
+{
+ m_uic->ireq4_w(BIT(data, 5) ? CLEAR_LINE : ASSERT_LINE);
+ m_fdcctrl = (m_fdcctrl & ~0x10) | (BIT(data, 5) ? 0x10 : 0);
+}
+
+void olyboss_state::machine_start()
+{
+ m_timer = timer_alloc(FUNC(olyboss_state::toggle_tim), this);
+ const char *type = m_fdd0->get_device()->shortname();
+ if(!strncmp(type, "floppy_525_qd", 13))
+ m_fdctype = 0xa0;
+ else
+ m_fdctype = 0x80;
+}
+
+void olyboss_state::keyboard_put(u8 data)
+{
+ if (data)
+ {
+ //logerror("Keyboard stroke [%2x]\n",data);
+ m_keystroke=data ^ 0xff;
+ m_keybhit=true;
+ m_ppi->pc4_w(ASSERT_LINE);
+ m_ppi->pc4_w(CLEAR_LINE);
+ }
+}
+
+void olyboss_state::keyboard85_put(u8 data)
+{
+ if(data)
+ {
+ m_pic->ir1_w(ASSERT_LINE);
+ m_keybhit = true;
+ m_keystroke = data;
+ }
+}
+
+/* 8257 Interface */
+
+void olyboss_state::hrq_w(int state)
+{
+ //logerror("hrq_w\n");
+ m_maincpu->set_input_line(INPUT_LINE_HALT,state);
+ m_dma->hlda_w(state);
+}
+
+void olyboss_state::tc_w(int state)
+{
+ if((m_channel == 0) && state)
+ {
+ m_fdc->tc_w(1);
+ m_fdc->tc_w(0);
+ }
+}
+
+u8 olyboss_state::dma_mem_r(offs_t offset)
+{
+ address_space &program = m_maincpu->space(AS_PROGRAM);
+ return program.read_byte(offset);
+}
+
+void olyboss_state::dma_mem_w(offs_t offset, u8 data)
+{
+ address_space &program = m_maincpu->space(AS_PROGRAM);
+ program.write_byte(offset, data);
+}
+
+u8 olyboss_state::fdcdma_r()
+{
+ m_channel = 0;
+ return m_fdc->dma_r();
+}
+
+void olyboss_state::fdcdma_w(u8 data)
+{
+ m_channel = 0;
+ m_fdc->dma_w(data);
+}
+
+void olyboss_state::crtcdma_w(u8 data)
+{
+ m_channel = 2;
+ m_crtc->dack_w(data);
+}
+
+u8 olyboss_state::fdcctrl_r()
+{
+ return m_fdcctrl | m_fdctype; // 0xc0 seems to indicate an 8" drive, 0x80 a 5.25" dd drive, 0xa0 a 5.25" qd drive
+}
+
+void olyboss_state::fdcctrl_w(u8 data)
+{
+ m_fdcctrl = data;
+ m_romen = (m_fdcctrl & 1) ? false : true;
+ m_fdd0->get_device()->mon_w(!(data & 2));
+ if(m_fdd1)
+ m_fdd1->get_device()->mon_w(!(data & 4));
+}
+
+void olyboss_state::fdcctrl85_w(u8 data)
+{
+ m_fdcctrl = data;
+ m_fdd0->get_device()->mon_w(!(data & 0x40));
+ if(m_fdd1)
+ m_fdd1->get_device()->mon_w(!(data & 0x80));
+}
+
+static void bossa_floppies(device_slot_interface &device)
+{
+ device.option_add("525ssdd", FLOPPY_525_SSDD);
+}
+
+static void bossb_floppies(device_slot_interface &device)
+{
+ device.option_add("525dd", FLOPPY_525_DD);
+}
+
+static void bosscd_floppies(device_slot_interface &device)
+{
+ device.option_add("525qd", FLOPPY_525_QD);
+}
+
+//**************************************************************************
+// MACHINE CONFIGURATION
+//**************************************************************************
+
+void olyboss_state::olybossd(machine_config &config)
+{
+ Z80(config, m_maincpu, 4_MHz_XTAL);
+ m_maincpu->set_addrmap(AS_PROGRAM, &olyboss_state::olyboss_mem);
+ m_maincpu->set_addrmap(AS_IO, &olyboss_state::olyboss_io);
+ m_maincpu->set_irq_acknowledge_callback("uic", FUNC(am9519_device::iack_cb));
+
+ /* video hardware */
+
+ screen_device &screen(SCREEN(config, SCREEN_TAG, SCREEN_TYPE_RASTER));
+ screen.set_color(rgb_t::green());
+ screen.set_refresh_hz(60);
+ screen.set_screen_update(UPD3301_TAG, FUNC(upd3301_device::screen_update));
+ screen.set_size(80*8, 28*11);
+ screen.set_visarea(0, (80*8)-1, 0, (28*11)-1);
+
+ /* devices */
+
+ AM9519(config, m_uic, 0);
+ m_uic->out_int_callback().set_inputline("maincpu", 0);
+
+ UPD765A(config, m_fdc, 8'000'000, true, true);
+ m_fdc->intrq_wr_callback().set(m_uic, FUNC(am9519_device::ireq2_w)).invert();
+ m_fdc->drq_wr_callback().set(m_dma, FUNC(i8257_device::dreq0_w));
+ FLOPPY_CONNECTOR(config, m_fdd0, bosscd_floppies, "525qd", floppy_image_device::default_mfm_floppy_formats);
+ m_fdd0->enable_sound(true);
+
+ I8257(config, m_dma, XTAL(4'000'000));
+ m_dma->out_hrq_cb().set(FUNC(olyboss_state::hrq_w));
+ m_dma->in_memr_cb().set(FUNC(olyboss_state::dma_mem_r));
+ m_dma->out_memw_cb().set(FUNC(olyboss_state::dma_mem_w));
+ m_dma->in_ior_cb<0>().set(FUNC(olyboss_state::fdcdma_r));
+ m_dma->out_iow_cb<0>().set(FUNC(olyboss_state::fdcdma_w));
+ m_dma->out_iow_cb<2>().set(FUNC(olyboss_state::crtcdma_w));
+ m_dma->out_tc_cb().set(FUNC(olyboss_state::tc_w));
+
+ UPD3301(config, m_crtc, XTAL(14'318'181));
+ m_crtc->set_character_width(8);
+ m_crtc->set_display_callback(FUNC(olyboss_state::olyboss_display_pixels));
+ m_crtc->set_attribute_fetch_callback(m_crtc, FUNC(upd3301_device::default_attr_fetch));
+ m_crtc->drq_wr_callback().set(m_dma, FUNC(i8257_device::dreq2_w));
+ m_crtc->int_wr_callback().set(m_uic, FUNC(am9519_device::ireq0_w)).invert();
+ m_crtc->set_screen(SCREEN_TAG);
+
+ I8255(config, m_ppi);
+ m_ppi->in_pa_callback().set(FUNC(olyboss_state::keyboard_read));
+ m_ppi->out_pc_callback().set(FUNC(olyboss_state::ppic_w));
+
+ /* keyboard */
+ generic_keyboard_device &keyboard(GENERIC_KEYBOARD(config, "keyboard", 0));
+ keyboard.set_keyboard_callback(FUNC(olyboss_state::keyboard_put));
+}
+
+void olyboss_state::olybossb(machine_config &config)
+{
+ olybossd(config);
+ config.device_remove("fdc:0");
+ FLOPPY_CONNECTOR(config, "fdc:0", bossb_floppies, "525dd", floppy_image_device::default_mfm_floppy_formats).enable_sound(true);
+ FLOPPY_CONNECTOR(config, "fdc:1", bossb_floppies, "525dd", floppy_image_device::default_mfm_floppy_formats).enable_sound(true);
+}
+
+void olyboss_state::olybossc(machine_config &config)
+{
+ olybossd(config);
+ FLOPPY_CONNECTOR(config, "fdc:1", bosscd_floppies, "525qd", floppy_image_device::default_mfm_floppy_formats).enable_sound(true);
+}
+
+void olyboss_state::bossb85(machine_config &config)
+{
+ i8085a_cpu_device &maincpu(I8085A(config, m_maincpu, 4_MHz_XTAL));
+ maincpu.set_addrmap(AS_PROGRAM, &olyboss_state::olyboss_mem);
+ maincpu.set_addrmap(AS_IO, &olyboss_state::olyboss85_io);
+ maincpu.in_inta_func().set(m_pic, FUNC(pic8259_device::acknowledge));
+ maincpu.out_sod_func().set(FUNC(olyboss_state::romdis_w));
+
+ /* video hardware */
+ screen_device &screen(SCREEN(config, SCREEN_TAG, SCREEN_TYPE_RASTER));
+ screen.set_color(rgb_t::green());
+ screen.set_refresh_hz(60);
+ screen.set_screen_update(UPD3301_TAG, FUNC(upd3301_device::screen_update));
+ screen.set_size(80*8, 28*11);
+ screen.set_visarea(0, (80*8)-1, 0, (28*11)-1);
+
+ /* devices */
+
+ PIC8259(config, m_pic, 0);
+ m_pic->out_int_callback().set_inputline(m_maincpu, 0);
+
+ UPD765A(config, m_fdc, 8'000'000, true, true);
+ m_fdc->intrq_wr_callback().set_inputline(m_maincpu, I8085_RST65_LINE);
+ m_fdc->drq_wr_callback().set(m_dma, FUNC(i8257_device::dreq0_w));
+ FLOPPY_CONNECTOR(config, "fdc:0", bossb_floppies, "525dd", floppy_image_device::default_mfm_floppy_formats).enable_sound(true);
+ FLOPPY_CONNECTOR(config, "fdc:1", bossb_floppies, "525dd", floppy_image_device::default_mfm_floppy_formats).enable_sound(true);
+
+ I8257(config, m_dma, XTAL(4'000'000));
+ m_dma->out_hrq_cb().set(FUNC(olyboss_state::hrq_w));
+ m_dma->in_memr_cb().set(FUNC(olyboss_state::dma_mem_r));
+ m_dma->out_memw_cb().set(FUNC(olyboss_state::dma_mem_w));
+ m_dma->in_ior_cb<0>().set(FUNC(olyboss_state::fdcdma_r));
+ m_dma->out_iow_cb<0>().set(FUNC(olyboss_state::fdcdma_w));
+ m_dma->out_iow_cb<2>().set(FUNC(olyboss_state::crtcdma_w));
+ m_dma->out_tc_cb().set(FUNC(olyboss_state::tc_w));
+
+ UPD3301(config, m_crtc, XTAL(14'318'181));
+ m_crtc->set_character_width(8);
+ m_crtc->set_display_callback(FUNC(olyboss_state::olyboss_display_pixels));
+ m_crtc->set_attribute_fetch_callback(m_crtc, FUNC(upd3301_device::default_attr_fetch));
+ m_crtc->drq_wr_callback().set(m_dma, FUNC(i8257_device::dreq2_w));
+ m_crtc->int_wr_callback().set_inputline("maincpu", I8085_RST75_LINE);
+ m_crtc->set_screen(SCREEN_TAG);
+
+ /* keyboard */
+ generic_keyboard_device &keyboard(GENERIC_KEYBOARD(config, "keyboard", 0));
+ keyboard.set_keyboard_callback(FUNC(olyboss_state::keyboard85_put));
+}
+
+void olyboss_state::bossa85(machine_config &config)
+{
+ bossb85(config);
+ FLOPPY_CONNECTOR(config.replace(), "fdc:0", bossa_floppies, "525ssdd", floppy_image_device::default_mfm_floppy_formats).enable_sound(true);
+ FLOPPY_CONNECTOR(config.replace(), "fdc:1", bossa_floppies, "525ssdd", floppy_image_device::default_mfm_floppy_formats).enable_sound(true);
+}
+
+//**************************************************************************
+// ROM DEFINITIONS
+//**************************************************************************
+ROM_START( bossa85 )
+ ROM_REGION(0x800, "mainrom", ROMREGION_ERASEFF)
+ ROM_LOAD( "boss_8085_bios.bin", 0x0000, 0x800, CRC(43030231) SHA1(a1f6546a9dc1066324e93e5eed886f2313678180) )
+
+ ROM_REGION( 0x800, UPD3301_TAG, 0)
+ ROM_LOAD( "olympia_boss_graphics_251-461.bin", 0x0000, 0x800, CRC(56149540) SHA1(b2b893bd219308fc98a38528beb7ddae391c7609) )
+ROM_END
+
+ROM_START( bossb85 )
+ ROM_REGION(0x800, "mainrom", ROMREGION_ERASEFF)
+ ROM_LOAD( "boss_8085_bios.bin", 0x0000, 0x800, CRC(43030231) SHA1(a1f6546a9dc1066324e93e5eed886f2313678180) )
+
+ ROM_REGION( 0x800, UPD3301_TAG, 0)
+ ROM_LOAD( "olympia_boss_graphics_251-461.bin", 0x0000, 0x800, CRC(56149540) SHA1(b2b893bd219308fc98a38528beb7ddae391c7609) )
+ROM_END
+
+ROM_START( olybossb ) // verified: BOSS B uses the same ROMs as D, so C is safe to assume as well
+ ROM_REGION(0x800, "mainrom", ROMREGION_ERASEFF)
+ ROM_LOAD( "olympia_boss_system_251-462.bin", 0x0000, 0x800, CRC(01b99609) SHA1(07b764c36337c12f7b40aa309b0805ceed8b22e2) )
+
+ ROM_REGION( 0x800, UPD3301_TAG, 0)
+ ROM_LOAD( "olympia_boss_graphics_251-461.bin", 0x0000, 0x800, CRC(56149540) SHA1(b2b893bd219308fc98a38528beb7ddae391c7609) )
+ROM_END
+
+ROM_START( olybossc )
+ ROM_REGION(0x800, "mainrom", ROMREGION_ERASEFF)
+ ROM_LOAD( "olympia_boss_system_251-462.bin", 0x0000, 0x800, CRC(01b99609) SHA1(07b764c36337c12f7b40aa309b0805ceed8b22e2) )
+
+ ROM_REGION( 0x800, UPD3301_TAG, 0)
+ ROM_LOAD( "olympia_boss_graphics_251-461.bin", 0x0000, 0x800, CRC(56149540) SHA1(b2b893bd219308fc98a38528beb7ddae391c7609) )
+ROM_END
+
+ROM_START( olybossd )
+ ROM_REGION(0x800, "mainrom", ROMREGION_ERASEFF)
+ ROM_LOAD( "olympia_boss_system_251-462.bin", 0x0000, 0x800, CRC(01b99609) SHA1(07b764c36337c12f7b40aa309b0805ceed8b22e2) )
+
+ ROM_REGION( 0x800, UPD3301_TAG, 0)
+ ROM_LOAD( "olympia_boss_graphics_251-461.bin", 0x0000, 0x800, CRC(56149540) SHA1(b2b893bd219308fc98a38528beb7ddae391c7609) )
+ROM_END
+
+} // anonymous namespace
+
+
+//**************************************************************************
+// SYSTEM DRIVERS
+//**************************************************************************
+
+// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS
+COMP(1981, bossa85, olybossd, 0, bossa85, olyboss, olyboss_state, empty_init, "Olympia International", "Olympia BOSS A 8085", MACHINE_NOT_WORKING | MACHINE_NO_SOUND )
+COMP(1981, bossb85, olybossd, 0, bossb85, olyboss, olyboss_state, empty_init, "Olympia International", "Olympia BOSS B 8085", MACHINE_NOT_WORKING | MACHINE_NO_SOUND )
+COMP(1981, olybossb, olybossd, 0, olybossb, olyboss, olyboss_state, empty_init, "Olympia International", "Olympia BOSS B", MACHINE_NOT_WORKING | MACHINE_NO_SOUND )
+COMP(1981, olybossc, olybossd, 0, olybossc, olyboss, olyboss_state, empty_init, "Olympia International", "Olympia BOSS C", MACHINE_NOT_WORKING | MACHINE_NO_SOUND )
+COMP(1981, olybossd, 0, 0, olybossd, olyboss, olyboss_state, empty_init, "Olympia International", "Olympia BOSS D", MACHINE_NOT_WORKING | MACHINE_NO_SOUND )