comparison runtime.S @ 72:7935cd64d5c8

Implement word wide access to IO area
author Mike Pavone <pavone@retrodev.com>
date Fri, 21 Dec 2012 16:04:30 -0800
parents 7a22a0e6c004
children 6331ddec228f
comparison
equal deleted inserted replaced
71:f80fa1776507 72:7935cd64d5c8
20 mov %ecx, %edi 20 mov %ecx, %edi
21 call m68k_save_context 21 call m68k_save_context
22 call vdp_port_read 22 call vdp_port_read
23 mov %rax, %rsi 23 mov %rax, %rsi
24 call m68k_load_context 24 call m68k_load_context
25 mov 120(%rsi), %cx 25 mov 128(%rsi), %cx
26 ret 26 ret
27 27
28 do_io_write: 28 do_io_write:
29 call m68k_save_context 29 call m68k_save_context
30 and $0xFF, %edi 30 and $0xFF, %edi
38 and $0xFF, %edi 38 and $0xFF, %edi
39 call m68k_save_context 39 call m68k_save_context
40 call io_read 40 call io_read
41 mov %rax, %rsi 41 mov %rax, %rsi
42 call m68k_load_context 42 call m68k_load_context
43 mov 120(%rsi), %cl 43 mov 128(%rsi), %cl
44 ret 44 ret
45 45
46 bad_access_msg: 46 bad_access_msg:
47 .asciz "Program tried to access illegal 68K address %X\n" 47 .asciz "Program tried to access illegal 68K address %X\n"
48 48
74 jmp do_vdp_port_write 74 jmp do_vdp_port_write
75 try_fifo_write: 75 try_fifo_write:
76 push %rdx 76 push %rdx
77 push %rbx 77 push %rbx
78 /* fetch VDP context pointer from 68K context */ 78 /* fetch VDP context pointer from 68K context */
79 mov 112(%rsi), %rdx 79 mov 120(%rsi), %rdx
80 /* get fifo_cur and compare it to fifo_end */ 80 /* get fifo_cur and compare it to fifo_end */
81 mov (%rdx), %rbx 81 mov (%rdx), %rbx
82 cmp %rbx, 8(%rdx) 82 cmp %rbx, 8(%rdx)
83 /* bail out if fifo is full */ 83 /* bail out if fifo is full */
84 je fifo_fallback 84 je fifo_fallback
185 jle cart 185 jle cart
186 cmp $0xE00000, %ecx 186 cmp $0xE00000, %ecx
187 jge workram 187 jge workram
188 cmp $0xC00000, %ecx 188 cmp $0xC00000, %ecx
189 jge vdp_psg 189 jge vdp_psg
190 cmp $0xA10000, %ecx
191 jl not_io
192 cmp $0xA10100, %ecx
193 jge not_io
194 call do_io_read
195 mov %cl, %dil
196 and $0xFF, %cx
197 shl $8, %di
198 or %di, %cx
199 ret
200 not_io:
190 xor %cx, %cx 201 xor %cx, %cx
191 dec %cx 202 dec %cx
192 ret 203 ret
193 workram: 204 workram:
194 and $0xFFFF, %rcx 205 and $0xFFFF, %rcx
275 mov %r11d, 12(%rsi) /* d1 */ 286 mov %r11d, 12(%rsi) /* d1 */
276 mov %r12d, 16(%rsi) /* d2 */ 287 mov %r12d, 16(%rsi) /* d2 */
277 mov %r13d, 40(%rsi) /* a0 */ 288 mov %r13d, 40(%rsi) /* a0 */
278 mov %r14d, 44(%rsi) /* a1 */ 289 mov %r14d, 44(%rsi) /* a1 */
279 mov %r15d, 68(%rsi) /* a7 */ 290 mov %r15d, 68(%rsi) /* a7 */
280 mov %eax, 76(%rsi) /* current cycle count */ 291 mov %eax, 80(%rsi) /* current cycle count */
281 ret 292 ret
282 293
283 .global m68k_load_context 294 .global m68k_load_context
284 m68k_load_context: 295 m68k_load_context:
285 mov 1(%rsi), %bl /* N Flag */ 296 mov 1(%rsi), %bl /* N Flag */
290 mov 12(%rsi), %r11d /* d1 */ 301 mov 12(%rsi), %r11d /* d1 */
291 mov 16(%rsi), %r12d /* d2 */ 302 mov 16(%rsi), %r12d /* d2 */
292 mov 40(%rsi), %r13d /* a0 */ 303 mov 40(%rsi), %r13d /* a0 */
293 mov 44(%rsi), %r14d /* a1 */ 304 mov 44(%rsi), %r14d /* a1 */
294 mov 68(%rsi), %r15d /* a7 */ 305 mov 68(%rsi), %r15d /* a7 */
295 mov 72(%rsi), %ebp /* target cycle count */ 306 mov 76(%rsi), %ebp /* target cycle count */
296 mov 76(%rsi), %eax /* current cycle count */ 307 mov 80(%rsi), %eax /* current cycle count */
297 mov 80(%rsi), %r8d /* cartridge address */ 308 mov 88(%rsi), %r8d /* cartridge address */
298 mov 88(%rsi), %r9d /* work ram address */ 309 mov 96(%rsi), %r9d /* work ram address */
299 ret 310 ret
300 311
301 .global m68k_start_context 312 .global m68k_start_context
302 m68k_start_context: 313 m68k_start_context:
303 call m68k_load_context 314 call m68k_load_context