trunk/src/mame/machine/seicop.c
r17952 | r17953 | |
1457 | 1457 | 0xc0 0xc0 1 0xffe80000 0x00000000 |
1458 | 1458 | 0xc0 0xc0 2 0xffd00000 0x00000000 |
1459 | 1459 | 0xc0 0xc0 3 0xffa00000 0x00000000 |
| 1460 | |
| 1461 | commands 0x130e/0x138e: (dx dy 2 fixed point 0x80) |
| 1462 | dx dy angle |
| 1463 | --------------------- |
| 1464 | 0x00 0x00 0x20 |
| 1465 | 0x20 0x00 0x25 (0x26 in test) |
| 1466 | 0x40 0x00 0x2d (0x2b in test) |
| 1467 | 0x60 0x00 0x36 |
| 1468 | 0x80 0x00 0x00 cop status 0x8007 |
| 1469 | 0xa0 0x00 0x4a |
| 1470 | 0xc0 0x00 0x53 |
| 1471 | 0xe0 0x00 0x5b (0x5a) |
| 1472 | 0x100 0x00 0x60 |
| 1473 | 0x120 0x00 0x65 |
| 1474 | 0x140 0x00 0x69 (0x68) |
| 1475 | 0x160 0x00 0x6b |
| 1476 | 0x180 0x00 0x6e (0x6d) |
| 1477 | 0x1a0 0x00 0x6f |
| 1478 | 0x1c0 0x00 0x71 |
| 1479 | 0x1e0 0x00 0x72 |
1460 | 1480 | */ |
1461 | 1481 | |
1462 | 1482 | #include "emu.h" |
r17952 | r17953 | |
1804 | 1824 | UINT16 hitbox; |
1805 | 1825 | UINT16 hitbox_x,hitbox_y; |
1806 | 1826 | }cop_collision_info[2]; |
| 1827 | static int r0, r1; |
1807 | 1828 | |
1808 | 1829 | /* RE from Seibu Cup Soccer bootleg */ |
1809 | 1830 | static const UINT8 fade_table(int v) |
r17952 | r17953 | |
2184 | 2205 | |
2185 | 2206 | //printf("%04x %04x %04x\n",cop_mcu_ram[offset],u1,u2); |
2186 | 2207 | |
2187 | | cop_status &= 0x7fff; |
2188 | | |
2189 | 2208 | /* |
2190 | 2209 | Macro notes: |
2191 | 2210 | - endianess changes from/to Raiden 2: |
r17952 | r17953 | |
2226 | 2245 | } |
2227 | 2246 | |
2228 | 2247 | /* SINE math - 0x8100 */ |
2229 | | /* FIXME: cop scale is unreliable */ |
2230 | 2248 | /* |
2231 | 2249 | 00000-0ffff: |
2232 | 2250 | amp = x/256 |
r17952 | r17953 | |
2256 | 2274 | } |
2257 | 2275 | |
2258 | 2276 | /* COSINE math - 0x8900 */ |
2259 | | /* FIXME: cop scale is unreliable */ |
2260 | 2277 | /* |
2261 | 2278 | 10000-1ffff: |
2262 | 2279 | amp = x/256 |
r17952 | r17953 | |
2288 | 2305 | /* 0x130e / 0x138e */ |
2289 | 2306 | if(COP_CMD(0x984,0xaa4,0xd82,0xaa2,0x39b,0xb9a,0xb9a,0xa9a,5,0xbf7f)) |
2290 | 2307 | { |
2291 | | int dx = space->read_dword(cop_register[1]+4) - space->read_dword(cop_register[0]+4); |
2292 | | int dy = space->read_dword(cop_register[1]+8) - space->read_dword(cop_register[0]+8); |
| 2308 | int dy = space->read_dword(cop_register[1]+4) - space->read_dword(cop_register[0]+4); |
| 2309 | int dx = space->read_dword(cop_register[1]+8) - space->read_dword(cop_register[0]+8); |
2293 | 2310 | |
2294 | | if(!dy) { |
| 2311 | cop_status = 7; |
| 2312 | if(!dx) { |
2295 | 2313 | cop_status |= 0x8000; |
2296 | 2314 | cop_angle = 0; |
2297 | 2315 | } else { |
2298 | | cop_angle = atan(double(dx)/double(dy)) * 128 / M_PI; |
2299 | | if(dy<0) |
| 2316 | cop_angle = atan(double(dy)/double(dx)) * 128.0 / M_PI; |
| 2317 | if(dx<0) |
2300 | 2318 | cop_angle += 0x80; |
2301 | 2319 | } |
2302 | 2320 | |
2303 | | space->write_byte(cop_register[0]+(0x34^3), cop_angle); |
| 2321 | //printf("%d %d %f %04x\n",dx,dy,atan(double(dy)/double(dx)) * 128 / M_PI,cop_angle); |
| 2322 | |
| 2323 | if(cop_mcu_ram[offset] & 0x80) |
| 2324 | space->write_byte(cop_register[0]+(0x34^3), cop_angle); |
2304 | 2325 | return; |
2305 | 2326 | } |
2306 | 2327 | |
r17952 | r17953 | |
2308 | 2329 | //(heatbrl) | 5 | bf7f | 138e | 984 aa4 d82 aa2 39b b9a b9a b9a |
2309 | 2330 | if(COP_CMD(0x984,0xaa4,0xd82,0xaa2,0x39b,0xb9a,0xb9a,0xb9a,5,0xbf7f)) |
2310 | 2331 | { |
2311 | | int dx = space->read_dword(cop_register[1]+4) - space->read_dword(cop_register[0]+4); |
2312 | | int dy = space->read_dword(cop_register[1]+8) - space->read_dword(cop_register[0]+8); |
2313 | | if(!dy) { |
| 2332 | int dy = space->read_dword(cop_register[1]+4) - space->read_dword(cop_register[0]+4); |
| 2333 | int dx = space->read_dword(cop_register[1]+8) - space->read_dword(cop_register[0]+8); |
| 2334 | |
| 2335 | cop_status = 7; |
| 2336 | if(!dx) { |
2314 | 2337 | cop_status |= 0x8000; |
2315 | 2338 | cop_angle = 0; |
2316 | 2339 | } else { |
2317 | | cop_angle = atan(double(dx)/double(dy)) * 128 / M_PI; |
2318 | | if(dy<0) |
| 2340 | cop_angle = atan(double(dy)/double(dx)) * 128.0 / M_PI; |
| 2341 | if(dx<0) |
2319 | 2342 | cop_angle += 0x80; |
2320 | 2343 | } |
2321 | 2344 | |
2322 | | /* TODO: bit 7 of macro command says if we have to write on work RAM */ |
2323 | | //if(0) |
| 2345 | r0 = dy; |
| 2346 | r1 = dx; |
| 2347 | |
| 2348 | if(cop_mcu_ram[offset] & 0x80) |
2324 | 2349 | space->write_byte(cop_register[0]+(0x34^3), cop_angle); |
2325 | 2350 | return; |
2326 | 2351 | } |
2327 | 2352 | |
2328 | 2353 | /* Pythagorean theorem, hypotenuse length - 0x3bb0 */ |
2329 | | //07 | 4 | 007f | 3bb0 | f9c b9c b9c b9c b9c b9c b9c 99c |
2330 | 2354 | //(grainbow) | 4 | 007f | 3bb0 | f9c b9c b9c b9c b9c b9c b9c 99c |
2331 | 2355 | /* |
2332 | 2356 | 40000-7ffff: |
r17952 | r17953 | |
2336 | 2360 | */ |
2337 | 2361 | if(COP_CMD(0xf9c,0xb9c,0xb9c,0xb9c,0xb9c,0xb9c,0xb9c,0x99c,4,0x007f)) |
2338 | 2362 | { |
2339 | | int dx = space->read_dword(cop_register[1]+4) - space->read_dword(cop_register[0]+4); |
2340 | | int dy = space->read_dword(cop_register[1]+8) - space->read_dword(cop_register[0]+8); |
| 2363 | int dy = r0; |
| 2364 | int dx = r1; |
2341 | 2365 | |
2342 | 2366 | dx = dx >> 16; |
2343 | 2367 | dy = dy >> 16; |
r17952 | r17953 | |
2359 | 2383 | v2 = (x & 1023)*32 |
2360 | 2384 | val = !v1 ? 32767 : trunc(v2/v1+0.5) |
2361 | 2385 | */ |
| 2386 | /* TODO: this is WRONG! */ |
2362 | 2387 | if(COP_CMD(0xf9a,0xb9a,0xb9c,0xb9c,0xb9c,0x29c,0x000,0x000,5,0xfcdd)) |
2363 | 2388 | { |
2364 | 2389 | int div = space->read_word(cop_register[0]+(0x36^2)); |
2365 | 2390 | int res; |
2366 | 2391 | |
2367 | | cop_status = 0x8007; |
2368 | | |
2369 | 2392 | if(!div) |
2370 | 2393 | { |
2371 | 2394 | printf("divide by zero?\n"); |