comparison m68k.cpu @ 2501:6cd5a1d76e34

Implement some more instructions in new 68K core. First light with some old demos
author Michael Pavone <pavone@retrodev.com>
date Wed, 01 May 2024 01:19:30 -0700
parents d44fe974fb85
children ad50530a7c27
comparison
equal deleted inserted replaced
2500:d44fe974fb85 2501:6cd5a1d76e34
1931 invalid M 7 R 5 1931 invalid M 7 R 5
1932 invalid M 7 R 6 1932 invalid M 7 R 6
1933 invalid M 7 R 7 1933 invalid M 7 R 7
1934 1934
1935 a7 -= 4 1935 a7 -= 4
1936 scratch1 = a7 1936 scratch2 = a7
1937 m68k_write32 pc 1937 m68k_write32 pc
1938 1938
1939 m68k_calc_ea M R 2 1939 m68k_calc_ea M R 2
1940 pc = ea 1940 pc = ea
1941 1941
1942 cycles 4 1942 cycles 4
1943 m68k_prefetch 1943 m68k_prefetch
1944 1944
1945 0100111010MMMRRR jmp 1945 0100111011MMMRRR jmp
1946 invalid M 0 1946 invalid M 0
1947 invalid M 1 1947 invalid M 1
1948 invalid M 3 1948 invalid M 3
1949 invalid M 4 1949 invalid M 4
1950 invalid M 7 R 4 1950 invalid M 7 R 4
2127 ea = address 2127 ea = address
2128 end 2128 end
2129 2129
2130 m68k_prefetch 2130 m68k_prefetch
2131 2131
2132 0100111001100RRR move_to_usp
2133 #TODO: trap if not in supervisor mode
2134 other_sp = aregs.R
2135 m68k_prefetch
2136
2137 0100111001101RRR move_from_usp
2138 #TODO: trap if not in supervisor mode
2139 aregs.R = other_sp
2140 m68k_prefetch
2141
2132 0111RRR0IIIIIIII moveq 2142 0111RRR0IIIIIIII moveq
2133 local tmp 32 2143 local tmp 32
2134 sext 16 I tmp 2144 sext 16 I tmp
2135 sext 32 tmp dregs.R 2145 sext 32 tmp dregs.R
2136 cmp 0 dregs.R 2146 cmp 0 dregs.R
2137 update_flags NZV0C0 2147 update_flags NZV0C0
2138 m68k_prefetch 2148 m68k_prefetch
2149
2150 0110000100000000 bsr_w
2151 #mid-instruction timing isn't quite right
2152 #becuase I'm only emulating a 1-word prefetch buffer instead of 2
2153 local offset 32
2154 m68k_prefetch
2155 sext 32 prefetch offset
2156
2157 a7 -= 4
2158 scratch2 = a7
2159 m68k_write32 pc
2160
2161 pc += offset
2162 pc -= 2
2163
2164 cycles 2
2165 m68k_prefetch
2166
2167
2168 01100001DDDDDDDD bsr
2169 #mid-instruction timing isn't quite right
2170 #becuase I'm only emulating a 1-word prefetch buffer instead of 2
2171 local offset 32
2172 sext 16 D offset
2173 sext 32 offset offset
2174
2175 a7 -= 4
2176 scratch2 = a7
2177 m68k_write32 pc
2178
2179 pc += offset
2180
2181 cycles 6
2182 m68k_prefetch
2183
2184 m68k_check_cond
2185 arg cond 16
2186 local invert 8
2187 switch cond
2188 case 0
2189 #true
2190 meta istrue 1
2191 case 1
2192 #false
2193 meta istrue 0
2194 case 2
2195 #high
2196 meta istrue invert
2197 invert = zflag | cflag
2198 invert = !invert
2199 case 3
2200 #low or same
2201 meta istrue invert
2202 invert = zflag | cflag
2203 case 4
2204 #carry clear
2205 meta istrue invert
2206 invert = !cflag
2207 case 5
2208 #carry set
2209 meta istrue cflag
2210 case 6
2211 #not equal
2212 meta istrue invert
2213 invert = !zflag
2214 case 7
2215 #equal
2216 meta istrue zflag
2217 case 8
2218 #overflow clear
2219 meta istrue invert
2220 invert = !vflag
2221 case 9
2222 #overflow set
2223 meta istrue vflag
2224 case 10
2225 #plus
2226 meta istrue invert
2227 invert = !nflag
2228 case 11
2229 #minus
2230 meta istrue nflag
2231 case 12
2232 #greater or equal
2233 meta istrue invert
2234 invert = nflag - vflag
2235 invert = !invert
2236 case 13
2237 #less
2238 meta istrue invert
2239 invert = nflag - vflag
2240 case 14
2241 #greater
2242 meta istrue invert
2243 invert = vflag ^ nflag
2244 invert |= zflag
2245 invert = !invert
2246 case 15
2247 #less or equal
2248 meta istrue invert
2249 invert = vflag ^ nflag
2250 invert |= zflag
2251 end
2252
2253 0110CCCC00000000 bcc_w
2254 #mid-instruction timing isn't quite right
2255 #becuase I'm only emulating a 1-word prefetch buffer instead of 2
2256 local offset 32
2257 m68k_prefetch
2258 m68k_check_cond C
2259 if istrue
2260
2261 sext 32 prefetch offset
2262 pc += offset
2263 pc -= 2
2264 cycles 2
2265 else
2266 cycles 4
2267 end
2268 m68k_prefetch
2269
2270 0110CCCCDDDDDDDD bcc
2271 #mid-instruction timing isn't quite right
2272 #becuase I'm only emulating a 1-word prefetch buffer instead of 2
2273 local offset 32
2274 m68k_check_cond C
2275 if istrue
2276 sext 16 D offset
2277 sext 32 offset offset
2278
2279 pc += offset
2280
2281 cycles 6
2282 else
2283 cycles 4
2284 end
2285 m68k_prefetch
2286
2287 0101CCCC11001RRR dbcc
2288 local offset 32
2289 local tmp 16
2290 m68k_prefetch
2291 m68k_check_cond C
2292 if istrue
2293 cycles 4
2294 else
2295 dregs.R:1 -= 1
2296 tmp = dregs.R
2297 if tmp = 65535
2298 cycles 6
2299 else
2300 sext 32 prefetch offset
2301 pc += offset
2302 pc -= 2
2303 cycles 2
2304 end
2305 end
2306 m68k_prefetch