diff options
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 |
commit | 5e378738aafb738373edf6014996482aa7ee6a3c (patch) | |
tree | 47f67bf33eaa8221c0befc8e9fab359ed56fda3d | |
parent | 49d95127f1aba390cf725dd7fe267da9366e04a8 (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-- | .gitattributes | 3 | ||||
-rw-r--r-- | src/emu/bus/bus.mak | 11 | ||||
-rw-r--r-- | src/emu/bus/oricext/jasmin.c | 173 | ||||
-rw-r--r-- | src/emu/bus/oricext/jasmin.h | 41 | ||||
-rw-r--r-- | src/emu/bus/oricext/microdisc.c | 151 | ||||
-rw-r--r-- | src/emu/bus/oricext/microdisc.h | 52 | ||||
-rw-r--r-- | src/emu/bus/oricext/oricext.c | 76 | ||||
-rw-r--r-- | src/emu/bus/oricext/oricext.h | 63 | ||||
-rw-r--r-- | src/emu/imagedev/floppy.c | 3 | ||||
-rw-r--r-- | src/emu/machine/6522via.c | 10 | ||||
-rw-r--r-- | src/emu/machine/6522via.h | 2 | ||||
-rw-r--r-- | src/emu/machine/wd_fdc.c | 13 | ||||
-rw-r--r-- | src/lib/formats/mfi_dsk.c | 2 | ||||
-rw-r--r-- | src/lib/formats/oric_dsk.c | 348 | ||||
-rw-r--r-- | src/lib/formats/oric_dsk.h | 18 | ||||
-rw-r--r-- | src/mess/drivers/oric.c | 1129 | ||||
-rw-r--r-- | src/mess/includes/oric.h | 204 | ||||
-rw-r--r-- | src/mess/machine/oric.c | 1357 | ||||
-rw-r--r-- | src/mess/mess.mak | 5 | ||||
-rw-r--r-- | src/mess/tools/floptool/main.c | 8 | ||||
-rw-r--r-- | src/mess/video/oric.c | 304 |
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, µdisc_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)); -} |