diff options
Diffstat (limited to 'apps/plugins/rockboy')
47 files changed, 4876 insertions, 5400 deletions
diff --git a/apps/plugins/rockboy/Makefile b/apps/plugins/rockboy/Makefile index e4c62666fb..2859936d15 100644 --- a/apps/plugins/rockboy/Makefile +++ b/apps/plugins/rockboy/Makefile | |||
@@ -18,11 +18,9 @@ endif | |||
18 | 18 | ||
19 | LINKFILE := $(OBJDIR)/link.lds | 19 | LINKFILE := $(OBJDIR)/link.lds |
20 | DEPFILE = $(OBJDIR)/dep-rockboy | 20 | DEPFILE = $(OBJDIR)/dep-rockboy |
21 | SRC = cpu.c emu.c events.c exports.c fastmem.c hw.c lcd.c lcdc.c loader.c \ | 21 | SRC = cpu.c emu.c events.c fastmem.c hw.c lcd.c lcdc.c loader.c main.c \ |
22 | main.c mem.c rbsound.c rccmds.c rcvars.c rtc.c save.c sound.c split.c \ | 22 | mem.c menu.c rbsound.c rockboy.c rtc.c save.c sound.c sys_rockbox.c |
23 | sys_rockbox.c rockboy.c menu.c | ||
24 | 23 | ||
25 | #CFLAGS += -DGRAYSCALE | ||
26 | #CFLAGS += -DDYNAREC | 24 | #CFLAGS += -DDYNAREC |
27 | #SRC += dynarec.c | 25 | #SRC += dynarec.c |
28 | 26 | ||
@@ -30,7 +28,6 @@ SOURCES = $(SRC) | |||
30 | OBJS := $(SRC:%.c=$(OBJDIR)/%.o) | 28 | OBJS := $(SRC:%.c=$(OBJDIR)/%.o) |
31 | DIRS = . | 29 | DIRS = . |
32 | 30 | ||
33 | |||
34 | ifndef SIMVER | 31 | ifndef SIMVER |
35 | ifneq (,$(findstring RECORDER,$(TARGET))) ## Archos recorder targets | 32 | ifneq (,$(findstring RECORDER,$(TARGET))) ## Archos recorder targets |
36 | LDS := archos.lds | 33 | LDS := archos.lds |
diff --git a/apps/plugins/rockboy/Version b/apps/plugins/rockboy/Version deleted file mode 100644 index 0b12c4271d..0000000000 --- a/apps/plugins/rockboy/Version +++ /dev/null | |||
@@ -1,5 +0,0 @@ | |||
1 | #define VERSION "1.0.3" /* | ||
2 | VERSION = 1.0.3 | ||
3 | # */ | ||
4 | |||
5 | |||
diff --git a/apps/plugins/rockboy/cpu-gb.h b/apps/plugins/rockboy/cpu-gb.h index dfb8734823..bbd6c84e59 100644 --- a/apps/plugins/rockboy/cpu-gb.h +++ b/apps/plugins/rockboy/cpu-gb.h | |||
@@ -10,24 +10,24 @@ | |||
10 | 10 | ||
11 | union reg | 11 | union reg |
12 | { | 12 | { |
13 | byte b[2][2]; | 13 | byte b[2][2]; |
14 | word w[2]; | 14 | word w[2]; |
15 | un32 d; /* padding for alignment, carry */ | 15 | un32 d; /* padding for alignment, carry */ |
16 | }; | 16 | }; |
17 | 17 | ||
18 | struct cpu | 18 | struct cpu |
19 | { | 19 | { |
20 | #ifdef DYNAREC | 20 | #ifdef DYNAREC |
21 | union reg a,b,c,d,e,hl,f,sp,pc; | 21 | union reg a,b,c,d,e,hl,f,sp,pc; |
22 | #else | 22 | #else |
23 | union reg pc, sp, bc, de, hl, af; | 23 | union reg pc, sp, bc, de, hl, af; |
24 | #endif | 24 | #endif |
25 | int ime, ima; | 25 | int ime, ima; |
26 | int speed; | 26 | int speed; |
27 | int halt; | 27 | int halt; |
28 | int div, tim; | 28 | int div, tim; |
29 | int lcdc; | 29 | int lcdc; |
30 | int snd; | 30 | int snd; |
31 | }; | 31 | }; |
32 | 32 | ||
33 | extern struct cpu cpu; | 33 | extern struct cpu cpu; |
@@ -54,6 +54,6 @@ void lcdc_advance(int cnt) ICODE_ATTR; | |||
54 | void sound_advance(int cnt) ICODE_ATTR; | 54 | void sound_advance(int cnt) ICODE_ATTR; |
55 | void cpu_timers(int cnt) ICODE_ATTR; | 55 | void cpu_timers(int cnt) ICODE_ATTR; |
56 | int cpu_emulate(int cycles) ICODE_ATTR; | 56 | int cpu_emulate(int cycles) ICODE_ATTR; |
57 | inline int cpu_step(int max); | 57 | inline int cpu_step(int max) ICODE_ATTR; |
58 | 58 | ||
59 | #endif | 59 | #endif |
diff --git a/apps/plugins/rockboy/cpu.c b/apps/plugins/rockboy/cpu.c index 3c295dcdf5..00cfc42684 100644 --- a/apps/plugins/rockboy/cpu.c +++ b/apps/plugins/rockboy/cpu.c | |||
@@ -17,19 +17,12 @@ | |||
17 | struct cpu cpu IBSS_ATTR; | 17 | struct cpu cpu IBSS_ATTR; |
18 | 18 | ||
19 | 19 | ||
20 | |||
21 | |||
22 | #define ZFLAG(n) ( (n) ? 0 : FZ ) | 20 | #define ZFLAG(n) ( (n) ? 0 : FZ ) |
23 | 21 | ||
24 | 22 | ||
25 | #define PUSH(w) ( (SP -= 2), (writew(xSP, (w))) ) | 23 | #define PUSH(w) ( (SP -= 2), (writew(xSP, (w))) ) |
26 | #define POP(w) ( ((w) = readw(xSP)), (SP += 2) ) | 24 | #define POP(w) ( ((w) = readw(xSP)), (SP += 2) ) |
27 | 25 | ||
28 | |||
29 | #define FETCH_OLD ( mbc.rmap[PC>>12] \ | ||
30 | ? mbc.rmap[PC>>12][PC++] \ | ||
31 | : mem_read(PC++) ) | ||
32 | |||
33 | #define FETCH (readb(PC++)) | 26 | #define FETCH (readb(PC++)) |
34 | 27 | ||
35 | 28 | ||
@@ -227,7 +220,7 @@ label: op(b); break; | |||
227 | #define RET ( POP(PC) ) | 220 | #define RET ( POP(PC) ) |
228 | 221 | ||
229 | #define EI ( IMA = 1 ) | 222 | #define EI ( IMA = 1 ) |
230 | #define DI ( cpu.halt = IMA = IME = 0 ) | 223 | #define DI ( IMA = IME = 0 ) |
231 | 224 | ||
232 | 225 | ||
233 | 226 | ||
@@ -246,127 +239,122 @@ int blockcount; | |||
246 | 239 | ||
247 | void cpu_reset(void) | 240 | void cpu_reset(void) |
248 | { | 241 | { |
249 | union reg acc; | 242 | union reg acc; |
250 | #ifdef DYNAREC | 243 | #ifdef DYNAREC |
251 | int i; | 244 | int i; |
252 | dynapointer=0; | 245 | dynapointer=0; |
253 | #endif | 246 | #endif |
254 | cpu.speed = 0; | 247 | cpu.speed = 0; |
255 | cpu.halt = 0; | 248 | cpu.halt = 0; |
256 | cpu.div = 0; | 249 | cpu.div = 0; |
257 | cpu.tim = 0; | 250 | cpu.tim = 0; |
258 | cpu.lcdc = 40; | 251 | cpu.lcdc = 40; |
259 | 252 | ||
260 | IME = 0; | 253 | IME = 0; |
261 | IMA = 0; | 254 | IMA = 0; |
262 | 255 | ||
263 | PC = 0x0100; | 256 | PC = 0x0100; |
264 | SP = 0xFFFE; | 257 | SP = 0xFFFE; |
265 | W(acc) = 0x01B0; | 258 | W(acc) = 0x01B0; |
266 | A=HB(acc); | 259 | A=HB(acc); |
267 | F=LB(acc); | 260 | F=LB(acc); |
268 | W(acc) = 0x0013; | 261 | W(acc) = 0x0013; |
269 | B=HB(acc); | 262 | B=HB(acc); |
270 | C=LB(acc); | 263 | C=LB(acc); |
271 | W(acc) = 0x00D8; | 264 | W(acc) = 0x00D8; |
272 | D=HB(acc); | 265 | D=HB(acc); |
273 | E=LB(acc); | 266 | E=LB(acc); |
274 | HL = 0x014D; | 267 | HL = 0x014D; |
275 | 268 | ||
276 | if (hw.cgb) A = 0x11; | 269 | if (hw.cgb) A = 0x11; |
277 | if (hw.gba) B = 0x01; | ||
278 | #ifdef DYNAREC | 270 | #ifdef DYNAREC |
279 | for(i=0;i<(1<<HASH_SIGNIFICANT_LOWER_BITS);i++) | 271 | for(i=0;i<(1<<HASH_SIGNIFICANT_LOWER_BITS);i++) |
280 | address_map[i]=0; | 272 | address_map[i]=0; |
281 | #endif | 273 | #endif |
282 | } | 274 | } |
283 | 275 | ||
284 | 276 | ||
285 | void div_advance(int cnt) | 277 | void div_advance(int cnt) |
286 | { | 278 | { |
287 | cpu.div += (cnt<<1); | 279 | cpu.div += (cnt<<1); |
288 | if (cpu.div >= 256) | 280 | if (cpu.div >= 256) |
289 | { | 281 | { |
290 | R_DIV += (cpu.div >> 8); | 282 | R_DIV += (cpu.div >> 8); |
291 | cpu.div &= 0xff; | 283 | cpu.div &= 0xff; |
292 | } | 284 | } |
293 | } | 285 | } |
294 | 286 | ||
295 | void timer_advance(int cnt) | 287 | void timer_advance(int cnt) |
296 | { | 288 | { |
297 | int unit, tima; | 289 | int unit, tima; |
298 | 290 | ||
299 | if (!(R_TAC & 0x04)) return; | 291 | if (!(R_TAC & 0x04)) return; |
300 | 292 | ||
301 | unit = ((-R_TAC) & 3) << 1; | 293 | unit = ((-R_TAC) & 3) << 1; |
302 | cpu.tim += (cnt<<unit); | 294 | cpu.tim += (cnt<<unit); |
303 | 295 | ||
304 | if (cpu.tim >= 512) | 296 | if (cpu.tim >= 512) |
305 | { | 297 | { |
306 | tima = R_TIMA + (cpu.tim >> 9); | 298 | tima = R_TIMA + (cpu.tim >> 9); |
307 | cpu.tim &= 0x1ff; | 299 | cpu.tim &= 0x1ff; |
308 | if (tima >= 256) | 300 | if (tima >= 256) |
309 | { | 301 | { |
310 | hw_interrupt(IF_TIMER, IF_TIMER); | 302 | hw_interrupt(IF_TIMER, IF_TIMER); |
311 | hw_interrupt(0, IF_TIMER); | 303 | hw_interrupt(0, IF_TIMER); |
312 | } | 304 | } |
313 | while (tima >= 256) | 305 | while (tima >= 256) |
314 | tima = tima - 256 + R_TMA; | 306 | tima = tima - 256 + R_TMA; |
315 | R_TIMA = tima; | 307 | R_TIMA = tima; |
316 | } | 308 | } |
317 | } | 309 | } |
318 | 310 | ||
319 | void lcdc_advance(int cnt) | 311 | void lcdc_advance(int cnt) |
320 | { | 312 | { |
321 | cpu.lcdc -= cnt; | 313 | cpu.lcdc -= cnt; |
322 | if (cpu.lcdc <= 0) lcdc_trans(); | 314 | if (cpu.lcdc <= 0) lcdc_trans(); |
323 | } | 315 | } |
324 | 316 | ||
325 | void sound_advance(int cnt) | 317 | void sound_advance(int cnt) |
326 | { | 318 | { |
327 | cpu.snd += cnt; | 319 | cpu.snd += cnt; |
328 | } | 320 | } |
329 | 321 | ||
330 | void cpu_timers(int cnt) | 322 | void cpu_timers(int cnt) |
331 | { | 323 | { |
332 | div_advance(cnt << cpu.speed); | 324 | div_advance(cnt << cpu.speed); |
333 | timer_advance(cnt << cpu.speed); | 325 | timer_advance(cnt << cpu.speed); |
334 | lcdc_advance(cnt); | 326 | lcdc_advance(cnt); |
335 | sound_advance(cnt); | 327 | if(options.sound) |
328 | sound_advance(cnt); | ||
336 | } | 329 | } |
337 | 330 | ||
338 | int cpu_idle(int max) | 331 | int cpu_idle(int max) |
339 | { | 332 | { |
340 | int cnt, unit; | 333 | int cnt, unit; |
341 | 334 | ||
342 | if (!(cpu.halt && IME)) return 0; | 335 | if (!(cpu.halt && IME)) return 0; |
343 | if (R_IF & R_IE) | 336 | |
344 | { | 337 | /* Make sure we don't miss lcdc status events! */ |
345 | cpu.halt = 0; | 338 | if ((R_IE & (IF_VBLANK | IF_STAT)) && (max > cpu.lcdc)) |
346 | return 0; | 339 | max = cpu.lcdc; |
347 | } | 340 | |
348 | 341 | /* If timer interrupt cannot happen, this is very simple! */ | |
349 | /* Make sure we don't miss lcdc status events! */ | 342 | if (!((R_IE & IF_TIMER) && (R_TAC & 0x04))) |
350 | if ((R_IE & (IF_VBLANK | IF_STAT)) && (max > cpu.lcdc)) | 343 | { |
351 | max = cpu.lcdc; | 344 | cpu_timers(max); |
352 | 345 | return max; | |
353 | /* If timer interrupt cannot happen, this is very simple! */ | 346 | } |
354 | if (!((R_IE & IF_TIMER) && (R_TAC & 0x04))) | 347 | |
355 | { | 348 | /* Figure out when the next timer interrupt will happen */ |
356 | cpu_timers(max); | 349 | unit = ((-R_TAC) & 3) << 1; |
357 | return max; | 350 | cnt = (511 - cpu.tim + (1<<unit)) >> unit; |
358 | } | 351 | cnt += (255 - R_TIMA) << (9 - unit); |
359 | 352 | ||
360 | /* Figure out when the next timer interrupt will happen */ | 353 | if (max < cnt) |
361 | unit = ((-R_TAC) & 3) << 1; | 354 | cnt = max; |
362 | cnt = (511 - cpu.tim + (1<<unit)) >> unit; | 355 | |
363 | cnt += (255 - R_TIMA) << (9 - unit); | 356 | cpu_timers(cnt); |
364 | 357 | return cnt; | |
365 | if (max < cnt) | ||
366 | cnt = max; | ||
367 | |||
368 | cpu_timers(cnt); | ||
369 | return cnt; | ||
370 | } | 358 | } |
371 | 359 | ||
372 | #ifndef ASM_CPU_EMULATE | 360 | #ifndef ASM_CPU_EMULATE |
@@ -375,627 +363,636 @@ extern int debug_trace; | |||
375 | 363 | ||
376 | int cpu_emulate(int cycles) | 364 | int cpu_emulate(int cycles) |
377 | { | 365 | { |
378 | int i; | 366 | int i; |
379 | byte op, cbop; | 367 | static byte op IBSS_ATTR; |
380 | int clen; | 368 | static byte cbop IBSS_ATTR; |
381 | static union reg acc; | 369 | int clen; |
382 | static byte b IBSS_ATTR; | 370 | static union reg acc IBSS_ATTR; |
383 | static word w IBSS_ATTR; | 371 | static byte b IBSS_ATTR; |
384 | 372 | static word w IBSS_ATTR; | |
385 | i = cycles; | 373 | |
374 | i = cycles; | ||
386 | next: | 375 | next: |
387 | #ifdef DYNAREC | 376 | #ifdef DYNAREC |
388 | if(shut) | 377 | if(shut) |
389 | return cycles-i; | 378 | return cycles-i; |
390 | #endif | 379 | #endif |
391 | if ((clen = cpu_idle(i))) | 380 | if ((clen = cpu_idle(i))) |
392 | { | 381 | { |
393 | i -= clen; | 382 | i -= clen; |
394 | if (i > 0) goto next; | 383 | if (i > 0) goto next; |
395 | return cycles-i; | 384 | return cycles-i; |
396 | } | 385 | } |
397 | 386 | ||
398 | if (IME && (IF & IE)) | 387 | if (IME && (IF & IE)) |
399 | { | 388 | { |
400 | PRE_INT; | 389 | PRE_INT; |
401 | switch ((byte)(IF & IE)) | 390 | switch ((byte)(IF & IE)) |
402 | { | 391 | { |
403 | case 0x01: case 0x03: case 0x05: case 0x07: | 392 | case 0x01: case 0x03: case 0x05: case 0x07: |
404 | case 0x09: case 0x0B: case 0x0D: case 0x0F: | 393 | case 0x09: case 0x0B: case 0x0D: case 0x0F: |
405 | case 0x11: case 0x13: case 0x15: case 0x17: | 394 | case 0x11: case 0x13: case 0x15: case 0x17: |
406 | case 0x19: case 0x1B: case 0x1D: case 0x1F: | 395 | case 0x19: case 0x1B: case 0x1D: case 0x1F: |
407 | THROW_INT(0); break; | 396 | THROW_INT(0); break; |
408 | case 0x02: case 0x06: case 0x0A: case 0x0E: | 397 | case 0x02: case 0x06: case 0x0A: case 0x0E: |
409 | case 0x12: case 0x16: case 0x1A: case 0x1E: | 398 | case 0x12: case 0x16: case 0x1A: case 0x1E: |
410 | THROW_INT(1); break; | 399 | THROW_INT(1); break; |
411 | case 0x04: case 0x0C: case 0x14: case 0x1C: | 400 | case 0x04: case 0x0C: case 0x14: case 0x1C: |
412 | THROW_INT(2); break; | 401 | THROW_INT(2); break; |
413 | case 0x08: case 0x18: | 402 | case 0x08: case 0x18: |
414 | THROW_INT(3); break; | 403 | THROW_INT(3); break; |
415 | case 0x10: | 404 | case 0x10: |
416 | THROW_INT(4); break; | 405 | THROW_INT(4); break; |
417 | } | 406 | } |
418 | } | 407 | } |
419 | IME = IMA; | 408 | IME = IMA; |
420 | 409 | ||
421 | /* if (debug_trace) debug_disassemble(PC, 1); */ | 410 | /* if (debug_trace) debug_disassemble(PC, 1); */ |
422 | #ifdef DYNAREC | 411 | #ifdef DYNAREC |
423 | if(PC&0x8000) { | 412 | if(PC&0x8000) { |
424 | #endif | 413 | #endif |
425 | op = FETCH; | 414 | op = FETCH; |
426 | clen = cycles_table[op]; | 415 | clen = cycles_table[op]; |
427 | 416 | ||
428 | switch(op) | 417 | switch(op) |
429 | { | 418 | { |
430 | case 0x00: /* NOP */ | 419 | case 0x00: /* NOP */ |
431 | case 0x40: /* LD B,B */ | 420 | case 0x40: /* LD B,B */ |
432 | case 0x49: /* LD C,C */ | 421 | case 0x49: /* LD C,C */ |
433 | case 0x52: /* LD D,D */ | 422 | case 0x52: /* LD D,D */ |
434 | case 0x5B: /* LD E,E */ | 423 | case 0x5B: /* LD E,E */ |
435 | case 0x64: /* LD H,H */ | 424 | case 0x64: /* LD H,H */ |
436 | case 0x6D: /* LD L,L */ | 425 | case 0x6D: /* LD L,L */ |
437 | case 0x7F: /* LD A,A */ | 426 | case 0x7F: /* LD A,A */ |
438 | break; | 427 | break; |
439 | 428 | ||
440 | case 0x41: /* LD B,C */ | 429 | case 0x41: /* LD B,C */ |
441 | B = C; break; | 430 | B = C; break; |
442 | case 0x42: /* LD B,D */ | 431 | case 0x42: /* LD B,D */ |
443 | B = D; break; | 432 | B = D; break; |
444 | case 0x43: /* LD B,E */ | 433 | case 0x43: /* LD B,E */ |
445 | B = E; break; | 434 | B = E; break; |
446 | case 0x44: /* LD B,H */ | 435 | case 0x44: /* LD B,H */ |
447 | B = H; break; | 436 | B = H; break; |
448 | case 0x45: /* LD B,L */ | 437 | case 0x45: /* LD B,L */ |
449 | B = L; break; | 438 | B = L; break; |
450 | case 0x46: /* LD B,(HL) */ | 439 | case 0x46: /* LD B,(HL) */ |
451 | B = readb(xHL); break; | 440 | B = readb(xHL); break; |
452 | case 0x47: /* LD B,A */ | 441 | case 0x47: /* LD B,A */ |
453 | B = A; break; | 442 | B = A; break; |
454 | 443 | ||
455 | case 0x48: /* LD C,B */ | 444 | case 0x48: /* LD C,B */ |
456 | C = B; break; | 445 | C = B; break; |
457 | case 0x4A: /* LD C,D */ | 446 | case 0x4A: /* LD C,D */ |
458 | C = D; break; | 447 | C = D; break; |
459 | case 0x4B: /* LD C,E */ | 448 | case 0x4B: /* LD C,E */ |
460 | C = E; break; | 449 | C = E; break; |
461 | case 0x4C: /* LD C,H */ | 450 | case 0x4C: /* LD C,H */ |
462 | C = H; break; | 451 | C = H; break; |
463 | case 0x4D: /* LD C,L */ | 452 | case 0x4D: /* LD C,L */ |
464 | C = L; break; | 453 | C = L; break; |
465 | case 0x4E: /* LD C,(HL) */ | 454 | case 0x4E: /* LD C,(HL) */ |
466 | C = readb(xHL); break; | 455 | C = readb(xHL); break; |
467 | case 0x4F: /* LD C,A */ | 456 | case 0x4F: /* LD C,A */ |
468 | C = A; break; | 457 | C = A; break; |
469 | 458 | ||
470 | case 0x50: /* LD D,B */ | 459 | case 0x50: /* LD D,B */ |
471 | D = B; break; | 460 | D = B; break; |
472 | case 0x51: /* LD D,C */ | 461 | case 0x51: /* LD D,C */ |
473 | D = C; break; | 462 | D = C; break; |
474 | case 0x53: /* LD D,E */ | 463 | case 0x53: /* LD D,E */ |
475 | D = E; break; | 464 | D = E; break; |
476 | case 0x54: /* LD D,H */ | 465 | case 0x54: /* LD D,H */ |
477 | D = H; break; | 466 | D = H; break; |
478 | case 0x55: /* LD D,L */ | 467 | case 0x55: /* LD D,L */ |
479 | D = L; break; | 468 | D = L; break; |
480 | case 0x56: /* LD D,(HL) */ | 469 | case 0x56: /* LD D,(HL) */ |
481 | D = readb(xHL); break; | 470 | D = readb(xHL); break; |
482 | case 0x57: /* LD D,A */ | 471 | case 0x57: /* LD D,A */ |
483 | D = A; break; | 472 | D = A; break; |
484 | 473 | ||
485 | case 0x58: /* LD E,B */ | 474 | case 0x58: /* LD E,B */ |
486 | E = B; break; | 475 | E = B; break; |
487 | case 0x59: /* LD E,C */ | 476 | case 0x59: /* LD E,C */ |
488 | E = C; break; | 477 | E = C; break; |
489 | case 0x5A: /* LD E,D */ | 478 | case 0x5A: /* LD E,D */ |
490 | E = D; break; | 479 | E = D; break; |
491 | case 0x5C: /* LD E,H */ | 480 | case 0x5C: /* LD E,H */ |
492 | E = H; break; | 481 | E = H; break; |
493 | case 0x5D: /* LD E,L */ | 482 | case 0x5D: /* LD E,L */ |
494 | E = L; break; | 483 | E = L; break; |
495 | case 0x5E: /* LD E,(HL) */ | 484 | case 0x5E: /* LD E,(HL) */ |
496 | E = readb(xHL); break; | 485 | E = readb(xHL); break; |
497 | case 0x5F: /* LD E,A */ | 486 | case 0x5F: /* LD E,A */ |
498 | E = A; break; | 487 | E = A; break; |
499 | 488 | ||
500 | case 0x60: /* LD H,B */ | 489 | case 0x60: /* LD H,B */ |
501 | H = B; break; | 490 | H = B; break; |
502 | case 0x61: /* LD H,C */ | 491 | case 0x61: /* LD H,C */ |
503 | H = C; break; | 492 | H = C; break; |
504 | case 0x62: /* LD H,D */ | 493 | case 0x62: /* LD H,D */ |
505 | H = D; break; | 494 | H = D; break; |
506 | case 0x63: /* LD H,E */ | 495 | case 0x63: /* LD H,E */ |
507 | H = E; break; | 496 | H = E; break; |
508 | case 0x65: /* LD H,L */ | 497 | case 0x65: /* LD H,L */ |
509 | H = L; break; | 498 | H = L; break; |
510 | case 0x66: /* LD H,(HL) */ | 499 | case 0x66: /* LD H,(HL) */ |
511 | H = readb(xHL); break; | 500 | H = readb(xHL); break; |
512 | case 0x67: /* LD H,A */ | 501 | case 0x67: /* LD H,A */ |
513 | H = A; break; | 502 | H = A; break; |
514 | 503 | ||
515 | case 0x68: /* LD L,B */ | 504 | case 0x68: /* LD L,B */ |
516 | L = B; break; | 505 | L = B; break; |
517 | case 0x69: /* LD L,C */ | 506 | case 0x69: /* LD L,C */ |
518 | L = C; break; | 507 | L = C; break; |
519 | case 0x6A: /* LD L,D */ | 508 | case 0x6A: /* LD L,D */ |
520 | L = D; break; | 509 | L = D; break; |
521 | case 0x6B: /* LD L,E */ | 510 | case 0x6B: /* LD L,E */ |
522 | L = E; break; | 511 | L = E; break; |
523 | case 0x6C: /* LD L,H */ | 512 | case 0x6C: /* LD L,H */ |
524 | L = H; break; | 513 | L = H; break; |
525 | case 0x6E: /* LD L,(HL) */ | 514 | case 0x6E: /* LD L,(HL) */ |
526 | L = readb(xHL); break; | 515 | L = readb(xHL); break; |
527 | case 0x6F: /* LD L,A */ | 516 | case 0x6F: /* LD L,A */ |
528 | L = A; break; | 517 | L = A; break; |
529 | 518 | ||
530 | case 0x70: /* LD (HL),B */ | 519 | case 0x70: /* LD (HL),B */ |
531 | b = B; goto __LD_HL; | 520 | b = B; goto __LD_HL; |
532 | case 0x71: /* LD (HL),C */ | 521 | case 0x71: /* LD (HL),C */ |
533 | b = C; goto __LD_HL; | 522 | b = C; goto __LD_HL; |
534 | case 0x72: /* LD (HL),D */ | 523 | case 0x72: /* LD (HL),D */ |
535 | b = D; goto __LD_HL; | 524 | b = D; goto __LD_HL; |
536 | case 0x73: /* LD (HL),E */ | 525 | case 0x73: /* LD (HL),E */ |
537 | b = E; goto __LD_HL; | 526 | b = E; goto __LD_HL; |
538 | case 0x74: /* LD (HL),H */ | 527 | case 0x74: /* LD (HL),H */ |
539 | b = H; goto __LD_HL; | 528 | b = H; goto __LD_HL; |
540 | case 0x75: /* LD (HL),L */ | 529 | case 0x75: /* LD (HL),L */ |
541 | b = L; goto __LD_HL; | 530 | b = L; goto __LD_HL; |
542 | case 0x77: /* LD (HL),A */ | 531 | case 0x77: /* LD (HL),A */ |
543 | b = A; | 532 | b = A; |
544 | __LD_HL: | 533 | __LD_HL: |
545 | writeb(xHL,b); | 534 | writeb(xHL,b); |
546 | break; | 535 | break; |
547 | 536 | ||
548 | case 0x78: /* LD A,B */ | 537 | case 0x78: /* LD A,B */ |
549 | A = B; break; | 538 | A = B; break; |
550 | case 0x79: /* LD A,C */ | 539 | case 0x79: /* LD A,C */ |
551 | A = C; break; | 540 | A = C; break; |
552 | case 0x7A: /* LD A,D */ | 541 | case 0x7A: /* LD A,D */ |
553 | A = D; break; | 542 | A = D; break; |
554 | case 0x7B: /* LD A,E */ | 543 | case 0x7B: /* LD A,E */ |
555 | A = E; break; | 544 | A = E; break; |
556 | case 0x7C: /* LD A,H */ | 545 | case 0x7C: /* LD A,H */ |
557 | A = H; break; | 546 | A = H; break; |
558 | case 0x7D: /* LD A,L */ | 547 | case 0x7D: /* LD A,L */ |
559 | A = L; break; | 548 | A = L; break; |
560 | case 0x7E: /* LD A,(HL) */ | 549 | case 0x7E: /* LD A,(HL) */ |
561 | A = readb(xHL); break; | 550 | A = readb(xHL); break; |
562 | 551 | ||
563 | case 0x01: /* LD BC,imm */ | 552 | case 0x01: /* LD BC,imm */ |
564 | #ifdef DYNAREC | 553 | #ifdef DYNAREC |
565 | W(acc) = readw(xPC); | 554 | W(acc) = readw(xPC); |
566 | B=HB(acc); | 555 | B=HB(acc); |
567 | C=LB(acc); | 556 | C=LB(acc); |
568 | #else | 557 | #else |
569 | BC = readw(xPC); | 558 | BC = readw(xPC); |
570 | #endif | 559 | #endif |
571 | PC += 2; | 560 | PC += 2; |
572 | break; | 561 | break; |
573 | case 0x11: /* LD DE,imm */ | 562 | case 0x11: /* LD DE,imm */ |
574 | #ifdef DYNAREC | 563 | #ifdef DYNAREC |
575 | W(acc) = readw(xPC); | 564 | W(acc) = readw(xPC); |
576 | D=HB(acc); | 565 | D=HB(acc); |
577 | E=LB(acc); | 566 | E=LB(acc); |
578 | #else | 567 | #else |
579 | DE = readw(xPC); | 568 | DE = readw(xPC); |
580 | #endif | 569 | #endif |
581 | PC += 2; | 570 | PC += 2; |
582 | break; | 571 | break; |
583 | case 0x21: /* LD HL,imm */ | 572 | case 0x21: /* LD HL,imm */ |
584 | HL = readw(xPC); PC += 2; break; | 573 | HL = readw(xPC); PC += 2; break; |
585 | case 0x31: /* LD SP,imm */ | 574 | case 0x31: /* LD SP,imm */ |
586 | SP = readw(xPC); PC += 2; break; | 575 | SP = readw(xPC); PC += 2; break; |
587 | 576 | ||
588 | case 0x02: /* LD (BC),A */ | 577 | case 0x02: /* LD (BC),A */ |
589 | writeb(xBC, A); break; | 578 | writeb(xBC, A); break; |
590 | case 0x0A: /* LD A,(BC) */ | 579 | case 0x0A: /* LD A,(BC) */ |
591 | A = readb(xBC); break; | 580 | A = readb(xBC); break; |
592 | case 0x12: /* LD (DE),A */ | 581 | case 0x12: /* LD (DE),A */ |
593 | writeb(xDE, A); break; | 582 | writeb(xDE, A); break; |
594 | case 0x1A: /* LD A,(DE) */ | 583 | case 0x1A: /* LD A,(DE) */ |
595 | A = readb(xDE); break; | 584 | A = readb(xDE); break; |
596 | 585 | ||
597 | case 0x22: /* LDI (HL),A */ | 586 | case 0x22: /* LDI (HL),A */ |
598 | writeb(xHL, A); HL++; break; | 587 | writeb(xHL, A); HL++; break; |
599 | case 0x2A: /* LDI A,(HL) */ | 588 | case 0x2A: /* LDI A,(HL) */ |
600 | A = readb(xHL); HL++; break; | 589 | A = readb(xHL); HL++; break; |
601 | case 0x32: /* LDD (HL),A */ | 590 | case 0x32: /* LDD (HL),A */ |
602 | writeb(xHL, A); HL--; break; | 591 | writeb(xHL, A); HL--; break; |
603 | case 0x3A: /* LDD A,(HL) */ | 592 | case 0x3A: /* LDD A,(HL) */ |
604 | A = readb(xHL); HL--; break; | 593 | A = readb(xHL); HL--; break; |
605 | 594 | ||
606 | case 0x06: /* LD B,imm */ | 595 | case 0x06: /* LD B,imm */ |
607 | B = FETCH; break; | 596 | B = FETCH; break; |
608 | case 0x0E: /* LD C,imm */ | 597 | case 0x0E: /* LD C,imm */ |
609 | C = FETCH; break; | 598 | C = FETCH; break; |
610 | case 0x16: /* LD D,imm */ | 599 | case 0x16: /* LD D,imm */ |
611 | D = FETCH; break; | 600 | D = FETCH; break; |
612 | case 0x1E: /* LD E,imm */ | 601 | case 0x1E: /* LD E,imm */ |
613 | E = FETCH; break; | 602 | E = FETCH; break; |
614 | case 0x26: /* LD H,imm */ | 603 | case 0x26: /* LD H,imm */ |
615 | H = FETCH; break; | 604 | H = FETCH; break; |
616 | case 0x2E: /* LD L,imm */ | 605 | case 0x2E: /* LD L,imm */ |
617 | L = FETCH; break; | 606 | L = FETCH; break; |
618 | case 0x36: /* LD (HL),imm */ | 607 | case 0x36: /* LD (HL),imm */ |
619 | b = FETCH; writeb(xHL, b); break; | 608 | b = FETCH; writeb(xHL, b); break; |
620 | case 0x3E: /* LD A,imm */ | 609 | case 0x3E: /* LD A,imm */ |
621 | A = FETCH; break; | 610 | A = FETCH; break; |
622 | 611 | ||
623 | case 0x08: /* LD (imm),SP */ | 612 | case 0x08: /* LD (imm),SP */ |
624 | writew(readw(xPC), SP); PC += 2; break; | 613 | writew(readw(xPC), SP); PC += 2; break; |
625 | case 0xEA: /* LD (imm),A */ | 614 | case 0xEA: /* LD (imm),A */ |
626 | writeb(readw(xPC), A); PC += 2; break; | 615 | writeb(readw(xPC), A); PC += 2; break; |
627 | 616 | ||
628 | case 0xE0: /* LDH (imm),A */ | 617 | case 0xE0: /* LDH (imm),A */ |
629 | writehi(FETCH, A); break; | 618 | writehi(FETCH, A); break; |
630 | case 0xE2: /* LDH (C),A */ | 619 | case 0xE2: /* LDH (C),A */ |
631 | writehi(C, A); break; | 620 | writehi(C, A); break; |
632 | case 0xF0: /* LDH A,(imm) */ | 621 | case 0xF0: /* LDH A,(imm) */ |
633 | A = readhi(FETCH); break; | 622 | A = readhi(FETCH); break; |
634 | case 0xF2: /* LDH A,(C) (undocumented) */ | 623 | case 0xF2: /* LDH A,(C) (undocumented) */ |
635 | A = readhi(C); break; | 624 | A = readhi(C); break; |
636 | 625 | ||
637 | 626 | ||
638 | case 0xF8: /* LD HL,SP+imm */ | 627 | case 0xF8: /* LD HL,SP+imm */ |
639 | b = FETCH; LDHLSP(b); break; | 628 | b = FETCH; LDHLSP(b); break; |
640 | case 0xF9: /* LD SP,HL */ | 629 | case 0xF9: /* LD SP,HL */ |
641 | SP = HL; break; | 630 | SP = HL; break; |
642 | case 0xFA: /* LD A,(imm) */ | 631 | case 0xFA: /* LD A,(imm) */ |
643 | A = readb(readw(xPC)); PC += 2; break; | 632 | A = readb(readw(xPC)); PC += 2; break; |
644 | 633 | ||
645 | ALU_CASES(0x80, 0xC6, ADD, __ADD) | 634 | ALU_CASES(0x80, 0xC6, ADD, __ADD) |
646 | ALU_CASES(0x88, 0xCE, ADC, __ADC) | 635 | ALU_CASES(0x88, 0xCE, ADC, __ADC) |
647 | ALU_CASES(0x90, 0xD6, SUB, __SUB) | 636 | ALU_CASES(0x90, 0xD6, SUB, __SUB) |
648 | ALU_CASES(0x98, 0xDE, SBC, __SBC) | 637 | ALU_CASES(0x98, 0xDE, SBC, __SBC) |
649 | ALU_CASES(0xA0, 0xE6, AND, __AND) | 638 | ALU_CASES(0xA0, 0xE6, AND, __AND) |
650 | ALU_CASES(0xA8, 0xEE, XOR, __XOR) | 639 | ALU_CASES(0xA8, 0xEE, XOR, __XOR) |
651 | ALU_CASES(0xB0, 0xF6, OR, __OR) | 640 | ALU_CASES(0xB0, 0xF6, OR, __OR) |
652 | ALU_CASES(0xB8, 0xFE, CP, __CP) | 641 | ALU_CASES(0xB8, 0xFE, CP, __CP) |
653 | 642 | ||
654 | case 0x09: /* ADD HL,BC */ | 643 | case 0x09: /* ADD HL,BC */ |
655 | w = BC; goto __ADDW; | 644 | w = BC; goto __ADDW; |
656 | case 0x19: /* ADD HL,DE */ | 645 | case 0x19: /* ADD HL,DE */ |
657 | w = DE; goto __ADDW; | 646 | w = DE; goto __ADDW; |
658 | case 0x39: /* ADD HL,SP */ | 647 | case 0x39: /* ADD HL,SP */ |
659 | w = SP; goto __ADDW; | 648 | w = SP; goto __ADDW; |
660 | case 0x29: /* ADD HL,HL */ | 649 | case 0x29: /* ADD HL,HL */ |
661 | w = HL; | 650 | w = HL; |
662 | __ADDW: | 651 | __ADDW: |
663 | ADDW(w); | 652 | ADDW(w); |
664 | break; | 653 | break; |
665 | 654 | ||
666 | case 0x04: /* INC B */ | 655 | case 0x04: /* INC B */ |
667 | INC(B); break; | 656 | INC(B); break; |
668 | case 0x0C: /* INC C */ | 657 | case 0x0C: /* INC C */ |
669 | INC(C); break; | 658 | INC(C); break; |
670 | case 0x14: /* INC D */ | 659 | case 0x14: /* INC D */ |
671 | INC(D); break; | 660 | INC(D); break; |
672 | case 0x1C: /* INC E */ | 661 | case 0x1C: /* INC E */ |
673 | INC(E); break; | 662 | INC(E); break; |
674 | case 0x24: /* INC H */ | 663 | case 0x24: /* INC H */ |
675 | INC(H); break; | 664 | INC(H); break; |
676 | case 0x2C: /* INC L */ | 665 | case 0x2C: /* INC L */ |
677 | INC(L); break; | 666 | INC(L); break; |
678 | case 0x34: /* INC (HL) */ | 667 | case 0x34: /* INC (HL) */ |
679 | b = readb(xHL); | 668 | b = readb(xHL); |
680 | INC(b); | 669 | INC(b); |
681 | writeb(xHL, b); | 670 | writeb(xHL, b); |
682 | break; | 671 | break; |
683 | case 0x3C: /* INC A */ | 672 | case 0x3C: /* INC A */ |
684 | INC(A); break; | 673 | INC(A); break; |
685 | 674 | ||
686 | case 0x03: /* INC BC */ | 675 | case 0x03: /* INC BC */ |
687 | #ifdef DYNAREC | 676 | #ifdef DYNAREC |
688 | W(acc)=((B<<8)|C)+1; | 677 | W(acc)=((B<<8)|C)+1; |
689 | B=HB(acc); | 678 | B=HB(acc); |
690 | C=LB(acc); | 679 | C=LB(acc); |
691 | #else | 680 | #else |
692 | INCW(BC); | 681 | INCW(BC); |
693 | #endif | 682 | #endif |
694 | break; | 683 | break; |
695 | case 0x13: /* INC DE */ | 684 | case 0x13: /* INC DE */ |
696 | #ifdef DYNAREC | 685 | #ifdef DYNAREC |
697 | W(acc)=((D<<8)|E)+1; | 686 | W(acc)=((D<<8)|E)+1; |
698 | D=HB(acc); | 687 | D=HB(acc); |
699 | E=LB(acc); | 688 | E=LB(acc); |
700 | #else | 689 | #else |
701 | INCW(DE); | 690 | INCW(DE); |
702 | #endif | 691 | #endif |
703 | break; | 692 | break; |
704 | case 0x23: /* INC HL */ | 693 | case 0x23: /* INC HL */ |
705 | INCW(HL); break; | 694 | INCW(HL); break; |
706 | case 0x33: /* INC SP */ | 695 | case 0x33: /* INC SP */ |
707 | INCW(SP); break; | 696 | INCW(SP); break; |
708 | 697 | ||
709 | case 0x05: /* DEC B */ | 698 | case 0x05: /* DEC B */ |
710 | DEC(B); break; | 699 | DEC(B); break; |
711 | case 0x0D: /* DEC C */ | 700 | case 0x0D: /* DEC C */ |
712 | DEC(C); break; | 701 | DEC(C); break; |
713 | case 0x15: /* DEC D */ | 702 | case 0x15: /* DEC D */ |
714 | DEC(D); break; | 703 | DEC(D); break; |
715 | case 0x1D: /* DEC E */ | 704 | case 0x1D: /* DEC E */ |
716 | DEC(E); break; | 705 | DEC(E); break; |
717 | case 0x25: /* DEC H */ | 706 | case 0x25: /* DEC H */ |
718 | DEC(H); break; | 707 | DEC(H); break; |
719 | case 0x2D: /* DEC L */ | 708 | case 0x2D: /* DEC L */ |
720 | DEC(L); break; | 709 | DEC(L); break; |
721 | case 0x35: /* DEC (HL) */ | 710 | case 0x35: /* DEC (HL) */ |
722 | b = readb(xHL); | 711 | b = readb(xHL); |
723 | DEC(b); | 712 | DEC(b); |
724 | writeb(xHL, b); | 713 | writeb(xHL, b); |
725 | break; | 714 | break; |
726 | case 0x3D: /* DEC A */ | 715 | case 0x3D: /* DEC A */ |
727 | DEC(A); break; | 716 | DEC(A); break; |
728 | 717 | ||
729 | case 0x0B: /* DEC BC */ | 718 | case 0x0B: /* DEC BC */ |
730 | #ifdef DYNAREC | 719 | #ifdef DYNAREC |
731 | W(acc)=((B<<8)|C)-1; | 720 | W(acc)=((B<<8)|C)-1; |
732 | B=HB(acc); | 721 | B=HB(acc); |
733 | C=LB(acc); | 722 | C=LB(acc); |
734 | #else | 723 | #else |
735 | DECW(BC); | 724 | DECW(BC); |
736 | #endif | 725 | #endif |
737 | break; | 726 | break; |
738 | case 0x1B: /* DEC DE */ | 727 | case 0x1B: /* DEC DE */ |
739 | #ifdef DYNAREC | 728 | #ifdef DYNAREC |
740 | W(acc)=((D<<8)|E)-1; | 729 | W(acc)=((D<<8)|E)-1; |
741 | D=HB(acc); | 730 | D=HB(acc); |
742 | E=LB(acc); | 731 | E=LB(acc); |
743 | #else | 732 | #else |
744 | DECW(DE); | 733 | DECW(DE); |
745 | #endif | 734 | #endif |
746 | break; | 735 | break; |
747 | case 0x2B: /* DEC HL */ | 736 | case 0x2B: /* DEC HL */ |
748 | DECW(HL); break; | 737 | DECW(HL); break; |
749 | case 0x3B: /* DEC SP */ | 738 | case 0x3B: /* DEC SP */ |
750 | DECW(SP); break; | 739 | DECW(SP); break; |
751 | 740 | ||
752 | case 0x07: /* RLCA */ | 741 | case 0x07: /* RLCA */ |
753 | RLCA(A); break; | 742 | RLCA(A); break; |
754 | case 0x0F: /* RRCA */ | 743 | case 0x0F: /* RRCA */ |
755 | RRCA(A); break; | 744 | RRCA(A); break; |
756 | case 0x17: /* RLA */ | 745 | case 0x17: /* RLA */ |
757 | RLA(A); break; | 746 | RLA(A); break; |
758 | case 0x1F: /* RRA */ | 747 | case 0x1F: /* RRA */ |
759 | RRA(A); break; | 748 | RRA(A); break; |
760 | 749 | ||
761 | case 0x27: /* DAA */ | 750 | case 0x27: /* DAA */ |
762 | DAA; break; | 751 | DAA; break; |
763 | case 0x2F: /* CPL */ | 752 | case 0x2F: /* CPL */ |
764 | CPL(A); break; | 753 | CPL(A); break; |
765 | 754 | ||
766 | case 0x18: /* JR */ | 755 | case 0x18: /* JR */ |
767 | __JR: | 756 | __JR: |
768 | JR; break; | 757 | JR; break; |
769 | case 0x20: /* JR NZ */ | 758 | case 0x20: /* JR NZ */ |
770 | if (!(F&FZ)) goto __JR; NOJR; break; | 759 | if (!(F&FZ)) goto __JR; NOJR; break; |
771 | case 0x28: /* JR Z */ | 760 | case 0x28: /* JR Z */ |
772 | if (F&FZ) goto __JR; NOJR; break; | 761 | if (F&FZ) goto __JR; NOJR; break; |
773 | case 0x30: /* JR NC */ | 762 | case 0x30: /* JR NC */ |
774 | if (!(F&FC)) goto __JR; NOJR; break; | 763 | if (!(F&FC)) goto __JR; NOJR; break; |
775 | case 0x38: /* JR C */ | 764 | case 0x38: /* JR C */ |
776 | if (F&FC) goto __JR; NOJR; break; | 765 | if (F&FC) goto __JR; NOJR; break; |
777 | 766 | ||
778 | case 0xC3: /* JP */ | 767 | case 0xC3: /* JP */ |
779 | __JP: | 768 | __JP: |
780 | JP; break; | 769 | JP; break; |
781 | case 0xC2: /* JP NZ */ | 770 | case 0xC2: /* JP NZ */ |
782 | if (!(F&FZ)) goto __JP; NOJP; break; | 771 | if (!(F&FZ)) goto __JP; NOJP; break; |
783 | case 0xCA: /* JP Z */ | 772 | case 0xCA: /* JP Z */ |
784 | if (F&FZ) goto __JP; NOJP; break; | 773 | if (F&FZ) goto __JP; NOJP; break; |
785 | case 0xD2: /* JP NC */ | 774 | case 0xD2: /* JP NC */ |
786 | if (!(F&FC)) goto __JP; NOJP; break; | 775 | if (!(F&FC)) goto __JP; NOJP; break; |
787 | case 0xDA: /* JP C */ | 776 | case 0xDA: /* JP C */ |
788 | if (F&FC) goto __JP; NOJP; break; | 777 | if (F&FC) goto __JP; NOJP; break; |
789 | case 0xE9: /* JP HL */ | 778 | case 0xE9: /* JP HL */ |
790 | PC = HL; break; | 779 | PC = HL; break; |
791 | 780 | ||
792 | case 0xC9: /* RET */ | 781 | case 0xC9: /* RET */ |
793 | __RET: | 782 | __RET: |
794 | RET; break; | 783 | RET; break; |
795 | case 0xC0: /* RET NZ */ | 784 | case 0xC0: /* RET NZ */ |
796 | if (!(F&FZ)) goto __RET; NORET; break; | 785 | if (!(F&FZ)) goto __RET; NORET; break; |
797 | case 0xC8: /* RET Z */ | 786 | case 0xC8: /* RET Z */ |
798 | if (F&FZ) goto __RET; NORET; break; | 787 | if (F&FZ) goto __RET; NORET; break; |
799 | case 0xD0: /* RET NC */ | 788 | case 0xD0: /* RET NC */ |
800 | if (!(F&FC)) goto __RET; NORET; break; | 789 | if (!(F&FC)) goto __RET; NORET; break; |
801 | case 0xD8: /* RET C */ | 790 | case 0xD8: /* RET C */ |
802 | if (F&FC) goto __RET; NORET; break; | 791 | if (F&FC) goto __RET; NORET; break; |
803 | case 0xD9: /* RETI */ | 792 | case 0xD9: /* RETI */ |
804 | IME = IMA = 1; goto __RET; | 793 | IME = IMA = 1; goto __RET; |
805 | 794 | ||
806 | case 0xCD: /* CALL */ | 795 | case 0xCD: /* CALL */ |
807 | __CALL: | 796 | __CALL: |
808 | CALL; break; | 797 | CALL; break; |
809 | case 0xC4: /* CALL NZ */ | 798 | case 0xC4: /* CALL NZ */ |
810 | if (!(F&FZ)) goto __CALL; NOCALL; break; | 799 | if (!(F&FZ)) goto __CALL; NOCALL; break; |
811 | case 0xCC: /* CALL Z */ | 800 | case 0xCC: /* CALL Z */ |
812 | if (F&FZ) goto __CALL; NOCALL; break; | 801 | if (F&FZ) goto __CALL; NOCALL; break; |
813 | case 0xD4: /* CALL NC */ | 802 | case 0xD4: /* CALL NC */ |
814 | if (!(F&FC)) goto __CALL; NOCALL; break; | 803 | if (!(F&FC)) goto __CALL; NOCALL; break; |
815 | case 0xDC: /* CALL C */ | 804 | case 0xDC: /* CALL C */ |
816 | if (F&FC) goto __CALL; NOCALL; break; | 805 | if (F&FC) goto __CALL; NOCALL; break; |
817 | 806 | ||
818 | case 0xC7: /* RST 0 */ | 807 | case 0xC7: /* RST 0 */ |
819 | b = 0x00; goto __RST; | 808 | b = 0x00; goto __RST; |
820 | case 0xCF: /* RST 8 */ | 809 | case 0xCF: /* RST 8 */ |
821 | b = 0x08; goto __RST; | 810 | b = 0x08; goto __RST; |
822 | case 0xD7: /* RST 10 */ | 811 | case 0xD7: /* RST 10 */ |
823 | b = 0x10; goto __RST; | 812 | b = 0x10; goto __RST; |
824 | case 0xDF: /* RST 18 */ | 813 | case 0xDF: /* RST 18 */ |
825 | b = 0x18; goto __RST; | 814 | b = 0x18; goto __RST; |
826 | case 0xE7: /* RST 20 */ | 815 | case 0xE7: /* RST 20 */ |
827 | b = 0x20; goto __RST; | 816 | b = 0x20; goto __RST; |
828 | case 0xEF: /* RST 28 */ | 817 | case 0xEF: /* RST 28 */ |
829 | b = 0x28; goto __RST; | 818 | b = 0x28; goto __RST; |
830 | case 0xF7: /* RST 30 */ | 819 | case 0xF7: /* RST 30 */ |
831 | b = 0x30; goto __RST; | 820 | b = 0x30; goto __RST; |
832 | case 0xFF: /* RST 38 */ | 821 | case 0xFF: /* RST 38 */ |
833 | b = 0x38; | 822 | b = 0x38; |
834 | __RST: | 823 | __RST: |
835 | RST(b); break; | 824 | RST(b); break; |
836 | 825 | ||
837 | case 0xC1: /* POP BC */ | 826 | case 0xC1: /* POP BC */ |
838 | #ifdef DYNAREC | 827 | #ifdef DYNAREC |
839 | POP(W(acc)); | 828 | POP(W(acc)); |
840 | B=HB(acc); | 829 | B=HB(acc); |
841 | C=LB(acc); | 830 | C=LB(acc); |
842 | #else | 831 | #else |
843 | POP(BC); | 832 | POP(BC); |
844 | #endif | 833 | #endif |
845 | break; | 834 | break; |
846 | case 0xC5: /* PUSH BC */ | 835 | case 0xC5: /* PUSH BC */ |
847 | PUSH(BC); break; | 836 | PUSH(BC); break; |
848 | case 0xD1: /* POP DE */ | 837 | case 0xD1: /* POP DE */ |
849 | #ifdef DYNAREC | 838 | #ifdef DYNAREC |
850 | POP(W(acc)); | 839 | POP(W(acc)); |
851 | D=HB(acc); | 840 | D=HB(acc); |
852 | E=LB(acc); | 841 | E=LB(acc); |
853 | #else | 842 | #else |
854 | POP(DE); | 843 | POP(DE); |
855 | #endif | 844 | #endif |
856 | break; | 845 | break; |
857 | case 0xD5: /* PUSH DE */ | 846 | case 0xD5: /* PUSH DE */ |
858 | PUSH(DE); break; | 847 | PUSH(DE); break; |
859 | case 0xE1: /* POP HL */ | 848 | case 0xE1: /* POP HL */ |
860 | POP(HL); break; | 849 | POP(HL); break; |
861 | case 0xE5: /* PUSH HL */ | 850 | case 0xE5: /* PUSH HL */ |
862 | PUSH(HL); break; | 851 | PUSH(HL); break; |
863 | case 0xF1: /* POP AF */ | 852 | case 0xF1: /* POP AF */ |
864 | #ifdef DYNAREC | 853 | #ifdef DYNAREC |
865 | POP(W(acc)); | 854 | POP(W(acc)); |
866 | A=HB(acc); | 855 | A=HB(acc); |
867 | F=LB(acc); | 856 | F=LB(acc); |
868 | #else | 857 | #else |
869 | POP(AF); | 858 | POP(AF); |
870 | break; | 859 | break; |
871 | #endif | 860 | #endif |
872 | case 0xF5: /* PUSH AF */ | 861 | case 0xF5: /* PUSH AF */ |
873 | PUSH(AF); break; | 862 | PUSH(AF); break; |
874 | 863 | ||
875 | case 0xE8: /* ADD SP,imm */ | 864 | case 0xE8: /* ADD SP,imm */ |
876 | b = FETCH; ADDSP(b); break; | 865 | b = FETCH; ADDSP(b); break; |
877 | 866 | ||
878 | case 0xF3: /* DI */ | 867 | case 0xF3: /* DI */ |
879 | DI; break; | 868 | DI; break; |
880 | case 0xFB: /* EI */ | 869 | case 0xFB: /* EI */ |
881 | EI; break; | 870 | EI; break; |
882 | 871 | ||
883 | case 0x37: /* SCF */ | 872 | case 0x37: /* SCF */ |
884 | SCF; break; | 873 | SCF; break; |
885 | case 0x3F: /* CCF */ | 874 | case 0x3F: /* CCF */ |
886 | CCF; break; | 875 | CCF; break; |
887 | 876 | ||
888 | case 0x10: /* STOP */ | 877 | case 0x10: /* STOP */ |
889 | PC++; | 878 | PC++; |
890 | if (R_KEY1 & 1) | 879 | if (R_KEY1 & 1) |
891 | { | 880 | { |
892 | cpu.speed = cpu.speed ^ 1; | 881 | cpu.speed = cpu.speed ^ 1; |
893 | R_KEY1 = (R_KEY1 & 0x7E) | (cpu.speed << 7); | 882 | R_KEY1 = (R_KEY1 & 0x7E) | (cpu.speed << 7); |
894 | break; | 883 | break; |
895 | } | 884 | } |
896 | /* NOTE - we do not implement dmg STOP whatsoever */ | 885 | /* NOTE - we do not implement dmg STOP whatsoever */ |
897 | break; | 886 | break; |
898 | 887 | ||
899 | case 0x76: /* HALT */ | 888 | case 0x76: /* HALT */ |
900 | cpu.halt = 1; | 889 | cpu.halt = 1; |
901 | break; | 890 | break; |
902 | 891 | ||
903 | case 0xCB: /* CB prefix */ | 892 | case 0xCB: /* CB prefix */ |
904 | cbop = FETCH; | 893 | cbop = FETCH; |
905 | clen = cb_cycles_table[cbop]; | 894 | clen = cb_cycles_table[cbop]; |
906 | switch (cbop) | 895 | switch (cbop) |
907 | { | 896 | { |
908 | CB_REG_CASES(B, 0); | 897 | CB_REG_CASES(B, 0); |
909 | CB_REG_CASES(C, 1); | 898 | CB_REG_CASES(C, 1); |
910 | CB_REG_CASES(D, 2); | 899 | CB_REG_CASES(D, 2); |
911 | CB_REG_CASES(E, 3); | 900 | CB_REG_CASES(E, 3); |
912 | CB_REG_CASES(H, 4); | 901 | CB_REG_CASES(H, 4); |
913 | CB_REG_CASES(L, 5); | 902 | CB_REG_CASES(L, 5); |
914 | CB_REG_CASES(A, 7); | 903 | CB_REG_CASES(A, 7); |
915 | default: | 904 | default: |
916 | b = readb(xHL); | 905 | b = readb(xHL); |
917 | switch(cbop) | 906 | switch(cbop) |
918 | { | 907 | { |
919 | CB_REG_CASES(b, 6); | 908 | CB_REG_CASES(b, 6); |
920 | } | 909 | } |
921 | if ((cbop & 0xC0) != 0x40) /* exclude BIT */ | 910 | if ((cbop & 0xC0) != 0x40) /* exclude BIT */ |
922 | writeb(xHL, b); | 911 | writeb(xHL, b); |
923 | break; | 912 | break; |
924 | } | 913 | } |
925 | break; | 914 | break; |
926 | 915 | ||
927 | default: | 916 | default: |
928 | die( | 917 | die( |
929 | "invalid opcode 0x%02X at address 0x%04X, rombank = %d\n", | 918 | "invalid opcode 0x%02X at address 0x%04X, rombank = %d\n", |
930 | op, (PC-1) & 0xffff, mbc.rombank); | 919 | op, (PC-1) & 0xffff, mbc.rombank); |
931 | break; | 920 | break; |
932 | } | 921 | } |
933 | #ifdef DYNAREC | 922 | #ifdef DYNAREC |
934 | } else { // ROM, dynarec. | 923 | } |
924 | else | ||
925 | { /* ROM, dynarec. */ | ||
935 | struct dynarec_block *p=0,*b=address_map[PC&HASH_BITMASK]; | 926 | struct dynarec_block *p=0,*b=address_map[PC&HASH_BITMASK]; |
936 | char meow[500]; | 927 | char meow[500]; |
937 | byte *ptr=mbc.rmap[PC>>12]; | 928 | byte *ptr=mbc.rmap[PC>>12]; |
938 | snprintf(meow,499,"PC: 0x%x 0x%x a: 0x%x\n", | 929 | snprintf(meow,499,"PC: 0x%x 0x%x a: 0x%x\n", |
939 | ptr,PC, b ? b->address.d : 0); | 930 | ptr,PC, b ? b->address.d : 0); |
940 | rb->splash(HZ*2,true,meow); | 931 | rb->splash(HZ*2,true,meow); |
941 | while(b&&b->address.d!=(ptr+PC)) { | 932 | while(b&&b->address.d!=((unsigned int)(ptr)+PC)) |
933 | { | ||
942 | p=b; | 934 | p=b; |
943 | b=b->next; | 935 | b=b->next; |
944 | } | 936 | } |
945 | if(b) { // call block | 937 | if(b) |
938 | { /* call block */ | ||
946 | int fd; | 939 | int fd; |
947 | blockcount++; | 940 | blockcount++; |
948 | snprintf(meow,499,"/dyna_0x%x_run.rb",PC); | 941 | snprintf(meow,499,"/dyna_0x%x_run.rb",PC); |
949 | fd=open(meow,O_WRONLY|O_CREAT|O_TRUNC); | 942 | fd=open(meow,O_WRONLY|O_CREAT|O_TRUNC); |
950 | if(fd>=0) { | 943 | if(fd>=0) |
951 | fdprintf(fd,"Block 0x%x Blockcount: %d\n",PC,blockcount); | 944 | { |
952 | fdprintf(fd,"before: 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x\n", | 945 | fdprintf(fd,"Block 0x%x Blockcount: %d\n",PC,blockcount); |
953 | cpu.a,cpu.b,cpu.c,cpu.d,cpu.e,cpu.hl,cpu.f,cpu.sp,cpu.pc, | 946 | fdprintf(fd,"before: 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x\n", |
954 | cpu.ime); | 947 | cpu.a,cpu.b,cpu.c,cpu.d,cpu.e,cpu.hl,cpu.f,cpu.sp,cpu.pc, |
955 | if(blockcount<MAXBLOCK) { | 948 | cpu.ime); |
956 | asm volatile ("movem.l (%0),%%d1-%%d7/%%a0-%%a1\n\t" | 949 | if(blockcount<MAXBLOCK) |
957 | "jsr (%1)\n\t" | 950 | { |
958 | "movem.l %%d1-%%d7/%%a0-%%a1,(%0)\n\t" | 951 | asm volatile ("movem.l (%0),%%d1-%%d7/%%a0-%%a1\n\t" |
959 | : | 952 | "jsr (%1)\n\t" |
960 | : "a" (&cpu.a), "a" (b->block) | 953 | "movem.l %%d1-%%d7/%%a0-%%a1,(%0)\n\t" |
961 | : "d0", "d1", "d2", "d3", "d4", "d5", "d6", | 954 | : |
962 | "d7", "a0","a1", "a2","a3","a4"); | 955 | : "a" (&cpu.a), "a" (b->block) |
963 | clen=blockclen; | 956 | : "d0", "d1", "d2", "d3", "d4", "d5", "d6", |
964 | fdprintf(fd,"after: 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x\n", | 957 | "d7", "a0","a1", "a2","a3","a4"); |
965 | cpu.a,cpu.b,cpu.c,cpu.d,cpu.e,cpu.hl,cpu.f,cpu.sp, | 958 | clen=blockclen; |
966 | cpu.pc,cpu.ime); | 959 | fdprintf(fd,"after: 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x\n", |
967 | } | 960 | cpu.a,cpu.b,cpu.c,cpu.d,cpu.e,cpu.hl,cpu.f,cpu.sp, |
968 | else | 961 | cpu.pc,cpu.ime); |
969 | die("end"); | 962 | } |
970 | close(fd); | 963 | else |
971 | } | 964 | die("end"); |
972 | } | 965 | close(fd); |
973 | else { // Hash miss -> not found -> recompile block and add it | 966 | } |
967 | } | ||
968 | else | ||
969 | { /* Hash miss -> not found -> recompile block and add it */ | ||
974 | struct dynarec_block *newblock; | 970 | struct dynarec_block *newblock; |
975 | newblock=malloc(sizeof(struct dynarec_block)); | 971 | newblock=malloc(sizeof(struct dynarec_block)); |
976 | memset(newblock,0,sizeof(struct dynarec_block)); | 972 | memset(newblock,0,sizeof(struct dynarec_block)); |
977 | newblock->address.d=ptr+PC; | 973 | newblock->address.d=(unsigned int)(ptr)+PC; |
978 | dynamic_recompile(newblock); | 974 | dynamic_recompile(newblock); |
979 | if(p) | 975 | if(p) |
980 | p->next=newblock; | 976 | p->next=newblock; |
981 | else | 977 | else |
982 | address_map[PC&HASH_BITMASK]=newblock; | 978 | address_map[PC&HASH_BITMASK]=newblock; |
983 | } | 979 | } |
984 | } | 980 | } |
985 | #endif | 981 | #endif |
986 | 982 | ||
987 | 983 | ||
988 | 984 | ||
989 | clen <<= 1; | 985 | clen <<= 1; |
990 | div_advance(clen); | 986 | div_advance(clen); |
991 | timer_advance(clen); | 987 | timer_advance(clen); |
992 | clen >>= cpu.speed; | 988 | clen >>= cpu.speed; |
993 | lcdc_advance(clen); | 989 | lcdc_advance(clen); |
994 | sound_advance(clen); | 990 | if(options.sound) |
995 | 991 | sound_advance(clen); | |
996 | i -= clen; | 992 | |
997 | if (i > 0) goto next; | 993 | i -= clen; |
998 | return cycles-i; | 994 | if (i > 0) goto next; |
995 | return cycles-i; | ||
999 | } | 996 | } |
1000 | 997 | ||
1001 | #endif /* ASM_CPU_EMULATE */ | 998 | #endif /* ASM_CPU_EMULATE */ |
@@ -1005,9 +1002,9 @@ next: | |||
1005 | 1002 | ||
1006 | inline int cpu_step(int max) | 1003 | inline int cpu_step(int max) |
1007 | { | 1004 | { |
1008 | register int cnt; | 1005 | register int cnt; |
1009 | if ((cnt = cpu_idle(max))) return cnt; | 1006 | if ((cnt = cpu_idle(max))) return cnt; |
1010 | return cpu_emulate(1); | 1007 | return cpu_emulate(1); |
1011 | } | 1008 | } |
1012 | 1009 | ||
1013 | #endif /* ASM_CPU_STEP */ | 1010 | #endif /* ASM_CPU_STEP */ |
diff --git a/apps/plugins/rockboy/cpucore.h b/apps/plugins/rockboy/cpucore.h index 3e02f10c1a..cf377b26d6 100644 --- a/apps/plugins/rockboy/cpucore.h +++ b/apps/plugins/rockboy/cpucore.h | |||
@@ -4,275 +4,254 @@ | |||
4 | 4 | ||
5 | static const byte cycles_table[256]ICONST_ATTR = | 5 | static const byte cycles_table[256]ICONST_ATTR = |
6 | { | 6 | { |
7 | 1, 3, 2, 2, 1, 1, 2, 1, 5, 2, 2, 2, 1, 1, 2, 1, | 7 | 1, 3, 2, 2, 1, 1, 2, 1, 5, 2, 2, 2, 1, 1, 2, 1, |
8 | 1, 3, 2, 2, 1, 1, 2, 1, 3, 2, 2, 2, 1, 1, 2, 1, | 8 | 1, 3, 2, 2, 1, 1, 2, 1, 3, 2, 2, 2, 1, 1, 2, 1, |
9 | 3, 3, 2, 2, 1, 1, 2, 1, 3, 2, 2, 2, 1, 1, 2, 1, | 9 | 3, 3, 2, 2, 1, 1, 2, 1, 3, 2, 2, 2, 1, 1, 2, 1, |
10 | 3, 3, 2, 2, 1, 3, 3, 3, 3, 2, 2, 2, 1, 1, 2, 1, | 10 | 3, 3, 2, 2, 3, 3, 3, 1, 3, 2, 2, 2, 1, 1, 2, 1, |
11 | 11 | ||
12 | 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 2, 1, | 12 | 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 2, 1, |
13 | 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 2, 1, | 13 | 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 2, 1, |
14 | 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 2, 1, | 14 | 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 2, 1, |
15 | 2, 2, 2, 2, 2, 2, 1, 2, 1, 1, 1, 1, 1, 1, 2, 1, | 15 | 2, 2, 2, 2, 2, 2, 1, 2, 1, 1, 1, 1, 1, 1, 2, 1, |
16 | 16 | ||
17 | 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 2, 1, | 17 | 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 2, 1, |
18 | 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 2, 1, | 18 | 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 2, 1, |
19 | 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 2, 1, | 19 | 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 2, 1, |
20 | 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 2, 1, | 20 | 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 2, 1, |
21 | 21 | ||
22 | 5, 3, 4, 4, 6, 4, 2, 4, 5, 4, 4, 1, 6, 6, 2, 4, | 22 | 5, 3, 4, 4, 6, 4, 2, 4, 5, 4, 4, 1, 6, 6, 2, 4, |
23 | 5, 3, 4, 0, 6, 4, 2, 4, 5, 4, 4, 0, 6, 0, 2, 4, | 23 | 5, 3, 4, 0, 6, 4, 2, 4, 5, 4, 4, 0, 6, 0, 2, 4, |
24 | 3, 3, 2, 0, 0, 4, 2, 4, 4, 1, 4, 0, 0, 0, 2, 4, | 24 | 3, 3, 2, 0, 0, 4, 2, 4, 4, 1, 4, 0, 0, 0, 2, 4, |
25 | 3, 3, 2, 1, 0, 4, 2, 4, 3, 2, 4, 1, 0, 0, 2, 4, | 25 | 3, 3, 2, 1, 0, 4, 2, 4, 3, 2, 4, 1, 0, 0, 2, 4, |
26 | }; | 26 | }; |
27 | 27 | ||
28 | static const byte cb_cycles_table[256] ICONST_ATTR = | 28 | static const byte cb_cycles_table[256] ICONST_ATTR = |
29 | { | 29 | { |
30 | 2, 2, 2, 2, 2, 2, 4, 2, 2, 2, 2, 2, 2, 2, 4, 2, | 30 | 2, 2, 2, 2, 2, 2, 4, 2, 2, 2, 2, 2, 2, 2, 4, 2, |
31 | 2, 2, 2, 2, 2, 2, 4, 2, 2, 2, 2, 2, 2, 2, 4, 2, | 31 | 2, 2, 2, 2, 2, 2, 4, 2, 2, 2, 2, 2, 2, 2, 4, 2, |
32 | 2, 2, 2, 2, 2, 2, 4, 2, 2, 2, 2, 2, 2, 2, 4, 2, | 32 | 2, 2, 2, 2, 2, 2, 4, 2, 2, 2, 2, 2, 2, 2, 4, 2, |
33 | 2, 2, 2, 2, 2, 2, 4, 2, 2, 2, 2, 2, 2, 2, 4, 2, | 33 | 2, 2, 2, 2, 2, 2, 4, 2, 2, 2, 2, 2, 2, 2, 4, 2, |
34 | 34 | ||
35 | 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 3, 2, | 35 | 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 3, 2, |
36 | 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 3, 2, | 36 | 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 3, 2, |
37 | 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 3, 2, | 37 | 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 3, 2, |
38 | 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 3, 2, | 38 | 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 3, 2, |
39 | 39 | ||
40 | 2, 2, 2, 2, 2, 2, 4, 2, 2, 2, 2, 2, 2, 2, 4, 2, | 40 | 2, 2, 2, 2, 2, 2, 4, 2, 2, 2, 2, 2, 2, 2, 4, 2, |
41 | 2, 2, 2, 2, 2, 2, 4, 2, 2, 2, 2, 2, 2, 2, 4, 2, | 41 | 2, 2, 2, 2, 2, 2, 4, 2, 2, 2, 2, 2, 2, 2, 4, 2, |
42 | 2, 2, 2, 2, 2, 2, 4, 2, 2, 2, 2, 2, 2, 2, 4, 2, | 42 | 2, 2, 2, 2, 2, 2, 4, 2, 2, 2, 2, 2, 2, 2, 4, 2, |
43 | 2, 2, 2, 2, 2, 2, 4, 2, 2, 2, 2, 2, 2, 2, 4, 2, | 43 | 2, 2, 2, 2, 2, 2, 4, 2, 2, 2, 2, 2, 2, 2, 4, 2, |
44 | 44 | ||
45 | 2, 2, 2, 2, 2, 2, 4, 2, 2, 2, 2, 2, 2, 2, 4, 2, | 45 | 2, 2, 2, 2, 2, 2, 4, 2, 2, 2, 2, 2, 2, 2, 4, 2, |
46 | 2, 2, 2, 2, 2, 2, 4, 2, 2, 2, 2, 2, 2, 2, 4, 2, | 46 | 2, 2, 2, 2, 2, 2, 4, 2, 2, 2, 2, 2, 2, 2, 4, 2, |
47 | 2, 2, 2, 2, 2, 2, 4, 2, 2, 2, 2, 2, 2, 2, 4, 2, | 47 | 2, 2, 2, 2, 2, 2, 4, 2, 2, 2, 2, 2, 2, 2, 4, 2, |
48 | 2, 2, 2, 2, 2, 2, 4, 2, 2, 2, 2, 2, 2, 2, 4, 2, | 48 | 2, 2, 2, 2, 2, 2, 4, 2, 2, 2, 2, 2, 2, 2, 4, 2, |
49 | }; | ||
50 | |||
51 | |||
52 | |||
53 | static const byte zflag_table[256] ICONST_ATTR = | ||
54 | { | ||
55 | FZ, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | ||
56 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | ||
57 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | ||
58 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | ||
59 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | ||
60 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | ||
61 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | ||
62 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | ||
63 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | ||
64 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | ||
65 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | ||
66 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | ||
67 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | ||
68 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | ||
69 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | ||
70 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 | ||
71 | }; | 49 | }; |
72 | 50 | ||
73 | static const byte incflag_table[256] ICONST_ATTR = | 51 | static const byte incflag_table[256] ICONST_ATTR = |
74 | { | 52 | { |
75 | FZ|FH, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | 53 | FZ|FH, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
76 | FH, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | 54 | FH, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
77 | FH, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | 55 | FH, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
78 | FH, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | 56 | FH, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
79 | FH, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | 57 | FH, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
80 | FH, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | 58 | FH, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
81 | FH, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | 59 | FH, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
82 | FH, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | 60 | FH, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
83 | FH, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | 61 | FH, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
84 | FH, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | 62 | FH, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
85 | FH, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | 63 | FH, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
86 | FH, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | 64 | FH, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
87 | FH, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | 65 | FH, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
88 | FH, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | 66 | FH, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
89 | FH, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | 67 | FH, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
90 | FH, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 | 68 | FH, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 |
91 | }; | 69 | }; |
92 | 70 | ||
93 | static const byte decflag_table[256] ICONST_ATTR = | 71 | static const byte decflag_table[256] ICONST_ATTR = |
94 | { | 72 | { |
95 | FZ|FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN|FH, | 73 | FZ|FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN|FH, |
96 | FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN|FH, | 74 | FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN|FH, |
97 | FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN|FH, | 75 | FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN|FH, |
98 | FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN|FH, | 76 | FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN|FH, |
99 | FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN|FH, | 77 | FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN|FH, |
100 | FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN|FH, | 78 | FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN|FH, |
101 | FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN|FH, | 79 | FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN|FH, |
102 | FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN|FH, | 80 | FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN|FH, |
103 | FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN|FH, | 81 | FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN|FH, |
104 | FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN|FH, | 82 | FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN|FH, |
105 | FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN|FH, | 83 | FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN|FH, |
106 | FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN|FH, | 84 | FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN|FH, |
107 | FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN|FH, | 85 | FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN|FH, |
108 | FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN|FH, | 86 | FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN|FH, |
109 | FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN|FH, | 87 | FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN|FH, |
110 | FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN|FH | 88 | FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN|FH |
111 | }; | 89 | }; |
112 | 90 | ||
91 | |||
113 | static const byte swap_table[256] ICONST_ATTR = | 92 | static const byte swap_table[256] ICONST_ATTR = |
114 | { | 93 | { |
115 | 0x00, 0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, 0x80, 0x90, 0xA0, 0xB0, 0xC0, 0xD0, 0xE0, 0xF0, | 94 | 0x00, 0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, 0x80, 0x90, 0xA0, 0xB0, 0xC0, 0xD0, 0xE0, 0xF0, |
116 | 0x01, 0x11, 0x21, 0x31, 0x41, 0x51, 0x61, 0x71, 0x81, 0x91, 0xA1, 0xB1, 0xC1, 0xD1, 0xE1, 0xF1, | 95 | 0x01, 0x11, 0x21, 0x31, 0x41, 0x51, 0x61, 0x71, 0x81, 0x91, 0xA1, 0xB1, 0xC1, 0xD1, 0xE1, 0xF1, |
117 | 0x02, 0x12, 0x22, 0x32, 0x42, 0x52, 0x62, 0x72, 0x82, 0x92, 0xA2, 0xB2, 0xC2, 0xD2, 0xE2, 0xF2, | 96 | 0x02, 0x12, 0x22, 0x32, 0x42, 0x52, 0x62, 0x72, 0x82, 0x92, 0xA2, 0xB2, 0xC2, 0xD2, 0xE2, 0xF2, |
118 | 0x03, 0x13, 0x23, 0x33, 0x43, 0x53, 0x63, 0x73, 0x83, 0x93, 0xA3, 0xB3, 0xC3, 0xD3, 0xE3, 0xF3, | 97 | 0x03, 0x13, 0x23, 0x33, 0x43, 0x53, 0x63, 0x73, 0x83, 0x93, 0xA3, 0xB3, 0xC3, 0xD3, 0xE3, 0xF3, |
119 | 0x04, 0x14, 0x24, 0x34, 0x44, 0x54, 0x64, 0x74, 0x84, 0x94, 0xA4, 0xB4, 0xC4, 0xD4, 0xE4, 0xF4, | 98 | 0x04, 0x14, 0x24, 0x34, 0x44, 0x54, 0x64, 0x74, 0x84, 0x94, 0xA4, 0xB4, 0xC4, 0xD4, 0xE4, 0xF4, |
120 | 0x05, 0x15, 0x25, 0x35, 0x45, 0x55, 0x65, 0x75, 0x85, 0x95, 0xA5, 0xB5, 0xC5, 0xD5, 0xE5, 0xF5, | 99 | 0x05, 0x15, 0x25, 0x35, 0x45, 0x55, 0x65, 0x75, 0x85, 0x95, 0xA5, 0xB5, 0xC5, 0xD5, 0xE5, 0xF5, |
121 | 0x06, 0x16, 0x26, 0x36, 0x46, 0x56, 0x66, 0x76, 0x86, 0x96, 0xA6, 0xB6, 0xC6, 0xD6, 0xE6, 0xF6, | 100 | 0x06, 0x16, 0x26, 0x36, 0x46, 0x56, 0x66, 0x76, 0x86, 0x96, 0xA6, 0xB6, 0xC6, 0xD6, 0xE6, 0xF6, |
122 | 0x07, 0x17, 0x27, 0x37, 0x47, 0x57, 0x67, 0x77, 0x87, 0x97, 0xA7, 0xB7, 0xC7, 0xD7, 0xE7, 0xF7, | 101 | 0x07, 0x17, 0x27, 0x37, 0x47, 0x57, 0x67, 0x77, 0x87, 0x97, 0xA7, 0xB7, 0xC7, 0xD7, 0xE7, 0xF7, |
123 | 0x08, 0x18, 0x28, 0x38, 0x48, 0x58, 0x68, 0x78, 0x88, 0x98, 0xA8, 0xB8, 0xC8, 0xD8, 0xE8, 0xF8, | 102 | 0x08, 0x18, 0x28, 0x38, 0x48, 0x58, 0x68, 0x78, 0x88, 0x98, 0xA8, 0xB8, 0xC8, 0xD8, 0xE8, 0xF8, |
124 | 0x09, 0x19, 0x29, 0x39, 0x49, 0x59, 0x69, 0x79, 0x89, 0x99, 0xA9, 0xB9, 0xC9, 0xD9, 0xE9, 0xF9, | 103 | 0x09, 0x19, 0x29, 0x39, 0x49, 0x59, 0x69, 0x79, 0x89, 0x99, 0xA9, 0xB9, 0xC9, 0xD9, 0xE9, 0xF9, |
125 | 0x0A, 0x1A, 0x2A, 0x3A, 0x4A, 0x5A, 0x6A, 0x7A, 0x8A, 0x9A, 0xAA, 0xBA, 0xCA, 0xDA, 0xEA, 0xFA, | 104 | 0x0A, 0x1A, 0x2A, 0x3A, 0x4A, 0x5A, 0x6A, 0x7A, 0x8A, 0x9A, 0xAA, 0xBA, 0xCA, 0xDA, 0xEA, 0xFA, |
126 | 0x0B, 0x1B, 0x2B, 0x3B, 0x4B, 0x5B, 0x6B, 0x7B, 0x8B, 0x9B, 0xAB, 0xBB, 0xCB, 0xDB, 0xEB, 0xFB, | 105 | 0x0B, 0x1B, 0x2B, 0x3B, 0x4B, 0x5B, 0x6B, 0x7B, 0x8B, 0x9B, 0xAB, 0xBB, 0xCB, 0xDB, 0xEB, 0xFB, |
127 | 0x0C, 0x1C, 0x2C, 0x3C, 0x4C, 0x5C, 0x6C, 0x7C, 0x8C, 0x9C, 0xAC, 0xBC, 0xCC, 0xDC, 0xEC, 0xFC, | 106 | 0x0C, 0x1C, 0x2C, 0x3C, 0x4C, 0x5C, 0x6C, 0x7C, 0x8C, 0x9C, 0xAC, 0xBC, 0xCC, 0xDC, 0xEC, 0xFC, |
128 | 0x0D, 0x1D, 0x2D, 0x3D, 0x4D, 0x5D, 0x6D, 0x7D, 0x8D, 0x9D, 0xAD, 0xBD, 0xCD, 0xDD, 0xED, 0xFD, | 107 | 0x0D, 0x1D, 0x2D, 0x3D, 0x4D, 0x5D, 0x6D, 0x7D, 0x8D, 0x9D, 0xAD, 0xBD, 0xCD, 0xDD, 0xED, 0xFD, |
129 | 0x0E, 0x1E, 0x2E, 0x3E, 0x4E, 0x5E, 0x6E, 0x7E, 0x8E, 0x9E, 0xAE, 0xBE, 0xCE, 0xDE, 0xEE, 0xFE, | 108 | 0x0E, 0x1E, 0x2E, 0x3E, 0x4E, 0x5E, 0x6E, 0x7E, 0x8E, 0x9E, 0xAE, 0xBE, 0xCE, 0xDE, 0xEE, 0xFE, |
130 | 0x0F, 0x1F, 0x2F, 0x3F, 0x4F, 0x5F, 0x6F, 0x7F, 0x8F, 0x9F, 0xAF, 0xBF, 0xCF, 0xDF, 0xEF, 0xFF, | 109 | 0x0F, 0x1F, 0x2F, 0x3F, 0x4F, 0x5F, 0x6F, 0x7F, 0x8F, 0x9F, 0xAF, 0xBF, 0xCF, 0xDF, 0xEF, 0xFF, |
131 | }; | 110 | }; |
132 | 111 | ||
133 | static const byte daa_table[4096] ICONST_ATTR= | 112 | static const byte daa_table[4096] ICONST_ATTR= |
134 | { | 113 | { |
135 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, | 114 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, |
136 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, | 115 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, |
137 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, | 116 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, |
138 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, | 117 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, |
139 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, | 118 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, |
140 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, | 119 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, |
141 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, | 120 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, |
142 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, | 121 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, |
143 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, | 122 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, |
144 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, | 123 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, |
145 | 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, | 124 | 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, |
146 | 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, | 125 | 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, |
147 | 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, | 126 | 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, |
148 | 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, | 127 | 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, |
149 | 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, | 128 | 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, |
150 | 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, | 129 | 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, |
151 | 130 | ||
152 | 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, | 131 | 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, |
153 | 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, | 132 | 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, |
154 | 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, | 133 | 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, |
155 | 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, | 134 | 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, |
156 | 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, | 135 | 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, |
157 | 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, | 136 | 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, |
158 | 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, | 137 | 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, |
159 | 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, | 138 | 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, |
160 | 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, | 139 | 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, |
161 | 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, | 140 | 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, |
162 | 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, | 141 | 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, |
163 | 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, | 142 | 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, |
164 | 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, | 143 | 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, |
165 | 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, | 144 | 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, |
166 | 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, | 145 | 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, |
167 | 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, | 146 | 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, |
168 | 147 | ||
169 | 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, | 148 | 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, |
170 | 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, | 149 | 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, |
171 | 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, | 150 | 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, |
172 | 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, | 151 | 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, |
173 | 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, | 152 | 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, |
174 | 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, | 153 | 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, |
175 | 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, | 154 | 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, |
176 | 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, | 155 | 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, |
177 | 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, | 156 | 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, |
178 | 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, | 157 | 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, |
179 | 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, | 158 | 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, |
180 | 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, | 159 | 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, |
181 | 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, | 160 | 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, |
182 | 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, | 161 | 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, |
183 | 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, | 162 | 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, |
184 | 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, | 163 | 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, |
185 | 164 | ||
186 | 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, | 165 | 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, |
187 | 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, | 166 | 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, |
188 | 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, | 167 | 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, |
189 | 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, | 168 | 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, |
190 | 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, | 169 | 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, |
191 | 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, | 170 | 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, |
192 | 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, | 171 | 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, |
193 | 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, | 172 | 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, |
194 | 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, | 173 | 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, |
195 | 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, | 174 | 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, |
196 | 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, | 175 | 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, |
197 | 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, | 176 | 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, |
198 | 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, | 177 | 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, |
199 | 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, | 178 | 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, |
200 | 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, | 179 | 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, |
201 | 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, | 180 | 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, |
202 | 181 | ||
203 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | 182 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
204 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | 183 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
205 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | 184 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
206 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | 185 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
207 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | 186 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
208 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | 187 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
209 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | 188 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
210 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | 189 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
211 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | 190 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
212 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | 191 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
213 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | 192 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
214 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | 193 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
215 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | 194 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
216 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | 195 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
217 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | 196 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
218 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | 197 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |
219 | 198 | ||
220 | 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, | 199 | 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, |
221 | 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, | 200 | 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, |
222 | 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, | 201 | 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, |
223 | 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, | 202 | 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, |
224 | 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, | 203 | 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, |
225 | 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, | 204 | 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, |
226 | 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, | 205 | 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, |
227 | 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, | 206 | 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, |
228 | 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, | 207 | 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, |
229 | 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, | 208 | 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, |
230 | 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, | 209 | 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, |
231 | 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, | 210 | 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, |
232 | 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, | 211 | 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, |
233 | 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, | 212 | 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, |
234 | 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, | 213 | 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, |
235 | 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, | 214 | 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, |
236 | 215 | ||
237 | 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, | 216 | 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, |
238 | 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, | 217 | 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, |
239 | 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, | 218 | 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, |
240 | 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, | 219 | 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, |
241 | 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, | 220 | 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, |
242 | 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, | 221 | 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, |
243 | 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, | 222 | 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, |
244 | 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, | 223 | 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, |
245 | 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, | 224 | 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, |
246 | 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, | 225 | 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, |
247 | 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, | 226 | 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, |
248 | 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, | 227 | 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, |
249 | 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, | 228 | 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, |
250 | 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, | 229 | 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, |
251 | 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, | 230 | 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, |
252 | 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, | 231 | 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, |
253 | 232 | ||
254 | 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, | 233 | 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, |
255 | 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, | 234 | 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, |
256 | 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, | 235 | 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, |
257 | 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, | 236 | 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, |
258 | 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, | 237 | 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, |
259 | 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, | 238 | 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, |
260 | 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, | 239 | 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, |
261 | 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, | 240 | 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, |
262 | 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, | 241 | 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, |
263 | 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, | 242 | 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, |
264 | 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, | 243 | 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, |
265 | 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, | 244 | 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, |
266 | 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, | 245 | 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, |
267 | 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, | 246 | 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, |
268 | 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, | 247 | 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, |
269 | 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, | 248 | 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, |
270 | }; | 249 | }; |
271 | 250 | ||
272 | static const byte daa_carry_table[64] ICONST_ATTR = | 251 | static const byte daa_carry_table[64] ICONST_ATTR = |
273 | { | 252 | { |
274 | 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, | 253 | 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, |
275 | 00, 00, 00, 00, 00, 00, 00, 00, FC, FC, 00, 00, 00, 00, 00, 00, | 254 | 00, 00, 00, 00, 00, 00, 00, 00, FC, FC, 00, 00, 00, 00, 00, 00, |
276 | FC, FC, FC, FC, FC, FC, FC, FC, FC, FC, FC, FC, FC, FC, FC, FC, | 255 | FC, FC, FC, FC, FC, FC, FC, FC, FC, FC, FC, FC, FC, FC, FC, FC, |
277 | FC, FC, FC, FC, FC, FC, FC, FC, FC, FC, FC, FC, FC, FC, 00, FC, | 256 | FC, FC, FC, FC, FC, FC, FC, FC, FC, FC, FC, FC, FC, FC, 00, FC, |
278 | }; | 257 | }; |
diff --git a/apps/plugins/rockboy/debug.c b/apps/plugins/rockboy/debug.c index 8459ad3d5b..a829b98799 100644 --- a/apps/plugins/rockboy/debug.c +++ b/apps/plugins/rockboy/debug.c | |||
@@ -8,549 +8,548 @@ | |||
8 | #include "mem.h" | 8 | #include "mem.h" |
9 | #include "fastmem.h" | 9 | #include "fastmem.h" |
10 | #include "regs.h" | 10 | #include "regs.h" |
11 | #include "rc.h" | ||
12 | 11 | ||
13 | #include "cpuregs.h" | 12 | #include "cpuregs.h" |
14 | 13 | ||
15 | 14 | ||
16 | static char *mnemonic_table[256] = | 15 | static char *mnemonic_table[256] = |
17 | { | 16 | { |
18 | "NOP", | 17 | "NOP", |
19 | "LD BC,%w", | 18 | "LD BC,%w", |
20 | "LD (BC),A", | 19 | "LD (BC),A", |
21 | "INC BC", | 20 | "INC BC", |
22 | "INC B", | 21 | "INC B", |
23 | "DEC B", | 22 | "DEC B", |
24 | "LD B,%b", | 23 | "LD B,%b", |
25 | "RLCA", | 24 | "RLCA", |
26 | "LD (%w),SP", | 25 | "LD (%w),SP", |
27 | "ADD HL,BC", | 26 | "ADD HL,BC", |
28 | "LD A,(BC)", | 27 | "LD A,(BC)", |
29 | "DEC BC", | 28 | "DEC BC", |
30 | "INC C", | 29 | "INC C", |
31 | "DEC C", | 30 | "DEC C", |
32 | "LD C,%b", | 31 | "LD C,%b", |
33 | "RRCA", | 32 | "RRCA", |
34 | "STOP", | 33 | "STOP", |
35 | "LD DE,%w", | 34 | "LD DE,%w", |
36 | "LD (DE),A", | 35 | "LD (DE),A", |
37 | "INC DE", | 36 | "INC DE", |
38 | "INC D", | 37 | "INC D", |
39 | "DEC D", | 38 | "DEC D", |
40 | "LD D,%b", | 39 | "LD D,%b", |
41 | "RLA", | 40 | "RLA", |
42 | "JR %o", | 41 | "JR %o", |
43 | "ADD HL,DE", | 42 | "ADD HL,DE", |
44 | "LD A,(DE)", | 43 | "LD A,(DE)", |
45 | "DEC DE", | 44 | "DEC DE", |
46 | "INC E", | 45 | "INC E", |
47 | "DEC E", | 46 | "DEC E", |
48 | "LD E,%b", | 47 | "LD E,%b", |
49 | "RRA", | 48 | "RRA", |
50 | "JR NZ,%o", | 49 | "JR NZ,%o", |
51 | "LD HL,%w", | 50 | "LD HL,%w", |
52 | "LD (HLI),A", | 51 | "LD (HLI),A", |
53 | "INC HL", | 52 | "INC HL", |
54 | "INC H", | 53 | "INC H", |
55 | "DEC H", | 54 | "DEC H", |
56 | "LD H,%b", | 55 | "LD H,%b", |
57 | "DAA", | 56 | "DAA", |
58 | "JR Z,%o", | 57 | "JR Z,%o", |
59 | "ADD HL,HL", | 58 | "ADD HL,HL", |
60 | "LD A,(HLI)", | 59 | "LD A,(HLI)", |
61 | "DEC HL", | 60 | "DEC HL", |
62 | "INC L", | 61 | "INC L", |
63 | "DEC L", | 62 | "DEC L", |
64 | "LD L,%b", | 63 | "LD L,%b", |
65 | "CPL", | 64 | "CPL", |
66 | "JR NC,%o", | 65 | "JR NC,%o", |
67 | "LD SP,%w", | 66 | "LD SP,%w", |
68 | "LD (HLD),A", | 67 | "LD (HLD),A", |
69 | "INC SP", | 68 | "INC SP", |
70 | "INC (HL)", | 69 | "INC (HL)", |
71 | "DEC (HL)", | 70 | "DEC (HL)", |
72 | "LD (HL),%b", | 71 | "LD (HL),%b", |
73 | "SCF", | 72 | "SCF", |
74 | "JR C,%o", | 73 | "JR C,%o", |
75 | "ADD HL,SP", | 74 | "ADD HL,SP", |
76 | "LD A,(HLD)", | 75 | "LD A,(HLD)", |
77 | "DEC SP", | 76 | "DEC SP", |
78 | "INC A", | 77 | "INC A", |
79 | "DEC A", | 78 | "DEC A", |
80 | "LD A,%b", | 79 | "LD A,%b", |
81 | "CCF", | 80 | "CCF", |
82 | "LD B,B", | 81 | "LD B,B", |
83 | "LD B,C", | 82 | "LD B,C", |
84 | "LD B,D", | 83 | "LD B,D", |
85 | "LD B,E", | 84 | "LD B,E", |
86 | "LD B,H", | 85 | "LD B,H", |
87 | "LD B,L", | 86 | "LD B,L", |
88 | "LD B,(HL)", | 87 | "LD B,(HL)", |
89 | "LD B,A", | 88 | "LD B,A", |
90 | "LD C,B", | 89 | "LD C,B", |
91 | "LD C,C", | 90 | "LD C,C", |
92 | "LD C,D", | 91 | "LD C,D", |
93 | "LD C,E", | 92 | "LD C,E", |
94 | "LD C,H", | 93 | "LD C,H", |
95 | "LD C,L", | 94 | "LD C,L", |
96 | "LD C,(HL)", | 95 | "LD C,(HL)", |
97 | "LD C,A", | 96 | "LD C,A", |
98 | "LD D,B", | 97 | "LD D,B", |
99 | "LD D,C", | 98 | "LD D,C", |
100 | "LD D,D", | 99 | "LD D,D", |
101 | "LD D,E", | 100 | "LD D,E", |
102 | "LD D,H", | 101 | "LD D,H", |
103 | "LD D,L", | 102 | "LD D,L", |
104 | "LD D,(HL)", | 103 | "LD D,(HL)", |
105 | "LD D,A", | 104 | "LD D,A", |
106 | "LD E,B", | 105 | "LD E,B", |
107 | "LD E,C", | 106 | "LD E,C", |
108 | "LD E,D", | 107 | "LD E,D", |
109 | "LD E,E", | 108 | "LD E,E", |
110 | "LD E,H", | 109 | "LD E,H", |
111 | "LD E,L", | 110 | "LD E,L", |
112 | "LD E,(HL)", | 111 | "LD E,(HL)", |
113 | "LD E,A", | 112 | "LD E,A", |
114 | "LD H,B", | 113 | "LD H,B", |
115 | "LD H,C", | 114 | "LD H,C", |
116 | "LD H,D", | 115 | "LD H,D", |
117 | "LD H,E", | 116 | "LD H,E", |
118 | "LD H,H", | 117 | "LD H,H", |
119 | "LD H,L", | 118 | "LD H,L", |
120 | "LD H,(HL)", | 119 | "LD H,(HL)", |
121 | "LD H,A", | 120 | "LD H,A", |
122 | "LD L,B", | 121 | "LD L,B", |
123 | "LD L,C", | 122 | "LD L,C", |
124 | "LD L,D", | 123 | "LD L,D", |
125 | "LD L,E", | 124 | "LD L,E", |
126 | "LD L,H", | 125 | "LD L,H", |
127 | "LD L,L", | 126 | "LD L,L", |
128 | "LD L,(HL)", | 127 | "LD L,(HL)", |
129 | "LD L,A", | 128 | "LD L,A", |
130 | "LD (HL),B", | 129 | "LD (HL),B", |
131 | "LD (HL),C", | 130 | "LD (HL),C", |
132 | "LD (HL),D", | 131 | "LD (HL),D", |
133 | "LD (HL),E", | 132 | "LD (HL),E", |
134 | "LD (HL),H", | 133 | "LD (HL),H", |
135 | "LD (HL),L", | 134 | "LD (HL),L", |
136 | "HALT", | 135 | "HALT", |
137 | "LD (HL),A", | 136 | "LD (HL),A", |
138 | "LD A,B", | 137 | "LD A,B", |
139 | "LD A,C", | 138 | "LD A,C", |
140 | "LD A,D", | 139 | "LD A,D", |
141 | "LD A,E", | 140 | "LD A,E", |
142 | "LD A,H", | 141 | "LD A,H", |
143 | "LD A,L", | 142 | "LD A,L", |
144 | "LD A,(HL)", | 143 | "LD A,(HL)", |
145 | "LD A,A", | 144 | "LD A,A", |
146 | "ADD A,B", | 145 | "ADD A,B", |
147 | "ADD A,C", | 146 | "ADD A,C", |
148 | "ADD A,D", | 147 | "ADD A,D", |
149 | "ADD A,E", | 148 | "ADD A,E", |
150 | "ADD A,H", | 149 | "ADD A,H", |
151 | "ADD A,L", | 150 | "ADD A,L", |
152 | "ADD A,(HL)", | 151 | "ADD A,(HL)", |
153 | "ADD A,A", | 152 | "ADD A,A", |
154 | "ADC A,B", | 153 | "ADC A,B", |
155 | "ADC A,C", | 154 | "ADC A,C", |
156 | "ADC A,D", | 155 | "ADC A,D", |
157 | "ADC A,E", | 156 | "ADC A,E", |
158 | "ADC A,H", | 157 | "ADC A,H", |
159 | "ADC A,L", | 158 | "ADC A,L", |
160 | "ADC A,(HL)", | 159 | "ADC A,(HL)", |
161 | "ADC A", | 160 | "ADC A", |
162 | "SUB B", | 161 | "SUB B", |
163 | "SUB C", | 162 | "SUB C", |
164 | "SUB D", | 163 | "SUB D", |
165 | "SUB E", | 164 | "SUB E", |
166 | "SUB H", | 165 | "SUB H", |
167 | "SUB L", | 166 | "SUB L", |
168 | "SUB (HL)", | 167 | "SUB (HL)", |
169 | "SUB A", | 168 | "SUB A", |
170 | "SBC A,B", | 169 | "SBC A,B", |
171 | "SBC A,C", | 170 | "SBC A,C", |
172 | "SBC A,D", | 171 | "SBC A,D", |
173 | "SBC A,E", | 172 | "SBC A,E", |
174 | "SBC A,H", | 173 | "SBC A,H", |
175 | "SBC A,L", | 174 | "SBC A,L", |
176 | "SBC A,(HL)", | 175 | "SBC A,(HL)", |
177 | "SBC A,A", | 176 | "SBC A,A", |
178 | "AND B", | 177 | "AND B", |
179 | "AND C", | 178 | "AND C", |
180 | "AND D", | 179 | "AND D", |
181 | "AND E", | 180 | "AND E", |
182 | "AND H", | 181 | "AND H", |
183 | "AND L", | 182 | "AND L", |
184 | "AND (HL)", | 183 | "AND (HL)", |
185 | "AND A", | 184 | "AND A", |
186 | "XOR B", | 185 | "XOR B", |
187 | "XOR C", | 186 | "XOR C", |
188 | "XOR D", | 187 | "XOR D", |
189 | "XOR E", | 188 | "XOR E", |
190 | "XOR H", | 189 | "XOR H", |
191 | "XOR L", | 190 | "XOR L", |
192 | "XOR (HL)", | 191 | "XOR (HL)", |
193 | "XOR A", | 192 | "XOR A", |
194 | "OR B", | 193 | "OR B", |
195 | "OR C", | 194 | "OR C", |
196 | "OR D", | 195 | "OR D", |
197 | "OR E", | 196 | "OR E", |
198 | "OR H", | 197 | "OR H", |
199 | "OR L", | 198 | "OR L", |
200 | "OR (HL)", | 199 | "OR (HL)", |
201 | "OR A", | 200 | "OR A", |
202 | "CP B", | 201 | "CP B", |
203 | "CP C", | 202 | "CP C", |
204 | "CP D", | 203 | "CP D", |
205 | "CP E", | 204 | "CP E", |
206 | "CP H", | 205 | "CP H", |
207 | "CP L", | 206 | "CP L", |
208 | "CP (HL)", | 207 | "CP (HL)", |
209 | "CP A", | 208 | "CP A", |
210 | "RET NZ", | 209 | "RET NZ", |
211 | "POP BC", | 210 | "POP BC", |
212 | "JP NZ,%w", | 211 | "JP NZ,%w", |
213 | "JP %w", | 212 | "JP %w", |
214 | "CALL NZ,%w", | 213 | "CALL NZ,%w", |
215 | "PUSH BC", | 214 | "PUSH BC", |
216 | "ADD A,%b", | 215 | "ADD A,%b", |
217 | "RST 0h", | 216 | "RST 0h", |
218 | "RET Z", | 217 | "RET Z", |
219 | "RET", | 218 | "RET", |
220 | "JP Z,%w", | 219 | "JP Z,%w", |
221 | NULL, | 220 | NULL, |
222 | "CALL Z,%w", | 221 | "CALL Z,%w", |
223 | "CALL %w", | 222 | "CALL %w", |
224 | "ADC A,%b", | 223 | "ADC A,%b", |
225 | "RST 8h", | 224 | "RST 8h", |
226 | "RET NC", | 225 | "RET NC", |
227 | "POP DE", | 226 | "POP DE", |
228 | "JP NC,%w", | 227 | "JP NC,%w", |
229 | NULL, | 228 | NULL, |
230 | "CALL NC,%w", | 229 | "CALL NC,%w", |
231 | "PUSH DE", | 230 | "PUSH DE", |
232 | "SUB %b", | 231 | "SUB %b", |
233 | "RST 10h", | 232 | "RST 10h", |
234 | "RET C", | 233 | "RET C", |
235 | "RETI", | 234 | "RETI", |
236 | "JP C,%w", | 235 | "JP C,%w", |
237 | NULL, | 236 | NULL, |
238 | "CALL C,%w", | 237 | "CALL C,%w", |
239 | NULL, | 238 | NULL, |
240 | "SBC A,%b", | 239 | "SBC A,%b", |
241 | "RST 18h", | 240 | "RST 18h", |
242 | "LD (FF00+%b),A", | 241 | "LD (FF00+%b),A", |
243 | "POP HL", | 242 | "POP HL", |
244 | "LD (FF00+C),A", | 243 | "LD (FF00+C),A", |
245 | NULL, | 244 | NULL, |
246 | NULL, | 245 | NULL, |
247 | "PUSH HL", | 246 | "PUSH HL", |
248 | "AND %b", | 247 | "AND %b", |
249 | "RST 20h", | 248 | "RST 20h", |
250 | "ADD SP,%o", | 249 | "ADD SP,%o", |
251 | "JP HL", | 250 | "JP HL", |
252 | "LD (%w),A", | 251 | "LD (%w),A", |
253 | NULL, | 252 | NULL, |
254 | NULL, | 253 | NULL, |
255 | NULL, | 254 | NULL, |
256 | "XOR %b", | 255 | "XOR %b", |
257 | "RST 28h", | 256 | "RST 28h", |
258 | "LD A,(FF00+%b)", | 257 | "LD A,(FF00+%b)", |
259 | "POP AF", | 258 | "POP AF", |
260 | "LD A,(FF00+C)", | 259 | "LD A,(FF00+C)", |
261 | "DI", | 260 | "DI", |
262 | NULL, | 261 | NULL, |
263 | "PUSH AF", | 262 | "PUSH AF", |
264 | "OR %b", | 263 | "OR %b", |
265 | "RST 30h", | 264 | "RST 30h", |
266 | "LD HL,SP%o", | 265 | "LD HL,SP%o", |
267 | "LD SP,HL", | 266 | "LD SP,HL", |
268 | "LD A,(%w)", | 267 | "LD A,(%w)", |
269 | "EI", | 268 | "EI", |
270 | NULL, | 269 | NULL, |
271 | NULL, | 270 | NULL, |
272 | "CP %b", | 271 | "CP %b", |
273 | "RST 38h" | 272 | "RST 38h" |
274 | }; | 273 | }; |
275 | 274 | ||
276 | static char *cb_mnemonic_table[256] = | 275 | static char *cb_mnemonic_table[256] = |
277 | { | 276 | { |
278 | "RLC B", | 277 | "RLC B", |
279 | "RLC C", | 278 | "RLC C", |
280 | "RLC D", | 279 | "RLC D", |
281 | "RLC E", | 280 | "RLC E", |
282 | "RLC H", | 281 | "RLC H", |
283 | "RLC L", | 282 | "RLC L", |
284 | "RLC (HL)", | 283 | "RLC (HL)", |
285 | "RLC A", | 284 | "RLC A", |
286 | "RRC B", | 285 | "RRC B", |
287 | "RRC C", | 286 | "RRC C", |
288 | "RRC D", | 287 | "RRC D", |
289 | "RRC E", | 288 | "RRC E", |
290 | "RRC H", | 289 | "RRC H", |
291 | "RRC L", | 290 | "RRC L", |
292 | "RRC (HL)", | 291 | "RRC (HL)", |
293 | "RRC A", | 292 | "RRC A", |
294 | "RL B", | 293 | "RL B", |
295 | "RL C", | 294 | "RL C", |
296 | "RL D", | 295 | "RL D", |
297 | "RL E", | 296 | "RL E", |
298 | "RL H", | 297 | "RL H", |
299 | "RL L", | 298 | "RL L", |
300 | "RL (HL)", | 299 | "RL (HL)", |
301 | "RL A", | 300 | "RL A", |
302 | "RR B", | 301 | "RR B", |
303 | "RR C", | 302 | "RR C", |
304 | "RR D", | 303 | "RR D", |
305 | "RR E", | 304 | "RR E", |
306 | "RR H", | 305 | "RR H", |
307 | "RR L", | 306 | "RR L", |
308 | "RR (HL)", | 307 | "RR (HL)", |
309 | "RR A", | 308 | "RR A", |
310 | "SLA B", | 309 | "SLA B", |
311 | "SLA C", | 310 | "SLA C", |
312 | "SLA D", | 311 | "SLA D", |
313 | "SLA E", | 312 | "SLA E", |
314 | "SLA H", | 313 | "SLA H", |
315 | "SLA L", | 314 | "SLA L", |
316 | "SLA (HL)", | 315 | "SLA (HL)", |
317 | "SLA A", | 316 | "SLA A", |
318 | "SRA B", | 317 | "SRA B", |
319 | "SRA C", | 318 | "SRA C", |
320 | "SRA D", | 319 | "SRA D", |
321 | "SRA E", | 320 | "SRA E", |
322 | "SRA H", | 321 | "SRA H", |
323 | "SRA L", | 322 | "SRA L", |
324 | "SRA (HL)", | 323 | "SRA (HL)", |
325 | "SRA A", | 324 | "SRA A", |
326 | "SWAP B", | 325 | "SWAP B", |
327 | "SWAP C", | 326 | "SWAP C", |
328 | "SWAP D", | 327 | "SWAP D", |
329 | "SWAP E", | 328 | "SWAP E", |
330 | "SWAP H", | 329 | "SWAP H", |
331 | "SWAP L", | 330 | "SWAP L", |
332 | "SWAP (HL)", | 331 | "SWAP (HL)", |
333 | "SWAP A", | 332 | "SWAP A", |
334 | "SRL B", | 333 | "SRL B", |
335 | "SRL C", | 334 | "SRL C", |
336 | "SRL D", | 335 | "SRL D", |
337 | "SRL E", | 336 | "SRL E", |
338 | "SRL H", | 337 | "SRL H", |
339 | "SRL L", | 338 | "SRL L", |
340 | "SRL (HL)", | 339 | "SRL (HL)", |
341 | "SRL A", | 340 | "SRL A", |
342 | "BIT 0,B", | 341 | "BIT 0,B", |
343 | "BIT 0,C", | 342 | "BIT 0,C", |
344 | "BIT 0,D", | 343 | "BIT 0,D", |
345 | "BIT 0,E", | 344 | "BIT 0,E", |
346 | "BIT 0,H", | 345 | "BIT 0,H", |
347 | "BIT 0,L", | 346 | "BIT 0,L", |
348 | "BIT 0,(HL)", | 347 | "BIT 0,(HL)", |
349 | "BIT 0,A", | 348 | "BIT 0,A", |
350 | "BIT 1,B", | 349 | "BIT 1,B", |
351 | "BIT 1,C", | 350 | "BIT 1,C", |
352 | "BIT 1,D", | 351 | "BIT 1,D", |
353 | "BIT 1,E", | 352 | "BIT 1,E", |
354 | "BIT 1,H", | 353 | "BIT 1,H", |
355 | "BIT 1,L", | 354 | "BIT 1,L", |
356 | "BIT 1,(HL)", | 355 | "BIT 1,(HL)", |
357 | "BIT 1,A", | 356 | "BIT 1,A", |
358 | "BIT 2,B", | 357 | "BIT 2,B", |
359 | "BIT 2,C", | 358 | "BIT 2,C", |
360 | "BIT 2,D", | 359 | "BIT 2,D", |
361 | "BIT 2,E", | 360 | "BIT 2,E", |
362 | "BIT 2,H", | 361 | "BIT 2,H", |
363 | "BIT 2,L", | 362 | "BIT 2,L", |
364 | "BIT 2,(HL)", | 363 | "BIT 2,(HL)", |
365 | "BIT 2,A", | 364 | "BIT 2,A", |
366 | "BIT 3,B", | 365 | "BIT 3,B", |
367 | "BIT 3,C", | 366 | "BIT 3,C", |
368 | "BIT 3,D", | 367 | "BIT 3,D", |
369 | "BIT 3,E", | 368 | "BIT 3,E", |
370 | "BIT 3,H", | 369 | "BIT 3,H", |
371 | "BIT 3,L", | 370 | "BIT 3,L", |
372 | "BIT 3,(HL)", | 371 | "BIT 3,(HL)", |
373 | "BIT 3,A", | 372 | "BIT 3,A", |
374 | "BIT 4,B", | 373 | "BIT 4,B", |
375 | "BIT 4,C", | 374 | "BIT 4,C", |
376 | "BIT 4,D", | 375 | "BIT 4,D", |
377 | "BIT 4,E", | 376 | "BIT 4,E", |
378 | "BIT 4,H", | 377 | "BIT 4,H", |
379 | "BIT 4,L", | 378 | "BIT 4,L", |
380 | "BIT 4,(HL)", | 379 | "BIT 4,(HL)", |
381 | "BIT 4,A", | 380 | "BIT 4,A", |
382 | "BIT 5,B", | 381 | "BIT 5,B", |
383 | "BIT 5,C", | 382 | "BIT 5,C", |
384 | "BIT 5,D", | 383 | "BIT 5,D", |
385 | "BIT 5,E", | 384 | "BIT 5,E", |
386 | "BIT 5,H", | 385 | "BIT 5,H", |
387 | "BIT 5,L", | 386 | "BIT 5,L", |
388 | "BIT 5,(HL)", | 387 | "BIT 5,(HL)", |
389 | "BIT 5,A", | 388 | "BIT 5,A", |
390 | "BIT 6,B", | 389 | "BIT 6,B", |
391 | "BIT 6,C", | 390 | "BIT 6,C", |
392 | "BIT 6,D", | 391 | "BIT 6,D", |
393 | "BIT 6,E", | 392 | "BIT 6,E", |
394 | "BIT 6,H", | 393 | "BIT 6,H", |
395 | "BIT 6,L", | 394 | "BIT 6,L", |
396 | "BIT 6,(HL)", | 395 | "BIT 6,(HL)", |
397 | "BIT 6,A", | 396 | "BIT 6,A", |
398 | "BIT 7,B", | 397 | "BIT 7,B", |
399 | "BIT 7,C", | 398 | "BIT 7,C", |
400 | "BIT 7,D", | 399 | "BIT 7,D", |
401 | "BIT 7,E", | 400 | "BIT 7,E", |
402 | "BIT 7,H", | 401 | "BIT 7,H", |
403 | "BIT 7,L", | 402 | "BIT 7,L", |
404 | "BIT 7,(HL)", | 403 | "BIT 7,(HL)", |
405 | "BIT 7,A", | 404 | "BIT 7,A", |
406 | "RES 0,B", | 405 | "RES 0,B", |
407 | "RES 0,C", | 406 | "RES 0,C", |
408 | "RES 0,D", | 407 | "RES 0,D", |
409 | "RES 0,E", | 408 | "RES 0,E", |
410 | "RES 0,H", | 409 | "RES 0,H", |
411 | "RES 0,L", | 410 | "RES 0,L", |
412 | "RES 0,(HL)", | 411 | "RES 0,(HL)", |
413 | "RES 0,A", | 412 | "RES 0,A", |
414 | "RES 1,B", | 413 | "RES 1,B", |
415 | "RES 1,C", | 414 | "RES 1,C", |
416 | "RES 1,D", | 415 | "RES 1,D", |
417 | "RES 1,E", | 416 | "RES 1,E", |
418 | "RES 1,H", | 417 | "RES 1,H", |
419 | "RES 1,L", | 418 | "RES 1,L", |
420 | "RES 1,(HL)", | 419 | "RES 1,(HL)", |
421 | "RES 1,A", | 420 | "RES 1,A", |
422 | "RES 2,B", | 421 | "RES 2,B", |
423 | "RES 2,C", | 422 | "RES 2,C", |
424 | "RES 2,D", | 423 | "RES 2,D", |
425 | "RES 2,E", | 424 | "RES 2,E", |
426 | "RES 2,H", | 425 | "RES 2,H", |
427 | "RES 2,L", | 426 | "RES 2,L", |
428 | "RES 2,(HL)", | 427 | "RES 2,(HL)", |
429 | "RES 2,A", | 428 | "RES 2,A", |
430 | "RES 3,B", | 429 | "RES 3,B", |
431 | "RES 3,C", | 430 | "RES 3,C", |
432 | "RES 3,D", | 431 | "RES 3,D", |
433 | "RES 3,E", | 432 | "RES 3,E", |
434 | "RES 3,H", | 433 | "RES 3,H", |
435 | "RES 3,L", | 434 | "RES 3,L", |
436 | "RES 3,(HL)", | 435 | "RES 3,(HL)", |
437 | "RES 3,A", | 436 | "RES 3,A", |
438 | "RES 4,B", | 437 | "RES 4,B", |
439 | "RES 4,C", | 438 | "RES 4,C", |
440 | "RES 4,D", | 439 | "RES 4,D", |
441 | "RES 4,E", | 440 | "RES 4,E", |
442 | "RES 4,H", | 441 | "RES 4,H", |
443 | "RES 4,L", | 442 | "RES 4,L", |
444 | "RES 4,(HL)", | 443 | "RES 4,(HL)", |
445 | "RES 4,A", | 444 | "RES 4,A", |
446 | "RES 5,B", | 445 | "RES 5,B", |
447 | "RES 5,C", | 446 | "RES 5,C", |
448 | "RES 5,D", | 447 | "RES 5,D", |
449 | "RES 5,E", | 448 | "RES 5,E", |
450 | "RES 5,H", | 449 | "RES 5,H", |
451 | "RES 5,L", | 450 | "RES 5,L", |
452 | "RES 5,(HL)", | 451 | "RES 5,(HL)", |
453 | "RES 5,A", | 452 | "RES 5,A", |
454 | "RES 6,B", | 453 | "RES 6,B", |
455 | "RES 6,C", | 454 | "RES 6,C", |
456 | "RES 6,D", | 455 | "RES 6,D", |
457 | "RES 6,E", | 456 | "RES 6,E", |
458 | "RES 6,H", | 457 | "RES 6,H", |
459 | "RES 6,L", | 458 | "RES 6,L", |
460 | "RES 6,(HL)", | 459 | "RES 6,(HL)", |
461 | "RES 6,A", | 460 | "RES 6,A", |
462 | "RES 7,B", | 461 | "RES 7,B", |
463 | "RES 7,C", | 462 | "RES 7,C", |
464 | "RES 7,D", | 463 | "RES 7,D", |
465 | "RES 7,E", | 464 | "RES 7,E", |
466 | "RES 7,H", | 465 | "RES 7,H", |
467 | "RES 7,L", | 466 | "RES 7,L", |
468 | "RES 7,(HL)", | 467 | "RES 7,(HL)", |
469 | "RES 7,A", | 468 | "RES 7,A", |
470 | "SET 0,B", | 469 | "SET 0,B", |
471 | "SET 0,C", | 470 | "SET 0,C", |
472 | "SET 0,D", | 471 | "SET 0,D", |
473 | "SET 0,E", | 472 | "SET 0,E", |
474 | "SET 0,H", | 473 | "SET 0,H", |
475 | "SET 0,L", | 474 | "SET 0,L", |
476 | "SET 0,(HL)", | 475 | "SET 0,(HL)", |
477 | "SET 0,A", | 476 | "SET 0,A", |
478 | "SET 1,B", | 477 | "SET 1,B", |
479 | "SET 1,C", | 478 | "SET 1,C", |
480 | "SET 1,D", | 479 | "SET 1,D", |
481 | "SET 1,E", | 480 | "SET 1,E", |
482 | "SET 1,H", | 481 | "SET 1,H", |
483 | "SET 1,L", | 482 | "SET 1,L", |
484 | "SET 1,(HL)", | 483 | "SET 1,(HL)", |
485 | "SET 1,A", | 484 | "SET 1,A", |
486 | "SET 2,B", | 485 | "SET 2,B", |
487 | "SET 2,C", | 486 | "SET 2,C", |
488 | "SET 2,D", | 487 | "SET 2,D", |
489 | "SET 2,E", | 488 | "SET 2,E", |
490 | "SET 2,H", | 489 | "SET 2,H", |
491 | "SET 2,L", | 490 | "SET 2,L", |
492 | "SET 2,(HL)", | 491 | "SET 2,(HL)", |
493 | "SET 2,A", | 492 | "SET 2,A", |
494 | "SET 3,B", | 493 | "SET 3,B", |
495 | "SET 3,C", | 494 | "SET 3,C", |
496 | "SET 3,D", | 495 | "SET 3,D", |
497 | "SET 3,E", | 496 | "SET 3,E", |
498 | "SET 3,H", | 497 | "SET 3,H", |
499 | "SET 3,L", | 498 | "SET 3,L", |
500 | "SET 3,(HL)", | 499 | "SET 3,(HL)", |
501 | "SET 3,A", | 500 | "SET 3,A", |
502 | "SET 4,B", | 501 | "SET 4,B", |
503 | "SET 4,C", | 502 | "SET 4,C", |
504 | "SET 4,D", | 503 | "SET 4,D", |
505 | "SET 4,E", | 504 | "SET 4,E", |
506 | "SET 4,H", | 505 | "SET 4,H", |
507 | "SET 4,L", | 506 | "SET 4,L", |
508 | "SET 4,(HL)", | 507 | "SET 4,(HL)", |
509 | "SET 4,A", | 508 | "SET 4,A", |
510 | "SET 5,B", | 509 | "SET 5,B", |
511 | "SET 5,C", | 510 | "SET 5,C", |
512 | "SET 5,D", | 511 | "SET 5,D", |
513 | "SET 5,E", | 512 | "SET 5,E", |
514 | "SET 5,H", | 513 | "SET 5,H", |
515 | "SET 5,L", | 514 | "SET 5,L", |
516 | "SET 5,(HL)", | 515 | "SET 5,(HL)", |
517 | "SET 5,A", | 516 | "SET 5,A", |
518 | "SET 6,B", | 517 | "SET 6,B", |
519 | "SET 6,C", | 518 | "SET 6,C", |
520 | "SET 6,D", | 519 | "SET 6,D", |
521 | "SET 6,E", | 520 | "SET 6,E", |
522 | "SET 6,H", | 521 | "SET 6,H", |
523 | "SET 6,L", | 522 | "SET 6,L", |
524 | "SET 6,(HL)", | 523 | "SET 6,(HL)", |
525 | "SET 6,A", | 524 | "SET 6,A", |
526 | "SET 7,B", | 525 | "SET 7,B", |
527 | "SET 7,C", | 526 | "SET 7,C", |
528 | "SET 7,D", | 527 | "SET 7,D", |
529 | "SET 7,E", | 528 | "SET 7,E", |
530 | "SET 7,H", | 529 | "SET 7,H", |
531 | "SET 7,L", | 530 | "SET 7,L", |
532 | "SET 7,(HL)", | 531 | "SET 7,(HL)", |
533 | "SET 7,A" | 532 | "SET 7,A" |
534 | }; | 533 | }; |
535 | 534 | ||
536 | static byte operand_count[256] = | 535 | static byte operand_count[256] = |
537 | { | 536 | { |
538 | 1, 3, 1, 1, 1, 1, 2, 1, 3, 1, 1, 1, 1, 1, 2, 1, | 537 | 1, 3, 1, 1, 1, 1, 2, 1, 3, 1, 1, 1, 1, 1, 2, 1, |
539 | 1, 3, 1, 1, 1, 1, 2, 1, 2, 1, 1, 1, 1, 1, 2, 1, | 538 | 1, 3, 1, 1, 1, 1, 2, 1, 2, 1, 1, 1, 1, 1, 2, 1, |
540 | 2, 3, 1, 1, 1, 1, 2, 1, 2, 1, 1, 1, 1, 1, 2, 1, | 539 | 2, 3, 1, 1, 1, 1, 2, 1, 2, 1, 1, 1, 1, 1, 2, 1, |
541 | 2, 3, 1, 1, 1, 1, 2, 1, 2, 1, 1, 1, 1, 1, 2, 1, | 540 | 2, 3, 1, 1, 1, 1, 2, 1, 2, 1, 1, 1, 1, 1, 2, 1, |
542 | 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | 541 | 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, |
543 | 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | 542 | 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, |
544 | 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | 543 | 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, |
545 | 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | 544 | 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, |
546 | 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | 545 | 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, |
547 | 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | 546 | 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, |
548 | 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | 547 | 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, |
549 | 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | 548 | 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, |
550 | 1, 1, 3, 3, 3, 1, 2, 1, 1, 1, 3, 2, 3, 3, 2, 1, | 549 | 1, 1, 3, 3, 3, 1, 2, 1, 1, 1, 3, 2, 3, 3, 2, 1, |
551 | 1, 1, 3, 1, 3, 1, 2, 1, 1, 1, 3, 1, 3, 1, 2, 1, | 550 | 1, 1, 3, 1, 3, 1, 2, 1, 1, 1, 3, 1, 3, 1, 2, 1, |
552 | 2, 1, 1, 1, 1, 1, 2, 1, 2, 1, 3, 1, 1, 1, 2, 1, | 551 | 2, 1, 1, 1, 1, 1, 2, 1, 2, 1, 3, 1, 1, 1, 2, 1, |
553 | 2, 1, 1, 1, 1, 1, 2, 1, 2, 1, 3, 1, 1, 1, 2, 1 | 552 | 2, 1, 1, 1, 1, 1, 2, 1, 2, 1, 3, 1, 1, 1, 2, 1 |
554 | }; | 553 | }; |
555 | 554 | ||
556 | 555 | ||
@@ -560,116 +559,95 @@ int debug_trace = 0; | |||
560 | 559 | ||
561 | rcvar_t debug_exports[] = | 560 | rcvar_t debug_exports[] = |
562 | { | 561 | { |
563 | RCV_BOOL("trace", &debug_trace), | 562 | RCV_BOOL("trace", &debug_trace), |
564 | RCV_END | 563 | RCV_END |
565 | }; | 564 | }; |
566 | 565 | ||
567 | void debug_disassemble(addr a, int c) | 566 | void debug_disassemble(addr a, int c) |
568 | { | 567 | { |
569 | static int i, j, k; | 568 | static int i, j, k; |
570 | static byte code; | 569 | static byte code; |
571 | static byte ops[3]; | 570 | static byte ops[3]; |
572 | static int opaddr; | 571 | static int opaddr; |
573 | static char mnemonic[256]; | 572 | static char mnemonic[256]; |
574 | static char *pattern; | 573 | static char *pattern; |
575 | char meow[500],buf[300]; | 574 | char meow[500],buf[300]; |
576 | // int fd; | 575 | if(!debug_trace) return; |
577 | if(!debug_trace) return; | 576 | |
578 | // fd=open("/rockboy.trace",O_WRONLY|O_APPEND); | 577 | while (c > 0) |
579 | // if(fd<0) | 578 | { |
580 | // return; | 579 | k = 0; |
581 | 580 | opaddr = a; | |
582 | while (c > 0) | 581 | code = ops[k++] = readb(a); a++; |
583 | { | 582 | if (code != 0xCB) |
584 | k = 0; | 583 | { |
585 | opaddr = a; | 584 | pattern = mnemonic_table[code]; |
586 | code = ops[k++] = readb(a); a++; | 585 | if (!pattern) |
587 | if (code != 0xCB) | 586 | pattern = "***INVALID***"; |
588 | { | 587 | } |
589 | pattern = mnemonic_table[code]; | 588 | else |
590 | if (!pattern) | 589 | { |
591 | pattern = "***INVALID***"; | 590 | code = ops[k++] = readb(a); a++; |
592 | } | 591 | pattern = cb_mnemonic_table[code]; |
593 | else | 592 | } |
594 | { | 593 | i = j = 0; |
595 | code = ops[k++] = readb(a); a++; | 594 | while (pattern[i]) |
596 | pattern = cb_mnemonic_table[code]; | 595 | { |
597 | } | 596 | if (pattern[i] == '%') |
598 | i = j = 0; | 597 | { |
599 | while (pattern[i]) | 598 | switch (pattern[++i]) |
600 | { | 599 | { |
601 | if (pattern[i] == '%') | 600 | case 'B': |
602 | { | 601 | case 'b': |
603 | switch (pattern[++i]) | 602 | ops[k] = readb(a); a++; |
604 | { | 603 | j += snprintf(mnemonic + j,255-j, |
605 | case 'B': | 604 | "%02Xh", ops[k++]); |
606 | case 'b': | 605 | break; |
607 | ops[k] = readb(a); a++; | 606 | case 'W': |
608 | j += snprintf(mnemonic + j,255-j, | 607 | case 'w': |
609 | "%02Xh", ops[k++]); | 608 | ops[k] = readb(a); a++; |
610 | break; | 609 | ops[k+1] = readb(a); a++; |
611 | case 'W': | 610 | j += snprintf(mnemonic + j, 255-j,"%04Xh", |
612 | case 'w': | 611 | ((ops[k+1] << 8) | ops[k])); |
613 | ops[k] = readb(a); a++; | 612 | k += 2; |
614 | ops[k+1] = readb(a); a++; | 613 | break; |
615 | j += snprintf(mnemonic + j, 255-j,"%04Xh", | 614 | case 'O': |
616 | ((ops[k+1] << 8) | ops[k])); | 615 | case 'o': |
617 | k += 2; | 616 | ops[k] = readb(a); a++; |
618 | break; | 617 | j += snprintf(mnemonic + j, 255-j,"%+d", |
619 | case 'O': | 618 | (n8)(ops[k++])); |
620 | case 'o': | 619 | break; |
621 | ops[k] = readb(a); a++; | 620 | } |
622 | j += snprintf(mnemonic + j, 255-j,"%+d", | 621 | i++; |
623 | (n8)(ops[k++])); | 622 | } |
624 | break; | 623 | else |
625 | } | 624 | { |
626 | i++; | 625 | mnemonic[j++] = pattern[i++]; |
627 | } | 626 | } |
628 | else | 627 | } |
629 | { | 628 | mnemonic[j] = 0; |
630 | mnemonic[j++] = pattern[i++]; | 629 | snprintf(buf,299,"%04X ", opaddr); |
631 | } | 630 | strcpy(meow,buf); |
632 | } | 631 | switch (operand_count[ops[0]]) { |
633 | mnemonic[j] = 0; | 632 | case 1: |
634 | snprintf(buf,299,"%04X ", opaddr); | 633 | snprintf(buf,299,"%02X ", ops[0]); |
635 | strcpy(meow,buf); | 634 | strcat(meow,buf); |
636 | switch (operand_count[ops[0]]) { | 635 | break; |
637 | case 1: | 636 | case 2: |
638 | snprintf(buf,299,"%02X ", ops[0]); | 637 | snprintf(buf,299,"%02X %02X ", ops[0], ops[1]); |
639 | strcat(meow,buf); | 638 | strcat(meow,buf); |
640 | break; | 639 | break; |
641 | case 2: | 640 | case 3: |
642 | snprintf(buf,299,"%02X %02X ", ops[0], ops[1]); | 641 | snprintf(buf,299,"%02X %02X %02X ", ops[0], ops[1], ops[2]); |
643 | strcat(meow,buf); | 642 | strcat(meow,buf); |
644 | break; | 643 | break; |
645 | case 3: | 644 | } |
646 | snprintf(buf,299,"%02X %02X %02X ", ops[0], ops[1], ops[2]); | 645 | snprintf(buf,"%-16.16s", mnemonic); |
647 | strcat(meow,buf); | 646 | strcat(meow,buf); |
648 | break; | ||
649 | } | ||
650 | snprintf(buf,"%-16.16s", mnemonic); | ||
651 | strcat(meow,buf); | ||
652 | rb->lcd_putsxy(0,0,meow); | 647 | rb->lcd_putsxy(0,0,meow); |
653 | rb->lcd_update(); | 648 | rb->lcd_update(); |
654 | /* fprintf(fd, | 649 | c--; |
655 | " SP=%04X.%04X BC=%04X.%02X.%02X DE=%04X.%02X " | 650 | } |
656 | "HL=%04X.%02X A=%02X F=%02X %c%c%c%c%c", | ||
657 | SP, readw(SP), | ||
658 | BC, readb(BC), readb(0xFF00 | C), | ||
659 | DE, readb(DE), | ||
660 | HL, readb(HL), A, | ||
661 | F, (IME ? 'I' : '-'), | ||
662 | ((F & 0x80) ? 'Z' : '-'), | ||
663 | ((F & 0x40) ? 'N' : '-'), | ||
664 | ((F & 0x20) ? 'H' : '-'), | ||
665 | ((F & 0x10) ? 'C' : '-') | ||
666 | ); | ||
667 | fprintf(fd, | ||
668 | " IE=%02X IF=%02X LCDC=%02X STAT=%02X LY=%02X LYC=%02X", | ||
669 | R_IE, R_IF, R_LCDC, R_STAT, R_LY, R_LYC | ||
670 | );*/ | ||
671 | c--; | ||
672 | } | ||
673 | } | 651 | } |
674 | 652 | ||
675 | 653 | ||
diff --git a/apps/plugins/rockboy/dynarec.c b/apps/plugins/rockboy/dynarec.c index 6d424a047f..6ab1ec79b4 100644 --- a/apps/plugins/rockboy/dynarec.c +++ b/apps/plugins/rockboy/dynarec.c | |||
@@ -1,5 +1,3 @@ | |||
1 | #ifdef DYNAREC | ||
2 | #include <system.h> | ||
3 | #include "rockmacros.h" | 1 | #include "rockmacros.h" |
4 | #include "defs.h" | 2 | #include "defs.h" |
5 | #include "regs.h" | 3 | #include "regs.h" |
@@ -58,10 +56,10 @@ int blockclen; | |||
58 | DYNA_MOVEM(3,0x3FE,1); | 56 | DYNA_MOVEM(3,0x3FE,1); |
59 | 57 | ||
60 | /* | 58 | /* |
61 | * SUBQ 2, %a0 // decrease gb sp | 59 | * SUBQ 2, %a0 decrease gb sp |
62 | * PEA #(n) // push n | 60 | * PEA #(n) push n |
63 | * PUSH %a0 // push gb sp | 61 | * PUSH %a0 push gb sp |
64 | * call_native writew(SP, (n) | 62 | * call_native writew(SP, (n)) |
65 | * ADDQ 8, %a7 | 63 | * ADDQ 8, %a7 |
66 | */ | 64 | */ |
67 | #define PUSH(n) \ | 65 | #define PUSH(n) \ |
@@ -72,7 +70,7 @@ int blockclen; | |||
72 | DYNA_ADDQ_l_i_to_r(0,7,1); | 70 | DYNA_ADDQ_l_i_to_r(0,7,1); |
73 | 71 | ||
74 | /* | 72 | /* |
75 | * PUSH %a0 // push gb sp | 73 | * PUSH %a0 push gb sp |
76 | * call_native readw(SP); | 74 | * call_native readw(SP); |
77 | * addq 4, a7 | 75 | * addq 4, a7 |
78 | * addq 2, a0 | 76 | * addq 2, a0 |
@@ -133,21 +131,24 @@ int blockclen; | |||
133 | DYNA_ANDI_l_i_to_r(0xFF,1); | 131 | DYNA_ANDI_l_i_to_r(0xFF,1); |
134 | 132 | ||
135 | 133 | ||
136 | void DYNA_MOVE_b_r_to_r(un8 src,un8 dest) { | 134 | void DYNA_MOVE_b_r_to_r(un8 src,un8 dest) |
135 | { | ||
137 | DWRITEW(0x1000|(src&0x7)|(dest&0x7)<<9); | 136 | DWRITEW(0x1000|(src&0x7)|(dest&0x7)<<9); |
138 | } | 137 | } |
139 | 138 | ||
140 | void DYNA_ASHIFT_l(un8 src, un8 dest, int left, int src_is_reg) { | 139 | void DYNA_ASHIFT_l(un8 src, un8 dest, int left, int src_is_reg) |
140 | { | ||
141 | unsigned short opcode; | 141 | unsigned short opcode; |
142 | opcode=(0xE080)|((src&0x7)<<9)|(dest&0x7); | 142 | opcode=(0xE080)|((src&0x7)<<9)|(dest&0x7); |
143 | if(left) | 143 | if(left) |
144 | opcode|=0x100; | 144 | opcode|=0x100; |
145 | if(src_is_reg) | 145 | if(src_is_reg) |
146 | opcode|=0x20; | 146 | opcode|=0x20; |
147 | DWRITEW(opcode); | 147 | DWRITEW(opcode); |
148 | } | 148 | } |
149 | 149 | ||
150 | void DYNA_LSHIFT_l(un8 src, un8 dest, int left, int src_is_reg) { | 150 | void DYNA_LSHIFT_l(un8 src, un8 dest, int left, int src_is_reg) |
151 | { | ||
151 | unsigned short opcode=0xE088|((src&0x7)<<9)|(dest&0x7); | 152 | unsigned short opcode=0xE088|((src&0x7)<<9)|(dest&0x7); |
152 | if(left) | 153 | if(left) |
153 | opcode|=0x100; | 154 | opcode|=0x100; |
@@ -156,63 +157,74 @@ void DYNA_LSHIFT_l(un8 src, un8 dest, int left, int src_is_reg) { | |||
156 | DWRITEW(opcode); | 157 | DWRITEW(opcode); |
157 | } | 158 | } |
158 | 159 | ||
159 | void DYNA_MOVE_l_i_to_r(un32 imm, un8 dest) { | 160 | void DYNA_MOVE_l_i_to_r(un32 imm, un8 dest) |
161 | { | ||
160 | DWRITEW(0x203C|(dest&0x7)<<9); | 162 | DWRITEW(0x203C|(dest&0x7)<<9); |
161 | DWRITEL(imm); // endianness? | 163 | DWRITEL(imm); /* endianness? */ |
162 | } | 164 | } |
163 | 165 | ||
164 | void DYNA_MOVE_l_i_to_m(un32 imm, un8 dest_a) { | 166 | void DYNA_MOVE_l_i_to_m(un32 imm, un8 dest_a) |
167 | { | ||
165 | DWRITEW(0x20FC|((dest_a&0x7)<<9)); | 168 | DWRITEW(0x20FC|((dest_a&0x7)<<9)); |
166 | DWRITEL(imm); | 169 | DWRITEL(imm); |
167 | } | 170 | } |
168 | 171 | ||
169 | void DYNA_MOVE_l_r_to_m(un8 src,un8 dest_a) { | 172 | void DYNA_MOVE_l_r_to_m(un8 src,un8 dest_a) |
173 | { | ||
170 | DWRITEW(0x2080|(dest_a&0x7)<<9|(src&0x7)); | 174 | DWRITEW(0x2080|(dest_a&0x7)<<9|(src&0x7)); |
171 | } | 175 | } |
172 | 176 | ||
173 | void DYNA_MOVE_l_r_to_r(un8 src, un8 dest, int src_is_areg) { | 177 | void DYNA_MOVE_l_r_to_r(un8 src, un8 dest, int src_is_areg) |
178 | { | ||
174 | unsigned short opcode=0x2000|((dest&0x7)<<9)|(src&0x7); | 179 | unsigned short opcode=0x2000|((dest&0x7)<<9)|(src&0x7); |
175 | if(src_is_areg) | 180 | if(src_is_areg) |
176 | opcode|=0x8; | 181 | opcode|=0x8; |
177 | DWRITEW(opcode); | 182 | DWRITEW(opcode); |
178 | } | 183 | } |
179 | 184 | ||
180 | void DYNA_MOVE_w_r_to_r(un8 src, un8 dest, int src_is_areg) { | 185 | void DYNA_MOVE_w_r_to_r(un8 src, un8 dest, int src_is_areg) |
186 | { | ||
181 | unsigned short opcode=0x3000|((dest&0x7)<<9)|(src&0x7); | 187 | unsigned short opcode=0x3000|((dest&0x7)<<9)|(src&0x7); |
182 | if(src_is_areg) | 188 | if(src_is_areg) |
183 | opcode|=0x8; | 189 | opcode|=0x8; |
184 | DWRITEW(opcode); | 190 | DWRITEW(opcode); |
185 | } | 191 | } |
186 | 192 | ||
187 | void DYNA_MOVEQ_l_i_to_r(un8 imm, un8 dest) { | 193 | void DYNA_MOVEQ_l_i_to_r(un8 imm, un8 dest) |
194 | { | ||
188 | DWRITEW(0x7000|((dest&0x7)<<9)|imm); | 195 | DWRITEW(0x7000|((dest&0x7)<<9)|imm); |
189 | } | 196 | } |
190 | 197 | ||
191 | void DYNA_PEA_w_i(un16 imm) { | 198 | void DYNA_PEA_w_i(un16 imm) |
199 | { | ||
192 | DWRITEW(0x4878); | 200 | DWRITEW(0x4878); |
193 | DWRITEW(imm); | 201 | DWRITEW(imm); |
194 | } | 202 | } |
195 | 203 | ||
196 | void DYNA_PUSH_l_r(un8 reg,int src_is_areg) { | 204 | void DYNA_PUSH_l_r(un8 reg,int src_is_areg) |
205 | { | ||
197 | unsigned short value= 0x2F00|(reg&0x7); | 206 | unsigned short value= 0x2F00|(reg&0x7); |
198 | if(src_is_areg) | 207 | if(src_is_areg) |
199 | value|=0x8; | 208 | value|=0x8; |
200 | DWRITEW(value); | 209 | DWRITEW(value); |
201 | } | 210 | } |
202 | 211 | ||
203 | void DYNA_MOVEA_l_i_to_r(un32 imm, un8 dest) { | 212 | void DYNA_MOVEA_l_i_to_r(un32 imm, un8 dest) |
213 | { | ||
204 | DWRITEW(0x207C|(dest&0x7)<<9); | 214 | DWRITEW(0x207C|(dest&0x7)<<9); |
205 | DWRITEL(imm); | 215 | DWRITEL(imm); |
206 | } | 216 | } |
207 | 217 | ||
208 | void DYNA_MOVEA_w_r_to_r(un8 src, un8 dest, int src_is_areg) { | 218 | void DYNA_MOVEA_w_r_to_r(un8 src, un8 dest, int src_is_areg) |
219 | { | ||
209 | unsigned short value=0x3040|((dest&0x7)<<9)|(src&0x7); | 220 | unsigned short value=0x3040|((dest&0x7)<<9)|(src&0x7); |
210 | if(src_is_areg) | 221 | if(src_is_areg) |
211 | value|=0x8; | 222 | value|=0x8; |
212 | DWRITEW(value); | 223 | DWRITEW(value); |
213 | } | 224 | } |
214 | 225 | ||
215 | void DYNA_MOVEA_l_r_to_r(un8 src, un8 dest, int src_is_areg) { | 226 | void DYNA_MOVEA_l_r_to_r(un8 src, un8 dest, int src_is_areg) |
227 | { | ||
216 | unsigned short value=0x2040|((dest&0x7)<<9)|(src&0x7); | 228 | unsigned short value=0x2040|((dest&0x7)<<9)|(src&0x7); |
217 | if(src_is_areg) | 229 | if(src_is_areg) |
218 | value|=0x8; | 230 | value|=0x8; |
@@ -220,67 +232,80 @@ void DYNA_MOVEA_l_r_to_r(un8 src, un8 dest, int src_is_areg) { | |||
220 | } | 232 | } |
221 | 233 | ||
222 | 234 | ||
223 | void DYNA_RET() { | 235 | void DYNA_RET(void) |
236 | { | ||
224 | DWRITEW(0x4E75); | 237 | DWRITEW(0x4E75); |
225 | } | 238 | } |
226 | 239 | ||
227 | void DYNA_AND_l_i_to_r(un32 imm, un8 dest) { | 240 | void DYNA_AND_l_i_to_r(un32 imm, un8 dest) |
241 | { | ||
228 | DWRITEW(0x0280|(dest&0x7)); | 242 | DWRITEW(0x0280|(dest&0x7)); |
229 | DWRITEL(imm); | 243 | DWRITEL(imm); |
230 | } | 244 | } |
231 | 245 | ||
232 | void DYNA_AND_l_r_to_r(un8 src,un8 dest) { | 246 | void DYNA_AND_l_r_to_r(un8 src,un8 dest) |
247 | { | ||
233 | DWRITEW(0xC080|((dest&0x7)<<9)|(src&0x7)); | 248 | DWRITEW(0xC080|((dest&0x7)<<9)|(src&0x7)); |
234 | } | 249 | } |
235 | 250 | ||
236 | void DYNA_OR_l_r_to_r(un8 src,un8 dest) { | 251 | void DYNA_OR_l_r_to_r(un8 src,un8 dest) |
252 | { | ||
237 | DWRITEW(0x8080|((dest&0x7)<<9)|(src&0x7)); | 253 | DWRITEW(0x8080|((dest&0x7)<<9)|(src&0x7)); |
238 | } | 254 | } |
239 | 255 | ||
240 | void DYNA_OR_l_i_to_r(un32 imm,un8 dest) { | 256 | void DYNA_OR_l_i_to_r(un32 imm,un8 dest) |
257 | { | ||
241 | DWRITEW(0x0080|(dest&0x7)); | 258 | DWRITEW(0x0080|(dest&0x7)); |
242 | DWRITEL(imm); | 259 | DWRITEL(imm); |
243 | } | 260 | } |
244 | 261 | ||
245 | void DYNA_CLR_l_m(un32 addr) { | 262 | void DYNA_CLR_l_m(un32 addr) |
263 | { | ||
246 | DWRITEW(0x42B9); | 264 | DWRITEW(0x42B9); |
247 | DWRITEL(addr); | 265 | DWRITEL(addr); |
248 | } | 266 | } |
249 | 267 | ||
250 | void DYNA_CLR_l_r(un8 reg) { | 268 | void DYNA_CLR_l_r(un8 reg) |
269 | { | ||
251 | DWRITEW(0x4280|(reg&0x7)); | 270 | DWRITEW(0x4280|(reg&0x7)); |
252 | } | 271 | } |
253 | 272 | ||
254 | void DYNA_CLR_w_r(un8 reg) { | 273 | void DYNA_CLR_w_r(un8 reg) |
274 | { | ||
255 | DWRITEW(0x42C0|(reg&0x7)); | 275 | DWRITEW(0x42C0|(reg&0x7)); |
256 | } | 276 | } |
257 | 277 | ||
258 | 278 | ||
259 | void DYNA_CLR_b_r(un8 reg) { | 279 | void DYNA_CLR_b_r(un8 reg) |
280 | { | ||
260 | DWRITEW(0x4200|(reg&0x7)); | 281 | DWRITEW(0x4200|(reg&0x7)); |
261 | } | 282 | } |
262 | 283 | ||
263 | 284 | ||
264 | void DYNA_ADDQ_l_i_to_r(un8 imm, un8 reg, int dest_is_a) { | 285 | void DYNA_ADDQ_l_i_to_r(un8 imm, un8 reg, int dest_is_a) |
286 | { | ||
265 | unsigned short value=0x5080|(imm&0x7)<<9|(reg&0x7); | 287 | unsigned short value=0x5080|(imm&0x7)<<9|(reg&0x7); |
266 | if(dest_is_a) | 288 | if(dest_is_a) |
267 | value|=0x8; | 289 | value|=0x8; |
268 | DWRITEW(value); | 290 | DWRITEW(value); |
269 | } | 291 | } |
270 | 292 | ||
271 | void DYNA_ADD_l_r_to_r(un8 src, un8 dest, int src_is_areg) { | 293 | void DYNA_ADD_l_r_to_r(un8 src, un8 dest, int src_is_areg) |
294 | { | ||
272 | unsigned short value=0xD080|((dest&0x7)<<9)|(src&0x7); | 295 | unsigned short value=0xD080|((dest&0x7)<<9)|(src&0x7); |
273 | if(src_is_areg) | 296 | if(src_is_areg) |
274 | value|=0x8; | 297 | value|=0x8; |
275 | DWRITEW(value); | 298 | DWRITEW(value); |
276 | } | 299 | } |
277 | 300 | ||
278 | void DYNA_JSR(void *addr) { | 301 | void DYNA_JSR(void *addr) |
302 | { | ||
279 | DWRITEW(0x4EB9); | 303 | DWRITEW(0x4EB9); |
280 | DWRITEL(addr); | 304 | DWRITEL(addr); |
281 | } | 305 | } |
282 | 306 | ||
283 | void DYNA_MOVEM(un8 areg,un16 mask, int frommem) { | 307 | void DYNA_MOVEM(un8 areg,un16 mask, int frommem) |
308 | { | ||
284 | unsigned short value=0x48D0|(areg&0x7); | 309 | unsigned short value=0x48D0|(areg&0x7); |
285 | if(frommem) | 310 | if(frommem) |
286 | value|=0x400; | 311 | value|=0x400; |
@@ -288,27 +313,32 @@ void DYNA_MOVEM(un8 areg,un16 mask, int frommem) { | |||
288 | DWRITEW(mask); | 313 | DWRITEW(mask); |
289 | } | 314 | } |
290 | 315 | ||
291 | void DYNA_SUBQ_l_i_to_r(un8 imm, un8 reg, int addr_reg) { | 316 | void DYNA_SUBQ_l_i_to_r(un8 imm, un8 reg, int addr_reg) |
317 | { | ||
292 | unsigned short value=0x5180|(reg&0x7)|((imm&0x7)<<9); | 318 | unsigned short value=0x5180|(reg&0x7)|((imm&0x7)<<9); |
293 | if(addr_reg) | 319 | if(addr_reg) |
294 | value|=0x8; | 320 | value|=0x8; |
295 | DWRITEW(value); | 321 | DWRITEW(value); |
296 | } | 322 | } |
297 | 323 | ||
298 | void DYNA_SUB_l_r_to_r(un8 src, un8 dest, int is_areg) { | 324 | void DYNA_SUB_l_r_to_r(un8 src, un8 dest, int is_areg) |
325 | { | ||
299 | unsigned short value=0x9080|((dest&0x7)<<9)|(src&0x7); | 326 | unsigned short value=0x9080|((dest&0x7)<<9)|(src&0x7); |
300 | if(is_areg) | 327 | if(is_areg) |
301 | value|=0x8; | 328 | value|=0x8; |
302 | DWRITEW(value); | 329 | DWRITEW(value); |
303 | } | 330 | } |
304 | 331 | ||
305 | void DYNA_EXT_l(un8 reg) { | 332 | void DYNA_EXT_l(un8 reg) |
333 | { | ||
306 | DWRITEW(0x48C0|(reg&0x7)); | 334 | DWRITEW(0x48C0|(reg&0x7)); |
307 | } | 335 | } |
308 | 336 | ||
309 | void DYNA_BCC_c(un8 cond, int size,int i) { | 337 | void DYNA_BCC_c(un8 cond, int size,int i) |
338 | { | ||
310 | un32 displace=dynapointer-branchp[i]; | 339 | un32 displace=dynapointer-branchp[i]; |
311 | if(!branchp[i]) { | 340 | if(!branchp[i]) |
341 | { | ||
312 | die("Dynarec error! BCC trying to write branch without dummy"); | 342 | die("Dynarec error! BCC trying to write branch without dummy"); |
313 | return; | 343 | return; |
314 | } | 344 | } |
@@ -316,7 +346,8 @@ void DYNA_BCC_c(un8 cond, int size,int i) { | |||
316 | die("Dynarec error! BCC invalid displacement"); | 346 | die("Dynarec error! BCC invalid displacement"); |
317 | else if(displace>0&&displace<0x7F) | 347 | else if(displace>0&&displace<0x7F) |
318 | *( (unsigned short *) branchp[i])=0x6000|((cond&0xF)<<8)|(displace&0xFF); | 348 | *( (unsigned short *) branchp[i])=0x6000|((cond&0xF)<<8)|(displace&0xFF); |
319 | else if(displace>0x7F&&displace<0x7FFF) { | 349 | else if(displace>0x7F&&displace<0x7FFF) |
350 | { | ||
320 | *( (unsigned short *) branchp[i])=0x6000|((cond&0xF)<<8); | 351 | *( (unsigned short *) branchp[i])=0x6000|((cond&0xF)<<8); |
321 | branchp[i]+=2; | 352 | branchp[i]+=2; |
322 | *( (unsigned short *) branchp[i])=displace; | 353 | *( (unsigned short *) branchp[i])=displace; |
@@ -327,19 +358,22 @@ void DYNA_BCC_c(un8 cond, int size,int i) { | |||
327 | branchp[i]=0; | 358 | branchp[i]=0; |
328 | } | 359 | } |
329 | 360 | ||
330 | void DYNA_DUMMYBRANCH(int size,int i) { | 361 | void DYNA_DUMMYBRANCH(int size,int i) |
362 | { | ||
331 | branchp[i]=dynapointer; | 363 | branchp[i]=dynapointer; |
332 | dynapointer+=size; | 364 | dynapointer+=size; |
333 | } | 365 | } |
334 | 366 | ||
335 | void DYNA_TST_l_r(un8 reg,int is_areg) { | 367 | void DYNA_TST_l_r(un8 reg,int is_areg) |
368 | { | ||
336 | unsigned short opcode=0x4A80|(reg&0x7); | 369 | unsigned short opcode=0x4A80|(reg&0x7); |
337 | if(is_areg) | 370 | if(is_areg) |
338 | opcode|=0x8; | 371 | opcode|=0x8; |
339 | DWRITEW(opcode); | 372 | DWRITEW(opcode); |
340 | } | 373 | } |
341 | 374 | ||
342 | void DYNA_TST_b_r(un8 reg,int is_areg) { | 375 | void DYNA_TST_b_r(un8 reg,int is_areg) |
376 | { | ||
343 | unsigned short opcode=0x4A00|(reg&0x7); | 377 | unsigned short opcode=0x4A00|(reg&0x7); |
344 | if(is_areg) | 378 | if(is_areg) |
345 | opcode|=0x8; | 379 | opcode|=0x8; |
@@ -347,33 +381,40 @@ void DYNA_TST_b_r(un8 reg,int is_areg) { | |||
347 | } | 381 | } |
348 | 382 | ||
349 | 383 | ||
350 | void DYNA_BTST_l_r(un8 bit, un8 reg) { | 384 | void DYNA_BTST_l_r(un8 bit, un8 reg) |
385 | { | ||
351 | DWRITEW(0x0800|(reg&0x7)); | 386 | DWRITEW(0x0800|(reg&0x7)); |
352 | DWRITEW(bit); | 387 | DWRITEW(bit); |
353 | } | 388 | } |
354 | 389 | ||
355 | void DYNA_NEG_l(un8 reg) { | 390 | void DYNA_NEG_l(un8 reg) |
391 | { | ||
356 | DWRITEW(0x4480|(reg&0x7)); | 392 | DWRITEW(0x4480|(reg&0x7)); |
357 | } | 393 | } |
358 | 394 | ||
359 | void DYNA_XOR_l_r_to_r(un8 src, un8 dest) { | 395 | void DYNA_XOR_l_r_to_r(un8 src, un8 dest) |
396 | { | ||
360 | DWRITEW(0xB180|((dest&0x7)<<9)|(src&0x7)); | 397 | DWRITEW(0xB180|((dest&0x7)<<9)|(src&0x7)); |
361 | } | 398 | } |
362 | 399 | ||
363 | void DYNA_SET_b_r(un8 src, un8 cond) { | 400 | void DYNA_SET_b_r(un8 src, un8 cond) |
401 | { | ||
364 | DWRITEW(0x50C0|((cond)&0xF)<<8|(src&0x7)); | 402 | DWRITEW(0x50C0|((cond)&0xF)<<8|(src&0x7)); |
365 | } | 403 | } |
366 | 404 | ||
367 | void DYNA_INC_l_r(un8 dest,int is_areg) { | 405 | void DYNA_INC_l_r(un8 dest,int is_areg) |
406 | { | ||
368 | DYNA_ADDQ_l_i_to_r(1,dest,is_areg); | 407 | DYNA_ADDQ_l_i_to_r(1,dest,is_areg); |
369 | } | 408 | } |
370 | 409 | ||
371 | void DYNA_DEC_l_r(un8 dest,int is_areg) { | 410 | void DYNA_DEC_l_r(un8 dest,int is_areg) |
411 | { | ||
372 | DYNA_SUBQ_l_i_to_r(1,dest,is_areg); | 412 | DYNA_SUBQ_l_i_to_r(1,dest,is_areg); |
373 | } | 413 | } |
374 | 414 | ||
375 | 415 | ||
376 | void dynamic_recompile (struct dynarec_block *newblock) { | 416 | void dynamic_recompile (struct dynarec_block *newblock) |
417 | { | ||
377 | int done=0,writepc=1,fd; | 418 | int done=0,writepc=1,fd; |
378 | byte op; | 419 | byte op; |
379 | unsigned int oldpc=PC; | 420 | unsigned int oldpc=PC; |
@@ -385,581 +426,1472 @@ void dynamic_recompile (struct dynarec_block *newblock) { | |||
385 | #ifdef DYNA_DEBUG | 426 | #ifdef DYNA_DEBUG |
386 | snprintf(meow,499,"/dyna_0x%x_asm.rb",PC); | 427 | snprintf(meow,499,"/dyna_0x%x_asm.rb",PC); |
387 | fd=open(meow,O_WRONLY|O_CREAT|O_TRUNC); | 428 | fd=open(meow,O_WRONLY|O_CREAT|O_TRUNC); |
388 | if(fd<0) { | 429 | if(fd<0) |
389 | die("couldn't open dyna debug file"); | 430 | { |
431 | die("couldn't open dyna debug file"); | ||
390 | return; | 432 | return; |
391 | } | 433 | } |
392 | #endif | 434 | #endif |
393 | snprintf(meow,499,"Recompiling 0x%x",oldpc); | 435 | snprintf(meow,499,"Recompiling 0x%x",oldpc); |
394 | rb->splash(HZ*1,1,meow); | 436 | rb->splash(HZ*1,1,meow); |
395 | while(!done) { | 437 | while(!done) |
438 | { | ||
439 | #ifdef DYNA_DEBUG | ||
440 | fdprintf(fd,"0x%x: ",PC); | ||
441 | #endif | ||
442 | op=FETCH; | ||
443 | clen = cycles_table[op]; | ||
444 | tclen+=clen; | ||
445 | switch(op) { | ||
446 | case 0x00: /* NOP */ | ||
447 | break; | ||
448 | case 0x01: /* LD BC,imm */ | ||
449 | /* warning (do we have endianness right?) */ | ||
450 | #ifdef DYNA_DEBUG | ||
451 | fdprintf(fd,"LD BC,#0x%x\n",readw(xPC)); | ||
452 | #endif | ||
453 | temp=readw(xPC); | ||
454 | DYNA_MOVEQ_l_i_to_r((temp&0xFF00)>>8,2); | ||
455 | DYNA_MOVEQ_l_i_to_r(temp&0xFF,3); | ||
456 | PC+=2; | ||
457 | break; | ||
458 | case 0x02: /* LD (BC),A */ | ||
396 | #ifdef DYNA_DEBUG | 459 | #ifdef DYNA_DEBUG |
397 | fdprintf(fd,"0x%x: ",PC); | 460 | fdprintf(fd, "LD (BC),A\n"); |
398 | #endif | 461 | #endif |
399 | op=FETCH; | 462 | break; /* FIXME: Implement */ |
400 | clen = cycles_table[op]; | 463 | case 0x03: /* INC BC */ |
401 | tclen+=clen; | 464 | #ifdef DYNA_DEBUG |
402 | switch(op) { | 465 | fdprintf(fd, "INC BC\n"); |
403 | case 0x00: /* NOP */ | 466 | #endif |
404 | case 0x40: /* LD B,B */ | 467 | break; /* FIXME: Implement */ |
405 | case 0x49: /* LD C,C */ | 468 | case 0x04: /* INC B */ |
406 | case 0x52: /* LD D,D */ | 469 | #ifdef DYNA_DEBUG |
407 | case 0x5B: /* LD E,E */ | 470 | fdprintf(fd, "INC B\n"); |
408 | case 0x64: /* LD H,H */ | 471 | #endif |
409 | case 0x6D: /* LD L,L */ | 472 | DYNA_INC_l_r(2,0); /* Is this right? */ |
410 | case 0x7F: /* LD A,A */ | 473 | break; |
411 | break; | 474 | case 0x05: /* DEC B */ |
412 | 475 | #ifdef DYNA_DEBUG | |
413 | case 0x0B: /* DEC BC* | 476 | fdprintf(fd, "DEC B\n"); |
477 | #endif | ||
478 | DYNA_DEC_l_r(2,0); /* Is this right? */ | ||
479 | break; | ||
480 | case 0x06: /* LD B,imm */ | ||
481 | #ifdef DYNA_DEBUG | ||
482 | fdprintf(fd,"LD B,#0x%x\n",readb(xPC)); | ||
483 | #endif | ||
484 | DYNA_MOVEQ_l_i_to_r(FETCH,2); | ||
485 | break; | ||
486 | case 0x07: /* RLCA */ | ||
487 | #ifdef DYNA_DEBUG | ||
488 | fdprintf(fd, "RLCA\n"); | ||
489 | #endif | ||
490 | break; /* FIXME: Implement */ | ||
491 | case 0x08: /* LD imm,SP */ | ||
492 | #ifdef DYNA_DEBUG | ||
493 | fdprintf(fd, "LD imm,SP\n"); | ||
494 | #endif | ||
495 | break; /* FIXME: Implement */ | ||
496 | case 0x09: /* ADD HL,BC */ | ||
497 | #ifdef DYNA_DEBUG | ||
498 | fdprintf(fd, "ADD HL,BC\n"); | ||
499 | #endif | ||
500 | break; /* FIXME: Implement */ | ||
501 | case 0x0A: /* LD A,(BC) */ | ||
502 | #ifdef DYNA_DEBUG | ||
503 | fdprintf(fd, "LD A,(BC)\n"); | ||
504 | #endif | ||
505 | break; /* FIXME: Implement */ | ||
506 | case 0x0B: /* DEC BC */ | ||
507 | #ifdef DYNA_DEBUG | ||
508 | fdprintf(fd,"DEC BC\n"); | ||
509 | #endif | ||
510 | DYNA_TST_b_r(3,0); /* test C */ | ||
511 | DYNA_DUMMYBRANCH(2,0); | ||
512 | DYNA_DEC_l_r(2,0); /* dec B */ | ||
513 | DYNA_BCC_c(0x6,2,0); /* jump here if not zero */ | ||
514 | DYNA_DEC_l_r(3,0); /* dec C */ | ||
515 | break; | ||
516 | case 0x0C: /* INC C */ | ||
517 | #ifdef DYNA_DEBUG | ||
518 | fdprintf(fd, "INC C\n"); | ||
519 | #endif | ||
520 | DYNA_INC_l_r(3,0); /* Is this right? */ | ||
521 | break; | ||
522 | case 0x0D: /* DEC C */ | ||
523 | #ifdef DYNA_DEBUG | ||
524 | fdprintf(fd, "DEC C\n"); | ||
525 | #endif | ||
526 | DYNA_DEC_l_r(3,0); /* Is this right? */ | ||
527 | break; | ||
528 | case 0x0E: /* LD C,imm */ | ||
529 | #ifdef DYNA_DEBUG | ||
530 | fdprintf(fd,"LD C,#0x%x\n",readb(xPC)); | ||
531 | #endif | ||
532 | DYNA_MOVEQ_l_i_to_r(FETCH,3); | ||
533 | break; | ||
534 | case 0x0F: /* RRCA */ | ||
535 | #ifdef DYNA_DEBUG | ||
536 | fdprintf(fd, "RRCA\n"); | ||
537 | #endif | ||
538 | break; /* FIXME: Implement */ | ||
539 | case 0x10: /* STOP */ | ||
540 | #ifdef DYNA_DEBUG | ||
541 | fdprintf(fd, "STOP\n"); | ||
542 | #endif | ||
543 | break; /* FIXME: Implement */ | ||
544 | case 0x11: /* LD DE,imm */ | ||
545 | #ifdef DYNA_DEBUG | ||
546 | fdprintf(fd,"LD DE,#0x%x\n",readw(xPC)); | ||
547 | #endif | ||
548 | temp=readw(xPC); | ||
549 | DYNA_MOVEQ_l_i_to_r((temp&0xFF00)>>8,4); | ||
550 | DYNA_MOVEQ_l_i_to_r(temp&0xFF,5); | ||
551 | PC += 2; | ||
552 | break; | ||
553 | case 0x12: /* LD (DE),A */ | ||
554 | #ifdef DYNA_DEBUG | ||
555 | fdprintf(fd, "LD (DE),A\n"); | ||
556 | #endif | ||
557 | break; /* FIXME: Implement */ | ||
558 | case 0x13: /* INC DE */ | ||
559 | #ifdef DYNA_DEBUG | ||
560 | fdprintf(fd, "INC DE\n"); | ||
561 | #endif | ||
562 | break; /* FIXME: Implement */ | ||
563 | case 0x14: /* INC D */ | ||
564 | #ifdef DYNA_DEBUG | ||
565 | fdprintf(fd, "INC D\n"); | ||
566 | #endif | ||
567 | DYNA_INC_l_r(4,0); /* Is this right? */ | ||
568 | break; | ||
569 | case 0x15: /* DEC D */ | ||
570 | #ifdef DYNA_DEBUG | ||
571 | fdprintf(fd, "DEC D\n"); | ||
572 | #endif | ||
573 | DYNA_DEC_l_r(4,0); /* Is this right? */ | ||
574 | break; | ||
575 | case 0x16: /* LD D,imm */ | ||
576 | #ifdef DYNA_DEBUG | ||
577 | fdprintf(fd,"LD D,#0x%x\n",readb(xPC)); | ||
578 | #endif | ||
579 | DYNA_MOVEQ_l_i_to_r(FETCH,4); | ||
580 | break; | ||
581 | case 0x17: /* RLA */ | ||
582 | #ifdef DYNA_DEBUG | ||
583 | fdprintf(fd, "RLA\n"); | ||
584 | #endif | ||
585 | break; /* FIXME: Implement */ | ||
586 | case 0x18: /* JR */ | ||
587 | #ifdef DYNA_DEBUG | ||
588 | fdprintf(fd, "JR\n"); | ||
589 | #endif | ||
590 | break; /* FIXME: Implement */ | ||
591 | case 0x19: /* ADD HL,DE */ | ||
592 | #ifdef DYNA_DEBUG | ||
593 | fdprintf(fd, "ADD HL,DE\n"); | ||
594 | #endif | ||
595 | break; /* FIXME: Implement */ | ||
596 | case 0x1A: /* LD A,(DE) */ | ||
597 | #ifdef DYNA_DEBUG | ||
598 | fdprintf(fd, "LD A,(DE)\n"); | ||
599 | #endif | ||
600 | break; /* FIXME: Implement */ | ||
601 | case 0x1B: /* DEC DE */ | ||
602 | #ifdef DYNA_DEBUG | ||
603 | fdprintf(fd,"DEC DE\n"); | ||
604 | #endif | ||
605 | DYNA_TST_b_r(5,0); /* test E */ | ||
606 | DYNA_DUMMYBRANCH(4,0); | ||
607 | DYNA_DEC_l_r(4,0); /* dec D */ | ||
608 | DYNA_BCC_c(0x6,4,0); /* jump here if not zero */ | ||
609 | DYNA_DEC_l_r(5,0); /* dec E */ | ||
610 | break; | ||
611 | case 0x1C: /* INC E */ | ||
612 | #ifdef DYNA_DEBUG | ||
613 | fdprintf(fd, "INC E\n"); | ||
614 | #endif | ||
615 | DYNA_INC_l_r(5,0); /* Is this right? */ | ||
616 | break; | ||
617 | case 0x1D: /* DEC E */ | ||
618 | #ifdef DYNA_DEBUG | ||
619 | fdprintf(fd, "DEC E\n"); | ||
620 | #endif | ||
621 | DYNA_DEC_l_r(5,0); /* Is this right? */ | ||
622 | break; | ||
623 | case 0x1E: /* LD E,imm */ | ||
624 | #ifdef DYNA_DEBUG | ||
625 | fdprintf(fd,"LD E,#0x%x\n",readb(xPC)); | ||
626 | #endif | ||
627 | DYNA_MOVEQ_l_i_to_r(FETCH,5); | ||
628 | break; | ||
629 | case 0x1F: /* RRA */ | ||
630 | #ifdef DYNA_DEBUG | ||
631 | fdprintf(fd, "RRA\n"); | ||
632 | #endif | ||
633 | break; /* FIXME: Implement */ | ||
634 | case 0x20: /* JR NZ */ | ||
635 | #ifdef DYNA_DEBUG | ||
636 | fdprintf(fd,"JR NZ\n"); | ||
637 | #endif | ||
638 | DYNA_BTST_l_r(8,7); /* btst #8,d7 */ | ||
639 | DYNA_DUMMYBRANCH(2,0); | ||
640 | DYNA_MOVEA_l_i_to_r(&blockclen,3); | ||
641 | DYNA_MOVE_l_i_to_m(tclen,3); | ||
642 | DYNA_MOVEA_l_i_to_r(PC+1+(signed char)readb(PC),1); | ||
643 | DYNA_RET(); | ||
644 | DYNA_BCC_c(0x6,2,0); /* jump here if bit is not zero */ | ||
645 | tclen--; | ||
646 | PC++; | ||
647 | break; | ||
648 | case 0x21: /* LD HL,imm */ | ||
649 | #ifdef DYNA_DEBUG | ||
650 | fdprintf(fd,"LD HL,#0x%x\n",readw(xPC)); | ||
651 | #endif | ||
652 | DYNA_MOVE_l_i_to_r(readw(xPC),6); | ||
653 | PC += 2; | ||
654 | break; | ||
655 | case 0x22: /* LDI (HL), A */ | ||
656 | #ifdef DYNA_DEBUG | ||
657 | fdprintf(fd,"LDI (HL),A\n"); | ||
658 | #endif | ||
659 | /* DYNA_PUSH_l_r(1,0); | ||
660 | DYNA_PUSH_l_r(6,0); | ||
661 | CALL_NATIVE(&writeb); | ||
662 | DYNA_ADDQ_l_i_to_r(0,7,1); | ||
663 | DYNA_INC_l_r(6,0);*/ | ||
664 | break; | ||
665 | case 0x23: /* INC HL */ | ||
666 | #ifdef DYNA_DEBUG | ||
667 | fdprintf(fd, "INC HL\n"); | ||
668 | #endif | ||
669 | break; /* FIXME: Implement */ | ||
670 | case 0x24: /* INC H */ | ||
671 | #ifdef DYNA_DEBUG | ||
672 | fdprintf(fd, "INC H\n"); | ||
673 | #endif | ||
674 | break; /* FIXME: Implement */ | ||
675 | case 0x25: /* DEC H */ | ||
676 | #ifdef DYNA_DEBUG | ||
677 | fdprintf(fd, "DEC H\n"); | ||
678 | #endif | ||
679 | break; /* FIXME: Implement */ | ||
680 | case 0x26: /* LD H,imm */ | ||
681 | #ifdef DYNA_DEBUG | ||
682 | fdprintf(fd,"LD H,#0x%x\n",readb(xPC)); | ||
683 | #endif | ||
684 | DYNA_AND_l_i_to_r(0xFF,6); | ||
685 | DYNA_OR_l_i_to_r(FETCH<<8,6); | ||
686 | break; | ||
687 | case 0x27: /* DAA */ | ||
688 | #ifdef DYNA_DEBUG | ||
689 | fdprintf(fd, "DAA\n"); | ||
690 | #endif | ||
691 | break; /* FIXME: Implement */ | ||
692 | case 0x28: /* JR Z */ | ||
693 | #ifdef DYNA_DEBUG | ||
694 | fdprintf(fd, "JR Z\n"); | ||
695 | #endif | ||
696 | break; /* FIXME: Implement */ | ||
697 | case 0x29: /* ADD HL, HL */ | ||
414 | #ifdef DYNA_DEBUG | 698 | #ifdef DYNA_DEBUG |
415 | fdprintf(fd,"DEC BC\n"); | 699 | fdprintf(fd, "ADD HL,HL\n"); |
416 | #endif | 700 | #endif |
417 | DYNA_TST_b_r(3); // test C | 701 | break; /* FIXME: Implement */ |
418 | DYNA_DUMMYBRANCH(2,0); | 702 | case 0x2A: /* LD A,(HLI) */ |
419 | DYNA_DEC_l_r(2,0); // dec B | ||
420 | DYNA_BCC_c(0x6,2,0); //jump here if not zero | ||
421 | DYNA_DEC_l_r(3,0); // dec C | ||
422 | break; | ||
423 | case 0x41: /* LD B,C */ | ||
424 | #ifdef DYNA_DEBUG | 703 | #ifdef DYNA_DEBUG |
425 | fdprintf(fd,"LD B,C\n"); | 704 | fdprintf(fd, "LD A,(HLI)\n"); |
426 | #endif | 705 | #endif |
427 | DYNA_MOVE_b_r_to_r(3,2); | 706 | break; /* FIXME: Implement */ |
428 | break; | 707 | case 0x2B: /* DEC HL */ |
429 | case 0x42: /* LD B,D */ | ||
430 | #ifdef DYNA_DEBUG | 708 | #ifdef DYNA_DEBUG |
431 | fdprintf(fd,"LD B,D\n"); | 709 | fdprintf(fd, "DEC HL\n"); |
432 | #endif | 710 | #endif |
433 | DYNA_MOVE_b_r_to_r(4,2); | 711 | break; /* FIXME: Implement */ |
434 | break; | 712 | case 0x2C: /* INC L */ |
435 | case 0x43: /* LD B,E */ | 713 | #ifdef DYNA_DEBUG |
714 | fdprintf(fd, "INC L\n"); | ||
715 | #endif | ||
716 | break; /* FIXME: Implement */ | ||
717 | case 0x2D: /* DEC L */ | ||
718 | #ifdef DYNA_DEBUG | ||
719 | fdprintf(fd, "DEC L\n"); | ||
720 | #endif | ||
721 | break; /* FIXME: Implement */ | ||
722 | case 0x2E: /* LD L,imm */ | ||
436 | #ifdef DYNA_DEBUG | 723 | #ifdef DYNA_DEBUG |
437 | fdprintf(fd,"LD B,E\n"); | 724 | fdprintf(fd,"LD L,#0x%x\n",readb(xPC)); |
725 | #endif | ||
726 | DYNA_AND_l_i_to_r(0xFF00,6); | ||
727 | DYNA_OR_l_i_to_r(FETCH,6); | ||
728 | break; | ||
729 | case 0x2F: /* CPL */ | ||
730 | #ifdef DYNA_DEBUG | ||
731 | fdprintf(fd, "CPL\n"); | ||
732 | #endif | ||
733 | break; /* FIXME: Implement */ | ||
734 | case 0x30: /* JR NC */ | ||
735 | #ifdef DYNA_DEBUG | ||
736 | fdprintf(fd, "JR NC\n"); | ||
737 | #endif | ||
738 | break; /* FIXME: Implement */ | ||
739 | case 0x31: /* LD SP,imm */ | ||
740 | #ifdef DYNA_DEBUG | ||
741 | fdprintf(fd,"LD SP,#0x%x\n",readw(xPC)); | ||
742 | #endif | ||
743 | DYNA_MOVEA_l_i_to_r(readw(xPC),0); | ||
744 | PC += 2; | ||
745 | break; | ||
746 | case 0x32: /* LD (HLD),A */ | ||
747 | #ifdef DYNA_DEBUG | ||
748 | fdprintf(fd, "LD (HLD),A\n"); | ||
749 | #endif | ||
750 | break; /* FIXME: Implement */ | ||
751 | case 0x33: /* INC SP */ | ||
752 | #ifdef DYNA_DEBUG | ||
753 | fdprintf(fd, "INC SP\n"); | ||
438 | #endif | 754 | #endif |
439 | DYNA_MOVE_b_r_to_r(5,2); | 755 | break; /* FIXME: Implement */ |
440 | break; | 756 | case 0x34: /* INC (HL) */ |
441 | case 0x44: /* LD B,H */ | 757 | #ifdef DYNA_DEBUG |
758 | fdprintf(fd, "INC (HL)\n"); | ||
759 | #endif | ||
760 | break; /* FIXME: Implement */ | ||
761 | case 0x35: /* DEC (HL) */ | ||
762 | #ifdef DYNA_DEBUG | ||
763 | fdprintf(fd, "DEC (HL)\n"); | ||
764 | #endif | ||
765 | break; /* FIXME: Implement */ | ||
766 | case 0x36: /* LD (HD),imm */ | ||
767 | #ifdef DYNA_DEBUG | ||
768 | fdprintf(fd, "LD (HD),imm\n"); | ||
769 | #endif | ||
770 | break; /* FIXME: Implement */ | ||
771 | case 0x37: /* SCF */ | ||
772 | #ifdef DYNA_DEBUG | ||
773 | fdprintf(fd, "SCF\n"); | ||
774 | #endif | ||
775 | break; /* FIXME: Implement */ | ||
776 | case 0x38: /* JR C */ | ||
777 | #ifdef DYNA_DEBUG | ||
778 | fdprintf(fd, "JR C\n"); | ||
779 | #endif | ||
780 | break; /* FIXME: Implement */ | ||
781 | case 0x39: /* ADD HL,SP */ | ||
782 | #ifdef DYNA_DEBUG | ||
783 | fdprintf(fd, "ADD HL,SP\n"); | ||
784 | #endif | ||
785 | break; /* FIXME: Implement */ | ||
786 | case 0x3A: /* LD A,(HLD) */ | ||
787 | #ifdef DYNA_DEBUG | ||
788 | fdprintf(fd, "LD A,(HLD)\n"); | ||
789 | #endif | ||
790 | break; /* FIXME: Implement */ | ||
791 | case 0x3B: /* DEC SP */ | ||
792 | #ifdef DYNA_DEBUG | ||
793 | fdprintf(fd, "DEC SP\n"); | ||
794 | #endif | ||
795 | break; /* FIXME: Implement */ | ||
796 | case 0x3C: /* INC A */ | ||
797 | #ifdef DYNA_DEBUG | ||
798 | fdprintf(fd, "INC A"); | ||
799 | #endif | ||
800 | DYNA_INC_l_r(1,0); /* Is this right? */ | ||
801 | break; | ||
802 | case 0x3D: /* DEC A */ | ||
803 | #ifdef DYNA_DEBUG | ||
804 | fdprintf(fd, "DEC A"); | ||
805 | #endif | ||
806 | DYNA_DEC_l_r(1,0); /* Is this right? */ | ||
807 | break; | ||
808 | case 0x3E: /* LD A,imm */ | ||
442 | #ifdef DYNA_DEBUG | 809 | #ifdef DYNA_DEBUG |
443 | fdprintf(fd,"LD B,H\n"); | 810 | fdprintf(fd,"LD A,#0x%x\n",readb(xPC)); |
811 | #endif | ||
812 | DYNA_MOVEQ_l_i_to_r(FETCH,1); | ||
813 | break; | ||
814 | case 0x3F: /* CCF */ | ||
815 | #ifdef DYNA_DEBUG | ||
816 | fdprintf(fd, "CCF\n"); | ||
817 | #endif | ||
818 | break; /* FIXME: Implement */ | ||
819 | case 0x40: /* LD B,B */ | ||
820 | #ifdef DYNA_DEBUG | ||
821 | fdprintf(fd, "LD B,B\n"); | ||
822 | #endif | ||
823 | break; | ||
824 | case 0x41: /* LD B,C */ | ||
825 | #ifdef DYNA_DEBUG | ||
826 | fdprintf(fd,"LD B,C\n"); | ||
444 | #endif | 827 | #endif |
445 | GETUPPER(6,0); | 828 | DYNA_MOVE_b_r_to_r(3,2); |
446 | DYNA_MOVE_b_r_to_r(0,2); | 829 | break; |
447 | break; | 830 | case 0x42: /* LD B,D */ |
448 | case 0x45: /* LD B,L */ | 831 | #ifdef DYNA_DEBUG |
832 | fdprintf(fd,"LD B,D\n"); | ||
833 | #endif | ||
834 | DYNA_MOVE_b_r_to_r(4,2); | ||
835 | break; | ||
836 | case 0x43: /* LD B,E */ | ||
449 | #ifdef DYNA_DEBUG | 837 | #ifdef DYNA_DEBUG |
450 | fdprintf(fd,"LD B,L\n"); | 838 | fdprintf(fd,"LD B,E\n"); |
451 | #endif | 839 | #endif |
452 | DYNA_MOVE_b_r_to_r(6,2); | 840 | DYNA_MOVE_b_r_to_r(5,2); |
453 | break; | 841 | break; |
454 | case 0x47: /* LD B,A */ | 842 | case 0x44: /* LD B,H */ |
455 | #ifdef DYNA_DEBUG | 843 | #ifdef DYNA_DEBUG |
456 | fdprintf(fd,"LD B,A\n"); | 844 | fdprintf(fd,"LD B,H\n"); |
457 | #endif | 845 | #endif |
458 | DYNA_MOVE_b_r_to_r(1,2); | 846 | GETUPPER(6,0); |
459 | break; | 847 | DYNA_MOVE_b_r_to_r(0,2); |
460 | case 0x48: /* LD C,B */ | 848 | break; |
849 | case 0x45: /* LD B,L */ | ||
461 | #ifdef DYNA_DEBUG | 850 | #ifdef DYNA_DEBUG |
462 | fdprintf(fd,"LD C,B\n"); | 851 | fdprintf(fd,"LD B,L\n"); |
852 | #endif | ||
853 | DYNA_MOVE_b_r_to_r(6,2); | ||
854 | break; | ||
855 | case 0x46: /* LD B,(HL) */ | ||
856 | #ifdef DYNA_DEBUG | ||
857 | fdprintf(fd, "LD B,(HL)\n"); | ||
463 | #endif | 858 | #endif |
464 | DYNA_MOVE_b_r_to_r(2,3); | 859 | break; /* FIXME: Implement */ |
465 | break; | 860 | case 0x47: /* LD B,A */ |
466 | case 0x4A: /* LD C,D */ | ||
467 | #ifdef DYNA_DEBUG | 861 | #ifdef DYNA_DEBUG |
468 | fdprintf(fd,"LD C,D\n"); | 862 | fdprintf(fd,"LD B,A\n"); |
469 | #endif | 863 | #endif |
470 | DYNA_MOVE_b_r_to_r(4,3); | 864 | DYNA_MOVE_b_r_to_r(1,2); |
471 | break; | 865 | break; |
472 | case 0x4B: /* LD C,E */ | 866 | case 0x48: /* LD C,B */ |
473 | #ifdef DYNA_DEBUG | 867 | #ifdef DYNA_DEBUG |
474 | fdprintf(fd,"LD C,E\n"); | 868 | fdprintf(fd,"LD C,B\n"); |
475 | #endif | 869 | #endif |
476 | DYNA_MOVE_b_r_to_r(5,3); | 870 | DYNA_MOVE_b_r_to_r(2,3); |
477 | break; | 871 | break; |
478 | case 0x4C: /* LD C,H */ | 872 | case 0x49: /* LD C,C */ |
873 | break; | ||
874 | case 0x4A: /* LD C,D */ | ||
479 | #ifdef DYNA_DEBUG | 875 | #ifdef DYNA_DEBUG |
480 | fdprintf(fd,"LD C,H\n"); | 876 | fdprintf(fd,"LD C,D\n"); |
481 | #endif | 877 | #endif |
482 | GETUPPER(6,0); | 878 | DYNA_MOVE_b_r_to_r(4,3); |
483 | DYNA_MOVE_b_r_to_r(0,3); | 879 | break; |
484 | break; | 880 | case 0x4B: /* LD C,E */ |
485 | case 0x4D: /* LD C,L */ | ||
486 | #ifdef DYNA_DEBUG | 881 | #ifdef DYNA_DEBUG |
487 | fdprintf(fd,"LD C,L\n"); | 882 | fdprintf(fd,"LD C,E\n"); |
488 | #endif | 883 | #endif |
489 | DYNA_MOVE_b_r_to_r(6,3); | 884 | DYNA_MOVE_b_r_to_r(5,3); |
490 | break; | 885 | break; |
491 | case 0x4F: /* LD C,A */ | 886 | case 0x4C: /* LD C,H */ |
492 | #ifdef DYNA_DEBUG | 887 | #ifdef DYNA_DEBUG |
493 | fdprintf(fd,"LD C,A\n"); | 888 | fdprintf(fd,"LD C,H\n"); |
494 | #endif | 889 | #endif |
495 | DYNA_MOVE_b_r_to_r(1,3); | 890 | GETUPPER(6,0); |
496 | break; | 891 | DYNA_MOVE_b_r_to_r(0,3); |
497 | 892 | break; | |
498 | case 0x50: /* LD D,B */ | 893 | case 0x4D: /* LD C,L */ |
499 | #ifdef DYNA_DEBUG | 894 | #ifdef DYNA_DEBUG |
500 | fdprintf(fd,"LD D,B\n"); | 895 | fdprintf(fd,"LD C,L\n"); |
896 | #endif | ||
897 | DYNA_MOVE_b_r_to_r(6,3); | ||
898 | break; | ||
899 | case 0x4E: /* LD C,(HL) */ | ||
900 | #ifdef DYNA_DEBUG | ||
901 | fdprintf(fd, "LD C,(HL)\n"); | ||
501 | #endif | 902 | #endif |
502 | DYNA_MOVE_b_r_to_r(2,4); | 903 | break; /* FIXME: Implement */ |
503 | break; | 904 | case 0x4F: /* LD C,A */ |
504 | case 0x51: /* LD D,C */ | ||
505 | #ifdef DYNA_DEBUG | 905 | #ifdef DYNA_DEBUG |
506 | fdprintf(fd,"LD D,C\n"); | 906 | fdprintf(fd,"LD C,A\n"); |
507 | #endif | 907 | #endif |
508 | DYNA_MOVE_b_r_to_r(3,4); | 908 | DYNA_MOVE_b_r_to_r(1,3); |
509 | break; | 909 | break; |
510 | case 0x53: /* LD D,E */ | 910 | case 0x50: /* LD D,B */ |
511 | #ifdef DYNA_DEBUG | 911 | #ifdef DYNA_DEBUG |
512 | fdprintf(fd,"LD D,E\n"); | 912 | fdprintf(fd,"LD D,B\n"); |
513 | #endif | 913 | #endif |
514 | DYNA_MOVE_b_r_to_r(5,4); | 914 | DYNA_MOVE_b_r_to_r(2,4); |
515 | break; | 915 | break; |
516 | case 0x54: /* LD D,H */ | 916 | case 0x51: /* LD D,C */ |
517 | #ifdef DYNA_DEBUG | 917 | #ifdef DYNA_DEBUG |
518 | fdprintf(fd,"LD D,H\n"); | 918 | fdprintf(fd,"LD D,C\n"); |
519 | #endif | 919 | #endif |
520 | GETUPPER(6,0); | 920 | DYNA_MOVE_b_r_to_r(3,4); |
521 | DYNA_MOVE_b_r_to_r(0,4); | 921 | break; |
522 | break; | 922 | case 0x52: /* LD D,D */ |
523 | case 0x55: /* LD D,L */ | 923 | break; |
924 | case 0x53: /* LD D,E */ | ||
524 | #ifdef DYNA_DEBUG | 925 | #ifdef DYNA_DEBUG |
525 | fdprintf(fd,"LD D,L\n"); | 926 | fdprintf(fd,"LD D,E\n"); |
526 | #endif | 927 | #endif |
527 | DYNA_MOVE_b_r_to_r(6,4); | 928 | DYNA_MOVE_b_r_to_r(5,4); |
528 | break; | 929 | break; |
529 | case 0x57: /* LD D,A */ | 930 | case 0x54: /* LD D,H */ |
530 | #ifdef DYNA_DEBUG | 931 | #ifdef DYNA_DEBUG |
531 | fdprintf(fd,"LD D,A\n"); | 932 | fdprintf(fd,"LD D,H\n"); |
532 | #endif | 933 | #endif |
533 | DYNA_MOVE_b_r_to_r(1,4); | 934 | GETUPPER(6,0); |
534 | break; | 935 | DYNA_MOVE_b_r_to_r(0,4); |
535 | 936 | break; | |
536 | case 0x58: /* LD E,B */ | 937 | case 0x55: /* LD D,L */ |
537 | #ifdef DYNA_DEBUG | 938 | #ifdef DYNA_DEBUG |
538 | fdprintf(fd,"LD E,B\n"); | 939 | fdprintf(fd,"LD D,L\n"); |
539 | #endif | 940 | #endif |
540 | DYNA_MOVE_b_r_to_r(2,5); | 941 | DYNA_MOVE_b_r_to_r(6,4); |
541 | break; | 942 | break; |
542 | case 0x59: /* LD E,C */ | 943 | case 0x56: /* LD D,(HL) */ |
944 | #ifdef DYNA_DEBUG | ||
945 | fdprintf(fd, "LD D,(HL)\n"); | ||
946 | #endif | ||
947 | break; /* FIXME: Implement */ | ||
948 | case 0x57: /* LD D,A */ | ||
543 | #ifdef DYNA_DEBUG | 949 | #ifdef DYNA_DEBUG |
544 | fdprintf(fd,"LD E,C\n"); | 950 | fdprintf(fd,"LD D,A\n"); |
545 | #endif | 951 | #endif |
546 | DYNA_MOVE_b_r_to_r(3,5); | 952 | DYNA_MOVE_b_r_to_r(1,4); |
547 | break; | 953 | break; |
548 | case 0x5A: /* LD E,D */ | 954 | case 0x58: /* LD E,B */ |
549 | #ifdef DYNA_DEBUG | 955 | #ifdef DYNA_DEBUG |
550 | fdprintf(fd,"LD E,D\n"); | 956 | fdprintf(fd,"LD E,B\n"); |
551 | #endif | 957 | #endif |
552 | DYNA_MOVE_b_r_to_r(4,5); | 958 | DYNA_MOVE_b_r_to_r(2,5); |
553 | break; | 959 | break; |
554 | case 0x5C: /* LD E,H */ | 960 | case 0x59: /* LD E,C */ |
555 | #ifdef DYNA_DEBUG | 961 | #ifdef DYNA_DEBUG |
556 | fdprintf(fd,"LD E,H\n"); | 962 | fdprintf(fd,"LD E,C\n"); |
557 | #endif | 963 | #endif |
558 | GETUPPER(6,0); | 964 | DYNA_MOVE_b_r_to_r(3,5); |
559 | DYNA_MOVE_b_r_to_r(0,5); | 965 | break; |
560 | break; | 966 | case 0x5A: /* LD E,D */ |
561 | case 0x5D: /* LD E,L */ | ||
562 | #ifdef DYNA_DEBUG | 967 | #ifdef DYNA_DEBUG |
563 | fdprintf(fd,"LD E,L\n"); | 968 | fdprintf(fd,"LD E,D\n"); |
564 | #endif | 969 | #endif |
565 | DYNA_MOVE_b_r_to_r(6,5); | 970 | DYNA_MOVE_b_r_to_r(4,5); |
566 | break; | 971 | break; |
567 | case 0x5F: /* LD E,A */ | 972 | case 0x5B: /* LD E,E */ |
973 | break; | ||
974 | case 0x5C: /* LD E,H */ | ||
568 | #ifdef DYNA_DEBUG | 975 | #ifdef DYNA_DEBUG |
569 | fdprintf(fd,"LD E,A\n"); | 976 | fdprintf(fd,"LD E,H\n"); |
570 | #endif | 977 | #endif |
571 | DYNA_MOVE_b_r_to_r(1,5); | 978 | GETUPPER(6,0); |
572 | break; | 979 | DYNA_MOVE_b_r_to_r(0,5); |
573 | 980 | break; | |
574 | case 0x60: /* LD H,B */ | 981 | case 0x5D: /* LD E,L */ |
575 | #ifdef DYNA_DEBUG | 982 | #ifdef DYNA_DEBUG |
576 | fdprintf(fd,"LD H,B\n"); | 983 | fdprintf(fd,"LD E,L\n"); |
577 | #endif | 984 | #endif |
578 | DYNA_MOVE_b_r_to_r(2,0); | 985 | DYNA_MOVE_b_r_to_r(6,5); |
579 | PUTUPPER(0,6); | 986 | break; |
580 | break; | 987 | case 0x5E: /* LD E,(HL) */ |
581 | case 0x61: /* LD H,C */ | 988 | #ifdef DYNA_DEBUG |
989 | fdprintf(fd, "LD E,(HL)\n"); | ||
990 | #endif | ||
991 | break; /* FIXME: Implement */ | ||
992 | case 0x5F: /* LD E,A */ | ||
582 | #ifdef DYNA_DEBUG | 993 | #ifdef DYNA_DEBUG |
583 | fdprintf(fd,"LD H,C\n"); | 994 | fdprintf(fd,"LD E,A\n"); |
584 | #endif | 995 | #endif |
585 | DYNA_MOVE_b_r_to_r(3,0); | 996 | DYNA_MOVE_b_r_to_r(1,5); |
586 | PUTUPPER(0,6); | 997 | break; |
587 | break; | 998 | case 0x60: /* LD H,B */ |
588 | case 0x62: /* LD H,D */ | ||
589 | #ifdef DYNA_DEBUG | 999 | #ifdef DYNA_DEBUG |
590 | fdprintf(fd,"LD H,D\n"); | 1000 | fdprintf(fd,"LD H,B\n"); |
591 | #endif | 1001 | #endif |
592 | DYNA_MOVE_b_r_to_r(4,0); | 1002 | DYNA_MOVE_b_r_to_r(2,0); |
593 | PUTUPPER(0,6); | 1003 | PUTUPPER(0,6); |
594 | break; | 1004 | break; |
595 | case 0x63: /* LD H,E */ | 1005 | case 0x61: /* LD H,C */ |
596 | #ifdef DYNA_DEBUG | 1006 | #ifdef DYNA_DEBUG |
597 | fdprintf(fd,"LD H,E\n"); | 1007 | fdprintf(fd,"LD H,C\n"); |
598 | #endif | 1008 | #endif |
599 | DYNA_MOVE_b_r_to_r(5,0); | 1009 | DYNA_MOVE_b_r_to_r(3,0); |
600 | PUTUPPER(0,6); | 1010 | PUTUPPER(0,6); |
601 | break; | 1011 | break; |
602 | case 0x65: /* LD H,L */ | 1012 | case 0x62: /* LD H,D */ |
603 | #ifdef DYNA_DEBUG | 1013 | #ifdef DYNA_DEBUG |
604 | fdprintf(fd,"LD H,L\n"); | 1014 | fdprintf(fd,"LD H,D\n"); |
605 | #endif | 1015 | #endif |
606 | DYNA_MOVE_b_r_to_r(6,0); | 1016 | DYNA_MOVE_b_r_to_r(4,0); |
607 | PUTUPPER(0,6); | 1017 | PUTUPPER(0,6); |
608 | break; | 1018 | break; |
609 | case 0x67: /* LD H,A */ | 1019 | case 0x63: /* LD H,E */ |
610 | #ifdef DYNA_DEBUG | 1020 | #ifdef DYNA_DEBUG |
611 | fdprintf(fd,"LD H,A\n"); | 1021 | fdprintf(fd,"LD H,E\n"); |
612 | #endif | 1022 | #endif |
613 | DYNA_MOVE_b_r_to_r(1,0); | 1023 | DYNA_MOVE_b_r_to_r(5,0); |
614 | PUTUPPER(0,6); | 1024 | PUTUPPER(0,6); |
615 | break; | 1025 | break; |
616 | case 0x68: /* LD L,B */ | 1026 | case 0x64: /* LD H,H */ |
1027 | break; | ||
1028 | case 0x65: /* LD H,L */ | ||
617 | #ifdef DYNA_DEBUG | 1029 | #ifdef DYNA_DEBUG |
618 | fdprintf(fd,"LD L,B\n"); | 1030 | fdprintf(fd,"LD H,L\n"); |
1031 | #endif | ||
1032 | DYNA_MOVE_b_r_to_r(6,0); | ||
1033 | PUTUPPER(0,6); | ||
1034 | break; | ||
1035 | case 0x66: /* LD H,(HL) */ | ||
1036 | #ifdef DYNA_DEBUG | ||
1037 | fdprintf(fd, "LD H,(HL)\n"); | ||
619 | #endif | 1038 | #endif |
620 | DYNA_MOVE_b_r_to_r(2,6); | 1039 | break; /* FIXME: Implement */ |
621 | break; | 1040 | case 0x67: /* LD H,A */ |
622 | case 0x69: /* LD L,C */ | ||
623 | #ifdef DYNA_DEBUG | 1041 | #ifdef DYNA_DEBUG |
624 | fdprintf(fd,"LD L,C\n"); | 1042 | fdprintf(fd,"LD H,A\n"); |
1043 | #endif | ||
1044 | DYNA_MOVE_b_r_to_r(1,0); | ||
1045 | PUTUPPER(0,6); | ||
1046 | break; | ||
1047 | case 0x68: /* LD L,B */ | ||
1048 | #ifdef DYNA_DEBUG | ||
1049 | fdprintf(fd,"LD L,B\n"); | ||
625 | #endif | 1050 | #endif |
626 | DYNA_MOVE_b_r_to_r(3,6); | 1051 | DYNA_MOVE_b_r_to_r(2,6); |
627 | break; | 1052 | break; |
628 | case 0x6A: /* LD L,D */ | 1053 | case 0x69: /* LD L,C */ |
629 | #ifdef DYNA_DEBUG | 1054 | #ifdef DYNA_DEBUG |
630 | fdprintf(fd,"LD L,D\n"); | 1055 | fdprintf(fd,"LD L,C\n"); |
631 | #endif | 1056 | #endif |
632 | DYNA_MOVE_b_r_to_r(4,6); | 1057 | DYNA_MOVE_b_r_to_r(3,6); |
633 | break; | 1058 | break; |
634 | case 0x6B: /* LD L,E */ | 1059 | case 0x6A: /* LD L,D */ |
635 | #ifdef DYNA_DEBUG | 1060 | #ifdef DYNA_DEBUG |
636 | fdprintf(fd,"LD L,E\n"); | 1061 | fdprintf(fd,"LD L,D\n"); |
637 | #endif | 1062 | #endif |
638 | DYNA_MOVE_b_r_to_r(5,6); | 1063 | DYNA_MOVE_b_r_to_r(4,6); |
639 | break; | 1064 | break; |
640 | case 0x6C: /* LD L,H */ | 1065 | case 0x6B: /* LD L,E */ |
641 | #ifdef DYNA_DEBUG | 1066 | #ifdef DYNA_DEBUG |
642 | fdprintf(fd,"LD L,H\n"); | 1067 | fdprintf(fd,"LD L,E\n"); |
643 | #endif | 1068 | #endif |
644 | GETUPPER(6,0); | 1069 | DYNA_MOVE_b_r_to_r(5,6); |
645 | DYNA_MOVE_b_r_to_r(0,6); | 1070 | break; |
646 | break; | 1071 | case 0x6C: /* LD L,H */ |
647 | |||
648 | case 0x78: /* LD A,B */ | ||
649 | #ifdef DYNA_DEBUG | 1072 | #ifdef DYNA_DEBUG |
650 | fdprintf(fd,"LD A,B\n"); | 1073 | fdprintf(fd,"LD L,H\n"); |
1074 | #endif | ||
1075 | GETUPPER(6,0); | ||
1076 | DYNA_MOVE_b_r_to_r(0,6); | ||
1077 | break; | ||
1078 | case 0x6D: /* LD L,L */ | ||
1079 | break; | ||
1080 | case 0x6E: /* LD L,(HL) */ | ||
1081 | #ifdef DYNA_DEBUG | ||
1082 | fdprintf(fd, "LD L,(HL)\n"); | ||
1083 | #endif | ||
1084 | break; /* FIXME: Implement */ | ||
1085 | case 0x6F: /* LD L,A */ | ||
1086 | #ifdef DYNA_DEBUG | ||
1087 | fdprintf(fd, "LD L,A\n"); | ||
1088 | #endif | ||
1089 | break; /* FIXME: Implement */ | ||
1090 | case 0x70: /* LD (HL),B */ | ||
1091 | #ifdef DYNA_DEBUG | ||
1092 | fdprintf(fd, "LD (HL),B\n"); | ||
1093 | #endif | ||
1094 | break; /* FIXME: Implement */ | ||
1095 | case 0x71: /* LD (HL),C */ | ||
1096 | #ifdef DYNA_DEBUG | ||
1097 | fdprintf(fd, "LD (HL),C\n"); | ||
651 | #endif | 1098 | #endif |
652 | DYNA_MOVE_b_r_to_r(2,1); | 1099 | break; /* FIXME: Implement */ |
653 | break; | 1100 | case 0x72: /* LD (HL),D */ |
654 | case 0x79: /* LD A,C */ | 1101 | #ifdef DYNA_DEBUG |
1102 | fdprintf(fd, "LD (HL),D\n"); | ||
1103 | #endif | ||
1104 | break; /* FIXME: Implement */ | ||
1105 | case 0x73: /* LD (HL),E */ | ||
1106 | #ifdef DYNA_DEBUG | ||
1107 | fdprintf(fd, "LD (HL),E\n"); | ||
1108 | #endif | ||
1109 | break; /* FIXME: Implement */ | ||
1110 | case 0x74: /* LD (HL),H */ | ||
1111 | #ifdef DYNA_DEBUG | ||
1112 | fdprintf(fd, "LD (HL),H\n"); | ||
1113 | #endif | ||
1114 | break; /* FIXME: Implement */ | ||
1115 | case 0x75: /* LD (HL),L */ | ||
1116 | #ifdef DYNA_DEBUG | ||
1117 | fdprintf(fd, "LD (HL),L\n"); | ||
1118 | #endif | ||
1119 | break; /* FIXME: Implement */ | ||
1120 | case 0x76: /* HALT */ | ||
1121 | #ifdef DYNA_DEBUG | ||
1122 | fdprintf(fd, "HALT\n"); | ||
1123 | #endif | ||
1124 | break; /* FIXME: Implement */ | ||
1125 | case 0x77: /* LD (HL),A */ | ||
1126 | #ifdef DYNA_DEBUG | ||
1127 | fdprintf(fd, "LD (HL),A\n"); | ||
1128 | #endif | ||
1129 | break; /* FIXME: Implement */ | ||
1130 | case 0x78: /* LD A,B */ | ||
655 | #ifdef DYNA_DEBUG | 1131 | #ifdef DYNA_DEBUG |
656 | fdprintf(fd,"LD A,C\n"); | 1132 | fdprintf(fd,"LD A,B\n"); |
657 | #endif | 1133 | #endif |
658 | DYNA_MOVE_b_r_to_r(3,1); | 1134 | DYNA_MOVE_b_r_to_r(2,1); |
659 | break; | 1135 | break; |
660 | case 0x7A: /* LD A,D */ | 1136 | case 0x79: /* LD A,C */ |
661 | #ifdef DYNA_DEBUG | 1137 | #ifdef DYNA_DEBUG |
662 | fdprintf(fd,"LD A,D\n"); | 1138 | fdprintf(fd,"LD A,C\n"); |
663 | #endif | 1139 | #endif |
664 | DYNA_MOVE_b_r_to_r(4,1); | 1140 | DYNA_MOVE_b_r_to_r(3,1); |
665 | break; | 1141 | break; |
666 | case 0x7B: /* LD A,E */ | 1142 | case 0x7A: /* LD A,D */ |
667 | #ifdef DYNA_DEBUG | 1143 | #ifdef DYNA_DEBUG |
668 | fdprintf(fd,"LD A,E\n"); | 1144 | fdprintf(fd,"LD A,D\n"); |
669 | #endif | 1145 | #endif |
670 | DYNA_MOVE_b_r_to_r(5,1); | 1146 | DYNA_MOVE_b_r_to_r(4,1); |
671 | break; | 1147 | break; |
672 | case 0x7C: /* LD A,H */ | 1148 | case 0x7B: /* LD A,E */ |
673 | #ifdef DYNA_DEBUG | 1149 | #ifdef DYNA_DEBUG |
674 | fdprintf(fd,"LD A,H\n"); | 1150 | fdprintf(fd,"LD A,E\n"); |
675 | #endif | 1151 | #endif |
676 | GETUPPER(5,0); | 1152 | DYNA_MOVE_b_r_to_r(5,1); |
677 | DYNA_MOVE_b_r_to_r(0,1); | 1153 | break; |
678 | break; | 1154 | case 0x7C: /* LD A,H */ |
679 | case 0x7D: /* LD A,L */ | ||
680 | #ifdef DYNA_DEBUG | 1155 | #ifdef DYNA_DEBUG |
681 | fdprintf(fd,"LD A,L\n"); | 1156 | fdprintf(fd,"LD A,H\n"); |
682 | #endif | 1157 | #endif |
683 | DYNA_MOVE_b_r_to_r(5,1); | 1158 | GETUPPER(5,0); |
684 | break; | 1159 | DYNA_MOVE_b_r_to_r(0,1); |
685 | case 0x01: /* LD BC,imm */ | 1160 | break; |
686 | { /* warning (do we have endianness right?) */ | 1161 | case 0x7D: /* LD A,L */ |
687 | #ifdef DYNA_DEBUG | 1162 | #ifdef DYNA_DEBUG |
688 | fdprintf(fd,"LD BC,#0x%x\n",readw(xPC)); | 1163 | fdprintf(fd,"LD A,L\n"); |
689 | #endif | 1164 | #endif |
690 | temp=readw(xPC); | 1165 | DYNA_MOVE_b_r_to_r(5,1); |
691 | DYNA_MOVEQ_l_i_to_r((temp&0xFF00)>>8,2); | 1166 | break; |
692 | DYNA_MOVEQ_l_i_to_r(temp&0xFF,3); | 1167 | case 0x7E: /* LD A,HL */ |
693 | PC+=2; | ||
694 | } | ||
695 | break; | ||
696 | case 0x11: /* LD DE,imm */ | ||
697 | { | ||
698 | #ifdef DYNA_DEBUG | 1168 | #ifdef DYNA_DEBUG |
699 | fdprintf(fd,"LD DE,#0x%x\n",readw(xPC)); | 1169 | fdprintf(fd, "LD A,HL\n"); |
700 | #endif | 1170 | #endif |
701 | temp=readw(xPC); | 1171 | break; /* FIXME: Implement */ |
702 | DYNA_MOVEQ_l_i_to_r((temp&0xFF00)>>8,4); | 1172 | case 0x7F: /* LD A,A */ |
703 | DYNA_MOVEQ_l_i_to_r(temp&0xFF,5); | 1173 | break; |
704 | PC += 2; | 1174 | case 0x80: /* ADD A,B */ |
705 | } | ||
706 | break; | ||
707 | case 0x21: /* LD HL,imm */ | ||
708 | { | ||
709 | #ifdef DYNA_DEBUG | 1175 | #ifdef DYNA_DEBUG |
710 | fdprintf(fd,"LD HL,#0x%x\n",readw(xPC)); | 1176 | fdprintf(fd, "ADD A,B\n"); |
711 | #endif | 1177 | #endif |
712 | DYNA_MOVE_l_i_to_r(readw(xPC),6); | 1178 | break; /* FIXME: Implement */ |
713 | PC += 2; | 1179 | case 0x81: /* ADD A,C */ |
714 | } | ||
715 | break; | ||
716 | case 0x22: /* LDI (HL), A */ | ||
717 | #ifdef DYNA_DEBUG | 1180 | #ifdef DYNA_DEBUG |
718 | fdprintf(fd,"LDI (HL),A\n"); | 1181 | fdprintf(fd, "ADD A,C\n"); |
719 | #endif | 1182 | #endif |
720 | /* DYNA_PUSH_l_r(1,0); | 1183 | break; /* FIXME: Implement */ |
721 | DYNA_PUSH_l_r(6,0); | 1184 | case 0x82: /* ADD A,D */ |
722 | CALL_NATIVE(&writeb); | ||
723 | DYNA_ADDQ_l_i_to_r(0,7,1); | ||
724 | DYNA_INC_l_r(6,0);*/ | ||
725 | break; | ||
726 | case 0x31: /* LD SP,imm */ | ||
727 | #ifdef DYNA_DEBUG | 1185 | #ifdef DYNA_DEBUG |
728 | fdprintf(fd,"LD SP,#0x%x\n",readw(xPC)); | 1186 | fdprintf(fd, "ADD A,D\n"); |
729 | #endif | 1187 | #endif |
730 | DYNA_MOVEA_l_i_to_r(readw(xPC),0); | 1188 | break; /* FIXME: Implement */ |
731 | PC += 2; | 1189 | case 0x83: /* ADD A,E */ |
732 | break; | 1190 | #ifdef DYNA_DEBUG |
733 | 1191 | fdprintf(fd, "ADD A,E\n"); | |
734 | case 0x06: /* LD B,imm */ | 1192 | #endif |
1193 | break; /* FIXME: Implement */ | ||
1194 | case 0x84: /* ADD A,H */ | ||
1195 | #ifdef DYNA_DEBUG | ||
1196 | fdprintf(fd, "ADD A,H\n"); | ||
1197 | #endif | ||
1198 | break; /* FIXME: Implement */ | ||
1199 | case 0x85: /* ADD A,L */ | ||
1200 | #ifdef DYNA_DEBUG | ||
1201 | fdprintf(fd, "ADD A,L\n"); | ||
1202 | #endif | ||
1203 | break; /* FIXME: Implement */ | ||
1204 | case 0x86: /* ADD A,(HL) */ | ||
1205 | #ifdef DYNA_DEBUG | ||
1206 | fdprintf(fd, "ADD A,(HL)\n"); | ||
1207 | #endif | ||
1208 | break; /* FIXME: Implement */ | ||
1209 | case 0x87: /* ADD A,A */ | ||
1210 | #ifdef DYNA_DEBUG | ||
1211 | fdprintf(fd,"ADD A,A\n"); | ||
1212 | #endif | ||
1213 | /* code taken from gcc -O3 output by compiling; | ||
1214 | * c=(2*b)&0xFF; | ||
1215 | * a=(c) ? 0 : 0x80 | zero flag | ||
1216 | * (0x20 & (c) << 1) | halfcarry | ||
1217 | * ((2*b)&0x100)>>4; carry | ||
1218 | */ | ||
1219 | DYNA_MOVE_l_r_to_r(1,0,0); /* move.l d1, d0 */ | ||
1220 | DYNA_ADD_l_r_to_r(0,0,0); /* add.l d0, d0 */ | ||
1221 | DYNA_AND_l_i_to_r(510,0); /* and.l #510, d0 */ | ||
1222 | DYNA_MOVEA_l_r_to_r(0,3,0); /* movea.l d0,a3 */ | ||
1223 | DYNA_CLR_b_r(7); /* clr.b d7 */ | ||
1224 | DYNA_TST_b_r(0,0); /* tst.b d0 */ | ||
1225 | DYNA_DUMMYBRANCH(2,0); | ||
1226 | DYNA_MOVE_l_r_to_r(1,0,0); /* move.l d1,d0 */ | ||
1227 | DYNA_LSHIFT_l(3,0,0,0); /* lsr.l #3, d0 */ | ||
1228 | DYNA_MOVEQ_l_i_to_r(16,1); /* moveq #16,d1 */ | ||
1229 | DYNA_AND_l_r_to_r(1,0); /* and.l d1 d0 */ | ||
1230 | DYNA_MOVEQ_l_i_to_r(0x80,7); /* moveq #0x80,d7 */ | ||
1231 | DYNA_OR_l_r_to_r(0,7); /* or.l d0, d7 */ | ||
1232 | DYNA_BCC_c(0x6,2,0); /* branch not equal, here */ | ||
1233 | DYNA_MOVE_l_r_to_r(3,1,1); /* move.l a3,d1 */ | ||
1234 | DYNA_AND_l_i_to_r(0xFE,1); /* and.l #0xFE,d1 */ | ||
1235 | DYNA_AND_l_i_to_r(0xB0,7); /* and.l #0xB0,d7 */ | ||
1236 | break; | ||
1237 | case 0x88: /* ADC A,B */ | ||
1238 | #ifdef DYNA_DEBUG | ||
1239 | fdprintf(fd, "ADC A,B\n"); | ||
1240 | #endif | ||
1241 | break; /* FIXME: Implement */ | ||
1242 | case 0x89: /* ADC A,C */ | ||
1243 | #ifdef DYNA_DEBUG | ||
1244 | fdprintf(fd, "ADC A,C\n"); | ||
1245 | #endif | ||
1246 | break; /* FIXME: Implement */ | ||
1247 | case 0x8A: /* ADC A,D */ | ||
1248 | #ifdef DYNA_DEBUG | ||
1249 | fdprintf(fd, "ADC A,D\n"); | ||
1250 | #endif | ||
1251 | break; /* FIXME: Implement */ | ||
1252 | case 0x8B: /* ADC A,E */ | ||
1253 | #ifdef DYNA_DEBUG | ||
1254 | fdprintf(fd, "ADC A,E\n"); | ||
1255 | #endif | ||
1256 | break; /* FIXME: Implement */ | ||
1257 | case 0x8C: /* ADC A,H */ | ||
1258 | #ifdef DYNA_DEBUG | ||
1259 | fdprintf(fd, "ADC A,H\n"); | ||
1260 | #endif | ||
1261 | break; /* FIXME: Implement */ | ||
1262 | case 0x8D: /* ADC A,L */ | ||
1263 | #ifdef DYNA_DEBUG | ||
1264 | fdprintf(fd, "ADC A,L\n"); | ||
1265 | #endif | ||
1266 | break; /* FIXME: Implement */ | ||
1267 | case 0x8E: /* ADC A,(HL) */ | ||
1268 | #ifdef DYNA_DEBUG | ||
1269 | fdprintf(fd, "ADC A,(HL)\n"); | ||
1270 | #endif | ||
1271 | break; /* FIXME: Implement */ | ||
1272 | case 0x8F: /* ADC A */ | ||
1273 | #ifdef DYNA_DEBUG | ||
1274 | fdprintf(fd, "ADC A\n"); | ||
1275 | #endif | ||
1276 | break; /* FIXME: Implement */ | ||
1277 | case 0x90: /* SUB B */ | ||
1278 | #ifdef DYNA_DEBUG | ||
1279 | fdprintf(fd, "SUB B\n"); | ||
1280 | #endif | ||
1281 | break; /* FIXME: Implement */ | ||
1282 | case 0x91: /* SUB C */ | ||
1283 | #ifdef DYNA_DEBUG | ||
1284 | fdprintf(fd, "SUB C\n"); | ||
1285 | #endif | ||
1286 | break; /* FIXME: Implement */ | ||
1287 | case 0x92: /* SUB D */ | ||
1288 | #ifdef DYNA_DEBUG | ||
1289 | fdprintf(fd, "SUB D\n"); | ||
1290 | #endif | ||
1291 | break; /* FIXME: Implement */ | ||
1292 | case 0x93: /* SUB E */ | ||
1293 | #ifdef DYNA_DEBUG | ||
1294 | fdprintf(fd, "SUB E\n"); | ||
1295 | #endif | ||
1296 | break; /* FIXME: Implement */ | ||
1297 | case 0x94: /* SUB H */ | ||
1298 | #ifdef DYNA_DEBUG | ||
1299 | fdprintf(fd, "SUB H\n"); | ||
1300 | #endif | ||
1301 | break; /* FIXME: Implement */ | ||
1302 | case 0x95: /* SUB L */ | ||
1303 | #ifdef DYNA_DEBUG | ||
1304 | fdprintf(fd, "SUB L\n"); | ||
1305 | #endif | ||
1306 | break; /* FIXME: Implement */ | ||
1307 | case 0x96: /* SUB (HL) */ | ||
1308 | #ifdef DYNA_DEBUG | ||
1309 | fdprintf(fd, "SUB (HL)\n"); | ||
1310 | #endif | ||
1311 | break; /* FIXME: Implement */ | ||
1312 | case 0x97: /* SUB A (halfcarry ?) */ | ||
1313 | #ifdef DYNA_DEBUG | ||
1314 | fdprintf(fd,"SUB A\n"); | ||
1315 | #endif | ||
1316 | DYNA_CLR_l_r(1); | ||
1317 | DYNA_MOVEQ_l_i_to_r(0xC0,7); | ||
1318 | break; | ||
1319 | case 0x98: /* SBC A,B */ | ||
1320 | #ifdef DYNA_DEBUG | ||
1321 | fdprintf(fd, "SBC A,B\n"); | ||
1322 | #endif | ||
1323 | break; /* FIXME: Implement */ | ||
1324 | case 0x99: /* SBC A,C */ | ||
1325 | #ifdef DYNA_DEBUG | ||
1326 | fdprintf(fd, "SBC A,C\n"); | ||
1327 | #endif | ||
1328 | break; /* FIXME: Implement */ | ||
1329 | case 0x9A: /* SBC A,D */ | ||
1330 | #ifdef DYNA_DEBUG | ||
1331 | fdprintf(fd, "SBC A,D\n"); | ||
1332 | #endif | ||
1333 | break; /* FIXME: Implement */ | ||
1334 | case 0x9B: /* SBC A,E */ | ||
1335 | #ifdef DYNA_DEBUG | ||
1336 | fdprintf(fd, "SBC A,E\n"); | ||
1337 | #endif | ||
1338 | break; /* FIXME: Implement */ | ||
1339 | case 0x9C: /* SBC A,H */ | ||
1340 | #ifdef DYNA_DEBUG | ||
1341 | fdprintf(fd, "SBC A,H\n"); | ||
1342 | #endif | ||
1343 | break; /* FIXME: Implement */ | ||
1344 | case 0x9D: /* SBC A,L */ | ||
1345 | #ifdef DYNA_DEBUG | ||
1346 | fdprintf(fd, "SBC A,L\n"); | ||
1347 | #endif | ||
1348 | break; /* FIXME: Implement */ | ||
1349 | case 0x9E: /* SBC A,(HL) */ | ||
1350 | #ifdef DYNA_DEBUG | ||
1351 | fdprintf(fd, "SBC A,(HL)\n"); | ||
1352 | #endif | ||
1353 | break; /* FIXME: Implement */ | ||
1354 | case 0x9F: /* SBC A,A */ | ||
1355 | #ifdef DYNA_DEBUG | ||
1356 | fdprintf(fd, "SBC A,A\n"); | ||
1357 | #endif | ||
1358 | break; /* FIXME: Implement */ | ||
1359 | case 0xA0: /* AND B */ | ||
1360 | #ifdef DYNA_DEBUG | ||
1361 | fdprintf(fd, "AND B\n"); | ||
1362 | #endif | ||
1363 | break; /* FIXME: Implement */ | ||
1364 | case 0xA1: /* AND C */ | ||
1365 | #ifdef DYNA_DEBUG | ||
1366 | fdprintf(fd, "AND C\n"); | ||
1367 | #endif | ||
1368 | break; /* FIXME: Implement */ | ||
1369 | case 0xA2: /* AND D */ | ||
1370 | #ifdef DYNA_DEBUG | ||
1371 | fdprintf(fd, "AND D\n"); | ||
1372 | #endif | ||
1373 | break; /* FIXME: Implement */ | ||
1374 | case 0xA3: /* AND E */ | ||
1375 | #ifdef DYNA_DEBUG | ||
1376 | fdprintf(fd, "AND E\n"); | ||
1377 | #endif | ||
1378 | break; /* FIXME: Implement */ | ||
1379 | case 0xA4: /* AND H */ | ||
1380 | #ifdef DYNA_DEBUG | ||
1381 | fdprintf(fd, "AND H\n"); | ||
1382 | #endif | ||
1383 | break; /* FIXME: Implement */ | ||
1384 | case 0xA5: /* AND L */ | ||
1385 | #ifdef DYNA_DEBUG | ||
1386 | fdprintf(fd, "AND L\n"); | ||
1387 | #endif | ||
1388 | break; /* FIXME: Implement */ | ||
1389 | case 0xA6: /* AND (HL) */ | ||
1390 | #ifdef DYNA_DEBUG | ||
1391 | fdprintf(fd, "AND (HL)\n"); | ||
1392 | #endif | ||
1393 | break; /* FIXME: Implement */ | ||
1394 | case 0xA7: /* AND A */ | ||
1395 | #ifdef DYNA_DEBUG | ||
1396 | fdprintf(fd, "AND A\n"); | ||
1397 | #endif | ||
1398 | break; /* FIXME: Implement */ | ||
1399 | case 0xA8: /* XOR B */ | ||
1400 | #ifdef DYNA_DEBUG | ||
1401 | fdprintf(fd, "XOR B\n"); | ||
1402 | #endif | ||
1403 | break; /* FIXME: Implement */ | ||
1404 | case 0xA9: /* XOR C */ | ||
1405 | #ifdef DYNA_DEBUG | ||
1406 | fdprintf(fd, "XOR C\n"); | ||
1407 | #endif | ||
1408 | break; /* FIXME: Implement */ | ||
1409 | case 0xAA: /* XOR D */ | ||
1410 | #ifdef DYNA_DEBUG | ||
1411 | fdprintf(fd, "XOR D\n"); | ||
1412 | #endif | ||
1413 | break; /* FIXME: Implement */ | ||
1414 | case 0xAB: /* XOR E */ | ||
1415 | #ifdef DYNA_DEBUG | ||
1416 | fdprintf(fd, "XOR E\n"); | ||
1417 | #endif | ||
1418 | break; /* FIXME: Implement */ | ||
1419 | case 0xAC: /* XOR H */ | ||
1420 | #ifdef DYNA_DEBUG | ||
1421 | fdprintf(fd, "XOR H\n"); | ||
1422 | #endif | ||
1423 | break; /* FIXME: Implement */ | ||
1424 | case 0xAD: /* XOR L */ | ||
1425 | #ifdef DYNA_DEBUG | ||
1426 | fdprintf(fd, "XOR L\n"); | ||
1427 | #endif | ||
1428 | break; /* FIXME: Implement */ | ||
1429 | case 0xAE: /* XOR (HL) */ | ||
1430 | #ifdef DYNA_DEBUG | ||
1431 | fdprintf(fd, "XOR (HL)\n"); | ||
1432 | #endif | ||
1433 | break; /* FIXME: Implement */ | ||
1434 | case 0xAF: /* XOR A */ | ||
1435 | #ifdef DYNA_DEBUG | ||
1436 | fdprintf(fd, "XOR A\n"); | ||
1437 | #endif | ||
1438 | break; /* FIXME: Implement */ | ||
1439 | case 0xB0: /* OR B */ | ||
1440 | #ifdef DYNA_DEBUG | ||
1441 | fdprintf(fd, "OR B\n"); | ||
1442 | #endif | ||
1443 | break; /* FIXME: Implement */ | ||
1444 | case 0xB1: /* OR C */ | ||
1445 | #ifdef DYNA_DEBUG | ||
1446 | fdprintf(fd, "OR C\n"); | ||
1447 | #endif | ||
1448 | break; /* FIXME: Implement */ | ||
1449 | case 0xB2: /* OR D */ | ||
1450 | #ifdef DYNA_DEBUG | ||
1451 | fdprintf(fd, "OR D\n"); | ||
1452 | #endif | ||
1453 | break; /* FIXME: Implement */ | ||
1454 | case 0xB3: /* OR E */ | ||
1455 | #ifdef DYNA_DEBUG | ||
1456 | fdprintf(fd, "OR E\n"); | ||
1457 | #endif | ||
1458 | break; /* FIXME: Implement */ | ||
1459 | case 0xB4: /* OR H */ | ||
1460 | #ifdef DYNA_DEBUG | ||
1461 | fdprintf(fd, "OR H\n"); | ||
1462 | #endif | ||
1463 | break; /* FIXME: Implement */ | ||
1464 | case 0xB5: /* OR L */ | ||
1465 | #ifdef DYNA_DEBUG | ||
1466 | fdprintf(fd, "OR L\n"); | ||
1467 | #endif | ||
1468 | break; /* FIXME: Implement */ | ||
1469 | case 0xB6: /* OR (HL) */ | ||
1470 | #ifdef DYNA_DEBUG | ||
1471 | fdprintf(fd, "OR (HL)\n"); | ||
1472 | #endif | ||
1473 | break; /* FIXME: Implement */ | ||
1474 | case 0xB7: /* OR A */ | ||
1475 | #ifdef DYNA_DEBUG | ||
1476 | fdprintf(fd, "OR A\n"); | ||
1477 | #endif | ||
1478 | break; /* FIXME: Implement */ | ||
1479 | case 0xB8: /* CP B */ | ||
1480 | #ifdef DYNA_DEBUG | ||
1481 | fdprintf(fd, "CP B\n"); | ||
1482 | #endif | ||
1483 | break; /* FIXME: Implement */ | ||
1484 | case 0xB9: /* CP C */ | ||
1485 | #ifdef DYNA_DEBUG | ||
1486 | fdprintf(fd, "CP C\n"); | ||
1487 | #endif | ||
1488 | break; /* FIXME: Implement */ | ||
1489 | case 0xBA: /* CP D */ | ||
1490 | #ifdef DYNA_DEBUG | ||
1491 | fdprintf(fd, "CP D\n"); | ||
1492 | #endif | ||
1493 | break; /* FIXME: Implement */ | ||
1494 | case 0xBB: /* CP E */ | ||
1495 | #ifdef DYNA_DEBUG | ||
1496 | fdprintf(fd, "CP E\n"); | ||
1497 | #endif | ||
1498 | break; /* FIXME: Implement */ | ||
1499 | case 0xBC: /* CP H */ | ||
1500 | #ifdef DYNA_DEBUG | ||
1501 | fdprintf(fd, "CP H\n"); | ||
1502 | #endif | ||
1503 | break; /* FIXME: Implement */ | ||
1504 | case 0xBD: /* CP L */ | ||
1505 | #ifdef DYNA_DEBUG | ||
1506 | fdprintf(fd, "CP L\n"); | ||
1507 | #endif | ||
1508 | break; /* FIXME: Implement */ | ||
1509 | case 0xBE: /* CP (HL) */ | ||
1510 | #ifdef DYNA_DEBUG | ||
1511 | fdprintf(fd, "CP (HL)\n"); | ||
1512 | #endif | ||
1513 | break; /* FIXME: Implement */ | ||
1514 | case 0xBF: /* CP A */ | ||
1515 | #ifdef DYNA_DEBUG | ||
1516 | fdprintf(fd, "CP A\n"); | ||
1517 | #endif | ||
1518 | break; /* FIXME: Implement */ | ||
1519 | case 0xC0: /* RET NZ */ | ||
1520 | #ifdef DYNA_DEBUG | ||
1521 | fdprintf(fd, "RET NZ\n"); | ||
1522 | #endif | ||
1523 | break; /* FIXME: Implement */ | ||
1524 | case 0xC1: /* POP BC */ | ||
1525 | #ifdef DYNA_DEBUG | ||
1526 | fdprintf(fd, "POP BC\n"); | ||
1527 | #endif | ||
1528 | break; | ||
1529 | case 0xC2: /* JP NZ */ | ||
1530 | #ifdef DYNA_DEBUG | ||
1531 | fdprintf(fd,"JP NZ\n"); | ||
1532 | #endif | ||
1533 | DYNA_BTST_l_r(8,7); /* btst #8,d7 */ | ||
1534 | DYNA_DUMMYBRANCH(2,0); | ||
1535 | DYNA_MOVEA_l_i_to_r(&blockclen,3); | ||
1536 | DYNA_MOVE_l_i_to_m(tclen,3); | ||
1537 | DYNA_MOVEA_l_i_to_r(readw(PC),1); | ||
1538 | DYNA_RET(); | ||
1539 | DYNA_BCC_c(0x6,2,0); /* jump here if bit is not zero */ | ||
1540 | tclen--; | ||
1541 | PC+=2; | ||
1542 | break; | ||
1543 | case 0xC3: /* JP (imm) PC = readw(PC) */ | ||
735 | #ifdef DYNA_DEBUG | 1544 | #ifdef DYNA_DEBUG |
736 | fdprintf(fd,"LD B,#0x%x\n",readb(xPC)); | 1545 | fdprintf(fd,"JP (0x%x)\n",readw(xPC)); |
1546 | #endif | ||
1547 | PC=readw(PC); | ||
1548 | done=1; | ||
1549 | break; | ||
1550 | case 0xC4: /* CALL NZ */ | ||
1551 | #ifdef DYNA_DEBUG | ||
1552 | fdprintf(fd, "CALL NZ\n"); | ||
1553 | #endif | ||
1554 | break; /* FIXME: Implement */ | ||
1555 | case 0xC5: /* PUSH BC */ | ||
1556 | #ifdef DYNA_DEBUG | ||
1557 | fdprintf(fd, "PUSH BC\n"); | ||
1558 | #endif | ||
1559 | break; /* FIXME: Implement */ | ||
1560 | case 0xC6: /* ADD A,imm */ | ||
1561 | #ifdef DYNA_DEBUG | ||
1562 | fdprintf(fd, "ADD A,imm\n"); | ||
1563 | #endif | ||
1564 | break; /* FIXME: Implement */ | ||
1565 | case 0xC7: /* RST 0h */ | ||
1566 | #ifdef DYNA_DEBUG | ||
1567 | fdprintf(fd, "RST 0h\n"); | ||
1568 | #endif | ||
1569 | break; /* FIXME: Implement */ | ||
1570 | case 0xC8: /* RET Z */ | ||
1571 | #ifdef DYNA_DEBUG | ||
1572 | fdprintf(fd, "RET Z\n"); | ||
1573 | #endif | ||
1574 | break; /* FIXME: Implement */ | ||
1575 | case 0xC9: /* RET */ | ||
1576 | #ifdef DYNA_DEBUG | ||
1577 | fdprintf(fd,"RET\n"); | ||
1578 | #endif | ||
1579 | POPA(1); | ||
1580 | writepc=0; | ||
1581 | done=1; | ||
1582 | break; | ||
1583 | case 0xCA: /* JP Z */ | ||
1584 | break; /* FIXME: Implement */ | ||
1585 | case 0xCB: /* NULL */ | ||
1586 | #ifdef DYNA_DEBUG | ||
1587 | fdprintf(fd,"NULL\n"); | ||
1588 | #endif | ||
1589 | break; | ||
1590 | case 0xCC: /* CALL Z */ | ||
1591 | #ifdef DYNA_DEBUG | ||
1592 | fdprintf(fd, "CALL Z\n"); | ||
1593 | #endif | ||
1594 | break; /* FIXME: Implement */ | ||
1595 | case 0xCD: /* CALL (imm) PUSH(PC+2) PC=readw(PC); */ | ||
1596 | #ifdef DYNA_DEBUG | ||
1597 | fdprintf(fd,"CALL (0x%x)\n",readw(xPC)); | ||
1598 | #endif | ||
1599 | PUSH(PC+2); | ||
1600 | PC=readw(PC); | ||
1601 | done=1; | ||
1602 | break; | ||
1603 | case 0xCE: /* ADC A,imm */ | ||
1604 | #ifdef DYNA_DEBUG | ||
1605 | fdprintf(fd, "ADC A,imm\n"); | ||
1606 | #endif | ||
1607 | break; /* FIXME: Implement */ | ||
1608 | case 0xCF: /* RST 8h */ | ||
1609 | #ifdef DYNA_DEBUG | ||
1610 | fdprintf(fd, "RST 8h\n"); | ||
737 | #endif | 1611 | #endif |
738 | DYNA_MOVEQ_l_i_to_r(FETCH,2); | 1612 | break; /* FIXME: Implement */ |
739 | break; | 1613 | case 0xD0: /* RET NC */ |
740 | case 0x0E: /* LD C,imm */ | ||
741 | #ifdef DYNA_DEBUG | 1614 | #ifdef DYNA_DEBUG |
742 | fdprintf(fd,"LD C,#0x%x\n",readb(xPC)); | 1615 | fdprintf(fd,"RET NC\n"); |
1616 | #endif | ||
1617 | DYNA_BTST_l_r(5,7); /* btst #5,d7 */ | ||
1618 | DYNA_DUMMYBRANCH(2,0); | ||
1619 | POPA(1); /* POP %a1 */ | ||
1620 | DYNA_MOVEA_l_i_to_r(&blockclen,3); | ||
1621 | DYNA_MOVE_l_i_to_m(tclen,3); | ||
1622 | DYNA_RET(); | ||
1623 | DYNA_BCC_c(0x6,2,0); /* jump here if bit is not zero */ | ||
1624 | tclen-=3; | ||
1625 | break; | ||
1626 | case 0xD1: /* POP DE */ | ||
1627 | #ifdef DYNA_DEBUG | ||
1628 | fdprintf(fd, "POP DE\n"); | ||
1629 | #endif | ||
1630 | break; /* FIXME: Implement */ | ||
1631 | case 0xD2: /* JP NC */ | ||
1632 | #ifdef DYNA_DEBUG | ||
1633 | fdprintf(fd, "JP NC\n"); | ||
743 | #endif | 1634 | #endif |
744 | DYNA_MOVEQ_l_i_to_r(FETCH,3); | 1635 | break; /* FIXME: Implement */ |
745 | break; | 1636 | case 0xD3: /* NULL */ |
746 | case 0x16: /* LD D,imm */ | ||
747 | #ifdef DYNA_DEBUG | 1637 | #ifdef DYNA_DEBUG |
748 | fdprintf(fd,"LD D,#0x%x\n",readb(xPC)); | 1638 | fdprintf(fd,"NULL\n"); |
1639 | #endif | ||
1640 | break; | ||
1641 | case 0xD4: /* CALL NC */ | ||
1642 | #ifdef DYNA_DEBUG | ||
1643 | fdprintf(fd, "CALL NC\n"); | ||
1644 | #endif | ||
1645 | break; /* FIXME: Implement */ | ||
1646 | case 0xD5: /* PUSH DE */ | ||
1647 | #ifdef DYNA_DEBUG | ||
1648 | fdprintf(fd, "PUSH DE\n"); | ||
1649 | #endif | ||
1650 | break; /* FIXME: Implement */ | ||
1651 | case 0xD6: /* SUB imm */ | ||
1652 | #ifdef DYNA_DEBUG | ||
1653 | fdprintf(fd, "SUB imm\n"); | ||
1654 | #endif | ||
1655 | break; /* FIXME: Implement */ | ||
1656 | case 0xD7: /* RST 10h */ | ||
1657 | #ifdef DYNA_DEBUG | ||
1658 | fdprintf(fd, "RST 10h\n"); | ||
749 | #endif | 1659 | #endif |
750 | DYNA_MOVEQ_l_i_to_r(FETCH,4); | 1660 | break; /* FIXME: Implement */ |
751 | break; | 1661 | case 0xD8: /* RET C */ |
752 | case 0x1E: /* LD E,imm */ | 1662 | #ifdef DYNA_DEBUG |
1663 | fdprintf(fd, "RET C\n"); | ||
1664 | #endif | ||
1665 | break; /* FIXME: Implement */ | ||
1666 | case 0xD9: /* RETI */ | ||
1667 | #ifdef DYNA_DEBUG | ||
1668 | fdprintf(fd, "RETI\n"); | ||
1669 | #endif | ||
1670 | break; /* FIXME: Implement */ | ||
1671 | case 0xDA: /* JP C */ | ||
1672 | #ifdef DYNA_DEBUG | ||
1673 | fdprintf(fd, "JP C\n"); | ||
1674 | #endif | ||
1675 | break; /* FIXME: Implement */ | ||
1676 | case 0xDB: /* NULL */ | ||
753 | #ifdef DYNA_DEBUG | 1677 | #ifdef DYNA_DEBUG |
754 | fdprintf(fd,"LD E,#0x%x\n",readb(xPC)); | 1678 | fdprintf(fd,"NULL\n"); |
755 | #endif | 1679 | #endif |
756 | DYNA_MOVEQ_l_i_to_r(FETCH,5); | 1680 | break; |
757 | break; | 1681 | case 0xDC: /* CALL NC */ |
758 | case 0x26: /* LD H,imm */ | 1682 | #ifdef DYNA_DEBUG |
1683 | fdprintf(fd, "CALL NC\n"); | ||
1684 | #endif | ||
1685 | break; /* FIXME: Implement */ | ||
1686 | case 0xDD: /* NULL */ | ||
759 | #ifdef DYNA_DEBUG | 1687 | #ifdef DYNA_DEBUG |
760 | fdprintf(fd,"LD H,#0x%x\n",readb(xPC)); | 1688 | fdprintf(fd,"NULL\n"); |
1689 | #endif | ||
1690 | break; | ||
1691 | case 0xDE: /* SBC A,imm */ | ||
1692 | #ifdef DYNA_DEBUG | ||
1693 | fdprintf(fd, "SBC A,imm\n"); | ||
1694 | #endif | ||
1695 | break; /* FIXME: Implement */ | ||
1696 | case 0xDF: /* RST 18h */ | ||
1697 | #ifdef DYNA_DEBUG | ||
1698 | fdprintf(fd, "RST 18h\n"); | ||
761 | #endif | 1699 | #endif |
762 | DYNA_AND_l_i_to_r(0xFF,6); | 1700 | break; /* FIXME: Implement */ |
763 | DYNA_OR_l_i_to_r(FETCH<<8,6); | 1701 | case 0xE0: /* LDH (imm),A */ |
764 | break; | ||
765 | case 0x2E: /* LD L,imm */ | ||
766 | #ifdef DYNA_DEBUG | 1702 | #ifdef DYNA_DEBUG |
767 | fdprintf(fd,"LD L,#0x%x\n",readb(xPC)); | 1703 | fdprintf(fd,"LD (0x%x),A\n",readb(xPC)); |
1704 | #endif | ||
1705 | DYNA_PUSH_l_r(1,0); | ||
1706 | DYNA_PEA_w_i(FETCH); | ||
1707 | CALL_NATIVE(&writehi); | ||
1708 | DYNA_ADDQ_l_i_to_r(0,7,1); | ||
1709 | /*writehi(FETCH, A); */ | ||
1710 | break; | ||
1711 | case 0xE1: /* POP HL */ | ||
1712 | #ifdef DYNA_DEBUG | ||
1713 | fdprintf(fd, "POP HL\n"); | ||
1714 | #endif | ||
1715 | break; /* FIXME: Implement */ | ||
1716 | case 0xE2: /* LDH (imm),A */ | ||
1717 | #ifdef DYNA_DEBUG | ||
1718 | fdprintf(fd, "LDH (imm),A\n"); | ||
768 | #endif | 1719 | #endif |
769 | DYNA_AND_l_i_to_r(0xFF00,6); | 1720 | break; /* FIXME: Implement */ |
770 | DYNA_OR_l_i_to_r(FETCH,6); | 1721 | case 0xE3: /* NULL */ |
771 | break; | ||
772 | case 0x3E: /* LD A,imm */ | ||
773 | #ifdef DYNA_DEBUG | 1722 | #ifdef DYNA_DEBUG |
774 | fdprintf(fd,"LD A,#0x%x\n",readb(xPC)); | 1723 | fdprintf(fd,"NULL\n"); |
775 | #endif | 1724 | #endif |
776 | DYNA_MOVEQ_l_i_to_r(FETCH,1); | 1725 | break; |
777 | break; | 1726 | case 0xE4: /* NULL */ |
778 | 1727 | break; | |
779 | case 0xF9: /* LD SP,HL */ | ||
780 | #ifdef DYNA_DEBUG | 1728 | #ifdef DYNA_DEBUG |
781 | fdprintf(fd,"LD SP,HL\n"); | 1729 | fdprintf(fd,"NULL\n"); |
1730 | #endif | ||
1731 | case 0xE5: /* PUSH HL */ | ||
1732 | #ifdef DYNA_DEBUG | ||
1733 | fdprintf(fd, "PUSH HL\n"); | ||
1734 | #endif | ||
1735 | break; /* FIXME: Implement */ | ||
1736 | case 0xE6: /* AND imm */ | ||
1737 | #ifdef DYNA_DEBUG | ||
1738 | fdprintf(fd, "AND imm\n"); | ||
782 | #endif | 1739 | #endif |
783 | DYNA_MOVEA_w_r_to_r(6,0,0); | 1740 | break; /* FIXME: Implement */ |
784 | break; | 1741 | case 0xE7: /* RST 20h */ |
785 | case 0xF3: /* DI */ | ||
786 | #ifdef DYNA_DEBUG | 1742 | #ifdef DYNA_DEBUG |
787 | fdprintf(fd,"DI\n"); | 1743 | fdprintf(fd, "RST 20h\n"); |
788 | #endif | 1744 | #endif |
789 | DYNA_CLR_l_m(&cpu.ime); | 1745 | break; /* FIXME: Implement */ |
790 | DYNA_CLR_l_m(&cpu.ima); | 1746 | case 0xE8: /* ADD SP */ |
791 | DYNA_CLR_l_m(&cpu.halt); | 1747 | #ifdef DYNA_DEBUG |
792 | /* cpu.halt = cpu.ima = cpu.ime = 0; */ | 1748 | fdprintf(fd, "ADD SP\n"); |
793 | break; | 1749 | #endif |
794 | case 0xFB: /* EI */ | 1750 | break; /* FIXME: Implement */ |
1751 | case 0xE9: /* JP HL */ | ||
1752 | #ifdef DYNA_DEBUG | ||
1753 | fdprintf(fd, "JP HL\n"); | ||
1754 | #endif | ||
1755 | break; /* FIXME: Implement */ | ||
1756 | case 0xEA: /* LD A */ | ||
1757 | #ifdef DYNA_DEBUG | ||
1758 | fdprintf(fd, "LD A\n"); | ||
1759 | #endif | ||
1760 | break; /* FIXME: Implement */ | ||
1761 | case 0xEB: /* NULL */ | ||
795 | #ifdef DYNA_DEBUG | 1762 | #ifdef DYNA_DEBUG |
796 | fdprintf(fd,"EI\n"); | 1763 | fdprintf(fd,"NULL\n"); |
797 | #endif | 1764 | #endif |
798 | DYNA_MOVEQ_l_i_to_r(1,0); | 1765 | break; |
799 | DYNA_MOVEA_l_i_to_r(&cpu.ima,3); | 1766 | case 0xEC: /* NULL */ |
800 | DYNA_MOVE_l_r_to_m(0,3); | ||
801 | /*cpu.ima=1; */ | ||
802 | break; | ||
803 | |||
804 | case 0xE0: /* LDH (imm),A */ | ||
805 | #ifdef DYNA_DEBUG | 1767 | #ifdef DYNA_DEBUG |
806 | fdprintf(fd,"LD (0x%x),A\n",readb(xPC)); | 1768 | fdprintf(fd,"NULL\n"); |
807 | #endif | 1769 | #endif |
808 | DYNA_PUSH_l_r(1,0); | 1770 | break; |
809 | DYNA_PEA_w_i(FETCH); | 1771 | case 0xED: /* NULL */ |
810 | CALL_NATIVE(&writehi); | ||
811 | DYNA_ADDQ_l_i_to_r(0,7,1); | ||
812 | /*writehi(FETCH, A); */ | ||
813 | break; | ||
814 | |||
815 | case 0xC3: /* JP (imm) PC = readw(PC) */ | ||
816 | #ifdef DYNA_DEBUG | 1772 | #ifdef DYNA_DEBUG |
817 | fdprintf(fd,"JP (0x%x)\n",readw(xPC)); | 1773 | fdprintf(fd,"NULL\n"); |
818 | #endif | 1774 | #endif |
819 | PC=readw(PC); | 1775 | break; |
820 | done=1; | 1776 | case 0xEE: /* XOR imm */ |
821 | break; | ||
822 | case 0xCD: /* CALL (imm) PUSH(PC+2) PC=readw(PC); */ | ||
823 | #ifdef DYNA_DEBUG | 1777 | #ifdef DYNA_DEBUG |
824 | fdprintf(fd,"CALL (0x%x)\n",readw(xPC)); | 1778 | fdprintf(fd, "XOR imm\n"); |
825 | #endif | 1779 | #endif |
826 | PUSH(PC+2); | 1780 | break; /* FIXME: Implement */ |
827 | PC=readw(PC); | 1781 | case 0xEF: /* RST 28h */ |
828 | done=1; | 1782 | #ifdef DYNA_DEBUG |
829 | break; | 1783 | fdprintf(fd, "RST 28h\n"); |
830 | 1784 | #endif | |
831 | case 0x97: /* SUB A (halfcarry ?) */ | 1785 | break; /* FIXME: Implement */ |
832 | #ifdef DYNA_DEBUG | 1786 | case 0xF0: /* LDH A,(imm) */ |
833 | fdprintf(fd,"SUB A\n"); | 1787 | #ifdef DYNA_DEBUG |
834 | #endif | 1788 | fdprintf(fd,"LDH A,(0x%x)\n",readb(xPC)); |
835 | DYNA_CLR_l_r(1); | 1789 | #endif |
836 | DYNA_MOVEQ_l_i_to_r(0xC0,7); | 1790 | DYNA_PEA_w_i(FETCH); |
837 | break; | 1791 | CALL_NATIVE(&readhi); |
838 | case 0xF0: /* LDH A,(imm) */ | 1792 | DYNA_ADDQ_l_i_to_r(4,7,1); |
839 | #ifdef DYNA_DEBUG | 1793 | DYNA_MOVE_b_r_to_r(0,1); |
840 | fdprintf(fd,"LDH A,(0x%x)\n",readb(xPC)); | 1794 | /*A = readhi(FETCH)*/ |
841 | #endif | 1795 | break; |
842 | DYNA_PEA_w_i(FETCH); | 1796 | case 0xF1: /* POP AF */ |
843 | CALL_NATIVE(&readhi); | 1797 | #ifdef DYNA_DEBUG |
844 | DYNA_ADDQ_l_i_to_r(4,7,1); | 1798 | fdprintf(fd, "POP AF\n"); |
845 | DYNA_MOVE_b_r_to_r(0,1); | 1799 | #endif |
846 | /*A = readhi(FETCH)*/ | 1800 | break; /* FIXME: Implement */ |
847 | break; | 1801 | case 0xF2: /* LDH A,(imm) */ |
848 | case 0x87: // ADD A,A | 1802 | #ifdef DYNA_DEBUG |
849 | #ifdef DYNA_DEBUG | 1803 | fdprintf(fd, "LDH A,(imm)\n"); |
850 | fdprintf(fd,"ADD A,A\n"); | 1804 | #endif |
851 | #endif | 1805 | break; /* FIXME: Implement */ |
852 | /* code taken from gcc -O3 output by compiling; | 1806 | case 0xF3: /* DI */ |
853 | * c=(2*b)&0xFF; | 1807 | #ifdef DYNA_DEBUG |
854 | * a=(c) ? 0 : 0x80 | // zero flag | 1808 | fdprintf(fd,"DI\n"); |
855 | * (0x20 & (c) << 1) | // halfcarry | 1809 | #endif |
856 | * ((2*b)&0x100)>>4; // carry | 1810 | DYNA_CLR_l_m(&cpu.ime); |
857 | */ | 1811 | DYNA_CLR_l_m(&cpu.ima); |
858 | DYNA_MOVE_l_r_to_r(1,0,0); /* move.l d1, d0 */ | 1812 | DYNA_CLR_l_m(&cpu.halt); |
859 | DYNA_ADD_l_r_to_r(0,0,0); /* add.l d0, d0 */ | 1813 | /* cpu.halt = cpu.ima = cpu.ime = 0; */ |
860 | DYNA_AND_l_i_to_r(510,0); /* and.l #510, d0 */ | 1814 | break; |
861 | DYNA_MOVEA_l_r_to_r(0,3,0); /* movea.l d0,a3 */ | 1815 | case 0xF4: /* NULL */ |
862 | DYNA_CLR_b_r(7); /* clr.b d7 */ | 1816 | #ifdef DYNA_DEBUG |
863 | DYNA_TST_b_r(0,0); /* tst.b d0 */ | 1817 | fdprintf(fd,"NULL\n"); |
864 | DYNA_DUMMYBRANCH(2,0); | 1818 | #endif |
865 | DYNA_MOVE_l_r_to_r(1,0,0); /* move.l d1,d0 */ | 1819 | break; |
866 | DYNA_LSHIFT_l(3,0,0,0); /* lsr.l #3, d0 */ | 1820 | case 0xF5: /* PUSH AF */ |
867 | DYNA_MOVEQ_l_i_to_r(16,1); /* moveq #16,d1 */ | 1821 | #ifdef DYNA_DEBUG |
868 | DYNA_AND_l_r_to_r(1,0); /* and.l d1 d0 */ | 1822 | fdprintf(fd, "PUSH AF\n"); |
869 | DYNA_MOVEQ_l_i_to_r(0x80,7); /* moveq #0x80,d7 */ | 1823 | #endif |
870 | DYNA_OR_l_r_to_r(0,7); /* or.l d0, d7 */ | 1824 | break; /* FIXME: Implement */ |
871 | DYNA_BCC_c(0x6,2,0); /* branch not equal, here */ | 1825 | case 0xF6: /* OR imm */ |
872 | DYNA_MOVE_l_r_to_r(3,1,1); /* move.l a3,d1 */ | 1826 | #ifdef DYNA_DEBUG |
873 | DYNA_AND_l_i_to_r(0xFE,1); /* and.l #0xFE,d1 */ | 1827 | fdprintf(fd, "OR imm\n"); |
874 | DYNA_AND_l_i_to_r(0xB0,7); /* and.l #0xB0,d7 */ | 1828 | #endif |
875 | break; | 1829 | break; /* FIXME: Implement */ |
876 | case 0xD0: /* RET NC */ | 1830 | case 0xF7: /* RST 30h */ |
877 | #ifdef DYNA_DEBUG | 1831 | #ifdef DYNA_DEBUG |
878 | fdprintf(fd,"RET NC\n"); | 1832 | fdprintf(fd, "RST 30h\n"); |
879 | #endif | 1833 | #endif |
880 | DYNA_BTST_l_r(5,7); /* btst #5,d7 */ | 1834 | break; /* FIXME: Implement */ |
881 | DYNA_DUMMYBRANCH(2,0); | 1835 | case 0xF8: /* LD HL,SP */ |
882 | POPA(1); /* POP %a1 */ | 1836 | #ifdef DYNA_DEBUG |
883 | DYNA_MOVEA_l_i_to_r(&blockclen,3); | 1837 | fdprintf(fd, "LD HL,SP\n"); |
884 | DYNA_MOVE_l_i_to_m(tclen,3); | 1838 | #endif |
885 | DYNA_RET(); | 1839 | break; /* FIXME: Implement */ |
886 | DYNA_BCC_c(0x6,2,0); /* jump here if bit is not zero */ | 1840 | case 0xF9: /* LD SP,HL */ |
887 | tclen-=3; | 1841 | #ifdef DYNA_DEBUG |
888 | break; | 1842 | fdprintf(fd,"LD SP,HL\n"); |
889 | case 0xC9: /* RET */ | 1843 | #endif |
890 | #ifdef DYNA_DEBUG | 1844 | DYNA_MOVEA_w_r_to_r(6,0,0); |
891 | fdprintf(fd,"RET\n"); | 1845 | break; |
892 | #endif | 1846 | case 0xFA: /* LD A, (imm) */ |
893 | POPA(1); | 1847 | #ifdef DYNA_DEBUG |
894 | writepc=0; | 1848 | fdprintf(fd,"LD A,(0x%x)\n",readw(xPC)); |
895 | done=1; | 1849 | #endif |
896 | break; | 1850 | /*DYNA_PEA_w_i(readw(xPC)); |
897 | case 0x20: /* JR NZ */ | 1851 | PC+=2; \ |
898 | #ifdef DYNA_DEBUG | 1852 | CALL_NATIVE(&readb); \ |
899 | fdprintf(fd,"JR NZ\n"); | 1853 | DYNA_ADDQ_l_i_to_r(4,7,1); \ |
900 | #endif | 1854 | DYNA_MOVE_l_r_to_r(0,1,0);*/ |
901 | DYNA_BTST_l_r(8,7); /* btst #8,d7 */ | 1855 | break; |
902 | DYNA_DUMMYBRANCH(2,0); | 1856 | case 0xFB: /* EI */ |
903 | DYNA_MOVEA_l_i_to_r(&blockclen,3); | 1857 | #ifdef DYNA_DEBUG |
904 | DYNA_MOVE_l_i_to_m(tclen,3); | 1858 | fdprintf(fd,"EI\n"); |
905 | DYNA_MOVEA_l_i_to_r(PC+1+(signed char)readb(PC),1); | 1859 | #endif |
906 | DYNA_RET(); | 1860 | DYNA_MOVEQ_l_i_to_r(1,0); |
907 | DYNA_BCC_c(0x6,2,0); /* jump here if bit is not zero */ | 1861 | DYNA_MOVEA_l_i_to_r(&cpu.ima,3); |
908 | tclen--; | 1862 | DYNA_MOVE_l_r_to_m(0,3); |
909 | PC++; | 1863 | /*cpu.ima=1; */ |
910 | break; | 1864 | break; |
911 | case 0xC2: /* JP NZ */ | 1865 | case 0xFC: /* NULL */ |
912 | #ifdef DYNA_DEBUG | 1866 | #ifdef DYNA_DEBUG |
913 | fdprintf(fd,"JP NZ\n"); | 1867 | fdprintf(fd,"NULL\n"); |
914 | #endif | 1868 | #endif |
915 | DYNA_BTST_l_r(8,7); /* btst #8,d7 */ | 1869 | break; |
916 | DYNA_DUMMYBRANCH(2,0); | 1870 | case 0xFD: /* NULL */ |
917 | DYNA_MOVEA_l_i_to_r(&blockclen,3); | 1871 | #ifdef DYNA_DEBUG |
918 | DYNA_MOVE_l_i_to_m(tclen,3); | 1872 | fdprintf(fd,"NULL\n"); |
919 | DYNA_MOVEA_l_i_to_r(readw(PC),1); | 1873 | #endif |
920 | DYNA_RET(); | 1874 | break; |
921 | DYNA_BCC_c(0x6,2,0); /* jump here if bit is not zero */ | 1875 | case 0xFE: /* CMP #<imm> TODO: can be (much) more efficient.*/ |
922 | tclen--; | 1876 | #ifdef DYNA_DEBUG |
923 | PC+=2; | 1877 | fdprintf(fd,"CMP #0x%x\n",readb(xPC)); |
924 | break; | 1878 | #endif |
925 | /* case 0xFA: /* LD A, (imm) | 1879 | DYNA_MOVEA_l_r_to_r(2,3,0); /* movea.l %d2, %a3 */ |
926 | #ifdef DYNA_DEBUG | 1880 | DYNA_MOVEQ_l_i_to_r(FETCH,2); /* moveq.l #<FETCH>,%d2 */ |
927 | fdprintf(fd,"LD A,(0x%x)\n",readw(xPC)); | 1881 | CMP(2); |
928 | #endif | 1882 | DYNA_MOVE_l_r_to_r(3,2,1); /* move.l %a3, %d2 */ |
929 | DYNA_PEA_w_i(readw(xPC)); | 1883 | break; |
930 | PC+=2; \ | 1884 | case 0xFF: /* RST 38h */ |
931 | CALL_NATIVE(&readb); \ | 1885 | #ifdef DYNA_DEBUG |
932 | DYNA_ADDQ_l_i_to_r(4,7,1); \ | 1886 | fdprintf(fd, "RST 38h\n"); |
933 | DYNA_MOVE_l_r_to_r(0,1,0); | 1887 | #endif |
934 | break; */ | 1888 | break; /* FIXME: Implement */ |
935 | 1889 | default: | |
936 | case 0xFE: /* CMP #<imm> TODO: can be (much) more efficient.*/ | 1890 | snprintf(meow,499,"unimplemented opcode %d / 0x%x",op,op); |
937 | #ifdef DYNA_DEBUG | 1891 | die(meow); |
938 | fdprintf(fd,"CMP #0x%x\n",readb(xPC)); | 1892 | return; |
939 | #endif | 1893 | break; |
940 | DYNA_MOVEA_l_r_to_r(2,3,0); /* movea.l %d2, %a3 */ | 1894 | } |
941 | DYNA_MOVEQ_l_i_to_r(FETCH,2); /* moveq.l #<FETCH>,%d2 */ | ||
942 | CMP(2); | ||
943 | DYNA_MOVE_l_r_to_r(3,2,1); /* move.l %a3, %d2 */ | ||
944 | break; | ||
945 | |||
946 | case 0xB1: /* OR C */ | ||
947 | #ifdef DYNA_DEBUG | ||
948 | fdprintf(fd,"OR C\n"); | ||
949 | #endif | ||
950 | DYNA_OR_l_r_to_r(3,1); // or %d3,%d1 | ||
951 | DYNA_MOVEQ_l_i_to_r(0,7); | ||
952 | DYNA_TST_b_r(1,0); | ||
953 | DYNA_DUMMYBRANCH(2,0); | ||
954 | DYNA_MOVEQ_l_i_to_r(0x80,7); | ||
955 | DYNA_BCC_c(0x6,2,0); | ||
956 | break; | ||
957 | default: | ||
958 | snprintf(meow,499,"unimplemented opcode %d / 0x%x",op,op); | ||
959 | die(meow); | ||
960 | return; | ||
961 | break; | ||
962 | } | ||
963 | } | 1895 | } |
964 | #ifdef DYNA_DEBUG | 1896 | #ifdef DYNA_DEBUG |
965 | fdprintf(fd,"(End of Block)\n"); | 1897 | fdprintf(fd,"(End of Block)\n"); |
@@ -968,7 +1900,7 @@ void dynamic_recompile (struct dynarec_block *newblock) { | |||
968 | DYNA_MOVEA_l_i_to_r(&blockclen,3); | 1900 | DYNA_MOVEA_l_i_to_r(&blockclen,3); |
969 | DYNA_MOVE_l_i_to_m(tclen,3); | 1901 | DYNA_MOVE_l_i_to_m(tclen,3); |
970 | if(writepc) | 1902 | if(writepc) |
971 | DYNA_MOVEA_l_i_to_r(PC,1); | 1903 | DYNA_MOVEA_l_i_to_r(PC,1); |
972 | DYNA_RET(); | 1904 | DYNA_RET(); |
973 | PC=oldpc; | 1905 | PC=oldpc; |
974 | setmallocpos(dynapointer); | 1906 | setmallocpos(dynapointer); |
@@ -976,9 +1908,9 @@ void dynamic_recompile (struct dynarec_block *newblock) { | |||
976 | invalidate_icache(); | 1908 | invalidate_icache(); |
977 | snprintf(meow,499,"/dyna_0x%x_code.rb",PC); | 1909 | snprintf(meow,499,"/dyna_0x%x_code.rb",PC); |
978 | fd=open(meow,O_WRONLY|O_CREAT|O_TRUNC); | 1910 | fd=open(meow,O_WRONLY|O_CREAT|O_TRUNC); |
979 | if(fd>=0) { | 1911 | if(fd>=0) |
1912 | { | ||
980 | write(fd,newblock->block,newblock->length); | 1913 | write(fd,newblock->block,newblock->length); |
981 | close(fd); | 1914 | close(fd); |
982 | } | 1915 | } |
983 | } | 1916 | } |
984 | #endif | ||
diff --git a/apps/plugins/rockboy/emu.c b/apps/plugins/rockboy/emu.c index 8ee925cd02..50fc442713 100644 --- a/apps/plugins/rockboy/emu.c +++ b/apps/plugins/rockboy/emu.c | |||
@@ -5,24 +5,9 @@ | |||
5 | #include "cpu-gb.h" | 5 | #include "cpu-gb.h" |
6 | #include "mem.h" | 6 | #include "mem.h" |
7 | #include "lcd-gb.h" | 7 | #include "lcd-gb.h" |
8 | #include "rc.h" | ||
9 | #include "sound.h" | 8 | #include "sound.h" |
10 | #include "rtc-gb.h" | 9 | #include "rtc-gb.h" |
11 | 10 | ||
12 | static int framelen = 16743; | ||
13 | static int framecount; | ||
14 | |||
15 | rcvar_t emu_exports[] = | ||
16 | { | ||
17 | RCV_INT("framelen", &framelen), | ||
18 | RCV_INT("framecount", &framecount), | ||
19 | RCV_END | ||
20 | }; | ||
21 | |||
22 | void emu_init(void) | ||
23 | { | ||
24 | } | ||
25 | |||
26 | /* | 11 | /* |
27 | * emu_reset is called to initialize the state of the emulated | 12 | * emu_reset is called to initialize the state of the emulated |
28 | * system. It should set cpu registers, hardware registers, etc. to | 13 | * system. It should set cpu registers, hardware registers, etc. to |
@@ -47,9 +32,8 @@ void emu_step(void) | |||
47 | * make things work in the mean time. */ | 32 | * make things work in the mean time. */ |
48 | void emu_run(void) | 33 | void emu_run(void) |
49 | { | 34 | { |
50 | // void *timer = sys_timer(); | 35 | /*void *timer = sys_timer();*/ |
51 | int framesin=0,frames=0,timeten=*rb->current_tick, timehun=*rb->current_tick; | 36 | int framesin=0,frames=0,timeten=*rb->current_tick, timehun=*rb->current_tick; |
52 | // int delay; | ||
53 | 37 | ||
54 | setvidmode(options.fullscreen); | 38 | setvidmode(options.fullscreen); |
55 | vid_begin(); | 39 | vid_begin(); |
@@ -63,24 +47,25 @@ void emu_run(void) | |||
63 | while (R_LY > 0 && R_LY < 144) | 47 | while (R_LY > 0 && R_LY < 144) |
64 | emu_step(); | 48 | emu_step(); |
65 | 49 | ||
66 | rtc_tick(); | 50 | /* rtc_tick(); */ /* RTC support not implemented */ |
67 | sound_mix(); | 51 | |
68 | if (!pcm_submit()) | 52 | if(options.sound) |
69 | { | 53 | { |
70 | /* delay = framelen - sys_elapsed(timer); | 54 | sound_mix(); |
71 | sys_sleep(delay); | 55 | pcm_submit(); |
72 | sys_elapsed(timer);*/ | ||
73 | } | 56 | } |
74 | 57 | ||
75 | doevents(); | 58 | doevents(); |
76 | vid_begin(); | 59 | vid_begin(); |
77 | 60 | ||
78 | if (!(R_LCDC & 0x80)) | 61 | if (!(R_LCDC & 0x80)) |
79 | cpu_emulate(32832); | 62 | cpu_emulate(32832); |
80 | 63 | ||
81 | while (R_LY > 0) /* wait for next frame */ | 64 | while (R_LY > 0) /* wait for next frame */ |
65 | { | ||
82 | emu_step(); | 66 | emu_step(); |
83 | rb->yield(); | 67 | rb->yield(); |
68 | } | ||
84 | 69 | ||
85 | frames++; | 70 | frames++; |
86 | framesin++; | 71 | framesin++; |
diff --git a/apps/plugins/rockboy/emu.h b/apps/plugins/rockboy/emu.h index 979b33cc54..2e1c7bdc08 100644 --- a/apps/plugins/rockboy/emu.h +++ b/apps/plugins/rockboy/emu.h | |||
@@ -1,2 +1,2 @@ | |||
1 | void emu_reset(void); | 1 | void emu_reset(void); |
2 | void emu_run(void); | 2 | void emu_run(void) ICODE_ATTR; |
diff --git a/apps/plugins/rockboy/events.c b/apps/plugins/rockboy/events.c index 5a34ce81e5..c018f7ce53 100644 --- a/apps/plugins/rockboy/events.c +++ b/apps/plugins/rockboy/events.c | |||
@@ -8,10 +8,6 @@ | |||
8 | #include "rockmacros.h" | 8 | #include "rockmacros.h" |
9 | #include "input.h" | 9 | #include "input.h" |
10 | 10 | ||
11 | |||
12 | char keystates[MAX_KEYS]; | ||
13 | int nkeysdown; | ||
14 | |||
15 | #define MAX_EVENTS 32 | 11 | #define MAX_EVENTS 32 |
16 | 12 | ||
17 | static event_t eventqueue[MAX_EVENTS]; | 13 | static event_t eventqueue[MAX_EVENTS]; |
@@ -20,34 +16,23 @@ static int eventhead, eventpos; | |||
20 | 16 | ||
21 | int ev_postevent(event_t *ev) | 17 | int ev_postevent(event_t *ev) |
22 | { | 18 | { |
23 | int nextevent; | 19 | int nextevent; |
24 | nextevent = (eventhead+1)%MAX_EVENTS; | 20 | nextevent = (eventhead+1)%MAX_EVENTS; |
25 | if (nextevent == eventpos) | 21 | if (nextevent == eventpos) |
26 | return 0; | 22 | return 0; |
27 | eventqueue[eventhead] = *ev; | 23 | eventqueue[eventhead] = *ev; |
28 | eventhead = nextevent; | 24 | eventhead = nextevent; |
29 | return 1; | 25 | return 1; |
30 | } | 26 | } |
31 | 27 | ||
32 | int ev_getevent(event_t *ev) | 28 | int ev_getevent(event_t *ev) |
33 | { | 29 | { |
34 | if (eventpos == eventhead) | 30 | if (eventpos == eventhead) |
35 | { | 31 | { |
36 | ev->type = EV_NONE; | 32 | ev->type = EV_NONE; |
37 | return 0; | 33 | return 0; |
38 | } | 34 | } |
39 | *ev = eventqueue[eventpos]; | 35 | *ev = eventqueue[eventpos]; |
40 | eventpos = (eventpos+1)%MAX_EVENTS; | 36 | eventpos = (eventpos+1)%MAX_EVENTS; |
41 | if (ev->type == EV_PRESS) | 37 | return 1; |
42 | { | ||
43 | keystates[ev->code] = 1; | ||
44 | nkeysdown++; | ||
45 | } | ||
46 | if (ev->type == EV_RELEASE) | ||
47 | { | ||
48 | keystates[ev->code] = 0; | ||
49 | nkeysdown--; | ||
50 | if (nkeysdown < 0) nkeysdown = 0; | ||
51 | } | ||
52 | return 1; | ||
53 | } | 38 | } |
diff --git a/apps/plugins/rockboy/exports.c b/apps/plugins/rockboy/exports.c deleted file mode 100644 index 43504f4b4f..0000000000 --- a/apps/plugins/rockboy/exports.c +++ /dev/null | |||
@@ -1,42 +0,0 @@ | |||
1 | |||
2 | |||
3 | #include "rockmacros.h" | ||
4 | |||
5 | #include "rc.h" | ||
6 | |||
7 | extern rcvar_t emu_exports[], loader_exports[], | ||
8 | lcd_exports[], rtc_exports[], sound_exports[], | ||
9 | vid_exports[], joy_exports[], pcm_exports[]; | ||
10 | |||
11 | |||
12 | rcvar_t *sources[] = | ||
13 | { | ||
14 | emu_exports, | ||
15 | loader_exports, | ||
16 | lcd_exports, | ||
17 | rtc_exports, | ||
18 | sound_exports, | ||
19 | vid_exports, | ||
20 | joy_exports, | ||
21 | pcm_exports, | ||
22 | NULL | ||
23 | }; | ||
24 | |||
25 | |||
26 | void init_exports(void) | ||
27 | { | ||
28 | rcvar_t **s = sources; | ||
29 | |||
30 | while (*s) | ||
31 | rc_exportvars(*(s++)); | ||
32 | } | ||
33 | |||
34 | |||
35 | void show_exports(void) | ||
36 | { | ||
37 | // TODO | ||
38 | /*int i, j; | ||
39 | for (i = 0; sources[i]; i++) | ||
40 | for (j = 0; sources[i][j].name; j++) | ||
41 | printf("%s\n", sources[i][j].name);*/ | ||
42 | } | ||
diff --git a/apps/plugins/rockboy/exports.h b/apps/plugins/rockboy/exports.h deleted file mode 100644 index 8d787c0945..0000000000 --- a/apps/plugins/rockboy/exports.h +++ /dev/null | |||
@@ -1,2 +0,0 @@ | |||
1 | void init_exports(void); | ||
2 | void show_exports(void); | ||
diff --git a/apps/plugins/rockboy/fastmem.c b/apps/plugins/rockboy/fastmem.c index d883438ce1..9092f68fed 100644 --- a/apps/plugins/rockboy/fastmem.c +++ b/apps/plugins/rockboy/fastmem.c | |||
@@ -3,136 +3,75 @@ | |||
3 | #include "rockmacros.h" | 3 | #include "rockmacros.h" |
4 | #include "fastmem.h" | 4 | #include "fastmem.h" |
5 | 5 | ||
6 | |||
7 | #define D 0 /* direct */ | ||
8 | #define C 1 /* direct cgb-only */ | ||
9 | #define R 2 /* io register */ | ||
10 | #define S 3 /* sound register */ | ||
11 | #define W 4 /* wave pattern */ | ||
12 | |||
13 | #define F 0xFF /* fail */ | ||
14 | |||
15 | const byte himask[256]; | ||
16 | |||
17 | const byte hi_rmap[256] = | ||
18 | { | ||
19 | 0, 0, R, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | ||
20 | S, S, S, S, S, S, S, S, S, S, S, S, S, S, S, S, | ||
21 | S, S, S, S, S, S, S, S, S, S, S, S, S, S, S, S, | ||
22 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | ||
23 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, C, 0, C, | ||
24 | 0, C, C, C, C, C, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | ||
25 | 0, 0, 0, 0, 0, 0, 0, 0, C, C, C, C, 0, 0, 0, 0, | ||
26 | C, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 | ||
27 | }; | ||
28 | |||
29 | const byte hi_wmap[256] = | ||
30 | { | ||
31 | R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, | ||
32 | S, S, S, S, S, S, S, S, S, S, S, S, S, S, S, S, | ||
33 | S, S, S, S, S, S, S, S, S, S, S, S, S, S, S, S, | ||
34 | S, S, S, S, S, S, S, S, S, S, S, S, S, S, S, S, | ||
35 | R, R, R, R, R, R, R, R, R, R, R, R, 0, R, 0, R, | ||
36 | 0, C, C, C, C, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | ||
37 | 0, 0, 0, 0, 0, 0, 0, 0, R, R, R, R, 0, 0, 0, 0, | ||
38 | R, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | ||
39 | |||
40 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | ||
41 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | ||
42 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | ||
43 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | ||
44 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | ||
45 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | ||
46 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | ||
47 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, R | ||
48 | }; | ||
49 | |||
50 | |||
51 | byte readb(int a) | 6 | byte readb(int a) |
52 | { | 7 | { |
53 | byte *p = mbc.rmap[a>>12]; | 8 | byte *p = mbc.rmap[a>>12]; |
54 | if (p) return p[a]; | 9 | if (p) return p[a]; |
55 | else return mem_read(a); | 10 | else return mem_read(a); |
56 | } | 11 | } |
57 | 12 | ||
58 | void writeb(int a, byte b) | 13 | void writeb(int a, byte b) |
59 | { | 14 | { |
60 | byte *p = mbc.wmap[a>>12]; | 15 | byte *p = mbc.wmap[a>>12]; |
61 | if (p) p[a] = b; | 16 | if (p) p[a] = b; |
62 | else mem_write(a, b); | 17 | else mem_write(a, b); |
63 | } | 18 | } |
64 | 19 | ||
65 | int readw(int a) | 20 | int readw(int a) |
66 | { | 21 | { |
67 | if ((a+1) & 0xfff) | 22 | if ((a+1) & 0xfff) |
68 | { | 23 | { |
69 | byte *p = mbc.rmap[a>>12]; | 24 | byte *p = mbc.rmap[a>>12]; |
70 | if (p) | 25 | if (p) |
71 | { | 26 | { |
72 | #ifdef ROCKBOX_LITTLE_ENDIAN | 27 | #ifdef ROCKBOX_LITTLE_ENDIAN |
73 | #ifndef ALLOW_UNALIGNED_IO | 28 | #ifndef ALLOW_UNALIGNED_IO |
74 | if (a&1) return p[a] | (p[a+1]<<8); | 29 | if (a&1) return p[a] | (p[a+1]<<8); |
75 | #endif | 30 | #endif |
76 | return *(word *)(p+a); | 31 | return *(word *)(p+a); |
77 | #else | 32 | #else |
78 | return p[a] | (p[a+1]<<8); | 33 | return p[a] | (p[a+1]<<8); |
79 | #endif | 34 | #endif |
80 | } | 35 | } |
81 | } | 36 | } |
82 | return mem_read(a) | (mem_read(a+1)<<8); | 37 | return mem_read(a) | (mem_read(a+1)<<8); |
83 | } | 38 | } |
84 | 39 | ||
85 | void writew(int a, int w) | 40 | void writew(int a, int w) |
86 | { | 41 | { |
87 | if ((a+1) & 0xfff) | 42 | if ((a+1) & 0xfff) |
88 | { | 43 | { |
89 | byte *p = mbc.wmap[a>>12]; | 44 | byte *p = mbc.wmap[a>>12]; |
90 | if (p) | 45 | if (p) |
91 | { | 46 | { |
92 | #ifdef ROCKBOX_LITTLE_ENDIAN | 47 | #ifdef ROCKBOX_LITTLE_ENDIAN |
93 | #ifndef ALLOW_UNALIGNED_IO | 48 | #ifndef ALLOW_UNALIGNED_IO |
94 | if (a&1) | 49 | if (a&1) |
95 | { | 50 | { |
96 | p[a] = w; | 51 | p[a] = w; |
97 | p[a+1] = w >> 8; | 52 | p[a+1] = w >> 8; |
98 | return; | 53 | return; |
99 | } | 54 | } |
100 | #endif | 55 | #endif |
101 | *(word *)(p+a) = w; | 56 | *(word *)(p+a) = w; |
102 | return; | 57 | return; |
103 | #else | 58 | #else |
104 | p[a] = w; | 59 | p[a] = w; |
105 | p[a+1] = w >> 8; | 60 | p[a+1] = w >> 8; |
106 | return; | 61 | return; |
107 | #endif | 62 | #endif |
108 | } | 63 | } |
109 | } | 64 | } |
110 | mem_write(a, w); | 65 | mem_write(a, w); |
111 | mem_write(a+1, w>>8); | 66 | mem_write(a+1, w>>8); |
112 | } | 67 | } |
113 | 68 | ||
114 | byte readhi(int a) | 69 | byte readhi(int a) |
115 | { | 70 | { |
116 | return readb(a | 0xff00); | 71 | return readb(a | 0xff00); |
117 | } | 72 | } |
118 | 73 | ||
119 | void writehi(int a, byte b) | 74 | void writehi(int a, byte b) |
120 | { | 75 | { |
121 | writeb(a | 0xff00, b); | 76 | writeb(a | 0xff00, b); |
122 | } | 77 | } |
123 | |||
124 | #if 0 | ||
125 | byte readhi(int a) | ||
126 | { | ||
127 | byte (*rd)() = hi_read[a]; | ||
128 | return rd ? rd(a) : (ram.hi[a] | himask[a]); | ||
129 | } | ||
130 | |||
131 | void writehi(int a, byte b) | ||
132 | { | ||
133 | byte (*wr)() = hi_write[a]; | ||
134 | if (wr) wr(a, b); | ||
135 | else ram.hi[a] = b & ~himask[a]; | ||
136 | } | ||
137 | #endif | ||
138 | |||
diff --git a/apps/plugins/rockboy/fastmem.h b/apps/plugins/rockboy/fastmem.h index e36eb2032a..cc73a55a9d 100644 --- a/apps/plugins/rockboy/fastmem.h +++ b/apps/plugins/rockboy/fastmem.h | |||
@@ -13,10 +13,5 @@ int readw(int a) ICODE_ATTR; | |||
13 | void writew(int a, int w) ICODE_ATTR; | 13 | void writew(int a, int w) ICODE_ATTR; |
14 | byte readhi(int a) ICODE_ATTR; | 14 | byte readhi(int a) ICODE_ATTR; |
15 | void writehi(int a, byte b) ICODE_ATTR; | 15 | void writehi(int a, byte b) ICODE_ATTR; |
16 | #if 0 | ||
17 | byte readhi(int a); | ||
18 | void writehi(int a, byte b); | ||
19 | #endif | ||
20 | |||
21 | 16 | ||
22 | #endif | 17 | #endif |
diff --git a/apps/plugins/rockboy/fb.h b/apps/plugins/rockboy/fb.h index d70708e13a..97aeb425a0 100644 --- a/apps/plugins/rockboy/fb.h +++ b/apps/plugins/rockboy/fb.h | |||
@@ -10,19 +10,15 @@ | |||
10 | 10 | ||
11 | struct fb | 11 | struct fb |
12 | { | 12 | { |
13 | fb_data *ptr; | 13 | fb_data *ptr; |
14 | int w, h; | 14 | struct |
15 | int pelsize; | 15 | { |
16 | int pitch; | 16 | int l, r; |
17 | int indexed; | 17 | } cc[3]; |
18 | struct | 18 | int enabled; |
19 | { | 19 | #if !defined(HAVE_LCD_COLOR) |
20 | int l, r; | 20 | int mode; |
21 | } cc[4]; | 21 | #endif |
22 | int yuv; | ||
23 | int enabled; | ||
24 | int dirty; | ||
25 | int mode; | ||
26 | }; | 22 | }; |
27 | 23 | ||
28 | 24 | ||
diff --git a/apps/plugins/rockboy/hw.c b/apps/plugins/rockboy/hw.c index 794e4e4516..05cdfbc156 100644 --- a/apps/plugins/rockboy/hw.c +++ b/apps/plugins/rockboy/hw.c | |||
@@ -11,7 +11,7 @@ | |||
11 | #include "fastmem.h" | 11 | #include "fastmem.h" |
12 | 12 | ||
13 | 13 | ||
14 | struct hw hw; | 14 | struct hw hw IBSS_ATTR; |
15 | 15 | ||
16 | 16 | ||
17 | 17 | ||
@@ -24,17 +24,17 @@ struct hw hw; | |||
24 | 24 | ||
25 | void hw_interrupt(byte i, byte mask) | 25 | void hw_interrupt(byte i, byte mask) |
26 | { | 26 | { |
27 | byte oldif = R_IF; | 27 | byte oldif = R_IF; |
28 | i &= 0x1F & mask; | 28 | i &= 0x1F & mask; |
29 | R_IF |= i & (hw.ilines ^ i); | 29 | R_IF |= i & (hw.ilines ^ i); |
30 | 30 | ||
31 | /* FIXME - is this correct? not sure the docs understand... */ | 31 | /* FIXME - is this correct? not sure the docs understand... */ |
32 | if ((R_IF & (R_IF ^ oldif) & R_IE) && cpu.ime) cpu.halt = 0; | 32 | if ((R_IF & (R_IF ^ oldif) & R_IE) && cpu.ime) cpu.halt = 0; |
33 | /* if ((i & (hw.ilines ^ i) & R_IE) && cpu.ime) cpu.halt = 0; */ | 33 | /* if ((i & (hw.ilines ^ i) & R_IE) && cpu.ime) cpu.halt = 0; */ |
34 | /* if ((i & R_IE) && cpu.ime) cpu.halt = 0; */ | 34 | /* if ((i & R_IE) && cpu.ime) cpu.halt = 0; */ |
35 | 35 | ||
36 | hw.ilines &= ~mask; | 36 | hw.ilines &= ~mask; |
37 | hw.ilines |= i; | 37 | hw.ilines |= i; |
38 | } | 38 | } |
39 | 39 | ||
40 | 40 | ||
@@ -47,64 +47,65 @@ void hw_interrupt(byte i, byte mask) | |||
47 | 47 | ||
48 | void hw_dma(byte b) | 48 | void hw_dma(byte b) |
49 | { | 49 | { |
50 | int i; | 50 | int i; |
51 | addr a; | 51 | addr a; |
52 | 52 | ||
53 | a = ((addr)b) << 8; | 53 | a = ((addr)b) << 8; |
54 | for (i = 0; i < 160; i++, a++) | 54 | for (i = 0; i < 160; i++, a++) |
55 | lcd.oam.mem[i] = readb(a); | 55 | lcd.oam.mem[i] = readb(a); |
56 | } | 56 | } |
57 | 57 | ||
58 | 58 | void hw_hdma(void) | |
59 | |||
60 | void hw_hdma_cmd(byte c) | ||
61 | { | 59 | { |
62 | int cnt; | 60 | int cnt; |
63 | addr sa; | 61 | addr sa; |
64 | int da; | 62 | int da; |
65 | 63 | ||
66 | /* Begin or cancel HDMA */ | 64 | sa = ((addr)R_HDMA1 << 8) | (R_HDMA2&0xf0); |
67 | if ((hw.hdma|c) & 0x80) | 65 | da = 0x8000 | ((int)(R_HDMA3&0x1f) << 8) | (R_HDMA4&0xf0); |
68 | { | 66 | cnt = 16; |
69 | hw.hdma = c; | 67 | while (cnt--) |
70 | R_HDMA5 = c & 0x7f; | 68 | writeb(da++, readb(sa++)); |
71 | return; | 69 | cpu_timers(16); |
72 | } | 70 | R_HDMA1 = sa >> 8; |
73 | 71 | R_HDMA2 = sa & 0xF0; | |
74 | /* Perform GDMA */ | 72 | R_HDMA3 = 0x1F & (da >> 8); |
75 | sa = ((addr)R_HDMA1 << 8) | (R_HDMA2&0xf0); | 73 | R_HDMA4 = da & 0xF0; |
76 | da = 0x8000 | ((int)(R_HDMA3&0x1f) << 8) | (R_HDMA4&0xf0); | 74 | R_HDMA5--; |
77 | cnt = ((int)c)+1; | 75 | hw.hdma--; |
78 | /* FIXME - this should use cpu time! */ | ||
79 | /*cpu_timers(102 * cnt);*/ | ||
80 | cnt <<= 4; | ||
81 | while (cnt--) | ||
82 | writeb(da++, readb(sa++)); | ||
83 | R_HDMA1 = sa >> 8; | ||
84 | R_HDMA2 = sa & 0xF0; | ||
85 | R_HDMA3 = 0x1F & (da >> 8); | ||
86 | R_HDMA4 = da & 0xF0; | ||
87 | R_HDMA5 = 0xFF; | ||
88 | } | 76 | } |
89 | 77 | ||
90 | 78 | void hw_hdma_cmd(byte c) | |
91 | void hw_hdma(void) | ||
92 | { | 79 | { |
93 | int cnt; | 80 | int cnt; |
94 | addr sa; | 81 | addr sa; |
95 | int da; | 82 | int da; |
96 | 83 | ||
97 | sa = ((addr)R_HDMA1 << 8) | (R_HDMA2&0xf0); | 84 | /* Begin or cancel HDMA */ |
98 | da = 0x8000 | ((int)(R_HDMA3&0x1f) << 8) | (R_HDMA4&0xf0); | 85 | if ((hw.hdma|c) & 0x80) |
99 | cnt = 16; | 86 | { |
100 | while (cnt--) | 87 | hw.hdma = c; |
101 | writeb(da++, readb(sa++)); | 88 | R_HDMA5 = c & 0x7f; |
102 | R_HDMA1 = sa >> 8; | 89 | if ((R_STAT&0x03) == 0x00) hw_hdma(); |
103 | R_HDMA2 = sa & 0xF0; | 90 | return; |
104 | R_HDMA3 = 0x1F & (da >> 8); | 91 | } |
105 | R_HDMA4 = da & 0xF0; | 92 | |
106 | R_HDMA5--; | 93 | /* Perform GDMA */ |
107 | hw.hdma--; | 94 | sa = ((addr)R_HDMA1 << 8) | (R_HDMA2&0xf0); |
95 | da = 0x8000 | ((int)(R_HDMA3&0x1f) << 8) | (R_HDMA4&0xf0); | ||
96 | cnt = ((int)c)+1; | ||
97 | /* FIXME - this should use cpu time! */ | ||
98 | /*cpu_timers(102 * cnt);*/ | ||
99 | cpu_timers((460>>cpu.speed)+cnt*16); /*dalias*/ | ||
100 | /*cpu_timers(228 + (16*cnt));*/ /* this should be right according to no$ */ | ||
101 | cnt <<= 4; | ||
102 | while (cnt--) | ||
103 | writeb(da++, readb(sa++)); | ||
104 | R_HDMA1 = sa >> 8; | ||
105 | R_HDMA2 = sa & 0xF0; | ||
106 | R_HDMA3 = 0x1F & (da >> 8); | ||
107 | R_HDMA4 = da & 0xF0; | ||
108 | R_HDMA5 = 0xFF; | ||
108 | } | 109 | } |
109 | 110 | ||
110 | 111 | ||
@@ -116,20 +117,20 @@ void hw_hdma(void) | |||
116 | 117 | ||
117 | void pad_refresh() | 118 | void pad_refresh() |
118 | { | 119 | { |
119 | byte oldp1; | 120 | byte oldp1; |
120 | oldp1 = R_P1; | 121 | oldp1 = R_P1; |
121 | R_P1 &= 0x30; | 122 | R_P1 &= 0x30; |
122 | R_P1 |= 0xc0; | 123 | R_P1 |= 0xc0; |
123 | if (!(R_P1 & 0x10)) | 124 | if (!(R_P1 & 0x10)) |
124 | R_P1 |= (hw.pad & 0x0F); | 125 | R_P1 |= (hw.pad & 0x0F); |
125 | if (!(R_P1 & 0x20)) | 126 | if (!(R_P1 & 0x20)) |
126 | R_P1 |= (hw.pad >> 4); | 127 | R_P1 |= (hw.pad >> 4); |
127 | R_P1 ^= 0x0F; | 128 | R_P1 ^= 0x0F; |
128 | if (oldp1 & ~R_P1 & 0x0F) | 129 | if (oldp1 & ~R_P1 & 0x0F) |
129 | { | 130 | { |
130 | hw_interrupt(IF_PAD, IF_PAD); | 131 | hw_interrupt(IF_PAD, IF_PAD); |
131 | hw_interrupt(0, IF_PAD); | 132 | hw_interrupt(0, IF_PAD); |
132 | } | 133 | } |
133 | } | 134 | } |
134 | 135 | ||
135 | 136 | ||
@@ -140,44 +141,37 @@ void pad_refresh() | |||
140 | 141 | ||
141 | void pad_press(byte k) | 142 | void pad_press(byte k) |
142 | { | 143 | { |
143 | if (hw.pad & k) | 144 | if (hw.pad & k) |
144 | return; | 145 | return; |
145 | hw.pad |= k; | 146 | hw.pad |= k; |
146 | pad_refresh(); | 147 | pad_refresh(); |
147 | } | 148 | } |
148 | 149 | ||
149 | void pad_release(byte k) | 150 | void pad_release(byte k) |
150 | { | 151 | { |
151 | if (!(hw.pad & k)) | 152 | if (!(hw.pad & k)) |
152 | return; | 153 | return; |
153 | hw.pad &= ~k; | 154 | hw.pad &= ~k; |
154 | pad_refresh(); | 155 | pad_refresh(); |
155 | } | 156 | } |
156 | 157 | ||
157 | void pad_set(byte k, int st) | 158 | void pad_set(byte k, int st) |
158 | { | 159 | { |
159 | st ? pad_press(k) : pad_release(k); | 160 | st ? pad_press(k) : pad_release(k); |
160 | } | 161 | } |
161 | 162 | ||
162 | void hw_reset() | 163 | void hw_reset() |
163 | { | 164 | { |
164 | hw.ilines = hw.pad = 0; | 165 | hw.ilines = hw.pad = 0; |
165 | 166 | ||
166 | memset(ram.hi, 0, sizeof ram.hi); | 167 | memset(ram.hi, 0, sizeof ram.hi); |
167 | 168 | ||
168 | R_P1 = 0xFF; | 169 | R_P1 = 0xFF; |
169 | R_LCDC = 0x91; | 170 | R_LCDC = 0x91; |
170 | R_BGP = 0xFC; | 171 | R_BGP = 0xFC; |
171 | R_OBP0 = 0xFF; | 172 | R_OBP0 = 0xFF; |
172 | R_OBP1 = 0xFF; | 173 | R_OBP1 = 0xFF; |
173 | R_SVBK = 0x01; | 174 | R_SVBK = 0x01; |
174 | R_HDMA5 = 0xFF; | 175 | R_HDMA5 = 0xFF; |
175 | R_VBK = 0xFE; | 176 | R_VBK = 0xFE; |
176 | } | 177 | } |
177 | |||
178 | |||
179 | |||
180 | |||
181 | |||
182 | |||
183 | |||
diff --git a/apps/plugins/rockboy/hw.h b/apps/plugins/rockboy/hw.h index f1e632abdb..297eba30fe 100644 --- a/apps/plugins/rockboy/hw.h +++ b/apps/plugins/rockboy/hw.h | |||
@@ -25,10 +25,10 @@ | |||
25 | 25 | ||
26 | struct hw | 26 | struct hw |
27 | { | 27 | { |
28 | byte ilines; | 28 | byte ilines; |
29 | byte pad; | 29 | byte pad; |
30 | int hdma; | 30 | int hdma; |
31 | int cgb,gba; | 31 | int cgb; |
32 | }; | 32 | }; |
33 | 33 | ||
34 | 34 | ||
diff --git a/apps/plugins/rockboy/inflate.c b/apps/plugins/rockboy/inflate.c deleted file mode 100644 index 6818749187..0000000000 --- a/apps/plugins/rockboy/inflate.c +++ /dev/null | |||
@@ -1,514 +0,0 @@ | |||
1 | |||
2 | /* Slightly modified from its original form so as not to exit the | ||
3 | * program on errors. The resulting file remains in the public | ||
4 | * domain for all to use. */ | ||
5 | |||
6 | /* --- GZIP file format uncompression routines --- */ | ||
7 | |||
8 | /* The following routines (notably the unzip()) function below | ||
9 | * uncompress gzipped data. They are terribly slow at the task, but | ||
10 | * it is presumed that they work reasonably well. They don't do any | ||
11 | * error checking, but they're probably not too vulnerable to buggy | ||
12 | * data either. Another important limitation (but it would be pretty | ||
13 | * easy to get around) is that the data must reside in memory, it is | ||
14 | * not read as a stream. They have been very little tested. Anyway, | ||
15 | * whatever these functions are good for, I put them in the public | ||
16 | * domain. -- David Madore <david.madore@ens.fr> 1999/11/21 */ | ||
17 | |||
18 | #include "rockmacros.h" | ||
19 | |||
20 | static unsigned int | ||
21 | peek_bits (const unsigned char *data, long p, int q) | ||
22 | /* Read q bits starting from bit p from the data pointed to by | ||
23 | * data. Data is in little-endian format. */ | ||
24 | { | ||
25 | unsigned int answer; | ||
26 | int cnt; /* Number of bits already placed in answer */ | ||
27 | char ob, lb; /* Offset and length of bit field within current byte */ | ||
28 | |||
29 | answer = 0; | ||
30 | for ( cnt=0 ; cnt<q ; /* cnt updated in body */ ) | ||
31 | { | ||
32 | ob = (p+cnt)%8; | ||
33 | lb = 8-ob; | ||
34 | if ( cnt+lb > q ) | ||
35 | lb = q-cnt; | ||
36 | answer |= ((unsigned int)((data[(p+cnt)/8]>>ob)&((1U<<lb)-1)))<<cnt; | ||
37 | cnt += lb; | ||
38 | } | ||
39 | return answer; | ||
40 | } | ||
41 | |||
42 | static unsigned int | ||
43 | read_bits (const unsigned char *data, long *p, int q) | ||
44 | /* Read q bits as per peek_bits(), but also increase p by q. */ | ||
45 | { | ||
46 | unsigned int answer; | ||
47 | |||
48 | answer = peek_bits (data, *p, q); | ||
49 | *p += q; | ||
50 | return answer; | ||
51 | } | ||
52 | |||
53 | static void | ||
54 | make_code_table (const char size_table[], int table_length, | ||
55 | unsigned int code_table[], int maxbits) | ||
56 | /* Make a code table from a length table. See rfc1951, section | ||
57 | * 3.2.2, for details on what this means. The size_table | ||
58 | * contains the length of the Huffman codes for each letter, and | ||
59 | * the code_table receives the computed codes themselves. | ||
60 | * table_length is the size of the tables (alphabet length) and | ||
61 | * maxbits is the maximal allowed code length. */ | ||
62 | { | ||
63 | int i, j; | ||
64 | unsigned int code; | ||
65 | |||
66 | code = 0; | ||
67 | for ( i=1 ; i<=maxbits ; i++ ) | ||
68 | { | ||
69 | for ( j=0 ; j<table_length ; j++ ) | ||
70 | { | ||
71 | if ( size_table[j]==i ) | ||
72 | code_table[j] = code++; | ||
73 | } | ||
74 | code <<= 1; | ||
75 | } | ||
76 | } | ||
77 | |||
78 | static int | ||
79 | decode_one (const unsigned char *data, long *p, | ||
80 | const char size_table[], int table_length, | ||
81 | const unsigned int code_table[], int maxbits) | ||
82 | /* Decode one alphabet letter from the data, starting at bit p | ||
83 | * (which will be increased by the appropriate amount) using | ||
84 | * size_table and code_table to decipher the Huffman encoding. */ | ||
85 | { | ||
86 | unsigned int code; | ||
87 | int i, j; | ||
88 | |||
89 | code = 0; | ||
90 | /* Read as many bits as are likely to be necessary - backward, of | ||
91 | * course. */ | ||
92 | for ( i=0 ; i<maxbits ; i++ ) | ||
93 | code = (code<<1) + peek_bits (data, (*p)+i, 1); | ||
94 | /* Now examine each symbol of the table to find one that matches the | ||
95 | * first bits of the code read. */ | ||
96 | for ( j=0 ; j<table_length ; j++ ) | ||
97 | { | ||
98 | if ( size_table[j] | ||
99 | && ( (code>>(maxbits-size_table[j])) == code_table[j] ) ) | ||
100 | { | ||
101 | *p += size_table[j]; | ||
102 | return j; | ||
103 | } | ||
104 | } | ||
105 | return -1; | ||
106 | } | ||
107 | |||
108 | /* I don't know what these should be. The rfc1951 doesn't seem to say | ||
109 | * (it only mentions them in the last paragraph of section 3.2.1). 15 | ||
110 | * is almost certainly safe, and it is the largest I can put given the | ||
111 | * constraints on the size of integers in the C standard. */ | ||
112 | #define CLEN_MAXBITS 15 | ||
113 | #define HLIT_MAXBITS 15 | ||
114 | #define HDIST_MAXBITS 15 | ||
115 | |||
116 | /* The magical table sizes... */ | ||
117 | #define CLEN_TSIZE 19 | ||
118 | #define HLIT_TSIZE 288 | ||
119 | #define HDIST_TSIZE 30 | ||
120 | |||
121 | static int | ||
122 | get_tables (const unsigned char *data, long *p, | ||
123 | char hlit_size_table[HLIT_TSIZE], | ||
124 | unsigned int hlit_code_table[HLIT_TSIZE], | ||
125 | char hdist_size_table[HDIST_TSIZE], | ||
126 | unsigned int hdist_code_table[HDIST_TSIZE]) | ||
127 | /* Fill the Huffman tables (first the code lengths table, and | ||
128 | * then, using it, the literal/length table and the distance | ||
129 | * table). See section 3.2.7 of rfc1951 for details. */ | ||
130 | { | ||
131 | char hlit, hdist, hclen; | ||
132 | const int clen_weird_tangle[CLEN_TSIZE] | ||
133 | = { 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 }; | ||
134 | char clen_size_table[CLEN_TSIZE]; | ||
135 | unsigned int clen_code_table[CLEN_TSIZE]; | ||
136 | int j; | ||
137 | unsigned int b; | ||
138 | int remainder; /* See note at end of section 3.2.7 of rfc1951. */ | ||
139 | char rem_val; | ||
140 | |||
141 | hlit = read_bits (data, p, 5); | ||
142 | hdist = read_bits (data, p, 5); | ||
143 | hclen = read_bits (data, p, 4); | ||
144 | for ( j=0 ; j<4+hclen ; j++ ) | ||
145 | clen_size_table[clen_weird_tangle[j]] | ||
146 | = read_bits (data, p, 3); | ||
147 | for ( ; j<CLEN_TSIZE ; j++ ) | ||
148 | clen_size_table[clen_weird_tangle[j]] = 0; | ||
149 | make_code_table (clen_size_table, CLEN_TSIZE, | ||
150 | clen_code_table, CLEN_MAXBITS); | ||
151 | remainder = 0; | ||
152 | rem_val = 0; | ||
153 | for ( j=0 ; j<257+hlit ; j++ ) | ||
154 | { | ||
155 | b = decode_one (data, p, clen_size_table, CLEN_TSIZE, | ||
156 | clen_code_table, CLEN_MAXBITS); | ||
157 | if ( b<0 ) return -1; | ||
158 | if ( b<16 ) | ||
159 | hlit_size_table[j] = b; | ||
160 | else if ( b == 16 ) | ||
161 | { | ||
162 | int k, l; | ||
163 | |||
164 | k = read_bits (data, p, 2); | ||
165 | for ( l=0 ; l<k+3 && j+l<257+hlit ; l++ ) | ||
166 | hlit_size_table[j+l] = hlit_size_table[j-1]; | ||
167 | j += l-1; | ||
168 | remainder = k+3-l; /* THIS IS SO UGLY! */ | ||
169 | rem_val = hlit_size_table[j-1]; | ||
170 | } | ||
171 | else if ( b == 17 ) | ||
172 | { | ||
173 | int k, l; | ||
174 | |||
175 | k = read_bits (data, p, 3); | ||
176 | for ( l=0 ; l<k+3 && j+l<257+hlit ; l++ ) | ||
177 | hlit_size_table[j+l] = 0; | ||
178 | j += l-1; | ||
179 | remainder = k+3-l; | ||
180 | rem_val = 0; | ||
181 | } | ||
182 | else if ( b == 18 ) | ||
183 | { | ||
184 | int k, l; | ||
185 | |||
186 | k = read_bits (data, p, 7); | ||
187 | for ( l=0 ; l<k+11 && j+l<257+hlit ; l++ ) | ||
188 | hlit_size_table[j+l] = 0; | ||
189 | j += l-1; | ||
190 | remainder = k+11-l; | ||
191 | rem_val = 0; | ||
192 | } | ||
193 | } | ||
194 | for ( ; j<HLIT_TSIZE ; j++ ) | ||
195 | hlit_size_table[j] = 0; | ||
196 | make_code_table (hlit_size_table, HLIT_TSIZE, | ||
197 | hlit_code_table, HLIT_MAXBITS); | ||
198 | for ( j=0 ; j<remainder ; j++ ) | ||
199 | hdist_size_table[j] = rem_val; | ||
200 | for ( ; j<1+hdist ; j++ ) | ||
201 | /* Can you spell: ``copy-paste''? */ | ||
202 | { | ||
203 | b = decode_one (data, p, clen_size_table, CLEN_TSIZE, | ||
204 | clen_code_table, CLEN_MAXBITS); | ||
205 | if ( b<0 ) return -1; | ||
206 | if ( b<16 ) | ||
207 | hdist_size_table[j] = b; | ||
208 | else if ( b == 16 ) | ||
209 | { | ||
210 | int k, l; | ||
211 | |||
212 | k = read_bits (data, p, 2); | ||
213 | for ( l=0 ; l<k+3 && j+l<1+hdist ; l++ ) | ||
214 | hdist_size_table[j+l] = hdist_size_table[j-1]; | ||
215 | j += l-1; | ||
216 | } | ||
217 | else if ( b == 17 ) | ||
218 | { | ||
219 | int k, l; | ||
220 | |||
221 | k = read_bits (data, p, 3); | ||
222 | for ( l=0 ; l<k+3 && j+l<1+hdist ; l++ ) | ||
223 | hdist_size_table[j+l] = 0; | ||
224 | j += l-1; | ||
225 | } | ||
226 | else if ( b == 18 ) | ||
227 | { | ||
228 | int k, l; | ||
229 | |||
230 | k = read_bits (data, p, 7); | ||
231 | for ( l=0 ; l<k+11 && j+l<1+hdist ; l++ ) | ||
232 | hdist_size_table[j+l] = 0; | ||
233 | j += l-1; | ||
234 | } | ||
235 | } | ||
236 | for ( ; j<HDIST_TSIZE ; j++ ) | ||
237 | hdist_size_table[j] = 0; | ||
238 | make_code_table (hdist_size_table, HDIST_TSIZE, | ||
239 | hdist_code_table, HDIST_MAXBITS); | ||
240 | return 0; | ||
241 | } | ||
242 | |||
243 | /* The (circular) output buffer. This lets us track | ||
244 | * backreferences. */ | ||
245 | |||
246 | /* Minimal buffer size. Also the only useful value. */ | ||
247 | #define BUFFER_SIZE 32768 | ||
248 | |||
249 | /* Pointer to the character to be added to the buffer */ | ||
250 | static unsigned int buffer_ptr = 0; | ||
251 | |||
252 | /* The buffer itself */ | ||
253 | static unsigned char buffer[BUFFER_SIZE]; | ||
254 | |||
255 | static void | ||
256 | pushout (unsigned char ch) | ||
257 | /* Store one byte in the output buffer so it may be retrieved if | ||
258 | * it is referenced again. */ | ||
259 | { | ||
260 | buffer[buffer_ptr++] = ch; | ||
261 | buffer_ptr %= BUFFER_SIZE; | ||
262 | } | ||
263 | |||
264 | static unsigned char | ||
265 | pushin (unsigned int dist) | ||
266 | /* Retrieve one byte, dist bytes away, from the output buffer. */ | ||
267 | { | ||
268 | return buffer[(buffer_ptr+(BUFFER_SIZE-dist))%BUFFER_SIZE]; | ||
269 | } | ||
270 | |||
271 | static int | ||
272 | get_data (const unsigned char *data, long *p, | ||
273 | const char hlit_size_table[HLIT_TSIZE], | ||
274 | const unsigned int hlit_code_table[HLIT_TSIZE], | ||
275 | const char hdist_size_table[HDIST_TSIZE], | ||
276 | const unsigned int hdist_code_table[HDIST_TSIZE], | ||
277 | void (* callback) (unsigned char d)) | ||
278 | /* Do the actual uncompressing. Call callback on each character | ||
279 | * uncompressed. */ | ||
280 | { | ||
281 | unsigned int b; | ||
282 | |||
283 | while ( 1 ) { | ||
284 | b = decode_one (data, p, hlit_size_table, HLIT_TSIZE, | ||
285 | hlit_code_table, HLIT_MAXBITS); | ||
286 | if ( b<0 ) return -1; | ||
287 | if ( b < 256 ) | ||
288 | /* Literal */ | ||
289 | { | ||
290 | pushout ((unsigned char) b); | ||
291 | callback ((unsigned char) b); | ||
292 | } | ||
293 | else if ( b == 256 ) | ||
294 | /* End of block */ | ||
295 | return 0; | ||
296 | else if ( b >= 257 ) | ||
297 | /* Back reference */ | ||
298 | { | ||
299 | unsigned int bb; | ||
300 | unsigned int length, dist; | ||
301 | unsigned int l; | ||
302 | |||
303 | switch ( b ) | ||
304 | { | ||
305 | case 257: length = 3; break; | ||
306 | case 258: length = 4; break; | ||
307 | case 259: length = 5; break; | ||
308 | case 260: length = 6; break; | ||
309 | case 261: length = 7; break; | ||
310 | case 262: length = 8; break; | ||
311 | case 263: length = 9; break; | ||
312 | case 264: length = 10; break; | ||
313 | case 265: length = 11 + read_bits (data, p, 1); break; | ||
314 | case 266: length = 13 + read_bits (data, p, 1); break; | ||
315 | case 267: length = 15 + read_bits (data, p, 1); break; | ||
316 | case 268: length = 17 + read_bits (data, p, 1); break; | ||
317 | case 269: length = 19 + read_bits (data, p, 2); break; | ||
318 | case 270: length = 23 + read_bits (data, p, 2); break; | ||
319 | case 271: length = 27 + read_bits (data, p, 2); break; | ||
320 | case 272: length = 31 + read_bits (data, p, 2); break; | ||
321 | case 273: length = 35 + read_bits (data, p, 3); break; | ||
322 | case 274: length = 43 + read_bits (data, p, 3); break; | ||
323 | case 275: length = 51 + read_bits (data, p, 3); break; | ||
324 | case 276: length = 59 + read_bits (data, p, 3); break; | ||
325 | case 277: length = 67 + read_bits (data, p, 4); break; | ||
326 | case 278: length = 83 + read_bits (data, p, 4); break; | ||
327 | case 279: length = 99 + read_bits (data, p, 4); break; | ||
328 | case 280: length = 115 + read_bits (data, p, 4); break; | ||
329 | case 281: length = 131 + read_bits (data, p, 5); break; | ||
330 | case 282: length = 163 + read_bits (data, p, 5); break; | ||
331 | case 283: length = 195 + read_bits (data, p, 5); break; | ||
332 | case 284: length = 227 + read_bits (data, p, 5); break; | ||
333 | case 285: length = 258; break; | ||
334 | default: | ||
335 | return -1; | ||
336 | } | ||
337 | bb = decode_one (data, p, hdist_size_table, HDIST_TSIZE, | ||
338 | hdist_code_table, HDIST_MAXBITS); | ||
339 | switch ( bb ) | ||
340 | { | ||
341 | case 0: dist = 1; break; | ||
342 | case 1: dist = 2; break; | ||
343 | case 2: dist = 3; break; | ||
344 | case 3: dist = 4; break; | ||
345 | case 4: dist = 5 + read_bits (data, p, 1); break; | ||
346 | case 5: dist = 7 + read_bits (data, p, 1); break; | ||
347 | case 6: dist = 9 + read_bits (data, p, 2); break; | ||
348 | case 7: dist = 13 + read_bits (data, p, 2); break; | ||
349 | case 8: dist = 17 + read_bits (data, p, 3); break; | ||
350 | case 9: dist = 25 + read_bits (data, p, 3); break; | ||
351 | case 10: dist = 33 + read_bits (data, p, 4); break; | ||
352 | case 11: dist = 49 + read_bits (data, p, 4); break; | ||
353 | case 12: dist = 65 + read_bits (data, p, 5); break; | ||
354 | case 13: dist = 97 + read_bits (data, p, 5); break; | ||
355 | case 14: dist = 129 + read_bits (data, p, 6); break; | ||
356 | case 15: dist = 193 + read_bits (data, p, 6); break; | ||
357 | case 16: dist = 257 + read_bits (data, p, 7); break; | ||
358 | case 17: dist = 385 + read_bits (data, p, 7); break; | ||
359 | case 18: dist = 513 + read_bits (data, p, 8); break; | ||
360 | case 19: dist = 769 + read_bits (data, p, 8); break; | ||
361 | case 20: dist = 1025 + read_bits (data, p, 9); break; | ||
362 | case 21: dist = 1537 + read_bits (data, p, 9); break; | ||
363 | case 22: dist = 2049 + read_bits (data, p, 10); break; | ||
364 | case 23: dist = 3073 + read_bits (data, p, 10); break; | ||
365 | case 24: dist = 4097 + read_bits (data, p, 11); break; | ||
366 | case 25: dist = 6145 + read_bits (data, p, 11); break; | ||
367 | case 26: dist = 8193 + read_bits (data, p, 12); break; | ||
368 | case 27: dist = 12289 + read_bits (data, p, 12); break; | ||
369 | case 28: dist = 16385 + read_bits (data, p, 13); break; | ||
370 | case 29: dist = 24577 + read_bits (data, p, 13); break; | ||
371 | default: | ||
372 | return -1; | ||
373 | } | ||
374 | for ( l=0 ; l<length ; l++ ) | ||
375 | { | ||
376 | unsigned char ch; | ||
377 | |||
378 | ch = pushin (dist); | ||
379 | pushout (ch); | ||
380 | callback (ch); | ||
381 | } | ||
382 | } | ||
383 | } | ||
384 | return 0; | ||
385 | } | ||
386 | |||
387 | static int | ||
388 | inflate (const unsigned char *data, long *p, | ||
389 | void (* callback) (unsigned char d)) | ||
390 | /* Main uncompression function for the deflate method */ | ||
391 | { | ||
392 | char blast, btype; | ||
393 | char hlit_size_table[HLIT_TSIZE]; | ||
394 | unsigned int hlit_code_table[HLIT_TSIZE]; | ||
395 | char hdist_size_table[HDIST_TSIZE]; | ||
396 | unsigned int hdist_code_table[HDIST_TSIZE]; | ||
397 | |||
398 | again: | ||
399 | blast = read_bits (data, p, 1); | ||
400 | btype = read_bits (data, p, 2); | ||
401 | if ( btype == 1 || btype == 2 ) | ||
402 | { | ||
403 | if ( btype == 2 ) | ||
404 | { | ||
405 | /* Dynamic Huffman tables */ | ||
406 | if (get_tables (data, p, | ||
407 | hlit_size_table, hlit_code_table, | ||
408 | hdist_size_table, hdist_code_table) < 0) return -1; | ||
409 | } | ||
410 | else | ||
411 | /* Fixed Huffman codes */ | ||
412 | { | ||
413 | int j; | ||
414 | |||
415 | for ( j=0 ; j<144 ; j++ ) | ||
416 | hlit_size_table[j] = 8; | ||
417 | for ( ; j<256 ; j++ ) | ||
418 | hlit_size_table[j] = 9; | ||
419 | for ( ; j<280 ; j++ ) | ||
420 | hlit_size_table[j] = 7; | ||
421 | for ( ; j<HLIT_TSIZE ; j++ ) | ||
422 | hlit_size_table[j] = 8; | ||
423 | make_code_table (hlit_size_table, HLIT_TSIZE, | ||
424 | hlit_code_table, HLIT_MAXBITS); | ||
425 | for ( j=0 ; j<HDIST_TSIZE ; j++ ) | ||
426 | hdist_size_table[j] = 5; | ||
427 | make_code_table (hdist_size_table, HDIST_TSIZE, | ||
428 | hdist_code_table, HDIST_MAXBITS); | ||
429 | } | ||
430 | if (get_data (data, p, | ||
431 | hlit_size_table, hlit_code_table, | ||
432 | hdist_size_table, hdist_code_table, | ||
433 | callback) < 0) return -1;; | ||
434 | } | ||
435 | else if ( btype == 0 ) | ||
436 | /* Non compressed block */ | ||
437 | { | ||
438 | unsigned int len, nlen; | ||
439 | unsigned int l; | ||
440 | unsigned char b; | ||
441 | |||
442 | *p = (*p+7)/8; /* Jump to next byte boundary */ | ||
443 | len = read_bits (data, p, 16); | ||
444 | nlen = read_bits (data, p, 16); | ||
445 | for ( l=0 ; l<len ; l++ ) | ||
446 | { | ||
447 | b = read_bits (data, p, 8); | ||
448 | pushout (b); | ||
449 | callback (b); | ||
450 | } | ||
451 | } | ||
452 | else | ||
453 | { | ||
454 | return -1; | ||
455 | } | ||
456 | if ( ! blast ) | ||
457 | goto again; | ||
458 | return 0; | ||
459 | } | ||
460 | |||
461 | int | ||
462 | unzip (const unsigned char *data, long *p, | ||
463 | void (* callback) (unsigned char d)) | ||
464 | /* Uncompress gzipped data. data is a pointer to the data, p is | ||
465 | * a pointer to a long that is initialized to 0 (unless for some | ||
466 | * reason you want to start uncompressing further down the data), | ||
467 | * and callback is a function taking an unsigned char and | ||
468 | * returning void that will be called successively for every | ||
469 | * uncompressed byte. */ | ||
470 | { | ||
471 | unsigned char cm, flg; | ||
472 | |||
473 | if ( read_bits (data, p, 8) != 0x1f | ||
474 | || read_bits (data, p, 8) != 0x8b ) | ||
475 | { | ||
476 | return -1; | ||
477 | } | ||
478 | cm = read_bits (data, p, 8); | ||
479 | if ( cm != 0x8 ) | ||
480 | { | ||
481 | return -1; | ||
482 | } | ||
483 | flg = read_bits (data, p, 8); | ||
484 | if ( flg & 0xe0 ) | ||
485 | /* fprintf (stderr, "Warning: unknown bits are set in flags.\n") */ ; | ||
486 | read_bits (data, p, 32); /* Ignore modification time */ | ||
487 | read_bits (data, p, 8); /* Ignore extra flags */ | ||
488 | read_bits (data, p, 8); /* Ignore OS type */ | ||
489 | if ( flg & 0x4 ) | ||
490 | { | ||
491 | /* Skip over extra data */ | ||
492 | unsigned int xlen; | ||
493 | |||
494 | xlen = read_bits (data, p, 16); | ||
495 | *p += ((long)xlen)*8; | ||
496 | } | ||
497 | if ( flg & 0x8 ) | ||
498 | { | ||
499 | /* Skip over file name */ | ||
500 | while ( read_bits (data, p, 8) ); | ||
501 | } | ||
502 | if ( flg & 0x10 ) | ||
503 | { | ||
504 | /* Skip over comment */ | ||
505 | while ( read_bits (data, p, 8) ); | ||
506 | } | ||
507 | if ( flg & 0x2 ) | ||
508 | /* Ignore CRC16 */ | ||
509 | read_bits (data, p, 16); | ||
510 | return inflate (data, p, callback); | ||
511 | /* CRC32 and ISIZE are at the end. We don't even bother to look at | ||
512 | * them. */ | ||
513 | } | ||
514 | |||
diff --git a/apps/plugins/rockboy/input.h b/apps/plugins/rockboy/input.h index b57404908d..4ee1c9eb40 100644 --- a/apps/plugins/rockboy/input.h +++ b/apps/plugins/rockboy/input.h | |||
@@ -4,19 +4,15 @@ | |||
4 | * Definitions for input device stuff - buttons, keys, etc. | 4 | * Definitions for input device stuff - buttons, keys, etc. |
5 | */ | 5 | */ |
6 | 6 | ||
7 | |||
8 | #define MAX_KEYS 10 | ||
9 | |||
10 | typedef struct event_s | 7 | typedef struct event_s |
11 | { | 8 | { |
12 | int type; | 9 | int type; |
13 | int code; | 10 | int code; |
14 | } event_t; | 11 | } event_t; |
15 | 12 | ||
16 | #define EV_NONE 0 | 13 | #define EV_NONE 0 |
17 | #define EV_PRESS 1 | 14 | #define EV_PRESS 1 |
18 | #define EV_RELEASE 2 | 15 | #define EV_RELEASE 2 |
19 | #define EV_REPEAT 3 | ||
20 | 16 | ||
21 | int ev_postevent(event_t *ev) ICODE_ATTR; | 17 | int ev_postevent(event_t *ev) ICODE_ATTR; |
22 | int ev_getevent(event_t *ev) ICODE_ATTR; | 18 | int ev_getevent(event_t *ev) ICODE_ATTR; |
diff --git a/apps/plugins/rockboy/lcd-gb.h b/apps/plugins/rockboy/lcd-gb.h index aafeaec165..91f2487462 100644 --- a/apps/plugins/rockboy/lcd-gb.h +++ b/apps/plugins/rockboy/lcd-gb.h | |||
@@ -7,15 +7,15 @@ | |||
7 | 7 | ||
8 | struct vissprite | 8 | struct vissprite |
9 | { | 9 | { |
10 | byte *buf; | 10 | byte *buf; |
11 | int x; | 11 | int x; |
12 | byte pal, pri, pad[6]; | 12 | byte pal, pri, pad[6]; |
13 | }; | 13 | }; |
14 | 14 | ||
15 | struct scan | 15 | struct scan |
16 | { | 16 | { |
17 | int bg[64]; | 17 | int bg[64]; |
18 | int wnd[64]; | 18 | int wnd[64]; |
19 | #if LCD_DEPTH == 1 | 19 | #if LCD_DEPTH == 1 |
20 | byte buf[8][256]; | 20 | byte buf[8][256]; |
21 | #elif LCD_DEPTH == 2 | 21 | #elif LCD_DEPTH == 2 |
@@ -23,31 +23,29 @@ struct scan | |||
23 | #elif LCD_DEPTH > 4 | 23 | #elif LCD_DEPTH > 4 |
24 | byte buf[256]; | 24 | byte buf[256]; |
25 | #endif | 25 | #endif |
26 | byte pal1[128]; | 26 | un16 pal[64]; |
27 | un16 pal2[64]; | 27 | byte pri[256]; |
28 | un32 pal4[64]; | 28 | struct vissprite vs[16]; |
29 | byte pri[256]; | 29 | int ns, l, x, y, s, t, u, v, wx, wy, wt, wv; |
30 | struct vissprite vs[16]; | ||
31 | int ns, l, x, y, s, t, u, v, wx, wy, wt, wv; | ||
32 | }; | 30 | }; |
33 | 31 | ||
34 | struct obj | 32 | struct obj |
35 | { | 33 | { |
36 | byte y; | 34 | byte y; |
37 | byte x; | 35 | byte x; |
38 | byte pat; | 36 | byte pat; |
39 | byte flags; | 37 | byte flags; |
40 | }; | 38 | }; |
41 | 39 | ||
42 | struct lcd | 40 | struct lcd |
43 | { | 41 | { |
44 | byte vbank[2][8192]; | 42 | byte vbank[2][8192]; |
45 | union | 43 | union |
46 | { | 44 | { |
47 | byte mem[256]; | 45 | byte mem[256]; |
48 | struct obj obj[40]; | 46 | struct obj obj[40]; |
49 | } oam; | 47 | } oam; |
50 | byte pal[128]; | 48 | byte pal[128]; |
51 | }; | 49 | }; |
52 | 50 | ||
53 | extern struct lcd lcd; | 51 | extern struct lcd lcd; |
@@ -60,14 +58,13 @@ void bg_scan(void) ICODE_ATTR; | |||
60 | void wnd_scan(void) ICODE_ATTR; | 58 | void wnd_scan(void) ICODE_ATTR; |
61 | void bg_scan_pri(void) ICODE_ATTR; | 59 | void bg_scan_pri(void) ICODE_ATTR; |
62 | void wnd_scan_pri(void) ICODE_ATTR; | 60 | void wnd_scan_pri(void) ICODE_ATTR; |
63 | void spr_count(void); | ||
64 | void spr_enum(void) ICODE_ATTR; | 61 | void spr_enum(void) ICODE_ATTR; |
65 | void spr_scan(void) ICODE_ATTR; | 62 | void spr_scan(void) ICODE_ATTR; |
66 | void lcd_begin(void) ICODE_ATTR; | 63 | void lcd_begin(void) ICODE_ATTR; |
67 | void lcd_refreshline(void) ICODE_ATTR; | 64 | void lcd_refreshline(void) ICODE_ATTR; |
68 | void pal_write(int i, byte b) ICODE_ATTR; | 65 | void pal_write(int i, byte b) ICODE_ATTR; |
69 | void pal_write_dmg(int i, int mapnum, byte d) ICODE_ATTR; | 66 | void pal_write_dmg(int i, int mapnum, byte d) ICODE_ATTR; |
70 | void vram_write(int a, byte b) ICODE_ATTR; | 67 | void vram_write(addr a, byte b) ICODE_ATTR; |
71 | void vram_dirty(void) ICODE_ATTR; | 68 | void vram_dirty(void) ICODE_ATTR; |
72 | void pal_dirty(void) ICODE_ATTR; | 69 | void pal_dirty(void) ICODE_ATTR; |
73 | void lcd_reset(void); | 70 | void lcd_reset(void); |
diff --git a/apps/plugins/rockboy/lcd.c b/apps/plugins/rockboy/lcd.c index 1b285ec1b9..05a6a74068 100644 --- a/apps/plugins/rockboy/lcd.c +++ b/apps/plugins/rockboy/lcd.c | |||
@@ -4,9 +4,8 @@ | |||
4 | #include "hw.h" | 4 | #include "hw.h" |
5 | #include "mem.h" | 5 | #include "mem.h" |
6 | #include "lcd-gb.h" | 6 | #include "lcd-gb.h" |
7 | #include "rc.h" | ||
8 | #include "fb.h" | 7 | #include "fb.h" |
9 | #include "palette.h" | 8 | #include "palette-presets.h" |
10 | #ifdef USE_ASM | 9 | #ifdef USE_ASM |
11 | #include "asm.h" | 10 | #include "asm.h" |
12 | #endif | 11 | #endif |
@@ -26,9 +25,7 @@ struct scan scan IBSS_ATTR; | |||
26 | 25 | ||
27 | #define PRI (scan.pri) | 26 | #define PRI (scan.pri) |
28 | 27 | ||
29 | #define PAL1 (scan.pal1) | 28 | #define PAL (scan.pal) |
30 | #define PAL2 (scan.pal2) | ||
31 | #define PAL4 (scan.pal4) | ||
32 | 29 | ||
33 | #define VS (scan.vs) /* vissprites */ | 30 | #define VS (scan.vs) /* vissprites */ |
34 | #define NS (scan.ns) | 31 | #define NS (scan.ns) |
@@ -53,53 +50,14 @@ byte patpix[4096][8][8] | |||
53 | byte patdirty[1024]; | 50 | byte patdirty[1024]; |
54 | byte anydirty; | 51 | byte anydirty; |
55 | 52 | ||
56 | // static int scale = 1; | ||
57 | |||
58 | static int rgb332; | ||
59 | |||
60 | static int sprsort = 1; | ||
61 | static int sprdebug; | ||
62 | static int insync=0; | ||
63 | #if LCD_DEPTH < 16 | 53 | #if LCD_DEPTH < 16 |
64 | static int scanline_ind=0; | 54 | static int scanline_ind=0; |
65 | #endif | 55 | #endif |
66 | 56 | ||
67 | #define DEF_PAL { 0x98d0e0, 0x68a0b0, 0x60707C, 0x2C3C3C } | 57 | static int dmg_pal[4][4]; |
68 | |||
69 | static int dmg_pal[4][4] = { DEF_PAL, DEF_PAL, DEF_PAL, DEF_PAL }; | ||
70 | |||
71 | static int usefilter, filterdmg; | ||
72 | static int filter[3][4] = { | ||
73 | { 195, 25, 0, 35 }, | ||
74 | { 25, 170, 25, 35 }, | ||
75 | { 25, 60, 125, 40 } | ||
76 | }; | ||
77 | |||
78 | rcvar_t lcd_exports[] = | ||
79 | { | ||
80 | RCV_BOOL("rgb332", &rgb332), | ||
81 | RCV_VECTOR("dmg_bgp", dmg_pal[0], 4), | ||
82 | RCV_VECTOR("dmg_wndp", dmg_pal[1], 4), | ||
83 | RCV_VECTOR("dmg_obp0", dmg_pal[2], 4), | ||
84 | RCV_VECTOR("dmg_obp1", dmg_pal[3], 4), | ||
85 | RCV_BOOL("sprsort", &sprsort), | ||
86 | RCV_BOOL("sprdebug", &sprdebug), | ||
87 | RCV_BOOL("colorfilter", &usefilter), | ||
88 | RCV_BOOL("filterdmg", &filterdmg), | ||
89 | RCV_VECTOR("red", filter[0], 4), | ||
90 | RCV_VECTOR("green", filter[1], 4), | ||
91 | RCV_VECTOR("blue", filter[2], 4), | ||
92 | RCV_END | ||
93 | }; | ||
94 | 58 | ||
95 | fb_data *vdest; | 59 | fb_data *vdest; |
96 | 60 | ||
97 | #ifdef ALLOW_UNALIGNED_IO /* long long is ok since this is i386-only anyway? */ | ||
98 | #define MEMCPY8(d, s) ((*(long long *)(d)) = (*(long long *)(s))) | ||
99 | #else | ||
100 | #define MEMCPY8(d, s) memcpy((d), (s), 8) | ||
101 | #endif | ||
102 | |||
103 | #ifndef ASM_UPDATEPATPIX | 61 | #ifndef ASM_UPDATEPATPIX |
104 | void updatepatpix(void) | 62 | void updatepatpix(void) |
105 | { | 63 | { |
@@ -506,9 +464,10 @@ void tilebuf(void) | |||
506 | } | 464 | } |
507 | 465 | ||
508 | 466 | ||
509 | // V = vertical line | 467 | /* V = vertical line |
510 | // WX = WND start (if 0, no need to do anything) -> WY | 468 | * WX = WND start (if 0, no need to do anything) -> WY |
511 | // U = start...something...thingy... 7 at most | 469 | * U = start...something...thingy... 7 at most |
470 | */ | ||
512 | void bg_scan(void) | 471 | void bg_scan(void) |
513 | { | 472 | { |
514 | int cnt; | 473 | int cnt; |
@@ -539,7 +498,7 @@ void bg_scan(void) | |||
539 | ); | 498 | ); |
540 | #else | 499 | #else |
541 | src = patpix[*(tile++)][V]; | 500 | src = patpix[*(tile++)][V]; |
542 | MEMCPY8(dest, src); | 501 | memcpy(dest,src,8); |
543 | dest += 8; | 502 | dest += 8; |
544 | #endif | 503 | #endif |
545 | cnt -= 8; | 504 | cnt -= 8; |
@@ -574,7 +533,7 @@ void wnd_scan(void) | |||
574 | ); | 533 | ); |
575 | #else | 534 | #else |
576 | src = patpix[*(tile++)][WV]; | 535 | src = patpix[*(tile++)][WV]; |
577 | MEMCPY8(dest, src); | 536 | memcpy(dest,src,8); |
578 | dest += 8; | 537 | dest += 8; |
579 | #endif | 538 | #endif |
580 | cnt -= 8; | 539 | cnt -= 8; |
@@ -752,33 +711,12 @@ static void recolor(byte *buf, byte fill, int cnt) | |||
752 | while (cnt--) *(buf++) |= fill; | 711 | while (cnt--) *(buf++) |= fill; |
753 | } | 712 | } |
754 | 713 | ||
755 | void spr_count(void) | ||
756 | { | ||
757 | int i; | ||
758 | struct obj *o; | ||
759 | |||
760 | NS = 0; | ||
761 | if (!(R_LCDC & 0x02)) return; | ||
762 | |||
763 | o = lcd.oam.obj; | ||
764 | |||
765 | for (i = 40; i; i--, o++) | ||
766 | { | ||
767 | if (L >= o->y || L + 16 < o->y) | ||
768 | continue; | ||
769 | if (L + 8 >= o->y && !(R_LCDC & 0x04)) | ||
770 | continue; | ||
771 | if (++NS == 10) break; | ||
772 | } | ||
773 | } | ||
774 | |||
775 | void spr_enum(void) | 714 | void spr_enum(void) |
776 | { | 715 | { |
777 | int i, j; | 716 | int i, j; |
778 | struct obj *o; | 717 | struct obj *o; |
779 | struct vissprite ts[10]; | 718 | struct vissprite ts; |
780 | int v, pat; | 719 | int v, pat; |
781 | int l, x; | ||
782 | 720 | ||
783 | NS = 0; | 721 | NS = 0; |
784 | if (!(R_LCDC & 0x02)) return; | 722 | if (!(R_LCDC & 0x02)) return; |
@@ -818,24 +756,19 @@ void spr_enum(void) | |||
818 | VS[NS].buf = patpix[pat][v]; | 756 | VS[NS].buf = patpix[pat][v]; |
819 | if (++NS == 10) break; | 757 | if (++NS == 10) break; |
820 | } | 758 | } |
821 | if (!sprsort||hw.cgb) return; | 759 | if (hw.cgb) return; |
822 | /* not quite optimal but it finally works! */ | ||
823 | for (i = 0; i < NS; i++) | 760 | for (i = 0; i < NS; i++) |
824 | { | 761 | { |
825 | l = 0; | 762 | for (j = i + 1; j < NS; j++) |
826 | x = VS[0].x; | ||
827 | for (j = 1; j < NS; j++) | ||
828 | { | 763 | { |
829 | if (VS[j].x < x) | 764 | if (VS[i].x > VS[j].x) |
830 | { | 765 | { |
831 | l = j; | 766 | ts = VS[i]; |
832 | x = VS[j].x; | 767 | VS[i] = VS[j]; |
768 | VS[j] = ts; | ||
833 | } | 769 | } |
834 | } | 770 | } |
835 | ts[i] = VS[l]; | ||
836 | VS[l].x = 160; | ||
837 | } | 771 | } |
838 | memcpy(VS, ts, sizeof VS); | ||
839 | } | 772 | } |
840 | 773 | ||
841 | void spr_scan(void) | 774 | void spr_scan(void) |
@@ -854,8 +787,8 @@ void spr_scan(void) | |||
854 | for (; ns; ns--, vs--) | 787 | for (; ns; ns--, vs--) |
855 | { | 788 | { |
856 | x = vs->x; | 789 | x = vs->x; |
857 | if (x >= 160) continue; | 790 | if (x > 159) continue; |
858 | if (x <= -8) continue; | 791 | if (x < -7) continue; |
859 | if (x < 0) | 792 | if (x < 0) |
860 | { | 793 | { |
861 | src = vs->buf - x; | 794 | src = vs->buf - x; |
@@ -891,12 +824,10 @@ void spr_scan(void) | |||
891 | } | 824 | } |
892 | } | 825 | } |
893 | else while (i--) if (src[i]) dest[i] = pal|src[i]; | 826 | else while (i--) if (src[i]) dest[i] = pal|src[i]; |
894 | /* else while (i--) if (src[i]) dest[i] = 31 + ns; */ | ||
895 | } | 827 | } |
896 | // if (sprdebug) for (i = 0; i < NS; i++) BUF[i<<1] = 36; | ||
897 | } | 828 | } |
898 | 829 | ||
899 | // Scaling defines | 830 | /* Scaling defines */ |
900 | #define DX ((LCD_WIDTH<<16) / 160) | 831 | #define DX ((LCD_WIDTH<<16) / 160) |
901 | #define DXI ((160<<16) / LCD_WIDTH) | 832 | #define DXI ((160<<16) / LCD_WIDTH) |
902 | #define DY ((LCD_HEIGHT<<16) / 144) | 833 | #define DY ((LCD_HEIGHT<<16) / 144) |
@@ -904,18 +835,38 @@ void spr_scan(void) | |||
904 | 835 | ||
905 | void lcd_begin(void) | 836 | void lcd_begin(void) |
906 | { | 837 | { |
907 | /* if (fb.indexed) | ||
908 | { | ||
909 | if (rgb332) pal_set332(); | ||
910 | else pal_expire(); | ||
911 | } | ||
912 | */ | ||
913 | 838 | ||
914 | if(options.fullscreen) | 839 | #if (LCD_WIDTH>=160) && (LCD_HEIGHT>=144) |
915 | vdest = fb.ptr; | 840 | #define S1 ((LCD_HEIGHT-144)/2)*LCD_WIDTH + ((LCD_WIDTH-160)/2) |
916 | else | 841 | #define S2 0 |
917 | vdest=fb.ptr+((LCD_HEIGHT-144)/2)*LCD_WIDTH + ((LCD_WIDTH-160)/2); | 842 | |
843 | #elif (LCD_WIDTH>=160) && (LCD_HEIGHT<=144) | ||
844 | #define S1 ((LCD_WIDTH-160)/2) | ||
845 | #define S2 ((LCD_WIDTH-160)/2) | ||
846 | |||
847 | #elif (LCD_WIDTH<=160) && (LCD_HEIGHT>=144) | ||
848 | #define S1 ((LCD_HEIGHT-144)/2)*LCD_WIDTH | ||
849 | #define S2 ((LCD_HEIGHT-144)/2)*LCD_WIDTH | ||
918 | 850 | ||
851 | #else | ||
852 | #define S1 0 | ||
853 | #define S2 0 | ||
854 | #endif | ||
855 | |||
856 | #if (LCD_WIDTH>LCD_HEIGHT) | ||
857 | #define S3 ((LCD_WIDTH-(160*LCD_HEIGHT/144))/2) | ||
858 | #else | ||
859 | #define S3 ((LCD_HEIGHT-(144*LCD_WIDTH/160))/2)*LCD_WIDTH | ||
860 | #endif | ||
861 | |||
862 | set_pal(); | ||
863 | |||
864 | if(options.fullscreen == 0) | ||
865 | vdest=fb.ptr+S1; | ||
866 | else if (options.fullscreen == 1) | ||
867 | vdest=fb.ptr+S2; | ||
868 | else | ||
869 | vdest=fb.ptr+S3; | ||
919 | WY = R_WY; | 870 | WY = R_WY; |
920 | } | 871 | } |
921 | 872 | ||
@@ -930,11 +881,28 @@ void setvidmode(int mode) | |||
930 | { | 881 | { |
931 | switch(mode) | 882 | switch(mode) |
932 | { | 883 | { |
933 | case 1: /* Full screen scale */ | 884 | case 1: |
885 | #if (LCD_WIDTH>=160) && (LCD_HEIGHT>=144) /* Full screen scale */ | ||
934 | SCALEWL=DX; | 886 | SCALEWL=DX; |
935 | SCALEWS=DXI; | 887 | SCALEWS=DXI; |
936 | SCALEHL=DY; | 888 | SCALEHL=DY; |
937 | SCALEHS=DYI; | 889 | SCALEHS=DYI; |
890 | #elif (LCD_WIDTH>=160) && (LCD_HEIGHT<144) /* scale the height */ | ||
891 | SCALEWL=1<<16; | ||
892 | SCALEWS=1<<16; | ||
893 | SCALEHL=DY; | ||
894 | SCALEHS=DYI; | ||
895 | #elif (LCD_WIDTH<160) && (LCD_HEIGHT>=144) /* scale the width */ | ||
896 | SCALEWL=DX; | ||
897 | SCALEWS=DXI; | ||
898 | SCALEHL=1<<16; | ||
899 | SCALEHS=1<<16; | ||
900 | #else | ||
901 | SCALEWL=DX; | ||
902 | SCALEWS=DXI; | ||
903 | SCALEHL=DY; | ||
904 | SCALEHS=DYI; | ||
905 | #endif | ||
938 | break; | 906 | break; |
939 | case 2: /* Maintain Ratio */ | 907 | case 2: /* Maintain Ratio */ |
940 | if (DY<DX) | 908 | if (DY<DX) |
@@ -952,37 +920,26 @@ void setvidmode(int mode) | |||
952 | SCALEHS=DXI; | 920 | SCALEHS=DXI; |
953 | } | 921 | } |
954 | break; | 922 | break; |
955 | default: /* No Scaling (or fullscreen for smaller screens) */ | 923 | default: |
956 | #if LCD_WIDTH>160 | ||
957 | SCALEWL=1<<16; | 924 | SCALEWL=1<<16; |
958 | SCALEWS=1<<16; | 925 | SCALEWS=1<<16; |
959 | SCALEHL=1<<16; | 926 | SCALEHL=1<<16; |
960 | SCALEHS=1<<16; | 927 | SCALEHS=1<<16; |
961 | #else | ||
962 | SCALEWL=DX; | ||
963 | SCALEWS=DXI; | ||
964 | SCALEHL=DY; | ||
965 | SCALEHS=DYI; | ||
966 | #endif | ||
967 | } | 928 | } |
968 | swidth=(160*SCALEWL)>>16; | 929 | swidth=(160*SCALEWL)>>16; |
969 | sremain=LCD_WIDTH-swidth; | 930 | sremain=LCD_WIDTH-swidth; |
970 | } | 931 | } |
971 | 932 | ||
972 | char frameout[30]; | ||
973 | void lcd_refreshline(void) | 933 | void lcd_refreshline(void) |
974 | { | 934 | { |
975 | if(!insync) { | 935 | #ifdef HAVE_LCD_COLOR |
976 | if(R_LY!=0) | 936 | char frameout[30]; |
977 | return; | 937 | #endif |
978 | else | ||
979 | insync=1; | ||
980 | } | ||
981 | 938 | ||
982 | if (!(R_LCDC & 0x80)) | 939 | if (!(R_LCDC & 0x80)) |
983 | return; /* should not happen... */ | 940 | return; /* should not happen... */ |
984 | 941 | ||
985 | #if LCD_HEIGHT < 144 | 942 | #if (LCD_HEIGHT <= 128) && !defined(HAVE_LCD_COLOR) |
986 | if ( (fb.mode==0&&(R_LY >= 128)) || | 943 | if ( (fb.mode==0&&(R_LY >= 128)) || |
987 | (fb.mode==1&&(R_LY < 16)) || | 944 | (fb.mode==1&&(R_LY < 16)) || |
988 | (fb.mode==2&&(R_LY<8||R_LY>=136)) || | 945 | (fb.mode==2&&(R_LY<8||R_LY>=136)) || |
@@ -1046,8 +1003,7 @@ void lcd_refreshline(void) | |||
1046 | vid_update(L-((int)(L/9))); | 1003 | vid_update(L-((int)(L/9))); |
1047 | #else | 1004 | #else |
1048 | { | 1005 | { |
1049 | /* Universial Scaling pulled from PrBoom and modified for rockboy */ | 1006 | /* Universal Scaling pulled from PrBoom and modified for rockboy */ |
1050 | /* Needs some thought for screens smaller than the gameboy though */ | ||
1051 | 1007 | ||
1052 | static int hpt IDATA_ATTR=0x8000; | 1008 | static int hpt IDATA_ATTR=0x8000; |
1053 | 1009 | ||
@@ -1059,9 +1015,24 @@ void lcd_refreshline(void) | |||
1059 | register unsigned int remain=sremain; | 1015 | register unsigned int remain=sremain; |
1060 | while(wcount--) | 1016 | while(wcount--) |
1061 | { | 1017 | { |
1062 | *vdest++ = scan.pal2[scan.buf[srcpt>>16]]; | 1018 | #if LCD_HEIGHT<144 /* cut off the bottom part of the screen that won't fit */ |
1019 | if (options.fullscreen==0 && (hpt>>16)>LCD_HEIGHT) | ||
1020 | break; | ||
1021 | #endif | ||
1022 | |||
1023 | #if LCD_WIDTH<160 /* cut off the right part of the screen that won't fit */ | ||
1024 | if(options.fullscreen==0 && wcount<(160-LCD_WIDTH)) { | ||
1025 | vdest+=wcount; | ||
1026 | wcount = 0; | ||
1027 | } | ||
1028 | #endif | ||
1029 | |||
1030 | *vdest++ = PAL[BUF[srcpt>>16]]; | ||
1063 | srcpt+=SCALEWS; | 1031 | srcpt+=SCALEWS; |
1064 | } | 1032 | } |
1033 | #if LCD_HEIGHT<144 | ||
1034 | if (options.fullscreen!=0 || (hpt>>16)<(LCD_HEIGHT)) | ||
1035 | #endif | ||
1065 | vdest+=remain; | 1036 | vdest+=remain; |
1066 | } | 1037 | } |
1067 | 1038 | ||
@@ -1086,15 +1057,16 @@ void lcd_refreshline(void) | |||
1086 | #endif | 1057 | #endif |
1087 | } | 1058 | } |
1088 | 1059 | ||
1089 | 1060 | void set_pal(void) | |
1090 | 1061 | { | |
1091 | 1062 | memcpy(dmg_pal,palettes[options.pal], sizeof dmg_pal); | |
1092 | 1063 | pal_dirty(); | |
1064 | } | ||
1093 | 1065 | ||
1094 | #if HAVE_LCD_COLOR | 1066 | #if HAVE_LCD_COLOR |
1095 | static void updatepalette(int i) | 1067 | static void updatepalette(int i) |
1096 | { | 1068 | { |
1097 | int c, r, g, b, y, u, v, rr, gg; | 1069 | int c, r, g, b; |
1098 | 1070 | ||
1099 | c = (lcd.pal[i<<1] | ((int)lcd.pal[(i<<1)|1] << 8)) & 0x7FFF; | 1071 | c = (lcd.pal[i<<1] | ((int)lcd.pal[(i<<1)|1] << 8)) & 0x7FFF; |
1100 | r = (c & 0x001F) << 3; | 1072 | r = (c & 0x001F) << 3; |
@@ -1104,38 +1076,6 @@ static void updatepalette(int i) | |||
1104 | g |= (g >> 5); | 1076 | g |= (g >> 5); |
1105 | b |= (b >> 5); | 1077 | b |= (b >> 5); |
1106 | 1078 | ||
1107 | if (usefilter && (filterdmg||hw.cgb)) | ||
1108 | { | ||
1109 | rr = ((r * filter[0][0] + g * filter[0][1] + b * filter[0][2]) >> 8) + filter[0][3]; | ||
1110 | gg = ((r * filter[1][0] + g * filter[1][1] + b * filter[1][2]) >> 8) + filter[1][3]; | ||
1111 | b = ((r * filter[2][0] + g * filter[2][1] + b * filter[2][2]) >> 8) + filter[2][3]; | ||
1112 | r = rr; | ||
1113 | g = gg; | ||
1114 | } | ||
1115 | |||
1116 | if (fb.yuv) | ||
1117 | { | ||
1118 | y = (((r * 263) + (g * 516) + (b * 100)) >> 10) + 16; | ||
1119 | u = (((r * 450) - (g * 377) - (b * 73)) >> 10) + 128; | ||
1120 | v = (((r * -152) - (g * 298) + (b * 450)) >> 10) + 128; | ||
1121 | if (y < 0) y = 0; if (y > 255) y = 255; | ||
1122 | if (u < 0) u = 0; if (u > 255) u = 255; | ||
1123 | if (v < 0) v = 0; if (v > 255) v = 255; | ||
1124 | PAL4[i] = (y<<fb.cc[0].l) | (y<<fb.cc[3].l) | ||
1125 | | (u<<fb.cc[1].l) | (v<<fb.cc[2].l); | ||
1126 | return; | ||
1127 | } | ||
1128 | /* | ||
1129 | if (fb.indexed) | ||
1130 | { | ||
1131 | pal_release(PAL1[i]); | ||
1132 | c = pal_getcolor(c, r, g, b); | ||
1133 | PAL1[i] = c; | ||
1134 | PAL2[i] = (c<<8) | c; | ||
1135 | PAL4[i] = (c<<24) | (c<<16) | (c<<8) | c; | ||
1136 | return; | ||
1137 | }*/ | ||
1138 | |||
1139 | r = (r >> fb.cc[0].r) << fb.cc[0].l; | 1079 | r = (r >> fb.cc[0].r) << fb.cc[0].l; |
1140 | g = (g >> fb.cc[1].r) << fb.cc[1].l; | 1080 | g = (g >> fb.cc[1].r) << fb.cc[1].l; |
1141 | b = (b >> fb.cc[2].r) << fb.cc[2].l; | 1081 | b = (b >> fb.cc[2].r) << fb.cc[2].l; |
@@ -1145,24 +1085,7 @@ static void updatepalette(int i) | |||
1145 | #elif LCD_PIXELFORMAT == RGB565SWAPPED | 1085 | #elif LCD_PIXELFORMAT == RGB565SWAPPED |
1146 | c = swap16(r|g|b); | 1086 | c = swap16(r|g|b); |
1147 | #endif | 1087 | #endif |
1148 | 1088 | PAL[i] = c; | |
1149 | |||
1150 | switch (fb.pelsize) | ||
1151 | { | ||
1152 | case 1: | ||
1153 | PAL1[i] = c; | ||
1154 | PAL2[i] = (c<<8) | c; | ||
1155 | PAL4[i] = (c<<24) | (c<<16) | (c<<8) | c; | ||
1156 | break; | ||
1157 | case 2: | ||
1158 | PAL2[i] = c; | ||
1159 | PAL4[i] = (c<<16) | c; | ||
1160 | break; | ||
1161 | case 3: | ||
1162 | case 4: | ||
1163 | PAL4[i] = c; | ||
1164 | break; | ||
1165 | } | ||
1166 | } | 1089 | } |
1167 | #endif | 1090 | #endif |
1168 | 1091 | ||
@@ -1183,7 +1106,6 @@ void pal_write_dmg(int i, int mapnum, byte d) | |||
1183 | 1106 | ||
1184 | if (hw.cgb) return; | 1107 | if (hw.cgb) return; |
1185 | 1108 | ||
1186 | /* if (mapnum >= 2) d = 0xe4; */ | ||
1187 | for (j = 0; j < 8; j += 2) | 1109 | for (j = 0; j < 8; j += 2) |
1188 | { | 1110 | { |
1189 | c = cmap[(d >> j) & 3]; | 1111 | c = cmap[(d >> j) & 3]; |
@@ -1197,7 +1119,7 @@ void pal_write_dmg(int i, int mapnum, byte d) | |||
1197 | } | 1119 | } |
1198 | } | 1120 | } |
1199 | 1121 | ||
1200 | void vram_write(int a, byte b) | 1122 | void vram_write(addr a, byte b) |
1201 | { | 1123 | { |
1202 | lcd.vbank[R_VBK&1][a] = b; | 1124 | lcd.vbank[R_VBK&1][a] = b; |
1203 | if (a >= 0x1800) return; | 1125 | if (a >= 0x1800) return; |
@@ -1235,7 +1157,6 @@ void lcd_reset(void) | |||
1235 | memset(&lcd, 0, sizeof lcd); | 1157 | memset(&lcd, 0, sizeof lcd); |
1236 | lcd_begin(); | 1158 | lcd_begin(); |
1237 | vram_dirty(); | 1159 | vram_dirty(); |
1238 | pal_dirty(); | ||
1239 | } | 1160 | } |
1240 | 1161 | ||
1241 | 1162 | ||
diff --git a/apps/plugins/rockboy/lcdc.c b/apps/plugins/rockboy/lcdc.c index 3b7894d729..90575bbef8 100644 --- a/apps/plugins/rockboy/lcdc.c +++ b/apps/plugins/rockboy/lcdc.c | |||
@@ -23,32 +23,23 @@ | |||
23 | 23 | ||
24 | void stat_trigger(void) | 24 | void stat_trigger(void) |
25 | { | 25 | { |
26 | static const int condbits[4] = { 0x08, 0x30, 0x20, 0x00 }; | 26 | static const int condbits[4] = { 0x08, 0x10, 0x20, 0x00 }; |
27 | int flag = 0; | 27 | int flag = 0; |
28 | 28 | ||
29 | if ((R_LY < 0x91) && (R_LY == R_LYC)) | 29 | if (R_LY == R_LYC) |
30 | { | 30 | { |
31 | R_STAT |= 0x04; | 31 | R_STAT |= 0x04; |
32 | if (R_STAT & 0x40) flag = IF_STAT; | 32 | if (R_STAT & 0x40) flag = IF_STAT; |
33 | } | 33 | } |
34 | else R_STAT &= ~0x04; | 34 | else R_STAT &= ~0x04; |
35 | 35 | ||
36 | if (R_STAT & condbits[R_STAT&3]) flag = IF_STAT; | 36 | if (R_STAT & condbits[R_STAT&3]) flag = IF_STAT; |
37 | 37 | ||
38 | if (!(R_LCDC & 0x80)) flag = 0; | 38 | if (!(R_LCDC & 0x80)) flag = 0; |
39 | 39 | ||
40 | hw_interrupt(flag, IF_STAT); | 40 | hw_interrupt(flag, IF_STAT); |
41 | } | 41 | } |
42 | 42 | ||
43 | void stat_write(byte b) | ||
44 | { | ||
45 | R_STAT = (R_STAT & 0x07) | (b & 0x78); | ||
46 | if (!hw.cgb &&!(R_STAT & 2)) /* DMG STAT write bug => interrupt */ | ||
47 | hw_interrupt(IF_STAT, IF_STAT); | ||
48 | stat_trigger(); | ||
49 | } | ||
50 | |||
51 | |||
52 | /* | 43 | /* |
53 | * stat_change is called when a transition results in a change to the | 44 | * stat_change is called when a transition results in a change to the |
54 | * LCD STAT condition (the low 2 bits of R_STAT). It raises or lowers | 45 | * LCD STAT condition (the low 2 bits of R_STAT). It raises or lowers |
@@ -58,118 +49,118 @@ void stat_write(byte b) | |||
58 | 49 | ||
59 | static void stat_change(int stat) | 50 | static void stat_change(int stat) |
60 | { | 51 | { |
61 | stat &= 3; | 52 | stat &= 3; |
62 | R_STAT = (R_STAT & 0x7C) | stat; | 53 | R_STAT = (R_STAT & 0x7C) | stat; |
63 | 54 | ||
64 | if (stat != 1) hw_interrupt(0, IF_VBLANK); | 55 | if (stat != 1) hw_interrupt(0, IF_VBLANK); |
65 | /* hw_interrupt((stat == 1) ? IF_VBLANK : 0, IF_VBLANK); */ | 56 | /* hw_interrupt((stat == 1) ? IF_VBLANK : 0, IF_VBLANK); */ |
66 | stat_trigger(); | 57 | stat_trigger(); |
67 | } | 58 | } |
68 | 59 | ||
69 | 60 | ||
70 | void lcdc_change(byte b) | 61 | void lcdc_change(byte b) |
71 | { | 62 | { |
72 | byte old = R_LCDC; | 63 | byte old = R_LCDC; |
73 | R_LCDC = b; | 64 | R_LCDC = b; |
74 | if ((R_LCDC ^ old) & 0x80) /* lcd on/off change */ | 65 | if ((R_LCDC ^ old) & 0x80) /* lcd on/off change */ |
75 | { | 66 | { |
76 | R_LY = 0; | 67 | R_LY = 0; |
77 | stat_change(2); | 68 | stat_change(2); |
78 | C = 40; | 69 | C = 40; |
79 | lcd_begin(); | 70 | lcd_begin(); |
80 | } | 71 | } |
81 | } | 72 | } |
82 | 73 | ||
83 | 74 | ||
84 | void lcdc_trans(void) | 75 | void lcdc_trans(void) |
85 | { | 76 | { |
86 | if (!(R_LCDC & 0x80)) | 77 | if (!(R_LCDC & 0x80)) |
87 | { | 78 | { |
88 | while (C <= 0) | 79 | while (C <= 0) |
89 | { | 80 | { |
90 | switch ((byte)(R_STAT & 3)) | 81 | switch ((byte)(R_STAT & 3)) |
91 | { | 82 | { |
92 | case 0: | 83 | case 0: |
93 | case 1: | 84 | case 1: |
94 | stat_change(2); | 85 | stat_change(2); |
95 | C += 40; | 86 | C += 40; |
96 | break; | 87 | break; |
97 | case 2: | 88 | case 2: |
98 | stat_change(3); | 89 | stat_change(3); |
99 | C += 86; | 90 | C += 86; |
100 | break; | 91 | break; |
101 | case 3: | 92 | case 3: |
102 | stat_change(0); | 93 | stat_change(0); |
103 | if (hw.hdma & 0x80) | 94 | if (hw.hdma & 0x80) |
104 | hw_hdma(); | 95 | hw_hdma(); |
105 | else | 96 | else |
106 | C += 102; | 97 | C += 102; |
107 | break; | 98 | break; |
108 | } | 99 | } |
109 | return; | 100 | return; |
110 | } | 101 | } |
111 | } | 102 | } |
112 | while (C <= 0) | 103 | while (C <= 0) |
113 | { | 104 | { |
114 | switch ((byte)(R_STAT & 3)) | 105 | switch ((byte)(R_STAT & 3)) |
115 | { | 106 | { |
116 | case 1: | 107 | case 1: |
117 | if (!(hw.ilines & IF_VBLANK)) | 108 | if (!(hw.ilines & IF_VBLANK)) |
118 | { | 109 | { |
119 | C += 218; | 110 | C += 218; |
120 | hw_interrupt(IF_VBLANK, IF_VBLANK); | 111 | hw_interrupt(IF_VBLANK, IF_VBLANK); |
121 | break; | 112 | break; |
122 | } | 113 | } |
123 | if (R_LY == 0) | 114 | if (R_LY == 0) |
124 | { | 115 | { |
125 | lcd_begin(); | 116 | lcd_begin(); |
126 | stat_change(2); | 117 | stat_change(2); |
127 | C += 40; | 118 | C += 40; |
128 | break; | 119 | break; |
129 | } | 120 | } |
130 | else if (R_LY < 152) | 121 | else if (R_LY < 152) |
131 | C += 228; | 122 | C += 228; |
132 | else if (R_LY == 152) | 123 | else if (R_LY == 152) |
133 | C += 28; | 124 | C += 28; |
134 | else | 125 | else |
135 | { | 126 | { |
136 | R_LY = -1; | 127 | R_LY = -1; |
137 | C += 200; | 128 | C += 200; |
138 | } | 129 | } |
139 | R_LY++; | 130 | R_LY++; |
140 | stat_trigger(); | 131 | stat_trigger(); |
141 | break; | 132 | break; |
142 | case 2: | 133 | case 2: |
143 | if (fb.enabled) | 134 | if (fb.enabled) |
144 | lcd_refreshline(); | 135 | lcd_refreshline(); |
145 | stat_change(3); | 136 | stat_change(3); |
146 | C += 86; | 137 | C += 86; |
147 | break; | 138 | break; |
148 | case 3: | 139 | case 3: |
149 | stat_change(0); | 140 | stat_change(0); |
150 | if (hw.hdma & 0x80) | 141 | if (hw.hdma & 0x80) |
151 | hw_hdma(); | 142 | hw_hdma(); |
152 | /* FIXME -- how much of the hblank does hdma use?? */ | 143 | /* FIXME -- how much of the hblank does hdma use?? */ |
153 | /* else */ | 144 | /* else */ |
154 | C += 102; | 145 | C += 102; |
155 | break; | 146 | break; |
156 | case 0: | 147 | case 0: |
157 | if (++R_LY >= 144) | 148 | if (++R_LY >= 144) |
158 | { | 149 | { |
159 | if (cpu.halt) | 150 | if (cpu.halt) |
160 | { | 151 | { |
161 | hw_interrupt(IF_VBLANK, IF_VBLANK); | 152 | hw_interrupt(IF_VBLANK, IF_VBLANK); |
162 | C += 228; | 153 | C += 228; |
163 | } | 154 | } |
164 | else C += 10; | 155 | else C += 10; |
165 | stat_change(1); | 156 | stat_change(1); |
166 | break; | 157 | break; |
167 | } | 158 | } |
168 | stat_change(2); | 159 | stat_change(2); |
169 | C += 40; | 160 | C += 40; |
170 | break; | 161 | break; |
171 | } | 162 | } |
172 | } | 163 | } |
173 | } | 164 | } |
174 | 165 | ||
175 | 166 | ||
diff --git a/apps/plugins/rockboy/loader.c b/apps/plugins/rockboy/loader.c index d6efa2e8ee..8166220c8e 100644 --- a/apps/plugins/rockboy/loader.c +++ b/apps/plugins/rockboy/loader.c | |||
@@ -10,68 +10,67 @@ | |||
10 | #include "hw.h" | 10 | #include "hw.h" |
11 | #include "lcd-gb.h" | 11 | #include "lcd-gb.h" |
12 | #include "rtc-gb.h" | 12 | #include "rtc-gb.h" |
13 | #include "rc.h" | ||
14 | #include "save.h" | 13 | #include "save.h" |
15 | #include "sound.h" | 14 | #include "sound.h" |
16 | 15 | ||
17 | 16 | ||
18 | static int mbc_table[256] = | 17 | static int mbc_table[256] = |
19 | { | 18 | { |
20 | 0, 1, 1, 1, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 3, | 19 | 0, 1, 1, 1, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 3, |
21 | 3, 3, 3, 3, 0, 0, 0, 0, 0, 5, 5, 5, MBC_RUMBLE, MBC_RUMBLE, MBC_RUMBLE, 0, | 20 | 3, 3, 3, 3, 0, 0, 0, 0, 0, 5, 5, 5, MBC_RUMBLE, MBC_RUMBLE, MBC_RUMBLE, 0, |
22 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | 21 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
23 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | 22 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
24 | 23 | ||
25 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | 24 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
26 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | 25 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
27 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | 26 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
28 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | 27 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
29 | 28 | ||
30 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | 29 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
31 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | 30 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
32 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | 31 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
33 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | 32 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
34 | 33 | ||
35 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | 34 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
36 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | 35 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
37 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | 36 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
38 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, MBC_HUC3, MBC_HUC1 | 37 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, MBC_HUC3, MBC_HUC1 |
39 | }; | 38 | }; |
40 | 39 | ||
41 | static int rtc_table[256] = | 40 | static int rtc_table[256] = |
42 | { | 41 | { |
43 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, | 42 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, |
44 | 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | 43 | 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
45 | 0 | 44 | 0 |
46 | }; | 45 | }; |
47 | 46 | ||
48 | static int batt_table[256] = | 47 | static int batt_table[256] = |
49 | { | 48 | { |
50 | 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, | 49 | 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, |
51 | 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, | 50 | 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, |
52 | 0 | 51 | 0 |
53 | }; | 52 | }; |
54 | 53 | ||
55 | static int romsize_table[256] = | 54 | static int romsize_table[256] = |
56 | { | 55 | { |
57 | 2, 4, 8, 16, 32, 64, 128, 256, 512, | 56 | 2, 4, 8, 16, 32, 64, 128, 256, 512, |
58 | 0, 0, 0, 0, 0, 0, 0, 0, | 57 | 0, 0, 0, 0, 0, 0, 0, 0, |
59 | 0, 0, 0, 0, 0, 0, 0, 0, | 58 | 0, 0, 0, 0, 0, 0, 0, 0, |
60 | 0, 0, 0, 0, 0, 0, 0, 0, | 59 | 0, 0, 0, 0, 0, 0, 0, 0, |
61 | 0, 0, 0, 0, 0, 0, 0, 0, | 60 | 0, 0, 0, 0, 0, 0, 0, 0, |
62 | 0, 0, 0, 0, 0, 0, 0, 0, | 61 | 0, 0, 0, 0, 0, 0, 0, 0, |
63 | 0, 0, 0, 0, 0, 0, 0, 0, | 62 | 0, 0, 0, 0, 0, 0, 0, 0, |
64 | 0, 0, 0, 0, 0, 0, 0, 0, | 63 | 0, 0, 0, 0, 0, 0, 0, 0, |
65 | 0, 0, 0, 0, 0, 0, 0, 0, | 64 | 0, 0, 0, 0, 0, 0, 0, 0, |
66 | 0, 0, 0, 0, 0, 0, 0, 0, | 65 | 0, 0, 0, 0, 0, 0, 0, 0, |
67 | 0, 0, 128, 128, 128 | 66 | 0, 0, 128, 128, 128 |
68 | /* 0, 0, 72, 80, 96 -- actual values but bad to use these! */ | 67 | /* 0, 0, 72, 80, 96 -- actual values but bad to use these! */ |
69 | }; | 68 | }; |
70 | 69 | ||
71 | static int ramsize_table[256] = | 70 | static int ramsize_table[256] = |
72 | { | 71 | { |
73 | 1, 1, 1, 4, 16, | 72 | 1, 1, 1, 4, 16, |
74 | 4 /* FIXME - what value should this be?! */ | 73 | 4 /* FIXME - what value should this be?! */ |
75 | }; | 74 | }; |
76 | 75 | ||
77 | 76 | ||
@@ -80,304 +79,238 @@ static char sramfile[500]; | |||
80 | static char rtcfile[500]; | 79 | static char rtcfile[500]; |
81 | static char saveprefix[500]; | 80 | static char saveprefix[500]; |
82 | 81 | ||
83 | static char *savename; | ||
84 | |||
85 | static int saveslot; | 82 | static int saveslot; |
86 | 83 | ||
87 | static int forcebatt, nobatt; | 84 | static int forcebatt, nobatt; |
88 | static int forcedmg, gbamode; | 85 | static int forcedmg; |
89 | 86 | ||
90 | static int memfill = -1, memrand = -1; | 87 | static int memfill = -1, memrand = -1; |
91 | 88 | ||
92 | //static byte romMemory[4*1025*1024]; | ||
93 | int mp3_buffer_size; | ||
94 | void *bufferpos; | ||
95 | |||
96 | static void initmem(void *mem, int size) | 89 | static void initmem(void *mem, int size) |
97 | { | 90 | { |
98 | char *p = mem; | 91 | char *p = mem; |
99 | if (memrand >= 0) | 92 | if (memrand >= 0) |
100 | { | 93 | { |
101 | srand(memrand ? memrand : -6 ); //time(0)); | 94 | srand(memrand ? memrand : -6 ); /* time(0)); */ |
102 | while(size--) *(p++) = rand(); | 95 | while(size--) *(p++) = rand(); |
103 | } | 96 | } |
104 | else if (memfill >= 0) | 97 | else if (memfill >= 0) |
105 | memset(p, memfill, size); | 98 | memset(p, memfill, size); |
106 | } | 99 | } |
107 | 100 | ||
108 | static byte *loadfile(int fd, int *len) | 101 | static byte *loadfile(int fd, int *len) |
109 | { | 102 | { |
110 | int c, l = 0, p = 0; | 103 | int c, l = 0, p = 0; |
111 | 104 | ||
112 | byte *d, buf[512]; | 105 | byte *d, buf[512]; |
113 | d=malloc(32768); | 106 | d=malloc(32768); |
114 | for(;;) | 107 | for(;;) |
115 | { | 108 | { |
116 | c = read(fd, buf, sizeof buf); | 109 | c = read(fd, buf, sizeof buf); |
117 | if (c <= 0) break; | 110 | if (c <= 0) break; |
118 | l += c; | 111 | l += c; |
119 | memcpy(d+p, buf, c); | 112 | memcpy(d+p, buf, c); |
120 | p += c; | 113 | p += c; |
121 | } | 114 | } |
122 | setmallocpos(d+p+64); | 115 | setmallocpos(d+p+64); |
123 | *len = l; | 116 | *len = l; |
124 | return d; | 117 | return d; |
125 | } | 118 | } |
126 | 119 | ||
127 | //static byte sram[65536]; | ||
128 | 120 | ||
129 | int rom_load(void) | 121 | int rom_load(void) |
130 | { | 122 | { |
131 | int fd; | 123 | int fd; |
132 | byte c, *data, *header; | 124 | byte c, *data, *header; |
133 | int len = 0, rlen; | 125 | int len = 0, rlen; |
134 | 126 | ||
135 | fd = open(romfile, O_RDONLY); | 127 | fd = open(romfile, O_RDONLY); |
136 | 128 | ||
137 | if (fd<0) { | 129 | if (fd<0) { |
138 | die("cannot open rom file"); | 130 | die("cannot open rom file"); |
139 | die(romfile); | 131 | die(romfile); |
140 | return 1; | 132 | return 1; |
141 | } | 133 | } |
142 | 134 | ||
143 | data = loadfile(fd, &len); | 135 | data = loadfile(fd, &len); |
144 | header = data; // no zip. = decompress(data, &len); | 136 | header = data; /* no zip. = decompress(data, &len); */ |
145 | 137 | ||
146 | memcpy(rom.name, header+0x0134, 16); | 138 | memcpy(rom.name, header+0x0134, 16); |
147 | if (rom.name[14] & 0x80) rom.name[14] = 0; | 139 | if (rom.name[14] & 0x80) rom.name[14] = 0; |
148 | if (rom.name[15] & 0x80) rom.name[15] = 0; | 140 | if (rom.name[15] & 0x80) rom.name[15] = 0; |
149 | rom.name[16] = 0; | 141 | rom.name[16] = 0; |
150 | 142 | ||
151 | c = header[0x0147]; | 143 | c = header[0x0147]; |
152 | mbc.type = mbc_table[c]; | 144 | mbc.type = mbc_table[c]; |
153 | mbc.batt = (batt_table[c] && !nobatt) || forcebatt; | 145 | mbc.batt = (batt_table[c] && !nobatt) || forcebatt; |
154 | // mbc.batt = 1; // always store savegame mem. | 146 | rtc.batt = rtc_table[c]; |
155 | rtc.batt = rtc_table[c]; | 147 | mbc.romsize = romsize_table[header[0x0148]]; |
156 | mbc.romsize = romsize_table[header[0x0148]]; | 148 | mbc.ramsize = ramsize_table[header[0x0149]]; |
157 | mbc.ramsize = ramsize_table[header[0x0149]]; | 149 | |
158 | 150 | if (!mbc.romsize) { | |
159 | if (!mbc.romsize) { | 151 | die("unknown ROM size %02X\n", header[0x0148]); |
160 | die("unknown ROM size %02X\n", header[0x0148]); | 152 | return 1; |
161 | return 1; | 153 | } |
162 | } | 154 | if (!mbc.ramsize) { |
163 | if (!mbc.ramsize) { | 155 | die("unknown SRAM size %02X\n", header[0x0149]); |
164 | die("unknown SRAM size %02X\n", header[0x0149]); | 156 | return 1; |
165 | return 1; | 157 | } |
166 | } | 158 | |
167 | 159 | rlen = 16384 * mbc.romsize; | |
168 | rlen = 16384 * mbc.romsize; | 160 | rom.bank = (void *) data; /* realloc(data, rlen); */ |
169 | rom.bank = (void *) data; //realloc(data, rlen); | 161 | if (rlen > len) memset(rom.bank[0]+len, 0xff, rlen - len); |
170 | if (rlen > len) memset(rom.bank[0]+len, 0xff, rlen - len); | 162 | |
171 | 163 | ram.sbank = malloc(8192 * mbc.ramsize); | |
172 | ram.sbank = malloc(8192 * mbc.ramsize); | 164 | /* ram.ibank = malloc(4096*8); */ |
173 | //ram.ibank = malloc(4096*8); | 165 | |
174 | 166 | initmem(ram.sbank, 8192 * mbc.ramsize); | |
175 | initmem(ram.sbank, 8192 * mbc.ramsize); | 167 | initmem(ram.ibank, 4096 * 8); |
176 | initmem(ram.ibank, 4096 * 8); | 168 | |
177 | 169 | mbc.rombank = 1; | |
178 | mbc.rombank = 1; | 170 | mbc.rambank = 0; |
179 | mbc.rambank = 0; | 171 | |
180 | 172 | c = header[0x0143]; | |
181 | c = header[0x0143]; | ||
182 | hw.cgb = ((c == 0x80) || (c == 0xc0)) && !forcedmg; | 173 | hw.cgb = ((c == 0x80) || (c == 0xc0)) && !forcedmg; |
183 | hw.gba = (hw.cgb && gbamode); | 174 | |
184 | 175 | close(fd); | |
185 | close(fd); | ||
186 | 176 | ||
187 | return 0; | 177 | return 0; |
188 | } | 178 | } |
189 | 179 | ||
190 | int sram_load(void) | 180 | int sram_load(void) |
191 | { | 181 | { |
192 | int fd; | 182 | int fd; |
193 | char meow[500]; | 183 | char meow[500]; |
194 | 184 | ||
195 | if (!mbc.batt || !sramfile || !*sramfile) return -1; | 185 | if (!mbc.batt || !sramfile || !*sramfile) return -1; |
196 | 186 | ||
197 | /* Consider sram loaded at this point, even if file doesn't exist */ | 187 | /* Consider sram loaded at this point, even if file doesn't exist */ |
198 | ram.loaded = 1; | 188 | ram.loaded = 1; |
199 | 189 | ||
200 | fd = open(sramfile, O_RDONLY); | 190 | fd = open(sramfile, O_RDONLY); |
201 | snprintf(meow,499,"Opening %s %d",sramfile,fd); | 191 | snprintf(meow,499,"Opening %s %d",sramfile,fd); |
202 | rb->splash(HZ*2, true, meow); | 192 | rb->splash(HZ*2, true, meow); |
203 | if (fd<0) return -1; | 193 | if (fd<0) return -1; |
204 | snprintf(meow,499,"Loading savedata from %s",sramfile); | 194 | snprintf(meow,499,"Loading savedata from %s",sramfile); |
205 | rb->splash(HZ*2, true, meow); | 195 | rb->splash(HZ*2, true, meow); |
206 | read(fd,ram.sbank, 8192*mbc.ramsize); | 196 | read(fd,ram.sbank, 8192*mbc.ramsize); |
207 | close(fd); | 197 | close(fd); |
208 | 198 | ||
209 | return 0; | 199 | return 0; |
210 | } | 200 | } |
211 | 201 | ||
212 | 202 | ||
213 | int sram_save(void) | 203 | int sram_save(void) |
214 | { | 204 | { |
215 | int fd; | 205 | int fd; |
216 | char meow[500]; | 206 | char meow[500]; |
217 | 207 | ||
218 | /* If we crash before we ever loaded sram, DO NOT SAVE! */ | 208 | /* If we crash before we ever loaded sram, DO NOT SAVE! */ |
219 | if (!mbc.batt || !sramfile || !ram.loaded || !mbc.ramsize) | 209 | if (!mbc.batt || !sramfile || !ram.loaded || !mbc.ramsize) |
220 | return -1; | 210 | return -1; |
221 | fd = open(sramfile, O_WRONLY|O_CREAT|O_TRUNC); | 211 | fd = open(sramfile, O_WRONLY|O_CREAT|O_TRUNC); |
222 | // snprintf(meow,499,"Opening %s %d",sramfile,fd); | 212 | if (fd<0) return -1; |
223 | // rb->splash(HZ*2, true, meow); | 213 | snprintf(meow,499,"Saving savedata to %s",sramfile); |
224 | if (fd<0) return -1; | 214 | rb->splash(HZ*2, true, meow); |
225 | snprintf(meow,499,"Saving savedata to %s",sramfile); | 215 | write(fd,ram.sbank, 8192*mbc.ramsize); |
226 | rb->splash(HZ*2, true, meow); | 216 | close(fd); |
227 | write(fd,ram.sbank, 8192*mbc.ramsize); | 217 | |
228 | close(fd); | 218 | return 0; |
229 | |||
230 | return 0; | ||
231 | } | 219 | } |
232 | 220 | ||
233 | 221 | ||
234 | void state_save(int n) | 222 | void state_save(int n) |
235 | { | 223 | { |
236 | int fd; | 224 | int fd; |
237 | char name[500]; | 225 | char name[500]; |
238 | 226 | ||
239 | if (n < 0) n = saveslot; | 227 | if (n < 0) n = saveslot; |
240 | if (n < 0) n = 0; | 228 | if (n < 0) n = 0; |
241 | snprintf(name, 499,"%s.%03d", saveprefix, n); | 229 | snprintf(name, 499,"%s.%03d", saveprefix, n); |
242 | 230 | ||
243 | if ((fd = open(name, O_WRONLY|O_CREAT|O_TRUNC)>=0)) | 231 | if ((fd = open(name, O_WRONLY|O_CREAT|O_TRUNC)>=0)) |
244 | { | 232 | { |
245 | savestate(fd); | 233 | savestate(fd); |
246 | close(fd); | 234 | close(fd); |
247 | } | 235 | } |
248 | } | 236 | } |
249 | 237 | ||
250 | 238 | ||
251 | void state_load(int n) | 239 | void state_load(int n) |
252 | { | 240 | { |
253 | int fd; | 241 | int fd; |
254 | char name[500]; | 242 | char name[500]; |
255 | 243 | ||
256 | if (n < 0) n = saveslot; | 244 | if (n < 0) n = saveslot; |
257 | if (n < 0) n = 0; | 245 | if (n < 0) n = 0; |
258 | snprintf(name, 499, "%s.%03d", saveprefix, n); | 246 | snprintf(name, 499, "%s.%03d", saveprefix, n); |
259 | 247 | ||
260 | if ((fd = open(name, O_RDONLY)>=0)) | 248 | if ((fd = open(name, O_RDONLY)>=0)) |
261 | { | 249 | { |
262 | loadstate(fd); | 250 | loadstate(fd); |
263 | close(fd); | 251 | close(fd); |
264 | vram_dirty(); | 252 | vram_dirty(); |
265 | pal_dirty(); | 253 | pal_dirty(); |
266 | sound_dirty(); | 254 | sound_dirty(); |
267 | mem_updatemap(); | 255 | mem_updatemap(); |
268 | } | 256 | } |
269 | } | 257 | } |
270 | 258 | ||
271 | void rtc_save(void) | 259 | void rtc_save(void) |
272 | { | 260 | { |
273 | int fd; | 261 | int fd; |
274 | if (!rtc.batt) return; | 262 | if (!rtc.batt) return; |
275 | if ((fd = open(rtcfile, O_WRONLY|O_CREAT|O_TRUNC))<0) return; | 263 | if ((fd = open(rtcfile, O_WRONLY|O_CREAT|O_TRUNC))<0) return; |
276 | rtc_save_internal(fd); | 264 | rtc_save_internal(fd); |
277 | close(fd); | 265 | close(fd); |
278 | } | 266 | } |
279 | 267 | ||
280 | void rtc_load(void) | 268 | void rtc_load(void) |
281 | { | 269 | { |
282 | int fd; | 270 | int fd; |
283 | if (!rtc.batt) return; | 271 | if (!rtc.batt) return; |
284 | if ((fd = open(rtcfile, O_RDONLY))<0) return; | 272 | if ((fd = open(rtcfile, O_RDONLY))<0) return; |
285 | rtc_load_internal(fd); | 273 | rtc_load_internal(fd); |
286 | close(fd); | 274 | close(fd); |
287 | } | 275 | } |
288 | 276 | ||
289 | 277 | ||
290 | void loader_unload(void) | 278 | void loader_unload(void) |
291 | { | 279 | { |
292 | sram_save(); | 280 | sram_save(); |
293 | // if (romfile) free(romfile); | 281 | /* if (romfile) free(romfile); |
294 | // if (sramfile) free(sramfile); | 282 | if (sramfile) free(sramfile); |
295 | // if (saveprefix) free(saveprefix); | 283 | if (saveprefix) free(saveprefix); |
296 | // if (rom.bank) free(rom.bank); | 284 | if (rom.bank) free(rom.bank); |
297 | // if (ram.sbank) free(ram.sbank); | 285 | if (ram.sbank) free(ram.sbank); */ |
298 | romfile = 0; | 286 | romfile = 0; |
299 | rom.bank = 0; | 287 | rom.bank = 0; |
300 | ram.sbank = 0; | 288 | ram.sbank = 0; |
301 | mbc.type = mbc.romsize = mbc.ramsize = mbc.batt = 0; | 289 | mbc.type = mbc.romsize = mbc.ramsize = mbc.batt = 0; |
302 | } | ||
303 | |||
304 | /* | ||
305 | static char *base(char *s) | ||
306 | { | ||
307 | char *p; | ||
308 | p = strrchr(s, '/'); | ||
309 | if (p) return p+1; | ||
310 | return s; | ||
311 | } | 290 | } |
312 | 291 | ||
313 | |||
314 | static char *ldup(char *s) | ||
315 | { | ||
316 | int i; | ||
317 | char *n, *p; | ||
318 | p = n = malloc(strlen(s)); | ||
319 | for (i = 0; s[i]; i++) if (isalnum(s[i])) *(p++) = tolower(s[i]); | ||
320 | *p = 0; | ||
321 | return n; | ||
322 | }*/ | ||
323 | |||
324 | void cleanup(void) | 292 | void cleanup(void) |
325 | { | 293 | { |
326 | sram_save(); | 294 | sram_save(); |
327 | rtc_save(); | 295 | rtc_save(); |
328 | // IDEA - if error, write emergency savestate..? | 296 | /* IDEA - if error, write emergency savestate..? */ |
329 | } | 297 | } |
330 | 298 | ||
331 | void loader_init(char *s) | 299 | void loader_init(char *s) |
332 | { | 300 | { |
333 | char *name; | 301 | romfile = s; |
334 | // DIR* dir; | 302 | if(rom_load()) |
335 | 303 | return; | |
336 | // sys_checkdir(savedir, 1); /* needs to be writable */ | 304 | rb->splash(HZ/2, true, rom.name); |
337 | /* dir=opendir(savedir); // should be handled when the program opens | 305 | |
338 | if(!dir) | 306 | snprintf(saveprefix, 499, "%s/%s", savedir, rom.name); |
339 | mkdir(savedir); | 307 | |
340 | else | 308 | strcpy(sramfile, saveprefix); |
341 | closedir(dir);*/ | 309 | strcat(sramfile, ".sav"); |
342 | 310 | ||
343 | romfile = s; | 311 | strcpy(rtcfile, saveprefix); |
344 | if(rom_load()) | 312 | strcat(rtcfile, ".rtc"); |
345 | return; | 313 | |
346 | vid_settitle(rom.name); | 314 | sram_load(); |
347 | name = rom.name; | 315 | rtc_load(); |
348 | |||
349 | snprintf(saveprefix, 499, "%s/%s", savedir, name); | ||
350 | |||
351 | strcpy(sramfile, saveprefix); | ||
352 | strcat(sramfile, ".sav"); | ||
353 | |||
354 | strcpy(rtcfile, saveprefix); | ||
355 | strcat(rtcfile, ".rtc"); | ||
356 | |||
357 | sram_load(); | ||
358 | rtc_load(); | ||
359 | |||
360 | //atexit(cleanup); | ||
361 | } | 316 | } |
362 | |||
363 | rcvar_t loader_exports[] = | ||
364 | { | ||
365 | RCV_STRING("savedir", &savedir), | ||
366 | RCV_STRING("savename", &savename), | ||
367 | RCV_INT("saveslot", &saveslot), | ||
368 | RCV_BOOL("forcebatt", &forcebatt), | ||
369 | RCV_BOOL("nobatt", &nobatt), | ||
370 | RCV_BOOL("forcedmg", &forcedmg), | ||
371 | RCV_INT("memfill", &memfill), | ||
372 | RCV_INT("memrand", &memrand), | ||
373 | RCV_END | ||
374 | }; | ||
375 | |||
376 | |||
377 | |||
378 | |||
379 | |||
380 | |||
381 | |||
382 | |||
383 | |||
diff --git a/apps/plugins/rockboy/loader.h b/apps/plugins/rockboy/loader.h index 45ee5e705d..2eeb469403 100644 --- a/apps/plugins/rockboy/loader.h +++ b/apps/plugins/rockboy/loader.h | |||
@@ -6,11 +6,11 @@ | |||
6 | 6 | ||
7 | typedef struct loader_s | 7 | typedef struct loader_s |
8 | { | 8 | { |
9 | char *rom; | 9 | char *rom; |
10 | char *base; | 10 | char *base; |
11 | char *sram; | 11 | char *sram; |
12 | char *state; | 12 | char *state; |
13 | int ramloaded; | 13 | int ramloaded; |
14 | } loader_t; | 14 | } loader_t; |
15 | 15 | ||
16 | 16 | ||
diff --git a/apps/plugins/rockboy/main.c b/apps/plugins/rockboy/main.c index c9cbb76aaa..fc21ca0d58 100644 --- a/apps/plugins/rockboy/main.c +++ b/apps/plugins/rockboy/main.c | |||
@@ -3,95 +3,42 @@ | |||
3 | 3 | ||
4 | #include "rockmacros.h" | 4 | #include "rockmacros.h" |
5 | #include "input.h" | 5 | #include "input.h" |
6 | #include "rc.h" | ||
7 | #include "exports.h" | ||
8 | #include "emu.h" | 6 | #include "emu.h" |
9 | #include "loader.h" | 7 | #include "loader.h" |
10 | #include "hw.h" | 8 | #include "hw.h" |
11 | 9 | ||
12 | //#include "Version" | ||
13 | |||
14 | |||
15 | static char *defaultconfig[] = | ||
16 | { | ||
17 | "bind up +up", | ||
18 | "bind down +down", | ||
19 | "bind left +left", | ||
20 | "bind right +right", | ||
21 | "bind joy0 +b", | ||
22 | "bind joy1 +a", | ||
23 | "bind joy2 +select", | ||
24 | "bind joy3 +start", | ||
25 | "bind ins savestate", | ||
26 | "bind del loadstate", | ||
27 | NULL | ||
28 | }; | ||
29 | |||
30 | |||
31 | void doevents() | 10 | void doevents() |
32 | { | 11 | { |
33 | event_t ev; | 12 | event_t ev; |
34 | int st; | 13 | int st; |
35 | 14 | ||
36 | ev_poll(); | 15 | ev_poll(); |
37 | while (ev_getevent(&ev)) | 16 | while (ev_getevent(&ev)) |
38 | { | 17 | { |
39 | if (ev.type != EV_PRESS && ev.type != EV_RELEASE) | 18 | if (ev.type != EV_PRESS && ev.type != EV_RELEASE) |
40 | continue; | 19 | continue; |
41 | st = (ev.type != EV_RELEASE); | 20 | st = (ev.type != EV_RELEASE); |
42 | pad_set(ev.code, st); | 21 | pad_set(ev.code, st); |
43 | } | 22 | } |
44 | } | 23 | } |
45 | 24 | ||
46 | |||
47 | |||
48 | /* convenience macro for printing loading state */ | ||
49 | #define PUTS(str) do { \ | ||
50 | rb->lcd_putsxy(1, y, (unsigned char *)str); \ | ||
51 | rb->lcd_getstringsize((unsigned char *)str, &w, &h); \ | ||
52 | y += h + 1; \ | ||
53 | } while (0) | ||
54 | |||
55 | int gnuboy_main(char *rom) | 25 | int gnuboy_main(char *rom) |
56 | { | 26 | { |
57 | int i, w, h, y; | 27 | rb->lcd_puts(0,0,"Init video"); |
58 | 28 | vid_init(); | |
59 | y = 1; | 29 | rb->lcd_puts(0,1,"Init sound"); |
60 | // Avoid initializing video if we don't have to | 30 | pcm_init(); |
61 | // If we have special perms, drop them ASAP! | 31 | rb->lcd_puts(0,2,"Loading rom"); |
62 | PUTS("Init exports"); | 32 | loader_init(rom); |
63 | init_exports(); | 33 | if(shut) |
64 | 34 | return PLUGIN_ERROR; | |
65 | PUTS("Loading default config"); | 35 | rb->lcd_puts(0,3,"Emu reset"); |
66 | for (i = 0; defaultconfig[i]; i++) | 36 | emu_reset(); |
67 | rc_command(defaultconfig[i]); | 37 | rb->lcd_puts(0,4,"Emu run"); |
68 | |||
69 | // sprintf(cmd, "source %s", rom); | ||
70 | // s = strchr(cmd, '.'); | ||
71 | // if (s) *s = 0; | ||
72 | // strcat(cmd, ".rc"); | ||
73 | // rc_command(cmd); | ||
74 | |||
75 | // FIXME - make interface modules responsible for atexit() | ||
76 | PUTS("Init video"); | ||
77 | vid_init(); | ||
78 | PUTS("Init sound"); | ||
79 | pcm_init(); | ||
80 | PUTS("Loading rom"); | ||
81 | loader_init(rom); | ||
82 | if(shut) | ||
83 | return PLUGIN_ERROR; | ||
84 | PUTS("Emu reset"); | ||
85 | emu_reset(); | ||
86 | PUTS("Emu run"); | ||
87 | #if (LCD_HEIGHT > 144) || (LCD_WIDTH > 160) | ||
88 | rb->lcd_clear_display(); | 38 | rb->lcd_clear_display(); |
89 | // rb->lcd_drawrect((LCD_WIDTH-160)/2-1, (LCD_HEIGHT-144)/2-1, 162, 146); | ||
90 | rb->lcd_update(); | 39 | rb->lcd_update(); |
91 | #endif | 40 | emu_run(); |
92 | emu_run(); | ||
93 | 41 | ||
94 | // never reached | 42 | /* never reached */ |
95 | return PLUGIN_OK; | 43 | return PLUGIN_OK; |
96 | } | 44 | } |
97 | #undef PUTS | ||
diff --git a/apps/plugins/rockboy/mem.c b/apps/plugins/rockboy/mem.c index 01a05d09ea..8c0bea0b83 100644 --- a/apps/plugins/rockboy/mem.c +++ b/apps/plugins/rockboy/mem.c | |||
@@ -12,7 +12,7 @@ | |||
12 | #include "sound.h" | 12 | #include "sound.h" |
13 | 13 | ||
14 | struct mbc mbc IBSS_ATTR; | 14 | struct mbc mbc IBSS_ATTR; |
15 | struct rom rom; | 15 | struct rom rom IBSS_ATTR; |
16 | struct ram ram; | 16 | struct ram ram; |
17 | 17 | ||
18 | 18 | ||
@@ -31,7 +31,7 @@ struct ram ram; | |||
31 | void mem_updatemap() | 31 | void mem_updatemap() |
32 | { | 32 | { |
33 | int n; | 33 | int n; |
34 | byte **map; | 34 | static byte **map; |
35 | 35 | ||
36 | map = mbc.rmap; | 36 | map = mbc.rmap; |
37 | map[0x0] = rom.bank[0]; | 37 | map[0x0] = rom.bank[0]; |
@@ -46,16 +46,17 @@ void mem_updatemap() | |||
46 | map[0x7] = rom.bank[mbc.rombank] - 0x4000; | 46 | map[0x7] = rom.bank[mbc.rombank] - 0x4000; |
47 | } | 47 | } |
48 | else map[0x4] = map[0x5] = map[0x6] = map[0x7] = NULL; | 48 | else map[0x4] = map[0x5] = map[0x6] = map[0x7] = NULL; |
49 | if (0 && (R_STAT & 0x03) == 0x03) | 49 | if (R_VBK & 1) |
50 | { | 50 | { |
51 | map[0x8] = NULL; | 51 | map[0x8] = lcd.vbank[1] - 0x8000; |
52 | map[0x9] = NULL; | 52 | map[0x9] = lcd.vbank[1] - 0x8000; |
53 | } | 53 | } |
54 | else | 54 | else |
55 | { | 55 | { |
56 | map[0x8] = lcd.vbank[R_VBK & 1] - 0x8000; | 56 | map[0x8] = lcd.vbank[0]/*[R_VBK & 1]*/ - 0x8000; |
57 | map[0x9] = lcd.vbank[R_VBK & 1] - 0x8000; | 57 | map[0x9] = lcd.vbank[0]/*[R_VBK & 1]*/ - 0x8000; |
58 | } | 58 | |
59 | } | ||
59 | if (mbc.enableram && !(rtc.sel&8)) | 60 | if (mbc.enableram && !(rtc.sel&8)) |
60 | { | 61 | { |
61 | map[0xA] = ram.sbank[mbc.rambank] - 0xA000; | 62 | map[0xA] = ram.sbank[mbc.rambank] - 0xA000; |
@@ -127,18 +128,18 @@ void ioreg_write(byte r, byte b) | |||
127 | break; | 128 | break; |
128 | case RI_BGP: | 129 | case RI_BGP: |
129 | if (R_BGP == b) break; | 130 | if (R_BGP == b) break; |
130 | pal_write_dmg(0, 0, b); | 131 | /* pal_write_dmg(0, 0, b); */ /*Disabled in iBoy and WAC-gnuboyCE */ |
131 | pal_write_dmg(8, 1, b); | 132 | /* pal_write_dmg(8, 1, b); */ /*Disabled in iBoy and WAC-gnuboyCE */ |
132 | R_BGP = b; | 133 | R_BGP = b; |
133 | break; | 134 | break; |
134 | case RI_OBP0: | 135 | case RI_OBP0: |
135 | if (R_OBP0 == b) break; | 136 | if (R_OBP0 == b) break; |
136 | pal_write_dmg(64, 2, b); | 137 | /* pal_write_dmg(64, 2, b); */ /*Disabled in iBoy and WAC-gnuboyCE */ |
137 | R_OBP0 = b; | 138 | R_OBP0 = b; |
138 | break; | 139 | break; |
139 | case RI_OBP1: | 140 | case RI_OBP1: |
140 | if (R_OBP1 == b) break; | 141 | if (R_OBP1 == b) break; |
141 | pal_write_dmg(72, 3, b); | 142 | /* pal_write_dmg(72, 3, b); */ /*Disabled in iBoy and WAC-gnuboyCE */ |
142 | R_OBP1 = b; | 143 | R_OBP1 = b; |
143 | break; | 144 | break; |
144 | case RI_IF: | 145 | case RI_IF: |
@@ -166,7 +167,8 @@ void ioreg_write(byte r, byte b) | |||
166 | lcdc_change(b); | 167 | lcdc_change(b); |
167 | break; | 168 | break; |
168 | case RI_STAT: | 169 | case RI_STAT: |
169 | stat_write(b); | 170 | REG(r) = (REG(r) & 0x07) | (b & 0x78); |
171 | stat_trigger(); | ||
170 | break; | 172 | break; |
171 | case RI_LYC: | 173 | case RI_LYC: |
172 | REG(r) = b; | 174 | REG(r) = b; |
@@ -220,21 +222,6 @@ void ioreg_write(byte r, byte b) | |||
220 | hw_hdma_cmd(b); | 222 | hw_hdma_cmd(b); |
221 | break; | 223 | break; |
222 | } | 224 | } |
223 | switch (r) | ||
224 | { | ||
225 | case RI_BGP: | ||
226 | case RI_OBP0: | ||
227 | case RI_OBP1: | ||
228 | /* printf("palette reg %02X write %02X at LY=%02X\n", r, b, R_LY); */ | ||
229 | case RI_HDMA1: | ||
230 | case RI_HDMA2: | ||
231 | case RI_HDMA3: | ||
232 | case RI_HDMA4: | ||
233 | case RI_HDMA5: | ||
234 | /* printf("HDMA %d: %02X\n", r - RI_HDMA1 + 1, b); */ | ||
235 | break; | ||
236 | } | ||
237 | /* printf("reg %02X => %02X (%02X)\n", r, REG(r), b); */ | ||
238 | } | 225 | } |
239 | 226 | ||
240 | 227 | ||
@@ -410,29 +397,31 @@ void mbc_write(int a, byte b) | |||
410 | break; | 397 | break; |
411 | } | 398 | } |
412 | break; | 399 | break; |
413 | case MBC_HUC3: | 400 | case MBC_HUC3: /* FIXME - this is all guesswork -- is it right??? */ |
414 | switch (ha & 0xE) | 401 | switch (ha & 0xE) |
415 | { | 402 | { |
416 | case 0x0: | 403 | case 0x0: |
417 | mbc.enableram = ((b & 0x0F) == 0x0A); | 404 | mbc.enableram = ((b & 0x0F) == 0x0A); |
418 | break; | 405 | break; |
419 | case 0x2: | 406 | case 0x2: |
420 | b &= 0x7F; | 407 | if (!b) b = 1; |
421 | mbc.rombank = b ? b : 1; | 408 | mbc.rombank = b; |
422 | break; | 409 | break; |
423 | case 0x4: | 410 | case 0x4: |
424 | rtc.sel = b & 0x0f; | 411 | if (mbc.model) |
425 | mbc.rambank = b & 0x03; | 412 | { |
426 | break; | 413 | mbc.rambank = b & 0x03; |
427 | case 0x6: | 414 | break; |
428 | rtc_latch(b); | 415 | } |
429 | break; | 416 | break; |
430 | } | 417 | case 0x6: |
431 | break; | 418 | mbc.model = b & 1; |
432 | } | 419 | break; |
420 | } | ||
421 | break; | ||
422 | } | ||
433 | mbc.rombank &= (mbc.romsize - 1); | 423 | mbc.rombank &= (mbc.romsize - 1); |
434 | mbc.rambank &= (mbc.ramsize - 1); | 424 | mbc.rambank &= (mbc.ramsize - 1); |
435 | /* printf("%02X\n", mbc.rombank); */ | ||
436 | mem_updatemap(); | 425 | mem_updatemap(); |
437 | } | 426 | } |
438 | 427 | ||
@@ -494,7 +483,8 @@ void mem_write(int a, byte b) | |||
494 | /* return writehi(a & 0xFF, b); */ | 483 | /* return writehi(a & 0xFF, b); */ |
495 | if (a >= 0xFF10 && a <= 0xFF3F) | 484 | if (a >= 0xFF10 && a <= 0xFF3F) |
496 | { | 485 | { |
497 | sound_write(a & 0xFF, b); | 486 | if(options.sound) |
487 | sound_write(a & 0xFF, b); | ||
498 | break; | 488 | break; |
499 | } | 489 | } |
500 | if ((a & 0xFF80) == 0xFF80 && a != 0xFFFF) | 490 | if ((a & 0xFF80) == 0xFF80 && a != 0xFFFF) |
@@ -530,14 +520,12 @@ byte mem_read(int a) | |||
530 | case 0x8: | 520 | case 0x8: |
531 | /* if ((R_STAT & 0x03) == 0x03) return 0xFF; */ | 521 | /* if ((R_STAT & 0x03) == 0x03) return 0xFF; */ |
532 | return lcd.vbank[R_VBK&1][a & 0x1FFF]; | 522 | return lcd.vbank[R_VBK&1][a & 0x1FFF]; |
533 | case 0xA: | 523 | case 0xA: |
534 | if (!mbc.enableram && mbc.type == MBC_HUC3) | 524 | if (!mbc.enableram) |
535 | return 0x01; | 525 | return 0xFF; |
536 | if (!mbc.enableram) | 526 | if (rtc.sel&8) |
537 | return 0xFF; | 527 | return rtc.regs[rtc.sel&7]; |
538 | if (rtc.sel&8) | 528 | return ram.sbank[mbc.rambank][a & 0x1FFF]; |
539 | return rtc.regs[rtc.sel&7]; | ||
540 | return ram.sbank[mbc.rambank][a & 0x1FFF]; | ||
541 | case 0xC: | 529 | case 0xC: |
542 | if ((a & 0xF000) == 0xC000) | 530 | if ((a & 0xF000) == 0xC000) |
543 | return ram.ibank[0][a & 0x0FFF]; | 531 | return ram.ibank[0][a & 0x0FFF]; |
@@ -554,7 +542,12 @@ byte mem_read(int a) | |||
554 | /* return readhi(a & 0xFF); */ | 542 | /* return readhi(a & 0xFF); */ |
555 | if (a == 0xFFFF) return REG(0xFF); | 543 | if (a == 0xFFFF) return REG(0xFF); |
556 | if (a >= 0xFF10 && a <= 0xFF3F) | 544 | if (a >= 0xFF10 && a <= 0xFF3F) |
557 | return sound_read(a & 0xFF); | 545 | { |
546 | if(options.sound) | ||
547 | return sound_read(a & 0xFF); | ||
548 | else | ||
549 | return 1; | ||
550 | } | ||
558 | if ((a & 0xFF80) == 0xFF80) | 551 | if ((a & 0xFF80) == 0xFF80) |
559 | return ram.hi[a & 0xFF]; | 552 | return ram.hi[a & 0xFF]; |
560 | return ioreg_read(a & 0xFF); | 553 | return ioreg_read(a & 0xFF); |
diff --git a/apps/plugins/rockboy/mem.h b/apps/plugins/rockboy/mem.h index 14d03d5ff5..66165d1970 100644 --- a/apps/plugins/rockboy/mem.h +++ b/apps/plugins/rockboy/mem.h | |||
@@ -17,29 +17,29 @@ | |||
17 | 17 | ||
18 | struct mbc | 18 | struct mbc |
19 | { | 19 | { |
20 | int type; | 20 | int type; |
21 | int model; | 21 | int model; |
22 | int rombank; | 22 | int rombank; |
23 | int rambank; | 23 | int rambank; |
24 | int romsize; | 24 | int romsize; |
25 | int ramsize; | 25 | int ramsize; |
26 | int enableram; | 26 | int enableram; |
27 | int batt; | 27 | int batt; |
28 | byte *rmap[0x10], *wmap[0x10]; | 28 | byte *rmap[0x10], *wmap[0x10]; |
29 | }; | 29 | }; |
30 | 30 | ||
31 | struct rom | 31 | struct rom |
32 | { | 32 | { |
33 | byte (*bank)[16384]; | 33 | byte (*bank)[16384]; |
34 | char name[20]; | 34 | char name[20]; |
35 | }; | 35 | }; |
36 | 36 | ||
37 | struct ram | 37 | struct ram |
38 | { | 38 | { |
39 | byte hi[256]; | 39 | byte hi[256]; |
40 | byte ibank[8][4096]; | 40 | byte ibank[8][4096]; |
41 | byte (*sbank)[8192]; | 41 | byte (*sbank)[8192]; |
42 | int loaded; | 42 | int loaded; |
43 | }; | 43 | }; |
44 | 44 | ||
45 | 45 | ||
diff --git a/apps/plugins/rockboy/menu.c b/apps/plugins/rockboy/menu.c index 5f7f6b73c8..b49e480f41 100644 --- a/apps/plugins/rockboy/menu.c +++ b/apps/plugins/rockboy/menu.c | |||
@@ -13,6 +13,13 @@ | |||
13 | #define MENU_BUTTON_DOWN BUTTON_SCROLL_FWD | 13 | #define MENU_BUTTON_DOWN BUTTON_SCROLL_FWD |
14 | #define MENU_BUTTON_LEFT BUTTON_LEFT | 14 | #define MENU_BUTTON_LEFT BUTTON_LEFT |
15 | #define MENU_BUTTON_RIGHT BUTTON_RIGHT | 15 | #define MENU_BUTTON_RIGHT BUTTON_RIGHT |
16 | |||
17 | #elif (CONFIG_KEYPAD == IRIVER_H10_PAD) | ||
18 | #define MENU_BUTTON_UP BUTTON_SCROLL_UP | ||
19 | #define MENU_BUTTON_DOWN BUTTON_SCROLL_DOWN | ||
20 | #define MENU_BUTTON_LEFT BUTTON_LEFT | ||
21 | #define MENU_BUTTON_RIGHT BUTTON_RIGHT | ||
22 | |||
16 | #else | 23 | #else |
17 | #define MENU_BUTTON_UP BUTTON_UP | 24 | #define MENU_BUTTON_UP BUTTON_UP |
18 | #define MENU_BUTTON_DOWN BUTTON_DOWN | 25 | #define MENU_BUTTON_DOWN BUTTON_DOWN |
@@ -322,9 +329,9 @@ static void do_opt_menu(void) | |||
322 | }; | 329 | }; |
323 | 330 | ||
324 | static const struct opt_items fullscreen[]= { | 331 | static const struct opt_items fullscreen[]= { |
325 | { "Off", -1 }, | 332 | { "Unscaled", -1 }, |
326 | { "Fullscreen", -1 }, | 333 | { "Scaled", -1 }, |
327 | { "Full - Maintain Ratio", -1 }, | 334 | { "Scaled - Maintain Ratio", -1 }, |
328 | }; | 335 | }; |
329 | 336 | ||
330 | static const struct opt_items frameskip[]= { | 337 | static const struct opt_items frameskip[]= { |
@@ -333,13 +340,38 @@ static void do_opt_menu(void) | |||
333 | { "5 Max", -1 }, | 340 | { "5 Max", -1 }, |
334 | { "6 Max", -1 }, | 341 | { "6 Max", -1 }, |
335 | }; | 342 | }; |
343 | |||
344 | #ifdef HAVE_LCD_COLOR | ||
345 | static const struct opt_items palette[]= { | ||
346 | { "Brown (Default)", -1 }, | ||
347 | { "Gray", -1 }, | ||
348 | { "Light Gray", -1 }, | ||
349 | { "Multi-Color 1", -1 }, | ||
350 | { "Multi-Color 2", -1 }, | ||
351 | { "Adventure Island", -1 }, | ||
352 | { "Adventure Island 2", -1 }, | ||
353 | { "Balloon Kid", -1 }, | ||
354 | { "Batman", -1 }, | ||
355 | { "Batman: Return of Joker", -1 }, | ||
356 | { "Bionic Commando", -1 }, | ||
357 | { "Castlvania Adventure", -1 }, | ||
358 | { "Donkey Kong Land", -1 }, | ||
359 | { "Dr. Mario", -1 }, | ||
360 | { "Kirby", -1 }, | ||
361 | { "Metroid", -1 }, | ||
362 | { "Zelda", -1 }, | ||
363 | }; | ||
364 | #endif | ||
336 | 365 | ||
337 | static const struct menu_item items[] = { | 366 | static const struct menu_item items[] = { |
338 | { "Max Frameskip", NULL }, | 367 | { "Max Frameskip", NULL }, |
339 | { "Sound" , NULL }, | 368 | { "Sound" , NULL }, |
340 | { "Stats" , NULL }, | 369 | { "Stats" , NULL }, |
341 | { "Fullscreen" , NULL }, | 370 | { "Screen Options" , NULL }, |
342 | { "Set Keys (Buggy)", NULL }, | 371 | { "Set Keys (Buggy)", NULL }, |
372 | #ifdef HAVE_LCD_COLOR | ||
373 | { "Set Palette" , NULL }, | ||
374 | #endif | ||
343 | }; | 375 | }; |
344 | 376 | ||
345 | m = rb->menu_init(items, sizeof(items) / sizeof(*items), NULL, NULL, NULL, NULL); | 377 | m = rb->menu_init(items, sizeof(items) / sizeof(*items), NULL, NULL, NULL, NULL); |
@@ -359,6 +391,7 @@ static void do_opt_menu(void) | |||
359 | case 1: /* Sound */ | 391 | case 1: /* Sound */ |
360 | if(options.sound>1) options.sound=1; | 392 | if(options.sound>1) options.sound=1; |
361 | rb->set_option(items[1].desc, &options.sound, INT, onoff, 2, NULL ); | 393 | rb->set_option(items[1].desc, &options.sound, INT, onoff, 2, NULL ); |
394 | if(options.sound) sound_dirty(); | ||
362 | break; | 395 | break; |
363 | case 2: /* Stats */ | 396 | case 2: /* Stats */ |
364 | rb->set_option(items[2].desc, &options.showstats, INT, onoff, 2, NULL ); | 397 | rb->set_option(items[2].desc, &options.showstats, INT, onoff, 2, NULL ); |
@@ -370,6 +403,12 @@ static void do_opt_menu(void) | |||
370 | case 4: /* Keys */ | 403 | case 4: /* Keys */ |
371 | setupkeys(); | 404 | setupkeys(); |
372 | break; | 405 | break; |
406 | #ifdef HAVE_LCD_COLOR | ||
407 | case 5: /* Palette */ | ||
408 | rb->set_option(items[5].desc, &options.pal, INT, palette, 17, NULL ); | ||
409 | set_pal(); | ||
410 | break; | ||
411 | #endif | ||
373 | default: | 412 | default: |
374 | done=true; | 413 | done=true; |
375 | break; | 414 | break; |
diff --git a/apps/plugins/rockboy/noise.h b/apps/plugins/rockboy/noise.h index 838cbe171c..05bcff42cd 100644 --- a/apps/plugins/rockboy/noise.h +++ b/apps/plugins/rockboy/noise.h | |||
@@ -7,524 +7,524 @@ | |||
7 | 7 | ||
8 | static byte noise7[] ICONST_ATTR = | 8 | static byte noise7[] ICONST_ATTR = |
9 | { | 9 | { |
10 | 0xfd,0xf3,0xd7,0x0d,0xd3,0x15,0x82,0xf1, | 10 | 0xfb,0xe7,0xae,0x1b,0xa6,0x2b,0x05,0xe3, |
11 | 0xdb,0x25,0x21,0x39,0x68,0x8c,0xd5,0x00, | 11 | 0xb6,0x4a,0x42,0x72,0xd1,0x19,0xaa,0x03, |
12 | }; | 12 | }; |
13 | 13 | ||
14 | static byte noise15[] ICONST_ATTR = | 14 | static byte noise15[] ICONST_ATTR = |
15 | { | 15 | { |
16 | 0xff,0xfd,0xff,0xf3,0xff,0xd7,0xff,0x0f, | 16 | 0xff,0xfb,0xff,0xe7,0xff,0xaf,0xfe,0x1f, |
17 | 0xfd,0xdf,0xf3,0x3f,0xd5,0x7f,0x00,0xfd, | 17 | 0xfb,0xbf,0xe6,0x7f,0xaa,0xfe,0x01,0xfb, |
18 | 0xfd,0xf3,0xf3,0xd7,0xd7,0x0f,0x0d,0xdd, | 18 | 0xfb,0xe7,0xe7,0xaf,0xae,0x1e,0x1b,0xbb, |
19 | 0xd3,0x33,0x15,0x55,0x80,0x02,0xff,0xf1, | 19 | 0xa6,0x66,0x2a,0xab,0x00,0x05,0xff,0xe3, |
20 | 0xff,0xdb,0xff,0x27,0xfd,0x2f,0xf1,0x1f, | 20 | 0xff,0xb7,0xfe,0x4f,0xfa,0x5f,0xe2,0x3f, |
21 | 0xd9,0xbf,0x2a,0x7d,0x02,0xf1,0xf1,0xdb, | 21 | 0xb3,0x7e,0x54,0xfa,0x05,0xe3,0xe3,0xb7, |
22 | 0xdb,0x27,0x25,0x2d,0x21,0x11,0x39,0x99, | 22 | 0xb6,0x4e,0x4a,0x5a,0x42,0x22,0x73,0x32, |
23 | 0x6a,0xa8,0x80,0x0c,0xff,0xd5,0xff,0x03, | 23 | 0xd5,0x51,0x00,0x19,0xff,0xab,0xfe,0x07, |
24 | 0xfd,0xf7,0xf3,0xcf,0xd7,0x5f,0x0c,0x3d, | 24 | 0xfb,0xef,0xe7,0x9f,0xae,0xbe,0x18,0x7b, |
25 | 0xd7,0x73,0x0c,0xd5,0xd5,0x03,0x01,0xf5, | 25 | 0xae,0xe6,0x19,0xab,0xaa,0x06,0x03,0xeb, |
26 | 0xfb,0xc3,0xe7,0x77,0xac,0xce,0x15,0x5b, | 26 | 0xf7,0x87,0xce,0xef,0x59,0x9c,0x2a,0xb7, |
27 | 0x80,0x26,0xff,0x29,0xfd,0x0b,0xf1,0xc7, | 27 | 0x00,0x4d,0xfe,0x53,0xfa,0x17,0xe3,0x8f, |
28 | 0xdb,0x6f,0x24,0x9d,0x24,0xb1,0x24,0x59, | 28 | 0xb6,0xde,0x49,0x3a,0x49,0x62,0x48,0xb2, |
29 | 0x26,0x29,0x2b,0x09,0x05,0xc9,0xe3,0x4b, | 29 | 0x4c,0x52,0x56,0x12,0x0b,0x93,0xc6,0x97, |
30 | 0xb4,0x46,0x46,0x6a,0x6a,0x82,0x80,0xf0, | 30 | 0x68,0x8c,0x8c,0xd4,0xd5,0x05,0x01,0xe1, |
31 | 0xfd,0xdd,0xf3,0x33,0xd5,0x57,0x00,0x0d, | 31 | 0xfb,0xbb,0xe6,0x67,0xaa,0xae,0x00,0x1b, |
32 | 0xff,0xd3,0xff,0x17,0xfd,0x8f,0xf2,0xdf, | 32 | 0xff,0xa7,0xfe,0x2f,0xfb,0x1f,0xe5,0xbf, |
33 | 0xd1,0x3f,0x19,0x7d,0xa8,0xf2,0x0d,0xd3, | 33 | 0xa2,0x7e,0x32,0xfb,0x51,0xe4,0x1b,0xa7, |
34 | 0xd3,0x17,0x15,0x8d,0x82,0xd2,0xf1,0x11, | 34 | 0xa6,0x2e,0x2b,0x1b,0x05,0xa5,0xe2,0x23, |
35 | 0xd9,0x9b,0x2a,0xa5,0x00,0x21,0xff,0x3b, | 35 | 0xb3,0x36,0x55,0x4a,0x00,0x43,0xfe,0x77, |
36 | 0xfd,0x67,0xf0,0xaf,0xdc,0x1f,0x37,0xbd, | 36 | 0xfa,0xcf,0xe1,0x5f,0xb8,0x3e,0x6f,0x7a, |
37 | 0x4e,0x70,0x5a,0xde,0x21,0x3b,0x39,0x65, | 37 | 0x9c,0xe0,0xb5,0xbc,0x42,0x76,0x72,0xca, |
38 | 0x68,0xa0,0x8c,0x3c,0xd7,0x75,0x0c,0xc1, | 38 | 0xd1,0x41,0x18,0x79,0xae,0xea,0x19,0x83, |
39 | 0xd5,0x7b,0x00,0xe5,0xfd,0xa3,0xf2,0x37, | 39 | 0xaa,0xf6,0x01,0xcb,0xfb,0x47,0xe4,0x6f, |
40 | 0xd3,0x4f,0x14,0x5d,0x86,0x32,0xeb,0x51, | 40 | 0xa6,0x9e,0x28,0xbb,0x0c,0x65,0xd6,0xa3, |
41 | 0x84,0x1a,0xe7,0xa1,0xae,0x3a,0x1b,0x63, | 41 | 0x08,0x35,0xcf,0x43,0x5c,0x74,0x36,0xc7, |
42 | 0xa4,0xb6,0x24,0x4b,0x26,0x45,0x2a,0x61, | 42 | 0x49,0x6c,0x48,0x96,0x4c,0x8a,0x54,0xc2, |
43 | 0x02,0xb9,0xf0,0x6b,0xde,0x87,0x38,0xed, | 43 | 0x05,0x73,0xe0,0xd7,0xbd,0x0e,0x71,0xda, |
44 | 0x6d,0x90,0x92,0x9c,0x90,0xb4,0x9c,0x44, | 44 | 0xdb,0x21,0x25,0x39,0x21,0x69,0x38,0x89, |
45 | 0xb6,0x64,0x4a,0xa6,0x40,0x2a,0x7f,0x02, | 45 | 0x6c,0xc8,0x95,0x4c,0x80,0x54,0xfe,0x05, |
46 | 0xfd,0xf1,0xf3,0xdb,0xd7,0x27,0x0d,0x2d, | 46 | 0xfb,0xe3,0xe7,0xb7,0xae,0x4e,0x1a,0x5b, |
47 | 0xd1,0x13,0x19,0x95,0xaa,0x82,0x00,0xf3, | 47 | 0xa2,0x26,0x33,0x2b,0x55,0x04,0x01,0xe7, |
48 | 0xfd,0xd7,0xf3,0x0f,0xd5,0xdf,0x03,0x3d, | 48 | 0xfb,0xaf,0xe6,0x1f,0xab,0xbe,0x06,0x7b, |
49 | 0xf5,0x73,0xc0,0xd7,0x7d,0x0c,0xf1,0xd5, | 49 | 0xea,0xe7,0x81,0xae,0xfa,0x19,0xe3,0xab, |
50 | 0xdb,0x03,0x25,0xf5,0x23,0xc1,0x37,0x79, | 50 | 0xb6,0x06,0x4b,0xea,0x47,0x82,0x6e,0xf2, |
51 | 0x4c,0xe8,0x55,0x8e,0x02,0xdb,0xf1,0x27, | 51 | 0x99,0xd0,0xab,0x1c,0x05,0xb7,0xe2,0x4f, |
52 | 0xd9,0x2f,0x29,0x1d,0x09,0xb1,0xca,0x5b, | 52 | 0xb2,0x5e,0x52,0x3a,0x13,0x63,0x94,0xb6, |
53 | 0x42,0x24,0x73,0x26,0xd5,0x29,0x01,0x09, | 53 | 0x84,0x48,0xe6,0x4d,0xaa,0x52,0x02,0x13, |
54 | 0xf9,0xcb,0xeb,0x47,0x84,0x6e,0xe6,0x99, | 54 | 0xf3,0x97,0xd6,0x8f,0x08,0xdd,0xcd,0x33, |
55 | 0xa8,0xaa,0x0c,0x03,0xd7,0xf7,0x0f,0xcd, | 55 | 0x51,0x54,0x18,0x07,0xaf,0xee,0x1f,0x9b, |
56 | 0xdf,0x53,0x3c,0x15,0x77,0x80,0xce,0xfd, | 56 | 0xbe,0xa6,0x78,0x2a,0xef,0x01,0x9d,0xfa, |
57 | 0x59,0xf0,0x2b,0xdf,0x07,0x3d,0xed,0x73, | 57 | 0xb3,0xe0,0x57,0xbe,0x0e,0x7b,0xda,0xe7, |
58 | 0x90,0xd6,0x9d,0x08,0xb1,0xcc,0x5b,0x56, | 58 | 0x21,0xad,0x3a,0x11,0x63,0x98,0xb6,0xac, |
59 | 0x24,0x0b,0x27,0xc5,0x2f,0x61,0x1c,0xb9, | 59 | 0x48,0x16,0x4f,0x8a,0x5e,0xc2,0x39,0x73, |
60 | 0xb4,0x6a,0x46,0x82,0x68,0xf2,0x8d,0xd0, | 60 | 0x68,0xd4,0x8d,0x04,0xd1,0xe5,0x1b,0xa1, |
61 | 0xd3,0x1d,0x15,0xb1,0x82,0x5a,0xf2,0x21, | 61 | 0xa6,0x3a,0x2b,0x63,0x04,0xb5,0xe4,0x43, |
62 | 0xd3,0x3b,0x15,0x65,0x80,0xa2,0xfc,0x31, | 62 | 0xa6,0x76,0x2a,0xcb,0x01,0x45,0xf8,0x63, |
63 | 0xf7,0x5b,0xcc,0x27,0x57,0x2c,0x0d,0x17, | 63 | 0xee,0xb7,0x98,0x4e,0xae,0x58,0x1a,0x2f, |
64 | 0xd1,0x8f,0x1a,0xdd,0xa1,0x32,0x39,0x53, | 64 | 0xa3,0x1e,0x35,0xbb,0x42,0x64,0x72,0xa6, |
65 | 0x68,0x14,0x8f,0x84,0xde,0xe5,0x39,0xa1, | 65 | 0xd0,0x29,0x1f,0x09,0xbd,0xca,0x73,0x42, |
66 | 0x6a,0x38,0x83,0x6c,0xf4,0x95,0xc4,0x83, | 66 | 0xd4,0x71,0x06,0xd9,0xe9,0x2b,0x89,0x06, |
67 | 0x64,0xf4,0xa5,0xc4,0x23,0x67,0x34,0xad, | 67 | 0xc9,0xe9,0x4b,0x88,0x46,0xce,0x69,0x5a, |
68 | 0x44,0x10,0x67,0x9e,0xae,0xb8,0x18,0x6f, | 68 | 0x88,0x20,0xcf,0x3d,0x5d,0x70,0x30,0xdf, |
69 | 0xae,0x9e,0x18,0xbb,0xac,0x66,0x16,0xab, | 69 | 0x5d,0x3c,0x31,0x77,0x58,0xcc,0x2d,0x57, |
70 | 0x88,0x06,0xcf,0xe9,0x5f,0x88,0x3e,0xcf, | 70 | 0x10,0x0d,0x9f,0xd2,0xbf,0x10,0x7d,0x9e, |
71 | 0x79,0x5c,0xe8,0x35,0x8f,0x42,0xdc,0x71, | 71 | 0xf2,0xb9,0xd0,0x6b,0x1e,0x85,0xb8,0xe2, |
72 | 0x36,0xd9,0x49,0x28,0x49,0x0e,0x49,0xda, | 72 | 0x6d,0xb2,0x92,0x50,0x92,0x1c,0x93,0xb4, |
73 | 0x4b,0x22,0x45,0x32,0x61,0x52,0xb8,0x10, | 73 | 0x96,0x44,0x8a,0x64,0xc2,0xa5,0x70,0x20, |
74 | 0x6f,0x9e,0x9e,0xb8,0xb8,0x6c,0x6e,0x96, | 74 | 0xdf,0x3d,0x3d,0x71,0x70,0xd8,0xdd,0x2d, |
75 | 0x98,0x88,0xac,0xcc,0x15,0x57,0x80,0x0e, | 75 | 0x31,0x11,0x59,0x98,0x2a,0xaf,0x00,0x1d, |
76 | 0xff,0xd9,0xff,0x2b,0xfd,0x07,0xf1,0xef, | 76 | 0xff,0xb3,0xfe,0x57,0xfa,0x0f,0xe3,0xdf, |
77 | 0xdb,0x9f,0x26,0xbd,0x28,0x71,0x0e,0xd9, | 77 | 0xb7,0x3e,0x4d,0x7a,0x50,0xe2,0x1d,0xb3, |
78 | 0xd9,0x2b,0x29,0x05,0x09,0xe1,0xcb,0xbb, | 78 | 0xb2,0x56,0x52,0x0a,0x13,0xc3,0x97,0x76, |
79 | 0x46,0x64,0x6a,0xa6,0x80,0x28,0xff,0x0d, | 79 | 0x8c,0xc8,0xd5,0x4d,0x00,0x51,0xfe,0x1b, |
80 | 0xfd,0xd3,0xf3,0x17,0xd5,0x8f,0x02,0xdd, | 80 | 0xfb,0xa7,0xe6,0x2f,0xab,0x1e,0x05,0xbb, |
81 | 0xf1,0x33,0xd9,0x57,0x28,0x0d,0x0f,0xd1, | 81 | 0xe2,0x67,0xb2,0xae,0x50,0x1a,0x1f,0xa3, |
82 | 0xdf,0x1b,0x3d,0xa5,0x72,0x20,0xd3,0x3d, | 82 | 0xbe,0x36,0x7b,0x4a,0xe4,0x41,0xa6,0x7a, |
83 | 0x15,0x71,0x80,0xda,0xfd,0x21,0xf1,0x3b, | 83 | 0x2a,0xe3,0x01,0xb5,0xfa,0x43,0xe2,0x77, |
84 | 0xd9,0x67,0x28,0xad,0x0c,0x11,0xd7,0x9b, | 84 | 0xb2,0xce,0x51,0x5a,0x18,0x23,0xaf,0x36, |
85 | 0x0e,0xa5,0xd8,0x23,0x2f,0x35,0x1d,0x41, | 85 | 0x1d,0x4b,0xb0,0x46,0x5e,0x6a,0x3a,0x83, |
86 | 0xb0,0x7a,0x5e,0xe2,0x39,0xb3,0x6a,0x54, | 86 | 0x60,0xf4,0xbd,0xc4,0x73,0x66,0xd4,0xa9, |
87 | 0x82,0x04,0xf3,0xe5,0xd7,0xa3,0x0e,0x35, | 87 | 0x04,0x09,0xe7,0xcb,0xaf,0x46,0x1c,0x6b, |
88 | 0xdb,0x43,0x24,0x75,0x26,0xc1,0x29,0x79, | 88 | 0xb6,0x86,0x48,0xea,0x4d,0x82,0x52,0xf2, |
89 | 0x08,0xe9,0xcd,0x8b,0x52,0xc4,0x11,0x67, | 89 | 0x11,0xd3,0x9b,0x16,0xa5,0x88,0x22,0xcf, |
90 | 0x98,0xae,0xac,0x18,0x17,0xaf,0x8e,0x1e, | 90 | 0x31,0x5d,0x58,0x30,0x2f,0x5f,0x1c,0x3d, |
91 | 0xdb,0xb9,0x26,0x69,0x2a,0x89,0x00,0xc9, | 91 | 0xb7,0x72,0x4c,0xd2,0x55,0x12,0x01,0x93, |
92 | 0xfd,0x4b,0xf0,0x47,0xde,0x6f,0x3a,0x9d, | 92 | 0xfa,0x97,0xe0,0x8f,0xbc,0xde,0x75,0x3a, |
93 | 0x60,0xb0,0xbc,0x5c,0x76,0x36,0xcb,0x49, | 93 | 0xc1,0x61,0x78,0xb8,0xec,0x6d,0x96,0x92, |
94 | 0x44,0x48,0x66,0x4e,0xaa,0x58,0x02,0x2f, | 94 | 0x88,0x90,0xcc,0x9d,0x54,0xb0,0x04,0x5f, |
95 | 0xf3,0x1f,0xd5,0xbf,0x02,0x7d,0xf2,0xf3, | 95 | 0xe6,0x3f,0xab,0x7e,0x04,0xfb,0xe5,0xe7, |
96 | 0xd1,0xd7,0x1b,0x0d,0xa5,0xd2,0x23,0x13, | 96 | 0xa3,0xae,0x36,0x1b,0x4b,0xa4,0x46,0x26, |
97 | 0x35,0x95,0x42,0x80,0x70,0xfe,0xdd,0xf9, | 97 | 0x6b,0x2a,0x85,0x00,0xe1,0xfd,0xbb,0xf2, |
98 | 0x33,0xe9,0x57,0x88,0x0e,0xcf,0xd9,0x5f, | 98 | 0x67,0xd2,0xaf,0x10,0x1d,0x9f,0xb2,0xbe, |
99 | 0x28,0x3d,0x0f,0x71,0xdc,0xdb,0x35,0x25, | 99 | 0x50,0x7a,0x1e,0xe3,0xb9,0xb6,0x6a,0x4a, |
100 | 0x41,0x20,0x79,0x3e,0xe9,0x79,0x88,0xea, | 100 | 0x82,0x40,0xf2,0x7d,0xd2,0xf3,0x11,0xd5, |
101 | 0xcd,0x81,0x52,0xf8,0x11,0xef,0x9b,0x9e, | 101 | 0x9b,0x02,0xa5,0xf0,0x23,0xdf,0x37,0x3d, |
102 | 0xa6,0xb8,0x28,0x6f,0x0e,0x9d,0xd8,0xb3, | 102 | 0x4d,0x70,0x50,0xde,0x1d,0x3b,0xb1,0x66, |
103 | 0x2c,0x55,0x16,0x01,0x8b,0xfa,0xc7,0xe1, | 103 | 0x58,0xaa,0x2c,0x03,0x17,0xf5,0x8f,0xc2, |
104 | 0x6f,0xb8,0x9e,0x6c,0xba,0x94,0x60,0x86, | 104 | 0xdf,0x71,0x3c,0xd9,0x75,0x28,0xc1,0x0d, |
105 | 0xbc,0xe8,0x75,0x8e,0xc2,0xd9,0x71,0x28, | 105 | 0x79,0xd0,0xeb,0x1d,0x85,0xb2,0xe2,0x51, |
106 | 0xd9,0x0d,0x29,0xd1,0x0b,0x19,0xc5,0xab, | 106 | 0xb2,0x1a,0x53,0xa2,0x16,0x33,0x8b,0x56, |
107 | 0x62,0x04,0xb3,0xe4,0x57,0xa6,0x0e,0x2b, | 107 | 0xc4,0x09,0x67,0xc8,0xaf,0x4c,0x1c,0x57, |
108 | 0xdb,0x07,0x25,0xed,0x23,0x91,0x36,0x99, | 108 | 0xb6,0x0e,0x4b,0xda,0x47,0x22,0x6d,0x32, |
109 | 0x48,0xa8,0x4c,0x0e,0x57,0xda,0x0f,0x23, | 109 | 0x91,0x50,0x98,0x1c,0xaf,0xb4,0x1e,0x47, |
110 | 0xdd,0x37,0x31,0x4d,0x58,0x50,0x2e,0x1f, | 110 | 0xba,0x6e,0x62,0x9a,0xb0,0xa0,0x5c,0x3e, |
111 | 0x1b,0xbd,0xa6,0x72,0x2a,0xd3,0x01,0x15, | 111 | 0x37,0x7b,0x4c,0xe4,0x55,0xa6,0x02,0x2b, |
112 | 0xf9,0x83,0xea,0xf7,0x81,0xce,0xfb,0x59, | 112 | 0xf3,0x07,0xd5,0xef,0x03,0x9d,0xf6,0xb3, |
113 | 0xe4,0x2b,0xa7,0x06,0x2d,0xeb,0x13,0x85, | 113 | 0xc8,0x57,0x4e,0x0c,0x5b,0xd6,0x27,0x0b, |
114 | 0x96,0xe2,0x89,0xb0,0xca,0x5d,0x42,0x30, | 114 | 0x2d,0xc5,0x13,0x61,0x94,0xba,0x84,0x60, |
115 | 0x73,0x5e,0xd4,0x39,0x07,0x69,0xec,0x8b, | 115 | 0xe6,0xbd,0xa8,0x72,0x0e,0xd3,0xd9,0x17, |
116 | 0x94,0xc6,0x85,0x68,0xe0,0x8d,0xbc,0xd2, | 116 | 0x29,0x8d,0x0a,0xd1,0xc1,0x1b,0x79,0xa4, |
117 | 0x75,0x12,0xc1,0x91,0x7a,0x98,0xe0,0xad, | 117 | 0xea,0x25,0x83,0x22,0xf5,0x31,0xc1,0x5b, |
118 | 0xbc,0x12,0x77,0x92,0xce,0x91,0x58,0x98, | 118 | 0x78,0x24,0xef,0x25,0x9d,0x22,0xb1,0x30, |
119 | 0x2c,0xaf,0x14,0x1d,0x87,0xb2,0xee,0x51, | 119 | 0x59,0x5e,0x28,0x3b,0x0f,0x65,0xdc,0xa3, |
120 | 0x9a,0x1a,0xa3,0xa0,0x36,0x3f,0x4b,0x7c, | 120 | 0x34,0x35,0x47,0x40,0x6c,0x7e,0x96,0xf8, |
121 | 0x44,0xf6,0x65,0xca,0xa3,0x40,0x34,0x7f, | 121 | 0x89,0xec,0xcb,0x95,0x46,0x80,0x68,0xfe, |
122 | 0x46,0xfc,0x69,0xf6,0x8b,0xc8,0xc7,0x4d, | 122 | 0x8d,0xf8,0xd3,0xed,0x17,0x91,0x8e,0x9a, |
123 | 0x6c,0x50,0x96,0x1c,0x8b,0xb4,0xc6,0x45, | 123 | 0xd8,0xa1,0x2c,0x39,0x17,0x69,0x8c,0x8a, |
124 | 0x6a,0x60,0x82,0xbc,0xf0,0x75,0xde,0xc3, | 124 | 0xd4,0xc1,0x05,0x79,0xe0,0xeb,0xbd,0x86, |
125 | 0x39,0x75,0x68,0xc0,0x8d,0x7c,0xd0,0xf5, | 125 | 0x72,0xea,0xd1,0x81,0x1a,0xf9,0xa1,0xea, |
126 | 0x1d,0xc1,0xb3,0x7a,0x54,0xe2,0x05,0xb3, | 126 | 0x3b,0x83,0x66,0xf4,0xa9,0xc4,0x0b,0x67, |
127 | 0xe2,0x57,0xb2,0x0e,0x53,0xda,0x17,0x23, | 127 | 0xc4,0xaf,0x64,0x1c,0xa7,0xb4,0x2e,0x47, |
128 | 0x8d,0x36,0xd1,0x49,0x18,0x49,0xae,0x4a, | 128 | 0x1a,0x6d,0xa2,0x92,0x30,0x93,0x5c,0x94, |
129 | 0x1a,0x43,0xa2,0x76,0x32,0xcb,0x51,0x44, | 129 | 0x34,0x87,0x44,0xec,0x65,0x96,0xa2,0x88, |
130 | 0x18,0x67,0xae,0xae,0x18,0x1b,0xaf,0xa6, | 130 | 0x30,0xcf,0x5d,0x5c,0x30,0x37,0x5f,0x4c, |
131 | 0x1e,0x2b,0xbb,0x06,0x65,0xea,0xa3,0x80, | 131 | 0x3c,0x57,0x76,0x0c,0xcb,0xd5,0x47,0x00, |
132 | 0x36,0xff,0x49,0xfc,0x4b,0xf6,0x47,0xca, | 132 | 0x6d,0xfe,0x93,0xf8,0x97,0xec,0x8f,0x94, |
133 | 0x6f,0x42,0x9c,0x70,0xb6,0xdc,0x49,0x36, | 133 | 0xde,0x85,0x38,0xe1,0x6d,0xb8,0x92,0x6c, |
134 | 0x49,0x4a,0x48,0x42,0x4e,0x72,0x5a,0xd2, | 134 | 0x92,0x94,0x90,0x84,0x9c,0xe4,0xb5,0xa4, |
135 | 0x21,0x13,0x39,0x95,0x6a,0x80,0x80,0xfc, | 135 | 0x42,0x26,0x73,0x2a,0xd5,0x01,0x01,0xf9, |
136 | 0xfd,0xf5,0xf3,0xc3,0xd7,0x77,0x0c,0xcd, | 136 | 0xfb,0xeb,0xe7,0x87,0xae,0xee,0x19,0x9b, |
137 | 0xd5,0x53,0x00,0x15,0xff,0x83,0xfe,0xf7, | 137 | 0xaa,0xa6,0x00,0x2b,0xff,0x07,0xfd,0xef, |
138 | 0xf9,0xcf,0xeb,0x5f,0x84,0x3e,0xe7,0x79, | 138 | 0xf3,0x9f,0xd6,0xbf,0x08,0x7d,0xce,0xf3, |
139 | 0xac,0xea,0x15,0x83,0x82,0xf6,0xf1,0xc9, | 139 | 0x59,0xd4,0x2b,0x07,0x05,0xed,0xe3,0x93, |
140 | 0xdb,0x4b,0x24,0x45,0x26,0x61,0x2a,0xb9, | 140 | 0xb6,0x96,0x48,0x8a,0x4c,0xc2,0x55,0x72, |
141 | 0x00,0x69,0xfe,0x8b,0xf8,0xc7,0xed,0x6f, | 141 | 0x00,0xd3,0xfd,0x17,0xf1,0x8f,0xda,0xdf, |
142 | 0x90,0x9e,0x9c,0xb8,0xb4,0x6c,0x46,0x96, | 142 | 0x21,0x3d,0x39,0x71,0x68,0xd8,0x8d,0x2c, |
143 | 0x68,0x8a,0x8c,0xc0,0xd5,0x7d,0x00,0xf1, | 143 | 0xd1,0x15,0x19,0x81,0xaa,0xfa,0x01,0xe3, |
144 | 0xfd,0xdb,0xf3,0x27,0xd5,0x2f,0x01,0x1d, | 144 | 0xfb,0xb7,0xe6,0x4f,0xaa,0x5e,0x02,0x3b, |
145 | 0xf9,0xb3,0xea,0x57,0x82,0x0e,0xf3,0xd9, | 145 | 0xf3,0x67,0xd4,0xaf,0x04,0x1d,0xe7,0xb3, |
146 | 0xd7,0x2b,0x0d,0x05,0xd1,0xe3,0x1b,0xb5, | 146 | 0xae,0x56,0x1a,0x0b,0xa3,0xc6,0x37,0x6b, |
147 | 0xa6,0x42,0x2a,0x73,0x02,0xd5,0xf1,0x03, | 147 | 0x4c,0x84,0x54,0xe6,0x05,0xab,0xe2,0x07, |
148 | 0xd9,0xf7,0x2b,0xcd,0x07,0x51,0xec,0x1b, | 148 | 0xb3,0xee,0x57,0x9a,0x0e,0xa3,0xd8,0x37, |
149 | 0x97,0xa6,0x8e,0x28,0xdb,0x0d,0x25,0xd1, | 149 | 0x2f,0x4d,0x1c,0x51,0xb6,0x1a,0x4b,0xa2, |
150 | 0x23,0x19,0x35,0xa9,0x42,0x08,0x73,0xce, | 150 | 0x46,0x32,0x6b,0x52,0x84,0x10,0xe7,0x9d, |
151 | 0xd7,0x59,0x0c,0x29,0xd7,0x0b,0x0d,0xc5, | 151 | 0xae,0xb2,0x18,0x53,0xae,0x16,0x1b,0x8b, |
152 | 0xd3,0x63,0x14,0xb5,0x84,0x42,0xe6,0x71, | 152 | 0xa6,0xc6,0x29,0x6b,0x08,0x85,0xcc,0xe3, |
153 | 0xaa,0xda,0x01,0x23,0xf9,0x37,0xe9,0x4f, | 153 | 0x55,0xb4,0x02,0x47,0xf2,0x6f,0xd2,0x9f, |
154 | 0x88,0x5e,0xce,0x39,0x5b,0x68,0x24,0x8f, | 154 | 0x10,0xbd,0x9c,0x72,0xb6,0xd0,0x49,0x1e, |
155 | 0x24,0xdd,0x25,0x31,0x21,0x59,0x38,0x29, | 155 | 0x49,0xba,0x4a,0x62,0x42,0xb2,0x70,0x52, |
156 | 0x6f,0x08,0x9d,0xcc,0xb3,0x54,0x54,0x06, | 156 | 0xde,0x11,0x3b,0x99,0x66,0xa8,0xa8,0x0c, |
157 | 0x07,0xeb,0xef,0x87,0x9e,0xee,0xb9,0x98, | 157 | 0x0f,0xd7,0xdf,0x0f,0x3d,0xdd,0x73,0x30, |
158 | 0x6a,0xae,0x80,0x18,0xff,0xad,0xfe,0x13, | 158 | 0xd5,0x5d,0x00,0x31,0xff,0x5b,0xfc,0x27, |
159 | 0xfb,0x97,0xe6,0x8f,0xa8,0xde,0x0d,0x3b, | 159 | 0xf7,0x2f,0xcd,0x1f,0x51,0xbc,0x1a,0x77, |
160 | 0xd1,0x67,0x18,0xad,0xac,0x12,0x17,0x93, | 160 | 0xa2,0xce,0x31,0x5b,0x58,0x24,0x2f,0x27, |
161 | 0x8e,0x96,0xd8,0x89,0x2c,0xc9,0x15,0x49, | 161 | 0x1d,0x2d,0xb1,0x12,0x59,0x92,0x2a,0x93, |
162 | 0x80,0x4a,0xfe,0x41,0xfa,0x7b,0xe2,0xe7, | 162 | 0x00,0x95,0xfc,0x83,0xf4,0xf7,0xc5,0xcf, |
163 | 0xb1,0xae,0x5a,0x1a,0x23,0xa3,0x36,0x35, | 163 | 0x63,0x5c,0xb4,0x34,0x47,0x46,0x6c,0x6a, |
164 | 0x4b,0x40,0x44,0x7e,0x66,0xfa,0xa9,0xe0, | 164 | 0x96,0x80,0x88,0xfc,0xcd,0xf5,0x53,0xc0, |
165 | 0x0b,0xbf,0xc6,0x7f,0x6a,0xfc,0x81,0xf4, | 165 | 0x17,0x7f,0x8c,0xfe,0xd5,0xf9,0x03,0xe9, |
166 | 0xfb,0xc5,0xe7,0x63,0xac,0xb6,0x14,0x4b, | 166 | 0xf7,0x8b,0xce,0xc7,0x59,0x6c,0x28,0x97, |
167 | 0x86,0x46,0xea,0x69,0x82,0x8a,0xf0,0xc1, | 167 | 0x0c,0x8d,0xd4,0xd3,0x05,0x15,0xe1,0x83, |
168 | 0xdd,0x7b,0x30,0xe5,0x5d,0xa0,0x32,0x3f, | 168 | 0xba,0xf6,0x61,0xca,0xbb,0x40,0x64,0x7e, |
169 | 0x53,0x7c,0x14,0xf7,0x85,0xce,0xe3,0x59, | 169 | 0xa6,0xf8,0x29,0xef,0x0b,0x9d,0xc6,0xb3, |
170 | 0xb4,0x2a,0x47,0x02,0x6d,0xf2,0x93,0xd0, | 170 | 0x68,0x54,0x8e,0x04,0xdb,0xe5,0x27,0xa1, |
171 | 0x97,0x1c,0x8d,0xb4,0xd2,0x45,0x12,0x61, | 171 | 0x2e,0x39,0x1b,0x69,0xa4,0x8a,0x24,0xc3, |
172 | 0x92,0xba,0x90,0x60,0x9e,0xbc,0xb8,0x74, | 172 | 0x25,0x75,0x20,0xc1,0x3d,0x79,0x70,0xe8, |
173 | 0x6e,0xc6,0x99,0x68,0xa8,0x8c,0x0c,0xd7, | 173 | 0xdd,0x8d,0x32,0xd1,0x51,0x18,0x19,0xaf, |
174 | 0xd5,0x0f,0x01,0xdd,0xfb,0x33,0xe5,0x57, | 174 | 0xaa,0x1e,0x03,0xbb,0xf6,0x67,0xca,0xaf, |
175 | 0xa0,0x0e,0x3f,0xdb,0x7f,0x24,0xfd,0x25, | 175 | 0x40,0x1c,0x7f,0xb6,0xfe,0x49,0xfa,0x4b, |
176 | 0xf1,0x23,0xd9,0x37,0x29,0x4d,0x08,0x51, | 176 | 0xe2,0x47,0xb2,0x6e,0x52,0x9a,0x10,0xa3, |
177 | 0xce,0x1b,0x5b,0xa4,0x26,0x27,0x2b,0x2d, | 177 | 0x9c,0x36,0xb7,0x48,0x4c,0x4e,0x56,0x5a, |
178 | 0x05,0x11,0xe1,0x9b,0xba,0xa6,0x60,0x2a, | 178 | 0x0a,0x23,0xc3,0x37,0x75,0x4c,0xc0,0x55, |
179 | 0xbf,0x00,0x7d,0xfe,0xf3,0xf9,0xd7,0xeb, | 179 | 0x7e,0x00,0xfb,0xfd,0xe7,0xf3,0xaf,0xd6, |
180 | 0x0f,0x85,0xde,0xe3,0x39,0xb5,0x6a,0x40, | 180 | 0x1f,0x0b,0xbd,0xc6,0x73,0x6a,0xd4,0x81, |
181 | 0x82,0x7c,0xf2,0xf5,0xd1,0xc3,0x1b,0x75, | 181 | 0x04,0xf9,0xe5,0xeb,0xa3,0x86,0x36,0xeb, |
182 | 0xa4,0xc2,0x25,0x73,0x20,0xd5,0x3d,0x01, | 182 | 0x49,0x84,0x4a,0xe6,0x41,0xaa,0x7a,0x02, |
183 | 0x71,0xf8,0xdb,0xed,0x27,0x91,0x2e,0x99, | 183 | 0xe3,0xf1,0xb7,0xda,0x4f,0x22,0x5d,0x32, |
184 | 0x18,0xa9,0xac,0x0a,0x17,0xc3,0x8f,0x76, | 184 | 0x31,0x53,0x58,0x14,0x2f,0x87,0x1e,0xed, |
185 | 0xdc,0xc9,0x35,0x49,0x40,0x48,0x7e,0x4e, | 185 | 0xb9,0x92,0x6a,0x92,0x80,0x90,0xfc,0x9d, |
186 | 0xfa,0x59,0xe2,0x2b,0xb3,0x06,0x55,0xe2, | 186 | 0xf4,0xb3,0xc4,0x57,0x66,0x0c,0xab,0xd4, |
187 | 0x03,0x83,0xf6,0xf7,0xc9,0xcf,0x4b,0x5c, | 187 | 0x07,0x07,0xed,0xef,0x93,0x9e,0x96,0xb8, |
188 | 0x04,0x3e,0x67,0x4e,0xac,0x60,0x17,0x7f, | 188 | 0x88,0x6c,0xce,0x95,0x58,0x80,0x2c,0xff, |
189 | 0x80,0xfe,0xc1,0xf9,0x7b,0xe8,0xe7,0x87, | 189 | 0x15,0xfd,0x83,0xf2,0xf7,0xd1,0xcf,0x1b, |
190 | 0xae,0xc2,0x19,0x93,0xfc,0x96,0x08,0x8f, | 190 | 0x5d,0xa4,0x32,0x27,0x53,0x2c,0x15,0x17, |
191 | 0xc0,0xe7,0xfc,0x2c,0xf0,0x1d,0xcc,0xc3, | 191 | 0x81,0x8e,0xfa,0xd9,0xe1,0x2b,0xb9,0x06, |
192 | 0x9e,0x70,0x00,0xc0,0x63,0x7f,0x54,0x78, | 192 | 0x69,0xea,0x8b,0x80,0xc6,0xfd,0x69,0xf0, |
193 | 0x40,0xfe,0x61,0x9b,0xf3,0x40,0x64,0x3f, | 193 | 0x8b,0xdc,0xc7,0x35,0x6d,0x40,0x90,0x7c, |
194 | 0x0f,0xf8,0x2c,0xf3,0x3f,0x99,0x83,0x2a, | 194 | 0x9e,0xf4,0xb9,0xc4,0x6b,0x66,0x84,0xa8, |
195 | 0x79,0x07,0xcb,0xe1,0x9f,0xcc,0xce,0x60, | 195 | 0xe4,0x0d,0xa7,0xd2,0x2f,0x13,0x1d,0x95, |
196 | 0x6c,0x00,0x84,0x7c,0x0f,0xf5,0xe8,0xcf, | 196 | 0xb2,0x82,0x50,0xf2,0x1d,0xd3,0xb3,0x16, |
197 | 0x15,0x66,0x80,0xb0,0xf8,0x5d,0xf4,0x33, | 197 | 0x55,0x8a,0x02,0xc3,0xf1,0x77,0xd8,0xcf, |
198 | 0x8a,0x57,0x44,0x0c,0x67,0xd6,0xaf,0x08, | 198 | 0x2d,0x5d,0x10,0x31,0x9f,0x5a,0xbc,0x20, |
199 | 0x1f,0xcf,0xb3,0x5e,0x54,0x3a,0x07,0x63, | 199 | 0x77,0x3e,0xcd,0x79,0x50,0xe8,0x1d,0x8f, |
200 | 0xec,0xb7,0x94,0x4e,0x86,0x58,0xea,0x2d, | 200 | 0xb2,0xde,0x51,0x3a,0x19,0x63,0xa8,0xb6, |
201 | 0x83,0x12,0xf5,0x91,0xc2,0x9b,0x70,0xa4, | 201 | 0x0c,0x4b,0xd6,0x47,0x0a,0x6d,0xc2,0x93, |
202 | 0xdc,0x25,0x37,0x21,0x4d,0x38,0x51,0x6e, | 202 | 0x70,0x94,0xdc,0x85,0x34,0xe1,0x45,0xb8, |
203 | 0x18,0x9b,0xac,0xa6,0x14,0x2b,0x87,0x06, | 203 | 0x62,0x6e,0xb2,0x98,0x50,0xae,0x1c,0x1b, |
204 | 0xed,0xe9,0x93,0x8a,0x96,0xc0,0x89,0x7c, | 204 | 0xb7,0xa6,0x4e,0x2a,0x5b,0x02,0x25,0xf3, |
205 | 0xc8,0xf5,0x4d,0xc0,0x53,0x7e,0x14,0xfb, | 205 | 0x23,0xd5,0x37,0x01,0x4d,0xf8,0x53,0xee, |
206 | 0x85,0xe6,0xe3,0xa9,0xb6,0x0a,0x4b,0xc2, | 206 | 0x17,0x9b,0x8e,0xa6,0xd8,0x29,0x2f,0x09, |
207 | 0x47,0x72,0x6c,0xd2,0x95,0x10,0x81,0x9c, | 207 | 0x1d,0xc9,0xb3,0x4a,0x54,0x42,0x06,0x73, |
208 | 0xfa,0xb5,0xe0,0x43,0xbe,0x76,0x7a,0xca, | 208 | 0xea,0xd7,0x81,0x0e,0xf9,0xd9,0xeb,0x2b, |
209 | 0xe1,0x41,0xb8,0x7a,0x6e,0xe2,0x99,0xb0, | 209 | 0x85,0x06,0xe1,0xe9,0xbb,0x8a,0x66,0xc2, |
210 | 0xaa,0x5c,0x02,0x37,0xf3,0x4f,0xd4,0x5f, | 210 | 0xa9,0x70,0x08,0xdf,0xcd,0x3f,0x51,0x7c, |
211 | 0x06,0x3d,0xeb,0x73,0x84,0xd6,0xe5,0x09, | 211 | 0x18,0xf7,0xad,0xce,0x13,0x5b,0x94,0x26, |
212 | 0xa1,0xca,0x3b,0x43,0x64,0x74,0xa6,0xc4, | 212 | 0x87,0x28,0xed,0x0d,0x91,0xd2,0x9b,0x10, |
213 | 0x29,0x67,0x08,0xad,0xcc,0x13,0x57,0x94, | 213 | 0xa5,0x9c,0x22,0xb7,0x30,0x4d,0x5e,0x50, |
214 | 0x0e,0x87,0xd8,0xef,0x2d,0x9d,0x12,0xb1, | 214 | 0x3a,0x1f,0x63,0xbc,0xb6,0x74,0x4a,0xc6, |
215 | 0x90,0x5a,0x9e,0x20,0xbb,0x3c,0x65,0x76, | 215 | 0x41,0x6a,0x78,0x82,0xec,0xf1,0x95,0xda, |
216 | 0xa0,0xc8,0x3d,0x4f,0x70,0x5c,0xde,0x35, | 216 | 0x83,0x20,0xf5,0x3d,0xc1,0x73,0x78,0xd4, |
217 | 0x3b,0x41,0x64,0x78,0xa6,0xec,0x29,0x97, | 217 | 0xed,0x05,0x91,0xe2,0x9b,0xb0,0xa6,0x5c, |
218 | 0x0a,0x8d,0xc0,0xd3,0x7d,0x14,0xf1,0x85, | 218 | 0x2a,0x37,0x03,0x4d,0xf4,0x53,0xc6,0x17, |
219 | 0xda,0xe3,0x21,0xb5,0x3a,0x41,0x62,0x78, | 219 | 0x6b,0x8c,0x86,0xd4,0xe9,0x05,0x89,0xe2, |
220 | 0xb2,0xec,0x51,0x96,0x1a,0x8b,0xa0,0xc6, | 220 | 0xcb,0xb1,0x46,0x58,0x6a,0x2e,0x83,0x18, |
221 | 0x3d,0x6b,0x70,0x84,0xdc,0xe5,0x35,0xa1, | 221 | 0xf5,0xad,0xc2,0x13,0x73,0x94,0xd6,0x85, |
222 | 0x42,0x38,0x73,0x6e,0xd4,0x99,0x04,0xa9, | 222 | 0x08,0xe1,0xcd,0xbb,0x52,0x64,0x12,0xa7, |
223 | 0xe4,0x0b,0xa7,0xc6,0x2f,0x6b,0x1c,0x85, | 223 | 0x90,0x2e,0x9f,0x18,0xbd,0xac,0x72,0x16, |
224 | 0xb4,0xe2,0x45,0xb2,0x62,0x52,0xb2,0x10, | 224 | 0xd3,0x89,0x16,0xc9,0x89,0x4a,0xc8,0x41, |
225 | 0x53,0x9e,0x16,0xbb,0x88,0x66,0xce,0xa9, | 225 | 0x4e,0x78,0x5a,0xee,0x21,0x9b,0x3a,0xa5, |
226 | 0x58,0x08,0x2f,0xcf,0x1f,0x5d,0xbc,0x32, | 226 | 0x60,0x20,0xbf,0x3c,0x7d,0x76,0xf0,0xc9, |
227 | 0x77,0x52,0xcc,0x11,0x57,0x98,0x0e,0xaf, | 227 | 0xdd,0x4b,0x30,0x45,0x5e,0x60,0x3a,0xbf, |
228 | 0xd8,0x1f,0x2f,0xbd,0x1e,0x71,0xba,0xda, | 228 | 0x60,0x7c,0xbe,0xf4,0x79,0xc6,0xeb,0x69, |
229 | 0x61,0x22,0xb9,0x30,0x69,0x5e,0x88,0x38, | 229 | 0x84,0x8a,0xe4,0xc1,0xa5,0x7a,0x20,0xe3, |
230 | 0xcf,0x6d,0x5c,0x90,0x34,0x9f,0x44,0xbc, | 230 | 0x3d,0xb5,0x72,0x40,0xd2,0x7d,0x12,0xf1, |
231 | 0x64,0x76,0xa6,0xc8,0x29,0x4f,0x08,0x5d, | 231 | 0x91,0xda,0x9b,0x20,0xa5,0x3c,0x21,0x77, |
232 | 0xce,0x33,0x5b,0x54,0x24,0x07,0x27,0xed, | 232 | 0x38,0xcd,0x6d,0x50,0x90,0x1c,0x9f,0xb4, |
233 | 0x2f,0x91,0x1e,0x99,0xb8,0xaa,0x6c,0x02, | 233 | 0xbe,0x44,0x7a,0x66,0xe2,0xa9,0xb0,0x0a, |
234 | 0x97,0xf0,0x8f,0xdc,0xdf,0x35,0x3d,0x41, | 234 | 0x5f,0xc2,0x3f,0x73,0x7c,0xd4,0xf5,0x05, |
235 | 0x70,0x78,0xde,0xed,0x39,0x91,0x6a,0x98, | 235 | 0xc1,0xe3,0x7b,0xb4,0xe6,0x45,0xaa,0x62, |
236 | 0x80,0xac,0xfc,0x15,0xf7,0x83,0xce,0xf7, | 236 | 0x02,0xb3,0xf0,0x57,0xde,0x0f,0x3b,0xdd, |
237 | 0x59,0xcc,0x2b,0x57,0x04,0x0d,0xe7,0xd3, | 237 | 0x67,0x30,0xad,0x5c,0x10,0x37,0x9f,0x4e, |
238 | 0xaf,0x16,0x1d,0x8b,0xb2,0xc6,0x51,0x6a, | 238 | 0xbc,0x58,0x76,0x2e,0xcb,0x19,0x45,0xa8, |
239 | 0x18,0x83,0xac,0xf6,0x15,0xcb,0x83,0x46, | 239 | 0x62,0x0e,0xb3,0xd8,0x57,0x2e,0x0d,0x1b, |
240 | 0xf4,0x69,0xc6,0x8b,0x68,0xc4,0x8d,0x64, | 240 | 0xd1,0xa7,0x1a,0x2d,0xa3,0x12,0x35,0x93, |
241 | 0xd0,0xa5,0x1c,0x21,0xb7,0x3a,0x4d,0x62, | 241 | 0x42,0x94,0x70,0x86,0xdc,0xe9,0x35,0x89, |
242 | 0x50,0xb2,0x1c,0x53,0xb6,0x16,0x4b,0x8a, | 242 | 0x42,0xc8,0x71,0x4e,0xd8,0x59,0x2e,0x29, |
243 | 0x46,0xc2,0x69,0x72,0x88,0xd0,0xcd,0x1d, | 243 | 0x1b,0x09,0xa5,0xca,0x23,0x43,0x34,0x75, |
244 | 0x51,0xb0,0x1a,0x5f,0xa2,0x3e,0x33,0x7b, | 244 | 0x46,0xc0,0x69,0x7e,0x88,0xf8,0xcd,0xed, |
245 | 0x54,0xe4,0x05,0xa7,0xe2,0x2f,0xb3,0x1e, | 245 | 0x53,0x90,0x16,0x9f,0x88,0xbe,0xcc,0x79, |
246 | 0x55,0xba,0x02,0x63,0xf2,0xb7,0xd0,0x4f, | 246 | 0x56,0xe8,0x09,0x8f,0xca,0xdf,0x41,0x3c, |
247 | 0x1e,0x5d,0xba,0x32,0x63,0x52,0xb4,0x10, | 247 | 0x79,0x76,0xe8,0xc9,0x8d,0x4a,0xd0,0x41, |
248 | 0x47,0x9e,0x6e,0xba,0x98,0x60,0xae,0xbc, | 248 | 0x1e,0x79,0xba,0xea,0x61,0x82,0xba,0xf0, |
249 | 0x18,0x77,0xae,0xce,0x19,0x5b,0xa8,0x26, | 249 | 0x61,0xde,0xbb,0x38,0x65,0x6e,0xa0,0x98, |
250 | 0x0f,0x2b,0xdd,0x07,0x31,0xed,0x5b,0x90, | 250 | 0x3c,0xaf,0x74,0x1c,0xc7,0xb5,0x6e,0x40, |
251 | 0x26,0x9f,0x28,0xbd,0x0c,0x71,0xd6,0xdb, | 251 | 0x9a,0x7c,0xa2,0xf4,0x31,0xc7,0x5b,0x6c, |
252 | 0x09,0x25,0xc9,0x23,0x49,0x34,0x49,0x46, | 252 | 0x24,0x97,0x24,0x8d,0x24,0xd1,0x25,0x19, |
253 | 0x48,0x6a,0x4e,0x82,0x58,0xf2,0x2d,0xd3, | 253 | 0x21,0xa9,0x3a,0x09,0x63,0xc8,0xb7,0x4c, |
254 | 0x13,0x15,0x95,0x82,0x82,0xf0,0xf1,0xdd, | 254 | 0x4c,0x56,0x56,0x0a,0x0b,0xc3,0xc7,0x77, |
255 | 0xdb,0x33,0x25,0x55,0x20,0x01,0x3f,0xf9, | 255 | 0x6c,0xcc,0x95,0x54,0x80,0x04,0xff,0xe5, |
256 | 0x7f,0xe8,0xff,0x8d,0xfe,0xd3,0xf9,0x17, | 256 | 0xff,0xa3,0xfe,0x37,0xfb,0x4f,0xe4,0x5f, |
257 | 0xe9,0x8f,0x8a,0xde,0xc1,0x39,0x79,0x68, | 257 | 0xa6,0x3e,0x2b,0x7b,0x04,0xe5,0xe5,0xa3, |
258 | 0xe8,0x8d,0x8c,0xd2,0xd5,0x11,0x01,0x99, | 258 | 0xa2,0x36,0x33,0x4b,0x54,0x44,0x06,0x67, |
259 | 0xfa,0xab,0xe0,0x07,0xbf,0xee,0x7f,0x9a, | 259 | 0xea,0xaf,0x80,0x1e,0xff,0xb9,0xfe,0x6b, |
260 | 0xfe,0xa1,0xf8,0x3b,0xef,0x67,0x9c,0xae, | 260 | 0xfa,0x87,0xe0,0xef,0xbd,0x9e,0x72,0xba, |
261 | 0xb4,0x18,0x47,0xae,0x6e,0x1a,0x9b,0xa0, | 261 | 0xd0,0x61,0x1e,0xb9,0xb8,0x6a,0x6e,0x82, |
262 | 0xa6,0x3c,0x2b,0x77,0x04,0xcd,0xe5,0x53, | 262 | 0x98,0xf0,0xad,0xdc,0x13,0x37,0x95,0x4e, |
263 | 0xa0,0x16,0x3f,0x8b,0x7e,0xc4,0xf9,0x65, | 263 | 0x80,0x58,0xfe,0x2d,0xfb,0x13,0xe5,0x97, |
264 | 0xe8,0xa3,0x8c,0x36,0xd7,0x49,0x0c,0x49, | 264 | 0xa2,0x8e,0x30,0xdb,0x5d,0x24,0x31,0x27, |
265 | 0xd6,0x4b,0x0a,0x45,0xc2,0x63,0x72,0xb4, | 265 | 0x59,0x2c,0x29,0x17,0x09,0x8d,0xca,0xd3, |
266 | 0xd0,0x45,0x1e,0x61,0xba,0xba,0x60,0x62, | 266 | 0x41,0x14,0x79,0x86,0xea,0xe9,0x81,0x8a, |
267 | 0xbe,0xb0,0x78,0x5e,0xee,0x39,0x9b,0x6a, | 267 | 0xfa,0xc1,0xe1,0x7b,0xb8,0xe6,0x6d,0xaa, |
268 | 0xa4,0x80,0x24,0xff,0x25,0xfd,0x23,0xf1, | 268 | 0x92,0x00,0x93,0xfc,0x97,0xf4,0x8f,0xc4, |
269 | 0x37,0xd9,0x4f,0x28,0x5d,0x0e,0x31,0xdb, | 269 | 0xdf,0x65,0x3c,0xa1,0x74,0x38,0xc7,0x6d, |
270 | 0x5b,0x24,0x25,0x27,0x21,0x2d,0x39,0x11, | 270 | 0x6c,0x90,0x94,0x9c,0x84,0xb4,0xe4,0x45, |
271 | 0x69,0x98,0x8a,0xac,0xc0,0x15,0x7f,0x80, | 271 | 0xa6,0x62,0x2a,0xb3,0x00,0x55,0xfe,0x03, |
272 | 0xfe,0xfd,0xf9,0xf3,0xeb,0xd7,0x87,0x0e, | 272 | 0xfb,0xf7,0xe7,0xcf,0xaf,0x5e,0x1c,0x3b, |
273 | 0xed,0xd9,0x93,0x2a,0x95,0x00,0x81,0xfc, | 273 | 0xb7,0x66,0x4c,0xaa,0x54,0x02,0x07,0xf3, |
274 | 0xfb,0xf5,0xe7,0xc3,0xaf,0x76,0x1c,0xcb, | 274 | 0xef,0xd7,0x9f,0x0e,0xbd,0xd8,0x73,0x2e, |
275 | 0xb5,0x46,0x40,0x6a,0x7e,0x82,0xf8,0xf1, | 275 | 0xd5,0x19,0x01,0xa9,0xfa,0x0b,0xe3,0xc7, |
276 | 0xed,0xdb,0x93,0x26,0x95,0x28,0x81,0x0c, | 276 | 0xb7,0x6e,0x4c,0x9a,0x54,0xa2,0x04,0x33, |
277 | 0xf9,0xd5,0xeb,0x03,0x85,0xf6,0xe3,0xc9, | 277 | 0xe7,0x57,0xac,0x0e,0x17,0xdb,0x8f,0x26, |
278 | 0xb7,0x4a,0x4c,0x42,0x56,0x72,0x0a,0xd3, | 278 | 0xdd,0x29,0x31,0x09,0x59,0xc8,0x2b,0x4f, |
279 | 0xc1,0x17,0x79,0x8c,0xea,0xd5,0x81,0x02, | 279 | 0x04,0x5d,0xe6,0x33,0xab,0x56,0x04,0x0b, |
280 | 0xf9,0xf1,0xeb,0xdb,0x87,0x26,0xed,0x29, | 280 | 0xe7,0xc7,0xaf,0x6e,0x1c,0x9b,0xb4,0xa6, |
281 | 0x91,0x0a,0x99,0xc0,0xab,0x7c,0x04,0xf7, | 281 | 0x44,0x2a,0x67,0x02,0xad,0xf0,0x13,0xdf, |
282 | 0xe5,0xcf,0xa3,0x5e,0x34,0x3b,0x47,0x64, | 282 | 0x97,0x3e,0x8d,0x78,0xd0,0xed,0x1d,0x91, |
283 | 0x6c,0xa6,0x94,0x28,0x87,0x0c,0xed,0xd5, | 283 | 0xb2,0x9a,0x50,0xa2,0x1c,0x33,0xb7,0x56, |
284 | 0x93,0x02,0x95,0xf0,0x83,0xdc,0xf7,0x35, | 284 | 0x4c,0x0a,0x57,0xc2,0x0f,0x73,0xdc,0xd7, |
285 | 0xcd,0x43,0x50,0x74,0x1e,0xc7,0xb9,0x6e, | 285 | 0x35,0x0d,0x41,0xd0,0x7b,0x1e,0xe5,0xb9, |
286 | 0x68,0x9a,0x8c,0xa0,0xd4,0x3d,0x07,0x71, | 286 | 0xa2,0x6a,0x32,0x83,0x50,0xf4,0x1d,0xc7, |
287 | 0xec,0xdb,0x95,0x26,0x81,0x28,0xf9,0x0d, | 287 | 0xb3,0x6e,0x54,0x9a,0x04,0xa3,0xe4,0x37, |
288 | 0xe9,0xd3,0x8b,0x16,0xc5,0x89,0x62,0xc8, | 288 | 0xa7,0x4e,0x2c,0x5b,0x16,0x25,0x8b,0x22, |
289 | 0xb1,0x4c,0x58,0x56,0x2e,0x0b,0x1b,0xc5, | 289 | 0xc5,0x31,0x61,0x58,0xb8,0x2c,0x6f,0x16, |
290 | 0xa7,0x62,0x2c,0xb3,0x14,0x55,0x86,0x02, | 290 | 0x9d,0x88,0xb2,0xcc,0x51,0x56,0x18,0x0b, |
291 | 0xeb,0xf1,0x87,0xda,0xef,0x21,0x9d,0x3a, | 291 | 0xaf,0xc6,0x1f,0x6b,0xbc,0x86,0x74,0xea, |
292 | 0xb1,0x60,0x58,0xbe,0x2c,0x7b,0x16,0xe5, | 292 | 0xc5,0x81,0x62,0xf8,0xb1,0xec,0x5b,0x96, |
293 | 0x89,0xa2,0xca,0x31,0x43,0x58,0x74,0x2e, | 293 | 0x26,0x8b,0x28,0xc5,0x0d,0x61,0xd0,0xbb, |
294 | 0xc7,0x19,0x6d,0xa8,0x92,0x0c,0x93,0xd4, | 294 | 0x1c,0x65,0xb6,0xa2,0x48,0x32,0x4f,0x52, |
295 | 0x97,0x04,0x8d,0xe4,0xd3,0xa5,0x16,0x21, | 295 | 0x5c,0x12,0x37,0x93,0x4e,0x94,0x58,0x86, |
296 | 0x8b,0x3a,0xc5,0x61,0x60,0xb8,0xbc,0x6c, | 296 | 0x2c,0xeb,0x15,0x85,0x82,0xe2,0xf1,0xb1, |
297 | 0x76,0x96,0xc8,0x89,0x4c,0xc8,0x55,0x4e, | 297 | 0xda,0x5b,0x22,0x25,0x33,0x21,0x55,0x38, |
298 | 0x00,0x5b,0xfe,0x27,0xfb,0x2f,0xe5,0x1f, | 298 | 0x01,0x6f,0xf8,0x9f,0xec,0xbf,0x94,0x7e, |
299 | 0xa1,0xbe,0x3a,0x7b,0x62,0xe4,0xb1,0xa4, | 299 | 0x86,0xf8,0xe9,0xed,0x8b,0x92,0xc6,0x91, |
300 | 0x5a,0x26,0x23,0x2b,0x35,0x05,0x41,0xe0, | 300 | 0x68,0x98,0x8c,0xac,0xd4,0x15,0x07,0x81, |
301 | 0x7b,0xbe,0xe6,0x79,0xaa,0xea,0x01,0x83, | 301 | 0xee,0xfb,0x99,0xe6,0xab,0xa8,0x06,0x0f, |
302 | 0xfa,0xf7,0xe1,0xcf,0xbb,0x5e,0x64,0x3a, | 302 | 0xeb,0xdf,0x87,0x3e,0xed,0x79,0x90,0xea, |
303 | 0xa7,0x60,0x2c,0xbf,0x14,0x7d,0x86,0xf2, | 303 | 0x9d,0x80,0xb2,0xfc,0x51,0xf6,0x1b,0xcb, |
304 | 0xe9,0xd1,0x8b,0x1a,0xc5,0xa1,0x62,0x38, | 304 | 0xa7,0x46,0x2c,0x6b,0x16,0x85,0x88,0xe2, |
305 | 0xb3,0x6c,0x54,0x96,0x04,0x8b,0xe4,0xc7, | 305 | 0xcd,0xb1,0x52,0x58,0x12,0x2f,0x93,0x1e, |
306 | 0xa5,0x6e,0x20,0x9b,0x3c,0xa5,0x74,0x20, | 306 | 0x95,0xb8,0x82,0x6c,0xf2,0x95,0xd0,0x83, |
307 | 0xc7,0x3d,0x6d,0x70,0x90,0xdc,0x9d,0x34, | 307 | 0x1c,0xf5,0xb5,0xc2,0x43,0x72,0x74,0xd2, |
308 | 0xb1,0x44,0x58,0x66,0x2e,0xab,0x18,0x05, | 308 | 0xc5,0x11,0x61,0x98,0xba,0xac,0x60,0x16, |
309 | 0xaf,0xe2,0x1f,0xb3,0xbe,0x56,0x7a,0x0a, | 309 | 0xbf,0x88,0x7e,0xce,0xf9,0x59,0xe8,0x2b, |
310 | 0xe3,0xc1,0xb7,0x7a,0x4c,0xe2,0x55,0xb2, | 310 | 0x8f,0x06,0xdd,0xe9,0x33,0x89,0x56,0xc8, |
311 | 0x02,0x53,0xf2,0x17,0xd3,0x8f,0x16,0xdd, | 311 | 0x09,0x4f,0xc8,0x5f,0x4e,0x3c,0x5b,0x76, |
312 | 0x89,0x32,0xc9,0x51,0x48,0x18,0x4f,0xae, | 312 | 0x24,0xcb,0x25,0x45,0x20,0x61,0x3e,0xb9, |
313 | 0x5e,0x1a,0x3b,0xa3,0x66,0x34,0xab,0x44, | 313 | 0x78,0x68,0xee,0x8d,0x98,0xd2,0xad,0x10, |
314 | 0x04,0x67,0xe6,0xaf,0xa8,0x1e,0x0f,0xbb, | 314 | 0x11,0x9f,0x9a,0xbe,0xa0,0x78,0x3e,0xef, |
315 | 0xde,0x67,0x3a,0xad,0x60,0x10,0xbf,0x9c, | 315 | 0x79,0x9c,0xea,0xb5,0x80,0x42,0xfe,0x71, |
316 | 0x7e,0xb6,0xf8,0x49,0xee,0x4b,0x9a,0x46, | 316 | 0xfa,0xdb,0xe1,0x27,0xb9,0x2e,0x69,0x1a, |
317 | 0xa2,0x68,0x32,0x8f,0x50,0xdc,0x1d,0x37, | 317 | 0x89,0xa0,0xca,0x3d,0x43,0x70,0x74,0xde, |
318 | 0xb1,0x4e,0x58,0x5a,0x2e,0x23,0x1b,0x35, | 318 | 0xc5,0x39,0x61,0x68,0xb8,0x8c,0x6c,0xd6, |
319 | 0xa5,0x42,0x20,0x73,0x3e,0xd5,0x79,0x00, | 319 | 0x95,0x08,0x81,0xcc,0xfb,0x55,0xe4,0x03, |
320 | 0xe9,0xfd,0x8b,0xf2,0xc7,0xd1,0x6f,0x18, | 320 | 0xa7,0xf6,0x2f,0xcb,0x1f,0x45,0xbc,0x62, |
321 | 0x9d,0xac,0xb2,0x14,0x53,0x86,0x16,0xeb, | 321 | 0x76,0xb2,0xc8,0x51,0x4e,0x18,0x5b,0xae, |
322 | 0x89,0x86,0xca,0xe9,0x41,0x88,0x7a,0xce, | 322 | 0x26,0x1b,0x2b,0xa5,0x06,0x21,0xeb,0x3b, |
323 | 0xe1,0x59,0xb8,0x2a,0x6f,0x02,0x9d,0xf0, | 323 | 0x85,0x66,0xe0,0xa9,0xbc,0x0a,0x77,0xc2, |
324 | 0xb3,0xdc,0x57,0x36,0x0d,0x4b,0xd0,0x47, | 324 | 0xcf,0x71,0x5c,0xd8,0x35,0x2f,0x41,0x1c, |
325 | 0x1e,0x6d,0xba,0x92,0x60,0x92,0xbc,0x90, | 325 | 0x79,0xb6,0xea,0x49,0x82,0x4a,0xf2,0x41, |
326 | 0x74,0x9e,0xc4,0xb9,0x64,0x68,0xa6,0x8c, | 326 | 0xd2,0x7b,0x12,0xe5,0x91,0xa2,0x9a,0x30, |
327 | 0x28,0xd7,0x0d,0x0d,0xd1,0xd3,0x1b,0x15, | 327 | 0xa3,0x5c,0x34,0x37,0x47,0x4c,0x6c,0x56, |
328 | 0xa5,0x82,0x22,0xf3,0x31,0xd5,0x5b,0x00, | 328 | 0x96,0x08,0x8b,0xcc,0xc7,0x55,0x6c,0x00, |
329 | 0x25,0xff,0x23,0xfd,0x37,0xf1,0x4f,0xd8, | 329 | 0x97,0xfc,0x8f,0xf4,0xdf,0xc5,0x3f,0x61, |
330 | 0x5f,0x2e,0x3d,0x1b,0x71,0xa4,0xda,0x25, | 330 | 0x7c,0xb8,0xf4,0x6d,0xc6,0x93,0x68,0x94, |
331 | 0x23,0x21,0x35,0x39,0x41,0x68,0x78,0x8e, | 331 | 0x8c,0x84,0xd4,0xe5,0x05,0xa1,0xe2,0x3b, |
332 | 0xec,0xd9,0x95,0x2a,0x81,0x00,0xf9,0xfd, | 332 | 0xb3,0x66,0x54,0xaa,0x04,0x03,0xe7,0xf7, |
333 | 0xeb,0xf3,0x87,0xd6,0xef,0x09,0x9d,0xca, | 333 | 0xaf,0xce,0x1f,0x5b,0xbc,0x26,0x77,0x2a, |
334 | 0xb3,0x40,0x54,0x7e,0x06,0xfb,0xe9,0xe7, | 334 | 0xcd,0x01,0x51,0xf8,0x1b,0xef,0xa7,0x9e, |
335 | 0x8b,0xae,0xc6,0x19,0x6b,0xa8,0x86,0x0c, | 335 | 0x2e,0xbb,0x18,0x65,0xae,0xa2,0x18,0x33, |
336 | 0xeb,0xd5,0x87,0x02,0xed,0xf1,0x93,0xda, | 336 | 0xaf,0x56,0x1c,0x0b,0xb7,0xc6,0x4f,0x6a, |
337 | 0x97,0x20,0x8d,0x3c,0xd1,0x75,0x18,0xc1, | 337 | 0x5c,0x82,0x34,0xf3,0x45,0xd4,0x63,0x06, |
338 | 0xad,0x7a,0x10,0xe3,0x9d,0xb6,0xb2,0x48, | 338 | 0xb5,0xe8,0x43,0x8e,0x76,0xda,0xc9,0x21, |
339 | 0x52,0x4e,0x12,0x5b,0x92,0x26,0x93,0x28, | 339 | 0x49,0x38,0x49,0x6e,0x48,0x9a,0x4c,0xa2, |
340 | 0x95,0x0c,0x81,0xd4,0xfb,0x05,0xe5,0xe3, | 340 | 0x54,0x32,0x07,0x53,0xec,0x17,0x97,0x8e, |
341 | 0xa3,0xb6,0x36,0x4b,0x4a,0x44,0x42,0x66, | 341 | 0x8e,0xd8,0xd9,0x2d,0x29,0x11,0x09,0x99, |
342 | 0x72,0xaa,0xd0,0x01,0x1f,0xf9,0xbf,0xea, | 342 | 0xca,0xab,0x40,0x04,0x7f,0xe6,0xff,0xa9, |
343 | 0x7f,0x82,0xfe,0xf1,0xf9,0xdb,0xeb,0x27, | 343 | 0xfe,0x0b,0xfb,0xc7,0xe7,0x6f,0xac,0x9e, |
344 | 0x85,0x2e,0xe1,0x19,0xb9,0xaa,0x6a,0x02, | 344 | 0x14,0xbb,0x84,0x66,0xe6,0xa9,0xa8,0x0a, |
345 | 0x83,0xf0,0xf7,0xdd,0xcf,0x33,0x5d,0x54, | 345 | 0x0f,0xc3,0xdf,0x77,0x3c,0xcd,0x75,0x50, |
346 | 0x30,0x07,0x5f,0xec,0x3f,0x97,0x7e,0x8c, | 346 | 0xc0,0x1d,0x7f,0xb0,0xfe,0x5d,0xfa,0x33, |
347 | 0xf8,0xd5,0xed,0x03,0x91,0xf6,0x9b,0xc8, | 347 | 0xe3,0x57,0xb4,0x0e,0x47,0xda,0x6f,0x22, |
348 | 0xa7,0x4c,0x2c,0x57,0x16,0x0d,0x8b,0xd2, | 348 | 0x9d,0x30,0xb1,0x5c,0x58,0x36,0x2f,0x4b, |
349 | 0xc7,0x11,0x6d,0x98,0x92,0xac,0x90,0x14, | 349 | 0x1c,0x45,0xb6,0x62,0x4a,0xb2,0x40,0x52, |
350 | 0x9f,0x84,0xbe,0xe4,0x79,0xa6,0xea,0x29, | 350 | 0x7e,0x12,0xfb,0x91,0xe6,0x9b,0xa8,0xa6, |
351 | 0x83,0x0a,0xf5,0xc1,0xc3,0x7b,0x74,0xe4, | 351 | 0x0c,0x2b,0xd7,0x07,0x0d,0xed,0xd3,0x93, |
352 | 0xc5,0xa5,0x62,0x20,0xb3,0x3c,0x55,0x76, | 352 | 0x16,0x95,0x88,0x82,0xcc,0xf1,0x55,0xd8, |
353 | 0x00,0xcb,0xfd,0x47,0xf0,0x6f,0xde,0x9f, | 353 | 0x03,0x2f,0xf5,0x1f,0xc1,0xbf,0x7a,0x7c, |
354 | 0x38,0xbd,0x6c,0x70,0x96,0xdc,0x89,0x34, | 354 | 0xe2,0xf5,0xb1,0xc2,0x5b,0x72,0x24,0xd3, |
355 | 0xc9,0x45,0x48,0x60,0x4e,0xbe,0x58,0x7a, | 355 | 0x25,0x15,0x21,0x81,0x3a,0xf9,0x61,0xe8, |
356 | 0x2e,0xe3,0x19,0xb5,0xaa,0x42,0x02,0x73, | 356 | 0xbb,0x8c,0x66,0xd6,0xa9,0x08,0x09,0xcf, |
357 | 0xf2,0xd7,0xd1,0x0f,0x19,0xdd,0xab,0x32, | 357 | 0xcb,0x5f,0x44,0x3c,0x67,0x76,0xac,0xc8, |
358 | 0x05,0x53,0xe0,0x17,0xbf,0x8e,0x7e,0xda, | 358 | 0x15,0x4f,0x80,0x5e,0xfe,0x39,0xfb,0x6b, |
359 | 0xf9,0x21,0xe9,0x3b,0x89,0x66,0xc8,0xa9, | 359 | 0xe4,0x87,0xa4,0xee,0x25,0x9b,0x22,0xa5, |
360 | 0x4c,0x08,0x57,0xce,0x0f,0x5b,0xdc,0x27, | 360 | 0x30,0x21,0x5f,0x38,0x3d,0x6f,0x70,0x9c, |
361 | 0x37,0x2d,0x4d,0x10,0x51,0x9e,0x1a,0xbb, | 361 | 0xdc,0xb5,0x34,0x41,0x46,0x78,0x6a,0xee, |
362 | 0xa0,0x66,0x3e,0xab,0x78,0x04,0xef,0xe5, | 362 | 0x81,0x98,0xfa,0xad,0xe0,0x13,0xbf,0x96, |
363 | 0x9f,0xa2,0xbe,0x30,0x7b,0x5e,0xe4,0x39, | 363 | 0x7e,0x8a,0xf8,0xc1,0xed,0x7b,0x90,0xe6, |
364 | 0xa7,0x6a,0x2c,0x83,0x14,0xf5,0x85,0xc2, | 364 | 0x9d,0xa8,0xb2,0x0c,0x53,0xd6,0x17,0x0b, |
365 | 0xe3,0x71,0xb4,0xda,0x45,0x22,0x61,0x32, | 365 | 0x8d,0xc6,0xd3,0x69,0x14,0x89,0x84,0xca, |
366 | 0xb9,0x50,0x68,0x1e,0x8f,0xb8,0xde,0x6d, | 366 | 0xe5,0x41,0xa0,0x7a,0x3e,0xe3,0x79,0xb4, |
367 | 0x3a,0x91,0x60,0x98,0xbc,0xac,0x74,0x16, | 367 | 0xea,0x45,0x82,0x62,0xf2,0xb1,0xd0,0x5b, |
368 | 0xc7,0x89,0x6e,0xc8,0x99,0x4c,0xa8,0x54, | 368 | 0x1e,0x25,0xbb,0x22,0x65,0x32,0xa1,0x50, |
369 | 0x0e,0x07,0xdb,0xef,0x27,0x9d,0x2e,0xb1, | 369 | 0x38,0x1f,0x6f,0xbc,0x9e,0x74,0xba,0xc4, |
370 | 0x18,0x59,0xae,0x2a,0x1b,0x03,0xa5,0xf6, | 370 | 0x61,0x66,0xb8,0xa8,0x6c,0x0e,0x97,0xd8, |
371 | 0x23,0xcb,0x37,0x45,0x4c,0x60,0x56,0xbe, | 371 | 0x8f,0x2c,0xdd,0x15,0x31,0x81,0x5a,0xf8, |
372 | 0x08,0x7b,0xce,0xe7,0x59,0xac,0x2a,0x17, | 372 | 0x21,0xef,0x3b,0x9d,0x66,0xb0,0xa8,0x5c, |
373 | 0x03,0x8d,0xf6,0xd3,0xc9,0x17,0x49,0x8c, | 373 | 0x0e,0x37,0xdb,0x4f,0x24,0x5d,0x26,0x31, |
374 | 0x4a,0xd6,0x41,0x0a,0x79,0xc2,0xeb,0x71, | 374 | 0x2b,0x59,0x04,0x29,0xe7,0x0b,0xad,0xc6, |
375 | 0x84,0xda,0xe5,0x21,0xa1,0x3a,0x39,0x63, | 375 | 0x13,0x6b,0x94,0x86,0x84,0xe8,0xe5,0x8d, |
376 | 0x68,0xb4,0x8c,0x44,0xd6,0x65,0x0a,0xa1, | 376 | 0xa2,0xd2,0x31,0x13,0x59,0x94,0x2a,0x87, |
377 | 0xc0,0x3b,0x7f,0x64,0xfc,0xa5,0xf4,0x23, | 377 | 0x00,0xed,0xfd,0x93,0xf2,0x97,0xd0,0x8f, |
378 | 0xc7,0x37,0x6d,0x4c,0x90,0x54,0x9e,0x04, | 378 | 0x1c,0xdd,0xb5,0x32,0x41,0x52,0x78,0x12, |
379 | 0xbb,0xe4,0x67,0xa6,0xae,0x28,0x1b,0x0f, | 379 | 0xef,0x91,0x9e,0x9a,0xb8,0xa0,0x6c,0x3e, |
380 | 0xa5,0xde,0x23,0x3b,0x35,0x65,0x40,0xa0, | 380 | 0x97,0x78,0x8c,0xec,0xd5,0x95,0x02,0x81, |
381 | 0x7c,0x3e,0xf7,0x79,0xcc,0xeb,0x55,0x84, | 381 | 0xf0,0xfb,0xdd,0xe7,0x33,0xad,0x56,0x10, |
382 | 0x02,0xe7,0xf1,0xaf,0xda,0x1f,0x23,0xbd, | 382 | 0x0b,0x9f,0xc6,0xbf,0x68,0x7c,0x8e,0xf4, |
383 | 0x36,0x71,0x4a,0xd8,0x41,0x2e,0x79,0x1a, | 383 | 0xd9,0xc5,0x2b,0x61,0x04,0xb9,0xe4,0x6b, |
384 | 0xe9,0xa1,0x8a,0x3a,0xc3,0x61,0x74,0xb8, | 384 | 0xa6,0x86,0x28,0xeb,0x0d,0x85,0xd2,0xe3, |
385 | 0xc4,0x6d,0x66,0x90,0xa8,0x9c,0x0c,0xb7, | 385 | 0x11,0xb5,0x9a,0x42,0xa2,0x70,0x32,0xdf, |
386 | 0xd4,0x4f,0x06,0x5d,0xea,0x33,0x83,0x56, | 386 | 0x51,0x3c,0x19,0x77,0xa8,0xce,0x0d,0x5b, |
387 | 0xf4,0x09,0xc7,0xcb,0x6f,0x44,0x9c,0x64, | 387 | 0xd0,0x27,0x1f,0x2d,0xbd,0x12,0x71,0x92, |
388 | 0xb6,0xa4,0x48,0x26,0x4f,0x2a,0x5d,0x02, | 388 | 0xda,0x91,0x20,0x99,0x3c,0xa9,0x74,0x08, |
389 | 0x31,0xf3,0x5b,0xd4,0x27,0x07,0x2d,0xed, | 389 | 0xc7,0xcd,0x6f,0x50,0x9c,0x1c,0xb7,0xb4, |
390 | 0x13,0x91,0x96,0x9a,0x88,0xa0,0xcc,0x3d, | 390 | 0x4e,0x46,0x5a,0x6a,0x22,0x83,0x30,0xf5, |
391 | 0x57,0x70,0x0c,0xdf,0xd5,0x3f,0x01,0x7d, | 391 | 0x5d,0xc0,0x33,0x7f,0x54,0xfc,0x05,0xf7, |
392 | 0xf8,0xf3,0xed,0xd7,0x93,0x0e,0x95,0xd8, | 392 | 0xe3,0xcf,0xb7,0x5e,0x4c,0x3a,0x57,0x62, |
393 | 0x83,0x2c,0xf5,0x15,0xc1,0x83,0x7a,0xf4, | 393 | 0x0c,0xb3,0xd4,0x57,0x06,0x0d,0xeb,0xd3, |
394 | 0xe1,0xc5,0xbb,0x62,0x64,0xb2,0xa4,0x50, | 394 | 0x87,0x16,0xed,0x89,0x92,0xca,0x91,0x40, |
395 | 0x26,0x1f,0x2b,0xbd,0x06,0x71,0xea,0xdb, | 395 | 0x98,0x7c,0xae,0xf4,0x19,0xc7,0xab,0x6e, |
396 | 0x81,0x26,0xf9,0x29,0xe9,0x0b,0x89,0xc6, | 396 | 0x04,0x9b,0xe4,0xa7,0xa4,0x2e,0x27,0x1b, |
397 | 0xcb,0x69,0x44,0x88,0x64,0xce,0xa5,0x58, | 397 | 0x2d,0xa5,0x12,0x21,0x93,0x3a,0x95,0x60, |
398 | 0x20,0x2f,0x3f,0x1d,0x7d,0xb0,0xf2,0x5d, | 398 | 0x80,0xbc,0xfc,0x75,0xf6,0xc3,0xc9,0x77, |
399 | 0xd2,0x33,0x13,0x55,0x94,0x02,0x87,0xf0, | 399 | 0x48,0xcc,0x4d,0x56,0x50,0x0a,0x1f,0xc3, |
400 | 0xef,0xdd,0x9f,0x32,0xbd,0x50,0x70,0x1e, | 400 | 0xbf,0x76,0x7c,0xca,0xf5,0x41,0xc0,0x7b, |
401 | 0xdf,0xb9,0x3e,0x69,0x7a,0x88,0xe0,0xcd, | 401 | 0x7e,0xe4,0xf9,0xa5,0xea,0x23,0x83,0x36, |
402 | 0xbd,0x52,0x70,0x12,0xdf,0x91,0x3e,0x99, | 402 | 0xf5,0x49,0xc0,0x4b,0x7e,0x44,0xfa,0x65, |
403 | 0x78,0xa8,0xec,0x0d,0x97,0xd2,0x8f,0x10, | 403 | 0xe2,0xa3,0xb0,0x36,0x5f,0x4a,0x3c,0x43, |
404 | 0xdd,0x9d,0x32,0xb1,0x50,0x58,0x1e,0x2f, | 404 | 0x76,0x74,0xca,0xc5,0x41,0x60,0x78,0xbe, |
405 | 0xbb,0x1e,0x65,0xba,0xa2,0x60,0x32,0xbf, | 405 | 0xec,0x79,0x96,0xea,0x89,0x80,0xca,0xfd, |
406 | 0x50,0x7c,0x1e,0xf7,0xb9,0xce,0x6b,0x5a, | 406 | 0x41,0xf0,0x7b,0xde,0xe7,0x39,0xad,0x6a, |
407 | 0x84,0x20,0xe7,0x3d,0xad,0x72,0x10,0xd3, | 407 | 0x10,0x83,0x9c,0xf6,0xb5,0xc8,0x43,0x4e, |
408 | 0x9d,0x16,0xb1,0x88,0x5a,0xce,0x21,0x5b, | 408 | 0x74,0x5a,0xc6,0x21,0x6b,0x38,0x85,0x6c, |
409 | 0x38,0x25,0x6f,0x20,0x9d,0x3c,0xb1,0x74, | 409 | 0xe0,0x95,0xbc,0x82,0x74,0xf2,0xc5,0xd1, |
410 | 0x58,0xc6,0x2d,0x6b,0x10,0x85,0x9c,0xe2, | 410 | 0x63,0x18,0xb5,0xac,0x42,0x16,0x73,0x8a, |
411 | 0xb5,0xb0,0x42,0x5e,0x72,0x3a,0xd3,0x61, | 411 | 0xd6,0xc1,0x09,0x79,0xc8,0xeb,0x4d,0x84, |
412 | 0x14,0xb9,0x84,0x6a,0xe6,0x81,0xa8,0xfa, | 412 | 0x52,0xe6,0x11,0xab,0x9a,0x06,0xa3,0xe8, |
413 | 0x0d,0xe3,0xd3,0xb7,0x16,0x4d,0x8a,0x52, | 413 | 0x37,0x8f,0x4e,0xdc,0x59,0x36,0x29,0x4b, |
414 | 0xc2,0x11,0x73,0x98,0xd6,0xad,0x08,0x11, | 414 | 0x08,0x45,0xce,0x63,0x5a,0xb4,0x20,0x47, |
415 | 0xcf,0x9b,0x5e,0xa4,0x38,0x27,0x6f,0x2c, | 415 | 0x3e,0x6d,0x7a,0x90,0xe0,0x9d,0xbc,0xb2, |
416 | 0x9d,0x14,0xb1,0x84,0x5a,0xe6,0x21,0xab, | 416 | 0x74,0x52,0xc6,0x11,0x6b,0x98,0x86,0xac, |
417 | 0x3a,0x05,0x63,0xe0,0xb7,0xbc,0x4e,0x76, | 417 | 0xe8,0x15,0x8f,0x82,0xde,0xf1,0x39,0xd9, |
418 | 0x5a,0xca,0x21,0x43,0x38,0x75,0x6e,0xc0, | 418 | 0x6b,0x28,0x85,0x0c,0xe1,0xd5,0xbb,0x02, |
419 | 0x99,0x7c,0xa8,0xf4,0x0d,0xc7,0xd3,0x6f, | 419 | 0x65,0xf2,0xa3,0xd0,0x37,0x1f,0x4d,0xbc, |
420 | 0x14,0x9d,0x84,0xb2,0xe4,0x51,0xa6,0x1a, | 420 | 0x52,0x76,0x12,0xcb,0x91,0x46,0x98,0x68, |
421 | 0x2b,0xa3,0x06,0x35,0xeb,0x43,0x84,0x76, | 421 | 0xae,0x8c,0x18,0xd7,0xad,0x0e,0x11,0xdb, |
422 | 0xe6,0xc9,0xa9,0x4a,0x08,0x43,0xce,0x77, | 422 | 0x9b,0x26,0xa5,0x28,0x21,0x0f,0x39,0xdd, |
423 | 0x5a,0xcc,0x21,0x57,0x38,0x0d,0x6f,0xd0, | 423 | 0x6b,0x30,0x85,0x5c,0xe0,0x35,0xbf,0x42, |
424 | 0x9f,0x1c,0xbd,0xb4,0x72,0x46,0xd2,0x69, | 424 | 0x7c,0x72,0xf6,0xd1,0xc9,0x1b,0x49,0xa4, |
425 | 0x12,0x89,0x90,0xca,0x9d,0x40,0xb0,0x7c, | 425 | 0x4a,0x26,0x43,0x2a,0x75,0x02,0xc1,0xf1, |
426 | 0x5e,0xf6,0x39,0xcb,0x6b,0x44,0x84,0x64, | 426 | 0x7b,0xd8,0xe7,0x2d,0xad,0x12,0x11,0x93, |
427 | 0xe6,0xa5,0xa8,0x22,0x0f,0x33,0xdd,0x57, | 427 | 0x9a,0x96,0xa0,0x88,0x3c,0xcf,0x75,0x5c, |
428 | 0x30,0x0d,0x5f,0xd0,0x3f,0x1f,0x7d,0xbc, | 428 | 0xc0,0x35,0x7f,0x40,0xfc,0x7d,0xf6,0xf3, |
429 | 0xf2,0x75,0xd2,0xc3,0x11,0x75,0x98,0xc2, | 429 | 0xc9,0xd7,0x4b,0x0c,0x45,0xd6,0x63,0x0a, |
430 | 0xad,0x70,0x10,0xdf,0x9d,0x3e,0xb1,0x78, | 430 | 0xb5,0xc0,0x43,0x7e,0x74,0xfa,0xc5,0xe1, |
431 | 0x58,0xee,0x2d,0x9b,0x12,0xa5,0x90,0x22, | 431 | 0x63,0xb8,0xb6,0x6c,0x4a,0x96,0x40,0x8a, |
432 | 0x9f,0x30,0xbd,0x5c,0x70,0x36,0xdf,0x49, | 432 | 0x7c,0xc2,0xf5,0x71,0xc0,0xdb,0x7d,0x24, |
433 | 0x3c,0x49,0x76,0x48,0xca,0x4d,0x42,0x50, | 433 | 0xf1,0x25,0xd9,0x23,0x29,0x35,0x09,0x41, |
434 | 0x72,0x1e,0xd3,0xb9,0x16,0x69,0x8a,0x8a, | 434 | 0xc8,0x7b,0x4e,0xe4,0x59,0xa6,0x2a,0x2b, |
435 | 0xc0,0xc1,0x7d,0x78,0xf0,0xed,0xdd,0x93, | 435 | 0x03,0x05,0xf5,0xe3,0xc3,0xb7,0x76,0x4c, |
436 | 0x32,0x95,0x50,0x80,0x1c,0xff,0xb5,0xfe, | 436 | 0xca,0x55,0x42,0x00,0x73,0xfe,0xd7,0xf9, |
437 | 0x43,0xfa,0x77,0xe2,0xcf,0xb1,0x5e,0x58, | 437 | 0x0f,0xe9,0xdf,0x8b,0x3e,0xc5,0x79,0x60, |
438 | 0x3a,0x2f,0x63,0x1c,0xb5,0xb4,0x42,0x46, | 438 | 0xe8,0xbd,0x8c,0x72,0xd6,0xd1,0x09,0x19, |
439 | 0x72,0x6a,0xd2,0x81,0x10,0xf9,0x9d,0xea, | 439 | 0xc9,0xab,0x4a,0x04,0x43,0xe6,0x77,0xaa, |
440 | 0xb3,0x80,0x56,0xfe,0x09,0xfb,0xcb,0xe7, | 440 | 0xce,0x01,0x5b,0xf8,0x27,0xef,0x2f,0x9d, |
441 | 0x47,0xac,0x6e,0x16,0x9b,0x88,0xa6,0xcc, | 441 | 0x1e,0xb1,0xb8,0x5a,0x6e,0x22,0x9b,0x30, |
442 | 0x29,0x57,0x08,0x0d,0xcf,0xd3,0x5f,0x14, | 442 | 0xa5,0x5c,0x20,0x37,0x3f,0x4d,0x7c,0x50, |
443 | 0x3d,0x87,0x72,0xec,0xd1,0x95,0x1a,0x81, | 443 | 0xf6,0x1d,0xcb,0xb3,0x46,0x54,0x6a,0x06, |
444 | 0xa0,0xfa,0x3d,0xe3,0x73,0xb4,0xd6,0x45, | 444 | 0x83,0xe8,0xf7,0x8d,0xce,0xd3,0x59,0x14, |
445 | 0x0a,0x61,0xc2,0xbb,0x70,0x64,0xde,0xa5, | 445 | 0x29,0x87,0x0a,0xed,0xc1,0x93,0x7a,0x94, |
446 | 0x38,0x21,0x6f,0x38,0x9d,0x6c,0xb0,0x94, | 446 | 0xe0,0x85,0xbc,0xe2,0x75,0xb2,0xc2,0x51, |
447 | 0x5c,0x86,0x3e,0xeb,0x45,0x84,0x62,0xe6, | 447 | 0x72,0x18,0xd3,0xad,0x16,0x11,0x8b,0x9a, |
448 | 0xb1,0xa8,0x5a,0x0e,0x23,0xfb,0x33,0x25, | 448 | 0xc6,0xa1,0x68,0x38,0x8f,0x6c,0xdc,0x95, |
449 | 0x47,0x20,0x51,0x3e,0x19,0x7f,0xa8,0x66, | 449 | 0x34,0x81,0x44,0xf8,0x65,0xee,0xa3,0x98, |
450 | 0x0c,0xfb,0xd0,0x07,0x13,0xe5,0x9f,0x83, | 450 | 0x36,0xaf,0x48,0x1c,0x4f,0xb6,0x5e,0x4a, |
451 | 0xce,0x98,0x58,0xcd,0x2e,0x19,0x14,0x39, | 451 | 0x3a,0x43,0x62,0x74,0xb2,0xc4,0x51,0x66, |
452 | 0x86,0x3f,0xff,0x01,0x85,0xff,0xe1,0xe1, | 452 | 0x18,0xab,0xac,0x06,0x17,0xeb,0x8f,0x86, |
453 | 0xb3,0xfc,0x46,0x63,0x0f,0xf8,0x00,0x53, | 453 | 0xde,0xe9,0x39,0x89,0x6a,0xc8,0x81,0x4c, |
454 | 0xbe,0x1f,0xfb,0xc0,0xe6,0x7e,0xbc,0xf0, | 454 | 0xf8,0x55,0xee,0x03,0x9b,0xf6,0xa7,0xc8, |
455 | 0x01,0xe3,0xc3,0x9f,0xa6,0xcc,0x48,0x7e, | 455 | 0x2f,0x4f,0x1c,0x5d,0xb6,0x32,0x4b,0x52, |
456 | 0x40,0x82,0x9d,0xf2,0xff,0xd6,0x07,0x13, | 456 | 0x44,0x12,0x67,0x92,0xae,0x90,0x18,0x9f, |
457 | 0xf5,0x87,0x80,0x0f,0x71,0x9c,0xfd,0x35, | 457 | 0xac,0xbe,0x14,0x7b,0x86,0xe6,0xe9,0xa9, |
458 | 0x61,0x43,0xf8,0x78,0x7e,0xcf,0x19,0x99, | 458 | 0x8a,0x0a,0xc3,0xc1,0x77,0x78,0xcc,0xed, |
459 | 0xa8,0x32,0x00,0x53,0xfc,0x17,0xfb,0x8f, | 459 | 0x55,0x90,0x02,0x9f,0xf0,0xbf,0xdc,0x7f, |
460 | 0xc6,0xdf,0xa9,0x3e,0x09,0x7b,0xc8,0xe7, | 460 | 0x36,0xfd,0x49,0xf0,0x4b,0xde,0x47,0x3a, |
461 | 0x4d,0xac,0x52,0x16,0x13,0x8b,0x96,0xc6, | 461 | 0x6d,0x62,0x90,0xb0,0x9c,0x5c,0xb6,0x34, |
462 | 0x89,0x68,0xc8,0x8d,0x4c,0xd0,0x55,0x1e, | 462 | 0x4b,0x46,0x44,0x6a,0x66,0x82,0xa8,0xf0, |
463 | 0x01,0xbb,0xfa,0x67,0xe2,0xaf,0xb0,0x1e, | 463 | 0x0d,0xdf,0xd3,0x3f,0x15,0x7d,0x80,0xf2, |
464 | 0x5f,0xba,0x3e,0x63,0x7a,0xb4,0xe0,0x45, | 464 | 0xfd,0xd1,0xf3,0x1b,0xd5,0xa7,0x02,0x2d, |
465 | 0xbe,0x62,0x7a,0xb2,0xe0,0x51,0xbe,0x1a, | 465 | 0xf3,0x13,0xd5,0x97,0x02,0x8d,0xf0,0xd3, |
466 | 0x7b,0xa2,0xe6,0x31,0xab,0x5a,0x04,0x23, | 466 | 0xdd,0x17,0x31,0x8d,0x5a,0xd0,0x21,0x1f, |
467 | 0xe7,0x37,0xad,0x4e,0x10,0x5b,0x9e,0x26, | 467 | 0x39,0xbd,0x6a,0x70,0x82,0xdc,0xf1,0x35, |
468 | 0xbb,0x28,0x65,0x0e,0xa1,0xd8,0x3b,0x2f, | 468 | 0xd9,0x43,0x28,0x75,0x0e,0xc1,0xd9,0x7b, |
469 | 0x65,0x1c,0xa1,0xb4,0x3a,0x47,0x62,0x6c, | 469 | 0x28,0xe5,0x0d,0xa1,0xd2,0x3b,0x13,0x65, |
470 | 0xb2,0x94,0x50,0x86,0x1c,0xeb,0xb5,0x86, | 470 | 0x94,0xa2,0x84,0x30,0xe7,0x5d,0xac,0x32, |
471 | 0x42,0xea,0x71,0x82,0xda,0xf1,0x21,0xd9, | 471 | 0x17,0x53,0x8c,0x16,0xd7,0x89,0x0e,0xc9, |
472 | 0x3b,0x29,0x65,0x08,0xa1,0xcc,0x3b,0x57, | 472 | 0xd9,0x4b,0x28,0x45,0x0e,0x61,0xda,0xbb, |
473 | 0x64,0x0c,0xa7,0xd4,0x2f,0x07,0x1d,0xed, | 473 | 0x20,0x65,0x3e,0xa1,0x78,0x38,0xef,0x6d, |
474 | 0xb3,0x92,0x56,0x92,0x08,0x93,0xcc,0x97, | 474 | 0x9c,0x92,0xb4,0x90,0x44,0x9e,0x64,0xba, |
475 | 0x54,0x8c,0x04,0xd7,0xe5,0x0f,0xa1,0xde, | 475 | 0xa4,0x60,0x26,0xbf,0x28,0x7d,0x0e,0xf1, |
476 | 0x3b,0x3b,0x65,0x64,0xa0,0xa4,0x3c,0x27, | 476 | 0xd9,0xdb,0x2b,0x25,0x05,0x21,0xe1,0x3b, |
477 | 0x77,0x2c,0xcd,0x15,0x51,0x80,0x1a,0xff, | 477 | 0xb9,0x66,0x68,0xaa,0x8c,0x00,0xd7,0xfd, |
478 | 0xa1,0xfe,0x3b,0xfb,0x67,0xe4,0xaf,0xa4, | 478 | 0x0f,0xf1,0xdf,0xdb,0x3f,0x25,0x7d,0x20, |
479 | 0x1e,0x27,0xbb,0x2e,0x65,0x1a,0xa1,0xa0, | 479 | 0xf1,0x3d,0xd9,0x73,0x28,0xd5,0x0d,0x01, |
480 | 0x3a,0x3f,0x63,0x7c,0xb4,0xf4,0x45,0xc6, | 480 | 0xd1,0xfb,0x1b,0xe5,0xa7,0xa2,0x2e,0x33, |
481 | 0x63,0x6a,0xb4,0x80,0x44,0xfe,0x65,0xfa, | 481 | 0x1b,0x55,0xa4,0x02,0x27,0xf3,0x2f,0xd5, |
482 | 0xa3,0xe0,0x37,0xbf,0x4e,0x7c,0x5a,0xf6, | 482 | 0x1f,0x01,0xbd,0xfa,0x73,0xe2,0xd7,0xb1, |
483 | 0x21,0xcb,0x3b,0x45,0x64,0x60,0xa6,0xbc, | 483 | 0x0e,0x59,0xda,0x2b,0x23,0x05,0x35,0xe1, |
484 | 0x28,0x77,0x0e,0xcd,0xd9,0x53,0x28,0x15, | 484 | 0x43,0xb8,0x76,0x6e,0xca,0x99,0x40,0xa8, |
485 | 0x0f,0x81,0xde,0xfb,0x39,0xe5,0x6b,0xa0, | 485 | 0x7c,0x0e,0xf7,0xd9,0xcf,0x2b,0x5d,0x04, |
486 | 0x86,0x3c,0xeb,0x75,0x84,0xc2,0xe5,0x71, | 486 | 0x31,0xe7,0x5b,0xac,0x26,0x17,0x2b,0x8d, |
487 | 0xa0,0xda,0x3d,0x23,0x71,0x34,0xd9,0x45, | 487 | 0x06,0xd1,0xe9,0x1b,0x89,0xa6,0xca,0x29, |
488 | 0x28,0x61,0x0e,0xb9,0xd8,0x6b,0x2e,0x85, | 488 | 0x43,0x08,0x75,0xce,0xc3,0x59,0x74,0x28, |
489 | 0x18,0xe1,0xad,0xba,0x12,0x63,0x92,0xb6, | 489 | 0xc7,0x0d,0x6d,0xd0,0x93,0x1c,0x95,0xb4, |
490 | 0x90,0x48,0x9e,0x4c,0xba,0x54,0x62,0x06, | 490 | 0x82,0x44,0xf2,0x65,0xd2,0xa3,0x10,0x35, |
491 | 0xb3,0xe8,0x57,0x8e,0x0e,0xdb,0xd9,0x27, | 491 | 0x9f,0x42,0xbc,0x70,0x76,0xde,0xc9,0x39, |
492 | 0x29,0x2d,0x09,0x11,0xc9,0x9b,0x4a,0xa4, | 492 | 0x49,0x68,0x48,0x8e,0x4c,0xda,0x55,0x22, |
493 | 0x40,0x26,0x7f,0x2a,0xfd,0x01,0xf1,0xfb, | 493 | 0x01,0x33,0xf9,0x57,0xe8,0x0f,0x8f,0xde, |
494 | 0xdb,0xe7,0x27,0xad,0x2e,0x11,0x1b,0x99, | 494 | 0xdf,0x39,0x3d,0x69,0x70,0x88,0xdc,0xcd, |
495 | 0xa6,0xaa,0x28,0x03,0x0f,0xf5,0xdf,0xc3, | 495 | 0x35,0x51,0x40,0x18,0x7f,0xae,0xfe,0x19, |
496 | 0x3f,0x75,0x7c,0xc0,0xf5,0x7d,0xc0,0xf3, | 496 | 0xfb,0xab,0xe6,0x07,0xab,0xee,0x07,0x9b, |
497 | 0x7d,0xd4,0xf3,0x05,0xd5,0xe3,0x03,0xb5, | 497 | 0xee,0xa7,0x98,0x2e,0xaf,0x18,0x1d,0xaf, |
498 | 0xf6,0x43,0xca,0x77,0x42,0xcc,0x71,0x56, | 498 | 0xb2,0x1e,0x53,0xba,0x16,0x63,0x8a,0xb6, |
499 | 0xd8,0x09,0x2f,0xc9,0x1f,0x49,0xbc,0x4a, | 499 | 0xc0,0x49,0x7e,0x48,0xfa,0x4d,0xe2,0x53, |
500 | 0x76,0x42,0xca,0x71,0x42,0xd8,0x71,0x2e, | 500 | 0xb2,0x16,0x53,0x8a,0x16,0xc3,0x89,0x76, |
501 | 0xd9,0x19,0x29,0xa9,0x0a,0x09,0xc3,0xcb, | 501 | 0xc8,0xc9,0x4d,0x48,0x50,0x4e,0x1e,0x5b, |
502 | 0x77,0x44,0xcc,0x65,0x56,0xa0,0x08,0x3f, | 502 | 0xba,0x26,0x63,0x2a,0xb5,0x00,0x41,0xfe, |
503 | 0xcf,0x7f,0x5c,0xfc,0x35,0xf7,0x43,0xcc, | 503 | 0x7b,0xfa,0xe7,0xe1,0xaf,0xba,0x1e,0x63, |
504 | 0x77,0x56,0xcc,0x09,0x57,0xc8,0x0f,0x4f, | 504 | 0xba,0xb6,0x60,0x4a,0xbe,0x40,0x7a,0x7e, |
505 | 0xdc,0x5f,0x36,0x3d,0x4b,0x70,0x44,0xde, | 505 | 0xe2,0xf9,0xb1,0xea,0x5b,0x82,0x26,0xf3, |
506 | 0x65,0x3a,0xa1,0x60,0x38,0xbf,0x6c,0x7c, | 506 | 0x29,0xd5,0x0b,0x01,0xc5,0xfb,0x63,0xe4, |
507 | 0x96,0xf4,0x89,0xc4,0xcb,0x65,0x44,0xa0, | 507 | 0xb7,0xa4,0x4e,0x26,0x5b,0x2a,0x25,0x03, |
508 | 0x64,0x3e,0xa7,0x78,0x2c,0xef,0x15,0x9d, | 508 | 0x21,0xf5,0x3b,0xc1,0x67,0x78,0xac,0xec, |
509 | 0x82,0xb2,0xf0,0x51,0xde,0x1b,0x3b,0xa5, | 509 | 0x15,0x97,0x82,0x8e,0xf0,0xd9,0xdd,0x2b, |
510 | 0x66,0x20,0xab,0x3c,0x05,0x77,0xe0,0xcf, | 510 | 0x31,0x05,0x59,0xe0,0x2b,0xbf,0x06,0x7d, |
511 | 0xbd,0x5e,0x70,0x3a,0xdf,0x61,0x3c,0xb9, | 511 | 0xea,0xf3,0x81,0xd6,0xfb,0x09,0xe5,0xcb, |
512 | 0x74,0x68,0xc6,0x8d,0x68,0xd0,0x8d,0x1c, | 512 | 0xa3,0x46,0x34,0x6b,0x46,0x84,0x68,0xe6, |
513 | 0xd1,0xb5,0x1a,0x41,0xa2,0x7a,0x32,0xe3, | 513 | 0x8d,0xa8,0xd2,0x0d,0x13,0xd1,0x97,0x1a, |
514 | 0x51,0xb4,0x1a,0x47,0xa2,0x6e,0x32,0x9b, | 514 | 0x8d,0xa0,0xd2,0x3d,0x13,0x71,0x94,0xda, |
515 | 0x50,0xa4,0x1c,0x27,0xb7,0x2e,0x4d,0x1a, | 515 | 0x85,0x20,0xe1,0x3d,0xb9,0x72,0x68,0xd2, |
516 | 0x51,0xa2,0x1a,0x33,0xa3,0x56,0x34,0x0b, | 516 | 0x8d,0x10,0xd1,0x9d,0x1a,0xb1,0xa0,0x5a, |
517 | 0x47,0xc4,0x6f,0x66,0x9c,0xa8,0xb4,0x0c, | 517 | 0x3e,0x23,0x7b,0x34,0xe5,0x45,0xa0,0x62, |
518 | 0x47,0xd6,0x6f,0x0a,0x9d,0xc0,0xb3,0x7c, | 518 | 0x3e,0xb3,0x78,0x54,0xee,0x05,0x9b,0xe2, |
519 | 0x54,0xf6,0x05,0xcb,0xe3,0x47,0xb4,0x6e, | 519 | 0xa7,0xb0,0x2e,0x5f,0x1a,0x3d,0xa3,0x72, |
520 | 0x46,0x9a,0x68,0xa2,0x8c,0x30,0xd7,0x5d, | 520 | 0x34,0xd3,0x45,0x14,0x61,0x86,0xba,0xe8, |
521 | 0x0c,0x31,0xd7,0x5b,0x0c,0x25,0xd7,0x23, | 521 | 0x61,0x8e,0xba,0xd8,0x61,0x2e,0xb9,0x18, |
522 | 0x0d,0x35,0xd1,0x43,0x18,0x75,0xae,0xc2, | 522 | 0x69,0xae,0x8a,0x18,0xc3,0xad,0x76,0x10, |
523 | 0x19,0x73,0xa8,0xd6,0x0d,0x0b,0xd1,0xc7, | 523 | 0xcb,0x9d,0x46,0xb0,0x68,0x5e,0x8e,0x38, |
524 | 0x1b,0x6d,0xa4,0x92,0x24,0x93,0x24,0x95, | 524 | 0xdb,0x6d,0x24,0x91,0x24,0x99,0x24,0xa9, |
525 | 0x24,0x81,0x24,0xf9,0x25,0xe9,0x23,0x89, | 525 | 0x24,0x09,0x27,0xc9,0x2f,0x49,0x1c,0x49, |
526 | 0x36,0xc9,0x49,0x48,0x48,0x4e,0x4e,0x5a, | 526 | 0xb6,0x4a,0x4a,0x42,0x42,0x72,0x72,0xd2, |
527 | 0x5a,0x22,0x23,0x33,0x35,0x55,0x40,0x00, | 527 | 0xd1,0x11,0x19,0x99,0xaa,0xaa,0x00,0x03, |
528 | }; | 528 | }; |
529 | 529 | ||
530 | 530 | ||
diff --git a/apps/plugins/rockboy/palette-presets.h b/apps/plugins/rockboy/palette-presets.h new file mode 100644 index 0000000000..86c3898e06 --- /dev/null +++ b/apps/plugins/rockboy/palette-presets.h | |||
@@ -0,0 +1,151 @@ | |||
1 | /*************************************************************************** | ||
2 | * __________ __ ___. | ||
3 | * Open \______ \ ____ ____ | | _\_ |__ _______ ___ | ||
4 | * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / | ||
5 | * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < | ||
6 | * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ | ||
7 | * \/ \/ \/ \/ \/ | ||
8 | * $Id: palette-presets.h $ | ||
9 | * | ||
10 | * All files in this archive are subject to the GNU General Public License. | ||
11 | * See the file COPYING in the source tree root for full license agreement. | ||
12 | * | ||
13 | * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY | ||
14 | * KIND, either express or implied. | ||
15 | * | ||
16 | ****************************************************************************/ | ||
17 | #ifndef __PALETTE_PRESETS_H__ | ||
18 | #define __PALETTE_PRESETS_H__ | ||
19 | |||
20 | /* The following is an array of palettes for use in Rockboy. Some were | ||
21 | * originally found in GoomBA for Game Boy Advance by FluBBa. | ||
22 | * | ||
23 | * The first line contains the colors for the background layer. | ||
24 | * The second contains the colors for the window layer. | ||
25 | * The third contains the colors for object 0 layer. | ||
26 | * The fourth contains the colors for object 1 layer. | ||
27 | * | ||
28 | * gnuboy seems to like the colors to be 0xBBGGRR */ | ||
29 | |||
30 | int palettes [17][4][4] = { | ||
31 | { | ||
32 | /* Brown */ { 0x98d0e0, 0x68a0b0, 0x60707C, 0x2C3C3C }, | ||
33 | { 0x98d0e0, 0x68a0b0, 0x60707C, 0x2C3C3C }, | ||
34 | { 0x98d0e0, 0x68a0b0, 0x60707C, 0x2C3C3C }, | ||
35 | { 0x98d0e0, 0x68a0b0, 0x60707C, 0x2C3C3C } | ||
36 | }, | ||
37 | |||
38 | { | ||
39 | /* Gray */ { 0xffffff, 0xaaaaaa, 0x555555, 0x000000 }, | ||
40 | { 0xffffff, 0xaaaaaa, 0x555555, 0x000000 }, | ||
41 | { 0xffffff, 0xaaaaaa, 0x555555, 0x000000 }, | ||
42 | { 0xffffff, 0xaaaaaa, 0x555555, 0x000000 } | ||
43 | }, | ||
44 | |||
45 | { | ||
46 | /* Light Gray */ { 0xffffff, 0xc0c0c0, 0x808080, 0x404040 }, | ||
47 | { 0xffffff, 0xc0c0c0, 0x808080, 0x404040 }, | ||
48 | { 0xffffff, 0xc0c0c0, 0x808080, 0x404040 }, | ||
49 | { 0xffffff, 0xc0c0c0, 0x808080, 0x404040 } | ||
50 | }, | ||
51 | |||
52 | { | ||
53 | /* Multi-Color 1 */ { 0xffffff, 0xaaaaaa, 0x555555, 0x000000 }, | ||
54 | { 0xffffff, 0xaaaaaa, 0x555555, 0x000000 }, | ||
55 | { 0xffefef, 0xe78c5a, 0x9c4a18, 0x000000 }, | ||
56 | { 0xefefff, 0x635aef, 0x1810ad, 0x000000 } | ||
57 | }, | ||
58 | |||
59 | { | ||
60 | /* Multi-Color 2 */ { 0xffffff, 0xaaaaaa, 0x555555, 0x000000 }, | ||
61 | { 0xe7efd6, 0xc6de8c, 0x6b8429, 0x000000 }, | ||
62 | { 0xffffff, 0x635aef, 0x1810ad, 0x000000 }, | ||
63 | { 0xffffff, 0xe78c5a, 0x9c4a18, 0x000000 } | ||
64 | }, | ||
65 | |||
66 | { | ||
67 | /* Adventure Island */ { 0xffffff, 0xffb59c, 0x009431, 0x000000 }, | ||
68 | { 0xffffff, 0x73cef7, 0x084a8c, 0x9c2121 }, | ||
69 | { 0xdeffff, 0x73c6ef, 0x5263ff, 0x290000 }, | ||
70 | { 0xffffff, 0xa5a5e7, 0x29297b, 0x000042 } | ||
71 | }, | ||
72 | |||
73 | { | ||
74 | /* Adventure Island 2 */ { 0xffffff, 0x75eff7, 0xbd6b29, 0x000000 }, | ||
75 | { 0xffffff, 0x73cef7, 0x084a8c, 0x9c2121 }, | ||
76 | { 0xdeffff, 0x73c6ef, 0x5263ff, 0x290000 }, | ||
77 | { 0xffffff, 0xa5a5e7, 0x29297b, 0x000042 } | ||
78 | }, | ||
79 | |||
80 | { | ||
81 | /* Balloon Kid */ { 0xa5d6ff, 0xe7efff, 0xde8c10, 0x5a1000 }, | ||
82 | { 0xffffff, 0x73cef7, 0x084a8c, 0x9c2121 }, | ||
83 | { 0xc6c6ff, 0x6b6bff, 0x0000ff, 0x000063 }, | ||
84 | { 0xffffff, 0xef42ef, 0x29297b, 0x000042 } | ||
85 | }, | ||
86 | |||
87 | { | ||
88 | /* Batman */ { 0xeff7ff, 0xc88089, 0x445084, 0x001042 }, | ||
89 | { 0xffffff, 0xffa5a5, 0xbd5252, 0xa50000 }, | ||
90 | { 0xffffff, 0xc6a5a5, 0x8c5252, 0x5a0000 }, | ||
91 | { 0xffffff, 0xbdb5ad, 0x7b6b5a, 0x422108 } | ||
92 | }, | ||
93 | |||
94 | { | ||
95 | /* Batman */ { 0xffffff, 0xbdada5, 0x7b5a52, 0x391000 }, | ||
96 | /* Return of Joker */ { 0xffffff, 0xbdada5, 0x7b5a52, 0x391000 }, | ||
97 | { 0xffffff, 0xbdada5, 0x7b5a52, 0x391000 }, | ||
98 | { 0xffffff, 0xbdada5, 0x7b5a52, 0x422108 } | ||
99 | }, | ||
100 | |||
101 | { | ||
102 | /* Bionic Commando */ { 0xfff7ef, 0xadb5ce, 0x2921c6, 0x000039 }, | ||
103 | { 0xffffff, 0xf7ce94, 0xff3910, 0x4a0000 }, | ||
104 | { 0xffffff, 0x84adff, 0x00395a, 0x000000 }, | ||
105 | { 0xefefef, 0x9ca5ad, 0x5a5a6b, 0x081042 } | ||
106 | }, | ||
107 | |||
108 | { | ||
109 | /* Castlevania Adventure */ { 0xe7d6d6, 0xb5a58c, 0x6b5242, 0x181000 }, | ||
110 | { 0xffffff, 0xdba5a5, 0xad5252, 0x840000 }, | ||
111 | { 0xffffff, 0x84e7ff, 0x4252ff, 0x00005a }, | ||
112 | { 0xffffff, 0xceefff, 0x9cdef7, 0x6bb5f7 } | ||
113 | }, | ||
114 | |||
115 | { | ||
116 | /* Donkey Kong Land */ { 0xd1ffe2, 0x89ffa9, 0x48a251, 0x032504 }, | ||
117 | { 0xb4b4ff, 0x4747ff, 0x000080, 0x000000 }, | ||
118 | { 0xb0f2ff, 0x4dc3d6, 0x115ba3, 0x00006a }, | ||
119 | { 0x63fff7, 0x42cec6, 0x217b73, 0x000000 } | ||
120 | }, | ||
121 | |||
122 | { | ||
123 | /* Dr. Mario */ { 0xffffff, 0x66ffff, 0xff4221, 0x521000 }, | ||
124 | { 0xffffff, 0xd6aaaa, 0xad5555, 0x840000 }, | ||
125 | { 0xffffff, 0x84e7ff, 0x4252ff, 0x00008c }, | ||
126 | { 0xffffff, 0x8cceff, 0x5a9cf7, 0x005283 } | ||
127 | }, | ||
128 | |||
129 | { | ||
130 | /* Kirby */ { 0x83ffff, 0x3ea5ff, 0x004273, 0x000933 }, | ||
131 | { 0xffcccc, 0xff7877, 0xc13523, 0x5a0a05 }, | ||
132 | { 0xc4bdff, 0x604df1, 0x29129f, 0x000000 }, | ||
133 | { 0xffffff, 0xaaaaaa, 0x555555, 0x000020 } | ||
134 | }, | ||
135 | |||
136 | { | ||
137 | /* Metroid II */ { 0xdeffef, 0xb2ada2, 0x014284, 0x000000 }, | ||
138 | { 0xffcef7, 0xff6bce, 0x9c007b, 0x000000 }, | ||
139 | { 0x55efff, 0x1352ff, 0x001485, 0x000000 }, | ||
140 | { 0xffefef, 0xe78c5a, 0x9c4a18, 0x210000 } | ||
141 | }, | ||
142 | |||
143 | { | ||
144 | /* Zelda */ { 0xa0ffff, 0x67d767, 0x20558c, 0x071546 }, | ||
145 | { 0xadffff, 0xb78080, 0x592925, 0x000000 }, | ||
146 | { 0x7fb0ff, 0xe78c5a, 0x9c4a18, 0x000000 }, | ||
147 | { 0xefefff, 0x635aef, 0x1810ad, 0x000000 } | ||
148 | } | ||
149 | }; | ||
150 | |||
151 | #endif | ||
diff --git a/apps/plugins/rockboy/palette.c b/apps/plugins/rockboy/palette.c deleted file mode 100644 index 5c5083d247..0000000000 --- a/apps/plugins/rockboy/palette.c +++ /dev/null | |||
@@ -1,153 +0,0 @@ | |||
1 | |||
2 | |||
3 | #include "rockmacros.h" | ||
4 | #include "defs.h" | ||
5 | #include "fb.h" | ||
6 | #include "palette.h" | ||
7 | |||
8 | |||
9 | static byte palmap[32768]; | ||
10 | static byte pallock[256]; | ||
11 | static int palrev[256]; | ||
12 | |||
13 | /* Course color mapping, for when palette is exhausted. */ | ||
14 | static byte crsmap[4][32768]; | ||
15 | static int crsrev[4][256]; | ||
16 | static const int crsmask[4] = { 0x7BDE, 0x739C, 0x6318, 0x4210 }; | ||
17 | |||
18 | enum plstatus | ||
19 | { | ||
20 | pl_unused = 0, | ||
21 | pl_linger, | ||
22 | pl_active, | ||
23 | pl_locked | ||
24 | }; | ||
25 | |||
26 | /* | ||
27 | static byte bestmatch(int c) | ||
28 | { | ||
29 | byte n, best; | ||
30 | int r, g, b; | ||
31 | int r2, g2, b2, c2; | ||
32 | int err, besterr; | ||
33 | |||
34 | r = (c & 0x001F) << 3; | ||
35 | g = (c & 0x03E0) >> 2; | ||
36 | b = (c & 0x7C00) >> 7; | ||
37 | |||
38 | best = 0; | ||
39 | besterr = 1024; | ||
40 | for (n = 1; n; n++) | ||
41 | { | ||
42 | c2 = palrev[n]; | ||
43 | r2 = (c2 & 0x001F) << 3; | ||
44 | g2 = (c2 & 0x03E0) >> 2; | ||
45 | b2 = (c2 & 0x7C00) >> 7; | ||
46 | err = abs(r-r2) + abs(b-b2) + abs(g-g2); | ||
47 | if (err < besterr) | ||
48 | { | ||
49 | besterr = err; | ||
50 | best = n; | ||
51 | } | ||
52 | } | ||
53 | return best; | ||
54 | } | ||
55 | */ | ||
56 | |||
57 | static void makecourse(int c, byte n) | ||
58 | { | ||
59 | int i; | ||
60 | for (i = 0; i < 4; i++) | ||
61 | { | ||
62 | c &= crsmask[i]; | ||
63 | crsmap[i][c] = n; | ||
64 | crsrev[i][n] = c; | ||
65 | } | ||
66 | } | ||
67 | |||
68 | static byte findcourse(int c) | ||
69 | { | ||
70 | int i; | ||
71 | byte n; | ||
72 | for (i = 0; i < 4; i++) | ||
73 | { | ||
74 | c &= crsmask[i]; | ||
75 | n = crsmap[i][c]; | ||
76 | if (crsrev[i][n] == c) | ||
77 | return n; | ||
78 | } | ||
79 | return 0; | ||
80 | } | ||
81 | |||
82 | |||
83 | void pal_lock(byte n) | ||
84 | { | ||
85 | if (!n) return; | ||
86 | if (pallock[n] >= pl_locked) | ||
87 | pallock[n]++; | ||
88 | else pallock[n] = pl_locked; | ||
89 | } | ||
90 | |||
91 | byte pal_getcolor(int c, int r, int g, int b) | ||
92 | { | ||
93 | byte n; | ||
94 | static byte l; | ||
95 | n = palmap[c]; | ||
96 | if (n && pallock[n] && palrev[n] == c) | ||
97 | { | ||
98 | pal_lock(n); | ||
99 | return n; | ||
100 | } | ||
101 | for (n = l+1; n != l; n++) | ||
102 | { | ||
103 | if (!n || pallock[n] /* || n < 16 */) continue; | ||
104 | pal_lock(n); | ||
105 | palmap[c] = n; | ||
106 | palrev[n] = c; | ||
107 | makecourse(c, n); | ||
108 | vid_setpal(n, r, g, b); | ||
109 | return (l = n); | ||
110 | } | ||
111 | n = findcourse(c); | ||
112 | pal_lock(n); | ||
113 | return n; | ||
114 | } | ||
115 | |||
116 | void pal_release(byte n) | ||
117 | { | ||
118 | if (pallock[n] >= pl_locked) | ||
119 | pallock[n]--; | ||
120 | } | ||
121 | |||
122 | |||
123 | void pal_expire(void) | ||
124 | { | ||
125 | int i; | ||
126 | for (i = 0; i < 256; i++) | ||
127 | if (pallock[i] && pallock[i] < pl_locked) | ||
128 | pallock[i]--; | ||
129 | } | ||
130 | |||
131 | |||
132 | void pal_set332(void) | ||
133 | { | ||
134 | int i, r, g, b; | ||
135 | |||
136 | fb.indexed = 0; | ||
137 | fb.cc[0].r = 5; | ||
138 | fb.cc[1].r = 5; | ||
139 | fb.cc[2].r = 6; | ||
140 | fb.cc[0].l = 0; | ||
141 | fb.cc[1].l = 3; | ||
142 | fb.cc[2].l = 6; | ||
143 | |||
144 | i = 0; | ||
145 | for (b = 0; b < 4; b++) for (g = 0; g < 8; g++) for (r = 0; r < 8; r++) | ||
146 | vid_setpal(i++, (r<<5)|(r<<2)|(r>>1), | ||
147 | (g<<5)|(g<<2)|(g>>1), (b<<6)|(b<<4)|(b<<2)|b); | ||
148 | } | ||
149 | |||
150 | |||
151 | |||
152 | |||
153 | |||
diff --git a/apps/plugins/rockboy/palette.h b/apps/plugins/rockboy/palette.h deleted file mode 100644 index 94f660b71e..0000000000 --- a/apps/plugins/rockboy/palette.h +++ /dev/null | |||
@@ -1,6 +0,0 @@ | |||
1 | void pal_lock(byte n) ICODE_ATTR; | ||
2 | byte pal_getcolor(int c, int r, int g, int b) ICODE_ATTR; | ||
3 | void pal_release(byte n) ICODE_ATTR; | ||
4 | void pal_expire(void) ICODE_ATTR; | ||
5 | void pal_set332(void) ICODE_ATTR; | ||
6 | void vid_setpal(int i, int r, int g, int b) ICODE_ATTR; | ||
diff --git a/apps/plugins/rockboy/pcm.h b/apps/plugins/rockboy/pcm.h index 3719933520..a616ce9897 100644 --- a/apps/plugins/rockboy/pcm.h +++ b/apps/plugins/rockboy/pcm.h | |||
@@ -7,10 +7,10 @@ | |||
7 | 7 | ||
8 | struct pcm | 8 | struct pcm |
9 | { | 9 | { |
10 | int hz, len; | 10 | int hz, len; |
11 | int stereo; | 11 | int stereo; |
12 | byte *buf; | 12 | byte *buf; |
13 | int pos; | 13 | int pos; |
14 | }; | 14 | }; |
15 | 15 | ||
16 | extern struct pcm pcm; | 16 | extern struct pcm pcm; |
diff --git a/apps/plugins/rockboy/rbsound.c b/apps/plugins/rockboy/rbsound.c index 6371212ca8..41d00c1b73 100644 --- a/apps/plugins/rockboy/rbsound.c +++ b/apps/plugins/rockboy/rbsound.c | |||
@@ -1,11 +1,13 @@ | |||
1 | #include "rockmacros.h" | 1 | #include "rockmacros.h" |
2 | #include "defs.h" | 2 | #include "defs.h" |
3 | #include "pcm.h" | 3 | #include "pcm.h" |
4 | #include "rc.h" | ||
5 | 4 | ||
6 | //#define ONEBUF // Note: I think the single buffer implementation is more responsive with sound(less lag) | 5 | /*#define ONEBUF*/ |
7 | // but it creates more choppyness overall to the sound. 2 buffer's don't seem to make | 6 | /* Note: I think the single buffer implementation is more |
8 | // a difference, but 4 buffers is definately noticable | 7 | * responsive with sound(less lag) but it creates more |
8 | * choppyness overall to the sound. 2 buffer's don't seem to | ||
9 | * make a difference, but 4 buffers is definately noticable | ||
10 | */ | ||
9 | 11 | ||
10 | struct pcm pcm IBSS_ATTR; | 12 | struct pcm pcm IBSS_ATTR; |
11 | 13 | ||
@@ -17,11 +19,6 @@ bool sound = 1; | |||
17 | #endif | 19 | #endif |
18 | #define BUF_SIZE 1024 | 20 | #define BUF_SIZE 1024 |
19 | 21 | ||
20 | rcvar_t pcm_exports[] = | ||
21 | { | ||
22 | RCV_END | ||
23 | }; | ||
24 | |||
25 | #if CONFIG_CODEC == SWCODEC && !defined(SIMULATOR) | 22 | #if CONFIG_CODEC == SWCODEC && !defined(SIMULATOR) |
26 | 23 | ||
27 | #ifndef ONEBUF | 24 | #ifndef ONEBUF |
@@ -48,46 +45,45 @@ void get_more(unsigned char** start, size_t* size) | |||
48 | 45 | ||
49 | void pcm_init(void) | 46 | void pcm_init(void) |
50 | { | 47 | { |
51 | if(!sound) return; | 48 | newly_started = true; |
52 | |||
53 | newly_started = true; | ||
54 | 49 | ||
55 | pcm.hz = 11025; | 50 | pcm.hz = 11025; |
56 | pcm.stereo = 1; | 51 | pcm.stereo = 1; |
57 | 52 | ||
58 | pcm.len = BUF_SIZE; | 53 | pcm.len = BUF_SIZE; |
59 | if(!buf){ | 54 | if(!buf){ |
60 | buf = my_malloc(pcm.len * N_BUFS); | 55 | buf = my_malloc(pcm.len * N_BUFS); |
61 | gmbuf = my_malloc(pcm.len * N_BUFS*sizeof (short)); | 56 | gmbuf = my_malloc(pcm.len * N_BUFS*sizeof (short)); |
62 | pcm.buf = buf; | 57 | pcm.buf = buf; |
63 | pcm.pos = 0; | 58 | pcm.pos = 0; |
64 | #ifndef ONEBUF | 59 | #ifndef ONEBUF |
65 | curbuf = gmcurbuf= 0; | 60 | curbuf = gmcurbuf= 0; |
66 | #endif | 61 | #endif |
67 | memset(gmbuf, 0, pcm.len * N_BUFS *sizeof(short)); | 62 | memset(gmbuf, 0, pcm.len * N_BUFS *sizeof(short)); |
68 | memset(buf, 0, pcm.len * N_BUFS); | 63 | memset(buf, 0, pcm.len * N_BUFS); |
69 | } | 64 | } |
70 | 65 | ||
71 | rb->pcm_play_stop(); | 66 | rb->pcm_play_stop(); |
72 | 67 | ||
73 | rb->pcm_set_frequency(11025); // 44100 22050 11025 | 68 | rb->pcm_set_frequency(11025); /* 44100 22050 11025 */ |
74 | } | 69 | } |
75 | 70 | ||
76 | void pcm_close(void) | 71 | void pcm_close(void) |
77 | { | 72 | { |
78 | memset(&pcm, 0, sizeof pcm); | 73 | memset(&pcm, 0, sizeof pcm); |
79 | newly_started = true; | 74 | newly_started = true; |
80 | rb->pcm_play_stop(); | 75 | rb->pcm_play_stop(); |
81 | rb->pcm_set_frequency(44100); | 76 | rb->pcm_set_frequency(44100); |
82 | } | 77 | } |
83 | 78 | ||
84 | int pcm_submit(void) | 79 | int pcm_submit(void) |
85 | { | 80 | { |
86 | register int i; | 81 | if (!options.sound) return 1; |
82 | register int i; | ||
87 | 83 | ||
88 | if (!sound) { | 84 | if (!sound) { |
89 | pcm.pos = 0; | 85 | pcm.pos = 0; |
90 | return 0; | 86 | return 0; |
91 | } | 87 | } |
92 | 88 | ||
93 | if (pcm.pos < pcm.len) return 1; | 89 | if (pcm.pos < pcm.len) return 1; |
@@ -98,7 +94,7 @@ int pcm_submit(void) | |||
98 | #endif | 94 | #endif |
99 | pcm.pos = 0; | 95 | pcm.pos = 0; |
100 | 96 | ||
101 | // gotta convert the 8 bit buffer to 16 | 97 | /* gotta convert the 8 bit buffer to 16 */ |
102 | for(i=0; i<pcm.len;i++) | 98 | for(i=0; i<pcm.len;i++) |
103 | #ifdef ONEBUF | 99 | #ifdef ONEBUF |
104 | gmbuf[i] = (pcm.buf[i]<<8)-0x8000; | 100 | gmbuf[i] = (pcm.buf[i]<<8)-0x8000; |
@@ -112,7 +108,9 @@ int pcm_submit(void) | |||
112 | newly_started = false; | 108 | newly_started = false; |
113 | } | 109 | } |
114 | 110 | ||
115 | // this while loop and done play are in place to make sure the sound timing is correct(although it's not) | 111 | /* this while loop and done play are in place to make sure the sound timing |
112 | * is correct(although it's not) | ||
113 | */ | ||
116 | #ifdef ONEBUF | 114 | #ifdef ONEBUF |
117 | while(doneplay==0) rb->yield(); | 115 | while(doneplay==0) rb->yield(); |
118 | doneplay=0; | 116 | doneplay=0; |
@@ -120,7 +118,7 @@ int pcm_submit(void) | |||
120 | return 1; | 118 | return 1; |
121 | } | 119 | } |
122 | #else | 120 | #else |
123 | static byte buf1_unal[(BUF_SIZE / sizeof(short)) + 2]; // to make sure 4 byte aligned | 121 | static byte buf1_unal[(BUF_SIZE / sizeof(short)) + 2]; /* 4 byte aligned */ |
124 | void pcm_init(void) | 122 | void pcm_init(void) |
125 | { | 123 | { |
126 | pcm.hz = 11025; | 124 | pcm.hz = 11025; |
diff --git a/apps/plugins/rockboy/rc.h b/apps/plugins/rockboy/rc.h deleted file mode 100644 index cb65d2a7cc..0000000000 --- a/apps/plugins/rockboy/rc.h +++ /dev/null | |||
@@ -1,62 +0,0 @@ | |||
1 | #ifndef __RC_H__ | ||
2 | #define __RC_H__ | ||
3 | |||
4 | typedef enum rctype | ||
5 | { | ||
6 | rcv_end, | ||
7 | rcv_int, | ||
8 | rcv_string, | ||
9 | rcv_vector, | ||
10 | rcv_bool | ||
11 | } rcvtype_t; | ||
12 | |||
13 | |||
14 | typedef struct rcvar_s | ||
15 | { | ||
16 | char *name; | ||
17 | int type; | ||
18 | int len; | ||
19 | void *mem; | ||
20 | } rcvar_t; | ||
21 | |||
22 | #define RCV_END { 0, rcv_end, 0, 0 } | ||
23 | #define RCV_INT(n,v) { (n), rcv_int, 1, (v) } | ||
24 | #define RCV_STRING(n,v) { (n), rcv_string, 0, (v) } | ||
25 | #define RCV_VECTOR(n,v,l) { (n), rcv_vector, (l), (v) } | ||
26 | #define RCV_BOOL(n,v) { (n), rcv_bool, 1, (v) } | ||
27 | |||
28 | typedef struct rccmd_s | ||
29 | { | ||
30 | char *name; | ||
31 | int (*func)(int, char **); | ||
32 | } rccmd_t; | ||
33 | |||
34 | #define RCC(n,f) { (n), (f) } | ||
35 | #define RCC_END { 0, 0 } | ||
36 | |||
37 | void rc_export(rcvar_t *v); | ||
38 | void rc_exportvars(rcvar_t *vars); | ||
39 | |||
40 | int rc_findvar(char *name); | ||
41 | |||
42 | int rc_setvar_n(int i, int c, char **v); | ||
43 | int rc_setvar(char *name, int c, char **v); | ||
44 | |||
45 | int rc_getint_n(int i); | ||
46 | int *rc_getvec_n(int i); | ||
47 | char *rc_getstr_n(int i); | ||
48 | |||
49 | int rc_getint(char *name); | ||
50 | int *rc_getvec(char *name); | ||
51 | char *rc_getstr(char *name); | ||
52 | |||
53 | int rc_bindkey(char *keyname, char *cmd); | ||
54 | int rc_unbindkey(char *keyname); | ||
55 | void rc_unbindall(void); | ||
56 | |||
57 | int rc_sourcefile(char *filename); | ||
58 | void rc_dokey(int key, int st); | ||
59 | |||
60 | int rc_command(char *line); | ||
61 | |||
62 | #endif | ||
diff --git a/apps/plugins/rockboy/rccmds.c b/apps/plugins/rockboy/rccmds.c deleted file mode 100644 index c9375b69b5..0000000000 --- a/apps/plugins/rockboy/rccmds.c +++ /dev/null | |||
@@ -1,122 +0,0 @@ | |||
1 | |||
2 | |||
3 | |||
4 | |||
5 | #include "rockmacros.h" | ||
6 | |||
7 | #include "defs.h" | ||
8 | #include "rc.h" | ||
9 | #include "hw.h" | ||
10 | #include "emu.h" | ||
11 | #include "save.h" | ||
12 | #include "split.h" | ||
13 | |||
14 | /* | ||
15 | * the set command is used to set rc-exported variables. | ||
16 | */ | ||
17 | |||
18 | static int cmd_set(int argc, char **argv) | ||
19 | { | ||
20 | if (argc < 3) | ||
21 | return -1; | ||
22 | return rc_setvar(argv[1], argc-2, argv+2); | ||
23 | } | ||
24 | |||
25 | |||
26 | |||
27 | /* | ||
28 | * the following commands allow keys to be bound to perform rc commands. | ||
29 | */ | ||
30 | |||
31 | static int cmd_reset(int argc, char **argv) | ||
32 | { | ||
33 | (void)argc; | ||
34 | (void)argv; | ||
35 | emu_reset(); | ||
36 | return 0; | ||
37 | } | ||
38 | |||
39 | static int cmd_savestate(int argc, char **argv) | ||
40 | { | ||
41 | state_save(argc > 1 ? atoi(argv[1]) : -1); | ||
42 | return 0; | ||
43 | } | ||
44 | |||
45 | static int cmd_loadstate(int argc, char **argv) | ||
46 | { | ||
47 | state_load(argc > 1 ? atoi(argv[1]) : -1); | ||
48 | return 0; | ||
49 | } | ||
50 | |||
51 | |||
52 | |||
53 | /* | ||
54 | * table of command names and the corresponding functions to be called | ||
55 | */ | ||
56 | |||
57 | rccmd_t rccmds[] = | ||
58 | { | ||
59 | RCC("set", cmd_set), | ||
60 | RCC("reset", cmd_reset), | ||
61 | RCC("savestate", cmd_savestate), | ||
62 | RCC("loadstate", cmd_loadstate), | ||
63 | RCC_END | ||
64 | }; | ||
65 | |||
66 | |||
67 | |||
68 | |||
69 | |||
70 | int rc_command(char *line) | ||
71 | { | ||
72 | int i, argc, ret; | ||
73 | char *argv[128], linecopy[500]; | ||
74 | |||
75 | // linecopy = malloc(strlen(line)+1); | ||
76 | strcpy(linecopy, line); | ||
77 | |||
78 | argc = splitline(argv, (sizeof argv)/(sizeof argv[0]), linecopy); | ||
79 | if (!argc) | ||
80 | { | ||
81 | // free(linecopy); | ||
82 | return -1; | ||
83 | } | ||
84 | |||
85 | for (i = 0; rccmds[i].name; i++) | ||
86 | { | ||
87 | if (!strcmp(argv[0], rccmds[i].name)) | ||
88 | { | ||
89 | ret = rccmds[i].func(argc, argv); | ||
90 | // free(linecopy); | ||
91 | return ret; | ||
92 | } | ||
93 | } | ||
94 | |||
95 | /* printf("unknown command: %s\n", argv[0]); */ | ||
96 | // free(linecopy); | ||
97 | |||
98 | return -1; | ||
99 | } | ||
100 | |||
101 | |||
102 | |||
103 | |||
104 | |||
105 | |||
106 | |||
107 | |||
108 | |||
109 | |||
110 | |||
111 | |||
112 | |||
113 | |||
114 | |||
115 | |||
116 | |||
117 | |||
118 | |||
119 | |||
120 | |||
121 | |||
122 | |||
diff --git a/apps/plugins/rockboy/rcvars.c b/apps/plugins/rockboy/rcvars.c deleted file mode 100644 index a47794aa6f..0000000000 --- a/apps/plugins/rockboy/rcvars.c +++ /dev/null | |||
@@ -1,211 +0,0 @@ | |||
1 | #include "rockmacros.h" | ||
2 | |||
3 | #include "defs.h" | ||
4 | #include "rc.h" | ||
5 | |||
6 | static rcvar_t rcvars[150]; | ||
7 | |||
8 | static int nvars; | ||
9 | |||
10 | void rc_export(rcvar_t *v) | ||
11 | { | ||
12 | const rcvar_t end = RCV_END; | ||
13 | |||
14 | if (!v) return; | ||
15 | nvars++; | ||
16 | // rcvars = realloc(rcvars, sizeof (rcvar_t) * (nvars+1)); | ||
17 | // if (!rcvars) | ||
18 | // die("out of memory adding rcvar %s\n", v->name); | ||
19 | rcvars[nvars-1] = *v; | ||
20 | rcvars[nvars] = end; | ||
21 | } | ||
22 | |||
23 | void rc_exportvars(rcvar_t *vars) | ||
24 | { | ||
25 | while(vars->type) | ||
26 | rc_export(vars++); | ||
27 | } | ||
28 | |||
29 | |||
30 | |||
31 | int rc_findvar(char *name) | ||
32 | { | ||
33 | int i; | ||
34 | if (!rcvars) return -1; | ||
35 | for (i = 0; rcvars[i].name; i++) | ||
36 | if (!strcmp(rcvars[i].name, name)) | ||
37 | break; | ||
38 | if (!rcvars[i].name) | ||
39 | return -1; | ||
40 | return i; | ||
41 | } | ||
42 | |||
43 | |||
44 | int my_atoi(const char *s) | ||
45 | { | ||
46 | int a = 0; | ||
47 | if (*s == '0') | ||
48 | { | ||
49 | s++; | ||
50 | if (*s == 'x' || *s == 'X') | ||
51 | { | ||
52 | s++; | ||
53 | while (*s) | ||
54 | { | ||
55 | if (isdigit(*s)) | ||
56 | a = (a<<4) + *s - '0'; | ||
57 | else if (strchr("ABCDEF", *s)) | ||
58 | a = (a<<4) + *s - 'A' + 10; | ||
59 | else if (strchr("abcdef", *s)) | ||
60 | a = (a<<4) + *s - 'a' + 10; | ||
61 | else return a; | ||
62 | s++; | ||
63 | } | ||
64 | return a; | ||
65 | } | ||
66 | while (*s) | ||
67 | { | ||
68 | if (strchr("01234567", *s)) | ||
69 | a = (a<<3) + *s - '0'; | ||
70 | else return a; | ||
71 | s++; | ||
72 | } | ||
73 | return a; | ||
74 | } | ||
75 | if (*s == '-') | ||
76 | { | ||
77 | s++; | ||
78 | for (;;) | ||
79 | { | ||
80 | if (isdigit(*s)) | ||
81 | a = (a*10) + *s - '0'; | ||
82 | else return -a; | ||
83 | s++; | ||
84 | } | ||
85 | } | ||
86 | while (*s) | ||
87 | { | ||
88 | if (isdigit(*s)) | ||
89 | a = (a*10) + *s - '0'; | ||
90 | else return a; | ||
91 | s++; | ||
92 | } | ||
93 | return a; | ||
94 | } | ||
95 | |||
96 | |||
97 | int rc_setvar_n(int i, int c, char **v) | ||
98 | { | ||
99 | int j; | ||
100 | int *n; | ||
101 | char **s; | ||
102 | |||
103 | switch (rcvars[i].type) | ||
104 | { | ||
105 | case rcv_int: | ||
106 | if (c < 1) return -1; | ||
107 | n = (int *)rcvars[i].mem; | ||
108 | *n = my_atoi(v[0]); | ||
109 | return 0; | ||
110 | case rcv_string: | ||
111 | if (c < 1) return -1; | ||
112 | s = (char **)rcvars[i].mem; | ||
113 | // if (*s) free(*s); | ||
114 | strcpy(*s,v[0]); | ||
115 | if (!*s) | ||
116 | die("out of memory setting rcvar %s\n", rcvars[i].name); | ||
117 | return 0; | ||
118 | case rcv_vector: | ||
119 | if (c > rcvars[i].len) | ||
120 | c = rcvars[i].len; | ||
121 | for (j = 0; j < c ; j++) | ||
122 | ((int *)rcvars[i].mem)[j] = my_atoi(v[j]); | ||
123 | return 0; | ||
124 | case rcv_bool: | ||
125 | if (c < 1 || atoi(v[0]) || strchr("yYtT", v[0][0])) | ||
126 | *(int *)rcvars[i].mem = 1; | ||
127 | else if (strchr("0nNfF", v[0][0])) | ||
128 | *(int *)rcvars[i].mem = 0; | ||
129 | else | ||
130 | return -1; | ||
131 | return 0; | ||
132 | } | ||
133 | return -1; | ||
134 | } | ||
135 | |||
136 | |||
137 | int rc_setvar(char *name, int c, char **v) | ||
138 | { | ||
139 | int i; | ||
140 | |||
141 | i = rc_findvar(name); | ||
142 | if (i < 0) return i; | ||
143 | |||
144 | return rc_setvar_n(i, c, v); | ||
145 | } | ||
146 | |||
147 | |||
148 | void *rc_getmem_n(int i) | ||
149 | { | ||
150 | return rcvars[i].mem; | ||
151 | } | ||
152 | |||
153 | |||
154 | void *rc_getmem(char *name) | ||
155 | { | ||
156 | int i; | ||
157 | i = rc_findvar(name); | ||
158 | if (i < 0) return NULL; | ||
159 | return rcvars[i].mem; | ||
160 | } | ||
161 | |||
162 | int rc_getint_n(int i) | ||
163 | { | ||
164 | if (i < 0) return 0; | ||
165 | switch (rcvars[i].type) | ||
166 | { | ||
167 | case rcv_int: | ||
168 | case rcv_bool: | ||
169 | return *(int *)rcvars[i].mem; | ||
170 | } | ||
171 | return 0; | ||
172 | } | ||
173 | |||
174 | int *rc_getvec_n(int i) | ||
175 | { | ||
176 | if (i < 0) return NULL; | ||
177 | switch (rcvars[i].type) | ||
178 | { | ||
179 | case rcv_int: | ||
180 | case rcv_bool: | ||
181 | case rcv_vector: | ||
182 | return (int *)rcvars[i].mem; | ||
183 | } | ||
184 | return NULL; | ||
185 | } | ||
186 | |||
187 | char *rc_getstr_n(int i) | ||
188 | { | ||
189 | if (i < 0) return 0; | ||
190 | switch (rcvars[i].type) | ||
191 | { | ||
192 | case rcv_string: | ||
193 | return *(char **)rcvars[i].mem; | ||
194 | } | ||
195 | return 0; | ||
196 | } | ||
197 | |||
198 | int rc_getint(char *name) | ||
199 | { | ||
200 | return rc_getint_n(rc_findvar(name)); | ||
201 | } | ||
202 | |||
203 | int *rc_getvec(char *name) | ||
204 | { | ||
205 | return rc_getvec_n(rc_findvar(name)); | ||
206 | } | ||
207 | |||
208 | char *rc_getstr(char *name) | ||
209 | { | ||
210 | return rc_getstr_n(rc_findvar(name)); | ||
211 | } | ||
diff --git a/apps/plugins/rockboy/rockboy.c b/apps/plugins/rockboy/rockboy.c index beefb210b0..01e4de51c5 100644 --- a/apps/plugins/rockboy/rockboy.c +++ b/apps/plugins/rockboy/rockboy.c | |||
@@ -86,7 +86,7 @@ void setoptions (void) | |||
86 | snprintf(optionsave, sizeof(optionsave), "%s/%s", savedir, optionname); | 86 | snprintf(optionsave, sizeof(optionsave), "%s/%s", savedir, optionname); |
87 | 87 | ||
88 | fd = open(optionsave, O_RDONLY); | 88 | fd = open(optionsave, O_RDONLY); |
89 | if(fd < 0) // no options to read, set defaults | 89 | if(fd < 0) /* no options to read, set defaults */ |
90 | { | 90 | { |
91 | #if (CONFIG_KEYPAD == IRIVER_H100_PAD) | 91 | #if (CONFIG_KEYPAD == IRIVER_H100_PAD) |
92 | options.A=BUTTON_ON; | 92 | options.A=BUTTON_ON; |
@@ -136,13 +136,31 @@ void setoptions (void) | |||
136 | options.START=BUTTON_SCROLL_UP; | 136 | options.START=BUTTON_SCROLL_UP; |
137 | options.SELECT=BUTTON_SCROLL_DOWN; | 137 | options.SELECT=BUTTON_SCROLL_DOWN; |
138 | options.MENU=BUTTON_POWER; | 138 | options.MENU=BUTTON_POWER; |
139 | #elif CONFIG_KEYPAD == IAUDIO_X5_PAD | ||
140 | options.A=BUTTON_PLAY; | ||
141 | options.B=BUTTON_REC; | ||
142 | options.START=BUTTON_SELECT; | ||
143 | options.SELECT=BUTTON_NONE; | ||
144 | options.MENU=BUTTON_POWER; | ||
145 | |||
146 | #elif CONFIG_KEYPAD == IRIVER_H10_PAD | ||
147 | options.A=BUTTON_PLAY; | ||
148 | options.B=BUTTON_FF; | ||
149 | options.START=BUTTON_REW; | ||
150 | options.SELECT=BUTTON_NONE; | ||
151 | options.MENU=BUTTON_POWER; | ||
139 | #endif | 152 | #endif |
140 | 153 | ||
141 | options.maxskip=4; | 154 | options.maxskip=4; |
142 | options.fps=0; | 155 | options.fps=0; |
143 | options.showstats=0; | 156 | options.showstats=0; |
157 | #if (LCD_WIDTH>=160) && (LCD_HEIGHT>=144) | ||
144 | options.fullscreen=0; | 158 | options.fullscreen=0; |
159 | #else | ||
160 | options.fullscreen=1; | ||
161 | #endif | ||
145 | options.sound=1; | 162 | options.sound=1; |
163 | options.pal=0; | ||
146 | } | 164 | } |
147 | else | 165 | else |
148 | read(fd,&options, sizeof(options)); | 166 | read(fd,&options, sizeof(options)); |
@@ -197,9 +215,6 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter) | |||
197 | rb->wheel_send_events(false); | 215 | rb->wheel_send_events(false); |
198 | #endif | 216 | #endif |
199 | 217 | ||
200 | /* now go ahead and have fun! */ | ||
201 | /* rb->splash(HZ*2, true, "Rockboy v0.3"); */ | ||
202 | /* rb->lcd_clear_display(); */ | ||
203 | gnuboy_main(parameter); | 218 | gnuboy_main(parameter); |
204 | 219 | ||
205 | #ifdef HAVE_WHEEL_POSITION | 220 | #ifdef HAVE_WHEEL_POSITION |
diff --git a/apps/plugins/rockboy/rockmacros.h b/apps/plugins/rockboy/rockmacros.h index 3bfcf94728..06db25b433 100644 --- a/apps/plugins/rockboy/rockmacros.h +++ b/apps/plugins/rockboy/rockmacros.h | |||
@@ -28,24 +28,30 @@ void *my_malloc(size_t size); | |||
28 | 28 | ||
29 | extern struct plugin_api* rb; | 29 | extern struct plugin_api* rb; |
30 | extern int shut,cleanshut; | 30 | extern int shut,cleanshut; |
31 | void vid_update(int scanline); | ||
32 | void vid_init(void); | 31 | void vid_init(void); |
33 | inline void vid_begin(void); | 32 | inline void vid_begin(void); |
34 | void vid_end(void); | ||
35 | void die(char *message, ...); | 33 | void die(char *message, ...); |
36 | void setmallocpos(void *pointer); | 34 | void setmallocpos(void *pointer); |
37 | void vid_settitle(char *title); | ||
38 | void *sys_timer(void); | 35 | void *sys_timer(void); |
39 | int sys_elapsed(long *oldtick); | 36 | int sys_elapsed(long *oldtick); |
40 | void sys_sleep(int us); | ||
41 | int pcm_submit(void); | 37 | int pcm_submit(void); |
42 | void pcm_init(void); | 38 | void pcm_init(void); |
39 | void sound_dirty(void); | ||
43 | void doevents(void) ICODE_ATTR; | 40 | void doevents(void) ICODE_ATTR; |
44 | void ev_poll(void); | 41 | void ev_poll(void); |
45 | int do_user_menu(void); | 42 | int do_user_menu(void); |
46 | void loadstate(int fd); | 43 | void loadstate(int fd); |
47 | void savestate(int fd); | 44 | void savestate(int fd); |
48 | void setvidmode(int mode); | 45 | void setvidmode(int mode); |
46 | void set_pal(void); | ||
47 | #if !defined(HAVE_LCD_COLOR) | ||
48 | void vid_update(int scanline); | ||
49 | #endif | ||
50 | #ifdef DYNAREC | ||
51 | extern struct dynarec_block newblock; | ||
52 | void dynamic_recompile (struct dynarec_block *newblock); | ||
53 | #endif | ||
54 | |||
49 | #define USER_MENU_QUIT -2 | 55 | #define USER_MENU_QUIT -2 |
50 | 56 | ||
51 | /* Disable ICODE for the ARMs */ | 57 | /* Disable ICODE for the ARMs */ |
@@ -54,6 +60,12 @@ void setvidmode(int mode); | |||
54 | #define ICODE_ATTR | 60 | #define ICODE_ATTR |
55 | #endif | 61 | #endif |
56 | 62 | ||
63 | /* Disable IBSS when using dynarec since it won't fit */ | ||
64 | #ifdef DYNAREC | ||
65 | #undef IBSS_ATTR | ||
66 | #define IBSS_ATTR | ||
67 | #endif | ||
68 | |||
57 | /* libc functions */ | 69 | /* libc functions */ |
58 | #define isdigit(c) ((c) >= '0' && (c) <= '9') | 70 | #define isdigit(c) ((c) >= '0' && (c) <= '9') |
59 | #define isalpha(c) (((c) >= 'a' && (c) <= 'z') || ((c) >= 'A' && ((c) <= 'Z'))) | 71 | #define isalpha(c) (((c) >= 'a' && (c) <= 'z') || ((c) >= 'A' && ((c) <= 'Z'))) |
@@ -101,12 +113,13 @@ void setvidmode(int mode); | |||
101 | #define tolower(_A_) (isupper(_A_) ? (_A_ - 'A' + 'a') : _A_) | 113 | #define tolower(_A_) (isupper(_A_) ? (_A_ - 'A' + 'a') : _A_) |
102 | 114 | ||
103 | /* Using #define isn't enough with GCC 4.0.1 */ | 115 | /* Using #define isn't enough with GCC 4.0.1 */ |
104 | void* memcpy(void* dst, const void* src, size_t size); | 116 | void* memcpy(void* dst, const void* src, size_t size) ICODE_ATTR; |
105 | 117 | ||
106 | struct options { | 118 | struct options { |
107 | int A, B, START, SELECT, MENU; | 119 | int A, B, START, SELECT, MENU; |
108 | int frameskip, fps, maxskip; | 120 | int frameskip, fps, maxskip; |
109 | int sound, fullscreen, showstats; | 121 | int sound, fullscreen, showstats; |
122 | int pal; | ||
110 | }; | 123 | }; |
111 | 124 | ||
112 | extern struct options options; | 125 | extern struct options options; |
diff --git a/apps/plugins/rockboy/rtc-gb.h b/apps/plugins/rockboy/rtc-gb.h index 39c6145161..94772da923 100644 --- a/apps/plugins/rockboy/rtc-gb.h +++ b/apps/plugins/rockboy/rtc-gb.h | |||
@@ -6,12 +6,12 @@ | |||
6 | 6 | ||
7 | struct rtc | 7 | struct rtc |
8 | { | 8 | { |
9 | int batt; | 9 | int batt; |
10 | int sel; | 10 | int sel; |
11 | int latch; | 11 | int latch; |
12 | int d, h, m, s, t; | 12 | int d, h, m, s, t; |
13 | int stop, carry; | 13 | int stop, carry; |
14 | byte regs[8]; | 14 | byte regs[8]; |
15 | }; | 15 | }; |
16 | 16 | ||
17 | extern struct rtc rtc; | 17 | extern struct rtc rtc; |
@@ -21,5 +21,5 @@ void rtc_write(byte b); | |||
21 | void rtc_tick(void); | 21 | void rtc_tick(void); |
22 | void rtc_save_internal(int fd); | 22 | void rtc_save_internal(int fd); |
23 | void rtc_load_internal(int fd); | 23 | void rtc_load_internal(int fd); |
24 | 24 | ||
25 | #endif | 25 | #endif |
diff --git a/apps/plugins/rockboy/rtc.c b/apps/plugins/rockboy/rtc.c index 05ad69864a..0b011a828c 100644 --- a/apps/plugins/rockboy/rtc.c +++ b/apps/plugins/rockboy/rtc.c | |||
@@ -7,119 +7,109 @@ | |||
7 | #include "defs.h" | 7 | #include "defs.h" |
8 | #include "mem.h" | 8 | #include "mem.h" |
9 | #include "rtc-gb.h" | 9 | #include "rtc-gb.h" |
10 | #include "rc.h" | ||
11 | |||
12 | struct rtc rtc IBSS_ATTR; | ||
13 | |||
14 | static int syncrtc = 1; | ||
15 | |||
16 | rcvar_t rtc_exports[] = | ||
17 | { | ||
18 | RCV_BOOL("syncrtc", &syncrtc), | ||
19 | RCV_END | ||
20 | }; | ||
21 | 10 | ||
11 | struct rtc rtc; | ||
22 | 12 | ||
23 | void rtc_latch(byte b) | 13 | void rtc_latch(byte b) |
24 | { | 14 | { |
25 | if ((rtc.latch ^ b) & b & 1) | 15 | if ((rtc.latch ^ b) & b & 1) |
26 | { | 16 | { |
27 | rtc.regs[0] = rtc.s; | 17 | rtc.regs[0] = rtc.s; |
28 | rtc.regs[1] = rtc.m; | 18 | rtc.regs[1] = rtc.m; |
29 | rtc.regs[2] = rtc.h; | 19 | rtc.regs[2] = rtc.h; |
30 | rtc.regs[3] = rtc.d; | 20 | rtc.regs[3] = rtc.d; |
31 | rtc.regs[4] = (rtc.d>>9) | (rtc.stop<<6) | (rtc.carry<<7); | 21 | rtc.regs[4] = (rtc.d>>9) | (rtc.stop<<6) | (rtc.carry<<7); |
32 | rtc.regs[5] = 0xff; | 22 | rtc.regs[5] = 0xff; |
33 | rtc.regs[6] = 0xff; | 23 | rtc.regs[6] = 0xff; |
34 | rtc.regs[7] = 0xff; | 24 | rtc.regs[7] = 0xff; |
35 | } | 25 | } |
36 | rtc.latch = b; | 26 | rtc.latch = b; |
37 | } | 27 | } |
38 | 28 | ||
39 | void rtc_write(byte b) | 29 | void rtc_write(byte b) |
40 | { | 30 | { |
41 | /* printf("write %02X: %02X (%d)\n", rtc.sel, b, b); */ | 31 | /* printf("write %02X: %02X (%d)\n", rtc.sel, b, b); */ |
42 | if (!(rtc.sel & 8)) return; | 32 | if (!(rtc.sel & 8)) return; |
43 | switch (rtc.sel & 7) | 33 | switch (rtc.sel & 7) |
44 | { | 34 | { |
45 | case 0: | 35 | case 0: |
46 | rtc.s = rtc.regs[0] = b; | 36 | rtc.s = rtc.regs[0] = b; |
47 | while (rtc.s >= 60) rtc.s -= 60; | 37 | while (rtc.s >= 60) rtc.s -= 60; |
48 | break; | 38 | break; |
49 | case 1: | 39 | case 1: |
50 | rtc.m = rtc.regs[1] = b; | 40 | rtc.m = rtc.regs[1] = b; |
51 | while (rtc.m >= 60) rtc.m -= 60; | 41 | while (rtc.m >= 60) rtc.m -= 60; |
52 | break; | 42 | break; |
53 | case 2: | 43 | case 2: |
54 | rtc.h = rtc.regs[2] = b; | 44 | rtc.h = rtc.regs[2] = b; |
55 | while (rtc.h >= 24) rtc.h -= 24; | 45 | while (rtc.h >= 24) rtc.h -= 24; |
56 | break; | 46 | break; |
57 | case 3: | 47 | case 3: |
58 | rtc.regs[3] = b; | 48 | rtc.regs[3] = b; |
59 | rtc.d = (rtc.d & 0x100) | b; | 49 | rtc.d = (rtc.d & 0x100) | b; |
60 | break; | 50 | break; |
61 | case 4: | 51 | case 4: |
62 | rtc.regs[4] = b; | 52 | rtc.regs[4] = b; |
63 | rtc.d = (rtc.d & 0xff) | ((b&1)<<9); | 53 | rtc.d = (rtc.d & 0xff) | ((b&1)<<9); |
64 | rtc.stop = (b>>6)&1; | 54 | rtc.stop = (b>>6)&1; |
65 | rtc.carry = (b>>7)&1; | 55 | rtc.carry = (b>>7)&1; |
66 | break; | 56 | break; |
67 | } | 57 | } |
68 | } | 58 | } |
69 | 59 | ||
70 | void rtc_tick() | 60 | void rtc_tick() |
71 | { | 61 | { |
72 | if (rtc.stop) return; | 62 | if (rtc.stop) return; |
73 | if (++rtc.t == 60) | 63 | if (++rtc.t == 60) |
74 | { | 64 | { |
75 | if (++rtc.s == 60) | 65 | if (++rtc.s == 60) |
76 | { | 66 | { |
77 | if (++rtc.m == 60) | 67 | if (++rtc.m == 60) |
78 | { | 68 | { |
79 | if (++rtc.h == 24) | 69 | if (++rtc.h == 24) |
80 | { | 70 | { |
81 | if (++rtc.d == 365) | 71 | if (++rtc.d == 365) |
82 | { | 72 | { |
83 | rtc.d = 0; | 73 | rtc.d = 0; |
84 | rtc.carry = 1; | 74 | rtc.carry = 1; |
85 | } | 75 | } |
86 | rtc.h = 0; | 76 | rtc.h = 0; |
87 | } | 77 | } |
88 | rtc.m = 0; | 78 | rtc.m = 0; |
89 | } | 79 | } |
90 | rtc.s = 0; | 80 | rtc.s = 0; |
91 | } | 81 | } |
92 | rtc.t = 0; | 82 | rtc.t = 0; |
93 | } | 83 | } |
94 | } | 84 | } |
95 | 85 | ||
96 | void rtc_save_internal(int fd) | 86 | void rtc_save_internal(int fd) |
97 | { | 87 | { |
98 | (void)fd; // stop compiler complaining | 88 | (void)fd; /* stop compiler complaining */ |
99 | // TODO | 89 | /* TODO */ |
100 | // fprintf(f, "%d %d %d %02d %02d %02d %02d\n%d\n", | 90 | /* fprintf(f, "%d %d %d %02d %02d %02d %02d\n%d\n", |
101 | // rtc.carry, rtc.stop, rtc.d, rtc.h, rtc.m, rtc.s, rtc.t, | 91 | rtc.carry, rtc.stop, rtc.d, rtc.h, rtc.m, rtc.s, rtc.t, |
102 | // time(0)); | 92 | time(0)); */ |
103 | } | 93 | } |
104 | 94 | ||
105 | void rtc_load_internal(int fd) | 95 | void rtc_load_internal(int fd) |
106 | { | 96 | { |
107 | //int rt = 0; | 97 | /* int rt = 0; */ |
108 | (void)fd; // stop compiler complaining | 98 | (void)fd; /* stop compiler complaining */ |
109 | // TODO | 99 | /* TODO */ |
110 | /* fscanf( | 100 | /* fscanf( |
111 | f, "%d %d %d %02d %02d %02d %02d\n%d\n", | 101 | f, "%d %d %d %02d %02d %02d %02d\n%d\n", |
112 | &rtc.carry, &rtc.stop, &rtc.d, | 102 | &rtc.carry, &rtc.stop, &rtc.d, |
113 | &rtc.h, &rtc.m, &rtc.s, &rtc.t, &rt); | 103 | &rtc.h, &rtc.m, &rtc.s, &rtc.t, &rt); |
114 | while (rtc.t >= 60) rtc.t -= 60; | 104 | while (rtc.t >= 60) rtc.t -= 60; |
115 | while (rtc.s >= 60) rtc.s -= 60; | 105 | while (rtc.s >= 60) rtc.s -= 60; |
116 | while (rtc.m >= 60) rtc.m -= 60; | 106 | while (rtc.m >= 60) rtc.m -= 60; |
117 | while (rtc.h >= 24) rtc.h -= 24; | 107 | while (rtc.h >= 24) rtc.h -= 24; |
118 | while (rtc.d >= 365) rtc.d -= 365; | 108 | while (rtc.d >= 365) rtc.d -= 365; |
119 | rtc.stop &= 1; | 109 | rtc.stop &= 1; |
120 | rtc.carry &= 1; | 110 | rtc.carry &= 1; |
121 | if (rt) rt = (time(0) - rt) * 60; | 111 | if (rt) rt = (time(0) - rt) * 60; |
122 | if (syncrtc) while (rt-- > 0) rtc_tick(); */ | 112 | if (syncrtc) while (rt-- > 0) rtc_tick(); */ |
123 | } | 113 | } |
124 | 114 | ||
125 | 115 | ||
diff --git a/apps/plugins/rockboy/save.c b/apps/plugins/rockboy/save.c index 0277eb53d1..2332811911 100644 --- a/apps/plugins/rockboy/save.c +++ b/apps/plugins/rockboy/save.c | |||
@@ -30,9 +30,9 @@ | |||
30 | 30 | ||
31 | struct svar | 31 | struct svar |
32 | { | 32 | { |
33 | int len; | 33 | int len; |
34 | char key[4]; | 34 | char key[4]; |
35 | void *ptr; | 35 | void *ptr; |
36 | }; | 36 | }; |
37 | 37 | ||
38 | static int ver; | 38 | static int ver; |
@@ -41,247 +41,243 @@ static int hramofs, hiofs, palofs, oamofs, wavofs; | |||
41 | 41 | ||
42 | struct svar svars[] = | 42 | struct svar svars[] = |
43 | { | 43 | { |
44 | I4("GbSs", &ver), | 44 | I4("GbSs", &ver), |
45 | 45 | ||
46 | I2("PC ", &PC), | 46 | I2("PC ", &PC), |
47 | I2("SP ", &SP), | 47 | I2("SP ", &SP), |
48 | I2("HL ", &HL), | 48 | I2("HL ", &HL), |
49 | #ifdef DYNAREC | 49 | #ifdef DYNAREC |
50 | I1("A ", &A), | 50 | I1("A ", &A), |
51 | I1("B ", &A), | 51 | I1("B ", &A), |
52 | I1("C ", &A), | 52 | I1("C ", &A), |
53 | I1("D ", &A), | 53 | I1("D ", &A), |
54 | I1("E ", &A), | 54 | I1("E ", &A), |
55 | I1("F ", &A), | 55 | I1("F ", &A), |
56 | #else | 56 | #else |
57 | I2("BC ", &BC), | 57 | I2("BC ", &BC), |
58 | I2("DE ", &DE), | 58 | I2("DE ", &DE), |
59 | I2("AF ", &AF), | 59 | I2("AF ", &AF), |
60 | #endif | 60 | #endif |
61 | I4("IME ", &cpu.ime), | 61 | I4("IME ", &cpu.ime), |
62 | I4("ima ", &cpu.ima), | 62 | I4("ima ", &cpu.ima), |
63 | I4("spd ", &cpu.speed), | 63 | I4("spd ", &cpu.speed), |
64 | I4("halt", &cpu.halt), | 64 | I4("halt", &cpu.halt), |
65 | I4("div ", &cpu.div), | 65 | I4("div ", &cpu.div), |
66 | I4("tim ", &cpu.tim), | 66 | I4("tim ", &cpu.tim), |
67 | I4("lcdc", &cpu.lcdc), | 67 | I4("lcdc", &cpu.lcdc), |
68 | I4("snd ", &cpu.snd), | 68 | I4("snd ", &cpu.snd), |
69 | 69 | ||
70 | I1("ints", &hw.ilines), | 70 | I1("ints", &hw.ilines), |
71 | I1("pad ", &hw.pad), | 71 | I1("pad ", &hw.pad), |
72 | I4("cgb ", &hw.cgb), | 72 | I4("cgb ", &hw.cgb), |
73 | I4("gba ", &hw.gba), | 73 | |
74 | 74 | I4("mbcm", &mbc.model), | |
75 | I4("mbcm", &mbc.model), | 75 | I4("romb", &mbc.rombank), |
76 | I4("romb", &mbc.rombank), | 76 | I4("ramb", &mbc.rambank), |
77 | I4("ramb", &mbc.rambank), | 77 | I4("enab", &mbc.enableram), |
78 | I4("enab", &mbc.enableram), | 78 | I4("batt", &mbc.batt), |
79 | I4("batt", &mbc.batt), | 79 | |
80 | 80 | I4("rtcR", &rtc.sel), | |
81 | I4("rtcR", &rtc.sel), | 81 | I4("rtcL", &rtc.latch), |
82 | I4("rtcL", &rtc.latch), | 82 | I4("rtcC", &rtc.carry), |
83 | I4("rtcC", &rtc.carry), | 83 | I4("rtcS", &rtc.stop), |
84 | I4("rtcS", &rtc.stop), | 84 | I4("rtcd", &rtc.d), |
85 | I4("rtcd", &rtc.d), | 85 | I4("rtch", &rtc.h), |
86 | I4("rtch", &rtc.h), | 86 | I4("rtcm", &rtc.m), |
87 | I4("rtcm", &rtc.m), | 87 | I4("rtcs", &rtc.s), |
88 | I4("rtcs", &rtc.s), | 88 | I4("rtct", &rtc.t), |
89 | I4("rtct", &rtc.t), | 89 | I1("rtR8", &rtc.regs[0]), |
90 | I1("rtR8", &rtc.regs[0]), | 90 | I1("rtR9", &rtc.regs[1]), |
91 | I1("rtR9", &rtc.regs[1]), | 91 | I1("rtRA", &rtc.regs[2]), |
92 | I1("rtRA", &rtc.regs[2]), | 92 | I1("rtRB", &rtc.regs[3]), |
93 | I1("rtRB", &rtc.regs[3]), | 93 | I1("rtRC", &rtc.regs[4]), |
94 | I1("rtRC", &rtc.regs[4]), | 94 | |
95 | 95 | I4("S1on", &snd.ch[0].on), | |
96 | I4("S1on", &snd.ch[0].on), | 96 | I4("S1p ", &snd.ch[0].pos), |
97 | I4("S1p ", &snd.ch[0].pos), | 97 | I4("S1c ", &snd.ch[0].cnt), |
98 | I4("S1c ", &snd.ch[0].cnt), | 98 | I4("S1ec", &snd.ch[0].encnt), |
99 | I4("S1ec", &snd.ch[0].encnt), | 99 | I4("S1sc", &snd.ch[0].swcnt), |
100 | I4("S1sc", &snd.ch[0].swcnt), | 100 | |
101 | I4("S1sf", &snd.ch[0].swfreq), | 101 | I4("S2on", &snd.ch[1].on), |
102 | 102 | I4("S2p ", &snd.ch[1].pos), | |
103 | I4("S2on", &snd.ch[1].on), | 103 | I4("S2c ", &snd.ch[1].cnt), |
104 | I4("S2p ", &snd.ch[1].pos), | 104 | I4("S2ec", &snd.ch[1].encnt), |
105 | I4("S2c ", &snd.ch[1].cnt), | 105 | |
106 | I4("S2ec", &snd.ch[1].encnt), | 106 | I4("S3on", &snd.ch[2].on), |
107 | 107 | I4("S3p ", &snd.ch[2].pos), | |
108 | I4("S3on", &snd.ch[2].on), | 108 | I4("S3c ", &snd.ch[2].cnt), |
109 | I4("S3p ", &snd.ch[2].pos), | 109 | |
110 | I4("S3c ", &snd.ch[2].cnt), | 110 | I4("S4on", &snd.ch[3].on), |
111 | 111 | I4("S4p ", &snd.ch[3].pos), | |
112 | I4("S4on", &snd.ch[3].on), | 112 | I4("S4c ", &snd.ch[3].cnt), |
113 | I4("S4p ", &snd.ch[3].pos), | 113 | I4("S4ec", &snd.ch[3].encnt), |
114 | I4("S4c ", &snd.ch[3].cnt), | 114 | |
115 | I4("S4ec", &snd.ch[3].encnt), | 115 | I4("hdma", &hw.hdma), |
116 | 116 | ||
117 | I4("hdma", &hw.hdma), | 117 | I4("sram", &sramblock), |
118 | 118 | I4("iram", &iramblock), | |
119 | I4("sram", &sramblock), | 119 | I4("vram", &vramblock), |
120 | I4("iram", &iramblock), | 120 | I4("hi ", &hiofs), |
121 | I4("vram", &vramblock), | 121 | I4("pal ", &palofs), |
122 | I4("hi ", &hiofs), | 122 | I4("oam ", &oamofs), |
123 | I4("pal ", &palofs), | 123 | |
124 | I4("oam ", &oamofs), | 124 | /* NOSAVE is a special code to prevent the rest of the table |
125 | I4("wav ", &wavofs), | 125 | * from being saved, used to support old stuff for backwards |
126 | 126 | * compatibility... */ | |
127 | /* NOSAVE is a special code to prevent the rest of the table | 127 | NOSAVE, |
128 | * from being saved, used to support old stuff for backwards | 128 | |
129 | * compatibility... */ | 129 | /* the following are obsolete as of 0x104 */ |
130 | NOSAVE, | 130 | |
131 | 131 | I4("hram", &hramofs), | |
132 | /* the following are obsolete as of 0x104 */ | 132 | /* I4("gba ", &hw.gba), */ |
133 | 133 | /* I4("S1sf", &snd.ch[0].swfreq), */ | |
134 | I4("hram", &hramofs), | 134 | I4("wav ", &wavofs), |
135 | 135 | ||
136 | R(P1), R(SB), R(SC), | 136 | R(P1), R(SB), R(SC), |
137 | R(DIV), R(TIMA), R(TMA), R(TAC), | 137 | R(DIV), R(TIMA), R(TMA), R(TAC), |
138 | R(IE), R(IF), | 138 | R(IE), R(IF), |
139 | R(LCDC), R(STAT), R(LY), R(LYC), | 139 | R(LCDC), R(STAT), R(LY), R(LYC), |
140 | R(SCX), R(SCY), R(WX), R(WY), | 140 | R(SCX), R(SCY), R(WX), R(WY), |
141 | R(BGP), R(OBP0), R(OBP1), | 141 | R(BGP), R(OBP0), R(OBP1), |
142 | R(DMA), | 142 | R(DMA), |
143 | 143 | ||
144 | R(VBK), R(SVBK), R(KEY1), | 144 | R(VBK), R(SVBK), R(KEY1), |
145 | R(BCPS), R(BCPD), R(OCPS), R(OCPD), | 145 | R(BCPS), R(BCPD), R(OCPS), R(OCPD), |
146 | 146 | ||
147 | R(NR10), R(NR11), R(NR12), R(NR13), R(NR14), | 147 | R(NR10), R(NR11), R(NR12), R(NR13), R(NR14), |
148 | R(NR21), R(NR22), R(NR23), R(NR24), | 148 | R(NR21), R(NR22), R(NR23), R(NR24), |
149 | R(NR30), R(NR31), R(NR32), R(NR33), R(NR34), | 149 | R(NR30), R(NR31), R(NR32), R(NR33), R(NR34), |
150 | R(NR41), R(NR42), R(NR43), R(NR44), | 150 | R(NR41), R(NR42), R(NR43), R(NR44), |
151 | R(NR50), R(NR51), R(NR52), | 151 | R(NR50), R(NR51), R(NR52), |
152 | 152 | ||
153 | I1("DMA1", &R_HDMA1), | 153 | I1("DMA1", &R_HDMA1), |
154 | I1("DMA2", &R_HDMA2), | 154 | I1("DMA2", &R_HDMA2), |
155 | I1("DMA3", &R_HDMA3), | 155 | I1("DMA3", &R_HDMA3), |
156 | I1("DMA4", &R_HDMA4), | 156 | I1("DMA4", &R_HDMA4), |
157 | I1("DMA5", &R_HDMA5), | 157 | I1("DMA5", &R_HDMA5), |
158 | 158 | ||
159 | END | 159 | END |
160 | }; | 160 | }; |
161 | 161 | ||
162 | 162 | ||
163 | void loadstate(int fd) | 163 | void loadstate(int fd) |
164 | { | 164 | { |
165 | int i, j; | 165 | int i, j; |
166 | byte buf[4096]; | 166 | byte buf[4096]; |
167 | un32 (*header)[2] = (un32 (*)[2])buf; | 167 | un32 (*header)[2] = (un32 (*)[2])buf; |
168 | un32 d; | 168 | un32 d; |
169 | int irl = hw.cgb ? 8 : 2; | 169 | int irl = hw.cgb ? 8 : 2; |
170 | int vrl = hw.cgb ? 4 : 2; | 170 | int vrl = hw.cgb ? 4 : 2; |
171 | int srl = mbc.ramsize << 1; | 171 | int srl = mbc.ramsize << 1; |
172 | size_t base_offset; | 172 | size_t base_offset; |
173 | 173 | ||
174 | ver = hramofs = hiofs = palofs = oamofs = wavofs = 0; | 174 | ver = hramofs = hiofs = palofs = oamofs = wavofs = 0; |
175 | 175 | ||
176 | base_offset = lseek(fd, 0, SEEK_CUR); | 176 | base_offset = lseek(fd, 0, SEEK_CUR); |
177 | 177 | ||
178 | read(fd,buf, 4096); | 178 | read(fd,buf, 4096); |
179 | 179 | ||
180 | for (j = 0; header[j][0]; j++) | 180 | for (j = 0; header[j][0]; j++) |
181 | { | 181 | { |
182 | for (i = 0; svars[i].ptr; i++) | 182 | for (i = 0; svars[i].ptr; i++) |
183 | { | 183 | { |
184 | if (header[j][0] != *(un32 *)svars[i].key) | 184 | if (header[j][0] != *(un32 *)svars[i].key) |
185 | continue; | 185 | continue; |
186 | d = LIL(header[j][1]); | 186 | d = LIL(header[j][1]); |
187 | switch (svars[i].len) | 187 | switch (svars[i].len) |
188 | { | 188 | { |
189 | case 1: | 189 | case 1: |
190 | *(byte *)svars[i].ptr = d; | 190 | *(byte *)svars[i].ptr = d; |
191 | break; | 191 | break; |
192 | case 2: | 192 | case 2: |
193 | *(un16 *)svars[i].ptr = d; | 193 | *(un16 *)svars[i].ptr = d; |
194 | break; | 194 | break; |
195 | case 4: | 195 | case 4: |
196 | *(un32 *)svars[i].ptr = d; | 196 | *(un32 *)svars[i].ptr = d; |
197 | break; | 197 | break; |
198 | } | 198 | } |
199 | break; | 199 | break; |
200 | } | 200 | } |
201 | } | 201 | } |
202 | 202 | ||
203 | /* obsolete as of version 0x104 */ | 203 | /* obsolete as of version 0x104 */ |
204 | if (hramofs) memcpy(ram.hi+128, buf+hramofs, 127); | 204 | if (hramofs) memcpy(ram.hi+128, buf+hramofs, 127); |
205 | 205 | if (wavofs) memcpy(ram.hi+48, buf+wavofs, 16); | |
206 | if (hiofs) memcpy(ram.hi, buf+hiofs, sizeof ram.hi); | 206 | |
207 | if (palofs) memcpy(lcd.pal, buf+palofs, sizeof lcd.pal); | 207 | if (hiofs) memcpy(ram.hi, buf+hiofs, sizeof ram.hi); |
208 | if (oamofs) memcpy(lcd.oam.mem, buf+oamofs, sizeof lcd.oam); | 208 | if (palofs) memcpy(lcd.pal, buf+palofs, sizeof lcd.pal); |
209 | 209 | if (oamofs) memcpy(lcd.oam.mem, buf+oamofs, sizeof lcd.oam); | |
210 | if (wavofs) memcpy(snd.wave, buf+wavofs, sizeof snd.wave); | 210 | |
211 | else memcpy(snd.wave, ram.hi+0x30, 16); /* patch data from older files */ | 211 | lseek(fd, base_offset + (iramblock << 12), SEEK_SET); |
212 | 212 | read(fd,ram.ibank, 4096*irl); | |
213 | lseek(fd, base_offset + (iramblock << 12), SEEK_SET); | 213 | |
214 | read(fd,ram.ibank, 4096*irl); | 214 | lseek(fd, base_offset + (vramblock << 12), SEEK_SET); |
215 | 215 | read(fd,lcd.vbank, 4096*vrl); | |
216 | lseek(fd, base_offset + (vramblock << 12), SEEK_SET); | 216 | |
217 | read(fd,lcd.vbank, 4096*vrl); | 217 | lseek(fd, base_offset + (sramblock << 12), SEEK_SET); |
218 | 218 | read(fd,ram.sbank, 4096*srl); | |
219 | lseek(fd, base_offset + (sramblock << 12), SEEK_SET); | 219 | vram_dirty(); |
220 | read(fd,ram.sbank, 4096*srl); | 220 | pal_dirty(); |
221 | vram_dirty(); | 221 | sound_dirty(); |
222 | pal_dirty(); | 222 | mem_updatemap(); |
223 | sound_dirty(); | ||
224 | mem_updatemap(); | ||
225 | } | 223 | } |
226 | 224 | ||
227 | void savestate(int fd) | 225 | void savestate(int fd) |
228 | { | 226 | { |
229 | int i; | 227 | int i; |
230 | byte buf[4096]; | 228 | byte buf[4096]; |
231 | un32 (*header)[2] = (un32 (*)[2])buf; | 229 | un32 (*header)[2] = (un32 (*)[2])buf; |
232 | un32 d = 0; | 230 | un32 d = 0; |
233 | int irl = hw.cgb ? 8 : 2; | 231 | int irl = hw.cgb ? 8 : 2; |
234 | int vrl = hw.cgb ? 4 : 2; | 232 | int vrl = hw.cgb ? 4 : 2; |
235 | int srl = mbc.ramsize << 1; | 233 | int srl = mbc.ramsize << 1; |
236 | size_t base_offset; | 234 | size_t base_offset; |
237 | 235 | ||
238 | ver = 0x105; | 236 | ver = 0x104; |
239 | iramblock = 1; | 237 | iramblock = 1; |
240 | vramblock = 1+irl; | 238 | vramblock = 1+irl; |
241 | sramblock = 1+irl+vrl; | 239 | sramblock = 1+irl+vrl; |
242 | wavofs = 4096 - 784; | 240 | hiofs = 4096 - 768; |
243 | hiofs = 4096 - 768; | 241 | palofs = 4096 - 512; |
244 | palofs = 4096 - 512; | 242 | oamofs = 4096 - 256; |
245 | oamofs = 4096 - 256; | 243 | memset(buf, 0, sizeof buf); |
246 | memset(buf, 0, sizeof buf); | 244 | |
247 | 245 | for (i = 0; svars[i].len > 0; i++) | |
248 | for (i = 0; svars[i].len > 0; i++) | 246 | { |
249 | { | 247 | header[i][0] = *(un32 *)svars[i].key; |
250 | header[i][0] = *(un32 *)svars[i].key; | 248 | switch (svars[i].len) |
251 | switch (svars[i].len) | 249 | { |
252 | { | 250 | case 1: |
253 | case 1: | 251 | d = *(byte *)svars[i].ptr; |
254 | d = *(byte *)svars[i].ptr; | 252 | break; |
255 | break; | 253 | case 2: |
256 | case 2: | 254 | d = *(un16 *)svars[i].ptr; |
257 | d = *(un16 *)svars[i].ptr; | 255 | break; |
258 | break; | 256 | case 4: |
259 | case 4: | 257 | d = *(un32 *)svars[i].ptr; |
260 | d = *(un32 *)svars[i].ptr; | 258 | break; |
261 | break; | 259 | } |
262 | } | 260 | header[i][1] = LIL(d); |
263 | header[i][1] = LIL(d); | 261 | } |
264 | } | 262 | header[i][0] = header[i][1] = 0; |
265 | header[i][0] = header[i][1] = 0; | 263 | |
266 | 264 | memcpy(buf+hiofs, ram.hi, sizeof ram.hi); | |
267 | memcpy(buf+hiofs, ram.hi, sizeof ram.hi); | 265 | memcpy(buf+palofs, lcd.pal, sizeof lcd.pal); |
268 | memcpy(buf+palofs, lcd.pal, sizeof lcd.pal); | 266 | memcpy(buf+oamofs, lcd.oam.mem, sizeof lcd.oam); |
269 | memcpy(buf+oamofs, lcd.oam.mem, sizeof lcd.oam); | 267 | |
270 | memcpy(buf+wavofs, snd.wave, sizeof snd.wave); | 268 | /* calculate base offset for output file */ |
271 | 269 | /* (we'll seek relative to that from now on) */ | |
272 | /* calculate base offset for output file */ | 270 | base_offset = lseek(fd, 0, SEEK_CUR); |
273 | /* (we'll seek relative to that from now on) */ | 271 | write(fd,buf, 4096); |
274 | base_offset = lseek(fd, 0, SEEK_CUR); | 272 | |
275 | write(fd,buf, 4096); | 273 | lseek(fd, base_offset + (iramblock << 12), SEEK_SET); |
276 | 274 | write(fd,ram.ibank, 4096*irl); | |
277 | lseek(fd, base_offset + (iramblock << 12), SEEK_SET); | 275 | |
278 | write(fd,ram.ibank, 4096*irl); | 276 | lseek(fd, base_offset + (vramblock << 12), SEEK_SET); |
279 | 277 | write(fd,lcd.vbank, 4096*vrl); | |
280 | lseek(fd, base_offset + (vramblock << 12), SEEK_SET); | 278 | |
281 | write(fd,lcd.vbank, 4096*vrl); | 279 | lseek(fd, base_offset + (sramblock << 12), SEEK_SET); |
282 | 280 | write(fd,ram.sbank, 4096*srl); | |
283 | lseek(fd, base_offset + (sramblock << 12), SEEK_SET); | ||
284 | write(fd,ram.sbank, 4096*srl); | ||
285 | } | 281 | } |
286 | 282 | ||
287 | 283 | ||
diff --git a/apps/plugins/rockboy/sound.c b/apps/plugins/rockboy/sound.c index deeacc7bbf..707bb6b956 100644 --- a/apps/plugins/rockboy/sound.c +++ b/apps/plugins/rockboy/sound.c | |||
@@ -8,63 +8,38 @@ | |||
8 | #include "cpu-gb.h" | 8 | #include "cpu-gb.h" |
9 | #include "hw.h" | 9 | #include "hw.h" |
10 | #include "regs.h" | 10 | #include "regs.h" |
11 | #include "rc.h" | ||
12 | #include "noise.h" | 11 | #include "noise.h" |
13 | 12 | ||
14 | 13 | ||
15 | static const byte dmgwave[16] = | ||
16 | { | ||
17 | 0xac, 0xdd, 0xda, 0x48, | ||
18 | 0x36, 0x02, 0xcf, 0x16, | ||
19 | 0x2c, 0x04, 0xe5, 0x2c, | ||
20 | 0xac, 0xdd, 0xda, 0x48 | ||
21 | }; | ||
22 | |||
23 | static const byte cgbwave[16] = | ||
24 | { | ||
25 | 0x00, 0xff, 0x00, 0xff, | ||
26 | 0x00, 0xff, 0x00, 0xff, | ||
27 | 0x00, 0xff, 0x00, 0xff, | ||
28 | 0x00, 0xff, 0x00, 0xff, | ||
29 | }; | ||
30 | |||
31 | |||
32 | static const byte sqwave[4][8] = | 14 | static const byte sqwave[4][8] = |
33 | { | 15 | { |
34 | { 0, 0,-1, 0, 0, 0, 0, 0 }, | 16 | { 0, 0,-1, 0, 0, 0, 0, 0 }, |
35 | { 0,-1,-1, 0, 0, 0, 0, 0 }, | 17 | { 0,-1,-1, 0, 0, 0, 0, 0 }, |
36 | { -1,-1,-1,-1, 0, 0, 0, 0 }, | 18 | { 0,-1,-1,-1,-1, 0, 0, 0 }, |
37 | { -1, 0, 0,-1,-1,-1,-1,-1 } | 19 | { -1, 0, 0,-1,-1,-1,-1,-1 } |
38 | }; | 20 | }; |
39 | 21 | ||
40 | static const int freqtab[8] = | 22 | static const int freqtab[8] = |
41 | { | 23 | { |
42 | (1<<14)*2, | 24 | (1<<18)*2, |
43 | (1<<14), | 25 | (1<<18), |
44 | (1<<14)/2, | 26 | (1<<18)/2, |
45 | (1<<14)/3, | 27 | (1<<18)/3, |
46 | (1<<14)/4, | 28 | (1<<18)/4, |
47 | (1<<14)/5, | 29 | (1<<18)/5, |
48 | (1<<14)/6, | 30 | (1<<18)/6, |
49 | (1<<14)/7 | 31 | (1<<18)/7 |
50 | }; | 32 | }; |
51 | 33 | ||
52 | struct snd snd IBSS_ATTR; | 34 | struct snd snd IBSS_ATTR; |
53 | int pcm_submit(void); | ||
54 | 35 | ||
55 | #define RATE (snd.rate) | 36 | #define RATE (snd.rate) |
56 | #define WAVE (snd.wave) /* ram.hi+0x30 */ | 37 | #define WAVE (ram.hi+0x30) |
57 | #define S1 (snd.ch[0]) | 38 | #define S1 (snd.ch[0]) |
58 | #define S2 (snd.ch[1]) | 39 | #define S2 (snd.ch[1]) |
59 | #define S3 (snd.ch[2]) | 40 | #define S3 (snd.ch[2]) |
60 | #define S4 (snd.ch[3]) | 41 | #define S4 (snd.ch[3]) |
61 | 42 | ||
62 | rcvar_t sound_exports[] = | ||
63 | { | ||
64 | RCV_END | ||
65 | }; | ||
66 | |||
67 | |||
68 | static void s1_freq_d(int d) | 43 | static void s1_freq_d(int d) |
69 | { | 44 | { |
70 | if (RATE > (d<<4)) S1.freq = 0; | 45 | if (RATE > (d<<4)) S1.freq = 0; |
@@ -86,14 +61,13 @@ static void s2_freq(void) | |||
86 | static void s3_freq(void) | 61 | static void s3_freq(void) |
87 | { | 62 | { |
88 | int d = 2048 - (((R_NR34&7)<<8) + R_NR33); | 63 | int d = 2048 - (((R_NR34&7)<<8) + R_NR33); |
89 | if (RATE > (d<<3)) S3.freq = 0; | 64 | if (RATE > d) S3.freq = 0; |
90 | else S3.freq = (RATE << 21)/d; | 65 | else S3.freq = (RATE << 21)/d; |
91 | } | 66 | } |
92 | 67 | ||
93 | static void s4_freq(void) | 68 | static void s4_freq(void) |
94 | { | 69 | { |
95 | S4.freq = (freqtab[R_NR43&7] >> (R_NR43 >> 4)) * RATE; | 70 | S4.freq = (freqtab[R_NR43&7] >> (R_NR43 >> 4)) * RATE; |
96 | if (S4.freq >> 18) S4.freq = 1<<18; | ||
97 | } | 71 | } |
98 | 72 | ||
99 | void sound_dirty(void) | 73 | void sound_dirty(void) |
@@ -103,13 +77,13 @@ void sound_dirty(void) | |||
103 | S1.envol = R_NR12 >> 4; | 77 | S1.envol = R_NR12 >> 4; |
104 | S1.endir = (R_NR12>>3) & 1; | 78 | S1.endir = (R_NR12>>3) & 1; |
105 | S1.endir |= S1.endir - 1; | 79 | S1.endir |= S1.endir - 1; |
106 | S1.enlen = (R_NR12 & 7) << 15; | 80 | S1.enlen = (R_NR12 & 3) << 15; |
107 | s1_freq(); | 81 | s1_freq(); |
108 | S2.len = (64-(R_NR21&63)) << 13; | 82 | S2.len = (64-(R_NR21&63)) << 13; |
109 | S2.envol = R_NR22 >> 4; | 83 | S2.envol = R_NR22 >> 4; |
110 | S2.endir = (R_NR22>>3) & 1; | 84 | S2.endir = (R_NR22>>3) & 1; |
111 | S2.endir |= S2.endir - 1; | 85 | S2.endir |= S2.endir - 1; |
112 | S2.enlen = (R_NR22 & 7) << 15; | 86 | S2.enlen = (R_NR22 & 3) << 15; |
113 | s2_freq(); | 87 | s2_freq(); |
114 | S3.len = (256-R_NR31) << 20; | 88 | S3.len = (256-R_NR31) << 20; |
115 | s3_freq(); | 89 | s3_freq(); |
@@ -117,16 +91,16 @@ void sound_dirty(void) | |||
117 | S4.envol = R_NR42 >> 4; | 91 | S4.envol = R_NR42 >> 4; |
118 | S4.endir = (R_NR42>>3) & 1; | 92 | S4.endir = (R_NR42>>3) & 1; |
119 | S4.endir |= S4.endir - 1; | 93 | S4.endir |= S4.endir - 1; |
120 | S4.enlen = (R_NR42 & 7) << 15; | 94 | S4.enlen = (R_NR42 & 3) << 15; |
121 | s4_freq(); | 95 | s4_freq(); |
122 | } | 96 | } |
123 | 97 | ||
124 | void sound_off(void) | 98 | void sound_reset(void) |
125 | { | 99 | { |
126 | memset(&S1, 0, sizeof S1); | 100 | int i; |
127 | memset(&S2, 0, sizeof S2); | 101 | memset(&snd, 0, sizeof snd); |
128 | memset(&S3, 0, sizeof S3); | 102 | if (pcm.hz) snd.rate = (1<<21) / pcm.hz; |
129 | memset(&S4, 0, sizeof S4); | 103 | else snd.rate = 0; |
130 | R_NR10 = 0x80; | 104 | R_NR10 = 0x80; |
131 | R_NR11 = 0xBF; | 105 | R_NR11 = 0xBF; |
132 | R_NR12 = 0xF3; | 106 | R_NR12 = 0xF3; |
@@ -137,7 +111,7 @@ void sound_off(void) | |||
137 | R_NR30 = 0x7F; | 111 | R_NR30 = 0x7F; |
138 | R_NR31 = 0xFF; | 112 | R_NR31 = 0xFF; |
139 | R_NR32 = 0x9F; | 113 | R_NR32 = 0x9F; |
140 | R_NR33 = 0xBF; | 114 | R_NR34 = 0xBF; |
141 | R_NR41 = 0xFF; | 115 | R_NR41 = 0xFF; |
142 | R_NR42 = 0x00; | 116 | R_NR42 = 0x00; |
143 | R_NR43 = 0x00; | 117 | R_NR43 = 0x00; |
@@ -145,23 +119,13 @@ void sound_off(void) | |||
145 | R_NR50 = 0x77; | 119 | R_NR50 = 0x77; |
146 | R_NR51 = 0xF3; | 120 | R_NR51 = 0xF3; |
147 | R_NR52 = 0xF1; | 121 | R_NR52 = 0xF1; |
122 | for (i = 0; i < 16; i++) WAVE[i] = -(i&1); | ||
148 | sound_dirty(); | 123 | sound_dirty(); |
149 | } | 124 | } |
150 | 125 | ||
151 | void sound_reset(void) | ||
152 | { | ||
153 | memset(&snd, 0, sizeof snd); | ||
154 | if (pcm.hz) snd.rate = (1<<21) / pcm.hz; | ||
155 | else snd.rate = 0; | ||
156 | memcpy(WAVE, hw.cgb ? cgbwave : dmgwave, 16); | ||
157 | memcpy(ram.hi+0x30, WAVE, 16); | ||
158 | sound_off(); | ||
159 | } | ||
160 | |||
161 | void sound_mix(void) | 126 | void sound_mix(void) |
162 | { | 127 | { |
163 | 128 | if(!options.sound) return; | |
164 | if (!options.sound) return; | ||
165 | int s, l, r, f, n; | 129 | int s, l, r, f, n; |
166 | 130 | ||
167 | if (!RATE || cpu.snd < RATE) return; | 131 | if (!RATE || cpu.snd < RATE) return; |
@@ -185,8 +149,7 @@ void sound_mix(void) | |||
185 | } | 149 | } |
186 | if (S1.swlen && (S1.swcnt += RATE) >= S1.swlen) | 150 | if (S1.swlen && (S1.swcnt += RATE) >= S1.swlen) |
187 | { | 151 | { |
188 | S1.swcnt -= S1.swlen; | 152 | f = ((R_NR14 & 7) << 8) + R_NR13; |
189 | f = S1.swfreq; | ||
190 | n = (R_NR10 & 7); | 153 | n = (R_NR10 & 7); |
191 | if (R_NR10 & 8) f -= (f >> n); | 154 | if (R_NR10 & 8) f -= (f >> n); |
192 | else f += (f >> n); | 155 | else f += (f >> n); |
@@ -194,15 +157,14 @@ void sound_mix(void) | |||
194 | S1.on = 0; | 157 | S1.on = 0; |
195 | else | 158 | else |
196 | { | 159 | { |
197 | S1.swfreq = f; | ||
198 | R_NR13 = f; | 160 | R_NR13 = f; |
199 | R_NR14 = (R_NR14 & 0xF8) | (f>>8); | 161 | R_NR14 = (R_NR14 & 0xF8) | (f>>8); |
200 | s1_freq_d(2048 - f); | 162 | s1_freq_d(2048 - f); |
201 | } | 163 | } |
202 | } | 164 | } |
203 | s <<= 2; | 165 | s <<= 2; |
204 | if (R_NR51 & 1) r += s; | 166 | if (R_NR51 & 1) l += s; |
205 | if (R_NR51 & 16) l += s; | 167 | if (R_NR51 & 16) r += s; |
206 | } | 168 | } |
207 | 169 | ||
208 | if (S2.on) | 170 | if (S2.on) |
@@ -219,8 +181,8 @@ void sound_mix(void) | |||
219 | if (S2.envol > 15) S2.envol = 15; | 181 | if (S2.envol > 15) S2.envol = 15; |
220 | } | 182 | } |
221 | s <<= 2; | 183 | s <<= 2; |
222 | if (R_NR51 & 2) r += s; | 184 | if (R_NR51 & 2) l += s; |
223 | if (R_NR51 & 32) l += s; | 185 | if (R_NR51 & 32) r += s; |
224 | } | 186 | } |
225 | 187 | ||
226 | if (S3.on) | 188 | if (S3.on) |
@@ -234,16 +196,16 @@ void sound_mix(void) | |||
234 | S3.on = 0; | 196 | S3.on = 0; |
235 | if (R_NR32 & 96) s <<= (3 - ((R_NR32>>5)&3)); | 197 | if (R_NR32 & 96) s <<= (3 - ((R_NR32>>5)&3)); |
236 | else s = 0; | 198 | else s = 0; |
237 | if (R_NR51 & 4) r += s; | 199 | if (R_NR51 & 4) l += s; |
238 | if (R_NR51 & 64) l += s; | 200 | if (R_NR51 & 64) r += s; |
239 | } | 201 | } |
240 | 202 | ||
241 | if (S4.on) | 203 | if (S4.on) |
242 | { | 204 | { |
243 | if (R_NR43 & 8) s = 1 & (noise7[ | 205 | if (R_NR43 & 8) s = 1 & (noise7[ |
244 | (S4.pos>>20)&15] >> (7-((S4.pos>>17)&7))); | 206 | (S4.pos>>24)&15] >> ((S4.pos>>21)&7)); |
245 | else s = 1 & (noise15[ | 207 | else s = 1 & (noise15[ |
246 | (S4.pos>>20)&4095] >> (7-((S4.pos>>17)&7))); | 208 | (S4.pos>>24)&4095] >> ((S4.pos>>21)&7)); |
247 | s = (-s) & S4.envol; | 209 | s = (-s) & S4.envol; |
248 | S4.pos += S4.freq; | 210 | S4.pos += S4.freq; |
249 | if ((R_NR44 & 64) && ((S4.cnt += RATE) >= S4.len)) | 211 | if ((R_NR44 & 64) && ((S4.cnt += RATE) >= S4.len)) |
@@ -255,9 +217,9 @@ void sound_mix(void) | |||
255 | if (S4.envol < 0) S4.envol = 0; | 217 | if (S4.envol < 0) S4.envol = 0; |
256 | if (S4.envol > 15) S4.envol = 15; | 218 | if (S4.envol > 15) S4.envol = 15; |
257 | } | 219 | } |
258 | s += s << 1; | 220 | s <<= 2; |
259 | if (R_NR51 & 8) r += s; | 221 | if (R_NR51 & 8) l += s; |
260 | if (R_NR51 & 128) l += s; | 222 | if (R_NR51 & 128) r += s; |
261 | } | 223 | } |
262 | 224 | ||
263 | l *= (R_NR50 & 0x07); | 225 | l *= (R_NR50 & 0x07); |
@@ -276,10 +238,10 @@ void sound_mix(void) | |||
276 | pcm_submit(); | 238 | pcm_submit(); |
277 | if (pcm.stereo) | 239 | if (pcm.stereo) |
278 | { | 240 | { |
279 | pcm.buf[pcm.pos++] = l+128; | 241 | pcm.buf[pcm.pos++] = l+128; |
280 | pcm.buf[pcm.pos++] = r+128; | 242 | pcm.buf[pcm.pos++] = r+128; |
281 | } | 243 | } |
282 | else pcm.buf[pcm.pos++] = ((l+r)>>1)+128; | 244 | else pcm.buf[pcm.pos++] = ((l+r)>>1)+128; |
283 | } | 245 | } |
284 | } | 246 | } |
285 | R_NR52 = (R_NR52&0xf0) | S1.on | (S2.on<<1) | (S3.on<<2) | (S4.on<<3); | 247 | R_NR52 = (R_NR52&0xf0) | S1.on | (S2.on<<1) | (S3.on<<2) | (S4.on<<3); |
@@ -289,7 +251,7 @@ void sound_mix(void) | |||
289 | 251 | ||
290 | byte sound_read(byte r) | 252 | byte sound_read(byte r) |
291 | { | 253 | { |
292 | if(!options.sound) return 0; | 254 | if(!options.sound) return 0; |
293 | sound_mix(); | 255 | sound_mix(); |
294 | /* printf("read %02X: %02X\n", r, REG(r)); */ | 256 | /* printf("read %02X: %02X\n", r, REG(r)); */ |
295 | return REG(r); | 257 | return REG(r); |
@@ -298,13 +260,12 @@ byte sound_read(byte r) | |||
298 | void s1_init(void) | 260 | void s1_init(void) |
299 | { | 261 | { |
300 | S1.swcnt = 0; | 262 | S1.swcnt = 0; |
301 | S1.swfreq = ((R_NR14&7)<<8) + R_NR13; | ||
302 | S1.envol = R_NR12 >> 4; | 263 | S1.envol = R_NR12 >> 4; |
303 | S1.endir = (R_NR12>>3) & 1; | 264 | S1.endir = (R_NR12>>3) & 1; |
304 | S1.endir |= S1.endir - 1; | 265 | S1.endir |= S1.endir - 1; |
305 | S1.enlen = (R_NR12 & 7) << 15; | 266 | S1.enlen = (R_NR12 & 7) << 15; |
306 | if (!S1.on) S1.pos = 0; | ||
307 | S1.on = 1; | 267 | S1.on = 1; |
268 | S1.pos = 0; | ||
308 | S1.cnt = 0; | 269 | S1.cnt = 0; |
309 | S1.encnt = 0; | 270 | S1.encnt = 0; |
310 | } | 271 | } |
@@ -315,20 +276,17 @@ void s2_init(void) | |||
315 | S2.endir = (R_NR22>>3) & 1; | 276 | S2.endir = (R_NR22>>3) & 1; |
316 | S2.endir |= S2.endir - 1; | 277 | S2.endir |= S2.endir - 1; |
317 | S2.enlen = (R_NR22 & 7) << 15; | 278 | S2.enlen = (R_NR22 & 7) << 15; |
318 | if (!S2.on) S2.pos = 0; | ||
319 | S2.on = 1; | 279 | S2.on = 1; |
280 | S2.pos = 0; | ||
320 | S2.cnt = 0; | 281 | S2.cnt = 0; |
321 | S2.encnt = 0; | 282 | S2.encnt = 0; |
322 | } | 283 | } |
323 | 284 | ||
324 | void s3_init(void) | 285 | void s3_init(void) |
325 | { | 286 | { |
326 | int i; | 287 | S3.pos = 0; |
327 | if (!S3.on) S3.pos = 0; | ||
328 | S3.cnt = 0; | 288 | S3.cnt = 0; |
329 | S3.on = R_NR30 >> 7; | 289 | S3.on = R_NR30 >> 7; |
330 | if (S3.on) for (i = 0; i < 16; i++) | ||
331 | ram.hi[i+0x30] = 0x13 ^ ram.hi[i+0x31]; | ||
332 | } | 290 | } |
333 | 291 | ||
334 | void s4_init(void) | 292 | void s4_init(void) |
@@ -346,19 +304,13 @@ void s4_init(void) | |||
346 | 304 | ||
347 | void sound_write(byte r, byte b) | 305 | void sound_write(byte r, byte b) |
348 | { | 306 | { |
349 | if(!options.sound) return; | 307 | if(!options.sound) return; |
350 | #if 0 | ||
351 | static void *timer; | ||
352 | if (!timer) timer = sys_timer(); | ||
353 | printf("write %02X: %02X @ %d\n", r, b, sys_elapsed(timer)); | ||
354 | #endif | ||
355 | 308 | ||
356 | if (!(R_NR52 & 128) && r != RI_NR52) return; | 309 | if (!(R_NR52 & 128) && r != RI_NR52) return; |
357 | if ((r & 0xF0) == 0x30) | 310 | if ((r & 0xF0) == 0x30) |
358 | { | 311 | { |
359 | if (S3.on) sound_mix(); | 312 | if (S3.on) sound_mix(); |
360 | if (!S3.on) | 313 | if (!S3.on) WAVE[r - 0x30] = b; |
361 | WAVE[r-0x30] = ram.hi[r] = b; | ||
362 | return; | 314 | return; |
363 | } | 315 | } |
364 | sound_mix(); | 316 | sound_mix(); |
@@ -366,8 +318,6 @@ void sound_write(byte r, byte b) | |||
366 | { | 318 | { |
367 | case RI_NR10: | 319 | case RI_NR10: |
368 | R_NR10 = b; | 320 | R_NR10 = b; |
369 | S1.swlen = ((R_NR10>>4) & 7) << 14; | ||
370 | S1.swfreq = ((R_NR14&7)<<8) + R_NR13; | ||
371 | break; | 321 | break; |
372 | case RI_NR11: | 322 | case RI_NR11: |
373 | R_NR11 = b; | 323 | R_NR11 = b; |
@@ -415,7 +365,7 @@ void sound_write(byte r, byte b) | |||
415 | break; | 365 | break; |
416 | case RI_NR31: | 366 | case RI_NR31: |
417 | R_NR31 = b; | 367 | R_NR31 = b; |
418 | S3.len = (256-R_NR31) << 13; | 368 | S3.len = (256-R_NR31) << 20; |
419 | break; | 369 | break; |
420 | case RI_NR32: | 370 | case RI_NR32: |
421 | R_NR32 = b; | 371 | R_NR32 = b; |
@@ -457,7 +407,7 @@ void sound_write(byte r, byte b) | |||
457 | case RI_NR52: | 407 | case RI_NR52: |
458 | R_NR52 = b; | 408 | R_NR52 = b; |
459 | if (!(R_NR52 & 128)) | 409 | if (!(R_NR52 & 128)) |
460 | sound_off(); | 410 | sound_reset(); |
461 | break; | 411 | break; |
462 | default: | 412 | default: |
463 | return; | 413 | return; |
diff --git a/apps/plugins/rockboy/sound.h b/apps/plugins/rockboy/sound.h index a14b04c5a2..fe3557cd7e 100644 --- a/apps/plugins/rockboy/sound.h +++ b/apps/plugins/rockboy/sound.h | |||
@@ -5,20 +5,18 @@ | |||
5 | 5 | ||
6 | struct sndchan | 6 | struct sndchan |
7 | { | 7 | { |
8 | int on; | 8 | int on; |
9 | unsigned pos; | 9 | unsigned pos; |
10 | int cnt, encnt, swcnt; | 10 | int cnt, encnt, swcnt; |
11 | int len, enlen, swlen; | 11 | int len, enlen, swlen; |
12 | int swfreq; | 12 | int freq; |
13 | int freq; | 13 | int envol, endir; |
14 | int envol, endir; | ||
15 | }; | 14 | }; |
16 | 15 | ||
17 | struct snd | 16 | struct snd |
18 | { | 17 | { |
19 | int rate; | 18 | int rate; |
20 | struct sndchan ch[4]; | 19 | struct sndchan ch[4]; |
21 | byte wave[16]; | ||
22 | }; | 20 | }; |
23 | 21 | ||
24 | extern struct snd snd; | 22 | extern struct snd snd; |
@@ -31,7 +29,6 @@ extern struct snd snd; | |||
31 | byte sound_read(byte r) ICODE_ATTR; | 29 | byte sound_read(byte r) ICODE_ATTR; |
32 | void sound_write(byte r, byte b) ICODE_ATTR; | 30 | void sound_write(byte r, byte b) ICODE_ATTR; |
33 | void sound_dirty(void) ICODE_ATTR; | 31 | void sound_dirty(void) ICODE_ATTR; |
34 | void sound_off(void); | ||
35 | void sound_reset(void); | 32 | void sound_reset(void); |
36 | void sound_mix(void) ICODE_ATTR; | 33 | void sound_mix(void) ICODE_ATTR; |
37 | void s1_init(void); | 34 | void s1_init(void); |
diff --git a/apps/plugins/rockboy/split.c b/apps/plugins/rockboy/split.c deleted file mode 100644 index 5d8af08ee1..0000000000 --- a/apps/plugins/rockboy/split.c +++ /dev/null | |||
@@ -1,59 +0,0 @@ | |||
1 | |||
2 | #include "rockmacros.h" | ||
3 | |||
4 | /* | ||
5 | * splitline is a destructive argument parser, much like a very primitive | ||
6 | * form of a shell parser. it supports quotes for embedded spaces and | ||
7 | * literal quotes with the backslash escape. | ||
8 | */ | ||
9 | |||
10 | char *splitnext(char **pos) | ||
11 | { | ||
12 | char *a, *d, *s; | ||
13 | |||
14 | d = s = *pos; | ||
15 | while (*s == ' ' || *s == '\t') s++; | ||
16 | a = s; | ||
17 | while (*s && *s != ' ' && *s != '\t') | ||
18 | { | ||
19 | if (*s == '"') | ||
20 | { | ||
21 | s++; | ||
22 | while (*s && *s != '"') | ||
23 | { | ||
24 | if (*s == '\\') | ||
25 | s++; | ||
26 | if (*s) | ||
27 | *(d++) = *(s++); | ||
28 | } | ||
29 | if (*s == '"') s++; | ||
30 | } | ||
31 | else | ||
32 | { | ||
33 | if (*s == '\\') | ||
34 | s++; | ||
35 | *(d++) = *(s++); | ||
36 | } | ||
37 | } | ||
38 | while (*s == ' ' || *s == '\t') s++; | ||
39 | *d = 0; | ||
40 | *pos = s; | ||
41 | return a; | ||
42 | } | ||
43 | |||
44 | int splitline(char **argv, int max, char *line) | ||
45 | { | ||
46 | char *s; | ||
47 | int i; | ||
48 | |||
49 | s = line; | ||
50 | for (i = 0; *s && i < max + 1; i++) | ||
51 | argv[i] = splitnext(&s); | ||
52 | argv[i] = 0; | ||
53 | return i; | ||
54 | } | ||
55 | |||
56 | |||
57 | |||
58 | |||
59 | |||
diff --git a/apps/plugins/rockboy/split.h b/apps/plugins/rockboy/split.h deleted file mode 100644 index a371430946..0000000000 --- a/apps/plugins/rockboy/split.h +++ /dev/null | |||
@@ -1 +0,0 @@ | |||
1 | int splitline(char **argv, int max, char *line); | ||
diff --git a/apps/plugins/rockboy/sys_rockbox.c b/apps/plugins/rockboy/sys_rockbox.c index fb118162b2..40f68681d8 100644 --- a/apps/plugins/rockboy/sys_rockbox.c +++ b/apps/plugins/rockboy/sys_rockbox.c | |||
@@ -20,7 +20,6 @@ | |||
20 | #include "rockmacros.h" | 20 | #include "rockmacros.h" |
21 | #include "fb.h" | 21 | #include "fb.h" |
22 | #include "input.h" | 22 | #include "input.h" |
23 | #include "rc.h" | ||
24 | #include "lcd-gb.h" | 23 | #include "lcd-gb.h" |
25 | #include "hw.h" | 24 | #include "hw.h" |
26 | #include "config.h" | 25 | #include "config.h" |
@@ -32,6 +31,13 @@ | |||
32 | #define ROCKBOY_PAD_UP BUTTON_MENU | 31 | #define ROCKBOY_PAD_UP BUTTON_MENU |
33 | #define ROCKBOY_PAD_DOWN BUTTON_PLAY | 32 | #define ROCKBOY_PAD_DOWN BUTTON_PLAY |
34 | 33 | ||
34 | #elif (CONFIG_KEYPAD == IRIVER_H10_PAD) | ||
35 | |||
36 | #define ROCKBOY_PAD_LEFT BUTTON_LEFT | ||
37 | #define ROCKBOY_PAD_RIGHT BUTTON_RIGHT | ||
38 | #define ROCKBOY_PAD_UP BUTTON_SCROLL_UP | ||
39 | #define ROCKBOY_PAD_DOWN BUTTON_SCROLL_DOWN | ||
40 | |||
35 | #else | 41 | #else |
36 | 42 | ||
37 | #define ROCKBOY_PAD_LEFT BUTTON_LEFT | 43 | #define ROCKBOY_PAD_LEFT BUTTON_LEFT |
@@ -41,33 +47,10 @@ | |||
41 | 47 | ||
42 | #endif | 48 | #endif |
43 | 49 | ||
44 | rcvar_t joy_exports[] = | 50 | struct fb fb IBSS_ATTR; |
45 | { | ||
46 | RCV_END | ||
47 | }; | ||
48 | |||
49 | rcvar_t vid_exports[] = | ||
50 | { | ||
51 | RCV_END | ||
52 | }; | ||
53 | |||
54 | struct fb fb; | ||
55 | 51 | ||
56 | extern int debug_trace; | 52 | extern int debug_trace; |
57 | 53 | ||
58 | void vid_settitle(char *title) | ||
59 | { | ||
60 | rb->splash(HZ/2, true, title); | ||
61 | } | ||
62 | |||
63 | void joy_init(void) | ||
64 | { | ||
65 | } | ||
66 | |||
67 | void joy_close(void) | ||
68 | { | ||
69 | } | ||
70 | |||
71 | unsigned int oldbuttonstate = 0, newbuttonstate,holdbutton; | 54 | unsigned int oldbuttonstate = 0, newbuttonstate,holdbutton; |
72 | #ifdef HAVE_WHEEL_POSITION | 55 | #ifdef HAVE_WHEEL_POSITION |
73 | int oldwheel = -1, wheel; | 56 | int oldwheel = -1, wheel; |
@@ -179,10 +162,7 @@ void ev_poll(void) | |||
179 | if(pressed & options.MENU) { | 162 | if(pressed & options.MENU) { |
180 | #endif | 163 | #endif |
181 | #if (CONFIG_KEYPAD == IRIVER_H100_PAD) || \ | 164 | #if (CONFIG_KEYPAD == IRIVER_H100_PAD) || \ |
182 | (CONFIG_KEYPAD == IRIVER_H300_PAD) || \ | 165 | defined(HAVE_LCD_COLOR) |
183 | (CONFIG_KEYPAD == IPOD_4G_PAD) || \ | ||
184 | (CONFIG_KEYPAD == GIGABEAT_PAD) || \ | ||
185 | (CONFIG_KEYPAD == SANSA_E200_PAD) | ||
186 | #ifdef HAVE_WHEEL_POSITION | 166 | #ifdef HAVE_WHEEL_POSITION |
187 | rb->wheel_send_events(true); | 167 | rb->wheel_send_events(true); |
188 | #endif | 168 | #endif |
@@ -202,53 +182,36 @@ void ev_poll(void) | |||
202 | #endif | 182 | #endif |
203 | } | 183 | } |
204 | 184 | ||
205 | void vid_setpal(int i, int r, int g, int b) | 185 | /* New frameskip, makes more sense to me and performs as well */ |
186 | inline void vid_begin(void) | ||
206 | { | 187 | { |
207 | (void)i; | 188 | static int skip = 0; |
208 | (void)r; | 189 | if (skip<options.frameskip) |
209 | (void)g; | 190 | { |
210 | (void)b; | 191 | skip++; |
211 | } | 192 | fb.enabled=0; |
212 | 193 | } | |
213 | inline void vid_begin(void) // New frameskip, makes more sense to me and performs as well | 194 | else |
214 | { | 195 | { |
215 | static int skip = 0; | 196 | skip=0; |
216 | if (skip<options.frameskip) { | 197 | fb.enabled=1; |
217 | skip++; | 198 | } |
218 | fb.enabled=0; | ||
219 | } | ||
220 | else { | ||
221 | skip=0; | ||
222 | fb.enabled=1; | ||
223 | } | ||
224 | } | 199 | } |
225 | 200 | ||
226 | void vid_init(void) | 201 | void vid_init(void) |
227 | { | 202 | { |
228 | fb.h=144; | ||
229 | fb.w=160; | ||
230 | fb.pitch=160; | ||
231 | fb.enabled=1; | 203 | fb.enabled=1; |
232 | fb.dirty=0; | 204 | fb.ptr=rb->lcd_framebuffer; |
233 | fb.mode=3; | ||
234 | |||
235 | fb.ptr=rb->lcd_framebuffer; | ||
236 | 205 | ||
237 | #if defined(HAVE_LCD_COLOR) | 206 | #if defined(HAVE_LCD_COLOR) |
238 | fb.pelsize=2; // 16 bit framebuffer | 207 | fb.cc[0].r = 3; /* 8-5 (wasted bits on red) */ |
239 | 208 | fb.cc[0].l = 11; /* this is the offset to the R bits (16-5) */ | |
240 | fb.indexed = 0; // no palette on lcd | 209 | fb.cc[1].r = 2; /* 8-6 (wasted bits on green) */ |
241 | fb.cc[0].r = 3; // 8-5 (wasted bits on red) | 210 | fb.cc[1].l = 5; /* This is the offset to the G bits (16-5-6) */ |
242 | fb.cc[0].l = 11; //this is the offset to the R bits (16-5) | 211 | fb.cc[2].r = 3; /* 8-5 (wasted bits on red) */ |
243 | fb.cc[1].r = 2; // 8-6 (wasted bits on green) | 212 | fb.cc[2].l = 0; /* This is the offset to the B bits (16-5-6-5) */ |
244 | fb.cc[1].l = 5; // This is the offset to the G bits (16-5-6) | 213 | #else |
245 | fb.cc[2].r = 3; // 8-5 (wasted bits on red) | 214 | fb.mode=3; |
246 | fb.cc[2].l = 0; // This is the offset to the B bits (16-5-6-5) | ||
247 | fb.cc[3].r = 0; // no alpha | ||
248 | fb.cc[3].l = 0; | ||
249 | fb.yuv = 0; // not in yuv format | ||
250 | #else // ***** NEED TO LOOK INTO THIS MORE FOR THE H100 (Should be able to get rid of some IFDEF's elsewhere) | ||
251 | fb.pelsize=1; // 8 bit framebuffer.. (too much.. but lowest gnuboy will support.. so yea... | ||
252 | #endif | 215 | #endif |
253 | } | 216 | } |
254 | 217 | ||
@@ -350,43 +313,29 @@ void vid_update(int scanline) | |||
350 | cnt++; | 313 | cnt++; |
351 | } | 314 | } |
352 | rb->lcd_update_rect(0, scanline & ~3, LCD_WIDTH, 4); | 315 | rb->lcd_update_rect(0, scanline & ~3, LCD_WIDTH, 4); |
353 | #elif defined(HAVE_LCD_COLOR) /* iriver H3x0, colour iPod */ | 316 | #elif defined(HAVE_LCD_COLOR) |
354 | // handled in lcd.c now | 317 | /* handled in lcd.c now */ |
355 | #endif /* LCD_HEIGHT */ | 318 | #endif /* LCD_HEIGHT */ |
356 | } | 319 | } |
357 | #endif | 320 | #endif |
358 | 321 | ||
359 | void vid_end(void) | ||
360 | { | ||
361 | } | ||
362 | |||
363 | long timerresult; | 322 | long timerresult; |
364 | 323 | ||
365 | void *sys_timer(void) | 324 | void *sys_timer(void) |
366 | {/* | 325 | { |
367 | timerresult=*rb->current_tick; | 326 | /*timerresult=*rb->current_tick; |
368 | return &timerresult;*/ | 327 | return &timerresult;*/ |
369 | return 0; | 328 | return 0; |
370 | } | 329 | } |
371 | 330 | ||
372 | // returns microseconds passed since sys_timer | 331 | /* returns microseconds passed since sys_timer */ |
373 | int sys_elapsed(long *oldtick) | 332 | int sys_elapsed(long *oldtick) |
374 | { | 333 | { |
375 | /* | 334 | /* int elap,mytime=microtick; |
376 | int elap,mytime=microtick; | ||
377 | 335 | ||
378 | elap=mytime-*oldtick; | 336 | elap=mytime-*oldtick; |
379 | *oldtick=mytime; | 337 | *oldtick=mytime; |
380 | return elap;*/ | 338 | return elap; */ |
381 | // return ((*rb->current_tick-(*oldtick))*1000000)/HZ; | 339 | /* return ((*rb->current_tick-(*oldtick))*1000000)/HZ; */ |
382 | return *oldtick; | 340 | return *oldtick; |
383 | } | 341 | } |
384 | |||
385 | void sys_sleep(int us) | ||
386 | { | ||
387 | if(us<=0) return; | ||
388 | int i=0; | ||
389 | while(i< us*11) | ||
390 | i++; | ||
391 | // if (us <= 0) return; | ||
392 | } | ||