📄 mapper105.c
字号:
#include "..\DLL\d_iNES.h"
#include "..\Hardware\h_MMC1.h"
#include <stdio.h>
static struct
{
u32 Counter, MaxCount;
u8 CounterEnabled;
u8 InitState;
u8 FrameNum;
} Mapper;
static void Sync (void)
{
u8 CHRlines = MMC1_GetCHRBankLo();
MMC1_SyncMirror();
MMC1_SyncWRAM();
MP->SetCHR_RAM8(0,0);
switch (Mapper.InitState)
{
case 2: if (CHRlines & 0x08)
MMC1_SyncPRG(0x7,0x8);
else MP->SetPRG_ROM32(0x8,(CHRlines >> 1) & 0x3);
if (CHRlines & 0x10)
{
Mapper.Counter = 0;
Mapper.CounterEnabled = 0;
}
else Mapper.CounterEnabled = 1;
return; break;
case 0: if (CHRlines & 0x10)
Mapper.InitState++; break;
case 1: if (~CHRlines & 0x10)
Mapper.InitState++; break;
}
MP->SetPRG_ROM32(0x8,0);
}
static void __cdecl SaveMI (Ar128 MI)
{
u32_n Counter;
u8 x = 0;
x = MMC1_SaveMI(MI,x);
Counter.l0 = Mapper.Counter;
MI[x++] = Counter.b0;
MI[x++] = Counter.b1;
MI[x++] = Counter.b2;
MI[x++] = Counter.b3;
MI[x++] = (u8)(Mapper.MaxCount >> 24);
MI[x++] = Mapper.CounterEnabled;
MI[x++] = Mapper.InitState;
}
static void __cdecl LoadMI (const Ar128 MI)
{
u32_n Counter;
u8 x = 0;
x = MMC1_LoadMI(MI,x);
Counter.b0 = MI[x++];
Counter.b1 = MI[x++];
Counter.b2 = MI[x++];
Counter.b3 = MI[x++];
Mapper.Counter = Counter.l0;
Mapper.MaxCount = MI[x++] << 24;
Mapper.CounterEnabled = MI[x++];
Mapper.InitState = MI[x++];
Sync();
}
static void __cdecl HBlank (int Scanline,int Byte2001)
{
Mapper.FrameNum++;
if (Scanline)
return;
if (Mapper.CounterEnabled)
{
Mapper.Counter += 29781;
if (!(Mapper.FrameNum % 15))
{
char tmp[32];
u32 SecondsLeft = ((Mapper.MaxCount | 0x20000000) - Mapper.Counter) / 1789773;
sprintf(tmp,"Time left: %02i:%02i",SecondsLeft / 60,SecondsLeft % 60);
Mapper.FrameNum = 0;
MP->StatusOut(tmp);
}
}
if (((Mapper.Counter | (Mapper.MaxCount ^ 0x1E000000)) & 0x3E000000) == 0x3E000000)
{
MP->StatusOut("Time up!");
MP->IRQ();
}
}
static void __cdecl MenuClick (int Command, int Parm1, int Parm2, int Parm3)
{
switch (Command)
{
case 0: switch (Parm1)
{
case 0: Mapper.MaxCount ^= 0x02000000; break;
case 1: Mapper.MaxCount ^= 0x04000000; break;
case 2: Mapper.MaxCount ^= 0x08000000; break;
case 3: Mapper.MaxCount ^= 0x10000000; break;
} break;
}
}
static void __cdecl UnloadMapper (void)
{
iNES_UnloadROM();
MMC1_Destroy();
}
static void __cdecl InitMapper (const PMapperParam _MP, int IsHardReset)
{
MP = _MP;
iNES_InitROM();
if (IsHardReset)
Mapper.MaxCount = 0x04000000;
MP->AddMenuItem(MP->GetMenuRoot(),"Base time: 5:00",-1,-1,-1,-1,MENU_NOCHECK);
MP->AddMenuItem(MP->GetMenuRoot(),"+0:18",0,0,-1,-1,(Mapper.MaxCount & 0x10000000) ? MENU_CHECKED : MENU_UNCHECKED);
MP->AddMenuItem(MP->GetMenuRoot(),"+0:37",0,1,-1,-1,(Mapper.MaxCount & 0x08000000) ? MENU_CHECKED : MENU_UNCHECKED);
MP->AddMenuItem(MP->GetMenuRoot(),"+1:15",0,2,-1,-1,(Mapper.MaxCount & 0x04000000) ? MENU_CHECKED : MENU_UNCHECKED);
MP->AddMenuItem(MP->GetMenuRoot(),"+2:30",0,3,-1,-1,(Mapper.MaxCount & 0x02000000) ? MENU_CHECKED : MENU_UNCHECKED);
Mapper.Counter = 0;
Mapper.CounterEnabled = 0;
Mapper.InitState = 0;
Mapper.FrameNum = 0;
MMC1_Init(Sync);
}
CTMapperInfo MapperInfo_105 =
{
"Nintendo World Championship",
105,
MS_Full,
16384,
InitMapper,
UnloadMapper,
HBlank,
NULL,
SaveMI,
LoadMI,
NULL,
MenuClick
};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -