summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--m68k_to_x86.c25
-rw-r--r--runtime.S21
-rw-r--r--vdp.h2
3 files changed, 24 insertions, 24 deletions
diff --git a/m68k_to_x86.c b/m68k_to_x86.c
index 2a63ddb..d5d7a50 100644
--- a/m68k_to_x86.c
+++ b/m68k_to_x86.c
@@ -3334,15 +3334,12 @@ uint8_t * translate_m68k(uint8_t * dst, m68kinst * inst, x86_68k_options * opts)
break;
case M68K_RTE:
//TODO: Trap if not in system mode
- dst = mov_rr(dst, opts->aregs[7], SCRATCH1, SZ_D);
- dst = call(dst, (uint8_t *)m68k_read_long_scratch1);
- dst = push_r(dst, SCRATCH1);
- dst = add_ir(dst, 4, opts->aregs[7], SZ_D);
+ //Read saved SR
dst = mov_rr(dst, opts->aregs[7], SCRATCH1, SZ_D);
dst = call(dst, (uint8_t *)m68k_read_word_scratch1);
dst = add_ir(dst, 2, opts->aregs[7], SZ_D);
dst = call(dst, (uint8_t *)set_sr);
- dst = pop_r(dst, SCRATCH1);
+ //Check if we've switched to user mode and swap stack pointers if needed
dst = bt_irdisp8(dst, 5, CONTEXT, offsetof(m68k_context, status), SZ_B);
end_off = dst+1;
dst = jcc(dst, CC_C, dst+2);
@@ -3350,20 +3347,26 @@ uint8_t * translate_m68k(uint8_t * dst, m68kinst * inst, x86_68k_options * opts)
dst = mov_rdisp8r(dst, CONTEXT, offsetof(m68k_context, aregs) + sizeof(uint32_t) * 8, opts->aregs[7], SZ_D);
dst = mov_rrdisp8(dst, SCRATCH2, CONTEXT, offsetof(m68k_context, aregs) + sizeof(uint32_t) * 8, SZ_D);
*end_off = dst - (end_off+1);
+ //Read saved PC
+ dst = mov_rr(dst, opts->aregs[7], SCRATCH1, SZ_D);
+ dst = call(dst, (uint8_t *)m68k_read_long_scratch1);
+ dst = add_ir(dst, 4, opts->aregs[7], SZ_D);
+ //Get native address, sync components, recalculate integer points and jump to returned address
dst = call(dst, (uint8_t *)m68k_native_addr_and_sync);
dst = jmp_r(dst, SCRATCH1);
break;
case M68K_RTR:
- dst = mov_rr(dst, opts->aregs[7], SCRATCH1, SZ_D);
- dst = call(dst, (uint8_t *)m68k_read_long_scratch1);
- dst = push_r(dst, SCRATCH1);
- dst = add_ir(dst, 4, opts->aregs[7], SZ_D);
+ //Read saved CCR
dst = mov_rr(dst, opts->aregs[7], SCRATCH1, SZ_D);
dst = call(dst, (uint8_t *)m68k_read_word_scratch1);
dst = add_ir(dst, 2, opts->aregs[7], SZ_D);
dst = call(dst, (uint8_t *)set_ccr);
- dst = pop_r(dst, SCRATCH1);
- dst = call(dst, (uint8_t *)m68k_native_addr_and_sync);
+ //Read saved PC
+ dst = mov_rr(dst, opts->aregs[7], SCRATCH1, SZ_D);
+ dst = call(dst, (uint8_t *)m68k_read_long_scratch1);
+ dst = add_ir(dst, 4, opts->aregs[7], SZ_D);
+ //Get native address and jump to it
+ dst = call(dst, (uint8_t *)m68k_native_addr);
dst = jmp_r(dst, SCRATCH1);
break;
/*case M68K_SBCD:
diff --git a/runtime.S b/runtime.S
index 7a64cf6..140241f 100644
--- a/runtime.S
+++ b/runtime.S
@@ -17,8 +17,6 @@ skip_sync:
handle_cycle_limit_int:
cmp 88(%rsi), %eax
jb skip_int
- push %rcx
- /* call print_int_dbg */
/* swap USP and SSP if not already in supervisor mode */
bt $5, 5(%rsi)
jc already_supervisor
@@ -26,6 +24,10 @@ handle_cycle_limit_int:
mov %r15d, 72(%rsi)
mov %edi, %r15d
already_supervisor:
+ /* save PC */
+ sub $4, %r15d
+ mov %r15d, %edi
+ call m68k_write_long_lowfirst
/* save status register on stack */
sub $2, %r15d
mov %r15d, %edi
@@ -36,11 +38,6 @@ already_supervisor:
mov 92(%rsi), %cl
or $0x20, %cl
or %cl, 5(%rsi)
- /* save PC */
- sub $4, %r15d
- mov %r15d, %edi
- pop %rcx
- call m68k_write_long_lowfirst
/* calculate interrupt vector address */
mov 92(%rsi), %ecx
shl $2, %ecx
@@ -68,6 +65,11 @@ m68k_trap:
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
@@ -78,11 +80,6 @@ already_supervisor_trap:
mov 92(%rsi), %cl
or $0x20, %cl
or %cl, 5(%rsi)
- /* save PC */
- sub $4, %r15d
- mov %r15d, %edi
- pop %rcx
- call m68k_write_long_lowfirst
/* calculate interrupt vector address */
pop %rcx
shl $2, %ecx
diff --git a/vdp.h b/vdp.h
index 6d6036e..fe5e559 100644
--- a/vdp.h
+++ b/vdp.h
@@ -9,7 +9,7 @@
#define VSRAM_SIZE 40
#define VRAM_SIZE (64*1024)
#define LINEBUF_SIZE 320
-#define FRAMEBUF_ENTRIES 320*224
+#define FRAMEBUF_ENTRIES (320+27)*(240+27) //PAL active display + full border
#define FRAMEBUF_SIZE (FRAMEBUF_ENTRIES*sizeof(uint16_t))
#define MAX_DRAWS 40
#define MAX_DRAWS_H32 32