trunk/src/mess/drivers/ng_aes.c
| r19372 | r19373 | |
| 42 | 42 | |
| 43 | 43 | extern const char layout_neogeo[]; |
| 44 | 44 | |
| 45 | | static const char *audio_banks[4] = |
| 46 | | { |
| 47 | | NEOGEO_BANK_AUDIO_CPU_CART_BANK0, NEOGEO_BANK_AUDIO_CPU_CART_BANK1, NEOGEO_BANK_AUDIO_CPU_CART_BANK2, NEOGEO_BANK_AUDIO_CPU_CART_BANK3 |
| 48 | | }; |
| 49 | 45 | |
| 50 | 46 | |
| 51 | 47 | |
| 52 | | |
| 53 | 48 | static IRQ_CALLBACK(neocd_int_callback); |
| 54 | 49 | |
| 55 | 50 | /* Stubs for various functions called by the FBA code, replace with MAME specifics later */ |
| r19372 | r19373 | |
| 111 | 106 | DECLARE_WRITE16_MEMBER(memcard_w); |
| 112 | 107 | DECLARE_READ16_MEMBER(neocd_memcard_r); |
| 113 | 108 | DECLARE_WRITE16_MEMBER(neocd_memcard_w); |
| 114 | | DECLARE_WRITE16_MEMBER(audio_command_w); |
| 115 | | DECLARE_READ8_MEMBER(audio_command_r); |
| 116 | | DECLARE_WRITE8_MEMBER(audio_result_w); |
| 117 | 109 | DECLARE_WRITE16_MEMBER(main_cpu_bank_select_w); |
| 118 | | DECLARE_READ8_MEMBER(audio_cpu_bank_select_f000_f7ff_r); |
| 119 | | DECLARE_READ8_MEMBER(audio_cpu_bank_select_e000_efff_r); |
| 120 | | DECLARE_READ8_MEMBER(audio_cpu_bank_select_c000_dfff_r); |
| 121 | | DECLARE_READ8_MEMBER(audio_cpu_bank_select_8000_bfff_r); |
| 122 | | DECLARE_WRITE16_MEMBER(system_control_w); |
| 123 | 110 | DECLARE_READ16_MEMBER(neocd_control_r); |
| 124 | 111 | DECLARE_WRITE16_MEMBER(neocd_control_w); |
| 125 | 112 | DECLARE_READ16_MEMBER(neocd_transfer_r); |
| r19372 | r19373 | |
| 131 | 118 | DECLARE_MACHINE_START(neocd); |
| 132 | 119 | DECLARE_MACHINE_START(neogeo); |
| 133 | 120 | DECLARE_MACHINE_RESET(neogeo); |
| 121 | DECLARE_MACHINE_RESET(neocd); |
| 134 | 122 | |
| 135 | 123 | DECLARE_CUSTOM_INPUT_MEMBER(get_memcard_status); |
| 136 | 124 | |
| r19372 | r19373 | |
| 207 | 195 | } |
| 208 | 196 | |
| 209 | 197 | |
| 210 | | static void audio_cpu_assert_nmi(running_machine &machine) |
| 211 | | { |
| 212 | | neogeo_state *state = machine.driver_data<neogeo_state>(); |
| 213 | | state->m_audiocpu->set_input_line(INPUT_LINE_NMI, ASSERT_LINE); |
| 214 | | } |
| 215 | 198 | |
| 216 | 199 | |
| 217 | 200 | WRITE8_MEMBER(ng_aes_state::audio_cpu_clear_nmi_w) |
| r19372 | r19373 | |
| 336 | 319 | } |
| 337 | 320 | } |
| 338 | 321 | |
| 339 | | |
| 340 | | |
| 341 | 322 | /************************************* |
| 342 | 323 | * |
| 343 | | * Inter-CPU communications |
| 344 | | * |
| 345 | | *************************************/ |
| 346 | | |
| 347 | | WRITE16_MEMBER(ng_aes_state::audio_command_w) |
| 348 | | { |
| 349 | | /* accessing the LSB only is not mapped */ |
| 350 | | if (mem_mask != 0x00ff) |
| 351 | | { |
| 352 | | soundlatch_byte_w(space, 0, data >> 8); |
| 353 | | |
| 354 | | audio_cpu_assert_nmi(machine()); |
| 355 | | |
| 356 | | /* boost the interleave to let the audio CPU read the command */ |
| 357 | | machine().scheduler().boost_interleave(attotime::zero, attotime::from_usec(50)); |
| 358 | | |
| 359 | | if (LOG_CPU_COMM) logerror("MAIN CPU PC %06x: audio_command_w %04x - %04x\n", space.device().safe_pc(), data, mem_mask); |
| 360 | | } |
| 361 | | } |
| 362 | | |
| 363 | | |
| 364 | | READ8_MEMBER(ng_aes_state::audio_command_r) |
| 365 | | { |
| 366 | | UINT8 ret = soundlatch_byte_r(space, 0); |
| 367 | | |
| 368 | | if (LOG_CPU_COMM) logerror(" AUD CPU PC %04x: audio_command_r %02x\n", space.device().safe_pc(), ret); |
| 369 | | |
| 370 | | /* this is a guess */ |
| 371 | | audio_cpu_clear_nmi_w(space, 0, 0); |
| 372 | | |
| 373 | | return ret; |
| 374 | | } |
| 375 | | |
| 376 | | |
| 377 | | WRITE8_MEMBER(ng_aes_state::audio_result_w) |
| 378 | | { |
| 379 | | |
| 380 | | if (LOG_CPU_COMM && (m_audio_result != data)) logerror(" AUD CPU PC %04x: audio_result_w %02x\n", space.device().safe_pc(), data); |
| 381 | | |
| 382 | | m_audio_result = data; |
| 383 | | } |
| 384 | | |
| 385 | | |
| 386 | | static CUSTOM_INPUT( get_audio_result ) |
| 387 | | { |
| 388 | | neogeo_state *state = field.machine().driver_data<neogeo_state>(); |
| 389 | | UINT32 ret = state->m_audio_result; |
| 390 | | |
| 391 | | // if (LOG_CPU_COMM) logerror("MAIN CPU PC %06x: audio_result_r %02x\n", field.machine(->safe_pc().device("maincpu")), ret); |
| 392 | | |
| 393 | | return ret; |
| 394 | | } |
| 395 | | |
| 396 | | |
| 397 | | |
| 398 | | /************************************* |
| 399 | | * |
| 400 | 324 | * Main CPU banking |
| 401 | 325 | * |
| 402 | 326 | *************************************/ |
| 403 | 327 | |
| 404 | | static void _set_main_cpu_vector_table_source( running_machine &machine ) |
| 405 | | { |
| 406 | | neogeo_state *state = machine.driver_data<neogeo_state>(); |
| 407 | | state->membank(NEOGEO_BANK_VECTORS)->set_entry(state->m_main_cpu_vector_table_source); |
| 408 | | } |
| 409 | | |
| 410 | | |
| 411 | | static void set_main_cpu_vector_table_source( running_machine &machine, UINT8 data ) |
| 412 | | { |
| 413 | | neogeo_state *state = machine.driver_data<neogeo_state>(); |
| 414 | | state->m_main_cpu_vector_table_source = data; |
| 415 | | |
| 416 | | _set_main_cpu_vector_table_source(machine); |
| 417 | | } |
| 418 | | |
| 419 | | |
| 420 | | static void _set_main_cpu_bank_address( running_machine &machine ) |
| 421 | | { |
| 422 | | neogeo_state *state = machine.driver_data<neogeo_state>(); |
| 423 | | state->membank(NEOGEO_BANK_CARTRIDGE)->set_base(&state->memregion("maincpu")->base()[state->m_main_cpu_bank_address]); |
| 424 | | } |
| 425 | | |
| 426 | | |
| 427 | | |
| 428 | 328 | WRITE16_MEMBER(ng_aes_state::main_cpu_bank_select_w) |
| 429 | 329 | { |
| 430 | 330 | UINT32 bank_address; |
| r19372 | r19373 | |
| 465 | 365 | |
| 466 | 366 | |
| 467 | 367 | |
| 468 | | /************************************* |
| 469 | | * |
| 470 | | * Audio CPU banking |
| 471 | | * |
| 472 | | *************************************/ |
| 473 | 368 | |
| 474 | | static void set_audio_cpu_banking( running_machine &machine ) |
| 475 | | { |
| 476 | | neogeo_state *state = machine.driver_data<neogeo_state>(); |
| 477 | | int region; |
| 478 | 369 | |
| 479 | | for (region = 0; region < 4; region++) |
| 480 | | state->membank(audio_banks[region])->set_entry(state->m_audio_cpu_banks[region]); |
| 481 | | } |
| 482 | 370 | |
| 483 | | |
| 484 | | static void audio_cpu_bank_select( address_space &space, int region, UINT8 bank ) |
| 485 | | { |
| 486 | | neogeo_state *state = space.machine().driver_data<neogeo_state>(); |
| 487 | | |
| 488 | | if (LOG_AUDIO_CPU_BANKING) logerror("Audio CPU PC %03x: audio_cpu_bank_select: Region: %d Bank: %02x\n", space.device().safe_pc(), region, bank); |
| 489 | | |
| 490 | | state->m_audio_cpu_banks[region] = bank; |
| 491 | | |
| 492 | | set_audio_cpu_banking(space.machine()); |
| 493 | | } |
| 494 | | |
| 495 | | |
| 496 | | READ8_MEMBER(ng_aes_state::audio_cpu_bank_select_f000_f7ff_r) |
| 497 | | { |
| 498 | | audio_cpu_bank_select(space, 0, offset >> 8); |
| 499 | | |
| 500 | | return 0; |
| 501 | | } |
| 502 | | |
| 503 | | |
| 504 | | READ8_MEMBER(ng_aes_state::audio_cpu_bank_select_e000_efff_r) |
| 505 | | { |
| 506 | | audio_cpu_bank_select(space, 1, offset >> 8); |
| 507 | | |
| 508 | | return 0; |
| 509 | | } |
| 510 | | |
| 511 | | |
| 512 | | READ8_MEMBER(ng_aes_state::audio_cpu_bank_select_c000_dfff_r) |
| 513 | | { |
| 514 | | audio_cpu_bank_select(space, 2, offset >> 8); |
| 515 | | |
| 516 | | return 0; |
| 517 | | } |
| 518 | | |
| 519 | | |
| 520 | | READ8_MEMBER(ng_aes_state::audio_cpu_bank_select_8000_bfff_r) |
| 521 | | { |
| 522 | | audio_cpu_bank_select(space, 3, offset >> 8); |
| 523 | | |
| 524 | | return 0; |
| 525 | | } |
| 526 | | |
| 527 | | |
| 528 | | static void _set_audio_cpu_rom_source( address_space &space ) |
| 529 | | { |
| 530 | | neogeo_state *state = space.machine().driver_data<neogeo_state>(); |
| 531 | | |
| 532 | | /* if (!state->memregion("audiobios")->base()) */ |
| 533 | | state->m_audio_cpu_rom_source = 1; |
| 534 | | |
| 535 | | state->membank(NEOGEO_BANK_AUDIO_CPU_MAIN_BANK)->set_entry(state->m_audio_cpu_rom_source); |
| 536 | | |
| 537 | | /* reset CPU if the source changed -- this is a guess */ |
| 538 | | if (state->m_audio_cpu_rom_source != state->m_audio_cpu_rom_source_last) |
| 539 | | { |
| 540 | | state->m_audio_cpu_rom_source_last = state->m_audio_cpu_rom_source; |
| 541 | | |
| 542 | | space.machine().device("audiocpu")->execute().set_input_line(INPUT_LINE_RESET, PULSE_LINE); |
| 543 | | |
| 544 | | if (LOG_AUDIO_CPU_BANKING) logerror("Audio CPU PC %03x: selectign %s ROM\n", space.device().safe_pc(), state->m_audio_cpu_rom_source ? "CARTRIDGE" : "BIOS"); |
| 545 | | } |
| 546 | | } |
| 547 | | |
| 548 | | |
| 549 | | static void set_audio_cpu_rom_source( address_space &space, UINT8 data ) |
| 550 | | { |
| 551 | | neogeo_state *state = space.machine().driver_data<neogeo_state>(); |
| 552 | | state->m_audio_cpu_rom_source = data; |
| 553 | | |
| 554 | | _set_audio_cpu_rom_source(space); |
| 555 | | } |
| 556 | | |
| 557 | | |
| 558 | | static void audio_cpu_banking_init( running_machine &machine ) |
| 559 | | { |
| 560 | | neogeo_state *state = machine.driver_data<neogeo_state>(); |
| 561 | | int region; |
| 562 | | int bank; |
| 563 | | UINT8 *rgn; |
| 564 | | UINT32 address_mask; |
| 565 | | |
| 566 | | /* audio bios/cartridge selection */ |
| 567 | | if (machine.root_device().memregion("audiobios")->base()) |
| 568 | | state->membank(NEOGEO_BANK_AUDIO_CPU_MAIN_BANK)->configure_entry(0, machine.root_device().memregion("audiobios")->base()); |
| 569 | | state->membank(NEOGEO_BANK_AUDIO_CPU_MAIN_BANK)->configure_entry(1, machine.root_device().memregion("audiocpu")->base()); |
| 570 | | |
| 571 | | /* audio banking */ |
| 572 | | address_mask = machine.root_device().memregion("audiocpu")->bytes() - 0x10000 - 1; |
| 573 | | |
| 574 | | rgn = state->memregion("audiocpu")->base(); |
| 575 | | for (region = 0; region < 4; region++) |
| 576 | | { |
| 577 | | for (bank = 0; bank < 0x100; bank++) |
| 578 | | { |
| 579 | | UINT32 bank_address = 0x10000 + (((bank << (11 + region)) & 0x3ffff) & address_mask); |
| 580 | | state->membank(audio_banks[region])->configure_entry(bank, &rgn[bank_address]); |
| 581 | | } |
| 582 | | } |
| 583 | | |
| 584 | | /* set initial audio banks -- |
| 585 | | how does this really work, or is it even necessary? */ |
| 586 | | state->m_audio_cpu_banks[0] = 0x1e; |
| 587 | | state->m_audio_cpu_banks[1] = 0x0e; |
| 588 | | state->m_audio_cpu_banks[2] = 0x06; |
| 589 | | state->m_audio_cpu_banks[3] = 0x02; |
| 590 | | |
| 591 | | set_audio_cpu_banking(machine); |
| 592 | | |
| 593 | | state->m_audio_cpu_rom_source_last = 0; |
| 594 | | set_audio_cpu_rom_source(machine.device("maincpu")->memory().space(AS_PROGRAM), 0); |
| 595 | | } |
| 596 | | |
| 597 | | |
| 598 | | |
| 599 | 371 | /************************************* |
| 600 | 372 | * |
| 601 | 373 | * System control register |
| 602 | 374 | * |
| 603 | 375 | *************************************/ |
| 604 | 376 | |
| 605 | | WRITE16_MEMBER(ng_aes_state::system_control_w) |
| 606 | | { |
| 607 | | if (ACCESSING_BITS_0_7) |
| 608 | | { |
| 609 | | UINT8 bit = (offset >> 3) & 0x01; |
| 610 | 377 | |
| 611 | | switch (offset & 0x07) |
| 612 | | { |
| 613 | | default: |
| 614 | | case 0x00: neogeo_set_screen_dark(machine(), bit); break; |
| 615 | | case 0x01: set_main_cpu_vector_table_source(machine(), bit); |
| 616 | | set_audio_cpu_rom_source(space, bit); /* this is a guess */ |
| 617 | | break; |
| 618 | | case 0x05: neogeo_set_fixed_layer_source(machine(), bit); break; |
| 619 | | // case 0x06: set_save_ram_unlock(machine(), bit); break; |
| 620 | | case 0x07: neogeo_set_palette_bank(machine(), bit); break; |
| 621 | 378 | |
| 622 | | case 0x02: /* unknown - HC32 middle pin 1 */ |
| 623 | | case 0x03: /* unknown - uPD4990 pin ? */ |
| 624 | | case 0x04: /* unknown - HC32 middle pin 10 */ |
| 625 | | logerror("PC: %x Unmapped system control write. Offset: %x Data: %x\n", space.device().safe_pc(), offset & 0x07, bit); |
| 626 | | break; |
| 627 | | } |
| 628 | | |
| 629 | | if (LOG_VIDEO_SYSTEM && ((offset & 0x07) != 0x06)) logerror("PC: %x System control write. Offset: %x Data: %x\n", space.device().safe_pc(), offset & 0x07, bit); |
| 630 | | } |
| 631 | | } |
| 632 | | |
| 633 | | |
| 634 | 379 | UINT8 ng_aes_state::neogeoReadTransfer(UINT32 sekAddress, int is_byte_transfer) |
| 635 | 380 | { |
| 636 | 381 | // if ((sekAddress & 0x0FFFFF) < 16) |
| r19372 | r19373 | |
| 810 | 555 | case 0x0126: |
| 811 | 556 | // bprintf(PRINT_NORMAL, _T(" - NGCD Z80 BUSREQ -> 1 (PC: 0x%06X)\n"), SekGetPC(-1)); |
| 812 | 557 | curr_space->machine().scheduler().synchronize(); |
| 813 | | curr_space->machine().device("audiocpu")->execute().set_input_line(INPUT_LINE_HALT, ASSERT_LINE); |
| 814 | | |
| 558 | m_audiocpu->set_input_line(INPUT_LINE_HALT, ASSERT_LINE); |
| 815 | 559 | break; |
| 816 | 560 | case 0x0128: |
| 817 | 561 | // bprintf(PRINT_NORMAL, _T(" - NGCD FIX BUSREQ -> 1 (PC: 0x%06X)\n"), SekGetPC(-1)); |
| r19372 | r19373 | |
| 827 | 571 | case 0x0146: |
| 828 | 572 | // bprintf(PRINT_NORMAL, _T(" - NGCD Z80 BUSREQ -> 0 (PC: 0x%06X)\n"), SekGetPC(-1)); |
| 829 | 573 | curr_space->machine().scheduler().synchronize(); |
| 830 | | curr_space->machine().device("audiocpu")->execute().set_input_line(INPUT_LINE_HALT, CLEAR_LINE); |
| 574 | m_audiocpu->set_input_line(INPUT_LINE_HALT, CLEAR_LINE); |
| 831 | 575 | break; |
| 832 | 576 | case 0x0148: |
| 833 | 577 | // bprintf(PRINT_NORMAL, _T(" - NGCD FIX BUSREQ -> 0 (PC: 0x%06X)\n"), SekGetPC(-1)); |
| r19372 | r19373 | |
| 867 | 611 | break; |
| 868 | 612 | } |
| 869 | 613 | case 0x0182: { |
| 870 | | static UINT8 clara = 0; |
| 871 | | if (!byteValue && clara) { |
| 872 | | // bprintf(PRINT_IMPORTANT, _T(" - NGCD Z80 reset (PC: 0x%06X)\n"), SekGetPC(-1)); |
| 873 | | //ZetReset(); |
| 874 | | } |
| 875 | | clara = byteValue; |
| 614 | // printf("blah %02x\n", byteValue); |
| 615 | if (byteValue == 0x00) m_audiocpu->set_input_line(INPUT_LINE_RESET, ASSERT_LINE); |
| 616 | else m_audiocpu->set_input_line(INPUT_LINE_RESET, CLEAR_LINE); |
| 617 | |
| 876 | 618 | break; |
| 877 | 619 | } |
| 878 | 620 | case 0x01A0: |
| r19372 | r19373 | |
| 1409 | 1151 | * |
| 1410 | 1152 | *************************************/ |
| 1411 | 1153 | |
| 1412 | | static void aes_postload(neogeo_state *state) |
| 1413 | | { |
| 1414 | | _set_main_cpu_bank_address(state->machine()); |
| 1415 | | _set_main_cpu_vector_table_source(state->machine()); |
| 1416 | | set_audio_cpu_banking(state->machine()); |
| 1417 | | _set_audio_cpu_rom_source(state->machine().device("maincpu")->memory().space(AS_PROGRAM)); |
| 1418 | | } |
| 1419 | 1154 | |
| 1420 | | |
| 1421 | | |
| 1422 | 1155 | static void common_machine_start(running_machine &machine) |
| 1423 | 1156 | { |
| 1424 | 1157 | neogeo_state *state = machine.driver_data<neogeo_state>(); |
| r19372 | r19373 | |
| 1430 | 1163 | main_cpu_banking_init(machine); |
| 1431 | 1164 | |
| 1432 | 1165 | /* set the initial audio CPU ROM banks */ |
| 1433 | | audio_cpu_banking_init(machine); |
| 1166 | neogeo_audio_cpu_banking_init(machine); |
| 1434 | 1167 | |
| 1435 | 1168 | state->create_interrupt_timers(machine); |
| 1436 | 1169 | |
| r19372 | r19373 | |
| 1467 | 1200 | state->save_item(NAME(state->m_led2_value)); |
| 1468 | 1201 | state->save_item(NAME(state->m_recurse)); |
| 1469 | 1202 | |
| 1470 | | machine.save().register_postload(save_prepost_delegate(FUNC(aes_postload), state)); |
| 1203 | machine.save().register_postload(save_prepost_delegate(FUNC(neogeo_postload), &machine)); |
| 1471 | 1204 | } |
| 1472 | 1205 | |
| 1473 | 1206 | MACHINE_START_MEMBER(ng_aes_state,neogeo) |
| 1474 | 1207 | { |
| 1475 | 1208 | common_machine_start(machine()); |
| 1209 | m_is_mvs = false; |
| 1476 | 1210 | |
| 1477 | 1211 | /* initialize the memcard data structure */ |
| 1478 | 1212 | m_memcard_data = auto_alloc_array_clear(machine(), UINT8, MEMCARD_SIZE); |
| r19372 | r19373 | |
| 1483 | 1217 | { |
| 1484 | 1218 | UINT8* ROM = machine().root_device().memregion("mainbios")->base(); |
| 1485 | 1219 | UINT8* RAM = machine().root_device().memregion("maincpu")->base(); |
| 1486 | | UINT8* Z80bios = machine().root_device().memregion("audiobios")->base(); |
| 1487 | | int x; |
| 1220 | // UINT8* Z80bios = machine().root_device().memregion("audiobios")->base(); |
| 1221 | // int x; |
| 1222 | m_has_audio_banking = false; |
| 1488 | 1223 | |
| 1489 | 1224 | common_machine_start(machine()); |
| 1225 | m_is_mvs = false; |
| 1490 | 1226 | |
| 1491 | 1227 | /* irq levels for NEOCD (swapped compared to MVS / AES) */ |
| 1492 | 1228 | m_vblank_level = 2; |
| r19372 | r19373 | |
| 1501 | 1237 | // copy initial 68k vectors into RAM |
| 1502 | 1238 | memcpy(RAM,ROM,0x80); |
| 1503 | 1239 | |
| 1504 | | // copy Z80 code into Z80 space (from 0x20000) |
| 1505 | | for(x=0;x<0x10000;x+=2) |
| 1506 | | { |
| 1507 | | Z80bios[x] = ROM[x+0x20001]; |
| 1508 | | Z80bios[x+1] = ROM[x+0x20000]; |
| 1509 | | } |
| 1510 | 1240 | |
| 1511 | 1241 | |
| 1242 | |
| 1512 | 1243 | // for custom vectors |
| 1513 | 1244 | machine().device("maincpu")->execute().set_irq_acknowledge_callback(neocd_int_callback); |
| 1514 | 1245 | |
| r19372 | r19373 | |
| 1516 | 1247 | |
| 1517 | 1248 | } |
| 1518 | 1249 | |
| 1250 | |
| 1519 | 1251 | //static DEVICE_IMAGE_LOAD(aes_cart) |
| 1520 | 1252 | //{ |
| 1521 | 1253 | // else |
| r19372 | r19373 | |
| 1558 | 1290 | NeoZ80ROMActive = memregion("audiocpu")->base(); |
| 1559 | 1291 | NeoTextRAM = memregion("fixed")->base(); |
| 1560 | 1292 | curr_space = &machine().device("maincpu")->memory().space(AS_PROGRAM); |
| 1293 | } |
| 1561 | 1294 | |
| 1295 | MACHINE_RESET_MEMBER(ng_aes_state,neocd) |
| 1296 | { |
| 1297 | MACHINE_RESET_CALL_MEMBER( neogeo ); |
| 1562 | 1298 | |
| 1563 | 1299 | m_tempcdc->NeoCDCommsReset(); |
| 1564 | 1300 | |
| 1565 | | nTransferWriteEnable = 0; |
| 1301 | m_audiocpu->set_input_line(INPUT_LINE_HALT, ASSERT_LINE); |
| 1302 | m_audiocpu->set_input_line(INPUT_LINE_RESET, ASSERT_LINE); |
| 1566 | 1303 | |
| 1304 | nTransferWriteEnable = 0; |
| 1567 | 1305 | } |
| 1568 | 1306 | |
| 1569 | 1307 | |
| 1570 | | |
| 1571 | 1308 | /************************************* |
| 1572 | 1309 | * |
| 1573 | 1310 | * Main CPU memory handlers |
| r19372 | r19373 | |
| 1669 | 1406 | |
| 1670 | 1407 | |
| 1671 | 1408 | |
| 1672 | | // does the Z80 actually see all of this as RAM on the NeoCD, or is it only actually writable via the transfer areas? |
| 1409 | |
| 1673 | 1410 | static ADDRESS_MAP_START( neocd_audio_map, AS_PROGRAM, 8, ng_aes_state ) |
| 1674 | | AM_RANGE(0x0000, 0x7fff) AM_RAMBANK(NEOGEO_BANK_AUDIO_CPU_MAIN_BANK) |
| 1675 | | AM_RANGE(0x8000, 0xbfff) AM_RAMBANK(NEOGEO_BANK_AUDIO_CPU_CART_BANK3) |
| 1676 | | AM_RANGE(0xc000, 0xdfff) AM_RAMBANK(NEOGEO_BANK_AUDIO_CPU_CART_BANK2) |
| 1677 | | AM_RANGE(0xe000, 0xefff) AM_RAMBANK(NEOGEO_BANK_AUDIO_CPU_CART_BANK1) |
| 1678 | | AM_RANGE(0xf000, 0xf7ff) AM_RAMBANK(NEOGEO_BANK_AUDIO_CPU_CART_BANK0) |
| 1679 | | AM_RANGE(0xf800, 0xffff) AM_RAM |
| 1411 | AM_RANGE(0x0000, 0xffff) AM_RAM AM_REGION("audiocpu", 0x00000) |
| 1680 | 1412 | ADDRESS_MAP_END |
| 1681 | 1413 | |
| 1682 | 1414 | |
| r19372 | r19373 | |
| 1685 | 1417 | AM_RANGE(0x00, 0x00) AM_MIRROR(0xff00) AM_READ(audio_command_r) |
| 1686 | 1418 | AM_RANGE(0x04, 0x07) AM_MIRROR(0xff00) AM_DEVREADWRITE_LEGACY("ymsnd", ym2610_r, ym2610_w) |
| 1687 | 1419 | AM_RANGE(0x08, 0x08) AM_MIRROR(0xff00) /* write - NMI enable / acknowledge? (the data written doesn't matter) */ |
| 1688 | | // AM_RANGE(0x08, 0x08) AM_MIRROR(0xfff0) AM_MASK(0xfff0) AM_READ(audio_cpu_bank_select_f000_f7ff_r) |
| 1689 | | // AM_RANGE(0x09, 0x09) AM_MIRROR(0xfff0) AM_MASK(0xfff0) AM_READ(audio_cpu_bank_select_e000_efff_r) |
| 1690 | | // AM_RANGE(0x0a, 0x0a) AM_MIRROR(0xfff0) AM_MASK(0xfff0) AM_READ(audio_cpu_bank_select_c000_dfff_r) |
| 1691 | | // AM_RANGE(0x0b, 0x0b) AM_MIRROR(0xfff0) AM_MASK(0xfff0) AM_READ(audio_cpu_bank_select_8000_bfff_r) |
| 1420 | // banking reads are actually NOP on NeoCD? but some games still access them |
| 1421 | AM_RANGE(0x08, 0x08) AM_MIRROR(0xfff0) AM_MASK(0xfff0) AM_READ(audio_cpu_bank_select_f000_f7ff_r) |
| 1422 | AM_RANGE(0x09, 0x09) AM_MIRROR(0xfff0) AM_MASK(0xfff0) AM_READ(audio_cpu_bank_select_e000_efff_r) |
| 1423 | AM_RANGE(0x0a, 0x0a) AM_MIRROR(0xfff0) AM_MASK(0xfff0) AM_READ(audio_cpu_bank_select_c000_dfff_r) |
| 1424 | AM_RANGE(0x0b, 0x0b) AM_MIRROR(0xfff0) AM_MASK(0xfff0) AM_READ(audio_cpu_bank_select_8000_bfff_r) |
| 1692 | 1425 | AM_RANGE(0x0c, 0x0c) AM_MIRROR(0xff00) AM_WRITE(audio_result_w) |
| 1693 | 1426 | AM_RANGE(0x18, 0x18) AM_MIRROR(0xff00) /* write - NMI disable? (the data written doesn't matter) */ |
| 1694 | 1427 | ADDRESS_MAP_END |
| r19372 | r19373 | |
| 1758 | 1491 | PORT_BIT( 0x0010, IP_ACTIVE_HIGH, IPT_UNKNOWN ) /* having this ACTIVE_HIGH causes you to start with 2 credits using USA bios roms */ \ |
| 1759 | 1492 | PORT_BIT( 0x0020, IP_ACTIVE_LOW, IPT_SPECIAL ) /* what is this? */ \ |
| 1760 | 1493 | PORT_BIT( 0x00c0, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_CUSTOM(get_calendar_status, NULL) \ |
| 1761 | | PORT_BIT( 0xff00, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_CUSTOM(get_audio_result, NULL) |
| 1494 | PORT_BIT( 0xff00, IP_ACTIVE_HIGH, IPT_SPECIAL ) PORT_CUSTOM_MEMBER(DEVICE_SELF, neogeo_state,get_audio_result, NULL) \ |
| 1762 | 1495 | |
| 1763 | | |
| 1764 | 1496 | #define STANDARD_IN4 \ |
| 1765 | 1497 | PORT_START("IN4") \ |
| 1766 | 1498 | PORT_BIT( 0x0001, IP_ACTIVE_HIGH, IPT_UNKNOWN ) \ |
| r19372 | r19373 | |
| 2037 | 1769 | |
| 2038 | 1770 | |
| 2039 | 1771 | MCFG_MACHINE_START_OVERRIDE(ng_aes_state,neocd) |
| 1772 | MCFG_MACHINE_RESET_OVERRIDE(ng_aes_state,neocd) |
| 2040 | 1773 | |
| 2041 | 1774 | MCFG_CDROM_ADD( "cdrom",neocd_cdrom ) |
| 2042 | 1775 | MCFG_SOFTWARE_LIST_ADD("cd_list","neocd") |
trunk/src/mame/drivers/neogeo.c
| r19372 | r19373 | |
| 357 | 357 | state->m_audiocpu->set_input_line(INPUT_LINE_NMI, ASSERT_LINE); |
| 358 | 358 | } |
| 359 | 359 | |
| 360 | | |
| 361 | 360 | WRITE8_MEMBER(neogeo_state::audio_cpu_clear_nmi_w) |
| 362 | 361 | { |
| 363 | 362 | m_audiocpu->set_input_line(INPUT_LINE_NMI, CLEAR_LINE); |
| r19372 | r19373 | |
| 584 | 583 | } |
| 585 | 584 | |
| 586 | 585 | |
| 586 | |
| 587 | |
| 588 | |
| 587 | 589 | READ8_MEMBER(neogeo_state::audio_command_r) |
| 588 | 590 | { |
| 589 | 591 | UINT8 ret = soundlatch_byte_r(space, 0); |
| r19372 | r19373 | |
| 630 | 632 | } |
| 631 | 633 | |
| 632 | 634 | |
| 635 | |
| 633 | 636 | static void set_main_cpu_vector_table_source( running_machine &machine, UINT8 data ) |
| 634 | 637 | { |
| 635 | 638 | neogeo_state *state = machine.driver_data<neogeo_state>(); |
| r19372 | r19373 | |
| 658 | 661 | } |
| 659 | 662 | |
| 660 | 663 | |
| 664 | |
| 661 | 665 | WRITE16_MEMBER(neogeo_state::main_cpu_bank_select_w) |
| 662 | 666 | { |
| 663 | 667 | UINT32 bank_address; |
| r19372 | r19373 | |
| 706 | 710 | static void set_audio_cpu_banking( running_machine &machine ) |
| 707 | 711 | { |
| 708 | 712 | neogeo_state *state = machine.driver_data<neogeo_state>(); |
| 713 | |
| 714 | if (!state->m_has_audio_banking) return; |
| 715 | |
| 709 | 716 | int region; |
| 710 | 717 | |
| 711 | 718 | for (region = 0; region < 4; region++) |
| r19372 | r19373 | |
| 713 | 720 | } |
| 714 | 721 | |
| 715 | 722 | |
| 723 | |
| 716 | 724 | static void audio_cpu_bank_select( address_space &space, int region, UINT8 bank ) |
| 717 | 725 | { |
| 718 | 726 | neogeo_state *state = space.machine().driver_data<neogeo_state>(); |
| 727 | |
| 728 | if (!state->m_has_audio_banking) return; |
| 719 | 729 | |
| 720 | 730 | if (LOG_AUDIO_CPU_BANKING) logerror("Audio CPU PC %03x: audio_cpu_bank_select: Region: %d Bank: %02x\n", space.device().safe_pc(), region, bank); |
| 721 | 731 | |
| r19372 | r19373 | |
| 725 | 735 | } |
| 726 | 736 | |
| 727 | 737 | |
| 738 | |
| 728 | 739 | READ8_MEMBER(neogeo_state::audio_cpu_bank_select_f000_f7ff_r) |
| 729 | 740 | { |
| 730 | 741 | audio_cpu_bank_select(space, 0, offset >> 8); |
| r19372 | r19373 | |
| 760 | 771 | static void _set_audio_cpu_rom_source( address_space &space ) |
| 761 | 772 | { |
| 762 | 773 | neogeo_state *state = space.machine().driver_data<neogeo_state>(); |
| 774 | if (!state->m_has_audio_banking) return; |
| 763 | 775 | |
| 764 | 776 | /* if (!state->memregion("audiobios")->base()) */ |
| 765 | 777 | state->m_audio_cpu_rom_source = 1; |
| r19372 | r19373 | |
| 773 | 785 | |
| 774 | 786 | space.machine().device("audiocpu")->execute().set_input_line(INPUT_LINE_RESET, PULSE_LINE); |
| 775 | 787 | |
| 776 | | if (LOG_AUDIO_CPU_BANKING) logerror("Audio CPU PC %03x: selectign %s ROM\n", space.device().safe_pc(), state->m_audio_cpu_rom_source ? "CARTRIDGE" : "BIOS"); |
| 788 | if (LOG_AUDIO_CPU_BANKING) logerror("Audio CPU PC %03x: selecting %s ROM\n", space.device().safe_pc(), state->m_audio_cpu_rom_source ? "CARTRIDGE" : "BIOS"); |
| 777 | 789 | } |
| 778 | 790 | } |
| 779 | 791 | |
| 780 | 792 | |
| 793 | |
| 794 | |
| 781 | 795 | static void set_audio_cpu_rom_source( address_space &space, UINT8 data ) |
| 782 | 796 | { |
| 783 | 797 | neogeo_state *state = space.machine().driver_data<neogeo_state>(); |
| r19372 | r19373 | |
| 787 | 801 | } |
| 788 | 802 | |
| 789 | 803 | |
| 790 | | static void audio_cpu_banking_init( running_machine &machine ) |
| 804 | |
| 805 | |
| 806 | |
| 807 | void neogeo_audio_cpu_banking_init( running_machine &machine ) |
| 791 | 808 | { |
| 792 | 809 | neogeo_state *state = machine.driver_data<neogeo_state>(); |
| 810 | if (!state->m_has_audio_banking) return; |
| 811 | |
| 793 | 812 | int region; |
| 794 | 813 | int bank; |
| 795 | 814 | UINT8 *rgn; |
| r19372 | r19373 | |
| 828 | 847 | |
| 829 | 848 | |
| 830 | 849 | |
| 850 | |
| 851 | |
| 831 | 852 | /************************************* |
| 832 | 853 | * |
| 833 | 854 | * System control register |
| r19372 | r19373 | |
| 848 | 869 | set_audio_cpu_rom_source(space, bit); /* this is a guess */ |
| 849 | 870 | break; |
| 850 | 871 | case 0x05: neogeo_set_fixed_layer_source(machine(), bit); break; |
| 851 | | case 0x06: set_save_ram_unlock(machine(), bit); break; |
| 872 | case 0x06: if (m_is_mvs) set_save_ram_unlock(machine(), bit); break; |
| 852 | 873 | case 0x07: neogeo_set_palette_bank(machine(), bit); break; |
| 853 | 874 | |
| 854 | 875 | case 0x02: /* unknown - HC32 middle pin 1 */ |
| r19372 | r19373 | |
| 863 | 884 | } |
| 864 | 885 | |
| 865 | 886 | |
| 866 | | |
| 867 | 887 | /************************************* |
| 868 | 888 | * |
| 869 | 889 | * Watchdog |
| r19372 | r19373 | |
| 974 | 994 | * |
| 975 | 995 | *************************************/ |
| 976 | 996 | |
| 977 | | static void neogeo_postload(running_machine &machine) |
| 997 | void neogeo_postload(running_machine &machine) |
| 978 | 998 | { |
| 999 | neogeo_state *state = machine.driver_data<neogeo_state>(); |
| 1000 | |
| 979 | 1001 | _set_main_cpu_bank_address(machine); |
| 980 | 1002 | _set_main_cpu_vector_table_source(machine); |
| 981 | 1003 | set_audio_cpu_banking(machine); |
| 982 | 1004 | _set_audio_cpu_rom_source(machine.device("maincpu")->memory().space(AS_PROGRAM)); |
| 983 | | set_outputs(machine); |
| 1005 | if (state->m_is_mvs) set_outputs(machine); |
| 984 | 1006 | } |
| 985 | 1007 | |
| 1008 | |
| 1009 | |
| 1010 | |
| 1011 | |
| 1012 | |
| 986 | 1013 | void neogeo_state::machine_start() |
| 987 | 1014 | { |
| 988 | 1015 | |
| r19372 | r19373 | |
| 996 | 1023 | main_cpu_banking_init(machine()); |
| 997 | 1024 | |
| 998 | 1025 | /* set the initial audio CPU ROM banks */ |
| 999 | | audio_cpu_banking_init(machine()); |
| 1026 | neogeo_audio_cpu_banking_init(machine()); |
| 1000 | 1027 | |
| 1001 | 1028 | create_interrupt_timers(machine()); |
| 1002 | 1029 | |