summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author Olivier Galibert <galibert@pobox.com>2014-04-12 15:15:20 +0000
committer Olivier Galibert <galibert@pobox.com>2014-04-12 15:15:20 +0000
commit5e378738aafb738373edf6014996482aa7ee6a3c (patch)
tree47f67bf33eaa8221c0befc8e9fab359ed56fda3d
parent49d95127f1aba390cf725dd7fe267da9366e04a8 (diff)
Oric 1: Spring cleaning [O. Galibert]
Putting back the apple2 disk2 in the Pravetz 8D will wait until the next generation one is finalized.
-rw-r--r--.gitattributes3
-rw-r--r--src/emu/bus/bus.mak11
-rw-r--r--src/emu/bus/oricext/jasmin.c173
-rw-r--r--src/emu/bus/oricext/jasmin.h41
-rw-r--r--src/emu/bus/oricext/microdisc.c151
-rw-r--r--src/emu/bus/oricext/microdisc.h52
-rw-r--r--src/emu/bus/oricext/oricext.c76
-rw-r--r--src/emu/bus/oricext/oricext.h63
-rw-r--r--src/emu/imagedev/floppy.c3
-rw-r--r--src/emu/machine/6522via.c10
-rw-r--r--src/emu/machine/6522via.h2
-rw-r--r--src/emu/machine/wd_fdc.c13
-rw-r--r--src/lib/formats/mfi_dsk.c2
-rw-r--r--src/lib/formats/oric_dsk.c348
-rw-r--r--src/lib/formats/oric_dsk.h18
-rw-r--r--src/mess/drivers/oric.c1129
-rw-r--r--src/mess/includes/oric.h204
-rw-r--r--src/mess/machine/oric.c1357
-rw-r--r--src/mess/mess.mak5
-rw-r--r--src/mess/tools/floptool/main.c8
-rw-r--r--src/mess/video/oric.c304
21 files changed, 1466 insertions, 2507 deletions
diff --git a/.gitattributes b/.gitattributes
index b506f3cd3d2..7f033c0cddd 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -8207,7 +8207,6 @@ src/mess/includes/next.h svneol=native#text/plain
src/mess/includes/ob68k1a.h svneol=native#text/plain
src/mess/includes/ondra.h svneol=native#text/plain
src/mess/includes/orao.h svneol=native#text/plain
-src/mess/includes/oric.h svneol=native#text/plain
src/mess/includes/orion.h svneol=native#text/plain
src/mess/includes/osborne1.h svneol=native#text/plain
src/mess/includes/osi.h svneol=native#text/plain
@@ -8562,7 +8561,6 @@ src/mess/machine/nextmo.c svneol=native#text/plain
src/mess/machine/nextmo.h svneol=native#text/plain
src/mess/machine/ondra.c svneol=native#text/plain
src/mess/machine/orao.c svneol=native#text/plain
-src/mess/machine/oric.c svneol=native#text/plain
src/mess/machine/orion.c svneol=native#text/plain
src/mess/machine/osborne1.c svneol=native#text/plain
src/mess/machine/p2000t.c svneol=native#text/plain
@@ -8834,7 +8832,6 @@ src/mess/video/nick.c svneol=native#text/plain
src/mess/video/nick.h svneol=native#text/plain
src/mess/video/ondra.c svneol=native#text/plain
src/mess/video/orao.c svneol=native#text/plain
-src/mess/video/oric.c svneol=native#text/plain
src/mess/video/orion.c svneol=native#text/plain
src/mess/video/osi.c svneol=native#text/plain
src/mess/video/p2000m.c svneol=native#text/plain
diff --git a/src/emu/bus/bus.mak b/src/emu/bus/bus.mak
index 70cefb05ddb..5fb3201e51a 100644
--- a/src/emu/bus/bus.mak
+++ b/src/emu/bus/bus.mak
@@ -1047,3 +1047,14 @@ OBJDIRS += $(BUSOBJ)/macpds
BUSOBJS += $(BUSOBJ)/macpds/macpds.o
BUSOBJS += $(BUSOBJ)/macpds/pds_tpdfpd.o
endif
+
+#-------------------------------------------------
+#
+#@src/emu/bus/oricext/oricext.h,BUSES += ORICEXT
+#-------------------------------------------------
+ifneq ($(filter ORICEXT,$(BUSES)),)
+OBJDIRS += $(BUSOBJ)/oricext
+BUSOBJS += $(BUSOBJ)/oricext/oricext.o
+BUSOBJS += $(BUSOBJ)/oricext/jasmin.o
+BUSOBJS += $(BUSOBJ)/oricext/microdisc.o
+endif
diff --git a/src/emu/bus/oricext/jasmin.c b/src/emu/bus/oricext/jasmin.c
index e69de29bb2d..0435d30ffcb 100644
--- a/src/emu/bus/oricext/jasmin.c
+++ b/src/emu/bus/oricext/jasmin.c
@@ -0,0 +1,173 @@
+#include "jasmin.h"
+#include "formats/oric_dsk.h"
+
+const device_type JASMIN = &device_creator<jasmin_device>;
+
+ROM_START( jasmin )
+ ROM_REGION( 0x800, "jasmin", 0 )
+ ROM_LOAD("jasmin.rom", 0, 0x800, CRC(37220e89) SHA1(70e59b8abd67092f050462abc6cb5271e4c15f01) )
+ROM_END
+
+FLOPPY_FORMATS_MEMBER( jasmin_device::floppy_formats )
+ FLOPPY_ORIC_DSK_FORMAT
+FLOPPY_FORMATS_END
+
+static SLOT_INTERFACE_START( jasmin_floppies )
+ SLOT_INTERFACE( "3dsdd", FLOPPY_3_DSDD )
+SLOT_INTERFACE_END
+
+static MACHINE_CONFIG_FRAGMENT( jasmin )
+ MCFG_WD1770x_ADD("fdc", XTAL_8MHz)
+ MCFG_WD_FDC_DRQ_CALLBACK(WRITELINE(oricext_device, irq_w))
+
+ MCFG_FLOPPY_DRIVE_ADD("fdc:0", jasmin_floppies, "3dsdd", jasmin_device::floppy_formats)
+ MCFG_FLOPPY_DRIVE_ADD("fdc:1", jasmin_floppies, NULL, jasmin_device::floppy_formats)
+ MCFG_FLOPPY_DRIVE_ADD("fdc:2", jasmin_floppies, NULL, jasmin_device::floppy_formats)
+ MCFG_FLOPPY_DRIVE_ADD("fdc:3", jasmin_floppies, NULL, jasmin_device::floppy_formats)
+MACHINE_CONFIG_END
+
+INPUT_PORTS_START( jasmin )
+ PORT_START("JASMIN")
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("Boot") PORT_CODE(KEYCODE_F1) PORT_CHAR(UCHAR_MAMEKEY(F1)) PORT_CHANGED_MEMBER(DEVICE_SELF, jasmin_device, boot_pressed, 0)
+INPUT_PORTS_END
+
+DEVICE_ADDRESS_MAP_START(map, 8, jasmin_device)
+ AM_RANGE(0x3f4, 0x3f7) AM_DEVREADWRITE("fdc", wd1770_t, read, write)
+ AM_RANGE(0x3f8, 0x3f8) AM_WRITE(side_sel_w)
+ AM_RANGE(0x3f9, 0x3f9) AM_WRITE(fdc_reset_w)
+ AM_RANGE(0x3fa, 0x3fa) AM_WRITE(ram_access_w)
+ AM_RANGE(0x3fb, 0x3fb) AM_WRITE(rom_access_w)
+ AM_RANGE(0x3fc, 0x3ff) AM_WRITE(select_w)
+ADDRESS_MAP_END
+
+jasmin_device::jasmin_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) :
+ oricext_device(mconfig, JASMIN, "Jasmin floppy drive interface", tag, owner, clock, "jasmin", __FILE__),
+ fdc(*this, "fdc")
+{
+}
+
+jasmin_device::~jasmin_device()
+{
+}
+
+void jasmin_device::device_start()
+{
+ oricext_device::device_start();
+ astring tempstring;
+ jasmin_rom = device().machine().root_device().memregion(this->subtag(tempstring, "jasmin"))->base();
+ cpu->space(AS_PROGRAM).install_device(0x0000, 0xffff, *this, &jasmin_device::map);
+
+ for(int i=0; i<4; i++) {
+ char name[32];
+ sprintf(name, "fdc:%d", i);
+ floppies[i] = subdevice<floppy_connector>(name)->get_device();
+ }
+}
+
+void jasmin_device::device_reset()
+{
+ side_sel = fdc_reset = ram_access = rom_access = false;
+ select[0] = select[1] = select[2] = select[3] = false;
+ remap();
+ cur_floppy = NULL;
+ fdc->set_floppy(NULL);
+}
+
+const rom_entry *jasmin_device::device_rom_region() const
+{
+ return ROM_NAME( jasmin );
+}
+
+machine_config_constructor jasmin_device::device_mconfig_additions() const
+{
+ return MACHINE_CONFIG_NAME( jasmin );
+}
+
+ioport_constructor jasmin_device::device_input_ports() const
+{
+ return INPUT_PORTS_NAME( jasmin );
+}
+
+void jasmin_device::remap()
+{
+ if(rom_access) {
+ if(ram_access) {
+ bank_c000_r->set_base(ram+0xc000);
+ bank_e000_r->set_base(ram+0xe000);
+ bank_f800_r->set_base(jasmin_rom);
+ bank_c000_w->set_base(ram+0xc000);
+ bank_e000_w->set_base(ram+0xe000);
+ bank_f800_w->set_base(junk_write);
+ } else {
+ bank_c000_r->set_base(junk_read);
+ bank_e000_r->set_base(junk_read);
+ bank_f800_r->set_base(jasmin_rom);
+ bank_c000_w->set_base(junk_write);
+ bank_e000_w->set_base(junk_write);
+ bank_f800_w->set_base(junk_write);
+ }
+ } else {
+ if(ram_access) {
+ bank_c000_r->set_base(ram+0xc000);
+ bank_e000_r->set_base(ram+0xe000);
+ bank_f800_r->set_base(ram+0xf800);
+ bank_c000_w->set_base(ram+0xc000);
+ bank_e000_w->set_base(ram+0xe000);
+ bank_f800_w->set_base(ram+0xf800);
+ } else {
+ bank_c000_r->set_base(rom+0x0000);
+ bank_e000_r->set_base(rom+0x2000);
+ bank_f800_r->set_base(rom+0x3800);
+ bank_c000_w->set_base(junk_write);
+ bank_e000_w->set_base(junk_write);
+ bank_f800_w->set_base(junk_write);
+ }
+ }
+}
+
+INPUT_CHANGED_MEMBER(jasmin_device::boot_pressed)
+{
+ if(newval) {
+ rom_access = true;
+ remap();
+ cpu->reset();
+ }
+}
+
+WRITE8_MEMBER(jasmin_device::side_sel_w)
+{
+ side_sel = data & 1;
+ if(cur_floppy)
+ cur_floppy->ss_w(side_sel);
+}
+
+WRITE8_MEMBER(jasmin_device::fdc_reset_w)
+{
+ if((data & 1) != fdc_reset)
+ fdc->soft_reset();
+ fdc_reset = data & 1;
+}
+
+WRITE8_MEMBER(jasmin_device::ram_access_w)
+{
+ ram_access = data & 1;
+ remap();
+}
+
+WRITE8_MEMBER(jasmin_device::rom_access_w)
+{
+ rom_access = data & 1;
+ remap();
+}
+
+WRITE8_MEMBER(jasmin_device::select_w)
+{
+ select[offset] = data & 1;
+ cur_floppy = NULL;
+ for(int i=0; i != 4; i++)
+ if(select[i]) {
+ cur_floppy = floppies[i];
+ break;
+ }
+ fdc->set_floppy(cur_floppy);
+}
diff --git a/src/emu/bus/oricext/jasmin.h b/src/emu/bus/oricext/jasmin.h
index e69de29bb2d..6815d652daf 100644
--- a/src/emu/bus/oricext/jasmin.h
+++ b/src/emu/bus/oricext/jasmin.h
@@ -0,0 +1,41 @@
+#ifndef __JASMIN_H__
+#define __JASMIN_H__
+
+#include "oricext.h"
+#include "imagedev/floppy.h"
+#include "machine/wd_fdc.h"
+
+extern const device_type JASMIN;
+
+class jasmin_device : public oricext_device
+{
+public:
+ jasmin_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
+ virtual ~jasmin_device();
+
+ DECLARE_FLOPPY_FORMATS(floppy_formats);
+ DECLARE_ADDRESS_MAP(map, 8);
+ DECLARE_INPUT_CHANGED_MEMBER(boot_pressed);
+ DECLARE_WRITE8_MEMBER(side_sel_w);
+ DECLARE_WRITE8_MEMBER(fdc_reset_w);
+ DECLARE_WRITE8_MEMBER(ram_access_w);
+ DECLARE_WRITE8_MEMBER(rom_access_w);
+ DECLARE_WRITE8_MEMBER(select_w);
+
+protected:
+ required_device<wd1770_t> fdc;
+
+ bool side_sel, fdc_reset, ram_access, rom_access, select[4];
+ UINT8 *jasmin_rom;
+ floppy_image_device *cur_floppy, *floppies[4];
+
+ virtual void device_start();
+ virtual void device_reset();
+ const rom_entry *device_rom_region() const;
+ machine_config_constructor device_mconfig_additions() const;
+ virtual ioport_constructor device_input_ports() const;
+
+ void remap();
+};
+
+#endif
diff --git a/src/emu/bus/oricext/microdisc.c b/src/emu/bus/oricext/microdisc.c
index e69de29bb2d..0351c1be0e0 100644
--- a/src/emu/bus/oricext/microdisc.c
+++ b/src/emu/bus/oricext/microdisc.c
@@ -0,0 +1,151 @@
+#include "microdisc.h"
+#include "formats/oric_dsk.h"
+
+const device_type MICRODISC = &device_creator<microdisc_device>;
+
+ROM_START( microdisc )
+ ROM_REGION( 0x2000, "microdisc", 0 )
+ ROM_LOAD ("microdis.rom", 0, 0x02000, CRC(a9664a9c) SHA1(0d2ef6e67322f48f4b7e08d8bbe68827e2074561) )
+ROM_END
+
+FLOPPY_FORMATS_MEMBER( microdisc_device::floppy_formats )
+ FLOPPY_ORIC_DSK_FORMAT
+FLOPPY_FORMATS_END
+
+static SLOT_INTERFACE_START( microdisc_floppies )
+ SLOT_INTERFACE( "3dsdd", FLOPPY_3_DSDD )
+SLOT_INTERFACE_END
+
+static MACHINE_CONFIG_FRAGMENT( microdisc )
+ MCFG_FD1793x_ADD("fdc", XTAL_8MHz/8)
+ MCFG_WD_FDC_INTRQ_CALLBACK(WRITELINE(microdisc_device, fdc_irq_w))
+ MCFG_WD_FDC_DRQ_CALLBACK(WRITELINE(microdisc_device, fdc_drq_w))
+ MCFG_WD_FDC_HLD_CALLBACK(WRITELINE(microdisc_device, fdc_hld_w))
+ MCFG_WD_FDC_FORCE_READY
+
+ MCFG_FLOPPY_DRIVE_ADD("fdc:0", microdisc_floppies, "3dsdd", microdisc_device::floppy_formats)
+ MCFG_FLOPPY_DRIVE_ADD("fdc:1", microdisc_floppies, NULL, microdisc_device::floppy_formats)
+ MCFG_FLOPPY_DRIVE_ADD("fdc:2", microdisc_floppies, NULL, microdisc_device::floppy_formats)
+ MCFG_FLOPPY_DRIVE_ADD("fdc:3", microdisc_floppies, NULL, microdisc_device::floppy_formats)
+MACHINE_CONFIG_END
+
+DEVICE_ADDRESS_MAP_START(map, 8, microdisc_device)
+ AM_RANGE(0x310, 0x313) AM_DEVREADWRITE("fdc", fd1793_t, read, write)
+ AM_RANGE(0x314, 0x314) AM_READWRITE(port_314_r, port_314_w)
+ AM_RANGE(0x318, 0x318) AM_READ(port_318_r)
+ADDRESS_MAP_END
+
+microdisc_device::microdisc_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) :
+ oricext_device(mconfig, MICRODISC, "Microdisc floppy drive interface", tag, owner, clock, "microdisc", __FILE__),
+ fdc(*this, "fdc")
+{
+}
+
+microdisc_device::~microdisc_device()
+{
+}
+
+void microdisc_device::device_start()
+{
+ oricext_device::device_start();
+ astring tempstring;
+ microdisc_rom = device().machine().root_device().memregion(this->subtag(tempstring, "microdisc"))->base();
+ cpu->space(AS_PROGRAM).install_device(0x0000, 0xffff, *this, &microdisc_device::map);
+
+ for(int i=0; i<4; i++) {
+ char name[32];
+ sprintf(name, "fdc:%d", i);
+ floppies[i] = subdevice<floppy_connector>(name)->get_device();
+ }
+ intrq_state = drq_state = hld_state = false;
+}
+
+void microdisc_device::device_reset()
+{
+ port_314 = 0x00;
+ irq_w(false);
+ remap();
+ fdc->set_floppy(floppies[0]);
+
+ // The bootstrap checksums part of the high ram and if the sum is
+ // 0 it goes wrong.
+ ram[0xe000] = 0x42;
+}
+
+const rom_entry *microdisc_device::device_rom_region() const
+{
+ return ROM_NAME( microdisc );
+}
+
+machine_config_constructor microdisc_device::device_mconfig_additions() const
+{
+ return MACHINE_CONFIG_NAME( microdisc );
+}
+
+void microdisc_device::remap()
+{
+ if(port_314 & P_ROMDIS) {
+ bank_c000_r->set_base(rom+0x0000);
+ bank_e000_r->set_base(rom+0x2000);
+ bank_f800_r->set_base(rom+0x3800);
+ bank_c000_w->set_base(junk_write);
+ bank_e000_w->set_base(junk_write);
+ bank_f800_w->set_base(junk_write);
+ } else {
+ bank_c000_r->set_base(ram+0xc000);
+ bank_c000_w->set_base(ram+0xc000);
+ if(port_314 & P_EPROM) {
+ bank_e000_r->set_base(ram+0xe000);
+ bank_f800_r->set_base(ram+0xf800);
+ bank_e000_w->set_base(ram+0xe000);
+ bank_f800_w->set_base(ram+0xf800);
+ } else {
+ bank_e000_r->set_base(microdisc_rom+0x0000);
+ bank_f800_r->set_base(microdisc_rom+0x1800);
+ bank_e000_w->set_base(junk_write);
+ bank_f800_w->set_base(junk_write);
+ }
+ }
+}
+
+WRITE8_MEMBER(microdisc_device::port_314_w)
+{
+ port_314 = data;
+ remap();
+ floppy_image_device *floppy = floppies[(port_314 >> 5) & 3];
+ fdc->set_floppy(floppy);
+ fdc->dden_w(port_314 & P_DDEN);
+ if(floppy) {
+ floppy->ss_w(port_314 & P_SS ? 1 : 0);
+ floppy->mon_w(0);
+ }
+ irq_w(intrq_state && (port_314 & P_IRQEN));
+}
+
+READ8_MEMBER(microdisc_device::port_314_r)
+{
+ return (intrq_state && (port_314 & P_IRQEN)) ? 0x7f : 0xff;
+}
+
+READ8_MEMBER(microdisc_device::port_318_r)
+{
+ return drq_state ? 0x7f : 0xff;
+}
+
+WRITE_LINE_MEMBER(microdisc_device::fdc_irq_w)
+{
+ intrq_state = state;
+ irq_w(intrq_state && (port_314 & P_IRQEN));
+}
+
+WRITE_LINE_MEMBER(microdisc_device::fdc_drq_w)
+{
+ drq_state = state;
+}
+
+WRITE_LINE_MEMBER(microdisc_device::fdc_hld_w)
+{
+ logerror("hld %d\n", state);
+ hld_state = state;
+ floppies[(port_314 >> 5) & 3]->mon_w(!hld_state);
+}
diff --git a/src/emu/bus/oricext/microdisc.h b/src/emu/bus/oricext/microdisc.h
index e69de29bb2d..fb7a6fd68b5 100644
--- a/src/emu/bus/oricext/microdisc.h
+++ b/src/emu/bus/oricext/microdisc.h
@@ -0,0 +1,52 @@
+#ifndef __MICRODISC_H__
+#define __MICRODISC_H__
+
+#include "oricext.h"
+#include "imagedev/floppy.h"
+#include "machine/wd_fdc.h"
+
+extern const device_type MICRODISC;
+
+class microdisc_device : public oricext_device
+{
+public:
+ microdisc_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
+ virtual ~microdisc_device();
+
+ DECLARE_FLOPPY_FORMATS(floppy_formats);
+ DECLARE_ADDRESS_MAP(map, 8);
+ DECLARE_WRITE8_MEMBER(port_314_w);
+ DECLARE_READ8_MEMBER(port_314_r);
+ DECLARE_READ8_MEMBER(port_318_r);
+
+ DECLARE_WRITE_LINE_MEMBER(fdc_irq_w);
+ DECLARE_WRITE_LINE_MEMBER(fdc_drq_w);
+ DECLARE_WRITE_LINE_MEMBER(fdc_hld_w);
+
+protected:
+ enum {
+ P_IRQEN = 0x01,
+ P_ROMDIS = 0x02,
+ P_DDS = 0x04,
+ P_DDEN = 0x08,
+ P_SS = 0x10,
+ P_DRIVE = 0x60,
+ P_EPROM = 0x80
+ };
+
+ required_device<fd1793_t> fdc;
+
+ UINT8 *microdisc_rom;
+ floppy_image_device *floppies[4];
+ UINT8 port_314;
+ bool intrq_state, drq_state, hld_state;
+
+ virtual void device_start();
+ virtual void device_reset();
+ const rom_entry *device_rom_region() const;
+ machine_config_constructor device_mconfig_additions() const;
+
+ void remap();
+};
+
+#endif
diff --git a/src/emu/bus/oricext/oricext.c b/src/emu/bus/oricext/oricext.c
index e69de29bb2d..fa6471d59f2 100644
--- a/src/emu/bus/oricext/oricext.c
+++ b/src/emu/bus/oricext/oricext.c
@@ -0,0 +1,76 @@
+#include "oricext.h"
+#include "jasmin.h"
+#include "microdisc.h"
+
+const device_type ORICEXT_CONNECTOR = &device_creator<oricext_connector>;
+
+oricext_connector::oricext_connector(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) :
+ device_t(mconfig, ORICEXT_CONNECTOR, "ORIC extension connector", tag, owner, clock, "oricext_connector", __FILE__),
+ device_slot_interface(mconfig, *this),
+ irq_handler(*this)
+{
+}
+
+oricext_connector::~oricext_connector()
+{
+}
+
+void oricext_connector::set_cputag(const char *tag)
+{
+ cputag = tag;
+}
+
+void oricext_connector::device_start()
+{
+ irq_handler.resolve_safe();
+}
+
+void oricext_connector::irq_w(int state)
+{
+ irq_handler(state);
+}
+
+void oricext_connector::device_config_complete()
+{
+ oricext_device *dev = dynamic_cast<oricext_device *>(get_card_device());
+ if(dev)
+ dev->set_cputag(cputag);
+}
+
+oricext_device::oricext_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source) :
+ device_t(mconfig, type, name, tag, owner, clock, shortname, source),
+ device_slot_card_interface(mconfig, *this)
+{
+}
+
+void oricext_device::set_cputag(const char *tag)
+{
+ cputag = tag;
+}
+
+void oricext_device::device_start()
+{
+ cpu = machine().device<m6502_device>(cputag);
+ connector = downcast<oricext_connector *>(owner());
+ bank_c000_r = membank(":bank_c000_r");
+ bank_e000_r = membank(":bank_e000_r");
+ bank_f800_r = membank(":bank_f800_r");
+ bank_c000_w = membank(":bank_c000_w");
+ bank_e000_w = membank(":bank_e000_w");
+ bank_f800_w = membank(":bank_f800_w");
+ rom = (UINT8 *)machine().root_device().memregion(cputag)->base();
+ ram = (UINT8 *)memshare(":ram")->ptr();
+
+ memset(junk_read, 0xff, sizeof(junk_read));
+ memset(junk_write, 0x00, sizeof(junk_write));
+}
+
+WRITE_LINE_MEMBER(oricext_device::irq_w)
+{
+ connector->irq_w(state);
+}
+
+SLOT_INTERFACE_START(oricext_intf)
+ SLOT_INTERFACE("jasmin", JASMIN)
+ SLOT_INTERFACE("microdisc", MICRODISC)
+SLOT_INTERFACE_END
diff --git a/src/emu/bus/oricext/oricext.h b/src/emu/bus/oricext/oricext.h
index e69de29bb2d..2a5f2134a60 100644
--- a/src/emu/bus/oricext/oricext.h
+++ b/src/emu/bus/oricext/oricext.h
@@ -0,0 +1,63 @@
+/***************************************************************************
+
+ oric.h - Oric 1/Atmos extension port
+
+***************************************************************************/
+
+#ifndef __ORICEXT_H__
+#define __ORICEXT_H__
+
+#include "emu.h"
+#include "cpu/m6502/m6502.h"
+
+#define MCFG_ORICEXT_ADD(_tag, _slot_intf, _def_slot, _cputag, _irq) \
+ MCFG_DEVICE_ADD(_tag, ORICEXT_CONNECTOR, 0) \
+ MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false) \
+ downcast<oricext_connector *>(device)->set_cputag(_cputag); \
+ devcb = &oricext_connector::set_irq_handler(*device, DEVCB2_##_irq);
+
+
+class oricext_device;
+
+class oricext_connector: public device_t,
+ public device_slot_interface
+{
+public:
+ oricext_connector(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
+ virtual ~oricext_connector();
+
+ void set_cputag(const char *tag);
+ template<class _Object> static devcb2_base &set_irq_handler(device_t &device, _Object object) { return downcast<oricext_connector &>(device).irq_handler.set_callback(object); }
+ void irq_w(int state);
+
+protected:
+ devcb2_write_line irq_handler;
+ const char *cputag;
+ virtual void device_start();
+ virtual void device_config_complete();
+};
+
+class oricext_device : public device_t,
+ public device_slot_card_interface
+{
+public:
+ oricext_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source);
+
+ void set_cputag(const char *tag);
+ DECLARE_WRITE_LINE_MEMBER(irq_w);
+
+protected:
+ const char *cputag;
+ m6502_device *cpu;
+ oricext_connector *connector;
+ memory_bank *bank_c000_r, *bank_e000_r, *bank_f800_r, *bank_c000_w, *bank_e000_w, *bank_f800_w;
+ UINT8 *rom, *ram;
+ UINT8 junk_read[8192], junk_write[8192];
+
+ virtual void device_start();
+};
+
+extern const device_type ORICEXT_CONNECTOR;
+SLOT_INTERFACE_EXTERN( oricext_intf );
+
+#endif /* __ORICEXT_H__ */
diff --git a/src/emu/imagedev/floppy.c b/src/emu/imagedev/floppy.c
index 562a43b29e5..1eb1d5a1e40 100644
--- a/src/emu/imagedev/floppy.c
+++ b/src/emu/imagedev/floppy.c
@@ -16,7 +16,7 @@
*/
// Show step operation
-#define TRACE_STEP 0
+#define TRACE_STEP 1
// device type definition
const device_type FLOPPY_CONNECTOR = &device_creator<floppy_connector>;
@@ -759,7 +759,6 @@ void floppy_image_device::set_write_splice(attotime when)
attotime base;
int splice_pos = find_position(base, when);
image->set_write_splice_position(cyl, ss, splice_pos);
- logerror("%s: Track %d head %d set splice pos %d\n", tag(), cyl, ss, splice_pos);
}
UINT32 floppy_image_device::get_form_factor() const
diff --git a/src/emu/machine/6522via.c b/src/emu/machine/6522via.c
index a6316a75406..6c9f44361fa 100644
--- a/src/emu/machine/6522via.c
+++ b/src/emu/machine/6522via.c
@@ -842,6 +842,11 @@ void via6522_device::write_pa(int line, int state)
m_in_a &= ~(1 << line);
}
+WRITE8_MEMBER( via6522_device::write_pa )
+{
+ m_in_a = data;
+}
+
/*-------------------------------------------------
ca1_w - interface setting VIA port CA1 input
-------------------------------------------------*/
@@ -902,6 +907,11 @@ void via6522_device::write_pb(int line, int state)
m_in_b &= ~(1 << line);
}
+WRITE8_MEMBER( via6522_device::write_pb )
+{
+ m_in_b = data;
+}
+
/*-------------------------------------------------
cb1_w - interface setting VIA port CB1 input
-------------------------------------------------*/
diff --git a/src/emu/machine/6522via.h b/src/emu/machine/6522via.h
index 87f09277405..5b0f640fd5c 100644
--- a/src/emu/machine/6522via.h
+++ b/src/emu/machine/6522via.h
@@ -88,6 +88,7 @@ public:
DECLARE_WRITE_LINE_MEMBER( write_pa5 ) { write_pa(5, state); }
DECLARE_WRITE_LINE_MEMBER( write_pa6 ) { write_pa(6, state); }
DECLARE_WRITE_LINE_MEMBER( write_pa7 ) { write_pa(7, state); }
+ DECLARE_WRITE8_MEMBER( write_pa );
DECLARE_WRITE_LINE_MEMBER( write_ca1 );
DECLARE_WRITE_LINE_MEMBER( write_ca2 );
@@ -99,6 +100,7 @@ public:
DECLARE_WRITE_LINE_MEMBER( write_pb5 ) { write_pb(5, state); }
DECLARE_WRITE_LINE_MEMBER( write_pb6 ) { write_pb(6, state); }
DECLARE_WRITE_LINE_MEMBER( write_pb7 ) { write_pb(7, state); }
+ DECLARE_WRITE8_MEMBER( write_pb );
DECLARE_WRITE_LINE_MEMBER( write_cb1 );
DECLARE_WRITE_LINE_MEMBER( write_cb2 );
diff --git a/src/emu/machine/wd_fdc.c b/src/emu/machine/wd_fdc.c
index c2dafac8e13..c83683b6361 100644
--- a/src/emu/machine/wd_fdc.c
+++ b/src/emu/machine/wd_fdc.c
@@ -38,7 +38,7 @@ const device_type WD1773x = &device_creator<wd1773_t>;
#define TRACE_COMP 0
// Shows command invocation
-#define TRACE_COMMAND 0
+#define TRACE_COMMAND 1
// Shows sync actions
#define TRACE_SYNC 0
@@ -223,7 +223,7 @@ void wd_fdc_t::command_end()
void wd_fdc_t::seek_start(int state)
{
- if (TRACE_COMMAND) logerror("%s: seek %d\n", tag(), data);
+ if (TRACE_COMMAND) logerror("%s: seek %d (track=%d)\n", tag(), data, track);
main_state = state;
status = (status & ~(S_CRC|S_RNF|S_SPIN)) | S_BUSY;
if(head_control) {
@@ -264,8 +264,10 @@ void wd_fdc_t::seek_continue()
delay_cycles(t_gen, step_times[command & 3]);
}
- if(main_state == SEEK && track == data)
+ if(main_state == SEEK && track == data) {
+ logerror("track=%d data=%d\n", track, data);
sub_state = SEEK_DONE;
+ }
if(sub_state == SPINUP_DONE) {
counter = 0;
@@ -1184,10 +1186,9 @@ void wd_fdc_t::spinup()
counter = 0;
}
- status |= S_MON;
+ status |= S_MON|S_SPIN;
if(floppy)
floppy->mon_w(0);
-
}
void wd_fdc_t::ready_callback(floppy_image_device *floppy, int state)
@@ -2669,7 +2670,7 @@ wd1770_t::wd1770_t(const machine_config &mconfig, const char *tag, device_t *own
{
step_times = wd_digital_step_times;
delay_register_commit = 32;
- delay_command_commit = 48;
+ delay_command_commit = 36; // official 48 is too high for oric jasmin boot
disable_mfm = false;
inverted_bus = false;
side_control = false;
diff --git a/src/lib/formats/mfi_dsk.c b/src/lib/formats/mfi_dsk.c
index e7ca391ad88..ccb441c7a25 100644
--- a/src/lib/formats/mfi_dsk.c
+++ b/src/lib/formats/mfi_dsk.c
@@ -99,7 +99,7 @@ int mfi_format::identify(io_generic *io, UINT32 form_factor)
if(memcmp( h.sign, sign, 16 ) == 0 &&
h.cyl_count <= 160 &&
h.head_count <= 2 &&
- (!form_factor || h.form_factor == form_factor))
+ (!form_factor || !h.form_factor || h.form_factor == form_factor))
return 100;
return 0;
}
diff --git a/src/lib/formats/oric_dsk.c b/src/lib/formats/oric_dsk.c
index eb3bd159f89..95a2c34d427 100644
--- a/src/lib/formats/oric_dsk.c
+++ b/src/lib/formats/oric_dsk.c
@@ -1,3 +1,5 @@
+// license:BSD-3-Clause
+// copyright-holders:Olivier Galibert
/*********************************************************************
formats/oric_dsk.c
@@ -6,311 +8,107 @@
*********************************************************************/
-#include <string.h>
+#include "emu.h"
+#include "formats/oric_dsk.h"
-#include "imageutl.h"
-#include "flopimg.h"
-#include "oric_dsk.h"
-#include "basicdsk.h"
-
-
-#define mfm_disk_header_size 0x0100
-#define MFM_ID "MFM_DISK"
-
-#define TRACK_SIZE_MFM 0x1900
-
-struct mfm_disk_sector_info
-{
- int id_ptr;
- int data_ptr;
- int sector_size;
- UINT8 ddam;
-};
-
-struct oricdsk_tag
-{
- int tracks;
- int heads;
- int geometry;
- int tracksize;
- int num_sectors;
- struct mfm_disk_sector_info sector_data[32];
-};
-
-
-static struct oricdsk_tag *get_tag(floppy_image_legacy *floppy)
+oric_dsk_format::oric_dsk_format()
{
- struct oricdsk_tag *tag;
- tag = (oricdsk_tag *)floppy_tag(floppy);
- return tag;
}
-
-static FLOPPY_IDENTIFY(oric_dsk_identify)
+const char *oric_dsk_format::name() const
{
- UINT8 header[mfm_disk_header_size];
-
- floppy_image_read(floppy, header, 0, mfm_disk_header_size);
- if ( memcmp( header, MFM_ID, 8 ) ==0) {
- UINT32 heads = pick_integer_le(header, 8, 4);
- UINT32 tracks = pick_integer_le(header, 12, 4);
-
- if (floppy_image_size(floppy)==((tracks*heads*TRACK_SIZE_MFM)+mfm_disk_header_size)) {
- *vote = 100;
- } else {
- *vote = 0;
- }
- } else {
- *vote = 0;
- }
- return FLOPPY_ERROR_SUCCESS;
+ return "oric_dsk";
}
-static int oric_get_track_offset(floppy_image_legacy *floppy,int track, int head)
+
+const char *oric_dsk_format::description() const
{
- if (get_tag(floppy)->geometry==1) {
- return mfm_disk_header_size + (get_tag(floppy)->tracksize * track) + (head * get_tag(floppy)->tracksize * get_tag(floppy)->tracks);
- } else {
- return mfm_disk_header_size + (get_tag(floppy)->tracksize*((track * get_tag(floppy)->heads)+head));
- }
+ return "Oric disk image";
}
-static int oric_get_heads_per_disk(floppy_image_legacy *floppy)
+const char *oric_dsk_format::extensions() const
{
- return get_tag(floppy)->heads;
+ return "dsk";
}
-static int oric_get_tracks_per_disk(floppy_image_legacy *floppy)
+bool oric_dsk_format::supports_save() const
{
- return get_tag(floppy)->tracks;
+ return true;
}
-static void mfm_info_cache_sector_info(floppy_image_legacy *floppy,int track,int head)
+int oric_dsk_format::identify(io_generic *io, UINT32 form_factor)
{
- UINT8 track_data[TRACK_SIZE_MFM];
+ UINT8 h[256];
+ io_generic_read(io, h, 0, 256);
- /* initialise these with single density values if single density */
- UINT8 IdMark = 0x0fe;
- UINT8 DataMark = 0x0fb;
- UINT8 DeletedDataMark = 0x0f8;
+ if(memcmp(h, "MFM_DISK", 8))
+ return 0;
- UINT8 SectorCount;
- UINT8 SearchCode = 0;
- UINT8 sector_number = 0;
- int ptr = 0;
- int track_offset = oric_get_track_offset(floppy,track,head);
- floppy_image_read(floppy, track_data, track_offset, TRACK_SIZE_MFM);
- SectorCount = 0;
+ int sides = (h[11] << 24) | (h[10] << 16) | (h[ 9] << 8) | h[ 8];
+ int tracks = (h[15] << 24) | (h[14] << 16) | (h[13] << 8) | h[12];
+ int geom = (h[19] << 24) | (h[18] << 16) | (h[17] << 8) | h[16];
- do
- {
- switch (SearchCode)
- {
- /* searching for id's */
- case 0:
- {
- /* found id mark? */
- if (track_data[ptr] == IdMark)
- {
- sector_number = track_data[ptr+3]-1;
- /* store pointer to id mark */
- get_tag(floppy)->sector_data[sector_number].id_ptr = ptr + track_offset;
- SectorCount++;
+ int size = io_generic_size(io);
+ if(sides < 0 || sides > 2 || geom != 1 || size != 256+6400*sides*tracks)
+ return 0;
- /* grab N value - used to skip data in data field */
- get_tag(floppy)->sector_data[sector_number].sector_size = (1<< (track_data[ptr+4]+7));
-
- /* skip past id field and crc */
- ptr+=7;
+ return 100;
+}
- /* now looking for data field */
- SearchCode = 1;
- }
- else
- {
- /* update position */
- ptr++;
- }
- }
- break;
+bool oric_dsk_format::load(io_generic *io, UINT32 form_factor, floppy_image *image)
+{
+ UINT8 h[256];
+ UINT8 t[6250+3];
+ UINT32 stream[100000];
- /* searching for data id's */
- case 1:
- {
- /* found data or deleted data? */
- if ((track_data[ptr] == DataMark) || (track_data[ptr] == DeletedDataMark))
- {
- /* yes */
- get_tag(floppy)->sector_data[sector_number].data_ptr = ptr + track_offset + 1;
- get_tag(floppy)->sector_data[sector_number].ddam = (track_data[ptr] == DeletedDataMark) ? ID_FLAG_DELETED_DATA : 0;
+ t[6250] = t[6251] = t[6252] = 0;
+ io_generic_read(io, h, 0, 256);
- /* skip data field and id */
- ptr += get_tag(floppy)->sector_data[sector_number].sector_size + 3;
+ int sides = (h[11] << 24) | (h[10] << 16) | (h[ 9] << 8) | h[ 8];
+ int tracks = (h[15] << 24) | (h[14] << 16) | (h[13] << 8) | h[12];
- /* now looking for id field */
- SearchCode = 0;
+ for(int side=0; side<sides; side++)
+ for(int track=0; track<tracks; track++) {
+ io_generic_read(io, t, 256+6400*(tracks*side + track), 6250);
+ int pos = 0;
+ int sector_size = 128;
+ for(int i=0; i<6250; i++) {
+ if(t[i] == 0xc2 && t[i+1] == 0xc2 && t[i+2] == 0xc2) {
+ raw_w(stream, pos, 16, 0x5224);
+ raw_w(stream, pos, 16, 0x5224);
+ raw_w(stream, pos, 16, 0x5224);
+ i += 2;
+ continue;
}
- else
- {
- ptr++;
+ if(t[i] == 0xa1 && t[i+1] == 0xa1 && t[i+2] == 0xa1) {
+ raw_w(stream, pos, 16, 0x4489);
+ raw_w(stream, pos, 16, 0x4489);
+ raw_w(stream, pos, 16, 0x4489);
+ int copy;
+ if(t[i+3] == 0xfe) {
+ copy = 7;
+ sector_size = 128 << (t[i+7] & 3);
+ logerror("%02x %x - %02x %02x %02x %02x\n",
+ track, side, t[i+4], t[i+5], t[i+6], t[i+7]);
+ } else if(t[i+3] == 0xfb)
+ copy = sector_size+3;
+ else
+ copy = 0;
+ for(int j=0; j<copy; j++)
+ mfm_w(stream, pos, 8, t[i+3+j]);
+ i += 2+copy;
+ continue;
}
+ mfm_w(stream, pos, 8, t[i]);
}
- break;
-
- default:
- break;
+ generate_track_from_levels(track, side, stream, 100000, 0, image);
}
- }
- while (ptr < TRACK_SIZE_MFM);
- get_tag(floppy)->num_sectors = SectorCount;
-
-}
-
-static floperr_t get_offset(floppy_image_legacy *floppy, int head, int track, int sector, int sector_is_index, UINT64 *offset)
-{
- UINT64 offs;
-
- /* translate the sector to a raw sector */
- if (!sector_is_index)
- {
- sector -= 1;
- }
- mfm_info_cache_sector_info(floppy,track,head);
-
- /* check to see if we are out of range */
- if ((head < 0) || (head >= get_tag(floppy)->heads) || (track < 0) || (track >= get_tag(floppy)->tracks)
- || (sector < 0) || (sector >=get_tag(floppy)->num_sectors))
- return FLOPPY_ERROR_SEEKERROR;
-
- offs = get_tag(floppy)->sector_data[sector].data_ptr;
- if (offset)
- *offset = offs;
- return FLOPPY_ERROR_SUCCESS;
-}
-
-
-
-static floperr_t internal_oric_read_sector(floppy_image_legacy *floppy, int head, int track, int sector, int sector_is_index, void *buffer, size_t buflen)
-{
- UINT64 offset;
- floperr_t err;
- err = get_offset(floppy, head, track, sector, sector_is_index, &offset);
- if (err)
- return err;
- floppy_image_read(floppy, buffer, offset, buflen);
- return FLOPPY_ERROR_SUCCESS;
-}
-
-
-
-static floperr_t internal_oric_write_sector(floppy_image_legacy *floppy, int head, int track, int sector, int sector_is_index, const void *buffer, size_t buflen, int ddam)
-{
- UINT64 offset;
- floperr_t err;
-
- err = get_offset(floppy, head, track, sector, sector_is_index, &offset);
- if (err)
- return err;
-
- floppy_image_write(floppy, buffer, offset, buflen);
- return FLOPPY_ERROR_SUCCESS;
-}
-
-
-
-static floperr_t oric_read_sector(floppy_image_legacy *floppy, int head, int track, int sector, void *buffer, size_t buflen)
-{
- return internal_oric_read_sector(floppy, head, track, sector, FALSE, buffer, buflen);
+
+ return true;
}
-static floperr_t oric_write_sector(floppy_image_legacy *floppy, int head, int track, int sector, const void *buffer, size_t buflen, int ddam)
+bool oric_dsk_format::save(io_generic *io, floppy_image *image)
{
- return internal_oric_write_sector(floppy, head, track, sector, FALSE, buffer, buflen, ddam);
-}
-
-static floperr_t oric_read_indexed_sector(floppy_image_legacy *floppy, int head, int track, int sector, void *buffer, size_t buflen)
-{
- return internal_oric_read_sector(floppy, head, track, sector, TRUE, buffer, buflen);
-}
-
-static floperr_t oric_write_indexed_sector(floppy_image_legacy *floppy, int head, int track, int sector, const void *buffer, size_t buflen, int ddam)
-{
- return internal_oric_write_sector(floppy, head, track, sector, TRUE, buffer, buflen, ddam);
-}
-
-static floperr_t oric_get_sector_length(floppy_image_legacy *floppy, int head, int track, int sector, UINT32 *sector_length)
-{
- floperr_t err;
- err = get_offset(floppy, head, track, sector, FALSE, NULL);
- if (err)
- return err;
-
- if (sector_length) {
- *sector_length = get_tag(floppy)->sector_data[sector].sector_size;
- }
- return FLOPPY_ERROR_SUCCESS;
-}
-
-
-
-static floperr_t oric_get_indexed_sector_info(floppy_image_legacy *floppy, int head, int track, int sector_index, int *cylinder, int *side, int *sector, UINT32 *sector_length, unsigned long *flags)
-{
- floperr_t retVal;
-
- sector_index += 1;
-
- retVal = oric_get_sector_length(floppy, head, track, sector_index, sector_length);
- if (sector_length!=NULL) {
- *sector_length = get_tag(floppy)->sector_data[sector_index-1].sector_size;
- }
- if (cylinder)
- *cylinder = track;
- if (side)
- *side = head;
- if (sector)
- *sector = sector_index;
- if (flags)
- *flags = get_tag(floppy)->sector_data[sector_index].ddam;
- return retVal;
-}
-
-
-static FLOPPY_CONSTRUCT(oric_dsk_construct)
-{
- struct FloppyCallbacks *callbacks;
- struct oricdsk_tag *tag;
- UINT8 header[mfm_disk_header_size];
-
- floppy_image_read(floppy, header, 0, mfm_disk_header_size);
-
- tag = (struct oricdsk_tag *) floppy_create_tag(floppy, sizeof(struct oricdsk_tag));
- if (!tag)
- return FLOPPY_ERROR_OUTOFMEMORY;
-
- tag->heads = pick_integer_le(header, 8, 4);
- tag->tracks = pick_integer_le(header, 12, 4);
- tag->geometry = pick_integer_le(header, 16, 4);
- tag->tracksize = TRACK_SIZE_MFM;
- memset(tag->sector_data,0,sizeof(tag->sector_data));
-
- callbacks = floppy_callbacks(floppy);
- callbacks->read_sector = oric_read_sector;
- callbacks->write_sector = oric_write_sector;
- callbacks->read_indexed_sector = oric_read_indexed_sector;
- callbacks->write_indexed_sector = oric_write_indexed_sector;
- callbacks->get_sector_length = oric_get_sector_length;
- callbacks->get_heads_per_disk = oric_get_heads_per_disk;
- callbacks->get_tracks_per_disk = oric_get_tracks_per_disk;
- callbacks->get_indexed_sector_info = oric_get_indexed_sector_info;
- return FLOPPY_ERROR_SUCCESS;
+ return true;
}
-/* ----------------------------------------------------------------------- */
-LEGACY_FLOPPY_OPTIONS_START( oric )
- LEGACY_FLOPPY_OPTION( oricmfm, "dsk", "Oric MFM floppy disk image", oric_dsk_identify, oric_dsk_construct, NULL, NULL)
- LEGACY_FLOPPY_OPTION( oric, "dsk", "Oric disk image", basicdsk_identify_default, basicdsk_construct_default, NULL,
- HEADS([2])
- TRACKS([80])
- SECTORS([9])
- SECTOR_LENGTH([512])
- FIRST_SECTOR_ID([1]))
-LEGACY_FLOPPY_OPTIONS_END
+const floppy_format_type FLOPPY_ORIC_DSK_FORMAT = &floppy_image_format_creator<oric_dsk_format>;
diff --git a/src/lib/formats/oric_dsk.h b/src/lib/formats/oric_dsk.h
index 851544da3d2..98d5458f082 100644
--- a/src/lib/formats/oric_dsk.h
+++ b/src/lib/formats/oric_dsk.h
@@ -11,8 +11,20 @@
#include "flopimg.h"
-/**************************************************************************/
-
-LEGACY_FLOPPY_OPTIONS_EXTERN(oric);
+class oric_dsk_format : public floppy_image_format_t
+{
+public:
+ oric_dsk_format();
+ virtual int identify(io_generic *io, UINT32 form_factor);
+ virtual bool load(io_generic *io, UINT32 form_factor, floppy_image *image);
+ virtual bool save(io_generic *io, floppy_image *image);
+
+ virtual const char *name() const;
+ virtual const char *description() const;
+ virtual const char *extensions() const;
+ virtual bool supports_save() const;
+};
+
+extern const floppy_format_type FLOPPY_ORIC_DSK_FORMAT;
#endif /* ORIC_DSK_H */
diff --git a/src/mess/drivers/oric.c b/src/mess/drivers/oric.c
index 7aa721e3c18..b1a09433cd0 100644
--- a/src/mess/drivers/oric.c
+++ b/src/mess/drivers/oric.c
@@ -12,321 +12,768 @@
Pravetz is a Bulgarian copy of the Oric Atmos and uses
Apple 2 disc drives for storage.
- This driver originally by Paul Cook, rewritten by Kevin Thacker.
+ This driver originally by Paul Cook, rewritten by Kevin Thacker,
+ re-rewritten by Olivier Galibert.
*********************************************************************/
-#include "includes/oric.h"
+#include "emu.h"
+#include "bus/oricext/oricext.h"
+#include "cpu/m6502/m6502.h"
+#include "sound/ay8910.h"
+#include "sound/wave.h"
+#include "machine/6522via.h"
+#include "machine/mos6551.h"
+#include "bus/centronics/ctronics.h"
+#include "imagedev/floppy.h"
+#include "imagedev/cassette.h"
+#include "machine/wd_fdc.h"
+#include "formats/oric_dsk.h"
+#include "formats/oric_tap.h"
+
+class oric_state : public driver_device
+{
+public:
+ // Permanent attributes (kept from one line to the other) and line
+ // attributes (reset at start of line)
+ enum {
+ PATTR_50HZ = 0x02,
+ PATTR_HIRES = 0x04,
+ LATTR_ALT = 0x01,
+ LATTR_DSIZE = 0x02,
+ LATTR_BLINK = 0x04
+ };
+
+ oric_state(const machine_config &mconfig, device_type type, const char *tag)
+ : driver_device(mconfig, type, tag),
+ m_maincpu(*this, "maincpu"),
+ m_psg(*this, "ay8912"),
+ m_centronics(*this, "centronics"),
+ m_cent_data_out(*this, "cent_data_out"),
+ m_cassette(*this, "cassette"),
+ m_via(*this, "via6522"),
+ m_ram(*this, "ram"),
+ m_rom(*this, "maincpu"),
+ m_bank_c000_r(*this, "bank_c000_r"),
+ m_bank_e000_r(*this, "bank_e000_r"),
+ m_bank_f800_r(*this, "bank_f800_r"),
+ m_bank_c000_w(*this, "bank_c000_w"),
+ m_bank_e000_w(*this, "bank_e000_w"),
+ m_bank_f800_w(*this, "bank_f800_w"),
+ m_config(*this, "CONFIG") { }
+
+ DECLARE_INPUT_CHANGED_MEMBER(nmi_pressed);
+ DECLARE_WRITE8_MEMBER(via_a_w);
+ DECLARE_WRITE8_MEMBER(via_b_w);
+ DECLARE_WRITE_LINE_MEMBER(via_ca2_w);
+ DECLARE_WRITE_LINE_MEMBER(via_cb2_w);
+ DECLARE_WRITE_LINE_MEMBER(via_irq_w);
+ DECLARE_WRITE_LINE_MEMBER(ext_irq_w);
+ DECLARE_WRITE8_MEMBER(psg_a_w);
+ TIMER_DEVICE_CALLBACK_MEMBER(update_tape);
+
+ virtual void machine_start();
+ virtual void video_start();
+ UINT32 screen_update_oric(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
+ void vblank_w(screen_device &screen, bool state);
+
+protected:
+ required_device<cpu_device> m_maincpu;
+ required_device<ay8910_device> m_psg;
+ required_device<centronics_device> m_centronics;
+ required_device<output_latch_device> m_cent_data_out;
+ required_device<cassette_image_device> m_cassette;
+ required_device<via6522_device> m_via;
+ required_shared_ptr<UINT8> m_ram;
+ optional_memory_region m_rom;
+ required_memory_bank m_bank_c000_r;
+ optional_memory_bank m_bank_e000_r;
+ optional_memory_bank m_bank_f800_r;
+ required_memory_bank m_bank_c000_w;
+ optional_memory_bank m_bank_e000_w;
+ optional_memory_bank m_bank_f800_w;
+ required_ioport m_config;
+ ioport_port *m_kbd_row[8];
+
+ int m_blink_counter;
+ UINT8 m_pattr;
+ UINT8 m_via_a, m_via_b, m_psg_a;
+ bool m_via_ca2, m_via_cb2, m_via_irq;
+ bool m_ext_irq;
+
+ virtual void update_irq();
+ void update_psg(address_space &space);
+ void update_keyboard();
+ void machine_start_common();
+};
+
+class telestrat_state : public oric_state
+{
+public:
+ telestrat_state(const machine_config &mconfig, device_type type, const char *tag) :
+ oric_state(mconfig, type, tag),
+ m_via2(*this, "via6522_2"),
+ m_fdc(*this, "fdc"),
+ m_telmatic(*this, "telmatic"),
+ m_teleass(*this, "teleass"),
+ m_hyperbas(*this, "hyperbas"),
+ m_telmon24(*this, "telmon24"),
+ m_joy1(*this, "JOY1"),
+ m_joy2(*this, "JOY2")
+ { }
+
+ DECLARE_WRITE8_MEMBER(via2_a_w);
+ DECLARE_WRITE8_MEMBER(via2_b_w);
+ DECLARE_WRITE_LINE_MEMBER(via2_ca2_w);
+ DECLARE_WRITE_LINE_MEMBER(via2_cb2_w);
+ DECLARE_WRITE_LINE_MEMBER(via2_irq_w);
+ DECLARE_WRITE8_MEMBER(port_314_w);
+ DECLARE_READ8_MEMBER(port_314_r);
+ DECLARE_READ8_MEMBER(port_318_r);
+
+ DECLARE_WRITE_LINE_MEMBER(acia_irq_w);
+
+ DECLARE_WRITE_LINE_MEMBER(fdc_irq_w);
+ DECLARE_WRITE_LINE_MEMBER(fdc_drq_w);
+ DECLARE_WRITE_LINE_MEMBER(fdc_hld_w);
+
+ DECLARE_FLOPPY_FORMATS(floppy_formats);
+
+ virtual void machine_start();
+ virtual void machine_reset();
+
+protected:
+ enum {
+ P_IRQEN = 0x01,
+ P_DDS = 0x04,
+ P_DDEN = 0x08,
+ P_SS = 0x10,
+ P_DRIVE = 0x60
+ };
+
+ required_device<via6522_device> m_via2;
+ required_device<fd1793_t> m_fdc;
+ required_memory_region m_telmatic;
+ required_memory_region m_teleass;
+ required_memory_region m_hyperbas;
+ required_memory_region m_telmon24;
+ required_ioport m_joy1;
+ required_ioport m_joy2;
+
+ floppy_image_device *m_floppies[4];
+ UINT8 m_port_314;
+ UINT8 m_via2_a, m_via2_b;
+ bool m_via2_ca2, m_via2_cb2, m_via2_irq;
+ bool m_acia_irq;
+ bool m_fdc_irq, m_fdc_drq, m_fdc_hld;
+
+ UINT8 m_junk_read[0x4000], m_junk_write[0x4000];
+
+ virtual void update_irq();
+ void remap();
+};
+
+/* Ram is 64K, with 16K hidden by the rom. The 300-3ff is also hidden by the i/o */
+static ADDRESS_MAP_START(oric_mem, AS_PROGRAM, 8, oric_state )
+ AM_RANGE( 0x0300, 0x030f) AM_DEVREADWRITE("via6522", via6522_device, read, write) AM_MIRROR(0xf0)
+ AM_RANGE( 0xc000, 0xdfff) AM_READ_BANK("bank_c000_r") AM_WRITE_BANK("bank_c000_w")
+ AM_RANGE( 0xe000, 0xf7ff) AM_READ_BANK("bank_e000_r") AM_WRITE_BANK("bank_e000_w")
+ AM_RANGE( 0xf800, 0xffff) AM_READ_BANK("bank_f800_r") AM_WRITE_BANK("bank_f800_w")
+ AM_RANGE( 0x0000, 0xffff) AM_RAM AM_SHARE("ram")
+ADDRESS_MAP_END
/*
- Explanation of memory regions:
+The telestrat has the memory regions split into 16k blocks.
+Memory region &c000-&ffff can be ram or rom. */
+static ADDRESS_MAP_START(telestrat_mem, AS_PROGRAM, 8, telestrat_state )
+ AM_RANGE( 0x0300, 0x030f) AM_DEVREADWRITE("via6522", via6522_device, read, write)
+ AM_RANGE( 0x0310, 0x0313) AM_DEVREADWRITE("fdc", fd1793_t, read, write)
+ AM_RANGE( 0x0314, 0x0314) AM_READWRITE(port_314_r, port_314_w)
+ AM_RANGE( 0x0318, 0x0318) AM_READ(port_318_r)
+ AM_RANGE( 0x031c, 0x031f) AM_DEVREADWRITE("acia", mos6551_device, read, write)
+ AM_RANGE( 0x0320, 0x032f) AM_DEVREADWRITE("via6522_2", via6522_device, read, write)
+ AM_RANGE( 0xc000, 0xffff) AM_READ_BANK("bank_c000_r") AM_WRITE_BANK("bank_c000_w")
+ AM_RANGE( 0x0000, 0xffff) AM_RAM AM_SHARE("ram")
+ADDRESS_MAP_END
+
+UINT32 oric_state::screen_update_oric(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
+{
+ static const UINT32 colors[8] = {
+ 0x000000,
+ 0xff0000,
+ 0x00ff00,
+ 0xffff00,
+ 0x0000ff,
+ 0xff00ff,
+ 0x00ffff,
+ 0xffffff
+ };
+
+ bool blink_state = m_blink_counter & 0x20;
+ m_blink_counter = (m_blink_counter + 1) & 0x3f;
+
+ UINT8 pattr = m_pattr;
+
+ for(int y=0; y<224; y++) {
+ // Line attributes and current colors
+ UINT8 lattr = 0;
+ UINT32 fgcol = colors[7];
+ UINT32 bgcol = colors[0];
+
+ UINT32 *p = &bitmap.pix32(y);
+
+ for(int x=0; x<40; x++) {
+ // Lookup the byte and, if needed, the pattern data
+ UINT8 ch, pat;
+ if((pattr & PATTR_HIRES) && y < 200)
+ ch = pat = m_ram[0xa000 + y*40 + x];
+
+ else {
+ ch = m_ram[0xbb80 + (y>>3)*40 + x];
+ int off = (lattr & LATTR_DSIZE ? y >> 1 : y ) & 7;
+ const UINT8 *base;
+ if(pattr & PATTR_HIRES)
+ if(lattr & LATTR_ALT)
+ base = m_ram + 0x9c00;
+ else
+ base = m_ram + 0x9800;
+ else
+ if(lattr & LATTR_ALT)
+ base = m_ram + 0xb800;
+ else
+ base = m_ram + 0xb400;
+ pat = base[((ch & 0x7f) << 3) | off];
+ }
+
+ // Handle state-chaging attributes
+ if(!(ch & 0x60)) {
+ pat = 0x00;
+ switch(ch & 0x18) {
+ case 0x00: fgcol = colors[ch & 7]; break;
+ case 0x08: lattr = ch & 7; break;
+ case 0x10: bgcol = colors[ch & 7]; break;
+ case 0x18: pattr = ch & 7; break;
+ }
+ }
+
+ // Pick up the colors for the pattern
+ UINT32 c_fgcol = fgcol;
+ UINT32 c_bgcol = bgcol;
+
+ // inverse video
+ if(ch & 0x80) {
+ c_bgcol = c_bgcol ^ 0xffffff;
+ c_fgcol = c_fgcol ^ 0xffffff;
+ }
+ // blink
+ if((lattr & LATTR_BLINK) && blink_state)
+ c_fgcol = c_bgcol;
+
+ // Draw the pattern
+ *p++ = pat & 0x20 ? c_fgcol : c_bgcol;
+ *p++ = pat & 0x10 ? c_fgcol : c_bgcol;
+ *p++ = pat & 0x08 ? c_fgcol : c_bgcol;
+ *p++ = pat & 0x04 ? c_fgcol : c_bgcol;
+ *p++ = pat & 0x02 ? c_fgcol : c_bgcol;
+ *p++ = pat & 0x01 ? c_fgcol : c_bgcol;
+ }
+ }
+
+ m_pattr = pattr;
- I have split the memory region &c000-&ffff in this way because:
+ return 0;
+}
- All roms (os, microdisc and jasmin) use the 6502 IRQ vectors at the end
- of memory &fff8-&ffff, but they are different sizes. The os is 16k, microdisc
- is 8k and jasmin is 2k.
+void oric_state::update_keyboard()
+{
+ m_via->write_pb3((m_kbd_row[m_via_b & 7]->read() | m_psg_a) != 0xff);
+}
+
+void oric_state::update_psg(address_space &space)
+{
+ if(m_via_ca2)
+ if(m_via_cb2)
+ m_psg->address_w(space, 0, m_via_a);
+ else
+ m_via->write_pa(space, 0, m_psg->data_r(space, 0));
+ else if(m_via_cb2)
+ m_psg->data_w(space, 0, m_via_a);
+}
- There is also 16k of ram at &c000-&ffff which is normally masked
- by the os rom, but when the microdisc or jasmin interfaces are used,
- this ram can be accessed. For the microdisc and jasmin, the ram not
- covered by the roms for these interfaces, can be accessed
- if it is enabled.
+void oric_state::update_irq()
+{
+ m_maincpu->set_input_line(m6502_device::IRQ_LINE, m_via_irq || m_ext_irq ? ASSERT_LINE : CLEAR_LINE);
+}
- SMH_BANK(1),SMH_BANK(2) and SMH_BANK(3) are used for a 16k rom.
- SMH_BANK(2) and SMH_BANK(3) are used for a 8k rom.
- SMH_BANK(3) is used for a 2k rom.
+INPUT_CHANGED_MEMBER(oric_state::nmi_pressed)
+{
+ m_maincpu->set_input_line(m6502_device::NMI_LINE, newval ? ASSERT_LINE : CLEAR_LINE);
+}
- 0x0300-0x03ff is I/O access. It is not defined below because the
- memory is setup dynamically depending on hardware that has been selected (microdisc, jasmin, apple2) etc.
+WRITE8_MEMBER(oric_state::via_a_w)
+{
+ m_via_a = data;
+ m_cent_data_out->write(space, 0, m_via_a);
+ update_psg(space);
+}
-*/
+WRITE8_MEMBER(oric_state::via_b_w)
+{
+ m_via_b = data;
+ update_keyboard();
+ m_centronics->write_strobe(data & 0x10 ? 1 : 0);
+ m_cassette->change_state(data & 0x40 ? CASSETTE_MOTOR_ENABLED : CASSETTE_MOTOR_DISABLED,
+ CASSETTE_MOTOR_DISABLED);
+ m_cassette->output(data & 0x80 ? -1.0 : +1.0);
+}
+WRITE_LINE_MEMBER(oric_state::via_ca2_w)
+{
+ m_via_ca2 = state;
+ update_psg(m_maincpu->space(AS_PROGRAM));
+}
-static ADDRESS_MAP_START(oric_mem, AS_PROGRAM, 8, oric_state )
- AM_RANGE( 0x0000, 0xbfff) AM_RAM AM_SHARE("ram")
- AM_RANGE( 0xc000, 0xdfff) AM_READ_BANK("bank1") AM_WRITE_BANK("bank5")
- AM_RANGE( 0xe000, 0xf7ff) AM_READ_BANK("bank2") AM_WRITE_BANK("bank6")
- AM_RANGE( 0xf800, 0xffff) AM_READ_BANK("bank3") AM_WRITE_BANK("bank7")
-ADDRESS_MAP_END
+WRITE_LINE_MEMBER(oric_state::via_cb2_w)
+{
+ m_via_cb2 = state;
+ update_psg(m_maincpu->space(AS_PROGRAM));
+}
+
+WRITE_LINE_MEMBER(oric_state::via_irq_w)
+{
+ m_via_irq = state;
+ update_irq();
+}
+
+WRITE_LINE_MEMBER(oric_state::ext_irq_w)
+{
+ m_ext_irq = state;
+ update_irq();
+}
+
+WRITE8_MEMBER(oric_state::psg_a_w)
+{
+ m_psg_a = data;
+ update_keyboard();
+}
+
+TIMER_DEVICE_CALLBACK_MEMBER(oric_state::update_tape)
+{
+ if(!m_config->read())
+ m_via->write_cb1(m_cassette->input() > 0.0038);
+}
+
+void oric_state::vblank_w(screen_device &screen, bool state)
+{
+ if(m_config->read())
+ m_via->write_cb1(state);
+}
+
+void oric_state::video_start()
+{
+ m_blink_counter = 0;
+ m_pattr = 0;
+}
+
+void oric_state::machine_start_common()
+{
+ m_via_a = 0xff;
+ m_via_b = 0xff;
+ m_psg_a = 0x00;
+ m_via_ca2 = false;
+ m_via_cb2 = false;
+ m_via_irq = false;
+ m_ext_irq = false;
+
+ for(int i=0; i<8; i++) {
+ char name[10];
+ sprintf(name, "ROW%d", i);
+ m_kbd_row[i] = machine().root_device().ioport(name);
+ }
+}
+
+void oric_state::machine_start()
+{
+ machine_start_common();
+ m_bank_c000_r->set_base(m_rom->base());
+ m_bank_e000_r->set_base(m_rom->base() + 0x2000);
+ m_bank_f800_r->set_base(m_rom->base() + 0x3800);
+}
+
+
+void telestrat_state::machine_start()
+{
+ machine_start_common();
+ for(int i=0; i<4; i++) {
+ char name[32];
+ sprintf(name, "fdc:%d", i);
+ m_floppies[i] = subdevice<floppy_connector>(name)->get_device();
+ }
+ m_fdc_irq = m_fdc_drq = m_fdc_hld = false;
+ m_acia_irq = false;
+
+ memset(m_junk_read, 0x00, sizeof(m_junk_read));
+ memset(m_junk_write, 0x00, sizeof(m_junk_write));
+}
+
+void telestrat_state::machine_reset()
+{
+ m_port_314 = 0x00;
+ m_via2_a = 0xff;
+ remap();
+}
+
+void telestrat_state::update_irq()
+{
+ m_maincpu->set_input_line(m6502_device::IRQ_LINE,
+ m_via_irq ||
+ m_ext_irq ||
+ (m_fdc_irq && (m_port_314 & P_IRQEN)) ||
+ m_via2_irq ||
+ m_acia_irq ? ASSERT_LINE : CLEAR_LINE);
+}
+
+WRITE8_MEMBER(telestrat_state::via2_a_w)
+{
+ m_via2_a = data;
+ remap();
+}
+
+WRITE8_MEMBER(telestrat_state::via2_b_w)
+{
+ m_via2_b = data;
+ UINT8 port = 0xff;
+ if(!(m_via2_b & 0x40))
+ port &= m_joy1->read();
+ if(!(m_via2_b & 0x80))
+ port &= m_joy2->read();
+
+ m_via2->write_pb(space, 0, port);
+}
+
+WRITE_LINE_MEMBER(telestrat_state::via2_ca2_w)
+{
+ m_via2_ca2 = state;
+}
+
+WRITE_LINE_MEMBER(telestrat_state::via2_cb2_w)
+{
+ m_via2_cb2 = state;
+}
+
+WRITE_LINE_MEMBER(telestrat_state::via2_irq_w)
+{
+ m_via2_irq = state;
+ update_irq();
+}
+
+WRITE8_MEMBER(telestrat_state::port_314_w)
+{
+ m_port_314 = data;
+ floppy_image_device *floppy = m_floppies[(m_port_314 >> 5) & 3];
+ m_fdc->set_floppy(floppy);
+ m_fdc->dden_w(m_port_314 & P_DDEN);
+ if(floppy) {
+ floppy->ss_w(m_port_314 & P_SS ? 1 : 0);
+ floppy->mon_w(0);
+ }
+ update_irq();
+}
+
+READ8_MEMBER(telestrat_state::port_314_r)
+{
+ return (m_fdc_irq && (m_port_314 & P_IRQEN)) ? 0x7f : 0xff;
+}
+
+READ8_MEMBER(telestrat_state::port_318_r)
+{
+ return m_fdc_drq ? 0x7f : 0xff;
+}
+
+
+WRITE_LINE_MEMBER(telestrat_state::acia_irq_w)
+{
+ m_acia_irq = state;
+ update_irq();
+}
+
+WRITE_LINE_MEMBER(telestrat_state::fdc_irq_w)
+{
+ m_fdc_irq = state;
+ update_irq();
+}
+
+WRITE_LINE_MEMBER(telestrat_state::fdc_drq_w)
+{
+ m_fdc_drq = state;
+}
+
+WRITE_LINE_MEMBER(telestrat_state::fdc_hld_w)
+{
+ m_fdc_hld = state;
+}
+
+void telestrat_state::remap()
+{
+ // Theorically, these are cartridges. There's no real point to
+ // making them configurable, when only 4 existed and there are 7
+ // slots.
+
+ switch(m_via2_a & 7) {
+ case 0:
+ m_bank_c000_r->set_base(m_ram+0xc000);
+ m_bank_c000_w->set_base(m_ram+0xc000);
+ break;
+ case 1:
+ case 2:
+ case 3:
+ m_bank_c000_r->set_base(m_junk_read);
+ m_bank_c000_w->set_base(m_junk_write);
+ break;
+ case 4:
+ m_bank_c000_r->set_base(m_telmatic->base());
+ m_bank_c000_w->set_base(m_junk_write);
+ break;
+ case 5:
+ m_bank_c000_r->set_base(m_teleass->base());
+ m_bank_c000_w->set_base(m_junk_write);
+ break;
+ case 6:
+ m_bank_c000_r->set_base(m_hyperbas->base());
+ m_bank_c000_w->set_base(m_junk_write);
+ break;
+ case 7:
+ m_bank_c000_r->set_base(m_telmon24->base());
+ m_bank_c000_w->set_base(m_junk_write);
+ break;
+ }
+}
-/*
-The telestrat has the memory regions split into 16k blocks.
-Memory region &c000-&ffff can be ram or rom. */
-static ADDRESS_MAP_START(telestrat_mem, AS_PROGRAM, 8, oric_state )
- AM_RANGE( 0x0000, 0x02ff) AM_RAM
- AM_RANGE( 0x0300, 0x030f) AM_DEVREADWRITE("via6522_0", via6522_device, read, write)
- AM_RANGE( 0x0310, 0x031b) AM_READWRITE(oric_microdisc_r, oric_microdisc_w )
- AM_RANGE( 0x031c, 0x031f) AM_DEVREADWRITE("acia", mos6551_device, read, write)
- AM_RANGE( 0x0320, 0x032f) AM_DEVREADWRITE("via6522_1", via6522_device, read, write)
- AM_RANGE( 0x0400, 0xbfff) AM_RAM
- AM_RANGE( 0xc000, 0xffff) AM_READ_BANK("bank1") AM_WRITE_BANK("bank2")
-ADDRESS_MAP_END
static INPUT_PORTS_START(oric)
PORT_START("ROW0")
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_3) PORT_CHAR('3') PORT_CHAR('#')
- PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_X) PORT_CHAR('x') PORT_CHAR('X')
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_1) PORT_CHAR('1') PORT_CHAR('!')
- PORT_BIT(0x10, 0x00, IPT_UNUSED)
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_V) PORT_CHAR('v') PORT_CHAR('V')
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_5) PORT_CHAR('5') PORT_CHAR('%')
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_N) PORT_CHAR('n') PORT_CHAR('N')
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_7) PORT_CHAR('7') PORT_CHAR('&')
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_3) PORT_CHAR('3') PORT_CHAR('#')
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_X) PORT_CHAR('x') PORT_CHAR('X')
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_1) PORT_CHAR('1') PORT_CHAR('!')
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_UNUSED)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_V) PORT_CHAR('v') PORT_CHAR('V')
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_5) PORT_CHAR('5') PORT_CHAR('%')
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_N) PORT_CHAR('n') PORT_CHAR('N')
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_7) PORT_CHAR('7') PORT_CHAR('&')
PORT_START("ROW1")
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_D) PORT_CHAR('d') PORT_CHAR('D')
- PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_Q) PORT_CHAR('q') PORT_CHAR('Q')
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_TAB) PORT_CHAR(UCHAR_MAMEKEY(ESC))
- PORT_BIT(0x10, 0x00, IPT_UNUSED)
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_F) PORT_CHAR('f') PORT_CHAR('F')
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_R) PORT_CHAR('r') PORT_CHAR('R')
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_T) PORT_CHAR('t') PORT_CHAR('T')
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_J) PORT_CHAR('j') PORT_CHAR('J')
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_D) PORT_CHAR('d') PORT_CHAR('D')
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_Q) PORT_CHAR('q') PORT_CHAR('Q')
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_TAB) PORT_CHAR(UCHAR_MAMEKEY(ESC))
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_UNUSED)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_F) PORT_CHAR('f') PORT_CHAR('F')
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_R) PORT_CHAR('r') PORT_CHAR('R')
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_T) PORT_CHAR('t') PORT_CHAR('T')
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_J) PORT_CHAR('j') PORT_CHAR('J')
PORT_START("ROW2")
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_C) PORT_CHAR('c') PORT_CHAR('C')
- PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_2) PORT_CHAR('2') PORT_CHAR('@')
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_Z) PORT_CHAR('z') PORT_CHAR('Z')
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_LCONTROL) PORT_CODE(KEYCODE_LCONTROL) PORT_CHAR(UCHAR_SHIFT_2)
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_4) PORT_CHAR('4') PORT_CHAR('$')
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_B) PORT_CHAR('b') PORT_CHAR('B')
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_6) PORT_CHAR('6') PORT_CHAR('^')
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_M) PORT_CHAR('m') PORT_CHAR('M')
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_C) PORT_CHAR('c') PORT_CHAR('C')
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_2) PORT_CHAR('2') PORT_CHAR('@')
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_Z) PORT_CHAR('z') PORT_CHAR('Z')
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_LCONTROL) PORT_CODE(KEYCODE_LCONTROL) PORT_CHAR(UCHAR_SHIFT_2)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_4) PORT_CHAR('4') PORT_CHAR('$')
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_B) PORT_CHAR('b') PORT_CHAR('B')
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_6) PORT_CHAR('6') PORT_CHAR('^')
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_M) PORT_CHAR('m') PORT_CHAR('M')
PORT_START("ROW3")
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_QUOTE) PORT_CHAR('\'') PORT_CHAR('"')
- PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_BACKSLASH2) PORT_CHAR('\\') PORT_CHAR('|')
- PORT_BIT(0x20, 0x00, IPT_UNUSED)
- PORT_BIT(0x10, 0x00, IPT_UNUSED)
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_MINUS) PORT_CHAR('-') PORT_CHAR('\xA3')
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_COLON) PORT_CHAR(';') PORT_CHAR(':')
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_9) PORT_CHAR('9') PORT_CHAR('(')
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_K) PORT_CHAR('k') PORT_CHAR('K')
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_QUOTE) PORT_CHAR('\'') PORT_CHAR('"')
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_BACKSLASH2) PORT_CHAR('\\') PORT_CHAR('|')
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_UNUSED)
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_UNUSED)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_MINUS) PORT_CHAR('-') PORT_CHAR('\xA3')
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_COLON) PORT_CHAR(';') PORT_CHAR(':')
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_9) PORT_CHAR('9') PORT_CHAR('(')
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_K) PORT_CHAR('k') PORT_CHAR('K')
PORT_START("ROW4")
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_RIGHT) PORT_CHAR(UCHAR_MAMEKEY(RIGHT))
- PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_DOWN) PORT_CHAR(UCHAR_MAMEKEY(DOWN))
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_LEFT) PORT_CHAR(UCHAR_MAMEKEY(LEFT))
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_LSHIFT) PORT_CHAR(UCHAR_MAMEKEY(LSHIFT))
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_UP) PORT_CHAR(UCHAR_MAMEKEY(UP))
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_STOP) PORT_CHAR('.') PORT_CHAR('>')
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_COMMA) PORT_CHAR(',') PORT_CHAR('<')
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_SPACE) PORT_CHAR(' ')
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_RIGHT) PORT_CHAR(UCHAR_MAMEKEY(RIGHT))
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_DOWN) PORT_CHAR(UCHAR_MAMEKEY(DOWN))
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_LEFT) PORT_CHAR(UCHAR_MAMEKEY(LEFT))
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_LSHIFT) PORT_CHAR(UCHAR_MAMEKEY(LSHIFT))
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_UP) PORT_CHAR(UCHAR_MAMEKEY(UP))
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_STOP) PORT_CHAR('.') PORT_CHAR('>')
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_COMMA) PORT_CHAR(',') PORT_CHAR('<')
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_SPACE) PORT_CHAR(' ')
PORT_START("ROW5")
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_OPENBRACE) PORT_CHAR('[') PORT_CHAR('{')
- PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_CLOSEBRACE) PORT_CHAR(']') PORT_CHAR('}')
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Del") PORT_CODE(KEYCODE_BACKSPACE) PORT_CHAR(8)
- PORT_BIT(0x10, 0x00, IPT_UNUSED)
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_P) PORT_CHAR('p') PORT_CHAR('P')
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_O) PORT_CHAR('o') PORT_CHAR('O')
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_I) PORT_CHAR('i') PORT_CHAR('I')
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_U) PORT_CHAR('u') PORT_CHAR('U')
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_OPENBRACE) PORT_CHAR('[') PORT_CHAR('{')
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_CLOSEBRACE) PORT_CHAR(']') PORT_CHAR('}')
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Del") PORT_CODE(KEYCODE_BACKSPACE) PORT_CHAR(8)
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_UNUSED)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_P) PORT_CHAR('p') PORT_CHAR('P')
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_O) PORT_CHAR('o') PORT_CHAR('O')
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_I) PORT_CHAR('i') PORT_CHAR('I')
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_U) PORT_CHAR('u') PORT_CHAR('U')
PORT_START("ROW6")
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_W) PORT_CHAR('w') PORT_CHAR('W')
- PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_S) PORT_CHAR('s') PORT_CHAR('S')
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_A) PORT_CHAR('a') PORT_CHAR('A')
- PORT_BIT(0x10, 0x00, IPT_UNUSED)
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_E) PORT_CHAR('e') PORT_CHAR('E')
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_G) PORT_CHAR('g') PORT_CHAR('G')
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_H) PORT_CHAR('h') PORT_CHAR('H')
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_Y) PORT_CHAR('y') PORT_CHAR('Y')
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_W) PORT_CHAR('w') PORT_CHAR('W')
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_S) PORT_CHAR('s') PORT_CHAR('S')
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_A) PORT_CHAR('a') PORT_CHAR('A')
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_UNUSED)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_E) PORT_CHAR('e') PORT_CHAR('E')
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_G) PORT_CHAR('g') PORT_CHAR('G')
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_H) PORT_CHAR('h') PORT_CHAR('H')
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_Y) PORT_CHAR('y') PORT_CHAR('Y')
PORT_START("ROW7")
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_EQUALS) PORT_CHAR('=') PORT_CHAR('+')
- PORT_BIT(0x40, 0x00, IPT_UNUSED)
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Return") PORT_CODE(KEYCODE_ENTER) PORT_CHAR(13)
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_RSHIFT) PORT_CHAR(UCHAR_MAMEKEY(RSHIFT))
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_SLASH) PORT_CHAR('/') PORT_CHAR('?')
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_0) PORT_CHAR('0') PORT_CHAR(')')
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_L) PORT_CHAR('l') PORT_CHAR('L')
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_8) PORT_CHAR('8') PORT_CHAR('*')
-
- PORT_START("FLOPPY")
- /* floppy interface */
- PORT_CONFNAME( 0x03, 0x00, "Floppy disc interface" )
- PORT_CONFSETTING( 0x00, DEF_STR( None ) )
- PORT_CONFSETTING( 0x01, "Microdisc" )
- PORT_CONFSETTING( 0x02, "Jasmin" )
-/* PORT_CONFSETTING( 0x03, "Low 8D DOS" ) */
-/* PORT_CONFSETTING( 0x04, "High 8D DOS" ) */
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_EQUALS) PORT_CHAR('=') PORT_CHAR('+')
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_UNUSED)
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Return") PORT_CODE(KEYCODE_ENTER) PORT_CHAR(13)
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_RSHIFT) PORT_CHAR(UCHAR_MAMEKEY(RSHIFT))
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_SLASH) PORT_CHAR('/') PORT_CHAR('?')
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_0) PORT_CHAR('0') PORT_CHAR(')')
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_L) PORT_CHAR('l') PORT_CHAR('L')
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_8) PORT_CHAR('8') PORT_CHAR('*')
+
+ PORT_START("NMI")
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("NMI") PORT_CODE(KEYCODE_F2) PORT_CHAR(UCHAR_MAMEKEY(F2)) PORT_CHANGED_MEMBER(DEVICE_SELF, oric_state, nmi_pressed, 0)
/* vsync cable hardware. This is a simple cable connected to the video output
to the monitor/television. The sync signal is connected to the cassette input
allowing interrupts to be generated from the vsync signal. */
- PORT_CONFNAME(0x08, 0x00, "Vsync cable hardware")
- PORT_CONFSETTING( 0x00, DEF_STR( Off ) )
- PORT_CONFSETTING( 0x08, DEF_STR( On ) )
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_CUSTOM) PORT_VBLANK("screen")
+ PORT_START("CONFIG")
+ PORT_CONFNAME(0x01, 0x00, "Tape input")
+ PORT_CONFSETTING( 0x00, "Tape")
+ PORT_CONFSETTING( 0x01, "VSync cable")
INPUT_PORTS_END
static INPUT_PORTS_START(orica)
PORT_INCLUDE( oric )
PORT_MODIFY("ROW5")
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Funct") PORT_CODE(KEYCODE_END) PORT_CHAR(UCHAR_MAMEKEY(F1))
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Funct") PORT_CODE(KEYCODE_LALT) PORT_CHAR(UCHAR_MAMEKEY(LALT))
INPUT_PORTS_END
static INPUT_PORTS_START(prav8d)
PORT_START("ROW0")
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_3) PORT_CHAR('3') PORT_CHAR('#')
- PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("X \xd0\xac") PORT_CODE(KEYCODE_X) PORT_CHAR('X')
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_1) PORT_CHAR('1') PORT_CHAR('!')
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_UNUSED)
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("V \xd0\x96") PORT_CODE(KEYCODE_V) PORT_CHAR('V')
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_5) PORT_CHAR('5') PORT_CHAR('%')
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("N \xd0\x9d") PORT_CODE(KEYCODE_N) PORT_CHAR('N')
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_7) PORT_CHAR('7') PORT_CHAR('\'')
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_3) PORT_CHAR('3') PORT_CHAR('#')
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("X \xd0\xac") PORT_CODE(KEYCODE_X) PORT_CHAR('X')
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_1) PORT_CHAR('1') PORT_CHAR('!')
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_UNUSED)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("V \xd0\x96") PORT_CODE(KEYCODE_V) PORT_CHAR('V')
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_5) PORT_CHAR('5') PORT_CHAR('%')
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("N \xd0\x9d") PORT_CODE(KEYCODE_N) PORT_CHAR('N')
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_7) PORT_CHAR('7') PORT_CHAR('\'')
PORT_START("ROW1")
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("D \xd0\x94") PORT_CODE(KEYCODE_D) PORT_CHAR('D')
- PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Q \xd0\xaf") PORT_CODE(KEYCODE_Q) PORT_CHAR('Q')
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Esc") PORT_CODE(KEYCODE_ESC) PORT_CHAR(UCHAR_MAMEKEY(ESC))
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_UNUSED)
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("F \xd0\xa4") PORT_CODE(KEYCODE_F) PORT_CHAR('F')
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("R \xd0\xa0") PORT_CODE(KEYCODE_R) PORT_CHAR('R')
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("T \xd0\xa2") PORT_CODE(KEYCODE_T) PORT_CHAR('T')
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("J \xd0\x99") PORT_CODE(KEYCODE_J) PORT_CHAR('J')
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("D \xd0\x94") PORT_CODE(KEYCODE_D) PORT_CHAR('D')
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Q \xd0\xaf") PORT_CODE(KEYCODE_Q) PORT_CHAR('Q')
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Esc") PORT_CODE(KEYCODE_ESC) PORT_CHAR(UCHAR_MAMEKEY(ESC))
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_UNUSED)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F \xd0\xa4") PORT_CODE(KEYCODE_F) PORT_CHAR('F')
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("R \xd0\xa0") PORT_CODE(KEYCODE_R) PORT_CHAR('R')
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("T \xd0\xa2") PORT_CODE(KEYCODE_T) PORT_CHAR('T')
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("J \xd0\x99") PORT_CODE(KEYCODE_J) PORT_CHAR('J')
PORT_START("ROW2")
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("C \xd0\xa6") PORT_CODE(KEYCODE_C) PORT_CHAR('C')
- PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_2) PORT_CHAR('2') PORT_CHAR('"')
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Z \xd0\x97") PORT_CODE(KEYCODE_Z) PORT_CHAR('Z')
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("MK") PORT_CODE(KEYCODE_LCONTROL) PORT_CODE(KEYCODE_LCONTROL) PORT_CHAR(UCHAR_SHIFT_2)
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_4) PORT_CHAR('4') PORT_CHAR('$')
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("B \xd0\x91") PORT_CODE(KEYCODE_B) PORT_CHAR('B')
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_6) PORT_CHAR('6') PORT_CHAR('&')
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("M \xd0\x9c") PORT_CODE(KEYCODE_M) PORT_CHAR('M')
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("C \xd0\xa6") PORT_CODE(KEYCODE_C) PORT_CHAR('C')
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_2) PORT_CHAR('2') PORT_CHAR('"')
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Z \xd0\x97") PORT_CODE(KEYCODE_Z) PORT_CHAR('Z')
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("MK") PORT_CODE(KEYCODE_LCONTROL) PORT_CODE(KEYCODE_LCONTROL) PORT_CHAR(UCHAR_SHIFT_2)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_4) PORT_CHAR('4') PORT_CHAR('$')
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("B \xd0\x91") PORT_CODE(KEYCODE_B) PORT_CHAR('B')
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_6) PORT_CHAR('6') PORT_CHAR('&')
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("M \xd0\x9c") PORT_CODE(KEYCODE_M) PORT_CHAR('M')
PORT_START("ROW3")
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("] \xd0\xa9") PORT_CODE(KEYCODE_QUOTE) PORT_CHAR(']')
- PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_BACKSLASH2) PORT_CHAR(';') PORT_CHAR('+')
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("C/L") PORT_CODE(KEYCODE_CAPSLOCK) PORT_CHAR(UCHAR_MAMEKEY(CAPSLOCK)) // this one is 5th line, 1st key from right
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_UNUSED)
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_MINUS) PORT_CHAR(':') PORT_CHAR('*')
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("[ \xd0\xa8") PORT_CODE(KEYCODE_COLON) PORT_CHAR('[')
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_9) PORT_CHAR('9') PORT_CHAR(')')
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("K \xd0\x9a") PORT_CODE(KEYCODE_K) PORT_CHAR('K')
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("] \xd0\xa9") PORT_CODE(KEYCODE_QUOTE) PORT_CHAR(']')
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_BACKSLASH2) PORT_CHAR(';') PORT_CHAR('+')
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("C/L") PORT_CODE(KEYCODE_CAPSLOCK) PORT_CHAR(UCHAR_MAMEKEY(CAPSLOCK)) // this one is 5th line, 1st key from right
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_UNUSED)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_MINUS) PORT_CHAR(':') PORT_CHAR('*')
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("[ \xd0\xa8") PORT_CODE(KEYCODE_COLON) PORT_CHAR('[')
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_9) PORT_CHAR('9') PORT_CHAR(')')
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("K \xd0\x9a") PORT_CODE(KEYCODE_K) PORT_CHAR('K')
PORT_START("ROW4")
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME(UTF8_RIGHT) PORT_CODE(KEYCODE_RIGHT) PORT_CHAR(UCHAR_MAMEKEY(RIGHT))
- PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME(UTF8_DOWN) PORT_CODE(KEYCODE_DOWN) PORT_CHAR(UCHAR_MAMEKEY(DOWN))
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME(UTF8_LEFT) PORT_CODE(KEYCODE_LEFT) PORT_CHAR(UCHAR_MAMEKEY(LEFT))
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_LSHIFT) PORT_CHAR(UCHAR_MAMEKEY(LSHIFT))
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME(UTF8_UP) PORT_CODE(KEYCODE_UP) PORT_CHAR(UCHAR_MAMEKEY(UP))
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_STOP) PORT_CHAR('.') PORT_CHAR('>')
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_COMMA) PORT_CHAR(',') PORT_CHAR('<')
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_SPACE) PORT_CHAR(' ')
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME(UTF8_RIGHT) PORT_CODE(KEYCODE_RIGHT) PORT_CHAR(UCHAR_MAMEKEY(RIGHT))
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME(UTF8_DOWN) PORT_CODE(KEYCODE_DOWN) PORT_CHAR(UCHAR_MAMEKEY(DOWN))
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME(UTF8_LEFT) PORT_CODE(KEYCODE_LEFT) PORT_CHAR(UCHAR_MAMEKEY(LEFT))
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_LSHIFT) PORT_CHAR(UCHAR_MAMEKEY(LSHIFT))
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME(UTF8_UP) PORT_CODE(KEYCODE_UP) PORT_CHAR(UCHAR_MAMEKEY(UP))
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_STOP) PORT_CHAR('.') PORT_CHAR('>')
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_COMMA) PORT_CHAR(',') PORT_CHAR('<')
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_SPACE) PORT_CHAR(' ')
PORT_START("ROW5")
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("@ \xd0\xae") PORT_CODE(KEYCODE_OPENBRACE) PORT_CHAR('@')
- PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("\\ \xd0\xad") PORT_CODE(KEYCODE_CLOSEBRACE) PORT_CHAR('\\')
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Del") PORT_CODE(KEYCODE_BACKSPACE) PORT_CHAR(8) // this one is 5th line, 1st key from left
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_UNUSED)
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("P \xd0\x9f") PORT_CODE(KEYCODE_P) PORT_CHAR('P')
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("O \xd0\x9e") PORT_CODE(KEYCODE_O) PORT_CHAR('O')
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("I \xd0\x98") PORT_CODE(KEYCODE_I) PORT_CHAR('I')
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("U \xd0\xa3") PORT_CODE(KEYCODE_U) PORT_CHAR('U')
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("@ \xd0\xae") PORT_CODE(KEYCODE_OPENBRACE) PORT_CHAR('@')
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("\\ \xd0\xad") PORT_CODE(KEYCODE_CLOSEBRACE) PORT_CHAR('\\')
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Del") PORT_CODE(KEYCODE_BACKSPACE) PORT_CHAR(8) // this one is 5th line, 1st key from left
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_UNUSED)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("P \xd0\x9f") PORT_CODE(KEYCODE_P) PORT_CHAR('P')
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("O \xd0\x9e") PORT_CODE(KEYCODE_O) PORT_CHAR('O')
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("I \xd0\x98") PORT_CODE(KEYCODE_I) PORT_CHAR('I')
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("U \xd0\xa3") PORT_CODE(KEYCODE_U) PORT_CHAR('U')
PORT_START("ROW6")
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("W \xd0\x92") PORT_CODE(KEYCODE_W) PORT_CHAR('W')
- PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("S \xd0\xa1") PORT_CODE(KEYCODE_S) PORT_CHAR('S')
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("A \xd0\x90") PORT_CODE(KEYCODE_A) PORT_CHAR('A')
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_UNUSED)
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("E \xd0\x95") PORT_CODE(KEYCODE_E) PORT_CHAR('E')
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("G \xd0\x93") PORT_CODE(KEYCODE_G) PORT_CHAR('G')
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("H \xd0\xa5") PORT_CODE(KEYCODE_H) PORT_CHAR('H')
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Y \xd0\xaa") PORT_CODE(KEYCODE_Y) PORT_CHAR('Y')
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("W \xd0\x92") PORT_CODE(KEYCODE_W) PORT_CHAR('W')
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("S \xd0\xa1") PORT_CODE(KEYCODE_S) PORT_CHAR('S')
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("A \xd0\x90") PORT_CODE(KEYCODE_A) PORT_CHAR('A')
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_UNUSED)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("E \xd0\x95") PORT_CODE(KEYCODE_E) PORT_CHAR('E')
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("G \xd0\x93") PORT_CODE(KEYCODE_G) PORT_CHAR('G')
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("H \xd0\xa5") PORT_CODE(KEYCODE_H) PORT_CHAR('H')
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Y \xd0\xaa") PORT_CODE(KEYCODE_Y) PORT_CHAR('Y')
PORT_START("ROW7")
- PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_EQUALS) PORT_CHAR('-') PORT_CHAR('=')
- PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("^ \xd0\xa7") PORT_CODE(KEYCODE_BACKSLASH) PORT_CHAR('^') // this one would be on 2nd line, 3rd key from 'P'
- PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Return") PORT_CODE(KEYCODE_ENTER) PORT_CHAR(13)
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_RSHIFT) PORT_CHAR(UCHAR_MAMEKEY(RSHIFT))
- PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_SLASH) PORT_CHAR('/') PORT_CHAR('?')
- PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_0) PORT_CHAR('0')
- PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("L \xd0\x9b") PORT_CODE(KEYCODE_L) PORT_CHAR('L')
- PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_8) PORT_CHAR('8') PORT_CHAR('(')
-
- PORT_START("FLOPPY")
- /* force apple2 disc interface for pravetz */
- PORT_START("oric_floppy_interface")
- PORT_CONFNAME( 0x07, 0x00, "Floppy disc interface" )
- PORT_CONFSETTING( 0x00, DEF_STR( None ) )
- PORT_CONFSETTING( 0x03, "Low 8D DOS" )
- PORT_CONFSETTING( 0x04, "High 8D DOS" )
+ PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_EQUALS) PORT_CHAR('-') PORT_CHAR('=')
+ PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("^ \xd0\xa7") PORT_CODE(KEYCODE_BACKSLASH) PORT_CHAR('^') // this one would be on 2nd line, 3rd key from 'P'
+ PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Return") PORT_CODE(KEYCODE_ENTER) PORT_CHAR(13)
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_RSHIFT) PORT_CHAR(UCHAR_MAMEKEY(RSHIFT))
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_SLASH) PORT_CHAR('/') PORT_CHAR('?')
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_0) PORT_CHAR('0')
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("L \xd0\x9b") PORT_CODE(KEYCODE_L) PORT_CHAR('L')
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_8) PORT_CHAR('8') PORT_CHAR('(')
+
+ PORT_START("NMI")
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("NMI") PORT_CODE(KEYCODE_F2) PORT_CHAR(UCHAR_MAMEKEY(F2)) PORT_CHANGED_MEMBER(DEVICE_SELF, oric_state, nmi_pressed, 0)
/* vsync cable hardware. This is a simple cable connected to the video output
to the monitor/television. The sync signal is connected to the cassette input
allowing interrupts to be generated from the vsync signal. */
- PORT_CONFNAME(0x08, 0x00, "Vsync cable hardware")
- PORT_CONFSETTING( 0x00, DEF_STR( Off ) )
- PORT_CONFSETTING( 0x08, DEF_STR( On ) )
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_CUSTOM) PORT_VBLANK("screen")
+ PORT_START("CONFIG")
+ PORT_CONFNAME(0x01, 0x00, "Tape input")
+ PORT_CONFSETTING( 0x00, "Tape")
+ PORT_CONFSETTING( 0x01, "VSync cable")
INPUT_PORTS_END
static INPUT_PORTS_START(telstrat)
- PORT_INCLUDE( oric )
-
- PORT_MODIFY("ROW5")
- PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Funct") PORT_CODE(KEYCODE_END) PORT_CHAR(UCHAR_MAMEKEY(F1))
-
- PORT_MODIFY("FLOPPY")
- /* vsync cable hardware. This is a simple cable connected to the video output
- to the monitor/television. The sync signal is connected to the cassette input
- allowing interrupts to be generated from the vsync signal. */
- PORT_BIT(0x07, 0x00, IPT_UNUSED)
- PORT_CONFNAME(0x08, 0x00, "Vsync cable hardware")
- PORT_CONFSETTING( 0x00, DEF_STR( Off ) )
- PORT_CONFSETTING( 0x08, DEF_STR( On ) )
- PORT_BIT( 0x010, IP_ACTIVE_HIGH, IPT_CUSTOM) PORT_VBLANK("screen")
-
- PORT_START("JOY0") /* left joystick port */
- PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Joystick 0 Up") PORT_CODE(JOYCODE_X_RIGHT_SWITCH)
- PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Joystick 0 Down") PORT_CODE(JOYCODE_X_LEFT_SWITCH)
- PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Joystick 0 Left") PORT_CODE(JOYCODE_BUTTON1)
- PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Joystick 0 Right") PORT_CODE(JOYCODE_Y_DOWN_SWITCH)
- PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Joystick 0 Fire 1") PORT_CODE(JOYCODE_Y_UP_SWITCH)
-
- PORT_START("JOY1") /* right joystick port */
- PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Joystick 1 Up") PORT_CODE(JOYCODE_X_RIGHT_SWITCH)
- PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Joystick 1 Down") PORT_CODE(JOYCODE_X_LEFT_SWITCH)
- PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Joystick 1 Left") PORT_CODE(JOYCODE_BUTTON1)
- PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Joystick 1 Right") PORT_CODE(JOYCODE_Y_DOWN_SWITCH)
- PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Joystick 1 Fire 1") PORT_CODE(JOYCODE_Y_UP_SWITCH)
+ PORT_INCLUDE( orica )
+
+// The telestrat does not have the NMI button
+ PORT_MODIFY("NMI")
+ PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED)
+
+ PORT_START("JOY1") /* left joystick port */
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT) PORT_8WAY PORT_PLAYER(1)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT) PORT_8WAY PORT_PLAYER(1)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_BUTTON1) PORT_PLAYER(1)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN) PORT_8WAY PORT_PLAYER(1)
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_UP) PORT_8WAY PORT_PLAYER(1)
+
+ PORT_START("JOY2") /* right joystick port */
+ PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT) PORT_8WAY PORT_PLAYER(2)
+ PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT) PORT_8WAY PORT_PLAYER(2)
+ PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_BUTTON1) PORT_PLAYER(2)
+ PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN) PORT_8WAY PORT_PLAYER(2)
+ PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_UP) PORT_8WAY PORT_PLAYER(2)
INPUT_PORTS_END
-static const unsigned char oric_palette[8*3] =
-{
- 0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
- 0x00, 0xff, 0x00, 0xff, 0xff, 0x00,
- 0x00, 0x00, 0xff, 0xff, 0x00, 0xff,
- 0x00, 0xff, 0xff, 0xff, 0xff, 0xff,
-};
-
-/* Initialise the palette */
-PALETTE_INIT_MEMBER(oric_state, oric)
-{
- int i;
-
- for ( i = 0; i < sizeof(oric_palette) / 3; i++ ) {
- palette.set_pen_color(i, oric_palette[i*3], oric_palette[i*3+1], oric_palette[i*3+2]);
- }
-}
-
-
-
static const ay8910_interface oric_ay_interface =
{
- AY8910_LEGACY_OUTPUT,
- AY8910_DEFAULT_LOADS,
+ AY8910_DISCRETE_OUTPUT,
+ { 4700, 4700, 4700},
DEVCB_NULL,
DEVCB_NULL,
- DEVCB_DRIVER_MEMBER(oric_state, oric_psg_porta_write),
+ DEVCB_DRIVER_MEMBER(oric_state, psg_a_w),
DEVCB_NULL,
};
@@ -340,39 +787,12 @@ static const cassette_interface oric_cassette_interface =
NULL
};
-static const floppy_interface oric1_floppy_interface =
-{
- DEVCB_NULL,
- DEVCB_NULL,
- DEVCB_NULL,
- DEVCB_NULL,
- DEVCB_NULL,
- FLOPPY_STANDARD_5_25_DSHD,
- LEGACY_FLOPPY_OPTIONS_NAME(oric),
- NULL,
- NULL
-};
-
-static const floppy_interface prav8d_floppy_interface =
-{
- DEVCB_NULL,
- DEVCB_NULL,
- DEVCB_NULL,
- DEVCB_NULL,
- DEVCB_NULL,
- FLOPPY_STANDARD_5_25_DSHD,
- LEGACY_FLOPPY_OPTIONS_NAME(apple2),
- NULL,
- NULL
-};
-
static MACHINE_CONFIG_START( oric, oric_state )
/* basic machine hardware */
- MCFG_CPU_ADD("maincpu", M6502, 1000000)
+ MCFG_CPU_ADD("maincpu", M6502, XTAL_12MHz/12)
MCFG_CPU_PROGRAM_MAP(oric_mem)
MCFG_QUANTUM_TIME(attotime::from_hz(60))
-
/* video hardware */
MCFG_SCREEN_ADD("screen", RASTER)
MCFG_SCREEN_REFRESH_RATE(60)
@@ -380,155 +800,166 @@ static MACHINE_CONFIG_START( oric, oric_state )
MCFG_SCREEN_SIZE(40*6, 28*8)
MCFG_SCREEN_VISIBLE_AREA(0, 40*6-1, 0, 28*8-1)
MCFG_SCREEN_UPDATE_DRIVER(oric_state, screen_update_oric)
- MCFG_SCREEN_PALETTE("palette")
-
- MCFG_PALETTE_ADD("palette", 8)
- MCFG_PALETTE_INIT_OWNER(oric_state, oric)
-
+ MCFG_SCREEN_VBLANK_DRIVER(oric_state, vblank_w)
/* sound hardware */
MCFG_SPEAKER_STANDARD_MONO("mono")
MCFG_SOUND_WAVE_ADD(WAVE_TAG, "cassette")
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
- MCFG_SOUND_ADD("ay8912", AY8912, 1000000)
+ MCFG_SOUND_ADD("ay8912", AY8912, XTAL_12MHz/12)
MCFG_SOUND_CONFIG(oric_ay_interface)
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
/* printer */
MCFG_CENTRONICS_ADD("centronics", centronics_printers, "image")
- MCFG_CENTRONICS_ACK_HANDLER(DEVWRITELINE("via6522_0", via6522_device, write_ca1))
-
+ MCFG_CENTRONICS_ACK_HANDLER(DEVWRITELINE("via6522", via6522_device, write_ca1))
MCFG_CENTRONICS_OUTPUT_LATCH_ADD("cent_data_out", "centronics")
/* cassette */
MCFG_CASSETTE_ADD( "cassette", oric_cassette_interface )
+ MCFG_TIMER_DRIVER_ADD_PERIODIC("tape_timer", oric_state, update_tape, attotime::from_hz(4800))
/* via */
- MCFG_DEVICE_ADD( "via6522_0", VIA6522, 1000000 )
- MCFG_VIA6522_READPA_HANDLER(READ8(oric_state, oric_via_in_a_func))
- MCFG_VIA6522_READPB_HANDLER(READ8(oric_state, oric_via_in_b_func))
- MCFG_VIA6522_WRITEPA_HANDLER(WRITE8(oric_state, oric_via_out_a_func))
- MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(oric_state, oric_via_out_b_func))
- MCFG_VIA6522_CA2_HANDLER(WRITELINE(oric_state, oric_via_out_ca2_func))
- MCFG_VIA6522_CB2_HANDLER(WRITELINE(oric_state, oric_via_out_cb2_func))
- MCFG_VIA6522_IRQ_HANDLER(WRITELINE(oric_state, oric_via_irq_func))
-
- MCFG_WD1770_ADD("wd179x", oric_wd17xx_interface )
-
- MCFG_LEGACY_FLOPPY_4_DRIVES_ADD(oric1_floppy_interface)
+ MCFG_DEVICE_ADD( "via6522", VIA6522, XTAL_12MHz/12 )
+ MCFG_VIA6522_WRITEPA_HANDLER(WRITE8(oric_state, via_a_w))
+ MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(oric_state, via_b_w))
+ MCFG_VIA6522_CA2_HANDLER(WRITELINE(oric_state, via_ca2_w))
+ MCFG_VIA6522_CB2_HANDLER(WRITELINE(oric_state, via_cb2_w))
+ MCFG_VIA6522_IRQ_HANDLER(WRITELINE(oric_state, via_irq_w))
+
+ /* extension port */
+ MCFG_ORICEXT_ADD( "ext", oricext_intf, NULL, "maincpu", WRITELINE(oric_state, ext_irq_w))
MACHINE_CONFIG_END
static MACHINE_CONFIG_DERIVED( prav8d, oric )
- MCFG_LEGACY_FLOPPY_4_DRIVES_REMOVE()
- MCFG_LEGACY_FLOPPY_DRIVE_ADD(FLOPPY_0, prav8d_floppy_interface)
MACHINE_CONFIG_END
-static MACHINE_CONFIG_DERIVED( telstrat, oric )
- MCFG_CPU_MODIFY( "maincpu" )
- MCFG_CPU_PROGRAM_MAP( telestrat_mem)
+FLOPPY_FORMATS_MEMBER( telestrat_state::floppy_formats )
+ FLOPPY_ORIC_DSK_FORMAT
+FLOPPY_FORMATS_END
+
+static SLOT_INTERFACE_START( telestrat_floppies )
+ SLOT_INTERFACE( "3dsdd", FLOPPY_3_DSDD )
+SLOT_INTERFACE_END
- MCFG_MACHINE_START_OVERRIDE(oric_state, telestrat )
+static MACHINE_CONFIG_DERIVED_CLASS( telstrat, oric, telestrat_state )
+ MCFG_CPU_MODIFY( "maincpu" )
+ MCFG_CPU_PROGRAM_MAP(telestrat_mem)
/* acia */
MCFG_DEVICE_ADD("acia", MOS6551, 0)
MCFG_MOS6551_XTAL(XTAL_1_8432MHz)
- MCFG_MOS6551_IRQ_HANDLER(WRITELINE(oric_state, telestrat_acia_callback))
+ MCFG_MOS6551_IRQ_HANDLER(WRITELINE(telestrat_state, acia_irq_w))
/* via */
- MCFG_DEVICE_ADD( "via6522_1", VIA6522, 1000000 )
- MCFG_VIA6522_READPA_HANDLER(READ8(oric_state, telestrat_via2_in_a_func))
- MCFG_VIA6522_READPB_HANDLER(READ8(oric_state, telestrat_via2_in_b_func))
- MCFG_VIA6522_WRITEPA_HANDLER(WRITE8(oric_state, telestrat_via2_out_a_func))
- MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(oric_state, telestrat_via2_out_b_func))
- MCFG_VIA6522_IRQ_HANDLER(WRITELINE(oric_state, telestrat_via2_irq_func))
+ MCFG_DEVICE_ADD( "via6522_2", VIA6522, XTAL_12MHz/12 )
+ MCFG_VIA6522_WRITEPA_HANDLER(WRITE8(telestrat_state, via2_a_w))
+ MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(telestrat_state, via2_b_w))
+ MCFG_VIA6522_CA2_HANDLER(WRITELINE(telestrat_state, via2_ca2_w))
+ MCFG_VIA6522_CB2_HANDLER(WRITELINE(telestrat_state, via2_cb2_w))
+ MCFG_VIA6522_IRQ_HANDLER(WRITELINE(telestrat_state, via2_irq_w))
+
+ /* microdisc */
+ MCFG_FD1793x_ADD("fdc", XTAL_8MHz/8)
+ MCFG_WD_FDC_INTRQ_CALLBACK(WRITELINE(telestrat_state, fdc_irq_w))
+ MCFG_WD_FDC_DRQ_CALLBACK(WRITELINE(telestrat_state, fdc_drq_w))
+ MCFG_WD_FDC_HLD_CALLBACK(WRITELINE(telestrat_state, fdc_hld_w))
+ MCFG_WD_FDC_FORCE_READY
+
+ MCFG_FLOPPY_DRIVE_ADD("fdc:0", telestrat_floppies, "3dsdd", telestrat_state::floppy_formats)
+ MCFG_FLOPPY_DRIVE_ADD("fdc:1", telestrat_floppies, NULL, telestrat_state::floppy_formats)
+ MCFG_FLOPPY_DRIVE_ADD("fdc:2", telestrat_floppies, NULL, telestrat_state::floppy_formats)
+ MCFG_FLOPPY_DRIVE_ADD("fdc:3", telestrat_floppies, NULL, telestrat_state::floppy_formats)
MACHINE_CONFIG_END
ROM_START(oric1)
- ROM_REGION(0x16800, "maincpu", 0) /* 0x10000 + 0x04000 + 0x02000 + 0x00800 */
- ROM_LOAD ("basic10.rom", 0x10000, 0x04000, CRC(f18710b4) SHA1(333116e6884d85aaa4dfc7578a91cceeea66d016))
- ROM_LOAD_OPTIONAL ("microdis.rom", 0x14000, 0x02000, CRC(a9664a9c) SHA1(0d2ef6e67322f48f4b7e08d8bbe68827e2074561) )
- ROM_LOAD_OPTIONAL ("jasmin.rom", 0x16000, 0x00800, CRC(37220e89) SHA1(70e59b8abd67092f050462abc6cb5271e4c15f01) )
+ ROM_REGION(0x4000, "maincpu", 0)
+ ROM_LOAD ("basic10.rom", 0, 0x04000, CRC(f18710b4) SHA1(333116e6884d85aaa4dfc7578a91cceeea66d016))
ROM_END
ROM_START(orica)
- ROM_REGION(0x16800, "maincpu", 0) /* 0x10000 + 0x04000 + 0x02000 + 0x00800 */
+ ROM_REGION(0x4000, "maincpu", 0)
ROM_SYSTEM_BIOS( 0, "ver11", "Basic 1.1")
- ROMX_LOAD ("basic11b.rom", 0x10000, 0x04000, CRC(c3a92bef) SHA1(9451a1a09d8f75944dbd6f91193fc360f1de80ac), ROM_BIOS(1) )
+ ROMX_LOAD ("basic11b.rom", 0, 0x04000, CRC(c3a92bef) SHA1(9451a1a09d8f75944dbd6f91193fc360f1de80ac), ROM_BIOS(1) )
ROM_SYSTEM_BIOS( 1, "ver12", "Basic 1.2 (Pascal Leclerc)") // 1987/1999 - various enhancements and bugfixes
- ROMX_LOAD ("basic12.rom", 0x10000, 0x04000, CRC(dc4f22dc) SHA1(845e1a893de3dc0f856fdf2f69c3b73770b4094f), ROM_BIOS(2) )
+ ROMX_LOAD ("basic12.rom", 0, 0x04000, CRC(dc4f22dc) SHA1(845e1a893de3dc0f856fdf2f69c3b73770b4094f), ROM_BIOS(2) )
ROM_SYSTEM_BIOS( 2, "ver121", "Basic 1.21 (Pascal Leclerc)") // 07.1999 - DRAW enhancement
- ROMX_LOAD ("basic121.rom", 0x10000, 0x04000, CRC(0a2860b1) SHA1(b727d5c3bbc8cb1d510f224eb1e0d90d609e8506), ROM_BIOS(3) )
+ ROMX_LOAD ("basic121.rom", 0, 0x04000, CRC(0a2860b1) SHA1(b727d5c3bbc8cb1d510f224eb1e0d90d609e8506), ROM_BIOS(3) )
ROM_SYSTEM_BIOS( 3, "ver122", "Basic 1.22 (Pascal Leclerc)") // 08.2001 - added EUR symbol
- ROMX_LOAD ("basic122.rom", 0x10000, 0x04000, CRC(5ef2a861) SHA1(9ab6dc47b6e9dc65a4137ce0f0f12fc2b6ca8442), ROM_BIOS(4) )
+ ROMX_LOAD ("basic122.rom", 0, 0x04000, CRC(5ef2a861) SHA1(9ab6dc47b6e9dc65a4137ce0f0f12fc2b6ca8442), ROM_BIOS(4) )
ROM_SYSTEM_BIOS( 4, "ver11de", "Basic 1.1 DE")
- ROMX_LOAD( "bas11_de.rom", 0x10000, 0x04000, CRC(65233b2d) SHA1(b01cabb1a21980a6785a2fe37a8f8572c892123f), ROM_BIOS(5))
+ ROMX_LOAD( "bas11_de.rom", 0, 0x04000, CRC(65233b2d) SHA1(b01cabb1a21980a6785a2fe37a8f8572c892123f), ROM_BIOS(5))
ROM_SYSTEM_BIOS( 5, "ver11es", "Basic 1.1 ES")
- ROMX_LOAD( "bas11_es.rom", 0x10000, 0x04000, CRC(47bf26c7) SHA1(4fdbadd68db9ab8ad1cd56b4e5cbe51a9c3f11ae), ROM_BIOS(6))
+ ROMX_LOAD( "bas11_es.rom", 0, 0x04000, CRC(47bf26c7) SHA1(4fdbadd68db9ab8ad1cd56b4e5cbe51a9c3f11ae), ROM_BIOS(6))
ROM_SYSTEM_BIOS( 6, "ver11fr", "Basic 1.1 FR")
- ROMX_LOAD( "bas11_fr.rom", 0x10000, 0x04000, CRC(603b1fbf) SHA1(2a4583df3b59ca454d67d5631f242c96ec4cf99a), ROM_BIOS(7))
+ ROMX_LOAD( "bas11_fr.rom", 0, 0x04000, CRC(603b1fbf) SHA1(2a4583df3b59ca454d67d5631f242c96ec4cf99a), ROM_BIOS(7))
ROM_SYSTEM_BIOS( 7, "ver11se", "Basic 1.1 SE")
- ROMX_LOAD( "bas11_se.rom", 0x10000, 0x04000, CRC(a71523ac) SHA1(ce53acf84baec6ab5cbac9f9cefa71b3efeb2ead), ROM_BIOS(8))
+ ROMX_LOAD( "bas11_se.rom", 0, 0x04000, CRC(a71523ac) SHA1(ce53acf84baec6ab5cbac9f9cefa71b3efeb2ead), ROM_BIOS(8))
ROM_SYSTEM_BIOS( 8, "ver11uk", "Basic 1.1 UK")
- ROMX_LOAD( "bas11_uk.rom", 0x10000, 0x04000, CRC(303370d1) SHA1(589ff66fac8e06d65af3369491faa67a71f1322a), ROM_BIOS(9))
+ ROMX_LOAD( "bas11_uk.rom", 0, 0x04000, CRC(303370d1) SHA1(589ff66fac8e06d65af3369491faa67a71f1322a), ROM_BIOS(9))
ROM_SYSTEM_BIOS( 9, "ver12es", "Basic 1.2 ES")
- ROMX_LOAD( "bas12es_le.rom", 0x10000, 0x04000, CRC(70de4aeb) SHA1(b327418aa7d8a5a03c135e3d8acdd511df625893), ROM_BIOS(10))
+ ROMX_LOAD( "bas12es_le.rom", 0, 0x04000, CRC(70de4aeb) SHA1(b327418aa7d8a5a03c135e3d8acdd511df625893), ROM_BIOS(10))
ROM_SYSTEM_BIOS( 10, "ver12fr", "Basic 1.2 FR")
- ROMX_LOAD( "bas12fr_le.rom", 0x10000, 0x04000, CRC(47a437fc) SHA1(70271bc3ed5c3bf4d339d6f5de3de8c3c50ff573), ROM_BIOS(11))
+ ROMX_LOAD( "bas12fr_le.rom", 0, 0x04000, CRC(47a437fc) SHA1(70271bc3ed5c3bf4d339d6f5de3de8c3c50ff573), ROM_BIOS(11))
ROM_SYSTEM_BIOS( 11, "ver12ge", "Basic 1.2 GE")
- ROMX_LOAD( "bas12ge_le.rom", 0x10000, 0x04000, CRC(f5f0dd52) SHA1(75359302452ee7b19537698f124aaefd333688d0), ROM_BIOS(12))
+ ROMX_LOAD( "bas12ge_le.rom", 0, 0x04000, CRC(f5f0dd52) SHA1(75359302452ee7b19537698f124aaefd333688d0), ROM_BIOS(12))
ROM_SYSTEM_BIOS( 12, "ver12sw", "Basic 1.2 SW")
- ROMX_LOAD( "bas12sw_le.rom", 0x10000, 0x04000, CRC(100abe68) SHA1(6211d5969c4d7a6acb86ed19c5e51a33a3bef431), ROM_BIOS(13))
+ ROMX_LOAD( "bas12sw_le.rom", 0, 0x04000, CRC(100abe68) SHA1(6211d5969c4d7a6acb86ed19c5e51a33a3bef431), ROM_BIOS(13))
ROM_SYSTEM_BIOS( 13, "ver12uk", "Basic 1.2 UK")
- ROMX_LOAD( "bas12uk_le.rom", 0x10000, 0x04000, CRC(00fce8a6) SHA1(d40558bdf61b8aba6260293c9424fd463be7fad8), ROM_BIOS(14))
+ ROMX_LOAD( "bas12uk_le.rom", 0, 0x04000, CRC(00fce8a6) SHA1(d40558bdf61b8aba6260293c9424fd463be7fad8), ROM_BIOS(14))
ROM_SYSTEM_BIOS( 14, "ver121es", "Basic 1.211 ES")
- ROMX_LOAD( "bas121es_le.rom", 0x10000, 0x04000, CRC(87ec679b) SHA1(5de6a5f5121f69069c9b93d678046e814b5b64e9), ROM_BIOS(15))
+ ROMX_LOAD( "bas121es_le.rom", 0, 0x04000, CRC(87ec679b) SHA1(5de6a5f5121f69069c9b93d678046e814b5b64e9), ROM_BIOS(15))
ROM_SYSTEM_BIOS( 15, "ver121fr", "Basic 1.211 FR")
- ROMX_LOAD( "bas121fr_le.rom", 0x10000, 0x04000, CRC(e683dec2) SHA1(20df7ebc0f13aa835f286d50137f1a7ff7430c29), ROM_BIOS(16))
+ ROMX_LOAD( "bas121fr_le.rom", 0, 0x04000, CRC(e683dec2) SHA1(20df7ebc0f13aa835f286d50137f1a7ff7430c29), ROM_BIOS(16))
ROM_SYSTEM_BIOS( 16, "ver121ge", "Basic 1.211 GE")
- ROMX_LOAD( "bas121ge_le.rom", 0x10000, 0x04000, CRC(94fe32bf) SHA1(1024776d20030d602e432e50014502524658643a), ROM_BIOS(17))
+ ROMX_LOAD( "bas121ge_le.rom", 0, 0x04000, CRC(94fe32bf) SHA1(1024776d20030d602e432e50014502524658643a), ROM_BIOS(17))
ROM_SYSTEM_BIOS( 17, "ver121sw", "Basic 1.211 SW")
- ROMX_LOAD( "bas121sw_le.rom", 0x10000, 0x04000, CRC(e6ad11c7) SHA1(309c94a9861fcb770636dcde1801a5c68ca819b4), ROM_BIOS(18))
+ ROMX_LOAD( "bas121sw_le.rom", 0, 0x04000, CRC(e6ad11c7) SHA1(309c94a9861fcb770636dcde1801a5c68ca819b4), ROM_BIOS(18))
ROM_SYSTEM_BIOS( 18, "ver121uk", "Basic 1.211 UK")
- ROMX_LOAD( "bas121uk_le.rom", 0x10000, 0x04000, CRC(75aa1aa9) SHA1(ca99e244d9cbef625344c2054023504a4f9dcfe4), ROM_BIOS(19))
+ ROMX_LOAD( "bas121uk_le.rom", 0, 0x04000, CRC(75aa1aa9) SHA1(ca99e244d9cbef625344c2054023504a4f9dcfe4), ROM_BIOS(19))
ROM_SYSTEM_BIOS( 19, "ver122es", "Basic 1.22 ES")
- ROMX_LOAD( "bas122es_le.rom", 0x10000, 0x04000, CRC(9144f9e0) SHA1(acf2094078af057e74a31d90d7010be51b9033fa), ROM_BIOS(20))
+ ROMX_LOAD( "bas122es_le.rom", 0, 0x04000, CRC(9144f9e0) SHA1(acf2094078af057e74a31d90d7010be51b9033fa), ROM_BIOS(20))
ROM_SYSTEM_BIOS( 20, "ver122fr", "Basic 1.22 FR")
- ROMX_LOAD( "bas122fr_le.rom", 0x10000, 0x04000, CRC(370cfda4) SHA1(fad9a0661256e59bcc2915578647573e4128e1bb), ROM_BIOS(21))
+ ROMX_LOAD( "bas122fr_le.rom", 0, 0x04000, CRC(370cfda4) SHA1(fad9a0661256e59bcc2915578647573e4128e1bb), ROM_BIOS(21))
ROM_SYSTEM_BIOS( 21, "ver122ge", "Basic 1.22 GE")
- ROMX_LOAD( "bas122ge_le.rom", 0x10000, 0x04000, CRC(9a42bd62) SHA1(8a9c80f314daf4e5e64fa202e583b8a65796db8b), ROM_BIOS(22))
+ ROMX_LOAD( "bas122ge_le.rom", 0, 0x04000, CRC(9a42bd62) SHA1(8a9c80f314daf4e5e64fa202e583b8a65796db8b), ROM_BIOS(22))
ROM_SYSTEM_BIOS( 22, "ver122sw", "Basic 1.22 SW")
- ROMX_LOAD( "bas122sw_le.rom", 0x10000, 0x04000, CRC(e7fd57a4) SHA1(c75cbf7cfafaa02712dc7ca2f972220aef86fb8d), ROM_BIOS(23))
+ ROMX_LOAD( "bas122sw_le.rom", 0, 0x04000, CRC(e7fd57a4) SHA1(c75cbf7cfafaa02712dc7ca2f972220aef86fb8d), ROM_BIOS(23))
ROM_SYSTEM_BIOS( 23, "ver122uk", "Basic 1.22 UK")
- ROMX_LOAD( "bas122uk_le.rom", 0x10000, 0x04000, CRC(9865bcd7) SHA1(2a92e2d119463e682bf10647e3880e26656d65b5), ROM_BIOS(24))
-
- ROM_LOAD_OPTIONAL ("microdis.rom", 0x14000, 0x02000, CRC(a9664a9c) SHA1(0d2ef6e67322f48f4b7e08d8bbe68827e2074561) )
- ROM_LOAD_OPTIONAL ("jasmin.rom", 0x16000, 0x00800, CRC(37220e89) SHA1(70e59b8abd67092f050462abc6cb5271e4c15f01) )
+ ROMX_LOAD( "bas122uk_le.rom", 0, 0x04000, CRC(9865bcd7) SHA1(2a92e2d119463e682bf10647e3880e26656d65b5), ROM_BIOS(24))
ROM_END
ROM_START(telstrat)
- ROM_REGION(0x30000, "maincpu", 0) /* 0x10000 + (0x04000 * 4) */
- ROM_LOAD ("telmatic.rom", 0x010000, 0x02000, CRC(94358dc6) SHA1(35f92a0477a88f5cf564971125047ffcfa02ec10) )
- ROM_LOAD ("teleass.rom", 0x014000, 0x04000, CRC(68b0fde6) SHA1(9e9af51dae3199cccf49ab3f0d47e2b9be4ba97d) )
- ROM_LOAD ("hyperbas.rom", 0x018000, 0x04000, CRC(1d96ab50) SHA1(f5f70a0eb59f8cd6c261e179ae78ef906f68ed63) )
- ROM_LOAD ("telmon24.rom", 0x01c000, 0x04000, CRC(aa727c5d) SHA1(86fc8dc0932f983efa199e31ae05a4424772f959) )
+ ROM_REGION(0x4000, "telmatic", 0)
+ ROM_LOAD ("telmatic.rom", 0, 0x2000, CRC(94358dc6) SHA1(35f92a0477a88f5cf564971125047ffcfa02ec10) )
+ ROM_RELOAD (0x2000, 0x2000)
+
+ ROM_REGION(0x4000, "teleass", 0)
+ ROM_LOAD ("teleass.rom", 0, 0x4000, CRC(68b0fde6) SHA1(9e9af51dae3199cccf49ab3f0d47e2b9be4ba97d) )
+
+ ROM_REGION(0x4000, "hyperbas", 0)
+ ROM_LOAD ("hyperbas.rom", 0, 0x4000, CRC(1d96ab50) SHA1(f5f70a0eb59f8cd6c261e179ae78ef906f68ed63) )
+
+ ROM_REGION(0x4000, "telmon24", 0)
+ ROM_LOAD ("telmon24.rom", 0, 0x4000, CRC(aa727c5d) SHA1(86fc8dc0932f983efa199e31ae05a4424772f959) )
ROM_END
ROM_START(prav8d)
- ROM_REGION(0x14300, "maincpu", 0) /* 0x10000 + 0x04000 + 0x00100 + 0x00200 */
- ROM_LOAD( "pravetzt.rom", 0x10000, 0x4000, CRC(58079502) SHA1(7afc276cb118adff72e4f16698f94bf3b2c64146) )
- ROM_LOAD_OPTIONAL( "8ddoslo.rom", 0x014000, 0x0100, CRC(0c82f636) SHA1(b29d151a0dfa3c7cd50439b51d0a8f95559bc2b6) )
- ROM_LOAD_OPTIONAL( "8ddoshi.rom", 0x014100, 0x0200, CRC(66309641) SHA1(9c2e82b3c4d385ade6215fcb89f8b92e6fd2bf4b) )
+ ROM_REGION(0x4000, "maincpu", 0) /* 0x10000 + 0x04000 + 0x00100 + 0x00200 */
+ ROM_LOAD( "pravetzt.rom", 0, 0x4000, CRC(58079502) SHA1(7afc276cb118adff72e4f16698f94bf3b2c64146) )
+// ROM_LOAD_OPTIONAL( "8ddoslo.rom", 0x014000, 0x0100, CRC(0c82f636) SHA1(b29d151a0dfa3c7cd50439b51d0a8f95559bc2b6) )
+// ROM_LOAD_OPTIONAL( "8ddoshi.rom", 0x014100, 0x0200, CRC(66309641) SHA1(9c2e82b3c4d385ade6215fcb89f8b92e6fd2bf4b) )
ROM_END
ROM_START(prav8dd)
- ROM_REGION(0x14300, "maincpu", 0) /* 0x10000 + 0x04000 + 0x00100 + 0x00200 */
+ ROM_REGION(0x4000, "maincpu", 0) /* 0x10000 + 0x04000 + 0x00100 + 0x00200 */
ROM_SYSTEM_BIOS( 0, "default", "Disk ROM, 1989")
- ROMX_LOAD( "8d.rom", 0x10000, 0x4000, CRC(b48973ef) SHA1(fd47c977fc215a3b577596a7483df53e8a1e9c83), ROM_BIOS(1) )
+ ROMX_LOAD( "8d.rom", 0, 0x4000, CRC(b48973ef) SHA1(fd47c977fc215a3b577596a7483df53e8a1e9c83), ROM_BIOS(1) )
ROM_SYSTEM_BIOS( 1, "radosoft", "RadoSoft Disk ROM, 1992")
- ROMX_LOAD( "pravetzd.rom", 0x10000, 0x4000, CRC(f8d23821) SHA1(f87ad3c5832773b6e0614905552a80c98dc8e2a5), ROM_BIOS(2) )
- ROM_LOAD_OPTIONAL( "8ddoslo.rom", 0x014000, 0x0100, CRC(0c82f636) SHA1(b29d151a0dfa3c7cd50439b51d0a8f95559bc2b6) )
- ROM_LOAD_OPTIONAL( "8ddoshi.rom", 0x014100, 0x0200, CRC(66309641) SHA1(9c2e82b3c4d385ade6215fcb89f8b92e6fd2bf4b) )
+ ROMX_LOAD( "pravetzd.rom", 0, 0x4000, CRC(f8d23821) SHA1(f87ad3c5832773b6e0614905552a80c98dc8e2a5), ROM_BIOS(2) )
+// ROM_LOAD_OPTIONAL( "8ddoslo.rom", 0x014000, 0x0100, CRC(0c82f636) SHA1(b29d151a0dfa3c7cd50439b51d0a8f95559bc2b6) )
+// ROM_LOAD_OPTIONAL( "8ddoshi.rom", 0x014100, 0x0200, CRC(66309641) SHA1(9c2e82b3c4d385ade6215fcb89f8b92e6fd2bf4b) )
ROM_END
@@ -537,4 +968,4 @@ COMP( 1983, oric1, 0, 0, oric, oric, driver_device, 0
COMP( 1984, orica, oric1, 0, oric, orica, driver_device, 0, "Tangerine", "Oric Atmos" , 0)
COMP( 1985, prav8d, oric1, 0, prav8d, prav8d, driver_device, 0, "Pravetz", "Pravetz 8D", 0)
COMP( 1989, prav8dd, oric1, 0, prav8d, prav8d, driver_device, 0, "Pravetz", "Pravetz 8D (Disk ROM)", GAME_UNOFFICIAL)
-COMP( 1986, telstrat, oric1, 0, telstrat, telstrat, driver_device, 0, "Tangerine", "Oric Telestrat", GAME_NOT_WORKING )
+COMP( 1986, telstrat, oric1, 0, telstrat, telstrat, driver_device, 0, "Tangerine", "Oric Telestrat", 0 )
diff --git a/src/mess/includes/oric.h b/src/mess/includes/oric.h
deleted file mode 100644
index 97cfa666818..00000000000
--- a/src/mess/includes/oric.h
+++ /dev/null
@@ -1,204 +0,0 @@
-/*****************************************************************************
- *
- * includes/oric.h
- *
- ****************************************************************************/
-
-#ifndef ORIC_H_
-#define ORIC_H_
-
-#include "emu.h"
-#include "cpu/m6502/m6502.h"
-#include "sound/ay8910.h"
-#include "sound/wave.h"
-#include "machine/6522via.h"
-#include "machine/mos6551.h"
-#include "machine/buffer.h"
-#include "bus/centronics/ctronics.h"
-#include "machine/wd17xx.h"
-//#include <stdio.h>
-#include "machine/applefdc.h"
-#include "imagedev/flopdrv.h"
-#include "imagedev/cassette.h"
-#include "formats/oric_dsk.h"
-#include "formats/ap2_dsk.h"
-#include "formats/oric_tap.h"
-
-enum
-{
- TELESTRAT_MEM_BLOCK_UNDEFINED,
- TELESTRAT_MEM_BLOCK_RAM,
- TELESTRAT_MEM_BLOCK_ROM
-};
-
-struct telestrat_mem_block
-{
- int MemType;
- unsigned char *ptr;
-};
-
-
-/* current state of the display */
-/* some attributes persist until they are turned off.
-This structure holds this persistant information */
-struct oric_vh_state
-{
- /* foreground and background colour used for rendering */
- /* if flash attribute is set, these two will both be equal to background colour */
- UINT8 active_foreground_colour;
- UINT8 active_background_colour;
- /* current foreground and background colour */
- UINT8 foreground_colour;
- UINT8 background_colour;
- UINT8 mode;
- /* text attributes */
- UINT8 text_attributes;
-
- offs_t read_addr;
-
- /* current addr to fetch data */
- UINT8 *char_data;
- /* base of char data */
- UINT8 *char_base;
-
- /* if (1<<3), display graphics, if 0, hide graphics */
- /* current count */
- UINT8 flash_count;
-};
-
-
-class oric_state : public driver_device
-{
-public:
- oric_state(const machine_config &mconfig, device_type type, const char *tag)
- : driver_device(mconfig, type, tag),
- m_ram(*this, "ram"),
- m_maincpu(*this, "maincpu"),
- m_ay8912(*this, "ay8912"),
- m_centronics(*this, "centronics"),
- m_cent_data_out(*this, "cent_data_out"),
- m_cassette(*this, "cassette"),
- m_via6522_0(*this, "via6522_0"),
- m_region_maincpu(*this, "maincpu"),
- m_bank1(*this, "bank1"),
- m_bank2(*this, "bank2"),
- m_bank3(*this, "bank3"),
- m_bank4(NULL),
- m_bank5(*this, "bank5"),
- m_bank6(*this, "bank6"),
- m_bank7(*this, "bank7"),
- m_io_row0(*this, "ROW0"),
- m_io_row1(*this, "ROW1"),
- m_io_row2(*this, "ROW2"),
- m_io_row3(*this, "ROW3"),
- m_io_row4(*this, "ROW4"),
- m_io_row5(*this, "ROW5"),
- m_io_row6(*this, "ROW6"),
- m_io_row7(*this, "ROW7"),
- m_io_floppy(*this, "FLOPPY") { }
-
- optional_shared_ptr<UINT8> m_ram;
- bool m_is_telestrat;
- UINT8 m_irqs;
- UINT8 *m_ram_0x0c000;
- UINT8 m_keyboard_line;
- UINT8 m_key_sense_bit;
- UINT8 m_keyboard_mask;
- UINT8 m_via_port_a_data;
- UINT8 m_psg_control;
- UINT8 m_previous_portb_data;
- UINT8 m_port_3fa_w;
- UINT8 m_port_3fb_w;
- UINT8 m_wd179x_int_state;
- UINT8 m_port_314_r;
- UINT8 m_port_318_r;
- UINT8 m_port_314_w;
- UINT8 m_telestrat_bank_selection;
- UINT8 m_telestrat_via2_port_a_data;
- UINT8 m_telestrat_via2_port_b_data;
- telestrat_mem_block m_telestrat_blocks[8];
- oric_vh_state m_vh_state;
- DECLARE_WRITE8_MEMBER(oric_psg_porta_write);
- DECLARE_WRITE8_MEMBER(apple2_v2_interface_w);
- DECLARE_READ8_MEMBER(oric_jasmin_r);
- DECLARE_WRITE8_MEMBER(oric_jasmin_w);
- DECLARE_READ8_MEMBER(oric_microdisc_r);
- DECLARE_WRITE8_MEMBER(oric_microdisc_w);
- DECLARE_READ8_MEMBER(oric_IO_r);
- DECLARE_WRITE8_MEMBER(oric_IO_w);
- virtual void machine_start();
- virtual void machine_reset();
- virtual void video_start();
- DECLARE_PALETTE_INIT(oric);
- DECLARE_MACHINE_START(telestrat);
- UINT32 screen_update_oric(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
- TIMER_CALLBACK_MEMBER(oric_refresh_tape);
- TIMER_CALLBACK_MEMBER(oric_vh_timer_callback);
- DECLARE_READ8_MEMBER(oric_via_in_a_func);
- DECLARE_READ8_MEMBER(oric_via_in_b_func);
- DECLARE_WRITE8_MEMBER(oric_via_out_a_func);
- DECLARE_WRITE8_MEMBER(oric_via_out_b_func);
- DECLARE_WRITE_LINE_MEMBER(oric_via_out_ca2_func);
- DECLARE_WRITE_LINE_MEMBER(oric_via_out_cb2_func);
- DECLARE_WRITE_LINE_MEMBER(oric_jasmin_wd179x_drq_w);
- DECLARE_WRITE_LINE_MEMBER(oric_microdisc_wd179x_intrq_w);
- DECLARE_WRITE_LINE_MEMBER(oric_microdisc_wd179x_drq_w);
- DECLARE_WRITE_LINE_MEMBER(oric_wd179x_intrq_w);
- DECLARE_WRITE_LINE_MEMBER(oric_wd179x_drq_w);
- DECLARE_WRITE_LINE_MEMBER(oric_via_irq_func);
- DECLARE_READ8_MEMBER(telestrat_via2_in_a_func);
- DECLARE_WRITE8_MEMBER(telestrat_via2_out_a_func);
- DECLARE_READ8_MEMBER(telestrat_via2_in_b_func);
- DECLARE_WRITE8_MEMBER(telestrat_via2_out_b_func);
- DECLARE_WRITE_LINE_MEMBER(telestrat_via2_irq_func);
- DECLARE_WRITE_LINE_MEMBER(telestrat_acia_callback);
-
-protected:
- required_device<cpu_device> m_maincpu;
- required_device<ay8910_device> m_ay8912;
- required_device<centronics_device> m_centronics;
- required_device<output_latch_device> m_cent_data_out;
- required_device<cassette_image_device> m_cassette;
- required_device<via6522_device> m_via6522_0;
- required_memory_region m_region_maincpu;
- required_memory_bank m_bank1;
- required_memory_bank m_bank2;
- optional_memory_bank m_bank3;
- memory_bank *m_bank4;
- optional_memory_bank m_bank5;
- optional_memory_bank m_bank6;
- optional_memory_bank m_bank7;
- required_ioport m_io_row0;
- required_ioport m_io_row1;
- required_ioport m_io_row2;
- required_ioport m_io_row3;
- required_ioport m_io_row4;
- required_ioport m_io_row5;
- required_ioport m_io_row6;
- required_ioport m_io_row7;
- required_ioport m_io_floppy;
-
- void oric_microdisc_refresh_wd179x_ints();
- void oric_refresh_ints();
- void oric_keyboard_sense_refresh();
- void oric_psg_connection_refresh(address_space &space);
- void oric_common_init_machine();
- void oric_install_apple2_interface();
- void oric_install_apple2_v2_interface();
- void oric_install_microdisc_interface();
- void oric_install_jasmin_interface();
- void oric_microdisc_set_mem_0x0c000();
- void telestrat_refresh_mem();
- void oric_enable_memory(int low, int high, int rd, int wr);
- void oric_jasmin_set_mem_0x0c000();
-
- void oric_vh_update_attribute(UINT8 c);
- void oric_vh_update_flash();
- void oric_refresh_charset();
- void oric_vh_render_6pixels(bitmap_ind16 &bitmap, int x, UINT8 y, UINT8 fg, UINT8 bg, UINT8 data, bool invert_flag);
-};
-
-/*----------- defined in machine/oric.c -----------*/
-extern const wd17xx_interface oric_wd17xx_interface;
-
-#endif /* ORIC_H_ */
diff --git a/src/mess/machine/oric.c b/src/mess/machine/oric.c
deleted file mode 100644
index 9930f2a351d..00000000000
--- a/src/mess/machine/oric.c
+++ /dev/null
@@ -1,1357 +0,0 @@
-/*********************************************************************
-
- machine/oric.c
-
- Paul Cook
- Kev Thacker
-
- Thankyou to Fabrice Frances for his ORIC documentation which helped with this driver
- http://oric.ifrance.com/oric/
-
- TODO:
- - there are problems loading some .wav's. Try to fix these.
- - fix more graphics display problems
- - check the printer works
- - fix more disc drive/wd179x problems so more software will run
-
-*********************************************************************/
-
-
-#include "includes/oric.h"
-
-
-
-
-/* ==0 if oric1 or oric atmos, !=0 if telestrat */
-
-/* This does not exist in the real hardware. I have used it to
-know which sources are interrupting */
-/* bit 2 = telestrat 2nd via interrupt,
-1 = microdisc interface,
-0 = oric 1st via interrupt */
-
-enum
-{
- ORIC_FLOPPY_NONE,
- ORIC_FLOPPY_MFM_DISK,
- ORIC_FLOPPY_BASIC_DISK
-};
-
-/* type of disc interface connected to oric/oric atmos */
-/* telestrat always has a microdisc interface */
-enum
-{
- ORIC_FLOPPY_INTERFACE_NONE = 0,
- ORIC_FLOPPY_INTERFACE_MICRODISC = 1,
- ORIC_FLOPPY_INTERFACE_JASMIN = 2,
- ORIC_FLOPPY_INTERFACE_APPLE2 = 3,
- ORIC_FLOPPY_INTERFACE_APPLE2_V2 = 4
-};
-
-/* called when ints are changed - cleared/set */
-void oric_state::oric_refresh_ints()
-{
- /* telestrat has floppy hardware built-in! */
- if (m_is_telestrat==0)
- {
- /* oric 1 or oric atmos */
-
- /* if floppy disc hardware is disabled, do not allow interrupts from it */
- if ((m_io_floppy->manager().safe_to_read()) && ((m_io_floppy->read() & 0x07) == ORIC_FLOPPY_INTERFACE_NONE))
- {
- m_irqs &=~(1<<1);
- }
- }
-
- /* any irq set? */
- if (m_irqs & 0x0f)
- {
- m_maincpu->set_input_line(0, HOLD_LINE);
- }
- else
- {
- m_maincpu->set_input_line(0, CLEAR_LINE);
- }
-}
-
-
-
-/* index of keyboard line to scan */
-/* sense result */
-/* mask to read keys */
-
-
-
-
-
-/* refresh keyboard sense */
-void oric_state::oric_keyboard_sense_refresh()
-{
- /* The following assumes that if a 0 is written, it can be used to detect if any key has been pressed.. */
- /* for each bit that is 0, it combines it's pressed state with the pressed state so far */
-
- int i;
- unsigned char key_bit = 0;
-
- /* what if data is 0, can it sense if any of the keys on a line are pressed? */
- int input_port_data = 0;
-
- switch ( m_keyboard_line )
- {
- case 0: input_port_data = m_io_row0->read(); break;
- case 1: input_port_data = m_io_row1->read(); break;
- case 2: input_port_data = m_io_row2->read(); break;
- case 3: input_port_data = m_io_row3->read(); break;
- case 4: input_port_data = m_io_row4->read(); break;
- case 5: input_port_data = m_io_row5->read(); break;
- case 6: input_port_data = m_io_row6->read(); break;
- case 7: input_port_data = m_io_row7->read(); break;
- }
-
- /* go through all bits in line */
- for (i=0; i<8; i++)
- {
- /* sense this bit? */
- if (((~m_keyboard_mask) & (1<<i)) != 0)
- {
- /* is key pressed? */
- if (input_port_data & (1<<i))
- {
- /* yes */
- key_bit |= 1;
- }
- }
- }
-
- /* clear sense result */
- m_key_sense_bit = 0;
-
- /* any keys pressed on this line? */
- if (key_bit!=0)
- {
- /* set sense result */
- m_key_sense_bit = (1<<3);
- }
-}
-
-
-/* this is executed when a write to psg port a is done */
-WRITE8_MEMBER(oric_state::oric_psg_porta_write)
-{
- m_keyboard_mask = data;
-}
-
-
-/* PSG control pins */
-/* bit 1 = BDIR state */
-/* bit 0 = BC1 state */
-
-/* this port is also used to read printer data */
-READ8_MEMBER(oric_state::oric_via_in_a_func)
-{
- /*logerror("port a read\r\n"); */
-
- /* access psg? */
- if (m_psg_control!=0)
- {
- /* if psg is in read register state return reg data */
- if (m_psg_control==0x01)
- {
- return m_ay8912->data_r(space, 0);
- }
-
- /* return high-impedance */
- return 0x0ff;
- }
-
- /* correct?? */
- return m_via_port_a_data;
-}
-
-READ8_MEMBER(oric_state::oric_via_in_b_func)
-{
- int data;
-
- oric_keyboard_sense_refresh();
-
- data = m_key_sense_bit;
- data |= m_keyboard_line & 0x07;
-
- return data;
-}
-
-
-/* read/write data depending on state of bdir, bc1 pins and data output to psg */
-void oric_state::oric_psg_connection_refresh(address_space &space)
-{
- if (m_psg_control!=0)
- {
- switch (m_psg_control)
- {
- /* PSG inactive */
- case 0:
- break;
-
- /* read register data */
- case 1:
- //m_via_port_a_data = ay8910_read_port_0_r(space, 0);
- break;
-
- /* write register data */
- case 2:
- m_ay8912->data_w(space, 0, m_via_port_a_data);
- break;
-
- /* write register index */
- case 3:
- m_ay8912->address_w(space, 0, m_via_port_a_data);
- break;
-
- default:
- break;
- }
-
- return;
- }
-}
-
-WRITE8_MEMBER(oric_state::oric_via_out_a_func)
-{
- m_via_port_a_data = data;
-
- oric_psg_connection_refresh(space);
-
- if (m_psg_control==0)
- {
- /* if psg not selected, write to printer */
- m_cent_data_out->write(space, 0, data);
- }
-}
-
-/*
-PB0..PB2
- keyboard lines-demultiplexer line 7
-
-PB3
- keyboard sense line 0
-
-PB4
- printer strobe line 1
-
-PB5
- (not connected) ?? 1
-
-PB6
- tape connector motor control 0
-
-PB7
- tape connector output high 1
-
- */
-
-
-/* not called yet - this will update the via with the state of the tape data.
-This allows the via to trigger on bit changes and issue interrupts */
-TIMER_CALLBACK_MEMBER(oric_state::oric_refresh_tape)
-{
- int data;
- int input_port_9;
-
- data = 0;
-
- if (m_cassette->input() > 0.0038)
- {
- data |= 1;
- }
-
- /* "A simple cable to catch the vertical retrace signal !
- This cable connects the video output for the television/monitor
- to the via cb1 input. Interrupts can be generated from the vertical
- sync, and flicker free games can be produced */
-
- input_port_9 = m_io_floppy->read();
- /* cable is enabled? */
- if ((input_port_9 & 0x08)!=0)
- {
- /* return state of vsync */
- data = input_port_9>>4;
- }
-
- m_via6522_0->write_cb1(data);
-}
-
-WRITE8_MEMBER(oric_state::oric_via_out_b_func)
-{
- /* KEYBOARD */
- m_keyboard_line = data & 0x07;
-
- /* CASSETTE */
- /* cassette motor control */
- m_cassette->change_state(
- (data & 0x40) ? CASSETTE_MOTOR_ENABLED : CASSETTE_MOTOR_DISABLED,
- CASSETTE_MOTOR_DISABLED);
-
- /* cassette data out */
- m_cassette->output((data & (1<<7)) ? -1.0 : +1.0);
-
- /* centronics STROBE is connected to PB4 */
- m_centronics->write_strobe(BIT(data, 4));
-
- oric_psg_connection_refresh(space);
- m_previous_portb_data = data;
-}
-
-
-WRITE_LINE_MEMBER(oric_state::oric_via_out_ca2_func)
-{
- if (state)
- m_psg_control |=1;
- else
- m_psg_control &=~1;
-
- oric_psg_connection_refresh(generic_space());
-}
-
-WRITE_LINE_MEMBER(oric_state::oric_via_out_cb2_func)
-{
- if (state)
- m_psg_control |=2;
- else
- m_psg_control &=~2;
-
- oric_psg_connection_refresh(generic_space());
-}
-
-
-WRITE_LINE_MEMBER(oric_state::oric_via_irq_func)
-{
- m_irqs &= ~(1<<0);
-
- if (state)
- {
- m_irqs |=(1<<0);
- }
-
- oric_refresh_ints();
-}
-
-
-/*
-VIA Lines
- Oric usage
-
-PA0..PA7
- PSG data bus, printer data lines
-
-CA1
- printer acknowledge line
-
-CA2
- PSG BC1 line
-
-PB0..PB2
- keyboard lines-demultiplexer
-
-PB3
- keyboard sense line
-
-PB4
- printer strobe line
-
-PB5
- (not connected)
-
-PB6
- tape connector motor control
-
-PB7
- tape connector output
-
-CB1
- tape connector input
-
-CB2
- PSG BDIR line
-
-*/
-
-
-
-
-/*********************/
-/* APPLE 2 INTERFACE */
-
-/*
-apple2 disc drive accessed through 0x0310-0x031f (read/write)
-oric via accessed through 0x0300-0x030f. (read/write)
-disk interface rom accessed through 0x0320-0x03ff (read only)
-
-CALL &320 to start, or use BOBY rom.
-*/
-
-void oric_state::oric_install_apple2_interface()
-{
- applefdc_base_device *fdc = machine().device<applefdc_base_device>("fdc");
- address_space &space = m_maincpu->space(AS_PROGRAM);
-
- if (m_is_telestrat)
- {
- return;
- }
-
- space.install_read_handler(0x0300, 0x030f, read8_delegate(FUNC(oric_state::oric_IO_r), this));
- space.install_read_handler(0x0310, 0x031f, read8_delegate(FUNC(applefdc_base_device::read), fdc));
- space.install_read_bank(0x0320, 0x03ff, "bank4");
- m_bank4 = membank("bank4");
-
- space.install_write_handler(0x0300, 0x030f, write8_delegate(FUNC(oric_state::oric_IO_w), this));
- space.install_write_handler(0x0310, 0x031f, write8_delegate(FUNC(applefdc_base_device::write), fdc));
- m_bank4->set_base( m_region_maincpu->base() + 0x014000 + 0x020);
-}
-
-
-void oric_state::oric_enable_memory(int low, int high, int rd, int wr)
-{
- int i;
- address_space &space = m_maincpu->space(AS_PROGRAM);
-
- if (m_is_telestrat)
- {
- return;
- }
-
- for (i = low; i <= high; i++)
- {
- switch(i) {
- case 1:
- if (rd) {
- space.install_read_bank(0xc000, 0xdfff, "bank1");
- } else {
- space.nop_read(0xc000, 0xdfff);
- }
- if (wr) {
- space.install_write_bank(0xc000, 0xdfff, "bank5");
- } else {
- space.unmap_write(0xc000, 0xdfff);
- }
- break;
- case 2:
- if (rd) {
- space.install_read_bank(0xe000, 0xf7ff, "bank2");
- } else {
- space.nop_read(0xe000, 0xf7ff);
- }
- if (wr) {
- space.install_write_bank(0xe000, 0xf7ff, "bank6");
- } else {
- space.unmap_write(0xe000, 0xf7ff);
- }
- break;
- case 3:
- if (rd) {
- space.install_read_bank(0xf800, 0xffff, "bank3");
- } else {
- space.nop_read(0xf800, 0xffff);
- }
- break;
- }
- }
-}
-
-
-
-/************************/
-/* APPLE 2 INTERFACE V2 */
-
-/*
-apple2 disc drive accessed through 0x0310-0x031f (read/write)
-oric via accessed through 0x0300-0x030f. (read/write)
-disk interface rom accessed through 0x0320-0x03ff (read only)
-v2 registers accessed through 0x0380-0x0383 (write only)
-
-CALL &320 to start, or use BOBY rom.
-*/
-
-WRITE8_MEMBER(oric_state::apple2_v2_interface_w)
-{
- /* data is ignored, address is used to decode operation */
- if (m_is_telestrat)
- return;
-
-/* logerror("apple 2 interface v2 rom page: %01x\n",(offset & 0x02)>>1); */
-
- /* bit 0 is 0 for page 0, 1 for page 1 */
- m_bank4->set_base(m_region_maincpu->base() + 0x014000 + 0x0100 + (((offset & 0x02)>>1)<<8));
-
- oric_enable_memory(1, 3, TRUE, TRUE);
-
- /* bit 1 is 0, rom enabled, bit 1 is 1 ram enabled */
- if ((offset & 0x01)==0)
- {
- unsigned char *rom_ptr;
-
- /* logerror("apple 2 interface v2: rom enabled\n"); */
-
- /* enable rom */
- rom_ptr = m_region_maincpu->base() + 0x010000;
- m_bank1->set_base(rom_ptr);
- m_bank2->set_base(rom_ptr+0x02000);
- m_bank3->set_base(rom_ptr+0x03800);
- m_bank5->set_base(m_ram_0x0c000);
- m_bank6->set_base(m_ram_0x0c000+0x02000);
- m_bank7->set_base(m_ram_0x0c000+0x03800);
- }
- else
- {
- /*logerror("apple 2 interface v2: ram enabled\n"); */
-
- /* enable ram */
- m_bank1->set_base(m_ram_0x0c000);
- m_bank2->set_base(m_ram_0x0c000+0x02000);
- m_bank3->set_base(m_ram_0x0c000+0x03800);
- m_bank5->set_base(m_ram_0x0c000);
- m_bank6->set_base(m_ram_0x0c000+0x02000);
- m_bank7->set_base(m_ram_0x0c000+0x03800);
- }
-}
-
-
-/* APPLE 2 INTERFACE V2 */
-void oric_state::oric_install_apple2_v2_interface()
-{
- applefdc_base_device *fdc = machine().device<applefdc_base_device>("fdc");
- address_space &space = m_maincpu->space(AS_PROGRAM);
-
- space.install_read_handler(0x0300, 0x030f, read8_delegate(FUNC(oric_state::oric_IO_r), this));
- space.install_read_handler(0x0310, 0x031f, read8_delegate(FUNC(applefdc_base_device::read), fdc));
- space.install_read_bank(0x0320, 0x03ff, "bank4");
- m_bank4 = membank("bank4");
-
- space.install_write_handler(0x0300, 0x030f, write8_delegate(FUNC(oric_state::oric_IO_w), this));
- space.install_write_handler(0x0310, 0x031f, write8_delegate(FUNC(applefdc_base_device::write), fdc));
- space.install_write_handler(0x0380, 0x0383, write8_delegate(FUNC(oric_state::apple2_v2_interface_w),this));
-
- apple2_v2_interface_w(space, 0, 0);
-}
-
-/********************/
-/* JASMIN INTERFACE */
-
-
-/* bit 0: overlay ram access (1 means overlay ram enabled) */
-
-/* bit 0: ROMDIS (1 means internal Basic rom disabled) */
-
-
-void oric_state::oric_jasmin_set_mem_0x0c000()
-{
- /* assumption:
- 1. It is possible to access all 16k overlay ram.
- 2. If os is enabled, and overlay ram is enabled, all 16k can be accessed.
- 3. if os is disabled, and overlay ram is enabled, jasmin rom takes priority.
- */
- if (m_is_telestrat)
- {
- return;
- }
-
- /* the ram is disabled in the jasmin rom which indicates that jasmin takes
- priority over the ram */
-
- /* basic rom disabled? */
- if ((m_port_3fb_w & 0x01)==0)
- {
- /* no, it is enabled! */
-
- /* overlay ram enabled? */
- if ((m_port_3fa_w & 0x01)==0)
- {
- unsigned char *rom_ptr;
-
- /* no it is disabled */
- /*logerror("&c000-&ffff is os rom\n"); */
-
- oric_enable_memory(1, 3, TRUE, FALSE);
-
- rom_ptr = m_region_maincpu->base() + 0x010000;
- m_bank1->set_base(rom_ptr);
- m_bank2->set_base(rom_ptr+0x02000);
- m_bank3->set_base(rom_ptr+0x03800);
- }
- else
- {
- /*logerror("&c000-&ffff is ram\n"); */
-
- oric_enable_memory(1, 3, TRUE, TRUE);
-
- m_bank1->set_base(m_ram_0x0c000);
- m_bank2->set_base(m_ram_0x0c000+0x02000);
- m_bank3->set_base(m_ram_0x0c000+0x03800);
- m_bank5->set_base(m_ram_0x0c000);
- m_bank6->set_base(m_ram_0x0c000+0x02000);
- m_bank7->set_base(m_ram_0x0c000+0x03800);
- }
- }
- else
- {
- /* yes, basic rom is disabled */
-
- if ((m_port_3fa_w & 0x01)==0)
- {
- /* overlay ram disabled */
-
- /*logerror("&c000-&f8ff is nothing!\n"); */
- oric_enable_memory(1, 2, FALSE, FALSE);
- }
- else
- {
- /*logerror("&c000-&f8ff is ram!\n"); */
- oric_enable_memory(1, 2, TRUE, TRUE);
-
- m_bank1->set_base(m_ram_0x0c000);
- m_bank2->set_base(m_ram_0x0c000+0x02000);
- m_bank5->set_base(m_ram_0x0c000);
- m_bank6->set_base(m_ram_0x0c000+0x02000);
- }
-
- {
- /* basic rom disabled */
- unsigned char *rom_ptr;
-
- /*logerror("&f800-&ffff is jasmin rom\n"); */
- /* jasmin rom enabled */
- oric_enable_memory(3, 3, TRUE, TRUE);
- rom_ptr = m_region_maincpu->base() + 0x010000+0x04000+0x02000;
- m_bank3->set_base(rom_ptr);
- m_bank7->set_base(rom_ptr);
- }
- }
-}
-
-/* DRQ is connected to interrupt */
-WRITE_LINE_MEMBER(oric_state::oric_jasmin_wd179x_drq_w)
-{
- if (state)
- m_irqs |= (1<<1);
- else
- m_irqs &=~(1<<1);
-
- oric_refresh_ints();
-}
-
-READ8_MEMBER(oric_state::oric_jasmin_r)
-{
- wd1770_device *fdc = machine().device<wd1770_device>("wd179x");
- unsigned char data = 0x0ff;
-
- switch (offset & 0x0f)
- {
- /* jasmin floppy disc interface */
- case 0x04:
- data = fdc->status_r(space, 0);
- break;
- case 0x05:
- data = fdc->track_r(space, 0);
- break;
- case 0x06:
- data = fdc->sector_r(space, 0);
- break;
- case 0x07:
- data = fdc->data_r(space, 0);
- break;
- default:
- data = m_via6522_0->read(space,offset & 0x0f);
- //logerror("unhandled io read: %04x %02x\n", offset, data);
- break;
-
- }
-
- return data;
-}
-
-WRITE8_MEMBER(oric_state::oric_jasmin_w)
-{
- wd1770_device *fdc = machine().device<wd1770_device>("wd179x");
- switch (offset & 0x0f)
- {
- /* microdisc floppy disc interface */
- case 0x04:
- fdc->command_w( space, 0, data);
- break;
- case 0x05:
- fdc->track_w(space, 0, data);
- break;
- case 0x06:
- fdc->sector_w(space, 0, data);
- break;
- case 0x07:
- fdc->data_w(space, 0, data);
- break;
- /* bit 0 = side */
- case 0x08:
- fdc->set_side(data & 0x01);
- break;
- /* any write will cause wd179x to reset */
- case 0x09:
- fdc->reset();
- break;
- case 0x0a:
- //logerror("jasmin overlay ram w: %02x PC: %04x\n", data, m_maincpu->pc());
- m_port_3fa_w = data;
- oric_jasmin_set_mem_0x0c000();
- break;
- case 0x0b:
- //logerror("jasmin romdis w: %02x PC: %04x\n", data, m_maincpu->pc());
- m_port_3fb_w = data;
- oric_jasmin_set_mem_0x0c000();
- break;
- /* bit 0,1 of addr is the drive */
- case 0x0c:
- case 0x0d:
- case 0x0e:
- case 0x0f:
- fdc->set_drive(offset & 0x03);
- break;
-
- default:
- m_via6522_0->write(space,offset & 0x0f, data);
- break;
- }
-}
-
-
-void oric_state::oric_install_jasmin_interface()
-{
- address_space &space = m_maincpu->space(AS_PROGRAM);
- /* romdis */
- m_port_3fb_w = 1;
- oric_jasmin_set_mem_0x0c000();
-
- space.install_read_handler(0x0300, 0x03ef, read8_delegate(FUNC(oric_state::oric_IO_r),this));
- space.install_read_handler(0x03f0, 0x03ff, read8_delegate(FUNC(oric_state::oric_jasmin_r),this));
-
- space.install_write_handler(0x0300, 0x03ef, write8_delegate(FUNC(oric_state::oric_IO_w),this));
- space.install_write_handler(0x03f0, 0x03ff, write8_delegate(FUNC(oric_state::oric_jasmin_w),this));
-}
-
-/*********************************/
-/* MICRODISC INTERFACE variables */
-
-/* used by Microdisc interfaces */
-
-/* bit 7 is intrq state */
-/* bit 7 is drq state (active low) */
-/* bit 6,5: drive */
-/* bit 4: side */
-/* bit 3: double density enable */
-/* bit 0: enable FDC IRQ to trigger IRQ on CPU */
-
-
-void oric_state::oric_microdisc_refresh_wd179x_ints()
-{
- m_irqs &=~(1<<1);
-
- if ((m_wd179x_int_state) && (m_port_314_w & (1<<0)))
- {
- /*logerror("oric microdisc interrupt\n"); */
-
- m_irqs |=(1<<1);
- }
-
- oric_refresh_ints();
-}
-
-WRITE_LINE_MEMBER(oric_state::oric_microdisc_wd179x_intrq_w)
-{
- m_wd179x_int_state = state;
-
- if (state)
- m_port_314_r &= ~(1<<7);
- else
- m_port_314_r |=(1<<7);
-
- oric_microdisc_refresh_wd179x_ints();
-}
-
-WRITE_LINE_MEMBER(oric_state::oric_microdisc_wd179x_drq_w)
-{
- if (state)
- m_port_318_r &=~(1<<7);
- else
- m_port_318_r |= (1<<7);
-}
-
-void oric_state::oric_microdisc_set_mem_0x0c000()
-{
- if (m_is_telestrat)
- {
- return;
- }
-
- /* for 0x0c000-0x0dfff: */
- /* if os disabled, ram takes priority */
- /* /ROMDIS */
- if ((m_port_314_w & (1<<1))==0)
- {
- /*logerror("&c000-&dfff is ram\n"); */
- /* rom disabled enable ram */
- oric_enable_memory(1, 1, TRUE, TRUE);
- m_bank1->set_base(m_ram_0x0c000);
- m_bank5->set_base(m_ram_0x0c000);
- }
- else
- {
- unsigned char *rom_ptr;
- /*logerror("&c000-&dfff is os rom\n"); */
- /* basic rom */
- oric_enable_memory(1, 1, TRUE, FALSE);
- rom_ptr = m_region_maincpu->base() + 0x010000;
- m_bank1->set_base(rom_ptr);
- m_bank5->set_base(rom_ptr);
- }
-
- /* for 0x0e000-0x0ffff */
- /* if not disabled, os takes priority */
- if ((m_port_314_w & (1<<1))!=0)
- {
- unsigned char *rom_ptr;
- /*logerror("&e000-&ffff is os rom\n"); */
- /* basic rom */
- oric_enable_memory(2, 3, TRUE, FALSE);
- rom_ptr = m_region_maincpu->base() + 0x010000;
- m_bank2->set_base(rom_ptr+0x02000);
- m_bank3->set_base(rom_ptr+0x03800);
- m_bank6->set_base(rom_ptr+0x02000);
- m_bank7->set_base(rom_ptr+0x03800);
-
- }
- else
- {
- /* if eprom is enabled, it takes priority over ram */
- if ((m_port_314_w & (1<<7))==0)
- {
- unsigned char *rom_ptr;
- /*logerror("&e000-&ffff is disk rom\n"); */
- oric_enable_memory(2, 3, TRUE, FALSE);
- /* enable rom of microdisc interface */
- rom_ptr = m_region_maincpu->base() + 0x014000;
- m_bank2->set_base(rom_ptr);
- m_bank3->set_base(rom_ptr+0x01800);
- }
- else
- {
- /*logerror("&e000-&ffff is ram\n"); */
- /* rom disabled enable ram */
- oric_enable_memory(2, 3, TRUE, TRUE);
- m_bank2->set_base(m_ram_0x0c000+0x02000);
- m_bank3->set_base(m_ram_0x0c000+0x03800);
- m_bank6->set_base(m_ram_0x0c000+0x02000);
- m_bank7->set_base(m_ram_0x0c000+0x03800);
- }
- }
-}
-
-
-
-READ8_MEMBER(oric_state::oric_microdisc_r)
-{
- unsigned char data = 0x0ff;
- wd1770_device *fdc = machine().device<wd1770_device>("wd179x");
-
- switch (offset & 0x0ff)
- {
- /* microdisc floppy disc interface */
- case 0x00:
- data = fdc->status_r(space, 0);
- break;
- case 0x01:
- data = fdc->track_r(space, 0);
- break;
- case 0x02:
- data = fdc->sector_r(space, 0);
- break;
- case 0x03:
- data = fdc->data_r(space, 0);
- break;
- case 0x04:
- data = m_port_314_r | 0x07f;
-/* logerror("port_314_r: %02x\n",data); */
- break;
- case 0x08:
- data = m_port_318_r | 0x07f;
-/* logerror("port_318_r: %02x\n",data); */
- break;
-
- default:
- data = m_via6522_0->read(space, offset & 0x0f);
- break;
-
- }
-
- return data;
-}
-
-WRITE8_MEMBER(oric_state::oric_microdisc_w)
-{
- wd1770_device *fdc = machine().device<wd1770_device>("wd179x");
- switch (offset & 0x0ff)
- {
- /* microdisc floppy disc interface */
- case 0x00:
- fdc->command_w(space, 0, data);
- break;
- case 0x01:
- fdc->track_w(space, 0, data);
- break;
- case 0x02:
- fdc->sector_w(space, 0, data);
- break;
- case 0x03:
- fdc->data_w(space, 0, data);
- break;
- case 0x04:
- {
- m_port_314_w = data;
-
- //logerror("port_314_w: %02x\n",data);
-
- /* bit 6,5: drive */
- /* bit 4: side */
- /* bit 3: double density enable */
- /* bit 0: enable FDC IRQ to trigger IRQ on CPU */
- fdc->set_drive((data>>5) & 0x03);
- fdc->set_side((data>>4) & 0x01);
- fdc->dden_w(!BIT(data, 3));
-
- oric_microdisc_set_mem_0x0c000();
- oric_microdisc_refresh_wd179x_ints();
- }
- break;
-
- default:
- m_via6522_0->write(space, offset & 0x0f, data);
- break;
- }
-}
-
-void oric_state::oric_install_microdisc_interface()
-{
- address_space &space = m_maincpu->space(AS_PROGRAM);
-
- space.install_read_handler(0x0300, 0x030f, read8_delegate(FUNC(oric_state::oric_IO_r),this));
- space.install_read_handler(0x0310, 0x031f, read8_delegate(FUNC(oric_state::oric_microdisc_r),this));
- space.install_read_handler(0x0320, 0x03ff, read8_delegate(FUNC(oric_state::oric_IO_r),this));
-
- space.install_write_handler(0x0300, 0x030f, write8_delegate(FUNC(oric_state::oric_IO_w),this));
- space.install_write_handler(0x0310, 0x031f, write8_delegate(FUNC(oric_state::oric_microdisc_w),this));
- space.install_write_handler(0x0320, 0x03ff, write8_delegate(FUNC(oric_state::oric_IO_w),this));
-
- /* disable os rom, enable microdisc rom */
- /* 0x0c000-0x0dfff will be ram, 0x0e000-0x0ffff will be microdisc rom */
- m_port_314_w = 0x0ff^((1<<7) | (1<<1));
-
- oric_microdisc_set_mem_0x0c000();
-}
-
-
-
-/*********************************************************/
-
-WRITE_LINE_MEMBER(oric_state::oric_wd179x_intrq_w)
-{
- if ((m_io_floppy->read() & 0x07) == ORIC_FLOPPY_INTERFACE_MICRODISC)
- {
- oric_microdisc_wd179x_intrq_w(state);
- }
-}
-
-WRITE_LINE_MEMBER(oric_state::oric_wd179x_drq_w)
-{
- switch (m_io_floppy->read() & 0x07)
- {
- default:
- case ORIC_FLOPPY_INTERFACE_NONE:
- case ORIC_FLOPPY_INTERFACE_APPLE2:
- return;
- case ORIC_FLOPPY_INTERFACE_MICRODISC:
- oric_microdisc_wd179x_drq_w(state);
- return;
- case ORIC_FLOPPY_INTERFACE_JASMIN:
- oric_jasmin_wd179x_drq_w(state);
- return;
- }
-}
-
-const wd17xx_interface oric_wd17xx_interface =
-{
- DEVCB_NULL,
- DEVCB_DRIVER_LINE_MEMBER(oric_state,oric_wd179x_intrq_w),
- DEVCB_DRIVER_LINE_MEMBER(oric_state,oric_wd179x_drq_w),
- {FLOPPY_0, FLOPPY_1, FLOPPY_2, FLOPPY_3}
-};
-
-void oric_state::oric_common_init_machine()
-{
- /* clear all irqs */
- m_irqs = 0;
- m_ram_0x0c000 = NULL;
- m_keyboard_line = 0;
- m_key_sense_bit = 0;
- m_keyboard_mask = 0;
- m_via_port_a_data = 0;
- m_psg_control = 0;
- m_previous_portb_data = 0;
- m_port_3fa_w = 0;
- m_port_3fb_w = 0;
- m_wd179x_int_state = 0;
- m_port_314_r = 0;
- m_port_318_r = 0;
- m_port_314_w = 0;
- machine().scheduler().timer_pulse(attotime::from_hz(4800), timer_expired_delegate(FUNC(oric_state::oric_refresh_tape),this));
-}
-
-void oric_state::machine_start()
-{
- oric_common_init_machine();
-
- m_is_telestrat = 0;
-
- m_ram_0x0c000 = auto_alloc_array(machine(), UINT8, 16384);
-}
-
-
-void oric_state::machine_reset()
-{
- int disc_interface_id = m_io_floppy->read() & 0x07;
- address_space &space = m_maincpu->space(AS_PROGRAM);
- if (m_is_telestrat)
- return;
-
- switch (disc_interface_id)
- {
- default:
-
- case ORIC_FLOPPY_INTERFACE_APPLE2:
- case ORIC_FLOPPY_INTERFACE_NONE:
- {
- /* setup memory when there is no disc interface */
- unsigned char *rom_ptr;
-
- /* os rom */
- oric_enable_memory(1, 3, TRUE, FALSE);
- rom_ptr = m_region_maincpu->base() + 0x010000;
- m_bank1->set_base(rom_ptr);
- m_bank2->set_base(rom_ptr+0x02000);
- m_bank3->set_base(rom_ptr+0x03800);
- m_bank5->set_base(rom_ptr);
- m_bank6->set_base(rom_ptr+0x02000);
- m_bank7->set_base(rom_ptr+0x03800);
-
-
- if (disc_interface_id==ORIC_FLOPPY_INTERFACE_APPLE2)
- {
- oric_install_apple2_interface();
- }
- else
- {
- space.install_read_handler(0x0300, 0x03ff, read8_delegate(FUNC(oric_state::oric_IO_r),this));
- space.install_write_handler(0x0300, 0x03ff, write8_delegate(FUNC(oric_state::oric_IO_w),this));
- }
- }
- break;
-
- case ORIC_FLOPPY_INTERFACE_APPLE2_V2:
- {
- oric_install_apple2_v2_interface();
- }
- break;
-
-
- case ORIC_FLOPPY_INTERFACE_MICRODISC:
- {
- oric_install_microdisc_interface();
- }
- break;
-
- case ORIC_FLOPPY_INTERFACE_JASMIN:
- {
- oric_install_jasmin_interface();
- }
- break;
- }
- m_maincpu->reset();
-}
-
-
-READ8_MEMBER(oric_state::oric_IO_r)
-{
- switch (m_io_floppy->read() & 0x07)
- {
- default:
- case ORIC_FLOPPY_INTERFACE_NONE:
- break;
-
- case ORIC_FLOPPY_INTERFACE_MICRODISC:
- {
- if ((offset>=0x010) && (offset<=0x01f))
- {
- return oric_microdisc_r(space, offset);
- }
- }
- break;
-
- case ORIC_FLOPPY_INTERFACE_JASMIN:
- {
- if ((offset>=0x0f4) && (offset<=0x0ff))
- {
- return oric_jasmin_r(space, offset);
- }
- }
- break;
- }
-
- /* it is repeated */
- return m_via6522_0->read(space, offset & 0x0f);
-}
-
-WRITE8_MEMBER(oric_state::oric_IO_w)
-{
- switch (m_io_floppy->read() & 0x07)
- {
- default:
- case ORIC_FLOPPY_INTERFACE_NONE:
- break;
-
- case ORIC_FLOPPY_INTERFACE_MICRODISC:
- {
- if ((offset >= 0x010) && (offset <= 0x01f))
- {
- oric_microdisc_w(space, offset, data);
- return;
- }
- }
- break;
-
- case ORIC_FLOPPY_INTERFACE_JASMIN:
- {
- if ((offset >= 0x0f4) && (offset <= 0x0ff))
- {
- oric_jasmin_w(space, offset, data);
- return;
- }
-
- }
- break;
- }
-
- m_via6522_0->write(space, offset & 0x0f, data);
-}
-
-
-
-/**** TELESTRAT ****/
-
-/*
-VIA lines
- Telestrat usage
-
-PA0..PA2
- Memory bank selection
-
-PA3
- "Midi" port pin 3
-
-PA4
- RS232/Minitel selection
-
-PA5
- Third mouse button (right joystick port pin 5)
-
-PA6
- "Midi" port pin 5
-
-PA7
- Second mouse button (right joystick port pin 9)
-
-CA1
- "Midi" port pin 1
-
-CA2
- not used ?
-
-PB0..PB4
- Joystick ports
-
-PB5
- Joystick doubler switch
-
-PB6
- Select Left Joystick port
-
-PB7
- Select Right Joystick port
-
-CB1
- Phone Ring detection
-
-CB2
- "Midi" port pin 4
-
-*/
-
-
-void oric_state::telestrat_refresh_mem()
-{
- address_space &space = m_maincpu->space(AS_PROGRAM);
-
- telestrat_mem_block *mem_block = &m_telestrat_blocks[m_telestrat_bank_selection];
-
- switch (mem_block->MemType)
- {
- case TELESTRAT_MEM_BLOCK_RAM:
- {
- m_bank1->set_base(mem_block->ptr);
- m_bank2->set_base(mem_block->ptr);
- space.install_read_bank(0xc000, 0xffff, "bank1");
- space.install_write_bank(0xc000, 0xffff, "bank2");
- }
- break;
-
- case TELESTRAT_MEM_BLOCK_ROM:
- {
- m_bank1->set_base(mem_block->ptr);
- space.install_read_bank(0xc000, 0xffff, "bank1");
- space.nop_write(0xc000, 0xffff);
- }
- break;
-
- default:
- case TELESTRAT_MEM_BLOCK_UNDEFINED:
- {
- space.nop_readwrite(0xc000, 0xffff);
- }
- break;
- }
-}
-
-READ8_MEMBER(oric_state::telestrat_via2_in_a_func)
-{
- //logerror("via 2 - port a %02x\n",m_telestrat_via2_port_a_data);
- return m_telestrat_via2_port_a_data;
-}
-
-
-WRITE8_MEMBER(oric_state::telestrat_via2_out_a_func)
-{
- //logerror("via 2 - port a w: %02x\n",data);
-
- m_telestrat_via2_port_a_data = data;
-
- if (((data^m_telestrat_bank_selection) & 0x07)!=0)
- {
- m_telestrat_bank_selection = data & 0x07;
-
- telestrat_refresh_mem();
- }
-}
-
-READ8_MEMBER(oric_state::telestrat_via2_in_b_func)
-{
- unsigned char data = 0x01f;
-
- /* left joystick selected? */
- if (m_telestrat_via2_port_b_data & (1<<6))
- {
- data &= ioport("JOY0")->read();
- }
-
- /* right joystick selected? */
- if (m_telestrat_via2_port_b_data & (1<<7))
- {
- data &= ioport("JOY1")->read();
- }
-
- data |= m_telestrat_via2_port_b_data & ((1<<7) | (1<<6) | (1<<5));
-
- return data;
-}
-
-WRITE8_MEMBER(oric_state::telestrat_via2_out_b_func)
-{
- m_telestrat_via2_port_b_data = data;
-}
-
-
-WRITE_LINE_MEMBER(oric_state::telestrat_via2_irq_func)
-{
- m_irqs &=~(1<<2);
-
- if (state)
- {
- //logerror("telestrat via2 interrupt\n");
-
- m_irqs |=(1<<2);
- }
-
- oric_refresh_ints();
-}
-
-/* interrupt state from acia6551 */
-WRITE_LINE_MEMBER(oric_state::telestrat_acia_callback)
-{
- m_irqs&=~(1<<3);
-
- if (state)
- {
- m_irqs |= (1<<3);
- }
-
- oric_refresh_ints();
-}
-
-MACHINE_START_MEMBER(oric_state,telestrat)
-{
- UINT8 *mem = m_region_maincpu->base();
-
- oric_common_init_machine();
-
- m_telestrat_via2_port_a_data = 0;
- m_telestrat_via2_port_b_data = 0;
- m_is_telestrat = 1;
-
- /* initialise overlay ram */
- m_telestrat_blocks[0].MemType = TELESTRAT_MEM_BLOCK_RAM;
- m_telestrat_blocks[0].ptr = mem+0x020000; //auto_alloc_array(machine(), UINT8, 16384);
-
- m_telestrat_blocks[1].MemType = TELESTRAT_MEM_BLOCK_RAM;
- m_telestrat_blocks[1].ptr = mem+0x024000; //auto_alloc_array(machine(), UINT8, 16384);
-
- m_telestrat_blocks[2].MemType = TELESTRAT_MEM_BLOCK_RAM;
- m_telestrat_blocks[2].ptr = mem+0x028000; //auto_alloc_array(machine(), UINT8, 16384);
-
- /* initialise default cartridge */
- m_telestrat_blocks[3].MemType = TELESTRAT_MEM_BLOCK_ROM;
- m_telestrat_blocks[3].ptr = mem+0x010000; // telmatic.rom
-
- m_telestrat_blocks[4].MemType = TELESTRAT_MEM_BLOCK_RAM;
- m_telestrat_blocks[4].ptr = mem+0x02c000; //auto_alloc_array(machine(), UINT8, 16384);
-
- /* initialise default cartridge */
- m_telestrat_blocks[5].MemType = TELESTRAT_MEM_BLOCK_ROM;
- m_telestrat_blocks[5].ptr = mem+0x014000; // teleass.rom
-
- /* initialise default cartridge */
- m_telestrat_blocks[6].MemType = TELESTRAT_MEM_BLOCK_ROM;
- m_telestrat_blocks[6].ptr = mem+0x018000; // hyperbas.rom
-
- /* initialise default cartridge */
- m_telestrat_blocks[7].MemType = TELESTRAT_MEM_BLOCK_ROM;
- m_telestrat_blocks[7].ptr = mem+0x01c000; // telmon24.rom
-
- m_telestrat_bank_selection = 7;
- telestrat_refresh_mem();
-
- /* disable os rom, enable microdisc rom */
- /* 0x0c000-0x0dfff will be ram, 0x0e000-0x0ffff will be microdisc rom */
- m_port_314_w = 0x0ff^((1<<7) | (1<<1));
-}
diff --git a/src/mess/mess.mak b/src/mess/mess.mak
index 1fd8ec20290..5744756f7c9 100644
--- a/src/mess/mess.mak
+++ b/src/mess/mess.mak
@@ -553,6 +553,7 @@ BUSES += MIDI
BUSES += MEGADRIVE
BUSES += NES
BUSES += NUBUS
+BUSES += ORICEXT
BUSES += PCE
BUSES += PCI
BUSES += PC_JOY
@@ -1788,9 +1789,7 @@ $(MESSOBJ)/tangerin.a: \
$(MESS_VIDEO)/microtan.o \
$(MESS_MACHINE)/microtan.o \
$(MESS_DRIVERS)/microtan.o \
- $(MESS_DRIVERS)/oric.o \
- $(MESS_VIDEO)/oric.o \
- $(MESS_MACHINE)/oric.o \
+ $(MESS_DRIVERS)/oric.o
$(MESSOBJ)/tatung.a: \
$(MESS_DRIVERS)/einstein.o \
diff --git a/src/mess/tools/floptool/main.c b/src/mess/tools/floptool/main.c
index 4a67ce8a940..4f29ba47982 100644
--- a/src/mess/tools/floptool/main.c
+++ b/src/mess/tools/floptool/main.c
@@ -39,6 +39,10 @@
#include "formats/ap_dsk35.h"
#include "formats/ap2_dsk.h"
+#include "formats/oric_dsk.h"
+
+#include "formats/applix_dsk.h"
+
static floppy_format_type floppy_formats[] = {
FLOPPY_MFI_FORMAT,
FLOPPY_DFI_FORMAT,
@@ -60,6 +64,10 @@ static floppy_format_type floppy_formats[] = {
FLOPPY_DC42_FORMAT,
FLOPPY_A216S_FORMAT,
FLOPPY_RWTS18_FORMAT,
+
+ FLOPPY_ORIC_DSK_FORMAT,
+
+ FLOPPY_APPLIX_FORMAT,
};
void CLIB_DECL ATTR_PRINTF(1,2) logerror(const char *format, ...)
diff --git a/src/mess/video/oric.c b/src/mess/video/oric.c
deleted file mode 100644
index 054515d1e92..00000000000
--- a/src/mess/video/oric.c
+++ /dev/null
@@ -1,304 +0,0 @@
-/***************************************************************************
-
- video/oric.c
-
- All graphic effects are supported including mid-line changes.
- There may be some small bugs.
-
- TODO:
- - speed up this code a bit?
-
-***************************************************************************/
-
-#include "includes/oric.h"
-
-TIMER_CALLBACK_MEMBER(oric_state::oric_vh_timer_callback)
-{
- /* update flash count */
- m_vh_state.flash_count++;
-}
-
-void oric_state::oric_vh_update_flash()
-{
- /* flash active? */
- if (BIT(m_vh_state.text_attributes, 2))
- {
- /* yes */
-
- /* show or hide text? */
- if (BIT(m_vh_state.flash_count, 4))
- {
- /* hide */
- /* set foreground and background to be the same */
- m_vh_state.active_foreground_colour = m_vh_state.background_colour;
- m_vh_state.active_background_colour = m_vh_state.background_colour;
- return;
- }
- }
-
-
- /* show */
- m_vh_state.active_foreground_colour = m_vh_state.foreground_colour;
- m_vh_state.active_background_colour = m_vh_state.background_colour;
-}
-
-/* the alternate charset follows from the standard charset.
-Each charset holds 128 chars with 8 bytes for each char.
-
-The start address for the standard charset is dependant on the video mode */
-void oric_state::oric_refresh_charset()
-{
- /* alternate char set? */
- if (BIT(m_vh_state.text_attributes, 0))
- {
- /* yes */
- m_vh_state.char_data = m_vh_state.char_base + (128*8);
- }
- else
- {
- /* no */
- m_vh_state.char_data = m_vh_state.char_base;
- }
-}
-
-/* update video hardware state depending on the new attribute */
-void oric_state::oric_vh_update_attribute(UINT8 c)
-{
- /* attribute */
- UINT8 attribute = c & 0x03f;
- address_space &space = m_maincpu->space(AS_PROGRAM);
-
- switch ((attribute>>3) & 0x03)
- {
- case 0:
- {
- /* set foreground colour 00-07 = black,red,green,yellow,blue,magenta,cyan,white */
- m_vh_state.foreground_colour = attribute & 0x07;
- oric_vh_update_flash();
- }
- break;
-
- case 1:
- {
- m_vh_state.text_attributes = attribute & 0x07;
-
- oric_refresh_charset();
-
- /* text attributes */
- oric_vh_update_flash();
- }
- break;
-
- case 2:
- {
- /* set background colour */
- m_vh_state.background_colour = attribute & 0x07;
- oric_vh_update_flash();
- }
- break;
-
- case 3:
- {
- /* set video mode */
- m_vh_state.mode = attribute & 0x07;
-
- // a different charset base is used depending on the video mode
- // hires takes all the data from 0x0a000 through to about 0x0bf68,
- // so the charset is moved to 0x09800 */
- // text mode starts at 0x0bb80 and so the charset is in a different location
- if (BIT(m_vh_state.mode, 2))
- {
- /* set screen memory base and standard charset location for this mode */
- m_vh_state.read_addr = 0x0a000;
- if (m_ram)
- m_vh_state.char_base = m_ram + (offs_t)0x09800;
- else
- m_vh_state.char_base = (UINT8 *)space.get_read_ptr(0x09800);
- }
- else
- {
- /* set screen memory base and standard charset location for this mode */
- m_vh_state.read_addr = 0x0bb80;
- if (m_ram)
- m_vh_state.char_base = m_ram + (offs_t)0x0b400;
- else
- m_vh_state.char_base = (UINT8 *)space.get_read_ptr(0x0b400);
- }
- /* changing the mode also changes the position of the standard charset and alternative charset */
- oric_refresh_charset();
- }
- break;
-
- default:
- break;
- }
-}
-
-
-/* render 6-pixels using foreground and background colours specified */
-/* used in hires and text mode */
-void oric_state::oric_vh_render_6pixels(bitmap_ind16 &bitmap, int x, UINT8 y, UINT8 fg, UINT8 bg, UINT8 data, bool invert_flag)
-{
- /* invert? */
- if (invert_flag)
- {
- fg ^=0x07;
- bg ^=0x07;
- }
-
- bitmap.pix16(y, x++) = BIT(data, 5) ? fg : bg;
- bitmap.pix16(y, x++) = BIT(data, 4) ? fg : bg;
- bitmap.pix16(y, x++) = BIT(data, 3) ? fg : bg;
- bitmap.pix16(y, x++) = BIT(data, 2) ? fg : bg;
- bitmap.pix16(y, x++) = BIT(data, 1) ? fg : bg;
- bitmap.pix16(y, x++) = BIT(data, 0) ? fg : bg;
-}
-
-
-
-
-
-/***************************************************************************
- oric_vh_screenrefresh
-***************************************************************************/
-UINT32 oric_state::screen_update_oric(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
-{
- UINT8 *RAM, y;
- offs_t byte_offset, read_addr_base;
- bool hires_active;
- address_space &space = m_maincpu->space(AS_PROGRAM);
-
- RAM = m_ram;
-
- /* set initial base */
- read_addr_base = m_vh_state.read_addr;
-
- /* is hires active? */
- hires_active = BIT(m_vh_state.mode, 2);
-
- for (y = 0; y < 224; y++)
- {
- int x = 0;
-
- /* foreground colour white */
- oric_vh_update_attribute(7);
- /* background colour black */
- oric_vh_update_attribute((1<<3));
- oric_vh_update_attribute((1<<4));
-
- for (byte_offset=0; byte_offset<40; byte_offset++)
- {
- UINT8 c;
- offs_t read_addr;
-
- /* after line 200 all rendering is done in text mode */
- if (y<200)
- {
- /* calculate fetch address based on current line and current mode */
- if (hires_active)
- {
- read_addr = read_addr_base + byte_offset + (offs_t)(y*40);
- }
- else
- {
- UINT8 char_line = y>>3;
- read_addr = read_addr_base + byte_offset + (offs_t)(char_line*40);
- }
- }
- else
- {
- UINT8 char_line = (y-200)>>3;
- read_addr = read_addr_base + byte_offset + (offs_t)(char_line*40);
- }
-
- /* fetch data */
- c = RAM ? RAM[read_addr] : space.read_byte(read_addr);
-
- /* if bits 6 and 5 are zero, the byte contains a serial attribute */
- if ((c & ((1 << 6) | (1 << 5))) == 0)
- {
- oric_vh_update_attribute(c);
-
- /* display background colour when attribute has been found */
- oric_vh_render_6pixels(bitmap, x, y, m_vh_state.active_foreground_colour, m_vh_state.active_background_colour, 0, (c & 0x080));
-
- if (y < 200)
- {
- /* is hires active? */
- hires_active = BIT(m_vh_state.mode, 2);
- read_addr_base = m_vh_state.read_addr;
- }
- }
- else
- {
- /* hires? */
- if (hires_active)
- {
- UINT8 pixel_data = c & 0x03f;
- /* plot hires pixels */
- oric_vh_render_6pixels(bitmap,x,y,m_vh_state.active_foreground_colour, m_vh_state.active_background_colour, pixel_data, BIT(c, 7));
- }
- else
- {
- UINT8 char_index, char_data, ch_line;
-
- char_index = (c & 0x07f);
-
- ch_line = y & 7;
-
- /* is double height set? */
- if (BIT(m_vh_state.text_attributes, 1))
- {
- /* if char line is even, top half of character is displayed else bottom half */
- UINT8 double_height_flag = BIT(y, 3);
-
- /* calculate line to fetch */
- ch_line = (ch_line>>1) + (double_height_flag<<2);
- }
-
- /* fetch pixel data for this char line */
- char_data = m_vh_state.char_data[(char_index<<3) | ch_line] & 0x03f;
-
- /* draw! */
- oric_vh_render_6pixels(bitmap,x,y,
- m_vh_state.active_foreground_colour,
- m_vh_state.active_background_colour, char_data, BIT(c, 7));
- }
-
- }
-
- x+=6;
- }
-
- /* after 200 lines have been drawn, force a change of the read address */
- /* there are 200 lines of hires/text mode, then 24 lines of text mode */
- /* the mode can't be changed in the last 24 lines. */
- if (y==199)
- {
- /* mode */
- read_addr_base = (offs_t)0x0bf68;
- hires_active = 0;
- }
- }
- return 0;
-}
-
-
-void oric_state::video_start()
-{
- // initialise variables
- m_vh_state.active_foreground_colour = 0;
- m_vh_state.active_background_colour = 0;
- m_vh_state.foreground_colour = 0;
- m_vh_state.background_colour = 0;
- m_vh_state.mode = 0;
- m_vh_state.text_attributes = 0;
- m_vh_state.read_addr = 0;
- m_vh_state.char_data = 0;
- m_vh_state.char_base = 0;
- /* initialise flash timer */
- m_vh_state.flash_count = 0;
- machine().scheduler().timer_pulse(attotime::from_hz(50), timer_expired_delegate(FUNC(oric_state::oric_vh_timer_callback),this));
- /* mode */
- oric_vh_update_attribute((1<<3)|(1<<4));
-}