game.c
来自「ESS3890+SL原代码(1*16内存)」· C语言 代码 · 共 1,099 行 · 第 1/3 页
C
1,099 行
copy_gm_data(gm_rom); gm_text_start = dram_cached(GMBY_CODE_start); gm_r22_seg=(gm_text_start+256*1024)>>2; /* R22 segment */ asm("nop"); asm("ld _gm_r22_seg[r0],r22"); asm("nop");#if 0 /*Call game main function */ kkk= (gm_text_start)>>2; asm("ld _kkk[r0],r1"); asm("nop"); asm("jspci r1,#0,r31"); asm("nop"); asm("nop");#endif}unsigned int scramble(unsigned int d){ unsigned int r, t1, t2; r = d & 0x56565656; /* no change for bit 1, 2, 4, 6 of each byte */ t1 = d & 0x55555555; /* get bit 0, 2, 4, 6 of each byte */ t2 = d & 0xaaaaaaaa; /* get bit 1, 3, 5, 7 of each byte */ d = t2 ^ (t1 << 1); /* set bit 0, 3, 5, 7 of each byte */ r |= (d & 0xfcfcfcfc) | ((d >> 1) & 0x1010101); return r;}extern volatile int glbTimer;int gbl_timer(){ return glbTimer;}int mvd_timer(){ return mvd[riface_timer2];}void GM_init_gbl(){ int i, *tmp, chksum,chksum1, h_l; int *data_rom, *gm_rom, *data_addr; GBL P_gbl; #if (defined VGB_CD || defined INES_CD) data_rom = (int *)dram_cached(GMBY_ROM_start); if(*(data_rom) == 0x3C080808){#ifdef INES_CD if(*(data_rom+1) == 0x2508FFFF){ gmby_name_id = 0x60; h_l = 12032; } else#endif /*INES_CD*/#ifdef VGB_CD if (*(data_rom+1) == 0x2509FFFF) { gmby_name_id = 0x20; h_l = 16128; data_addr = data_rom + 0x3A20; } else if (*(data_rom+1) == 0x250AFFFF) { gmby_name_id = 0x30; h_l = 12032; data_addr = data_rom + 0x2A20; } else #endif /*VGB_CD*/ return; gm_rom = data_rom + 256; chksum = chksum1 = 0; tmp = gm_rom; for(i=0; i<h_l; i++){ chksum += gm_rom[i]; tmp[i] = scramble(gm_rom[i]); chksum1 += tmp[i]; } if(chksum != data_rom[4] || chksum1 != data_rom[3]) return;#ifdef VGB_CD if(gmby_name_id == 0x30 || gmby_name_id == 0x20){ RISC_to_dram(VGB_CyclesCB_start, (int *)data_addr, 64); data_addr += 64; RISC_to_dram(VGB_GBtoZ80_start, (int *)data_addr, 64); data_addr += 64; RISC_to_dram(VGB_Z80toGB_start, (int *)data_addr, 64); data_addr += 64; RISC_to_dram(VGB_HFlip_start, (int *)data_addr, 64); data_addr += 64; RISC_to_dram(VGB_DAATable_start, (int *)data_addr, 1024); }#endif GM_copy_rom(gm_rom); } else return;#endif /*VGB_CD || INES_CD*/ tmp = (int *)dram_cached(GMBY_GBL_start); *tmp = (dram_cached(GMBY_CODE_start))>>2; dram_clear(GMBY_GBL_start, GMBY_GBL_size); P_gbl = (GBL) dram_cached(GMBY_GBL_start); P_gbl->gbl_start = GMBY_GBL_start; /*function pointer */ P_gbl->dram_clear = dram_clear; P_gbl->risc_copy = RISC_to_dram; P_gbl->flush_cache = UTIL_flushcache; P_gbl->vcx_service = VCX_service; P_gbl->echo_main = ECHO_main; P_gbl->micro_engine = microEngine; P_gbl->init_pad = CDGM_init_pad; P_gbl->key_process = CDGM_key_process; P_gbl->init_disp = CDGM_init_disp; P_gbl->ld_yuvpal = CDGM_ld_yuvpal; P_gbl->hscale = CDGM_hscale; P_gbl->hscale_recover = CDGM_hscale_recover; P_gbl->trash_snd = CD_TrashSound; P_gbl->init_sound = CD_InitSound; /*Const data */ P_gbl->gbl_start = GMBY_GBL_start; P_gbl->rom_start = GMBY_ROM_start; P_gbl->snddp_start = GMBY_SNDDP_start; P_gbl->snddp_size = GMBY_SNDDP_size; /*global variables */ /*Seem that we cannot pass the cached pointer*/ P_gbl->name_id = gmby_name_id; P_gbl->game_width = 276; P_gbl->u_period = NES_U_Period;#ifdef INES_CD if(gmby_name_id == 0x60){ P_gbl->game_misc = game_list_misc_def; P_gbl->game_buff_size = game_list_buffer_size; P_gbl->is_game = is_ess_game; P_gbl->file_size = gmby_file_size; P_gbl->play_item = gmby_play_item; P_gbl->is_scrambled = gmby_is_scrambled; P_gbl->is_v = gmby_is_v; P_gbl->snd_lengths = INES_SNDLength_start; P_gbl->noise_freq = (INES_SNDLength_start + 32); P_gbl->put_image = VGAPutImage; P_gbl->sound_loop = SoundLoop; P_gbl->sync_snd = NSyncSND; P_gbl->get_timer = GM_get_timer; P_gbl->rgb_start = GMBY_RGB_start; P_gbl->rgb_size = GMBY_RGB_size; P_gbl->ram_start = INES_RAM_start; P_gbl->ram_size = GMBY_RAM_size; P_gbl->stack_start = INES_STACK_start; P_gbl->stack_size = GMBY_STACK_size; P_gbl->sndstk_start = GMBY_SNDSTK_start; P_gbl->sndstk_size = GMBY_SNDSTK_size; P_gbl->conv_tbl = NES_Conv; P_gbl->palette_start = INES_Palette_start; P_gbl->zntable_start = INES_ZNTable_start; P_gbl->sram_start = INES_SRAM_start; P_gbl->sprites_start = INES_Sprites_start; P_gbl->conv_start = INES_Conv_start; P_gbl->palette_tbl = INES_Palette; P_gbl->sunplus_tbl = NES_sunplus; }#endif#ifdef VGB_CD if(gmby_name_id == 0x20){ P_gbl->vput_image = VGB_PutImage; P_gbl->sync_snd = SyncSND; P_gbl->gbl_timer = gbl_timer; P_gbl->mvd_timer = mvd_timer; P_gbl->rgb_start = VGB_RGB_start; P_gbl->rgb_size = VGB_RGB_size; P_gbl->stack_start = VGB_STACK_start; P_gbl->stack_size = VGB_STACK_size; P_gbl->ram_start = VGB_RAM_start; P_gbl->ram_size = VGB_RAM_size; P_gbl->sgb_start = VGB_SGB_start; P_gbl->sgb_size = VGB_SGB_size; P_gbl->sndstk_start = VGB_SNDSTK_start; P_gbl->sndstk_size = VGB_SNDSTK_size; P_gbl->io_start = VGB_IO_start; P_gbl->io_size = VGB_IO_size; P_gbl->cycles_start = VGB_Cycles_start; P_gbl->cyclescb_start = VGB_CyclesCB_start; P_gbl->gb2z80_start = VGB_GBtoZ80_start; P_gbl->z802gb_start = VGB_Z80toGB_start; P_gbl->hflip_start = VGB_HFlip_start; P_gbl->daatable_start = VGB_DAATable_start; P_gbl->t2_period = timer2_period; #if 0 P_gbl->p_cyclescb = CyclesCB; P_gbl->p_gb2z80 = GBtoZ80; P_gbl->p_z802gb = Z80toGB; P_gbl->p_hflip = HFlip; P_gbl->p_daatable = DAATable; #endif }#endif LOW_reset_audio_port(); system_audio_partial_reset(0); P_gbl->main(GMBY_GBL_start);#ifdef INES_CD gmby_name_id = 0;#endif}#ifdef VGB_CDvoid VGB_PutImage(V_Image *Img,int X,int Y,int W,int H){ /*divide the rgb buffer to be 32*144 block*/ register int j, k, dram_blkw, dramAddr, y_blkdw, uv_blkdw; int *pU0, *pV0, *pY0, *pY1; register int pU0_bb, pV0_bb, pY0_bb, pY1_bb; unsigned char *Source; int blkw_cnt, D_Source, game_id; DISP_frame = 0; pY0 = CD_gm_startY + ((H==224)?716:4248); pY1 = pY0 + 88; pU0 = CD_gm_startU + ((H==224)?358:2124); pV0 = CD_gm_startV + ((H==224)?358:2124); Source = Img->Data+((Y==0)?0:10240)+X; D_Source = ((int)Source|0x10000000)>>2; blkw_cnt = (W==160)?3:4; y_blkdw = 16; uv_blkdw = 8; dram_blkw = Img->W>>2; H >>= 1; UTIL_flushcache(0x30, 8192); for(j=0;j<blkw_cnt; j++) { /*Transfer color pallete to VP*/ VP_xfer(NCMDQ_VP_xfer, VPCMD_W_DP, 0, 0, ((int)CD_yuv_pal >> 2), 256, 1); pY0_bb = (int)pY0>>2; pY1_bb = (int)pY1>>2; pU0_bb = (int)pU0>>2; pV0_bb = (int)pV0>>2; dramAddr = D_Source; if(j == 2 && W == 160){/*for 160= 64+64+32*/ y_blkdw = 8; uv_blkdw = 4; } for(k=0; k<H; k++){/*process two lines for each time*/ VP_cmdq_wait(13); VP_xfer(0,VPCMD_W_DPCM,GM_RGB4_START,0,(int)dramAddr,y_blkdw,1); dramAddr += dram_blkw; VP_xfer(0,VPCMD_W_DPCM,GM_RGB5_START,0,(int)dramAddr,y_blkdw,1); dramAddr += dram_blkw; VP_data(0, gmby_no_deflicker); VP_ucode(0, deflicker); wait4l_only; wait4l_only; /* Read YUV data from DM */ VP_cmdq_wait(16); VP_xfer(0,VPCMD_R_DPCM,GM_Y1_START,0,pY0_bb,y_blkdw,1); VP_xfer(0,VPCMD_R_DPCM,GM_Y2_START,0,pY1_bb,y_blkdw,1); VP_xfer(0,VPCMD_R_DPCM,GM_U420_START,0,pU0_bb,uv_blkdw,1); VP_xfer(0,VPCMD_R_DPCM,GM_V420_START,0,pV0_bb,uv_blkdw,1); pY0_bb += 176;/*jump two lines for Y*/ pY1_bb += 176; pU0_bb += 88; pV0_bb += 88; } pY0 += y_blkdw; pY1 += y_blkdw; pU0 += uv_blkdw; pV0 += uv_blkdw; D_Source += 16; MIC_service(); }}void SyncSND(){ int nn, n;/*70224/4194304*F_LATCH*/ int pcm_space,pcm_ptr; int *dp; VGB_SND *SNDChip; SNDChip = VSNDChip;#ifdef ECHO MIC_service();#endif /* Update changed channels */ /* check PCM buffer has space */ PCM_update_space(pcm_space); if ( pcm_space >= 1536 ) { if ( NOTE_EMPTY(SNDChip) ) { return; } SNDChip->rp = (SNDChip->rp+1)&(RECORD_NOTES-1); /* generate the pcm value */ dp = (int *)dram(GMBY_SNDVAL_start); dp[5] = (SNDChip->freq[SNDChip->rp][0]); dp[7] = (SNDChip->volume[SNDChip->rp][0]); dp[11] = (SNDChip->freq[SNDChip->rp][1]); dp[13] = (SNDChip->volume[SNDChip->rp][1]); dp[17] = (SNDChip->freq[SNDChip->rp][2]); dp[19] = (SNDChip->volume[SNDChip->rp][2]); dp[1] = 0; /* clear the noise channel */ VP_xfer(6*NCMDQ_VP_xfer, VPCMD_W_DP, 0, VPDMA_INC1+VPDMA_USEDX, GMBY_SNDVAL_start, GMBY_SNDVAL_size+GMBY_SNDCOE_size, 1); for (nn = 0; nn < 4; nn++) { asm("nop"); asm("nop"); if ( (nn==0) || (nn==2) ) { pcm_ptr = PCM_raw_wrptr; } VP_xfer(0, VPCMD_W_DPCM, 368, 0, GMBY_SNDHIS_start, GMBY_SNDHIS_size, 1); if ( nn==0 ) { VP_ucode(0, syncsnd); } else { VP_ucode(0, rsyncsnd); } wait4l_only; wait4l_only; VP_xfer(0, VPCMD_R_DPCM, 560, 0, GMBY_SNDHIS_start, GMBY_SNDHIS_size, 1); VP_xfer(0, VPCMD_R_DP, 0, 0, pcm_ptr, 192, 1); VP_xfer_wait(); if ( (nn==0) || (nn==2) ) { pcm_ptr += 192; } else { BUF_advance_ptr(PCM_raw_wrptr,384,PCM); BUF_advance_ptr(PCM_raw_rdptr,384,PCM);#ifdef SPATIAL BUF_advance_ptr(SPA_wrptr,384,PCM);#endif BUF_advance_ptr(PCM_wrptr,384,PCM); } } VP_xfer(0, VPCMD_R_DP, 384, VPDMA_INC1+VPDMA_USEDX, GMBY_SNDVAL_start, GMBY_SNDVAL_size, 1); VP_xfer_wait(); }}#endif /*VGB_CD*/#endif /*VGB_CD || INES_CD*/#endif /* GAMEBOY */
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?