Mercurial > repos > blastem
diff runtime.S @ 18:3e7bfde7606e
M68K to x86 translation works for a limited subset of instructions and addressing modes
author | Mike Pavone <pavone@retrodev.com> |
---|---|
date | Tue, 04 Dec 2012 19:13:12 -0800 |
parents | de0085d4ea40 |
children | 44e661913a51 |
line wrap: on
line diff
--- a/runtime.S Tue Nov 27 22:54:38 2012 -0800 +++ b/runtime.S Tue Dec 04 19:13:12 2012 -0800 @@ -1,5 +1,162 @@ - .global _handle_cycle_limit -_handle_cycle_limit: - retn + .global handle_cycle_limit +handle_cycle_limit: + ret + + .global m68k_write_word +m68k_write_word: + and $0xFFFFFF, %rdi + cmp $0x400000, %edi + jle cart_w + cmp $0xE00000, %edi + jge workram_w + jmp inccycles +workram_w: + and $0xFFFF, %rdi + mov %cx, (%r9, %rdi) + jmp inccycles +cart_w: + mov %cx, (%r8, %rdi) + jmp inccycles + + .global m68k_write_byte +m68k_write_byte: + and $0xFFFFFF, %rdi + /* deal with byte swapping */ + xor $1, %edi + cmp $0x400000, %edi + jle cart_wb + cmp $0xE00000, %edi + jge workram_wb + jmp inccycles +workram_wb: + and $0xFFFF, %rdi + mov %cl, (%r9, %rdi) + jmp inccycles +cart_wb: + mov %cl, (%r8, %rdi) + jmp inccycles + + .global m68k_write_long_lowfirst +m68k_write_long_lowfirst: + push %rdi + add $2, %edi + call m68k_write_word + shr $16, %ecx + pop %rdi + 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 + .global m68k_read_word_scratch1 +m68k_read_word_scratch1: + and $0xFFFFFF, %rcx + cmp $0x400000, %ecx + jle cart + cmp $0xE00000, %ecx + jge workram + xor %cx, %cx + jmp inccycles +workram: + and $0xFFFF, %rcx + mov (%r9, %rcx), %cx + jmp inccycles +cart: + mov (%r8, %rcx), %cx +inccycles: + add $4, %rax + cmp %rbp, %rax + jge sync + ret +sync: + 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 + call m68k_read_word_scratch1 + and $0xFFFF, %ecx + shl $16, %edi + or %edi, %ecx + ret + + .global m68k_read_byte_scratch1 +m68k_read_byte_scratch1: + and $0xFFFFFF, %rcx + /* deal with byte swapping */ + xor $1, %ecx + cmp $0x400000, %ecx + jle cart_b + cmp $0xE00000, %ecx + jge workram_b + xor %cl, %cl + jmp inccycles +workram_b: + and $0xFFFF, %rcx + mov (%r9, %rcx), %cl + jmp inccycles +cart_b: + mov (%r8, %rcx), %cl + jmp inccycles + +ret_addr_msg: + .asciz "Program modified return address on stack: found %X, expected %X\n" + + .global m68k_modified_ret_addr +m68k_modified_ret_addr: + lea ret_addr_msg(%rip), %rdi + mov %rcx, %rsi + mov 8(%rsp), %rdx + call printf + mov $1, %rdi + call exit + + .global m68k_save_context +m68k_save_context: + mov %bl, 1(%rsi) /* N Flag */ + mov %bh, 2(%rsi) /* V flag */ + mov %dl, 3(%rsi) /* Z flag */ + mov %dh, 4(%rsi) /* C flag */ + mov %r10d, 8(%rsi) /* d0 */ + mov %r11d, 12(%rsi) /* d1 */ + mov %r12d, 16(%rsi) /* d2 */ + mov %r13d, 40(%rsi) /* a0 */ + mov %r14d, 44(%rsi) /* a1 */ + mov %r15d, 68(%rsi) /* a7 */ + ret + + .global m68k_load_context +m68k_load_context: + mov 1(%rsi), %bl /* N Flag */ + mov 2(%rsi), %bh /* V flag */ + mov 3(%rsi), %dl /* Z flag */ + mov 4(%rsi), %dh /* C flag */ + mov 8(%rsi), %r10d /* d0 */ + mov 12(%rsi), %r11d /* d1 */ + mov 16(%rsi), %r12d /* d2 */ + mov 40(%rsi), %r13d /* a0 */ + mov 44(%rsi), %r14d /* a1 */ + mov 68(%rsi), %r15d /* a7 */ + mov 72(%rsi), %ebp /* target cycle count */ + mov 76(%rsi), %eax /* current cycle count */ + mov 80(%rsi), %r8d /* cartridge address */ + mov 88(%rsi), %r9d /* work ram address */ + ret + + .global m68k_start_context +m68k_start_context: + call m68k_load_context + jmp *%rdi