disassembly in info window

This commit is contained in:
corey 2024-05-17 20:13:31 -05:00
parent 2ef5944a76
commit ac9ea9ca61
5 changed files with 163 additions and 138 deletions

View File

@ -1,6 +1,6 @@
# General
CC= /usr/lib/mingw64-toolchain/bin/x86_64-w64-mingw32-gcc
CFLAGS= -Wfatal-errors
CFLAGS= -Wfatal-errors -Wall -Wextra
LDFLAGS= -luser32 -lshell32 -ladvapi32 -ld3d9
NASMFLAGS= -fwin64
OBJS= main.o tigr/tigr.o cpu.o ppu.o gb.o
@ -28,6 +28,8 @@ rosgb: $(OBJS)
$(CC) -c $^ -o $@ $(CFLAGS) $(LDFLAGS)
%.o: %.asm
nasm $(NASMFLAGS) $^ -o $@
tigr/tigr.o: tigr/tigr.c tigr/tigr.h
$(CC) -c $< -o $@
clean:
$(RM) *.o $(OBJS) rosgb rosgb.exe

261
cpu.c
View File

@ -7,7 +7,7 @@
/* static char log_buffer[10*128]={0}; */
/* static size_t log_buffer_line=0; */
static char log_buffer[10*128]={0};
static char log_buffer[128*10]={0};
/* #define qprintf(...) do{\ */
/* if(!quiet){\ */
@ -17,19 +17,20 @@ static char log_buffer[10*128]={0};
//#define qprintf(...) do{size_t __i=0;if(!quiet){__i=sprintf(log_buffer,"%#x:",(cpu)->pc);sprintf(log_buffer+__i,__VA_ARGS__);}}while(0)
// This causes memory problems, why?
#define qprintf(...) do{if(!quiet){printf("%#x:",(cpu)->pc);printf(__VA_ARGS__);}}while(0)
//#define qprintf(...) do{if(!quiet){int __i=sprintf(log_buffer,"%#x:",(cpu)->pc);sprintf((log_buffer+__i),__VA_ARGS__);}}while(0)
#define qprintf(...) do{if(!quiet)sprintf(log_buffer,__VA_ARGS__);}while(0)
char*cpu_log(void)
{
return log_buffer;
}
void cpu_fetch8(Cpu*cpu,uint8_t*rom,uint8_t*u8,uint8_t*ram)
void cpu_fetch8(Cpu*cpu,uint8_t*rom,uint8_t*u8)
{
*u8=rom[cpu->pc++];
}
void cpu_fetch16(Cpu*cpu,uint8_t*rom,uint16_t*u16,uint8_t*ram)
void cpu_fetch16(Cpu*cpu,uint8_t*rom,uint16_t*u16)
{
*u16=rom[cpu->pc]|rom[cpu->pc+1]<<8;
cpu->pc+=2;
@ -37,13 +38,14 @@ void cpu_fetch16(Cpu*cpu,uint8_t*rom,uint16_t*u16,uint8_t*ram)
// cpu_write_ram Allow access to read/write to ram
// through a filter for interrupts
void cpu_write_ram(Cpu*cpu,struct Ppu*ppu,uint16_t addr,uint8_t val,uint8_t*ram)
void cpu_write_ram(struct Ppu*ppu,uint16_t addr,uint8_t val,uint8_t*ram)
{
if(addr>0x7fff)//don't write into ROM
ram[addr]=val;
if(addr==0xff46)//DMA Transfer
{
for(uint16_t i=0;i<-0x9f;i++)
//for(uint16_t i=0;i<-0x9f;i++)
for(uint16_t i=0;i<0x9f;i++)
for(uint16_t j=0xfe00;j<=0xfe9f;j++)
ram[j]=ram[val*0x100|i];//copy from DMA reg src to FExx
}
@ -74,7 +76,7 @@ void cpu_decexec(Cpu*cpu,struct Ppu*ppu,uint8_t*rom,uint8_t*op,uint8_t*ram,bool
switch(*op)
{
case 0x01://ld bc,m16
cpu_fetch16(cpu,rom,(uint16_t*)&tmp,ram);
cpu_fetch16(cpu,rom,(uint16_t*)&tmp);
cpu->b=tmp>>8;
cpu->c=tmp&0x00ff;
qprintf("ld bc,%.4xh",cpu->b<<8|cpu->c);
@ -82,7 +84,7 @@ void cpu_decexec(Cpu*cpu,struct Ppu*ppu,uint8_t*rom,uint8_t*op,uint8_t*ram,bool
case 0x02://ld (bc),a
// *_ram(cpu->b<<8|cpu->c,ram)=cpu->a;
// ram[cpu->b<<8|cpu->c]=cpu->a;
cpu_write_ram(cpu,ppu,cpu->b<<8|cpu->c,cpu->a,ram);
cpu_write_ram(ppu,cpu->b<<8|cpu->c,cpu->a,ram);
qprintf("ld (bc),a ;(%.4xh)=%.2xh",cpu->b<<8|cpu->c,cpu->a);
break;
case 0x03://inc bc
@ -94,7 +96,7 @@ void cpu_decexec(Cpu*cpu,struct Ppu*ppu,uint8_t*rom,uint8_t*op,uint8_t*ram,bool
case 0x04://inc b
//flags:
cpu->f&=~F_N;//N 0
if(cpu->b&0xf==0xf)cpu->f|=F_H;//H
if((cpu->b&0xf)==0xf)cpu->f|=F_H;//H
else cpu->f&=~F_H;
cpu->b++;
if(cpu->b==0)cpu->f|=F_Z;//Z
@ -111,7 +113,7 @@ void cpu_decexec(Cpu*cpu,struct Ppu*ppu,uint8_t*rom,uint8_t*op,uint8_t*ram,bool
qprintf("dec b");
break;
case 0x06://ld b,m8
cpu_fetch8(cpu,rom,&cpu->b,ram);
cpu_fetch8(cpu,rom,&cpu->b);
qprintf("ld b,%.2xh",cpu->b);
break;
case 0x07://rlca
@ -125,9 +127,9 @@ void cpu_decexec(Cpu*cpu,struct Ppu*ppu,uint8_t*rom,uint8_t*op,uint8_t*ram,bool
qprintf("rlca ;%.2x",tmp8);
break;
case 0x08://ld (m16),sp
cpu_fetch16(cpu,rom,(uint16_t*)&tmp,ram);
cpu_fetch16(cpu,rom,(uint16_t*)&tmp);
// ram[tmp]=cpu->sp;
cpu_write_ram(cpu,ppu,tmp,cpu->sp,ram);
cpu_write_ram(ppu,tmp,cpu->sp,ram);
qprintf("ld (%.4xh),sp",tmp);
break;
case 0x09://add hl,bc
@ -157,7 +159,7 @@ void cpu_decexec(Cpu*cpu,struct Ppu*ppu,uint8_t*rom,uint8_t*op,uint8_t*ram,bool
if(cpu->c==0)cpu->f|=F_Z;//Z
else cpu->f&=~F_Z;
cpu->f&=~F_N;//N
if(cpu->c&0xf==0xf)cpu->f|=F_H;//H
if((cpu->c&0xf)==0xf)cpu->f|=F_H;//H
else cpu->f&=~F_H;
qprintf("inc c");
break;
@ -171,31 +173,31 @@ void cpu_decexec(Cpu*cpu,struct Ppu*ppu,uint8_t*rom,uint8_t*op,uint8_t*ram,bool
qprintf("dec c ;%.2xh",cpu->c);
break;
case 0x0e: //ld c,m8
cpu_fetch8(cpu,rom,&cpu->c,ram);
cpu_fetch8(cpu,rom,&cpu->c);
qprintf("ld c,%.2xh",cpu->c);
break;
case 0x0f: //rrca
if(cpu->a&0x01)cpu->f|=F_C;else cpu->f&=~F_C;//C
cpu->f&=F_C;//N 0,Z 0,H 0
tmp8=cpu->a;
ror(tmp8,1);
tmp8=ror(tmp8,1);
//asm("rorb %0":"=m"(tmp8));
cpu->a=tmp8;
qprintf("rrca ;%.2xh",tmp8);
break;
case 0x10://stop 0x00
cpu_fetch8(cpu,rom,(uint8_t*)(uint8_t*)&tmp,ram);//second byte of opcode
cpu_fetch8(cpu,rom,(uint8_t*)(uint8_t*)&tmp);//second byte of opcode
qprintf("stop %.2xh ;10h 00h",tmp);
break;
case 0x11://ld de,m16
cpu_fetch16(cpu,rom,(uint16_t*)&tmp,ram);
cpu_fetch16(cpu,rom,(uint16_t*)&tmp);
cpu->d=tmp>>8;
cpu->e=tmp&0x00ff;
qprintf("ld de,%.4xh",tmp);
break;
case 0x12://ld (de),a
// ram[cpu->d<<8|cpu->e]=cpu->a;
cpu_write_ram(cpu,ppu,cpu->d<<8|cpu->e,cpu->a,ram);
cpu_write_ram(ppu,cpu->d<<8|cpu->e,cpu->a,ram);
qprintf("ld (de),a");
break;
case 0x13://inc de
@ -209,7 +211,7 @@ void cpu_decexec(Cpu*cpu,struct Ppu*ppu,uint8_t*rom,uint8_t*op,uint8_t*ram,bool
if(cpu->d==0)cpu->f|=F_Z;//Z
else cpu->f&=~F_Z;
cpu->f&=~F_N;//N
if(cpu->d&0xf==0xf)cpu->f|=F_H;//H
if((cpu->d&0xf)==0xf)cpu->f|=F_H;//H
else cpu->f&=~F_H;
qprintf("inc d");
break;
@ -223,7 +225,7 @@ void cpu_decexec(Cpu*cpu,struct Ppu*ppu,uint8_t*rom,uint8_t*op,uint8_t*ram,bool
qprintf("dec d");
break;
case 0x16://ld d,m8
cpu_fetch8(cpu,rom,&cpu->d,ram);
cpu_fetch8(cpu,rom,&cpu->d);
qprintf("ld d,%.2xh",cpu->d);
break;
case 0x17://rla
@ -235,7 +237,7 @@ void cpu_decexec(Cpu*cpu,struct Ppu*ppu,uint8_t*rom,uint8_t*op,uint8_t*ram,bool
qprintf("rla");
break;
case 0x18://jr m8 (signed)
cpu_fetch8(cpu,rom,(uint8_t*)(uint8_t*)&tmp,ram);
cpu_fetch8(cpu,rom,(uint8_t*)(uint8_t*)&tmp);
cpu->pc+=(int8_t)tmp;//cast to signed int8, C will sign extend
qprintf("jr %.2xh ;%.2xh",(uint8_t)tmp,cpu->pc);
break;
@ -265,7 +267,7 @@ void cpu_decexec(Cpu*cpu,struct Ppu*ppu,uint8_t*rom,uint8_t*op,uint8_t*ram,bool
if(cpu->e==0)cpu->f|=F_Z;//Z
else cpu->f&=~F_Z;
cpu->f&=~F_N;//N
if(cpu->e&0xf==0xf)cpu->f|=F_H;//H
if((cpu->e&0xf)==0xf)cpu->f|=F_H;//H
else cpu->f&=~F_H;
qprintf("inc e");
break;
@ -279,7 +281,7 @@ void cpu_decexec(Cpu*cpu,struct Ppu*ppu,uint8_t*rom,uint8_t*op,uint8_t*ram,bool
qprintf("dec c");
break;
case 0x1e: //ld e,m8
cpu_fetch8(cpu,rom,&cpu->e,ram);
cpu_fetch8(cpu,rom,&cpu->e);
qprintf("ld e,%.2xh",cpu->e);
break;
case 0x1f: //rra //TODO: fix behavior of rotate
@ -301,13 +303,13 @@ void cpu_decexec(Cpu*cpu,struct Ppu*ppu,uint8_t*rom,uint8_t*op,uint8_t*ram,bool
break;
}
case 0x20://jr nz m8 (signed)
cpu_fetch8(cpu,rom,(uint8_t*)(uint8_t*)&tmp,ram);
cpu_fetch8(cpu,rom,(uint8_t*)(uint8_t*)&tmp);
if(!(cpu->f&F_Z))
cpu->pc+=(int8_t)tmp;//m8 is signed!
qprintf("jr nz %.2xh%s",(uint8_t)tmp,(!(cpu->f&F_Z))?(""):(" ;skipped"));
break;
case 0x21://ld hl,m16
cpu_fetch16(cpu,rom,(uint16_t*)&tmp,ram);
cpu_fetch16(cpu,rom,(uint16_t*)&tmp);
cpu->h=tmp>>8;
cpu->l=tmp&0x00ff;
qprintf("ld hl,%.4xh",tmp);
@ -315,7 +317,7 @@ void cpu_decexec(Cpu*cpu,struct Ppu*ppu,uint8_t*rom,uint8_t*op,uint8_t*ram,bool
case 0x22://ld (hli),a
tmp=(uint16_t)cpu->h<<8|cpu->l;
// ram[tmp]=cpu->a;
cpu_write_ram(cpu,ppu,tmp,cpu->a,ram);
cpu_write_ram(ppu,tmp,cpu->a,ram);
tmp++;
cpu->h=tmp>>8;
cpu->l=tmp&0x00ff;
@ -333,7 +335,7 @@ void cpu_decexec(Cpu*cpu,struct Ppu*ppu,uint8_t*rom,uint8_t*op,uint8_t*ram,bool
if(cpu->h==0)cpu->f|=F_Z;//Z
else cpu->f&=~F_Z;
cpu->f&=~F_N;//N
if(cpu->h&0xf==0xf)cpu->f|=F_H;//H
if((cpu->h&0xf)==0xf)cpu->f|=F_H;//H
else cpu->f&=~F_H;
break;
case 0x25: //dec h
@ -346,7 +348,7 @@ void cpu_decexec(Cpu*cpu,struct Ppu*ppu,uint8_t*rom,uint8_t*op,uint8_t*ram,bool
qprintf("dec h");
break;
case 0x26://ld h,m8
cpu_fetch8(cpu,rom,&cpu->h,ram);
cpu_fetch8(cpu,rom,&cpu->h);
qprintf("ld h,%.2xh",cpu->h);
break;
case 0x27://daa ;decimal adjust a (BCD)
@ -357,7 +359,7 @@ void cpu_decexec(Cpu*cpu,struct Ppu*ppu,uint8_t*rom,uint8_t*op,uint8_t*ram,bool
//C
break;
case 0x28://jr z m8
cpu_fetch8(cpu,rom,(uint8_t*)(uint8_t*)&tmp,ram);
cpu_fetch8(cpu,rom,(uint8_t*)(uint8_t*)&tmp);
if(cpu->f&F_Z)cpu->pc+=(int8_t)tmp;
qprintf("jr z %.2xh ;%.2xh%s",(uint8_t)tmp,cpu->pc,(cpu->f&F_Z)?(""):(" ;skipped"));
break;
@ -402,7 +404,7 @@ void cpu_decexec(Cpu*cpu,struct Ppu*ppu,uint8_t*rom,uint8_t*op,uint8_t*ram,bool
qprintf("dec l");
break;
case 0x2e: //ld l,m8
cpu_fetch8(cpu,rom,&cpu->l,ram);
cpu_fetch8(cpu,rom,&cpu->l);
qprintf("ld l,%.2xh",cpu->l);
break;
case 0x2f: //cpl ;cpl a
@ -412,19 +414,19 @@ void cpu_decexec(Cpu*cpu,struct Ppu*ppu,uint8_t*rom,uint8_t*op,uint8_t*ram,bool
qprintf("cpl ;cpl a");
break;
case 0x30://jr nc m8 (signed)
cpu_fetch8(cpu,rom,(uint8_t*)&tmp,ram);
cpu_fetch8(cpu,rom,(uint8_t*)&tmp);
if(!(cpu->f&F_C))
cpu->pc+=(int8_t)tmp;//m8 is signed!
qprintf("jr nc %.2xh%s",(uint8_t)tmp,(!(cpu->f&F_C))?(""):(" ;skipped"));
break;
case 0x31://ld sp,m16
cpu_fetch16(cpu,rom,&cpu->sp,ram);
cpu_fetch16(cpu,rom,&cpu->sp);
qprintf("ld sp,%.4xh",cpu->sp);
break;
case 0x32://ld (hld),a ld (hl),a ; dec hl
tmp=(uint16_t)cpu->h<<8|cpu->l;
// ram[tmp]=cpu->a;
cpu_write_ram(cpu,ppu,tmp,cpu->a,ram);
cpu_write_ram(ppu,tmp,cpu->a,ram);
tmp--;
cpu->h=tmp>>8;
cpu->l=tmp&0x00ff;
@ -437,19 +439,19 @@ void cpu_decexec(Cpu*cpu,struct Ppu*ppu,uint8_t*rom,uint8_t*op,uint8_t*ram,bool
case 0x34://inc (hl)
tmp=cpu->h|cpu->l<<8;
// ram[tmp]++;
cpu_write_ram(cpu,ppu,tmp,ram[tmp]+1,ram);
cpu_write_ram(ppu,tmp,ram[tmp]+1,ram);
qprintf("inc (hl) ;%.4xh",ram[tmp]);
break;
case 0x35://dec (hl)
tmp=cpu->h|cpu->l<<8;
// ram[tmp]--;
cpu_write_ram(cpu,ppu,tmp,ram[tmp]-1,ram);
cpu_write_ram(ppu,tmp,ram[tmp]-1,ram);
qprintf("dec (hl) ;%.4xh",ram[tmp]);
break;
case 0x36://ld (hl),m8
cpu_fetch8(cpu,rom,(uint8_t*)&tmp,ram);
cpu_fetch8(cpu,rom,(uint8_t*)&tmp);
// ram[cpu->h<<8|cpu->l]=(uint8_t)tmp;
cpu_write_ram(cpu,ppu,cpu->h<<8|cpu->l,(uint8_t)tmp,ram);
cpu_write_ram(ppu,cpu->h<<8|cpu->l,(uint8_t)tmp,ram);
qprintf("ld (hl),%.2xh",(uint8_t)tmp);
break;
case 0x37://scf
@ -458,7 +460,7 @@ void cpu_decexec(Cpu*cpu,struct Ppu*ppu,uint8_t*rom,uint8_t*op,uint8_t*ram,bool
qprintf("scf ;%.2xh",cpu->f);
break;
case 0x38://jr c,m8
cpu_fetch8(cpu,rom,(uint8_t*)&tmp,ram);
cpu_fetch8(cpu,rom,(uint8_t*)&tmp);
if(cpu->f&F_C)
cpu->pc+=(int8_t)tmp;//m8 is signed!
qprintf("jr c %.2xh%s",(uint8_t)tmp,(!(cpu->f&F_C))?(""):(" ;skipped"));
@ -498,7 +500,7 @@ void cpu_decexec(Cpu*cpu,struct Ppu*ppu,uint8_t*rom,uint8_t*op,uint8_t*ram,bool
qprintf("dec a");
break;
case 0x3e: //ld a,m8
cpu_fetch8(cpu,rom,&cpu->a,ram);
cpu_fetch8(cpu,rom,&cpu->a);
qprintf("ld a,%.2xh",cpu->a);
break;
case 0x3f: //ccf ;complement F_C flag
@ -703,37 +705,37 @@ void cpu_decexec(Cpu*cpu,struct Ppu*ppu,uint8_t*rom,uint8_t*op,uint8_t*ram,bool
case 0x70: //ld (hl),b
tmp=cpu->h<<8|cpu->l;
// ram[tmp]=cpu->b;
cpu_write_ram(cpu,ppu,tmp,cpu->b,ram);
cpu_write_ram(ppu,tmp,cpu->b,ram);
qprintf("ld (hl),b ;ld (%.4xh),%.2xh",tmp,cpu->b);
break;
case 0x71: //ld (hl),c
tmp=cpu->h<<8|cpu->l;
// ram[tmp]=cpu->c;
cpu_write_ram(cpu,ppu,tmp,cpu->c,ram);
cpu_write_ram(ppu,tmp,cpu->c,ram);
qprintf("ld (hl),c");
break;
case 0x72: //ld (hl),d
tmp=cpu->h<<8|cpu->l;
// ram[tmp]=cpu->d;
cpu_write_ram(cpu,ppu,tmp,cpu->d,ram);
cpu_write_ram(ppu,tmp,cpu->d,ram);
qprintf("ld (hl),d");
break;
case 0x73: //ld (hl),e
tmp=cpu->h<<8|cpu->l;
// ram[tmp]=cpu->e;
cpu_write_ram(cpu,ppu,tmp,cpu->e,ram);
cpu_write_ram(ppu,tmp,cpu->e,ram);
qprintf("ld (hl),e");
break;
case 0x74: //ld (hl),h
tmp=cpu->h<<8|cpu->l;
// ram[tmp]=cpu->h;
cpu_write_ram(cpu,ppu,tmp,cpu->h,ram);
cpu_write_ram(ppu,tmp,cpu->h,ram);
qprintf("ld (hl),h");
break;
case 0x75: //ld (hl),l
tmp=cpu->h<<8|cpu->l;
// ram[tmp]=cpu->l;
cpu_write_ram(cpu,ppu,tmp,cpu->l,ram);
cpu_write_ram(ppu,tmp,cpu->l,ram);
qprintf("ld (hl),l");
break;
case 0x76: //halt
@ -744,7 +746,7 @@ void cpu_decexec(Cpu*cpu,struct Ppu*ppu,uint8_t*rom,uint8_t*op,uint8_t*ram,bool
case 0x77: //ld (hl),a
tmp=cpu->h<<8|cpu->l;
// ram[tmp]=cpu->a;
cpu_write_ram(cpu,ppu,tmp,cpu->a,ram);
cpu_write_ram(ppu,tmp,cpu->a,ram);
qprintf("ld (hl),a ;ld (%.4xh),%.2xh",tmp,cpu->a);
break;
case 0x78: //ld a,b
@ -1062,7 +1064,7 @@ void cpu_decexec(Cpu*cpu,struct Ppu*ppu,uint8_t*rom,uint8_t*op,uint8_t*ram,bool
else cpu->f|=F_C;
cpu->f|=F_Z;//zero flag
cpu->f|=F_N;
qprintf("sbc l ;C:%u",!!cpu->f&F_C);
qprintf("sbc l ;C:%u",(!!cpu->f)&F_C);
break;
case 0x9e: //sbc (hl)
tmp=(uint16_t)cpu->h<<8|cpu->l;
@ -1393,24 +1395,24 @@ void cpu_decexec(Cpu*cpu,struct Ppu*ppu,uint8_t*rom,uint8_t*op,uint8_t*ram,bool
qprintf("pop bc ;%.4xh",cpu->b<<8|cpu->c);
break;
case 0xc2://jp nz,m16
cpu_fetch16(cpu,rom,(uint16_t*)&tmp,ram);
cpu_fetch16(cpu,rom,(uint16_t*)&tmp);
if(!(cpu->f&F_Z))cpu->pc=tmp;
qprintf("jp nz,%.4xh%s",tmp,!cpu->a?" ;skipped":"");
break;
case 0xc3://jp m16
cpu_fetch16(cpu,rom,&cpu->pc,ram);
cpu_fetch16(cpu,rom,&cpu->pc);
cpu->pc-=2;//fetch incr's pc
qprintf("jp %.4xh",cpu->pc);
break;
case 0xc4://call nz,m16
cpu_fetch16(cpu,rom,(uint16_t*)&tmp,ram);
cpu_fetch16(cpu,rom,(uint16_t*)&tmp);
if(!(cpu->f&F_Z))
{
cpu->sp-=2;
// ram[cpu->sp] =(uint8_t)cpu->pc;//push pc
// ram[cpu->sp+1]=cpu->pc>>8;
cpu_write_ram(cpu,ppu,cpu->sp,(uint8_t)cpu->pc,ram);
cpu_write_ram(cpu,ppu,cpu->sp+1,cpu->pc>>8,ram);
cpu_write_ram(ppu,cpu->sp,(uint8_t)cpu->pc,ram);
cpu_write_ram(ppu,cpu->sp+1,cpu->pc>>8,ram);
cpu->pc=tmp;
}
qprintf("call nz,%.4xh%s",tmp,!cpu->a?" ;skipped":"");
@ -1419,13 +1421,13 @@ void cpu_decexec(Cpu*cpu,struct Ppu*ppu,uint8_t*rom,uint8_t*op,uint8_t*ram,bool
cpu->sp-=2;
// ram[cpu->sp]=cpu->c;//little-endian
// ram[cpu->sp+1]=cpu->b;
cpu_write_ram(cpu,ppu,cpu->sp,cpu->c,ram);
cpu_write_ram(cpu,ppu,cpu->sp+1,cpu->b,ram);
cpu_write_ram(ppu,cpu->sp,cpu->c,ram);
cpu_write_ram(ppu,cpu->sp+1,cpu->b,ram);
qprintf("push bc ;%.4xh",cpu->b<<8|cpu->c);
break;
case 0xc6://add a,m8
cpu_fetch8(cpu,rom,(uint8_t*)&tmp,ram);
if((cpu->a&0x0f)+(tmp&0x0f)&0x10)cpu->f|=F_H;//F_H
cpu_fetch8(cpu,rom,(uint8_t*)&tmp);
if((cpu->a&0x0f)+((tmp&0x0f)&0x10))cpu->f|=F_H;//F_H
else cpu->f&=~F_H;
cpu->a+=tmp;
if(cpu->a==0)cpu->f|=F_Z;//Z
@ -1435,12 +1437,12 @@ void cpu_decexec(Cpu*cpu,struct Ppu*ppu,uint8_t*rom,uint8_t*op,uint8_t*ram,bool
qprintf("add a,%.2xh",tmp);
break;
case 0xc7: //rst 00h (call 0000h + 00h)
// cpu_fetch16(cpu,rom,(uint16_t*)&tmp,ram);
// cpu_fetch16(cpu,rom,(uint16_t*)&tmp);
cpu->sp-=2;//alloc
// ram[cpu->sp]=cpu->pc&0x00ff;
// ram[cpu->sp+1]=cpu->pc>>8;
cpu_write_ram(cpu,ppu,cpu->sp,cpu->pc&0x00ff,ram);
cpu_write_ram(cpu,ppu,cpu->sp+1,cpu->pc>>8,ram);
cpu_write_ram(ppu,cpu->sp,cpu->pc&0x00ff,ram);
cpu_write_ram(ppu,cpu->sp+1,cpu->pc>>8,ram);
cpu->pc=0x0000;
qprintf("rst 00h ;ret to %.4xh",ram[cpu->sp]|ram[cpu->sp+1]<<8);
break;
@ -1459,42 +1461,42 @@ void cpu_decexec(Cpu*cpu,struct Ppu*ppu,uint8_t*rom,uint8_t*op,uint8_t*ram,bool
qprintf("ret");
break;
case 0xca: //jp z,m16
cpu_fetch16(cpu,rom,(uint16_t*)&tmp,ram);
cpu_fetch16(cpu,rom,(uint16_t*)&tmp);
if(cpu->f&F_Z)cpu->pc=tmp;
qprintf("jp z%s",cpu->f&F_Z?"":" ;skipped");
break;
case 0xcb: //PREFIX CB
//IX CBPREF IX CBPREF IX CBPR EF IXCBPR EFIX CBPR
cpu_fetch8(cpu,rom,(uint8_t*)&tmp8,ram);
cpu_fetch8(cpu,rom,(uint8_t*)&tmp8);
qprintf("0x%.2x: ",tmp8);
cpu_decexecCB((uint8_t*)cpu,rom,(uint8_t*)&tmp8,ram,quiet);
cpu_decexecCB((uint8_t*)cpu,(uint8_t*)&tmp8,ram,quiet);
break;
case 0xcc: //call z,m16
cpu_fetch16(cpu,rom,(uint16_t*)&tmp,ram);
cpu_fetch16(cpu,rom,(uint16_t*)&tmp);
if(cpu->f&F_Z)
{
cpu->sp-=2;
// ram[cpu->sp] =(uint8_t)cpu->pc;//push pc
// ram[cpu->sp+1]=cpu->pc>>8;
cpu_write_ram(cpu,ppu,cpu->sp,(uint8_t)cpu->pc,ram);
cpu_write_ram(cpu,ppu,cpu->sp+1,cpu->pc>>8,ram);
cpu_write_ram(ppu,cpu->sp,(uint8_t)cpu->pc,ram);
cpu_write_ram(ppu,cpu->sp+1,cpu->pc>>8,ram);
cpu->pc=tmp;
}
qprintf("call z,%.4xh%s",tmp,!cpu->a?"":" ;skipped");
break;
case 0xcd: //call m16
//push ret addr to stack!
cpu_fetch16(cpu,rom,(uint16_t*)&tmp,ram);
cpu_fetch16(cpu,rom,(uint16_t*)&tmp);
cpu->sp-=2;//alloc
// ram[cpu->sp]=(uint16_t)cpu->pc&0x00ff;
// ram[cpu->sp+1]=(uint16_t)cpu->pc>>8;
cpu_write_ram(cpu,ppu,cpu->sp,(uint16_t)cpu->pc&0x00ff,ram);
cpu_write_ram(cpu,ppu,cpu->sp+1,(uint16_t)cpu->pc>>8,ram);
cpu_write_ram(ppu,cpu->sp,(uint16_t)cpu->pc&0x00ff,ram);
cpu_write_ram(ppu,cpu->sp+1,(uint16_t)cpu->pc>>8,ram);
cpu->pc=tmp;
qprintf("call %.4xh ;ret to %.4xh",cpu->pc,ram[cpu->sp]|ram[cpu->sp+1]<<8);
break;
case 0xce: //adc a,m8
cpu_fetch8(cpu,rom,(uint8_t*)&tmp8,ram);
cpu_fetch8(cpu,rom,(uint8_t*)&tmp8);
cpu->a+=tmp8+!!(cpu->f&F_C);
cpu->f&=~F_N;//N
@ -1507,12 +1509,12 @@ void cpu_decexec(Cpu*cpu,struct Ppu*ppu,uint8_t*rom,uint8_t*op,uint8_t*ram,bool
break;
case 0xcf: //rst 08h (call 0000h + 00h)
//MessageBoxA(NULL,"RST08","-",MB_OK);
// cpu_fetch16(cpu,rom,(uint16_t*)&tmp,ram);
// cpu_fetch16(cpu,rom,(uint16_t*)&tmp);
cpu->sp-=2;//alloc
// ram[cpu->sp]=cpu->pc&0x00ff;
// ram[cpu->sp+1]=cpu->pc>>8;
cpu_write_ram(cpu,ppu,cpu->sp,cpu->pc&0x00ff,ram);
cpu_write_ram(cpu,ppu,cpu->sp+1,cpu->pc>>8,ram);
cpu_write_ram(ppu,cpu->sp,cpu->pc&0x00ff,ram);
cpu_write_ram(ppu,cpu->sp+1,cpu->pc>>8,ram);
cpu->pc=0x0008;
qprintf("rst 08h ;ret to %.4xh",ram[cpu->sp]|ram[cpu->sp+1]<<8);
break;
@ -1531,19 +1533,19 @@ void cpu_decexec(Cpu*cpu,struct Ppu*ppu,uint8_t*rom,uint8_t*op,uint8_t*ram,bool
qprintf("pop de ;%.4xh",cpu->d<<8|cpu->e);
break;
case 0xd2: //jp nc,m16
cpu_fetch16(cpu,rom,(uint16_t*)&tmp,ram);
cpu_fetch16(cpu,rom,(uint16_t*)&tmp);
if(!(cpu->f&F_C))cpu->pc=tmp;
qprintf("jp nc,%.4xh%s",tmp,!cpu->a?" ;skipped":"");
break;
case 0xd4://call nc,m16
cpu_fetch16(cpu,rom,(uint16_t*)&tmp,ram);
cpu_fetch16(cpu,rom,(uint16_t*)&tmp);
if(!(cpu->f&F_C))
{
cpu->sp-=2;
// ram[cpu->sp] =(uint8_t)cpu->pc;//push pc
// ram[cpu->sp+1]=cpu->pc>>8;
cpu_write_ram(cpu,ppu,cpu->sp,(uint8_t)cpu->pc,ram);
cpu_write_ram(cpu,ppu,cpu->sp+1,cpu->pc>>8,ram);
cpu_write_ram(ppu,cpu->sp,(uint8_t)cpu->pc,ram);
cpu_write_ram(ppu,cpu->sp+1,cpu->pc>>8,ram);
cpu->pc=tmp;
}
qprintf("call nc,%.4xh%s",tmp,cpu->f&F_C?" ;skipped":"");
@ -1552,13 +1554,13 @@ void cpu_decexec(Cpu*cpu,struct Ppu*ppu,uint8_t*rom,uint8_t*op,uint8_t*ram,bool
cpu->sp-=2;
// ram[cpu->sp]=cpu->e;//little-endian
// ram[cpu->sp+1]=cpu->d;
cpu_write_ram(cpu,ppu,cpu->sp,cpu->e,ram);
cpu_write_ram(cpu,ppu,cpu->sp+1,cpu->d,ram);
cpu_write_ram(ppu,cpu->sp,cpu->e,ram);
cpu_write_ram(ppu,cpu->sp+1,cpu->d,ram);
qprintf("push de ;%.4xh",cpu->d<<8|cpu->e);
break;
case 0xd6://sub m8
cpu_fetch8(cpu,rom,(uint8_t*)&tmp,ram);
if((cpu->a&0x0f+(uint8_t)tmp&0x0f)&0x10)cpu->f|=F_H;//H
cpu_fetch8(cpu,rom,(uint8_t*)&tmp);
if(((cpu->a&0x0f)+(uint8_t)(tmp&0x0f))&0x10)cpu->f|=F_H;//H
else cpu->f&=~F_H;
cpu->a-=(uint8_t)tmp;//2's complement add/sub aren't signed
if(!(cpu->a))cpu->f|=F_Z;//Z
@ -1569,12 +1571,12 @@ void cpu_decexec(Cpu*cpu,struct Ppu*ppu,uint8_t*rom,uint8_t*op,uint8_t*ram,bool
qprintf("sub %.2xh",(uint8_t)tmp);
break;
case 0xd7://rst 10h (call 0000h + 10h)
// cpu_fetch16(cpu,rom,(uint16_t*)&tmp,ram);
// cpu_fetch16(cpu,rom,(uint16_t*)&tmp);
cpu->sp-=2;//alloc
// ram[cpu->sp]=cpu->pc&0x00ff;
// ram[cpu->sp+1]=cpu->pc>>8;
cpu_write_ram(cpu,ppu,cpu->sp,cpu->pc&0x00ff,ram);
cpu_write_ram(cpu,ppu,cpu->sp+1,cpu->pc>>8,ram);
cpu_write_ram(ppu,cpu->sp,cpu->pc&0x00ff,ram);
cpu_write_ram(ppu,cpu->sp+1,cpu->pc>>8,ram);
cpu->pc=0x0010;
qprintf("rst 10h ;ret to %.4xh",ram[cpu->sp]|ram[cpu->sp+1]<<8);
break;
@ -1591,29 +1593,29 @@ void cpu_decexec(Cpu*cpu,struct Ppu*ppu,uint8_t*rom,uint8_t*op,uint8_t*ram,bool
cpu->pc=ram[cpu->sp]|ram[cpu->sp+1]<<8;
cpu->sp+=2;
// ram[0xffff]=0x1f;//enable all interrupts
cpu_write_ram(cpu,ppu,0xffff,0x1f,ram);
cpu_write_ram(ppu,0xffff,0x1f,ram);
qprintf("reti");
break;
case 0xda: //jp c,m16
cpu_fetch16(cpu,rom,(uint16_t*)&tmp,ram);
cpu_fetch16(cpu,rom,(uint16_t*)&tmp);
if(cpu->f&F_C)cpu->pc=tmp;
qprintf("jp c%s",cpu->f&F_C?"":" ;skipped");
break;
case 0xdc: //call c,m16
cpu_fetch16(cpu,rom,(uint16_t*)&tmp,ram);
cpu_fetch16(cpu,rom,(uint16_t*)&tmp);
if(cpu->f&F_C)
{
cpu->sp-=2;
// ram[cpu->sp] =(uint8_t)cpu->pc;//push pc
// ram[cpu->sp+1]=cpu->pc>>8;
cpu_write_ram(cpu,ppu,cpu->sp,(uint8_t)cpu->pc,ram);
cpu_write_ram(cpu,ppu,cpu->sp+1,cpu->pc>>8,ram);
cpu_write_ram(ppu,cpu->sp,(uint8_t)cpu->pc,ram);
cpu_write_ram(ppu,cpu->sp+1,cpu->pc>>8,ram);
cpu->pc=tmp;
}
qprintf("call c,%.4xh%s",tmp,!cpu->a?"":" ;skipped");
break;
case 0xde: //sbc a,m8
cpu_fetch8(cpu,rom,(uint8_t*)&tmp8,ram);
cpu_fetch8(cpu,rom,(uint8_t*)&tmp8);
tmp=cpu->a;
cpu->a-=tmp8+!(cpu->f&F_C);
if(tmp<tmp8)cpu->f&=~F_C;//C
@ -1623,19 +1625,19 @@ void cpu_decexec(Cpu*cpu,struct Ppu*ppu,uint8_t*rom,uint8_t*op,uint8_t*ram,bool
qprintf("sbc %.2x ;C:%x",tmp8,(cpu->f&F_C));
break;
case 0xdf: //rst 18h (call 0000h + 00h)
// cpu_fetch16(cpu,rom,(uint16_t*)&tmp,ram);
// cpu_fetch16(cpu,rom,(uint16_t*)&tmp);
cpu->sp-=2;//alloc
// ram[cpu->sp]=cpu->pc&0x00ff;
// ram[cpu->sp+1]=cpu->pc>>8;
cpu_write_ram(cpu,ppu,cpu->sp,cpu->pc&0x00ff,ram);
cpu_write_ram(cpu,ppu,cpu->sp+1,cpu->pc>>8,ram);
cpu_write_ram(ppu,cpu->sp,cpu->pc&0x00ff,ram);
cpu_write_ram(ppu,cpu->sp+1,cpu->pc>>8,ram);
cpu->pc=0x0018;
qprintf("rst 18h ;ret to %.4xh",ram[cpu->sp]|ram[cpu->sp+1]<<8);
break;
case 0xe0://ldh (m8),a ---> ld (ff00 + m8),a
cpu_fetch8(cpu,rom,(uint8_t*)&tmp,ram);
cpu_fetch8(cpu,rom,(uint8_t*)&tmp);
// ram[0xff00|tmp]=cpu->a;
cpu_write_ram(cpu,ppu,0xff00|tmp,cpu->a,ram);
cpu_write_ram(ppu,0xff00|tmp,cpu->a,ram);
qprintf("ldh (%.2xh),a ;ld (ff00h+%.2xh),a",tmp,tmp);
break;
case 0xe1://pop hl
@ -1645,17 +1647,17 @@ void cpu_decexec(Cpu*cpu,struct Ppu*ppu,uint8_t*rom,uint8_t*op,uint8_t*ram,bool
qprintf("pop hl ;%.4xh",cpu->h|cpu->l<<8);
break;
case 0xe2://ld (c),a
// cpu_fetch8(cpu,rom,(uint8_t*)&tmp8,ram);
// cpu_fetch8(cpu,rom,(uint8_t*)&tmp8);
// ram[0xff00|(uint16_t)cpu->c]=cpu->a;
cpu_write_ram(cpu,ppu,0xff00|(uint16_t)cpu->c,cpu->a,ram);
cpu_write_ram(ppu,0xff00|(uint16_t)cpu->c,cpu->a,ram);
qprintf("ld (c),a");
break;
case 0xe5://push hl
cpu->sp-=2;
// ram[cpu->sp]=cpu->h;
// ram[cpu->sp+1]=cpu->l;
cpu_write_ram(cpu,ppu,cpu->sp,cpu->h,ram);
cpu_write_ram(cpu,ppu,cpu->sp+1,cpu->l,ram);
cpu_write_ram(ppu,cpu->sp,cpu->h,ram);
cpu_write_ram(ppu,cpu->sp+1,cpu->l,ram);
qprintf("push hl ;%.4xh",cpu->h|cpu->l<<8);
break;
case 0xe6://and c ;and a,c
@ -1671,20 +1673,20 @@ void cpu_decexec(Cpu*cpu,struct Ppu*ppu,uint8_t*rom,uint8_t*op,uint8_t*ram,bool
cpu->sp-=2;//alloc
// ram[cpu->sp]=cpu->pc&0x00ff;
// ram[cpu->sp+1]=cpu->pc>>8;
cpu_write_ram(cpu,ppu,cpu->sp,cpu->pc&0x00ff,ram);
cpu_write_ram(cpu,ppu,cpu->sp+1,cpu->pc>>8,ram);
cpu_write_ram(ppu,cpu->sp,cpu->pc&0x00ff,ram);
cpu_write_ram(ppu,cpu->sp+1,cpu->pc>>8,ram);
cpu->pc=0x0020;
qprintf("rst 20h ;ret to %.4xh",ram[cpu->sp]|ram[cpu->sp+1]<<8);
break;
case 0xe8: //add sp,m8
cpu_fetch8(cpu,rom,(uint8_t*)&tmp8,ram);
cpu_fetch8(cpu,rom,(uint8_t*)&tmp8);
// tmp=cpu->sp;
cpu->sp+=tmp8;
cpu->f&=~F_Z;//Z
cpu->f&=~F_N;//N
if(cpu->sp<tmp8)cpu->f|=F_C;//C
else cpu->f&=~F_C;
if( ((cpu->sp&0x0f00)>>8) + (tmp8&0x0f) & 0x10 )cpu->f|=F_H;
if( ((cpu->sp&0x0f00)>>8) + ((tmp8&0x0f) & 0x10) )cpu->f|=F_H;
else cpu->f&=~F_H;
qprintf("add sp,%.2xh",tmp8);
break;
@ -1693,13 +1695,13 @@ void cpu_decexec(Cpu*cpu,struct Ppu*ppu,uint8_t*rom,uint8_t*op,uint8_t*ram,bool
qprintf("jp (hl) ;%.4x",cpu->h<<8|cpu->l);
break;
case 0xea: //ld (m16),a
cpu_fetch16(cpu,rom,(uint16_t*)&tmp,ram);
cpu_fetch16(cpu,rom,(uint16_t*)&tmp);
// ram[tmp]=cpu->a;
cpu_write_ram(cpu,ppu,tmp,cpu->a,ram);
cpu_write_ram(ppu,tmp,cpu->a,ram);
qprintf("ld (%.4xh),a",tmp);
break;
case 0xee: //xor m8
cpu_fetch8(cpu,rom,(uint8_t*)&tmp8,ram);
cpu_fetch8(cpu,rom,(uint8_t*)&tmp8);
cpu->a^=tmp8;
if(!cpu->a)cpu->f|=F_Z;//Z
else cpu->f&=~F_Z;
@ -1712,13 +1714,13 @@ void cpu_decexec(Cpu*cpu,struct Ppu*ppu,uint8_t*rom,uint8_t*op,uint8_t*ram,bool
cpu->sp-=2;//alloc
// ram[cpu->sp]=cpu->pc&0x00ff;
// ram[cpu->sp+1]=cpu->pc>>8;
cpu_write_ram(cpu,ppu,cpu->sp,cpu->pc&0x00ff,ram);
cpu_write_ram(cpu,ppu,cpu->sp+1,cpu->pc>>8,ram);
cpu_write_ram(ppu,cpu->sp,cpu->pc&0x00ff,ram);
cpu_write_ram(ppu,cpu->sp+1,cpu->pc>>8,ram);
cpu->pc=0x0028;
qprintf("rst 28h ;ret to %.4xh",ram[cpu->sp]|ram[cpu->sp+1]<<8);
break;
case 0xf0://ldh a,(m8) ---> ld a,(ff00 + m8)
cpu_fetch8(cpu,rom,(uint8_t*)&tmp,ram);
cpu_fetch8(cpu,rom,(uint8_t*)&tmp);
cpu->a=ram[0xff00|tmp];
qprintf("ldh a,(%.2xh) ;ld a,(ff00h+%.2xh)",tmp,tmp);
break;
@ -1733,7 +1735,7 @@ void cpu_decexec(Cpu*cpu,struct Ppu*ppu,uint8_t*rom,uint8_t*op,uint8_t*ram,bool
qprintf("ld a,(c)");
break;
case 0xf3://di
//cpu_write_ram(cpu,ppu,0xffff,0x00,ram);
//cpu_write_ram(ppu,0xffff,0x00,ram);
cpu->ime=0;
qprintf("di");
break;
@ -1741,12 +1743,12 @@ void cpu_decexec(Cpu*cpu,struct Ppu*ppu,uint8_t*rom,uint8_t*op,uint8_t*ram,bool
cpu->sp-=2;
// ram[cpu->sp]=cpu->a;
// ram[cpu->sp+1]=cpu->f;
cpu_write_ram(cpu,ppu,cpu->sp,cpu->a,ram);
cpu_write_ram(cpu,ppu,cpu->sp+1,cpu->f,ram);
cpu_write_ram(ppu,cpu->sp,cpu->a,ram);
cpu_write_ram(ppu,cpu->sp+1,cpu->f,ram);
qprintf("push af ;%.4xh",cpu->a|cpu->f<<8);
break;
case 0xf6://or m8
cpu_fetch8(cpu,rom,(uint8_t*)&tmp8,ram);
cpu_fetch8(cpu,rom,(uint8_t*)&tmp8);
cpu->a|=tmp8;
if(!cpu->a)cpu->f|=F_Z;//Z
else cpu->f&=~F_Z;
@ -1759,13 +1761,13 @@ void cpu_decexec(Cpu*cpu,struct Ppu*ppu,uint8_t*rom,uint8_t*op,uint8_t*ram,bool
cpu->sp-=2;//alloc
// ram[cpu->sp]=cpu->pc&0x00ff;
// ram[cpu->sp+1]=cpu->pc>>8;
cpu_write_ram(cpu,ppu,cpu->sp,cpu->pc&0x00ff,ram);
cpu_write_ram(cpu,ppu,cpu->sp+1,cpu->pc>>8,ram);
cpu_write_ram(ppu,cpu->sp,cpu->pc&0x00ff,ram);
cpu_write_ram(ppu,cpu->sp+1,cpu->pc>>8,ram);
cpu->pc=0x0030;
qprintf("rst 30h ;ret to %.4xh",ram[cpu->sp]|ram[cpu->sp+1]<<8);
break;
case 0xf8://ld hl,sp+m8
cpu_fetch8(cpu,rom,(uint8_t*)&tmp8,ram);
cpu_fetch8(cpu,rom,(uint8_t*)&tmp8);
tmp=cpu->sp+(int8_t)tmp8;//tmp8 needs to be sign-extended
cpu->h=tmp>>8;
cpu->l=(uint8_t)tmp;//trunc
@ -1783,17 +1785,17 @@ void cpu_decexec(Cpu*cpu,struct Ppu*ppu,uint8_t*rom,uint8_t*op,uint8_t*ram,bool
qprintf("ld sp,hl ;%.4xh",tmp);
break;
case 0xfa: //ld a,(m16)
cpu_fetch16(cpu,rom,(uint16_t*)&tmp,ram);
cpu_fetch16(cpu,rom,(uint16_t*)&tmp);
cpu->a=ram[tmp];
qprintf("ld a,(%.2xh)",tmp);
break;
case 0xfb: //ei
//cpu_write_ram(cpu,ppu,0xffff,0x1f,ram);
//cpu_write_ram(ppu,0xffff,0x1f,ram);
cpu->ime=1;
qprintf("ei");
break;
case 0xfe: //cp m8
cpu_fetch8(cpu,rom,(uint8_t*)&tmp,ram);
cpu_fetch8(cpu,rom,(uint8_t*)&tmp);
//flags:
if(cpu->a-tmp==0)cpu->f|=F_Z;else cpu->f&=~F_Z;//Z
cpu->f|=F_N;//N
@ -1806,8 +1808,8 @@ void cpu_decexec(Cpu*cpu,struct Ppu*ppu,uint8_t*rom,uint8_t*op,uint8_t*ram,bool
case 0xff: //rst 38h (call 0000h + 38h)
//MessageBoxA(NULL,"RST38","-",MB_OK);
cpu->sp-=2;//alloc
cpu_write_ram(cpu,ppu,cpu->sp,cpu->pc&0x00ff,ram);
cpu_write_ram(cpu,ppu,cpu->sp+1,cpu->pc>>8,ram);
cpu_write_ram(ppu,cpu->sp,cpu->pc&0x00ff,ram);
cpu_write_ram(ppu,cpu->sp+1,cpu->pc>>8,ram);
cpu->pc=0x0038;
qprintf("rst 38h ;ret to %.4xh",ram[cpu->sp]|ram[cpu->sp+1]<<8);
break;
@ -1824,13 +1826,13 @@ void cpu_decexec(Cpu*cpu,struct Ppu*ppu,uint8_t*rom,uint8_t*op,uint8_t*ram,bool
case 0xfc: //nop
case 0xfd: //nop
default:
qprintf("nop",*op);
qprintf("nop");
break;
}
}
// CB Prefix instructions
void cpu_decexecCB(uint8_t*cpua,uint8_t*rom,uint8_t*op,uint8_t*ram,bool quiet)
void cpu_decexecCB(uint8_t*cpua,uint8_t*op,uint8_t*ram,bool quiet)
{
static const uint8_t cbreg[]={2,3,4,5,6,7,0xff,0}; //(op&0xf)%8
static const char*cbrnm[]={"b","c","d","e","h","l","(hl)","a"};
@ -1884,7 +1886,8 @@ void cpu_decexecCB(uint8_t*cpua,uint8_t*rom,uint8_t*op,uint8_t*ram,bool quiet)
/*NOTE: For some reason, RRC/RLC doesn't use CF, but RR/RL does*/
//00h - 07h RLC
if(*op>=0x00 && *op<=0x07)
//if((*op>=0x00) && (*op<=0x07))
if(*op<=0x07)
{
tmp8=(*op&0xf)%8;
@ -2111,7 +2114,7 @@ void cpu_decexecCB(uint8_t*cpua,uint8_t*rom,uint8_t*op,uint8_t*ram,bool quiet)
else tmp=cpua[cbreg[tmp8]];//reg
asm("mov %0,%%al":"=m"(tmp));
ror(tmp,4);
tmp=ror(tmp,4);
//asm("rorb %0,%%al");
asm("mov %%al,%0":"=m"(tmp));
@ -2156,7 +2159,8 @@ void cpu_decexecCB(uint8_t*cpua,uint8_t*rom,uint8_t*op,uint8_t*ram,bool quiet)
}
//c0h - ffh SET
if(*op>=0xc0 && *op<=0xff)
//if(*op>=0xc0 && *op<=0xff)
if(*op>=0xc0)
{
tmp=((*op&0xf0)>>4)%4*2+((*op&0x0f)>=8);//bit
tmp8=(*op&0xf)%8;
@ -2168,3 +2172,10 @@ void cpu_decexecCB(uint8_t*cpua,uint8_t*rom,uint8_t*op,uint8_t*ram,bool quiet)
return;
}
}
void cpu_log_clear(void)
{
log_buffer[0]='\0';
}
#undef qprintf

9
cpu.h
View File

@ -25,9 +25,10 @@ typedef struct Cpu
} Cpu;
char*cpu_log(void);
void cpu_log_clear(void);
void cpu_decexec(Cpu*cpu,struct Ppu*ppu,uint8_t*rom,uint8_t*op,uint8_t*ram,bool quiet);
void cpu_decexecCB(uint8_t*cpu,uint8_t*rom,uint8_t*op,uint8_t*ram,bool quiet);
void cpu_fetch16(Cpu*cpu,uint8_t*rom,uint16_t*u16,uint8_t*ram);
void cpu_fetch8(Cpu*cpu,uint8_t*rom,uint8_t*u8,uint8_t*ram);
void cpu_decexecCB(uint8_t*cpu,uint8_t*op,uint8_t*ram,bool quiet);
void cpu_fetch16(Cpu*cpu,uint8_t*rom,uint16_t*u16);
void cpu_fetch8(Cpu*cpu,uint8_t*rom,uint8_t*u8);
void cpu_romhexdump(uint8_t*rom);
void cpu_write_ram(Cpu*cpu,struct Ppu*ppu,uint16_t addr,uint8_t val,uint8_t*ram);
void cpu_write_ram(struct Ppu*ppu,uint16_t addr,uint8_t val,uint8_t*ram);

6
main.c
View File

@ -22,10 +22,10 @@ int main(int argc,char **argv)
// Allocate Gb state
gb=gb_new();
if(!gb.cpu||!gb.ppu||!gb.ram)goto quit;
//gb.log=true;
gb.log=true;
// Parse arguments
for(size_t i=1;i<argc;++i)
for(size_t i=1;i<(size_t)argc;++i)
{
if(strcmp(argv[i],"-d")==0)
@ -116,7 +116,7 @@ int main(int argc,char **argv)
/* printf("\n[%#10.8x]%#5.2x: ",gb.cpu->pc,gb.rom[gb.cpu->pc]); */
// Fetch, decode, execute instruction
cpu_fetch8(gb.cpu,gb.rom,&gb.op,gb.ram);
cpu_fetch8(gb.cpu,gb.rom,&gb.op);
cpu_decexec(gb.cpu,gb.ppu,gb.rom,&gb.op,gb.ram,!gb.log);
}

21
ppu.c
View File

@ -18,7 +18,7 @@ uint32_t ppu_openwindow(Ppu*ppu,uint8_t*str)
fprintf(stderr,"error: cannot open window with NULL Ppu\n");
}
ppu->info=tigrWindow(160,144,"memory",0);
ppu->screen=tigrWindow(160,144,str,0);
ppu->screen=tigrWindow(160,144,(char*)str,0);
if(ppu->screen)ppu->pixels.t=ppu->screen->pix;
return ppu->screen==NULL||ppu->info==NULL;
}
@ -68,7 +68,12 @@ uint32_t ppu_updatewindow(struct Gb*gb,uint8_t*ram)
{
tigrClear(gb->ppu->screen,tigrRGB(255,255,255));
if(tigrKeyDown(gb->ppu->screen,'P'))gb->paused=!gb->paused;
if(tigrKeyDown(gb->ppu->screen,'L'))gb->log=!gb->log;
if(tigrKeyDown(gb->ppu->screen,'L'))
{
gb->log=!gb->log;
if(!gb->log)
cpu_log_clear();
}
if(tigrKeyDown(gb->ppu->screen,'M'))gb->ppu->mode=!gb->ppu->mode;
if(tigrKeyDown(gb->ppu->screen,TK_SPACE))tilemap=!tilemap;
@ -116,8 +121,6 @@ uint32_t ppu_updatewindow(struct Gb*gb,uint8_t*ram)
print(0,12+i*12+1,str);
++i;
}
sprintf(str,"PC: %.4x%s",gb->cpu->pc,gb->paused?" [paused]":"");
print(0,12+1+i*12,str);
break;
}
@ -126,12 +129,20 @@ uint32_t ppu_updatewindow(struct Gb*gb,uint8_t*ram)
case M_DASM:
{
static char str[128];
strncpy(str,cpu_log(),128);
sprintf(str,"%.4x:%s",gb->cpu->pc,cpu_log());
print(0,12,str);
sprintf(str,"log:%s",(gb->log)?"on":"off");
print(0,121,str);
break;
}
}
// All modes:
sprintf(str,"PC: %.4x%s",gb->cpu->pc,gb->paused?" [paused]":"");
print(0,133,str);
}
tigrUpdate(gb->ppu->info);