trunk/src/mess/drivers/hh_ucom4.c
| r244863 | r244864 | |
| 49 | 49 | |
| 50 | 50 | // devices |
| 51 | 51 | required_device<cpu_device> m_maincpu; |
| 52 | | optional_ioport_array<3> m_inp_matrix; // max 3 |
| 52 | optional_ioport_array<5> m_inp_matrix; // max 5 |
| 53 | 53 | optional_device<speaker_sound_device> m_speaker; |
| 54 | 54 | |
| 55 | 55 | // misc common |
| 56 | UINT8 m_port[9]; |
| 56 | 57 | UINT16 m_inp_mux; |
| 57 | 58 | |
| 58 | 59 | UINT8 read_inputs(int columns); |
| r244863 | r244864 | |
| 77 | 78 | void display_matrix(int maxx, int maxy, UINT32 setx, UINT32 sety); |
| 78 | 79 | |
| 79 | 80 | // game-specific handlers |
| 81 | void ssfball_display(); |
| 82 | DECLARE_READ8_MEMBER(ssfball_input_b_r); |
| 83 | DECLARE_WRITE8_MEMBER(ssfball_grid_w); |
| 84 | DECLARE_WRITE8_MEMBER(ssfball_plate_w); |
| 85 | |
| 86 | void splasfgt_display(); |
| 87 | DECLARE_READ8_MEMBER(splasfgt_input_b_r); |
| 88 | DECLARE_WRITE8_MEMBER(splasfgt_grid_w); |
| 89 | DECLARE_WRITE8_MEMBER(splasfgt_plate_w); |
| 90 | |
| 80 | 91 | DECLARE_WRITE8_MEMBER(edracula_grid_w); |
| 81 | 92 | DECLARE_WRITE8_MEMBER(edracula_plate_w); |
| 82 | | DECLARE_WRITE8_MEMBER(edracula_port_i_w); |
| 83 | 93 | |
| 84 | 94 | DECLARE_READ8_MEMBER(tmtennis_input_r); |
| 85 | 95 | DECLARE_WRITE8_MEMBER(tmtennis_grid_w); |
| r244863 | r244864 | |
| 92 | 102 | void tmpacman_display(); |
| 93 | 103 | DECLARE_WRITE8_MEMBER(tmpacman_grid_w); |
| 94 | 104 | DECLARE_WRITE8_MEMBER(tmpacman_plate_w); |
| 95 | | DECLARE_WRITE8_MEMBER(tmpacman_port_e_w); |
| 96 | 105 | |
| 97 | 106 | DECLARE_READ8_MEMBER(alnchase_input_r); |
| 98 | | DECLARE_WRITE8_MEMBER(alnchase_display_w); |
| 99 | | DECLARE_WRITE8_MEMBER(alnchase_port_e_w); |
| 107 | DECLARE_WRITE8_MEMBER(alnchase_output_w); |
| 100 | 108 | }; |
| 101 | 109 | |
| 102 | 110 | |
| r244863 | r244864 | |
| 108 | 116 | memset(m_display_decay, 0, sizeof(m_display_decay)); |
| 109 | 117 | memset(m_7seg_mask, 0, sizeof(m_7seg_mask)); |
| 110 | 118 | |
| 119 | memset(m_port, 0, sizeof(m_port)); |
| 111 | 120 | m_inp_mux = 0; |
| 112 | 121 | m_grid = 0; |
| 113 | 122 | m_plate = 0; |
| r244863 | r244864 | |
| 122 | 131 | save_item(NAME(m_display_decay)); |
| 123 | 132 | save_item(NAME(m_7seg_mask)); |
| 124 | 133 | |
| 134 | save_item(NAME(m_port)); |
| 125 | 135 | save_item(NAME(m_inp_mux)); |
| 126 | 136 | save_item(NAME(m_grid)); |
| 127 | 137 | save_item(NAME(m_plate)); |
| r244863 | r244864 | |
| 229 | 239 | |
| 230 | 240 | ***************************************************************************/ |
| 231 | 241 | |
| 242 | void hh_ucom4_state::ssfball_display() |
| 243 | { |
| 244 | UINT32 plate = BITSWAP24(m_plate,23,22,21,20,19,11,7,3,12,17,13,18,16,14,15,10,9,8,0,1,2,4,5,6); |
| 245 | display_matrix(16, 9, plate, m_grid); |
| 246 | } |
| 247 | |
| 248 | READ8_MEMBER(hh_ucom4_state::ssfball_input_b_r) |
| 249 | { |
| 250 | // B: input port 2, where B3 is multiplexed |
| 251 | return m_inp_matrix[2]->read() | read_inputs(2); |
| 252 | } |
| 253 | |
| 254 | WRITE8_MEMBER(hh_ucom4_state::ssfball_grid_w) |
| 255 | { |
| 256 | // C,D(,E): vfd matrix grid 0-7(,8) |
| 257 | int shift = (offset - NEC_UCOM4_PORTC) * 4; |
| 258 | m_grid = (m_grid & ~(0xf << shift)) | (data << shift); |
| 259 | |
| 260 | ssfball_display(); |
| 261 | } |
| 262 | |
| 263 | WRITE8_MEMBER(hh_ucom4_state::ssfball_plate_w) |
| 264 | { |
| 265 | m_port[offset] = data; |
| 266 | |
| 267 | // E,F,G,H,I(not all!): vfd matrix plate |
| 268 | int shift = (offset - NEC_UCOM4_PORTE) * 4; |
| 269 | m_plate = (m_plate & ~(0xf << shift)) | (data << shift); |
| 270 | |
| 271 | // F3,G3: input mux + speaker |
| 272 | m_inp_mux = (m_port[NEC_UCOM4_PORTF] >> 3 & 1) | (m_port[NEC_UCOM4_PORTG] >> 2 & 2); |
| 273 | m_speaker->level_w(m_inp_mux); |
| 274 | |
| 275 | // E3: vfd matrix grid 8 |
| 276 | if (offset == NEC_UCOM4_PORTE) |
| 277 | ssfball_grid_w(space, offset, data >> 3 & 1); |
| 278 | else |
| 279 | ssfball_display(); |
| 280 | } |
| 281 | |
| 282 | |
| 232 | 283 | static INPUT_PORTS_START( ssfball ) |
| 284 | PORT_START("IN.0") // F3 port B3 |
| 285 | PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) |
| 286 | PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON8 ) |
| 287 | |
| 288 | PORT_START("IN.1") // G3 port B3 |
| 289 | PORT_BIT( 0x07, IP_ACTIVE_HIGH, IPT_UNUSED ) |
| 290 | PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON9 ) |
| 291 | |
| 292 | PORT_START("IN.2") // port B |
| 293 | PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON5 ) |
| 294 | PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON6 ) |
| 295 | PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON7 ) |
| 296 | PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_SPECIAL ) // multiplexed, handled in ssfball_input_b_r |
| 297 | |
| 298 | PORT_START("IN.3") // port A |
| 299 | PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) |
| 300 | PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) |
| 301 | PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON3 ) |
| 302 | PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON4 ) |
| 233 | 303 | INPUT_PORTS_END |
| 234 | 304 | |
| 235 | 305 | |
| 306 | static const INT16 ssfball_speaker_levels[] = { 0, 32767, -32768, 0 }; |
| 307 | |
| 236 | 308 | static MACHINE_CONFIG_START( ssfball, hh_ucom4_state ) |
| 237 | 309 | |
| 238 | 310 | /* basic machine hardware */ |
| 239 | 311 | MCFG_CPU_ADD("maincpu", NEC_D553, XTAL_400kHz) |
| 312 | MCFG_UCOM4_READ_A_CB(IOPORT("IN.3")) |
| 313 | MCFG_UCOM4_READ_B_CB(READ8(hh_ucom4_state, ssfball_input_b_r)) |
| 314 | MCFG_UCOM4_WRITE_C_CB(WRITE8(hh_ucom4_state, ssfball_grid_w)) |
| 315 | MCFG_UCOM4_WRITE_D_CB(WRITE8(hh_ucom4_state, ssfball_grid_w)) |
| 316 | MCFG_UCOM4_WRITE_E_CB(WRITE8(hh_ucom4_state, ssfball_plate_w)) |
| 317 | MCFG_UCOM4_WRITE_F_CB(WRITE8(hh_ucom4_state, ssfball_plate_w)) |
| 318 | MCFG_UCOM4_WRITE_G_CB(WRITE8(hh_ucom4_state, ssfball_plate_w)) |
| 319 | MCFG_UCOM4_WRITE_H_CB(WRITE8(hh_ucom4_state, ssfball_plate_w)) |
| 320 | MCFG_UCOM4_WRITE_I_CB(WRITE8(hh_ucom4_state, ssfball_plate_w)) |
| 240 | 321 | |
| 241 | | // MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", hh_ucom4_state, display_decay_tick, attotime::from_msec(1)) |
| 322 | MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", hh_ucom4_state, display_decay_tick, attotime::from_msec(1)) |
| 242 | 323 | MCFG_DEFAULT_LAYOUT(layout_hh_ucom4_test) |
| 243 | 324 | |
| 244 | 325 | /* no video! */ |
| r244863 | r244864 | |
| 246 | 327 | /* sound hardware */ |
| 247 | 328 | MCFG_SPEAKER_STANDARD_MONO("mono") |
| 248 | 329 | MCFG_SOUND_ADD("speaker", SPEAKER_SOUND, 0) |
| 330 | MCFG_SPEAKER_LEVELS(4, ssfball_speaker_levels) |
| 249 | 331 | MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25) |
| 250 | 332 | MACHINE_CONFIG_END |
| 251 | 333 | |
| r244863 | r244864 | |
| 264 | 346 | |
| 265 | 347 | ***************************************************************************/ |
| 266 | 348 | |
| 349 | void hh_ucom4_state::splasfgt_display() |
| 350 | { |
| 351 | UINT32 plate = BITSWAP24(m_plate,23,22,21,20,19,18,17,13,1,0,8,6,0,10,11,14,15,16,9,5,7,4,2,3); |
| 352 | display_matrix(16, 9, plate, m_grid); |
| 353 | } |
| 354 | |
| 355 | READ8_MEMBER(hh_ucom4_state::splasfgt_input_b_r) |
| 356 | { |
| 357 | // B: multiplexed buttons |
| 358 | return read_inputs(4); |
| 359 | } |
| 360 | |
| 361 | WRITE8_MEMBER(hh_ucom4_state::splasfgt_grid_w) |
| 362 | { |
| 363 | // G,H,I0: vfd matrix grid |
| 364 | int shift = (offset - NEC_UCOM4_PORTG) * 4; |
| 365 | m_grid = (m_grid & ~(0xf << shift)) | (data << shift); |
| 366 | |
| 367 | // G(grid 0-3): input mux |
| 368 | m_inp_mux = m_grid & 0xf; |
| 369 | |
| 370 | // I2: vfd matrix plate 6 |
| 371 | if (offset == NEC_UCOM4_PORTI) |
| 372 | m_plate = (m_plate & 0xffff) | (data << 14 & 0x10000); |
| 373 | |
| 374 | splasfgt_display(); |
| 375 | } |
| 376 | |
| 377 | WRITE8_MEMBER(hh_ucom4_state::splasfgt_plate_w) |
| 378 | { |
| 379 | // C,D,E,F23: vfd matrix plate |
| 380 | int shift = (offset - NEC_UCOM4_PORTC) * 4; |
| 381 | m_plate = (m_plate & ~(0xf << shift)) | (data << shift); |
| 382 | |
| 383 | // F01: speaker out |
| 384 | if (offset == NEC_UCOM4_PORTF) |
| 385 | m_speaker->level_w(data & 3); |
| 386 | |
| 387 | ssfball_display(); |
| 388 | } |
| 389 | |
| 390 | |
| 267 | 391 | static INPUT_PORTS_START( splasfgt ) |
| 392 | PORT_START("IN.0") // G0 port B |
| 393 | PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON1 ) |
| 394 | PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON2 ) |
| 395 | PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON3 ) |
| 396 | PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) |
| 397 | |
| 398 | PORT_START("IN.1") // G1 port B |
| 399 | PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON4 ) |
| 400 | PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON5 ) |
| 401 | PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON6 ) |
| 402 | PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) |
| 403 | |
| 404 | PORT_START("IN.2") // G2 port B |
| 405 | PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON7 ) |
| 406 | PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON8 ) |
| 407 | PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON9 ) |
| 408 | PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) |
| 409 | |
| 410 | PORT_START("IN.3") // G3 port B |
| 411 | PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON10 ) |
| 412 | PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON11 ) |
| 413 | PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON12 ) |
| 414 | PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) |
| 415 | |
| 416 | PORT_START("IN.4") // port A |
| 417 | PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON13 ) |
| 418 | PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON14 ) |
| 419 | PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON15 ) // start |
| 420 | PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_UNUSED ) |
| 268 | 421 | INPUT_PORTS_END |
| 269 | 422 | |
| 270 | 423 | |
| 424 | static const INT16 splasfgt_speaker_levels[] = { 0, 32767, -32768, 0 }; |
| 425 | |
| 271 | 426 | static MACHINE_CONFIG_START( splasfgt, hh_ucom4_state ) |
| 272 | 427 | |
| 273 | 428 | /* basic machine hardware */ |
| 274 | 429 | MCFG_CPU_ADD("maincpu", NEC_D553, XTAL_400kHz) |
| 430 | MCFG_UCOM4_READ_A_CB(IOPORT("IN.4")) |
| 431 | MCFG_UCOM4_READ_B_CB(READ8(hh_ucom4_state, splasfgt_input_b_r)) |
| 432 | MCFG_UCOM4_WRITE_C_CB(WRITE8(hh_ucom4_state, splasfgt_plate_w)) |
| 433 | MCFG_UCOM4_WRITE_D_CB(WRITE8(hh_ucom4_state, splasfgt_plate_w)) |
| 434 | MCFG_UCOM4_WRITE_E_CB(WRITE8(hh_ucom4_state, splasfgt_plate_w)) |
| 435 | MCFG_UCOM4_WRITE_F_CB(WRITE8(hh_ucom4_state, splasfgt_plate_w)) |
| 436 | MCFG_UCOM4_WRITE_G_CB(WRITE8(hh_ucom4_state, splasfgt_grid_w)) |
| 437 | MCFG_UCOM4_WRITE_H_CB(WRITE8(hh_ucom4_state, splasfgt_grid_w)) |
| 438 | MCFG_UCOM4_WRITE_I_CB(WRITE8(hh_ucom4_state, splasfgt_grid_w)) |
| 275 | 439 | |
| 276 | | // MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", hh_ucom4_state, display_decay_tick, attotime::from_msec(1)) |
| 440 | MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", hh_ucom4_state, display_decay_tick, attotime::from_msec(1)) |
| 277 | 441 | MCFG_DEFAULT_LAYOUT(layout_hh_ucom4_test) |
| 278 | 442 | |
| 279 | 443 | /* no video! */ |
| r244863 | r244864 | |
| 281 | 445 | /* sound hardware */ |
| 282 | 446 | MCFG_SPEAKER_STANDARD_MONO("mono") |
| 283 | 447 | MCFG_SOUND_ADD("speaker", SPEAKER_SOUND, 0) |
| 448 | MCFG_SPEAKER_LEVELS(4, splasfgt_speaker_levels) |
| 284 | 449 | MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.25) |
| 285 | 450 | MACHINE_CONFIG_END |
| 286 | 451 | |
| r244863 | r244864 | |
| 315 | 480 | |
| 316 | 481 | WRITE8_MEMBER(hh_ucom4_state::edracula_plate_w) |
| 317 | 482 | { |
| 318 | | // E-H,I01: vfd matrix plate |
| 483 | // I2: speaker out |
| 484 | if (offset == NEC_UCOM4_PORTI) |
| 485 | m_speaker->level_w(data >> 2 & 1); |
| 486 | |
| 487 | // E,F,G,H,I01: vfd matrix plate |
| 319 | 488 | int shift = (offset - NEC_UCOM4_PORTE) * 4; |
| 320 | 489 | m_plate = (m_plate & ~(0xf << shift)) | (data << shift); |
| 321 | 490 | |
| 322 | 491 | display_matrix(18, 8, m_plate, m_grid); |
| 323 | 492 | } |
| 324 | 493 | |
| 325 | | WRITE8_MEMBER(hh_ucom4_state::edracula_port_i_w) |
| 326 | | { |
| 327 | | edracula_plate_w(space, offset, data & 3); |
| 328 | 494 | |
| 329 | | // I2: speaker out |
| 330 | | m_speaker->level_w(data >> 2 & 1); |
| 331 | | } |
| 332 | | |
| 333 | | |
| 334 | 495 | static INPUT_PORTS_START( edracula ) |
| 335 | 496 | PORT_START("IN.0") // port A |
| 336 | 497 | PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_SELECT ) |
| r244863 | r244864 | |
| 358 | 519 | MCFG_UCOM4_WRITE_F_CB(WRITE8(hh_ucom4_state, edracula_plate_w)) |
| 359 | 520 | MCFG_UCOM4_WRITE_G_CB(WRITE8(hh_ucom4_state, edracula_plate_w)) |
| 360 | 521 | MCFG_UCOM4_WRITE_H_CB(WRITE8(hh_ucom4_state, edracula_plate_w)) |
| 361 | | MCFG_UCOM4_WRITE_I_CB(WRITE8(hh_ucom4_state, edracula_port_i_w)) |
| 522 | MCFG_UCOM4_WRITE_I_CB(WRITE8(hh_ucom4_state, edracula_plate_w)) |
| 362 | 523 | |
| 363 | 524 | MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", hh_ucom4_state, display_decay_tick, attotime::from_msec(1)) |
| 364 | 525 | MCFG_DEFAULT_LAYOUT(layout_hh_ucom4_test) |
| r244863 | r244864 | |
| 395 | 556 | |
| 396 | 557 | READ8_MEMBER(hh_ucom4_state::tmtennis_input_r) |
| 397 | 558 | { |
| 398 | | // A,B: buttons |
| 559 | // A,B: multiplexed buttons |
| 399 | 560 | return ~read_inputs(2) >> (offset*4); |
| 400 | 561 | } |
| 401 | 562 | |
| 402 | 563 | WRITE8_MEMBER(hh_ucom4_state::tmtennis_grid_w) |
| 403 | 564 | { |
| 404 | | // G-I: vfd matrix grid |
| 565 | // G,H,I: vfd matrix grid |
| 405 | 566 | int shift = (offset - NEC_UCOM4_PORTG) * 4; |
| 406 | 567 | m_grid = (m_grid & ~(0xf << shift)) | (data << shift); |
| 407 | 568 | |
| r244863 | r244864 | |
| 410 | 571 | |
| 411 | 572 | WRITE8_MEMBER(hh_ucom4_state::tmtennis_plate_w) |
| 412 | 573 | { |
| 413 | | // C-F: vfd matrix plate |
| 574 | // C,D,F: vfd matrix plate |
| 414 | 575 | if (offset == NEC_UCOM4_PORTF) offset--; |
| 415 | 576 | int shift = (offset - NEC_UCOM4_PORTC) * 4; |
| 416 | 577 | m_plate = (m_plate & ~(0xf << shift)) | (data << shift); |
| r244863 | r244864 | |
| 420 | 581 | |
| 421 | 582 | WRITE8_MEMBER(hh_ucom4_state::tmtennis_port_e_w) |
| 422 | 583 | { |
| 423 | | // E0,E1: input mux |
| 584 | // E01: input mux |
| 424 | 585 | // E2: speaker out |
| 425 | 586 | // E3: N/C |
| 426 | 587 | m_inp_mux = data & 3; |
| r244863 | r244864 | |
| 553 | 714 | |
| 554 | 715 | WRITE8_MEMBER(hh_ucom4_state::tmpacman_plate_w) |
| 555 | 716 | { |
| 556 | | // E023,F-I: vfd matrix plate |
| 717 | // E1: speaker out |
| 718 | if (offset == NEC_UCOM4_PORTE) |
| 719 | m_speaker->level_w(data >> 1 & 1); |
| 720 | |
| 721 | // E023,F,G,H,I: vfd matrix plate |
| 557 | 722 | int shift = (offset - NEC_UCOM4_PORTE) * 4; |
| 558 | 723 | m_plate = (m_plate & ~(0xf << shift)) | (data << shift); |
| 559 | 724 | |
| 560 | 725 | tmpacman_display(); |
| 561 | 726 | } |
| 562 | 727 | |
| 563 | | WRITE8_MEMBER(hh_ucom4_state::tmpacman_port_e_w) |
| 564 | | { |
| 565 | | // E1: speaker out |
| 566 | | m_speaker->level_w(data >> 1 & 1); |
| 567 | 728 | |
| 568 | | tmpacman_plate_w(space, offset, data); |
| 569 | | } |
| 570 | | |
| 571 | | |
| 572 | 729 | static INPUT_PORTS_START( tmpacman ) |
| 573 | 730 | PORT_START("IN.0") // port A |
| 574 | 731 | PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_JOYSTICK_LEFT ) PORT_16WAY // 4 separate directional buttons, hence 16way |
| r244863 | r244864 | |
| 592 | 749 | MCFG_UCOM4_READ_B_CB(IOPORT("IN.1")) |
| 593 | 750 | MCFG_UCOM4_WRITE_C_CB(WRITE8(hh_ucom4_state, tmpacman_grid_w)) |
| 594 | 751 | MCFG_UCOM4_WRITE_D_CB(WRITE8(hh_ucom4_state, tmpacman_grid_w)) |
| 595 | | MCFG_UCOM4_WRITE_E_CB(WRITE8(hh_ucom4_state, tmpacman_port_e_w)) |
| 752 | MCFG_UCOM4_WRITE_E_CB(WRITE8(hh_ucom4_state, tmpacman_plate_w)) |
| 596 | 753 | MCFG_UCOM4_WRITE_F_CB(WRITE8(hh_ucom4_state, tmpacman_plate_w)) |
| 597 | 754 | MCFG_UCOM4_WRITE_G_CB(WRITE8(hh_ucom4_state, tmpacman_plate_w)) |
| 598 | 755 | MCFG_UCOM4_WRITE_H_CB(WRITE8(hh_ucom4_state, tmpacman_plate_w)) |
| r244863 | r244864 | |
| 637 | 794 | return read_inputs(2); |
| 638 | 795 | } |
| 639 | 796 | |
| 640 | | WRITE8_MEMBER(hh_ucom4_state::alnchase_display_w) |
| 797 | WRITE8_MEMBER(hh_ucom4_state::alnchase_output_w) |
| 641 | 798 | { |
| 642 | 799 | if (offset <= NEC_UCOM4_PORTE) |
| 643 | 800 | { |
| r244863 | r244864 | |
| 648 | 805 | // C0(grid 0): input enable PL1 |
| 649 | 806 | // D0(grid 4): input enable PL2 |
| 650 | 807 | m_inp_mux = (m_grid & 1) | (m_grid >> 3 & 2); |
| 808 | |
| 809 | // E1: speaker out |
| 810 | if (offset == NEC_UCOM4_PORTE) |
| 811 | m_speaker->level_w(data >> 1 & 1); |
| 651 | 812 | } |
| 652 | 813 | |
| 653 | 814 | if (offset >= NEC_UCOM4_PORTE) |
| 654 | 815 | { |
| 655 | | // E23,F-I: vfd matrix plate |
| 816 | // E23,F,G,H,I: vfd matrix plate |
| 656 | 817 | int shift = (offset - NEC_UCOM4_PORTE) * 4; |
| 657 | 818 | m_plate = ((m_plate << 2 & ~(0xf << shift)) | (data << shift)) >> 2; |
| 658 | 819 | } |
| r244863 | r244864 | |
| 660 | 821 | display_matrix(17, 9, m_plate, m_grid); |
| 661 | 822 | } |
| 662 | 823 | |
| 663 | | WRITE8_MEMBER(hh_ucom4_state::alnchase_port_e_w) |
| 664 | | { |
| 665 | | // E1: speaker out |
| 666 | | m_speaker->level_w(data >> 1 & 1); |
| 667 | 824 | |
| 668 | | alnchase_display_w(space, offset, data); |
| 669 | | } |
| 670 | | |
| 671 | | |
| 672 | 825 | /* physical button layout and labels is like this: |
| 673 | 826 | |
| 674 | 827 | POWER SOUND LEVEL PLAYER |
| r244863 | r244864 | |
| 713 | 866 | MCFG_CPU_ADD("maincpu", NEC_D553, XTAL_400kHz) |
| 714 | 867 | MCFG_UCOM4_READ_A_CB(READ8(hh_ucom4_state, alnchase_input_r)) |
| 715 | 868 | MCFG_UCOM4_READ_B_CB(IOPORT("IN.2")) |
| 716 | | MCFG_UCOM4_WRITE_C_CB(WRITE8(hh_ucom4_state, alnchase_display_w)) |
| 717 | | MCFG_UCOM4_WRITE_D_CB(WRITE8(hh_ucom4_state, alnchase_display_w)) |
| 718 | | MCFG_UCOM4_WRITE_E_CB(WRITE8(hh_ucom4_state, alnchase_port_e_w)) |
| 719 | | MCFG_UCOM4_WRITE_F_CB(WRITE8(hh_ucom4_state, alnchase_display_w)) |
| 720 | | MCFG_UCOM4_WRITE_G_CB(WRITE8(hh_ucom4_state, alnchase_display_w)) |
| 721 | | MCFG_UCOM4_WRITE_H_CB(WRITE8(hh_ucom4_state, alnchase_display_w)) |
| 722 | | MCFG_UCOM4_WRITE_I_CB(WRITE8(hh_ucom4_state, alnchase_display_w)) |
| 869 | MCFG_UCOM4_WRITE_C_CB(WRITE8(hh_ucom4_state, alnchase_output_w)) |
| 870 | MCFG_UCOM4_WRITE_D_CB(WRITE8(hh_ucom4_state, alnchase_output_w)) |
| 871 | MCFG_UCOM4_WRITE_E_CB(WRITE8(hh_ucom4_state, alnchase_output_w)) |
| 872 | MCFG_UCOM4_WRITE_F_CB(WRITE8(hh_ucom4_state, alnchase_output_w)) |
| 873 | MCFG_UCOM4_WRITE_G_CB(WRITE8(hh_ucom4_state, alnchase_output_w)) |
| 874 | MCFG_UCOM4_WRITE_H_CB(WRITE8(hh_ucom4_state, alnchase_output_w)) |
| 875 | MCFG_UCOM4_WRITE_I_CB(WRITE8(hh_ucom4_state, alnchase_output_w)) |
| 723 | 876 | |
| 724 | 877 | MCFG_TIMER_DRIVER_ADD_PERIODIC("display_decay", hh_ucom4_state, display_decay_tick, attotime::from_msec(1)) |
| 725 | 878 | MCFG_DEFAULT_LAYOUT(layout_hh_ucom4_test) |