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

📄 spacegun.c

📁 十七种模拟器源代码 非常有用的作课程设计不可缺少的
💻 C
📖 第 1 页 / 共 3 页
字号:
      TMP[tb+13]|=((tc&0x0004)<<(1));
      TMP[tb+14]|=((tc&0x0002)<<(2));
      TMP[tb+15]|=((tc&0x0001)<<(3));
      tb+=16;
   }

   if(!(GFX=AllocateMem(0x100000+0xF61000+0x2000))) return;

   te=0;
   if(!load_rom("C57-05", TMP, 0x3D840)) return;		// 64x64 SPRITES
   for(ta=0x100000;ta<(0x100000+0xF61000);ta+=0x1000){
      for(tb=0;tb<8;tb++){
      for(tc=0;tc<4;tc++){
         td=ReadWord(&TMP[te])<<7;
         td+=0xF94B0;
         te+=2;
         for(tf=0;tf<8;tf++){
            WriteLong(&GFX[(tb<<9)+(tc<<4)+(tf<<6)+ta+0],ReadLong(&TMP[td+0]));
            WriteLong(&GFX[(tb<<9)+(tc<<4)+(tf<<6)+ta+4],ReadLong(&TMP[td+4]));
            WriteLong(&GFX[(tb<<9)+(tc<<4)+(tf<<6)+ta+8],ReadLong(&TMP[td+8]));
            WriteLong(&GFX[(tb<<9)+(tc<<4)+(tf<<6)+ta+12],ReadLong(&TMP[td+12]));
            td+=16;
         }
      }
      }
   }

   tb=0;
   if(!load_rom("C57-06", TMP, 0x80000)) return;		// 8x8 BG TILES
   for(ta=0;ta<0x80000;ta+=2){
      GFX[tb+3]=TMP[ta+0]&15;
      GFX[tb+2]=TMP[ta+0]>>4;
      GFX[tb+1]=TMP[ta+1]&15;
      GFX[tb+0]=TMP[ta+1]>>4;
      tb+=4;
   }

   FreeMem(TMP);

   GFX_BG0=GFX+0x000000;
   GFX_SPR=GFX+0x100000;

   GFX_BG0_SOLID = make_solid_mask_8x8(GFX, 0x4000);
   GFX_SPR_SOLID = MakeSolidTileMap64x64(GFX_SPR, 0xF61);

   for(tb=0;tb<0xF61000;tb+=64){			// Flip Y Axis
   for(ta=0;ta<32;ta++){
      tc=GFX_SPR[tb+ta];
      GFX_SPR[tb+ta]=GFX_SPR[tb+63-ta];
      GFX_SPR[tb+63-ta]=tc;
   }
   }

   Init64x64_Table(&GFX[0x100000+0xF61000]);			// $1000x2

   RAMSize=0x50000+0x10000;

   if(!(ROM=AllocateMem(0xC0000))) return;
   if(!(RAM=AllocateMem(RAMSize))) return;

   if(!load_rom("C57-18", RAM, 0x20000)) return;	// MAIN 68000
   for(ta=0;ta<0x20000;ta++){
      ROM[ta+ta]=RAM[ta];
   }
   if(!load_rom("C57-20", RAM, 0x20000)) return;
   for(ta=0;ta<0x20000;ta++){
      ROM[ta+ta+1]=RAM[ta];
   }
   if(!load_rom("C57-17", RAM, 0x20000)) return;
   for(ta=0;ta<0x20000;ta++){
      ROM[ta+ta+0x40000]=RAM[ta];
   }
   if(!load_rom("C57-22", RAM, 0x20000)) return;
   for(ta=0;ta<0x20000;ta++){
      ROM[ta+ta+0x40001]=RAM[ta];
   }

   if(!load_rom("C57-15", RAM, 0x20000)) return;	// SUB 68000
   for(ta=0;ta<0x20000;ta++){
      ROM[ta+ta+0x80000]=RAM[ta];
   }
   if(!load_rom("C57-16", RAM, 0x20000)) return;
   for(ta=0;ta<0x20000;ta++){
      ROM[ta+ta+0x80001]=RAM[ta];
   }

   /*-----[Sound Setup]-----*/

   if(!(PCMROM=AllocateMem(0x100000))) return;
   if(!load_rom("C57-08",PCMROM+0x00000,0x80000)) return;	// ADPCM A rom
   if(!load_rom("C57-07",PCMROM+0x80000,0x80000)) return;	// ADPCM A rom
   YM2610SetBuffers(PCMROM, PCMROM+0x80000, 0x80000, 0x80000);

   Pan2610_OffsetVol( 4 );	/* set volume shift size */

   /*-----------------------*/

   memset(RAM+0x00000,0x00,0x48000);

   RAM_VIDEO  = RAM+0x10000;
   RAM_SCROLL = RAM+0x24800;
   RAM_INPUT  = RAM+0x44000;
   GFX_FG0    = RAM+0x48000;

   set_colour_mapper(&col_map_xrrr_rrgg_gggb_bbbb);
   InitPaletteMap(RAM+0x38000, 0x100, 0x10, 0x8000);


   tc0110pcr_init(RAM+0x38000, 1);

   ROM[0x23C0]=0x4E;		// V-PROG ROM ERROR
   ROM[0x23C1]=0x71;
   ROM[0x23C2]=0x4E;
   ROM[0x23C3]=0x71;

   ROM[0x80E74]=0x4E;		// M-PROG ROM ERROR
   ROM[0x80E75]=0x71;

   ROM[0x23D2]=0x4E;		// EE-ROM ERROR
   ROM[0x23D3]=0x71;
   ROM[0x23D4]=0x4E;
   ROM[0x23D5]=0x71;

   ROM[0x80076]=0x0B;		// INT#5
   ROM[0x80077]=0xF2;

   ROM[0x80BF2]=0x48;		// IMPROVE INT#5
   ROM[0x80BF3]=0xE7;
   ROM[0x80BF4]=0xC0;
   ROM[0x80BF5]=0xC0;

   ROM[0x809A6]=0x13;		// move.b #$00,$AA0000
   ROM[0x809A7]=0xFC;		// Speed Hack
   ROM[0x809A8]=0x00;
   ROM[0x809A9]=0x00;
   ROM[0x809AA]=0x00;
   ROM[0x809AB]=0xAA;
   ROM[0x809AC]=0x00;
   ROM[0x809AD]=0x00;

   ROM[0x809AE]=0x60;
   ROM[0x809AF]=0xF6;

   ROM[0x9AA]=0x13;		// move.b #$00,$AA0000
   ROM[0x9AB]=0xFC;		// Speed Hack
   ROM[0x9AC]=0x00;
   ROM[0x9AD]=0x00;
   ROM[0x9AE]=0x00;
   ROM[0x9AF]=0xAA;
   ROM[0x9B0]=0x00;
   ROM[0x9B1]=0x00;

   // Init tc0220ioc emulation
   // ------------------------

   tc0220ioc.RAM  = RAM_INPUT;
   tc0220ioc.ctrl = 0;		//TC0220_STOPCPU;
   reset_tc0220ioc();

   // Init tc0100scn emulation
   // ------------------------

   tc0100scn[0].layer[0].RAM	=RAM_VIDEO+0x0000;
   tc0100scn[0].layer[0].GFX	=GFX;
   tc0100scn[0].layer[0].MASK	=GFX_BG0_SOLID;
   tc0100scn[0].layer[0].SCR	=RAM_SCROLL+0;
   tc0100scn[0].layer[0].type	=0;
   tc0100scn[0].layer[0].bmp_x	=64;
   tc0100scn[0].layer[0].bmp_y	=64;
   tc0100scn[0].layer[0].bmp_w	=320;
   tc0100scn[0].layer[0].bmp_h	=240;
   tc0100scn[0].layer[0].mapper	=&Map_15bit_xRGB;
   tc0100scn[0].layer[0].tile_mask=0x3FFF;
   tc0100scn[0].layer[0].scr_x	=20;
   tc0100scn[0].layer[0].scr_y	=8;

   tc0100scn[0].layer[1].RAM	=RAM_VIDEO+0x8000;
   tc0100scn[0].layer[1].GFX	=GFX;
   tc0100scn[0].layer[1].MASK	=GFX_BG0_SOLID;
   tc0100scn[0].layer[1].SCR	=RAM_SCROLL+2;
   tc0100scn[0].layer[1].type	=0;
   tc0100scn[0].layer[1].bmp_x	=64;
   tc0100scn[0].layer[1].bmp_y	=64;
   tc0100scn[0].layer[1].bmp_w	=320;
   tc0100scn[0].layer[1].bmp_h	=240;
   tc0100scn[0].layer[1].mapper	=&Map_15bit_xRGB;
   tc0100scn[0].layer[1].tile_mask=0x3FFF;
   tc0100scn[0].layer[1].scr_x	=20;
   tc0100scn[0].layer[1].scr_y	=8;

   tc0100scn[0].layer[2].RAM	=RAM_VIDEO+0x4000;
   tc0100scn[0].layer[2].GFX	=GFX_FG0;
   tc0100scn[0].layer[2].SCR	=RAM_SCROLL+4;
   tc0100scn[0].layer[2].type	=3;
   tc0100scn[0].layer[2].bmp_x	=64;
   tc0100scn[0].layer[2].bmp_y	=64;
   tc0100scn[0].layer[2].bmp_w	=320;
   tc0100scn[0].layer[2].bmp_h	=240;
   tc0100scn[0].layer[2].mapper	=&Map_15bit_xRGB;
   tc0100scn[0].layer[2].scr_x	=20;
   tc0100scn[0].layer[2].scr_y	=8;

   tc0100scn[0].RAM     = RAM_VIDEO;
   tc0100scn[0].GFX_FG0 = GFX_FG0;

   init_tc0100scn(0);

