trunk/src/mame/includes/midtunit.h
| r242780 | r242781 | |
| 14 | 14 | { |
| 15 | 15 | TIMER_DMA |
| 16 | 16 | }; |
| 17 | | |
| 18 | | midtunit_state(const machine_config &mconfig, device_type type, const char *tag)
|
| 19 | | : driver_device(mconfig, type, tag),
|
| 20 | | m_maincpu(*this, "maincpu"),
|
| 21 | | m_palette(*this, "palette"),
|
| 22 | | m_dcs(*this, "dcs"),
|
| 23 | | m_cvsd_sound(*this, "cvsd"),
|
| 24 | | m_adpcm_sound(*this, "adpcm") ,
|
| 25 | | m_generic_paletteram_16(*this, "paletteram"),
|
| 26 | | m_nvram(*this, "nvram"),
|
| 27 | | m_gfxrom(*this, "gfxrom"),
|
| 28 | | m_ports(*this, tunit_ports) { }
|
| 29 | | |
| 30 | | required_device<cpu_device> m_maincpu;
|
| 31 | | required_device<palette_device> m_palette;
|
| 32 | | optional_device<dcs_audio_device> m_dcs;
|
| 33 | | optional_device<williams_cvsd_sound_device> m_cvsd_sound;
|
| 34 | | optional_device<williams_adpcm_sound_device> m_adpcm_sound;
|
| 35 | |
|
| 36 | | required_shared_ptr<UINT16> m_generic_paletteram_16;
|
| 37 | | required_shared_ptr<UINT16> m_nvram;
|
| 38 | |
|
| 39 | | required_memory_region m_gfxrom;
|
| 40 | |
|
| 41 | | required_ioport_array<4> m_ports;
|
| 42 | | DECLARE_IOPORT_ARRAY(tunit_ports);
|
| 43 | | |
| 44 | | DECLARE_WRITE16_MEMBER(midtunit_cmos_enable_w);
|
| 45 | | DECLARE_WRITE16_MEMBER(midtunit_cmos_w);
|
| 17 | |
| 18 | midtunit_state(const machine_config &mconfig, device_type type, const char *tag) |
| 19 | : driver_device(mconfig, type, tag), |
| 20 | m_maincpu(*this, "maincpu"), |
| 21 | m_palette(*this, "palette"), |
| 22 | m_dcs(*this, "dcs"), |
| 23 | m_cvsd_sound(*this, "cvsd"), |
| 24 | m_adpcm_sound(*this, "adpcm") , |
| 25 | m_generic_paletteram_16(*this, "paletteram"), |
| 26 | m_nvram(*this, "nvram"), |
| 27 | m_gfxrom(*this, "gfxrom"), |
| 28 | m_ports(*this, tunit_ports) { } |
| 29 | |
| 30 | required_device<cpu_device> m_maincpu; |
| 31 | required_device<palette_device> m_palette; |
| 32 | optional_device<dcs_audio_device> m_dcs; |
| 33 | optional_device<williams_cvsd_sound_device> m_cvsd_sound; |
| 34 | optional_device<williams_adpcm_sound_device> m_adpcm_sound; |
| 35 | |
| 36 | required_shared_ptr<UINT16> m_generic_paletteram_16; |
| 37 | required_shared_ptr<UINT16> m_nvram; |
| 38 | |
| 39 | required_memory_region m_gfxrom; |
| 40 | |
| 41 | required_ioport_array<4> m_ports; |
| 42 | DECLARE_IOPORT_ARRAY(tunit_ports); |
| 43 | |
| 44 | DECLARE_WRITE16_MEMBER(midtunit_cmos_enable_w); |
| 45 | DECLARE_WRITE16_MEMBER(midtunit_cmos_w); |
| 46 | 46 | DECLARE_READ16_MEMBER(midtunit_cmos_r); |
| 47 | 47 | DECLARE_READ16_MEMBER(midtunit_input_r); |
| 48 | 48 | DECLARE_READ16_MEMBER(midtunit_sound_state_r); |
| r242780 | r242781 | |
| 73 | 73 | DECLARE_READ16_MEMBER(midwunit_control_r); |
| 74 | 74 | DECLARE_WRITE16_MEMBER(midtunit_paletteram_w); |
| 75 | 75 | DECLARE_WRITE16_MEMBER(midxunit_paletteram_w); |
| 76 | | DECLARE_READ16_MEMBER(midxunit_paletteram_r);
|
| 77 | | DECLARE_READ16_MEMBER(midtunit_dma_r);
|
| 78 | | DECLARE_WRITE16_MEMBER(midtunit_dma_w);
|
| 79 | |
|
| 80 | | TMS340X0_TO_SHIFTREG_CB_MEMBER(to_shiftreg);
|
| 81 | | TMS340X0_FROM_SHIFTREG_CB_MEMBER(from_shiftreg);
|
| 82 | | TMS340X0_SCANLINE_IND16_CB_MEMBER(scanline_update);
|
| 83 | |
|
| 84 | | DECLARE_DRIVER_INIT(mktunit);
|
| 85 | | DECLARE_DRIVER_INIT(mkturbo);
|
| 86 | | DECLARE_DRIVER_INIT(nbajamte);
|
| 87 | | DECLARE_DRIVER_INIT(nbajam);
|
| 88 | | DECLARE_DRIVER_INIT(jdreddp);
|
| 89 | | DECLARE_DRIVER_INIT(mk2);
|
| 90 | |
|
| 91 | | DECLARE_MACHINE_RESET(midtunit);
|
| 92 | | DECLARE_VIDEO_START(midtunit);
|
| 93 | | |
| 94 | | void register_state_saving();
|
| 95 | | void init_tunit_generic(int sound);
|
| 96 | | void init_nbajam_common(int te_protection);
|
| 97 | | |
| 98 | | /* CMOS-related variables */
|
| 99 | | UINT8 m_cmos_write_enable;
|
| 100 | | |
| 101 | | /* sound-related variables */
|
| 102 | | UINT8 m_chip_type;
|
| 103 | | UINT8 m_fake_sound_state;
|
| 104 | | |
| 105 | | /* protection */
|
| 106 | | UINT8 m_mk_prot_index;
|
| 107 | | UINT16 m_mk2_prot_data;
|
| 108 | | |
| 109 | | const UINT32 *m_nbajam_prot_table;
|
| 110 | | UINT16 m_nbajam_prot_queue[5];
|
| 111 | | UINT8 m_nbajam_prot_index;
|
| 112 | | |
| 113 | | const UINT8 *m_jdredd_prot_table;
|
| 114 | | UINT8 m_jdredd_prot_index;
|
| 115 | | UINT8 m_jdredd_prot_max;
|
| 116 | | |
| 117 | | UINT8 m_gfx_rom_large;
|
| 118 | | |
| 76 | DECLARE_READ16_MEMBER(midxunit_paletteram_r); |
| 77 | DECLARE_READ16_MEMBER(midtunit_dma_r); |
| 78 | DECLARE_WRITE16_MEMBER(midtunit_dma_w); |
| 79 | |
| 80 | TMS340X0_TO_SHIFTREG_CB_MEMBER(to_shiftreg); |
| 81 | TMS340X0_FROM_SHIFTREG_CB_MEMBER(from_shiftreg); |
| 82 | TMS340X0_SCANLINE_IND16_CB_MEMBER(scanline_update); |
| 83 | |
| 84 | DECLARE_DRIVER_INIT(mktunit); |
| 85 | DECLARE_DRIVER_INIT(mkturbo); |
| 86 | DECLARE_DRIVER_INIT(nbajamte); |
| 87 | DECLARE_DRIVER_INIT(nbajam); |
| 88 | DECLARE_DRIVER_INIT(jdreddp); |
| 89 | DECLARE_DRIVER_INIT(mk2); |
| 90 | |
| 91 | DECLARE_MACHINE_RESET(midtunit); |
| 92 | DECLARE_VIDEO_START(midtunit); |
| 93 | |
| 94 | void register_state_saving(); |
| 95 | void init_tunit_generic(int sound); |
| 96 | void init_nbajam_common(int te_protection); |
| 97 | |
| 98 | /* CMOS-related variables */ |
| 99 | UINT8 m_cmos_write_enable; |
| 100 | |
| 101 | /* sound-related variables */ |
| 102 | UINT8 m_chip_type; |
| 103 | UINT8 m_fake_sound_state; |
| 104 | |
| 105 | /* protection */ |
| 106 | UINT8 m_mk_prot_index; |
| 107 | UINT16 m_mk2_prot_data; |
| 108 | |
| 109 | const UINT32 *m_nbajam_prot_table; |
| 110 | UINT16 m_nbajam_prot_queue[5]; |
| 111 | UINT8 m_nbajam_prot_index; |
| 112 | |
| 113 | const UINT8 *m_jdredd_prot_table; |
| 114 | UINT8 m_jdredd_prot_index; |
| 115 | UINT8 m_jdredd_prot_max; |
| 116 | |
| 117 | UINT8 m_gfx_rom_large; |
| 118 | |
| 119 | 119 | protected: |
| 120 | 120 | virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr); |
| 121 | 121 | }; |
trunk/src/mame/includes/midwunit.h
| r242780 | r242781 | |
| 10 | 10 | |
| 11 | 11 | class midwunit_state : public midtunit_state |
| 12 | 12 | { |
| 13 | | public:
|
| 14 | | midwunit_state(const machine_config &mconfig, device_type type, const char *tag)
|
| 15 | | : midtunit_state(mconfig, type, tag),
|
| 16 | | m_midway_serial_pic(*this, "serial_pic"),
|
| 17 | | m_nvram(*this, "nvram"),
|
| 18 | | m_ports(*this, wunit_ports)
|
| 19 | | { }
|
| 20 | | |
| 21 | | required_device<midway_serial_pic_device> m_midway_serial_pic;
|
| 22 | | required_shared_ptr<UINT16> m_nvram;
|
| 23 | | required_ioport_array<4> m_ports;
|
| 24 | |
|
| 25 | | DECLARE_IOPORT_ARRAY(wunit_ports);
|
| 26 | |
|
| 27 | | UINT8 m_cmos_write_enable;
|
| 28 | | UINT16 m_iodata[8];
|
| 29 | | UINT8 m_ioshuffle[16];
|
| 30 | | UINT8 m_uart[8];
|
| 31 | | UINT8 m_security_bits;
|
| 32 | | UINT16 *m_umk3_palette;
|
| 33 | |
|
| 34 | | DECLARE_WRITE16_MEMBER(midwunit_cmos_enable_w);
|
| 35 | | DECLARE_WRITE16_MEMBER(midwunit_cmos_w);
|
| 36 | | DECLARE_READ16_MEMBER(midwunit_cmos_r);
|
| 13 | public: |
| 14 | midwunit_state(const machine_config &mconfig, device_type type, const char *tag) |
| 15 | : midtunit_state(mconfig, type, tag), |
| 16 | m_midway_serial_pic(*this, "serial_pic"), |
| 17 | m_nvram(*this, "nvram"), |
| 18 | m_ports(*this, wunit_ports) |
| 19 | { } |
| 20 | |
| 21 | required_device<midway_serial_pic_device> m_midway_serial_pic; |
| 22 | required_shared_ptr<UINT16> m_nvram; |
| 23 | required_ioport_array<4> m_ports; |
| 24 | |
| 25 | DECLARE_IOPORT_ARRAY(wunit_ports); |
| 26 | |
| 27 | UINT8 m_cmos_write_enable; |
| 28 | UINT16 m_iodata[8]; |
| 29 | UINT8 m_ioshuffle[16]; |
| 30 | UINT8 m_uart[8]; |
| 31 | UINT8 m_security_bits; |
| 32 | UINT16 *m_umk3_palette; |
| 33 | |
| 34 | DECLARE_WRITE16_MEMBER(midwunit_cmos_enable_w); |
| 35 | DECLARE_WRITE16_MEMBER(midwunit_cmos_w); |
| 36 | DECLARE_READ16_MEMBER(midwunit_cmos_r); |
| 37 | 37 | DECLARE_WRITE16_MEMBER(midwunit_io_w); |
| 38 | 38 | DECLARE_READ16_MEMBER(midwunit_io_r); |
| 39 | 39 | DECLARE_READ16_MEMBER(midwunit_security_r); |
| 40 | 40 | DECLARE_WRITE16_MEMBER(midwunit_security_w); |
| 41 | 41 | DECLARE_READ16_MEMBER(midwunit_sound_r); |
| 42 | 42 | DECLARE_READ16_MEMBER(midwunit_sound_state_r); |
| 43 | | DECLARE_WRITE16_MEMBER(midwunit_sound_w);
|
| 44 | | DECLARE_WRITE16_MEMBER(umk3_palette_hack_w);
|
| 45 | | DECLARE_WRITE16_MEMBER(wwfmania_io_0_w);
|
| 46 | |
|
| 47 | | DECLARE_DRIVER_INIT(mk3r10);
|
| 48 | | DECLARE_DRIVER_INIT(nbahangt);
|
| 49 | | DECLARE_DRIVER_INIT(wwfmania);
|
| 43 | DECLARE_WRITE16_MEMBER(midwunit_sound_w); |
| 44 | DECLARE_WRITE16_MEMBER(umk3_palette_hack_w); |
| 45 | DECLARE_WRITE16_MEMBER(wwfmania_io_0_w); |
| 46 | |
| 47 | DECLARE_DRIVER_INIT(mk3r10); |
| 48 | DECLARE_DRIVER_INIT(nbahangt); |
| 49 | DECLARE_DRIVER_INIT(wwfmania); |
| 50 | 50 | DECLARE_DRIVER_INIT(umk3); |
| 51 | 51 | DECLARE_DRIVER_INIT(mk3); |
| 52 | 52 | DECLARE_DRIVER_INIT(openice); |
| 53 | | DECLARE_DRIVER_INIT(rmpgwt);
|
| 54 | | DECLARE_DRIVER_INIT(umk3r11);
|
| 55 | | DECLARE_DRIVER_INIT(mk3r20);
|
| 56 | |
|
| 57 | | DECLARE_MACHINE_RESET(midwunit);
|
| 58 | | DECLARE_VIDEO_START(midwunit);
|
| 59 | |
|
| 60 | | void register_state_saving();
|
| 61 | | void init_wunit_generic();
|
| 62 | | void init_mk3_common();
|
| 53 | DECLARE_DRIVER_INIT(rmpgwt); |
| 54 | DECLARE_DRIVER_INIT(umk3r11); |
| 55 | DECLARE_DRIVER_INIT(mk3r20); |
| 56 | |
| 57 | DECLARE_MACHINE_RESET(midwunit); |
| 58 | DECLARE_VIDEO_START(midwunit); |
| 59 | |
| 60 | void register_state_saving(); |
| 61 | void init_wunit_generic(); |
| 62 | void init_mk3_common(); |
| 63 | 63 | }; |
trunk/src/mame/machine/midtunit.c
| r242780 | r242781 | |
| 25 | 25 | * State saving |
| 26 | 26 | * |
| 27 | 27 | *************************************/ |
| 28 | | |
| 29 | | void midtunit_state::register_state_saving()
|
| 30 | | {
|
| 31 | | save_item(NAME(m_cmos_write_enable));
|
| 32 | | save_item(NAME(m_fake_sound_state));
|
| 33 | | save_item(NAME(m_mk_prot_index));
|
| 34 | | save_item(NAME(m_mk2_prot_data));
|
| 35 | | save_item(NAME(m_nbajam_prot_queue));
|
| 36 | | save_item(NAME(m_nbajam_prot_index));
|
| 37 | | save_item(NAME(m_jdredd_prot_index));
|
| 38 | | save_item(NAME(m_jdredd_prot_max));
|
| 39 | | }
|
| 40 | | |
| 41 | | |
| 42 | 28 | |
| 29 | void midtunit_state::register_state_saving() |
| 30 | { |
| 31 | save_item(NAME(m_cmos_write_enable)); |
| 32 | save_item(NAME(m_fake_sound_state)); |
| 33 | save_item(NAME(m_mk_prot_index)); |
| 34 | save_item(NAME(m_mk2_prot_data)); |
| 35 | save_item(NAME(m_nbajam_prot_queue)); |
| 36 | save_item(NAME(m_nbajam_prot_index)); |
| 37 | save_item(NAME(m_jdredd_prot_index)); |
| 38 | save_item(NAME(m_jdredd_prot_max)); |
| 39 | } |
| 40 | |
| 41 | |
| 42 | |
| 43 | 43 | /************************************* |
| 44 | 44 | * |
| 45 | 45 | * CMOS reads/writes |
| 46 | 46 | * |
| 47 | 47 | *************************************/ |
| 48 | | |
| 49 | | WRITE16_MEMBER(midtunit_state::midtunit_cmos_enable_w)
|
| 50 | | {
|
| 51 | | m_cmos_write_enable = 1;
|
| 52 | | }
|
| 53 | | |
| 54 | | |
| 55 | | WRITE16_MEMBER(midtunit_state::midtunit_cmos_w)
|
| 56 | | {
|
| 57 | | if (1)/*m_cmos_write_enable*/
|
| 58 | | {
|
| 59 | | COMBINE_DATA(m_nvram+offset);
|
| 60 | | m_cmos_write_enable = 0;
|
| 61 | | }
|
| 62 | | else
|
| 63 | | {
|
| 48 | |
| 49 | WRITE16_MEMBER(midtunit_state::midtunit_cmos_enable_w) |
| 50 | { |
| 51 | m_cmos_write_enable = 1; |
| 52 | } |
| 53 | |
| 54 | |
| 55 | WRITE16_MEMBER(midtunit_state::midtunit_cmos_w) |
| 56 | { |
| 57 | if (1)/*m_cmos_write_enable*/ |
| 58 | { |
| 59 | COMBINE_DATA(m_nvram+offset); |
| 60 | m_cmos_write_enable = 0; |
| 61 | } |
| 62 | else |
| 63 | { |
| 64 | 64 | logerror("%08X:Unexpected CMOS W @ %05X\n", space.device().safe_pc(), offset); |
| 65 | 65 | popmessage("Bad CMOS write"); |
| 66 | 66 | } |
| r242780 | r242781 | |
| 76 | 76 | |
| 77 | 77 | /************************************* |
| 78 | 78 | * |
| 79 | | * Generic input ports
|
| 80 | | *
|
| 81 | | *************************************/
|
| 82 | |
|
| 83 | | IOPORT_ARRAY_MEMBER(midtunit_state::tunit_ports) { "IN0", "IN1", "IN2", "DSW" };
|
| 84 | | |
| 85 | | READ16_MEMBER(midtunit_state::midtunit_input_r)
|
| 86 | | {
|
| 87 | | return m_ports[offset]->read();
|
| 88 | | }
|
| 89 | | |
| 90 | | |
| 79 | * Generic input ports |
| 80 | * |
| 81 | *************************************/ |
| 91 | 82 | |
| 83 | IOPORT_ARRAY_MEMBER(midtunit_state::tunit_ports) { "IN0", "IN1", "IN2", "DSW" }; |
| 84 | |
| 85 | READ16_MEMBER(midtunit_state::midtunit_input_r) |
| 86 | { |
| 87 | return m_ports[offset]->read(); |
| 88 | } |
| 89 | |
| 90 | |
| 91 | |
| 92 | 92 | /************************************* |
| 93 | 93 | * |
| 94 | 94 | * Mortal Kombat (T-unit) protection |
| r242780 | r242781 | |
| 106 | 106 | 0x16, 0x2d, 0x1a, 0x34, 0x28, 0x10, 0x21, 0x03, |
| 107 | 107 | 0xff |
| 108 | 108 | }; |
| 109 | | |
| 110 | | READ16_MEMBER(midtunit_state::mk_prot_r)
|
| 111 | | {
|
| 112 | | logerror("%08X:Protection R @ %05X = %04X\n", space.device().safe_pc(), offset, mk_prot_values[m_mk_prot_index] << 9);
|
| 113 | | |
| 114 | | /* just in case */
|
| 115 | | if (m_mk_prot_index >= sizeof(mk_prot_values))
|
| 116 | | {
|
| 117 | | logerror("%08X:Unexpected protection R @ %05X\n", space.device().safe_pc(), offset);
|
| 118 | | m_mk_prot_index = 0;
|
| 119 | | }
|
| 120 | | |
| 121 | | return mk_prot_values[m_mk_prot_index++] << 9;
|
| 122 | | }
|
| 123 | | |
| 124 | | WRITE16_MEMBER(midtunit_state::mk_prot_w)
|
| 109 | |
| 110 | READ16_MEMBER(midtunit_state::mk_prot_r) |
| 125 | 111 | { |
| 112 | logerror("%08X:Protection R @ %05X = %04X\n", space.device().safe_pc(), offset, mk_prot_values[m_mk_prot_index] << 9); |
| 113 | |
| 114 | /* just in case */ |
| 115 | if (m_mk_prot_index >= sizeof(mk_prot_values)) |
| 116 | { |
| 117 | logerror("%08X:Unexpected protection R @ %05X\n", space.device().safe_pc(), offset); |
| 118 | m_mk_prot_index = 0; |
| 119 | } |
| 120 | |
| 121 | return mk_prot_values[m_mk_prot_index++] << 9; |
| 122 | } |
| 123 | |
| 124 | WRITE16_MEMBER(midtunit_state::mk_prot_w) |
| 125 | { |
| 126 | 126 | if (ACCESSING_BITS_8_15) |
| 127 | 127 | { |
| 128 | 128 | int first_val = (data >> 9) & 0x3f; |
| 129 | 129 | int i; |
| 130 | 130 | |
| 131 | 131 | /* find the desired first value and stop then */ |
| 132 | | for (i = 0; i < sizeof(mk_prot_values); i++)
|
| 133 | | if (mk_prot_values[i] == first_val)
|
| 134 | | {
|
| 135 | | m_mk_prot_index = i;
|
| 136 | | break;
|
| 137 | | }
|
| 138 | | |
| 132 | for (i = 0; i < sizeof(mk_prot_values); i++) |
| 133 | if (mk_prot_values[i] == first_val) |
| 134 | { |
| 135 | m_mk_prot_index = i; |
| 136 | break; |
| 137 | } |
| 138 | |
| 139 | 139 | /* just in case */ |
| 140 | | if (i == sizeof(mk_prot_values))
|
| 141 | | {
|
| 142 | | logerror("%08X:Unhandled protection W @ %05X = %04X\n", space.device().safe_pc(), offset, data);
|
| 143 | | m_mk_prot_index = 0;
|
| 144 | | }
|
| 145 | | |
| 146 | | logerror("%08X:Protection W @ %05X = %04X\n", space.device().safe_pc(), offset, data);
|
| 140 | if (i == sizeof(mk_prot_values)) |
| 141 | { |
| 142 | logerror("%08X:Unhandled protection W @ %05X = %04X\n", space.device().safe_pc(), offset, data); |
| 143 | m_mk_prot_index = 0; |
| 144 | } |
| 145 | |
| 146 | logerror("%08X:Protection W @ %05X = %04X\n", space.device().safe_pc(), offset, data); |
| 147 | 147 | } |
| 148 | 148 | } |
| 149 | 149 | |
| r242780 | r242781 | |
| 174 | 174 | { |
| 175 | 175 | return 2; |
| 176 | 176 | } |
| 177 | | |
| 178 | | READ16_MEMBER(midtunit_state::mk2_prot_r)
|
| 179 | | {
|
| 180 | | return m_mk2_prot_data;
|
| 181 | | }
|
| 182 | | |
| 183 | | READ16_MEMBER(midtunit_state::mk2_prot_shift_r)
|
| 184 | | {
|
| 185 | | return m_mk2_prot_data >> 1;
|
| 186 | | }
|
| 187 | | |
| 188 | | WRITE16_MEMBER(midtunit_state::mk2_prot_w)
|
| 189 | | {
|
| 190 | | COMBINE_DATA(&m_mk2_prot_data);
|
| 191 | | }
|
| 192 | | |
| 193 | | |
| 194 | 177 | |
| 178 | READ16_MEMBER(midtunit_state::mk2_prot_r) |
| 179 | { |
| 180 | return m_mk2_prot_data; |
| 181 | } |
| 182 | |
| 183 | READ16_MEMBER(midtunit_state::mk2_prot_shift_r) |
| 184 | { |
| 185 | return m_mk2_prot_data >> 1; |
| 186 | } |
| 187 | |
| 188 | WRITE16_MEMBER(midtunit_state::mk2_prot_w) |
| 189 | { |
| 190 | COMBINE_DATA(&m_mk2_prot_data); |
| 191 | } |
| 192 | |
| 193 | |
| 194 | |
| 195 | 195 | /************************************* |
| 196 | 196 | * |
| 197 | 197 | * NBA Jam protection |
| r242780 | r242781 | |
| 237 | 237 | 0x30180c26, 0x31381c0e, 0x32393c3e, 0x33192c16, 0x343a3d1e, 0x351a2d36, 0x361b0d06, 0x373b1d2e, |
| 238 | 238 | 0x381c2e17, 0x393c3e3f, 0x3a3d1e0f, 0x3b1d0e27, 0x3c3e1f2f, 0x3d1e0f07, 0x3e1f2f37, 0x3f3f3f1f |
| 239 | 239 | }; |
| 240 | | |
| 241 | | READ16_MEMBER(midtunit_state::nbajam_prot_r)
|
| 242 | | {
|
| 243 | | int result = m_nbajam_prot_queue[m_nbajam_prot_index];
|
| 244 | | if (m_nbajam_prot_index < 4)
|
| 245 | | m_nbajam_prot_index++;
|
| 246 | | return result;
|
| 247 | | }
|
| 248 | | |
| 249 | | WRITE16_MEMBER(midtunit_state::nbajam_prot_w)
|
| 250 | | {
|
| 251 | | int table_index = (offset >> 6) & 0x7f;
|
| 252 | | UINT32 protval = m_nbajam_prot_table[table_index];
|
| 253 | | |
| 254 | | m_nbajam_prot_queue[0] = data;
|
| 255 | | m_nbajam_prot_queue[1] = ((protval >> 24) & 0xff) << 9;
|
| 256 | | m_nbajam_prot_queue[2] = ((protval >> 16) & 0xff) << 9;
|
| 257 | | m_nbajam_prot_queue[3] = ((protval >> 8) & 0xff) << 9;
|
| 258 | | m_nbajam_prot_queue[4] = ((protval >> 0) & 0xff) << 9;
|
| 259 | | m_nbajam_prot_index = 0;
|
| 260 | | }
|
| 261 | | |
| 262 | | |
| 263 | 240 | |
| 241 | READ16_MEMBER(midtunit_state::nbajam_prot_r) |
| 242 | { |
| 243 | int result = m_nbajam_prot_queue[m_nbajam_prot_index]; |
| 244 | if (m_nbajam_prot_index < 4) |
| 245 | m_nbajam_prot_index++; |
| 246 | return result; |
| 247 | } |
| 248 | |
| 249 | WRITE16_MEMBER(midtunit_state::nbajam_prot_w) |
| 250 | { |
| 251 | int table_index = (offset >> 6) & 0x7f; |
| 252 | UINT32 protval = m_nbajam_prot_table[table_index]; |
| 253 | |
| 254 | m_nbajam_prot_queue[0] = data; |
| 255 | m_nbajam_prot_queue[1] = ((protval >> 24) & 0xff) << 9; |
| 256 | m_nbajam_prot_queue[2] = ((protval >> 16) & 0xff) << 9; |
| 257 | m_nbajam_prot_queue[3] = ((protval >> 8) & 0xff) << 9; |
| 258 | m_nbajam_prot_queue[4] = ((protval >> 0) & 0xff) << 9; |
| 259 | m_nbajam_prot_index = 0; |
| 260 | } |
| 261 | |
| 262 | |
| 263 | |
| 264 | 264 | /************************************* |
| 265 | 265 | * |
| 266 | 266 | * Judge Dredd protection |
| r242780 | r242781 | |
| 313 | 313 | { |
| 314 | 314 | logerror("%08X:jdredd_prot_w(%04X,%04X)\n", space.device().safe_pcbase(), offset*16, data); |
| 315 | 315 | |
| 316 | | switch (offset)
|
| 317 | | {
|
| 318 | | case TOWORD(0x10740):
|
| 319 | | m_jdredd_prot_index = 0;
|
| 320 | | m_jdredd_prot_table = jdredd_prot_values_10740;
|
| 321 | | m_jdredd_prot_max = sizeof(jdredd_prot_values_10740);
|
| 322 | | logerror("-- reset prot table 10740\n");
|
| 323 | | break;
|
| 324 | | |
| 325 | | case TOWORD(0x13240):
|
| 326 | | m_jdredd_prot_index = 0;
|
| 327 | | m_jdredd_prot_table = jdredd_prot_values_13240;
|
| 328 | | m_jdredd_prot_max = sizeof(jdredd_prot_values_13240);
|
| 329 | | logerror("-- reset prot table 13240\n");
|
| 330 | | break;
|
| 331 | | |
| 332 | | case TOWORD(0x76540):
|
| 333 | | m_jdredd_prot_index = 0;
|
| 334 | | m_jdredd_prot_table = jdredd_prot_values_76540;
|
| 335 | | m_jdredd_prot_max = sizeof(jdredd_prot_values_76540);
|
| 336 | | logerror("-- reset prot table 76540\n");
|
| 337 | | break;
|
| 338 | | |
| 339 | | case TOWORD(0x77760):
|
| 340 | | m_jdredd_prot_index = 0;
|
| 341 | | m_jdredd_prot_table = jdredd_prot_values_77760;
|
| 342 | | m_jdredd_prot_max = sizeof(jdredd_prot_values_77760);
|
| 343 | | logerror("-- reset prot table 77760\n");
|
| 344 | | break;
|
| 345 | | |
| 346 | | case TOWORD(0x80020):
|
| 347 | | m_jdredd_prot_index = 0;
|
| 348 | | m_jdredd_prot_table = jdredd_prot_values_80020;
|
| 349 | | m_jdredd_prot_max = sizeof(jdredd_prot_values_80020);
|
| 350 | | logerror("-- reset prot table 80020\n");
|
| 351 | | break;
|
| 352 | | }
|
| 316 | switch (offset) |
| 317 | { |
| 318 | case TOWORD(0x10740): |
| 319 | m_jdredd_prot_index = 0; |
| 320 | m_jdredd_prot_table = jdredd_prot_values_10740; |
| 321 | m_jdredd_prot_max = sizeof(jdredd_prot_values_10740); |
| 322 | logerror("-- reset prot table 10740\n"); |
| 323 | break; |
| 324 | |
| 325 | case TOWORD(0x13240): |
| 326 | m_jdredd_prot_index = 0; |
| 327 | m_jdredd_prot_table = jdredd_prot_values_13240; |
| 328 | m_jdredd_prot_max = sizeof(jdredd_prot_values_13240); |
| 329 | logerror("-- reset prot table 13240\n"); |
| 330 | break; |
| 331 | |
| 332 | case TOWORD(0x76540): |
| 333 | m_jdredd_prot_index = 0; |
| 334 | m_jdredd_prot_table = jdredd_prot_values_76540; |
| 335 | m_jdredd_prot_max = sizeof(jdredd_prot_values_76540); |
| 336 | logerror("-- reset prot table 76540\n"); |
| 337 | break; |
| 338 | |
| 339 | case TOWORD(0x77760): |
| 340 | m_jdredd_prot_index = 0; |
| 341 | m_jdredd_prot_table = jdredd_prot_values_77760; |
| 342 | m_jdredd_prot_max = sizeof(jdredd_prot_values_77760); |
| 343 | logerror("-- reset prot table 77760\n"); |
| 344 | break; |
| 345 | |
| 346 | case TOWORD(0x80020): |
| 347 | m_jdredd_prot_index = 0; |
| 348 | m_jdredd_prot_table = jdredd_prot_values_80020; |
| 349 | m_jdredd_prot_max = sizeof(jdredd_prot_values_80020); |
| 350 | logerror("-- reset prot table 80020\n"); |
| 351 | break; |
| 352 | } |
| 353 | 353 | } |
| 354 | 354 | |
| 355 | 355 | READ16_MEMBER(midtunit_state::jdredd_prot_r) |
| 356 | | {
|
| 357 | | UINT16 result = 0xffff;
|
| 358 | | |
| 359 | | if (m_jdredd_prot_table && m_jdredd_prot_index < m_jdredd_prot_max)
|
| 360 | | result = m_jdredd_prot_table[m_jdredd_prot_index++] << 9;
|
| 361 | | |
| 362 | | logerror("%08X:jdredd_prot_r(%04X) = %04X\n", space.device().safe_pcbase(), offset*16, result);
|
| 363 | | return result;
|
| 356 | { |
| 357 | UINT16 result = 0xffff; |
| 358 | |
| 359 | if (m_jdredd_prot_table && m_jdredd_prot_index < m_jdredd_prot_max) |
| 360 | result = m_jdredd_prot_table[m_jdredd_prot_index++] << 9; |
| 361 | |
| 362 | logerror("%08X:jdredd_prot_r(%04X) = %04X\n", space.device().safe_pcbase(), offset*16, result); |
| 363 | return result; |
| 364 | 364 | } |
| 365 | 365 | |
| 366 | 366 | |
| r242780 | r242781 | |
| 389 | 389 | void midtunit_state::init_tunit_generic(int sound) |
| 390 | 390 | { |
| 391 | 391 | /* register for state saving */ |
| 392 | | register_state_saving();
|
| 393 | | |
| 394 | | /* load sound ROMs and set up sound handlers */
|
| 395 | | m_chip_type = sound;
|
| 396 | | |
| 397 | | |
| 398 | | /* default graphics functionality */
|
| 392 | register_state_saving(); |
| 393 | |
| 394 | /* load sound ROMs and set up sound handlers */ |
| 395 | m_chip_type = sound; |
| 396 | |
| 397 | |
| 398 | /* default graphics functionality */ |
| 399 | 399 | m_gfx_rom_large = 0; |
| 400 | 400 | } |
| 401 | 401 | |
| r242780 | r242781 | |
| 434 | 434 | { |
| 435 | 435 | /* common init */ |
| 436 | 436 | init_tunit_generic(SOUND_ADPCM_LARGE); |
| 437 | | /* protection */
|
| 438 | | if (!te_protection)
|
| 439 | | {
|
| 440 | | m_nbajam_prot_table = nbajam_prot_values;
|
| 441 | | m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x1b14020, 0x1b2503f, read16_delegate(FUNC(midtunit_state::nbajam_prot_r),this), write16_delegate(FUNC(midtunit_state::nbajam_prot_w),this));
|
| 442 | | }
|
| 443 | | else
|
| 444 | | {
|
| 445 | | m_nbajam_prot_table = nbajamte_prot_values;
|
| 446 | | m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x1b15f40, 0x1b37f5f, read16_delegate(FUNC(midtunit_state::nbajam_prot_r),this), write16_delegate(FUNC(midtunit_state::nbajam_prot_w),this));
|
| 447 | | m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x1b95f40, 0x1bb7f5f, read16_delegate(FUNC(midtunit_state::nbajam_prot_r),this), write16_delegate(FUNC(midtunit_state::nbajam_prot_w),this));
|
| 448 | | }
|
| 437 | /* protection */ |
| 438 | if (!te_protection) |
| 439 | { |
| 440 | m_nbajam_prot_table = nbajam_prot_values; |
| 441 | m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x1b14020, 0x1b2503f, read16_delegate(FUNC(midtunit_state::nbajam_prot_r),this), write16_delegate(FUNC(midtunit_state::nbajam_prot_w),this)); |
| 442 | } |
| 443 | else |
| 444 | { |
| 445 | m_nbajam_prot_table = nbajamte_prot_values; |
| 446 | m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x1b15f40, 0x1b37f5f, read16_delegate(FUNC(midtunit_state::nbajam_prot_r),this), write16_delegate(FUNC(midtunit_state::nbajam_prot_w),this)); |
| 447 | m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x1b95f40, 0x1bb7f5f, read16_delegate(FUNC(midtunit_state::nbajam_prot_r),this), write16_delegate(FUNC(midtunit_state::nbajam_prot_w),this)); |
| 448 | } |
| 449 | 449 | |
| 450 | 450 | /* sound chip protection (hidden RAM) */ |
| 451 | 451 | if (!te_protection) |
| r242780 | r242781 | |
| 520 | 520 | * |
| 521 | 521 | *************************************/ |
| 522 | 522 | |
| 523 | | MACHINE_RESET_MEMBER(midtunit_state,midtunit)
|
| 524 | | {
|
| 525 | | /* reset sound */
|
| 526 | | switch (m_chip_type)
|
| 527 | | {
|
| 528 | | case SOUND_ADPCM:
|
| 529 | | case SOUND_ADPCM_LARGE:
|
| 523 | MACHINE_RESET_MEMBER(midtunit_state,midtunit) |
| 524 | { |
| 525 | /* reset sound */ |
| 526 | switch (m_chip_type) |
| 527 | { |
| 528 | case SOUND_ADPCM: |
| 529 | case SOUND_ADPCM_LARGE: |
| 530 | 530 | m_adpcm_sound->reset_write(1); |
| 531 | 531 | m_adpcm_sound->reset_write(0); |
| 532 | 532 | break; |
| r242780 | r242781 | |
| 547 | 547 | *************************************/ |
| 548 | 548 | |
| 549 | 549 | READ16_MEMBER(midtunit_state::midtunit_sound_state_r) |
| 550 | | {
|
| 551 | | /* logerror("%08X:Sound status read\n", space.device().safe_pc());*/
|
| 552 | | |
| 553 | | if (m_chip_type == SOUND_DCS)
|
| 554 | | return m_dcs->control_r() >> 4;
|
| 555 | | |
| 556 | | if (m_fake_sound_state)
|
| 557 | | {
|
| 558 | | m_fake_sound_state--;
|
| 559 | | return 0;
|
| 560 | | }
|
| 561 | | return ~0;
|
| 550 | { |
| 551 | /* logerror("%08X:Sound status read\n", space.device().safe_pc());*/ |
| 552 | |
| 553 | if (m_chip_type == SOUND_DCS) |
| 554 | return m_dcs->control_r() >> 4; |
| 555 | |
| 556 | if (m_fake_sound_state) |
| 557 | { |
| 558 | m_fake_sound_state--; |
| 559 | return 0; |
| 560 | } |
| 561 | return ~0; |
| 562 | 562 | } |
| 563 | 563 | |
| 564 | 564 | READ16_MEMBER(midtunit_state::midtunit_sound_r) |
| 565 | | {
|
| 566 | | logerror("%08X:Sound data read\n", space.device().safe_pc());
|
| 567 | | |
| 568 | | if (m_chip_type == SOUND_DCS)
|
| 569 | | return m_dcs->data_r() & 0xff;
|
| 570 | | |
| 571 | | return ~0;
|
| 565 | { |
| 566 | logerror("%08X:Sound data read\n", space.device().safe_pc()); |
| 567 | |
| 568 | if (m_chip_type == SOUND_DCS) |
| 569 | return m_dcs->data_r() & 0xff; |
| 570 | |
| 571 | return ~0; |
| 572 | 572 | } |
| 573 | 573 | |
| 574 | 574 | WRITE16_MEMBER(midtunit_state::midtunit_sound_w) |
| r242780 | r242781 | |
| 579 | 579 | logerror("%08X:Unexpected write to sound (lo) = %04X\n", space.device().safe_pc(), data); |
| 580 | 580 | return; |
| 581 | 581 | } |
| 582 | | |
| 583 | | /* call through based on the sound type */
|
| 584 | | if (ACCESSING_BITS_0_7 && ACCESSING_BITS_8_15)
|
| 585 | | switch (m_chip_type)
|
| 586 | | {
|
| 587 | | case SOUND_ADPCM:
|
| 588 | | case SOUND_ADPCM_LARGE:
|
| 582 | |
| 583 | /* call through based on the sound type */ |
| 584 | if (ACCESSING_BITS_0_7 && ACCESSING_BITS_8_15) |
| 585 | switch (m_chip_type) |
| 586 | { |
| 587 | case SOUND_ADPCM: |
| 588 | case SOUND_ADPCM_LARGE: |
| 589 | 589 | m_adpcm_sound->reset_write(~data & 0x100); |
| 590 | | m_adpcm_sound->write(space, offset, data & 0xff);
|
| 591 | | |
| 592 | | /* the games seem to check for $82 loops, so this should be just barely enough */
|
| 593 | | m_fake_sound_state = 128;
|
| 594 | | break;
|
| 595 | | |
| 596 | | case SOUND_DCS:
|
| 590 | m_adpcm_sound->write(space, offset, data & 0xff); |
| 591 | |
| 592 | /* the games seem to check for $82 loops, so this should be just barely enough */ |
| 593 | m_fake_sound_state = 128; |
| 594 | break; |
| 595 | |
| 596 | case SOUND_DCS: |
| 597 | 597 | logerror("%08X:Sound write = %04X\n", space.device().safe_pc(), data); |
| 598 | | m_dcs->reset_w(~data & 0x100);
|
| 599 | | m_dcs->data_w(data & 0xff);
|
| 600 | | /* the games seem to check for $82 loops, so this should be just barely enough */
|
| 601 | | m_fake_sound_state = 128;
|
| 602 | | break;
|
| 603 | | }
|
| 604 | | }
|
| 598 | m_dcs->reset_w(~data & 0x100); |
| 599 | m_dcs->data_w(data & 0xff); |
| 600 | /* the games seem to check for $82 loops, so this should be just barely enough */ |
| 601 | m_fake_sound_state = 128; |
| 602 | break; |
| 603 | } |
| 604 | } |