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

📄 darius.c

📁 十七种模拟器源代码 非常有用的作课程设计不可缺少的
💻 C
📖 第 1 页 / 共 3 页
字号:
   WriteWord68k(&ROM[0x013c4],0x4E71);   // Fix Sub 68000 Checksum   WriteLong68k(&ROM[0x60A0A],0x4E714E71);   }        memset(RAM+0x00000,0x00,0x44000);   InitPaletteMap(RAM+0x31000, 0x80, 0x10, 0x8000);   // Main 68000 Memory Map   // ---------------------   ByteSwap(ROM,0xA0000);   ByteSwap(RAM,0x44000);   AddMemFetch(0x000000, 0x05FFFF, ROM+0x000000-0x000000);	// 68000 ROM   AddMemFetch(-1, -1, NULL);   AddReadByte(0x000000, 0x05FFFF, NULL, ROM+0x000000);			// 68000 ROM   AddReadByte(0x080000, 0x08FFFF, NULL, RAM+0x000000);			// MAIN RAM   AddReadByte(0xD00000, 0xD0FFFF, NULL, RAM+0x010000);			// SCREEN RAM   AddReadByte(0xE00000, 0xE10FFF, NULL, RAM+0x020000);			// COMMON RAM   AddReadByte(0xC00000, 0xC000FF, darius_ioc_rb, NULL);		// I/O   AddReadByte(0x000000, 0xFFFFFF, DefBadReadByte, NULL);		// <Bad Reads>   AddReadByte(-1, -1, NULL, NULL);   AddReadWord(0x000000, 0x05FFFF, NULL, ROM+0x000000);			// 68000 ROM   AddReadWord(0x080000, 0x08FFFF, NULL, RAM+0x000000);			// MAIN RAM   AddReadWord(0xD00000, 0xD0FFFF, NULL, RAM+0x010000);			// SCREEN RAM   AddReadWord(0xD80000, 0xD80FFF, NULL, RAM+0x031000);			// COLOUR RAM   AddReadWord(0xE00000, 0xE10FFF, NULL, RAM+0x020000);			// COMMON RAM   AddReadWord(0xC00000, 0xC000FF, darius_ioc_rw, NULL);		// I/O   AddReadWord(0x000000, 0xFFFFFF, BadReadWord, NULL);			// <Bad Reads>   AddReadWord(-1, -1,NULL, NULL);   AddWriteByte(0x080000, 0x08FFFF, NULL, RAM+0x000000);		// MAIN RAM   AddWriteByte(0xD00000, 0xD0FFFF, NULL, RAM+0x010000);		// SCREEN RAM   AddWriteByte(0xE00000, 0xE10FFF, NULL, RAM+0x020000);		// COMMON RAM   AddWriteByte(0xC00000, 0xC000FF, darius_ioc_wb, NULL);		// I/O   AddWriteByte(0xAA0000, 0xAA0001, Stop68000, NULL);			// Trap Idle 68000   AddWriteByte(0x000000, 0xFFFFFF, DefBadWriteByte, NULL);		// <Bad Writes>   AddWriteByte(-1, -1, NULL, NULL);   AddWriteWord(0x080000, 0x08FFFF, NULL, RAM+0x000000);		// MAIN RAM   AddWriteWord(0xD00000, 0xD0FFFF, NULL, RAM+0x010000);		// SCREEN RAM   AddWriteWord(0xD80000, 0xD80FFF, NULL, RAM+0x031000);		// COLOUR RAM   AddWriteWord(0xE00000, 0xE10FFF, NULL, RAM+0x020000);		// COMMON RAM   AddWriteWord(0xD20000, 0xD20003, NULL, RAM+0x042100);		// YSCROLL RAM   AddWriteWord(0xD40000, 0xD40003, NULL, RAM+0x042200);		// XSCROLL RAM   AddWriteWord(0xC00000, 0xC000FF, darius_ioc_ww, NULL);		// I/O   AddWriteWord(0x000000, 0xFFFFFF, BadWriteWord, NULL);		// <Bad Writes>   AddWriteWord(-1, -1, NULL, NULL);   AddInitMemory();	// Set Starscream mem pointers...    // Sub 68000 Memory Map   // --------------------   AddMemFetchMC68000B(0x000000, 0x03FFFF, ROM+0x060000-0x000000);	// 68000 ROM   AddMemFetchMC68000B(-1, -1, NULL);   AddReadByteMC68000B(0x000000, 0x03FFFF, NULL, ROM+0x060000);		// 68000 ROM   AddReadByteMC68000B(0x040000, 0x04FFFF, NULL, RAM+0x032000);		// SUB LOCAL RAM   AddReadByteMC68000B(0xE00000, 0xE10FFF, NULL, RAM+0x020000);		// COMMON RAM   AddReadByteMC68000B(0x000000, 0xFFFFFF, DefBadReadByte, NULL);	// <Bad Reads>   AddReadByteMC68000B(-1, -1, NULL, NULL);   AddReadWordMC68000B(0x000000, 0x03FFFF, NULL, ROM+0x060000);		// 68000 ROM   AddReadWordMC68000B(0x040000, 0x04FFFF, NULL, RAM+0x032000);		// SUB LOCAL RAM   AddReadWordMC68000B(0xD80000, 0xD80FFF, NULL, RAM+0x031000);		// COLOUR RAM   AddReadWordMC68000B(0xE00000, 0xE10FFF, NULL, RAM+0x020000);		// COMMON RAM   AddReadWordMC68000B(0x000000, 0xFFFFFF, BadReadWord, NULL);		// <Bad Reads>   AddReadWordMC68000B(-1, -1, NULL, NULL);   AddWriteByteMC68000B(0x040000, 0x04FFFF, NULL, RAM+0x032000);	// SUB LOCAL RAM   AddWriteByteMC68000B(0xE00000, 0xE10FFF, NULL, RAM+0x020000);	// COMMON RAM   AddWriteByteMC68000B(0xAA0000, 0xAA0001, Stop68000, NULL);		// Trap Idle 68000   AddWriteByteMC68000B(0x000000, 0xFFFFFF, DefBadWriteByte, NULL);	// <Bad Writes>   AddWriteByteMC68000B(-1, -1, NULL, NULL);   AddWriteWordMC68000B(0x040000, 0x04FFFF, NULL, RAM+0x032000);	// SUB LOCAL RAM   AddWriteWordMC68000B(0xD80000, 0xD80FFF, NULL, RAM+0x031000);	// COLOUR RAM   AddWriteWordMC68000B(0xE00000, 0xE10FFF, NULL, RAM+0x020000);	// COMMON RAM   AddWriteWordMC68000B(0xC00000, 0xC000FF, NULL, RAM+0x042000);	// I/O RAM   AddWriteWordMC68000B(0x000000, 0xFFFFFF, BadWriteWord, NULL);	// <Bad Writes>   AddWriteWordMC68000B(-1, -1, NULL, NULL);   AddInitMemoryMC68000B();	// Set Starscream mem pointers... }void LoadDarius(void){   LoadActual(0);}void LoadDariusExtra(void){   LoadActual(1);}void LoadDariusAlt(void){   LoadActual(2);}void LoadDariuso(void){   LoadActual(3);}void ClearDarius(void){   RemoveTaitoSoundBanking();}void ExecuteDariusFrame(void){   tcpu=0;   cpu_execute_cycles(CPU_68K_0, CPU_FRAME_MHz(12,60));	// M68000 12MHz (60fps)   tcpu=1;   cpu_execute_cycles(CPU_68K_1, 90000*2);   tcpu=0;   cpu_execute_cycles(CPU_68K_0, CPU_FRAME_MHz(12,60));	// M68000 12MHz (60fps)   #ifdef RAINE_DEBUG      print_debug("PC0:%06x SR0:%04x\n",s68000context.pc,s68000context.sr);   #endif   cpu_interrupt(CPU_68K_0, 4);   tcpu=1;   cpu_execute_cycles(CPU_68K_1, 90000*2);   #ifdef RAINE_DEBUG      print_debug("PC1:%06x SR1:%04x\n",s68000context.pc,s68000context.sr);   #endif   cpu_interrupt(CPU_68K_1, 4);   if(tc0140syt_want_nmi()!=0) cpu_int_nmi(CPU_Z80_0);   //cpu_execute_cycles(CPU_Z80_0, 4000000/60*2);			// Sound Main Z80   cpu_execute_cycles(CPU_Z80_0, 5000000/60);			// Sound Main Z80   /*#ifdef RAINE_DEBUG      print_debug("Z80PC0:%04x\n",z80pc);   #endif*/   cpu_interrupt(CPU_Z80_0, 0x38);}void DrawDarius(void){   int x,y,ta,zz,zzz,zzzz;   int x16,y16;   UINT8 *map;   ClearPaletteMap();   // BG0   // ---   MAKE_SCROLL_1024x512_2_8(      0-(ReadWord(&RAM[0x42200])),      0-(ReadWord(&RAM[0x42100]))   );   START_SCROLL_1024x512_2_8(32,32,864,224);      ta = ReadWord(&RAM[0x14000+zz])&0x3FFF;      MAP_PALETTE_MAPPED(         Map_15bit_xBGR,         RAM[0x10000+zz]&0x3F,         16,         map      );      switch(RAM[0x10001+zz]&0xC0){         case 0x00: Draw8x8_Mapped(&GFX_BG0[ta<<6],x,y,map);        break;         case 0x40: Draw8x8_Mapped_FlipY(&GFX_BG0[ta<<6],x,y,map);  break;         case 0x80: Draw8x8_Mapped_FlipX(&GFX_BG0[ta<<6],x,y,map);  break;         case 0xC0: Draw8x8_Mapped_FlipXY(&GFX_BG0[ta<<6],x,y,map); break;      }   END_SCROLL_1024x512_2_8();   // OBJECT   // ------   for(zz=0x20FF8;zz>=0x20100;zz-=8){   x=(32+ReadWord(&RAM[zz+2]))&0x3FF;   y=((240+32)-ReadWord(&RAM[zz]))&0x1FF;   if((x>16)&&(y>16)&&(x<864+32)&&(y<224+32)){   ta=ReadWord(&RAM[zz+4])&0x1FFF;   if(GFX_SPR_SOLID[ta]){			// No pixels; skip      MAP_PALETTE_MAPPED(         Map_15bit_xBGR,         RAM[zz+6]&0x7F,         16,         map      );      if(GFX_SPR_SOLID[ta]==1){			// Some pixels; trans         switch(RAM[zz+5]&0xC0){         case 0x00: Draw16x16_Trans_Mapped(&GFX_SPR[ta<<8],x,y,map);        break;         case 0x40: Draw16x16_Trans_Mapped_FlipY(&GFX_SPR[ta<<8],x,y,map);  break;         case 0x80: Draw16x16_Trans_Mapped_FlipX(&GFX_SPR[ta<<8],x,y,map);  break;         case 0xC0: Draw16x16_Trans_Mapped_FlipXY(&GFX_SPR[ta<<8],x,y,map); break;         }      }      else{					// all pixels; solid         switch(RAM[zz+5]&0xC0){         case 0x00: Draw16x16_Mapped(&GFX_SPR[ta<<8],x,y,map);        break;         case 0x40: Draw16x16_Mapped_FlipY(&GFX_SPR[ta<<8],x,y,map);  break;         case 0x80: Draw16x16_Mapped_FlipX(&GFX_SPR[ta<<8],x,y,map);  break;         case 0xC0: Draw16x16_Mapped_FlipXY(&GFX_SPR[ta<<8],x,y,map); break;         }      }   }   }   }   // BG1   // ---   MAKE_SCROLL_1024x512_2_8(      0-(ReadWord(&RAM[0x42202])),      0-(ReadWord(&RAM[0x42102]))   );   START_SCROLL_1024x512_2_8(32,32,864,224);   ta=ReadWord(&RAM[0x1C000+zz])&0x3FFF;   if(GFX_BG0_SOLID[ta]){			// No pixels; skip      MAP_PALETTE_MAPPED(         Map_15bit_xBGR,         RAM[0x18000+zz]&0x3F,         16,         map      );      if(GFX_BG0_SOLID[ta]==1){			// Some pixels; trans         switch(RAM[0x18001+zz]&0xC0){            case 0x00: Draw8x8_Trans_Mapped(&GFX_BG0[ta<<6],x,y,map);        break;            case 0x40: Draw8x8_Trans_Mapped_FlipY(&GFX_BG0[ta<<6],x,y,map);  break;            case 0x80: Draw8x8_Trans_Mapped_FlipX(&GFX_BG0[ta<<6],x,y,map);  break;            case 0xC0: Draw8x8_Trans_Mapped_FlipXY(&GFX_BG0[ta<<6],x,y,map); break;         }      }      else{					// all pixels; solid         switch(RAM[0x18001+zz]&0xC0){            case 0x00: Draw8x8_Mapped(&GFX_BG0[ta<<6],x,y,map);        break;            case 0x40: Draw8x8_Mapped_FlipY(&GFX_BG0[ta<<6],x,y,map);  break;            case 0x80: Draw8x8_Mapped_FlipX(&GFX_BG0[ta<<6],x,y,map);  break;            case 0xC0: Draw8x8_Mapped_FlipXY(&GFX_BG0[ta<<6],x,y,map); break;         }      }   }   END_SCROLL_1024x512_2_8();   // FG0   // ---   zz=0;   for(y=32;y<224+32;y+=8){   for(x=32;x<864+32;x+=8){   ta=ReadWord(&RAM[0x2C000+zz])&0x7FF;   if(GFX_FG0_SOLID[ta]){			// No pixels; skip      MAP_PALETTE_MAPPED(         Map_15bit_xBGR,         RAM[0x28000+zz]&0x0F,         4,			// 4 Colours         map      );      if(GFX_FG0_SOLID[ta]==1)			// Some pixels; trans         Draw8x8_Trans_Mapped(&GFX_FG0[ta<<6],x,y,map);      else					// all pixels; solid         Draw8x8_Mapped(&GFX_FG0[ta<<6],x,y,map);   }   zz+=2;   }   zz+=(256-216);   }}/*-------[YM2203 PORT]-------*/UINT16 DariusRead_YM2203A(UINT16 offset){#if 1  static int aaaa = 0, cnt = 0;  if( ++cnt > 200 ){    aaaa = 255;    cnt = 0;  } else{    aaaa = 0;  }  return(aaaa);#else  if((offset&1)==0){    return  YM2203_status_port_0_r(0);  } else{    return YM2203_read_port_0_r(0);  }#endif}void DariusWrite_YM2203A(UINT16 offset, UINT8 data){   if((offset&1)==0){      YM2203_control_port_0_w(0,data);   }   else{      YM2203_write_port_0_w(0,data);   }}/*-------[YM2203 PORT]-------*/UINT16 DariusRead_YM2203B(UINT16 offset){#if 1  static int aaaa;  aaaa^=255;  return(aaaa);#else  if((offset&1)==0){    return YM2203_status_port_1_r(0);  } else{    return YM2203_read_port_1_r(0);  }#endif}void DariusWrite_YM2203B(UINT16 offset, UINT8 data){   if((offset&1)==0){      YM2203_control_port_1_w(0,data);   }   else{      YM2203_write_port_1_w(0,data);   }}/*-------[ADPCM PORT]-------*/void DariusWrite_ADPCM(UINT16 offset, UINT8 data){   /*#ifdef RAINE_DEBUG      print_debug("DariusADPCM(%02x)\n",data);   #endif*/   data&=0x7F;   if((data>0)&&(data<=0x1D)){     MSM5205buffer_request( 0, data );   }}static int DariusVolTable[] = {  0x00, 0x08, 0x10, 0x18, 0x20, 0x28, 0x30, 0x38,  0x40, 0x50, 0x60, 0x80, 0xa0, 0xc0, 0xe0, 0xf0,};static int darius_volFM[2];static int darius_volAY[2];static int darius_panFM[2];static int darius_panAY[2];void DariusYM2203SetFMPan( UINT16 offset, UINT8 data ){  int cen;  if( !(offset&0x0400) ){    /**** make FM0 ****/    darius_panFM[0] = (~data)&0xff;    saSetPan( YM2203_get_stream_num(0), darius_panFM[0] );    cen = darius_panFM[0] < 0x80 ? 0x80 - darius_panFM[0] : -(0x80 - darius_panFM[0]);    data = darius_volFM[0] - ((darius_volFM[0] * cen)>>8);    //saSetVolume( YM2203_get_stream_num(0), data );    //print_ingame(120,"Pan[0]:%02x %s", darius_panFM[0], stream_get_name(YM2203_get_stream_num(0)) );  } else{    darius_panFM[1] = (~data)&0xff;    saSetPan( YM2203_get_stream_num(1), darius_panFM[1] );    cen = darius_panFM[1] < 0x80 ? 0x80 - darius_panFM[1] : -(0x80 - darius_panFM[1]);    data = darius_volFM[1] - ((darius_volFM[1] * cen)>>8);    //saSetVolume( YM2203_get_stream_num(1), data );    //print_ingame(120,"Pan[1]:%02x %s", darius_panFM[1], stream_get_name(YM2203_get_stream_num(1)) );  }}void DariusYM2203SetAYPan( UINT16 offset, UINT8 data ){  int cen;  if( !(offset&0x0400) ){    darius_panAY[0] = (~data)&0xff;    darius_volAY[0] = 0xff;    saSetPanMulti( AY8910_get_stream_num(0), darius_panAY[0] );    cen = darius_panAY[0] < 0x80 ? 0x80 - darius_panAY[0] : -(0x80 - darius_panAY[0]);    data = darius_volAY[0] - ((darius_volAY[0] * cen)>>8);    //saSetVolume( AY8910_get_stream_num(0), data );  } else{    darius_panAY[1] = (~data)&0xff;    darius_volAY[1] = 0xff;    saSetPanMulti( AY8910_get_stream_num(1), darius_panAY[1] );    cen = darius_panAY[1] < 0x80 ? 0x80 - darius_panAY[1] : -(0x80 - darius_panAY[1]);    data = darius_volAY[1] - ((darius_volAY[1] * cen)>>8);    //saSetVolume( AY8910_get_stream_num(1), data );  }}void DariusVol( int offset, int data ){  int cen;  if( (data&0xf0) == 0xf0 ){    //print_ingame(120,"Vol:%02x %s %s", data, stream_get_name(3*2), stream_get_name(3*2+1) );    darius_volFM[0] = DariusVolTable[data&0x0f];    darius_volFM[1] = darius_volFM[0];    /**** make FM0 ****/    cen = darius_panFM[0] < 0x80 ? 0x80 - darius_panFM[0] : -(0x80 - darius_panFM[0]);    data = darius_volFM[0] - ((darius_volFM[0] * cen)>>8);    //saSetVolume( YM2203_get_stream_num(0), data );    /**** make FM1 ****/    cen = darius_panFM[1] < 0x80 ? 0x80 - darius_panFM[1] : -(0x80 - darius_panFM[1]);    data = darius_volFM[1] - ((darius_volFM[1] * cen)>>8);    //saSetVolume( YM2203_get_stream_num(1), data );  }}void DariusMSM5205SetPan( UINT16 offset, UINT8 data ){  MSM5205buffer_setpan( 0, data );}/**************** end of file ****************/

⌨️ 快捷键说明

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