| Previous | 199869 Revisions | Next |
| r17744 Sunday 9th September, 2012 at 09:15:41 UTC by Luca Elia |
|---|
| Promoted brickzn to playable state [Luca Elia] * Fixed gfx ROMs loading * Fixed inputs in joystick version * Alternate data decryption * Fixed alternate opcode decryption ranges * Palette encryption, banking and writes disable * Work RAM disable * Multiplexing of registers through protection * Added cheat / debugging inputs New games added or promoted from NOT_WORKING status --------------------------------------------------- Brick Zone (2 sets) [Luca Elia] |
| [src/mame] | mame.lst |
| [src/mame/drivers] | subsino2.c suna8.c tetrisp2.c |
| [src/mame/includes] | suna8.h |
| [src/mame/video] | suna8.c |
| r17743 | r17744 | |
|---|---|---|
| 8534 | 8534 | starfigh // (c) 1990 SunA |
| 8535 | 8535 | hardhea2 // (c) 1991 SunA |
| 8536 | 8536 | brickzn // (c) 1992 SunA |
| 8537 | brickzn | |
| 8537 | brickznv4 // (c) 1992 SunA | |
| 8538 | 8538 | bestbest // (c) 1994 SunA |
| 8539 | 8539 | sunaq // (c) 1994 SunA |
| 8540 | 8540 | bssoccer // (c) 1996 SunA |
| r17743 | r17744 | |
|---|---|---|
| 10 | 10 | m_maincpu(*this,"maincpu"), |
| 11 | 11 | m_hardhead_ip(*this, "hardhead_ip"), |
| 12 | 12 | m_spriteram(*this, "spriteram"), |
| 13 | m_wram(*this, "wram"){ } | |
| 13 | m_wram(*this, "wram") | |
| 14 | { } | |
| 14 | 15 | |
| 15 | 16 | required_device<cpu_device> m_maincpu; |
| 16 | 17 | optional_shared_ptr<UINT8> m_hardhead_ip; |
| r17743 | r17744 | |
| 20 | 21 | UINT8 m_rombank; |
| 21 | 22 | UINT8 m_spritebank; |
| 22 | 23 | UINT8 m_palettebank; |
| 23 | UINT8 m_unknown; | |
| 24 | UINT8 m_paletteram_enab; | |
| 25 | UINT8 m_prot2; | |
| 26 | UINT8 m_prot2_prev; | |
| 24 | 27 | |
| 25 | 28 | UINT8 m_protection_val; |
| 26 | 29 | UINT8 m_nmi_enable; |
| r17743 | r17744 | |
| 50 | 53 | DECLARE_WRITE8_MEMBER(rranger_bankswitch_w); |
| 51 | 54 | DECLARE_READ8_MEMBER(rranger_soundstatus_r); |
| 52 | 55 | DECLARE_WRITE8_MEMBER(sranger_prot_w); |
| 53 | DECLARE_READ8_MEMBER(brickzn_c140_r); | |
| 54 | DECLARE_WRITE8_MEMBER(brickzn_palettebank_w); | |
| 55 | DECLARE_WRITE8_MEMBER(brickzn_spritebank_w); | |
| 56 | DECLARE_WRITE8_MEMBER(brickzn_unknown_w); | |
| 56 | ||
| 57 | // brickzn | |
| 58 | DECLARE_READ8_MEMBER(brickzn_cheats_r); | |
| 59 | DECLARE_WRITE8_MEMBER(brickzn_multi_w); | |
| 60 | DECLARE_WRITE8_MEMBER(brickzn_prot_w); | |
| 61 | DECLARE_WRITE8_MEMBER(brickzn_prot2_w); | |
| 57 | 62 | DECLARE_WRITE8_MEMBER(brickzn_rombank_w); |
| 63 | DECLARE_WRITE8_MEMBER(brickzn_enab_palram_w); | |
| 64 | DECLARE_WRITE8_MEMBER(brickzn_disab_palram_w); | |
| 65 | ||
| 58 | 66 | DECLARE_WRITE8_MEMBER(hardhea2_nmi_w); |
| 59 | 67 | DECLARE_WRITE8_MEMBER(hardhea2_flipscreen_w); |
| 60 | 68 | DECLARE_WRITE8_MEMBER(hardhea2_leds_w); |
| r17743 | r17744 | |
| 82 | 90 | DECLARE_READ8_MEMBER(suna8_banked_spriteram_r); |
| 83 | 91 | DECLARE_WRITE8_MEMBER(suna8_spriteram_w); |
| 84 | 92 | DECLARE_WRITE8_MEMBER(suna8_banked_spriteram_w); |
| 85 | DECLARE_DRIVER_INIT(brickzn | |
| 93 | DECLARE_DRIVER_INIT(brickznv4); | |
| 86 | 94 | DECLARE_DRIVER_INIT(starfigh); |
| 87 | 95 | DECLARE_DRIVER_INIT(hardhea2); |
| 88 | 96 | DECLARE_DRIVER_INIT(hardhedb); |
| r17743 | r17744 | |
|---|---|---|
| 20 | 20 | |
| 21 | 21 | [ Sprites Format ] |
| 22 | 22 | |
| 23 | ||
| 24 | 23 | Offset: Bits: Value: |
| 25 | 24 | |
| 26 | 25 | 0.b Y (Bottom up) |
| r17743 | r17744 | |
| 137 | 136 | */ |
| 138 | 137 | WRITE8_MEMBER( suna8_state::brickzn_banked_paletteram_w ) |
| 139 | 138 | { |
| 139 | if (!m_paletteram_enab) | |
| 140 | return; | |
| 141 | ||
| 140 | 142 | int r,g,b; |
| 141 | 143 | UINT16 rgb; |
| 142 | 144 | |
| 143 | 145 | offset += m_palettebank * 0x200; |
| 144 | 146 | m_generic_paletteram_8[offset] = data; |
| 145 | 147 | rgb = (m_generic_paletteram_8[offset&~1] << 8) + m_generic_paletteram_8[offset|1]; |
| 146 | r = (((rgb & (1<<0xc))?1:0)<<0) | | |
| 147 | (((rgb & (1<<0xb))?1:0)<<1) | | |
| 148 | (((rgb & (1<<0xe))?1:0)<<2) | | |
| 149 | (((rgb & (1<<0xf))?1:0)<<3); | |
| 150 | g = (((rgb & (1<<0x8))?1:0)<<0) | | |
| 151 | (((rgb & (1<<0x9))?1:0)<<1) | | |
| 152 | (((rgb & (1<<0xa))?1:0)<<2) | | |
| 153 | (((rgb & (1<<0xd))?1:0)<<3); | |
| 154 | b = (((rgb & (1<<0x4))?1:0)<<0) | | |
| 155 | (((rgb & (1<<0x3))?1:0)<<1) | | |
| 156 | (((rgb & (1<<0x6))?1:0)<<2) | | |
| 157 | (((rgb & (1<<0x7))?1:0)<<3); | |
| 158 | 148 | |
| 149 | if (m_prot2_prev == 0x3c && m_prot2 == 0x80) | |
| 150 | { | |
| 151 | rgb ^= 0x4444; | |
| 152 | ||
| 153 | r = (rgb >> 12) & 0x0f; | |
| 154 | g = (rgb >> 8) & 0x0f; | |
| 155 | b = (rgb >> 4) & 0x0f; | |
| 156 | } | |
| 157 | // see code at 697b | |
| 158 | else if (m_prot2_prev == 0xa8 && m_prot2 == 0x00) | |
| 159 | { | |
| 160 | r = (((rgb & (1<<0xc))?1:0)<<0) | | |
| 161 | (((rgb & (1<<0xb))?1:0)<<1) | | |
| 162 | (((rgb & (1<<0xe))?1:0)<<2) | | |
| 163 | (((rgb & (1<<0xf))?1:0)<<3); | |
| 164 | g = (((rgb & (1<<0x8))?1:0)<<0) | | |
| 165 | (((rgb & (1<<0x9))?1:0)<<1) | | |
| 166 | (((rgb & (1<<0xa))?1:0)<<2) | | |
| 167 | (((rgb & (1<<0xd))?1:0)<<3); | |
| 168 | b = (((rgb & (1<<0x4))?1:0)<<0) | | |
| 169 | (((rgb & (1<<0x3))?1:0)<<1) | | |
| 170 | (((rgb & (1<<0x6))?1:0)<<2) | | |
| 171 | (((rgb & (1<<0x7))?1:0)<<3); | |
| 172 | } | |
| 173 | else | |
| 174 | { | |
| 175 | r = (rgb >> 12) & 0x0f; | |
| 176 | g = (rgb >> 8) & 0x0f; | |
| 177 | b = (rgb >> 4) & 0x0f; | |
| 178 | } | |
| 179 | ||
| 159 | 180 | palette_set_color_rgb(machine(),offset/2,pal4bit(r),pal4bit(g),pal4bit(b)); |
| 160 | 181 | } |
| 161 | 182 | |
| r17743 | r17744 | |
| 165 | 186 | { |
| 166 | 187 | suna8_state *state = machine.driver_data<suna8_state>(); |
| 167 | 188 | |
| 168 | state->m_text_dim = dim; | |
| 169 | if (!(state->m_text_dim > 0)) | |
| 189 | state->m_text_dim = dim; | |
| 190 | state->m_spritebank = 0; | |
| 191 | state->m_palettebank = 0; | |
| 192 | ||
| 193 | if (!state->m_text_dim) | |
| 170 | 194 | { |
| 171 | 195 | state->m_generic_paletteram_8.allocate(0x200 * 2); |
| 172 | 196 | state->m_spriteram.allocate(0x2000 * 2); |
| 173 | state->m_spritebank = 0; | |
| 174 | state->m_palettebank = 0; | |
| 175 | 197 | } |
| 176 | 198 | |
| 177 | 199 | #if TILEMAPS |
| r17743 | r17744 | |
| 320 | 342 | |
| 321 | 343 | drawgfx_transpen( bitmap,cliprect,machine.gfx[0], |
| 322 | 344 | tile + (attr & 0x3)*0x100 + gfxbank, |
| 323 | ((attr >> 2) & 0xf) | colorbank, // hardhea2 player2 | |
| 345 | (((attr >> 2) & 0xf) | colorbank) + 0x10 * state->m_palettebank, // hardhea2 player2 | |
| 324 | 346 | tile_flipx, tile_flipy, |
| 325 | 347 | sx, sy,15); |
| 326 | 348 | } |
| r17743 | r17744 | |
| 433 | 455 | state->m_bg_tilemap->set_scrolly(0, 0); |
| 434 | 456 | state->m_bg_tilemap->draw(bitmap, cliprect, 0, 0); |
| 435 | 457 | #if 1 |
| 436 | popmessage("%02X %02X %02X %02X - p%2X g%02X r%02X", | |
| 437 | state->m_rombank, state->m_palettebank, state->m_spritebank, state->m_unknown, | |
| 458 | popmessage("%02X %02X %02X - p%2X g%02X r%02X", | |
| 459 | state->m_rombank, state->m_palettebank, state->m_spritebank, | |
| 438 | 460 | state->m_page, state->m_tiles, state->m_trombank); |
| 439 | 461 | #endif |
| 440 | 462 | } |
| r17743 | r17744 | |
|---|---|---|
| 18 | 18 | 89 Spark Man KRB-16 60136-081 T568009 Not Working (Protection) |
| 19 | 19 | 90 Star Fighter KRB-17 60484-0082 T568009 Not Working |
| 20 | 20 | 91 Hard Head 2 ? ? T568009 Encryption + Protection |
| 21 | 92 Brick Zone ? ? Yes | |
| 21 | 92 Brick Zone ? ? Yes Encrypti | |
| 22 | 22 | --------------------------------------------------------------------------- |
| 23 | 23 | |
| 24 | 24 | To Do: |
| r17743 | r17744 | |
| 90 | 90 | Brick Zone |
| 91 | 91 | ***************************************************************************/ |
| 92 | 92 | |
| 93 | /* !! BRICKZN3 !! */ | |
| 94 | ||
| 95 | 93 | static UINT8 *brickzn_decrypt(running_machine &machine) |
| 96 | 94 | { |
| 97 | 95 | address_space *space = machine.device("maincpu")->memory().space(AS_PROGRAM); |
| r17743 | r17744 | |
| 107 | 105 | { |
| 108 | 106 | static const UINT8 opcode_swaptable[8] = |
| 109 | 107 | { |
| 110 | 1,1,1,0,0,1,1,0 | |
| 108 | 1,1,1,0,0,1,1,0 | |
| 111 | 109 | }; |
| 112 | 110 | static const UINT8 data_swaptable[16] = |
| 113 | 111 | { |
| 114 | 1,1,1,0,0,1,1,1,1,0,1,1,1,1,1,1 | |
| 112 | 1,1,1,0,0,1,1,1,1,0,1,1,1,1,1,1 | |
| 115 | 113 | }; |
| 116 | 114 | int opcode_swap = opcode_swaptable[((i & 0x00c) >> 2) | ((i & 0x040) >> 4)]; |
| 117 | 115 | int data_swap = (i >= 0x8000) ? 0 : data_swaptable[(i & 0x003) | ((i & 0x008) >> 1) | ((i & 0x400) >> 7)]; |
| r17743 | r17744 | |
| 130 | 128 | x = BITSWAP8(x, 7,2,3,4,5,6,1,0) ^ 0x10; |
| 131 | 129 | |
| 132 | 130 | decrypt[i] = x; |
| 131 | ||
| 132 | // Alternate data decryption, activated at run-time. Store in higher banks. | |
| 133 | if (i >= 0x10000) | |
| 134 | RAM[i+0x40000] = RAM[i] ^ 0x44; | |
| 133 | 135 | } |
| 134 | 136 | |
| 135 | 137 | return decrypt; |
| r17743 | r17744 | |
| 141 | 143 | UINT8 *decrypt = brickzn_decrypt(machine()); |
| 142 | 144 | int i; |
| 143 | 145 | |
| 144 | // | |
| 146 | // O | |
| 145 | 147 | for (i = 0; i < 0x8000; i++) |
| 146 | 148 | { |
| 147 | if ( ((i >= 0x07 | |
| 149 | if ( ((i >= 0x072b) && (i <= 0x076f)) || | |
| 148 | 150 | ((i >= 0x45c5) && (i <= 0x45e4)) || |
| 149 | 151 | ((i >= 0x7393) && (i <= 0x73ba)) || |
| 150 | 152 | ((i >= 0x7a79) && (i <= 0x7aa9)) ) |
| r17743 | r17744 | |
| 153 | 155 | } |
| 154 | 156 | } |
| 155 | 157 | |
| 158 | // !!!!!! PATCHES !!!!!! | |
| 156 | 159 | |
| 157 | /* !!!!!! PATCHES !!!!!! */ | |
| 160 | // To do: ROM banking should be disabled here | |
| 161 | decrypt[0x11bb] = 0x00; // LD ($C040),A -> NOP | |
| 162 | decrypt[0x11bc] = 0x00; // LD ($C040),A -> NOP | |
| 163 | decrypt[0x11bd] = 0x00; // LD ($C040),A -> NOP | |
| 158 | 164 | |
| 159 | 165 | decrypt[0x3349] = 0xc9; // RET Z -> RET (to avoid: jp $C800) |
| 160 | 166 | |
| 161 | decrypt[0x1431] = 0x00; // HALT -> NOP (NMI source??) | |
| 167 | // NMI enable / source?? | |
| 168 | decrypt[0x1431] = 0xc9; // HALT -> RET | |
| 162 | 169 | decrypt[0x24b5] = 0x00; // HALT -> NOP |
| 163 | decrypt[0x25 | |
| 170 | decrypt[0x2593] = 0x00; // HALT -> NOP | |
| 164 | 171 | |
| 165 | machine().root_device().membank("bank1")->configure_entries(0, 16, machine().root_device().memregion("maincpu")->base() + 0x10000, 0x4000); | |
| 172 | // Data banks: 00-0f normal data decryption, 10-1f alternate data decryption: | |
| 173 | machine().root_device().membank("bank1")->configure_entries(0, 16*2, machine().root_device().memregion("maincpu")->base() + 0x10000, 0x4000); | |
| 174 | // Opcode banks: 00-1f normal opcode decryption: | |
| 166 | 175 | machine().root_device().membank("bank1")->configure_decrypted_entries(0, 16, decrypt + 0x10000, 0x4000); |
| 176 | machine().root_device().membank("bank1")->configure_decrypted_entries(16, 16, decrypt + 0x10000, 0x4000); | |
| 167 | 177 | } |
| 168 | 178 | |
| 169 | DRIVER_INIT_MEMBER(suna8_state,brickzn | |
| 179 | DRIVER_INIT_MEMBER(suna8_state,brickznv4) | |
| 170 | 180 | { |
| 171 | 181 | UINT8 *RAM = machine().root_device().memregion("maincpu")->base(); |
| 172 | 182 | UINT8 *decrypt = brickzn_decrypt(machine()); |
| 173 | 183 | int i; |
| 174 | 184 | |
| 175 | // | |
| 185 | // O | |
| 176 | 186 | for (i = 0; i < 0x8000; i++) |
| 177 | 187 | { |
| 178 | if ( ((i >= 0x07 | |
| 188 | if ( ((i >= 0x072b) && (i <= 0x076f)) || | |
| 179 | 189 | ((i >= 0x4541) && (i <= 0x4560)) || |
| 180 | ((i >= 0x72f3) && (i <= 0x73 | |
| 190 | ((i >= 0x72f3) && (i <= 0x7322)) || | |
| 181 | 191 | ((i >= 0x79d9) && (i <= 0x7a09)) ) |
| 182 | 192 | { |
| 183 | 193 | decrypt[i] = RAM[i]; |
| 184 | 194 | } |
| 185 | 195 | } |
| 186 | 196 | |
| 197 | // !!!!!! PATCHES !!!!!! | |
| 187 | 198 | |
| 188 | /* !!!!!! PATCHES !!!!!! */ | |
| 199 | // To do: ROM banking should be disabled here | |
| 200 | decrypt[0x1190] = 0x00; // LD ($C040),A -> NOP | |
| 201 | decrypt[0x1191] = 0x00; // LD ($C040),A -> NOP | |
| 202 | decrypt[0x1192] = 0x00; // LD ($C040),A -> NOP | |
| 189 | 203 | |
| 190 | 204 | decrypt[0x3337] = 0xc9; // RET Z -> RET (to avoid: jp $C800) |
| 191 | 205 | |
| 192 | decrypt[0x1406] = 0x00; // HALT -> NOP (NMI source??) | |
| 206 | // NMI enable / source?? | |
| 207 | decrypt[0x1406] = 0xc9; // HALT -> RET | |
| 193 | 208 | decrypt[0x2487] = 0x00; // HALT -> NOP |
| 194 | 209 | decrypt[0x256c] = 0x00; // HALT -> NOP |
| 195 | 210 | |
| 196 | machine().root_device().membank("bank1")->configure_entries(0, 16, machine().root_device().memregion("maincpu")->base() + 0x10000, 0x4000); | |
| 211 | // Data banks: 00-0f normal data decryption, 10-1f alternate data decryption: | |
| 212 | machine().root_device().membank("bank1")->configure_entries(0, 16*2, machine().root_device().memregion("maincpu")->base() + 0x10000, 0x4000); | |
| 213 | // Opcode banks: 00-1f normal opcode decryption: | |
| 197 | 214 | machine().root_device().membank("bank1")->configure_decrypted_entries(0, 16, decrypt + 0x10000, 0x4000); |
| 215 | machine().root_device().membank("bank1")->configure_decrypted_entries(16, 16, decrypt + 0x10000, 0x4000); | |
| 198 | 216 | } |
| 199 | 217 | |
| 200 | 218 | |
| r17743 | r17744 | |
| 447 | 465 | |
| 448 | 466 | WRITE8_MEMBER(suna8_state::hardhead_protection_w) |
| 449 | 467 | { |
| 450 | ||
| 451 | 468 | if (data & 0x80) m_protection_val = data; |
| 452 | 469 | else m_protection_val = offset & 1; |
| 453 | 470 | } |
| r17743 | r17744 | |
| 467 | 484 | |
| 468 | 485 | READ8_MEMBER(suna8_state::hardhead_ip_r) |
| 469 | 486 | { |
| 470 | ||
| 471 | 487 | switch (*m_hardhead_ip) |
| 472 | 488 | { |
| 473 | 489 | case 0: return ioport("P1")->read(); |
| r17743 | r17744 | |
| 603 | 619 | ***************************************************************************/ |
| 604 | 620 | |
| 605 | 621 | /* |
| 606 | ? | |
| 622 | C140: 7--- ---- Finish Stage (Cheat) | |
| 623 | -654 3--- | |
| 624 | ---- -2-- Must flip rapidly? | |
| 625 | ---- --1- | |
| 626 | ---- ---0 Use Cheat 1 and 2 (driver config) | |
| 607 | 627 | */ |
| 608 | READ8_MEMBER(suna8_state::brickzn_c | |
| 628 | READ8_MEMBER(suna8_state::brickzn_cheats_r) | |
| 609 | 629 | { |
| 610 | return 0xff; | |
| 630 | static UINT8 bit2 = 0; | |
| 631 | bit2 = 1 - bit2; // see code at 2b48 | |
| 632 | return | |
| 633 | (ioport("CHEATS")->read() & (~(1 << 2))) | | |
| 634 | (bit2 << 2); | |
| 611 | 635 | } |
| 612 | 636 | |
| 613 | 637 | /* |
| 638 | C0A0: 7654 321- | |
| 639 | ---- ---0 Palette RAM Bank | |
| 640 | ||
| 641 | ||
| 642 | C0A0: Sound Latch | |
| 643 | ||
| 644 | ||
| 645 | C0A0: 7654 3--- | |
| 646 | ---- -2-- Coin Counter | |
| 647 | ---- --1- Start 2 Led | |
| 648 | ---- ---0 Start 1 Led | |
| 614 | 649 | */ |
| 615 | WRITE8_MEMBER(suna8_state::brickzn_ | |
| 650 | WRITE8_MEMBER(suna8_state::brickzn_mul | |
| 616 | 651 | { |
| 652 | if ((m_protection_val & 0xfc) == 0x88 || (m_protection_val & 0xfc) == 0x8c) | |
| 653 | { | |
| 654 | m_palettebank = data & 0x01; | |
| 617 | 655 | |
| 618 | m_palettebank = (data >> 1) & 1; | |
| 619 | if (data & ~0x02) logerror("CPU #0 - PC %04X: unknown palettebank bits: %02X\n",cpu_get_pc(&space.device()),data); | |
| 656 | logerror("CPU #0 - PC %04X: palettebank = %02X\n",cpu_get_pc(&space.device()),data); | |
| 657 | if (data & ~0x01) logerror("CPU #0 - PC %04X: unknown palettebank bits: %02X\n",cpu_get_pc(&space.device()),data); | |
| 658 | } | |
| 659 | else if ((m_protection_val & 0xfc) == 0x90) | |
| 660 | { | |
| 661 | soundlatch_byte_w(space, 0, data); | |
| 620 | 662 | |
| 621 | /* Also used as soundlatch - depending on c0c0? */ | |
| 622 | soundlatch_byte_w(space,0,data); | |
| 663 | logerror("CPU #0 - PC %04X: soundlatch = %02X\n",cpu_get_pc(&space.device()),data); | |
| 664 | } | |
| 665 | else if ((m_protection_val & 0xfc) == 0x04) | |
| 666 | { | |
| 667 | set_led_status(machine(), 0, data & 0x01); | |
| 668 | set_led_status(machine(), 1, data & 0x02); | |
| 669 | coin_counter_w(machine(), 0, data & 0x04); | |
| 670 | ||
| 671 | logerror("CPU #0 - PC %04X: leds = %02X\n",cpu_get_pc(&space.device()),data); | |
| 672 | if (data & ~0x07) logerror("CPU #0 - PC %04X: unknown leds bits: %02X\n",cpu_get_pc(&space.device()),data); | |
| 673 | } | |
| 674 | else if ((m_protection_val & 0xfc) == 0x9c) | |
| 675 | { | |
| 676 | // controls opcode decryption | |
| 677 | // see code at 71b, 45b7, 7380, 7a6b | |
| 678 | ||
| 679 | // To be done: run-time opcode decryption change. Done in driver_init for now. | |
| 680 | ||
| 681 | logerror("CPU #0 - PC %04X: op-decrypt = %02X\n",cpu_get_pc(&space.device()),data); | |
| 682 | } | |
| 683 | else if ((m_protection_val & 0xfc) == 0x80) | |
| 684 | { | |
| 685 | // disables rom banking? | |
| 686 | // see code at 11b1: | |
| 687 | ||
| 688 | logerror("CPU #0 - PC %04X: rombank_disable = %02X\n",cpu_get_pc(&space.device()),data); | |
| 689 | } | |
| 690 | else | |
| 691 | { | |
| 692 | logerror("CPU #0 - PC %04X: ignore = %02X\n",cpu_get_pc(&space.device()),data); | |
| 693 | } | |
| 623 | 694 | } |
| 624 | 695 | |
| 625 | 696 | /* |
| 626 | 7654 32-- | |
| 627 | ---- --1- Ram Bank | |
| 628 | ---- ---0 Flip Screen | |
| 697 | C060: 7654 32-- Protection (e.g. select output of multi_w) | |
| 698 | ---- --1- Sprite RAM Bank | |
| 699 | ---- ---0 Flip Screen | |
| 629 | 700 | */ |
| 630 | WRITE8_MEMBER(suna8_state::brickzn_ | |
| 701 | WRITE8_MEMBER(suna8_state::brickzn_ | |
| 631 | 702 | { |
| 703 | m_protection_val = data; | |
| 632 | 704 | |
| 705 | flip_screen_set(data & 0x01); | |
| 633 | 706 | m_spritebank = (data >> 1) & 1; |
| 634 | if (data & ~0x03) logerror("CPU #0 - PC %04X: unknown spritebank bits: %02X\n",cpu_get_pc(&space.device()),data); | |
| 635 | flip_screen_set(data & 0x01 ); | |
| 707 | ||
| 708 | logerror("CPU #0 - PC %04X: protection_val = %02X\n",cpu_get_pc(&space.device()),data); | |
| 709 | // if (data & ~0x03) logerror("CPU #0 - PC %04X: unknown spritebank bits: %02X\n",cpu_get_pc(&space.device()),data); | |
| 636 | 710 | } |
| 637 | 711 | |
| 638 | WRITE8_MEMBER(suna8_state::brickzn_unknown_w) | |
| 712 | /* | |
| 713 | C0C0: two protection values written in rapid succession | |
| 714 | */ | |
| 715 | WRITE8_MEMBER(suna8_state::brickzn_prot2_w) | |
| 639 | 716 | { |
| 717 | // Disable work RAM write, see code at 96a: | |
| 718 | if ((m_prot2 ^ data) == 0x24) | |
| 719 | space.unmap_write(0xc800, 0xdfff); | |
| 720 | else | |
| 721 | space.install_ram(0xc800, 0xdfff, m_wram); | |
| 640 | 722 | |
| 641 | m_unknown = data; | |
| 723 | // Select alternate data decryption, see code at 787e: | |
| 724 | membank("bank1")->set_entry((membank("bank1")->entry() & 0x0f) + ((m_prot2 == (data | 0xdc)) ? 0x10 : 0)); | |
| 725 | ||
| 726 | m_prot2_prev = m_prot2; | |
| 727 | m_prot2 = data; | |
| 728 | ||
| 729 | logerror("CPU #0 - PC %04X: unknown = %02X\n",cpu_get_pc(&space.device()),data); | |
| 642 | 730 | } |
| 643 | 731 | |
| 644 | 732 | /* |
| 645 | 7654 ---- | |
| 646 | ---- 3210 ROM Bank | |
| 733 | C040: 7654 ---- | |
| 734 | ---- 3210 ROM Bank | |
| 647 | 735 | */ |
| 648 | 736 | WRITE8_MEMBER(suna8_state::brickzn_rombank_w) |
| 649 | 737 | { |
| r17743 | r17744 | |
| 651 | 739 | |
| 652 | 740 | if (data & ~0x0f) logerror("CPU #0 - PC %04X: unknown rom bank bits: %02X\n",cpu_get_pc(&space.device()),data); |
| 653 | 741 | |
| 654 | membank("bank1")->set_entry(bank); | |
| 742 | membank("bank1")->set_entry(bank + (membank("bank1")->entry() & 0x10)); | |
| 743 | ||
| 655 | 744 | m_rombank = data; |
| 656 | 745 | } |
| 657 | 746 | |
| 747 | // Disable palette RAM writes, see code at 4990: | |
| 748 | WRITE8_MEMBER(suna8_state::brickzn_enab_palram_w) | |
| 749 | { | |
| 750 | m_paletteram_enab = 1; | |
| 751 | } | |
| 752 | WRITE8_MEMBER(suna8_state::brickzn_disab_palram_w) | |
| 753 | { | |
| 754 | m_paletteram_enab = 0; | |
| 755 | } | |
| 756 | ||
| 658 | 757 | static ADDRESS_MAP_START( brickzn_map, AS_PROGRAM, 8, suna8_state ) |
| 659 | AM_RANGE(0x0000, 0x7fff) AM_ROM // ROM | |
| 660 | AM_RANGE(0x8000, 0xbfff) AM_ROMBANK("bank1") // Banked ROM | |
| 661 | AM_RANGE(0xc040, 0xc040) AM_WRITE(brickzn_rombank_w ) // ROM Bank | |
| 662 | AM_RANGE(0xc060, 0xc060) AM_WRITE(brickzn_spritebank_w ) // Sprite RAM Bank + Flip Screen | |
| 663 | AM_RANGE(0xc0a0, 0xc0a0) AM_WRITE(brickzn_palettebank_w ) // Palette RAM Bank + ? | |
| 664 | AM_RANGE(0xc0c0, 0xc0c0) AM_WRITE(brickzn_unknown_w ) // ??? | |
| 665 | AM_RANGE(0xc100, 0xc100) AM_READ_PORT("P1") // P1 (Buttons) | |
| 666 | AM_RANGE(0xc101, 0xc101) AM_READ_PORT("P2") // P2 | |
| 667 | AM_RANGE(0xc102, 0xc102) AM_READ_PORT("DSW1") // DSW 1 | |
| 668 | AM_RANGE(0xc103, 0xc103) AM_READ_PORT("DSW2") // DSW 2 | |
| 669 | AM_RANGE(0xc108, 0xc108) AM_READ_PORT("TRACK1") // P1 (Analog) | |
| 670 | AM_RANGE(0xc10c, 0xc10c) AM_READ_PORT("TRACK2") // P2 | |
| 671 | AM_RANGE(0xc140, 0xc140) AM_READ(brickzn_c140_r) // ??? | |
| 758 | AM_RANGE(0x0000, 0x7fff) AM_ROM // ROM | |
| 759 | AM_RANGE(0x8000, 0xbfff) AM_ROMBANK("bank1") // Banked ROM | |
| 760 | ||
| 761 | // c000 writes before reading buttons | |
| 762 | // c010 writes? | |
| 763 | AM_RANGE(0xc040, 0xc040) AM_WRITE(brickzn_rombank_w ) // ROM Bank | |
| 764 | AM_RANGE(0xc060, 0xc060) AM_WRITE(brickzn_prot_w ) // Sprite RAM Bank + Flip Screen + Protection | |
| 765 | // c080 writes? | |
| 766 | // c090 writes? | |
| 767 | AM_RANGE(0xc0a0, 0xc0a0) AM_WRITE(brickzn_multi_w ) // Palette RAM Bank / Sound Latch / ... | |
| 768 | AM_RANGE(0xc0c0, 0xc0c0) AM_WRITE(brickzn_prot2_w ) // Protection 2 | |
| 769 | ||
| 770 | AM_RANGE(0xc100, 0xc100) AM_READ_PORT("P1") // P1 (Buttons) | |
| 771 | AM_RANGE(0xc101, 0xc101) AM_READ_PORT("P2") // P2 (Buttons) | |
| 772 | AM_RANGE(0xc102, 0xc102) AM_READ_PORT("DSW1") // DSW 1 | |
| 773 | AM_RANGE(0xc103, 0xc103) AM_READ_PORT("DSW2") // DSW 2 | |
| 774 | AM_RANGE(0xc108, 0xc108) AM_READ_PORT("SPIN1") // P1 (Spinner) | |
| 775 | AM_RANGE(0xc10c, 0xc10c) AM_READ_PORT("SPIN2") // P2 (Spinner) | |
| 776 | ||
| 777 | AM_RANGE(0xc140, 0xc140) AM_READ(brickzn_cheats_r) // Cheats / Debugging Inputs | |
| 778 | // c144 reads? | |
| 779 | // c14a reads? | |
| 780 | ||
| 672 | 781 | AM_RANGE(0xc600, 0xc7ff) AM_READWRITE(banked_paletteram_r, brickzn_banked_paletteram_w) // Palette (Banked) |
| 673 | AM_RANGE(0xc800, 0xdfff) AM_RAM // RAM | |
| 782 | AM_RANGE(0xc800, 0xdfff) AM_RAM AM_SHARE("wram") // RAM | |
| 674 | 783 | AM_RANGE(0xe000, 0xffff) AM_READWRITE(suna8_banked_spriteram_r, suna8_banked_spriteram_w) // Sprites (Banked) |
| 675 | 784 | ADDRESS_MAP_END |
| 676 | 785 | |
| 786 | static ADDRESS_MAP_START( brickzn_io_map, AS_IO, 8, suna8_state ) | |
| 787 | AM_RANGE(0x0000, 0x0000) AM_WRITE(brickzn_disab_palram_w ) // Disable Palette RAM | |
| 788 | AM_RANGE(0x00a1, 0x00a1) AM_WRITE(brickzn_enab_palram_w ) // Enable Palette RAM | |
| 789 | ADDRESS_MAP_END | |
| 677 | 790 | |
| 678 | 791 | /*************************************************************************** |
| 679 | 792 | Hard Head 2 |
| r17743 | r17744 | |
| 682 | 795 | /* Probably wrong: */ |
| 683 | 796 | WRITE8_MEMBER(suna8_state::hardhea2_nmi_w) |
| 684 | 797 | { |
| 685 | ||
| 686 | 798 | m_nmi_enable = data & 0x01; |
| 687 | 799 | // if (data & ~0x01) logerror("CPU #0 - PC %04X: unknown nmi bits: %02X\n",cpu_get_pc(&space.device()),data); |
| 688 | 800 | } |
| r17743 | r17744 | |
| 707 | 819 | |
| 708 | 820 | /* |
| 709 | 821 | 7654 32-- |
| 710 | ---- --1- Ram Bank | |
| 711 | ---- ---0 Ram Bank? | |
| 822 | ---- --1- Sprite RAM Bank | |
| 823 | ---- ---0 Sprite RAM Bank? | |
| 712 | 824 | */ |
| 713 | 825 | WRITE8_MEMBER(suna8_state::hardhea2_spritebank_w) |
| 714 | 826 | { |
| 715 | ||
| 716 | 827 | m_spritebank = (data >> 1) & 1; |
| 717 | 828 | if (data & ~0x02) logerror("CPU #0 - PC %04X: unknown spritebank bits: %02X\n",cpu_get_pc(&space.device()),data); |
| 718 | 829 | } |
| r17743 | r17744 | |
| 734 | 845 | |
| 735 | 846 | WRITE8_MEMBER(suna8_state::hardhea2_spritebank_0_w) |
| 736 | 847 | { |
| 737 | ||
| 738 | 848 | m_spritebank = 0; |
| 739 | 849 | } |
| 740 | 850 | WRITE8_MEMBER(suna8_state::hardhea2_spritebank_1_w) |
| 741 | 851 | { |
| 742 | ||
| 743 | 852 | m_spritebank = 1; |
| 744 | 853 | } |
| 745 | 854 | |
| r17743 | r17744 | |
| 801 | 910 | |
| 802 | 911 | WRITE8_MEMBER(suna8_state::starfigh_spritebank_latch_w) |
| 803 | 912 | { |
| 804 | ||
| 805 | 913 | m_spritebank_latch = (data >> 2) & 1; |
| 806 | 914 | if (data & ~0x04) logerror("CPU #0 - PC %04X: unknown spritebank bits: %02X\n",cpu_get_pc(&space.device()),data); |
| 807 | 915 | } |
| 808 | 916 | |
| 809 | 917 | WRITE8_MEMBER(suna8_state::starfigh_spritebank_w) |
| 810 | 918 | { |
| 811 | ||
| 812 | 919 | m_spritebank = m_spritebank_latch; |
| 813 | 920 | } |
| 814 | 921 | |
| r17743 | r17744 | |
| 857 | 964 | /* This is a command-based protection. */ |
| 858 | 965 | WRITE8_MEMBER(suna8_state::sparkman_cmd_prot_w) |
| 859 | 966 | { |
| 860 | ||
| 861 | 967 | switch(data) |
| 862 | 968 | { |
| 863 | 969 | case 0xa6: m_nmi_enable = 1; break; |
| r17743 | r17744 | |
| 873 | 979 | |
| 874 | 980 | WRITE8_MEMBER(suna8_state::suna8_wram_w) |
| 875 | 981 | { |
| 876 | ||
| 877 | 982 | if (!m_trash_prot) |
| 878 | 983 | m_wram[offset] = data; |
| 879 | 984 | } |
| r17743 | r17744 | |
| 902 | 1007 | |
| 903 | 1008 | /* |
| 904 | 1009 | 7654 32-- |
| 905 | ---- --1- Ram Bank | |
| 906 | ---- ---0 Ram Bank? | |
| 1010 | ---- --1- Sprite RAM Bank | |
| 1011 | ---- ---0 Sprite RAM Bank? | |
| 907 | 1012 | */ |
| 908 | 1013 | WRITE8_MEMBER(suna8_state::sparkman_spritebank_w) |
| 909 | 1014 | { |
| 910 | ||
| 911 | 1015 | if(data == 0xf7) //??? |
| 912 | 1016 | m_spritebank = 0; |
| 913 | 1017 | else |
| r17743 | r17744 | |
| 937 | 1041 | #if 0 |
| 938 | 1042 | WRITE8_MEMBER(suna8_state::sparkman_en_trash_w) |
| 939 | 1043 | { |
| 940 | ||
| 941 | 1044 | m_trash_prot = 1; |
| 942 | 1045 | } |
| 943 | 1046 | #endif |
| r17743 | r17744 | |
| 1003 | 1106 | AM_RANGE(0xa002, 0xa003) AM_DEVWRITE_LEGACY("ym2", ym2203_w ) // Music + FX |
| 1004 | 1107 | AM_RANGE(0xc000, 0xc7ff) AM_RAM // RAM |
| 1005 | 1108 | AM_RANGE(0xd000, 0xd000) AM_WRITE(soundlatch2_byte_w ) // To Sound CPU |
| 1006 | AM_RANGE(0xd800, 0xd800) AM_READ(soundlatch_byte_r ) // From Main CPU | |
| 1109 | AM_RANGE(0xd800, 0xd800) AM_READ(soundlatch_byte_r ) // From Main CPU | |
| 1007 | 1110 | ADDRESS_MAP_END |
| 1008 | 1111 | |
| 1009 | 1112 | |
| r17743 | r17744 | |
| 1017 | 1120 | AM_RANGE(0xc002, 0xc003) AM_DEVWRITE_LEGACY("aysnd", ay8910_address_data_w ) |
| 1018 | 1121 | AM_RANGE(0xe000, 0xe7ff) AM_RAM // RAM |
| 1019 | 1122 | AM_RANGE(0xf000, 0xf000) AM_WRITE(soundlatch2_byte_w ) // To PCM CPU |
| 1020 | AM_RANGE(0xf800, 0xf800) AM_READ(soundlatch_byte_r ) // From Main CPU | |
| 1123 | AM_RANGE(0xf800, 0xf800) AM_READ(soundlatch_byte_r ) // From Main CPU | |
| 1021 | 1124 | ADDRESS_MAP_END |
| 1022 | 1125 | |
| 1023 | 1126 | |
| 1024 | /* PCM Z80 | |
| 1127 | /* PCM Z80 | |
| 1025 | 1128 | |
| 1026 | 1129 | static ADDRESS_MAP_START( brickzn_pcm_map, AS_PROGRAM, 8, suna8_state ) |
| 1027 | 1130 | AM_RANGE(0x0000, 0xffff) AM_ROM // ROM |
| r17743 | r17744 | |
| 1194 | 1297 | |
| 1195 | 1298 | static INPUT_PORTS_START( brickzn ) |
| 1196 | 1299 | |
| 1197 | PORT_START("P1") // Player 1 - $c100 | |
| 1198 | JOY(1) | |
| 1300 | PORT_START("P1") // Player 1 Joystick - $c100 | |
| 1301 | PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_PLAYER(1) | |
| 1302 | PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(1) | |
| 1303 | PORT_CONFNAME( 0x04, 0x04, "Select First Stage" ) | |
| 1304 | PORT_CONFSETTING( 0x04, DEF_STR( Off ) ) | |
| 1305 | PORT_CONFSETTING( 0x00, DEF_STR( On ) ) | |
| 1306 | PORT_CONFNAME( 0x08, 0x08, "Cheat 1" ) // ??? | |
| 1307 | PORT_CONFSETTING( 0x08, DEF_STR( Off ) ) | |
| 1308 | PORT_CONFSETTING( 0x00, DEF_STR( On ) ) | |
| 1309 | PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(1) | |
| 1310 | PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(1) | |
| 1311 | PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_START1 ) | |
| 1312 | PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_COIN1 ) | |
| 1199 | 1313 | |
| 1200 | PORT_START("P2") // Player 2 - $c101 | |
| 1201 | JOY(2) | |
| 1314 | PORT_START("P2") // Player 2 Joystick - $c101 | |
| 1315 | PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT ) PORT_PLAYER(2) | |
| 1316 | PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(2) | |
| 1317 | PORT_CONFNAME( 0x04, 0x04, "Select Next Stage" ) | |
| 1318 | PORT_CONFSETTING( 0x04, DEF_STR( Off ) ) | |
| 1319 | PORT_CONFSETTING( 0x00, DEF_STR( On ) ) | |
| 1320 | PORT_CONFNAME( 0x08, 0x08, "Cheat 2" ) // ??? | |
| 1321 | PORT_CONFSETTING( 0x08, DEF_STR( Off ) ) | |
| 1322 | PORT_CONFSETTING( 0x00, DEF_STR( On ) ) | |
| 1323 | PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON1 ) PORT_PLAYER(2) | |
| 1324 | PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON2 ) PORT_PLAYER(2) | |
| 1325 | PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_START2 ) | |
| 1326 | PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_COIN2 ) | |
| 1202 | 1327 | |
| 1203 | 1328 | PORT_START("DSW1") // DSW 1 - $c102 |
| 1204 | PORT_DIPNAME( 0x07, 0x07, DEF_STR( Coinage ) ) | |
| 1329 | PORT_DIPNAME( 0x07, 0x07, DEF_STR( Coinage ) ) | |
| 1205 | 1330 | PORT_DIPSETTING( 0x00, DEF_STR( 5C_1C ) ) |
| 1206 | 1331 | PORT_DIPSETTING( 0x01, DEF_STR( 4C_1C ) ) |
| 1207 | 1332 | PORT_DIPSETTING( 0x02, DEF_STR( 3C_1C ) ) |
| r17743 | r17744 | |
| 1219 | 1344 | PORT_DIPSETTING( 0x10, DEF_STR( Harder ) ) |
| 1220 | 1345 | PORT_DIPSETTING( 0x08, DEF_STR( Very_Hard ) ) |
| 1221 | 1346 | PORT_DIPSETTING( 0x00, DEF_STR( Hardest ) ) |
| 1222 | // PORT_DIPNAME( 0x40, 0x40, "Invulnerability (Cheat)") | |
| 1223 | // PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) | |
| 1224 | // PORT_DIPSETTING( 0x00, DEF_STR( On ) ) | |
| 1225 | PORT_SERVICE( 0x40, IP_ACTIVE_LOW ) // + Invulnerability | |
| 1347 | PORT_SERVICE( 0x40, IP_ACTIVE_LOW ) PORT_NAME( "Service / Invulnerability" ) | |
| 1226 | 1348 | PORT_DIPNAME( 0x80, 0x00, DEF_STR( Demo_Sounds ) ) |
| 1227 | 1349 | PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) |
| 1228 | 1350 | PORT_DIPSETTING( 0x00, DEF_STR( On ) ) |
| r17743 | r17744 | |
| 1252 | 1374 | PORT_DIPSETTING( 0x40, "4" ) |
| 1253 | 1375 | PORT_DIPSETTING( 0x00, "5" ) |
| 1254 | 1376 | |
| 1255 | PORT_START("TRACK1") // Player 1 - $c108 | |
| 1256 | PORT_BIT( 0xff, 0x00, IPT_TRACKBALL_X ) PORT_SENSITIVITY(50) PORT_KEYDELTA(0) PORT_REVERSE | |
| 1377 | PORT_START("SPIN1") // Player 1 Spinner - $c108 | |
| 1378 | PORT_BIT( 0xff, 0x00, IPT_DIAL ) PORT_SENSITIVITY(30) PORT_KEYDELTA(15) PORT_REVERSE PORT_PLAYER(1) | |
| 1257 | 1379 | |
| 1258 | PORT_START("TRACK2") // Player 2 - $c10c | |
| 1259 | PORT_BIT( 0xff, 0x00, IPT_TRACKBALL_X ) PORT_SENSITIVITY(50) PORT_KEYDELTA(0) PORT_REVERSE | |
| 1380 | PORT_START("SPIN2") // Player 2 Spinner - $c10c | |
| 1381 | PORT_BIT( 0xff, 0x00, IPT_DIAL ) PORT_SENSITIVITY(30) PORT_KEYDELTA(15) PORT_REVERSE PORT_PLAYER(2) | |
| 1260 | 1382 | |
| 1383 | PORT_START("CHEATS") // Cheats / Debugging Inputs - $c140 | |
| 1384 | PORT_CONFNAME( 0x01, 0x00, "0: Use Cheat 1&2 Setting" ) | |
| 1385 | PORT_CONFSETTING( 0x01, DEF_STR( Off ) ) | |
| 1386 | PORT_CONFSETTING( 0x00, DEF_STR( On ) ) | |
| 1387 | PORT_CONFNAME( 0x02, 0x02, "1: Unused?" ) | |
| 1388 | PORT_CONFSETTING( 0x02, DEF_STR( Off ) ) | |
| 1389 | PORT_CONFSETTING( 0x00, DEF_STR( On ) ) | |
| 1390 | PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_SPECIAL ) // Must flip rapidly | |
| 1391 | PORT_CONFNAME( 0x08, 0x08, "3: Unused?" ) | |
| 1392 | PORT_CONFSETTING( 0x08, DEF_STR( Off ) ) | |
| 1393 | PORT_CONFSETTING( 0x00, DEF_STR( On ) ) | |
| 1394 | PORT_CONFNAME( 0x10, 0x10, "4: Unused?" ) | |
| 1395 | PORT_CONFSETTING( 0x10, DEF_STR( Off ) ) | |
| 1396 | PORT_CONFSETTING( 0x00, DEF_STR( On ) ) | |
| 1397 | PORT_CONFNAME( 0x20, 0x20, "5: Unused?" ) | |
| 1398 | PORT_CONFSETTING( 0x20, DEF_STR( Off ) ) | |
| 1399 | PORT_CONFSETTING( 0x00, DEF_STR( On ) ) | |
| 1400 | PORT_CONFNAME( 0x40, 0x40, "6: Unused?" ) | |
| 1401 | PORT_CONFSETTING( 0x40, DEF_STR( Off ) ) | |
| 1402 | PORT_CONFSETTING( 0x00, DEF_STR( On ) ) | |
| 1403 | PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON3 ) PORT_NAME("Finish Stage (Cheat)") | |
| 1404 | ||
| 1261 | 1405 | INPUT_PORTS_END |
| 1262 | 1406 | |
| 1263 | 1407 | |
| r17743 | r17744 | |
| 1430 | 1574 | }; |
| 1431 | 1575 | |
| 1432 | 1576 | static GFXDECODE_START( suna8 ) |
| 1433 | GFXDECODE_ENTRY( "gfx1", 0, layout_8x8x4, 0, 16 ) // [0] Sprites | |
| 1577 | GFXDECODE_ENTRY( "gfx1", 0, layout_8x8x4, 0, 16*2 ) // [0] Sprites (brickzn has 2 palette RAMs) | |
| 1434 | 1578 | GFXDECODE_END |
| 1435 | 1579 | |
| 1436 | 1580 | |
| r17743 | r17744 | |
| 1607 | 1751 | } |
| 1608 | 1752 | |
| 1609 | 1753 | |
| 1754 | static MACHINE_RESET( brickzn ) | |
| 1755 | { | |
| 1756 | suna8_state *state = machine.driver_data<suna8_state>(); | |
| 1757 | state->m_protection_val = state->m_prot2 = state->m_prot2_prev = 0xff; | |
| 1758 | state->membank("bank1")->set_entry(0); | |
| 1759 | } | |
| 1760 | ||
| 1610 | 1761 | static MACHINE_CONFIG_START( brickzn, suna8_state ) |
| 1611 | 1762 | |
| 1612 | 1763 | /* basic machine hardware */ |
| 1613 | 1764 | MCFG_CPU_ADD("maincpu", Z80, SUNA8_MASTER_CLOCK / 4) /* SUNA PROTECTION BLOCK */ |
| 1614 | 1765 | MCFG_CPU_PROGRAM_MAP(brickzn_map) |
| 1766 | MCFG_CPU_IO_MAP(brickzn_io_map) | |
| 1615 | 1767 | MCFG_CPU_VBLANK_INT("screen", irq0_line_hold) // nmi breaks ramtest but is needed! |
| 1616 | 1768 | |
| 1617 | 1769 | MCFG_CPU_ADD("audiocpu", Z80, SUNA8_MASTER_CLOCK / 4) /* Z0840006PSC */ |
| r17743 | r17744 | |
| 1621 | 1773 | MCFG_CPU_PROGRAM_MAP(brickzn_pcm_map) |
| 1622 | 1774 | MCFG_CPU_IO_MAP(brickzn_pcm_io_map) |
| 1623 | 1775 | |
| 1776 | MCFG_MACHINE_RESET( brickzn ) | |
| 1777 | ||
| 1624 | 1778 | /* video hardware */ |
| 1625 | 1779 | MCFG_SCREEN_ADD("screen", RASTER) |
| 1626 | 1780 | MCFG_SCREEN_REFRESH_RATE(60) |
| r17743 | r17744 | |
| 1630 | 1784 | MCFG_SCREEN_UPDATE_STATIC(suna8) |
| 1631 | 1785 | |
| 1632 | 1786 | MCFG_GFXDECODE(suna8) |
| 1633 | MCFG_PALETTE_LENGTH(5 | |
| 1787 | MCFG_PALETTE_LENGTH(256 * 2) // 2 x Palette RAM | |
| 1634 | 1788 | |
| 1635 | 1789 | MCFG_VIDEO_START(suna8_textdim0) |
| 1636 | 1790 | |
| r17743 | r17744 | |
| 2128 | 2282 | ***************************************************************************/ |
| 2129 | 2283 | |
| 2130 | 2284 | ROM_START( brickzn ) |
| 2131 | ROM_REGION( 0x50000, "maincpu", 0 ) /* Main Z80 Code */ | |
| 2285 | ROM_REGION( 0x50000 + 0x40000, "maincpu", 0 ) /* Main Z80 Code */ | |
| 2132 | 2286 | ROM_LOAD( "brickzon.009", 0x00000, 0x08000, CRC(1ea68dea) SHA1(427152a26b062c5e77089de49c1da69369d4d557) ) // V5.0 1992,3,3 |
| 2133 | 2287 | ROM_LOAD( "brickzon.008", 0x10000, 0x20000, CRC(c61540ba) SHA1(08c0ede591b229427b910ca6bb904a6146110be8) ) |
| 2134 | 2288 | ROM_LOAD( "brickzon.007", 0x30000, 0x20000, CRC(ceed12f1) SHA1(9006726b75a65455afb1194298bade8fa2207b4a) ) |
| 2135 | 2289 | |
| 2136 | 2290 | ROM_REGION( 0x10000, "audiocpu", 0 ) /* Music Z80 Code */ |
| 2137 | ROM_LOAD( "brickzon.010", 0x00000, 0x10000, CRC(4eba8178) SHA1(9a214a1acacdc124529bc9dde73a8e884fc70293) ) | |
| 2291 | ROM_LOAD( "brickzon.010", 0x00000, 0x10000, CRC(4eba8178) SHA1(9a214a1acacdc124529bc9dde73a8e884fc70293) ) // BRICK MUSIC XILINX PROGRAM 3020 1991,11,14 MUSIC PROGRAM V 2,0 1990.12.14 | |
| 2138 | 2292 | |
| 2139 | 2293 | ROM_REGION( 0x10000, "pcm", 0 ) /* PCM Z80 Code */ |
| 2140 | 2294 | ROM_LOAD( "brickzon.011", 0x00000, 0x10000, CRC(6c54161a) SHA1(ea216d9f45b441acd56b9fed81a83e3bfe299fbd) ) |
| r17743 | r17744 | |
| 2142 | 2296 | ROM_REGION( 0xc0000, "gfx1", ROMREGION_INVERT ) /* Sprites */ |
| 2143 | 2297 | ROM_LOAD( "brickzon.005", 0x00000, 0x20000, CRC(118f8392) SHA1(598fa4df3ae348ec9796cd6d90c3045bec546da3) ) |
| 2144 | 2298 | ROM_LOAD( "brickzon.004", 0x20000, 0x20000, CRC(2be5f335) SHA1(dc870a3c5303cb2ea1fea4a25f53db016ed5ecee) ) |
| 2145 | ROM_LOAD( "brickzon.00 | |
| 2299 | ROM_LOAD( "brickzon.003", 0x40000, 0x20000, CRC(2e4f | |
| 2146 | 2300 | ROM_LOAD( "brickzon.002", 0x60000, 0x20000, CRC(241f0659) SHA1(71b577bf7097b3b367d068df42f991d515f9003a) ) |
| 2147 | 2301 | ROM_LOAD( "brickzon.001", 0x80000, 0x20000, CRC(6970ada9) SHA1(5cfe5dcf25af7aff67ee5d78eb963d598251025f) ) |
| 2148 | ROM_LOAD( "brickzon.00 | |
| 2302 | ROM_LOAD( "brickzon.006", 0xa0000, 0x20000, CRC(bb | |
| 2149 | 2303 | ROM_END |
| 2150 | 2304 | |
| 2151 | ROM_START( brickzn3 ) | |
| 2152 | ROM_REGION( 0x50000, "maincpu", 0 ) /* Main Z80 Code */ | |
| 2305 | ROM_START( brickznv4 ) | |
| 2306 | ROM_REGION( 0x50000 + 0x40000, "maincpu", 0 ) /* Main Z80 Code */ | |
| 2153 | 2307 | ROM_LOAD( "39", 0x00000, 0x08000, CRC(043380bd) SHA1(7eea7cc7d754815df233879b4a9d3d88eac5b28d) ) // V3.0 1992,1,23 |
| 2154 | 2308 | ROM_LOAD( "38", 0x10000, 0x20000, CRC(e16216e8) SHA1(e88ae97e8a632823d5f1fe500954b6f6542407d5) ) |
| 2155 | 2309 | ROM_LOAD( "brickzon.007", 0x30000, 0x20000, CRC(ceed12f1) SHA1(9006726b75a65455afb1194298bade8fa2207b4a) ) |
| 2156 | 2310 | |
| 2157 | 2311 | ROM_REGION( 0x10000, "audiocpu", 0 ) /* Music Z80 Code */ |
| 2158 | ROM_LOAD( "brickzon.010", 0x00000, 0x10000, CRC(4eba8178) SHA1(9a214a1acacdc124529bc9dde73a8e884fc70293) ) | |
| 2312 | ROM_LOAD( "brickzon.010", 0x00000, 0x10000, CRC(4eba8178) SHA1(9a214a1acacdc124529bc9dde73a8e884fc70293) ) // BRICK MUSIC XILINX PROGRAM 3020 1991,11,14 MUSIC PROGRAM V 2,0 1990.12.14 | |
| 2159 | 2313 | |
| 2160 | 2314 | ROM_REGION( 0x10000, "pcm", 0 ) /* PCM Z80 Code */ |
| 2161 | 2315 | ROM_LOAD( "brickzon.011", 0x00000, 0x10000, CRC(6c54161a) SHA1(ea216d9f45b441acd56b9fed81a83e3bfe299fbd) ) |
| r17743 | r17744 | |
| 2163 | 2317 | ROM_REGION( 0xc0000, "gfx1", ROMREGION_INVERT ) /* Sprites */ |
| 2164 | 2318 | ROM_LOAD( "35", 0x00000, 0x20000, CRC(b463dfcf) SHA1(35c8a4a0c5b62a087a2cb70bc5b7815f5bb2d973) ) |
| 2165 | 2319 | ROM_LOAD( "brickzon.004", 0x20000, 0x20000, CRC(2be5f335) SHA1(dc870a3c5303cb2ea1fea4a25f53db016ed5ecee) ) |
| 2166 | ROM_LOAD( "brickzon.00 | |
| 2320 | ROM_LOAD( "brickzon.003", 0x40000, 0x20000, CRC(2e4f | |
| 2167 | 2321 | ROM_LOAD( "32", 0x60000, 0x20000, CRC(32dbf2dd) SHA1(b9ab8b93a062b871b7f824e4be2f214cc832d585) ) |
| 2168 | 2322 | ROM_LOAD( "brickzon.001", 0x80000, 0x20000, CRC(6970ada9) SHA1(5cfe5dcf25af7aff67ee5d78eb963d598251025f) ) |
| 2169 | ROM_LOAD( "brickzon.00 | |
| 2323 | ROM_LOAD( "brickzon.006", 0xa0000, 0x20000, CRC(bb | |
| 2170 | 2324 | ROM_END |
| 2171 | 2325 | |
| 2172 | 2326 | |
| r17743 | r17744 | |
| 2359 | 2513 | machine().root_device().membank("bank1")->configure_entries(0, 16, machine().root_device().memregion("maincpu")->base() + 0x10000, 0x4000); |
| 2360 | 2514 | } |
| 2361 | 2515 | |
| 2362 | /* Working Games */ | |
| 2363 | GAME( 1988, sranger, 0, rranger, rranger, suna8_state, suna8, ROT0, "SunA", "Super Ranger (v2.0)", 0 ) | |
| 2364 | GAME( 1988, rranger, sranger, rranger, rranger, suna8_state, suna8, ROT0, "SunA (Sharp Image license)", "Rough Ranger (v2.0, unprotected, bootleg?)", 0) //protection is patched out in this. | |
| 2365 | GAME( 1988, srangerb, sranger, rranger, rranger, suna8_state, suna8, ROT0, "bootleg", "Super Ranger (bootleg)", 0 ) | |
| 2366 | GAME( 1988, srangerw, sranger, rranger, rranger, suna8_state, suna8, ROT0, "SunA (WDK license)", "Super Ranger (WDK)", 0 ) | |
| 2367 | GAME( 1988, hardhead, 0, hardhead, hardhead, suna8_state, hardhead, ROT0, "SunA", "Hard Head" , 0) | |
| 2368 | GAME( 1988, hardheadb,hardhead, hardhead, hardhead, suna8_state, hardhedb, ROT0, "bootleg", "Hard Head (bootleg)" , 0) | |
| 2369 | GAME( 1988, pop_hh, hardhead, hardhead, hardhead, suna8_state, hardhedb, ROT0, "bootleg", "Popper (Hard Head bootleg)" , 0) | |
| 2370 | GAME( 1991, hardhea2, 0, hardhea2, hardhea2, suna8_state, hardhea2, ROT0, "SunA", "Hard Head 2 (v2.0)" , 0 ) | |
| 2516 | // Working Games | |
| 2517 | GAME( 1988, sranger, 0, rranger, rranger, suna8_state, suna8, ROT0, "SunA", "Super Ranger (v2.0)", 0 ) | |
| 2518 | GAME( 1988, rranger, sranger, rranger, rranger, suna8_state, suna8, ROT0, "SunA (Sharp Image license)", "Rough Ranger (v2.0, unprotected, bootleg?)", 0) // protection is patched out in this. | |
| 2519 | GAME( 1988, srangerb, sranger, rranger, rranger, suna8_state, suna8, ROT0, "bootleg", "Super Ranger (bootleg)", 0 ) | |
| 2520 | GAME( 1988, srangerw, sranger, rranger, rranger, suna8_state, suna8, ROT0, "SunA (WDK license)", "Super Ranger (WDK)", 0 ) | |
| 2521 | GAME( 1988, hardhead, 0, hardhead, hardhead, suna8_state, hardhead, ROT0, "SunA", "Hard Head", 0 ) | |
| 2522 | GAME( 1988, hardheadb, hardhead, hardhead, hardhead, suna8_state, hardhedb, ROT0, "bootleg", "Hard Head (bootleg)", 0 ) | |
| 2523 | GAME( 1988, pop_hh, hardhead, hardhead, hardhead, suna8_state, hardhedb, ROT0, "bootleg", "Popper (Hard Head bootleg)", 0 ) | |
| 2524 | GAME( 1991, hardhea2, 0, hardhea2, hardhea2, suna8_state, hardhea2, ROT0, "SunA", "Hard Head 2 (v2.0)", 0 ) | |
| 2525 | GAME( 1992, brickzn, 0, brickzn, brickzn, suna8_state, brickzn, ROT90, "SunA", "Brick Zone (v5.0, Joystick)", 0 ) | |
| 2526 | GAME( 1992, brickznv4, brickzn, brickzn, brickzn, suna8_state, brickznv4, ROT90, "SunA", "Brick Zone (v4.0, Spinner)", 0 ) | |
| 2371 | 2527 | |
| 2372 | /* Non Working Games */ | |
| 2373 | GAME( 1989, sparkman, 0, sparkman, sparkman, suna8_state, sparkman, ROT0, "SunA", "Spark Man (v 2.0, set 1)", GAME_NOT_WORKING ) | |
| 2374 | GAME( 1989, sparkmana,sparkman, sparkman, sparkman, suna8_state, sparkman, ROT0, "SunA", "Spark Man (v 2.0, set 2)", GAME_NOT_WORKING ) | |
| 2375 | GAME( 1990, starfigh, 0, starfigh, hardhea2, suna8_state, starfigh, ROT90, "SunA", "Star Fighter (v1)", GAME_NOT_WORKING ) | |
| 2376 | GAME( 1992, brickzn, 0, brickzn, brickzn, suna8_state, brickzn, ROT90, "SunA", "Brick Zone (v5.0)", GAME_NOT_WORKING ) | |
| 2377 | GAME( 1992, brickzn3, brickzn, brickzn, brickzn, suna8_state, brickzn3, ROT90, "SunA", "Brick Zone (v4.0)", GAME_NOT_WORKING ) | |
| 2528 | // Non Working Games | |
| 2529 | GAME( 1989, sparkman, 0, sparkman, sparkman, suna8_state, sparkman, ROT0, "SunA", "Spark Man (v2.0, set 1)", GAME_NOT_WORKING ) | |
| 2530 | GAME( 1989, sparkmana, sparkman, sparkman, sparkman, suna8_state, sparkman, ROT0, "SunA", "Spark Man (v2.0, set 2)", GAME_NOT_WORKING ) | |
| 2531 | GAME( 1990, starfigh, 0, starfigh, hardhea2, suna8_state, starfigh, ROT90, "SunA", "Star Fighter (v1)", GAME_NOT_WORKING ) |
| r17743 | r17744 | |
|---|---|---|
| 898 | 898 | |
| 899 | 899 | WRITE16_MEMBER(subsino2_state::bishjan_sel_w) |
| 900 | 900 | { |
| 901 | /* | |
| 902 | sound writes in service mode: | |
| 903 | 01 88 04 00 (coin in) | |
| 904 | 02 89 04 0v (v = voice = 0..3) | |
| 905 | */ | |
| 901 | 906 | if (ACCESSING_BITS_8_15) |
| 902 | 907 | m_bishjan_sel = data >> 8; |
| 903 | 908 | } |
| r17743 | r17744 | |
| 1475 | 1480 | |
| 1476 | 1481 | PORT_START("SYSTEM") // IN A |
| 1477 | 1482 | PORT_BIT( 0x0001, IP_ACTIVE_LOW, IPT_UNKNOWN ) |
| 1478 | PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_SERVICE ) | |
| 1483 | PORT_BIT( 0x0002, IP_ACTIVE_LOW, IPT_SERVICE ) PORT_IMPULSE(1) // service mode (press twice for inputs) | |
| 1479 | 1484 | PORT_BIT( 0x0004, IP_ACTIVE_HIGH,IPT_SPECIAL ) // hopper sensor |
| 1480 | 1485 | PORT_BIT( 0x0008, IP_ACTIVE_LOW, IPT_SERVICE1 ) // stats |
| 1481 | 1486 | PORT_BIT( 0x0010, IP_ACTIVE_LOW, IPT_SERVICE2 ) // pay out? "hopper empty" |
| r17743 | r17744 | |
|---|---|---|
| 1771 | 1771 | ROMs:(all ROMs are on daughterboard) |
| 1772 | 1772 | 1.1 - Programs (TMS 27C020) |
| 1773 | 1773 | 3.3 / |
| 1774 | (actual label is "Cawaii 1 Ver1. | |
| 1774 | (actual label is "Cawaii 1 Ver 1.0" & "Cawaii 3 Ver 1.0") | |
| 1775 | 1775 | MR97006-01.2 (42pin mask ROM, read as 16M, byte mode) |
| 1776 | 1776 | IC6 is not populated. |
| 1777 | 1777 | IC2 and IC5 have a 0-ohm resistor wired to pin32 (A20 on a 32MBit ROM) |
| Previous | 199869 Revisions | Next |