trunk/src/mame/drivers/legionna.c
| r32332 | r32333 | |
| 97 | 97 | AM_RANGE(0x100424, 0x100425) AM_DEVWRITE("raiden2cop", raiden2cop_device, cop_itoa_digit_count_w) |
| 98 | 98 | AM_RANGE(0x100428, 0x100429) AM_DEVWRITE("raiden2cop", raiden2cop_device, cop_dma_v1_w) |
| 99 | 99 | AM_RANGE(0x10042a, 0x10042b) AM_DEVWRITE("raiden2cop", raiden2cop_device, cop_dma_v2_w) |
| 100 | AM_RANGE(0x10042c, 0x10042d) AM_DEVREADWRITE("raiden2cop", raiden2cop_device, cop_prng_maxvalue_r, cop_prng_maxvalue_w) |
| 100 | 101 | AM_RANGE(0x100432, 0x100433) AM_DEVWRITE("raiden2cop", raiden2cop_device, cop_pgm_data_w) |
| 101 | 102 | AM_RANGE(0x100434, 0x100435) AM_DEVWRITE("raiden2cop", raiden2cop_device, cop_pgm_addr_w) |
| 102 | 103 | // AM_RANGE(0x100436, 0x100437) AM_WRITE(cop_hitbox_baseadr_w) |
| 103 | 104 | AM_RANGE(0x100438, 0x100439) AM_DEVWRITE("raiden2cop", raiden2cop_device, cop_pgm_value_w) |
| 104 | 105 | AM_RANGE(0x10043a, 0x10043b) AM_DEVWRITE("raiden2cop", raiden2cop_device, cop_pgm_mask_w) |
| 105 | 106 | AM_RANGE(0x10043c, 0x10043d) AM_DEVWRITE("raiden2cop", raiden2cop_device, cop_pgm_trigger_w) |
| 106 | | // AM_RANGE(0x100444, 0x100445) AM_WRITE(cop_scale_w) |
| 107 | | // AM_RANGE(0x100450, 0x100451) AM_WRITE(cop_sort_ram_addr_hi_w) |
| 108 | | // AM_RANGE(0x100452, 0x100453) AM_WRITE(cop_sort_ram_addr_lo_w) |
| 109 | | // AM_RANGE(0x100454, 0x100455) AM_WRITE(cop_sort_lookup_hi_w) |
| 110 | | // AM_RANGE(0x100456, 0x100457) AM_WRITE(cop_sort_lookup_lo_w) |
| 111 | | // AM_RANGE(0x100458, 0x100459) AM_WRITE(cop_sort_param_w) |
| 107 | AM_RANGE(0x100444, 0x100445) AM_DEVWRITE("raiden2cop", raiden2cop_device, cop_scale_w) |
| 108 | AM_RANGE(0x100450, 0x100451) AM_DEVWRITE("raiden2cop", raiden2cop_device, cop_sort_ram_addr_hi_w) |
| 109 | AM_RANGE(0x100452, 0x100453) AM_DEVWRITE("raiden2cop", raiden2cop_device, cop_sort_ram_addr_lo_w) |
| 110 | AM_RANGE(0x100454, 0x100455) AM_DEVWRITE("raiden2cop", raiden2cop_device, cop_sort_lookup_hi_w) |
| 111 | AM_RANGE(0x100456, 0x100457) AM_DEVWRITE("raiden2cop", raiden2cop_device, cop_sort_lookup_lo_w) |
| 112 | AM_RANGE(0x100458, 0x100459) AM_DEVWRITE("raiden2cop", raiden2cop_device, cop_sort_param_w) |
| 112 | 113 | AM_RANGE(0x10045a, 0x10045b) AM_DEVWRITE("raiden2cop", raiden2cop_device, cop_pal_brightness_val_w) //palette DMA brightness val, used by X Se Dae / Zero Team |
| 113 | 114 | AM_RANGE(0x10045c, 0x10045d) AM_DEVWRITE("raiden2cop", raiden2cop_device, cop_pal_brightness_mode_w) //palette DMA brightness mode, used by X Se Dae / Zero Team (sets to 5) |
| 114 | 115 | // AM_RANGE(0x100470, 0x100471) AM_READWRITE(cop_tile_bank_2_r,cop_tile_bank_2_w) |
| r32332 | r32333 | |
| 125 | 126 | // AM_RANGE(0x100582, 0x100587) AM_READ(cop_collision_status_val_r) |
| 126 | 127 | // AM_RANGE(0x100588, 0x100589) AM_READ(cop_collision_status_stat_r) |
| 127 | 128 | AM_RANGE(0x100590, 0x100599) AM_DEVREAD("raiden2cop", raiden2cop_device, cop_itoa_digits_r) |
| 129 | |
| 130 | AM_RANGE(0x1005a0, 0x1005a7) AM_DEVREAD("raiden2cop", raiden2cop_device, cop_prng_r) |
| 131 | |
| 128 | 132 | AM_RANGE(0x1005b0, 0x1005b1) AM_DEVREAD("raiden2cop", raiden2cop_device, cop_status_r) |
| 129 | 133 | AM_RANGE(0x1005b2, 0x1005b3) AM_DEVREAD("raiden2cop", raiden2cop_device, cop_dist_r) |
| 130 | 134 | AM_RANGE(0x1005b4, 0x1005b5) AM_DEVREAD("raiden2cop", raiden2cop_device, cop_angle_r) |
| 131 | 135 | |
| 132 | 136 | AM_RANGE(0x1006fc, 0x1006fd) AM_DEVWRITE("raiden2cop", raiden2cop_device,cop_dma_trigger_w) |
| 133 | | // AM_RANGE(0x1006fe, 0x1006ff) AM_WRITE(cop_sort_dma_trig_w) // sort-DMA trigger |
| 137 | AM_RANGE(0x1006fe, 0x1006ff) AM_DEVWRITE("raiden2cop", raiden2cop_device,cop_sort_dma_trig_w) // sort-DMA trigger |
| 134 | 138 | ADDRESS_MAP_END |
| 135 | 139 | |
| 136 | 140 | |
trunk/src/mame/machine/seicop.c
| r32332 | r32333 | |
| 1601 | 1601 | seibu_cop_legacy_device::seibu_cop_legacy_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) |
| 1602 | 1602 | : device_t(mconfig, SEIBU_COP_LEGACY, "Seibu COP Legacy", tag, owner, clock, "seibu_cop_legacy", __FILE__), |
| 1603 | 1603 | m_cop_mcu_ram(NULL), |
| 1604 | | m_cop_scale(0), |
| 1605 | | m_cop_rng_max_value(0), |
| 1606 | 1604 | m_copd2_offs(0), |
| 1607 | | m_cop_hit_status(0), |
| 1608 | 1605 | m_cop_hit_val_x(0), |
| 1609 | 1606 | m_cop_hit_val_y(0), |
| 1610 | 1607 | m_cop_hit_val_z(0), |
| 1611 | 1608 | m_cop_hit_val_unk(0), |
| 1612 | | m_cop_sort_lookup(0), |
| 1613 | | m_cop_sort_ram_addr(0), |
| 1614 | | m_cop_sort_param(0), |
| 1615 | 1609 | m_legacycop_angle_compare(0), |
| 1616 | 1610 | m_legacycop_angle_mod_val(0), |
| 1617 | 1611 | m_r0(0), |
| r32332 | r32333 | |
| 1650 | 1644 | { |
| 1651 | 1645 | m_cop_mcu_ram = reinterpret_cast<UINT16 *>(machine().root_device().memshare("cop_mcu_ram")->ptr()); |
| 1652 | 1646 | |
| 1653 | | save_item(NAME(m_cop_scale)); |
| 1654 | | save_item(NAME(m_cop_rng_max_value)); |
| 1647 | |
| 1655 | 1648 | save_item(NAME(m_copd2_offs)); |
| 1656 | | save_item(NAME(m_cop_hit_status)); |
| 1657 | 1649 | save_item(NAME(m_cop_hit_val_x)); |
| 1658 | 1650 | save_item(NAME(m_cop_hit_val_y)); |
| 1659 | 1651 | save_item(NAME(m_cop_hit_val_z)); |
| 1660 | 1652 | save_item(NAME(m_cop_hit_val_unk)); |
| 1661 | | save_item(NAME(m_cop_sort_lookup)); |
| 1662 | | save_item(NAME(m_cop_sort_ram_addr)); |
| 1663 | | save_item(NAME(m_cop_sort_param)); |
| 1664 | 1653 | save_item(NAME(m_legacycop_angle_compare)); |
| 1665 | 1654 | save_item(NAME(m_legacycop_angle_mod_val)); |
| 1666 | 1655 | save_item(NAME(m_r0)); |
| r32332 | r32333 | |
| 1860 | 1849 | if(raw_angle == 0xc0) |
| 1861 | 1850 | amp*=2; |
| 1862 | 1851 | |
| 1863 | | res = int(amp*sin(angle)) << m_cop_scale; |
| 1852 | res = int(amp*sin(angle)) << m_raiden2cop->cop_scale; |
| 1864 | 1853 | |
| 1865 | 1854 | space.write_dword(m_raiden2cop->cop_regs[0] + 0x10, res); |
| 1866 | 1855 | |
| r32332 | r32333 | |
| 1877 | 1866 | if(raw_angle == 0x80) |
| 1878 | 1867 | amp*=2; |
| 1879 | 1868 | |
| 1880 | | res = int(amp*cos(angle)) << m_cop_scale; |
| 1869 | res = int(amp*cos(angle)) << m_raiden2cop->cop_scale; |
| 1881 | 1870 | |
| 1882 | 1871 | space.write_dword(m_raiden2cop->cop_regs[0] + 20, res); |
| 1883 | 1872 | |
| r32332 | r32333 | |
| 2053 | 2042 | |
| 2054 | 2043 | switch (offset) |
| 2055 | 2044 | { |
| 2056 | | /* RNG max value readback, trusted */ |
| 2057 | | case 0x02c/2: |
| 2058 | | return retvalue; |
| 2059 | 2045 | |
| 2060 | | /* DMA mode register readback, trusted */ |
| 2061 | | case 0x07e/2: |
| 2062 | | return retvalue; |
| 2063 | | |
| 2064 | | case 0x180/2: |
| 2065 | | return m_cop_hit_status; |
| 2066 | | |
| 2067 | 2046 | /* these two controls facing direction in Godzilla opponents (only vs.) - x value compare? */ |
| 2068 | 2047 | case 0x182/2: |
| 2069 | 2048 | return (m_cop_hit_val_y); |
| r32332 | r32333 | |
| 2079 | 2058 | return m_cop_hit_val_unk; |
| 2080 | 2059 | |
| 2081 | 2060 | |
| 2082 | | /* RNG, trusted */ |
| 2083 | | case 0x1a0/2: |
| 2084 | | case 0x1a2/2: |
| 2085 | | case 0x1a4/2: |
| 2086 | | case 0x1a6/2: |
| 2087 | | return space.machine().firstcpu->total_cycles() % (m_cop_rng_max_value+1); |
| 2088 | 2061 | |
| 2089 | 2062 | |
| 2090 | 2063 | default: |
| r32332 | r32333 | |
| 2146 | 2119 | |
| 2147 | 2120 | |
| 2148 | 2121 | |
| 2149 | | /* max possible value returned by the RNG at 0x5a*, trusted */ |
| 2150 | | case (0x02c/2): m_cop_rng_max_value = m_cop_mcu_ram[0x2c/2] & 0xff; break; |
| 2151 | | |
| 2122 | |
| 2152 | 2123 | case (0x03e/2): |
| 2153 | 2124 | /* |
| 2154 | 2125 | 0 in all 68k based games |
| r32332 | r32333 | |
| 2158 | 2129 | */ |
| 2159 | 2130 | break; |
| 2160 | 2131 | |
| 2161 | | case (0x044/2): { m_cop_scale = data & 3; break; } |
| 2162 | 2132 | case (0x046/2): { m_cop_rom_addr_unk = data & 0xffff; break; } |
| 2163 | 2133 | case (0x048/2): { m_cop_rom_addr_lo = data & 0xffff; break; } |
| 2164 | 2134 | case (0x04a/2): { m_cop_rom_addr_hi = data & 0xffff; break; } |
| r32332 | r32333 | |
| 2287 | 2257 | if(raw_angle == 0xc0) |
| 2288 | 2258 | amp*=2; |
| 2289 | 2259 | |
| 2290 | | res = int(amp*sin(angle)) << m_cop_scale; |
| 2260 | res = int(amp*sin(angle)) << m_raiden2cop->cop_scale; |
| 2291 | 2261 | |
| 2292 | 2262 | space.write_dword(m_raiden2cop->cop_regs[0] + 0x10, res); |
| 2293 | 2263 | return; |
| r32332 | r32333 | |
| 2317 | 2287 | if(raw_angle == 0x80) |
| 2318 | 2288 | amp*=2; |
| 2319 | 2289 | |
| 2320 | | res = int(amp*cos(angle)) << m_cop_scale; |
| 2290 | res = int(amp*cos(angle)) << m_raiden2cop->cop_scale; |
| 2321 | 2291 | |
| 2322 | 2292 | space.write_dword(m_raiden2cop->cop_regs[0] + 20, res); |
| 2323 | 2293 | return; |
| r32332 | r32333 | |
| 2427 | 2397 | } |
| 2428 | 2398 | |
| 2429 | 2399 | /* TODO: calculation of this one should occur at 0x3b30/0x3bb0 I *think* */ |
| 2430 | | /* TODO: recheck if m_cop_scale still masks at 3 with this command */ |
| 2431 | | dx >>= 11 + m_cop_scale; |
| 2432 | | dy >>= 11 + m_cop_scale; |
| 2400 | /* TODO: recheck if m_raiden2cop->cop_scale still masks at 3 with this command */ |
| 2401 | dx >>= 11 + m_raiden2cop->cop_scale; |
| 2402 | dy >>= 11 + m_raiden2cop->cop_scale; |
| 2433 | 2403 | cop_dist_raw = sqrt((double)(dx*dx+dy*dy)); |
| 2434 | 2404 | |
| 2435 | 2405 | res = cop_dist_raw; |
| 2436 | 2406 | res /= div; |
| 2437 | 2407 | |
| 2438 | | m_raiden2cop->cop_dist = (1 << (5 - m_cop_scale)) / div; |
| 2408 | m_raiden2cop->cop_dist = (1 << (5 - m_raiden2cop->cop_scale)) / div; |
| 2439 | 2409 | |
| 2440 | 2410 | /* TODO: bits 5-6-15 */ |
| 2441 | 2411 | m_raiden2cop->cop_status = 7; |
| r32332 | r32333 | |
| 2475 | 2445 | |
| 2476 | 2446 | /* do the math */ |
| 2477 | 2447 | cop_take_hit_box_params(0); |
| 2478 | | m_cop_hit_status = cop_calculate_collsion_detection(); |
| 2448 | m_raiden2cop->cop_hit_status = cop_calculate_collsion_detection(); |
| 2479 | 2449 | |
| 2480 | 2450 | return; |
| 2481 | 2451 | } |
| r32332 | r32333 | |
| 2498 | 2468 | |
| 2499 | 2469 | /* do the math */ |
| 2500 | 2470 | cop_take_hit_box_params(1); |
| 2501 | | m_cop_hit_status = cop_calculate_collsion_detection(); |
| 2471 | m_raiden2cop->cop_hit_status = cop_calculate_collsion_detection(); |
| 2502 | 2472 | return; |
| 2503 | 2473 | } |
| 2504 | 2474 | |
| r32332 | r32333 | |
| 2729 | 2699 | break; |
| 2730 | 2700 | } |
| 2731 | 2701 | |
| 2732 | | /* DMA go register */ |
| 2733 | | case (0x2fc/2): m_raiden2cop->cop_dma_trigger_w(space, offset, data, mem_mask); break; |
| 2734 | 2702 | |
| 2735 | 2703 | |
| 2736 | | /* sort-DMA, oh my ... */ |
| 2737 | | case (0x054/2): { m_cop_sort_lookup = (m_cop_sort_lookup&0x0000ffff)|(m_cop_mcu_ram[offset]<<16); break; } |
| 2738 | | case (0x056/2): { m_cop_sort_lookup = (m_cop_sort_lookup&0xffff0000)|(m_cop_mcu_ram[offset]<<0); break; } |
| 2739 | | case (0x050/2): { m_cop_sort_ram_addr = (m_cop_sort_ram_addr&0x0000ffff)|(m_cop_mcu_ram[offset]<<16); break; } |
| 2740 | | case (0x052/2): { m_cop_sort_ram_addr = (m_cop_sort_ram_addr&0xffff0000)|(m_cop_mcu_ram[offset]<<0); break; } |
| 2741 | | case (0x058/2): { m_cop_sort_param = m_cop_mcu_ram[offset]; break; } |
| 2742 | 2704 | |
| 2743 | | case (0x2fe/2): |
| 2744 | | { |
| 2745 | | UINT16 sort_size; |
| 2746 | 2705 | |
| 2747 | | sort_size = m_cop_mcu_ram[offset]; |
| 2748 | | |
| 2749 | | { |
| 2750 | | int i,j; |
| 2751 | | UINT8 xchg_flag; |
| 2752 | | UINT32 addri,addrj; |
| 2753 | | UINT16 vali,valj; |
| 2754 | | |
| 2755 | | /* TODO: use a better algorithm than bubble sort! */ |
| 2756 | | for(i=2;i<sort_size;i+=2) |
| 2757 | | { |
| 2758 | | for(j=i-2;j<sort_size;j+=2) |
| 2759 | | { |
| 2760 | | addri = m_cop_sort_ram_addr+space.read_word(m_cop_sort_lookup+i); |
| 2761 | | addrj = m_cop_sort_ram_addr+space.read_word(m_cop_sort_lookup+j); |
| 2762 | | |
| 2763 | | vali = space.read_word(addri); |
| 2764 | | valj = space.read_word(addrj); |
| 2765 | | |
| 2766 | | //printf("%08x %08x %04x %04x\n",addri,addrj,vali,valj); |
| 2767 | | |
| 2768 | | switch(m_cop_sort_param) |
| 2769 | | { |
| 2770 | | case 2: xchg_flag = (vali > valj); break; |
| 2771 | | case 1: xchg_flag = (vali < valj); break; |
| 2772 | | case 0: xchg_flag = 0; break; /* ??? */ |
| 2773 | | default: xchg_flag = 0; printf("Warning: sort-DMA used with param %02x\n",m_cop_sort_param); break; |
| 2774 | | } |
| 2775 | | |
| 2776 | | if(xchg_flag) |
| 2777 | | { |
| 2778 | | UINT16 xch_val; |
| 2779 | | |
| 2780 | | xch_val = space.read_word(m_cop_sort_lookup+i); |
| 2781 | | space.write_word(m_cop_sort_lookup+i,space.read_word(m_cop_sort_lookup+j)); |
| 2782 | | space.write_word(m_cop_sort_lookup+j,xch_val); |
| 2783 | | } |
| 2784 | | } |
| 2785 | | } |
| 2786 | | } |
| 2787 | | //else |
| 2788 | | |
| 2789 | | break; |
| 2790 | | } |
| 2791 | 2706 | } |
| 2792 | 2707 | } |