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