亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? gbaemu.c

?? 這是模擬器源代碼
?? C
字號:
#include <windows.h>
#include <stdlib.h>
#include <stdio.h> 

#include "gbaemu.h" 
#include "interface.h" 

#include "exec.c"
#include "opcodes.c"
#include "topcodes.c"
#include "io.c" 
#include "opedec.c"
#include "tables.c"
#include "ttables.c"

int init_gbaemu (void)
{
	if (wram_int_u8) free (wram_int_u8);
	if (wram_ext_u8) free (wram_ext_u8);
	if (pal_ram_u8)  free (pal_ram_u8); 
	if (vram_u8)     free (vram_u8);
	if (oam_u8)      free (oam_u8);
	if (arm)		 free (arm);
	if (dummy_mem)	 free (dummy_mem);

	wram_int_u8  = calloc (  0x800, 1);
	wram_ext_u8  = calloc (0x40000, 1);
	pal_ram_u8   = calloc (  0x400, 1);
	vram_u8      = calloc (0x20000, 1); 
	oam_u8       = calloc (  0x400, 1);
	io_ram_u8	 = calloc (  0x400, 1);
	zero_page_u8 = calloc (   0xFF, 1);

	wram_int_u16 = (u16*)wram_int_u8;
	wram_int_u32 = (u32*)wram_int_u8;
	wram_ext_u16 = (u16*)wram_ext_u8;
	wram_ext_u32 = (u32*)wram_ext_u8;
	pal_ram_u16  = (u16*)pal_ram_u8;
	pal_ram_u32  = (u32*)pal_ram_u8;
	vram_u16     = (u16*)vram_u8;
	vram_u32     = (u32*)vram_u8;
	oam_u16      = (u16*)oam_u8;
	oam_u32      = (u32*)oam_u8;
	io_ram_u16	 = (u16*)io_ram_u8;
	io_ram_u32	 = (u32*)io_ram_u8;
	zero_page_u16= (u16*)zero_page_u8;
	zero_page_u32= (u32*)zero_page_u8;

	screen = calloc(0x9600, 1);
	virtual_screen  = calloc (0xA2C0*2, 1);

	arm = calloc (sizeof(ARM7TDMI), 1);
 
	setup_tables ();

	blit_res_x = 240;
	blit_res_y = 160;

	if (!wram_int_u8 || !wram_ext_u8 || !pal_ram_u8 || !vram_u8 || !oam_u8 
	    ||!io_ram_u8 || !arm || !screen || !zero_page_u8 || !virtual_screen)
		return 1;
	else
		return 0; 
}

void reset_gbaemu (word pc, char *debug_destination, char *operand_destination)
{ 
	int i;
	
	debug_str = debug_destination;

	for (i=0; i<0x400; i++)
		pal_ram_u8 [i] = 0;

	for (i=0; i<0x20000; i++)
		vram_u8 [i] = 0;
	
	arm->cpsr = SUPERVISOR_MODE | FIQ_BIT | IRQ_BIT;
	ZFLAG = 0;
	NFLAG = 0;
	CFLAG = 0;
	VFLAG = 0;

	arm->gp_reg [15] = pc;
		
	arm->state = 0;

	fill_instruction_pipe();

	io_ram_u16 [0x98] = 0x3FF;

	strcpy (debug_str, opcode_strings [((OPCODE&0xFF00000)>>16)|((OPCODE&0xF0)>>4)]);

	exec = arm_exec;
}

