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

159 lines
4.8 KiB
C++

//////////////////////////////////////////////////////////////////////////
// Mapper169 //
//////////////////////////////////////////////////////////////////////////
#include "DirectInput.h"
#include "VirtuaNESres.h"
#include "App.h"
class Mapper169 : public Mapper
{
public:
Mapper169( NES* parent ) : Mapper(parent) {}
void Reset();
BYTE ReadLow ( WORD addr );
void WriteLow( WORD addr, BYTE data );
void Write( WORD addr, BYTE data );
void PPU_Latch( WORD addr );
void PPU_ExtLatchX( INT x );
void PPU_ExtLatch( WORD ntbladr, BYTE& chr_l, BYTE& chr_h, BYTE& attr );
BYTE PPU_ExtLatchSP();
//for FDC code by fanoble
void FdcHardReset(void);
void FdcSoftReset(void);
static void FdcNop(Mapper169* thiz);
static void FdcReadTrack(Mapper169* thiz);
static void FdcSpecify(Mapper169* thiz);
static void FdcSenseDriveStatus(Mapper169* thiz);
static void FdcWriteData(Mapper169* thiz);
static void FdcReadData(Mapper169* thiz);
static void FdcRecalibrate(Mapper169* thiz);
static void FdcSenseIntStatus(Mapper169* thiz);
static void FdcWriteDeletedData(Mapper169* thiz);
static void FdcReadID(Mapper169* thiz);
static void FdcReadDeletedData(Mapper169* thiz);
static void FdcFormatTrack(Mapper169* thiz);
static void FdcSeek(Mapper169* thiz);
static void FdcScanEqual(Mapper169* thiz);
static void FdcScanLowOrEqual(Mapper169* thiz);
static void FdcScanHighOrEqual(Mapper169* thiz);
typedef struct tagFDC_CMD_DESC
{
BYTE bWLength;
BYTE bRLength;
void (*pFun)(Mapper169*);
} FDC_CMD_DESC;
protected:
BYTE YX_type, reg[8];
BYTE a3;
INT key_map_row;
BYTE cmd_4800_6,cmd_4800_7,cmd_4800_8;
BYTE cmd_5500_3,cmd_5500_8;
BYTE cmd_5501_8;
BYTE MMC3_mode,MMC3_reg,MMC3_prg0,MMC3_prg1;
BYTE MMC3_chr4,MMC3_chr5,MMC3_chr6,MMC3_chr7;
INT read_mode,read_mode1;
private:
void SetBank_CPU();
void WriteCPU_PRAM( WORD addr, BYTE data );
void MMC3_WriteH( WORD addr, BYTE data );
void MMC3_SetBank_CPU();
void MMC3_SetBank_PPU();
LPBYTE Load_DiskIMG();
LPBYTE lpDisk, DISK;
//for FDC code by fanoble
#define FDC_MS_BUSYS0 0x01 // FDD0 in SEEK mode
#define FDC_MS_BUSYS1 0x02 // FDD1 in SEEK mode
#define FDC_MS_BUSYS2 0x04 // FDD2 in SEEK mode
#define FDC_MS_BUSYS3 0x08 // FDD3 in SEEK mode
#define FDC_MS_BUSYRW 0x10 // Read or Write in progress
#define FDC_MS_EXECUTION 0x20 // Execution Mode
#define FDC_MS_DATA_IN 0x40 // Data input or output
#define FDC_MS_RQM 0x80 // Request for Master, Ready
#define FDC_S0_US0 0x01 // Unit Select 0
#define FDC_S0_US1 0x02 // Unit Select 1
#define FDC_S0_HD 0x04 // Head Address
#define FDC_S0_NR 0x08 // Not Ready
#define FDC_S0_EC 0x10 // Equipment Check
#define FDC_S0_SE 0x20 // Seek End
#define FDC_S0_IC0 0x40 // Interrupt Code
#define FDC_S0_IC1 0x80 // NT/AT/IC/XX
#define FDC_S1_MA 0x01 // Missing Address Mark
#define FDC_S1_NW 0x02 // Not Writable
#define FDC_S1_ND 0x04 // No Data
#define FDC_S1_OR 0x10 // Over Run
#define FDC_S1_DE 0x20 // Data Error
#define FDC_S1_EN 0x80 // End of Cylinder
#define FDC_S2_MD 0x01 // Missing Address Mark in Data Field
#define FDC_S2_BC 0x02 // Bad Cylinder
#define FDC_S2_SN 0x04 // Scan Not Satisfied
#define FDC_S2_SH 0x08 // Scan Equal Hit
#define FDC_S2_WC 0x10 // Wrong Cylinder
#define FDC_S2_DD 0x20 // Data Error in Data Field
#define FDC_S2_CM 0x40 // Control Mark
#define FDC_S3_US0 0x01 // Unit Select 0
#define FDC_S3_US1 0x02 // Unit Select 1
#define FDC_S3_HD 0x04 // Side Select
#define FDC_S3_TS 0x08 // Two Side
#define FDC_S3_T0 0x10 // Track 0
#define FDC_S3_RY 0x20 // Ready
#define FDC_S3_WP 0x40 // Write Protect
#define FDC_S3_FT 0x80 // Fault
#define FDC_CC_MASK 0x1F
#define FDC_CF_MT 0x80
#define FDC_CF_MF 0x40
#define FDC_CF_SK 0x20
#define FDC_CC_READ_TRACK 0x02
#define FDC_CC_SPECIFY 0x03
#define FDC_CC_SENSE_DRIVE_STATUS 0x04
#define FDC_CC_WRITE_DATA 0x05
#define FDC_CC_READ_DATA 0x06
#define FDC_CC_RECALIBRATE 0x07
#define FDC_CC_SENSE_INTERRUPT_STATUS 0x08
#define FDC_CC_WRITE_DELETED_DATA 0x09
#define FDC_CC_READ_ID 0x0A
#define FDC_CC_READ_DELETED_DATA 0x0C
#define FDC_CC_FORMAT_TRACK 0x0D
#define FDC_CC_SEEK 0x0F
#define FDC_CC_SCAN_EQUAL 0x11
#define FDC_CC_SCAN_LOW_OR_EQUAL 0x19
#define FDC_CC_SCAN_HIGH_OR_EQUAL 0x1D
#define FDC_PH_IDLE 0
#define FDC_PH_COMMAND 1
#define FDC_PH_EXECUTION 2
#define FDC_PH_RESULT 3
const FDC_CMD_DESC* pFdcCmd;
BOOL bFdcIrq;
BOOL bFdcHwReset;
BOOL bFdcSoftReset;
BOOL bFdcDmaInt;
UINT nFdcDrvSel;
UINT nFdcMotor;
BYTE nFdcMainStatus;
BYTE nFDCStatus[4];
BYTE bFdcCycle;
BYTE bFdcCommands[10];
BYTE bFdcResults[8];
BYTE bFdcPhase;
BYTE nFdcCylinder;
BYTE nFdcHeadAddres;
BYTE nFdcRecord;
BYTE nFdcNumber;
LPBYTE pFdcDataPtr;
};