📄 mainform.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 + -