rosgb/gb.c
2024-05-17 22:13:30 -05:00

112 lines
2.7 KiB
C

#include<stdint.h>
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include"gb.h"
Gb gb_new(void)
{
Gb gb=(Gb){0};
gb.paused=false;
gb.nclocks=clock();
gb.log=false;
gb.video=true;
gb.cpu=malloc(sizeof(struct Cpu));
if(!gb.cpu)
{
fprintf(stderr,"error: failed to allocate CPU\n");
goto fail;
}
*(gb.cpu)=(struct Cpu){.sp=0xfe,.pc=0x100,.ime=1};
gb.ppu=malloc(sizeof(struct Ppu));
if(!gb.ppu)
{
fprintf(stderr,"error: failed to allocate PPU\n");
goto fail;
}
*(gb.ppu)=(Ppu){0};
gb.ppu->mode=M_MEM;
gb.ram=malloc(0x10000);
if(!gb.ram)
{
fprintf(stderr,"error: failed to allocate RAM\n");
goto fail;
}
return gb;
fail:
gb_free(&gb);
return gb;
}
void gb_free(Gb*gb)
{
if(!gb)
{
fprintf(stderr,"error: cannot free NULL Gb\n");
return;
}
if(gb->cpu)free(gb->cpu);
gb->cpu=NULL;
if(gb->ppu)free(gb->ppu);
gb->ppu=NULL;
if(gb->ram)free(gb->ram);
gb->ram=NULL;
if(gb->rom)free(gb->rom);
gb->rom=NULL;
}
void gb_print_cpu_state(Gb*gb)
{
if(!gb)
{
fprintf(stderr,"error: cannot print Cpu state with NULL Gb\n");
return;
}
printf("\n----------\nCPU State:");
for(int i=0;i<8;i++)
{
printf("\n%c=","afbcdehl"[i]);
uint16_t r=0;
switch(i)
{
default:
case 0:r=gb->cpu->a;break;
case 1:r=gb->cpu->f;break;
case 2:r=gb->cpu->b;break;
case 3:r=gb->cpu->c;break;
case 4:r=gb->cpu->d;break;
case 5:r=gb->cpu->e;break;
case 6:r=gb->cpu->h;break;
case 7:r=gb->cpu->l;break;
}
printf("%12u (%#4.2x)",r,r);
}
printf("\nsp: %.4x\npc: %.4x\n",gb->cpu->sp,gb->cpu->pc);
printf("IME: %.2x\n",gb->cpu->ime);
printf("f: (%x) Z:%x N:%x H:%x C:%x\n",gb->cpu->f>>4,(gb->cpu->f&F_Z)>>4,(gb->cpu->f&F_N)>>4,(gb->cpu->f&F_H)>>4,(gb->cpu->f&F_C)>>4);
printf("INT: (%.2x) V-B:%.2x LCD:%.2x TIM:%.2x SER:%.2x JOYP:%.2x\n",gb->ram[0xffff],gb->ram[0xffff]&0x1,gb->ram[0xffff]>>1&0x1,gb->ram[0xffff]>>2&0x1,gb->ram[0xffff]>>3&0x1,gb->ram[0xffff]>>4&0x1);
printf("STACK: ");for(int i=0xfffe;i>0xffee;i--)printf("%.2x ",gb->ram[i]);
printf("\nTILE 0(RAM): ");for(int i=0;i<8;i++)printf("%.2x ",gb->ram[0x8000+i]);
// {
// printf("\nTilemap:%.2x,%.2x\n",(uint8_t)gb->ram[0x9800],(uint8_t)gb->ram[0x9801]);
// FILE *fp=fopen("tilemap.txt","w");
// for(int i=0;i<0x800;i++)//lines
// {
// fprintf(fp,"%.2x,",gb->ram[0x9800+i]);
// if(i%32==0 && i!=0)fputc('\n',fp);
// }
// // fwrite(gb->ram+0x9800,1,0x800,fp);
// fclose(fp);
// }
printf("\nOAM Sprite 0 Tile: %.2x X: %.2x Y: %.2x",gb->ram[0xfe02],gb->ram[0xfe00],gb->ram[0xfe01]);
printf("\nOAM Sprite 1 Tile: %.2x X: %.2x Y: %.2x",gb->ram[0xfe06],gb->ram[0xfe04],gb->ram[0xfe05]);
printf("\nOAM Sprite 16 Tile: %.2x X: %.2x Y: %.2x",gb->ram[0xfe12],gb->ram[0xfe10],gb->ram[0xfe11]);
printf("\n");
}