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

📄 f3system.c

📁 十七种模拟器源代码 非常有用的作课程设计不可缺少的
💻 C
📖 第 1 页 / 共 2 页
字号:
WRITE_HANDLER(es5510_dsp_wb){  UINT8 *snd_mem = PCMROM;  offset &= 0xfff; // I want the whole offset...#ifdef DUMP  fprintf(stderr,"es5510_dsp_w %x %x\n",offset>>1,data);#endif    //	if (offset>4 && offset!=0x80  && offset!=0xa0  && offset!=0xc0  && offset!=0xe0)//		fprintf(stderr,"%06x: DSP write offset %04x %04x\n",cpu_get_pc(CPU_68K_0),offset,data);  WriteByte(((char*)es5510_dsp_ram)+offset,data);      //fprintf(stderr,"dsp_w %x,%x\n",offset,data);  switch (offset>>1) {  case 0x00: es5510_gpr_latch=(es5510_gpr_latch&0x00ffff)|(data<<16);  case 0x01: es5510_gpr_latch=(es5510_gpr_latch&0xff00ff)|(data<< 8);  case 0x02: es5510_gpr_latch=(es5510_gpr_latch&0xffff00)|(data<< 0);  case 0x03:#ifdef DUMP    fprintf(stderr,"gpr_latch %x (%x)\n",es5510_gpr_latch,data);#endif    break;  case 0x80: /* Read select - GPR + INSTR */    //		fprintf(stderr,"ES5510:  Read GPR/INSTR %06x (%06x)\n",data,es5510_gpr[data]);    /* Check if a GPR is selected */    if (data<0xc0) {      es_tmp=0;      //fprintf(stderr,"return gpr_latch %x\n",data);      es5510_gpr_latch=es5510_gpr[data];    } else es_tmp=1;    break;  case 0xa0: /* Write select - GPR */    //fprintf(stderr,"snd_mem %x latch %x\n",snd_mem[es5510_gpr_latch>>8],es5510_gpr_latch>>8);    es5510_gpr[data]=snd_mem[es5510_gpr_latch>>8];    break;  case 0xc0: /* Write select - INSTR */    //fprintf(stderr,"ES5510:  Write INSTR %06x %06x\n",data,es5510_gpr_latch);    break;  case 0xe0: /* Write select - GPR + INSTR */    //fprintf(stderr,"ES5510:  Write GPR/INSTR %06x %06x\n",data,es5510_gpr_latch);    break;  }}WRITE16_HANDLER(es5510_dsp_w){  //fprintf(stderr,"%06x: DSP write offset %04x %04x\n",cpu_get_pc(CPU_68K_0),offset,data);  fprintf(stderr,"dsp ww\n");  es5510_dsp_wb(offset,data>>8);  es5510_dsp_wb(offset+1,data & 0xff);}static WRITE16_HANDLER( es5505_bank_w ){  /* If game is using a out of range (empty) bank - just set it to the last empty bank */  offset>>=1;  offset &= 0x3f;  data &= 7;  //if (data != 0 && data != 1 && data != 7)  //fprintf(stderr,"bank_w %x,%x (%x)\n",offset,data,max_banks_this_game);  if (data>max_banks_this_game)    ES5506_voice_bank_0_w(offset,(max_banks_this_game)<<20);  else    ES5506_voice_bank_0_w(offset,data<<20);}static WRITE16_HANDLER( volume_control ){  fprintf(stderr,"volume_control offset %d data %d\n",offset&0xf,data);}READ16_HANDLER( trap_rw ) {  return ReadWord68k(&M68000RAM[0x40]);}READ_HANDLER( trap_rb ) {  return M68000RAM[offset];}WRITE_HANDLER( trap_wb ) {  fprintf(stderr,"trap_wb %x,%x\n",offset,data);  M68000RAM[offset]=data;}WRITE16_HANDLER( trap_ww ) {  fprintf(stderr,"trap_ww %x,%x (PC:%x)\n",offset,data,s68000readPC());  WriteWord68k(&M68000RAM[0x40],data);}void setup_sound_68000() {  int7_active = 0;  f3_cycles_68000 = 160000;  f3_slices = 15; // default frame... should be safe !  if(!(M68000RAM=AllocateMem(0x50000))) return;  ByteSwap(M68000ROM,get_region_size(REGION_ROM2));      ByteSwap(M68000RAM,0x050000);  memset(M68000RAM,0x00,0x050000);  memcpy(M68000RAM,M68000ROM,0x8);      memset(f3_shared_ram,0x800,0);  AddMemFetch(0xc00000, 0xcfffff, M68000ROM+0x000000-0xc00000);      // 68000 ROM  AddMemFetch(0x000000, 0x000007, M68000RAM+0x000000-0x000000);      // 68000 ROM  AddMemFetch(-1, -1, NULL);      AddReadBW(0xc00000, 0xcfffff, NULL, M68000ROM+0x000000);   // 68000 ROM  AddRWBW(  0x000000, 0x03FFFF, NULL, M68000RAM+0x000000);   // 68000 RAM      AddReadWord(0x140000, 0x140fff, f3_68000_share_rw, NULL);  AddReadByte(0x140000, 0x140fff, f3_68000_share_rb, NULL);      AddReadByte(0x200000, 0x20001f, ES5505_data_0_rb,NULL);  AddReadWord(0x200000, 0x20001f, ES5505_data_0_r,NULL);  AddReadWord(0x260000, 0x2601ff, es5510_dsp_r, NULL);  AddReadByte(0x260000, 0x2601ff, es5510_dsp_rb, NULL);  AddReadByte(0x280000, 0x28001f, f3_68681_rb,   NULL);  AddReadWord(0x280000, 0x28001f, f3_68681_rdebug,   NULL);  AddRWBW(0xff8000, 0xffffff, NULL, M68000RAM+0x40000);  // Write...      AddWriteWord(0x140000, 0x140fff, f3_68000_share_ww, NULL);  AddWriteByte(0x140000, 0x140fff, f3_68000_share_wb, NULL);  AddWriteWord(0x200000, 0x20001f, ES5505_data_0_ww,NULL);  AddWriteByte(0x200000, 0x20001f, ES5505_data_0_wb,NULL);  AddWriteWord(0x260000, 0x2601ff, es5510_dsp_w, NULL);  AddWriteByte(0x260000, 0x2601ff, es5510_dsp_wb, NULL);  AddWriteByte(0x280000, 0x28001f, f3_68681_wb,   NULL);  AddWriteWord(0x280000, 0x28001f, f3_68681_wb,   NULL);  AddWriteByte(0x300000, 0x30003f, es5505_bank_w,  NULL); // BANK1 ???!   //AddWriteBW(0x340000, 0x34003f, volume_control, NULL);  AddWriteBW(0xc00000, 0xcfffff, DefBadWriteByte, NULL); // ROM  AddRWBW(-1, -1, NULL, NULL);  AddReadByte(0x000000, 0xFFFFFF, DefBadReadByte, NULL);      // <Bad Reads>   AddReadWord(0x000000, 0xFFFFFF, DefBadReadWord, NULL);      // <Bad Reads>  AddWriteByte(0x000000, 0xFFFFFF, DefBadWriteByte, NULL);    // <Bad Writes>  AddWriteWord(0x000000, 0xFFFFFF, DefBadWriteWord, NULL);    // <Bad Writes>  AddInitMemory();   // Set Starscream mem pointers...  AddSaveData(SAVE_USER_0,M68000RAM,0x50000);}    void AddF3MemoryMap(UINT32 romsize){   UINT32 ta;   for(ta=0;ta<0x100;ta++){      R24[ta]=RAM+0x70000;	// SCRATCH RAM   }   R24[0x40]=RAM+0x00000;	// MAIN RAM   R24[0x41]=RAM+0x10000;	// MAIN RAM   R24[0x44]=RAM+0x60000;	// COLOR RAM	($440000-$447FFF)   R24[0x4A]=RAM+0x69000;	// INPUT	($4A0000-$4A00FF)   R24[0x60]=RAM+0x20000;	// OBJECT RAM   R24[0x61]=RAM+0x30000;	// SCREEN RAM   R24[0x62]=RAM+0x40000;	// LINE RAM   R24[0x63]=RAM+0x50000;	// PIXEL RAM   R24[0x66]=RAM+0x6A000;	// SCROLL RAM	($660000-$66001F)   R24[0xC0]=f3_shared_ram; //RAM+0x68000;	// SOUND RAM	($C00000-$C007FF)   for(ta=0;ta<0x100;ta++){      W24[ta]=R24[ta];		// COPY READ>WRITE   }   for(ta=0;ta<(romsize>>16);ta++){      R24[ta]=ROM+(ta<<16);	// 68020 ROM   }   W24[0x4A]=RAM+0x69100;	// OUTPUT	($4A0000-$4A00FF)   EEPROM=RAM+0x6B000;		// EEPROM}static UINT32 lastled;static UINT32 ioc_type;static UINT32 p1_trackball_x;static UINT32 p1_trackball_y;static UINT32 p2_trackball_x;static UINT32 p2_trackball_y;void init_f3_system_ioc(UINT32 type){   lastled  = 0xFFFFFFFF;   ioc_type = type;   add_eeprom(EEPROM, 0x80, EPR_INVALIDATE_ON_ROM_CHANGE);   load_eeprom();   if(ioc_type & F3_IOC_TRACKBALL){      GameMouse = 1;      p1_trackball_x = 0;      p1_trackball_y = 0;      p2_trackball_x = 0;      p2_trackball_y = 0;   }   f3_bg0_id = add_layer_info("BG0");   f3_bg1_id = add_layer_info("BG1");   f3_bg2_id = add_layer_info("BG2");   f3_bg3_id = add_layer_info("BG3");   f3_bg5_id = add_layer_info("FG0");   f3_bg6_id = add_layer_info("Pixel");}//static int scrsav[16];void IntF3System(void){/*   int ta,tc,td;   char tb[256];*/   UINT32 mx,my;   //print_ingame(600,"%04x",ReadWord68k(&RAM[0x4623E]));   // update ioc leds   if(RAM[0x69104]!=lastled){      lastled = RAM[0x69104];      RAM[0x69004] = lastled;			// Write to input (where it should be...)      switch_led(0,(lastled>>2)&1);		// Coin A [Coin Inserted]      switch_led(1,(lastled>>3)&1);		// Coin B [Coin Inserted]      switch_led(2,(lastled>>0)&1);		// Coin A [Ready for coins]      //switch_led(3,(lastled>>1)&1);		// Coin B [Ready for coins]   }   // update trackballs   if(ioc_type & F3_IOC_TRACKBALL){   // map mouse as trackball   get_mouse_mickeys(&mx,&my);   p1_trackball_x += mx;   p1_trackball_y += my;   // map joy/key movement as trackball   if(!(RAM[0x069007]&0x04)) p1_trackball_x -= 12;   if(!(RAM[0x069007]&0x08)) p1_trackball_x += 12;   if(!(RAM[0x069007]&0x01)) p1_trackball_y -= 12;   if(!(RAM[0x069007]&0x02)) p1_trackball_y += 12;   if(!(RAM[0x069007]&0x40)) p2_trackball_x -= 12;   if(!(RAM[0x069007]&0x80)) p2_trackball_x += 12;   if(!(RAM[0x069007]&0x10)) p2_trackball_y -= 12;   if(!(RAM[0x069007]&0x20)) p2_trackball_y += 12;   // write new trackball positions   WriteWord(&RAM[0x06900A],p1_trackball_x);   WriteWord(&RAM[0x06900C],p1_trackball_y);	// could be 0x08   WriteWord(&RAM[0x06900E],p2_trackball_x);   WriteWord(&RAM[0x069010],p2_trackball_y);	// could be 0x0C   // map mouse buttons too   if(mouse_b&1) RAM[0x069003] &= ~0x01;   if(mouse_b&2) RAM[0x069003] &= ~0x02;   }/*   if(ReadWord68k(&RAM[0x68480])!=scrsav0){      ta=ReadWord68k(&RAM[0x68480]);      sprintf(tb,"Sound:");      if(ta<scrsav0){ta+=0x800;}      td=0;      for(tc=scrsav0;tc<ta;tc+=2){         sprintf(tb,"%s%02x",tb,RAM[0x68000+((tc>>1)&0x3FF)]);         td++;         if(td==20){tc=ta;}      }      print_ingame(9000,tb);      scrsav0=ReadWord68k(&RAM[0x68480]);   }*//*   for(ta=0;ta<16;ta++){   if(ReadWord(&RAM[0x6A000+ta+ta])!=scrsav[ta]){      scrsav[ta]=ReadWord(&RAM[0x6A000+ta+ta]);      print_ingame(9000,"%06x: %04x",0x660000+ta+ta,scrsav[ta]);   }   }*/}// EEP-ROM Access Hack Type 1// --------------------------//// EEPROM is 64 words (ie. 128 bytes)void F3SysEEPROMAccessMode1(UINT8 data){   // READ: d0=EEPROM[d0]   if(data==0){      m68k_dreg(regs,0)=ReadWord(&EEPROM[(m68k_dreg(regs,0)&0x3F)<<1]);      return;   }   // WRITE: EEPROM[d0]=d1   if(data==1){      WriteWord(&EEPROM[(m68k_dreg(regs,0)&0x3F)<<1],m68k_dreg(regs,1)&0xFFFF);      return;   }   // SPEED HACK   if(data==2){      Stop68020();      return;   }}// EEP-ROM Access Hack Type 1B// --------------------------//// EEPROM is 64 words (ie. 128 bytes)void F3SysEEPROMAccessMode1B(UINT8 data){   // READ: d1=EEPROM[d0]   if(data==0){      m68k_dreg(regs,1)=ReadWord(&EEPROM[(m68k_dreg(regs,0)&0x3F)<<1]);      return;   }   // WRITE: EEPROM[d0]=d1   if(data==1){      WriteWord(&EEPROM[(m68k_dreg(regs,0)&0x3F)<<1],m68k_dreg(regs,1)&0xFFFF);      return;   }   // SPEED HACK   if(data==2){      Stop68020();      return;   }}// EEP-ROM Access Hack Type 2// --------------------------// d0=Read/Write data// d1=Address Bitcount// Read expects a word in d0void F3SysEEPROMAccessMode2(UINT8 data){   UINT32 ta,tb,tc;   // SPEED HACK   if(data==2){      Stop68020();      return;   }   // READ/WRITE   ta=m68k_dreg(regs,0);   tb=m68k_dreg(regs,1);   if(((ta&0x80000000)!=0)&&(tb==9)){      tc=ReadWord(&EEPROM[(ta&0x3F)<<1]);      m68k_dreg(regs,0)=tc;      return;   }   if(((ta&0x40000000)!=0)&&(tb==25)){      tc=ta&0xFFFF;      WriteWord(&EEPROM[(ta&0x3F0000)>>15],tc);      return;   }}/*Generic Frame*/void ExecuteF3SystemFrame(void){  int ta;  IntF3System();  cpu_interrupt(CPU_M68020_0, 3);	// Interrupt#3 [Video Start]  //fprintf(stderr,"%d ",mycpt);  for (ta=0; ta<f3_slices; ta++) {    cpu_execute_cycles(CPU_M68020_0, CPU_FRAME_MHz(16,60*f3_slices)); //1600000/f3_slices);    if (RaineSoundCard) {      cpu_execute_cycles(CPU_68K_0,CPU_FRAME_MHz(16,60*f3_slices)); // M68000 16MHz (60fps)      if (int7_active) {	f3_timer_callback();      }    }  }  cpu_interrupt(CPU_M68020_0, 5);	// Interrupt#5 [Occasionally used, for timing I think]  cpu_interrupt(CPU_M68020_0, 2);	// Interrupt#2 [Video End]     //cpu_execute_cycles(CPU_M68020_0, 200000);}void ExecuteF3SystemFrame_NoInt5(void){  int ta;  IntF3System();   cpu_interrupt(CPU_M68020_0, 3);	// Interrupt#3 [Video Start]   for (ta=0; ta<f3_slices; ta++) {     cpu_execute_cycles(CPU_M68020_0, 1400000/f3_slices);          if (RaineSoundCard) {       cpu_execute_cycles(CPU_68K_0, CPU_FRAME_MHz(16,60*f3_slices)); // M68000 16MHz (60fps)       if (int7_active) 	 f3_timer_callback();     }   }#ifdef RAINE_DEBUG      print_debug("PC0:%06x SR:%04x\n",regs.pc,regs.sr);#endif   cpu_interrupt(CPU_M68020_0, 2);	// Interrupt#2 [Video End]   cpu_execute_cycles(CPU_M68020_0, 200000);#ifdef RAINE_DEBUG      print_debug("PC1:%06x SR:%04x\n",regs.pc,regs.sr);#endif}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -