comparison runtime.S @ 348:3923dbc2dcc4

m68k_trap is now replaced with a generated one so it can call the generated memory acccess functions. The old static memory access functions have been removed from runtime.S
author Mike Pavone <pavone@retrodev.com>
date Tue, 21 May 2013 01:10:04 -0700
parents b24556b45d1e
children 8e136187c0e0
comparison
equal deleted inserted replaced
347:b24556b45d1e 348:3923dbc2dcc4
42 xor %rax, %rax 42 xor %rax, %rax
43 call printf 43 call printf
44 pop %rsi 44 pop %rsi
45 call m68k_load_context 45 call m68k_load_context
46 ret 46 ret
47
48 .global m68k_trap
49 m68k_trap:
50 push %rdi
51 push %rcx
52 /* swap USP and SSP if not already in supervisor mode */
53 bt $5, 5(%rsi)
54 jc already_supervisor_trap
55 mov 72(%rsi), %edi
56 mov %r15d, 72(%rsi)
57 mov %edi, %r15d
58 already_supervisor_trap:
59 /* save PC */
60 sub $4, %r15d
61 mov %r15d, %edi
62 pop %rcx
63 call m68k_write_long_lowfirst
64 /* save status register on stack */
65 sub $2, %r15d
66 mov %r15d, %edi
67 call get_sr
68 call m68k_write_word
69 /* set supervisor bit */
70 or $0x20, 5(%rsi)
71 /* calculate interrupt vector address */
72 pop %rcx
73 shl $2, %ecx
74 call m68k_read_long_scratch1
75 call m68k_native_addr_and_sync
76 add $18, %eax
77 jmp *%rcx
78 47
79 invalid_msg: 48 invalid_msg:
80 .asciz "Invalid instruction at %X\n" 49 .asciz "Invalid instruction at %X\n"
81 50
82 .global m68k_invalid 51 .global m68k_invalid
143 mov $1, %ch 112 mov $1, %ch
144 no_adjust_hs: 113 no_adjust_hs:
145 114
146 mov %rdi, %rax 115 mov %rdi, %rax
147 ret 116 ret
148
149 int_dbg_msg:
150 .asciz "Executing Interrupt!"
151 print_int_dbg:
152 call m68k_save_context
153 push %rsi
154 lea int_dbg_msg(%rip), %rdi
155 call puts
156 pop %rsi
157 call m68k_load_context
158 ret
159 117
160 .global get_sr 118 .global get_sr
161 get_sr: 119 get_sr:
162 mov 5(%rsi), %cl 120 mov 5(%rsi), %cl
163 shl $8, %cx 121 shl $8, %cx
208 and $1, %bl 166 and $1, %bl
209 shr $1, %cl 167 shr $1, %cl
210 and $1, %cl 168 and $1, %cl
211 mov %cl, (%rsi) 169 mov %cl, (%rsi)
212 ret 170 ret
213
214 do_vdp_port_write:
215 call m68k_save_context
216 mov %rcx, %rdx
217 call vdp_port_write
218 mov %rax, %rsi
219 call m68k_load_context
220 ret
221
222 do_vdp_port_read:
223 mov %ecx, %edi
224 call m68k_save_context
225 push %rsi
226 call vdp_port_read
227 pop %rsi
228 mov %ax, %cx
229 call m68k_load_context
230 ret
231
232 do_io_write:
233 call m68k_save_context
234 and $0x1FFFF, %edi
235 mov %ecx, %edx
236 call io_write
237 mov %rax, %rsi
238 call m68k_load_context
239 ret
240 do_io_read:
241 mov %ecx, %edi
242 and $0x1FFFF, %edi
243 call m68k_save_context
244 push %rsi
245 call io_read
246 pop %rsi
247 mov %al, %cl
248 call m68k_load_context
249 ret
250
251 do_io_write_w:
252 call m68k_save_context
253 and $0x1FFFF, %edi
254 mov %ecx, %edx
255 call io_write_w
256 mov %rax, %rsi
257 call m68k_load_context
258 ret
259 do_io_read_w:
260 mov %ecx, %edi
261 and $0x1FFFF, %edi
262 call m68k_save_context
263 push %rsi
264 call io_read_w
265 pop %rsi
266 mov %ax, %cx
267 call m68k_load_context
268 ret
269
270 bad_access_msg:
271 .asciz "Program tried to access illegal 68K address %X\n"
272
273 .global m68k_write_word
274 .global try_fifo_write
275 m68k_write_word:
276 call inccycles
277 and $0xFFFFFF, %rdi
278 cmp $0x400000, %edi
279 jbe cart_w
280 cmp $0xE00000, %edi
281 jae workram_w
282 cmp $0xC00000, %edi
283 jae vdp_psg_w
284 cmp $0xA00000, %edi
285 jb not_io_w
286 cmp $0xA12000, %edi
287 jae not_io_w
288 jmp do_io_write_w
289 not_io_w:
290 ret
291 workram_w:
292 and $0xFFFF, %edi
293 mov %cx, (%r9, %rdi)
294 mov %edi, %ecx
295 shr $11, %ecx
296 bt %ecx, 160(%rsi)
297 jnc not_code
298 call m68k_save_context
299 call m68k_handle_code_write
300 mov %rax, %rsi
301 call m68k_load_context
302 not_code:
303 ret
304 cart_w:
305 mov %cx, (%r8, %rdi)
306 ret
307 vdp_psg_w:
308 test $0x2700E0, %edi
309 jnz crash
310 and $0x1F, %edi
311 cmp $4, %edi
312 jb try_fifo_write
313 jmp do_vdp_port_write
314 try_fifo_write:
315 push %rdx
316 push %rbx
317 /* fetch VDP context pointer from 68K context */
318 mov 128(%rsi), %rdx
319 /* check DMA flag */
320 bt $6, 19(%rdx)
321 jc fifo_fallback
322 /* get fifo_cur and compare it to fifo_end */
323 mov (%rdx), %rbx
324 cmp %rbx, 8(%rdx)
325 /* bail out if fifo is full */
326 je fifo_fallback
327 /* populate FIFO entry */
328 mov %cx, 6(%rbx) /* value */
329 mov 16(%rdx), %cx
330 mov %cx, 4(%rbx) /* address */
331 mov 18(%rdx), %cl
332 mov %cl, 8(%rbx) /* cd */
333 movb $0, 9(%rbx) /* partial */
334 mov %eax, %ecx
335 shl $3, %ecx /* multiply by 68K cycle by 7 to get MCLK cycle */
336 sub %eax, %ecx
337 mov %ecx, (%rbx) /* cycle */
338 /* update fifo_cur and store back in 68K context */
339 add $12, %rbx
340 mov %rbx, (%rdx)
341 /* update address register */
342 movzbw 35(%rdx), %bx
343 add %bx, 16(%rdx)
344 /* clear pending flag */
345 andb $0xEF, 19(%rdx)
346 pop %rbx
347 pop %rdx
348 ret
349 fifo_fallback:
350 pop %rbx
351 pop %rdx
352 jmp do_vdp_port_write
353 crash:
354 mov %edi, %esi
355 lea bad_access_msg(%rip), %rdi
356 xor %rax, %rax
357 call printf
358 mov $1, %rdi
359 call exit
360
361 .global m68k_write_byte
362 m68k_write_byte:
363 call inccycles
364 and $0xFFFFFF, %rdi
365 cmp $0x400000, %edi
366 jbe cart_wb
367 cmp $0xE00000, %edi
368 jae workram_wb
369 cmp $0xC00000, %edi
370 jae vdp_psg_wb
371 cmp $0xA00000, %edi
372 jb not_io_wb
373 cmp $0xA12000, %edi
374 jae not_io_wb
375 jmp do_io_write
376 not_io_wb:
377 ret
378 workram_wb:
379 /* deal with byte swapping */
380 xor $1, %edi
381 and $0xFFFF, %rdi
382 mov %cl, (%r9, %rdi)
383 mov %edi, %ecx
384 shr $11, %ecx
385 bt %ecx, 160(%rsi)
386 jnc not_code_b
387 xor $1, %edi
388 call m68k_save_context
389 call m68k_handle_code_write
390 mov %rax, %rsi
391 call m68k_load_context
392 not_code_b:
393 ret
394 cart_wb:
395 /* deal with byte swapping */
396 xor $1, %edi
397 mov %cl, (%r8, %rdi)
398 ret
399 vdp_psg_wb:
400 push %rdx
401 mov %cl, %dl
402 and $0xFF, %cx
403 shl $8, %dx
404 or %dx, %cx
405 pop %rdx
406 jmp vdp_psg_w
407
408 .global m68k_write_long_lowfirst
409 m68k_write_long_lowfirst:
410 push %rdi
411 push %rcx
412 add $2, %edi
413 call m68k_write_word
414 pop %rcx
415 pop %rdi
416 shr $16, %ecx
417 jmp m68k_write_word
418
419 .global m68k_write_long_highfirst
420 m68k_write_long_highfirst:
421 push %rdi
422 push %rcx
423 shr $16, %ecx
424 call m68k_write_word
425 pop %rcx
426 pop %rdi
427 add $2, %rdi
428 jmp m68k_write_word
429
430 inccycles:
431 cmp %ebp, %eax
432 jnb do_limit
433 add $4, %eax
434 ret
435 do_limit:
436 call handle_cycle_limit
437 add $4, %eax
438 ret
439
440 .global m68k_read_word_scratch1
441 m68k_read_word_scratch1:
442 call inccycles
443 and $0xFFFFFF, %rcx
444 cmp $0x400000, %ecx
445 jbe cart
446 cmp $0xE00000, %ecx
447 jae workram
448 cmp $0xC00000, %ecx
449 jae vdp_psg
450 cmp $0xA00000, %ecx
451 jb not_io
452 cmp $0xA12000, %ecx
453 jae not_io
454 call do_io_read_w
455 ret
456 not_io:
457 xor %cx, %cx
458 dec %cx
459 ret
460 workram:
461 and $0xFFFF, %rcx
462 mov (%r9, %rcx), %cx
463 ret
464 vdp_psg:
465 test $0x2700E0, %ecx
466 jnz crash
467 and $0x1F, %ecx
468 jmp do_vdp_port_read
469 cart:
470 mov (%r8, %rcx), %cx
471 ret
472
473 .global m68k_read_long_scratch1
474 m68k_read_long_scratch1:
475 push %rcx
476 call m68k_read_word_scratch1
477 mov %cx, %di
478 pop %rcx
479 add $2, %ecx
480 push %rdi
481 call m68k_read_word_scratch1
482 pop %rdi
483 and $0xFFFF, %ecx
484 shl $16, %edi
485 or %edi, %ecx
486 ret
487
488 .global m68k_read_byte_scratch1
489 m68k_read_byte_scratch1:
490 call inccycles
491 and $0xFFFFFF, %rcx
492 cmp $0x400000, %ecx
493 jbe cart_b
494 cmp $0xE00000, %ecx
495 jae workram_b
496 cmp $0xC00000, %ecx
497 jae vdp_psg_b
498 cmp $0xA00000, %ecx
499 jb not_io_b
500 cmp $0xA12000, %ecx
501 jae not_io_b
502 jmp do_io_read
503 not_io_b:
504 xor %cl, %cl
505 dec %cl
506 ret
507 vdp_psg_b:
508 test $0x2700E0, %ecx
509 jnz crash
510 and $0x1F, %ecx
511 bt $0, %ecx
512 jnc vdp_swap
513 jmp do_vdp_port_read
514 vdp_swap:
515 call do_vdp_port_read
516 shr $8, %cx
517 ret
518 workram_b:
519 /* deal with byte swapping */
520 xor $1, %ecx
521 and $0xFFFF, %rcx
522 mov (%r9, %rcx), %cl
523 ret
524 cart_b:
525 /* deal with byte swapping */
526 xor $1, %ecx
527 mov (%r8, %rcx), %cl
528 ret
529 171
530 .global m68k_modified_ret_addr 172 .global m68k_modified_ret_addr
531 m68k_modified_ret_addr: 173 m68k_modified_ret_addr:
532 add $16, %rsp 174 add $16, %rsp
533 call m68k_native_addr 175 call m68k_native_addr
534 jmp *%rcx 176 jmp *%rcx
535 177
536 dyn_addr_msg:
537 .asciz "Program needs dynamically calculated native address\n"
538
539 .global m68k_native_addr_and_sync 178 .global m68k_native_addr_and_sync
540 m68k_native_addr_and_sync: 179 m68k_native_addr_and_sync:
541 call m68k_save_context 180 call m68k_save_context
542 push %rcx 181 push %rcx
543 mov %rsi, %rdi 182 mov %rsi, %rdi