View difference between Paste ID: 5a1jJE1d and Ymg1X5dg
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