trunk/src/mame/drivers/fidel6502.cpp
r253009 | r253010 | |
32 | 32 | fidel6502_state(const machine_config &mconfig, device_type type, const char *tag) |
33 | 33 | : fidelz80base_state(mconfig, type, tag), |
34 | 34 | m_6821pia(*this, "6821pia"), |
35 | | m_speaker(*this, "speaker") |
| 35 | m_speaker(*this, "speaker"), |
| 36 | m_irq_off(*this, "irq_off") |
36 | 37 | { } |
37 | 38 | |
38 | 39 | // devices/pointers |
39 | 40 | optional_device<pia6821_device> m_6821pia; |
40 | 41 | optional_device<speaker_sound_device> m_speaker; |
| 42 | optional_device<timer_device> m_irq_off; |
41 | 43 | |
42 | 44 | // model CSC |
43 | 45 | void csc_prepare_display(); |
r253009 | r253010 | |
54 | 56 | DECLARE_READ_LINE_MEMBER(csc_pia1_ca1_r); |
55 | 57 | DECLARE_READ_LINE_MEMBER(csc_pia1_cb1_r); |
56 | 58 | |
57 | | TIMER_DEVICE_CALLBACK_MEMBER(irq_timer); |
58 | | |
59 | | protected: |
60 | | virtual void machine_start() override; |
| 59 | // model SC12 |
| 60 | TIMER_DEVICE_CALLBACK_MEMBER(irq_off); |
| 61 | TIMER_DEVICE_CALLBACK_MEMBER(sc12_irq); |
| 62 | DECLARE_WRITE8_MEMBER(sc12_control_w); |
| 63 | DECLARE_READ8_MEMBER(sc12_input_r); |
61 | 64 | }; |
62 | 65 | |
63 | 66 | |
r253009 | r253010 | |
196 | 199 | |
197 | 200 | |
198 | 201 | |
| 202 | /****************************************************************************** |
| 203 | SC12 |
| 204 | ******************************************************************************/ |
199 | 205 | |
200 | | TIMER_DEVICE_CALLBACK_MEMBER(fidel6502_state::irq_timer) |
| 206 | // interrupt handling |
| 207 | |
| 208 | TIMER_DEVICE_CALLBACK_MEMBER(fidel6502_state::irq_off) |
201 | 209 | { |
202 | | m_maincpu->set_input_line(M6502_IRQ_LINE, HOLD_LINE); |
| 210 | m_maincpu->set_input_line(M6502_IRQ_LINE, CLEAR_LINE); |
203 | 211 | } |
204 | 212 | |
| 213 | TIMER_DEVICE_CALLBACK_MEMBER(fidel6502_state::sc12_irq) |
| 214 | { |
| 215 | m_maincpu->set_input_line(M6502_IRQ_LINE, ASSERT_LINE); |
| 216 | m_irq_off->adjust(attotime::from_nsec(15250)); // active low for 15.25us |
| 217 | } |
| 218 | |
| 219 | |
| 220 | // TTL |
| 221 | |
| 222 | WRITE8_MEMBER(fidel6502_state::sc12_control_w) |
| 223 | { |
| 224 | // d0-d3: 7442 a0-a3 |
| 225 | // 7442 0-8: led data, input mux |
| 226 | UINT16 sel = 1 << (data & 0xf) & 0x3ff; |
| 227 | m_inp_mux = sel & 0x1ff; |
| 228 | |
| 229 | // 7442 9: speaker out |
| 230 | m_speaker->level_w(sel >> 9 & 1); |
| 231 | |
| 232 | // d6,d7: led select (active low) |
| 233 | display_matrix(9, 2, sel & 0x1ff, ~data >> 6 & 3); |
| 234 | |
| 235 | // d4,d5: printer |
| 236 | //.. |
| 237 | } |
| 238 | |
| 239 | READ8_MEMBER(fidel6502_state::sc12_input_r) |
| 240 | { |
| 241 | // a0-a2,d7: multiplexed inputs (active low) |
| 242 | return (read_inputs(9) << (offset^7) & 0x80) ^ 0xff; |
| 243 | } |
| 244 | |
| 245 | |
| 246 | |
205 | 247 | /****************************************************************************** |
206 | 248 | Address Maps |
207 | 249 | ******************************************************************************/ |
208 | 250 | |
| 251 | // CSC |
| 252 | |
209 | 253 | static ADDRESS_MAP_START( csc_map, AS_PROGRAM, 8, fidel6502_state ) |
210 | 254 | ADDRESS_MAP_UNMAP_HIGH |
211 | | AM_RANGE(0x0000, 0x07ff) AM_RAM AM_MIRROR(0x4000) |
212 | | AM_RANGE(0x0800, 0x0bff) AM_RAM AM_MIRROR(0x4400) |
213 | | AM_RANGE(0x1000, 0x1003) AM_DEVREADWRITE("pia0", pia6821_device, read, write) AM_MIRROR(0x47fc) |
214 | | AM_RANGE(0x1800, 0x1803) AM_DEVREADWRITE("pia1", pia6821_device, read, write) AM_MIRROR(0x47fc) |
215 | | AM_RANGE(0x2000, 0x3fff) AM_ROM AM_MIRROR(0x4000) |
| 255 | AM_RANGE(0x0000, 0x07ff) AM_MIRROR(0x4000) AM_RAM |
| 256 | AM_RANGE(0x0800, 0x0bff) AM_MIRROR(0x4400) AM_RAM |
| 257 | AM_RANGE(0x1000, 0x1003) AM_MIRROR(0x47fc) AM_DEVREADWRITE("pia0", pia6821_device, read, write) |
| 258 | AM_RANGE(0x1800, 0x1803) AM_MIRROR(0x47fc) AM_DEVREADWRITE("pia1", pia6821_device, read, write) |
| 259 | AM_RANGE(0x2000, 0x3fff) AM_MIRROR(0x4000) AM_ROM |
216 | 260 | AM_RANGE(0xa000, 0xffff) AM_ROM |
217 | 261 | ADDRESS_MAP_END |
218 | 262 | |
219 | 263 | |
| 264 | // SC12 |
| 265 | |
220 | 266 | static ADDRESS_MAP_START( sc12_map, AS_PROGRAM, 8, fidel6502_state ) |
221 | 267 | ADDRESS_MAP_UNMAP_HIGH |
222 | 268 | AM_RANGE(0x0000, 0x0fff) AM_RAM |
| 269 | AM_RANGE(0x6000, 0x6000) AM_MIRROR(0x1fff) AM_WRITE(sc12_control_w) |
223 | 270 | AM_RANGE(0x8000, 0x9fff) AM_ROM |
224 | | AM_RANGE(0xc000, 0xcfff) AM_ROM AM_MIRROR(0x1000) |
| 271 | AM_RANGE(0xa000, 0xa007) AM_MIRROR(0x1ff8) AM_READ(sc12_input_r) |
| 272 | AM_RANGE(0xc000, 0xcfff) AM_MIRROR(0x1000) AM_ROM |
225 | 273 | AM_RANGE(0xe000, 0xffff) AM_ROM |
226 | 274 | ADDRESS_MAP_END |
227 | 275 | |
| 276 | |
| 277 | // FEV |
| 278 | |
228 | 279 | static ADDRESS_MAP_START( fev_map, AS_PROGRAM, 8, fidel6502_state ) |
229 | 280 | ADDRESS_MAP_UNMAP_HIGH |
230 | 281 | AM_RANGE(0x0000, 0x1fff) AM_RAM |
r253009 | r253010 | |
232 | 283 | ADDRESS_MAP_END |
233 | 284 | |
234 | 285 | |
| 286 | |
235 | 287 | /****************************************************************************** |
236 | 288 | Input Ports |
237 | 289 | ******************************************************************************/ |
r253009 | r253010 | |
337 | 389 | PORT_BIT(0x100,IP_ACTIVE_HIGH, IPT_UNUSED) PORT_UNUSED |
338 | 390 | INPUT_PORTS_END |
339 | 391 | |
| 392 | static INPUT_PORTS_START( sc12 ) |
| 393 | PORT_START("IN.0") |
| 394 | PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) |
| 395 | PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) |
| 396 | PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) |
| 397 | PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) |
| 398 | PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) |
| 399 | PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) |
| 400 | PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) |
| 401 | PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) |
340 | 402 | |
341 | | void fidel6502_state::machine_start() |
342 | | { |
343 | | fidelz80base_state::machine_start(); |
344 | | } |
| 403 | PORT_START("IN.1") |
| 404 | PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) |
| 405 | PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) |
| 406 | PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) |
| 407 | PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) |
| 408 | PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) |
| 409 | PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) |
| 410 | PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) |
| 411 | PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) |
345 | 412 | |
| 413 | PORT_START("IN.2") |
| 414 | PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) |
| 415 | PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) |
| 416 | PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) |
| 417 | PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) |
| 418 | PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) |
| 419 | PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) |
| 420 | PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) |
| 421 | PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) |
346 | 422 | |
| 423 | PORT_START("IN.3") |
| 424 | PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) |
| 425 | PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) |
| 426 | PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) |
| 427 | PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) |
| 428 | PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) |
| 429 | PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) |
| 430 | PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) |
| 431 | PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) |
| 432 | |
| 433 | PORT_START("IN.4") |
| 434 | PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) |
| 435 | PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) |
| 436 | PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) |
| 437 | PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) |
| 438 | PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) |
| 439 | PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) |
| 440 | PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) |
| 441 | PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) |
| 442 | |
| 443 | PORT_START("IN.5") |
| 444 | PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) |
| 445 | PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) |
| 446 | PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) |
| 447 | PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) |
| 448 | PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) |
| 449 | PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) |
| 450 | PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) |
| 451 | PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) |
| 452 | |
| 453 | PORT_START("IN.6") |
| 454 | PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) |
| 455 | PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) |
| 456 | PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) |
| 457 | PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) |
| 458 | PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) |
| 459 | PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) |
| 460 | PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) |
| 461 | PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) |
| 462 | |
| 463 | PORT_START("IN.7") |
| 464 | PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) |
| 465 | PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) |
| 466 | PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) |
| 467 | PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) |
| 468 | PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) |
| 469 | PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) |
| 470 | PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) |
| 471 | PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) |
| 472 | |
| 473 | PORT_START("IN.8") |
| 474 | PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("RV / Pawn") PORT_CODE(KEYCODE_1) |
| 475 | PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("DM / Knight") PORT_CODE(KEYCODE_2) |
| 476 | PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("TB / Bishop") PORT_CODE(KEYCODE_3) |
| 477 | PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("LV / Rook") PORT_CODE(KEYCODE_4) |
| 478 | PORT_BIT(0x10, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("PV / Queen") PORT_CODE(KEYCODE_5) |
| 479 | PORT_BIT(0x20, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("PB / King") PORT_CODE(KEYCODE_6) |
| 480 | PORT_BIT(0x40, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("CL") PORT_CODE(KEYCODE_DEL) // clear |
| 481 | PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_KEYPAD) PORT_NAME("RE") PORT_CODE(KEYCODE_R) // reset |
| 482 | INPUT_PORTS_END |
| 483 | |
| 484 | |
| 485 | |
347 | 486 | /****************************************************************************** |
348 | 487 | Machine Drivers |
349 | 488 | ******************************************************************************/ |
r253009 | r253010 | |
351 | 490 | static MACHINE_CONFIG_START( csc, fidel6502_state ) |
352 | 491 | |
353 | 492 | /* basic machine hardware */ |
354 | | MCFG_CPU_ADD("maincpu", M6502, 3900000/2) |
| 493 | MCFG_CPU_ADD("maincpu", M6502, 3900000/2) // from 3.9MHz resonator |
355 | 494 | MCFG_CPU_PROGRAM_MAP(csc_map) |
| 495 | MCFG_CPU_PERIODIC_INT_DRIVER(fidelz80base_state, irq0_line_hold, 600) // 38400kHz/64 |
356 | 496 | |
357 | | |
358 | | MCFG_TIMER_DRIVER_ADD_PERIODIC("irq_timer", fidel6502_state, irq_timer, attotime::from_hz(38400/64)) |
359 | | |
360 | 497 | MCFG_DEVICE_ADD("pia0", PIA6821, 0) |
361 | 498 | MCFG_PIA_READPB_HANDLER(READ8(fidel6502_state, csc_pia0_pb_r)) |
362 | 499 | MCFG_PIA_WRITEPA_HANDLER(WRITE8(fidel6502_state, csc_pia0_pa_w)) |
r253009 | r253010 | |
385 | 522 | MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25) |
386 | 523 | MACHINE_CONFIG_END |
387 | 524 | |
388 | | |
389 | 525 | static MACHINE_CONFIG_START( sc12, fidel6502_state ) |
390 | 526 | |
391 | 527 | /* basic machine hardware */ |
392 | 528 | MCFG_CPU_ADD("maincpu", R65C02, XTAL_4MHz) |
393 | 529 | MCFG_CPU_PROGRAM_MAP(sc12_map) |
| 530 | MCFG_TIMER_DRIVER_ADD_PERIODIC("sc12_irq", fidel6502_state, sc12_irq, attotime::from_hz(780)) // from 556 timer |
| 531 | MCFG_TIMER_DRIVER_ADD("irq_off", fidel6502_state, irq_off) |
394 | 532 | |
395 | 533 | MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", fidelz80base_state, display_decay_tick, attotime::from_msec(1)) |
396 | 534 | MCFG_DEFAULT_LAYOUT(layout_fidel_sc12) |
r253009 | r253010 | |
401 | 539 | MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25) |
402 | 540 | MACHINE_CONFIG_END |
403 | 541 | |
404 | | |
405 | | |
406 | 542 | static MACHINE_CONFIG_START( fev, fidel6502_state ) |
407 | 543 | |
408 | 544 | /* basic machine hardware */ |
r253009 | r253010 | |
420 | 556 | MACHINE_CONFIG_END |
421 | 557 | |
422 | 558 | |
| 559 | |
423 | 560 | /****************************************************************************** |
424 | 561 | ROM Definitions |
425 | 562 | ******************************************************************************/ |
r253009 | r253010 | |
459 | 596 | /* YEAR NAME PARENT COMPAT MACHINE INPUT INIT COMPANY, FULLNAME, FLAGS */ |
460 | 597 | COMP( 1981, csc, 0, 0, csc, csc, driver_device, 0, "Fidelity Electronics", "Champion Sensory Chess Challenger", MACHINE_NOT_WORKING | MACHINE_SUPPORTS_SAVE | MACHINE_CLICKABLE_ARTWORK ) |
461 | 598 | |
462 | | COMP( 1984, fscc12, 0, 0, sc12, csc, driver_device, 0, "Fidelity Electronics", "Sensory Chess Challenger 12-B", MACHINE_NOT_WORKING ) |
| 599 | COMP( 1984, fscc12, 0, 0, sc12, sc12, driver_device, 0, "Fidelity Electronics", "Sensory Chess Challenger 12-B", MACHINE_NOT_WORKING ) |
463 | 600 | |
464 | 601 | COMP( 1987, fexcelv, 0, 0, fev, csc, driver_device, 0, "Fidelity Electronics", "Voice Excellence", MACHINE_NOT_WORKING ) |