trunk/src/mame/machine/seicop.c
| r32007 | r32008 | |
| 2036 | 2036 | return retvalue; |
| 2037 | 2037 | } |
| 2038 | 2038 | |
| 2039 | case 0x5b0/2: |
| 2040 | return m_cop_status; |
| 2041 | |
| 2042 | case 0x5b2/2: |
| 2043 | return m_cop_dist; |
| 2044 | |
| 2045 | case 0x5b4/2: |
| 2046 | return m_cop_angle; |
| 2039 | 2047 | //case (0x47e/2): |
| 2040 | 2048 | //case (0x5b0/2): |
| 2041 | 2049 | //case (0x5b4/2): |
| r32007 | r32008 | |
| 2061 | 2069 | logerror("%06x: COPX unhandled write data %04x at offset %04x\n", space.device().safe_pc(), data, offset*2); |
| 2062 | 2070 | break; |
| 2063 | 2071 | } |
| 2072 | case (0x4a0/2): { m_cop_register[0] = (m_cop_register[0]&0x0000ffff)|(m_cop_mcu_ram[offset]<<16); break; } |
| 2073 | case (0x4c0/2): { m_cop_register[0] = (m_cop_register[0]&0xffff0000)|(m_cop_mcu_ram[offset]<<0); break; } |
| 2064 | 2074 | |
| 2075 | case (0x4a2/2): { m_cop_register[1] = (m_cop_register[1]&0x0000ffff)|(m_cop_mcu_ram[offset]<<16); break; } |
| 2076 | case (0x4c2/2): { m_cop_register[1] = (m_cop_register[1]&0xffff0000)|(m_cop_mcu_ram[offset]<<0); break; } |
| 2077 | |
| 2078 | case (0x4a4/2): { m_cop_register[2] = (m_cop_register[2]&0x0000ffff)|(m_cop_mcu_ram[offset]<<16); break; } |
| 2079 | case (0x4c4/2): { m_cop_register[2] = (m_cop_register[2]&0xffff0000)|(m_cop_mcu_ram[offset]<<0); break; } |
| 2080 | |
| 2081 | case (0x4a6/2): { m_cop_register[3] = (m_cop_register[3]&0x0000ffff)|(m_cop_mcu_ram[offset]<<16); break; } |
| 2082 | case (0x4c6/2): { m_cop_register[3] = (m_cop_register[3]&0xffff0000)|(m_cop_mcu_ram[offset]<<0); break; } |
| 2083 | |
| 2084 | case (0x4a8/2): { m_cop_register[4] = (m_cop_register[4]&0x0000ffff)|(m_cop_mcu_ram[offset]<<16); break; } |
| 2085 | case (0x4c8/2): { m_cop_register[4] = (m_cop_register[4]&0xffff0000)|(m_cop_mcu_ram[offset]<<0); break; } |
| 2086 | |
| 2087 | case (0x4aa/2): { m_cop_register[5] = (m_cop_register[5]&0x0000ffff)|(m_cop_mcu_ram[offset]<<16); break; } |
| 2088 | case (0x4ca/2): { m_cop_register[5] = (m_cop_register[5]&0xffff0000)|(m_cop_mcu_ram[offset]<<0); break; } |
| 2089 | |
| 2090 | case (0x4ac/2): { m_cop_register[6] = (m_cop_register[6]&0x0000ffff)|(m_cop_mcu_ram[offset]<<16); break; } |
| 2091 | case (0x4cc/2): { m_cop_register[6] = (m_cop_register[6]&0xffff0000)|(m_cop_mcu_ram[offset]<<0); break; } |
| 2092 | |
| 2093 | |
| 2094 | case (0x500/2): |
| 2095 | case (0x502/2): |
| 2096 | case (0x504/2): |
| 2097 | switch(m_cop_mcu_ram[offset]) |
| 2098 | { |
| 2099 | case 0x8100: |
| 2100 | { |
| 2101 | int raw_angle = (space.read_word(m_cop_register[0]+(0x34^2)) & 0xff); |
| 2102 | double angle = raw_angle * M_PI / 128; |
| 2103 | double amp = (65536 >> 5)*(space.read_word(m_cop_register[0]+(0x36^2)) & 0xff); |
| 2104 | int res; |
| 2105 | |
| 2106 | /* TODO: up direction, why? */ |
| 2107 | if(raw_angle == 0xc0) |
| 2108 | amp*=2; |
| 2109 | |
| 2110 | res = int(amp*sin(angle)) << m_cop_scale; |
| 2111 | |
| 2112 | space.write_dword(m_cop_register[0] + 0x10, res); |
| 2113 | |
| 2114 | break; |
| 2115 | } |
| 2116 | case 0x8900: |
| 2117 | { |
| 2118 | int raw_angle = (space.read_word(m_cop_register[0]+(0x34^2)) & 0xff); |
| 2119 | double angle = raw_angle * M_PI / 128; |
| 2120 | double amp = (65536 >> 5)*(space.read_word(m_cop_register[0]+(0x36^2)) & 0xff); |
| 2121 | int res; |
| 2122 | |
| 2123 | /* TODO: left direction, why? */ |
| 2124 | if(raw_angle == 0x80) |
| 2125 | amp*=2; |
| 2126 | |
| 2127 | res = int(amp*cos(angle)) << m_cop_scale; |
| 2128 | |
| 2129 | space.write_dword(m_cop_register[0] + 20, res); |
| 2130 | |
| 2131 | break; |
| 2132 | } |
| 2133 | case 0x0205: |
| 2134 | { |
| 2135 | UINT8 offs; |
| 2136 | |
| 2137 | offs = (offset & 3) * 4; |
| 2138 | int ppos = space.read_dword(m_cop_register[0] + 4 + offs); |
| 2139 | int npos = ppos + space.read_dword(m_cop_register[0] + 0x10 + offs); |
| 2140 | int delta = (npos >> 16) - (ppos >> 16); |
| 2141 | |
| 2142 | space.write_dword(m_cop_register[0] + 4 + offs, npos); |
| 2143 | space.write_word(m_cop_register[0] + 0x1c + offs, space.read_word(m_cop_register[0] + 0x1c + offs) + delta); |
| 2144 | |
| 2145 | break; |
| 2146 | } |
| 2147 | case 0x130e: |
| 2148 | case 0x138e: |
| 2149 | { |
| 2150 | int dy = space.read_dword(m_cop_register[1]+4) - space.read_dword(m_cop_register[0]+4); |
| 2151 | int dx = space.read_dword(m_cop_register[1]+8) - space.read_dword(m_cop_register[0]+8); |
| 2152 | |
| 2153 | m_cop_status = 7; |
| 2154 | if(!dx) { |
| 2155 | m_cop_status |= 0x8000; |
| 2156 | m_cop_angle = 0; |
| 2157 | } else { |
| 2158 | m_cop_angle = atan(double(dy)/double(dx)) * 128.0 / M_PI; |
| 2159 | if(dx<0) |
| 2160 | m_cop_angle += 0x80; |
| 2161 | } |
| 2162 | |
| 2163 | m_r0 = dy; |
| 2164 | m_r1 = dx; |
| 2165 | |
| 2166 | if(m_cop_mcu_ram[offset] & 0x80) |
| 2167 | space.write_word(m_cop_register[0]+(0x34^2), m_cop_angle); |
| 2168 | |
| 2169 | break; |
| 2170 | } |
| 2171 | case 0x3b30: |
| 2172 | case 0x3bb0: |
| 2173 | { |
| 2174 | int dy = m_r0; |
| 2175 | int dx = m_r1; |
| 2176 | |
| 2177 | dx >>= 16; |
| 2178 | dy >>= 16; |
| 2179 | m_cop_dist = sqrt((double)(dx*dx+dy*dy)); |
| 2180 | |
| 2181 | if(m_cop_mcu_ram[offset] & 0x80) |
| 2182 | space.write_word(m_cop_register[0]+(0x38), m_cop_dist); |
| 2183 | |
| 2184 | break; |
| 2185 | } |
| 2186 | default: |
| 2187 | printf("%04x\n",m_cop_mcu_ram[offset]); |
| 2188 | break; |
| 2189 | } |
| 2190 | break; |
| 2191 | |
| 2065 | 2192 | /*TODO: kludge on x-axis.*/ |
| 2066 | 2193 | case (0x660/2): { state->m_scrollram16[0] = m_cop_mcu_ram[offset] - 0x1f0; break; } |
| 2067 | 2194 | case (0x662/2): { state->m_scrollram16[1] = m_cop_mcu_ram[offset]; break; } |
| r32007 | r32008 | |
| 3108 | 3235 | } |
| 3109 | 3236 | |
| 3110 | 3237 | /* private buffer copies */ |
| 3111 | | if ((m_cop_dma_trigger==0x14) || (m_cop_dma_trigger==0x15)) return; |
| 3238 | if ((m_cop_dma_trigger==0x14) || (m_cop_dma_trigger==0x15)) |
| 3239 | return; |
| 3112 | 3240 | |
| 3113 | 3241 | printf("SRC: %08x %08x DST:%08x SIZE:%08x TRIGGER: %08x\n",m_cop_dma_src[m_cop_dma_trigger] << 6,m_cop_dma_fade_table,m_cop_dma_dst[m_cop_dma_trigger] << 6,m_cop_dma_size[m_cop_dma_trigger] << 5,m_cop_dma_trigger); |
| 3114 | 3242 | |
trunk/src/mame/includes/legionna.h
| r32007 | r32008 | |
| 5 | 5 | public: |
| 6 | 6 | legionna_state(const machine_config &mconfig, device_type type, const char *tag) |
| 7 | 7 | : driver_device(mconfig, type, tag), |
| 8 | | m_spriteram(*this, "spriteram") , |
| 8 | m_spriteram(*this, "spriteram"), |
| 9 | 9 | m_back_data(*this, "back_data"), |
| 10 | 10 | m_fore_data(*this, "fore_data"), |
| 11 | 11 | m_mid_data(*this, "mid_data"), |