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