/*
 *  StarScream Stuff follows
 */

   ByteSwap(ROM,0xC0000);
   ByteSwap(RAM,0x48000);

   AddMemFetch(0x000000, 0x07FFFF, ROM+0x000000-0x000000);	// 68000 ROM
   AddMemFetch(-1, -1, NULL);

   AddReadByte(0x000000, 0x07FFFF, NULL, ROM+0x000000);			// 68000 ROM
   AddReadByte(0x310000, 0x31FFFF, NULL, RAM+0x000000);			// MAIN RAM
   AddReadByte(0x900000, 0x90FFFF, NULL, RAM_VIDEO);			// SCREEN RAM
   AddReadByte(0x30C000, 0x30FFFF, NULL, RAM+0x020000);			// V-WORK RAM
   AddReadByte(0x000000, 0xFFFFFF, BadReadByte, NULL);			// <Bad Reads>
   AddReadByte(-1, -1, NULL, NULL);

   AddReadWord(0x000000, 0x07FFFF, NULL, ROM+0x000000);			// 68000 ROM
   AddReadWord(0x30C000, 0x30FFFF, NULL, RAM+0x020000);			// V-WORK RAM
   AddReadWord(0x310000, 0x31FFFF, NULL, RAM+0x000000);			// MAIN RAM
   AddReadWord(0x900000, 0x90FFFF, NULL, RAM_VIDEO);			// SCREEN RAM
   AddReadWord(0xB00000, 0xB00007, tc0110pcr_rw, NULL);			// COLOR RAM
   AddReadWord(0x500000, 0x5007FF, NULL, RAM+0x024000);			// OBJECT RAM
   AddReadWord(0x000000, 0xFFFFFF, BadReadWord, NULL);			// <Bad Reads>
   AddReadWord(-1, -1,NULL, NULL);

   AddWriteByte(0x310000, 0x31FFFF, NULL, RAM+0x000000);		// MAIN RAM
   AddWriteByte(0x906000, 0x906FFF, tc0100scn_0_gfx_fg0_wb, NULL);	// FG0 GFX RAM
   AddWriteByte(0x900000, 0x90FFFF, NULL, RAM_VIDEO);			// SCREEN RAM
   AddWriteByte(0xAA0000, 0xAA0001, Stop68000, NULL);			// Trap Idle 68000
   AddWriteByte(0x000000, 0xFFFFFF, BadWriteByte, NULL);		// <Bad Writes>
   AddWriteByte(-1, -1, NULL, NULL);

   AddWriteWord(0x30C000, 0x30FFFF, NULL, RAM+0x020000);		// V-WORK RAM
   AddWriteWord(0x310000, 0x31FFFF, NULL, RAM+0x000000);		// MAIN RAM
   AddWriteWord(0x500000, 0x5007FF, NULL, RAM+0x024000);		// OBJECT RAM
   AddWriteWord(0x906000, 0x906FFF, tc0100scn_0_gfx_fg0_ww, NULL);	// FG0 GFX RAM
   AddWriteWord(0x900000, 0x90FFFF, NULL, RAM_VIDEO);			// SCREEN RAM
   AddWriteWord(0x920000, 0x92000F, NULL, RAM_SCROLL);			// SCROLL RAM
   AddWriteWord(0xB00000, 0xB00007, tc0110pcr_ww, NULL);		// COLOR RAM
   AddWriteWord(0x000000, 0xFFFFFF, BadWriteWord, NULL);		// <Bad Writes>
   AddWriteWord(-1, -1, NULL, NULL);

   AddInitMemory();	// Set Starscream mem pointers... 


   AddMemFetchMC68000B(0x000000, 0x03FFFF, ROM+0x080000-0x000000);	// 68000 ROM
   AddMemFetchMC68000B(-1, -1, NULL);

   AddReadByteMC68000B(0x000000, 0x03FFFF, NULL, ROM+0x080000);			// 68000 ROM
   AddReadByteMC68000B(0x20C000, 0x20FFFF, NULL, RAM+0x040000);			// SUB LOCAL RAM
   AddReadByteMC68000B(0x210000, 0x21FFFF, NULL, RAM+0x000000);			// COMMON RAM
   AddReadByteMC68000B(0x800000, 0x80000F, NULL, RAM_INPUT);			// INPUT
   AddReadByteMC68000B(0x000000, 0xFFFFFF, BadReadByte, NULL);			// <Bad Reads>
   AddReadByteMC68000B(-1, -1, NULL, NULL);

   AddReadWordMC68000B(0x000000, 0x03FFFF, NULL, ROM+0x080000);			// 68000 ROM
   AddReadWordMC68000B(0x20C000, 0x20FFFF, NULL, RAM+0x040000);			// SUB LOCAL RAM
   AddReadWordMC68000B(0x210000, 0x21FFFF, NULL, RAM+0x000000);			// COMMON RAM
   AddReadWordMC68000B(0x800000, 0x80000F, NULL, RAM_INPUT);			// INPUT
   AddReadWordMC68000B(0xC00000, 0xC00007, YM2610Read68k, NULL);		// YM2610
   AddReadWordMC68000B(0x000000, 0xFFFFFF, BadReadWord, NULL);			// <Bad Reads>
   AddReadWordMC68000B(-1, -1, NULL, NULL);

   AddWriteByteMC68000B(0x20C000, 0x20FFFF, NULL, RAM+0x040000);		// SUB LOCAL RAM
   AddWriteByteMC68000B(0x210000, 0x21FFFF, NULL, RAM+0x000000);		// COMMON RAM
   AddWriteByteMC68000B(0x800000, 0x80000F, tc0220ioc_wb, NULL);		// INPUT
   AddWriteByteMC68000B(0xAA0000, 0xAA0001, Stop68000, NULL);			// Trap Idle 68000
   //AddWriteByteMC68000B(0x000000, 0xFFFFFF, BadWriteByte, NULL);		// <Bad Writes>
   AddWriteByteMC68000B(-1, -1, NULL, NULL);

   AddWriteWordMC68000B(0x20C000, 0x20FFFF, NULL, RAM+0x040000);		// SUB LOCAL RAM
   AddWriteWordMC68000B(0x210000, 0x21FFFF, NULL, RAM+0x000000);		// COMMON RAM
   AddWriteWordMC68000B(0xC00000, 0xC00007, YM2610Write68k, NULL);		// YM2610
   AddWriteWordMC68000B(0xC20000, 0xC20007, PanWrite, NULL);                    // PANNING
   AddWriteWordMC68000B(0x800000, 0x80000F, tc0220ioc_ww, NULL);		// INPUT
   //AddWriteWordMC68000B(0x000000, 0xFFFFFF, BadWriteWord, NULL);		// <Bad Writes>
   AddWriteWordMC68000B(-1, -1, NULL, NULL);

   AddInitMemoryMC68000B();	// Set Starscream mem pointers... 

   GameMouse=1;
}

void ClearSpaceGun(void)
{
   #ifdef RAINE_DEBUG
      //save_debug("RAM.bin",RAM,0x048000,1);
   #endif
}

static int x1,x2,myy1,y2,x11,myy11;

void ExecuteSpaceGunFrame(void)
{


/*----------[Start of Player 1 Gun Input Emulation]------------*/



/* User selects mouse control on fake dipswitch - Default */
if ((RAM[0x44005] &0x20) && (RAM[0x44005] &0x10)){

 if (RAM[0x44005] &0x4)                //Slow
    {set_mouse_range(0,0,319,239);
    x11=319-mouse_x;
    myy11=mouse_y;}

 else                                  //Fast
    {set_mouse_range(0,0,159,119);
    x11=319-(mouse_x*2);
    myy11=(mouse_y*2);}

    x1=(x11<<7)/320;
    myy1=(myy11<<7)/240;

    if(x1<0){x1=0;}
    if(x1>127){x1=127;}

⌨️ 快捷键说明

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