Previous 199869 Revisions Next

r29568 Saturday 12th April, 2014 at 15:15:20 UTC by O. Galibert
Oric 1: Spring cleaning [O. Galibert]

Putting back the apple2 disk2 in the Pravetz 8D will wait until the
next generation one is finalized.
[src/emu/bus]bus.mak
[src/emu/bus/oricext]jasmin.c jasmin.h microdisc.c microdisc.h oricext.c oricext.h
[src/emu/imagedev]floppy.c
[src/emu/machine]6522via.c 6522via.h wd_fdc.c
[src/lib/formats]mfi_dsk.c oric_dsk.c oric_dsk.h
[src/mess]mess.mak
[src/mess/drivers]oric.c
[src/mess/includes]oric.h
[src/mess/machine]oric.c
[src/mess/tools/floptool]main.c
[src/mess/video]oric.c

trunk/src/emu/machine/6522via.c
r29567r29568
842842      m_in_a &= ~(1 << line);
843843}
844844
845WRITE8_MEMBER( via6522_device::write_pa )
846{
847   m_in_a = data;
848}
849
845850/*-------------------------------------------------
846851    ca1_w - interface setting VIA port CA1 input
847852-------------------------------------------------*/
r29567r29568
902907      m_in_b &= ~(1 << line);
903908}
904909
910WRITE8_MEMBER( via6522_device::write_pb )
911{
912   m_in_b = data;
913}
914
905915/*-------------------------------------------------
906916    cb1_w - interface setting VIA port CB1 input
907917-------------------------------------------------*/
trunk/src/emu/machine/6522via.h
r29567r29568
8888   DECLARE_WRITE_LINE_MEMBER( write_pa5 ) { write_pa(5, state); }
8989   DECLARE_WRITE_LINE_MEMBER( write_pa6 ) { write_pa(6, state); }
9090   DECLARE_WRITE_LINE_MEMBER( write_pa7 ) { write_pa(7, state); }
91   DECLARE_WRITE8_MEMBER( write_pa );
9192   DECLARE_WRITE_LINE_MEMBER( write_ca1 );
9293   DECLARE_WRITE_LINE_MEMBER( write_ca2 );
9394
r29567r29568
99100   DECLARE_WRITE_LINE_MEMBER( write_pb5 ) { write_pb(5, state); }
100101   DECLARE_WRITE_LINE_MEMBER( write_pb6 ) { write_pb(6, state); }
101102   DECLARE_WRITE_LINE_MEMBER( write_pb7 ) { write_pb(7, state); }
103   DECLARE_WRITE8_MEMBER( write_pb );
102104   DECLARE_WRITE_LINE_MEMBER( write_cb1 );
103105   DECLARE_WRITE_LINE_MEMBER( write_cb2 );
104106
trunk/src/emu/machine/wd_fdc.c
r29567r29568
3838#define TRACE_COMP 0
3939
4040// Shows command invocation
41#define TRACE_COMMAND 0
41#define TRACE_COMMAND 1
4242
4343// Shows sync actions
4444#define TRACE_SYNC 0
r29567r29568
223223
224224void wd_fdc_t::seek_start(int state)
225225{
226   if (TRACE_COMMAND) logerror("%s: seek %d\n", tag(), data);
226   if (TRACE_COMMAND) logerror("%s: seek %d (track=%d)\n", tag(), data, track);
227227   main_state = state;
228228   status = (status & ~(S_CRC|S_RNF|S_SPIN)) | S_BUSY;
229229   if(head_control) {
r29567r29568
264264            delay_cycles(t_gen, step_times[command & 3]);
265265         }
266266
267         if(main_state == SEEK && track == data)
267         if(main_state == SEEK && track == data) {
268            logerror("track=%d data=%d\n", track, data);
268269            sub_state = SEEK_DONE;
270         }
269271
270272         if(sub_state == SPINUP_DONE) {
271273            counter = 0;
r29567r29568
11841186      counter = 0;
11851187   }
11861188
1187   status |= S_MON;
1189   status |= S_MON|S_SPIN;
11881190   if(floppy)
11891191      floppy->mon_w(0);
1190
11911192}
11921193
11931194void wd_fdc_t::ready_callback(floppy_image_device *floppy, int state)
r29567r29568
26692670{
26702671   step_times = wd_digital_step_times;
26712672   delay_register_commit = 32;
2672   delay_command_commit = 48;
2673   delay_command_commit = 36; // official 48 is too high for oric jasmin boot
26732674   disable_mfm = false;
26742675   inverted_bus = false;
26752676   side_control = false;
trunk/src/emu/bus/oricext/jasmin.h
r29567r29568
1#ifndef __JASMIN_H__
2#define __JASMIN_H__
3
4#include "oricext.h"
5#include "imagedev/floppy.h"
6#include "machine/wd_fdc.h"
7
8extern const device_type JASMIN;
9
10class jasmin_device : public oricext_device
11{
12public:
13   jasmin_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
14   virtual ~jasmin_device();
15
16   DECLARE_FLOPPY_FORMATS(floppy_formats);
17   DECLARE_ADDRESS_MAP(map, 8);
18   DECLARE_INPUT_CHANGED_MEMBER(boot_pressed);
19   DECLARE_WRITE8_MEMBER(side_sel_w);
20   DECLARE_WRITE8_MEMBER(fdc_reset_w);
21   DECLARE_WRITE8_MEMBER(ram_access_w);
22   DECLARE_WRITE8_MEMBER(rom_access_w);
23   DECLARE_WRITE8_MEMBER(select_w);
24
25protected:
26   required_device<wd1770_t> fdc;
27
28   bool side_sel, fdc_reset, ram_access, rom_access, select[4];
29   UINT8 *jasmin_rom;
30   floppy_image_device *cur_floppy, *floppies[4];
31   
32   virtual void device_start();
33   virtual void device_reset();
34   const rom_entry *device_rom_region() const;
35   machine_config_constructor device_mconfig_additions() const;
36   virtual ioport_constructor device_input_ports() const;
37
38   void remap();
39};
40
41#endif
trunk/src/emu/bus/oricext/microdisc.c
r29567r29568
1#include "microdisc.h"
2#include "formats/oric_dsk.h"
3
4const device_type MICRODISC = &device_creator<microdisc_device>;
5
6ROM_START( microdisc )
7   ROM_REGION( 0x2000, "microdisc", 0 )
8   ROM_LOAD ("microdis.rom", 0, 0x02000, CRC(a9664a9c) SHA1(0d2ef6e67322f48f4b7e08d8bbe68827e2074561) )
9ROM_END
10
11FLOPPY_FORMATS_MEMBER( microdisc_device::floppy_formats )
12   FLOPPY_ORIC_DSK_FORMAT
13FLOPPY_FORMATS_END
14
15static SLOT_INTERFACE_START( microdisc_floppies )
16   SLOT_INTERFACE( "3dsdd", FLOPPY_3_DSDD )
17SLOT_INTERFACE_END
18
19static MACHINE_CONFIG_FRAGMENT( microdisc )
20   MCFG_FD1793x_ADD("fdc", XTAL_8MHz/8)
21   MCFG_WD_FDC_INTRQ_CALLBACK(WRITELINE(microdisc_device, fdc_irq_w))
22   MCFG_WD_FDC_DRQ_CALLBACK(WRITELINE(microdisc_device, fdc_drq_w))
23   MCFG_WD_FDC_HLD_CALLBACK(WRITELINE(microdisc_device, fdc_hld_w))
24   MCFG_WD_FDC_FORCE_READY
25
26   MCFG_FLOPPY_DRIVE_ADD("fdc:0", microdisc_floppies, "3dsdd", microdisc_device::floppy_formats)
27   MCFG_FLOPPY_DRIVE_ADD("fdc:1", microdisc_floppies, NULL,    microdisc_device::floppy_formats)
28   MCFG_FLOPPY_DRIVE_ADD("fdc:2", microdisc_floppies, NULL,    microdisc_device::floppy_formats)
29   MCFG_FLOPPY_DRIVE_ADD("fdc:3", microdisc_floppies, NULL,    microdisc_device::floppy_formats)
30MACHINE_CONFIG_END
31
32DEVICE_ADDRESS_MAP_START(map, 8, microdisc_device)
33   AM_RANGE(0x310, 0x313) AM_DEVREADWRITE("fdc", fd1793_t, read, write)
34   AM_RANGE(0x314, 0x314) AM_READWRITE(port_314_r, port_314_w)
35   AM_RANGE(0x318, 0x318) AM_READ(port_318_r)
36ADDRESS_MAP_END
37
38microdisc_device::microdisc_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) :
39   oricext_device(mconfig, MICRODISC, "Microdisc floppy drive interface", tag, owner, clock, "microdisc", __FILE__),
40   fdc(*this, "fdc")
41{
42}
43
44microdisc_device::~microdisc_device()
45{
46}
47
48void microdisc_device::device_start()
49{
50   oricext_device::device_start();
51   astring tempstring;
52   microdisc_rom = device().machine().root_device().memregion(this->subtag(tempstring, "microdisc"))->base();
53   cpu->space(AS_PROGRAM).install_device(0x0000, 0xffff, *this, &microdisc_device::map);
54
55   for(int i=0; i<4; i++) {
56      char name[32];
57      sprintf(name, "fdc:%d", i);
58      floppies[i] = subdevice<floppy_connector>(name)->get_device();
59   }
60   intrq_state = drq_state = hld_state = false;
61}
62
63void microdisc_device::device_reset()
64{
65   port_314 = 0x00;
66   irq_w(false);
67   remap();
68   fdc->set_floppy(floppies[0]);
69
70   // The bootstrap checksums part of the high ram and if the sum is
71   // 0 it goes wrong.
72   ram[0xe000] = 0x42;
73}
74
75const rom_entry *microdisc_device::device_rom_region() const
76{
77   return ROM_NAME( microdisc );
78}
79
80machine_config_constructor microdisc_device::device_mconfig_additions() const
81{
82   return MACHINE_CONFIG_NAME( microdisc );
83}
84
85void microdisc_device::remap()
86{
87   if(port_314 & P_ROMDIS) {
88      bank_c000_r->set_base(rom+0x0000);
89      bank_e000_r->set_base(rom+0x2000);
90      bank_f800_r->set_base(rom+0x3800);
91      bank_c000_w->set_base(junk_write);
92      bank_e000_w->set_base(junk_write);
93      bank_f800_w->set_base(junk_write);
94   } else {
95      bank_c000_r->set_base(ram+0xc000);
96      bank_c000_w->set_base(ram+0xc000);
97      if(port_314 & P_EPROM) {
98         bank_e000_r->set_base(ram+0xe000);
99         bank_f800_r->set_base(ram+0xf800);
100         bank_e000_w->set_base(ram+0xe000);
101         bank_f800_w->set_base(ram+0xf800);
102      } else {
103         bank_e000_r->set_base(microdisc_rom+0x0000);
104         bank_f800_r->set_base(microdisc_rom+0x1800);
105         bank_e000_w->set_base(junk_write);
106         bank_f800_w->set_base(junk_write);
107      }
108   }
109}
110
111WRITE8_MEMBER(microdisc_device::port_314_w)
112{
113   port_314 = data;
114   remap();
115   floppy_image_device *floppy = floppies[(port_314 >> 5) & 3];
116   fdc->set_floppy(floppy);
117   fdc->dden_w(port_314 & P_DDEN);
118   if(floppy) {
119      floppy->ss_w(port_314 & P_SS ? 1 : 0);
120      floppy->mon_w(0);
121   }
122   irq_w(intrq_state && (port_314 & P_IRQEN));
123}
124
125READ8_MEMBER(microdisc_device::port_314_r)
126{
127   return (intrq_state && (port_314 & P_IRQEN)) ? 0x7f : 0xff;
128}
129
130READ8_MEMBER(microdisc_device::port_318_r)
131{
132   return drq_state ? 0x7f : 0xff;
133}
134
135WRITE_LINE_MEMBER(microdisc_device::fdc_irq_w)
136{
137   intrq_state = state;
138   irq_w(intrq_state && (port_314 & P_IRQEN));
139}
140
141WRITE_LINE_MEMBER(microdisc_device::fdc_drq_w)
142{
143   drq_state = state;
144}
145
146WRITE_LINE_MEMBER(microdisc_device::fdc_hld_w)
147{
148   logerror("hld %d\n", state);
149   hld_state = state;
150   floppies[(port_314 >> 5) & 3]->mon_w(!hld_state);
151}
trunk/src/emu/bus/oricext/oricext.c
r29567r29568
1#include "oricext.h"
2#include "jasmin.h"
3#include "microdisc.h"
4
5const device_type ORICEXT_CONNECTOR = &device_creator<oricext_connector>;
6
7oricext_connector::oricext_connector(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) :
8   device_t(mconfig, ORICEXT_CONNECTOR, "ORIC extension connector", tag, owner, clock, "oricext_connector", __FILE__),
9   device_slot_interface(mconfig, *this),
10   irq_handler(*this)
11{
12}
13
14oricext_connector::~oricext_connector()
15{
16}
17
18void oricext_connector::set_cputag(const char *tag)
19{
20   cputag = tag;
21}
22
23void oricext_connector::device_start()
24{
25   irq_handler.resolve_safe();
26}
27
28void oricext_connector::irq_w(int state)
29{
30   irq_handler(state);
31}
32
33void oricext_connector::device_config_complete()
34{
35   oricext_device *dev = dynamic_cast<oricext_device *>(get_card_device());
36   if(dev)
37      dev->set_cputag(cputag);
38}
39
40oricext_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) :
41   device_t(mconfig, type, name, tag, owner, clock, shortname, source),
42   device_slot_card_interface(mconfig, *this)
43{
44}
45
46void oricext_device::set_cputag(const char *tag)
47{
48   cputag = tag;
49}
50
51void oricext_device::device_start()
52{
53   cpu = machine().device<m6502_device>(cputag);
54   connector = downcast<oricext_connector *>(owner());
55   bank_c000_r = membank(":bank_c000_r");
56   bank_e000_r = membank(":bank_e000_r");
57   bank_f800_r = membank(":bank_f800_r");
58   bank_c000_w = membank(":bank_c000_w");
59   bank_e000_w = membank(":bank_e000_w");
60   bank_f800_w = membank(":bank_f800_w");
61   rom = (UINT8 *)machine().root_device().memregion(cputag)->base();
62   ram = (UINT8 *)memshare(":ram")->ptr();
63
64   memset(junk_read, 0xff, sizeof(junk_read));
65   memset(junk_write, 0x00, sizeof(junk_write));
66}
67
68WRITE_LINE_MEMBER(oricext_device::irq_w)
69{
70   connector->irq_w(state);
71}
72
73SLOT_INTERFACE_START(oricext_intf)
74   SLOT_INTERFACE("jasmin", JASMIN)
75   SLOT_INTERFACE("microdisc", MICRODISC)
76SLOT_INTERFACE_END
trunk/src/emu/bus/oricext/jasmin.c
r29567r29568
1#include "jasmin.h"
2#include "formats/oric_dsk.h"
3
4const device_type JASMIN = &device_creator<jasmin_device>;
5
6ROM_START( jasmin )
7   ROM_REGION( 0x800, "jasmin", 0 )
8   ROM_LOAD("jasmin.rom", 0, 0x800, CRC(37220e89) SHA1(70e59b8abd67092f050462abc6cb5271e4c15f01) )
9ROM_END
10
11FLOPPY_FORMATS_MEMBER( jasmin_device::floppy_formats )
12   FLOPPY_ORIC_DSK_FORMAT
13FLOPPY_FORMATS_END
14
15static SLOT_INTERFACE_START( jasmin_floppies )
16   SLOT_INTERFACE( "3dsdd", FLOPPY_3_DSDD )
17SLOT_INTERFACE_END
18
19static MACHINE_CONFIG_FRAGMENT( jasmin )
20   MCFG_WD1770x_ADD("fdc", XTAL_8MHz)
21   MCFG_WD_FDC_DRQ_CALLBACK(WRITELINE(oricext_device, irq_w))
22
23   MCFG_FLOPPY_DRIVE_ADD("fdc:0", jasmin_floppies, "3dsdd", jasmin_device::floppy_formats)
24   MCFG_FLOPPY_DRIVE_ADD("fdc:1", jasmin_floppies, NULL,    jasmin_device::floppy_formats)
25   MCFG_FLOPPY_DRIVE_ADD("fdc:2", jasmin_floppies, NULL,    jasmin_device::floppy_formats)
26   MCFG_FLOPPY_DRIVE_ADD("fdc:3", jasmin_floppies, NULL,    jasmin_device::floppy_formats)
27MACHINE_CONFIG_END
28
29INPUT_PORTS_START( jasmin )
30   PORT_START("JASMIN")
31   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)
32INPUT_PORTS_END
33
34DEVICE_ADDRESS_MAP_START(map, 8, jasmin_device)
35   AM_RANGE(0x3f4, 0x3f7) AM_DEVREADWRITE("fdc", wd1770_t, read, write)
36   AM_RANGE(0x3f8, 0x3f8) AM_WRITE(side_sel_w)
37   AM_RANGE(0x3f9, 0x3f9) AM_WRITE(fdc_reset_w)
38   AM_RANGE(0x3fa, 0x3fa) AM_WRITE(ram_access_w)
39   AM_RANGE(0x3fb, 0x3fb) AM_WRITE(rom_access_w)
40   AM_RANGE(0x3fc, 0x3ff) AM_WRITE(select_w)
41ADDRESS_MAP_END
42
43jasmin_device::jasmin_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) :
44   oricext_device(mconfig, JASMIN, "Jasmin floppy drive interface", tag, owner, clock, "jasmin", __FILE__),
45   fdc(*this, "fdc")
46{
47}
48
49jasmin_device::~jasmin_device()
50{
51}
52
53void jasmin_device::device_start()
54{
55   oricext_device::device_start();
56   astring tempstring;
57   jasmin_rom = device().machine().root_device().memregion(this->subtag(tempstring, "jasmin"))->base();
58   cpu->space(AS_PROGRAM).install_device(0x0000, 0xffff, *this, &jasmin_device::map);
59
60   for(int i=0; i<4; i++) {
61      char name[32];
62      sprintf(name, "fdc:%d", i);
63      floppies[i] = subdevice<floppy_connector>(name)->get_device();
64   }
65}
66
67void jasmin_device::device_reset()
68{
69   side_sel = fdc_reset = ram_access = rom_access = false;
70   select[0] = select[1] = select[2] = select[3] = false;
71   remap();
72   cur_floppy = NULL;
73   fdc->set_floppy(NULL);
74}
75
76const rom_entry *jasmin_device::device_rom_region() const
77{
78   return ROM_NAME( jasmin );
79}
80
81machine_config_constructor jasmin_device::device_mconfig_additions() const
82{
83   return MACHINE_CONFIG_NAME( jasmin );
84}
85
86ioport_constructor jasmin_device::device_input_ports() const
87{
88   return INPUT_PORTS_NAME( jasmin );
89}
90
91void jasmin_device::remap()
92{
93   if(rom_access) {
94      if(ram_access) {
95         bank_c000_r->set_base(ram+0xc000);
96         bank_e000_r->set_base(ram+0xe000);
97         bank_f800_r->set_base(jasmin_rom);
98         bank_c000_w->set_base(ram+0xc000);
99         bank_e000_w->set_base(ram+0xe000);
100         bank_f800_w->set_base(junk_write);
101      } else {
102         bank_c000_r->set_base(junk_read);
103         bank_e000_r->set_base(junk_read);
104         bank_f800_r->set_base(jasmin_rom);
105         bank_c000_w->set_base(junk_write);
106         bank_e000_w->set_base(junk_write);
107         bank_f800_w->set_base(junk_write);
108      }
109   } else {
110      if(ram_access) {
111         bank_c000_r->set_base(ram+0xc000);
112         bank_e000_r->set_base(ram+0xe000);
113         bank_f800_r->set_base(ram+0xf800);
114         bank_c000_w->set_base(ram+0xc000);
115         bank_e000_w->set_base(ram+0xe000);
116         bank_f800_w->set_base(ram+0xf800);
117      } else {
118         bank_c000_r->set_base(rom+0x0000);
119         bank_e000_r->set_base(rom+0x2000);
120         bank_f800_r->set_base(rom+0x3800);
121         bank_c000_w->set_base(junk_write);
122         bank_e000_w->set_base(junk_write);
123         bank_f800_w->set_base(junk_write);
124      }
125   }
126}
127
128INPUT_CHANGED_MEMBER(jasmin_device::boot_pressed)
129{
130   if(newval) {
131      rom_access = true;
132      remap();
133      cpu->reset();
134   }
135}
136
137WRITE8_MEMBER(jasmin_device::side_sel_w)
138{
139   side_sel = data & 1;
140   if(cur_floppy)
141      cur_floppy->ss_w(side_sel);
142}
143
144WRITE8_MEMBER(jasmin_device::fdc_reset_w)
145{
146   if((data & 1) != fdc_reset)
147      fdc->soft_reset();
148   fdc_reset = data & 1;
149}
150
151WRITE8_MEMBER(jasmin_device::ram_access_w)
152{
153   ram_access = data & 1;
154   remap();
155}
156
157WRITE8_MEMBER(jasmin_device::rom_access_w)
158{
159   rom_access = data & 1;
160   remap();
161}
162
163WRITE8_MEMBER(jasmin_device::select_w)
164{
165   select[offset] = data & 1;
166   cur_floppy = NULL;
167   for(int i=0; i != 4; i++)
168      if(select[i]) {
169         cur_floppy = floppies[i];
170         break;
171      }
172   fdc->set_floppy(cur_floppy);
173}
trunk/src/emu/bus/oricext/microdisc.h
r29567r29568
1#ifndef __MICRODISC_H__
2#define __MICRODISC_H__
3
4#include "oricext.h"
5#include "imagedev/floppy.h"
6#include "machine/wd_fdc.h"
7
8extern const device_type MICRODISC;
9
10class microdisc_device : public oricext_device
11{
12public:
13   microdisc_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
14   virtual ~microdisc_device();
15
16   DECLARE_FLOPPY_FORMATS(floppy_formats);
17   DECLARE_ADDRESS_MAP(map, 8);
18   DECLARE_WRITE8_MEMBER(port_314_w);
19   DECLARE_READ8_MEMBER(port_314_r);
20   DECLARE_READ8_MEMBER(port_318_r);
21
22   DECLARE_WRITE_LINE_MEMBER(fdc_irq_w);
23   DECLARE_WRITE_LINE_MEMBER(fdc_drq_w);
24   DECLARE_WRITE_LINE_MEMBER(fdc_hld_w);
25
26protected:
27   enum {
28      P_IRQEN  = 0x01,
29      P_ROMDIS = 0x02,
30      P_DDS    = 0x04,
31      P_DDEN   = 0x08,
32      P_SS     = 0x10,
33      P_DRIVE  = 0x60,
34      P_EPROM  = 0x80
35   };
36
37   required_device<fd1793_t> fdc;
38
39   UINT8 *microdisc_rom;
40   floppy_image_device *floppies[4];
41   UINT8 port_314;
42   bool intrq_state, drq_state, hld_state;
43   
44   virtual void device_start();
45   virtual void device_reset();
46   const rom_entry *device_rom_region() const;
47   machine_config_constructor device_mconfig_additions() const;
48
49   void remap();
50};
51
52#endif
trunk/src/emu/bus/oricext/oricext.h
r29567r29568
1/***************************************************************************
2
3  oric.h - Oric 1/Atmos extension port
4
5***************************************************************************/
6
7#ifndef __ORICEXT_H__
8#define __ORICEXT_H__
9
10#include "emu.h"
11#include "cpu/m6502/m6502.h"
12
13#define MCFG_ORICEXT_ADD(_tag, _slot_intf, _def_slot, _cputag, _irq)   \
14   MCFG_DEVICE_ADD(_tag, ORICEXT_CONNECTOR, 0) \
15   MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false) \
16   downcast<oricext_connector *>(device)->set_cputag(_cputag); \
17   devcb = &oricext_connector::set_irq_handler(*device, DEVCB2_##_irq);
18
19
20class oricext_device;
21
22class oricext_connector: public device_t,
23                   public device_slot_interface
24{
25public:
26   oricext_connector(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
27   virtual ~oricext_connector();
28
29   void set_cputag(const char *tag);
30   template<class _Object> static devcb2_base &set_irq_handler(device_t &device, _Object object) { return downcast<oricext_connector &>(device).irq_handler.set_callback(object); }
31   void irq_w(int state);
32
33protected:
34   devcb2_write_line irq_handler;
35   const char *cputag;
36   virtual void device_start();
37   virtual void device_config_complete();
38};
39
40class oricext_device : public device_t,
41                  public device_slot_card_interface
42{
43public:
44   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);
45
46   void set_cputag(const char *tag);
47   DECLARE_WRITE_LINE_MEMBER(irq_w);
48
49protected:
50   const char *cputag;
51   m6502_device *cpu;
52   oricext_connector *connector;
53   memory_bank *bank_c000_r, *bank_e000_r, *bank_f800_r, *bank_c000_w, *bank_e000_w, *bank_f800_w;
54   UINT8 *rom, *ram;
55   UINT8 junk_read[8192], junk_write[8192];
56
57   virtual void device_start();
58};
59
60extern const device_type ORICEXT_CONNECTOR;
61SLOT_INTERFACE_EXTERN( oricext_intf );
62
63#endif  /* __ORICEXT_H__ */
trunk/src/emu/bus/bus.mak
r29567r29568
10471047BUSOBJS += $(BUSOBJ)/macpds/macpds.o
10481048BUSOBJS += $(BUSOBJ)/macpds/pds_tpdfpd.o
10491049endif
1050
1051#-------------------------------------------------
1052#
1053#@src/emu/bus/oricext/oricext.h,BUSES += ORICEXT
1054#-------------------------------------------------
1055ifneq ($(filter ORICEXT,$(BUSES)),)
1056OBJDIRS += $(BUSOBJ)/oricext
1057BUSOBJS += $(BUSOBJ)/oricext/oricext.o
1058BUSOBJS += $(BUSOBJ)/oricext/jasmin.o
1059BUSOBJS += $(BUSOBJ)/oricext/microdisc.o
1060endif
trunk/src/emu/imagedev/floppy.c
r29567r29568
1616*/
1717
1818// Show step operation
19#define TRACE_STEP 0
19#define TRACE_STEP 1
2020
2121// device type definition
2222const device_type FLOPPY_CONNECTOR = &device_creator<floppy_connector>;
r29567r29568
759759   attotime base;
760760   int splice_pos = find_position(base, when);
761761   image->set_write_splice_position(cyl, ss, splice_pos);
762   logerror("%s: Track %d head %d set splice pos %d\n", tag(), cyl, ss, splice_pos);
763762}
764763
765764UINT32 floppy_image_device::get_form_factor() const
trunk/src/lib/formats/oric_dsk.c
r29567r29568
1// license:BSD-3-Clause
2// copyright-holders:Olivier Galibert
13/*********************************************************************
24
35    formats/oric_dsk.c
r29567r29568
68
79*********************************************************************/
810
9#include <string.h>
11#include "emu.h"
12#include "formats/oric_dsk.h"
1013
11#include "imageutl.h"
12#include "flopimg.h"
13#include "oric_dsk.h"
14#include "basicdsk.h"
15
16
17#define mfm_disk_header_size    0x0100
18#define MFM_ID  "MFM_DISK"
19
20#define TRACK_SIZE_MFM 0x1900
21
22struct mfm_disk_sector_info
14oric_dsk_format::oric_dsk_format()
2315{
24   int id_ptr;
25   int data_ptr;
26   int sector_size;
27   UINT8 ddam;
28};
16}
2917
30struct oricdsk_tag
18const char *oric_dsk_format::name() const
3119{
32   int tracks;
33   int heads;
34   int geometry;
35   int tracksize;
36   int num_sectors;
37   struct mfm_disk_sector_info sector_data[32];
38};
39
40
41static struct oricdsk_tag *get_tag(floppy_image_legacy *floppy)
42{
43   struct oricdsk_tag *tag;
44   tag = (oricdsk_tag *)floppy_tag(floppy);
45   return tag;
20   return "oric_dsk";
4621}
4722
48
49static FLOPPY_IDENTIFY(oric_dsk_identify)
23const char *oric_dsk_format::description() const
5024{
51   UINT8 header[mfm_disk_header_size];
52
53   floppy_image_read(floppy, header, 0, mfm_disk_header_size);
54   if ( memcmp( header, MFM_ID, 8 ) ==0) {
55      UINT32 heads  = pick_integer_le(header, 8, 4);
56      UINT32 tracks = pick_integer_le(header, 12, 4);
57
58      if (floppy_image_size(floppy)==((tracks*heads*TRACK_SIZE_MFM)+mfm_disk_header_size)) {
59         *vote = 100;
60      } else {
61         *vote = 0;
62      }
63   } else {
64      *vote = 0;
65   }
66   return FLOPPY_ERROR_SUCCESS;
25   return "Oric disk image";
6726}
68static int oric_get_track_offset(floppy_image_legacy *floppy,int track, int head)
69{
70   if (get_tag(floppy)->geometry==1) {
71      return mfm_disk_header_size + (get_tag(floppy)->tracksize * track) + (head * get_tag(floppy)->tracksize * get_tag(floppy)->tracks);
72   } else {
73      return mfm_disk_header_size + (get_tag(floppy)->tracksize*((track * get_tag(floppy)->heads)+head));
74   }
75}
7627
77static int oric_get_heads_per_disk(floppy_image_legacy *floppy)
28const char *oric_dsk_format::extensions() const
7829{
79   return get_tag(floppy)->heads;
30   return "dsk";
8031}
8132
82static int oric_get_tracks_per_disk(floppy_image_legacy *floppy)
33bool oric_dsk_format::supports_save() const
8334{
84   return get_tag(floppy)->tracks;
35   return true;
8536}
8637
87static void mfm_info_cache_sector_info(floppy_image_legacy *floppy,int track,int head)
38int oric_dsk_format::identify(io_generic *io, UINT32 form_factor)
8839{
89   UINT8 track_data[TRACK_SIZE_MFM];
40   UINT8 h[256];
41   io_generic_read(io, h, 0, 256);
9042
91   /* initialise these with single density values if single density */
92   UINT8 IdMark = 0x0fe;
93   UINT8 DataMark = 0x0fb;
94   UINT8 DeletedDataMark = 0x0f8;
43   if(memcmp(h, "MFM_DISK", 8))
44      return 0;
9545
96   UINT8 SectorCount;
97   UINT8 SearchCode = 0;
98   UINT8 sector_number = 0;
99   int ptr = 0;
100   int track_offset = oric_get_track_offset(floppy,track,head);
101   floppy_image_read(floppy, track_data, track_offset, TRACK_SIZE_MFM);
102   SectorCount = 0;
46   int sides  = (h[11] << 24) | (h[10] << 16) | (h[ 9] << 8) | h[ 8];
47   int tracks = (h[15] << 24) | (h[14] << 16) | (h[13] << 8) | h[12];
48   int geom   = (h[19] << 24) | (h[18] << 16) | (h[17] << 8) | h[16];
10349
104   do
105   {
106      switch (SearchCode)
107      {
108         /* searching for id's */
109         case 0:
110         {
111            /* found id mark? */
112            if (track_data[ptr] == IdMark)
113            {
114               sector_number  = track_data[ptr+3]-1;
115               /* store pointer to id mark */
116               get_tag(floppy)->sector_data[sector_number].id_ptr = ptr + track_offset;
117               SectorCount++;
50   int size = io_generic_size(io);
51   if(sides < 0 || sides > 2 || geom != 1 || size != 256+6400*sides*tracks)
52      return 0;
11853
119               /* grab N value - used to skip data in data field */
120               get_tag(floppy)->sector_data[sector_number].sector_size = (1<< (track_data[ptr+4]+7));
54   return 100;
55}
12156
122               /* skip past id field and crc */
123               ptr+=7;
57bool oric_dsk_format::load(io_generic *io, UINT32 form_factor, floppy_image *image)
58{
59   UINT8 h[256];
60   UINT8 t[6250+3];
61   UINT32 stream[100000];
12462
125               /* now looking for data field */
126               SearchCode = 1;
127            }
128            else
129            {
130               /* update position */
131               ptr++;
132            }
133         }
134         break;
63   t[6250] = t[6251] = t[6252] = 0;
64   io_generic_read(io, h, 0, 256);
13565
136         /* searching for data id's */
137         case 1:
138         {
139            /* found data or deleted data? */
140            if ((track_data[ptr] == DataMark) || (track_data[ptr] == DeletedDataMark))
141            {
142               /* yes */
143               get_tag(floppy)->sector_data[sector_number].data_ptr = ptr + track_offset + 1;
144               get_tag(floppy)->sector_data[sector_number].ddam = (track_data[ptr] == DeletedDataMark) ? ID_FLAG_DELETED_DATA : 0;
66   int sides  = (h[11] << 24) | (h[10] << 16) | (h[ 9] << 8) | h[ 8];
67   int tracks = (h[15] << 24) | (h[14] << 16) | (h[13] << 8) | h[12];
14568
146               /* skip data field and id */
147               ptr += get_tag(floppy)->sector_data[sector_number].sector_size + 3;
148
149               /* now looking for id field */
150               SearchCode = 0;
69   for(int side=0; side<sides; side++)
70      for(int track=0; track<tracks; track++) {
71         io_generic_read(io, t, 256+6400*(tracks*side + track), 6250);
72         int pos = 0;
73         int sector_size = 128;
74         for(int i=0; i<6250; i++) {
75            if(t[i] == 0xc2 && t[i+1] == 0xc2 && t[i+2] == 0xc2) {
76               raw_w(stream, pos, 16, 0x5224);
77               raw_w(stream, pos, 16, 0x5224);
78               raw_w(stream, pos, 16, 0x5224);
79               i += 2;
80               continue;
15181            }
152            else
153            {
154               ptr++;
82            if(t[i] == 0xa1 && t[i+1] == 0xa1 && t[i+2] == 0xa1) {
83               raw_w(stream, pos, 16, 0x4489);
84               raw_w(stream, pos, 16, 0x4489);
85               raw_w(stream, pos, 16, 0x4489);
86               int copy;
87               if(t[i+3] == 0xfe) {
88                  copy = 7;
89                  sector_size = 128 << (t[i+7] & 3);
90                  logerror("%02x %x - %02x %02x %02x %02x\n",
91                         track, side, t[i+4], t[i+5], t[i+6], t[i+7]);
92               } else if(t[i+3] == 0xfb)
93                  copy = sector_size+3;
94               else
95                  copy = 0;
96               for(int j=0; j<copy; j++)
97                  mfm_w(stream, pos, 8, t[i+3+j]);
98               i += 2+copy;
99               continue;
155100            }
101            mfm_w(stream, pos, 8, t[i]);
156102         }
157         break;
158
159         default:
160            break;
103         generate_track_from_levels(track, side, stream, 100000, 0, image);
161104      }
162   }
163   while (ptr < TRACK_SIZE_MFM);
164   get_tag(floppy)->num_sectors = SectorCount;
165
105   
106   return true;
166107}
167108
168static floperr_t get_offset(floppy_image_legacy *floppy, int head, int track, int sector, int sector_is_index, UINT64 *offset)
109bool oric_dsk_format::save(io_generic *io, floppy_image *image)
169110{
170   UINT64 offs;
171
172   /* translate the sector to a raw sector */
173   if (!sector_is_index)
174   {
175      sector -= 1;
176   }
177   mfm_info_cache_sector_info(floppy,track,head);
178
179   /* check to see if we are out of range */
180   if ((head < 0) || (head >= get_tag(floppy)->heads) || (track < 0) || (track >= get_tag(floppy)->tracks)
181         || (sector < 0) || (sector >=get_tag(floppy)->num_sectors))
182      return FLOPPY_ERROR_SEEKERROR;
183
184   offs = get_tag(floppy)->sector_data[sector].data_ptr;
185   if (offset)
186      *offset = offs;
187   return FLOPPY_ERROR_SUCCESS;
111   return true;
188112}
189113
190
191
192static 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)
193{
194   UINT64 offset;
195   floperr_t err;
196   err = get_offset(floppy, head, track, sector, sector_is_index, &offset);
197   if (err)
198      return err;
199   floppy_image_read(floppy, buffer, offset, buflen);
200   return FLOPPY_ERROR_SUCCESS;
201}
202
203
204
205static 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)
206{
207   UINT64 offset;
208   floperr_t err;
209
210   err = get_offset(floppy, head, track, sector, sector_is_index, &offset);
211   if (err)
212      return err;
213
214   floppy_image_write(floppy, buffer, offset, buflen);
215   return FLOPPY_ERROR_SUCCESS;
216}
217
218
219
220static floperr_t oric_read_sector(floppy_image_legacy *floppy, int head, int track, int sector, void *buffer, size_t buflen)
221{
222   return internal_oric_read_sector(floppy, head, track, sector, FALSE, buffer, buflen);
223}
224
225static floperr_t oric_write_sector(floppy_image_legacy *floppy, int head, int track, int sector, const void *buffer, size_t buflen, int ddam)
226{
227   return internal_oric_write_sector(floppy, head, track, sector, FALSE, buffer, buflen, ddam);
228}
229
230static floperr_t oric_read_indexed_sector(floppy_image_legacy *floppy, int head, int track, int sector, void *buffer, size_t buflen)
231{
232   return internal_oric_read_sector(floppy, head, track, sector, TRUE, buffer, buflen);
233}
234
235static floperr_t oric_write_indexed_sector(floppy_image_legacy *floppy, int head, int track, int sector, const void *buffer, size_t buflen, int ddam)
236{
237   return internal_oric_write_sector(floppy, head, track, sector, TRUE, buffer, buflen, ddam);
238}
239
240static floperr_t oric_get_sector_length(floppy_image_legacy *floppy, int head, int track, int sector, UINT32 *sector_length)
241{
242   floperr_t err;
243   err = get_offset(floppy, head, track, sector, FALSE, NULL);
244   if (err)
245      return err;
246
247   if (sector_length) {
248      *sector_length = get_tag(floppy)->sector_data[sector].sector_size;
249   }
250   return FLOPPY_ERROR_SUCCESS;
251}
252
253
254
255static 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)
256{
257   floperr_t retVal;
258
259   sector_index += 1;
260
261   retVal = oric_get_sector_length(floppy, head, track, sector_index, sector_length);
262   if (sector_length!=NULL) {
263      *sector_length =  get_tag(floppy)->sector_data[sector_index-1].sector_size;
264   }
265   if (cylinder)
266      *cylinder = track;
267   if (side)
268      *side = head;
269   if (sector)
270      *sector = sector_index;
271   if (flags)
272      *flags = get_tag(floppy)->sector_data[sector_index].ddam;
273   return retVal;
274}
275
276
277static FLOPPY_CONSTRUCT(oric_dsk_construct)
278{
279   struct FloppyCallbacks *callbacks;
280   struct oricdsk_tag *tag;
281   UINT8 header[mfm_disk_header_size];
282
283   floppy_image_read(floppy, header, 0, mfm_disk_header_size);
284
285   tag = (struct oricdsk_tag *) floppy_create_tag(floppy, sizeof(struct oricdsk_tag));
286   if (!tag)
287      return FLOPPY_ERROR_OUTOFMEMORY;
288
289   tag->heads   = pick_integer_le(header, 8, 4);
290   tag->tracks  = pick_integer_le(header, 12, 4);
291   tag->geometry = pick_integer_le(header, 16, 4);
292   tag->tracksize = TRACK_SIZE_MFM;
293   memset(tag->sector_data,0,sizeof(tag->sector_data));
294
295   callbacks = floppy_callbacks(floppy);
296   callbacks->read_sector = oric_read_sector;
297   callbacks->write_sector = oric_write_sector;
298   callbacks->read_indexed_sector = oric_read_indexed_sector;
299   callbacks->write_indexed_sector = oric_write_indexed_sector;
300   callbacks->get_sector_length = oric_get_sector_length;
301   callbacks->get_heads_per_disk = oric_get_heads_per_disk;
302   callbacks->get_tracks_per_disk = oric_get_tracks_per_disk;
303   callbacks->get_indexed_sector_info = oric_get_indexed_sector_info;
304   return FLOPPY_ERROR_SUCCESS;
305}
306/* ----------------------------------------------------------------------- */
307
308LEGACY_FLOPPY_OPTIONS_START( oric )
309   LEGACY_FLOPPY_OPTION( oricmfm, "dsk", "Oric MFM floppy disk image", oric_dsk_identify, oric_dsk_construct, NULL, NULL)
310   LEGACY_FLOPPY_OPTION( oric, "dsk", "Oric disk image", basicdsk_identify_default, basicdsk_construct_default, NULL,
311      HEADS([2])
312      TRACKS([80])
313      SECTORS([9])
314      SECTOR_LENGTH([512])
315      FIRST_SECTOR_ID([1]))
316LEGACY_FLOPPY_OPTIONS_END
114const floppy_format_type FLOPPY_ORIC_DSK_FORMAT = &floppy_image_format_creator<oric_dsk_format>;
trunk/src/lib/formats/oric_dsk.h
r29567r29568
1111
1212#include "flopimg.h"
1313
14/**************************************************************************/
14class oric_dsk_format : public floppy_image_format_t
15{
16public:
17   oric_dsk_format();
18   virtual int identify(io_generic *io, UINT32 form_factor);
19   virtual bool load(io_generic *io, UINT32 form_factor, floppy_image *image);
20   virtual bool save(io_generic *io, floppy_image *image);
1521
16LEGACY_FLOPPY_OPTIONS_EXTERN(oric);
22   virtual const char *name() const;
23   virtual const char *description() const;
24   virtual const char *extensions() const;
25   virtual bool supports_save() const;
26};
1727
28extern const floppy_format_type FLOPPY_ORIC_DSK_FORMAT;
29
1830#endif /* ORIC_DSK_H */
trunk/src/lib/formats/mfi_dsk.c
r29567r29568
9999   if(memcmp( h.sign, sign, 16 ) == 0 &&
100100      h.cyl_count <= 160 &&
101101      h.head_count <= 2 &&
102      (!form_factor || h.form_factor == form_factor))
102      (!form_factor || !h.form_factor || h.form_factor == form_factor))
103103      return 100;
104104   return 0;
105105}
trunk/src/mess/drivers/oric.c
r29567r29568
1212    Pravetz is a Bulgarian copy of the Oric Atmos and uses
1313    Apple 2 disc drives for storage.
1414
15    This driver originally by Paul Cook, rewritten by Kevin Thacker.
15    This driver originally by Paul Cook, rewritten by Kevin Thacker,
16   re-rewritten by Olivier Galibert.
1617
1718*********************************************************************/
1819
19#include "includes/oric.h"
20#include "emu.h"
21#include "bus/oricext/oricext.h"
22#include "cpu/m6502/m6502.h"
23#include "sound/ay8910.h"
24#include "sound/wave.h"
25#include "machine/6522via.h"
26#include "machine/mos6551.h"
27#include "bus/centronics/ctronics.h"
28#include "imagedev/floppy.h"
29#include "imagedev/cassette.h"
30#include "machine/wd_fdc.h"
31#include "formats/oric_dsk.h"
32#include "formats/oric_tap.h"
2033
21/*
22    Explanation of memory regions:
34class oric_state : public driver_device
35{
36public:
37   // Permanent attributes (kept from one line to the other) and line
38   // attributes (reset at start of line)
39   enum {
40      PATTR_50HZ  = 0x02,
41      PATTR_HIRES = 0x04,
42      LATTR_ALT   = 0x01,
43      LATTR_DSIZE = 0x02,
44      LATTR_BLINK = 0x04
45   };
2346
24    I have split the memory region &c000-&ffff in this way because:
47   oric_state(const machine_config &mconfig, device_type type, const char *tag)
48      : driver_device(mconfig, type, tag),
49        m_maincpu(*this, "maincpu"),
50        m_psg(*this, "ay8912"),
51        m_centronics(*this, "centronics"),
52        m_cent_data_out(*this, "cent_data_out"),
53        m_cassette(*this, "cassette"),
54        m_via(*this, "via6522"),
55        m_ram(*this, "ram"),
56        m_rom(*this, "maincpu"),
57        m_bank_c000_r(*this, "bank_c000_r"),
58        m_bank_e000_r(*this, "bank_e000_r"),
59        m_bank_f800_r(*this, "bank_f800_r"),
60        m_bank_c000_w(*this, "bank_c000_w"),
61        m_bank_e000_w(*this, "bank_e000_w"),
62        m_bank_f800_w(*this, "bank_f800_w"),
63        m_config(*this, "CONFIG") { }
2564
26    All roms (os, microdisc and jasmin) use the 6502 IRQ vectors at the end
27    of memory &fff8-&ffff, but they are different sizes. The os is 16k, microdisc
28    is 8k and jasmin is 2k.
65   DECLARE_INPUT_CHANGED_MEMBER(nmi_pressed);
66   DECLARE_WRITE8_MEMBER(via_a_w);
67   DECLARE_WRITE8_MEMBER(via_b_w);
68   DECLARE_WRITE_LINE_MEMBER(via_ca2_w);
69   DECLARE_WRITE_LINE_MEMBER(via_cb2_w);
70   DECLARE_WRITE_LINE_MEMBER(via_irq_w);
71   DECLARE_WRITE_LINE_MEMBER(ext_irq_w);
72   DECLARE_WRITE8_MEMBER(psg_a_w);
73   TIMER_DEVICE_CALLBACK_MEMBER(update_tape);
2974
30    There is also 16k of ram at &c000-&ffff which is normally masked
31    by the os rom, but when the microdisc or jasmin interfaces are used,
32    this ram can be accessed. For the microdisc and jasmin, the ram not
33    covered by the roms for these interfaces, can be accessed
34    if it is enabled.
75   virtual void machine_start();
76   virtual void video_start();
77   UINT32 screen_update_oric(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
78   void vblank_w(screen_device &screen, bool state);
3579
36    SMH_BANK(1),SMH_BANK(2) and SMH_BANK(3) are used for a 16k rom.
37    SMH_BANK(2) and SMH_BANK(3) are used for a 8k rom.
38    SMH_BANK(3) is used for a 2k rom.
80protected:
81   required_device<cpu_device> m_maincpu;
82   required_device<ay8910_device> m_psg;
83   required_device<centronics_device> m_centronics;
84   required_device<output_latch_device> m_cent_data_out;
85   required_device<cassette_image_device> m_cassette;
86   required_device<via6522_device> m_via;
87   required_shared_ptr<UINT8> m_ram;
88   optional_memory_region m_rom;
89   required_memory_bank m_bank_c000_r;
90   optional_memory_bank m_bank_e000_r;
91   optional_memory_bank m_bank_f800_r;
92   required_memory_bank m_bank_c000_w;
93   optional_memory_bank m_bank_e000_w;
94   optional_memory_bank m_bank_f800_w;
95   required_ioport m_config;
96   ioport_port *m_kbd_row[8];
3997
40    0x0300-0x03ff is I/O access. It is not defined below because the
41    memory is setup dynamically depending on hardware that has been selected (microdisc, jasmin, apple2) etc.
98   int m_blink_counter;
99   UINT8 m_pattr;
100   UINT8 m_via_a, m_via_b, m_psg_a;
101   bool m_via_ca2, m_via_cb2, m_via_irq;
102   bool m_ext_irq;
42103
43*/
104   virtual void update_irq();
105   void update_psg(address_space &space);
106   void update_keyboard();
107   void machine_start_common();
108};
44109
110class telestrat_state : public oric_state
111{
112public:
113   telestrat_state(const machine_config &mconfig, device_type type, const char *tag) :
114      oric_state(mconfig, type, tag),
115      m_via2(*this, "via6522_2"),
116      m_fdc(*this, "fdc"),
117      m_telmatic(*this, "telmatic"),
118      m_teleass(*this, "teleass"),
119      m_hyperbas(*this, "hyperbas"),
120      m_telmon24(*this, "telmon24"),
121      m_joy1(*this, "JOY1"),
122      m_joy2(*this, "JOY2")
123 { }
45124
125   DECLARE_WRITE8_MEMBER(via2_a_w);
126   DECLARE_WRITE8_MEMBER(via2_b_w);
127   DECLARE_WRITE_LINE_MEMBER(via2_ca2_w);
128   DECLARE_WRITE_LINE_MEMBER(via2_cb2_w);
129   DECLARE_WRITE_LINE_MEMBER(via2_irq_w);
130   DECLARE_WRITE8_MEMBER(port_314_w);
131   DECLARE_READ8_MEMBER(port_314_r);
132   DECLARE_READ8_MEMBER(port_318_r);
133
134   DECLARE_WRITE_LINE_MEMBER(acia_irq_w);
135
136   DECLARE_WRITE_LINE_MEMBER(fdc_irq_w);
137   DECLARE_WRITE_LINE_MEMBER(fdc_drq_w);
138   DECLARE_WRITE_LINE_MEMBER(fdc_hld_w);
139
140   DECLARE_FLOPPY_FORMATS(floppy_formats);
141
142   virtual void machine_start();
143   virtual void machine_reset();
144
145protected:
146   enum {
147      P_IRQEN  = 0x01,
148      P_DDS    = 0x04,
149      P_DDEN   = 0x08,
150      P_SS     = 0x10,
151      P_DRIVE  = 0x60
152   };
153
154   required_device<via6522_device> m_via2;
155   required_device<fd1793_t> m_fdc;
156   required_memory_region m_telmatic;
157   required_memory_region m_teleass;
158   required_memory_region m_hyperbas;
159   required_memory_region m_telmon24;
160   required_ioport m_joy1;
161   required_ioport m_joy2;
162
163   floppy_image_device *m_floppies[4];
164   UINT8 m_port_314;
165   UINT8 m_via2_a, m_via2_b;
166   bool m_via2_ca2, m_via2_cb2, m_via2_irq;
167   bool m_acia_irq;
168   bool m_fdc_irq, m_fdc_drq, m_fdc_hld;
169
170   UINT8 m_junk_read[0x4000], m_junk_write[0x4000];
171
172   virtual void update_irq();
173   void remap();
174};
175
176/* Ram is 64K, with 16K hidden by the rom.  The 300-3ff is also hidden by the i/o */
46177static ADDRESS_MAP_START(oric_mem, AS_PROGRAM, 8, oric_state )
47   AM_RANGE( 0x0000, 0xbfff) AM_RAM AM_SHARE("ram")
48   AM_RANGE( 0xc000, 0xdfff) AM_READ_BANK("bank1") AM_WRITE_BANK("bank5")
49   AM_RANGE( 0xe000, 0xf7ff) AM_READ_BANK("bank2") AM_WRITE_BANK("bank6")
50   AM_RANGE( 0xf800, 0xffff) AM_READ_BANK("bank3") AM_WRITE_BANK("bank7")
178   AM_RANGE( 0x0300, 0x030f) AM_DEVREADWRITE("via6522", via6522_device, read, write) AM_MIRROR(0xf0)
179   AM_RANGE( 0xc000, 0xdfff) AM_READ_BANK("bank_c000_r") AM_WRITE_BANK("bank_c000_w")
180   AM_RANGE( 0xe000, 0xf7ff) AM_READ_BANK("bank_e000_r") AM_WRITE_BANK("bank_e000_w")
181   AM_RANGE( 0xf800, 0xffff) AM_READ_BANK("bank_f800_r") AM_WRITE_BANK("bank_f800_w")
182   AM_RANGE( 0x0000, 0xffff) AM_RAM AM_SHARE("ram")
51183ADDRESS_MAP_END
52184
53185/*
54186The telestrat has the memory regions split into 16k blocks.
55187Memory region &c000-&ffff can be ram or rom. */
56static ADDRESS_MAP_START(telestrat_mem, AS_PROGRAM, 8, oric_state )
57   AM_RANGE( 0x0000, 0x02ff) AM_RAM
58   AM_RANGE( 0x0300, 0x030f) AM_DEVREADWRITE("via6522_0", via6522_device, read, write)
59   AM_RANGE( 0x0310, 0x031b) AM_READWRITE(oric_microdisc_r, oric_microdisc_w )
188static ADDRESS_MAP_START(telestrat_mem, AS_PROGRAM, 8, telestrat_state )
189   AM_RANGE( 0x0300, 0x030f) AM_DEVREADWRITE("via6522", via6522_device, read, write)
190   AM_RANGE( 0x0310, 0x0313) AM_DEVREADWRITE("fdc", fd1793_t, read, write)
191   AM_RANGE( 0x0314, 0x0314) AM_READWRITE(port_314_r, port_314_w)
192   AM_RANGE( 0x0318, 0x0318) AM_READ(port_318_r)
60193   AM_RANGE( 0x031c, 0x031f) AM_DEVREADWRITE("acia", mos6551_device, read, write)
61   AM_RANGE( 0x0320, 0x032f) AM_DEVREADWRITE("via6522_1", via6522_device, read, write)
62   AM_RANGE( 0x0400, 0xbfff) AM_RAM
63   AM_RANGE( 0xc000, 0xffff) AM_READ_BANK("bank1") AM_WRITE_BANK("bank2")
194   AM_RANGE( 0x0320, 0x032f) AM_DEVREADWRITE("via6522_2", via6522_device, read, write)
195   AM_RANGE( 0xc000, 0xffff) AM_READ_BANK("bank_c000_r") AM_WRITE_BANK("bank_c000_w")
196   AM_RANGE( 0x0000, 0xffff) AM_RAM AM_SHARE("ram")
64197ADDRESS_MAP_END
65198
199UINT32 oric_state::screen_update_oric(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
200{
201   static const UINT32 colors[8] = {
202      0x000000,
203      0xff0000,
204      0x00ff00,
205      0xffff00,
206      0x0000ff,
207      0xff00ff,
208      0x00ffff,
209      0xffffff
210   };
66211
212   bool blink_state = m_blink_counter & 0x20;
213   m_blink_counter = (m_blink_counter + 1) & 0x3f;
214
215   UINT8 pattr = m_pattr;
216
217   for(int y=0; y<224; y++) {
218      // Line attributes and current colors
219      UINT8 lattr = 0;
220      UINT32 fgcol = colors[7];
221      UINT32 bgcol = colors[0];
222
223      UINT32 *p = &bitmap.pix32(y);
224
225      for(int x=0; x<40; x++) {
226         // Lookup the byte and, if needed, the pattern data
227         UINT8 ch, pat;
228         if((pattr & PATTR_HIRES) && y < 200)
229            ch = pat = m_ram[0xa000 + y*40 + x];
230
231         else {
232            ch = m_ram[0xbb80 + (y>>3)*40 + x];
233            int off = (lattr & LATTR_DSIZE ? y >> 1 : y ) & 7;
234            const UINT8 *base;
235            if(pattr & PATTR_HIRES)
236               if(lattr & LATTR_ALT)
237                  base = m_ram + 0x9c00;
238               else
239                  base = m_ram + 0x9800;
240            else
241               if(lattr & LATTR_ALT)
242                  base = m_ram + 0xb800;
243               else
244                  base = m_ram + 0xb400;
245            pat = base[((ch & 0x7f) << 3) | off];
246         }
247
248         // Handle state-chaging attributes
249         if(!(ch & 0x60)) {
250            pat = 0x00;
251            switch(ch & 0x18) {
252            case 0x00: fgcol = colors[ch & 7]; break;
253            case 0x08: lattr = ch & 7; break;
254            case 0x10: bgcol = colors[ch & 7]; break;
255            case 0x18: pattr = ch & 7; break;
256            }
257         }
258
259         // Pick up the colors for the pattern
260         UINT32 c_fgcol = fgcol;
261         UINT32 c_bgcol = bgcol;
262
263         //    inverse video
264         if(ch & 0x80) {
265            c_bgcol = c_bgcol ^ 0xffffff;
266            c_fgcol = c_fgcol ^ 0xffffff;
267         }
268         //    blink
269         if((lattr & LATTR_BLINK) && blink_state)
270            c_fgcol = c_bgcol;
271
272         // Draw the pattern
273         *p++ = pat & 0x20 ? c_fgcol : c_bgcol;
274         *p++ = pat & 0x10 ? c_fgcol : c_bgcol;
275         *p++ = pat & 0x08 ? c_fgcol : c_bgcol;
276         *p++ = pat & 0x04 ? c_fgcol : c_bgcol;
277         *p++ = pat & 0x02 ? c_fgcol : c_bgcol;
278         *p++ = pat & 0x01 ? c_fgcol : c_bgcol;
279      }
280   }
281
282   m_pattr = pattr;
283
284   return 0;
285}
286
287void oric_state::update_keyboard()
288{
289   m_via->write_pb3((m_kbd_row[m_via_b & 7]->read() | m_psg_a) != 0xff);
290}
291
292void oric_state::update_psg(address_space &space)
293{
294   if(m_via_ca2)
295      if(m_via_cb2)
296         m_psg->address_w(space, 0, m_via_a);
297      else
298         m_via->write_pa(space, 0, m_psg->data_r(space, 0));
299   else if(m_via_cb2)
300      m_psg->data_w(space, 0, m_via_a);
301}
302
303void oric_state::update_irq()
304{
305   m_maincpu->set_input_line(m6502_device::IRQ_LINE, m_via_irq || m_ext_irq ? ASSERT_LINE : CLEAR_LINE);
306}
307
308INPUT_CHANGED_MEMBER(oric_state::nmi_pressed)
309{
310   m_maincpu->set_input_line(m6502_device::NMI_LINE, newval ? ASSERT_LINE : CLEAR_LINE);   
311}
312
313WRITE8_MEMBER(oric_state::via_a_w)
314{
315   m_via_a = data;
316   m_cent_data_out->write(space, 0, m_via_a);
317   update_psg(space);
318}
319
320WRITE8_MEMBER(oric_state::via_b_w)
321{
322   m_via_b = data;
323   update_keyboard();
324   m_centronics->write_strobe(data & 0x10 ? 1 : 0);
325   m_cassette->change_state(data & 0x40 ? CASSETTE_MOTOR_ENABLED : CASSETTE_MOTOR_DISABLED,
326                      CASSETTE_MOTOR_DISABLED);
327   m_cassette->output(data & 0x80 ? -1.0 : +1.0);
328}
329
330WRITE_LINE_MEMBER(oric_state::via_ca2_w)
331{
332   m_via_ca2 = state;
333   update_psg(m_maincpu->space(AS_PROGRAM));
334}
335
336WRITE_LINE_MEMBER(oric_state::via_cb2_w)
337{
338   m_via_cb2 = state;
339   update_psg(m_maincpu->space(AS_PROGRAM));
340}
341
342WRITE_LINE_MEMBER(oric_state::via_irq_w)
343{
344   m_via_irq = state;
345   update_irq();
346}
347
348WRITE_LINE_MEMBER(oric_state::ext_irq_w)
349{
350   m_ext_irq = state;
351   update_irq();
352}
353
354WRITE8_MEMBER(oric_state::psg_a_w)
355{
356   m_psg_a = data;
357   update_keyboard();
358}
359
360TIMER_DEVICE_CALLBACK_MEMBER(oric_state::update_tape)
361{
362   if(!m_config->read())
363      m_via->write_cb1(m_cassette->input() > 0.0038);
364}
365
366void oric_state::vblank_w(screen_device &screen, bool state)
367{
368   if(m_config->read())
369      m_via->write_cb1(state);
370}
371
372void oric_state::video_start()
373{
374   m_blink_counter = 0;
375   m_pattr = 0;
376}
377
378void oric_state::machine_start_common()
379{
380   m_via_a = 0xff;
381   m_via_b = 0xff;
382   m_psg_a = 0x00;
383   m_via_ca2 = false;
384   m_via_cb2 = false;
385   m_via_irq = false;
386   m_ext_irq = false;
387
388   for(int i=0; i<8; i++) {
389      char name[10];
390      sprintf(name, "ROW%d", i);
391      m_kbd_row[i] = machine().root_device().ioport(name);
392   }
393}
394
395void oric_state::machine_start()
396{
397   machine_start_common();
398   m_bank_c000_r->set_base(m_rom->base());
399   m_bank_e000_r->set_base(m_rom->base() + 0x2000);
400   m_bank_f800_r->set_base(m_rom->base() + 0x3800);
401}
402
403
404void telestrat_state::machine_start()
405{
406   machine_start_common();
407   for(int i=0; i<4; i++) {
408      char name[32];
409      sprintf(name, "fdc:%d", i);
410      m_floppies[i] = subdevice<floppy_connector>(name)->get_device();
411   }
412   m_fdc_irq = m_fdc_drq = m_fdc_hld = false;
413   m_acia_irq = false;
414
415   memset(m_junk_read, 0x00, sizeof(m_junk_read));
416   memset(m_junk_write, 0x00, sizeof(m_junk_write));
417}
418
419void telestrat_state::machine_reset()
420{
421   m_port_314 = 0x00;
422   m_via2_a = 0xff;
423   remap();
424}
425
426void telestrat_state::update_irq()
427{
428   m_maincpu->set_input_line(m6502_device::IRQ_LINE,
429                       m_via_irq ||
430                       m_ext_irq ||
431                       (m_fdc_irq && (m_port_314 & P_IRQEN)) ||
432                       m_via2_irq ||
433                       m_acia_irq ? ASSERT_LINE : CLEAR_LINE);
434}
435
436WRITE8_MEMBER(telestrat_state::via2_a_w)
437{
438   m_via2_a = data;
439   remap();
440}
441
442WRITE8_MEMBER(telestrat_state::via2_b_w)
443{
444   m_via2_b = data;
445   UINT8 port = 0xff;
446   if(!(m_via2_b & 0x40))
447      port &= m_joy1->read();
448   if(!(m_via2_b & 0x80))
449      port &= m_joy2->read();
450
451   m_via2->write_pb(space, 0, port);
452}
453
454WRITE_LINE_MEMBER(telestrat_state::via2_ca2_w)
455{
456   m_via2_ca2 = state;
457}
458
459WRITE_LINE_MEMBER(telestrat_state::via2_cb2_w)
460{
461   m_via2_cb2 = state;
462}
463
464WRITE_LINE_MEMBER(telestrat_state::via2_irq_w)
465{
466   m_via2_irq = state;
467   update_irq();
468}
469
470WRITE8_MEMBER(telestrat_state::port_314_w)
471{
472   m_port_314 = data;
473   floppy_image_device *floppy = m_floppies[(m_port_314 >> 5) & 3];
474   m_fdc->set_floppy(floppy);
475   m_fdc->dden_w(m_port_314 & P_DDEN);
476   if(floppy) {
477      floppy->ss_w(m_port_314 & P_SS ? 1 : 0);
478      floppy->mon_w(0);
479   }
480   update_irq();
481}
482
483READ8_MEMBER(telestrat_state::port_314_r)
484{
485   return (m_fdc_irq && (m_port_314 & P_IRQEN)) ? 0x7f : 0xff;
486}
487
488READ8_MEMBER(telestrat_state::port_318_r)
489{
490   return m_fdc_drq ? 0x7f : 0xff;
491}
492
493
494WRITE_LINE_MEMBER(telestrat_state::acia_irq_w)
495{
496   m_acia_irq = state;
497   update_irq();
498}
499
500WRITE_LINE_MEMBER(telestrat_state::fdc_irq_w)
501{
502   m_fdc_irq = state;
503   update_irq();
504}
505
506WRITE_LINE_MEMBER(telestrat_state::fdc_drq_w)
507{
508   m_fdc_drq = state;
509}
510
511WRITE_LINE_MEMBER(telestrat_state::fdc_hld_w)
512{
513   m_fdc_hld = state;
514}
515
516void telestrat_state::remap()
517{
518   // Theorically, these are cartridges.  There's no real point to
519   // making them configurable, when only 4 existed and there are 7
520   // slots.
521
522   switch(m_via2_a & 7) {
523   case 0:
524      m_bank_c000_r->set_base(m_ram+0xc000);
525      m_bank_c000_w->set_base(m_ram+0xc000);
526      break;
527   case 1:
528   case 2:
529   case 3:
530      m_bank_c000_r->set_base(m_junk_read);
531      m_bank_c000_w->set_base(m_junk_write);
532      break;
533   case 4:
534      m_bank_c000_r->set_base(m_telmatic->base());
535      m_bank_c000_w->set_base(m_junk_write);
536      break;
537   case 5:
538      m_bank_c000_r->set_base(m_teleass->base());
539      m_bank_c000_w->set_base(m_junk_write);
540      break;
541   case 6:
542      m_bank_c000_r->set_base(m_hyperbas->base());
543      m_bank_c000_w->set_base(m_junk_write);
544      break;
545   case 7:
546      m_bank_c000_r->set_base(m_telmon24->base());
547      m_bank_c000_w->set_base(m_junk_write);
548      break;
549   }
550}
551
552
553
67554static INPUT_PORTS_START(oric)
68555   PORT_START("ROW0")
69   PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_3)           PORT_CHAR('3') PORT_CHAR('#')
70   PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_X)           PORT_CHAR('x') PORT_CHAR('X')
71   PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_1)           PORT_CHAR('1') PORT_CHAR('!')
72   PORT_BIT(0x10, 0x00, IPT_UNUSED)
73   PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_V)           PORT_CHAR('v') PORT_CHAR('V')
74   PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_5)           PORT_CHAR('5') PORT_CHAR('%')
75   PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_N)           PORT_CHAR('n') PORT_CHAR('N')
76   PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_7)           PORT_CHAR('7') PORT_CHAR('&')
556   PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_3)           PORT_CHAR('3') PORT_CHAR('#')
557   PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_X)           PORT_CHAR('x') PORT_CHAR('X')
558   PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_1)           PORT_CHAR('1') PORT_CHAR('!')
559   PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_UNUSED)
560   PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_V)           PORT_CHAR('v') PORT_CHAR('V')
561   PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_5)           PORT_CHAR('5') PORT_CHAR('%')
562   PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_N)           PORT_CHAR('n') PORT_CHAR('N')
563   PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_7)           PORT_CHAR('7') PORT_CHAR('&')
77564
78565   PORT_START("ROW1")
79   PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_D)           PORT_CHAR('d') PORT_CHAR('D')
80   PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_Q)           PORT_CHAR('q') PORT_CHAR('Q')
81   PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_TAB)         PORT_CHAR(UCHAR_MAMEKEY(ESC))
82   PORT_BIT(0x10, 0x00, IPT_UNUSED)
83   PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_F)           PORT_CHAR('f') PORT_CHAR('F')
84   PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_R)           PORT_CHAR('r') PORT_CHAR('R')
85   PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_T)           PORT_CHAR('t') PORT_CHAR('T')
86   PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_J)           PORT_CHAR('j') PORT_CHAR('J')
566   PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_D)           PORT_CHAR('d') PORT_CHAR('D')
567   PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_Q)           PORT_CHAR('q') PORT_CHAR('Q')
568   PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_TAB)         PORT_CHAR(UCHAR_MAMEKEY(ESC))
569   PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_UNUSED)
570   PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_F)           PORT_CHAR('f') PORT_CHAR('F')
571   PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_R)           PORT_CHAR('r') PORT_CHAR('R')
572   PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_T)           PORT_CHAR('t') PORT_CHAR('T')
573   PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_J)           PORT_CHAR('j') PORT_CHAR('J')
87574
88575   PORT_START("ROW2")
89   PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_C)           PORT_CHAR('c') PORT_CHAR('C')
90   PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_2)           PORT_CHAR('2') PORT_CHAR('@')
91   PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_Z)           PORT_CHAR('z') PORT_CHAR('Z')
92   PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_LCONTROL) PORT_CODE(KEYCODE_LCONTROL) PORT_CHAR(UCHAR_SHIFT_2)
93   PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_4)           PORT_CHAR('4') PORT_CHAR('$')
94   PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_B)           PORT_CHAR('b') PORT_CHAR('B')
95   PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_6)           PORT_CHAR('6') PORT_CHAR('^')
96   PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_M)           PORT_CHAR('m') PORT_CHAR('M')
576   PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_C)           PORT_CHAR('c') PORT_CHAR('C')
577   PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_2)           PORT_CHAR('2') PORT_CHAR('@')
578   PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_Z)           PORT_CHAR('z') PORT_CHAR('Z')
579   PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_LCONTROL) PORT_CODE(KEYCODE_LCONTROL) PORT_CHAR(UCHAR_SHIFT_2)
580   PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_4)           PORT_CHAR('4') PORT_CHAR('$')
581   PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_B)           PORT_CHAR('b') PORT_CHAR('B')
582   PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_6)           PORT_CHAR('6') PORT_CHAR('^')
583   PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_M)           PORT_CHAR('m') PORT_CHAR('M')
97584
98585   PORT_START("ROW3")
99   PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_QUOTE)       PORT_CHAR('\'') PORT_CHAR('"')
100   PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_BACKSLASH2)  PORT_CHAR('\\') PORT_CHAR('|')
101   PORT_BIT(0x20, 0x00, IPT_UNUSED)
102   PORT_BIT(0x10, 0x00, IPT_UNUSED)
103   PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_MINUS)       PORT_CHAR('-') PORT_CHAR('\xA3')
104   PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_COLON)       PORT_CHAR(';') PORT_CHAR(':')
105   PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_9)           PORT_CHAR('9') PORT_CHAR('(')
106   PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_K)           PORT_CHAR('k') PORT_CHAR('K')
586   PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_QUOTE)       PORT_CHAR('\'') PORT_CHAR('"')
587   PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_BACKSLASH2)  PORT_CHAR('\\') PORT_CHAR('|')
588   PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_UNUSED)
589   PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_UNUSED)
590   PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_MINUS)       PORT_CHAR('-') PORT_CHAR('\xA3')
591   PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_COLON)       PORT_CHAR(';') PORT_CHAR(':')
592   PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_9)           PORT_CHAR('9') PORT_CHAR('(')
593   PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_K)           PORT_CHAR('k') PORT_CHAR('K')
107594
108595   PORT_START("ROW4")
109   PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_RIGHT)       PORT_CHAR(UCHAR_MAMEKEY(RIGHT))
110   PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_DOWN)        PORT_CHAR(UCHAR_MAMEKEY(DOWN))
111   PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_LEFT)        PORT_CHAR(UCHAR_MAMEKEY(LEFT))
112   PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_LSHIFT)      PORT_CHAR(UCHAR_MAMEKEY(LSHIFT))
113   PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_UP)          PORT_CHAR(UCHAR_MAMEKEY(UP))
114   PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_STOP)        PORT_CHAR('.') PORT_CHAR('>')
115   PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_COMMA)       PORT_CHAR(',') PORT_CHAR('<')
116   PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_SPACE)       PORT_CHAR(' ')
596   PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_RIGHT)       PORT_CHAR(UCHAR_MAMEKEY(RIGHT))
597   PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_DOWN)        PORT_CHAR(UCHAR_MAMEKEY(DOWN))
598   PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_LEFT)        PORT_CHAR(UCHAR_MAMEKEY(LEFT))
599   PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_LSHIFT)      PORT_CHAR(UCHAR_MAMEKEY(LSHIFT))
600   PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_UP)          PORT_CHAR(UCHAR_MAMEKEY(UP))
601   PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_STOP)        PORT_CHAR('.') PORT_CHAR('>')
602   PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_COMMA)       PORT_CHAR(',') PORT_CHAR('<')
603   PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_SPACE)       PORT_CHAR(' ')
117604
118605   PORT_START("ROW5")
119   PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_OPENBRACE)   PORT_CHAR('[') PORT_CHAR('{')
120   PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_CLOSEBRACE)  PORT_CHAR(']') PORT_CHAR('}')
121   PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Del") PORT_CODE(KEYCODE_BACKSPACE) PORT_CHAR(8)
122   PORT_BIT(0x10, 0x00, IPT_UNUSED)
123   PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_P)           PORT_CHAR('p') PORT_CHAR('P')
124   PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_O)           PORT_CHAR('o') PORT_CHAR('O')
125   PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_I)           PORT_CHAR('i') PORT_CHAR('I')
126   PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_U)           PORT_CHAR('u') PORT_CHAR('U')
606   PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_OPENBRACE)   PORT_CHAR('[') PORT_CHAR('{')
607   PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_CLOSEBRACE)  PORT_CHAR(']') PORT_CHAR('}')
608   PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Del") PORT_CODE(KEYCODE_BACKSPACE) PORT_CHAR(8)
609   PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_UNUSED)
610   PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_P)           PORT_CHAR('p') PORT_CHAR('P')
611   PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_O)           PORT_CHAR('o') PORT_CHAR('O')
612   PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_I)           PORT_CHAR('i') PORT_CHAR('I')
613   PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_U)           PORT_CHAR('u') PORT_CHAR('U')
127614
128615   PORT_START("ROW6")
129   PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_W)           PORT_CHAR('w') PORT_CHAR('W')
130   PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_S)           PORT_CHAR('s') PORT_CHAR('S')
131   PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_A)           PORT_CHAR('a') PORT_CHAR('A')
132   PORT_BIT(0x10, 0x00, IPT_UNUSED)
133   PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_E)           PORT_CHAR('e') PORT_CHAR('E')
134   PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_G)           PORT_CHAR('g') PORT_CHAR('G')
135   PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_H)           PORT_CHAR('h') PORT_CHAR('H')
136   PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_Y)           PORT_CHAR('y') PORT_CHAR('Y')
616   PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_W)           PORT_CHAR('w') PORT_CHAR('W')
617   PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_S)           PORT_CHAR('s') PORT_CHAR('S')
618   PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_A)           PORT_CHAR('a') PORT_CHAR('A')
619   PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_UNUSED)
620   PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_E)           PORT_CHAR('e') PORT_CHAR('E')
621   PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_G)           PORT_CHAR('g') PORT_CHAR('G')
622   PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_H)           PORT_CHAR('h') PORT_CHAR('H')
623   PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_Y)           PORT_CHAR('y') PORT_CHAR('Y')
137624
138625   PORT_START("ROW7")
139   PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_EQUALS)      PORT_CHAR('=') PORT_CHAR('+')
140   PORT_BIT(0x40, 0x00, IPT_UNUSED)
141   PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Return") PORT_CODE(KEYCODE_ENTER) PORT_CHAR(13)
142   PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_RSHIFT)      PORT_CHAR(UCHAR_MAMEKEY(RSHIFT))
143   PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_SLASH)       PORT_CHAR('/') PORT_CHAR('?')
144   PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_0)           PORT_CHAR('0') PORT_CHAR(')')
145   PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_L)           PORT_CHAR('l') PORT_CHAR('L')
146   PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_8)           PORT_CHAR('8') PORT_CHAR('*')
626   PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_EQUALS)      PORT_CHAR('=') PORT_CHAR('+')
627   PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_UNUSED)
628   PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Return") PORT_CODE(KEYCODE_ENTER) PORT_CHAR(13)
629   PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_RSHIFT)      PORT_CHAR(UCHAR_MAMEKEY(RSHIFT))
630   PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_SLASH)       PORT_CHAR('/') PORT_CHAR('?')
631   PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_0)           PORT_CHAR('0') PORT_CHAR(')')
632   PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_L)           PORT_CHAR('l') PORT_CHAR('L')
633   PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_8)           PORT_CHAR('8') PORT_CHAR('*')
147634
148   PORT_START("FLOPPY")
149   /* floppy interface  */
150   PORT_CONFNAME( 0x03, 0x00, "Floppy disc interface" )
151   PORT_CONFSETTING(    0x00, DEF_STR( None ) )
152   PORT_CONFSETTING(    0x01, "Microdisc" )
153   PORT_CONFSETTING(    0x02, "Jasmin" )
154/*  PORT_CONFSETTING(    0x03, "Low 8D DOS" ) */
155/*  PORT_CONFSETTING(    0x04, "High 8D DOS" ) */
635   PORT_START("NMI")
636   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)
156637
157638   /* vsync cable hardware. This is a simple cable connected to the video output
158639   to the monitor/television. The sync signal is connected to the cassette input
159640   allowing interrupts to be generated from the vsync signal. */
160   PORT_CONFNAME(0x08, 0x00, "Vsync cable hardware")
161   PORT_CONFSETTING(   0x00, DEF_STR( Off ) )
162   PORT_CONFSETTING(   0x08, DEF_STR( On ) )
163   PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_CUSTOM) PORT_VBLANK("screen")
641   PORT_START("CONFIG")
642   PORT_CONFNAME(0x01, 0x00, "Tape input")
643   PORT_CONFSETTING(   0x00, "Tape")
644   PORT_CONFSETTING(   0x01, "VSync cable")
164645INPUT_PORTS_END
165646
166647static INPUT_PORTS_START(orica)
167648   PORT_INCLUDE( oric )
168649
169650   PORT_MODIFY("ROW5")
170   PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Funct") PORT_CODE(KEYCODE_END) PORT_CHAR(UCHAR_MAMEKEY(F1))
651   PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Funct") PORT_CODE(KEYCODE_LALT) PORT_CHAR(UCHAR_MAMEKEY(LALT))
171652INPUT_PORTS_END
172653
173654static INPUT_PORTS_START(prav8d)
174655   PORT_START("ROW0")
175   PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_3)                                   PORT_CHAR('3') PORT_CHAR('#')
176   PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("X \xd0\xac") PORT_CODE(KEYCODE_X)           PORT_CHAR('X')
177   PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_1)                                   PORT_CHAR('1') PORT_CHAR('!')
178   PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_UNUSED)
179   PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("V \xd0\x96") PORT_CODE(KEYCODE_V)           PORT_CHAR('V')
180   PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_5)                                   PORT_CHAR('5') PORT_CHAR('%')
181   PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("N \xd0\x9d") PORT_CODE(KEYCODE_N)           PORT_CHAR('N')
182   PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_7)                                   PORT_CHAR('7') PORT_CHAR('\'')
656   PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_3)                                   PORT_CHAR('3') PORT_CHAR('#')
657   PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("X \xd0\xac") PORT_CODE(KEYCODE_X)           PORT_CHAR('X')
658   PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_1)                                   PORT_CHAR('1') PORT_CHAR('!')
659   PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_UNUSED)
660   PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("V \xd0\x96") PORT_CODE(KEYCODE_V)           PORT_CHAR('V')
661   PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_5)                                   PORT_CHAR('5') PORT_CHAR('%')
662   PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("N \xd0\x9d") PORT_CODE(KEYCODE_N)           PORT_CHAR('N')
663   PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_7)                                   PORT_CHAR('7') PORT_CHAR('\'')
183664
184665   PORT_START("ROW1")
185   PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("D \xd0\x94") PORT_CODE(KEYCODE_D)           PORT_CHAR('D')
186   PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Q \xd0\xaf") PORT_CODE(KEYCODE_Q)           PORT_CHAR('Q')
187   PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Esc") PORT_CODE(KEYCODE_ESC)                PORT_CHAR(UCHAR_MAMEKEY(ESC))
188   PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_UNUSED)
189   PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("F \xd0\xa4") PORT_CODE(KEYCODE_F)           PORT_CHAR('F')
190   PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("R \xd0\xa0") PORT_CODE(KEYCODE_R)           PORT_CHAR('R')
191   PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("T \xd0\xa2") PORT_CODE(KEYCODE_T)           PORT_CHAR('T')
192   PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("J \xd0\x99") PORT_CODE(KEYCODE_J)           PORT_CHAR('J')
666   PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("D \xd0\x94") PORT_CODE(KEYCODE_D)           PORT_CHAR('D')
667   PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Q \xd0\xaf") PORT_CODE(KEYCODE_Q)           PORT_CHAR('Q')
668   PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Esc") PORT_CODE(KEYCODE_ESC)                PORT_CHAR(UCHAR_MAMEKEY(ESC))
669   PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_UNUSED)
670   PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("F \xd0\xa4") PORT_CODE(KEYCODE_F)           PORT_CHAR('F')
671   PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("R \xd0\xa0") PORT_CODE(KEYCODE_R)           PORT_CHAR('R')
672   PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("T \xd0\xa2") PORT_CODE(KEYCODE_T)           PORT_CHAR('T')
673   PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("J \xd0\x99") PORT_CODE(KEYCODE_J)           PORT_CHAR('J')
193674
194675   PORT_START("ROW2")
195   PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("C \xd0\xa6") PORT_CODE(KEYCODE_C)           PORT_CHAR('C')
196   PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_2)                                   PORT_CHAR('2') PORT_CHAR('"')
197   PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Z \xd0\x97") PORT_CODE(KEYCODE_Z)           PORT_CHAR('Z')
198   PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("MK") PORT_CODE(KEYCODE_LCONTROL) PORT_CODE(KEYCODE_LCONTROL) PORT_CHAR(UCHAR_SHIFT_2)
199   PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_4)                                   PORT_CHAR('4') PORT_CHAR('$')
200   PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("B \xd0\x91") PORT_CODE(KEYCODE_B)           PORT_CHAR('B')
201   PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_6)                                   PORT_CHAR('6') PORT_CHAR('&')
202   PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("M \xd0\x9c") PORT_CODE(KEYCODE_M)           PORT_CHAR('M')
676   PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("C \xd0\xa6") PORT_CODE(KEYCODE_C)           PORT_CHAR('C')
677   PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_2)                                   PORT_CHAR('2') PORT_CHAR('"')
678   PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Z \xd0\x97") PORT_CODE(KEYCODE_Z)           PORT_CHAR('Z')
679   PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("MK") PORT_CODE(KEYCODE_LCONTROL) PORT_CODE(KEYCODE_LCONTROL) PORT_CHAR(UCHAR_SHIFT_2)
680   PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_4)                                   PORT_CHAR('4') PORT_CHAR('$')
681   PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("B \xd0\x91") PORT_CODE(KEYCODE_B)           PORT_CHAR('B')
682   PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_6)                                   PORT_CHAR('6') PORT_CHAR('&')
683   PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("M \xd0\x9c") PORT_CODE(KEYCODE_M)           PORT_CHAR('M')
203684
204685   PORT_START("ROW3")
205   PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("] \xd0\xa9") PORT_CODE(KEYCODE_QUOTE)       PORT_CHAR(']')
206   PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_BACKSLASH2)                          PORT_CHAR(';') PORT_CHAR('+')
207   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
208   PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_UNUSED)
209   PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_MINUS)                               PORT_CHAR(':') PORT_CHAR('*')
210   PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("[ \xd0\xa8") PORT_CODE(KEYCODE_COLON)       PORT_CHAR('[')
211   PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_9)                                   PORT_CHAR('9') PORT_CHAR(')')
212   PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("K \xd0\x9a") PORT_CODE(KEYCODE_K)           PORT_CHAR('K')
686   PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("] \xd0\xa9") PORT_CODE(KEYCODE_QUOTE)       PORT_CHAR(']')
687   PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_BACKSLASH2)                          PORT_CHAR(';') PORT_CHAR('+')
688   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
689   PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_UNUSED)
690   PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_MINUS)                               PORT_CHAR(':') PORT_CHAR('*')
691   PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("[ \xd0\xa8") PORT_CODE(KEYCODE_COLON)       PORT_CHAR('[')
692   PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_9)                                   PORT_CHAR('9') PORT_CHAR(')')
693   PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("K \xd0\x9a") PORT_CODE(KEYCODE_K)           PORT_CHAR('K')
213694
214695   PORT_START("ROW4")
215   PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME(UTF8_RIGHT) PORT_CODE(KEYCODE_RIGHT)     PORT_CHAR(UCHAR_MAMEKEY(RIGHT))
216   PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME(UTF8_DOWN) PORT_CODE(KEYCODE_DOWN)       PORT_CHAR(UCHAR_MAMEKEY(DOWN))
217   PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME(UTF8_LEFT) PORT_CODE(KEYCODE_LEFT)       PORT_CHAR(UCHAR_MAMEKEY(LEFT))
218   PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_LSHIFT)                              PORT_CHAR(UCHAR_MAMEKEY(LSHIFT))
219   PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME(UTF8_UP) PORT_CODE(KEYCODE_UP)       PORT_CHAR(UCHAR_MAMEKEY(UP))
220   PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_STOP)                                PORT_CHAR('.') PORT_CHAR('>')
221   PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_COMMA)                               PORT_CHAR(',') PORT_CHAR('<')
222   PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_SPACE)                               PORT_CHAR(' ')
696   PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME(UTF8_RIGHT) PORT_CODE(KEYCODE_RIGHT)     PORT_CHAR(UCHAR_MAMEKEY(RIGHT))
697   PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME(UTF8_DOWN) PORT_CODE(KEYCODE_DOWN)       PORT_CHAR(UCHAR_MAMEKEY(DOWN))
698   PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME(UTF8_LEFT) PORT_CODE(KEYCODE_LEFT)       PORT_CHAR(UCHAR_MAMEKEY(LEFT))
699   PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_LSHIFT)                              PORT_CHAR(UCHAR_MAMEKEY(LSHIFT))
700   PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME(UTF8_UP) PORT_CODE(KEYCODE_UP)       PORT_CHAR(UCHAR_MAMEKEY(UP))
701   PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_STOP)                                PORT_CHAR('.') PORT_CHAR('>')
702   PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_COMMA)                               PORT_CHAR(',') PORT_CHAR('<')
703   PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_SPACE)                               PORT_CHAR(' ')
223704
224705   PORT_START("ROW5")
225   PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("@ \xd0\xae") PORT_CODE(KEYCODE_OPENBRACE)   PORT_CHAR('@')
226   PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("\\ \xd0\xad") PORT_CODE(KEYCODE_CLOSEBRACE) PORT_CHAR('\\')
227   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
228   PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_UNUSED)
229   PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("P \xd0\x9f") PORT_CODE(KEYCODE_P)           PORT_CHAR('P')
230   PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("O \xd0\x9e") PORT_CODE(KEYCODE_O)           PORT_CHAR('O')
231   PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("I \xd0\x98") PORT_CODE(KEYCODE_I)           PORT_CHAR('I')
232   PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("U \xd0\xa3") PORT_CODE(KEYCODE_U)           PORT_CHAR('U')
706   PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("@ \xd0\xae") PORT_CODE(KEYCODE_OPENBRACE)   PORT_CHAR('@')
707   PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("\\ \xd0\xad") PORT_CODE(KEYCODE_CLOSEBRACE) PORT_CHAR('\\')
708   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
709   PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_UNUSED)
710   PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("P \xd0\x9f") PORT_CODE(KEYCODE_P)           PORT_CHAR('P')
711   PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("O \xd0\x9e") PORT_CODE(KEYCODE_O)           PORT_CHAR('O')
712   PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("I \xd0\x98") PORT_CODE(KEYCODE_I)           PORT_CHAR('I')
713   PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("U \xd0\xa3") PORT_CODE(KEYCODE_U)           PORT_CHAR('U')
233714
234715   PORT_START("ROW6")
235   PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("W \xd0\x92") PORT_CODE(KEYCODE_W)           PORT_CHAR('W')
236   PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("S \xd0\xa1") PORT_CODE(KEYCODE_S)           PORT_CHAR('S')
237   PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("A \xd0\x90") PORT_CODE(KEYCODE_A)           PORT_CHAR('A')
238   PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_UNUSED)
239   PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("E \xd0\x95") PORT_CODE(KEYCODE_E)           PORT_CHAR('E')
240   PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("G \xd0\x93") PORT_CODE(KEYCODE_G)           PORT_CHAR('G')
241   PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("H \xd0\xa5") PORT_CODE(KEYCODE_H)           PORT_CHAR('H')
242   PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Y \xd0\xaa") PORT_CODE(KEYCODE_Y)           PORT_CHAR('Y')
716   PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("W \xd0\x92") PORT_CODE(KEYCODE_W)           PORT_CHAR('W')
717   PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("S \xd0\xa1") PORT_CODE(KEYCODE_S)           PORT_CHAR('S')
718   PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("A \xd0\x90") PORT_CODE(KEYCODE_A)           PORT_CHAR('A')
719   PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_UNUSED)
720   PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("E \xd0\x95") PORT_CODE(KEYCODE_E)           PORT_CHAR('E')
721   PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("G \xd0\x93") PORT_CODE(KEYCODE_G)           PORT_CHAR('G')
722   PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("H \xd0\xa5") PORT_CODE(KEYCODE_H)           PORT_CHAR('H')
723   PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Y \xd0\xaa") PORT_CODE(KEYCODE_Y)           PORT_CHAR('Y')
243724
244725   PORT_START("ROW7")
245   PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_EQUALS)                              PORT_CHAR('-') PORT_CHAR('=')
246   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'
247   PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Return") PORT_CODE(KEYCODE_ENTER)           PORT_CHAR(13)
248   PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_RSHIFT)                              PORT_CHAR(UCHAR_MAMEKEY(RSHIFT))
249   PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_SLASH)                               PORT_CHAR('/') PORT_CHAR('?')
250   PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_0)                                   PORT_CHAR('0')
251   PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("L \xd0\x9b") PORT_CODE(KEYCODE_L)           PORT_CHAR('L')
252   PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_8)                                   PORT_CHAR('8') PORT_CHAR('(')
726   PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_EQUALS)                              PORT_CHAR('-') PORT_CHAR('=')
727   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'
728   PORT_BIT(0x20, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Return") PORT_CODE(KEYCODE_ENTER)           PORT_CHAR(13)
729   PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_RSHIFT)                              PORT_CHAR(UCHAR_MAMEKEY(RSHIFT))
730   PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_SLASH)                               PORT_CHAR('/') PORT_CHAR('?')
731   PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_0)                                   PORT_CHAR('0')
732   PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("L \xd0\x9b") PORT_CODE(KEYCODE_L)           PORT_CHAR('L')
733   PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_CODE(KEYCODE_8)                                   PORT_CHAR('8') PORT_CHAR('(')
253734
254   PORT_START("FLOPPY")
255   /* force apple2 disc interface for pravetz */
256   PORT_START("oric_floppy_interface")
257   PORT_CONFNAME( 0x07, 0x00, "Floppy disc interface" )
258   PORT_CONFSETTING(    0x00, DEF_STR( None ) )
259   PORT_CONFSETTING(    0x03, "Low 8D DOS" )
260   PORT_CONFSETTING(    0x04, "High 8D DOS" )
735   PORT_START("NMI")
736   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)
261737
262738   /* vsync cable hardware. This is a simple cable connected to the video output
263739   to the monitor/television. The sync signal is connected to the cassette input
264740   allowing interrupts to be generated from the vsync signal. */
265   PORT_CONFNAME(0x08, 0x00, "Vsync cable hardware")
266   PORT_CONFSETTING(   0x00, DEF_STR( Off ) )
267   PORT_CONFSETTING(   0x08, DEF_STR( On ) )
268   PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_CUSTOM) PORT_VBLANK("screen")
741   PORT_START("CONFIG")
742   PORT_CONFNAME(0x01, 0x00, "Tape input")
743   PORT_CONFSETTING(   0x00, "Tape")
744   PORT_CONFSETTING(   0x01, "VSync cable")
269745INPUT_PORTS_END
270746
271747static INPUT_PORTS_START(telstrat)
272   PORT_INCLUDE( oric )
748   PORT_INCLUDE( orica )
273749
274   PORT_MODIFY("ROW5")
275   PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Funct") PORT_CODE(KEYCODE_END) PORT_CHAR(UCHAR_MAMEKEY(F1))
750// The telestrat does not have the NMI button
751   PORT_MODIFY("NMI")
752   PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED)
276753
277   PORT_MODIFY("FLOPPY")
278   /* vsync cable hardware. This is a simple cable connected to the video output
279   to the monitor/television. The sync signal is connected to the cassette input
280   allowing interrupts to be generated from the vsync signal. */
281   PORT_BIT(0x07, 0x00, IPT_UNUSED)
282   PORT_CONFNAME(0x08, 0x00, "Vsync cable hardware")
283   PORT_CONFSETTING(   0x00, DEF_STR( Off ) )
284   PORT_CONFSETTING(   0x08, DEF_STR( On ) )
285   PORT_BIT( 0x010, IP_ACTIVE_HIGH, IPT_CUSTOM) PORT_VBLANK("screen")
754   PORT_START("JOY1")      /* left joystick port */
755   PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT) PORT_8WAY PORT_PLAYER(1)
756   PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT)  PORT_8WAY PORT_PLAYER(1)
757   PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_BUTTON1)                  PORT_PLAYER(1)
758   PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN)  PORT_8WAY PORT_PLAYER(1)
759   PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_UP)    PORT_8WAY PORT_PLAYER(1)
286760
287   PORT_START("JOY0")      /* left joystick port */
288   PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Joystick 0 Up") PORT_CODE(JOYCODE_X_RIGHT_SWITCH)
289   PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Joystick 0 Down") PORT_CODE(JOYCODE_X_LEFT_SWITCH)
290   PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Joystick 0 Left") PORT_CODE(JOYCODE_BUTTON1)
291   PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Joystick 0 Right") PORT_CODE(JOYCODE_Y_DOWN_SWITCH)
292   PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Joystick 0 Fire 1") PORT_CODE(JOYCODE_Y_UP_SWITCH)
293
294   PORT_START("JOY1")      /* right joystick port */
295   PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Joystick 1 Up") PORT_CODE(JOYCODE_X_RIGHT_SWITCH)
296   PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Joystick 1 Down") PORT_CODE(JOYCODE_X_LEFT_SWITCH)
297   PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Joystick 1 Left") PORT_CODE(JOYCODE_BUTTON1)
298   PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Joystick 1 Right") PORT_CODE(JOYCODE_Y_DOWN_SWITCH)
299   PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_KEYBOARD) PORT_NAME("Joystick 1 Fire 1") PORT_CODE(JOYCODE_Y_UP_SWITCH)
761   PORT_START("JOY2")      /* right joystick port */
762   PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT) PORT_8WAY PORT_PLAYER(2)
763   PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT)  PORT_8WAY PORT_PLAYER(2)
764   PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_BUTTON1)                  PORT_PLAYER(2)
765   PORT_BIT(0x08, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN)  PORT_8WAY PORT_PLAYER(2)
766   PORT_BIT(0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_UP)    PORT_8WAY PORT_PLAYER(2)
300767INPUT_PORTS_END
301768
302769
303static const unsigned char oric_palette[8*3] =
304{
305   0x00, 0x00, 0x00, 0xff, 0x00, 0x00,
306   0x00, 0xff, 0x00, 0xff, 0xff, 0x00,
307   0x00, 0x00, 0xff, 0xff, 0x00, 0xff,
308   0x00, 0xff, 0xff, 0xff, 0xff, 0xff,
309};
310
311/* Initialise the palette */
312PALETTE_INIT_MEMBER(oric_state, oric)
313{
314   int i;
315
316   for ( i = 0; i < sizeof(oric_palette) / 3; i++ ) {
317      palette.set_pen_color(i, oric_palette[i*3], oric_palette[i*3+1], oric_palette[i*3+2]);
318   }
319}
320
321
322
323770static const ay8910_interface oric_ay_interface =
324771{
325   AY8910_LEGACY_OUTPUT,
326   AY8910_DEFAULT_LOADS,
772   AY8910_DISCRETE_OUTPUT,
773   { 4700, 4700, 4700},
327774   DEVCB_NULL,
328775   DEVCB_NULL,
329   DEVCB_DRIVER_MEMBER(oric_state, oric_psg_porta_write),
776   DEVCB_DRIVER_MEMBER(oric_state, psg_a_w),
330777   DEVCB_NULL,
331778};
332779
r29567r29568
340787   NULL
341788};
342789
343static const floppy_interface oric1_floppy_interface =
344{
345   DEVCB_NULL,
346   DEVCB_NULL,
347   DEVCB_NULL,
348   DEVCB_NULL,
349   DEVCB_NULL,
350   FLOPPY_STANDARD_5_25_DSHD,
351   LEGACY_FLOPPY_OPTIONS_NAME(oric),
352   NULL,
353   NULL
354};
355
356static const floppy_interface prav8d_floppy_interface =
357{
358   DEVCB_NULL,
359   DEVCB_NULL,
360   DEVCB_NULL,
361   DEVCB_NULL,
362   DEVCB_NULL,
363   FLOPPY_STANDARD_5_25_DSHD,
364   LEGACY_FLOPPY_OPTIONS_NAME(apple2),
365   NULL,
366   NULL
367};
368
369790static MACHINE_CONFIG_START( oric, oric_state )
370791   /* basic machine hardware */
371   MCFG_CPU_ADD("maincpu", M6502, 1000000)
792   MCFG_CPU_ADD("maincpu", M6502, XTAL_12MHz/12)
372793   MCFG_CPU_PROGRAM_MAP(oric_mem)
373794   MCFG_QUANTUM_TIME(attotime::from_hz(60))
374795
375
376796   /* video hardware */
377797   MCFG_SCREEN_ADD("screen", RASTER)
378798   MCFG_SCREEN_REFRESH_RATE(60)
r29567r29568
380800   MCFG_SCREEN_SIZE(40*6, 28*8)
381801   MCFG_SCREEN_VISIBLE_AREA(0, 40*6-1, 0, 28*8-1)
382802   MCFG_SCREEN_UPDATE_DRIVER(oric_state, screen_update_oric)
383   MCFG_SCREEN_PALETTE("palette")
803   MCFG_SCREEN_VBLANK_DRIVER(oric_state, vblank_w)
384804
385   MCFG_PALETTE_ADD("palette", 8)
386   MCFG_PALETTE_INIT_OWNER(oric_state, oric)
387
388
389805   /* sound hardware */
390806   MCFG_SPEAKER_STANDARD_MONO("mono")
391807   MCFG_SOUND_WAVE_ADD(WAVE_TAG, "cassette")
392808   MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
393   MCFG_SOUND_ADD("ay8912", AY8912, 1000000)
809   MCFG_SOUND_ADD("ay8912", AY8912, XTAL_12MHz/12)
394810   MCFG_SOUND_CONFIG(oric_ay_interface)
395811   MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
396812
397813   /* printer */
398814   MCFG_CENTRONICS_ADD("centronics", centronics_printers, "image")
399   MCFG_CENTRONICS_ACK_HANDLER(DEVWRITELINE("via6522_0", via6522_device, write_ca1))
400
815   MCFG_CENTRONICS_ACK_HANDLER(DEVWRITELINE("via6522", via6522_device, write_ca1))
401816   MCFG_CENTRONICS_OUTPUT_LATCH_ADD("cent_data_out", "centronics")
402817
403818   /* cassette */
404819   MCFG_CASSETTE_ADD( "cassette", oric_cassette_interface )
820   MCFG_TIMER_DRIVER_ADD_PERIODIC("tape_timer", oric_state, update_tape, attotime::from_hz(4800))
405821
406822   /* via */
407   MCFG_DEVICE_ADD( "via6522_0", VIA6522, 1000000 )
408   MCFG_VIA6522_READPA_HANDLER(READ8(oric_state, oric_via_in_a_func))
409   MCFG_VIA6522_READPB_HANDLER(READ8(oric_state, oric_via_in_b_func))
410   MCFG_VIA6522_WRITEPA_HANDLER(WRITE8(oric_state, oric_via_out_a_func))
411   MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(oric_state, oric_via_out_b_func))
412   MCFG_VIA6522_CA2_HANDLER(WRITELINE(oric_state, oric_via_out_ca2_func))
413   MCFG_VIA6522_CB2_HANDLER(WRITELINE(oric_state, oric_via_out_cb2_func))
414   MCFG_VIA6522_IRQ_HANDLER(WRITELINE(oric_state, oric_via_irq_func))
823   MCFG_DEVICE_ADD( "via6522", VIA6522, XTAL_12MHz/12 )
824   MCFG_VIA6522_WRITEPA_HANDLER(WRITE8(oric_state, via_a_w))
825   MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(oric_state, via_b_w))
826   MCFG_VIA6522_CA2_HANDLER(WRITELINE(oric_state, via_ca2_w))
827   MCFG_VIA6522_CB2_HANDLER(WRITELINE(oric_state, via_cb2_w))
828   MCFG_VIA6522_IRQ_HANDLER(WRITELINE(oric_state, via_irq_w))
415829
416   MCFG_WD1770_ADD("wd179x", oric_wd17xx_interface )
417
418   MCFG_LEGACY_FLOPPY_4_DRIVES_ADD(oric1_floppy_interface)
830   /* extension port */
831   MCFG_ORICEXT_ADD( "ext", oricext_intf, NULL, "maincpu", WRITELINE(oric_state, ext_irq_w))
419832MACHINE_CONFIG_END
420833
421834static MACHINE_CONFIG_DERIVED( prav8d, oric )
422   MCFG_LEGACY_FLOPPY_4_DRIVES_REMOVE()
423   MCFG_LEGACY_FLOPPY_DRIVE_ADD(FLOPPY_0, prav8d_floppy_interface)
424835MACHINE_CONFIG_END
425836
426static MACHINE_CONFIG_DERIVED( telstrat, oric )
837FLOPPY_FORMATS_MEMBER( telestrat_state::floppy_formats )
838   FLOPPY_ORIC_DSK_FORMAT
839FLOPPY_FORMATS_END
840
841static SLOT_INTERFACE_START( telestrat_floppies )
842   SLOT_INTERFACE( "3dsdd", FLOPPY_3_DSDD )
843SLOT_INTERFACE_END
844
845static MACHINE_CONFIG_DERIVED_CLASS( telstrat, oric, telestrat_state )
427846   MCFG_CPU_MODIFY( "maincpu" )
428   MCFG_CPU_PROGRAM_MAP( telestrat_mem)
847   MCFG_CPU_PROGRAM_MAP(telestrat_mem)
429848
430   MCFG_MACHINE_START_OVERRIDE(oric_state, telestrat )
431
432849   /* acia */
433850   MCFG_DEVICE_ADD("acia", MOS6551, 0)
434851   MCFG_MOS6551_XTAL(XTAL_1_8432MHz)
435   MCFG_MOS6551_IRQ_HANDLER(WRITELINE(oric_state, telestrat_acia_callback))
852   MCFG_MOS6551_IRQ_HANDLER(WRITELINE(telestrat_state, acia_irq_w))
436853
437854   /* via */
438   MCFG_DEVICE_ADD( "via6522_1", VIA6522, 1000000 )
439   MCFG_VIA6522_READPA_HANDLER(READ8(oric_state, telestrat_via2_in_a_func))
440   MCFG_VIA6522_READPB_HANDLER(READ8(oric_state, telestrat_via2_in_b_func))
441   MCFG_VIA6522_WRITEPA_HANDLER(WRITE8(oric_state, telestrat_via2_out_a_func))
442   MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(oric_state, telestrat_via2_out_b_func))
443   MCFG_VIA6522_IRQ_HANDLER(WRITELINE(oric_state, telestrat_via2_irq_func))
855   MCFG_DEVICE_ADD( "via6522_2", VIA6522, XTAL_12MHz/12 )
856   MCFG_VIA6522_WRITEPA_HANDLER(WRITE8(telestrat_state, via2_a_w))
857   MCFG_VIA6522_WRITEPB_HANDLER(WRITE8(telestrat_state, via2_b_w))
858   MCFG_VIA6522_CA2_HANDLER(WRITELINE(telestrat_state, via2_ca2_w))
859   MCFG_VIA6522_CB2_HANDLER(WRITELINE(telestrat_state, via2_cb2_w))
860   MCFG_VIA6522_IRQ_HANDLER(WRITELINE(telestrat_state, via2_irq_w))
861
862   /* microdisc */
863   MCFG_FD1793x_ADD("fdc", XTAL_8MHz/8)
864   MCFG_WD_FDC_INTRQ_CALLBACK(WRITELINE(telestrat_state, fdc_irq_w))
865   MCFG_WD_FDC_DRQ_CALLBACK(WRITELINE(telestrat_state, fdc_drq_w))
866   MCFG_WD_FDC_HLD_CALLBACK(WRITELINE(telestrat_state, fdc_hld_w))
867   MCFG_WD_FDC_FORCE_READY
868
869   MCFG_FLOPPY_DRIVE_ADD("fdc:0", telestrat_floppies, "3dsdd", telestrat_state::floppy_formats)
870   MCFG_FLOPPY_DRIVE_ADD("fdc:1", telestrat_floppies, NULL,    telestrat_state::floppy_formats)
871   MCFG_FLOPPY_DRIVE_ADD("fdc:2", telestrat_floppies, NULL,    telestrat_state::floppy_formats)
872   MCFG_FLOPPY_DRIVE_ADD("fdc:3", telestrat_floppies, NULL,    telestrat_state::floppy_formats)
444873MACHINE_CONFIG_END
445874
446875
447876ROM_START(oric1)
448   ROM_REGION(0x16800, "maincpu", 0)   /* 0x10000 + 0x04000 + 0x02000 + 0x00800 */
449   ROM_LOAD ("basic10.rom", 0x10000, 0x04000, CRC(f18710b4) SHA1(333116e6884d85aaa4dfc7578a91cceeea66d016))
450   ROM_LOAD_OPTIONAL ("microdis.rom", 0x14000, 0x02000, CRC(a9664a9c) SHA1(0d2ef6e67322f48f4b7e08d8bbe68827e2074561) )
451   ROM_LOAD_OPTIONAL ("jasmin.rom",   0x16000, 0x00800, CRC(37220e89) SHA1(70e59b8abd67092f050462abc6cb5271e4c15f01) )
877   ROM_REGION(0x4000, "maincpu", 0)
878   ROM_LOAD ("basic10.rom", 0, 0x04000, CRC(f18710b4) SHA1(333116e6884d85aaa4dfc7578a91cceeea66d016))
452879ROM_END
453880
454881ROM_START(orica)
455   ROM_REGION(0x16800, "maincpu", 0)   /* 0x10000 + 0x04000 + 0x02000 + 0x00800 */
882   ROM_REGION(0x4000, "maincpu", 0)
456883   ROM_SYSTEM_BIOS( 0, "ver11", "Basic 1.1")
457   ROMX_LOAD ("basic11b.rom", 0x10000, 0x04000, CRC(c3a92bef) SHA1(9451a1a09d8f75944dbd6f91193fc360f1de80ac), ROM_BIOS(1) )
884   ROMX_LOAD ("basic11b.rom", 0, 0x04000, CRC(c3a92bef) SHA1(9451a1a09d8f75944dbd6f91193fc360f1de80ac), ROM_BIOS(1) )
458885   ROM_SYSTEM_BIOS( 1, "ver12", "Basic 1.2 (Pascal Leclerc)")      // 1987/1999 - various enhancements and bugfixes
459   ROMX_LOAD ("basic12.rom",  0x10000, 0x04000, CRC(dc4f22dc) SHA1(845e1a893de3dc0f856fdf2f69c3b73770b4094f), ROM_BIOS(2) )
886   ROMX_LOAD ("basic12.rom",  0, 0x04000, CRC(dc4f22dc) SHA1(845e1a893de3dc0f856fdf2f69c3b73770b4094f), ROM_BIOS(2) )
460887   ROM_SYSTEM_BIOS( 2, "ver121", "Basic 1.21 (Pascal Leclerc)")        // 07.1999 - DRAW enhancement
461   ROMX_LOAD ("basic121.rom", 0x10000, 0x04000, CRC(0a2860b1) SHA1(b727d5c3bbc8cb1d510f224eb1e0d90d609e8506), ROM_BIOS(3) )
888   ROMX_LOAD ("basic121.rom", 0, 0x04000, CRC(0a2860b1) SHA1(b727d5c3bbc8cb1d510f224eb1e0d90d609e8506), ROM_BIOS(3) )
462889   ROM_SYSTEM_BIOS( 3, "ver122", "Basic 1.22 (Pascal Leclerc)")        // 08.2001 - added EUR symbol
463   ROMX_LOAD ("basic122.rom", 0x10000, 0x04000, CRC(5ef2a861) SHA1(9ab6dc47b6e9dc65a4137ce0f0f12fc2b6ca8442), ROM_BIOS(4) )
890   ROMX_LOAD ("basic122.rom", 0, 0x04000, CRC(5ef2a861) SHA1(9ab6dc47b6e9dc65a4137ce0f0f12fc2b6ca8442), ROM_BIOS(4) )
464891   ROM_SYSTEM_BIOS( 4, "ver11de", "Basic 1.1 DE")
465   ROMX_LOAD( "bas11_de.rom", 0x10000, 0x04000, CRC(65233b2d) SHA1(b01cabb1a21980a6785a2fe37a8f8572c892123f), ROM_BIOS(5))
892   ROMX_LOAD( "bas11_de.rom", 0, 0x04000, CRC(65233b2d) SHA1(b01cabb1a21980a6785a2fe37a8f8572c892123f), ROM_BIOS(5))
466893   ROM_SYSTEM_BIOS( 5, "ver11es", "Basic 1.1 ES")
467   ROMX_LOAD( "bas11_es.rom", 0x10000, 0x04000, CRC(47bf26c7) SHA1(4fdbadd68db9ab8ad1cd56b4e5cbe51a9c3f11ae), ROM_BIOS(6))
894   ROMX_LOAD( "bas11_es.rom", 0, 0x04000, CRC(47bf26c7) SHA1(4fdbadd68db9ab8ad1cd56b4e5cbe51a9c3f11ae), ROM_BIOS(6))
468895   ROM_SYSTEM_BIOS( 6, "ver11fr", "Basic 1.1 FR")
469   ROMX_LOAD( "bas11_fr.rom", 0x10000, 0x04000, CRC(603b1fbf) SHA1(2a4583df3b59ca454d67d5631f242c96ec4cf99a), ROM_BIOS(7))
896   ROMX_LOAD( "bas11_fr.rom", 0, 0x04000, CRC(603b1fbf) SHA1(2a4583df3b59ca454d67d5631f242c96ec4cf99a), ROM_BIOS(7))
470897   ROM_SYSTEM_BIOS( 7, "ver11se", "Basic 1.1 SE")
471   ROMX_LOAD( "bas11_se.rom", 0x10000, 0x04000, CRC(a71523ac) SHA1(ce53acf84baec6ab5cbac9f9cefa71b3efeb2ead), ROM_BIOS(8))
898   ROMX_LOAD( "bas11_se.rom", 0, 0x04000, CRC(a71523ac) SHA1(ce53acf84baec6ab5cbac9f9cefa71b3efeb2ead), ROM_BIOS(8))
472899   ROM_SYSTEM_BIOS( 8, "ver11uk", "Basic 1.1 UK")
473   ROMX_LOAD( "bas11_uk.rom", 0x10000, 0x04000, CRC(303370d1) SHA1(589ff66fac8e06d65af3369491faa67a71f1322a), ROM_BIOS(9))
900   ROMX_LOAD( "bas11_uk.rom", 0, 0x04000, CRC(303370d1) SHA1(589ff66fac8e06d65af3369491faa67a71f1322a), ROM_BIOS(9))
474901   ROM_SYSTEM_BIOS( 9, "ver12es", "Basic 1.2 ES")
475   ROMX_LOAD( "bas12es_le.rom", 0x10000, 0x04000, CRC(70de4aeb) SHA1(b327418aa7d8a5a03c135e3d8acdd511df625893), ROM_BIOS(10))
902   ROMX_LOAD( "bas12es_le.rom", 0, 0x04000, CRC(70de4aeb) SHA1(b327418aa7d8a5a03c135e3d8acdd511df625893), ROM_BIOS(10))
476903   ROM_SYSTEM_BIOS( 10, "ver12fr", "Basic 1.2 FR")
477   ROMX_LOAD( "bas12fr_le.rom", 0x10000, 0x04000, CRC(47a437fc) SHA1(70271bc3ed5c3bf4d339d6f5de3de8c3c50ff573), ROM_BIOS(11))
904   ROMX_LOAD( "bas12fr_le.rom", 0, 0x04000, CRC(47a437fc) SHA1(70271bc3ed5c3bf4d339d6f5de3de8c3c50ff573), ROM_BIOS(11))
478905   ROM_SYSTEM_BIOS( 11, "ver12ge", "Basic 1.2 GE")
479   ROMX_LOAD( "bas12ge_le.rom", 0x10000, 0x04000, CRC(f5f0dd52) SHA1(75359302452ee7b19537698f124aaefd333688d0), ROM_BIOS(12))
906   ROMX_LOAD( "bas12ge_le.rom", 0, 0x04000, CRC(f5f0dd52) SHA1(75359302452ee7b19537698f124aaefd333688d0), ROM_BIOS(12))
480907   ROM_SYSTEM_BIOS( 12, "ver12sw", "Basic 1.2 SW")
481   ROMX_LOAD( "bas12sw_le.rom", 0x10000, 0x04000, CRC(100abe68) SHA1(6211d5969c4d7a6acb86ed19c5e51a33a3bef431), ROM_BIOS(13))
908   ROMX_LOAD( "bas12sw_le.rom", 0, 0x04000, CRC(100abe68) SHA1(6211d5969c4d7a6acb86ed19c5e51a33a3bef431), ROM_BIOS(13))
482909   ROM_SYSTEM_BIOS( 13, "ver12uk", "Basic 1.2 UK")
483   ROMX_LOAD( "bas12uk_le.rom", 0x10000, 0x04000, CRC(00fce8a6) SHA1(d40558bdf61b8aba6260293c9424fd463be7fad8), ROM_BIOS(14))
910   ROMX_LOAD( "bas12uk_le.rom", 0, 0x04000, CRC(00fce8a6) SHA1(d40558bdf61b8aba6260293c9424fd463be7fad8), ROM_BIOS(14))
484911   ROM_SYSTEM_BIOS( 14, "ver121es", "Basic 1.211 ES")
485   ROMX_LOAD( "bas121es_le.rom", 0x10000, 0x04000, CRC(87ec679b) SHA1(5de6a5f5121f69069c9b93d678046e814b5b64e9), ROM_BIOS(15))
912   ROMX_LOAD( "bas121es_le.rom", 0, 0x04000, CRC(87ec679b) SHA1(5de6a5f5121f69069c9b93d678046e814b5b64e9), ROM_BIOS(15))
486913   ROM_SYSTEM_BIOS( 15, "ver121fr", "Basic 1.211 FR")
487   ROMX_LOAD( "bas121fr_le.rom", 0x10000, 0x04000, CRC(e683dec2) SHA1(20df7ebc0f13aa835f286d50137f1a7ff7430c29), ROM_BIOS(16))
914   ROMX_LOAD( "bas121fr_le.rom", 0, 0x04000, CRC(e683dec2) SHA1(20df7ebc0f13aa835f286d50137f1a7ff7430c29), ROM_BIOS(16))
488915   ROM_SYSTEM_BIOS( 16, "ver121ge", "Basic 1.211 GE")
489   ROMX_LOAD( "bas121ge_le.rom", 0x10000, 0x04000, CRC(94fe32bf) SHA1(1024776d20030d602e432e50014502524658643a), ROM_BIOS(17))
916   ROMX_LOAD( "bas121ge_le.rom", 0, 0x04000, CRC(94fe32bf) SHA1(1024776d20030d602e432e50014502524658643a), ROM_BIOS(17))
490917   ROM_SYSTEM_BIOS( 17, "ver121sw", "Basic 1.211 SW")
491   ROMX_LOAD( "bas121sw_le.rom", 0x10000, 0x04000, CRC(e6ad11c7) SHA1(309c94a9861fcb770636dcde1801a5c68ca819b4), ROM_BIOS(18))
918   ROMX_LOAD( "bas121sw_le.rom", 0, 0x04000, CRC(e6ad11c7) SHA1(309c94a9861fcb770636dcde1801a5c68ca819b4), ROM_BIOS(18))
492919   ROM_SYSTEM_BIOS( 18, "ver121uk", "Basic 1.211 UK")
493   ROMX_LOAD( "bas121uk_le.rom", 0x10000, 0x04000, CRC(75aa1aa9) SHA1(ca99e244d9cbef625344c2054023504a4f9dcfe4), ROM_BIOS(19))
920   ROMX_LOAD( "bas121uk_le.rom", 0, 0x04000, CRC(75aa1aa9) SHA1(ca99e244d9cbef625344c2054023504a4f9dcfe4), ROM_BIOS(19))
494921   ROM_SYSTEM_BIOS( 19, "ver122es", "Basic 1.22 ES")
495   ROMX_LOAD( "bas122es_le.rom", 0x10000, 0x04000, CRC(9144f9e0) SHA1(acf2094078af057e74a31d90d7010be51b9033fa), ROM_BIOS(20))
922   ROMX_LOAD( "bas122es_le.rom", 0, 0x04000, CRC(9144f9e0) SHA1(acf2094078af057e74a31d90d7010be51b9033fa), ROM_BIOS(20))
496923   ROM_SYSTEM_BIOS( 20, "ver122fr", "Basic 1.22 FR")
497   ROMX_LOAD( "bas122fr_le.rom", 0x10000, 0x04000, CRC(370cfda4) SHA1(fad9a0661256e59bcc2915578647573e4128e1bb), ROM_BIOS(21))
924   ROMX_LOAD( "bas122fr_le.rom", 0, 0x04000, CRC(370cfda4) SHA1(fad9a0661256e59bcc2915578647573e4128e1bb), ROM_BIOS(21))
498925   ROM_SYSTEM_BIOS( 21, "ver122ge", "Basic 1.22 GE")
499   ROMX_LOAD( "bas122ge_le.rom", 0x10000, 0x04000, CRC(9a42bd62) SHA1(8a9c80f314daf4e5e64fa202e583b8a65796db8b), ROM_BIOS(22))
926   ROMX_LOAD( "bas122ge_le.rom", 0, 0x04000, CRC(9a42bd62) SHA1(8a9c80f314daf4e5e64fa202e583b8a65796db8b), ROM_BIOS(22))
500927   ROM_SYSTEM_BIOS( 22, "ver122sw", "Basic 1.22 SW")
501   ROMX_LOAD( "bas122sw_le.rom", 0x10000, 0x04000, CRC(e7fd57a4) SHA1(c75cbf7cfafaa02712dc7ca2f972220aef86fb8d), ROM_BIOS(23))
928   ROMX_LOAD( "bas122sw_le.rom", 0, 0x04000, CRC(e7fd57a4) SHA1(c75cbf7cfafaa02712dc7ca2f972220aef86fb8d), ROM_BIOS(23))
502929   ROM_SYSTEM_BIOS( 23, "ver122uk", "Basic 1.22 UK")
503   ROMX_LOAD( "bas122uk_le.rom", 0x10000, 0x04000, CRC(9865bcd7) SHA1(2a92e2d119463e682bf10647e3880e26656d65b5), ROM_BIOS(24))
504
505   ROM_LOAD_OPTIONAL ("microdis.rom", 0x14000, 0x02000, CRC(a9664a9c) SHA1(0d2ef6e67322f48f4b7e08d8bbe68827e2074561) )
506   ROM_LOAD_OPTIONAL ("jasmin.rom",   0x16000, 0x00800, CRC(37220e89) SHA1(70e59b8abd67092f050462abc6cb5271e4c15f01) )
930   ROMX_LOAD( "bas122uk_le.rom", 0, 0x04000, CRC(9865bcd7) SHA1(2a92e2d119463e682bf10647e3880e26656d65b5), ROM_BIOS(24))
507931ROM_END
508932
509933ROM_START(telstrat)
510   ROM_REGION(0x30000, "maincpu", 0)   /* 0x10000 + (0x04000 * 4) */
511   ROM_LOAD ("telmatic.rom", 0x010000, 0x02000, CRC(94358dc6) SHA1(35f92a0477a88f5cf564971125047ffcfa02ec10) )
512   ROM_LOAD ("teleass.rom",  0x014000, 0x04000, CRC(68b0fde6) SHA1(9e9af51dae3199cccf49ab3f0d47e2b9be4ba97d) )
513   ROM_LOAD ("hyperbas.rom", 0x018000, 0x04000, CRC(1d96ab50) SHA1(f5f70a0eb59f8cd6c261e179ae78ef906f68ed63) )
514   ROM_LOAD ("telmon24.rom", 0x01c000, 0x04000, CRC(aa727c5d) SHA1(86fc8dc0932f983efa199e31ae05a4424772f959) )
934   ROM_REGION(0x4000, "telmatic", 0)
935   ROM_LOAD ("telmatic.rom", 0, 0x2000, CRC(94358dc6) SHA1(35f92a0477a88f5cf564971125047ffcfa02ec10) )
936   ROM_RELOAD (0x2000, 0x2000)
937
938   ROM_REGION(0x4000, "teleass", 0)
939   ROM_LOAD ("teleass.rom",  0, 0x4000, CRC(68b0fde6) SHA1(9e9af51dae3199cccf49ab3f0d47e2b9be4ba97d) )
940
941   ROM_REGION(0x4000, "hyperbas", 0)
942   ROM_LOAD ("hyperbas.rom", 0, 0x4000, CRC(1d96ab50) SHA1(f5f70a0eb59f8cd6c261e179ae78ef906f68ed63) )
943
944   ROM_REGION(0x4000, "telmon24", 0)
945   ROM_LOAD ("telmon24.rom", 0, 0x4000, CRC(aa727c5d) SHA1(86fc8dc0932f983efa199e31ae05a4424772f959) )
515946ROM_END
516947
517948ROM_START(prav8d)
518   ROM_REGION(0x14300, "maincpu", 0)   /* 0x10000 + 0x04000 + 0x00100 + 0x00200 */
519   ROM_LOAD( "pravetzt.rom", 0x10000, 0x4000, CRC(58079502) SHA1(7afc276cb118adff72e4f16698f94bf3b2c64146) )
520   ROM_LOAD_OPTIONAL( "8ddoslo.rom", 0x014000, 0x0100, CRC(0c82f636) SHA1(b29d151a0dfa3c7cd50439b51d0a8f95559bc2b6) )
521   ROM_LOAD_OPTIONAL( "8ddoshi.rom", 0x014100, 0x0200, CRC(66309641) SHA1(9c2e82b3c4d385ade6215fcb89f8b92e6fd2bf4b) )
949   ROM_REGION(0x4000, "maincpu", 0)   /* 0x10000 + 0x04000 + 0x00100 + 0x00200 */
950   ROM_LOAD( "pravetzt.rom", 0, 0x4000, CRC(58079502) SHA1(7afc276cb118adff72e4f16698f94bf3b2c64146) )
951//   ROM_LOAD_OPTIONAL( "8ddoslo.rom", 0x014000, 0x0100, CRC(0c82f636) SHA1(b29d151a0dfa3c7cd50439b51d0a8f95559bc2b6) )
952//   ROM_LOAD_OPTIONAL( "8ddoshi.rom", 0x014100, 0x0200, CRC(66309641) SHA1(9c2e82b3c4d385ade6215fcb89f8b92e6fd2bf4b) )
522953ROM_END
523954
524955ROM_START(prav8dd)
525   ROM_REGION(0x14300, "maincpu", 0)   /* 0x10000 + 0x04000 + 0x00100 + 0x00200 */
956   ROM_REGION(0x4000, "maincpu", 0)   /* 0x10000 + 0x04000 + 0x00100 + 0x00200 */
526957   ROM_SYSTEM_BIOS( 0, "default", "Disk ROM, 1989")
527   ROMX_LOAD( "8d.rom",       0x10000, 0x4000, CRC(b48973ef) SHA1(fd47c977fc215a3b577596a7483df53e8a1e9c83), ROM_BIOS(1) )
958   ROMX_LOAD( "8d.rom",       0, 0x4000, CRC(b48973ef) SHA1(fd47c977fc215a3b577596a7483df53e8a1e9c83), ROM_BIOS(1) )
528959   ROM_SYSTEM_BIOS( 1, "radosoft", "RadoSoft Disk ROM, 1992")
529   ROMX_LOAD( "pravetzd.rom", 0x10000, 0x4000, CRC(f8d23821) SHA1(f87ad3c5832773b6e0614905552a80c98dc8e2a5), ROM_BIOS(2) )
530   ROM_LOAD_OPTIONAL( "8ddoslo.rom", 0x014000, 0x0100, CRC(0c82f636) SHA1(b29d151a0dfa3c7cd50439b51d0a8f95559bc2b6) )
531   ROM_LOAD_OPTIONAL( "8ddoshi.rom", 0x014100, 0x0200, CRC(66309641) SHA1(9c2e82b3c4d385ade6215fcb89f8b92e6fd2bf4b) )
960   ROMX_LOAD( "pravetzd.rom", 0, 0x4000, CRC(f8d23821) SHA1(f87ad3c5832773b6e0614905552a80c98dc8e2a5), ROM_BIOS(2) )
961//   ROM_LOAD_OPTIONAL( "8ddoslo.rom", 0x014000, 0x0100, CRC(0c82f636) SHA1(b29d151a0dfa3c7cd50439b51d0a8f95559bc2b6) )
962//   ROM_LOAD_OPTIONAL( "8ddoshi.rom", 0x014100, 0x0200, CRC(66309641) SHA1(9c2e82b3c4d385ade6215fcb89f8b92e6fd2bf4b) )
532963ROM_END
533964
534965
r29567r29568
537968COMP( 1984, orica,      oric1,  0,      oric,       orica, driver_device,      0,    "Tangerine",    "Oric Atmos" , 0)
538969COMP( 1985, prav8d,     oric1,  0,      prav8d,     prav8d, driver_device,     0,    "Pravetz",      "Pravetz 8D", 0)
539970COMP( 1989, prav8dd,    oric1,  0,      prav8d,     prav8d, driver_device,     0,    "Pravetz",      "Pravetz 8D (Disk ROM)", GAME_UNOFFICIAL)
540COMP( 1986, telstrat,   oric1,  0,      telstrat,   telstrat, driver_device,   0,    "Tangerine",    "Oric Telestrat", GAME_NOT_WORKING )
971COMP( 1986, telstrat,   oric1,  0,      telstrat,   telstrat, driver_device,   0,    "Tangerine",    "Oric Telestrat", 0 )
trunk/src/mess/mess.mak
r29567r29568
553553BUSES += MEGADRIVE
554554BUSES += NES
555555BUSES += NUBUS
556BUSES += ORICEXT
556557BUSES += PCE
557558BUSES += PCI
558559BUSES += PC_JOY
r29567r29568
17881789   $(MESS_VIDEO)/microtan.o    \
17891790   $(MESS_MACHINE)/microtan.o  \
17901791   $(MESS_DRIVERS)/microtan.o  \
1791   $(MESS_DRIVERS)/oric.o      \
1792   $(MESS_VIDEO)/oric.o        \
1793   $(MESS_MACHINE)/oric.o      \
1792   $(MESS_DRIVERS)/oric.o
17941793
17951794$(MESSOBJ)/tatung.a:            \
17961795   $(MESS_DRIVERS)/einstein.o  \
trunk/src/mess/tools/floptool/main.c
r29567r29568
3939#include "formats/ap_dsk35.h"
4040#include "formats/ap2_dsk.h"
4141
42#include "formats/oric_dsk.h"
43
44#include "formats/applix_dsk.h"
45
4246static floppy_format_type floppy_formats[] = {
4347   FLOPPY_MFI_FORMAT,
4448   FLOPPY_DFI_FORMAT,
r29567r29568
6064   FLOPPY_DC42_FORMAT,
6165   FLOPPY_A216S_FORMAT,
6266   FLOPPY_RWTS18_FORMAT,
67
68   FLOPPY_ORIC_DSK_FORMAT,
69
70   FLOPPY_APPLIX_FORMAT,
6371};
6472
6573void CLIB_DECL ATTR_PRINTF(1,2) logerror(const char *format, ...)
trunk/src/mess/machine/oric.c
r29567r29568
1/*********************************************************************
2
3    machine/oric.c
4
5    Paul Cook
6    Kev Thacker
7
8    Thankyou to Fabrice Frances for his ORIC documentation which helped with this driver
9    http://oric.ifrance.com/oric/
10
11    TODO:
12    - there are problems loading some .wav's. Try to fix these.
13    - fix more graphics display problems
14    - check the printer works
15    - fix more disc drive/wd179x problems so more software will run
16
17*********************************************************************/
18
19
20#include "includes/oric.h"
21
22
23
24
25/* ==0 if oric1 or oric atmos, !=0 if telestrat */
26
27/* This does not exist in the real hardware. I have used it to
28know which sources are interrupting */
29/* bit 2 = telestrat 2nd via interrupt,
301 = microdisc interface,
310 = oric 1st via interrupt */
32
33enum
34{
35   ORIC_FLOPPY_NONE,
36   ORIC_FLOPPY_MFM_DISK,
37   ORIC_FLOPPY_BASIC_DISK
38};
39
40/* type of disc interface connected to oric/oric atmos */
41/* telestrat always has a microdisc interface */
42enum
43{
44   ORIC_FLOPPY_INTERFACE_NONE = 0,
45   ORIC_FLOPPY_INTERFACE_MICRODISC = 1,
46   ORIC_FLOPPY_INTERFACE_JASMIN = 2,
47   ORIC_FLOPPY_INTERFACE_APPLE2 = 3,
48   ORIC_FLOPPY_INTERFACE_APPLE2_V2 = 4
49};
50
51/* called when ints are changed - cleared/set */
52void oric_state::oric_refresh_ints()
53{
54   /* telestrat has floppy hardware built-in! */
55   if (m_is_telestrat==0)
56   {
57      /* oric 1 or oric atmos */
58
59      /* if floppy disc hardware is disabled, do not allow interrupts from it */
60      if ((m_io_floppy->manager().safe_to_read()) && ((m_io_floppy->read() & 0x07) == ORIC_FLOPPY_INTERFACE_NONE))
61      {
62         m_irqs &=~(1<<1);
63      }
64   }
65
66   /* any irq set? */
67   if (m_irqs & 0x0f)
68   {
69      m_maincpu->set_input_line(0, HOLD_LINE);
70   }
71   else
72   {
73      m_maincpu->set_input_line(0, CLEAR_LINE);
74   }
75}
76
77
78
79/* index of keyboard line to scan */
80/* sense result */
81/* mask to read keys */
82
83
84
85
86
87/* refresh keyboard sense */
88void oric_state::oric_keyboard_sense_refresh()
89{
90   /* The following assumes that if a 0 is written, it can be used to detect if any key has been pressed.. */
91   /* for each bit that is 0, it combines it's pressed state with the pressed state so far */
92
93   int i;
94   unsigned char key_bit = 0;
95
96   /* what if data is 0, can it sense if any of the keys on a line are pressed? */
97   int input_port_data = 0;
98
99   switch ( m_keyboard_line )
100   {
101      case 0: input_port_data = m_io_row0->read(); break;
102      case 1: input_port_data = m_io_row1->read(); break;
103      case 2: input_port_data = m_io_row2->read(); break;
104      case 3: input_port_data = m_io_row3->read(); break;
105      case 4: input_port_data = m_io_row4->read(); break;
106      case 5: input_port_data = m_io_row5->read(); break;
107      case 6: input_port_data = m_io_row6->read(); break;
108      case 7: input_port_data = m_io_row7->read(); break;
109   }
110
111   /* go through all bits in line */
112   for (i=0; i<8; i++)
113   {
114      /* sense this bit? */
115      if (((~m_keyboard_mask) & (1<<i)) != 0)
116      {
117         /* is key pressed? */
118         if (input_port_data & (1<<i))
119         {
120            /* yes */
121            key_bit |= 1;
122         }
123      }
124   }
125
126   /* clear sense result */
127   m_key_sense_bit = 0;
128
129   /* any keys pressed on this line? */
130   if (key_bit!=0)
131   {
132      /* set sense result */
133      m_key_sense_bit = (1<<3);
134   }
135}
136
137
138/* this is executed when a write to psg port a is done */
139WRITE8_MEMBER(oric_state::oric_psg_porta_write)
140{
141   m_keyboard_mask = data;
142}
143
144
145/* PSG control pins */
146/* bit 1 = BDIR state */
147/* bit 0 = BC1 state */
148
149/* this port is also used to read printer data */
150READ8_MEMBER(oric_state::oric_via_in_a_func)
151{
152   /*logerror("port a read\r\n"); */
153
154   /* access psg? */
155   if (m_psg_control!=0)
156   {
157      /* if psg is in read register state return reg data */
158      if (m_psg_control==0x01)
159      {
160         return m_ay8912->data_r(space, 0);
161      }
162
163      /* return high-impedance */
164      return 0x0ff;
165   }
166
167   /* correct?? */
168   return m_via_port_a_data;
169}
170
171READ8_MEMBER(oric_state::oric_via_in_b_func)
172{
173   int data;
174
175   oric_keyboard_sense_refresh();
176
177   data = m_key_sense_bit;
178   data |= m_keyboard_line & 0x07;
179
180   return data;
181}
182
183
184/* read/write data depending on state of bdir, bc1 pins and data output to psg */
185void oric_state::oric_psg_connection_refresh(address_space &space)
186{
187   if (m_psg_control!=0)
188   {
189      switch (m_psg_control)
190      {
191         /* PSG inactive */
192         case 0:
193            break;
194
195         /* read register data */
196         case 1:
197            //m_via_port_a_data = ay8910_read_port_0_r(space, 0);
198            break;
199
200         /* write register data */
201         case 2:
202            m_ay8912->data_w(space, 0, m_via_port_a_data);
203            break;
204
205         /* write register index */
206         case 3:
207            m_ay8912->address_w(space, 0, m_via_port_a_data);
208            break;
209
210         default:
211            break;
212      }
213
214      return;
215   }
216}
217
218WRITE8_MEMBER(oric_state::oric_via_out_a_func)
219{
220   m_via_port_a_data = data;
221
222   oric_psg_connection_refresh(space);
223
224   if (m_psg_control==0)
225   {
226      /* if psg not selected, write to printer */
227      m_cent_data_out->write(space, 0, data);
228   }
229}
230
231/*
232PB0..PB2
233 keyboard lines-demultiplexer line 7
234
235PB3
236 keyboard sense line 0
237
238PB4
239 printer strobe line 1
240
241PB5
242 (not connected) ?? 1
243
244PB6
245 tape connector motor control 0
246
247PB7
248 tape connector output high 1
249
250 */
251
252
253/* not called yet - this will update the via with the state of the tape data.
254This allows the via to trigger on bit changes and issue interrupts */
255TIMER_CALLBACK_MEMBER(oric_state::oric_refresh_tape)
256{
257   int data;
258   int input_port_9;
259
260   data = 0;
261
262   if (m_cassette->input() > 0.0038)
263   {
264      data |= 1;
265   }
266
267   /* "A simple cable to catch the vertical retrace signal !
268       This cable connects the video output for the television/monitor
269   to the via cb1 input. Interrupts can be generated from the vertical
270   sync, and flicker free games can be produced */
271
272   input_port_9 = m_io_floppy->read();
273   /* cable is enabled? */
274   if ((input_port_9 & 0x08)!=0)
275   {
276      /* return state of vsync */
277      data = input_port_9>>4;
278   }
279
280   m_via6522_0->write_cb1(data);
281}
282
283WRITE8_MEMBER(oric_state::oric_via_out_b_func)
284{
285   /* KEYBOARD */
286   m_keyboard_line = data & 0x07;
287
288   /* CASSETTE */
289   /* cassette motor control */
290   m_cassette->change_state(
291      (data & 0x40) ? CASSETTE_MOTOR_ENABLED : CASSETTE_MOTOR_DISABLED,
292      CASSETTE_MOTOR_DISABLED);
293
294   /* cassette data out */
295   m_cassette->output((data & (1<<7)) ? -1.0 : +1.0);
296
297   /* centronics STROBE is connected to PB4 */
298   m_centronics->write_strobe(BIT(data, 4));
299
300   oric_psg_connection_refresh(space);
301   m_previous_portb_data = data;
302}
303
304
305WRITE_LINE_MEMBER(oric_state::oric_via_out_ca2_func)
306{
307   if (state)
308      m_psg_control |=1;
309   else
310      m_psg_control &=~1;
311
312   oric_psg_connection_refresh(generic_space());
313}
314
315WRITE_LINE_MEMBER(oric_state::oric_via_out_cb2_func)
316{
317   if (state)
318      m_psg_control |=2;
319   else
320      m_psg_control &=~2;
321
322   oric_psg_connection_refresh(generic_space());
323}
324
325
326WRITE_LINE_MEMBER(oric_state::oric_via_irq_func)
327{
328   m_irqs &= ~(1<<0);
329
330   if (state)
331   {
332      m_irqs |=(1<<0);
333   }
334
335   oric_refresh_ints();
336}
337
338
339/*
340VIA Lines
341 Oric usage
342
343PA0..PA7
344 PSG data bus, printer data lines
345
346CA1
347 printer acknowledge line
348
349CA2
350 PSG BC1 line
351
352PB0..PB2
353 keyboard lines-demultiplexer
354
355PB3
356 keyboard sense line
357
358PB4
359 printer strobe line
360
361PB5
362 (not connected)
363
364PB6
365 tape connector motor control
366
367PB7
368 tape connector output
369
370CB1
371 tape connector input
372
373CB2
374 PSG BDIR line
375
376*/
377
378
379
380
381/*********************/
382/* APPLE 2 INTERFACE */
383
384/*
385apple2 disc drive accessed through 0x0310-0x031f (read/write)
386oric via accessed through 0x0300-0x030f. (read/write)
387disk interface rom accessed through 0x0320-0x03ff (read only)
388
389CALL &320 to start, or use BOBY rom.
390*/
391
392void oric_state::oric_install_apple2_interface()
393{
394   applefdc_base_device *fdc = machine().device<applefdc_base_device>("fdc");
395   address_space &space = m_maincpu->space(AS_PROGRAM);
396
397   if (m_is_telestrat)
398   {
399      return;
400   }
401
402   space.install_read_handler(0x0300, 0x030f, read8_delegate(FUNC(oric_state::oric_IO_r), this));
403   space.install_read_handler(0x0310, 0x031f, read8_delegate(FUNC(applefdc_base_device::read), fdc));
404   space.install_read_bank(0x0320, 0x03ff, "bank4");
405   m_bank4 = membank("bank4");
406
407   space.install_write_handler(0x0300, 0x030f, write8_delegate(FUNC(oric_state::oric_IO_w), this));
408   space.install_write_handler(0x0310, 0x031f, write8_delegate(FUNC(applefdc_base_device::write), fdc));
409   m_bank4->set_base(  m_region_maincpu->base() + 0x014000 + 0x020);
410}
411
412
413void oric_state::oric_enable_memory(int low, int high, int rd, int wr)
414{
415   int i;
416   address_space &space = m_maincpu->space(AS_PROGRAM);
417
418   if (m_is_telestrat)
419   {
420      return;
421   }
422
423   for (i = low; i <= high; i++)
424   {
425      switch(i) {
426      case 1:
427         if (rd) {
428            space.install_read_bank(0xc000, 0xdfff, "bank1");
429         } else {
430            space.nop_read(0xc000, 0xdfff);
431         }
432         if (wr) {
433            space.install_write_bank(0xc000, 0xdfff, "bank5");
434         } else {
435            space.unmap_write(0xc000, 0xdfff);
436         }
437         break;
438      case 2:
439         if (rd) {
440            space.install_read_bank(0xe000, 0xf7ff, "bank2");
441         } else {
442            space.nop_read(0xe000, 0xf7ff);
443         }
444         if (wr) {
445            space.install_write_bank(0xe000, 0xf7ff, "bank6");
446         } else {
447            space.unmap_write(0xe000, 0xf7ff);
448         }
449         break;
450      case 3:
451         if (rd) {
452            space.install_read_bank(0xf800, 0xffff, "bank3");
453         } else {
454            space.nop_read(0xf800, 0xffff);
455         }
456         break;
457      }
458   }
459}
460
461
462
463/************************/
464/* APPLE 2 INTERFACE V2 */
465
466/*
467apple2 disc drive accessed through 0x0310-0x031f (read/write)
468oric via accessed through 0x0300-0x030f. (read/write)
469disk interface rom accessed through 0x0320-0x03ff (read only)
470v2 registers accessed through 0x0380-0x0383 (write only)
471
472CALL &320 to start, or use BOBY rom.
473*/
474
475WRITE8_MEMBER(oric_state::apple2_v2_interface_w)
476{
477   /* data is ignored, address is used to decode operation */
478   if (m_is_telestrat)
479      return;
480
481/*  logerror("apple 2 interface v2 rom page: %01x\n",(offset & 0x02)>>1); */
482
483   /* bit 0 is 0 for page 0, 1 for page 1 */
484   m_bank4->set_base(m_region_maincpu->base() + 0x014000 + 0x0100 + (((offset & 0x02)>>1)<<8));
485
486   oric_enable_memory(1, 3, TRUE, TRUE);
487
488   /* bit 1 is 0, rom enabled, bit 1 is 1 ram enabled */
489   if ((offset & 0x01)==0)
490   {
491      unsigned char *rom_ptr;
492
493      /* logerror("apple 2 interface v2: rom enabled\n"); */
494
495      /* enable rom */
496      rom_ptr = m_region_maincpu->base() + 0x010000;
497      m_bank1->set_base(rom_ptr);
498      m_bank2->set_base(rom_ptr+0x02000);
499      m_bank3->set_base(rom_ptr+0x03800);
500      m_bank5->set_base(m_ram_0x0c000);
501      m_bank6->set_base(m_ram_0x0c000+0x02000);
502      m_bank7->set_base(m_ram_0x0c000+0x03800);
503   }
504   else
505   {
506      /*logerror("apple 2 interface v2: ram enabled\n"); */
507
508      /* enable ram */
509      m_bank1->set_base(m_ram_0x0c000);
510      m_bank2->set_base(m_ram_0x0c000+0x02000);
511      m_bank3->set_base(m_ram_0x0c000+0x03800);
512      m_bank5->set_base(m_ram_0x0c000);
513      m_bank6->set_base(m_ram_0x0c000+0x02000);
514      m_bank7->set_base(m_ram_0x0c000+0x03800);
515   }
516}
517
518
519/* APPLE 2 INTERFACE V2 */
520void oric_state::oric_install_apple2_v2_interface()
521{
522   applefdc_base_device *fdc = machine().device<applefdc_base_device>("fdc");
523   address_space &space = m_maincpu->space(AS_PROGRAM);
524
525   space.install_read_handler(0x0300, 0x030f, read8_delegate(FUNC(oric_state::oric_IO_r), this));
526   space.install_read_handler(0x0310, 0x031f, read8_delegate(FUNC(applefdc_base_device::read), fdc));
527   space.install_read_bank(0x0320, 0x03ff, "bank4");
528   m_bank4 = membank("bank4");
529
530   space.install_write_handler(0x0300, 0x030f, write8_delegate(FUNC(oric_state::oric_IO_w), this));
531   space.install_write_handler(0x0310, 0x031f, write8_delegate(FUNC(applefdc_base_device::write), fdc));
532   space.install_write_handler(0x0380, 0x0383, write8_delegate(FUNC(oric_state::apple2_v2_interface_w),this));
533
534   apple2_v2_interface_w(space, 0, 0);
535}
536
537/********************/
538/* JASMIN INTERFACE */
539
540
541/* bit 0: overlay ram access (1 means overlay ram enabled) */
542
543/* bit 0: ROMDIS (1 means internal Basic rom disabled) */
544
545
546void oric_state::oric_jasmin_set_mem_0x0c000()
547{
548   /* assumption:
549   1. It is possible to access all 16k overlay ram.
550   2. If os is enabled, and overlay ram is enabled, all 16k can be accessed.
551   3. if os is disabled, and overlay ram is enabled, jasmin rom takes priority.
552   */
553   if (m_is_telestrat)
554   {
555      return;
556   }
557
558   /* the ram is disabled in the jasmin rom which indicates that jasmin takes
559   priority over the ram */
560
561   /* basic rom disabled? */
562   if ((m_port_3fb_w & 0x01)==0)
563   {
564      /* no, it is enabled! */
565
566      /* overlay ram enabled? */
567      if ((m_port_3fa_w & 0x01)==0)
568      {
569         unsigned char *rom_ptr;
570
571         /* no it is disabled */
572         /*logerror("&c000-&ffff is os rom\n"); */
573
574         oric_enable_memory(1, 3, TRUE, FALSE);
575
576         rom_ptr = m_region_maincpu->base() + 0x010000;
577         m_bank1->set_base(rom_ptr);
578         m_bank2->set_base(rom_ptr+0x02000);
579         m_bank3->set_base(rom_ptr+0x03800);
580      }
581      else
582      {
583         /*logerror("&c000-&ffff is ram\n"); */
584
585         oric_enable_memory(1, 3, TRUE, TRUE);
586
587         m_bank1->set_base(m_ram_0x0c000);
588         m_bank2->set_base(m_ram_0x0c000+0x02000);
589         m_bank3->set_base(m_ram_0x0c000+0x03800);
590         m_bank5->set_base(m_ram_0x0c000);
591         m_bank6->set_base(m_ram_0x0c000+0x02000);
592         m_bank7->set_base(m_ram_0x0c000+0x03800);
593      }
594   }
595   else
596   {
597      /* yes, basic rom is disabled */
598
599      if ((m_port_3fa_w & 0x01)==0)
600      {
601         /* overlay ram disabled */
602
603         /*logerror("&c000-&f8ff is nothing!\n"); */
604         oric_enable_memory(1, 2, FALSE, FALSE);
605      }
606      else
607      {
608         /*logerror("&c000-&f8ff is ram!\n"); */
609         oric_enable_memory(1, 2, TRUE, TRUE);
610
611         m_bank1->set_base(m_ram_0x0c000);
612         m_bank2->set_base(m_ram_0x0c000+0x02000);
613         m_bank5->set_base(m_ram_0x0c000);
614         m_bank6->set_base(m_ram_0x0c000+0x02000);
615      }
616
617      {
618         /* basic rom disabled */
619         unsigned char *rom_ptr;
620
621         /*logerror("&f800-&ffff is jasmin rom\n"); */
622         /* jasmin rom enabled */
623         oric_enable_memory(3, 3, TRUE, TRUE);
624         rom_ptr = m_region_maincpu->base() + 0x010000+0x04000+0x02000;
625         m_bank3->set_base(rom_ptr);
626         m_bank7->set_base(rom_ptr);
627      }
628   }
629}
630
631/* DRQ is connected to interrupt */
632WRITE_LINE_MEMBER(oric_state::oric_jasmin_wd179x_drq_w)
633{
634   if (state)
635      m_irqs |= (1<<1);
636   else
637      m_irqs &=~(1<<1);
638
639   oric_refresh_ints();
640}
641
642READ8_MEMBER(oric_state::oric_jasmin_r)
643{
644   wd1770_device *fdc = machine().device<wd1770_device>("wd179x");
645   unsigned char data = 0x0ff;
646
647   switch (offset & 0x0f)
648   {
649      /* jasmin floppy disc interface */
650      case 0x04:
651         data = fdc->status_r(space, 0);
652         break;
653      case 0x05:
654         data = fdc->track_r(space, 0);
655         break;
656      case 0x06:
657         data = fdc->sector_r(space, 0);
658         break;
659      case 0x07:
660         data = fdc->data_r(space, 0);
661         break;
662      default:
663         data = m_via6522_0->read(space,offset & 0x0f);
664         //logerror("unhandled io read: %04x %02x\n", offset, data);
665         break;
666
667   }
668
669   return data;
670}
671
672WRITE8_MEMBER(oric_state::oric_jasmin_w)
673{
674   wd1770_device *fdc = machine().device<wd1770_device>("wd179x");
675   switch (offset & 0x0f)
676   {
677      /* microdisc floppy disc interface */
678      case 0x04:
679         fdc->command_w( space, 0, data);
680         break;
681      case 0x05:
682         fdc->track_w(space, 0, data);
683         break;
684      case 0x06:
685         fdc->sector_w(space, 0, data);
686         break;
687      case 0x07:
688         fdc->data_w(space, 0, data);
689         break;
690      /* bit 0 = side */
691      case 0x08:
692         fdc->set_side(data & 0x01);
693         break;
694      /* any write will cause wd179x to reset */
695      case 0x09:
696         fdc->reset();
697         break;
698      case 0x0a:
699         //logerror("jasmin overlay ram w: %02x PC: %04x\n", data, m_maincpu->pc());
700         m_port_3fa_w = data;
701         oric_jasmin_set_mem_0x0c000();
702         break;
703      case 0x0b:
704         //logerror("jasmin romdis w: %02x PC: %04x\n", data, m_maincpu->pc());
705         m_port_3fb_w = data;
706         oric_jasmin_set_mem_0x0c000();
707         break;
708      /* bit 0,1 of addr is the drive */
709      case 0x0c:
710      case 0x0d:
711      case 0x0e:
712      case 0x0f:
713         fdc->set_drive(offset & 0x03);
714         break;
715
716      default:
717         m_via6522_0->write(space,offset & 0x0f, data);
718         break;
719   }
720}
721
722
723void oric_state::oric_install_jasmin_interface()
724{
725   address_space &space = m_maincpu->space(AS_PROGRAM);
726   /* romdis */
727   m_port_3fb_w = 1;
728   oric_jasmin_set_mem_0x0c000();
729
730   space.install_read_handler(0x0300, 0x03ef, read8_delegate(FUNC(oric_state::oric_IO_r),this));
731   space.install_read_handler(0x03f0, 0x03ff, read8_delegate(FUNC(oric_state::oric_jasmin_r),this));
732
733   space.install_write_handler(0x0300, 0x03ef, write8_delegate(FUNC(oric_state::oric_IO_w),this));
734   space.install_write_handler(0x03f0, 0x03ff, write8_delegate(FUNC(oric_state::oric_jasmin_w),this));
735}
736
737/*********************************/
738/* MICRODISC INTERFACE variables */
739
740/* used by Microdisc interfaces */
741
742/* bit 7 is intrq state */
743/* bit 7 is drq state (active low) */
744/* bit 6,5: drive */
745/* bit 4: side */
746/* bit 3: double density enable */
747/* bit 0: enable FDC IRQ to trigger IRQ on CPU */
748
749
750void oric_state::oric_microdisc_refresh_wd179x_ints()
751{
752   m_irqs &=~(1<<1);
753
754   if ((m_wd179x_int_state) && (m_port_314_w & (1<<0)))
755   {
756      /*logerror("oric microdisc interrupt\n"); */
757
758      m_irqs |=(1<<1);
759   }
760
761   oric_refresh_ints();
762}
763
764WRITE_LINE_MEMBER(oric_state::oric_microdisc_wd179x_intrq_w)
765{
766   m_wd179x_int_state = state;
767
768   if (state)
769      m_port_314_r &= ~(1<<7);
770   else
771      m_port_314_r |=(1<<7);
772
773   oric_microdisc_refresh_wd179x_ints();
774}
775
776WRITE_LINE_MEMBER(oric_state::oric_microdisc_wd179x_drq_w)
777{
778   if (state)
779      m_port_318_r &=~(1<<7);
780   else
781      m_port_318_r |= (1<<7);
782}
783
784void oric_state::oric_microdisc_set_mem_0x0c000()
785{
786   if (m_is_telestrat)
787   {
788      return;
789   }
790
791   /* for 0x0c000-0x0dfff: */
792   /* if os disabled, ram takes priority */
793   /* /ROMDIS */
794   if ((m_port_314_w & (1<<1))==0)
795   {
796      /*logerror("&c000-&dfff is ram\n"); */
797      /* rom disabled enable ram */
798      oric_enable_memory(1, 1, TRUE, TRUE);
799      m_bank1->set_base(m_ram_0x0c000);
800      m_bank5->set_base(m_ram_0x0c000);
801   }
802   else
803   {
804      unsigned char *rom_ptr;
805      /*logerror("&c000-&dfff is os rom\n"); */
806      /* basic rom */
807      oric_enable_memory(1, 1, TRUE, FALSE);
808      rom_ptr = m_region_maincpu->base() + 0x010000;
809      m_bank1->set_base(rom_ptr);
810      m_bank5->set_base(rom_ptr);
811   }
812
813   /* for 0x0e000-0x0ffff */
814   /* if not disabled, os takes priority */
815   if ((m_port_314_w & (1<<1))!=0)
816   {
817      unsigned char *rom_ptr;
818      /*logerror("&e000-&ffff is os rom\n"); */
819      /* basic rom */
820      oric_enable_memory(2, 3, TRUE, FALSE);
821      rom_ptr = m_region_maincpu->base() + 0x010000;
822      m_bank2->set_base(rom_ptr+0x02000);
823      m_bank3->set_base(rom_ptr+0x03800);
824      m_bank6->set_base(rom_ptr+0x02000);
825      m_bank7->set_base(rom_ptr+0x03800);
826
827   }
828   else
829   {
830      /* if eprom is enabled, it takes priority over ram */
831      if ((m_port_314_w & (1<<7))==0)
832      {
833         unsigned char *rom_ptr;
834         /*logerror("&e000-&ffff is disk rom\n"); */
835         oric_enable_memory(2, 3, TRUE, FALSE);
836         /* enable rom of microdisc interface */
837         rom_ptr = m_region_maincpu->base() + 0x014000;
838         m_bank2->set_base(rom_ptr);
839         m_bank3->set_base(rom_ptr+0x01800);
840      }
841      else
842      {
843         /*logerror("&e000-&ffff is ram\n"); */
844         /* rom disabled enable ram */
845         oric_enable_memory(2, 3, TRUE, TRUE);
846         m_bank2->set_base(m_ram_0x0c000+0x02000);
847         m_bank3->set_base(m_ram_0x0c000+0x03800);
848         m_bank6->set_base(m_ram_0x0c000+0x02000);
849         m_bank7->set_base(m_ram_0x0c000+0x03800);
850      }
851   }
852}
853
854
855
856READ8_MEMBER(oric_state::oric_microdisc_r)
857{
858   unsigned char data = 0x0ff;
859   wd1770_device *fdc = machine().device<wd1770_device>("wd179x");
860
861   switch (offset & 0x0ff)
862   {
863      /* microdisc floppy disc interface */
864      case 0x00:
865         data = fdc->status_r(space, 0);
866         break;
867      case 0x01:
868         data = fdc->track_r(space, 0);
869         break;
870      case 0x02:
871         data = fdc->sector_r(space, 0);
872         break;
873      case 0x03:
874         data = fdc->data_r(space, 0);
875         break;
876      case 0x04:
877         data = m_port_314_r | 0x07f;
878/*          logerror("port_314_r: %02x\n",data); */
879         break;
880      case 0x08:
881         data = m_port_318_r | 0x07f;
882/*          logerror("port_318_r: %02x\n",data); */
883         break;
884
885      default:
886         data = m_via6522_0->read(space, offset & 0x0f);
887         break;
888
889   }
890
891   return data;
892}
893
894WRITE8_MEMBER(oric_state::oric_microdisc_w)
895{
896   wd1770_device *fdc = machine().device<wd1770_device>("wd179x");
897   switch (offset & 0x0ff)
898   {
899      /* microdisc floppy disc interface */
900      case 0x00:
901         fdc->command_w(space, 0, data);
902         break;
903      case 0x01:
904         fdc->track_w(space, 0, data);
905         break;
906      case 0x02:
907         fdc->sector_w(space, 0, data);
908         break;
909      case 0x03:
910         fdc->data_w(space, 0, data);
911         break;
912      case 0x04:
913      {
914         m_port_314_w = data;
915
916         //logerror("port_314_w: %02x\n",data);
917
918         /* bit 6,5: drive */
919         /* bit 4: side */
920         /* bit 3: double density enable */
921         /* bit 0: enable FDC IRQ to trigger IRQ on CPU */
922         fdc->set_drive((data>>5) & 0x03);
923         fdc->set_side((data>>4) & 0x01);
924         fdc->dden_w(!BIT(data, 3));
925
926         oric_microdisc_set_mem_0x0c000();
927         oric_microdisc_refresh_wd179x_ints();
928      }
929      break;
930
931      default:
932         m_via6522_0->write(space, offset & 0x0f, data);
933         break;
934   }
935}
936
937void oric_state::oric_install_microdisc_interface()
938{
939   address_space &space = m_maincpu->space(AS_PROGRAM);
940
941   space.install_read_handler(0x0300, 0x030f, read8_delegate(FUNC(oric_state::oric_IO_r),this));
942   space.install_read_handler(0x0310, 0x031f, read8_delegate(FUNC(oric_state::oric_microdisc_r),this));
943   space.install_read_handler(0x0320, 0x03ff, read8_delegate(FUNC(oric_state::oric_IO_r),this));
944
945   space.install_write_handler(0x0300, 0x030f, write8_delegate(FUNC(oric_state::oric_IO_w),this));
946   space.install_write_handler(0x0310, 0x031f, write8_delegate(FUNC(oric_state::oric_microdisc_w),this));
947   space.install_write_handler(0x0320, 0x03ff, write8_delegate(FUNC(oric_state::oric_IO_w),this));
948
949   /* disable os rom, enable microdisc rom */
950   /* 0x0c000-0x0dfff will be ram, 0x0e000-0x0ffff will be microdisc rom */
951   m_port_314_w = 0x0ff^((1<<7) | (1<<1));
952
953   oric_microdisc_set_mem_0x0c000();
954}
955
956
957
958/*********************************************************/
959
960WRITE_LINE_MEMBER(oric_state::oric_wd179x_intrq_w)
961{
962   if ((m_io_floppy->read() & 0x07) == ORIC_FLOPPY_INTERFACE_MICRODISC)
963   {
964      oric_microdisc_wd179x_intrq_w(state);
965   }
966}
967
968WRITE_LINE_MEMBER(oric_state::oric_wd179x_drq_w)
969{
970   switch (m_io_floppy->read() &  0x07)
971   {
972      default:
973      case ORIC_FLOPPY_INTERFACE_NONE:
974      case ORIC_FLOPPY_INTERFACE_APPLE2:
975         return;
976      case ORIC_FLOPPY_INTERFACE_MICRODISC:
977         oric_microdisc_wd179x_drq_w(state);
978         return;
979      case ORIC_FLOPPY_INTERFACE_JASMIN:
980         oric_jasmin_wd179x_drq_w(state);
981         return;
982   }
983}
984
985const wd17xx_interface oric_wd17xx_interface =
986{
987   DEVCB_NULL,
988   DEVCB_DRIVER_LINE_MEMBER(oric_state,oric_wd179x_intrq_w),
989   DEVCB_DRIVER_LINE_MEMBER(oric_state,oric_wd179x_drq_w),
990   {FLOPPY_0, FLOPPY_1, FLOPPY_2, FLOPPY_3}
991};
992
993void oric_state::oric_common_init_machine()
994{
995   /* clear all irqs */
996   m_irqs = 0;
997   m_ram_0x0c000 = NULL;
998   m_keyboard_line = 0;
999   m_key_sense_bit = 0;
1000   m_keyboard_mask = 0;
1001   m_via_port_a_data = 0;
1002   m_psg_control = 0;
1003   m_previous_portb_data = 0;
1004   m_port_3fa_w = 0;
1005   m_port_3fb_w = 0;
1006   m_wd179x_int_state = 0;
1007   m_port_314_r = 0;
1008   m_port_318_r = 0;
1009   m_port_314_w = 0;
1010   machine().scheduler().timer_pulse(attotime::from_hz(4800), timer_expired_delegate(FUNC(oric_state::oric_refresh_tape),this));
1011}
1012
1013void oric_state::machine_start()
1014{
1015   oric_common_init_machine();
1016
1017   m_is_telestrat = 0;
1018
1019   m_ram_0x0c000 = auto_alloc_array(machine(), UINT8, 16384);
1020}
1021
1022
1023void oric_state::machine_reset()
1024{
1025   int disc_interface_id = m_io_floppy->read() & 0x07;
1026   address_space &space = m_maincpu->space(AS_PROGRAM);
1027   if (m_is_telestrat)
1028      return;
1029
1030   switch (disc_interface_id)
1031   {
1032      default:
1033
1034      case ORIC_FLOPPY_INTERFACE_APPLE2:
1035      case ORIC_FLOPPY_INTERFACE_NONE:
1036      {
1037         /* setup memory when there is no disc interface */
1038         unsigned char *rom_ptr;
1039
1040         /* os rom */
1041         oric_enable_memory(1, 3, TRUE, FALSE);
1042         rom_ptr = m_region_maincpu->base() + 0x010000;
1043         m_bank1->set_base(rom_ptr);
1044         m_bank2->set_base(rom_ptr+0x02000);
1045         m_bank3->set_base(rom_ptr+0x03800);
1046         m_bank5->set_base(rom_ptr);
1047         m_bank6->set_base(rom_ptr+0x02000);
1048         m_bank7->set_base(rom_ptr+0x03800);
1049
1050
1051         if (disc_interface_id==ORIC_FLOPPY_INTERFACE_APPLE2)
1052         {
1053            oric_install_apple2_interface();
1054         }
1055         else
1056         {
1057            space.install_read_handler(0x0300, 0x03ff, read8_delegate(FUNC(oric_state::oric_IO_r),this));
1058            space.install_write_handler(0x0300, 0x03ff, write8_delegate(FUNC(oric_state::oric_IO_w),this));
1059         }
1060      }
1061      break;
1062
1063      case ORIC_FLOPPY_INTERFACE_APPLE2_V2:
1064      {
1065         oric_install_apple2_v2_interface();
1066      }
1067      break;
1068
1069
1070      case ORIC_FLOPPY_INTERFACE_MICRODISC:
1071      {
1072         oric_install_microdisc_interface();
1073      }
1074      break;
1075
1076      case ORIC_FLOPPY_INTERFACE_JASMIN:
1077      {
1078         oric_install_jasmin_interface();
1079      }
1080      break;
1081   }
1082   m_maincpu->reset();
1083}
1084
1085
1086READ8_MEMBER(oric_state::oric_IO_r)
1087{
1088   switch (m_io_floppy->read() & 0x07)
1089   {
1090      default:
1091      case ORIC_FLOPPY_INTERFACE_NONE:
1092         break;
1093
1094      case ORIC_FLOPPY_INTERFACE_MICRODISC:
1095      {
1096         if ((offset>=0x010) && (offset<=0x01f))
1097         {
1098            return oric_microdisc_r(space, offset);
1099         }
1100      }
1101      break;
1102
1103      case ORIC_FLOPPY_INTERFACE_JASMIN:
1104      {
1105         if ((offset>=0x0f4) && (offset<=0x0ff))
1106         {
1107            return oric_jasmin_r(space, offset);
1108         }
1109      }
1110      break;
1111   }
1112
1113   /* it is repeated */
1114   return m_via6522_0->read(space, offset & 0x0f);
1115}
1116
1117WRITE8_MEMBER(oric_state::oric_IO_w)
1118{
1119   switch (m_io_floppy->read() & 0x07)
1120   {
1121      default:
1122      case ORIC_FLOPPY_INTERFACE_NONE:
1123         break;
1124
1125      case ORIC_FLOPPY_INTERFACE_MICRODISC:
1126      {
1127         if ((offset >= 0x010) && (offset <= 0x01f))
1128         {
1129            oric_microdisc_w(space, offset, data);
1130            return;
1131         }
1132      }
1133      break;
1134
1135      case ORIC_FLOPPY_INTERFACE_JASMIN:
1136      {
1137         if ((offset >= 0x0f4) && (offset <= 0x0ff))
1138         {
1139            oric_jasmin_w(space, offset, data);
1140            return;
1141         }
1142
1143      }
1144      break;
1145   }
1146
1147   m_via6522_0->write(space, offset & 0x0f, data);
1148}
1149
1150
1151
1152/**** TELESTRAT ****/
1153
1154/*
1155VIA lines
1156 Telestrat usage
1157
1158PA0..PA2
1159 Memory bank selection
1160
1161PA3
1162 "Midi" port pin 3
1163
1164PA4
1165 RS232/Minitel selection
1166
1167PA5
1168 Third mouse button (right joystick port pin 5)
1169
1170PA6
1171 "Midi" port pin 5
1172
1173PA7
1174 Second mouse button (right joystick port pin 9)
1175
1176CA1
1177 "Midi" port pin 1
1178
1179CA2
1180 not used ?
1181
1182PB0..PB4
1183 Joystick ports
1184
1185PB5
1186 Joystick doubler switch
1187
1188PB6
1189 Select Left Joystick port
1190
1191PB7
1192 Select Right Joystick port
1193
1194CB1
1195 Phone Ring detection
1196
1197CB2
1198 "Midi" port pin 4
1199
1200*/
1201
1202
1203void oric_state::telestrat_refresh_mem()
1204{
1205   address_space &space = m_maincpu->space(AS_PROGRAM);
1206
1207   telestrat_mem_block *mem_block = &m_telestrat_blocks[m_telestrat_bank_selection];
1208
1209   switch (mem_block->MemType)
1210   {
1211      case TELESTRAT_MEM_BLOCK_RAM:
1212      {
1213         m_bank1->set_base(mem_block->ptr);
1214         m_bank2->set_base(mem_block->ptr);
1215         space.install_read_bank(0xc000, 0xffff, "bank1");
1216         space.install_write_bank(0xc000, 0xffff, "bank2");
1217      }
1218      break;
1219
1220      case TELESTRAT_MEM_BLOCK_ROM:
1221      {
1222         m_bank1->set_base(mem_block->ptr);
1223         space.install_read_bank(0xc000, 0xffff, "bank1");
1224         space.nop_write(0xc000, 0xffff);
1225      }
1226      break;
1227
1228      default:
1229      case TELESTRAT_MEM_BLOCK_UNDEFINED:
1230      {
1231         space.nop_readwrite(0xc000, 0xffff);
1232      }
1233      break;
1234   }
1235}
1236
1237READ8_MEMBER(oric_state::telestrat_via2_in_a_func)
1238{
1239   //logerror("via 2 - port a %02x\n",m_telestrat_via2_port_a_data);
1240   return m_telestrat_via2_port_a_data;
1241}
1242
1243
1244WRITE8_MEMBER(oric_state::telestrat_via2_out_a_func)
1245{
1246   //logerror("via 2 - port a w: %02x\n",data);
1247
1248   m_telestrat_via2_port_a_data = data;
1249
1250   if (((data^m_telestrat_bank_selection) & 0x07)!=0)
1251   {
1252      m_telestrat_bank_selection = data & 0x07;
1253
1254      telestrat_refresh_mem();
1255   }
1256}
1257
1258READ8_MEMBER(oric_state::telestrat_via2_in_b_func)
1259{
1260   unsigned char data = 0x01f;
1261
1262   /* left joystick selected? */
1263   if (m_telestrat_via2_port_b_data & (1<<6))
1264   {
1265      data &= ioport("JOY0")->read();
1266   }
1267
1268   /* right joystick selected? */
1269   if (m_telestrat_via2_port_b_data & (1<<7))
1270   {
1271      data &= ioport("JOY1")->read();
1272   }
1273
1274   data |= m_telestrat_via2_port_b_data & ((1<<7) | (1<<6) | (1<<5));
1275
1276   return data;
1277}
1278
1279WRITE8_MEMBER(oric_state::telestrat_via2_out_b_func)
1280{
1281   m_telestrat_via2_port_b_data = data;
1282}
1283
1284
1285WRITE_LINE_MEMBER(oric_state::telestrat_via2_irq_func)
1286{
1287   m_irqs &=~(1<<2);
1288
1289   if (state)
1290   {
1291      //logerror("telestrat via2 interrupt\n");
1292
1293      m_irqs |=(1<<2);
1294   }
1295
1296   oric_refresh_ints();
1297}
1298
1299/* interrupt state from acia6551 */
1300WRITE_LINE_MEMBER(oric_state::telestrat_acia_callback)
1301{
1302   m_irqs&=~(1<<3);
1303
1304   if (state)
1305   {
1306      m_irqs |= (1<<3);
1307   }
1308
1309   oric_refresh_ints();
1310}
1311
1312MACHINE_START_MEMBER(oric_state,telestrat)
1313{
1314   UINT8 *mem = m_region_maincpu->base();
1315
1316   oric_common_init_machine();
1317
1318   m_telestrat_via2_port_a_data = 0;
1319   m_telestrat_via2_port_b_data = 0;
1320   m_is_telestrat = 1;
1321
1322   /* initialise overlay ram */
1323   m_telestrat_blocks[0].MemType = TELESTRAT_MEM_BLOCK_RAM;
1324   m_telestrat_blocks[0].ptr = mem+0x020000; //auto_alloc_array(machine(), UINT8, 16384);
1325
1326   m_telestrat_blocks[1].MemType = TELESTRAT_MEM_BLOCK_RAM;
1327   m_telestrat_blocks[1].ptr = mem+0x024000; //auto_alloc_array(machine(), UINT8, 16384);
1328
1329   m_telestrat_blocks[2].MemType = TELESTRAT_MEM_BLOCK_RAM;
1330   m_telestrat_blocks[2].ptr = mem+0x028000; //auto_alloc_array(machine(), UINT8, 16384);
1331
1332   /* initialise default cartridge */
1333   m_telestrat_blocks[3].MemType = TELESTRAT_MEM_BLOCK_ROM;
1334   m_telestrat_blocks[3].ptr = mem+0x010000; // telmatic.rom
1335
1336   m_telestrat_blocks[4].MemType = TELESTRAT_MEM_BLOCK_RAM;
1337   m_telestrat_blocks[4].ptr = mem+0x02c000; //auto_alloc_array(machine(), UINT8, 16384);
1338
1339   /* initialise default cartridge */
1340   m_telestrat_blocks[5].MemType = TELESTRAT_MEM_BLOCK_ROM;
1341   m_telestrat_blocks[5].ptr = mem+0x014000;  // teleass.rom
1342
1343   /* initialise default cartridge */
1344   m_telestrat_blocks[6].MemType = TELESTRAT_MEM_BLOCK_ROM;
1345   m_telestrat_blocks[6].ptr = mem+0x018000; // hyperbas.rom
1346
1347   /* initialise default cartridge */
1348   m_telestrat_blocks[7].MemType = TELESTRAT_MEM_BLOCK_ROM;
1349   m_telestrat_blocks[7].ptr = mem+0x01c000; // telmon24.rom
1350
1351   m_telestrat_bank_selection = 7;
1352   telestrat_refresh_mem();
1353
1354   /* disable os rom, enable microdisc rom */
1355   /* 0x0c000-0x0dfff will be ram, 0x0e000-0x0ffff will be microdisc rom */
1356   m_port_314_w = 0x0ff^((1<<7) | (1<<1));
1357}
trunk/src/mess/includes/oric.h
r29567r29568
1/*****************************************************************************
2 *
3 * includes/oric.h
4 *
5 ****************************************************************************/
6
7#ifndef ORIC_H_
8#define ORIC_H_
9
10#include "emu.h"
11#include "cpu/m6502/m6502.h"
12#include "sound/ay8910.h"
13#include "sound/wave.h"
14#include "machine/6522via.h"
15#include "machine/mos6551.h"
16#include "machine/buffer.h"
17#include "bus/centronics/ctronics.h"
18#include "machine/wd17xx.h"
19//#include <stdio.h>
20#include "machine/applefdc.h"
21#include "imagedev/flopdrv.h"
22#include "imagedev/cassette.h"
23#include "formats/oric_dsk.h"
24#include "formats/ap2_dsk.h"
25#include "formats/oric_tap.h"
26
27enum
28{
29   TELESTRAT_MEM_BLOCK_UNDEFINED,
30   TELESTRAT_MEM_BLOCK_RAM,
31   TELESTRAT_MEM_BLOCK_ROM
32};
33
34struct telestrat_mem_block
35{
36   int     MemType;
37   unsigned char *ptr;
38};
39
40
41/* current state of the display */
42/* some attributes persist until they are turned off.
43This structure holds this persistant information */
44struct oric_vh_state
45{
46   /* foreground and background colour used for rendering */
47   /* if flash attribute is set, these two will both be equal to background colour */
48   UINT8 active_foreground_colour;
49   UINT8 active_background_colour;
50   /* current foreground and background colour */
51   UINT8 foreground_colour;
52   UINT8 background_colour;
53   UINT8 mode;
54   /* text attributes */
55   UINT8 text_attributes;
56
57   offs_t read_addr;
58
59   /* current addr to fetch data */
60   UINT8 *char_data;
61   /* base of char data */
62   UINT8 *char_base;
63
64   /* if (1<<3), display graphics, if 0, hide graphics */
65   /* current count */
66   UINT8 flash_count;
67};
68
69
70class oric_state : public driver_device
71{
72public:
73   oric_state(const machine_config &mconfig, device_type type, const char *tag)
74      : driver_device(mconfig, type, tag),
75      m_ram(*this, "ram"),
76      m_maincpu(*this, "maincpu"),
77      m_ay8912(*this, "ay8912"),
78      m_centronics(*this, "centronics"),
79      m_cent_data_out(*this, "cent_data_out"),
80      m_cassette(*this, "cassette"),
81      m_via6522_0(*this, "via6522_0"),
82      m_region_maincpu(*this, "maincpu"),
83      m_bank1(*this, "bank1"),
84      m_bank2(*this, "bank2"),
85      m_bank3(*this, "bank3"),
86      m_bank4(NULL),
87      m_bank5(*this, "bank5"),
88      m_bank6(*this, "bank6"),
89      m_bank7(*this, "bank7"),
90      m_io_row0(*this, "ROW0"),
91      m_io_row1(*this, "ROW1"),
92      m_io_row2(*this, "ROW2"),
93      m_io_row3(*this, "ROW3"),
94      m_io_row4(*this, "ROW4"),
95      m_io_row5(*this, "ROW5"),
96      m_io_row6(*this, "ROW6"),
97      m_io_row7(*this, "ROW7"),
98      m_io_floppy(*this, "FLOPPY") { }
99
100   optional_shared_ptr<UINT8> m_ram;
101   bool m_is_telestrat;
102   UINT8 m_irqs;
103   UINT8 *m_ram_0x0c000;
104   UINT8 m_keyboard_line;
105   UINT8 m_key_sense_bit;
106   UINT8 m_keyboard_mask;
107   UINT8 m_via_port_a_data;
108   UINT8 m_psg_control;
109   UINT8 m_previous_portb_data;
110   UINT8 m_port_3fa_w;
111   UINT8 m_port_3fb_w;
112   UINT8 m_wd179x_int_state;
113   UINT8 m_port_314_r;
114   UINT8 m_port_318_r;
115   UINT8 m_port_314_w;
116   UINT8 m_telestrat_bank_selection;
117   UINT8 m_telestrat_via2_port_a_data;
118   UINT8 m_telestrat_via2_port_b_data;
119   telestrat_mem_block m_telestrat_blocks[8];
120   oric_vh_state m_vh_state;
121   DECLARE_WRITE8_MEMBER(oric_psg_porta_write);
122   DECLARE_WRITE8_MEMBER(apple2_v2_interface_w);
123   DECLARE_READ8_MEMBER(oric_jasmin_r);
124   DECLARE_WRITE8_MEMBER(oric_jasmin_w);
125   DECLARE_READ8_MEMBER(oric_microdisc_r);
126   DECLARE_WRITE8_MEMBER(oric_microdisc_w);
127   DECLARE_READ8_MEMBER(oric_IO_r);
128   DECLARE_WRITE8_MEMBER(oric_IO_w);
129   virtual void machine_start();
130   virtual void machine_reset();
131   virtual void video_start();
132   DECLARE_PALETTE_INIT(oric);
133   DECLARE_MACHINE_START(telestrat);
134   UINT32 screen_update_oric(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
135   TIMER_CALLBACK_MEMBER(oric_refresh_tape);
136   TIMER_CALLBACK_MEMBER(oric_vh_timer_callback);
137   DECLARE_READ8_MEMBER(oric_via_in_a_func);
138   DECLARE_READ8_MEMBER(oric_via_in_b_func);
139   DECLARE_WRITE8_MEMBER(oric_via_out_a_func);
140   DECLARE_WRITE8_MEMBER(oric_via_out_b_func);
141   DECLARE_WRITE_LINE_MEMBER(oric_via_out_ca2_func);
142   DECLARE_WRITE_LINE_MEMBER(oric_via_out_cb2_func);
143   DECLARE_WRITE_LINE_MEMBER(oric_jasmin_wd179x_drq_w);
144   DECLARE_WRITE_LINE_MEMBER(oric_microdisc_wd179x_intrq_w);
145   DECLARE_WRITE_LINE_MEMBER(oric_microdisc_wd179x_drq_w);
146   DECLARE_WRITE_LINE_MEMBER(oric_wd179x_intrq_w);
147   DECLARE_WRITE_LINE_MEMBER(oric_wd179x_drq_w);
148   DECLARE_WRITE_LINE_MEMBER(oric_via_irq_func);
149   DECLARE_READ8_MEMBER(telestrat_via2_in_a_func);
150   DECLARE_WRITE8_MEMBER(telestrat_via2_out_a_func);
151   DECLARE_READ8_MEMBER(telestrat_via2_in_b_func);
152   DECLARE_WRITE8_MEMBER(telestrat_via2_out_b_func);
153   DECLARE_WRITE_LINE_MEMBER(telestrat_via2_irq_func);
154   DECLARE_WRITE_LINE_MEMBER(telestrat_acia_callback);
155
156protected:
157   required_device<cpu_device> m_maincpu;
158   required_device<ay8910_device> m_ay8912;
159   required_device<centronics_device> m_centronics;
160   required_device<output_latch_device> m_cent_data_out;
161   required_device<cassette_image_device> m_cassette;
162   required_device<via6522_device> m_via6522_0;
163   required_memory_region m_region_maincpu;
164   required_memory_bank m_bank1;
165   required_memory_bank m_bank2;
166   optional_memory_bank m_bank3;
167   memory_bank *m_bank4;
168   optional_memory_bank m_bank5;
169   optional_memory_bank m_bank6;
170   optional_memory_bank m_bank7;
171   required_ioport m_io_row0;
172   required_ioport m_io_row1;
173   required_ioport m_io_row2;
174   required_ioport m_io_row3;
175   required_ioport m_io_row4;
176   required_ioport m_io_row5;
177   required_ioport m_io_row6;
178   required_ioport m_io_row7;
179   required_ioport m_io_floppy;
180
181   void oric_microdisc_refresh_wd179x_ints();
182   void oric_refresh_ints();
183   void oric_keyboard_sense_refresh();
184   void oric_psg_connection_refresh(address_space &space);
185   void oric_common_init_machine();
186   void oric_install_apple2_interface();
187   void oric_install_apple2_v2_interface();
188   void oric_install_microdisc_interface();
189   void oric_install_jasmin_interface();
190   void oric_microdisc_set_mem_0x0c000();
191   void telestrat_refresh_mem();
192   void oric_enable_memory(int low, int high, int rd, int wr);
193   void oric_jasmin_set_mem_0x0c000();
194
195   void oric_vh_update_attribute(UINT8 c);
196   void oric_vh_update_flash();
197   void oric_refresh_charset();
198   void oric_vh_render_6pixels(bitmap_ind16 &bitmap, int x, UINT8 y, UINT8 fg, UINT8 bg, UINT8 data, bool invert_flag);
199};
200
201/*----------- defined in machine/oric.c -----------*/
202extern const wd17xx_interface oric_wd17xx_interface;
203
204#endif /* ORIC_H_ */
trunk/src/mess/video/oric.c
r29567r29568
1/***************************************************************************
2
3    video/oric.c
4
5    All graphic effects are supported including mid-line changes.
6    There may be some small bugs.
7
8    TODO:
9    - speed up this code a bit?
10
11***************************************************************************/
12
13#include "includes/oric.h"
14
15TIMER_CALLBACK_MEMBER(oric_state::oric_vh_timer_callback)
16{
17   /* update flash count */
18   m_vh_state.flash_count++;
19}
20
21void oric_state::oric_vh_update_flash()
22{
23   /* flash active? */
24   if (BIT(m_vh_state.text_attributes, 2))
25   {
26      /* yes */
27
28      /* show or hide text? */
29      if (BIT(m_vh_state.flash_count, 4))
30      {
31         /* hide */
32         /* set foreground and background to be the same */
33         m_vh_state.active_foreground_colour = m_vh_state.background_colour;
34         m_vh_state.active_background_colour = m_vh_state.background_colour;
35         return;
36      }
37   }
38
39
40   /* show */
41   m_vh_state.active_foreground_colour = m_vh_state.foreground_colour;
42   m_vh_state.active_background_colour = m_vh_state.background_colour;
43}
44
45/* the alternate charset follows from the standard charset.
46Each charset holds 128 chars with 8 bytes for each char.
47
48The start address for the standard charset is dependant on the video mode */
49void oric_state::oric_refresh_charset()
50{
51   /* alternate char set? */
52   if (BIT(m_vh_state.text_attributes, 0))
53   {
54      /* yes */
55      m_vh_state.char_data = m_vh_state.char_base + (128*8);
56   }
57   else
58   {
59      /* no */
60      m_vh_state.char_data = m_vh_state.char_base;
61   }
62}
63
64/* update video hardware state depending on the new attribute */
65void oric_state::oric_vh_update_attribute(UINT8 c)
66{
67   /* attribute */
68   UINT8 attribute = c & 0x03f;
69   address_space &space = m_maincpu->space(AS_PROGRAM);
70
71   switch ((attribute>>3) & 0x03)
72   {
73      case 0:
74      {
75         /* set foreground colour 00-07 = black,red,green,yellow,blue,magenta,cyan,white */
76         m_vh_state.foreground_colour = attribute & 0x07;
77         oric_vh_update_flash();
78      }
79      break;
80
81      case 1:
82      {
83         m_vh_state.text_attributes = attribute & 0x07;
84
85         oric_refresh_charset();
86
87         /* text attributes */
88         oric_vh_update_flash();
89      }
90      break;
91
92      case 2:
93      {
94         /* set background colour */
95         m_vh_state.background_colour = attribute & 0x07;
96         oric_vh_update_flash();
97      }
98      break;
99
100      case 3:
101      {
102         /* set video mode */
103         m_vh_state.mode = attribute & 0x07;
104
105         // a different charset base is used depending on the video mode
106         // hires takes all the data from 0x0a000 through to about 0x0bf68,
107         // so the charset is moved to 0x09800 */
108         // text mode starts at 0x0bb80 and so the charset is in a different location
109         if (BIT(m_vh_state.mode, 2))
110         {
111            /* set screen memory base and standard charset location for this mode */
112            m_vh_state.read_addr = 0x0a000;
113            if (m_ram)
114               m_vh_state.char_base = m_ram + (offs_t)0x09800;
115            else
116               m_vh_state.char_base = (UINT8 *)space.get_read_ptr(0x09800);
117         }
118         else
119         {
120            /* set screen memory base and standard charset location for this mode */
121            m_vh_state.read_addr = 0x0bb80;
122            if (m_ram)
123               m_vh_state.char_base = m_ram + (offs_t)0x0b400;
124            else
125               m_vh_state.char_base = (UINT8 *)space.get_read_ptr(0x0b400);
126         }
127         /* changing the mode also changes the position of the standard charset and alternative charset */
128         oric_refresh_charset();
129      }
130      break;
131
132      default:
133         break;
134   }
135}
136
137
138/* render 6-pixels using foreground and background colours specified */
139/* used in hires and text mode */
140void oric_state::oric_vh_render_6pixels(bitmap_ind16 &bitmap, int x, UINT8 y, UINT8 fg, UINT8 bg, UINT8 data, bool invert_flag)
141{
142   /* invert? */
143   if (invert_flag)
144   {
145      fg ^=0x07;
146      bg ^=0x07;
147   }
148
149   bitmap.pix16(y, x++) = BIT(data, 5) ? fg : bg;
150   bitmap.pix16(y, x++) = BIT(data, 4) ? fg : bg;
151   bitmap.pix16(y, x++) = BIT(data, 3) ? fg : bg;
152   bitmap.pix16(y, x++) = BIT(data, 2) ? fg : bg;
153   bitmap.pix16(y, x++) = BIT(data, 1) ? fg : bg;
154   bitmap.pix16(y, x++) = BIT(data, 0) ? fg : bg;
155}
156
157
158
159
160
161/***************************************************************************
162  oric_vh_screenrefresh
163***************************************************************************/
164UINT32 oric_state::screen_update_oric(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
165{
166   UINT8 *RAM, y;
167   offs_t byte_offset, read_addr_base;
168   bool hires_active;
169   address_space &space = m_maincpu->space(AS_PROGRAM);
170
171   RAM = m_ram;
172
173   /* set initial base */
174   read_addr_base = m_vh_state.read_addr;
175
176   /* is hires active? */
177   hires_active = BIT(m_vh_state.mode, 2);
178
179   for (y = 0; y < 224; y++)
180   {
181      int x = 0;
182
183      /* foreground colour white */
184      oric_vh_update_attribute(7);
185      /* background colour black */
186      oric_vh_update_attribute((1<<3));
187      oric_vh_update_attribute((1<<4));
188
189      for (byte_offset=0; byte_offset<40; byte_offset++)
190      {
191         UINT8 c;
192         offs_t read_addr;
193
194         /* after line 200 all rendering is done in text mode */
195         if (y<200)
196         {
197            /* calculate fetch address based on current line and current mode */
198            if (hires_active)
199            {
200               read_addr = read_addr_base + byte_offset + (offs_t)(y*40);
201            }
202            else
203            {
204               UINT8 char_line = y>>3;
205               read_addr = read_addr_base + byte_offset + (offs_t)(char_line*40);
206            }
207         }
208         else
209         {
210            UINT8 char_line = (y-200)>>3;
211            read_addr = read_addr_base + byte_offset + (offs_t)(char_line*40);
212         }
213
214         /* fetch data */
215         c = RAM ? RAM[read_addr] : space.read_byte(read_addr);
216
217         /* if bits 6 and 5 are zero, the byte contains a serial attribute */
218         if ((c & ((1 << 6) | (1 << 5))) == 0)
219         {
220            oric_vh_update_attribute(c);
221
222            /* display background colour when attribute has been found */
223            oric_vh_render_6pixels(bitmap, x, y, m_vh_state.active_foreground_colour, m_vh_state.active_background_colour, 0, (c & 0x080));
224
225            if (y < 200)
226            {
227               /* is hires active? */
228               hires_active = BIT(m_vh_state.mode, 2);
229               read_addr_base = m_vh_state.read_addr;
230            }
231         }
232         else
233         {
234            /* hires? */
235            if (hires_active)
236            {
237               UINT8 pixel_data = c & 0x03f;
238               /* plot hires pixels */
239               oric_vh_render_6pixels(bitmap,x,y,m_vh_state.active_foreground_colour, m_vh_state.active_background_colour, pixel_data, BIT(c, 7));
240            }
241            else
242            {
243               UINT8 char_index, char_data, ch_line;
244
245               char_index = (c & 0x07f);
246
247               ch_line = y & 7;
248
249               /* is double height set? */
250               if (BIT(m_vh_state.text_attributes, 1))
251               {
252               /* if char line is even, top half of character is displayed else bottom half */
253                  UINT8 double_height_flag = BIT(y, 3);
254
255                  /* calculate line to fetch */
256                  ch_line = (ch_line>>1) + (double_height_flag<<2);
257               }
258
259               /* fetch pixel data for this char line */
260               char_data = m_vh_state.char_data[(char_index<<3) | ch_line] & 0x03f;
261
262               /* draw! */
263               oric_vh_render_6pixels(bitmap,x,y,
264                  m_vh_state.active_foreground_colour,
265                  m_vh_state.active_background_colour, char_data, BIT(c, 7));
266            }
267
268         }
269
270         x+=6;
271      }
272
273      /* after 200 lines have been drawn, force a change of the read address */
274      /* there are 200 lines of hires/text mode, then 24 lines of text mode */
275      /* the mode can't be changed in the last 24 lines. */
276      if (y==199)
277      {
278         /* mode */
279         read_addr_base = (offs_t)0x0bf68;
280         hires_active = 0;
281      }
282   }
283   return 0;
284}
285
286
287void oric_state::video_start()
288{
289   // initialise variables
290   m_vh_state.active_foreground_colour = 0;
291   m_vh_state.active_background_colour = 0;
292   m_vh_state.foreground_colour = 0;
293   m_vh_state.background_colour = 0;
294   m_vh_state.mode = 0;
295   m_vh_state.text_attributes = 0;
296   m_vh_state.read_addr = 0;
297   m_vh_state.char_data = 0;
298   m_vh_state.char_base = 0;
299   /* initialise flash timer */
300   m_vh_state.flash_count = 0;
301   machine().scheduler().timer_pulse(attotime::from_hz(50), timer_expired_delegate(FUNC(oric_state::oric_vh_timer_callback),this));
302   /* mode */
303   oric_vh_update_attribute((1<<3)|(1<<4));
304}

Previous 199869 Revisions Next


© 1997-2024 The MAME Team