changeset 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 ad493d38964e
files m68k_to_x86.c m68k_to_x86.h runtime.S
diffstat 3 files changed, 34 insertions(+), 366 deletions(-) [+]
line wrap: on
line diff
--- 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;
 }
 
--- 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 {
--- 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