comparison runtime.S @ 152:79958b95526f

Implement TRAP (untested)
author Mike Pavone <pavone@retrodev.com>
date Thu, 03 Jan 2013 22:49:21 -0800
parents 3e68e517cc01
children 42c031184e8a
comparison
equal deleted inserted replaced
151:6b593ea0ed90 152:79958b95526f
55 skip_int: 55 skip_int:
56 cmp 84(%rsi), %eax 56 cmp 84(%rsi), %eax
57 jnb do_sync 57 jnb do_sync
58 ret 58 ret
59 59
60 .global do_sync 60 .global m68k_trap
61 m68k_trap:
62 push %rdi
63 push %rcx
64 /* swap USP and SSP if not already in supervisor mode */
65 bt $5, 5(%rsi)
66 jc already_supervisor_trap
67 mov 72(%rsi), %edi
68 mov %r15d, 72(%rsi)
69 mov %edi, %r15d
70 already_supervisor_trap:
71 /* save status register on stack */
72 sub $2, %r15d
73 mov %r15d, %edi
74 call get_sr
75 call m68k_write_word
76 /* update status register */
77 andb $0xF8, 5(%rsi)
78 mov 92(%rsi), %cl
79 or $0x20, %cl
80 or %cl, 5(%rsi)
81 /* save PC */
82 sub $4, %r15d
83 mov %r15d, %edi
84 pop %rcx
85 call m68k_write_long_lowfirst
86 /* calculate interrupt vector address */
87 pop %rcx
88 shl $2, %ecx
89 add $0x80, %ecx
90 call m68k_read_long_scratch1
91 call m68k_native_addr_and_sync
92 add $24, %eax
93 jmp *%rcx
61 94
62 int_dbg_msg: 95 int_dbg_msg:
63 .asciz "Executing Interrupt!" 96 .asciz "Executing Interrupt!"
64 print_int_dbg: 97 print_int_dbg:
65 call m68k_save_context 98 call m68k_save_context