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

📄 snowbros.c

📁 十七种模拟器源代码 非常有用的作课程设计不可缺少的
💻 C
📖 第 1 页 / 共 2 页
字号:
   224,   32,   VIDEO_ROTATE_NORMAL |   VIDEO_ROTATABLE,   winter_bobble_gfx,};struct GAME_MAIN game_winter_bobble ={   winter_bobble_dirs,   winter_bobble_roms,   snow_bros_inputs,   snow_bros_dsw,   NULL,   load_snow_bros,   clear_snow_bros,   &winter_bobble_video,   execute_snow_bros_frame,   "wintbob",   "Winter Bobble",   "僗僲乕僽儔僓乕僘乮奀弹髋乯",   COMPANY_ID_BOOTLEG,   NULL,   1990,   snow_bros_sound,   GAME_PLATFORM,};static UINT8 *RAM_SPR;static UINT8 *GFX_SPR;static UINT8 *GFX_SPR_SOLID;static int sport=0;static void SoundWrite(UINT32 offset, UINT8 data){   sport = data;#ifdef RAINE_DEBUG   print_debug("68000 Sends $%02x\n",sport);#endif   cpu_int_nmi(CPU_Z80_0);}static UINT16 SoundRead(UINT32 offset){   return 3;           // Z80_OK}void SnowBrosPort4w(UINT16 address, UINT8 data){   sport=data;}UINT16 SnowBrosPort4r(UINT16 address){   #ifdef RAINE_DEBUG   print_debug("Z80 Receives $%02x\n",sport);   #endif   return(sport);}void load_snow_bros(void){   RAMSize=0x8000+0x10000;   if(!(RAM=AllocateMem(RAMSize))) return;   Z80ROM=RAM+0x8000;   memcpy(Z80ROM+0x0000, load_region[REGION_ROM2], 0x8000);   memset(Z80ROM+0x8000, 0x00,                     0x8000);   // Fix Checksum   // ------------   Z80ROM[0x0156]=0x00; // NOP   Z80ROM[0x0157]=0x00; // NOP   Z80ROM[0x0158]=0x00; // NOP   // Apply Speed Patch   // -----------------   if(is_current_game("wintbob"))   {      Z80ROM[0x0181]=0xD3; // OUTA (AAh)      Z80ROM[0x0182]=0xAA; //      SetStopZ80Mode2(0x0180);   }   else   {      Z80ROM[0x019D]=0xD3; // OUTA (AAh)      Z80ROM[0x019E]=0xAA; //      SetStopZ80Mode2(0x019C);   }   // Setup Z80 memory map   // --------------------   AddZ80AROMBase(Z80ROM, 0x0038, 0x0066);   AddZ80AReadByte(0x0000, 0x87FF, NULL,                        Z80ROM+0x0000); // Z80 ROM/RAM   AddZ80AReadByte(0x0000, 0xFFFF, DefBadReadZ80,               NULL);   AddZ80AReadByte(    -1,     -1, NULL,                        NULL);   AddZ80AWriteByte(0x8000, 0x87FF, NULL,                       Z80ROM+0x8000); // Z80 RAM   AddZ80AWriteByte(0x0000, 0xFFFF, DefBadWriteZ80,             NULL);   AddZ80AWriteByte(    -1,     -1, NULL,                       NULL);   AddZ80AReadPort(0x02, 0x03, YM3812ReadZ80,           NULL);   AddZ80AReadPort(0x04, 0x04, SnowBrosPort4r,          NULL);   AddZ80AReadPort(0x00, 0xFF, DefBadReadZ80,           NULL);   AddZ80AReadPort(  -1,   -1, NULL,                    NULL);   AddZ80AWritePort(0x02, 0x03, YM3812WriteZ80,         NULL);   AddZ80AWritePort(0x04, 0x04, SnowBrosPort4w,         NULL);   AddZ80AWritePort(0xAA, 0xAA, StopZ80Mode2,           NULL);   AddZ80AWritePort(0x00, 0xFF, DefBadWriteZ80,         NULL);   AddZ80AWritePort(  -1,   -1, NULL,                   NULL);   AddZ80AInit();   RAM_SPR = RAM+0x004000;   GFX_SPR = load_region[REGION_GFX1];   GFX_SPR_SOLID = make_solid_mask_16x16(GFX_SPR, 0x1000);   memset(RAM+0x0000,0x00,0x6404);   memset(RAM+0x6404,0xFF,0x001C);   RAM[0x6400]=0x7F;   RAM[0x6402]=0x7F;   RAM[0x6412]=0x00;    // $300000: Sound Related   RAM[0x6413]=0x03;   // fix checksum   WriteLong68k(&ROM[0x008EE],0x4E714E71);   WriteLong68k(&ROM[0x008FE],0x4E714E71);   // speed hack   WriteLong68k(&ROM[0x003BA],0x027C7BFF);   WriteLong68k(&ROM[0x003BE],0x13FC0000);   WriteLong68k(&ROM[0x003C2],0x00AA0000);   WriteLong68k(&ROM[0x00436],0x027C7AFF);   WriteLong68k(&ROM[0x0043A],0x13FC0000);   WriteLong68k(&ROM[0x0043E],0x00AA0000);   WriteLong68k(&ROM[0x0045E],0x027C79FF);   WriteLong68k(&ROM[0x00462],0x13FC0000);   WriteLong68k(&ROM[0x00466],0x00AA0000);   if(is_current_game("wintbob"))   {      WriteWord68k(&ROM[0x00DE],0x4EB9);      WriteLong68k(&ROM[0x00E0],0x0000065A);      WriteWord68k(&ROM[0x0142],0x4EB9);      WriteLong68k(&ROM[0x0144],0x0000066C);      WriteWord68k(&ROM[0x08B8],0x4EB9);      WriteLong68k(&ROM[0x08BA],0x000009F4);   }   InitPaletteMap(RAM+0x06000, 0x10, 0x10, 0x8000);   set_colour_mapper(&col_map_xbbb_bbgg_gggr_rrrr);/* *  StarScream Main 68000 Setup */   ByteSwap(ROM,0x40000);   ByteSwap(RAM,0x6420);   AddMemFetch(0x000000, 0x03FFFF, ROM+0x000000-0x000000);   AddMemFetch(-1, -1, NULL);   AddReadByte(0x000000, 0x03FFFF, NULL, ROM+0x000000);                 // 68000 ROM   AddReadByte(0x100000, 0x103FFF, NULL, RAM+0x000000);                 // 68000 RAM   AddReadByte(0x700000, 0x701FFF, NULL, RAM+0x004000);                 // SPRITE RAM   AddReadByte(0x600000, 0x6003FF, NULL, RAM+0x006000);                 // COLOUR RAM   AddReadByte(0x500000, 0x50000F, NULL, RAM+0x006400);                 // INPUT   AddReadByte(0x200000, 0x200001, NULL, RAM+0x006410);                 // ???   AddReadByte(0x300000, 0x300001, SoundRead, NULL);                    // SOUND COMM   AddReadByte(0x400000, 0x400001, NULL, RAM+0x006414);                 // ???   AddReadByte(0x800000, 0x800001, NULL, RAM+0x006416);                 // (Interrupt Repsonse)   AddReadByte(0x900000, 0x900001, NULL, RAM+0x006418);                 // (Interrupt Repsonse)   AddReadByte(0xA00000, 0xA00001, NULL, RAM+0x00641A);                 // (Interrupt Repsonse)   AddReadByte(0x000000, 0xFFFFFF, DefBadReadByte, NULL);      // <Bad Reads>   AddReadByte(-1, -1, NULL, NULL);   AddReadWord(0x000000, 0x03FFFF, NULL, ROM+0x000000);                 // 68000 ROM   AddReadWord(0x100000, 0x103FFF, NULL, RAM+0x000000);                 // 68000 RAM   AddReadWord(0x700000, 0x701FFF, NULL, RAM+0x004000);   AddReadWord(0x600000, 0x6003FF, NULL, RAM+0x006000);   AddReadWord(0x500000, 0x50000F, NULL, RAM+0x006400);   AddReadWord(0x200000, 0x200001, NULL, RAM+0x006410);   AddReadWord(0x300000, 0x300001, SoundRead, NULL);   AddReadWord(0x400000, 0x400001, NULL, RAM+0x006414);   AddReadWord(0x800000, 0x800001, NULL, RAM+0x006416);   AddReadWord(0x900000, 0x900001, NULL, RAM+0x006418);   AddReadWord(0xA00000, 0xA00001, NULL, RAM+0x00641A);   AddReadWord(0x000000, 0xFFFFFF, DefBadReadWord, NULL);      // <Bad Reads>   AddReadWord(-1, -1, NULL, NULL);   AddWriteByte(0x100000, 0x103FFF, NULL, RAM+0x000000);                // 68000 RAM   AddWriteByte(0x700000, 0x701FFF, NULL, RAM+0x004000);   AddWriteByte(0x600000, 0x6003FF, NULL, RAM+0x006000);   AddWriteByte(0x500000, 0x50000F, NULL, RAM+0x006400);   AddWriteByte(0x200000, 0x200001, NULL, RAM+0x006410);   AddWriteByte(0x300000, 0x300001, SoundWrite, NULL);   AddWriteByte(0x400000, 0x400001, NULL, RAM+0x006414);   AddWriteByte(0x800000, 0x800001, NULL, RAM+0x006416);   AddWriteByte(0x900000, 0x900001, NULL, RAM+0x006418);   AddWriteByte(0xA00000, 0xA00001, NULL, RAM+0x00641A);   AddWriteByte(0xAA0000, 0xAA0001, Stop68000, NULL);                   // Trap Idle 68000   AddWriteByte(0x000000, 0xFFFFFF, DefBadWriteByte, NULL);      // <Bad Writes>   AddWriteByte(-1, -1, NULL, NULL);   AddWriteWord(0x100000, 0x103FFF, NULL, RAM+0x000000);                // 68000 RAM   AddWriteWord(0x700000, 0x701FFF, NULL, RAM+0x004000);   AddWriteWord(0x600000, 0x6003FF, NULL, RAM+0x006000);   AddWriteWord(0x500000, 0x50000F, NULL, RAM+0x006400);   AddWriteWord(0x200000, 0x200001, NULL, RAM+0x006410);   AddWriteWord(0x300000, 0x300001, SoundWrite, NULL);   AddWriteWord(0x400000, 0x400001, NULL, RAM+0x006414);   AddWriteWord(0x800000, 0x800001, NULL, RAM+0x006416);   AddWriteWord(0x900000, 0x900001, NULL, RAM+0x006418);   AddWriteWord(0xA00000, 0xA00001, NULL, RAM+0x00641A);   AddWriteWord(0x000000, 0xFFFFFF, DefBadWriteWord, NULL);      // <Bad Writes>   AddWriteWord(-1, -1, NULL, NULL);   AddInitMemory();     // Set Starscream mem pointers...}void clear_snow_bros(void){}void execute_snow_bros_frame(void){   static int ta;   cpu_execute_cycles(CPU_68K_0, 80000);                 // Main 68000   cpu_interrupt(CPU_68K_0, 4);   cpu_execute_cycles(CPU_68K_0, 80000);   cpu_interrupt(CPU_68K_0, 3);   cpu_execute_cycles(CPU_68K_0, 80000);   cpu_interrupt(CPU_68K_0, 2);   ta++;   cpu_execute_cycles(CPU_Z80_0, CPU_FRAME_MHz(4,60));        // Sound Z80   /*#ifdef RAINE_DEBUG   print_debug("%04x\n",z80pc);   #endif*/   cpu_interrupt(CPU_Z80_0, 0x38);   if(ta&1) cpu_interrupt(CPU_Z80_0, 0x38);}void draw_snow_bros(void){   int x,y,ta,tb;   int zz;   UINT8 *map;   ClearPaletteMap();   clear_game_screen(0);   x=0;   y=0;   for(zz=0;zz<0x1E00;zz+=16){      tb = RAM_SPR[zz+6];      if(tb&4){         x = (x + ((RAM_SPR[zz+ 8]) | ((tb&1)<<8))) & 0x1FF;         y = (y + ((RAM_SPR[zz+10]) | ((tb&2)<<7))) & 0x1FF;      }      else{         x = (32 + ((RAM_SPR[zz+ 8]) | ((tb&1)<<8))) & 0x1FF;         y = (16 + ((RAM_SPR[zz+10]) | ((tb&2)<<7))) & 0x1FF;      }      if((x>16)&&(y>16)&&(x<256+32)&&(y<240+32)){         ta = ((RAM_SPR[zz+12]) | (RAM_SPR[zz+14]<<8))&0x0FFF;         if(GFX_SPR_SOLID[ta]){            // No pixels; skip         MAP_PALETTE_MAPPED_NEW(            tb>>4,            16,            map         );         if(GFX_SPR_SOLID[ta]==1){         // Some pixels; trans            switch(RAM_SPR[zz+14]&0xC0){            case 0x00: Draw16x16_Trans_Mapped_Rot(&GFX_SPR[ta<<8], x, y, map);        break;            case 0x80: Draw16x16_Trans_Mapped_FlipY_Rot(&GFX_SPR[ta<<8], x, y, map);  break;            case 0x40: Draw16x16_Trans_Mapped_FlipX_Rot(&GFX_SPR[ta<<8], x, y, map);  break;            case 0xC0: Draw16x16_Trans_Mapped_FlipXY_Rot(&GFX_SPR[ta<<8], x, y, map); break;            }         }         else{                  // all pixels; solid            switch(RAM_SPR[zz+14]&0xC0){            case 0x00: Draw16x16_Mapped_Rot(&GFX_SPR[ta<<8], x, y, map);        break;            case 0x80: Draw16x16_Mapped_FlipY_Rot(&GFX_SPR[ta<<8], x, y, map);  break;            case 0x40: Draw16x16_Mapped_FlipX_Rot(&GFX_SPR[ta<<8], x, y, map);  break;            case 0xC0: Draw16x16_Mapped_FlipXY_Rot(&GFX_SPR[ta<<8], x, y, map); break;            }         }         }      }   }}/* OBJECT RAM ----------- 16 bytes per sprite definition (only odd)- Sprites are 16x16; 16 colours-----+--------+-----------------------------Byte |Bit(s)  | Use-----+76543210+-----------------------------1/3/5|........| Unused  7  |.......x| XPos - Sign Bit  7  |......x.| YPos - Sign Bit  7  |.....x..| Use Relative offsets  7  |xxxx....| Palette Bank  9  |xxxxxxxx| XPos  B  |xxxxxxxx| YPos  D  |xxxxxxxx| Sprite Number (low 8 bits)  F  |....xxxx| Sprite Number (high 4 bits)  F  |.x......| Flip Sprite X-Axis  F  |x.......| Flip Sprite Y-Axis-----+--------+-----------------------------*/

⌨️ 快捷键说明

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