trunk/src/mame/machine/seicop.c
| r32329 | r32330 | |
| 1604 | 1604 | m_cop_scale(0), |
| 1605 | 1605 | m_cop_rng_max_value(0), |
| 1606 | 1606 | m_copd2_offs(0), |
| 1607 | | m_cop_status(0), |
| 1608 | | m_cop_dist(0), |
| 1609 | | m_cop_angle(0), |
| 1610 | 1607 | m_cop_hit_status(0), |
| 1611 | 1608 | m_cop_hit_val_x(0), |
| 1612 | 1609 | m_cop_hit_val_y(0), |
| r32329 | r32330 | |
| 1615 | 1612 | m_cop_sort_lookup(0), |
| 1616 | 1613 | m_cop_sort_ram_addr(0), |
| 1617 | 1614 | m_cop_sort_param(0), |
| 1618 | | m_cop_angle_compare(0), |
| 1619 | | m_cop_angle_mod_val(0), |
| 1615 | m_legacycop_angle_compare(0), |
| 1616 | m_legacycop_angle_mod_val(0), |
| 1620 | 1617 | m_r0(0), |
| 1621 | 1618 | m_r1(0), |
| 1622 | 1619 | m_cop_rom_addr_lo(0), |
| r32329 | r32330 | |
| 1659 | 1656 | save_item(NAME(m_cop_scale)); |
| 1660 | 1657 | save_item(NAME(m_cop_rng_max_value)); |
| 1661 | 1658 | save_item(NAME(m_copd2_offs)); |
| 1662 | | save_item(NAME(m_cop_status)); |
| 1663 | | save_item(NAME(m_cop_dist)); |
| 1664 | | save_item(NAME(m_cop_angle)); |
| 1665 | 1659 | save_item(NAME(m_cop_hit_status)); |
| 1666 | 1660 | save_item(NAME(m_cop_hit_val_x)); |
| 1667 | 1661 | save_item(NAME(m_cop_hit_val_y)); |
| r32329 | r32330 | |
| 1670 | 1664 | save_item(NAME(m_cop_sort_lookup)); |
| 1671 | 1665 | save_item(NAME(m_cop_sort_ram_addr)); |
| 1672 | 1666 | save_item(NAME(m_cop_sort_param)); |
| 1673 | | save_item(NAME(m_cop_angle_compare)); |
| 1674 | | save_item(NAME(m_cop_angle_mod_val)); |
| 1667 | save_item(NAME(m_legacycop_angle_compare)); |
| 1668 | save_item(NAME(m_legacycop_angle_mod_val)); |
| 1675 | 1669 | save_item(NAME(m_r0)); |
| 1676 | 1670 | save_item(NAME(m_r1)); |
| 1677 | 1671 | save_item(NAME(m_cop_rom_addr_lo)); |
| r32329 | r32330 | |
| 1824 | 1818 | return retvalue; |
| 1825 | 1819 | } |
| 1826 | 1820 | |
| 1827 | | case 0x5b0/2: |
| 1828 | | return m_cop_status; |
| 1829 | 1821 | |
| 1830 | | case 0x5b2/2: |
| 1831 | | return m_cop_dist; |
| 1832 | 1822 | |
| 1833 | | case 0x5b4/2: |
| 1834 | | return m_cop_angle; |
| 1835 | 1823 | //case (0x47e/2): |
| 1836 | 1824 | //case (0x5b0/2): |
| 1837 | 1825 | //case (0x5b4/2): |
| r32329 | r32330 | |
| 1938 | 1926 | int dy = space.read_dword(m_cop_register[1]+4) - space.read_dword(m_cop_register[0]+4); |
| 1939 | 1927 | int dx = space.read_dword(m_cop_register[1]+8) - space.read_dword(m_cop_register[0]+8); |
| 1940 | 1928 | |
| 1941 | | m_cop_status = 7; |
| 1929 | m_raiden2cop->cop_status = 7; |
| 1942 | 1930 | if(!dx) { |
| 1943 | | m_cop_status |= 0x8000; |
| 1944 | | m_cop_angle = 0; |
| 1931 | m_raiden2cop->cop_status |= 0x8000; |
| 1932 | m_raiden2cop->cop_angle = 0; |
| 1945 | 1933 | } else { |
| 1946 | | m_cop_angle = atan(double(dy)/double(dx)) * 128.0 / M_PI; |
| 1934 | m_raiden2cop->cop_angle = atan(double(dy)/double(dx)) * 128.0 / M_PI; |
| 1947 | 1935 | if(dx<0) |
| 1948 | | m_cop_angle += 0x80; |
| 1936 | m_raiden2cop->cop_angle += 0x80; |
| 1949 | 1937 | } |
| 1950 | 1938 | |
| 1951 | 1939 | m_r0 = dy; |
| 1952 | 1940 | m_r1 = dx; |
| 1953 | 1941 | |
| 1954 | 1942 | if(m_cop_mcu_ram[offset] & 0x80) |
| 1955 | | space.write_word(m_cop_register[0]+(0x34^2), m_cop_angle); |
| 1943 | space.write_word(m_cop_register[0]+(0x34^2), m_raiden2cop->cop_angle); |
| 1956 | 1944 | |
| 1957 | 1945 | break; |
| 1958 | 1946 | } |
| r32329 | r32330 | |
| 1964 | 1952 | |
| 1965 | 1953 | dx >>= 16; |
| 1966 | 1954 | dy >>= 16; |
| 1967 | | m_cop_dist = sqrt((double)(dx*dx+dy*dy)); |
| 1955 | m_raiden2cop->cop_dist = sqrt((double)(dx*dx+dy*dy)); |
| 1968 | 1956 | |
| 1969 | 1957 | if(m_cop_mcu_ram[offset] & 0x80) |
| 1970 | | space.write_word(m_cop_register[0]+(0x38), m_cop_dist); |
| 1958 | space.write_word(m_cop_register[0]+(0x38), m_raiden2cop->cop_dist); |
| 1971 | 1959 | |
| 1972 | 1960 | break; |
| 1973 | 1961 | } |
| r32329 | r32330 | |
| 2121 | 2109 | case 0x1a6/2: |
| 2122 | 2110 | return space.machine().firstcpu->total_cycles() % (m_cop_rng_max_value+1); |
| 2123 | 2111 | |
| 2124 | | case 0x1b0/2: |
| 2125 | | return m_cop_status; |
| 2126 | 2112 | |
| 2127 | | case 0x1b2/2: |
| 2128 | | return m_cop_dist; |
| 2129 | | |
| 2130 | | case 0x1b4/2: |
| 2131 | | return m_cop_angle; |
| 2132 | | |
| 2133 | 2113 | default: |
| 2134 | 2114 | seibu_cop_log("%06x: COPX unhandled read returning %04x from offset %04x\n", space.device().safe_pc(), retvalue, offset*2); |
| 2135 | 2115 | return retvalue; |
| r32329 | r32330 | |
| 2167 | 2147 | m_cop_sprite_dma_size--; |
| 2168 | 2148 | |
| 2169 | 2149 | if(m_cop_sprite_dma_size > 0) |
| 2170 | | m_cop_status &= ~2; |
| 2150 | m_raiden2cop->cop_status &= ~2; |
| 2171 | 2151 | else |
| 2172 | | m_cop_status |= 2; |
| 2152 | m_raiden2cop->cop_status |= 2; |
| 2173 | 2153 | } |
| 2174 | 2154 | break; |
| 2175 | 2155 | } |
| r32329 | r32330 | |
| 2180 | 2160 | break; |
| 2181 | 2161 | |
| 2182 | 2162 | /* triggered before 0x6200 in Seibu Cup, looks like an angle value ... */ |
| 2183 | | case (0x01c/2): m_cop_angle_compare = UINT16(m_cop_mcu_ram[0x1c/2]); break; |
| 2184 | | case (0x01e/2): m_cop_angle_mod_val = UINT16(m_cop_mcu_ram[0x1e/2]); break; |
| 2163 | case (0x01c/2): m_legacycop_angle_compare = UINT16(m_cop_mcu_ram[0x1c/2]); break; |
| 2164 | case (0x01e/2): m_legacycop_angle_mod_val = UINT16(m_cop_mcu_ram[0x1e/2]); break; |
| 2185 | 2165 | |
| 2186 | 2166 | |
| 2187 | 2167 | |
| r32329 | r32330 | |
| 2394 | 2374 | int dy = space.read_dword(m_cop_register[1]+4) - space.read_dword(m_cop_register[0]+4); |
| 2395 | 2375 | int dx = space.read_dword(m_cop_register[1]+8) - space.read_dword(m_cop_register[0]+8); |
| 2396 | 2376 | |
| 2397 | | m_cop_status = 7; |
| 2377 | m_raiden2cop->cop_status = 7; |
| 2398 | 2378 | if(!dx) { |
| 2399 | | m_cop_status |= 0x8000; |
| 2400 | | m_cop_angle = 0; |
| 2379 | m_raiden2cop->cop_status |= 0x8000; |
| 2380 | m_raiden2cop->cop_angle = 0; |
| 2401 | 2381 | } else { |
| 2402 | | m_cop_angle = atan(double(dy)/double(dx)) * 128.0 / M_PI; |
| 2382 | m_raiden2cop->cop_angle = atan(double(dy)/double(dx)) * 128.0 / M_PI; |
| 2403 | 2383 | if(dx<0) |
| 2404 | | m_cop_angle += 0x80; |
| 2384 | m_raiden2cop->cop_angle += 0x80; |
| 2405 | 2385 | } |
| 2406 | 2386 | |
| 2407 | 2387 | m_r0 = dy; |
| 2408 | 2388 | m_r1 = dx; |
| 2409 | 2389 | |
| 2410 | | //printf("%d %d %f %04x\n",dx,dy,atan(double(dy)/double(dx)) * 128 / M_PI,m_cop_angle); |
| 2390 | //printf("%d %d %f %04x\n",dx,dy,atan(double(dy)/double(dx)) * 128 / M_PI,m_raiden2cop->cop_angle); |
| 2411 | 2391 | |
| 2412 | 2392 | if(m_cop_mcu_ram[offset] & 0x80) |
| 2413 | | space.write_word(m_cop_register[0]+(0x34^2), m_cop_angle); |
| 2393 | space.write_word(m_cop_register[0]+(0x34^2), m_raiden2cop->cop_angle); |
| 2414 | 2394 | return; |
| 2415 | 2395 | } |
| 2416 | 2396 | |
| r32329 | r32330 | |
| 2422 | 2402 | int dy = space.read_dword(m_cop_register[1]+4) - space.read_dword(m_cop_register[0]+4); |
| 2423 | 2403 | int dx = space.read_dword(m_cop_register[1]+8) - space.read_dword(m_cop_register[0]+8); |
| 2424 | 2404 | |
| 2425 | | m_cop_status = 7; |
| 2405 | m_raiden2cop->cop_status = 7; |
| 2426 | 2406 | if(!dx) { |
| 2427 | | m_cop_status |= 0x8000; |
| 2428 | | m_cop_angle = 0; |
| 2407 | m_raiden2cop->cop_status |= 0x8000; |
| 2408 | m_raiden2cop->cop_angle = 0; |
| 2429 | 2409 | } else { |
| 2430 | | m_cop_angle = atan(double(dy)/double(dx)) * 128.0 / M_PI; |
| 2410 | m_raiden2cop->cop_angle = atan(double(dy)/double(dx)) * 128.0 / M_PI; |
| 2431 | 2411 | if(dx<0) |
| 2432 | | m_cop_angle += 0x80; |
| 2412 | m_raiden2cop->cop_angle += 0x80; |
| 2433 | 2413 | } |
| 2434 | 2414 | |
| 2435 | | m_cop_angle-=0x80; |
| 2415 | m_raiden2cop->cop_angle-=0x80; |
| 2436 | 2416 | m_r0 = dy; |
| 2437 | 2417 | m_r1 = dx; |
| 2438 | 2418 | |
| 2439 | 2419 | if(m_cop_mcu_ram[offset] & 0x80) |
| 2440 | | space.write_word(m_cop_register[0]+(0x34^2), m_cop_angle); |
| 2420 | space.write_word(m_cop_register[0]+(0x34^2), m_raiden2cop->cop_angle); |
| 2441 | 2421 | return; |
| 2442 | 2422 | } |
| 2443 | 2423 | |
| r32329 | r32330 | |
| 2457 | 2437 | |
| 2458 | 2438 | dx >>= 16; |
| 2459 | 2439 | dy >>= 16; |
| 2460 | | m_cop_dist = sqrt((double)(dx*dx+dy*dy)); |
| 2440 | m_raiden2cop->cop_dist = sqrt((double)(dx*dx+dy*dy)); |
| 2461 | 2441 | |
| 2462 | 2442 | if(m_cop_mcu_ram[offset] & 0x80) |
| 2463 | | space.write_word(m_cop_register[0]+(0x38), m_cop_dist); |
| 2443 | space.write_word(m_cop_register[0]+(0x38), m_raiden2cop->cop_dist); |
| 2464 | 2444 | return; |
| 2465 | 2445 | } |
| 2466 | 2446 | |
| r32329 | r32330 | |
| 2482 | 2462 | int dx = m_r1; |
| 2483 | 2463 | int div = space.read_word(m_cop_register[0]+(0x36^2)); |
| 2484 | 2464 | int res; |
| 2485 | | int m_cop_dist_raw; |
| 2465 | int cop_dist_raw; |
| 2486 | 2466 | |
| 2487 | 2467 | if(!div) |
| 2488 | 2468 | { |
| r32329 | r32330 | |
| 2494 | 2474 | /* TODO: recheck if m_cop_scale still masks at 3 with this command */ |
| 2495 | 2475 | dx >>= 11 + m_cop_scale; |
| 2496 | 2476 | dy >>= 11 + m_cop_scale; |
| 2497 | | m_cop_dist_raw = sqrt((double)(dx*dx+dy*dy)); |
| 2477 | cop_dist_raw = sqrt((double)(dx*dx+dy*dy)); |
| 2498 | 2478 | |
| 2499 | | res = m_cop_dist_raw; |
| 2479 | res = cop_dist_raw; |
| 2500 | 2480 | res /= div; |
| 2501 | 2481 | |
| 2502 | | m_cop_dist = (1 << (5 - m_cop_scale)) / div; |
| 2482 | m_raiden2cop->cop_dist = (1 << (5 - m_cop_scale)) / div; |
| 2503 | 2483 | |
| 2504 | 2484 | /* TODO: bits 5-6-15 */ |
| 2505 | | m_cop_status = 7; |
| 2485 | m_raiden2cop->cop_status = 7; |
| 2506 | 2486 | |
| 2507 | 2487 | space.write_word(m_cop_register[0]+(0x38^2), res); |
| 2508 | 2488 | return; |
| r32329 | r32330 | |
| 2663 | 2643 | flags = space.read_word(m_cop_register[1]); |
| 2664 | 2644 | //space.write_byte(m_cop_register[1] + (0^3),space.read_byte(m_cop_register[1] + (0^3)) & 0xfb); //correct? |
| 2665 | 2645 | |
| 2666 | | m_cop_angle_compare &= 0xff; |
| 2667 | | m_cop_angle_mod_val &= 0xff; |
| 2646 | m_legacycop_angle_compare &= 0xff; |
| 2647 | m_legacycop_angle_mod_val &= 0xff; |
| 2668 | 2648 | flags &= ~0x0004; |
| 2669 | 2649 | |
| 2670 | | int delta = cur_angle - m_cop_angle_compare; |
| 2650 | int delta = cur_angle - m_legacycop_angle_compare; |
| 2671 | 2651 | if(delta >= 128) |
| 2672 | 2652 | delta -= 256; |
| 2673 | 2653 | else if(delta < -128) |
| 2674 | 2654 | delta += 256; |
| 2675 | 2655 | if(delta < 0) |
| 2676 | 2656 | { |
| 2677 | | if(delta >= -m_cop_angle_mod_val) |
| 2657 | if(delta >= -m_legacycop_angle_mod_val) |
| 2678 | 2658 | { |
| 2679 | | cur_angle = m_cop_angle_compare; |
| 2659 | cur_angle = m_legacycop_angle_compare; |
| 2680 | 2660 | flags |= 0x0004; |
| 2681 | 2661 | } |
| 2682 | 2662 | else |
| 2683 | | cur_angle += m_cop_angle_mod_val; |
| 2663 | cur_angle += m_legacycop_angle_mod_val; |
| 2684 | 2664 | } |
| 2685 | 2665 | else |
| 2686 | 2666 | { |
| 2687 | | if(delta <= m_cop_angle_mod_val) |
| 2667 | if(delta <= m_legacycop_angle_mod_val) |
| 2688 | 2668 | { |
| 2689 | | cur_angle = m_cop_angle_compare; |
| 2669 | cur_angle = m_legacycop_angle_compare; |
| 2690 | 2670 | flags |= 0x0004; |
| 2691 | 2671 | } |
| 2692 | 2672 | else |
| 2693 | | cur_angle -= m_cop_angle_mod_val; |
| 2673 | cur_angle -= m_legacycop_angle_mod_val; |
| 2694 | 2674 | } |
| 2695 | 2675 | |
| 2696 | 2676 | space.write_byte(m_cop_register[1] + (0 ^ 2),flags); |
| r32329 | r32330 | |
| 2711 | 2691 | flags = space.read_word(m_cop_register[0] + (0 ^ 2)); |
| 2712 | 2692 | //space.write_byte(m_cop_register[1] + (0^3),space.read_byte(m_cop_register[1] + (0^3)) & 0xfb); //correct? |
| 2713 | 2693 | |
| 2714 | | m_cop_angle_compare &= 0xff; |
| 2715 | | m_cop_angle_mod_val &= 0xff; |
| 2694 | m_legacycop_angle_compare &= 0xff; |
| 2695 | m_legacycop_angle_mod_val &= 0xff; |
| 2716 | 2696 | flags &= ~0x0004; |
| 2717 | 2697 | |
| 2718 | | int delta = cur_angle - m_cop_angle_compare; |
| 2698 | int delta = cur_angle - m_legacycop_angle_compare; |
| 2719 | 2699 | if(delta >= 128) |
| 2720 | 2700 | delta -= 256; |
| 2721 | 2701 | else if(delta < -128) |
| 2722 | 2702 | delta += 256; |
| 2723 | 2703 | if(delta < 0) |
| 2724 | 2704 | { |
| 2725 | | if(delta >= -m_cop_angle_mod_val) |
| 2705 | if(delta >= -m_legacycop_angle_mod_val) |
| 2726 | 2706 | { |
| 2727 | | cur_angle = m_cop_angle_compare; |
| 2707 | cur_angle = m_legacycop_angle_compare; |
| 2728 | 2708 | flags |= 0x0004; |
| 2729 | 2709 | } |
| 2730 | 2710 | else |
| 2731 | | cur_angle += m_cop_angle_mod_val; |
| 2711 | cur_angle += m_legacycop_angle_mod_val; |
| 2732 | 2712 | } |
| 2733 | 2713 | else |
| 2734 | 2714 | { |
| 2735 | | if(delta <= m_cop_angle_mod_val) |
| 2715 | if(delta <= m_legacycop_angle_mod_val) |
| 2736 | 2716 | { |
| 2737 | | cur_angle = m_cop_angle_compare; |
| 2717 | cur_angle = m_legacycop_angle_compare; |
| 2738 | 2718 | flags |= 0x0004; |
| 2739 | 2719 | } |
| 2740 | 2720 | else |
| 2741 | | cur_angle -= m_cop_angle_mod_val; |
| 2721 | cur_angle -= m_legacycop_angle_mod_val; |
| 2742 | 2722 | } |
| 2743 | 2723 | |
| 2744 | 2724 | space.write_byte(m_cop_register[0] + (0 ^ 3),flags); |
| r32329 | r32330 | |
| 2753 | 2733 | int dy = space.read_dword(m_cop_register[2]+4) - space.read_dword(m_cop_register[0]+4); |
| 2754 | 2734 | int dx = space.read_dword(m_cop_register[2]+8) - space.read_dword(m_cop_register[0]+8); |
| 2755 | 2735 | |
| 2756 | | m_cop_status = 7; |
| 2736 | m_raiden2cop->cop_status = 7; |
| 2757 | 2737 | if(!dx) { |
| 2758 | | m_cop_status |= 0x8000; |
| 2759 | | m_cop_angle = 0; |
| 2738 | m_raiden2cop->cop_status |= 0x8000; |
| 2739 | m_raiden2cop->cop_angle = 0; |
| 2760 | 2740 | } else { |
| 2761 | | m_cop_angle = atan(double(dy)/double(dx)) * 128.0 / M_PI; |
| 2741 | m_raiden2cop->cop_angle = atan(double(dy)/double(dx)) * 128.0 / M_PI; |
| 2762 | 2742 | if(dx<0) |
| 2763 | | m_cop_angle += 0x80; |
| 2743 | m_raiden2cop->cop_angle += 0x80; |
| 2764 | 2744 | } |
| 2765 | 2745 | |
| 2766 | 2746 | m_r0 = dy; |
| 2767 | 2747 | m_r1 = dx; |
| 2768 | 2748 | |
| 2769 | | //printf("%d %d %f %04x\n",dx,dy,atan(double(dy)/double(dx)) * 128 / M_PI,m_cop_angle); |
| 2749 | //printf("%d %d %f %04x\n",dx,dy,atan(double(dy)/double(dx)) * 128 / M_PI,m_raiden2cop->cop_angle); |
| 2770 | 2750 | |
| 2771 | 2751 | if(m_cop_mcu_ram[offset] & 0x80) |
| 2772 | | space.write_word(m_cop_register[0]+(0x34^2), m_cop_angle); |
| 2752 | space.write_word(m_cop_register[0]+(0x34^2), m_raiden2cop->cop_angle); |
| 2773 | 2753 | return; |
| 2774 | 2754 | } |
| 2775 | 2755 | |