AxibugEmuOnline/References/VirtuaNESex_src_191105/NES/Mapper/Mapper173.cpp
2024-08-05 17:58:53 +08:00

217 lines
4.0 KiB
C++

//////////////////////////////////////////////////////////////////////////
// Mapper173 Subor //
//////////////////////////////////////////////////////////////////////////
void Mapper173::Reset()
{
// nes->ppu->SetExtLatchMode( TRUE );
for(INT i=0;i<11;i++) reg[i] = 0x00;
irq_enable = irq_repeat = 0;
irq_counter = irq_latch = 0;
irq_occur = 0;
SetPROM_32K_Bank(0);
nes->SetVideoMode( 2 );
}
BYTE Mapper173::ExRead ( WORD addr )
{
DEBUGOUT( "ExRead - addr= %04x\n", addr );
return 0x00;
switch (addr) {
case 0x4026:
//
break;
case 0x4033:
//D7:
//D6:
//D5:
//D4:
//D3:
//D2:
//D1:
//D0:
//
break;
case 0x4204: //FDC主状态寄存器(STATUS)
//
break;
case 0x4205: //FDC数据寄存器(DATA)(读???)
//
break;
}
}
void Mapper173::ExWrite( WORD addr, BYTE data )
{
DEBUGOUT( "ExWrite - addr= %04x ; dat= %03x\n", addr, data );
switch (addr) {
case 0x4020:
reg[0] = data;
break;
case 0x4022:
reg[1] = data;
break;
case 0x4023:
reg[2] = data;
break;
case 0x4026:
reg[3] = data;
break;
case 0x4031:
reg[4] = data;
break;
case 0x4032:
reg[5] = data;
irq_repeat = data & 0x01;
irq_enable = data & 0x02;
irq_occur = 0;
if( irq_enable ) {
irq_counter = irq_latch;
} else {
nes->cpu->ClrIRQ( IRQ_MAPPER );
}
break;
case 0x4034:
reg[6] = data;
irq_latch = (irq_latch&0xFF00)|data;
break;
case 0x4035:
reg[7] = data;
irq_latch = (irq_latch&0x00FF)|((WORD)data<<8);
break;
case 0x4040:
SetPROM_4K_Bank(0x8000, data&0x7F);
break;
case 0x4041:
SetPROM_4K_Bank(0x9000, data&0x7F);
break;
case 0x4042:
SetPROM_4K_Bank(0xa000, data&0x7F);
break;
case 0x4043:
SetPROM_4K_Bank(0xb000, data&0x7F);
break;
case 0x4044:
SetPROM_4K_Bank(0xc000, data&0x7F);
break;
case 0x4045:
SetPROM_4K_Bank(0xd000, data&0x7F);
break;
case 0x4046:
SetPROM_4K_Bank(0xe000, data&0x7F);
break;
case 0x4047:
SetPROM_4K_Bank(0xf000, data&0x7F);
break;
case 0x4205: //FDC数据寄存器(DATA)(写???)
//
break;
}
}
BYTE Mapper173::ReadLow( WORD addr )
{
// DEBUGOUT( "ReadLow - addr= %04x\n", addr );
return CPU_MEM_BANK[addr>>13][addr&0x1FFF];
}
void Mapper173::WriteLow(WORD addr, BYTE data)
{
// DEBUGOUT( "WriteLow - addr= %04x ; dat= %03x\n", addr, data );
CPU_MEM_BANK[addr>>13][addr&0x1FFF] = data;
}
void Mapper173::Write(WORD addr, BYTE data)
{
// DEBUGOUT( "Write - addr= %04x ; dat= %03x\n", addr, data );
}
void Mapper173::HSync(int scanline)
{
// if( (scanline >= 0 && scanline <= 239) ) {
// if( nes->ppu->IsDispON() ) {
// if( irq_enable ) {
// irq_enable = 0;
/// nes->cpu->SetIRQ( IRQ_MAPPER );
// }
// }
// }
}
void Mapper173::Clock( INT cycles )
{
if( irq_enable ) {
irq_counter -= cycles;
if( irq_counter <= 0 ) {
//// irq_counter &= 0xFFFF;
irq_counter += irq_latch;
if( !irq_occur ) {
irq_occur = 0xFF;
if( !irq_repeat ) {
irq_enable = 0;
}
nes->cpu->SetIRQ( IRQ_MAPPER );
}
}
}
}
void Mapper173::PPU_Latch( WORD addr )
{
//
}
void Mapper173::PPU_ExtLatch( WORD ntbladr, BYTE& chr_l, BYTE& chr_h, BYTE& attr )
{
INT loopy_v = nes->ppu->GetPPUADDR();
INT loopy_y = nes->ppu->GetTILEY();
INT tileofs = (PPUREG[0]&PPU_BGTBL_BIT)<<8;
INT attradr = 0x23C0+(loopy_v&0x0C00)+((loopy_v&0x0380)>>4);
INT attrsft = (ntbladr&0x0040)>>4;
LPBYTE pNTBL = PPU_MEM_BANK[ntbladr>>10];
INT ntbl_x = ntbladr&0x001F;
INT tileadr, ntb;
ntb = (ntbladr>>10)&3;
if(ntb==2)
tileofs |= 0x1000;
// else if(ntb && PPU_SW)
tileofs |= 0x1000;
// else
tileofs |= 0x0000;
attradr &= 0x3FF;
attr = ((pNTBL[attradr+(ntbl_x>>2)]>>((ntbl_x&2)+attrsft))&3)<<2;
tileadr = tileofs+pNTBL[ntbladr&0x03FF]*0x10+loopy_y;
chr_l = PPU_MEM_BANK[tileadr>>10][ tileadr&0x03FF ];
chr_h = PPU_MEM_BANK[tileadr>>10][(tileadr&0x03FF)+8];
}
void Mapper173::SaveState( LPBYTE p )
{
//
}
void Mapper173::LoadState( LPBYTE p )
{
//
}