summaryrefslogtreecommitdiff
path: root/apps/plugins/rockboy/cpu.c
diff options
context:
space:
mode:
authorMichiel Van Der Kolk <not.valid@email.address>2005-03-03 19:44:02 +0000
committerMichiel Van Der Kolk <not.valid@email.address>2005-03-03 19:44:02 +0000
commit3921e1aa6979163c2a07122dff49f6afef977a94 (patch)
tree9fc5cc461759e012a3fb6eecf55874a29a9eaebf /apps/plugins/rockboy/cpu.c
parent708e357a6351045f450be4ad28823463be161b6d (diff)
downloadrockbox-3921e1aa6979163c2a07122dff49f6afef977a94.zip
rockbox-3921e1aa6979163c2a07122dff49f6afef977a94.tar.gz
rockbox-3921e1aa6979163c2a07122dff49f6afef977a94.tar.bz2
rockbox-3921e1aa6979163c2a07122dff49f6afef977a94.tar.xz
Added dynarec(under construction) and outline for lcd modes
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@6119 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps/plugins/rockboy/cpu.c')
-rw-r--r--apps/plugins/rockboy/cpu.c181
1 files changed, 166 insertions, 15 deletions
diff --git a/apps/plugins/rockboy/cpu.c b/apps/plugins/rockboy/cpu.c
index d4831e8..c396b21 100644
--- a/apps/plugins/rockboy/cpu.c
+++ b/apps/plugins/rockboy/cpu.c
@@ -237,11 +237,23 @@ label: op(b); break;
#define PRE_INT ( DI, PUSH(PC) )
#define THROW_INT(n) ( (IF &= ~(1<<(n))), (PC = 0x40+((n)<<3)) )
+#ifdef DYNAREC
+un32 reg_backup[16];
+struct dynarec_block *address_map[1<<HASH_SIGNIFICANT_LOWER_BITS];
+extern void *dynapointer;
+int blockcount;
+#define MAXBLOCK 3
+#endif
void cpu_reset(void)
{
+ union reg acc;
+#ifdef DYNAREC
+ int i;
+ dynapointer=0;
+#endif
cpu.speed = 0;
cpu.halt = 0;
cpu.div = 0;
@@ -253,13 +265,23 @@ void cpu_reset(void)
PC = 0x0100;
SP = 0xFFFE;
- AF = 0x01B0;
- BC = 0x0013;
- DE = 0x00D8;
+ 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;
+#ifdef DYNAREC
+ for(i=0;i<(1<<HASH_SIGNIFICANT_LOWER_BITS);i++)
+ address_map[i]=0;
+#endif
}
@@ -365,6 +387,10 @@ int cpu_emulate(int cycles)
i = cycles;
next:
+#ifdef DYNAREC
+ if(shut)
+ return cycles-i;
+#endif
if ((clen = cpu_idle(i)))
{
i -= clen;
@@ -395,8 +421,10 @@ next:
}
IME = IMA;
-// if (debug_trace) debug_disassemble(PC, 1);
-
+/* if (debug_trace) debug_disassemble(PC, 1); */
+#ifdef DYNAREC
+ if(PC&0x8000) {
+#endif
op = FETCH;
clen = cycles_table[op];
@@ -536,9 +564,25 @@ next:
A = readb(xHL); break;
case 0x01: /* LD BC,imm */
- BC = readw(xPC); PC += 2; break;
+#ifdef DYNAREC
+ W(acc) = readw(xPC);
+ B=HB(acc);
+ C=LB(acc);
+#else
+ BC = readw(xPC);
+#endif
+ PC += 2;
+ break;
case 0x11: /* LD DE,imm */
- DE = readw(xPC); PC += 2; break;
+#ifdef DYNAREC
+ 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 */
@@ -643,9 +687,23 @@ next:
INC(A); break;
case 0x03: /* INC BC */
- INCW(BC); break;
+#ifdef DYNAREC
+ W(acc)=((B<<8)|C)+1;
+ B=HB(acc);
+ C=LB(acc);
+#else
+ INCW(BC);
+#endif
+ break;
case 0x13: /* INC DE */
- INCW(DE); break;
+#ifdef DYNAREC
+ W(acc)=((D<<8)|E)+1;
+ D=HB(acc);
+ E=LB(acc);
+#else
+ INCW(DE);
+#endif
+ break;
case 0x23: /* INC HL */
INCW(HL); break;
case 0x33: /* INC SP */
@@ -672,9 +730,23 @@ next:
DEC(A); break;
case 0x0B: /* DEC BC */
- DECW(BC); break;
+#ifdef DYNAREC
+ W(acc)=((B<<8)|C)-1;
+ B=HB(acc);
+ C=LB(acc);
+#else
+ DECW(BC);
+#endif
+ break;
case 0x1B: /* DEC DE */
- DECW(DE); break;
+#ifdef DYNAREC
+ 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 */
@@ -766,11 +838,25 @@ next:
RST(b); break;
case 0xC1: /* POP BC */
- POP(BC); break;
+#ifdef DYNAREC
+ POP(W(acc));
+ B=HB(acc);
+ C=LB(acc);
+#else
+ POP(BC);
+#endif
+ break;
case 0xC5: /* PUSH BC */
PUSH(BC); break;
case 0xD1: /* POP DE */
- POP(DE); break;
+#ifdef DYNAREC
+ POP(W(acc));
+ D=HB(acc);
+ E=LB(acc);
+#else
+ POP(DE);
+#endif
+ break;
case 0xD5: /* PUSH DE */
PUSH(DE); break;
case 0xE1: /* POP HL */
@@ -778,7 +864,14 @@ next:
case 0xE5: /* PUSH HL */
PUSH(HL); break;
case 0xF1: /* POP AF */
- POP(AF); break;
+#ifdef DYNAREC
+ POP(W(acc));
+ A=HB(acc);
+ F=LB(acc);
+#else
+ POP(AF);
+ break;
+#endif
case 0xF5: /* PUSH AF */
PUSH(AF); break;
@@ -840,7 +933,65 @@ next:
op, (PC-1) & 0xffff, mbc.rombank);
break;
}
-
+#ifdef DYNAREC
+ } else { // ROM, dynarec.
+ struct dynarec_block *p=0,*b=address_map[PC&HASH_BITMASK];
+ 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)) {
+ p=b;
+ snprintf(meow,499,"next: 0x%x",b->next ? b->next->address.d : 0);
+ rb->splash(HZ*2,true,meow);
+ b=b->next;
+ }
+ if(b) { // call block
+ int fd;
+ blockcount++;
+ snprintf(meow,499,"/dyna_0x%x.rb",PC);
+ fd=open(meow,O_WRONLY|O_CREAT);
+ if(fd>=0) {
+ fdprintf(fd,"Block 0x%x\n",PC);
+ write(fd,b->block,b->length);
+ 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(blockcount<MAXBLOCK) {
+ asm volatile ("movem.l (%0),%%d1-%%d7/%%a0-%%a1\n\t"
+ "jsr (%1)\n\t"
+ "movem.l %%d1-%%d7/%%a0-%%a1,(%0)\n\t"
+ :
+ : "a" (&cpu.a), "a" (b->block)
+ : "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;
+ }
+ }
+#endif
+
+
+
clen <<= 1;
div_advance(clen);
timer_advance(clen);