int load_bin (char *filename)
{
	FILE *fp;
	int file_size;
	int start, end;

	int n, i;

	if (!(fp = fopen(filename, "rb"))) 
		return 0;

	fseek (fp, 0, SEEK_SET);
	start = ftell (fp);
	fseek (fp, 0, SEEK_END);
	end = ftell (fp);
	
	file_size = (end - start)+1;

	fseek (fp, 0, SEEK_SET);

	dummy_mem = calloc (0x10000, 1);

	n=file_size/0x10000;

	for (i=0; i<0x200; i++)
		rom_pages_u8 [i] = dummy_mem;

	for (i=0; i<(n+1); i++) {
		rom_pages_u8 [i] = calloc (0x10000, 1);
		fread (rom_pages_u8 [i], 0x10000, 1, fp);
	}

	fread (rom_pages_u8 [n+1], file_size-(n*0x10000), 1, fp);

	for (i=0; i<0x200; i++) {
		rom_pages_u16 [i] = (u16*)rom_pages_u8 [i];
		rom_pages_u32 [i] = (u32*)rom_pages_u8 [i];
	}
	
	bin.rom_size_u8 = file_size;
	bin.rom_size_u16 = bin.rom_size_u8>>1;
	bin.rom_size_u32 = bin.rom_size_u8>>2;

	fclose (fp);

	return 1; 
}

void setup_tables (void) 
{
	setup_handle_tables(); 
	setup_string_tables();
	setup_io_handle_tables(); 
	setup_debug_handles();
	setup_handle_tables_t();
	setup_string_tables_t();

	render_mode [0] = render_mode0_frame;
	render_mode [1] = render_mode1_frame;
	render_mode [2] = render_mode2_frame;
	render_mode [3] = render_mode3_frame;
	render_mode [4] = render_mode4_frame;
	render_mode [5] = render_mode5_frame;
	render_mode [6] = render_mode4_frame;
	render_mode [7] = render_mode4_frame;

	sprite_sizes_x [0x0] = 8;
	sprite_sizes_x [0x1] = 16;
	sprite_sizes_x [0x2] = 32;
	sprite_sizes_x [0x3] = 64;
	sprite_sizes_x [0x4] = 16;
	sprite_sizes_x [0x5] = 32;
	sprite_sizes_x [0x6] = 32;
	sprite_sizes_x [0x7] = 64;
	sprite_sizes_x [0x8] = 8;
	sprite_sizes_x [0x9] = 8;
	sprite_sizes_x [0xA] = 16;
	sprite_sizes_x [0xB] = 32;
	sprite_sizes_x [0xC] = 0;
	sprite_sizes_x [0xD] = 0;
	sprite_sizes_x [0xE] = 0;
	sprite_sizes_x [0xF] = 0;

	sprite_sizes_y [0x0] = 8;
	sprite_sizes_y [0x1] = 16;
	sprite_sizes_y [0x2] = 32;
	sprite_sizes_y [0x3] = 64;
	sprite_sizes_y [0x4] = 8;
	sprite_sizes_y [0x5] = 8;
	sprite_sizes_y [0x6] = 16;
	sprite_sizes_y [0x7] = 32;
	sprite_sizes_y [0x8] = 16;
	sprite_sizes_y [0x9] = 32;
	sprite_sizes_y [0xA] = 32;
	sprite_sizes_y [0xB] = 64;
	sprite_sizes_y [0xC] = 0;
	sprite_sizes_y [0xD] = 0;
	sprite_sizes_y [0xE] = 0;
	sprite_sizes_y [0xF] = 0;
}

void exec_step (void)
{ 
	exec();
}

void exec_dma3 (void)
{	
	u32 i;
	u16 count = DM3CNT_L;

	if (DM3CNT_H & 0x8000) {

		if (DM3CNT_H & 0x400) {
	
			for (i=0; i<count; i++) {				
	
				write_word (DM3DAD, read_word (DM3SAD));
	
				switch (DM3CNT_H & 0x60) {
					case 0: DM3DAD += 4; break;
					case 1: DM3DAD -= 4; break;
					case 2:				 break;
					case 3: DM3DAD += 4; break;
				}

				switch (DM3CNT_H & 0x180) {
					case 0: DM3SAD += 4; break;
					case 1: DM3SAD -= 4; break;
					case 2:				 break;
					case 3:				 break;
				} 
			}
		}
		else {	

			for (i=0; i<count; i++) {
	
				write_hword (DM3DAD, read_hword (DM3SAD));

				switch (DM3CNT_H & 0x60) {
					case 0: DM3DAD += 2; break;
					case 1: DM3DAD -= 2; break;
					case 2:				 break;
					case 3: DM3DAD += 2; break;
				}
 
				switch (DM3CNT_H & 0x180) {
					case 0: DM3SAD += 2; break;
					case 1: DM3SAD -= 2; break;
					case 2:				 break;
					case 3:				 break;
				}
			} 
		}
	} 
} 

