summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Pavone <pavone@retrodev.com>2013-05-21 01:10:04 -0700
committerMike Pavone <pavone@retrodev.com>2013-05-21 01:10:04 -0700
commit60a4f8174b28688a59932e7a083a38e906d243db (patch)
tree1473d252e0f9a902171f46c630325151d9d8d4d7
parentea1973ff4f66831d543969f0cb33ccd06eaddba5 (diff)
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
-rw-r--r--m68k_to_x86.c38
-rw-r--r--m68k_to_x86.h1
-rw-r--r--runtime.S361
3 files changed, 34 insertions, 366 deletions
diff --git a/m68k_to_x86.c b/m68k_to_x86.c
index 8b57091..5781fef 100644
--- a/m68k_to_x86.c
+++ b/m68k_to_x86.c
@@ -31,7 +31,6 @@ void m68k_load_context();
void m68k_modified_ret_addr();
void m68k_native_addr();
void m68k_native_addr_and_sync();
-void m68k_trap();
void m68k_invalid();
void m68k_retrans_stub();
void set_sr();
@@ -3090,7 +3089,7 @@ uint8_t * translate_m68k(uint8_t * dst, m68kinst * inst, x86_68k_options * opts)
dst = mov_ir(dst, 1, FLAG_N, SZ_B);
dst = mov_ir(dst, VECTOR_CHK, SCRATCH2, SZ_D);
dst = mov_ir(dst, inst->address+isize, SCRATCH1, SZ_D);
- dst = jmp(dst, (uint8_t *)m68k_trap);
+ dst = jmp(dst, opts->trap);
*passed = dst - (passed+1);
if (dst_op.mode == MODE_REG_DIRECT) {
if (src_op.mode == MODE_REG_DIRECT) {
@@ -3112,7 +3111,7 @@ uint8_t * translate_m68k(uint8_t * dst, m68kinst * inst, x86_68k_options * opts)
dst = mov_ir(dst, 0, FLAG_N, SZ_B);
dst = mov_ir(dst, VECTOR_CHK, SCRATCH2, SZ_D);
dst = mov_ir(dst, inst->address+isize, SCRATCH1, SZ_D);
- dst = jmp(dst, (uint8_t *)m68k_trap);
+ dst = jmp(dst, opts->trap);
*passed = dst - (passed+1);
dst = cycles(dst, 4);
break;
@@ -3152,7 +3151,7 @@ uint8_t * translate_m68k(uint8_t * dst, m68kinst * inst, x86_68k_options * opts)
dst = pop_r(dst, RDX);
dst = mov_ir(dst, VECTOR_INT_DIV_ZERO, SCRATCH2, SZ_D);
dst = mov_ir(dst, inst->address+2, SCRATCH1, SZ_D);
- dst = jmp(dst, (uint8_t *)m68k_trap);
+ dst = jmp(dst, opts->trap);
*not_zero = dst - (not_zero+1);
if (inst->op == M68K_DIVS) {
dst = cdq(dst);
@@ -3853,7 +3852,7 @@ uint8_t * translate_m68k(uint8_t * dst, m68kinst * inst, x86_68k_options * opts)
case M68K_TRAP:
dst = mov_ir(dst, src_op.disp + VECTOR_TRAP_0, SCRATCH2, SZ_D);
dst = mov_ir(dst, inst->address+2, SCRATCH1, SZ_D);
- dst = jmp(dst, (uint8_t *)m68k_trap);
+ dst = jmp(dst, opts->trap);
break;
//case M68K_TRAPV:
case M68K_TST:
@@ -4521,6 +4520,35 @@ void init_x86_68k_opts(x86_68k_options * opts, memmap_chunk * memmap, uint32_t n
dst = pop_r(dst, SCRATCH2);
dst = jmp_r(dst, SCRATCH1);
+ opts->trap = dst;
+ dst = push_r(dst, SCRATCH2);
+ //swap USP and SSP if not already in supervisor mode
+ dst = bt_irdisp8(dst, 5, CONTEXT, offsetof(m68k_context, status), SZ_B);
+ already_supervisor = dst+1;
+ dst = jcc(dst, CC_C, dst+2);
+ dst = mov_rdisp8r(dst, CONTEXT, offsetof(m68k_context, aregs) + sizeof(uint32_t) * 8, SCRATCH2, SZ_D);
+ dst = mov_rrdisp8(dst, opts->aregs[7], CONTEXT, offsetof(m68k_context, aregs) + sizeof(uint32_t) * 8, SZ_D);
+ dst = mov_rr(dst, SCRATCH2, opts->aregs[7], SZ_D);
+ *already_supervisor = dst - (already_supervisor+1);
+ //save PC
+ dst = sub_ir(dst, 4, opts->aregs[7], SZ_D);
+ dst = mov_rr(dst, opts->aregs[7], SCRATCH2, SZ_D);
+ dst = call(dst, opts->write_32_lowfirst);
+ //save status register
+ dst = sub_ir(dst, 2, opts->aregs[7], SZ_D);
+ dst = call(dst, (uint8_t *)get_sr);
+ dst = mov_rr(dst, opts->aregs[7], SCRATCH2, SZ_D);
+ dst = call(dst, opts->write_16);
+ //set supervisor bit
+ dst = or_irdisp8(dst, 0x20, CONTEXT, offsetof(m68k_context, status), SZ_B);
+ //calculate vector address
+ dst = pop_r(dst, SCRATCH1);
+ dst = shl_ir(dst, 2, SCRATCH1, SZ_D);
+ dst = call(dst, opts->read_32);
+ dst = call(dst, (uint8_t *)m68k_native_addr_and_sync);
+ dst = cycles(dst, 18);
+ dst = jmp_r(dst, SCRATCH1);
+
opts->cur_code = dst;
}
diff --git a/m68k_to_x86.h b/m68k_to_x86.h
index 7d52f03..c2408f4 100644
--- a/m68k_to_x86.h
+++ b/m68k_to_x86.h
@@ -31,6 +31,7 @@ typedef struct {
uint8_t *write_32_lowfirst;
uint8_t *write_32_highfirst;
uint8_t *handle_cycle_limit_int;
+ uint8_t *trap;
} x86_68k_options;
typedef struct {
diff --git a/runtime.S b/runtime.S
index 6c1033d..6c8496b 100644
--- a/runtime.S
+++ b/runtime.S
@@ -44,37 +44,6 @@ debug_print_sr:
pop %rsi
call m68k_load_context
ret
-
- .global m68k_trap
-m68k_trap:
- push %rdi
- push %rcx
- /* swap USP and SSP if not already in supervisor mode */
- bt $5, 5(%rsi)
- jc already_supervisor_trap
- mov 72(%rsi), %edi
- mov %r15d, 72(%rsi)
- mov %edi, %r15d
-already_supervisor_trap:
- /* save PC */
- sub $4, %r15d
- mov %r15d, %edi
- pop %rcx
- call m68k_write_long_lowfirst
- /* save status register on stack */
- sub $2, %r15d
- mov %r15d, %edi
- call get_sr
- call m68k_write_word
- /* set supervisor bit */
- or $0x20, 5(%rsi)
- /* calculate interrupt vector address */
- pop %rcx
- shl $2, %ecx
- call m68k_read_long_scratch1
- call m68k_native_addr_and_sync
- add $18, %eax
- jmp *%rcx
invalid_msg:
.asciz "Invalid instruction at %X\n"
@@ -145,17 +114,6 @@ no_adjust_hs:
mov %rdi, %rax
ret
-
-int_dbg_msg:
- .asciz "Executing Interrupt!"
-print_int_dbg:
- call m68k_save_context
- push %rsi
- lea int_dbg_msg(%rip), %rdi
- call puts
- pop %rsi
- call m68k_load_context
- ret
.global get_sr
get_sr:
@@ -210,322 +168,6 @@ set_ccr:
and $1, %cl
mov %cl, (%rsi)
ret
-
-do_vdp_port_write:
- call m68k_save_context
- mov %rcx, %rdx
- call vdp_port_write
- mov %rax, %rsi
- call m68k_load_context
- ret
-
-do_vdp_port_read:
- mov %ecx, %edi
- call m68k_save_context
- push %rsi
- call vdp_port_read
- pop %rsi
- mov %ax, %cx
- call m68k_load_context
- ret
-
-do_io_write:
- call m68k_save_context
- and $0x1FFFF, %edi
- mov %ecx, %edx
- call io_write
- mov %rax, %rsi
- call m68k_load_context
- ret
-do_io_read:
- mov %ecx, %edi
- and $0x1FFFF, %edi
- call m68k_save_context
- push %rsi
- call io_read
- pop %rsi
- mov %al, %cl
- call m68k_load_context
- ret
-
-do_io_write_w:
- call m68k_save_context
- and $0x1FFFF, %edi
- mov %ecx, %edx
- call io_write_w
- mov %rax, %rsi
- call m68k_load_context
- ret
-do_io_read_w:
- mov %ecx, %edi
- and $0x1FFFF, %edi
- call m68k_save_context
- push %rsi
- call io_read_w
- pop %rsi
- mov %ax, %cx
- call m68k_load_context
- ret
-
-bad_access_msg:
- .asciz "Program tried to access illegal 68K address %X\n"
-
- .global m68k_write_word
- .global try_fifo_write
-m68k_write_word:
- call inccycles
- and $0xFFFFFF, %rdi
- cmp $0x400000, %edi
- jbe cart_w
- cmp $0xE00000, %edi
- jae workram_w
- cmp $0xC00000, %edi
- jae vdp_psg_w
- cmp $0xA00000, %edi
- jb not_io_w
- cmp $0xA12000, %edi
- jae not_io_w
- jmp do_io_write_w
-not_io_w:
- ret
-workram_w:
- and $0xFFFF, %edi
- mov %cx, (%r9, %rdi)
- mov %edi, %ecx
- shr $11, %ecx
- bt %ecx, 160(%rsi)
- jnc not_code
- call m68k_save_context
- call m68k_handle_code_write
- mov %rax, %rsi
- call m68k_load_context
-not_code:
- ret
-cart_w:
- mov %cx, (%r8, %rdi)
- ret
-vdp_psg_w:
- test $0x2700E0, %edi
- jnz crash
- and $0x1F, %edi
- cmp $4, %edi
- jb try_fifo_write
- jmp do_vdp_port_write
-try_fifo_write:
- push %rdx
- push %rbx
- /* fetch VDP context pointer from 68K context */
- mov 128(%rsi), %rdx
- /* check DMA flag */
- bt $6, 19(%rdx)
- jc fifo_fallback
- /* get fifo_cur and compare it to fifo_end */
- mov (%rdx), %rbx
- cmp %rbx, 8(%rdx)
- /* bail out if fifo is full */
- je fifo_fallback
- /* populate FIFO entry */
- mov %cx, 6(%rbx) /* value */
- mov 16(%rdx), %cx
- mov %cx, 4(%rbx) /* address */
- mov 18(%rdx), %cl
- mov %cl, 8(%rbx) /* cd */
- movb $0, 9(%rbx) /* partial */
- mov %eax, %ecx
- shl $3, %ecx /* multiply by 68K cycle by 7 to get MCLK cycle */
- sub %eax, %ecx
- mov %ecx, (%rbx) /* cycle */
- /* update fifo_cur and store back in 68K context */
- add $12, %rbx
- mov %rbx, (%rdx)
- /* update address register */
- movzbw 35(%rdx), %bx
- add %bx, 16(%rdx)
- /* clear pending flag */
- andb $0xEF, 19(%rdx)
- pop %rbx
- pop %rdx
- ret
-fifo_fallback:
- pop %rbx
- pop %rdx
- jmp do_vdp_port_write
-crash:
- mov %edi, %esi
- lea bad_access_msg(%rip), %rdi
- xor %rax, %rax
- call printf
- mov $1, %rdi
- call exit
-
- .global m68k_write_byte
-m68k_write_byte:
- call inccycles
- and $0xFFFFFF, %rdi
- cmp $0x400000, %edi
- jbe cart_wb
- cmp $0xE00000, %edi
- jae workram_wb
- cmp $0xC00000, %edi
- jae vdp_psg_wb
- cmp $0xA00000, %edi
- jb not_io_wb
- cmp $0xA12000, %edi
- jae not_io_wb
- jmp do_io_write
-not_io_wb:
- ret
-workram_wb:
- /* deal with byte swapping */
- xor $1, %edi
- and $0xFFFF, %rdi
- mov %cl, (%r9, %rdi)
- mov %edi, %ecx
- shr $11, %ecx
- bt %ecx, 160(%rsi)
- jnc not_code_b
- xor $1, %edi
- call m68k_save_context
- call m68k_handle_code_write
- mov %rax, %rsi
- call m68k_load_context
-not_code_b:
- ret
-cart_wb:
- /* deal with byte swapping */
- xor $1, %edi
- mov %cl, (%r8, %rdi)
- ret
-vdp_psg_wb:
- push %rdx
- mov %cl, %dl
- and $0xFF, %cx
- shl $8, %dx
- or %dx, %cx
- pop %rdx
- jmp vdp_psg_w
-
- .global m68k_write_long_lowfirst
-m68k_write_long_lowfirst:
- push %rdi
- push %rcx
- add $2, %edi
- call m68k_write_word
- pop %rcx
- pop %rdi
- shr $16, %ecx
- jmp m68k_write_word
-
- .global m68k_write_long_highfirst
-m68k_write_long_highfirst:
- push %rdi
- push %rcx
- shr $16, %ecx
- call m68k_write_word
- pop %rcx
- pop %rdi
- add $2, %rdi
- jmp m68k_write_word
-
-inccycles:
- cmp %ebp, %eax
- jnb do_limit
- add $4, %eax
- ret
-do_limit:
- call handle_cycle_limit
- add $4, %eax
- ret
-
- .global m68k_read_word_scratch1
-m68k_read_word_scratch1:
- call inccycles
- and $0xFFFFFF, %rcx
- cmp $0x400000, %ecx
- jbe cart
- cmp $0xE00000, %ecx
- jae workram
- cmp $0xC00000, %ecx
- jae vdp_psg
- cmp $0xA00000, %ecx
- jb not_io
- cmp $0xA12000, %ecx
- jae not_io
- call do_io_read_w
- ret
-not_io:
- xor %cx, %cx
- dec %cx
- ret
-workram:
- and $0xFFFF, %rcx
- mov (%r9, %rcx), %cx
- ret
-vdp_psg:
- test $0x2700E0, %ecx
- jnz crash
- and $0x1F, %ecx
- jmp do_vdp_port_read
-cart:
- mov (%r8, %rcx), %cx
- ret
-
- .global m68k_read_long_scratch1
-m68k_read_long_scratch1:
- push %rcx
- call m68k_read_word_scratch1
- mov %cx, %di
- pop %rcx
- add $2, %ecx
- push %rdi
- call m68k_read_word_scratch1
- pop %rdi
- and $0xFFFF, %ecx
- shl $16, %edi
- or %edi, %ecx
- ret
-
- .global m68k_read_byte_scratch1
-m68k_read_byte_scratch1:
- call inccycles
- and $0xFFFFFF, %rcx
- cmp $0x400000, %ecx
- jbe cart_b
- cmp $0xE00000, %ecx
- jae workram_b
- cmp $0xC00000, %ecx
- jae vdp_psg_b
- cmp $0xA00000, %ecx
- jb not_io_b
- cmp $0xA12000, %ecx
- jae not_io_b
- jmp do_io_read
-not_io_b:
- xor %cl, %cl
- dec %cl
- ret
-vdp_psg_b:
- test $0x2700E0, %ecx
- jnz crash
- and $0x1F, %ecx
- bt $0, %ecx
- jnc vdp_swap
- jmp do_vdp_port_read
-vdp_swap:
- call do_vdp_port_read
- shr $8, %cx
- ret
-workram_b:
- /* deal with byte swapping */
- xor $1, %ecx
- and $0xFFFF, %rcx
- mov (%r9, %rcx), %cl
- ret
-cart_b:
- /* deal with byte swapping */
- xor $1, %ecx
- mov (%r8, %rcx), %cl
- ret
.global m68k_modified_ret_addr
m68k_modified_ret_addr:
@@ -533,9 +175,6 @@ m68k_modified_ret_addr:
call m68k_native_addr
jmp *%rcx
-dyn_addr_msg:
- .asciz "Program needs dynamically calculated native address\n"
-
.global m68k_native_addr_and_sync
m68k_native_addr_and_sync:
call m68k_save_context