⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mainform.cpp

📁 WINDOWS 并口编程
💻 CPP
字号:
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop
#include "MainForm.h"
#include "PrnPort.h"
#include "time.h"
#include <stdio.h>
#include <math.h>
//---------------------------------------------------------------------------
#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;counter<length;counter++)
        {
                file_temp[counter] = readData();
        }

        filename = new char[ ePrgFilename->Text.Length() + 1 ];
        strcpy(filename,ePrgFilename->Text.c_str());

        outfile=fopen(filename,"wb");
        for(counter=0;counter<length;counter++)
        {
                fprintf(outfile,"%c",file_temp[counter]);
        }
        fclose(outfile);

        ShowMessage("读取PRG数据成功!");
}
//---------------------------------------------------------------------------

void __fastcall TForm1::btReadCHRClick(TObject *Sender)
{
        long int length;

        unsigned char data;
        char *filename;

        mcu_reset();

        stStatus1->Caption = "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;counter<length;counter++)
        {
                file_temp[counter] = readData();
        }

        filename = new char[ eChrFilename->Text.Length() + 1 ];
        strcpy(filename,eChrFilename->Text.c_str());

        outfile=fopen(filename,"wb");
        for(counter=0;counter<length;counter++)
        {
                fprintf(outfile,"%c",file_temp[counter]);
        }
        fclose(outfile);

        ShowMessage("读取CHR数据成功!");
}

//---------------------------------------------------------------------------

void delay(int ms)
{
    	long int clock_start = clock();
	while( clock() < clock_start + ms );
}
          
//---------------------------------------------------------------------------

void set_pcready(void)
{
  	ParallelPort.Ctrl |= pcready;
}
//---------------------------------------------------------------------------

void clear_pcready(void)
{
  	ParallelPort.Ctrl &= ~pcready;
}
//---------------------------------------------------------------------------

void set_pcack(void)
{
	ParallelPort.Ctrl |= pcack;                         
}
//---------------------------------------------------------------------------

void clear_pcack(void)
{                         
  	ParallelPort.Ctrl &= ~pcack;
}
//---------------------------------------------------------------------------

void mcu_power_on(void)
{
        ParallelPort.Ctrl &= ~power;
}
//---------------------------------------------------------------------------
void mcu_power_off(void)
{
        ParallelPort.Ctrl |= power;
    	set_pc_output_data();
    	ParallelPort.Data = 0;
}
void mcu_reset(void)
{
	mcu_power_off();
	delay(500);
	mcu_power_on();
	delay(200);
}

//---------------------------------------------------------------------------
bool check_mcuack(void)
{
        unsigned char flag = ParallelPort.Flag & mcuack ;
        return !(bool)flag;
}

//---------------------------------------------------------------------------
bool check_mcuready(void)
{
        unsigned char flag = ParallelPort.Flag & mcuready ;
        return (bool)(flag);
}
//---------------------------------------------------------------------------

void set_pc_output_data(void)
{
	if(ParallelPort.Ctrl & 0x20)
	{
	    ParallelPort.Ctrl &= 0xdf;
	}
}
 void set_pc_input_data(void)
{
    	if(!(ParallelPort.Ctrl & 0x20))
    	{
  	    ParallelPort.Ctrl |= 0x20;
   	}
}
//---------------------------------------------------------------------------

void writeData(unsigned char data)
{
//	return;

	int i=0;
		
    	while( check_mcuack() ) ;

    	set_pc_output_data();
    	ParallelPort.Data = data;
    	
    	set_pcready();
    	while( !check_mcuack() ) ;
    	clear_pcready();
}
 

unsigned char readData(void)
{
//	return 0;
	
    	unsigned char data;

    	while( !check_mcuready() );
    	
    	set_pc_input_data();
    	data=ParallelPort.Data;
    	
    	set_pcack();
    	while( check_mcuready() );
    	clear_pcack();

    	return  data;
}
//---------------------------------------------------------------

void __fastcall TForm1::prgsavebtnClick(TObject *Sender)
{
        if(SaveDialog1->Execute())
                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;
        }
}
//---------------------------------------------------------------------------

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -