Mercurial > repos > blastem
comparison runtime.S @ 321:146c87616b05
Don't update interrupt mask on non-interrupt exceptions
author | Mike Pavone <pavone@retrodev.com> |
---|---|
date | Sat, 11 May 2013 21:19:31 -0700 |
parents | 67b6d351df0e |
children | 467bfa17004a |
comparison
equal
deleted
inserted
replaced
320:67b6d351df0e | 321:146c87616b05 |
---|---|
43 /* calculate interrupt vector address */ | 43 /* calculate interrupt vector address */ |
44 mov 92(%rsi), %ecx | 44 mov 92(%rsi), %ecx |
45 mov %cx, 6(%rsi) /* interrupt acknowlege */ | 45 mov %cx, 6(%rsi) /* interrupt acknowlege */ |
46 shl $2, %ecx | 46 shl $2, %ecx |
47 add $0x60, %ecx | 47 add $0x60, %ecx |
48 /* push %rcx | |
49 call debug_print_sr_int | |
50 pop %rcx */ | |
48 call m68k_read_long_scratch1 | 51 call m68k_read_long_scratch1 |
49 call m68k_native_addr_and_sync | 52 call m68k_native_addr_and_sync |
50 add $24, %eax | 53 add $24, %eax |
51 /* discard function return address */ | 54 /* discard function return address */ |
52 pop %rdi | 55 pop %rdi |
60 mov %ecx, %esi | 63 mov %ecx, %esi |
61 call sync_components | 64 call sync_components |
62 mov %rax, %rsi | 65 mov %rax, %rsi |
63 call m68k_load_context | 66 call m68k_load_context |
64 skip_sync_int: | 67 skip_sync_int: |
68 ret | |
69 | |
70 sr_msg_int: | |
71 .asciz "SR set to $%X due to interrupt\n" | |
72 debug_print_sr_int: | |
73 call m68k_save_context | |
74 push %rsi | |
75 lea sr_msg_int(%rip), %rdi | |
76 movzxb 5(%rsi), %rsi | |
77 xor %rax, %rax | |
78 call printf | |
79 pop %rsi | |
80 call m68k_load_context | |
81 ret | |
82 | |
83 sr_msg: | |
84 .asciz "SR set to $%X\n" | |
85 .global debug_print_sr | |
86 debug_print_sr: | |
87 call m68k_save_context | |
88 push %rsi | |
89 lea sr_msg(%rip), %rdi | |
90 movzxb 5(%rsi), %rsi | |
91 xor %rax, %rax | |
92 call printf | |
93 pop %rsi | |
94 call m68k_load_context | |
65 ret | 95 ret |
66 | 96 |
67 .global m68k_trap | 97 .global m68k_trap |
68 m68k_trap: | 98 m68k_trap: |
69 push %rdi | 99 push %rdi |
83 /* save status register on stack */ | 113 /* save status register on stack */ |
84 sub $2, %r15d | 114 sub $2, %r15d |
85 mov %r15d, %edi | 115 mov %r15d, %edi |
86 call get_sr | 116 call get_sr |
87 call m68k_write_word | 117 call m68k_write_word |
88 /* update status register */ | 118 /* set supervisor bit */ |
89 andb $0xF8, 5(%rsi) | 119 or $0x20, 5(%rsi) |
90 mov 92(%rsi), %cl | |
91 or $0x20, %cl | |
92 or %cl, 5(%rsi) | |
93 /* calculate interrupt vector address */ | 120 /* calculate interrupt vector address */ |
94 pop %rcx | 121 pop %rcx |
95 shl $2, %ecx | 122 shl $2, %ecx |
96 call m68k_read_long_scratch1 | 123 call m68k_read_long_scratch1 |
97 call m68k_native_addr_and_sync | 124 call m68k_native_addr_and_sync |
210 shr $1, %cl | 237 shr $1, %cl |
211 and $1, %cl | 238 and $1, %cl |
212 mov %cl, (%rsi) | 239 mov %cl, (%rsi) |
213 shr $8, %cx | 240 shr $8, %cx |
214 mov %cl, 5(%rsi) | 241 mov %cl, 5(%rsi) |
242 /* call debug_print_sr */ | |
215 ret | 243 ret |
216 | 244 |
217 .global set_ccr | 245 .global set_ccr |
218 set_ccr: | 246 set_ccr: |
219 mov %cl, %dh | 247 mov %cl, %dh |