trunk/src/mame/machine/raiden2cop.c
| r32458 | r32459 | |
| 147 | 147 | save_item(NAME(cop_collision_info[0].spradr)); |
| 148 | 148 | save_item(NAME(cop_collision_info[0].allow_swap)); |
| 149 | 149 | save_item(NAME(cop_collision_info[0].flags_swap)); |
| 150 | save_item(NAME(cop_collision_info[0].min)); |
| 151 | save_item(NAME(cop_collision_info[0].max)); |
| 150 | 152 | |
| 151 | 153 | save_item(NAME(cop_collision_info[1].pos)); |
| 152 | 154 | save_item(NAME(cop_collision_info[1].dx)); |
| r32458 | r32459 | |
| 154 | 156 | save_item(NAME(cop_collision_info[1].spradr)); |
| 155 | 157 | save_item(NAME(cop_collision_info[1].allow_swap)); |
| 156 | 158 | save_item(NAME(cop_collision_info[1].flags_swap)); |
| 159 | save_item(NAME(cop_collision_info[1].min)); |
| 160 | save_item(NAME(cop_collision_info[1].max)); |
| 157 | 161 | |
| 158 | 162 | save_item(NAME(m_cop_rng_max_value)); |
| 159 | 163 | |
| r32458 | r32459 | |
| 1454 | 1458 | */ |
| 1455 | 1459 | void raiden2cop_device::execute_b100(address_space &space, int offset, UINT16 data) |
| 1456 | 1460 | { |
| 1457 | | cop_collision_update_hitbox(space, 0, cop_regs[2]); |
| 1461 | cop_collision_update_hitbox(space, data, 0, cop_regs[2]); |
| 1458 | 1462 | } |
| 1459 | 1463 | |
| 1460 | 1464 | |
| 1461 | | void raiden2cop_device::LEGACY_execute_b100(address_space &space, int offset, UINT16 data) |
| 1462 | | { |
| 1463 | | LEGACY_cop_collision_update_hitbox(space, data, 0, cop_regs[2]); |
| 1464 | | } |
| 1465 | 1465 | |
| 1466 | |
| 1466 | 1467 | /* |
| 1467 | 1468 | ## - trig (up5) (low11) : (sq0, sq1, sq2, sq3, sq4, sq5, sq6, sq7) valu mask |
| 1468 | 1469 | 17 - b900 ( 17) ( 100) : (b60, be0, be2, 000, 000, 000, 000, 000) 6 ffff (legionna, cupsoc, grainbow, godzilla, denjinmk, raiden2, raidendx, zeroteam, xsedae) |
| r32458 | r32459 | |
| 1470 | 1471 | */ |
| 1471 | 1472 | void raiden2cop_device::execute_b900(address_space &space, int offset, UINT16 data) |
| 1472 | 1473 | { |
| 1473 | | cop_collision_update_hitbox(space, 1, cop_regs[3]); |
| 1474 | cop_collision_update_hitbox(space, data, 1, cop_regs[3]); |
| 1474 | 1475 | } |
| 1475 | 1476 | |
| 1476 | | void raiden2cop_device::LEGACY_execute_b900(address_space &space, int offset, UINT16 data) |
| 1477 | | { |
| 1478 | | LEGACY_cop_collision_update_hitbox(space, data, 1, cop_regs[3]); |
| 1479 | | } |
| 1480 | 1477 | |
| 1478 | |
| 1481 | 1479 | /* |
| 1482 | 1480 | ## - trig (up5) (low11) : (sq0, sq1, sq2, sq3, sq4, sq5, sq6, sq7) valu mask |
| 1483 | 1481 | 18 - c480 ( 18) ( 480) : (080, 882, 000, 000, 000, 000, 000, 000) a ff00 (legionna, heatbrl, cupsoc, grainbow, godzilla, denjinmk) |
| r32458 | r32459 | |
| 1682 | 1680 | cop_collision_info[slot].pos[i] = cop_read_word(space, spradr+6+4*i); |
| 1683 | 1681 | } |
| 1684 | 1682 | |
| 1685 | | void raiden2cop_device::cop_collision_update_hitbox(address_space &space, int slot, UINT32 hitadr) |
| 1686 | | { |
| 1687 | | UINT32 hitadr2 = space.read_word(hitadr) | (cop_hit_baseadr << 16); |
| 1688 | 1683 | |
| 1689 | | for(int i=0; i<3; i++) { |
| 1690 | | cop_collision_info[slot].dx[i] = space.read_byte(hitadr2++); |
| 1691 | | cop_collision_info[slot].size[i] = space.read_byte(hitadr2++); |
| 1692 | | } |
| 1693 | 1684 | |
| 1694 | | cop_hit_status = 7; |
| 1695 | | |
| 1696 | | for(int i=0; i<3; i++) { |
| 1697 | | int min[2], max[2]; |
| 1698 | | for(int j=0; j<2; j++) { |
| 1699 | | if(cop_collision_info[j].allow_swap && (cop_collision_info[j].flags_swap & (1 << i))) { |
| 1700 | | max[j] = cop_collision_info[j].pos[i] - cop_collision_info[j].dx[i]; |
| 1701 | | min[j] = max[j] - cop_collision_info[j].size[i]; |
| 1702 | | } else { |
| 1703 | | min[j] = cop_collision_info[j].pos[i] + cop_collision_info[j].dx[i]; |
| 1704 | | max[j] = min[j] + cop_collision_info[j].size[i]; |
| 1705 | | } |
| 1706 | | } |
| 1707 | | if(max[0] > min[1] && min[0] < max[1]) |
| 1708 | | cop_hit_status &= ~(1 << i); |
| 1709 | | cop_hit_val[i] = cop_collision_info[0].pos[i] - cop_collision_info[1].pos[i]; |
| 1710 | | } |
| 1711 | | |
| 1712 | | cop_hit_val_stat = cop_hit_status ? 0xffff : 0x0000; |
| 1713 | | } |
| 1714 | | |
| 1715 | 1685 | /* |
| 1716 | 1686 | Godzilla 0x12c0 X = 0x21ed Y = 0x57da |
| 1717 | 1687 | Megaron 0x12d0 X = 0x1ef1 Y = 0x55db |
| r32458 | r32459 | |
| 1730 | 1700 | 0x588 bits 2 & 3 = 0x580 bits 0 & 1 |
| 1731 | 1701 | */ |
| 1732 | 1702 | |
| 1733 | | void raiden2cop_device::LEGACY_cop_collision_update_hitbox(address_space &space, UINT16 data, int slot, UINT32 hitadr) |
| 1703 | void raiden2cop_device::cop_collision_update_hitbox(address_space &space, UINT16 data, int slot, UINT32 hitadr) |
| 1734 | 1704 | { |
| 1735 | 1705 | UINT32 hitadr2 = space.read_word(hitadr) | (cop_hit_baseadr << 16); // DON'T use cop_read_word here, doesn't need endian fixing?! |
| 1736 | 1706 | int num_axis = 2; |
| 1707 | int extraxor = 0; |
| 1708 | if (m_cpu_is_68k) extraxor = 1; |
| 1737 | 1709 | |
| 1738 | 1710 | // guess, heatbrl doesn't have this set and clearly only wants 2 axis to be checked (otherwise it reads bad params into the 3rd) |
| 1739 | 1711 | // everything else has it set, and legionna clearly wants 3 axis for jumping attacks to work |
| r32458 | r32459 | |
| 1747 | 1719 | } |
| 1748 | 1720 | |
| 1749 | 1721 | for(i=0; i<num_axis; i++) { |
| 1750 | | cop_collision_info[slot].dx[i] = space.read_byte(1^ (hitadr2++)); |
| 1751 | | cop_collision_info[slot].size[i] = space.read_byte(1^ (hitadr2++)); |
| 1722 | cop_collision_info[slot].dx[i] = space.read_byte(extraxor^ (hitadr2++)); |
| 1723 | cop_collision_info[slot].size[i] = space.read_byte(extraxor^ (hitadr2++)); |
| 1752 | 1724 | } |
| 1753 | 1725 | |
| 1754 | 1726 | INT16 dx[3],size[3]; |
| r32458 | r32459 | |
| 1773 | 1745 | { |
| 1774 | 1746 | if (cop_collision_info[j].allow_swap && (cop_collision_info[j].flags_swap & (1 << i))) |
| 1775 | 1747 | { |
| 1776 | | m_LEGACY_cop_collision_info[j].max[i] = (cop_collision_info[j].pos[i]) - dx[i]; |
| 1777 | | m_LEGACY_cop_collision_info[j].min[i] = m_LEGACY_cop_collision_info[j].max[i] - size[i]; |
| 1748 | cop_collision_info[j].max[i] = (cop_collision_info[j].pos[i]) - dx[i]; |
| 1749 | cop_collision_info[j].min[i] = cop_collision_info[j].max[i] - size[i]; |
| 1778 | 1750 | } |
| 1779 | 1751 | else |
| 1780 | 1752 | { |
| 1781 | | m_LEGACY_cop_collision_info[j].min[i] = (cop_collision_info[j].pos[i]) + dx[i]; |
| 1782 | | m_LEGACY_cop_collision_info[j].max[i] = m_LEGACY_cop_collision_info[j].min[i] + size[i]; |
| 1753 | cop_collision_info[j].min[i] = (cop_collision_info[j].pos[i]) + dx[i]; |
| 1754 | cop_collision_info[j].max[i] = cop_collision_info[j].min[i] + size[i]; |
| 1783 | 1755 | } |
| 1784 | 1756 | |
| 1785 | | if(m_LEGACY_cop_collision_info[0].max[i] >= m_LEGACY_cop_collision_info[1].min[i] && m_LEGACY_cop_collision_info[0].min[i] <= m_LEGACY_cop_collision_info[1].max[i]) |
| 1757 | if(cop_collision_info[0].max[i] >= cop_collision_info[1].min[i] && cop_collision_info[0].min[i] <= cop_collision_info[1].max[i]) |
| 1786 | 1758 | res &= ~(1 << i); |
| 1787 | 1759 | |
| 1788 | | if(m_LEGACY_cop_collision_info[1].max[i] >= m_LEGACY_cop_collision_info[0].min[i] && m_LEGACY_cop_collision_info[1].min[i] <= m_LEGACY_cop_collision_info[0].max[i]) |
| 1760 | if(cop_collision_info[1].max[i] >= cop_collision_info[0].min[i] && cop_collision_info[1].min[i] <= cop_collision_info[0].max[i]) |
| 1789 | 1761 | res &= ~(1 << i); |
| 1790 | 1762 | |
| 1791 | 1763 | cop_hit_val[i] = (cop_collision_info[0].pos[i] - cop_collision_info[1].pos[i]); |
| r32458 | r32459 | |
| 1899 | 1871 | break; |
| 1900 | 1872 | |
| 1901 | 1873 | case 0xb100: { |
| 1902 | | execute_b100(space, offset, data); // collisions |
| 1874 | execute_b100(space, offset, data);// collisions |
| 1903 | 1875 | break; |
| 1904 | 1876 | } |
| 1905 | 1877 | |
| r32458 | r32459 | |
| 2273 | 2245 | if (check_command_matches(command, 0xb40, 0xbc0, 0xbc2, 0x000, 0x000, 0x000, 0x000, 0x000, funcval, funcmask)) |
| 2274 | 2246 | { |
| 2275 | 2247 | executed = 1; |
| 2276 | | LEGACY_execute_b100(space, offset, data); |
| 2248 | execute_b100(space, offset, data); |
| 2277 | 2249 | return; |
| 2278 | 2250 | } |
| 2279 | 2251 | |
| r32458 | r32459 | |
| 2288 | 2260 | if (check_command_matches(command, 0xb60, 0xbe0, 0xbe2, 0x000, 0x000, 0x000, 0x000, 0x000, funcval, funcmask)) |
| 2289 | 2261 | { |
| 2290 | 2262 | executed = 1; |
| 2291 | | LEGACY_execute_b900(space, offset, data); |
| 2263 | execute_b900(space, offset, data); |
| 2292 | 2264 | return; |
| 2293 | 2265 | } |
| 2294 | 2266 | |
trunk/src/mame/machine/raiden2cop.h
| r32458 | r32459 | |
| 129 | 129 | |
| 130 | 130 | |
| 131 | 131 | struct colinfo { |
| 132 | |
| 133 | colinfo() |
| 134 | { |
| 135 | pos[0] = pos[1] = pos[2] = 0; |
| 136 | dx[0] = dx[1] = dx[2] = 0; |
| 137 | size[0] = size[1] = size[2] = 0; |
| 138 | allow_swap = false; |
| 139 | flags_swap = 0; |
| 140 | spradr = 0; |
| 141 | min[0] = min[1] = min[2] = 0; |
| 142 | max[0] = max[1] = max[2] = 0; |
| 143 | |
| 144 | } |
| 145 | |
| 146 | |
| 132 | 147 | INT16 pos[3]; |
| 133 | 148 | INT8 dx[3]; |
| 134 | 149 | UINT8 size[3]; |
| 135 | 150 | bool allow_swap; |
| 136 | 151 | UINT16 flags_swap; |
| 137 | 152 | UINT32 spradr; |
| 153 | INT16 min[3], max[3]; |
| 154 | |
| 155 | |
| 138 | 156 | }; |
| 139 | 157 | |
| 140 | 158 | colinfo cop_collision_info[2]; |
| r32458 | r32459 | |
| 144 | 162 | UINT16 cop_hit_val_stat; |
| 145 | 163 | |
| 146 | 164 | void cop_collision_read_pos(address_space &space, int slot, UINT32 spradr, bool allow_swap); |
| 147 | | void cop_collision_update_hitbox(address_space &space, int slot, UINT32 hitadr); |
| 148 | 165 | |
| 149 | 166 | void execute_8100(address_space &space, int offset, UINT16 data); |
| 150 | 167 | void execute_8900(address_space &space, int offset, UINT16 data); |
| r32458 | r32459 | |
| 173 | 190 | void LEGACY_execute_130e(address_space &space, int offset, UINT16 data); |
| 174 | 191 | void LEGACY_execute_130e_cupsoc(address_space &space, int offset, UINT16 data); |
| 175 | 192 | void LEGACY_execute_3b30(address_space &space, int offset, UINT16 data); |
| 176 | | void LEGACY_execute_b100(address_space &space, int offset, UINT16 data); |
| 177 | | void LEGACY_execute_b900(address_space &space, int offset, UINT16 data); |
| 178 | 193 | void LEGACY_execute_42c2(address_space &space, int offset, UINT16 data); |
| 179 | 194 | void LEGACY_execute_e30e(address_space &space, int offset, UINT16 data); |
| 180 | 195 | void LEGACY_execute_6200(address_space &space, int offset, UINT16 data); |
| r32458 | r32459 | |
| 228 | 243 | int m_LEGACY_r0, m_LEGACY_r1; |
| 229 | 244 | DECLARE_WRITE16_MEMBER(LEGACY_cop_cmd_w); |
| 230 | 245 | |
| 231 | | struct LEGACY_collision_info |
| 232 | | { |
| 233 | | LEGACY_collision_info() |
| 234 | | { |
| 235 | | min[0] = min[1] = min[2] = 0; |
| 236 | | max[0] = max[1] = max[2] = 0; |
| 237 | | |
| 238 | | } |
| 239 | 246 | |
| 240 | | INT16 min[3], max[3]; |
| 241 | | }; |
| 247 | void cop_collision_update_hitbox(address_space &space, UINT16 data, int slot, UINT32 hitadr); |
| 242 | 248 | |
| 243 | | struct LEGACY_collision_info m_LEGACY_cop_collision_info[2]; |
| 244 | | void LEGACY_cop_collision_update_hitbox(address_space &space, UINT16 data, int slot, UINT32 hitadr); |
| 245 | | |
| 246 | 249 | // endian stuff? |
| 247 | 250 | int m_cpu_is_68k; |
| 248 | 251 | static void set_cpu_is_68k(device_t &device, int value) { downcast<raiden2cop_device &>(device).m_cpu_is_68k = value; } |