trunk/src/mame/drivers/cabal.c
| r24637 | r24638 | |
| 49 | 49 | #include "cpu/z80/z80.h" |
| 50 | 50 | #include "sound/2151intf.h" |
| 51 | 51 | #include "sound/msm5205.h" |
| 52 | | #include "audio/seibu.h" |
| 53 | 52 | #include "includes/cabal.h" |
| 54 | | #include "drivlgcy.h" |
| 55 | 53 | |
| 56 | 54 | MACHINE_RESET_MEMBER(cabal_state,cabalbl) |
| 57 | 55 | { |
| r24637 | r24638 | |
| 101 | 99 | |
| 102 | 100 | WRITE16_MEMBER(cabal_state::cabal_sound_irq_trigger_word_w) |
| 103 | 101 | { |
| 104 | | seibu_main_word_w(space,4,data,mem_mask); |
| 102 | m_seibu_sound->main_word_w(space,4,data,mem_mask); |
| 105 | 103 | |
| 106 | 104 | /* spin for a while to let the Z80 read the command, otherwise coins "stick" */ |
| 107 | 105 | space.device().execute().spin_until_time(attotime::from_usec(50)); |
| r24637 | r24638 | |
| 130 | 128 | AM_RANGE(0xc0080, 0xc0081) AM_WRITE(cabal_flipscreen_w) |
| 131 | 129 | AM_RANGE(0xe0000, 0xe07ff) AM_RAM_WRITE(paletteram_xxxxBBBBGGGGRRRR_word_w) AM_SHARE("paletteram") |
| 132 | 130 | AM_RANGE(0xe8008, 0xe8009) AM_WRITE(cabal_sound_irq_trigger_word_w) // fix coin insertion |
| 133 | | AM_RANGE(0xe8000, 0xe800d) AM_READWRITE_LEGACY(seibu_main_word_r, seibu_main_word_w) |
| 131 | AM_RANGE(0xe8000, 0xe800d) AM_DEVREADWRITE("seibu_sound", seibu_sound_device, main_word_r, main_word_w) |
| 134 | 132 | ADDRESS_MAP_END |
| 135 | 133 | |
| 136 | 134 | static ADDRESS_MAP_START( cabalbl_main_map, AS_PROGRAM, 16, cabal_state ) |
| r24637 | r24638 | |
| 176 | 174 | static ADDRESS_MAP_START( sound_map, AS_PROGRAM, 8, cabal_state ) |
| 177 | 175 | AM_RANGE(0x0000, 0x1fff) AM_ROM |
| 178 | 176 | AM_RANGE(0x2000, 0x27ff) AM_RAM |
| 179 | | AM_RANGE(0x4001, 0x4001) AM_WRITE_LEGACY(seibu_irq_clear_w) |
| 180 | | AM_RANGE(0x4002, 0x4002) AM_WRITE_LEGACY(seibu_rst10_ack_w) |
| 181 | | AM_RANGE(0x4003, 0x4003) AM_WRITE_LEGACY(seibu_rst18_ack_w) |
| 182 | | AM_RANGE(0x4005, 0x4006) AM_DEVWRITE_LEGACY("adpcm1", seibu_adpcm_adr_w) |
| 177 | AM_RANGE(0x4001, 0x4001) AM_DEVWRITE("seibu_sound", seibu_sound_device, irq_clear_w) |
| 178 | AM_RANGE(0x4002, 0x4002) AM_DEVWRITE("seibu_sound", seibu_sound_device, rst10_ack_w) |
| 179 | AM_RANGE(0x4003, 0x4003) AM_DEVWRITE("seibu_sound", seibu_sound_device, rst18_ack_w) |
| 180 | AM_RANGE(0x4005, 0x4006) AM_DEVWRITE("adpcm1", seibu_adpcm_device, adr_w) |
| 183 | 181 | AM_RANGE(0x4008, 0x4009) AM_DEVREADWRITE("ymsnd", ym2151_device, read, write) |
| 184 | | AM_RANGE(0x4010, 0x4011) AM_READ_LEGACY(seibu_soundlatch_r) |
| 185 | | AM_RANGE(0x4012, 0x4012) AM_READ_LEGACY(seibu_main_data_pending_r) |
| 182 | AM_RANGE(0x4010, 0x4011) AM_DEVREAD("seibu_sound", seibu_sound_device, soundlatch_r) |
| 183 | AM_RANGE(0x4012, 0x4012) AM_DEVREAD("seibu_sound", seibu_sound_device, main_data_pending_r) |
| 186 | 184 | AM_RANGE(0x4013, 0x4013) AM_READ_PORT("COIN") |
| 187 | | AM_RANGE(0x4018, 0x4019) AM_WRITE_LEGACY(seibu_main_data_w) |
| 188 | | AM_RANGE(0x401a, 0x401a) AM_DEVWRITE_LEGACY("adpcm1", seibu_adpcm_ctl_w) |
| 189 | | AM_RANGE(0x401b, 0x401b) AM_WRITE_LEGACY(seibu_coin_w) |
| 190 | | AM_RANGE(0x6005, 0x6006) AM_DEVWRITE_LEGACY("adpcm2", seibu_adpcm_adr_w) |
| 191 | | AM_RANGE(0x601a, 0x601a) AM_DEVWRITE_LEGACY("adpcm2", seibu_adpcm_ctl_w) |
| 185 | AM_RANGE(0x4018, 0x4019) AM_DEVWRITE("seibu_sound", seibu_sound_device, main_data_w) |
| 186 | AM_RANGE(0x401a, 0x401a) AM_DEVWRITE("adpcm1", seibu_adpcm_device, ctl_w) |
| 187 | AM_RANGE(0x401b, 0x401b) AM_DEVWRITE("seibu_sound", seibu_sound_device, coin_w) |
| 188 | AM_RANGE(0x6005, 0x6006) AM_DEVWRITE("adpcm2", seibu_adpcm_device, adr_w) |
| 189 | AM_RANGE(0x601a, 0x601a) AM_DEVWRITE("adpcm2", seibu_adpcm_device, ctl_w) |
| 192 | 190 | AM_RANGE(0x8000, 0xffff) AM_ROM |
| 193 | 191 | ADDRESS_MAP_END |
| 194 | 192 | |
| r24637 | r24638 | |
| 482 | 480 | MCFG_CPU_ADD("audiocpu", Z80, XTAL_3_579545MHz) /* verified on pcb */ |
| 483 | 481 | MCFG_CPU_PROGRAM_MAP(sound_map) |
| 484 | 482 | |
| 485 | | MCFG_MACHINE_RESET(seibu_sound) |
| 486 | | |
| 487 | 483 | /* video hardware */ |
| 488 | 484 | MCFG_SCREEN_ADD("screen", RASTER) |
| 489 | 485 | MCFG_SCREEN_REFRESH_RATE(59.60) /* verified on pcb */ |
| r24637 | r24638 | |
| 497 | 493 | |
| 498 | 494 | |
| 499 | 495 | /* sound hardware */ |
| 496 | MCFG_SEIBU_SOUND_ADD("seibu_sound") |
| 497 | |
| 500 | 498 | MCFG_SPEAKER_STANDARD_MONO("mono") |
| 501 | 499 | |
| 502 | 500 | MCFG_YM2151_ADD("ymsnd", XTAL_3_579545MHz) /* verified on pcb */ |
| 503 | | MCFG_YM2151_IRQ_HANDLER(WRITELINE(driver_device, member_wrapper_line<seibu_ym2151_irqhandler>)) |
| 501 | MCFG_YM2151_IRQ_HANDLER(DEVWRITELINE("seibu_sound", seibu_sound_device, ym2151_irqhandler)) |
| 504 | 502 | MCFG_SOUND_ROUTE(ALL_OUTPUTS,"mono", 0.80) |
| 505 | 503 | |
| 506 | 504 | MCFG_SOUND_ADD("adpcm1", SEIBU_ADPCM, 8000) /* it should use the msm5205 */ |
| r24637 | r24638 | |
| 525 | 523 | MCFG_CPU_PROGRAM_MAP(cabalbl_sound_map) |
| 526 | 524 | |
| 527 | 525 | /* there are 2x z80s for the ADPCM */ |
| 528 | | MCFG_CPU_ADD("adpcm1", Z80, XTAL_3_579545MHz) /* verified on pcb */ |
| 526 | MCFG_CPU_ADD("adpcm_1", Z80, XTAL_3_579545MHz) /* verified on pcb */ |
| 529 | 527 | MCFG_CPU_PROGRAM_MAP(cabalbl_talk1_map) |
| 530 | 528 | MCFG_CPU_IO_MAP(cabalbl_talk1_portmap) |
| 531 | 529 | MCFG_CPU_PERIODIC_INT_DRIVER(cabal_state, irq0_line_hold, 8000) |
| 532 | 530 | |
| 533 | | MCFG_CPU_ADD("adpcm2", Z80, XTAL_3_579545MHz) /* verified on pcb */ |
| 531 | MCFG_CPU_ADD("adpcm_2", Z80, XTAL_3_579545MHz) /* verified on pcb */ |
| 534 | 532 | MCFG_CPU_PROGRAM_MAP(cabalbl_talk2_map) |
| 535 | 533 | MCFG_CPU_IO_MAP(cabalbl_talk2_portmap) |
| 536 | 534 | MCFG_CPU_PERIODIC_INT_DRIVER(cabal_state, irq0_line_hold, 8000) |
| r24637 | r24638 | |
| 772 | 770 | ROM_LOAD16_BYTE( "cabal_01.bin", 0x60000, 0x10000, CRC(55c44764) SHA1(7fad1f2084664b5b4d1384c8081371b0c79c4f5e) ) |
| 773 | 771 | ROM_LOAD16_BYTE( "cabal_08.bin", 0x60001, 0x10000, CRC(702735c9) SHA1(e4ac799dc85ff5b7c8e578611605989c78f9e8b3) ) |
| 774 | 772 | |
| 775 | | ROM_REGION( 0x10000, "adpcm1", 0 ) |
| 773 | ROM_REGION( 0x10000, "adpcm_1", 0 ) |
| 776 | 774 | ROM_LOAD( "cabal_09.bin", 0x00000, 0x10000, CRC(4ffa7fe3) SHA1(381d8e765a7b94678fb3308965c748bbe9f8e247) ) /* Z80 code/adpcm data */ |
| 777 | 775 | |
| 778 | | ROM_REGION( 0x10000, "adpcm2", 0 ) |
| 776 | ROM_REGION( 0x10000, "adpcm_2", 0 ) |
| 779 | 777 | ROM_LOAD( "cabal_10.bin", 0x00000, 0x10000, CRC(958789b6) SHA1(344c3ee8a1e272b56499e5c0415bb714aec0ddcf) ) /* Z80 code/adpcm data */ |
| 780 | 778 | ROM_END |
| 781 | 779 | |
| r24637 | r24638 | |
| 849 | 847 | |
| 850 | 848 | DRIVER_INIT_MEMBER(cabal_state,cabal) |
| 851 | 849 | { |
| 852 | | seibu_sound_decrypt(machine(),"audiocpu",0x2000); |
| 853 | | seibu_adpcm_decrypt(machine(),"adpcm1"); |
| 854 | | seibu_adpcm_decrypt(machine(),"adpcm2"); |
| 850 | m_seibu_sound->decrypt("audiocpu",0x2000); |
| 851 | m_adpcm1->decrypt("adpcm1"); |
| 852 | m_adpcm2->decrypt("adpcm2"); |
| 855 | 853 | } |
| 856 | 854 | |
| 857 | 855 | DRIVER_INIT_MEMBER(cabal_state,cabalbl2) |
| 858 | 856 | { |
| 859 | 857 | seibu_sound_bootleg("audiocpu",0x2000); |
| 860 | | seibu_adpcm_decrypt(machine(),"adpcm1"); |
| 861 | | seibu_adpcm_decrypt(machine(),"adpcm2"); |
| 858 | m_adpcm1->decrypt("adpcm1"); |
| 859 | m_adpcm2->decrypt("adpcm2"); |
| 862 | 860 | } |
| 863 | 861 | |
| 864 | 862 | |
trunk/src/mame/audio/seibu.c
| r24637 | r24638 | |
| 39 | 39 | #include "sound/2203intf.h" |
| 40 | 40 | #include "sound/okiadpcm.h" |
| 41 | 41 | #include "sound/okim6295.h" |
| 42 | | #include "devlegcy.h" |
| 43 | 42 | |
| 44 | 43 | |
| 44 | |
| 45 | /*************************************************************************** |
| 46 | Seibu Sound System |
| 47 | ***************************************************************************/ |
| 48 | |
| 45 | 49 | /* |
| 46 | 50 | Games using encrypted sound cpu: |
| 47 | 51 | |
| r24637 | r24638 | |
| 69 | 73 | 00002CA2: 17 37 |
| 70 | 74 | */ |
| 71 | 75 | |
| 76 | const device_type SEIBU_SOUND = &device_creator<seibu_sound_device>; |
| 72 | 77 | |
| 78 | seibu_sound_device::seibu_sound_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) |
| 79 | : device_t(mconfig, SEIBU_SOUND, "Seibu Sound System", tag, owner, clock, "seibu_sound", __FILE__), |
| 80 | m_main2sub_pending(0), |
| 81 | m_sub2main_pending(0) |
| 82 | { |
| 83 | } |
| 84 | |
| 85 | //------------------------------------------------- |
| 86 | // device_config_complete - perform any |
| 87 | // operations now that the configuration is |
| 88 | // complete |
| 89 | //------------------------------------------------- |
| 90 | |
| 91 | void seibu_sound_device::device_config_complete() |
| 92 | { |
| 93 | } |
| 94 | |
| 95 | //------------------------------------------------- |
| 96 | // device_start - device-specific startup |
| 97 | //------------------------------------------------- |
| 98 | |
| 99 | void seibu_sound_device::device_start() |
| 100 | { |
| 101 | m_main2sub[0] = m_main2sub[1] = 0; |
| 102 | m_sub2main[0] = m_sub2main[1] = 0; |
| 103 | |
| 104 | save_item(NAME(m_main2sub_pending)); |
| 105 | save_item(NAME(m_sub2main_pending)); |
| 106 | |
| 107 | save_item(NAME(m_main2sub)); |
| 108 | save_item(NAME(m_sub2main)); |
| 109 | |
| 110 | for (int i = 0; i < 2; i++) |
| 111 | { |
| 112 | save_item(NAME(m_main2sub[i]), i); |
| 113 | save_item(NAME(m_sub2main[i]), i); |
| 114 | } |
| 115 | } |
| 116 | |
| 117 | //------------------------------------------------- |
| 118 | // device_reset - device-specific reset |
| 119 | //------------------------------------------------- |
| 120 | |
| 121 | void seibu_sound_device::device_reset() |
| 122 | { |
| 123 | int romlength = machine().root_device().memregion("audiocpu")->bytes(); |
| 124 | UINT8 *rom = machine().root_device().memregion("audiocpu")->base(); |
| 125 | |
| 126 | m_sound_cpu = machine().device("audiocpu"); |
| 127 | update_irq_lines(VECTOR_INIT); |
| 128 | if (romlength > 0x10000) |
| 129 | { |
| 130 | machine().root_device().membank("bank1")->configure_entries(0, (romlength - 0x10000) / 0x8000, rom + 0x10000, 0x8000); |
| 131 | |
| 132 | /* Denjin Makai definitely needs this at start-up, it never writes to the bankswitch */ |
| 133 | machine().root_device().membank("bank1")->set_entry(0); |
| 134 | } |
| 135 | } |
| 136 | |
| 73 | 137 | static UINT8 decrypt_data(int a,int src) |
| 74 | 138 | { |
| 75 | 139 | if ( BIT(a,9) & BIT(a,8)) src ^= 0x80; |
| r24637 | r24638 | |
| 103 | 167 | return src; |
| 104 | 168 | } |
| 105 | 169 | |
| 106 | | void seibu_sound_decrypt(running_machine &machine,const char *cpu,int length) |
| 170 | void seibu_sound_device::decrypt(const char *cpu,int length) |
| 107 | 171 | { |
| 108 | | address_space &space = machine.device(cpu)->memory().space(AS_PROGRAM); |
| 109 | | UINT8 *decrypt = auto_alloc_array(machine, UINT8, length); |
| 110 | | UINT8 *rom = machine.root_device().memregion(cpu)->base(); |
| 172 | address_space &space = machine().device(cpu)->memory().space(AS_PROGRAM); |
| 173 | UINT8 *decrypt = auto_alloc_array_clear(machine(), UINT8, length); |
| 174 | UINT8 *rom = machine().root_device().memregion(cpu)->base(); |
| 111 | 175 | int i; |
| 112 | 176 | |
| 113 | 177 | space.set_decrypted_region(0x0000, (length < 0x10000) ? (length - 1) : 0x1fff, decrypt); |
| r24637 | r24638 | |
| 121 | 185 | } |
| 122 | 186 | |
| 123 | 187 | if (length > 0x10000) |
| 124 | | machine.root_device().membank("bank1")->configure_decrypted_entries(0, (length - 0x10000) / 0x8000, decrypt + 0x10000, 0x8000); |
| 188 | machine().root_device().membank("bank1")->configure_decrypted_entries(0, (length - 0x10000) / 0x8000, decrypt + 0x10000, 0x8000); |
| 125 | 189 | } |
| 126 | 190 | |
| 127 | | |
| 128 | | /***************************************************************************/ |
| 129 | | |
| 130 | | /* |
| 131 | | Handlers for early Seibu/Tad games with dual channel ADPCM |
| 132 | | */ |
| 133 | | |
| 134 | | const seibu_adpcm_interface seibu_adpcm1_intf = |
| 191 | void seibu_sound_device::update_irq_lines(int param) |
| 135 | 192 | { |
| 136 | | "adpcm1" |
| 137 | | }; |
| 138 | | |
| 139 | | const seibu_adpcm_interface seibu_adpcm2_intf = |
| 140 | | { |
| 141 | | "adpcm2" |
| 142 | | }; |
| 143 | | |
| 144 | | struct seibu_adpcm_state |
| 145 | | { |
| 146 | | oki_adpcm_state m_adpcm; |
| 147 | | sound_stream *m_stream; |
| 148 | | UINT32 m_current; |
| 149 | | UINT32 m_end; |
| 150 | | UINT8 m_nibble; |
| 151 | | UINT8 m_playing; |
| 152 | | UINT8 m_allocated; |
| 153 | | UINT8 *m_base; |
| 154 | | }; |
| 155 | | |
| 156 | | static STREAM_UPDATE( seibu_adpcm_callback ) |
| 157 | | { |
| 158 | | seibu_adpcm_state *state = (seibu_adpcm_state *)param; |
| 159 | | stream_sample_t *dest = outputs[0]; |
| 160 | | |
| 161 | | while (state->m_playing && samples > 0) |
| 162 | | { |
| 163 | | int val = (state->m_base[state->m_current] >> state->m_nibble) & 15; |
| 164 | | |
| 165 | | state->m_nibble ^= 4; |
| 166 | | if (state->m_nibble == 4) |
| 167 | | { |
| 168 | | state->m_current++; |
| 169 | | if (state->m_current >= state->m_end) |
| 170 | | state->m_playing = 0; |
| 171 | | } |
| 172 | | |
| 173 | | *dest++ = state->m_adpcm.clock(val) << 4; |
| 174 | | samples--; |
| 175 | | } |
| 176 | | while (samples > 0) |
| 177 | | { |
| 178 | | *dest++ = 0; |
| 179 | | samples--; |
| 180 | | } |
| 181 | | } |
| 182 | | |
| 183 | | static DEVICE_START( seibu_adpcm ) |
| 184 | | { |
| 185 | | running_machine &machine = device->machine(); |
| 186 | | seibu_adpcm_state *state = (seibu_adpcm_state *)downcast<seibu_adpcm_device *>(device)->token(); |
| 187 | | const seibu_adpcm_interface *intf; |
| 188 | | |
| 189 | | intf = (const seibu_adpcm_interface *)device->static_config(); |
| 190 | | |
| 191 | | state->m_playing = 0; |
| 192 | | state->m_stream = device->machine().sound().stream_alloc(*device, 0, 1, device->clock(), state, seibu_adpcm_callback); |
| 193 | | state->m_base = machine.root_device().memregion(intf->rom_region)->base(); |
| 194 | | state->m_adpcm.reset(); |
| 195 | | } |
| 196 | | |
| 197 | | // "decrypt" is a bit flowery here, as it's probably just line-swapping to |
| 198 | | // simplify PCB layout/routing rather than intentional protection, but it |
| 199 | | // still fits, especially since the Z80s for all these games are truly encrypted. |
| 200 | | |
| 201 | | void seibu_adpcm_decrypt(running_machine &machine, const char *region) |
| 202 | | { |
| 203 | | UINT8 *ROM = machine.root_device().memregion(region)->base(); |
| 204 | | int len = machine.root_device().memregion(region)->bytes(); |
| 205 | | int i; |
| 206 | | |
| 207 | | for (i = 0; i < len; i++) |
| 208 | | { |
| 209 | | ROM[i] = BITSWAP8(ROM[i], 7, 5, 3, 1, 6, 4, 2, 0); |
| 210 | | } |
| 211 | | } |
| 212 | | |
| 213 | | WRITE8_DEVICE_HANDLER( seibu_adpcm_adr_w ) |
| 214 | | { |
| 215 | | seibu_adpcm_state *state = (seibu_adpcm_state *)downcast<seibu_adpcm_device *>(device)->token(); |
| 216 | | |
| 217 | | if (state->m_stream) |
| 218 | | state->m_stream->update(); |
| 219 | | if (offset) |
| 220 | | { |
| 221 | | state->m_end = data<<8; |
| 222 | | } |
| 223 | | else |
| 224 | | { |
| 225 | | state->m_current = data<<8; |
| 226 | | state->m_nibble = 4; |
| 227 | | } |
| 228 | | } |
| 229 | | |
| 230 | | WRITE8_DEVICE_HANDLER( seibu_adpcm_ctl_w ) |
| 231 | | { |
| 232 | | seibu_adpcm_state *state = (seibu_adpcm_state *)downcast<seibu_adpcm_device *>(device)->token(); |
| 233 | | |
| 234 | | // sequence is 00 02 01 each time. |
| 235 | | if (state->m_stream) |
| 236 | | state->m_stream->update(); |
| 237 | | switch (data) |
| 238 | | { |
| 239 | | case 0: |
| 240 | | state->m_playing = 0; |
| 241 | | break; |
| 242 | | case 2: |
| 243 | | break; |
| 244 | | case 1: |
| 245 | | state->m_playing = 1; |
| 246 | | break; |
| 247 | | |
| 248 | | } |
| 249 | | } |
| 250 | | |
| 251 | | /***************************************************************************/ |
| 252 | | |
| 253 | | static device_t *sound_cpu; |
| 254 | | |
| 255 | | enum |
| 256 | | { |
| 257 | | VECTOR_INIT, |
| 258 | | RST10_ASSERT, |
| 259 | | RST10_CLEAR, |
| 260 | | RST18_ASSERT, |
| 261 | | RST18_CLEAR |
| 262 | | }; |
| 263 | | |
| 264 | | static void update_irq_lines(running_machine &machine, int param) |
| 265 | | { |
| 266 | 193 | static int irq1,irq2; |
| 267 | 194 | |
| 268 | 195 | switch(param) |
| r24637 | r24638 | |
| 288 | 215 | break; |
| 289 | 216 | } |
| 290 | 217 | |
| 291 | | if ((irq1 & irq2) == 0xff) /* no IRQs pending */ |
| 292 | | sound_cpu->execute().set_input_line(0,CLEAR_LINE); |
| 293 | | else /* IRQ pending */ |
| 294 | | sound_cpu->execute().set_input_line_and_vector(0,ASSERT_LINE,irq1 & irq2); |
| 295 | | } |
| 218 | if (m_sound_cpu != NULL) |
| 219 | if ((irq1 & irq2) == 0xff) /* no IRQs pending */ |
| 220 | m_sound_cpu->execute().set_input_line(0,CLEAR_LINE); |
| 221 | else /* IRQ pending */ |
| 222 | m_sound_cpu->execute().set_input_line_and_vector(0,ASSERT_LINE,irq1 & irq2); |
| 223 | else |
| 224 | return; |
| 225 | } |
| 226 | |
| 296 | 227 | |
| 297 | | WRITE8_HANDLER( seibu_irq_clear_w ) |
| 228 | WRITE8_MEMBER( seibu_sound_device::irq_clear_w ) |
| 298 | 229 | { |
| 299 | 230 | /* Denjin Makai and SD Gundam doesn't like this, it's tied to the rst18 ack ONLY so it could be related to it. */ |
| 300 | | //update_irq_lines(space.machine(), VECTOR_INIT); |
| 231 | //update_irq_lines(VECTOR_INIT); |
| 301 | 232 | } |
| 302 | 233 | |
| 303 | | WRITE8_HANDLER( seibu_rst10_ack_w ) |
| 234 | WRITE8_MEMBER( seibu_sound_device::rst10_ack_w ) |
| 304 | 235 | { |
| 305 | 236 | /* Unused for now */ |
| 306 | 237 | } |
| 307 | 238 | |
| 308 | | WRITE8_HANDLER( seibu_rst18_ack_w ) |
| 239 | WRITE8_MEMBER( seibu_sound_device::rst18_ack_w ) |
| 309 | 240 | { |
| 310 | | update_irq_lines(space.machine(), RST18_CLEAR); |
| 241 | update_irq_lines(RST18_CLEAR); |
| 311 | 242 | } |
| 312 | 243 | |
| 313 | | void seibu_ym3812_irqhandler(device_t *device, int linestate) |
| 244 | void seibu_sound_device::ym3812_irqhandler(int linestate) |
| 314 | 245 | { |
| 315 | | update_irq_lines(device->machine(), linestate ? RST10_ASSERT : RST10_CLEAR); |
| 246 | update_irq_lines(linestate ? RST10_ASSERT : RST10_CLEAR); |
| 316 | 247 | } |
| 317 | 248 | |
| 318 | | WRITE_LINE_DEVICE_HANDLER( seibu_ym2151_irqhandler ) |
| 249 | WRITE_LINE_MEMBER( seibu_sound_device::ym2151_irqhandler ) |
| 319 | 250 | { |
| 320 | | update_irq_lines(device->machine(), state ? RST10_ASSERT : RST10_CLEAR); |
| 251 | update_irq_lines(state ? RST10_ASSERT : RST10_CLEAR); |
| 321 | 252 | } |
| 322 | 253 | |
| 323 | | void seibu_ym2203_irqhandler(device_t *device, int linestate) |
| 254 | void seibu_sound_device::ym2203_irqhandler(int linestate) |
| 324 | 255 | { |
| 325 | | update_irq_lines(device->machine(), linestate ? RST10_ASSERT : RST10_CLEAR); |
| 256 | update_irq_lines(linestate ? RST10_ASSERT : RST10_CLEAR); |
| 326 | 257 | } |
| 327 | 258 | |
| 328 | | /***************************************************************************/ |
| 329 | | |
| 330 | | MACHINE_RESET( seibu_sound ) |
| 259 | WRITE8_MEMBER( seibu_sound_device::bank_w ) |
| 331 | 260 | { |
| 332 | | int romlength = machine.root_device().memregion("audiocpu")->bytes(); |
| 333 | | UINT8 *rom = machine.root_device().memregion("audiocpu")->base(); |
| 334 | | |
| 335 | | sound_cpu = machine.device("audiocpu"); |
| 336 | | update_irq_lines(machine, VECTOR_INIT); |
| 337 | | if (romlength > 0x10000) |
| 338 | | { |
| 339 | | machine.root_device().membank("bank1")->configure_entries(0, (romlength - 0x10000) / 0x8000, rom + 0x10000, 0x8000); |
| 340 | | |
| 341 | | /* Denjin Makai definitely needs this at start-up, it never writes to the bankswitch */ |
| 342 | | machine.root_device().membank("bank1")->set_entry(0); |
| 343 | | } |
| 344 | | } |
| 345 | | |
| 346 | | /***************************************************************************/ |
| 347 | | |
| 348 | | static UINT8 main2sub[2],sub2main[2]; |
| 349 | | static int main2sub_pending,sub2main_pending; |
| 350 | | |
| 351 | | WRITE8_HANDLER( seibu_bank_w ) |
| 352 | | { |
| 353 | 261 | space.machine().root_device().membank("bank1")->set_entry(data & 1); |
| 354 | 262 | } |
| 355 | 263 | |
| 356 | | WRITE8_HANDLER( seibu_coin_w ) |
| 264 | WRITE8_MEMBER( seibu_sound_device::coin_w ) |
| 357 | 265 | { |
| 358 | 266 | coin_counter_w(space.machine(), 0,data & 1); |
| 359 | 267 | coin_counter_w(space.machine(), 1,data & 2); |
| 360 | 268 | } |
| 361 | 269 | |
| 362 | | READ8_HANDLER( seibu_soundlatch_r ) |
| 270 | READ8_MEMBER( seibu_sound_device::soundlatch_r ) |
| 363 | 271 | { |
| 364 | | return main2sub[offset]; |
| 272 | return m_main2sub[offset]; |
| 365 | 273 | } |
| 366 | 274 | |
| 367 | | READ8_HANDLER( seibu_main_data_pending_r ) |
| 275 | READ8_MEMBER( seibu_sound_device::main_data_pending_r ) |
| 368 | 276 | { |
| 369 | | return sub2main_pending ? 1 : 0; |
| 277 | return m_sub2main_pending ? 1 : 0; |
| 370 | 278 | } |
| 371 | 279 | |
| 372 | | WRITE8_HANDLER( seibu_main_data_w ) |
| 280 | WRITE8_MEMBER( seibu_sound_device::main_data_w ) |
| 373 | 281 | { |
| 374 | | sub2main[offset] = data; |
| 282 | m_sub2main[offset] = data; |
| 375 | 283 | } |
| 376 | 284 | |
| 377 | | static WRITE8_HANDLER( seibu_pending_w ) |
| 285 | WRITE8_MEMBER( seibu_sound_device::pending_w ) |
| 378 | 286 | { |
| 379 | 287 | /* just a guess */ |
| 380 | | main2sub_pending = 0; |
| 381 | | sub2main_pending = 1; |
| 288 | m_main2sub_pending = 0; |
| 289 | m_sub2main_pending = 1; |
| 382 | 290 | } |
| 383 | 291 | |
| 384 | | READ16_HANDLER( seibu_main_word_r ) |
| 292 | READ16_MEMBER( seibu_sound_device::main_word_r ) |
| 385 | 293 | { |
| 386 | 294 | //logerror("%06x: seibu_main_word_r(%x)\n",space.device().safe_pc(),offset); |
| 387 | 295 | switch (offset) |
| 388 | 296 | { |
| 389 | 297 | case 2: |
| 390 | 298 | case 3: |
| 391 | | return sub2main[offset-2]; |
| 299 | return m_sub2main[offset-2]; |
| 392 | 300 | case 5: |
| 393 | | return main2sub_pending ? 1 : 0; |
| 301 | return m_main2sub_pending ? 1 : 0; |
| 394 | 302 | default: |
| 395 | 303 | //logerror("%06x: seibu_main_word_r(%x)\n",space.device().safe_pc(),offset); |
| 396 | 304 | return 0xffff; |
| 397 | 305 | } |
| 398 | 306 | } |
| 399 | 307 | |
| 400 | | WRITE16_HANDLER( seibu_main_word_w ) |
| 308 | WRITE16_MEMBER( seibu_sound_device::main_word_w ) |
| 401 | 309 | { |
| 402 | 310 | //printf("%06x: seibu_main_word_w(%x,%02x)\n",space.device().safe_pc(),offset,data); |
| 403 | 311 | if (ACCESSING_BITS_0_7) |
| r24637 | r24638 | |
| 406 | 314 | { |
| 407 | 315 | case 0: |
| 408 | 316 | case 1: |
| 409 | | main2sub[offset] = data; |
| 317 | m_main2sub[offset] = data; |
| 410 | 318 | break; |
| 411 | 319 | case 4: |
| 412 | | update_irq_lines(space.machine(), RST18_ASSERT); |
| 320 | update_irq_lines(RST18_ASSERT); |
| 413 | 321 | break; |
| 414 | 322 | case 2: //Sengoku Mahjong writes here |
| 415 | 323 | case 6: |
| 416 | 324 | /* just a guess */ |
| 417 | | sub2main_pending = 0; |
| 418 | | main2sub_pending = 1; |
| 325 | m_sub2main_pending = 0; |
| 326 | m_main2sub_pending = 1; |
| 419 | 327 | break; |
| 420 | 328 | default: |
| 421 | 329 | //logerror("%06x: seibu_main_word_w(%x,%02x)\n",space.device().safe_pc(),offset,data); |
| r24637 | r24638 | |
| 424 | 332 | } |
| 425 | 333 | } |
| 426 | 334 | |
| 427 | | READ8_HANDLER( seibu_main_v30_r ) |
| 335 | READ8_MEMBER( seibu_sound_device::main_v30_r ) |
| 428 | 336 | { |
| 429 | | return seibu_main_word_r(space,offset/2,0xffff) >> (8 * (offset & 1)); |
| 337 | return main_word_r(space,offset/2,0xffff) >> (8 * (offset & 1)); |
| 430 | 338 | } |
| 431 | 339 | |
| 432 | | WRITE8_HANDLER( seibu_main_v30_w ) |
| 340 | WRITE8_MEMBER( seibu_sound_device::main_v30_w ) |
| 433 | 341 | { |
| 434 | | seibu_main_word_w(space,offset/2,data << (8 * (offset & 1)),0x00ff << (8 * (offset & 1))); |
| 342 | main_word_w(space,offset/2,data << (8 * (offset & 1)),0x00ff << (8 * (offset & 1))); |
| 435 | 343 | } |
| 436 | 344 | |
| 437 | | WRITE16_HANDLER( seibu_main_mustb_w ) |
| 345 | WRITE16_MEMBER( seibu_sound_device::main_mustb_w ) |
| 438 | 346 | { |
| 439 | | main2sub[0] = data&0xff; |
| 440 | | main2sub[1] = data>>8; |
| 347 | m_main2sub[0] = data&0xff; |
| 348 | m_main2sub[1] = data>>8; |
| 441 | 349 | |
| 442 | 350 | // logerror("seibu_main_mustb_w: %x -> %x %x\n", data, main2sub[0], main2sub[1]); |
| 443 | 351 | |
| 444 | | update_irq_lines(space.machine(), RST18_ASSERT); |
| 352 | update_irq_lines(RST18_ASSERT); |
| 445 | 353 | } |
| 446 | 354 | |
| 447 | 355 | /***************************************************************************/ |
| r24637 | r24638 | |
| 458 | 366 | ADDRESS_MAP_START( seibu_sound_map, AS_PROGRAM, 8, driver_device ) |
| 459 | 367 | AM_RANGE(0x0000, 0x1fff) AM_ROM |
| 460 | 368 | AM_RANGE(0x2000, 0x27ff) AM_RAM |
| 461 | | AM_RANGE(0x4000, 0x4000) AM_WRITE_LEGACY(seibu_pending_w) |
| 462 | | AM_RANGE(0x4001, 0x4001) AM_WRITE_LEGACY(seibu_irq_clear_w) |
| 463 | | AM_RANGE(0x4002, 0x4002) AM_WRITE_LEGACY(seibu_rst10_ack_w) |
| 464 | | AM_RANGE(0x4003, 0x4003) AM_WRITE_LEGACY(seibu_rst18_ack_w) |
| 465 | | AM_RANGE(0x4007, 0x4007) AM_WRITE_LEGACY(seibu_bank_w) |
| 369 | AM_RANGE(0x4000, 0x4000) AM_DEVWRITE("seibu_sound", seibu_sound_device, pending_w) |
| 370 | AM_RANGE(0x4001, 0x4001) AM_DEVWRITE("seibu_sound", seibu_sound_device, irq_clear_w) |
| 371 | AM_RANGE(0x4002, 0x4002) AM_DEVWRITE("seibu_sound", seibu_sound_device, rst10_ack_w) |
| 372 | AM_RANGE(0x4003, 0x4003) AM_DEVWRITE("seibu_sound", seibu_sound_device, rst18_ack_w) |
| 373 | AM_RANGE(0x4007, 0x4007) AM_DEVWRITE("seibu_sound", seibu_sound_device, bank_w) |
| 466 | 374 | AM_RANGE(0x4008, 0x4009) AM_DEVREADWRITE("ymsnd", ym3812_device, read, write) |
| 467 | | AM_RANGE(0x4010, 0x4011) AM_READ_LEGACY(seibu_soundlatch_r) |
| 468 | | AM_RANGE(0x4012, 0x4012) AM_READ_LEGACY(seibu_main_data_pending_r) |
| 375 | AM_RANGE(0x4010, 0x4011) AM_DEVREAD("seibu_sound", seibu_sound_device, soundlatch_r) |
| 376 | AM_RANGE(0x4012, 0x4012) AM_DEVREAD("seibu_sound", seibu_sound_device, main_data_pending_r) |
| 469 | 377 | AM_RANGE(0x4013, 0x4013) AM_READ_PORT("COIN") |
| 470 | | AM_RANGE(0x4018, 0x4019) AM_WRITE_LEGACY(seibu_main_data_w) |
| 471 | | AM_RANGE(0x401b, 0x401b) AM_WRITE_LEGACY(seibu_coin_w) |
| 378 | AM_RANGE(0x4018, 0x4019) AM_DEVWRITE("seibu_sound", seibu_sound_device, main_data_w) |
| 379 | AM_RANGE(0x401b, 0x401b) AM_DEVWRITE("seibu_sound", seibu_sound_device, coin_w) |
| 472 | 380 | AM_RANGE(0x6000, 0x6000) AM_DEVREADWRITE("oki", okim6295_device, read, write) |
| 473 | 381 | AM_RANGE(0x8000, 0xffff) AM_ROMBANK("bank1") |
| 474 | 382 | ADDRESS_MAP_END |
| r24637 | r24638 | |
| 476 | 384 | ADDRESS_MAP_START( seibu2_airraid_sound_map, AS_PROGRAM, 8, driver_device ) |
| 477 | 385 | AM_RANGE(0x0000, 0x1fff) AM_ROM |
| 478 | 386 | AM_RANGE(0x2000, 0x27ff) AM_RAM |
| 479 | | AM_RANGE(0x4000, 0x4000) AM_WRITE_LEGACY(seibu_pending_w) |
| 480 | | AM_RANGE(0x4001, 0x4001) AM_WRITE_LEGACY(seibu_irq_clear_w) |
| 481 | | AM_RANGE(0x4002, 0x4002) AM_WRITE_LEGACY(seibu_rst10_ack_w) |
| 482 | | AM_RANGE(0x4003, 0x4003) AM_WRITE_LEGACY(seibu_rst18_ack_w) |
| 387 | AM_RANGE(0x4000, 0x4000) AM_DEVWRITE("seibu_sound", seibu_sound_device, pending_w) |
| 388 | AM_RANGE(0x4001, 0x4001) AM_DEVWRITE("seibu_sound", seibu_sound_device, irq_clear_w) |
| 389 | AM_RANGE(0x4002, 0x4002) AM_DEVWRITE("seibu_sound", seibu_sound_device, rst10_ack_w) |
| 390 | AM_RANGE(0x4003, 0x4003) AM_DEVWRITE("seibu_sound", seibu_sound_device, rst18_ack_w) |
| 483 | 391 | AM_RANGE(0x4007, 0x4007) AM_WRITENOP // bank, always 0 |
| 484 | 392 | AM_RANGE(0x4008, 0x4009) AM_DEVREADWRITE("ymsnd", ym2151_device, read, write) |
| 485 | | AM_RANGE(0x4010, 0x4011) AM_READ_LEGACY(seibu_soundlatch_r) |
| 486 | | AM_RANGE(0x4012, 0x4012) AM_READ_LEGACY(seibu_main_data_pending_r) |
| 393 | AM_RANGE(0x4010, 0x4011) AM_DEVREAD("seibu_sound", seibu_sound_device, soundlatch_r) |
| 394 | AM_RANGE(0x4012, 0x4012) AM_DEVREAD("seibu_sound", seibu_sound_device, main_data_pending_r) |
| 487 | 395 | AM_RANGE(0x4013, 0x4013) AM_READ_PORT("COIN") |
| 488 | | AM_RANGE(0x4018, 0x4019) AM_WRITE_LEGACY(seibu_main_data_w) |
| 489 | | AM_RANGE(0x401b, 0x401b) AM_WRITE_LEGACY(seibu_coin_w) |
| 396 | AM_RANGE(0x4018, 0x4019) AM_DEVWRITE("seibu_sound", seibu_sound_device, main_data_w) |
| 397 | AM_RANGE(0x401b, 0x401b) AM_DEVWRITE("seibu_sound", seibu_sound_device, coin_w) |
| 490 | 398 | // AM_RANGE(0x6000, 0x6000) AM_DEVREADWRITE("oki", okim6295_device, read, write) |
| 491 | 399 | AM_RANGE(0x8000, 0xffff) AM_ROM |
| 492 | 400 | ADDRESS_MAP_END |
| r24637 | r24638 | |
| 494 | 402 | ADDRESS_MAP_START( seibu2_sound_map, AS_PROGRAM, 8, driver_device ) |
| 495 | 403 | AM_RANGE(0x0000, 0x1fff) AM_ROM |
| 496 | 404 | AM_RANGE(0x2000, 0x27ff) AM_RAM |
| 497 | | AM_RANGE(0x4000, 0x4000) AM_WRITE_LEGACY(seibu_pending_w) |
| 498 | | AM_RANGE(0x4001, 0x4001) AM_WRITE_LEGACY(seibu_irq_clear_w) |
| 499 | | AM_RANGE(0x4002, 0x4002) AM_WRITE_LEGACY(seibu_rst10_ack_w) |
| 500 | | AM_RANGE(0x4003, 0x4003) AM_WRITE_LEGACY(seibu_rst18_ack_w) |
| 501 | | AM_RANGE(0x4007, 0x4007) AM_WRITE_LEGACY(seibu_bank_w) |
| 405 | AM_RANGE(0x4000, 0x4000) AM_DEVWRITE("seibu_sound", seibu_sound_device, pending_w) |
| 406 | AM_RANGE(0x4001, 0x4001) AM_DEVWRITE("seibu_sound", seibu_sound_device, irq_clear_w) |
| 407 | AM_RANGE(0x4002, 0x4002) AM_DEVWRITE("seibu_sound", seibu_sound_device, rst10_ack_w) |
| 408 | AM_RANGE(0x4003, 0x4003) AM_DEVWRITE("seibu_sound", seibu_sound_device, rst18_ack_w) |
| 409 | AM_RANGE(0x4007, 0x4007) AM_DEVWRITE("seibu_sound", seibu_sound_device, bank_w) |
| 502 | 410 | AM_RANGE(0x4008, 0x4009) AM_DEVREADWRITE("ymsnd", ym2151_device, read, write) |
| 503 | | AM_RANGE(0x4010, 0x4011) AM_READ_LEGACY(seibu_soundlatch_r) |
| 504 | | AM_RANGE(0x4012, 0x4012) AM_READ_LEGACY(seibu_main_data_pending_r) |
| 411 | AM_RANGE(0x4010, 0x4011) AM_DEVREAD("seibu_sound", seibu_sound_device, soundlatch_r) |
| 412 | AM_RANGE(0x4012, 0x4012) AM_DEVREAD("seibu_sound", seibu_sound_device, main_data_pending_r) |
| 505 | 413 | AM_RANGE(0x4013, 0x4013) AM_READ_PORT("COIN") |
| 506 | | AM_RANGE(0x4018, 0x4019) AM_WRITE_LEGACY(seibu_main_data_w) |
| 507 | | AM_RANGE(0x401b, 0x401b) AM_WRITE_LEGACY(seibu_coin_w) |
| 414 | AM_RANGE(0x4018, 0x4019) AM_DEVWRITE("seibu_sound", seibu_sound_device, main_data_w) |
| 415 | AM_RANGE(0x401b, 0x401b) AM_DEVWRITE("seibu_sound", seibu_sound_device, coin_w) |
| 508 | 416 | AM_RANGE(0x6000, 0x6000) AM_DEVREADWRITE("oki", okim6295_device, read, write) |
| 509 | 417 | AM_RANGE(0x8000, 0xffff) AM_ROMBANK("bank1") |
| 510 | 418 | ADDRESS_MAP_END |
| r24637 | r24638 | |
| 512 | 420 | ADDRESS_MAP_START( seibu2_raiden2_sound_map, AS_PROGRAM, 8, driver_device ) |
| 513 | 421 | AM_RANGE(0x0000, 0x1fff) AM_ROM |
| 514 | 422 | AM_RANGE(0x2000, 0x27ff) AM_RAM |
| 515 | | AM_RANGE(0x4000, 0x4000) AM_WRITE_LEGACY(seibu_pending_w) |
| 516 | | AM_RANGE(0x4001, 0x4001) AM_WRITE_LEGACY(seibu_irq_clear_w) |
| 517 | | AM_RANGE(0x4002, 0x4002) AM_WRITE_LEGACY(seibu_rst10_ack_w) |
| 518 | | AM_RANGE(0x4003, 0x4003) AM_WRITE_LEGACY(seibu_rst18_ack_w) |
| 423 | AM_RANGE(0x4000, 0x4000) AM_DEVWRITE("seibu_sound", seibu_sound_device, pending_w) |
| 424 | AM_RANGE(0x4001, 0x4001) AM_DEVWRITE("seibu_sound", seibu_sound_device, irq_clear_w) |
| 425 | AM_RANGE(0x4002, 0x4002) AM_DEVWRITE("seibu_sound", seibu_sound_device, rst10_ack_w) |
| 426 | AM_RANGE(0x4003, 0x4003) AM_DEVWRITE("seibu_sound", seibu_sound_device, rst18_ack_w) |
| 519 | 427 | AM_RANGE(0x4008, 0x4009) AM_DEVREADWRITE("ymsnd", ym2151_device, read, write) |
| 520 | | AM_RANGE(0x4010, 0x4011) AM_READ_LEGACY(seibu_soundlatch_r) |
| 521 | | AM_RANGE(0x4012, 0x4012) AM_READ_LEGACY(seibu_main_data_pending_r) |
| 428 | AM_RANGE(0x4010, 0x4011) AM_DEVREAD("seibu_sound", seibu_sound_device, soundlatch_r) |
| 429 | AM_RANGE(0x4012, 0x4012) AM_DEVREAD("seibu_sound", seibu_sound_device, main_data_pending_r) |
| 522 | 430 | AM_RANGE(0x4013, 0x4013) AM_READ_PORT("COIN") |
| 523 | | AM_RANGE(0x4018, 0x4019) AM_WRITE_LEGACY(seibu_main_data_w) |
| 524 | | AM_RANGE(0x401a, 0x401a) AM_WRITE_LEGACY(seibu_bank_w) |
| 525 | | AM_RANGE(0x401b, 0x401b) AM_WRITE_LEGACY(seibu_coin_w) |
| 431 | AM_RANGE(0x4018, 0x4019) AM_DEVWRITE("seibu_sound", seibu_sound_device, main_data_w) |
| 432 | AM_RANGE(0x401a, 0x401a) AM_DEVWRITE("seibu_sound", seibu_sound_device, bank_w) |
| 433 | AM_RANGE(0x401b, 0x401b) AM_DEVWRITE("seibu_sound", seibu_sound_device, coin_w) |
| 526 | 434 | AM_RANGE(0x6000, 0x6000) AM_DEVREADWRITE("oki1", okim6295_device, read, write) |
| 527 | 435 | AM_RANGE(0x6002, 0x6002) AM_DEVREADWRITE("oki2", okim6295_device, read, write) |
| 528 | 436 | AM_RANGE(0x8000, 0xffff) AM_ROMBANK("bank1") |
| r24637 | r24638 | |
| 533 | 441 | ADDRESS_MAP_START( seibu_newzeroteam_sound_map, AS_PROGRAM, 8, driver_device ) |
| 534 | 442 | AM_RANGE(0x0000, 0x1fff) AM_ROM |
| 535 | 443 | AM_RANGE(0x2000, 0x27ff) AM_RAM |
| 536 | | AM_RANGE(0x4000, 0x4000) AM_WRITE_LEGACY(seibu_pending_w) |
| 537 | | AM_RANGE(0x4001, 0x4001) AM_WRITE_LEGACY(seibu_irq_clear_w) |
| 538 | | AM_RANGE(0x4002, 0x4002) AM_WRITE_LEGACY(seibu_rst10_ack_w) |
| 539 | | AM_RANGE(0x4003, 0x4003) AM_WRITE_LEGACY(seibu_rst18_ack_w) |
| 444 | AM_RANGE(0x4000, 0x4000) AM_DEVWRITE("seibu_sound", seibu_sound_device, pending_w) |
| 445 | AM_RANGE(0x4001, 0x4001) AM_DEVWRITE("seibu_sound", seibu_sound_device, irq_clear_w) |
| 446 | AM_RANGE(0x4002, 0x4002) AM_DEVWRITE("seibu_sound", seibu_sound_device, rst10_ack_w) |
| 447 | AM_RANGE(0x4003, 0x4003) AM_DEVWRITE("seibu_sound", seibu_sound_device, rst18_ack_w) |
| 540 | 448 | AM_RANGE(0x4008, 0x4009) AM_DEVREADWRITE("ymsnd", ym3812_device, read, write) |
| 541 | | AM_RANGE(0x4010, 0x4011) AM_READ_LEGACY(seibu_soundlatch_r) |
| 542 | | AM_RANGE(0x4012, 0x4012) AM_READ_LEGACY(seibu_main_data_pending_r) |
| 449 | AM_RANGE(0x4010, 0x4011) AM_DEVREAD("seibu_sound", seibu_sound_device, soundlatch_r) |
| 450 | AM_RANGE(0x4012, 0x4012) AM_DEVREAD("seibu_sound", seibu_sound_device, main_data_pending_r) |
| 543 | 451 | AM_RANGE(0x4013, 0x4013) AM_READ_PORT("COIN") |
| 544 | | AM_RANGE(0x4018, 0x4019) AM_WRITE_LEGACY(seibu_main_data_w) |
| 545 | | AM_RANGE(0x401a, 0x401a) AM_WRITE_LEGACY(seibu_bank_w) |
| 546 | | AM_RANGE(0x401b, 0x401b) AM_WRITE_LEGACY(seibu_coin_w) |
| 452 | AM_RANGE(0x4018, 0x4019) AM_DEVWRITE("seibu_sound", seibu_sound_device, main_data_w) |
| 453 | AM_RANGE(0x401a, 0x401a) AM_DEVWRITE("seibu_sound", seibu_sound_device, bank_w) |
| 454 | AM_RANGE(0x401b, 0x401b) AM_DEVWRITE("seibu_sound", seibu_sound_device, coin_w) |
| 547 | 455 | AM_RANGE(0x6000, 0x6000) AM_DEVREADWRITE("oki", okim6295_device, read, write) |
| 548 | 456 | AM_RANGE(0x8000, 0xffff) AM_ROMBANK("bank1") |
| 549 | 457 | ADDRESS_MAP_END |
| r24637 | r24638 | |
| 551 | 459 | ADDRESS_MAP_START( seibu3_sound_map, AS_PROGRAM, 8, driver_device ) |
| 552 | 460 | AM_RANGE(0x0000, 0x1fff) AM_ROM |
| 553 | 461 | AM_RANGE(0x2000, 0x27ff) AM_RAM |
| 554 | | AM_RANGE(0x4000, 0x4000) AM_WRITE_LEGACY(seibu_pending_w) |
| 555 | | AM_RANGE(0x4001, 0x4001) AM_WRITE_LEGACY(seibu_irq_clear_w) |
| 556 | | AM_RANGE(0x4002, 0x4002) AM_WRITE_LEGACY(seibu_rst10_ack_w) |
| 557 | | AM_RANGE(0x4003, 0x4003) AM_WRITE_LEGACY(seibu_rst18_ack_w) |
| 558 | | AM_RANGE(0x4007, 0x4007) AM_WRITE_LEGACY(seibu_bank_w) |
| 462 | AM_RANGE(0x4000, 0x4000) AM_DEVWRITE("seibu_sound", seibu_sound_device, pending_w) |
| 463 | AM_RANGE(0x4001, 0x4001) AM_DEVWRITE("seibu_sound", seibu_sound_device, irq_clear_w) |
| 464 | AM_RANGE(0x4002, 0x4002) AM_DEVWRITE("seibu_sound", seibu_sound_device, rst10_ack_w) |
| 465 | AM_RANGE(0x4003, 0x4003) AM_DEVWRITE("seibu_sound", seibu_sound_device, rst18_ack_w) |
| 466 | AM_RANGE(0x4007, 0x4007) AM_DEVWRITE("seibu_sound", seibu_sound_device, bank_w) |
| 559 | 467 | AM_RANGE(0x4008, 0x4009) AM_DEVREADWRITE("ym1", ym2203_device, read, write) |
| 560 | | AM_RANGE(0x4010, 0x4011) AM_READ_LEGACY(seibu_soundlatch_r) |
| 561 | | AM_RANGE(0x4012, 0x4012) AM_READ_LEGACY(seibu_main_data_pending_r) |
| 468 | AM_RANGE(0x4010, 0x4011) AM_DEVREAD("seibu_sound", seibu_sound_device, soundlatch_r) |
| 469 | AM_RANGE(0x4012, 0x4012) AM_DEVREAD("seibu_sound", seibu_sound_device, main_data_pending_r) |
| 562 | 470 | AM_RANGE(0x4013, 0x4013) AM_READ_PORT("COIN") |
| 563 | | AM_RANGE(0x4018, 0x4019) AM_WRITE_LEGACY(seibu_main_data_w) |
| 564 | | AM_RANGE(0x401b, 0x401b) AM_WRITE_LEGACY(seibu_coin_w) |
| 471 | AM_RANGE(0x4018, 0x4019) AM_DEVWRITE("seibu_sound", seibu_sound_device, main_data_w) |
| 472 | AM_RANGE(0x401b, 0x401b) AM_DEVWRITE("seibu_sound", seibu_sound_device, coin_w) |
| 565 | 473 | AM_RANGE(0x6008, 0x6009) AM_DEVREADWRITE("ym2", ym2203_device, read, write) |
| 566 | 474 | AM_RANGE(0x8000, 0xffff) AM_ROMBANK("bank1") |
| 567 | 475 | ADDRESS_MAP_END |
| r24637 | r24638 | |
| 569 | 477 | ADDRESS_MAP_START( seibu3_adpcm_sound_map, AS_PROGRAM, 8, driver_device ) |
| 570 | 478 | AM_RANGE(0x0000, 0x1fff) AM_ROM |
| 571 | 479 | AM_RANGE(0x2000, 0x27ff) AM_RAM |
| 572 | | AM_RANGE(0x4000, 0x4000) AM_WRITE_LEGACY(seibu_pending_w) |
| 573 | | AM_RANGE(0x4001, 0x4001) AM_WRITE_LEGACY(seibu_irq_clear_w) |
| 574 | | AM_RANGE(0x4002, 0x4002) AM_WRITE_LEGACY(seibu_rst10_ack_w) |
| 575 | | AM_RANGE(0x4003, 0x4003) AM_WRITE_LEGACY(seibu_rst18_ack_w) |
| 576 | | AM_RANGE(0x4005, 0x4006) AM_DEVWRITE_LEGACY("adpcm1", seibu_adpcm_adr_w) |
| 577 | | AM_RANGE(0x4007, 0x4007) AM_WRITE_LEGACY(seibu_bank_w) |
| 480 | AM_RANGE(0x4000, 0x4000) AM_DEVWRITE("seibu_sound", seibu_sound_device, pending_w) |
| 481 | AM_RANGE(0x4001, 0x4001) AM_DEVWRITE("seibu_sound", seibu_sound_device, irq_clear_w) |
| 482 | AM_RANGE(0x4002, 0x4002) AM_DEVWRITE("seibu_sound", seibu_sound_device, rst10_ack_w) |
| 483 | AM_RANGE(0x4003, 0x4003) AM_DEVWRITE("seibu_sound", seibu_sound_device, rst18_ack_w) |
| 484 | AM_RANGE(0x4005, 0x4006) AM_DEVWRITE("adpcm1", seibu_adpcm_device, adr_w) |
| 485 | AM_RANGE(0x4007, 0x4007) AM_DEVWRITE("seibu_sound", seibu_sound_device, bank_w) |
| 578 | 486 | AM_RANGE(0x4008, 0x4009) AM_DEVREADWRITE("ym1", ym2203_device, read, write) |
| 579 | | AM_RANGE(0x4010, 0x4011) AM_READ_LEGACY(seibu_soundlatch_r) |
| 580 | | AM_RANGE(0x4012, 0x4012) AM_READ_LEGACY(seibu_main_data_pending_r) |
| 487 | AM_RANGE(0x4010, 0x4011) AM_DEVREAD("seibu_sound", seibu_sound_device, soundlatch_r) |
| 488 | AM_RANGE(0x4012, 0x4012) AM_DEVREAD("seibu_sound", seibu_sound_device, main_data_pending_r) |
| 581 | 489 | AM_RANGE(0x4013, 0x4013) AM_READ_PORT("COIN") |
| 582 | | AM_RANGE(0x4018, 0x4019) AM_WRITE_LEGACY(seibu_main_data_w) |
| 583 | | AM_RANGE(0x401a, 0x401a) AM_DEVWRITE_LEGACY("adpcm1", seibu_adpcm_ctl_w) |
| 584 | | AM_RANGE(0x401b, 0x401b) AM_WRITE_LEGACY(seibu_coin_w) |
| 585 | | AM_RANGE(0x6005, 0x6006) AM_DEVWRITE_LEGACY("adpcm2", seibu_adpcm_adr_w) |
| 490 | AM_RANGE(0x4018, 0x4019) AM_DEVWRITE("seibu_sound", seibu_sound_device, main_data_w) |
| 491 | AM_RANGE(0x401a, 0x401a) AM_DEVWRITE("adpcm1", seibu_adpcm_device, ctl_w) |
| 492 | AM_RANGE(0x401b, 0x401b) AM_DEVWRITE("seibu_sound", seibu_sound_device, coin_w) |
| 493 | AM_RANGE(0x6005, 0x6006) AM_DEVWRITE("adpcm2", seibu_adpcm_device, adr_w) |
| 586 | 494 | AM_RANGE(0x6008, 0x6009) AM_DEVREADWRITE("ym2", ym2203_device, read, write) |
| 587 | | AM_RANGE(0x601a, 0x601a) AM_DEVWRITE_LEGACY("adpcm2", seibu_adpcm_ctl_w) |
| 495 | AM_RANGE(0x601a, 0x601a) AM_DEVWRITE("adpcm2", seibu_adpcm_device, ctl_w) |
| 588 | 496 | AM_RANGE(0x8000, 0xffff) AM_ROMBANK("bank1") |
| 589 | 497 | ADDRESS_MAP_END |
| 590 | 498 | |
| 499 | /*************************************************************************** |
| 500 | Seibu ADPCM device |
| 501 | ***************************************************************************/ |
| 591 | 502 | |
| 592 | 503 | const device_type SEIBU_ADPCM = &device_creator<seibu_adpcm_device>; |
| 593 | 504 | |
| 594 | 505 | seibu_adpcm_device::seibu_adpcm_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) |
| 595 | 506 | : device_t(mconfig, SEIBU_ADPCM, "Seibu ADPCM", tag, owner, clock, "seibu_adpcm", __FILE__), |
| 596 | | device_sound_interface(mconfig, *this) |
| 507 | device_sound_interface(mconfig, *this), |
| 508 | m_stream(NULL), |
| 509 | m_current(0), |
| 510 | m_end(0), |
| 511 | m_nibble(0), |
| 512 | m_playing(0), |
| 513 | m_allocated(0), |
| 514 | m_base(NULL) |
| 597 | 515 | { |
| 598 | | m_token = global_alloc_clear(seibu_adpcm_state); |
| 599 | 516 | } |
| 600 | 517 | |
| 601 | 518 | //------------------------------------------------- |
| r24637 | r24638 | |
| 606 | 523 | |
| 607 | 524 | void seibu_adpcm_device::device_config_complete() |
| 608 | 525 | { |
| 526 | // inherit a copy of the static data |
| 527 | const seibu_adpcm_interface *intf = reinterpret_cast<const seibu_adpcm_interface *>(static_config()); |
| 528 | if (intf != NULL) |
| 529 | *static_cast<seibu_adpcm_interface *>(this) = *intf; |
| 530 | |
| 531 | // or initialize to defaults if none provided |
| 532 | else |
| 533 | { |
| 534 | m_rom_region = ""; |
| 535 | } |
| 609 | 536 | } |
| 610 | 537 | |
| 611 | 538 | //------------------------------------------------- |
| r24637 | r24638 | |
| 614 | 541 | |
| 615 | 542 | void seibu_adpcm_device::device_start() |
| 616 | 543 | { |
| 617 | | DEVICE_START_NAME( seibu_adpcm )(this); |
| 544 | m_playing = 0; |
| 545 | m_stream = machine().sound().stream_alloc(*this, 0, 1, clock(), this); |
| 546 | m_base = machine().root_device().memregion(m_rom_region)->base(); |
| 547 | m_adpcm.reset(); |
| 618 | 548 | } |
| 619 | 549 | |
| 550 | // "decrypt" is a bit flowery here, as it's probably just line-swapping to |
| 551 | // simplify PCB layout/routing rather than intentional protection, but it |
| 552 | // still fits, especially since the Z80s for all these games are truly encrypted. |
| 553 | |
| 554 | void seibu_adpcm_device::decrypt(const char *region) |
| 555 | { |
| 556 | UINT8 *ROM = machine().root_device().memregion(region)->base(); |
| 557 | int len = machine().root_device().memregion(region)->bytes(); |
| 558 | int i; |
| 559 | |
| 560 | for (i = 0; i < len; i++) |
| 561 | { |
| 562 | ROM[i] = BITSWAP8(ROM[i], 7, 5, 3, 1, 6, 4, 2, 0); |
| 563 | } |
| 564 | } |
| 565 | |
| 566 | WRITE8_MEMBER( seibu_adpcm_device::adr_w ) |
| 567 | { |
| 568 | if (m_stream) |
| 569 | m_stream->update(); |
| 570 | if (offset) |
| 571 | { |
| 572 | m_end = data<<8; |
| 573 | } |
| 574 | else |
| 575 | { |
| 576 | m_current = data<<8; |
| 577 | m_nibble = 4; |
| 578 | } |
| 579 | } |
| 580 | |
| 581 | WRITE8_MEMBER( seibu_adpcm_device::ctl_w ) |
| 582 | { |
| 583 | // sequence is 00 02 01 each time. |
| 584 | if (m_stream) |
| 585 | m_stream->update(); |
| 586 | switch (data) |
| 587 | { |
| 588 | case 0: |
| 589 | m_playing = 0; |
| 590 | break; |
| 591 | case 2: |
| 592 | break; |
| 593 | case 1: |
| 594 | m_playing = 1; |
| 595 | break; |
| 596 | |
| 597 | } |
| 598 | } |
| 599 | |
| 600 | |
| 620 | 601 | //------------------------------------------------- |
| 621 | 602 | // sound_stream_update - handle a stream update |
| 622 | 603 | //------------------------------------------------- |
| 623 | 604 | |
| 624 | 605 | void seibu_adpcm_device::sound_stream_update(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **outputs, int samples) |
| 625 | 606 | { |
| 626 | | // should never get here |
| 627 | | fatalerror("sound_stream_update called; not applicable to legacy sound devices\n"); |
| 607 | stream_sample_t *dest = outputs[0]; |
| 608 | |
| 609 | while (m_playing && samples > 0) |
| 610 | { |
| 611 | int val = (m_base[m_current] >> m_nibble) & 15; |
| 612 | |
| 613 | m_nibble ^= 4; |
| 614 | if (m_nibble == 4) |
| 615 | { |
| 616 | m_current++; |
| 617 | if (m_current >= m_end) |
| 618 | m_playing = 0; |
| 619 | } |
| 620 | |
| 621 | *dest++ = m_adpcm.clock(val) << 4; |
| 622 | samples--; |
| 623 | } |
| 624 | while (samples > 0) |
| 625 | { |
| 626 | *dest++ = 0; |
| 627 | samples--; |
| 628 | } |
| 628 | 629 | } |
| 630 | |
| 631 | // Handlers for early Seibu/Tad games with dual channel ADPCM |
| 632 | |
| 633 | |
| 634 | const seibu_adpcm_interface seibu_adpcm1_intf = |
| 635 | { |
| 636 | "adpcm1" |
| 637 | }; |
| 638 | |
| 639 | const seibu_adpcm_interface seibu_adpcm2_intf = |
| 640 | { |
| 641 | "adpcm2" |
| 642 | }; |
trunk/src/mame/audio/seibu.h
| r24637 | r24638 | |
| 37 | 37 | ADDRESS_MAP_EXTERN(seibu3_sound_map, 8); |
| 38 | 38 | ADDRESS_MAP_EXTERN(seibu3_adpcm_sound_map, 8); |
| 39 | 39 | |
| 40 | | DECLARE_READ16_HANDLER( seibu_main_word_r ); |
| 41 | | DECLARE_READ8_HANDLER( seibu_main_v30_r ); |
| 42 | | DECLARE_WRITE16_HANDLER( seibu_main_word_w ); |
| 43 | | DECLARE_WRITE8_HANDLER( seibu_main_v30_w ); |
| 40 | class seibu_sound_device : public device_t |
| 41 | { |
| 42 | public: |
| 43 | seibu_sound_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); |
| 44 | ~seibu_sound_device() {} |
| 44 | 45 | |
| 45 | | DECLARE_WRITE16_HANDLER( seibu_main_mustb_w ); |
| 46 | DECLARE_READ16_MEMBER( main_word_r ); |
| 47 | DECLARE_READ8_MEMBER( main_v30_r ); |
| 48 | DECLARE_WRITE16_MEMBER( main_word_w ); |
| 49 | DECLARE_WRITE8_MEMBER( main_v30_w ); |
| 46 | 50 | |
| 47 | | DECLARE_WRITE8_HANDLER( seibu_irq_clear_w ); |
| 48 | | DECLARE_WRITE8_HANDLER( seibu_rst10_ack_w ); |
| 49 | | DECLARE_WRITE8_HANDLER( seibu_rst18_ack_w ); |
| 50 | | DECLARE_WRITE8_HANDLER( seibu_bank_w ); |
| 51 | | DECLARE_WRITE8_HANDLER( seibu_coin_w ); |
| 52 | | void seibu_ym3812_irqhandler(device_t *device, int linestate); |
| 53 | | WRITE_LINE_DEVICE_HANDLER(seibu_ym2151_irqhandler); |
| 54 | | void seibu_ym2203_irqhandler(device_t *device, int linestate); |
| 55 | | DECLARE_READ8_HANDLER( seibu_soundlatch_r ); |
| 56 | | DECLARE_READ8_HANDLER( seibu_main_data_pending_r ); |
| 57 | | DECLARE_WRITE8_HANDLER( seibu_main_data_w ); |
| 58 | | MACHINE_RESET( seibu_sound ); |
| 59 | | void seibu_sound_decrypt(running_machine &machine,const char *cpu,int length); |
| 51 | DECLARE_WRITE16_MEMBER( main_mustb_w ); |
| 60 | 52 | |
| 61 | | void seibu_adpcm_decrypt(running_machine &machine, const char *region); |
| 62 | | DECLARE_WRITE8_DEVICE_HANDLER( seibu_adpcm_adr_w ); |
| 63 | | DECLARE_WRITE8_DEVICE_HANDLER( seibu_adpcm_ctl_w ); |
| 53 | DECLARE_WRITE8_MEMBER( irq_clear_w ); |
| 54 | DECLARE_WRITE8_MEMBER( rst10_ack_w ); |
| 55 | DECLARE_WRITE8_MEMBER( rst18_ack_w ); |
| 56 | DECLARE_WRITE8_MEMBER( bank_w ); |
| 57 | DECLARE_WRITE8_MEMBER( coin_w ); |
| 58 | void ym3812_irqhandler(int linestate); |
| 59 | WRITE_LINE_MEMBER(ym2151_irqhandler); |
| 60 | void ym2203_irqhandler(int linestate); |
| 61 | DECLARE_READ8_MEMBER( soundlatch_r ); |
| 62 | DECLARE_READ8_MEMBER( main_data_pending_r ); |
| 63 | DECLARE_WRITE8_MEMBER( main_data_w ); |
| 64 | DECLARE_WRITE8_MEMBER( pending_w ); |
| 65 | void decrypt(const char *cpu,int length); |
| 66 | void update_irq_lines(int param); |
| 67 | |
| 68 | protected: |
| 69 | // device-level overrides |
| 70 | virtual void device_config_complete(); |
| 71 | virtual void device_start(); |
| 72 | virtual void device_reset(); |
| 64 | 73 | |
| 74 | private: |
| 75 | // internal state |
| 76 | device_t *m_sound_cpu; |
| 77 | UINT8 m_main2sub[2]; |
| 78 | UINT8 m_sub2main[2]; |
| 79 | int m_main2sub_pending; |
| 80 | int m_sub2main_pending; |
| 81 | |
| 82 | enum |
| 83 | { |
| 84 | VECTOR_INIT, |
| 85 | RST10_ASSERT, |
| 86 | RST10_CLEAR, |
| 87 | RST18_ASSERT, |
| 88 | RST18_CLEAR |
| 89 | }; |
| 90 | }; |
| 91 | |
| 92 | extern const device_type SEIBU_SOUND; |
| 93 | |
| 94 | extern const ay8910_interface seibu_ay8910_config; |
| 95 | |
| 96 | |
| 97 | // Seibu ADPCM device |
| 98 | |
| 99 | struct seibu_adpcm_interface |
| 100 | { |
| 101 | const char *m_rom_region; |
| 102 | }; |
| 103 | |
| 65 | 104 | class seibu_adpcm_device : public device_t, |
| 66 | | public device_sound_interface |
| 105 | public device_sound_interface, |
| 106 | public seibu_adpcm_interface |
| 67 | 107 | { |
| 68 | 108 | public: |
| 69 | 109 | seibu_adpcm_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); |
| 70 | | ~seibu_adpcm_device() { global_free(m_token); } |
| 110 | ~seibu_adpcm_device() {} |
| 71 | 111 | |
| 72 | | // access to legacy token |
| 73 | | void *token() const { assert(m_token != NULL); return m_token; } |
| 112 | void decrypt(const char *region); |
| 113 | DECLARE_WRITE8_MEMBER( adr_w ); |
| 114 | DECLARE_WRITE8_MEMBER( ctl_w ); |
| 115 | |
| 74 | 116 | protected: |
| 75 | 117 | // device-level overrides |
| 76 | 118 | virtual void device_config_complete(); |
| r24637 | r24638 | |
| 78 | 120 | |
| 79 | 121 | // sound stream update overrides |
| 80 | 122 | virtual void sound_stream_update(sound_stream &stream, stream_sample_t **inputs, stream_sample_t **outputs, int samples); |
| 81 | | private: |
| 123 | |
| 124 | private: |
| 82 | 125 | // internal state |
| 83 | | void *m_token; |
| 126 | oki_adpcm_state m_adpcm; |
| 127 | sound_stream *m_stream; |
| 128 | UINT32 m_current; |
| 129 | UINT32 m_end; |
| 130 | UINT8 m_nibble; |
| 131 | UINT8 m_playing; |
| 132 | UINT8 m_allocated; |
| 133 | UINT8 *m_base; |
| 84 | 134 | }; |
| 85 | 135 | |
| 86 | 136 | extern const device_type SEIBU_ADPCM; |
| 87 | 137 | |
| 88 | | |
| 89 | | extern const ay8910_interface seibu_ay8910_config; |
| 90 | | |
| 91 | | struct seibu_adpcm_interface |
| 92 | | { |
| 93 | | const char *rom_region; |
| 94 | | }; |
| 95 | | |
| 96 | 138 | extern const seibu_adpcm_interface seibu_adpcm1_intf; |
| 97 | 139 | extern const seibu_adpcm_interface seibu_adpcm2_intf; |
| 98 | 140 | |
| 141 | |
| 99 | 142 | /**************************************************************************/ |
| 100 | 143 | |
| 144 | #define MCFG_SEIBU_SOUND_ADD(_tag) \ |
| 145 | MCFG_DEVICE_ADD(_tag, SEIBU_SOUND, 0) |
| 146 | |
| 101 | 147 | #define SEIBU_COIN_INPUTS \ |
| 102 | 148 | PORT_START("COIN") \ |
| 103 | 149 | PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_COIN1 ) PORT_IMPULSE(4) \ |
| r24637 | r24638 | |
| 113 | 159 | |
| 114 | 160 | #define SEIBU_SOUND_SYSTEM_CPU(freq) \ |
| 115 | 161 | MCFG_CPU_ADD("audiocpu", Z80, freq) \ |
| 116 | | MCFG_CPU_PROGRAM_MAP(seibu_sound_map) |
| 162 | MCFG_CPU_PROGRAM_MAP(seibu_sound_map) \ |
| 163 | MCFG_SEIBU_SOUND_ADD("seibu_sound") |
| 164 | |
| 117 | 165 | #define SEIBU2_SOUND_SYSTEM_CPU(freq) \ |
| 118 | 166 | MCFG_CPU_ADD("audiocpu", Z80, freq) \ |
| 119 | | MCFG_CPU_PROGRAM_MAP(seibu2_sound_map) |
| 167 | MCFG_CPU_PROGRAM_MAP(seibu2_sound_map) \ |
| 168 | MCFG_SEIBU_SOUND_ADD("seibu_sound") |
| 169 | |
| 120 | 170 | #define SEIBU2_AIRRAID_SOUND_SYSTEM_CPU(freq) \ |
| 121 | 171 | MCFG_CPU_ADD("audiocpu", Z80, freq) \ |
| 122 | | MCFG_CPU_PROGRAM_MAP(seibu2_airraid_sound_map) |
| 172 | MCFG_CPU_PROGRAM_MAP(seibu2_airraid_sound_map) \ |
| 173 | MCFG_SEIBU_SOUND_ADD("seibu_sound") |
| 123 | 174 | |
| 124 | 175 | #define SEIBU2_RAIDEN2_SOUND_SYSTEM_CPU(freq) \ |
| 125 | | MCFG_CPU_ADD("audiocpu", Z80, freq) \ |
| 126 | | MCFG_CPU_PROGRAM_MAP(seibu2_raiden2_sound_map) |
| 176 | MCFG_CPU_ADD("audiocpu", Z80, freq) \ |
| 177 | MCFG_CPU_PROGRAM_MAP(seibu2_raiden2_sound_map) \ |
| 178 | MCFG_SEIBU_SOUND_ADD("seibu_sound") |
| 179 | |
| 127 | 180 | #define SEIBU_NEWZEROTEAM_SOUND_SYSTEM_CPU(freq) \ |
| 128 | 181 | MCFG_CPU_ADD("audiocpu", Z80, freq) \ |
| 129 | | MCFG_CPU_PROGRAM_MAP(seibu_newzeroteam_sound_map) |
| 182 | MCFG_CPU_PROGRAM_MAP(seibu_newzeroteam_sound_map) \ |
| 183 | MCFG_SEIBU_SOUND_ADD("seibu_sound") |
| 184 | |
| 130 | 185 | #define SEIBU3_SOUND_SYSTEM_CPU(freq) \ |
| 131 | 186 | MCFG_CPU_ADD("audiocpu", Z80, freq) \ |
| 132 | | MCFG_CPU_PROGRAM_MAP(seibu3_sound_map) |
| 187 | MCFG_CPU_PROGRAM_MAP(seibu3_sound_map) \ |
| 188 | MCFG_SEIBU_SOUND_ADD("seibu_sound") |
| 189 | |
| 133 | 190 | #define SEIBU3A_SOUND_SYSTEM_CPU(freq) \ |
| 134 | 191 | MCFG_CPU_ADD("audiocpu", Z80, freq) \ |
| 135 | | MCFG_CPU_PROGRAM_MAP(seibu3_adpcm_sound_map) |
| 192 | MCFG_CPU_PROGRAM_MAP(seibu3_adpcm_sound_map) \ |
| 193 | MCFG_SEIBU_SOUND_ADD("seibu_sound") |
| 194 | |
| 136 | 195 | #define SEIBU_SOUND_SYSTEM_YM3812_INTERFACE(freq1,freq2) \ |
| 137 | 196 | MCFG_SPEAKER_STANDARD_MONO("mono") \ |
| 138 | 197 | \ |
| 139 | 198 | MCFG_SOUND_ADD("ymsnd", YM3812, freq1) \ |
| 140 | | MCFG_YM3812_IRQ_HANDLER(WRITELINE(driver_device, member_wrapper_line<seibu_ym3812_irqhandler>)) \ |
| 199 | MCFG_YM3812_IRQ_HANDLER(DEVWRITELINE("seibu_sound", seibu_sound_device, ym3812_irqhandler)) \ |
| 141 | 200 | MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0) \ |
| 142 | 201 | \ |
| 143 | 202 | MCFG_OKIM6295_ADD("oki", freq2, OKIM6295_PIN7_LOW) \ |
| r24637 | r24638 | |
| 146 | 205 | MCFG_SPEAKER_STANDARD_MONO("mono") \ |
| 147 | 206 | \ |
| 148 | 207 | MCFG_SOUND_ADD("ymsnd", YM3812, freq1) \ |
| 149 | | MCFG_YM3812_IRQ_HANDLER(WRITELINE(driver_device, member_wrapper_line<seibu_ym3812_irqhandler>)) \ |
| 208 | MCFG_YM3812_IRQ_HANDLER(DEVWRITELINE("seibu_sound", seibu_sound_device, ym3812_irqhandler)) \ |
| 150 | 209 | MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0) \ |
| 151 | 210 | \ |
| 152 | 211 | MCFG_OKIM6295_ADD("oki", freq2, OKIM6295_PIN7_HIGH) \ |
| r24637 | r24638 | |
| 155 | 214 | MCFG_SPEAKER_STANDARD_MONO("mono") \ |
| 156 | 215 | \ |
| 157 | 216 | MCFG_YM2151_ADD("ymsnd", freq1) \ |
| 158 | | MCFG_YM2151_IRQ_HANDLER(WRITELINE(driver_device, member_wrapper_line<seibu_ym2151_irqhandler>)) \ |
| 217 | MCFG_YM2151_IRQ_HANDLER(DEVWRITELINE("seibu_sound", seibu_sound_device, ym2151_irqhandler)) \ |
| 159 | 218 | MCFG_SOUND_ROUTE(0, "mono", 0.50) \ |
| 160 | 219 | MCFG_SOUND_ROUTE(1, "mono", 0.50) \ |
| 161 | 220 | \ |
| r24637 | r24638 | |
| 165 | 224 | MCFG_SPEAKER_STANDARD_MONO("mono") \ |
| 166 | 225 | \ |
| 167 | 226 | MCFG_YM2151_ADD("ymsnd", freq1) \ |
| 168 | | MCFG_YM2151_IRQ_HANDLER(WRITELINE(driver_device, member_wrapper_line<seibu_ym2151_irqhandler>)) \ |
| 227 | MCFG_YM2151_IRQ_HANDLER(DEVWRITELINE("seibu_sound", seibu_sound_device, ym2151_irqhandler)) \ |
| 169 | 228 | MCFG_SOUND_ROUTE(0, "mono", 0.50) \ |
| 170 | 229 | MCFG_SOUND_ROUTE(1, "mono", 0.50) |
| 171 | 230 | |
| r24637 | r24638 | |
| 173 | 232 | MCFG_SPEAKER_STANDARD_MONO("mono") \ |
| 174 | 233 | \ |
| 175 | 234 | MCFG_YM2151_ADD("ymsnd", freq1) \ |
| 176 | | MCFG_YM2151_IRQ_HANDLER(WRITELINE(driver_device, member_wrapper_line<seibu_ym2151_irqhandler>)) \ |
| 235 | MCFG_YM2151_IRQ_HANDLER(DEVWRITELINE("seibu_sound", seibu_sound_device, ym2151_irqhandler)) \ |
| 177 | 236 | MCFG_SOUND_ROUTE(0, "mono", 0.50) \ |
| 178 | 237 | MCFG_SOUND_ROUTE(1, "mono", 0.50) \ |
| 179 | 238 | \ |
| r24637 | r24638 | |
| 187 | 246 | MCFG_SPEAKER_STANDARD_MONO("mono") \ |
| 188 | 247 | \ |
| 189 | 248 | MCFG_SOUND_ADD("ym1", YM2203, freq) \ |
| 190 | | MCFG_YM2203_IRQ_HANDLER(WRITELINE(driver_device, member_wrapper_line<seibu_ym2203_irqhandler>)) \ |
| 249 | MCFG_YM2203_IRQ_HANDLER(DEVWRITELINE("seibu_sound", seibu_sound_device, ym2203_irqhandler)) \ |
| 191 | 250 | MCFG_YM2203_AY8910_INTF(&seibu_ay8910_config) \ |
| 192 | 251 | MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.15) \ |
| 193 | 252 | \ |