diff options
author | Mike Pavone <pavone@retrodev.com> | 2013-01-03 22:49:21 -0800 |
---|---|---|
committer | Mike Pavone <pavone@retrodev.com> | 2013-01-03 22:49:21 -0800 |
commit | eae20aa44a669c6a871d89b58b1ae3fe3208c97a (patch) | |
tree | 23a1c1cdefe715f761b5c740cec6368bf8626c9a /runtime.S | |
parent | c245888b71b6cb8eb85af2e1e5caebc792b5c858 (diff) |
Implement TRAP (untested)
Diffstat (limited to 'runtime.S')
-rw-r--r-- | runtime.S | 35 |
1 files changed, 34 insertions, 1 deletions
@@ -57,7 +57,40 @@ skip_int: jnb do_sync ret - .global do_sync + .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 status register on stack */ + sub $2, %r15d + 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) + /* save PC */ + sub $4, %r15d + mov %r15d, %edi + pop %rcx + call m68k_write_long_lowfirst + /* calculate interrupt vector address */ + pop %rcx + shl $2, %ecx + add $0x80, %ecx + call m68k_read_long_scratch1 + call m68k_native_addr_and_sync + add $24, %eax + jmp *%rcx int_dbg_msg: .asciz "Executing Interrupt!" |