Mercurial > repos > blastem
diff runtime.S @ 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 | 8e136187c0e0 |
line wrap: on
line diff
--- 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