www.pudn.com > NESgameReader.rar > MainForm.cpp


//--------------------------------------------------------------------------- 
 
#include  
#pragma hdrstop 
#include "MainForm.h" 
#include "PrnPort.h" 
#include "time.h" 
#include  
#include  
//--------------------------------------------------------------------------- 
#pragma package(smart_init) 
#pragma resource "*.dfm" 
TForm1 *Form1; 
 
//status 
#define		mcuready 	0x80; 	//s7 = ~BUSY 
#define     	mcuack      	0x40; 	//s6 = ACK 
 
// conctrol 
#define    	pcready   	0x02;   //c1 = ~AutoLF 
#define         pcack     	0x08;   //c3 = ~SelectIn 
#define         power      	0x04;   //c2 = Init 
 
void set_pcready(void); 
void clear_pcready(void); 
void set_pcack(void); 
void clear_pcack(void); 
 
void mcu_power_on(void); 
void mcu_power_off(void); 
void mcu_reset(void); 
void delay(int ms); 
 
bool check_mcuack(void); 
bool check_mcuready(void); 
 
void set_pc_output_data(void); 
void set_pc_input_data(void); 
 
void writeData(unsigned char data); 
unsigned char readData(void); 
 
unsigned char pc_conctrol,pc_conctrol1; 
unsigned char mcu_status,mcu_status1; 
unsigned char output_data,input_data; 
unsigned char file_temp[0x200000]; 
long int counter=0; 
 
FILE *outfile; 
 
