GPU.H - Added a fix for he framebuffer not displaying on the sub screen (not working atm)

MMU.C - Added some more VRAM modes
MMU.C - Added variable used to determine which screen to draw the framebuffer too
This commit is contained in:
normmatt234 2007-01-13 06:04:58 +00:00
parent d04010b342
commit 50fe91ad05
3 changed files with 148 additions and 34 deletions

View File

@ -433,6 +433,8 @@ static INLINE void GPU_ligne(Screen * screen, u16 l)
u32 c; u32 c;
u8 n,p; u8 n,p;
u8 *dest;
/* initialize the scanline black */ /* initialize the scanline black */
/* not doing this causes invalid colors when all active BGs are prevented to draw at some place */ /* not doing this causes invalid colors when all active BGs are prevented to draw at some place */
memset(dst,0,256*2) ; memset(dst,0,256*2) ;
@ -449,10 +451,11 @@ static INLINE void GPU_ligne(Screen * screen, u16 l)
case 2: // Display framebuffer case 2: // Display framebuffer
{ {
//addition from Normatt //addition from Normatt
if (gpu->core==0)
{
/* we only draw one of the VRAM blocks */ /* we only draw one of the VRAM blocks */
vram_bank = gpu->dispCnt.bits.VRAM_Block ; vram_bank = gpu->dispCnt.bits.VRAM_Block ;
if(!(MMU.vScreen&1)) dest = mdst; else dest = dst;
switch (MMU.vram_mode[vram_bank]) switch (MMU.vram_mode[vram_bank])
{ {
case 0: case 0:
@ -464,15 +467,16 @@ static INLINE void GPU_ligne(Screen * screen, u16 l)
for (i=0; i<(256 * 2); i+=2) for (i=0; i<(256 * 2); i+=2)
{ {
u8 * vram = ARM9Mem.ARM9_ABG + MMU.vram_mode[vram_bank] * 0x20000; u8 * vram = ARM9Mem.ARM9_ABG + MMU.vram_mode[vram_bank] * 0x20000;
T2WriteWord(mdst, i, T1ReadWord(vram, ii)); T2WriteWord(dest, i, T1ReadWord(vram, ii));
ii+=2; ii+=2;
} }
return; return;
} }
break;
default: default:
break; break;
} }
}
} }
return; return;
case 3: case 3:

View File

