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; } |