summaryrefslogtreecommitdiff
path: root/runtime.S
diff options
context:
space:
mode:
Diffstat (limited to 'runtime.S')
-rw-r--r--runtime.S361
1 files changed, 0 insertions, 361 deletions
diff --git a/runtime.S b/runtime.S
index 6c1033d..6c8496b 100644
--- a/runtime.S
+++ b/runtime.S
@@ -44,37 +44,6 @@ debug_print_sr:
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 @@ no_adjust_hs:
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 @@ set_ccr:
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 @@ m68k_modified_ret_addr:
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