trunk/src/mame/machine/seicop.c
| r32330 | r32331 | |
| 1627 | 1627 | m_raiden2cop(*this, ":raiden2cop") |
| 1628 | 1628 | { |
| 1629 | 1629 | |
| 1630 | | for (int i = 0; i < 8; i++) |
| 1631 | | { |
| 1632 | | m_cop_register[i] = 0; |
| 1633 | | } |
| 1630 | |
| 1634 | 1631 | } |
| 1635 | 1632 | |
| 1636 | 1633 | #define seibu_cop_log logerror |
| r32330 | r32331 | |
| 1845 | 1842 | logerror("%06x: COPX unhandled write data %04x at offset %04x\n", space.device().safe_pc(), data, offset*2); |
| 1846 | 1843 | break; |
| 1847 | 1844 | } |
| 1848 | | case (0x4a0/2): { m_cop_register[0] = (m_cop_register[0]&0x0000ffff)|(m_cop_mcu_ram[offset]<<16); break; } |
| 1849 | | case (0x4c0/2): { m_cop_register[0] = (m_cop_register[0]&0xffff0000)|(m_cop_mcu_ram[offset]<<0); break; } |
| 1850 | 1845 | |
| 1851 | | case (0x4a2/2): { m_cop_register[1] = (m_cop_register[1]&0x0000ffff)|(m_cop_mcu_ram[offset]<<16); break; } |
| 1852 | | case (0x4c2/2): { m_cop_register[1] = (m_cop_register[1]&0xffff0000)|(m_cop_mcu_ram[offset]<<0); break; } |
| 1853 | | |
| 1854 | | case (0x4a4/2): { m_cop_register[2] = (m_cop_register[2]&0x0000ffff)|(m_cop_mcu_ram[offset]<<16); break; } |
| 1855 | | case (0x4c4/2): { m_cop_register[2] = (m_cop_register[2]&0xffff0000)|(m_cop_mcu_ram[offset]<<0); break; } |
| 1856 | | |
| 1857 | | case (0x4a6/2): { m_cop_register[3] = (m_cop_register[3]&0x0000ffff)|(m_cop_mcu_ram[offset]<<16); break; } |
| 1858 | | case (0x4c6/2): { m_cop_register[3] = (m_cop_register[3]&0xffff0000)|(m_cop_mcu_ram[offset]<<0); break; } |
| 1859 | | |
| 1860 | | case (0x4a8/2): { m_cop_register[4] = (m_cop_register[4]&0x0000ffff)|(m_cop_mcu_ram[offset]<<16); break; } |
| 1861 | | case (0x4c8/2): { m_cop_register[4] = (m_cop_register[4]&0xffff0000)|(m_cop_mcu_ram[offset]<<0); break; } |
| 1862 | | |
| 1863 | | case (0x4aa/2): { m_cop_register[5] = (m_cop_register[5]&0x0000ffff)|(m_cop_mcu_ram[offset]<<16); break; } |
| 1864 | | case (0x4ca/2): { m_cop_register[5] = (m_cop_register[5]&0xffff0000)|(m_cop_mcu_ram[offset]<<0); break; } |
| 1865 | | |
| 1866 | | case (0x4ac/2): { m_cop_register[6] = (m_cop_register[6]&0x0000ffff)|(m_cop_mcu_ram[offset]<<16); break; } |
| 1867 | | case (0x4cc/2): { m_cop_register[6] = (m_cop_register[6]&0xffff0000)|(m_cop_mcu_ram[offset]<<0); break; } |
| 1868 | | |
| 1869 | 1846 | |
| 1870 | 1847 | case (0x500/2): |
| 1871 | 1848 | case (0x502/2): |
| r32330 | r32331 | |
| 1874 | 1851 | { |
| 1875 | 1852 | case 0x8100: |
| 1876 | 1853 | { |
| 1877 | | int raw_angle = (space.read_word(m_cop_register[0]+(0x34^2)) & 0xff); |
| 1854 | int raw_angle = (space.read_word(m_raiden2cop->cop_regs[0]+(0x34^2)) & 0xff); |
| 1878 | 1855 | double angle = raw_angle * M_PI / 128; |
| 1879 | | double amp = (65536 >> 5)*(space.read_word(m_cop_register[0]+(0x36^2)) & 0xff); |
| 1856 | double amp = (65536 >> 5)*(space.read_word(m_raiden2cop->cop_regs[0]+(0x36^2)) & 0xff); |
| 1880 | 1857 | int res; |
| 1881 | 1858 | |
| 1882 | 1859 | /* TODO: up direction, why? */ |
| r32330 | r32331 | |
| 1885 | 1862 | |
| 1886 | 1863 | res = int(amp*sin(angle)) << m_cop_scale; |
| 1887 | 1864 | |
| 1888 | | space.write_dword(m_cop_register[0] + 0x10, res); |
| 1865 | space.write_dword(m_raiden2cop->cop_regs[0] + 0x10, res); |
| 1889 | 1866 | |
| 1890 | 1867 | break; |
| 1891 | 1868 | } |
| 1892 | 1869 | case 0x8900: |
| 1893 | 1870 | { |
| 1894 | | int raw_angle = (space.read_word(m_cop_register[0]+(0x34^2)) & 0xff); |
| 1871 | int raw_angle = (space.read_word(m_raiden2cop->cop_regs[0]+(0x34^2)) & 0xff); |
| 1895 | 1872 | double angle = raw_angle * M_PI / 128; |
| 1896 | | double amp = (65536 >> 5)*(space.read_word(m_cop_register[0]+(0x36^2)) & 0xff); |
| 1873 | double amp = (65536 >> 5)*(space.read_word(m_raiden2cop->cop_regs[0]+(0x36^2)) & 0xff); |
| 1897 | 1874 | int res; |
| 1898 | 1875 | |
| 1899 | 1876 | /* TODO: left direction, why? */ |
| r32330 | r32331 | |
| 1902 | 1879 | |
| 1903 | 1880 | res = int(amp*cos(angle)) << m_cop_scale; |
| 1904 | 1881 | |
| 1905 | | space.write_dword(m_cop_register[0] + 20, res); |
| 1882 | space.write_dword(m_raiden2cop->cop_regs[0] + 20, res); |
| 1906 | 1883 | |
| 1907 | 1884 | break; |
| 1908 | 1885 | } |
| r32330 | r32331 | |
| 1911 | 1888 | UINT8 offs; |
| 1912 | 1889 | |
| 1913 | 1890 | offs = (offset & 3) * 4; |
| 1914 | | int ppos = space.read_dword(m_cop_register[0] + 4 + offs); |
| 1915 | | int npos = ppos + space.read_dword(m_cop_register[0] + 0x10 + offs); |
| 1891 | int ppos = space.read_dword(m_raiden2cop->cop_regs[0] + 4 + offs); |
| 1892 | int npos = ppos + space.read_dword(m_raiden2cop->cop_regs[0] + 0x10 + offs); |
| 1916 | 1893 | int delta = (npos >> 16) - (ppos >> 16); |
| 1917 | 1894 | |
| 1918 | | space.write_dword(m_cop_register[0] + 4 + offs, npos); |
| 1919 | | space.write_word(m_cop_register[0] + 0x1c + offs, space.read_word(m_cop_register[0] + 0x1c + offs) + delta); |
| 1895 | space.write_dword(m_raiden2cop->cop_regs[0] + 4 + offs, npos); |
| 1896 | space.write_word(m_raiden2cop->cop_regs[0] + 0x1c + offs, space.read_word(m_raiden2cop->cop_regs[0] + 0x1c + offs) + delta); |
| 1920 | 1897 | |
| 1921 | 1898 | break; |
| 1922 | 1899 | } |
| 1923 | 1900 | case 0x130e: |
| 1924 | 1901 | case 0x138e: |
| 1925 | 1902 | { |
| 1926 | | int dy = space.read_dword(m_cop_register[1]+4) - space.read_dword(m_cop_register[0]+4); |
| 1927 | | int dx = space.read_dword(m_cop_register[1]+8) - space.read_dword(m_cop_register[0]+8); |
| 1903 | int dy = space.read_dword(m_raiden2cop->cop_regs[1]+4) - space.read_dword(m_raiden2cop->cop_regs[0]+4); |
| 1904 | int dx = space.read_dword(m_raiden2cop->cop_regs[1]+8) - space.read_dword(m_raiden2cop->cop_regs[0]+8); |
| 1928 | 1905 | |
| 1929 | 1906 | m_raiden2cop->cop_status = 7; |
| 1930 | 1907 | if(!dx) { |
| r32330 | r32331 | |
| 1940 | 1917 | m_r1 = dx; |
| 1941 | 1918 | |
| 1942 | 1919 | if(m_cop_mcu_ram[offset] & 0x80) |
| 1943 | | space.write_word(m_cop_register[0]+(0x34^2), m_raiden2cop->cop_angle); |
| 1920 | space.write_word(m_raiden2cop->cop_regs[0]+(0x34^2), m_raiden2cop->cop_angle); |
| 1944 | 1921 | |
| 1945 | 1922 | break; |
| 1946 | 1923 | } |
| r32330 | r32331 | |
| 1955 | 1932 | m_raiden2cop->cop_dist = sqrt((double)(dx*dx+dy*dy)); |
| 1956 | 1933 | |
| 1957 | 1934 | if(m_cop_mcu_ram[offset] & 0x80) |
| 1958 | | space.write_word(m_cop_register[0]+(0x38), m_raiden2cop->cop_dist); |
| 1935 | space.write_word(m_raiden2cop->cop_regs[0]+(0x38), m_raiden2cop->cop_dist); |
| 1959 | 1936 | |
| 1960 | 1937 | break; |
| 1961 | 1938 | } |
| r32330 | r32331 | |
| 2141 | 2118 | else |
| 2142 | 2119 | { |
| 2143 | 2120 | /* guess */ |
| 2144 | | m_cop_register[4]+=8; |
| 2121 | m_raiden2cop->cop_regs[4]+=8; |
| 2145 | 2122 | m_cop_sprite_dma_src+=6; |
| 2146 | 2123 | |
| 2147 | 2124 | m_cop_sprite_dma_size--; |
| r32330 | r32331 | |
| 2212 | 2189 | case (0x08c/2): m_cop_sprite_dma_abs_y = (m_cop_mcu_ram[0x08c/2]); break; |
| 2213 | 2190 | case (0x08e/2): m_cop_sprite_dma_abs_x = (m_cop_mcu_ram[0x08e/2]); break; |
| 2214 | 2191 | |
| 2215 | | /* Registers */ |
| 2216 | | case (0x0a0/2): { m_cop_register[0] = (m_cop_register[0]&0x0000ffff)|(m_cop_mcu_ram[offset]<<16); break; } |
| 2217 | | case (0x0c0/2): { m_cop_register[0] = (m_cop_register[0]&0xffff0000)|(m_cop_mcu_ram[offset]<<0); break; } |
| 2192 | |
| 2218 | 2193 | |
| 2219 | | case (0x0a2/2): { m_cop_register[1] = (m_cop_register[1]&0x0000ffff)|(m_cop_mcu_ram[offset]<<16); break; } |
| 2220 | | case (0x0c2/2): { m_cop_register[1] = (m_cop_register[1]&0xffff0000)|(m_cop_mcu_ram[offset]<<0); break; } |
| 2221 | | |
| 2222 | | case (0x0a4/2): { m_cop_register[2] = (m_cop_register[2]&0x0000ffff)|(m_cop_mcu_ram[offset]<<16); break; } |
| 2223 | | case (0x0c4/2): { m_cop_register[2] = (m_cop_register[2]&0xffff0000)|(m_cop_mcu_ram[offset]<<0); break; } |
| 2224 | | |
| 2225 | | case (0x0a6/2): { m_cop_register[3] = (m_cop_register[3]&0x0000ffff)|(m_cop_mcu_ram[offset]<<16); break; } |
| 2226 | | case (0x0c6/2): { m_cop_register[3] = (m_cop_register[3]&0xffff0000)|(m_cop_mcu_ram[offset]<<0); break; } |
| 2227 | | |
| 2228 | | case (0x0a8/2): { m_cop_register[4] = (m_cop_register[4]&0x0000ffff)|(m_cop_mcu_ram[offset]<<16); break; } |
| 2229 | | case (0x0c8/2): { m_cop_register[4] = (m_cop_register[4]&0xffff0000)|(m_cop_mcu_ram[offset]<<0); break; } |
| 2230 | | |
| 2231 | | case (0x0aa/2): { m_cop_register[5] = (m_cop_register[5]&0x0000ffff)|(m_cop_mcu_ram[offset]<<16); break; } |
| 2232 | | case (0x0ca/2): { m_cop_register[5] = (m_cop_register[5]&0xffff0000)|(m_cop_mcu_ram[offset]<<0); break; } |
| 2233 | | |
| 2234 | | case (0x0ac/2): { m_cop_register[6] = (m_cop_register[6]&0x0000ffff)|(m_cop_mcu_ram[offset]<<16); break; } |
| 2235 | | case (0x0cc/2): { m_cop_register[6] = (m_cop_register[6]&0xffff0000)|(m_cop_mcu_ram[offset]<<0); break; } |
| 2236 | | |
| 2237 | | |
| 2238 | 2194 | case (0x100/2): |
| 2239 | 2195 | case (0x102/2): |
| 2240 | 2196 | case (0x104/2): |
| r32330 | r32331 | |
| 2242 | 2198 | int command; |
| 2243 | 2199 | |
| 2244 | 2200 | |
| 2245 | | logerror("%06x: COPX execute table macro command %04x %04x | regs %08x %08x %08x %08x %08x\n", space.device().safe_pc(), data, m_cop_mcu_ram[offset], m_cop_register[0], m_cop_register[1], m_cop_register[2], m_cop_register[3], m_cop_register[4]); |
| 2201 | logerror("%06x: COPX execute table macro command %04x %04x | regs %08x %08x %08x %08x %08x\n", space.device().safe_pc(), data, m_cop_mcu_ram[offset], m_raiden2cop->cop_regs[0], m_raiden2cop->cop_regs[1], m_raiden2cop->cop_regs[2], m_raiden2cop->cop_regs[3], m_raiden2cop->cop_regs[4]); |
| 2246 | 2202 | |
| 2247 | 2203 | |
| 2248 | 2204 | command = m_raiden2cop->find_trigger_match(m_cop_mcu_ram[offset], 0xff00); |
| r32330 | r32331 | |
| 2282 | 2238 | UINT8 offs; |
| 2283 | 2239 | |
| 2284 | 2240 | offs = (offset & 3) * 4; |
| 2285 | | int ppos = space.read_dword(m_cop_register[0] + 4 + offs); |
| 2286 | | int npos = ppos + space.read_dword(m_cop_register[0] + 0x10 + offs); |
| 2241 | int ppos = space.read_dword(m_raiden2cop->cop_regs[0] + 4 + offs); |
| 2242 | int npos = ppos + space.read_dword(m_raiden2cop->cop_regs[0] + 0x10 + offs); |
| 2287 | 2243 | int delta = (npos >> 16) - (ppos >> 16); |
| 2288 | 2244 | |
| 2289 | | space.write_dword(m_cop_register[0] + 4 + offs, npos); |
| 2290 | | space.write_word(m_cop_register[0] + 0x1c + offs, space.read_word(m_cop_register[0] + 0x1c + offs) + delta); |
| 2245 | space.write_dword(m_raiden2cop->cop_regs[0] + 4 + offs, npos); |
| 2246 | space.write_word(m_raiden2cop->cop_regs[0] + 0x1c + offs, space.read_word(m_raiden2cop->cop_regs[0] + 0x1c + offs) + delta); |
| 2291 | 2247 | return; |
| 2292 | 2248 | } |
| 2293 | 2249 | |
| r32330 | r32331 | |
| 2303 | 2259 | /* add 0x10 + offs */ |
| 2304 | 2260 | /* write 0x10 + offs */ |
| 2305 | 2261 | |
| 2306 | | space.write_dword(m_cop_register[0] + 0x10 + offs, space.read_dword(m_cop_register[0] + 0x10 + offs) + space.read_dword(m_cop_register[0] + 0x28 + offs)); |
| 2262 | space.write_dword(m_raiden2cop->cop_regs[0] + 0x10 + offs, space.read_dword(m_raiden2cop->cop_regs[0] + 0x10 + offs) + space.read_dword(m_raiden2cop->cop_regs[0] + 0x28 + offs)); |
| 2307 | 2263 | return; |
| 2308 | 2264 | } |
| 2309 | 2265 | |
| r32330 | r32331 | |
| 2322 | 2278 | if(m_raiden2cop->check_command_matches(command, 0xb9a,0xb88,0x888,0x000,0x000,0x000,0x000,0x000,7,0xfdfb)) |
| 2323 | 2279 | { |
| 2324 | 2280 | executed = 1; |
| 2325 | | int raw_angle = (space.read_word(m_cop_register[0]+(0x34^2)) & 0xff); |
| 2281 | int raw_angle = (space.read_word(m_raiden2cop->cop_regs[0]+(0x34^2)) & 0xff); |
| 2326 | 2282 | double angle = raw_angle * M_PI / 128; |
| 2327 | | double amp = (65536 >> 5)*(space.read_word(m_cop_register[0]+(0x36^2)) & 0xff); |
| 2283 | double amp = (65536 >> 5)*(space.read_word(m_raiden2cop->cop_regs[0]+(0x36^2)) & 0xff); |
| 2328 | 2284 | int res; |
| 2329 | 2285 | |
| 2330 | 2286 | /* TODO: up direction, why? */ |
| r32330 | r32331 | |
| 2333 | 2289 | |
| 2334 | 2290 | res = int(amp*sin(angle)) << m_cop_scale; |
| 2335 | 2291 | |
| 2336 | | space.write_dword(m_cop_register[0] + 0x10, res); |
| 2292 | space.write_dword(m_raiden2cop->cop_regs[0] + 0x10, res); |
| 2337 | 2293 | return; |
| 2338 | 2294 | } |
| 2339 | 2295 | |
| r32330 | r32331 | |
| 2352 | 2308 | if(m_raiden2cop->check_command_matches(command, 0xb9a,0xb8a,0x88a,0x000,0x000,0x000,0x000,0x000,7,0xfdfb)) |
| 2353 | 2309 | { |
| 2354 | 2310 | executed = 1; |
| 2355 | | int raw_angle = (space.read_word(m_cop_register[0]+(0x34^2)) & 0xff); |
| 2311 | int raw_angle = (space.read_word(m_raiden2cop->cop_regs[0]+(0x34^2)) & 0xff); |
| 2356 | 2312 | double angle = raw_angle * M_PI / 128; |
| 2357 | | double amp = (65536 >> 5)*(space.read_word(m_cop_register[0]+(0x36^2)) & 0xff); |
| 2313 | double amp = (65536 >> 5)*(space.read_word(m_raiden2cop->cop_regs[0]+(0x36^2)) & 0xff); |
| 2358 | 2314 | int res; |
| 2359 | 2315 | |
| 2360 | 2316 | /* TODO: left direction, why? */ |
| r32330 | r32331 | |
| 2363 | 2319 | |
| 2364 | 2320 | res = int(amp*cos(angle)) << m_cop_scale; |
| 2365 | 2321 | |
| 2366 | | space.write_dword(m_cop_register[0] + 20, res); |
| 2322 | space.write_dword(m_raiden2cop->cop_regs[0] + 20, res); |
| 2367 | 2323 | return; |
| 2368 | 2324 | } |
| 2369 | 2325 | |
| r32330 | r32331 | |
| 2371 | 2327 | if(m_raiden2cop->check_command_matches(command, 0x984,0xaa4,0xd82,0xaa2,0x39b,0xb9a,0xb9a,0xa9a,5,0xbf7f)) |
| 2372 | 2328 | { |
| 2373 | 2329 | executed = 1; |
| 2374 | | int dy = space.read_dword(m_cop_register[1]+4) - space.read_dword(m_cop_register[0]+4); |
| 2375 | | int dx = space.read_dword(m_cop_register[1]+8) - space.read_dword(m_cop_register[0]+8); |
| 2330 | int dy = space.read_dword(m_raiden2cop->cop_regs[1]+4) - space.read_dword(m_raiden2cop->cop_regs[0]+4); |
| 2331 | int dx = space.read_dword(m_raiden2cop->cop_regs[1]+8) - space.read_dword(m_raiden2cop->cop_regs[0]+8); |
| 2376 | 2332 | |
| 2377 | 2333 | m_raiden2cop->cop_status = 7; |
| 2378 | 2334 | if(!dx) { |
| r32330 | r32331 | |
| 2390 | 2346 | //printf("%d %d %f %04x\n",dx,dy,atan(double(dy)/double(dx)) * 128 / M_PI,m_raiden2cop->cop_angle); |
| 2391 | 2347 | |
| 2392 | 2348 | if(m_cop_mcu_ram[offset] & 0x80) |
| 2393 | | space.write_word(m_cop_register[0]+(0x34^2), m_raiden2cop->cop_angle); |
| 2349 | space.write_word(m_raiden2cop->cop_regs[0]+(0x34^2), m_raiden2cop->cop_angle); |
| 2394 | 2350 | return; |
| 2395 | 2351 | } |
| 2396 | 2352 | |
| r32330 | r32331 | |
| 2399 | 2355 | if(m_raiden2cop->check_command_matches(command, 0x984,0xaa4,0xd82,0xaa2,0x39b,0xb9a,0xb9a,0xb9a,5,0xbf7f)) |
| 2400 | 2356 | { |
| 2401 | 2357 | executed = 1; |
| 2402 | | int dy = space.read_dword(m_cop_register[1]+4) - space.read_dword(m_cop_register[0]+4); |
| 2403 | | int dx = space.read_dword(m_cop_register[1]+8) - space.read_dword(m_cop_register[0]+8); |
| 2358 | int dy = space.read_dword(m_raiden2cop->cop_regs[1]+4) - space.read_dword(m_raiden2cop->cop_regs[0]+4); |
| 2359 | int dx = space.read_dword(m_raiden2cop->cop_regs[1]+8) - space.read_dword(m_raiden2cop->cop_regs[0]+8); |
| 2404 | 2360 | |
| 2405 | 2361 | m_raiden2cop->cop_status = 7; |
| 2406 | 2362 | if(!dx) { |
| r32330 | r32331 | |
| 2417 | 2373 | m_r1 = dx; |
| 2418 | 2374 | |
| 2419 | 2375 | if(m_cop_mcu_ram[offset] & 0x80) |
| 2420 | | space.write_word(m_cop_register[0]+(0x34^2), m_raiden2cop->cop_angle); |
| 2376 | space.write_word(m_raiden2cop->cop_regs[0]+(0x34^2), m_raiden2cop->cop_angle); |
| 2421 | 2377 | return; |
| 2422 | 2378 | } |
| 2423 | 2379 | |
| r32330 | r32331 | |
| 2440 | 2396 | m_raiden2cop->cop_dist = sqrt((double)(dx*dx+dy*dy)); |
| 2441 | 2397 | |
| 2442 | 2398 | if(m_cop_mcu_ram[offset] & 0x80) |
| 2443 | | space.write_word(m_cop_register[0]+(0x38), m_raiden2cop->cop_dist); |
| 2399 | space.write_word(m_raiden2cop->cop_regs[0]+(0x38), m_raiden2cop->cop_dist); |
| 2444 | 2400 | return; |
| 2445 | 2401 | } |
| 2446 | 2402 | |
| r32330 | r32331 | |
| 2460 | 2416 | executed = 1; |
| 2461 | 2417 | int dy = m_r0; |
| 2462 | 2418 | int dx = m_r1; |
| 2463 | | int div = space.read_word(m_cop_register[0]+(0x36^2)); |
| 2419 | int div = space.read_word(m_raiden2cop->cop_regs[0]+(0x36^2)); |
| 2464 | 2420 | int res; |
| 2465 | 2421 | int cop_dist_raw; |
| 2466 | 2422 | |
| r32330 | r32331 | |
| 2484 | 2440 | /* TODO: bits 5-6-15 */ |
| 2485 | 2441 | m_raiden2cop->cop_status = 7; |
| 2486 | 2442 | |
| 2487 | | space.write_word(m_cop_register[0]+(0x38^2), res); |
| 2443 | space.write_word(m_raiden2cop->cop_regs[0]+(0x38^2), res); |
| 2488 | 2444 | return; |
| 2489 | 2445 | } |
| 2490 | 2446 | |
| 2491 | 2447 | /* |
| 2492 | 2448 | collision detection: |
| 2493 | 2449 | |
| 2494 | | int dy_0 = space.read_dword(m_cop_register[0]+4); |
| 2495 | | int dx_0 = space.read_dword(m_cop_register[0]+8); |
| 2496 | | int dy_1 = space.read_dword(m_cop_register[1]+4); |
| 2497 | | int dx_1 = space.read_dword(m_cop_register[1]+8); |
| 2498 | | int hitbox_param1 = space.read_dword(m_cop_register[2]); |
| 2499 | | int hitbox_param2 = space.read_dword(m_cop_register[3]); |
| 2450 | int dy_0 = space.read_dword(m_raiden2cop->cop_regs[0]+4); |
| 2451 | int dx_0 = space.read_dword(m_raiden2cop->cop_regs[0]+8); |
| 2452 | int dy_1 = space.read_dword(m_raiden2cop->cop_regs[1]+4); |
| 2453 | int dx_1 = space.read_dword(m_raiden2cop->cop_regs[1]+8); |
| 2454 | int hitbox_param1 = space.read_dword(m_raiden2cop->cop_regs[2]); |
| 2455 | int hitbox_param2 = space.read_dword(m_raiden2cop->cop_regs[3]); |
| 2500 | 2456 | |
| 2501 | 2457 | TODO: we are ignoring the funcval / funcmask params for now |
| 2502 | 2458 | */ |
| r32330 | r32331 | |
| 2504 | 2460 | if(m_raiden2cop->check_command_matches(command, 0xb80,0xb82,0xb84,0xb86,0x000,0x000,0x000,0x000,funcval,funcmask)) |
| 2505 | 2461 | { |
| 2506 | 2462 | executed = 1; |
| 2507 | | m_cop_collision_info[0].y = (space.read_dword(m_cop_register[0]+4)); |
| 2508 | | m_cop_collision_info[0].x = (space.read_dword(m_cop_register[0]+8)); |
| 2463 | m_cop_collision_info[0].y = (space.read_dword(m_raiden2cop->cop_regs[0]+4)); |
| 2464 | m_cop_collision_info[0].x = (space.read_dword(m_raiden2cop->cop_regs[0]+8)); |
| 2509 | 2465 | return; |
| 2510 | 2466 | } |
| 2511 | 2467 | |
| r32330 | r32331 | |
| 2513 | 2469 | if(m_raiden2cop->check_command_matches(command, 0xb40,0xbc0,0xbc2,0x000,0x000,0x000,0x000,0x000,funcval,funcmask)) |
| 2514 | 2470 | { |
| 2515 | 2471 | executed = 1; |
| 2516 | | m_cop_collision_info[0].hitbox = space.read_word(m_cop_register[2]); |
| 2517 | | m_cop_collision_info[0].hitbox_y = space.read_word((m_cop_register[2]&0xffff0000)|(m_cop_collision_info[0].hitbox)); |
| 2518 | | m_cop_collision_info[0].hitbox_x = space.read_word(((m_cop_register[2]&0xffff0000)|(m_cop_collision_info[0].hitbox))+2); |
| 2472 | m_cop_collision_info[0].hitbox = space.read_word(m_raiden2cop->cop_regs[2]); |
| 2473 | m_cop_collision_info[0].hitbox_y = space.read_word((m_raiden2cop->cop_regs[2]&0xffff0000)|(m_cop_collision_info[0].hitbox)); |
| 2474 | m_cop_collision_info[0].hitbox_x = space.read_word(((m_raiden2cop->cop_regs[2]&0xffff0000)|(m_cop_collision_info[0].hitbox))+2); |
| 2519 | 2475 | |
| 2520 | 2476 | /* do the math */ |
| 2521 | 2477 | cop_take_hit_box_params(0); |
| r32330 | r32331 | |
| 2527 | 2483 | if(m_raiden2cop->check_command_matches(command, 0xba0,0xba2,0xba4,0xba6,0x000,0x000,0x000,0x000,funcval,funcmask)) |
| 2528 | 2484 | { |
| 2529 | 2485 | executed = 1; |
| 2530 | | m_cop_collision_info[1].y = (space.read_dword(m_cop_register[1]+4)); |
| 2531 | | m_cop_collision_info[1].x = (space.read_dword(m_cop_register[1]+8)); |
| 2486 | m_cop_collision_info[1].y = (space.read_dword(m_raiden2cop->cop_regs[1]+4)); |
| 2487 | m_cop_collision_info[1].x = (space.read_dword(m_raiden2cop->cop_regs[1]+8)); |
| 2532 | 2488 | return; |
| 2533 | 2489 | } |
| 2534 | 2490 | |
| r32330 | r32331 | |
| 2536 | 2492 | if(m_raiden2cop->check_command_matches(command, 0xb60,0xbe0,0xbe2,0x000,0x000,0x000,0x000,0x000,funcval,funcmask)) |
| 2537 | 2493 | { |
| 2538 | 2494 | executed = 1; |
| 2539 | | m_cop_collision_info[1].hitbox = space.read_word(m_cop_register[3]); |
| 2540 | | m_cop_collision_info[1].hitbox_y = space.read_word((m_cop_register[3]&0xffff0000)|(m_cop_collision_info[1].hitbox)); |
| 2541 | | m_cop_collision_info[1].hitbox_x = space.read_word(((m_cop_register[3]&0xffff0000)|(m_cop_collision_info[1].hitbox))+2); |
| 2495 | m_cop_collision_info[1].hitbox = space.read_word(m_raiden2cop->cop_regs[3]); |
| 2496 | m_cop_collision_info[1].hitbox_y = space.read_word((m_raiden2cop->cop_regs[3]&0xffff0000)|(m_cop_collision_info[1].hitbox)); |
| 2497 | m_cop_collision_info[1].hitbox_x = space.read_word(((m_raiden2cop->cop_regs[3]&0xffff0000)|(m_cop_collision_info[1].hitbox))+2); |
| 2542 | 2498 | |
| 2543 | 2499 | /* do the math */ |
| 2544 | 2500 | cop_take_hit_box_params(1); |
| r32330 | r32331 | |
| 2556 | 2512 | offs = (offset & 3) * 4; |
| 2557 | 2513 | |
| 2558 | 2514 | /* TODO: I really suspect that following two are actually taken from the 0xa180 macro command then internally loaded */ |
| 2559 | | abs_x = space.read_word(m_cop_register[0] + 8) - m_cop_sprite_dma_abs_x; |
| 2560 | | abs_y = space.read_word(m_cop_register[0] + 4) - m_cop_sprite_dma_abs_y; |
| 2515 | abs_x = space.read_word(m_raiden2cop->cop_regs[0] + 8) - m_cop_sprite_dma_abs_x; |
| 2516 | abs_y = space.read_word(m_raiden2cop->cop_regs[0] + 4) - m_cop_sprite_dma_abs_y; |
| 2561 | 2517 | rel_xy = space.read_word(m_cop_sprite_dma_src + 4 + offs); |
| 2562 | 2518 | |
| 2563 | 2519 | //if(rel_xy & 0x0706) |
| 2564 | 2520 | // printf("sprite rel_xy = %04x\n",rel_xy); |
| 2565 | 2521 | |
| 2566 | 2522 | if(rel_xy & 1) |
| 2567 | | space.write_word(m_cop_register[4] + offs + 4,0xc0 + abs_x - (rel_xy & 0xf8)); |
| 2523 | space.write_word(m_raiden2cop->cop_regs[4] + offs + 4,0xc0 + abs_x - (rel_xy & 0xf8)); |
| 2568 | 2524 | else |
| 2569 | | space.write_word(m_cop_register[4] + offs + 4,(((rel_xy & 0x78) + (abs_x) - ((rel_xy & 0x80) ? 0x80 : 0)))); |
| 2525 | space.write_word(m_raiden2cop->cop_regs[4] + offs + 4,(((rel_xy & 0x78) + (abs_x) - ((rel_xy & 0x80) ? 0x80 : 0)))); |
| 2570 | 2526 | |
| 2571 | | space.write_word(m_cop_register[4] + offs + 6,(((rel_xy & 0x7800) >> 8) + (abs_y) - ((rel_xy & 0x8000) ? 0x80 : 0))); |
| 2527 | space.write_word(m_raiden2cop->cop_regs[4] + offs + 6,(((rel_xy & 0x7800) >> 8) + (abs_y) - ((rel_xy & 0x8000) ? 0x80 : 0))); |
| 2572 | 2528 | return; |
| 2573 | 2529 | } |
| 2574 | 2530 | |
| r32330 | r32331 | |
| 2580 | 2536 | |
| 2581 | 2537 | offs = (offset & 3) * 4; |
| 2582 | 2538 | |
| 2583 | | space.write_word(m_cop_register[4] + offs + 0,space.read_word(m_cop_sprite_dma_src + offs) + (m_cop_sprite_dma_param & 0x3f)); |
| 2584 | | //space.write_word(m_cop_register[4] + offs + 2,space.read_word(m_cop_sprite_dma_src+2 + offs)); |
| 2539 | space.write_word(m_raiden2cop->cop_regs[4] + offs + 0,space.read_word(m_cop_sprite_dma_src + offs) + (m_cop_sprite_dma_param & 0x3f)); |
| 2540 | //space.write_word(m_raiden2cop->cop_regs[4] + offs + 2,space.read_word(m_cop_sprite_dma_src+2 + offs)); |
| 2585 | 2541 | return; |
| 2586 | 2542 | } |
| 2587 | 2543 | |
| r32330 | r32331 | |
| 2609 | 2565 | // what are these two instead? scale factor? offsets? (edit: offsets to apply from the initial sprite data) |
| 2610 | 2566 | // 0xfc69 ? |
| 2611 | 2567 | // 0x7f4 ? |
| 2612 | | //printf("%08x %08x %08x %08x %08x %08x %08x\n",m_cop_register[0],m_cop_register[1],m_cop_register[2],m_cop_register[3],m_cop_register[4],m_cop_register[5],m_cop_register[6]); |
| 2568 | //printf("%08x %08x %08x %08x %08x %08x %08x\n",m_raiden2cop->cop_regs[0],m_raiden2cop->cop_regs[1],m_raiden2cop->cop_regs[2],m_raiden2cop->cop_regs[3],m_raiden2cop->cop_regs[4],m_raiden2cop->cop_regs[5],m_raiden2cop->cop_regs[6]); |
| 2613 | 2569 | |
| 2614 | 2570 | offs = (offset & 3) * 4; |
| 2615 | 2571 | |
| 2616 | | div = space.read_word(m_cop_register[4] + offs); |
| 2617 | | dir_offset = space.read_word(m_cop_register[4] + offs + 8); |
| 2618 | | // offs_val = space.read_word(m_cop_register[3] + offs); |
| 2572 | div = space.read_word(m_raiden2cop->cop_regs[4] + offs); |
| 2573 | dir_offset = space.read_word(m_raiden2cop->cop_regs[4] + offs + 8); |
| 2574 | // offs_val = space.read_word(m_raiden2cop->cop_regs[3] + offs); |
| 2619 | 2575 | //420 / 180 = 500 : 400 = 30 / 50 = 98 / 18 |
| 2620 | 2576 | |
| 2621 | 2577 | /* TODO: this probably trips a cop status flag */ |
| 2622 | 2578 | if(div == 0) { div = 1; } |
| 2623 | 2579 | |
| 2624 | 2580 | |
| 2625 | | space.write_word((m_cop_register[6] + offs + 4), ((space.read_word(m_cop_register[5] + offs + 4) + dir_offset) / div)); |
| 2581 | space.write_word((m_raiden2cop->cop_regs[6] + offs + 4), ((space.read_word(m_raiden2cop->cop_regs[5] + offs + 4) + dir_offset) / div)); |
| 2626 | 2582 | return; |
| 2627 | 2583 | } |
| 2628 | 2584 | |
| r32330 | r32331 | |
| 2639 | 2595 | /* 0 [1] */ |
| 2640 | 2596 | /* 0xc [1] */ |
| 2641 | 2597 | |
| 2642 | | cur_angle = space.read_byte(m_cop_register[1] + (0xc ^ 3)); |
| 2643 | | flags = space.read_word(m_cop_register[1]); |
| 2644 | | //space.write_byte(m_cop_register[1] + (0^3),space.read_byte(m_cop_register[1] + (0^3)) & 0xfb); //correct? |
| 2598 | cur_angle = space.read_byte(m_raiden2cop->cop_regs[1] + (0xc ^ 3)); |
| 2599 | flags = space.read_word(m_raiden2cop->cop_regs[1]); |
| 2600 | //space.write_byte(m_raiden2cop->cop_regs[1] + (0^3),space.read_byte(m_raiden2cop->cop_regs[1] + (0^3)) & 0xfb); //correct? |
| 2645 | 2601 | |
| 2646 | 2602 | m_legacycop_angle_compare &= 0xff; |
| 2647 | 2603 | m_legacycop_angle_mod_val &= 0xff; |
| r32330 | r32331 | |
| 2673 | 2629 | cur_angle -= m_legacycop_angle_mod_val; |
| 2674 | 2630 | } |
| 2675 | 2631 | |
| 2676 | | space.write_byte(m_cop_register[1] + (0 ^ 2),flags); |
| 2677 | | space.write_byte(m_cop_register[1] + (0xc ^ 3),cur_angle); |
| 2632 | space.write_byte(m_raiden2cop->cop_regs[1] + (0 ^ 2),flags); |
| 2633 | space.write_byte(m_raiden2cop->cop_regs[1] + (0xc ^ 3),cur_angle); |
| 2678 | 2634 | return; |
| 2679 | 2635 | } |
| 2680 | 2636 | |
| r32330 | r32331 | |
| 2687 | 2643 | UINT8 cur_angle; |
| 2688 | 2644 | UINT16 flags; |
| 2689 | 2645 | |
| 2690 | | cur_angle = space.read_byte(m_cop_register[0] + (0x34 ^ 3)); |
| 2691 | | flags = space.read_word(m_cop_register[0] + (0 ^ 2)); |
| 2692 | | //space.write_byte(m_cop_register[1] + (0^3),space.read_byte(m_cop_register[1] + (0^3)) & 0xfb); //correct? |
| 2646 | cur_angle = space.read_byte(m_raiden2cop->cop_regs[0] + (0x34 ^ 3)); |
| 2647 | flags = space.read_word(m_raiden2cop->cop_regs[0] + (0 ^ 2)); |
| 2648 | //space.write_byte(m_raiden2cop->cop_regs[1] + (0^3),space.read_byte(m_raiden2cop->cop_regs[1] + (0^3)) & 0xfb); //correct? |
| 2693 | 2649 | |
| 2694 | 2650 | m_legacycop_angle_compare &= 0xff; |
| 2695 | 2651 | m_legacycop_angle_mod_val &= 0xff; |
| r32330 | r32331 | |
| 2721 | 2677 | cur_angle -= m_legacycop_angle_mod_val; |
| 2722 | 2678 | } |
| 2723 | 2679 | |
| 2724 | | space.write_byte(m_cop_register[0] + (0 ^ 3),flags); |
| 2725 | | space.write_word(m_cop_register[0] + (0x34 ^ 3),cur_angle); |
| 2680 | space.write_byte(m_raiden2cop->cop_regs[0] + (0 ^ 3),flags); |
| 2681 | space.write_word(m_raiden2cop->cop_regs[0] + (0x34 ^ 3),cur_angle); |
| 2726 | 2682 | return; |
| 2727 | 2683 | } |
| 2728 | 2684 | |
| r32330 | r32331 | |
| 2730 | 2686 | if(m_raiden2cop->check_command_matches(command, 0x984,0xac4,0xd82,0xac2,0x39b,0xb9a,0xb9a,0xa9a,5,0xb07f)) |
| 2731 | 2687 | { |
| 2732 | 2688 | executed = 1; |
| 2733 | | int dy = space.read_dword(m_cop_register[2]+4) - space.read_dword(m_cop_register[0]+4); |
| 2734 | | int dx = space.read_dword(m_cop_register[2]+8) - space.read_dword(m_cop_register[0]+8); |
| 2689 | int dy = space.read_dword(m_raiden2cop->cop_regs[2]+4) - space.read_dword(m_raiden2cop->cop_regs[0]+4); |
| 2690 | int dx = space.read_dword(m_raiden2cop->cop_regs[2]+8) - space.read_dword(m_raiden2cop->cop_regs[0]+8); |
| 2735 | 2691 | |
| 2736 | 2692 | m_raiden2cop->cop_status = 7; |
| 2737 | 2693 | if(!dx) { |
| r32330 | r32331 | |
| 2749 | 2705 | //printf("%d %d %f %04x\n",dx,dy,atan(double(dy)/double(dx)) * 128 / M_PI,m_raiden2cop->cop_angle); |
| 2750 | 2706 | |
| 2751 | 2707 | if(m_cop_mcu_ram[offset] & 0x80) |
| 2752 | | space.write_word(m_cop_register[0]+(0x34^2), m_raiden2cop->cop_angle); |
| 2708 | space.write_word(m_raiden2cop->cop_regs[0]+(0x34^2), m_raiden2cop->cop_angle); |
| 2753 | 2709 | return; |
| 2754 | 2710 | } |
| 2755 | 2711 | |
| r32330 | r32331 | |
| 2763 | 2719 | UINT16 rom_data = (ROM[rom_addr + 0]) | (ROM[rom_addr + 1]<<8); |
| 2764 | 2720 | |
| 2765 | 2721 | /* writes to some unemulated COP registers, then puts the result in here, adding a parameter taken from ROM */ |
| 2766 | | //space.write_word(m_cop_register[0]+(0x44 + offset * 4), rom_data); |
| 2722 | //space.write_word(m_raiden2cop->cop_regs[0]+(0x44 + offset * 4), rom_data); |
| 2767 | 2723 | |
| 2768 | 2724 | printf("%04x%04x %04x %04x\n",m_cop_rom_addr_hi,m_cop_rom_addr_lo,m_cop_rom_addr_unk,rom_data); |
| 2769 | 2725 | return; |