Previous 199869 Revisions Next

r32378 Thursday 25th September, 2014 at 16:05:12 UTC by David Haywood
refactor (nw)
[src/mame/machine]raiden2cop.c raiden2cop.h

trunk/src/mame/machine/raiden2cop.c
r32377r32378
13081308   cop_collision_update_hitbox(space, 0, cop_regs[2]);
13091309}
13101310
1311
13111312void raiden2cop_device::LEGACY_execute_b100(address_space &space, int offset, UINT16 data)
13121313{
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]);
13201315}
13211316
13221317/*
r32377r32378
13301325
13311326void raiden2cop_device::LEGACY_execute_b900(address_space &space, int offset, UINT16 data)
13321327{
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]);
13401329}
13411330
13421331/*
r32377r32378
15531542   cop_hit_val_stat = cop_hit_status ? 0xffff : 0x0000;
15541543}
15551544
1545/*
1546Godzilla 0x12c0 X = 0x21ed Y = 0x57da
1547Megaron  0x12d0 X = 0x1ef1 Y = 0x55db
1548King Ghidorah 0x12c8 X = 0x26eb Y = 0x55dc
1549Mecha Ghidorah 0x12dc X = 0x24ec Y = 0x55dc
1550Mecha Godzilla 0x12d4 X = 0x1cf1 Y = 0x52dc
1551Gigan 0x12cc X = 0x23e8 Y = 0x55db
1552
1553(DC.W $1020, $F0C0, $0000, $0000)
1554X = collides at the same spot
1555Y = collides between 0xd0 and 0x20
15560x588 bits 2 & 3 = 0
1557(DC.W $F0C0, $1020, $0000, $0000)
1558X = collides between 0xb0 and 0x50 (inclusive)
1559Y = collides between 0xd0 and 0x30 (not inclusive)
15600x588 bits 2 & 3 = 0x580 bits 0 & 1
1561*/
1562
1563void  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
15561612WRITE16_MEMBER( raiden2cop_device::cop_cmd_w)
15571613{
15581614   cop_status &= 0x7fff;
r32377r32378
18601916
18611917
18621918
1863/*
1864Godzilla 0x12c0 X = 0x21ed Y = 0x57da
1865Megaron  0x12d0 X = 0x1ef1 Y = 0x55db
1866King Ghidorah 0x12c8 X = 0x26eb Y = 0x55dc
1867Mecha Ghidorah 0x12dc X = 0x24ec Y = 0x55dc
1868Mecha Godzilla 0x12d4 X = 0x1cf1 Y = 0x52dc
1869Gigan 0x12cc X = 0x23e8 Y = 0x55db
18701919
1871(DC.W $1020, $F0C0, $0000, $0000)
1872X = collides at the same spot
1873Y = collides between 0xd0 and 0x20
18740x588 bits 2 & 3 = 0
1875(DC.W $F0C0, $1020, $0000, $0000)
1876X = collides between 0xb0 and 0x50 (inclusive)
1877Y = collides between 0xd0 and 0x30 (not inclusive)
18780x588 bits 2 & 3 = 0x580 bits 0 & 1
1879*/
1880void raiden2cop_device::LEGACY_cop_take_hit_box_params(UINT8 offs)
1881{
1882   INT16 start_x,start_y,height,width;
18831920
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
1898UINT8 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
19341921WRITE16_MEMBER(raiden2cop_device::LEGACY_cop_cmd_w)
19351922{
19361923   int command;
trunk/src/mame/machine/raiden2cop.h
r32377r32378
231231   struct LEGACY_collision_info
232232   {
233233      LEGACY_collision_info():
234      //x(0),
235      //y(0),
236234      min_x(0),
237235      min_y(0),
238236      max_x(0),
239      max_y(0),
240      hitbox(0),
241      hitbox_x(0),
242      hitbox_y(0) {}
237      max_y(0)
238       {}
243239
244      //int x,y;
245240      INT16 min_x,min_y,max_x,max_y;
246      UINT16 hitbox;
247      UINT16 hitbox_x,hitbox_y;
248241   };
249242
250243   struct LEGACY_collision_info m_LEGACY_cop_collision_info[2];
251   void LEGACY_cop_take_hit_box_params(UINT8 offs);
252   UINT8 LEGACY_cop_calculate_collsion_detection();
244   void  LEGACY_cop_collision_update_hitbox(address_space &space, int slot, UINT32 hitadr);
253245
254246   // endian stuff?
255247   int m_cpu_is_68k;

Previous 199869 Revisions Next


© 1997-2024 The MAME Team