Mercurial > repos > blastem
comparison runtime.S @ 175:7504200cac86
Fix order of SR and PC saved in an exception stack frame
author | Mike Pavone <pavone@retrodev.com> |
---|---|
date | Sun, 06 Jan 2013 20:49:42 -0800 |
parents | 69ac23d42897 |
children | e2918b5208eb |
comparison
equal
deleted
inserted
replaced
174:a1c3ecb4823f | 175:7504200cac86 |
---|---|
15 | 15 |
16 .global handle_cycle_limit_int | 16 .global handle_cycle_limit_int |
17 handle_cycle_limit_int: | 17 handle_cycle_limit_int: |
18 cmp 88(%rsi), %eax | 18 cmp 88(%rsi), %eax |
19 jb skip_int | 19 jb skip_int |
20 push %rcx | |
21 /* call print_int_dbg */ | |
22 /* swap USP and SSP if not already in supervisor mode */ | 20 /* swap USP and SSP if not already in supervisor mode */ |
23 bt $5, 5(%rsi) | 21 bt $5, 5(%rsi) |
24 jc already_supervisor | 22 jc already_supervisor |
25 mov 72(%rsi), %edi | 23 mov 72(%rsi), %edi |
26 mov %r15d, 72(%rsi) | 24 mov %r15d, 72(%rsi) |
27 mov %edi, %r15d | 25 mov %edi, %r15d |
28 already_supervisor: | 26 already_supervisor: |
27 /* save PC */ | |
28 sub $4, %r15d | |
29 mov %r15d, %edi | |
30 call m68k_write_long_lowfirst | |
29 /* save status register on stack */ | 31 /* save status register on stack */ |
30 sub $2, %r15d | 32 sub $2, %r15d |
31 mov %r15d, %edi | 33 mov %r15d, %edi |
32 call get_sr | 34 call get_sr |
33 call m68k_write_word | 35 call m68k_write_word |
34 /* update status register */ | 36 /* update status register */ |
35 andb $0xF8, 5(%rsi) | 37 andb $0xF8, 5(%rsi) |
36 mov 92(%rsi), %cl | 38 mov 92(%rsi), %cl |
37 or $0x20, %cl | 39 or $0x20, %cl |
38 or %cl, 5(%rsi) | 40 or %cl, 5(%rsi) |
39 /* save PC */ | |
40 sub $4, %r15d | |
41 mov %r15d, %edi | |
42 pop %rcx | |
43 call m68k_write_long_lowfirst | |
44 /* calculate interrupt vector address */ | 41 /* calculate interrupt vector address */ |
45 mov 92(%rsi), %ecx | 42 mov 92(%rsi), %ecx |
46 shl $2, %ecx | 43 shl $2, %ecx |
47 add $0x60, %ecx | 44 add $0x60, %ecx |
48 call m68k_read_long_scratch1 | 45 call m68k_read_long_scratch1 |
66 jc already_supervisor_trap | 63 jc already_supervisor_trap |
67 mov 72(%rsi), %edi | 64 mov 72(%rsi), %edi |
68 mov %r15d, 72(%rsi) | 65 mov %r15d, 72(%rsi) |
69 mov %edi, %r15d | 66 mov %edi, %r15d |
70 already_supervisor_trap: | 67 already_supervisor_trap: |
68 /* save PC */ | |
69 sub $4, %r15d | |
70 mov %r15d, %edi | |
71 pop %rcx | |
72 call m68k_write_long_lowfirst | |
71 /* save status register on stack */ | 73 /* save status register on stack */ |
72 sub $2, %r15d | 74 sub $2, %r15d |
73 mov %r15d, %edi | 75 mov %r15d, %edi |
74 call get_sr | 76 call get_sr |
75 call m68k_write_word | 77 call m68k_write_word |
76 /* update status register */ | 78 /* update status register */ |
77 andb $0xF8, 5(%rsi) | 79 andb $0xF8, 5(%rsi) |
78 mov 92(%rsi), %cl | 80 mov 92(%rsi), %cl |
79 or $0x20, %cl | 81 or $0x20, %cl |
80 or %cl, 5(%rsi) | 82 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 */ | 83 /* calculate interrupt vector address */ |
87 pop %rcx | 84 pop %rcx |
88 shl $2, %ecx | 85 shl $2, %ecx |
89 add $0x80, %ecx | 86 add $0x80, %ecx |
90 call m68k_read_long_scratch1 | 87 call m68k_read_long_scratch1 |