📄 bung.cpp
字号:
char wait_status(void)
{
unsigned temp;
temp=read_byte(); // read first status byte
// printf("temp=%x ",temp);
while ((temp & 0xfc)!=0x80){
// printf("temp=%x ",temp);
if ((temp & 0x20)==0x20){
// printf("Fail in erase!!!\07\n");
return(-1);
}
if ((temp & 0x10)==0x10){
// printf("Fail in program!!!\07\n");
return(-2);
}
temp=read_data();
// temp=inportb(data);
}
// reset_to_read();
return(0);
}
char mx_erase(void)
{
out_adr2_data(0x5555,0xaa); // 5555:aa adr2,adr1,adr0,data
out_adr2_data(0x2aaa,0x55); // 2aaa:55
out_adr2_data(0x5555,0x80); // 5555:80
out_adr2_data(0x5555,0xaa); // 5555:aa
out_adr2_data(0x2aaa,0x55); // 2aaa:55
out_adr2_data(0x5555,0x10); // 5555:10
delay_100us();
// read_status_reg_cmd(); // send read status reg. cmd
if(wait_status()==0){
reset_to_read();
// printf("erase ok\n");
return(0);
}
else{
reset_to_read();
// printf("erase error!!!\07\n");
return(-1);
}
}
char win_erase(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,0x10);
delay_20ms();
if (data_polling()){
// printf("erase error!!!\n");
return(-1);
}
else{
// printf("erase ok!\n");
return(0);
}
}
char erase(void)
{
if (eeprom_type==4)
return(win_erase());
else
return(mx_erase());
}
char sector_erase(unsigned long sector)
{
unsigned char temp;
out_adr2_data(0x5555,0xaa); // 5555:aa adr2,adr1,adr0,data
out_adr2_data(0x2aaa,0x55); // 2aaa:55
out_adr2_data(0x5555,0x80); // 5555:80
out_adr2_data(0x5555,0xaa); // 5555:aa
out_adr2_data(0x2aaa,0x55); // 2aaa:55
out_adr2_data(sector,0x30); // sector:30
delay_100us();
// read_status_reg_cmd(); // send read status reg. cmd
if(wait_status()==0){
// reset_to_read();
// printf("erase ok\n");
// printf("s");
return(0);
}
else{
reset_to_read();
// printf("sector erase error!!!\07\n");
return(-1);
}
}
void mx_id(void)
{
out_adr2_data(0x5555,0xaa); /* softwave product ID entry */
out_adr2_data(0x2aaa,0x55); /* adr2,adr1,adr0,data */
out_adr2_data(0x5555,0x90); /* adr2,adr1,adr0,data */
// delay_10us();
set_adr(0); /* adr2,adr1,adr0 */
// printf("Manufacturer Code : %x\n",read_byte());
set_adr(2); /* adr2,adr1,adr0 */
// printf("Device Code : %x\n",read_byte());
set_adr(4); /* adr2,adr1,adr0 */
// printf("First 16k protection Code : %x\n",read_byte());
reset_to_read(); // reset to read mode
}
void win_id(void)
{
out_data(0,0x55,0x55,0xaa); /* softwave product ID entry */
out_data(0,0x2a,0xaa,0x55); /* adr2,adr1,adr0,data */
out_data(0,0x55,0x55,0x80); /* adr2,adr1,adr0,data */
out_data(0,0x55,0x55,0xaa); /* adr2,adr1,adr0,data */
out_data(0,0x2a,0xaa,0x55); /* adr2,adr1,adr0,data */
out_data(0,0x55,0x55,0x60); /* adr2,adr1,adr0,data */
delay_10us();
set_adr(0); /* adr2,adr1,adr0 */
// printf("Manufacturer Code : %x\n",read_byte());
set_adr(1); /* adr2,adr1,adr0 */
// printf("Device Code : %x\n",read_byte());
// set_adr(2); /* adr2,adr1,adr0 */
// printf("First 16k protection Code : %x\n",read_byte());
// set_bank(0x2000,0x1f);
// set_adr(0x7ff2); /* adr2,adr1,adr0=0x7fff2 */
// printf("Last 16k protection Code : %x\n",read_byte());
out_data(0,0x55,0x55,0xaa); /* softwave product ID exit */
out_data(0,0x2a,0xaa,0x55); /* adr2,adr1,adr0,data */
out_data(0,0x55,0x55,0xf0); /* adr2,adr1,adr0,data */
}
void disp_id(void)
{
if (eeprom_type==4)
win_id();
else
mx_id();
}
char check_eeprom(void)
{
// check 4M flash
out_data(0,0x55,0x55,0xaa); /* softwave product ID entry */
out_data(0,0x2a,0xaa,0x55); /* adr2,adr1,adr0,data */
out_data(0,0x55,0x55,0x80); /* adr2,adr1,adr0,data */
out_data(0,0x55,0x55,0xaa); /* adr2,adr1,adr0,data */
out_data(0,0x2a,0xaa,0x55); /* adr2,adr1,adr0,data */
out_data(0,0x55,0x55,0x60); /* adr2,adr1,adr0,data */
delay_10us();
set_adr(0); /* adr2,adr1,adr0 */
// printf("Manufacturer Code : %x\n",read_byte());
if (read_byte()!=0xda) goto check_16m;
set_adr(1); /* adr2,adr1,adr0 */
// printf("Device Code : %x\n",read_byte());
if (read_byte()!=0x46) goto check_16m;
out_data(0,0x55,0x55,0xaa); /* softwave product ID exit */
out_data(0,0x2a,0xaa,0x55); /* adr2,adr1,adr0,data */
out_data(0,0x55,0x55,0xf0); /* adr2,adr1,adr0,data */
eeprom_type=4; // windbond 4M flash
return(0);
// 16M flash
check_16m:
out_adr2_data(0x5555,0xaa); /* 5555:aa softwave product ID entry */
out_adr2_data(0x2aaa,0x55); /* 2aaa:55 adr2,adr1,adr0,data */
out_adr2_data(0x5555,0x90); /* 5555:90 adr2,adr1,adr0,data */
// delay_10us();
set_adr(0); /* adr2,adr1,adr0 */
// printf("Manufacturer Code : %x\n",read_byte());
if (read_byte()!=0xc2){
reset_to_read();
return(1);
}
set_adr(2); /* adr2,adr1,adr0 */
// printf("Device Code : %x\n",read_byte());
if (read_byte()!=0xf1){
reset_to_read();
return(1);
}
reset_to_read(); // reset to read mode
eeprom_type=16; // MX 16M flash
return(0);
}
void set_sram_bank(unsigned char bank)
{
set_adr(0x4000); // set sram adr
out_byte(bank); // sram bank 0
}
void read_eeprom_16k(unsigned char bank_16k)
{
// printf("r");
idx=0;
if (mbc1_exp){
set_bank(0x6000,0); // for MCB1 expand bank
if ((bank_16k & 0x1f)==0){
set_sram_bank((bank_16k>>5) & 0x3); // use sram bank intend rom bank
// printf("^");
}
bank_16k=bank_16k& 0x1f;
}
set_bank(0x2000,bank_16k); // for MCB1 16k bank
for (j=0;j<64;j++){ // 16k bytes = 64 x 256 bytes
if (bank_16k)
set_ai_data(1,(j|0x40)); // set adr[15..8]
else
set_ai_data(1,j); // a[15..0]
set_ai_data(0,0); // a[7..0]
set_ai_data(2,0x81); // enable read inc.
set_ai(3); // read/write data
set_data_read
for (i=0;i<256;i++) { // page=256
// set_ai_data(0,i); // a[7..0]
// mix.buffer[idx+i]=read_byte();
mix.buffer[idx+i]=read_data();
// mix.buffer[idx+i]=inportb(data);
}
idx=idx+256;
}
// printf(" ok\n");
}
char verify_eeprom_16k(unsigned char bank_16k)
{
// printf("v");
idx=0;
if (mbc1_exp){
set_bank(0x6000,0); // for MCB1 expand bank
if ((bank_16k & 0x1f)==0){
set_sram_bank((bank_16k>>5) & 0x3); // use sram bank intend rom bank
// printf("^");
}
bank_16k=bank_16k& 0x1f;
}
set_bank(0x2000,bank_16k); // for MCB1 16k bank
for (j=0;j<64;j++){ // 16k bytes = 64 x 256 bytes
if (bank_16k)
set_ai_data(1,(j|0x40)); /* set adr[15..8] */
else
set_ai_data(1,j);
set_ai_data(0,0); // a[7..0]
set_ai_data(2,0x81); // enable read inc.
set_ai(3); // read/write data
set_data_read
for (i=0;i<256;i++) {
temp=read_data();
// temp=inportb(data);
if(temp!=mix.buffer[idx+i]) {
//init_port();
// printf(" error at %x!\07\n",(bank_16k*16384)+(j*256)+i);
return(-1);
}
}
idx=idx+256;
}
// printf(" ok\n");
return(0);
}
void set_page_write(void) // start page write command
{
out_adr2_data(0x5555,0xaa); // 5555:aa adr2,adr1,adr0,data
out_adr2_data(0x2aaa,0x55); // 2aaa:55
out_adr2_data(0x5555,0xa0); // 5555:a0
}
char page_write_128(unsigned char bank_16k,unsigned char hi_lo)
{
unsigned char retry,temp,verify_ok;
retry=retry_time;
while(retry){
set_page_write(); // each page is 128 bytes
set_bank(0x2000,bank_16k); // for MCB1 16k bank
if (bank_16k)
set_ai_data(1,(j|0x40)); // set adr[15..8]
else
set_ai_data(1,j);
set_ai_data(0,hi_lo); // a[7..0]
set_ai_data(2,0x83); // enable flash write inc.
set_ai(3); // read/write data
for (i=0;i<128;i++){
// outportb(port_8,mix.buffer[idx+i]);
// outportb(port_a,0x03); // ndstb=0
// outportb(port_a,0x01); // ndstb=1
write_data(mix.buffer[idx+i]);// write data to eeprom
// outportb(data,mix.buffer[idx+i]);// write data to eeprom
}
set_ai_data(2,0x80); // disable wr/rd inc.
delay_10us();
// delay_20ms();
// set_ai_data(1,0x00); // ce=lo
// set_ai_data(0,hi_lo|0x7f); // point to last address
if (wait_status()){
// printf("write error !!!\n");
return(-1);
}
// verify data
reset_to_read(); // return to read mode
//return(0);
verify_ok=1; // verify ok
set_bank(0x2000,bank_16k); // for MCB1 16k bank
if (bank_16k)
set_ai_data(1,(j|0x40)); // set adr[15..8]
else
set_ai_data(1,j);
set_ai_data(0,hi_lo); // a[7..0]
set_ai_data(2,0x81); // enable inc.
set_ai(3); // read/write data
set_data_read
for (i=0;i<128;i++) { // page=128
temp=read_data();
// temp=inportb(data);
if (temp!=mix.buffer[idx+i]){
// printf(" %x(%x)[%x] ",i,temp,mix.buffer[idx+i]);
verify_ok=0; // verify error
i=128;
}
}
if (verify_ok)
break;
else{
// printf("%d",retry);
retry--;
if (retry==0){
// printf("retry write error!!!\n");
//read_status_reg_cmd();
//wait_status();
//reset_to_read();
return(-1);
}
}
}
idx+=128;
// printf("idx=%x",idx);
return(0);
}
char win_write_eeprom_16k(unsigned char bank_16k)
{
int wr_done,err_cnt;
// printf("w");
// disable_protection();
idx=0;
for (j=0;j<64;j++){ // 16k bytes = 64 x 256 bytes
err_cnt=16; // retry write counter
wr_done=1;
while(wr_done){
// set_ai_data(2,0x80); // disable wr/rd inc.
enable_protection();
// write 256 byte
set_bank(0x2000,bank_16k); // for MCB1 16k bank
if (bank_16k)
set_ai_data(1,(j|0x40)); // set adr[15..8]
else
set_ai_data(1,j);
set_ai_data(0,0); // a[7..0]
// set_ai_data(2,0x82); // enable flash write
set_ai_data(2,0x83); // enable flash write inc.
set_ai(3); // read/write data
// set_ai_data(2,0x80);
for (i=0;i<256;i++){
// set_ai_data(0,i);
// set_ai(3); // read/write data
// out_byte_eeprom(mix.buffer[idx+i]);// write data to eeprom
write_data(mix.buffer[idx+i]);// write data to eeprom
// outportb(data,mix.buffer[idx+i]);// write data to eeprom
}
set_ai_data(2,0x80); // disable wr/rd inc.
set_ai_data(0,0xff); // point to xxff
data_polling();
// printf("write error check(d6)!!!\n");
wr_done=0;
// delay_20ms();
// verify 256 byte
set_ai_data(0,0); // a[7..0]
set_ai_data(2,0x81); // enable read inc.
set_ai(3); // read/write data
set_data_read
for (i=0;i<256;i++){
// set_ai_data(0,i); // a[7..0]
temp=read_data();
// temp=inportb(data);
// printf("%x ",temp);
if(temp!=mix.buffer[idx+i]){
err_cnt--;
//init_port();
//printf("temp=%x buf=%x idx=%x j=%x i=%x\n",temp,mix.buffer[idx+i],idx,j,i);
// printf("X");
// delay_20ms();
wr_done=1;
i=256;
}
}
if (err_cnt==0){
// printf("retry write error!!!\07\n");
return(-1);
}
}
idx=idx+256;
}
// printf(" ok\n");
// enable_protection();
// disable_protection();
// delay_20ms();
return(verify_eeprom_16k(bank_16k));
// return(0);
}
char mx_write_eeprom_16k(unsigned char bank_16k)
{
// printf("w");
idx=0;
for (j=0;j<64;j++){ // 16k bytes = 64 x 256 bytes
if (page_write_128(bank_16k,0)) // write first 128 bytes
return(-1);
if (page_write_128(bank_16k,0x80)) // write second 128 bytes
return(-1);
}
reset_to_read(); // return to read mode
// printf(" ok\n");
// return(0);
return(verify_eeprom_16k(bank_16k));
}
void chk_dsp_name(char chk)
{
char game_name[17];
for (i=0;i<16;i++)
game_name[i]=mix.buffer[i+0x134];
game_name[i]=0;
// printf("Game Name = %s\n",game_name);
cart_type=mix.buffer[0x147];
rom_size=mix.buffer[0x148];
if(cart_type>0 && cart_type<4 && rom_size>4 && chk){ // mbc1 8M/16M
mbc1_exp=1;
// printf("mbc1_exp=1\n");
}
}
char verify_cart_from_file(void)
{
struct ffblk ffblk;
int done;
unsigned char page,num_page;
// printf("Input filename : ");
// scanf("%s",file_name);
done = findfirst(file_name,&ffblk,0);
if (done){
// printf("file not found!\07\n");
return(-1);
}
filesize=ffblk.ff_fsize;
// printf("file length= %ld\n", filesize);
if ((filesize<0x8000) || (filesize & 0x7fff) || (filesize>maxfilesize)){
// printf("filesize error!\07\n");
return(-1);
}
num_page=(filesize/0x8000)*2; // how many 16k banks
// printf("num_page=%d\n",num_page);
if((fptr=fopen(file_name,"rb"))==NULL){/* open error */
// printf("open error !!!\07\n");
return(-1);
}
for (page=0;page<num_page;page++){
if (read_16k_file()!=0){
// printf("load file error\n");
fclose(fptr);
return(-1);
}
if (page==0)
chk_dsp_name(1); // display game name and check mbc1_exp
if (verify_eeprom_16k(page)){
// printf("verify cart error at bank=%x\n",page);
fclose(fptr);
return(-1);
}
}
// printf("verify cart ok\n");
fclose(fptr);
return(0);
}
char write_eeprom_16k(unsigned char bank_16k)
{
if (eeprom_type==4)
return(win_write_eeprom_16k(bank_16k));
if (eeprom_type==16)
return(mx_write_eeprom_16k(bank_16k));
return(-1);
}
char write_cart_from_file(void)
{
struct ffblk ffblk;
int done;
unsigned char page,num_page;
// printf("Input filename : ");
// scanf("%s",file_name);
done = findfirst(file_name,&ffblk,0);
if (done){
// printf("file not found!\07\n");
return(-1);
}
filesize=ffblk.ff_fsize;
// printf("file length= %ld\n", filesize);
if ((filesize<0x8000) || (filesize & 0x7fff) || (filesize>maxfilesize)){
// printf("filesize error!\07\n");
return(-1);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -