src/mess/drivers/mc1000.c
| r5146 | r5147 | |
| 18 | 18 | |
| 19 | 19 | TODO: |
| 20 | 20 | |
| 21 | | - video |
| 21 | - 60 Hz interrupt from NE555 |
| 22 | - Z80 _WAIT on 6847 _FS or _HS |
| 22 | 23 | - joystick |
| 23 | 24 | - tape |
| 24 | 25 | - 80-column card (MC6845) |
| r5146 | r5147 | |
| 77 | 78 | memory_install_readwrite8_handler(program, 0x8000, 0x97ff, 0, 0, SMH_UNMAP, SMH_UNMAP); |
| 78 | 79 | } |
| 79 | 80 | } |
| 81 | else |
| 82 | { |
| 83 | memory_install_readwrite8_handler(program, 0x8000, 0x97ff, 0, 0, SMH_BANK(4), SMH_BANK(4)); |
| 84 | } |
| 80 | 85 | |
| 81 | 86 | memory_set_bank(machine, 4, state->mc6847_bank); |
| 82 | 87 | |
| r5146 | r5147 | |
| 113 | 118 | |
| 114 | 119 | state->mc6845_bank = BIT(data, 0); |
| 115 | 120 | |
| 116 | | memory_set_bank(space->machine, 1, 0); |
| 117 | | |
| 118 | 121 | mc1000_bankswitch(space->machine); |
| 119 | 122 | } |
| 120 | 123 | |
| r5146 | r5147 | |
| 142 | 145 | mc1000_bankswitch(space->machine); |
| 143 | 146 | |
| 144 | 147 | state->mc6847_attr = data; |
| 145 | | |
| 146 | | logerror("MC6847 %02x\n", data); |
| 147 | 148 | } |
| 148 | 149 | |
| 149 | 150 | /* Memory Maps */ |
| r5146 | r5147 | |
| 181 | 182 | PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_X) PORT_CHAR('x') PORT_CHAR('X') |
| 182 | 183 | PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_0) PORT_CHAR('0') |
| 183 | 184 | PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_8) PORT_CHAR('8') PORT_CHAR('(') |
| 185 | PORT_BIT( 0xc0, IP_ACTIVE_LOW, IPT_UNUSED ) |
| 184 | 186 | |
| 185 | 187 | PORT_START("ROW1") |
| 186 | 188 | PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_A) PORT_CHAR('a') PORT_CHAR('A') |
| r5146 | r5147 | |
| 189 | 191 | PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Y) PORT_CHAR('y') PORT_CHAR('Y') |
| 190 | 192 | PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_1) PORT_CHAR('1') PORT_CHAR('1') |
| 191 | 193 | PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_9) PORT_CHAR('9') PORT_CHAR('9') |
| 194 | PORT_BIT( 0xc0, IP_ACTIVE_LOW, IPT_UNUSED ) |
| 192 | 195 | |
| 193 | 196 | PORT_START("ROW2") |
| 194 | 197 | PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_B) PORT_CHAR('b') PORT_CHAR('B') |
| r5146 | r5147 | |
| 197 | 200 | PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_Z) PORT_CHAR('z') PORT_CHAR('Z') |
| 198 | 201 | PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_2) PORT_CHAR('2') PORT_CHAR('"') |
| 199 | 202 | PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_QUOTE) PORT_CHAR(':') PORT_CHAR('*') |
| 203 | PORT_BIT( 0xc0, IP_ACTIVE_LOW, IPT_UNUSED ) |
| 200 | 204 | |
| 201 | 205 | PORT_START("ROW3") |
| 202 | 206 | PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_C) PORT_CHAR('c') PORT_CHAR('C') |
| r5146 | r5147 | |
| 205 | 209 | PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("RETURN") PORT_CODE(KEYCODE_ENTER) PORT_CHAR(13) |
| 206 | 210 | PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_3) PORT_CHAR('3') PORT_CHAR('#') |
| 207 | 211 | PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_COLON) PORT_CHAR(';') PORT_CHAR('+') |
| 212 | PORT_BIT( 0xc0, IP_ACTIVE_LOW, IPT_UNUSED ) |
| 208 | 213 | |
| 209 | 214 | PORT_START("ROW4") |
| 210 | 215 | PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_D) PORT_CHAR('d') PORT_CHAR('D') |
| r5146 | r5147 | |
| 213 | 218 | PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("SPACE") PORT_CODE(KEYCODE_SPACE) PORT_CHAR(' ') |
| 214 | 219 | PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_4) PORT_CHAR('4') PORT_CHAR('$') |
| 215 | 220 | PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_COMMA) PORT_CHAR(',') PORT_CHAR('<') |
| 221 | PORT_BIT( 0xc0, IP_ACTIVE_LOW, IPT_UNUSED ) |
| 216 | 222 | |
| 217 | 223 | PORT_START("ROW5") |
| 218 | 224 | PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_E) PORT_CHAR('e') PORT_CHAR('E') |
| r5146 | r5147 | |
| 221 | 227 | PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("RUBOUT") PORT_CODE(KEYCODE_BACKSPACE) PORT_CHAR(8) |
| 222 | 228 | PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_5) PORT_CHAR('5') PORT_CHAR('%') |
| 223 | 229 | PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_MINUS) PORT_CHAR('-') PORT_CHAR('=') |
| 230 | PORT_BIT( 0xc0, IP_ACTIVE_LOW, IPT_UNUSED ) |
| 224 | 231 | |
| 225 | 232 | PORT_START("ROW6") |
| 226 | 233 | PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_F) PORT_CHAR('f') PORT_CHAR('F') |
| r5146 | r5147 | |
| 229 | 236 | PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_OPENBRACE) PORT_CHAR('^') |
| 230 | 237 | PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_6) PORT_CHAR('6') PORT_CHAR('&') |
| 231 | 238 | PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_STOP) PORT_CHAR('.') PORT_CHAR('>') |
| 239 | PORT_BIT( 0xc0, IP_ACTIVE_LOW, IPT_UNUSED ) |
| 232 | 240 | |
| 233 | 241 | PORT_START("ROW7") |
| 234 | 242 | PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_G) PORT_CHAR('g') PORT_CHAR('G') |
| r5146 | r5147 | |
| 237 | 245 | PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("RESET") |
| 238 | 246 | PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_7) PORT_CHAR('7') PORT_CHAR('\'') |
| 239 | 247 | PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_CODE(KEYCODE_SLASH) PORT_CHAR('/') PORT_CHAR('?') |
| 248 | PORT_BIT( 0xc0, IP_ACTIVE_LOW, IPT_UNUSED ) |
| 240 | 249 | |
| 241 | 250 | PORT_START("MODIFIERS") |
| 242 | 251 | PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_KEYBOARD ) PORT_NAME("SHIFT") PORT_CODE(KEYCODE_LSHIFT) PORT_CHAR(UCHAR_SHIFT_1) |
| r5146 | r5147 | |
| 247 | 256 | |
| 248 | 257 | /* Video */ |
| 249 | 258 | |
| 259 | static void mc1000_hsync(running_machine *machine, int data) |
| 260 | { |
| 261 | // Z80 WAIT |
| 262 | } |
| 263 | |
| 264 | static void mc1000_vsync(running_machine *machine, int data) |
| 265 | { |
| 266 | // Z80 WAIT |
| 267 | } |
| 268 | |
| 250 | 269 | static ATTR_CONST UINT8 mc1000_get_attributes(running_machine *machine, UINT8 c, int scanline, int pos) |
| 251 | 270 | { |
| 252 | 271 | mc1000_state *state = machine->driver_data; |
| 253 | 272 | |
| 254 | 273 | UINT8 data = 0; |
| 255 | 274 | |
| 275 | data |= BIT(c, 7) ? M6847_INV : 0; |
| 256 | 276 | data |= BIT(state->mc6847_attr, 1) ? M6847_CSS : 0; |
| 257 | 277 | data |= BIT(state->mc6847_attr, 2) ? M6847_GM0 : 0; |
| 258 | 278 | data |= BIT(state->mc6847_attr, 3) ? M6847_GM1 : 0; |
| r5146 | r5147 | |
| 268 | 288 | { |
| 269 | 289 | mc1000_state *state = machine->driver_data; |
| 270 | 290 | |
| 271 | | return state->mc6847_video_ram + scanline*32; |
| 291 | return state->mc6847_video_ram + (scanline / 12) * 0x20; |
| 272 | 292 | } |
| 273 | 293 | |
| 274 | 294 | static VIDEO_START( mc1000 ) |
| r5146 | r5147 | |
| 277 | 297 | |
| 278 | 298 | memset(&cfg, 0, sizeof(cfg)); |
| 279 | 299 | |
| 280 | | cfg.type = M6847_VERSION_ORIGINAL_PAL; |
| 300 | cfg.type = M6847_VERSION_ORIGINAL_NTSC; |
| 301 | cfg.horizontal_sync_callback = mc1000_hsync; |
| 302 | cfg.field_sync_callback = mc1000_vsync; |
| 281 | 303 | cfg.get_attributes = mc1000_get_attributes; |
| 282 | 304 | cfg.get_video_ram = mc1000_get_video_ram; |
| 283 | 305 | |
| r5146 | r5147 | |
| 312 | 334 | |
| 313 | 335 | data &= ((input_port_read(device->machine, "MODIFIERS") & 0xc0) | 0x3f); |
| 314 | 336 | |
| 315 | | data &= (((cassette_input(cassette_device_image(device->machine)) < +0.0) << 7) | 0x7f); |
| 337 | // data &= (((cassette_input(cassette_device_image(device->machine)) < +0.0) << 7) | 0x7f); |
| 316 | 338 | |
| 317 | 339 | return data; |
| 318 | 340 | } |
| r5146 | r5147 | |
| 327 | 349 | DEVCB_NULL |
| 328 | 350 | }; |
| 329 | 351 | |
| 330 | | /* Machine Start */ |
| 352 | /* Machine Initialization */ |
| 331 | 353 | |
| 332 | 354 | static MACHINE_START( mc1000 ) |
| 333 | 355 | { |
| r5146 | r5147 | |
| 346 | 368 | memory_configure_bank(machine, 1, 1, 1, memory_region(machine, Z80_TAG) + 0xc000, 0); |
| 347 | 369 | memory_set_bank(machine, 1, 1); |
| 348 | 370 | |
| 371 | state->rom0000 = 1; |
| 372 | |
| 349 | 373 | memory_configure_bank(machine, 2, 0, 1, memory_region(machine, Z80_TAG) + 0x2000, 0); |
| 350 | 374 | memory_configure_bank(machine, 2, 1, 1, state->mc6845_video_ram, 0); |
| 351 | 375 | memory_set_bank(machine, 2, 0); |
| r5146 | r5147 | |
| 353 | 377 | memory_configure_bank(machine, 3, 0, 1, memory_region(machine, Z80_TAG) + 0x4000, 0); |
| 354 | 378 | memory_set_bank(machine, 3, 0); |
| 355 | 379 | |
| 356 | | memory_configure_bank(machine, 4, 0, 1, memory_region(machine, Z80_TAG) + 0x8000, 0); |
| 357 | | memory_configure_bank(machine, 4, 1, 1, state->mc6847_video_ram, 0); |
| 380 | memory_configure_bank(machine, 4, 0, 1, state->mc6847_video_ram, 0); |
| 381 | memory_configure_bank(machine, 4, 1, 1, memory_region(machine, Z80_TAG) + 0x8000, 0); |
| 358 | 382 | memory_set_bank(machine, 4, 0); |
| 359 | 383 | |
| 360 | 384 | memory_configure_bank(machine, 5, 0, 1, memory_region(machine, Z80_TAG) + 0x9800, 0); |
| r5146 | r5147 | |
| 363 | 387 | mc1000_bankswitch(machine); |
| 364 | 388 | } |
| 365 | 389 | |
| 390 | static MACHINE_RESET( mc1000 ) |
| 391 | { |
| 392 | mc1000_state *state = machine->driver_data; |
| 393 | |
| 394 | memory_set_bank(machine, 1, 1); |
| 395 | |
| 396 | state->rom0000 = 1; |
| 397 | } |
| 398 | |
| 366 | 399 | /* Machine Driver */ |
| 367 | 400 | |
| 368 | 401 | static const cassette_config mc1000_cassette_config = |
| r5146 | r5147 | |
| 372 | 405 | CASSETTE_STOPPED | CASSETTE_MOTOR_ENABLED | CASSETTE_SPEAKER_ENABLED |
| 373 | 406 | }; |
| 374 | 407 | |
| 375 | | static INTERRUPT_GEN( mc1000_int ) |
| 376 | | { |
| 377 | | cputag_set_input_line(device->machine, Z80_TAG, INPUT_LINE_IRQ0, ASSERT_LINE); |
| 378 | | } |
| 379 | | |
| 380 | 408 | static MACHINE_DRIVER_START( mc1000 ) |
| 381 | 409 | MDRV_DRIVER_DATA(mc1000_state) |
| 382 | 410 | |
| r5146 | r5147 | |
| 384 | 412 | MDRV_CPU_ADD(Z80_TAG, Z80, 3579545) |
| 385 | 413 | MDRV_CPU_PROGRAM_MAP(mc1000_mem) |
| 386 | 414 | MDRV_CPU_IO_MAP(mc1000_io) |
| 387 | | MDRV_CPU_VBLANK_INT(SCREEN_TAG, mc1000_int) |
| 388 | 415 | |
| 389 | 416 | MDRV_MACHINE_START(mc1000) |
| 417 | MDRV_MACHINE_RESET(mc1000) |
| 390 | 418 | |
| 391 | 419 | /* video hardware */ |
| 392 | 420 | MDRV_SCREEN_ADD(SCREEN_TAG, RASTER) |
| r5146 | r5147 | |
| 426 | 454 | CONFIG_RAM ( 48 * 1024 ) |
| 427 | 455 | SYSTEM_CONFIG_END |
| 428 | 456 | |
| 457 | /* Driver Initialization */ |
| 458 | |
| 459 | static DIRECT_UPDATE_HANDLER( mc1000_direct_update_handler ) |
| 460 | { |
| 461 | mc1000_state *state = space->machine->driver_data; |
| 462 | |
| 463 | if (state->rom0000) |
| 464 | { |
| 465 | if (address >= 0xc000) |
| 466 | { |
| 467 | memory_set_bank(space->machine, 1, 0); |
| 468 | state->rom0000 = 0; |
| 469 | } |
| 470 | } |
| 471 | |
| 472 | return address; |
| 473 | } |
| 474 | |
| 475 | static DRIVER_INIT( mc1000 ) |
| 476 | { |
| 477 | memory_set_direct_update_handler(cputag_get_address_space(machine, Z80_TAG, ADDRESS_SPACE_PROGRAM), mc1000_direct_update_handler); |
| 478 | } |
| 479 | |
| 429 | 480 | /* System Drivers */ |
| 430 | 481 | |
| 431 | | /* YEAR NAME PARENT COMPAT MACHINE INPUT INIT CONFIG COMPANY FULLNAME FLAGS */ |
| 432 | | COMP( 1985, mc1000, 0, 0, mc1000, mc1000, 0, mc1000, "CCE", "MC-1000", GAME_NOT_WORKING) |
| 482 | /* YEAR NAME PARENT COMPAT MACHINE INPUT INIT CONFIG COMPANY FULLNAME FLAGS */ |
| 483 | COMP( 1985, mc1000, 0, 0, mc1000, mc1000, mc1000, mc1000, "CCE", "MC-1000", 0 ) |