SHOW:
|
|
- or go back to the newest paste.
1 | s16 b_sinetable[256] = { | |
2 | ||
3 | (s16)0x0000, (s16)0x0192, (s16)0x0323, (s16)0x04B5, (s16)0x0645, (s16)0x07D5, (s16)0x0964, (s16)0x0AF1, | |
4 | ||
5 | (s16)0x0C7C, (s16)0x0E05, (s16)0x0F8C, (s16)0x1111, (s16)0x1294, (s16)0x1413, (s16)0x158F, (s16)0x1708, | |
6 | ||
7 | (s16)0x187D, (s16)0x19EF, (s16)0x1B5D, (s16)0x1CC6, (s16)0x1E2B, (s16)0x1F8B, (s16)0x20E7, (s16)0x223D, | |
8 | ||
9 | (s16)0x238E, (s16)0x24DA, (s16)0x261F, (s16)0x275F, (s16)0x2899, (s16)0x29CD, (s16)0x2AFA, (s16)0x2C21, | |
10 | ||
11 | (s16)0x2D41, (s16)0x2E5A, (s16)0x2F6B, (s16)0x3076, (s16)0x3179, (s16)0x3274, (s16)0x3367, (s16)0x3453, | |
12 | ||
13 | (s16)0x3536, (s16)0x3612, (s16)0x36E5, (s16)0x37AF, (s16)0x3871, (s16)0x392A, (s16)0x39DA, (s16)0x3A82, | |
14 | ||
15 | (s16)0x3B20, (s16)0x3BB6, (s16)0x3C42, (s16)0x3CC5, (s16)0x3D3E, (s16)0x3DAE, (s16)0x3E14, (s16)0x3E71, | |
16 | ||
17 | (s16)0x3EC5, (s16)0x3F0E, (s16)0x3F4E, (s16)0x3F84, (s16)0x3FB1, (s16)0x3FD3, (s16)0x3FEC, (s16)0x3FFB, | |
18 | ||
19 | (s16)0x4000, (s16)0x3FFB, (s16)0x3FEC, (s16)0x3FD3, (s16)0x3FB1, (s16)0x3F84, (s16)0x3F4E, (s16)0x3F0E, | |
20 | ||
21 | (s16)0x3EC5, (s16)0x3E71, (s16)0x3E14, (s16)0x3DAE, (s16)0x3D3E, (s16)0x3CC5, (s16)0x3C42, (s16)0x3BB6, | |
22 | ||
23 | (s16)0x3B20, (s16)0x3A82, (s16)0x39DA, (s16)0x392A, (s16)0x3871, (s16)0x37AF, (s16)0x36E5, (s16)0x3612, | |
24 | ||
25 | (s16)0x3536, (s16)0x3453, (s16)0x3367, (s16)0x3274, (s16)0x3179, (s16)0x3076, (s16)0x2F6B, (s16)0x2E5A, | |
26 | ||
27 | (s16)0x2D41, (s16)0x2C21, (s16)0x2AFA, (s16)0x29CD, (s16)0x2899, (s16)0x275F, (s16)0x261F, (s16)0x24DA, | |
28 | ||
29 | (s16)0x238E, (s16)0x223D, (s16)0x20E7, (s16)0x1F8B, (s16)0x1E2B, (s16)0x1CC6, (s16)0x1B5D, (s16)0x19EF, | |
30 | ||
31 | (s16)0x187D, (s16)0x1708, (s16)0x158F, (s16)0x1413, (s16)0x1294, (s16)0x1111, (s16)0x0F8C, (s16)0x0E05, | |
32 | ||
33 | (s16)0x0C7C, (s16)0x0AF1, (s16)0x0964, (s16)0x07D5, (s16)0x0645, (s16)0x04B5, (s16)0x0323, (s16)0x0192, | |
34 | ||
35 | (s16)0x0000, (s16)0xFE6E, (s16)0xFCDD, (s16)0xFB4B, (s16)0xF9BB, (s16)0xF82B, (s16)0xF69C, (s16)0xF50F, | |
36 | ||
37 | (s16)0xF384, (s16)0xF1FB, (s16)0xF074, (s16)0xEEEF, (s16)0xED6C, (s16)0xEBED, (s16)0xEA71, (s16)0xE8F8, | |
38 | ||
39 | (s16)0xE783, (s16)0xE611, (s16)0xE4A3, (s16)0xE33A, (s16)0xE1D5, (s16)0xE075, (s16)0xDF19, (s16)0xDDC3, | |
40 | ||
41 | (s16)0xDC72, (s16)0xDB26, (s16)0xD9E1, (s16)0xD8A1, (s16)0xD767, (s16)0xD633, (s16)0xD506, (s16)0xD3DF, | |
42 | ||
43 | (s16)0xD2BF, (s16)0xD1A6, (s16)0xD095, (s16)0xCF8A, (s16)0xCE87, (s16)0xCD8C, (s16)0xCC99, (s16)0xCBAD, | |
44 | ||
45 | (s16)0xCACA, (s16)0xC9EE, (s16)0xC91B, (s16)0xC851, (s16)0xC78F, (s16)0xC6D6, (s16)0xC626, (s16)0xC57E, | |
46 | ||
47 | (s16)0xC4E0, (s16)0xC44A, (s16)0xC3BE, (s16)0xC33B, (s16)0xC2C2, (s16)0xC252, (s16)0xC1EC, (s16)0xC18F, | |
48 | ||
49 | (s16)0xC13B, (s16)0xC0F2, (s16)0xC0B2, (s16)0xC07C, (s16)0xC04F, (s16)0xC02D, (s16)0xC014, (s16)0xC005, | |
50 | ||
51 | (s16)0xC000, (s16)0xC005, (s16)0xC014, (s16)0xC02D, (s16)0xC04F, (s16)0xC07C, (s16)0xC0B2, (s16)0xC0F2, | |
52 | ||
53 | (s16)0xC13B, (s16)0xC18F, (s16)0xC1EC, (s16)0xC252, (s16)0xC2C2, (s16)0xC33B, (s16)0xC3BE, (s16)0xC44A, | |
54 | ||
55 | (s16)0xC4E0, (s16)0xC57E, (s16)0xC626, (s16)0xC6D6, (s16)0xC78F, (s16)0xC851, (s16)0xC91B, (s16)0xC9EE, | |
56 | ||
57 | (s16)0xCACA, (s16)0xCBAD, (s16)0xCC99, (s16)0xCD8C, (s16)0xCE87, (s16)0xCF8A, (s16)0xD095, (s16)0xD1A6, | |
58 | ||
59 | (s16)0xD2BF, (s16)0xD3DF, (s16)0xD506, (s16)0xD633, (s16)0xD767, (s16)0xD8A1, (s16)0xD9E1, (s16)0xDB26, | |
60 | ||
61 | (s16)0xDC72, (s16)0xDDC3, (s16)0xDF19, (s16)0xE075, (s16)0xE1D5, (s16)0xE33A, (s16)0xE4A3, (s16)0xE611, | |
62 | ||
63 | (s16)0xE783, (s16)0xE8F8, (s16)0xEA71, (s16)0xEBED, (s16)0xED6C, (s16)0xEEEF, (s16)0xF074, (s16)0xF1FB, | |
64 | ||
65 | (s16)0xF384, (s16)0xF50F, (s16)0xF69C, (s16)0xF82B, (s16)0xF9BB, (s16)0xFB4B, (s16)0xFCDD, (s16)0xFE6E | |
66 | ||
67 | }; | |
68 | ||
69 | ||
70 | ||
71 | void bios_halt() | |
72 | ||
73 | { | |
74 | ||
75 | }; | |
76 | ||
77 | ||
78 | ||
79 | int bios_sqrt(int b_value) | |
80 | ||
81 | { | |
82 | ||
83 | return sqrtf(b_value); | |
84 | ||
85 | }; | |
86 | ||
87 | ||
88 | ||
89 | void bios_cpuset(u32 b_source, u32 b_dest, u32 b_cnt) /* arm_r0, arm r1, arm_r2 */ | |
90 | ||
91 | { | |
92 | ||
93 | save_reg(); | |
94 | ||
95 | if(((b_source & 0xe000000) == 0) || | |
96 | ||
97 | ((b_source + (((b_cnt << 11)>>9) & 0x1FFFFF)) & 0xe000000) == 0) | |
98 | ||
99 | { | |
100 | ||
101 | load_reg(); | |
102 | ||
103 | return; | |
104 | ||
105 | } | |
106 | ||
107 | ||
108 | ||
109 | u32 b_count = b_cnt & 0x1FFFFF; | |
110 | ||
111 | ||
112 | ||
113 | // 32-bit ? | |
114 | ||
115 | if((b_cnt >> 26) & 1) { | |
116 | ||
117 | // needed for 32-bit mode! | |
118 | ||
119 | b_source &= 0x0FFFFFFC; | |
120 | ||
121 | b_dest &= 0x0FFFFFFC; | |
122 | ||
123 | // fill ? | |
124 | ||
125 | if((b_cnt >> 24) & 1) { | |
126 | ||
127 | u32 b_value = read_memory32(b_source); | |
128 | ||
129 | while(b_count) { | |
130 | ||
131 | write_memory32(b_dest, b_value); | |
132 | ||
133 | b_dest += 4; | |
134 | ||
135 | b_count--; | |
136 | ||
137 | } | |
138 | ||
139 | } else { | |
140 | ||
141 | // copy | |
142 | ||
143 | while(b_count) { | |
144 | ||
145 | u32 b_value = read_memory32(b_source); | |
146 | ||
147 | write_memory32(b_dest, b_value); | |
148 | ||
149 | b_source += 4; | |
150 | ||
151 | b_dest += 4; | |
152 | ||
153 | b_count--; | |
154 | ||
155 | } | |
156 | ||
157 | } | |
158 | ||
159 | } else { | |
160 | ||
161 | // 16-bit fill? | |
162 | ||
163 | if((b_cnt >> 24) & 1) { | |
164 | ||
165 | u16 b_value = read_memory16(b_source); | |
166 | ||
167 | while(b_count) { | |
168 | ||
169 | write_memory16(b_dest, b_value); | |
170 | ||
171 | b_dest += 2; | |
172 | ||
173 | b_count--; | |
174 | ||
175 | } | |
176 | ||
177 | } else { | |
178 | ||
179 | // copy | |
180 | ||
181 | while(b_count) { | |
182 | ||
183 | u16 b_value = read_memory16(b_source); | |
184 | ||
185 | write_memory16(b_dest, b_value); | |
186 | ||
187 | b_source += 2; | |
188 | ||
189 | b_dest += 2; | |
190 | ||
191 | b_count--; | |
192 | ||
193 | } | |
194 | ||
195 | } | |
196 | ||
197 | } | |
198 | ||
199 | load_reg(); | |
200 | ||
201 | } | |
202 | ||
203 | ||
204 | ||
205 | ||
206 | ||
207 | void bios_cpufastset(u32 b_source, u32 b_dest, u32 b_cnt) | |
208 | ||
209 | ||
210 | ||
211 | { | |
212 | ||
213 | save_reg(); | |
214 | ||
215 | if(((b_source & 0xe000000) == 0) || | |
216 | ||
217 | ((b_source + (((b_cnt << 11)>>9) & 0x1FFFFF)) & 0xe000000) == 0) | |
218 | ||
219 | { | |
220 | ||
221 | load_reg(); | |
222 | ||
223 | return; | |
224 | ||
225 | } | |
226 | ||
227 | // needed for 32-bit mode! | |
228 | ||
229 | b_source &= 0x0FFFFFFC; | |
230 | ||
231 | b_dest &= 0x0FFFFFFC; | |
232 | ||
233 | ||
234 | ||
235 | u32 b_count = b_cnt & 0x1FFFFF; | |
236 | ||
237 | u32 b_i; | |
238 | ||
239 | ||
240 | ||
241 | // fill? | |
242 | ||
243 | if((b_cnt >> 24) & 1) { | |
244 | ||
245 | while(b_count > 0) { | |
246 | ||
247 | // BIOS always transfers 32 bytes at a time | |
248 | ||
249 | u32 b_value = read_memory32(b_source); | |
250 | ||
251 | for(b_i = 0; b_i < 8; b_i++) { | |
252 | ||
253 | write_memory32(b_dest, b_value); | |
254 | ||
255 | b_dest += 4; | |
256 | ||
257 | } | |
258 | ||
259 | b_count -= 8; | |
260 | ||
261 | } | |
262 | ||
263 | } else { | |
264 | ||
265 | // copy | |
266 | ||
267 | while(b_count > 0) { | |
268 | ||
269 | // BIOS always transfers 32 bytes at a time | |
270 | ||
271 | for(b_i = 0; b_i < 8; b_i++) { | |
272 | ||
273 | u32 b_value = read_memory32(b_source); | |
274 | ||
275 | write_memory32(b_dest, b_value); | |
276 | ||
277 | b_source += 4; | |
278 | ||
279 | b_dest += 4; | |
280 | ||
281 | } | |
282 | ||
283 | b_count -= 8; | |
284 | ||
285 | } | |
286 | ||
287 | } | |
288 | ||
289 | load_reg(); | |
290 | ||
291 | } | |
292 | ||
293 | ||
294 | ||
295 | void bios_bgaffineset(u32 b_src, u32 b_dest, u32 b_num) | |
296 | ||
297 | ||
298 | ||
299 | { | |
300 | ||
301 | save_reg(); | |
302 | ||
303 | u32 b_i; | |
304 | ||
305 | for(b_i = 0; b_i < b_num; b_i++) { | |
306 | ||
307 | s32 b_cx = read_memory32(b_src); | |
308 | ||
309 | b_src+=4; | |
310 | ||
311 | s32 b_cy = read_memory32(b_src); | |
312 | ||
313 | b_src+=4; | |
314 | ||
315 | s16 b_dispx = read_memory16(b_src); | |
316 | ||
317 | b_src+=2; | |
318 | ||
319 | s16 b_dispy = read_memory16(b_src); | |
320 | ||
321 | b_src+=2; | |
322 | ||
323 | s16 b_rx = read_memory16(b_src); | |
324 | ||
325 | b_src+=2; | |
326 | ||
327 | s16 b_ry = read_memory16(b_src); | |
328 | ||
329 | b_src+=2; | |
330 | ||
331 | u16 b_theta = read_memory16(b_src)>>8; | |
332 | ||
333 | b_src+=4; // keep structure alignment | |
334 | ||
335 | s32 b_a = b_sinetable[(b_theta+0x40)&255]; | |
336 | ||
337 | s32 b_b = b_sinetable[b_theta]; | |
338 | ||
339 | ||
340 | ||
341 | s16 b_dx = (b_rx * b_a)>>14; | |
342 | ||
343 | s16 b_dmx = (b_rx * b_b)>>14; | |
344 | ||
345 | s16 b_dy = (b_ry * b_b)>>14; | |
346 | ||
347 | s16 b_dmy = (b_ry * b_a)>>14; | |
348 | ||
349 | ||
350 | ||
351 | write_memory16(b_dest, b_dx); | |
352 | ||
353 | b_dest += 2; | |
354 | ||
355 | write_memory16(b_dest, -b_dmx); | |
356 | ||
357 | b_dest += 2; | |
358 | ||
359 | write_memory16(b_dest, b_dy); | |
360 | ||
361 | b_dest += 2; | |
362 | ||
363 | write_memory16(b_dest, b_dmy); | |
364 | ||
365 | b_dest += 2; | |
366 | ||
367 | ||
368 | ||
369 | s32 b_startx = b_cx - b_dx * b_dispx + b_dmx * b_dispy; | |
370 | ||
371 | s32 b_starty = b_cy - b_dy * b_dispx - b_dmy * b_dispy; | |
372 | ||
373 | ||
374 | ||
375 | write_memory32(b_dest, b_startx); | |
376 | ||
377 | b_dest += 4; | |
378 | ||
379 | write_memory32(b_dest, b_starty); | |
380 | ||
381 | b_dest += 4; | |
382 | ||
383 | } | |
384 | ||
385 | load_reg(); | |
386 | ||
387 | } | |
388 | ||
389 | ||
390 | ||
391 | void bios_objaffineset(u32 b_src, u32 b_dest, u32 b_num, u32 b_offset) | |
392 | ||
393 | ||
394 | ||
395 | { | |
396 | ||
397 | save_reg(); | |
398 | ||
399 | u32 b_i; | |
400 | ||
401 | for(b_i = 0; b_i < b_num; b_i++) { | |
402 | ||
403 | s16 b_rx = read_memory16(b_src); | |
404 | ||
405 | b_src+=2; | |
406 | ||
407 | s16 b_ry = read_memory16(b_src); | |
408 | ||
409 | b_src+=2; | |
410 | ||
411 | u16 b_theta = read_memory16(b_src)>>8; | |
412 | ||
413 | b_src+=4; // keep structure alignment | |
414 | ||
415 | ||
416 | ||
417 | s32 b_a = (s32)b_sinetable[(b_theta+0x40)&255]; | |
418 | ||
419 | s32 b_b = (s32)b_sinetable[b_theta]; | |
420 | ||
421 | ||
422 | ||
423 | s16 b_dx = ((s32)b_rx * b_a)>>14; | |
424 | ||
425 | s16 b_dmx = ((s32)b_rx * b_b)>>14; | |
426 | ||
427 | s16 b_dy = ((s32)b_ry * b_b)>>14; | |
428 | ||
429 | s16 b_dmy = ((s32)b_ry * b_a)>>14; | |
430 | ||
431 | ||
432 | ||
433 | write_memory16(b_dest, b_dx); | |
434 | ||
435 | b_dest += b_offset; | |
436 | ||
437 | write_memory16(b_dest, -b_dmx); | |
438 | ||
439 | b_dest += b_offset; | |
440 | ||
441 | write_memory16(b_dest, b_dy); | |
442 | ||
443 | b_dest += b_offset; | |
444 | ||
445 | write_memory16(b_dest, b_dmy); | |
446 | ||
447 | b_dest += b_offset; | |
448 | ||
449 | } | |
450 | ||
451 | load_reg(); | |
452 | ||
453 | } | |
454 |