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