Mercurial > repos > blastem
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 |