Files
player/Project/Src/NES/mapper/016.cpp

404 lines
8.7 KiB
C++
Raw Normal View History

2025-06-27 00:32:57 +08:00
#include "nes_mapper.h"
void MAP16_MemoryWrite2(uint32 addr, uint8 data);
// Mapper 16
void MAP16_Reset()
{
// patch = 0;
// if(parent_NES->crc32() == 0x3f15d20d) // Famicom Jump 2 - Saikyou no 7 Nin
// {
// patch = 1;
// }
// if(!patch)
// {
// NES_6502::Context context;
// parent_NES->cpu->GetContext(&context);
// context.mem_page[3] = serial_out;
// parent_NES->cpu->SetContext(&context);
// eeprom_status = 0x00;
// barcode_status = 0x00;
// barcode_enabled = 0;
// //memset(serial_out, eeprom_status | barcode_status, 0x2000);
// serial_out[0] = eeprom_status | barcode_status;
// }
// // set CPU bank pointers
// set_CPU_banks(0,1,num_8k_ROM_banks-2,num_8k_ROM_banks-1);
MAPx->regs[0] = 0;
MAPx->regs[1] = 0;
MAPx->regs[2] = 0;
MAPx->irq_enabled = 0;
MAPx->irq_counter = 0;
MAPx->irq_latch = 0;
}
void MAP16_MemoryWrite(uint16 addr, uint8 data)
{
// if(patch)
// {
// MemoryWrite3(addr, data);
// }
// else
{
MAP16_MemoryWrite2(addr, data);
}
}
void MAP16_HSync(int scanline)
{
// if(barcode_enabled)
// {
// if(barcode_phase == 0)
// {
// barcode_status = 0x08;
// if(++barcode_wait > 600)
// {
// barcode_wait = 0;
// barcode_phase = 1;
// }
// serial_out[0] = eeprom_status | barcode_status;
// }
// else if(barcode_phase == 2)
// {
// barcode_status = 0x08;
// if(++barcode_wait > 600)
// {
// barcode_status = 0x00;
// barcode_enabled = 0;
// }
// serial_out[0] = eeprom_status | barcode_status;
// }
// }
if(MAPx->irq_enabled)
{
if(MAPx->irq_counter <= 114)
{
CPU_IRQ;
MAPx->irq_counter = 0;
MAPx->irq_enabled = 0;
}
else
{
MAPx->irq_counter -= 114;
}
}
}
void MAP16_MemoryWrite2(uint32 addr, uint8 data)
{
switch(addr & 0x000F)
{
case 0x0000:
{
set_PPU_bank0(data);
}
break;
case 0x0001:
{
set_PPU_bank1(data);
}
break;
case 0x0002:
{
set_PPU_bank2(data);
}
break;
case 0x0003:
{
set_PPU_bank3(data);
}
break;
case 0x0004:
{
set_PPU_bank4(data);
}
break;
case 0x0005:
{
set_PPU_bank5(data);
}
break;
case 0x0006:
{
set_PPU_bank6(data);
}
break;
case 0x0007:
{
set_PPU_bank7(data);
}
break;
case 0x0008:
{
set_CPU_bank4(data*2+0);
set_CPU_bank5(data*2+1);
}
break;
case 0x0009:
{
data &= 0x03;
if(data == 0)
{
set_mirroring(0,1,0,1);//<2F><>ֱ<EFBFBD><D6B1><EFBFBD><EFBFBD>InfoNES_Mirroring( 1 ); //0101
//set_mirroring(NES_PPU::MIRROR_VERT);
}
else if(data == 1)
{
set_mirroring(0,0,1,1);//ˮƽ<CBAE><C6BD><EFBFBD><EFBFBD>InfoNES_Mirroring( 0 ); //0011
//set_mirroring(NES_PPU::MIRROR_HORIZ);
}
else if(data == 2)
{
set_mirroring(0,0,0,0);
}
else
{
set_mirroring(1,1,1,1);
}
}
break;
case 0x000A:
{
MAPx->irq_enabled = data & 0x01;
MAPx->irq_counter = MAPx->irq_latch;
}
break;
case 0x000B:
{
MAPx->irq_latch = (MAPx->irq_latch & 0xFF00) | data;
}
break;
case 0x000C:
{
MAPx->irq_latch = ((uint32)data << 8) | (MAPx->irq_latch & 0x00FF);
}
break;
case 0x000D:
// {
// if(data == 0x80)
// {
// // reset
// eeprom_addr = 0x00;
// eeprom_mode = 0x00;
// eeprom_wbit = 0x00;
// eeprom_rbit = 0x00;
// }
// else if(eeprom_cmd[3] == 0x00 && eeprom_cmd[2] == 0x20 &&
// eeprom_cmd[1] == 0x60 && eeprom_cmd[0] == 0x40 && data == 0x00)
// {
// // reset ?
// }
// else if(eeprom_cmd[3] == 0x00 && eeprom_cmd[2] == 0x40 &&
// eeprom_cmd[1] == 0x60 && eeprom_cmd[0] == 0x20 && data == 0x00)
// {
// // start
// eeprom_wbit = 0x01;
// eeprom_rbit = 0x01;
// eeprom_data = 0;
// eeprom_mode = 0;
// }
// else if (eeprom_cmd[0] == 0x60 && data == 0xE0)
// {
// if(!eeprom_mode)
// {
// // sync
// eeprom_wbit = 0x01;
// eeprom_rbit = 0x01;
// eeprom_data = 0;
// eeprom_mode = 1;
// eeprom_status = 0x00;
// //memset(serial_out, eeprom_status | barcode_status, 0x2000);
// serial_out[0] = eeprom_status | barcode_status;
// }
// else
// {
// // read
// eeprom_data = parent_NES->ReadSaveRAM(eeprom_addr);
// if(eeprom_data & eeprom_rbit)
// {
// eeprom_status = 0x10;
// //memset(serial_out, eeprom_status | barcode_status, 0x2000);
// serial_out[0] = eeprom_status | barcode_status;
// }
// else
// {
// eeprom_status = 0x00;
// //memset(serial_out, eeprom_status | barcode_status, 0x2000);
// serial_out[0] = eeprom_status | barcode_status;
// }
// eeprom_rbit <<= 1;
// eeprom_wbit = 0x00;
// }
// }
// else if(eeprom_cmd[1] == 0x00 && eeprom_cmd[0] == 0x20 && data == 0x00)
// {
// // write 0
// eeprom_data &= 0xFF - eeprom_wbit;
// if(eeprom_wbit == 0x80)
// {
// if(eeprom_mode)
// {
// parent_NES->WriteSaveRAM(eeprom_addr, eeprom_data);
// }
// else
// {
// eeprom_addr = eeprom_data & 0x7F;
// }
// eeprom_wbit = 0x00;
// }
// else
// {
// eeprom_wbit <<= 1;
// }
// eeprom_rbit = 0x00;
// }
// else if(eeprom_cmd[3] == 0x00 && eeprom_cmd[2] == 0x40 &&
// eeprom_cmd[1] == 0x60 && eeprom_cmd[0] == 0x40 && data == 0x00)
// {
// // write 1
// eeprom_data |= eeprom_wbit;
// if(eeprom_wbit == 0x80)
// {
// if(eeprom_mode)
// {
// parent_NES->WriteSaveRAM(eeprom_addr, eeprom_data);
// }
// else
// {
// eeprom_addr = eeprom_data & 0x7F;
// }
// eeprom_wbit = 0x00;
// }
// else
// {
// eeprom_wbit <<= 1;
// }
// eeprom_rbit = 0x00;
// }
// eeprom_cmd[3] = eeprom_cmd[2];
// eeprom_cmd[2] = eeprom_cmd[1];
// eeprom_cmd[1] = eeprom_cmd[0];
// eeprom_cmd[0] = data;
// }
break;
}
}
void MAP16_MemoryWrite3(uint32 addr, uint8 data)
{
switch(addr)
{
case 0x8000:
case 0x8001:
case 0x8002:
case 0x8003:
{
MAPx->regs[0] = data & 0x01;
set_CPU_bank4(MAPx->regs[0]*0x20+MAPx->regs[2]*2+0);
set_CPU_bank5(MAPx->regs[0]*0x20+MAPx->regs[2]*2+1);
}
break;
case 0x8004:
case 0x8005:
case 0x8006:
case 0x8007:
{
MAPx->regs[1] = data & 0x01;
set_CPU_bank6(MAPx->regs[1]*0x20+0x1E);
set_CPU_bank7(MAPx->regs[1]*0x20+0x1F);
}
break;
case 0x8008:
{
MAPx->regs[2] = data;
set_CPU_bank4(MAPx->regs[0]*0x20+MAPx->regs[2]*2+0);
set_CPU_bank5(MAPx->regs[0]*0x20+MAPx->regs[2]*2+1);
set_CPU_bank6(MAPx->regs[1]*0x20+0x1E);
set_CPU_bank7(MAPx->regs[1]*0x20+0x1F);
}
break;
case 0x8009:
{
data &= 0x03;
if(data == 0)
{
set_mirroring(0,1,0,1);//<2F><>ֱ<EFBFBD><D6B1><EFBFBD><EFBFBD>InfoNES_Mirroring( 1 ); //0101
//set_mirroring(NES_PPU::MIRROR_VERT);
}
else if(data == 1)
{
set_mirroring(0,0,1,1);//ˮƽ<CBAE><C6BD><EFBFBD><EFBFBD>InfoNES_Mirroring( 0 ); //0011
//set_mirroring(NES_PPU::MIRROR_HORIZ);
}
else if(data == 2)
{
set_mirroring(0,0,0,0);
}
else
{
set_mirroring(1,1,1,1);
}
}
break;
case 0x800A:
{
MAPx->irq_enabled = data & 0x01;
MAPx->irq_counter = MAPx->irq_latch;
}
break;
case 0x800B:
{
MAPx->irq_latch = (MAPx->irq_latch & 0xFF00) | data;
}
break;
case 0x800C:
{
MAPx->irq_latch = ((uint32)data << 8) | (MAPx->irq_latch & 0x00FF);
}
break;
case 0x800D:
{
//write protect
}
break;
}
}
void MAP16_Init()
{
NES_Mapper->Reset = MAP16_Reset;
NES_Mapper->Write = MAP16_MemoryWrite;
NES_Mapper->HSync = MAP16_HSync;
}