📄 bung.cpp
字号:
// printf("open error !!!\07\n");
return(-1);
}
if (write_file_xxk(length)!=0){
fclose(fptr);
return(-1);
}
fclose(fptr);
return(0);
}
char read_all_sram_to_file(void)
{
enable_sram_bank();
if((fptr=fopen(file_name,"w+b"))==NULL)
{/* open error */
// printf("open error !!!\07\n");
return(-1);
}
for (bank=0;bank<bank_size;bank++){
if ((bank & 3)==0) idx=0;
set_sram_bank(bank);
for (j=0;j<0x20;j++){ // 32 x 256 = 8192(8kbytes)
set_ai_data(1,(0xa0+j)); // sram at 0xa000~bfff
set_ai_data(0,0); // a[7..0]=0
set_ai_data(2,0x81); // enable inc
set_ai(3); // point to data r/w port
set_data_read
for (i=0;i<256;i++){
mix.buffer[i+idx]=read_data();
// mix.buffer[i+idx]=inportb(data);
}
set_ai_data(2,0x80); // disable inc
idx=idx+256;
}
if ((bank & 3)==3){
if (write_file_xxk(0x8000)!=0){
// printf("write file error\07\n");
fclose(fptr);
return(-1);
}
}
}
fclose(fptr);
// if (bank_size==4)
// printf("sram 256kbits saved\n");
// if (bank_size==16)
// printf("sram 1Mbits saved\n");
return(0);
}
char read_8k_sram_to_file(void)
{
if (bank_size==4){
if (sram_bank_num>3){
// printf("bank number error!!!\07\n");
return(-1);
}
}
else{
if (sram_bank_num>15){
// printf("bank number error!!!\07\n");
return(-1);
}
}
enable_sram_bank();
idx=0;
bank=sram_bank_num;
{
set_sram_bank(bank);
for (j=0;j<0x20;j++){ // 32 x 256 = 8192(8kbytes)
set_ai_data(1,(0xa0+j)); // sram at 0xa000~bfff
set_ai_data(0,0); // a[7..0]=0
set_ai_data(2,0x81); // enable inc
set_ai(3); // point to data r/w port
set_data_read
for (i=0;i<256;i++){
mix.buffer[i+idx]=read_data();
// mix.buffer[i+idx]=inportb(data);
}
set_ai_data(2,0x80); // disable inc
idx=idx+256;
}
}
if (write_sram_xxk(0x2000)!=0){
// printf("write file 64kbits error\07\n");
return(-1);
}
// else
// printf("sram 64kbits saved from bank %d\n",sram_bank_num);
return(0);
}
char write_all_sram_from_file(void)
{
enable_sram_bank();
if (open_read_sram()!=0) // read sram data from file to buffer
return(-1);
for (bank=0;bank<bank_size;bank++){
if ((bank & 3)==0){
idx=0;
if (read_32k_file()!=0){
// printf("load file error\n");
fclose(fptr);
return(-1);
}
}
// printf("w");
set_sram_bank(bank);
// disp_buffer(0x10);
for (j=0;j<0x20;j++){ // 32 x 256 = 8192(8kbytes)
set_ai_data(1,(0xa0+j)); // sram at 0xa000~bfff
set_ai_data(0,0); // a[7..0]=0
set_ai_data(2,0x81); // enable inc
set_ai(3); // point to data r/w port
set_data_write
for (i=0;i<256;i++){
write_data(mix.buffer[i+idx]);
// outportb(data,mix.buffer[i+idx]);
}
set_ai_data(2,0x80); // disable inc
idx=idx+256;
}
}
fclose(fptr);
// if (bank_size==4)
// printf("write sram 256kbits ok\n");
// if (bank_size==16)
// printf("write sram 1Mbits ok\n");
return(0);
}
char write_8k_sram_from_file(void)
{
if (bank_size==4){
if (sram_bank_num>3){
// printf("bank number error!!!\07\n");
return(-1);
}
}
else{
if (sram_bank_num>15){
// printf("bank number error!!!\07\n");
return(-1);
}
}
enable_sram_bank();
if (open_read_sram()!=0) // read sram data from file to buffer
return(-1);
idx=0;
bank=sram_bank_num;
{
// printf("w");
set_sram_bank(bank);
// disp_buffer(0x10);
for (j=0;j<0x20;j++){ // 32 x 256 = 8192(8kbytes)
set_ai_data(1,(0xa0+j)); // sram at 0xa000~bfff
set_ai_data(0,0); // a[7..0]=0
set_ai_data(2,0x81); // enable inc
set_ai(3); // point to data r/w port
set_data_write
for (i=0;i<256;i++){
write_data(mix.buffer[i+idx]);
// outportb(data,mix.buffer[i+idx]);
}
set_ai_data(2,0x80); // disable inc
idx=idx+256;
}
}
// printf("write sram 64kbits at bank %d ok\n",sram_bank_num);
return(0);
}
void try_read(void)
{
set_ai_data(0,0); // a[7..0]=0
set_ai_data(1,0x40);
set_ai_data(2,0x81); // enable inc
set_ai(3); // point to data r/w port
for (i=0;i<16;i++)
// mix.buffer[i]=inportb(data);
mix.buffer[i]=read_data();
disp_buffer(16);
}
void try_read0(void)
{
set_rom_bank(1);
for (j=0;j<4;j++){
set_sram_bank(j);
try_read();
}
set_bank(0x6000,1);
// printf("6000:1\n");
for (j=0;j<4;j++){
set_sram_bank(j);
try_read();
}
set_bank(0x6000,0);
// printf("6000:0\n");
for (j=0;j<4;j++){
set_sram_bank(j);
try_read();
}
}
int SendToBung(char *filename)
{
char card_present;
unsigned char ch,i; // single key function
BungSendWnd->ProgressBar1->Position=0;
BungSendWnd->Show();
BungSendWnd->Update();
file_name=filename;
pocket_camera=0;
mbc1_exp=0; // 0=4M, 1=8M/16M expand mode
eeprom_type=0; // unknown type
maxfilesize=524288*4; // 16M files
try
{
init_port();
// printf("\n--- Parallel EPP/SPP Port to GB Xchanger program version 1.4 ---\n");
port[0]=0x378; // lpt1 base address
port[1]=0x278; // lpt2 base address
if (port[0]==0){
// printf("No Printer Port Avialable!\07\n");
BungSendWnd->Hide();
return 0;
}
if (port[1]==0)
port_no=1; // only one printer port
else
port_no=2; // two printer port
card_present=0;
for (i=0;i<port_no;i++){
port_8=port[i];
port_9=port_8+1;
port_a=port_9+1;
port_b=port_a+1;
port_c=port_b+1;
if (check_port()==0){
card_present=1;
break;
}
}
if (card_present==0){
end_port();
BungSendWnd->Hide();
// printf("\nNo GBX card present!!!\07\n\n");
return 0;
}
else{
// printf("GBX card found at port%d",port_no);
// if (port_type)
// printf("(SPP)\n");
// else{
// if (epp_spp==1)
// printf("(EPP and SPP)\n");
// else
// printf("(EPP)\n");
// }
}
init_port();
check_eeprom(); // check 4M/16M
if (eeprom_type==4)
maxfilesize=524288; // 4M files
if (eeprom_type==16)
maxfilesize=524288*4; // 16M files
check_eeprom();
SetSramBank(); // set bank_size=4/16 banks of 8k
if (write_cart_from_file()!=0)
{
BungSendWnd->Hide();
MessageBox(NULL,"Error sending ROM","Error",MB_OK);
}
end_port();
BungSendWnd->Hide();
}
catch (...)
{
BungSendWnd->Hide();
MessageBox(NULL,"Error sending ROM","Error",MB_OK);
return 0;
}
return 1;
}
/*************************************************
* MAIN ENTRY *
*************************************************/
/*void main(int argc, char *argv[])
{
char card_present;
unsigned char ch,i; // single key function
char *progname=argv[0];
pocket_camera=0;
mbc1_exp=0; // 0=4M, 1=8M/16M expand mode
eeprom_type=0; // unknown type
maxfilesize=524288*4; // 16M files
init_port();
// printf("\n--- Parallel EPP/SPP Port to GB Xchanger program version 1.4 ---\n");
port[0]=peek(0x40,8); // lpt1 base address
port[1]=peek(0x40,10); // lpt2 base address
if (port[0]==0){
// printf("No Printer Port Avialable!\07\n");
return;
}
if (port[1]==0)
port_no=1; // only one printer port
else
port_no=2; // two printer port
card_present=0;
for (i=0;i<port_no;i++){
port_8=port[i];
port_9=port_8+1;
port_a=port_9+1;
port_b=port_a+1;
port_c=port_b+1;
if (check_port()==0){
card_present=1;
break;
}
}
cmd=NULL;
if (argc==1) usage(progname);
// file_name = argv[2];
// printf("%s\n",file_name);
cmd='w'; // default write mode
for( i=1; i<argc; i++ ) {
if( argv[i][0] == '-' ) {
char *c = argv[i]+1;
char cmd_l = strlen(argv[i]);
if(*c=='l'){
if (cmd_l==2)
continue; // cmd='w'
if( *(c+1)=='s'&& *(c+2)=='a' && cmd_l==4){ // -lsa
cmd='L'; // cmd='L'
continue; // check next cmd
}
if( *(c+1)=='s'&& *(c+2)=='c' && cmd_l==4){ // -lsc
pocket_camera=1; // sram size=1Mbits
cmd='L'; // cmd='L'
continue; // check next cmd
}
if( *(c+1)=='s' && cmd_l>3){ // -lsn
if( *(c+2)>='0' && *(c+2)<':'){ // 0,1..8,9,:
sram_bank_num=*(c+2)-'0';
if( *(c+3)>='0' && *(c+3)<':'){ // 0,1..8,9,:
sram_bank_num=sram_bank_num*10 + (*(c+3)-'0');
}
}
cmd='l';
// printf("cmd=%c %d\n",cmd,sram_bank_num);
continue; // check next cmd
}
}else if(*c=='b'){
if (cmd_l==2){ // -b
cmd='b';
continue; // cmd='b'
}
if(*(c+1)=='a' && cmd_l==3){ // -ba
cmd='B'; // cmd='B'
continue; // check next cmd
}
if(*(c+1)=='s' && *(c+2)=='a' && cmd_l==4){ // -bsa
cmd='R'; // cmd='R'
continue; // check next cmd
}
if(*(c+1)=='s' && *(c+2)=='c' && cmd_l==4){ // -bsc
pocket_camera=1; // sram size=1Mbits
cmd='R'; // cmd='R'
continue; // check next cmd
}
if( *(c+1)=='s' && cmd_l>3){ // -bsn
if( *(c+2)>='0' && *(c+2)<':'){ // 0,1..8,9,:
sram_bank_num=*(c+2)-'0';
if( *(c+3)>='0' && *(c+3)<':'){ // 0,1..8,9,:
sram_bank_num=sram_bank_num*10 + (*(c+3)-'0');
}
}
cmd='r'; // cmd='r'
// printf("cmd=%c %d\n",cmd,sram_bank_num);
continue; // check next cmd
}
}else if(*c=='t'){
if(*(c+1)=='s' && cmd_l==3){ // -ts
cmd='t'; // cmd='t'
continue; // check next cmd
}
if(*(c+1)=='a' && cmd_l==3){ // -ta
cmd='A'; // cmd='A'
continue; // check next cmd
}
if(*(c+1)=='s' && *(c+2)=='f' && cmd_l==4){ // -tsf
cmd='T'; // cmd='T'
continue; // check next cmd
}
}
if( *(c+1) != '\0' ) usage(progname);
switch( *c ) {
case 'v' : cmd='v'; break;
case 'i' : cmd='i';break;
case 'e' : cmd='e';break;
case 'c' : cmd='c'; break;
default:
usage(progname);
}
}
else {
if( file_name == NULL ) {
file_name = argv[i];
}
else {
usage(progname);
}
}
}
// try_read0();
// exit(0);
// if (cmd=='c'){
// if (check_header(0)==0)
// exit(chk_gcrc());
// exit(0);
// }
else {
if (card_present==0){
// printf("\nNo GBX card present!!!\07\n\n");
return;
}
else{
// printf("GBX card found at port%d",port_no);
// if (port_type)
// printf("(SPP)\n");
// else{
// if (epp_spp==1)
// printf("(EPP and SPP)\n");
// else
// printf("(EPP)\n");
// }
}
init_port();
}
check_eeprom(); // check 4M/16M
if (eeprom_type==4)
maxfilesize=524288; // 4M files
if (eeprom_type==16)
maxfilesize=524288*4; // 16M files
if (cmd=='b' || cmd=='B'){
backup();
end_port();
return;
}
if (cmd=='v'){
verify_cart_from_file();
end_port();
return;
}
if (check_eeprom()){
bank_size=4; // 4x8k=32k sram
SetSramBank(); // set bank_size=4/16 banks of 8k
switch(cmd) { // for game cart only
case 'R' : read_all_sram_to_file(); break;
case 'r' : read_8k_sram_to_file(); break;
case 'L' : write_all_sram_from_file(); break;
case 'l' : write_8k_sram_from_file(); break;
case 'w' :
case 'i' :
case 'e' :
// printf("Flash memory not present!!!\07\n");
break;
}
end_port();
return;
}
// if (check_eeprom()){
// printf("Flash memory not present!!!\07\n");
// end_port();
// exit(0);
// }
SetSramBank(); // set bank_size=4/16 banks of 8k
switch(cmd) { // for GB card only
case 'w' : write_cart_from_file(); break;
case 'R' : read_all_sram_to_file(); break;
case 'r' : read_8k_sram_to_file(); break;
case 'L' : write_all_sram_from_file(); break;
case 'l' : write_8k_sram_from_file(); break;
// case 'r' : read_eeprom_16k(0); break;
case 'i' : disp_id();break;
case 'e' : erase();break;
case 't' : test_sram_v();break;
case 'T' : test_sram_wv();break;
case 'A' : test_all();break;
}
end_port();
}*/
//---------------------------------------------------------------------------
__fastcall TBungSendWnd::TBungSendWnd(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -