trunk/src/mess/drivers/nes.c
| r21875 | r21876 | |
| 357 | 357 | |
| 358 | 358 | INPUT_PORTS_END |
| 359 | 359 | |
| 360 | static INPUT_PORTS_START( mahjong_panel ) |
| 361 | PORT_START("MAH0") |
| 362 | PORT_BIT( 0xff, IP_ACTIVE_HIGH, IPT_UNUSED ) |
| 363 | |
| 364 | PORT_START("MAH1") |
| 365 | PORT_BIT( 0x03, IP_ACTIVE_HIGH, IPT_UNUSED ) |
| 366 | PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_MAHJONG_N ) PORT_CONDITION("CTRLSEL", 0x00f0, EQUALS, 0x0070) |
| 367 | PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_MAHJONG_M ) PORT_CONDITION("CTRLSEL", 0x00f0, EQUALS, 0x0070) |
| 368 | PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_MAHJONG_L ) PORT_CONDITION("CTRLSEL", 0x00f0, EQUALS, 0x0070) |
| 369 | PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_MAHJONG_K ) PORT_CONDITION("CTRLSEL", 0x00f0, EQUALS, 0x0070) |
| 370 | PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_MAHJONG_J ) PORT_CONDITION("CTRLSEL", 0x00f0, EQUALS, 0x0070) |
| 371 | PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_MAHJONG_I ) PORT_CONDITION("CTRLSEL", 0x00f0, EQUALS, 0x0070) |
| 372 | |
| 373 | PORT_START("MAH2") |
| 374 | PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_MAHJONG_H ) PORT_CONDITION("CTRLSEL", 0x00f0, EQUALS, 0x0070) |
| 375 | PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_MAHJONG_G ) PORT_CONDITION("CTRLSEL", 0x00f0, EQUALS, 0x0070) |
| 376 | PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_MAHJONG_F ) PORT_CONDITION("CTRLSEL", 0x00f0, EQUALS, 0x0070) |
| 377 | PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_MAHJONG_E ) PORT_CONDITION("CTRLSEL", 0x00f0, EQUALS, 0x0070) |
| 378 | PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_MAHJONG_D ) PORT_CONDITION("CTRLSEL", 0x00f0, EQUALS, 0x0070) |
| 379 | PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_MAHJONG_C ) PORT_CONDITION("CTRLSEL", 0x00f0, EQUALS, 0x0070) |
| 380 | PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_MAHJONG_B ) PORT_CONDITION("CTRLSEL", 0x00f0, EQUALS, 0x0070) |
| 381 | PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_MAHJONG_A ) PORT_CONDITION("CTRLSEL", 0x00f0, EQUALS, 0x0070) |
| 382 | |
| 383 | PORT_START("MAH3") |
| 384 | PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_UNUSED ) |
| 385 | PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_MAHJONG_RON ) PORT_CONDITION("CTRLSEL", 0x00f0, EQUALS, 0x0070) |
| 386 | PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_MAHJONG_REACH ) PORT_CONDITION("CTRLSEL", 0x00f0, EQUALS, 0x0070) |
| 387 | PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_MAHJONG_CHI ) PORT_CONDITION("CTRLSEL", 0x00f0, EQUALS, 0x0070) |
| 388 | PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_MAHJONG_PON ) PORT_CONDITION("CTRLSEL", 0x00f0, EQUALS, 0x0070) |
| 389 | PORT_BIT( 0x20, IP_ACTIVE_HIGH, IPT_MAHJONG_KAN ) PORT_CONDITION("CTRLSEL", 0x00f0, EQUALS, 0x0070) |
| 390 | PORT_BIT( 0x40, IP_ACTIVE_HIGH, IPT_SELECT ) PORT_NAME("P1 Mahjong Select") PORT_CONDITION("CTRLSEL", 0x00f0, EQUALS, 0x0070) |
| 391 | PORT_BIT( 0x80, IP_ACTIVE_HIGH, IPT_START ) PORT_NAME("P1 Mahjong Start") PORT_CONDITION("CTRLSEL", 0x00f0, EQUALS, 0x0070) |
| 392 | INPUT_PORTS_END |
| 393 | |
| 360 | 394 | static INPUT_PORTS_START( nes ) |
| 361 | 395 | PORT_INCLUDE( nes_controllers ) |
| 362 | 396 | |
| r21875 | r21876 | |
| 392 | 426 | PORT_INCLUDE( nes ) |
| 393 | 427 | PORT_INCLUDE( fc_keyboard ) |
| 394 | 428 | PORT_INCLUDE( subor_keyboard ) |
| 429 | PORT_INCLUDE( mahjong_panel ) |
| 395 | 430 | |
| 396 | 431 | PORT_MODIFY("CTRLSEL") /* Select Controller Type */ |
| 397 | 432 | PORT_CONFNAME( 0x000f, 0x0001, "P1 Controller") |
| r21875 | r21876 | |
| 401 | 436 | PORT_CONFSETTING( 0x0006, "Crazy Climber pad" ) |
| 402 | 437 | PORT_CONFSETTING( 0x0008, "FC Keyboard" ) |
| 403 | 438 | PORT_CONFSETTING( 0x0009, "Subor Keyboard" ) |
| 439 | PORT_CONFNAME( 0x00f0, 0x0010, "P2 Controller") |
| 440 | PORT_CONFSETTING( 0x0000, "Unconnected" ) |
| 441 | PORT_CONFSETTING( 0x0010, "Gamepad" ) |
| 442 | PORT_CONFSETTING( 0x0030, "Zapper" ) |
| 443 | PORT_CONFSETTING( 0x0040, "Arkanoid paddle" ) |
| 444 | // PORT_CONFSETTING( 0x0050, "Family Trainer" ) |
| 445 | PORT_CONFSETTING( 0x0070, "Mahjong Panel" ) |
| 404 | 446 | |
| 405 | 447 | PORT_START("FLIPDISK") /* fake keys */ |
| 406 | 448 | PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON3) PORT_NAME("Change Disk Side") |
trunk/src/mess/machine/nes.c
| r21875 | r21876 | |
| 72 | 72 | m_vrom = m_cartslot->m_cart->get_vrom_base(); |
| 73 | 73 | if (m_cartslot->m_cart->get_vram_size()) |
| 74 | 74 | m_vram = auto_alloc_array(machine(), UINT8, m_cartslot->m_cart->get_vram_size()); |
| 75 | | |
| 75 | |
| 76 | 76 | m_pcb_id = m_cartslot->get_pcb_id(); |
| 77 | 77 | m_hard_mirroring = m_cartslot->m_cart->get_mirroring(); |
| 78 | 78 | m_four_screen_vram = m_cartslot->m_cart->get_four_screen_vram(); |
| 79 | | |
| 79 | |
| 80 | 80 | // setup memory pointers and related variables |
| 81 | 81 | m_prg_ram = m_cartslot->m_cart->get_battery_size() ? 1 : 0; |
| 82 | 82 | m_wram_size = m_cartslot->m_cart->get_prgram_size(); |
| r21875 | r21876 | |
| 84 | 84 | m_mapper_bram_size = m_cartslot->m_cart->get_mapper_bram_size(); |
| 85 | 85 | m_battery = m_cartslot->m_cart->get_battery_size() ? 1 : 0; |
| 86 | 86 | m_battery_size = m_cartslot->m_cart->get_battery_size(); |
| 87 | | |
| 87 | |
| 88 | 88 | if (m_prg_ram) |
| 89 | 89 | m_wram = m_cartslot->m_cart->get_prgram_base(); |
| 90 | 90 | if (m_mapper_ram_size) |
| r21875 | r21876 | |
| 93 | 93 | m_battery_ram = m_cartslot->m_cart->get_battery_base(); |
| 94 | 94 | if (m_mapper_bram_size) |
| 95 | 95 | m_mapper_bram = m_cartslot->m_cart->get_mapper_bram_base(); |
| 96 | | |
| 96 | |
| 97 | 97 | // setup the rest of the variables involved |
| 98 | 98 | m_chr_open_bus = m_cartslot->get_chr_open_bus(); |
| 99 | 99 | m_ce_mask = m_cartslot->get_ce_mask(); |
| r21875 | r21876 | |
| 136 | 136 | { |
| 137 | 137 | /* Set up the mapper callbacks */ |
| 138 | 138 | pcb_handlers_setup(); |
| 139 | | |
| 139 | |
| 140 | 140 | /* Set up the memory handlers for the mapper */ |
| 141 | 141 | space.install_read_bank(0x8000, 0x9fff, "bank1"); |
| 142 | 142 | space.install_read_bank(0xa000, 0xbfff, "bank2"); |
| 143 | 143 | space.install_read_bank(0xc000, 0xdfff, "bank3"); |
| 144 | 144 | space.install_read_bank(0xe000, 0xffff, "bank4"); |
| 145 | 145 | space.install_readwrite_bank(0x6000, 0x7fff, "bank5"); |
| 146 | | |
| 146 | |
| 147 | 147 | /* configure banks 1-4 */ |
| 148 | 148 | for (i = 0; i < 4; i++) |
| 149 | 149 | { |
| r21875 | r21876 | |
| 155 | 155 | membank(bank_names[i])->set_entry(i); |
| 156 | 156 | m_prg_bank[i] = i; |
| 157 | 157 | } |
| 158 | | |
| 158 | |
| 159 | 159 | /* bank 5 configuration is more delicate, since it can have PRG RAM, PRG ROM or SRAM mapped to it */ |
| 160 | 160 | /* we first map PRG ROM banks, then the battery bank (if a battery is present), and finally PRG RAM (m_wram) */ |
| 161 | 161 | membank("bank5")->configure_entries(0, prg_banks, m_prg, 0x2000); |
| 162 | 162 | m_battery_bank5_start = prg_banks; |
| 163 | 163 | m_prgram_bank5_start = prg_banks; |
| 164 | 164 | m_empty_bank5_start = prg_banks; |
| 165 | | |
| 165 | |
| 166 | 166 | /* add battery ram, but only if there's no trainer since they share overlapping memory. */ |
| 167 | 167 | if (m_battery && !m_trainer) |
| 168 | 168 | { |
| r21875 | r21876 | |
| 178 | 178 | membank("bank5")->configure_entries(m_prgram_bank5_start, m_wram_size / 0x2000, m_wram, 0x2000); |
| 179 | 179 | m_empty_bank5_start += m_wram_size / 0x2000; |
| 180 | 180 | } |
| 181 | | |
| 181 | |
| 182 | 182 | membank("bank5")->configure_entry(m_empty_bank5_start, m_rom + 0x6000); |
| 183 | | |
| 183 | |
| 184 | 184 | /* if we have any additional PRG RAM, point bank5 to its first bank */ |
| 185 | 185 | if (m_battery || m_prg_ram) |
| 186 | 186 | m_prg_bank[4] = m_battery_bank5_start; |
| 187 | 187 | else |
| 188 | 188 | m_prg_bank[4] = m_empty_bank5_start; // or shall we point to "maincpu" region at 0x6000? point is that we should never access this region if no sram or wram is present! |
| 189 | | |
| 189 | |
| 190 | 190 | membank("bank5")->set_entry(m_prg_bank[4]); |
| 191 | | |
| 191 | |
| 192 | 192 | if (m_four_screen_vram) |
| 193 | 193 | { |
| 194 | 194 | m_extended_ntram = auto_alloc_array_clear(machine(), UINT8, 0x2000); |
| 195 | 195 | save_pointer(NAME(m_extended_ntram), 0x2000); |
| 196 | 196 | } |
| 197 | | |
| 197 | |
| 198 | 198 | if (m_four_screen_vram) |
| 199 | 199 | set_nt_mirroring(PPU_MIRROR_4SCREEN); |
| 200 | 200 | else |
| r21875 | r21876 | |
| 393 | 393 | m_io_zapper2_x = ioport("ZAPPER2_X"); |
| 394 | 394 | m_io_zapper2_y = ioport("ZAPPER2_Y"); |
| 395 | 395 | m_io_paddle = ioport("PADDLE"); |
| 396 | m_io_mahjong[0] = ioport("MAH0"); |
| 397 | m_io_mahjong[1] = ioport("MAH1"); |
| 398 | m_io_mahjong[2] = ioport("MAH2"); |
| 399 | m_io_mahjong[3] = ioport("MAH3"); |
| 396 | 400 | m_prg_bank_mem[0] = membank("bank1"); |
| 397 | 401 | m_prg_bank_mem[1] = membank("bank2"); |
| 398 | 402 | m_prg_bank_mem[2] = membank("bank3"); |
| r21875 | r21876 | |
| 515 | 519 | ret = 0x40; |
| 516 | 520 | |
| 517 | 521 | /* Handle data line 0's serial output */ |
| 518 | | ret |= ((m_in_1.i0 >> m_in_1.shift) & 0x01); |
| 522 | if((cfg & 0x00f0) == 0x0070) |
| 523 | ret |= (((m_in_1.i0 >> m_in_1.shift) & 0x01) << 1); |
| 524 | else |
| 525 | ret |= ((m_in_1.i0 >> m_in_1.shift) & 0x01); |
| 519 | 526 | |
| 520 | 527 | /* zapper */ |
| 521 | 528 | if ((cfg & 0x00f0) == 0x0030) |
| r21875 | r21876 | |
| 567 | 574 | |
| 568 | 575 | // FIXME: this is getting messier and messier (no pun intended). inputs reading should be simplified and port_categories cleaned up |
| 569 | 576 | // to also emulate the fact that nothing should be in Port 2 if there is a Crazy Climber pad, etc. |
| 570 | | static void nes_read_input_device( running_machine &machine, int cfg, nes_input *vals, int pad_port, int supports_zapper ) |
| 577 | static void nes_read_input_device( running_machine &machine, int cfg, nes_input *vals, int pad_port, int supports_zapper, int mux_data ) |
| 571 | 578 | { |
| 572 | 579 | nes_state *state = machine.driver_data<nes_state>(); |
| 573 | 580 | |
| r21875 | r21876 | |
| 612 | 619 | state->m_in_1.i0 = state->m_io_cc_right->read(); |
| 613 | 620 | } |
| 614 | 621 | break; |
| 622 | |
| 623 | case 0x07: /* Mahjong Panel */ |
| 624 | if(mux_data & 0xf8) |
| 625 | logerror("Error: Mahjong panel read with mux data %02x\n",mux_data); |
| 626 | else |
| 627 | vals->i0 = state->m_io_mahjong[mux_data >> 1]->read(); |
| 628 | break; |
| 615 | 629 | } |
| 616 | 630 | } |
| 617 | 631 | |
| r21875 | r21876 | |
| 681 | 695 | /* Read the input devices */ |
| 682 | 696 | if ((cfg & 0x000f) != 0x06) |
| 683 | 697 | { |
| 684 | | nes_read_input_device(machine(), cfg >> 0, &m_in_0, 0, TRUE); |
| 685 | | nes_read_input_device(machine(), cfg >> 4, &m_in_1, 1, TRUE); |
| 686 | | nes_read_input_device(machine(), cfg >> 8, &m_in_2, 2, FALSE); |
| 687 | | nes_read_input_device(machine(), cfg >> 12, &m_in_3, 3, FALSE); |
| 698 | nes_read_input_device(machine(), cfg >> 0, &m_in_0, 0, TRUE,data & 0xfe); |
| 699 | nes_read_input_device(machine(), cfg >> 4, &m_in_1, 1, TRUE,data & 0xfe); |
| 700 | nes_read_input_device(machine(), cfg >> 8, &m_in_2, 2, FALSE,data & 0xfe); |
| 701 | nes_read_input_device(machine(), cfg >> 12, &m_in_3, 3, FALSE,data & 0xfe); |
| 688 | 702 | } |
| 689 | 703 | else // crazy climber pad |
| 690 | 704 | { |
| 691 | | nes_read_input_device(machine(), 0, &m_in_1, 1, TRUE); |
| 692 | | nes_read_input_device(machine(), 0, &m_in_2, 2, FALSE); |
| 693 | | nes_read_input_device(machine(), 0, &m_in_3, 3, FALSE); |
| 694 | | nes_read_input_device(machine(), cfg >> 0, &m_in_0, 0, TRUE); |
| 705 | nes_read_input_device(machine(), 0, &m_in_1, 1, TRUE,data & 0xfe); |
| 706 | nes_read_input_device(machine(), 0, &m_in_2, 2, FALSE,data & 0xfe); |
| 707 | nes_read_input_device(machine(), 0, &m_in_3, 3, FALSE,data & 0xfe); |
| 708 | nes_read_input_device(machine(), cfg >> 0, &m_in_0, 0, TRUE,data & 0xfe); |
| 695 | 709 | } |
| 696 | 710 | |
| 697 | 711 | if (cfg & 0x0f00) |