summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Ross <midgey@rockbox.org>2007-02-06 21:41:08 +0000
committerTom Ross <midgey@rockbox.org>2007-02-06 21:41:08 +0000
commit2882b26a996839f09956fa59617c63f2c3abac72 (patch)
treef7c4fbdc4857f6af11b30c1e7bdf467d43d5963e
parent1026c0f5b26ef82e6acfc32e1fd74c5594e53619 (diff)
downloadrockbox-2882b26a996839f09956fa59617c63f2c3abac72.tar.gz
rockbox-2882b26a996839f09956fa59617c63f2c3abac72.zip
Major Rockboy update.
1) Adapt Rockboy to smaller screens (H10, X5, and iPod Nano). 2) Add the ability to use a preset palette on color targets. Choose 'Set Palette' from the main menu. 3) Clean up the code to remove any unused code and variables. 4) Changed tabs to spaces. 5) Disable reading and writing sound when sound is disabled. 6) Disbable writing to the RTC since it is not implemented yet. 7) Minor optimizations from WAC gnuboy CE and iBoy. 8) Massive clean up of code to make it appear consistent. 9) Change all C++ style comments to C style. 10) Completely reorganize dynarec. Add fixmes to all unimplemented opcodes. Add debug writes for all opcodes. Attempt to implement a few opcodes myself. 11) Silence some warnings when built using dynarec. 12) Minor reshuffling of IRAM, may or not offer a speed increase. 13) Include fixes found in the short-lived gnuboy CVS. All in all, there's about a 10% improvement on my test roms when sound is disabled and slight improvement with sound. Especially noticable when there are few sprites on screen and less action is occurring. See FS #6567. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@12216 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r--apps/plugins/SUBDIRS6
-rw-r--r--apps/plugins/rockboy/Makefile7
-rw-r--r--apps/plugins/rockboy/Version5
-rw-r--r--apps/plugins/rockboy/cpu-gb.h24
-rw-r--r--apps/plugins/rockboy/cpu.c1363
-rw-r--r--apps/plugins/rockboy/cpucore.h469
-rw-r--r--apps/plugins/rockboy/debug.c1246
-rw-r--r--apps/plugins/rockboy/dynarec.c1946
-rw-r--r--apps/plugins/rockboy/emu.c39
-rw-r--r--apps/plugins/rockboy/emu.h2
-rw-r--r--apps/plugins/rockboy/events.c45
-rw-r--r--apps/plugins/rockboy/exports.c42
-rw-r--r--apps/plugins/rockboy/exports.h2
-rw-r--r--apps/plugins/rockboy/fastmem.c139
-rw-r--r--apps/plugins/rockboy/fastmem.h5
-rw-r--r--apps/plugins/rockboy/fb.h22
-rw-r--r--apps/plugins/rockboy/hw.c204
-rw-r--r--apps/plugins/rockboy/hw.h8
-rw-r--r--apps/plugins/rockboy/inflate.c514
-rw-r--r--apps/plugins/rockboy/input.h8
-rw-r--r--apps/plugins/rockboy/lcd-gb.h45
-rw-r--r--apps/plugins/rockboy/lcd.c273
-rw-r--r--apps/plugins/rockboy/lcdc.c225
-rw-r--r--apps/plugins/rockboy/loader.c485
-rw-r--r--apps/plugins/rockboy/loader.h10
-rw-r--r--apps/plugins/rockboy/main.c103
-rw-r--r--apps/plugins/rockboy/mem.c119
-rw-r--r--apps/plugins/rockboy/mem.h30
-rw-r--r--apps/plugins/rockboy/menu.c47
-rw-r--r--apps/plugins/rockboy/noise.h1028
-rw-r--r--apps/plugins/rockboy/palette-presets.h151
-rw-r--r--apps/plugins/rockboy/palette.c153
-rw-r--r--apps/plugins/rockboy/palette.h6
-rw-r--r--apps/plugins/rockboy/pcm.h8
-rw-r--r--apps/plugins/rockboy/rbsound.c64
-rw-r--r--apps/plugins/rockboy/rc.h62
-rw-r--r--apps/plugins/rockboy/rccmds.c122
-rw-r--r--apps/plugins/rockboy/rcvars.c211
-rw-r--r--apps/plugins/rockboy/rockboy.c23
-rw-r--r--apps/plugins/rockboy/rockmacros.h23
-rw-r--r--apps/plugins/rockboy/rtc-gb.h14
-rw-r--r--apps/plugins/rockboy/rtc.c176
-rw-r--r--apps/plugins/rockboy/save.c460
-rw-r--r--apps/plugins/rockboy/sound.c140
-rw-r--r--apps/plugins/rockboy/sound.h19
-rw-r--r--apps/plugins/rockboy/split.c59
-rw-r--r--apps/plugins/rockboy/split.h1
-rw-r--r--apps/plugins/rockboy/sys_rockbox.c129
48 files changed, 4877 insertions, 5405 deletions
diff --git a/apps/plugins/SUBDIRS b/apps/plugins/SUBDIRS
index 2163055fa8..4a2a819b97 100644
--- a/apps/plugins/SUBDIRS
+++ b/apps/plugins/SUBDIRS
@@ -5,11 +5,7 @@
5/* For various targets... */ 5/* For various targets... */
6#if (CONFIG_KEYPAD == RECORDER_PAD) || \ 6#if (CONFIG_KEYPAD == RECORDER_PAD) || \
7 (CONFIG_KEYPAD == IRIVER_H100_PAD) || \ 7 (CONFIG_KEYPAD == IRIVER_H100_PAD) || \
8 (CONFIG_KEYPAD == IRIVER_H300_PAD) || \ 8 defined(HAVE_LCD_COLOR)
9 defined(IPOD_COLOR) || \
10 defined(IPOD_VIDEO) || \
11 defined(TOSHIBA_GIGABEAT_F) || \
12 defined(SANSA_E200)
13rockboy 9rockboy
14#endif 10#endif
15 11
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
19LINKFILE := $(OBJDIR)/link.lds 19LINKFILE := $(OBJDIR)/link.lds
20DEPFILE = $(OBJDIR)/dep-rockboy 20DEPFILE = $(OBJDIR)/dep-rockboy
21SRC = cpu.c emu.c events.c exports.c fastmem.c hw.c lcd.c lcdc.c loader.c \ 21SRC = 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)
30OBJS := $(SRC:%.c=$(OBJDIR)/%.o) 28OBJS := $(SRC:%.c=$(OBJDIR)/%.o)
31DIRS = . 29DIRS = .
32 30
33
34ifndef SIMVER 31ifndef SIMVER
35ifneq (,$(findstring RECORDER,$(TARGET))) ## Archos recorder targets 32ifneq (,$(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" /*
2VERSION = 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
11union reg 11union 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
18struct cpu 18struct 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
33extern struct cpu cpu; 33extern struct cpu cpu;
@@ -54,6 +54,6 @@ void lcdc_advance(int cnt) ICODE_ATTR;
54void sound_advance(int cnt) ICODE_ATTR; 54void sound_advance(int cnt) ICODE_ATTR;
55void cpu_timers(int cnt) ICODE_ATTR; 55void cpu_timers(int cnt) ICODE_ATTR;
56int cpu_emulate(int cycles) ICODE_ATTR; 56int cpu_emulate(int cycles) ICODE_ATTR;
57inline int cpu_step(int max); 57inline 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 @@
17struct cpu cpu IBSS_ATTR; 17struct 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
247void cpu_reset(void) 240void 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
285void div_advance(int cnt) 277void 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
295void timer_advance(int cnt) 287void 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
319void lcdc_advance(int cnt) 311void 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
325void sound_advance(int cnt) 317void sound_advance(int cnt)
326{ 318{
327 cpu.snd += cnt; 319 cpu.snd += cnt;
328} 320}
329 321
330void cpu_timers(int cnt) 322void 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
338int cpu_idle(int max) 331int 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
376int cpu_emulate(int cycles) 364int 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;
386next: 375next:
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
1006inline int cpu_step(int max) 1003inline 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
5static const byte cycles_table[256]ICONST_ATTR = 5static 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
28static const byte cb_cycles_table[256] ICONST_ATTR = 28static 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
53static 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
73static const byte incflag_table[256] ICONST_ATTR = 51static 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
93static const byte decflag_table[256] ICONST_ATTR = 71static 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
113static const byte swap_table[256] ICONST_ATTR = 92static 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
133static const byte daa_table[4096] ICONST_ATTR= 112static 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
272static const byte daa_carry_table[64] ICONST_ATTR = 251static 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
16static char *mnemonic_table[256] = 15static 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
276static char *cb_mnemonic_table[256] = 275static 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
536static byte operand_count[256] = 535static 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
561rcvar_t debug_exports[] = 560rcvar_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
567void debug_disassemble(addr a, int c) 566void 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
136void DYNA_MOVE_b_r_to_r(un8 src,un8 dest) { 134void 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
140void DYNA_ASHIFT_l(un8 src, un8 dest, int left, int src_is_reg) { 139void 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
150void DYNA_LSHIFT_l(un8 src, un8 dest, int left, int src_is_reg) { 150void 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
159void DYNA_MOVE_l_i_to_r(un32 imm, un8 dest) { 160void 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
164void DYNA_MOVE_l_i_to_m(un32 imm, un8 dest_a) { 166void 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
169void DYNA_MOVE_l_r_to_m(un8 src,un8 dest_a) { 172void 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
173void DYNA_MOVE_l_r_to_r(un8 src, un8 dest, int src_is_areg) { 177void 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
180void DYNA_MOVE_w_r_to_r(un8 src, un8 dest, int src_is_areg) { 185void 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
187void DYNA_MOVEQ_l_i_to_r(un8 imm, un8 dest) { 193void 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
191void DYNA_PEA_w_i(un16 imm) { 198void DYNA_PEA_w_i(un16 imm)
199{
192 DWRITEW(0x4878); 200 DWRITEW(0x4878);
193 DWRITEW(imm); 201 DWRITEW(imm);
194} 202}
195 203
196void DYNA_PUSH_l_r(un8 reg,int src_is_areg) { 204void 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
203void DYNA_MOVEA_l_i_to_r(un32 imm, un8 dest) { 212void 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
208void DYNA_MOVEA_w_r_to_r(un8 src, un8 dest, int src_is_areg) { 218void 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
215void DYNA_MOVEA_l_r_to_r(un8 src, un8 dest, int src_is_areg) { 226void 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
223void DYNA_RET() { 235void DYNA_RET(void)
236{
224 DWRITEW(0x4E75); 237 DWRITEW(0x4E75);
225} 238}
226 239
227void DYNA_AND_l_i_to_r(un32 imm, un8 dest) { 240void 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
232void DYNA_AND_l_r_to_r(un8 src,un8 dest) { 246void 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
236void DYNA_OR_l_r_to_r(un8 src,un8 dest) { 251void 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
240void DYNA_OR_l_i_to_r(un32 imm,un8 dest) { 256void 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
245void DYNA_CLR_l_m(un32 addr) { 262void DYNA_CLR_l_m(un32 addr)
263{
246 DWRITEW(0x42B9); 264 DWRITEW(0x42B9);
247 DWRITEL(addr); 265 DWRITEL(addr);
248} 266}
249 267
250void DYNA_CLR_l_r(un8 reg) { 268void DYNA_CLR_l_r(un8 reg)
269{
251 DWRITEW(0x4280|(reg&0x7)); 270 DWRITEW(0x4280|(reg&0x7));
252} 271}
253 272
254void DYNA_CLR_w_r(un8 reg) { 273void DYNA_CLR_w_r(un8 reg)
274{
255 DWRITEW(0x42C0|(reg&0x7)); 275 DWRITEW(0x42C0|(reg&0x7));
256} 276}
257 277
258 278
259void DYNA_CLR_b_r(un8 reg) { 279void DYNA_CLR_b_r(un8 reg)
280{
260 DWRITEW(0x4200|(reg&0x7)); 281 DWRITEW(0x4200|(reg&0x7));
261} 282}
262 283
263 284
264void DYNA_ADDQ_l_i_to_r(un8 imm, un8 reg, int dest_is_a) { 285void 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
271void DYNA_ADD_l_r_to_r(un8 src, un8 dest, int src_is_areg) { 293void 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
278void DYNA_JSR(void *addr) { 301void DYNA_JSR(void *addr)
302{
279 DWRITEW(0x4EB9); 303 DWRITEW(0x4EB9);
280 DWRITEL(addr); 304 DWRITEL(addr);
281} 305}
282 306
283void DYNA_MOVEM(un8 areg,un16 mask, int frommem) { 307void 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
291void DYNA_SUBQ_l_i_to_r(un8 imm, un8 reg, int addr_reg) { 316void 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
298void DYNA_SUB_l_r_to_r(un8 src, un8 dest, int is_areg) { 324void 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
305void DYNA_EXT_l(un8 reg) { 332void DYNA_EXT_l(un8 reg)
333{
306 DWRITEW(0x48C0|(reg&0x7)); 334 DWRITEW(0x48C0|(reg&0x7));
307} 335}
308 336
309void DYNA_BCC_c(un8 cond, int size,int i) { 337void 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
330void DYNA_DUMMYBRANCH(int size,int i) { 361void 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
335void DYNA_TST_l_r(un8 reg,int is_areg) { 367void 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
342void DYNA_TST_b_r(un8 reg,int is_areg) { 375void 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
350void DYNA_BTST_l_r(un8 bit, un8 reg) { 384void 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
355void DYNA_NEG_l(un8 reg) { 390void DYNA_NEG_l(un8 reg)
391{
356 DWRITEW(0x4480|(reg&0x7)); 392 DWRITEW(0x4480|(reg&0x7));
357} 393}
358 394
359void DYNA_XOR_l_r_to_r(un8 src, un8 dest) { 395void 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
363void DYNA_SET_b_r(un8 src, un8 cond) { 400void 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
367void DYNA_INC_l_r(un8 dest,int is_areg) { 405void 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
371void DYNA_DEC_l_r(un8 dest,int is_areg) { 410void 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
376void dynamic_recompile (struct dynarec_block *newblock) { 416void 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
12static int framelen = 16743;
13static int framecount;
14
15rcvar_t emu_exports[] =
16{
17 RCV_INT("framelen", &framelen),
18 RCV_INT("framecount", &framecount),
19 RCV_END
20};
21
22void 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. */
48void emu_run(void) 33void 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 @@
1void emu_reset(void); 1void emu_reset(void);
2void emu_run(void); 2void 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
12char keystates[MAX_KEYS];
13int nkeysdown;
14
15#define MAX_EVENTS 32 11#define MAX_EVENTS 32
16 12
17static event_t eventqueue[MAX_EVENTS]; 13static event_t eventqueue[MAX_EVENTS];
@@ -20,34 +16,23 @@ static int eventhead, eventpos;
20 16
21int ev_postevent(event_t *ev) 17int 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
32int ev_getevent(event_t *ev) 28int 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
7extern rcvar_t emu_exports[], loader_exports[],
8 lcd_exports[], rtc_exports[], sound_exports[],
9 vid_exports[], joy_exports[], pcm_exports[];
10
11
12rcvar_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
26void init_exports(void)
27{
28 rcvar_t **s = sources;
29
30 while (*s)
31 rc_exportvars(*(s++));
32}
33
34
35void 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 @@
1void init_exports(void);
2void 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
15const byte himask[256];
16
17const 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
29const 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
51byte readb(int a) 6byte 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
58void writeb(int a, byte b) 13void 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
65int readw(int a) 20int 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
85void writew(int a, int w) 40void 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
114byte readhi(int a) 69byte readhi(int a)
115{ 70{
116 return readb(a | 0xff00); 71 return readb(a | 0xff00);
117} 72}
118 73
119void writehi(int a, byte b) 74void writehi(int a, byte b)
120{ 75{
121 writeb(a | 0xff00, b); 76 writeb(a | 0xff00, b);
122} 77}
123
124#if 0
125byte readhi(int a)
126{
127 byte (*rd)() = hi_read[a];
128 return rd ? rd(a) : (ram.hi[a] | himask[a]);
129}
130
131void 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;
13void writew(int a, int w) ICODE_ATTR; 13void writew(int a, int w) ICODE_ATTR;
14byte readhi(int a) ICODE_ATTR; 14byte readhi(int a) ICODE_ATTR;
15void writehi(int a, byte b) ICODE_ATTR; 15void writehi(int a, byte b) ICODE_ATTR;
16#if 0
17byte readhi(int a);
18void 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
11struct fb 11struct 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
14struct hw hw; 14struct hw hw IBSS_ATTR;
15 15
16 16
17 17
@@ -24,17 +24,17 @@ struct hw hw;
24 24
25void hw_interrupt(byte i, byte mask) 25void 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
48void hw_dma(byte b) 48void 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 58void hw_hdma(void)
59
60void 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 78void hw_hdma_cmd(byte c)
91void 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
117void pad_refresh() 118void 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
141void pad_press(byte k) 142void 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
149void pad_release(byte k) 150void 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
157void pad_set(byte k, int st) 158void 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
162void hw_reset() 163void 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
26struct hw 26struct 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
20static unsigned int
21peek_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
42static unsigned int
43read_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
53static void
54make_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
78static int
79decode_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
121static int
122get_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 */
250static unsigned int buffer_ptr = 0;
251
252/* The buffer itself */
253static unsigned char buffer[BUFFER_SIZE];
254
255static void
256pushout (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
264static unsigned char
265pushin (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
271static int
272get_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
387static int
388inflate (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
461int
462unzip (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
10typedef struct event_s 7typedef 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
21int ev_postevent(event_t *ev) ICODE_ATTR; 17int ev_postevent(event_t *ev) ICODE_ATTR;
22int ev_getevent(event_t *ev) ICODE_ATTR; 18int 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
8struct vissprite 8struct 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
15struct scan 15struct 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
34struct obj 32struct 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
42struct lcd 40struct 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
53extern struct lcd lcd; 51extern struct lcd lcd;
@@ -60,14 +58,13 @@ void bg_scan(void) ICODE_ATTR;
60void wnd_scan(void) ICODE_ATTR; 58void wnd_scan(void) ICODE_ATTR;
61void bg_scan_pri(void) ICODE_ATTR; 59void bg_scan_pri(void) ICODE_ATTR;
62void wnd_scan_pri(void) ICODE_ATTR; 60void wnd_scan_pri(void) ICODE_ATTR;
63void spr_count(void);
64void spr_enum(void) ICODE_ATTR; 61void spr_enum(void) ICODE_ATTR;
65void spr_scan(void) ICODE_ATTR; 62void spr_scan(void) ICODE_ATTR;
66void lcd_begin(void) ICODE_ATTR; 63void lcd_begin(void) ICODE_ATTR;
67void lcd_refreshline(void) ICODE_ATTR; 64void lcd_refreshline(void) ICODE_ATTR;
68void pal_write(int i, byte b) ICODE_ATTR; 65void pal_write(int i, byte b) ICODE_ATTR;
69void pal_write_dmg(int i, int mapnum, byte d) ICODE_ATTR; 66void pal_write_dmg(int i, int mapnum, byte d) ICODE_ATTR;
70void vram_write(int a, byte b) ICODE_ATTR; 67void vram_write(addr a, byte b) ICODE_ATTR;
71void vram_dirty(void) ICODE_ATTR; 68void vram_dirty(void) ICODE_ATTR;
72void pal_dirty(void) ICODE_ATTR; 69void pal_dirty(void) ICODE_ATTR;
73void lcd_reset(void); 70void 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]
53byte patdirty[1024]; 50byte patdirty[1024];
54byte anydirty; 51byte anydirty;
55 52
56// static int scale = 1;
57
58static int rgb332;
59
60static int sprsort = 1;
61static int sprdebug;
62static int insync=0;
63#if LCD_DEPTH < 16 53#if LCD_DEPTH < 16
64static int scanline_ind=0; 54static int scanline_ind=0;
65#endif 55#endif
66 56
67#define DEF_PAL { 0x98d0e0, 0x68a0b0, 0x60707C, 0x2C3C3C } 57static int dmg_pal[4][4];
68
69static int dmg_pal[4][4] = { DEF_PAL, DEF_PAL, DEF_PAL, DEF_PAL };
70
71static int usefilter, filterdmg;
72static int filter[3][4] = {
73 { 195, 25, 0, 35 },
74 { 25, 170, 25, 35 },
75 { 25, 60, 125, 40 }
76 };
77
78rcvar_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
95fb_data *vdest; 59fb_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
104void updatepatpix(void) 62void 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 */
512void bg_scan(void) 471void 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
755void 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
775void spr_enum(void) 714void 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
841void spr_scan(void) 774void 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
905void lcd_begin(void) 836void 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
972char frameout[30];
973void lcd_refreshline(void) 933void 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 1060void 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
1095static void updatepalette(int i) 1067static 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
1200void vram_write(int a, byte b) 1122void 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
24void stat_trigger(void) 24void 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
43void 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
59static void stat_change(int stat) 50static 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
70void lcdc_change(byte b) 61void 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
84void lcdc_trans(void) 75void 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
18static int mbc_table[256] = 17static 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
41static int rtc_table[256] = 40static 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
48static int batt_table[256] = 47static 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
55static int romsize_table[256] = 54static 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
71static int ramsize_table[256] = 70static 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];
80static char rtcfile[500]; 79static char rtcfile[500];
81static char saveprefix[500]; 80static char saveprefix[500];
82 81
83static char *savename;
84
85static int saveslot; 82static int saveslot;
86 83
87static int forcebatt, nobatt; 84static int forcebatt, nobatt;
88static int forcedmg, gbamode; 85static int forcedmg;
89 86
90static int memfill = -1, memrand = -1; 87static int memfill = -1, memrand = -1;
91 88
92//static byte romMemory[4*1025*1024];
93int mp3_buffer_size;
94void *bufferpos;
95
96static void initmem(void *mem, int size) 89static 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
108static byte *loadfile(int fd, int *len) 101static 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
129int rom_load(void) 121int 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
190int sram_load(void) 180int 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
213int sram_save(void) 203int 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
234void state_save(int n) 222void 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
251void state_load(int n) 239void 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
271void rtc_save(void) 259void 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
280void rtc_load(void) 268void 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
290void loader_unload(void) 278void 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/*
305static 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
314static 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
324void cleanup(void) 292void 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
331void loader_init(char *s) 299void 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
363rcvar_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
7typedef struct loader_s 7typedef 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
15static 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
31void doevents() 10void 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
55int gnuboy_main(char *rom) 25int 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
14struct mbc mbc IBSS_ATTR; 14struct mbc mbc IBSS_ATTR;
15struct rom rom; 15struct rom rom IBSS_ATTR;
16struct ram ram; 16struct ram ram;
17 17
18 18
@@ -31,7 +31,7 @@ struct ram ram;
31void mem_updatemap() 31void 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
18struct mbc 18struct 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
31struct rom 31struct rom
32{ 32{
33 byte (*bank)[16384]; 33 byte (*bank)[16384];
34 char name[20]; 34 char name[20];
35}; 35};
36 36
37struct ram 37struct 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
8static byte noise7[] ICONST_ATTR = 8static 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
14static byte noise15[] ICONST_ATTR = 14static 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
30int 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
9static byte palmap[32768];
10static byte pallock[256];
11static int palrev[256];
12
13/* Course color mapping, for when palette is exhausted. */
14static byte crsmap[4][32768];
15static int crsrev[4][256];
16static const int crsmask[4] = { 0x7BDE, 0x739C, 0x6318, 0x4210 };
17
18enum plstatus
19{
20 pl_unused = 0,
21 pl_linger,
22 pl_active,
23 pl_locked
24};
25
26/*
27static 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
57static 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
68static 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
83void 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
91byte 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
116void pal_release(byte n)
117{
118 if (pallock[n] >= pl_locked)
119 pallock[n]--;
120}
121
122
123void 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
132void 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 @@
1void pal_lock(byte n) ICODE_ATTR;
2byte pal_getcolor(int c, int r, int g, int b) ICODE_ATTR;
3void pal_release(byte n) ICODE_ATTR;
4void pal_expire(void) ICODE_ATTR;
5void pal_set332(void) ICODE_ATTR;
6void 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
8struct pcm 8struct 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
16extern struct pcm pcm; 16extern 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
10struct pcm pcm IBSS_ATTR; 12struct 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
20rcvar_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
49void pcm_init(void) 46void 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
76void pcm_close(void) 71void 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
84int pcm_submit(void) 79int 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
123static byte buf1_unal[(BUF_SIZE / sizeof(short)) + 2]; // to make sure 4 byte aligned 121static byte buf1_unal[(BUF_SIZE / sizeof(short)) + 2]; /* 4 byte aligned */
124void pcm_init(void) 122void 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
4typedef enum rctype
5{
6 rcv_end,
7 rcv_int,
8 rcv_string,
9 rcv_vector,
10 rcv_bool
11} rcvtype_t;
12
13
14typedef 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
28typedef 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
37void rc_export(rcvar_t *v);
38void rc_exportvars(rcvar_t *vars);
39
40int rc_findvar(char *name);
41
42int rc_setvar_n(int i, int c, char **v);
43int rc_setvar(char *name, int c, char **v);
44
45int rc_getint_n(int i);
46int *rc_getvec_n(int i);
47char *rc_getstr_n(int i);
48
49int rc_getint(char *name);
50int *rc_getvec(char *name);
51char *rc_getstr(char *name);
52
53int rc_bindkey(char *keyname, char *cmd);
54int rc_unbindkey(char *keyname);
55void rc_unbindall(void);
56
57int rc_sourcefile(char *filename);
58void rc_dokey(int key, int st);
59
60int 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
18static 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
31static int cmd_reset(int argc, char **argv)
32{
33 (void)argc;
34 (void)argv;
35 emu_reset();
36 return 0;
37}
38
39static int cmd_savestate(int argc, char **argv)
40{
41 state_save(argc > 1 ? atoi(argv[1]) : -1);
42 return 0;
43}
44
45static 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
57rccmd_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
70int 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
6static rcvar_t rcvars[150];
7
8static int nvars;
9
10void 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
23void rc_exportvars(rcvar_t *vars)
24{
25 while(vars->type)
26 rc_export(vars++);
27}
28
29
30
31int 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
44int 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
97int 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
137int 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
148void *rc_getmem_n(int i)
149{
150 return rcvars[i].mem;
151}
152
153
154void *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
162int 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
174int *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
187char *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
198int rc_getint(char *name)
199{
200 return rc_getint_n(rc_findvar(name));
201}
202
203int *rc_getvec(char *name)
204{
205 return rc_getvec_n(rc_findvar(name));
206}
207
208char *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
29extern struct plugin_api* rb; 29extern struct plugin_api* rb;
30extern int shut,cleanshut; 30extern int shut,cleanshut;
31void vid_update(int scanline);
32void vid_init(void); 31void vid_init(void);
33inline void vid_begin(void); 32inline void vid_begin(void);
34void vid_end(void);
35void die(char *message, ...); 33void die(char *message, ...);
36void setmallocpos(void *pointer); 34void setmallocpos(void *pointer);
37void vid_settitle(char *title);
38void *sys_timer(void); 35void *sys_timer(void);
39int sys_elapsed(long *oldtick); 36int sys_elapsed(long *oldtick);
40void sys_sleep(int us);
41int pcm_submit(void); 37int pcm_submit(void);
42void pcm_init(void); 38void pcm_init(void);
39void sound_dirty(void);
43void doevents(void) ICODE_ATTR; 40void doevents(void) ICODE_ATTR;
44void ev_poll(void); 41void ev_poll(void);
45int do_user_menu(void); 42int do_user_menu(void);
46void loadstate(int fd); 43void loadstate(int fd);
47void savestate(int fd); 44void savestate(int fd);
48void setvidmode(int mode); 45void setvidmode(int mode);
46void set_pal(void);
47#if !defined(HAVE_LCD_COLOR)
48void vid_update(int scanline);
49#endif
50#ifdef DYNAREC
51extern struct dynarec_block newblock;
52void 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 */
104void* memcpy(void* dst, const void* src, size_t size); 116void* memcpy(void* dst, const void* src, size_t size) ICODE_ATTR;
105 117
106struct options { 118struct 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
112extern struct options options; 125extern 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
7struct rtc 7struct 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
17extern struct rtc rtc; 17extern struct rtc rtc;
@@ -21,5 +21,5 @@ void rtc_write(byte b);
21void rtc_tick(void); 21void rtc_tick(void);
22void rtc_save_internal(int fd); 22void rtc_save_internal(int fd);
23void rtc_load_internal(int fd); 23void 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
12struct rtc rtc IBSS_ATTR;
13
14static int syncrtc = 1;
15
16rcvar_t rtc_exports[] =
17{
18 RCV_BOOL("syncrtc", &syncrtc),
19 RCV_END
20};
21 10
11struct rtc rtc;
22 12
23void rtc_latch(byte b) 13void 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
39void rtc_write(byte b) 29void 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
70void rtc_tick() 60void 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
96void rtc_save_internal(int fd) 86void 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
105void rtc_load_internal(int fd) 95void 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
31struct svar 31struct 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
38static int ver; 38static int ver;
@@ -41,247 +41,243 @@ static int hramofs, hiofs, palofs, oamofs, wavofs;
41 41
42struct svar svars[] = 42struct 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
163void loadstate(int fd) 163void 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
227void savestate(int fd) 225void 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
15static 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
23static 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
32static const byte sqwave[4][8] = 14static 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
40static const int freqtab[8] = 22static 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
52struct snd snd IBSS_ATTR; 34struct snd snd IBSS_ATTR;
53int 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
62rcvar_t sound_exports[] =
63{
64 RCV_END
65};
66
67
68static void s1_freq_d(int d) 43static 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)
86static void s3_freq(void) 61static 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
93static void s4_freq(void) 68static 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
99void sound_dirty(void) 73void 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
124void sound_off(void) 98void 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
151void 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
161void sound_mix(void) 126void 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
290byte sound_read(byte r) 252byte 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)
298void s1_init(void) 260void 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
324void s3_init(void) 285void 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
334void s4_init(void) 292void s4_init(void)
@@ -346,19 +304,13 @@ void s4_init(void)
346 304
347void sound_write(byte r, byte b) 305void 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
6struct sndchan 6struct 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
17struct snd 16struct 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
24extern struct snd snd; 22extern struct snd snd;
@@ -31,7 +29,6 @@ extern struct snd snd;
31byte sound_read(byte r) ICODE_ATTR; 29byte sound_read(byte r) ICODE_ATTR;
32void sound_write(byte r, byte b) ICODE_ATTR; 30void sound_write(byte r, byte b) ICODE_ATTR;
33void sound_dirty(void) ICODE_ATTR; 31void sound_dirty(void) ICODE_ATTR;
34void sound_off(void);
35void sound_reset(void); 32void sound_reset(void);
36void sound_mix(void) ICODE_ATTR; 33void sound_mix(void) ICODE_ATTR;
37void s1_init(void); 34void 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
10char *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
44int 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 @@
1int 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
44rcvar_t joy_exports[] = 50struct fb fb IBSS_ATTR;
45{
46 RCV_END
47};
48
49rcvar_t vid_exports[] =
50{
51 RCV_END
52};
53
54struct fb fb;
55 51
56extern int debug_trace; 52extern int debug_trace;
57 53
58void vid_settitle(char *title)
59{
60 rb->splash(HZ/2, true, title);
61}
62
63void joy_init(void)
64{
65}
66
67void joy_close(void)
68{
69}
70
71unsigned int oldbuttonstate = 0, newbuttonstate,holdbutton; 54unsigned int oldbuttonstate = 0, newbuttonstate,holdbutton;
72#ifdef HAVE_WHEEL_POSITION 55#ifdef HAVE_WHEEL_POSITION
73int oldwheel = -1, wheel; 56int 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
205void vid_setpal(int i, int r, int g, int b) 185/* New frameskip, makes more sense to me and performs as well */
186inline 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 }
213inline 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
226void vid_init(void) 201void 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
359void vid_end(void)
360{
361}
362
363long timerresult; 322long timerresult;
364 323
365void *sys_timer(void) 324void *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 */
373int sys_elapsed(long *oldtick) 332int 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
385void 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}