comparison runtime.S @ 18:3e7bfde7606e

M68K to x86 translation works for a limited subset of instructions and addressing modes
author Mike Pavone <pavone@retrodev.com>
date Tue, 04 Dec 2012 19:13:12 -0800
parents de0085d4ea40
children 44e661913a51
comparison
equal deleted inserted replaced
17:de0085d4ea40 18:3e7bfde7606e
1 1
2 .global _handle_cycle_limit 2 .global handle_cycle_limit
3 _handle_cycle_limit: 3 handle_cycle_limit:
4 retn 4 ret
5
6 .global m68k_write_word
7 m68k_write_word:
8 and $0xFFFFFF, %rdi
9 cmp $0x400000, %edi
10 jle cart_w
11 cmp $0xE00000, %edi
12 jge workram_w
13 jmp inccycles
14 workram_w:
15 and $0xFFFF, %rdi
16 mov %cx, (%r9, %rdi)
17 jmp inccycles
18 cart_w:
19 mov %cx, (%r8, %rdi)
20 jmp inccycles
5 21
22 .global m68k_write_byte
23 m68k_write_byte:
24 and $0xFFFFFF, %rdi
25 /* deal with byte swapping */
26 xor $1, %edi
27 cmp $0x400000, %edi
28 jle cart_wb
29 cmp $0xE00000, %edi
30 jge workram_wb
31 jmp inccycles
32 workram_wb:
33 and $0xFFFF, %rdi
34 mov %cl, (%r9, %rdi)
35 jmp inccycles
36 cart_wb:
37 mov %cl, (%r8, %rdi)
38 jmp inccycles
39
40 .global m68k_write_long_lowfirst
41 m68k_write_long_lowfirst:
42 push %rdi
43 add $2, %edi
44 call m68k_write_word
45 shr $16, %ecx
46 pop %rdi
47 jmp m68k_write_word
48
49 .global m68k_write_long_highfirst
50 m68k_write_long_highfirst:
51 push %rdi
52 push %rcx
53 shr $16, %ecx
54 call m68k_write_word
55 pop %rcx
56 pop %rdi
57 add $2, %rdi
58 jmp m68k_write_word
59
60 .global m68k_read_word_scratch1
61 m68k_read_word_scratch1:
62 and $0xFFFFFF, %rcx
63 cmp $0x400000, %ecx
64 jle cart
65 cmp $0xE00000, %ecx
66 jge workram
67 xor %cx, %cx
68 jmp inccycles
69 workram:
70 and $0xFFFF, %rcx
71 mov (%r9, %rcx), %cx
72 jmp inccycles
73 cart:
74 mov (%r8, %rcx), %cx
75 inccycles:
76 add $4, %rax
77 cmp %rbp, %rax
78 jge sync
79 ret
80 sync:
81 ret
82
83 .global m68k_read_long_scratch1
84 m68k_read_long_scratch1:
85 push %rcx
86 call m68k_read_word_scratch1
87 mov %cx, %di
88 pop %rcx
89 add $2, %ecx
90 call m68k_read_word_scratch1
91 and $0xFFFF, %ecx
92 shl $16, %edi
93 or %edi, %ecx
94 ret
95
96 .global m68k_read_byte_scratch1
97 m68k_read_byte_scratch1:
98 and $0xFFFFFF, %rcx
99 /* deal with byte swapping */
100 xor $1, %ecx
101 cmp $0x400000, %ecx
102 jle cart_b
103 cmp $0xE00000, %ecx
104 jge workram_b
105 xor %cl, %cl
106 jmp inccycles
107 workram_b:
108 and $0xFFFF, %rcx
109 mov (%r9, %rcx), %cl
110 jmp inccycles
111 cart_b:
112 mov (%r8, %rcx), %cl
113 jmp inccycles
114
115 ret_addr_msg:
116 .asciz "Program modified return address on stack: found %X, expected %X\n"
117
118 .global m68k_modified_ret_addr
119 m68k_modified_ret_addr:
120 lea ret_addr_msg(%rip), %rdi
121 mov %rcx, %rsi
122 mov 8(%rsp), %rdx
123 call printf
124 mov $1, %rdi
125 call exit
126
127 .global m68k_save_context
128 m68k_save_context:
129 mov %bl, 1(%rsi) /* N Flag */
130 mov %bh, 2(%rsi) /* V flag */
131 mov %dl, 3(%rsi) /* Z flag */
132 mov %dh, 4(%rsi) /* C flag */
133 mov %r10d, 8(%rsi) /* d0 */
134 mov %r11d, 12(%rsi) /* d1 */
135 mov %r12d, 16(%rsi) /* d2 */
136 mov %r13d, 40(%rsi) /* a0 */
137 mov %r14d, 44(%rsi) /* a1 */
138 mov %r15d, 68(%rsi) /* a7 */
139 ret
140
141 .global m68k_load_context
142 m68k_load_context:
143 mov 1(%rsi), %bl /* N Flag */
144 mov 2(%rsi), %bh /* V flag */
145 mov 3(%rsi), %dl /* Z flag */
146 mov 4(%rsi), %dh /* C flag */
147 mov 8(%rsi), %r10d /* d0 */
148 mov 12(%rsi), %r11d /* d1 */
149 mov 16(%rsi), %r12d /* d2 */
150 mov 40(%rsi), %r13d /* a0 */
151 mov 44(%rsi), %r14d /* a1 */
152 mov 68(%rsi), %r15d /* a7 */
153 mov 72(%rsi), %ebp /* target cycle count */
154 mov 76(%rsi), %eax /* current cycle count */
155 mov 80(%rsi), %r8d /* cartridge address */
156 mov 88(%rsi), %r9d /* work ram address */
157 ret
158
159 .global m68k_start_context
160 m68k_start_context:
161 call m68k_load_context
162 jmp *%rdi