Mercurial > repos > blastem
comparison runtime.S @ 485:b449af228c63
Follow amd64 ABI stack alignment requirements in places it matters so we can call sprintf with floating point arguments without crashing
author | Mike Pavone <pavone@retrodev.com> |
---|---|
date | Thu, 03 Oct 2013 21:21:47 -0700 |
parents | 8e136187c0e0 |
children | 4ca826862174 |
comparison
equal
deleted
inserted
replaced
484:0bf5e6b672fe | 485:b449af228c63 |
---|---|
8 push %rcx | 8 push %rcx |
9 push %rdi | 9 push %rdi |
10 call m68k_save_context | 10 call m68k_save_context |
11 mov %rsi, %rdi | 11 mov %rsi, %rdi |
12 xor %esi, %esi | 12 xor %esi, %esi |
13 call sync_components | 13 test $8, %esp |
14 jnz adjust_rsp | |
15 call sync_components | |
16 jmp done_adjust | |
17 adjust_rsp: | |
18 sub $8, %rsp | |
19 call sync_components | |
20 add $8, %rsp | |
21 done_adjust: | |
14 mov %rax, %rsi | 22 mov %rax, %rsi |
15 call m68k_load_context | 23 call m68k_load_context |
16 pop %rdi | 24 pop %rdi |
17 pop %rcx | 25 pop %rcx |
18 skip_sync: | 26 skip_sync: |
19 ret | 27 ret |
20 | 28 |
21 sr_msg_int: | 29 sr_msg_int: |
22 .asciz "SR set to $%X due to interrupt\n" | 30 .asciz "SR set to $%X due to interrupt\n" |
23 debug_print_sr_int: | 31 debug_print_sr_int: |
24 call m68k_save_context | 32 call m68k_save_context |
25 push %rsi | 33 push %rsi |
45 call m68k_load_context | 53 call m68k_load_context |
46 ret | 54 ret |
47 | 55 |
48 invalid_msg: | 56 invalid_msg: |
49 .asciz "Invalid instruction at %X\n" | 57 .asciz "Invalid instruction at %X\n" |
50 | 58 |
51 .global m68k_invalid | 59 .global m68k_invalid |
52 m68k_invalid: | 60 m68k_invalid: |
53 lea invalid_msg(%rip), %rdi | 61 lea invalid_msg(%rip), %rdi |
54 mov %ecx, %esi | 62 mov %ecx, %esi |
55 xor %rax, %rax | 63 xor %rax, %rax |
58 call exit | 66 call exit |
59 | 67 |
60 .global bcd_add | 68 .global bcd_add |
61 bcd_add: | 69 bcd_add: |
62 xchg %rax, %rdi | 70 xchg %rax, %rdi |
63 | 71 |
64 mov %cl, %ch | 72 mov %cl, %ch |
65 mov %al, %ah | 73 mov %al, %ah |
66 and $0xF, %ch | 74 and $0xF, %ch |
67 and $0xF, %ah | 75 and $0xF, %ah |
68 and $0xF0, %cl | 76 and $0xF0, %cl |
80 jb no_adjust_h | 88 jb no_adjust_h |
81 def_adjust: | 89 def_adjust: |
82 add $0x60, %cl | 90 add $0x60, %cl |
83 mov $1, %ch | 91 mov $1, %ch |
84 no_adjust_h: | 92 no_adjust_h: |
85 | 93 |
86 mov %rdi, %rax | 94 mov %rdi, %rax |
87 ret | 95 ret |
88 | 96 |
89 .global bcd_sub | 97 .global bcd_sub |
90 bcd_sub: | 98 bcd_sub: |
91 xchg %rax, %rdi | 99 xchg %rax, %rdi |
92 | 100 |
93 mov %cl, %ch | 101 mov %cl, %ch |
94 mov %al, %ah | 102 mov %al, %ah |
95 and $0xF, %ch | 103 and $0xF, %ch |
96 and $0xF, %ah | 104 and $0xF, %ah |
97 and $0xF0, %cl | 105 and $0xF0, %cl |
109 jb no_adjust_hs | 117 jb no_adjust_hs |
110 def_adjusts: | 118 def_adjusts: |
111 sub $0x60, %cl | 119 sub $0x60, %cl |
112 mov $1, %ch | 120 mov $1, %ch |
113 no_adjust_hs: | 121 no_adjust_hs: |
114 | 122 |
115 mov %rdi, %rax | 123 mov %rdi, %rax |
116 ret | 124 ret |
117 | 125 |
118 .global get_sr | 126 .global get_sr |
119 get_sr: | 127 get_sr: |
166 and $1, %bl | 174 and $1, %bl |
167 shr $1, %cl | 175 shr $1, %cl |
168 and $1, %cl | 176 and $1, %cl |
169 mov %cl, (%rsi) | 177 mov %cl, (%rsi) |
170 ret | 178 ret |
171 | 179 |
172 .global m68k_modified_ret_addr | 180 .global m68k_modified_ret_addr |
173 m68k_modified_ret_addr: | 181 m68k_modified_ret_addr: |
174 add $16, %rsp | 182 add $16, %rsp |
175 call m68k_native_addr | 183 call m68k_native_addr |
176 jmp *%rcx | 184 jmp *%rcx |
179 m68k_native_addr_and_sync: | 187 m68k_native_addr_and_sync: |
180 call m68k_save_context | 188 call m68k_save_context |
181 push %rcx | 189 push %rcx |
182 mov %rsi, %rdi | 190 mov %rsi, %rdi |
183 xor %esi, %esi | 191 xor %esi, %esi |
184 call sync_components | 192 test $8, %rsp |
193 jnz adjust_rsp_na | |
194 call sync_components | |
195 jmp no_adjust_rsp_na | |
196 adjust_rsp_na: | |
197 sub $8, %rsp | |
198 call sync_components | |
199 add $8, %rsp | |
200 no_adjust_rsp_na: | |
185 pop %rsi | 201 pop %rsi |
186 push %rax | 202 push %rax |
187 mov %rax, %rdi | 203 mov %rax, %rdi |
188 call get_native_address_trans | 204 call get_native_address_trans |
189 mov %rax, %rcx | 205 mov %rax, %rcx |
200 call get_native_address_trans | 216 call get_native_address_trans |
201 mov %rax, %rcx | 217 mov %rax, %rcx |
202 pop %rsi | 218 pop %rsi |
203 call m68k_load_context | 219 call m68k_load_context |
204 ret | 220 ret |
205 | 221 |
206 .global m68k_retrans_stub | 222 .global m68k_retrans_stub |
207 m68k_retrans_stub: | 223 m68k_retrans_stub: |
208 call m68k_save_context | 224 call m68k_save_context |
209 push %rsi | 225 push %rsi |
210 call m68k_retranslate_inst | 226 call m68k_retranslate_inst |
253 push %rbp | 269 push %rbp |
254 push %r12 | 270 push %r12 |
255 push %r13 | 271 push %r13 |
256 push %r14 | 272 push %r14 |
257 push %r15 | 273 push %r15 |
258 | 274 |
259 call m68k_load_context | 275 call m68k_load_context |
260 call *%rdi | 276 call *%rdi |
261 call m68k_save_context | 277 call m68k_save_context |
262 | 278 |
263 pop %r15 | 279 pop %r15 |
264 pop %r14 | 280 pop %r14 |
265 pop %r13 | 281 pop %r13 |
266 pop %r12 | 282 pop %r12 |
267 pop %rbp | 283 pop %rbp |
268 | 284 |
269 ret | 285 ret |