# HG changeset patch # User Mike Pavone # Date 1369123804 25200 # Node ID 3923dbc2dcc4c9aab7693849dae55d2d6f12cabc # Parent b24556b45d1e8cbbd24a3f74dd14e8b8eb06125e 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 diff -r b24556b45d1e -r 3923dbc2dcc4 m68k_to_x86.c --- a/m68k_to_x86.c Tue May 21 00:56:56 2013 -0700 +++ b/m68k_to_x86.c Tue May 21 01:10:04 2013 -0700 @@ -31,7 +31,6 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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 -r b24556b45d1e -r 3923dbc2dcc4 m68k_to_x86.h --- a/m68k_to_x86.h Tue May 21 00:56:56 2013 -0700 +++ b/m68k_to_x86.h Tue May 21 01:10:04 2013 -0700 @@ -31,6 +31,7 @@ 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 -r b24556b45d1e -r 3923dbc2dcc4 runtime.S --- a/runtime.S Tue May 21 00:56:56 2013 -0700 +++ b/runtime.S Tue May 21 01:10:04 2013 -0700 @@ -44,37 +44,6 @@ 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 @@ 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 @@ 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 @@ 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