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