void run_breakpoint (u32 breakpoint)
{
	u32 i, n;
	
	for (;;) { 
		
		io_ram_u16[0x3] = 0;
		io_ram_u32[0x1] &= 0xFFFFFFFE;

		// Screen refresh	
		for (i=0; i<160; i++, io_ram_u16[0x3]++)
			for (n=0; n<1227;)
				if ((arm->gp_reg[15]-8)==breakpoint) return; else n+=exec(); 
  
		io_ram_u32[0x1] |= 0x1;  

		// vblank
		for (i=0; i<68; i++, io_ram_u16[0x3]++)
			for (n=0; n<1227;)
				if ((arm->gp_reg[15]-8)==breakpoint) return; else n+=exec(); 
	}
}

void run_frame (void)
{
		int i, n;	

		io_ram_u16[0x3] = 0;
		io_ram_u32[0x1] &= ~0x1;
	
		for (i=0; i<160; i++, io_ram_u16[0x3]++)
			for (n=0; n<1227;)
				n+=exec();
  
		io_ram_u32[0x1] |= 0x1;

		for (i=0; i<68; i++, io_ram_u16[0x3]++)
			for (n=0; n<1227;)
				n+=exec();
		
		render_mode [DISPCNT&0x7]();
}

void draw_mode0_bg (u32 num)
{
	u32 i, n, y;
	u32 screen_x, screen_y;
	u32 chr_base = ((io_ram_u16[0x4+num]>>2)&0x3 )*0x4000;
	u32 scr_base = ((io_ram_u16[0x4+num]>>8)&0x1F)*0x800;
	u32 hoff = io_ram_u16 [0x8+(num<<1)] & 0x1FF;
	u32 voff = io_ram_u16 [0x9+(num<<1)] & 0x1FF;
	u32 fine_x = hoff&0x7;
	u32 fine_y = voff&0x7;
	u32 map_pointer;
	u32 tile_pointer;
	u16 tile_data;
	u16 chr_data;

	switch ((io_ram_u16[0x4+num]>>14)&0x3) {
		case 0: screen_x = 256; screen_y = 256; break;
		case 1: screen_x = 512; screen_y = 256; break;
		case 2: screen_x = 256; screen_y = 512; break;
		case 3: screen_x = 512; screen_y = 512; break;
	}

	map_pointer = (scr_base>>1) + ((voff>>3)*(screen_x>>3)) + (hoff>>3);

	for (i=0; i<20; i++) {

		for (n=0; n<30; n++, map_pointer++) {
	
			tile_data = vram_u16 [map_pointer];
			tile_pointer = chr_base+((tile_data&0x3FF)*64);	

			switch ((tile_data>>10)&0x3)
			{
				case 0:
					for (y=0; y<64; y++) {	
						chr_data = vram_u8 [tile_pointer+y];
						if (chr_data) virtual_screen [(i*1984)+(n<<3)+((y>>3)*248)+(y&0x7)] = chr_data;
					} break;
				case 1:
					for (y=0; y<64; y++) {
						chr_data = vram_u8 [tile_pointer+(y&(~0x7))+(7-(y&0x7))];
						if (chr_data) virtual_screen [(i*1984)+(n<<3)+((y>>3)*248)+(y&0x7)] = chr_data;				
					} break;
				case 2:
					for (y=0; y<64; y++) {
						chr_data = vram_u8 [tile_pointer+((7-(y>>3))<<3)+(y&0x7)];
						if (chr_data) virtual_screen [(i*1984)+(n<<3)+((y>>3)*248)+(y&0x7)] = chr_data;						
					} break;
				case 3:
					for (y=0; y<64; y++) {
						chr_data = vram_u8[tile_pointer+((7-(y>>3))<<3)+(7-(y&0x7))];
						if (chr_data) virtual_screen [(i*1984)+(n<<3)+((y>>3)*248)+(y&0x7)] = chr_data;						
					}break;
			}
		}
		
		map_pointer += (screen_x-240)>>3;
	}
}

