info screen modes

This commit is contained in:
corey 2024-05-17 17:52:23 -05:00
parent ddb69c4517
commit 17c4fb77ba
4 changed files with 65 additions and 29 deletions

1
gb.c
View File

@ -28,6 +28,7 @@ Gb gb_new(void)
goto fail;
}
*(gb.ppu)=(Ppu){0};
gb.ppu->mode=M_MEM;
gb.ram=malloc(0x10000);
if(!gb.ram)

1
gb.h
View File

@ -19,6 +19,7 @@ typedef struct Gb
uint8_t paused;
bool video;
bool log;
size_t timer; // How often to show disassembly
} Gb;
Gb gb_new(void);

89
ppu.c
View File

@ -56,43 +56,74 @@ uint32_t ppu_updatewindow(struct Gb*gb,uint8_t*ram)
if(!gb->ppu->screen||!gb->ppu->info)return 1;
delay++;
if(delay%400!=0)return 0;
if(!tigrClosed(gb->ppu->screen)&&!tigrKeyHeld(gb->ppu->screen,TK_ESCAPE)&&!tigrClosed(gb->ppu->info)&&!tigrKeyHeld(gb->ppu->info,TK_ESCAPE))
if(!tigrClosed(gb->ppu->screen) && !tigrKeyHeld(gb->ppu->screen,TK_ESCAPE) && !tigrClosed(gb->ppu->info) && !tigrKeyHeld(gb->ppu->info,TK_ESCAPE))
{
tigrClear(gb->ppu->screen,tigrRGB(255,255,255));
tigrClear(gb->ppu->info,tigrRGB(0x22,0x22,0x22));
if(tigrKeyDown(gb->ppu->screen,'P'))gb->paused=!gb->paused;
if(tigrKeyDown(gb->ppu->screen,TK_SPACE))tilemap=!tilemap;
//Draw all tiles
if(tilemap)//LCD DISPLAY ON
// Draw graphical/main screen
{
//uint16_t tilemap_select=0x9800;
//if(ram[0xff40]&0x40)tilemap_select=0x9c00;
for(int j=0;j<18;j++)//tile map veritcal
for(int i=0;i<20;i++)//tile map horizontal
ppu_drawtile(gb->ppu,i*8,j*8,0x8000,ram[0x9800+(j*0x20+i)],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,'M'))gb->ppu->mode=!gb->ppu->mode;
if(tigrKeyDown(gb->ppu->screen,TK_SPACE))tilemap=!tilemap;
uint16_t oam_offs=0xfe00;//should be 0xfe00
for(int i=0;i<40;i+=4)//OAM sprites
if(ram[oam_offs+i*4]>=8&&ram[oam_offs+i*4+1]>=16)
ppu_drawtile(gb->ppu,ram[oam_offs+i*4]-8,ram[oam_offs+i*4+1]-16,0x8000,ram[oam_offs+i*4+2],ram);
//Draw all tiles
if(tilemap)//LCD DISPLAY ON
{
//uint16_t tilemap_select=0x9800;
//if(ram[0xff40]&0x40)tilemap_select=0x9c00;
for(int j=0;j<18;j++)//tile map veritcal
for(int i=0;i<20;i++)//tile map horizontal
ppu_drawtile(gb->ppu,i*8,j*8,0x8000,ram[0x9800+(j*0x20+i)],ram);
uint16_t oam_offs=0xfe00;//should be 0xfe00
for(int i=0;i<40;i+=4)//OAM sprites
if(ram[oam_offs+i*4]>=8&&ram[oam_offs+i*4+1]>=16)
ppu_drawtile(gb->ppu,ram[oam_offs+i*4]-8,ram[oam_offs+i*4+1]-16,0x8000,ram[oam_offs+i*4+2],ram);
}
else
// for(int i=0;i<256+128;i++)
for(int i=0;i<256;i++)
ppu_drawtile(gb->ppu,i%16*8,(i/16)*8,0x8000,i,ram);
}
else
// for(int i=0;i<256+128;i++)
for(int i=0;i<256;i++)
ppu_drawtile(gb->ppu,i%16*8,(i/16)*8,0x8000,i,ram);
// for(int i=0;i<0xff;i++)
// Draw information screen
{
tigrClear(gb->ppu->info,tigrRGB(0x22,0x22,0x22));
// Print mode name
static char str[128];
auto uint16_t ad=0xff46;
auto uint8_t i=0;
info:
sprintf(str,"%.4x: %.2x %.2x %.2x %.2x %.2x %.2x",ad+i*6,ram[ad+i*6],ram[ad+i*6+1],ram[ad+i*6+2],ram[ad+i*6+3],ram[ad+i*6+4],ram[ad+i*6+5]);
print(0,i*12+1,str);
if(i++<9)goto info;
sprintf(str,"PC: %.4x%s",gb->cpu->pc,gb->paused?" [paused]":"");
print(0,1+i*12,str);
sprintf(str,"%s",(gb->ppu->mode==M_MEM)?("memory"):("disasm"));
print(0,0,str);
switch(gb->ppu->mode)
{
default:
case M_MEM:
{
auto uint16_t ad=0xff46;
auto uint8_t i=0;
while(i<9)
{
sprintf(str,"%.4x: %.2x %.2x %.2x %.2x %.2x %.2x",ad+i*6,ram[ad+i*6],ram[ad+i*6+1],ram[ad+i*6+2],ram[ad+i*6+3],ram[ad+i*6+4],ram[ad+i*6+5]);
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;
}
case M_DASM:
{
static char str[128];
break;
}
}
}

3
ppu.h
View File

@ -11,11 +11,14 @@ struct Ppu;
#include"cpu.h"
#include"gb.h"
enum{M_MEM,M_DASM};
typedef struct Ppu
{
union{TPixel*t;uint32_t*i;}pixels;
Tigr*screen;
Tigr*info;
size_t mode;
} Ppu;
uint32_t ppu_closewindow(Ppu*ppu);