//--------------------------------------------------------------------------- 
__fastcall TForm1::TForm1(TComponent* Owner) 
    : TForm(Owner) 
{                      
        char c[MAX_PATH];               //初始化,程序现在目录 
        if(::GetCurrentDirectory(MAX_PATH,c)) 
        { 
                ::SetCurrentDirectory(c); 
         
                SaveDialog1->FileName=AnsiString(c)+"\\readcard.prg"; 
                SaveDialog2->FileName=AnsiString(c)+"\\readcard.chr"; 
                SaveDialog3->FileName=AnsiString(c)+"\\readcard.tst"; 
                ePrgFilename->Text=AnsiString(c)+"\\readcard.prg"; 
                eChrFilename->Text=AnsiString(c)+"\\readcard.chr"; 
                eTestFilename->Text=AnsiString(c)+"\\readcard.tst"; 
        } 
        if(!WinIo.IsValid) 
        { 
                Application->MessageBox("无法装载 WinIo 驱动程序!", "错误信息", MB_OK|MB_ICONSTOP); 
                Application->Terminate(); 
        } 
 
        Timer1->Enabled = false; 
        ParallelPort.Base = 0x378;      //默认为 0x378 
        pc_conctrol=0; 
        pc_conctrol1=0x0ff; 
        ParallelPort.Ctrl=pc_conctrol; 
        cbPrgLength->ItemIndex=cbPrgSize->ItemIndex + 2; 
        cbChrLength->ItemIndex=cbChrSize->ItemIndex + 4; 
 
        mcu_power_on(); 
} 
//--------------------------------------------------------------------------- 
 
 
void __fastcall TForm1::btReadPRGClick(TObject *Sender) 
{ 
        long int length; 
 
        unsigned char data; 
        char *filename; 
 
        mcu_reset(); 
 
        stStatus1->Caption = "Card Reader Reset\n"; 
 
        data=0x80; 
        writeData(data);                //1  选择PRG 
        stStatus1->Caption = stStatus1->Caption + "0x"+IntToHex((int)data,2) + " "; 
 
        data = cbC3Type->ItemIndex + 1; 
        writeData(data);                //2  选择游戏卡类型 
        stStatus1->Caption = stStatus1->Caption + "0x"+IntToHex((int)data,2) + " "; 
 
        data = cbPrgSize->ItemIndex + 8; 
        writeData(data);                //3  容量 
        stStatus1->Caption = stStatus1->Caption + "0x"+IntToHex((int)data,2) + " "; 
 
        if(rbPrgFull->Checked) 
                data=0x00; 
        else 
                data= cbPrgStart->ItemIndex * 0x20 / 0x100 ; 
        writeData(data);                //4  起始地址:高地址 
        stStatus1->Caption = stStatus1->Caption + "0x"+IntToHex((int)data,2) + " "; 
 
        if(rbPrgFull->Checked) 
                data=0x00; 
        else 
                data= cbPrgStart->ItemIndex * 0x20 % 0x100 ; 
        writeData(data);                //5  起始地址:低地址 
        stStatus1->Caption = stStatus1->Caption + "0x"+IntToHex((int)data,2) + " "; 
 
        if(rbPrgFull->Checked) 
                data= cbPrgSize->ItemIndex + 5; 
        else 
                data= cbPrgLength->ItemIndex + 3; 
        writeData(data);                //6  长度 
        stStatus1->Caption = stStatus1->Caption + "0x"+IntToHex((int)data,2) + " "; 
 
        length = powl(2,data)*1024; 
 
        data=0x00; 
        writeData(data);                //7  保留 
        stStatus1->Caption = stStatus1->Caption + "0x"+IntToHex((int)data,2) + " "; 
 
        data=0x00; 
        writeData(data);                //8  保留 
        stStatus1->Caption = stStatus1->Caption + "0x"+IntToHex((int)data,2) + " "; 
 
        for(counter=0;counterText.Length() + 1 ]; 
        strcpy(filename,ePrgFilename->Text.c_str()); 
 
        outfile=fopen(filename,"wb"); 
        for(counter=0;counterCaption = "Card Reader Reset\n"; 
 
        data=0x90; 
        writeData(data);                //1  选择CHR 
        stStatus1->Caption = stStatus1->Caption + "0x"+IntToHex((int)data,2) + " "; 
 
        data = cbC3Type->ItemIndex + 1; 
        writeData(data);                //2  选择游戏卡类型 
        stStatus1->Caption = stStatus1->Caption + "0x"+IntToHex((int)data,2) + " "; 
 
        data = cbChrSize->ItemIndex + 8; 
        writeData(data);                //3  容量 
        stStatus1->Caption = stStatus1->Caption + "0x"+IntToHex((int)data,2) + " "; 
 
        if(rbChrFull->Checked) 
                data=0x00; 
        else 
                data= cbChrStart->ItemIndex * 0x20 / 0x100 ; 
        writeData(data);                //4  起始地址:高地址 
        stStatus1->Caption = stStatus1->Caption + "0x"+IntToHex((int)data,2) + " "; 
 
        if(rbChrFull->Checked) 
                data=0x00; 
        else 
                data= cbChrStart->ItemIndex * 0x20 % 0x100 ; 
        writeData(data);                //5  起始地址:低地址 
        stStatus1->Caption = stStatus1->Caption + "0x"+IntToHex((int)data,2) + " "; 
 
        if(rbChrFull->Checked) 
                data= cbChrSize->ItemIndex + 5; 
        else 
                data= cbChrLength->ItemIndex + 1; 
        writeData(data);                //6  长度 
        stStatus1->Caption = stStatus1->Caption + "0x"+IntToHex((int)data,2) + " "; 
 
        length = powl(2,data)*1024; 
 
        data=0x00; 
        writeData(data);                //7  保留 
        stStatus1->Caption = stStatus1->Caption + "0x"+IntToHex((int)data,2) + " "; 
 
        data=0x00; 
        writeData(data);                //8   保留 
        stStatus1->Caption = stStatus1->Caption + "0x"+IntToHex((int)data,2) + " "; 
 
        for(counter=0;counterText.Length() + 1 ]; 
        strcpy(filename,eChrFilename->Text.c_str()); 
 
        outfile=fopen(filename,"wb"); 
        for(counter=0;counterExecute()) 
                ePrgFilename->Text = SaveDialog1->FileName; 
} 
//--------------------------------------------------------------------------- 
 
void __fastcall TForm1::chrsavebtnClick(TObject *Sender) 
{ 
        if(SaveDialog2->Execute()) 
                eChrFilename->Text = SaveDialog2->FileName; 
 
} 
//--------------------------------------------------------------------------- 
 
void __fastcall TForm1::testsavebutClick(TObject *Sender) 
{ 
        if(SaveDialog3->Execute()) 
                eTestFilename->Text = SaveDialog3->FileName; 
} 
//--------------------------------------------------------------------------- 
 
void __fastcall TForm1::rbPrgPartClick(TObject *Sender) 
{ 
        Label5->Enabled=true; 
        Label6->Enabled=true; 
        cbPrgLength->Enabled=true; 
        cbPrgStart->Enabled=true; 
        cbPrgLength->ItemIndex=cbPrgSize->ItemIndex + 2; 
    	stStatus1->Caption = "Partial Read PRG ROM"; 
} 
//--------------------------------------------------------------------------- 
 
void __fastcall TForm1::rbPrgFullClick(TObject *Sender) 
{ 
 
        Label5->Enabled=false; 
        Label6->Enabled=false; 
        cbPrgLength->Enabled=false; 
        cbPrgStart->Enabled=false; 
        cbPrgLength->ItemIndex= cbPrgSize->ItemIndex + 2; 
        cbPrgStart->ItemIndex=0; 
        stStatus1->Caption = "Full Read PRG ROM"; 
} 
//--------------------------------------------------------------------------- 
 
void __fastcall TForm1::rbChrFullClick(TObject *Sender) 
{ 
        Label8->Enabled=false; 
        Label9->Enabled=false; 
        cbChrLength->Enabled=false; 
        cbChrStart->Enabled=false; 
        cbChrLength->ItemIndex= cbChrSize->ItemIndex + 4; 
        cbChrStart->ItemIndex=0; 
    	stStatus1->Caption = "Full Read CHR ROM"; 
} 
//--------------------------------------------------------------------------- 
 
void __fastcall TForm1::rbChrPartClick(TObject *Sender) 
{ 
        Label8->Enabled=true; 
        Label9->Enabled=true; 
        cbChrLength->Enabled=true; 
        cbChrStart->Enabled=true; 
        cbChrLength->ItemIndex=cbChrSize->ItemIndex + 4; 
        cbChrStart->ItemIndex=0; 
    	stStatus1->Caption = "Partial Read CHR ROM"; 
} 
//--------------------------------------------------------------------------- 
 
 
 
 
void __fastcall TForm1::rbPowerOffClick(TObject *Sender) 
{ 
        mcu_power_off(); 
} 
//--------------------------------------------------------------------------- 
 
void __fastcall TForm1::rbPowerOnClick(TObject *Sender) 
{ 
        mcu_power_on(); 
} 
//--------------------------------------------------------------------------- 
 
void __fastcall TForm1::btResetClick(TObject *Sender) 
{ 
        mcu_reset(); 
} 
//--------------------------------------------------------------------------- 
 
void __fastcall TForm1::cbPrgSizeChange(TObject *Sender) 
{ 
        cbPrgLength->ItemIndex=cbPrgSize->ItemIndex + 2; 
        cbPrgStart->ItemIndex=0; 
} 
//--------------------------------------------------------------------------- 
 
void __fastcall TForm1::cbChrSizeChange(TObject *Sender) 
{ 
        cbChrLength->ItemIndex=cbChrSize->ItemIndex + 4; 
        cbChrStart->ItemIndex=0; 
} 
//--------------------------------------------------------------------------- 
 
void __fastcall TForm1::cbC3TypeChange(TObject *Sender) 
{ 
        if (cbC3Type->ItemIndex == 3) 
        { 
                cbPrgSize->ItemIndex = 4 ; 
                cbPrgLength->ItemIndex=cbPrgSize->ItemIndex + 2; 
                cbPrgStart->ItemIndex=0; 
                btReadCHR->Enabled=false; 
 
        } 
        else 
        { 
                btReadCHR->Enabled=true; 
        } 
} 
//---------------------------------------------------------------------------