Mercurial > repos > blastem
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 |