X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=ppu098.c;h=7591282663e5cc0aa9904ef81fc84cba9e54f05c;hb=03c1614fc3c6db44cfd03f62eb415492192a37a7;hp=62f78c5e04dc75fdaee0cfe385e535fd507bbfaf;hpb=6244011fd85a10400accd6d8e7d941144f92aa5b;p=fceu.git diff --git a/ppu098.c b/ppu098.c index 62f78c5..7591282 100644 --- a/ppu098.c +++ b/ppu098.c @@ -26,7 +26,7 @@ #include "fce.h" #include "ppu098.h" #include "nsf.h" -#include "sound.h" // TODO 098? +#include "sound.h" #include "memory.h" #include "cart.h" @@ -34,6 +34,10 @@ #include "video.h" #include "input.h" +#ifdef __arm__ +#include "drivers/arm/asmutils.h" +#endif + #define Pal (PALRAM) static void FetchSpriteData098(void); @@ -82,35 +86,6 @@ static void makeppulut(void) } } -// TODO: make this compatible with the new sound code -#ifdef ASM_6502 -static void asmcpu_update(int32 cycles) -{ - // some code from x6502.c - fhcnt-=cycles; - if(fhcnt<=0) - { - FrameSoundUpdate(); - fhcnt+=fhinc; - } - - if(PCMIRQCount>0) - { - PCMIRQCount-=cycles; - if(PCMIRQCount<=0) - { - vdis=1; - if((PSG[0x10]&0x80) && !(PSG[0x10]&0x40)) - { - extern uint8 SIRQStat; - SIRQStat|=0x80; - X6502_IRQBegin(FCEU_IQDPCM); - } - } - } -} -#endif - extern int ppudead; extern int kook; @@ -216,7 +191,7 @@ static DECLFW(B2000) { // FCEU_printf("Trigger NMI, %d, %d\n",timestamp,ppudead); // TriggerNMI2(); - TriggerNMI(); + TriggerNMI(); // TODO? } PPU[0]=V; TempAddr&=0xF3FF; @@ -361,13 +336,13 @@ static int tofix=0; static void ResetRL(uint8 *target) { - memset(target,0xFF,256); + FCEU_dwmemset(target,0xffffffff,256); if(InputScanlineHook) InputScanlineHook(0,0,0,0); Plinef=target; Pline=target; firsttile=0; - linestartts=timestamp*48+X.count; + linestartts=timestamp*48+X6502_GetCycleCount(); tofix=0; FCEUPPU_LineUpdate098(); tofix=1; @@ -486,9 +461,13 @@ static void FASTAPASS(1) RefreshLine098(int lastpixel) if(!ScreenON && !SpriteON) { uint32 tem; + int tiles; tem=Pal[0]|(Pal[0]<<8)|(Pal[0]<<16)|(Pal[0]<<24); tem|=0x40404040; - FCEU_dwmemset(Pline,tem,numtiles*8); + tiles=numtiles; + if(firsttile+tiles > 256/8) tiles=256/8-firsttile; + if(tiles > 0) + FCEU_dwmemset(Pline,tem,tiles*8); P+=numtiles*8; Pline=P; @@ -692,7 +671,9 @@ static void Fixit1(void) void MMC5_hb(int); /* Ugh ugh ugh. */ static void DoLine(void) { +#ifndef __arm__ int x; +#endif uint8 *target=XBuf+scanline*320+32; if(MMC5Hack && (ScreenON || SpriteON)) MMC5_hb(scanline); @@ -711,6 +692,19 @@ static void DoLine(void) if(SpriteON) CopySprites098(target); +#ifdef __arm__ + if(ScreenON || SpriteON) // Yes, very el-cheapo. + { + if(PPU[1]&0x01) + block_and(target, 256, 0x30); + } + if((PPU[1]>>5)==0x7) + block_or(target, 256, 0xc0); + else if(PPU[1]&0xE0) + block_or(target, 256, 0x40); + else + block_andor(target, 256, 0x3f, 0x80); +#else if(ScreenON || SpriteON) // Yes, very el-cheapo. { if(PPU[1]&0x01) @@ -730,6 +724,7 @@ static void DoLine(void) else for(x=63;x>=0;x--) *(uint32 *)&target[x<<2]=((*(uint32*)&target[x<<2])&0x3f3f3f3f)|0x80808080; +#endif sphitx=0x100; @@ -1193,7 +1188,10 @@ void FCEUPPU_Loop(int skip) if(ppudead) /* Needed for Knight Rider, possibly others. */ { //memset(XBuf, 0x80, 256*240); - X6502_Run(scanlines_per_frame*(256+85)); + //X6502_Run(scanlines_per_frame*(256+85)); + int lines; + for (lines=scanlines_per_frame;lines;lines--) + X6502_Run(256+85); ppudead--; } else @@ -1215,7 +1213,13 @@ void FCEUPPU_Loop(int skip) if(VBlankON) TriggerNMI(); } - X6502_Run((scanlines_per_frame-242)*(256+85)-12); //-12); + // Note: this is needed for asm core + { + int lines; + X6502_Run(256+85-12); + for (lines=scanlines_per_frame-242-1;lines;lines--) + X6502_Run(256+85); + } PPU_status&=0x1f; X6502_Run(256); @@ -1247,12 +1251,14 @@ void FCEUPPU_Loop(int skip) } if(FCEUGameInfo.type==GIT_NSF) { - X6502_Run((256+85)*240); + // run scanlines for asm core to fuction + for(scanline=0;scanline<240;scanline++) + X6502_Run(256+85); } #ifdef FRAMESKIP else if(skip) { - int y; + int y, lines; y=SPRAM[0]; y++; @@ -1271,12 +1277,17 @@ void FCEUPPU_Loop(int skip) } else if(y<240) { - X6502_Run((256+85)*y); + for (lines=y;lines;lines--) + X6502_Run(256+85); if(SpriteON) PPU_status|=0x40; // Quick and very dirty hack. - X6502_Run((256+85)*(240-y)); + for (lines=240-y;lines;lines--) + X6502_Run(256+85); } else - X6502_Run((256+85)*240); + { + for (lines=240;lines;lines--) + X6502_Run(256+85); + } } #endif else