@ -347,35 +347,78 @@ void MMU_VRAMWriteBackToLCD(u8 block)
u8 VRAMBankCnt = MMU_read8(ARMCPU_ARM9,REG_VRAMCNTA+block) ; u8 VRAMBankCnt = MMU_read8(ARMCPU_ARM9,REG_VRAMCNTA+block) ;
switch (block) switch (block)
{ {
case 0: case 0: // Bank A
destination = ARM9Mem.ARM9_LCD ; destination = ARM9Mem.ARM9_LCD ;
size = 0x20000 ; size = 0x20000 ;
break ; break ;
case 1: case 1: // Bank B
destination = ARM9Mem.ARM9_LCD + 0x20000 ; destination = ARM9Mem.ARM9_LCD + 0x20000 ;
size = 0x20000 ; size = 0x20000 ;
break ; break ;
case 2: case 2: // Bank C
destination = ARM9Mem.ARM9_LCD + 0x40000 ; destination = ARM9Mem.ARM9_LCD + 0x40000 ;
size = 0x20000 ; size = 0x20000 ;
break ; break ;
case 3: case 3: // Bank D
destination = ARM9Mem.ARM9_LCD + 0x60000 ; destination = ARM9Mem.ARM9_LCD + 0x60000 ;
size = 0x20000 ; size = 0x20000 ;
break ; break ;
case 4: // Bank E
destination = ARM9Mem.ARM9_LCD + 0x80000 ;
size = 0x10000 ;
break ;
case 5: // Bank F
destination = ARM9Mem.ARM9_LCD + 0x90000 ;
size = 0x4000 ;
break ;
case 6: // Bank G
destination = ARM9Mem.ARM9_LCD + 0x94000 ;
size = 0x4000 ;
break ;
case 8: // Bank H
destination = ARM9Mem.ARM9_LCD + 0x98000 ;
size = 0x8000 ;
break ;
case 9: // Bank I
destination = ARM9Mem.ARM9_LCD + 0xA0000 ;
size = 0x4000 ;
break ;
default: default:
return ; return ;
} }
switch (VRAMBankCnt & 7) { switch (VRAMBankCnt & 7) {
case 0: case 0:
/* vram is allready stored at LCD, we dont need to write it back */ /* vram is allready stored at LCD, we dont need to write it back */
return ; MMU.vScreen = 1;
break ;
case 1: case 1:
if (block < 4) switch(block){
{ case 0:
/* banks are in use for BG at ABG + ofs * 0x20000 */ case 1:
source = ARM9Mem.ARM9_ABG + ((VRAMBankCnt >> 3) & 3) * 0x20000 ; case 2:
} else return ; 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 ; break ;
case 2: case 2:
if (block < 2) if (block < 2)
@ -385,11 +428,17 @@ void MMU_VRAMWriteBackToLCD(u8 block)
} else return ; } else return ;
break ; break ;
case 4: case 4:
if (block==2) switch(block){
{ case 2:
/* bank C is in use at BBG */ /* bank C is in use at BBG */
source = ARM9Mem.ARM9_BBG ; source = ARM9Mem.ARM9_BBG ;
} else return ; break ;
case 3:
/* bank D is in use at BOBJ */
source = ARM9Mem.ARM9_BOBJ ;
break ;
default: return ;
}
break ; break ;
default: default:
return ; return ;
@ -406,29 +455,50 @@ void MMU_VRAMReloadFromLCD(u8 block,u8 VRAMBankCnt)
u32 size = 0; u32 size = 0;
switch (block) switch (block)
{ {
case 0: case 0: // Bank A
source = ARM9Mem.ARM9_LCD ; source = ARM9Mem.ARM9_LCD ;
size = 0x20000 ; size = 0x20000 ;
break ; break ;
case 1: case 1: // Bank B
source = ARM9Mem.ARM9_LCD + 0x20000 ; source = ARM9Mem.ARM9_LCD + 0x20000 ;
size = 0x20000 ; size = 0x20000 ;
break ; break ;
case 2: case 2: // Bank C
source = ARM9Mem.ARM9_LCD + 0x40000 ; source = ARM9Mem.ARM9_LCD + 0x40000 ;
size = 0x20000 ; size = 0x20000 ;
break ; break ;
case 3: case 3: // Bank D
source = ARM9Mem.ARM9_LCD + 0x60000 ; source = ARM9Mem.ARM9_LCD + 0x60000 ;
size = 0x20000 ; size = 0x20000 ;
break ; break ;
case 4: // Bank E
source = ARM9Mem.ARM9_LCD + 0x80000 ;
size = 0x10000 ;
break ;
case 5: // Bank F
source = ARM9Mem.ARM9_LCD + 0x90000 ;
size = 0x4000 ;
break ;
case 6: // Bank G
source = ARM9Mem.ARM9_LCD + 0x94000 ;
size = 0x4000 ;
break ;
case 8: // Bank H
source = ARM9Mem.ARM9_LCD + 0x98000 ;
size = 0x8000 ;
break ;
case 9: // Bank I
source = ARM9Mem.ARM9_LCD + 0xA0000 ;
size = 0x4000 ;
break ;
default: default:
return ; return ;
} }
switch (VRAMBankCnt & 7) { switch (VRAMBankCnt & 7) {
case 0: case 0:
/* vram is allready stored at LCD, we dont need to write it back */ /* vram is allready stored at LCD, we dont need to write it back */
return ; MMU.vScreen = 1;
break ;
case 1: case 1:
if (block < 4) if (block < 4)
{ {
@ -437,18 +507,46 @@ void MMU_VRAMReloadFromLCD(u8 block,u8 VRAMBankCnt)
} else return ; } else return ;
break ; break ;
case 2: case 2:
if (block < 2) switch(block){
{ case 0:
/* banks A,B are in use for OBJ at AOBJ + ofs * 0x20000 */ case 1:
destination = ARM9Mem.ARM9_AOBJ + ((VRAMBankCnt >> 3) & 1) * 0x20000 ; case 2:
} else return ; 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 ; break ;
case 4: case 4:
if (block==2) switch(block){
{ case 2:
/* bank C is in use at BBG */ /* bank C is in use at BBG */
destination = ARM9Mem.ARM9_BBG ; destination = ARM9Mem.ARM9_BBG ;
} else return ; break ;
case 3:
/* bank D is in use at BOBJ */
destination = ARM9Mem.ARM9_BOBJ ;
break ;
default: return ;
}
break ; break ;
default: default:
return ; return ;
@ -779,6 +877,7 @@ void FASTCALL MMU_write8(u32 proc, u32 adr, u8 val)
case REG_VRAMCNTE : case REG_VRAMCNTE :
if(proc == ARMCPU_ARM9) if(proc == ARMCPU_ARM9)
{ {
MMU_VRAMWriteBackToLCD(REG_VRAMCNTE) ;
if((val & 7) == 5) if((val & 7) == 5)
{ {
ARM9Mem.ExtPal[0][0] = ARM9Mem.ARM9_LCD + 0x80000; ARM9Mem.ExtPal[0][0] = ARM9Mem.ARM9_LCD + 0x80000;
@ -800,6 +899,8 @@ void FASTCALL MMU_write8(u32 proc, u32 adr, u8 val)
ARM9Mem.ExtPal[0][2] = ARM9Mem.ARM9_LCD + 0x84000; ARM9Mem.ExtPal[0][2] = ARM9Mem.ARM9_LCD + 0x84000;
ARM9Mem.ExtPal[0][3] = ARM9Mem.ARM9_LCD + 0x86000; ARM9Mem.ExtPal[0][3] = ARM9Mem.ARM9_LCD + 0x86000;
} }
MMU_VRAMReloadFromLCD(adr-REG_VRAMCNTE,val) ;
} }
break; break;
@ -889,6 +990,8 @@ void FASTCALL MMU_write8(u32 proc, u32 adr, u8 val)
case REG_VRAMCNTH : case REG_VRAMCNTH :
if(proc == ARMCPU_ARM9) if(proc == ARMCPU_ARM9)
{ {
MMU_VRAMWriteBackToLCD(REG_VRAMCNTH) ;
if((val & 7) == 2) if((val & 7) == 2)
{ {
ARM9Mem.ExtPal[1][0] = ARM9Mem.ARM9_LCD + 0x98000; ARM9Mem.ExtPal[1][0] = ARM9Mem.ARM9_LCD + 0x98000;
@ -896,17 +999,23 @@ void FASTCALL MMU_write8(u32 proc, u32 adr, u8 val)
ARM9Mem.ExtPal[1][2] = ARM9Mem.ARM9_LCD + 0x9C000; ARM9Mem.ExtPal[1][2] = ARM9Mem.ARM9_LCD + 0x9C000;
ARM9Mem.ExtPal[1][3] = ARM9Mem.ARM9_LCD + 0x9E000; ARM9Mem.ExtPal[1][3] = ARM9Mem.ARM9_LCD + 0x9E000;
} }
MMU_VRAMReloadFromLCD(adr-REG_VRAMCNTH,val) ;
} }
break; break;
case REG_VRAMCNTI : case REG_VRAMCNTI :
if(proc == ARMCPU_ARM9) if(proc == ARMCPU_ARM9)
{ {
MMU_VRAMWriteBackToLCD(REG_VRAMCNTI) ;
if((val & 7) == 3) if((val & 7) == 3)
{ {
ARM9Mem.ObjExtPal[1][0] = ARM9Mem.ARM9_LCD + 0xA0000; ARM9Mem.ObjExtPal[1][0] = ARM9Mem.ARM9_LCD + 0xA0000;
ARM9Mem.ObjExtPal[1][1] = ARM9Mem.ARM9_LCD + 0xA2000; ARM9Mem.ObjExtPal[1][1] = ARM9Mem.ARM9_LCD + 0xA2000;
} }
MMU_VRAMReloadFromLCD(adr-REG_VRAMCNTI,val) ;
} }
break; break;
case REG_DISPA_WIN0H: case REG_DISPA_WIN0H:

View File

@ -52,6 +52,7 @@ typedef struct {
u8 ARM7_WIRAM[0x10000]; u8 ARM7_WIRAM[0x10000];
u8 vram_mode[9]; u8 vram_mode[9];
u8 vScreen;
//Shared ram //Shared ram
u8 SWIRAM[0x8000]; u8 SWIRAM[0x8000];