📄 bung.cpp
字号:
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "bung.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TBungSendWnd *BungSendWnd;
/*************************************************************
* program name: gbt14.c *
* use parallel EPP/SPP port to r/w game boy cartridge *
* *
* ai[]=0 w a[7..0] *
* ai[]=1 w a[15..8] *
* ai[]=2 w control d7=rs,d6=spp,d1=xwe_en,d0=cs_en *
* ai[]=3 r/w data *
* *
* MBC1 *
* R/W A000~BFFF RAM SWITCHING BANK(256Kbit) 4 BANKS OF 8Kbyte *
* R 4000~7FFF ROM SWITCHING BANK(4Mbit) 32 BANKS OF 128Kbit *
* W 2000~3FFF SET ROM BANK (5 BIT) *
* R 0000~3FFF FIX ROM BANK 0 *
* W 4000~5FFF SET RAM BANK (2 BIT) *
* W 0000~1FFF SET 0A ENABLE RAM BANK *
* *
* MBC2 *
* R/W A000~BFFF 512 X 4 BIT RAM *
* R 4000~7FFF ROM SWITCHING BANK(2Mbit) 16 BANKS OF 128Kbit *
* W 2100 SET ROM BANK (4 BIT) *
* R 0000~3FFF FIX ROM BANK 0 *
* W 0000 SET 0A ENABLE RAM BANK *
* *
* MBC5 *
* R/W A000~BFFF RAM SWITCHING BANK(1Mbit) 16 BANKS OF 64 Kbit *
* R 4000~7FFF ROM SWITCHING BANK(64Mbit) 512 BANKS OF 128Kbit *
* W 3000~3FFF SET ROM BANK1(BANK Q8) TOTAL 9 BIT *
* W 2000~2FFF SET ROM BANK0(BANK Q7~Q0) *
* R 0000~3FFF FIX ROM BANK 0 *
* W 4000~7FFF SET RAM BANK (4 BIT) *
* W 0000~1FFF SET 0A ENABLE RAM BANK *
* *
*************************************************************/
#include <windows.h>
#include <dos.h>
#include <stdio.h>
#include <stdlib.h>
#include <io.h>
#include <dir.h>
#define ai port_b
#define data port_c
#define trans_size 32768
//#define set_ai_write outportb(port_a,5); // ninit=1, nwrite=0
#define set_data_read outportb(port_a,0); // nastb=1,nib_sel=0,ndstb=1,nwrite=1
#define set_data_write outportb(port_a,1); // nastb=1,nib_sel=0,ndstb=1,nwrite=0
//#define set_data_write outportb(port_a,1); // ninit=0, nwrite=0
//#define set_data_read outportb(port_a,0); // ninit=0, nwrite=1
#define set_normal outportb(port_a,4); // ninit=1, nwrite=1
#define retry_time 10;
unsigned int port[2];
unsigned char port_no;
unsigned int port_8,port_9,port_a,port_b,port_c;
unsigned int bank,bank_size;
unsigned long maxfilesize;
char *file_name=NULL;
unsigned char cmd,eeprom_type; // command
FILE *fptr;
union mix_buffer {
unsigned char buffer[32768];
unsigned int bufferx[16384];
}mix;
unsigned int i,j,idx,gcrc;
unsigned char temp,mbc1_exp;
unsigned long filesize;
unsigned char header_ok,cart_type,rom_size,ram_size,sram_bank_num;
char port_type=0; // 0=epp, 1=spp
char epp_spp=0;
char pocket_camera=0; // 0=not pocket camera sram(1Mbits)
/**************************************
* Subroutine *
**************************************/
void outportb(unsigned short port,unsigned char v)
{
asm mov dx,port
asm mov al,v
asm out dx,al
}
unsigned char inportb(unsigned short port)
{
unsigned char v;
asm mov dx,port
asm in al,dx
asm mov v,al
return v;
}
void disp_buffer(unsigned int disp_len)
{
/* int i,j,x,y;
for (i=0; i<disp_len ; i++)
{
if ((i & 0xf)==0)
printf("%04x : ",i&0xfff0);
if ((i & 0xf)==8)
printf("- ");
printf("%02x ",mix.buffer[i]);
if ((i & 0xf)==0xf)
{
printf("-> ");
for (j=0; j<16 ; j++)
{
if (mix.buffer[(i&0xfff0)+j]<0x20 || mix.buffer[(i&0xfff0)+j]>0x80)
printf (".");
else
printf ("%c",mix.buffer[(i&0xfff0)+j]);
}
printf("\n");
}
}
y=disp_len&0xf;
if (y) // not equal 16*??
{
for (x=y;x<16;x++)
{
if ((x & 0xf)==8)
printf("- ");
printf(" ");
if ((x & 0xf)==0xf)
{
printf("-> ");
for (j=0; j<y ; j++)
{
if (mix.buffer[(i&0xfff0)+j]<0x20 || mix.buffer[(i&0xfff0)+j]>0x80)
printf (".");
else
printf ("%c",mix.buffer[(i&0xfff0)+j]);
}
printf("\n");
}
}
}*/
}
/*void port_set_read(void)
{
outportb(port_a,0); // nastb=1,nib_sel=0,ndstb=1,nwrite=1
}
void port_set_write(void)
{
outportb(port_a,1); // nastb=1,nib_sel=0,ndstb=1,nwrite=0
}*/
void spp_set_ai(unsigned char _ai)
{
set_data_write
// outportb(port_a,1); // nastb=1,nib_sel=0,ndstb=1,nwrite=0
outportb(port_8,_ai); // put ai at data bus
outportb(port_a,9); // nastb=0,nib_sel=0,ndstb=1,nwrite=0
for (int i=0;i<200;i++) {}
outportb(port_a,1); // nastb=1,nib_sel=0,ndstb=1,nwrite=0
for (int i=0;i<200;i++) {}
// nastb ~~~~|___|~~~~
}
void spp_write_data(unsigned char _data)
{
// outportb(port_a,1); // nastb=1,nib_sel=0,ndstb=1,nwrite=0
outportb(port_8,_data); // put data at data bus
outportb(port_a,3); // nastb=1,nib_sel=0,ndstb=0,nwrite=0
for (int i=0;i<200;i++) {}
outportb(port_a,1); // nastb=1,nib_sel=0,ndstb=1,nwrite=0
for (int i=0;i<200;i++) {}
// ndstb ~~~~|___|~~~~
}
void spp_set_ai_data(unsigned char _ai,unsigned char _data)
{
spp_set_ai(_ai);
spp_write_data(_data);
}
char spp_read_data(void)
{
char low_nibble,high_nibble,temp;
set_data_read
outportb(port_a,2); // nastb=1,nib_sel=0,ndstb=0,nwrite=1
for (int i=0;i<200;i++) {}
low_nibble=inportb(port_9);
for (int i=0;i<200;i++) {}
outportb(port_a,6); // nastb=1,nib_sel=1,ndstb=0,nwrite=1
for (int i=0;i<200;i++) {}
high_nibble=inportb(port_9);
for (int i=0;i<200;i++) {}
outportb(port_a,0); // nastb=1,nib_sel=0,ndstb=1,nwrite=1
// nibble_sel ___|~~~ and ndstb ~~~~|___|~~~~
for (int i=0;i<200;i++) {}
temp=(((high_nibble<<1)&0xf0)|((low_nibble>>3)&0x0f));
// printf("temp=%x",temp);
return(temp);
}
void epp_set_ai(unsigned char _ai)
{
set_data_write
outportb(ai,_ai);
}
void epp_set_ai_data(unsigned char _ai,unsigned char _data)
{
epp_set_ai(_ai);
set_data_write
outportb(data,_data);
}
void set_ai(unsigned char _ai)
{
set_data_write
if (port_type)
spp_set_ai(_ai);
else
epp_set_ai(_ai);
}
void set_ai_data(unsigned char _ai,unsigned char _data)
{
if (port_type)
spp_set_ai_data(_ai,_data); // spp mode
else
epp_set_ai_data(_ai,_data); // epp mode
}
void write_data(unsigned char _data)
{
if (port_type)
spp_write_data(_data); // spp write data
else
outportb(data,_data); // epp write data
}
unsigned char read_data(void)
{
if (port_type){
return(spp_read_data()); // spp read data
}
else{
return(inportb(data)); // epp read data
}
}
HANDLE giveIO;
void init_port(void)
{
giveIO=CreateFile("\\\\.\\giveio",GENERIC_READ,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
outportb(port_9,1); // clear EPP time flag
set_ai_data(2,0); // rst=0, wei=0(dis.), rdi=0(dis.)
set_ai_data(2,0x80); // rst=1, wei=0(dis.), rdi=0(dis.)
}
void end_port(void)
{
if (giveIO!=INVALID_HANDLE_VALUE)
CloseHandle(giveIO);
set_ai_data(2,0); // rst=0, wei=0(dis.), rdi=0(dis.)
set_normal // ninit=1, nWrite=1
}
unsigned char write_32k_file(void)
{
if (fwrite((char *)mix.buffer,sizeof(char),trans_size,fptr)!=trans_size)
{
fclose(fptr); /* write data error */
return(1);
}
// printf(".");
return(0);
}
unsigned char read_8k_file()
{
if (fread((char *)mix.buffer,sizeof(char),0x2000,fptr)!=0x2000)
{
// printf("read error!!!\07\n");
fclose(fptr); /* read data error */
return(1);
}
// printf(".");
return(0);
}
unsigned char read_16k_file()
{
if (fread((char *)mix.buffer,sizeof(char),0x4000,fptr)!=0x4000)
{
// printf("read error!!!\07\n");
fclose(fptr); /* read data error */
return(1);
}
// printf(".");
return(0);
}
unsigned char read_32k_file()
{
if (fread((char *)mix.buffer,sizeof(char),trans_size,fptr)!=trans_size)
{
// printf("read error!!!\07\n");
fclose(fptr); /* read data error */
return(1);
}
// printf(".");
return(0);
}
void set_adr(unsigned int adr) // *****
{
unsigned char temp;
set_ai_data(0,(adr & 0xff)); // a[7..0]
set_ai_data(1,((adr>>8) & 0xff)); // a[15..8]
set_ai(3);
set_data_read // ninit=0, nWrite=1
}
int write_file_32k(void)
{
if (fwrite((char *)mix.buffer,sizeof(char),trans_size,fptr)!=trans_size)
{
fclose(fptr); /* write data error */
return(-1);
}
// printf(".");
return(0);
}
char write_file_xxk(unsigned int write_size)
{
if (fwrite((char *)mix.buffer,sizeof(char),write_size,fptr)!=write_size)
{
fclose(fptr); /* write data error */
return(-1);
}
// printf(".");
return(0);
}
void set_bank(unsigned int adr,unsigned char bank)
{
// printf("adr=%x bank=%x\n",adr,bank);
set_ai_data(2,0x80); // disable inc
set_ai_data(0,(adr & 0xff)); // a[7..0]
set_ai_data(1,((adr>>8) & 0x7f)); // a[15..8]
set_ai_data(3,bank); // write bank no
set_data_read // ninit=0, nWrite=1
}
void set_rom_bank(unsigned char bank)
{
// cart_type <4 is MCB1, other is MCB2
if (cart_type < 4)
set_bank(0x2000,bank); // for MCB1
else
set_bank(0x2100,bank); // for MCB2
}
void delay_10us()
{
LARGE_INTEGER freq,start,cur;
QueryPerformanceFrequency(&freq);
QueryPerformanceCounter(&start);
while (1)
{
QueryPerformanceCounter(&cur);
if ((cur.u.LowPart-start.u.LowPart)>(freq.u.LowPart/100))
break;
}
}
void delay_100us()
{
LARGE_INTEGER freq,start,cur;
QueryPerformanceFrequency(&freq);
QueryPerformanceCounter(&start);
while (1)
{
QueryPerformanceCounter(&cur);
if ((cur.u.LowPart-start.u.LowPart)>(freq.u.LowPart/10))
break;
}
}
void delay_20ms()
{
LARGE_INTEGER freq,start,cur;
QueryPerformanceFrequency(&freq);
QueryPerformanceCounter(&start);
while (1)
{
QueryPerformanceCounter(&cur);
if ((cur.u.LowPart-start.u.LowPart)>(freq.u.LowPart/5))
break;
}
}
void out_byte_eeprom(unsigned char d)
{
set_ai_data(2,0x82); // wei enable
set_ai(3); // default write mode
// set_data_read // ninit=0, nWrite=1
set_data_write
write_data(d); // out data
// outportb(data,d); // out data
set_ai_data(2,0x80); // wei disable
set_ai(3); // default write mode
}
void out_byte(unsigned char d)
{
set_ai(3);
// set_data_read // ninit=0, nWrite=1
set_data_write
write_data(d); // out data
// outportb(data,d); // out data
}
void out_data(unsigned char h,unsigned char m,unsigned char l,unsigned char d)
{
// ai[]=2 w control d7=rs,d1=xwe_en,d0=cs_en
h=((h<<2)|(m>>6))&0x1f; // maximum bank is 1f
if (h)
m=(m & 0x3f)|0x40; // >bank 0
else
m=m & 0x3f; // bank 0
set_adr(0x2000); // write 2000:h
set_data_write
write_data(h); // set rom bank value
// outportb(data,h); // set rom bank value
set_ai_data(1,m); // a[15..8]
set_ai_data(0,l); // a[7..0]
out_byte_eeprom(d); // write data to eeprom
}
void out_adr2_data(unsigned long adr,unsigned char d)
{
unsigned char h,m,l;
set_ai_data(2,0x80); // disable wr/rd inc.
adr<<=1; // adr x 2
l=adr & 0xff; // a7~a0
m=(adr>>8) & 0x3f; // a13~a8
h=(adr>>14) & 0xff; // a21~a13
if (h)
m|=0x40; // >bank 0
set_adr(0x2000); // write 2000:h
set_data_write
write_data(h); // set rom bank value
// outportb(data,h); // set rom bank value
set_ai_data(1,m); // a[15..8]
set_ai_data(0,l); // a[7..0]
out_byte_eeprom(d); // write data to eeprom
}
unsigned char read_byte(void)
{
set_ai(3); // default write mode
set_data_read // ninit=0, nWrite=1
return (read_data());
// return (inportb(data));
}
void enable_protection(void)
{
// set_bank(0x2000,0); // set bank 0
out_data(0,0x55,0x55,0xaa); /* adr2,adr1,adr0,data 05555:aa */
out_data(0,0x2a,0xaa,0x55);
out_data(0,0x55,0x55,0xa0);
}
void disable_protection(void)
{
out_data(0,0x55,0x55,0xaa); /* adr2,adr1,adr0,data 05555:aa */
out_data(0,0x2a,0xaa,0x55);
out_data(0,0x55,0x55,0x80);
out_data(0,0x55,0x55,0xaa);
out_data(0,0x2a,0xaa,0x55);
out_data(0,0x55,0x55,0x20);
delay_20ms();
}
int data_polling_data(unsigned char last_data)
{
unsigned char loop;
unsigned long timeout=0;
// delay_10us(); // call delay
loop = 1;
while ((timeout<0x07ffffff) && (loop))
{
if (((read_byte() ^ last_data) & 0x80)==0) // end wait
loop = 0; // ready to exit the while loop
timeout++;
}
// printf("timeout = %x\n",timeout);
return(loop);
}
int data_polling(void)
{
unsigned char loop,predata,currdata;
unsigned long timeout=0;
delay_10us(); // call delay
loop = 1;
predata = read_byte() & 0x40;
while ((timeout<0x07ffffff) && (loop))
{
currdata = read_byte() & 0x40;
if (predata == currdata)
loop = 0; // ready to exit the while loop
predata = currdata;
timeout++;
}
// printf("timeout = %x\n",timeout);
return(loop);
}
void reset_to_read(void) // return to read mode
{
out_adr2_data(0x5555,0xaa); // 5555:aa adr2,adr1,adr0,data
out_adr2_data(0x2aaa,0x55); // 2aaa:55
out_adr2_data(0x5555,0xf0); // 5555:f0
}
void read_status_reg_cmd(void)
{
out_adr2_data(0x5555,0xaa); // 5555:aa adr2,adr1,adr0,data
out_adr2_data(0x2aaa,0x55); // 2aaa:55
out_adr2_data(0x5555,0x70); // 5555:70
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -