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

📄 terrac.c

📁 十七种模拟器源代码 非常有用的作课程设计不可缺少的
💻 C
字号:
/******************************************************************************//*                                                                            *//*                    TERRA CRESTA (C) 1985 NICHIBUTSU                        *//*                                                                            *//******************************************************************************/#include "gameinc.h"#include "terrac.h"#include "nichisnd.h"static struct DIR_INFO terra_cresta_dirs[] ={   { "terra_cresta", },   { "terracre", },   { NULL, },};static struct ROM_INFO terra_cresta_roms[] ={   {    "1a_4b.rom", 0x00004000, 0x76f17479, 0, 0, 0, },   {    "1a_6b.rom", 0x00004000, 0xba4b5822, 0, 0, 0, },   {    "1a_7b.rom", 0x00004000, 0xd0771bba, 0, 0, 0, },   {    "1a_9b.rom", 0x00004000, 0x69227b56, 0, 0, 0, },   {    "1a_4d.rom", 0x00004000, 0x8119f06e, 0, 0, 0, },   {    "1a_6d.rom", 0x00004000, 0xca4852f6, 0, 0, 0, },   {    "1a_7d.rom", 0x00004000, 0x029d59d9, 0, 0, 0, },   {    "1a_9d.rom", 0x00004000, 0x5a672942, 0, 0, 0, },   {   "1a_15f.rom", 0x00008000, 0x984a597f, 0, 0, 0, },   {   "1a_17f.rom", 0x00008000, 0x30e297ff, 0, 0, 0, },   {   "2a_16b.rom", 0x00002000, 0x591a3804, 0, 0, 0, },   {   "2a_15b.rom", 0x00004000, 0x604c3b11, 0, 0, 0, },   {   "2a_17b.rom", 0x00004000, 0xaffc898d, 0, 0, 0, },   {   "2a_18b.rom", 0x00004000, 0x302dc0ab, 0, 0, 0, },   {    "2a_6g.rom", 0x00004000, 0x4a9ec3e6, 0, 0, 0, },   {    "2a_7g.rom", 0x00004000, 0x450749fc, 0, 0, 0, },   {    "2a_6e.rom", 0x00004000, 0xbcf7740b, 0, 0, 0, },   {    "2a_7e.rom", 0x00004000, 0xa70b565c, 0, 0, 0, },   {  "tc2a_4e.bin", 0x00000100, 0x2c43991f, 0, 0, 0, },   {  "tc2a_2g.bin", 0x00000100, 0x08609bad, 0, 0, 0, },   { "tc1a_12f.bin", 0x00000100, 0x7ea63946, 0, 0, 0, },   { "tc1a_11f.bin", 0x00000100, 0x566d323a, 0, 0, 0, },   { "tc1a_10f.bin", 0x00000100, 0xce07c544, 0, 0, 0, },   {           NULL,          0,          0, 0, 0, 0, },};static struct INPUT_INFO terra_cresta_inputs[] ={   { KB_DEF_COIN1,        MSG_COIN1,               0x004005, 0x04, BIT_ACTIVE_0 },   { KB_DEF_COIN2,        MSG_COIN2,               0x004005, 0x08, BIT_ACTIVE_0 },   { KB_DEF_SERVICE,      MSG_SERVICE,             0x004005, 0x20, BIT_ACTIVE_0 },   { KB_DEF_P1_START,     MSG_P1_START,            0x004005, 0x01, BIT_ACTIVE_0 },   { KB_DEF_P1_UP,        MSG_P1_UP,               0x004000, 0x01, BIT_ACTIVE_0 },   { KB_DEF_P1_DOWN,      MSG_P1_DOWN,             0x004000, 0x02, BIT_ACTIVE_0 },   { KB_DEF_P1_LEFT,      MSG_P1_LEFT,             0x004000, 0x04, BIT_ACTIVE_0 },   { KB_DEF_P1_RIGHT,     MSG_P1_RIGHT,            0x004000, 0x08, BIT_ACTIVE_0 },   { KB_DEF_P1_B1,        MSG_P1_B1,               0x004000, 0x10, BIT_ACTIVE_0 },   { KB_DEF_P1_B2,        MSG_P1_B2,               0x004000, 0x20, BIT_ACTIVE_0 },   { KB_DEF_P2_START,     MSG_P2_START,            0x004005, 0x02, BIT_ACTIVE_0 },   { KB_DEF_P2_UP,        MSG_P2_UP,               0x004002, 0x01, BIT_ACTIVE_0 },   { KB_DEF_P2_DOWN,      MSG_P2_DOWN,             0x004002, 0x02, BIT_ACTIVE_0 },   { KB_DEF_P2_LEFT,      MSG_P2_LEFT,             0x004002, 0x04, BIT_ACTIVE_0 },   { KB_DEF_P2_RIGHT,     MSG_P2_RIGHT,            0x004002, 0x08, BIT_ACTIVE_0 },   { KB_DEF_P2_B1,        MSG_P2_B1,               0x004002, 0x10, BIT_ACTIVE_0 },   { KB_DEF_P2_B2,        MSG_P2_B2,               0x004002, 0x20, BIT_ACTIVE_0 },   { 0,                   NULL,                    0,        0,    0            },};static struct DSW_DATA dsw_data_terra_cresta_0[] ={   { "Lives",                 0x03, 0x04 },   { "3",                     0x03, 0x00 },   { "4",                     0x02, 0x00 },   { "5",                     0x01, 0x00 },   { "6",                     0x00, 0x00 },   { "Extra Life at",         0x04, 0x02 },   { "20,000",                0x04, 0x00 },   { "50,000",                0x00, 0x00 },   { "Second Life at",        0x08, 0x02 },   { "60,000",                0x08, 0x00 },   { "90,000",                0x00, 0x00 },   { MSG_DEMO_SOUND,          0x10, 0x02 },   { MSG_ON,                  0x10, 0x00 },   { MSG_OFF,                 0x00, 0x00 },   { "Cabinet",               0x20, 0x02 },   { "Table",                 0x20, 0x00 },   { "Upright",               0x00, 0x00 },   { NULL,                    0,    0,   },};static struct DSW_DATA dsw_data_terra_cresta_1[] ={   { MSG_COIN1,               0x03, 0x04 },   { MSG_1COIN_1PLAY,         0x03, 0x00 },   { MSG_1COIN_2PLAY,         0x02, 0x00 },   { MSG_2COIN_1PLAY,         0x01, 0x00 },   { MSG_FREE_PLAY,             0x00, 0x00 },   { MSG_COIN2,               0x0C, 0x04 },   { MSG_1COIN_3PLAY,         0x0C, 0x00 },   { MSG_1COIN_6PLAY,         0x08, 0x00 },   { MSG_2COIN_3PLAY,         0x04, 0x00 },   { MSG_3COIN_1PLAY,         0x00, 0x00 },   { MSG_DIFFICULTY,          0x10, 0x02 },   { MSG_NORMAL,              0x10, 0x00 },   { MSG_HARD,                0x00, 0x00 },   { MSG_SCREEN,              0x20, 0x02 },   { MSG_NORMAL,              0x20, 0x00 },   { MSG_INVERT,              0x00, 0x00 },   { NULL,                    0,    0,   },};static struct DSW_INFO terra_cresta_dsw[] ={   { 0x004006, 0xFF, dsw_data_terra_cresta_0 },   { 0x004007, 0xFF, dsw_data_terra_cresta_1 },   { 0,        0,    NULL,      },};static struct VIDEO_INFO terra_cresta_video ={   DrawTerraC,   256,   224,   32,   VIDEO_ROTATE_270 |   VIDEO_ROTATABLE,};struct GAME_MAIN game_terra_cresta ={   terra_cresta_dirs,   terra_cresta_roms,   terra_cresta_inputs,   terra_cresta_dsw,   NULL,   LoadTerraC,   ClearTerraC,   &terra_cresta_video,   ExecuteTerraCFrame,   "terracre",   "Terra Cresta",   "僥儔僋儗僗僞",   COMPANY_ID_NICHIBUTSU,   NULL,   1985,   nichi_ym3812_sound,   GAME_SHOOT,};static UINT8 *RAM_COLOUR;static UINT8 *COLTAB;static UINT8 *GFX_BG0;static UINT8 *GFX_BG0_SOLID;static UINT8 *GFX_SPR;static UINT8 *GFX_SPR_SOLID;static UINT8 *GFX_FG0;static UINT8 *GFX_FG0_SOLID;void LoadTerraC(void){   int ta,tb,tc,td;   int red,green,blue;   RAMSize=0x10000+0x10000;   if(!(ROM=AllocateMem(0x20000))) return;   if(!(RAM=AllocateMem(RAMSize))) return;   if(!(GFX=AllocateMem(0x40000+0x8000+0x100+0x8000))) return;   GFX_BG0	=GFX+0x00000;   GFX_SPR	=GFX+0x20000;   GFX_FG0	=GFX+0x40000;   COLTAB	=GFX+0x40000+0x8000;   RAM_COLOUR	=GFX+0x40000+0x8000+0x100;   if(!load_rom("1a_4d.rom", RAM+0x0000, 0x4000)) return;	// 68000 ROM   if(!load_rom("1a_6d.rom", RAM+0x4000, 0x4000)) return;   if(!load_rom("1a_7d.rom", RAM+0x8000, 0x4000)) return;   if(!load_rom("1a_9d.rom", RAM+0xC000, 0x4000)) return;   for(ta=0;ta<0x10000;ta++){      ROM[ta+ta]=RAM[ta];   }   if(!load_rom("1a_4b.rom", RAM+0x0000, 0x4000)) return;	// 68000 ROM   if(!load_rom("1a_6b.rom", RAM+0x4000, 0x4000)) return;   if(!load_rom("1a_7b.rom", RAM+0x8000, 0x4000)) return;   if(!load_rom("1a_9b.rom", RAM+0xC000, 0x4000)) return;   for(ta=0;ta<0x10000;ta++){      ROM[ta+ta+1]=RAM[ta];   }   if(!load_rom("2a_6e.rom", RAM+0x0000, 0x4000)) return;   if(!load_rom("2a_7e.rom", RAM+0x4000, 0x4000)) return;   if(!load_rom("2a_6g.rom", RAM+0x8000, 0x4000)) return;   if(!load_rom("2a_7g.rom", RAM+0xC000, 0x4000)) return;   tb=0;   for(ta=0;ta<0x8000;ta++,tb+=4){      GFX_SPR[tb+0]=(RAM[ta+0x0000]&15);      GFX_SPR[tb+1]=(RAM[ta+0x0000]>>4);      GFX_SPR[tb+2]=(RAM[ta+0x8000]&15);      GFX_SPR[tb+3]=(RAM[ta+0x8000]>>4);   }   if(!load_rom("1a_15f.rom", RAM+0x0000, 0x8000)) return;   if(!load_rom("1a_17f.rom", RAM+0x8000, 0x8000)) return;   tb=0;   for(ta=0;ta<0x10000;ta++,tb+=2){      GFX_BG0[tb+0]=(RAM[ta]&15);      GFX_BG0[tb+1]=(RAM[ta]>>4);   }   if(!load_rom("2a_16b.rom", RAM, 0x2000)) return;   tb=0;   for(ta=0;ta<0x2000;ta++,tb+=2){      GFX_FG0[tb+0]=(RAM[ta]&15)^15;      GFX_FG0[tb+1]=(RAM[ta]>>4)^15;   }   GFX_BG0_SOLID = make_solid_mask_16x16(GFX_BG0, 0x0200);   GFX_SPR_SOLID = make_solid_mask_16x16(GFX_SPR, 0x0200);   GFX_FG0_SOLID = make_solid_mask_8x8  (GFX_FG0, 0x0100);   if(!load_rom("tc1a_10f.bin", RAM+0x000, 0x100)) return;	// Red   if(!load_rom("tc1a_11f.bin", RAM+0x100, 0x100)) return;	// Green   if(!load_rom("tc1a_12f.bin", RAM+0x200, 0x100)) return;	// Blue   if(!load_rom("tc2a_2g.bin",  RAM+0x300, 0x100)) return;	// Sprite Colour orders   if(!load_rom("tc2a_4e.bin",  COLTAB, 0x100)) return;		// Sprite Colour banks   tb=0x44000;   // Palette BG0 (16x16 colours)   // ---------------------------   for(tc=0;tc<4;tc++){   for(td=0;td<4;td++){   for(ta=0;ta<8;ta++){      GFX[tb++]=RAM[ta+0x0C0+(td<<4)]<<2;      GFX[tb++]=RAM[ta+0x1C0+(td<<4)]<<2;      GFX[tb++]=RAM[ta+0x2C0+(td<<4)]<<2;   }   for(ta=8;ta<16;ta++){      GFX[tb++]=RAM[ta+0x0C0+(tc<<4)]<<2;      GFX[tb++]=RAM[ta+0x1C0+(tc<<4)]<<2;      GFX[tb++]=RAM[ta+0x2C0+(tc<<4)]<<2;   }   }   }   // Palette SPR (64x16 colours)   // ---------------------------   td=0x300;   for(ta=0;ta<256;ta++){   for(tc=0;tc<4;tc++){       GFX[tb+0+((ta + tc *(256))*3)]=RAM[0x080+(tc<<4)+(RAM[td]&15)]<<2;       GFX[tb+1+((ta + tc *(256))*3)]=RAM[0x180+(tc<<4)+(RAM[td]&15)]<<2;       GFX[tb+2+((ta + tc *(256))*3)]=RAM[0x280+(tc<<4)+(RAM[td]&15)]<<2;   }   td++;   }   tb+=(64*48);   // Palette FG0 (1x16 colours)   // --------------------------   for(ta=15;ta>=0;ta--){      GFX[tb++]=RAM[ta+0x000]<<2;      GFX[tb++]=RAM[ta+0x100]<<2;      GFX[tb++]=RAM[ta+0x200]<<2;   }   tb=0;   for(ta=0x44000;ta<0x48000;ta+=3,tb+=2){   red   = (GFX[ta+0]>>2)&15;   green = (GFX[ta+1]>>2)&15;   blue  = (GFX[ta+2]>>2)&15;   WriteWord(&RAM_COLOUR[tb],(red<<8)|(green<<4)|(blue));   }   /*-----[Sound Setup]-----*/   Z80ROM=RAM+0x10000;   if(!load_rom("2a_15b.rom", Z80ROM+0x0000, 0x4000)) return;	// Z80 SOUND ROM   if(!load_rom("2a_17b.rom", Z80ROM+0x4000, 0x4000)) return;	// Z80 SOUND ROM   if(!load_rom("2a_18b.rom", Z80ROM+0x8000, 0x4000)) return;	// Z80 SOUND ROM   AddNichibutsuYM3526(0x0077, 0x006F);   AddNichiSample(0x014F, 0x0151, 1);   AddNichiSample(0x0152, 0x0154, 1);   AddNichiSample(0x1016, 0x2A72, 3);   AddNichiSample(0x8040, 0x80FF, 2);   AddNichiSample(0x8100, 0x9C00, 3);   AddNichiSample(0x9C01, 0xADE1, 2);   AddNichiSample(0xADE2, 0xBEA2, 2);   /*-----------------------*/   // 68000 Checksum Fix   // ------------------   WriteWord68k(&ROM[0x2064],0x4E71);		// 	nop   // 68000 Speed Hack   // ----------------   WriteWord68k(&ROM[0x002A2],0x4EF9);		// 	jmp	$1C000   WriteLong68k(&ROM[0x002A4],0x0001C000);	//   WriteLong68k(&ROM[0x1C000],0x46FC2000);	//	move.w	#$2000,SR   WriteLong68k(&ROM[0x1C004],0x13FC0000);	//	move.b	#$00,$AA0000   WriteLong68k(&ROM[0x1C008],0x00AA0000);	//	(Speed Hack)   WriteWord68k(&ROM[0x1C00C],0x6100-10);	//	bra.s	<loop>   // Change Sound Comm Address (for speed)   // -------------------------------------   WriteLong68k(&ROM[0x002EA],0x00BB0000);   // Clear RAM   // ---------   memset(RAM+0x00000,0x00,0x10000);   // Clear INPUT/DSW   // ---------------   WriteLong(&RAM[0x4000],0xFFFFFFFF);   WriteLong(&RAM[0x4004],0xFFFFFFFF);   InitPaletteMap(RAM_COLOUR, 0x100, 0x10, 0x1000);   set_colour_mapper(&col_map_xxxx_rrrr_gggg_bbbb);/* *  StarScream Stuff follows */   ByteSwap(ROM,0x20000);   ByteSwap(RAM,0x10000);   AddMemFetch(0x000000, 0x01FFFF, ROM+0x000000-0x000000);   AddMemFetch(-1, -1, NULL);   AddReadByte(0x000000, 0x01FFFF, NULL, ROM+0x000000);			// 68000 ROM   AddReadByte(0x020000, 0x02FFFF, NULL, RAM+0x000000);			// ALL RAM   AddReadByte(-1, -1, NULL, NULL);   AddReadWord(0x000000, 0x01FFFF, NULL, ROM+0x000000);			// 68000 ROM   AddReadWord(0x020000, 0x02FFFF, NULL, RAM+0x000000);			// ALL RAM   AddReadWord(-1, -1, NULL, NULL);   AddWriteByte(0x020000, 0x02FFFF, NULL, RAM+0x000000);		// ALL RAM   AddWriteByte(0xAA0000, 0xAA0001, Stop68000, NULL);			// Trap Idle 68000   AddWriteByte(-1, -1, NULL, NULL);   AddWriteWord(0x020000, 0x02FFFF, NULL, RAM+0x000000);		// ALL RAM   AddWriteWord(0xBB0000, 0xBB0001, NichiSoundCommWrite68k, NULL);	// SOUND COMM   AddWriteWord(-1, -1, NULL, NULL);   AddInitMemory();	// Set Starscream mem pointers...}void ClearTerraC(void){   RemoveNichibutsuYM3526();   #ifdef RAINE_DEBUG      save_debug("ROM.bin",ROM,0x020000,1);      save_debug("RAM.bin",RAM,0x010000,1);      //save_debug("GFX.bin",GFX,0x444000,0);   #endif}void ExecuteTerraCFrame(void){   cpu_execute_cycles(CPU_68K_0, CPU_FRAME_MHz(12,60));	// M68000 12MHz (60fps)   cpu_interrupt(CPU_68K_0, 1);   Nichibutsu3526_Frame();		// Z80 and YM3526}void DrawTerraC(void){   int x,y,ta,tb;   int zz,zzz,zzzz,x16,y16;   UINT8 *map;   ClearPaletteMap();   // Clear/Draw BG0   // --------------   if((zzz=ReadWord(&RAM[0x228]))&0x2000){      clear_game_screen(0);			// Game has no solid BG0   }   else{   zzzz=2;					// X Offset (16-512)   x16=15-15;					// X Offset (0-15)   zzzz|=((zzz&0x3F0)>>4)<<6;			// Y Offset (16-1024)   y16=(zzz&15);				// Y Offset (0-15)   zzzz&=0x0FFF;   tb=0;   for(x=(32-y16);x<(256+32);x+=16){   zz=zzzz;   for(y=(32-x16);y<(224+32);y+=16){   ta=ReadWord(&RAM[0x2000+zz])&0x1FF;      MAP_PALETTE_MAPPED_NEW(         (RAM[0x2001+zz]&0x78)>>3,         16,         map      );      Draw16x16_Mapped_Rot(&GFX_BG0[ta<<8],x,y,map);   zz+=2;   }   zzzz+=0x40;   zzzz=zzzz&0x0FFF;   }   }   // OBJECT   for(zz=0;zz<0x200;zz+=8){   y = (224+32)-(ReadWord(&RAM[zz])&0xFF);   x = (ReadWord(&RAM[zz+6])&0xFF)-0x80+((RAM[zz+4]&1)<<8);   x = x + 32;   if((x>16)&&(y>16)&&(x<256+32)&&(y<224+32)){   ta=(((RAM[zz+4]&2)<<7)|((RAM[zz+2])));      MAP_PALETTE_MAPPED_NEW(         (RAM[zz+4]>>4)+((COLTAB[ta>>1]&3)<<4)+16,         16,         map      );      switch(RAM[zz+4]&0x0C){      case 0x00: Draw16x16_Trans_Mapped_Rot(&GFX_SPR[ta<<8],x,y,map);        break;      case 0x04: Draw16x16_Trans_Mapped_FlipY_Rot(&GFX_SPR[ta<<8],x,y,map);  break;      case 0x08: Draw16x16_Trans_Mapped_FlipX_Rot(&GFX_SPR[ta<<8],x,y,map);  break;      case 0x0C: Draw16x16_Trans_Mapped_FlipXY_Rot(&GFX_SPR[ta<<8],x,y,map); break;      }   }   }   // FG0   zz=0x8000+4;   MAP_PALETTE_MAPPED_NEW(      80,      16,      map   );   for(x=32;x<256+32;x+=8,zz+=8){   for(y=32;y<224+32;y+=8,zz+=2){      if((ta=RAM[zz])!=0){      Draw8x8_Trans_Mapped_Rot(&GFX_FG0[ta<<6],x,y,map);      }   }   }}/*Sprite Table (8 bytes/sprite)=============================- Even bytes are unusedByte | Bit(s) | Usage-----+76543210+----------------------  1  |xxxxxxxx| SpriteX (low)  3  |xxxxxxxx| Sprite Number (low)  5  |.......x| SpriteY (high)  5  |......x.| Sprite Number (high)  5  |.....x..| Sprite Flip Y  5  |....x...| Sprite Flip X  5  |xxxx....| Sprite Colour Bank  7  |xxxxxxxx| SpriteY (low)*/

⌨️ 快捷键说明

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