void render_mode0_frame (void)
{
	int i, n;

	for (i=0; i<0xB000; i++) {
		virtual_screen [i] = 0;
	}

	for (i=3; i>=0; i--) {
		
		if (((u32)(BG0CNT&0x3)==(u32)i)&&(DISPCNT&0x100)) draw_mode0_bg (0);
		if (((u32)(BG1CNT&0x3)==(u32)i)&&(DISPCNT&0x200)) draw_mode0_bg (1);
		if (((u32)(BG2CNT&0x3)==(u32)i)&&(DISPCNT&0x400)) draw_mode0_bg (2);
		if (((u32)(BG3CNT&0x3)==(u32)i)&&(DISPCNT&0x800)) draw_mode0_bg (3);
		if (DISPCNT&0x1000) draw_sprites ((u16)i);
	}
	
	for (i=0; i<160; i++) {
		for (n=0; n<240; n++) {
			screen [(i*240)+n] = translated_palette [virtual_screen[(i*248)+n]];
		}
	}
}

void render_mode1_frame (void)
{

}

void render_mode2_frame (void)
{

}

void render_mode3_frame (void)
{
	u32 i;
	u16 temp;

	for (i=0; i<0x9600; i++) {
		temp = vram_u16 [i];
		screen [i] = (u32)(temp<<19)|((temp&0x3E0)<<6)|((temp&0x7C00)>>7);
	}
}

void render_mode4_frame (void)
{
	u32 i;
	u8 *temp_pointer;

	if (DISPCNT&0x10) {
		temp_pointer = vram_u8 + 0xA000;
		for (i=0; i<0x9600; i++) {
			screen [i] = translated_palette [temp_pointer[i]];
		}
	}
	else {
		for (i=0; i<0x9600; i++) {
			screen [i] = translated_palette [vram_u8[i]];
		}
	}
}

void render_mode5_frame (void)
{
	u32 i, n;
	u16 temp;

	if (DISPCNT&0x10) {
		for (i=0; i<128; i++) {
			for (n=0; n<160; n++) {
				temp = vram_u16[(i*160)+n+0x5000];
				screen [(i*240)+n] = (u32)(temp<<19)|((temp&0x3E0)<<6)|((temp&0x7C00)>>7);
			}
		}
	}
	else {
		for (i=0; i<128; i++) {
			for (n=0; n<160; n++) {
				temp = vram_u16[(i*160)+n];
				screen [(i*240)+n] = (u32)(temp<<19)|((temp&0x3E0)<<6)|((temp&0x7C00)>>7);
			}
		}
	}
}

void draw_sprites (u16 priority)
{
	int i;

	for (i=127; i>=0; i--) {
		
		if (((oam_u16[2+(i<<2)]>>10)&0x3)==priority) {

			draw_sprite (oam_u16 [(i<<2)], oam_u16 [(i<<2)+1], oam_u16[(i<<2)+2]);
		}
	}

}

