src/mess/video/abc80.c
| r9547 | r9548 | |
| 7 | 7 | #include "emu.h" |
| 8 | 8 | #include "includes/abc80.h" |
| 9 | 9 | |
| 10 | | /* Graphics Layout */ |
| 11 | 10 | |
| 11 | |
| 12 | //------------------------------------------------- |
| 13 | // gfx_layout charlayout |
| 14 | //------------------------------------------------- |
| 15 | |
| 12 | 16 | static const gfx_layout charlayout = |
| 13 | 17 | { |
| 14 | 18 | 6, 10, |
| r9547 | r9548 | |
| 20 | 24 | 10*8 |
| 21 | 25 | }; |
| 22 | 26 | |
| 23 | | /* Graphics Decode Information */ |
| 24 | 27 | |
| 28 | //------------------------------------------------- |
| 29 | // GFXDECODE( abc80 ) |
| 30 | //------------------------------------------------- |
| 31 | |
| 25 | 32 | static GFXDECODE_START( abc80 ) |
| 26 | 33 | GFXDECODE_ENTRY( "chargen", 0, charlayout, 0, 2 ) // normal characters |
| 27 | 34 | GFXDECODE_ENTRY( "chargen", 0x500, charlayout, 0, 2 ) // graphics characters |
| 28 | 35 | GFXDECODE_END |
| 29 | 36 | |
| 37 | |
| 38 | //------------------------------------------------- |
| 39 | // PALETTE_INIT( abc80 ) |
| 40 | //------------------------------------------------- |
| 41 | |
| 30 | 42 | static PALETTE_INIT( abc80 ) |
| 31 | 43 | { |
| 32 | 44 | palette_set_color(machine, 0, RGB_BLACK); |
| r9547 | r9548 | |
| 35 | 47 | palette_set_color(machine, 3, RGB_BLACK); |
| 36 | 48 | } |
| 37 | 49 | |
| 50 | |
| 51 | //------------------------------------------------- |
| 52 | // TILE_GET_INFO( abc80_get_tile_info ) |
| 53 | //------------------------------------------------- |
| 54 | |
| 38 | 55 | static TILE_GET_INFO( abc80_get_tile_info ) |
| 39 | 56 | { |
| 40 | 57 | abc80_state *state = machine->driver_data<abc80_state>(); |
| 41 | 58 | |
| 42 | | int attr = state->video_ram[tile_index]; |
| 59 | int attr = state->m_video_ram[tile_index]; |
| 43 | 60 | int code = attr & 0x7f; |
| 44 | | int color = (state->blink && (attr & 0x80)) ? 1 : 0; |
| 61 | int color = (state->m_blink && (attr & 0x80)) ? 1 : 0; |
| 45 | 62 | int r = (tile_index & 0x78) >> 3; |
| 46 | 63 | int l = (tile_index & 0x380) >> 7; |
| 47 | 64 | int row = l + ((r / 5) * 8); |
| 48 | 65 | |
| 49 | | if (row != state->char_row) |
| 66 | if (row != state->m_char_row) |
| 50 | 67 | { |
| 51 | | state->char_bank = 0; |
| 52 | | state->char_row = row; |
| 68 | state->m_char_bank = 0; |
| 69 | state->m_char_row = row; |
| 53 | 70 | } |
| 54 | 71 | |
| 55 | 72 | if (code == ABC80_MODE_TEXT) |
| 56 | 73 | { |
| 57 | | state->char_bank = 0; |
| 74 | state->m_char_bank = 0; |
| 58 | 75 | } |
| 59 | 76 | |
| 60 | 77 | if (code == ABC80_MODE_GFX) |
| 61 | 78 | { |
| 62 | | state->char_bank = 1; |
| 79 | state->m_char_bank = 1; |
| 63 | 80 | } |
| 64 | 81 | |
| 65 | | SET_TILE_INFO(state->char_bank, code, color, 0); |
| 82 | SET_TILE_INFO(state->m_char_bank, code, color, 0); |
| 66 | 83 | } |
| 67 | 84 | |
| 85 | |
| 86 | //------------------------------------------------- |
| 87 | // abc80_tilemap_scan - tilemap scanning |
| 88 | //------------------------------------------------- |
| 89 | |
| 68 | 90 | static UINT32 abc80_tilemap_scan( UINT32 col, UINT32 row, UINT32 num_cols, UINT32 num_rows ) |
| 69 | 91 | { |
| 70 | 92 | /* logical (col,row) -> memory offset */ |
| 71 | 93 | return ((row & 0x07) << 7) + (row >> 3) * num_cols + col; |
| 72 | 94 | } |
| 73 | 95 | |
| 74 | | static TIMER_DEVICE_CALLBACK(abc80_blink_tick) |
| 96 | |
| 97 | //------------------------------------------------- |
| 98 | // TIMER_DEVICE_CALLBACK( blink_tick ) |
| 99 | //------------------------------------------------- |
| 100 | |
| 101 | static TIMER_DEVICE_CALLBACK( blink_tick ) |
| 75 | 102 | { |
| 76 | 103 | abc80_state *state = timer.machine->driver_data<abc80_state>(); |
| 77 | 104 | |
| 78 | | state->blink = !state->blink; |
| 105 | state->m_blink = !state->m_blink; |
| 79 | 106 | } |
| 80 | 107 | |
| 81 | | #ifdef UNUSED_FUNCTION |
| 82 | | static void abc80_update(running_machine *machine, bitmap_t *bitmap, const rectangle *cliprect) |
| 108 | |
| 109 | //------------------------------------------------- |
| 110 | // update_screen - |
| 111 | //------------------------------------------------- |
| 112 | |
| 113 | void abc80_state::update_screen(bitmap_t *bitmap, const rectangle *cliprect) |
| 83 | 114 | { |
| 84 | | abc80_state *state = machine->driver_data<abc80_state>(); |
| 85 | 115 | UINT16 videoram_addr; |
| 86 | 116 | int y, sx, c = 0, r = 0; |
| 87 | 117 | |
| 88 | 118 | for (y = 0; y < 312; y++) |
| 89 | 119 | { |
| 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]; |
| 92 | 122 | int dv = (vsync_data & ABC80_K2_DV) ? 1 : 0; |
| 93 | 123 | int mode = 1; |
| 94 | 124 | |
| r9547 | r9548 | |
| 100 | 130 | |
| 101 | 131 | for (sx = 0; sx < 64; sx++) |
| 102 | 132 | { |
| 103 | | UINT8 hsync_data = state->hsync_prom[sx]; |
| 133 | UINT8 hsync_data = m_hsync_prom[sx]; |
| 104 | 134 | int dh = (hsync_data & ABC80_K5_DH) ? 1 : 0; |
| 105 | 135 | UINT8 attr_addr; |
| 106 | 136 | UINT8 videoram_data, attr_data; |
| r9547 | r9548 | |
| 126 | 156 | */ |
| 127 | 157 | |
| 128 | 158 | 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]; |
| 130 | 160 | attr_addr = ((dh & dv) << 7) & (data & 0x7f); |
| 131 | | attr_data = state->attr_prom[attr_addr]; |
| 161 | attr_data = m_attr_prom[attr_addr]; |
| 132 | 162 | |
| 133 | 163 | blank = (attr_data & ABC80_J3_BLANK) ? 1 : 0; |
| 134 | 164 | tecken = (attr_data & ABC80_J3_TEXT) ? 1 : 0; |
| r9547 | r9548 | |
| 145 | 175 | |
| 146 | 176 | UINT16 chargen_addr = ((videoram_data & 0x7f) * 10) + l; |
| 147 | 177 | |
| 148 | | data = state->char_rom[chargen_addr]; |
| 178 | data = m_char_rom[chargen_addr]; |
| 149 | 179 | } |
| 150 | 180 | else |
| 151 | 181 | { |
| r9547 | r9548 | |
| 186 | 216 | int color = BIT(data, 7); |
| 187 | 217 | int x = (sx * 6) + bit; |
| 188 | 218 | |
| 189 | | color ^= (cursor & state->blink); |
| 219 | color ^= (cursor & m_blink); |
| 190 | 220 | color &= blank; |
| 191 | 221 | |
| 192 | 222 | *BITMAP_ADDR16(bitmap, y, x) = color; |
| r9547 | r9548 | |
| 196 | 226 | } |
| 197 | 227 | } |
| 198 | 228 | } |
| 199 | | #endif |
| 200 | 229 | |
| 201 | | static VIDEO_START( abc80 ) |
| 230 | |
| 231 | //------------------------------------------------- |
| 232 | // VIDEO_START( abc80 ) |
| 233 | //------------------------------------------------- |
| 234 | |
| 235 | void abc80_state::video_start() |
| 202 | 236 | { |
| 203 | | abc80_state *state = machine->driver_data<abc80_state>(); |
| 204 | | |
| 205 | 237 | /* 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); |
| 207 | 239 | |
| 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); |
| 210 | 242 | |
| 211 | 243 | /* 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"); |
| 217 | 249 | |
| 218 | 250 | /* 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); |
| 222 | 254 | } |
| 223 | 255 | |
| 224 | | static VIDEO_UPDATE( abc80 ) |
| 256 | |
| 257 | //------------------------------------------------- |
| 258 | // VIDEO_UPDATE( abc80 ) |
| 259 | //------------------------------------------------- |
| 260 | |
| 261 | bool abc80_state::video_update(screen_device &screen, bitmap_t &bitmap, const rectangle &cliprect) |
| 225 | 262 | { |
| 226 | | abc80_state *state = screen->machine->driver_data<abc80_state>(); |
| 227 | 263 | rectangle rect; |
| 228 | 264 | |
| 229 | 265 | rect.min_x = ABC80_HDSTART; |
| r9547 | r9548 | |
| 231 | 267 | rect.min_y = ABC80_VDSTART; |
| 232 | 268 | rect.max_y = ABC80_VDSTART + 240 - 1; |
| 233 | 269 | |
| 234 | | bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine)); |
| 270 | bitmap_fill(&bitmap, &cliprect, get_black_pen(machine)); |
| 235 | 271 | |
| 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); |
| 238 | 274 | |
| 239 | 275 | //abc80_update(screen->machine, bitmap, cliprect); |
| 240 | 276 | |
| 241 | 277 | return 0; |
| 242 | 278 | } |
| 243 | 279 | |
| 280 | |
| 281 | //------------------------------------------------- |
| 282 | // MACHINE_CONFIG_FRAGMENT( abc80_video ) |
| 283 | //------------------------------------------------- |
| 284 | |
| 244 | 285 | MACHINE_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)) |
| 246 | 287 | |
| 247 | 288 | MDRV_SCREEN_ADD(SCREEN_TAG, RASTER) |
| 248 | 289 | MDRV_SCREEN_FORMAT(BITMAP_FORMAT_INDEXED16) |
| 290 | |
| 249 | 291 | MDRV_GFXDECODE(abc80) |
| 292 | |
| 250 | 293 | MDRV_PALETTE_LENGTH(4) |
| 251 | | |
| 252 | 294 | MDRV_PALETTE_INIT(abc80) |
| 253 | | MDRV_VIDEO_START(abc80) |
| 254 | | MDRV_VIDEO_UPDATE(abc80) |
| 255 | 295 | |
| 256 | 296 | MDRV_SCREEN_RAW_PARAMS(ABC80_XTAL/2, ABC80_HTOTAL, ABC80_HBEND, ABC80_HBSTART, ABC80_VTOTAL, ABC80_VBEND, ABC80_VBSTART) |
| 257 | 297 | MACHINE_CONFIG_END |
src/mess/drivers/abc80.c
| r9547 | r9548 | |
| 74 | 74 | |
| 75 | 75 | */ |
| 76 | 76 | |
| 77 | | /* Core includes */ |
| 77 | #define ADDRESS_MAP_MODERN |
| 78 | |
| 78 | 79 | #include "emu.h" |
| 79 | 80 | #include "cpu/z80/z80.h" |
| 80 | | #include "includes/abc80.h" |
| 81 | | |
| 82 | | /* Components */ |
| 83 | 81 | #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" |
| 84 | 89 | #include "machine/z80pio.h" |
| 85 | 90 | #include "sound/sn76477.h" |
| 86 | | #include "machine/abcbus.h" |
| 87 | | #include "machine/abc830.h" |
| 91 | #include "includes/abc80.h" |
| 88 | 92 | |
| 89 | | /* Devices */ |
| 90 | | #include "devices/flopdrv.h" |
| 91 | | #include "devices/cassette.h" |
| 92 | | #include "devices/printer.h" |
| 93 | | #include "devices/messram.h" |
| 94 | 93 | |
| 95 | | /* Read/Write Handlers */ |
| 96 | 94 | |
| 97 | | static WRITE8_DEVICE_HANDLER( abc80_sound_w ) |
| 98 | | { |
| 99 | | /* |
| 95 | //************************************************************************** |
| 96 | // KEYBOARD HACK |
| 97 | //************************************************************************** |
| 100 | 98 | |
| 101 | | Bit Name Description |
| 99 | static 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('(') |
| 102 | 109 | |
| 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') |
| 111 | 119 | |
| 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) |
| 113 | 129 | |
| 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') |
| 115 | 139 | |
| 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') |
| 118 | 149 | |
| 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(':') |
| 122 | 159 | |
| 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 ) |
| 126 | 169 | |
| 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 ) |
| 179 | INPUT_PORTS_END |
| 128 | 180 | |
| 129 | 181 | static const UINT8 abc80_keycodes[7*4][8] = |
| 130 | 182 | { |
| r9547 | r9548 | |
| 169 | 221 | { |
| 170 | 222 | abc80_state *state = machine->driver_data<abc80_state>(); |
| 171 | 223 | |
| 172 | | state->key_data = 0; |
| 224 | state->m_key_data = 0; |
| 173 | 225 | } |
| 174 | 226 | |
| 175 | 227 | static void abc80_keyboard_scan(running_machine *machine) |
| r9547 | r9548 | |
| 192 | 244 | } |
| 193 | 245 | |
| 194 | 246 | /* clear key strobe */ |
| 195 | | state->key_strobe = 0; |
| 247 | state->m_key_strobe = 0; |
| 196 | 248 | |
| 197 | 249 | /* scan keyboard */ |
| 198 | 250 | for (row = 0; row < 7; row++) |
| r9547 | r9548 | |
| 206 | 258 | UINT8 keydata = abc80_keycodes[row + (table * 7)][col]; |
| 207 | 259 | |
| 208 | 260 | /* set key strobe */ |
| 209 | | state->key_strobe = 1; |
| 261 | state->m_key_strobe = 1; |
| 210 | 262 | |
| 211 | | if (state->key_data != keydata) |
| 263 | if (state->m_key_data != keydata) |
| 212 | 264 | { |
| 213 | 265 | UINT8 pio_data = 0x80 | keydata; |
| 214 | 266 | |
| 215 | 267 | /* latch key data */ |
| 216 | | state->key_data = keydata; |
| 268 | state->m_key_data = keydata; |
| 217 | 269 | |
| 218 | | z80pio_pa_w(state->z80pio, 0, pio_data); |
| 270 | z80pio_pa_w(state->m_pio, 0, pio_data); |
| 219 | 271 | return; |
| 220 | 272 | } |
| 221 | 273 | } |
| 222 | 274 | } |
| 223 | 275 | } |
| 224 | 276 | |
| 225 | | if (!state->key_strobe && state->key_data) |
| 277 | if (!state->m_key_strobe && state->m_key_data) |
| 226 | 278 | { |
| 227 | | z80pio_pa_w(state->z80pio, 0, state->key_data); |
| 279 | z80pio_pa_w(state->m_pio, 0, state->m_key_data); |
| 228 | 280 | timer_set(machine, ATTOTIME_IN_MSEC(50), NULL, 0, keyboard_data_clear); |
| 229 | 281 | } |
| 230 | 282 | } |
| r9547 | r9548 | |
| 234 | 286 | abc80_keyboard_scan(timer.machine); |
| 235 | 287 | } |
| 236 | 288 | |
| 237 | | /* Memory Maps */ |
| 238 | 289 | |
| 239 | | static 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 | |
| 299 | static 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 | |
| 314 | static ADDRESS_MAP_START( abc80_mem, ADDRESS_SPACE_PROGRAM, 8, abc80_state ) |
| 240 | 315 | ADDRESS_MAP_UNMAP_HIGH |
| 241 | 316 | AM_RANGE(0x0000, 0x3fff) AM_ROM |
| 242 | 317 | AM_RANGE(0x6000, 0x6fff) AM_ROM |
| 243 | 318 | 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) |
| 245 | 320 | 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) |
| 247 | 322 | AM_RANGE(0x8000, 0xffff) AM_RAM |
| 248 | 323 | ADDRESS_MAP_END |
| 249 | 324 | |
| 250 | | static ADDRESS_MAP_START( abc80_io_map, ADDRESS_SPACE_IO, 8 ) |
| 325 | |
| 326 | //------------------------------------------------- |
| 327 | // ADDRESS_MAP( abc80_io ) |
| 328 | //------------------------------------------------- |
| 329 | |
| 330 | static ADDRESS_MAP_START( abc80_io, ADDRESS_SPACE_IO, 8, abc80_state ) |
| 251 | 331 | ADDRESS_MAP_UNMAP_HIGH |
| 252 | 332 | 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) |
| 262 | 342 | ADDRESS_MAP_END |
| 263 | 343 | |
| 264 | | /* Input Ports */ |
| 265 | 344 | |
| 266 | | static 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('(') |
| 276 | 345 | |
| 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 | //************************************************************************** |
| 286 | 349 | |
| 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 | //------------------------------------------------- |
| 296 | 353 | |
| 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') |
| 354 | static INPUT_PORTS_START( abc80 ) |
| 355 | PORT_INCLUDE(fake_keyboard) |
| 306 | 356 | |
| 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) |
| 316 | 366 | |
| 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) |
| 368 | INPUT_PORTS_END |
| 326 | 369 | |
| 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 ) |
| 336 | 370 | |
| 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 ) |
| 346 | 371 | |
| 347 | | PORT_INCLUDE(luxor_55_10828) |
| 348 | | INPUT_PORTS_END |
| 372 | //************************************************************************** |
| 373 | // DEVICE CONFIGURATION |
| 374 | //************************************************************************** |
| 349 | 375 | |
| 350 | | /* Sound Interface */ |
| 376 | //------------------------------------------------- |
| 377 | // sn76477_interface csg_intf |
| 378 | //------------------------------------------------- |
| 351 | 379 | |
| 352 | | static const sn76477_interface abc80_sn76477_interface = |
| 380 | static const sn76477_interface csg_intf = |
| 353 | 381 | { |
| 354 | 382 | RES_K(47), // 4 noise_res R26 47k |
| 355 | 383 | RES_K(330), // 5 filter_res R24 330k |
| r9547 | r9548 | |
| 369 | 397 | RES_K(330) // 24 oneshot_res R25 330k |
| 370 | 398 | }; |
| 371 | 399 | |
| 372 | | /* Interrupt Generators */ |
| 373 | 400 | |
| 401 | //------------------------------------------------- |
| 402 | // INTERRUPT_GEN( abc80_nmi_interrupt ) |
| 403 | //------------------------------------------------- |
| 404 | |
| 374 | 405 | static INTERRUPT_GEN( abc80_nmi_interrupt ) |
| 375 | 406 | { |
| 376 | 407 | cputag_set_input_line(device->machine, Z80_TAG, INPUT_LINE_NMI, PULSE_LINE); |
| 377 | 408 | } |
| 378 | 409 | |
| 379 | | /* Z80 PIO */ |
| 380 | 410 | |
| 411 | //------------------------------------------------- |
| 412 | // Z80PIO_INTERFACE( pio_intf ) |
| 413 | //------------------------------------------------- |
| 414 | |
| 381 | 415 | static TIMER_DEVICE_CALLBACK( z80pio_astb_tick ) |
| 382 | 416 | { |
| 383 | 417 | abc80_state *state = timer.machine->driver_data<abc80_state>(); |
| 384 | 418 | |
| 385 | 419 | /* toggle ASTB every other video line */ |
| 386 | | state->z80pio_astb = !state->z80pio_astb; |
| 420 | state->m_pio_astb = !state->m_pio_astb; |
| 387 | 421 | |
| 388 | | z80pio_astb_w(state->z80pio, state->z80pio_astb); |
| 422 | z80pio_astb_w(state->m_pio, state->m_pio_astb); |
| 389 | 423 | } |
| 390 | 424 | |
| 391 | | static READ8_DEVICE_HANDLER( pio_pa_r ) |
| 425 | READ8_MEMBER( abc80_state::pio_pa_r ) |
| 392 | 426 | { |
| 393 | 427 | /* |
| 394 | 428 | |
| r9547 | r9548 | |
| 407 | 441 | |
| 408 | 442 | */ |
| 409 | 443 | |
| 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; |
| 413 | 445 | }; |
| 414 | 446 | |
| 415 | | static READ8_DEVICE_HANDLER( pio_pb_r ) |
| 447 | READ8_MEMBER( abc80_state::pio_pb_r ) |
| 416 | 448 | { |
| 417 | 449 | /* |
| 418 | 450 | |
| r9547 | r9548 | |
| 429 | 461 | |
| 430 | 462 | */ |
| 431 | 463 | |
| 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 | |
| 432 | 475 | /* cassette data */ |
| 433 | | UINT8 data = (cassette_input(device) > +1.0) << 7; |
| 476 | data |= (cassette_input(m_cassette) > +1.0) << 7; |
| 434 | 477 | |
| 435 | 478 | return data; |
| 436 | 479 | }; |
| 437 | 480 | |
| 438 | | static WRITE8_DEVICE_HANDLER( pio_pb_w ) |
| 481 | WRITE8_MEMBER( abc80_state::pio_pb_w ) |
| 439 | 482 | { |
| 440 | 483 | /* |
| 441 | 484 | |
| r9547 | r9548 | |
| 452 | 495 | |
| 453 | 496 | */ |
| 454 | 497 | |
| 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 | |
| 455 | 504 | /* 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); |
| 457 | 506 | |
| 458 | 507 | /* 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); |
| 460 | 509 | }; |
| 461 | 510 | |
| 462 | 511 | static Z80PIO_INTERFACE( pio_intf ) |
| 463 | 512 | { |
| 464 | 513 | 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 */ |
| 466 | 515 | DEVCB_NULL, /* port A write callback */ |
| 467 | 516 | 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 */ |
| 470 | 519 | DEVCB_NULL /* portB ready active callback */ |
| 471 | 520 | }; |
| 472 | 521 | |
| 522 | |
| 523 | //------------------------------------------------- |
| 524 | // Z80PIO_INTERFACE( pio_intf ) |
| 525 | //------------------------------------------------- |
| 526 | |
| 473 | 527 | static const z80_daisy_config abc80_daisy_chain[] = |
| 474 | 528 | { |
| 475 | 529 | { Z80PIO_TAG }, |
| 476 | 530 | { NULL } |
| 477 | 531 | }; |
| 478 | 532 | |
| 479 | | /* Cassette */ |
| 480 | 533 | |
| 534 | //------------------------------------------------- |
| 535 | // cassette_config abc80_cassette_config |
| 536 | //------------------------------------------------- |
| 537 | |
| 481 | 538 | static const cassette_config abc80_cassette_config = |
| 482 | 539 | { |
| 483 | 540 | cassette_default_formats, |
| r9547 | r9548 | |
| 486 | 543 | NULL |
| 487 | 544 | }; |
| 488 | 545 | |
| 489 | | /* ABC BUS */ |
| 490 | 546 | |
| 547 | //------------------------------------------------- |
| 548 | // ABCBUS_DAISY( abcbus_daisy ) |
| 549 | //------------------------------------------------- |
| 550 | |
| 491 | 551 | static ABCBUS_DAISY( abcbus_daisy ) |
| 492 | 552 | { |
| 493 | 553 | { LUXOR_55_10828_ABCBUS("luxor_55_10828") }, |
| 494 | 554 | { NULL } |
| 495 | 555 | }; |
| 496 | 556 | |
| 497 | | /* Machine Initialization */ |
| 498 | 557 | |
| 499 | | static MACHINE_START( abc80 ) |
| 558 | //------------------------------------------------- |
| 559 | // RS232_INTERFACE( rs232_intf ) |
| 560 | //------------------------------------------------- |
| 561 | |
| 562 | static RS232_INTERFACE( rs232_intf ) |
| 500 | 563 | { |
| 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 | }; |
| 502 | 573 | |
| 574 | |
| 575 | |
| 576 | //************************************************************************** |
| 577 | // MACHINE INITIALIZATION |
| 578 | //************************************************************************** |
| 579 | |
| 580 | //------------------------------------------------- |
| 581 | // MACHINE_START( abc80 ) |
| 582 | //------------------------------------------------- |
| 583 | |
| 584 | void abc80_state::machine_start() |
| 585 | { |
| 503 | 586 | /* configure RAM expansion */ |
| 504 | | if (messram_get_size(machine->device("messram")) == 16*1024) |
| 587 | if (messram_get_size(m_ram) == 16 * 1024) |
| 505 | 588 | { |
| 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); |
| 507 | 590 | } |
| 508 | 591 | |
| 509 | | /* find devices */ |
| 510 | | state->z80pio = machine->device(Z80PIO_TAG); |
| 511 | | |
| 512 | 592 | /* 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); |
| 516 | 596 | } |
| 517 | 597 | |
| 518 | | /* Machine Drivers */ |
| 519 | 598 | |
| 599 | |
| 600 | //************************************************************************** |
| 601 | // MACHINE DRIVERS |
| 602 | //************************************************************************** |
| 603 | |
| 604 | //------------------------------------------------- |
| 605 | // MACHINE_CONFIG( abc80 ) |
| 606 | //------------------------------------------------- |
| 607 | |
| 520 | 608 | static MACHINE_CONFIG_START( abc80, abc80_state ) |
| 521 | 609 | /* basic machine hardware */ |
| 522 | 610 | 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) |
| 525 | 613 | MDRV_CPU_CONFIG(abc80_daisy_chain) |
| 526 | 614 | MDRV_CPU_VBLANK_INT(SCREEN_TAG, abc80_nmi_interrupt) |
| 527 | 615 | |
| 528 | | MDRV_MACHINE_START(abc80) |
| 616 | /* video hardware */ |
| 617 | MDRV_FRAGMENT_ADD(abc80_video) |
| 529 | 618 | |
| 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 | |
| 530 | 625 | /* keyboard */ |
| 531 | 626 | MDRV_TIMER_ADD_PERIODIC("keyboard", abc80_keyboard_tick, USEC(2500)) |
| 532 | 627 | |
| 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 | | |
| 537 | 628 | /* Luxor Conkort 55-10828 */ |
| 538 | 629 | MDRV_ABCBUS_ADD(ABCBUS_TAG, abcbus_daisy, Z80_TAG) |
| 539 | 630 | MDRV_ABC830_PIO_ADD("luxor_55_10828", ABCBUS_TAG, DRIVE_MPI_51) |
| 540 | 631 | |
| 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) |
| 551 | 636 | MDRV_PRINTER_ADD("printer") |
| 552 | | |
| 553 | | /* cassette */ |
| 554 | 637 | MDRV_CASSETTE_ADD(CASSETTE_TAG, abc80_cassette_config) |
| 555 | 638 | |
| 556 | 639 | /* internal ram */ |
| r9547 | r9548 | |
| 559 | 642 | MDRV_RAM_EXTRA_OPTIONS("32K") |
| 560 | 643 | MACHINE_CONFIG_END |
| 561 | 644 | |
| 562 | | /* ROMs */ |
| 563 | 645 | |
| 646 | |
| 647 | //************************************************************************** |
| 648 | // ROMS |
| 649 | //************************************************************************** |
| 650 | |
| 651 | //------------------------------------------------- |
| 652 | // ROM( abc80 ) |
| 653 | //------------------------------------------------- |
| 654 | |
| 564 | 655 | ROM_START( abc80 ) |
| 565 | 656 | ROM_REGION( 0x10000, Z80_TAG, 0 ) |
| 566 | 657 | ROM_LOAD( "za3508.a2", 0x0000, 0x1000, CRC(e2afbf48) SHA1(9883396edd334835a844dcaa792d29599a8c67b9) ) |
| r9547 | r9548 | |
| 599 | 690 | ROM_LOAD( "abc80_13.e7", 0x0000, 0x0080, NO_DUMP ) // "64 40057-01" 82S129 256x4 address decoder |
| 600 | 691 | ROM_END |
| 601 | 692 | |
| 602 | | /* Drivers */ |
| 603 | 693 | |
| 604 | | /* YEAR NAME PARENT COMPAT MACHINE INPUT INIT COMPANY FULLNAME FLAGS */ |
| 605 | | COMP( 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 |
| 700 | COMP( 1978, abc80, 0, 0, abc80, abc80, 0, "Luxor Datorer AB", "ABC 80", GAME_SUPPORTS_SAVE ) |