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

📄 bung.cpp

📁 bung.cpp bung.dfm bung.h DbgWarn.cpp DbgWarn.dfm DbgWarn.h Debug.cpp Debug.dfm Debug.h Emu.cpp Emu
💻 CPP
📖 第 1 页 / 共 4 页
字号:
//---------------------------------------------------------------------------
#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 + -