void draw_sprite (u16 a0, u16 a1, u16 a2)
{
	u32 i, n, y;

	u32 chr_base = 0x10000 + ((a2&0x3FF)*64);
	u32 size_x = sprite_sizes_x [((a0>>12)&~0x3)|(a1>>14)];
	u32 size_y = sprite_sizes_y [((a0>>12)&~0x3)|(a1>>14)]; 
	u16 x_off = (a1&0x1FF);
	u16 y_off = (a0&0xFF);
	u16 chr_data;

	for (i=0; i<(size_y>>3); i++) {
		
		for (n=0; n<(size_x>>3); n++) {
			
			for (y=0; y<64; y++) {	

				chr_data = vram_u8 [chr_base+(i*(size_x>>3)*64)+(n*64)+y]+256;
				if (chr_data) virtual_screen [((y_off+(y>>3))*248)+(y&0x7)+x_off+(n<<3)] = chr_data;
			}
		}
	}
}

void clean_up (void)
{
	if (wram_int_u8) free (wram_int_u8);
	if (wram_ext_u8) free (wram_ext_u8);
	if (pal_ram_u8) free (pal_ram_u8); 
	if (vram_u8) free (vram_u8);
	if (oam_u8) free (oam_u8);
	if (arm) free (arm);
	if (hBitmap) free (hBitmap);
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
视频一区视频二区中文字幕| 国产ts人妖一区二区| 奇米四色…亚洲| 国内外成人在线| 成人免费视频国产在线观看| 午夜精品久久久久久久99樱桃| 午夜在线电影亚洲一区| 亚洲欧美综合色| 婷婷国产在线综合| 男人操女人的视频在线观看欧美| 国产一区二区三区四| 在线一区二区三区四区五区| 欧美日韩国产综合久久 | 亚洲欧美区自拍先锋| 亚洲国产精品欧美一二99| 久久成人综合网| 色综合天天狠狠| 久久丝袜美腿综合| 日本午夜精品视频在线观看 | 午夜成人免费电影| 国产一区二区视频在线播放| 色噜噜狠狠色综合欧洲selulu| 成人看片黄a免费看在线| 制服丝袜亚洲色图| 国产精品久久综合| 韩国理伦片一区二区三区在线播放 | 国产精品伦理在线| 美女一区二区久久| 欧美一a一片一级一片| 国产精品视频一二三区| 狠狠色丁香九九婷婷综合五月| 欧美日韩久久久久久| 亚洲丝袜制服诱惑| 不卡一区二区中文字幕| 久久久久久亚洲综合| 国产真实乱偷精品视频免| 欧美区视频在线观看| 石原莉奈一区二区三区在线观看 | 亚洲一区二区三区精品在线| 成人毛片在线观看| 国产精品视频一区二区三区不卡| 久国产精品韩国三级视频| 91麻豆精品国产无毒不卡在线观看 | 欧美一级一区二区| 亚洲动漫第一页| 欧美猛男超大videosgay| 午夜精品影院在线观看| 欧美日本视频在线| 免费观看91视频大全| 欧美一区二区在线免费播放| 日韩成人一区二区| 欧美一区二区视频观看视频| 狠狠色丁香久久婷婷综| 国产欧美一区二区三区沐欲 | 91精品国产入口| 久久精品国产秦先生| 久久久国产精品午夜一区ai换脸| 国产精品69毛片高清亚洲| 日韩一区在线看| 欧美午夜片在线看| 久久99国产精品成人| 国产精品国产三级国产aⅴ入口 | 精品福利av导航| caoporn国产精品| 亚洲一区二区四区蜜桃| 欧美一级黄色大片| 一本一本久久a久久精品综合麻豆| 亚洲综合色噜噜狠狠| 亚洲欧美在线视频观看| 欧美三级视频在线| 国产精品1区2区| 亚洲成人动漫av| 国产精品蜜臀在线观看| 欧美久久久影院| 成人app软件下载大全免费| 污片在线观看一区二区| 一区视频在线播放| 精品久久国产97色综合| 色噜噜狠狠色综合中国| 国产成人亚洲综合a∨猫咪| 首页综合国产亚洲丝袜| 综合在线观看色| 国产日韩欧美制服另类| 717成人午夜免费福利电影| 99精品视频在线播放观看| 激情另类小说区图片区视频区| 亚洲欧美日韩国产成人精品影院 | 国产精品另类一区| 精品国产乱码久久久久久老虎| 色88888久久久久久影院野外| 国产精品一级黄| 麻豆久久久久久| 久久精品国产亚洲a| 日本女优在线视频一区二区| 亚洲国产综合91精品麻豆| 一区二区在线观看视频| 亚洲一区二区在线免费观看视频 | 精品亚洲欧美一区| 不卡影院免费观看| 国产精选一区二区三区| 国产成人免费在线| 不卡一二三区首页| 色综合色综合色综合色综合色综合| 9色porny自拍视频一区二区| www.亚洲色图| 91亚洲精品久久久蜜桃| 99久久免费国产| 日本乱码高清不卡字幕| 欧美色精品天天在线观看视频| 欧美精品日韩综合在线| 欧美电影影音先锋| 久久先锋影音av鲁色资源| 亚洲国产精品国自产拍av| 亚洲精品免费在线| 日韩电影在线观看网站| 国产精一品亚洲二区在线视频| www.久久久久久久久| 欧美日韩精品二区第二页| 精品国产乱码久久久久久1区2区| 国产人伦精品一区二区| 亚洲人成网站精品片在线观看| 亚洲最大成人综合| 激情综合亚洲精品| 欧亚洲嫩模精品一区三区| 日韩一区二区三区在线视频| 成人欧美一区二区三区在线播放| 亚洲午夜精品17c| 国产伦精品一区二区三区在线观看| 99re热视频精品| 日韩精品影音先锋| 亚洲一级电影视频| 丰满少妇久久久久久久| 欧美日本在线播放| 一区二区三区在线播放| 国产真实乱对白精彩久久| 宅男噜噜噜66一区二区66| 一区二区三区中文字幕精品精品 | 性做久久久久久免费观看 | 亚洲最大成人综合| 成人av综合在线| 国产婷婷一区二区| 久久国产精品免费| 91精品国产综合久久香蕉的特点| 中文字幕在线不卡视频| 成人一级片在线观看| 精品盗摄一区二区三区| 日韩成人一级片| 欧美丰满高潮xxxx喷水动漫| 亚洲国产综合色| 欧美日韩一区二区三区不卡| 亚洲精品视频在线看| 色偷偷久久一区二区三区| 亚洲免费伊人电影| 91久久精品一区二区三| 伊人婷婷欧美激情| 欧美日韩1234| 麻豆视频观看网址久久| 久久久久久久久伊人| 成人午夜又粗又硬又大| 国产精品电影院| 欧洲人成人精品| 日本vs亚洲vs韩国一区三区二区| 欧美一级日韩免费不卡| 麻豆国产精品官网| 久久免费午夜影院| 91麻豆.com| 久久国产夜色精品鲁鲁99| 亚洲一区二区在线免费观看视频| av电影在线不卡| 一区二区在线看| 日韩免费高清视频| 国产成人午夜99999| 亚洲综合另类小说| 日韩欧美一区二区不卡| 丁香激情综合五月| 亚洲一区二区三区中文字幕在线 | 欧美日韩国产综合一区二区三区| 免费的国产精品| 亚洲日本欧美天堂| 日韩一区二区三区四区| 99精品视频在线观看| 蜜桃视频在线一区| 一区二区三区在线观看欧美| 精品国产乱码久久久久久免费| 蜜桃精品在线观看| 欧美探花视频资源| 一区二区三区四区乱视频| 91丨porny丨最新| 亚洲国产精品天堂| 国产精品短视频| 精品国产乱码久久久久久图片| 91亚洲国产成人精品一区二三| 国内精品自线一区二区三区视频| 亚洲免费观看高清完整版在线 | 99vv1com这只有精品| 久久aⅴ国产欧美74aaa| 婷婷一区二区三区| 亚洲一区二区三区在线| **性色生活片久久毛片| 久久精品一区二区三区不卡|