Mercurial > repos > blastem
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 |