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

📄 bung.cpp

📁 一个gba的模拟器源代码
💻 CPP
📖 第 1 页 / 共 4 页
字号:




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 + -