📄 f3system.c
字号:
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 + -