Previous 199869 Revisions Next

r33412 Sunday 16th November, 2014 at 21:38:33 UTC by R. Belmont
[MESS] apple2: rewrote all 8-bit Apple II drivers with an aim towards modernity and improved runtime performance, improved correctness, and missing features.  Fixes MT #5157, 5158, 5747, and 5748. [R. Belmont]
[src/emu/bus]bus.mak
[src/emu/bus/a2bus]a2bus.c a2bus.h a2eauxslot.h a2eext80col.c a2eext80col.h a2eramworks3.c a2eramworks3.h a2estd80col.c a2estd80col.h a2softcard.c a2swyft.c a2swyft.h ramcard128k.c* ramcard128k.h* ramcard16k.c* ramcard16k.h*
[src/emu/machine]kb3600.c
[src/mess]mess.mak
[src/mess/drivers]apple2.c apple2e.c* apple2gs.c tk2000.c*
[src/mess/machine]apple2.c
[src/mess/video]apple2.c apple2.h*

trunk/src/emu/bus/a2bus/a2bus.c
r241923r241924
241241   }
242242}
243243
244void a2bus_device::set_inh_slotnum(int slot)
244void a2bus_device::set_maincpu_halt(int state)
245245{
246   m_out_inh_cb(slot);
246   m_maincpu->set_input_line(INPUT_LINE_HALT, state);
247247}
248248
249void a2bus_device::recalc_inh(int slot)
250{
251   m_out_inh_cb(ASSERT_LINE);
252   m_out_inh_cb(CLEAR_LINE);
253}
254
249255// interrupt request from a2bus card
250256WRITE_LINE_MEMBER( a2bus_device::irq_w ) { m_out_irq_cb(state); }
251257WRITE_LINE_MEMBER( a2bus_device::nmi_w ) { m_out_nmi_cb(state); }
trunk/src/emu/bus/a2bus/a2bus.h
r241923r241924
1515
1616#include "emu.h"
1717
18#define INH_SLOT_INVALID    (255)
18// /INH special addresses
19#define INH_START_INVALID   0xffff;
20#define INH_END_INVALID      0x0000;
1921
22// /INH types                       
23#define INH_NONE         0x00
24#define   INH_READ         0x01
25#define INH_WRITE         0x02
26
2027//**************************************************************************
2128//  INTERFACE CONFIGURATION MACROS
2229//**************************************************************************
r241923r241924
97104
98105   void set_irq_line(int state, int slot);
99106   void set_nmi_line(int state, int slot);
100   void set_inh_slotnum(int slot);
107   void set_maincpu_halt(int state);
108   void recalc_inh(int slot);
101109
102110   DECLARE_WRITE_LINE_MEMBER( irq_w );
103111   DECLARE_WRITE_LINE_MEMBER( nmi_w );
r241923r241924
112120
113121   devcb_write_line    m_out_irq_cb;
114122   devcb_write_line    m_out_nmi_cb;
115   devcb_write_line    m_out_inh_cb;
123   devcb_write8      m_out_inh_cb;
116124
117125   device_a2bus_card_interface *m_device_list[8];
118126   const char *m_cputag;
r241923r241924
145153   virtual bool take_c800() { return true; }   // override and return false if your card doesn't take over the c800 space
146154   virtual UINT8 read_inh_rom(address_space &space, UINT16 offset) { return 0; }
147155   virtual void write_inh_rom(address_space &space, UINT16 offset, UINT8 data) { }
156   virtual UINT16 inh_start() { return INH_START_INVALID; }
157   virtual UINT16 inh_end() { return INH_END_INVALID; }
158   virtual int inh_type() { return INH_NONE; }
148159
149160   device_a2bus_card_interface *next() const { return m_next; }
150161
r241923r241924
157168   void lower_slot_irq() { m_a2bus->set_irq_line(CLEAR_LINE, m_slot); }
158169   void raise_slot_nmi() { m_a2bus->set_nmi_line(ASSERT_LINE, m_slot); }
159170   void lower_slot_nmi() { m_a2bus->set_nmi_line(CLEAR_LINE, m_slot); }
160   void raise_slot_inh() { m_a2bus->set_inh_slotnum(m_slot); }
161   void lower_slot_inh() { m_a2bus->set_inh_slotnum(INH_SLOT_INVALID); }
171   void recalc_slot_inh() { m_a2bus->recalc_inh(m_slot); }
172   void set_maincpu_halt(int state) { m_a2bus->set_maincpu_halt(state); }
162173
163174   // inline configuration
164175   static void static_set_a2bus_tag(device_t &device, const char *tag, const char *slottag);
trunk/src/emu/bus/a2bus/a2eauxslot.h
r241923r241924
120120   virtual void write_auxram(UINT16 offset, UINT8 data) { printf("a2eauxslot: unhandled auxram write %02x @ %04x\n", data, offset); }
121121   virtual void write_c07x(address_space &space, UINT8 offset, UINT8 data) {}
122122   virtual UINT8 *get_vram_ptr() = 0;
123   virtual UINT8 *get_auxbank_ptr() = 0;
123124   virtual bool allow_dhr() { return true; }
124125
125126   device_a2eauxslot_card_interface *next() const { return m_next; }
trunk/src/emu/bus/a2bus/a2eext80col.c
r241923r241924
6666{
6767   return &m_ram[0];
6868}
69
70UINT8 *a2eaux_ext80col_device::get_auxbank_ptr()
71{
72   return &m_ram[0];
73}
74
trunk/src/emu/bus/a2bus/a2eext80col.h
r241923r241924
3232   virtual UINT8 read_auxram(UINT16 offset);
3333   virtual void write_auxram(UINT16 offset, UINT8 data);
3434   virtual UINT8 *get_vram_ptr();
35   virtual UINT8 *get_auxbank_ptr();
3536   virtual bool allow_dhr() { return true; }
3637
3738private:
trunk/src/emu/bus/a2bus/a2eramworks3.c
r241923r241924
6969   return &m_ram[0];
7070}
7171
72UINT8 *a2eaux_ramworks3_device::get_auxbank_ptr()
73{
74   return &m_ram[m_bank];
75}
76
7277/*
7378    These cards are split into 64k logical banks.
7479
trunk/src/emu/bus/a2bus/a2eramworks3.h
r241923r241924
3232   virtual UINT8 read_auxram(UINT16 offset);
3333   virtual void write_auxram(UINT16 offset, UINT8 data);
3434   virtual UINT8 *get_vram_ptr();
35   virtual UINT8 *get_auxbank_ptr();
3536   virtual bool allow_dhr() { return true; }
3637   virtual void write_c07x(address_space &space, UINT8 offset, UINT8 data);
3738
trunk/src/emu/bus/a2bus/a2estd80col.c
r241923r241924
7373{
7474   return &m_ram[0];
7575}
76
77UINT8 *a2eaux_std80col_device::get_auxbank_ptr()
78{
79   return &m_ram[0];
80}
81
trunk/src/emu/bus/a2bus/a2estd80col.h
r241923r241924
3232   virtual UINT8 read_auxram(UINT16 offset);
3333   virtual void write_auxram(UINT16 offset, UINT8 data);
3434   virtual UINT8 *get_vram_ptr();
35   virtual UINT8 *get_auxbank_ptr();
3536   virtual bool allow_dhr() { return false; }  // we don't allow DHR
3637
3738private:
trunk/src/emu/bus/a2bus/a2softcard.c
r241923r241924
8181void a2bus_softcard_device::device_reset()
8282{
8383   m_bEnabled = false;
84
8485   m_6502space = NULL;
8586   m_FirstZ80Boot = true;
8687   m_z80->set_input_line(INPUT_LINE_HALT, ASSERT_LINE);
r241923r241924
8889
8990void a2bus_softcard_device::write_cnxx(address_space &space, UINT8 offset, UINT8 data)
9091{
91   apple2_state *state = machine().driver_data<apple2_state>();
92
9392   if (!m_bEnabled)
9493   {
9594      // steal the 6502's address space
9695      m_6502space = &space;
9796
9897      m_z80->set_input_line(INPUT_LINE_HALT, CLEAR_LINE);
99      state->m_maincpu->set_input_line(INPUT_LINE_HALT, ASSERT_LINE);
98      set_maincpu_halt(ASSERT_LINE);
10099
101100      if (m_FirstZ80Boot)
102101      {
r241923r241924
109108   else
110109   {
111110      m_z80->set_input_line(INPUT_LINE_HALT, ASSERT_LINE);
112      state->m_maincpu->set_input_line(INPUT_LINE_HALT, CLEAR_LINE);
111      set_maincpu_halt(CLEAR_LINE);
113112      m_bEnabled = false;
114113   }
115114}
trunk/src/emu/bus/a2bus/a2swyft.c
r241923r241924
7474{
7575   m_rombank = 0;
7676
77   // take over the machine
78   apple2_state *state = machine().driver_data<apple2_state>();
79   raise_slot_inh();
80   state->m_maincpu->reset();
77   m_inh_state = INH_READ;   // read-enable the ROM
78   recalc_slot_inh();
8179}
8280
8381UINT8 a2bus_swyft_device::read_c0nx(address_space &space, UINT8 offset)
r241923r241924
8684   {
8785      case 0:
8886         m_rombank = 0;
89         raise_slot_inh();
87         m_inh_state = INH_READ;
88         recalc_slot_inh();
9089         break;
9190
9291      case 1:
9392         m_rombank = 0;
94         lower_slot_inh();
93         m_inh_state = INH_NONE;
94         recalc_slot_inh();
9595         break;
9696
9797      case 2:
9898         m_rombank = 0x1000;
99         raise_slot_inh();
99         m_inh_state = INH_READ;
100         recalc_slot_inh();
100101         break;
101102   }
102103
r241923r241924
109110   {
110111      case 0:
111112         m_rombank = 0;
112         raise_slot_inh();
113         m_inh_state = INH_READ;
114         recalc_slot_inh();
113115         break;
114116
115117      case 1:
116118         m_rombank = 0;
117         lower_slot_inh();
119         m_inh_state = INH_NONE;
120         recalc_slot_inh();
118121         break;
119122
120123      case 2:
121124         m_rombank = 0x1000;
122         raise_slot_inh();
125         m_inh_state = INH_READ;
126         recalc_slot_inh();
123127         break;
124128   }
125129}
126130
127131UINT8 a2bus_swyft_device::read_inh_rom(address_space &space, UINT16 offset)
128132{
133   offset -= 0xd000;
134
129135   if (offset < 0x1000)    // banked area d000-dfff
130136   {
131137      return m_rom[offset + m_rombank];
r241923r241924
135141      return m_rom[offset - 0x1000 + 0x2000];
136142   }
137143}
144
145int a2bus_swyft_device::inh_type()
146{
147   return m_inh_state;
148}
149
trunk/src/emu/bus/a2bus/a2swyft.h
r241923r241924
3434   virtual UINT8 read_c0nx(address_space &space, UINT8 offset);
3535   virtual void write_c0nx(address_space &space, UINT8 offset, UINT8 data);
3636   virtual UINT8 read_inh_rom(address_space &space, UINT16 offset);
37   virtual UINT16 inh_start() { return 0xd000; }
38   virtual UINT16 inh_end() { return 0xffff; }
39   virtual int inh_type();
3740
3841private:
3942   UINT8 *m_rom;
4043   int m_rombank;
44   int m_inh_state;
4145};
4246
4347// device type definition
trunk/src/emu/bus/a2bus/ramcard128k.c
r0r241924
1// license:BSD-3-Clause
2// copyright-holders:R. Belmont
3/*********************************************************************
4
5    ramcard128k.c
6
7    Implemention of the Saturn Systems 128K extended language card
8
9*********************************************************************/
10
11#include "ramcard128k.h"
12
13/***************************************************************************
14    PARAMETERS
15***************************************************************************/
16
17//**************************************************************************
18//  GLOBAL VARIABLES
19//**************************************************************************
20
21const device_type A2BUS_RAMCARD128K = &device_creator<a2bus_ssramcard_device>;
22
23/***************************************************************************
24    FUNCTION PROTOTYPES
25***************************************************************************/
26
27//**************************************************************************
28//  LIVE DEVICE
29//**************************************************************************
30
31a2bus_ssramcard_device::a2bus_ssramcard_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) :
32   device_t(mconfig, type, name, tag, owner, clock, shortname, source),
33   device_a2bus_card_interface(mconfig, *this)
34{
35}
36
37a2bus_ssramcard_device::a2bus_ssramcard_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) :
38   device_t(mconfig, A2BUS_RAMCARD128K, "Saturn Systems 128K Extended Language Card", tag, owner, clock, "ssram128", __FILE__),
39   device_a2bus_card_interface(mconfig, *this)
40{
41}
42
43//-------------------------------------------------
44//  device_start - device-specific startup
45//-------------------------------------------------
46
47void a2bus_ssramcard_device::device_start()
48{
49   // set_a2bus_device makes m_slot valid
50   set_a2bus_device();
51
52   memset(m_ram, 0, 128*1024);
53
54   save_item(NAME(m_inh_state));
55   save_item(NAME(m_ram));
56   save_item(NAME(m_dxxx_bank));
57   save_item(NAME(m_main_bank));
58   save_item(NAME(m_last_offset));
59}
60
61void a2bus_ssramcard_device::device_reset()
62{
63   m_inh_state = INH_NONE;
64   m_dxxx_bank = 0;
65   m_main_bank = 0;
66   m_last_offset = -1;
67}
68
69void a2bus_ssramcard_device::do_io(int offset)
70{
71   int old_inh_state = m_inh_state;
72
73   switch (offset)
74   {
75      case 0x1: case 0x3: case 0x9: case 0xb:
76         if (offset != m_last_offset)
77         {
78            m_last_offset = offset;
79            return;
80         }
81         break;
82   }
83   m_last_offset = offset;
84
85   if (offset & 4)
86   {
87      switch (offset)
88      {
89         case 0x4: m_main_bank = 0x00000; break;
90         case 0x5: m_main_bank = 0x04000; break;
91         case 0x6: m_main_bank = 0x08000; break;
92         case 0x7: m_main_bank = 0x0c000; break;
93         case 0xc: m_main_bank = 0x10000; break;
94         case 0xd: m_main_bank = 0x14000; break;
95         case 0xe: m_main_bank = 0x18000; break;
96         case 0xf: m_main_bank = 0x1c000; break;
97      }
98   }
99   else
100   {
101      m_inh_state = INH_NONE;
102      m_dxxx_bank = 0;
103
104      if (offset & 0x1)
105      {
106         m_inh_state |= INH_WRITE;
107      }
108
109      switch(offset & 0x03)
110      {
111         case 0x00:
112         case 0x03:
113            m_inh_state |= INH_READ;
114            break;
115      }
116
117      if (!(offset & 8))
118      {
119         m_dxxx_bank = 0x1000;
120      }
121   }
122
123   if (m_inh_state != old_inh_state)
124   {
125      recalc_slot_inh();
126   }
127
128   #if 0
129   printf("LC: (ofs %x) new state %c%c dxxx=%04x main=%05x\n",
130         offset,
131         (m_inh_state & INH_READ) ? 'R' : 'x',
132         (m_inh_state & INH_WRITE) ? 'W' : 'x',
133         m_dxxx_bank, m_main_bank);
134   #endif
135}
136
137
138/*-------------------------------------------------
139    read_c0nx - called for reads from this card's c0nx space
140-------------------------------------------------*/
141
142UINT8 a2bus_ssramcard_device::read_c0nx(address_space &space, UINT8 offset)
143{
144   do_io(offset & 0xf);
145   return 0xff;
146}
147
148
149/*-------------------------------------------------
150    write_c0nx - called for writes to this card's c0nx space
151-------------------------------------------------*/
152
153void a2bus_ssramcard_device::write_c0nx(address_space &space, UINT8 offset, UINT8 data)
154{
155   do_io(offset & 0xf);
156}
157
158UINT8 a2bus_ssramcard_device::read_inh_rom(address_space &space, UINT16 offset)
159{
160   assert(m_inh_state & INH_READ);   // this should never happen
161
162   if (offset < 0xe000)
163   {
164      return m_ram[(offset & 0xfff) + m_dxxx_bank + m_main_bank];
165   }
166
167   return m_ram[(offset & 0x1fff) + 0x2000 + m_main_bank];
168}
169
170void a2bus_ssramcard_device::write_inh_rom(address_space &space, UINT16 offset, UINT8 data)
171{
172   // are writes enabled?
173   if (!(m_inh_state & INH_WRITE))
174   {
175      return;
176   }
177
178   if (offset < 0xe000)
179   {
180      m_ram[(offset & 0xfff) + m_dxxx_bank + m_main_bank] = data;
181      return;
182   }
183
184   m_ram[(offset & 0x1fff) + 0x2000 + m_main_bank] = data;
185}
186
187int a2bus_ssramcard_device::inh_type()
188{
189   return m_inh_state;
190}
191
trunk/src/emu/bus/a2bus/ramcard128k.h
r0r241924
1// license:BSD-3-Clause
2// copyright-holders:R. Belmont
3/*********************************************************************
4
5    ramcard128k.h
6
7    Implemention of the Saturn Systems 128K extended language card
8
9*********************************************************************/
10
11#ifndef __A2BUS_RAMCARD128K__
12#define __A2BUS_RAMCARD128K__
13
14#include "emu.h"
15#include "a2bus.h"
16
17//**************************************************************************
18//  TYPE DEFINITIONS
19//**************************************************************************
20
21class a2bus_ssramcard_device:
22   public device_t,
23   public device_a2bus_card_interface
24{
25public:
26   // construction/destruction
27   a2bus_ssramcard_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);
28   a2bus_ssramcard_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
29
30protected:
31   virtual void device_start();
32   virtual void device_reset();
33
34   // overrides of standard a2bus slot functions
35   virtual UINT8 read_c0nx(address_space &space, UINT8 offset);
36   virtual void write_c0nx(address_space &space, UINT8 offset, UINT8 data);
37   virtual UINT8 read_inh_rom(address_space &space, UINT16 offset);
38   virtual void write_inh_rom(address_space &space, UINT16 offset, UINT8 data);
39   virtual UINT16 inh_start() { return 0xd000; }
40   virtual UINT16 inh_end() { return 0xffff; }
41   virtual int inh_type();
42
43private:
44   void do_io(int offset);
45
46   int m_inh_state;
47   int m_last_offset;
48   int m_dxxx_bank;
49   int m_main_bank;
50   UINT8 m_ram[128*1024];
51};
52
53// device type definition
54extern const device_type A2BUS_RAMCARD128K;
55
56#endif /* __A2BUS_RAMCARD128K__ */
trunk/src/emu/bus/a2bus/ramcard16k.c
r0r241924
1// license:BSD-3-Clause
2// copyright-holders:R. Belmont
3/*********************************************************************
4
5    ramcard16k.c
6
7    Implemention of the Apple II 16K RAM card (aka "language card")
8
9*********************************************************************/
10
11#include "ramcard16k.h"
12
13/***************************************************************************
14    PARAMETERS
15***************************************************************************/
16
17//**************************************************************************
18//  GLOBAL VARIABLES
19//**************************************************************************
20
21const device_type A2BUS_RAMCARD16K = &device_creator<a2bus_ramcard_device>;
22
23/***************************************************************************
24    FUNCTION PROTOTYPES
25***************************************************************************/
26
27//**************************************************************************
28//  LIVE DEVICE
29//**************************************************************************
30
31a2bus_ramcard_device::a2bus_ramcard_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) :
32   device_t(mconfig, type, name, tag, owner, clock, shortname, source),
33   device_a2bus_card_interface(mconfig, *this)
34{
35}
36
37a2bus_ramcard_device::a2bus_ramcard_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) :
38   device_t(mconfig, A2BUS_RAMCARD16K, "Apple II 16K Language Card", tag, owner, clock, "a2ram16k", __FILE__),
39   device_a2bus_card_interface(mconfig, *this)
40{
41}
42
43//-------------------------------------------------
44//  device_start - device-specific startup
45//-------------------------------------------------
46
47void a2bus_ramcard_device::device_start()
48{
49   // set_a2bus_device makes m_slot valid
50   set_a2bus_device();
51
52   memset(m_ram, 0, 16*1024);
53
54   save_item(NAME(m_inh_state));
55   save_item(NAME(m_ram));
56   save_item(NAME(m_dxxx_bank));
57   save_item(NAME(m_last_offset));
58}
59
60void a2bus_ramcard_device::device_reset()
61{
62   m_inh_state = INH_NONE;
63   m_dxxx_bank = 0;
64   m_last_offset = -1;
65}
66
67void a2bus_ramcard_device::do_io(int offset)
68{
69   int old_inh_state = m_inh_state;
70
71   switch (offset)
72   {
73      case 0x1: case 0x3: case 0x9: case 0xb:
74         if (offset != m_last_offset)
75         {
76            m_last_offset = offset;
77            return;
78         }
79         break;
80   }
81   m_last_offset = offset;
82
83   m_inh_state = INH_NONE;
84   m_dxxx_bank = 0;
85
86   if (offset & 0x1)
87   {
88      m_inh_state |= INH_WRITE;
89   }
90
91   switch(offset & 0x03)
92   {
93      case 0x00:
94      case 0x03:
95         m_inh_state |= INH_READ;
96         break;
97   }
98
99   if (!(offset & 8))
100   {
101      m_dxxx_bank = 0x1000;
102   }
103
104   if (m_inh_state != old_inh_state)
105   {
106      recalc_slot_inh();
107   }
108
109   #if 0
110   printf("LC: new state %c%c dxxx=%04x\n",
111         (m_inh_state & INH_READ) ? 'R' : 'x',
112         (m_inh_state & INH_WRITE) ? 'W' : 'x',
113         m_dxxx_bank);
114   #endif
115}
116
117
118/*-------------------------------------------------
119    read_c0nx - called for reads from this card's c0nx space
120-------------------------------------------------*/
121
122UINT8 a2bus_ramcard_device::read_c0nx(address_space &space, UINT8 offset)
123{
124   do_io(offset & 0xf);
125   return 0xff;
126}
127
128
129/*-------------------------------------------------
130    write_c0nx - called for writes to this card's c0nx space
131-------------------------------------------------*/
132
133void a2bus_ramcard_device::write_c0nx(address_space &space, UINT8 offset, UINT8 data)
134{
135   do_io(offset & 0xf);
136}
137
138UINT8 a2bus_ramcard_device::read_inh_rom(address_space &space, UINT16 offset)
139{
140   assert(m_inh_state & INH_READ);   // this should never happen
141
142   if (offset < 0xe000)
143   {
144      return m_ram[(offset & 0xfff) + m_dxxx_bank];
145   }
146
147   return m_ram[(offset & 0x1fff) + 0x2000];
148}
149
150void a2bus_ramcard_device::write_inh_rom(address_space &space, UINT16 offset, UINT8 data)
151{
152   // are writes enabled?
153   if (!(m_inh_state & INH_WRITE))
154   {
155      return;
156   }
157
158   if (offset < 0xe000)
159   {
160      m_ram[(offset & 0xfff) + m_dxxx_bank] = data;
161      return;
162   }
163
164   m_ram[(offset & 0x1fff) + 0x2000] = data;
165}
166
167int a2bus_ramcard_device::inh_type()
168{
169   return m_inh_state;
170}
171
trunk/src/emu/bus/a2bus/ramcard16k.h
r0r241924
1// license:BSD-3-Clause
2// copyright-holders:R. Belmont
3/*********************************************************************
4
5    ramcard16k.h
6
7    Implemention of the Apple II 16K RAM card (aka "language card")
8
9*********************************************************************/
10
11#ifndef __A2BUS_RAMCARD16K__
12#define __A2BUS_RAMCARD16K__
13
14#include "emu.h"
15#include "a2bus.h"
16
17//**************************************************************************
18//  TYPE DEFINITIONS
19//**************************************************************************
20
21class a2bus_ramcard_device:
22   public device_t,
23   public device_a2bus_card_interface
24{
25public:
26   // construction/destruction
27   a2bus_ramcard_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);
28   a2bus_ramcard_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
29
30protected:
31   virtual void device_start();
32   virtual void device_reset();
33
34   // overrides of standard a2bus slot functions
35   virtual UINT8 read_c0nx(address_space &space, UINT8 offset);
36   virtual void write_c0nx(address_space &space, UINT8 offset, UINT8 data);
37   virtual UINT8 read_inh_rom(address_space &space, UINT16 offset);
38   virtual void write_inh_rom(address_space &space, UINT16 offset, UINT8 data);
39   virtual UINT16 inh_start() { return 0xd000; }
40   virtual UINT16 inh_end() { return 0xffff; }
41   virtual int inh_type();
42
43private:
44   void do_io(int offset);
45
46   int m_inh_state;
47   int m_last_offset;
48   int m_dxxx_bank;
49   UINT8 m_ram[16*1024];
50};
51
52// device type definition
53extern const device_type A2BUS_RAMCARD16K;
54
55#endif /* __A2BUS_RAMCARD16K__ */
trunk/src/emu/bus/bus.mak
r241923r241924
913913BUSOBJS += $(BUSOBJ)/a2bus/mouse.o
914914BUSOBJS += $(BUSOBJ)/a2bus/corvfdc01.o
915915BUSOBJS += $(BUSOBJ)/a2bus/corvfdc02.o
916BUSOBJS += $(BUSOBJ)/a2bus/ramcard16k.o
917BUSOBJS += $(BUSOBJ)/a2bus/ramcard128k.o
916918endif
917919
918920#-------------------------------------------------
trunk/src/emu/machine/kb3600.c
r241923r241924
147147
148148         if (BIT(data, y))
149149         {
150            ako = 1;
151
150152            if (!(m_x_mask[x] & (1 << y)))
151153            {
152               ako = 1;
153
154154               m_x_mask[x] |= (1 << y);
155155
156156               if (m_b != b)
r241923r241924
158158                  m_b = b;
159159
160160                  m_write_data_ready(1);
161
162                  if (ako != m_ako)
163                  {
164                     m_write_ako(ako);
165                     m_ako = ako;
166                  }
161167                  return;
162168               }
163169            }
trunk/src/mess/drivers/apple2.c
r241923r241924
1// license:BSD-3-Clause
2// copyright-holders:R. Belmont
13/***************************************************************************
24
3Apple II
5   apple2.c - Apple II/II Plus and clones
46
5This family of computers bank-switches everything up the wazoo.
7    Next generation driver written in September/October 2014 by R. Belmont.
8    Thanks to the original Apple II series driver's authors: Mike Balfour, Nathan Woods, and R. Belmont
9    Special thanks to the Apple II Documentation Project/Antoine Vignau and Peter Ferrie.
10 
11II: original base model.  RAM sizes of 4, 8, 12, 16, 20, 24, 32, 36, and 48 KB possible.
12    8K of ROM at $E000-$FFFF, empty sockets for $D000-$D7FF and $D800-$DFFF.
13    Programmer's Aid #1 was sold by Apple for $D000-$D7FF, some third-party ROMs
14    were also available.
615
7Remarkable features
8-------------------
16    Revision 0 (very rare) had only 4 hi-res colors (blue and orange were missing).
17    Revision 0 boards also did not include a color killer in text mode, making text
18    fringey on color TVs/monitors.
919
10Apple II (original model)
11-------------------------
20    ROM contains original non-autostart Monitor and Integer BASIC; apparently
21    Autostart + Integer is also possible.
22 
23II Plus: RAM options reduced to 16/32/48 KB.
24    ROM expanded to 12KB from $D000-$FFFF containing Applesoft BASIC and
25    the Autostart Monitor.  Applesoft is a licensed version of Microsoft's
26    6502 BASIC as also found in Commodore and many other computers.
27 
28 
29    Users of both models often connected the SHIFT key to the paddle #2 button
30    (mapped to $C063) in order to inform properly written software that characters
31    were to be intended upper/lower case.
32 
33    Both models commonly included a RAM "language card" in slot 0 which added 16K
34    of RAM which could be banked into the $D000-$FFFF space to replace the ROMs.
35    This allowed running Applesoft on a II and Integer BASIC on a II Plus.
36    A II Plus with this card installed is often called a "64K Apple II"; this is
37    the base configuration required to run ProDOS and some larger games.
38 
39************************************************************************/
40 
41#include "emu.h"
42#include "machine/bankdev.h"
43#include "machine/ram.h"
44#include "machine/kb3600.h"
45#include "sound/speaker.h"
46#include "imagedev/flopdrv.h"
47#include "imagedev/cassette.h"
48#include "formats/ap2_dsk.h"
49#include "cpu/m6502/m6502.h"
50#include "video/apple2.h"
1251
13RAM: 4/8/12/16/20/24/32/36/48 KB (according to the manual)
52#include "bus/a2bus/a2bus.h"
53#include "bus/a2bus/a2diskii.h"
54#include "bus/a2bus/a2diskiing.h"
55#include "bus/a2bus/a2mockingboard.h"
56#include "bus/a2bus/a2cffa.h"
57#include "bus/a2bus/a2memexp.h"
58#include "bus/a2bus/a2scsi.h"
59#include "bus/a2bus/a2thunderclock.h"
60#include "bus/a2bus/a2softcard.h"
61#include "bus/a2bus/a2videoterm.h"
62#include "bus/a2bus/a2ssc.h"
63#include "bus/a2bus/a2swyft.h"
64#include "bus/a2bus/a2themill.h"
65#include "bus/a2bus/a2sam.h"
66#include "bus/a2bus/a2alfam2.h"
67#include "bus/a2bus/laser128.h"
68#include "bus/a2bus/a2echoii.h"
69#include "bus/a2bus/a2arcadebd.h"
70#include "bus/a2bus/a2midi.h"
71#include "bus/a2bus/a2zipdrive.h"
72#include "bus/a2bus/a2applicard.h"
73#include "bus/a2bus/a2ultraterm.h"
74#include "bus/a2bus/a2pic.h"
75#include "bus/a2bus/a2corvus.h"
76#include "bus/a2bus/a2mcms.h"
77#include "bus/a2bus/a2dx1.h"
78#include "bus/a2bus/timemasterho.h"
79#include "bus/a2bus/mouse.h"
80#include "bus/a2bus/ramcard16k.h"
81#include "bus/a2bus/ramcard128k.h"
1482
15ROM: 8 KB mapped to $E000-$FFFF
16Empty ROM sockets mapped at $D000-$D7FF (usually occupied by Programmer's
17Aid #1 chip) and $D800-$DFFF (usually empty, but a couple of 3rd party
18chips were produced)
83#define A2_CPU_TAG "maincpu"
84#define A2_KBDC_TAG "ay3600"
85#define A2_BUS_TAG "a2bus"
86#define A2_SPEAKER_TAG "speaker"
87#define A2_CASSETTE_TAG "tape"
88#define A2_UPPERBANK_TAG "inhbank"
89#define A2_VIDEO_TAG "a2video"
1990
20HI-RES Palette has only 4 colors: 0 - black, 1 - green, 2 - purple,
213 - white
91class napple2_state : public driver_device
92{
93public:
94   napple2_state(const machine_config &mconfig, device_type type, const char *tag)
95      : driver_device(mconfig, type, tag),
96      m_maincpu(*this, A2_CPU_TAG),
97      m_ram(*this, RAM_TAG),
98      m_ay3600(*this, A2_KBDC_TAG),
99      m_video(*this, A2_VIDEO_TAG),
100      m_a2bus(*this, A2_BUS_TAG),
101      m_joy1x(*this, "joystick_1_x"),
102      m_joy1y(*this, "joystick_1_y"),
103      m_joy2x(*this, "joystick_2_x"),
104      m_joy2y(*this, "joystick_2_y"),
105      m_joybuttons(*this, "joystick_buttons"),
106      m_kbspecial(*this, "keyb_special"),
107      m_kbrepeat(*this, "keyb_repeat"),
108      m_resetdip(*this, "reset_dip"),
109      m_sysconfig(*this, "a2_config"),
110      m_speaker(*this, A2_SPEAKER_TAG),
111      m_cassette(*this, A2_CASSETTE_TAG),
112      m_upperbank(*this, A2_UPPERBANK_TAG)
113   { }
22114
23Due to an hardware bug, green/purple artifacts are present in text mode
24too!
115   required_device<cpu_device> m_maincpu;
116   required_device<ram_device> m_ram;
117   required_device<ay3600_device> m_ay3600;
118   required_device<a2_video_device> m_video;
119   required_device<a2bus_device> m_a2bus;
120   required_ioport m_joy1x, m_joy1y, m_joy2x, m_joy2y, m_joybuttons;
121   required_ioport m_kbspecial;
122   required_ioport m_kbrepeat;
123   optional_ioport m_resetdip;
124   required_ioport m_sysconfig;
125   required_device<speaker_sound_device> m_speaker;
126   required_device<cassette_image_device> m_cassette;
127   required_device<address_map_bank_device> m_upperbank;
25128
26No 80 columns
27No Open/Solid Apple keys
28No Up/Down arrows key
129   TIMER_DEVICE_CALLBACK_MEMBER(apple2_interrupt);
130   TIMER_DEVICE_CALLBACK_MEMBER(ay3600_repeat);
29131
30Users often connected the SHIFT key to the paddle #2 button (mapped to
31$C063) in order to inform properly written software that characters were
32to be intended upper/lower case
132   virtual void machine_start();
133   virtual void machine_reset();
33134
34*** TODO: Should MESS emulate this via a dipswitch?
135   DECLARE_PALETTE_INIT(apple2);
136   UINT32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
35137
36Integer BASIC in ROM, AppleSoft must be loaded from disk or tape
138   DECLARE_READ8_MEMBER(ram_r);
139   DECLARE_WRITE8_MEMBER(ram_w);
140   DECLARE_READ8_MEMBER(c000_r);
141   DECLARE_WRITE8_MEMBER(c000_w);
142   DECLARE_READ8_MEMBER(c080_r);
143   DECLARE_WRITE8_MEMBER(c080_w);
144   DECLARE_READ8_MEMBER(c100_r);
145   DECLARE_WRITE8_MEMBER(c100_w);
146   DECLARE_READ8_MEMBER(c800_r);
147   DECLARE_WRITE8_MEMBER(c800_w);
148   DECLARE_READ8_MEMBER(inh_r);
149   DECLARE_WRITE8_MEMBER(inh_w);
150   DECLARE_WRITE_LINE_MEMBER(a2bus_irq_w);
151   DECLARE_WRITE_LINE_MEMBER(a2bus_nmi_w);
152   DECLARE_WRITE_LINE_MEMBER(a2bus_inh_w);
153   DECLARE_READ_LINE_MEMBER(ay3600_shift_r);
154   DECLARE_READ_LINE_MEMBER(ay3600_control_r);
155   DECLARE_WRITE_LINE_MEMBER(ay3600_data_ready_w);
156   DECLARE_WRITE_LINE_MEMBER(ay3600_ako_w);
37157
38No AutoStart ROM: once the machine was switched on, the user had to manually
39perform the reset cycle pressing, guess what, RESET ;)
158private:
159   int m_speaker_state;
160   int m_cassette_state;
40161
41Apple II+
42---------
162   double m_joystick_x1_time;
163   double m_joystick_y1_time;
164   double m_joystick_x2_time;
165   double m_joystick_y2_time;
43166
44RAM: 16/32/48 KB + extra 16 KB at $C000 if using Apple Language Card
45ROM: 12 KB mapped to $D000-$DFFF
167   UINT16 m_lastchar, m_strobe;
168   UINT8 m_transchar;
169   bool m_anykeydown;
46170
47HI-RES Palette has four more entries: 4 - black (again), 5 - orange,
486 - blue, 7 - white (again)
171   int m_inh_slot;
172   int m_cnxx_slot;
49173
50No more artifact bug in text mode
174   bool m_page2;
175   bool m_an0, m_an1, m_an2, m_an3;
51176
52No 80 columns
53No Open/Solid Apple keys
54NO Up/Down arrows keys
177   UINT8 *m_ram_ptr;
178   int m_ram_size;
55179
56Users still did the SHIFT key mod
180   int m_inh_bank;
57181
58AppleSoft BASIC in ROM
182   double m_x_calibration, m_y_calibration;
59183
60AutoStart ROM - no more need to press RESET after switching the machine on
184   device_a2bus_card_interface *m_slotdevice[8];
61185
62Apple IIe
63---------
186   void do_io(address_space &space, int offset);
187   UINT8 read_floatingbus();
188};
64189
65RAM: 64 KB + optional bank of 64 KB (see 80 columns card)
66ROM: 16 KB
190/***************************************************************************
191    PARAMETERS
192***************************************************************************/
67193
6880 columns card: this card was available in two versions - one equipped
69with 1 KB of memory to provide the extra RAM for the display, the other
70equipped with full 64 KB of RAM - the 80 columns card is not included
71in the standard configuration and is available as add-on.
194#define JOYSTICK_DELTA          80
195#define JOYSTICK_SENSITIVITY    50
196#define JOYSTICK_AUTOCENTER     80
72197
73Open/Solid Apple keys mapped to buttons 0 and 1 of the paddle #1
74Up/Down arrows keys
75Connector for an optional numeric keypad
198WRITE_LINE_MEMBER(napple2_state::a2bus_irq_w)
199{
200   m_maincpu->set_input_line(M6502_IRQ_LINE, state);
201}
76202
77Apple begins manufacturing its machines with the SHIFT key mod
203WRITE_LINE_MEMBER(napple2_state::a2bus_nmi_w)
204{
205   m_maincpu->set_input_line(INPUT_LINE_NMI, state);
206}
78207
79Revision A motherboards cannot handle double-hires graphics, Revision B can
208// This code makes a ton of assumptions because we can guarantee a pre-IIe machine!
209WRITE_LINE_MEMBER(napple2_state::a2bus_inh_w)
210{
211   if (state == ASSERT_LINE)
212   {
213      // assume no cards are pulling /INH
214      m_inh_slot = -1;
215                           
216      // scan the slots to figure out which card(s) are INHibiting stuff
217      for (int i = 0; i <= 7; i++)
218      {
219         if (m_slotdevice[i])
220         {
221            // this driver only can inhibit from 0xd000-0xffff
222            if ((m_slotdevice[i]->inh_start() == 0xd000) &&
223               (m_slotdevice[i]->inh_end() == 0xffff))
224            {
225               if ((m_slotdevice[i]->inh_type() & INH_READ) == INH_READ)
226               {
227                  if (m_inh_bank != 1)
228                  {
229                     m_upperbank->set_bank(1);
230                     m_inh_bank = 1;
231                  }
232               }
233               else
234               {
235                  if (m_inh_bank != 0)
236                  {
237                     m_upperbank->set_bank(0);
238                     m_inh_bank = 0;
239                  }
240               }
80241
81*** TODO: Should MESS emulate this via a dipswitch?
242               m_inh_slot = i;
243               break;
244            }
245         }
246      }
82247
83Apple IIe (enhanced)
84--------------------
248      // if no slots are inhibiting, make sure ROM is fully switched in
249      if ((m_inh_slot == -1) && (m_inh_bank != 0))
250      {
251         m_upperbank->set_bank(0);
252         m_inh_bank = 0;
253      }
254   }
255}
85256
86The enhancement consists in bugfix of the ROM code, a 65c02 instead of the
876502 and a change in the character generator ROM which now includes the
88so called "MouseText" characters (thus, no flashing characters in 80
89columns mode)
257/***************************************************************************
258    START/RESET
259***************************************************************************/
90260
91Double hi-res mode is supported
261void napple2_state::machine_start()
262{
263   m_ram_ptr = m_ram->pointer();
264   m_ram_size = m_ram->size();
265   m_speaker_state = 0;
266   m_speaker->level_w(m_speaker_state);
267   m_cassette_state = 0;
268   m_cassette->output(-1.0f);
269   m_upperbank->set_bank(0);
270   m_inh_bank = 0;
92271
93Apple IIe (Platinum)
94--------------------
272   // precalculate joystick time constants
273   m_x_calibration = attotime::from_usec(12).as_double();
274   m_y_calibration = attotime::from_usec(13).as_double();
95275
96Identical to IIe enhanced except for:
276   // cache slot devices
277   for (int i = 0; i <= 7; i++)
278   {
279      m_slotdevice[i] = m_a2bus->get_a2bus_card(i);
280   }
97281
98The numerical keypad is integrated into the main keyboard (although the
99internal connector is still present)
282   // setup save states
283   save_item(NAME(m_speaker_state));
284   save_item(NAME(m_cassette_state));
285   save_item(NAME(m_joystick_x1_time));
286   save_item(NAME(m_joystick_y1_time));
287   save_item(NAME(m_joystick_x2_time));
288   save_item(NAME(m_joystick_y2_time));
289   save_item(NAME(m_lastchar));
290   save_item(NAME(m_strobe));
291   save_item(NAME(m_transchar));
292   save_item(NAME(m_inh_slot));
293   save_item(NAME(m_inh_bank));
294   save_item(NAME(m_cnxx_slot));
295   save_item(NAME(m_page2));
296   save_item(NAME(m_an0));
297   save_item(NAME(m_an1));
298   save_item(NAME(m_an2));
299   save_item(NAME(m_an3));
300   save_item(NAME(m_anykeydown));
100301
101The CLEAR key on the keypad generates the same character of the ESC key,
102but some users did an hardware modification so that it generates CTRL-X
302   // setup video pointers
303   m_video->m_ram_ptr = m_ram_ptr;
304   m_video->m_aux_ptr = m_ram_ptr;
305   m_video->m_char_ptr = memregion("gfx1")->base();
306   m_video->m_char_size = memregion("gfx1")->bytes();
307}
103308
104*** TODO: Should MESS emulate this via a dipswitch?
309void napple2_state::machine_reset()
310{
311   m_inh_slot = -1;
312   m_cnxx_slot = -1;
313   m_page2 = false;
314   m_an0 = m_an1 = m_an2 = m_an3 = false;
315   m_anykeydown = false;
316}
105317
106The 64 KB 80 columns card is built in
318/***************************************************************************
319    VIDEO
320***************************************************************************/
107321
108Due to the SHIFT key mod, if the user press both SHIFT and the paddle
109button where the shift key was connected, a short circuit is caused
110and the power supply is shut down!
322TIMER_DEVICE_CALLBACK_MEMBER(napple2_state::apple2_interrupt)
323{
324   int scanline = param;
111325
112Apple IIc
113---------
326   if((scanline % 8) == 0)
327      machine().first_screen()->update_partial(machine().first_screen()->vpos());
114328
115Same as IIe enhanced (Rev B) except for:
329   // update the video system's shadow copy of the system config at the end of the frame
330   if (scanline == 192)
331   {
332      m_video->m_sysconfig = m_sysconfig->read();
116333
117There are no slots in hardware. The machine however sees (for compatibility
118reasons):
334      // check reset
335      if (m_resetdip)   // if reset DIP is present, use it
336      {
337         if (m_resetdip->read() & 1)
338         {      // CTRL-RESET
339            if ((m_kbspecial->read() & 0x88) == 0x88)
340            {
341               m_maincpu->reset();
342            }
343         }
344         else   // plain RESET
345         {
346            if (m_kbspecial->read() & 0x80)
347            {
348               m_maincpu->reset();
349            }
350         }
351      }
352      else   // no DIP, so always plain RESET
353      {
354         if (m_kbspecial->read() & 0x80)
355         {
356            m_maincpu->reset();
357         }
358      }
359   }
360}
119361
120Two Super Serial Cards in slots 1-2
12180 columns card (64 KB version) in slot 3
122Mouse in slot 4
123Easter Egg in slot 5 (!)
124Disk II in slot 6
125External 5.25 drive in slot 7
362PALETTE_INIT_MEMBER(napple2_state, apple2)
363{
364   m_video->palette_init_apple2(palette);
365}
126366
127MouseText characters
367UINT32 napple2_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
368{
369   // always update the flash timer here so it's smooth regardless of mode switches
370   m_video->m_flash = ((machine().time() * 4).seconds & 1) ? true : false;
128371
129No numerical keypad
372   if (m_video->m_graphics)
373   {
374      if (m_video->m_hires)
375      {
376         if (m_video->m_mix)
377         {
378            m_video->hgr_update(screen, bitmap, cliprect, 0, 159);
379            m_video->text_update_orig(screen, bitmap, cliprect, 160, 191);
380         }
381         else
382         {
383            m_video->hgr_update(screen, bitmap, cliprect, 0, 191);
384         }
385      }
386      else   // lo-res
387      {   
388         if (m_video->m_mix)
389         {
390            m_video->lores_update(screen, bitmap, cliprect, 0, 159);
391            m_video->text_update_orig(screen, bitmap, cliprect, 160, 191);
392         }
393         else
394         {
395            m_video->lores_update(screen, bitmap, cliprect, 0, 191);
396         }
397      }
398   }
399   else
400   {
401      m_video->text_update_orig(screen, bitmap, cliprect, 0, 191);
402   }
130403
131Switchables keyboard layouts (the user, via an external switch, can choose
132between two layouts, i.e. US and German, and in the USA QWERTY and Dvorak)
404   return 0;
405}
133406
134*** TODO: Should MESS emulate this?
407/***************************************************************************
408    I/O
409***************************************************************************/
410// most softswitches don't care about read vs write, so handle them here
411void napple2_state::do_io(address_space &space, int offset)
412{
413   if(space.debugger_access())
414   {
415      return;
416   }
135417
136Apple IIc (UniDisk 3.5)
137-----------------------
418   switch (offset)
419   {
420      case 0x20:
421         m_cassette_state ^= 1;
422         m_cassette->output(m_cassette_state ? 1.0f : -1.0f);
423         break;
138424
139Identical to IIc except for:
425      case 0x30:
426         m_speaker_state ^= 1;
427         m_speaker->level_w(m_speaker_state);
428         break;
140429
141ROM: 32 KB
430      case 0x50:  // graphics mode
431         m_video->m_graphics = true; break;
142432
143The disk firmware can handle up to four 3.5 disk drives or three 3.5 drives
144and a 5.25 drive
433      case 0x51:  // text mode
434         m_video->m_graphics = false; break;
145435
146Preliminary support (but not working and never completed) for AppleTalk
147network in slot 7
436      case 0x52:  // no mix
437         m_video->m_mix = false; break;
148438
149Apple IIc (Original Memory Expansion)
150-------------------------------------
439      case 0x53:  // mixed mode
440         m_video->m_mix = true; break;
151441
152Identical to IIc except for:
442      case 0x54:  // set page 1
443         m_page2 = false;
444         m_video->m_page2 = false;
445         break;
153446
154Support for Memory Expansion Board (mapped to slot 4)
155This card can provide up to 1 MB of RAM in increments of 256 KB
156The firmware in ROM sees the extra RAM as a RAMdisk
447      case 0x55:  // set page 2
448         m_page2 = true;
449         m_video->m_page2 = true;
450         break;
157451
158Since the expansion is mapped to slot 4, mouse is now mapped to slot 7
452      case 0x56: // select lo-res
453         m_video->m_hires = false; break;
159454
160Apple IIc (Revised Memory Expansion)
161------------------------------------
455      case 0x57: // select hi-res
456         m_video->m_hires = true; break;
162457
163ROMSET NOT DUMPED
458      case 0x58: // AN0 off
459         m_an0 = false; break;
164460
165Identical to IIc (OME) except for bugfixes
461      case 0x59: // AN0 on
462         m_an0 = true; break;
166463
167Apple IIc Plus
168--------------
464      case 0x5a: // AN1 off
465         m_an1 = false; break;
169466
170Identical to IIc (RME) except for:
467      case 0x5b: // AN1 on
468         m_an1 = true; break;
171469
172The 65c02 works at 4MHz
470      case 0x5c: // AN2 off
471         m_an2 = false; break;
173472
174The machine has an internal "Apple 3.5" drive (which is DIFFERENT from the
175UniDisk 3.5 drive!)
473      case 0x5d: // AN2 on
474         m_an2 = true; break;
176475
177The external drive port supports not only 5.25 drives but also UniDisk and
178Apple 3.5 drives, allowing via daisy-chaining any combination of UniDisk,
179Apple 3.5 and Apple 5.25 drives - up to three devices
476      case 0x5e: // AN3 off
477         m_an3 = false; break;
180478
181----------------------------------
479      case 0x5f: // AN3 on
480         m_an3 = true; break;
182481
183TK3000 keyboard matrix
482      case 0x68:   // IIgs STATE register, which ProDOS touches
483         break;
184484
185Data bus D0-D7 is X0-X7
186Address bus A0-A11 is Y0-Y11
485      case 0x70: case 0x71: case 0x72: case 0x73: case 0x74: case 0x75: case 0x76: case 0x77:
486      case 0x78: case 0x79: case 0x7a: case 0x7b: case 0x7c: case 0x7d: case 0x7e: case 0x7f:
487         m_joystick_x1_time = machine().time().as_double() + m_x_calibration * m_joy1x->read();
488         m_joystick_y1_time = machine().time().as_double() + m_y_calibration * m_joy1y->read();
489         m_joystick_x2_time = machine().time().as_double() + m_x_calibration * m_joy2x->read();
490         m_joystick_y2_time = machine().time().as_double() + m_y_calibration * m_joy2y->read();
491         break;
492   }
493}
187494
188***************************************************************************/
495READ8_MEMBER(napple2_state::c000_r)
496{
497   switch (offset)
498   {
499      case 0x00:  // keyboard latch
500         return m_transchar | m_strobe;
189501
502      case 0x10:  // reads any key down, clears strobe
503         {
504            UINT8 rv = m_transchar | m_anykeydown;
505            m_strobe = 0;
506            return rv;
507         }
190508
191#include "emu.h"
192#include "imagedev/flopdrv.h"
193#include "imagedev/cassette.h"
194#include "formats/ap2_dsk.h"
195#include "formats/ap_dsk35.h"
196#include "includes/apple2.h"
197#include "cpu/z80/z80.h"
198#include "machine/sonydriv.h"
199#include "machine/appldriv.h"
509      case 0x60: // cassette in
510      case 0x68:
511         return m_cassette->input() > 0.0 ? 0x80 : 0;
200512
201#include "bus/a2bus/a2bus.h"
202#include "bus/a2bus/a2lang.h"
203#include "bus/a2bus/a2diskii.h"
204#include "bus/a2bus/a2diskiing.h"
205#include "bus/a2bus/a2mockingboard.h"
206#include "bus/a2bus/a2cffa.h"
207#include "bus/a2bus/a2memexp.h"
208#include "bus/a2bus/a2scsi.h"
209#include "bus/a2bus/a2thunderclock.h"
210#include "bus/a2bus/a2softcard.h"
211#include "bus/a2bus/a2videoterm.h"
212#include "bus/a2bus/a2ssc.h"
213#include "bus/a2bus/a2swyft.h"
214#include "bus/a2bus/a2themill.h"
215#include "bus/a2bus/a2sam.h"
216#include "bus/a2bus/a2alfam2.h"
217#include "bus/a2bus/laser128.h"
218#include "bus/a2bus/a2echoii.h"
219#include "bus/a2bus/a2arcadebd.h"
220#include "bus/a2bus/a2midi.h"
221#include "bus/a2bus/a2zipdrive.h"
222#include "bus/a2bus/a2applicard.h"
223#include "bus/a2bus/a2ultraterm.h"
224#include "bus/a2bus/a2pic.h"
225#include "bus/a2bus/a2corvus.h"
226#include "bus/a2bus/a2mcms.h"
227#include "bus/a2bus/a2dx1.h"
228#include "bus/a2bus/timemasterho.h"
229#include "bus/a2bus/mouse.h"
230#include "bus/a2bus/a2estd80col.h"
231#include "bus/a2bus/a2eext80col.h"
232#include "bus/a2bus/a2eramworks3.h"
513      case 0x61:   // button 0
514      case 0x69:
515         return (m_joybuttons->read() & 0x10) ? 0x80 : 0;
233516
234/***************************************************************************
235    PARAMETERS
236***************************************************************************/
517      case 0x62:   // button 1
518      case 0x6a:
519         return (m_joybuttons->read() & 0x20) ? 0x80 : 0;
237520
238#define JOYSTICK_DELTA          80
239#define JOYSTICK_SENSITIVITY    50
240#define JOYSTICK_AUTOCENTER     80
241#define PADDLE_DELTA            10
242#define PADDLE_SENSITIVITY      10
243#define PADDLE_AUTOCENTER       0
521      case 0x63:   // button 2
522      case 0x6b:
523         // check if SHIFT key mod configured
524         if (m_sysconfig->read() & 0x04)
525         {
526            return ((m_joybuttons->read() & 0x40) || (m_kbspecial->read() & 0x06)) ? 0x80 : 0;
527         }
528         return (m_joybuttons->read() & 0x40) ? 0x80 : 0;
244529
245WRITE_LINE_MEMBER(apple2_state::a2bus_irq_w)
530      case 0x64:   // joy 1 X axis
531      case 0x6c:
532         return (space.machine().time().as_double() < m_joystick_x1_time) ? 0x80 : 0;
533
534      case 0x65:   // joy 1 Y axis
535      case 0x6d:
536         return (space.machine().time().as_double() < m_joystick_y1_time) ? 0x80 : 0;
537
538      case 0x66: // joy 2 X axis
539      case 0x6e:
540         return (space.machine().time().as_double() < m_joystick_x2_time) ? 0x80 : 0;
541
542      case 0x67: // joy 2 Y axis
543      case 0x6f:
544         return (space.machine().time().as_double() < m_joystick_y2_time) ? 0x80 : 0;
545
546      default:
547         do_io(space, offset);
548         break;
549   }
550
551   return read_floatingbus();
552}
553
554WRITE8_MEMBER(napple2_state::c000_w)
246555{
247   m_maincpu->set_input_line(M6502_IRQ_LINE, state);
556   switch (offset)
557   {
558      case 0x10:  // clear keyboard latch
559         m_strobe = 0;
560         break;
561
562      default:
563         do_io(space, offset);
564         break;
565   }
248566}
249567
250WRITE_LINE_MEMBER(apple2_state::a2bus_nmi_w)
568READ8_MEMBER(napple2_state::c080_r)
251569{
252   m_maincpu->set_input_line(INPUT_LINE_NMI, state);
570   if(!space.debugger_access())
571   {
572      int slot;
573
574      offset &= 0x7F;
575      slot = offset / 0x10;
576
577      if (m_slotdevice[slot] != NULL)
578      {
579         return m_slotdevice[slot]->read_c0nx(space, offset % 0x10);
580      }
581   }
582
583   return read_floatingbus();
253584}
254585
255WRITE_LINE_MEMBER(apple2_state::a2bus_inh_w)
586WRITE8_MEMBER(napple2_state::c080_w)
256587{
257   m_inh_slot = state;
258   apple2_update_memory();
588   int slot;
589
590   offset &= 0x7F;
591   slot = offset / 0x10;
592
593   if (m_slotdevice[slot] != NULL)
594   {
595      m_slotdevice[slot]->write_c0nx(space, offset % 0x10, data);
596   }
259597}
260598
599READ8_MEMBER(napple2_state::c100_r)
600{
601   int slotnum;
602
603   slotnum = ((offset>>8) & 0xf) + 1;
604
605   if (m_slotdevice[slotnum] != NULL)
606   {
607      if ((m_slotdevice[slotnum]->take_c800()) && (!space.debugger_access()))
608      {
609         m_cnxx_slot = slotnum;
610      }
611
612      return m_slotdevice[slotnum]->read_cnxx(space, offset&0xff);
613   }
614
615   return read_floatingbus();
616}
617
618WRITE8_MEMBER(napple2_state::c100_w)
619{
620   int slotnum;
621
622   slotnum = ((offset>>8) & 0xf) + 1;
623
624   if (m_slotdevice[slotnum] != NULL)
625   {
626      if ((m_slotdevice[slotnum]->take_c800()) && (!space.debugger_access()))
627      {
628         m_cnxx_slot = slotnum;
629      }
630
631      m_slotdevice[slotnum]->write_cnxx(space, offset&0xff, data);
632   }
633}
634
635READ8_MEMBER(napple2_state::c800_r)
636{
637   if (offset == 0x7ff)
638   {
639      m_cnxx_slot = -1;
640      return 0xff;
641   }
642
643   if ((m_cnxx_slot != -1) && (m_slotdevice[m_cnxx_slot] != NULL))
644   {
645      return m_slotdevice[m_cnxx_slot]->read_c800(space, offset&0xfff);
646   }
647
648   return read_floatingbus();
649}
650
651WRITE8_MEMBER(napple2_state::c800_w)
652{
653   if (offset == 0x7ff)
654   {
655      m_cnxx_slot = -1;
656      return;
657   }
658
659   if ((m_cnxx_slot != -1) && (m_slotdevice[m_cnxx_slot] != NULL))
660   {
661      m_slotdevice[m_cnxx_slot]->write_c800(space, offset&0xfff, data);
662   }
663}
664
665READ8_MEMBER(napple2_state::inh_r)
666{
667   if (m_inh_slot != -1)
668   {
669      return m_slotdevice[m_inh_slot]->read_inh_rom(space, offset + 0xd000);
670   }
671
672   assert(0);   // hitting inh_r with invalid m_inh_slot should not be possible
673   return read_floatingbus();
674}
675
676WRITE8_MEMBER(napple2_state::inh_w)
677{
678   if (m_inh_slot != -1)
679   {
680      m_slotdevice[m_inh_slot]->write_inh_rom(space, offset + 0xd000, data);
681   }
682}
683
684// floating bus code from old machine/apple2: needs to be reworked based on real beam position to enable e.g. Bob Bishop's screen splitter
685UINT8 napple2_state::read_floatingbus()
686{
687   enum
688   {
689      // scanner types
690      kScannerNone = 0, kScannerApple2, kScannerApple2e,
691
692      // scanner constants
693      kHBurstClock      =    53, // clock when Color Burst starts
694      kHBurstClocks     =     4, // clocks per Color Burst duration
695      kHClock0State     =  0x18, // H[543210] = 011000
696      kHClocks          =    65, // clocks per horizontal scan (including HBL)
697      kHPEClock         =    40, // clock when HPE (horizontal preset enable) goes low
698      kHPresetClock     =    41, // clock when H state presets
699      kHSyncClock       =    49, // clock when HSync starts
700      kHSyncClocks      =     4, // clocks per HSync duration
701      kNTSCScanLines    =   262, // total scan lines including VBL (NTSC)
702      kNTSCVSyncLine    =   224, // line when VSync starts (NTSC)
703      kPALScanLines     =   312, // total scan lines including VBL (PAL)
704      kPALVSyncLine     =   264, // line when VSync starts (PAL)
705      kVLine0State      = 0x100, // V[543210CBA] = 100000000
706      kVPresetLine      =   256, // line when V state presets
707      kVSyncLines       =     4, // lines per VSync duration
708      kClocksPerVSync   = kHClocks * kNTSCScanLines // FIX: NTSC only?
709   };
710
711   // vars
712   //
713   int i, Hires, Mixed, Page2, _80Store, ScanLines, /* VSyncLine, ScanCycles,*/
714      h_clock, h_state, h_0, h_1, h_2, h_3, h_4, h_5,
715      v_line, v_state, v_A, v_B, v_C, v_0, v_1, v_2, v_3, v_4, /* v_5, */
716      _hires, addend0, addend1, addend2, sum, address;
717
718   // video scanner data
719   //
720   i = m_maincpu->total_cycles() % kClocksPerVSync; // cycles into this VSync
721
722   // machine state switches
723   //
724   Hires    = m_video->m_hires ? 1 : 0;
725   Mixed    = m_video->m_mix ? 1 : 0;
726   Page2    = m_page2 ? 1 : 0;
727   _80Store = 0;
728
729   // calculate video parameters according to display standard
730   //
731   ScanLines  = 1 ? kNTSCScanLines : kPALScanLines; // FIX: NTSC only?
732   // VSyncLine  = 1 ? kNTSCVSyncLine : kPALVSyncLine; // FIX: NTSC only?
733   // ScanCycles = ScanLines * kHClocks;
734
735   // calculate horizontal scanning state
736   //
737   h_clock = (i + kHPEClock) % kHClocks; // which horizontal scanning clock
738   h_state = kHClock0State + h_clock; // H state bits
739   if (h_clock >= kHPresetClock) // check for horizontal preset
740   {
741      h_state -= 1; // correct for state preset (two 0 states)
742   }
743   h_0 = (h_state >> 0) & 1; // get horizontal state bits
744   h_1 = (h_state >> 1) & 1;
745   h_2 = (h_state >> 2) & 1;
746   h_3 = (h_state >> 3) & 1;
747   h_4 = (h_state >> 4) & 1;
748   h_5 = (h_state >> 5) & 1;
749
750   // calculate vertical scanning state
751   //
752   v_line  = i / kHClocks; // which vertical scanning line
753   v_state = kVLine0State + v_line; // V state bits
754   if ((v_line >= kVPresetLine)) // check for previous vertical state preset
755   {
756      v_state -= ScanLines; // compensate for preset
757   }
758   v_A = (v_state >> 0) & 1; // get vertical state bits
759   v_B = (v_state >> 1) & 1;
760   v_C = (v_state >> 2) & 1;
761   v_0 = (v_state >> 3) & 1;
762   v_1 = (v_state >> 4) & 1;
763   v_2 = (v_state >> 5) & 1;
764   v_3 = (v_state >> 6) & 1;
765   v_4 = (v_state >> 7) & 1;
766   //v_5 = (v_state >> 8) & 1;
767
768   // calculate scanning memory address
769   //
770   _hires = Hires;
771   if (Hires && Mixed && (v_4 & v_2))
772   {
773      _hires = 0; // (address is in text memory)
774   }
775
776   addend0 = 0x68; // 1            1            0            1
777   addend1 =              (h_5 << 5) | (h_4 << 4) | (h_3 << 3);
778   addend2 = (v_4 << 6) | (v_3 << 5) | (v_4 << 4) | (v_3 << 3);
779   sum     = (addend0 + addend1 + addend2) & (0x0F << 3);
780
781   address = 0;
782   address |= h_0 << 0; // a0
783   address |= h_1 << 1; // a1
784   address |= h_2 << 2; // a2
785   address |= sum;      // a3 - aa6
786   address |= v_0 << 7; // a7
787   address |= v_1 << 8; // a8
788   address |= v_2 << 9; // a9
789   address |= ((_hires) ? v_A : (1 ^ (Page2 & (1 ^ _80Store)))) << 10; // a10
790   address |= ((_hires) ? v_B : (Page2 & (1 ^ _80Store))) << 11; // a11
791   if (_hires) // hires?
792   {
793      // Y: insert hires only address bits
794      //
795      address |= v_C << 12; // a12
796      address |= (1 ^ (Page2 & (1 ^ _80Store))) << 13; // a13
797      address |= (Page2 & (1 ^ _80Store)) << 14; // a14
798   }
799   else
800   {
801      // N: text, so no higher address bits unless Apple ][, not Apple //e
802      //
803      if ((1) && // Apple ][? // FIX: check for Apple ][? (FB is most useful in old games)
804         (kHPEClock <= h_clock) && // Y: HBL?
805         (h_clock <= (kHClocks - 1)))
806      {
807         address |= 1 << 12; // Y: a12 (add $1000 to address!)
808      }
809   }
810
811   return m_ram_ptr[address % m_ram_size]; // FIX: this seems to work, but is it right!?
812}
813
261814/***************************************************************************
262815    ADDRESS MAP
263816***************************************************************************/
264817
265static ADDRESS_MAP_START( apple2_map, AS_PROGRAM, 8, apple2_state )
266   /* nothing in the address map - everything is added dynamically */
818READ8_MEMBER(napple2_state::ram_r)
819{
820   if (offset < m_ram_size)
821   {
822      return m_ram_ptr[offset];
823   }
824
825   return 0xff;
826}
827
828WRITE8_MEMBER(napple2_state::ram_w)
829{
830   if (offset < m_ram_size)
831   {
832      m_ram_ptr[offset] = data;
833   }
834}
835
836static ADDRESS_MAP_START( apple2_map, AS_PROGRAM, 8, napple2_state )
837   AM_RANGE(0x0000, 0xbfff) AM_READWRITE(ram_r, ram_w)
838   AM_RANGE(0xc000, 0xc07f) AM_READWRITE(c000_r, c000_w)
839   AM_RANGE(0xc080, 0xc0ff) AM_READWRITE(c080_r, c080_w)
840   AM_RANGE(0xc100, 0xc7ff) AM_READWRITE(c100_r, c100_w)
841   AM_RANGE(0xc800, 0xcfff) AM_READWRITE(c800_r, c800_w)
842   AM_RANGE(0xd000, 0xffff) AM_DEVICE(A2_UPPERBANK_TAG, address_map_bank_device, amap8)
267843ADDRESS_MAP_END
268844
269/*
845static ADDRESS_MAP_START( inhbank_map, AS_PROGRAM, 8, napple2_state )
846   AM_RANGE(0x0000, 0x2fff) AM_ROM AM_REGION("maincpu", 0x1000) AM_WRITE(inh_w)
847   AM_RANGE(0x3000, 0x5fff) AM_READWRITE(inh_r, inh_w)
848ADDRESS_MAP_END
270849
271    LS259 at H12
850/***************************************************************************
851    KEYBOARD
852***************************************************************************/
272853
273    A8  = D
274    A9  = A
275    A10 = B
276    A11 = C
854READ_LINE_MEMBER(napple2_state::ay3600_shift_r)
855{
856   // either shift key
857   if (m_kbspecial->read() & 0x06)
858   {
859      return ASSERT_LINE;
860   }
277861
278    374/259 outputs to 65C02 c000/c010 selected by Z80 WR OR Z80 IORQ? (schematic is not super legible)
862   return CLEAR_LINE;
863}
279864
280*/
865READ_LINE_MEMBER(napple2_state::ay3600_control_r)
866{
867   if (m_kbspecial->read() & 0x08)
868   {
869      return ASSERT_LINE;
870   }
281871
282// RAM and ROM alternate in 8K blocks: ROM at 0/4/8/c, RAM at 2/6/a/e (RAM is only 1k and further mirrors inside those locations)
283static ADDRESS_MAP_START( tk3000_kbd_map, AS_PROGRAM, 8, apple2_state )
284   AM_RANGE(0x0000, 0x1fff) AM_ROM AM_MIRROR(0xc000) AM_REGION("kbdcpu", 0)
285   AM_RANGE(0x2000, 0x3fff) AM_RAM AM_MIRROR(0xcc00) AM_MASK(0x3ff)
286ADDRESS_MAP_END
872   return CLEAR_LINE;
873}
287874
875static const UINT8 a2_key_remap[0x32][4] =
876{
877/*    norm shft ctrl both */
878   { 0x33,0x23,0x33,0x23 },    /* 3 #     00     */
879   { 0x34,0x24,0x34,0x24 },    /* 4 $     01     */
880   { 0x35,0x25,0x35,0x25 },    /* 5 %     02     */
881   { 0x36,'&', 0x35,'&'  },    /* 6 &     03     */
882   { 0x37,0x27,0x37,0x27 },    /* 7 '     04     */
883   { 0x38,0x28,0x38,0x28 },    /* 8 (     05     */
884   { 0x39,0x29,0x39,0x29 },    /* 9 )     06     */
885   { 0x30,0x30,0x30,0x30 },    /* 0       07     */
886   { 0x3a,0x2a,0x3b,0x2a },    /* : *     08     */
887   { 0x2d,0x3d,0x2d,0x3d },    /* - =     09     */
888   { 0x51,0x51,0x11,0x11 },    /* q Q     0a     */
889   { 0x57,0x57,0x17,0x17 },    /* w W     0b     */
890   { 0x45,0x45,0x05,0x05 },    /* e E     0c     */
891   { 0x52,0x52,0x12,0x12 },    /* r R     0d     */
892   { 0x54,0x54,0x14,0x14 },    /* t T     0e     */
893   { 0x59,0x59,0x19,0x19 },    /* y Y     0f     */
894   { 0x55,0x55,0x15,0x15 },    /* u U     10     */
895   { 0x49,0x49,0x09,0x09 },    /* i I     11     */
896   { 0x4f,0x4f,0x0f,0x0f },    /* o O     12     */
897   { 0x50,0x40,0x10,0x40 },    /* p P     13     */
898   { 0x44,0x44,0x04,0x04 },    /* d D     14     */
899   { 0x46,0x46,0x06,0x06 },    /* f F     15     */
900   { 0x47,0x47,0x07,0x07 },    /* g G     16     */
901   { 0x48,0x48,0x08,0x08 },    /* h H     17     */
902   { 0x4a,0x4a,0x0a,0x0a },    /* j J     18     */
903   { 0x4b,0x4b,0x0b,0x0b },    /* k K     19     */
904   { 0x4c,0x4c,0x0c,0x0c },    /* l L     1a     */
905   { ';' ,0x2b,';' ,0x2b },    /* ; +     1b     */
906   { 0x08,0x08,0x08,0x08 },    /* Left    1c     */
907   { 0x15,0x15,0x15,0x15 },    /* Right   1d     */
908   { 0x5a,0x5a,0x1a,0x1a },    /* z Z     1e     */
909   { 0x58,0x58,0x18,0x18 },    /* x X     1f     */
910   { 0x43,0x43,0x03,0x03 },    /* c C     20     */
911   { 0x56,0x56,0x16,0x16 },    /* v V     21     */
912   { 0x42,0x42,0x02,0x02 },    /* b B     22     */
913   { 0x4e,0x5e,0x0e,0x5e },    /* n N     23     */
914   { 0x4d,0x4d,0x0d,0x0d },    /* m M     24     */
915   { 0x2c,0x3c,0x2c,0x3c },    /* , <     25     */
916   { 0x2e,0x3e,0x2e,0x3e },    /* . >     26     */
917   { 0x2f,0x3f,0x2f,0x3f },    /* / ?     27     */
918   { 0x53,0x53,0x13,0x13 },    /* s S     28     */
919   { 0x32,0x22,0x32,0x00 },    /* 2 "     29     */
920   { 0x31,0x21,0x31,0x31 },    /* 1 !     2a     */
921   { 0x1b,0x1b,0x1b,0x1b },    /* Escape  2b     */
922   { 0x41,0x41,0x01,0x01 },    /* a A     2c     */
923   { 0x20,0x20,0x20,0x20 },    /* Space   2d     */
924   { 0x00,0x00,0x00,0x00 },    /* 0x2e unused    */
925   { 0x00,0x00,0x00,0x00 },    /* 0x2f unused    */
926   { 0x00,0x00,0x00,0x00 },    /* 0x30 unused    */
927   { 0x0d,0x0d,0x0d,0x0d },    /* Enter   31     */
928};
288929
930WRITE_LINE_MEMBER(napple2_state::ay3600_data_ready_w)
931{
932   if (state == ASSERT_LINE)
933   {
934      int mod = 0;
935      m_lastchar = m_ay3600->b_r();
936
937      mod = (m_kbspecial->read() & 0x06) ? 0x01 : 0x00;
938      mod |= (m_kbspecial->read() & 0x08) ? 0x02 : 0x00;
939
940      m_transchar = a2_key_remap[m_lastchar&0x3f][mod];
941
942      if (m_transchar != 0)
943      {
944         m_strobe = 0x80;
945//         printf("new char = %04x (%02x)\n", m_lastchar&0x3f, m_transchar);
946      }
947   }
948}
949
950WRITE_LINE_MEMBER(napple2_state::ay3600_ako_w)
951{
952   m_anykeydown = (state == ASSERT_LINE) ? true : false;
953}
954
955TIMER_DEVICE_CALLBACK_MEMBER(napple2_state::ay3600_repeat)
956{
957   // is the key still down?
958   if (m_anykeydown)
959   {
960      if (m_kbrepeat->read() & 1)
961      {
962         m_strobe = 0x80;
963      }
964   }
965}
966
289967/***************************************************************************
290968    INPUT PORTS
291969***************************************************************************/
r241923r241924
3311009   PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_BUTTON1)  PORT_PLAYER(2)            PORT_CODE(JOYCODE_BUTTON1)
3321010INPUT_PORTS_END
3331011
334/*static INPUT_PORTS_START( apple2_paddle )
335    PORT_START("paddle_0")
336    PORT_BIT( 0xff, 0x80, IPT_PADDLE) PORT_NAME("P1 Paddle 0")
337    PORT_SENSITIVITY(PADDLE_SENSITIVITY)
338    PORT_KEYDELTA(PADDLE_DELTA)
339    PORT_CENTERDELTA(PADDLE_AUTOCENTER)
340    PORT_MINMAX(0,0xff) PORT_PLAYER(1)
341    PORT_CODE_DEC(KEYCODE_4_PAD)    PORT_CODE_INC(KEYCODE_6_PAD)
342    PORT_CODE_DEC(JOYCODE_X_LEFT_SWITCH)    PORT_CODE_INC(JOYCODE_X_RIGHT_SWITCH)
343
344    PORT_START("paddle_1")
345    PORT_BIT( 0xff, 0x80, IPT_PADDLE) PORT_NAME("P1 Paddle 1")
346    PORT_SENSITIVITY(PADDLE_SENSITIVITY)
347    PORT_KEYDELTA(PADDLE_DELTA)
348    PORT_CENTERDELTA(PADDLE_AUTOCENTER)
349    PORT_MINMAX(0,0xff) PORT_PLAYER(1)
350    PORT_CODE_DEC(KEYCODE_8_PAD)    PORT_CODE_INC(KEYCODE_2_PAD)
351    PORT_CODE_DEC(JOYCODE_Y_UP_SWITCH)      PORT_CODE_INC(JOYCODE_Y_DOWN_SWITCH)
352
353    PORT_START("paddle_2")
354    PORT_BIT( 0xff, 0x80, IPT_PADDLE) PORT_NAME("P2 Paddle 0")
355    PORT_SENSITIVITY(PADDLE_SENSITIVITY)
356    PORT_KEYDELTA(PADDLE_DELTA)
357    PORT_CENTERDELTA(PADDLE_AUTOCENTER)
358    PORT_MINMAX(0,0xff) PORT_PLAYER(2)
359    PORT_CODE_DEC(JOYCODE_X_LEFT_SWITCH)    PORT_CODE_INC(JOYCODE_X_RIGHT_SWITCH)
360
361    PORT_START("paddle_3")
362    PORT_BIT( 0xff, 0x80, IPT_PADDLE) PORT_NAME("P2 Paddle 1")
363    PORT_SENSITIVITY(PADDLE_SENSITIVITY)
364    PORT_KEYDELTA(PADDLE_DELTA)
365    PORT_CENTERDELTA(PADDLE_AUTOCENTER)
366    PORT_MINMAX(0,0xff) PORT_PLAYER(2)
367    PORT_CODE_DEC(JOYCODE_Y_UP_SWITCH)      PORT_CODE_INC(JOYCODE_Y_DOWN_SWITCH)
368INPUT_PORTS_END
369*/
3701012INPUT_PORTS_START( apple2_gameport )
3711013   PORT_INCLUDE( apple2_joystick )
372   //PORT_INCLUDE( apple2_paddle )
3731014INPUT_PORTS_END
3741015
3751016INPUT_PORTS_START( apple2_sysconfig )
r241923r241924
3791020   PORT_CONFSETTING(0x01, "B&W")
3801021   PORT_CONFSETTING(0x02, "Green")
3811022   PORT_CONFSETTING(0x03, "Amber")
1023
1024   PORT_CONFNAME(0x04, 0x04, "Shift key mod")   // default to installed
1025   PORT_CONFSETTING(0x00, "Not present")
1026   PORT_CONFSETTING(0x04, "Installed")
3821027INPUT_PORTS_END
3831028
3841029   /*
r241923r241924
3991044     ----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----|
4001045   */
4011046
402   /*
403     Apple IIe & IIc key matrix (from "Sams ComputerFacts: Apple IIe" and "Sams ComputerFacts: Apple IIc")
404
405         | Y0  | Y1  | Y2  | Y3  | Y4  | Y5  | Y6  | Y7  | Y8  | Y9  |
406         |     |     |     |     |     |     |     |     |     |     |
407     ----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----|
408     X0  | ESC |  1  |  2  |  3  |  4  |  6  |  5  |  7  |  8  |  9  |
409     ----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----|
410     X1  | TAB |  Q  |  W  |  E  |  R  |  Y  |  T  |  U  |  I  |  O  |
411     ----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----|
412     X2  |  A  |  D  |  S  |  H  |  F  |  G  |  J  |  K  | ;:  |  L  |
413     ----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----|
414     X3  |  Z  |  X  |  C  |  V  |  B  |  M  |  N  | ,<  | .>  |  /? |
415     ----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----|
416     X4  |     |     |     |     |     |     | \|  | +=  |  0  | -_  |
417     ----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----|
418     X5  |     |     |     |     |     |     | `~  |  P  | [{  | ]}  |
419     ----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----|
420     X6  |     |     |     |     |     |     |RETRN| UP  | SPC | '"  |
421     ----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----|
422     X7  |     |     |     |     |     |     | DEL |DOWN |LEFT |RIGHT|
423     ----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----|
424   */
425
426   /*
427     Apple IIe platinum key matrix
428
429         | Y0  | Y1  | Y2  | Y3  | Y4  | Y5  | Y6  | Y7  | Y8  | Y9  |
430         |     |     |     |     |     |     |     |     |     |     |
431     ----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----|
432     X0  | ESC |  1  |  2  |  3  |  4  |  6  |  5  |  7  |  8  |  9  |
433     ----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----|
434     X1  | TAB |  Q  |  W  |  E  |  R  |  Y  |  T  |  U  |  I  |  O  |
435     ----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----|
436     X2  |  A  |  D  |  S  |  H  |  F  |  G  |  J  |  K  | ;:  |  L  |
437     ----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----|
438     X3  |  Z  |  X  |  C  |  V  |  B  |  M  |  N  | ,<  | .>  |  /? |
439     ----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----|
440     X4  | KP/ |     | KP0 | KP1 | KP2 | KP3 | \|  | +=  |  0  | -_  |
441     ----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----|
442     X5  |     |KPEsc| KP4 | KP5 | KP6 | KP7 | `~  |  P  | [{  | ]}  |
443     ----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----|
444     X6  | KP* |     | KP8 | KP9 | KP. | KP+ |RETRN| UP  | SPC | '"  |
445     ----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----|
446     X7  |     |     |     | KP- |KPENT|     | DEL |DOWN |LEFT |RIGHT|
447     ----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----|
448   */
449
4501047static INPUT_PORTS_START( apple2_common )
4511048   PORT_START("X0")
4521049   PORT_BIT(0x001, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_3)  PORT_CHAR('3') PORT_CHAR('#')
r241923r241924
4561053   PORT_BIT(0x010, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_7)  PORT_CHAR('7') PORT_CHAR('\'')
4571054   PORT_BIT(0x020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_8)  PORT_CHAR('8') PORT_CHAR('(')
4581055   PORT_BIT(0x040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_9)  PORT_CHAR('9') PORT_CHAR(')')
459   PORT_BIT(0x080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_0)      PORT_CHAR('0') PORT_CHAR(')')
460   PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_COLON)      PORT_CHAR(';') PORT_CHAR(':')
461   PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_MINUS)  PORT_CHAR('-') PORT_CHAR('_')
1056   PORT_BIT(0x080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_0)  PORT_CHAR('0')
1057   PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_MINUS)  PORT_CHAR(':') PORT_CHAR('*')
1058   PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_EQUALS) PORT_CHAR('-') PORT_CHAR('=')
4621059
4631060   PORT_START("X1")
4641061   PORT_BIT(0x001, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_Q)  PORT_CHAR('Q') PORT_CHAR('q')
r241923r241924
4701067   PORT_BIT(0x040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_U)  PORT_CHAR('U') PORT_CHAR('u')
4711068   PORT_BIT(0x080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_I)  PORT_CHAR('I') PORT_CHAR('i')
4721069   PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_O)  PORT_CHAR('O') PORT_CHAR('o')
473   PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_P)  PORT_CHAR('P') PORT_CHAR('p')
1070   PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_P)  PORT_CHAR('P') PORT_CHAR('@')
4741071
4751072   PORT_START("X2")
4761073   PORT_BIT(0x001, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_D)  PORT_CHAR('D') PORT_CHAR('d')
r241923r241924
4801077   PORT_BIT(0x010, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_J)  PORT_CHAR('J') PORT_CHAR('j')
4811078   PORT_BIT(0x020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_K)  PORT_CHAR('K') PORT_CHAR('k')
4821079   PORT_BIT(0x040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_L)  PORT_CHAR('L') PORT_CHAR('l')
483   PORT_BIT(0x080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_EQUALS)     PORT_CHAR('=') PORT_CHAR('+')
1080   PORT_BIT(0x080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_COLON) PORT_CHAR(';') PORT_CHAR('+')
4841081   PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME(UTF8_LEFT)      PORT_CODE(KEYCODE_LEFT)
4851082   PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME(UTF8_RIGHT)     PORT_CODE(KEYCODE_RIGHT)
4861083
r241923r241924
4891086   PORT_BIT(0x002, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_X)  PORT_CHAR('X') PORT_CHAR('x')
4901087   PORT_BIT(0x004, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_C)  PORT_CHAR('C') PORT_CHAR('c')
4911088   PORT_BIT(0x008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_V)  PORT_CHAR('V') PORT_CHAR('v')
492   PORT_BIT(0x010, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_B)          PORT_CHAR('B') PORT_CHAR('b')
493   PORT_BIT(0x020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_N)  PORT_CHAR('N') PORT_CHAR('n')
1089   PORT_BIT(0x010, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_B)  PORT_CHAR('B') PORT_CHAR('b')
1090   PORT_BIT(0x020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_N)  PORT_CHAR('N') PORT_CHAR('^')
4941091   PORT_BIT(0x040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_M)  PORT_CHAR('M') PORT_CHAR('m')
4951092   PORT_BIT(0x080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_COMMA)  PORT_CHAR(',') PORT_CHAR('<')
4961093   PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_STOP)   PORT_CHAR('.') PORT_CHAR('>')
r241923r241924
4991096   PORT_START("X4")
5001097   PORT_BIT(0x001, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_S)  PORT_CHAR('S') PORT_CHAR('s')
5011098   PORT_BIT(0x002, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_2)  PORT_CHAR('2') PORT_CHAR('\"')
502   PORT_BIT(0x004, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_1)      PORT_CHAR('1') PORT_CHAR('!')
1099   PORT_BIT(0x004, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_1)  PORT_CHAR('1') PORT_CHAR('!')
5031100   PORT_BIT(0x008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Esc")      PORT_CODE(KEYCODE_ESC)      PORT_CHAR(27)
5041101   PORT_BIT(0x010, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_A)          PORT_CHAR('A') PORT_CHAR('a')
5051102   PORT_BIT(0x020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_SPACE)  PORT_CHAR(' ')
r241923r241924
5701167   PORT_INCLUDE(apple2_common)
5711168
5721169   PORT_START("keyb_repeat")
573   PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("REPT")         PORT_CODE(KEYCODE_BACKSLASH)PORT_CHAR('\\')
1170   PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("REPT")         PORT_CODE(KEYCODE_BACKSLASH) PORT_CHAR('\\')
5741171
5751172   /* other devices */
5761173   PORT_INCLUDE( apple2_gameport )
r241923r241924
5871184   PORT_DIPSETTING( 0x00, "RESET" )
5881185INPUT_PORTS_END
5891186
590static INPUT_PORTS_START( apple2e_common )
591   PORT_START("X0")
592   PORT_BIT(0x001, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Esc")      PORT_CODE(KEYCODE_ESC)      PORT_CHAR(27)
593   PORT_BIT(0x002, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_1)      PORT_CHAR('1') PORT_CHAR('!')
594   PORT_BIT(0x004, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_2)  PORT_CHAR('2') PORT_CHAR('\"')
595   PORT_BIT(0x008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_3)  PORT_CHAR('3') PORT_CHAR('#')
596   PORT_BIT(0x010, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_4)  PORT_CHAR('4') PORT_CHAR('$')
597   PORT_BIT(0x020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_6)  PORT_CHAR('6') PORT_CHAR('&')
598   PORT_BIT(0x040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_5)  PORT_CHAR('5') PORT_CHAR('%')
599   PORT_BIT(0x080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_7)  PORT_CHAR('7') PORT_CHAR('\'')
600   PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_8)  PORT_CHAR('8') PORT_CHAR('(')
601   PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_9)  PORT_CHAR('9') PORT_CHAR(')')
602
603   PORT_START("X1")
604   PORT_BIT(0x001, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Tab")      PORT_CODE(KEYCODE_TAB)      PORT_CHAR(9)
605   PORT_BIT(0x002, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_Q)  PORT_CHAR('Q') PORT_CHAR('q')
606   PORT_BIT(0x004, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_W)  PORT_CHAR('W') PORT_CHAR('w')
607   PORT_BIT(0x008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_E)  PORT_CHAR('E') PORT_CHAR('e')
608   PORT_BIT(0x010, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_R)  PORT_CHAR('R') PORT_CHAR('r')
609   PORT_BIT(0x020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_Y)  PORT_CHAR('Y') PORT_CHAR('y')
610   PORT_BIT(0x040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_T)  PORT_CHAR('T') PORT_CHAR('t')
611   PORT_BIT(0x080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_U)  PORT_CHAR('U') PORT_CHAR('u')
612   PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_I)  PORT_CHAR('I') PORT_CHAR('i')
613   PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_O)  PORT_CHAR('O') PORT_CHAR('o')
614
615   PORT_START("X2")
616   PORT_BIT(0x001, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_A)          PORT_CHAR('A') PORT_CHAR('a')
617   PORT_BIT(0x002, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_D)  PORT_CHAR('D') PORT_CHAR('d')
618   PORT_BIT(0x004, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_S)  PORT_CHAR('S') PORT_CHAR('s')
619   PORT_BIT(0x008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_H)  PORT_CHAR('H') PORT_CHAR('h')
620   PORT_BIT(0x010, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_F)  PORT_CHAR('F') PORT_CHAR('f')
621   PORT_BIT(0x020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_G)  PORT_CHAR('G') PORT_CHAR('g')
622   PORT_BIT(0x040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_J)  PORT_CHAR('J') PORT_CHAR('j')
623   PORT_BIT(0x080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_K)  PORT_CHAR('K') PORT_CHAR('k')
624   PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_COLON)      PORT_CHAR(';') PORT_CHAR(':')
625   PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_L)  PORT_CHAR('L') PORT_CHAR('l')
626
627   PORT_START("X3")
628   PORT_BIT(0x001, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_Z)  PORT_CHAR('Z') PORT_CHAR('z')
629   PORT_BIT(0x002, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_X)  PORT_CHAR('X') PORT_CHAR('x')
630   PORT_BIT(0x004, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_C)  PORT_CHAR('C') PORT_CHAR('c')
631   PORT_BIT(0x008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_V)  PORT_CHAR('V') PORT_CHAR('v')
632   PORT_BIT(0x010, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_B)  PORT_CHAR('B') PORT_CHAR('b')
633   PORT_BIT(0x020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_N)  PORT_CHAR('N') PORT_CHAR('n')
634   PORT_BIT(0x040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_M)  PORT_CHAR('M') PORT_CHAR('m')
635   PORT_BIT(0x080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_COMMA)  PORT_CHAR(',') PORT_CHAR('<')
636   PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_STOP)   PORT_CHAR('.') PORT_CHAR('>')
637   PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_SLASH)  PORT_CHAR('/') PORT_CHAR('?')
638
639   PORT_START("X4")
640   PORT_BIT(0x001, IP_ACTIVE_HIGH, IPT_UNUSED)
641   PORT_BIT(0x002, IP_ACTIVE_HIGH, IPT_UNUSED)
642   PORT_BIT(0x004, IP_ACTIVE_HIGH, IPT_UNUSED)
643   PORT_BIT(0x008, IP_ACTIVE_HIGH, IPT_UNUSED)
644   PORT_BIT(0x010, IP_ACTIVE_HIGH, IPT_UNUSED)
645   PORT_BIT(0x020, IP_ACTIVE_HIGH, IPT_UNUSED)
646   PORT_BIT(0x040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_BACKSLASH)  PORT_CHAR('\\') PORT_CHAR('|')
647   PORT_BIT(0x080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_EQUALS)     PORT_CHAR('=') PORT_CHAR('+')
648   PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_0)      PORT_CHAR('0') PORT_CHAR(')')
649   PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_MINUS)  PORT_CHAR('-') PORT_CHAR('_')
650
651   PORT_START("X5")
652   PORT_BIT(0x001, IP_ACTIVE_HIGH, IPT_UNUSED)
653   PORT_BIT(0x002, IP_ACTIVE_HIGH, IPT_UNUSED)
654   PORT_BIT(0x004, IP_ACTIVE_HIGH, IPT_UNUSED)
655   PORT_BIT(0x008, IP_ACTIVE_HIGH, IPT_UNUSED)
656   PORT_BIT(0x010, IP_ACTIVE_HIGH, IPT_UNUSED)
657   PORT_BIT(0x020, IP_ACTIVE_HIGH, IPT_UNUSED)
658   PORT_BIT(0x040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_TILDE)      PORT_CHAR('`') PORT_CHAR('~')
659   PORT_BIT(0x080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_P)  PORT_CHAR('P') PORT_CHAR('p')
660   PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_OPENBRACE)  PORT_CHAR('[') PORT_CHAR('{')
661   PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_CLOSEBRACE) PORT_CHAR(']') PORT_CHAR('}')
662
663   PORT_START("X6")
664   PORT_BIT(0x001, IP_ACTIVE_HIGH, IPT_UNUSED)
665   PORT_BIT(0x002, IP_ACTIVE_HIGH, IPT_UNUSED)
666   PORT_BIT(0x004, IP_ACTIVE_HIGH, IPT_UNUSED)
667   PORT_BIT(0x008, IP_ACTIVE_HIGH, IPT_UNUSED)
668   PORT_BIT(0x010, IP_ACTIVE_HIGH, IPT_UNUSED)
669   PORT_BIT(0x020, IP_ACTIVE_HIGH, IPT_UNUSED)
670   PORT_BIT(0x040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Return")   PORT_CODE(KEYCODE_ENTER)    PORT_CHAR(13)
671   PORT_BIT(0x080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME(UTF8_UP)        PORT_CODE(KEYCODE_UP)
672   PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_SPACE)  PORT_CHAR(' ')
673   PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_QUOTE)  PORT_CHAR('\'') PORT_CHAR('\"')
674
675   PORT_START("X7")
676   PORT_BIT(0x001, IP_ACTIVE_HIGH, IPT_UNUSED)
677   PORT_BIT(0x002, IP_ACTIVE_HIGH, IPT_UNUSED)
678   PORT_BIT(0x004, IP_ACTIVE_HIGH, IPT_UNUSED)
679   PORT_BIT(0x008, IP_ACTIVE_HIGH, IPT_UNUSED)
680   PORT_BIT(0x010, IP_ACTIVE_HIGH, IPT_UNUSED)
681   PORT_BIT(0x020, IP_ACTIVE_HIGH, IPT_UNUSED)
682   PORT_BIT(0x040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Delete")   PORT_CODE(KEYCODE_BACKSPACE)PORT_CHAR(8)
683   PORT_BIT(0x080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME(UTF8_DOWN)      PORT_CODE(KEYCODE_DOWN)     PORT_CHAR(10)
684   PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME(UTF8_LEFT)      PORT_CODE(KEYCODE_LEFT)
685   PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME(UTF8_RIGHT)     PORT_CODE(KEYCODE_RIGHT)
686
687   PORT_START("X8")
688   PORT_BIT(0x001, IP_ACTIVE_HIGH, IPT_UNUSED)
689   PORT_BIT(0x002, IP_ACTIVE_HIGH, IPT_UNUSED)
690   PORT_BIT(0x004, IP_ACTIVE_HIGH, IPT_UNUSED)
691   PORT_BIT(0x008, IP_ACTIVE_HIGH, IPT_UNUSED)
692   PORT_BIT(0x010, IP_ACTIVE_HIGH, IPT_UNUSED)
693   PORT_BIT(0x020, IP_ACTIVE_HIGH, IPT_UNUSED)
694   PORT_BIT(0x040, IP_ACTIVE_HIGH, IPT_UNUSED)
695   PORT_BIT(0x080, IP_ACTIVE_HIGH, IPT_UNUSED)
696   PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_UNUSED)
697   PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_UNUSED)
698
699   PORT_START("keyb_special")
700   PORT_BIT( 0x01, IP_ACTIVE_LOW,  IPT_KEYBOARD) PORT_NAME("Caps Lock")    PORT_CODE(KEYCODE_CAPSLOCK) PORT_TOGGLE
701   PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Left Shift")   PORT_CODE(KEYCODE_LSHIFT)   PORT_CHAR(UCHAR_SHIFT_1)
702   PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Right Shift")  PORT_CODE(KEYCODE_RSHIFT)   PORT_CHAR(UCHAR_SHIFT_1)
703   PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Control")      PORT_CODE(KEYCODE_LCONTROL) PORT_CHAR(UCHAR_SHIFT_2)
704   PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Open Apple")   PORT_CODE(KEYCODE_LALT)
705   PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Solid Apple")  PORT_CODE(KEYCODE_RALT)
706   PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("RESET")        PORT_CODE(KEYCODE_F12)
707
708   PORT_INCLUDE(apple2_sysconfig)
709INPUT_PORTS_END
710
711static INPUT_PORTS_START( apple2e )
712   PORT_INCLUDE( apple2e_common )
713   PORT_INCLUDE( apple2_gameport )
714INPUT_PORTS_END
715
716static INPUT_PORTS_START( apple2euk )
717   PORT_START("X0")
718   PORT_BIT(0x001, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Esc")      PORT_CODE(KEYCODE_ESC)      PORT_CHAR(27)
719   PORT_BIT(0x002, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_1)  PORT_CHAR('1') PORT_CHAR('!')
720   PORT_BIT(0x004, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_2)  PORT_CHAR('2') PORT_CHAR('\"')
721   PORT_BIT(0x008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_3)  PORT_CHAR('3') PORT_CHAR(0xa3)  // a3 is Unicode for the pound sign
722   PORT_BIT(0x010, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_4)  PORT_CHAR('4') PORT_CHAR('$')
723   PORT_BIT(0x020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_6)  PORT_CHAR('6') PORT_CHAR('&')
724   PORT_BIT(0x040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_5)  PORT_CHAR('5') PORT_CHAR('%')
725   PORT_BIT(0x080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_7)  PORT_CHAR('7') PORT_CHAR('\'')
726   PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_8)  PORT_CHAR('8') PORT_CHAR('(')
727   PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_9)  PORT_CHAR('9') PORT_CHAR(')')
728
729   PORT_START("X1")
730   PORT_BIT(0x001, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Tab")      PORT_CODE(KEYCODE_TAB)      PORT_CHAR(9)
731   PORT_BIT(0x002, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_Q)  PORT_CHAR('Q') PORT_CHAR('q')
732   PORT_BIT(0x004, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_W)  PORT_CHAR('W') PORT_CHAR('w')
733   PORT_BIT(0x008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_E)  PORT_CHAR('E') PORT_CHAR('e')
734   PORT_BIT(0x010, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_R)  PORT_CHAR('R') PORT_CHAR('r')
735   PORT_BIT(0x020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_Y)  PORT_CHAR('Y') PORT_CHAR('y')
736   PORT_BIT(0x040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_T)  PORT_CHAR('T') PORT_CHAR('t')
737   PORT_BIT(0x080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_U)  PORT_CHAR('U') PORT_CHAR('u')
738   PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_I)  PORT_CHAR('I') PORT_CHAR('i')
739   PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_O)  PORT_CHAR('O') PORT_CHAR('o')
740
741   PORT_START("X2")
742   PORT_BIT(0x001, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_A)          PORT_CHAR('A') PORT_CHAR('a')
743   PORT_BIT(0x002, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_D)  PORT_CHAR('D') PORT_CHAR('d')
744   PORT_BIT(0x004, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_S)  PORT_CHAR('S') PORT_CHAR('s')
745   PORT_BIT(0x008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_H)  PORT_CHAR('H') PORT_CHAR('h')
746   PORT_BIT(0x010, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_F)  PORT_CHAR('F') PORT_CHAR('f')
747   PORT_BIT(0x020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_G)  PORT_CHAR('G') PORT_CHAR('g')
748   PORT_BIT(0x040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_J)  PORT_CHAR('J') PORT_CHAR('j')
749   PORT_BIT(0x080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_K)  PORT_CHAR('K') PORT_CHAR('k')
750   PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_COLON)      PORT_CHAR(';') PORT_CHAR(':')
751   PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_L)  PORT_CHAR('L') PORT_CHAR('l')
752
753   PORT_START("X3")
754   PORT_BIT(0x001, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_Z)  PORT_CHAR('Z') PORT_CHAR('z')
755   PORT_BIT(0x002, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_X)  PORT_CHAR('X') PORT_CHAR('x')
756   PORT_BIT(0x004, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_C)  PORT_CHAR('C') PORT_CHAR('c')
757   PORT_BIT(0x008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_V)  PORT_CHAR('V') PORT_CHAR('v')
758   PORT_BIT(0x010, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_B)  PORT_CHAR('B') PORT_CHAR('b')
759   PORT_BIT(0x020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_N)  PORT_CHAR('N') PORT_CHAR('n')
760   PORT_BIT(0x040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_M)  PORT_CHAR('M') PORT_CHAR('m')
761   PORT_BIT(0x080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_COMMA)  PORT_CHAR(',') PORT_CHAR('<')
762   PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_STOP)   PORT_CHAR('.') PORT_CHAR('>')
763   PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_SLASH)  PORT_CHAR('/') PORT_CHAR('?')
764
765   PORT_START("X4")
766   PORT_BIT(0x001, IP_ACTIVE_HIGH, IPT_UNUSED)
767   PORT_BIT(0x002, IP_ACTIVE_HIGH, IPT_UNUSED)
768   PORT_BIT(0x004, IP_ACTIVE_HIGH, IPT_UNUSED)
769   PORT_BIT(0x008, IP_ACTIVE_HIGH, IPT_UNUSED)
770   PORT_BIT(0x010, IP_ACTIVE_HIGH, IPT_UNUSED)
771   PORT_BIT(0x020, IP_ACTIVE_HIGH, IPT_UNUSED)
772   PORT_BIT(0x040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_BACKSLASH)  PORT_CHAR('\\') PORT_CHAR('|')
773   PORT_BIT(0x080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_EQUALS)     PORT_CHAR('=') PORT_CHAR('+')
774   PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_0)      PORT_CHAR('0') PORT_CHAR(')')
775   PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_MINUS)  PORT_CHAR('-') PORT_CHAR('_')
776
777   PORT_START("X5")
778   PORT_BIT(0x001, IP_ACTIVE_HIGH, IPT_UNUSED)
779   PORT_BIT(0x002, IP_ACTIVE_HIGH, IPT_UNUSED)
780   PORT_BIT(0x004, IP_ACTIVE_HIGH, IPT_UNUSED)
781   PORT_BIT(0x008, IP_ACTIVE_HIGH, IPT_UNUSED)
782   PORT_BIT(0x010, IP_ACTIVE_HIGH, IPT_UNUSED)
783   PORT_BIT(0x020, IP_ACTIVE_HIGH, IPT_UNUSED)
784   PORT_BIT(0x040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_TILDE)      PORT_CHAR('`') PORT_CHAR('~')
785   PORT_BIT(0x080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_P)  PORT_CHAR('P') PORT_CHAR('p')
786   PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_OPENBRACE)  PORT_CHAR('[') PORT_CHAR('{')
787   PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_CLOSEBRACE) PORT_CHAR(']') PORT_CHAR('}')
788
789   PORT_START("X6")
790   PORT_BIT(0x001, IP_ACTIVE_HIGH, IPT_UNUSED)
791   PORT_BIT(0x002, IP_ACTIVE_HIGH, IPT_UNUSED)
792   PORT_BIT(0x004, IP_ACTIVE_HIGH, IPT_UNUSED)
793   PORT_BIT(0x008, IP_ACTIVE_HIGH, IPT_UNUSED)
794   PORT_BIT(0x010, IP_ACTIVE_HIGH, IPT_UNUSED)
795   PORT_BIT(0x020, IP_ACTIVE_HIGH, IPT_UNUSED)
796   PORT_BIT(0x040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Return")   PORT_CODE(KEYCODE_ENTER)    PORT_CHAR(13)
797   PORT_BIT(0x080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME(UTF8_UP)        PORT_CODE(KEYCODE_UP)
798   PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_SPACE)  PORT_CHAR(' ')
799   PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_QUOTE)  PORT_CHAR('\'') PORT_CHAR('\"')
800
801   PORT_START("X7")
802   PORT_BIT(0x001, IP_ACTIVE_HIGH, IPT_UNUSED)
803   PORT_BIT(0x002, IP_ACTIVE_HIGH, IPT_UNUSED)
804   PORT_BIT(0x004, IP_ACTIVE_HIGH, IPT_UNUSED)
805   PORT_BIT(0x008, IP_ACTIVE_HIGH, IPT_UNUSED)
806   PORT_BIT(0x010, IP_ACTIVE_HIGH, IPT_UNUSED)
807   PORT_BIT(0x020, IP_ACTIVE_HIGH, IPT_UNUSED)
808   PORT_BIT(0x040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Delete")   PORT_CODE(KEYCODE_BACKSPACE)PORT_CHAR(8)
809   PORT_BIT(0x080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME(UTF8_DOWN)      PORT_CODE(KEYCODE_DOWN)     PORT_CHAR(10)
810   PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME(UTF8_LEFT)      PORT_CODE(KEYCODE_LEFT)
811   PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME(UTF8_RIGHT)     PORT_CODE(KEYCODE_RIGHT)
812
813   PORT_START("X8")
814   PORT_BIT(0x001, IP_ACTIVE_HIGH, IPT_UNUSED)
815   PORT_BIT(0x002, IP_ACTIVE_HIGH, IPT_UNUSED)
816   PORT_BIT(0x004, IP_ACTIVE_HIGH, IPT_UNUSED)
817   PORT_BIT(0x008, IP_ACTIVE_HIGH, IPT_UNUSED)
818   PORT_BIT(0x010, IP_ACTIVE_HIGH, IPT_UNUSED)
819   PORT_BIT(0x020, IP_ACTIVE_HIGH, IPT_UNUSED)
820   PORT_BIT(0x040, IP_ACTIVE_HIGH, IPT_UNUSED)
821   PORT_BIT(0x080, IP_ACTIVE_HIGH, IPT_UNUSED)
822   PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_UNUSED)
823   PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_UNUSED)
824
825   PORT_START("keyb_special")
826   PORT_BIT( 0x01, IP_ACTIVE_LOW,  IPT_KEYBOARD) PORT_NAME("Caps Lock")    PORT_CODE(KEYCODE_CAPSLOCK) PORT_TOGGLE
827   PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Left Shift")   PORT_CODE(KEYCODE_LSHIFT)   PORT_CHAR(UCHAR_SHIFT_1)
828   PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Right Shift")  PORT_CODE(KEYCODE_RSHIFT)   PORT_CHAR(UCHAR_SHIFT_1)
829   PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Control")      PORT_CODE(KEYCODE_LCONTROL) PORT_CHAR(UCHAR_SHIFT_2)
830   PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Open Apple")   PORT_CODE(KEYCODE_LALT)
831   PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Solid Apple")  PORT_CODE(KEYCODE_RALT)
832   PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("RESET")        PORT_CODE(KEYCODE_F12)
833
834   PORT_INCLUDE( apple2_gameport )
835   PORT_INCLUDE(apple2_sysconfig)
836INPUT_PORTS_END
837
838INPUT_PORTS_START( apple2ep )
839   PORT_START("X0")
840   PORT_BIT(0x001, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Esc")      PORT_CODE(KEYCODE_ESC)      PORT_CHAR(27)
841   PORT_BIT(0x002, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_1)      PORT_CHAR('1') PORT_CHAR('!')
842   PORT_BIT(0x004, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_2)  PORT_CHAR('2') PORT_CHAR('\"')
843   PORT_BIT(0x008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_3)  PORT_CHAR('3') PORT_CHAR('#')
844   PORT_BIT(0x010, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_4)  PORT_CHAR('4') PORT_CHAR('$')
845   PORT_BIT(0x020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_6)  PORT_CHAR('6') PORT_CHAR('&')
846   PORT_BIT(0x040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_5)  PORT_CHAR('5') PORT_CHAR('%')
847   PORT_BIT(0x080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_7)  PORT_CHAR('7') PORT_CHAR('\'')
848   PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_8)  PORT_CHAR('8') PORT_CHAR('(')
849   PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_9)  PORT_CHAR('9') PORT_CHAR(')')
850
851   PORT_START("X1")
852   PORT_BIT(0x001, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Tab")      PORT_CODE(KEYCODE_TAB)      PORT_CHAR(9)
853   PORT_BIT(0x002, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_Q)  PORT_CHAR('Q') PORT_CHAR('q')
854   PORT_BIT(0x004, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_W)  PORT_CHAR('W') PORT_CHAR('w')
855   PORT_BIT(0x008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_E)  PORT_CHAR('E') PORT_CHAR('e')
856   PORT_BIT(0x010, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_R)  PORT_CHAR('R') PORT_CHAR('r')
857   PORT_BIT(0x020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_Y)  PORT_CHAR('Y') PORT_CHAR('y')
858   PORT_BIT(0x040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_T)  PORT_CHAR('T') PORT_CHAR('t')
859   PORT_BIT(0x080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_U)  PORT_CHAR('U') PORT_CHAR('u')
860   PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_I)  PORT_CHAR('I') PORT_CHAR('i')
861   PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_O)  PORT_CHAR('O') PORT_CHAR('o')
862
863   PORT_START("X2")
864   PORT_BIT(0x001, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_A)          PORT_CHAR('A') PORT_CHAR('a')
865   PORT_BIT(0x002, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_D)  PORT_CHAR('D') PORT_CHAR('d')
866   PORT_BIT(0x004, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_S)  PORT_CHAR('S') PORT_CHAR('s')
867   PORT_BIT(0x008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_H)  PORT_CHAR('H') PORT_CHAR('h')
868   PORT_BIT(0x010, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_F)  PORT_CHAR('F') PORT_CHAR('f')
869   PORT_BIT(0x020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_G)  PORT_CHAR('G') PORT_CHAR('g')
870   PORT_BIT(0x040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_J)  PORT_CHAR('J') PORT_CHAR('j')
871   PORT_BIT(0x080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_K)  PORT_CHAR('K') PORT_CHAR('k')
872   PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_COLON)      PORT_CHAR(';') PORT_CHAR(':')
873   PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_L)  PORT_CHAR('L') PORT_CHAR('l')
874
875   PORT_START("X3")
876   PORT_BIT(0x001, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_Z)  PORT_CHAR('Z') PORT_CHAR('z')
877   PORT_BIT(0x002, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_X)  PORT_CHAR('X') PORT_CHAR('x')
878   PORT_BIT(0x004, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_C)  PORT_CHAR('C') PORT_CHAR('c')
879   PORT_BIT(0x008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_V)  PORT_CHAR('V') PORT_CHAR('v')
880   PORT_BIT(0x010, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_B)  PORT_CHAR('B') PORT_CHAR('b')
881   PORT_BIT(0x020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_N)  PORT_CHAR('N') PORT_CHAR('n')
882   PORT_BIT(0x040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_M)  PORT_CHAR('M') PORT_CHAR('m')
883   PORT_BIT(0x080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_COMMA)  PORT_CHAR(',') PORT_CHAR('<')
884   PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_STOP)   PORT_CHAR('.') PORT_CHAR('>')
885   PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_SLASH)  PORT_CHAR('/') PORT_CHAR('?')
886
887   PORT_START("X4")
888   PORT_BIT(0x001, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_SLASH_PAD)   PORT_CHAR(UCHAR_MAMEKEY(SLASH_PAD))
889   PORT_BIT(0x002, IP_ACTIVE_HIGH, IPT_UNUSED)
890   PORT_BIT(0x004, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_0_PAD)   PORT_CHAR(UCHAR_MAMEKEY(0_PAD))
891   PORT_BIT(0x008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_1_PAD)   PORT_CHAR(UCHAR_MAMEKEY(1_PAD))
892   PORT_BIT(0x010, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_2_PAD)   PORT_CHAR(UCHAR_MAMEKEY(2_PAD))
893   PORT_BIT(0x020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_3_PAD)   PORT_CHAR(UCHAR_MAMEKEY(3_PAD))
894   PORT_BIT(0x040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_BACKSLASH)  PORT_CHAR('\\') PORT_CHAR('|')
895   PORT_BIT(0x080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_EQUALS)     PORT_CHAR('=') PORT_CHAR('+')
896   PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_0)      PORT_CHAR('0') PORT_CHAR(')')
897   PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_MINUS)  PORT_CHAR('-') PORT_CHAR('_')
898
899   PORT_START("X5")
900   PORT_BIT(0x001, IP_ACTIVE_HIGH, IPT_UNUSED)
901   PORT_BIT(0x002, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Keypad Esc") PORT_CODE(KEYCODE_NUMLOCK)
902   PORT_BIT(0x004, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_4_PAD)   PORT_CHAR(UCHAR_MAMEKEY(4_PAD))
903   PORT_BIT(0x008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_5_PAD)   PORT_CHAR(UCHAR_MAMEKEY(5_PAD))
904   PORT_BIT(0x010, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_6_PAD)   PORT_CHAR(UCHAR_MAMEKEY(6_PAD))
905   PORT_BIT(0x020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_7_PAD)   PORT_CHAR(UCHAR_MAMEKEY(7_PAD))
906   PORT_BIT(0x040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_TILDE)      PORT_CHAR('`') PORT_CHAR('~')
907   PORT_BIT(0x080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_P)  PORT_CHAR('P') PORT_CHAR('p')
908   PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_OPENBRACE)  PORT_CHAR('[') PORT_CHAR('{')
909   PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_CLOSEBRACE) PORT_CHAR(']') PORT_CHAR('}')
910
911   PORT_START("X6")
912   PORT_BIT(0x001, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_ASTERISK)    PORT_CHAR(UCHAR_MAMEKEY(ASTERISK))
913   PORT_BIT(0x002, IP_ACTIVE_HIGH, IPT_UNUSED)
914   PORT_BIT(0x004, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_8_PAD)       PORT_CHAR(UCHAR_MAMEKEY(8_PAD))
915   PORT_BIT(0x008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_9_PAD)       PORT_CHAR(UCHAR_MAMEKEY(9_PAD))
916   PORT_BIT(0x010, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_DEL_PAD)     PORT_CHAR(UCHAR_MAMEKEY(DEL_PAD))
917   PORT_BIT(0x020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_PLUS_PAD)    PORT_CHAR(UCHAR_MAMEKEY(PLUS_PAD))
918   PORT_BIT(0x040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Return")   PORT_CODE(KEYCODE_ENTER)    PORT_CHAR(13)
919   PORT_BIT(0x080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME(UTF8_UP)        PORT_CODE(KEYCODE_UP)
920   PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_SPACE)  PORT_CHAR(' ')
921   PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_QUOTE)  PORT_CHAR('\'') PORT_CHAR('\"')
922
923   PORT_START("X7")
924   PORT_BIT(0x001, IP_ACTIVE_HIGH, IPT_UNUSED)
925   PORT_BIT(0x002, IP_ACTIVE_HIGH, IPT_UNUSED)
926   PORT_BIT(0x004, IP_ACTIVE_HIGH, IPT_UNUSED)
927   PORT_BIT(0x008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_MINUS_PAD)   PORT_CHAR(UCHAR_MAMEKEY(MINUS_PAD))
928   PORT_BIT(0x010, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_ENTER_PAD)   PORT_CHAR(UCHAR_MAMEKEY(ENTER_PAD))
929   PORT_BIT(0x020, IP_ACTIVE_HIGH, IPT_UNUSED)
930   PORT_BIT(0x040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Delete")   PORT_CODE(KEYCODE_BACKSPACE)PORT_CHAR(8)
931   PORT_BIT(0x080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME(UTF8_DOWN)      PORT_CODE(KEYCODE_DOWN)     PORT_CHAR(10)
932   PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME(UTF8_LEFT)      PORT_CODE(KEYCODE_LEFT)
933   PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME(UTF8_RIGHT)     PORT_CODE(KEYCODE_RIGHT)
934
935   PORT_START("X8")
936   PORT_BIT(0x001, IP_ACTIVE_HIGH, IPT_UNUSED)
937   PORT_BIT(0x002, IP_ACTIVE_HIGH, IPT_UNUSED)
938   PORT_BIT(0x004, IP_ACTIVE_HIGH, IPT_UNUSED)
939   PORT_BIT(0x008, IP_ACTIVE_HIGH, IPT_UNUSED)
940   PORT_BIT(0x010, IP_ACTIVE_HIGH, IPT_UNUSED)
941   PORT_BIT(0x020, IP_ACTIVE_HIGH, IPT_UNUSED)
942   PORT_BIT(0x040, IP_ACTIVE_HIGH, IPT_UNUSED)
943   PORT_BIT(0x080, IP_ACTIVE_HIGH, IPT_UNUSED)
944   PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_UNUSED)
945   PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_UNUSED)
946
947   PORT_START("keyb_special")
948   PORT_BIT( 0x01, IP_ACTIVE_LOW,  IPT_KEYBOARD) PORT_NAME("Caps Lock")    PORT_CODE(KEYCODE_CAPSLOCK) PORT_TOGGLE
949   PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Left Shift")   PORT_CODE(KEYCODE_LSHIFT)   PORT_CHAR(UCHAR_SHIFT_1)
950   PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Right Shift")  PORT_CODE(KEYCODE_RSHIFT)   PORT_CHAR(UCHAR_SHIFT_1)
951   PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Control")      PORT_CODE(KEYCODE_LCONTROL) PORT_CHAR(UCHAR_SHIFT_2)
952   PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Open Apple")   PORT_CODE(KEYCODE_LALT)
953   PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Solid Apple")  PORT_CODE(KEYCODE_RALT)
954   PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("RESET")        PORT_CODE(KEYCODE_F12)
955
956   PORT_INCLUDE( apple2_gameport )
957   PORT_INCLUDE(apple2_sysconfig)
958INPUT_PORTS_END
959
960/* according to Steve Nickolas (author of Dapple), our original palette would
961 * have been more appropriate for an Apple IIgs.  So we've substituted in the
962 * Robert Munafo palette instead, which is more accurate on 8-bit Apples
963 */
964static const rgb_t apple2_palette[] =
965{
966   rgb_t::black,
967   rgb_t(0xE3, 0x1E, 0x60), /* Dark Red */
968   rgb_t(0x60, 0x4E, 0xBD), /* Dark Blue */
969   rgb_t(0xFF, 0x44, 0xFD), /* Purple */
970   rgb_t(0x00, 0xA3, 0x60), /* Dark Green */
971   rgb_t(0x9C, 0x9C, 0x9C), /* Dark Gray */
972   rgb_t(0x14, 0xCF, 0xFD), /* Medium Blue */
973   rgb_t(0xD0, 0xC3, 0xFF), /* Light Blue */
974   rgb_t(0x60, 0x72, 0x03), /* Brown */
975   rgb_t(0xFF, 0x6A, 0x3C), /* Orange */
976   rgb_t(0x9C, 0x9C, 0x9C), /* Light Grey */
977   rgb_t(0xFF, 0xA0, 0xD0), /* Pink */
978   rgb_t(0x14, 0xF5, 0x3C), /* Light Green */
979   rgb_t(0xD0, 0xDD, 0x8D), /* Yellow */
980   rgb_t(0x72, 0xFF, 0xD0), /* Aquamarine */
981   rgb_t(0xFF, 0xFF, 0xFF)  /* White */
982};
983
984/* Initialize the palette */
985PALETTE_INIT_MEMBER(apple2_state,apple2)
986{
987   palette.set_pen_colors(0, apple2_palette, ARRAY_LENGTH(apple2_palette));
988}
989
9901187static SLOT_INTERFACE_START(apple2_slot0_cards)
991   SLOT_INTERFACE("lang", A2BUS_LANG)      /* Apple II Language Card */
1188   SLOT_INTERFACE("lang", A2BUS_RAMCARD16K)      /* Apple II RAM Language Card */
1189   SLOT_INTERFACE("ssram", A2BUS_RAMCARD128K)     /* Saturn Systems 128K extended language card */
9921190SLOT_INTERFACE_END
9931191
9941192static SLOT_INTERFACE_START(apple2_cards)
r241923r241924
10331231//  SLOT_INTERFACE("magicmusician", A2BUS_MAGICMUSICIAN)    /* Magic Musician Card */
10341232SLOT_INTERFACE_END
10351233
1036static SLOT_INTERFACE_START(apple2eaux_cards)
1037   SLOT_INTERFACE("std80", A2EAUX_STD80COL) /* Apple IIe Standard 80 Column Card */
1038   SLOT_INTERFACE("ext80", A2EAUX_EXT80COL) /* Apple IIe Extended 80 Column Card */
1039   SLOT_INTERFACE("rw3", A2EAUX_RAMWORKS3)  /* Applied Engineering RamWorks III */
1040SLOT_INTERFACE_END
1041
1042static MACHINE_CONFIG_START( apple2_common, apple2_state )
1234static MACHINE_CONFIG_START( apple2_common, napple2_state )
10431235   /* basic machine hardware */
1044   MCFG_CPU_ADD("maincpu", M6502, 1021800)     /* close to actual CPU frequency of 1.020484 MHz */
1236   MCFG_CPU_ADD(A2_CPU_TAG, M6502, 1021800)     /* close to actual CPU frequency of 1.020484 MHz */
10451237   MCFG_CPU_PROGRAM_MAP(apple2_map)
1046   MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", apple2_state, apple2_interrupt, "screen", 0, 1)
1238   MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", napple2_state, apple2_interrupt, "screen", 0, 1)
10471239   MCFG_QUANTUM_TIME(attotime::from_hz(60))
10481240
1049   MCFG_MACHINE_START_OVERRIDE(apple2_state, apple2e )
1241   MCFG_DEVICE_ADD(A2_VIDEO_TAG, APPLE2_VIDEO, XTAL_14_31818MHz)
10501242
10511243   MCFG_SCREEN_ADD("screen", RASTER)
10521244   MCFG_SCREEN_REFRESH_RATE(60)
10531245   MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
1054   MCFG_SCREEN_SIZE(280*2, 192)
1246   MCFG_SCREEN_SIZE(280*2, 262)
10551247   MCFG_SCREEN_VISIBLE_AREA(0, (280*2)-1,0,192-1)
1056   MCFG_SCREEN_UPDATE_DRIVER(apple2_state, screen_update_apple2)
1248   MCFG_SCREEN_UPDATE_DRIVER(napple2_state, screen_update)
10571249   MCFG_SCREEN_PALETTE("palette")
10581250
1059   MCFG_PALETTE_ADD("palette", ARRAY_LENGTH(apple2_palette))
1060   MCFG_PALETTE_INIT_OWNER(apple2_state,apple2)
1251   MCFG_PALETTE_ADD("palette", 16)
1252   MCFG_PALETTE_INIT_OWNER(napple2_state, apple2)
10611253
1062   MCFG_VIDEO_START_OVERRIDE(apple2_state,apple2)
1063
10641254   /* sound hardware */
10651255   MCFG_SPEAKER_STANDARD_MONO("mono")
1066   MCFG_SOUND_ADD("a2speaker", SPEAKER_SOUND, 0)
1256   MCFG_SOUND_ADD(A2_SPEAKER_TAG, SPEAKER_SOUND, 0)
10671257   MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00)
10681258
1259   /* /INH banking */
1260   MCFG_DEVICE_ADD(A2_UPPERBANK_TAG, ADDRESS_MAP_BANK, 0)
1261   MCFG_DEVICE_PROGRAM_MAP(inhbank_map)
1262   MCFG_ADDRESS_MAP_BANK_ENDIANNESS(ENDIANNESS_LITTLE)
1263   MCFG_ADDRESS_MAP_BANK_DATABUS_WIDTH(8)
1264   MCFG_ADDRESS_MAP_BANK_STRIDE(0x3000)
1265
10691266   /* keyboard controller */
1070   MCFG_DEVICE_ADD("ay3600", AY3600, 0)
1267   MCFG_DEVICE_ADD(A2_KBDC_TAG, AY3600, 0)
10711268   MCFG_AY3600_MATRIX_X0(IOPORT("X0"))
10721269   MCFG_AY3600_MATRIX_X1(IOPORT("X1"))
10731270   MCFG_AY3600_MATRIX_X2(IOPORT("X2"))
r241923r241924
10771274   MCFG_AY3600_MATRIX_X6(IOPORT("X6"))
10781275   MCFG_AY3600_MATRIX_X7(IOPORT("X7"))
10791276   MCFG_AY3600_MATRIX_X8(IOPORT("X8"))
1080   MCFG_AY3600_SHIFT_CB(READLINE(apple2_state, ay3600_shift_r))
1081   MCFG_AY3600_CONTROL_CB(READLINE(apple2_state, ay3600_control_r))
1082   MCFG_AY3600_DATA_READY_CB(WRITELINE(apple2_state, ay3600_data_ready_w))
1277   MCFG_AY3600_SHIFT_CB(READLINE(napple2_state, ay3600_shift_r))
1278   MCFG_AY3600_CONTROL_CB(READLINE(napple2_state, ay3600_control_r))
1279   MCFG_AY3600_DATA_READY_CB(WRITELINE(napple2_state, ay3600_data_ready_w))
1280   MCFG_AY3600_AKO_CB(WRITELINE(napple2_state, ay3600_ako_w))
10831281
1282   /* repeat timer.  15 Hz from page 90 of "The Apple II Circuit Description */
1283   MCFG_TIMER_DRIVER_ADD_PERIODIC("repttmr", napple2_state, ay3600_repeat, attotime::from_hz(15))
1284
10841285   /* slot devices */
1085   MCFG_DEVICE_ADD("a2bus", A2BUS, 0)
1086   MCFG_A2BUS_CPU("maincpu")
1087   MCFG_A2BUS_OUT_IRQ_CB(WRITELINE(apple2_state, a2bus_irq_w))
1088   MCFG_A2BUS_OUT_NMI_CB(WRITELINE(apple2_state, a2bus_nmi_w))
1089   MCFG_A2BUS_OUT_INH_CB(WRITELINE(apple2_state, a2bus_inh_w))
1090   MCFG_A2BUS_SLOT_ADD("a2bus", "sl0", apple2_slot0_cards, "lang")
1091   MCFG_A2BUS_SLOT_ADD("a2bus", "sl1", apple2_cards, NULL)
1092   MCFG_A2BUS_SLOT_ADD("a2bus", "sl2", apple2_cards, NULL)
1093   MCFG_A2BUS_SLOT_ADD("a2bus", "sl3", apple2_cards, NULL)
1094   MCFG_A2BUS_SLOT_ADD("a2bus", "sl4", apple2_cards, "mockingboard")
1095   MCFG_A2BUS_SLOT_ADD("a2bus", "sl5", apple2_cards, NULL)
1096   MCFG_A2BUS_SLOT_ADD("a2bus", "sl6", apple2_cards, "diskii")
1097   MCFG_A2BUS_SLOT_ADD("a2bus", "sl7", apple2_cards, NULL)
1286   MCFG_DEVICE_ADD(A2_BUS_TAG, A2BUS, 0)
1287   MCFG_A2BUS_CPU(A2_CPU_TAG)
1288   MCFG_A2BUS_OUT_IRQ_CB(WRITELINE(napple2_state, a2bus_irq_w))
1289   MCFG_A2BUS_OUT_NMI_CB(WRITELINE(napple2_state, a2bus_nmi_w))
1290   MCFG_A2BUS_OUT_INH_CB(WRITELINE(napple2_state, a2bus_inh_w))
1291   MCFG_A2BUS_SLOT_ADD(A2_BUS_TAG, "sl0", apple2_slot0_cards, "lang")
1292   MCFG_A2BUS_SLOT_ADD(A2_BUS_TAG, "sl1", apple2_cards, NULL)
1293   MCFG_A2BUS_SLOT_ADD(A2_BUS_TAG, "sl2", apple2_cards, NULL)
1294   MCFG_A2BUS_SLOT_ADD(A2_BUS_TAG, "sl3", apple2_cards, NULL)
1295   MCFG_A2BUS_SLOT_ADD(A2_BUS_TAG, "sl4", apple2_cards, "mockingboard")
1296   MCFG_A2BUS_SLOT_ADD(A2_BUS_TAG, "sl5", apple2_cards, NULL)
1297   MCFG_A2BUS_SLOT_ADD(A2_BUS_TAG, "sl6", apple2_cards, "diskii")
1298   MCFG_A2BUS_SLOT_ADD(A2_BUS_TAG, "sl7", apple2_cards, NULL)
10981299
10991300   MCFG_SOFTWARE_LIST_ADD("flop525_list","apple2")
1301
1302   MCFG_CASSETTE_ADD(A2_CASSETTE_TAG)
1303   MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_STOPPED)
11001304MACHINE_CONFIG_END
11011305
11021306static MACHINE_CONFIG_DERIVED( apple2, apple2_common )
1103   MCFG_MACHINE_START_OVERRIDE(apple2_state,apple2orig)
1104
11051307   /* internal ram */
11061308   MCFG_RAM_ADD(RAM_TAG)
1107   MCFG_RAM_DEFAULT_SIZE("64K")
1309   MCFG_RAM_DEFAULT_SIZE("48K")
11081310   MCFG_RAM_EXTRA_OPTIONS("4K,8K,12K,16K,20K,24K,32K,36K,48K")
11091311   MCFG_RAM_DEFAULT_VALUE(0x00)
1110   /* At the moment the RAM bank $C000-$FFFF is available only if you choose   */
1111   /* default configuration: on real machine is present also in configurations */
1112   /* with less memory, provided that the language card is installed           */
1113   MCFG_CASSETTE_ADD( "cassette" )
1114   MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_STOPPED)
11151312MACHINE_CONFIG_END
11161313
11171314static MACHINE_CONFIG_DERIVED( apple2p, apple2_common )
1118   MCFG_MACHINE_START_OVERRIDE(apple2_state,apple2orig)
1119   MCFG_VIDEO_START_OVERRIDE(apple2_state,apple2p)
1120
11211315   /* internal ram */
11221316   MCFG_RAM_ADD(RAM_TAG)
1123   MCFG_RAM_DEFAULT_SIZE("64K")
1317   MCFG_RAM_DEFAULT_SIZE("48K")
11241318   MCFG_RAM_EXTRA_OPTIONS("16K,32K,48K")
11251319   MCFG_RAM_DEFAULT_VALUE(0x00)
1126   /* At the moment the RAM bank $C000-$FFFF is available only if you choose   */
1127   /* default configuration: on real machine is present also in configurations */
1128   /* with less memory, provided that the language card is installed           */
1129   MCFG_CASSETTE_ADD( "cassette" )
1130   MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_STOPPED)
11311320MACHINE_CONFIG_END
11321321
1133static MACHINE_CONFIG_DERIVED( apple2e, apple2_common )
1134   MCFG_MACHINE_START_OVERRIDE(apple2_state,apple2e)
1135   MCFG_VIDEO_START_OVERRIDE(apple2_state,apple2e)
1136   /* internal ram */
1137   MCFG_RAM_ADD(RAM_TAG)
1138   MCFG_RAM_DEFAULT_SIZE("128K")
1139   MCFG_RAM_EXTRA_OPTIONS("64K")
1140   MCFG_RAM_DEFAULT_VALUE(0x00)
1141   MCFG_CASSETTE_ADD( "cassette" )
1142   MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_STOPPED)
1143
1144   /* keyboard controller */
1145   MCFG_DEVICE_MODIFY("ay3600")
1146   MCFG_AY3600_DATA_READY_CB(WRITELINE(apple2_state, ay3600_iie_data_ready_w))
1147
1148   // IIe and later have no physical slot 0, the "language card" is built into the motherboard
1149   MCFG_A2BUS_SLOT_REMOVE("sl0")
1150   MCFG_A2BUS_ONBOARD_ADD("a2bus", "sl0", A2BUS_LANG, NULL)
1151
1152   MCFG_DEVICE_ADD(AUXSLOT_TAG, A2EAUXSLOT, 0)
1153   MCFG_A2EAUXSLOT_CPU("maincpu")
1154   MCFG_A2EAUXSLOT_OUT_IRQ_CB(WRITELINE(apple2_state, a2bus_irq_w))
1155   MCFG_A2EAUXSLOT_OUT_NMI_CB(WRITELINE(apple2_state, a2bus_nmi_w))
1156   MCFG_A2EAUXSLOT_SLOT_ADD(AUXSLOT_TAG, "aux", apple2eaux_cards, "ext80")   // default to an extended 80-column card
1157
1158MACHINE_CONFIG_END
1159
1160static MACHINE_CONFIG_DERIVED( tk2000, apple2_common )
1161   MCFG_MACHINE_START_OVERRIDE(apple2_state,tk2000)
1162   MCFG_VIDEO_START_OVERRIDE(apple2_state,apple2c)
1163   /* internal ram */
1164   MCFG_RAM_ADD(RAM_TAG)
1165   MCFG_RAM_DEFAULT_SIZE("64K")
1166   MCFG_RAM_DEFAULT_VALUE(0x00)
1167   MCFG_CASSETTE_ADD( "cassette" )
1168   MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_STOPPED)
1169
1170   // TK2000 doesn't have slots, and it doesn't emulate a language card
1171   // C05A maps RAM from C100-FFFF, C05B maps ROM
1172   MCFG_A2BUS_SLOT_REMOVE("sl0")
1173   MCFG_A2BUS_SLOT_REMOVE("sl1")
1174   MCFG_A2BUS_SLOT_REMOVE("sl2")
1175   MCFG_A2BUS_SLOT_REMOVE("sl3")
1176   MCFG_A2BUS_SLOT_REMOVE("sl4")
1177   MCFG_A2BUS_SLOT_REMOVE("sl5")
1178   MCFG_A2BUS_SLOT_REMOVE("sl6")
1179   MCFG_A2BUS_SLOT_REMOVE("sl7")
1180
1181   MCFG_SOFTWARE_LIST_REMOVE("flop525_list")
1182MACHINE_CONFIG_END
1183
1184static MACHINE_CONFIG_DERIVED( mprof3, apple2e )
1185   MCFG_MACHINE_START_OVERRIDE(apple2_state,apple2c)
1186   MCFG_VIDEO_START_OVERRIDE(apple2_state,apple2c)
1187
1188   /* internal ram */
1189   MCFG_RAM_MODIFY(RAM_TAG)
1190   MCFG_RAM_DEFAULT_SIZE("128K")
1191MACHINE_CONFIG_END
1192
1193static MACHINE_CONFIG_DERIVED( apple2ee, apple2e )
1194   MCFG_CPU_REPLACE("maincpu", M65C02, 1021800)        /* close to actual CPU frequency of 1.020484 MHz */
1195MACHINE_CONFIG_END
1196
1197static MACHINE_CONFIG_DERIVED( tk3000, apple2e )
1198   MCFG_CPU_REPLACE("maincpu", M65C02, 1021800)        /* close to actual CPU frequency of 1.020484 MHz */
1199
1200   MCFG_CPU_ADD("subcpu", Z80, 1021800)    // schematics are illegible on where the clock comes from, but it *seems* to be the same as the 65C02 clock
1201   MCFG_CPU_PROGRAM_MAP(tk3000_kbd_map)
1202MACHINE_CONFIG_END
1203
1204static MACHINE_CONFIG_DERIVED( apple2ep, apple2e )
1205   MCFG_CPU_REPLACE("maincpu", M65C02, 1021800)        /* close to actual CPU frequency of 1.020484 MHz */
1206MACHINE_CONFIG_END
1207
1208static MACHINE_CONFIG_DERIVED( apple2c, apple2ee )
1209   MCFG_MACHINE_START_OVERRIDE(apple2_state,apple2c)
1210   MCFG_VIDEO_START_OVERRIDE(apple2_state,apple2c)
1211
1212   // IIc and friends have no cassette port
1213   MCFG_DEVICE_REMOVE("cassette")
1214
1215   MCFG_A2BUS_SLOT_REMOVE("sl1")   // IIc has no slots, of course :)
1216   MCFG_A2BUS_SLOT_REMOVE("sl2")
1217   MCFG_A2BUS_SLOT_REMOVE("sl3")
1218   MCFG_A2BUS_SLOT_REMOVE("sl4")
1219   MCFG_A2BUS_SLOT_REMOVE("sl5")
1220   MCFG_A2BUS_SLOT_REMOVE("sl6")
1221   MCFG_A2BUS_SLOT_REMOVE("sl7")
1222
1223   MCFG_DEVICE_ADD(IIC_ACIA1_TAG, MOS6551, 0)
1224   MCFG_MOS6551_XTAL(XTAL_14_31818MHz / 8) // ~1.789 MHz
1225   MCFG_MOS6551_TXD_HANDLER(DEVWRITELINE(PRINTER_PORT_TAG, rs232_port_device, write_txd))
1226
1227   MCFG_DEVICE_ADD(IIC_ACIA2_TAG, MOS6551, 0)
1228   MCFG_MOS6551_XTAL(XTAL_1_8432MHz)   // matches SSC so modem software is compatible
1229   MCFG_MOS6551_TXD_HANDLER(DEVWRITELINE("modem", rs232_port_device, write_txd))
1230
1231   MCFG_RS232_PORT_ADD(PRINTER_PORT_TAG, default_rs232_devices, NULL)
1232   MCFG_RS232_RXD_HANDLER(DEVWRITELINE(IIC_ACIA1_TAG, mos6551_device, write_rxd))
1233   MCFG_RS232_DCD_HANDLER(DEVWRITELINE(IIC_ACIA1_TAG, mos6551_device, write_dcd))
1234   MCFG_RS232_DSR_HANDLER(DEVWRITELINE(IIC_ACIA1_TAG, mos6551_device, write_dsr))
1235   MCFG_RS232_CTS_HANDLER(DEVWRITELINE(IIC_ACIA1_TAG, mos6551_device, write_cts))
1236
1237   MCFG_RS232_PORT_ADD(MODEM_PORT_TAG, default_rs232_devices, NULL)
1238   MCFG_RS232_RXD_HANDLER(DEVWRITELINE(IIC_ACIA2_TAG, mos6551_device, write_rxd))
1239   MCFG_RS232_DCD_HANDLER(DEVWRITELINE(IIC_ACIA2_TAG, mos6551_device, write_dcd))
1240   MCFG_RS232_DSR_HANDLER(DEVWRITELINE(IIC_ACIA2_TAG, mos6551_device, write_dsr))
1241   MCFG_RS232_CTS_HANDLER(DEVWRITELINE(IIC_ACIA2_TAG, mos6551_device, write_cts))
1242
1243   // TODO: populate the IIc's other virtual slots with ONBOARD_ADD
1244   MCFG_A2BUS_ONBOARD_ADD("a2bus", "sl6", A2BUS_DISKIING, NULL)
1245
1246   MCFG_A2EAUXSLOT_SLOT_REMOVE("aux")
1247   MCFG_DEVICE_REMOVE(AUXSLOT_TAG)
1248
1249   MCFG_RAM_MODIFY(RAM_TAG)
1250   MCFG_RAM_DEFAULT_SIZE("128K")
1251   MCFG_RAM_EXTRA_OPTIONS("128K")
1252MACHINE_CONFIG_END
1253
1254const applefdc_interface a2cp_interface =
1255{
1256   sony_set_lines,         /* set_lines */
1257   sony_set_enable_lines,  /* set_enable_lines */
1258
1259   sony_read_data,         /* read_data */
1260   sony_write_data,    /* write_data */
1261   sony_read_status    /* read_status */
1262};
1263
1264static const floppy_interface apple2cp_floppy35_floppy_interface =
1265{
1266   FLOPPY_STANDARD_5_25_DSHD,
1267   LEGACY_FLOPPY_OPTIONS_NAME(apple35_iigs),
1268   "floppy_3_5"
1269};
1270
1271static MACHINE_CONFIG_DERIVED( apple2cp, apple2c )
1272   MCFG_MACHINE_START_OVERRIDE(apple2_state,apple2cp)
1273
1274   MCFG_A2BUS_SLOT_REMOVE("sl6")
1275   MCFG_IWM_ADD(IICP_IWM_TAG, a2cp_interface)
1276   MCFG_LEGACY_FLOPPY_SONY_2_DRIVES_ADD(apple2cp_floppy35_floppy_interface)
1277MACHINE_CONFIG_END
1278
1279static MACHINE_CONFIG_DERIVED( apple2c_iwm, apple2c )
1280
1281   MCFG_A2BUS_SLOT_REMOVE("sl6")
1282   MCFG_A2BUS_ONBOARD_ADD("a2bus", "sl6", A2BUS_IWM_FDC, NULL)
1283MACHINE_CONFIG_END
1284
1285const applefdc_interface fdc_interface =
1286{
1287   apple525_set_lines,         /* set_lines */
1288   apple525_set_enable_lines,  /* set_enable_lines */
1289
1290   apple525_read_data,         /* read_data */
1291   apple525_write_data,    /* write_data */
1292   apple525_read_status    /* read_status */
1293};
1294
1295static const floppy_interface floppy_interface =
1296{
1297   FLOPPY_STANDARD_5_25_DSHD,
1298   LEGACY_FLOPPY_OPTIONS_NAME(apple2),
1299   "floppy_5_25"
1300};
1301
1302static MACHINE_CONFIG_DERIVED( laser128, apple2c )
1303   MCFG_MACHINE_START_OVERRIDE(apple2_state,laser128)
1304
1305   MCFG_APPLEFDC_ADD(LASER128_UDC_TAG, fdc_interface)
1306   MCFG_LEGACY_FLOPPY_APPLE_2_DRIVES_ADD(floppy_interface,15,16)
1307
1308   MCFG_A2BUS_SLOT_REMOVE("sl6")
1309
1310   MCFG_A2BUS_ONBOARD_ADD("a2bus", "sl1", A2BUS_LASER128, NULL)
1311   MCFG_A2BUS_ONBOARD_ADD("a2bus", "sl2", A2BUS_LASER128, NULL)
1312   MCFG_A2BUS_ONBOARD_ADD("a2bus", "sl3", A2BUS_LASER128, NULL)
1313   MCFG_A2BUS_ONBOARD_ADD("a2bus", "sl4", A2BUS_LASER128, NULL)
1314   MCFG_A2BUS_SLOT_ADD("a2bus", "sl5", apple2_cards, NULL)
1315   MCFG_A2BUS_ONBOARD_ADD("a2bus", "sl6", A2BUS_LASER128, NULL)
1316   MCFG_A2BUS_SLOT_ADD("a2bus", "sl7", apple2_cards, NULL)
1317MACHINE_CONFIG_END
1318
1319static MACHINE_CONFIG_DERIVED( laser128ex2, apple2c )
1320   MCFG_MACHINE_START_OVERRIDE(apple2_state,laser128)
1321
1322   MCFG_APPLEFDC_ADD(LASER128_UDC_TAG, fdc_interface)
1323   MCFG_LEGACY_FLOPPY_APPLE_2_DRIVES_ADD(floppy_interface,15,16)
1324
1325   MCFG_A2BUS_SLOT_REMOVE("sl6")
1326
1327   MCFG_A2BUS_ONBOARD_ADD("a2bus", "sl1", A2BUS_LASER128, NULL)
1328   MCFG_A2BUS_ONBOARD_ADD("a2bus", "sl2", A2BUS_LASER128, NULL)
1329   MCFG_A2BUS_ONBOARD_ADD("a2bus", "sl3", A2BUS_LASER128, NULL)
1330   MCFG_A2BUS_ONBOARD_ADD("a2bus", "sl4", A2BUS_LASER128, NULL)
1331   MCFG_A2BUS_ONBOARD_ADD("a2bus", "sl5", A2BUS_LASER128, NULL)
1332   MCFG_A2BUS_ONBOARD_ADD("a2bus", "sl6", A2BUS_LASER128, NULL)
1333   MCFG_A2BUS_ONBOARD_ADD("a2bus", "sl7", A2BUS_LASER128, NULL)
1334MACHINE_CONFIG_END
1335
13361322static MACHINE_CONFIG_DERIVED( space84, apple2p )
1337   MCFG_MACHINE_START_OVERRIDE(apple2_state,space84)
13381323MACHINE_CONFIG_END
13391324
13401325#if 0
13411326static MACHINE_CONFIG_DERIVED( laba2p, apple2p )
1342   MCFG_MACHINE_START_OVERRIDE(apple2_state,laba2p)
1327   MCFG_MACHINE_START_OVERRIDE(napple2_state,laba2p)
13431328
13441329   MCFG_A2BUS_SLOT_REMOVE("sl0")
13451330   MCFG_A2BUS_SLOT_REMOVE("sl3")
r241923r241924
13641349   ROM_REGION(0x4000,"maincpu",0)
13651350   ROM_LOAD_OPTIONAL ( "341-0016-00.d0", 0x1000, 0x0800, CRC(4234e88a) SHA1(c9a81d704dc2f0c3416c20f9c4ab71fedda937ed)) /* 341-0016: Programmer's Aid #1 D0 */
13661351
1367/* The area $D800-$DFFF in Apple II is reserved for 3rd party add-ons:
1368   Maybe MESS should map this space to a CARTSLOT device?              */
1369
13701352   ROM_LOAD ( "341-0001-00.e0", 0x2000, 0x0800, CRC(c0a4ad3b) SHA1(bf32195efcb34b694c893c2d342321ec3a24b98f)) /* Needs verification. From eBay: Label: S7925E // C48077 // 3410001-00 // (C)APPLE78 E0 */
13711353   ROM_LOAD ( "341-0002-00.e8", 0x2800, 0x0800, CRC(a99c2cf6) SHA1(9767d92d04fc65c626223f25564cca31f5248980)) /* Needs verification. From eBay: Label: S7916E // C48078 // 3410002-00 // (C)APPLE78 E8 */
13721354   ROM_LOAD ( "341-0003-00.f0", 0x3000, 0x0800, CRC(62230d38) SHA1(f268022da555e4c809ca1ae9e5d2f00b388ff61c)) /* Needs verification. From eBay: Label: S7908E // C48709 // 3410003 // CAPPLE78 F0 */
13731355   ROM_LOAD ( "341-0004-00.f8", 0x3800, 0x0800, CRC(020a86d0) SHA1(52a18bd578a4694420009cad7a7a5779a8c00226))
1374   /* For the following bits, I'm not sure how to do this properly, since the P5 and P6 roms came in pairs and are in different address spaces...
1375   Also the 3.5" 400k? disk control rom, 341-0438-a should probably be here as well, assuming it could be used with an apple2/2+/2e */
1376   //ROMX_LOAD ( "341-0009.p5", 0x4500, 0x0100, CRC(d34eb2ff) SHA1(afd060e6f35faf3bb0146fa889fc787adf56330a), ROM_BIOS(1)) /* 341-0009: 13-sector disk drive, PROM P5 */
1377   //ROMX_LOAD ( "341-0027-a.p5", 0x4500, 0x0100, CRC(ce7144f6) SHA1(d4181c9f046aafc3fb326b381baac809d9e38d16), ROM_BIOS(2)) /* 341-0027-a: 16-sector disk drive (older version), PROM P5 */
1378   //ROMX_LOAD ( "341-0127-a.p5a", 0x4500, 0x0100, NO_DUMP, ROM_BIOS(3)) /* 341-0127-A: 16-sector disk drive (later version) PROM P5; Label: 341-0127-A // (C) APPLE 81 P5A (see 'Apple Disk II Interface Card.jpg') (I have a suspicion this rom is the same as the 341-0027-a one)*/
1379
1380   //ROM_REGION(0x100,"wsmprom",0) /* prom 'p6' for the woz state machine on 650-X104- Disk II interface card */
1381   //ROMX_LOAD ( "341-0010.rom", 0x0000, 0x0100, CRC(62e22620) SHA1(e3d6d1c30653572b49ecc2dc54ce073978411a04), ROM_BIOS(1)) /* 341-0010: 13-sector disk drive, PROM P6 */
1382   //ROMX_LOAD ( "341-0028-a.rom", 0x0000, 0x0100, CRC(b72a2c70) SHA1(bc39fbd5b9a8d2287ac5d0a42e639fc4d3c2f9d4), ROM_BIOS(2)) /* 341-0028: 16-sector disk drive (older version), PROM P6 */
1383   //ROMX_LOAD ( "341-0128-a.rom", 0x0000, 0x0100, NO_DUMP, ROM_BIOS(3)) /* 341-0128-A: 16-sector disk drive (later version), PROM P6 Label: 341-0128-A // (C) APPLE 81 P6A (see 'Apple Disk II Interface Card.jpg') (This rom MIGHT be the same as the 341-0028 one) */
13841356   ROM_END
13851357
13861358ROM_START(apple2p) /* the autoboot apple2+ with applesoft (microsoft-written) basic in rom; optional card with monitor and integer basic was possible but isn't yet supported */
13871359   ROM_REGION(0x0800,"gfx1",0)
13881360   ROM_LOAD ( "341-0036.chr", 0x0000, 0x0800, CRC(64f415c6) SHA1(f9d312f128c9557d9d6ac03bfad6c3ddf83e5659))
13891361
1390   ROM_REGION(0x4000,"maincpu",0)
1362   ROM_REGION(0x4000, "maincpu", ROMREGION_LE)
13911363   ROM_LOAD ( "341-0011.d0", 0x1000, 0x0800, CRC(6f05f949) SHA1(0287ebcef2c1ce11dc71be15a99d2d7e0e128b1e))
13921364   ROM_LOAD ( "341-0012.d8", 0x1800, 0x0800, CRC(1f08087c) SHA1(a75ce5aab6401355bf1ab01b04e4946a424879b5))
13931365   ROM_LOAD ( "341-0013.e0", 0x2000, 0x0800, CRC(2b8d9a89) SHA1(8d82a1da63224859bd619005fab62c4714b25dd7))
r241923r241924
14211393   ROM_LOAD ( "pravetz8m.f8", 0x3800, 0x0800, CRC(5bab0a46) SHA1(f6c0817ce37d2e2c43f482c339acaede0a73359b))
14221394ROM_END
14231395
1424ROM_START( agat7 )
1425   ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASEFF )
1426   ROM_SYSTEM_BIOS( 0, "v1", "Version 1" )
1427   ROMX_LOAD( "monitor7.rom", 0x3800, 0x0800, CRC(071fda0b) SHA1(6089d46b7addc4e2ae096b2cf81124681bd2b27a), ROM_BIOS(1))
1428   ROM_SYSTEM_BIOS( 1, "v2", "Version 2" )
1429   ROMX_LOAD( "agat_pzu.bin", 0x3800, 0x0800, CRC(c605163d) SHA1(b30fd1b264a347a9de69bb9e3105483254994d06), ROM_BIOS(2))
1430   // Floppy controllers
1431   ROM_LOAD( "shugart7.rom", 0x4500, 0x0100, CRC(c6e4850c) SHA1(71626d3d2d4bbeeac2b77585b45a5566d20b8d34))
1432   ROM_LOAD( "teac.rom",     0x4500, 0x0100, CRC(94266928) SHA1(5d369bad6cdd6a70b0bb16480eba69640de87a2e))
1433   ROM_REGION(0x0800,"gfx1",0)
1434   ROM_LOAD( "agathe7.fnt", 0x0000, 0x0800, CRC(fcffb490) SHA1(0bda26ae7ad75f74da835c0cf6d9928f9508844c))
1435ROM_END
1436
1437ROM_START( agat9 )
1438   ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASEFF )
1439   ROM_SYSTEM_BIOS( 0, "v1", "Version 1" )
1440   ROMX_LOAD( "monitor9.rom", 0x3800, 0x0800, CRC(b90bb66a) SHA1(02217f0785913b41fc25eabcff70fa814799c69a), ROM_BIOS(1))
1441   ROM_SYSTEM_BIOS( 1, "v2", "Version 2" )
1442   ROMX_LOAD( "monitor91.rom", 0x3800, 0x0800, CRC(89b10fc1) SHA1(7fe1ede32b5525255f82597ca9c3c2034c5996fa), ROM_BIOS(2))
1443   // Floppy controllers
1444   ROM_LOAD( "shugart9.rom", 0x4500, 0x0100, CRC(964a0ce2) SHA1(bf955189ebffe874c20ef649a3db8177dc16af61))
1445   ROM_LOAD( "teac.rom",     0x4500, 0x0100, CRC(94266928) SHA1(5d369bad6cdd6a70b0bb16480eba69640de87a2e))
1446   // Printer card
1447   ROM_LOAD( "cm6337.rom", 0x8000, 0x0100, CRC(73be16ec) SHA1(ead1abbef5b86f1def0b956147d5b267f0d544b5))
1448   ROM_LOAD( "cm6337p.rom", 0x8100, 0x0800, CRC(9120f11f) SHA1(78107653491e88d5ea12e07367c4c028771a4aca))
1449   ROM_REGION(0x0800,"gfx1",0)
1450   ROM_LOAD( "agathe9.fnt", 0x0000, 0x0800, CRC(8c55c984) SHA1(5a5a202000576b88b4ae2e180dd2d1b9b337b594))
1451ROM_END
1452
14531396/*
14541397    J-Plus ROM numbers confirmed by:
14551398    http://mirrors.apple2.org.za/Apple%20II%20Documentation%20Project/Computers/Apple%20II/Apple%20II%20j-plus/Photos/Apple%20II%20j-plus%20-%20Motherboard.jpg
r241923r241924
14761419   ROM_LOAD ( "ace100.rom", 0x1000, 0x3000, CRC(9d5ec94f) SHA1(8f2b3f2561788bebc7a805f620ec9e7ade973460))
14771420ROM_END
14781421
1479ROM_START(apple2e)
1422ROM_START(space84)
14801423   ROM_REGION(0x2000,"gfx1",0)
1481   ROM_LOAD ( "342-0133-a.chr", 0x0000, 0x1000,CRC(b081df66) SHA1(7060de104046736529c1e8a687a0dd7b84f8c51b))
1482   ROM_LOAD ( "342-0133-a.chr", 0x1000, 0x1000,CRC(b081df66) SHA1(7060de104046736529c1e8a687a0dd7b84f8c51b))
1424   ROM_LOAD( "space 84 mobo chargen.bin", 0x0000, 0x2000, CRC(ceb98990) SHA1(8b2758da611bcfdd3d144edabc63ef1df2ca787b) )
14831425
14841426   ROM_REGION(0x4000,"maincpu",0)
1485   ROM_LOAD ( "342-0135-b.64", 0x0000, 0x2000, CRC(e248835e) SHA1(523838c19c79f481fa02df56856da1ec3816d16e))
1486   ROM_LOAD ( "342-0134-a.64", 0x2000, 0x2000, CRC(fc3d59d8) SHA1(8895a4b703f2184b673078f411f4089889b61c54))
1487
1488   ROM_REGION( 0x800, "keyboard", ROMREGION_ERASE00 )
1489   ROM_LOAD( "342-0132-c.e12", 0x000, 0x800, CRC(e47045f4) SHA1(12a2e718f5f4acd69b6c33a45a4a940b1440a481) ) // 1983 US-Dvorak
1427   ROM_LOAD ( "341-0011.d0",  0x1000, 0x0800, CRC(6f05f949) SHA1(0287ebcef2c1ce11dc71be15a99d2d7e0e128b1e))
1428   ROM_LOAD ( "341-0012.d8",  0x1800, 0x0800, CRC(1f08087c) SHA1(a75ce5aab6401355bf1ab01b04e4946a424879b5))
1429   ROM_LOAD ( "341-0013.e0",  0x2000, 0x0800, CRC(2b8d9a89) SHA1(8d82a1da63224859bd619005fab62c4714b25dd7))
1430   ROM_LOAD ( "341-0014.e8",  0x2800, 0x0800, CRC(5719871a) SHA1(37501be96d36d041667c15d63e0c1eff2f7dd4e9))
1431   ROM_LOAD( "space84_f.bin", 0x3000, 0x1000, CRC(4e741069) SHA1(ca1f16da9fb40e966ee4a899964cd6a7e140ab50))
14901432ROM_END
14911433
1492ROM_START(apple2euk)
1434ROM_START(am64)
14931435   ROM_REGION(0x2000,"gfx1",0)
1494   ROM_LOAD( "341-0160-a.chr", 0x0000, 0x2000, CRC(9be77112) SHA1(48aafa9a72002c495bc1f3d28150630ff89ca47e) )
1436   ROM_LOAD( "gm-2716.bin", 0x0000, 0x0800, CRC(863e657f) SHA1(cc954204c503bc545ec0d08862483aaad83805d5) )
14951437
14961438   ROM_REGION(0x4000,"maincpu",0)
1497   ROM_LOAD ( "342-0135-b.64", 0x0000, 0x2000, CRC(e248835e) SHA1(523838c19c79f481fa02df56856da1ec3816d16e))
1498   ROM_LOAD ( "342-0134-a.64", 0x2000, 0x2000, CRC(fc3d59d8) SHA1(8895a4b703f2184b673078f411f4089889b61c54))
1439   ROM_LOAD( "am64-27128.bin", 0x0000, 0x4000, CRC(f25cdc7b) SHA1(235e72b77695938a9df8781f5bea3cbbbe1f4c76) )
14991440
1500   ROM_REGION( 0x800, "keyboard", ROMREGION_ERASE00 )
1501   ROM_LOAD( "341-0150-a.e12", 0x000, 0x800, CRC(66ffacd7) SHA1(47bb9608be38ff75429a989b930a93b47099648e) )
1441   ROM_REGION(0x2000, "spares", 0)
1442   // parallel card ROM
1443   ROM_LOAD( "ap-2716.bin",  0x0000, 0x0800, CRC(c6990f08) SHA1(e7daf63639234e46738a4d78a49287d11ccaf537) )
1444   // i8048 keyboard MCU ROM
1445   ROM_LOAD( "tk10.bin",     0x0800, 0x0800, CRC(a06c5b78) SHA1(27c5160b913e0f62120f384026d24b9f1acb6970) )
15021446ROM_END
15031447
1504ROM_START(mprof3)
1505   ROM_REGION(0x2000,"gfx1",0)
1506   ROM_LOAD ( "mpf3.chr", 0x0000, 0x1000,CRC(2597bc19) SHA1(e114dcbb512ec24fb457248c1b53cbd78039ed20))
1507   ROM_LOAD ( "mpf3.chr", 0x1000, 0x1000,CRC(2597bc19) SHA1(e114dcbb512ec24fb457248c1b53cbd78039ed20))
1508
1509   ROM_REGION(0x4000,"maincpu",0)
1510   ROM_LOAD ( "mpf3-cd.rom", 0x0000, 0x2000, CRC(5b662e06) SHA1(aa0db775ca78986480829fcc10f00e57629e1a7c))
1511   ROM_LOAD ( "mpf3-ef.rom", 0x2000, 0x2000, CRC(2c5e8b92) SHA1(befeb03e04b7c3ef36ef5829948a53880df85e92))
1512
1513   ROM_REGION( 0x800, "keyboard", ROMREGION_ERASE00 )
1514   ROM_LOAD( "342-0132-c.e12", 0x000, 0x800, BAD_DUMP CRC(e47045f4) SHA1(12a2e718f5f4acd69b6c33a45a4a940b1440a481) ) // need to dump real mprof keyboard ROM
1448ROM_START( agat7 )
1449   ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASEFF )
1450   ROM_SYSTEM_BIOS( 0, "v1", "Version 1" )
1451   ROMX_LOAD( "monitor7.rom", 0x3800, 0x0800, CRC(071fda0b) SHA1(6089d46b7addc4e2ae096b2cf81124681bd2b27a), ROM_BIOS(1))
1452   ROM_SYSTEM_BIOS( 1, "v2", "Version 2" )
1453   ROMX_LOAD( "agat_pzu.bin", 0x3800, 0x0800, CRC(c605163d) SHA1(b30fd1b264a347a9de69bb9e3105483254994d06), ROM_BIOS(2))
1454   // Floppy controllers
1455   ROM_LOAD( "shugart7.rom", 0x4500, 0x0100, CRC(c6e4850c) SHA1(71626d3d2d4bbeeac2b77585b45a5566d20b8d34))
1456   ROM_LOAD( "teac.rom",     0x4500, 0x0100, CRC(94266928) SHA1(5d369bad6cdd6a70b0bb16480eba69640de87a2e))
1457   ROM_REGION(0x0800,"gfx1",0)
1458   ROM_LOAD( "agathe7.fnt", 0x0000, 0x0800, CRC(fcffb490) SHA1(0bda26ae7ad75f74da835c0cf6d9928f9508844c))
15151459ROM_END
15161460
1517ROM_START(apple2ee)
1518   ROM_REGION(0x2000,"gfx1",0)
1519   ROM_LOAD ( "342-0265-a.chr", 0x0000, 0x1000,CRC(2651014d) SHA1(b2b5d87f52693817fc747df087a4aa1ddcdb1f10))
1520   ROM_LOAD ( "342-0265-a.chr", 0x1000, 0x1000,CRC(2651014d) SHA1(b2b5d87f52693817fc747df087a4aa1ddcdb1f10))
1521
1522   ROM_REGION(0x4000,"maincpu",0)
1523   ROM_LOAD ( "342-0304-a.e10", 0x0000, 0x2000, CRC(443aa7c4) SHA1(3aecc56a26134df51e65e17f33ae80c1f1ac93e6)) /* PCB: "CD ROM // 342-0304", 2364 mask rom */
1524   ROM_LOAD ( "342-0303-a.e8", 0x2000, 0x2000, CRC(95e10034) SHA1(afb09bb96038232dc757d40c0605623cae38088e)) /* PCB: "EF ROM // 342-0303", 2364 mask rom */
1525
1526   ROM_REGION( 0x800, "keyboard", 0 )
1527   ROM_LOAD( "341-0132-d.e12", 0x000, 0x800, CRC(c506efb9) SHA1(8e14e85c645187504ec9d162b3ea614a0c421d32) )
1461ROM_START( agat9 )
1462   ROM_REGION( 0x10000, "maincpu", ROMREGION_ERASEFF )
1463   ROM_SYSTEM_BIOS( 0, "v1", "Version 1" )
1464   ROMX_LOAD( "monitor9.rom", 0x3800, 0x0800, CRC(b90bb66a) SHA1(02217f0785913b41fc25eabcff70fa814799c69a), ROM_BIOS(1))
1465   ROM_SYSTEM_BIOS( 1, "v2", "Version 2" )
1466   ROMX_LOAD( "monitor91.rom", 0x3800, 0x0800, CRC(89b10fc1) SHA1(7fe1ede32b5525255f82597ca9c3c2034c5996fa), ROM_BIOS(2))
1467   // Floppy controllers
1468   ROM_LOAD( "shugart9.rom", 0x4500, 0x0100, CRC(964a0ce2) SHA1(bf955189ebffe874c20ef649a3db8177dc16af61))
1469   ROM_LOAD( "teac.rom",     0x4500, 0x0100, CRC(94266928) SHA1(5d369bad6cdd6a70b0bb16480eba69640de87a2e))
1470   // Printer card
1471   ROM_LOAD( "cm6337.rom", 0x8000, 0x0100, CRC(73be16ec) SHA1(ead1abbef5b86f1def0b956147d5b267f0d544b5))
1472   ROM_LOAD( "cm6337p.rom", 0x8100, 0x0800, CRC(9120f11f) SHA1(78107653491e88d5ea12e07367c4c028771a4aca))
1473   ROM_REGION(0x0800,"gfx1",0)
1474   ROM_LOAD( "agathe9.fnt", 0x0000, 0x0800, CRC(8c55c984) SHA1(5a5a202000576b88b4ae2e180dd2d1b9b337b594))
15281475ROM_END
15291476
1530ROM_START(apple2eeuk)
1531   ROM_REGION(0x2000, "gfx1", 0)
1532   ROM_LOAD( "342-0273-a.chr", 0x0000, 0x2000, CRC(9157085a) SHA1(85479a509d6c8176949a5b20720567b7022aa631) )
1533
1534   ROM_REGION(0x4000,"maincpu",0)
1535   ROM_LOAD ( "342-0304-a.e10", 0x0000, 0x2000, CRC(443aa7c4) SHA1(3aecc56a26134df51e65e17f33ae80c1f1ac93e6)) /* PCB: "CD ROM // 342-0304", 2364 mask rom */
1536   ROM_LOAD ( "342-0303-a.e8", 0x2000, 0x2000, CRC(95e10034) SHA1(afb09bb96038232dc757d40c0605623cae38088e)) /* PCB: "EF ROM // 342-0303", 2364 mask rom */
1537
1538   ROM_REGION( 0x800, "keyboard", 0 )
1539   ROM_LOAD( "341-0150-a.e12", 0x000, 0x800, CRC(66ffacd7) SHA1(47bb9608be38ff75429a989b930a93b47099648e) )
1540ROM_END
1541
1542ROM_START(apple2ep)
1543   ROM_REGION(0x2000,"gfx1",0)
1544   ROM_LOAD ( "342-0265-a.chr", 0x0000, 0x1000,CRC(2651014d) SHA1(b2b5d87f52693817fc747df087a4aa1ddcdb1f10))
1545   ROM_LOAD ( "342-0265-a.chr", 0x1000, 0x1000,CRC(2651014d) SHA1(b2b5d87f52693817fc747df087a4aa1ddcdb1f10))
1546
1547   ROM_REGION(0x4000,"maincpu",0)
1548   ROM_LOAD ("32-0349-b.128", 0x0000, 0x4000, CRC(1d70b193) SHA1(b8ea90abe135a0031065e01697c4a3a20d51198b)) /* should rom name be 342-0349-b? */
1549
1550   ROM_REGION( 0x800, "keyboard", 0 )
1551   // chip printed markings say 342-0132-d, but internally text says "341-0132-d".  Go figure.
1552   ROM_LOAD( "341-0132-d.e12", 0x000, 0x800, CRC(c506efb9) SHA1(8e14e85c645187504ec9d162b3ea614a0c421d32) )
1553ROM_END
1554
1555ROM_START(apple2c)
1556   ROM_REGION(0x2000,"gfx1",0)
1557   ROM_LOAD ( "341-0265-a.chr", 0x0000, 0x1000,CRC(2651014d) SHA1(b2b5d87f52693817fc747df087a4aa1ddcdb1f10))
1558   ROM_LOAD ( "341-0265-a.chr", 0x1000, 0x1000,CRC(2651014d) SHA1(b2b5d87f52693817fc747df087a4aa1ddcdb1f10))
1559
1560   ROM_REGION(0x4000,"maincpu",0)
1561   ROM_LOAD ( "a2c.128", 0x0000, 0x4000, CRC(f0edaa1b) SHA1(1a9b8aca5e32bb702ddb7791daddd60a89655729))
1562
1563   ROM_REGION( 0x800, "keyboard", ROMREGION_ERASE00 )
1564   ROM_LOAD( "342-0132-c.e12", 0x000, 0x800, CRC(e47045f4) SHA1(12a2e718f5f4acd69b6c33a45a4a940b1440a481) ) // 1983 US-Dvorak
1565ROM_END
1566
1567ROM_START(tk2000)
1568   ROM_REGION(0x2000,"gfx1",0)
1569   ROM_LOAD ( "341-0265-a.chr", 0x0000, 0x1000,CRC(2651014d) SHA1(b2b5d87f52693817fc747df087a4aa1ddcdb1f10))
1570   ROM_LOAD ( "341-0265-a.chr", 0x1000, 0x1000,CRC(2651014d) SHA1(b2b5d87f52693817fc747df087a4aa1ddcdb1f10))
1571
1572   ROM_REGION(0x4000,"maincpu",0)
1573   ROM_LOAD( "tk2000.rom",   0x000000, 0x004000, CRC(dfdbacc3) SHA1(bb37844c31616046630868a4399ee3d55d6df277) )
1574
1575   ROM_REGION( 0x800, "keyboard", ROMREGION_ERASE00 )
1576   ROM_LOAD( "342-0132-c.e12", 0x000, 0x800, BAD_DUMP CRC(e47045f4) SHA1(12a2e718f5f4acd69b6c33a45a4a940b1440a481) ) // probably not this machine's actual ROM
1577ROM_END
1578
1579// unlike the very unique TK2000, the TK3000 is a mostly stock enhanced IIe clone
1580ROM_START(tk3000)
1581   ROM_REGION(0x2000,"gfx1",0)
1582   ROM_LOAD( "tk3000.f7",    0x000000, 0x002000, CRC(70157693) SHA1(a7922e2137f95271011042441d80466fba7bb828) )
1583
1584   ROM_REGION(0x4000,"maincpu",0)
1585   ROM_LOAD( "tk3000.f4f6",  0x000000, 0x004000, CRC(5b1e8ab2) SHA1(f163e5753c18ff0e812a448e8da406f102600edf) )
1586
1587   ROM_REGION(0x2000, "kbdcpu", 0)
1588   ROM_LOAD( "tk3000.e13",   0x000000, 0x002000, CRC(f9b860d3) SHA1(6a127f1458f43a00199d3dde94569b8928f05a53) )
1589
1590   ROM_REGION(0x800, "keyboard", ROMREGION_ERASE00)
1591   ROM_LOAD( "342-0132-c.e12", 0x000, 0x800, BAD_DUMP CRC(e47045f4) SHA1(12a2e718f5f4acd69b6c33a45a4a940b1440a481) ) // probably not this machine's actual ROM
1592ROM_END
1593
1594ROM_START(prav8c)
1595   ROM_REGION(0x2000,"gfx1",0)
1596   ROM_LOAD ( "charrom.d20", 0x0000, 0x2000,CRC(935212cc) SHA1(934603a441c631bd841ea0d2ff39525474461e47))
1597   ROM_REGION(0x4000,"maincpu",0)
1598   ROM_LOAD ( "prom_cd.d46", 0x0000, 0x2000, CRC(195d0b48) SHA1(f8c4f3722159081f6950207f03bc85da30980c08))
1599   ROM_LOAD ( "prom_ef.d41", 0x2000, 0x2000, CRC(ec6aa2f6) SHA1(64bce893ebf0e22cd8f22436b97ef1bfeddf692f))
1600
1601   // contains slot firmware for slots 1, 2, and 6 (6 is the usual Disk II f/w)
1602   ROM_REGION(0x2000,"unknown",0)
1603   ROM_LOAD ( "eprom.d38", 0x0000, 0x2000, CRC(c8d00b19) SHA1(13d156957ea68d0e7bc4be57cb1580c8b1399981))
1604
1605   ROM_REGION( 0x800, "keyboard", ROMREGION_ERASE00 )
1606   ROM_LOAD( "342-0132-c.e12", 0x000, 0x800, BAD_DUMP CRC(e47045f4) SHA1(12a2e718f5f4acd69b6c33a45a4a940b1440a481) ) // we don't know what this machine used
1607ROM_END
1608
1609ROM_START(apple2c0)
1610   ROM_REGION(0x2000,"gfx1",0)
1611   ROM_LOAD ( "341-0265-a.chr", 0x0000, 0x1000,CRC(2651014d) SHA1(b2b5d87f52693817fc747df087a4aa1ddcdb1f10))
1612   ROM_LOAD ( "341-0265-a.chr", 0x1000, 0x1000,CRC(2651014d) SHA1(b2b5d87f52693817fc747df087a4aa1ddcdb1f10))
1613
1614   ROM_REGION(0x8000,"maincpu",0)
1615   ROM_LOAD("3420033a.256", 0x0000, 0x8000, CRC(c8b979b3) SHA1(10767e96cc17bad0970afda3a4146564e6272ba1))
1616
1617   ROM_REGION( 0x800, "keyboard", ROMREGION_ERASE00 )
1618   ROM_LOAD( "342-0132-c.e12", 0x000, 0x800, CRC(e47045f4) SHA1(12a2e718f5f4acd69b6c33a45a4a940b1440a481) ) // 1983 US-Dvorak
1619ROM_END
1620
1621ROM_START(apple2c3)
1622   ROM_REGION(0x2000,"gfx1",0)
1623   ROM_LOAD ( "341-0265-a.chr", 0x0000, 0x1000,CRC(2651014d) SHA1(b2b5d87f52693817fc747df087a4aa1ddcdb1f10))
1624   ROM_LOAD ( "341-0265-a.chr", 0x1000, 0x1000,CRC(2651014d) SHA1(b2b5d87f52693817fc747df087a4aa1ddcdb1f10))
1625
1626   ROM_REGION(0x8000,"maincpu",0)
1627   ROM_LOAD("342-0445-a.256", 0x0000, 0x8000, CRC(bc5a79ff) SHA1(5338d9baa7ae202457b6500fde5883dbdc86e5d3))
1628
1629   ROM_REGION( 0x800, "keyboard", ROMREGION_ERASE00 )
1630   ROM_LOAD( "342-0132-c.e12", 0x000, 0x800, CRC(e47045f4) SHA1(12a2e718f5f4acd69b6c33a45a4a940b1440a481) ) // 1983 US-Dvorak
1631ROM_END
1632
1633ROM_START(apple2c4)
1634   ROM_REGION(0x2000,"gfx1",0)
1635   ROM_LOAD ( "341-0265-a.chr", 0x0000, 0x1000,CRC(2651014d) SHA1(b2b5d87f52693817fc747df087a4aa1ddcdb1f10))
1636   ROM_LOAD ( "341-0265-a.chr", 0x1000, 0x1000,CRC(2651014d) SHA1(b2b5d87f52693817fc747df087a4aa1ddcdb1f10))
1637
1638   ROM_REGION(0x8000,"maincpu",0)
1639   ROM_LOAD("3410445b.256", 0x0000, 0x8000, CRC(06f53328) SHA1(015061597c4cda7755aeb88b735994ffd2f235ca))
1640
1641   ROM_REGION( 0x800, "keyboard", ROMREGION_ERASE00 )
1642   ROM_LOAD( "342-0132-c.e12", 0x000, 0x800, CRC(e47045f4) SHA1(12a2e718f5f4acd69b6c33a45a4a940b1440a481) ) // 1983 US-Dvorak
1643ROM_END
1644
1645ROM_START(laser128)
1646   ROM_REGION(0x2000,"gfx1",0)
1647   ROM_LOAD ( "341-0265-a.chr", 0x0000, 0x1000, BAD_DUMP CRC(2651014d) SHA1(b2b5d87f52693817fc747df087a4aa1ddcdb1f10)) // need to dump real laser rom
1648   ROM_LOAD ( "341-0265-a.chr", 0x1000, 0x1000, BAD_DUMP CRC(2651014d) SHA1(b2b5d87f52693817fc747df087a4aa1ddcdb1f10)) // need to dump real laser rom
1649
1650   ROM_REGION(0x8000,"maincpu",0)
1651   ROM_LOAD("laser128.256", 0x0000, 0x8000, CRC(39E59ED3) SHA1(CBD2F45C923725BFD57F8548E65CC80B13BC18DA))
1652
1653   ROM_REGION( 0x800, "keyboard", ROMREGION_ERASE00 )
1654   ROM_LOAD( "342-0132-c.e12", 0x000, 0x800, BAD_DUMP CRC(e47045f4) SHA1(12a2e718f5f4acd69b6c33a45a4a940b1440a481) ) // need to dump real laser rom
1655ROM_END
1656
1657ROM_START(las128ex)
1658   ROM_REGION(0x2000,"gfx1",0)
1659   ROM_LOAD ( "341-0265-a.chr", 0x0000, 0x1000, BAD_DUMP CRC(2651014d) SHA1(b2b5d87f52693817fc747df087a4aa1ddcdb1f10)) // need to dump real laser rom
1660   ROM_LOAD ( "341-0265-a.chr", 0x1000, 0x1000, BAD_DUMP CRC(2651014d) SHA1(b2b5d87f52693817fc747df087a4aa1ddcdb1f10)) // need to dump real laser rom
1661
1662   ROM_REGION(0x8000,"maincpu",0)
1663   ROM_LOAD("las128ex.256", 0x0000, 0x8000, CRC(B67C8BA1) SHA1(8BD5F82A501B1CF9D988C7207DA81E514CA254B0))
1664
1665   ROM_REGION( 0x800, "keyboard", ROMREGION_ERASE00 )
1666   ROM_LOAD( "342-0132-c.e12", 0x000, 0x800, BAD_DUMP CRC(e47045f4) SHA1(12a2e718f5f4acd69b6c33a45a4a940b1440a481) ) // need to dump real laser rom
1667ROM_END
1668
1669ROM_START(las128e2)
1670   ROM_REGION(0x2000,"gfx1",0)
1671   ROM_LOAD ( "341-0265-a.chr", 0x0000, 0x1000, BAD_DUMP CRC(2651014d) SHA1(b2b5d87f52693817fc747df087a4aa1ddcdb1f10)) // need to dump real laser rom
1672   ROM_LOAD ( "341-0265-a.chr", 0x1000, 0x1000, BAD_DUMP CRC(2651014d) SHA1(b2b5d87f52693817fc747df087a4aa1ddcdb1f10)) // need to dump real laser rom
1673
1674   ROM_REGION(0x8000,"maincpu",0)
1675   ROM_LOAD( "laser 128ex2 rom version 6.1.bin", 0x000000, 0x008000, CRC(7f911c90) SHA1(125754c1bd777d4c510f5239b96178c6f2e3236b) )
1676
1677   ROM_REGION( 0x800, "keyboard", ROMREGION_ERASE00 )
1678   ROM_LOAD( "342-0132-c.e12", 0x000, 0x800, BAD_DUMP CRC(e47045f4) SHA1(12a2e718f5f4acd69b6c33a45a4a940b1440a481) ) // need to dump real laser rom
1679ROM_END
1680
1681#if 0
1682ROM_START(las128e2)
1683   ROM_REGION(0x2000,"gfx1",0)
1684   ROM_LOAD ( "341-0265-a.chr", 0x0000, 0x1000, BAD_DUMP CRC(2651014d) SHA1(b2b5d87f52693817fc747df087a4aa1ddcdb1f10)) // need to dump real laser rom
1685   ROM_LOAD ( "341-0265-a.chr", 0x1000, 0x1000, BAD_DUMP CRC(2651014d) SHA1(b2b5d87f52693817fc747df087a4aa1ddcdb1f10)) // need to dump real laser rom
1686
1687   ROM_REGION(0x8700,"maincpu",0)
1688   ROM_LOAD( "laser 128ex2 v6.1 rom.bin", 0x000000, 0x008000, CRC(7f911c90) SHA1(125754c1bd777d4c510f5239b96178c6f2e3236b) )
1689
1690   ROM_REGION( 0x800, "keyboard", ROMREGION_ERASE00 )
1691   ROM_LOAD( "342-0132-c.e12", 0x000, 0x800, BAD_DUMP CRC(e47045f4) SHA1(12a2e718f5f4acd69b6c33a45a4a940b1440a481) ) // need to dump real laser rom
1692ROM_END
1693#endif
1694
1695ROM_START(apple2cp)
1696   ROM_REGION(0x2000,"gfx1",0)
1697   ROM_LOAD ( "341-0265-a.chr", 0x0000, 0x1000,CRC(2651014d) SHA1(b2b5d87f52693817fc747df087a4aa1ddcdb1f10))
1698   ROM_LOAD ( "341-0265-a.chr", 0x1000, 0x1000,CRC(2651014d) SHA1(b2b5d87f52693817fc747df087a4aa1ddcdb1f10))
1699
1700   ROM_REGION(0x8000,"maincpu",0)
1701   ROM_LOAD("341-0625-a.256", 0x0000, 0x8000, CRC(0b996420) SHA1(1a27ae26966bbafd825d08ad1a24742d3e33557c))
1702
1703   ROM_REGION( 0x800, "keyboard", ROMREGION_ERASE00 )
1704   ROM_LOAD( "341-0132-d.e12", 0x000, 0x800, CRC(c506efb9) SHA1(8e14e85c645187504ec9d162b3ea614a0c421d32) )
1705ROM_END
1706
17071477ROM_START(ivelultr)
17081478   ROM_REGION(0x2000,"gfx1",0)
17091479   ROM_LOAD( "ultra.chr", 0x0000, 0x1000,CRC(fed62c85) SHA1(479fb3f38a3f7332cef2e8c4856871afe8dc6017))
r241923r241924
17181488   ROM_LOAD( "ultra4.bin", 0x0000, 0x0800, CRC(3dce51ac) SHA1(676b6e775d5159049cae5b6143398ec7b2bf437a) )
17191489ROM_END
17201490
1721ROM_START(space84)
1722   ROM_REGION(0x2000,"gfx1",0)
1723   ROM_LOAD( "space 84 mobo chargen.bin", 0x0000, 0x2000, CRC(ceb98990) SHA1(8b2758da611bcfdd3d144edabc63ef1df2ca787b) )
1724
1725   ROM_REGION(0x4000,"maincpu",0)
1726   ROM_LOAD ( "341-0011.d0",  0x1000, 0x0800, CRC(6f05f949) SHA1(0287ebcef2c1ce11dc71be15a99d2d7e0e128b1e))
1727   ROM_LOAD ( "341-0012.d8",  0x1800, 0x0800, CRC(1f08087c) SHA1(a75ce5aab6401355bf1ab01b04e4946a424879b5))
1728   ROM_LOAD ( "341-0013.e0",  0x2000, 0x0800, CRC(2b8d9a89) SHA1(8d82a1da63224859bd619005fab62c4714b25dd7))
1729   ROM_LOAD ( "341-0014.e8",  0x2800, 0x0800, CRC(5719871a) SHA1(37501be96d36d041667c15d63e0c1eff2f7dd4e9))
1730   ROM_LOAD( "space84_f.bin", 0x3000, 0x1000, CRC(4e741069) SHA1(ca1f16da9fb40e966ee4a899964cd6a7e140ab50))
1731ROM_END
1732
1733ROM_START(am64)
1734   ROM_REGION(0x2000,"gfx1",0)
1735   ROM_LOAD( "gm-2716.bin",  0x0000, 0x0800, CRC(863e657f) SHA1(cc954204c503bc545ec0d08862483aaad83805d5) )
1736
1737   ROM_REGION(0x4000,"maincpu",0)
1738   ROM_LOAD( "am64-27128.bin", 0x0000, 0x4000, CRC(f25cdc7b) SHA1(235e72b77695938a9df8781f5bea3cbbbe1f4c76) )
1739
1740   ROM_REGION(0x2000, "spares", 0)
1741   // parallel card ROM
1742   ROM_LOAD( "ap-2716.bin",  0x0000, 0x0800, CRC(c6990f08) SHA1(e7daf63639234e46738a4d78a49287d11ccaf537) )
1743   // i8048 keyboard MCU ROM
1744   ROM_LOAD( "tk10.bin",     0x0800, 0x0800, CRC(a06c5b78) SHA1(27c5160b913e0f62120f384026d24b9f1acb6970) )
1745ROM_END
1746
17471491#if 0
17481492ROM_START(laba2p) /* II Plus clone with on-board Disk II controller and Videx-compatible 80-column card, supposedly from lab equipment */
17491493   ROM_REGION(0x1000,"gfx1",0)
r241923r241924
17681512#endif
17691513
17701514/*    YEAR  NAME      PARENT    COMPAT    MACHINE      INPUT     INIT      COMPANY            FULLNAME */
1771COMP( 1977, apple2,   0,        0,        apple2,      apple2, driver_device,   0,        "Apple Computer",    "Apple ][", GAME_SUPPORTS_SAVE )
1515COMP( 1977, apple2,   0,        0,        apple2,      apple2, driver_device,   0,        "Apple Computer",    "Apple ][", GAME_SUPPORTS_SAVE )
17721516COMP( 1979, apple2p,  apple2,   0,        apple2p,     apple2p, driver_device,  0,        "Apple Computer",    "Apple ][+", GAME_SUPPORTS_SAVE )
1773COMP( 1982, prav82,   apple2,   0,        apple2p,     apple2p, driver_device,  0,        "Pravetz",           "Pravetz 82", GAME_SUPPORTS_SAVE )
1774COMP( 1985, prav8m,   apple2,   0,        apple2p,     apple2p, driver_device,  0,        "Pravetz",           "Pravetz 8M", GAME_SUPPORTS_SAVE )
17751517COMP( 1980, apple2jp, apple2,   0,        apple2p,     apple2p, driver_device,  0,        "Apple Computer",    "Apple ][ J-Plus", GAME_SUPPORTS_SAVE )
1776COMP( 1982, ace100,   apple2,   0,        apple2,      apple2e, driver_device,  0,        "Franklin Computer", "Franklin Ace 100", GAME_SUPPORTS_SAVE )
1777COMP( 1983, apple2e,  0,        apple2,   apple2e,     apple2e, driver_device,  0,        "Apple Computer",    "Apple //e", GAME_SUPPORTS_SAVE )
1778COMP( 1983, apple2euk,apple2e,  0,        apple2e,     apple2euk,driver_device, 0,        "Apple Computer",    "Apple //e (UK)", GAME_SUPPORTS_SAVE )
1779COMP( 1983, mprof3,   apple2e,  0,        mprof3,      apple2e, driver_device,  0,        "Multitech",         "Microprofessor III", GAME_SUPPORTS_SAVE )
1780COMP( 1985, apple2ee, apple2e,  0,        apple2ee,    apple2e, driver_device,  0,        "Apple Computer",    "Apple //e (enhanced)", GAME_SUPPORTS_SAVE )
1781COMP( 1985, apple2eeuk,apple2e, 0,        apple2ee,    apple2euk, driver_device,0,        "Apple Computer",    "Apple //e (enhanced, UK)", GAME_SUPPORTS_SAVE )
1782COMP( 1987, apple2ep, apple2e,  0,        apple2ep,    apple2ep, driver_device, 0,        "Apple Computer",    "Apple //e (Platinum)", GAME_SUPPORTS_SAVE )
1783COMP( 1984, apple2c,  0,        apple2,   apple2c,     apple2e, driver_device,  0,        "Apple Computer",    "Apple //c" , GAME_SUPPORTS_SAVE )
1784COMP( 1984, tk2000,   apple2c,  0,        tk2000,      apple2e, driver_device,  0,        "Microdigital",      "TK2000" , GAME_NOT_WORKING | GAME_SUPPORTS_SAVE )
1785COMP( 1986, tk3000,   apple2c,  0,        tk3000,      apple2e, driver_device,  0,        "Microdigital",      "TK3000//e" , GAME_SUPPORTS_SAVE )
1786COMP( 1989, prav8c,   apple2c,  0,        apple2c,     apple2e, driver_device,  0,        "Pravetz",           "Pravetz 8C", GAME_NOT_WORKING | GAME_SUPPORTS_SAVE )
1787COMP( 1987, laser128, apple2c,  0,        laser128,    apple2e, driver_device,  0,        "Video Technology",  "Laser 128 (version 4.2)", GAME_SUPPORTS_SAVE )
1788COMP( 1988, las128ex, apple2c,  0,        laser128,    apple2e, driver_device,  0,        "Video Technology",  "Laser 128ex (version 4.5)", GAME_SUPPORTS_SAVE )
1789COMP( 1988, las128e2, apple2c,  0,        laser128ex2, apple2e, driver_device,  0,        "Video Technology",  "Laser 128ex2 (version 6.1)", GAME_SUPPORTS_SAVE )
1790COMP( 1985, apple2c0, apple2c,  0,        apple2c_iwm, apple2e, driver_device,  0,        "Apple Computer",    "Apple //c (UniDisk 3.5)", GAME_SUPPORTS_SAVE )
1791COMP( 1986, apple2c3, apple2c,  0,        apple2c_iwm, apple2e, driver_device,  0,        "Apple Computer",    "Apple //c (Original Memory Expansion)", GAME_SUPPORTS_SAVE )
1792COMP( 1986, apple2c4, apple2c,  0,        apple2c_iwm, apple2e, driver_device,  0,        "Apple Computer",    "Apple //c (rev 4)", GAME_SUPPORTS_SAVE )
1793COMP( 1988, apple2cp, apple2c,  0,        apple2cp,    apple2e, driver_device,  0,        "Apple Computer",    "Apple //c Plus", GAME_NOT_WORKING | GAME_SUPPORTS_SAVE )
1794COMP( 1984, ivelultr, apple2,   0,        apple2p,     apple2p, driver_device,  0,        "Ivasim",            "Ivel Ultra", GAME_SUPPORTS_SAVE )
1518COMP( 1982, prav82,   apple2,   0,        apple2p,     apple2p, driver_device,  0,        "Pravetz",           "Pravetz 82", GAME_SUPPORTS_SAVE )
1519COMP( 1982, ace100,   apple2,   0,        apple2,      apple2p, driver_device,  0,        "Franklin Computer", "Franklin Ace 100", GAME_SUPPORTS_SAVE )
17951520COMP( 1983, agat7,    apple2,   0,        apple2p,     apple2p, driver_device,  0,        "Agat",              "Agat-7", GAME_NOT_WORKING) // disk controller ROM JSRs to $FCA8 which is a delay on apple II, illegal instruction crash here :(
1521// reverse font direction -\/
1522COMP( 1984, ivelultr, apple2,   0,        apple2p,     apple2p, driver_device,  0,        "Ivasim",            "Ivel Ultra", GAME_SUPPORTS_SAVE )
17961523COMP( 1984, agat9,    apple2,   0,        apple2p,     apple2p, driver_device,  0,        "Agat",              "Agat-9", GAME_NOT_WORKING)
1524COMP( 1985, prav8m,   apple2,   0,        apple2p,     apple2p, driver_device,  0,        "Pravetz",           "Pravetz 8M", GAME_SUPPORTS_SAVE )
17971525COMP( 1985, space84,  apple2,   0,        space84,     apple2p, driver_device,  0,        "ComputerTechnik/IBS",  "Space 84",   GAME_NOT_WORKING )
17981526COMP( 1985, am64,     apple2,   0,        space84,     apple2p, driver_device,  0,        "ASEM",              "AM 64", GAME_SUPPORTS_SAVE )
17991527//COMP( 19??, laba2p,   apple2,   0,        laba2p,      apple2p, driver_device,  0,        "<unknown>",         "Lab equipment Apple II Plus clone", GAME_SUPPORTS_SAVE )
trunk/src/mess/drivers/apple2e.c
r0r241924
1// license:BSD-3-Clause
2// copyright-holders:R. Belmont
3/***************************************************************************
4
5    apple2e.c - Apple IIe/IIc/IIc Plus and clones
6
7    Next generation driver written in September/October 2014 by R. Belmont.
8    Thanks to the original Apple II series driver's authors: Mike Balfour, Nathan Woods, and R. Belmont
9    Special thanks to the Apple II Documentation Project/Antoine Vignau and Peter Ferrie.
10 
11 
12    IIe: base of this driver.  64K RAM, slot 0 language card emulation without the double-read requirement,
13         lowercase and SHIFT key on button 2, Open and Solid Apple buttons on joy buttons 0 and 1,
14         auxiliary slot, built-in 80 column support if extra RAM added.
15 
16       Physical slot 0 was eliminated thanks to the built-in language card.
17 
18       Most of the write-only softswitches gained readback locations, necessary to make interrupt-driven
19       software possible.
20 
21       Base 80-column card: 1K RAM, allows 80 columns and double-lo-res,
22       no double-hi-res.
23 
24       Extended 80-column card: 64K RAM (including a second language card),
25       allows 80 columns, double-lo-res, and double-hi-res.
26 
27       Revision A motherboards (very rare) don't support double-hi-res; it's unclear
28       if double-lo-res works or not.  We emulate the much more common Rev B or later
29       board.
30 
31   IIe enhanced: 65C02 CPU with more instructions, MouseText in the character generator.
32 
33   IIe platinum: Like enhanced but with added numeric keypad and extended 80-column card
34       included in the box.  Keypad CLEAR generates ESC by default, one hardware mod
35       made it generate CTRL-X instead.  (new keyboard encoder ROM?)
36 
37   NOTE: On real IIe and IIe enhanced h/w, pressing SHIFT and paddle button 2 will
38   short out the power supply and cause a safety shutdown.  (We don't emulate
39   this "feature", and it was relatively rare in real life as Apple joysticks only
40   had buttons 0 and 1 normally).
41 
42   IIc: IIe enhanced shrunken into a pizzabox with a Disk II compatible
43       half-height drive included in the case.
44   
45    No slots, but included functionality equivalent to the following slots
46    on the motherboard:
47     - 2 Super Serial Cards (modem and printer ports)
48     - extended 80 column card / 128K RAM
49     - Disk II IWM controller
50     - Apple II Mouse card (firmware entry points are compatible,
51       but the hardware implementation omits the 68705 and is quite different!)
52 
53     Has a 40/80 column switch and a QWERTY/DVORAK switch.
54 
55   IIc (UniDisk 3.5): IIc with ROM doubled to 32K and the ROMSWITCH register
56       added to page between the original 16K ROM and the new added 16K.  The
57       extra firmware space was dedicated to implementing the Protocol Converter,
58       later renamed "SmartPort", which communicates with "smart" packet devices
59       over the IWM bus.
60 
61       Partial AppleTalk code also exists in this ROM but it doesn't work and
62       was not completed.
63 
64   IIc (Original Memory Expansion):
65       Removes AppleTalk and adds support for a memory expansion card with up
66       to 1 MB; this is identical both in hardware and firmware to the "Slinky"
67       memory expansion card for the Apple IIe (a2bus/a2memexp.c).
68
69   IIc (Revised Memory Expansion, Rev. 3):
70      Fixes several nasty bugs in the Original Memory Expansion version.  Not
71      currently dumped.
72 
73   IIc (Rev 4):
74      Fixes memory size detection for memory cards with less than 1MB.  Fixes
75      several screen hole errors introduced in Rev 3, and fixes Terminal Mode
76      wherein the firmware can be put into a built-in terminal mode for simple
77      tests with a modem.
78 
79   IIc Plus:
80      Like IIc with memory expansion, but with licensed built-in Zip Chip which
81      runs the 65C02 at 4 MHz turbo speed with a small cache RAM.
82
83      The machine has an internal "Apple 3.5" drive plus a custom gate array
84      which emulates the functionality of the UniDisk 3.5's on-board 65C02. 
85      This gets around the fact that 1 MHz isn't sufficient to handle direct
86      Woz-style control of a double-density 3.5" drive.
87
88      External drive port allows IIgs-style daisy-chaining.
89
90----------------------------------
91
92TK3000 keyboard matrix
93
94Data bus D0-D7 is X0-X7
95Address bus A0-A11 is Y0-Y11
96
97***************************************************************************/
98
99#include "emu.h"
100#include "machine/bankdev.h"
101#include "machine/ram.h"
102#include "machine/kb3600.h"
103#include "sound/speaker.h"
104#include "imagedev/flopdrv.h"
105#include "imagedev/cassette.h"
106#include "formats/ap2_dsk.h"
107#include "cpu/m6502/m6502.h"
108#include "cpu/m6502/m65c02.h"
109#include "cpu/z80/z80.h"
110#include "formats/ap_dsk35.h"
111#include "machine/sonydriv.h"
112#include "machine/appldriv.h"
113#include "bus/rs232/rs232.h"
114#include "machine/mos6551.h"
115#include "video/apple2.h"
116
117#include "bus/a2bus/a2bus.h"
118#include "bus/a2bus/a2lang.h"
119#include "bus/a2bus/a2diskii.h"
120#include "bus/a2bus/a2diskiing.h"
121#include "bus/a2bus/a2mockingboard.h"
122#include "bus/a2bus/a2cffa.h"
123#include "bus/a2bus/a2memexp.h"
124#include "bus/a2bus/a2scsi.h"
125#include "bus/a2bus/a2thunderclock.h"
126#include "bus/a2bus/a2softcard.h"
127#include "bus/a2bus/a2videoterm.h"
128#include "bus/a2bus/a2ssc.h"
129#include "bus/a2bus/a2swyft.h"
130#include "bus/a2bus/a2themill.h"
131#include "bus/a2bus/a2sam.h"
132#include "bus/a2bus/a2alfam2.h"
133#include "bus/a2bus/laser128.h"
134#include "bus/a2bus/a2echoii.h"
135#include "bus/a2bus/a2arcadebd.h"
136#include "bus/a2bus/a2midi.h"
137#include "bus/a2bus/a2zipdrive.h"
138#include "bus/a2bus/a2applicard.h"
139#include "bus/a2bus/a2ultraterm.h"
140#include "bus/a2bus/a2pic.h"
141#include "bus/a2bus/a2corvus.h"
142#include "bus/a2bus/a2mcms.h"
143#include "bus/a2bus/a2dx1.h"
144#include "bus/a2bus/timemasterho.h"
145#include "bus/a2bus/mouse.h"
146#include "bus/a2bus/a2eauxslot.h"
147#include "bus/a2bus/a2estd80col.h"
148#include "bus/a2bus/a2eext80col.h"
149#include "bus/a2bus/a2eramworks3.h"
150
151#define A2_CPU_TAG "maincpu"
152#define A2_KBDC_TAG "ay3600"
153#define A2_BUS_TAG "a2bus"
154#define A2_SPEAKER_TAG "speaker"
155#define A2_CASSETTE_TAG "tape"
156#define A2_UPPERBANK_TAG "inhbank"
157#define IIC_ACIA1_TAG "acia1"
158#define IIC_ACIA2_TAG "acia2"
159#define IICP_IWM_TAG    "iwm"
160#define LASER128_UDC_TAG "l128udc"
161#define PRINTER_PORT_TAG "printer"
162#define MODEM_PORT_TAG "modem"
163#define A2_AUXSLOT_TAG "auxbus"
164#define A2_VIDEO_TAG "a2video"
165
166#define A2_0000_TAG   "r00bank"
167#define A2_0200_TAG   "r02bank"
168#define A2_0400_TAG   "r04bank"
169#define A2_0800_TAG   "r08bank"
170#define A2_2000_TAG   "r20bank"
171#define A2_4000_TAG   "r40bank"
172#define A2_C100_TAG   "c1bank"
173#define A2_C300_TAG   "c3bank"
174#define A2_C400_TAG   "c4bank"
175#define A2_C800_TAG   "c8bank"
176#define A2_LCBANK_TAG "lcbank"
177
178#define MOUSE_BUTTON_TAG    "mse_button"
179#define MOUSE_XAXIS_TAG     "mse_x"
180#define MOUSE_YAXIS_TAG     "mse_y"
181
182#define CNXX_UNCLAIMED    -1
183#define CNXX_INTROM    -2
184
185#define IRQ_SLOT 0
186#define IRQ_VBL    1
187#define IRQ_MOUSEXY 2
188
189class apple2e_state : public driver_device
190{
191public:
192   apple2e_state(const machine_config &mconfig, device_type type, const char *tag)
193      : driver_device(mconfig, type, tag),
194      m_maincpu(*this, A2_CPU_TAG),
195      m_ram(*this, RAM_TAG),
196      m_rom(*this, "maincpu"),
197      m_ay3600(*this, A2_KBDC_TAG),
198      m_video(*this, A2_VIDEO_TAG),
199      m_a2bus(*this, A2_BUS_TAG),
200      m_a2eauxslot(*this, A2_AUXSLOT_TAG),
201      m_joy1x(*this, "joystick_1_x"),
202      m_joy1y(*this, "joystick_1_y"),
203      m_joy2x(*this, "joystick_2_x"),
204      m_joy2y(*this, "joystick_2_y"),
205      m_joybuttons(*this, "joystick_buttons"),
206      m_mouseb(*this, MOUSE_BUTTON_TAG),
207      m_mousex(*this, MOUSE_XAXIS_TAG),
208      m_mousey(*this, MOUSE_YAXIS_TAG),
209      m_kbdrom(*this, "keyboard"),
210      m_kbspecial(*this, "keyb_special"),
211      m_sysconfig(*this, "a2_config"),
212      m_speaker(*this, A2_SPEAKER_TAG),
213      m_cassette(*this, A2_CASSETTE_TAG),
214      m_upperbank(*this, A2_UPPERBANK_TAG),
215      m_0000bank(*this, A2_0000_TAG),
216      m_0200bank(*this, A2_0200_TAG),
217      m_0400bank(*this, A2_0400_TAG),
218      m_0800bank(*this, A2_0800_TAG),
219      m_2000bank(*this, A2_2000_TAG),
220      m_4000bank(*this, A2_4000_TAG),
221      m_c100bank(*this, A2_C100_TAG),
222      m_c300bank(*this, A2_C300_TAG),
223      m_c400bank(*this, A2_C400_TAG),
224      m_c800bank(*this, A2_C800_TAG),
225      m_lcbank(*this, A2_LCBANK_TAG),
226      m_acia1(*this, IIC_ACIA1_TAG),
227      m_acia2(*this, IIC_ACIA2_TAG),
228      m_laserudc(*this, LASER128_UDC_TAG),
229      m_iicpiwm(*this, IICP_IWM_TAG)
230   { }
231
232   required_device<cpu_device> m_maincpu;
233   required_device<ram_device> m_ram;
234   required_memory_region m_rom;
235   required_device<ay3600_device> m_ay3600;
236   required_device<a2_video_device> m_video;
237   required_device<a2bus_device> m_a2bus;
238   optional_device<a2eauxslot_device> m_a2eauxslot;
239   required_ioport m_joy1x, m_joy1y, m_joy2x, m_joy2y, m_joybuttons;
240   optional_ioport m_mouseb, m_mousex, m_mousey;
241   optional_memory_region m_kbdrom;
242   required_ioport m_kbspecial;
243   required_ioport m_sysconfig;
244   required_device<speaker_sound_device> m_speaker;
245   optional_device<cassette_image_device> m_cassette;
246   required_device<address_map_bank_device> m_upperbank;
247   required_device<address_map_bank_device> m_0000bank;
248   required_device<address_map_bank_device> m_0200bank;
249   required_device<address_map_bank_device> m_0400bank;
250   required_device<address_map_bank_device> m_0800bank;
251   required_device<address_map_bank_device> m_2000bank;
252   required_device<address_map_bank_device> m_4000bank;
253   required_device<address_map_bank_device> m_c100bank;
254   required_device<address_map_bank_device> m_c300bank;
255   required_device<address_map_bank_device> m_c400bank;
256   required_device<address_map_bank_device> m_c800bank;
257   required_device<address_map_bank_device> m_lcbank;
258   optional_device<mos6551_device> m_acia1, m_acia2;
259   optional_device<applefdc_base_device> m_laserudc;
260   optional_device<iwm_device> m_iicpiwm;
261
262   TIMER_DEVICE_CALLBACK_MEMBER(apple2_interrupt);
263   TIMER_DEVICE_CALLBACK_MEMBER(ay3600_repeat);
264
265   virtual void machine_start();
266   virtual void machine_reset();
267
268   DECLARE_PALETTE_INIT(apple2);
269   UINT32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
270
271   DECLARE_READ8_MEMBER(ram0000_r);
272   DECLARE_WRITE8_MEMBER(ram0000_w);
273   DECLARE_READ8_MEMBER(ram0200_r);
274   DECLARE_WRITE8_MEMBER(ram0200_w);
275   DECLARE_READ8_MEMBER(ram0400_r);
276   DECLARE_WRITE8_MEMBER(ram0400_w);
277   DECLARE_READ8_MEMBER(ram0800_r);
278   DECLARE_WRITE8_MEMBER(ram0800_w);
279   DECLARE_READ8_MEMBER(ram2000_r);
280   DECLARE_WRITE8_MEMBER(ram2000_w);
281   DECLARE_READ8_MEMBER(ram4000_r);
282   DECLARE_WRITE8_MEMBER(ram4000_w);
283   DECLARE_READ8_MEMBER(auxram0000_r);
284   DECLARE_WRITE8_MEMBER(auxram0000_w);
285   DECLARE_READ8_MEMBER(auxram0200_r);
286   DECLARE_WRITE8_MEMBER(auxram0200_w);
287   DECLARE_READ8_MEMBER(auxram0400_r);
288   DECLARE_WRITE8_MEMBER(auxram0400_w);
289   DECLARE_READ8_MEMBER(auxram0800_r);
290   DECLARE_WRITE8_MEMBER(auxram0800_w);
291   DECLARE_READ8_MEMBER(auxram2000_r);
292   DECLARE_WRITE8_MEMBER(auxram2000_w);
293   DECLARE_READ8_MEMBER(auxram4000_r);
294   DECLARE_WRITE8_MEMBER(auxram4000_w);
295   DECLARE_READ8_MEMBER(c000_r);
296   DECLARE_WRITE8_MEMBER(c000_w);
297   DECLARE_READ8_MEMBER(c000_iic_r);
298   DECLARE_WRITE8_MEMBER(c000_iic_w);
299   DECLARE_READ8_MEMBER(c080_r);
300   DECLARE_WRITE8_MEMBER(c080_w);
301   DECLARE_READ8_MEMBER(c100_r);
302   DECLARE_READ8_MEMBER(c100_int_r);
303   DECLARE_READ8_MEMBER(c100_int_bank_r);
304   DECLARE_WRITE8_MEMBER(c100_w);
305   DECLARE_READ8_MEMBER(c300_r);
306   DECLARE_READ8_MEMBER(c300_int_r);
307   DECLARE_READ8_MEMBER(c300_int_bank_r);
308   DECLARE_WRITE8_MEMBER(c300_w);
309   DECLARE_READ8_MEMBER(c400_r);
310   DECLARE_READ8_MEMBER(c400_int_r);
311   DECLARE_READ8_MEMBER(c400_int_bank_r);
312   DECLARE_WRITE8_MEMBER(c400_w);
313   DECLARE_READ8_MEMBER(c800_r);
314   DECLARE_WRITE8_MEMBER(c800_w);
315   DECLARE_READ8_MEMBER(inh_r);
316   DECLARE_WRITE8_MEMBER(inh_w);
317   DECLARE_READ8_MEMBER(lc_r);
318   DECLARE_WRITE8_MEMBER(lc_w);
319   DECLARE_WRITE_LINE_MEMBER(a2bus_irq_w);
320   DECLARE_WRITE_LINE_MEMBER(a2bus_nmi_w);
321   DECLARE_WRITE_LINE_MEMBER(a2bus_inh_w);
322   DECLARE_READ_LINE_MEMBER(ay3600_shift_r);
323   DECLARE_READ_LINE_MEMBER(ay3600_control_r);
324   DECLARE_WRITE_LINE_MEMBER(ay3600_data_ready_w);
325   DECLARE_WRITE_LINE_MEMBER(ay3600_ako_w);
326   DECLARE_READ8_MEMBER(memexp_r);
327   DECLARE_WRITE8_MEMBER(memexp_w);
328
329private:
330   int m_speaker_state;
331   int m_cassette_state, m_cassette_out;
332
333   double m_joystick_x1_time;
334   double m_joystick_y1_time;
335   double m_joystick_x2_time;
336   double m_joystick_y2_time;
337
338   UINT16 m_lastchar, m_strobe;
339   UINT8 m_transchar;
340   bool m_anykeydown;
341   int m_repeatdelay;
342
343   int m_inh_slot;
344   int m_cnxx_slot;
345
346   bool m_page2;
347   bool m_an0, m_an1, m_an2, m_an3;
348
349   bool m_vbl, m_vblmask;
350
351   bool m_xy, m_x0edge, m_y0edge;
352   bool m_x0, m_x1, m_y0, m_y1;
353   bool m_xirq, m_yirq;
354   int last_mx, last_my, count_x, count_y;
355
356   bool m_intcxrom;
357   bool m_80store;
358   bool m_slotc3rom;
359   bool m_altzp;
360   bool m_ramrd, m_ramwrt;
361   bool m_lcram, m_lcram2, m_lcwriteenable;
362   bool m_ioudis;
363   bool m_romswitch;
364
365   bool m_isiic, m_isiicplus;
366   UINT8 m_iicplus_ce00[0x200];
367
368   UINT8 *m_ram_ptr, *m_rom_ptr;
369   int m_ram_size;
370
371   UINT8 *m_aux_ptr, *m_aux_bank_ptr;
372
373   int m_inh_bank;
374
375   double m_x_calibration, m_y_calibration;
376
377   device_a2bus_card_interface *m_slotdevice[8];
378   device_a2eauxslot_card_interface *m_auxslotdevice;
379
380   int m_irqmask;
381
382   UINT8 m_exp_bankhior;
383   int m_exp_addrmask;
384   UINT8 m_exp_regs[0x10];
385   UINT8 *m_exp_ram;
386   int m_exp_wptr, m_exp_liveptr;
387
388   void do_io(address_space &space, int offset, bool is_iic);
389   UINT8 read_floatingbus();
390   void update_slotrom_banks();
391   void lc_update(int offset);
392   UINT8 read_slot_rom(address_space &space, int slotbias, int offset);
393   void write_slot_rom(address_space &space, int slotbias, int offset, UINT8 data);
394   UINT8 read_int_rom(address_space &space, int slotbias, int offset);
395   void auxbank_update();
396   void raise_irq(int irq);
397   void lower_irq(int irq);
398   void update_iic_mouse();
399};
400
401/***************************************************************************
402    PARAMETERS
403***************************************************************************/
404
405#define JOYSTICK_DELTA          80
406#define JOYSTICK_SENSITIVITY    50
407#define JOYSTICK_AUTOCENTER     80
408
409WRITE_LINE_MEMBER(apple2e_state::a2bus_irq_w)
410{
411   if (state == ASSERT_LINE)
412   {
413      raise_irq(IRQ_SLOT);
414   }
415   else
416   {
417      lower_irq(IRQ_SLOT);
418   }
419}
420
421WRITE_LINE_MEMBER(apple2e_state::a2bus_nmi_w)
422{
423   m_maincpu->set_input_line(INPUT_LINE_NMI, state);
424}
425
426// TODO: this assumes /INH only on ROM, needs expansion to support e.g. phantom-slotting cards and etc.
427WRITE_LINE_MEMBER(apple2e_state::a2bus_inh_w)
428{
429   if (state == ASSERT_LINE)
430   {
431      // assume no cards are pulling /INH
432      m_inh_slot = -1;
433                           
434      // scan the slots to figure out which card(s) are INHibiting stuff
435      for (int i = 0; i <= 7; i++)
436      {
437         if (m_slotdevice[i])
438         {
439            // this driver only can inhibit from 0xd000-0xffff
440            if ((m_slotdevice[i]->inh_start() == 0xd000) &&
441               (m_slotdevice[i]->inh_end() == 0xffff))
442            {
443               if ((m_slotdevice[i]->inh_type() & INH_READ) == INH_READ)
444               {
445                  if (m_inh_bank != 1)
446                  {
447                     m_upperbank->set_bank(1);
448                     m_inh_bank = 1;
449                  }
450               }
451               else
452               {
453                  if (m_inh_bank != 0)
454                  {
455                     m_upperbank->set_bank(0);
456                     m_inh_bank = 0;
457                  }
458               }
459
460               m_inh_slot = i;
461               break;
462            }
463         }
464      }
465
466      // if no slots are inhibiting, make sure ROM is fully switched in
467      if ((m_inh_slot == -1) && (m_inh_bank != 0))
468      {
469         m_upperbank->set_bank(0);
470         m_inh_bank = 0;
471      }
472   }
473}
474
475READ8_MEMBER(apple2e_state::memexp_r)
476{
477   UINT8 retval = m_exp_regs[offset];
478
479   if (offset == 3)
480   {
481      if (m_exp_liveptr <= m_exp_addrmask)
482      {
483         retval = m_exp_ram[m_exp_liveptr];
484      }
485      else
486      {
487         retval = 0xff;
488      }
489      m_exp_liveptr++;
490      m_exp_regs[0] = m_exp_liveptr & 0xff;
491      m_exp_regs[1] = (m_exp_liveptr>>8) & 0xff;
492      m_exp_regs[2] = ((m_exp_liveptr>>16) & 0xff) | m_exp_bankhior;
493   }
494
495   return retval;
496}
497
498WRITE8_MEMBER(apple2e_state::memexp_w)
499{
500   switch (offset & 0xf)
501   {
502      case 0:
503         m_exp_wptr &= ~0xff;
504         m_exp_wptr |= data;
505         m_exp_regs[0] = m_exp_wptr & 0xff;
506         m_exp_regs[1] = (m_exp_wptr>>8) & 0xff;
507         m_exp_regs[2] = ((m_exp_wptr>>16) & 0xff) | m_exp_bankhior;
508         m_exp_liveptr = m_exp_wptr;
509         break;
510
511      case 1:
512         m_exp_wptr &= ~0xff00;
513         m_exp_wptr |= (data<<8);
514         m_exp_regs[0] = m_exp_wptr & 0xff;
515         m_exp_regs[1] = (m_exp_wptr>>8) & 0xff;
516         m_exp_regs[2] = ((m_exp_wptr>>16) & 0xff) | m_exp_bankhior;
517         m_exp_liveptr = m_exp_wptr;
518         break;
519
520      case 2:
521         m_exp_wptr &= ~0xff0000;
522         m_exp_wptr |= (data<<16);
523         m_exp_regs[0] = m_exp_wptr & 0xff;
524         m_exp_regs[1] = (m_exp_wptr>>8) & 0xff;
525         m_exp_regs[2] = ((m_exp_wptr>>16) & 0xff) | m_exp_bankhior;
526         m_exp_liveptr = m_exp_wptr;
527         break;
528
529      case 3:
530//            printf("Write %02x to RAM[%x]\n", data, m_liveptr);
531         if (m_exp_liveptr <= m_exp_addrmask)
532         {
533            m_exp_ram[m_exp_liveptr] = data;
534         }
535         m_exp_liveptr++;
536         m_exp_regs[0] = m_exp_liveptr & 0xff;
537         m_exp_regs[1] = (m_exp_liveptr>>8) & 0xff;
538         m_exp_regs[2] = ((m_exp_liveptr>>16) & 0xff) | m_exp_bankhior;
539         break;
540
541      default:
542         m_exp_regs[offset] = data;
543         break;
544   }
545}
546
547/***************************************************************************
548    START/RESET
549***************************************************************************/
550
551void apple2e_state::machine_start()
552{
553   m_ram_ptr = m_ram->pointer();
554   m_rom_ptr = m_rom->base();
555   m_ram_size = m_ram->size();
556   m_speaker_state = 0;
557   m_speaker->level_w(m_speaker_state);
558   m_cassette_state = 0;
559   m_cassette_out = 0;
560   if (m_cassette)
561   {
562      m_cassette->output(-1.0f);
563   }
564   m_upperbank->set_bank(0);
565   m_lcbank->set_bank(0);
566   m_0000bank->set_bank(0);
567   m_0200bank->set_bank(0);
568   m_0400bank->set_bank(0);
569   m_0800bank->set_bank(0);
570   m_2000bank->set_bank(0);
571   m_4000bank->set_bank(0);
572   m_inh_bank = 0;
573
574   // expansion RAM size
575   if (m_ram_size > (128*1024))
576   {
577      m_exp_addrmask = m_ram_size - (128*1024) - 1;
578      m_exp_ram = m_ram_ptr + (128*1024);
579   }
580   else   // no expansion
581   {
582      m_exp_addrmask = 0;
583      m_exp_ram = NULL;
584   }
585
586   // precalculate joystick time constants
587   m_x_calibration = attotime::from_usec(12).as_double();
588   m_y_calibration = attotime::from_usec(13).as_double();
589
590   // cache slot devices
591   for (int i = 0; i <= 7; i++)
592   {
593      m_slotdevice[i] = m_a2bus->get_a2bus_card(i);
594   }
595
596   // and aux slot device if any
597   m_aux_ptr = NULL;
598   m_aux_bank_ptr = NULL;
599   if (m_a2eauxslot)
600   {
601      m_auxslotdevice = m_a2eauxslot->get_a2eauxslot_card();
602      m_aux_ptr = m_auxslotdevice->get_vram_ptr();
603      m_aux_bank_ptr = m_auxslotdevice->get_auxbank_ptr();
604   }
605   else   // IIc has 128K right on the motherboard
606   {
607      m_auxslotdevice = NULL;
608
609      if (m_ram_size >= (128*1024))
610      {
611         m_aux_ptr = &m_ram_ptr[0x10000];
612         m_aux_bank_ptr = m_aux_ptr;
613      }
614   }
615
616   // setup video pointers
617   m_video->m_ram_ptr = m_ram_ptr;
618   m_video->m_aux_ptr = m_aux_ptr;
619   m_video->m_char_ptr = memregion("gfx1")->base();
620   m_video->m_char_size = memregion("gfx1")->bytes();
621
622   m_inh_slot = -1;
623   m_cnxx_slot = CNXX_UNCLAIMED;
624
625   // setup save states
626   save_item(NAME(m_speaker_state));
627   save_item(NAME(m_cassette_state));
628   save_item(NAME(m_joystick_x1_time));
629   save_item(NAME(m_joystick_y1_time));
630   save_item(NAME(m_joystick_x2_time));
631   save_item(NAME(m_joystick_y2_time));
632   save_item(NAME(m_lastchar));
633   save_item(NAME(m_strobe));
634   save_item(NAME(m_transchar));
635   save_item(NAME(m_inh_slot));
636   save_item(NAME(m_inh_bank));
637   save_item(NAME(m_cnxx_slot));
638   save_item(NAME(m_page2));
639   save_item(NAME(m_an0));
640   save_item(NAME(m_an1));
641   save_item(NAME(m_an2));
642   save_item(NAME(m_an3));
643   save_item(NAME(m_intcxrom));
644   save_item(NAME(m_80store));
645   save_item(NAME(m_slotc3rom));
646   save_item(NAME(m_altzp));
647   save_item(NAME(m_ramrd));
648   save_item(NAME(m_ramwrt));
649   save_item(NAME(m_ioudis));
650   save_item(NAME(m_vbl));
651   save_item(NAME(m_vblmask));
652   save_item(NAME(m_romswitch));
653   save_item(NAME(m_irqmask));
654   save_item(NAME(m_anykeydown));
655   save_item(NAME(m_repeatdelay));
656   save_item(NAME(m_xy));
657   save_item(NAME(m_x0edge));
658   save_item(NAME(m_y0edge));
659   save_item(NAME(last_mx));
660   save_item(NAME(last_my));
661   save_item(NAME(count_x));
662   save_item(NAME(count_y));
663   save_item(NAME(m_x0));
664   save_item(NAME(m_x1));
665   save_item(NAME(m_y0));
666   save_item(NAME(m_y1));
667   save_item(NAME(m_xirq));
668   save_item(NAME(m_yirq));
669   save_item(NAME(m_iicplus_ce00));
670   save_item(NAME(m_exp_regs));
671   save_item(NAME(m_exp_wptr));
672   save_item(NAME(m_exp_liveptr));
673   save_item(NAME(m_exp_bankhior));
674   save_item(NAME(m_exp_addrmask));
675}
676
677void apple2e_state::machine_reset()
678{
679   m_page2 = false;
680   m_video->m_page2 = false;
681   m_an0 = m_an1 = m_an2 = m_an3 = false;
682   m_vbl = m_vblmask = false;
683   m_slotc3rom = false;
684   m_romswitch = false;
685   m_irqmask = 0;
686   m_anykeydown = false;
687   m_repeatdelay = 10;
688   m_xy = false;
689   m_x0edge = false;
690   m_y0edge = false;
691   m_xirq = false;
692   m_yirq = false;
693
694   // IIe prefers INTCXROM default to off, IIc has it always on
695   if (m_rom_ptr[0x3bc0] == 0x00)
696   {
697      m_intcxrom = true;
698      m_slotc3rom = false;
699      m_isiic = true;
700
701      if (m_rom_ptr[0x3bbf] == 0x05)
702      {
703         m_isiicplus = true;
704      }
705      else
706      {
707         m_isiicplus = false;
708      }
709   }
710   else
711   {
712      m_intcxrom = false;
713      m_isiic = false;
714      m_isiicplus = false;
715   }
716
717   m_80store = false;
718   m_altzp = false;
719   m_ramrd = false;
720   m_ramwrt = false;
721   m_ioudis = true;
722
723   // LC default state: read ROM, write enabled, Dxxx bank 2
724   m_lcram = false;
725   m_lcram2 = true;
726   m_lcwriteenable = true;
727
728   m_exp_bankhior = 0xf0;
729
730   // sync up the banking with the variables.
731   // RESEARCH: how does RESET affect LC state and aux banking states?
732   auxbank_update();
733   update_slotrom_banks();
734}
735
736void apple2e_state::raise_irq(int irq)
737{
738   m_irqmask |= (1 << irq);
739
740   if (m_irqmask)
741   {
742      m_maincpu->set_input_line(M6502_IRQ_LINE, ASSERT_LINE);
743   }
744}
745
746
747void apple2e_state::lower_irq(int irq)
748{
749   m_irqmask &= ~(1 << irq);
750
751   if (!m_irqmask)
752   {
753      m_maincpu->set_input_line(M6502_IRQ_LINE, CLEAR_LINE);
754   }
755}
756
757/***************************************************************************
758    VIDEO
759***************************************************************************/
760
761TIMER_DEVICE_CALLBACK_MEMBER(apple2e_state::apple2_interrupt)
762{
763   int scanline = param;
764
765   if((scanline % 8) == 0)
766   {
767      machine().first_screen()->update_partial(machine().first_screen()->vpos());
768   }
769
770   if (m_isiic)
771   {
772      update_iic_mouse();
773   }
774
775   if (scanline == 192)
776   {
777      m_vbl = true;
778
779      // update the video system's shadow copy of the system config
780      m_video->m_sysconfig = m_sysconfig->read();
781
782      if (m_vblmask)
783      {
784         raise_irq(IRQ_VBL);
785      }
786
787      // check for ctrl-reset
788      if ((m_kbspecial->read() & 0x88) == 0x88)
789      {
790         m_maincpu->reset();
791      }
792   }
793}
794
795PALETTE_INIT_MEMBER(apple2e_state, apple2)
796{
797   m_video->palette_init_apple2(palette);
798}
799
800UINT32 apple2e_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
801{
802   bool old_page2 = m_video->m_page2;
803
804   // don't display page2 if 80store is set (we just saved the previous value, don't worry)
805   if (m_80store)
806   {
807      m_video->m_page2 = false;
808   }
809
810   // always update the flash timer here so it's smooth regardless of mode switches
811   m_video->m_flash = ((machine().time() * 4).seconds & 1) ? true : false;
812
813   if (m_video->m_graphics)
814   {
815      if (m_video->m_hires)
816      {
817         if (m_video->m_mix)
818         {
819            if (m_video->m_dhires)
820            {
821               m_video->dhgr_update(screen, bitmap, cliprect, 0, 159);
822            }
823            else
824            {
825               m_video->hgr_update(screen, bitmap, cliprect, 0, 159);
826            }
827            m_video->text_update(screen, bitmap, cliprect, 160, 191);
828         }
829         else
830         {
831            if (m_video->m_dhires)
832            {
833               m_video->dhgr_update(screen, bitmap, cliprect, 0, 191);
834            }
835            else
836            {
837               m_video->hgr_update(screen, bitmap, cliprect, 0, 191);
838            }
839         }
840      }
841      else   // lo-res
842      {   
843         if (m_video->m_mix)
844         {
845            if (m_video->m_dhires)
846            {
847               m_video->dlores_update(screen, bitmap, cliprect, 0, 159);
848            }
849            else
850            {
851               m_video->lores_update(screen, bitmap, cliprect, 0, 159);
852            }
853
854            m_video->text_update(screen, bitmap, cliprect, 160, 191);
855         }
856         else
857         {
858            if (m_video->m_dhires)
859            {
860               m_video->dlores_update(screen, bitmap, cliprect, 0, 191);
861            }
862            else
863            {
864               m_video->lores_update(screen, bitmap, cliprect, 0, 191);
865            }
866         }
867      }
868   }
869   else
870   {
871      m_video->text_update(screen, bitmap, cliprect, 0, 191);
872   }
873
874   m_video->m_page2 = old_page2;
875
876   return 0;
877}
878
879/***************************************************************************
880    I/O
881***************************************************************************/
882void apple2e_state::auxbank_update()
883{
884   int ramwr = (m_ramrd ? 1 : 0) | (m_ramwrt ? 2 : 0);
885
886   m_0000bank->set_bank(m_altzp ? 1 : 0);
887   m_0200bank->set_bank(ramwr);
888
889   if (m_80store)
890   {
891      if (m_page2)
892      {
893         m_0400bank->set_bank(3);
894      }
895      else
896      {
897         m_0400bank->set_bank(0);
898      }
899   }
900   else
901   {
902      m_0400bank->set_bank(ramwr);
903   }
904
905   m_0800bank->set_bank(ramwr);
906
907   if ((m_80store) && (m_video->m_hires))
908   {
909      if (m_page2)
910      {
911         m_2000bank->set_bank(3);
912      }
913      else
914      {
915         m_2000bank->set_bank(0);
916      }
917   }
918   else
919   {
920      m_2000bank->set_bank(ramwr);
921   }
922
923   m_4000bank->set_bank(ramwr);
924}
925
926void apple2e_state::update_slotrom_banks()
927{
928   int cxswitch = 0;
929
930   // IIc and IIc+ have working (readable) INTCXROM/SLOTC3ROM switches, but
931   // internal ROM is always present in the slots.
932   if ((m_intcxrom) || (m_isiic))
933   {
934      if (m_romswitch)
935      {
936         cxswitch = 2;
937      }
938      else
939      {
940         cxswitch = 1;
941      }
942   }
943
944   m_c100bank->set_bank(cxswitch);
945   m_c400bank->set_bank(cxswitch);
946
947//   printf("intcxrom %d cnxx_slot %d isiic %d romswitch %d\n", m_intcxrom, m_cnxx_slot, m_isiic, m_romswitch);
948   if ((m_intcxrom) || (m_cnxx_slot < 0) || (m_isiic))
949   {
950      if (m_romswitch)
951      {
952         m_c800bank->set_bank(2);
953      }
954      else
955      {
956         m_c800bank->set_bank(1);
957      }
958   }
959   else
960   {
961      m_c800bank->set_bank(0);
962   }
963
964   if ((!m_slotc3rom) || (m_isiic))
965   {
966      if (m_romswitch)
967      {
968         m_c300bank->set_bank(2);
969      }
970      else
971      {
972         m_c300bank->set_bank(1);
973      }
974   }
975   else
976   {
977       m_c300bank->set_bank(0);
978   }
979}
980
981void apple2e_state::lc_update(int offset)
982{
983   bool m_last_lcram = m_lcram;
984
985   m_lcram = false;
986   m_lcram2 = false;
987   m_lcwriteenable = false;
988
989   if (offset & 1)
990   {
991      m_lcwriteenable = true;
992   }
993
994   switch(offset & 0x03)
995   {
996      case 0x00:
997      case 0x03:
998         m_lcram = true;
999         break;
1000   }
1001
1002   if (!(offset & 8))
1003   {
1004      m_lcram2 = true;
1005   }
1006
1007   if (m_lcram != m_last_lcram)
1008   {
1009      if (m_lcram)
1010      {
1011         m_lcbank->set_bank(1);
1012      }
1013      else
1014      {
1015         if (m_romswitch)
1016         {
1017            m_lcbank->set_bank(2);
1018         }
1019         else
1020         {
1021            m_lcbank->set_bank(0);
1022         }
1023      }
1024   }
1025
1026   #if 0
1027   printf("LC: new state %c%c dxxx=%04x altzp=%d\n",
1028         m_lcram ? 'R' : 'x',
1029         m_lcwriteenable ? 'W' : 'x',
1030         m_lcram2 ? 0x1000 : 0x0000,
1031         m_altzp);
1032   #endif
1033}
1034
1035// most softswitches don't care about read vs write, so handle them here
1036void apple2e_state::do_io(address_space &space, int offset, bool is_iic)
1037{
1038   if(space.debugger_access()) return;
1039
1040   // Handle C058-C05F according to IOUDIS
1041   if ((offset & 0x58) == 0x58)
1042   {
1043      // IIc-specific switches
1044      if (m_isiic)
1045      {
1046         switch (offset)
1047         {
1048            case 0x58:   // DisXY
1049               m_xy = false; break;
1050
1051            case 0x59:   // EnbXY
1052               m_xy = true; break;
1053
1054            case 0x5a:   // DisVBL
1055               m_vblmask = false; break;
1056
1057            case 0x5b:   // EnVBL
1058               m_vblmask = true; break;
1059
1060            case 0x5c:   // RisX0Edge
1061               m_x0edge = false; break;
1062
1063            case 0x5d:   // FalX0Edge
1064               m_x0edge = true; break;
1065
1066            case 0x5e:   // RisY0Edge
1067               if (!m_ioudis)
1068               {
1069                  m_y0edge = false;
1070               }
1071               break;
1072
1073            case 0x5f:   // FalY0Edge
1074               if (!m_ioudis)
1075               {
1076                  m_y0edge = true;
1077               }
1078               break;
1079         }
1080      }
1081
1082      if (m_ioudis)
1083      {
1084         switch (offset)
1085         {
1086            case 0x5e:   // SETDHIRES
1087               m_video->m_dhires = true;
1088               break;
1089
1090            case 0x5f:   // CLRDHIRES
1091               m_video->m_dhires = false;
1092               break;
1093         }
1094      }
1095
1096      return;
1097   }
1098
1099   switch (offset)
1100   {
1101      case 0x20:
1102         if (m_cassette)
1103         {
1104            m_cassette_state ^= 1;
1105            m_cassette->output(m_cassette_state ? 1.0f : -1.0f);
1106         }
1107         break;
1108
1109      case 0x28:
1110         if (is_iic)
1111         {
1112            m_romswitch = !m_romswitch;
1113            update_slotrom_banks();
1114
1115            // if LC is not enabled
1116            if (!m_lcram)
1117            {
1118               if (m_romswitch)
1119               {
1120                  m_lcbank->set_bank(2);
1121               }
1122               else
1123               {
1124                  m_lcbank->set_bank(0);
1125               }
1126            }
1127         }
1128         break;
1129
1130      case 0x30:
1131         m_speaker_state ^= 1;
1132         m_speaker->level_w(m_speaker_state);
1133         break;
1134
1135      case 0x48:   // (IIc only) clear mouse X/Y interrupt flags
1136         m_xirq = m_yirq = false;
1137         lower_irq(IRQ_MOUSEXY);
1138         break;
1139
1140      case 0x50:  // graphics mode
1141         m_video->m_graphics = true; break;
1142
1143      case 0x51:  // text mode
1144         m_video->m_graphics = false; break;
1145
1146      case 0x52:  // no mix
1147         m_video->m_mix = false; break;
1148
1149      case 0x53:  // mixed mode
1150         m_video->m_mix = true; break;
1151
1152      case 0x54:  // set page 1
1153         m_page2 = false;
1154         m_video->m_page2 = false;
1155         auxbank_update();
1156         break;
1157
1158      case 0x55:  // set page 2
1159         m_page2 = true;
1160         m_video->m_page2 = true;
1161         auxbank_update();
1162         break;
1163
1164      case 0x56: // select lo-res
1165         m_video->m_hires = false;
1166         auxbank_update();
1167         break;
1168
1169      case 0x57: // select hi-res
1170         m_video->m_hires = true;
1171         auxbank_update();
1172         break;
1173
1174      case 0x58: // AN0 off
1175         m_an0 = false; break;
1176
1177      case 0x59: // AN0 on
1178         m_an0 = true; break;
1179
1180      case 0x5a: // AN1 off
1181         m_an1 = false; break;
1182
1183      case 0x5b: // AN1 on
1184         m_an1 = true; break;
1185
1186      case 0x5c: // AN2 off
1187         m_an2 = false; break;
1188
1189      case 0x5d: // AN2 on
1190         m_an2 = true; break;
1191
1192      case 0x5e: // AN3 off
1193         m_an3 = false; break;
1194
1195      case 0x5f: // AN3 on
1196         m_an3 = true; break;
1197
1198      case 0x68:   // IIgs STATE register, which ProDOS touches
1199         break;
1200
1201      // trigger joypad read
1202      case 0x70: case 0x71: case 0x72: case 0x73: case 0x74: case 0x75: case 0x76: case 0x77:
1203      case 0x78: case 0x79: case 0x7a: case 0x7b: case 0x7c: case 0x7d: case 0x7e: case 0x7f:
1204         if (is_iic)
1205         {
1206            m_vbl = false;
1207            lower_irq(IRQ_VBL);
1208         }
1209
1210         m_joystick_x1_time = machine().time().as_double() + m_x_calibration * m_joy1x->read();
1211         m_joystick_y1_time = machine().time().as_double() + m_y_calibration * m_joy1y->read();
1212         m_joystick_x2_time = machine().time().as_double() + m_x_calibration * m_joy2x->read();
1213         m_joystick_y2_time = machine().time().as_double() + m_y_calibration * m_joy2y->read();
1214         break;
1215
1216      default:
1217         logerror("do_io: unknown switch $C0%02X\n", offset);
1218         break;
1219   }
1220}
1221
1222READ8_MEMBER(apple2e_state::c000_r)
1223{
1224   if(space.debugger_access()) return read_floatingbus();
1225
1226   switch (offset)
1227   {
1228      case 0x00:  // keyboard latch
1229         return m_transchar | m_strobe;
1230
1231      case 0x02:   // RAMRDOFF
1232         m_ramrd = false;
1233         auxbank_update();
1234         break;
1235
1236      case 0x03:   // RAMRDON
1237         m_ramrd = true;
1238         auxbank_update();
1239         break;
1240
1241      case 0x04:   // RAMWRTOFF
1242         m_ramwrt = false;
1243         auxbank_update();
1244         break;
1245
1246      case 0x05:   // RAMWRTON
1247         m_ramwrt = true;
1248         auxbank_update();
1249         break;
1250
1251      case 0x10:  // read any key down, reset keyboard strobe
1252         {
1253            UINT8 rv = m_transchar | m_anykeydown;
1254            m_strobe = 0;
1255            return rv;
1256         }
1257
1258      case 0x11:   // read LCRAM2 (LC Dxxx bank)
1259         return m_lcram2 ? 0x80 : 0x00;
1260
1261      case 0x12:   // read LCRAM (is LC readable?)
1262         return m_lcram ? 0x80 : 0x00;
1263
1264      case 0x13:   // read RAMRD
1265         return m_ramrd ? 0x80 : 0x00;
1266
1267      case 0x14:   // read RAMWRT
1268         return m_ramwrt ? 0x80 : 0x00;
1269
1270      case 0x15:   // read INTCXROM
1271         return m_intcxrom ? 0x80 : 0x00;
1272
1273      case 0x16:   // read ALTZP
1274         return m_altzp ? 0x80 : 0x00;
1275
1276      case 0x17:   // read SLOTC3ROM
1277         return m_slotc3rom ? 0x80 : 0x00;
1278
1279      case 0x18:   // read 80STORE
1280         return m_80store ? 0x80 : 0x00;
1281
1282      case 0x19:   // read VBLBAR
1283         return space.machine().first_screen()->vblank() ? 0x00 : 0x80;
1284
1285      case 0x1a:   // read TEXT
1286         return m_video->m_graphics ? 0x00 : 0x80;
1287
1288      case 0x1b:   // read MIXED
1289         return m_video->m_mix ? 0x80 : 0x00;
1290
1291      case 0x1c:   // read PAGE2
1292         return m_page2 ? 0x80 : 0x00;
1293
1294      case 0x1d:   // read HIRES
1295         return m_video->m_hires ? 0x80 : 0x00;
1296
1297      case 0x1e:   // read ALTCHARSET
1298         return m_video->m_altcharset ? 0x80 : 0x00;
1299
1300      case 0x1f:   // read 80COL
1301         return m_video->m_80col ? 0x80 : 0x00;
1302
1303      case 0x60: // cassette in
1304      case 0x68:
1305         if (m_cassette)
1306         {
1307            return m_cassette->input() > 0.0 ? 0x80 : 0;
1308         }
1309         return 0;
1310
1311      case 0x61:   // button 0 or Open Apple
1312      case 0x69:
1313         return ((m_joybuttons->read() & 0x10) || (m_kbspecial->read() & 0x10)) ? 0x80 : 0;
1314
1315      case 0x62:   // button 1 or Solid Apple
1316      case 0x6a:
1317         return ((m_joybuttons->read() & 0x20) || (m_kbspecial->read() & 0x20)) ? 0x80 : 0;
1318
1319      case 0x63:   // button 2 or SHIFT key
1320      case 0x6b:
1321         return ((m_joybuttons->read() & 0x40) || (m_kbspecial->read() & 0x06)) ? 0x80 : 0;
1322
1323      case 0x64:   // joy 1 X axis
1324      case 0x6c:
1325         return (space.machine().time().as_double() < m_joystick_x1_time) ? 0x80 : 0;
1326
1327      case 0x65:   // joy 1 Y axis
1328      case 0x6d:
1329         return (space.machine().time().as_double() < m_joystick_y1_time) ? 0x80 : 0;
1330
1331      case 0x66: // joy 2 X axis
1332      case 0x6e:
1333         return (space.machine().time().as_double() < m_joystick_x2_time) ? 0x80 : 0;
1334
1335      case 0x67: // joy 2 Y axis
1336      case 0x6f:
1337         return (space.machine().time().as_double() < m_joystick_y2_time) ? 0x80 : 0;
1338
1339      case 0x7e:   // read IOUDIS
1340         return m_ioudis ? 0x80 : 0x00;
1341
1342      case 0x7f:   // read DHIRES
1343         return m_video->m_dhires ? 0x00 : 0x80;
1344
1345      default:
1346         do_io(space, offset, false);
1347         break;
1348   }
1349
1350   return read_floatingbus();
1351}
1352
1353WRITE8_MEMBER(apple2e_state::c000_w)
1354{
1355   if(space.debugger_access()) return;
1356
1357   switch (offset)
1358   {
1359      case 0x00:   // 80STOREOFF
1360         m_80store = false;
1361         auxbank_update();
1362         break;
1363
1364      case 0x01:   // 80STOREON
1365         m_80store = true;
1366         auxbank_update();
1367         break;
1368
1369      case 0x02:   // RAMRDOFF
1370         m_ramrd = false;
1371         auxbank_update();
1372         break;
1373
1374      case 0x03:   // RAMRDON
1375         m_ramrd = true;
1376         auxbank_update();
1377         break;
1378
1379      case 0x04:   // RAMWRTOFF
1380         m_ramwrt = false;
1381         auxbank_update();
1382         break;
1383
1384      case 0x05:   // RAMWRTON
1385         m_ramwrt = true;
1386         auxbank_update();
1387         break;
1388
1389      case 0x06:   // INTCXROMOFF
1390         m_intcxrom = false;
1391         update_slotrom_banks();
1392         break;
1393
1394      case 0x07:   // INTCXROMON
1395         m_intcxrom = true;
1396         update_slotrom_banks();
1397         break;
1398
1399      case 0x08:   // ALTZPOFF
1400         m_altzp = false;
1401         auxbank_update();
1402         break;
1403
1404      case 0x09:   // ALTZPON
1405         m_altzp = true;
1406         auxbank_update();
1407         break;
1408
1409      case 0x0a:   // SETINTC3ROM
1410         m_slotc3rom = false;
1411         update_slotrom_banks();
1412         break;
1413
1414      case 0x0b:   // SETSLOTC3ROM
1415         m_slotc3rom = true;
1416         update_slotrom_banks();
1417         break;
1418
1419      case 0x0c:   // 80COLOFF
1420         m_video->m_80col = false;
1421         break;
1422
1423      case 0x0d:   // 80COLON
1424         m_video->m_80col = true;
1425         break;
1426
1427      case 0x0e:   // ALTCHARSETOFF
1428         m_video->m_altcharset = false;
1429         break;
1430
1431      case 0x0f:   // ALTCHARSETON
1432         m_video->m_altcharset = true;
1433         break;
1434
1435      case 0x10:  // clear keyboard latch
1436         m_strobe = 0;
1437         break;
1438
1439      case 0x20:   // cassette output
1440         if (m_cassette)
1441         {
1442            m_cassette_out ^= 1;
1443            m_cassette->output(m_cassette_out ? 1.0f : -1.0f);
1444         }
1445         break;
1446
1447      case 0x70: case 0x71: case 0x72: case 0x73: case 0x74: case 0x75: case 0x76: case 0x77:
1448      case 0x78: case 0x79: case 0x7a: case 0x7b: case 0x7c: case 0x7d:
1449         if (m_auxslotdevice)
1450         {
1451            m_auxslotdevice->write_c07x(space, offset & 0xf, data);
1452
1453            // card may have banked auxram; get a new bank pointer
1454            m_aux_bank_ptr = m_auxslotdevice->get_auxbank_ptr();
1455         }
1456         do_io(space, offset, false);   // make sure it also side-effect resets the paddles as documented
1457         break;
1458
1459      case 0x7e:   // SETIOUDIS
1460         m_ioudis = true; break;
1461
1462      case 0x7f:   // CLRIOUDIS
1463         m_ioudis = false; break;
1464
1465      default:
1466         do_io(space, offset, false);
1467         break;
1468   }
1469}
1470
1471READ8_MEMBER(apple2e_state::c000_iic_r)
1472{
1473   if(space.debugger_access()) return read_floatingbus();
1474
1475   switch (offset)
1476   {
1477      case 0x00:  // keyboard latch
1478         return m_transchar | m_strobe;
1479
1480      case 0x02:   // RAMRDOFF
1481         m_ramrd = false;
1482         auxbank_update();
1483         break;
1484
1485      case 0x03:   // RAMRDON
1486         m_ramrd = true;
1487         auxbank_update();
1488         break;
1489
1490      case 0x04:   // RAMWRTOFF
1491         m_ramwrt = false;
1492         auxbank_update();
1493         break;
1494
1495      case 0x05:   // RAMWRTON
1496         m_ramwrt = true;
1497         auxbank_update();
1498         break;
1499
1500      case 0x10:  // read any key down, reset keyboard strobe
1501         {
1502            UINT8 rv = m_transchar | m_anykeydown;
1503            m_strobe = 0;
1504            return rv;
1505         }
1506
1507      case 0x11:   // read LCRAM2 (LC Dxxx bank)
1508         return m_lcram2 ? 0x80 : 0x00;
1509         break;     
1510
1511      case 0x12:   // read LCRAM (is LC readable?)
1512         return m_lcram ? 0x80 : 0x00;
1513         break;
1514
1515      case 0x13:   // read RAMRD
1516         return m_ramrd ? 0x80 : 0x00;
1517
1518      case 0x14:   // read RAMWRT
1519         return m_ramwrt ? 0x80 : 0x00;
1520
1521      case 0x15:   // read & reset mouse X0 interrupt flag
1522         lower_irq(IRQ_MOUSEXY);
1523         return m_xirq ? 0x80 : 0x00;
1524
1525      case 0x16:   // read ALTZP
1526         return m_altzp ? 0x80 : 0x00;
1527
1528      case 0x17:   // read & reset mouse Y0 interrupt flag
1529         lower_irq(IRQ_MOUSEXY);
1530         return m_yirq ? 0x80 : 0x00;
1531
1532      case 0x18:   // read 80STORE
1533         return m_80store ? 0x80 : 0x00;
1534
1535      case 0x19:   // read VBL
1536         return m_vbl ? 0x80 : 0x00;
1537
1538      case 0x1a:   // read TEXT
1539         return m_video->m_graphics ? 0x00 : 0x80;
1540
1541      case 0x1b:   // read MIXED
1542         return m_video->m_mix ? 0x80 : 0x00;
1543
1544      case 0x1c:   // read PAGE2
1545         return m_page2 ? 0x80 : 0x00;
1546
1547      case 0x1d:   // read HIRES
1548         return m_video->m_hires ? 0x80 : 0x00;
1549
1550      case 0x1e:   // read ALTCHARSET
1551         return m_video->m_altcharset ? 0x80 : 0x00;
1552
1553      case 0x1f:   // read 80COL
1554         return m_video->m_80col ? 0x80 : 0x00;
1555
1556      case 0x40:   // read XYMask (IIc only)
1557         return m_xy ? 0x80 : 0x00;
1558
1559      case 0x41:   // read VBL mask (IIc only)
1560         return m_vblmask ? 0x80 : 0x00;
1561
1562      case 0x42:   // read X0Edge (IIc only)
1563         return m_x0edge ? 0x80 : 0x00;
1564
1565      case 0x43:   // read Y0Edge (IIc only)
1566         return m_y0edge ? 0x80 : 0x00;
1567
1568      case 0x60: // 40/80 column switch (IIc only)
1569         return (m_sysconfig->read() & 0x04) ? 0x80 : 0;
1570
1571      case 0x61:   // button 0 or Open Apple or mouse button 1
1572      case 0x69:
1573         return ((m_joybuttons->read() & 0x10) || (m_kbspecial->read() & 0x10)) ? 0x80 : 0;
1574
1575      case 0x62:   // button 1 or Solid Apple
1576      case 0x6a:
1577         return ((m_joybuttons->read() & 0x20) || (m_kbspecial->read() & 0x20)) ? 0x80 : 0;
1578
1579      case 0x63:   // mouse button 2 (no other function on IIc)
1580      case 0x6b:
1581         return m_mouseb->read() ? 0 : 0x80;
1582
1583      case 0x64:   // joy 1 X axis
1584      case 0x6c:
1585         return (space.machine().time().as_double() < m_joystick_x1_time) ? 0x80 : 0;
1586
1587      case 0x65:   // joy 1 Y axis
1588      case 0x6d:
1589         return (space.machine().time().as_double() < m_joystick_y1_time) ? 0x80 : 0;
1590
1591      case 0x66: // mouse X1 (IIc only)
1592      case 0x6e:
1593         return m_x1 ? 0x80 : 0;
1594
1595      case 0x67: // mouse Y1 (IIc only)
1596      case 0x6f:
1597         return m_y1 ? 0x80 : 0;
1598
1599      case 0x7e:   // read IOUDIS
1600         m_vbl = false;
1601         lower_irq(IRQ_VBL);
1602         return m_ioudis ? 0x80 : 0x00;
1603
1604      case 0x7f:   // read DHIRES
1605         return m_video->m_dhires ? 0x00 : 0x80;
1606
1607      default:
1608         do_io(space, offset, true);
1609         break;
1610   }
1611
1612   return read_floatingbus();
1613}
1614
1615WRITE8_MEMBER(apple2e_state::c000_iic_w)
1616{
1617   if(space.debugger_access()) return;
1618
1619   switch (offset)
1620   {
1621      case 0x00:   // 80STOREOFF
1622         m_80store = false;
1623         auxbank_update();
1624         break;
1625
1626      case 0x01:   // 80STOREON
1627         m_80store = true;
1628         auxbank_update();
1629         break;
1630
1631      case 0x02:   // RAMRDOFF
1632         m_ramrd = false;
1633         auxbank_update();
1634         break;
1635
1636      case 0x03:   // RAMRDON
1637         m_ramrd = true;
1638         auxbank_update();
1639         break;
1640
1641      case 0x04:   // RAMWRTOFF
1642         m_ramwrt = false;
1643         auxbank_update();
1644         break;
1645
1646      case 0x05:   // RAMWRTON
1647         m_ramwrt = true;
1648         auxbank_update();
1649         break;
1650
1651      case 0x06:   // INTCXROMOFF
1652         m_intcxrom = false;
1653         update_slotrom_banks();
1654         break;
1655
1656      case 0x07:   // INTCXROMON
1657         m_intcxrom = true;
1658         update_slotrom_banks();
1659         break;
1660
1661      case 0x08:   // ALTZPOFF
1662         m_altzp = false;
1663         auxbank_update();
1664         break;
1665
1666      case 0x09:   // ALTZPON
1667         m_altzp = true;
1668         auxbank_update();
1669         break;
1670
1671      case 0x0a:   // SETINTC3ROM
1672         m_slotc3rom = false;
1673         update_slotrom_banks();
1674         break;
1675
1676      case 0x0b:   // SETSLOTC3ROM
1677         m_slotc3rom = true;
1678         update_slotrom_banks();
1679         break;
1680
1681      case 0x0c:   // 80COLOFF
1682         m_video->m_80col = false;
1683         break;
1684
1685      case 0x0d:   // 80COLON
1686         m_video->m_80col = true;
1687         break;
1688
1689      case 0x0e:   // ALTCHARSETOFF
1690         m_video->m_altcharset = false;
1691         break;
1692
1693      case 0x0f:   // ALTCHARSETON
1694         m_video->m_altcharset = true;
1695         break;
1696
1697      case 0x10:  // clear keyboard latch
1698         m_strobe = 0;
1699         break;
1700
1701      case 0x78:
1702      case 0x79:
1703         m_vbl = false;
1704         lower_irq(IRQ_VBL);
1705         break;
1706
1707      case 0x7e:   // SETIOUDIS
1708         m_ioudis = true;
1709         break;
1710
1711      case 0x7f:   // CLRIOUDIS
1712         m_ioudis = false;
1713         break;
1714
1715      default:
1716         do_io(space, offset, true);
1717         break;
1718   }
1719}
1720
1721void apple2e_state::update_iic_mouse()
1722{
1723   int new_mx, new_my;
1724
1725   // read the axes
1726   new_mx = m_mousex->read();
1727   new_my = m_mousey->read();
1728
1729   // did X change?
1730   if (new_mx != last_mx)
1731   {
1732      int diff = new_mx - last_mx;
1733
1734      /* check for wrap */
1735      if (diff > 0x80)
1736         diff = 0x100-diff;
1737      if  (diff < -0x80)
1738         diff = -0x100-diff;
1739
1740      count_x += diff;
1741      last_mx = new_mx;
1742   }
1743
1744   // did Y change?
1745   if (new_my != last_my)
1746   {
1747      int diff = new_my - last_my;
1748
1749      /* check for wrap */
1750      if (diff > 0x80)
1751         diff = 0x100-diff;
1752      if  (diff < -0x80)
1753         diff = -0x100-diff;
1754
1755      count_y += diff;
1756      last_my = new_my;
1757   }
1758
1759   if (count_x)
1760   {
1761      if (count_x < 0)
1762      {
1763         count_x++;
1764         m_x1 = false;
1765      }
1766      else
1767      {
1768         count_x--;
1769         m_x1 = true;
1770      }
1771
1772      // x0 is going to state-flip, generate an IRQ
1773      if (((m_x0) && (m_x0edge)) || // falling?
1774         (!(m_x0) && !(m_x0edge))) // rising?
1775      {
1776         if (m_xy)
1777         {
1778            m_xirq = true;
1779            raise_irq(IRQ_MOUSEXY);
1780         }
1781      }
1782
1783      m_x0 = !m_x0;
1784   }
1785   else if (count_y)
1786   {
1787      if (count_y < 0)
1788      {
1789         count_y++;
1790         m_y1 = true;
1791      }
1792      else
1793      {
1794         count_y--;
1795         m_y1 = false;
1796      }
1797
1798      // y0 is going to state-flip, generate an IRQ
1799      if (((m_y0) && (m_y0edge)) || // falling?
1800         (!(m_y0) && !(m_y0edge))) // rising?
1801      {
1802         if (m_xy)
1803         {
1804            m_yirq = true;
1805            raise_irq(IRQ_MOUSEXY);
1806         }
1807      }
1808
1809      m_y0 = !m_y0;
1810   }
1811}
1812
1813READ8_MEMBER(apple2e_state::c080_r)
1814{
1815   if(!space.debugger_access())
1816   {
1817      int slot;
1818
1819      offset &= 0x7F;
1820      slot = offset / 0x10;
1821
1822      if (slot == 0)
1823      {
1824         lc_update(offset & 0xf);
1825      }
1826      else
1827      {
1828         if (m_slotdevice[slot] != NULL)
1829         {
1830            return m_slotdevice[slot]->read_c0nx(space, offset % 0x10);
1831         }
1832      }
1833   }
1834
1835   return read_floatingbus();
1836}
1837
1838WRITE8_MEMBER(apple2e_state::c080_w)
1839{
1840   int slot;
1841
1842   offset &= 0x7F;
1843   slot = offset / 0x10;
1844
1845   if (slot == 0)
1846   {
1847      lc_update(offset & 0xf);
1848   }
1849   else
1850   {
1851      if (m_slotdevice[slot] != NULL)
1852      {
1853         m_slotdevice[slot]->write_c0nx(space, offset % 0x10, data);
1854      }
1855   }
1856}
1857
1858UINT8 apple2e_state::read_slot_rom(address_space &space, int slotbias, int offset)
1859{
1860   int slotnum = ((offset>>8) & 0xf) + slotbias;
1861
1862   if (m_slotdevice[slotnum] != NULL)
1863   {
1864      if ((m_cnxx_slot == CNXX_UNCLAIMED) && (m_slotdevice[slotnum]->take_c800()) && (!space.debugger_access()))
1865      {
1866         m_cnxx_slot = slotnum;
1867         update_slotrom_banks();
1868      }
1869
1870      return m_slotdevice[slotnum]->read_cnxx(space, offset&0xff);
1871   }
1872
1873   return read_floatingbus();
1874}
1875
1876void apple2e_state::write_slot_rom(address_space &space, int slotbias, int offset, UINT8 data)
1877{
1878   int slotnum = ((offset>>8) & 0xf) + slotbias;
1879
1880   if (m_slotdevice[slotnum] != NULL)
1881   {
1882      if ((m_cnxx_slot == CNXX_UNCLAIMED) && (m_slotdevice[slotnum]->take_c800()) && (!space.debugger_access()))
1883      {
1884         m_cnxx_slot = slotnum;
1885         update_slotrom_banks();
1886      }
1887
1888      m_slotdevice[slotnum]->write_cnxx(space, offset&0xff, data);
1889   }
1890}
1891
1892UINT8 apple2e_state::read_int_rom(address_space &space, int slotbias, int offset)
1893{
1894   int slotnum = (slotbias & 0x700) >> 8;
1895
1896   if ((m_cnxx_slot == CNXX_UNCLAIMED) && (!space.debugger_access()))
1897   {
1898      m_cnxx_slot = CNXX_INTROM;
1899      update_slotrom_banks();
1900   }
1901
1902   return m_rom_ptr[slotbias + offset];
1903}
1904
1905READ8_MEMBER(apple2e_state::c100_r)  { return read_slot_rom(space, 1, offset); }
1906READ8_MEMBER(apple2e_state::c100_int_r)  { return read_int_rom(space, 0x100, offset); }
1907READ8_MEMBER(apple2e_state::c100_int_bank_r)  { return read_int_rom(space, 0x4100, offset); }
1908WRITE8_MEMBER(apple2e_state::c100_w) { write_slot_rom(space, 1, offset, data); }
1909READ8_MEMBER(apple2e_state::c300_r)  { return read_slot_rom(space, 3, offset); }
1910READ8_MEMBER(apple2e_state::c300_int_r)  { return read_int_rom(space, 0x300, offset); }
1911READ8_MEMBER(apple2e_state::c300_int_bank_r)  { return read_int_rom(space, 0x4300, offset); }
1912WRITE8_MEMBER(apple2e_state::c300_w) { write_slot_rom(space, 3, offset, data); }
1913READ8_MEMBER(apple2e_state::c400_r)  { return read_slot_rom(space, 4, offset); }
1914READ8_MEMBER(apple2e_state::c400_int_r)  { return read_int_rom(space, 0x400, offset); }
1915READ8_MEMBER(apple2e_state::c400_int_bank_r)  { return read_int_rom(space, 0x4400, offset); }
1916WRITE8_MEMBER(apple2e_state::c400_w) { write_slot_rom(space, 4, offset, data); }
1917
1918READ8_MEMBER(apple2e_state::c800_r)
1919{
1920   if ((m_isiicplus) && (offset >= 0x600))
1921   {
1922      return m_iicplus_ce00[offset-0x600];
1923   }
1924
1925   if (offset == 0x7ff)
1926   {
1927      m_cnxx_slot = CNXX_UNCLAIMED;
1928      update_slotrom_banks();
1929      return 0xff;
1930   }
1931
1932   if ((m_cnxx_slot > 0) && (m_slotdevice[m_cnxx_slot] != NULL))
1933   {
1934      return m_slotdevice[m_cnxx_slot]->read_c800(space, offset&0xfff);
1935   }
1936
1937   return read_floatingbus();
1938}
1939
1940WRITE8_MEMBER(apple2e_state::c800_w)
1941{
1942   if ((m_isiicplus) && (offset >= 0x600))
1943   {
1944      m_iicplus_ce00[offset-0x600] = data;
1945      return;
1946   }
1947
1948   if (offset == 0x7ff)
1949   {
1950      m_cnxx_slot = CNXX_UNCLAIMED;
1951      update_slotrom_banks();
1952      return;
1953   }
1954
1955   if ((m_cnxx_slot > 0) && (m_slotdevice[m_cnxx_slot] != NULL))
1956   {
1957      m_slotdevice[m_cnxx_slot]->write_c800(space, offset&0xfff, data);
1958   }
1959}
1960
1961READ8_MEMBER(apple2e_state::inh_r)
1962{
1963   if (m_inh_slot != -1)
1964   {
1965      return m_slotdevice[m_inh_slot]->read_inh_rom(space, offset + 0xd000);
1966   }
1967
1968   assert(0);   // hitting inh_r with invalid m_inh_slot should not be possible
1969   return read_floatingbus();
1970}
1971
1972WRITE8_MEMBER(apple2e_state::inh_w)
1973{
1974   if (m_inh_slot != -1)
1975   {
1976      m_slotdevice[m_inh_slot]->write_inh_rom(space, offset + 0xd000, data);
1977   }
1978}
1979
1980READ8_MEMBER(apple2e_state::lc_r)
1981{
1982   if (m_altzp)
1983   {
1984      if (m_aux_bank_ptr)
1985      {
1986         if (offset < 0x1000)
1987         {
1988            if (m_lcram2)
1989            {
1990               return m_aux_bank_ptr[(offset & 0xfff) + 0xd000];
1991            }
1992            else
1993            {
1994               return m_aux_bank_ptr[(offset & 0xfff) + 0xc000];
1995            }
1996         }
1997
1998         return m_aux_bank_ptr[(offset & 0x1fff) + 0xe000];
1999      }
2000      else
2001      {
2002         return read_floatingbus();
2003      }
2004   }
2005   else
2006   {
2007      if (offset < 0x1000)
2008      {
2009         if (m_lcram2)
2010         {
2011            return m_ram_ptr[(offset & 0xfff) + 0xd000];
2012         }
2013         else
2014         {
2015            return m_ram_ptr[(offset & 0xfff) + 0xc000];
2016         }
2017      }
2018
2019      return m_ram_ptr[(offset & 0x1fff) + 0xe000];
2020   }
2021}
2022
2023WRITE8_MEMBER(apple2e_state::lc_w)
2024{
2025   if (!m_lcwriteenable)
2026   {
2027      return;
2028   }
2029
2030   if (m_altzp)
2031   {
2032      if (m_aux_bank_ptr)
2033      {
2034         if (offset < 0x1000)
2035         {
2036            if (m_lcram2)
2037            {
2038               m_aux_bank_ptr[(offset & 0xfff) + 0xd000] = data;
2039            }
2040            else
2041            {
2042               m_aux_bank_ptr[(offset & 0xfff) + 0xc000] = data;
2043            }
2044            return;
2045         }
2046
2047         m_aux_bank_ptr[(offset & 0x1fff) + 0xe000] = data;
2048      }
2049   }
2050   else
2051   {
2052      if (offset < 0x1000)
2053      {
2054         if (m_lcram2)
2055         {
2056            m_ram_ptr[(offset & 0xfff) + 0xd000] = data;
2057         }
2058         else
2059         {
2060            m_ram_ptr[(offset & 0xfff) + 0xc000] = data;
2061         }
2062         return;
2063      }
2064
2065      m_ram_ptr[(offset & 0x1fff) + 0xe000] = data;
2066   }
2067}
2068
2069// floating bus code from old machine/apple2: needs to be reworked based on real beam position to enable e.g. Bob Bishop's screen splitter
2070UINT8 apple2e_state::read_floatingbus()
2071{
2072   enum
2073   {
2074      // scanner types
2075      kScannerNone = 0, kScannerApple2, kScannerApple2e,
2076
2077      // scanner constants
2078      kHBurstClock      =    53, // clock when Color Burst starts
2079      kHBurstClocks     =     4, // clocks per Color Burst duration
2080      kHClock0State     =  0x18, // H[543210] = 011000
2081      kHClocks          =    65, // clocks per horizontal scan (including HBL)
2082      kHPEClock         =    40, // clock when HPE (horizontal preset enable) goes low
2083      kHPresetClock     =    41, // clock when H state presets
2084      kHSyncClock       =    49, // clock when HSync starts
2085      kHSyncClocks      =     4, // clocks per HSync duration
2086      kNTSCScanLines    =   262, // total scan lines including VBL (NTSC)
2087      kNTSCVSyncLine    =   224, // line when VSync starts (NTSC)
2088      kPALScanLines     =   312, // total scan lines including VBL (PAL)
2089      kPALVSyncLine     =   264, // line when VSync starts (PAL)
2090      kVLine0State      = 0x100, // V[543210CBA] = 100000000
2091      kVPresetLine      =   256, // line when V state presets
2092      kVSyncLines       =     4, // lines per VSync duration
2093      kClocksPerVSync   = kHClocks * kNTSCScanLines // FIX: NTSC only?
2094   };
2095
2096   // vars
2097   //
2098   int i, Hires, Mixed, Page2, _80Store, ScanLines, /* VSyncLine, ScanCycles,*/
2099      h_clock, h_state, h_0, h_1, h_2, h_3, h_4, h_5,
2100      v_line, v_state, v_A, v_B, v_C, v_0, v_1, v_2, v_3, v_4, /* v_5, */
2101      _hires, addend0, addend1, addend2, sum, address;
2102
2103   // video scanner data
2104   //
2105   i = m_maincpu->total_cycles() % kClocksPerVSync; // cycles into this VSync
2106
2107   // machine state switches
2108   //
2109   Hires    = m_video->m_hires ? 1 : 0;
2110   Mixed    = m_video->m_mix ? 1 : 0;
2111   Page2    = m_page2 ? 1 : 0;
2112   _80Store = m_80store ? 1 : 0;
2113
2114   // calculate video parameters according to display standard
2115   //
2116   ScanLines  = 1 ? kNTSCScanLines : kPALScanLines; // FIX: NTSC only?
2117   // VSyncLine  = 1 ? kNTSCVSyncLine : kPALVSyncLine; // FIX: NTSC only?
2118   // ScanCycles = ScanLines * kHClocks;
2119
2120   // calculate horizontal scanning state
2121   //
2122   h_clock = (i + kHPEClock) % kHClocks; // which horizontal scanning clock
2123   h_state = kHClock0State + h_clock; // H state bits
2124   if (h_clock >= kHPresetClock) // check for horizontal preset
2125   {
2126      h_state -= 1; // correct for state preset (two 0 states)
2127   }
2128   h_0 = (h_state >> 0) & 1; // get horizontal state bits
2129   h_1 = (h_state >> 1) & 1;
2130   h_2 = (h_state >> 2) & 1;
2131   h_3 = (h_state >> 3) & 1;
2132   h_4 = (h_state >> 4) & 1;
2133   h_5 = (h_state >> 5) & 1;
2134
2135   // calculate vertical scanning state
2136   //
2137   v_line  = i / kHClocks; // which vertical scanning line
2138   v_state = kVLine0State + v_line; // V state bits
2139   if ((v_line >= kVPresetLine)) // check for previous vertical state preset
2140   {
2141      v_state -= ScanLines; // compensate for preset
2142   }
2143   v_A = (v_state >> 0) & 1; // get vertical state bits
2144   v_B = (v_state >> 1) & 1;
2145   v_C = (v_state >> 2) & 1;
2146   v_0 = (v_state >> 3) & 1;
2147   v_1 = (v_state >> 4) & 1;
2148   v_2 = (v_state >> 5) & 1;
2149   v_3 = (v_state >> 6) & 1;
2150   v_4 = (v_state >> 7) & 1;
2151   //v_5 = (v_state >> 8) & 1;
2152
2153   // calculate scanning memory address
2154   //
2155   _hires = Hires;
2156   if (Hires && Mixed && (v_4 & v_2))
2157   {
2158      _hires = 0; // (address is in text memory)
2159   }
2160
2161   addend0 = 0x68; // 1            1            0            1
2162   addend1 =              (h_5 << 5) | (h_4 << 4) | (h_3 << 3);
2163   addend2 = (v_4 << 6) | (v_3 << 5) | (v_4 << 4) | (v_3 << 3);
2164   sum     = (addend0 + addend1 + addend2) & (0x0F << 3);
2165
2166   address = 0;
2167   address |= h_0 << 0; // a0
2168   address |= h_1 << 1; // a1
2169   address |= h_2 << 2; // a2
2170   address |= sum;      // a3 - aa6
2171   address |= v_0 << 7; // a7
2172   address |= v_1 << 8; // a8
2173   address |= v_2 << 9; // a9
2174   address |= ((_hires) ? v_A : (1 ^ (Page2 & (1 ^ _80Store)))) << 10; // a10
2175   address |= ((_hires) ? v_B : (Page2 & (1 ^ _80Store))) << 11; // a11
2176   if (_hires) // hires?
2177   {
2178      // Y: insert hires only address bits
2179      //
2180      address |= v_C << 12; // a12
2181      address |= (1 ^ (Page2 & (1 ^ _80Store))) << 13; // a13
2182      address |= (Page2 & (1 ^ _80Store)) << 14; // a14
2183   }
2184   else
2185   {
2186      // N: text, so no higher address bits unless Apple ][, not Apple //e
2187      //
2188      if ((1) && // Apple ][? // FIX: check for Apple ][? (FB is most useful in old games)
2189         (kHPEClock <= h_clock) && // Y: HBL?
2190         (h_clock <= (kHClocks - 1)))
2191      {
2192         address |= 1 << 12; // Y: a12 (add $1000 to address!)
2193      }
2194   }
2195
2196   return m_ram_ptr[address % m_ram_size]; // FIX: this seems to work, but is it right!?
2197}
2198
2199/***************************************************************************
2200    ADDRESS MAP
2201***************************************************************************/
2202
2203READ8_MEMBER(apple2e_state::ram0000_r)  { return m_ram_ptr[offset]; }
2204WRITE8_MEMBER(apple2e_state::ram0000_w) { m_ram_ptr[offset] = data; }
2205READ8_MEMBER(apple2e_state::ram0200_r)  { return m_ram_ptr[offset+0x200]; }
2206WRITE8_MEMBER(apple2e_state::ram0200_w) { m_ram_ptr[offset+0x200] = data; }
2207READ8_MEMBER(apple2e_state::ram0400_r)  { return m_ram_ptr[offset+0x400]; }
2208WRITE8_MEMBER(apple2e_state::ram0400_w) { m_ram_ptr[offset+0x400] = data; }
2209READ8_MEMBER(apple2e_state::ram0800_r)  { return m_ram_ptr[offset+0x800]; }
2210WRITE8_MEMBER(apple2e_state::ram0800_w) { m_ram_ptr[offset+0x800] = data; }
2211READ8_MEMBER(apple2e_state::ram2000_r)  { return m_ram_ptr[offset+0x2000]; }
2212WRITE8_MEMBER(apple2e_state::ram2000_w) { m_ram_ptr[offset+0x2000] = data; }
2213READ8_MEMBER(apple2e_state::ram4000_r)  { return m_ram_ptr[offset+0x4000]; }
2214WRITE8_MEMBER(apple2e_state::ram4000_w) { m_ram_ptr[offset+0x4000] = data; }
2215
2216READ8_MEMBER(apple2e_state::auxram0000_r)  { if (m_aux_bank_ptr) { return m_aux_bank_ptr[offset]; } else { return read_floatingbus(); } }
2217WRITE8_MEMBER(apple2e_state::auxram0000_w) { if (m_aux_bank_ptr) { m_aux_bank_ptr[offset] = data; } }
2218READ8_MEMBER(apple2e_state::auxram0200_r)  { if (m_aux_bank_ptr) { return m_aux_bank_ptr[offset+0x200]; } else { return read_floatingbus(); } }
2219WRITE8_MEMBER(apple2e_state::auxram0200_w) { if (m_aux_bank_ptr) { m_aux_bank_ptr[offset+0x200] = data; } }
2220READ8_MEMBER(apple2e_state::auxram0400_r)  { if (m_aux_bank_ptr) { return m_aux_bank_ptr[offset+0x400]; } else { return read_floatingbus(); } }
2221WRITE8_MEMBER(apple2e_state::auxram0400_w) { if (m_aux_bank_ptr) { m_aux_bank_ptr[offset+0x400] = data; } }
2222READ8_MEMBER(apple2e_state::auxram0800_r)  { if (m_aux_bank_ptr) { return m_aux_bank_ptr[offset+0x800]; } else { return read_floatingbus(); } }
2223WRITE8_MEMBER(apple2e_state::auxram0800_w) { if (m_aux_bank_ptr) { m_aux_bank_ptr[offset+0x800] = data; } }
2224READ8_MEMBER(apple2e_state::auxram2000_r)  { if (m_aux_bank_ptr) { return m_aux_bank_ptr[offset+0x2000]; } else { return read_floatingbus(); } }
2225WRITE8_MEMBER(apple2e_state::auxram2000_w) { if (m_aux_bank_ptr) { m_aux_bank_ptr[offset+0x2000] = data; } }
2226READ8_MEMBER(apple2e_state::auxram4000_r)  { if (m_aux_bank_ptr) { return m_aux_bank_ptr[offset+0x4000]; } else { return read_floatingbus(); } }
2227WRITE8_MEMBER(apple2e_state::auxram4000_w) { if (m_aux_bank_ptr) { m_aux_bank_ptr[offset+0x4000] = data; } }
2228
2229static ADDRESS_MAP_START( apple2e_map, AS_PROGRAM, 8, apple2e_state )
2230   AM_RANGE(0x0000, 0x01ff) AM_DEVICE(A2_0000_TAG, address_map_bank_device, amap8)
2231   AM_RANGE(0x0200, 0x03ff) AM_DEVICE(A2_0200_TAG, address_map_bank_device, amap8)
2232   AM_RANGE(0x0400, 0x07ff) AM_DEVICE(A2_0400_TAG, address_map_bank_device, amap8)
2233   AM_RANGE(0x0800, 0x1fff) AM_DEVICE(A2_0800_TAG, address_map_bank_device, amap8)
2234   AM_RANGE(0x2000, 0x3fff) AM_DEVICE(A2_2000_TAG, address_map_bank_device, amap8)
2235   AM_RANGE(0x4000, 0xbfff) AM_DEVICE(A2_4000_TAG, address_map_bank_device, amap8)
2236   AM_RANGE(0xc000, 0xc07f) AM_READWRITE(c000_r, c000_w)
2237   AM_RANGE(0xc080, 0xc0ff) AM_READWRITE(c080_r, c080_w)
2238   AM_RANGE(0xc100, 0xc2ff) AM_DEVICE(A2_C100_TAG, address_map_bank_device, amap8)
2239   AM_RANGE(0xc300, 0xc3ff) AM_DEVICE(A2_C300_TAG, address_map_bank_device, amap8)
2240   AM_RANGE(0xc400, 0xc7ff) AM_DEVICE(A2_C400_TAG, address_map_bank_device, amap8)
2241   AM_RANGE(0xc800, 0xcfff) AM_DEVICE(A2_C800_TAG, address_map_bank_device, amap8)
2242   AM_RANGE(0xd000, 0xffff) AM_DEVICE(A2_UPPERBANK_TAG, address_map_bank_device, amap8)
2243ADDRESS_MAP_END
2244
2245static ADDRESS_MAP_START( apple2c_map, AS_PROGRAM, 8, apple2e_state )
2246   AM_RANGE(0x0000, 0x01ff) AM_DEVICE(A2_0000_TAG, address_map_bank_device, amap8)
2247   AM_RANGE(0x0200, 0x03ff) AM_DEVICE(A2_0200_TAG, address_map_bank_device, amap8)
2248   AM_RANGE(0x0400, 0x07ff) AM_DEVICE(A2_0400_TAG, address_map_bank_device, amap8)
2249   AM_RANGE(0x0800, 0x1fff) AM_DEVICE(A2_0800_TAG, address_map_bank_device, amap8)
2250   AM_RANGE(0x2000, 0x3fff) AM_DEVICE(A2_2000_TAG, address_map_bank_device, amap8)
2251   AM_RANGE(0x4000, 0xbfff) AM_DEVICE(A2_4000_TAG, address_map_bank_device, amap8)
2252   AM_RANGE(0xc000, 0xc07f) AM_READWRITE(c000_iic_r, c000_iic_w)
2253   AM_RANGE(0xc098, 0xc09b) AM_DEVREADWRITE(IIC_ACIA1_TAG, mos6551_device, read, write)
2254   AM_RANGE(0xc0a8, 0xc0ab) AM_DEVREADWRITE(IIC_ACIA2_TAG, mos6551_device, read, write)
2255   AM_RANGE(0xc080, 0xc0ff) AM_READWRITE(c080_r, c080_w)
2256   AM_RANGE(0xc100, 0xc2ff) AM_DEVICE(A2_C100_TAG, address_map_bank_device, amap8)
2257   AM_RANGE(0xc300, 0xc3ff) AM_DEVICE(A2_C300_TAG, address_map_bank_device, amap8)
2258   AM_RANGE(0xc400, 0xc7ff) AM_DEVICE(A2_C400_TAG, address_map_bank_device, amap8)
2259   AM_RANGE(0xc800, 0xcfff) AM_DEVICE(A2_C800_TAG, address_map_bank_device, amap8)
2260   AM_RANGE(0xd000, 0xffff) AM_DEVICE(A2_UPPERBANK_TAG, address_map_bank_device, amap8)
2261ADDRESS_MAP_END
2262
2263static ADDRESS_MAP_START( apple2c_memexp_map, AS_PROGRAM, 8, apple2e_state )
2264   AM_RANGE(0x0000, 0x01ff) AM_DEVICE(A2_0000_TAG, address_map_bank_device, amap8)
2265   AM_RANGE(0x0200, 0x03ff) AM_DEVICE(A2_0200_TAG, address_map_bank_device, amap8)
2266   AM_RANGE(0x0400, 0x07ff) AM_DEVICE(A2_0400_TAG, address_map_bank_device, amap8)
2267   AM_RANGE(0x0800, 0x1fff) AM_DEVICE(A2_0800_TAG, address_map_bank_device, amap8)
2268   AM_RANGE(0x2000, 0x3fff) AM_DEVICE(A2_2000_TAG, address_map_bank_device, amap8)
2269   AM_RANGE(0x4000, 0xbfff) AM_DEVICE(A2_4000_TAG, address_map_bank_device, amap8)
2270   AM_RANGE(0xc000, 0xc07f) AM_READWRITE(c000_iic_r, c000_iic_w)
2271   AM_RANGE(0xc098, 0xc09b) AM_DEVREADWRITE(IIC_ACIA1_TAG, mos6551_device, read, write)
2272   AM_RANGE(0xc0a8, 0xc0ab) AM_DEVREADWRITE(IIC_ACIA2_TAG, mos6551_device, read, write)
2273   AM_RANGE(0xc0c0, 0xc0c3) AM_READWRITE(memexp_r, memexp_w)
2274   AM_RANGE(0xc080, 0xc0ff) AM_READWRITE(c080_r, c080_w)
2275   AM_RANGE(0xc100, 0xc2ff) AM_DEVICE(A2_C100_TAG, address_map_bank_device, amap8)
2276   AM_RANGE(0xc300, 0xc3ff) AM_DEVICE(A2_C300_TAG, address_map_bank_device, amap8)
2277   AM_RANGE(0xc400, 0xc7ff) AM_DEVICE(A2_C400_TAG, address_map_bank_device, amap8)
2278   AM_RANGE(0xc800, 0xcfff) AM_DEVICE(A2_C800_TAG, address_map_bank_device, amap8)
2279   AM_RANGE(0xd000, 0xffff) AM_DEVICE(A2_UPPERBANK_TAG, address_map_bank_device, amap8)
2280ADDRESS_MAP_END
2281
2282static ADDRESS_MAP_START( r0000bank_map, AS_PROGRAM, 8, apple2e_state )
2283   AM_RANGE(0x0000, 0x01ff) AM_READWRITE(ram0000_r, ram0000_w)
2284   AM_RANGE(0x0200, 0x03ff) AM_READWRITE(auxram0000_r, auxram0000_w)
2285ADDRESS_MAP_END
2286
2287static ADDRESS_MAP_START( r0200bank_map, AS_PROGRAM, 8, apple2e_state )
2288   AM_RANGE(0x0000, 0x01ff) AM_READWRITE(ram0200_r, ram0200_w)   // wr 0 rd 0
2289   AM_RANGE(0x0200, 0x03ff) AM_READWRITE(auxram0200_r, ram0200_w) // wr 0 rd 1
2290   AM_RANGE(0x0400, 0x05ff) AM_READWRITE(ram0200_r, auxram0200_w) // wr 1 rd 0
2291   AM_RANGE(0x0600, 0x07ff) AM_READWRITE(auxram0200_r, auxram0200_w) // wr 1 rd 1
2292ADDRESS_MAP_END
2293
2294static ADDRESS_MAP_START( r0400bank_map, AS_PROGRAM, 8, apple2e_state )
2295   AM_RANGE(0x0000, 0x03ff) AM_READWRITE(ram0400_r, ram0400_w)   // wr 0 rd 0
2296   AM_RANGE(0x0400, 0x07ff) AM_READWRITE(auxram0400_r, ram0400_w)   // wr 0 rd 1
2297   AM_RANGE(0x0800, 0x0bff) AM_READWRITE(ram0400_r, auxram0400_w)   // wr 1 rd 0
2298   AM_RANGE(0x0c00, 0x0fff) AM_READWRITE(auxram0400_r, auxram0400_w) // wr 1 rd 1
2299ADDRESS_MAP_END
2300
2301static ADDRESS_MAP_START( r0800bank_map, AS_PROGRAM, 8, apple2e_state )
2302   AM_RANGE(0x0000, 0x17ff) AM_READWRITE(ram0800_r, ram0800_w)
2303   AM_RANGE(0x2000, 0x37ff) AM_READWRITE(auxram0800_r, ram0800_w)
2304   AM_RANGE(0x4000, 0x57ff) AM_READWRITE(ram0800_r, auxram0800_w)
2305   AM_RANGE(0x6000, 0x77ff) AM_READWRITE(auxram0800_r, auxram0800_w)
2306ADDRESS_MAP_END
2307
2308static ADDRESS_MAP_START( r2000bank_map, AS_PROGRAM, 8, apple2e_state )
2309   AM_RANGE(0x0000, 0x1fff) AM_READWRITE(ram2000_r, ram2000_w)
2310   AM_RANGE(0x2000, 0x3fff) AM_READWRITE(auxram2000_r, ram2000_w)
2311   AM_RANGE(0x4000, 0x5fff) AM_READWRITE(ram2000_r, auxram2000_w)
2312   AM_RANGE(0x6000, 0x7fff) AM_READWRITE(auxram2000_r, auxram2000_w)
2313ADDRESS_MAP_END
2314
2315static ADDRESS_MAP_START( r4000bank_map, AS_PROGRAM, 8, apple2e_state )
2316   AM_RANGE(0x00000, 0x07fff) AM_READWRITE(ram4000_r, ram4000_w)
2317   AM_RANGE(0x08000, 0x0ffff) AM_READWRITE(auxram4000_r, ram4000_w)
2318   AM_RANGE(0x10000, 0x17fff) AM_READWRITE(ram4000_r, auxram4000_w)
2319   AM_RANGE(0x18000, 0x1ffff) AM_READWRITE(auxram4000_r, auxram4000_w)
2320ADDRESS_MAP_END
2321
2322static ADDRESS_MAP_START( c100bank_map, AS_PROGRAM, 8, apple2e_state )
2323   AM_RANGE(0x0000, 0x01ff) AM_READWRITE(c100_r, c100_w)
2324   AM_RANGE(0x0200, 0x03ff) AM_READ(c100_int_r) AM_WRITENOP
2325   AM_RANGE(0x0400, 0x05ff) AM_READ(c100_int_bank_r) AM_WRITENOP
2326ADDRESS_MAP_END
2327
2328static ADDRESS_MAP_START( c300bank_map, AS_PROGRAM, 8, apple2e_state )
2329   AM_RANGE(0x0000, 0x00ff) AM_READWRITE(c300_r, c300_w)
2330   AM_RANGE(0x0100, 0x01ff) AM_READ(c300_int_r) AM_WRITENOP
2331   AM_RANGE(0x0200, 0x02ff) AM_READ(c300_int_bank_r) AM_WRITENOP
2332ADDRESS_MAP_END
2333
2334static ADDRESS_MAP_START( c400bank_map, AS_PROGRAM, 8, apple2e_state )
2335   AM_RANGE(0x0000, 0x03ff) AM_READWRITE(c400_r, c400_w)
2336   AM_RANGE(0x0400, 0x07ff) AM_READ(c400_int_r) AM_WRITENOP
2337   AM_RANGE(0x0800, 0x0bff) AM_READ(c400_int_bank_r) AM_WRITENOP
2338ADDRESS_MAP_END
2339
2340static ADDRESS_MAP_START( c800bank_map, AS_PROGRAM, 8, apple2e_state )
2341   AM_RANGE(0x0000, 0x07ff) AM_READWRITE(c800_r, c800_w)
2342   AM_RANGE(0x0800, 0x0fff) AM_ROM AM_REGION("maincpu", 0x800)
2343   AM_RANGE(0x1000, 0x17ff) AM_ROM AM_REGION("maincpu", 0x4800)
2344ADDRESS_MAP_END
2345
2346static ADDRESS_MAP_START( inhbank_map, AS_PROGRAM, 8, apple2e_state )
2347   AM_RANGE(0x0000, 0x2fff) AM_DEVICE(A2_LCBANK_TAG, address_map_bank_device, amap8)
2348   AM_RANGE(0x3000, 0x5fff) AM_READWRITE(inh_r, inh_w)
2349ADDRESS_MAP_END
2350
2351static ADDRESS_MAP_START( lcbank_map, AS_PROGRAM, 8, apple2e_state )
2352   AM_RANGE(0x0000, 0x2fff) AM_ROM AM_REGION("maincpu", 0x1000) AM_WRITE(lc_w)
2353   AM_RANGE(0x3000, 0x5fff) AM_READWRITE(lc_r, lc_w)
2354   AM_RANGE(0x6000, 0x8fff) AM_ROM AM_REGION("maincpu", 0x5000) AM_WRITE(lc_w)
2355ADDRESS_MAP_END
2356
2357/***************************************************************************
2358    KEYBOARD
2359***************************************************************************/
2360
2361READ_LINE_MEMBER(apple2e_state::ay3600_shift_r)
2362{
2363   // either shift key
2364   if (m_kbspecial->read() & 0x06)
2365   {
2366      return ASSERT_LINE;
2367   }
2368
2369   return CLEAR_LINE;
2370}
2371
2372READ_LINE_MEMBER(apple2e_state::ay3600_control_r)
2373{
2374   if (m_kbspecial->read() & 0x08)
2375   {
2376      return ASSERT_LINE;
2377   }
2378
2379   return CLEAR_LINE;
2380}
2381
2382WRITE_LINE_MEMBER(apple2e_state::ay3600_data_ready_w)
2383{
2384   if (state == ASSERT_LINE)
2385   {
2386      UINT8 *decode = m_kbdrom->base();
2387      UINT16 trans;
2388
2389      m_lastchar = m_ay3600->b_r();
2390
2391      trans = m_lastchar & ~(0x1c0);  // clear the 3600's control/shift stuff
2392      trans |= (m_lastchar & 0x100)>>2;   // bring the 0x100 bit down to the 0x40 place
2393      trans <<= 2;                    // 4 entries per key
2394      trans |= (m_kbspecial->read() & 0x06) ? 0x00 : 0x01;    // shift is bit 1 (active low)
2395      trans |= (m_kbspecial->read() & 0x08) ? 0x00 : 0x02;    // control is bit 2 (active low)
2396      trans |= (m_kbspecial->read() & 0x01) ? 0x0000 : 0x0200;    // caps lock is bit 9 (active low)
2397
2398      if (m_isiic)
2399      {
2400         if (m_sysconfig->read() & 0x08)
2401         {
2402            trans += 0x400;   // go to DVORAK half of the ROM
2403         }
2404      }
2405
2406      m_transchar = decode[trans];
2407      m_strobe = 0x80;
2408
2409//      printf("new char = %04x (%02x)\n", m_lastchar, m_transchar);
2410   }
2411}
2412
2413WRITE_LINE_MEMBER(apple2e_state::ay3600_ako_w)
2414{
2415   m_anykeydown = (state == ASSERT_LINE) ? true : false;
2416
2417   if (m_anykeydown)
2418   {
2419      m_repeatdelay = 10;
2420   }
2421}
2422
2423TIMER_DEVICE_CALLBACK_MEMBER(apple2e_state::ay3600_repeat)
2424{
2425   // is the key still down?
2426   if (m_anykeydown)
2427   {
2428      if (m_repeatdelay)
2429      {
2430         m_repeatdelay--;
2431      }
2432      else
2433      {
2434         m_strobe = 0x80;
2435      }
2436   }
2437}
2438
2439/***************************************************************************
2440    INPUT PORTS
2441***************************************************************************/
2442
2443static INPUT_PORTS_START( apple2_joystick )
2444   PORT_START("joystick_1_x")      /* Joystick 1 X Axis */
2445   PORT_BIT( 0xff, 0x80, IPT_AD_STICK_X) PORT_NAME("P1 Joystick X")
2446   PORT_SENSITIVITY(JOYSTICK_SENSITIVITY)
2447   PORT_KEYDELTA(JOYSTICK_DELTA)
2448   PORT_CENTERDELTA(JOYSTICK_AUTOCENTER)
2449   PORT_MINMAX(0,0xff) PORT_PLAYER(1)
2450   PORT_CODE_DEC(KEYCODE_4_PAD)    PORT_CODE_INC(KEYCODE_6_PAD)
2451   PORT_CODE_DEC(JOYCODE_X_LEFT_SWITCH)    PORT_CODE_INC(JOYCODE_X_RIGHT_SWITCH)
2452
2453   PORT_START("joystick_1_y")      /* Joystick 1 Y Axis */
2454   PORT_BIT( 0xff, 0x80, IPT_AD_STICK_Y) PORT_NAME("P1 Joystick Y")
2455   PORT_SENSITIVITY(JOYSTICK_SENSITIVITY)
2456   PORT_KEYDELTA(JOYSTICK_DELTA)
2457   PORT_CENTERDELTA(JOYSTICK_AUTOCENTER)
2458   PORT_MINMAX(0,0xff) PORT_PLAYER(1)
2459   PORT_CODE_DEC(KEYCODE_8_PAD)    PORT_CODE_INC(KEYCODE_2_PAD)
2460   PORT_CODE_DEC(JOYCODE_Y_UP_SWITCH)      PORT_CODE_INC(JOYCODE_Y_DOWN_SWITCH)
2461
2462   PORT_START("joystick_2_x")      /* Joystick 2 X Axis */
2463   PORT_BIT( 0xff, 0x80, IPT_AD_STICK_X) PORT_NAME("P2 Joystick X")
2464   PORT_SENSITIVITY(JOYSTICK_SENSITIVITY)
2465   PORT_KEYDELTA(JOYSTICK_DELTA)
2466   PORT_CENTERDELTA(JOYSTICK_AUTOCENTER)
2467   PORT_MINMAX(0,0xff) PORT_PLAYER(2)
2468   PORT_CODE_DEC(JOYCODE_X_LEFT_SWITCH)    PORT_CODE_INC(JOYCODE_X_RIGHT_SWITCH)
2469
2470   PORT_START("joystick_2_y")      /* Joystick 2 Y Axis */
2471   PORT_BIT( 0xff, 0x80, IPT_AD_STICK_Y) PORT_NAME("P2 Joystick Y")
2472   PORT_SENSITIVITY(JOYSTICK_SENSITIVITY)
2473   PORT_KEYDELTA(JOYSTICK_DELTA)
2474   PORT_CENTERDELTA(JOYSTICK_AUTOCENTER)
2475   PORT_MINMAX(0,0xff) PORT_PLAYER(2)
2476   PORT_CODE_DEC(JOYCODE_Y_UP_SWITCH)      PORT_CODE_INC(JOYCODE_Y_DOWN_SWITCH)
2477
2478   PORT_START("joystick_buttons")
2479   PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_BUTTON1)  PORT_PLAYER(1)            PORT_CODE(KEYCODE_0_PAD)    PORT_CODE(JOYCODE_BUTTON1)
2480   PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_BUTTON2)  PORT_PLAYER(1)            PORT_CODE(KEYCODE_ENTER_PAD)PORT_CODE(JOYCODE_BUTTON2)
2481   PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_BUTTON1)  PORT_PLAYER(2)            PORT_CODE(JOYCODE_BUTTON1)
2482INPUT_PORTS_END
2483
2484static INPUT_PORTS_START( apple2_gameport )
2485   PORT_INCLUDE( apple2_joystick )
2486INPUT_PORTS_END
2487
2488static INPUT_PORTS_START( apple2_sysconfig )
2489   PORT_START("a2_config")
2490   PORT_CONFNAME(0x03, 0x00, "Composite monitor type")
2491   PORT_CONFSETTING(0x00, "Color")
2492   PORT_CONFSETTING(0x01, "B&W")
2493   PORT_CONFSETTING(0x02, "Green")
2494   PORT_CONFSETTING(0x03, "Amber")
2495INPUT_PORTS_END
2496
2497static INPUT_PORTS_START( apple2c_sysconfig )
2498   PORT_START("a2_config")
2499   PORT_CONFNAME(0x03, 0x00, "Composite monitor type")
2500   PORT_CONFSETTING(0x00, "Color")
2501   PORT_CONFSETTING(0x01, "B&W")
2502   PORT_CONFSETTING(0x02, "Green")
2503   PORT_CONFSETTING(0x03, "Amber")
2504   PORT_CONFNAME(0x04, 0x04, "40/80 Columns")
2505   PORT_CONFSETTING(0x00, "80 columns")
2506   PORT_CONFSETTING(0x04, "40 columns")
2507   PORT_CONFNAME(0x08, 0x00, "QWERTY/DVORAK")
2508   PORT_CONFSETTING(0x00, "QWERTY")
2509   PORT_CONFSETTING(0x08, "DVORAK")
2510INPUT_PORTS_END
2511
2512   /*
2513     Apple IIe & IIc key matrix (from "Sams ComputerFacts: Apple IIe" and "Sams ComputerFacts: Apple IIc")
2514
2515         | Y0  | Y1  | Y2  | Y3  | Y4  | Y5  | Y6  | Y7  | Y8  | Y9  |
2516         |     |     |     |     |     |     |     |     |     |     |
2517     ----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----|
2518     X0  | ESC |  1  |  2  |  3  |  4  |  6  |  5  |  7  |  8  |  9  |
2519     ----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----|
2520     X1  | TAB |  Q  |  W  |  E  |  R  |  Y  |  T  |  U  |  I  |  O  |
2521     ----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----|
2522     X2  |  A  |  D  |  S  |  H  |  F  |  G  |  J  |  K  | ;:  |  L  |
2523     ----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----|
2524     X3  |  Z  |  X  |  C  |  V  |  B  |  M  |  N  | ,<  | .>  |  /? |
2525     ----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----|
2526     X4  |     |     |     |     |     |     | \|  | +=  |  0  | -_  |
2527     ----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----|
2528     X5  |     |     |     |     |     |     | `~  |  P  | [{  | ]}  |
2529     ----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----|
2530     X6  |     |     |     |     |     |     |RETRN| UP  | SPC | '"  |
2531     ----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----|
2532     X7  |     |     |     |     |     |     | DEL |DOWN |LEFT |RIGHT|
2533     ----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----|
2534   */
2535
2536   /*
2537     Apple IIe platinum key matrix
2538
2539         | Y0  | Y1  | Y2  | Y3  | Y4  | Y5  | Y6  | Y7  | Y8  | Y9  |
2540         |     |     |     |     |     |     |     |     |     |     |
2541     ----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----|
2542     X0  | ESC |  1  |  2  |  3  |  4  |  6  |  5  |  7  |  8  |  9  |
2543     ----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----|
2544     X1  | TAB |  Q  |  W  |  E  |  R  |  Y  |  T  |  U  |  I  |  O  |
2545     ----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----|
2546     X2  |  A  |  D  |  S  |  H  |  F  |  G  |  J  |  K  | ;:  |  L  |
2547     ----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----|
2548     X3  |  Z  |  X  |  C  |  V  |  B  |  M  |  N  | ,<  | .>  |  /? |
2549     ----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----|
2550     X4  | KP/ |     | KP0 | KP1 | KP2 | KP3 | \|  | +=  |  0  | -_  |
2551     ----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----|
2552     X5  |     |KPEsc| KP4 | KP5 | KP6 | KP7 | `~  |  P  | [{  | ]}  |
2553     ----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----|
2554     X6  | KP* |     | KP8 | KP9 | KP. | KP+ |RETRN| UP  | SPC | '"  |
2555     ----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----|
2556     X7  |     |     |     | KP- |KPENT|     | DEL |DOWN |LEFT |RIGHT|
2557     ----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----|
2558   */
2559
2560static INPUT_PORTS_START( apple2e_common )
2561   PORT_START("X0")
2562   PORT_BIT(0x001, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Esc")      PORT_CODE(KEYCODE_ESC)      PORT_CHAR(27)
2563   PORT_BIT(0x002, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_1)      PORT_CHAR('1') PORT_CHAR('!')
2564   PORT_BIT(0x004, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_2)  PORT_CHAR('2') PORT_CHAR('\"')
2565   PORT_BIT(0x008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_3)  PORT_CHAR('3') PORT_CHAR('#')
2566   PORT_BIT(0x010, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_4)  PORT_CHAR('4') PORT_CHAR('$')
2567   PORT_BIT(0x020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_6)  PORT_CHAR('6') PORT_CHAR('&')
2568   PORT_BIT(0x040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_5)  PORT_CHAR('5') PORT_CHAR('%')
2569   PORT_BIT(0x080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_7)  PORT_CHAR('7') PORT_CHAR('\'')
2570   PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_8)  PORT_CHAR('8') PORT_CHAR('(')
2571   PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_9)  PORT_CHAR('9') PORT_CHAR(')')
2572
2573   PORT_START("X1")
2574   PORT_BIT(0x001, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Tab")      PORT_CODE(KEYCODE_TAB)      PORT_CHAR(9)
2575   PORT_BIT(0x002, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_Q)  PORT_CHAR('Q') PORT_CHAR('q')
2576   PORT_BIT(0x004, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_W)  PORT_CHAR('W') PORT_CHAR('w')
2577   PORT_BIT(0x008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_E)  PORT_CHAR('E') PORT_CHAR('e')
2578   PORT_BIT(0x010, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_R)  PORT_CHAR('R') PORT_CHAR('r')
2579   PORT_BIT(0x020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_Y)  PORT_CHAR('Y') PORT_CHAR('y')
2580   PORT_BIT(0x040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_T)  PORT_CHAR('T') PORT_CHAR('t')
2581   PORT_BIT(0x080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_U)  PORT_CHAR('U') PORT_CHAR('u')
2582   PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_I)  PORT_CHAR('I') PORT_CHAR('i')
2583   PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_O)  PORT_CHAR('O') PORT_CHAR('o')
2584
2585   PORT_START("X2")
2586   PORT_BIT(0x001, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_A)          PORT_CHAR('A') PORT_CHAR('a')
2587   PORT_BIT(0x002, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_D)  PORT_CHAR('D') PORT_CHAR('d')
2588   PORT_BIT(0x004, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_S)  PORT_CHAR('S') PORT_CHAR('s')
2589   PORT_BIT(0x008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_H)  PORT_CHAR('H') PORT_CHAR('h')
2590   PORT_BIT(0x010, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_F)  PORT_CHAR('F') PORT_CHAR('f')
2591   PORT_BIT(0x020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_G)  PORT_CHAR('G') PORT_CHAR('g')
2592   PORT_BIT(0x040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_J)  PORT_CHAR('J') PORT_CHAR('j')
2593   PORT_BIT(0x080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_K)  PORT_CHAR('K') PORT_CHAR('k')
2594   PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_COLON)      PORT_CHAR(';') PORT_CHAR(':')
2595   PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_L)  PORT_CHAR('L') PORT_CHAR('l')
2596
2597   PORT_START("X3")
2598   PORT_BIT(0x001, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_Z)  PORT_CHAR('Z') PORT_CHAR('z')
2599   PORT_BIT(0x002, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_X)  PORT_CHAR('X') PORT_CHAR('x')
2600   PORT_BIT(0x004, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_C)  PORT_CHAR('C') PORT_CHAR('c')
2601   PORT_BIT(0x008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_V)  PORT_CHAR('V') PORT_CHAR('v')
2602   PORT_BIT(0x010, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_B)  PORT_CHAR('B') PORT_CHAR('b')
2603   PORT_BIT(0x020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_N)  PORT_CHAR('N') PORT_CHAR('n')
2604   PORT_BIT(0x040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_M)  PORT_CHAR('M') PORT_CHAR('m')
2605   PORT_BIT(0x080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_COMMA)  PORT_CHAR(',') PORT_CHAR('<')
2606   PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_STOP)   PORT_CHAR('.') PORT_CHAR('>')
2607   PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_SLASH)  PORT_CHAR('/') PORT_CHAR('?')
2608
2609   PORT_START("X4")
2610   PORT_BIT(0x001, IP_ACTIVE_HIGH, IPT_UNUSED)
2611   PORT_BIT(0x002, IP_ACTIVE_HIGH, IPT_UNUSED)
2612   PORT_BIT(0x004, IP_ACTIVE_HIGH, IPT_UNUSED)
2613   PORT_BIT(0x008, IP_ACTIVE_HIGH, IPT_UNUSED)
2614   PORT_BIT(0x010, IP_ACTIVE_HIGH, IPT_UNUSED)
2615   PORT_BIT(0x020, IP_ACTIVE_HIGH, IPT_UNUSED)
2616   PORT_BIT(0x040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_BACKSLASH)  PORT_CHAR('\\') PORT_CHAR('|')
2617   PORT_BIT(0x080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_EQUALS)     PORT_CHAR('=') PORT_CHAR('+')
2618   PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_0)      PORT_CHAR('0') PORT_CHAR(')')
2619   PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_MINUS)  PORT_CHAR('-') PORT_CHAR('_')
2620
2621   PORT_START("X5")
2622   PORT_BIT(0x001, IP_ACTIVE_HIGH, IPT_UNUSED)
2623   PORT_BIT(0x002, IP_ACTIVE_HIGH, IPT_UNUSED)
2624   PORT_BIT(0x004, IP_ACTIVE_HIGH, IPT_UNUSED)
2625   PORT_BIT(0x008, IP_ACTIVE_HIGH, IPT_UNUSED)
2626   PORT_BIT(0x010, IP_ACTIVE_HIGH, IPT_UNUSED)
2627   PORT_BIT(0x020, IP_ACTIVE_HIGH, IPT_UNUSED)
2628   PORT_BIT(0x040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_TILDE)      PORT_CHAR('`') PORT_CHAR('~')
2629   PORT_BIT(0x080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_P)  PORT_CHAR('P') PORT_CHAR('p')
2630   PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_OPENBRACE)  PORT_CHAR('[') PORT_CHAR('{')
2631   PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_CLOSEBRACE) PORT_CHAR(']') PORT_CHAR('}')
2632
2633   PORT_START("X6")
2634   PORT_BIT(0x001, IP_ACTIVE_HIGH, IPT_UNUSED)
2635   PORT_BIT(0x002, IP_ACTIVE_HIGH, IPT_UNUSED)
2636   PORT_BIT(0x004, IP_ACTIVE_HIGH, IPT_UNUSED)
2637   PORT_BIT(0x008, IP_ACTIVE_HIGH, IPT_UNUSED)
2638   PORT_BIT(0x010, IP_ACTIVE_HIGH, IPT_UNUSED)
2639   PORT_BIT(0x020, IP_ACTIVE_HIGH, IPT_UNUSED)
2640   PORT_BIT(0x040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Return")   PORT_CODE(KEYCODE_ENTER)    PORT_CHAR(13)
2641   PORT_BIT(0x080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME(UTF8_UP)        PORT_CODE(KEYCODE_UP)
2642   PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_SPACE)  PORT_CHAR(' ')
2643   PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_QUOTE)  PORT_CHAR('\'') PORT_CHAR('\"')
2644
2645   PORT_START("X7")
2646   PORT_BIT(0x001, IP_ACTIVE_HIGH, IPT_UNUSED)
2647   PORT_BIT(0x002, IP_ACTIVE_HIGH, IPT_UNUSED)
2648   PORT_BIT(0x004, IP_ACTIVE_HIGH, IPT_UNUSED)
2649   PORT_BIT(0x008, IP_ACTIVE_HIGH, IPT_UNUSED)
2650   PORT_BIT(0x010, IP_ACTIVE_HIGH, IPT_UNUSED)
2651   PORT_BIT(0x020, IP_ACTIVE_HIGH, IPT_UNUSED)
2652   PORT_BIT(0x040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Delete")   PORT_CODE(KEYCODE_BACKSPACE)PORT_CHAR(8)
2653   PORT_BIT(0x080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME(UTF8_DOWN)      PORT_CODE(KEYCODE_DOWN)     PORT_CHAR(10)
2654   PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME(UTF8_LEFT)      PORT_CODE(KEYCODE_LEFT)
2655   PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME(UTF8_RIGHT)     PORT_CODE(KEYCODE_RIGHT)
2656
2657   PORT_START("X8")
2658   PORT_BIT(0x001, IP_ACTIVE_HIGH, IPT_UNUSED)
2659   PORT_BIT(0x002, IP_ACTIVE_HIGH, IPT_UNUSED)
2660   PORT_BIT(0x004, IP_ACTIVE_HIGH, IPT_UNUSED)
2661   PORT_BIT(0x008, IP_ACTIVE_HIGH, IPT_UNUSED)
2662   PORT_BIT(0x010, IP_ACTIVE_HIGH, IPT_UNUSED)
2663   PORT_BIT(0x020, IP_ACTIVE_HIGH, IPT_UNUSED)
2664   PORT_BIT(0x040, IP_ACTIVE_HIGH, IPT_UNUSED)
2665   PORT_BIT(0x080, IP_ACTIVE_HIGH, IPT_UNUSED)
2666   PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_UNUSED)
2667   PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_UNUSED)
2668
2669   PORT_START("keyb_special")
2670   PORT_BIT( 0x01, IP_ACTIVE_LOW,  IPT_KEYBOARD) PORT_NAME("Caps Lock")    PORT_CODE(KEYCODE_CAPSLOCK) PORT_TOGGLE
2671   PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Left Shift")   PORT_CODE(KEYCODE_LSHIFT)   PORT_CHAR(UCHAR_SHIFT_1)
2672   PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Right Shift")  PORT_CODE(KEYCODE_RSHIFT)   PORT_CHAR(UCHAR_SHIFT_1)
2673   PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Control")      PORT_CODE(KEYCODE_LCONTROL) PORT_CHAR(UCHAR_SHIFT_2)
2674   PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Open Apple")   PORT_CODE(KEYCODE_LALT)
2675   PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Solid Apple")  PORT_CODE(KEYCODE_RALT)
2676   PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("RESET")        PORT_CODE(KEYCODE_F12)
2677INPUT_PORTS_END
2678
2679static INPUT_PORTS_START( apple2e )
2680   PORT_INCLUDE( apple2e_common )
2681   PORT_INCLUDE( apple2_gameport )
2682   PORT_INCLUDE( apple2_sysconfig )
2683INPUT_PORTS_END
2684
2685static INPUT_PORTS_START( apple2c )
2686   PORT_INCLUDE( apple2e_common )
2687   PORT_INCLUDE( apple2_gameport )
2688   PORT_INCLUDE( apple2c_sysconfig )
2689
2690   PORT_START(MOUSE_BUTTON_TAG) /* Mouse - button */
2691   PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1) PORT_NAME("Mouse Button") PORT_CODE(MOUSECODE_BUTTON1)
2692
2693   PORT_START(MOUSE_XAXIS_TAG) /* Mouse - X AXIS */
2694   PORT_BIT( 0xff, 0x00, IPT_MOUSE_X) PORT_SENSITIVITY(20) PORT_KEYDELTA(0) PORT_PLAYER(1)
2695
2696   PORT_START(MOUSE_YAXIS_TAG) /* Mouse - Y AXIS */
2697   PORT_BIT( 0xff, 0x00, IPT_MOUSE_Y) PORT_SENSITIVITY(20) PORT_KEYDELTA(0) PORT_PLAYER(1)
2698INPUT_PORTS_END
2699
2700static INPUT_PORTS_START( apple2euk )
2701   PORT_START("X0")
2702   PORT_BIT(0x001, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Esc")      PORT_CODE(KEYCODE_ESC)      PORT_CHAR(27)
2703   PORT_BIT(0x002, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_1)  PORT_CHAR('1') PORT_CHAR('!')
2704   PORT_BIT(0x004, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_2)  PORT_CHAR('2') PORT_CHAR('\"')
2705   PORT_BIT(0x008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_3)  PORT_CHAR('3') PORT_CHAR(0xa3)  // a3 is Unicode for the pound sign
2706   PORT_BIT(0x010, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_4)  PORT_CHAR('4') PORT_CHAR('$')
2707   PORT_BIT(0x020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_6)  PORT_CHAR('6') PORT_CHAR('&')
2708   PORT_BIT(0x040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_5)  PORT_CHAR('5') PORT_CHAR('%')
2709   PORT_BIT(0x080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_7)  PORT_CHAR('7') PORT_CHAR('\'')
2710   PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_8)  PORT_CHAR('8') PORT_CHAR('(')
2711   PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_9)  PORT_CHAR('9') PORT_CHAR(')')
2712
2713   PORT_START("X1")
2714   PORT_BIT(0x001, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Tab")      PORT_CODE(KEYCODE_TAB)      PORT_CHAR(9)
2715   PORT_BIT(0x002, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_Q)  PORT_CHAR('Q') PORT_CHAR('q')
2716   PORT_BIT(0x004, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_W)  PORT_CHAR('W') PORT_CHAR('w')
2717   PORT_BIT(0x008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_E)  PORT_CHAR('E') PORT_CHAR('e')
2718   PORT_BIT(0x010, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_R)  PORT_CHAR('R') PORT_CHAR('r')
2719   PORT_BIT(0x020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_Y)  PORT_CHAR('Y') PORT_CHAR('y')
2720   PORT_BIT(0x040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_T)  PORT_CHAR('T') PORT_CHAR('t')
2721   PORT_BIT(0x080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_U)  PORT_CHAR('U') PORT_CHAR('u')
2722   PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_I)  PORT_CHAR('I') PORT_CHAR('i')
2723   PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_O)  PORT_CHAR('O') PORT_CHAR('o')
2724
2725   PORT_START("X2")
2726   PORT_BIT(0x001, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_A)          PORT_CHAR('A') PORT_CHAR('a')
2727   PORT_BIT(0x002, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_D)  PORT_CHAR('D') PORT_CHAR('d')
2728   PORT_BIT(0x004, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_S)  PORT_CHAR('S') PORT_CHAR('s')
2729   PORT_BIT(0x008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_H)  PORT_CHAR('H') PORT_CHAR('h')
2730   PORT_BIT(0x010, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_F)  PORT_CHAR('F') PORT_CHAR('f')
2731   PORT_BIT(0x020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_G)  PORT_CHAR('G') PORT_CHAR('g')
2732   PORT_BIT(0x040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_J)  PORT_CHAR('J') PORT_CHAR('j')
2733   PORT_BIT(0x080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_K)  PORT_CHAR('K') PORT_CHAR('k')
2734   PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_COLON)      PORT_CHAR(';') PORT_CHAR(':')
2735   PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_L)  PORT_CHAR('L') PORT_CHAR('l')
2736
2737   PORT_START("X3")
2738   PORT_BIT(0x001, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_Z)  PORT_CHAR('Z') PORT_CHAR('z')
2739   PORT_BIT(0x002, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_X)  PORT_CHAR('X') PORT_CHAR('x')
2740   PORT_BIT(0x004, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_C)  PORT_CHAR('C') PORT_CHAR('c')
2741   PORT_BIT(0x008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_V)  PORT_CHAR('V') PORT_CHAR('v')
2742   PORT_BIT(0x010, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_B)  PORT_CHAR('B') PORT_CHAR('b')
2743   PORT_BIT(0x020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_N)  PORT_CHAR('N') PORT_CHAR('n')
2744   PORT_BIT(0x040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_M)  PORT_CHAR('M') PORT_CHAR('m')
2745   PORT_BIT(0x080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_COMMA)  PORT_CHAR(',') PORT_CHAR('<')
2746   PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_STOP)   PORT_CHAR('.') PORT_CHAR('>')
2747   PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_SLASH)  PORT_CHAR('/') PORT_CHAR('?')
2748
2749   PORT_START("X4")
2750   PORT_BIT(0x001, IP_ACTIVE_HIGH, IPT_UNUSED)
2751   PORT_BIT(0x002, IP_ACTIVE_HIGH, IPT_UNUSED)
2752   PORT_BIT(0x004, IP_ACTIVE_HIGH, IPT_UNUSED)
2753   PORT_BIT(0x008, IP_ACTIVE_HIGH, IPT_UNUSED)
2754   PORT_BIT(0x010, IP_ACTIVE_HIGH, IPT_UNUSED)
2755   PORT_BIT(0x020, IP_ACTIVE_HIGH, IPT_UNUSED)
2756   PORT_BIT(0x040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_BACKSLASH)  PORT_CHAR('\\') PORT_CHAR('|')
2757   PORT_BIT(0x080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_EQUALS)     PORT_CHAR('=') PORT_CHAR('+')
2758   PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_0)      PORT_CHAR('0') PORT_CHAR(')')
2759   PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_MINUS)  PORT_CHAR('-') PORT_CHAR('_')
2760
2761   PORT_START("X5")
2762   PORT_BIT(0x001, IP_ACTIVE_HIGH, IPT_UNUSED)
2763   PORT_BIT(0x002, IP_ACTIVE_HIGH, IPT_UNUSED)
2764   PORT_BIT(0x004, IP_ACTIVE_HIGH, IPT_UNUSED)
2765   PORT_BIT(0x008, IP_ACTIVE_HIGH, IPT_UNUSED)
2766   PORT_BIT(0x010, IP_ACTIVE_HIGH, IPT_UNUSED)
2767   PORT_BIT(0x020, IP_ACTIVE_HIGH, IPT_UNUSED)
2768   PORT_BIT(0x040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_TILDE)      PORT_CHAR('`') PORT_CHAR('~')
2769   PORT_BIT(0x080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_P)  PORT_CHAR('P') PORT_CHAR('p')
2770   PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_OPENBRACE)  PORT_CHAR('[') PORT_CHAR('{')
2771   PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_CLOSEBRACE) PORT_CHAR(']') PORT_CHAR('}')
2772
2773   PORT_START("X6")
2774   PORT_BIT(0x001, IP_ACTIVE_HIGH, IPT_UNUSED)
2775   PORT_BIT(0x002, IP_ACTIVE_HIGH, IPT_UNUSED)
2776   PORT_BIT(0x004, IP_ACTIVE_HIGH, IPT_UNUSED)
2777   PORT_BIT(0x008, IP_ACTIVE_HIGH, IPT_UNUSED)
2778   PORT_BIT(0x010, IP_ACTIVE_HIGH, IPT_UNUSED)
2779   PORT_BIT(0x020, IP_ACTIVE_HIGH, IPT_UNUSED)
2780   PORT_BIT(0x040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Return")   PORT_CODE(KEYCODE_ENTER)    PORT_CHAR(13)
2781   PORT_BIT(0x080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME(UTF8_UP)        PORT_CODE(KEYCODE_UP)
2782   PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_SPACE)  PORT_CHAR(' ')
2783   PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_QUOTE)  PORT_CHAR('\'') PORT_CHAR('\"')
2784
2785   PORT_START("X7")
2786   PORT_BIT(0x001, IP_ACTIVE_HIGH, IPT_UNUSED)
2787   PORT_BIT(0x002, IP_ACTIVE_HIGH, IPT_UNUSED)
2788   PORT_BIT(0x004, IP_ACTIVE_HIGH, IPT_UNUSED)
2789   PORT_BIT(0x008, IP_ACTIVE_HIGH, IPT_UNUSED)
2790   PORT_BIT(0x010, IP_ACTIVE_HIGH, IPT_UNUSED)
2791   PORT_BIT(0x020, IP_ACTIVE_HIGH, IPT_UNUSED)
2792   PORT_BIT(0x040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Delete")   PORT_CODE(KEYCODE_BACKSPACE)PORT_CHAR(8)
2793   PORT_BIT(0x080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME(UTF8_DOWN)      PORT_CODE(KEYCODE_DOWN)     PORT_CHAR(10)
2794   PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME(UTF8_LEFT)      PORT_CODE(KEYCODE_LEFT)
2795   PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME(UTF8_RIGHT)     PORT_CODE(KEYCODE_RIGHT)
2796
2797   PORT_START("X8")
2798   PORT_BIT(0x001, IP_ACTIVE_HIGH, IPT_UNUSED)
2799   PORT_BIT(0x002, IP_ACTIVE_HIGH, IPT_UNUSED)
2800   PORT_BIT(0x004, IP_ACTIVE_HIGH, IPT_UNUSED)
2801   PORT_BIT(0x008, IP_ACTIVE_HIGH, IPT_UNUSED)
2802   PORT_BIT(0x010, IP_ACTIVE_HIGH, IPT_UNUSED)
2803   PORT_BIT(0x020, IP_ACTIVE_HIGH, IPT_UNUSED)
2804   PORT_BIT(0x040, IP_ACTIVE_HIGH, IPT_UNUSED)
2805   PORT_BIT(0x080, IP_ACTIVE_HIGH, IPT_UNUSED)
2806   PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_UNUSED)
2807   PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_UNUSED)
2808
2809   PORT_START("keyb_special")
2810   PORT_BIT( 0x01, IP_ACTIVE_LOW,  IPT_KEYBOARD) PORT_NAME("Caps Lock")    PORT_CODE(KEYCODE_CAPSLOCK) PORT_TOGGLE
2811   PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Left Shift")   PORT_CODE(KEYCODE_LSHIFT)   PORT_CHAR(UCHAR_SHIFT_1)
2812   PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Right Shift")  PORT_CODE(KEYCODE_RSHIFT)   PORT_CHAR(UCHAR_SHIFT_1)
2813   PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Control")      PORT_CODE(KEYCODE_LCONTROL) PORT_CHAR(UCHAR_SHIFT_2)
2814   PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Open Apple")   PORT_CODE(KEYCODE_LALT)
2815   PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Solid Apple")  PORT_CODE(KEYCODE_RALT)
2816   PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("RESET")        PORT_CODE(KEYCODE_F12)
2817
2818   PORT_INCLUDE( apple2_gameport )
2819   PORT_INCLUDE(apple2_sysconfig)
2820INPUT_PORTS_END
2821
2822INPUT_PORTS_START( apple2ep )
2823   PORT_START("X0")
2824   PORT_BIT(0x001, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Esc")      PORT_CODE(KEYCODE_ESC)      PORT_CHAR(27)
2825   PORT_BIT(0x002, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_1)      PORT_CHAR('1') PORT_CHAR('!')
2826   PORT_BIT(0x004, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_2)  PORT_CHAR('2') PORT_CHAR('\"')
2827   PORT_BIT(0x008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_3)  PORT_CHAR('3') PORT_CHAR('#')
2828   PORT_BIT(0x010, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_4)  PORT_CHAR('4') PORT_CHAR('$')
2829   PORT_BIT(0x020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_6)  PORT_CHAR('6') PORT_CHAR('&')
2830   PORT_BIT(0x040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_5)  PORT_CHAR('5') PORT_CHAR('%')
2831   PORT_BIT(0x080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_7)  PORT_CHAR('7') PORT_CHAR('\'')
2832   PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_8)  PORT_CHAR('8') PORT_CHAR('(')
2833   PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_9)  PORT_CHAR('9') PORT_CHAR(')')
2834
2835   PORT_START("X1")
2836   PORT_BIT(0x001, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Tab")      PORT_CODE(KEYCODE_TAB)      PORT_CHAR(9)
2837   PORT_BIT(0x002, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_Q)  PORT_CHAR('Q') PORT_CHAR('q')
2838   PORT_BIT(0x004, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_W)  PORT_CHAR('W') PORT_CHAR('w')
2839   PORT_BIT(0x008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_E)  PORT_CHAR('E') PORT_CHAR('e')
2840   PORT_BIT(0x010, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_R)  PORT_CHAR('R') PORT_CHAR('r')
2841   PORT_BIT(0x020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_Y)  PORT_CHAR('Y') PORT_CHAR('y')
2842   PORT_BIT(0x040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_T)  PORT_CHAR('T') PORT_CHAR('t')
2843   PORT_BIT(0x080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_U)  PORT_CHAR('U') PORT_CHAR('u')
2844   PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_I)  PORT_CHAR('I') PORT_CHAR('i')
2845   PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_O)  PORT_CHAR('O') PORT_CHAR('o')
2846
2847   PORT_START("X2")
2848   PORT_BIT(0x001, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_A)          PORT_CHAR('A') PORT_CHAR('a')
2849   PORT_BIT(0x002, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_D)  PORT_CHAR('D') PORT_CHAR('d')
2850   PORT_BIT(0x004, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_S)  PORT_CHAR('S') PORT_CHAR('s')
2851   PORT_BIT(0x008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_H)  PORT_CHAR('H') PORT_CHAR('h')
2852   PORT_BIT(0x010, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_F)  PORT_CHAR('F') PORT_CHAR('f')
2853   PORT_BIT(0x020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_G)  PORT_CHAR('G') PORT_CHAR('g')
2854   PORT_BIT(0x040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_J)  PORT_CHAR('J') PORT_CHAR('j')
2855   PORT_BIT(0x080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_K)  PORT_CHAR('K') PORT_CHAR('k')
2856   PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_COLON)      PORT_CHAR(';') PORT_CHAR(':')
2857   PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_L)  PORT_CHAR('L') PORT_CHAR('l')
2858
2859   PORT_START("X3")
2860   PORT_BIT(0x001, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_Z)  PORT_CHAR('Z') PORT_CHAR('z')
2861   PORT_BIT(0x002, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_X)  PORT_CHAR('X') PORT_CHAR('x')
2862   PORT_BIT(0x004, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_C)  PORT_CHAR('C') PORT_CHAR('c')
2863   PORT_BIT(0x008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_V)  PORT_CHAR('V') PORT_CHAR('v')
2864   PORT_BIT(0x010, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_B)  PORT_CHAR('B') PORT_CHAR('b')
2865   PORT_BIT(0x020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_N)  PORT_CHAR('N') PORT_CHAR('n')
2866   PORT_BIT(0x040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_M)  PORT_CHAR('M') PORT_CHAR('m')
2867   PORT_BIT(0x080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_COMMA)  PORT_CHAR(',') PORT_CHAR('<')
2868   PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_STOP)   PORT_CHAR('.') PORT_CHAR('>')
2869   PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_SLASH)  PORT_CHAR('/') PORT_CHAR('?')
2870
2871   PORT_START("X4")
2872   PORT_BIT(0x001, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_SLASH_PAD)   PORT_CHAR(UCHAR_MAMEKEY(SLASH_PAD))
2873   PORT_BIT(0x002, IP_ACTIVE_HIGH, IPT_UNUSED)
2874   PORT_BIT(0x004, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_0_PAD)   PORT_CHAR(UCHAR_MAMEKEY(0_PAD))
2875   PORT_BIT(0x008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_1_PAD)   PORT_CHAR(UCHAR_MAMEKEY(1_PAD))
2876   PORT_BIT(0x010, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_2_PAD)   PORT_CHAR(UCHAR_MAMEKEY(2_PAD))
2877   PORT_BIT(0x020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_3_PAD)   PORT_CHAR(UCHAR_MAMEKEY(3_PAD))
2878   PORT_BIT(0x040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_BACKSLASH)  PORT_CHAR('\\') PORT_CHAR('|')
2879   PORT_BIT(0x080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_EQUALS)     PORT_CHAR('=') PORT_CHAR('+')
2880   PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_0)      PORT_CHAR('0') PORT_CHAR(')')
2881   PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_MINUS)  PORT_CHAR('-') PORT_CHAR('_')
2882
2883   PORT_START("X5")
2884   PORT_BIT(0x001, IP_ACTIVE_HIGH, IPT_UNUSED)
2885   PORT_BIT(0x002, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Keypad Esc") PORT_CODE(KEYCODE_NUMLOCK)
2886   PORT_BIT(0x004, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_4_PAD)   PORT_CHAR(UCHAR_MAMEKEY(4_PAD))
2887   PORT_BIT(0x008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_5_PAD)   PORT_CHAR(UCHAR_MAMEKEY(5_PAD))
2888   PORT_BIT(0x010, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_6_PAD)   PORT_CHAR(UCHAR_MAMEKEY(6_PAD))
2889   PORT_BIT(0x020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_7_PAD)   PORT_CHAR(UCHAR_MAMEKEY(7_PAD))
2890   PORT_BIT(0x040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_TILDE)      PORT_CHAR('`') PORT_CHAR('~')
2891   PORT_BIT(0x080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_P)  PORT_CHAR('P') PORT_CHAR('p')
2892   PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_OPENBRACE)  PORT_CHAR('[') PORT_CHAR('{')
2893   PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_CLOSEBRACE) PORT_CHAR(']') PORT_CHAR('}')
2894
2895   PORT_START("X6")
2896   PORT_BIT(0x001, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_ASTERISK)    PORT_CHAR(UCHAR_MAMEKEY(ASTERISK))
2897   PORT_BIT(0x002, IP_ACTIVE_HIGH, IPT_UNUSED)
2898   PORT_BIT(0x004, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_8_PAD)       PORT_CHAR(UCHAR_MAMEKEY(8_PAD))
2899   PORT_BIT(0x008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_9_PAD)       PORT_CHAR(UCHAR_MAMEKEY(9_PAD))
2900   PORT_BIT(0x010, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_DEL_PAD)     PORT_CHAR(UCHAR_MAMEKEY(DEL_PAD))
2901   PORT_BIT(0x020, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_PLUS_PAD)    PORT_CHAR(UCHAR_MAMEKEY(PLUS_PAD))
2902   PORT_BIT(0x040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Return")   PORT_CODE(KEYCODE_ENTER)    PORT_CHAR(13)
2903   PORT_BIT(0x080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME(UTF8_UP)        PORT_CODE(KEYCODE_UP)
2904   PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_SPACE)  PORT_CHAR(' ')
2905   PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_QUOTE)  PORT_CHAR('\'') PORT_CHAR('\"')
2906
2907   PORT_START("X7")
2908   PORT_BIT(0x001, IP_ACTIVE_HIGH, IPT_UNUSED)
2909   PORT_BIT(0x002, IP_ACTIVE_HIGH, IPT_UNUSED)
2910   PORT_BIT(0x004, IP_ACTIVE_HIGH, IPT_UNUSED)
2911   PORT_BIT(0x008, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_MINUS_PAD)   PORT_CHAR(UCHAR_MAMEKEY(MINUS_PAD))
2912   PORT_BIT(0x010, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_ENTER_PAD)   PORT_CHAR(UCHAR_MAMEKEY(ENTER_PAD))
2913   PORT_BIT(0x020, IP_ACTIVE_HIGH, IPT_UNUSED)
2914   PORT_BIT(0x040, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Delete")   PORT_CODE(KEYCODE_BACKSPACE)PORT_CHAR(8)
2915   PORT_BIT(0x080, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME(UTF8_DOWN)      PORT_CODE(KEYCODE_DOWN)     PORT_CHAR(10)
2916   PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME(UTF8_LEFT)      PORT_CODE(KEYCODE_LEFT)
2917   PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME(UTF8_RIGHT)     PORT_CODE(KEYCODE_RIGHT)
2918
2919   PORT_START("X8")
2920   PORT_BIT(0x001, IP_ACTIVE_HIGH, IPT_UNUSED)
2921   PORT_BIT(0x002, IP_ACTIVE_HIGH, IPT_UNUSED)
2922   PORT_BIT(0x004, IP_ACTIVE_HIGH, IPT_UNUSED)
2923   PORT_BIT(0x008, IP_ACTIVE_HIGH, IPT_UNUSED)
2924   PORT_BIT(0x010, IP_ACTIVE_HIGH, IPT_UNUSED)
2925   PORT_BIT(0x020, IP_ACTIVE_HIGH, IPT_UNUSED)
2926   PORT_BIT(0x040, IP_ACTIVE_HIGH, IPT_UNUSED)
2927   PORT_BIT(0x080, IP_ACTIVE_HIGH, IPT_UNUSED)
2928   PORT_BIT(0x100, IP_ACTIVE_HIGH, IPT_UNUSED)
2929   PORT_BIT(0x200, IP_ACTIVE_HIGH, IPT_UNUSED)
2930
2931   PORT_START("keyb_special")
2932   PORT_BIT( 0x01, IP_ACTIVE_LOW,  IPT_KEYBOARD) PORT_NAME("Caps Lock")    PORT_CODE(KEYCODE_CAPSLOCK) PORT_TOGGLE
2933   PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Left Shift")   PORT_CODE(KEYCODE_LSHIFT)   PORT_CHAR(UCHAR_SHIFT_1)
2934   PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Right Shift")  PORT_CODE(KEYCODE_RSHIFT)   PORT_CHAR(UCHAR_SHIFT_1)
2935   PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Control")      PORT_CODE(KEYCODE_LCONTROL) PORT_CHAR(UCHAR_SHIFT_2)
2936   PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Open Apple")   PORT_CODE(KEYCODE_LALT)
2937   PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Solid Apple")  PORT_CODE(KEYCODE_RALT)
2938   PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("RESET")        PORT_CODE(KEYCODE_F12)
2939
2940   PORT_INCLUDE( apple2_gameport )
2941   PORT_INCLUDE(apple2_sysconfig)
2942INPUT_PORTS_END
2943
2944/* according to Steve Nickolas (author of Dapple), our original palette would
2945 * have been more appropriate for an Apple IIgs.  So we've substituted in the
2946 * Robert Munafo palette instead, which is more accurate on 8-bit Apples
2947 */
2948static const rgb_t apple2_palette[] =
2949{
2950   rgb_t::black,
2951   rgb_t(0xE3, 0x1E, 0x60), /* Dark Red */
2952   rgb_t(0x60, 0x4E, 0xBD), /* Dark Blue */
2953   rgb_t(0xFF, 0x44, 0xFD), /* Purple */
2954   rgb_t(0x00, 0xA3, 0x60), /* Dark Green */
2955   rgb_t(0x9C, 0x9C, 0x9C), /* Dark Gray */
2956   rgb_t(0x14, 0xCF, 0xFD), /* Medium Blue */
2957   rgb_t(0xD0, 0xC3, 0xFF), /* Light Blue */
2958   rgb_t(0x60, 0x72, 0x03), /* Brown */
2959   rgb_t(0xFF, 0x6A, 0x3C), /* Orange */
2960   rgb_t(0x9C, 0x9C, 0x9C), /* Light Grey */
2961   rgb_t(0xFF, 0xA0, 0xD0), /* Pink */
2962   rgb_t(0x14, 0xF5, 0x3C), /* Light Green */
2963   rgb_t(0xD0, 0xDD, 0x8D), /* Yellow */
2964   rgb_t(0x72, 0xFF, 0xD0), /* Aquamarine */
2965   rgb_t(0xFF, 0xFF, 0xFF)  /* White */
2966};
2967
2968static SLOT_INTERFACE_START(apple2_cards)
2969   SLOT_INTERFACE("diskii", A2BUS_DISKII)  /* Disk II Controller Card */
2970   SLOT_INTERFACE("diskiing", A2BUS_DISKIING)  /* Disk II Controller Card, cycle-accurate version */
2971   SLOT_INTERFACE("mockingboard", A2BUS_MOCKINGBOARD)  /* Sweet Micro Systems Mockingboard */
2972   SLOT_INTERFACE("phasor", A2BUS_PHASOR)  /* Applied Engineering Phasor */
2973   SLOT_INTERFACE("cffa2", A2BUS_CFFA2)  /* CFFA2000 Compact Flash for Apple II (www.dreher.net), 65C02/65816 firmware */
2974   SLOT_INTERFACE("cffa202", A2BUS_CFFA2_6502)  /* CFFA2000 Compact Flash for Apple II (www.dreher.net), 6502 firmware */
2975   SLOT_INTERFACE("memexp", A2BUS_MEMEXP)  /* Apple II Memory Expansion Card */
2976   SLOT_INTERFACE("ramfactor", A2BUS_RAMFACTOR)    /* Applied Engineering RamFactor */
2977   SLOT_INTERFACE("thclock", A2BUS_THUNDERCLOCK)    /* ThunderWare ThunderClock Plus */
2978   SLOT_INTERFACE("softcard", A2BUS_SOFTCARD)  /* Microsoft SoftCard */
2979   SLOT_INTERFACE("videoterm", A2BUS_VIDEOTERM)    /* Videx VideoTerm */
2980   SLOT_INTERFACE("ssc", A2BUS_SSC)    /* Apple Super Serial Card */
2981   SLOT_INTERFACE("swyft", A2BUS_SWYFT)    /* IAI SwyftCard */
2982   SLOT_INTERFACE("themill", A2BUS_THEMILL)    /* Stellation Two The Mill (6809 card) */
2983   SLOT_INTERFACE("sam", A2BUS_SAM)    /* SAM Software Automated Mouth (8-bit DAC + speaker) */
2984   SLOT_INTERFACE("alfam2", A2BUS_ALFAM2)    /* ALF Apple Music II */
2985   SLOT_INTERFACE("echoii", A2BUS_ECHOII)    /* Street Electronics Echo II */
2986   SLOT_INTERFACE("ap16", A2BUS_IBSAP16)    /* IBS AP16 (German VideoTerm clone) */
2987   SLOT_INTERFACE("ap16alt", A2BUS_IBSAP16ALT)    /* IBS AP16 (German VideoTerm clone), alternate revision */
2988   SLOT_INTERFACE("vtc1", A2BUS_VTC1)    /* Unknown VideoTerm clone #1 */
2989   SLOT_INTERFACE("vtc2", A2BUS_VTC2)    /* Unknown VideoTerm clone #2 */
2990   SLOT_INTERFACE("arcbd", A2BUS_ARCADEBOARD)    /* Third Millenium Engineering Arcade Board */
2991   SLOT_INTERFACE("midi", A2BUS_MIDI)  /* Generic 6840+6850 MIDI board */
2992   SLOT_INTERFACE("zipdrive", A2BUS_ZIPDRIVE)  /* ZIP Technologies IDE card */
2993   SLOT_INTERFACE("echoiiplus", A2BUS_ECHOPLUS)    /* Street Electronics Echo Plus (Echo II + Mockingboard clone) */
2994   SLOT_INTERFACE("scsi", A2BUS_SCSI)  /* Apple II SCSI Card */
2995   SLOT_INTERFACE("applicard", A2BUS_APPLICARD)    /* PCPI Applicard */
2996   SLOT_INTERFACE("aesms", A2BUS_AESMS)    /* Applied Engineering Super Music Synthesizer */
2997   SLOT_INTERFACE("ultraterm", A2BUS_ULTRATERM)    /* Videx UltraTerm (original) */
2998   SLOT_INTERFACE("ultratermenh", A2BUS_ULTRATERMENH)    /* Videx UltraTerm (enhanced //e) */
2999   SLOT_INTERFACE("aevm80", A2BUS_VTC2)    /* Applied Engineering ViewMaster 80 */
3000   SLOT_INTERFACE("parallel", A2BUS_PIC)   /* Apple Parallel Interface Card */
3001   SLOT_INTERFACE("corvus", A2BUS_CORVUS)  /* Corvus flat-cable HDD interface (see notes in a2corvus.c) */
3002   SLOT_INTERFACE("mcms1", A2BUS_MCMS1)  /* Mountain Computer Music System, card 1 of 2 */
3003   SLOT_INTERFACE("mcms2", A2BUS_MCMS2)  /* Mountain Computer Music System, card 2 of 2.  must be in card 1's slot + 1! */
3004   SLOT_INTERFACE("dx1", A2BUS_DX1)    /* Decillonix DX-1 sampler card */
3005   SLOT_INTERFACE("tm2ho", A2BUS_TIMEMASTERHO) /* Applied Engineering TimeMaster II H.O. */
3006   SLOT_INTERFACE("mouse", A2BUS_MOUSE)    /* Apple II Mouse Card */
3007//  SLOT_INTERFACE("magicmusician", A2BUS_MAGICMUSICIAN)    /* Magic Musician Card */
3008SLOT_INTERFACE_END
3009
3010static SLOT_INTERFACE_START(apple2eaux_cards)
3011   SLOT_INTERFACE("std80", A2EAUX_STD80COL) /* Apple IIe Standard 80 Column Card */
3012   SLOT_INTERFACE("ext80", A2EAUX_EXT80COL) /* Apple IIe Extended 80 Column Card */
3013   SLOT_INTERFACE("rw3", A2EAUX_RAMWORKS3)  /* Applied Engineering RamWorks III */
3014SLOT_INTERFACE_END
3015
3016static MACHINE_CONFIG_START( apple2e, apple2e_state )
3017   /* basic machine hardware */
3018   MCFG_CPU_ADD("maincpu", M6502, 1021800)     /* close to actual CPU frequency of 1.020484 MHz */
3019   MCFG_CPU_PROGRAM_MAP(apple2e_map)
3020   MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", apple2e_state, apple2_interrupt, "screen", 0, 1)
3021   MCFG_QUANTUM_TIME(attotime::from_hz(60))
3022
3023   MCFG_DEVICE_ADD(A2_VIDEO_TAG, APPLE2_VIDEO, XTAL_14_31818MHz)
3024
3025   MCFG_SCREEN_ADD("screen", RASTER)
3026   MCFG_SCREEN_REFRESH_RATE(60)
3027   MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
3028   MCFG_SCREEN_SIZE(280*2, 262)
3029   MCFG_SCREEN_VISIBLE_AREA(0, (280*2)-1,0,192-1)
3030   MCFG_SCREEN_UPDATE_DRIVER(apple2e_state, screen_update)
3031   MCFG_SCREEN_PALETTE("palette")
3032
3033   MCFG_PALETTE_ADD("palette", 16)
3034   MCFG_PALETTE_INIT_OWNER(apple2e_state, apple2)
3035
3036   /* sound hardware */
3037   MCFG_SPEAKER_STANDARD_MONO("mono")
3038   MCFG_SOUND_ADD(A2_SPEAKER_TAG, SPEAKER_SOUND, 0)
3039   MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00)
3040
3041   /* RAM */
3042   MCFG_RAM_ADD(RAM_TAG)
3043   MCFG_RAM_DEFAULT_SIZE("64K")
3044   MCFG_RAM_DEFAULT_VALUE(0x00)
3045
3046   /* 0000 banking */
3047   MCFG_DEVICE_ADD(A2_0000_TAG, ADDRESS_MAP_BANK, 0)
3048   MCFG_DEVICE_PROGRAM_MAP(r0000bank_map)
3049   MCFG_ADDRESS_MAP_BANK_ENDIANNESS(ENDIANNESS_LITTLE)
3050   MCFG_ADDRESS_MAP_BANK_DATABUS_WIDTH(8)
3051   MCFG_ADDRESS_MAP_BANK_STRIDE(0x200)
3052
3053   /* 0200 banking */
3054   MCFG_DEVICE_ADD(A2_0200_TAG, ADDRESS_MAP_BANK, 0)
3055   MCFG_DEVICE_PROGRAM_MAP(r0200bank_map)
3056   MCFG_ADDRESS_MAP_BANK_ENDIANNESS(ENDIANNESS_LITTLE)
3057   MCFG_ADDRESS_MAP_BANK_DATABUS_WIDTH(8)
3058   MCFG_ADDRESS_MAP_BANK_STRIDE(0x200)
3059
3060   /* 0400 banking */
3061   MCFG_DEVICE_ADD(A2_0400_TAG, ADDRESS_MAP_BANK, 0)
3062   MCFG_DEVICE_PROGRAM_MAP(r0400bank_map)
3063   MCFG_ADDRESS_MAP_BANK_ENDIANNESS(ENDIANNESS_LITTLE)
3064   MCFG_ADDRESS_MAP_BANK_DATABUS_WIDTH(8)
3065   MCFG_ADDRESS_MAP_BANK_STRIDE(0x400)
3066
3067   /* 0800 banking */
3068   MCFG_DEVICE_ADD(A2_0800_TAG, ADDRESS_MAP_BANK, 0)
3069   MCFG_DEVICE_PROGRAM_MAP(r0800bank_map)
3070   MCFG_ADDRESS_MAP_BANK_ENDIANNESS(ENDIANNESS_LITTLE)
3071   MCFG_ADDRESS_MAP_BANK_DATABUS_WIDTH(8)
3072   MCFG_ADDRESS_MAP_BANK_STRIDE(0x2000)
3073
3074   /* 2000 banking */
3075   MCFG_DEVICE_ADD(A2_2000_TAG, ADDRESS_MAP_BANK, 0)
3076   MCFG_DEVICE_PROGRAM_MAP(r2000bank_map)
3077   MCFG_ADDRESS_MAP_BANK_ENDIANNESS(ENDIANNESS_LITTLE)
3078   MCFG_ADDRESS_MAP_BANK_DATABUS_WIDTH(8)
3079   MCFG_ADDRESS_MAP_BANK_STRIDE(0x2000)
3080
3081   /* 4000 banking */
3082   MCFG_DEVICE_ADD(A2_4000_TAG, ADDRESS_MAP_BANK, 0)
3083   MCFG_DEVICE_PROGRAM_MAP(r4000bank_map)
3084   MCFG_ADDRESS_MAP_BANK_ENDIANNESS(ENDIANNESS_LITTLE)
3085   MCFG_ADDRESS_MAP_BANK_DATABUS_WIDTH(8)
3086   MCFG_ADDRESS_MAP_BANK_STRIDE(0x8000)
3087
3088   /* C100 banking */
3089   MCFG_DEVICE_ADD(A2_C100_TAG, ADDRESS_MAP_BANK, 0)
3090   MCFG_DEVICE_PROGRAM_MAP(c100bank_map)
3091   MCFG_ADDRESS_MAP_BANK_ENDIANNESS(ENDIANNESS_LITTLE)
3092   MCFG_ADDRESS_MAP_BANK_DATABUS_WIDTH(8)
3093   MCFG_ADDRESS_MAP_BANK_STRIDE(0x200)
3094
3095   /* C300 banking */
3096   MCFG_DEVICE_ADD(A2_C300_TAG, ADDRESS_MAP_BANK, 0)
3097   MCFG_DEVICE_PROGRAM_MAP(c300bank_map)
3098   MCFG_ADDRESS_MAP_BANK_ENDIANNESS(ENDIANNESS_LITTLE)
3099   MCFG_ADDRESS_MAP_BANK_DATABUS_WIDTH(8)
3100   MCFG_ADDRESS_MAP_BANK_STRIDE(0x100)
3101
3102   /* C400 banking */
3103   MCFG_DEVICE_ADD(A2_C400_TAG, ADDRESS_MAP_BANK, 0)
3104   MCFG_DEVICE_PROGRAM_MAP(c400bank_map)
3105   MCFG_ADDRESS_MAP_BANK_ENDIANNESS(ENDIANNESS_LITTLE)
3106   MCFG_ADDRESS_MAP_BANK_DATABUS_WIDTH(8)
3107   MCFG_ADDRESS_MAP_BANK_STRIDE(0x400)
3108
3109   /* C800 banking */
3110   MCFG_DEVICE_ADD(A2_C800_TAG, ADDRESS_MAP_BANK, 0)
3111   MCFG_DEVICE_PROGRAM_MAP(c800bank_map)
3112   MCFG_ADDRESS_MAP_BANK_ENDIANNESS(ENDIANNESS_LITTLE)
3113   MCFG_ADDRESS_MAP_BANK_DATABUS_WIDTH(8)
3114   MCFG_ADDRESS_MAP_BANK_STRIDE(0x800)
3115
3116   /* built-in language card emulation */
3117   MCFG_DEVICE_ADD(A2_LCBANK_TAG, ADDRESS_MAP_BANK, 0)
3118   MCFG_DEVICE_PROGRAM_MAP(lcbank_map)
3119   MCFG_ADDRESS_MAP_BANK_ENDIANNESS(ENDIANNESS_LITTLE)
3120   MCFG_ADDRESS_MAP_BANK_DATABUS_WIDTH(8)
3121   MCFG_ADDRESS_MAP_BANK_STRIDE(0x3000)
3122
3123   /* /INH banking */
3124   MCFG_DEVICE_ADD(A2_UPPERBANK_TAG, ADDRESS_MAP_BANK, 0)
3125   MCFG_DEVICE_PROGRAM_MAP(inhbank_map)
3126   MCFG_ADDRESS_MAP_BANK_ENDIANNESS(ENDIANNESS_LITTLE)
3127   MCFG_ADDRESS_MAP_BANK_DATABUS_WIDTH(8)
3128   MCFG_ADDRESS_MAP_BANK_STRIDE(0x3000)
3129
3130   /* keyboard controller */
3131   MCFG_DEVICE_ADD("ay3600", AY3600, 0)
3132   MCFG_AY3600_MATRIX_X0(IOPORT("X0"))
3133   MCFG_AY3600_MATRIX_X1(IOPORT("X1"))
3134   MCFG_AY3600_MATRIX_X2(IOPORT("X2"))
3135   MCFG_AY3600_MATRIX_X3(IOPORT("X3"))
3136   MCFG_AY3600_MATRIX_X4(IOPORT("X4"))
3137   MCFG_AY3600_MATRIX_X5(IOPORT("X5"))
3138   MCFG_AY3600_MATRIX_X6(IOPORT("X6"))
3139   MCFG_AY3600_MATRIX_X7(IOPORT("X7"))
3140   MCFG_AY3600_MATRIX_X8(IOPORT("X8"))
3141   MCFG_AY3600_SHIFT_CB(READLINE(apple2e_state, ay3600_shift_r))
3142   MCFG_AY3600_CONTROL_CB(READLINE(apple2e_state, ay3600_control_r))
3143   MCFG_AY3600_DATA_READY_CB(WRITELINE(apple2e_state, ay3600_data_ready_w))
3144   MCFG_AY3600_AKO_CB(WRITELINE(apple2e_state, ay3600_ako_w))
3145
3146   /* repeat timer.  15 Hz from page 7-15 of "Understanding the Apple IIe" */
3147   MCFG_TIMER_DRIVER_ADD_PERIODIC("repttmr", apple2e_state, ay3600_repeat, attotime::from_hz(15))
3148
3149   /* slot devices */
3150   MCFG_DEVICE_ADD("a2bus", A2BUS, 0)
3151   MCFG_A2BUS_CPU("maincpu")
3152   MCFG_A2BUS_OUT_IRQ_CB(WRITELINE(apple2e_state, a2bus_irq_w))
3153   MCFG_A2BUS_OUT_NMI_CB(WRITELINE(apple2e_state, a2bus_nmi_w))
3154   MCFG_A2BUS_OUT_INH_CB(WRITELINE(apple2e_state, a2bus_inh_w))
3155   MCFG_A2BUS_SLOT_ADD("a2bus", "sl1", apple2_cards, NULL)
3156   MCFG_A2BUS_SLOT_ADD("a2bus", "sl2", apple2_cards, NULL)
3157   MCFG_A2BUS_SLOT_ADD("a2bus", "sl3", apple2_cards, NULL)
3158   MCFG_A2BUS_SLOT_ADD("a2bus", "sl4", apple2_cards, "mockingboard")
3159   MCFG_A2BUS_SLOT_ADD("a2bus", "sl5", apple2_cards, NULL)
3160   MCFG_A2BUS_SLOT_ADD("a2bus", "sl6", apple2_cards, "diskiing")
3161   MCFG_A2BUS_SLOT_ADD("a2bus", "sl7", apple2_cards, NULL)
3162
3163   MCFG_DEVICE_ADD(A2_AUXSLOT_TAG, A2EAUXSLOT, 0)
3164   MCFG_A2EAUXSLOT_CPU("maincpu")
3165   MCFG_A2EAUXSLOT_OUT_IRQ_CB(WRITELINE(apple2e_state, a2bus_irq_w))
3166   MCFG_A2EAUXSLOT_OUT_NMI_CB(WRITELINE(apple2e_state, a2bus_nmi_w))
3167   MCFG_A2EAUXSLOT_SLOT_ADD(A2_AUXSLOT_TAG, "aux", apple2eaux_cards, "ext80")   // default to an extended 80-column card
3168
3169   MCFG_SOFTWARE_LIST_ADD("flop525_list","apple2")
3170
3171   MCFG_CASSETTE_ADD(A2_CASSETTE_TAG)
3172   MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_STOPPED)
3173MACHINE_CONFIG_END
3174
3175static MACHINE_CONFIG_DERIVED( mprof3, apple2e )
3176   /* internal ram */
3177   MCFG_RAM_MODIFY(RAM_TAG)
3178   MCFG_RAM_DEFAULT_SIZE("128K")
3179MACHINE_CONFIG_END
3180
3181static MACHINE_CONFIG_DERIVED( apple2ee, apple2e )
3182   MCFG_CPU_REPLACE("maincpu", M65C02, 1021800)        /* close to actual CPU frequency of 1.020484 MHz */
3183   MCFG_CPU_PROGRAM_MAP(apple2e_map)
3184MACHINE_CONFIG_END
3185
3186static MACHINE_CONFIG_DERIVED( tk3000, apple2e )
3187   MCFG_CPU_REPLACE("maincpu", M65C02, 1021800)        /* close to actual CPU frequency of 1.020484 MHz */
3188   MCFG_CPU_PROGRAM_MAP(apple2e_map)
3189
3190//   MCFG_CPU_ADD("subcpu", Z80, 1021800)    // schematics are illegible on where the clock comes from, but it *seems* to be the same as the 65C02 clock
3191//   MCFG_CPU_PROGRAM_MAP(tk3000_kbd_map)
3192MACHINE_CONFIG_END
3193
3194static MACHINE_CONFIG_DERIVED( apple2ep, apple2e )
3195   MCFG_CPU_REPLACE("maincpu", M65C02, 1021800)        /* close to actual CPU frequency of 1.020484 MHz */
3196   MCFG_CPU_PROGRAM_MAP(apple2e_map)
3197MACHINE_CONFIG_END
3198
3199static MACHINE_CONFIG_DERIVED( apple2c, apple2ee )
3200   MCFG_CPU_REPLACE("maincpu", M65C02, 1021800)        /* close to actual CPU frequency of 1.020484 MHz */
3201   MCFG_CPU_PROGRAM_MAP(apple2c_map)
3202
3203   // IIc and friends have no cassette port
3204   MCFG_DEVICE_REMOVE(A2_CASSETTE_TAG)
3205
3206   MCFG_A2BUS_SLOT_REMOVE("sl1")   // IIc has no slots, of course :)
3207   MCFG_A2BUS_SLOT_REMOVE("sl2")
3208   MCFG_A2BUS_SLOT_REMOVE("sl3")
3209   MCFG_A2BUS_SLOT_REMOVE("sl4")
3210   MCFG_A2BUS_SLOT_REMOVE("sl5")
3211   MCFG_A2BUS_SLOT_REMOVE("sl6")
3212   MCFG_A2BUS_SLOT_REMOVE("sl7")
3213
3214   MCFG_DEVICE_ADD(IIC_ACIA1_TAG, MOS6551, 0)
3215   MCFG_MOS6551_XTAL(XTAL_14_31818MHz / 8) // ~1.789 MHz
3216   MCFG_MOS6551_TXD_HANDLER(DEVWRITELINE(PRINTER_PORT_TAG, rs232_port_device, write_txd))
3217
3218   MCFG_DEVICE_ADD(IIC_ACIA2_TAG, MOS6551, 0)
3219   MCFG_MOS6551_XTAL(XTAL_1_8432MHz)   // matches SSC so modem software is compatible
3220   MCFG_MOS6551_TXD_HANDLER(DEVWRITELINE("modem", rs232_port_device, write_txd))
3221
3222   MCFG_RS232_PORT_ADD(PRINTER_PORT_TAG, default_rs232_devices, NULL)
3223   MCFG_RS232_RXD_HANDLER(DEVWRITELINE(IIC_ACIA1_TAG, mos6551_device, write_rxd))
3224   MCFG_RS232_DCD_HANDLER(DEVWRITELINE(IIC_ACIA1_TAG, mos6551_device, write_dcd))
3225   MCFG_RS232_DSR_HANDLER(DEVWRITELINE(IIC_ACIA1_TAG, mos6551_device, write_dsr))
3226   MCFG_RS232_CTS_HANDLER(DEVWRITELINE(IIC_ACIA1_TAG, mos6551_device, write_cts))
3227
3228   MCFG_RS232_PORT_ADD(MODEM_PORT_TAG, default_rs232_devices, NULL)
3229   MCFG_RS232_RXD_HANDLER(DEVWRITELINE(IIC_ACIA2_TAG, mos6551_device, write_rxd))
3230   MCFG_RS232_DCD_HANDLER(DEVWRITELINE(IIC_ACIA2_TAG, mos6551_device, write_dcd))
3231   MCFG_RS232_DSR_HANDLER(DEVWRITELINE(IIC_ACIA2_TAG, mos6551_device, write_dsr))
3232   MCFG_RS232_CTS_HANDLER(DEVWRITELINE(IIC_ACIA2_TAG, mos6551_device, write_cts))
3233
3234   // TODO: populate the IIc's other virtual slots with ONBOARD_ADD
3235   MCFG_A2BUS_ONBOARD_ADD("a2bus", "sl6", A2BUS_DISKIING, NULL)
3236
3237   MCFG_A2EAUXSLOT_SLOT_REMOVE("aux")
3238   MCFG_DEVICE_REMOVE(A2_AUXSLOT_TAG)
3239
3240   MCFG_RAM_MODIFY(RAM_TAG)
3241   MCFG_RAM_DEFAULT_SIZE("128K")
3242   MCFG_RAM_EXTRA_OPTIONS("128K")
3243MACHINE_CONFIG_END
3244
3245const applefdc_interface a2cp_interface =
3246{
3247   sony_set_lines,         /* set_lines */
3248   sony_set_enable_lines,  /* set_enable_lines */
3249
3250   sony_read_data,         /* read_data */
3251   sony_write_data,    /* write_data */
3252   sony_read_status    /* read_status */
3253};
3254
3255static const floppy_interface apple2cp_floppy35_floppy_interface =
3256{
3257   FLOPPY_STANDARD_5_25_DSHD,
3258   LEGACY_FLOPPY_OPTIONS_NAME(apple35_iigs),
3259   "floppy_3_5"
3260};
3261
3262static MACHINE_CONFIG_DERIVED( apple2cp, apple2c )
3263   MCFG_A2BUS_SLOT_REMOVE("sl6")
3264   MCFG_IWM_ADD(IICP_IWM_TAG, a2cp_interface)
3265   MCFG_LEGACY_FLOPPY_SONY_2_DRIVES_ADD(apple2cp_floppy35_floppy_interface)
3266MACHINE_CONFIG_END
3267
3268static MACHINE_CONFIG_DERIVED( apple2c_iwm, apple2c )
3269
3270   MCFG_A2BUS_SLOT_REMOVE("sl6")
3271   MCFG_A2BUS_ONBOARD_ADD("a2bus", "sl6", A2BUS_IWM_FDC, NULL)
3272MACHINE_CONFIG_END
3273
3274static MACHINE_CONFIG_DERIVED( apple2c_mem, apple2c )
3275   MCFG_CPU_REPLACE("maincpu", M65C02, 1021800)        /* close to actual CPU frequency of 1.020484 MHz */
3276   MCFG_CPU_PROGRAM_MAP(apple2c_memexp_map)
3277
3278   MCFG_A2BUS_SLOT_REMOVE("sl6")
3279   MCFG_A2BUS_ONBOARD_ADD("a2bus", "sl6", A2BUS_IWM_FDC, NULL)
3280
3281   MCFG_RAM_MODIFY(RAM_TAG)
3282   MCFG_RAM_DEFAULT_SIZE("128K")
3283   MCFG_RAM_EXTRA_OPTIONS("128K, 384K, 640K, 896K, 1152K")
3284MACHINE_CONFIG_END
3285
3286const applefdc_interface fdc_interface =
3287{
3288   apple525_set_lines,         /* set_lines */
3289   apple525_set_enable_lines,  /* set_enable_lines */
3290
3291   apple525_read_data,         /* read_data */
3292   apple525_write_data,    /* write_data */
3293   apple525_read_status    /* read_status */
3294};
3295
3296static const floppy_interface floppy_interface =
3297{
3298   FLOPPY_STANDARD_5_25_DSHD,
3299   LEGACY_FLOPPY_OPTIONS_NAME(apple2),
3300   "floppy_5_25"
3301};
3302
3303static MACHINE_CONFIG_DERIVED( laser128, apple2c )
3304   MCFG_APPLEFDC_ADD(LASER128_UDC_TAG, fdc_interface)
3305   MCFG_LEGACY_FLOPPY_APPLE_2_DRIVES_ADD(floppy_interface,15,16)
3306
3307   MCFG_A2BUS_SLOT_REMOVE("sl6")
3308
3309   MCFG_A2BUS_ONBOARD_ADD("a2bus", "sl1", A2BUS_LASER128, NULL)
3310   MCFG_A2BUS_ONBOARD_ADD("a2bus", "sl2", A2BUS_LASER128, NULL)
3311   MCFG_A2BUS_ONBOARD_ADD("a2bus", "sl3", A2BUS_LASER128, NULL)
3312   MCFG_A2BUS_ONBOARD_ADD("a2bus", "sl4", A2BUS_LASER128, NULL)
3313   MCFG_A2BUS_SLOT_ADD("a2bus", "sl5", apple2_cards, NULL)
3314   MCFG_A2BUS_ONBOARD_ADD("a2bus", "sl6", A2BUS_LASER128, NULL)
3315   MCFG_A2BUS_SLOT_ADD("a2bus", "sl7", apple2_cards, NULL)
3316MACHINE_CONFIG_END
3317
3318static MACHINE_CONFIG_DERIVED( laser128ex2, apple2c )
3319   MCFG_APPLEFDC_ADD(LASER128_UDC_TAG, fdc_interface)
3320   MCFG_LEGACY_FLOPPY_APPLE_2_DRIVES_ADD(floppy_interface,15,16)
3321
3322   MCFG_A2BUS_SLOT_REMOVE("sl6")
3323
3324   MCFG_A2BUS_ONBOARD_ADD("a2bus", "sl1", A2BUS_LASER128, NULL)
3325   MCFG_A2BUS_ONBOARD_ADD("a2bus", "sl2", A2BUS_LASER128, NULL)
3326   MCFG_A2BUS_ONBOARD_ADD("a2bus", "sl3", A2BUS_LASER128, NULL)
3327   MCFG_A2BUS_ONBOARD_ADD("a2bus", "sl4", A2BUS_LASER128, NULL)
3328   MCFG_A2BUS_ONBOARD_ADD("a2bus", "sl5", A2BUS_LASER128, NULL)
3329   MCFG_A2BUS_ONBOARD_ADD("a2bus", "sl6", A2BUS_LASER128, NULL)
3330   MCFG_A2BUS_ONBOARD_ADD("a2bus", "sl7", A2BUS_LASER128, NULL)
3331MACHINE_CONFIG_END
3332
3333/***************************************************************************
3334
3335  Game driver(s)
3336
3337***************************************************************************/
3338
3339ROM_START(apple2e)
3340   ROM_REGION(0x2000,"gfx1",0)
3341   ROM_LOAD ( "342-0133-a.chr", 0x0000, 0x1000,CRC(b081df66) SHA1(7060de104046736529c1e8a687a0dd7b84f8c51b))
3342   ROM_LOAD ( "342-0133-a.chr", 0x1000, 0x1000,CRC(b081df66) SHA1(7060de104046736529c1e8a687a0dd7b84f8c51b))
3343
3344   ROM_REGION(0x8000,"maincpu",0)
3345   ROM_LOAD ( "342-0135-b.64", 0x0000, 0x2000, CRC(e248835e) SHA1(523838c19c79f481fa02df56856da1ec3816d16e))
3346   ROM_LOAD ( "342-0134-a.64", 0x2000, 0x2000, CRC(fc3d59d8) SHA1(8895a4b703f2184b673078f411f4089889b61c54))
3347
3348   ROM_REGION( 0x800, "keyboard", ROMREGION_ERASE00 )
3349   ROM_LOAD( "342-0132-c.e12", 0x000, 0x800, CRC(e47045f4) SHA1(12a2e718f5f4acd69b6c33a45a4a940b1440a481) ) // 1983 US-Dvorak
3350ROM_END
3351
3352ROM_START(apple2euk)
3353   ROM_REGION(0x2000,"gfx1",0)
3354   ROM_LOAD( "341-0160-a.chr", 0x0000, 0x2000, CRC(9be77112) SHA1(48aafa9a72002c495bc1f3d28150630ff89ca47e) )
3355
3356   ROM_REGION(0x8000,"maincpu",0)
3357   ROM_LOAD ( "342-0135-b.64", 0x0000, 0x2000, CRC(e248835e) SHA1(523838c19c79f481fa02df56856da1ec3816d16e))
3358   ROM_LOAD ( "342-0134-a.64", 0x2000, 0x2000, CRC(fc3d59d8) SHA1(8895a4b703f2184b673078f411f4089889b61c54))
3359
3360   ROM_REGION( 0x800, "keyboard", ROMREGION_ERASE00 )
3361   ROM_LOAD( "341-0150-a.e12", 0x000, 0x800, CRC(66ffacd7) SHA1(47bb9608be38ff75429a989b930a93b47099648e) )
3362ROM_END
3363
3364ROM_START(mprof3)
3365   ROM_REGION(0x2000,"gfx1",0)
3366   ROM_LOAD ( "mpf3.chr", 0x0000, 0x1000,CRC(2597bc19) SHA1(e114dcbb512ec24fb457248c1b53cbd78039ed20))
3367   ROM_LOAD ( "mpf3.chr", 0x1000, 0x1000,CRC(2597bc19) SHA1(e114dcbb512ec24fb457248c1b53cbd78039ed20))
3368
3369   ROM_REGION(0x8000,"maincpu",0)
3370   ROM_LOAD ( "mpf3-cd.rom", 0x0000, 0x2000, CRC(5b662e06) SHA1(aa0db775ca78986480829fcc10f00e57629e1a7c))
3371   ROM_LOAD ( "mpf3-ef.rom", 0x2000, 0x2000, CRC(2c5e8b92) SHA1(befeb03e04b7c3ef36ef5829948a53880df85e92))
3372
3373   ROM_REGION( 0x800, "keyboard", ROMREGION_ERASE00 )
3374   ROM_LOAD( "342-0132-c.e12", 0x000, 0x800, BAD_DUMP CRC(e47045f4) SHA1(12a2e718f5f4acd69b6c33a45a4a940b1440a481) ) // need to dump real mprof keyboard ROM
3375ROM_END
3376
3377ROM_START(apple2ee)
3378   ROM_REGION(0x2000,"gfx1",0)
3379   ROM_LOAD ( "342-0265-a.chr", 0x0000, 0x1000,CRC(2651014d) SHA1(b2b5d87f52693817fc747df087a4aa1ddcdb1f10))
3380   ROM_LOAD ( "342-0265-a.chr", 0x1000, 0x1000,CRC(2651014d) SHA1(b2b5d87f52693817fc747df087a4aa1ddcdb1f10))
3381
3382   ROM_REGION(0x8000,"maincpu",0)
3383   ROM_LOAD ( "342-0304-a.e10", 0x0000, 0x2000, CRC(443aa7c4) SHA1(3aecc56a26134df51e65e17f33ae80c1f1ac93e6)) /* PCB: "CD ROM // 342-0304", 2364 mask rom */
3384   ROM_LOAD ( "342-0303-a.e8", 0x2000, 0x2000, CRC(95e10034) SHA1(afb09bb96038232dc757d40c0605623cae38088e)) /* PCB: "EF ROM // 342-0303", 2364 mask rom */
3385
3386   ROM_REGION( 0x800, "keyboard", 0 )
3387   ROM_LOAD( "341-0132-d.e12", 0x000, 0x800, CRC(c506efb9) SHA1(8e14e85c645187504ec9d162b3ea614a0c421d32) )
3388ROM_END
3389
3390ROM_START(apple2eeuk)
3391   ROM_REGION(0x2000, "gfx1", 0)
3392   ROM_LOAD( "342-0273-a.chr", 0x0000, 0x2000, CRC(9157085a) SHA1(85479a509d6c8176949a5b20720567b7022aa631) )
3393
3394   ROM_REGION(0x8000,"maincpu",0)
3395   ROM_LOAD ( "342-0304-a.e10", 0x0000, 0x2000, CRC(443aa7c4) SHA1(3aecc56a26134df51e65e17f33ae80c1f1ac93e6)) /* PCB: "CD ROM // 342-0304", 2364 mask rom */
3396   ROM_LOAD ( "342-0303-a.e8", 0x2000, 0x2000, CRC(95e10034) SHA1(afb09bb96038232dc757d40c0605623cae38088e)) /* PCB: "EF ROM // 342-0303", 2364 mask rom */
3397
3398   ROM_REGION( 0x800, "keyboard", 0 )
3399   ROM_LOAD( "341-0150-a.e12", 0x000, 0x800, CRC(66ffacd7) SHA1(47bb9608be38ff75429a989b930a93b47099648e) )
3400ROM_END
3401
3402ROM_START(apple2ep)
3403   ROM_REGION(0x2000,"gfx1",0)
3404   ROM_LOAD ( "342-0265-a.chr", 0x0000, 0x1000,CRC(2651014d) SHA1(b2b5d87f52693817fc747df087a4aa1ddcdb1f10))
3405   ROM_LOAD ( "342-0265-a.chr", 0x1000, 0x1000,CRC(2651014d) SHA1(b2b5d87f52693817fc747df087a4aa1ddcdb1f10))
3406
3407   ROM_REGION(0x8000,"maincpu",0)
3408   ROM_LOAD ("32-0349-b.128", 0x0000, 0x4000, CRC(1d70b193) SHA1(b8ea90abe135a0031065e01697c4a3a20d51198b)) /* should rom name be 342-0349-b? */
3409
3410   ROM_REGION( 0x800, "keyboard", 0 )
3411   // chip printed markings say 342-0132-d, but internally text says "341-0132-d".  Go figure.
3412   ROM_LOAD( "341-0132-d.e12", 0x000, 0x800, CRC(c506efb9) SHA1(8e14e85c645187504ec9d162b3ea614a0c421d32) )
3413ROM_END
3414
3415ROM_START(apple2c)
3416   ROM_REGION(0x2000,"gfx1",0)
3417   ROM_LOAD ( "341-0265-a.chr", 0x0000, 0x1000,CRC(2651014d) SHA1(b2b5d87f52693817fc747df087a4aa1ddcdb1f10))
3418   ROM_LOAD ( "341-0265-a.chr", 0x1000, 0x1000,CRC(2651014d) SHA1(b2b5d87f52693817fc747df087a4aa1ddcdb1f10))
3419
3420   ROM_REGION(0x8000,"maincpu",0)
3421   ROM_LOAD ( "a2c.128", 0x0000, 0x4000, CRC(f0edaa1b) SHA1(1a9b8aca5e32bb702ddb7791daddd60a89655729))
3422
3423   ROM_REGION( 0x800, "keyboard", ROMREGION_ERASE00 )
3424   ROM_LOAD( "342-0132-c.e12", 0x000, 0x800, CRC(e47045f4) SHA1(12a2e718f5f4acd69b6c33a45a4a940b1440a481) ) // 1983 US-Dvorak
3425ROM_END
3426
3427// unlike the very unique TK2000, the TK3000 is a mostly stock enhanced IIe clone
3428ROM_START(tk3000)
3429   ROM_REGION(0x2000,"gfx1",0)
3430   ROM_LOAD( "tk3000.f7",    0x000000, 0x002000, CRC(70157693) SHA1(a7922e2137f95271011042441d80466fba7bb828) )
3431
3432   ROM_REGION(0x8000,"maincpu",0)
3433   ROM_LOAD( "tk3000.f4f6",  0x000000, 0x004000, CRC(5b1e8ab2) SHA1(f163e5753c18ff0e812a448e8da406f102600edf) )
3434
3435   ROM_REGION(0x2000, "kbdcpu", 0)
3436   ROM_LOAD( "tk3000.e13",   0x000000, 0x002000, CRC(f9b860d3) SHA1(6a127f1458f43a00199d3dde94569b8928f05a53) )
3437
3438   ROM_REGION(0x800, "keyboard", ROMREGION_ERASE00)
3439   ROM_LOAD( "342-0132-c.e12", 0x000, 0x800, BAD_DUMP CRC(e47045f4) SHA1(12a2e718f5f4acd69b6c33a45a4a940b1440a481) ) // probably not this machine's actual ROM
3440ROM_END
3441
3442ROM_START(prav8c)
3443   ROM_REGION(0x2000,"gfx1",0)
3444   ROM_LOAD ( "charrom.d20", 0x0000, 0x2000,CRC(935212cc) SHA1(934603a441c631bd841ea0d2ff39525474461e47))
3445   ROM_REGION(0x8000,"maincpu",0)
3446   ROM_LOAD ( "prom_cd.d46", 0x0000, 0x2000, CRC(195d0b48) SHA1(f8c4f3722159081f6950207f03bc85da30980c08))
3447   ROM_LOAD ( "prom_ef.d41", 0x2000, 0x2000, CRC(ec6aa2f6) SHA1(64bce893ebf0e22cd8f22436b97ef1bfeddf692f))
3448
3449   // contains slot firmware for slots 1, 2, and 6 (6 is the usual Disk II f/w)
3450   ROM_REGION(0x2000,"unknown",0)
3451   ROM_LOAD ( "eprom.d38", 0x0000, 0x2000, CRC(c8d00b19) SHA1(13d156957ea68d0e7bc4be57cb1580c8b1399981))
3452
3453   ROM_REGION( 0x800, "keyboard", ROMREGION_ERASE00 )
3454   ROM_LOAD( "342-0132-c.e12", 0x000, 0x800, BAD_DUMP CRC(e47045f4) SHA1(12a2e718f5f4acd69b6c33a45a4a940b1440a481) ) // we don't know what this machine used
3455ROM_END
3456
3457ROM_START(apple2c0)
3458   ROM_REGION(0x2000,"gfx1",0)
3459   ROM_LOAD ( "341-0265-a.chr", 0x0000, 0x1000,CRC(2651014d) SHA1(b2b5d87f52693817fc747df087a4aa1ddcdb1f10))
3460   ROM_LOAD ( "341-0265-a.chr", 0x1000, 0x1000,CRC(2651014d) SHA1(b2b5d87f52693817fc747df087a4aa1ddcdb1f10))
3461
3462   ROM_REGION(0x8000,"maincpu",0)
3463   ROM_LOAD("3420033a.256", 0x0000, 0x8000, CRC(c8b979b3) SHA1(10767e96cc17bad0970afda3a4146564e6272ba1))
3464
3465   ROM_REGION( 0x800, "keyboard", ROMREGION_ERASE00 )
3466   ROM_LOAD( "342-0132-c.e12", 0x000, 0x800, CRC(e47045f4) SHA1(12a2e718f5f4acd69b6c33a45a4a940b1440a481) ) // 1983 US-Dvorak
3467ROM_END
3468
3469ROM_START(apple2c3)
3470   ROM_REGION(0x2000,"gfx1",0)
3471   ROM_LOAD ( "341-0265-a.chr", 0x0000, 0x1000,CRC(2651014d) SHA1(b2b5d87f52693817fc747df087a4aa1ddcdb1f10))
3472   ROM_LOAD ( "341-0265-a.chr", 0x1000, 0x1000,CRC(2651014d) SHA1(b2b5d87f52693817fc747df087a4aa1ddcdb1f10))
3473
3474   ROM_REGION(0x8000,"maincpu",0)
3475   ROM_LOAD("342-0445-a.256", 0x0000, 0x8000, CRC(bc5a79ff) SHA1(5338d9baa7ae202457b6500fde5883dbdc86e5d3))
3476
3477   ROM_REGION( 0x800, "keyboard", ROMREGION_ERASE00 )
3478   ROM_LOAD( "342-0132-c.e12", 0x000, 0x800, CRC(e47045f4) SHA1(12a2e718f5f4acd69b6c33a45a4a940b1440a481) ) // 1983 US-Dvorak
3479ROM_END
3480
3481ROM_START(apple2c4)
3482   ROM_REGION(0x2000,"gfx1",0)
3483   ROM_LOAD ( "341-0265-a.chr", 0x0000, 0x1000,CRC(2651014d) SHA1(b2b5d87f52693817fc747df087a4aa1ddcdb1f10))
3484   ROM_LOAD ( "341-0265-a.chr", 0x1000, 0x1000,CRC(2651014d) SHA1(b2b5d87f52693817fc747df087a4aa1ddcdb1f10))
3485
3486   ROM_REGION(0x8000,"maincpu",0)
3487   ROM_LOAD("3410445b.256", 0x0000, 0x8000, CRC(06f53328) SHA1(015061597c4cda7755aeb88b735994ffd2f235ca))
3488
3489   ROM_REGION( 0x800, "keyboard", ROMREGION_ERASE00 )
3490   ROM_LOAD( "342-0132-c.e12", 0x000, 0x800, CRC(e47045f4) SHA1(12a2e718f5f4acd69b6c33a45a4a940b1440a481) ) // 1983 US-Dvorak
3491ROM_END
3492
3493ROM_START(laser128)
3494   ROM_REGION(0x2000,"gfx1",0)
3495   ROM_LOAD ( "341-0265-a.chr", 0x0000, 0x1000, BAD_DUMP CRC(2651014d) SHA1(b2b5d87f52693817fc747df087a4aa1ddcdb1f10)) // need to dump real laser rom
3496   ROM_LOAD ( "341-0265-a.chr", 0x1000, 0x1000, BAD_DUMP CRC(2651014d) SHA1(b2b5d87f52693817fc747df087a4aa1ddcdb1f10)) // need to dump real laser rom
3497
3498   ROM_REGION(0x8000,"maincpu",0)
3499   ROM_LOAD("laser128.256", 0x0000, 0x8000, CRC(39E59ED3) SHA1(CBD2F45C923725BFD57F8548E65CC80B13BC18DA))
3500
3501   ROM_REGION( 0x800, "keyboard", ROMREGION_ERASE00 )
3502   ROM_LOAD( "342-0132-c.e12", 0x000, 0x800, BAD_DUMP CRC(e47045f4) SHA1(12a2e718f5f4acd69b6c33a45a4a940b1440a481) ) // need to dump real laser rom
3503ROM_END
3504
3505ROM_START(las128ex)
3506   ROM_REGION(0x2000,"gfx1",0)
3507   ROM_LOAD ( "341-0265-a.chr", 0x0000, 0x1000, BAD_DUMP CRC(2651014d) SHA1(b2b5d87f52693817fc747df087a4aa1ddcdb1f10)) // need to dump real laser rom
3508   ROM_LOAD ( "341-0265-a.chr", 0x1000, 0x1000, BAD_DUMP CRC(2651014d) SHA1(b2b5d87f52693817fc747df087a4aa1ddcdb1f10)) // need to dump real laser rom
3509
3510   ROM_REGION(0x8000,"maincpu",0)
3511   ROM_LOAD("las128ex.256", 0x0000, 0x8000, CRC(B67C8BA1) SHA1(8BD5F82A501B1CF9D988C7207DA81E514CA254B0))
3512
3513   ROM_REGION( 0x800, "keyboard", ROMREGION_ERASE00 )
3514   ROM_LOAD( "342-0132-c.e12", 0x000, 0x800, BAD_DUMP CRC(e47045f4) SHA1(12a2e718f5f4acd69b6c33a45a4a940b1440a481) ) // need to dump real laser rom
3515ROM_END
3516
3517ROM_START(las128e2)
3518   ROM_REGION(0x2000,"gfx1",0)
3519   ROM_LOAD ( "341-0265-a.chr", 0x0000, 0x1000, BAD_DUMP CRC(2651014d) SHA1(b2b5d87f52693817fc747df087a4aa1ddcdb1f10)) // need to dump real laser rom
3520   ROM_LOAD ( "341-0265-a.chr", 0x1000, 0x1000, BAD_DUMP CRC(2651014d) SHA1(b2b5d87f52693817fc747df087a4aa1ddcdb1f10)) // need to dump real laser rom
3521
3522   ROM_REGION(0x8000,"maincpu",0)
3523   ROM_LOAD( "laser 128ex2 rom version 6.1.bin", 0x000000, 0x008000, CRC(7f911c90) SHA1(125754c1bd777d4c510f5239b96178c6f2e3236b) )
3524
3525   ROM_REGION( 0x800, "keyboard", ROMREGION_ERASE00 )
3526   ROM_LOAD( "342-0132-c.e12", 0x000, 0x800, BAD_DUMP CRC(e47045f4) SHA1(12a2e718f5f4acd69b6c33a45a4a940b1440a481) ) // need to dump real laser rom
3527ROM_END
3528
3529ROM_START(apple2cp)
3530   ROM_REGION(0x2000,"gfx1",0)
3531   ROM_LOAD ( "341-0265-a.chr", 0x0000, 0x1000,CRC(2651014d) SHA1(b2b5d87f52693817fc747df087a4aa1ddcdb1f10))
3532   ROM_LOAD ( "341-0265-a.chr", 0x1000, 0x1000,CRC(2651014d) SHA1(b2b5d87f52693817fc747df087a4aa1ddcdb1f10))
3533
3534   ROM_REGION(0x8000,"maincpu",0)
3535   ROM_LOAD("341-0625-a.256", 0x0000, 0x8000, CRC(0b996420) SHA1(1a27ae26966bbafd825d08ad1a24742d3e33557c))
3536
3537   ROM_REGION( 0x800, "keyboard", ROMREGION_ERASE00 )
3538   ROM_LOAD( "341-0132-d.e12", 0x000, 0x800, CRC(c506efb9) SHA1(8e14e85c645187504ec9d162b3ea614a0c421d32) )
3539ROM_END
3540
3541/*    YEAR  NAME      PARENT    COMPAT    MACHINE      INPUT     INIT      COMPANY            FULLNAME */
3542COMP( 1983, apple2e,  0,        apple2,   apple2e,     apple2e, driver_device,  0,        "Apple Computer",    "Apple //e", GAME_SUPPORTS_SAVE )
3543COMP( 1983, apple2euk,apple2e,  0,        apple2e,     apple2euk,driver_device, 0,        "Apple Computer",    "Apple //e (UK)", GAME_SUPPORTS_SAVE )
3544COMP( 1983, mprof3,   apple2e,  0,        mprof3,      apple2e, driver_device,  0,        "Multitech",         "Microprofessor III", GAME_NOT_WORKING | GAME_SUPPORTS_SAVE )
3545COMP( 1985, apple2ee, apple2e,  0,        apple2ee,    apple2e, driver_device,  0,        "Apple Computer",    "Apple //e (enhanced)", GAME_SUPPORTS_SAVE )
3546COMP( 1985, apple2eeuk,apple2e, 0,        apple2ee,    apple2euk, driver_device,0,        "Apple Computer",    "Apple //e (enhanced, UK)", GAME_SUPPORTS_SAVE )
3547COMP( 1987, apple2ep, apple2e,  0,        apple2ep,    apple2ep, driver_device, 0,        "Apple Computer",    "Apple //e (Platinum)", GAME_SUPPORTS_SAVE )
3548COMP( 1984, apple2c,  0,        apple2,   apple2c,     apple2c, driver_device,  0,        "Apple Computer",    "Apple //c" , GAME_SUPPORTS_SAVE )
3549COMP( 1986, tk3000,   apple2c,  0,        tk3000,      apple2e, driver_device,  0,        "Microdigital",      "TK3000//e" , GAME_SUPPORTS_SAVE )
3550COMP( 1989, prav8c,   apple2e,  0,        apple2e,     apple2e, driver_device,  0,        "Pravetz",           "Pravetz 8C", GAME_NOT_WORKING | GAME_SUPPORTS_SAVE )
3551COMP( 1987, laser128, apple2c,  0,        laser128,    apple2e, driver_device,  0,        "Video Technology",  "Laser 128 (version 4.2)", GAME_SUPPORTS_SAVE )
3552COMP( 1988, las128ex, apple2c,  0,        laser128,    apple2e, driver_device,  0,        "Video Technology",  "Laser 128ex (version 4.5)", GAME_SUPPORTS_SAVE )
3553COMP( 1988, las128e2, apple2c,  0,        laser128ex2, apple2e, driver_device,  0,        "Video Technology",  "Laser 128ex2 (version 6.1)", GAME_SUPPORTS_SAVE )
3554COMP( 1985, apple2c0, apple2c,  0,        apple2c_iwm, apple2c, driver_device,  0,        "Apple Computer",    "Apple //c (UniDisk 3.5)", GAME_SUPPORTS_SAVE )
3555COMP( 1986, apple2c3, apple2c,  0,        apple2c_mem, apple2c, driver_device,  0,        "Apple Computer",    "Apple //c (Original Memory Expansion)", GAME_SUPPORTS_SAVE )
3556COMP( 1986, apple2c4, apple2c,  0,        apple2c_mem, apple2c, driver_device,  0,        "Apple Computer",    "Apple //c (rev 4)", GAME_SUPPORTS_SAVE )
3557COMP( 1988, apple2cp, apple2c,  0,        apple2cp,    apple2c, driver_device,  0,        "Apple Computer",    "Apple //c Plus", GAME_NOT_WORKING | GAME_SUPPORTS_SAVE )
3558
trunk/src/mess/drivers/apple2gs.c
r241923r241924
143143{
144144   int i;
145145
146   PALETTE_INIT_NAME(apple2)(palette);
146//   PALETTE_INIT_NAME(apple2)(palette);
147147
148148   for (i = 0; i < 16; i++)
149149   {
r241923r241924
271271
272272WRITE_LINE_MEMBER(apple2gs_state::a2bus_inh_w)
273273{
274   m_inh_slot = state;
274   m_inh_slot = -1;
275275   apple2_update_memory();
276276}
277277
trunk/src/mess/drivers/tk2000.c
r0r241924
1// license:BSD-3-Clause
2// copyright-holders:R. Belmont
3/***************************************************************************
4
5   tk2000.c - Microdigital TK2000
6 
7    Driver by R. Belmont
8 
9    This system is only vaguely Apple II compatible.
10    The keyboard works entirely differently, which is a big deal.
11 
12    $C05A - banks RAM from c100-ffff
13    $C05B - banks ROM from c100-ffff
14 
15************************************************************************/
16 
17#include "emu.h"
18#include "machine/bankdev.h"
19#include "machine/ram.h"
20#include "sound/speaker.h"
21#include "imagedev/flopdrv.h"
22#include "imagedev/cassette.h"
23#include "formats/ap2_dsk.h"
24#include "cpu/m6502/m6502.h"
25#include "video/apple2.h"
26
27#define A2_CPU_TAG "maincpu"
28#define A2_BUS_TAG "a2bus"
29#define A2_SPEAKER_TAG "speaker"
30#define A2_CASSETTE_TAG "tape"
31#define A2_UPPERBANK_TAG "inhbank"
32#define A2_VIDEO_TAG "a2video"
33
34class tk2000_state : public driver_device
35{
36public:
37   tk2000_state(const machine_config &mconfig, device_type type, const char *tag)
38      : driver_device(mconfig, type, tag),
39      m_maincpu(*this, A2_CPU_TAG),
40      m_ram(*this, RAM_TAG),
41      m_video(*this, A2_VIDEO_TAG),
42      m_row0(*this, "ROW0"),
43      m_row1(*this, "ROW1"),
44      m_row2(*this, "ROW2"),
45      m_row3(*this, "ROW3"),
46      m_row4(*this, "ROW4"),
47      m_row5(*this, "ROW5"),
48      m_row6(*this, "ROW6"),
49      m_row7(*this, "ROW7"),
50      m_kbspecial(*this, "keyb_special"),
51      m_sysconfig(*this, "a2_config"),
52      m_speaker(*this, A2_SPEAKER_TAG),
53      m_cassette(*this, A2_CASSETTE_TAG),
54      m_upperbank(*this, A2_UPPERBANK_TAG)
55   { }
56
57   required_device<cpu_device> m_maincpu;
58   required_device<ram_device> m_ram;
59   required_device<a2_video_device> m_video;
60   required_ioport m_row0, m_row1, m_row2, m_row3, m_row4, m_row5, m_row6, m_row7;
61   required_ioport m_kbspecial;
62   required_ioport m_sysconfig;
63   required_device<speaker_sound_device> m_speaker;
64   required_device<cassette_image_device> m_cassette;
65   required_device<address_map_bank_device> m_upperbank;
66
67   TIMER_DEVICE_CALLBACK_MEMBER(apple2_interrupt);
68
69   virtual void machine_start();
70   virtual void machine_reset();
71
72   DECLARE_PALETTE_INIT(tk2000);
73   UINT32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
74
75   DECLARE_READ8_MEMBER(ram_r);
76   DECLARE_WRITE8_MEMBER(ram_w);
77   DECLARE_READ8_MEMBER(c000_r);
78   DECLARE_WRITE8_MEMBER(c000_w);
79   DECLARE_READ8_MEMBER(c080_r);
80   DECLARE_WRITE8_MEMBER(c080_w);
81   DECLARE_READ8_MEMBER(c100_r);
82   DECLARE_WRITE8_MEMBER(c100_w);
83
84private:
85   int m_speaker_state;
86   int m_cassette_state;
87
88   UINT8 m_strobe;
89
90   bool m_page2;
91
92   UINT8 *m_ram_ptr;
93   int m_ram_size;
94
95   void do_io(address_space &space, int offset);
96   UINT8 read_floatingbus();
97};
98
99/***************************************************************************
100    START/RESET
101***************************************************************************/
102
103void tk2000_state::machine_start()
104{
105   m_ram_ptr = m_ram->pointer();
106   m_ram_size = m_ram->size();
107   m_speaker_state = 0;
108   m_speaker->level_w(m_speaker_state);
109   m_cassette_state = 0;
110   m_cassette->output(-1.0f);
111   m_upperbank->set_bank(0);
112
113   // setup save states
114   save_item(NAME(m_speaker_state));
115   save_item(NAME(m_cassette_state));
116   save_item(NAME(m_strobe));
117   save_item(NAME(m_page2));
118
119   // setup video pointers
120   m_video->m_ram_ptr = m_ram_ptr;
121   m_video->m_aux_ptr = m_ram_ptr;
122   m_video->m_char_ptr = NULL;
123   m_video->m_char_size = 0;
124}
125
126void tk2000_state::machine_reset()
127{
128   m_page2 = false;
129   m_strobe = 0;
130}
131
132/***************************************************************************
133    VIDEO
134***************************************************************************/
135
136TIMER_DEVICE_CALLBACK_MEMBER(tk2000_state::apple2_interrupt)
137{
138   int scanline = param;
139
140   if((scanline % 8) == 0)
141      machine().first_screen()->update_partial(machine().first_screen()->vpos());
142
143   // update the video system's shadow copy of the system config at the end of the frame
144   if (scanline == 192)
145   {
146      m_video->m_sysconfig = m_sysconfig->read();
147   }
148}
149
150PALETTE_INIT_MEMBER(tk2000_state, tk2000)
151{
152   m_video->palette_init_apple2(palette);
153}
154
155UINT32 tk2000_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
156{
157   m_video->hgr_update(screen, bitmap, cliprect, 0, 191);
158   return 0;
159}
160
161/***************************************************************************
162    I/O
163***************************************************************************/
164// most softswitches don't care about read vs write, so handle them here
165void tk2000_state::do_io(address_space &space, int offset)
166{
167   if(space.debugger_access())
168   {
169      return;
170   }
171
172   switch (offset)
173   {
174      case 0x20:
175         m_cassette_state ^= 1;
176         m_cassette->output(m_cassette_state ? 1.0f : -1.0f);
177         break;
178
179      case 0x30:
180         m_speaker_state ^= 1;
181         m_speaker->level_w(m_speaker_state);
182         break;
183
184      case 0x50:   // monochrome
185         break;
186
187      case 0x51:   // color
188         break;
189
190      case 0x54:  // set page 1
191         m_page2 = false;
192         m_video->m_page2 = false;
193         break;
194
195      case 0x55:  // set page 2
196         m_page2 = true;
197         m_video->m_page2 = true;
198         break;
199
200      case 0x5a:   // ROM
201         m_upperbank->set_bank(0);
202         break;
203
204      case 0x5b:   // RAM
205         m_upperbank->set_bank(1);
206         break;
207
208      case 0x5e:
209         break;
210
211      default:
212         printf("do_io: unk access @ $C0%02X\n", offset & 0xff);
213         break;
214   }
215}
216
217READ8_MEMBER(tk2000_state::c000_r)
218{
219   switch (offset)
220   {
221      case 0x00:
222         return 0;
223
224      case 0x10:  // keyboard strobe
225         return m_strobe;
226
227      case 0x60: // cassette in
228      case 0x68:
229         return m_cassette->input() > 0.0 ? 0x80 : 0;
230
231      default:
232         do_io(space, offset);
233         break;
234   }
235
236   return read_floatingbus();
237}
238
239WRITE8_MEMBER(tk2000_state::c000_w)
240{
241   switch (offset)
242   {
243      case 0x00:   // write row mask for keyboard scan
244         switch (data)
245         {
246            case 0:
247               break;
248
249            case 0x01: m_strobe = m_row0->read(); break;
250            case 0x02: m_strobe = m_row1->read(); break;
251            case 0x04: m_strobe = m_row2->read(); break;
252            case 0x08: m_strobe = m_row3->read(); break;
253            case 0x10: m_strobe = m_row4->read(); break;
254            case 0x20: m_strobe = m_row5->read(); break;
255            case 0x40: m_strobe = m_row6->read(); break;
256            case 0x80: m_strobe = m_row7->read(); break;
257         }
258         break;
259
260      case 0x5f:
261         m_strobe = m_kbspecial->read();
262         break;
263
264      default:
265         do_io(space, offset);
266         break;
267   }
268}
269
270READ8_MEMBER(tk2000_state::c080_r)
271{
272   return read_floatingbus();
273}
274
275WRITE8_MEMBER(tk2000_state::c080_w)
276{
277}
278
279READ8_MEMBER(tk2000_state::c100_r)
280{
281   return m_ram_ptr[offset + 0xc100];
282}
283
284WRITE8_MEMBER(tk2000_state::c100_w)
285{
286   m_ram_ptr[offset + 0xc100] = data;
287}
288
289// floating bus code from old machine/apple2: needs to be reworked based on real beam position to enable e.g. Bob Bishop's screen splitter
290UINT8 tk2000_state::read_floatingbus()
291{
292   enum
293   {
294      // scanner types
295      kScannerNone = 0, kScannerApple2, kScannerApple2e,
296
297      // scanner constants
298      kHBurstClock      =    53, // clock when Color Burst starts
299      kHBurstClocks     =     4, // clocks per Color Burst duration
300      kHClock0State     =  0x18, // H[543210] = 011000
301      kHClocks          =    65, // clocks per horizontal scan (including HBL)
302      kHPEClock         =    40, // clock when HPE (horizontal preset enable) goes low
303      kHPresetClock     =    41, // clock when H state presets
304      kHSyncClock       =    49, // clock when HSync starts
305      kHSyncClocks      =     4, // clocks per HSync duration
306      kNTSCScanLines    =   262, // total scan lines including VBL (NTSC)
307      kNTSCVSyncLine    =   224, // line when VSync starts (NTSC)
308      kPALScanLines     =   312, // total scan lines including VBL (PAL)
309      kPALVSyncLine     =   264, // line when VSync starts (PAL)
310      kVLine0State      = 0x100, // V[543210CBA] = 100000000
311      kVPresetLine      =   256, // line when V state presets
312      kVSyncLines       =     4, // lines per VSync duration
313      kClocksPerVSync   = kHClocks * kNTSCScanLines // FIX: NTSC only?
314   };
315
316   // vars
317   //
318   int i, Hires, Mixed, Page2, _80Store, ScanLines, /* VSyncLine, ScanCycles,*/
319      h_clock, h_state, h_0, h_1, h_2, h_3, h_4, h_5,
320      v_line, v_state, v_A, v_B, v_C, v_0, v_1, v_2, v_3, v_4, /* v_5, */
321      _hires, addend0, addend1, addend2, sum, address;
322
323   // video scanner data
324   //
325   i = m_maincpu->total_cycles() % kClocksPerVSync; // cycles into this VSync
326
327   // machine state switches
328   //
329   Hires    = 1; //m_video->m_hires ? 1 : 0;
330   Mixed    = 0; //m_video->m_mix ? 1 : 0;
331   Page2    = m_page2 ? 1 : 0;
332   _80Store = 0;
333
334   // calculate video parameters according to display standard
335   //
336   ScanLines  = 1 ? kNTSCScanLines : kPALScanLines; // FIX: NTSC only?
337   // VSyncLine  = 1 ? kNTSCVSyncLine : kPALVSyncLine; // FIX: NTSC only?
338   // ScanCycles = ScanLines * kHClocks;
339
340   // calculate horizontal scanning state
341   //
342   h_clock = (i + kHPEClock) % kHClocks; // which horizontal scanning clock
343   h_state = kHClock0State + h_clock; // H state bits
344   if (h_clock >= kHPresetClock) // check for horizontal preset
345   {
346      h_state -= 1; // correct for state preset (two 0 states)
347   }
348   h_0 = (h_state >> 0) & 1; // get horizontal state bits
349   h_1 = (h_state >> 1) & 1;
350   h_2 = (h_state >> 2) & 1;
351   h_3 = (h_state >> 3) & 1;
352   h_4 = (h_state >> 4) & 1;
353   h_5 = (h_state >> 5) & 1;
354
355   // calculate vertical scanning state
356   //
357   v_line  = i / kHClocks; // which vertical scanning line
358   v_state = kVLine0State + v_line; // V state bits
359   if ((v_line >= kVPresetLine)) // check for previous vertical state preset
360   {
361      v_state -= ScanLines; // compensate for preset
362   }
363   v_A = (v_state >> 0) & 1; // get vertical state bits
364   v_B = (v_state >> 1) & 1;
365   v_C = (v_state >> 2) & 1;
366   v_0 = (v_state >> 3) & 1;
367   v_1 = (v_state >> 4) & 1;
368   v_2 = (v_state >> 5) & 1;
369   v_3 = (v_state >> 6) & 1;
370   v_4 = (v_state >> 7) & 1;
371   //v_5 = (v_state >> 8) & 1;
372
373   // calculate scanning memory address
374   //
375   _hires = Hires;
376   if (Hires && Mixed && (v_4 & v_2))
377   {
378      _hires = 0; // (address is in text memory)
379   }
380
381   addend0 = 0x68; // 1            1            0            1
382   addend1 =              (h_5 << 5) | (h_4 << 4) | (h_3 << 3);
383   addend2 = (v_4 << 6) | (v_3 << 5) | (v_4 << 4) | (v_3 << 3);
384   sum     = (addend0 + addend1 + addend2) & (0x0F << 3);
385
386   address = 0;
387   address |= h_0 << 0; // a0
388   address |= h_1 << 1; // a1
389   address |= h_2 << 2; // a2
390   address |= sum;      // a3 - aa6
391   address |= v_0 << 7; // a7
392   address |= v_1 << 8; // a8
393   address |= v_2 << 9; // a9
394   address |= ((_hires) ? v_A : (1 ^ (Page2 & (1 ^ _80Store)))) << 10; // a10
395   address |= ((_hires) ? v_B : (Page2 & (1 ^ _80Store))) << 11; // a11
396   if (_hires) // hires?
397   {
398      // Y: insert hires only address bits
399      //
400      address |= v_C << 12; // a12
401      address |= (1 ^ (Page2 & (1 ^ _80Store))) << 13; // a13
402      address |= (Page2 & (1 ^ _80Store)) << 14; // a14
403   }
404   else
405   {
406      // N: text, so no higher address bits unless Apple ][, not Apple //e
407      //
408      if ((1) && // Apple ][? // FIX: check for Apple ][? (FB is most useful in old games)
409         (kHPEClock <= h_clock) && // Y: HBL?
410         (h_clock <= (kHClocks - 1)))
411      {
412         address |= 1 << 12; // Y: a12 (add $1000 to address!)
413      }
414   }
415
416   return m_ram_ptr[address % m_ram_size]; // FIX: this seems to work, but is it right!?
417}
418
419/***************************************************************************
420    ADDRESS MAP
421***************************************************************************/
422
423READ8_MEMBER(tk2000_state::ram_r)
424{
425   if (offset < m_ram_size)
426   {
427      return m_ram_ptr[offset];
428   }
429
430   return 0xff;
431}
432
433WRITE8_MEMBER(tk2000_state::ram_w)
434{
435   if (offset < m_ram_size)
436   {
437      m_ram_ptr[offset] = data;
438   }
439}
440
441static ADDRESS_MAP_START( apple2_map, AS_PROGRAM, 8, tk2000_state )
442   AM_RANGE(0x0000, 0xbfff) AM_READWRITE(ram_r, ram_w)
443   AM_RANGE(0xc000, 0xc07f) AM_READWRITE(c000_r, c000_w)
444   AM_RANGE(0xc080, 0xc0ff) AM_READWRITE(c080_r, c080_w)
445   AM_RANGE(0xc100, 0xffff) AM_DEVICE(A2_UPPERBANK_TAG, address_map_bank_device, amap8)
446ADDRESS_MAP_END
447
448static ADDRESS_MAP_START( inhbank_map, AS_PROGRAM, 8, tk2000_state )
449   AM_RANGE(0x0000, 0x3eff) AM_ROM AM_REGION("maincpu", 0x100)
450   AM_RANGE(0x4000, 0x7eff) AM_READWRITE(c100_r, c100_w)
451ADDRESS_MAP_END
452
453/***************************************************************************
454    INPUT PORTS
455***************************************************************************/
456
457/*
458   TK2000 matrix:
459 
460        0  1 2 3 4 5 6 7
461       0SHIF B V C X Z
462      1     G F D S A
463       2 SPC T R E W Q
464      3 LFT 5 4 3 2 1
465      4 RGT 6 7 8 9 0
466      5 DWN Y U I O P
467      6 UP  H J K L :
468       7 RTN N M , . ?
469 
470       write row mask 1/2/4/8/10/20/40/80 to $C000
471       read column at $C010
472 
473       If $C05F is written, the Ctrl key is read in bit 0 of $C010 immediately afterwards.
474*/
475static INPUT_PORTS_START( tk2000 )
476   PORT_START("ROW0")
477   PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Shift")   PORT_CODE(KEYCODE_LSHIFT) PORT_CHAR(UCHAR_SHIFT_1)
478   PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_B)  PORT_CHAR('B') PORT_CHAR('b')
479   PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_V)  PORT_CHAR('V') PORT_CHAR('v')
480   PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_C)  PORT_CHAR('C') PORT_CHAR('c')
481   PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_X)  PORT_CHAR('X') PORT_CHAR('x')
482   PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_Z)  PORT_CHAR('Z') PORT_CHAR('z')
483
484   PORT_START("ROW1")
485   PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_UNUSED)
486   PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_G)  PORT_CHAR('G') PORT_CHAR('g')
487   PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_F)  PORT_CHAR('F') PORT_CHAR('f')
488   PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_D)  PORT_CHAR('D') PORT_CHAR('d')
489   PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_S)  PORT_CHAR('S') PORT_CHAR('s')
490   PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_A)          PORT_CHAR('A') PORT_CHAR('a')
491
492   PORT_START("ROW2")
493   PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_SPACE)  PORT_CHAR(' ')
494   PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_T)  PORT_CHAR('T') PORT_CHAR('t')
495   PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_R)  PORT_CHAR('R') PORT_CHAR('r')
496   PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_E)  PORT_CHAR('E') PORT_CHAR('e')
497   PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_W)  PORT_CHAR('W') PORT_CHAR('w')
498   PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_Q)  PORT_CHAR('Q') PORT_CHAR('q')
499
500   PORT_START("ROW3")
501   PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME(UTF8_LEFT)      PORT_CODE(KEYCODE_LEFT)
502   PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_5)  PORT_CHAR('5') PORT_CHAR('%')
503   PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_4)  PORT_CHAR('4') PORT_CHAR('$')
504   PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_3)  PORT_CHAR('3') PORT_CHAR('#')
505   PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_2)  PORT_CHAR('2') PORT_CHAR('\"')
506   PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_1)      PORT_CHAR('1') PORT_CHAR('!')
507
508   PORT_START("ROW4")
509   PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME(UTF8_RIGHT)     PORT_CODE(KEYCODE_RIGHT)
510   PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_6)  PORT_CHAR('6') PORT_CHAR('&')
511   PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_7)  PORT_CHAR('7') PORT_CHAR('\'')
512   PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_8)  PORT_CHAR('8') PORT_CHAR('(')
513   PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_9)  PORT_CHAR('9') PORT_CHAR(')')
514   PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_0)      PORT_CHAR('0') PORT_CHAR(')')
515
516   PORT_START("ROW5")
517   PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME(UTF8_DOWN)      PORT_CODE(KEYCODE_DOWN)     PORT_CHAR(10)
518   PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_Y)  PORT_CHAR('Y') PORT_CHAR('y')
519   PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_U)  PORT_CHAR('U') PORT_CHAR('u')
520   PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_I)  PORT_CHAR('I') PORT_CHAR('i')
521   PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_O)  PORT_CHAR('O') PORT_CHAR('o')
522   PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_P)  PORT_CHAR('P') PORT_CHAR('p')
523
524   PORT_START("ROW6")
525   PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME(UTF8_UP)        PORT_CODE(KEYCODE_UP)
526   PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_H)  PORT_CHAR('H') PORT_CHAR('h')
527   PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_J)  PORT_CHAR('J') PORT_CHAR('j')
528   PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_K)  PORT_CHAR('K') PORT_CHAR('k')
529   PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_L)  PORT_CHAR('L') PORT_CHAR('l')
530   PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_COLON)      PORT_CHAR(';') PORT_CHAR(':')
531
532   PORT_START("ROW7")
533   PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Return")   PORT_CODE(KEYCODE_ENTER)    PORT_CHAR(13)
534   PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_N)  PORT_CHAR('N') PORT_CHAR('n')
535   PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_M)  PORT_CHAR('M') PORT_CHAR('m')
536   PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_COMMA)  PORT_CHAR(',') PORT_CHAR('<')
537   PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_STOP)   PORT_CHAR('.') PORT_CHAR('>')
538   PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_CODE(KEYCODE_SLASH)  PORT_CHAR('/') PORT_CHAR('?')
539
540   PORT_START("keyb_special")
541   PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD) PORT_NAME("Control") PORT_CODE(KEYCODE_LCONTROL) PORT_CHAR(UCHAR_SHIFT_2)
542   PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_UNUSED)
543   PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_UNUSED)
544   PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED)
545   PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNUSED)
546   PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_UNUSED)
547   PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNUSED)
548   PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNUSED)
549
550   PORT_START("a2_config")
551   PORT_CONFNAME(0x03, 0x00, "Composite monitor type")
552   PORT_CONFSETTING(0x00, "Color")
553   PORT_CONFSETTING(0x01, "B&W")
554   PORT_CONFSETTING(0x02, "Green")
555   PORT_CONFSETTING(0x03, "Amber")
556INPUT_PORTS_END
557
558static MACHINE_CONFIG_START( tk2000, tk2000_state )
559   /* basic machine hardware */
560   MCFG_CPU_ADD(A2_CPU_TAG, M6502, 1021800)     /* close to actual CPU frequency of 1.020484 MHz */
561   MCFG_CPU_PROGRAM_MAP(apple2_map)
562   MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", tk2000_state, apple2_interrupt, "screen", 0, 1)
563   MCFG_QUANTUM_TIME(attotime::from_hz(60))
564
565   MCFG_DEVICE_ADD(A2_VIDEO_TAG, APPLE2_VIDEO, XTAL_14_31818MHz)
566
567   MCFG_SCREEN_ADD("screen", RASTER)
568   MCFG_SCREEN_REFRESH_RATE(60)
569   MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500)) /* not accurate */
570   MCFG_SCREEN_SIZE(280*2, 262)
571   MCFG_SCREEN_VISIBLE_AREA(0, (280*2)-1,0,192-1)
572   MCFG_SCREEN_UPDATE_DRIVER(tk2000_state, screen_update)
573   MCFG_SCREEN_PALETTE("palette")
574
575   MCFG_PALETTE_ADD("palette", 16)
576   MCFG_PALETTE_INIT_OWNER(tk2000_state, tk2000)
577
578   /* sound hardware */
579   MCFG_SPEAKER_STANDARD_MONO("mono")
580   MCFG_SOUND_ADD(A2_SPEAKER_TAG, SPEAKER_SOUND, 0)
581   MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00)
582
583   /* /INH banking */
584   MCFG_DEVICE_ADD(A2_UPPERBANK_TAG, ADDRESS_MAP_BANK, 0)
585   MCFG_DEVICE_PROGRAM_MAP(inhbank_map)
586   MCFG_ADDRESS_MAP_BANK_ENDIANNESS(ENDIANNESS_LITTLE)
587   MCFG_ADDRESS_MAP_BANK_DATABUS_WIDTH(8)
588   MCFG_ADDRESS_MAP_BANK_STRIDE(0x4000)
589
590   MCFG_RAM_ADD(RAM_TAG)
591   MCFG_RAM_DEFAULT_SIZE("64K")
592
593   MCFG_CASSETTE_ADD(A2_CASSETTE_TAG)
594   MCFG_CASSETTE_DEFAULT_STATE(CASSETTE_STOPPED)
595MACHINE_CONFIG_END
596
597/***************************************************************************
598
599  Game driver(s)
600
601***************************************************************************/
602ROM_START(tk2000)
603   ROM_REGION(0x4000,"maincpu",0)
604   ROM_LOAD( "tk2000.rom",   0x000000, 0x004000, CRC(dfdbacc3) SHA1(bb37844c31616046630868a4399ee3d55d6df277) )
605ROM_END
606
607/*    YEAR  NAME      PARENT    COMPAT    MACHINE      INPUT     INIT      COMPANY            FULLNAME */
608COMP( 1984, tk2000,   0,        0,        tk2000,      tk2000,  driver_device,   0,        "Microdigital",    "TK2000", GAME_NOT_WORKING )
trunk/src/mess/machine/apple2.c
r241923r241924
928928static void apple2_mem_C300(running_machine &machine, offs_t begin, offs_t end, apple2_meminfo *meminfo)
929929{
930930   apple2_state *state = machine.driver_data<apple2_state>();
931
931932   if (((state->m_flags & (VAR_INTCXROM|VAR_SLOTC3ROM)) != VAR_SLOTC3ROM) && !(state->m_flags_mask & VAR_SLOTC3ROM))
932933   {
933934      meminfo->read_mem       = (begin & 0x0FFF) | (state->m_flags & VAR_ROMSWITCH ? 0x4000 : 0x0000) | APPLE2_MEM_ROM;
r241923r241924
982983{
983984   apple2_state *state = machine.driver_data<apple2_state>();
984985
985   if (state->m_inh_slot == INH_SLOT_INVALID)
986   if (state->m_inh_slot == -1)
986987   {
987988      if (state->m_flags & VAR_LCRAM)
988989      {
r241923r241924
10281029{
10291030   apple2_state *state = machine.driver_data<apple2_state>();
10301031
1031   if (state->m_inh_slot == INH_SLOT_INVALID)
1032   if (state->m_inh_slot == -1)
10321033   {
10331034      if (state->m_flags & VAR_LCRAM)
10341035      {
r241923r241924
19211922         if (offset == 0xa)  // RAM
19221923         {
19231924            apple2_setvar(VAR_TK2000RAM, ~0);
1924            printf("TK2000: RAM (PC %x)\n", m_maincpu->pc());
19251925         }
19261926         else if (offset == 0xb) // ROM
19271927         {
19281928            apple2_setvar(0, ~VAR_TK2000RAM);
1929            printf("TK2000: ROM (PC %x)\n", m_maincpu->pc());
19301929         }
19311930      }
19321931
r241923r241924
22262225
22272226void apple2_state::apple2_init_common()
22282227{
2229   m_inh_slot = INH_SLOT_INVALID;
2228   m_inh_slot = -1;
22302229   m_flags = 0;
22312230   m_fdc_diskreg = 0;
22322231
trunk/src/mess/mess.mak
r241923r241924
993993
994994$(MESSOBJ)/apple.a:             \
995995   $(MESS_DRIVERS)/apple1.o $(MESS_MACHINE)/apple1.o $(MESS_VIDEO)/apple1.o \
996   $(MESS_DRIVERS)/apple2.o $(MESS_MACHINE)/apple2.o $(MESS_VIDEO)/apple2.o \
997      $(MESS_DRIVERS)/apple2gs.o $(MESS_MACHINE)/apple2gs.o $(MESS_VIDEO)/apple2gs.o \
996   $(MESS_DRIVERS)/apple2.o $(MESS_DRIVERS)/apple2e.o $(MESS_MACHINE)/apple2.o $(MESS_VIDEO)/apple2.o \
997   $(MESS_DRIVERS)/tk2000.o \
998   $(MESS_DRIVERS)/apple2gs.o $(MESS_MACHINE)/apple2gs.o $(MESS_VIDEO)/apple2gs.o \
998999   $(MESS_DRIVERS)/apple3.o $(MESS_MACHINE)/apple3.o $(MESS_VIDEO)/apple3.o \
9991000   $(MESS_DRIVERS)/lisa.o $(MESS_MACHINE)/lisa.o \
10001001   $(MESS_DRIVERS)/mac.o $(MESS_AUDIO)/mac.o $(MESS_MACHINE)/egret.o $(MESS_MACHINE)/mac.o $(MESS_MACHINE)/macadb.o $(MESS_MACHINE)/macrtc.o $(MESS_MACHINE)/mackbd.o $(MESS_MACHINE)/swim.o $(MESS_VIDEO)/mac.o \
r241923r241924
20182019$(MESS_MACHINE)/egret.o:    $(MESSSRC)/machine/egret.c\
20192020            $(MESSSRC)/machine/egret.h
20202021
2021$(MESS_DRIVERS)/apple2.o:   $(MESSSRC)/includes/apple2.h
2022$(MESS_DRIVERS)/apple2.o:   $(MESSSRC)/video/apple2.h
2023$(MESS_DRIVERS)/apple2e.o:  $(MESSSRC)/video/apple2.h
20222024$(MESS_MACHINE)/apple2.o:   $(MESSSRC)/includes/apple2.h
2023$(MESS_VIDEO)/apple2.o:     $(MESSSRC)/includes/apple2.h
2025$(MESS_VIDEO)/apple2.o:     $(MESSSRC)/includes/apple2.h $(MESSSRC)/video/apple2.h
20242026$(MESS_DRIVERS)/apple2gs.o: $(MESSSRC)/includes/apple2.h $(MESSSRC)/includes/apple2gs.h
20252027$(MESS_MACHINE)/apple2gs.o: $(MESSSRC)/includes/apple2.h $(MESSSRC)/includes/apple2gs.h
20262028$(MESS_VIDEO)/apple2gs.o:   $(MESSSRC)/includes/apple2.h $(MESSSRC)/includes/apple2gs.h
trunk/src/mess/video/apple2.c
r241923r241924
88#include "includes/apple2.h"
99#include "machine/ram.h"
1010
11#include "video/apple2.h"
12
1113/***************************************************************************/
1214
1315
r241923r241924
664666   }
665667   return 0;
666668}
669
670/*
671   New implementation
672*/
673
674const device_type APPLE2_VIDEO = &device_creator<a2_video_device>;
675
676//-------------------------------------------------
677//  a2_video_device - constructor
678//-------------------------------------------------
679
680a2_video_device::a2_video_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock)
681   : device_t(mconfig, APPLE2_VIDEO, "Apple II video", tag, owner, clock, "a2video", __FILE__)
682{
683}
684
685void a2_video_device::device_start()
686{
687   static const UINT8 hires_artifact_color_table[] =
688   {
689      BLACK,  PURPLE, GREEN,  WHITE,
690      BLACK,  BLUE,   ORANGE, WHITE
691   };
692   static const UINT8 dhires_artifact_color_table[] =
693   {
694      BLACK,      DKGREEN,    BROWN,  GREEN,
695      DKRED,      DKGRAY,     ORANGE, YELLOW,
696      DKBLUE,     BLUE,       GRAY,   AQUA,
697      PURPLE,     LTBLUE,     PINK,   WHITE
698   };
699
700   // generate hi-res artifact data
701   int i, j;
702   UINT16 c;
703
704   /* 2^3 dependent pixels * 2 color sets * 2 offsets */
705   m_hires_artifact_map = auto_alloc_array(machine(), UINT16, 8 * 2 * 2);
706
707   /* build hires artifact map */
708   for (i = 0; i < 8; i++)
709   {
710      for (j = 0; j < 2; j++)
711      {
712         if (i & 0x02)
713         {
714            if ((i & 0x05) != 0)
715               c = 3;
716            else
717               c = j ? 2 : 1;
718         }
719         else
720         {
721            if ((i & 0x05) == 0x05)
722               c = j ? 1 : 2;
723            else
724               c = 0;
725         }
726         m_hires_artifact_map[ 0 + j*8 + i] = hires_artifact_color_table[(c + 0) % 8];
727         m_hires_artifact_map[16 + j*8 + i] = hires_artifact_color_table[(c + 4) % 8];
728      }
729   }
730
731   /* 2^4 dependent pixels */
732   m_dhires_artifact_map = auto_alloc_array(machine(), UINT16, 16);
733
734   /* build double hires artifact map */
735   for (i = 0; i < 16; i++)
736   {
737      m_dhires_artifact_map[i] = dhires_artifact_color_table[i];
738   }
739
740   save_item(NAME(m_page2));
741   save_item(NAME(m_flash));
742   save_item(NAME(m_mix));
743   save_item(NAME(m_graphics));
744   save_item(NAME(m_hires));
745   save_item(NAME(m_dhires));
746   save_item(NAME(m_80col));
747   save_item(NAME(m_altcharset));
748}
749
750void a2_video_device::device_reset()
751{
752   m_page2 = false;
753   m_graphics = false;
754   m_hires = false;
755   m_80col = false;
756   m_altcharset = false;
757   m_dhires = false;
758   m_flash = false;
759   m_sysconfig = 0;
760}
761
762void a2_video_device::plot_text_character(bitmap_ind16 &bitmap, int xpos, int ypos, int xscale, UINT32 code,
763   const UINT8 *textgfx_data, UINT32 textgfx_datalen, int fg, int bg)
764{
765   int x, y, i;
766   const UINT8 *chardata;
767   UINT16 color;
768
769   if (!m_altcharset)
770   {
771      if ((code >= 0x40) && (code <= 0x7f))
772      {
773         code &= 0x3f;
774
775         if (m_flash)
776         {
777            i = fg;
778            fg = bg;
779            bg = i;
780         }
781      }
782   }
783   else
784   {
785      if ((code >= 0x60) && (code <= 0x7f))
786      {
787         code |= 0x80;   // map to lowercase normal
788         i = fg;         // and flip the color
789         fg = bg;
790         bg = i;
791      }
792   }
793
794   /* look up the character data */
795   chardata = &textgfx_data[(code * 8)];
796
797   for (y = 0; y < 8; y++)
798   {
799      for (x = 0; x < 7; x++)
800      {
801         color = (chardata[y] & (1 << x)) ? bg : fg;
802
803         for (i = 0; i < xscale; i++)
804         {
805            bitmap.pix16(ypos + y, xpos + (x * xscale) + i) = color;
806         }
807      }
808   }
809}
810
811void a2_video_device::plot_text_character_orig(bitmap_ind16 &bitmap, int xpos, int ypos, int xscale, UINT32 code,
812   const UINT8 *textgfx_data, UINT32 textgfx_datalen, int fg, int bg)
813{
814   int x, y, i;
815   const UINT8 *chardata;
816   UINT16 color;
817
818   if ((code >= 0x40) && (code <= 0x7f))
819   {
820      if (m_flash)
821      {
822         i = fg;
823         fg = bg;
824         bg = i;
825      }
826   }
827
828   /* look up the character data */
829   chardata = &textgfx_data[(code * 8)];
830
831   for (y = 0; y < 8; y++)
832   {
833      for (x = 0; x < 7; x++)
834      {
835         color = (chardata[y] & (1 << (6-x))) ? fg : bg;
836
837         for (i = 0; i < xscale; i++)
838         {
839            bitmap.pix16(ypos + y, xpos + (x * xscale) + i) = color;
840         }
841      }
842   }
843}
844
845void a2_video_device::lores_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int beginrow, int endrow)
846{
847   int row, col, y, x;
848   UINT8 code;
849   UINT32 start_address = m_page2 ? 0x0800 : 0x0400;
850   UINT32 address;
851   int fg;
852
853   switch (m_sysconfig & 0x03)
854   {
855      case 0: fg = WHITE; break;
856      case 1: fg = WHITE; break;
857      case 2: fg = GREEN; break;
858      case 3: fg = ORANGE; break;
859   }
860
861   /* perform adjustments */
862   beginrow = MAX(beginrow, cliprect.min_y - (cliprect.min_y % 8));
863   endrow = MIN(endrow, cliprect.max_y - (cliprect.max_y % 8) + 7);
864
865   if (!(m_sysconfig & 0x03))
866   {
867      for (row = beginrow; row <= endrow; row += 8)
868      {
869         for (col = 0; col < 40; col++)
870         {
871            /* calculate adderss */
872            address = start_address + ((((row/8) & 0x07) << 7) | (((row/8) & 0x18) * 5 + col));
873
874            /* perform the lookup */
875            code = m_ram_ptr[address];
876
877            /* and now draw */
878            for (y = 0; y < 4; y++)
879            {
880               for (x = 0; x < 14; x++)
881                  bitmap.pix16(row + y, col * 14 + x) = (code >> 0) & 0x0F;
882            }
883            for (y = 4; y < 8; y++)
884            {
885               for (x = 0; x < 14; x++)
886                  bitmap.pix16(row + y, col * 14 + x) = (code >> 4) & 0x0F;
887            }
888         }
889      }
890   }
891   else
892   {
893      for (row = beginrow; row <= endrow; row += 8)
894      {
895         for (col = 0; col < 40; col++)
896         {
897            UINT8 bits;
898
899            /* calculate adderss */
900            address = start_address + ((((row/8) & 0x07) << 7) | (((row/8) & 0x18) * 5 + col));
901
902            /* perform the lookup */
903            code = m_ram_ptr[address];
904
905            bits = (code >> 0) & 0x0F;
906            /* and now draw */
907            for (y = 0; y < 4; y++)
908            {
909               for (x = 0; x < 14; x++)
910               {
911                  bitmap.pix16(row + y, col * 14 + x) = bits & (1 << (x % 4)) ? fg : 0;
912               }
913            }
914
915            bits = (code >> 4) & 0x0F;
916            for (y = 4; y < 8; y++)
917            {
918               for (x = 0; x < 14; x++)
919                  bitmap.pix16(row + y, col * 14 + x) = bits & (1 << (x % 4)) ? fg : 0;
920            }
921         }
922      }
923   }
924}
925
926void a2_video_device::dlores_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int beginrow, int endrow)
927{
928   int row, col, y;
929   UINT8 code, auxcode;
930   UINT32 start_address = m_page2 ? 0x0800 : 0x0400;
931   UINT32 address;
932   UINT16 *pixel;
933   static const int aux_colors[16] = { 0, 2, 4, 6, 8, 0xa, 0xc, 0xe, 1, 3, 5, 7, 9, 0xb, 0xd, 0xf };
934   int fg;
935
936   switch (m_sysconfig & 0x03)
937   {
938      case 0: fg = WHITE; break;
939      case 1: fg = WHITE; break;
940      case 2: fg = GREEN; break;
941      case 3: fg = ORANGE; break;
942   }
943
944   /* perform adjustments */
945   beginrow = MAX(beginrow, cliprect.min_y - (cliprect.min_y % 8));
946   endrow = MIN(endrow, cliprect.max_y - (cliprect.max_y % 8) + 7);
947
948   if (!(m_sysconfig & 0x03))
949   {
950      for (row = beginrow; row <= endrow; row += 8)
951      {
952         for (col = 0; col < 40; col++)
953         {
954            /* calculate adderss */
955            address = start_address + ((((row/8) & 0x07) << 7) | (((row/8) & 0x18) * 5 + col));
956
957            /* perform the lookup */
958            code = m_ram_ptr[address];
959            auxcode = m_aux_ptr[address];
960
961            /* and now draw */
962            for (y = 0; y < 4; y++)
963            {
964               UINT16 *vram = &bitmap.pix16(row + y, (col * 14));
965
966               *vram++ = aux_colors[(auxcode >> 0) & 0x0F];
967               *vram++ = aux_colors[(auxcode >> 0) & 0x0F];
968               *vram++ = aux_colors[(auxcode >> 0) & 0x0F];
969               *vram++ = aux_colors[(auxcode >> 0) & 0x0F];
970               *vram++ = aux_colors[(auxcode >> 0) & 0x0F];
971               *vram++ = aux_colors[(auxcode >> 0) & 0x0F];
972               *vram++ = aux_colors[(auxcode >> 0) & 0x0F];
973               *vram++ = (code >> 0) & 0x0F;
974               *vram++ = (code >> 0) & 0x0F;
975               *vram++ = (code >> 0) & 0x0F;
976               *vram++ = (code >> 0) & 0x0F;
977               *vram++ = (code >> 0) & 0x0F;
978               *vram++ = (code >> 0) & 0x0F;
979               *vram++ = (code >> 0) & 0x0F;
980            }
981            for (y = 4; y < 8; y++)
982            {
983               UINT16 *vram = &bitmap.pix16(row + y, (col * 14));
984
985               *vram++ = aux_colors[(auxcode >> 4) & 0x0F];
986               *vram++ = aux_colors[(auxcode >> 4) & 0x0F];
987               *vram++ = aux_colors[(auxcode >> 4) & 0x0F];
988               *vram++ = aux_colors[(auxcode >> 4) & 0x0F];
989               *vram++ = aux_colors[(auxcode >> 4) & 0x0F];
990               *vram++ = aux_colors[(auxcode >> 4) & 0x0F];
991               *vram++ = aux_colors[(auxcode >> 4) & 0x0F];
992               *vram++ = (code >> 4) & 0x0F;
993               *vram++ = (code >> 4) & 0x0F;
994               *vram++ = (code >> 4) & 0x0F;
995               *vram++ = (code >> 4) & 0x0F;
996               *vram++ = (code >> 4) & 0x0F;
997               *vram++ = (code >> 4) & 0x0F;
998               *vram++ = (code >> 4) & 0x0F;
999            }
1000         }
1001      }
1002   }
1003   else
1004   {
1005      for (row = beginrow; row <= endrow; row += 8)
1006      {
1007         for (col = 0; col < 40; col++)
1008         {
1009            UINT8 bits, abits;
1010
1011            /* calculate adderss */
1012            address = start_address + ((((row/8) & 0x07) << 7) | (((row/8) & 0x18) * 5 + col));
1013
1014            /* perform the lookup */
1015            code = m_ram_ptr[address];
1016            auxcode = m_aux_ptr[address];
1017
1018            bits = (code >> 0) & 0x0F;
1019            abits = (auxcode >> 0) & 0x0F;
1020
1021            /* and now draw */
1022            for (y = 0; y < 4; y++)
1023            {
1024               UINT16 *vram = &bitmap.pix16(row + y, (col * 14));
1025
1026               *vram++ = abits & (1 << 0) ? fg : 0;
1027               *vram++ = abits & (1 << 1) ? fg : 0;
1028               *vram++ = abits & (1 << 2) ? fg : 0;
1029               *vram++ = abits & (1 << 3) ? fg : 0;
1030               *vram++ = abits & (1 << 0) ? fg : 0;
1031               *vram++ = abits & (1 << 1) ? fg : 0;
1032               *vram++ = abits & (1 << 2) ? fg : 0;
1033               *vram++ = bits & (1 << 0) ? fg : 0;
1034               *vram++ = bits & (1 << 1) ? fg : 0;
1035               *vram++ = bits & (1 << 2) ? fg : 0;
1036               *vram++ = bits & (1 << 3) ? fg : 0;
1037               *vram++ = bits & (1 << 0) ? fg : 0;
1038               *vram++ = bits & (1 << 1) ? fg : 0;
1039               *vram++ = bits & (1 << 2) ? fg : 0;
1040            }
1041
1042            bits = (code >> 4) & 0x0F;
1043            abits = (auxcode >> 4) & 0x0F;
1044
1045            for (y = 4; y < 8; y++)
1046            {
1047               UINT16 *vram = &bitmap.pix16(row + y, (col * 14));
1048
1049               *vram++ = abits & (1 << 0) ? fg : 0;
1050               *vram++ = abits & (1 << 1) ? fg : 0;
1051               *vram++ = abits & (1 << 2) ? fg : 0;
1052               *vram++ = abits & (1 << 3) ? fg : 0;
1053               *vram++ = abits & (1 << 0) ? fg : 0;
1054               *vram++ = abits & (1 << 1) ? fg : 0;
1055               *vram++ = abits & (1 << 2) ? fg : 0;
1056               *vram++ = bits & (1 << 0) ? fg : 0;
1057               *vram++ = bits & (1 << 1) ? fg : 0;
1058               *vram++ = bits & (1 << 2) ? fg : 0;
1059               *vram++ = bits & (1 << 3) ? fg : 0;
1060               *vram++ = bits & (1 << 0) ? fg : 0;
1061               *vram++ = bits & (1 << 1) ? fg : 0;
1062               *vram++ = bits & (1 << 2) ? fg : 0;
1063            }
1064         }
1065      }
1066   }
1067}
1068
1069void a2_video_device::text_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int beginrow, int endrow)
1070{
1071   int row, col;
1072   UINT32 start_address;
1073   UINT32 address;
1074   UINT8 *aux_page = m_ram_ptr;
1075   int fg;
1076   int bg = 0;
1077
1078   if (m_80col)
1079   {
1080      start_address = 0x400;
1081      if (m_aux_ptr)
1082      {
1083         aux_page = m_aux_ptr;
1084      }
1085   }
1086   else
1087   {
1088      start_address = m_page2 ? 0x800 : 0x400;
1089   }
1090
1091   beginrow = MAX(beginrow, cliprect.min_y - (cliprect.min_y % 8));
1092   endrow = MIN(endrow, cliprect.max_y - (cliprect.max_y % 8) + 7);
1093
1094   switch (m_sysconfig & 0x03)
1095   {
1096      case 0: fg = WHITE; break;
1097      case 1: fg = WHITE; break;
1098      case 2: fg = GREEN; break;
1099      case 3: fg = ORANGE; break;
1100   }
1101
1102   for (row = beginrow; row <= endrow; row += 8)
1103   {
1104      if (m_80col)
1105      {
1106         for (col = 0; col < 40; col++)
1107         {
1108            /* calculate address */
1109            address = start_address + ((((row/8) & 0x07) << 7) | (((row/8) & 0x18) * 5 + col));
1110
1111            plot_text_character(bitmap, col * 14, row, 1, aux_page[address],
1112               m_char_ptr, m_char_size, fg, bg);
1113            plot_text_character(bitmap, col * 14 + 7, row, 1, m_ram_ptr[address],
1114               m_char_ptr, m_char_size, fg, bg);
1115         }
1116      }
1117      else
1118      {
1119         for (col = 0; col < 40; col++)
1120         {
1121            /* calculate address */
1122            address = start_address + ((((row/8) & 0x07) << 7) | (((row/8) & 0x18) * 5 + col));
1123            plot_text_character(bitmap, col * 14, row, 2, m_ram_ptr[address],
1124               m_char_ptr, m_char_size, fg, bg);
1125         }
1126      }
1127   }
1128}
1129
1130void a2_video_device::text_update_orig(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int beginrow, int endrow)
1131{
1132   int row, col;
1133   UINT32 start_address = m_page2 ? 0x800 : 0x400; 
1134   UINT32 address;
1135   UINT8 *aux_page = m_ram_ptr;
1136   int fg;
1137   int bg = 0;
1138
1139   beginrow = MAX(beginrow, cliprect.min_y - (cliprect.min_y % 8));
1140   endrow = MIN(endrow, cliprect.max_y - (cliprect.max_y % 8) + 7);
1141
1142   switch (m_sysconfig & 0x03)
1143   {
1144      case 0: fg = WHITE; break;
1145      case 1: fg = WHITE; break;
1146      case 2: fg = GREEN; break;
1147      case 3: fg = ORANGE; break;
1148   }
1149
1150   for (row = beginrow; row <= endrow; row += 8)
1151   {
1152      for (col = 0; col < 40; col++)
1153      {
1154         /* calculate address */
1155         address = start_address + ((((row/8) & 0x07) << 7) | (((row/8) & 0x18) * 5 + col));
1156         plot_text_character_orig(bitmap, col * 14, row, 2, m_ram_ptr[address],
1157            m_char_ptr, m_char_size, fg, bg);
1158      }
1159   }
1160}
1161
1162void a2_video_device::hgr_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int beginrow, int endrow)
1163{
1164   const UINT8 *vram;
1165   int row, col, b;
1166   int offset;
1167   UINT8 vram_row[42];
1168   UINT16 v;
1169   UINT16 *p;
1170   UINT32 w;
1171   UINT16 *artifact_map_ptr;
1172   int mon_type = m_sysconfig & 0x03;
1173
1174   /* sanity checks */
1175   if (beginrow < cliprect.min_y)
1176      beginrow = cliprect.min_y;
1177   if (endrow > cliprect.max_y)
1178      endrow = cliprect.max_y;
1179   if (endrow < beginrow)
1180      return;
1181
1182   vram = &m_ram_ptr[(m_page2 ? 0x4000 : 0x2000)];
1183
1184   vram_row[0] = 0;
1185   vram_row[41] = 0;
1186
1187   for (row = beginrow; row <= endrow; row++)
1188   {
1189      for (col = 0; col < 40; col++)
1190      {
1191         offset = ((((row/8) & 0x07) << 7) | (((row/8) & 0x18) * 5 + col)) | ((row & 7) << 10);
1192         vram_row[1+col] = vram[offset];
1193      }
1194
1195      p = &bitmap.pix16(row);
1196
1197      for (col = 0; col < 40; col++)
1198      {
1199         w =     (((UINT32) vram_row[col+0] & 0x7f) <<  0)
1200            |   (((UINT32) vram_row[col+1] & 0x7f) <<  7)
1201            |   (((UINT32) vram_row[col+2] & 0x7f) << 14);
1202
1203         switch (mon_type)
1204         {
1205            case 0:
1206               artifact_map_ptr = &m_hires_artifact_map[((vram_row[col+1] & 0x80) >> 7) * 16];
1207               for (b = 0; b < 7; b++)
1208               {
1209                  v = artifact_map_ptr[((w >> (b + 7-1)) & 0x07) | (((b ^ col) & 0x01) << 3)];
1210                  *(p++) = v;
1211                  *(p++) = v;
1212               }
1213               break;
1214
1215            case 1:
1216               w >>= 7;
1217               for (b = 0; b < 7; b++)
1218               {
1219                  v = (w & 1);
1220                  w >>= 1;
1221                  *(p++) = v ? WHITE : BLACK;
1222                  *(p++) = v ? WHITE : BLACK;
1223               }
1224               break;
1225
1226            case 2:
1227               w >>= 7;
1228               for (b = 0; b < 7; b++)
1229               {
1230                  v = (w & 1);
1231                  w >>= 1;
1232                  *(p++) = v ? GREEN : BLACK;
1233                  *(p++) = v ? GREEN : BLACK;
1234               }
1235               break;
1236
1237            case 3:
1238               w >>= 7;
1239               for (b = 0; b < 7; b++)
1240               {
1241                  v = (w & 1);
1242                  w >>= 1;
1243                  *(p++) = v ? ORANGE : BLACK;
1244                  *(p++) = v ? ORANGE : BLACK;
1245               }
1246               break;
1247         }
1248      }
1249   }
1250}
1251
1252// similar to regular A2 except page 2 is at $A000
1253void a2_video_device::hgr_update_tk2000(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int beginrow, int endrow)
1254{
1255   const UINT8 *vram;
1256   int row, col, b;
1257   int offset;
1258   UINT8 vram_row[42];
1259   UINT16 v;
1260   UINT16 *p;
1261   UINT32 w;
1262   UINT16 *artifact_map_ptr;
1263   int mon_type = m_sysconfig & 0x03;
1264
1265   /* sanity checks */
1266   if (beginrow < cliprect.min_y)
1267      beginrow = cliprect.min_y;
1268   if (endrow > cliprect.max_y)
1269      endrow = cliprect.max_y;
1270   if (endrow < beginrow)
1271      return;
1272
1273   vram = &m_ram_ptr[(m_page2 ? 0xa000 : 0x2000)];
1274
1275   vram_row[0] = 0;
1276   vram_row[41] = 0;
1277
1278   for (row = beginrow; row <= endrow; row++)
1279   {
1280      for (col = 0; col < 40; col++)
1281      {
1282         offset = ((((row/8) & 0x07) << 7) | (((row/8) & 0x18) * 5 + col)) | ((row & 7) << 10);
1283         vram_row[1+col] = vram[offset];
1284      }
1285
1286      p = &bitmap.pix16(row);
1287
1288      for (col = 0; col < 40; col++)
1289      {
1290         w =     (((UINT32) vram_row[col+0] & 0x7f) <<  0)
1291            |   (((UINT32) vram_row[col+1] & 0x7f) <<  7)
1292            |   (((UINT32) vram_row[col+2] & 0x7f) << 14);
1293
1294         switch (mon_type)
1295         {
1296            case 0:
1297               artifact_map_ptr = &m_hires_artifact_map[((vram_row[col+1] & 0x80) >> 7) * 16];
1298               for (b = 0; b < 7; b++)
1299               {
1300                  v = artifact_map_ptr[((w >> (b + 7-1)) & 0x07) | (((b ^ col) & 0x01) << 3)];
1301                  *(p++) = v;
1302                  *(p++) = v;
1303               }
1304               break;
1305
1306            case 1:
1307               w >>= 7;
1308               for (b = 0; b < 7; b++)
1309               {
1310                  v = (w & 1);
1311                  w >>= 1;
1312                  *(p++) = v ? WHITE : BLACK;
1313                  *(p++) = v ? WHITE : BLACK;
1314               }
1315               break;
1316
1317            case 2:
1318               w >>= 7;
1319               for (b = 0; b < 7; b++)
1320               {
1321                  v = (w & 1);
1322                  w >>= 1;
1323                  *(p++) = v ? GREEN : BLACK;
1324                  *(p++) = v ? GREEN : BLACK;
1325               }
1326               break;
1327
1328            case 3:
1329               w >>= 7;
1330               for (b = 0; b < 7; b++)
1331               {
1332                  v = (w & 1);
1333                  w >>= 1;
1334                  *(p++) = v ? ORANGE : BLACK;
1335                  *(p++) = v ? ORANGE : BLACK;
1336               }
1337               break;
1338         }
1339      }
1340   }
1341}
1342
1343void a2_video_device::dhgr_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int beginrow, int endrow)
1344{
1345   const UINT8 *vram, *vaux;
1346   int row, col, b;
1347   int offset;
1348   UINT8 vram_row[82];
1349   UINT16 v;
1350   UINT16 *p;
1351   UINT32 w;
1352   int page = m_page2 ? 0x4000 : 0x2000;
1353   int mon_type = m_sysconfig & 0x03;
1354
1355   /* sanity checks */
1356   if (beginrow < cliprect.min_y)
1357      beginrow = cliprect.min_y;
1358   if (endrow > cliprect.max_y)
1359      endrow = cliprect.max_y;
1360   if (endrow < beginrow)
1361      return;
1362
1363   vram = &m_ram_ptr[page];
1364   if (m_aux_ptr)
1365   {
1366      vaux = m_aux_ptr;
1367   }
1368   else
1369   {
1370      vaux = vram;
1371   }
1372   vaux += page;
1373
1374   vram_row[0] = 0;
1375   vram_row[81] = 0;
1376
1377   for (row = beginrow; row <= endrow; row++)
1378   {
1379      for (col = 0; col < 40; col++)
1380      {
1381         offset = ((((row/8) & 0x07) << 7) | (((row/8) & 0x18) * 5 + col)) | ((row & 7) << 10);
1382         vram_row[1+(col*2)+0] = vaux[offset];
1383         vram_row[1+(col*2)+1] = vram[offset];
1384      }
1385
1386      p = &bitmap.pix16(row);
1387
1388      for (col = 0; col < 80; col++)
1389      {
1390         w =     (((UINT32) vram_row[col+0] & 0x7f) <<  0)
1391            |   (((UINT32) vram_row[col+1] & 0x7f) <<  7)
1392            |   (((UINT32) vram_row[col+2] & 0x7f) << 14);
1393
1394         switch (mon_type)
1395         {
1396            case 0:
1397               for (b = 0; b < 7; b++)
1398               {
1399                  v = m_dhires_artifact_map[((((w >> (b + 7-1)) & 0x0F) * 0x11) >> (((2-(col*7+b))) & 0x03)) & 0x0F];
1400                  *(p++) = v;
1401               }
1402               break;
1403
1404            case 1:
1405               w >>= 7;
1406               for (b = 0; b < 7; b++)
1407               {
1408                  v = (w & 1);
1409                  w >>= 1;
1410                  *(p++) = v ? WHITE : BLACK;
1411               }
1412               break;
1413
1414            case 2:
1415               w >>= 7;
1416               for (b = 0; b < 7; b++)
1417               {
1418                  v = (w & 1);
1419                  w >>= 1;
1420                  *(p++) = v ? GREEN : BLACK;
1421               }
1422               break;
1423
1424            case 3:
1425               w >>= 7;
1426               for (b = 0; b < 7; b++)
1427               {
1428                  v = (w & 1);
1429                  w >>= 1;
1430                  *(p++) = v ? ORANGE : BLACK;
1431               }
1432               break;
1433         }
1434      }
1435   }
1436}
1437
1438/* according to Steve Nickolas (author of Dapple), our original palette would
1439 * have been more appropriate for an Apple IIgs.  So we've substituted in the
1440 * Robert Munafo palette instead, which is more accurate on 8-bit Apples
1441 */
1442static const rgb_t apple2_palette[] =
1443{
1444   rgb_t::black,
1445   rgb_t(0xE3, 0x1E, 0x60), /* Dark Red */
1446   rgb_t(0x60, 0x4E, 0xBD), /* Dark Blue */
1447   rgb_t(0xFF, 0x44, 0xFD), /* Purple */
1448   rgb_t(0x00, 0xA3, 0x60), /* Dark Green */
1449   rgb_t(0x9C, 0x9C, 0x9C), /* Dark Gray */
1450   rgb_t(0x14, 0xCF, 0xFD), /* Medium Blue */
1451   rgb_t(0xD0, 0xC3, 0xFF), /* Light Blue */
1452   rgb_t(0x60, 0x72, 0x03), /* Brown */
1453   rgb_t(0xFF, 0x6A, 0x3C), /* Orange */
1454   rgb_t(0x9C, 0x9C, 0x9C), /* Light Grey */
1455   rgb_t(0xFF, 0xA0, 0xD0), /* Pink */
1456   rgb_t(0x14, 0xF5, 0x3C), /* Light Green */
1457   rgb_t(0xD0, 0xDD, 0x8D), /* Yellow */
1458   rgb_t(0x72, 0xFF, 0xD0), /* Aquamarine */
1459   rgb_t(0xFF, 0xFF, 0xFF)  /* White */
1460};
1461
1462/* Initialize the palette */
1463PALETTE_INIT_MEMBER(a2_video_device, apple2)
1464{
1465   palette.set_pen_colors(0, apple2_palette, ARRAY_LENGTH(apple2_palette));
1466}
1467
1468
trunk/src/mess/video/apple2.h
r0r241924
1/*********************************************************************
2 
3   video/apple2.h   - Video handling for 8-bit Apple IIs
4 
5*********************************************************************/
6
7#ifndef __A2_VIDEO__
8#define __A2_VIDEO__
9
10#include "emu.h"
11
12class a2_video_device :
13   public device_t
14{
15public:
16   // construction/destruction
17   a2_video_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
18
19   DECLARE_PALETTE_INIT(apple2);
20
21   bool m_page2;
22   bool m_flash;
23   bool m_mix;
24   bool m_graphics;
25   bool m_hires;
26   bool m_dhires;
27   bool m_80col;
28   bool m_altcharset;
29   UINT16 *m_hires_artifact_map;
30   UINT16 *m_dhires_artifact_map;
31
32   UINT8 *m_ram_ptr, *m_aux_ptr, *m_char_ptr;
33   int m_char_size;
34
35   int m_sysconfig;
36
37   void text_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int beginrow, int endrow);
38   void text_update_orig(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int beginrow, int endrow);
39   void lores_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int beginrow, int endrow);
40   void dlores_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int beginrow, int endrow);
41   void hgr_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int beginrow, int endrow);
42   void hgr_update_tk2000(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int beginrow, int endrow);
43   void dhgr_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int beginrow, int endrow);
44
45protected:
46   virtual void device_reset();
47   virtual void device_start();
48
49private:
50   void plot_text_character(bitmap_ind16 &bitmap, int xpos, int ypos, int xscale, UINT32 code, const UINT8 *textgfx_data, UINT32 textgfx_datalen, int fg, int bg);
51   void plot_text_character_orig(bitmap_ind16 &bitmap, int xpos, int ypos, int xscale, UINT32 code, const UINT8 *textgfx_data, UINT32 textgfx_datalen, int fg, int bg);
52};
53
54// device type definition
55extern const device_type APPLE2_VIDEO;
56
57#endif


Previous 199869 Revisions Next


© 1997-2024 The MAME Team