Mercurial > repos > blastem
comparison zruntime.S @ 249:d94e6cd5a8a5
Forgot to commit zruntime a while back, adding it now.
author | Mike Pavone <pavone@retrodev.com> |
---|---|
date | Mon, 29 Apr 2013 00:59:32 -0700 |
parents | |
children | 63b9a500a00b |
comparison
equal
deleted
inserted
replaced
248:9c7a3db7bcd0 | 249:d94e6cd5a8a5 |
---|---|
1 z_inccycles: | |
2 cmp %edi, %ebp | |
3 jnb do_limit | |
4 no_sync: | |
5 add $3, %ebp | |
6 ret | |
7 do_limit: | |
8 cmp 112(%rsi), %ebp | |
9 jb no_sync | |
10 call z80_save_context_scratch | |
11 pop %rax /*return address in read/write func*/ | |
12 pop 104(%rsi) /*return address in native code*/ | |
13 sub $5, %rax /* adjust return addres to point to the call instruction that got us here */ | |
14 mov %rax, (%rsi) | |
15 | |
16 pop %r15 /* restore callee saved regsiters */ | |
17 pop %r14 | |
18 pop %r13 | |
19 pop %r12 | |
20 pop %rbp | |
21 pop %rbx | |
22 ret /* return to caller of z80_run */ | |
23 | |
24 .global z80_handle_cycle_limit_int | |
25 z80_handle_cycle_limit_int: | |
26 cmp 116(%rsi), %ebp | |
27 jb zskip_int | |
28 mov 112(%rsi), %ebp /* set cycle limit to sync cycle */ | |
29 add $7, %ebp | |
30 sub $2, %r9w | |
31 mov %r9w, %r13w | |
32 call z_inccycles | |
33 push %r14 | |
34 call z80_write_byte_noinc | |
35 pop %r14 | |
36 mov %r9w, %r13w | |
37 add $1, %r13w | |
38 shr $8, %r14w | |
39 call z_inccycles | |
40 call z80_write_byte_noinc | |
41 /* TODO: Support interrupt mode 0 and 2 */ | |
42 mov $0x38, %r13w | |
43 call z80_native_addr | |
44 jmp *%r13 | |
45 zskip_int: | |
46 cmp 112(%rsi), %ebp | |
47 jb zskip_sync | |
48 call z80_save_context | |
49 .global z80_do_sync | |
50 z80_do_sync: | |
51 pop (%rsi) /*return address in native code*/ | |
52 pop %r15 /* restore callee saved regsiters */ | |
53 pop %r14 | |
54 pop %r13 | |
55 pop %r12 | |
56 pop %rbp | |
57 pop %rbx | |
58 zskip_sync: | |
59 ret | |
60 | |
61 .global z80_read_byte | |
62 z80_read_byte: | |
63 call z_inccycles | |
64 z80_read_byte_noinc: | |
65 cmp $0x4000, %r13w | |
66 jb z80_read_ram | |
67 cmp $0x8000, %r13w | |
68 jae z80_read_bank | |
69 /* TODO: Bank reg, YM-2612, PSG/VDP */ | |
70 ret | |
71 z80_read_ram: | |
72 and $0x1FFF, %r13 | |
73 mov (%r11, %r13), %r13b | |
74 ret | |
75 z80_read_bank: | |
76 and $0x7FFF, %r13 | |
77 cmp $0, %r12 | |
78 je slow_bank_read | |
79 /* 68K memory is byte swapped */ | |
80 xor $1, %r13 | |
81 mov (%r12, %r13), %r13b | |
82 ret | |
83 slow_bank_read: | |
84 /* TODO: Call into C to implement this */ | |
85 ret | |
86 | |
87 .global z80_write_byte | |
88 z80_write_byte: | |
89 call z_inccycles | |
90 z80_write_byte_noinc: | |
91 cmp $0x4000, %r13w | |
92 jb z80_write_ram | |
93 cmp $0x8000, %r13w | |
94 jae z80_write_bank | |
95 cmp $0x6000, %r13w | |
96 je z80_write_bank_reg | |
97 /* TODO: YM-2612, PSG/VDP */ | |
98 ret | |
99 z80_write_ram: | |
100 and $0x1FFF, %r13 | |
101 mov %r14b, (%r11, %r13) | |
102 ret | |
103 z80_write_bank: | |
104 and $0x7FFF, %r13 | |
105 cmp $0, %r12 | |
106 je slow_bank_write | |
107 /* 68K memory is byte swapped */ | |
108 xor $1, %r13 | |
109 mov %r14b, (%r12, %r13) | |
110 ret | |
111 slow_bank_write: | |
112 /* TODO: Call into C to implement this */ | |
113 ret | |
114 z80_write_bank_reg: | |
115 and $1, %r14w | |
116 shl %r15w | |
117 or %r14w, %r15w | |
118 and $0x1FF, %r15w | |
119 xor %r12, %r12 | |
120 cmp $0x80, %r15w | |
121 jb update_bank_ptr | |
122 ret | |
123 update_bank_ptr: | |
124 mov %r15w, %r12w | |
125 shl $15, %r12 | |
126 add 80(%rsi), %r12 | |
127 ret | |
128 | |
129 .global z80_read_word | |
130 z80_read_word: | |
131 call z_inccycles | |
132 push %r13 | |
133 call z80_read_byte_noinc | |
134 mov %r13b, %r14b | |
135 pop %r13 | |
136 inc %r13 | |
137 call z_inccycles | |
138 call z80_read_byte_noinc | |
139 shl $8, %r13w | |
140 mov %r14b, %r13b | |
141 ret | |
142 | |
143 .global z80_write_word_highfirst | |
144 z80_write_word_highfirst: | |
145 call z_inccycles | |
146 push %r14 | |
147 push %r13 | |
148 add $1, %r13w | |
149 shr $8, %r14w | |
150 call z80_write_byte_noinc | |
151 pop %r13 | |
152 pop %r14 | |
153 call z_inccycles | |
154 call z80_write_byte_noinc | |
155 ret | |
156 | |
157 .global z80_write_word_lowfirst | |
158 z80_write_word_lowfirst: | |
159 call z_inccycles | |
160 push %r14 | |
161 push %r13 | |
162 call z80_write_byte_noinc | |
163 pop %r13 | |
164 pop %r14 | |
165 add $1, %r13w | |
166 shr $8, %r14w | |
167 call z_inccycles | |
168 call z80_write_byte_noinc | |
169 ret | |
170 | |
171 .global z80_native_addr | |
172 z80_native_addr: | |
173 call z80_save_context | |
174 push %rsi | |
175 mov %rsi, %rdi | |
176 movzx %r13w, %esi | |
177 call z80_get_native_address_trans | |
178 mov %rax, %r13 | |
179 pop %rsi | |
180 call z80_load_context | |
181 ret | |
182 | |
183 z80_save_context_scratch: | |
184 mov %r13w, 98(%rsi) /* scratch1 */ | |
185 mov %r14w, 100(%rsi) /* scratch2 */ | |
186 | |
187 .global z80_save_context | |
188 z80_save_context: | |
189 mov %r9w, 8(%rsi) /* SP */ | |
190 mov %r15w, 16(%rsi) /* bank register */ | |
191 mov %bx, 18(%rsi) /* BC */ | |
192 mov %cx, 20(%rsi) /* DE */ | |
193 mov %ax, 22(%rsi) /* HL */ | |
194 mov %dx, 24(%rsi) /* IX */ | |
195 mov %r8w, 26(%rsi) /* IY */ | |
196 mov %r10b, 30(%rsi) /* A */ | |
197 mov %edi, 48(%rsi) /* target_cycle */ | |
198 mov %ebp, 52(%rsi) /* current_cycle */ | |
199 mov %r12, 72(%rsi) /* cartridge bank pointer */ | |
200 ret | |
201 | |
202 | |
203 z80_load_context_scratch: | |
204 mov 98(%rsi), %r13w /* scratch1 */ | |
205 mov 100(%rsi), %r14w /* scratch2 */ | |
206 | |
207 .global z80_load_context | |
208 z80_load_context: | |
209 mov 8(%rsi), %r9w /* SP */ | |
210 mov 16(%rsi), %r15w /* bank register */ | |
211 mov 18(%rsi), %bx /* BC */ | |
212 mov 20(%rsi), %cx /* DE */ | |
213 mov 22(%rsi), %ax /* HL */ | |
214 mov 24(%rsi), %dx /* IX */ | |
215 mov 26(%rsi), %r8w /* IY */ | |
216 mov 30(%rsi), %r10b /* A */ | |
217 mov 48(%rsi), %edi /* target_cycle */ | |
218 mov 52(%rsi), %ebp /* current_cycle */ | |
219 mov 64(%rsi), %r11 /* z80 RAM */ | |
220 mov 72(%rsi), %r12 /* cartridge bank pointer */ | |
221 ret | |
222 | |
223 .global z80_run | |
224 z80_run: | |
225 push %rbx | |
226 push %rbp | |
227 push %r12 | |
228 push %r13 | |
229 push %r14 | |
230 push %r15 | |
231 mov %rdi, %rsi | |
232 call z80_load_context_scratch | |
233 cmpq $0, 104(%rsi) | |
234 je no_extra | |
235 push 104(%rsi) | |
236 movq $0, 104(%rsi) | |
237 no_extra: | |
238 jmp *(%rsi) | |
239 |