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 @@ /* For various targets... */ #if (CONFIG_KEYPAD == RECORDER_PAD) || \ (CONFIG_KEYPAD == IRIVER_H100_PAD) || \ - (CONFIG_KEYPAD == IRIVER_H300_PAD) || \ - defined(IPOD_COLOR) || \ - defined(IPOD_VIDEO) || \ - defined(TOSHIBA_GIGABEAT_F) || \ - defined(SANSA_E200) + defined(HAVE_LCD_COLOR) rockboy #endif 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 LINKFILE := $(OBJDIR)/link.lds DEPFILE = $(OBJDIR)/dep-rockboy -SRC = cpu.c emu.c events.c exports.c fastmem.c hw.c lcd.c lcdc.c loader.c \ - main.c mem.c rbsound.c rccmds.c rcvars.c rtc.c save.c sound.c split.c \ - sys_rockbox.c rockboy.c menu.c +SRC = cpu.c emu.c events.c fastmem.c hw.c lcd.c lcdc.c loader.c main.c \ + mem.c menu.c rbsound.c rockboy.c rtc.c save.c sound.c sys_rockbox.c -#CFLAGS += -DGRAYSCALE #CFLAGS += -DDYNAREC #SRC += dynarec.c @@ -30,7 +28,6 @@ SOURCES = $(SRC) OBJS := $(SRC:%.c=$(OBJDIR)/%.o) DIRS = . - ifndef SIMVER ifneq (,$(findstring RECORDER,$(TARGET))) ## Archos recorder targets 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 @@ -#define VERSION "1.0.3" /* -VERSION = 1.0.3 -# */ - - 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 @@ union reg { - byte b[2][2]; - word w[2]; - un32 d; /* padding for alignment, carry */ + byte b[2][2]; + word w[2]; + un32 d; /* padding for alignment, carry */ }; struct cpu { #ifdef DYNAREC - union reg a,b,c,d,e,hl,f,sp,pc; + union reg a,b,c,d,e,hl,f,sp,pc; #else - union reg pc, sp, bc, de, hl, af; + union reg pc, sp, bc, de, hl, af; #endif - int ime, ima; - int speed; - int halt; - int div, tim; - int lcdc; - int snd; + int ime, ima; + int speed; + int halt; + int div, tim; + int lcdc; + int snd; }; extern struct cpu cpu; @@ -54,6 +54,6 @@ void lcdc_advance(int cnt) ICODE_ATTR; void sound_advance(int cnt) ICODE_ATTR; void cpu_timers(int cnt) ICODE_ATTR; int cpu_emulate(int cycles) ICODE_ATTR; -inline int cpu_step(int max); +inline int cpu_step(int max) ICODE_ATTR; #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 @@ struct cpu cpu IBSS_ATTR; - - #define ZFLAG(n) ( (n) ? 0 : FZ ) #define PUSH(w) ( (SP -= 2), (writew(xSP, (w))) ) #define POP(w) ( ((w) = readw(xSP)), (SP += 2) ) - -#define FETCH_OLD ( mbc.rmap[PC>>12] \ -? mbc.rmap[PC>>12][PC++] \ -: mem_read(PC++) ) - #define FETCH (readb(PC++)) @@ -227,7 +220,7 @@ label: op(b); break; #define RET ( POP(PC) ) #define EI ( IMA = 1 ) -#define DI ( cpu.halt = IMA = IME = 0 ) +#define DI ( IMA = IME = 0 ) @@ -246,127 +239,122 @@ int blockcount; void cpu_reset(void) { - union reg acc; + union reg acc; #ifdef DYNAREC - int i; - dynapointer=0; + int i; + dynapointer=0; #endif - cpu.speed = 0; - cpu.halt = 0; - cpu.div = 0; - cpu.tim = 0; - cpu.lcdc = 40; + cpu.speed = 0; + cpu.halt = 0; + cpu.div = 0; + cpu.tim = 0; + cpu.lcdc = 40; - IME = 0; - IMA = 0; - - PC = 0x0100; - SP = 0xFFFE; - W(acc) = 0x01B0; - A=HB(acc); - F=LB(acc); - W(acc) = 0x0013; - B=HB(acc); - C=LB(acc); - W(acc) = 0x00D8; - D=HB(acc); - E=LB(acc); - HL = 0x014D; + IME = 0; + IMA = 0; + + PC = 0x0100; + SP = 0xFFFE; + W(acc) = 0x01B0; + A=HB(acc); + F=LB(acc); + W(acc) = 0x0013; + B=HB(acc); + C=LB(acc); + W(acc) = 0x00D8; + D=HB(acc); + E=LB(acc); + HL = 0x014D; - if (hw.cgb) A = 0x11; - if (hw.gba) B = 0x01; + if (hw.cgb) A = 0x11; #ifdef DYNAREC - for(i=0;i<(1<= 256) - { - R_DIV += (cpu.div >> 8); - cpu.div &= 0xff; - } + cpu.div += (cnt<<1); + if (cpu.div >= 256) + { + R_DIV += (cpu.div >> 8); + cpu.div &= 0xff; + } } void timer_advance(int cnt) { - int unit, tima; - - if (!(R_TAC & 0x04)) return; + int unit, tima; + + if (!(R_TAC & 0x04)) return; - unit = ((-R_TAC) & 3) << 1; - cpu.tim += (cnt<= 512) - { - tima = R_TIMA + (cpu.tim >> 9); - cpu.tim &= 0x1ff; - if (tima >= 256) - { - hw_interrupt(IF_TIMER, IF_TIMER); - hw_interrupt(0, IF_TIMER); - } - while (tima >= 256) - tima = tima - 256 + R_TMA; - R_TIMA = tima; - } + if (cpu.tim >= 512) + { + tima = R_TIMA + (cpu.tim >> 9); + cpu.tim &= 0x1ff; + if (tima >= 256) + { + hw_interrupt(IF_TIMER, IF_TIMER); + hw_interrupt(0, IF_TIMER); + } + while (tima >= 256) + tima = tima - 256 + R_TMA; + R_TIMA = tima; + } } void lcdc_advance(int cnt) { - cpu.lcdc -= cnt; - if (cpu.lcdc <= 0) lcdc_trans(); + cpu.lcdc -= cnt; + if (cpu.lcdc <= 0) lcdc_trans(); } void sound_advance(int cnt) { - cpu.snd += cnt; + cpu.snd += cnt; } void cpu_timers(int cnt) { - div_advance(cnt << cpu.speed); - timer_advance(cnt << cpu.speed); - lcdc_advance(cnt); - sound_advance(cnt); + div_advance(cnt << cpu.speed); + timer_advance(cnt << cpu.speed); + lcdc_advance(cnt); + if(options.sound) + sound_advance(cnt); } int cpu_idle(int max) { - int cnt, unit; + int cnt, unit; - if (!(cpu.halt && IME)) return 0; - if (R_IF & R_IE) - { - cpu.halt = 0; - return 0; - } + if (!(cpu.halt && IME)) return 0; - /* Make sure we don't miss lcdc status events! */ - if ((R_IE & (IF_VBLANK | IF_STAT)) && (max > cpu.lcdc)) - max = cpu.lcdc; - - /* If timer interrupt cannot happen, this is very simple! */ - if (!((R_IE & IF_TIMER) && (R_TAC & 0x04))) - { - cpu_timers(max); - return max; - } + /* Make sure we don't miss lcdc status events! */ + if ((R_IE & (IF_VBLANK | IF_STAT)) && (max > cpu.lcdc)) + max = cpu.lcdc; + + /* If timer interrupt cannot happen, this is very simple! */ + if (!((R_IE & IF_TIMER) && (R_TAC & 0x04))) + { + cpu_timers(max); + return max; + } - /* Figure out when the next timer interrupt will happen */ - unit = ((-R_TAC) & 3) << 1; - cnt = (511 - cpu.tim + (1<> unit; - cnt += (255 - R_TIMA) << (9 - unit); + /* Figure out when the next timer interrupt will happen */ + unit = ((-R_TAC) & 3) << 1; + cnt = (511 - cpu.tim + (1<> unit; + cnt += (255 - R_TIMA) << (9 - unit); - if (max < cnt) - cnt = max; - - cpu_timers(cnt); - return cnt; + if (max < cnt) + cnt = max; + + cpu_timers(cnt); + return cnt; } #ifndef ASM_CPU_EMULATE @@ -375,627 +363,636 @@ extern int debug_trace; int cpu_emulate(int cycles) { - int i; - byte op, cbop; - int clen; - static union reg acc; - static byte b IBSS_ATTR; - static word w IBSS_ATTR; + int i; + static byte op IBSS_ATTR; + static byte cbop IBSS_ATTR; + int clen; + static union reg acc IBSS_ATTR; + static byte b IBSS_ATTR; + static word w IBSS_ATTR; - i = cycles; + i = cycles; next: #ifdef DYNAREC - if(shut) - return cycles-i; + if(shut) + return cycles-i; #endif - if ((clen = cpu_idle(i))) - { - i -= clen; - if (i > 0) goto next; - return cycles-i; - } + if ((clen = cpu_idle(i))) + { + i -= clen; + if (i > 0) goto next; + return cycles-i; + } - if (IME && (IF & IE)) - { - PRE_INT; - switch ((byte)(IF & IE)) - { - case 0x01: case 0x03: case 0x05: case 0x07: - case 0x09: case 0x0B: case 0x0D: case 0x0F: - case 0x11: case 0x13: case 0x15: case 0x17: - case 0x19: case 0x1B: case 0x1D: case 0x1F: - THROW_INT(0); break; - case 0x02: case 0x06: case 0x0A: case 0x0E: - case 0x12: case 0x16: case 0x1A: case 0x1E: - THROW_INT(1); break; - case 0x04: case 0x0C: case 0x14: case 0x1C: - THROW_INT(2); break; - case 0x08: case 0x18: - THROW_INT(3); break; - case 0x10: - THROW_INT(4); break; - } - } - IME = IMA; - -/* if (debug_trace) debug_disassemble(PC, 1); */ + if (IME && (IF & IE)) + { + PRE_INT; + switch ((byte)(IF & IE)) + { + case 0x01: case 0x03: case 0x05: case 0x07: + case 0x09: case 0x0B: case 0x0D: case 0x0F: + case 0x11: case 0x13: case 0x15: case 0x17: + case 0x19: case 0x1B: case 0x1D: case 0x1F: + THROW_INT(0); break; + case 0x02: case 0x06: case 0x0A: case 0x0E: + case 0x12: case 0x16: case 0x1A: case 0x1E: + THROW_INT(1); break; + case 0x04: case 0x0C: case 0x14: case 0x1C: + THROW_INT(2); break; + case 0x08: case 0x18: + THROW_INT(3); break; + case 0x10: + THROW_INT(4); break; + } + } + IME = IMA; + +/* if (debug_trace) debug_disassemble(PC, 1); */ #ifdef DYNAREC - if(PC&0x8000) { + if(PC&0x8000) { #endif - op = FETCH; - clen = cycles_table[op]; + op = FETCH; + clen = cycles_table[op]; - switch(op) - { - case 0x00: /* NOP */ - case 0x40: /* LD B,B */ - case 0x49: /* LD C,C */ - case 0x52: /* LD D,D */ - case 0x5B: /* LD E,E */ - case 0x64: /* LD H,H */ - case 0x6D: /* LD L,L */ - case 0x7F: /* LD A,A */ - break; - - case 0x41: /* LD B,C */ - B = C; break; - case 0x42: /* LD B,D */ - B = D; break; - case 0x43: /* LD B,E */ - B = E; break; - case 0x44: /* LD B,H */ - B = H; break; - case 0x45: /* LD B,L */ - B = L; break; - case 0x46: /* LD B,(HL) */ - B = readb(xHL); break; - case 0x47: /* LD B,A */ - B = A; break; + switch(op) + { + case 0x00: /* NOP */ + case 0x40: /* LD B,B */ + case 0x49: /* LD C,C */ + case 0x52: /* LD D,D */ + case 0x5B: /* LD E,E */ + case 0x64: /* LD H,H */ + case 0x6D: /* LD L,L */ + case 0x7F: /* LD A,A */ + break; + + case 0x41: /* LD B,C */ + B = C; break; + case 0x42: /* LD B,D */ + B = D; break; + case 0x43: /* LD B,E */ + B = E; break; + case 0x44: /* LD B,H */ + B = H; break; + case 0x45: /* LD B,L */ + B = L; break; + case 0x46: /* LD B,(HL) */ + B = readb(xHL); break; + case 0x47: /* LD B,A */ + B = A; break; - case 0x48: /* LD C,B */ - C = B; break; - case 0x4A: /* LD C,D */ - C = D; break; - case 0x4B: /* LD C,E */ - C = E; break; - case 0x4C: /* LD C,H */ - C = H; break; - case 0x4D: /* LD C,L */ - C = L; break; - case 0x4E: /* LD C,(HL) */ - C = readb(xHL); break; - case 0x4F: /* LD C,A */ - C = A; break; + case 0x48: /* LD C,B */ + C = B; break; + case 0x4A: /* LD C,D */ + C = D; break; + case 0x4B: /* LD C,E */ + C = E; break; + case 0x4C: /* LD C,H */ + C = H; break; + case 0x4D: /* LD C,L */ + C = L; break; + case 0x4E: /* LD C,(HL) */ + C = readb(xHL); break; + case 0x4F: /* LD C,A */ + C = A; break; - case 0x50: /* LD D,B */ - D = B; break; - case 0x51: /* LD D,C */ - D = C; break; - case 0x53: /* LD D,E */ - D = E; break; - case 0x54: /* LD D,H */ - D = H; break; - case 0x55: /* LD D,L */ - D = L; break; - case 0x56: /* LD D,(HL) */ - D = readb(xHL); break; - case 0x57: /* LD D,A */ - D = A; break; + case 0x50: /* LD D,B */ + D = B; break; + case 0x51: /* LD D,C */ + D = C; break; + case 0x53: /* LD D,E */ + D = E; break; + case 0x54: /* LD D,H */ + D = H; break; + case 0x55: /* LD D,L */ + D = L; break; + case 0x56: /* LD D,(HL) */ + D = readb(xHL); break; + case 0x57: /* LD D,A */ + D = A; break; - case 0x58: /* LD E,B */ - E = B; break; - case 0x59: /* LD E,C */ - E = C; break; - case 0x5A: /* LD E,D */ - E = D; break; - case 0x5C: /* LD E,H */ - E = H; break; - case 0x5D: /* LD E,L */ - E = L; break; - case 0x5E: /* LD E,(HL) */ - E = readb(xHL); break; - case 0x5F: /* LD E,A */ - E = A; break; + case 0x58: /* LD E,B */ + E = B; break; + case 0x59: /* LD E,C */ + E = C; break; + case 0x5A: /* LD E,D */ + E = D; break; + case 0x5C: /* LD E,H */ + E = H; break; + case 0x5D: /* LD E,L */ + E = L; break; + case 0x5E: /* LD E,(HL) */ + E = readb(xHL); break; + case 0x5F: /* LD E,A */ + E = A; break; - case 0x60: /* LD H,B */ - H = B; break; - case 0x61: /* LD H,C */ - H = C; break; - case 0x62: /* LD H,D */ - H = D; break; - case 0x63: /* LD H,E */ - H = E; break; - case 0x65: /* LD H,L */ - H = L; break; - case 0x66: /* LD H,(HL) */ - H = readb(xHL); break; - case 0x67: /* LD H,A */ - H = A; break; - - case 0x68: /* LD L,B */ - L = B; break; - case 0x69: /* LD L,C */ - L = C; break; - case 0x6A: /* LD L,D */ - L = D; break; - case 0x6B: /* LD L,E */ - L = E; break; - case 0x6C: /* LD L,H */ - L = H; break; - case 0x6E: /* LD L,(HL) */ - L = readb(xHL); break; - case 0x6F: /* LD L,A */ - L = A; break; - - case 0x70: /* LD (HL),B */ - b = B; goto __LD_HL; - case 0x71: /* LD (HL),C */ - b = C; goto __LD_HL; - case 0x72: /* LD (HL),D */ - b = D; goto __LD_HL; - case 0x73: /* LD (HL),E */ - b = E; goto __LD_HL; - case 0x74: /* LD (HL),H */ - b = H; goto __LD_HL; - case 0x75: /* LD (HL),L */ - b = L; goto __LD_HL; - case 0x77: /* LD (HL),A */ - b = A; - __LD_HL: - writeb(xHL,b); - break; - - case 0x78: /* LD A,B */ - A = B; break; - case 0x79: /* LD A,C */ - A = C; break; - case 0x7A: /* LD A,D */ - A = D; break; - case 0x7B: /* LD A,E */ - A = E; break; - case 0x7C: /* LD A,H */ - A = H; break; - case 0x7D: /* LD A,L */ - A = L; break; - case 0x7E: /* LD A,(HL) */ - A = readb(xHL); break; + case 0x60: /* LD H,B */ + H = B; break; + case 0x61: /* LD H,C */ + H = C; break; + case 0x62: /* LD H,D */ + H = D; break; + case 0x63: /* LD H,E */ + H = E; break; + case 0x65: /* LD H,L */ + H = L; break; + case 0x66: /* LD H,(HL) */ + H = readb(xHL); break; + case 0x67: /* LD H,A */ + H = A; break; + + case 0x68: /* LD L,B */ + L = B; break; + case 0x69: /* LD L,C */ + L = C; break; + case 0x6A: /* LD L,D */ + L = D; break; + case 0x6B: /* LD L,E */ + L = E; break; + case 0x6C: /* LD L,H */ + L = H; break; + case 0x6E: /* LD L,(HL) */ + L = readb(xHL); break; + case 0x6F: /* LD L,A */ + L = A; break; + + case 0x70: /* LD (HL),B */ + b = B; goto __LD_HL; + case 0x71: /* LD (HL),C */ + b = C; goto __LD_HL; + case 0x72: /* LD (HL),D */ + b = D; goto __LD_HL; + case 0x73: /* LD (HL),E */ + b = E; goto __LD_HL; + case 0x74: /* LD (HL),H */ + b = H; goto __LD_HL; + case 0x75: /* LD (HL),L */ + b = L; goto __LD_HL; + case 0x77: /* LD (HL),A */ + b = A; + __LD_HL: + writeb(xHL,b); + break; + + case 0x78: /* LD A,B */ + A = B; break; + case 0x79: /* LD A,C */ + A = C; break; + case 0x7A: /* LD A,D */ + A = D; break; + case 0x7B: /* LD A,E */ + A = E; break; + case 0x7C: /* LD A,H */ + A = H; break; + case 0x7D: /* LD A,L */ + A = L; break; + case 0x7E: /* LD A,(HL) */ + A = readb(xHL); break; - case 0x01: /* LD BC,imm */ + case 0x01: /* LD BC,imm */ #ifdef DYNAREC - W(acc) = readw(xPC); - B=HB(acc); - C=LB(acc); + W(acc) = readw(xPC); + B=HB(acc); + C=LB(acc); #else - BC = readw(xPC); + BC = readw(xPC); #endif - PC += 2; - break; - case 0x11: /* LD DE,imm */ + PC += 2; + break; + case 0x11: /* LD DE,imm */ #ifdef DYNAREC - W(acc) = readw(xPC); - D=HB(acc); - E=LB(acc); -#else - DE = readw(xPC); + W(acc) = readw(xPC); + D=HB(acc); + E=LB(acc); +#else + DE = readw(xPC); #endif - PC += 2; - break; - case 0x21: /* LD HL,imm */ - HL = readw(xPC); PC += 2; break; - case 0x31: /* LD SP,imm */ - SP = readw(xPC); PC += 2; break; + PC += 2; + break; + case 0x21: /* LD HL,imm */ + HL = readw(xPC); PC += 2; break; + case 0x31: /* LD SP,imm */ + SP = readw(xPC); PC += 2; break; - case 0x02: /* LD (BC),A */ - writeb(xBC, A); break; - case 0x0A: /* LD A,(BC) */ - A = readb(xBC); break; - case 0x12: /* LD (DE),A */ - writeb(xDE, A); break; - case 0x1A: /* LD A,(DE) */ - A = readb(xDE); break; + case 0x02: /* LD (BC),A */ + writeb(xBC, A); break; + case 0x0A: /* LD A,(BC) */ + A = readb(xBC); break; + case 0x12: /* LD (DE),A */ + writeb(xDE, A); break; + case 0x1A: /* LD A,(DE) */ + A = readb(xDE); break; - case 0x22: /* LDI (HL),A */ - writeb(xHL, A); HL++; break; - case 0x2A: /* LDI A,(HL) */ - A = readb(xHL); HL++; break; - case 0x32: /* LDD (HL),A */ - writeb(xHL, A); HL--; break; - case 0x3A: /* LDD A,(HL) */ - A = readb(xHL); HL--; break; + case 0x22: /* LDI (HL),A */ + writeb(xHL, A); HL++; break; + case 0x2A: /* LDI A,(HL) */ + A = readb(xHL); HL++; break; + case 0x32: /* LDD (HL),A */ + writeb(xHL, A); HL--; break; + case 0x3A: /* LDD A,(HL) */ + A = readb(xHL); HL--; break; - case 0x06: /* LD B,imm */ - B = FETCH; break; - case 0x0E: /* LD C,imm */ - C = FETCH; break; - case 0x16: /* LD D,imm */ - D = FETCH; break; - case 0x1E: /* LD E,imm */ - E = FETCH; break; - case 0x26: /* LD H,imm */ - H = FETCH; break; - case 0x2E: /* LD L,imm */ - L = FETCH; break; - case 0x36: /* LD (HL),imm */ - b = FETCH; writeb(xHL, b); break; - case 0x3E: /* LD A,imm */ - A = FETCH; break; + case 0x06: /* LD B,imm */ + B = FETCH; break; + case 0x0E: /* LD C,imm */ + C = FETCH; break; + case 0x16: /* LD D,imm */ + D = FETCH; break; + case 0x1E: /* LD E,imm */ + E = FETCH; break; + case 0x26: /* LD H,imm */ + H = FETCH; break; + case 0x2E: /* LD L,imm */ + L = FETCH; break; + case 0x36: /* LD (HL),imm */ + b = FETCH; writeb(xHL, b); break; + case 0x3E: /* LD A,imm */ + A = FETCH; break; - case 0x08: /* LD (imm),SP */ - writew(readw(xPC), SP); PC += 2; break; - case 0xEA: /* LD (imm),A */ - writeb(readw(xPC), A); PC += 2; break; + case 0x08: /* LD (imm),SP */ + writew(readw(xPC), SP); PC += 2; break; + case 0xEA: /* LD (imm),A */ + writeb(readw(xPC), A); PC += 2; break; - case 0xE0: /* LDH (imm),A */ - writehi(FETCH, A); break; - case 0xE2: /* LDH (C),A */ - writehi(C, A); break; - case 0xF0: /* LDH A,(imm) */ - A = readhi(FETCH); break; - case 0xF2: /* LDH A,(C) (undocumented) */ - A = readhi(C); break; - + case 0xE0: /* LDH (imm),A */ + writehi(FETCH, A); break; + case 0xE2: /* LDH (C),A */ + writehi(C, A); break; + case 0xF0: /* LDH A,(imm) */ + A = readhi(FETCH); break; + case 0xF2: /* LDH A,(C) (undocumented) */ + A = readhi(C); break; + - case 0xF8: /* LD HL,SP+imm */ - b = FETCH; LDHLSP(b); break; - case 0xF9: /* LD SP,HL */ - SP = HL; break; - case 0xFA: /* LD A,(imm) */ - A = readb(readw(xPC)); PC += 2; break; + case 0xF8: /* LD HL,SP+imm */ + b = FETCH; LDHLSP(b); break; + case 0xF9: /* LD SP,HL */ + SP = HL; break; + case 0xFA: /* LD A,(imm) */ + A = readb(readw(xPC)); PC += 2; break; - ALU_CASES(0x80, 0xC6, ADD, __ADD) - ALU_CASES(0x88, 0xCE, ADC, __ADC) - ALU_CASES(0x90, 0xD6, SUB, __SUB) - ALU_CASES(0x98, 0xDE, SBC, __SBC) - ALU_CASES(0xA0, 0xE6, AND, __AND) - ALU_CASES(0xA8, 0xEE, XOR, __XOR) - ALU_CASES(0xB0, 0xF6, OR, __OR) - ALU_CASES(0xB8, 0xFE, CP, __CP) + ALU_CASES(0x80, 0xC6, ADD, __ADD) + ALU_CASES(0x88, 0xCE, ADC, __ADC) + ALU_CASES(0x90, 0xD6, SUB, __SUB) + ALU_CASES(0x98, 0xDE, SBC, __SBC) + ALU_CASES(0xA0, 0xE6, AND, __AND) + ALU_CASES(0xA8, 0xEE, XOR, __XOR) + ALU_CASES(0xB0, 0xF6, OR, __OR) + ALU_CASES(0xB8, 0xFE, CP, __CP) - case 0x09: /* ADD HL,BC */ - w = BC; goto __ADDW; - case 0x19: /* ADD HL,DE */ - w = DE; goto __ADDW; - case 0x39: /* ADD HL,SP */ - w = SP; goto __ADDW; - case 0x29: /* ADD HL,HL */ - w = HL; - __ADDW: - ADDW(w); - break; + case 0x09: /* ADD HL,BC */ + w = BC; goto __ADDW; + case 0x19: /* ADD HL,DE */ + w = DE; goto __ADDW; + case 0x39: /* ADD HL,SP */ + w = SP; goto __ADDW; + case 0x29: /* ADD HL,HL */ + w = HL; + __ADDW: + ADDW(w); + break; - case 0x04: /* INC B */ - INC(B); break; - case 0x0C: /* INC C */ - INC(C); break; - case 0x14: /* INC D */ - INC(D); break; - case 0x1C: /* INC E */ - INC(E); break; - case 0x24: /* INC H */ - INC(H); break; - case 0x2C: /* INC L */ - INC(L); break; - case 0x34: /* INC (HL) */ - b = readb(xHL); - INC(b); - writeb(xHL, b); - break; - case 0x3C: /* INC A */ - INC(A); break; - - case 0x03: /* INC BC */ + case 0x04: /* INC B */ + INC(B); break; + case 0x0C: /* INC C */ + INC(C); break; + case 0x14: /* INC D */ + INC(D); break; + case 0x1C: /* INC E */ + INC(E); break; + case 0x24: /* INC H */ + INC(H); break; + case 0x2C: /* INC L */ + INC(L); break; + case 0x34: /* INC (HL) */ + b = readb(xHL); + INC(b); + writeb(xHL, b); + break; + case 0x3C: /* INC A */ + INC(A); break; + + case 0x03: /* INC BC */ #ifdef DYNAREC - W(acc)=((B<<8)|C)+1; - B=HB(acc); - C=LB(acc); + W(acc)=((B<<8)|C)+1; + B=HB(acc); + C=LB(acc); #else - INCW(BC); + INCW(BC); #endif - break; - case 0x13: /* INC DE */ + break; + case 0x13: /* INC DE */ #ifdef DYNAREC - W(acc)=((D<<8)|E)+1; - D=HB(acc); - E=LB(acc); + W(acc)=((D<<8)|E)+1; + D=HB(acc); + E=LB(acc); #else - INCW(DE); + INCW(DE); #endif - break; - case 0x23: /* INC HL */ - INCW(HL); break; - case 0x33: /* INC SP */ - INCW(SP); break; - - case 0x05: /* DEC B */ - DEC(B); break; - case 0x0D: /* DEC C */ - DEC(C); break; - case 0x15: /* DEC D */ - DEC(D); break; - case 0x1D: /* DEC E */ - DEC(E); break; - case 0x25: /* DEC H */ - DEC(H); break; - case 0x2D: /* DEC L */ - DEC(L); break; - case 0x35: /* DEC (HL) */ - b = readb(xHL); - DEC(b); - writeb(xHL, b); - break; - case 0x3D: /* DEC A */ - DEC(A); break; + break; + case 0x23: /* INC HL */ + INCW(HL); break; + case 0x33: /* INC SP */ + INCW(SP); break; + + case 0x05: /* DEC B */ + DEC(B); break; + case 0x0D: /* DEC C */ + DEC(C); break; + case 0x15: /* DEC D */ + DEC(D); break; + case 0x1D: /* DEC E */ + DEC(E); break; + case 0x25: /* DEC H */ + DEC(H); break; + case 0x2D: /* DEC L */ + DEC(L); break; + case 0x35: /* DEC (HL) */ + b = readb(xHL); + DEC(b); + writeb(xHL, b); + break; + case 0x3D: /* DEC A */ + DEC(A); break; - case 0x0B: /* DEC BC */ + case 0x0B: /* DEC BC */ #ifdef DYNAREC - W(acc)=((B<<8)|C)-1; - B=HB(acc); - C=LB(acc); + W(acc)=((B<<8)|C)-1; + B=HB(acc); + C=LB(acc); #else - DECW(BC); + DECW(BC); #endif - break; - case 0x1B: /* DEC DE */ + break; + case 0x1B: /* DEC DE */ #ifdef DYNAREC - W(acc)=((D<<8)|E)-1; - D=HB(acc); - E=LB(acc); -#else - DECW(DE); + W(acc)=((D<<8)|E)-1; + D=HB(acc); + E=LB(acc); +#else + DECW(DE); #endif - break; - case 0x2B: /* DEC HL */ - DECW(HL); break; - case 0x3B: /* DEC SP */ - DECW(SP); break; + break; + case 0x2B: /* DEC HL */ + DECW(HL); break; + case 0x3B: /* DEC SP */ + DECW(SP); break; - case 0x07: /* RLCA */ - RLCA(A); break; - case 0x0F: /* RRCA */ - RRCA(A); break; - case 0x17: /* RLA */ - RLA(A); break; - case 0x1F: /* RRA */ - RRA(A); break; + case 0x07: /* RLCA */ + RLCA(A); break; + case 0x0F: /* RRCA */ + RRCA(A); break; + case 0x17: /* RLA */ + RLA(A); break; + case 0x1F: /* RRA */ + RRA(A); break; - case 0x27: /* DAA */ - DAA; break; - case 0x2F: /* CPL */ - CPL(A); break; + case 0x27: /* DAA */ + DAA; break; + case 0x2F: /* CPL */ + CPL(A); break; - case 0x18: /* JR */ - __JR: - JR; break; - case 0x20: /* JR NZ */ - if (!(F&FZ)) goto __JR; NOJR; break; - case 0x28: /* JR Z */ - if (F&FZ) goto __JR; NOJR; break; - case 0x30: /* JR NC */ - if (!(F&FC)) goto __JR; NOJR; break; - case 0x38: /* JR C */ - if (F&FC) goto __JR; NOJR; break; + case 0x18: /* JR */ + __JR: + JR; break; + case 0x20: /* JR NZ */ + if (!(F&FZ)) goto __JR; NOJR; break; + case 0x28: /* JR Z */ + if (F&FZ) goto __JR; NOJR; break; + case 0x30: /* JR NC */ + if (!(F&FC)) goto __JR; NOJR; break; + case 0x38: /* JR C */ + if (F&FC) goto __JR; NOJR; break; - case 0xC3: /* JP */ - __JP: - JP; break; - case 0xC2: /* JP NZ */ - if (!(F&FZ)) goto __JP; NOJP; break; - case 0xCA: /* JP Z */ - if (F&FZ) goto __JP; NOJP; break; - case 0xD2: /* JP NC */ - if (!(F&FC)) goto __JP; NOJP; break; - case 0xDA: /* JP C */ - if (F&FC) goto __JP; NOJP; break; - case 0xE9: /* JP HL */ - PC = HL; break; + case 0xC3: /* JP */ + __JP: + JP; break; + case 0xC2: /* JP NZ */ + if (!(F&FZ)) goto __JP; NOJP; break; + case 0xCA: /* JP Z */ + if (F&FZ) goto __JP; NOJP; break; + case 0xD2: /* JP NC */ + if (!(F&FC)) goto __JP; NOJP; break; + case 0xDA: /* JP C */ + if (F&FC) goto __JP; NOJP; break; + case 0xE9: /* JP HL */ + PC = HL; break; - case 0xC9: /* RET */ - __RET: - RET; break; - case 0xC0: /* RET NZ */ - if (!(F&FZ)) goto __RET; NORET; break; - case 0xC8: /* RET Z */ - if (F&FZ) goto __RET; NORET; break; - case 0xD0: /* RET NC */ - if (!(F&FC)) goto __RET; NORET; break; - case 0xD8: /* RET C */ - if (F&FC) goto __RET; NORET; break; - case 0xD9: /* RETI */ - IME = IMA = 1; goto __RET; + case 0xC9: /* RET */ + __RET: + RET; break; + case 0xC0: /* RET NZ */ + if (!(F&FZ)) goto __RET; NORET; break; + case 0xC8: /* RET Z */ + if (F&FZ) goto __RET; NORET; break; + case 0xD0: /* RET NC */ + if (!(F&FC)) goto __RET; NORET; break; + case 0xD8: /* RET C */ + if (F&FC) goto __RET; NORET; break; + case 0xD9: /* RETI */ + IME = IMA = 1; goto __RET; - case 0xCD: /* CALL */ - __CALL: - CALL; break; - case 0xC4: /* CALL NZ */ - if (!(F&FZ)) goto __CALL; NOCALL; break; - case 0xCC: /* CALL Z */ - if (F&FZ) goto __CALL; NOCALL; break; - case 0xD4: /* CALL NC */ - if (!(F&FC)) goto __CALL; NOCALL; break; - case 0xDC: /* CALL C */ - if (F&FC) goto __CALL; NOCALL; break; + case 0xCD: /* CALL */ + __CALL: + CALL; break; + case 0xC4: /* CALL NZ */ + if (!(F&FZ)) goto __CALL; NOCALL; break; + case 0xCC: /* CALL Z */ + if (F&FZ) goto __CALL; NOCALL; break; + case 0xD4: /* CALL NC */ + if (!(F&FC)) goto __CALL; NOCALL; break; + case 0xDC: /* CALL C */ + if (F&FC) goto __CALL; NOCALL; break; - case 0xC7: /* RST 0 */ - b = 0x00; goto __RST; - case 0xCF: /* RST 8 */ - b = 0x08; goto __RST; - case 0xD7: /* RST 10 */ - b = 0x10; goto __RST; - case 0xDF: /* RST 18 */ - b = 0x18; goto __RST; - case 0xE7: /* RST 20 */ - b = 0x20; goto __RST; - case 0xEF: /* RST 28 */ - b = 0x28; goto __RST; - case 0xF7: /* RST 30 */ - b = 0x30; goto __RST; - case 0xFF: /* RST 38 */ - b = 0x38; - __RST: - RST(b); break; - - case 0xC1: /* POP BC */ + case 0xC7: /* RST 0 */ + b = 0x00; goto __RST; + case 0xCF: /* RST 8 */ + b = 0x08; goto __RST; + case 0xD7: /* RST 10 */ + b = 0x10; goto __RST; + case 0xDF: /* RST 18 */ + b = 0x18; goto __RST; + case 0xE7: /* RST 20 */ + b = 0x20; goto __RST; + case 0xEF: /* RST 28 */ + b = 0x28; goto __RST; + case 0xF7: /* RST 30 */ + b = 0x30; goto __RST; + case 0xFF: /* RST 38 */ + b = 0x38; + __RST: + RST(b); break; + + case 0xC1: /* POP BC */ #ifdef DYNAREC - POP(W(acc)); - B=HB(acc); - C=LB(acc); + POP(W(acc)); + B=HB(acc); + C=LB(acc); #else - POP(BC); + POP(BC); #endif - break; - case 0xC5: /* PUSH BC */ - PUSH(BC); break; - case 0xD1: /* POP DE */ + break; + case 0xC5: /* PUSH BC */ + PUSH(BC); break; + case 0xD1: /* POP DE */ #ifdef DYNAREC - POP(W(acc)); - D=HB(acc); - E=LB(acc); + POP(W(acc)); + D=HB(acc); + E=LB(acc); #else - POP(DE); + POP(DE); #endif - break; - case 0xD5: /* PUSH DE */ - PUSH(DE); break; - case 0xE1: /* POP HL */ - POP(HL); break; - case 0xE5: /* PUSH HL */ - PUSH(HL); break; - case 0xF1: /* POP AF */ + break; + case 0xD5: /* PUSH DE */ + PUSH(DE); break; + case 0xE1: /* POP HL */ + POP(HL); break; + case 0xE5: /* PUSH HL */ + PUSH(HL); break; + case 0xF1: /* POP AF */ #ifdef DYNAREC - POP(W(acc)); - A=HB(acc); - F=LB(acc); + POP(W(acc)); + A=HB(acc); + F=LB(acc); #else - POP(AF); - break; + POP(AF); + break; #endif - case 0xF5: /* PUSH AF */ - PUSH(AF); break; + case 0xF5: /* PUSH AF */ + PUSH(AF); break; - case 0xE8: /* ADD SP,imm */ - b = FETCH; ADDSP(b); break; + case 0xE8: /* ADD SP,imm */ + b = FETCH; ADDSP(b); break; - case 0xF3: /* DI */ - DI; break; - case 0xFB: /* EI */ - EI; break; + case 0xF3: /* DI */ + DI; break; + case 0xFB: /* EI */ + EI; break; - case 0x37: /* SCF */ - SCF; break; - case 0x3F: /* CCF */ - CCF; break; + case 0x37: /* SCF */ + SCF; break; + case 0x3F: /* CCF */ + CCF; break; - case 0x10: /* STOP */ - PC++; - if (R_KEY1 & 1) - { - cpu.speed = cpu.speed ^ 1; - R_KEY1 = (R_KEY1 & 0x7E) | (cpu.speed << 7); - break; - } - /* NOTE - we do not implement dmg STOP whatsoever */ - break; - - case 0x76: /* HALT */ - cpu.halt = 1; - break; + case 0x10: /* STOP */ + PC++; + if (R_KEY1 & 1) + { + cpu.speed = cpu.speed ^ 1; + R_KEY1 = (R_KEY1 & 0x7E) | (cpu.speed << 7); + break; + } + /* NOTE - we do not implement dmg STOP whatsoever */ + break; + + case 0x76: /* HALT */ + cpu.halt = 1; + break; - case 0xCB: /* CB prefix */ - cbop = FETCH; - clen = cb_cycles_table[cbop]; - switch (cbop) - { - CB_REG_CASES(B, 0); - CB_REG_CASES(C, 1); - CB_REG_CASES(D, 2); - CB_REG_CASES(E, 3); - CB_REG_CASES(H, 4); - CB_REG_CASES(L, 5); - CB_REG_CASES(A, 7); - default: - b = readb(xHL); - switch(cbop) - { - CB_REG_CASES(b, 6); - } - if ((cbop & 0xC0) != 0x40) /* exclude BIT */ - writeb(xHL, b); - break; - } - break; - - default: - die( - "invalid opcode 0x%02X at address 0x%04X, rombank = %d\n", - op, (PC-1) & 0xffff, mbc.rombank); - break; - } + case 0xCB: /* CB prefix */ + cbop = FETCH; + clen = cb_cycles_table[cbop]; + switch (cbop) + { + CB_REG_CASES(B, 0); + CB_REG_CASES(C, 1); + CB_REG_CASES(D, 2); + CB_REG_CASES(E, 3); + CB_REG_CASES(H, 4); + CB_REG_CASES(L, 5); + CB_REG_CASES(A, 7); + default: + b = readb(xHL); + switch(cbop) + { + CB_REG_CASES(b, 6); + } + if ((cbop & 0xC0) != 0x40) /* exclude BIT */ + writeb(xHL, b); + break; + } + break; + + default: + die( + "invalid opcode 0x%02X at address 0x%04X, rombank = %d\n", + op, (PC-1) & 0xffff, mbc.rombank); + break; + } #ifdef DYNAREC - } else { // ROM, dynarec. + } + else + { /* ROM, dynarec. */ struct dynarec_block *p=0,*b=address_map[PC&HASH_BITMASK]; - char meow[500]; + char meow[500]; byte *ptr=mbc.rmap[PC>>12]; snprintf(meow,499,"PC: 0x%x 0x%x a: 0x%x\n", - ptr,PC, b ? b->address.d : 0); - rb->splash(HZ*2,true,meow); - while(b&&b->address.d!=(ptr+PC)) { + ptr,PC, b ? b->address.d : 0); + rb->splash(HZ*2,true,meow); + while(b&&b->address.d!=((unsigned int)(ptr)+PC)) + { p=b; b=b->next; - } - if(b) { // call block + } + if(b) + { /* call block */ int fd; - blockcount++; + blockcount++; snprintf(meow,499,"/dyna_0x%x_run.rb",PC); - fd=open(meow,O_WRONLY|O_CREAT|O_TRUNC); - if(fd>=0) { - fdprintf(fd,"Block 0x%x Blockcount: %d\n",PC,blockcount); - fdprintf(fd,"before: 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x\n", - cpu.a,cpu.b,cpu.c,cpu.d,cpu.e,cpu.hl,cpu.f,cpu.sp,cpu.pc, - cpu.ime); - if(blockcountblock) - : "d0", "d1", "d2", "d3", "d4", "d5", "d6", - "d7", "a0","a1", "a2","a3","a4"); - clen=blockclen; - fdprintf(fd,"after: 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x\n", - cpu.a,cpu.b,cpu.c,cpu.d,cpu.e,cpu.hl,cpu.f,cpu.sp, - cpu.pc,cpu.ime); - } - else - die("end"); - close(fd); - } - } - else { // Hash miss -> not found -> recompile block and add it + fd=open(meow,O_WRONLY|O_CREAT|O_TRUNC); + if(fd>=0) + { + fdprintf(fd,"Block 0x%x Blockcount: %d\n",PC,blockcount); + fdprintf(fd,"before: 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x\n", + cpu.a,cpu.b,cpu.c,cpu.d,cpu.e,cpu.hl,cpu.f,cpu.sp,cpu.pc, + cpu.ime); + if(blockcountblock) + : "d0", "d1", "d2", "d3", "d4", "d5", "d6", + "d7", "a0","a1", "a2","a3","a4"); + clen=blockclen; + fdprintf(fd,"after: 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x\n", + cpu.a,cpu.b,cpu.c,cpu.d,cpu.e,cpu.hl,cpu.f,cpu.sp, + cpu.pc,cpu.ime); + } + else + die("end"); + close(fd); + } + } + else + { /* Hash miss -> not found -> recompile block and add it */ struct dynarec_block *newblock; - newblock=malloc(sizeof(struct dynarec_block)); - memset(newblock,0,sizeof(struct dynarec_block)); - newblock->address.d=ptr+PC; - dynamic_recompile(newblock); - if(p) - p->next=newblock; - else - address_map[PC&HASH_BITMASK]=newblock; - } + newblock=malloc(sizeof(struct dynarec_block)); + memset(newblock,0,sizeof(struct dynarec_block)); + newblock->address.d=(unsigned int)(ptr)+PC; + dynamic_recompile(newblock); + if(p) + p->next=newblock; + else + address_map[PC&HASH_BITMASK]=newblock; + } } #endif - - - - clen <<= 1; - div_advance(clen); - timer_advance(clen); - clen >>= cpu.speed; - lcdc_advance(clen); - sound_advance(clen); + + + + clen <<= 1; + div_advance(clen); + timer_advance(clen); + clen >>= cpu.speed; + lcdc_advance(clen); + if(options.sound) + sound_advance(clen); - i -= clen; - if (i > 0) goto next; - return cycles-i; + i -= clen; + if (i > 0) goto next; + return cycles-i; } #endif /* ASM_CPU_EMULATE */ @@ -1005,9 +1002,9 @@ next: inline int cpu_step(int max) { - register int cnt; - if ((cnt = cpu_idle(max))) return cnt; - return cpu_emulate(1); + register int cnt; + if ((cnt = cpu_idle(max))) return cnt; + return cpu_emulate(1); } #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 @@ static const byte cycles_table[256]ICONST_ATTR = { - 1, 3, 2, 2, 1, 1, 2, 1, 5, 2, 2, 2, 1, 1, 2, 1, - 1, 3, 2, 2, 1, 1, 2, 1, 3, 2, 2, 2, 1, 1, 2, 1, - 3, 3, 2, 2, 1, 1, 2, 1, 3, 2, 2, 2, 1, 1, 2, 1, - 3, 3, 2, 2, 1, 3, 3, 3, 3, 2, 2, 2, 1, 1, 2, 1, - - 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 2, 1, - 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 2, 1, - 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 2, 1, - 2, 2, 2, 2, 2, 2, 1, 2, 1, 1, 1, 1, 1, 1, 2, 1, - - 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 2, 1, - 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 2, 1, - 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 2, 1, - 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 2, 1, - - 5, 3, 4, 4, 6, 4, 2, 4, 5, 4, 4, 1, 6, 6, 2, 4, - 5, 3, 4, 0, 6, 4, 2, 4, 5, 4, 4, 0, 6, 0, 2, 4, - 3, 3, 2, 0, 0, 4, 2, 4, 4, 1, 4, 0, 0, 0, 2, 4, - 3, 3, 2, 1, 0, 4, 2, 4, 3, 2, 4, 1, 0, 0, 2, 4, + 1, 3, 2, 2, 1, 1, 2, 1, 5, 2, 2, 2, 1, 1, 2, 1, + 1, 3, 2, 2, 1, 1, 2, 1, 3, 2, 2, 2, 1, 1, 2, 1, + 3, 3, 2, 2, 1, 1, 2, 1, 3, 2, 2, 2, 1, 1, 2, 1, + 3, 3, 2, 2, 3, 3, 3, 1, 3, 2, 2, 2, 1, 1, 2, 1, + + 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 2, 1, + 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 2, 1, + 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 2, 1, + 2, 2, 2, 2, 2, 2, 1, 2, 1, 1, 1, 1, 1, 1, 2, 1, + + 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 2, 1, + 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 2, 1, + 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 2, 1, + 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 2, 1, + + 5, 3, 4, 4, 6, 4, 2, 4, 5, 4, 4, 1, 6, 6, 2, 4, + 5, 3, 4, 0, 6, 4, 2, 4, 5, 4, 4, 0, 6, 0, 2, 4, + 3, 3, 2, 0, 0, 4, 2, 4, 4, 1, 4, 0, 0, 0, 2, 4, + 3, 3, 2, 1, 0, 4, 2, 4, 3, 2, 4, 1, 0, 0, 2, 4, }; static const byte cb_cycles_table[256] ICONST_ATTR = { - 2, 2, 2, 2, 2, 2, 4, 2, 2, 2, 2, 2, 2, 2, 4, 2, - 2, 2, 2, 2, 2, 2, 4, 2, 2, 2, 2, 2, 2, 2, 4, 2, - 2, 2, 2, 2, 2, 2, 4, 2, 2, 2, 2, 2, 2, 2, 4, 2, - 2, 2, 2, 2, 2, 2, 4, 2, 2, 2, 2, 2, 2, 2, 4, 2, - - 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 3, 2, - 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 3, 2, - 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 3, 2, - 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 3, 2, - - 2, 2, 2, 2, 2, 2, 4, 2, 2, 2, 2, 2, 2, 2, 4, 2, - 2, 2, 2, 2, 2, 2, 4, 2, 2, 2, 2, 2, 2, 2, 4, 2, - 2, 2, 2, 2, 2, 2, 4, 2, 2, 2, 2, 2, 2, 2, 4, 2, - 2, 2, 2, 2, 2, 2, 4, 2, 2, 2, 2, 2, 2, 2, 4, 2, - - 2, 2, 2, 2, 2, 2, 4, 2, 2, 2, 2, 2, 2, 2, 4, 2, - 2, 2, 2, 2, 2, 2, 4, 2, 2, 2, 2, 2, 2, 2, 4, 2, - 2, 2, 2, 2, 2, 2, 4, 2, 2, 2, 2, 2, 2, 2, 4, 2, - 2, 2, 2, 2, 2, 2, 4, 2, 2, 2, 2, 2, 2, 2, 4, 2, -}; - - - -static const byte zflag_table[256] ICONST_ATTR = -{ - FZ, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + 2, 2, 2, 2, 2, 2, 4, 2, 2, 2, 2, 2, 2, 2, 4, 2, + 2, 2, 2, 2, 2, 2, 4, 2, 2, 2, 2, 2, 2, 2, 4, 2, + 2, 2, 2, 2, 2, 2, 4, 2, 2, 2, 2, 2, 2, 2, 4, 2, + 2, 2, 2, 2, 2, 2, 4, 2, 2, 2, 2, 2, 2, 2, 4, 2, + + 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 3, 2, + 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 3, 2, + 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 3, 2, + 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 3, 2, + + 2, 2, 2, 2, 2, 2, 4, 2, 2, 2, 2, 2, 2, 2, 4, 2, + 2, 2, 2, 2, 2, 2, 4, 2, 2, 2, 2, 2, 2, 2, 4, 2, + 2, 2, 2, 2, 2, 2, 4, 2, 2, 2, 2, 2, 2, 2, 4, 2, + 2, 2, 2, 2, 2, 2, 4, 2, 2, 2, 2, 2, 2, 2, 4, 2, + + 2, 2, 2, 2, 2, 2, 4, 2, 2, 2, 2, 2, 2, 2, 4, 2, + 2, 2, 2, 2, 2, 2, 4, 2, 2, 2, 2, 2, 2, 2, 4, 2, + 2, 2, 2, 2, 2, 2, 4, 2, 2, 2, 2, 2, 2, 2, 4, 2, + 2, 2, 2, 2, 2, 2, 4, 2, 2, 2, 2, 2, 2, 2, 4, 2, }; static const byte incflag_table[256] ICONST_ATTR = { - FZ|FH, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - FH, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - FH, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - FH, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - FH, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - FH, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - FH, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - FH, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - FH, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - FH, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - FH, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - FH, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - FH, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - FH, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - FH, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - FH, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + FZ|FH, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + FH, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + FH, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + FH, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + FH, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + FH, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + FH, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + FH, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + FH, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + FH, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + FH, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + FH, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + FH, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + FH, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + FH, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + FH, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; static const byte decflag_table[256] ICONST_ATTR = { - FZ|FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN|FH, - FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN|FH, - FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN|FH, - FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN|FH, - FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN|FH, - FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN|FH, - FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN|FH, - FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN|FH, - FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN|FH, - FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN|FH, - FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN|FH, - FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN|FH, - FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN|FH, - FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN|FH, - FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN|FH, - FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN|FH + FZ|FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN|FH, + FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN|FH, + FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN|FH, + FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN|FH, + FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN|FH, + FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN|FH, + FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN|FH, + FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN|FH, + FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN|FH, + FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN|FH, + FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN|FH, + FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN|FH, + FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN|FH, + FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN|FH, + FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN|FH, + FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN, FN|FH }; + static const byte swap_table[256] ICONST_ATTR = { - 0x00, 0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, 0x80, 0x90, 0xA0, 0xB0, 0xC0, 0xD0, 0xE0, 0xF0, - 0x01, 0x11, 0x21, 0x31, 0x41, 0x51, 0x61, 0x71, 0x81, 0x91, 0xA1, 0xB1, 0xC1, 0xD1, 0xE1, 0xF1, - 0x02, 0x12, 0x22, 0x32, 0x42, 0x52, 0x62, 0x72, 0x82, 0x92, 0xA2, 0xB2, 0xC2, 0xD2, 0xE2, 0xF2, - 0x03, 0x13, 0x23, 0x33, 0x43, 0x53, 0x63, 0x73, 0x83, 0x93, 0xA3, 0xB3, 0xC3, 0xD3, 0xE3, 0xF3, - 0x04, 0x14, 0x24, 0x34, 0x44, 0x54, 0x64, 0x74, 0x84, 0x94, 0xA4, 0xB4, 0xC4, 0xD4, 0xE4, 0xF4, - 0x05, 0x15, 0x25, 0x35, 0x45, 0x55, 0x65, 0x75, 0x85, 0x95, 0xA5, 0xB5, 0xC5, 0xD5, 0xE5, 0xF5, - 0x06, 0x16, 0x26, 0x36, 0x46, 0x56, 0x66, 0x76, 0x86, 0x96, 0xA6, 0xB6, 0xC6, 0xD6, 0xE6, 0xF6, - 0x07, 0x17, 0x27, 0x37, 0x47, 0x57, 0x67, 0x77, 0x87, 0x97, 0xA7, 0xB7, 0xC7, 0xD7, 0xE7, 0xF7, - 0x08, 0x18, 0x28, 0x38, 0x48, 0x58, 0x68, 0x78, 0x88, 0x98, 0xA8, 0xB8, 0xC8, 0xD8, 0xE8, 0xF8, - 0x09, 0x19, 0x29, 0x39, 0x49, 0x59, 0x69, 0x79, 0x89, 0x99, 0xA9, 0xB9, 0xC9, 0xD9, 0xE9, 0xF9, - 0x0A, 0x1A, 0x2A, 0x3A, 0x4A, 0x5A, 0x6A, 0x7A, 0x8A, 0x9A, 0xAA, 0xBA, 0xCA, 0xDA, 0xEA, 0xFA, - 0x0B, 0x1B, 0x2B, 0x3B, 0x4B, 0x5B, 0x6B, 0x7B, 0x8B, 0x9B, 0xAB, 0xBB, 0xCB, 0xDB, 0xEB, 0xFB, - 0x0C, 0x1C, 0x2C, 0x3C, 0x4C, 0x5C, 0x6C, 0x7C, 0x8C, 0x9C, 0xAC, 0xBC, 0xCC, 0xDC, 0xEC, 0xFC, - 0x0D, 0x1D, 0x2D, 0x3D, 0x4D, 0x5D, 0x6D, 0x7D, 0x8D, 0x9D, 0xAD, 0xBD, 0xCD, 0xDD, 0xED, 0xFD, - 0x0E, 0x1E, 0x2E, 0x3E, 0x4E, 0x5E, 0x6E, 0x7E, 0x8E, 0x9E, 0xAE, 0xBE, 0xCE, 0xDE, 0xEE, 0xFE, - 0x0F, 0x1F, 0x2F, 0x3F, 0x4F, 0x5F, 0x6F, 0x7F, 0x8F, 0x9F, 0xAF, 0xBF, 0xCF, 0xDF, 0xEF, 0xFF, + 0x00, 0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, 0x80, 0x90, 0xA0, 0xB0, 0xC0, 0xD0, 0xE0, 0xF0, + 0x01, 0x11, 0x21, 0x31, 0x41, 0x51, 0x61, 0x71, 0x81, 0x91, 0xA1, 0xB1, 0xC1, 0xD1, 0xE1, 0xF1, + 0x02, 0x12, 0x22, 0x32, 0x42, 0x52, 0x62, 0x72, 0x82, 0x92, 0xA2, 0xB2, 0xC2, 0xD2, 0xE2, 0xF2, + 0x03, 0x13, 0x23, 0x33, 0x43, 0x53, 0x63, 0x73, 0x83, 0x93, 0xA3, 0xB3, 0xC3, 0xD3, 0xE3, 0xF3, + 0x04, 0x14, 0x24, 0x34, 0x44, 0x54, 0x64, 0x74, 0x84, 0x94, 0xA4, 0xB4, 0xC4, 0xD4, 0xE4, 0xF4, + 0x05, 0x15, 0x25, 0x35, 0x45, 0x55, 0x65, 0x75, 0x85, 0x95, 0xA5, 0xB5, 0xC5, 0xD5, 0xE5, 0xF5, + 0x06, 0x16, 0x26, 0x36, 0x46, 0x56, 0x66, 0x76, 0x86, 0x96, 0xA6, 0xB6, 0xC6, 0xD6, 0xE6, 0xF6, + 0x07, 0x17, 0x27, 0x37, 0x47, 0x57, 0x67, 0x77, 0x87, 0x97, 0xA7, 0xB7, 0xC7, 0xD7, 0xE7, 0xF7, + 0x08, 0x18, 0x28, 0x38, 0x48, 0x58, 0x68, 0x78, 0x88, 0x98, 0xA8, 0xB8, 0xC8, 0xD8, 0xE8, 0xF8, + 0x09, 0x19, 0x29, 0x39, 0x49, 0x59, 0x69, 0x79, 0x89, 0x99, 0xA9, 0xB9, 0xC9, 0xD9, 0xE9, 0xF9, + 0x0A, 0x1A, 0x2A, 0x3A, 0x4A, 0x5A, 0x6A, 0x7A, 0x8A, 0x9A, 0xAA, 0xBA, 0xCA, 0xDA, 0xEA, 0xFA, + 0x0B, 0x1B, 0x2B, 0x3B, 0x4B, 0x5B, 0x6B, 0x7B, 0x8B, 0x9B, 0xAB, 0xBB, 0xCB, 0xDB, 0xEB, 0xFB, + 0x0C, 0x1C, 0x2C, 0x3C, 0x4C, 0x5C, 0x6C, 0x7C, 0x8C, 0x9C, 0xAC, 0xBC, 0xCC, 0xDC, 0xEC, 0xFC, + 0x0D, 0x1D, 0x2D, 0x3D, 0x4D, 0x5D, 0x6D, 0x7D, 0x8D, 0x9D, 0xAD, 0xBD, 0xCD, 0xDD, 0xED, 0xFD, + 0x0E, 0x1E, 0x2E, 0x3E, 0x4E, 0x5E, 0x6E, 0x7E, 0x8E, 0x9E, 0xAE, 0xBE, 0xCE, 0xDE, 0xEE, 0xFE, + 0x0F, 0x1F, 0x2F, 0x3F, 0x4F, 0x5F, 0x6F, 0x7F, 0x8F, 0x9F, 0xAF, 0xBF, 0xCF, 0xDF, 0xEF, 0xFF, }; static const byte daa_table[4096] ICONST_ATTR= { - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, - 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, - 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, - 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, - 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, - 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, - 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, - - 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, - 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, - 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, - 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, - 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, - 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, - 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, - 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, - 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, - 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, - 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, - 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, - 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, - 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, - 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, - 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, - - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, - 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, - 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, - 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, - 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, - 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, - - 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, - 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, - 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, - 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, - 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, - 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, - 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, - 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, - 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, - 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, - 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, - 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, - 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, - 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, - 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, - 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, - - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - - 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, - 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, - 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, - 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, - 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, - 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, - 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, - 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, - 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, - 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, - 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, - 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, - 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, - 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, - 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, - 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, + 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, + 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, + 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, + 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, + 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, + 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, + + 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, + 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, + 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, + 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, + 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, + 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, + 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, + 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, + 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, + 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, + 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, + 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, + 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, + 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, + 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, + 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x60, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, + + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, + 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, + 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, + 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, + 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, + 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, + + 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, + 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, + 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, + 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, + 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, + 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, + 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, + 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, + 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, + 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, + 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, + 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, + 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, + 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, + 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, + 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, + + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + + 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, + 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, + 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, + 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, + 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, + 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, + 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, + 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, + 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, + 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, + 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, + 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, + 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, + 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, + 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, + 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, 0xA0, - 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, - 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, - 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, - 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, - 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, - 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, - 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, - 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, - 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, - 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, - 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, - 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, - 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, - 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, - 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, - 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, + 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, + 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, + 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, + 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, + 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, + 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, + 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, + 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, + 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, + 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, + 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, + 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, + 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, + 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, + 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, + 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, 0xFA, - 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, - 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, - 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, - 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, - 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, - 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, - 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, - 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, - 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, - 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, - 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, - 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, - 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, - 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, - 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, - 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, + 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, + 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, + 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, + 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, + 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, + 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, + 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, + 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, + 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, + 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, + 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, + 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, + 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, + 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, + 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, + 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, 0x9A, }; static const byte daa_carry_table[64] ICONST_ATTR = { - 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, - 00, 00, 00, 00, 00, 00, 00, 00, FC, FC, 00, 00, 00, 00, 00, 00, - FC, FC, FC, FC, FC, FC, FC, FC, FC, FC, FC, FC, FC, FC, FC, FC, - FC, FC, FC, FC, FC, FC, FC, FC, FC, FC, FC, FC, FC, FC, 00, FC, + 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00, + 00, 00, 00, 00, 00, 00, 00, 00, FC, FC, 00, 00, 00, 00, 00, 00, + FC, FC, FC, FC, FC, FC, FC, FC, FC, FC, FC, FC, FC, FC, FC, FC, + FC, FC, FC, FC, FC, FC, FC, FC, FC, FC, FC, FC, FC, FC, 00, FC, }; 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 @@ #include "mem.h" #include "fastmem.h" #include "regs.h" -#include "rc.h" #include "cpuregs.h" static char *mnemonic_table[256] = { - "NOP", - "LD BC,%w", - "LD (BC),A", - "INC BC", - "INC B", - "DEC B", - "LD B,%b", - "RLCA", - "LD (%w),SP", - "ADD HL,BC", - "LD A,(BC)", - "DEC BC", - "INC C", - "DEC C", - "LD C,%b", - "RRCA", - "STOP", - "LD DE,%w", - "LD (DE),A", - "INC DE", - "INC D", - "DEC D", - "LD D,%b", - "RLA", - "JR %o", - "ADD HL,DE", - "LD A,(DE)", - "DEC DE", - "INC E", - "DEC E", - "LD E,%b", - "RRA", - "JR NZ,%o", - "LD HL,%w", - "LD (HLI),A", - "INC HL", - "INC H", - "DEC H", - "LD H,%b", - "DAA", - "JR Z,%o", - "ADD HL,HL", - "LD A,(HLI)", - "DEC HL", - "INC L", - "DEC L", - "LD L,%b", - "CPL", - "JR NC,%o", - "LD SP,%w", - "LD (HLD),A", - "INC SP", - "INC (HL)", - "DEC (HL)", - "LD (HL),%b", - "SCF", - "JR C,%o", - "ADD HL,SP", - "LD A,(HLD)", - "DEC SP", - "INC A", - "DEC A", - "LD A,%b", - "CCF", - "LD B,B", - "LD B,C", - "LD B,D", - "LD B,E", - "LD B,H", - "LD B,L", - "LD B,(HL)", - "LD B,A", - "LD C,B", - "LD C,C", - "LD C,D", - "LD C,E", - "LD C,H", - "LD C,L", - "LD C,(HL)", - "LD C,A", - "LD D,B", - "LD D,C", - "LD D,D", - "LD D,E", - "LD D,H", - "LD D,L", - "LD D,(HL)", - "LD D,A", - "LD E,B", - "LD E,C", - "LD E,D", - "LD E,E", - "LD E,H", - "LD E,L", - "LD E,(HL)", - "LD E,A", - "LD H,B", - "LD H,C", - "LD H,D", - "LD H,E", - "LD H,H", - "LD H,L", - "LD H,(HL)", - "LD H,A", - "LD L,B", - "LD L,C", - "LD L,D", - "LD L,E", - "LD L,H", - "LD L,L", - "LD L,(HL)", - "LD L,A", - "LD (HL),B", - "LD (HL),C", - "LD (HL),D", - "LD (HL),E", - "LD (HL),H", - "LD (HL),L", - "HALT", - "LD (HL),A", - "LD A,B", - "LD A,C", - "LD A,D", - "LD A,E", - "LD A,H", - "LD A,L", - "LD A,(HL)", - "LD A,A", - "ADD A,B", - "ADD A,C", - "ADD A,D", - "ADD A,E", - "ADD A,H", - "ADD A,L", - "ADD A,(HL)", - "ADD A,A", - "ADC A,B", - "ADC A,C", - "ADC A,D", - "ADC A,E", - "ADC A,H", - "ADC A,L", - "ADC A,(HL)", - "ADC A", - "SUB B", - "SUB C", - "SUB D", - "SUB E", - "SUB H", - "SUB L", - "SUB (HL)", - "SUB A", - "SBC A,B", - "SBC A,C", - "SBC A,D", - "SBC A,E", - "SBC A,H", - "SBC A,L", - "SBC A,(HL)", - "SBC A,A", - "AND B", - "AND C", - "AND D", - "AND E", - "AND H", - "AND L", - "AND (HL)", - "AND A", - "XOR B", - "XOR C", - "XOR D", - "XOR E", - "XOR H", - "XOR L", - "XOR (HL)", - "XOR A", - "OR B", - "OR C", - "OR D", - "OR E", - "OR H", - "OR L", - "OR (HL)", - "OR A", - "CP B", - "CP C", - "CP D", - "CP E", - "CP H", - "CP L", - "CP (HL)", - "CP A", - "RET NZ", - "POP BC", - "JP NZ,%w", - "JP %w", - "CALL NZ,%w", - "PUSH BC", - "ADD A,%b", - "RST 0h", - "RET Z", - "RET", - "JP Z,%w", - NULL, - "CALL Z,%w", - "CALL %w", - "ADC A,%b", - "RST 8h", - "RET NC", - "POP DE", - "JP NC,%w", - NULL, - "CALL NC,%w", - "PUSH DE", - "SUB %b", - "RST 10h", - "RET C", - "RETI", - "JP C,%w", - NULL, - "CALL C,%w", - NULL, - "SBC A,%b", - "RST 18h", - "LD (FF00+%b),A", - "POP HL", - "LD (FF00+C),A", - NULL, - NULL, - "PUSH HL", - "AND %b", - "RST 20h", - "ADD SP,%o", - "JP HL", - "LD (%w),A", - NULL, - NULL, - NULL, - "XOR %b", - "RST 28h", - "LD A,(FF00+%b)", - "POP AF", - "LD A,(FF00+C)", - "DI", - NULL, - "PUSH AF", - "OR %b", - "RST 30h", - "LD HL,SP%o", - "LD SP,HL", - "LD A,(%w)", - "EI", - NULL, - NULL, - "CP %b", - "RST 38h" + "NOP", + "LD BC,%w", + "LD (BC),A", + "INC BC", + "INC B", + "DEC B", + "LD B,%b", + "RLCA", + "LD (%w),SP", + "ADD HL,BC", + "LD A,(BC)", + "DEC BC", + "INC C", + "DEC C", + "LD C,%b", + "RRCA", + "STOP", + "LD DE,%w", + "LD (DE),A", + "INC DE", + "INC D", + "DEC D", + "LD D,%b", + "RLA", + "JR %o", + "ADD HL,DE", + "LD A,(DE)", + "DEC DE", + "INC E", + "DEC E", + "LD E,%b", + "RRA", + "JR NZ,%o", + "LD HL,%w", + "LD (HLI),A", + "INC HL", + "INC H", + "DEC H", + "LD H,%b", + "DAA", + "JR Z,%o", + "ADD HL,HL", + "LD A,(HLI)", + "DEC HL", + "INC L", + "DEC L", + "LD L,%b", + "CPL", + "JR NC,%o", + "LD SP,%w", + "LD (HLD),A", + "INC SP", + "INC (HL)", + "DEC (HL)", + "LD (HL),%b", + "SCF", + "JR C,%o", + "ADD HL,SP", + "LD A,(HLD)", + "DEC SP", + "INC A", + "DEC A", + "LD A,%b", + "CCF", + "LD B,B", + "LD B,C", + "LD B,D", + "LD B,E", + "LD B,H", + "LD B,L", + "LD B,(HL)", + "LD B,A", + "LD C,B", + "LD C,C", + "LD C,D", + "LD C,E", + "LD C,H", + "LD C,L", + "LD C,(HL)", + "LD C,A", + "LD D,B", + "LD D,C", + "LD D,D", + "LD D,E", + "LD D,H", + "LD D,L", + "LD D,(HL)", + "LD D,A", + "LD E,B", + "LD E,C", + "LD E,D", + "LD E,E", + "LD E,H", + "LD E,L", + "LD E,(HL)", + "LD E,A", + "LD H,B", + "LD H,C", + "LD H,D", + "LD H,E", + "LD H,H", + "LD H,L", + "LD H,(HL)", + "LD H,A", + "LD L,B", + "LD L,C", + "LD L,D", + "LD L,E", + "LD L,H", + "LD L,L", + "LD L,(HL)", + "LD L,A", + "LD (HL),B", + "LD (HL),C", + "LD (HL),D", + "LD (HL),E", + "LD (HL),H", + "LD (HL),L", + "HALT", + "LD (HL),A", + "LD A,B", + "LD A,C", + "LD A,D", + "LD A,E", + "LD A,H", + "LD A,L", + "LD A,(HL)", + "LD A,A", + "ADD A,B", + "ADD A,C", + "ADD A,D", + "ADD A,E", + "ADD A,H", + "ADD A,L", + "ADD A,(HL)", + "ADD A,A", + "ADC A,B", + "ADC A,C", + "ADC A,D", + "ADC A,E", + "ADC A,H", + "ADC A,L", + "ADC A,(HL)", + "ADC A", + "SUB B", + "SUB C", + "SUB D", + "SUB E", + "SUB H", + "SUB L", + "SUB (HL)", + "SUB A", + "SBC A,B", + "SBC A,C", + "SBC A,D", + "SBC A,E", + "SBC A,H", + "SBC A,L", + "SBC A,(HL)", + "SBC A,A", + "AND B", + "AND C", + "AND D", + "AND E", + "AND H", + "AND L", + "AND (HL)", + "AND A", + "XOR B", + "XOR C", + "XOR D", + "XOR E", + "XOR H", + "XOR L", + "XOR (HL)", + "XOR A", + "OR B", + "OR C", + "OR D", + "OR E", + "OR H", + "OR L", + "OR (HL)", + "OR A", + "CP B", + "CP C", + "CP D", + "CP E", + "CP H", + "CP L", + "CP (HL)", + "CP A", + "RET NZ", + "POP BC", + "JP NZ,%w", + "JP %w", + "CALL NZ,%w", + "PUSH BC", + "ADD A,%b", + "RST 0h", + "RET Z", + "RET", + "JP Z,%w", + NULL, + "CALL Z,%w", + "CALL %w", + "ADC A,%b", + "RST 8h", + "RET NC", + "POP DE", + "JP NC,%w", + NULL, + "CALL NC,%w", + "PUSH DE", + "SUB %b", + "RST 10h", + "RET C", + "RETI", + "JP C,%w", + NULL, + "CALL C,%w", + NULL, + "SBC A,%b", + "RST 18h", + "LD (FF00+%b),A", + "POP HL", + "LD (FF00+C),A", + NULL, + NULL, + "PUSH HL", + "AND %b", + "RST 20h", + "ADD SP,%o", + "JP HL", + "LD (%w),A", + NULL, + NULL, + NULL, + "XOR %b", + "RST 28h", + "LD A,(FF00+%b)", + "POP AF", + "LD A,(FF00+C)", + "DI", + NULL, + "PUSH AF", + "OR %b", + "RST 30h", + "LD HL,SP%o", + "LD SP,HL", + "LD A,(%w)", + "EI", + NULL, + NULL, + "CP %b", + "RST 38h" }; static char *cb_mnemonic_table[256] = { - "RLC B", - "RLC C", - "RLC D", - "RLC E", - "RLC H", - "RLC L", - "RLC (HL)", - "RLC A", - "RRC B", - "RRC C", - "RRC D", - "RRC E", - "RRC H", - "RRC L", - "RRC (HL)", - "RRC A", - "RL B", - "RL C", - "RL D", - "RL E", - "RL H", - "RL L", - "RL (HL)", - "RL A", - "RR B", - "RR C", - "RR D", - "RR E", - "RR H", - "RR L", - "RR (HL)", - "RR A", - "SLA B", - "SLA C", - "SLA D", - "SLA E", - "SLA H", - "SLA L", - "SLA (HL)", - "SLA A", - "SRA B", - "SRA C", - "SRA D", - "SRA E", - "SRA H", - "SRA L", - "SRA (HL)", - "SRA A", - "SWAP B", - "SWAP C", - "SWAP D", - "SWAP E", - "SWAP H", - "SWAP L", - "SWAP (HL)", - "SWAP A", - "SRL B", - "SRL C", - "SRL D", - "SRL E", - "SRL H", - "SRL L", - "SRL (HL)", - "SRL A", - "BIT 0,B", - "BIT 0,C", - "BIT 0,D", - "BIT 0,E", - "BIT 0,H", - "BIT 0,L", - "BIT 0,(HL)", - "BIT 0,A", - "BIT 1,B", - "BIT 1,C", - "BIT 1,D", - "BIT 1,E", - "BIT 1,H", - "BIT 1,L", - "BIT 1,(HL)", - "BIT 1,A", - "BIT 2,B", - "BIT 2,C", - "BIT 2,D", - "BIT 2,E", - "BIT 2,H", - "BIT 2,L", - "BIT 2,(HL)", - "BIT 2,A", - "BIT 3,B", - "BIT 3,C", - "BIT 3,D", - "BIT 3,E", - "BIT 3,H", - "BIT 3,L", - "BIT 3,(HL)", - "BIT 3,A", - "BIT 4,B", - "BIT 4,C", - "BIT 4,D", - "BIT 4,E", - "BIT 4,H", - "BIT 4,L", - "BIT 4,(HL)", - "BIT 4,A", - "BIT 5,B", - "BIT 5,C", - "BIT 5,D", - "BIT 5,E", - "BIT 5,H", - "BIT 5,L", - "BIT 5,(HL)", - "BIT 5,A", - "BIT 6,B", - "BIT 6,C", - "BIT 6,D", - "BIT 6,E", - "BIT 6,H", - "BIT 6,L", - "BIT 6,(HL)", - "BIT 6,A", - "BIT 7,B", - "BIT 7,C", - "BIT 7,D", - "BIT 7,E", - "BIT 7,H", - "BIT 7,L", - "BIT 7,(HL)", - "BIT 7,A", - "RES 0,B", - "RES 0,C", - "RES 0,D", - "RES 0,E", - "RES 0,H", - "RES 0,L", - "RES 0,(HL)", - "RES 0,A", - "RES 1,B", - "RES 1,C", - "RES 1,D", - "RES 1,E", - "RES 1,H", - "RES 1,L", - "RES 1,(HL)", - "RES 1,A", - "RES 2,B", - "RES 2,C", - "RES 2,D", - "RES 2,E", - "RES 2,H", - "RES 2,L", - "RES 2,(HL)", - "RES 2,A", - "RES 3,B", - "RES 3,C", - "RES 3,D", - "RES 3,E", - "RES 3,H", - "RES 3,L", - "RES 3,(HL)", - "RES 3,A", - "RES 4,B", - "RES 4,C", - "RES 4,D", - "RES 4,E", - "RES 4,H", - "RES 4,L", - "RES 4,(HL)", - "RES 4,A", - "RES 5,B", - "RES 5,C", - "RES 5,D", - "RES 5,E", - "RES 5,H", - "RES 5,L", - "RES 5,(HL)", - "RES 5,A", - "RES 6,B", - "RES 6,C", - "RES 6,D", - "RES 6,E", - "RES 6,H", - "RES 6,L", - "RES 6,(HL)", - "RES 6,A", - "RES 7,B", - "RES 7,C", - "RES 7,D", - "RES 7,E", - "RES 7,H", - "RES 7,L", - "RES 7,(HL)", - "RES 7,A", - "SET 0,B", - "SET 0,C", - "SET 0,D", - "SET 0,E", - "SET 0,H", - "SET 0,L", - "SET 0,(HL)", - "SET 0,A", - "SET 1,B", - "SET 1,C", - "SET 1,D", - "SET 1,E", - "SET 1,H", - "SET 1,L", - "SET 1,(HL)", - "SET 1,A", - "SET 2,B", - "SET 2,C", - "SET 2,D", - "SET 2,E", - "SET 2,H", - "SET 2,L", - "SET 2,(HL)", - "SET 2,A", - "SET 3,B", - "SET 3,C", - "SET 3,D", - "SET 3,E", - "SET 3,H", - "SET 3,L", - "SET 3,(HL)", - "SET 3,A", - "SET 4,B", - "SET 4,C", - "SET 4,D", - "SET 4,E", - "SET 4,H", - "SET 4,L", - "SET 4,(HL)", - "SET 4,A", - "SET 5,B", - "SET 5,C", - "SET 5,D", - "SET 5,E", - "SET 5,H", - "SET 5,L", - "SET 5,(HL)", - "SET 5,A", - "SET 6,B", - "SET 6,C", - "SET 6,D", - "SET 6,E", - "SET 6,H", - "SET 6,L", - "SET 6,(HL)", - "SET 6,A", - "SET 7,B", - "SET 7,C", - "SET 7,D", - "SET 7,E", - "SET 7,H", - "SET 7,L", - "SET 7,(HL)", - "SET 7,A" + "RLC B", + "RLC C", + "RLC D", + "RLC E", + "RLC H", + "RLC L", + "RLC (HL)", + "RLC A", + "RRC B", + "RRC C", + "RRC D", + "RRC E", + "RRC H", + "RRC L", + "RRC (HL)", + "RRC A", + "RL B", + "RL C", + "RL D", + "RL E", + "RL H", + "RL L", + "RL (HL)", + "RL A", + "RR B", + "RR C", + "RR D", + "RR E", + "RR H", + "RR L", + "RR (HL)", + "RR A", + "SLA B", + "SLA C", + "SLA D", + "SLA E", + "SLA H", + "SLA L", + "SLA (HL)", + "SLA A", + "SRA B", + "SRA C", + "SRA D", + "SRA E", + "SRA H", + "SRA L", + "SRA (HL)", + "SRA A", + "SWAP B", + "SWAP C", + "SWAP D", + "SWAP E", + "SWAP H", + "SWAP L", + "SWAP (HL)", + "SWAP A", + "SRL B", + "SRL C", + "SRL D", + "SRL E", + "SRL H", + "SRL L", + "SRL (HL)", + "SRL A", + "BIT 0,B", + "BIT 0,C", + "BIT 0,D", + "BIT 0,E", + "BIT 0,H", + "BIT 0,L", + "BIT 0,(HL)", + "BIT 0,A", + "BIT 1,B", + "BIT 1,C", + "BIT 1,D", + "BIT 1,E", + "BIT 1,H", + "BIT 1,L", + "BIT 1,(HL)", + "BIT 1,A", + "BIT 2,B", + "BIT 2,C", + "BIT 2,D", + "BIT 2,E", + "BIT 2,H", + "BIT 2,L", + "BIT 2,(HL)", + "BIT 2,A", + "BIT 3,B", + "BIT 3,C", + "BIT 3,D", + "BIT 3,E", + "BIT 3,H", + "BIT 3,L", + "BIT 3,(HL)", + "BIT 3,A", + "BIT 4,B", + "BIT 4,C", + "BIT 4,D", + "BIT 4,E", + "BIT 4,H", + "BIT 4,L", + "BIT 4,(HL)", + "BIT 4,A", + "BIT 5,B", + "BIT 5,C", + "BIT 5,D", + "BIT 5,E", + "BIT 5,H", + "BIT 5,L", + "BIT 5,(HL)", + "BIT 5,A", + "BIT 6,B", + "BIT 6,C", + "BIT 6,D", + "BIT 6,E", + "BIT 6,H", + "BIT 6,L", + "BIT 6,(HL)", + "BIT 6,A", + "BIT 7,B", + "BIT 7,C", + "BIT 7,D", + "BIT 7,E", + "BIT 7,H", + "BIT 7,L", + "BIT 7,(HL)", + "BIT 7,A", + "RES 0,B", + "RES 0,C", + "RES 0,D", + "RES 0,E", + "RES 0,H", + "RES 0,L", + "RES 0,(HL)", + "RES 0,A", + "RES 1,B", + "RES 1,C", + "RES 1,D", + "RES 1,E", + "RES 1,H", + "RES 1,L", + "RES 1,(HL)", + "RES 1,A", + "RES 2,B", + "RES 2,C", + "RES 2,D", + "RES 2,E", + "RES 2,H", + "RES 2,L", + "RES 2,(HL)", + "RES 2,A", + "RES 3,B", + "RES 3,C", + "RES 3,D", + "RES 3,E", + "RES 3,H", + "RES 3,L", + "RES 3,(HL)", + "RES 3,A", + "RES 4,B", + "RES 4,C", + "RES 4,D", + "RES 4,E", + "RES 4,H", + "RES 4,L", + "RES 4,(HL)", + "RES 4,A", + "RES 5,B", + "RES 5,C", + "RES 5,D", + "RES 5,E", + "RES 5,H", + "RES 5,L", + "RES 5,(HL)", + "RES 5,A", + "RES 6,B", + "RES 6,C", + "RES 6,D", + "RES 6,E", + "RES 6,H", + "RES 6,L", + "RES 6,(HL)", + "RES 6,A", + "RES 7,B", + "RES 7,C", + "RES 7,D", + "RES 7,E", + "RES 7,H", + "RES 7,L", + "RES 7,(HL)", + "RES 7,A", + "SET 0,B", + "SET 0,C", + "SET 0,D", + "SET 0,E", + "SET 0,H", + "SET 0,L", + "SET 0,(HL)", + "SET 0,A", + "SET 1,B", + "SET 1,C", + "SET 1,D", + "SET 1,E", + "SET 1,H", + "SET 1,L", + "SET 1,(HL)", + "SET 1,A", + "SET 2,B", + "SET 2,C", + "SET 2,D", + "SET 2,E", + "SET 2,H", + "SET 2,L", + "SET 2,(HL)", + "SET 2,A", + "SET 3,B", + "SET 3,C", + "SET 3,D", + "SET 3,E", + "SET 3,H", + "SET 3,L", + "SET 3,(HL)", + "SET 3,A", + "SET 4,B", + "SET 4,C", + "SET 4,D", + "SET 4,E", + "SET 4,H", + "SET 4,L", + "SET 4,(HL)", + "SET 4,A", + "SET 5,B", + "SET 5,C", + "SET 5,D", + "SET 5,E", + "SET 5,H", + "SET 5,L", + "SET 5,(HL)", + "SET 5,A", + "SET 6,B", + "SET 6,C", + "SET 6,D", + "SET 6,E", + "SET 6,H", + "SET 6,L", + "SET 6,(HL)", + "SET 6,A", + "SET 7,B", + "SET 7,C", + "SET 7,D", + "SET 7,E", + "SET 7,H", + "SET 7,L", + "SET 7,(HL)", + "SET 7,A" }; static byte operand_count[256] = { - 1, 3, 1, 1, 1, 1, 2, 1, 3, 1, 1, 1, 1, 1, 2, 1, - 1, 3, 1, 1, 1, 1, 2, 1, 2, 1, 1, 1, 1, 1, 2, 1, - 2, 3, 1, 1, 1, 1, 2, 1, 2, 1, 1, 1, 1, 1, 2, 1, - 2, 3, 1, 1, 1, 1, 2, 1, 2, 1, 1, 1, 1, 1, 2, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 3, 3, 3, 1, 2, 1, 1, 1, 3, 2, 3, 3, 2, 1, - 1, 1, 3, 1, 3, 1, 2, 1, 1, 1, 3, 1, 3, 1, 2, 1, - 2, 1, 1, 1, 1, 1, 2, 1, 2, 1, 3, 1, 1, 1, 2, 1, - 2, 1, 1, 1, 1, 1, 2, 1, 2, 1, 3, 1, 1, 1, 2, 1 + 1, 3, 1, 1, 1, 1, 2, 1, 3, 1, 1, 1, 1, 1, 2, 1, + 1, 3, 1, 1, 1, 1, 2, 1, 2, 1, 1, 1, 1, 1, 2, 1, + 2, 3, 1, 1, 1, 1, 2, 1, 2, 1, 1, 1, 1, 1, 2, 1, + 2, 3, 1, 1, 1, 1, 2, 1, 2, 1, 1, 1, 1, 1, 2, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 3, 3, 3, 1, 2, 1, 1, 1, 3, 2, 3, 3, 2, 1, + 1, 1, 3, 1, 3, 1, 2, 1, 1, 1, 3, 1, 3, 1, 2, 1, + 2, 1, 1, 1, 1, 1, 2, 1, 2, 1, 3, 1, 1, 1, 2, 1, + 2, 1, 1, 1, 1, 1, 2, 1, 2, 1, 3, 1, 1, 1, 2, 1 }; @@ -560,116 +559,95 @@ int debug_trace = 0; rcvar_t debug_exports[] = { - RCV_BOOL("trace", &debug_trace), - RCV_END + RCV_BOOL("trace", &debug_trace), + RCV_END }; void debug_disassemble(addr a, int c) { - static int i, j, k; - static byte code; - static byte ops[3]; - static int opaddr; - static char mnemonic[256]; - static char *pattern; - char meow[500],buf[300]; -// int fd; - if(!debug_trace) return; -// fd=open("/rockboy.trace",O_WRONLY|O_APPEND); -// if(fd<0) -// return; + static int i, j, k; + static byte code; + static byte ops[3]; + static int opaddr; + static char mnemonic[256]; + static char *pattern; + char meow[500],buf[300]; + if(!debug_trace) return; - while (c > 0) - { - k = 0; - opaddr = a; - code = ops[k++] = readb(a); a++; - if (code != 0xCB) - { - pattern = mnemonic_table[code]; - if (!pattern) - pattern = "***INVALID***"; - } - else - { - code = ops[k++] = readb(a); a++; - pattern = cb_mnemonic_table[code]; - } - i = j = 0; - while (pattern[i]) - { - if (pattern[i] == '%') - { - switch (pattern[++i]) - { - case 'B': - case 'b': - ops[k] = readb(a); a++; - j += snprintf(mnemonic + j,255-j, - "%02Xh", ops[k++]); - break; - case 'W': - case 'w': - ops[k] = readb(a); a++; - ops[k+1] = readb(a); a++; - j += snprintf(mnemonic + j, 255-j,"%04Xh", - ((ops[k+1] << 8) | ops[k])); - k += 2; - break; - case 'O': - case 'o': - ops[k] = readb(a); a++; - j += snprintf(mnemonic + j, 255-j,"%+d", - (n8)(ops[k++])); - break; - } - i++; - } - else - { - mnemonic[j++] = pattern[i++]; - } - } - mnemonic[j] = 0; - snprintf(buf,299,"%04X ", opaddr); - strcpy(meow,buf); - switch (operand_count[ops[0]]) { - case 1: - snprintf(buf,299,"%02X ", ops[0]); - strcat(meow,buf); - break; - case 2: - snprintf(buf,299,"%02X %02X ", ops[0], ops[1]); - strcat(meow,buf); - break; - case 3: - snprintf(buf,299,"%02X %02X %02X ", ops[0], ops[1], ops[2]); - strcat(meow,buf); - break; - } - snprintf(buf,"%-16.16s", mnemonic); - strcat(meow,buf); + while (c > 0) + { + k = 0; + opaddr = a; + code = ops[k++] = readb(a); a++; + if (code != 0xCB) + { + pattern = mnemonic_table[code]; + if (!pattern) + pattern = "***INVALID***"; + } + else + { + code = ops[k++] = readb(a); a++; + pattern = cb_mnemonic_table[code]; + } + i = j = 0; + while (pattern[i]) + { + if (pattern[i] == '%') + { + switch (pattern[++i]) + { + case 'B': + case 'b': + ops[k] = readb(a); a++; + j += snprintf(mnemonic + j,255-j, + "%02Xh", ops[k++]); + break; + case 'W': + case 'w': + ops[k] = readb(a); a++; + ops[k+1] = readb(a); a++; + j += snprintf(mnemonic + j, 255-j,"%04Xh", + ((ops[k+1] << 8) | ops[k])); + k += 2; + break; + case 'O': + case 'o': + ops[k] = readb(a); a++; + j += snprintf(mnemonic + j, 255-j,"%+d", + (n8)(ops[k++])); + break; + } + i++; + } + else + { + mnemonic[j++] = pattern[i++]; + } + } + mnemonic[j] = 0; + snprintf(buf,299,"%04X ", opaddr); + strcpy(meow,buf); + switch (operand_count[ops[0]]) { + case 1: + snprintf(buf,299,"%02X ", ops[0]); + strcat(meow,buf); + break; + case 2: + snprintf(buf,299,"%02X %02X ", ops[0], ops[1]); + strcat(meow,buf); + break; + case 3: + snprintf(buf,299,"%02X %02X %02X ", ops[0], ops[1], ops[2]); + strcat(meow,buf); + break; + } + snprintf(buf,"%-16.16s", mnemonic); + strcat(meow,buf); rb->lcd_putsxy(0,0,meow); - rb->lcd_update(); -/* fprintf(fd, - " SP=%04X.%04X BC=%04X.%02X.%02X DE=%04X.%02X " - "HL=%04X.%02X A=%02X F=%02X %c%c%c%c%c", - SP, readw(SP), - BC, readb(BC), readb(0xFF00 | C), - DE, readb(DE), - HL, readb(HL), A, - F, (IME ? 'I' : '-'), - ((F & 0x80) ? 'Z' : '-'), - ((F & 0x40) ? 'N' : '-'), - ((F & 0x20) ? 'H' : '-'), - ((F & 0x10) ? 'C' : '-') - ); - fprintf(fd, - " IE=%02X IF=%02X LCDC=%02X STAT=%02X LY=%02X LYC=%02X", - R_IE, R_IF, R_LCDC, R_STAT, R_LY, R_LYC - );*/ - c--; - } + rb->lcd_update(); + c--; + } } 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 @@ -#ifdef DYNAREC -#include #include "rockmacros.h" #include "defs.h" #include "regs.h" @@ -58,10 +56,10 @@ int blockclen; DYNA_MOVEM(3,0x3FE,1); /* - * SUBQ 2, %a0 // decrease gb sp - * PEA #(n) // push n - * PUSH %a0 // push gb sp - * call_native writew(SP, (n) + * SUBQ 2, %a0 decrease gb sp + * PEA #(n) push n + * PUSH %a0 push gb sp + * call_native writew(SP, (n)) * ADDQ 8, %a7 */ #define PUSH(n) \ @@ -72,7 +70,7 @@ int blockclen; DYNA_ADDQ_l_i_to_r(0,7,1); /* - * PUSH %a0 // push gb sp + * PUSH %a0 push gb sp * call_native readw(SP); * addq 4, a7 * addq 2, a0 @@ -133,21 +131,24 @@ int blockclen; DYNA_ANDI_l_i_to_r(0xFF,1); -void DYNA_MOVE_b_r_to_r(un8 src,un8 dest) { +void DYNA_MOVE_b_r_to_r(un8 src,un8 dest) +{ DWRITEW(0x1000|(src&0x7)|(dest&0x7)<<9); } -void DYNA_ASHIFT_l(un8 src, un8 dest, int left, int src_is_reg) { +void DYNA_ASHIFT_l(un8 src, un8 dest, int left, int src_is_reg) +{ unsigned short opcode; opcode=(0xE080)|((src&0x7)<<9)|(dest&0x7); if(left) - opcode|=0x100; + opcode|=0x100; if(src_is_reg) - opcode|=0x20; + opcode|=0x20; DWRITEW(opcode); } -void DYNA_LSHIFT_l(un8 src, un8 dest, int left, int src_is_reg) { +void DYNA_LSHIFT_l(un8 src, un8 dest, int left, int src_is_reg) +{ unsigned short opcode=0xE088|((src&0x7)<<9)|(dest&0x7); if(left) opcode|=0x100; @@ -156,63 +157,74 @@ void DYNA_LSHIFT_l(un8 src, un8 dest, int left, int src_is_reg) { DWRITEW(opcode); } -void DYNA_MOVE_l_i_to_r(un32 imm, un8 dest) { +void DYNA_MOVE_l_i_to_r(un32 imm, un8 dest) +{ DWRITEW(0x203C|(dest&0x7)<<9); - DWRITEL(imm); // endianness? + DWRITEL(imm); /* endianness? */ } -void DYNA_MOVE_l_i_to_m(un32 imm, un8 dest_a) { +void DYNA_MOVE_l_i_to_m(un32 imm, un8 dest_a) +{ DWRITEW(0x20FC|((dest_a&0x7)<<9)); DWRITEL(imm); } -void DYNA_MOVE_l_r_to_m(un8 src,un8 dest_a) { +void DYNA_MOVE_l_r_to_m(un8 src,un8 dest_a) +{ DWRITEW(0x2080|(dest_a&0x7)<<9|(src&0x7)); } -void DYNA_MOVE_l_r_to_r(un8 src, un8 dest, int src_is_areg) { +void DYNA_MOVE_l_r_to_r(un8 src, un8 dest, int src_is_areg) +{ unsigned short opcode=0x2000|((dest&0x7)<<9)|(src&0x7); if(src_is_areg) opcode|=0x8; DWRITEW(opcode); } -void DYNA_MOVE_w_r_to_r(un8 src, un8 dest, int src_is_areg) { +void DYNA_MOVE_w_r_to_r(un8 src, un8 dest, int src_is_areg) +{ unsigned short opcode=0x3000|((dest&0x7)<<9)|(src&0x7); if(src_is_areg) opcode|=0x8; DWRITEW(opcode); } -void DYNA_MOVEQ_l_i_to_r(un8 imm, un8 dest) { +void DYNA_MOVEQ_l_i_to_r(un8 imm, un8 dest) +{ DWRITEW(0x7000|((dest&0x7)<<9)|imm); } -void DYNA_PEA_w_i(un16 imm) { +void DYNA_PEA_w_i(un16 imm) +{ DWRITEW(0x4878); DWRITEW(imm); } -void DYNA_PUSH_l_r(un8 reg,int src_is_areg) { +void DYNA_PUSH_l_r(un8 reg,int src_is_areg) +{ unsigned short value= 0x2F00|(reg&0x7); if(src_is_areg) value|=0x8; DWRITEW(value); } -void DYNA_MOVEA_l_i_to_r(un32 imm, un8 dest) { +void DYNA_MOVEA_l_i_to_r(un32 imm, un8 dest) +{ DWRITEW(0x207C|(dest&0x7)<<9); DWRITEL(imm); } -void DYNA_MOVEA_w_r_to_r(un8 src, un8 dest, int src_is_areg) { +void DYNA_MOVEA_w_r_to_r(un8 src, un8 dest, int src_is_areg) +{ unsigned short value=0x3040|((dest&0x7)<<9)|(src&0x7); if(src_is_areg) value|=0x8; DWRITEW(value); } -void DYNA_MOVEA_l_r_to_r(un8 src, un8 dest, int src_is_areg) { +void DYNA_MOVEA_l_r_to_r(un8 src, un8 dest, int src_is_areg) +{ unsigned short value=0x2040|((dest&0x7)<<9)|(src&0x7); if(src_is_areg) value|=0x8; @@ -220,67 +232,80 @@ void DYNA_MOVEA_l_r_to_r(un8 src, un8 dest, int src_is_areg) { } -void DYNA_RET() { +void DYNA_RET(void) +{ DWRITEW(0x4E75); } -void DYNA_AND_l_i_to_r(un32 imm, un8 dest) { +void DYNA_AND_l_i_to_r(un32 imm, un8 dest) +{ DWRITEW(0x0280|(dest&0x7)); DWRITEL(imm); } -void DYNA_AND_l_r_to_r(un8 src,un8 dest) { +void DYNA_AND_l_r_to_r(un8 src,un8 dest) +{ DWRITEW(0xC080|((dest&0x7)<<9)|(src&0x7)); } -void DYNA_OR_l_r_to_r(un8 src,un8 dest) { +void DYNA_OR_l_r_to_r(un8 src,un8 dest) +{ DWRITEW(0x8080|((dest&0x7)<<9)|(src&0x7)); } -void DYNA_OR_l_i_to_r(un32 imm,un8 dest) { +void DYNA_OR_l_i_to_r(un32 imm,un8 dest) +{ DWRITEW(0x0080|(dest&0x7)); DWRITEL(imm); } -void DYNA_CLR_l_m(un32 addr) { +void DYNA_CLR_l_m(un32 addr) +{ DWRITEW(0x42B9); DWRITEL(addr); } -void DYNA_CLR_l_r(un8 reg) { +void DYNA_CLR_l_r(un8 reg) +{ DWRITEW(0x4280|(reg&0x7)); } -void DYNA_CLR_w_r(un8 reg) { +void DYNA_CLR_w_r(un8 reg) +{ DWRITEW(0x42C0|(reg&0x7)); } -void DYNA_CLR_b_r(un8 reg) { +void DYNA_CLR_b_r(un8 reg) +{ DWRITEW(0x4200|(reg&0x7)); } -void DYNA_ADDQ_l_i_to_r(un8 imm, un8 reg, int dest_is_a) { +void DYNA_ADDQ_l_i_to_r(un8 imm, un8 reg, int dest_is_a) +{ unsigned short value=0x5080|(imm&0x7)<<9|(reg&0x7); if(dest_is_a) value|=0x8; DWRITEW(value); } -void DYNA_ADD_l_r_to_r(un8 src, un8 dest, int src_is_areg) { +void DYNA_ADD_l_r_to_r(un8 src, un8 dest, int src_is_areg) +{ unsigned short value=0xD080|((dest&0x7)<<9)|(src&0x7); if(src_is_areg) value|=0x8; DWRITEW(value); } -void DYNA_JSR(void *addr) { +void DYNA_JSR(void *addr) +{ DWRITEW(0x4EB9); DWRITEL(addr); } -void DYNA_MOVEM(un8 areg,un16 mask, int frommem) { +void DYNA_MOVEM(un8 areg,un16 mask, int frommem) +{ unsigned short value=0x48D0|(areg&0x7); if(frommem) value|=0x400; @@ -288,27 +313,32 @@ void DYNA_MOVEM(un8 areg,un16 mask, int frommem) { DWRITEW(mask); } -void DYNA_SUBQ_l_i_to_r(un8 imm, un8 reg, int addr_reg) { +void DYNA_SUBQ_l_i_to_r(un8 imm, un8 reg, int addr_reg) +{ unsigned short value=0x5180|(reg&0x7)|((imm&0x7)<<9); if(addr_reg) value|=0x8; DWRITEW(value); } -void DYNA_SUB_l_r_to_r(un8 src, un8 dest, int is_areg) { +void DYNA_SUB_l_r_to_r(un8 src, un8 dest, int is_areg) +{ unsigned short value=0x9080|((dest&0x7)<<9)|(src&0x7); if(is_areg) value|=0x8; DWRITEW(value); } -void DYNA_EXT_l(un8 reg) { +void DYNA_EXT_l(un8 reg) +{ DWRITEW(0x48C0|(reg&0x7)); } -void DYNA_BCC_c(un8 cond, int size,int i) { +void DYNA_BCC_c(un8 cond, int size,int i) +{ un32 displace=dynapointer-branchp[i]; - if(!branchp[i]) { + if(!branchp[i]) + { die("Dynarec error! BCC trying to write branch without dummy"); return; } @@ -316,7 +346,8 @@ void DYNA_BCC_c(un8 cond, int size,int i) { die("Dynarec error! BCC invalid displacement"); else if(displace>0&&displace<0x7F) *( (unsigned short *) branchp[i])=0x6000|((cond&0xF)<<8)|(displace&0xFF); - else if(displace>0x7F&&displace<0x7FFF) { + else if(displace>0x7F&&displace<0x7FFF) + { *( (unsigned short *) branchp[i])=0x6000|((cond&0xF)<<8); branchp[i]+=2; *( (unsigned short *) branchp[i])=displace; @@ -327,19 +358,22 @@ void DYNA_BCC_c(un8 cond, int size,int i) { branchp[i]=0; } -void DYNA_DUMMYBRANCH(int size,int i) { +void DYNA_DUMMYBRANCH(int size,int i) +{ branchp[i]=dynapointer; dynapointer+=size; } -void DYNA_TST_l_r(un8 reg,int is_areg) { +void DYNA_TST_l_r(un8 reg,int is_areg) +{ unsigned short opcode=0x4A80|(reg&0x7); if(is_areg) opcode|=0x8; DWRITEW(opcode); } -void DYNA_TST_b_r(un8 reg,int is_areg) { +void DYNA_TST_b_r(un8 reg,int is_areg) +{ unsigned short opcode=0x4A00|(reg&0x7); if(is_areg) opcode|=0x8; @@ -347,33 +381,40 @@ void DYNA_TST_b_r(un8 reg,int is_areg) { } -void DYNA_BTST_l_r(un8 bit, un8 reg) { +void DYNA_BTST_l_r(un8 bit, un8 reg) +{ DWRITEW(0x0800|(reg&0x7)); DWRITEW(bit); } -void DYNA_NEG_l(un8 reg) { +void DYNA_NEG_l(un8 reg) +{ DWRITEW(0x4480|(reg&0x7)); } -void DYNA_XOR_l_r_to_r(un8 src, un8 dest) { +void DYNA_XOR_l_r_to_r(un8 src, un8 dest) +{ DWRITEW(0xB180|((dest&0x7)<<9)|(src&0x7)); } -void DYNA_SET_b_r(un8 src, un8 cond) { +void DYNA_SET_b_r(un8 src, un8 cond) +{ DWRITEW(0x50C0|((cond)&0xF)<<8|(src&0x7)); } -void DYNA_INC_l_r(un8 dest,int is_areg) { +void DYNA_INC_l_r(un8 dest,int is_areg) +{ DYNA_ADDQ_l_i_to_r(1,dest,is_areg); } -void DYNA_DEC_l_r(un8 dest,int is_areg) { +void DYNA_DEC_l_r(un8 dest,int is_areg) +{ DYNA_SUBQ_l_i_to_r(1,dest,is_areg); } -void dynamic_recompile (struct dynarec_block *newblock) { +void dynamic_recompile (struct dynarec_block *newblock) +{ int done=0,writepc=1,fd; byte op; unsigned int oldpc=PC; @@ -385,581 +426,1472 @@ void dynamic_recompile (struct dynarec_block *newblock) { #ifdef DYNA_DEBUG snprintf(meow,499,"/dyna_0x%x_asm.rb",PC); fd=open(meow,O_WRONLY|O_CREAT|O_TRUNC); - if(fd<0) { - die("couldn't open dyna debug file"); + if(fd<0) + { + die("couldn't open dyna debug file"); return; } #endif snprintf(meow,499,"Recompiling 0x%x",oldpc); rb->splash(HZ*1,1,meow); - while(!done) { + while(!done) + { #ifdef DYNA_DEBUG - fdprintf(fd,"0x%x: ",PC); + fdprintf(fd,"0x%x: ",PC); #endif - op=FETCH; - clen = cycles_table[op]; - tclen+=clen; - switch(op) { - case 0x00: /* NOP */ - case 0x40: /* LD B,B */ - case 0x49: /* LD C,C */ - case 0x52: /* LD D,D */ - case 0x5B: /* LD E,E */ - case 0x64: /* LD H,H */ - case 0x6D: /* LD L,L */ - case 0x7F: /* LD A,A */ - break; - - case 0x0B: /* DEC BC* + op=FETCH; + clen = cycles_table[op]; + tclen+=clen; + switch(op) { + case 0x00: /* NOP */ + break; + case 0x01: /* LD BC,imm */ + /* warning (do we have endianness right?) */ +#ifdef DYNA_DEBUG + fdprintf(fd,"LD BC,#0x%x\n",readw(xPC)); +#endif + temp=readw(xPC); + DYNA_MOVEQ_l_i_to_r((temp&0xFF00)>>8,2); + DYNA_MOVEQ_l_i_to_r(temp&0xFF,3); + PC+=2; + break; + case 0x02: /* LD (BC),A */ #ifdef DYNA_DEBUG - fdprintf(fd,"DEC BC\n"); + fdprintf(fd, "LD (BC),A\n"); #endif - DYNA_TST_b_r(3); // test C - DYNA_DUMMYBRANCH(2,0); - DYNA_DEC_l_r(2,0); // dec B - DYNA_BCC_c(0x6,2,0); //jump here if not zero - DYNA_DEC_l_r(3,0); // dec C - break; - case 0x41: /* LD B,C */ + break; /* FIXME: Implement */ + case 0x03: /* INC BC */ #ifdef DYNA_DEBUG - fdprintf(fd,"LD B,C\n"); + fdprintf(fd, "INC BC\n"); #endif - DYNA_MOVE_b_r_to_r(3,2); - break; - case 0x42: /* LD B,D */ + break; /* FIXME: Implement */ + case 0x04: /* INC B */ #ifdef DYNA_DEBUG - fdprintf(fd,"LD B,D\n"); + fdprintf(fd, "INC B\n"); #endif - DYNA_MOVE_b_r_to_r(4,2); - break; - case 0x43: /* LD B,E */ -#ifdef DYNA_DEBUG - fdprintf(fd,"LD B,E\n"); -#endif - DYNA_MOVE_b_r_to_r(5,2); - break; - case 0x44: /* LD B,H */ -#ifdef DYNA_DEBUG - fdprintf(fd,"LD B,H\n"); -#endif - GETUPPER(6,0); - DYNA_MOVE_b_r_to_r(0,2); - break; - case 0x45: /* LD B,L */ -#ifdef DYNA_DEBUG - fdprintf(fd,"LD B,L\n"); -#endif - DYNA_MOVE_b_r_to_r(6,2); - break; - case 0x47: /* LD B,A */ -#ifdef DYNA_DEBUG - fdprintf(fd,"LD B,A\n"); -#endif - DYNA_MOVE_b_r_to_r(1,2); - break; - case 0x48: /* LD C,B */ -#ifdef DYNA_DEBUG - fdprintf(fd,"LD C,B\n"); -#endif - DYNA_MOVE_b_r_to_r(2,3); - break; - case 0x4A: /* LD C,D */ -#ifdef DYNA_DEBUG - fdprintf(fd,"LD C,D\n"); -#endif - DYNA_MOVE_b_r_to_r(4,3); - break; - case 0x4B: /* LD C,E */ -#ifdef DYNA_DEBUG - fdprintf(fd,"LD C,E\n"); -#endif - DYNA_MOVE_b_r_to_r(5,3); - break; - case 0x4C: /* LD C,H */ -#ifdef DYNA_DEBUG - fdprintf(fd,"LD C,H\n"); -#endif - GETUPPER(6,0); - DYNA_MOVE_b_r_to_r(0,3); - break; - case 0x4D: /* LD C,L */ -#ifdef DYNA_DEBUG - fdprintf(fd,"LD C,L\n"); -#endif - DYNA_MOVE_b_r_to_r(6,3); - break; - case 0x4F: /* LD C,A */ -#ifdef DYNA_DEBUG - fdprintf(fd,"LD C,A\n"); -#endif - DYNA_MOVE_b_r_to_r(1,3); - break; - - case 0x50: /* LD D,B */ -#ifdef DYNA_DEBUG - fdprintf(fd,"LD D,B\n"); -#endif - DYNA_MOVE_b_r_to_r(2,4); - break; - case 0x51: /* LD D,C */ -#ifdef DYNA_DEBUG - fdprintf(fd,"LD D,C\n"); -#endif - DYNA_MOVE_b_r_to_r(3,4); - break; - case 0x53: /* LD D,E */ -#ifdef DYNA_DEBUG - fdprintf(fd,"LD D,E\n"); -#endif - DYNA_MOVE_b_r_to_r(5,4); - break; - case 0x54: /* LD D,H */ -#ifdef DYNA_DEBUG - fdprintf(fd,"LD D,H\n"); -#endif - GETUPPER(6,0); - DYNA_MOVE_b_r_to_r(0,4); - break; - case 0x55: /* LD D,L */ -#ifdef DYNA_DEBUG - fdprintf(fd,"LD D,L\n"); -#endif - DYNA_MOVE_b_r_to_r(6,4); - break; - case 0x57: /* LD D,A */ -#ifdef DYNA_DEBUG - fdprintf(fd,"LD D,A\n"); -#endif - DYNA_MOVE_b_r_to_r(1,4); - break; - - case 0x58: /* LD E,B */ -#ifdef DYNA_DEBUG - fdprintf(fd,"LD E,B\n"); -#endif - DYNA_MOVE_b_r_to_r(2,5); - break; - case 0x59: /* LD E,C */ -#ifdef DYNA_DEBUG - fdprintf(fd,"LD E,C\n"); -#endif - DYNA_MOVE_b_r_to_r(3,5); - break; - case 0x5A: /* LD E,D */ -#ifdef DYNA_DEBUG - fdprintf(fd,"LD E,D\n"); -#endif - DYNA_MOVE_b_r_to_r(4,5); - break; - case 0x5C: /* LD E,H */ -#ifdef DYNA_DEBUG - fdprintf(fd,"LD E,H\n"); -#endif - GETUPPER(6,0); - DYNA_MOVE_b_r_to_r(0,5); - break; - case 0x5D: /* LD E,L */ -#ifdef DYNA_DEBUG - fdprintf(fd,"LD E,L\n"); -#endif - DYNA_MOVE_b_r_to_r(6,5); - break; - case 0x5F: /* LD E,A */ -#ifdef DYNA_DEBUG - fdprintf(fd,"LD E,A\n"); -#endif - DYNA_MOVE_b_r_to_r(1,5); - break; - - case 0x60: /* LD H,B */ -#ifdef DYNA_DEBUG - fdprintf(fd,"LD H,B\n"); -#endif - DYNA_MOVE_b_r_to_r(2,0); - PUTUPPER(0,6); - break; - case 0x61: /* LD H,C */ -#ifdef DYNA_DEBUG - fdprintf(fd,"LD H,C\n"); -#endif - DYNA_MOVE_b_r_to_r(3,0); - PUTUPPER(0,6); - break; - case 0x62: /* LD H,D */ -#ifdef DYNA_DEBUG - fdprintf(fd,"LD H,D\n"); -#endif - DYNA_MOVE_b_r_to_r(4,0); - PUTUPPER(0,6); - break; - case 0x63: /* LD H,E */ -#ifdef DYNA_DEBUG - fdprintf(fd,"LD H,E\n"); -#endif - DYNA_MOVE_b_r_to_r(5,0); - PUTUPPER(0,6); - break; - case 0x65: /* LD H,L */ -#ifdef DYNA_DEBUG - fdprintf(fd,"LD H,L\n"); -#endif - DYNA_MOVE_b_r_to_r(6,0); - PUTUPPER(0,6); - break; - case 0x67: /* LD H,A */ -#ifdef DYNA_DEBUG - fdprintf(fd,"LD H,A\n"); -#endif - DYNA_MOVE_b_r_to_r(1,0); - PUTUPPER(0,6); - break; - case 0x68: /* LD L,B */ -#ifdef DYNA_DEBUG - fdprintf(fd,"LD L,B\n"); -#endif - DYNA_MOVE_b_r_to_r(2,6); - break; - case 0x69: /* LD L,C */ -#ifdef DYNA_DEBUG - fdprintf(fd,"LD L,C\n"); -#endif - DYNA_MOVE_b_r_to_r(3,6); - break; - case 0x6A: /* LD L,D */ -#ifdef DYNA_DEBUG - fdprintf(fd,"LD L,D\n"); -#endif - DYNA_MOVE_b_r_to_r(4,6); - break; - case 0x6B: /* LD L,E */ -#ifdef DYNA_DEBUG - fdprintf(fd,"LD L,E\n"); -#endif - DYNA_MOVE_b_r_to_r(5,6); - break; - case 0x6C: /* LD L,H */ -#ifdef DYNA_DEBUG - fdprintf(fd,"LD L,H\n"); -#endif - GETUPPER(6,0); - DYNA_MOVE_b_r_to_r(0,6); - break; - - case 0x78: /* LD A,B */ -#ifdef DYNA_DEBUG - fdprintf(fd,"LD A,B\n"); -#endif - DYNA_MOVE_b_r_to_r(2,1); - break; - case 0x79: /* LD A,C */ -#ifdef DYNA_DEBUG - fdprintf(fd,"LD A,C\n"); -#endif - DYNA_MOVE_b_r_to_r(3,1); - break; - case 0x7A: /* LD A,D */ -#ifdef DYNA_DEBUG - fdprintf(fd,"LD A,D\n"); -#endif - DYNA_MOVE_b_r_to_r(4,1); - break; - case 0x7B: /* LD A,E */ -#ifdef DYNA_DEBUG - fdprintf(fd,"LD A,E\n"); -#endif - DYNA_MOVE_b_r_to_r(5,1); - break; - case 0x7C: /* LD A,H */ -#ifdef DYNA_DEBUG - fdprintf(fd,"LD A,H\n"); -#endif - GETUPPER(5,0); - DYNA_MOVE_b_r_to_r(0,1); - break; - case 0x7D: /* LD A,L */ -#ifdef DYNA_DEBUG - fdprintf(fd,"LD A,L\n"); -#endif - DYNA_MOVE_b_r_to_r(5,1); - break; - case 0x01: /* LD BC,imm */ - { /* warning (do we have endianness right?) */ -#ifdef DYNA_DEBUG - fdprintf(fd,"LD BC,#0x%x\n",readw(xPC)); -#endif - temp=readw(xPC); - DYNA_MOVEQ_l_i_to_r((temp&0xFF00)>>8,2); - DYNA_MOVEQ_l_i_to_r(temp&0xFF,3); - PC+=2; - } - break; - case 0x11: /* LD DE,imm */ - { + DYNA_INC_l_r(2,0); /* Is this right? */ + break; + case 0x05: /* DEC B */ #ifdef DYNA_DEBUG - fdprintf(fd,"LD DE,#0x%x\n",readw(xPC)); + fdprintf(fd, "DEC B\n"); #endif - temp=readw(xPC); - DYNA_MOVEQ_l_i_to_r((temp&0xFF00)>>8,4); - DYNA_MOVEQ_l_i_to_r(temp&0xFF,5); - PC += 2; - } - break; - case 0x21: /* LD HL,imm */ - { -#ifdef DYNA_DEBUG - fdprintf(fd,"LD HL,#0x%x\n",readw(xPC)); + DYNA_DEC_l_r(2,0); /* Is this right? */ + break; + case 0x06: /* LD B,imm */ +#ifdef DYNA_DEBUG + fdprintf(fd,"LD B,#0x%x\n",readb(xPC)); #endif - DYNA_MOVE_l_i_to_r(readw(xPC),6); - PC += 2; - } - break; - case 0x22: /* LDI (HL), A */ + DYNA_MOVEQ_l_i_to_r(FETCH,2); + break; + case 0x07: /* RLCA */ #ifdef DYNA_DEBUG - fdprintf(fd,"LDI (HL),A\n"); + fdprintf(fd, "RLCA\n"); +#endif + break; /* FIXME: Implement */ + case 0x08: /* LD imm,SP */ +#ifdef DYNA_DEBUG + fdprintf(fd, "LD imm,SP\n"); +#endif + break; /* FIXME: Implement */ + case 0x09: /* ADD HL,BC */ +#ifdef DYNA_DEBUG + fdprintf(fd, "ADD HL,BC\n"); +#endif + break; /* FIXME: Implement */ + case 0x0A: /* LD A,(BC) */ +#ifdef DYNA_DEBUG + fdprintf(fd, "LD A,(BC)\n"); +#endif + break; /* FIXME: Implement */ + case 0x0B: /* DEC BC */ +#ifdef DYNA_DEBUG + fdprintf(fd,"DEC BC\n"); +#endif + DYNA_TST_b_r(3,0); /* test C */ + DYNA_DUMMYBRANCH(2,0); + DYNA_DEC_l_r(2,0); /* dec B */ + DYNA_BCC_c(0x6,2,0); /* jump here if not zero */ + DYNA_DEC_l_r(3,0); /* dec C */ + break; + case 0x0C: /* INC C */ +#ifdef DYNA_DEBUG + fdprintf(fd, "INC C\n"); +#endif + DYNA_INC_l_r(3,0); /* Is this right? */ + break; + case 0x0D: /* DEC C */ +#ifdef DYNA_DEBUG + fdprintf(fd, "DEC C\n"); +#endif + DYNA_DEC_l_r(3,0); /* Is this right? */ + break; + case 0x0E: /* LD C,imm */ +#ifdef DYNA_DEBUG + fdprintf(fd,"LD C,#0x%x\n",readb(xPC)); +#endif + DYNA_MOVEQ_l_i_to_r(FETCH,3); + break; + case 0x0F: /* RRCA */ +#ifdef DYNA_DEBUG + fdprintf(fd, "RRCA\n"); +#endif + break; /* FIXME: Implement */ + case 0x10: /* STOP */ +#ifdef DYNA_DEBUG + fdprintf(fd, "STOP\n"); +#endif + break; /* FIXME: Implement */ + case 0x11: /* LD DE,imm */ +#ifdef DYNA_DEBUG + fdprintf(fd,"LD DE,#0x%x\n",readw(xPC)); +#endif + temp=readw(xPC); + DYNA_MOVEQ_l_i_to_r((temp&0xFF00)>>8,4); + DYNA_MOVEQ_l_i_to_r(temp&0xFF,5); + PC += 2; + break; + case 0x12: /* LD (DE),A */ +#ifdef DYNA_DEBUG + fdprintf(fd, "LD (DE),A\n"); +#endif + break; /* FIXME: Implement */ + case 0x13: /* INC DE */ +#ifdef DYNA_DEBUG + fdprintf(fd, "INC DE\n"); +#endif + break; /* FIXME: Implement */ + case 0x14: /* INC D */ +#ifdef DYNA_DEBUG + fdprintf(fd, "INC D\n"); +#endif + DYNA_INC_l_r(4,0); /* Is this right? */ + break; + case 0x15: /* DEC D */ +#ifdef DYNA_DEBUG + fdprintf(fd, "DEC D\n"); +#endif + DYNA_DEC_l_r(4,0); /* Is this right? */ + break; + case 0x16: /* LD D,imm */ +#ifdef DYNA_DEBUG + fdprintf(fd,"LD D,#0x%x\n",readb(xPC)); +#endif + DYNA_MOVEQ_l_i_to_r(FETCH,4); + break; + case 0x17: /* RLA */ +#ifdef DYNA_DEBUG + fdprintf(fd, "RLA\n"); +#endif + break; /* FIXME: Implement */ + case 0x18: /* JR */ +#ifdef DYNA_DEBUG + fdprintf(fd, "JR\n"); +#endif + break; /* FIXME: Implement */ + case 0x19: /* ADD HL,DE */ +#ifdef DYNA_DEBUG + fdprintf(fd, "ADD HL,DE\n"); +#endif + break; /* FIXME: Implement */ + case 0x1A: /* LD A,(DE) */ +#ifdef DYNA_DEBUG + fdprintf(fd, "LD A,(DE)\n"); +#endif + break; /* FIXME: Implement */ + case 0x1B: /* DEC DE */ +#ifdef DYNA_DEBUG + fdprintf(fd,"DEC DE\n"); +#endif + DYNA_TST_b_r(5,0); /* test E */ + DYNA_DUMMYBRANCH(4,0); + DYNA_DEC_l_r(4,0); /* dec D */ + DYNA_BCC_c(0x6,4,0); /* jump here if not zero */ + DYNA_DEC_l_r(5,0); /* dec E */ + break; + case 0x1C: /* INC E */ +#ifdef DYNA_DEBUG + fdprintf(fd, "INC E\n"); +#endif + DYNA_INC_l_r(5,0); /* Is this right? */ + break; + case 0x1D: /* DEC E */ +#ifdef DYNA_DEBUG + fdprintf(fd, "DEC E\n"); +#endif + DYNA_DEC_l_r(5,0); /* Is this right? */ + break; + case 0x1E: /* LD E,imm */ +#ifdef DYNA_DEBUG + fdprintf(fd,"LD E,#0x%x\n",readb(xPC)); +#endif + DYNA_MOVEQ_l_i_to_r(FETCH,5); + break; + case 0x1F: /* RRA */ +#ifdef DYNA_DEBUG + fdprintf(fd, "RRA\n"); +#endif + break; /* FIXME: Implement */ + case 0x20: /* JR NZ */ +#ifdef DYNA_DEBUG + fdprintf(fd,"JR NZ\n"); +#endif + DYNA_BTST_l_r(8,7); /* btst #8,d7 */ + DYNA_DUMMYBRANCH(2,0); + DYNA_MOVEA_l_i_to_r(&blockclen,3); + DYNA_MOVE_l_i_to_m(tclen,3); + DYNA_MOVEA_l_i_to_r(PC+1+(signed char)readb(PC),1); + DYNA_RET(); + DYNA_BCC_c(0x6,2,0); /* jump here if bit is not zero */ + tclen--; + PC++; + break; + case 0x21: /* LD HL,imm */ +#ifdef DYNA_DEBUG + fdprintf(fd,"LD HL,#0x%x\n",readw(xPC)); +#endif + DYNA_MOVE_l_i_to_r(readw(xPC),6); + PC += 2; + break; + case 0x22: /* LDI (HL), A */ +#ifdef DYNA_DEBUG + fdprintf(fd,"LDI (HL),A\n"); #endif /* DYNA_PUSH_l_r(1,0); - DYNA_PUSH_l_r(6,0); - CALL_NATIVE(&writeb); - DYNA_ADDQ_l_i_to_r(0,7,1); - DYNA_INC_l_r(6,0);*/ - break; - case 0x31: /* LD SP,imm */ + DYNA_PUSH_l_r(6,0); + CALL_NATIVE(&writeb); + DYNA_ADDQ_l_i_to_r(0,7,1); + DYNA_INC_l_r(6,0);*/ + break; + case 0x23: /* INC HL */ #ifdef DYNA_DEBUG - fdprintf(fd,"LD SP,#0x%x\n",readw(xPC)); + fdprintf(fd, "INC HL\n"); #endif - DYNA_MOVEA_l_i_to_r(readw(xPC),0); - PC += 2; - break; - - case 0x06: /* LD B,imm */ -#ifdef DYNA_DEBUG - fdprintf(fd,"LD B,#0x%x\n",readb(xPC)); -#endif - DYNA_MOVEQ_l_i_to_r(FETCH,2); - break; - case 0x0E: /* LD C,imm */ -#ifdef DYNA_DEBUG - fdprintf(fd,"LD C,#0x%x\n",readb(xPC)); -#endif - DYNA_MOVEQ_l_i_to_r(FETCH,3); - break; - case 0x16: /* LD D,imm */ -#ifdef DYNA_DEBUG - fdprintf(fd,"LD D,#0x%x\n",readb(xPC)); -#endif - DYNA_MOVEQ_l_i_to_r(FETCH,4); - break; - case 0x1E: /* LD E,imm */ -#ifdef DYNA_DEBUG - fdprintf(fd,"LD E,#0x%x\n",readb(xPC)); -#endif - DYNA_MOVEQ_l_i_to_r(FETCH,5); - break; - case 0x26: /* LD H,imm */ -#ifdef DYNA_DEBUG - fdprintf(fd,"LD H,#0x%x\n",readb(xPC)); -#endif - DYNA_AND_l_i_to_r(0xFF,6); - DYNA_OR_l_i_to_r(FETCH<<8,6); - break; - case 0x2E: /* LD L,imm */ -#ifdef DYNA_DEBUG - fdprintf(fd,"LD L,#0x%x\n",readb(xPC)); -#endif - DYNA_AND_l_i_to_r(0xFF00,6); - DYNA_OR_l_i_to_r(FETCH,6); - break; - case 0x3E: /* LD A,imm */ -#ifdef DYNA_DEBUG - fdprintf(fd,"LD A,#0x%x\n",readb(xPC)); -#endif - DYNA_MOVEQ_l_i_to_r(FETCH,1); - break; - - case 0xF9: /* LD SP,HL */ -#ifdef DYNA_DEBUG - fdprintf(fd,"LD SP,HL\n"); -#endif - DYNA_MOVEA_w_r_to_r(6,0,0); - break; - case 0xF3: /* DI */ + break; /* FIXME: Implement */ + case 0x24: /* INC H */ #ifdef DYNA_DEBUG - fdprintf(fd,"DI\n"); + fdprintf(fd, "INC H\n"); #endif - DYNA_CLR_l_m(&cpu.ime); - DYNA_CLR_l_m(&cpu.ima); - DYNA_CLR_l_m(&cpu.halt); - /* cpu.halt = cpu.ima = cpu.ime = 0; */ - break; - case 0xFB: /* EI */ -#ifdef DYNA_DEBUG - fdprintf(fd,"EI\n"); -#endif - DYNA_MOVEQ_l_i_to_r(1,0); - DYNA_MOVEA_l_i_to_r(&cpu.ima,3); - DYNA_MOVE_l_r_to_m(0,3); - /*cpu.ima=1; */ - break; - - case 0xE0: /* LDH (imm),A */ -#ifdef DYNA_DEBUG - fdprintf(fd,"LD (0x%x),A\n",readb(xPC)); -#endif - DYNA_PUSH_l_r(1,0); - DYNA_PEA_w_i(FETCH); - CALL_NATIVE(&writehi); - DYNA_ADDQ_l_i_to_r(0,7,1); - /*writehi(FETCH, A); */ - break; - - case 0xC3: /* JP (imm) PC = readw(PC) */ -#ifdef DYNA_DEBUG - fdprintf(fd,"JP (0x%x)\n",readw(xPC)); -#endif - PC=readw(PC); - done=1; - break; - case 0xCD: /* CALL (imm) PUSH(PC+2) PC=readw(PC); */ + break; /* FIXME: Implement */ + case 0x25: /* DEC H */ #ifdef DYNA_DEBUG - fdprintf(fd,"CALL (0x%x)\n",readw(xPC)); + fdprintf(fd, "DEC H\n"); #endif - PUSH(PC+2); - PC=readw(PC); - done=1; - break; - - case 0x97: /* SUB A (halfcarry ?) */ + break; /* FIXME: Implement */ + case 0x26: /* LD H,imm */ +#ifdef DYNA_DEBUG + fdprintf(fd,"LD H,#0x%x\n",readb(xPC)); +#endif + DYNA_AND_l_i_to_r(0xFF,6); + DYNA_OR_l_i_to_r(FETCH<<8,6); + break; + case 0x27: /* DAA */ #ifdef DYNA_DEBUG - fdprintf(fd,"SUB A\n"); + fdprintf(fd, "DAA\n"); #endif - DYNA_CLR_l_r(1); - DYNA_MOVEQ_l_i_to_r(0xC0,7); - break; - case 0xF0: /* LDH A,(imm) */ + break; /* FIXME: Implement */ + case 0x28: /* JR Z */ #ifdef DYNA_DEBUG - fdprintf(fd,"LDH A,(0x%x)\n",readb(xPC)); + fdprintf(fd, "JR Z\n"); #endif - DYNA_PEA_w_i(FETCH); - CALL_NATIVE(&readhi); - DYNA_ADDQ_l_i_to_r(4,7,1); - DYNA_MOVE_b_r_to_r(0,1); - /*A = readhi(FETCH)*/ - break; - case 0x87: // ADD A,A + break; /* FIXME: Implement */ + case 0x29: /* ADD HL, HL */ #ifdef DYNA_DEBUG - fdprintf(fd,"ADD A,A\n"); + fdprintf(fd, "ADD HL,HL\n"); #endif - /* code taken from gcc -O3 output by compiling; - * c=(2*b)&0xFF; - * a=(c) ? 0 : 0x80 | // zero flag - * (0x20 & (c) << 1) | // halfcarry - * ((2*b)&0x100)>>4; // carry - */ - DYNA_MOVE_l_r_to_r(1,0,0); /* move.l d1, d0 */ - DYNA_ADD_l_r_to_r(0,0,0); /* add.l d0, d0 */ - DYNA_AND_l_i_to_r(510,0); /* and.l #510, d0 */ - DYNA_MOVEA_l_r_to_r(0,3,0); /* movea.l d0,a3 */ - DYNA_CLR_b_r(7); /* clr.b d7 */ - DYNA_TST_b_r(0,0); /* tst.b d0 */ - DYNA_DUMMYBRANCH(2,0); - DYNA_MOVE_l_r_to_r(1,0,0); /* move.l d1,d0 */ - DYNA_LSHIFT_l(3,0,0,0); /* lsr.l #3, d0 */ - DYNA_MOVEQ_l_i_to_r(16,1); /* moveq #16,d1 */ - DYNA_AND_l_r_to_r(1,0); /* and.l d1 d0 */ - DYNA_MOVEQ_l_i_to_r(0x80,7); /* moveq #0x80,d7 */ - DYNA_OR_l_r_to_r(0,7); /* or.l d0, d7 */ - DYNA_BCC_c(0x6,2,0); /* branch not equal, here */ - DYNA_MOVE_l_r_to_r(3,1,1); /* move.l a3,d1 */ - DYNA_AND_l_i_to_r(0xFE,1); /* and.l #0xFE,d1 */ - DYNA_AND_l_i_to_r(0xB0,7); /* and.l #0xB0,d7 */ - break; - case 0xD0: /* RET NC */ -#ifdef DYNA_DEBUG - fdprintf(fd,"RET NC\n"); -#endif - DYNA_BTST_l_r(5,7); /* btst #5,d7 */ - DYNA_DUMMYBRANCH(2,0); - POPA(1); /* POP %a1 */ - DYNA_MOVEA_l_i_to_r(&blockclen,3); - DYNA_MOVE_l_i_to_m(tclen,3); - DYNA_RET(); - DYNA_BCC_c(0x6,2,0); /* jump here if bit is not zero */ - tclen-=3; - break; - case 0xC9: /* RET */ -#ifdef DYNA_DEBUG - fdprintf(fd,"RET\n"); -#endif - POPA(1); - writepc=0; - done=1; - break; - case 0x20: /* JR NZ */ -#ifdef DYNA_DEBUG - fdprintf(fd,"JR NZ\n"); -#endif - DYNA_BTST_l_r(8,7); /* btst #8,d7 */ - DYNA_DUMMYBRANCH(2,0); - DYNA_MOVEA_l_i_to_r(&blockclen,3); - DYNA_MOVE_l_i_to_m(tclen,3); - DYNA_MOVEA_l_i_to_r(PC+1+(signed char)readb(PC),1); - DYNA_RET(); - DYNA_BCC_c(0x6,2,0); /* jump here if bit is not zero */ - tclen--; - PC++; - break; - case 0xC2: /* JP NZ */ -#ifdef DYNA_DEBUG - fdprintf(fd,"JP NZ\n"); -#endif - DYNA_BTST_l_r(8,7); /* btst #8,d7 */ - DYNA_DUMMYBRANCH(2,0); - DYNA_MOVEA_l_i_to_r(&blockclen,3); - DYNA_MOVE_l_i_to_m(tclen,3); - DYNA_MOVEA_l_i_to_r(readw(PC),1); - DYNA_RET(); - DYNA_BCC_c(0x6,2,0); /* jump here if bit is not zero */ - tclen--; - PC+=2; - break; -/* case 0xFA: /* LD A, (imm) -#ifdef DYNA_DEBUG - fdprintf(fd,"LD A,(0x%x)\n",readw(xPC)); -#endif - DYNA_PEA_w_i(readw(xPC)); - PC+=2; \ - CALL_NATIVE(&readb); \ - DYNA_ADDQ_l_i_to_r(4,7,1); \ - DYNA_MOVE_l_r_to_r(0,1,0); - break; */ - - case 0xFE: /* CMP # TODO: can be (much) more efficient.*/ + break; /* FIXME: Implement */ + case 0x2A: /* LD A,(HLI) */ #ifdef DYNA_DEBUG - fdprintf(fd,"CMP #0x%x\n",readb(xPC)); + fdprintf(fd, "LD A,(HLI)\n"); #endif - DYNA_MOVEA_l_r_to_r(2,3,0); /* movea.l %d2, %a3 */ - DYNA_MOVEQ_l_i_to_r(FETCH,2); /* moveq.l #,%d2 */ - CMP(2); - DYNA_MOVE_l_r_to_r(3,2,1); /* move.l %a3, %d2 */ - break; - - case 0xB1: /* OR C */ + break; /* FIXME: Implement */ + case 0x2B: /* DEC HL */ +#ifdef DYNA_DEBUG + fdprintf(fd, "DEC HL\n"); +#endif + break; /* FIXME: Implement */ + case 0x2C: /* INC L */ +#ifdef DYNA_DEBUG + fdprintf(fd, "INC L\n"); +#endif + break; /* FIXME: Implement */ + case 0x2D: /* DEC L */ +#ifdef DYNA_DEBUG + fdprintf(fd, "DEC L\n"); +#endif + break; /* FIXME: Implement */ + case 0x2E: /* LD L,imm */ #ifdef DYNA_DEBUG - fdprintf(fd,"OR C\n"); + fdprintf(fd,"LD L,#0x%x\n",readb(xPC)); #endif - DYNA_OR_l_r_to_r(3,1); // or %d3,%d1 - DYNA_MOVEQ_l_i_to_r(0,7); - DYNA_TST_b_r(1,0); - DYNA_DUMMYBRANCH(2,0); - DYNA_MOVEQ_l_i_to_r(0x80,7); - DYNA_BCC_c(0x6,2,0); - break; - default: - snprintf(meow,499,"unimplemented opcode %d / 0x%x",op,op); - die(meow); - return; - break; - } + DYNA_AND_l_i_to_r(0xFF00,6); + DYNA_OR_l_i_to_r(FETCH,6); + break; + case 0x2F: /* CPL */ +#ifdef DYNA_DEBUG + fdprintf(fd, "CPL\n"); +#endif + break; /* FIXME: Implement */ + case 0x30: /* JR NC */ +#ifdef DYNA_DEBUG + fdprintf(fd, "JR NC\n"); +#endif + break; /* FIXME: Implement */ + case 0x31: /* LD SP,imm */ +#ifdef DYNA_DEBUG + fdprintf(fd,"LD SP,#0x%x\n",readw(xPC)); +#endif + DYNA_MOVEA_l_i_to_r(readw(xPC),0); + PC += 2; + break; + case 0x32: /* LD (HLD),A */ +#ifdef DYNA_DEBUG + fdprintf(fd, "LD (HLD),A\n"); +#endif + break; /* FIXME: Implement */ + case 0x33: /* INC SP */ +#ifdef DYNA_DEBUG + fdprintf(fd, "INC SP\n"); +#endif + break; /* FIXME: Implement */ + case 0x34: /* INC (HL) */ +#ifdef DYNA_DEBUG + fdprintf(fd, "INC (HL)\n"); +#endif + break; /* FIXME: Implement */ + case 0x35: /* DEC (HL) */ +#ifdef DYNA_DEBUG + fdprintf(fd, "DEC (HL)\n"); +#endif + break; /* FIXME: Implement */ + case 0x36: /* LD (HD),imm */ +#ifdef DYNA_DEBUG + fdprintf(fd, "LD (HD),imm\n"); +#endif + break; /* FIXME: Implement */ + case 0x37: /* SCF */ +#ifdef DYNA_DEBUG + fdprintf(fd, "SCF\n"); +#endif + break; /* FIXME: Implement */ + case 0x38: /* JR C */ +#ifdef DYNA_DEBUG + fdprintf(fd, "JR C\n"); +#endif + break; /* FIXME: Implement */ + case 0x39: /* ADD HL,SP */ +#ifdef DYNA_DEBUG + fdprintf(fd, "ADD HL,SP\n"); +#endif + break; /* FIXME: Implement */ + case 0x3A: /* LD A,(HLD) */ +#ifdef DYNA_DEBUG + fdprintf(fd, "LD A,(HLD)\n"); +#endif + break; /* FIXME: Implement */ + case 0x3B: /* DEC SP */ +#ifdef DYNA_DEBUG + fdprintf(fd, "DEC SP\n"); +#endif + break; /* FIXME: Implement */ + case 0x3C: /* INC A */ +#ifdef DYNA_DEBUG + fdprintf(fd, "INC A"); +#endif + DYNA_INC_l_r(1,0); /* Is this right? */ + break; + case 0x3D: /* DEC A */ +#ifdef DYNA_DEBUG + fdprintf(fd, "DEC A"); +#endif + DYNA_DEC_l_r(1,0); /* Is this right? */ + break; + case 0x3E: /* LD A,imm */ +#ifdef DYNA_DEBUG + fdprintf(fd,"LD A,#0x%x\n",readb(xPC)); +#endif + DYNA_MOVEQ_l_i_to_r(FETCH,1); + break; + case 0x3F: /* CCF */ +#ifdef DYNA_DEBUG + fdprintf(fd, "CCF\n"); +#endif + break; /* FIXME: Implement */ + case 0x40: /* LD B,B */ +#ifdef DYNA_DEBUG + fdprintf(fd, "LD B,B\n"); +#endif + break; + case 0x41: /* LD B,C */ +#ifdef DYNA_DEBUG + fdprintf(fd,"LD B,C\n"); +#endif + DYNA_MOVE_b_r_to_r(3,2); + break; + case 0x42: /* LD B,D */ +#ifdef DYNA_DEBUG + fdprintf(fd,"LD B,D\n"); +#endif + DYNA_MOVE_b_r_to_r(4,2); + break; + case 0x43: /* LD B,E */ +#ifdef DYNA_DEBUG + fdprintf(fd,"LD B,E\n"); +#endif + DYNA_MOVE_b_r_to_r(5,2); + break; + case 0x44: /* LD B,H */ +#ifdef DYNA_DEBUG + fdprintf(fd,"LD B,H\n"); +#endif + GETUPPER(6,0); + DYNA_MOVE_b_r_to_r(0,2); + break; + case 0x45: /* LD B,L */ +#ifdef DYNA_DEBUG + fdprintf(fd,"LD B,L\n"); +#endif + DYNA_MOVE_b_r_to_r(6,2); + break; + case 0x46: /* LD B,(HL) */ +#ifdef DYNA_DEBUG + fdprintf(fd, "LD B,(HL)\n"); +#endif + break; /* FIXME: Implement */ + case 0x47: /* LD B,A */ +#ifdef DYNA_DEBUG + fdprintf(fd,"LD B,A\n"); +#endif + DYNA_MOVE_b_r_to_r(1,2); + break; + case 0x48: /* LD C,B */ +#ifdef DYNA_DEBUG + fdprintf(fd,"LD C,B\n"); +#endif + DYNA_MOVE_b_r_to_r(2,3); + break; + case 0x49: /* LD C,C */ + break; + case 0x4A: /* LD C,D */ +#ifdef DYNA_DEBUG + fdprintf(fd,"LD C,D\n"); +#endif + DYNA_MOVE_b_r_to_r(4,3); + break; + case 0x4B: /* LD C,E */ +#ifdef DYNA_DEBUG + fdprintf(fd,"LD C,E\n"); +#endif + DYNA_MOVE_b_r_to_r(5,3); + break; + case 0x4C: /* LD C,H */ +#ifdef DYNA_DEBUG + fdprintf(fd,"LD C,H\n"); +#endif + GETUPPER(6,0); + DYNA_MOVE_b_r_to_r(0,3); + break; + case 0x4D: /* LD C,L */ +#ifdef DYNA_DEBUG + fdprintf(fd,"LD C,L\n"); +#endif + DYNA_MOVE_b_r_to_r(6,3); + break; + case 0x4E: /* LD C,(HL) */ +#ifdef DYNA_DEBUG + fdprintf(fd, "LD C,(HL)\n"); +#endif + break; /* FIXME: Implement */ + case 0x4F: /* LD C,A */ +#ifdef DYNA_DEBUG + fdprintf(fd,"LD C,A\n"); +#endif + DYNA_MOVE_b_r_to_r(1,3); + break; + case 0x50: /* LD D,B */ +#ifdef DYNA_DEBUG + fdprintf(fd,"LD D,B\n"); +#endif + DYNA_MOVE_b_r_to_r(2,4); + break; + case 0x51: /* LD D,C */ +#ifdef DYNA_DEBUG + fdprintf(fd,"LD D,C\n"); +#endif + DYNA_MOVE_b_r_to_r(3,4); + break; + case 0x52: /* LD D,D */ + break; + case 0x53: /* LD D,E */ +#ifdef DYNA_DEBUG + fdprintf(fd,"LD D,E\n"); +#endif + DYNA_MOVE_b_r_to_r(5,4); + break; + case 0x54: /* LD D,H */ +#ifdef DYNA_DEBUG + fdprintf(fd,"LD D,H\n"); +#endif + GETUPPER(6,0); + DYNA_MOVE_b_r_to_r(0,4); + break; + case 0x55: /* LD D,L */ +#ifdef DYNA_DEBUG + fdprintf(fd,"LD D,L\n"); +#endif + DYNA_MOVE_b_r_to_r(6,4); + break; + case 0x56: /* LD D,(HL) */ +#ifdef DYNA_DEBUG + fdprintf(fd, "LD D,(HL)\n"); +#endif + break; /* FIXME: Implement */ + case 0x57: /* LD D,A */ +#ifdef DYNA_DEBUG + fdprintf(fd,"LD D,A\n"); +#endif + DYNA_MOVE_b_r_to_r(1,4); + break; + case 0x58: /* LD E,B */ +#ifdef DYNA_DEBUG + fdprintf(fd,"LD E,B\n"); +#endif + DYNA_MOVE_b_r_to_r(2,5); + break; + case 0x59: /* LD E,C */ +#ifdef DYNA_DEBUG + fdprintf(fd,"LD E,C\n"); +#endif + DYNA_MOVE_b_r_to_r(3,5); + break; + case 0x5A: /* LD E,D */ +#ifdef DYNA_DEBUG + fdprintf(fd,"LD E,D\n"); +#endif + DYNA_MOVE_b_r_to_r(4,5); + break; + case 0x5B: /* LD E,E */ + break; + case 0x5C: /* LD E,H */ +#ifdef DYNA_DEBUG + fdprintf(fd,"LD E,H\n"); +#endif + GETUPPER(6,0); + DYNA_MOVE_b_r_to_r(0,5); + break; + case 0x5D: /* LD E,L */ +#ifdef DYNA_DEBUG + fdprintf(fd,"LD E,L\n"); +#endif + DYNA_MOVE_b_r_to_r(6,5); + break; + case 0x5E: /* LD E,(HL) */ +#ifdef DYNA_DEBUG + fdprintf(fd, "LD E,(HL)\n"); +#endif + break; /* FIXME: Implement */ + case 0x5F: /* LD E,A */ +#ifdef DYNA_DEBUG + fdprintf(fd,"LD E,A\n"); +#endif + DYNA_MOVE_b_r_to_r(1,5); + break; + case 0x60: /* LD H,B */ +#ifdef DYNA_DEBUG + fdprintf(fd,"LD H,B\n"); +#endif + DYNA_MOVE_b_r_to_r(2,0); + PUTUPPER(0,6); + break; + case 0x61: /* LD H,C */ +#ifdef DYNA_DEBUG + fdprintf(fd,"LD H,C\n"); +#endif + DYNA_MOVE_b_r_to_r(3,0); + PUTUPPER(0,6); + break; + case 0x62: /* LD H,D */ +#ifdef DYNA_DEBUG + fdprintf(fd,"LD H,D\n"); +#endif + DYNA_MOVE_b_r_to_r(4,0); + PUTUPPER(0,6); + break; + case 0x63: /* LD H,E */ +#ifdef DYNA_DEBUG + fdprintf(fd,"LD H,E\n"); +#endif + DYNA_MOVE_b_r_to_r(5,0); + PUTUPPER(0,6); + break; + case 0x64: /* LD H,H */ + break; + case 0x65: /* LD H,L */ +#ifdef DYNA_DEBUG + fdprintf(fd,"LD H,L\n"); +#endif + DYNA_MOVE_b_r_to_r(6,0); + PUTUPPER(0,6); + break; + case 0x66: /* LD H,(HL) */ +#ifdef DYNA_DEBUG + fdprintf(fd, "LD H,(HL)\n"); +#endif + break; /* FIXME: Implement */ + case 0x67: /* LD H,A */ +#ifdef DYNA_DEBUG + fdprintf(fd,"LD H,A\n"); +#endif + DYNA_MOVE_b_r_to_r(1,0); + PUTUPPER(0,6); + break; + case 0x68: /* LD L,B */ +#ifdef DYNA_DEBUG + fdprintf(fd,"LD L,B\n"); +#endif + DYNA_MOVE_b_r_to_r(2,6); + break; + case 0x69: /* LD L,C */ +#ifdef DYNA_DEBUG + fdprintf(fd,"LD L,C\n"); +#endif + DYNA_MOVE_b_r_to_r(3,6); + break; + case 0x6A: /* LD L,D */ +#ifdef DYNA_DEBUG + fdprintf(fd,"LD L,D\n"); +#endif + DYNA_MOVE_b_r_to_r(4,6); + break; + case 0x6B: /* LD L,E */ +#ifdef DYNA_DEBUG + fdprintf(fd,"LD L,E\n"); +#endif + DYNA_MOVE_b_r_to_r(5,6); + break; + case 0x6C: /* LD L,H */ +#ifdef DYNA_DEBUG + fdprintf(fd,"LD L,H\n"); +#endif + GETUPPER(6,0); + DYNA_MOVE_b_r_to_r(0,6); + break; + case 0x6D: /* LD L,L */ + break; + case 0x6E: /* LD L,(HL) */ +#ifdef DYNA_DEBUG + fdprintf(fd, "LD L,(HL)\n"); +#endif + break; /* FIXME: Implement */ + case 0x6F: /* LD L,A */ +#ifdef DYNA_DEBUG + fdprintf(fd, "LD L,A\n"); +#endif + break; /* FIXME: Implement */ + case 0x70: /* LD (HL),B */ +#ifdef DYNA_DEBUG + fdprintf(fd, "LD (HL),B\n"); +#endif + break; /* FIXME: Implement */ + case 0x71: /* LD (HL),C */ +#ifdef DYNA_DEBUG + fdprintf(fd, "LD (HL),C\n"); +#endif + break; /* FIXME: Implement */ + case 0x72: /* LD (HL),D */ +#ifdef DYNA_DEBUG + fdprintf(fd, "LD (HL),D\n"); +#endif + break; /* FIXME: Implement */ + case 0x73: /* LD (HL),E */ +#ifdef DYNA_DEBUG + fdprintf(fd, "LD (HL),E\n"); +#endif + break; /* FIXME: Implement */ + case 0x74: /* LD (HL),H */ +#ifdef DYNA_DEBUG + fdprintf(fd, "LD (HL),H\n"); +#endif + break; /* FIXME: Implement */ + case 0x75: /* LD (HL),L */ +#ifdef DYNA_DEBUG + fdprintf(fd, "LD (HL),L\n"); +#endif + break; /* FIXME: Implement */ + case 0x76: /* HALT */ +#ifdef DYNA_DEBUG + fdprintf(fd, "HALT\n"); +#endif + break; /* FIXME: Implement */ + case 0x77: /* LD (HL),A */ +#ifdef DYNA_DEBUG + fdprintf(fd, "LD (HL),A\n"); +#endif + break; /* FIXME: Implement */ + case 0x78: /* LD A,B */ +#ifdef DYNA_DEBUG + fdprintf(fd,"LD A,B\n"); +#endif + DYNA_MOVE_b_r_to_r(2,1); + break; + case 0x79: /* LD A,C */ +#ifdef DYNA_DEBUG + fdprintf(fd,"LD A,C\n"); +#endif + DYNA_MOVE_b_r_to_r(3,1); + break; + case 0x7A: /* LD A,D */ +#ifdef DYNA_DEBUG + fdprintf(fd,"LD A,D\n"); +#endif + DYNA_MOVE_b_r_to_r(4,1); + break; + case 0x7B: /* LD A,E */ +#ifdef DYNA_DEBUG + fdprintf(fd,"LD A,E\n"); +#endif + DYNA_MOVE_b_r_to_r(5,1); + break; + case 0x7C: /* LD A,H */ +#ifdef DYNA_DEBUG + fdprintf(fd,"LD A,H\n"); +#endif + GETUPPER(5,0); + DYNA_MOVE_b_r_to_r(0,1); + break; + case 0x7D: /* LD A,L */ +#ifdef DYNA_DEBUG + fdprintf(fd,"LD A,L\n"); +#endif + DYNA_MOVE_b_r_to_r(5,1); + break; + case 0x7E: /* LD A,HL */ +#ifdef DYNA_DEBUG + fdprintf(fd, "LD A,HL\n"); +#endif + break; /* FIXME: Implement */ + case 0x7F: /* LD A,A */ + break; + case 0x80: /* ADD A,B */ +#ifdef DYNA_DEBUG + fdprintf(fd, "ADD A,B\n"); +#endif + break; /* FIXME: Implement */ + case 0x81: /* ADD A,C */ +#ifdef DYNA_DEBUG + fdprintf(fd, "ADD A,C\n"); +#endif + break; /* FIXME: Implement */ + case 0x82: /* ADD A,D */ +#ifdef DYNA_DEBUG + fdprintf(fd, "ADD A,D\n"); +#endif + break; /* FIXME: Implement */ + case 0x83: /* ADD A,E */ +#ifdef DYNA_DEBUG + fdprintf(fd, "ADD A,E\n"); +#endif + break; /* FIXME: Implement */ + case 0x84: /* ADD A,H */ +#ifdef DYNA_DEBUG + fdprintf(fd, "ADD A,H\n"); +#endif + break; /* FIXME: Implement */ + case 0x85: /* ADD A,L */ +#ifdef DYNA_DEBUG + fdprintf(fd, "ADD A,L\n"); +#endif + break; /* FIXME: Implement */ + case 0x86: /* ADD A,(HL) */ +#ifdef DYNA_DEBUG + fdprintf(fd, "ADD A,(HL)\n"); +#endif + break; /* FIXME: Implement */ + case 0x87: /* ADD A,A */ +#ifdef DYNA_DEBUG + fdprintf(fd,"ADD A,A\n"); +#endif + /* code taken from gcc -O3 output by compiling; + * c=(2*b)&0xFF; + * a=(c) ? 0 : 0x80 | zero flag + * (0x20 & (c) << 1) | halfcarry + * ((2*b)&0x100)>>4; carry + */ + DYNA_MOVE_l_r_to_r(1,0,0); /* move.l d1, d0 */ + DYNA_ADD_l_r_to_r(0,0,0); /* add.l d0, d0 */ + DYNA_AND_l_i_to_r(510,0); /* and.l #510, d0 */ + DYNA_MOVEA_l_r_to_r(0,3,0); /* movea.l d0,a3 */ + DYNA_CLR_b_r(7); /* clr.b d7 */ + DYNA_TST_b_r(0,0); /* tst.b d0 */ + DYNA_DUMMYBRANCH(2,0); + DYNA_MOVE_l_r_to_r(1,0,0); /* move.l d1,d0 */ + DYNA_LSHIFT_l(3,0,0,0); /* lsr.l #3, d0 */ + DYNA_MOVEQ_l_i_to_r(16,1); /* moveq #16,d1 */ + DYNA_AND_l_r_to_r(1,0); /* and.l d1 d0 */ + DYNA_MOVEQ_l_i_to_r(0x80,7); /* moveq #0x80,d7 */ + DYNA_OR_l_r_to_r(0,7); /* or.l d0, d7 */ + DYNA_BCC_c(0x6,2,0); /* branch not equal, here */ + DYNA_MOVE_l_r_to_r(3,1,1); /* move.l a3,d1 */ + DYNA_AND_l_i_to_r(0xFE,1); /* and.l #0xFE,d1 */ + DYNA_AND_l_i_to_r(0xB0,7); /* and.l #0xB0,d7 */ + break; + case 0x88: /* ADC A,B */ +#ifdef DYNA_DEBUG + fdprintf(fd, "ADC A,B\n"); +#endif + break; /* FIXME: Implement */ + case 0x89: /* ADC A,C */ +#ifdef DYNA_DEBUG + fdprintf(fd, "ADC A,C\n"); +#endif + break; /* FIXME: Implement */ + case 0x8A: /* ADC A,D */ +#ifdef DYNA_DEBUG + fdprintf(fd, "ADC A,D\n"); +#endif + break; /* FIXME: Implement */ + case 0x8B: /* ADC A,E */ +#ifdef DYNA_DEBUG + fdprintf(fd, "ADC A,E\n"); +#endif + break; /* FIXME: Implement */ + case 0x8C: /* ADC A,H */ +#ifdef DYNA_DEBUG + fdprintf(fd, "ADC A,H\n"); +#endif + break; /* FIXME: Implement */ + case 0x8D: /* ADC A,L */ +#ifdef DYNA_DEBUG + fdprintf(fd, "ADC A,L\n"); +#endif + break; /* FIXME: Implement */ + case 0x8E: /* ADC A,(HL) */ +#ifdef DYNA_DEBUG + fdprintf(fd, "ADC A,(HL)\n"); +#endif + break; /* FIXME: Implement */ + case 0x8F: /* ADC A */ +#ifdef DYNA_DEBUG + fdprintf(fd, "ADC A\n"); +#endif + break; /* FIXME: Implement */ + case 0x90: /* SUB B */ +#ifdef DYNA_DEBUG + fdprintf(fd, "SUB B\n"); +#endif + break; /* FIXME: Implement */ + case 0x91: /* SUB C */ +#ifdef DYNA_DEBUG + fdprintf(fd, "SUB C\n"); +#endif + break; /* FIXME: Implement */ + case 0x92: /* SUB D */ +#ifdef DYNA_DEBUG + fdprintf(fd, "SUB D\n"); +#endif + break; /* FIXME: Implement */ + case 0x93: /* SUB E */ +#ifdef DYNA_DEBUG + fdprintf(fd, "SUB E\n"); +#endif + break; /* FIXME: Implement */ + case 0x94: /* SUB H */ +#ifdef DYNA_DEBUG + fdprintf(fd, "SUB H\n"); +#endif + break; /* FIXME: Implement */ + case 0x95: /* SUB L */ +#ifdef DYNA_DEBUG + fdprintf(fd, "SUB L\n"); +#endif + break; /* FIXME: Implement */ + case 0x96: /* SUB (HL) */ +#ifdef DYNA_DEBUG + fdprintf(fd, "SUB (HL)\n"); +#endif + break; /* FIXME: Implement */ + case 0x97: /* SUB A (halfcarry ?) */ +#ifdef DYNA_DEBUG + fdprintf(fd,"SUB A\n"); +#endif + DYNA_CLR_l_r(1); + DYNA_MOVEQ_l_i_to_r(0xC0,7); + break; + case 0x98: /* SBC A,B */ +#ifdef DYNA_DEBUG + fdprintf(fd, "SBC A,B\n"); +#endif + break; /* FIXME: Implement */ + case 0x99: /* SBC A,C */ +#ifdef DYNA_DEBUG + fdprintf(fd, "SBC A,C\n"); +#endif + break; /* FIXME: Implement */ + case 0x9A: /* SBC A,D */ +#ifdef DYNA_DEBUG + fdprintf(fd, "SBC A,D\n"); +#endif + break; /* FIXME: Implement */ + case 0x9B: /* SBC A,E */ +#ifdef DYNA_DEBUG + fdprintf(fd, "SBC A,E\n"); +#endif + break; /* FIXME: Implement */ + case 0x9C: /* SBC A,H */ +#ifdef DYNA_DEBUG + fdprintf(fd, "SBC A,H\n"); +#endif + break; /* FIXME: Implement */ + case 0x9D: /* SBC A,L */ +#ifdef DYNA_DEBUG + fdprintf(fd, "SBC A,L\n"); +#endif + break; /* FIXME: Implement */ + case 0x9E: /* SBC A,(HL) */ +#ifdef DYNA_DEBUG + fdprintf(fd, "SBC A,(HL)\n"); +#endif + break; /* FIXME: Implement */ + case 0x9F: /* SBC A,A */ +#ifdef DYNA_DEBUG + fdprintf(fd, "SBC A,A\n"); +#endif + break; /* FIXME: Implement */ + case 0xA0: /* AND B */ +#ifdef DYNA_DEBUG + fdprintf(fd, "AND B\n"); +#endif + break; /* FIXME: Implement */ + case 0xA1: /* AND C */ +#ifdef DYNA_DEBUG + fdprintf(fd, "AND C\n"); +#endif + break; /* FIXME: Implement */ + case 0xA2: /* AND D */ +#ifdef DYNA_DEBUG + fdprintf(fd, "AND D\n"); +#endif + break; /* FIXME: Implement */ + case 0xA3: /* AND E */ +#ifdef DYNA_DEBUG + fdprintf(fd, "AND E\n"); +#endif + break; /* FIXME: Implement */ + case 0xA4: /* AND H */ +#ifdef DYNA_DEBUG + fdprintf(fd, "AND H\n"); +#endif + break; /* FIXME: Implement */ + case 0xA5: /* AND L */ +#ifdef DYNA_DEBUG + fdprintf(fd, "AND L\n"); +#endif + break; /* FIXME: Implement */ + case 0xA6: /* AND (HL) */ +#ifdef DYNA_DEBUG + fdprintf(fd, "AND (HL)\n"); +#endif + break; /* FIXME: Implement */ + case 0xA7: /* AND A */ +#ifdef DYNA_DEBUG + fdprintf(fd, "AND A\n"); +#endif + break; /* FIXME: Implement */ + case 0xA8: /* XOR B */ +#ifdef DYNA_DEBUG + fdprintf(fd, "XOR B\n"); +#endif + break; /* FIXME: Implement */ + case 0xA9: /* XOR C */ +#ifdef DYNA_DEBUG + fdprintf(fd, "XOR C\n"); +#endif + break; /* FIXME: Implement */ + case 0xAA: /* XOR D */ +#ifdef DYNA_DEBUG + fdprintf(fd, "XOR D\n"); +#endif + break; /* FIXME: Implement */ + case 0xAB: /* XOR E */ +#ifdef DYNA_DEBUG + fdprintf(fd, "XOR E\n"); +#endif + break; /* FIXME: Implement */ + case 0xAC: /* XOR H */ +#ifdef DYNA_DEBUG + fdprintf(fd, "XOR H\n"); +#endif + break; /* FIXME: Implement */ + case 0xAD: /* XOR L */ +#ifdef DYNA_DEBUG + fdprintf(fd, "XOR L\n"); +#endif + break; /* FIXME: Implement */ + case 0xAE: /* XOR (HL) */ +#ifdef DYNA_DEBUG + fdprintf(fd, "XOR (HL)\n"); +#endif + break; /* FIXME: Implement */ + case 0xAF: /* XOR A */ +#ifdef DYNA_DEBUG + fdprintf(fd, "XOR A\n"); +#endif + break; /* FIXME: Implement */ + case 0xB0: /* OR B */ +#ifdef DYNA_DEBUG + fdprintf(fd, "OR B\n"); +#endif + break; /* FIXME: Implement */ + case 0xB1: /* OR C */ +#ifdef DYNA_DEBUG + fdprintf(fd, "OR C\n"); +#endif + break; /* FIXME: Implement */ + case 0xB2: /* OR D */ +#ifdef DYNA_DEBUG + fdprintf(fd, "OR D\n"); +#endif + break; /* FIXME: Implement */ + case 0xB3: /* OR E */ +#ifdef DYNA_DEBUG + fdprintf(fd, "OR E\n"); +#endif + break; /* FIXME: Implement */ + case 0xB4: /* OR H */ +#ifdef DYNA_DEBUG + fdprintf(fd, "OR H\n"); +#endif + break; /* FIXME: Implement */ + case 0xB5: /* OR L */ +#ifdef DYNA_DEBUG + fdprintf(fd, "OR L\n"); +#endif + break; /* FIXME: Implement */ + case 0xB6: /* OR (HL) */ +#ifdef DYNA_DEBUG + fdprintf(fd, "OR (HL)\n"); +#endif + break; /* FIXME: Implement */ + case 0xB7: /* OR A */ +#ifdef DYNA_DEBUG + fdprintf(fd, "OR A\n"); +#endif + break; /* FIXME: Implement */ + case 0xB8: /* CP B */ +#ifdef DYNA_DEBUG + fdprintf(fd, "CP B\n"); +#endif + break; /* FIXME: Implement */ + case 0xB9: /* CP C */ +#ifdef DYNA_DEBUG + fdprintf(fd, "CP C\n"); +#endif + break; /* FIXME: Implement */ + case 0xBA: /* CP D */ +#ifdef DYNA_DEBUG + fdprintf(fd, "CP D\n"); +#endif + break; /* FIXME: Implement */ + case 0xBB: /* CP E */ +#ifdef DYNA_DEBUG + fdprintf(fd, "CP E\n"); +#endif + break; /* FIXME: Implement */ + case 0xBC: /* CP H */ +#ifdef DYNA_DEBUG + fdprintf(fd, "CP H\n"); +#endif + break; /* FIXME: Implement */ + case 0xBD: /* CP L */ +#ifdef DYNA_DEBUG + fdprintf(fd, "CP L\n"); +#endif + break; /* FIXME: Implement */ + case 0xBE: /* CP (HL) */ +#ifdef DYNA_DEBUG + fdprintf(fd, "CP (HL)\n"); +#endif + break; /* FIXME: Implement */ + case 0xBF: /* CP A */ +#ifdef DYNA_DEBUG + fdprintf(fd, "CP A\n"); +#endif + break; /* FIXME: Implement */ + case 0xC0: /* RET NZ */ +#ifdef DYNA_DEBUG + fdprintf(fd, "RET NZ\n"); +#endif + break; /* FIXME: Implement */ + case 0xC1: /* POP BC */ +#ifdef DYNA_DEBUG + fdprintf(fd, "POP BC\n"); +#endif + break; + case 0xC2: /* JP NZ */ +#ifdef DYNA_DEBUG + fdprintf(fd,"JP NZ\n"); +#endif + DYNA_BTST_l_r(8,7); /* btst #8,d7 */ + DYNA_DUMMYBRANCH(2,0); + DYNA_MOVEA_l_i_to_r(&blockclen,3); + DYNA_MOVE_l_i_to_m(tclen,3); + DYNA_MOVEA_l_i_to_r(readw(PC),1); + DYNA_RET(); + DYNA_BCC_c(0x6,2,0); /* jump here if bit is not zero */ + tclen--; + PC+=2; + break; + case 0xC3: /* JP (imm) PC = readw(PC) */ +#ifdef DYNA_DEBUG + fdprintf(fd,"JP (0x%x)\n",readw(xPC)); +#endif + PC=readw(PC); + done=1; + break; + case 0xC4: /* CALL NZ */ +#ifdef DYNA_DEBUG + fdprintf(fd, "CALL NZ\n"); +#endif + break; /* FIXME: Implement */ + case 0xC5: /* PUSH BC */ +#ifdef DYNA_DEBUG + fdprintf(fd, "PUSH BC\n"); +#endif + break; /* FIXME: Implement */ + case 0xC6: /* ADD A,imm */ +#ifdef DYNA_DEBUG + fdprintf(fd, "ADD A,imm\n"); +#endif + break; /* FIXME: Implement */ + case 0xC7: /* RST 0h */ +#ifdef DYNA_DEBUG + fdprintf(fd, "RST 0h\n"); +#endif + break; /* FIXME: Implement */ + case 0xC8: /* RET Z */ +#ifdef DYNA_DEBUG + fdprintf(fd, "RET Z\n"); +#endif + break; /* FIXME: Implement */ + case 0xC9: /* RET */ +#ifdef DYNA_DEBUG + fdprintf(fd,"RET\n"); +#endif + POPA(1); + writepc=0; + done=1; + break; + case 0xCA: /* JP Z */ + break; /* FIXME: Implement */ + case 0xCB: /* NULL */ +#ifdef DYNA_DEBUG + fdprintf(fd,"NULL\n"); +#endif + break; + case 0xCC: /* CALL Z */ +#ifdef DYNA_DEBUG + fdprintf(fd, "CALL Z\n"); +#endif + break; /* FIXME: Implement */ + case 0xCD: /* CALL (imm) PUSH(PC+2) PC=readw(PC); */ +#ifdef DYNA_DEBUG + fdprintf(fd,"CALL (0x%x)\n",readw(xPC)); +#endif + PUSH(PC+2); + PC=readw(PC); + done=1; + break; + case 0xCE: /* ADC A,imm */ +#ifdef DYNA_DEBUG + fdprintf(fd, "ADC A,imm\n"); +#endif + break; /* FIXME: Implement */ + case 0xCF: /* RST 8h */ +#ifdef DYNA_DEBUG + fdprintf(fd, "RST 8h\n"); +#endif + break; /* FIXME: Implement */ + case 0xD0: /* RET NC */ +#ifdef DYNA_DEBUG + fdprintf(fd,"RET NC\n"); +#endif + DYNA_BTST_l_r(5,7); /* btst #5,d7 */ + DYNA_DUMMYBRANCH(2,0); + POPA(1); /* POP %a1 */ + DYNA_MOVEA_l_i_to_r(&blockclen,3); + DYNA_MOVE_l_i_to_m(tclen,3); + DYNA_RET(); + DYNA_BCC_c(0x6,2,0); /* jump here if bit is not zero */ + tclen-=3; + break; + case 0xD1: /* POP DE */ +#ifdef DYNA_DEBUG + fdprintf(fd, "POP DE\n"); +#endif + break; /* FIXME: Implement */ + case 0xD2: /* JP NC */ +#ifdef DYNA_DEBUG + fdprintf(fd, "JP NC\n"); +#endif + break; /* FIXME: Implement */ + case 0xD3: /* NULL */ +#ifdef DYNA_DEBUG + fdprintf(fd,"NULL\n"); +#endif + break; + case 0xD4: /* CALL NC */ +#ifdef DYNA_DEBUG + fdprintf(fd, "CALL NC\n"); +#endif + break; /* FIXME: Implement */ + case 0xD5: /* PUSH DE */ +#ifdef DYNA_DEBUG + fdprintf(fd, "PUSH DE\n"); +#endif + break; /* FIXME: Implement */ + case 0xD6: /* SUB imm */ +#ifdef DYNA_DEBUG + fdprintf(fd, "SUB imm\n"); +#endif + break; /* FIXME: Implement */ + case 0xD7: /* RST 10h */ +#ifdef DYNA_DEBUG + fdprintf(fd, "RST 10h\n"); +#endif + break; /* FIXME: Implement */ + case 0xD8: /* RET C */ +#ifdef DYNA_DEBUG + fdprintf(fd, "RET C\n"); +#endif + break; /* FIXME: Implement */ + case 0xD9: /* RETI */ +#ifdef DYNA_DEBUG + fdprintf(fd, "RETI\n"); +#endif + break; /* FIXME: Implement */ + case 0xDA: /* JP C */ +#ifdef DYNA_DEBUG + fdprintf(fd, "JP C\n"); +#endif + break; /* FIXME: Implement */ + case 0xDB: /* NULL */ +#ifdef DYNA_DEBUG + fdprintf(fd,"NULL\n"); +#endif + break; + case 0xDC: /* CALL NC */ +#ifdef DYNA_DEBUG + fdprintf(fd, "CALL NC\n"); +#endif + break; /* FIXME: Implement */ + case 0xDD: /* NULL */ +#ifdef DYNA_DEBUG + fdprintf(fd,"NULL\n"); +#endif + break; + case 0xDE: /* SBC A,imm */ +#ifdef DYNA_DEBUG + fdprintf(fd, "SBC A,imm\n"); +#endif + break; /* FIXME: Implement */ + case 0xDF: /* RST 18h */ +#ifdef DYNA_DEBUG + fdprintf(fd, "RST 18h\n"); +#endif + break; /* FIXME: Implement */ + case 0xE0: /* LDH (imm),A */ +#ifdef DYNA_DEBUG + fdprintf(fd,"LD (0x%x),A\n",readb(xPC)); +#endif + DYNA_PUSH_l_r(1,0); + DYNA_PEA_w_i(FETCH); + CALL_NATIVE(&writehi); + DYNA_ADDQ_l_i_to_r(0,7,1); + /*writehi(FETCH, A); */ + break; + case 0xE1: /* POP HL */ +#ifdef DYNA_DEBUG + fdprintf(fd, "POP HL\n"); +#endif + break; /* FIXME: Implement */ + case 0xE2: /* LDH (imm),A */ +#ifdef DYNA_DEBUG + fdprintf(fd, "LDH (imm),A\n"); +#endif + break; /* FIXME: Implement */ + case 0xE3: /* NULL */ +#ifdef DYNA_DEBUG + fdprintf(fd,"NULL\n"); +#endif + break; + case 0xE4: /* NULL */ + break; +#ifdef DYNA_DEBUG + fdprintf(fd,"NULL\n"); +#endif + case 0xE5: /* PUSH HL */ +#ifdef DYNA_DEBUG + fdprintf(fd, "PUSH HL\n"); +#endif + break; /* FIXME: Implement */ + case 0xE6: /* AND imm */ +#ifdef DYNA_DEBUG + fdprintf(fd, "AND imm\n"); +#endif + break; /* FIXME: Implement */ + case 0xE7: /* RST 20h */ +#ifdef DYNA_DEBUG + fdprintf(fd, "RST 20h\n"); +#endif + break; /* FIXME: Implement */ + case 0xE8: /* ADD SP */ +#ifdef DYNA_DEBUG + fdprintf(fd, "ADD SP\n"); +#endif + break; /* FIXME: Implement */ + case 0xE9: /* JP HL */ +#ifdef DYNA_DEBUG + fdprintf(fd, "JP HL\n"); +#endif + break; /* FIXME: Implement */ + case 0xEA: /* LD A */ +#ifdef DYNA_DEBUG + fdprintf(fd, "LD A\n"); +#endif + break; /* FIXME: Implement */ + case 0xEB: /* NULL */ +#ifdef DYNA_DEBUG + fdprintf(fd,"NULL\n"); +#endif + break; + case 0xEC: /* NULL */ +#ifdef DYNA_DEBUG + fdprintf(fd,"NULL\n"); +#endif + break; + case 0xED: /* NULL */ +#ifdef DYNA_DEBUG + fdprintf(fd,"NULL\n"); +#endif + break; + case 0xEE: /* XOR imm */ +#ifdef DYNA_DEBUG + fdprintf(fd, "XOR imm\n"); +#endif + break; /* FIXME: Implement */ + case 0xEF: /* RST 28h */ +#ifdef DYNA_DEBUG + fdprintf(fd, "RST 28h\n"); +#endif + break; /* FIXME: Implement */ + case 0xF0: /* LDH A,(imm) */ +#ifdef DYNA_DEBUG + fdprintf(fd,"LDH A,(0x%x)\n",readb(xPC)); +#endif + DYNA_PEA_w_i(FETCH); + CALL_NATIVE(&readhi); + DYNA_ADDQ_l_i_to_r(4,7,1); + DYNA_MOVE_b_r_to_r(0,1); + /*A = readhi(FETCH)*/ + break; + case 0xF1: /* POP AF */ +#ifdef DYNA_DEBUG + fdprintf(fd, "POP AF\n"); +#endif + break; /* FIXME: Implement */ + case 0xF2: /* LDH A,(imm) */ +#ifdef DYNA_DEBUG + fdprintf(fd, "LDH A,(imm)\n"); +#endif + break; /* FIXME: Implement */ + case 0xF3: /* DI */ +#ifdef DYNA_DEBUG + fdprintf(fd,"DI\n"); +#endif + DYNA_CLR_l_m(&cpu.ime); + DYNA_CLR_l_m(&cpu.ima); + DYNA_CLR_l_m(&cpu.halt); + /* cpu.halt = cpu.ima = cpu.ime = 0; */ + break; + case 0xF4: /* NULL */ +#ifdef DYNA_DEBUG + fdprintf(fd,"NULL\n"); +#endif + break; + case 0xF5: /* PUSH AF */ +#ifdef DYNA_DEBUG + fdprintf(fd, "PUSH AF\n"); +#endif + break; /* FIXME: Implement */ + case 0xF6: /* OR imm */ +#ifdef DYNA_DEBUG + fdprintf(fd, "OR imm\n"); +#endif + break; /* FIXME: Implement */ + case 0xF7: /* RST 30h */ +#ifdef DYNA_DEBUG + fdprintf(fd, "RST 30h\n"); +#endif + break; /* FIXME: Implement */ + case 0xF8: /* LD HL,SP */ +#ifdef DYNA_DEBUG + fdprintf(fd, "LD HL,SP\n"); +#endif + break; /* FIXME: Implement */ + case 0xF9: /* LD SP,HL */ +#ifdef DYNA_DEBUG + fdprintf(fd,"LD SP,HL\n"); +#endif + DYNA_MOVEA_w_r_to_r(6,0,0); + break; + case 0xFA: /* LD A, (imm) */ +#ifdef DYNA_DEBUG + fdprintf(fd,"LD A,(0x%x)\n",readw(xPC)); +#endif + /*DYNA_PEA_w_i(readw(xPC)); + PC+=2; \ + CALL_NATIVE(&readb); \ + DYNA_ADDQ_l_i_to_r(4,7,1); \ + DYNA_MOVE_l_r_to_r(0,1,0);*/ + break; + case 0xFB: /* EI */ +#ifdef DYNA_DEBUG + fdprintf(fd,"EI\n"); +#endif + DYNA_MOVEQ_l_i_to_r(1,0); + DYNA_MOVEA_l_i_to_r(&cpu.ima,3); + DYNA_MOVE_l_r_to_m(0,3); + /*cpu.ima=1; */ + break; + case 0xFC: /* NULL */ +#ifdef DYNA_DEBUG + fdprintf(fd,"NULL\n"); +#endif + break; + case 0xFD: /* NULL */ +#ifdef DYNA_DEBUG + fdprintf(fd,"NULL\n"); +#endif + break; + case 0xFE: /* CMP # TODO: can be (much) more efficient.*/ +#ifdef DYNA_DEBUG + fdprintf(fd,"CMP #0x%x\n",readb(xPC)); +#endif + DYNA_MOVEA_l_r_to_r(2,3,0); /* movea.l %d2, %a3 */ + DYNA_MOVEQ_l_i_to_r(FETCH,2); /* moveq.l #,%d2 */ + CMP(2); + DYNA_MOVE_l_r_to_r(3,2,1); /* move.l %a3, %d2 */ + break; + case 0xFF: /* RST 38h */ +#ifdef DYNA_DEBUG + fdprintf(fd, "RST 38h\n"); +#endif + break; /* FIXME: Implement */ + default: + snprintf(meow,499,"unimplemented opcode %d / 0x%x",op,op); + die(meow); + return; + break; + } } #ifdef DYNA_DEBUG fdprintf(fd,"(End of Block)\n"); @@ -968,7 +1900,7 @@ void dynamic_recompile (struct dynarec_block *newblock) { DYNA_MOVEA_l_i_to_r(&blockclen,3); DYNA_MOVE_l_i_to_m(tclen,3); if(writepc) - DYNA_MOVEA_l_i_to_r(PC,1); + DYNA_MOVEA_l_i_to_r(PC,1); DYNA_RET(); PC=oldpc; setmallocpos(dynapointer); @@ -976,9 +1908,9 @@ void dynamic_recompile (struct dynarec_block *newblock) { invalidate_icache(); snprintf(meow,499,"/dyna_0x%x_code.rb",PC); fd=open(meow,O_WRONLY|O_CREAT|O_TRUNC); - if(fd>=0) { + if(fd>=0) + { write(fd,newblock->block,newblock->length); - close(fd); + close(fd); } } -#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 @@ #include "cpu-gb.h" #include "mem.h" #include "lcd-gb.h" -#include "rc.h" #include "sound.h" #include "rtc-gb.h" -static int framelen = 16743; -static int framecount; - -rcvar_t emu_exports[] = -{ - RCV_INT("framelen", &framelen), - RCV_INT("framecount", &framecount), - RCV_END -}; - -void emu_init(void) -{ -} - /* * emu_reset is called to initialize the state of the emulated * system. It should set cpu registers, hardware registers, etc. to @@ -47,9 +32,8 @@ void emu_step(void) * make things work in the mean time. */ void emu_run(void) { -// void *timer = sys_timer(); + /*void *timer = sys_timer();*/ int framesin=0,frames=0,timeten=*rb->current_tick, timehun=*rb->current_tick; -// int delay; setvidmode(options.fullscreen); vid_begin(); @@ -63,24 +47,25 @@ void emu_run(void) while (R_LY > 0 && R_LY < 144) emu_step(); - rtc_tick(); - sound_mix(); - if (!pcm_submit()) + /* rtc_tick(); */ /* RTC support not implemented */ + + if(options.sound) { -/* delay = framelen - sys_elapsed(timer); - sys_sleep(delay); - sys_elapsed(timer);*/ + sound_mix(); + pcm_submit(); } - + doevents(); vid_begin(); - + if (!(R_LCDC & 0x80)) cpu_emulate(32832); - + while (R_LY > 0) /* wait for next frame */ + { emu_step(); - rb->yield(); + rb->yield(); + } frames++; 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 @@ void emu_reset(void); -void emu_run(void); +void emu_run(void) ICODE_ATTR; diff --git a/apps/plugins/rockboy/events.c b/apps/plugins/rockboy/events.c index 5a34ce81e5..c018f7ce53 100644 --- a/apps/plugins/rockboy/events.c +++ b/apps/plugins/rockboy/events.c @@ -8,10 +8,6 @@ #include "rockmacros.h" #include "input.h" - -char keystates[MAX_KEYS]; -int nkeysdown; - #define MAX_EVENTS 32 static event_t eventqueue[MAX_EVENTS]; @@ -20,34 +16,23 @@ static int eventhead, eventpos; int ev_postevent(event_t *ev) { - int nextevent; - nextevent = (eventhead+1)%MAX_EVENTS; - if (nextevent == eventpos) - return 0; - eventqueue[eventhead] = *ev; - eventhead = nextevent; - return 1; + int nextevent; + nextevent = (eventhead+1)%MAX_EVENTS; + if (nextevent == eventpos) + return 0; + eventqueue[eventhead] = *ev; + eventhead = nextevent; + return 1; } int ev_getevent(event_t *ev) { - if (eventpos == eventhead) - { - ev->type = EV_NONE; - return 0; - } - *ev = eventqueue[eventpos]; - eventpos = (eventpos+1)%MAX_EVENTS; - if (ev->type == EV_PRESS) - { - keystates[ev->code] = 1; - nkeysdown++; - } - if (ev->type == EV_RELEASE) - { - keystates[ev->code] = 0; - nkeysdown--; - if (nkeysdown < 0) nkeysdown = 0; - } - return 1; + if (eventpos == eventhead) + { + ev->type = EV_NONE; + return 0; + } + *ev = eventqueue[eventpos]; + eventpos = (eventpos+1)%MAX_EVENTS; + return 1; } 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 @@ - - -#include "rockmacros.h" - -#include "rc.h" - -extern rcvar_t emu_exports[], loader_exports[], - lcd_exports[], rtc_exports[], sound_exports[], - vid_exports[], joy_exports[], pcm_exports[]; - - -rcvar_t *sources[] = -{ - emu_exports, - loader_exports, - lcd_exports, - rtc_exports, - sound_exports, - vid_exports, - joy_exports, - pcm_exports, - NULL -}; - - -void init_exports(void) -{ - rcvar_t **s = sources; - - while (*s) - rc_exportvars(*(s++)); -} - - -void show_exports(void) -{ - // TODO - /*int i, j; - for (i = 0; sources[i]; i++) - for (j = 0; sources[i][j].name; j++) - printf("%s\n", sources[i][j].name);*/ -} 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 @@ -void init_exports(void); -void show_exports(void); diff --git a/apps/plugins/rockboy/fastmem.c b/apps/plugins/rockboy/fastmem.c index d883438ce1..9092f68fed 100644 --- a/apps/plugins/rockboy/fastmem.c +++ b/apps/plugins/rockboy/fastmem.c @@ -3,136 +3,75 @@ #include "rockmacros.h" #include "fastmem.h" - -#define D 0 /* direct */ -#define C 1 /* direct cgb-only */ -#define R 2 /* io register */ -#define S 3 /* sound register */ -#define W 4 /* wave pattern */ - -#define F 0xFF /* fail */ - -const byte himask[256]; - -const byte hi_rmap[256] = -{ - 0, 0, R, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - S, S, S, S, S, S, S, S, S, S, S, S, S, S, S, S, - S, S, S, S, S, S, S, S, S, S, S, S, S, S, S, S, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, C, 0, C, - 0, C, C, C, C, C, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, C, C, C, C, 0, 0, 0, 0, - C, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 -}; - -const byte hi_wmap[256] = -{ - R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, R, - S, S, S, S, S, S, S, S, S, S, S, S, S, S, S, S, - S, S, S, S, S, S, S, S, S, S, S, S, S, S, S, S, - S, S, S, S, S, S, S, S, S, S, S, S, S, S, S, S, - R, R, R, R, R, R, R, R, R, R, R, R, 0, R, 0, R, - 0, C, C, C, C, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, R, R, R, R, 0, 0, 0, 0, - R, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, R -}; - - byte readb(int a) { - byte *p = mbc.rmap[a>>12]; - if (p) return p[a]; - else return mem_read(a); + byte *p = mbc.rmap[a>>12]; + if (p) return p[a]; + else return mem_read(a); } void writeb(int a, byte b) { - byte *p = mbc.wmap[a>>12]; - if (p) p[a] = b; - else mem_write(a, b); + byte *p = mbc.wmap[a>>12]; + if (p) p[a] = b; + else mem_write(a, b); } int readw(int a) { - if ((a+1) & 0xfff) - { - byte *p = mbc.rmap[a>>12]; - if (p) - { + if ((a+1) & 0xfff) + { + byte *p = mbc.rmap[a>>12]; + if (p) + { #ifdef ROCKBOX_LITTLE_ENDIAN #ifndef ALLOW_UNALIGNED_IO - if (a&1) return p[a] | (p[a+1]<<8); + if (a&1) return p[a] | (p[a+1]<<8); #endif - return *(word *)(p+a); + return *(word *)(p+a); #else - return p[a] | (p[a+1]<<8); + return p[a] | (p[a+1]<<8); #endif - } - } - return mem_read(a) | (mem_read(a+1)<<8); + } + } + return mem_read(a) | (mem_read(a+1)<<8); } void writew(int a, int w) { - if ((a+1) & 0xfff) - { - byte *p = mbc.wmap[a>>12]; - if (p) - { + if ((a+1) & 0xfff) + { + byte *p = mbc.wmap[a>>12]; + if (p) + { #ifdef ROCKBOX_LITTLE_ENDIAN #ifndef ALLOW_UNALIGNED_IO - if (a&1) - { - p[a] = w; - p[a+1] = w >> 8; - return; - } + if (a&1) + { + p[a] = w; + p[a+1] = w >> 8; + return; + } #endif - *(word *)(p+a) = w; - return; + *(word *)(p+a) = w; + return; #else - p[a] = w; - p[a+1] = w >> 8; - return; + p[a] = w; + p[a+1] = w >> 8; + return; #endif - } - } - mem_write(a, w); - mem_write(a+1, w>>8); + } + } + mem_write(a, w); + mem_write(a+1, w>>8); } byte readhi(int a) { - return readb(a | 0xff00); + return readb(a | 0xff00); } void writehi(int a, byte b) { - writeb(a | 0xff00, b); + writeb(a | 0xff00, b); } - -#if 0 -byte readhi(int a) -{ - byte (*rd)() = hi_read[a]; - return rd ? rd(a) : (ram.hi[a] | himask[a]); -} - -void writehi(int a, byte b) -{ - byte (*wr)() = hi_write[a]; - if (wr) wr(a, b); - else ram.hi[a] = b & ~himask[a]; -} -#endif - 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; void writew(int a, int w) ICODE_ATTR; byte readhi(int a) ICODE_ATTR; void writehi(int a, byte b) ICODE_ATTR; -#if 0 -byte readhi(int a); -void writehi(int a, byte b); -#endif - #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 @@ struct fb { - fb_data *ptr; - int w, h; - int pelsize; - int pitch; - int indexed; - struct - { - int l, r; - } cc[4]; - int yuv; - int enabled; - int dirty; - int mode; + fb_data *ptr; + struct + { + int l, r; + } cc[3]; + int enabled; +#if !defined(HAVE_LCD_COLOR) + int mode; +#endif }; 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 @@ #include "fastmem.h" -struct hw hw; +struct hw hw IBSS_ATTR; @@ -24,17 +24,17 @@ struct hw hw; void hw_interrupt(byte i, byte mask) { - byte oldif = R_IF; - i &= 0x1F & mask; - R_IF |= i & (hw.ilines ^ i); + byte oldif = R_IF; + i &= 0x1F & mask; + R_IF |= i & (hw.ilines ^ i); - /* FIXME - is this correct? not sure the docs understand... */ - if ((R_IF & (R_IF ^ oldif) & R_IE) && cpu.ime) cpu.halt = 0; - /* if ((i & (hw.ilines ^ i) & R_IE) && cpu.ime) cpu.halt = 0; */ - /* if ((i & R_IE) && cpu.ime) cpu.halt = 0; */ - - hw.ilines &= ~mask; - hw.ilines |= i; + /* FIXME - is this correct? not sure the docs understand... */ + if ((R_IF & (R_IF ^ oldif) & R_IE) && cpu.ime) cpu.halt = 0; + /* if ((i & (hw.ilines ^ i) & R_IE) && cpu.ime) cpu.halt = 0; */ + /* if ((i & R_IE) && cpu.ime) cpu.halt = 0; */ + + hw.ilines &= ~mask; + hw.ilines |= i; } @@ -47,64 +47,65 @@ void hw_interrupt(byte i, byte mask) void hw_dma(byte b) { - int i; - addr a; + int i; + addr a; - a = ((addr)b) << 8; - for (i = 0; i < 160; i++, a++) - lcd.oam.mem[i] = readb(a); + a = ((addr)b) << 8; + for (i = 0; i < 160; i++, a++) + lcd.oam.mem[i] = readb(a); } - - -void hw_hdma_cmd(byte c) -{ - int cnt; - addr sa; - int da; - - /* Begin or cancel HDMA */ - if ((hw.hdma|c) & 0x80) - { - hw.hdma = c; - R_HDMA5 = c & 0x7f; - return; - } - - /* Perform GDMA */ - sa = ((addr)R_HDMA1 << 8) | (R_HDMA2&0xf0); - da = 0x8000 | ((int)(R_HDMA3&0x1f) << 8) | (R_HDMA4&0xf0); - cnt = ((int)c)+1; - /* FIXME - this should use cpu time! */ - /*cpu_timers(102 * cnt);*/ - cnt <<= 4; - while (cnt--) - writeb(da++, readb(sa++)); - R_HDMA1 = sa >> 8; - R_HDMA2 = sa & 0xF0; - R_HDMA3 = 0x1F & (da >> 8); - R_HDMA4 = da & 0xF0; - R_HDMA5 = 0xFF; -} - - void hw_hdma(void) { - int cnt; - addr sa; - int da; + int cnt; + addr sa; + int da; - sa = ((addr)R_HDMA1 << 8) | (R_HDMA2&0xf0); - da = 0x8000 | ((int)(R_HDMA3&0x1f) << 8) | (R_HDMA4&0xf0); - cnt = 16; - while (cnt--) - writeb(da++, readb(sa++)); - R_HDMA1 = sa >> 8; - R_HDMA2 = sa & 0xF0; - R_HDMA3 = 0x1F & (da >> 8); - R_HDMA4 = da & 0xF0; - R_HDMA5--; - hw.hdma--; + sa = ((addr)R_HDMA1 << 8) | (R_HDMA2&0xf0); + da = 0x8000 | ((int)(R_HDMA3&0x1f) << 8) | (R_HDMA4&0xf0); + cnt = 16; + while (cnt--) + writeb(da++, readb(sa++)); + cpu_timers(16); + R_HDMA1 = sa >> 8; + R_HDMA2 = sa & 0xF0; + R_HDMA3 = 0x1F & (da >> 8); + R_HDMA4 = da & 0xF0; + R_HDMA5--; + hw.hdma--; +} + +void hw_hdma_cmd(byte c) +{ + int cnt; + addr sa; + int da; + + /* Begin or cancel HDMA */ + if ((hw.hdma|c) & 0x80) + { + hw.hdma = c; + R_HDMA5 = c & 0x7f; + if ((R_STAT&0x03) == 0x00) hw_hdma(); + return; + } + + /* Perform GDMA */ + sa = ((addr)R_HDMA1 << 8) | (R_HDMA2&0xf0); + da = 0x8000 | ((int)(R_HDMA3&0x1f) << 8) | (R_HDMA4&0xf0); + cnt = ((int)c)+1; + /* FIXME - this should use cpu time! */ + /*cpu_timers(102 * cnt);*/ + cpu_timers((460>>cpu.speed)+cnt*16); /*dalias*/ + /*cpu_timers(228 + (16*cnt));*/ /* this should be right according to no$ */ + cnt <<= 4; + while (cnt--) + writeb(da++, readb(sa++)); + R_HDMA1 = sa >> 8; + R_HDMA2 = sa & 0xF0; + R_HDMA3 = 0x1F & (da >> 8); + R_HDMA4 = da & 0xF0; + R_HDMA5 = 0xFF; } @@ -116,20 +117,20 @@ void hw_hdma(void) void pad_refresh() { - byte oldp1; - oldp1 = R_P1; - R_P1 &= 0x30; - R_P1 |= 0xc0; - if (!(R_P1 & 0x10)) - R_P1 |= (hw.pad & 0x0F); - if (!(R_P1 & 0x20)) - R_P1 |= (hw.pad >> 4); - R_P1 ^= 0x0F; - if (oldp1 & ~R_P1 & 0x0F) - { - hw_interrupt(IF_PAD, IF_PAD); - hw_interrupt(0, IF_PAD); - } + byte oldp1; + oldp1 = R_P1; + R_P1 &= 0x30; + R_P1 |= 0xc0; + if (!(R_P1 & 0x10)) + R_P1 |= (hw.pad & 0x0F); + if (!(R_P1 & 0x20)) + R_P1 |= (hw.pad >> 4); + R_P1 ^= 0x0F; + if (oldp1 & ~R_P1 & 0x0F) + { + hw_interrupt(IF_PAD, IF_PAD); + hw_interrupt(0, IF_PAD); + } } @@ -140,44 +141,37 @@ void pad_refresh() void pad_press(byte k) { - if (hw.pad & k) - return; - hw.pad |= k; - pad_refresh(); + if (hw.pad & k) + return; + hw.pad |= k; + pad_refresh(); } void pad_release(byte k) { - if (!(hw.pad & k)) - return; - hw.pad &= ~k; - pad_refresh(); + if (!(hw.pad & k)) + return; + hw.pad &= ~k; + pad_refresh(); } void pad_set(byte k, int st) { - st ? pad_press(k) : pad_release(k); + st ? pad_press(k) : pad_release(k); } void hw_reset() { - hw.ilines = hw.pad = 0; + hw.ilines = hw.pad = 0; - memset(ram.hi, 0, sizeof ram.hi); + memset(ram.hi, 0, sizeof ram.hi); - R_P1 = 0xFF; - R_LCDC = 0x91; - R_BGP = 0xFC; - R_OBP0 = 0xFF; - R_OBP1 = 0xFF; - R_SVBK = 0x01; - R_HDMA5 = 0xFF; - R_VBK = 0xFE; + R_P1 = 0xFF; + R_LCDC = 0x91; + R_BGP = 0xFC; + R_OBP0 = 0xFF; + R_OBP1 = 0xFF; + R_SVBK = 0x01; + R_HDMA5 = 0xFF; + R_VBK = 0xFE; } - - - - - - - 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 @@ struct hw { - byte ilines; - byte pad; - int hdma; - int cgb,gba; + byte ilines; + byte pad; + int hdma; + int cgb; }; 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 @@ - -/* Slightly modified from its original form so as not to exit the - * program on errors. The resulting file remains in the public - * domain for all to use. */ - -/* --- GZIP file format uncompression routines --- */ - -/* The following routines (notably the unzip()) function below - * uncompress gzipped data. They are terribly slow at the task, but - * it is presumed that they work reasonably well. They don't do any - * error checking, but they're probably not too vulnerable to buggy - * data either. Another important limitation (but it would be pretty - * easy to get around) is that the data must reside in memory, it is - * not read as a stream. They have been very little tested. Anyway, - * whatever these functions are good for, I put them in the public - * domain. -- David Madore 1999/11/21 */ - -#include "rockmacros.h" - -static unsigned int -peek_bits (const unsigned char *data, long p, int q) - /* Read q bits starting from bit p from the data pointed to by - * data. Data is in little-endian format. */ -{ - unsigned int answer; - int cnt; /* Number of bits already placed in answer */ - char ob, lb; /* Offset and length of bit field within current byte */ - - answer = 0; - for ( cnt=0 ; cnt q ) - lb = q-cnt; - answer |= ((unsigned int)((data[(p+cnt)/8]>>ob)&((1U<>(maxbits-size_table[j])) == code_table[j] ) ) - { - *p += size_table[j]; - return j; - } - } - return -1; -} - -/* I don't know what these should be. The rfc1951 doesn't seem to say - * (it only mentions them in the last paragraph of section 3.2.1). 15 - * is almost certainly safe, and it is the largest I can put given the - * constraints on the size of integers in the C standard. */ -#define CLEN_MAXBITS 15 -#define HLIT_MAXBITS 15 -#define HDIST_MAXBITS 15 - -/* The magical table sizes... */ -#define CLEN_TSIZE 19 -#define HLIT_TSIZE 288 -#define HDIST_TSIZE 30 - -static int -get_tables (const unsigned char *data, long *p, - char hlit_size_table[HLIT_TSIZE], - unsigned int hlit_code_table[HLIT_TSIZE], - char hdist_size_table[HDIST_TSIZE], - unsigned int hdist_code_table[HDIST_TSIZE]) - /* Fill the Huffman tables (first the code lengths table, and - * then, using it, the literal/length table and the distance - * table). See section 3.2.7 of rfc1951 for details. */ -{ - char hlit, hdist, hclen; - const int clen_weird_tangle[CLEN_TSIZE] - = { 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 }; - char clen_size_table[CLEN_TSIZE]; - unsigned int clen_code_table[CLEN_TSIZE]; - int j; - unsigned int b; - int remainder; /* See note at end of section 3.2.7 of rfc1951. */ - char rem_val; - - hlit = read_bits (data, p, 5); - hdist = read_bits (data, p, 5); - hclen = read_bits (data, p, 4); - for ( j=0 ; j<4+hclen ; j++ ) - clen_size_table[clen_weird_tangle[j]] - = read_bits (data, p, 3); - for ( ; j= 257 ) - /* Back reference */ - { - unsigned int bb; - unsigned int length, dist; - unsigned int l; - - switch ( b ) - { - case 257: length = 3; break; - case 258: length = 4; break; - case 259: length = 5; break; - case 260: length = 6; break; - case 261: length = 7; break; - case 262: length = 8; break; - case 263: length = 9; break; - case 264: length = 10; break; - case 265: length = 11 + read_bits (data, p, 1); break; - case 266: length = 13 + read_bits (data, p, 1); break; - case 267: length = 15 + read_bits (data, p, 1); break; - case 268: length = 17 + read_bits (data, p, 1); break; - case 269: length = 19 + read_bits (data, p, 2); break; - case 270: length = 23 + read_bits (data, p, 2); break; - case 271: length = 27 + read_bits (data, p, 2); break; - case 272: length = 31 + read_bits (data, p, 2); break; - case 273: length = 35 + read_bits (data, p, 3); break; - case 274: length = 43 + read_bits (data, p, 3); break; - case 275: length = 51 + read_bits (data, p, 3); break; - case 276: length = 59 + read_bits (data, p, 3); break; - case 277: length = 67 + read_bits (data, p, 4); break; - case 278: length = 83 + read_bits (data, p, 4); break; - case 279: length = 99 + read_bits (data, p, 4); break; - case 280: length = 115 + read_bits (data, p, 4); break; - case 281: length = 131 + read_bits (data, p, 5); break; - case 282: length = 163 + read_bits (data, p, 5); break; - case 283: length = 195 + read_bits (data, p, 5); break; - case 284: length = 227 + read_bits (data, p, 5); break; - case 285: length = 258; break; - default: - return -1; - } - bb = decode_one (data, p, hdist_size_table, HDIST_TSIZE, - hdist_code_table, HDIST_MAXBITS); - switch ( bb ) - { - case 0: dist = 1; break; - case 1: dist = 2; break; - case 2: dist = 3; break; - case 3: dist = 4; break; - case 4: dist = 5 + read_bits (data, p, 1); break; - case 5: dist = 7 + read_bits (data, p, 1); break; - case 6: dist = 9 + read_bits (data, p, 2); break; - case 7: dist = 13 + read_bits (data, p, 2); break; - case 8: dist = 17 + read_bits (data, p, 3); break; - case 9: dist = 25 + read_bits (data, p, 3); break; - case 10: dist = 33 + read_bits (data, p, 4); break; - case 11: dist = 49 + read_bits (data, p, 4); break; - case 12: dist = 65 + read_bits (data, p, 5); break; - case 13: dist = 97 + read_bits (data, p, 5); break; - case 14: dist = 129 + read_bits (data, p, 6); break; - case 15: dist = 193 + read_bits (data, p, 6); break; - case 16: dist = 257 + read_bits (data, p, 7); break; - case 17: dist = 385 + read_bits (data, p, 7); break; - case 18: dist = 513 + read_bits (data, p, 8); break; - case 19: dist = 769 + read_bits (data, p, 8); break; - case 20: dist = 1025 + read_bits (data, p, 9); break; - case 21: dist = 1537 + read_bits (data, p, 9); break; - case 22: dist = 2049 + read_bits (data, p, 10); break; - case 23: dist = 3073 + read_bits (data, p, 10); break; - case 24: dist = 4097 + read_bits (data, p, 11); break; - case 25: dist = 6145 + read_bits (data, p, 11); break; - case 26: dist = 8193 + read_bits (data, p, 12); break; - case 27: dist = 12289 + read_bits (data, p, 12); break; - case 28: dist = 16385 + read_bits (data, p, 13); break; - case 29: dist = 24577 + read_bits (data, p, 13); break; - default: - return -1; - } - for ( l=0 ; l 4 byte buf[256]; #endif - byte pal1[128]; - un16 pal2[64]; - un32 pal4[64]; - byte pri[256]; - struct vissprite vs[16]; - int ns, l, x, y, s, t, u, v, wx, wy, wt, wv; + un16 pal[64]; + byte pri[256]; + struct vissprite vs[16]; + int ns, l, x, y, s, t, u, v, wx, wy, wt, wv; }; struct obj { - byte y; - byte x; - byte pat; - byte flags; + byte y; + byte x; + byte pat; + byte flags; }; struct lcd { - byte vbank[2][8192]; - union - { - byte mem[256]; - struct obj obj[40]; - } oam; - byte pal[128]; + byte vbank[2][8192]; + union + { + byte mem[256]; + struct obj obj[40]; + } oam; + byte pal[128]; }; extern struct lcd lcd; @@ -60,14 +58,13 @@ void bg_scan(void) ICODE_ATTR; void wnd_scan(void) ICODE_ATTR; void bg_scan_pri(void) ICODE_ATTR; void wnd_scan_pri(void) ICODE_ATTR; -void spr_count(void); void spr_enum(void) ICODE_ATTR; void spr_scan(void) ICODE_ATTR; void lcd_begin(void) ICODE_ATTR; void lcd_refreshline(void) ICODE_ATTR; void pal_write(int i, byte b) ICODE_ATTR; void pal_write_dmg(int i, int mapnum, byte d) ICODE_ATTR; -void vram_write(int a, byte b) ICODE_ATTR; +void vram_write(addr a, byte b) ICODE_ATTR; void vram_dirty(void) ICODE_ATTR; void pal_dirty(void) ICODE_ATTR; void lcd_reset(void); diff --git a/apps/plugins/rockboy/lcd.c b/apps/plugins/rockboy/lcd.c index 1b285ec1b9..05a6a74068 100644 --- a/apps/plugins/rockboy/lcd.c +++ b/apps/plugins/rockboy/lcd.c @@ -4,9 +4,8 @@ #include "hw.h" #include "mem.h" #include "lcd-gb.h" -#include "rc.h" #include "fb.h" -#include "palette.h" +#include "palette-presets.h" #ifdef USE_ASM #include "asm.h" #endif @@ -26,9 +25,7 @@ struct scan scan IBSS_ATTR; #define PRI (scan.pri) -#define PAL1 (scan.pal1) -#define PAL2 (scan.pal2) -#define PAL4 (scan.pal4) +#define PAL (scan.pal) #define VS (scan.vs) /* vissprites */ #define NS (scan.ns) @@ -53,53 +50,14 @@ byte patpix[4096][8][8] byte patdirty[1024]; byte anydirty; -// static int scale = 1; - -static int rgb332; - -static int sprsort = 1; -static int sprdebug; -static int insync=0; #if LCD_DEPTH < 16 static int scanline_ind=0; #endif -#define DEF_PAL { 0x98d0e0, 0x68a0b0, 0x60707C, 0x2C3C3C } - -static int dmg_pal[4][4] = { DEF_PAL, DEF_PAL, DEF_PAL, DEF_PAL }; - -static int usefilter, filterdmg; -static int filter[3][4] = { - { 195, 25, 0, 35 }, - { 25, 170, 25, 35 }, - { 25, 60, 125, 40 } - }; - -rcvar_t lcd_exports[] = - { - RCV_BOOL("rgb332", &rgb332), - RCV_VECTOR("dmg_bgp", dmg_pal[0], 4), - RCV_VECTOR("dmg_wndp", dmg_pal[1], 4), - RCV_VECTOR("dmg_obp0", dmg_pal[2], 4), - RCV_VECTOR("dmg_obp1", dmg_pal[3], 4), - RCV_BOOL("sprsort", &sprsort), - RCV_BOOL("sprdebug", &sprdebug), - RCV_BOOL("colorfilter", &usefilter), - RCV_BOOL("filterdmg", &filterdmg), - RCV_VECTOR("red", filter[0], 4), - RCV_VECTOR("green", filter[1], 4), - RCV_VECTOR("blue", filter[2], 4), - RCV_END - }; +static int dmg_pal[4][4]; fb_data *vdest; -#ifdef ALLOW_UNALIGNED_IO /* long long is ok since this is i386-only anyway? */ -#define MEMCPY8(d, s) ((*(long long *)(d)) = (*(long long *)(s))) -#else -#define MEMCPY8(d, s) memcpy((d), (s), 8) -#endif - #ifndef ASM_UPDATEPATPIX void updatepatpix(void) { @@ -506,9 +464,10 @@ void tilebuf(void) } -// V = vertical line -// WX = WND start (if 0, no need to do anything) -> WY -// U = start...something...thingy... 7 at most +/* V = vertical line + * WX = WND start (if 0, no need to do anything) -> WY + * U = start...something...thingy... 7 at most + */ void bg_scan(void) { int cnt; @@ -539,7 +498,7 @@ void bg_scan(void) ); #else src = patpix[*(tile++)][V]; - MEMCPY8(dest, src); + memcpy(dest,src,8); dest += 8; #endif cnt -= 8; @@ -574,7 +533,7 @@ void wnd_scan(void) ); #else src = patpix[*(tile++)][WV]; - MEMCPY8(dest, src); + memcpy(dest,src,8); dest += 8; #endif cnt -= 8; @@ -752,33 +711,12 @@ static void recolor(byte *buf, byte fill, int cnt) while (cnt--) *(buf++) |= fill; } -void spr_count(void) -{ - int i; - struct obj *o; - - NS = 0; - if (!(R_LCDC & 0x02)) return; - - o = lcd.oam.obj; - - for (i = 40; i; i--, o++) - { - if (L >= o->y || L + 16 < o->y) - continue; - if (L + 8 >= o->y && !(R_LCDC & 0x04)) - continue; - if (++NS == 10) break; - } -} - void spr_enum(void) { int i, j; struct obj *o; - struct vissprite ts[10]; + struct vissprite ts; int v, pat; - int l, x; NS = 0; if (!(R_LCDC & 0x02)) return; @@ -818,24 +756,19 @@ void spr_enum(void) VS[NS].buf = patpix[pat][v]; if (++NS == 10) break; } - if (!sprsort||hw.cgb) return; - /* not quite optimal but it finally works! */ + if (hw.cgb) return; for (i = 0; i < NS; i++) { - l = 0; - x = VS[0].x; - for (j = 1; j < NS; j++) + for (j = i + 1; j < NS; j++) { - if (VS[j].x < x) + if (VS[i].x > VS[j].x) { - l = j; - x = VS[j].x; + ts = VS[i]; + VS[i] = VS[j]; + VS[j] = ts; } } - ts[i] = VS[l]; - VS[l].x = 160; } - memcpy(VS, ts, sizeof VS); } void spr_scan(void) @@ -854,8 +787,8 @@ void spr_scan(void) for (; ns; ns--, vs--) { x = vs->x; - if (x >= 160) continue; - if (x <= -8) continue; + if (x > 159) continue; + if (x < -7) continue; if (x < 0) { src = vs->buf - x; @@ -891,12 +824,10 @@ void spr_scan(void) } } else while (i--) if (src[i]) dest[i] = pal|src[i]; - /* else while (i--) if (src[i]) dest[i] = 31 + ns; */ } -// if (sprdebug) for (i = 0; i < NS; i++) BUF[i<<1] = 36; } -// Scaling defines +/* Scaling defines */ #define DX ((LCD_WIDTH<<16) / 160) #define DXI ((160<<16) / LCD_WIDTH) #define DY ((LCD_HEIGHT<<16) / 144) @@ -904,18 +835,38 @@ void spr_scan(void) void lcd_begin(void) { -/* if (fb.indexed) - { - if (rgb332) pal_set332(); - else pal_expire(); - } -*/ - if(options.fullscreen) - vdest = fb.ptr; +#if (LCD_WIDTH>=160) && (LCD_HEIGHT>=144) +#define S1 ((LCD_HEIGHT-144)/2)*LCD_WIDTH + ((LCD_WIDTH-160)/2) +#define S2 0 + +#elif (LCD_WIDTH>=160) && (LCD_HEIGHT<=144) +#define S1 ((LCD_WIDTH-160)/2) +#define S2 ((LCD_WIDTH-160)/2) + +#elif (LCD_WIDTH<=160) && (LCD_HEIGHT>=144) +#define S1 ((LCD_HEIGHT-144)/2)*LCD_WIDTH +#define S2 ((LCD_HEIGHT-144)/2)*LCD_WIDTH + +#else +#define S1 0 +#define S2 0 +#endif + +#if (LCD_WIDTH>LCD_HEIGHT) +#define S3 ((LCD_WIDTH-(160*LCD_HEIGHT/144))/2) +#else +#define S3 ((LCD_HEIGHT-(144*LCD_WIDTH/160))/2)*LCD_WIDTH +#endif + + set_pal(); + + if(options.fullscreen == 0) + vdest=fb.ptr+S1; + else if (options.fullscreen == 1) + vdest=fb.ptr+S2; else - vdest=fb.ptr+((LCD_HEIGHT-144)/2)*LCD_WIDTH + ((LCD_WIDTH-160)/2); - + vdest=fb.ptr+S3; WY = R_WY; } @@ -930,11 +881,28 @@ void setvidmode(int mode) { switch(mode) { - case 1: /* Full screen scale */ + case 1: +#if (LCD_WIDTH>=160) && (LCD_HEIGHT>=144) /* Full screen scale */ SCALEWL=DX; SCALEWS=DXI; SCALEHL=DY; SCALEHS=DYI; +#elif (LCD_WIDTH>=160) && (LCD_HEIGHT<144) /* scale the height */ + SCALEWL=1<<16; + SCALEWS=1<<16; + SCALEHL=DY; + SCALEHS=DYI; +#elif (LCD_WIDTH<160) && (LCD_HEIGHT>=144) /* scale the width */ + SCALEWL=DX; + SCALEWS=DXI; + SCALEHL=1<<16; + SCALEHS=1<<16; +#else + SCALEWL=DX; + SCALEWS=DXI; + SCALEHL=DY; + SCALEHS=DYI; +#endif break; case 2: /* Maintain Ratio */ if (DY160 + default: SCALEWL=1<<16; SCALEWS=1<<16; SCALEHL=1<<16; SCALEHS=1<<16; -#else - SCALEWL=DX; - SCALEWS=DXI; - SCALEHL=DY; - SCALEHS=DYI; -#endif } swidth=(160*SCALEWL)>>16; sremain=LCD_WIDTH-swidth; } -char frameout[30]; void lcd_refreshline(void) { - if(!insync) { - if(R_LY!=0) - return; - else - insync=1; - } +#ifdef HAVE_LCD_COLOR + char frameout[30]; +#endif if (!(R_LCDC & 0x80)) return; /* should not happen... */ -#if LCD_HEIGHT < 144 +#if (LCD_HEIGHT <= 128) && !defined(HAVE_LCD_COLOR) if ( (fb.mode==0&&(R_LY >= 128)) || (fb.mode==1&&(R_LY < 16)) || (fb.mode==2&&(R_LY<8||R_LY>=136)) || @@ -1046,8 +1003,7 @@ void lcd_refreshline(void) vid_update(L-((int)(L/9))); #else { - /* Universial Scaling pulled from PrBoom and modified for rockboy */ - /* Needs some thought for screens smaller than the gameboy though */ + /* Universal Scaling pulled from PrBoom and modified for rockboy */ static int hpt IDATA_ATTR=0x8000; @@ -1059,9 +1015,24 @@ void lcd_refreshline(void) register unsigned int remain=sremain; while(wcount--) { - *vdest++ = scan.pal2[scan.buf[srcpt>>16]]; +#if LCD_HEIGHT<144 /* cut off the bottom part of the screen that won't fit */ + if (options.fullscreen==0 && (hpt>>16)>LCD_HEIGHT) + break; +#endif + +#if LCD_WIDTH<160 /* cut off the right part of the screen that won't fit */ + if(options.fullscreen==0 && wcount<(160-LCD_WIDTH)) { + vdest+=wcount; + wcount = 0; + } +#endif + + *vdest++ = PAL[BUF[srcpt>>16]]; srcpt+=SCALEWS; } +#if LCD_HEIGHT<144 + if (options.fullscreen!=0 || (hpt>>16)<(LCD_HEIGHT)) +#endif vdest+=remain; } @@ -1086,15 +1057,16 @@ void lcd_refreshline(void) #endif } - - - - +void set_pal(void) +{ + memcpy(dmg_pal,palettes[options.pal], sizeof dmg_pal); + pal_dirty(); +} #if HAVE_LCD_COLOR static void updatepalette(int i) { - int c, r, g, b, y, u, v, rr, gg; + int c, r, g, b; c = (lcd.pal[i<<1] | ((int)lcd.pal[(i<<1)|1] << 8)) & 0x7FFF; r = (c & 0x001F) << 3; @@ -1104,38 +1076,6 @@ static void updatepalette(int i) g |= (g >> 5); b |= (b >> 5); - if (usefilter && (filterdmg||hw.cgb)) - { - rr = ((r * filter[0][0] + g * filter[0][1] + b * filter[0][2]) >> 8) + filter[0][3]; - gg = ((r * filter[1][0] + g * filter[1][1] + b * filter[1][2]) >> 8) + filter[1][3]; - b = ((r * filter[2][0] + g * filter[2][1] + b * filter[2][2]) >> 8) + filter[2][3]; - r = rr; - g = gg; - } - - if (fb.yuv) - { - y = (((r * 263) + (g * 516) + (b * 100)) >> 10) + 16; - u = (((r * 450) - (g * 377) - (b * 73)) >> 10) + 128; - v = (((r * -152) - (g * 298) + (b * 450)) >> 10) + 128; - if (y < 0) y = 0; if (y > 255) y = 255; - if (u < 0) u = 0; if (u > 255) u = 255; - if (v < 0) v = 0; if (v > 255) v = 255; - PAL4[i] = (y<> fb.cc[0].r) << fb.cc[0].l; g = (g >> fb.cc[1].r) << fb.cc[1].l; b = (b >> fb.cc[2].r) << fb.cc[2].l; @@ -1145,24 +1085,7 @@ static void updatepalette(int i) #elif LCD_PIXELFORMAT == RGB565SWAPPED c = swap16(r|g|b); #endif - - - switch (fb.pelsize) - { - case 1: - PAL1[i] = c; - PAL2[i] = (c<<8) | c; - PAL4[i] = (c<<24) | (c<<16) | (c<<8) | c; - break; - case 2: - PAL2[i] = c; - PAL4[i] = (c<<16) | c; - break; - case 3: - case 4: - PAL4[i] = c; - break; - } + PAL[i] = c; } #endif @@ -1183,7 +1106,6 @@ void pal_write_dmg(int i, int mapnum, byte d) if (hw.cgb) return; - /* if (mapnum >= 2) d = 0xe4; */ for (j = 0; j < 8; j += 2) { c = cmap[(d >> j) & 3]; @@ -1197,7 +1119,7 @@ void pal_write_dmg(int i, int mapnum, byte d) } } -void vram_write(int a, byte b) +void vram_write(addr a, byte b) { lcd.vbank[R_VBK&1][a] = b; if (a >= 0x1800) return; @@ -1235,7 +1157,6 @@ void lcd_reset(void) memset(&lcd, 0, sizeof lcd); lcd_begin(); vram_dirty(); - pal_dirty(); } 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 @@ void stat_trigger(void) { - static const int condbits[4] = { 0x08, 0x30, 0x20, 0x00 }; - int flag = 0; + static const int condbits[4] = { 0x08, 0x10, 0x20, 0x00 }; + int flag = 0; - if ((R_LY < 0x91) && (R_LY == R_LYC)) - { - R_STAT |= 0x04; - if (R_STAT & 0x40) flag = IF_STAT; - } - else R_STAT &= ~0x04; + if (R_LY == R_LYC) + { + R_STAT |= 0x04; + if (R_STAT & 0x40) flag = IF_STAT; + } + else R_STAT &= ~0x04; - if (R_STAT & condbits[R_STAT&3]) flag = IF_STAT; + if (R_STAT & condbits[R_STAT&3]) flag = IF_STAT; - if (!(R_LCDC & 0x80)) flag = 0; - - hw_interrupt(flag, IF_STAT); + if (!(R_LCDC & 0x80)) flag = 0; + + hw_interrupt(flag, IF_STAT); } -void stat_write(byte b) -{ - R_STAT = (R_STAT & 0x07) | (b & 0x78); - if (!hw.cgb &&!(R_STAT & 2)) /* DMG STAT write bug => interrupt */ - hw_interrupt(IF_STAT, IF_STAT); - stat_trigger(); -} - - /* * stat_change is called when a transition results in a change to the * LCD STAT condition (the low 2 bits of R_STAT). It raises or lowers @@ -58,118 +49,118 @@ void stat_write(byte b) static void stat_change(int stat) { - stat &= 3; - R_STAT = (R_STAT & 0x7C) | stat; + stat &= 3; + R_STAT = (R_STAT & 0x7C) | stat; - if (stat != 1) hw_interrupt(0, IF_VBLANK); - /* hw_interrupt((stat == 1) ? IF_VBLANK : 0, IF_VBLANK); */ - stat_trigger(); + if (stat != 1) hw_interrupt(0, IF_VBLANK); + /* hw_interrupt((stat == 1) ? IF_VBLANK : 0, IF_VBLANK); */ + stat_trigger(); } void lcdc_change(byte b) { - byte old = R_LCDC; - R_LCDC = b; - if ((R_LCDC ^ old) & 0x80) /* lcd on/off change */ - { - R_LY = 0; - stat_change(2); - C = 40; - lcd_begin(); - } + byte old = R_LCDC; + R_LCDC = b; + if ((R_LCDC ^ old) & 0x80) /* lcd on/off change */ + { + R_LY = 0; + stat_change(2); + C = 40; + lcd_begin(); + } } void lcdc_trans(void) { - if (!(R_LCDC & 0x80)) - { - while (C <= 0) - { - switch ((byte)(R_STAT & 3)) - { - case 0: - case 1: - stat_change(2); - C += 40; - break; - case 2: - stat_change(3); - C += 86; - break; - case 3: - stat_change(0); - if (hw.hdma & 0x80) - hw_hdma(); - else - C += 102; - break; - } - return; - } - } - while (C <= 0) - { - switch ((byte)(R_STAT & 3)) - { - case 1: - if (!(hw.ilines & IF_VBLANK)) - { - C += 218; - hw_interrupt(IF_VBLANK, IF_VBLANK); - break; - } - if (R_LY == 0) - { - lcd_begin(); - stat_change(2); - C += 40; - break; - } - else if (R_LY < 152) - C += 228; - else if (R_LY == 152) - C += 28; - else - { - R_LY = -1; - C += 200; - } - R_LY++; - stat_trigger(); - break; - case 2: + if (!(R_LCDC & 0x80)) + { + while (C <= 0) + { + switch ((byte)(R_STAT & 3)) + { + case 0: + case 1: + stat_change(2); + C += 40; + break; + case 2: + stat_change(3); + C += 86; + break; + case 3: + stat_change(0); + if (hw.hdma & 0x80) + hw_hdma(); + else + C += 102; + break; + } + return; + } + } + while (C <= 0) + { + switch ((byte)(R_STAT & 3)) + { + case 1: + if (!(hw.ilines & IF_VBLANK)) + { + C += 218; + hw_interrupt(IF_VBLANK, IF_VBLANK); + break; + } + if (R_LY == 0) + { + lcd_begin(); + stat_change(2); + C += 40; + break; + } + else if (R_LY < 152) + C += 228; + else if (R_LY == 152) + C += 28; + else + { + R_LY = -1; + C += 200; + } + R_LY++; + stat_trigger(); + break; + case 2: if (fb.enabled) lcd_refreshline(); stat_change(3); C += 86; break; - case 3: - stat_change(0); - if (hw.hdma & 0x80) - hw_hdma(); - /* FIXME -- how much of the hblank does hdma use?? */ - /* else */ - C += 102; - break; - case 0: - if (++R_LY >= 144) - { - if (cpu.halt) - { - hw_interrupt(IF_VBLANK, IF_VBLANK); - C += 228; - } - else C += 10; - stat_change(1); - break; - } - stat_change(2); - C += 40; - break; - } - } + case 3: + stat_change(0); + if (hw.hdma & 0x80) + hw_hdma(); + /* FIXME -- how much of the hblank does hdma use?? */ + /* else */ + C += 102; + break; + case 0: + if (++R_LY >= 144) + { + if (cpu.halt) + { + hw_interrupt(IF_VBLANK, IF_VBLANK); + C += 228; + } + else C += 10; + stat_change(1); + break; + } + stat_change(2); + C += 40; + break; + } + } } 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 @@ #include "hw.h" #include "lcd-gb.h" #include "rtc-gb.h" -#include "rc.h" #include "save.h" #include "sound.h" static int mbc_table[256] = { - 0, 1, 1, 1, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 3, - 3, 3, 3, 3, 0, 0, 0, 0, 0, 5, 5, 5, MBC_RUMBLE, MBC_RUMBLE, MBC_RUMBLE, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 1, 1, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 3, + 3, 3, 3, 3, 0, 0, 0, 0, 0, 5, 5, 5, MBC_RUMBLE, MBC_RUMBLE, MBC_RUMBLE, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, MBC_HUC3, MBC_HUC1 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, MBC_HUC3, MBC_HUC1 }; static int rtc_table[256] = { - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, - 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0 }; static int batt_table[256] = { - 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, - 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, - 0 + 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, + 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, + 0 }; static int romsize_table[256] = { - 2, 4, 8, 16, 32, 64, 128, 256, 512, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 128, 128, 128 - /* 0, 0, 72, 80, 96 -- actual values but bad to use these! */ + 2, 4, 8, 16, 32, 64, 128, 256, 512, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 128, 128, 128 + /* 0, 0, 72, 80, 96 -- actual values but bad to use these! */ }; static int ramsize_table[256] = { - 1, 1, 1, 4, 16, - 4 /* FIXME - what value should this be?! */ + 1, 1, 1, 4, 16, + 4 /* FIXME - what value should this be?! */ }; @@ -80,304 +79,238 @@ static char sramfile[500]; static char rtcfile[500]; static char saveprefix[500]; -static char *savename; - static int saveslot; static int forcebatt, nobatt; -static int forcedmg, gbamode; +static int forcedmg; static int memfill = -1, memrand = -1; -//static byte romMemory[4*1025*1024]; -int mp3_buffer_size; -void *bufferpos; - static void initmem(void *mem, int size) { - char *p = mem; - if (memrand >= 0) - { - srand(memrand ? memrand : -6 ); //time(0)); - while(size--) *(p++) = rand(); - } - else if (memfill >= 0) - memset(p, memfill, size); + char *p = mem; + if (memrand >= 0) + { + srand(memrand ? memrand : -6 ); /* time(0)); */ + while(size--) *(p++) = rand(); + } + else if (memfill >= 0) + memset(p, memfill, size); } static byte *loadfile(int fd, int *len) { - int c, l = 0, p = 0; - - byte *d, buf[512]; - d=malloc(32768); - for(;;) - { - c = read(fd, buf, sizeof buf); - if (c <= 0) break; - l += c; - memcpy(d+p, buf, c); - p += c; - } - setmallocpos(d+p+64); - *len = l; - return d; + int c, l = 0, p = 0; + + byte *d, buf[512]; + d=malloc(32768); + for(;;) + { + c = read(fd, buf, sizeof buf); + if (c <= 0) break; + l += c; + memcpy(d+p, buf, c); + p += c; + } + setmallocpos(d+p+64); + *len = l; + return d; } -//static byte sram[65536]; int rom_load(void) { - int fd; - byte c, *data, *header; - int len = 0, rlen; + int fd; + byte c, *data, *header; + int len = 0, rlen; - fd = open(romfile, O_RDONLY); - - if (fd<0) { - die("cannot open rom file"); - die(romfile); - return 1; - } + fd = open(romfile, O_RDONLY); + + if (fd<0) { + die("cannot open rom file"); + die(romfile); + return 1; + } - data = loadfile(fd, &len); - header = data; // no zip. = decompress(data, &len); - - memcpy(rom.name, header+0x0134, 16); - if (rom.name[14] & 0x80) rom.name[14] = 0; - if (rom.name[15] & 0x80) rom.name[15] = 0; - rom.name[16] = 0; + data = loadfile(fd, &len); + header = data; /* no zip. = decompress(data, &len); */ + + memcpy(rom.name, header+0x0134, 16); + if (rom.name[14] & 0x80) rom.name[14] = 0; + if (rom.name[15] & 0x80) rom.name[15] = 0; + rom.name[16] = 0; - c = header[0x0147]; - mbc.type = mbc_table[c]; - mbc.batt = (batt_table[c] && !nobatt) || forcebatt; -// mbc.batt = 1; // always store savegame mem. - rtc.batt = rtc_table[c]; - mbc.romsize = romsize_table[header[0x0148]]; - mbc.ramsize = ramsize_table[header[0x0149]]; + c = header[0x0147]; + mbc.type = mbc_table[c]; + mbc.batt = (batt_table[c] && !nobatt) || forcebatt; + rtc.batt = rtc_table[c]; + mbc.romsize = romsize_table[header[0x0148]]; + mbc.ramsize = ramsize_table[header[0x0149]]; - if (!mbc.romsize) { - die("unknown ROM size %02X\n", header[0x0148]); - return 1; - } - if (!mbc.ramsize) { - die("unknown SRAM size %02X\n", header[0x0149]); - return 1; - } + if (!mbc.romsize) { + die("unknown ROM size %02X\n", header[0x0148]); + return 1; + } + if (!mbc.ramsize) { + die("unknown SRAM size %02X\n", header[0x0149]); + return 1; + } - rlen = 16384 * mbc.romsize; - rom.bank = (void *) data; //realloc(data, rlen); - if (rlen > len) memset(rom.bank[0]+len, 0xff, rlen - len); + rlen = 16384 * mbc.romsize; + rom.bank = (void *) data; /* realloc(data, rlen); */ + if (rlen > len) memset(rom.bank[0]+len, 0xff, rlen - len); - ram.sbank = malloc(8192 * mbc.ramsize); - //ram.ibank = malloc(4096*8); + ram.sbank = malloc(8192 * mbc.ramsize); + /* ram.ibank = malloc(4096*8); */ - initmem(ram.sbank, 8192 * mbc.ramsize); - initmem(ram.ibank, 4096 * 8); + initmem(ram.sbank, 8192 * mbc.ramsize); + initmem(ram.ibank, 4096 * 8); - mbc.rombank = 1; - mbc.rambank = 0; + mbc.rombank = 1; + mbc.rambank = 0; - c = header[0x0143]; + c = header[0x0143]; hw.cgb = ((c == 0x80) || (c == 0xc0)) && !forcedmg; - hw.gba = (hw.cgb && gbamode); - - close(fd); + + close(fd); - return 0; + return 0; } int sram_load(void) { - int fd; - char meow[500]; + int fd; + char meow[500]; - if (!mbc.batt || !sramfile || !*sramfile) return -1; + if (!mbc.batt || !sramfile || !*sramfile) return -1; - /* Consider sram loaded at this point, even if file doesn't exist */ - ram.loaded = 1; + /* Consider sram loaded at this point, even if file doesn't exist */ + ram.loaded = 1; - fd = open(sramfile, O_RDONLY); + fd = open(sramfile, O_RDONLY); snprintf(meow,499,"Opening %s %d",sramfile,fd); - rb->splash(HZ*2, true, meow); - if (fd<0) return -1; + rb->splash(HZ*2, true, meow); + if (fd<0) return -1; snprintf(meow,499,"Loading savedata from %s",sramfile); - rb->splash(HZ*2, true, meow); - read(fd,ram.sbank, 8192*mbc.ramsize); - close(fd); - - return 0; + rb->splash(HZ*2, true, meow); + read(fd,ram.sbank, 8192*mbc.ramsize); + close(fd); + + return 0; } int sram_save(void) { - int fd; - char meow[500]; + int fd; + char meow[500]; - /* If we crash before we ever loaded sram, DO NOT SAVE! */ - if (!mbc.batt || !sramfile || !ram.loaded || !mbc.ramsize) - return -1; - fd = open(sramfile, O_WRONLY|O_CREAT|O_TRUNC); -// snprintf(meow,499,"Opening %s %d",sramfile,fd); -// rb->splash(HZ*2, true, meow); - if (fd<0) return -1; - snprintf(meow,499,"Saving savedata to %s",sramfile); - rb->splash(HZ*2, true, meow); - write(fd,ram.sbank, 8192*mbc.ramsize); - close(fd); - - return 0; + /* If we crash before we ever loaded sram, DO NOT SAVE! */ + if (!mbc.batt || !sramfile || !ram.loaded || !mbc.ramsize) + return -1; + fd = open(sramfile, O_WRONLY|O_CREAT|O_TRUNC); + if (fd<0) return -1; + snprintf(meow,499,"Saving savedata to %s",sramfile); + rb->splash(HZ*2, true, meow); + write(fd,ram.sbank, 8192*mbc.ramsize); + close(fd); + + return 0; } void state_save(int n) { - int fd; - char name[500]; + int fd; + char name[500]; - if (n < 0) n = saveslot; - if (n < 0) n = 0; - snprintf(name, 499,"%s.%03d", saveprefix, n); + if (n < 0) n = saveslot; + if (n < 0) n = 0; + snprintf(name, 499,"%s.%03d", saveprefix, n); - if ((fd = open(name, O_WRONLY|O_CREAT|O_TRUNC)>=0)) - { - savestate(fd); - close(fd); - } + if ((fd = open(name, O_WRONLY|O_CREAT|O_TRUNC)>=0)) + { + savestate(fd); + close(fd); + } } void state_load(int n) { - int fd; - char name[500]; + int fd; + char name[500]; - if (n < 0) n = saveslot; - if (n < 0) n = 0; - snprintf(name, 499, "%s.%03d", saveprefix, n); + if (n < 0) n = saveslot; + if (n < 0) n = 0; + snprintf(name, 499, "%s.%03d", saveprefix, n); - if ((fd = open(name, O_RDONLY)>=0)) - { - loadstate(fd); - close(fd); - vram_dirty(); - pal_dirty(); - sound_dirty(); - mem_updatemap(); - } + if ((fd = open(name, O_RDONLY)>=0)) + { + loadstate(fd); + close(fd); + vram_dirty(); + pal_dirty(); + sound_dirty(); + mem_updatemap(); + } } void rtc_save(void) { - int fd; - if (!rtc.batt) return; - if ((fd = open(rtcfile, O_WRONLY|O_CREAT|O_TRUNC))<0) return; - rtc_save_internal(fd); - close(fd); + int fd; + if (!rtc.batt) return; + if ((fd = open(rtcfile, O_WRONLY|O_CREAT|O_TRUNC))<0) return; + rtc_save_internal(fd); + close(fd); } void rtc_load(void) { - int fd; - if (!rtc.batt) return; - if ((fd = open(rtcfile, O_RDONLY))<0) return; - rtc_load_internal(fd); - close(fd); + int fd; + if (!rtc.batt) return; + if ((fd = open(rtcfile, O_RDONLY))<0) return; + rtc_load_internal(fd); + close(fd); } void loader_unload(void) { - sram_save(); -// if (romfile) free(romfile); -// if (sramfile) free(sramfile); -// if (saveprefix) free(saveprefix); -// if (rom.bank) free(rom.bank); -// if (ram.sbank) free(ram.sbank); - romfile = 0; - rom.bank = 0; - ram.sbank = 0; - mbc.type = mbc.romsize = mbc.ramsize = mbc.batt = 0; + sram_save(); + /* if (romfile) free(romfile); + if (sramfile) free(sramfile); + if (saveprefix) free(saveprefix); + if (rom.bank) free(rom.bank); + if (ram.sbank) free(ram.sbank); */ + romfile = 0; + rom.bank = 0; + ram.sbank = 0; + mbc.type = mbc.romsize = mbc.ramsize = mbc.batt = 0; } -/* -static char *base(char *s) -{ - char *p; - p = strrchr(s, '/'); - if (p) return p+1; - return s; -} - - -static char *ldup(char *s) -{ - int i; - char *n, *p; - p = n = malloc(strlen(s)); - for (i = 0; s[i]; i++) if (isalnum(s[i])) *(p++) = tolower(s[i]); - *p = 0; - return n; -}*/ - void cleanup(void) { - sram_save(); - rtc_save(); - // IDEA - if error, write emergency savestate..? + sram_save(); + rtc_save(); + /* IDEA - if error, write emergency savestate..? */ } void loader_init(char *s) { - char *name; -// DIR* dir; + romfile = s; + if(rom_load()) + return; + rb->splash(HZ/2, true, rom.name); + + snprintf(saveprefix, 499, "%s/%s", savedir, rom.name); -// sys_checkdir(savedir, 1); /* needs to be writable */ -/* dir=opendir(savedir); // should be handled when the program opens - if(!dir) - mkdir(savedir); - else - closedir(dir);*/ + strcpy(sramfile, saveprefix); + strcat(sramfile, ".sav"); - romfile = s; - if(rom_load()) - return; - vid_settitle(rom.name); - name = rom.name; - - snprintf(saveprefix, 499, "%s/%s", savedir, name); - - strcpy(sramfile, saveprefix); - strcat(sramfile, ".sav"); - - strcpy(rtcfile, saveprefix); - strcat(rtcfile, ".rtc"); - - sram_load(); - rtc_load(); - - //atexit(cleanup); + strcpy(rtcfile, saveprefix); + strcat(rtcfile, ".rtc"); + + sram_load(); + rtc_load(); } - -rcvar_t loader_exports[] = -{ - RCV_STRING("savedir", &savedir), - RCV_STRING("savename", &savename), - RCV_INT("saveslot", &saveslot), - RCV_BOOL("forcebatt", &forcebatt), - RCV_BOOL("nobatt", &nobatt), - RCV_BOOL("forcedmg", &forcedmg), - RCV_INT("memfill", &memfill), - RCV_INT("memrand", &memrand), - RCV_END -}; - - - - - - - - - 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 @@ typedef struct loader_s { - char *rom; - char *base; - char *sram; - char *state; - int ramloaded; + char *rom; + char *base; + char *sram; + char *state; + int ramloaded; } loader_t; 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 @@ #include "rockmacros.h" #include "input.h" -#include "rc.h" -#include "exports.h" #include "emu.h" #include "loader.h" #include "hw.h" -//#include "Version" - - -static char *defaultconfig[] = -{ - "bind up +up", - "bind down +down", - "bind left +left", - "bind right +right", - "bind joy0 +b", - "bind joy1 +a", - "bind joy2 +select", - "bind joy3 +start", - "bind ins savestate", - "bind del loadstate", - NULL -}; - - void doevents() { - event_t ev; - int st; + event_t ev; + int st; - ev_poll(); - while (ev_getevent(&ev)) - { - if (ev.type != EV_PRESS && ev.type != EV_RELEASE) - continue; - st = (ev.type != EV_RELEASE); - pad_set(ev.code, st); - } + ev_poll(); + while (ev_getevent(&ev)) + { + if (ev.type != EV_PRESS && ev.type != EV_RELEASE) + continue; + st = (ev.type != EV_RELEASE); + pad_set(ev.code, st); + } } - - -/* convenience macro for printing loading state */ -#define PUTS(str) do { \ - rb->lcd_putsxy(1, y, (unsigned char *)str); \ - rb->lcd_getstringsize((unsigned char *)str, &w, &h); \ - y += h + 1; \ -} while (0) - int gnuboy_main(char *rom) { - int i, w, h, y; - - y = 1; - // Avoid initializing video if we don't have to - // If we have special perms, drop them ASAP! - PUTS("Init exports"); - init_exports(); - - PUTS("Loading default config"); - for (i = 0; defaultconfig[i]; i++) - rc_command(defaultconfig[i]); - -// sprintf(cmd, "source %s", rom); -// s = strchr(cmd, '.'); -// if (s) *s = 0; -// strcat(cmd, ".rc"); -// rc_command(cmd); - - // FIXME - make interface modules responsible for atexit() - PUTS("Init video"); - vid_init(); - PUTS("Init sound"); - pcm_init(); - PUTS("Loading rom"); - loader_init(rom); - if(shut) - return PLUGIN_ERROR; - PUTS("Emu reset"); - emu_reset(); - PUTS("Emu run"); -#if (LCD_HEIGHT > 144) || (LCD_WIDTH > 160) + rb->lcd_puts(0,0,"Init video"); + vid_init(); + rb->lcd_puts(0,1,"Init sound"); + pcm_init(); + rb->lcd_puts(0,2,"Loading rom"); + loader_init(rom); + if(shut) + return PLUGIN_ERROR; + rb->lcd_puts(0,3,"Emu reset"); + emu_reset(); + rb->lcd_puts(0,4,"Emu run"); rb->lcd_clear_display(); -// rb->lcd_drawrect((LCD_WIDTH-160)/2-1, (LCD_HEIGHT-144)/2-1, 162, 146); rb->lcd_update(); -#endif - emu_run(); + emu_run(); - // never reached - return PLUGIN_OK; + /* never reached */ + return PLUGIN_OK; } -#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 @@ #include "sound.h" struct mbc mbc IBSS_ATTR; -struct rom rom; +struct rom rom IBSS_ATTR; struct ram ram; @@ -31,7 +31,7 @@ struct ram ram; void mem_updatemap() { int n; - byte **map; + static byte **map; map = mbc.rmap; map[0x0] = rom.bank[0]; @@ -46,16 +46,17 @@ void mem_updatemap() map[0x7] = rom.bank[mbc.rombank] - 0x4000; } else map[0x4] = map[0x5] = map[0x6] = map[0x7] = NULL; - if (0 && (R_STAT & 0x03) == 0x03) - { - map[0x8] = NULL; - map[0x9] = NULL; - } - else - { - map[0x8] = lcd.vbank[R_VBK & 1] - 0x8000; - map[0x9] = lcd.vbank[R_VBK & 1] - 0x8000; - } + if (R_VBK & 1) + { + map[0x8] = lcd.vbank[1] - 0x8000; + map[0x9] = lcd.vbank[1] - 0x8000; + } + else + { + map[0x8] = lcd.vbank[0]/*[R_VBK & 1]*/ - 0x8000; + map[0x9] = lcd.vbank[0]/*[R_VBK & 1]*/ - 0x8000; + + } if (mbc.enableram && !(rtc.sel&8)) { map[0xA] = ram.sbank[mbc.rambank] - 0xA000; @@ -127,18 +128,18 @@ void ioreg_write(byte r, byte b) break; case RI_BGP: if (R_BGP == b) break; - pal_write_dmg(0, 0, b); - pal_write_dmg(8, 1, b); + /* pal_write_dmg(0, 0, b); */ /*Disabled in iBoy and WAC-gnuboyCE */ + /* pal_write_dmg(8, 1, b); */ /*Disabled in iBoy and WAC-gnuboyCE */ R_BGP = b; break; case RI_OBP0: if (R_OBP0 == b) break; - pal_write_dmg(64, 2, b); + /* pal_write_dmg(64, 2, b); */ /*Disabled in iBoy and WAC-gnuboyCE */ R_OBP0 = b; break; case RI_OBP1: if (R_OBP1 == b) break; - pal_write_dmg(72, 3, b); + /* pal_write_dmg(72, 3, b); */ /*Disabled in iBoy and WAC-gnuboyCE */ R_OBP1 = b; break; case RI_IF: @@ -166,7 +167,8 @@ void ioreg_write(byte r, byte b) lcdc_change(b); break; case RI_STAT: - stat_write(b); + REG(r) = (REG(r) & 0x07) | (b & 0x78); + stat_trigger(); break; case RI_LYC: REG(r) = b; @@ -220,21 +222,6 @@ void ioreg_write(byte r, byte b) hw_hdma_cmd(b); break; } - switch (r) - { - case RI_BGP: - case RI_OBP0: - case RI_OBP1: - /* printf("palette reg %02X write %02X at LY=%02X\n", r, b, R_LY); */ - case RI_HDMA1: - case RI_HDMA2: - case RI_HDMA3: - case RI_HDMA4: - case RI_HDMA5: - /* printf("HDMA %d: %02X\n", r - RI_HDMA1 + 1, b); */ - break; - } - /* printf("reg %02X => %02X (%02X)\n", r, REG(r), b); */ } @@ -410,29 +397,31 @@ void mbc_write(int a, byte b) break; } break; - case MBC_HUC3: - switch (ha & 0xE) - { - case 0x0: - mbc.enableram = ((b & 0x0F) == 0x0A); - break; - case 0x2: - b &= 0x7F; - mbc.rombank = b ? b : 1; - break; - case 0x4: - rtc.sel = b & 0x0f; - mbc.rambank = b & 0x03; - break; - case 0x6: - rtc_latch(b); - break; - } - break; - } + case MBC_HUC3: /* FIXME - this is all guesswork -- is it right??? */ + switch (ha & 0xE) + { + case 0x0: + mbc.enableram = ((b & 0x0F) == 0x0A); + break; + case 0x2: + if (!b) b = 1; + mbc.rombank = b; + break; + case 0x4: + if (mbc.model) + { + mbc.rambank = b & 0x03; + break; + } + break; + case 0x6: + mbc.model = b & 1; + break; + } + break; + } mbc.rombank &= (mbc.romsize - 1); mbc.rambank &= (mbc.ramsize - 1); - /* printf("%02X\n", mbc.rombank); */ mem_updatemap(); } @@ -494,7 +483,8 @@ void mem_write(int a, byte b) /* return writehi(a & 0xFF, b); */ if (a >= 0xFF10 && a <= 0xFF3F) { - sound_write(a & 0xFF, b); + if(options.sound) + sound_write(a & 0xFF, b); break; } if ((a & 0xFF80) == 0xFF80 && a != 0xFFFF) @@ -530,14 +520,12 @@ byte mem_read(int a) case 0x8: /* if ((R_STAT & 0x03) == 0x03) return 0xFF; */ return lcd.vbank[R_VBK&1][a & 0x1FFF]; - case 0xA: - if (!mbc.enableram && mbc.type == MBC_HUC3) - return 0x01; - if (!mbc.enableram) - return 0xFF; - if (rtc.sel&8) - return rtc.regs[rtc.sel&7]; - return ram.sbank[mbc.rambank][a & 0x1FFF]; + case 0xA: + if (!mbc.enableram) + return 0xFF; + if (rtc.sel&8) + return rtc.regs[rtc.sel&7]; + return ram.sbank[mbc.rambank][a & 0x1FFF]; case 0xC: if ((a & 0xF000) == 0xC000) return ram.ibank[0][a & 0x0FFF]; @@ -554,7 +542,12 @@ byte mem_read(int a) /* return readhi(a & 0xFF); */ if (a == 0xFFFF) return REG(0xFF); if (a >= 0xFF10 && a <= 0xFF3F) - return sound_read(a & 0xFF); + { + if(options.sound) + return sound_read(a & 0xFF); + else + return 1; + } if ((a & 0xFF80) == 0xFF80) return ram.hi[a & 0xFF]; 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 @@ struct mbc { - int type; - int model; - int rombank; - int rambank; - int romsize; - int ramsize; - int enableram; - int batt; - byte *rmap[0x10], *wmap[0x10]; + int type; + int model; + int rombank; + int rambank; + int romsize; + int ramsize; + int enableram; + int batt; + byte *rmap[0x10], *wmap[0x10]; }; struct rom { - byte (*bank)[16384]; - char name[20]; + byte (*bank)[16384]; + char name[20]; }; struct ram { - byte hi[256]; - byte ibank[8][4096]; - byte (*sbank)[8192]; - int loaded; + byte hi[256]; + byte ibank[8][4096]; + byte (*sbank)[8192]; + int loaded; }; 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 @@ #define MENU_BUTTON_DOWN BUTTON_SCROLL_FWD #define MENU_BUTTON_LEFT BUTTON_LEFT #define MENU_BUTTON_RIGHT BUTTON_RIGHT + +#elif (CONFIG_KEYPAD == IRIVER_H10_PAD) +#define MENU_BUTTON_UP BUTTON_SCROLL_UP +#define MENU_BUTTON_DOWN BUTTON_SCROLL_DOWN +#define MENU_BUTTON_LEFT BUTTON_LEFT +#define MENU_BUTTON_RIGHT BUTTON_RIGHT + #else #define MENU_BUTTON_UP BUTTON_UP #define MENU_BUTTON_DOWN BUTTON_DOWN @@ -322,9 +329,9 @@ static void do_opt_menu(void) }; static const struct opt_items fullscreen[]= { - { "Off", -1 }, - { "Fullscreen", -1 }, - { "Full - Maintain Ratio", -1 }, + { "Unscaled", -1 }, + { "Scaled", -1 }, + { "Scaled - Maintain Ratio", -1 }, }; static const struct opt_items frameskip[]= { @@ -333,13 +340,38 @@ static void do_opt_menu(void) { "5 Max", -1 }, { "6 Max", -1 }, }; + +#ifdef HAVE_LCD_COLOR + static const struct opt_items palette[]= { + { "Brown (Default)", -1 }, + { "Gray", -1 }, + { "Light Gray", -1 }, + { "Multi-Color 1", -1 }, + { "Multi-Color 2", -1 }, + { "Adventure Island", -1 }, + { "Adventure Island 2", -1 }, + { "Balloon Kid", -1 }, + { "Batman", -1 }, + { "Batman: Return of Joker", -1 }, + { "Bionic Commando", -1 }, + { "Castlvania Adventure", -1 }, + { "Donkey Kong Land", -1 }, + { "Dr. Mario", -1 }, + { "Kirby", -1 }, + { "Metroid", -1 }, + { "Zelda", -1 }, + }; +#endif static const struct menu_item items[] = { { "Max Frameskip", NULL }, { "Sound" , NULL }, { "Stats" , NULL }, - { "Fullscreen" , NULL }, + { "Screen Options" , NULL }, { "Set Keys (Buggy)", NULL }, +#ifdef HAVE_LCD_COLOR + { "Set Palette" , NULL }, +#endif }; m = rb->menu_init(items, sizeof(items) / sizeof(*items), NULL, NULL, NULL, NULL); @@ -359,6 +391,7 @@ static void do_opt_menu(void) case 1: /* Sound */ if(options.sound>1) options.sound=1; rb->set_option(items[1].desc, &options.sound, INT, onoff, 2, NULL ); + if(options.sound) sound_dirty(); break; case 2: /* Stats */ rb->set_option(items[2].desc, &options.showstats, INT, onoff, 2, NULL ); @@ -370,6 +403,12 @@ static void do_opt_menu(void) case 4: /* Keys */ setupkeys(); break; +#ifdef HAVE_LCD_COLOR + case 5: /* Palette */ + rb->set_option(items[5].desc, &options.pal, INT, palette, 17, NULL ); + set_pal(); + break; +#endif default: done=true; 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 @@ static byte noise7[] ICONST_ATTR = { - 0xfd,0xf3,0xd7,0x0d,0xd3,0x15,0x82,0xf1, - 0xdb,0x25,0x21,0x39,0x68,0x8c,0xd5,0x00, + 0xfb,0xe7,0xae,0x1b,0xa6,0x2b,0x05,0xe3, + 0xb6,0x4a,0x42,0x72,0xd1,0x19,0xaa,0x03, }; static byte noise15[] ICONST_ATTR = { - 0xff,0xfd,0xff,0xf3,0xff,0xd7,0xff,0x0f, - 0xfd,0xdf,0xf3,0x3f,0xd5,0x7f,0x00,0xfd, - 0xfd,0xf3,0xf3,0xd7,0xd7,0x0f,0x0d,0xdd, - 0xd3,0x33,0x15,0x55,0x80,0x02,0xff,0xf1, - 0xff,0xdb,0xff,0x27,0xfd,0x2f,0xf1,0x1f, - 0xd9,0xbf,0x2a,0x7d,0x02,0xf1,0xf1,0xdb, - 0xdb,0x27,0x25,0x2d,0x21,0x11,0x39,0x99, - 0x6a,0xa8,0x80,0x0c,0xff,0xd5,0xff,0x03, - 0xfd,0xf7,0xf3,0xcf,0xd7,0x5f,0x0c,0x3d, - 0xd7,0x73,0x0c,0xd5,0xd5,0x03,0x01,0xf5, - 0xfb,0xc3,0xe7,0x77,0xac,0xce,0x15,0x5b, - 0x80,0x26,0xff,0x29,0xfd,0x0b,0xf1,0xc7, - 0xdb,0x6f,0x24,0x9d,0x24,0xb1,0x24,0x59, - 0x26,0x29,0x2b,0x09,0x05,0xc9,0xe3,0x4b, - 0xb4,0x46,0x46,0x6a,0x6a,0x82,0x80,0xf0, - 0xfd,0xdd,0xf3,0x33,0xd5,0x57,0x00,0x0d, - 0xff,0xd3,0xff,0x17,0xfd,0x8f,0xf2,0xdf, - 0xd1,0x3f,0x19,0x7d,0xa8,0xf2,0x0d,0xd3, - 0xd3,0x17,0x15,0x8d,0x82,0xd2,0xf1,0x11, - 0xd9,0x9b,0x2a,0xa5,0x00,0x21,0xff,0x3b, - 0xfd,0x67,0xf0,0xaf,0xdc,0x1f,0x37,0xbd, - 0x4e,0x70,0x5a,0xde,0x21,0x3b,0x39,0x65, - 0x68,0xa0,0x8c,0x3c,0xd7,0x75,0x0c,0xc1, - 0xd5,0x7b,0x00,0xe5,0xfd,0xa3,0xf2,0x37, - 0xd3,0x4f,0x14,0x5d,0x86,0x32,0xeb,0x51, - 0x84,0x1a,0xe7,0xa1,0xae,0x3a,0x1b,0x63, - 0xa4,0xb6,0x24,0x4b,0x26,0x45,0x2a,0x61, - 0x02,0xb9,0xf0,0x6b,0xde,0x87,0x38,0xed, - 0x6d,0x90,0x92,0x9c,0x90,0xb4,0x9c,0x44, - 0xb6,0x64,0x4a,0xa6,0x40,0x2a,0x7f,0x02, - 0xfd,0xf1,0xf3,0xdb,0xd7,0x27,0x0d,0x2d, - 0xd1,0x13,0x19,0x95,0xaa,0x82,0x00,0xf3, - 0xfd,0xd7,0xf3,0x0f,0xd5,0xdf,0x03,0x3d, - 0xf5,0x73,0xc0,0xd7,0x7d,0x0c,0xf1,0xd5, - 0xdb,0x03,0x25,0xf5,0x23,0xc1,0x37,0x79, - 0x4c,0xe8,0x55,0x8e,0x02,0xdb,0xf1,0x27, - 0xd9,0x2f,0x29,0x1d,0x09,0xb1,0xca,0x5b, - 0x42,0x24,0x73,0x26,0xd5,0x29,0x01,0x09, - 0xf9,0xcb,0xeb,0x47,0x84,0x6e,0xe6,0x99, - 0xa8,0xaa,0x0c,0x03,0xd7,0xf7,0x0f,0xcd, - 0xdf,0x53,0x3c,0x15,0x77,0x80,0xce,0xfd, - 0x59,0xf0,0x2b,0xdf,0x07,0x3d,0xed,0x73, - 0x90,0xd6,0x9d,0x08,0xb1,0xcc,0x5b,0x56, - 0x24,0x0b,0x27,0xc5,0x2f,0x61,0x1c,0xb9, - 0xb4,0x6a,0x46,0x82,0x68,0xf2,0x8d,0xd0, - 0xd3,0x1d,0x15,0xb1,0x82,0x5a,0xf2,0x21, - 0xd3,0x3b,0x15,0x65,0x80,0xa2,0xfc,0x31, - 0xf7,0x5b,0xcc,0x27,0x57,0x2c,0x0d,0x17, - 0xd1,0x8f,0x1a,0xdd,0xa1,0x32,0x39,0x53, - 0x68,0x14,0x8f,0x84,0xde,0xe5,0x39,0xa1, - 0x6a,0x38,0x83,0x6c,0xf4,0x95,0xc4,0x83, - 0x64,0xf4,0xa5,0xc4,0x23,0x67,0x34,0xad, - 0x44,0x10,0x67,0x9e,0xae,0xb8,0x18,0x6f, - 0xae,0x9e,0x18,0xbb,0xac,0x66,0x16,0xab, - 0x88,0x06,0xcf,0xe9,0x5f,0x88,0x3e,0xcf, - 0x79,0x5c,0xe8,0x35,0x8f,0x42,0xdc,0x71, - 0x36,0xd9,0x49,0x28,0x49,0x0e,0x49,0xda, - 0x4b,0x22,0x45,0x32,0x61,0x52,0xb8,0x10, - 0x6f,0x9e,0x9e,0xb8,0xb8,0x6c,0x6e,0x96, - 0x98,0x88,0xac,0xcc,0x15,0x57,0x80,0x0e, - 0xff,0xd9,0xff,0x2b,0xfd,0x07,0xf1,0xef, - 0xdb,0x9f,0x26,0xbd,0x28,0x71,0x0e,0xd9, - 0xd9,0x2b,0x29,0x05,0x09,0xe1,0xcb,0xbb, - 0x46,0x64,0x6a,0xa6,0x80,0x28,0xff,0x0d, - 0xfd,0xd3,0xf3,0x17,0xd5,0x8f,0x02,0xdd, - 0xf1,0x33,0xd9,0x57,0x28,0x0d,0x0f,0xd1, - 0xdf,0x1b,0x3d,0xa5,0x72,0x20,0xd3,0x3d, - 0x15,0x71,0x80,0xda,0xfd,0x21,0xf1,0x3b, - 0xd9,0x67,0x28,0xad,0x0c,0x11,0xd7,0x9b, - 0x0e,0xa5,0xd8,0x23,0x2f,0x35,0x1d,0x41, - 0xb0,0x7a,0x5e,0xe2,0x39,0xb3,0x6a,0x54, - 0x82,0x04,0xf3,0xe5,0xd7,0xa3,0x0e,0x35, - 0xdb,0x43,0x24,0x75,0x26,0xc1,0x29,0x79, - 0x08,0xe9,0xcd,0x8b,0x52,0xc4,0x11,0x67, - 0x98,0xae,0xac,0x18,0x17,0xaf,0x8e,0x1e, - 0xdb,0xb9,0x26,0x69,0x2a,0x89,0x00,0xc9, - 0xfd,0x4b,0xf0,0x47,0xde,0x6f,0x3a,0x9d, - 0x60,0xb0,0xbc,0x5c,0x76,0x36,0xcb,0x49, - 0x44,0x48,0x66,0x4e,0xaa,0x58,0x02,0x2f, - 0xf3,0x1f,0xd5,0xbf,0x02,0x7d,0xf2,0xf3, - 0xd1,0xd7,0x1b,0x0d,0xa5,0xd2,0x23,0x13, - 0x35,0x95,0x42,0x80,0x70,0xfe,0xdd,0xf9, - 0x33,0xe9,0x57,0x88,0x0e,0xcf,0xd9,0x5f, - 0x28,0x3d,0x0f,0x71,0xdc,0xdb,0x35,0x25, - 0x41,0x20,0x79,0x3e,0xe9,0x79,0x88,0xea, - 0xcd,0x81,0x52,0xf8,0x11,0xef,0x9b,0x9e, - 0xa6,0xb8,0x28,0x6f,0x0e,0x9d,0xd8,0xb3, - 0x2c,0x55,0x16,0x01,0x8b,0xfa,0xc7,0xe1, - 0x6f,0xb8,0x9e,0x6c,0xba,0x94,0x60,0x86, - 0xbc,0xe8,0x75,0x8e,0xc2,0xd9,0x71,0x28, - 0xd9,0x0d,0x29,0xd1,0x0b,0x19,0xc5,0xab, - 0x62,0x04,0xb3,0xe4,0x57,0xa6,0x0e,0x2b, - 0xdb,0x07,0x25,0xed,0x23,0x91,0x36,0x99, - 0x48,0xa8,0x4c,0x0e,0x57,0xda,0x0f,0x23, - 0xdd,0x37,0x31,0x4d,0x58,0x50,0x2e,0x1f, - 0x1b,0xbd,0xa6,0x72,0x2a,0xd3,0x01,0x15, - 0xf9,0x83,0xea,0xf7,0x81,0xce,0xfb,0x59, - 0xe4,0x2b,0xa7,0x06,0x2d,0xeb,0x13,0x85, - 0x96,0xe2,0x89,0xb0,0xca,0x5d,0x42,0x30, - 0x73,0x5e,0xd4,0x39,0x07,0x69,0xec,0x8b, - 0x94,0xc6,0x85,0x68,0xe0,0x8d,0xbc,0xd2, - 0x75,0x12,0xc1,0x91,0x7a,0x98,0xe0,0xad, - 0xbc,0x12,0x77,0x92,0xce,0x91,0x58,0x98, - 0x2c,0xaf,0x14,0x1d,0x87,0xb2,0xee,0x51, - 0x9a,0x1a,0xa3,0xa0,0x36,0x3f,0x4b,0x7c, - 0x44,0xf6,0x65,0xca,0xa3,0x40,0x34,0x7f, - 0x46,0xfc,0x69,0xf6,0x8b,0xc8,0xc7,0x4d, - 0x6c,0x50,0x96,0x1c,0x8b,0xb4,0xc6,0x45, - 0x6a,0x60,0x82,0xbc,0xf0,0x75,0xde,0xc3, - 0x39,0x75,0x68,0xc0,0x8d,0x7c,0xd0,0xf5, - 0x1d,0xc1,0xb3,0x7a,0x54,0xe2,0x05,0xb3, - 0xe2,0x57,0xb2,0x0e,0x53,0xda,0x17,0x23, - 0x8d,0x36,0xd1,0x49,0x18,0x49,0xae,0x4a, - 0x1a,0x43,0xa2,0x76,0x32,0xcb,0x51,0x44, - 0x18,0x67,0xae,0xae,0x18,0x1b,0xaf,0xa6, - 0x1e,0x2b,0xbb,0x06,0x65,0xea,0xa3,0x80, - 0x36,0xff,0x49,0xfc,0x4b,0xf6,0x47,0xca, - 0x6f,0x42,0x9c,0x70,0xb6,0xdc,0x49,0x36, - 0x49,0x4a,0x48,0x42,0x4e,0x72,0x5a,0xd2, - 0x21,0x13,0x39,0x95,0x6a,0x80,0x80,0xfc, - 0xfd,0xf5,0xf3,0xc3,0xd7,0x77,0x0c,0xcd, - 0xd5,0x53,0x00,0x15,0xff,0x83,0xfe,0xf7, - 0xf9,0xcf,0xeb,0x5f,0x84,0x3e,0xe7,0x79, - 0xac,0xea,0x15,0x83,0x82,0xf6,0xf1,0xc9, - 0xdb,0x4b,0x24,0x45,0x26,0x61,0x2a,0xb9, - 0x00,0x69,0xfe,0x8b,0xf8,0xc7,0xed,0x6f, - 0x90,0x9e,0x9c,0xb8,0xb4,0x6c,0x46,0x96, - 0x68,0x8a,0x8c,0xc0,0xd5,0x7d,0x00,0xf1, - 0xfd,0xdb,0xf3,0x27,0xd5,0x2f,0x01,0x1d, - 0xf9,0xb3,0xea,0x57,0x82,0x0e,0xf3,0xd9, - 0xd7,0x2b,0x0d,0x05,0xd1,0xe3,0x1b,0xb5, - 0xa6,0x42,0x2a,0x73,0x02,0xd5,0xf1,0x03, - 0xd9,0xf7,0x2b,0xcd,0x07,0x51,0xec,0x1b, - 0x97,0xa6,0x8e,0x28,0xdb,0x0d,0x25,0xd1, - 0x23,0x19,0x35,0xa9,0x42,0x08,0x73,0xce, - 0xd7,0x59,0x0c,0x29,0xd7,0x0b,0x0d,0xc5, - 0xd3,0x63,0x14,0xb5,0x84,0x42,0xe6,0x71, - 0xaa,0xda,0x01,0x23,0xf9,0x37,0xe9,0x4f, - 0x88,0x5e,0xce,0x39,0x5b,0x68,0x24,0x8f, - 0x24,0xdd,0x25,0x31,0x21,0x59,0x38,0x29, - 0x6f,0x08,0x9d,0xcc,0xb3,0x54,0x54,0x06, - 0x07,0xeb,0xef,0x87,0x9e,0xee,0xb9,0x98, - 0x6a,0xae,0x80,0x18,0xff,0xad,0xfe,0x13, - 0xfb,0x97,0xe6,0x8f,0xa8,0xde,0x0d,0x3b, - 0xd1,0x67,0x18,0xad,0xac,0x12,0x17,0x93, - 0x8e,0x96,0xd8,0x89,0x2c,0xc9,0x15,0x49, - 0x80,0x4a,0xfe,0x41,0xfa,0x7b,0xe2,0xe7, - 0xb1,0xae,0x5a,0x1a,0x23,0xa3,0x36,0x35, - 0x4b,0x40,0x44,0x7e,0x66,0xfa,0xa9,0xe0, - 0x0b,0xbf,0xc6,0x7f,0x6a,0xfc,0x81,0xf4, - 0xfb,0xc5,0xe7,0x63,0xac,0xb6,0x14,0x4b, - 0x86,0x46,0xea,0x69,0x82,0x8a,0xf0,0xc1, - 0xdd,0x7b,0x30,0xe5,0x5d,0xa0,0x32,0x3f, - 0x53,0x7c,0x14,0xf7,0x85,0xce,0xe3,0x59, - 0xb4,0x2a,0x47,0x02,0x6d,0xf2,0x93,0xd0, - 0x97,0x1c,0x8d,0xb4,0xd2,0x45,0x12,0x61, - 0x92,0xba,0x90,0x60,0x9e,0xbc,0xb8,0x74, - 0x6e,0xc6,0x99,0x68,0xa8,0x8c,0x0c,0xd7, - 0xd5,0x0f,0x01,0xdd,0xfb,0x33,0xe5,0x57, - 0xa0,0x0e,0x3f,0xdb,0x7f,0x24,0xfd,0x25, - 0xf1,0x23,0xd9,0x37,0x29,0x4d,0x08,0x51, - 0xce,0x1b,0x5b,0xa4,0x26,0x27,0x2b,0x2d, - 0x05,0x11,0xe1,0x9b,0xba,0xa6,0x60,0x2a, - 0xbf,0x00,0x7d,0xfe,0xf3,0xf9,0xd7,0xeb, - 0x0f,0x85,0xde,0xe3,0x39,0xb5,0x6a,0x40, - 0x82,0x7c,0xf2,0xf5,0xd1,0xc3,0x1b,0x75, - 0xa4,0xc2,0x25,0x73,0x20,0xd5,0x3d,0x01, - 0x71,0xf8,0xdb,0xed,0x27,0x91,0x2e,0x99, - 0x18,0xa9,0xac,0x0a,0x17,0xc3,0x8f,0x76, - 0xdc,0xc9,0x35,0x49,0x40,0x48,0x7e,0x4e, - 0xfa,0x59,0xe2,0x2b,0xb3,0x06,0x55,0xe2, - 0x03,0x83,0xf6,0xf7,0xc9,0xcf,0x4b,0x5c, - 0x04,0x3e,0x67,0x4e,0xac,0x60,0x17,0x7f, - 0x80,0xfe,0xc1,0xf9,0x7b,0xe8,0xe7,0x87, - 0xae,0xc2,0x19,0x93,0xfc,0x96,0x08,0x8f, - 0xc0,0xe7,0xfc,0x2c,0xf0,0x1d,0xcc,0xc3, - 0x9e,0x70,0x00,0xc0,0x63,0x7f,0x54,0x78, - 0x40,0xfe,0x61,0x9b,0xf3,0x40,0x64,0x3f, - 0x0f,0xf8,0x2c,0xf3,0x3f,0x99,0x83,0x2a, - 0x79,0x07,0xcb,0xe1,0x9f,0xcc,0xce,0x60, - 0x6c,0x00,0x84,0x7c,0x0f,0xf5,0xe8,0xcf, - 0x15,0x66,0x80,0xb0,0xf8,0x5d,0xf4,0x33, - 0x8a,0x57,0x44,0x0c,0x67,0xd6,0xaf,0x08, - 0x1f,0xcf,0xb3,0x5e,0x54,0x3a,0x07,0x63, - 0xec,0xb7,0x94,0x4e,0x86,0x58,0xea,0x2d, - 0x83,0x12,0xf5,0x91,0xc2,0x9b,0x70,0xa4, - 0xdc,0x25,0x37,0x21,0x4d,0x38,0x51,0x6e, - 0x18,0x9b,0xac,0xa6,0x14,0x2b,0x87,0x06, - 0xed,0xe9,0x93,0x8a,0x96,0xc0,0x89,0x7c, - 0xc8,0xf5,0x4d,0xc0,0x53,0x7e,0x14,0xfb, - 0x85,0xe6,0xe3,0xa9,0xb6,0x0a,0x4b,0xc2, - 0x47,0x72,0x6c,0xd2,0x95,0x10,0x81,0x9c, - 0xfa,0xb5,0xe0,0x43,0xbe,0x76,0x7a,0xca, - 0xe1,0x41,0xb8,0x7a,0x6e,0xe2,0x99,0xb0, - 0xaa,0x5c,0x02,0x37,0xf3,0x4f,0xd4,0x5f, - 0x06,0x3d,0xeb,0x73,0x84,0xd6,0xe5,0x09, - 0xa1,0xca,0x3b,0x43,0x64,0x74,0xa6,0xc4, - 0x29,0x67,0x08,0xad,0xcc,0x13,0x57,0x94, - 0x0e,0x87,0xd8,0xef,0x2d,0x9d,0x12,0xb1, - 0x90,0x5a,0x9e,0x20,0xbb,0x3c,0x65,0x76, - 0xa0,0xc8,0x3d,0x4f,0x70,0x5c,0xde,0x35, - 0x3b,0x41,0x64,0x78,0xa6,0xec,0x29,0x97, - 0x0a,0x8d,0xc0,0xd3,0x7d,0x14,0xf1,0x85, - 0xda,0xe3,0x21,0xb5,0x3a,0x41,0x62,0x78, - 0xb2,0xec,0x51,0x96,0x1a,0x8b,0xa0,0xc6, - 0x3d,0x6b,0x70,0x84,0xdc,0xe5,0x35,0xa1, - 0x42,0x38,0x73,0x6e,0xd4,0x99,0x04,0xa9, - 0xe4,0x0b,0xa7,0xc6,0x2f,0x6b,0x1c,0x85, - 0xb4,0xe2,0x45,0xb2,0x62,0x52,0xb2,0x10, - 0x53,0x9e,0x16,0xbb,0x88,0x66,0xce,0xa9, - 0x58,0x08,0x2f,0xcf,0x1f,0x5d,0xbc,0x32, - 0x77,0x52,0xcc,0x11,0x57,0x98,0x0e,0xaf, - 0xd8,0x1f,0x2f,0xbd,0x1e,0x71,0xba,0xda, - 0x61,0x22,0xb9,0x30,0x69,0x5e,0x88,0x38, - 0xcf,0x6d,0x5c,0x90,0x34,0x9f,0x44,0xbc, - 0x64,0x76,0xa6,0xc8,0x29,0x4f,0x08,0x5d, - 0xce,0x33,0x5b,0x54,0x24,0x07,0x27,0xed, - 0x2f,0x91,0x1e,0x99,0xb8,0xaa,0x6c,0x02, - 0x97,0xf0,0x8f,0xdc,0xdf,0x35,0x3d,0x41, - 0x70,0x78,0xde,0xed,0x39,0x91,0x6a,0x98, - 0x80,0xac,0xfc,0x15,0xf7,0x83,0xce,0xf7, - 0x59,0xcc,0x2b,0x57,0x04,0x0d,0xe7,0xd3, - 0xaf,0x16,0x1d,0x8b,0xb2,0xc6,0x51,0x6a, - 0x18,0x83,0xac,0xf6,0x15,0xcb,0x83,0x46, - 0xf4,0x69,0xc6,0x8b,0x68,0xc4,0x8d,0x64, - 0xd0,0xa5,0x1c,0x21,0xb7,0x3a,0x4d,0x62, - 0x50,0xb2,0x1c,0x53,0xb6,0x16,0x4b,0x8a, - 0x46,0xc2,0x69,0x72,0x88,0xd0,0xcd,0x1d, - 0x51,0xb0,0x1a,0x5f,0xa2,0x3e,0x33,0x7b, - 0x54,0xe4,0x05,0xa7,0xe2,0x2f,0xb3,0x1e, - 0x55,0xba,0x02,0x63,0xf2,0xb7,0xd0,0x4f, - 0x1e,0x5d,0xba,0x32,0x63,0x52,0xb4,0x10, - 0x47,0x9e,0x6e,0xba,0x98,0x60,0xae,0xbc, - 0x18,0x77,0xae,0xce,0x19,0x5b,0xa8,0x26, - 0x0f,0x2b,0xdd,0x07,0x31,0xed,0x5b,0x90, - 0x26,0x9f,0x28,0xbd,0x0c,0x71,0xd6,0xdb, - 0x09,0x25,0xc9,0x23,0x49,0x34,0x49,0x46, - 0x48,0x6a,0x4e,0x82,0x58,0xf2,0x2d,0xd3, - 0x13,0x15,0x95,0x82,0x82,0xf0,0xf1,0xdd, - 0xdb,0x33,0x25,0x55,0x20,0x01,0x3f,0xf9, - 0x7f,0xe8,0xff,0x8d,0xfe,0xd3,0xf9,0x17, - 0xe9,0x8f,0x8a,0xde,0xc1,0x39,0x79,0x68, - 0xe8,0x8d,0x8c,0xd2,0xd5,0x11,0x01,0x99, - 0xfa,0xab,0xe0,0x07,0xbf,0xee,0x7f,0x9a, - 0xfe,0xa1,0xf8,0x3b,0xef,0x67,0x9c,0xae, - 0xb4,0x18,0x47,0xae,0x6e,0x1a,0x9b,0xa0, - 0xa6,0x3c,0x2b,0x77,0x04,0xcd,0xe5,0x53, - 0xa0,0x16,0x3f,0x8b,0x7e,0xc4,0xf9,0x65, - 0xe8,0xa3,0x8c,0x36,0xd7,0x49,0x0c,0x49, - 0xd6,0x4b,0x0a,0x45,0xc2,0x63,0x72,0xb4, - 0xd0,0x45,0x1e,0x61,0xba,0xba,0x60,0x62, - 0xbe,0xb0,0x78,0x5e,0xee,0x39,0x9b,0x6a, - 0xa4,0x80,0x24,0xff,0x25,0xfd,0x23,0xf1, - 0x37,0xd9,0x4f,0x28,0x5d,0x0e,0x31,0xdb, - 0x5b,0x24,0x25,0x27,0x21,0x2d,0x39,0x11, - 0x69,0x98,0x8a,0xac,0xc0,0x15,0x7f,0x80, - 0xfe,0xfd,0xf9,0xf3,0xeb,0xd7,0x87,0x0e, - 0xed,0xd9,0x93,0x2a,0x95,0x00,0x81,0xfc, - 0xfb,0xf5,0xe7,0xc3,0xaf,0x76,0x1c,0xcb, - 0xb5,0x46,0x40,0x6a,0x7e,0x82,0xf8,0xf1, - 0xed,0xdb,0x93,0x26,0x95,0x28,0x81,0x0c, - 0xf9,0xd5,0xeb,0x03,0x85,0xf6,0xe3,0xc9, - 0xb7,0x4a,0x4c,0x42,0x56,0x72,0x0a,0xd3, - 0xc1,0x17,0x79,0x8c,0xea,0xd5,0x81,0x02, - 0xf9,0xf1,0xeb,0xdb,0x87,0x26,0xed,0x29, - 0x91,0x0a,0x99,0xc0,0xab,0x7c,0x04,0xf7, - 0xe5,0xcf,0xa3,0x5e,0x34,0x3b,0x47,0x64, - 0x6c,0xa6,0x94,0x28,0x87,0x0c,0xed,0xd5, - 0x93,0x02,0x95,0xf0,0x83,0xdc,0xf7,0x35, - 0xcd,0x43,0x50,0x74,0x1e,0xc7,0xb9,0x6e, - 0x68,0x9a,0x8c,0xa0,0xd4,0x3d,0x07,0x71, - 0xec,0xdb,0x95,0x26,0x81,0x28,0xf9,0x0d, - 0xe9,0xd3,0x8b,0x16,0xc5,0x89,0x62,0xc8, - 0xb1,0x4c,0x58,0x56,0x2e,0x0b,0x1b,0xc5, - 0xa7,0x62,0x2c,0xb3,0x14,0x55,0x86,0x02, - 0xeb,0xf1,0x87,0xda,0xef,0x21,0x9d,0x3a, - 0xb1,0x60,0x58,0xbe,0x2c,0x7b,0x16,0xe5, - 0x89,0xa2,0xca,0x31,0x43,0x58,0x74,0x2e, - 0xc7,0x19,0x6d,0xa8,0x92,0x0c,0x93,0xd4, - 0x97,0x04,0x8d,0xe4,0xd3,0xa5,0x16,0x21, - 0x8b,0x3a,0xc5,0x61,0x60,0xb8,0xbc,0x6c, - 0x76,0x96,0xc8,0x89,0x4c,0xc8,0x55,0x4e, - 0x00,0x5b,0xfe,0x27,0xfb,0x2f,0xe5,0x1f, - 0xa1,0xbe,0x3a,0x7b,0x62,0xe4,0xb1,0xa4, - 0x5a,0x26,0x23,0x2b,0x35,0x05,0x41,0xe0, - 0x7b,0xbe,0xe6,0x79,0xaa,0xea,0x01,0x83, - 0xfa,0xf7,0xe1,0xcf,0xbb,0x5e,0x64,0x3a, - 0xa7,0x60,0x2c,0xbf,0x14,0x7d,0x86,0xf2, - 0xe9,0xd1,0x8b,0x1a,0xc5,0xa1,0x62,0x38, - 0xb3,0x6c,0x54,0x96,0x04,0x8b,0xe4,0xc7, - 0xa5,0x6e,0x20,0x9b,0x3c,0xa5,0x74,0x20, - 0xc7,0x3d,0x6d,0x70,0x90,0xdc,0x9d,0x34, - 0xb1,0x44,0x58,0x66,0x2e,0xab,0x18,0x05, - 0xaf,0xe2,0x1f,0xb3,0xbe,0x56,0x7a,0x0a, - 0xe3,0xc1,0xb7,0x7a,0x4c,0xe2,0x55,0xb2, - 0x02,0x53,0xf2,0x17,0xd3,0x8f,0x16,0xdd, - 0x89,0x32,0xc9,0x51,0x48,0x18,0x4f,0xae, - 0x5e,0x1a,0x3b,0xa3,0x66,0x34,0xab,0x44, - 0x04,0x67,0xe6,0xaf,0xa8,0x1e,0x0f,0xbb, - 0xde,0x67,0x3a,0xad,0x60,0x10,0xbf,0x9c, - 0x7e,0xb6,0xf8,0x49,0xee,0x4b,0x9a,0x46, - 0xa2,0x68,0x32,0x8f,0x50,0xdc,0x1d,0x37, - 0xb1,0x4e,0x58,0x5a,0x2e,0x23,0x1b,0x35, - 0xa5,0x42,0x20,0x73,0x3e,0xd5,0x79,0x00, - 0xe9,0xfd,0x8b,0xf2,0xc7,0xd1,0x6f,0x18, - 0x9d,0xac,0xb2,0x14,0x53,0x86,0x16,0xeb, - 0x89,0x86,0xca,0xe9,0x41,0x88,0x7a,0xce, - 0xe1,0x59,0xb8,0x2a,0x6f,0x02,0x9d,0xf0, - 0xb3,0xdc,0x57,0x36,0x0d,0x4b,0xd0,0x47, - 0x1e,0x6d,0xba,0x92,0x60,0x92,0xbc,0x90, - 0x74,0x9e,0xc4,0xb9,0x64,0x68,0xa6,0x8c, - 0x28,0xd7,0x0d,0x0d,0xd1,0xd3,0x1b,0x15, - 0xa5,0x82,0x22,0xf3,0x31,0xd5,0x5b,0x00, - 0x25,0xff,0x23,0xfd,0x37,0xf1,0x4f,0xd8, - 0x5f,0x2e,0x3d,0x1b,0x71,0xa4,0xda,0x25, - 0x23,0x21,0x35,0x39,0x41,0x68,0x78,0x8e, - 0xec,0xd9,0x95,0x2a,0x81,0x00,0xf9,0xfd, - 0xeb,0xf3,0x87,0xd6,0xef,0x09,0x9d,0xca, - 0xb3,0x40,0x54,0x7e,0x06,0xfb,0xe9,0xe7, - 0x8b,0xae,0xc6,0x19,0x6b,0xa8,0x86,0x0c, - 0xeb,0xd5,0x87,0x02,0xed,0xf1,0x93,0xda, - 0x97,0x20,0x8d,0x3c,0xd1,0x75,0x18,0xc1, - 0xad,0x7a,0x10,0xe3,0x9d,0xb6,0xb2,0x48, - 0x52,0x4e,0x12,0x5b,0x92,0x26,0x93,0x28, - 0x95,0x0c,0x81,0xd4,0xfb,0x05,0xe5,0xe3, - 0xa3,0xb6,0x36,0x4b,0x4a,0x44,0x42,0x66, - 0x72,0xaa,0xd0,0x01,0x1f,0xf9,0xbf,0xea, - 0x7f,0x82,0xfe,0xf1,0xf9,0xdb,0xeb,0x27, - 0x85,0x2e,0xe1,0x19,0xb9,0xaa,0x6a,0x02, - 0x83,0xf0,0xf7,0xdd,0xcf,0x33,0x5d,0x54, - 0x30,0x07,0x5f,0xec,0x3f,0x97,0x7e,0x8c, - 0xf8,0xd5,0xed,0x03,0x91,0xf6,0x9b,0xc8, - 0xa7,0x4c,0x2c,0x57,0x16,0x0d,0x8b,0xd2, - 0xc7,0x11,0x6d,0x98,0x92,0xac,0x90,0x14, - 0x9f,0x84,0xbe,0xe4,0x79,0xa6,0xea,0x29, - 0x83,0x0a,0xf5,0xc1,0xc3,0x7b,0x74,0xe4, - 0xc5,0xa5,0x62,0x20,0xb3,0x3c,0x55,0x76, - 0x00,0xcb,0xfd,0x47,0xf0,0x6f,0xde,0x9f, - 0x38,0xbd,0x6c,0x70,0x96,0xdc,0x89,0x34, - 0xc9,0x45,0x48,0x60,0x4e,0xbe,0x58,0x7a, - 0x2e,0xe3,0x19,0xb5,0xaa,0x42,0x02,0x73, - 0xf2,0xd7,0xd1,0x0f,0x19,0xdd,0xab,0x32, - 0x05,0x53,0xe0,0x17,0xbf,0x8e,0x7e,0xda, - 0xf9,0x21,0xe9,0x3b,0x89,0x66,0xc8,0xa9, - 0x4c,0x08,0x57,0xce,0x0f,0x5b,0xdc,0x27, - 0x37,0x2d,0x4d,0x10,0x51,0x9e,0x1a,0xbb, - 0xa0,0x66,0x3e,0xab,0x78,0x04,0xef,0xe5, - 0x9f,0xa2,0xbe,0x30,0x7b,0x5e,0xe4,0x39, - 0xa7,0x6a,0x2c,0x83,0x14,0xf5,0x85,0xc2, - 0xe3,0x71,0xb4,0xda,0x45,0x22,0x61,0x32, - 0xb9,0x50,0x68,0x1e,0x8f,0xb8,0xde,0x6d, - 0x3a,0x91,0x60,0x98,0xbc,0xac,0x74,0x16, - 0xc7,0x89,0x6e,0xc8,0x99,0x4c,0xa8,0x54, - 0x0e,0x07,0xdb,0xef,0x27,0x9d,0x2e,0xb1, - 0x18,0x59,0xae,0x2a,0x1b,0x03,0xa5,0xf6, - 0x23,0xcb,0x37,0x45,0x4c,0x60,0x56,0xbe, - 0x08,0x7b,0xce,0xe7,0x59,0xac,0x2a,0x17, - 0x03,0x8d,0xf6,0xd3,0xc9,0x17,0x49,0x8c, - 0x4a,0xd6,0x41,0x0a,0x79,0xc2,0xeb,0x71, - 0x84,0xda,0xe5,0x21,0xa1,0x3a,0x39,0x63, - 0x68,0xb4,0x8c,0x44,0xd6,0x65,0x0a,0xa1, - 0xc0,0x3b,0x7f,0x64,0xfc,0xa5,0xf4,0x23, - 0xc7,0x37,0x6d,0x4c,0x90,0x54,0x9e,0x04, - 0xbb,0xe4,0x67,0xa6,0xae,0x28,0x1b,0x0f, - 0xa5,0xde,0x23,0x3b,0x35,0x65,0x40,0xa0, - 0x7c,0x3e,0xf7,0x79,0xcc,0xeb,0x55,0x84, - 0x02,0xe7,0xf1,0xaf,0xda,0x1f,0x23,0xbd, - 0x36,0x71,0x4a,0xd8,0x41,0x2e,0x79,0x1a, - 0xe9,0xa1,0x8a,0x3a,0xc3,0x61,0x74,0xb8, - 0xc4,0x6d,0x66,0x90,0xa8,0x9c,0x0c,0xb7, - 0xd4,0x4f,0x06,0x5d,0xea,0x33,0x83,0x56, - 0xf4,0x09,0xc7,0xcb,0x6f,0x44,0x9c,0x64, - 0xb6,0xa4,0x48,0x26,0x4f,0x2a,0x5d,0x02, - 0x31,0xf3,0x5b,0xd4,0x27,0x07,0x2d,0xed, - 0x13,0x91,0x96,0x9a,0x88,0xa0,0xcc,0x3d, - 0x57,0x70,0x0c,0xdf,0xd5,0x3f,0x01,0x7d, - 0xf8,0xf3,0xed,0xd7,0x93,0x0e,0x95,0xd8, - 0x83,0x2c,0xf5,0x15,0xc1,0x83,0x7a,0xf4, - 0xe1,0xc5,0xbb,0x62,0x64,0xb2,0xa4,0x50, - 0x26,0x1f,0x2b,0xbd,0x06,0x71,0xea,0xdb, - 0x81,0x26,0xf9,0x29,0xe9,0x0b,0x89,0xc6, - 0xcb,0x69,0x44,0x88,0x64,0xce,0xa5,0x58, - 0x20,0x2f,0x3f,0x1d,0x7d,0xb0,0xf2,0x5d, - 0xd2,0x33,0x13,0x55,0x94,0x02,0x87,0xf0, - 0xef,0xdd,0x9f,0x32,0xbd,0x50,0x70,0x1e, - 0xdf,0xb9,0x3e,0x69,0x7a,0x88,0xe0,0xcd, - 0xbd,0x52,0x70,0x12,0xdf,0x91,0x3e,0x99, - 0x78,0xa8,0xec,0x0d,0x97,0xd2,0x8f,0x10, - 0xdd,0x9d,0x32,0xb1,0x50,0x58,0x1e,0x2f, - 0xbb,0x1e,0x65,0xba,0xa2,0x60,0x32,0xbf, - 0x50,0x7c,0x1e,0xf7,0xb9,0xce,0x6b,0x5a, - 0x84,0x20,0xe7,0x3d,0xad,0x72,0x10,0xd3, - 0x9d,0x16,0xb1,0x88,0x5a,0xce,0x21,0x5b, - 0x38,0x25,0x6f,0x20,0x9d,0x3c,0xb1,0x74, - 0x58,0xc6,0x2d,0x6b,0x10,0x85,0x9c,0xe2, - 0xb5,0xb0,0x42,0x5e,0x72,0x3a,0xd3,0x61, - 0x14,0xb9,0x84,0x6a,0xe6,0x81,0xa8,0xfa, - 0x0d,0xe3,0xd3,0xb7,0x16,0x4d,0x8a,0x52, - 0xc2,0x11,0x73,0x98,0xd6,0xad,0x08,0x11, - 0xcf,0x9b,0x5e,0xa4,0x38,0x27,0x6f,0x2c, - 0x9d,0x14,0xb1,0x84,0x5a,0xe6,0x21,0xab, - 0x3a,0x05,0x63,0xe0,0xb7,0xbc,0x4e,0x76, - 0x5a,0xca,0x21,0x43,0x38,0x75,0x6e,0xc0, - 0x99,0x7c,0xa8,0xf4,0x0d,0xc7,0xd3,0x6f, - 0x14,0x9d,0x84,0xb2,0xe4,0x51,0xa6,0x1a, - 0x2b,0xa3,0x06,0x35,0xeb,0x43,0x84,0x76, - 0xe6,0xc9,0xa9,0x4a,0x08,0x43,0xce,0x77, - 0x5a,0xcc,0x21,0x57,0x38,0x0d,0x6f,0xd0, - 0x9f,0x1c,0xbd,0xb4,0x72,0x46,0xd2,0x69, - 0x12,0x89,0x90,0xca,0x9d,0x40,0xb0,0x7c, - 0x5e,0xf6,0x39,0xcb,0x6b,0x44,0x84,0x64, - 0xe6,0xa5,0xa8,0x22,0x0f,0x33,0xdd,0x57, - 0x30,0x0d,0x5f,0xd0,0x3f,0x1f,0x7d,0xbc, - 0xf2,0x75,0xd2,0xc3,0x11,0x75,0x98,0xc2, - 0xad,0x70,0x10,0xdf,0x9d,0x3e,0xb1,0x78, - 0x58,0xee,0x2d,0x9b,0x12,0xa5,0x90,0x22, - 0x9f,0x30,0xbd,0x5c,0x70,0x36,0xdf,0x49, - 0x3c,0x49,0x76,0x48,0xca,0x4d,0x42,0x50, - 0x72,0x1e,0xd3,0xb9,0x16,0x69,0x8a,0x8a, - 0xc0,0xc1,0x7d,0x78,0xf0,0xed,0xdd,0x93, - 0x32,0x95,0x50,0x80,0x1c,0xff,0xb5,0xfe, - 0x43,0xfa,0x77,0xe2,0xcf,0xb1,0x5e,0x58, - 0x3a,0x2f,0x63,0x1c,0xb5,0xb4,0x42,0x46, - 0x72,0x6a,0xd2,0x81,0x10,0xf9,0x9d,0xea, - 0xb3,0x80,0x56,0xfe,0x09,0xfb,0xcb,0xe7, - 0x47,0xac,0x6e,0x16,0x9b,0x88,0xa6,0xcc, - 0x29,0x57,0x08,0x0d,0xcf,0xd3,0x5f,0x14, - 0x3d,0x87,0x72,0xec,0xd1,0x95,0x1a,0x81, - 0xa0,0xfa,0x3d,0xe3,0x73,0xb4,0xd6,0x45, - 0x0a,0x61,0xc2,0xbb,0x70,0x64,0xde,0xa5, - 0x38,0x21,0x6f,0x38,0x9d,0x6c,0xb0,0x94, - 0x5c,0x86,0x3e,0xeb,0x45,0x84,0x62,0xe6, - 0xb1,0xa8,0x5a,0x0e,0x23,0xfb,0x33,0x25, - 0x47,0x20,0x51,0x3e,0x19,0x7f,0xa8,0x66, - 0x0c,0xfb,0xd0,0x07,0x13,0xe5,0x9f,0x83, - 0xce,0x98,0x58,0xcd,0x2e,0x19,0x14,0x39, - 0x86,0x3f,0xff,0x01,0x85,0xff,0xe1,0xe1, - 0xb3,0xfc,0x46,0x63,0x0f,0xf8,0x00,0x53, - 0xbe,0x1f,0xfb,0xc0,0xe6,0x7e,0xbc,0xf0, - 0x01,0xe3,0xc3,0x9f,0xa6,0xcc,0x48,0x7e, - 0x40,0x82,0x9d,0xf2,0xff,0xd6,0x07,0x13, - 0xf5,0x87,0x80,0x0f,0x71,0x9c,0xfd,0x35, - 0x61,0x43,0xf8,0x78,0x7e,0xcf,0x19,0x99, - 0xa8,0x32,0x00,0x53,0xfc,0x17,0xfb,0x8f, - 0xc6,0xdf,0xa9,0x3e,0x09,0x7b,0xc8,0xe7, - 0x4d,0xac,0x52,0x16,0x13,0x8b,0x96,0xc6, - 0x89,0x68,0xc8,0x8d,0x4c,0xd0,0x55,0x1e, - 0x01,0xbb,0xfa,0x67,0xe2,0xaf,0xb0,0x1e, - 0x5f,0xba,0x3e,0x63,0x7a,0xb4,0xe0,0x45, - 0xbe,0x62,0x7a,0xb2,0xe0,0x51,0xbe,0x1a, - 0x7b,0xa2,0xe6,0x31,0xab,0x5a,0x04,0x23, - 0xe7,0x37,0xad,0x4e,0x10,0x5b,0x9e,0x26, - 0xbb,0x28,0x65,0x0e,0xa1,0xd8,0x3b,0x2f, - 0x65,0x1c,0xa1,0xb4,0x3a,0x47,0x62,0x6c, - 0xb2,0x94,0x50,0x86,0x1c,0xeb,0xb5,0x86, - 0x42,0xea,0x71,0x82,0xda,0xf1,0x21,0xd9, - 0x3b,0x29,0x65,0x08,0xa1,0xcc,0x3b,0x57, - 0x64,0x0c,0xa7,0xd4,0x2f,0x07,0x1d,0xed, - 0xb3,0x92,0x56,0x92,0x08,0x93,0xcc,0x97, - 0x54,0x8c,0x04,0xd7,0xe5,0x0f,0xa1,0xde, - 0x3b,0x3b,0x65,0x64,0xa0,0xa4,0x3c,0x27, - 0x77,0x2c,0xcd,0x15,0x51,0x80,0x1a,0xff, - 0xa1,0xfe,0x3b,0xfb,0x67,0xe4,0xaf,0xa4, - 0x1e,0x27,0xbb,0x2e,0x65,0x1a,0xa1,0xa0, - 0x3a,0x3f,0x63,0x7c,0xb4,0xf4,0x45,0xc6, - 0x63,0x6a,0xb4,0x80,0x44,0xfe,0x65,0xfa, - 0xa3,0xe0,0x37,0xbf,0x4e,0x7c,0x5a,0xf6, - 0x21,0xcb,0x3b,0x45,0x64,0x60,0xa6,0xbc, - 0x28,0x77,0x0e,0xcd,0xd9,0x53,0x28,0x15, - 0x0f,0x81,0xde,0xfb,0x39,0xe5,0x6b,0xa0, - 0x86,0x3c,0xeb,0x75,0x84,0xc2,0xe5,0x71, - 0xa0,0xda,0x3d,0x23,0x71,0x34,0xd9,0x45, - 0x28,0x61,0x0e,0xb9,0xd8,0x6b,0x2e,0x85, - 0x18,0xe1,0xad,0xba,0x12,0x63,0x92,0xb6, - 0x90,0x48,0x9e,0x4c,0xba,0x54,0x62,0x06, - 0xb3,0xe8,0x57,0x8e,0x0e,0xdb,0xd9,0x27, - 0x29,0x2d,0x09,0x11,0xc9,0x9b,0x4a,0xa4, - 0x40,0x26,0x7f,0x2a,0xfd,0x01,0xf1,0xfb, - 0xdb,0xe7,0x27,0xad,0x2e,0x11,0x1b,0x99, - 0xa6,0xaa,0x28,0x03,0x0f,0xf5,0xdf,0xc3, - 0x3f,0x75,0x7c,0xc0,0xf5,0x7d,0xc0,0xf3, - 0x7d,0xd4,0xf3,0x05,0xd5,0xe3,0x03,0xb5, - 0xf6,0x43,0xca,0x77,0x42,0xcc,0x71,0x56, - 0xd8,0x09,0x2f,0xc9,0x1f,0x49,0xbc,0x4a, - 0x76,0x42,0xca,0x71,0x42,0xd8,0x71,0x2e, - 0xd9,0x19,0x29,0xa9,0x0a,0x09,0xc3,0xcb, - 0x77,0x44,0xcc,0x65,0x56,0xa0,0x08,0x3f, - 0xcf,0x7f,0x5c,0xfc,0x35,0xf7,0x43,0xcc, - 0x77,0x56,0xcc,0x09,0x57,0xc8,0x0f,0x4f, - 0xdc,0x5f,0x36,0x3d,0x4b,0x70,0x44,0xde, - 0x65,0x3a,0xa1,0x60,0x38,0xbf,0x6c,0x7c, - 0x96,0xf4,0x89,0xc4,0xcb,0x65,0x44,0xa0, - 0x64,0x3e,0xa7,0x78,0x2c,0xef,0x15,0x9d, - 0x82,0xb2,0xf0,0x51,0xde,0x1b,0x3b,0xa5, - 0x66,0x20,0xab,0x3c,0x05,0x77,0xe0,0xcf, - 0xbd,0x5e,0x70,0x3a,0xdf,0x61,0x3c,0xb9, - 0x74,0x68,0xc6,0x8d,0x68,0xd0,0x8d,0x1c, - 0xd1,0xb5,0x1a,0x41,0xa2,0x7a,0x32,0xe3, - 0x51,0xb4,0x1a,0x47,0xa2,0x6e,0x32,0x9b, - 0x50,0xa4,0x1c,0x27,0xb7,0x2e,0x4d,0x1a, - 0x51,0xa2,0x1a,0x33,0xa3,0x56,0x34,0x0b, - 0x47,0xc4,0x6f,0x66,0x9c,0xa8,0xb4,0x0c, - 0x47,0xd6,0x6f,0x0a,0x9d,0xc0,0xb3,0x7c, - 0x54,0xf6,0x05,0xcb,0xe3,0x47,0xb4,0x6e, - 0x46,0x9a,0x68,0xa2,0x8c,0x30,0xd7,0x5d, - 0x0c,0x31,0xd7,0x5b,0x0c,0x25,0xd7,0x23, - 0x0d,0x35,0xd1,0x43,0x18,0x75,0xae,0xc2, - 0x19,0x73,0xa8,0xd6,0x0d,0x0b,0xd1,0xc7, - 0x1b,0x6d,0xa4,0x92,0x24,0x93,0x24,0x95, - 0x24,0x81,0x24,0xf9,0x25,0xe9,0x23,0x89, - 0x36,0xc9,0x49,0x48,0x48,0x4e,0x4e,0x5a, - 0x5a,0x22,0x23,0x33,0x35,0x55,0x40,0x00, + 0xff,0xfb,0xff,0xe7,0xff,0xaf,0xfe,0x1f, + 0xfb,0xbf,0xe6,0x7f,0xaa,0xfe,0x01,0xfb, + 0xfb,0xe7,0xe7,0xaf,0xae,0x1e,0x1b,0xbb, + 0xa6,0x66,0x2a,0xab,0x00,0x05,0xff,0xe3, + 0xff,0xb7,0xfe,0x4f,0xfa,0x5f,0xe2,0x3f, + 0xb3,0x7e,0x54,0xfa,0x05,0xe3,0xe3,0xb7, + 0xb6,0x4e,0x4a,0x5a,0x42,0x22,0x73,0x32, + 0xd5,0x51,0x00,0x19,0xff,0xab,0xfe,0x07, + 0xfb,0xef,0xe7,0x9f,0xae,0xbe,0x18,0x7b, + 0xae,0xe6,0x19,0xab,0xaa,0x06,0x03,0xeb, + 0xf7,0x87,0xce,0xef,0x59,0x9c,0x2a,0xb7, + 0x00,0x4d,0xfe,0x53,0xfa,0x17,0xe3,0x8f, + 0xb6,0xde,0x49,0x3a,0x49,0x62,0x48,0xb2, + 0x4c,0x52,0x56,0x12,0x0b,0x93,0xc6,0x97, + 0x68,0x8c,0x8c,0xd4,0xd5,0x05,0x01,0xe1, + 0xfb,0xbb,0xe6,0x67,0xaa,0xae,0x00,0x1b, + 0xff,0xa7,0xfe,0x2f,0xfb,0x1f,0xe5,0xbf, + 0xa2,0x7e,0x32,0xfb,0x51,0xe4,0x1b,0xa7, + 0xa6,0x2e,0x2b,0x1b,0x05,0xa5,0xe2,0x23, + 0xb3,0x36,0x55,0x4a,0x00,0x43,0xfe,0x77, + 0xfa,0xcf,0xe1,0x5f,0xb8,0x3e,0x6f,0x7a, + 0x9c,0xe0,0xb5,0xbc,0x42,0x76,0x72,0xca, + 0xd1,0x41,0x18,0x79,0xae,0xea,0x19,0x83, + 0xaa,0xf6,0x01,0xcb,0xfb,0x47,0xe4,0x6f, + 0xa6,0x9e,0x28,0xbb,0x0c,0x65,0xd6,0xa3, + 0x08,0x35,0xcf,0x43,0x5c,0x74,0x36,0xc7, + 0x49,0x6c,0x48,0x96,0x4c,0x8a,0x54,0xc2, + 0x05,0x73,0xe0,0xd7,0xbd,0x0e,0x71,0xda, + 0xdb,0x21,0x25,0x39,0x21,0x69,0x38,0x89, + 0x6c,0xc8,0x95,0x4c,0x80,0x54,0xfe,0x05, + 0xfb,0xe3,0xe7,0xb7,0xae,0x4e,0x1a,0x5b, + 0xa2,0x26,0x33,0x2b,0x55,0x04,0x01,0xe7, + 0xfb,0xaf,0xe6,0x1f,0xab,0xbe,0x06,0x7b, + 0xea,0xe7,0x81,0xae,0xfa,0x19,0xe3,0xab, + 0xb6,0x06,0x4b,0xea,0x47,0x82,0x6e,0xf2, + 0x99,0xd0,0xab,0x1c,0x05,0xb7,0xe2,0x4f, + 0xb2,0x5e,0x52,0x3a,0x13,0x63,0x94,0xb6, + 0x84,0x48,0xe6,0x4d,0xaa,0x52,0x02,0x13, + 0xf3,0x97,0xd6,0x8f,0x08,0xdd,0xcd,0x33, + 0x51,0x54,0x18,0x07,0xaf,0xee,0x1f,0x9b, + 0xbe,0xa6,0x78,0x2a,0xef,0x01,0x9d,0xfa, + 0xb3,0xe0,0x57,0xbe,0x0e,0x7b,0xda,0xe7, + 0x21,0xad,0x3a,0x11,0x63,0x98,0xb6,0xac, + 0x48,0x16,0x4f,0x8a,0x5e,0xc2,0x39,0x73, + 0x68,0xd4,0x8d,0x04,0xd1,0xe5,0x1b,0xa1, + 0xa6,0x3a,0x2b,0x63,0x04,0xb5,0xe4,0x43, + 0xa6,0x76,0x2a,0xcb,0x01,0x45,0xf8,0x63, + 0xee,0xb7,0x98,0x4e,0xae,0x58,0x1a,0x2f, + 0xa3,0x1e,0x35,0xbb,0x42,0x64,0x72,0xa6, + 0xd0,0x29,0x1f,0x09,0xbd,0xca,0x73,0x42, + 0xd4,0x71,0x06,0xd9,0xe9,0x2b,0x89,0x06, + 0xc9,0xe9,0x4b,0x88,0x46,0xce,0x69,0x5a, + 0x88,0x20,0xcf,0x3d,0x5d,0x70,0x30,0xdf, + 0x5d,0x3c,0x31,0x77,0x58,0xcc,0x2d,0x57, + 0x10,0x0d,0x9f,0xd2,0xbf,0x10,0x7d,0x9e, + 0xf2,0xb9,0xd0,0x6b,0x1e,0x85,0xb8,0xe2, + 0x6d,0xb2,0x92,0x50,0x92,0x1c,0x93,0xb4, + 0x96,0x44,0x8a,0x64,0xc2,0xa5,0x70,0x20, + 0xdf,0x3d,0x3d,0x71,0x70,0xd8,0xdd,0x2d, + 0x31,0x11,0x59,0x98,0x2a,0xaf,0x00,0x1d, + 0xff,0xb3,0xfe,0x57,0xfa,0x0f,0xe3,0xdf, + 0xb7,0x3e,0x4d,0x7a,0x50,0xe2,0x1d,0xb3, + 0xb2,0x56,0x52,0x0a,0x13,0xc3,0x97,0x76, + 0x8c,0xc8,0xd5,0x4d,0x00,0x51,0xfe,0x1b, + 0xfb,0xa7,0xe6,0x2f,0xab,0x1e,0x05,0xbb, + 0xe2,0x67,0xb2,0xae,0x50,0x1a,0x1f,0xa3, + 0xbe,0x36,0x7b,0x4a,0xe4,0x41,0xa6,0x7a, + 0x2a,0xe3,0x01,0xb5,0xfa,0x43,0xe2,0x77, + 0xb2,0xce,0x51,0x5a,0x18,0x23,0xaf,0x36, + 0x1d,0x4b,0xb0,0x46,0x5e,0x6a,0x3a,0x83, + 0x60,0xf4,0xbd,0xc4,0x73,0x66,0xd4,0xa9, + 0x04,0x09,0xe7,0xcb,0xaf,0x46,0x1c,0x6b, + 0xb6,0x86,0x48,0xea,0x4d,0x82,0x52,0xf2, + 0x11,0xd3,0x9b,0x16,0xa5,0x88,0x22,0xcf, + 0x31,0x5d,0x58,0x30,0x2f,0x5f,0x1c,0x3d, + 0xb7,0x72,0x4c,0xd2,0x55,0x12,0x01,0x93, + 0xfa,0x97,0xe0,0x8f,0xbc,0xde,0x75,0x3a, + 0xc1,0x61,0x78,0xb8,0xec,0x6d,0x96,0x92, + 0x88,0x90,0xcc,0x9d,0x54,0xb0,0x04,0x5f, + 0xe6,0x3f,0xab,0x7e,0x04,0xfb,0xe5,0xe7, + 0xa3,0xae,0x36,0x1b,0x4b,0xa4,0x46,0x26, + 0x6b,0x2a,0x85,0x00,0xe1,0xfd,0xbb,0xf2, + 0x67,0xd2,0xaf,0x10,0x1d,0x9f,0xb2,0xbe, + 0x50,0x7a,0x1e,0xe3,0xb9,0xb6,0x6a,0x4a, + 0x82,0x40,0xf2,0x7d,0xd2,0xf3,0x11,0xd5, + 0x9b,0x02,0xa5,0xf0,0x23,0xdf,0x37,0x3d, + 0x4d,0x70,0x50,0xde,0x1d,0x3b,0xb1,0x66, + 0x58,0xaa,0x2c,0x03,0x17,0xf5,0x8f,0xc2, + 0xdf,0x71,0x3c,0xd9,0x75,0x28,0xc1,0x0d, + 0x79,0xd0,0xeb,0x1d,0x85,0xb2,0xe2,0x51, + 0xb2,0x1a,0x53,0xa2,0x16,0x33,0x8b,0x56, + 0xc4,0x09,0x67,0xc8,0xaf,0x4c,0x1c,0x57, + 0xb6,0x0e,0x4b,0xda,0x47,0x22,0x6d,0x32, + 0x91,0x50,0x98,0x1c,0xaf,0xb4,0x1e,0x47, + 0xba,0x6e,0x62,0x9a,0xb0,0xa0,0x5c,0x3e, + 0x37,0x7b,0x4c,0xe4,0x55,0xa6,0x02,0x2b, + 0xf3,0x07,0xd5,0xef,0x03,0x9d,0xf6,0xb3, + 0xc8,0x57,0x4e,0x0c,0x5b,0xd6,0x27,0x0b, + 0x2d,0xc5,0x13,0x61,0x94,0xba,0x84,0x60, + 0xe6,0xbd,0xa8,0x72,0x0e,0xd3,0xd9,0x17, + 0x29,0x8d,0x0a,0xd1,0xc1,0x1b,0x79,0xa4, + 0xea,0x25,0x83,0x22,0xf5,0x31,0xc1,0x5b, + 0x78,0x24,0xef,0x25,0x9d,0x22,0xb1,0x30, + 0x59,0x5e,0x28,0x3b,0x0f,0x65,0xdc,0xa3, + 0x34,0x35,0x47,0x40,0x6c,0x7e,0x96,0xf8, + 0x89,0xec,0xcb,0x95,0x46,0x80,0x68,0xfe, + 0x8d,0xf8,0xd3,0xed,0x17,0x91,0x8e,0x9a, + 0xd8,0xa1,0x2c,0x39,0x17,0x69,0x8c,0x8a, + 0xd4,0xc1,0x05,0x79,0xe0,0xeb,0xbd,0x86, + 0x72,0xea,0xd1,0x81,0x1a,0xf9,0xa1,0xea, + 0x3b,0x83,0x66,0xf4,0xa9,0xc4,0x0b,0x67, + 0xc4,0xaf,0x64,0x1c,0xa7,0xb4,0x2e,0x47, + 0x1a,0x6d,0xa2,0x92,0x30,0x93,0x5c,0x94, + 0x34,0x87,0x44,0xec,0x65,0x96,0xa2,0x88, + 0x30,0xcf,0x5d,0x5c,0x30,0x37,0x5f,0x4c, + 0x3c,0x57,0x76,0x0c,0xcb,0xd5,0x47,0x00, + 0x6d,0xfe,0x93,0xf8,0x97,0xec,0x8f,0x94, + 0xde,0x85,0x38,0xe1,0x6d,0xb8,0x92,0x6c, + 0x92,0x94,0x90,0x84,0x9c,0xe4,0xb5,0xa4, + 0x42,0x26,0x73,0x2a,0xd5,0x01,0x01,0xf9, + 0xfb,0xeb,0xe7,0x87,0xae,0xee,0x19,0x9b, + 0xaa,0xa6,0x00,0x2b,0xff,0x07,0xfd,0xef, + 0xf3,0x9f,0xd6,0xbf,0x08,0x7d,0xce,0xf3, + 0x59,0xd4,0x2b,0x07,0x05,0xed,0xe3,0x93, + 0xb6,0x96,0x48,0x8a,0x4c,0xc2,0x55,0x72, + 0x00,0xd3,0xfd,0x17,0xf1,0x8f,0xda,0xdf, + 0x21,0x3d,0x39,0x71,0x68,0xd8,0x8d,0x2c, + 0xd1,0x15,0x19,0x81,0xaa,0xfa,0x01,0xe3, + 0xfb,0xb7,0xe6,0x4f,0xaa,0x5e,0x02,0x3b, + 0xf3,0x67,0xd4,0xaf,0x04,0x1d,0xe7,0xb3, + 0xae,0x56,0x1a,0x0b,0xa3,0xc6,0x37,0x6b, + 0x4c,0x84,0x54,0xe6,0x05,0xab,0xe2,0x07, + 0xb3,0xee,0x57,0x9a,0x0e,0xa3,0xd8,0x37, + 0x2f,0x4d,0x1c,0x51,0xb6,0x1a,0x4b,0xa2, + 0x46,0x32,0x6b,0x52,0x84,0x10,0xe7,0x9d, + 0xae,0xb2,0x18,0x53,0xae,0x16,0x1b,0x8b, + 0xa6,0xc6,0x29,0x6b,0x08,0x85,0xcc,0xe3, + 0x55,0xb4,0x02,0x47,0xf2,0x6f,0xd2,0x9f, + 0x10,0xbd,0x9c,0x72,0xb6,0xd0,0x49,0x1e, + 0x49,0xba,0x4a,0x62,0x42,0xb2,0x70,0x52, + 0xde,0x11,0x3b,0x99,0x66,0xa8,0xa8,0x0c, + 0x0f,0xd7,0xdf,0x0f,0x3d,0xdd,0x73,0x30, + 0xd5,0x5d,0x00,0x31,0xff,0x5b,0xfc,0x27, + 0xf7,0x2f,0xcd,0x1f,0x51,0xbc,0x1a,0x77, + 0xa2,0xce,0x31,0x5b,0x58,0x24,0x2f,0x27, + 0x1d,0x2d,0xb1,0x12,0x59,0x92,0x2a,0x93, + 0x00,0x95,0xfc,0x83,0xf4,0xf7,0xc5,0xcf, + 0x63,0x5c,0xb4,0x34,0x47,0x46,0x6c,0x6a, + 0x96,0x80,0x88,0xfc,0xcd,0xf5,0x53,0xc0, + 0x17,0x7f,0x8c,0xfe,0xd5,0xf9,0x03,0xe9, + 0xf7,0x8b,0xce,0xc7,0x59,0x6c,0x28,0x97, + 0x0c,0x8d,0xd4,0xd3,0x05,0x15,0xe1,0x83, + 0xba,0xf6,0x61,0xca,0xbb,0x40,0x64,0x7e, + 0xa6,0xf8,0x29,0xef,0x0b,0x9d,0xc6,0xb3, + 0x68,0x54,0x8e,0x04,0xdb,0xe5,0x27,0xa1, + 0x2e,0x39,0x1b,0x69,0xa4,0x8a,0x24,0xc3, + 0x25,0x75,0x20,0xc1,0x3d,0x79,0x70,0xe8, + 0xdd,0x8d,0x32,0xd1,0x51,0x18,0x19,0xaf, + 0xaa,0x1e,0x03,0xbb,0xf6,0x67,0xca,0xaf, + 0x40,0x1c,0x7f,0xb6,0xfe,0x49,0xfa,0x4b, + 0xe2,0x47,0xb2,0x6e,0x52,0x9a,0x10,0xa3, + 0x9c,0x36,0xb7,0x48,0x4c,0x4e,0x56,0x5a, + 0x0a,0x23,0xc3,0x37,0x75,0x4c,0xc0,0x55, + 0x7e,0x00,0xfb,0xfd,0xe7,0xf3,0xaf,0xd6, + 0x1f,0x0b,0xbd,0xc6,0x73,0x6a,0xd4,0x81, + 0x04,0xf9,0xe5,0xeb,0xa3,0x86,0x36,0xeb, + 0x49,0x84,0x4a,0xe6,0x41,0xaa,0x7a,0x02, + 0xe3,0xf1,0xb7,0xda,0x4f,0x22,0x5d,0x32, + 0x31,0x53,0x58,0x14,0x2f,0x87,0x1e,0xed, + 0xb9,0x92,0x6a,0x92,0x80,0x90,0xfc,0x9d, + 0xf4,0xb3,0xc4,0x57,0x66,0x0c,0xab,0xd4, + 0x07,0x07,0xed,0xef,0x93,0x9e,0x96,0xb8, + 0x88,0x6c,0xce,0x95,0x58,0x80,0x2c,0xff, + 0x15,0xfd,0x83,0xf2,0xf7,0xd1,0xcf,0x1b, + 0x5d,0xa4,0x32,0x27,0x53,0x2c,0x15,0x17, + 0x81,0x8e,0xfa,0xd9,0xe1,0x2b,0xb9,0x06, + 0x69,0xea,0x8b,0x80,0xc6,0xfd,0x69,0xf0, + 0x8b,0xdc,0xc7,0x35,0x6d,0x40,0x90,0x7c, + 0x9e,0xf4,0xb9,0xc4,0x6b,0x66,0x84,0xa8, + 0xe4,0x0d,0xa7,0xd2,0x2f,0x13,0x1d,0x95, + 0xb2,0x82,0x50,0xf2,0x1d,0xd3,0xb3,0x16, + 0x55,0x8a,0x02,0xc3,0xf1,0x77,0xd8,0xcf, + 0x2d,0x5d,0x10,0x31,0x9f,0x5a,0xbc,0x20, + 0x77,0x3e,0xcd,0x79,0x50,0xe8,0x1d,0x8f, + 0xb2,0xde,0x51,0x3a,0x19,0x63,0xa8,0xb6, + 0x0c,0x4b,0xd6,0x47,0x0a,0x6d,0xc2,0x93, + 0x70,0x94,0xdc,0x85,0x34,0xe1,0x45,0xb8, + 0x62,0x6e,0xb2,0x98,0x50,0xae,0x1c,0x1b, + 0xb7,0xa6,0x4e,0x2a,0x5b,0x02,0x25,0xf3, + 0x23,0xd5,0x37,0x01,0x4d,0xf8,0x53,0xee, + 0x17,0x9b,0x8e,0xa6,0xd8,0x29,0x2f,0x09, + 0x1d,0xc9,0xb3,0x4a,0x54,0x42,0x06,0x73, + 0xea,0xd7,0x81,0x0e,0xf9,0xd9,0xeb,0x2b, + 0x85,0x06,0xe1,0xe9,0xbb,0x8a,0x66,0xc2, + 0xa9,0x70,0x08,0xdf,0xcd,0x3f,0x51,0x7c, + 0x18,0xf7,0xad,0xce,0x13,0x5b,0x94,0x26, + 0x87,0x28,0xed,0x0d,0x91,0xd2,0x9b,0x10, + 0xa5,0x9c,0x22,0xb7,0x30,0x4d,0x5e,0x50, + 0x3a,0x1f,0x63,0xbc,0xb6,0x74,0x4a,0xc6, + 0x41,0x6a,0x78,0x82,0xec,0xf1,0x95,0xda, + 0x83,0x20,0xf5,0x3d,0xc1,0x73,0x78,0xd4, + 0xed,0x05,0x91,0xe2,0x9b,0xb0,0xa6,0x5c, + 0x2a,0x37,0x03,0x4d,0xf4,0x53,0xc6,0x17, + 0x6b,0x8c,0x86,0xd4,0xe9,0x05,0x89,0xe2, + 0xcb,0xb1,0x46,0x58,0x6a,0x2e,0x83,0x18, + 0xf5,0xad,0xc2,0x13,0x73,0x94,0xd6,0x85, + 0x08,0xe1,0xcd,0xbb,0x52,0x64,0x12,0xa7, + 0x90,0x2e,0x9f,0x18,0xbd,0xac,0x72,0x16, + 0xd3,0x89,0x16,0xc9,0x89,0x4a,0xc8,0x41, + 0x4e,0x78,0x5a,0xee,0x21,0x9b,0x3a,0xa5, + 0x60,0x20,0xbf,0x3c,0x7d,0x76,0xf0,0xc9, + 0xdd,0x4b,0x30,0x45,0x5e,0x60,0x3a,0xbf, + 0x60,0x7c,0xbe,0xf4,0x79,0xc6,0xeb,0x69, + 0x84,0x8a,0xe4,0xc1,0xa5,0x7a,0x20,0xe3, + 0x3d,0xb5,0x72,0x40,0xd2,0x7d,0x12,0xf1, + 0x91,0xda,0x9b,0x20,0xa5,0x3c,0x21,0x77, + 0x38,0xcd,0x6d,0x50,0x90,0x1c,0x9f,0xb4, + 0xbe,0x44,0x7a,0x66,0xe2,0xa9,0xb0,0x0a, + 0x5f,0xc2,0x3f,0x73,0x7c,0xd4,0xf5,0x05, + 0xc1,0xe3,0x7b,0xb4,0xe6,0x45,0xaa,0x62, + 0x02,0xb3,0xf0,0x57,0xde,0x0f,0x3b,0xdd, + 0x67,0x30,0xad,0x5c,0x10,0x37,0x9f,0x4e, + 0xbc,0x58,0x76,0x2e,0xcb,0x19,0x45,0xa8, + 0x62,0x0e,0xb3,0xd8,0x57,0x2e,0x0d,0x1b, + 0xd1,0xa7,0x1a,0x2d,0xa3,0x12,0x35,0x93, + 0x42,0x94,0x70,0x86,0xdc,0xe9,0x35,0x89, + 0x42,0xc8,0x71,0x4e,0xd8,0x59,0x2e,0x29, + 0x1b,0x09,0xa5,0xca,0x23,0x43,0x34,0x75, + 0x46,0xc0,0x69,0x7e,0x88,0xf8,0xcd,0xed, + 0x53,0x90,0x16,0x9f,0x88,0xbe,0xcc,0x79, + 0x56,0xe8,0x09,0x8f,0xca,0xdf,0x41,0x3c, + 0x79,0x76,0xe8,0xc9,0x8d,0x4a,0xd0,0x41, + 0x1e,0x79,0xba,0xea,0x61,0x82,0xba,0xf0, + 0x61,0xde,0xbb,0x38,0x65,0x6e,0xa0,0x98, + 0x3c,0xaf,0x74,0x1c,0xc7,0xb5,0x6e,0x40, + 0x9a,0x7c,0xa2,0xf4,0x31,0xc7,0x5b,0x6c, + 0x24,0x97,0x24,0x8d,0x24,0xd1,0x25,0x19, + 0x21,0xa9,0x3a,0x09,0x63,0xc8,0xb7,0x4c, + 0x4c,0x56,0x56,0x0a,0x0b,0xc3,0xc7,0x77, + 0x6c,0xcc,0x95,0x54,0x80,0x04,0xff,0xe5, + 0xff,0xa3,0xfe,0x37,0xfb,0x4f,0xe4,0x5f, + 0xa6,0x3e,0x2b,0x7b,0x04,0xe5,0xe5,0xa3, + 0xa2,0x36,0x33,0x4b,0x54,0x44,0x06,0x67, + 0xea,0xaf,0x80,0x1e,0xff,0xb9,0xfe,0x6b, + 0xfa,0x87,0xe0,0xef,0xbd,0x9e,0x72,0xba, + 0xd0,0x61,0x1e,0xb9,0xb8,0x6a,0x6e,0x82, + 0x98,0xf0,0xad,0xdc,0x13,0x37,0x95,0x4e, + 0x80,0x58,0xfe,0x2d,0xfb,0x13,0xe5,0x97, + 0xa2,0x8e,0x30,0xdb,0x5d,0x24,0x31,0x27, + 0x59,0x2c,0x29,0x17,0x09,0x8d,0xca,0xd3, + 0x41,0x14,0x79,0x86,0xea,0xe9,0x81,0x8a, + 0xfa,0xc1,0xe1,0x7b,0xb8,0xe6,0x6d,0xaa, + 0x92,0x00,0x93,0xfc,0x97,0xf4,0x8f,0xc4, + 0xdf,0x65,0x3c,0xa1,0x74,0x38,0xc7,0x6d, + 0x6c,0x90,0x94,0x9c,0x84,0xb4,0xe4,0x45, + 0xa6,0x62,0x2a,0xb3,0x00,0x55,0xfe,0x03, + 0xfb,0xf7,0xe7,0xcf,0xaf,0x5e,0x1c,0x3b, + 0xb7,0x66,0x4c,0xaa,0x54,0x02,0x07,0xf3, + 0xef,0xd7,0x9f,0x0e,0xbd,0xd8,0x73,0x2e, + 0xd5,0x19,0x01,0xa9,0xfa,0x0b,0xe3,0xc7, + 0xb7,0x6e,0x4c,0x9a,0x54,0xa2,0x04,0x33, + 0xe7,0x57,0xac,0x0e,0x17,0xdb,0x8f,0x26, + 0xdd,0x29,0x31,0x09,0x59,0xc8,0x2b,0x4f, + 0x04,0x5d,0xe6,0x33,0xab,0x56,0x04,0x0b, + 0xe7,0xc7,0xaf,0x6e,0x1c,0x9b,0xb4,0xa6, + 0x44,0x2a,0x67,0x02,0xad,0xf0,0x13,0xdf, + 0x97,0x3e,0x8d,0x78,0xd0,0xed,0x1d,0x91, + 0xb2,0x9a,0x50,0xa2,0x1c,0x33,0xb7,0x56, + 0x4c,0x0a,0x57,0xc2,0x0f,0x73,0xdc,0xd7, + 0x35,0x0d,0x41,0xd0,0x7b,0x1e,0xe5,0xb9, + 0xa2,0x6a,0x32,0x83,0x50,0xf4,0x1d,0xc7, + 0xb3,0x6e,0x54,0x9a,0x04,0xa3,0xe4,0x37, + 0xa7,0x4e,0x2c,0x5b,0x16,0x25,0x8b,0x22, + 0xc5,0x31,0x61,0x58,0xb8,0x2c,0x6f,0x16, + 0x9d,0x88,0xb2,0xcc,0x51,0x56,0x18,0x0b, + 0xaf,0xc6,0x1f,0x6b,0xbc,0x86,0x74,0xea, + 0xc5,0x81,0x62,0xf8,0xb1,0xec,0x5b,0x96, + 0x26,0x8b,0x28,0xc5,0x0d,0x61,0xd0,0xbb, + 0x1c,0x65,0xb6,0xa2,0x48,0x32,0x4f,0x52, + 0x5c,0x12,0x37,0x93,0x4e,0x94,0x58,0x86, + 0x2c,0xeb,0x15,0x85,0x82,0xe2,0xf1,0xb1, + 0xda,0x5b,0x22,0x25,0x33,0x21,0x55,0x38, + 0x01,0x6f,0xf8,0x9f,0xec,0xbf,0x94,0x7e, + 0x86,0xf8,0xe9,0xed,0x8b,0x92,0xc6,0x91, + 0x68,0x98,0x8c,0xac,0xd4,0x15,0x07,0x81, + 0xee,0xfb,0x99,0xe6,0xab,0xa8,0x06,0x0f, + 0xeb,0xdf,0x87,0x3e,0xed,0x79,0x90,0xea, + 0x9d,0x80,0xb2,0xfc,0x51,0xf6,0x1b,0xcb, + 0xa7,0x46,0x2c,0x6b,0x16,0x85,0x88,0xe2, + 0xcd,0xb1,0x52,0x58,0x12,0x2f,0x93,0x1e, + 0x95,0xb8,0x82,0x6c,0xf2,0x95,0xd0,0x83, + 0x1c,0xf5,0xb5,0xc2,0x43,0x72,0x74,0xd2, + 0xc5,0x11,0x61,0x98,0xba,0xac,0x60,0x16, + 0xbf,0x88,0x7e,0xce,0xf9,0x59,0xe8,0x2b, + 0x8f,0x06,0xdd,0xe9,0x33,0x89,0x56,0xc8, + 0x09,0x4f,0xc8,0x5f,0x4e,0x3c,0x5b,0x76, + 0x24,0xcb,0x25,0x45,0x20,0x61,0x3e,0xb9, + 0x78,0x68,0xee,0x8d,0x98,0xd2,0xad,0x10, + 0x11,0x9f,0x9a,0xbe,0xa0,0x78,0x3e,0xef, + 0x79,0x9c,0xea,0xb5,0x80,0x42,0xfe,0x71, + 0xfa,0xdb,0xe1,0x27,0xb9,0x2e,0x69,0x1a, + 0x89,0xa0,0xca,0x3d,0x43,0x70,0x74,0xde, + 0xc5,0x39,0x61,0x68,0xb8,0x8c,0x6c,0xd6, + 0x95,0x08,0x81,0xcc,0xfb,0x55,0xe4,0x03, + 0xa7,0xf6,0x2f,0xcb,0x1f,0x45,0xbc,0x62, + 0x76,0xb2,0xc8,0x51,0x4e,0x18,0x5b,0xae, + 0x26,0x1b,0x2b,0xa5,0x06,0x21,0xeb,0x3b, + 0x85,0x66,0xe0,0xa9,0xbc,0x0a,0x77,0xc2, + 0xcf,0x71,0x5c,0xd8,0x35,0x2f,0x41,0x1c, + 0x79,0xb6,0xea,0x49,0x82,0x4a,0xf2,0x41, + 0xd2,0x7b,0x12,0xe5,0x91,0xa2,0x9a,0x30, + 0xa3,0x5c,0x34,0x37,0x47,0x4c,0x6c,0x56, + 0x96,0x08,0x8b,0xcc,0xc7,0x55,0x6c,0x00, + 0x97,0xfc,0x8f,0xf4,0xdf,0xc5,0x3f,0x61, + 0x7c,0xb8,0xf4,0x6d,0xc6,0x93,0x68,0x94, + 0x8c,0x84,0xd4,0xe5,0x05,0xa1,0xe2,0x3b, + 0xb3,0x66,0x54,0xaa,0x04,0x03,0xe7,0xf7, + 0xaf,0xce,0x1f,0x5b,0xbc,0x26,0x77,0x2a, + 0xcd,0x01,0x51,0xf8,0x1b,0xef,0xa7,0x9e, + 0x2e,0xbb,0x18,0x65,0xae,0xa2,0x18,0x33, + 0xaf,0x56,0x1c,0x0b,0xb7,0xc6,0x4f,0x6a, + 0x5c,0x82,0x34,0xf3,0x45,0xd4,0x63,0x06, + 0xb5,0xe8,0x43,0x8e,0x76,0xda,0xc9,0x21, + 0x49,0x38,0x49,0x6e,0x48,0x9a,0x4c,0xa2, + 0x54,0x32,0x07,0x53,0xec,0x17,0x97,0x8e, + 0x8e,0xd8,0xd9,0x2d,0x29,0x11,0x09,0x99, + 0xca,0xab,0x40,0x04,0x7f,0xe6,0xff,0xa9, + 0xfe,0x0b,0xfb,0xc7,0xe7,0x6f,0xac,0x9e, + 0x14,0xbb,0x84,0x66,0xe6,0xa9,0xa8,0x0a, + 0x0f,0xc3,0xdf,0x77,0x3c,0xcd,0x75,0x50, + 0xc0,0x1d,0x7f,0xb0,0xfe,0x5d,0xfa,0x33, + 0xe3,0x57,0xb4,0x0e,0x47,0xda,0x6f,0x22, + 0x9d,0x30,0xb1,0x5c,0x58,0x36,0x2f,0x4b, + 0x1c,0x45,0xb6,0x62,0x4a,0xb2,0x40,0x52, + 0x7e,0x12,0xfb,0x91,0xe6,0x9b,0xa8,0xa6, + 0x0c,0x2b,0xd7,0x07,0x0d,0xed,0xd3,0x93, + 0x16,0x95,0x88,0x82,0xcc,0xf1,0x55,0xd8, + 0x03,0x2f,0xf5,0x1f,0xc1,0xbf,0x7a,0x7c, + 0xe2,0xf5,0xb1,0xc2,0x5b,0x72,0x24,0xd3, + 0x25,0x15,0x21,0x81,0x3a,0xf9,0x61,0xe8, + 0xbb,0x8c,0x66,0xd6,0xa9,0x08,0x09,0xcf, + 0xcb,0x5f,0x44,0x3c,0x67,0x76,0xac,0xc8, + 0x15,0x4f,0x80,0x5e,0xfe,0x39,0xfb,0x6b, + 0xe4,0x87,0xa4,0xee,0x25,0x9b,0x22,0xa5, + 0x30,0x21,0x5f,0x38,0x3d,0x6f,0x70,0x9c, + 0xdc,0xb5,0x34,0x41,0x46,0x78,0x6a,0xee, + 0x81,0x98,0xfa,0xad,0xe0,0x13,0xbf,0x96, + 0x7e,0x8a,0xf8,0xc1,0xed,0x7b,0x90,0xe6, + 0x9d,0xa8,0xb2,0x0c,0x53,0xd6,0x17,0x0b, + 0x8d,0xc6,0xd3,0x69,0x14,0x89,0x84,0xca, + 0xe5,0x41,0xa0,0x7a,0x3e,0xe3,0x79,0xb4, + 0xea,0x45,0x82,0x62,0xf2,0xb1,0xd0,0x5b, + 0x1e,0x25,0xbb,0x22,0x65,0x32,0xa1,0x50, + 0x38,0x1f,0x6f,0xbc,0x9e,0x74,0xba,0xc4, + 0x61,0x66,0xb8,0xa8,0x6c,0x0e,0x97,0xd8, + 0x8f,0x2c,0xdd,0x15,0x31,0x81,0x5a,0xf8, + 0x21,0xef,0x3b,0x9d,0x66,0xb0,0xa8,0x5c, + 0x0e,0x37,0xdb,0x4f,0x24,0x5d,0x26,0x31, + 0x2b,0x59,0x04,0x29,0xe7,0x0b,0xad,0xc6, + 0x13,0x6b,0x94,0x86,0x84,0xe8,0xe5,0x8d, + 0xa2,0xd2,0x31,0x13,0x59,0x94,0x2a,0x87, + 0x00,0xed,0xfd,0x93,0xf2,0x97,0xd0,0x8f, + 0x1c,0xdd,0xb5,0x32,0x41,0x52,0x78,0x12, + 0xef,0x91,0x9e,0x9a,0xb8,0xa0,0x6c,0x3e, + 0x97,0x78,0x8c,0xec,0xd5,0x95,0x02,0x81, + 0xf0,0xfb,0xdd,0xe7,0x33,0xad,0x56,0x10, + 0x0b,0x9f,0xc6,0xbf,0x68,0x7c,0x8e,0xf4, + 0xd9,0xc5,0x2b,0x61,0x04,0xb9,0xe4,0x6b, + 0xa6,0x86,0x28,0xeb,0x0d,0x85,0xd2,0xe3, + 0x11,0xb5,0x9a,0x42,0xa2,0x70,0x32,0xdf, + 0x51,0x3c,0x19,0x77,0xa8,0xce,0x0d,0x5b, + 0xd0,0x27,0x1f,0x2d,0xbd,0x12,0x71,0x92, + 0xda,0x91,0x20,0x99,0x3c,0xa9,0x74,0x08, + 0xc7,0xcd,0x6f,0x50,0x9c,0x1c,0xb7,0xb4, + 0x4e,0x46,0x5a,0x6a,0x22,0x83,0x30,0xf5, + 0x5d,0xc0,0x33,0x7f,0x54,0xfc,0x05,0xf7, + 0xe3,0xcf,0xb7,0x5e,0x4c,0x3a,0x57,0x62, + 0x0c,0xb3,0xd4,0x57,0x06,0x0d,0xeb,0xd3, + 0x87,0x16,0xed,0x89,0x92,0xca,0x91,0x40, + 0x98,0x7c,0xae,0xf4,0x19,0xc7,0xab,0x6e, + 0x04,0x9b,0xe4,0xa7,0xa4,0x2e,0x27,0x1b, + 0x2d,0xa5,0x12,0x21,0x93,0x3a,0x95,0x60, + 0x80,0xbc,0xfc,0x75,0xf6,0xc3,0xc9,0x77, + 0x48,0xcc,0x4d,0x56,0x50,0x0a,0x1f,0xc3, + 0xbf,0x76,0x7c,0xca,0xf5,0x41,0xc0,0x7b, + 0x7e,0xe4,0xf9,0xa5,0xea,0x23,0x83,0x36, + 0xf5,0x49,0xc0,0x4b,0x7e,0x44,0xfa,0x65, + 0xe2,0xa3,0xb0,0x36,0x5f,0x4a,0x3c,0x43, + 0x76,0x74,0xca,0xc5,0x41,0x60,0x78,0xbe, + 0xec,0x79,0x96,0xea,0x89,0x80,0xca,0xfd, + 0x41,0xf0,0x7b,0xde,0xe7,0x39,0xad,0x6a, + 0x10,0x83,0x9c,0xf6,0xb5,0xc8,0x43,0x4e, + 0x74,0x5a,0xc6,0x21,0x6b,0x38,0x85,0x6c, + 0xe0,0x95,0xbc,0x82,0x74,0xf2,0xc5,0xd1, + 0x63,0x18,0xb5,0xac,0x42,0x16,0x73,0x8a, + 0xd6,0xc1,0x09,0x79,0xc8,0xeb,0x4d,0x84, + 0x52,0xe6,0x11,0xab,0x9a,0x06,0xa3,0xe8, + 0x37,0x8f,0x4e,0xdc,0x59,0x36,0x29,0x4b, + 0x08,0x45,0xce,0x63,0x5a,0xb4,0x20,0x47, + 0x3e,0x6d,0x7a,0x90,0xe0,0x9d,0xbc,0xb2, + 0x74,0x52,0xc6,0x11,0x6b,0x98,0x86,0xac, + 0xe8,0x15,0x8f,0x82,0xde,0xf1,0x39,0xd9, + 0x6b,0x28,0x85,0x0c,0xe1,0xd5,0xbb,0x02, + 0x65,0xf2,0xa3,0xd0,0x37,0x1f,0x4d,0xbc, + 0x52,0x76,0x12,0xcb,0x91,0x46,0x98,0x68, + 0xae,0x8c,0x18,0xd7,0xad,0x0e,0x11,0xdb, + 0x9b,0x26,0xa5,0x28,0x21,0x0f,0x39,0xdd, + 0x6b,0x30,0x85,0x5c,0xe0,0x35,0xbf,0x42, + 0x7c,0x72,0xf6,0xd1,0xc9,0x1b,0x49,0xa4, + 0x4a,0x26,0x43,0x2a,0x75,0x02,0xc1,0xf1, + 0x7b,0xd8,0xe7,0x2d,0xad,0x12,0x11,0x93, + 0x9a,0x96,0xa0,0x88,0x3c,0xcf,0x75,0x5c, + 0xc0,0x35,0x7f,0x40,0xfc,0x7d,0xf6,0xf3, + 0xc9,0xd7,0x4b,0x0c,0x45,0xd6,0x63,0x0a, + 0xb5,0xc0,0x43,0x7e,0x74,0xfa,0xc5,0xe1, + 0x63,0xb8,0xb6,0x6c,0x4a,0x96,0x40,0x8a, + 0x7c,0xc2,0xf5,0x71,0xc0,0xdb,0x7d,0x24, + 0xf1,0x25,0xd9,0x23,0x29,0x35,0x09,0x41, + 0xc8,0x7b,0x4e,0xe4,0x59,0xa6,0x2a,0x2b, + 0x03,0x05,0xf5,0xe3,0xc3,0xb7,0x76,0x4c, + 0xca,0x55,0x42,0x00,0x73,0xfe,0xd7,0xf9, + 0x0f,0xe9,0xdf,0x8b,0x3e,0xc5,0x79,0x60, + 0xe8,0xbd,0x8c,0x72,0xd6,0xd1,0x09,0x19, + 0xc9,0xab,0x4a,0x04,0x43,0xe6,0x77,0xaa, + 0xce,0x01,0x5b,0xf8,0x27,0xef,0x2f,0x9d, + 0x1e,0xb1,0xb8,0x5a,0x6e,0x22,0x9b,0x30, + 0xa5,0x5c,0x20,0x37,0x3f,0x4d,0x7c,0x50, + 0xf6,0x1d,0xcb,0xb3,0x46,0x54,0x6a,0x06, + 0x83,0xe8,0xf7,0x8d,0xce,0xd3,0x59,0x14, + 0x29,0x87,0x0a,0xed,0xc1,0x93,0x7a,0x94, + 0xe0,0x85,0xbc,0xe2,0x75,0xb2,0xc2,0x51, + 0x72,0x18,0xd3,0xad,0x16,0x11,0x8b,0x9a, + 0xc6,0xa1,0x68,0x38,0x8f,0x6c,0xdc,0x95, + 0x34,0x81,0x44,0xf8,0x65,0xee,0xa3,0x98, + 0x36,0xaf,0x48,0x1c,0x4f,0xb6,0x5e,0x4a, + 0x3a,0x43,0x62,0x74,0xb2,0xc4,0x51,0x66, + 0x18,0xab,0xac,0x06,0x17,0xeb,0x8f,0x86, + 0xde,0xe9,0x39,0x89,0x6a,0xc8,0x81,0x4c, + 0xf8,0x55,0xee,0x03,0x9b,0xf6,0xa7,0xc8, + 0x2f,0x4f,0x1c,0x5d,0xb6,0x32,0x4b,0x52, + 0x44,0x12,0x67,0x92,0xae,0x90,0x18,0x9f, + 0xac,0xbe,0x14,0x7b,0x86,0xe6,0xe9,0xa9, + 0x8a,0x0a,0xc3,0xc1,0x77,0x78,0xcc,0xed, + 0x55,0x90,0x02,0x9f,0xf0,0xbf,0xdc,0x7f, + 0x36,0xfd,0x49,0xf0,0x4b,0xde,0x47,0x3a, + 0x6d,0x62,0x90,0xb0,0x9c,0x5c,0xb6,0x34, + 0x4b,0x46,0x44,0x6a,0x66,0x82,0xa8,0xf0, + 0x0d,0xdf,0xd3,0x3f,0x15,0x7d,0x80,0xf2, + 0xfd,0xd1,0xf3,0x1b,0xd5,0xa7,0x02,0x2d, + 0xf3,0x13,0xd5,0x97,0x02,0x8d,0xf0,0xd3, + 0xdd,0x17,0x31,0x8d,0x5a,0xd0,0x21,0x1f, + 0x39,0xbd,0x6a,0x70,0x82,0xdc,0xf1,0x35, + 0xd9,0x43,0x28,0x75,0x0e,0xc1,0xd9,0x7b, + 0x28,0xe5,0x0d,0xa1,0xd2,0x3b,0x13,0x65, + 0x94,0xa2,0x84,0x30,0xe7,0x5d,0xac,0x32, + 0x17,0x53,0x8c,0x16,0xd7,0x89,0x0e,0xc9, + 0xd9,0x4b,0x28,0x45,0x0e,0x61,0xda,0xbb, + 0x20,0x65,0x3e,0xa1,0x78,0x38,0xef,0x6d, + 0x9c,0x92,0xb4,0x90,0x44,0x9e,0x64,0xba, + 0xa4,0x60,0x26,0xbf,0x28,0x7d,0x0e,0xf1, + 0xd9,0xdb,0x2b,0x25,0x05,0x21,0xe1,0x3b, + 0xb9,0x66,0x68,0xaa,0x8c,0x00,0xd7,0xfd, + 0x0f,0xf1,0xdf,0xdb,0x3f,0x25,0x7d,0x20, + 0xf1,0x3d,0xd9,0x73,0x28,0xd5,0x0d,0x01, + 0xd1,0xfb,0x1b,0xe5,0xa7,0xa2,0x2e,0x33, + 0x1b,0x55,0xa4,0x02,0x27,0xf3,0x2f,0xd5, + 0x1f,0x01,0xbd,0xfa,0x73,0xe2,0xd7,0xb1, + 0x0e,0x59,0xda,0x2b,0x23,0x05,0x35,0xe1, + 0x43,0xb8,0x76,0x6e,0xca,0x99,0x40,0xa8, + 0x7c,0x0e,0xf7,0xd9,0xcf,0x2b,0x5d,0x04, + 0x31,0xe7,0x5b,0xac,0x26,0x17,0x2b,0x8d, + 0x06,0xd1,0xe9,0x1b,0x89,0xa6,0xca,0x29, + 0x43,0x08,0x75,0xce,0xc3,0x59,0x74,0x28, + 0xc7,0x0d,0x6d,0xd0,0x93,0x1c,0x95,0xb4, + 0x82,0x44,0xf2,0x65,0xd2,0xa3,0x10,0x35, + 0x9f,0x42,0xbc,0x70,0x76,0xde,0xc9,0x39, + 0x49,0x68,0x48,0x8e,0x4c,0xda,0x55,0x22, + 0x01,0x33,0xf9,0x57,0xe8,0x0f,0x8f,0xde, + 0xdf,0x39,0x3d,0x69,0x70,0x88,0xdc,0xcd, + 0x35,0x51,0x40,0x18,0x7f,0xae,0xfe,0x19, + 0xfb,0xab,0xe6,0x07,0xab,0xee,0x07,0x9b, + 0xee,0xa7,0x98,0x2e,0xaf,0x18,0x1d,0xaf, + 0xb2,0x1e,0x53,0xba,0x16,0x63,0x8a,0xb6, + 0xc0,0x49,0x7e,0x48,0xfa,0x4d,0xe2,0x53, + 0xb2,0x16,0x53,0x8a,0x16,0xc3,0x89,0x76, + 0xc8,0xc9,0x4d,0x48,0x50,0x4e,0x1e,0x5b, + 0xba,0x26,0x63,0x2a,0xb5,0x00,0x41,0xfe, + 0x7b,0xfa,0xe7,0xe1,0xaf,0xba,0x1e,0x63, + 0xba,0xb6,0x60,0x4a,0xbe,0x40,0x7a,0x7e, + 0xe2,0xf9,0xb1,0xea,0x5b,0x82,0x26,0xf3, + 0x29,0xd5,0x0b,0x01,0xc5,0xfb,0x63,0xe4, + 0xb7,0xa4,0x4e,0x26,0x5b,0x2a,0x25,0x03, + 0x21,0xf5,0x3b,0xc1,0x67,0x78,0xac,0xec, + 0x15,0x97,0x82,0x8e,0xf0,0xd9,0xdd,0x2b, + 0x31,0x05,0x59,0xe0,0x2b,0xbf,0x06,0x7d, + 0xea,0xf3,0x81,0xd6,0xfb,0x09,0xe5,0xcb, + 0xa3,0x46,0x34,0x6b,0x46,0x84,0x68,0xe6, + 0x8d,0xa8,0xd2,0x0d,0x13,0xd1,0x97,0x1a, + 0x8d,0xa0,0xd2,0x3d,0x13,0x71,0x94,0xda, + 0x85,0x20,0xe1,0x3d,0xb9,0x72,0x68,0xd2, + 0x8d,0x10,0xd1,0x9d,0x1a,0xb1,0xa0,0x5a, + 0x3e,0x23,0x7b,0x34,0xe5,0x45,0xa0,0x62, + 0x3e,0xb3,0x78,0x54,0xee,0x05,0x9b,0xe2, + 0xa7,0xb0,0x2e,0x5f,0x1a,0x3d,0xa3,0x72, + 0x34,0xd3,0x45,0x14,0x61,0x86,0xba,0xe8, + 0x61,0x8e,0xba,0xd8,0x61,0x2e,0xb9,0x18, + 0x69,0xae,0x8a,0x18,0xc3,0xad,0x76,0x10, + 0xcb,0x9d,0x46,0xb0,0x68,0x5e,0x8e,0x38, + 0xdb,0x6d,0x24,0x91,0x24,0x99,0x24,0xa9, + 0x24,0x09,0x27,0xc9,0x2f,0x49,0x1c,0x49, + 0xb6,0x4a,0x4a,0x42,0x42,0x72,0x72,0xd2, + 0xd1,0x11,0x19,0x99,0xaa,0xaa,0x00,0x03, }; 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 @@ +/*************************************************************************** + * __________ __ ___. + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * $Id: palette-presets.h $ + * + * All files in this archive are subject to the GNU General Public License. + * See the file COPYING in the source tree root for full license agreement. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ****************************************************************************/ +#ifndef __PALETTE_PRESETS_H__ +#define __PALETTE_PRESETS_H__ + +/* The following is an array of palettes for use in Rockboy. Some were + * originally found in GoomBA for Game Boy Advance by FluBBa. + * + * The first line contains the colors for the background layer. + * The second contains the colors for the window layer. + * The third contains the colors for object 0 layer. + * The fourth contains the colors for object 1 layer. + * + * gnuboy seems to like the colors to be 0xBBGGRR */ + +int palettes [17][4][4] = { + { + /* Brown */ { 0x98d0e0, 0x68a0b0, 0x60707C, 0x2C3C3C }, + { 0x98d0e0, 0x68a0b0, 0x60707C, 0x2C3C3C }, + { 0x98d0e0, 0x68a0b0, 0x60707C, 0x2C3C3C }, + { 0x98d0e0, 0x68a0b0, 0x60707C, 0x2C3C3C } + }, + + { + /* Gray */ { 0xffffff, 0xaaaaaa, 0x555555, 0x000000 }, + { 0xffffff, 0xaaaaaa, 0x555555, 0x000000 }, + { 0xffffff, 0xaaaaaa, 0x555555, 0x000000 }, + { 0xffffff, 0xaaaaaa, 0x555555, 0x000000 } + }, + + { + /* Light Gray */ { 0xffffff, 0xc0c0c0, 0x808080, 0x404040 }, + { 0xffffff, 0xc0c0c0, 0x808080, 0x404040 }, + { 0xffffff, 0xc0c0c0, 0x808080, 0x404040 }, + { 0xffffff, 0xc0c0c0, 0x808080, 0x404040 } + }, + + { + /* Multi-Color 1 */ { 0xffffff, 0xaaaaaa, 0x555555, 0x000000 }, + { 0xffffff, 0xaaaaaa, 0x555555, 0x000000 }, + { 0xffefef, 0xe78c5a, 0x9c4a18, 0x000000 }, + { 0xefefff, 0x635aef, 0x1810ad, 0x000000 } + }, + + { + /* Multi-Color 2 */ { 0xffffff, 0xaaaaaa, 0x555555, 0x000000 }, + { 0xe7efd6, 0xc6de8c, 0x6b8429, 0x000000 }, + { 0xffffff, 0x635aef, 0x1810ad, 0x000000 }, + { 0xffffff, 0xe78c5a, 0x9c4a18, 0x000000 } + }, + + { + /* Adventure Island */ { 0xffffff, 0xffb59c, 0x009431, 0x000000 }, + { 0xffffff, 0x73cef7, 0x084a8c, 0x9c2121 }, + { 0xdeffff, 0x73c6ef, 0x5263ff, 0x290000 }, + { 0xffffff, 0xa5a5e7, 0x29297b, 0x000042 } + }, + + { + /* Adventure Island 2 */ { 0xffffff, 0x75eff7, 0xbd6b29, 0x000000 }, + { 0xffffff, 0x73cef7, 0x084a8c, 0x9c2121 }, + { 0xdeffff, 0x73c6ef, 0x5263ff, 0x290000 }, + { 0xffffff, 0xa5a5e7, 0x29297b, 0x000042 } + }, + + { + /* Balloon Kid */ { 0xa5d6ff, 0xe7efff, 0xde8c10, 0x5a1000 }, + { 0xffffff, 0x73cef7, 0x084a8c, 0x9c2121 }, + { 0xc6c6ff, 0x6b6bff, 0x0000ff, 0x000063 }, + { 0xffffff, 0xef42ef, 0x29297b, 0x000042 } + }, + + { + /* Batman */ { 0xeff7ff, 0xc88089, 0x445084, 0x001042 }, + { 0xffffff, 0xffa5a5, 0xbd5252, 0xa50000 }, + { 0xffffff, 0xc6a5a5, 0x8c5252, 0x5a0000 }, + { 0xffffff, 0xbdb5ad, 0x7b6b5a, 0x422108 } + }, + + { + /* Batman */ { 0xffffff, 0xbdada5, 0x7b5a52, 0x391000 }, + /* Return of Joker */ { 0xffffff, 0xbdada5, 0x7b5a52, 0x391000 }, + { 0xffffff, 0xbdada5, 0x7b5a52, 0x391000 }, + { 0xffffff, 0xbdada5, 0x7b5a52, 0x422108 } + }, + + { + /* Bionic Commando */ { 0xfff7ef, 0xadb5ce, 0x2921c6, 0x000039 }, + { 0xffffff, 0xf7ce94, 0xff3910, 0x4a0000 }, + { 0xffffff, 0x84adff, 0x00395a, 0x000000 }, + { 0xefefef, 0x9ca5ad, 0x5a5a6b, 0x081042 } + }, + + { + /* Castlevania Adventure */ { 0xe7d6d6, 0xb5a58c, 0x6b5242, 0x181000 }, + { 0xffffff, 0xdba5a5, 0xad5252, 0x840000 }, + { 0xffffff, 0x84e7ff, 0x4252ff, 0x00005a }, + { 0xffffff, 0xceefff, 0x9cdef7, 0x6bb5f7 } + }, + + { + /* Donkey Kong Land */ { 0xd1ffe2, 0x89ffa9, 0x48a251, 0x032504 }, + { 0xb4b4ff, 0x4747ff, 0x000080, 0x000000 }, + { 0xb0f2ff, 0x4dc3d6, 0x115ba3, 0x00006a }, + { 0x63fff7, 0x42cec6, 0x217b73, 0x000000 } + }, + + { + /* Dr. Mario */ { 0xffffff, 0x66ffff, 0xff4221, 0x521000 }, + { 0xffffff, 0xd6aaaa, 0xad5555, 0x840000 }, + { 0xffffff, 0x84e7ff, 0x4252ff, 0x00008c }, + { 0xffffff, 0x8cceff, 0x5a9cf7, 0x005283 } + }, + + { + /* Kirby */ { 0x83ffff, 0x3ea5ff, 0x004273, 0x000933 }, + { 0xffcccc, 0xff7877, 0xc13523, 0x5a0a05 }, + { 0xc4bdff, 0x604df1, 0x29129f, 0x000000 }, + { 0xffffff, 0xaaaaaa, 0x555555, 0x000020 } + }, + + { + /* Metroid II */ { 0xdeffef, 0xb2ada2, 0x014284, 0x000000 }, + { 0xffcef7, 0xff6bce, 0x9c007b, 0x000000 }, + { 0x55efff, 0x1352ff, 0x001485, 0x000000 }, + { 0xffefef, 0xe78c5a, 0x9c4a18, 0x210000 } + }, + + { + /* Zelda */ { 0xa0ffff, 0x67d767, 0x20558c, 0x071546 }, + { 0xadffff, 0xb78080, 0x592925, 0x000000 }, + { 0x7fb0ff, 0xe78c5a, 0x9c4a18, 0x000000 }, + { 0xefefff, 0x635aef, 0x1810ad, 0x000000 } + } + }; + +#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 @@ - - -#include "rockmacros.h" -#include "defs.h" -#include "fb.h" -#include "palette.h" - - -static byte palmap[32768]; -static byte pallock[256]; -static int palrev[256]; - -/* Course color mapping, for when palette is exhausted. */ -static byte crsmap[4][32768]; -static int crsrev[4][256]; -static const int crsmask[4] = { 0x7BDE, 0x739C, 0x6318, 0x4210 }; - -enum plstatus -{ - pl_unused = 0, - pl_linger, - pl_active, - pl_locked -}; - -/* -static byte bestmatch(int c) -{ - byte n, best; - int r, g, b; - int r2, g2, b2, c2; - int err, besterr; - - r = (c & 0x001F) << 3; - g = (c & 0x03E0) >> 2; - b = (c & 0x7C00) >> 7; - - best = 0; - besterr = 1024; - for (n = 1; n; n++) - { - c2 = palrev[n]; - r2 = (c2 & 0x001F) << 3; - g2 = (c2 & 0x03E0) >> 2; - b2 = (c2 & 0x7C00) >> 7; - err = abs(r-r2) + abs(b-b2) + abs(g-g2); - if (err < besterr) - { - besterr = err; - best = n; - } - } - return best; -} -*/ - -static void makecourse(int c, byte n) -{ - int i; - for (i = 0; i < 4; i++) - { - c &= crsmask[i]; - crsmap[i][c] = n; - crsrev[i][n] = c; - } -} - -static byte findcourse(int c) -{ - int i; - byte n; - for (i = 0; i < 4; i++) - { - c &= crsmask[i]; - n = crsmap[i][c]; - if (crsrev[i][n] == c) - return n; - } - return 0; -} - - -void pal_lock(byte n) -{ - if (!n) return; - if (pallock[n] >= pl_locked) - pallock[n]++; - else pallock[n] = pl_locked; -} - -byte pal_getcolor(int c, int r, int g, int b) -{ - byte n; - static byte l; - n = palmap[c]; - if (n && pallock[n] && palrev[n] == c) - { - pal_lock(n); - return n; - } - for (n = l+1; n != l; n++) - { - if (!n || pallock[n] /* || n < 16 */) continue; - pal_lock(n); - palmap[c] = n; - palrev[n] = c; - makecourse(c, n); - vid_setpal(n, r, g, b); - return (l = n); - } - n = findcourse(c); - pal_lock(n); - return n; -} - -void pal_release(byte n) -{ - if (pallock[n] >= pl_locked) - pallock[n]--; -} - - -void pal_expire(void) -{ - int i; - for (i = 0; i < 256; i++) - if (pallock[i] && pallock[i] < pl_locked) - pallock[i]--; -} - - -void pal_set332(void) -{ - int i, r, g, b; - - fb.indexed = 0; - fb.cc[0].r = 5; - fb.cc[1].r = 5; - fb.cc[2].r = 6; - fb.cc[0].l = 0; - fb.cc[1].l = 3; - fb.cc[2].l = 6; - - i = 0; - for (b = 0; b < 4; b++) for (g = 0; g < 8; g++) for (r = 0; r < 8; r++) - vid_setpal(i++, (r<<5)|(r<<2)|(r>>1), - (g<<5)|(g<<2)|(g>>1), (b<<6)|(b<<4)|(b<<2)|b); -} - - - - - 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 @@ -void pal_lock(byte n) ICODE_ATTR; -byte pal_getcolor(int c, int r, int g, int b) ICODE_ATTR; -void pal_release(byte n) ICODE_ATTR; -void pal_expire(void) ICODE_ATTR; -void pal_set332(void) ICODE_ATTR; -void vid_setpal(int i, int r, int g, int b) ICODE_ATTR; diff --git a/apps/plugins/rockboy/pcm.h b/apps/plugins/rockboy/pcm.h index 3719933520..a616ce9897 100644 --- a/apps/plugins/rockboy/pcm.h +++ b/apps/plugins/rockboy/pcm.h @@ -7,10 +7,10 @@ struct pcm { - int hz, len; - int stereo; - byte *buf; - int pos; + int hz, len; + int stereo; + byte *buf; + int pos; }; extern struct pcm pcm; diff --git a/apps/plugins/rockboy/rbsound.c b/apps/plugins/rockboy/rbsound.c index 6371212ca8..41d00c1b73 100644 --- a/apps/plugins/rockboy/rbsound.c +++ b/apps/plugins/rockboy/rbsound.c @@ -1,11 +1,13 @@ #include "rockmacros.h" #include "defs.h" #include "pcm.h" -#include "rc.h" -//#define ONEBUF // Note: I think the single buffer implementation is more responsive with sound(less lag) - // but it creates more choppyness overall to the sound. 2 buffer's don't seem to make - // a difference, but 4 buffers is definately noticable +/*#define ONEBUF*/ + /* Note: I think the single buffer implementation is more + * responsive with sound(less lag) but it creates more + * choppyness overall to the sound. 2 buffer's don't seem to + * make a difference, but 4 buffers is definately noticable + */ struct pcm pcm IBSS_ATTR; @@ -17,11 +19,6 @@ bool sound = 1; #endif #define BUF_SIZE 1024 -rcvar_t pcm_exports[] = -{ - RCV_END -}; - #if CONFIG_CODEC == SWCODEC && !defined(SIMULATOR) #ifndef ONEBUF @@ -48,46 +45,45 @@ void get_more(unsigned char** start, size_t* size) void pcm_init(void) { - if(!sound) return; - - newly_started = true; + newly_started = true; - pcm.hz = 11025; - pcm.stereo = 1; + pcm.hz = 11025; + pcm.stereo = 1; - pcm.len = BUF_SIZE; - if(!buf){ + pcm.len = BUF_SIZE; + if(!buf){ buf = my_malloc(pcm.len * N_BUFS); - gmbuf = my_malloc(pcm.len * N_BUFS*sizeof (short)); - pcm.buf = buf; - pcm.pos = 0; + gmbuf = my_malloc(pcm.len * N_BUFS*sizeof (short)); + pcm.buf = buf; + pcm.pos = 0; #ifndef ONEBUF curbuf = gmcurbuf= 0; #endif memset(gmbuf, 0, pcm.len * N_BUFS *sizeof(short)); memset(buf, 0, pcm.len * N_BUFS); - } + } - rb->pcm_play_stop(); + rb->pcm_play_stop(); - rb->pcm_set_frequency(11025); // 44100 22050 11025 + rb->pcm_set_frequency(11025); /* 44100 22050 11025 */ } void pcm_close(void) { - memset(&pcm, 0, sizeof pcm); - newly_started = true; - rb->pcm_play_stop(); - rb->pcm_set_frequency(44100); + memset(&pcm, 0, sizeof pcm); + newly_started = true; + rb->pcm_play_stop(); + rb->pcm_set_frequency(44100); } int pcm_submit(void) { - register int i; + if (!options.sound) return 1; + register int i; - if (!sound) { - pcm.pos = 0; - return 0; + if (!sound) { + pcm.pos = 0; + return 0; } if (pcm.pos < pcm.len) return 1; @@ -98,7 +94,7 @@ int pcm_submit(void) #endif pcm.pos = 0; - // gotta convert the 8 bit buffer to 16 + /* gotta convert the 8 bit buffer to 16 */ for(i=0; iyield(); doneplay=0; @@ -120,7 +118,7 @@ int pcm_submit(void) return 1; } #else -static byte buf1_unal[(BUF_SIZE / sizeof(short)) + 2]; // to make sure 4 byte aligned +static byte buf1_unal[(BUF_SIZE / sizeof(short)) + 2]; /* 4 byte aligned */ void pcm_init(void) { 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 @@ -#ifndef __RC_H__ -#define __RC_H__ - -typedef enum rctype -{ - rcv_end, - rcv_int, - rcv_string, - rcv_vector, - rcv_bool -} rcvtype_t; - - -typedef struct rcvar_s -{ - char *name; - int type; - int len; - void *mem; -} rcvar_t; - -#define RCV_END { 0, rcv_end, 0, 0 } -#define RCV_INT(n,v) { (n), rcv_int, 1, (v) } -#define RCV_STRING(n,v) { (n), rcv_string, 0, (v) } -#define RCV_VECTOR(n,v,l) { (n), rcv_vector, (l), (v) } -#define RCV_BOOL(n,v) { (n), rcv_bool, 1, (v) } - -typedef struct rccmd_s -{ - char *name; - int (*func)(int, char **); -} rccmd_t; - -#define RCC(n,f) { (n), (f) } -#define RCC_END { 0, 0 } - -void rc_export(rcvar_t *v); -void rc_exportvars(rcvar_t *vars); - -int rc_findvar(char *name); - -int rc_setvar_n(int i, int c, char **v); -int rc_setvar(char *name, int c, char **v); - -int rc_getint_n(int i); -int *rc_getvec_n(int i); -char *rc_getstr_n(int i); - -int rc_getint(char *name); -int *rc_getvec(char *name); -char *rc_getstr(char *name); - -int rc_bindkey(char *keyname, char *cmd); -int rc_unbindkey(char *keyname); -void rc_unbindall(void); - -int rc_sourcefile(char *filename); -void rc_dokey(int key, int st); - -int rc_command(char *line); - -#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 @@ - - - - -#include "rockmacros.h" - -#include "defs.h" -#include "rc.h" -#include "hw.h" -#include "emu.h" -#include "save.h" -#include "split.h" - -/* - * the set command is used to set rc-exported variables. - */ - -static int cmd_set(int argc, char **argv) -{ - if (argc < 3) - return -1; - return rc_setvar(argv[1], argc-2, argv+2); -} - - - -/* - * the following commands allow keys to be bound to perform rc commands. - */ - -static int cmd_reset(int argc, char **argv) -{ - (void)argc; - (void)argv; - emu_reset(); - return 0; -} - -static int cmd_savestate(int argc, char **argv) -{ - state_save(argc > 1 ? atoi(argv[1]) : -1); - return 0; -} - -static int cmd_loadstate(int argc, char **argv) -{ - state_load(argc > 1 ? atoi(argv[1]) : -1); - return 0; -} - - - -/* - * table of command names and the corresponding functions to be called - */ - -rccmd_t rccmds[] = -{ - RCC("set", cmd_set), - RCC("reset", cmd_reset), - RCC("savestate", cmd_savestate), - RCC("loadstate", cmd_loadstate), - RCC_END -}; - - - - - -int rc_command(char *line) -{ - int i, argc, ret; - char *argv[128], linecopy[500]; - -// linecopy = malloc(strlen(line)+1); - strcpy(linecopy, line); - - argc = splitline(argv, (sizeof argv)/(sizeof argv[0]), linecopy); - if (!argc) - { -// free(linecopy); - return -1; - } - - for (i = 0; rccmds[i].name; i++) - { - if (!strcmp(argv[0], rccmds[i].name)) - { - ret = rccmds[i].func(argc, argv); -// free(linecopy); - return ret; - } - } - - /* printf("unknown command: %s\n", argv[0]); */ -// free(linecopy); - - return -1; -} - - - - - - - - - - - - - - - - - - - - - - - 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 @@ -#include "rockmacros.h" - -#include "defs.h" -#include "rc.h" - -static rcvar_t rcvars[150]; - -static int nvars; - -void rc_export(rcvar_t *v) -{ - const rcvar_t end = RCV_END; - - if (!v) return; - nvars++; -// rcvars = realloc(rcvars, sizeof (rcvar_t) * (nvars+1)); -// if (!rcvars) -// die("out of memory adding rcvar %s\n", v->name); - rcvars[nvars-1] = *v; - rcvars[nvars] = end; -} - -void rc_exportvars(rcvar_t *vars) -{ - while(vars->type) - rc_export(vars++); -} - - - -int rc_findvar(char *name) -{ - int i; - if (!rcvars) return -1; - for (i = 0; rcvars[i].name; i++) - if (!strcmp(rcvars[i].name, name)) - break; - if (!rcvars[i].name) - return -1; - return i; -} - - -int my_atoi(const char *s) -{ - int a = 0; - if (*s == '0') - { - s++; - if (*s == 'x' || *s == 'X') - { - s++; - while (*s) - { - if (isdigit(*s)) - a = (a<<4) + *s - '0'; - else if (strchr("ABCDEF", *s)) - a = (a<<4) + *s - 'A' + 10; - else if (strchr("abcdef", *s)) - a = (a<<4) + *s - 'a' + 10; - else return a; - s++; - } - return a; - } - while (*s) - { - if (strchr("01234567", *s)) - a = (a<<3) + *s - '0'; - else return a; - s++; - } - return a; - } - if (*s == '-') - { - s++; - for (;;) - { - if (isdigit(*s)) - a = (a*10) + *s - '0'; - else return -a; - s++; - } - } - while (*s) - { - if (isdigit(*s)) - a = (a*10) + *s - '0'; - else return a; - s++; - } - return a; -} - - -int rc_setvar_n(int i, int c, char **v) -{ - int j; - int *n; - char **s; - - switch (rcvars[i].type) - { - case rcv_int: - if (c < 1) return -1; - n = (int *)rcvars[i].mem; - *n = my_atoi(v[0]); - return 0; - case rcv_string: - if (c < 1) return -1; - s = (char **)rcvars[i].mem; -// if (*s) free(*s); - strcpy(*s,v[0]); - if (!*s) - die("out of memory setting rcvar %s\n", rcvars[i].name); - return 0; - case rcv_vector: - if (c > rcvars[i].len) - c = rcvars[i].len; - for (j = 0; j < c ; j++) - ((int *)rcvars[i].mem)[j] = my_atoi(v[j]); - return 0; - case rcv_bool: - if (c < 1 || atoi(v[0]) || strchr("yYtT", v[0][0])) - *(int *)rcvars[i].mem = 1; - else if (strchr("0nNfF", v[0][0])) - *(int *)rcvars[i].mem = 0; - else - return -1; - return 0; - } - return -1; -} - - -int rc_setvar(char *name, int c, char **v) -{ - int i; - - i = rc_findvar(name); - if (i < 0) return i; - - return rc_setvar_n(i, c, v); -} - - -void *rc_getmem_n(int i) -{ - return rcvars[i].mem; -} - - -void *rc_getmem(char *name) -{ - int i; - i = rc_findvar(name); - if (i < 0) return NULL; - return rcvars[i].mem; -} - -int rc_getint_n(int i) -{ - if (i < 0) return 0; - switch (rcvars[i].type) - { - case rcv_int: - case rcv_bool: - return *(int *)rcvars[i].mem; - } - return 0; -} - -int *rc_getvec_n(int i) -{ - if (i < 0) return NULL; - switch (rcvars[i].type) - { - case rcv_int: - case rcv_bool: - case rcv_vector: - return (int *)rcvars[i].mem; - } - return NULL; -} - -char *rc_getstr_n(int i) -{ - if (i < 0) return 0; - switch (rcvars[i].type) - { - case rcv_string: - return *(char **)rcvars[i].mem; - } - return 0; -} - -int rc_getint(char *name) -{ - return rc_getint_n(rc_findvar(name)); -} - -int *rc_getvec(char *name) -{ - return rc_getvec_n(rc_findvar(name)); -} - -char *rc_getstr(char *name) -{ - return rc_getstr_n(rc_findvar(name)); -} 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) snprintf(optionsave, sizeof(optionsave), "%s/%s", savedir, optionname); fd = open(optionsave, O_RDONLY); - if(fd < 0) // no options to read, set defaults + if(fd < 0) /* no options to read, set defaults */ { #if (CONFIG_KEYPAD == IRIVER_H100_PAD) options.A=BUTTON_ON; @@ -136,13 +136,31 @@ void setoptions (void) options.START=BUTTON_SCROLL_UP; options.SELECT=BUTTON_SCROLL_DOWN; options.MENU=BUTTON_POWER; +#elif CONFIG_KEYPAD == IAUDIO_X5_PAD + options.A=BUTTON_PLAY; + options.B=BUTTON_REC; + options.START=BUTTON_SELECT; + options.SELECT=BUTTON_NONE; + options.MENU=BUTTON_POWER; + +#elif CONFIG_KEYPAD == IRIVER_H10_PAD + options.A=BUTTON_PLAY; + options.B=BUTTON_FF; + options.START=BUTTON_REW; + options.SELECT=BUTTON_NONE; + options.MENU=BUTTON_POWER; #endif options.maxskip=4; options.fps=0; options.showstats=0; +#if (LCD_WIDTH>=160) && (LCD_HEIGHT>=144) options.fullscreen=0; +#else + options.fullscreen=1; +#endif options.sound=1; + options.pal=0; } else read(fd,&options, sizeof(options)); @@ -197,9 +215,6 @@ enum plugin_status plugin_start(struct plugin_api* api, void* parameter) rb->wheel_send_events(false); #endif - /* now go ahead and have fun! */ - /* rb->splash(HZ*2, true, "Rockboy v0.3"); */ - /* rb->lcd_clear_display(); */ gnuboy_main(parameter); #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); extern struct plugin_api* rb; extern int shut,cleanshut; -void vid_update(int scanline); void vid_init(void); inline void vid_begin(void); -void vid_end(void); void die(char *message, ...); void setmallocpos(void *pointer); -void vid_settitle(char *title); void *sys_timer(void); int sys_elapsed(long *oldtick); -void sys_sleep(int us); int pcm_submit(void); void pcm_init(void); +void sound_dirty(void); void doevents(void) ICODE_ATTR; void ev_poll(void); int do_user_menu(void); void loadstate(int fd); void savestate(int fd); void setvidmode(int mode); +void set_pal(void); +#if !defined(HAVE_LCD_COLOR) +void vid_update(int scanline); +#endif +#ifdef DYNAREC +extern struct dynarec_block newblock; +void dynamic_recompile (struct dynarec_block *newblock); +#endif + #define USER_MENU_QUIT -2 /* Disable ICODE for the ARMs */ @@ -54,6 +60,12 @@ void setvidmode(int mode); #define ICODE_ATTR #endif +/* Disable IBSS when using dynarec since it won't fit */ +#ifdef DYNAREC +#undef IBSS_ATTR +#define IBSS_ATTR +#endif + /* libc functions */ #define isdigit(c) ((c) >= '0' && (c) <= '9') #define isalpha(c) (((c) >= 'a' && (c) <= 'z') || ((c) >= 'A' && ((c) <= 'Z'))) @@ -101,12 +113,13 @@ void setvidmode(int mode); #define tolower(_A_) (isupper(_A_) ? (_A_ - 'A' + 'a') : _A_) /* Using #define isn't enough with GCC 4.0.1 */ -void* memcpy(void* dst, const void* src, size_t size); +void* memcpy(void* dst, const void* src, size_t size) ICODE_ATTR; struct options { int A, B, START, SELECT, MENU; int frameskip, fps, maxskip; int sound, fullscreen, showstats; + int pal; }; extern struct options options; diff --git a/apps/plugins/rockboy/rtc-gb.h b/apps/plugins/rockboy/rtc-gb.h index 39c6145161..94772da923 100644 --- a/apps/plugins/rockboy/rtc-gb.h +++ b/apps/plugins/rockboy/rtc-gb.h @@ -6,12 +6,12 @@ struct rtc { - int batt; - int sel; - int latch; - int d, h, m, s, t; - int stop, carry; - byte regs[8]; + int batt; + int sel; + int latch; + int d, h, m, s, t; + int stop, carry; + byte regs[8]; }; extern struct rtc rtc; @@ -21,5 +21,5 @@ void rtc_write(byte b); void rtc_tick(void); void rtc_save_internal(int fd); void rtc_load_internal(int fd); - + #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 @@ #include "defs.h" #include "mem.h" #include "rtc-gb.h" -#include "rc.h" - -struct rtc rtc IBSS_ATTR; - -static int syncrtc = 1; - -rcvar_t rtc_exports[] = -{ - RCV_BOOL("syncrtc", &syncrtc), - RCV_END -}; +struct rtc rtc; void rtc_latch(byte b) { - if ((rtc.latch ^ b) & b & 1) - { - rtc.regs[0] = rtc.s; - rtc.regs[1] = rtc.m; - rtc.regs[2] = rtc.h; - rtc.regs[3] = rtc.d; - rtc.regs[4] = (rtc.d>>9) | (rtc.stop<<6) | (rtc.carry<<7); - rtc.regs[5] = 0xff; - rtc.regs[6] = 0xff; - rtc.regs[7] = 0xff; - } - rtc.latch = b; + if ((rtc.latch ^ b) & b & 1) + { + rtc.regs[0] = rtc.s; + rtc.regs[1] = rtc.m; + rtc.regs[2] = rtc.h; + rtc.regs[3] = rtc.d; + rtc.regs[4] = (rtc.d>>9) | (rtc.stop<<6) | (rtc.carry<<7); + rtc.regs[5] = 0xff; + rtc.regs[6] = 0xff; + rtc.regs[7] = 0xff; + } + rtc.latch = b; } void rtc_write(byte b) { - /* printf("write %02X: %02X (%d)\n", rtc.sel, b, b); */ - if (!(rtc.sel & 8)) return; - switch (rtc.sel & 7) - { - case 0: - rtc.s = rtc.regs[0] = b; - while (rtc.s >= 60) rtc.s -= 60; - break; - case 1: - rtc.m = rtc.regs[1] = b; - while (rtc.m >= 60) rtc.m -= 60; - break; - case 2: - rtc.h = rtc.regs[2] = b; - while (rtc.h >= 24) rtc.h -= 24; - break; - case 3: - rtc.regs[3] = b; - rtc.d = (rtc.d & 0x100) | b; - break; - case 4: - rtc.regs[4] = b; - rtc.d = (rtc.d & 0xff) | ((b&1)<<9); - rtc.stop = (b>>6)&1; - rtc.carry = (b>>7)&1; - break; - } + /* printf("write %02X: %02X (%d)\n", rtc.sel, b, b); */ + if (!(rtc.sel & 8)) return; + switch (rtc.sel & 7) + { + case 0: + rtc.s = rtc.regs[0] = b; + while (rtc.s >= 60) rtc.s -= 60; + break; + case 1: + rtc.m = rtc.regs[1] = b; + while (rtc.m >= 60) rtc.m -= 60; + break; + case 2: + rtc.h = rtc.regs[2] = b; + while (rtc.h >= 24) rtc.h -= 24; + break; + case 3: + rtc.regs[3] = b; + rtc.d = (rtc.d & 0x100) | b; + break; + case 4: + rtc.regs[4] = b; + rtc.d = (rtc.d & 0xff) | ((b&1)<<9); + rtc.stop = (b>>6)&1; + rtc.carry = (b>>7)&1; + break; + } } void rtc_tick() { - if (rtc.stop) return; - if (++rtc.t == 60) - { - if (++rtc.s == 60) - { - if (++rtc.m == 60) - { - if (++rtc.h == 24) - { - if (++rtc.d == 365) - { - rtc.d = 0; - rtc.carry = 1; - } - rtc.h = 0; - } - rtc.m = 0; - } - rtc.s = 0; - } - rtc.t = 0; - } + if (rtc.stop) return; + if (++rtc.t == 60) + { + if (++rtc.s == 60) + { + if (++rtc.m == 60) + { + if (++rtc.h == 24) + { + if (++rtc.d == 365) + { + rtc.d = 0; + rtc.carry = 1; + } + rtc.h = 0; + } + rtc.m = 0; + } + rtc.s = 0; + } + rtc.t = 0; + } } void rtc_save_internal(int fd) { - (void)fd; // stop compiler complaining - // TODO -// fprintf(f, "%d %d %d %02d %02d %02d %02d\n%d\n", -// rtc.carry, rtc.stop, rtc.d, rtc.h, rtc.m, rtc.s, rtc.t, -// time(0)); + (void)fd; /* stop compiler complaining */ + /* TODO */ + /* fprintf(f, "%d %d %d %02d %02d %02d %02d\n%d\n", + rtc.carry, rtc.stop, rtc.d, rtc.h, rtc.m, rtc.s, rtc.t, + time(0)); */ } void rtc_load_internal(int fd) { - //int rt = 0; - (void)fd; // stop compiler complaining - // TODO -/* fscanf( - f, "%d %d %d %02d %02d %02d %02d\n%d\n", - &rtc.carry, &rtc.stop, &rtc.d, - &rtc.h, &rtc.m, &rtc.s, &rtc.t, &rt); - while (rtc.t >= 60) rtc.t -= 60; - while (rtc.s >= 60) rtc.s -= 60; - while (rtc.m >= 60) rtc.m -= 60; - while (rtc.h >= 24) rtc.h -= 24; - while (rtc.d >= 365) rtc.d -= 365; - rtc.stop &= 1; - rtc.carry &= 1; - if (rt) rt = (time(0) - rt) * 60; - if (syncrtc) while (rt-- > 0) rtc_tick(); */ + /* int rt = 0; */ + (void)fd; /* stop compiler complaining */ + /* TODO */ + /* fscanf( + f, "%d %d %d %02d %02d %02d %02d\n%d\n", + &rtc.carry, &rtc.stop, &rtc.d, + &rtc.h, &rtc.m, &rtc.s, &rtc.t, &rt); + while (rtc.t >= 60) rtc.t -= 60; + while (rtc.s >= 60) rtc.s -= 60; + while (rtc.m >= 60) rtc.m -= 60; + while (rtc.h >= 24) rtc.h -= 24; + while (rtc.d >= 365) rtc.d -= 365; + rtc.stop &= 1; + rtc.carry &= 1; + if (rt) rt = (time(0) - rt) * 60; + if (syncrtc) while (rt-- > 0) rtc_tick(); */ } 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 @@ struct svar { - int len; - char key[4]; - void *ptr; + int len; + char key[4]; + void *ptr; }; static int ver; @@ -41,247 +41,243 @@ static int hramofs, hiofs, palofs, oamofs, wavofs; struct svar svars[] = { - I4("GbSs", &ver), - - I2("PC ", &PC), - I2("SP ", &SP), - I2("HL ", &HL), + I4("GbSs", &ver), + + I2("PC ", &PC), + I2("SP ", &SP), + I2("HL ", &HL), #ifdef DYNAREC - I1("A ", &A), - I1("B ", &A), - I1("C ", &A), - I1("D ", &A), - I1("E ", &A), - I1("F ", &A), + I1("A ", &A), + I1("B ", &A), + I1("C ", &A), + I1("D ", &A), + I1("E ", &A), + I1("F ", &A), #else - I2("BC ", &BC), - I2("DE ", &DE), - I2("AF ", &AF), -#endif - I4("IME ", &cpu.ime), - I4("ima ", &cpu.ima), - I4("spd ", &cpu.speed), - I4("halt", &cpu.halt), - I4("div ", &cpu.div), - I4("tim ", &cpu.tim), - I4("lcdc", &cpu.lcdc), - I4("snd ", &cpu.snd), - - I1("ints", &hw.ilines), - I1("pad ", &hw.pad), - I4("cgb ", &hw.cgb), - I4("gba ", &hw.gba), - - I4("mbcm", &mbc.model), - I4("romb", &mbc.rombank), - I4("ramb", &mbc.rambank), - I4("enab", &mbc.enableram), - I4("batt", &mbc.batt), - - I4("rtcR", &rtc.sel), - I4("rtcL", &rtc.latch), - I4("rtcC", &rtc.carry), - I4("rtcS", &rtc.stop), - I4("rtcd", &rtc.d), - I4("rtch", &rtc.h), - I4("rtcm", &rtc.m), - I4("rtcs", &rtc.s), - I4("rtct", &rtc.t), - I1("rtR8", &rtc.regs[0]), - I1("rtR9", &rtc.regs[1]), - I1("rtRA", &rtc.regs[2]), - I1("rtRB", &rtc.regs[3]), - I1("rtRC", &rtc.regs[4]), + I2("BC ", &BC), + I2("DE ", &DE), + I2("AF ", &AF), +#endif + I4("IME ", &cpu.ime), + I4("ima ", &cpu.ima), + I4("spd ", &cpu.speed), + I4("halt", &cpu.halt), + I4("div ", &cpu.div), + I4("tim ", &cpu.tim), + I4("lcdc", &cpu.lcdc), + I4("snd ", &cpu.snd), + + I1("ints", &hw.ilines), + I1("pad ", &hw.pad), + I4("cgb ", &hw.cgb), + + I4("mbcm", &mbc.model), + I4("romb", &mbc.rombank), + I4("ramb", &mbc.rambank), + I4("enab", &mbc.enableram), + I4("batt", &mbc.batt), + + I4("rtcR", &rtc.sel), + I4("rtcL", &rtc.latch), + I4("rtcC", &rtc.carry), + I4("rtcS", &rtc.stop), + I4("rtcd", &rtc.d), + I4("rtch", &rtc.h), + I4("rtcm", &rtc.m), + I4("rtcs", &rtc.s), + I4("rtct", &rtc.t), + I1("rtR8", &rtc.regs[0]), + I1("rtR9", &rtc.regs[1]), + I1("rtRA", &rtc.regs[2]), + I1("rtRB", &rtc.regs[3]), + I1("rtRC", &rtc.regs[4]), - I4("S1on", &snd.ch[0].on), - I4("S1p ", &snd.ch[0].pos), - I4("S1c ", &snd.ch[0].cnt), - I4("S1ec", &snd.ch[0].encnt), - I4("S1sc", &snd.ch[0].swcnt), - I4("S1sf", &snd.ch[0].swfreq), + I4("S1on", &snd.ch[0].on), + I4("S1p ", &snd.ch[0].pos), + I4("S1c ", &snd.ch[0].cnt), + I4("S1ec", &snd.ch[0].encnt), + I4("S1sc", &snd.ch[0].swcnt), - I4("S2on", &snd.ch[1].on), - I4("S2p ", &snd.ch[1].pos), - I4("S2c ", &snd.ch[1].cnt), - I4("S2ec", &snd.ch[1].encnt), - - I4("S3on", &snd.ch[2].on), - I4("S3p ", &snd.ch[2].pos), - I4("S3c ", &snd.ch[2].cnt), - - I4("S4on", &snd.ch[3].on), - I4("S4p ", &snd.ch[3].pos), - I4("S4c ", &snd.ch[3].cnt), - I4("S4ec", &snd.ch[3].encnt), - - I4("hdma", &hw.hdma), - - I4("sram", &sramblock), - I4("iram", &iramblock), - I4("vram", &vramblock), - I4("hi ", &hiofs), - I4("pal ", &palofs), - I4("oam ", &oamofs), - I4("wav ", &wavofs), - - /* NOSAVE is a special code to prevent the rest of the table - * from being saved, used to support old stuff for backwards - * compatibility... */ - NOSAVE, + I4("S2on", &snd.ch[1].on), + I4("S2p ", &snd.ch[1].pos), + I4("S2c ", &snd.ch[1].cnt), + I4("S2ec", &snd.ch[1].encnt), + + I4("S3on", &snd.ch[2].on), + I4("S3p ", &snd.ch[2].pos), + I4("S3c ", &snd.ch[2].cnt), + + I4("S4on", &snd.ch[3].on), + I4("S4p ", &snd.ch[3].pos), + I4("S4c ", &snd.ch[3].cnt), + I4("S4ec", &snd.ch[3].encnt), + + I4("hdma", &hw.hdma), + + I4("sram", &sramblock), + I4("iram", &iramblock), + I4("vram", &vramblock), + I4("hi ", &hiofs), + I4("pal ", &palofs), + I4("oam ", &oamofs), + + /* NOSAVE is a special code to prevent the rest of the table + * from being saved, used to support old stuff for backwards + * compatibility... */ + NOSAVE, - /* the following are obsolete as of 0x104 */ - - I4("hram", &hramofs), - - R(P1), R(SB), R(SC), - R(DIV), R(TIMA), R(TMA), R(TAC), - R(IE), R(IF), - R(LCDC), R(STAT), R(LY), R(LYC), - R(SCX), R(SCY), R(WX), R(WY), - R(BGP), R(OBP0), R(OBP1), - R(DMA), + /* the following are obsolete as of 0x104 */ + + I4("hram", &hramofs), + /* I4("gba ", &hw.gba), */ + /* I4("S1sf", &snd.ch[0].swfreq), */ + I4("wav ", &wavofs), + + R(P1), R(SB), R(SC), + R(DIV), R(TIMA), R(TMA), R(TAC), + R(IE), R(IF), + R(LCDC), R(STAT), R(LY), R(LYC), + R(SCX), R(SCY), R(WX), R(WY), + R(BGP), R(OBP0), R(OBP1), + R(DMA), - R(VBK), R(SVBK), R(KEY1), - R(BCPS), R(BCPD), R(OCPS), R(OCPD), + R(VBK), R(SVBK), R(KEY1), + R(BCPS), R(BCPD), R(OCPS), R(OCPD), - R(NR10), R(NR11), R(NR12), R(NR13), R(NR14), - R(NR21), R(NR22), R(NR23), R(NR24), - R(NR30), R(NR31), R(NR32), R(NR33), R(NR34), - R(NR41), R(NR42), R(NR43), R(NR44), - R(NR50), R(NR51), R(NR52), + R(NR10), R(NR11), R(NR12), R(NR13), R(NR14), + R(NR21), R(NR22), R(NR23), R(NR24), + R(NR30), R(NR31), R(NR32), R(NR33), R(NR34), + R(NR41), R(NR42), R(NR43), R(NR44), + R(NR50), R(NR51), R(NR52), - I1("DMA1", &R_HDMA1), - I1("DMA2", &R_HDMA2), - I1("DMA3", &R_HDMA3), - I1("DMA4", &R_HDMA4), - I1("DMA5", &R_HDMA5), - - END + I1("DMA1", &R_HDMA1), + I1("DMA2", &R_HDMA2), + I1("DMA3", &R_HDMA3), + I1("DMA4", &R_HDMA4), + I1("DMA5", &R_HDMA5), + + END }; void loadstate(int fd) { - int i, j; - byte buf[4096]; - un32 (*header)[2] = (un32 (*)[2])buf; - un32 d; - int irl = hw.cgb ? 8 : 2; - int vrl = hw.cgb ? 4 : 2; - int srl = mbc.ramsize << 1; - size_t base_offset; + int i, j; + byte buf[4096]; + un32 (*header)[2] = (un32 (*)[2])buf; + un32 d; + int irl = hw.cgb ? 8 : 2; + int vrl = hw.cgb ? 4 : 2; + int srl = mbc.ramsize << 1; + size_t base_offset; - ver = hramofs = hiofs = palofs = oamofs = wavofs = 0; + ver = hramofs = hiofs = palofs = oamofs = wavofs = 0; - base_offset = lseek(fd, 0, SEEK_CUR); + base_offset = lseek(fd, 0, SEEK_CUR); - read(fd,buf, 4096); - - for (j = 0; header[j][0]; j++) - { - for (i = 0; svars[i].ptr; i++) - { - if (header[j][0] != *(un32 *)svars[i].key) - continue; - d = LIL(header[j][1]); - switch (svars[i].len) - { - case 1: - *(byte *)svars[i].ptr = d; - break; - case 2: - *(un16 *)svars[i].ptr = d; - break; - case 4: - *(un32 *)svars[i].ptr = d; - break; - } - break; - } - } + read(fd,buf, 4096); + + for (j = 0; header[j][0]; j++) + { + for (i = 0; svars[i].ptr; i++) + { + if (header[j][0] != *(un32 *)svars[i].key) + continue; + d = LIL(header[j][1]); + switch (svars[i].len) + { + case 1: + *(byte *)svars[i].ptr = d; + break; + case 2: + *(un16 *)svars[i].ptr = d; + break; + case 4: + *(un32 *)svars[i].ptr = d; + break; + } + break; + } + } - /* obsolete as of version 0x104 */ - if (hramofs) memcpy(ram.hi+128, buf+hramofs, 127); - - if (hiofs) memcpy(ram.hi, buf+hiofs, sizeof ram.hi); - if (palofs) memcpy(lcd.pal, buf+palofs, sizeof lcd.pal); - if (oamofs) memcpy(lcd.oam.mem, buf+oamofs, sizeof lcd.oam); + /* obsolete as of version 0x104 */ + if (hramofs) memcpy(ram.hi+128, buf+hramofs, 127); + if (wavofs) memcpy(ram.hi+48, buf+wavofs, 16); + + if (hiofs) memcpy(ram.hi, buf+hiofs, sizeof ram.hi); + if (palofs) memcpy(lcd.pal, buf+palofs, sizeof lcd.pal); + if (oamofs) memcpy(lcd.oam.mem, buf+oamofs, sizeof lcd.oam); - if (wavofs) memcpy(snd.wave, buf+wavofs, sizeof snd.wave); - else memcpy(snd.wave, ram.hi+0x30, 16); /* patch data from older files */ - - lseek(fd, base_offset + (iramblock << 12), SEEK_SET); - read(fd,ram.ibank, 4096*irl); - - lseek(fd, base_offset + (vramblock << 12), SEEK_SET); - read(fd,lcd.vbank, 4096*vrl); - - lseek(fd, base_offset + (sramblock << 12), SEEK_SET); - read(fd,ram.sbank, 4096*srl); - vram_dirty(); - pal_dirty(); - sound_dirty(); - mem_updatemap(); + lseek(fd, base_offset + (iramblock << 12), SEEK_SET); + read(fd,ram.ibank, 4096*irl); + + lseek(fd, base_offset + (vramblock << 12), SEEK_SET); + read(fd,lcd.vbank, 4096*vrl); + + lseek(fd, base_offset + (sramblock << 12), SEEK_SET); + read(fd,ram.sbank, 4096*srl); + vram_dirty(); + pal_dirty(); + sound_dirty(); + mem_updatemap(); } void savestate(int fd) { - int i; - byte buf[4096]; - un32 (*header)[2] = (un32 (*)[2])buf; - un32 d = 0; - int irl = hw.cgb ? 8 : 2; - int vrl = hw.cgb ? 4 : 2; - int srl = mbc.ramsize << 1; - size_t base_offset; + int i; + byte buf[4096]; + un32 (*header)[2] = (un32 (*)[2])buf; + un32 d = 0; + int irl = hw.cgb ? 8 : 2; + int vrl = hw.cgb ? 4 : 2; + int srl = mbc.ramsize << 1; + size_t base_offset; - ver = 0x105; - iramblock = 1; - vramblock = 1+irl; - sramblock = 1+irl+vrl; - wavofs = 4096 - 784; - hiofs = 4096 - 768; - palofs = 4096 - 512; - oamofs = 4096 - 256; - memset(buf, 0, sizeof buf); + ver = 0x104; + iramblock = 1; + vramblock = 1+irl; + sramblock = 1+irl+vrl; + hiofs = 4096 - 768; + palofs = 4096 - 512; + oamofs = 4096 - 256; + memset(buf, 0, sizeof buf); - for (i = 0; svars[i].len > 0; i++) - { - header[i][0] = *(un32 *)svars[i].key; - switch (svars[i].len) - { - case 1: - d = *(byte *)svars[i].ptr; - break; - case 2: - d = *(un16 *)svars[i].ptr; - break; - case 4: - d = *(un32 *)svars[i].ptr; - break; - } - header[i][1] = LIL(d); - } - header[i][0] = header[i][1] = 0; + for (i = 0; svars[i].len > 0; i++) + { + header[i][0] = *(un32 *)svars[i].key; + switch (svars[i].len) + { + case 1: + d = *(byte *)svars[i].ptr; + break; + case 2: + d = *(un16 *)svars[i].ptr; + break; + case 4: + d = *(un32 *)svars[i].ptr; + break; + } + header[i][1] = LIL(d); + } + header[i][0] = header[i][1] = 0; - memcpy(buf+hiofs, ram.hi, sizeof ram.hi); - memcpy(buf+palofs, lcd.pal, sizeof lcd.pal); - memcpy(buf+oamofs, lcd.oam.mem, sizeof lcd.oam); - memcpy(buf+wavofs, snd.wave, sizeof snd.wave); + memcpy(buf+hiofs, ram.hi, sizeof ram.hi); + memcpy(buf+palofs, lcd.pal, sizeof lcd.pal); + memcpy(buf+oamofs, lcd.oam.mem, sizeof lcd.oam); - /* calculate base offset for output file */ - /* (we'll seek relative to that from now on) */ - base_offset = lseek(fd, 0, SEEK_CUR); - write(fd,buf, 4096); - - lseek(fd, base_offset + (iramblock << 12), SEEK_SET); - write(fd,ram.ibank, 4096*irl); - - lseek(fd, base_offset + (vramblock << 12), SEEK_SET); - write(fd,lcd.vbank, 4096*vrl); - - lseek(fd, base_offset + (sramblock << 12), SEEK_SET); - write(fd,ram.sbank, 4096*srl); + /* calculate base offset for output file */ + /* (we'll seek relative to that from now on) */ + base_offset = lseek(fd, 0, SEEK_CUR); + write(fd,buf, 4096); + + lseek(fd, base_offset + (iramblock << 12), SEEK_SET); + write(fd,ram.ibank, 4096*irl); + + lseek(fd, base_offset + (vramblock << 12), SEEK_SET); + write(fd,lcd.vbank, 4096*vrl); + + lseek(fd, base_offset + (sramblock << 12), SEEK_SET); + write(fd,ram.sbank, 4096*srl); } 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 @@ #include "cpu-gb.h" #include "hw.h" #include "regs.h" -#include "rc.h" #include "noise.h" -static const byte dmgwave[16] = - { - 0xac, 0xdd, 0xda, 0x48, - 0x36, 0x02, 0xcf, 0x16, - 0x2c, 0x04, 0xe5, 0x2c, - 0xac, 0xdd, 0xda, 0x48 - }; - -static const byte cgbwave[16] = - { - 0x00, 0xff, 0x00, 0xff, - 0x00, 0xff, 0x00, 0xff, - 0x00, 0xff, 0x00, 0xff, - 0x00, 0xff, 0x00, 0xff, - }; - - static const byte sqwave[4][8] = { { 0, 0,-1, 0, 0, 0, 0, 0 }, { 0,-1,-1, 0, 0, 0, 0, 0 }, - { -1,-1,-1,-1, 0, 0, 0, 0 }, + { 0,-1,-1,-1,-1, 0, 0, 0 }, { -1, 0, 0,-1,-1,-1,-1,-1 } }; static const int freqtab[8] = { - (1<<14)*2, - (1<<14), - (1<<14)/2, - (1<<14)/3, - (1<<14)/4, - (1<<14)/5, - (1<<14)/6, - (1<<14)/7 + (1<<18)*2, + (1<<18), + (1<<18)/2, + (1<<18)/3, + (1<<18)/4, + (1<<18)/5, + (1<<18)/6, + (1<<18)/7 }; struct snd snd IBSS_ATTR; -int pcm_submit(void); #define RATE (snd.rate) -#define WAVE (snd.wave) /* ram.hi+0x30 */ +#define WAVE (ram.hi+0x30) #define S1 (snd.ch[0]) #define S2 (snd.ch[1]) #define S3 (snd.ch[2]) #define S4 (snd.ch[3]) -rcvar_t sound_exports[] = -{ - RCV_END -}; - - static void s1_freq_d(int d) { if (RATE > (d<<4)) S1.freq = 0; @@ -86,14 +61,13 @@ static void s2_freq(void) static void s3_freq(void) { int d = 2048 - (((R_NR34&7)<<8) + R_NR33); - if (RATE > (d<<3)) S3.freq = 0; + if (RATE > d) S3.freq = 0; else S3.freq = (RATE << 21)/d; } static void s4_freq(void) { S4.freq = (freqtab[R_NR43&7] >> (R_NR43 >> 4)) * RATE; - if (S4.freq >> 18) S4.freq = 1<<18; } void sound_dirty(void) @@ -103,13 +77,13 @@ void sound_dirty(void) S1.envol = R_NR12 >> 4; S1.endir = (R_NR12>>3) & 1; S1.endir |= S1.endir - 1; - S1.enlen = (R_NR12 & 7) << 15; + S1.enlen = (R_NR12 & 3) << 15; s1_freq(); S2.len = (64-(R_NR21&63)) << 13; S2.envol = R_NR22 >> 4; S2.endir = (R_NR22>>3) & 1; S2.endir |= S2.endir - 1; - S2.enlen = (R_NR22 & 7) << 15; + S2.enlen = (R_NR22 & 3) << 15; s2_freq(); S3.len = (256-R_NR31) << 20; s3_freq(); @@ -117,16 +91,16 @@ void sound_dirty(void) S4.envol = R_NR42 >> 4; S4.endir = (R_NR42>>3) & 1; S4.endir |= S4.endir - 1; - S4.enlen = (R_NR42 & 7) << 15; + S4.enlen = (R_NR42 & 3) << 15; s4_freq(); } -void sound_off(void) +void sound_reset(void) { - memset(&S1, 0, sizeof S1); - memset(&S2, 0, sizeof S2); - memset(&S3, 0, sizeof S3); - memset(&S4, 0, sizeof S4); + int i; + memset(&snd, 0, sizeof snd); + if (pcm.hz) snd.rate = (1<<21) / pcm.hz; + else snd.rate = 0; R_NR10 = 0x80; R_NR11 = 0xBF; R_NR12 = 0xF3; @@ -137,7 +111,7 @@ void sound_off(void) R_NR30 = 0x7F; R_NR31 = 0xFF; R_NR32 = 0x9F; - R_NR33 = 0xBF; + R_NR34 = 0xBF; R_NR41 = 0xFF; R_NR42 = 0x00; R_NR43 = 0x00; @@ -145,23 +119,13 @@ void sound_off(void) R_NR50 = 0x77; R_NR51 = 0xF3; R_NR52 = 0xF1; + for (i = 0; i < 16; i++) WAVE[i] = -(i&1); sound_dirty(); } -void sound_reset(void) -{ - memset(&snd, 0, sizeof snd); - if (pcm.hz) snd.rate = (1<<21) / pcm.hz; - else snd.rate = 0; - memcpy(WAVE, hw.cgb ? cgbwave : dmgwave, 16); - memcpy(ram.hi+0x30, WAVE, 16); - sound_off(); -} - void sound_mix(void) { - - if (!options.sound) return; + if(!options.sound) return; int s, l, r, f, n; if (!RATE || cpu.snd < RATE) return; @@ -185,8 +149,7 @@ void sound_mix(void) } if (S1.swlen && (S1.swcnt += RATE) >= S1.swlen) { - S1.swcnt -= S1.swlen; - f = S1.swfreq; + f = ((R_NR14 & 7) << 8) + R_NR13; n = (R_NR10 & 7); if (R_NR10 & 8) f -= (f >> n); else f += (f >> n); @@ -194,15 +157,14 @@ void sound_mix(void) S1.on = 0; else { - S1.swfreq = f; R_NR13 = f; R_NR14 = (R_NR14 & 0xF8) | (f>>8); s1_freq_d(2048 - f); } } s <<= 2; - if (R_NR51 & 1) r += s; - if (R_NR51 & 16) l += s; + if (R_NR51 & 1) l += s; + if (R_NR51 & 16) r += s; } if (S2.on) @@ -219,8 +181,8 @@ void sound_mix(void) if (S2.envol > 15) S2.envol = 15; } s <<= 2; - if (R_NR51 & 2) r += s; - if (R_NR51 & 32) l += s; + if (R_NR51 & 2) l += s; + if (R_NR51 & 32) r += s; } if (S3.on) @@ -234,16 +196,16 @@ void sound_mix(void) S3.on = 0; if (R_NR32 & 96) s <<= (3 - ((R_NR32>>5)&3)); else s = 0; - if (R_NR51 & 4) r += s; - if (R_NR51 & 64) l += s; + if (R_NR51 & 4) l += s; + if (R_NR51 & 64) r += s; } if (S4.on) { if (R_NR43 & 8) s = 1 & (noise7[ - (S4.pos>>20)&15] >> (7-((S4.pos>>17)&7))); + (S4.pos>>24)&15] >> ((S4.pos>>21)&7)); else s = 1 & (noise15[ - (S4.pos>>20)&4095] >> (7-((S4.pos>>17)&7))); + (S4.pos>>24)&4095] >> ((S4.pos>>21)&7)); s = (-s) & S4.envol; S4.pos += S4.freq; if ((R_NR44 & 64) && ((S4.cnt += RATE) >= S4.len)) @@ -255,9 +217,9 @@ void sound_mix(void) if (S4.envol < 0) S4.envol = 0; if (S4.envol > 15) S4.envol = 15; } - s += s << 1; - if (R_NR51 & 8) r += s; - if (R_NR51 & 128) l += s; + s <<= 2; + if (R_NR51 & 8) l += s; + if (R_NR51 & 128) r += s; } l *= (R_NR50 & 0x07); @@ -276,10 +238,10 @@ void sound_mix(void) pcm_submit(); if (pcm.stereo) { - pcm.buf[pcm.pos++] = l+128; - pcm.buf[pcm.pos++] = r+128; + pcm.buf[pcm.pos++] = l+128; + pcm.buf[pcm.pos++] = r+128; } - else pcm.buf[pcm.pos++] = ((l+r)>>1)+128; + else pcm.buf[pcm.pos++] = ((l+r)>>1)+128; } } R_NR52 = (R_NR52&0xf0) | S1.on | (S2.on<<1) | (S3.on<<2) | (S4.on<<3); @@ -289,7 +251,7 @@ void sound_mix(void) byte sound_read(byte r) { - if(!options.sound) return 0; + if(!options.sound) return 0; sound_mix(); /* printf("read %02X: %02X\n", r, REG(r)); */ return REG(r); @@ -298,13 +260,12 @@ byte sound_read(byte r) void s1_init(void) { S1.swcnt = 0; - S1.swfreq = ((R_NR14&7)<<8) + R_NR13; S1.envol = R_NR12 >> 4; S1.endir = (R_NR12>>3) & 1; S1.endir |= S1.endir - 1; S1.enlen = (R_NR12 & 7) << 15; - if (!S1.on) S1.pos = 0; S1.on = 1; + S1.pos = 0; S1.cnt = 0; S1.encnt = 0; } @@ -315,20 +276,17 @@ void s2_init(void) S2.endir = (R_NR22>>3) & 1; S2.endir |= S2.endir - 1; S2.enlen = (R_NR22 & 7) << 15; - if (!S2.on) S2.pos = 0; S2.on = 1; + S2.pos = 0; S2.cnt = 0; S2.encnt = 0; } void s3_init(void) { - int i; - if (!S3.on) S3.pos = 0; + S3.pos = 0; S3.cnt = 0; S3.on = R_NR30 >> 7; - if (S3.on) for (i = 0; i < 16; i++) - ram.hi[i+0x30] = 0x13 ^ ram.hi[i+0x31]; } void s4_init(void) @@ -346,19 +304,13 @@ void s4_init(void) void sound_write(byte r, byte b) { - if(!options.sound) return; -#if 0 - static void *timer; - if (!timer) timer = sys_timer(); - printf("write %02X: %02X @ %d\n", r, b, sys_elapsed(timer)); -#endif + if(!options.sound) return; if (!(R_NR52 & 128) && r != RI_NR52) return; if ((r & 0xF0) == 0x30) { if (S3.on) sound_mix(); - if (!S3.on) - WAVE[r-0x30] = ram.hi[r] = b; + if (!S3.on) WAVE[r - 0x30] = b; return; } sound_mix(); @@ -366,8 +318,6 @@ void sound_write(byte r, byte b) { case RI_NR10: R_NR10 = b; - S1.swlen = ((R_NR10>>4) & 7) << 14; - S1.swfreq = ((R_NR14&7)<<8) + R_NR13; break; case RI_NR11: R_NR11 = b; @@ -415,7 +365,7 @@ void sound_write(byte r, byte b) break; case RI_NR31: R_NR31 = b; - S3.len = (256-R_NR31) << 13; + S3.len = (256-R_NR31) << 20; break; case RI_NR32: R_NR32 = b; @@ -457,7 +407,7 @@ void sound_write(byte r, byte b) case RI_NR52: R_NR52 = b; if (!(R_NR52 & 128)) - sound_off(); + sound_reset(); break; default: 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 @@ struct sndchan { - int on; - unsigned pos; - int cnt, encnt, swcnt; - int len, enlen, swlen; - int swfreq; - int freq; - int envol, endir; + int on; + unsigned pos; + int cnt, encnt, swcnt; + int len, enlen, swlen; + int freq; + int envol, endir; }; struct snd { - int rate; - struct sndchan ch[4]; - byte wave[16]; + int rate; + struct sndchan ch[4]; }; extern struct snd snd; @@ -31,7 +29,6 @@ extern struct snd snd; byte sound_read(byte r) ICODE_ATTR; void sound_write(byte r, byte b) ICODE_ATTR; void sound_dirty(void) ICODE_ATTR; -void sound_off(void); void sound_reset(void); void sound_mix(void) ICODE_ATTR; void s1_init(void); diff --git a/apps/plugins/rockboy/split.c b/apps/plugins/rockboy/split.c deleted file mode 100644 index 5d8af08ee1..0000000000 --- a/apps/plugins/rockboy/split.c +++ /dev/null @@ -1,59 +0,0 @@ - -#include "rockmacros.h" - -/* - * splitline is a destructive argument parser, much like a very primitive - * form of a shell parser. it supports quotes for embedded spaces and - * literal quotes with the backslash escape. - */ - -char *splitnext(char **pos) -{ - char *a, *d, *s; - - d = s = *pos; - while (*s == ' ' || *s == '\t') s++; - a = s; - while (*s && *s != ' ' && *s != '\t') - { - if (*s == '"') - { - s++; - while (*s && *s != '"') - { - if (*s == '\\') - s++; - if (*s) - *(d++) = *(s++); - } - if (*s == '"') s++; - } - else - { - if (*s == '\\') - s++; - *(d++) = *(s++); - } - } - while (*s == ' ' || *s == '\t') s++; - *d = 0; - *pos = s; - return a; -} - -int splitline(char **argv, int max, char *line) -{ - char *s; - int i; - - s = line; - for (i = 0; *s && i < max + 1; i++) - argv[i] = splitnext(&s); - argv[i] = 0; - return i; -} - - - - - 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 @@ -int splitline(char **argv, int max, char *line); diff --git a/apps/plugins/rockboy/sys_rockbox.c b/apps/plugins/rockboy/sys_rockbox.c index fb118162b2..40f68681d8 100644 --- a/apps/plugins/rockboy/sys_rockbox.c +++ b/apps/plugins/rockboy/sys_rockbox.c @@ -20,7 +20,6 @@ #include "rockmacros.h" #include "fb.h" #include "input.h" -#include "rc.h" #include "lcd-gb.h" #include "hw.h" #include "config.h" @@ -32,6 +31,13 @@ #define ROCKBOY_PAD_UP BUTTON_MENU #define ROCKBOY_PAD_DOWN BUTTON_PLAY +#elif (CONFIG_KEYPAD == IRIVER_H10_PAD) + +#define ROCKBOY_PAD_LEFT BUTTON_LEFT +#define ROCKBOY_PAD_RIGHT BUTTON_RIGHT +#define ROCKBOY_PAD_UP BUTTON_SCROLL_UP +#define ROCKBOY_PAD_DOWN BUTTON_SCROLL_DOWN + #else #define ROCKBOY_PAD_LEFT BUTTON_LEFT @@ -41,33 +47,10 @@ #endif -rcvar_t joy_exports[] = -{ - RCV_END -}; - -rcvar_t vid_exports[] = -{ - RCV_END -}; - -struct fb fb; +struct fb fb IBSS_ATTR; extern int debug_trace; -void vid_settitle(char *title) -{ - rb->splash(HZ/2, true, title); -} - -void joy_init(void) -{ -} - -void joy_close(void) -{ -} - unsigned int oldbuttonstate = 0, newbuttonstate,holdbutton; #ifdef HAVE_WHEEL_POSITION int oldwheel = -1, wheel; @@ -179,10 +162,7 @@ void ev_poll(void) if(pressed & options.MENU) { #endif #if (CONFIG_KEYPAD == IRIVER_H100_PAD) || \ - (CONFIG_KEYPAD == IRIVER_H300_PAD) || \ - (CONFIG_KEYPAD == IPOD_4G_PAD) || \ - (CONFIG_KEYPAD == GIGABEAT_PAD) || \ - (CONFIG_KEYPAD == SANSA_E200_PAD) + defined(HAVE_LCD_COLOR) #ifdef HAVE_WHEEL_POSITION rb->wheel_send_events(true); #endif @@ -202,53 +182,36 @@ void ev_poll(void) #endif } -void vid_setpal(int i, int r, int g, int b) +/* New frameskip, makes more sense to me and performs as well */ +inline void vid_begin(void) { - (void)i; - (void)r; - (void)g; - (void)b; -} - -inline void vid_begin(void) // New frameskip, makes more sense to me and performs as well -{ - static int skip = 0; - if (skiplcd_framebuffer; + fb.ptr=rb->lcd_framebuffer; #if defined(HAVE_LCD_COLOR) - fb.pelsize=2; // 16 bit framebuffer - - fb.indexed = 0; // no palette on lcd - fb.cc[0].r = 3; // 8-5 (wasted bits on red) - fb.cc[0].l = 11; //this is the offset to the R bits (16-5) - fb.cc[1].r = 2; // 8-6 (wasted bits on green) - fb.cc[1].l = 5; // This is the offset to the G bits (16-5-6) - fb.cc[2].r = 3; // 8-5 (wasted bits on red) - fb.cc[2].l = 0; // This is the offset to the B bits (16-5-6-5) - fb.cc[3].r = 0; // no alpha - fb.cc[3].l = 0; - fb.yuv = 0; // not in yuv format -#else // ***** NEED TO LOOK INTO THIS MORE FOR THE H100 (Should be able to get rid of some IFDEF's elsewhere) - fb.pelsize=1; // 8 bit framebuffer.. (too much.. but lowest gnuboy will support.. so yea... + fb.cc[0].r = 3; /* 8-5 (wasted bits on red) */ + fb.cc[0].l = 11; /* this is the offset to the R bits (16-5) */ + fb.cc[1].r = 2; /* 8-6 (wasted bits on green) */ + fb.cc[1].l = 5; /* This is the offset to the G bits (16-5-6) */ + fb.cc[2].r = 3; /* 8-5 (wasted bits on red) */ + fb.cc[2].l = 0; /* This is the offset to the B bits (16-5-6-5) */ +#else + fb.mode=3; #endif } @@ -350,43 +313,29 @@ void vid_update(int scanline) cnt++; } rb->lcd_update_rect(0, scanline & ~3, LCD_WIDTH, 4); -#elif defined(HAVE_LCD_COLOR) /* iriver H3x0, colour iPod */ - // handled in lcd.c now +#elif defined(HAVE_LCD_COLOR) + /* handled in lcd.c now */ #endif /* LCD_HEIGHT */ } #endif -void vid_end(void) -{ -} - long timerresult; void *sys_timer(void) -{/* - timerresult=*rb->current_tick; +{ + /*timerresult=*rb->current_tick; return &timerresult;*/ return 0; } -// returns microseconds passed since sys_timer +/* returns microseconds passed since sys_timer */ int sys_elapsed(long *oldtick) { -/* - int elap,mytime=microtick; + /* int elap,mytime=microtick; elap=mytime-*oldtick; *oldtick=mytime; - return elap;*/ -// return ((*rb->current_tick-(*oldtick))*1000000)/HZ; + return elap; */ + /* return ((*rb->current_tick-(*oldtick))*1000000)/HZ; */ return *oldtick; } - -void sys_sleep(int us) -{ - if(us<=0) return; - int i=0; - while(i< us*11) - i++; -// if (us <= 0) return; -}