Previous 15994 Revisions Next

r9548 Tuesday 9th November, 2010 at 18:55:24 UTC by Curt Coder
[ABC80] Refactored driver to define ADDRESS_MAP_MODERN.
[docs]messnew.txt
[src/mess/drivers]abc80.c
[src/mess/includes]abc80.h
[src/mess/video]abc80.c

src/mess/video/abc80.c
r9547r9548
77#include "emu.h"
88#include "includes/abc80.h"
99
10/* Graphics Layout */
1110
11
12//-------------------------------------------------
13//  gfx_layout charlayout
14//-------------------------------------------------
15
1216static const gfx_layout charlayout =
1317{
1418   6, 10,
r9547r9548
2024   10*8
2125};
2226
23/* Graphics Decode Information */
2427
28//-------------------------------------------------
29//  GFXDECODE( abc80 )
30//-------------------------------------------------
31
2532static GFXDECODE_START( abc80 )
2633   GFXDECODE_ENTRY( "chargen", 0,      charlayout, 0, 2 ) // normal characters
2734   GFXDECODE_ENTRY( "chargen", 0x500, charlayout, 0, 2 ) // graphics characters
2835GFXDECODE_END
2936
37
38//-------------------------------------------------
39//  PALETTE_INIT( abc80 )
40//-------------------------------------------------
41
3042static PALETTE_INIT( abc80 )
3143{
3244   palette_set_color(machine, 0, RGB_BLACK);
r9547r9548
3547   palette_set_color(machine, 3, RGB_BLACK);
3648}
3749
50
51//-------------------------------------------------
52//  TILE_GET_INFO( abc80_get_tile_info )
53//-------------------------------------------------
54
3855static TILE_GET_INFO( abc80_get_tile_info )
3956{
4057   abc80_state *state = machine->driver_data<abc80_state>();
4158
42   int attr = state->video_ram[tile_index];
59   int attr = state->m_video_ram[tile_index];
4360   int code = attr & 0x7f;
44   int color = (state->blink && (attr & 0x80)) ? 1 : 0;
61   int color = (state->m_blink && (attr & 0x80)) ? 1 : 0;
4562   int r = (tile_index & 0x78) >> 3;
4663   int l = (tile_index & 0x380) >> 7;
4764   int row = l + ((r / 5) * 8);
4865
49   if (row != state->char_row)
66   if (row != state->m_char_row)
5067   {
51      state->char_bank = 0;
52      state->char_row = row;
68      state->m_char_bank = 0;
69      state->m_char_row = row;
5370   }
5471
5572   if (code == ABC80_MODE_TEXT)
5673   {
57      state->char_bank = 0;
74      state->m_char_bank = 0;
5875   }
5976
6077   if (code == ABC80_MODE_GFX)
6178   {
62      state->char_bank = 1;
79      state->m_char_bank = 1;
6380   }
6481
65   SET_TILE_INFO(state->char_bank, code, color, 0);
82   SET_TILE_INFO(state->m_char_bank, code, color, 0);
6683}
6784
85
86//-------------------------------------------------
87//  abc80_tilemap_scan - tilemap scanning
88//-------------------------------------------------
89
6890static UINT32 abc80_tilemap_scan( UINT32 col, UINT32 row, UINT32 num_cols, UINT32 num_rows )
6991{
7092   /* logical (col,row) -> memory offset */
7193   return ((row & 0x07) << 7) + (row >> 3) * num_cols + col;
7294}
7395
74static TIMER_DEVICE_CALLBACK(abc80_blink_tick)
96
97//-------------------------------------------------
98//  TIMER_DEVICE_CALLBACK( blink_tick )
99//-------------------------------------------------
100
101static TIMER_DEVICE_CALLBACK( blink_tick )
75102{
76103   abc80_state *state = timer.machine->driver_data<abc80_state>();
77104
78   state->blink = !state->blink;
105   state->m_blink = !state->m_blink;
79106}
80107
81#ifdef UNUSED_FUNCTION
82static void abc80_update(running_machine *machine, bitmap_t *bitmap, const rectangle *cliprect)
108
109//-------------------------------------------------
110//  update_screen -
111//-------------------------------------------------
112
113void abc80_state::update_screen(bitmap_t *bitmap, const rectangle *cliprect)
83114{
84   abc80_state *state = machine->driver_data<abc80_state>();
85115   UINT16 videoram_addr;
86116   int y, sx, c = 0, r = 0;
87117
88118   for (y = 0; y < 312; y++)
89119   {
90      UINT8 vsync_data = state->vsync_prom[y];
91      UINT8 l = state->line_prom[y];
120      UINT8 vsync_data = m_vsync_prom[y];
121      UINT8 l = m_line_prom[y];
92122      int dv = (vsync_data & ABC80_K2_DV) ? 1 : 0;
93123      int mode = 1;
94124
r9547r9548
100130
101131      for (sx = 0; sx < 64; sx++)
102132      {
103         UINT8 hsync_data = state->hsync_prom[sx];
133         UINT8 hsync_data = m_hsync_prom[sx];
104134         int dh = (hsync_data & ABC80_K5_DH) ? 1 : 0;
105135         UINT8 attr_addr;
106136         UINT8 videoram_data, attr_data;
r9547r9548
126156            */
127157
128158         videoram_addr = ((r & 0x07) << 7) | ((((c >> 3) & 0x07) + ((r >> 3) | (r >> 1))) & 0x0f) | (c & 0x07);
129         videoram_data = state->video_ram[videoram_addr];
159         videoram_data = m_video_ram[videoram_addr];
130160         attr_addr = ((dh & dv) << 7) & (data & 0x7f);
131         attr_data = state->attr_prom[attr_addr];
161         attr_data = m_attr_prom[attr_addr];
132162
133163         blank = (attr_data & ABC80_J3_BLANK) ? 1 : 0;
134164         tecken = (attr_data & ABC80_J3_TEXT) ? 1 : 0;
r9547r9548
145175
146176            UINT16 chargen_addr = ((videoram_data & 0x7f) * 10) + l;
147177
148            data = state->char_rom[chargen_addr];
178            data = m_char_rom[chargen_addr];
149179         }
150180         else
151181         {
r9547r9548
186216            int color = BIT(data, 7);
187217            int x = (sx * 6) + bit;
188218
189            color ^= (cursor & state->blink);
219            color ^= (cursor & m_blink);
190220            color &= blank;
191221
192222            *BITMAP_ADDR16(bitmap, y, x) = color;
r9547r9548
196226      }
197227   }
198228}
199#endif
200229
201static VIDEO_START( abc80 )
230
231//-------------------------------------------------
232//  VIDEO_START( abc80 )
233//-------------------------------------------------
234
235void abc80_state::video_start()
202236{
203   abc80_state *state = machine->driver_data<abc80_state>();
204
205237   /* create tx_tilemap */
206   state->tx_tilemap = tilemap_create(machine, abc80_get_tile_info, abc80_tilemap_scan, 6, 10, 40, 24);
238   m_tx_tilemap = tilemap_create(machine, abc80_get_tile_info, abc80_tilemap_scan, 6, 10, 40, 24);
207239
208   tilemap_set_scrolldx(state->tx_tilemap, ABC80_HDSTART, ABC80_HDSTART);
209   tilemap_set_scrolldy(state->tx_tilemap, ABC80_VDSTART, ABC80_VDSTART);
240   tilemap_set_scrolldx(m_tx_tilemap, ABC80_HDSTART, ABC80_HDSTART);
241   tilemap_set_scrolldy(m_tx_tilemap, ABC80_VDSTART, ABC80_VDSTART);
210242
211243   /* find memory regions */
212   state->char_rom = memory_region(machine, "chargen");
213   state->hsync_prom = memory_region(machine, "hsync");
214   state->vsync_prom = memory_region(machine, "vsync");
215   state->line_prom = memory_region(machine, "line");
216   state->attr_prom = memory_region(machine, "attr");
244   m_char_rom = memory_region(machine, "chargen");
245   m_hsync_prom = memory_region(machine, "hsync");
246   m_vsync_prom = memory_region(machine, "vsync");
247   m_line_prom = memory_region(machine, "line");
248   m_attr_prom = memory_region(machine, "attr");
217249
218250   /* register for state saving */
219   state_save_register_global(machine, state->blink);
220   state_save_register_global(machine, state->char_bank);
221   state_save_register_global(machine, state->char_row);
251   state_save_register_global(machine, m_blink);
252   state_save_register_global(machine, m_char_bank);
253   state_save_register_global(machine, m_char_row);
222254}
223255
224static VIDEO_UPDATE( abc80 )
256
257//-------------------------------------------------
258//  VIDEO_UPDATE( abc80 )
259//-------------------------------------------------
260
261bool abc80_state::video_update(screen_device &screen, bitmap_t &bitmap, const rectangle &cliprect)
225262{
226   abc80_state *state = screen->machine->driver_data<abc80_state>();
227263   rectangle rect;
228264
229265   rect.min_x = ABC80_HDSTART;
r9547r9548
231267   rect.min_y = ABC80_VDSTART;
232268   rect.max_y = ABC80_VDSTART + 240 - 1;
233269
234   bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine));
270   bitmap_fill(&bitmap, &cliprect, get_black_pen(machine));
235271
236   tilemap_mark_all_tiles_dirty(state->tx_tilemap);
237   tilemap_draw(bitmap, &rect, state->tx_tilemap, 0, 0);
272   tilemap_mark_all_tiles_dirty(m_tx_tilemap);
273   tilemap_draw(&bitmap, &rect, m_tx_tilemap, 0, 0);
238274
239275   //abc80_update(screen->machine, bitmap, cliprect);
240276
241277   return 0;
242278}
243279
280
281//-------------------------------------------------
282//  MACHINE_CONFIG_FRAGMENT( abc80_video )
283//-------------------------------------------------
284
244285MACHINE_CONFIG_FRAGMENT( abc80_video )
245   MDRV_TIMER_ADD_PERIODIC("blink", abc80_blink_tick, HZ(ABC80_XTAL/2/6/64/312/16))
286   MDRV_TIMER_ADD_PERIODIC("blink", blink_tick, HZ(ABC80_XTAL/2/6/64/312/16))
246287
247288   MDRV_SCREEN_ADD(SCREEN_TAG, RASTER)
248289   MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16)
290
249291   MDRV_GFXDECODE(abc80)
292   
250293   MDRV_PALETTE_LENGTH(4)
251
252294   MDRV_PALETTE_INIT(abc80)
253   MDRV_VIDEO_START(abc80)
254   MDRV_VIDEO_UPDATE(abc80)
255295
256296   MDRV_SCREEN_RAW_PARAMS(ABC80_XTAL/2, ABC80_HTOTAL, ABC80_HBEND, ABC80_HBSTART, ABC80_VTOTAL, ABC80_VBEND, ABC80_VBSTART)
257297MACHINE_CONFIG_END
src/mess/includes/abc80.h
r9547r9548
5050#define SN76477_TAG      "g8"
5151#define ABCBUS_TAG      "abcbus"
5252#define CASSETTE_TAG   "cassette"
53#define RS232_TAG      "rs232"
5354
5455class abc80_state : public driver_device
5556{
5657public:
5758   abc80_state(running_machine &machine, const driver_device_config_base &config)
58      : driver_device(machine, config) { }
59      : driver_device(machine, config),
60        m_maincpu(*this, Z80_TAG),
61        m_pio(*this, Z80PIO_TAG),
62        m_rs232(*this, RS232_TAG),
63        m_cassette(*this, CASSETTE_TAG),
64        m_ram(*this, "messram")
65   { }
5966
67   required_device<cpu_device> m_maincpu;
68   required_device<running_device> m_pio;
69   required_device<running_device> m_rs232;
70   required_device<running_device> m_cassette;
71   required_device<running_device> m_ram;
72
73   virtual void machine_start();
74
75   virtual void video_start();
76   virtual bool video_update(screen_device &screen, bitmap_t &bitmap, const rectangle &cliprect);
77
78   void update_screen(bitmap_t *bitmap, const rectangle *cliprect);
79
80   DECLARE_READ8_MEMBER( pio_pa_r );
81   DECLARE_READ8_MEMBER( pio_pb_r );
82   DECLARE_WRITE8_MEMBER( pio_pb_w );
83
6084   /* keyboard state */
61   int key_data;
62   int key_strobe;
63   int z80pio_astb;
85   int m_key_data;
86   int m_key_strobe;
87   int m_pio_astb;
6488
6589   /* video state */
66   UINT8 *video_ram;
67   UINT8 *video_80_ram;
68   tilemap_t *tx_tilemap;
69   int blink;
70   int char_bank;
71   int char_row;
90   UINT8 *m_video_ram;
91   UINT8 *m_video_80_ram;
92   tilemap_t *m_tx_tilemap;
93   int m_blink;
94   int m_char_bank;
95   int m_char_row;
7296
7397   /* memory regions */
74   const UINT8 *char_rom;      /* character generator ROM */
75   const UINT8 *hsync_prom;   /* horizontal sync PROM */
76   const UINT8 *vsync_prom;   /* horizontal sync PROM */
77   const UINT8 *line_prom;      /* line address PROM */
78   const UINT8 *attr_prom;      /* character attribute PROM */
79
80   /* devices */
81   running_device *z80pio;
98   const UINT8 *m_char_rom;      /* character generator ROM */
99   const UINT8 *m_hsync_prom;   /* horizontal sync PROM */
100   const UINT8 *m_vsync_prom;   /* horizontal sync PROM */
101   const UINT8 *m_line_prom;      /* line address PROM */
102   const UINT8 *m_attr_prom;      /* character attribute PROM */
82103};
83104
84105/*----------- defined in video/abc80.c -----------*/
src/mess/drivers/abc80.c
r9547r9548
7474
7575*/
7676
77/* Core includes */
77#define ADDRESS_MAP_MODERN
78
7879#include "emu.h"
7980#include "cpu/z80/z80.h"
80#include "includes/abc80.h"
81
82/* Components */
8381#include "cpu/z80/z80daisy.h"
82#include "devices/cassette.h"
83#include "devices/flopdrv.h"
84#include "devices/messram.h"
85#include "devices/printer.h"
86#include "machine/abcbus.h"
87#include "machine/abc830.h"
88#include "machine/rs232.h"
8489#include "machine/z80pio.h"
8590#include "sound/sn76477.h"
86#include "machine/abcbus.h"
87#include "machine/abc830.h"
91#include "includes/abc80.h"
8892
89/* Devices */
90#include "devices/flopdrv.h"
91#include "devices/cassette.h"
92#include "devices/printer.h"
93#include "devices/messram.h"
9493
95/* Read/Write Handlers */
9694
97static WRITE8_DEVICE_HANDLER( abc80_sound_w )
98{
99   /*
95//**************************************************************************
96//   KEYBOARD HACK
97//**************************************************************************
10098
101        Bit Name     Description
99static INPUT_PORTS_START( fake_keyboard )
100   PORT_START("ROW0")
101   PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1) PORT_CHAR('1') PORT_CHAR('!')
102   PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_CHAR('2') PORT_CHAR('"')
103   PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3) PORT_CHAR('3') PORT_CHAR('#')
104   PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("4 \xC2\xA4") PORT_CODE(KEYCODE_4) PORT_CHAR('4') PORT_CHAR(0x00A4)
105   PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_CHAR('5') PORT_CHAR('%')
106   PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_CHAR('6') PORT_CHAR('&')
107   PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7) PORT_CHAR('7') PORT_CHAR('/')
108   PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8) PORT_CHAR('8') PORT_CHAR('(')
102109
103        0  SYSENA   1 On, 0 Off (inverted)
104        1  EXTVCO   00 High freq, 01 Low freq
105        2  VCOSEL   10 SLF cntrl, 11 SLF ctrl
106        3  MIXSELB  000 VCO, 001 Noise, 010 SLF
107        4  MIXSELA  011 VCO+Noise, 100 SLF+Noise, 101 SLF+VCO
108        5  MIXSELC  110 SLF+VCO+Noise, 111 Quiet
109        6  ENVSEL2  00 VCO, 01 Rakt igenom
110        7  ENVSEL1  10 Monovippa, 11 VCO alt.pol.
110   PORT_START("ROW1")
111   PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9) PORT_CHAR('9') PORT_CHAR(')')
112   PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_0) PORT_CHAR('0') PORT_CHAR('=')
113   PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS) PORT_CHAR('+') PORT_CHAR('?')
114   PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_EQUALS) PORT_CHAR(0x00E9) PORT_CHAR(0x00C9)
115   PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_BACKSLASH) PORT_CHAR('<') PORT_CHAR('>')
116   PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Q) PORT_CHAR('q') PORT_CHAR('Q')
117   PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_W) PORT_CHAR('w') PORT_CHAR('W')
118   PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E) PORT_CHAR('e') PORT_CHAR('E')
111119
112    */
120   PORT_START("ROW2")
121   PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_R) PORT_CHAR('r') PORT_CHAR('R')
122   PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_T) PORT_CHAR('t') PORT_CHAR('T')
123   PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Y) PORT_CHAR('y') PORT_CHAR('Y')
124   PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_U) PORT_CHAR('u') PORT_CHAR('U')
125   PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_I) PORT_CHAR('i') PORT_CHAR('I')
126   PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_O) PORT_CHAR('o') PORT_CHAR('O')
127   PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_P) PORT_CHAR('p') PORT_CHAR('P')
128   PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_OPENBRACE) PORT_CHAR(0x00E5) PORT_CHAR(0x00C5)
113129
114   sn76477_enable_w(device, !BIT(data, 0));
130   PORT_START("ROW3")
131   PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_CLOSEBRACE) PORT_CHAR(0x00FC) PORT_CHAR(0x00DC)
132   PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("RETURN") PORT_CODE(KEYCODE_ENTER) PORT_CHAR('\r')
133   PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_A) PORT_CHAR('a') PORT_CHAR('A')
134   PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_S) PORT_CHAR('s') PORT_CHAR('S')
135   PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_D) PORT_CHAR('d') PORT_CHAR('D')
136   PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F) PORT_CHAR('f') PORT_CHAR('F')
137   PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_G) PORT_CHAR('g') PORT_CHAR('G')
138   PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_H) PORT_CHAR('h') PORT_CHAR('H')
115139
116   sn76477_vco_voltage_w(device, BIT(data, 1) ? 2.5 : 0);
117   sn76477_vco_w(device, BIT(data, 2));
140   PORT_START("ROW4")
141   PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_J) PORT_CHAR('j') PORT_CHAR('J')
142   PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_K) PORT_CHAR('k') PORT_CHAR('K')
143   PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_L) PORT_CHAR('l') PORT_CHAR('L')
144   PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_COLON) PORT_CHAR(0x00F6) PORT_CHAR(0x00D6)
145   PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_QUOTE) PORT_CHAR(0x00E4) PORT_CHAR(0x00C4)
146   PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_BACKSLASH) PORT_CHAR('\'') PORT_CHAR('*')
147   PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME(UTF8_LEFT) PORT_CODE(KEYCODE_BACKSPACE) PORT_CHAR(8)
148   PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Z) PORT_CHAR('z') PORT_CHAR('Z')
118149
119   sn76477_mixer_b_w(device, BIT(data, 3));
120   sn76477_mixer_a_w(device, BIT(data, 4));
121   sn76477_mixer_c_w(device, BIT(data, 5));
150   PORT_START("ROW5")
151   PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_X) PORT_CHAR('x') PORT_CHAR('X')
152   PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_C) PORT_CHAR('c') PORT_CHAR('C')
153   PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_V) PORT_CHAR('v') PORT_CHAR('V')
154   PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_B) PORT_CHAR('b') PORT_CHAR('B')
155   PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_N) PORT_CHAR('n') PORT_CHAR('N')
156   PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_M) PORT_CHAR('m') PORT_CHAR('M')
157   PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_COMMA) PORT_CHAR(',') PORT_CHAR(';')
158   PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_STOP) PORT_CHAR('.') PORT_CHAR(':')
122159
123   sn76477_envelope_2_w(device, BIT(data, 6));
124   sn76477_envelope_1_w(device, BIT(data, 7));
125}
160   PORT_START("ROW6")
161   PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SLASH) PORT_CHAR('-') PORT_CHAR('_')
162   PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME(UTF8_RIGHT) PORT_CODE(KEYCODE_RIGHT) PORT_CHAR(UCHAR_MAMEKEY(RIGHT))
163   PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("SPACE") PORT_CODE(KEYCODE_SPACE) PORT_CHAR(' ')
164   PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED )
165   PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNUSED )
166   PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_UNUSED )
167   PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNUSED )
168   PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNUSED )
126169
127/* Keyboard HACK */
170   PORT_START("ROW7")
171   PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("LEFT SHIFT") PORT_CODE(KEYCODE_LSHIFT) PORT_CHAR(UCHAR_SHIFT_1)
172   PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("RIGHT SHIFT") PORT_CODE(KEYCODE_RSHIFT) PORT_CHAR(UCHAR_SHIFT_1)
173   PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("UPPER CASE") PORT_CODE(KEYCODE_CAPSLOCK) PORT_CHAR(UCHAR_MAMEKEY(CAPSLOCK)) PORT_TOGGLE
174   PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("CTRL") PORT_CODE(KEYCODE_LCONTROL) PORT_CHAR(UCHAR_MAMEKEY(LCONTROL))
175   PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNUSED )
176   PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_UNUSED )
177   PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNUSED )
178   PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNUSED )
179INPUT_PORTS_END
128180
129181static const UINT8 abc80_keycodes[7*4][8] =
130182{
r9547r9548
169221{
170222   abc80_state *state = machine->driver_data<abc80_state>();
171223
172   state->key_data = 0;
224   state->m_key_data = 0;
173225}
174226
175227static void abc80_keyboard_scan(running_machine *machine)
r9547r9548
192244   }
193245
194246   /* clear key strobe */
195   state->key_strobe = 0;
247   state->m_key_strobe = 0;
196248
197249   /* scan keyboard */
198250   for (row = 0; row < 7; row++)
r9547r9548
206258            UINT8 keydata = abc80_keycodes[row + (table * 7)][col];
207259
208260            /* set key strobe */
209            state->key_strobe = 1;
261            state->m_key_strobe = 1;
210262
211            if (state->key_data != keydata)
263            if (state->m_key_data != keydata)
212264            {
213265               UINT8 pio_data = 0x80 | keydata;
214266
215267               /* latch key data */
216               state->key_data = keydata;
268               state->m_key_data = keydata;
217269
218               z80pio_pa_w(state->z80pio, 0, pio_data);
270               z80pio_pa_w(state->m_pio, 0, pio_data);
219271               return;
220272            }
221273         }
222274      }
223275   }
224276
225   if (!state->key_strobe && state->key_data)
277   if (!state->m_key_strobe && state->m_key_data)
226278   {
227      z80pio_pa_w(state->z80pio, 0, state->key_data);
279      z80pio_pa_w(state->m_pio, 0, state->m_key_data);
228280      timer_set(machine, ATTOTIME_IN_MSEC(50), NULL, 0, keyboard_data_clear);
229281   }
230282}
r9547r9548
234286   abc80_keyboard_scan(timer.machine);
235287}
236288
237/* Memory Maps */
238289
239static ADDRESS_MAP_START( abc80_map, ADDRESS_SPACE_PROGRAM, 8 )
290
291//**************************************************************************
292//   SOUND
293//**************************************************************************
294
295//-------------------------------------------------
296//  vco_voltage_w - CSG VCO voltage select
297//-------------------------------------------------
298
299static WRITE_LINE_DEVICE_HANDLER( vco_voltage_w )
300{
301   sn76477_vco_voltage_w(device, state ? 2.5 : 0);
302}
303
304
305
306//**************************************************************************
307//   ADDRESS MAPS
308//**************************************************************************
309
310//-------------------------------------------------
311//  ADDRESS_MAP( abc80_mem )
312//-------------------------------------------------
313
314static ADDRESS_MAP_START( abc80_mem, ADDRESS_SPACE_PROGRAM, 8, abc80_state )
240315   ADDRESS_MAP_UNMAP_HIGH
241316   AM_RANGE(0x0000, 0x3fff) AM_ROM
242317   AM_RANGE(0x6000, 0x6fff) AM_ROM
243318   AM_RANGE(0x7000, 0x73ff) AM_ROM
244   AM_RANGE(0x7400, 0x77ff) AM_RAM AM_BASE_MEMBER(abc80_state, video_80_ram)
319   AM_RANGE(0x7400, 0x77ff) AM_RAM AM_BASE(m_video_80_ram)
245320   AM_RANGE(0x7800, 0x7bff) AM_ROM
246   AM_RANGE(0x7c00, 0x7fff) AM_RAM AM_BASE_MEMBER(abc80_state, video_ram)
321   AM_RANGE(0x7c00, 0x7fff) AM_RAM AM_BASE(m_video_ram)
247322   AM_RANGE(0x8000, 0xffff) AM_RAM
248323ADDRESS_MAP_END
249324
250static ADDRESS_MAP_START( abc80_io_map, ADDRESS_SPACE_IO, 8 )
325
326//-------------------------------------------------
327//  ADDRESS_MAP( abc80_io )
328//-------------------------------------------------
329
330static ADDRESS_MAP_START( abc80_io, ADDRESS_SPACE_IO, 8, abc80_state )
251331   ADDRESS_MAP_UNMAP_HIGH
252332   ADDRESS_MAP_GLOBAL_MASK(0x17)
253   AM_RANGE(0x00, 0x00) AM_DEVREADWRITE(ABCBUS_TAG, abcbus_inp_r, abcbus_utp_w)
254   AM_RANGE(0x01, 0x01) AM_DEVREADWRITE(ABCBUS_TAG, abcbus_stat_r, abcbus_cs_w)
255   AM_RANGE(0x02, 0x02) AM_DEVWRITE(ABCBUS_TAG, abcbus_c1_w)
256   AM_RANGE(0x03, 0x03) AM_DEVWRITE(ABCBUS_TAG, abcbus_c2_w)
257   AM_RANGE(0x04, 0x04) AM_DEVWRITE(ABCBUS_TAG, abcbus_c3_w)
258   AM_RANGE(0x05, 0x05) AM_DEVWRITE(ABCBUS_TAG, abcbus_c4_w)
259   AM_RANGE(0x06, 0x06) AM_DEVWRITE(SN76477_TAG, abc80_sound_w)
260   AM_RANGE(0x07, 0x07) AM_DEVREAD(ABCBUS_TAG, abcbus_rst_r)
261   AM_RANGE(0x10, 0x13) AM_MIRROR(0x04) AM_DEVREADWRITE(Z80PIO_TAG, z80pio_ba_cd_r, z80pio_ba_cd_w)
333   AM_RANGE(0x00, 0x00) AM_DEVREADWRITE_LEGACY(ABCBUS_TAG, abcbus_inp_r, abcbus_utp_w)
334   AM_RANGE(0x01, 0x01) AM_DEVREADWRITE_LEGACY(ABCBUS_TAG, abcbus_stat_r, abcbus_cs_w)
335   AM_RANGE(0x02, 0x02) AM_DEVWRITE_LEGACY(ABCBUS_TAG, abcbus_c1_w)
336   AM_RANGE(0x03, 0x03) AM_DEVWRITE_LEGACY(ABCBUS_TAG, abcbus_c2_w)
337   AM_RANGE(0x04, 0x04) AM_DEVWRITE_LEGACY(ABCBUS_TAG, abcbus_c3_w)
338   AM_RANGE(0x05, 0x05) AM_DEVWRITE_LEGACY(ABCBUS_TAG, abcbus_c4_w)
339   AM_RANGE(0x06, 0x06) AM_WRITE_PORT("SN76477")
340   AM_RANGE(0x07, 0x07) AM_DEVREAD_LEGACY(ABCBUS_TAG, abcbus_rst_r)
341   AM_RANGE(0x10, 0x13) AM_MIRROR(0x04) AM_DEVREADWRITE_LEGACY(Z80PIO_TAG, z80pio_ba_cd_r, z80pio_ba_cd_w)
262342ADDRESS_MAP_END
263343
264/* Input Ports */
265344
266static INPUT_PORTS_START( abc80 )
267   PORT_START("ROW0")
268   PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1) PORT_CHAR('1') PORT_CHAR('!')
269   PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_CHAR('2') PORT_CHAR('"')
270   PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3) PORT_CHAR('3') PORT_CHAR('#')
271   PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("4 \xC2\xA4") PORT_CODE(KEYCODE_4) PORT_CHAR('4') PORT_CHAR(0x00A4)
272   PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_CHAR('5') PORT_CHAR('%')
273   PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_CHAR('6') PORT_CHAR('&')
274   PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7) PORT_CHAR('7') PORT_CHAR('/')
275   PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8) PORT_CHAR('8') PORT_CHAR('(')
276345
277   PORT_START("ROW1")
278   PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9) PORT_CHAR('9') PORT_CHAR(')')
279   PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_0) PORT_CHAR('0') PORT_CHAR('=')
280   PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS) PORT_CHAR('+') PORT_CHAR('?')
281   PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_EQUALS) PORT_CHAR(0x00E9) PORT_CHAR(0x00C9)
282   PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_BACKSLASH) PORT_CHAR('<') PORT_CHAR('>')
283   PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Q) PORT_CHAR('q') PORT_CHAR('Q')
284   PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_W) PORT_CHAR('w') PORT_CHAR('W')
285   PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E) PORT_CHAR('e') PORT_CHAR('E')
346//**************************************************************************
347//   INPUT PORTS
348//**************************************************************************
286349
287   PORT_START("ROW2")
288   PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_R) PORT_CHAR('r') PORT_CHAR('R')
289   PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_T) PORT_CHAR('t') PORT_CHAR('T')
290   PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Y) PORT_CHAR('y') PORT_CHAR('Y')
291   PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_U) PORT_CHAR('u') PORT_CHAR('U')
292   PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_I) PORT_CHAR('i') PORT_CHAR('I')
293   PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_O) PORT_CHAR('o') PORT_CHAR('O')
294   PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_P) PORT_CHAR('p') PORT_CHAR('P')
295   PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_OPENBRACE) PORT_CHAR(0x00E5) PORT_CHAR(0x00C5)
350//-------------------------------------------------
351//  INPUT_PORTS( abc80 )
352//-------------------------------------------------
296353
297   PORT_START("ROW3")
298   PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_CLOSEBRACE) PORT_CHAR(0x00FC) PORT_CHAR(0x00DC)
299   PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("RETURN") PORT_CODE(KEYCODE_ENTER) PORT_CHAR('\r')
300   PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_A) PORT_CHAR('a') PORT_CHAR('A')
301   PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_S) PORT_CHAR('s') PORT_CHAR('S')
302   PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_D) PORT_CHAR('d') PORT_CHAR('D')
303   PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F) PORT_CHAR('f') PORT_CHAR('F')
304   PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_G) PORT_CHAR('g') PORT_CHAR('G')
305   PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_H) PORT_CHAR('h') PORT_CHAR('H')
354static INPUT_PORTS_START( abc80 )
355   PORT_INCLUDE(fake_keyboard)
306356
307   PORT_START("ROW4")
308   PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_J) PORT_CHAR('j') PORT_CHAR('J')
309   PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_K) PORT_CHAR('k') PORT_CHAR('K')
310   PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_L) PORT_CHAR('l') PORT_CHAR('L')
311   PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_COLON) PORT_CHAR(0x00F6) PORT_CHAR(0x00D6)
312   PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_QUOTE) PORT_CHAR(0x00E4) PORT_CHAR(0x00C4)
313   PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_BACKSLASH) PORT_CHAR('\'') PORT_CHAR('*')
314   PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME(UTF8_LEFT) PORT_CODE(KEYCODE_BACKSPACE) PORT_CHAR(8)
315   PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Z) PORT_CHAR('z') PORT_CHAR('Z')
357   PORT_START("SN76477")
358   PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_SPECIAL) PORT_WRITE_LINE_DEVICE(SN76477_TAG, sn76477_enable_w)
359   PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_SPECIAL) PORT_WRITE_LINE_DEVICE(SN76477_TAG, vco_voltage_w)
360   PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_SPECIAL) PORT_WRITE_LINE_DEVICE(SN76477_TAG, sn76477_vco_w)
361   PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_SPECIAL) PORT_WRITE_LINE_DEVICE(SN76477_TAG, sn76477_mixer_b_w)
362   PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_SPECIAL) PORT_WRITE_LINE_DEVICE(SN76477_TAG, sn76477_mixer_a_w)
363   PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_SPECIAL) PORT_WRITE_LINE_DEVICE(SN76477_TAG, sn76477_mixer_c_w)
364   PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_SPECIAL) PORT_WRITE_LINE_DEVICE(SN76477_TAG, sn76477_envelope_2_w)
365   PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_SPECIAL) PORT_WRITE_LINE_DEVICE(SN76477_TAG, sn76477_envelope_1_w)
316366
317   PORT_START("ROW5")
318   PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_X) PORT_CHAR('x') PORT_CHAR('X')
319   PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_C) PORT_CHAR('c') PORT_CHAR('C')
320   PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_V) PORT_CHAR('v') PORT_CHAR('V')
321   PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_B) PORT_CHAR('b') PORT_CHAR('B')
322   PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_N) PORT_CHAR('n') PORT_CHAR('N')
323   PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_M) PORT_CHAR('m') PORT_CHAR('M')
324   PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_COMMA) PORT_CHAR(',') PORT_CHAR(';')
325   PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_STOP) PORT_CHAR('.') PORT_CHAR(':')
367   PORT_INCLUDE(luxor_55_10828)
368INPUT_PORTS_END
326369
327   PORT_START("ROW6")
328   PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SLASH) PORT_CHAR('-') PORT_CHAR('_')
329   PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME(UTF8_RIGHT) PORT_CODE(KEYCODE_RIGHT) PORT_CHAR(UCHAR_MAMEKEY(RIGHT))
330   PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("SPACE") PORT_CODE(KEYCODE_SPACE) PORT_CHAR(' ')
331   PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED )
332   PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNUSED )
333   PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_UNUSED )
334   PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNUSED )
335   PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNUSED )
336370
337   PORT_START("ROW7")
338   PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("LEFT SHIFT") PORT_CODE(KEYCODE_LSHIFT) PORT_CHAR(UCHAR_SHIFT_1)
339   PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("RIGHT SHIFT") PORT_CODE(KEYCODE_RSHIFT) PORT_CHAR(UCHAR_SHIFT_1)
340   PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("UPPER CASE") PORT_CODE(KEYCODE_CAPSLOCK) PORT_CHAR(UCHAR_MAMEKEY(CAPSLOCK)) PORT_TOGGLE
341   PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_KEYBOARD ) PORT_NAME("CTRL") PORT_CODE(KEYCODE_LCONTROL) PORT_CHAR(UCHAR_MAMEKEY(LCONTROL))
342   PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_UNUSED )
343   PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_UNUSED )
344   PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_UNUSED )
345   PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_UNUSED )
346371
347   PORT_INCLUDE(luxor_55_10828)
348INPUT_PORTS_END
372//**************************************************************************
373//   DEVICE CONFIGURATION
374//**************************************************************************
349375
350/* Sound Interface */
376//-------------------------------------------------
377//  sn76477_interface csg_intf
378//-------------------------------------------------
351379
352static const sn76477_interface abc80_sn76477_interface =
380static const sn76477_interface csg_intf =
353381{
354382   RES_K(47),      //  4  noise_res        R26 47k
355383   RES_K(330),      //  5  filter_res       R24 330k
r9547r9548
369397   RES_K(330)      // 24  oneshot_res      R25 330k
370398};
371399
372/* Interrupt Generators */
373400
401//-------------------------------------------------
402//  INTERRUPT_GEN( abc80_nmi_interrupt )
403//-------------------------------------------------
404
374405static INTERRUPT_GEN( abc80_nmi_interrupt )
375406{
376407   cputag_set_input_line(device->machine, Z80_TAG, INPUT_LINE_NMI, PULSE_LINE);
377408}
378409
379/* Z80 PIO */
380410
411//-------------------------------------------------
412//  Z80PIO_INTERFACE( pio_intf )
413//-------------------------------------------------
414
381415static TIMER_DEVICE_CALLBACK( z80pio_astb_tick )
382416{
383417   abc80_state *state = timer.machine->driver_data<abc80_state>();
384418
385419   /* toggle ASTB every other video line */
386   state->z80pio_astb = !state->z80pio_astb;
420   state->m_pio_astb = !state->m_pio_astb;
387421
388   z80pio_astb_w(state->z80pio, state->z80pio_astb);
422   z80pio_astb_w(state->m_pio, state->m_pio_astb);
389423}
390424
391static READ8_DEVICE_HANDLER( pio_pa_r )
425READ8_MEMBER( abc80_state::pio_pa_r )
392426{
393427   /*
394428
r9547r9548
407441
408442    */
409443
410   abc80_state *state = device->machine->driver_data<abc80_state>();
411
412   return (state->key_strobe << 7) | state->key_data;
444   return (m_key_strobe << 7) | m_key_data;
413445};
414446
415static READ8_DEVICE_HANDLER( pio_pb_r )
447READ8_MEMBER( abc80_state::pio_pb_r )
416448{
417449   /*
418450
r9547r9548
429461
430462    */
431463
464   UINT8 data = 0;
465   
466   /* serial receive */
467   data |= rs232_rd_r(m_rs232);
468
469   /* clear to send */
470   data |= rs232_cts_r(m_rs232) << 1;
471
472   /* data connection detect */
473   data |= rs232_dcd_r(m_rs232) << 2;
474
432475   /* cassette data */
433   UINT8 data = (cassette_input(device) > +1.0) << 7;
476   data |= (cassette_input(m_cassette) > +1.0) << 7;
434477
435478   return data;
436479};
437480
438static WRITE8_DEVICE_HANDLER( pio_pb_w )
481WRITE8_MEMBER( abc80_state::pio_pb_w )
439482{
440483   /*
441484
r9547r9548
452495
453496    */
454497
498   /* transmit */
499   rs232_td_w(m_rs232, m_pio, BIT(data, 3));
500
501   /* request to send */
502   rs232_rts_w(m_rs232, BIT(data, 4));
503
455504   /* cassette motor */
456   cassette_change_state(device, BIT(data, 5) ? CASSETTE_MOTOR_ENABLED : CASSETTE_MOTOR_DISABLED, CASSETTE_MASK_MOTOR);
505   cassette_change_state(m_cassette, BIT(data, 5) ? CASSETTE_MOTOR_ENABLED : CASSETTE_MOTOR_DISABLED, CASSETTE_MASK_MOTOR);
457506
458507   /* cassette data */
459   cassette_output(device, BIT(data, 6) ? -1.0 : +1.0);
508   cassette_output(m_cassette, BIT(data, 6) ? -1.0 : +1.0);
460509};
461510
462511static Z80PIO_INTERFACE( pio_intf )
463512{
464513   DEVCB_CPU_INPUT_LINE(Z80_TAG, INPUT_LINE_IRQ0),   /* callback when change interrupt status */
465   DEVCB_HANDLER(pio_pa_r),                  /* port A read callback */
514   DEVCB_DRIVER_MEMBER(abc80_state, pio_pa_r),      /* port A read callback */
466515   DEVCB_NULL,                              /* port A write callback */
467516   DEVCB_NULL,                              /* portA ready active callback */
468   DEVCB_DEVICE_HANDLER(CASSETTE_TAG, pio_pb_r),   /* port B read callback */
469   DEVCB_DEVICE_HANDLER(CASSETTE_TAG, pio_pb_w),   /* port B write callback */
517   DEVCB_DRIVER_MEMBER(abc80_state, pio_pb_r),      /* port B read callback */
518   DEVCB_DRIVER_MEMBER(abc80_state, pio_pb_w),      /* port B write callback */
470519   DEVCB_NULL                              /* portB ready active callback */
471520};
472521
522
523//-------------------------------------------------
524//  Z80PIO_INTERFACE( pio_intf )
525//-------------------------------------------------
526
473527static const z80_daisy_config abc80_daisy_chain[] =
474528{
475529   { Z80PIO_TAG },
476530   { NULL }
477531};
478532
479/* Cassette */
480533
534//-------------------------------------------------
535//  cassette_config abc80_cassette_config
536//-------------------------------------------------
537
481538static const cassette_config abc80_cassette_config =
482539{
483540   cassette_default_formats,
r9547r9548
486543   NULL
487544};
488545
489/* ABC BUS */
490546
547//-------------------------------------------------
548//  ABCBUS_DAISY( abcbus_daisy )
549//-------------------------------------------------
550
491551static ABCBUS_DAISY( abcbus_daisy )
492552{
493553   { LUXOR_55_10828_ABCBUS("luxor_55_10828") },
494554   { NULL }
495555};
496556
497/* Machine Initialization */
498557
499static MACHINE_START( abc80 )
558//-------------------------------------------------
559//  RS232_INTERFACE( rs232_intf )
560//-------------------------------------------------
561
562static RS232_INTERFACE( rs232_intf )
500563{
501   abc80_state *state = machine->driver_data<abc80_state>();
564   Z80PIO_TAG,
565   DEVCB_NULL,
566   DEVCB_NULL,
567   DEVCB_NULL,
568   DEVCB_NULL,
569   DEVCB_NULL,
570   DEVCB_NULL,
571   DEVCB_NULL
572};
502573
574
575
576//**************************************************************************
577//   MACHINE INITIALIZATION
578//**************************************************************************
579
580//-------------------------------------------------
581//  MACHINE_START( abc80 )
582//-------------------------------------------------
583
584void abc80_state::machine_start()
585{
503586   /* configure RAM expansion */
504   if (messram_get_size(machine->device("messram")) == 16*1024)
587   if (messram_get_size(m_ram) == 16 * 1024)
505588   {
506      memory_unmap_readwrite(cputag_get_address_space(machine, Z80_TAG, ADDRESS_SPACE_PROGRAM), 0x8000, 0xbfff, 0, 0);
589      memory_unmap_readwrite(cpu_get_address_space(m_maincpu, ADDRESS_SPACE_PROGRAM), 0x8000, 0xbfff, 0, 0);
507590   }
508591
509   /* find devices */
510   state->z80pio = machine->device(Z80PIO_TAG);
511
512592   /* register for state saving */
513   state_save_register_global(machine, state->key_data);
514   state_save_register_global(machine, state->key_strobe);
515   state_save_register_global(machine, state->z80pio_astb);
593   state_save_register_global(machine, m_key_data);
594   state_save_register_global(machine, m_key_strobe);
595   state_save_register_global(machine, m_pio_astb);
516596}
517597
518/* Machine Drivers */
519598
599
600//**************************************************************************
601//   MACHINE DRIVERS
602//**************************************************************************
603
604//-------------------------------------------------
605//  MACHINE_CONFIG( abc80 )
606//-------------------------------------------------
607
520608static MACHINE_CONFIG_START( abc80, abc80_state )
521609   /* basic machine hardware */
522610   MDRV_CPU_ADD(Z80_TAG, Z80, ABC80_XTAL/2/2)   // 2.9952 MHz
523   MDRV_CPU_PROGRAM_MAP(abc80_map)
524   MDRV_CPU_IO_MAP(abc80_io_map)
611   MDRV_CPU_PROGRAM_MAP(abc80_mem)
612   MDRV_CPU_IO_MAP(abc80_io)
525613   MDRV_CPU_CONFIG(abc80_daisy_chain)
526614   MDRV_CPU_VBLANK_INT(SCREEN_TAG, abc80_nmi_interrupt)
527615
528   MDRV_MACHINE_START(abc80)
616   /* video hardware */
617   MDRV_FRAGMENT_ADD(abc80_video)
529618
619   /* sound hardware */
620   MDRV_SPEAKER_STANDARD_MONO("mono")
621   MDRV_SOUND_ADD(SN76477_TAG, SN76477, 0)
622   MDRV_SOUND_CONFIG(csg_intf)
623   MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
624
530625   /* keyboard */
531626   MDRV_TIMER_ADD_PERIODIC("keyboard", abc80_keyboard_tick, USEC(2500))
532627
533   /* Z80PIO */
534   MDRV_TIMER_ADD_SCANLINE("pio_astb", z80pio_astb_tick, SCREEN_TAG, 0, 1)
535   MDRV_Z80PIO_ADD(Z80PIO_TAG, ABC80_XTAL/2/2, pio_intf)
536
537628   /* Luxor Conkort 55-10828 */
538629   MDRV_ABCBUS_ADD(ABCBUS_TAG, abcbus_daisy, Z80_TAG)
539630   MDRV_ABC830_PIO_ADD("luxor_55_10828", ABCBUS_TAG, DRIVE_MPI_51)
540631
541   /* video hardware */
542   MDRV_FRAGMENT_ADD(abc80_video)
543
544   /* sound hardware */
545   MDRV_SPEAKER_STANDARD_MONO("mono")
546   MDRV_SOUND_ADD(SN76477_TAG, SN76477, 0)
547   MDRV_SOUND_CONFIG(abc80_sn76477_interface)
548   MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25)
549
550   /* printer */
632   /* devices */
633   MDRV_TIMER_ADD_SCANLINE("pio_astb", z80pio_astb_tick, SCREEN_TAG, 0, 1)
634   MDRV_Z80PIO_ADD(Z80PIO_TAG, ABC80_XTAL/2/2, pio_intf)
635   MDRV_RS232_ADD(RS232_TAG, rs232_intf)
551636   MDRV_PRINTER_ADD("printer")
552
553   /* cassette */
554637   MDRV_CASSETTE_ADD(CASSETTE_TAG, abc80_cassette_config)
555638
556639   /* internal ram */
r9547r9548
559642   MDRV_RAM_EXTRA_OPTIONS("32K")
560643MACHINE_CONFIG_END
561644
562/* ROMs */
563645
646
647//**************************************************************************
648//   ROMS
649//**************************************************************************
650
651//-------------------------------------------------
652//  ROM( abc80 )
653//-------------------------------------------------
654
564655ROM_START( abc80 )
565656   ROM_REGION( 0x10000, Z80_TAG, 0 )
566657   ROM_LOAD( "za3508.a2", 0x0000, 0x1000, CRC(e2afbf48) SHA1(9883396edd334835a844dcaa792d29599a8c67b9) )
r9547r9548
599690   ROM_LOAD( "abc80_13.e7", 0x0000, 0x0080, NO_DUMP ) // "64 40057-01" 82S129 256x4 address decoder
600691ROM_END
601692
602/* Drivers */
603693
604/*    YEAR  NAME    PARENT  COMPAT  MACHINE INPUT   INIT    COMPANY                             FULLNAME                    FLAGS */
605COMP( 1978, abc80,  0,      0,      abc80,  abc80,  0,      "Luxor Datorer AB",               "ABC 80 (Sweden, Finland)",   GAME_SUPPORTS_SAVE )
694
695//**************************************************************************
696//   SYSTEM DRIVERS
697//**************************************************************************
698
699//    YEAR  NAME    PARENT  COMPAT  MACHINE INPUT   INIT    COMPANY                             FULLNAME    FLAGS
700COMP( 1978, abc80,  0,      0,      abc80,  abc80,  0,      "Luxor Datorer AB",               "ABC 80",   GAME_SUPPORTS_SAVE )
docs/messnew.txt
r9547r9548
2222
2323System Driver Changes:
2424----------------------
25- [ABC80] Refactored driver to define ADDRESS_MAP_MODERN. [Curt Coder]
26
2527- [ABC800C] Added Color version ROMs. [Ola Andersson]
2628
2729

Previous 15994 Revisions Next


© 1998-2018 The MESS Team