summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--blastem.c3
-rw-r--r--m68k_to_x86.c5
-rw-r--r--runtime.S38
3 files changed, 40 insertions, 6 deletions
diff --git a/blastem.c b/blastem.c
index e8abe63..2a5996f 100644
--- a/blastem.c
+++ b/blastem.c
@@ -180,7 +180,7 @@ void sync_z80(z80_context * z_context, uint32_t mclks)
z_context->current_cycle = mclks / MCLKS_PER_Z80;
}
}
-
+uint32_t frame=0;
m68k_context * sync_components(m68k_context * context, uint32_t address)
{
//TODO: Handle sync targets smaller than a single frame
@@ -197,6 +197,7 @@ m68k_context * sync_components(m68k_context * context, uint32_t address)
if (!headless) {
break_on_sync |= wait_render_frame(v_context);
}
+ frame++;
mclks -= MCLKS_PER_FRAME;
vdp_adjust_cycles(v_context, MCLKS_PER_FRAME);
io_adjust_cycles(&gamepad_1, context->current_cycle, MCLKS_PER_FRAME/MCLKS_PER_68K);
diff --git a/m68k_to_x86.c b/m68k_to_x86.c
index ba158ab..0bf5a6d 100644
--- a/m68k_to_x86.c
+++ b/m68k_to_x86.c
@@ -46,6 +46,7 @@ void do_sync();
void bcd_add();
void bcd_sub();
void m68k_start_context(uint8_t * addr, m68k_context * context);
+void debug_print_sr();
uint8_t * cycles(uint8_t * dst, uint32_t num)
{
@@ -2927,6 +2928,7 @@ 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_B);
dst = mov_rrdisp8(dst, SCRATCH1, CONTEXT, offsetof(m68k_context, aregs) + sizeof(uint32_t) * 8, SZ_B);
}
+ //dst = call(dst, (uint8_t *)debug_print_sr);
if (inst->src.params.immed & 0x700) {
dst = call(dst, (uint8_t *)do_sync);
}
@@ -3224,6 +3226,7 @@ uint8_t * translate_m68k(uint8_t * dst, m68kinst * inst, x86_68k_options * opts)
}
if (inst->op == M68K_ORI_SR) {
dst = xor_irdisp8(dst, inst->src.params.immed >> 8, CONTEXT, offsetof(m68k_context, status), SZ_B);
+ //dst = call(dst, (uint8_t *)debug_print_sr);
if (inst->src.params.immed & 0x700) {
dst = call(dst, (uint8_t *)do_sync);
}
@@ -3284,6 +3287,7 @@ 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, SCRATCH1, CONTEXT, offsetof(m68k_context, aregs) + sizeof(uint32_t) * 8, SZ_D);
}
+ //dst = call(dst, (uint8_t *)debug_print_sr);
dst = call(dst, (uint8_t *)do_sync);
}
dst = cycles(dst, 12);
@@ -3472,6 +3476,7 @@ uint8_t * translate_m68k(uint8_t * dst, m68kinst * inst, x86_68k_options * opts)
}
if (inst->op == M68K_ORI_SR) {
dst = or_irdisp8(dst, inst->src.params.immed >> 8, CONTEXT, offsetof(m68k_context, status), SZ_B);
+ //dst = call(dst, (uint8_t *)debug_print_sr);
if (inst->src.params.immed & 0x700) {
dst = call(dst, (uint8_t *)do_sync);
}
diff --git a/runtime.S b/runtime.S
index a1115e3..c07b003 100644
--- a/runtime.S
+++ b/runtime.S
@@ -45,6 +45,9 @@ already_supervisor:
mov %cx, 6(%rsi) /* interrupt acknowlege */
shl $2, %ecx
add $0x60, %ecx
+ /* push %rcx
+ call debug_print_sr_int
+ pop %rcx */
call m68k_read_long_scratch1
call m68k_native_addr_and_sync
add $24, %eax
@@ -64,6 +67,33 @@ skip_int:
skip_sync_int:
ret
+sr_msg_int:
+ .asciz "SR set to $%X due to interrupt\n"
+debug_print_sr_int:
+ call m68k_save_context
+ push %rsi
+ lea sr_msg_int(%rip), %rdi
+ movzxb 5(%rsi), %rsi
+ xor %rax, %rax
+ call printf
+ pop %rsi
+ call m68k_load_context
+ ret
+
+sr_msg:
+ .asciz "SR set to $%X\n"
+ .global debug_print_sr
+debug_print_sr:
+ call m68k_save_context
+ push %rsi
+ lea sr_msg(%rip), %rdi
+ movzxb 5(%rsi), %rsi
+ xor %rax, %rax
+ call printf
+ pop %rsi
+ call m68k_load_context
+ ret
+
.global m68k_trap
m68k_trap:
push %rdi
@@ -85,11 +115,8 @@ already_supervisor_trap:
mov %r15d, %edi
call get_sr
call m68k_write_word
- /* update status register */
- andb $0xF8, 5(%rsi)
- mov 92(%rsi), %cl
- or $0x20, %cl
- or %cl, 5(%rsi)
+ /* set supervisor bit */
+ or $0x20, 5(%rsi)
/* calculate interrupt vector address */
pop %rcx
shl $2, %ecx
@@ -212,6 +239,7 @@ set_sr:
mov %cl, (%rsi)
shr $8, %cx
mov %cl, 5(%rsi)
+ /* call debug_print_sr */
ret
.global set_ccr