disassembly in info window
This commit is contained in:
parent
2ef5944a76
commit
ac9ea9ca61
4
Makefile
4
Makefile
|
@ -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
261
cpu.c
|
@ -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
9
cpu.h
|
@ -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
6
main.c
|
@ -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
21
ppu.c
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue
Block a user