📄 tecmosys.c
字号:
GFX_SPR=GFX+0x020000; if(!load_rom("gaiden.1", RAM, 0x20000)) return; // 68000 ROM for(ta=0;ta<0x20000;ta++){ ROM[ta+ta]=RAM[ta]; } if(!load_rom("gaiden.2", RAM, 0x20000)) return; for(ta=0;ta<0x20000;ta++){ ROM[ta+ta+1]=RAM[ta]; } tb=0; if(!load_rom("gaiden.5", RAM, 0x10000)) return; // 8x8 FG0 GFX for(ta=0;ta<0x10000;ta++){ GFX_FG0[tb++]=RAM[ta]>>4; GFX_FG0[tb++]=RAM[ta]&15; } tb=0; if(!load_rom("gaiden.6", RAM+0x00000, 0x20000)) return; // 16x16 SPRITES if(!load_rom("gaiden.8", RAM+0x20000, 0x20000)) return; if(!load_rom("gaiden.10", RAM+0x40000, 0x20000)) return; if(!load_rom("gaiden.12", RAM+0x60000, 0x20000)) return; for(ta=0;ta<0x80000;ta+=2){ GFX_SPR[tb+0]=RAM[ta]>>4; GFX_SPR[tb+1]=RAM[ta]&15; GFX_SPR[tb+4]=RAM[ta+1]>>4; GFX_SPR[tb+5]=RAM[ta+1]&15; tb+=8; } tb=0; if(!load_rom("gaiden.7", RAM+0x00000, 0x20000)) return; // 16x16 SPRITES if(!load_rom("gaiden.9", RAM+0x20000, 0x20000)) return; if(!load_rom("gaiden.11", RAM+0x40000, 0x20000)) return; if(!load_rom("gaiden.13", RAM+0x60000, 0x20000)) return; for(ta=0;ta<0x80000;ta+=2){ GFX_SPR[tb+2]=RAM[ta]>>4; GFX_SPR[tb+3]=RAM[ta]&15; GFX_SPR[tb+6]=RAM[ta+1]>>4; GFX_SPR[tb+7]=RAM[ta+1]&15; tb+=8; } tb=0; if(!load_rom("14.bin", RAM+0x00000, 0x20000)) return; // 16x16 BG0 if(!load_rom("15.bin", RAM+0x20000, 0x20000)) return; if(!load_rom("16.bin", RAM+0x40000, 0x20000)) return; if(!load_rom("17.bin", RAM+0x60000, 0x20000)) return; for(ta=0;ta<0x80000;ta+=4){ GFX_BG0[tb+0]=RAM[ta+0]>>4; GFX_BG0[tb+1]=RAM[ta+0]&15; GFX_BG0[tb+2]=RAM[ta+1]>>4; GFX_BG0[tb+3]=RAM[ta+1]&15; GFX_BG0[tb+4]=RAM[ta+2]>>4; GFX_BG0[tb+5]=RAM[ta+2]&15; GFX_BG0[tb+6]=RAM[ta+3]>>4; GFX_BG0[tb+7]=RAM[ta+3]&15; tb+=16; if((tb&0x7F)==0){tb-=0x78;} else{if((tb&0x7F)==8){tb-=0x8;}} } tb=0; if(!load_rom("18.bin", RAM+0x00000, 0x20000)) return; // 16x16 BG1 if(!load_rom("19.bin", RAM+0x20000, 0x20000)) return; if(!load_rom("20.bin", RAM+0x40000, 0x20000)) return; if(!load_rom("21.bin", RAM+0x60000, 0x20000)) return; for(ta=0;ta<0x80000;ta+=4){ GFX_BG1[tb+0]=RAM[ta+0]>>4; GFX_BG1[tb+1]=RAM[ta+0]&15; GFX_BG1[tb+2]=RAM[ta+1]>>4; GFX_BG1[tb+3]=RAM[ta+1]&15; GFX_BG1[tb+4]=RAM[ta+2]>>4; GFX_BG1[tb+5]=RAM[ta+2]&15; GFX_BG1[tb+6]=RAM[ta+3]>>4; GFX_BG1[tb+7]=RAM[ta+3]&15; tb+=16; if((tb&0x7F)==0){tb-=0x78;} else{if((tb&0x7F)==8){tb-=0x8;}} } GFX_BG0_SOLID = make_solid_mask_16x16(GFX_BG0, 0x100000 >> 8); GFX_BG1_SOLID = make_solid_mask_16x16(GFX_BG1, 0x100000 >> 8); GFX_FG0_SOLID = make_solid_mask_8x8(GFX_FG0, 0x020000 >> 6); GFX_SPR_SOLID = make_solid_mask_8x8(GFX_SPR, 0x200000 >> 6); FreeMem(RAM); RAMSize=0x24000+0x10000; if(!(RAM=AllocateMem(RAMSize))) return; /*-------[SOUND SYSTEM INIT]-------*/ Z80ROM=RAM+0x24000; if(!load_rom("gaiden.3", Z80ROM, 0x10000)) return; // Z80 SOUND ROM if(!(PCMROM = AllocateMem(0x20000))) return; if(!load_rom("gaiden.4", PCMROM, 0x20000)) return; // ADPCM ROM AddTecmoSound(0x00BD, 0x00BD, 0x10000, PCMROM, 0x20000); /*---------------------------------*/ memset(RAM+0x00000,0x00,0x24000); memset(RAM+0x1A000,0xFF,0x01000); // 68000 Speed hack // ---------------- WriteWord68k(&ROM[0x1338],0x4EF9); // jmp $000300 WriteLong68k(&ROM[0x133A],0x00000300); WriteWord68k(&ROM[0x300],0x41F9); // lea #$001344,a0 WriteLong68k(&ROM[0x302],0x00001344); WriteWord68k(&ROM[0x306],0x4EB9); // jsr $0011D8 WriteLong68k(&ROM[0x308],0x000011D8); WriteLong68k(&ROM[0x30C],0x13FC0000); // move.w #$0000,$AA0000 WriteLong68k(&ROM[0x310],0x00AA0000); // WriteWord68k(&ROM[0x314],0x60EA); // bra <loop> // Fix 68000 Checksum // ------------------ ROM[0x54A]=0x60; ROM[0x552]=0x60; InitPaletteMap(RAM+0x18000, 0x40, 0x10, 0x1000); set_colour_mapper(&col_map_xxxx_bbbb_gggg_rrrr);/* * StarScream Stuff follows */ ByteSwap(ROM,0x40000); ByteSwap(RAM,0x20000); AddMemFetch(0x000000, 0x03FFFF, ROM+0x000000-0x000000); // 68000 ROM AddMemFetch(-1, -1, NULL); AddReadByte(0x000000, 0x03FFFF, NULL, ROM+0x000000); // 68000 ROM AddReadByte(0x060000, 0x07FFFF, NULL, RAM+0x000000); // *ALL* RAM AddReadByte(-1, -1, NULL, NULL); AddReadWord(0x000000, 0x03FFFF, NULL, ROM+0x000000); // 68000 ROM AddReadWord(0x060000, 0x07FFFF, NULL, RAM+0x000000); // *ALL* RAM AddReadWord(-1, -1,NULL, NULL); AddWriteByte(0x060000, 0x079FFF, NULL, RAM+0x000000); // *ALL* RAM AddWriteByte(0x07A000, 0x07FFFF, CtrlWriteB, NULL); // *ALL* RAM AddWriteByte(0xAA0000, 0xAA0001, Stop68000, NULL); // Trap Idle 68000 AddWriteByte(-1, -1, NULL, NULL); AddWriteWord(0x060000, 0x07FFFF, NULL, RAM+0x000000); // *ALL* RAM AddWriteWord(-1, -1, NULL, NULL); AddInitMemory(); // Set Starscream mem pointers...}void LoadTKnight(void){ int ta,tb; if(!(ROM=AllocateMem(0x40000))) return; if(!(RAM=AllocateMem(0x80000))) return; if(!(GFX=AllocateMem(0x420000))) return; GFX_BG0=GFX+0x220000; GFX_BG1=GFX+0x320000; GFX_FG0=GFX+0x000000; GFX_SPR=GFX+0x020000; if(!load_rom("TKNI1.BIN", RAM, 0x20000)) return; // 68000 ROM for(ta=0;ta<0x20000;ta++){ ROM[ta+ta]=RAM[ta]; } if(!load_rom("TKNI2.BIN", RAM, 0x20000)) return; for(ta=0;ta<0x20000;ta++){ ROM[ta+ta+1]=RAM[ta]; } tb=0; if(!load_rom("TKNI5.BIN", RAM, 0x10000)) return; // 8x8 FG0 GFX for(ta=0;ta<0x10000;ta++){ GFX_FG0[tb++]=RAM[ta]>>4; GFX_FG0[tb++]=RAM[ta]&15; } tb=0; if(!load_rom("TKNI9.BIN", RAM, 0x80000)) return; // 16x16 SPRITES for(ta=0;ta<0x80000;ta+=2){ GFX_SPR[tb+0]=RAM[ta]>>4; GFX_SPR[tb+1]=RAM[ta]&15; GFX_SPR[tb+4]=RAM[ta+1]>>4; GFX_SPR[tb+5]=RAM[ta+1]&15; tb+=8; } tb=0; if(!load_rom("TKNI8.BIN", RAM, 0x80000)) return; for(ta=0;ta<0x80000;ta+=2){ GFX_SPR[tb+2]=RAM[ta]>>4; GFX_SPR[tb+3]=RAM[ta]&15; GFX_SPR[tb+6]=RAM[ta+1]>>4; GFX_SPR[tb+7]=RAM[ta+1]&15; tb+=8; } tb=0; if(!load_rom("TKNI7.BIN", RAM, 0x80000)) return; // 16x16 BACKGROUND for(ta=0;ta<0x80000;ta+=4){ GFX_BG0[tb+0]=RAM[ta+0]>>4; GFX_BG0[tb+1]=RAM[ta+0]&15; GFX_BG0[tb+2]=RAM[ta+1]>>4; GFX_BG0[tb+3]=RAM[ta+1]&15; GFX_BG0[tb+4]=RAM[ta+2]>>4; GFX_BG0[tb+5]=RAM[ta+2]&15; GFX_BG0[tb+6]=RAM[ta+3]>>4; GFX_BG0[tb+7]=RAM[ta+3]&15; tb+=16; if((tb&0x7F)==0){tb-=0x78;} else{if((tb&0x7F)==8){tb-=0x8;}} } tb=0; if(!load_rom("TKNI6.BIN", RAM, 0x80000)) return; // 16x16 BACKGROUND for(ta=0;ta<0x80000;ta+=4){ GFX_BG1[tb+0]=RAM[ta+0]>>4; GFX_BG1[tb+1]=RAM[ta+0]&15; GFX_BG1[tb+2]=RAM[ta+1]>>4; GFX_BG1[tb+3]=RAM[ta+1]&15; GFX_BG1[tb+4]=RAM[ta+2]>>4; GFX_BG1[tb+5]=RAM[ta+2]&15; GFX_BG1[tb+6]=RAM[ta+3]>>4; GFX_BG1[tb+7]=RAM[ta+3]&15; tb+=16; if((tb&0x7F)==0){tb-=0x78;} else{if((tb&0x7F)==8){tb-=0x8;}} } GFX_BG0_SOLID = make_solid_mask_16x16(GFX_BG0, 0x100000 >> 8); GFX_BG1_SOLID = make_solid_mask_16x16(GFX_BG1, 0x100000 >> 8); GFX_FG0_SOLID = make_solid_mask_8x8(GFX_FG0, 0x020000 >> 6); GFX_SPR_SOLID = make_solid_mask_8x8(GFX_SPR, 0x200000 >> 6); FreeMem(RAM); RAMSize=0x24000+0x10000; if(!(RAM=AllocateMem(RAMSize))) return; /*-------[SOUND SYSTEM INIT]-------*/ Z80ROM=RAM+0x24000; if(!load_rom("TKNI3.BIN", Z80ROM, 0x10000)) return; // Z80 SOUND ROM if(!(PCMROM = AllocateMem(0x20000))) return; if(!load_rom("TKNI4.BIN", PCMROM, 0x20000)) return; // ADPCM ROM AddTecmoSound(0x00D2, 0x00D2, 0x10000, PCMROM, 0x20000); /*---------------------------------*/ memset(RAM+0x00000,0x00,0x24000); memset(RAM+0x1A000,0xFF,0x01000); // Protected JSR's hack // -------------------- WriteLong68k(&ROM[0x1AA76],0x0240001F); // andi.w #$001F,d0 WriteWord68k(&ROM[0x1AA7A],0xE348); // lsl.w #1,d0 WriteLong68k(&ROM[0x1AA7C],0x4BF824D2); // lea $24d2.w,a5 WriteLong68k(&ROM[0x1AA80],0x30350000); // move.w 0(a5,d0.w),d0 WriteWord68k(&ROM[0x1AA84],0x4E75); // rts // 68000 Speed hack // ---------------- WriteLong68k(&ROM[0x0AAE],0x13FC0000); // move.w #$0000,$AA0000 WriteLong68k(&ROM[0x0AB2],0x00AA0000); // InitPaletteMap(RAM+0x18000, 0x40, 0x10, 0x1000); set_colour_mapper(&col_map_xxxx_bbbb_gggg_rrrr);/* * StarScream Stuff follows */ ByteSwap(ROM,0x40000); ByteSwap(RAM,0x20000); AddMemFetch(0x000000, 0x03FFFF, ROM+0x000000-0x000000); // 68000 ROM AddMemFetch(-1, -1, NULL); AddReadByte(0x000000, 0x03FFFF, NULL, ROM+0x000000); // 68000 ROM AddReadByte(0x060000, 0x07FFFF, NULL, RAM+0x000000); // *ALL* RAM AddReadByte(-1, -1, NULL, NULL); AddReadWord(0x000000, 0x03FFFF, NULL, ROM+0x000000); // 68000 ROM AddReadWord(0x060000, 0x07FFFF, NULL, RAM+0x000000); // *ALL* RAM AddReadWord(-1, -1,NULL, NULL); AddWriteByte(0x060000, 0x079FFF, NULL, RAM+0x000000); // *ALL* RAM AddWriteByte(0x07A000, 0x07FFFF, CtrlWriteB, NULL); // *ALL* RAM AddWriteByte(0xAA0000, 0xAA0001, Stop68000, NULL); // Trap Idle 68000 AddWriteByte(-1, -1, NULL, NULL); AddWriteWord(0x060000, 0x07FFFF, NULL, RAM+0x000000); // *ALL* RAM AddWriteWord(-1, -1, NULL, NULL); AddInitMemory(); // Set Starscream mem pointers...}void ClearTecmoSys(void){ #ifdef RAINE_DEBUG //save_debug("ROM.bin",ROM,0x040000,1); //save_debug("RAM.bin",RAM,0x020000,1); #endif}void ExecuteTecmoSysFrame(void){ RAM[0x1A005] = get_dsw(0); RAM[0x1A004] = get_dsw(1); cpu_execute_cycles(CPU_68K_0, CPU_FRAME_MHz(10,60)); // M68000 10MHz (60fps) cpu_interrupt(CPU_68K_0, 5); cpu_execute_cycles(CPU_Z80_0, CPU_FRAME_MHz(8,60)); cpu_interrupt(CPU_Z80_0, 0x38);}static void draw_tecmo_object(int pri){ static int spr_off[4 * 4 * 2] = { 0, 0, 16, 0, 0, 16, 16, 16, 32, 0, 48, 0, 32, 16, 48, 16, 0, 32, 16, 32, 0, 48, 16, 48, 32, 32, 48, 32, 32, 48, 48, 48, }; int x, y, ta, zz, dx, dy, i; UINT8 *MAP; for(zz=0x16000;zz<0x16800;zz+=16){ // SPRITES (HIGH PRIORITY) if((RAM[zz]&0x84)==pri){ y=(ReadWord(&RAM[zz+6])+48)&0x1FF; x=(ReadWord(&RAM[zz+8])+64)&0x1FF; if((x>0)&&(y>0)&&(x<256+64)&&(y<224+64)){ ta=ReadWord(&RAM[zz+2]); if(ta!=0){ MAP_PALETTE_MAPPED_NEW( RAM[zz+4]>>4, 16, MAP ); switch(RAM[zz]&3) { case 0: switch(RAM[zz+4]&0x03){ case 0: // 8x8 Draw8x8_Trans_Mapped_Rot(&GFX_SPR[ta<<6],x,y,MAP); break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -