trunk/src/mame/machine/raiden2cop.c
| r32377 | r32378 | |
| 1308 | 1308 | cop_collision_update_hitbox(space, 0, cop_regs[2]); |
| 1309 | 1309 | } |
| 1310 | 1310 | |
| 1311 | |
| 1311 | 1312 | void raiden2cop_device::LEGACY_execute_b100(address_space &space, int offset, UINT16 data) |
| 1312 | 1313 | { |
| 1313 | | m_LEGACY_cop_collision_info[0].hitbox = space.read_word(cop_regs[2]); |
| 1314 | | m_LEGACY_cop_collision_info[0].hitbox_y = space.read_word((cop_regs[2] & 0xffff0000) | (m_LEGACY_cop_collision_info[0].hitbox)); |
| 1315 | | m_LEGACY_cop_collision_info[0].hitbox_x = space.read_word(((cop_regs[2] & 0xffff0000) | (m_LEGACY_cop_collision_info[0].hitbox)) + 2); |
| 1316 | | |
| 1317 | | /* do the math */ |
| 1318 | | LEGACY_cop_take_hit_box_params(0); |
| 1319 | | cop_hit_status = LEGACY_cop_calculate_collsion_detection(); |
| 1314 | LEGACY_cop_collision_update_hitbox(space, 0, cop_regs[2]); |
| 1320 | 1315 | } |
| 1321 | 1316 | |
| 1322 | 1317 | /* |
| r32377 | r32378 | |
| 1330 | 1325 | |
| 1331 | 1326 | void raiden2cop_device::LEGACY_execute_b900(address_space &space, int offset, UINT16 data) |
| 1332 | 1327 | { |
| 1333 | | m_LEGACY_cop_collision_info[1].hitbox = space.read_word(cop_regs[3]); |
| 1334 | | m_LEGACY_cop_collision_info[1].hitbox_y = space.read_word((cop_regs[3] & 0xffff0000) | (m_LEGACY_cop_collision_info[1].hitbox)); |
| 1335 | | m_LEGACY_cop_collision_info[1].hitbox_x = space.read_word(((cop_regs[3] & 0xffff0000) | (m_LEGACY_cop_collision_info[1].hitbox)) + 2); |
| 1336 | | |
| 1337 | | /* do the math */ |
| 1338 | | LEGACY_cop_take_hit_box_params(1); |
| 1339 | | cop_hit_status = LEGACY_cop_calculate_collsion_detection(); |
| 1328 | LEGACY_cop_collision_update_hitbox(space, 1, cop_regs[3]); |
| 1340 | 1329 | } |
| 1341 | 1330 | |
| 1342 | 1331 | /* |
| r32377 | r32378 | |
| 1553 | 1542 | cop_hit_val_stat = cop_hit_status ? 0xffff : 0x0000; |
| 1554 | 1543 | } |
| 1555 | 1544 | |
| 1545 | /* |
| 1546 | Godzilla 0x12c0 X = 0x21ed Y = 0x57da |
| 1547 | Megaron 0x12d0 X = 0x1ef1 Y = 0x55db |
| 1548 | King Ghidorah 0x12c8 X = 0x26eb Y = 0x55dc |
| 1549 | Mecha Ghidorah 0x12dc X = 0x24ec Y = 0x55dc |
| 1550 | Mecha Godzilla 0x12d4 X = 0x1cf1 Y = 0x52dc |
| 1551 | Gigan 0x12cc X = 0x23e8 Y = 0x55db |
| 1552 | |
| 1553 | (DC.W $1020, $F0C0, $0000, $0000) |
| 1554 | X = collides at the same spot |
| 1555 | Y = collides between 0xd0 and 0x20 |
| 1556 | 0x588 bits 2 & 3 = 0 |
| 1557 | (DC.W $F0C0, $1020, $0000, $0000) |
| 1558 | X = collides between 0xb0 and 0x50 (inclusive) |
| 1559 | Y = collides between 0xd0 and 0x30 (not inclusive) |
| 1560 | 0x588 bits 2 & 3 = 0x580 bits 0 & 1 |
| 1561 | */ |
| 1562 | |
| 1563 | void raiden2cop_device::LEGACY_cop_collision_update_hitbox(address_space &space, int slot, UINT32 hitadr) |
| 1564 | { |
| 1565 | UINT16 hitboxaddr = space.read_word(hitadr); |
| 1566 | UINT16 hithoxy = space.read_word((hitadr & 0xffff0000) | (hitboxaddr)); |
| 1567 | UINT16 hitboxx = space.read_word(((hitadr & 0xffff0000) | (hitboxaddr)) + 2); |
| 1568 | |
| 1569 | INT16 start_x,start_y,height,width; |
| 1570 | |
| 1571 | { |
| 1572 | height = UINT8(hithoxy >> 8); |
| 1573 | start_y = INT8(hithoxy); |
| 1574 | width = UINT8(hitboxx >> 8); |
| 1575 | start_x = INT8(hitboxx); |
| 1576 | } |
| 1577 | |
| 1578 | |
| 1579 | m_LEGACY_cop_collision_info[slot].min_x = (cop_collision_info[slot].pos[1]) + start_x; |
| 1580 | m_LEGACY_cop_collision_info[slot].max_x = m_LEGACY_cop_collision_info[slot].min_x + width; |
| 1581 | m_LEGACY_cop_collision_info[slot].min_y = (cop_collision_info[slot].pos[0]) + start_y; |
| 1582 | m_LEGACY_cop_collision_info[slot].max_y = m_LEGACY_cop_collision_info[slot].min_y + height; |
| 1583 | |
| 1584 | static UINT8 res; |
| 1585 | |
| 1586 | res = 3; |
| 1587 | |
| 1588 | /* outbound X check */ |
| 1589 | if(m_LEGACY_cop_collision_info[0].max_x >= m_LEGACY_cop_collision_info[1].min_x && m_LEGACY_cop_collision_info[0].min_x <= m_LEGACY_cop_collision_info[1].max_x) |
| 1590 | res &= ~2; |
| 1591 | |
| 1592 | if(m_LEGACY_cop_collision_info[1].max_x >= m_LEGACY_cop_collision_info[0].min_x && m_LEGACY_cop_collision_info[1].min_x <= m_LEGACY_cop_collision_info[0].max_x) |
| 1593 | res &= ~2; |
| 1594 | |
| 1595 | /* outbound Y check */ |
| 1596 | if(m_LEGACY_cop_collision_info[0].max_y >= m_LEGACY_cop_collision_info[1].min_y && m_LEGACY_cop_collision_info[0].min_y <= m_LEGACY_cop_collision_info[1].max_y) |
| 1597 | res &= ~1; |
| 1598 | |
| 1599 | if(m_LEGACY_cop_collision_info[1].max_y >= m_LEGACY_cop_collision_info[0].min_y && m_LEGACY_cop_collision_info[1].min_y <= m_LEGACY_cop_collision_info[0].max_y) |
| 1600 | res &= ~1; |
| 1601 | |
| 1602 | cop_hit_val[1] = (cop_collision_info[0].pos[1] - cop_collision_info[1].pos[1]); |
| 1603 | cop_hit_val[0] = (cop_collision_info[0].pos[0] - cop_collision_info[1].pos[0]); |
| 1604 | cop_hit_val[2] = 1; |
| 1605 | cop_hit_val_stat = res; // TODO: there's also bit 2 and 3 triggered in the tests, no known meaning |
| 1606 | |
| 1607 | |
| 1608 | cop_hit_status = res; |
| 1609 | } |
| 1610 | |
| 1611 | |
| 1556 | 1612 | WRITE16_MEMBER( raiden2cop_device::cop_cmd_w) |
| 1557 | 1613 | { |
| 1558 | 1614 | cop_status &= 0x7fff; |
| r32377 | r32378 | |
| 1860 | 1916 | |
| 1861 | 1917 | |
| 1862 | 1918 | |
| 1863 | | /* |
| 1864 | | Godzilla 0x12c0 X = 0x21ed Y = 0x57da |
| 1865 | | Megaron 0x12d0 X = 0x1ef1 Y = 0x55db |
| 1866 | | King Ghidorah 0x12c8 X = 0x26eb Y = 0x55dc |
| 1867 | | Mecha Ghidorah 0x12dc X = 0x24ec Y = 0x55dc |
| 1868 | | Mecha Godzilla 0x12d4 X = 0x1cf1 Y = 0x52dc |
| 1869 | | Gigan 0x12cc X = 0x23e8 Y = 0x55db |
| 1870 | 1919 | |
| 1871 | | (DC.W $1020, $F0C0, $0000, $0000) |
| 1872 | | X = collides at the same spot |
| 1873 | | Y = collides between 0xd0 and 0x20 |
| 1874 | | 0x588 bits 2 & 3 = 0 |
| 1875 | | (DC.W $F0C0, $1020, $0000, $0000) |
| 1876 | | X = collides between 0xb0 and 0x50 (inclusive) |
| 1877 | | Y = collides between 0xd0 and 0x30 (not inclusive) |
| 1878 | | 0x588 bits 2 & 3 = 0x580 bits 0 & 1 |
| 1879 | | */ |
| 1880 | | void raiden2cop_device::LEGACY_cop_take_hit_box_params(UINT8 offs) |
| 1881 | | { |
| 1882 | | INT16 start_x,start_y,height,width; |
| 1883 | 1920 | |
| 1884 | | { |
| 1885 | | height = UINT8(m_LEGACY_cop_collision_info[offs].hitbox_y >> 8); |
| 1886 | | start_y = INT8(m_LEGACY_cop_collision_info[offs].hitbox_y); |
| 1887 | | width = UINT8(m_LEGACY_cop_collision_info[offs].hitbox_x >> 8); |
| 1888 | | start_x = INT8(m_LEGACY_cop_collision_info[offs].hitbox_x); |
| 1889 | | } |
| 1890 | | |
| 1891 | | m_LEGACY_cop_collision_info[offs].min_x = (cop_collision_info[offs].pos[1]) + start_x; |
| 1892 | | m_LEGACY_cop_collision_info[offs].max_x = m_LEGACY_cop_collision_info[offs].min_x + width; |
| 1893 | | m_LEGACY_cop_collision_info[offs].min_y = (cop_collision_info[offs].pos[0]) + start_y; |
| 1894 | | m_LEGACY_cop_collision_info[offs].max_y = m_LEGACY_cop_collision_info[offs].min_y + height; |
| 1895 | | } |
| 1896 | | |
| 1897 | | |
| 1898 | | UINT8 raiden2cop_device::LEGACY_cop_calculate_collsion_detection() |
| 1899 | | { |
| 1900 | | static UINT8 res; |
| 1901 | | |
| 1902 | | res = 3; |
| 1903 | | |
| 1904 | | /* outbound X check */ |
| 1905 | | if(m_LEGACY_cop_collision_info[0].max_x >= m_LEGACY_cop_collision_info[1].min_x && m_LEGACY_cop_collision_info[0].min_x <= m_LEGACY_cop_collision_info[1].max_x) |
| 1906 | | res &= ~2; |
| 1907 | | |
| 1908 | | if(m_LEGACY_cop_collision_info[1].max_x >= m_LEGACY_cop_collision_info[0].min_x && m_LEGACY_cop_collision_info[1].min_x <= m_LEGACY_cop_collision_info[0].max_x) |
| 1909 | | res &= ~2; |
| 1910 | | |
| 1911 | | /* outbound Y check */ |
| 1912 | | if(m_LEGACY_cop_collision_info[0].max_y >= m_LEGACY_cop_collision_info[1].min_y && m_LEGACY_cop_collision_info[0].min_y <= m_LEGACY_cop_collision_info[1].max_y) |
| 1913 | | res &= ~1; |
| 1914 | | |
| 1915 | | if(m_LEGACY_cop_collision_info[1].max_y >= m_LEGACY_cop_collision_info[0].min_y && m_LEGACY_cop_collision_info[1].min_y <= m_LEGACY_cop_collision_info[0].max_y) |
| 1916 | | res &= ~1; |
| 1917 | | |
| 1918 | | cop_hit_val[1] = (cop_collision_info[0].pos[1] - cop_collision_info[1].pos[1]); |
| 1919 | | cop_hit_val[0] = (cop_collision_info[0].pos[0] - cop_collision_info[1].pos[0]); |
| 1920 | | cop_hit_val[2] = 1; |
| 1921 | | cop_hit_val_stat = res; // TODO: there's also bit 2 and 3 triggered in the tests, no known meaning |
| 1922 | | |
| 1923 | | //popmessage("%d %d %04x %04x %04x %04x",cop_hit_val[1],cop_hit_val[0],m_LEGACY_cop_collision_info[0].hitbox_x,m_LEGACY_cop_collision_info[0].hitbox_y,m_LEGACY_cop_collision_info[1].hitbox_x,m_LEGACY_cop_collision_info[1].hitbox_y); |
| 1924 | | |
| 1925 | | //if(res == 0) |
| 1926 | | //popmessage("0:%08x %08x %08x 1:%08x %08x %08x\n",cop_collision_info[0].pos[1],cop_collision_info[0].pos[0],m_LEGACY_cop_collision_info[0].hitbox,cop_collision_info[1].pos[1],cop_collision_info[1].pos[0],m_LEGACY_cop_collision_info[1].hitbox); |
| 1927 | | // popmessage("0:%08x %08x %08x %08x 1:%08x %08x %08x %08x\n",m_LEGACY_cop_collision_info[0].min_x,m_LEGACY_cop_collision_info[0].max_x,m_LEGACY_cop_collision_info[0].min_y, m_LEGACY_cop_collision_info[0].max_y, |
| 1928 | | // m_LEGACY_cop_collision_info[1].min_x,m_LEGACY_cop_collision_info[1].max_x,m_LEGACY_cop_collision_info[1].min_y, m_LEGACY_cop_collision_info[1].max_y); |
| 1929 | | |
| 1930 | | return res; |
| 1931 | | } |
| 1932 | | |
| 1933 | | |
| 1934 | 1921 | WRITE16_MEMBER(raiden2cop_device::LEGACY_cop_cmd_w) |
| 1935 | 1922 | { |
| 1936 | 1923 | int command; |