diff --git a/desmume/src/GPU.c b/desmume/src/GPU.c index ca807514f..6a7323bdf 100644 --- a/desmume/src/GPU.c +++ b/desmume/src/GPU.c @@ -383,138 +383,6 @@ void GPU_setBGProp(GPU * gpu, u16 num, u16 p) gpu->BGSize[num][1] = sizeTab[mode][cnt->ScreenSize][1]; } -void GPU_setWIN0_H0 (GPU *gpu, u8 val) -{ - gpu->WIN0H0 = val; -} -void GPU_setWIN0_H1 (GPU *gpu, u8 val) -{ - gpu->WIN0H1 = val; -} -void GPU_setWIN0_V0 (GPU *gpu, u8 val) -{ - gpu->WIN0V0 = val; -} -void GPU_setWIN0_V1 (GPU *gpu, u8 val) -{ - gpu->WIN0V1 = val; -} - -void GPU_setWIN1_H0 (GPU *gpu, u8 val) -{ - gpu->WIN1H0 = val; -} -void GPU_setWIN1_H1 (GPU *gpu, u8 val) -{ - gpu->WIN1H1 = val; -} -void GPU_setWIN1_V0 (GPU *gpu, u8 val) -{ - gpu->WIN1V0; -} -void GPU_setWIN1_V1 (GPU *gpu, u8 val) -{ - gpu->WIN1V1 = val; -} - -void GPU_setWININ0 (GPU *gpu, u8 val) -{ - gpu->WININ0 = val&0x1F; - gpu->WININ0_SPECIAL = (val>>5)&1; -} -void GPU_setWININ1 (GPU *gpu, u8 val) -{ - gpu->WININ1 = val&0x1F; - gpu->WININ1_SPECIAL = (val>>5)&1; -} - -void GPU_setWINOUT (GPU *gpu, u8 val) -{ - gpu->WINOUT = val&0x1F; - gpu->WINOUT_SPECIAL = (val>>5)&1; -} - -void GPU_setWINOBJ (GPU *gpu, u8 val) -{ - gpu->WINOBJ = val&0x1F; - gpu->WINOBJ_SPECIAL = (val>>5)&1; -} - -void GPU_setWIN0_H (GPU *gpu, u16 val) -{ - gpu->WIN0H0 = val >> 8; - gpu->WIN0H1 = val&0xFF; -} -void GPU_setWIN0_V (GPU *gpu, u16 val) -{ - gpu->WIN0V0 = val >> 8; - gpu->WIN0V1 = val&0xFF; -} -void GPU_setWIN1_H (GPU *gpu, u16 val) -{ - gpu->WIN1H0 = val >> 8; - gpu->WIN1H1 = val&0xFF; -} -void GPU_setWIN1_V (GPU *gpu, u16 val) -{ - gpu->WIN1V0 = val >> 8; - gpu->WIN1V1 = val&0xFF; -} -void GPU_setWININ (GPU *gpu, u16 val) -{ - gpu->WININ0 = val&0x1F; - gpu->WININ0_SPECIAL = (val>>5)&1; - - val >>= 8; - gpu->WININ1 = val&0x1F; - gpu->WININ1_SPECIAL = (val>>5)&1; -} -void GPU_setWINOUT16(GPU *gpu, u16 val) -{ - gpu->WINOUT = val&0x1F; - gpu->WINOUT_SPECIAL = (val>>5)&1; - - val >>= 8; - gpu->WINOBJ = val&0x1F; - gpu->WINOBJ_SPECIAL = (val>>5)&1; -} - -// Blending -void GPU_setBLDCNT_LOW (GPU *gpu, u8 val) -{ - gpu->BLDCNT = (gpu->BLDCNT&0xFF00) | val; - SetupFinalPixelBlitter (gpu); -} -void GPU_setBLDCNT_HIGH (GPU *gpu, u8 val) -{ - gpu->BLDCNT = (gpu->BLDCNT&0xFF) | (val<<8); - SetupFinalPixelBlitter (gpu); -} -void GPU_setBLDCNT (GPU *gpu, u16 val) -{ - gpu->BLDCNT = val; - SetupFinalPixelBlitter (gpu); -} -void GPU_setBLDALPHA (GPU *gpu, u16 val) -{ - gpu->BLDALPHA_EVA = (val&0x1f) > 16 ? 16 : (val&0x1f); - - val >>= 8; - gpu->BLDALPHA_EVB = (val&0x1f) > 16 ? 16 : (val&0x1f); -} -void GPU_setBLDALPHA_EVA (GPU *gpu, u8 val) -{ - gpu->BLDALPHA_EVA = (val&0x1f) > 16 ? 16 : (val&0x1f); -} -void GPU_setBLDALPHA_EVB (GPU *gpu, u8 val) -{ - gpu->BLDALPHA_EVB = (val&0x1f) > 16 ? 16 : (val&0x1f); -} -void GPU_setBLDY_EVY (GPU *gpu, u8 val) -{ - gpu->BLDY_EVY = (val&0x1f) > 16 ? 16 : (val&0x1f); -} - /*****************************************************************************/ // ENABLING / DISABLING LAYERS /*****************************************************************************/ @@ -619,6 +487,7 @@ static BOOL setFinalColorSpecialBlend (const GPU *gpu, u32 passing, u8 bgnum, u8 if ((gpu->BLDCNT >> bgnum)&1 && gpu->BLDALPHA_EVA) { u16 sourceFraction = gpu->BLDALPHA_EVA, sourceR, sourceG, sourceB,targetFraction; + if (!sourceFraction) return 0; // no fraction of this BG to be showed, so don't do anything sourceR = ((color & 0x1F) * sourceFraction) >> 4 ; @@ -1655,9 +1524,10 @@ void sprite1D(GPU * gpu, u16 l, u8 * dst, u8 * prioTab) if (spriteInfo->Mode == 3) /* sprite is in BMP format */ { - /* sprMemory + sprBoundary + 16Bytes per line (8pixels a 2 bytes) */ - src = (gpu->sprMem) + (spriteInfo->TileIndex<<4) + (y<sprBMPBoundary); - + /* sprMemory + sprBoundary + 16Bytes per line (8pixels a 2 bytes) */ + //src = (gpu->sprMem) + (spriteInfo->TileIndex<<4) + (y<sprBMPBoundary); + // FIXME:this no correct, but work ??? + src = (gpu->sprMem) + (((spriteInfo->TileIndex&0x3E0) * 64 + (spriteInfo->TileIndex&0x1F) *8 + ( y << 8)) << 1); render_sprite_BMP (gpu, l, dst, (u16*)src, prioTab, prio, lg, sprX, x, xdir); continue; @@ -1915,12 +1785,11 @@ void sprite2D(GPU * gpu, u16 l, u8 * dst, u8 * prioTab) if (spriteInfo->Mode == 3) /* sprite is in BMP format */ { if (dispCnt->OBJ_BMP_2D_dim) // 256*256 - src = (gpu->sprMem) + (((spriteInfo->TileIndex&0x3F0) * 64 + (spriteInfo->TileIndex&0x0F) *8 + ( y << 8)) << 1); - else // 128 * 512 src = (gpu->sprMem) + (((spriteInfo->TileIndex&0x3E0) * 64 + (spriteInfo->TileIndex&0x1F) *8 + ( y << 8)) << 1); + else // 128 * 512 + src = (gpu->sprMem) + (((spriteInfo->TileIndex&0x3F0) * 64 + (spriteInfo->TileIndex&0x0F) *8 + ( y << 8)) << 1); - render_sprite_BMP (gpu, l, dst, (u16*)src, - prioTab, prio, lg, sprX, x, xdir); + render_sprite_BMP (gpu, l, dst, (u16*)src, prioTab, prio, lg, sprX, x, xdir); continue; } @@ -2265,7 +2134,7 @@ void GPU_ligne(NDS_Screen * screen, u16 l) capDst = (ARM9Mem.ARM9_LCD + (capcnt->VRAM_Write_Block * 0x20000) + ((dispCnt->BG_Mode != 2) ? (capcnt->VRAM_Write_Offset * 0x8000) : 0) - + l * capx * 2); /* read offset ignored in VRAM display mode*/ + + l * (capx<<1)); /* read offset ignored in VRAM display mode*/ // LOG("Capture line %d (%X) [dst: %X]...\n", l, gpu->dispCapCnt.val, capDst - ARM9Mem.ARM9_LCD); @@ -2276,11 +2145,11 @@ void GPU_ligne(NDS_Screen * screen, u16 l) { u16 cap3DLine[256]; /* temp buffer for 3D line reading */ gpu3D->NDS_3D_GetLine (l, cap3DLine); /*FIXME: not sure it's good, since I hadn't seen how 3D works in desmume */ - for(i = 0; i < capx; i++) T1WriteWord(capDst, i, cap3DLine[i]); /* copy this line to buffer */ + for(i = 0; i < (capx<<1); i++) T1WriteWord(capDst, i, cap3DLine[i]); /* copy this line to buffer */ } else /* capture all screen (BG + OBJ + 3D) */ { - for(i = 0; i < capx; i++) T1WriteWord(capDst, i, T2ReadWord(dst, i)); /* plain copy from screen to buffer */ + for(i = 0; i < (capx<<1); i++) T1WriteWord(capDst, i, T2ReadWord(dst, i)); /* plain copy from screen to buffer */ } break; @@ -2297,7 +2166,7 @@ void GPU_ligne(NDS_Screen * screen, u16 l) + ((dispCnt->BG_Mode != 2) ? (capcnt->VRAM_Write_Offset * 0x8000) : 0) + l * capx * 2); /* write offset ignored in VRAM display mode*/ - for(i = 0; i < capx; i++) T1WriteWord(capDst, i, T2ReadWord(capSrc, i)); /* plain copy from source to dest */ + for(i = 0; i < (capx<<1); i++) T1WriteWord(capDst, i, T2ReadWord(capSrc, i)); /* plain copy from source to dest */ } break; diff --git a/desmume/src/GPU.h b/desmume/src/GPU.h index ac89d9543..0cb6bfd79 100644 --- a/desmume/src/GPU.h +++ b/desmume/src/GPU.h @@ -771,39 +771,49 @@ void GPU_set_DISPCAPCNT(GPU * gpu, u32 val) ; void GPU_ligne(NDS_Screen * screen, u16 l) ; void GPU_setMasterBrightness (GPU *gpu, u16 val); -void GPU_setWIN0_H (GPU *gpu, u16 val); -void GPU_setWIN0_H0 (GPU *gpu, u8 val); -void GPU_setWIN0_H1 (GPU *gpu, u8 val); +#define GPU_setWIN0_H(gpu, val) {gpu->WIN0H0 = val >> 8; gpu->WIN0H1 = val&0xFF;} +#define GPU_setWIN0_H0(gpu, val) gpu->WIN0H0 = val +#define GPU_setWIN0_H1(gpu, val) gpu->WIN0H1 = val -void GPU_setWIN0_V (GPU *gpu, u16 val); -void GPU_setWIN0_V0 (GPU *gpu, u8 val); -void GPU_setWIN0_V1 (GPU *gpu, u8 val); +#define GPU_setWIN0_V(gpu, val) {gpu->WIN0V0 = val >> 8; gpu->WIN0V1 = val&0xFF;} +#define GPU_setWIN0_V0(gpu, val) gpu->WIN0V0 = val +#define GPU_setWIN0_V1(gpu, val) gpu->WIN0V1 = val -void GPU_setWIN1_H (GPU *gpu, u16 val); -void GPU_setWIN1_H0 (GPU *gpu, u8 val); -void GPU_setWIN1_H1 (GPU *gpu, u8 val); +#define GPU_setWIN1_H(gpu, val) {gpu->WIN1H0 = val >> 8; gpu->WIN1H1 = val&0xFF;} +#define GPU_setWIN1_H0(gpu, val) gpu->WIN1H0 = val +#define GPU_setWIN1_H1(gpu, val) gpu->WIN1H1 = val -void GPU_setWIN1_V (GPU *gpu, u16 val); -void GPU_setWIN1_V0 (GPU *gpu, u8 val); -void GPU_setWIN1_V1 (GPU *gpu, u8 val); +#define GPU_setWIN1_V(gpu, val) {gpu->WIN1V0 = val >> 8; gpu->WIN1V1 = val&0xFF;} +#define GPU_setWIN1_V0(gpu, val) gpu->WIN1V0 = val +#define GPU_setWIN1_V1(gpu, val) gpu->WIN1V1 = val -void GPU_setWININ (GPU *gpu, u16 val); -void GPU_setWININ0 (GPU *gpu, u8 val); -void GPU_setWININ1 (GPU *gpu, u8 val); +#define GPU_setWININ(gpu, val) {gpu->WININ0=val&0x1F;\ + gpu->WININ0_SPECIAL=(val>>5)&1;\ + gpu->WININ1=(val>>8)&0x1F;\ + gpu->WININ1_SPECIAL=(val>>13)&1;\ + } +#define GPU_setWININ0(gpu, val) {gpu->WININ0 = val&0x1F; gpu->WININ0_SPECIAL = (val>>5)&1;} +#define GPU_setWININ1(gpu, val) {gpu->WININ1 = val&0x1F; gpu->WININ1_SPECIAL = (val>>5)&1;} -void GPU_setWINOUT16(GPU *gpu, u16 val); -void GPU_setWINOUT (GPU *gpu, u8 val); -void GPU_setWINOBJ (GPU *gpu, u8 val); +#define GPU_setWINOUT16(gpu, val) { gpu->WINOUT=val&0x1F;\ + gpu->WINOUT_SPECIAL=(val>>5)&1;\ + gpu->WINOBJ=(val>>8)&0x1F;\ + gpu->WINOBJ_SPECIAL=(val>>13)&1;\ + } +#define GPU_setWINOUT(gpu, val) {gpu->WINOUT = val&0x1F; gpu->WINOUT_SPECIAL = (val>>5)&1;} +#define GPU_setWINOBJ(gpu, val) {gpu->WINOBJ = val&0x1F; gpu->WINOBJ_SPECIAL = (val>>5)&1;} -void GPU_setBLDCNT_LOW (GPU *gpu, u8 val); -void GPU_setBLDCNT_HIGH (GPU *gpu, u8 val); -void GPU_setBLDCNT (GPU *gpu, u16 val); +// Blending +#define GPU_setBLDCNT_LOW(gpu, val) {gpu->BLDCNT = (gpu->BLDCNT&0xFF00) | val; SetupFinalPixelBlitter (gpu);} +#define GPU_setBLDCNT_HIGH(gpu, val) {gpu->BLDCNT = (gpu->BLDCNT&0xFF) | (val<<8); SetupFinalPixelBlitter (gpu);} +#define GPU_setBLDCNT(gpu, val) {gpu->BLDCNT = val; SetupFinalPixelBlitter (gpu);} -void GPU_setBLDALPHA (GPU *gpu, u16 val); -void GPU_setBLDALPHA_EVA(GPU *gpu, u8 val); -void GPU_setBLDALPHA_EVB(GPU *gpu, u8 val); +#define GPU_setBLDALPHA(gpu, val) {gpu->BLDALPHA_EVA = (val&0x1f) > 16 ? 16 : (val&0x1f);\ + gpu->BLDALPHA_EVB = (val>>8&0x1f) > 16 ? 16 : (val>>8&0x1f);} +#define GPU_setBLDALPHA_EVA(gpu, val) {gpu->BLDALPHA_EVA = (val&0x1f) > 16 ? 16 : (val&0x1f);} +#define GPU_setBLDALPHA_EVB(gpu, val) {gpu->BLDALPHA_EVB = (val&0x1f) > 16 ? 16 : (val&0x1f);} -void GPU_setBLDY_EVY (GPU *gpu, u8 val); +#define GPU_setBLDY_EVY(gpu, val) {gpu->BLDY_EVY = (val&0x1f) > 16 ? 16 : (val&0x1f);} #ifdef __cplusplus } diff --git a/desmume/src/MMU.c b/desmume/src/MMU.c index ca0bdb2a7..dede25866 100644 --- a/desmume/src/MMU.c +++ b/desmume/src/MMU.c @@ -309,12 +309,12 @@ void MMU_VRAMWriteBackToLCD(u8 block) u8 *source; u32 size ; u8 VRAMBankCnt; - #if 1 - return ; - #endif + destination = 0 ; source = 0; - VRAMBankCnt = MMU_read8(ARMCPU_ARM9,REG_VRAMCNTA+block) ; + VRAMBankCnt = MMU_read8(ARMCPU_ARM9,REG_VRAMCNTA+block); + if(!(VRAMBankCnt&0x80))return; + switch (block) { case 0: // Bank A @@ -359,56 +359,70 @@ void MMU_VRAMWriteBackToLCD(u8 block) switch (VRAMBankCnt & 7) { case 0: /* vram is allready stored at LCD, we dont need to write it back */ - MMU.vScreen = 1; break ; case 1: - switch(block){ - case 0: - case 1: - case 2: - case 3: - /* banks are in use for BG at ABG + ofs * 0x20000 */ - source = ARM9Mem.ARM9_ABG + ((VRAMBankCnt >> 3) & 3) * 0x20000 ; - break ; - case 4: - /* bank E is in use at ABG */ - source = ARM9Mem.ARM9_ABG ; - break; - case 5: - case 6: - /* banks are in use for BG at ABG + (0x4000*OFS.0)+(0x10000*OFS.1)*/ - source = ARM9Mem.ARM9_ABG + (((VRAMBankCnt >> 3) & 1) * 0x4000) + (((VRAMBankCnt >> 2) & 1) * 0x10000) ; - break; - case 8: - /* bank H is in use at BBG */ - source = ARM9Mem.ARM9_BBG ; - break ; - case 9: - /* bank I is in use at BBG */ - source = ARM9Mem.ARM9_BBG + 0x8000 ; - break; - default: return ; - } + switch(block){ + case 0: + case 1: + case 2: + case 3: + /* banks are in use for BG at ABG + ofs * 0x20000 */ + source = ARM9Mem.ARM9_ABG + ((VRAMBankCnt >> 3) & 3) * 0x20000 ; + break ; + case 4: + /* bank E is in use at ABG */ + source = ARM9Mem.ARM9_ABG ; + break; + case 5: + case 6: + /* banks are in use for BG at ABG + (0x4000*OFS.0)+(0x10000*OFS.1)*/ + source = ARM9Mem.ARM9_ABG + (((VRAMBankCnt >> 3) & 1) * 0x4000) + (((VRAMBankCnt >> 2) & 1) * 0x10000) ; + break; + case 8: + /* bank H is in use at BBG */ + source = ARM9Mem.ARM9_BBG ; + break ; + case 9: + /* bank I is in use at BBG */ + source = ARM9Mem.ARM9_BBG + 0x8000 ; + break; + default: return ; + } break ; case 2: - if (block < 2) + switch(block) { - /* banks A,B are in use for OBJ at AOBJ + ofs * 0x20000 */ - source = ARM9Mem.ARM9_AOBJ + ((VRAMBankCnt >> 3) & 1) * 0x20000 ; - } else return ; + case 0: + case 1: + // banks A,B are in use for OBJ at AOBJ + ofs * 0x20000 + source=ARM9Mem.ARM9_AOBJ+(((VRAMBankCnt>>3)&1)*0x20000); + break; + case 4: + source=ARM9Mem.ARM9_AOBJ; + break; + case 5: + case 6: + source=ARM9Mem.ARM9_AOBJ+(((VRAMBankCnt>>3)&1)*0x4000)+(((VRAMBankCnt>>4)&1)*0x10000); + break; + case 9: + // source=ARM9Mem.ARM9_BOBJ; + break; + } break ; + case 3: break; case 4: - switch(block){ - case 2: - /* bank C is in use at BBG */ - source = ARM9Mem.ARM9_BBG ; - break ; - case 3: - /* bank D is in use at BOBJ */ - source = ARM9Mem.ARM9_BOBJ ; - break ; - default: return ; - } + switch(block) + { + case 2: + /* bank C is in use at BBG */ + source = ARM9Mem.ARM9_BBG ; + break ; + case 3: + /* bank D is in use at BOBJ */ + source = ARM9Mem.ARM9_BOBJ ; + break ; + default: return ; + } break ; default: return ; @@ -423,9 +437,8 @@ void MMU_VRAMReloadFromLCD(u8 block,u8 VRAMBankCnt) u8 *destination; u8 *source; u32 size; - #if 1 - return ; - #endif + + if(!(VRAMBankCnt&0x80))return; destination = 0; source = 0; size = 0; @@ -470,59 +483,66 @@ void MMU_VRAMReloadFromLCD(u8 block,u8 VRAMBankCnt) default: return ; } - switch (VRAMBankCnt & 7) { - case 0: - /* vram is allready stored at LCD, we dont need to write it back */ - MMU.vScreen = 1; +switch (VRAMBankCnt & 7) { + case 0: // vram is allready stored at LCD, we dont need to write it back break ; case 1: - if (block < 4) - { - /* banks are in use for BG at ABG + ofs * 0x20000 */ - destination = ARM9Mem.ARM9_ABG + ((VRAMBankCnt >> 3) & 3) * 0x20000 ; - } else return ; + switch(block){ + case 0: + case 1: + case 2: + case 3: // banks are in use for BG at ABG + ofs * 0x20000 + destination = ARM9Mem.ARM9_ABG + ((VRAMBankCnt >> 3) & 3) * 0x20000 ; + break ; + case 4: // bank E is in use at ABG + destination = ARM9Mem.ARM9_ABG ; + break; + case 5: + case 6: // banks are in use for BG at ABG + (0x4000*OFS.0)+(0x10000*OFS.1) + destination = ARM9Mem.ARM9_ABG + (((VRAMBankCnt >> 3) & 1) * 0x4000) + (((VRAMBankCnt >> 4) & 1) * 0x10000) ; + break; + case 7: + case 8: // bank H is in use at BBG + destination = ARM9Mem.ARM9_BBG ; + break ; + case 9: // bank I is in use at BBG + //destination = ARM9Mem.ARM9_BBG + 0x8000 ; + break; + default: return ; + } break ; case 2: - switch(block){ - case 0: - case 1: - case 2: - case 3: - /* banks are in use for BG at ABG + ofs * 0x20000 */ - destination = ARM9Mem.ARM9_ABG + ((VRAMBankCnt >> 3) & 3) * 0x20000 ; - break ; - case 4: - /* bank E is in use at ABG */ - destination = ARM9Mem.ARM9_ABG ; - break; - case 5: - case 6: - /* banks are in use for BG at ABG + (0x4000*OFS.0)+(0x10000*OFS.1)*/ - destination = ARM9Mem.ARM9_ABG + (((VRAMBankCnt >> 3) & 1) * 0x4000) + (((VRAMBankCnt >> 2) & 1) * 0x10000) ; - break; - case 8: - /* bank H is in use at BBG */ - destination = ARM9Mem.ARM9_BBG ; - break ; - case 9: - /* bank I is in use at BBG */ - destination = ARM9Mem.ARM9_BBG + 0x8000 ; - break; - default: return ; - } - break ; + switch(block) + { + case 0: + case 1: + destination=ARM9Mem.ARM9_AOBJ+(((VRAMBankCnt>>3)&3)*0x20000); + break; + case 4: + destination=ARM9Mem.ARM9_AOBJ; + break; + case 5: + case 6: + destination=ARM9Mem.ARM9_AOBJ+(((VRAMBankCnt>>3)&1)*0x4000)+(((VRAMBankCnt>>4)&1)*0x10000); + break; + case 9: + // destination=ARM9Mem.ARM9_BOBJ; + break; + } + + break; + case 3: break; case 4: - switch(block){ - case 2: - /* bank C is in use at BBG */ - destination = ARM9Mem.ARM9_BBG ; - break ; - case 3: - /* bank D is in use at BOBJ */ - destination = ARM9Mem.ARM9_BOBJ ; - break ; - default: return ; - } + switch(block){ + case 2: // bank C is in use at BBG + destination = ARM9Mem.ARM9_BBG ; + break ; + case 3: + // bank D is in use at BOBJ + destination = ARM9Mem.ARM9_BOBJ ; + break ; + default: return ; + } break ; default: return ; @@ -703,22 +723,11 @@ u32 FASTCALL MMU_read32(u32 proc, u32 adr) // This is hacked due to the only current 3D core case 0x04000600: { - /* - u32 fifonum = IPCFIFO+proc; - - u32 gxstat = (MMU.fifos[fifonum].empty<<26) | - (1<<25) | - (MMU.fifos[fifonum].full<<24) | - /*((NDS_nbpush[0]&1)<<13) | ((NDS_nbpush[2]&0x1F)<<8) |*/ - // 2; u32 gxstat =(2|(MMU.gfxfifo.hits_count<<16)| (MMU.gfxfifo.full<<24)| (MMU.gfxfifo.empty<<25)| (MMU.gfxfifo.half<<26)| (MMU.gfxfifo.irq<<30)); - - //printlog("GXSTAT: 0x%X\n", gxstat); - return gxstat; } @@ -862,7 +871,8 @@ void FASTCALL MMU_write8(u32 proc, u32 adr, u8 val) if(proc==ARMCPU_ARM9 && adr<0x02000000) { //printlog("MMU ITCM (08) Write %08X: %08X\n", adr, val); - return T1WriteByte(ARM9Mem.ARM9_ITCM, adr&0x7FFF, val); + T1WriteByte(ARM9Mem.ARM9_ITCM, adr&0x7FFF, val); + return ; } // CFlash writing, Mic if ((adr>=0x9000000)&&(adr<0x9900000)) { @@ -892,7 +902,7 @@ void FASTCALL MMU_write8(u32 proc, u32 adr, u8 val) switch(adr) { case REG_DISPA_WIN0H: - if(proc == ARMCPU_ARM9) GPU_setWIN0_H1 (MainScreen.gpu, val); + if(proc == ARMCPU_ARM9) GPU_setWIN0_H1(MainScreen.gpu, val); break ; case REG_DISPA_WIN0H+1: if(proc == ARMCPU_ARM9) GPU_setWIN0_H0 (MainScreen.gpu, val); @@ -1013,52 +1023,27 @@ void FASTCALL MMU_write8(u32 proc, u32 adr, u8 val) case REG_VRAMCNTD: if(proc == ARMCPU_ARM9) { - - - MMU_VRAMWriteBackToLCD(0) ; - MMU_VRAMWriteBackToLCD(1) ; - MMU_VRAMWriteBackToLCD(2) ; - MMU_VRAMWriteBackToLCD(3) ; - if (!(val&0x80)) - { - u8 tmp=T1ReadByte(ARM9Mem.ARM9_REG, 0x240); - switch(tmp & 7) - { - case 0: - memset(ARM9Mem.ARM9_LCD,0,0x20000); - break; - case 1: - memset(ARM9Mem.ARM9_ABG+(0x20000*OFS(tmp)),0,0x20000); - break; - case 2: - memset(ARM9Mem.ARM9_AOBJ+(0x20000*(OFS(tmp)&1)),0,0x20000); - //memset(ARM9Mem.ARM9_ABG+0x40000,0,0x20000); - break; - case 3: - memset(ARM9Mem.textureSlotAddr[OFS(tmp)], 0, 0x20000); - break; - } - } else + MMU_VRAMWriteBackToLCD(adr-REG_VRAMCNTA) ; switch(val & 0x1F) { case 1 : MMU.vram_mode[adr-REG_VRAMCNTA] = 0; // BG-VRAM - memset(ARM9Mem.ARM9_ABG,0,0x20000); + //memset(ARM9Mem.ARM9_ABG,0,0x20000); //MMU.vram_offset[0] = ARM9Mem.ARM9_ABG+(0x20000*0); // BG-VRAM break; case 1 | (1 << 3) : MMU.vram_mode[adr-REG_VRAMCNTA] = 1; // BG-VRAM - memset(ARM9Mem.ARM9_ABG+0x20000,0,0x20000); + //memset(ARM9Mem.ARM9_ABG+0x20000,0,0x20000); //MMU.vram_offset[0] = ARM9Mem.ARM9_ABG+(0x20000*1); // BG-VRAM break; case 1 | (2 << 3) : MMU.vram_mode[adr-REG_VRAMCNTA] = 2; // BG-VRAM - memset(ARM9Mem.ARM9_ABG+0x40000,0,0x20000); + //memset(ARM9Mem.ARM9_ABG+0x40000,0,0x20000); //MMU.vram_offset[0] = ARM9Mem.ARM9_ABG+(0x20000*2); // BG-VRAM break; case 1 | (3 << 3) : MMU.vram_mode[adr-REG_VRAMCNTA] = 3; // BG-VRAM - memset(ARM9Mem.ARM9_ABG+0x60000,0,0x20000); + //memset(ARM9Mem.ARM9_ABG+0x60000,0,0x20000); //MMU.vram_offset[0] = ARM9Mem.ARM9_ABG+(0x20000*3); // BG-VRAM break; case 0: // mapped to lcd @@ -1088,7 +1073,7 @@ void FASTCALL MMU_write8(u32 proc, u32 adr, u8 val) case REG_VRAMCNTE : if(proc == ARMCPU_ARM9) { - MMU_VRAMWriteBackToLCD((u8)REG_VRAMCNTE) ; + MMU_VRAMWriteBackToLCD(4); if((val & 7) == 5) { ARM9Mem.ExtPal[0][0] = ARM9Mem.ARM9_LCD + 0x80000; @@ -1111,13 +1096,14 @@ void FASTCALL MMU_write8(u32 proc, u32 adr, u8 val) ARM9Mem.ExtPal[0][3] = ARM9Mem.ARM9_LCD + 0x86000; } - MMU_VRAMReloadFromLCD(adr-REG_VRAMCNTE,val) ; + MMU_VRAMReloadFromLCD(4,val) ; } break; case REG_VRAMCNTF : if(proc == ARMCPU_ARM9) { + MMU_VRAMWriteBackToLCD(5); switch(val & 0x1F) { case 4 : @@ -1154,11 +1140,13 @@ void FASTCALL MMU_write8(u32 proc, u32 adr, u8 val) ARM9Mem.ObjExtPal[0][1] = ARM9Mem.ARM9_LCD + 0x92000; break; } + MMU_VRAMReloadFromLCD(5,val); } break; case REG_VRAMCNTG : if(proc == ARMCPU_ARM9) { + MMU_VRAMWriteBackToLCD(6); switch(val & 0x1F) { case 4 : @@ -1195,13 +1183,14 @@ void FASTCALL MMU_write8(u32 proc, u32 adr, u8 val) ARM9Mem.ObjExtPal[0][1] = ARM9Mem.ARM9_LCD + 0x96000; break; } + MMU_VRAMReloadFromLCD(6,val); } break; case REG_VRAMCNTH : if(proc == ARMCPU_ARM9) { - MMU_VRAMWriteBackToLCD((u8)REG_VRAMCNTH) ; + MMU_VRAMWriteBackToLCD(7); if((val & 7) == 2) { @@ -1211,14 +1200,14 @@ void FASTCALL MMU_write8(u32 proc, u32 adr, u8 val) ARM9Mem.ExtPal[1][3] = ARM9Mem.ARM9_LCD + 0x9E000; } - MMU_VRAMReloadFromLCD(adr-REG_VRAMCNTH,val) ; + MMU_VRAMReloadFromLCD(7,val); } break; case REG_VRAMCNTI : if(proc == ARMCPU_ARM9) { - MMU_VRAMWriteBackToLCD((u8)REG_VRAMCNTI) ; + MMU_VRAMWriteBackToLCD(8); if((val & 7) == 3) { @@ -1226,7 +1215,7 @@ void FASTCALL MMU_write8(u32 proc, u32 adr, u8 val) ARM9Mem.ObjExtPal[1][1] = ARM9Mem.ARM9_LCD + 0xA2000; } - MMU_VRAMReloadFromLCD(adr-REG_VRAMCNTI,val) ; + MMU_VRAMReloadFromLCD(8,val); } break; @@ -1268,7 +1257,8 @@ void FASTCALL MMU_write16(u32 proc, u32 adr, u16 val) if(proc==ARMCPU_ARM9 && adr<0x02000000) { //printlog("MMU ITCM (16) Write %08X: %08X\n", adr, val); - return T1WriteWord(ARM9Mem.ARM9_ITCM, adr&0x7FFF, val); + T1WriteWord(ARM9Mem.ARM9_ITCM, adr&0x7FFF, val); + return ; } // CFlash writing, Mic @@ -1622,8 +1612,16 @@ void FASTCALL MMU_write16(u32 proc, u32 adr, u16 val) if ( new_val && old_val != new_val) { /* raise an interrupt request to the CPU if needed */ if ( MMU.reg_IE[proc] & MMU.reg_IF[proc]) { - NDS_ARM7.wIRQ = TRUE; - NDS_ARM7.waitIRQ = FALSE; + if (proc==ARMCPU_ARM7) + { + NDS_ARM7.wIRQ = TRUE; + NDS_ARM7.waitIRQ = FALSE; + } + else + { + NDS_ARM9.wIRQ = TRUE; + NDS_ARM9.waitIRQ = FALSE; + } } } return; @@ -1653,8 +1651,16 @@ void FASTCALL MMU_write16(u32 proc, u32 adr, u16 val) if ( MMU.reg_IME[proc]) { /* raise an interrupt request to the CPU if needed */ if ( MMU.reg_IE[proc] & MMU.reg_IF[proc]) { - NDS_ARM7.wIRQ = TRUE; - NDS_ARM7.waitIRQ = FALSE; + if (proc==ARMCPU_ARM7) + { + NDS_ARM7.wIRQ = TRUE; + NDS_ARM7.waitIRQ = FALSE; + } + else + { + NDS_ARM9.wIRQ = TRUE; + NDS_ARM9.waitIRQ = FALSE; + } } } return; @@ -1906,7 +1912,8 @@ void FASTCALL MMU_write32(u32 proc, u32 adr, u32 val) if(proc==ARMCPU_ARM9 && adr<0x02000000) { //printlog("MMU ITCM (32) Write %08X: %08X\n", adr, val); - return T1WriteLong(ARM9Mem.ARM9_ITCM, adr&0x7FFF, val); + T1WriteLong(ARM9Mem.ARM9_ITCM, adr&0x7FFF, val); + return ; } // CFlash writing, Mic @@ -2362,6 +2369,43 @@ void FASTCALL MMU_write32(u32 proc, u32 adr, u32 val) break; } + case REG_DISPA_WIN0H: + { + if(proc==ARMCPU_ARM9) + { + GPU_setWIN0_H(MainScreen.gpu, val&0xFFFF); + GPU_setWIN1_H(MainScreen.gpu, val>>16); + } + break; + } + case REG_DISPA_WIN0V: + { + if(proc==ARMCPU_ARM9) + { + GPU_setWIN0_V(MainScreen.gpu, val&0xFFFF); + GPU_setWIN1_V(MainScreen.gpu, val>>16); + } + break; + } + case REG_DISPB_WIN0H: + { + if(proc==ARMCPU_ARM9) + { + GPU_setWIN0_H(SubScreen.gpu, val&0xFFFF); + GPU_setWIN1_H(SubScreen.gpu, val>>16); + } + break; + } + case REG_DISPB_WIN0V: + { + if(proc==ARMCPU_ARM9) + { + GPU_setWIN0_V(SubScreen.gpu, val&0xFFFF); + GPU_setWIN1_V(SubScreen.gpu, val>>16); + } + break; + } + case REG_DISPA_BLDCNT: { if (proc == ARMCPU_ARM9) @@ -2411,8 +2455,16 @@ void FASTCALL MMU_write32(u32 proc, u32 adr, u32 val) if ( new_val && old_val != new_val) { /* raise an interrupt request to the CPU if needed */ if ( MMU.reg_IE[proc] & MMU.reg_IF[proc]) { - NDS_ARM7.wIRQ = TRUE; - NDS_ARM7.waitIRQ = FALSE; + if (proc==ARMCPU_ARM7) + { + NDS_ARM7.wIRQ = TRUE; + NDS_ARM7.waitIRQ = FALSE; + } + else + { + NDS_ARM9.wIRQ = TRUE; + NDS_ARM9.waitIRQ = FALSE; + } } } return; @@ -2423,8 +2475,16 @@ void FASTCALL MMU_write32(u32 proc, u32 adr, u32 val) if ( MMU.reg_IME[proc]) { /* raise an interrupt request to the CPU if needed */ if ( MMU.reg_IE[proc] & MMU.reg_IF[proc]) { - NDS_ARM7.wIRQ = TRUE; - NDS_ARM7.waitIRQ = FALSE; + if (proc==ARMCPU_ARM7) + { + NDS_ARM7.wIRQ = TRUE; + NDS_ARM7.waitIRQ = FALSE; + } + else + { + NDS_ARM9.wIRQ = TRUE; + NDS_ARM9.waitIRQ = FALSE; + } } } return; @@ -2898,7 +2958,7 @@ void FASTCALL MMU_doDMA(u32 proc, u32 num) if ((MMU.DMAStartTime[proc][num]==4) && // Must be in main memory display mode (taille==4) && // Word must be 4 (((MMU.DMACrt[proc][num]>>26)&1) == 1)) // Transfer mode must be 32bit wide - taille = 256*192/2; + taille = 24576; //256*192/2; if(MMU.DMAStartTime[proc][num] == 5) taille *= 0x80; diff --git a/desmume/src/NDSSystem.c b/desmume/src/NDSSystem.c index 021ec6f99..44918dacc 100644 --- a/desmume/src/NDSSystem.c +++ b/desmume/src/NDSSystem.c @@ -829,7 +829,7 @@ NDS_exec(s32 nb, BOOL force) for(; (nb >= nds.cycles) && ((force)||(execute)); ) { - for (j = 0; j < 4 && (!force); j++) + for (j = 0; j < 4 && (!force) && (execute); j++) { if(nds.ARM9Cycle<=nds.cycles) { @@ -846,7 +846,7 @@ NDS_exec(s32 nb, BOOL force) LOG(logbuf); } #endif - for (i = 0; i < 4 && (!force); i++) + for (i = 0; i < 4 && (!force) && (execute); i++) { if(NDS_ARM9.waitIRQ) nds.ARM9Cycle += 100; @@ -879,7 +879,7 @@ NDS_exec(s32 nb, BOOL force) LOG(logbuf); } #endif - for (i = 0; i < 4 && (!force); i++) + for (i = 0; i < 4 && (!force) && (execute); i++) { if(NDS_ARM7.waitIRQ) nds.ARM7Cycle += 100; diff --git a/desmume/src/debug.h b/desmume/src/debug.h index f6a432a0f..f2ee99570 100644 --- a/desmume/src/debug.h +++ b/desmume/src/debug.h @@ -53,7 +53,7 @@ void LogStop(void); #ifdef DEBUG #define LOG(...) DebugPrintf(MainLog, __FILE__, __LINE__, __VA_ARGS__) #else -#if defined(WIN32) && defined(BETAVERSION) && defined(OLD_LOG) +#if defined(WIN32) && defined(BETA_VERSION) && defined(OLD_LOG) #define LOG(...) printlog(__VA_ARGS__) #else #define LOG(...) diff --git a/desmume/src/matrix.c b/desmume/src/matrix.c index 20439d290..bdb260ad2 100644 --- a/desmume/src/matrix.c +++ b/desmume/src/matrix.c @@ -23,20 +23,20 @@ #include #include "matrix.h" -void FASTCALL MatrixInit (float *matrix) +void MatrixInit (float *matrix) { memset (matrix, 0, sizeof(float)*16); matrix[0] = matrix[5] = matrix[10] = matrix[15] = 1.f; } #ifdef SSE2 -void FASTCALL MatrixIdentity (float *matrix) //============== TODO +void __fastcall MatrixIdentity (float *matrix) //============== TODO { memset (matrix, 0, sizeof(float)*16); matrix[0] = matrix[5] = matrix[10] = matrix[15] = 1.f; } -float FASTCALL MatrixGetMultipliedIndex (int index, float *matrix, float *rightMatrix) +float __fastcall MatrixGetMultipliedIndex (int index, float *matrix, float *rightMatrix) { int iMod = index%4, iDiv = (index>>2)<<2; @@ -44,12 +44,12 @@ float FASTCALL MatrixGetMultipliedIndex (int index, float *matrix, float *rightM (matrix[iMod+8]*rightMatrix[iDiv+2])+(matrix[iMod+12]*rightMatrix[iDiv+3]); } -void FASTCALL MatrixSet (float *matrix, int x, int y, float value) // TODO +void __fastcall MatrixSet (float *matrix, int x, int y, float value) // TODO { matrix [x+(y<<2)] = value; } -void FASTCALL MatrixCopy (float *matrixDST, float *matrixSRC) +void __fastcall MatrixCopy (float *matrixDST, float *matrixSRC) { memcpy (matrixDST, matrixSRC, sizeof(float)*16); } diff --git a/desmume/src/matrix.h b/desmume/src/matrix.h index 03886ca5c..f46852300 100644 --- a/desmume/src/matrix.h +++ b/desmume/src/matrix.h @@ -43,20 +43,19 @@ typedef struct MatrixStack int size; } MatrixStack; +void MatrixInit (float *matrix); #ifdef SSE2 -void FASTCALL MatrixInit (float *matrix); -extern void FASTCALL MatrixMultVec3x3 (const gMatrix matrix, const gMatrix vecPtr); -extern void FASTCALL MatrixMultVec4x4 (const gMatrix matrix, const gMatrix vecPtr); -void FASTCALL MatrixIdentity (float *matrix); -extern void FASTCALL MatrixMultiply (const gMatrix matrix, const gMatrix rightMatrix); -float FASTCALL MatrixGetMultipliedIndex (int index, float *matrix, float *rightMatrix); -void FASTCALL MatrixSet (float *matrix, int x, int y, float value); -void FASTCALL MatrixCopy (const gMatrix matrixDST, const gMatrix matrixSRC); -extern void FASTCALL MatrixTranslate (const gMatrix matrix, const gMatrix ptr); -extern void FASTCALL MatrixScale (const gMatrix matrix, const gMatrix ptr); -void FASTCALL MatrixScale (const gMatrix matrix, const gMatrix ptr); +extern void __fastcall MatrixMultVec3x3 (const gMatrix matrix, const gMatrix vecPtr); +extern void __fastcall MatrixMultVec4x4 (const gMatrix matrix, const gMatrix vecPtr); +void __fastcall MatrixIdentity (float *matrix); +extern void __fastcall MatrixMultiply (const gMatrix matrix, const gMatrix rightMatrix); +float __fastcall MatrixGetMultipliedIndex (int index, float *matrix, float *rightMatrix); +void __fastcall MatrixSet (float *matrix, int x, int y, float value); +void __fastcall MatrixCopy (const gMatrix matrixDST, const gMatrix matrixSRC); +extern void __fastcall MatrixTranslate (float *matrix, float *ptr); +extern void __fastcall MatrixScale (const gMatrix matrix, const gMatrix ptr); +void __fastcall MatrixScale (const gMatrix matrix, const gMatrix ptr); #else -void FASTCALL MatrixInit (float *matrix); void MatrixMultVec3x3 (float *matrix, float *vecPtr); void MatrixMultVec4x4 (float *matrix, float *vecPtr); void MatrixIdentity (float *matrix); diff --git a/desmume/src/matrix_sse2-x86.asm b/desmume/src/matrix_sse2-x86.asm index 5d5d76865..07468f4ef 100644 --- a/desmume/src/matrix_sse2-x86.asm +++ b/desmume/src/matrix_sse2-x86.asm @@ -25,9 +25,6 @@ .code @MatrixMultVec4x4@8 PROC PUBLIC - push ebp - mov ebp, esp - movaps xmm0, XMMWORD PTR [ecx] movaps xmm1, XMMWORD PTR [ecx+16] movaps xmm2, XMMWORD PTR [ecx+32] @@ -46,16 +43,10 @@ addps xmm4, xmm6 addps xmm4, xmm3 movaps XMMWORD PTR [edx], xmm4 - mov esp, ebp - pop ebp ret 0 @MatrixMultVec4x4@8 ENDP -PUBLIC @MatrixMultVec3x3@8 -@MatrixMultVec3x3@8 PROC - push ebp - mov ebp, esp - +@MatrixMultVec3x3@8 PROC PUBLIC movaps xmm0, XMMWORD PTR [ecx] movaps xmm1, XMMWORD PTR [ecx+16] movaps xmm2, XMMWORD PTR [ecx+32] @@ -72,18 +63,10 @@ PUBLIC @MatrixMultVec3x3@8 addps xmm4, xmm5 addps xmm4, xmm6 movaps XMMWORD PTR [edx], xmm4 - mov esp, ebp - pop ebp ret 0 @MatrixMultVec3x3@8 ENDP - -PUBLIC @MatrixMultiply@8 -@MatrixMultiply@8 PROC -; mov eax, DWORD PTR[esp+4] - push ebp - mov ebp, esp - +@MatrixMultiply@8 PROC PUBLIC movaps xmm0, XMMWORD PTR [ecx] movaps xmm1, XMMWORD PTR [ecx+16] movaps xmm2, XMMWORD PTR [ecx+32] @@ -152,16 +135,10 @@ PUBLIC @MatrixMultiply@8 addps xmm4,xmm6 addps xmm4,xmm7 movaps XMMWORD PTR [ecx+48],xmm4 - mov esp, ebp - pop ebp ret 0 @MatrixMultiply@8 ENDP -PUBLIC @MatrixTranslate@8 -@MatrixTranslate@8 PROC - push ebp - mov ebp, esp - +@MatrixTranslate@8 PROC PUBLIC movaps xmm0, XMMWORD PTR [ecx] movaps xmm1, XMMWORD PTR [ecx+16] movaps xmm2, XMMWORD PTR [ecx+32] @@ -180,16 +157,10 @@ PUBLIC @MatrixTranslate@8 addps xmm4, xmm6 addps xmm4, xmm3 movaps XMMWORD PTR [ecx+48], xmm4 - mov esp, ebp - pop ebp ret 0 @MatrixTranslate@8 ENDP -PUBLIC @MatrixScale@8 -@MatrixScale@8 PROC - push ebp - mov ebp, esp - +@MatrixScale@8 PROC PUBLIC movaps xmm0, XMMWORD PTR [ecx] movaps xmm1, XMMWORD PTR [ecx+16] movaps xmm2, XMMWORD PTR [ecx+32] @@ -205,9 +176,6 @@ PUBLIC @MatrixScale@8 movaps XMMWORD PTR [ecx],xmm4 movaps XMMWORD PTR [ecx+16],xmm5 movaps XMMWORD PTR [ecx+32],xmm6 - - mov esp, ebp - pop ebp ret 0 @MatrixScale@8 ENDP diff --git a/desmume/src/windows/OGLRender.c b/desmume/src/windows/OGLRender.c index 6c1213d10..aa8ba6fda 100644 --- a/desmume/src/windows/OGLRender.c +++ b/desmume/src/windows/OGLRender.c @@ -522,14 +522,15 @@ void NDS_glMultMatrix4x4(signed long v) if (txt_slot_current_size<=0)\ {\ txt_slot_current++;\ - adr=ARM9Mem.textureSlotAddr[txt_slot_current];\ + *adr=(unsigned char *)ARM9Mem.textureSlotAddr[txt_slot_current];\ adr-=txt_slot_size;\ - txt_slot_size=(txt_slot_current_size=0x020000);\ + txt_slot_size=txt_slot_current_size=0x020000;\ } +//#define CHECKSLOT ; #define RGB16TO32(col,alpha) (((alpha)<<24) | ((((col) & 0x7C00)>>7)<<16) | ((((col) & 0x3E0)>>2)<<8) | (((col) & 0x1F)<<3)) -static __inline u32 *SetupTexture (unsigned int format, unsigned int palette) +__forceinline void SetupTexture (unsigned int format, unsigned int palette) { unsigned short *pal = NULL; unsigned int mode = (unsigned short)((format>>26)&0x7); @@ -544,7 +545,10 @@ static __inline u32 *SetupTexture (unsigned int format, unsigned int palette) unsigned char * adr = (unsigned char *)(ARM9Mem.textureSlotAddr[txt_slot_current]+((format&0x3FFF)<<3)); //printlog("Format: %04X\n",(format >> 14 & 3)); //printlog("Texture %08X: width=%d, height=%d\n", format, sizeX, sizeY); - + + //printlog("Texture slot: %02X\n",(format >> 14 & 3)); + //printlog("Texture slot offset: %02X\n",(format&0x3FFF)<<3); + switch(mode) { case 1: @@ -591,7 +595,7 @@ static __inline u32 *SetupTexture (unsigned int format, unsigned int palette) break; } } - + //printlog("Texture mode %02i: x=%04d, colors=%04X, index=%04d\n",mode,x,pal[adr[x]],adr[x]); switch(mode) { @@ -641,8 +645,9 @@ static __inline u32 *SetupTexture (unsigned int format, unsigned int palette) dst += 4; CHECKSLOT; } + break; } - break; + case 3: { for(x = 0; x < imageSize; x++) @@ -662,23 +667,24 @@ static __inline u32 *SetupTexture (unsigned int format, unsigned int palette) dst += 4; CHECKSLOT; } + break; } - break; - case 4: //===================== ? + case 4: { //printlog("texture mode 4"); - for(x = 0; x < imageSize; ++x, dst += 4) + for(x = 0; x < imageSize; ++x) { unsigned short c = pal[adr[x]]; dst[0] = (unsigned char)((c & 0x1F)<<3); dst[1] = (unsigned char)((c & 0x3E0)>>2); dst[2] = (unsigned char)((c & 0x7C00)>>7); dst[3] = (adr[x] == 0) ? palZeroTransparent : 255; + dst += 4; CHECKSLOT; } + break; } - break; case 5: { @@ -687,16 +693,16 @@ static __inline u32 *SetupTexture (unsigned int format, unsigned int palette) unsigned int * map = (unsigned int *)adr; unsigned i = 0; unsigned int * dst = (unsigned int *)texMAP; - if ( (format & 0xc000) == 0x8000) // texel are in slot 2 slot1=(const unsigned short*)&ARM9Mem.textureSlotAddr[1][((format&0x3FFF)<<2)+0x010000]; else slot1=(const unsigned short*)&ARM9Mem.textureSlotAddr[1][(format&0x3FFF)<<2]; - for (y = 0; y < (sizeY/4); y ++) + for (y = 0; y < (sizeY>>2); y ++) { - for (x = 0; x < (sizeX/4); x ++, i++) + u32 tmpPos[4]={(y<<2)*sizeX,((y<<2)+1)*sizeX,((y<<2)+2)*sizeX,((y<<2)+3)*sizeX}; + for (x = 0; x < (sizeX>>2); x ++, i++) { u32 currBlock = map[i], sy; u16 pal1 = slot1[i]; @@ -753,36 +759,38 @@ static __inline u32 *SetupTexture (unsigned int format, unsigned int palette) for (sy = 0; sy < 4; sy++) { // Texture offset - u32 currentPos = (x<<2) + ((y<<2) + sy)*sizeX; - u8 currRow = (u8)((currBlock>>(sy*8))&0xFF); + u32 currentPos = (x<<2) + tmpPos[sy]; + u8 currRow = (u8)((currBlock>>(sy<<3))&0xFF); - dst[currentPos+0] = tmp_col[(currRow>>0)&3]; + dst[currentPos] = tmp_col[currRow&3]; dst[currentPos+1] = tmp_col[(currRow>>2)&3]; dst[currentPos+2] = tmp_col[(currRow>>4)&3]; dst[currentPos+3] = tmp_col[(currRow>>6)&3]; + //===================================== + txt_slot_current_size-=4;; + if (txt_slot_current_size<=0) + { + txt_slot_current++; + *map=(unsigned char *)ARM9Mem.textureSlotAddr[txt_slot_current]; + map-=txt_slot_size>>2; + txt_slot_size=txt_slot_current_size=0x020000; + } } } } - txt_slot_current_size-=4;; - if (txt_slot_current_size<=0) - { - txt_slot_current++; - map=ARM9Mem.textureSlotAddr[txt_slot_current]; - map-=txt_slot_size>>2; - txt_slot_size=(txt_slot_current_size=0x020000); - } + break; } case 6: { - for(x = 0; x < imageSize; x++, dst += 4) + for(x = 0; x < imageSize; x++) { - unsigned short c = pal[adr[x]&7]; + unsigned short c = pal[adr[x]&0x07]; dst[0] = (unsigned char)((c & 0x1F)<<3); dst[1] = (unsigned char)((c & 0x3E0)>>2); dst[2] = (unsigned char)((c & 0x7C00)>>7); dst[3] = (adr[x]&0xF8); - if (dst[3]!=0) dst[3]|=0x07; + dst += 4; CHECKSLOT; } break; @@ -790,7 +798,7 @@ static __inline u32 *SetupTexture (unsigned int format, unsigned int palette) case 7: { unsigned short * map = ((unsigned short *)adr); - for(x = 0; x < imageSize; ++x, dst += 4) + for(x = 0; x < imageSize; ++x) { unsigned short c = map[x]; dst[0] = ((c & 0x1F)<<3); @@ -798,19 +806,19 @@ static __inline u32 *SetupTexture (unsigned int format, unsigned int palette) dst[2] = ((c & 0x7C00)>>7); dst[3] = (c>>15)*255; + dst += 4; + txt_slot_current_size-=2;; + if (txt_slot_current_size<=0) + { + txt_slot_current++; + *map=(unsigned char *)ARM9Mem.textureSlotAddr[txt_slot_current]; + map-=txt_slot_size>>1; + txt_slot_size=txt_slot_current_size=0x020000; + } } - txt_slot_current_size-=2;; - if (txt_slot_current_size<=0) - { - txt_slot_current++; - map=ARM9Mem.textureSlotAddr[txt_slot_current]; - map-=txt_slot_size>>1; - txt_slot_size=(txt_slot_current_size=0x020000); - } + break; } - break; } - return texMAP; } void NDS_glBegin(unsigned long v) @@ -823,24 +831,14 @@ void NDS_glBegin(unsigned long v) // Light enable/disable if (lightMask) { - if (lightMask&1) glEnable (GL_LIGHT0); - else glDisable(GL_LIGHT0); - - if (lightMask&2) glEnable (GL_LIGHT1); - else glDisable(GL_LIGHT1); - - if (lightMask&4) glEnable (GL_LIGHT2); - else glDisable(GL_LIGHT2); - - if (lightMask&8) glEnable (GL_LIGHT3); - else glDisable(GL_LIGHT3); - glEnable (GL_LIGHTING); + (lightMask&1)?glEnable (GL_LIGHT0):glDisable(GL_LIGHT0); + (lightMask&2)?glEnable (GL_LIGHT1):glDisable(GL_LIGHT1); + (lightMask&4)?glEnable (GL_LIGHT2):glDisable(GL_LIGHT2); + (lightMask&8)?glEnable (GL_LIGHT3):glDisable(GL_LIGHT3); } else - { glDisable (GL_LIGHTING); - } glDepthFunc (depthFuncMode); @@ -851,9 +849,7 @@ void NDS_glBegin(unsigned long v) glCullFace(map3d_cull[cullingMask>>6]); } else - { glDisable(GL_CULL_FACE); - } // Alpha value, actually not well handled, 0 should be wireframe if (colorAlpha > 0.0f) @@ -878,37 +874,36 @@ void NDS_glBegin(unsigned long v) } // texture environment - if (textureFormat!=0) + //printlog("textureFormat=%i\n",((textureFormat>>26)&0x07)); + if (((textureFormat>>26)&0x07)!=0) { - glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, texEnv[envMode]); + glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, envMode); glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D, oglTextureID); + if (textureFormat != lastTextureFormat || texturePalette != lastTexturePalette) { - u32 *tmp; - sizeX = (1<<(((textureFormat>>20)&0x7)+3)); sizeY = (1<<(((textureFormat>>23)&0x7)+3)); - tmp=SetupTexture (textureFormat, texturePalette); - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, sizeX, sizeY, 0, GL_RGBA, GL_UNSIGNED_BYTE, tmp); + SetupTexture (textureFormat, texturePalette); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, sizeX, sizeY, 0, GL_RGBA, GL_UNSIGNED_BYTE, texMAP); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST); // S Coordinate options - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, (BIT16(textureFormat) ? GL_REPEAT : GL_CLAMP)); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, (BIT16(textureFormat) ? (BIT18(textureFormat)?GL_MIRRORED_REPEAT:GL_REPEAT) : GL_CLAMP)); // T Coordinate options - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, (BIT17(textureFormat) ? GL_REPEAT : GL_CLAMP)); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, (BIT17(textureFormat) ? (BIT18(textureFormat)?GL_MIRRORED_REPEAT:GL_REPEAT) : GL_CLAMP)); lastTextureFormat = textureFormat; lastTexturePalette = texturePalette; texCoordinateTransform = (textureFormat>>30); - invTexWidth = 1.f/((float)sizeX*(1<<4)); - invTexHeight = 1.f/((float)sizeY*(1<<4)); + invTexWidth = 1.0f/((float)sizeX*(1<<4)); + invTexHeight = 1.0f/((float)sizeY*(1<<4)); } - glMatrixMode (GL_TEXTURE); glLoadIdentity (); - glScaled (invTexWidth, invTexHeight, 1.f); + glScaled (invTexWidth, invTexHeight, 1.0f); } else glDisable(GL_TEXTURE_2D); diff --git a/desmume/src/windows/main.c b/desmume/src/windows/main.c index ee649f1fc..0dd86ccdc 100644 --- a/desmume/src/windows/main.c +++ b/desmume/src/windows/main.c @@ -46,6 +46,7 @@ #include "mapview.h" #include "matrixview.h" #include "lightview.h" +#include "textureview.h" #include "ConfigKeys.h" #include "FirmConfig.h" #include "AboutBox.h" @@ -95,7 +96,7 @@ BOOL click = FALSE; BOOL finished = FALSE; BOOL romloaded = FALSE; -BOOL ForceRatio = FALSE; +BOOL ForceRatio = TRUE; float DefaultWidth; float DefaultHeight; float widthTradeOff; @@ -787,6 +788,7 @@ int WINAPI WinMain (HINSTANCE hThisInstance, hwnd = MainWindow.hwnd; menu = LoadMenu(hThisInstance, "MENU_PRINCIPAL"); SetMenu(hwnd, menu); + CheckMenuItem(menu, IDC_FORCERATIO, MF_BYCOMMAND | MF_CHECKED); hdc = GetDC(hwnd); DragAcceptFiles(hwnd, TRUE); @@ -1389,6 +1391,14 @@ LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM if ((PalView = PalView_Init(hAppInst, HWND_DESKTOP)) != NULL) CWindow_Show(PalView); } + return 0; + case IDM_TEX: + { + texview_struct *TexView; + + if ((TexView = TexView_Init(hAppInst, HWND_DESKTOP)) != NULL) + CWindow_Show(TexView); + } return 0; case IDM_TILE: {