Mercurial > repos > blastem
comparison runtime.S @ 82:6331ddec228f
Initial stab at interrupt support. Make native code offsets bigger so I don't have to worry about overflowing the offset. Implement neg and not (untested).
author | Mike Pavone <pavone@retrodev.com> |
---|---|
date | Wed, 26 Dec 2012 11:09:04 -0800 |
parents | 7935cd64d5c8 |
children | 2c7267617d71 |
comparison
equal
deleted
inserted
replaced
81:6d231dbe75ab | 82:6331ddec228f |
---|---|
1 | 1 |
2 .global handle_cycle_limit | 2 .global handle_cycle_limit |
3 handle_cycle_limit: | 3 handle_cycle_limit: |
4 cmp 84(%rsi), %eax | |
5 jb skip_sync | |
4 call m68k_save_context | 6 call m68k_save_context |
5 mov %rsi, %rdi | 7 mov %rsi, %rdi |
6 call sync_components | 8 call sync_components |
7 mov %rax, %rsi | 9 mov %rax, %rsi |
8 call m68k_load_context | 10 call m68k_load_context |
11 skip_sync: | |
12 ret | |
13 | |
14 .global handle_cycle_limit_int | |
15 handle_cycle_limit_int: | |
16 cmp 88(%rsi), %eax | |
17 jb skip_int | |
18 push %rcx | |
19 /* swap USP and SSP if not already in supervisor mode */ | |
20 bt $5, 5(%rsi) | |
21 jc already_supervisor | |
22 mov 72(%rsi), %edi | |
23 mov %r15d, 72(%rsi) | |
24 mov %edi, %r15d | |
25 already_supervisor: | |
26 /* save status register on stack */ | |
27 sub $2, %r15d | |
28 mov %r15d, %edi | |
29 call get_sr | |
30 call m68k_write_word | |
31 /* update status register */ | |
32 andb $0xF8, 5(%rsi) | |
33 mov 92(%rsi), %cl | |
34 or $0x20, %cl | |
35 or %cl, 5(%rsi) | |
36 /* save PC */ | |
37 sub $4, %r15d | |
38 mov %r15d, %edi | |
39 pop %rcx | |
40 call m68k_write_long_lowfirst | |
41 /* calculate interrupt vector address */ | |
42 mov 92(%rsi), %ecx | |
43 shl $2, %ecx | |
44 add $0x60, %ecx | |
45 call m68k_read_long_scratch1 | |
46 call m68k_native_addr_and_sync | |
47 add $24, %eax | |
48 /* discard function return address */ | |
49 pop %rdi | |
50 jmp *%rcx | |
51 skip_int: | |
52 ret | |
53 | |
54 .global get_sr | |
55 get_sr: | |
56 mov 5(%rsi), %cl | |
57 shl $8, %cx | |
58 mov (%rsi), %cl | |
59 shl $1, %cl | |
60 or %bl, %cl | |
61 shl $1, %cl | |
62 or %dl, %cl | |
63 shl $1, %cl | |
64 or %bh, %cl | |
65 shl $1, %cl | |
66 or %dh, %cl | |
67 ret | |
68 | |
69 .global set_sr | |
70 set_sr: | |
71 mov %cl, %dh | |
72 and $1, %dh | |
73 shr $1, %cl | |
74 mov %cl, %bh | |
75 and $1, %bh | |
76 shr $1, %cl | |
77 mov %cl, %dl | |
78 and $1, %dl | |
79 shr $1, %cl | |
80 mov %cl, %bl | |
81 and $1, %bl | |
82 shr $1, %cl | |
83 and $1, %cl | |
84 mov %cl, (%rsi) | |
85 shr $8, %cx | |
86 mov %cl, 5(%rsi) | |
87 ret | |
88 | |
89 .global set_ccr | |
90 set_ccr: | |
91 mov %cl, %dh | |
92 and $1, %dh | |
93 shr $1, %cl | |
94 mov %cl, %bh | |
95 and $1, %bh | |
96 shr $1, %cl | |
97 mov %cl, %dl | |
98 and $1, %dl | |
99 shr $1, %cl | |
100 mov %cl, %bl | |
101 and $1, %bl | |
102 shr $1, %cl | |
103 and $1, %cl | |
104 mov %cl, (%rsi) | |
9 ret | 105 ret |
10 | 106 |
11 do_vdp_port_write: | 107 do_vdp_port_write: |
12 call m68k_save_context | 108 call m68k_save_context |
13 mov %rcx, %rdx | 109 mov %rcx, %rdx |
20 mov %ecx, %edi | 116 mov %ecx, %edi |
21 call m68k_save_context | 117 call m68k_save_context |
22 call vdp_port_read | 118 call vdp_port_read |
23 mov %rax, %rsi | 119 mov %rax, %rsi |
24 call m68k_load_context | 120 call m68k_load_context |
25 mov 128(%rsi), %cx | 121 mov 136(%rsi), %cx |
26 ret | 122 ret |
27 | 123 |
28 do_io_write: | 124 do_io_write: |
29 call m68k_save_context | 125 call m68k_save_context |
30 and $0xFF, %edi | 126 and $0xFF, %edi |
38 and $0xFF, %edi | 134 and $0xFF, %edi |
39 call m68k_save_context | 135 call m68k_save_context |
40 call io_read | 136 call io_read |
41 mov %rax, %rsi | 137 mov %rax, %rsi |
42 call m68k_load_context | 138 call m68k_load_context |
43 mov 128(%rsi), %cl | 139 mov 136(%rsi), %cl |
44 ret | 140 ret |
45 | 141 |
46 bad_access_msg: | 142 bad_access_msg: |
47 .asciz "Program tried to access illegal 68K address %X\n" | 143 .asciz "Program tried to access illegal 68K address %X\n" |
48 | 144 |
74 jmp do_vdp_port_write | 170 jmp do_vdp_port_write |
75 try_fifo_write: | 171 try_fifo_write: |
76 push %rdx | 172 push %rdx |
77 push %rbx | 173 push %rbx |
78 /* fetch VDP context pointer from 68K context */ | 174 /* fetch VDP context pointer from 68K context */ |
79 mov 120(%rsi), %rdx | 175 mov 128(%rsi), %rdx |
80 /* get fifo_cur and compare it to fifo_end */ | 176 /* get fifo_cur and compare it to fifo_end */ |
81 mov (%rdx), %rbx | 177 mov (%rdx), %rbx |
82 cmp %rbx, 8(%rdx) | 178 cmp %rbx, 8(%rdx) |
83 /* bail out if fifo is full */ | 179 /* bail out if fifo is full */ |
84 je fifo_fallback | 180 je fifo_fallback |
163 add $2, %rdi | 259 add $2, %rdi |
164 jmp m68k_write_word | 260 jmp m68k_write_word |
165 | 261 |
166 inccycles: | 262 inccycles: |
167 cmp %rbp, %rax | 263 cmp %rbp, %rax |
168 jge do_limit | 264 jnb do_limit |
169 add $4, %rax | 265 add $4, %rax |
170 ret | 266 ret |
171 do_limit: | 267 do_limit: |
172 push %rcx | 268 push %rcx |
173 push %rdi | 269 push %rdi |
269 dyn_addr_msg: | 365 dyn_addr_msg: |
270 .asciz "Program needs dynamically calculated native address\n" | 366 .asciz "Program needs dynamically calculated native address\n" |
271 | 367 |
272 .global m68k_native_addr | 368 .global m68k_native_addr |
273 m68k_native_addr: | 369 m68k_native_addr: |
274 lea dyn_addr_msg(%rip), %rdi | 370 call m68k_save_context |
275 call puts | 371 push %rcx |
276 mov $1, %rdi | 372 mov %rsi, %rdi |
277 call exit | 373 call sync_components |
374 pop %rsi | |
375 push %rax | |
376 mov 144(%rax), %rdi | |
377 call get_native_address | |
378 mov %rax, %rcx | |
379 pop %rsi | |
380 call m68k_load_context | |
381 ret | |
382 | |
383 .global m68k_native_addr_and_sync | |
384 m68k_native_addr_and_sync: | |
385 call m68k_save_context | |
386 push %rsi | |
387 mov 144(%rsi), %rdi | |
388 mov %ecx, %esi | |
389 call get_native_address | |
390 mov %rax, %rcx | |
391 pop %rsi | |
392 call m68k_load_context | |
393 ret | |
278 | 394 |
279 .global m68k_save_context | 395 .global m68k_save_context |
280 m68k_save_context: | 396 m68k_save_context: |
281 mov %bl, 1(%rsi) /* N Flag */ | 397 mov %bl, 1(%rsi) /* N Flag */ |
282 mov %bh, 2(%rsi) /* V flag */ | 398 mov %bh, 2(%rsi) /* V flag */ |
303 mov 40(%rsi), %r13d /* a0 */ | 419 mov 40(%rsi), %r13d /* a0 */ |
304 mov 44(%rsi), %r14d /* a1 */ | 420 mov 44(%rsi), %r14d /* a1 */ |
305 mov 68(%rsi), %r15d /* a7 */ | 421 mov 68(%rsi), %r15d /* a7 */ |
306 mov 76(%rsi), %ebp /* target cycle count */ | 422 mov 76(%rsi), %ebp /* target cycle count */ |
307 mov 80(%rsi), %eax /* current cycle count */ | 423 mov 80(%rsi), %eax /* current cycle count */ |
308 mov 88(%rsi), %r8d /* cartridge address */ | 424 mov 96(%rsi), %r8d /* cartridge address */ |
309 mov 96(%rsi), %r9d /* work ram address */ | 425 mov 104(%rsi), %r9d /* work ram address */ |
310 ret | 426 ret |
311 | 427 |
312 .global m68k_start_context | 428 .global m68k_start_context |
313 m68k_start_context: | 429 m68k_start_context: |
314 call m68k_load_context | 430 call m68k_load_context |