summaryrefslogtreecommitdiff
path: root/runtime.S
diff options
context:
space:
mode:
Diffstat (limited to 'runtime.S')
-rw-r--r--runtime.S269
1 files changed, 0 insertions, 269 deletions
diff --git a/runtime.S b/runtime.S
index 36ecfff..5595eb1 100644
--- a/runtime.S
+++ b/runtime.S
@@ -1,57 +1,4 @@
- .global handle_cycle_limit
- .global do_sync
-handle_cycle_limit:
- cmp 84(%rsi), %eax
- jb skip_sync
-do_sync:
- push %rcx
- push %rdi
- call m68k_save_context
- mov %rsi, %rdi
- xor %esi, %esi
- test $8, %esp
- jnz adjust_rsp
- call sync_components
- jmp done_adjust
-adjust_rsp:
- sub $8, %rsp
- call sync_components
- add $8, %rsp
-done_adjust:
- mov %rax, %rsi
- call m68k_load_context
- pop %rdi
- pop %rcx
-skip_sync:
- 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
invalid_msg:
.asciz "Invalid instruction at %X\n"
@@ -65,221 +12,5 @@ m68k_invalid:
mov $1, %rdi
call exit
- .global bcd_add
-bcd_add:
- xchg %rax, %rdi
-
- mov %cl, %ch
- mov %al, %ah
- and $0xF, %ch
- and $0xF, %ah
- and $0xF0, %cl
- and $0xF0, %al
- add %ah, %ch
- cmp $10, %ch
- jb no_adjust
- add $6, %ch
-no_adjust:
- add %ch, %al
- add %al, %cl
- mov $0, %ch
- jc def_adjust
- cmp $0xA0, %cl
- jb no_adjust_h
-def_adjust:
- add $0x60, %cl
- mov $1, %ch
-no_adjust_h:
-
- mov %rdi, %rax
- ret
-
- .global bcd_sub
-bcd_sub:
- xchg %rax, %rdi
-
- mov %cl, %ch
- mov %al, %ah
- and $0xF, %ch
- and $0xF, %ah
- and $0xF0, %cl
- and $0xF0, %al
- sub %ah, %ch
- cmp $10, %ch
- jb no_adjusts
- sub $6, %ch
-no_adjusts:
- add %ch, %cl
- sub %al, %cl
- mov $0, %ch
- jc def_adjusts
- cmp $0xA0, %cl
- jb no_adjust_hs
-def_adjusts:
- sub $0x60, %cl
- mov $1, %ch
-no_adjust_hs:
-
- mov %rdi, %rax
- ret
-
- .global get_sr
-get_sr:
- mov 5(%rsi), %cl
- shl $8, %cx
- mov (%rsi), %cl
- shl $1, %cl
- or %bl, %cl
- shl $1, %cl
- or %dl, %cl
- shl $1, %cl
- or %bh, %cl
- shl $1, %cl
- or %dh, %cl
- ret
-
- .global set_sr
-set_sr:
- mov %cl, %dh
- and $1, %dh
- shr $1, %cl
- mov %cl, %bh
- and $1, %bh
- shr $1, %cl
- mov %cl, %dl
- and $1, %dl
- shr $1, %cl
- mov %cl, %bl
- and $1, %bl
- shr $1, %cl
- and $1, %cl
- mov %cl, (%rsi)
- shr $8, %cx
- mov %cl, 5(%rsi)
- /* call debug_print_sr */
- ret
-
- .global set_ccr
-set_ccr:
- mov %cl, %dh
- and $1, %dh
- shr $1, %cl
- mov %cl, %bh
- and $1, %bh
- shr $1, %cl
- mov %cl, %dl
- and $1, %dl
- shr $1, %cl
- mov %cl, %bl
- and $1, %bl
- shr $1, %cl
- and $1, %cl
- mov %cl, (%rsi)
- ret
-
- .global m68k_modified_ret_addr
-m68k_modified_ret_addr:
- add $16, %rsp
- call m68k_native_addr
- jmp *%rcx
-
- .global m68k_native_addr_and_sync
-m68k_native_addr_and_sync:
- call m68k_save_context
- push %rcx
- mov %rsi, %rdi
- xor %esi, %esi
- test $8, %rsp
- jnz adjust_rsp_na
- call sync_components
- jmp no_adjust_rsp_na
-adjust_rsp_na:
- sub $8, %rsp
- call sync_components
- add $8, %rsp
-no_adjust_rsp_na:
- pop %rsi
- push %rax
- mov %rax, %rdi
- call get_native_address_trans
- mov %rax, %rcx
- pop %rsi
- call m68k_load_context
- ret
-
- .global m68k_native_addr
-m68k_native_addr:
- call m68k_save_context
- push %rsi
- mov %rsi, %rdi
- mov %ecx, %esi
- call get_native_address_trans
- mov %rax, %rcx
- pop %rsi
- call m68k_load_context
- ret
-
- .global m68k_retrans_stub
-m68k_retrans_stub:
- call m68k_save_context
- push %rsi
- call m68k_retranslate_inst
- pop %rsi
- mov %rax, %rcx
- call m68k_load_context
- jmp *%rcx
-
- .global m68k_save_context
-m68k_save_context:
- mov %bl, 1(%rsi) /* N Flag */
- mov %dl, 2(%rsi) /* Z flag */
- mov %bh, 3(%rsi) /* V flag */
- mov %dh, 4(%rsi) /* C flag */
- mov %r10d, 8(%rsi) /* d0 */
- mov %r11d, 12(%rsi) /* d1 */
- mov %r12d, 16(%rsi) /* d2 */
- mov %r8d, 20(%rsi) /* d3 */
- mov %r13d, 40(%rsi) /* a0 */
- mov %r14d, 44(%rsi) /* a1 */
- mov %r9d, 48(%rsi) /* a2 */
- mov %r15d, 68(%rsi) /* a7 */
- mov %eax, 80(%rsi) /* current cycle count */
- ret
-
- .global m68k_load_context
-m68k_load_context:
- mov 1(%rsi), %bl /* N Flag */
- mov 2(%rsi), %dl /* Z flag */
- mov 3(%rsi), %bh /* V flag */
- mov 4(%rsi), %dh /* C flag */
- mov 8(%rsi), %r10d /* d0 */
- mov 12(%rsi), %r11d /* d1 */
- mov 16(%rsi), %r12d /* d2 */
- mov 20(%rsi), %r8d /* d3 */
- mov 40(%rsi), %r13d /* a0 */
- mov 44(%rsi), %r14d /* a1 */
- mov 48(%rsi), %r9d /* a2 */
- mov 68(%rsi), %r15d /* a7 */
- mov 76(%rsi), %ebp /* target cycle count */
- mov 80(%rsi), %eax /* current cycle count */
- ret
-
- .global m68k_start_context
-m68k_start_context:
- push %rbp
- push %r12
- push %r13
- push %r14
- push %r15
-
- call m68k_load_context
- call *%rdi
- call m68k_save_context
- pop %r15
- pop %r14
- pop %r13
- pop %r12
- pop %rbp
- ret