int rom_load(char * rpath) { char tmp[PATH_MAX]; int romsize, ramsize; strcpy(RomPath,rpath); strcpy(tmp, RomPath); *(strrchr(tmp,'/')+1) = 0; strcpy(setting2.lastpath, tmp); bTurbo = 0; gb_destroy(); gb_init(); // w赜t@Cð[h·éB by ruka romsize = load_rom(RomPath); if (!romsize){ renderer_set_msg("ROM Load Failed"); return -1; } ramsize = load_sram(SramPath); if (!gb_load_rom(rom_image, romsize, sram_space, ramsize)){ renderer_set_msg("ROM Load Failed"); return -1; } if(org_gbtype==1) renderer_set_msg("ROM TYPE:GB"); else if(org_gbtype==2) renderer_set_msg("ROM TYPE:SGB"); else if(org_gbtype==3) renderer_set_msg("ROM TYPE:GBC"); free_rewind_states(); allocate_rewind_states(); set_gb_type(); return romsize; }
int main(int argc, char *argv[]) { program_name = argv[0] ? argv[0] : "nesalizer"; #ifndef RUN_TESTS if (argc != 2) { fprintf(stderr, "usage: %s <rom file>\n", program_name); exit(EXIT_FAILURE); } #else (void)argc; // Suppress warning #endif install_fatal_signal_handlers(); // One-time initialization of various components init_apu(); init_input(); init_mappers(); #ifndef RUN_TESTS load_rom(argv[1], true); #endif // Create a separate emulation thread and use this thread as the rendering // thread init_sdl(); SDL_Thread *emu_thread; fail_if(!(emu_thread = SDL_CreateThread(emulation_thread, "emulation", 0)), "failed to create emulation thread: %s", SDL_GetError()); sdl_thread(); SDL_WaitThread(emu_thread, 0); deinit_sdl(); #ifndef RUN_TESTS unload_rom(); #endif puts("Shut down cleanly"); }
int OnQuickloadOk(const void *browser, const void *path) { int first_time = 0; if (!GAME_LOADED) first_time = 1; if (!load_rom((char*)path)) { pspUiAlert("Error loading cartridge"); return 0; } SET_AS_CURRENT_GAME((char*)path); pl_file_get_parent_directory((const char*)path, GamePath, sizeof(GamePath)); /* Reset selected state */ SaveStateGallery.Menu.selected = NULL; if (first_time) { pspUiFlashMessage("Initializing for first-time use\nPlease wait..."); audio_init(SOUND_FREQUENCY, 0); system_init(); //error_init(); system_reset(); } else{ system_init(); system_reset(); audio_reset(); } pl_rewind_reset(&Rewinder); ResumeEmulation = 1; return 1; }
void ResetComputer () { static int bucle; Z80free_reset (&procesador); load_rom (ordenador->mode128k); ordenador->updown=0; ordenador->leftright=0; ordenador->mport1 = 0; ordenador->mport2 = 0; ordenador->video_offset = 0; // video in page 9 (page 5 in 128K) switch (ordenador->mode128k) { case 0: // 48K ordenador->block0 = ordenador->memoria; ordenador->block1 = ordenador->memoria + 131072; // video mem. in page 9 (page 5 in 128K) ordenador->block2 = ordenador->memoria + 65536; // 2nd block in page 6 (page 2 in 128K) ordenador->block3 = ordenador->memoria + 65536; // 3rd block in page 7 (page 3 in 128K) ordenador->mport1 = 32; // access to port 7FFD disabled break; case 3: // +2A/+3 Z80free_Out (0x1FFD, 0); case 1: // 128K case 2: // +2 case 4: // spanish 128K Z80free_Out (0x7FFD, 0); break; } spk_ay->reset(); keyboard->reset(); screen->reset(ordenador->mode128k); microdrive->reset(); }
int genesis_init() { static int bfirstRun = true; if (bfirstRun) { FirstRun(); bfirstRun = false; } /* set default config */ error_init(); set_config_defaults(); /* Load ROM file */ cart.rom = (unsigned char*) malloc(10 * 1024 * 1024); memset(cart.rom, 0, 10 * 1024 * 1024); // //if (!load_rom("uda:/sonic.smd")) { if (!load_rom(romname)) { char buf[1024]; sprintf(buf, "Error loading file `%s'.", romname); ErrorPrompt(buf); free(cart.rom); return 1; } // now running running = 1; // not exit gen_exit = 0; SYSInputReset(); /* load BIOS */ memset(bios_rom, 0, sizeof (bios_rom)); FILE *f = fopen(OS_ROM, "rb"); if (f != NULL) { fread(&bios_rom, 0x800, 1, f); fclose(f); int i; for (i = 0; i < 0x800; i += 2) { uint8 temp = bios_rom[i]; bios_rom[i] = bios_rom[i + 1]; bios_rom[i + 1] = temp; } config.tmss |= 2; } /* initialize Genesis virtual system */ memset(&bitmap, 0, sizeof (t_bitmap)); // bitmap.width = g_pTexture->width; // bitmap.height = g_pTexture->height; // bitmap.pitch = g_pTexture->wpitch; bitmap.width = 1024; bitmap.height = 576; bitmap.pitch = bitmap.width * 4; bitmap.data = screen; bitmap.viewport.changed = 3; //config.overscan = 0; // disabled /* initialize emulation */ printf("audio_init\r\n"); audio_init(SOUND_FREQUENCY, vdp_pal ? 50.0 : 60.0); printf("system_init\r\n"); system_init(); printf("sramname\r\n"); /* load SRAM */ if (gensettings.saves & SAVES_SRAM) { load_sram(sramname); } /* user cfg */ SetGenConfig(); /* reset emulation */ system_reset(); /* run 1 frame */ system_frame(0); if (gensettings.saves & SAVES_STATES) { load_state(statename); } return 0; }
static void load_opwolf(void) { UINT8 *TMP; int ta,tb; if (is_current_game("opwolf")) romset = 0; else if (is_current_game("opwolfb")) romset = 1; RAMSize=0x60000; set_reset_function(clear_ram); if(!(RAM=AllocateMem(0x80000))) return; if(!(ROM=AllocateMem(0x40000))) return; if(!(GFX=AllocateMem(0x200000))) return; GFX_SPR = GFX+0x100000; Z80ROM2=RAM+0x50000; // C-CHIP ROM/RAM if(romset==1){ // BOOTLEG tb=0; if(!load_rom("opwlfb.08", RAM+0x00000, 0x10000)) return; // 8x8 TILES if(!load_rom("opwlfb.06", RAM+0x10000, 0x10000)) return; // 8x8 TILES if(!load_rom("opwlfb.07", RAM+0x20000, 0x10000)) return; // 8x8 TILES if(!load_rom("opwlfb.05", RAM+0x30000, 0x10000)) return; // 8x8 TILES if(!load_rom("opwlfb.04", RAM+0x40000, 0x10000)) return; // 8x8 TILES if(!load_rom("opwlfb.02", RAM+0x50000, 0x10000)) return; // 8x8 TILES if(!load_rom("opwlfb.03", RAM+0x60000, 0x10000)) return; // 8x8 TILES if(!load_rom("opwlfb.01", RAM+0x70000, 0x10000)) return; // 8x8 TILES for(ta=0;ta<0x40000;ta++,tb+=4){ GFX[tb+0]=RAM[ta+0x00000]>>4; GFX[tb+1]=RAM[ta+0x00000]&15; GFX[tb+2]=RAM[ta+0x40000]>>4; GFX[tb+3]=RAM[ta+0x40000]&15; } if(!load_rom("opwlfb.14", RAM+0x00000, 0x10000)) return; // 16x16 TILES if(!load_rom("opwlfb.15", RAM+0x10000, 0x10000)) return; // 16x16 TILES if(!load_rom("opwlfb.16", RAM+0x20000, 0x10000)) return; // 16x16 TILES if(!load_rom("opwlfb.17", RAM+0x30000, 0x10000)) return; // 16x16 TILES if(!load_rom("opwlfb.18", RAM+0x40000, 0x10000)) return; // 16x16 TILES if(!load_rom("opwlfb.19", RAM+0x50000, 0x10000)) return; // 16x16 TILES if(!load_rom("opwlfb.20", RAM+0x60000, 0x10000)) return; // 16x16 TILES if(!load_rom("opwlfb.21", RAM+0x70000, 0x10000)) return; // 16x16 TILES for(ta=0;ta<0x40000;ta++,tb+=4){ GFX[tb+0]=RAM[ta+0x00000]>>4; GFX[tb+1]=RAM[ta+0x00000]&15; GFX[tb+2]=RAM[ta+0x40000]>>4; GFX[tb+3]=RAM[ta+0x40000]&15; } if(!load_rom("opwlfb.12", RAM, 0x10000)) return; // 68000 ROM for(ta=0;ta<0x10000;ta++){ ROM[ta+ta]=RAM[ta]; } if(!load_rom("opwlfb.10", RAM, 0x10000)) return; for(ta=0;ta<0x10000;ta++){ ROM[ta+ta+1]=RAM[ta]; } if(!load_rom("opwlfb.13", RAM, 0x10000)) return; for(ta=0;ta<0x10000;ta++){ ROM[ta+ta+0x20000]=RAM[ta]; } if(!load_rom("opwlfb.11", RAM, 0x10000)) return; for(ta=0;ta<0x10000;ta++){ ROM[ta+ta+0x20001]=RAM[ta]; } if(!load_rom("opwlfb.09", Z80ROM2, 0x8000)) return; // Z80 C-CHIP ROM }
/**************************************************************************** * LoadFile * * This function will load a game file into the ROM buffer. * This functions return the actual size of data copied into the buffer * ****************************************************************************/ int LoadFile(int selection) { int size, cd_mode1, filetype; char filename[MAXPATHLEN]; /* file path */ char *filepath = (deviceType == TYPE_RECENT) ? history.entries[selection].filepath : fileDir; /* full filename */ sprintf(filename, "%s%s", filepath, filelist[selection].filename); /* DVD hot swap */ if (!strncmp(filepath, rootdir[TYPE_DVD], strlen(rootdir[TYPE_DVD]))) { /* Check if file is still accessible */ struct stat filestat; if(stat(filename, &filestat) != 0) { /* If not, try to mount DVD */ if (!MountDVD()) return 0; } } /* open message box */ GUI_MsgBoxOpen("Information", "Loading game...", 1); /* no cartridge or CD game loaded */ size = cd_mode1 = 0; /* check if virtual CD tray was open */ if ((system_hw == SYSTEM_MCD) && (cdd.status == CD_OPEN)) { /* swap CD image file in (without changing region, system,...) */ size = cdd_load(filename, (char *)(cdc.ram)); /* check if a cartridge is currently loaded */ if (scd.cartridge.boot) { /* CD Mode 1 */ cd_mode1 = size; } else { /* update game informations from CD image file header */ getrominfo((char *)(cdc.ram)); } } /* no CD image file loaded */ if (!size) { /* close CD tray to force system reset */ cdd.status = NO_DISC; /* load game file */ size = load_rom(filename); } if (size > 0) { /* do not update game basename if a CD was loaded with a cartridge (Mode 1) */ if (cd_mode1) { /* add CD image file to history list */ filetype = 1; } else { /* auto-save previous game state */ slot_autosave(config.s_default,config.s_device); /* update game basename (for screenshot, save & cheat files) */ if (romtype & SYSTEM_SMS) { /* Master System ROM file */ filetype = 2; sprintf(rom_filename,"ms/%s",filelist[selection].filename); } else if (romtype & SYSTEM_GG) { /* Game Gear ROM file */ filetype = 3; sprintf(rom_filename,"gg/%s",filelist[selection].filename); } else if (romtype == SYSTEM_SG) { /* SG-1000 ROM file */ filetype = 4; sprintf(rom_filename,"sg/%s",filelist[selection].filename); } else if (romtype == SYSTEM_MCD) { /* CD image file */ filetype = 1; sprintf(rom_filename,"cd/%s",filelist[selection].filename); } else { /* by default, Genesis ROM file */ filetype = 0; sprintf(rom_filename,"md/%s",filelist[selection].filename); } /* remove file extension */ int i = strlen(rom_filename) - 1; while ((i > 0) && (rom_filename[i] != '.')) i--; if (i > 0) rom_filename[i] = 0; } /* add/move the file to the top of the history. */ history_add_file(filepath, filelist[selection].filename, filetype); /* recent file list may have changed */ if (deviceType == TYPE_RECENT) deviceType = -1; /* close message box */ GUI_MsgBoxClose(); /* valid image has been loaded */ return 1; } GUI_WaitPrompt("Error", "Unable to load game"); return 0; }
static void load_pbobbl2x(void) { int ta,tb,tc; RAMSize=0x80000; if(!(RAM=AllocateMem(0x80000))) return; if(!(ROM=AllocateMem(0x100000))) return; if(!(GFX=AllocateMem(0x3F5D00+0x3EC700))) return; GFX_BG0 = GFX+0x3F5D00; GFX_SPR = GFX+0x000000; tb=0; if(!load_rom("e10-02.rom", ROM, 0xFD740)) return; // 16x16 SPRITES ($3F5D) for(ta=0;ta<0xFD740;ta++){ GFX[tb++]=ROM[ta]&15; GFX[tb++]=ROM[ta]>>4; tb+=2; } tb=2; if(!load_rom("e10-01.rom", ROM, 0xFD740)) return; // 16x16 SPRITES for(ta=0;ta<0xFD740;ta++){ GFX[tb++]=ROM[ta]&15; GFX[tb++]=ROM[ta]>>4; tb+=2; } tb=0; if(!load_rom("e10-07.rom", ROM, 0xFB1C0)) return; // 16x16 TILES ($3EC7) for(ta=0;ta<0xFB1C0;ta+=2){ GFX_BG0[tb++]=ROM[ta]&15; GFX_BG0[tb++]=ROM[ta]>>4; GFX_BG0[tb++]=ROM[ta+1]&15; GFX_BG0[tb++]=ROM[ta+1]>>4; tb+=4; } tb=4; if(!load_rom("e10-06.rom", ROM, 0xFB1C0)) return; // 16x16 TILES for(ta=0;ta<0xFB1C0;ta+=2){ GFX_BG0[tb++]=ROM[ta]&15; GFX_BG0[tb++]=ROM[ta]>>4; GFX_BG0[tb++]=ROM[ta+1]&15; GFX_BG0[tb++]=ROM[ta+1]>>4; tb+=4; } tb=0; if(!load_rom("e10-05.rom", ROM, 0xFB1C0)) return; // 16x16 TILES (MASK) for(ta=0;ta<0xFB1C0;ta+=2){ tc=ROM[ta]; GFX_BG0[tb+7]|=((tc&0x80)>>7)<<4; GFX_BG0[tb+6]|=((tc&0x40)>>6)<<4; GFX_BG0[tb+5]|=((tc&0x20)>>5)<<4; GFX_BG0[tb+4]|=((tc&0x10)>>4)<<4; GFX_BG0[tb+3]|=((tc&0x08)>>3)<<4; GFX_BG0[tb+2]|=((tc&0x04)>>2)<<4; GFX_BG0[tb+1]|=((tc&0x02)>>1)<<4; GFX_BG0[tb+0]|=((tc&0x01)>>0)<<4; tc=ROM[ta+1]; GFX_BG0[tb+7]|=((tc&0x80)>>7)<<5; GFX_BG0[tb+6]|=((tc&0x40)>>6)<<5; GFX_BG0[tb+5]|=((tc&0x20)>>5)<<5; GFX_BG0[tb+4]|=((tc&0x10)>>4)<<5; GFX_BG0[tb+3]|=((tc&0x08)>>3)<<5; GFX_BG0[tb+2]|=((tc&0x04)>>2)<<5; GFX_BG0[tb+1]|=((tc&0x02)>>1)<<5; GFX_BG0[tb+0]|=((tc&0x01)>>0)<<5; tb+=8; } GFX_BG0_SOLID = make_solid_mask_16x16(GFX_BG0, 0x3EC7); GFX_SPR_SOLID = make_solid_mask_16x16(GFX_SPR, 0x3F5D); GFX_BG0_PENS = make_colour_count_16x16(GFX_BG0, 0x3EC7); // Setup 68020 Memory Map // ---------------------- AddF3MemoryMap(0x100000); RAM_BG0=RAM+0x33000; RAM_BG1=RAM+0x32000; RAM_BG2=RAM+0x31000; RAM_BG3=RAM+0x30000; RAM_SCR0=RAM+0x6A006; RAM_SCR1=RAM+0x6A004; RAM_SCR2=RAM+0x6A002; RAM_SCR3=RAM+0x6A000; SCR3_XOFS=0xF640; SCR2_XOFS=0xF740; SCR1_XOFS=0xF840; SCR0_XOFS=0xF940; SCR3_YOFS=0xF400; SCR2_YOFS=0xF400; SCR1_YOFS=0xF400; SCR0_YOFS=0xF400; if(!load_rom("e10.29", RAM, 0x40000)) return; for(ta=0;ta<0x40000;ta++){ ROM[(ta<<2)+0]=RAM[ta]; } if(!load_rom("e10.28", RAM, 0x40000)) return; for(ta=0;ta<0x40000;ta++){ ROM[(ta<<2)+1]=RAM[ta]; } if(!load_rom("e10.27", RAM, 0x40000)) return; for(ta=0;ta<0x40000;ta++){ ROM[(ta<<2)+2]=RAM[ta]; } if(!load_rom("e10.26", RAM, 0x40000)) return; for(ta=0;ta<0x40000;ta++){ ROM[(ta<<2)+3]=RAM[ta]; } // 68000 code M68000ROM = load_region[REGION_ROM2]; if(!(PCMROM=AllocateMem(0x800000))) return; load_be("e10-03.rom",PCMROM,0x200000); load_be("e10-04.rom",PCMROM+0x400000,0x200000); max_banks_this_game=3; //=memory_region_length(REGION_SOUND1)/0x400000; memset(RAM+0x00000,0x00,0x80000); memset(RAM+0x69000,0xFF,0x01000); // EEPROM ACCESS // ------------- WriteWord68k(&ROM[0x0044D2],0x7F00); // raine #$00 <eeprom access> WriteWord68k(&ROM[0x0044D4],0x4ED6); // jmp (a6) // SPEED HACK // ---------- WriteWord68k(&ROM[0x031D4],0x4EF9); // jmp $F8000 WriteLong68k(&ROM[0x031D6],0x000F8000); WriteWord68k(&ROM[0xF8000],0x4EB9); // jsr $0291C <random gen> WriteLong68k(&ROM[0xF8002],0x0000291C); WriteWord68k(&ROM[0xF8006],0x7F02); // raine #$02 <stop cpu> WriteWord68k(&ROM[0xF8008],0x6100-10); // bra.s <loop> F3SystemEEPROMAccess=&F3SysEEPROMAccessMode2; set_colour_mapper(&col_map_xxxx_xxxx_rrrr_rrrr_gggg_gggg_bbbb_bbbb); InitPaletteMap(RAM+0x60000, 0x200, 0x40, 0x8000); // Init tc0003vcu emulation // ------------------------ tc0003vcu.RAM = RAM+0x20000; tc0003vcu.mapper = &Map_24bit_xRGB; tc0003vcu.bmp_x = 64; tc0003vcu.bmp_y = 64; tc0003vcu.bmp_w = 320; tc0003vcu.bmp_h = 232; tc0003vcu.scr_x = 0; tc0003vcu.scr_y = 0; // Init tc0200obj emulation // ------------------------ tc0200obj.RAM = RAM+0x20000; tc0200obj.RAM_B = RAM+0x28000; tc0200obj.GFX = GFX_SPR; tc0200obj.MASK = GFX_SPR_SOLID; tc0200obj.bmp_x = 64; tc0200obj.bmp_y = 64; tc0200obj.bmp_w = 320; tc0200obj.bmp_h = 232; tc0200obj.mapper = &Map_24bit_xRGB; tc0200obj.tile_mask = 0x3FFF; tc0200obj.ofs_x = 0-0x2E; tc0200obj.ofs_y = 0-0x18; tc0200obj.cols = 16; init_tc0200obj(); init_f3_system_ioc(F3_IOC_2P_3BUTTON); init_m68k(); setup_sound_68000(); }
static void load_ninjak(void) { int ta,tb; if(!(RAM=AllocateMem(0x100000))) return; if(!(GFX=AllocateMem(0x500000))) return; GFX_BG0 = GFX+0x000000; GFX_SPR = GFX+0x100000; tb=0; if(!load_rom("c85-03.10", RAM, 0x80000)) return; // 8x8 TILES for(ta=0;ta<0x80000;ta+=2){ GFX[tb+0]=RAM[ta+1]>>4; GFX[tb+1]=RAM[ta+1]&15; GFX[tb+2]=RAM[ta+0]>>4; GFX[tb+3]=RAM[ta+0]&15; tb+=4; } if(!load_rom("c85-01.16", RAM, 0x100000)) return; // 16x16 SPRITES for(ta=0;ta<0x100000;ta++){ GFX[tb++]=RAM[ta]&15; GFX[tb++]=RAM[ta]>>4; } if(!load_rom("c85-02.15", RAM, 0x100000)) return; for(ta=0;ta<0x100000;ta++){ GFX[tb++]=RAM[ta]&15; GFX[tb++]=RAM[ta]>>4; } RAMSize=0x50000; if(!(RAM=AllocateMem(RAMSize))) return; if(!(ROM=AllocateMem(0x80000))) return; if(!load_rom("c85_10x.19", RAM, 0x20000)) return; for(ta=0;ta<0x20000;ta++){ ROM[ta+ta]=RAM[ta]; } if(!load_rom("c85_xx.5", RAM, 0x20000)) return; for(ta=0;ta<0x20000;ta++){ ROM[ta+ta+1]=RAM[ta]; } if(!load_rom("c85_07.18", RAM, 0x20000)) return; for(ta=0;ta<0x20000;ta++){ ROM[ta+ta+0x40000]=RAM[ta]; } if(!load_rom("c85_06.4", RAM, 0x20000)) return; for(ta=0;ta<0x20000;ta++){ ROM[ta+ta+0x40001]=RAM[ta]; } /*-----[Sound Setup]-----*/ Z80ROM=RAM+0x40000; if(!load_rom("c85-14.6", Z80ROM, 0x10000)) return; // Z80 SOUND ROM if(!(PCMROM=AllocateMem(0x100000))) return; if(!load_rom("c85-05.11",PCMROM+0x00000,0x80000)) return; // ADPCM A rom if(!load_rom("c85-04.1",PCMROM+0x80000,0x80000)) return; // ADPCM B rom YM2610SetBuffers(PCMROM, PCMROM+0x80000, 0x80000, 0x80000); AddTaitoYM2610(0x01BB, 0x015B, 0x10000); /*-----------------------*/ memset(RAM+0x00000,0x00,0x40000); memset(RAM+0x25100,0xFF,0x01000); RAM_VIDEO = RAM+0x04000; RAM_OBJECT = RAM+0x14000; RAM_SCROLL = RAM+0x25000; GFX_FG0 = RAM+0x30000; set_colour_mapper(&col_map_rrrr_gggg_bbbb_xxxx); InitPaletteMap(RAM+0x24000, 0x100, 0x10, 0x1000); GFX_BG0_SOLID = make_solid_mask_8x8 (GFX_BG0, 0x4000); GFX_SPR_SOLID = make_solid_mask_16x16(GFX_SPR, 0x4000); ROM[0x3F32]=0x4E; // SKIP OLD CODE (NO ROOM FOR HACK) ROM[0x3F33]=0xF9; // (JMP $7FF00) ROM[0x3F34]=0x00; ROM[0x3F35]=0x07; ROM[0x3F36]=0xFF; ROM[0x3F37]=0x00; ROM[0x7FF00]=0x46; // MOVE #$2000,SR ROM[0x7FF01]=0xFC; ROM[0x7FF02]=0x20; ROM[0x7FF03]=0x00; ROM[0x7FF04]=0x13; // move.b #$00,$AA0000 ROM[0x7FF05]=0xFC; // (Speed Hack) ROM[0x7FF06]=0x00; ROM[0x7FF07]=0x00; ROM[0x7FF08]=0x00; ROM[0x7FF09]=0xAA; ROM[0x7FF0A]=0x00; ROM[0x7FF0B]=0x00; ROM[0x7FF0C]=0x60; // Loop ROM[0x7FF0D]=0x100-0x0A; // Init tc0100scn emulation // ------------------------ tc0100scn[0].layer[0].RAM =RAM_VIDEO+0x0000; tc0100scn[0].layer[0].GFX =GFX_BG0; tc0100scn[0].layer[0].MASK =GFX_BG0_SOLID; tc0100scn[0].layer[0].SCR =RAM_SCROLL+0; tc0100scn[0].layer[0].type =0; tc0100scn[0].layer[0].bmp_x =32; tc0100scn[0].layer[0].bmp_y =32; tc0100scn[0].layer[0].bmp_w =320; tc0100scn[0].layer[0].bmp_h =224; // Mapper disabled tc0100scn[0].layer[0].tile_mask=0x3FFF; tc0100scn[0].layer[0].scr_x =16; tc0100scn[0].layer[0].scr_y =8; tc0100scn[0].layer[1].RAM =RAM_VIDEO+0x8000; tc0100scn[0].layer[1].GFX =GFX_BG0; tc0100scn[0].layer[1].MASK =GFX_BG0_SOLID; tc0100scn[0].layer[1].SCR =RAM_SCROLL+2; tc0100scn[0].layer[1].type =0; tc0100scn[0].layer[1].bmp_x =32; tc0100scn[0].layer[1].bmp_y =32; tc0100scn[0].layer[1].bmp_w =320; tc0100scn[0].layer[1].bmp_h =224; // Mapper disabled tc0100scn[0].layer[1].tile_mask=0x3FFF; tc0100scn[0].layer[1].scr_x =16; tc0100scn[0].layer[1].scr_y =8; tc0100scn[0].layer[2].RAM =RAM_VIDEO+0x4000; tc0100scn[0].layer[2].GFX =GFX_FG0; tc0100scn[0].layer[2].SCR =RAM_SCROLL+4; tc0100scn[0].layer[2].type =3; tc0100scn[0].layer[2].bmp_x =32; tc0100scn[0].layer[2].bmp_y =32; tc0100scn[0].layer[2].bmp_w =320; tc0100scn[0].layer[2].bmp_h =224; // Mapper disabled tc0100scn[0].layer[2].scr_x =16; tc0100scn[0].layer[2].scr_y =8; tc0100scn[0].RAM = RAM_VIDEO; tc0100scn[0].GFX_FG0 = GFX_FG0; init_tc0100scn(0); // Init tc0200obj emulation // ------------------------ tc0200obj.RAM = RAM_OBJECT+0x0000; tc0200obj.RAM_B = RAM_OBJECT+0x8000; tc0200obj.GFX = GFX_SPR; tc0200obj.MASK = GFX_SPR_SOLID; tc0200obj.bmp_x = 32; tc0200obj.bmp_y = 32; tc0200obj.bmp_w = 320; tc0200obj.bmp_h = 224; // Mapper disabled tc0200obj.tile_mask = 0x3FFF; tc0200obj.ofs_x = 0 - 0x13; tc0200obj.ofs_y = 0 - 0x60; init_tc0200obj(); /* * StarScream Stuff follows */ ByteSwap(ROM,0x80000); ByteSwap(RAM,0x2C000); AddMemFetch(0x000000, 0x07FFFF, ROM+0x000000-0x000000); // 68000 ROM AddMemFetch(-1, -1, NULL); AddReadByte(0x000000, 0x07FFFF, NULL, ROM+0x000000); // 68000 ROM AddReadByte(0x100000, 0x103FFF, NULL, RAM+0x000000); // 68000 RAM AddReadByte(0x800000, 0x80FFFF, NULL, RAM_VIDEO); // SCREEN RAM AddReadByte(0x900000, 0x90FFFF, NULL, RAM_OBJECT); // OBJECT RAM AddReadByte(0x300000, 0x30000F, NULL, RAM+0x025100); // INPUT AddReadByte(0x400000, 0x400003, tc0140syt_read_main_68k, NULL); // SOUND COMM AddReadByte(0x000000, 0xFFFFFF, DefBadReadByte, NULL); // <Bad Reads> AddReadByte(-1, -1, NULL, NULL); AddReadWord(0x000000, 0x07FFFF, NULL, ROM+0x000000); // 68000 ROM AddReadWord(0x100000, 0x103FFF, NULL, RAM+0x000000); // 68000 RAM AddReadWord(0x800000, 0x80FFFF, NULL, RAM_VIDEO); // SCREEN RAM AddReadWord(0x900000, 0x90FFFF, NULL, RAM_OBJECT); // OBJECT RAM AddReadWord(0x200000, 0x200FFF, NULL, RAM+0x024000); // COLOR RAM AddReadWord(0x000000, 0xFFFFFF, BadReadWord, NULL); // <Bad Reads> AddReadWord(-1, -1, NULL, NULL); AddWriteByte(0x100000, 0x103FFF, NULL, RAM+0x000000); // 68000 RAM AddWriteByte(0x806000, 0x806FFF, tc0100scn_0_gfx_fg0_wb, NULL); // FG0 GFX RAM AddWriteByte(0x800000, 0x80FFFF, NULL, RAM_VIDEO); // SCREEN RAM AddWriteByte(0x900000, 0x90FFFF, NULL, RAM_OBJECT); // OBJECT RAM AddWriteByte(0x400000, 0x400003, tc0140syt_write_main_68k, NULL); // SOUND COMM 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(0x806000, 0x806FFF, tc0100scn_0_gfx_fg0_ww, NULL); // FG0 GFX RAM AddWriteWord(0x800000, 0x80FFFF, NULL, RAM_VIDEO); // SCREEN RAM AddWriteWord(0x900000, 0x90FFFF, NULL, RAM_OBJECT); // OBJECT RAM AddWriteWord(0x200000, 0x200FFF, NULL, RAM+0x024000); // COLOR RAM AddWriteWord(0x820000, 0x82000F, NULL, RAM_SCROLL); // SCROLL RAM AddWriteWord(0x380000, 0x38000F, NULL, RAM+0x025180); // ??? AddWriteWord(0x600000, 0x60000F, NULL, RAM+0x025280); // SPRITE BANK AddWriteWord(0xB00000, 0xB0001F, NULL, RAM+0x025300); // ? AddWriteWord(0x000000, 0xFFFFFF, DefBadWriteWord, NULL); // <Bad Writes> AddWriteWord(-1, -1, NULL, NULL); AddInitMemory(); // Set Starscream mem pointers... }
static void load_puchicar(void) { int ta,tb,tc; RAMSize=0x80000; if(!(RAM=AllocateMem(0x80000))) return; if(!(ROM=AllocateMem(0x200000))) return; if(!(GFX=AllocateMem(0xF17A00+0x3F0800))) return; GFX_BG0 = GFX+0xF17A00; GFX_SPR = GFX+0x000000; tb=0; if(!load_rom("e46.06", ROM, 0x200000)) return; // 16x16 SPRITES ($8000) for(ta=0;ta<0x200000;ta++,tb+=4){ WriteWord(&GFX_SPR[tb],((ROM[ta])|(ROM[ta]<<4))&0x0F0F); } tb=2; if(!load_rom("e46.04", ROM, 0x200000)) return; // 16x16 SPRITES for(ta=0;ta<0x200000;ta++,tb+=4){ WriteWord(&GFX_SPR[tb],((ROM[ta])|(ROM[ta]<<4))&0x0F0F); } tb=0; if(!load_rom("e46.02", ROM, 0x200000)) return; // 16x16 SPRITES (MASK) for(ta=0;ta<0x200000;ta++){ tc=ROM[ta]; GFX[tb+3]|=((tc&0x40)>>6)<<4; GFX[tb+2]|=((tc&0x10)>>4)<<4; GFX[tb+1]|=((tc&0x04)>>2)<<4; GFX[tb+0]|=((tc&0x01)>>0)<<4; tb+=4; } tb=0x800000; if(!load_rom("e46.05", ROM, 0x1C5E80)) return; // 16x16 SPRITES ($717A) for(ta=0;ta<0x1C5E80;ta++,tb+=4){ WriteWord(&GFX_SPR[tb],((ROM[ta])|(ROM[ta]<<4))&0x0F0F); } tb=0x800002; if(!load_rom("e46.03", ROM, 0x1C5E80)) return; // 16x16 SPRITES for(ta=0;ta<0x1C5E80;ta++,tb+=4){ WriteWord(&GFX_SPR[tb],((ROM[ta])|(ROM[ta]<<4))&0x0F0F); } tb=0x800000; if(!load_rom("e46.01", ROM, 0x1C5E80)) return; // 16x16 SPRITES (MASK) for(ta=0;ta<0x1C5E80;ta++){ tc=ROM[ta]; GFX[tb+3]|=((tc&0x40)>>6)<<4; GFX[tb+2]|=((tc&0x10)>>4)<<4; GFX[tb+1]|=((tc&0x04)>>2)<<4; GFX[tb+0]|=((tc&0x01)>>0)<<4; tb+=4; } tb=0; if(!load_rom("e46.12", ROM, 0xFC200)) return; // 16x16 TILES ($3F08) for(ta=0;ta<0xFC200;ta+=2,tb+=8){ WriteWord(&GFX_BG0[tb+0],((ROM[ta+0])|(ROM[ta+0]<<4))&0x0F0F); WriteWord(&GFX_BG0[tb+2],((ROM[ta+1])|(ROM[ta+1]<<4))&0x0F0F); } tb=4; if(!load_rom("e46.11", ROM, 0xFC200)) return; // 16x16 TILES for(ta=0;ta<0xFC200;ta+=2,tb+=8){ WriteWord(&GFX_BG0[tb+0],((ROM[ta+0])|(ROM[ta+0]<<4))&0x0F0F); WriteWord(&GFX_BG0[tb+2],((ROM[ta+1])|(ROM[ta+1]<<4))&0x0F0F); } tb=0; if(!load_rom("e46.10", ROM, 0xFC200)) return; // 16x16 TILES (MASK) for(ta=0;ta<0xFC200;ta+=2){ tc=ROM[ta]; GFX_BG0[tb+7]|=((tc&0x80)>>7)<<4; GFX_BG0[tb+6]|=((tc&0x40)>>6)<<4; GFX_BG0[tb+5]|=((tc&0x20)>>5)<<4; GFX_BG0[tb+4]|=((tc&0x10)>>4)<<4; GFX_BG0[tb+3]|=((tc&0x08)>>3)<<4; GFX_BG0[tb+2]|=((tc&0x04)>>2)<<4; GFX_BG0[tb+1]|=((tc&0x02)>>1)<<4; GFX_BG0[tb+0]|=((tc&0x01)>>0)<<4; tc=ROM[ta+1]; GFX_BG0[tb+7]|=((tc&0x80)>>7)<<5; GFX_BG0[tb+6]|=((tc&0x40)>>6)<<5; GFX_BG0[tb+5]|=((tc&0x20)>>5)<<5; GFX_BG0[tb+4]|=((tc&0x10)>>4)<<5; GFX_BG0[tb+3]|=((tc&0x08)>>3)<<5; GFX_BG0[tb+2]|=((tc&0x04)>>2)<<5; GFX_BG0[tb+1]|=((tc&0x02)>>1)<<5; GFX_BG0[tb+0]|=((tc&0x01)>>0)<<5; tb+=8; } GFX_BG0_SOLID = MakeSolidTileMap16x16(GFX_BG0, 0x3F08); GFX_SPR_SOLID = make_solid_mask_16x16(GFX_SPR, 0xF17A); FreeMem(ROM); ROM = load_region[REGION_CPU1]; // Setup 68020 Memory Map // ---------------------- AddF3MemoryMap(0x100000); RAM_BG0=RAM+0x30000; RAM_BG1=RAM+0x32000; RAM_BG2=RAM+0x34000; RAM_BG3=RAM+0x36000; RAM_SCR0=RAM+0x6A000; RAM_SCR1=RAM+0x6A002; RAM_SCR2=RAM+0x6A004; RAM_SCR3=RAM+0x6A006; SCR0_XOFS=0xF600; SCR1_XOFS=0xF700; SCR2_XOFS=0xF800; SCR3_XOFS=0xF900; SCR0_YOFS=0xFF80; SCR1_YOFS=0xFF80; SCR2_YOFS=0xFF80; SCR3_YOFS=0xFF80; // 68000 code M68000ROM = load_region[REGION_ROM2]; if(!(PCMROM=AllocateMem(0xe00004))) return; load_be("e46.09",PCMROM,0x200000); load_be("e46.08",PCMROM+0x400000,0x200000); load_be("e46.07",PCMROM+0x800000,0x200000); max_banks_this_game=6; //=memory_region_length(REGION_SOUND1)/0x400000; memset(PCMROM+0xc00000,0x0,0x200003); memset(RAM+0x00000,0x00,0x80000); memset(RAM+0x69000,0xFF,0x01000); // EEPROM HACKS // ------------ WriteWord68k(&ROM[0x0019C4],0x7F00); // raine #$00 <read/write eeprom> WriteWord68k(&ROM[0x0019C6],0x4ED6); // jmp (a6) // SPEED HACK#1 // ------------ // WriteWord68k(&ROM[0x009DC],0x7F02); // raine #$02 <stop cpu> WriteWord68k(&ROM[0x009A4],0x7F02); // raine #$02 <stop cpu> WriteWord68k(&ROM[0x009A6],0x4E71); // nop WriteWord68k(&ROM[0x009A8],0x4E71); // nop WriteWord68k(&ROM[0x009AA],0x4E71); // nop F3SystemEEPROMAccess=&F3SysEEPROMAccessMode2; set_colour_mapper(&col_map_xxxx_xxxx_rrrr_rrrr_gggg_gggg_bbbb_bbbb); InitPaletteMap(RAM+0x60000, 0x200, 0x40, 0x8000); // Init tc0003vcu emulation // ------------------------ tc0003vcu.RAM = RAM+0x20000; // Mapper disabled tc0003vcu.bmp_x = 64; tc0003vcu.bmp_y = 64; tc0003vcu.bmp_w = 320; tc0003vcu.bmp_h = 232; tc0003vcu.scr_x = 0; tc0003vcu.scr_y = 0; // Init tc0200obj emulation // ------------------------ tc0200obj.RAM = RAM+0x20000; tc0200obj.RAM_B = RAM+0x28000; tc0200obj.GFX = GFX_SPR; tc0200obj.MASK = GFX_SPR_SOLID; tc0200obj.bmp_x = 64; tc0200obj.bmp_y = 64; tc0200obj.bmp_w = 320; tc0200obj.bmp_h = 232; // Mapper disabled tc0200obj.tile_mask = 0xFFFF; tc0200obj.ofs_x = 0-0x2E; tc0200obj.ofs_y = 0-0x18; tc0200obj.cols = 32; init_tc0200obj(); init_f3_system_ioc(F3_IOC_2P_3BUTTON | F3_IOC_TRACKBALL); init_m68k(); setup_sound_68000(); }
int main(int argc,char **argv) { unsigned char *romPtr; int running=1; int a; for (a=0;a<256;a++) { keyUpArray[a]=1; } // Initialize GLFW glfwInit(); // Open an OpenGL window if( !glfwOpenWindow( AMI_LINE_LENGTH, HEIGHT, 0,0,0,0,0,0, GLFW_WINDOW ) ) { glfwTerminate(); return 1; } glfwSetWindowTitle("MinAmi"); glfwSetWindowPos(670,700); setupGL(AMI_LINE_LENGTH,HEIGHT); romPtr=load_rom("../../out.rom"); if (!romPtr) { romPtr=load_rom("out.rom"); if (!romPtr) { printf("[ERR] Failed to load rom image\n"); glfwTerminate(); return 1; } } CPU_BuildTable(); MEM_Initialise(romPtr); CST_InitialiseCustom(); CPR_InitialiseCopper(); CIA_InitialiseCustom(); BLT_InitialiseBlitter(); DSP_InitialiseDisplay(); DSK_InitialiseDisk(); SPR_InitialiseSprites(); KBD_InitialiseKeyboard(); CPU_Reset(); glfwSetKeyCallback(kbHandler); while (running) { KBD_Update(); SPR_Update(); DSP_Update(); // Note need to priority order these ultimately CST_Update(); DSK_Update(); CPR_Update(); CIA_Update(); BLT_Update(); CPU_Step(); if (g_newScreenNotify) { static int lmx=0,lmy=0; int mx,my; DrawScreen(); glfwSwapBuffers(); g_newScreenNotify=0; glfwGetMousePos(&mx,&my); if ((mx>=1 && mx<=AMI_LINE_LENGTH && my>=1 && my <=HEIGHT) || captureMouse) { int vertMove = my-lmy; int horiMove = mx-lmx; int oldMoveX = CST_GETWRDU(CST_JOY0DAT,0x00FF); int oldMoveY = CST_GETWRDU(CST_JOY0DAT,0xFF00)>>8; if (horiMove>127) horiMove=127; if (horiMove<-128) horiMove=-128; if (vertMove>127) vertMove=127; if (vertMove<-128) vertMove=-128; oldMoveX+=horiMove; oldMoveY+=vertMove; CST_SETWRD(CST_JOY0DAT,((oldMoveY&0xFF)<<8)|(oldMoveX&0xFF),0xFFFF); lmx=mx; lmy=my; if (glfwGetMouseButton(GLFW_MOUSE_BUTTON_LEFT)) { leftMouseUp=0; } else { leftMouseUp=1; } if (glfwGetMouseButton(GLFW_MOUSE_BUTTON_MIDDLE)) { if (captureMouse) { captureMouse=0; glfwEnable(GLFW_MOUSE_CURSOR); } else { captureMouse=1; glfwDisable(GLFW_MOUSE_CURSOR); } } if (glfwGetMouseButton(GLFW_MOUSE_BUTTON_RIGHT)) { rightMouseUp=0; } else { rightMouseUp=1; } } } // Check if ESC key was pressed or window was closed running = !glfwGetKey( GLFW_KEY_ESC ) && glfwGetWindowParam( GLFW_OPENED ); }
static void load_darius2(void) { int ta,tb,tc,td; UINT8 *TMP; setup_z80_frame(CPU_Z80_0,CPU_FRAME_MHz(8,60)); romset = 1; if(!(TMP=AllocateMem(0x80000))) return; if(!(GFX=AllocateMem(0x400000))) return; GFX_BG0 = GFX+0x000000; GFX_SPR = GFX+0x200000; tb=0; if(!load_rom("c07-03.12", TMP, 0x80000)) return; // 8x8 BACKGROUND TILES for(ta=0;ta<0x80000;ta+=2){ GFX[tb+1]=TMP[ta+1]&15; GFX[tb+0]=TMP[ta+1]>>4; GFX[tb+3]=TMP[ta+0]&15; GFX[tb+2]=TMP[ta+0]>>4; tb+=4; } if(!load_rom("c07-04.11", TMP, 0x80000)) return; for(ta=0;ta<0x80000;ta+=2){ GFX[tb+1]=TMP[ta+1]&15; GFX[tb+0]=TMP[ta+1]>>4; GFX[tb+3]=TMP[ta+0]&15; GFX[tb+2]=TMP[ta+0]>>4; tb+=4; } if(!load_rom("c07-01", TMP, 0x80000)) return; // 16x16 SPRITES for(ta=0;ta<0x80000;ta+=0){ for(td=0;td<2;td++){ tc=TMP[ta++]; GFX[tb+3]=(((tc&0x80)>>7)<<1); GFX[tb+2]=(((tc&0x40)>>6)<<1); GFX[tb+1]=(((tc&0x20)>>5)<<1); GFX[tb+0]=(((tc&0x10)>>4)<<1); GFX[tb+3]|=(((tc&0x08)>>3)<<0); GFX[tb+2]|=(((tc&0x04)>>2)<<0); GFX[tb+1]|=(((tc&0x02)>>1)<<0); GFX[tb+0]|=(((tc&0x01)>>0)<<0); tc=TMP[ta++]; GFX[tb+3]|=(((tc&0x80)>>7)<<3); GFX[tb+2]|=(((tc&0x40)>>6)<<3); GFX[tb+1]|=(((tc&0x20)>>5)<<3); GFX[tb+0]|=(((tc&0x10)>>4)<<3); GFX[tb+3]|=(((tc&0x08)>>3)<<2); GFX[tb+2]|=(((tc&0x04)>>2)<<2); GFX[tb+1]|=(((tc&0x02)>>1)<<2); GFX[tb+0]|=(((tc&0x01)>>0)<<2); tb+=4; } tb+=8; if((tb&0x7F)==0){tb-=0x78;} else{if((tb&0x7F)==8){tb-=8;}} } if(!load_rom("c07-02", TMP, 0x80000)) return; // 16x16 SPRITES for(ta=0;ta<0x80000;ta+=0){ for(td=0;td<2;td++){ tc=TMP[ta++]; GFX[tb+3]=(((tc&0x80)>>7)<<1); GFX[tb+2]=(((tc&0x40)>>6)<<1); GFX[tb+1]=(((tc&0x20)>>5)<<1); GFX[tb+0]=(((tc&0x10)>>4)<<1); GFX[tb+3]|=(((tc&0x08)>>3)<<0); GFX[tb+2]|=(((tc&0x04)>>2)<<0); GFX[tb+1]|=(((tc&0x02)>>1)<<0); GFX[tb+0]|=(((tc&0x01)>>0)<<0); tc=TMP[ta++]; GFX[tb+3]|=(((tc&0x80)>>7)<<3); GFX[tb+2]|=(((tc&0x40)>>6)<<3); GFX[tb+1]|=(((tc&0x20)>>5)<<3); GFX[tb+0]|=(((tc&0x10)>>4)<<3); GFX[tb+3]|=(((tc&0x08)>>3)<<2); GFX[tb+2]|=(((tc&0x04)>>2)<<2); GFX[tb+1]|=(((tc&0x02)>>1)<<2); GFX[tb+0]|=(((tc&0x01)>>0)<<2); tb+=4; } tb+=8; if((tb&0x7F)==0){tb-=0x78;} else{if((tb&0x7F)==8){tb-=8;}} } FreeMem(TMP); RAMSize=0xA0000+0x20000; if(!(ROM=AllocateMem(0x120000))) return; if(!(RAM=AllocateMem(RAMSize))) return; if(!load_rom("c07-32-1", RAM, 0x10000)) return; for(ta=0;ta<0x10000;ta++){ ROM[ta+ta]=RAM[ta]; } if(!load_rom("c07-29-1", RAM, 0x10000)) return; for(ta=0;ta<0x10000;ta++){ ROM[ta+ta+1]=RAM[ta]; } if(!load_rom("c07-31-1", RAM, 0x10000)) return; for(ta=0;ta<0x10000;ta++){ ROM[ta+ta+0x20000]=RAM[ta]; } if(!load_rom("c07-30-1", RAM, 0x10000)) return; for(ta=0;ta<0x10000;ta++){ ROM[ta+ta+0x20001]=RAM[ta]; } //if(!load_rom("c07-09.bin", ROM+0x40000, 0x80000)) return; //ByteSwap(ROM+0x40000,0x80000); if(!load_rom("c07-27", RAM, 0x20000)) return; for(ta=0;ta<0x20000;ta++){ ROM[ta+ta+0x40000]=RAM[ta]; } if(!load_rom("c07-25", RAM, 0x20000)) return; for(ta=0;ta<0x20000;ta++){ ROM[ta+ta+0x40001]=RAM[ta]; } if(!load_rom("c07-26", RAM, 0x20000)) return; for(ta=0;ta<0x20000;ta++){ ROM[ta+ta+0x80000]=RAM[ta]; } if(!load_rom("c07-24", RAM, 0x20000)) return; for(ta=0;ta<0x20000;ta++){ ROM[ta+ta+0x80001]=RAM[ta]; } if(!load_rom("c07-35-1", RAM, 0x10000)) return; for(ta=0;ta<0x10000;ta++){ ROM[ta+ta+0xC0000]=RAM[ta]; } if(!load_rom("c07-38-1", RAM, 0x10000)) return; for(ta=0;ta<0x10000;ta++){ ROM[ta+ta+0xC0001]=RAM[ta]; } if(!load_rom("c07-34-1", RAM, 0x10000)) return; for(ta=0;ta<0x10000;ta++){ ROM[ta+ta+0xE0000]=RAM[ta]; } if(!load_rom("c07-37-1", RAM, 0x10000)) return; for(ta=0;ta<0x10000;ta++){ ROM[ta+ta+0xE0001]=RAM[ta]; } if(!load_rom("c07-33-1", RAM, 0x10000)) return; for(ta=0;ta<0x10000;ta++){ ROM[ta+ta+0x100000]=RAM[ta]; } if(!load_rom("c07-36-1", RAM, 0x10000)) return; for(ta=0;ta<0x10000;ta++){ ROM[ta+ta+0x100001]=RAM[ta]; } /*-----[Sound Setup]-----*/ Z80ROM=RAM+0xA0000; if(!load_rom("c07-28", Z80ROM, 0x20000)) return; // Z80 SOUND ROM AddTaitoYM2610(0x0247, 0x01C7, 0x20000); /*-----------------------*/ ROM[0x10F4]=0x60; // Fix Main Checksum ROM[0x1172]=0x60; // Fix Sub Checksum/communication problem ROM[0x11E4]=0x4E; // jmp $300 ROM[0x11E5]=0xF9; ROM[0x11E6]=0x00; ROM[0x11E7]=0x00; ROM[0x11E8]=0x03; ROM[0x11E9]=0x00; ROM[0x0300]=0x52; // addq #1,$C10A0 ROM[0x0301]=0x79; ROM[0x0302]=0x00; ROM[0x0303]=0x0C; ROM[0x0304]=0x10; ROM[0x0305]=0xA0; ROM[0x0306]=0x13; // move.b #$00,$AA0000 ROM[0x0307]=0xFC; // Speed Hack ROM[0x0308]=0x00; ROM[0x0309]=0x00; ROM[0x030A]=0x00; ROM[0x030B]=0xAA; ROM[0x030C]=0x00; ROM[0x030D]=0x00; ROM[0x030E]=0x60; ROM[0x030F]=0x100-16; ROM[0xC0932]=0x60; // Fix Sub Checksum ROM[0xC097E]=0x4E; // jmp $300 ROM[0xC097F]=0xF9; ROM[0xC0980]=0x00; ROM[0xC0981]=0x00; ROM[0xC0982]=0x03; ROM[0xC0983]=0x00; ROM[0xC0300]=0x52; // addq #1,$C10A0 ROM[0xC0301]=0x79; ROM[0xC0302]=0x00; ROM[0xC0303]=0x08; ROM[0xC0304]=0x0C; ROM[0xC0305]=0x94; ROM[0xC0306]=0x13; // move.b #$00,$AA0000 ROM[0xC0307]=0xFC; // Speed Hack ROM[0xC0308]=0x00; ROM[0xC0309]=0x00; ROM[0xC030A]=0x00; ROM[0xC030B]=0xAA; ROM[0xC030C]=0x00; ROM[0xC030D]=0x00; ROM[0xC030E]=0x60; ROM[0xC030F]=0x100-16; memset(RAM+0x00000,0x00,0xA0000); GFX_FG0 = RAM+0x64000; RAM_INPUT = RAM+0x3B000; tc0100scn[0].RAM = RAM+0x21000-0x6000; tc0100scn[0].GFX_FG0 = GFX_FG0; init_tc0100scn(0); GFX_BG0_SOLID = make_solid_mask_8x8 (GFX_BG0, 0x8000); init_tile_cachex4(); GFX_SPR_SOLID = make_solid_mask_16x16(GFX_SPR, 0x2000); tc0110pcr_init_typeb(RAM+0x38000, 1, 0); tc0110pcr_init_typeb_2(RAM+0x39000, 1, 0); tc0110pcr_init_typeb_3(RAM+0x3A000, 1, 0); set_colour_mapper(&col_map_xbbb_bbgg_gggr_rrrr); InitPaletteMap(RAM+0x38000, 0x80, 0x10, 0x8000); // Init tc0220ioc emulation // ------------------------ tc0220ioc.RAM = RAM_INPUT; tc0220ioc.ctrl = 0; //TC0220_STOPCPU; reset_tc0220ioc(); memset(RAM_INPUT,0x00,0x20); /* * StarScream Stuff follows */ ByteSwap(ROM,0x120000); ByteSwap(RAM,0x60000); AddMemFetch(0x000000, 0x0BFFFF, ROM+0x000000-0x000000); // 68000 ROM AddMemFetch(-1, -1, NULL); AddReadByte(0x000000, 0x0BFFFF, NULL, ROM+0x000000); // 68000 ROM AddReadByte(0x0C0000, 0x0CFFFF, NULL, RAM+0x000000); // MAIN RAM AddReadByte(0x240000, 0x24FFFF, NULL, RAM+0x024000); // COMMON RAM AddReadByte(0x260000, 0x263FFF, NULL, RAM+0x034000); // OBJECT RAM AddReadByte(0x280000, 0x293FFF, NULL, RAM+0x010000); // SCREEN RAM AddReadByte(0x200000, 0x200003, tc0220ioc_rb_port, NULL); // INPUT AddReadByte(0x000000, 0xFFFFFF, DefBadReadByte, NULL); // <Bad Reads> AddReadByte(-1, -1, NULL, NULL); AddReadWord(0x000000, 0x0BFFFF, NULL, ROM+0x000000); // 68000 ROM AddReadWord(0x0C0000, 0x0CFFFF, NULL, RAM+0x000000); // MAIN RAM AddReadWord(0x240000, 0x24FFFF, NULL, RAM+0x024000); // COMMON RAM AddReadWord(0x260000, 0x263FFF, NULL, RAM+0x034000); // OBJECT RAM AddReadWord(0x280000, 0x293FFF, NULL, RAM+0x010000); // SCREEN RAM AddReadWord(0x340000, 0x340007, tc0110pcr_rw, NULL); // COLOR RAM SCREEN A AddReadWord(0x350000, 0x350007, tc0110pcr_rw_2, NULL); // COLOR RAM SCREEN B AddReadWord(0x360000, 0x360007, tc0110pcr_rw_3, NULL); // COLOR RAM SCREEN C AddReadWord(0x200000, 0x200003, tc0220ioc_rw_port, NULL); // INPUT AddReadWord(0x2C0000, 0x2D3FFF, NULL, RAM+0x050000); // CUSTOM2 AddReadWord(0x300000, 0x313FFF, NULL, RAM+0x064000); // CUSTOM3 AddReadWord(0x220000, 0x220003, tc0140syt_read_main_68k, NULL); // SOUND AddReadWord(0x000000, 0xFFFFFF, DefBadReadWord, NULL); // <Bad Reads> AddReadWord(-1, -1, NULL, NULL); AddWriteByte(0x0C0000, 0x0CFFFF, NULL, RAM+0x000000); // MAIN RAM AddWriteByte(0x240000, 0x24FFFF, NULL, RAM+0x024000); // COMMON RAM AddWriteByte(0x260000, 0x263FFF, NULL, RAM+0x034000); // OBJECT RAM AddWriteByte(0x280000, 0x290FFF, NULL, RAM+0x010000); // SCREEN RAM AddWriteByte(0x291000, 0x291FFF, tc0100scn_0_gfx_fg0_wb, NULL); // FG0 GFX RAM AddWriteByte(0x292000, 0x293FFF, NULL, RAM+0x022000); // FG0 RAM AddWriteByte(0x200000, 0x200003, tc0220ioc_wb_port, NULL); // INPUT AddWriteByte(0xAA0000, 0xAA0001, Stop68000, NULL); // Trap Idle 68000 AddWriteByte(0x000000, 0xFFFFFF, DefBadWriteByte, NULL); // <Bad Writes> AddWriteByte(-1, -1, NULL, NULL); AddWriteWord(0x0C0000, 0x0CFFFF, NULL, RAM+0x000000); // MAIN RAM AddWriteWord(0x240000, 0x24FFFF, NULL, RAM+0x024000); // COMMON RAM AddWriteWord(0x260000, 0x263FFF, NULL, RAM+0x034000); // OBJECT RAM AddWriteWord(0x280000, 0x290FFF, NULL, RAM+0x010000); // SCREEN RAM AddWriteWord(0x291000, 0x291FFF, tc0100scn_0_gfx_fg0_ww, NULL); // FG0 GFX RAM AddWriteWord(0x292000, 0x293FFF, NULL, RAM+0x022000); // FG0 RAM AddWriteWord(0x340000, 0x340007, tc0110pcr_ww, NULL); // COLOR RAM SCREEN A AddWriteWord(0x350000, 0x350007, tc0110pcr_ww_2, NULL); // COLOR RAM SCREEN B AddWriteWord(0x360000, 0x360007, tc0110pcr_ww_3, NULL); // COLOR RAM SCREEN C AddWriteWord(0x200000, 0x200003, tc0220ioc_ww_port, NULL); // INPUT AddWriteWord(0x2A0000, 0x2A000F, NULL, RAM+0x03B100); // SCROLL A AddWriteWord(0x2E0000, 0x2E000F, NULL, RAM+0x03B200); // SCROLL B AddWriteWord(0x320000, 0x32000F, NULL, RAM+0x03B300); // SCROLL C AddWriteWord(0x2C0000, 0x2D3FFF, NULL, RAM+0x050000); // CUSTOM2 AddWriteWord(0x300000, 0x313FFF, NULL, RAM+0x064000); // CUSTOM3 AddWriteWord(0x220000, 0x220003, tc0140syt_write_main_68k, NULL); // SOUND AddWriteWord(0x000000, 0xFFFFFF, DefBadWriteWord, NULL); // <Bad Writes> AddWriteWord(-1, -1, NULL, NULL); AddInitMemory(); // Set Starscream mem pointers... AddMemFetchMC68000B(0x000000, 0x05FFFF, ROM+0x0C0000-0x000000); // 68000 ROM AddMemFetchMC68000B(-1, -1, NULL); AddReadByteMC68000B(0x000000, 0x05FFFF, NULL, ROM+0x0C0000); // 68000 ROM AddReadByteMC68000B(0x080000, 0x08FFFF, NULL, RAM+0x040000); // SUB LOCAL RAM AddReadByteMC68000B(0x240000, 0x24FFFF, NULL, RAM+0x024000); // COMMON RAM AddReadByteMC68000B(0x260000, 0x263FFF, NULL, RAM+0x034000); // OBJECT RAM AddReadByteMC68000B(0x280000, 0x293FFF, NULL, RAM+0x010000); // SCREEN RAM AddReadByteMC68000B(0x200000, 0x200003, tc0220ioc_rb_port, NULL); // INPUT AddReadByteMC68000B(0x000000, 0xFFFFFF, DefBadReadByte, NULL); // <Bad Reads> AddReadByteMC68000B(-1, -1, NULL, NULL); AddReadWordMC68000B(0x000000, 0x05FFFF, NULL, ROM+0x0C0000); // 68000 ROM AddReadWordMC68000B(0x080000, 0x08FFFF, NULL, RAM+0x040000); // SUB LOCAL RAM AddReadWordMC68000B(0x240000, 0x24FFFF, NULL, RAM+0x024000); // COMMON RAM AddReadWordMC68000B(0x260000, 0x263FFF, NULL, RAM+0x034000); // OBJECT RAM AddReadWordMC68000B(0x280000, 0x293FFF, NULL, RAM+0x010000); // SCREEN RAM AddReadWordMC68000B(0x340000, 0x340007, tc0110pcr_rw, NULL); // COLOR RAM SCREEN A AddReadWordMC68000B(0x350000, 0x350007, tc0110pcr_rw_2, NULL); // COLOR RAM SCREEN B AddReadWordMC68000B(0x360000, 0x360007, tc0110pcr_rw_3, NULL); // COLOR RAM SCREEN C AddReadWordMC68000B(0x200000, 0x200003, tc0220ioc_rw_port, NULL); // INPUT AddReadWordMC68000B(0x000000, 0xFFFFFF, DefBadReadWord, NULL); // <Bad Reads> AddReadWordMC68000B(-1, -1, NULL, NULL); AddWriteByteMC68000B(0x080000, 0x08FFFF, NULL, RAM+0x040000); // SUB LOCAL RAM AddWriteByteMC68000B(0x240000, 0x24FFFF, NULL, RAM+0x024000); // COMMON RAM AddWriteByteMC68000B(0x260000, 0x263FFF, NULL, RAM+0x034000); // OBJECT RAM AddWriteByteMC68000B(0x280000, 0x290FFF, NULL, RAM+0x010000); // SCREEN RAM AddWriteByteMC68000B(0x291000, 0x291FFF, tc0100scn_0_gfx_fg0_wb, NULL); // FG0 GFX RAM AddWriteByteMC68000B(0x292000, 0x293FFF, NULL, RAM+0x022000); // FG0 RAM AddWriteByteMC68000B(0x200000, 0x200003, tc0220ioc_wb_port, NULL); // INPUT AddWriteByteMC68000B(0xAA0000, 0xAA0001, Stop68000, NULL); // Trap Idle 68000 AddWriteByteMC68000B(0x000000, 0xFFFFFF, DefBadWriteByte, NULL); // <Bad Writes> AddWriteByteMC68000B(-1, -1, NULL, NULL); AddWriteWordMC68000B(0x080000, 0x08FFFF, NULL, RAM+0x040000); // SUB LOCAL RAM AddWriteWordMC68000B(0x240000, 0x24FFFF, NULL, RAM+0x024000); // COMMON RAM AddWriteWordMC68000B(0x260000, 0x263FFF, NULL, RAM+0x034000); // OBJECT RAM AddWriteWordMC68000B(0x280000, 0x290FFF, NULL, RAM+0x010000); // SCREEN RAM AddWriteWordMC68000B(0x291000, 0x291FFF, tc0100scn_0_gfx_fg0_ww, NULL); // FG0 GFX RAM AddWriteWordMC68000B(0x292000, 0x293FFF, NULL, RAM+0x022000); // FG0 RAM AddWriteWordMC68000B(0x340000, 0x340007, tc0110pcr_ww, NULL); // COLOR RAM SCREEN A AddWriteWordMC68000B(0x350000, 0x350007, tc0110pcr_ww_2, NULL); // COLOR RAM SCREEN B AddWriteWordMC68000B(0x360000, 0x360007, tc0110pcr_ww_3, NULL); // COLOR RAM SCREEN C AddWriteWordMC68000B(0x200000, 0x200003, tc0220ioc_ww_port, NULL); // INPUT AddWriteWordMC68000B(0x000000, 0xFFFFFF, DefBadWriteWord, NULL); // <Bad Writes> AddWriteWordMC68000B(-1, -1, NULL, NULL); AddInitMemoryMC68000B(); // Set Starscream mem pointers... }
static void load_gekirido(void) { int ta,tb,tc; RAMSize=0x80000; if(!(GFX=AllocateMem(0x698900+0x544800))) return; if(!(RAM=AllocateMem(0x80000))) return; if(!(ROM=AllocateMem(0x1A6240))) return; GFX_BG0 = GFX+0x000000; GFX_SPR = GFX+0x698900; if(!load_rom("E11-03.bin", ROM, 0x151200)) return; // 16x16 SPRITES ($5448) tb=0; for(ta=0; ta<0x151200; ta++,tb+=4) { WriteWord(&GFX_SPR[tb],((ROM[ta])|(ROM[ta]<<4))&0x0F0F); } if(!load_rom("E11-02.bin", ROM, 0x151200)) return; // 16x16 SPRITES tb=2; for(ta=0; ta<0x151200; ta++,tb+=4) { WriteWord(&GFX_SPR[tb],((ROM[ta])|(ROM[ta]<<4))&0x0F0F); } tb=0; if(!load_rom("E11-01.bin", ROM, 0x151200)) return; // 16x16 SPRITES (MASK) for(ta=0; ta<0x151200; ta++) { tc=ROM[ta]; GFX_SPR[tb+3]|=((tc&0x40)>>6)<<4; GFX_SPR[tb+2]|=((tc&0x10)>>4)<<4; GFX_SPR[tb+1]|=((tc&0x04)>>2)<<4; GFX_SPR[tb+0]|=((tc&0x01)>>0)<<4; tb+=4; } tb=0; if(!load_rom("E11-08.bin", ROM, 0x1A6240)) return; // 16x16 TILES ($6989) for(ta=0; ta<0x1A6240; ta+=2,tb+=8) { WriteWord(&GFX_BG0[tb+0],((ROM[ta+0])|(ROM[ta+0]<<4))&0x0F0F); WriteWord(&GFX_BG0[tb+2],((ROM[ta+1])|(ROM[ta+1]<<4))&0x0F0F); } tb=4; if(!load_rom("E11-07.bin", ROM, 0x1A6240)) return; // 16x16 TILES for(ta=0; ta<0x1A6240; ta+=2,tb+=8) { WriteWord(&GFX_BG0[tb+0],((ROM[ta+0])|(ROM[ta+0]<<4))&0x0F0F); WriteWord(&GFX_BG0[tb+2],((ROM[ta+1])|(ROM[ta+1]<<4))&0x0F0F); } tb=0; if(!load_rom("E11-06.bin", ROM, 0x1A6240)) return; // 16x16 TILES (MASK) for(ta=0; ta<0x1A6240; ta+=2) { tc=ROM[ta]; GFX_BG0[tb+7]|=((tc&0x80)>>7)<<4; GFX_BG0[tb+6]|=((tc&0x40)>>6)<<4; GFX_BG0[tb+5]|=((tc&0x20)>>5)<<4; GFX_BG0[tb+4]|=((tc&0x10)>>4)<<4; GFX_BG0[tb+3]|=((tc&0x08)>>3)<<4; GFX_BG0[tb+2]|=((tc&0x04)>>2)<<4; GFX_BG0[tb+1]|=((tc&0x02)>>1)<<4; GFX_BG0[tb+0]|=((tc&0x01)>>0)<<4; tb+=8; } FreeMem(ROM); if(!(ROM=AllocateMem(0x100000))) return; Rotate16x16(GFX_BG0,0x6989); Flip16x16_X(GFX_BG0,0x6989); Rotate16x16(GFX_SPR,0x5448); Flip16x16_X(GFX_SPR,0x5448); GFX_BG0_SOLID = MakeSolidTileMap16x16(GFX_BG0, 0x6989); GFX_SPR_SOLID = make_solid_mask_16x16(GFX_SPR, 0x5448); // Setup 68020 Memory Map // ---------------------- AddF3MemoryMap(0x100000); RAM_BG3=RAM+0x30000; RAM_BG2=RAM+0x31000; RAM_BG1=RAM+0x32000; RAM_BG0=RAM+0x33000; RAM_SCR3=RAM+0x6A000; RAM_SCR2=RAM+0x6A002; RAM_SCR1=RAM+0x6A004; RAM_SCR0=RAM+0x6A006; SCR3_XOFS=0xF900; SCR2_XOFS=0xF800; SCR1_XOFS=0xF700; SCR0_XOFS=0xF600; SCR3_YOFS=0xFF80; SCR2_YOFS=0xF400; SCR1_YOFS=0xF400; SCR0_YOFS=0xFF80; if(!load_rom("E11-12.bin", RAM, 0x40000)) return; for(ta=0; ta<0x40000; ta++) { ROM[(ta<<2)+0]=RAM[ta]; } if(!load_rom("E11-11.bin", RAM, 0x40000)) return; for(ta=0; ta<0x40000; ta++) { ROM[(ta<<2)+1]=RAM[ta]; } if(!load_rom("E11-10.bin", RAM, 0x40000)) return; for(ta=0; ta<0x40000; ta++) { ROM[(ta<<2)+2]=RAM[ta]; } if(!load_rom("E11-09.bin", RAM, 0x40000)) return; for(ta=0; ta<0x40000; ta++) { ROM[(ta<<2)+3]=RAM[ta]; } for(ta=0x104F4; ta<0x124F4; ta+=4) { // swap words tb=ReadWord(&ROM[ta]); WriteWord(&ROM[ta],ReadWord(&ROM[ta+2])); WriteWord(&ROM[ta+2],tb); } Rotate8x8_4bpp(ROM+0x104F4,0x2000>>5); Flip8x8_4bpp_X(ROM+0x104F4,0x2000>>5); for(ta=0x104F4; ta<0x124F4; ta+=4) { // swap words tb=ReadWord(&ROM[ta]); WriteWord(&ROM[ta],ReadWord(&ROM[ta+2])); WriteWord(&ROM[ta+2],tb); } for(ta=0x8EBD8; ta<0x8EC78; ta+=4) { // swap words tb=ReadWord(&ROM[ta]); WriteWord(&ROM[ta],ReadWord(&ROM[ta+2])); WriteWord(&ROM[ta+2],tb); } Rotate8x8_4bpp(ROM+0x8EBD8,0x00A0>>5); Flip8x8_4bpp_X(ROM+0x8EBD8,0x00A0>>5); for(ta=0x8EBD8; ta<0x8EC78; ta+=4) { // swap words tb=ReadWord(&ROM[ta]); WriteWord(&ROM[ta],ReadWord(&ROM[ta+2])); WriteWord(&ROM[ta+2],tb); } for(ta=0xF6820; ta<0xF6D60; ta+=4) { // swap words tb=ReadWord(&ROM[ta]); WriteWord(&ROM[ta],ReadWord(&ROM[ta+2])); WriteWord(&ROM[ta+2],tb); } Rotate8x8_4bpp(ROM+0xF6820,0x0540>>5); Flip8x8_4bpp_X(ROM+0xF6820,0x0540>>5); for(ta=0xF6820; ta<0xF6D60; ta+=4) { // swap words tb=ReadWord(&ROM[ta]); WriteWord(&ROM[ta],ReadWord(&ROM[ta+2])); WriteWord(&ROM[ta+2],tb); } // 68000 code M68000ROM = load_region[REGION_ROM2]; if(!(PCMROM=AllocateMem(0x800000))) return; load_be("e11-04.bin",PCMROM,0x200000); load_be("e11-05.bin",PCMROM+0x400000,0x200000); max_banks_this_game=3; //=memory_region_length(REGION_SOUND1)/0x400000; memset(RAM+0x00000,0x00,0x80000); memset(RAM+0x69000,0xFF,0x01000); // EEPROM HACK // ----------- WriteWord68k(&ROM[0x0044F8],0x7F00); // raine #$00 <eeprom read/write> WriteWord68k(&ROM[0x0044FA],0x4ED6); // jmp (a6) // SPEED HACKS // ----------- WriteWord68k(&ROM[0x002340],0x7F02); // raine #$02 <stop cpu> WriteWord68k(&ROM[0x002342],0x6100-10); // bra.s <loop> F3SystemEEPROMAccess=&F3SysEEPROMAccessMode2; set_colour_mapper(&col_map_xxxx_xxxx_rrrr_rrrr_gggg_gggg_bbbb_bbbb); InitPaletteMap(RAM+0x60000, 0x200, 0x40, 0x8000); // Init tc0003vcu emulation // ------------------------ tc0003vcu.RAM = RAM+0x20000; // Mapper disabled tc0003vcu.bmp_x = 64; tc0003vcu.bmp_y = 64; tc0003vcu.bmp_w = 232; tc0003vcu.bmp_h = 320; tc0003vcu.scr_x = 0; tc0003vcu.scr_y = 0; // Init tc0200obj emulation // ------------------------ tc0200obj.RAM = RAM+0x20000; tc0200obj.RAM_B = RAM+0x28000; tc0200obj.GFX = GFX_SPR; tc0200obj.MASK = GFX_SPR_SOLID; tc0200obj.bmp_x = 64; tc0200obj.bmp_y = 64; tc0200obj.bmp_w = 232; tc0200obj.bmp_h = 320; // Mapper disabled tc0200obj.tile_mask = 0x7FFF; tc0200obj.ofs_x = 0; //-16; //(0-0x0C)-16; // 0x0C 0x1F tc0200obj.ofs_y = 0; //0-0x2E; //(0-0x1F)+15; // 0x1F 0x2E tc0200obj.cols = 32; init_tc0200obj(); init_f3_system_ioc(F3_IOC_2P_3BUTTON); init_m68k(); setup_sound_68000(); }
void pick_and_load_rom() { int cont = 0; int cdiv = 3; file_descr_t *entries,*top_of_screen,*current; entries = fat_open_root_directory(); if (entries==0) { console_puts("Error reading root directory"); return; } top_of_screen = entries; current = entries; for (;;) { int key; print_dir(top_of_screen,current); //key = wait_key(); key = read_joypad1(); //switch (key) { //case JOY_UP: cont++; if (cont>20) cdiv= 3; if ((key & JOY_UP) && (cont%cdiv==0)) { if (current!=entries) { current--; cdiv = 8; if (current<top_of_screen) { top_of_screen = current; } } cont = 0; } //break; if ((key & JOY_DOWN) && (cont%cdiv==0)) { //case JOY_DOWN: if (current[1].type!=0) { current++; cdiv = 8; if ((current-top_of_screen)>19) { top_of_screen++; } } cont = 0; } //break; //case JOY_LEFT: if ((key & JOY_LEFT) && (cont%(cdiv)==0)) { if ((current!=entries) && current>(entries+4)) { current = current-5; cdiv = 8; if (current<top_of_screen) { top_of_screen = current; } } else { current = entries; top_of_screen = current; } cont = 0; } //break; //case JOY_RIGHT: if ((key & JOY_RIGHT) && (cont%(cdiv)==0)) { if (current[5].type!=0 && current[4].type!=0 && current[3].type!=0 && current[2].type!=0 && current[1].type!=0) { current = current + 5; cdiv = 8; if ((current-top_of_screen)>19) { top_of_screen = top_of_screen + 5; } } else { if (current[1].type == 0) current = current; else if (current[2].type == 0) current = current+1; else if (current[3].type == 0) current = current+2; else if (current[4].type == 0) current = current+3; else if (current[5].type == 0) current = current+4; //top_of_screen = current; cdiv = 8; } cont = 0; } //break; //case JOY_FIREA: //case JOY_FIREB: if ((key & (JOY_FIREA | JOY_FIREB)) && (cont%cdiv==0)) { if ((current->type&0x10)==0) { entries = fat_open_directory(current->cluster); if (entries==0) { console_puts("Error while reading directory"); return; } top_of_screen = entries; current = entries; cdiv = 12; } else { load_rom(current); start_rom(); return; } cont = 0; } //break; //} } }
static void load_volfiedj(void) { int ta,tb; RAMSize=0xA0000+0x10000+0x4000; if(!(ROM=AllocateMem(0xC0000))) return; if(!(RAM=AllocateMem(RAMSize))) return; if(!(GFX=AllocateMem(0x180000))) return; CBANK[0]=RAM+0xA0000+0x10000+0x0000; // C-CHIP BANKS ($F00000-$F00FFF) CBANK[1]=RAM+0xA0000+0x10000+0x0800; CBANK[2]=RAM+0xA0000+0x10000+0x1000; CBANK[3]=RAM+0xA0000+0x10000+0x1800; CBANK[4]=RAM+0xA0000+0x10000+0x2000; CBANK[5]=RAM+0xA0000+0x10000+0x2800; CBANK[6]=RAM+0xA0000+0x10000+0x3000; CBANK[7]=RAM+0xA0000+0x10000+0x3800; for(ta=0;ta<0x4000;ta+=2){ WriteWord(&RAM[0xA0000+0x10000+ta],pal_test[(ta>>1)&0x0F]); } if(!load_rom("c04-16.bin",&ROM[0x00000],0x20000)) return; // 16x16 SPRITES if(!load_rom("c04-15.bin",&ROM[0x20000],0x20000)) return; if(!load_rom("c04-10.bin",&ROM[0x40000],0x10000)) return; // 16x16 SPRITES if(!load_rom("c04-10.bin",&ROM[0x50000],0x10000)) return; // 16x16 SPRITES tb=0; for(ta=0;ta<0x60000;ta++,tb+=4){ GFX[tb+0]=ROM[ta]>>4; GFX[tb+1]=ROM[ta]&15; } if(!load_rom("c04-18.bin",&ROM[0x00000],0x20000)) return; // 16x16 SPRITES if(!load_rom("c04-17.bin",&ROM[0x20000],0x20000)) return; if(!load_rom("c04-09.bin",&ROM[0x40000],0x10000)) return; // 16x16 SPRITES if(!load_rom("c04-09.bin",&ROM[0x50000],0x10000)) return; // 16x16 SPRITES tb=2; for(ta=0;ta<0x60000;ta++,tb+=4){ GFX[tb+0]=ROM[ta]>>4; GFX[tb+1]=ROM[ta]&15; } GFX_SPR_SOLID = make_solid_mask_16x16( GFX, 0x180000/0x100 ); if(!load_rom("c04-12-1.bin",&RAM[0x00000],0x10000)) return; // 68000 ROM if(!load_rom("c04-11-1.bin",&RAM[0x10000],0x10000)) return; if(!load_rom("c04-20.bin", &RAM[0x20000],0x20000)) return; // 8x8 TILES if(!load_rom("c04-19.bin", &RAM[0x40000],0x20000)) return; for(ta=0;ta<0x60000;ta++){ ROM[ta+ta]=RAM[ta]; } if(!load_rom("c04-08-1.bin",&RAM[0x00000],0x10000)) return; if(!load_rom("c04-07-1.bin",&RAM[0x10000],0x10000)) return; if(!load_rom("c04-22.bin", &RAM[0x20000],0x20000)) return; // 8x8 TILES if(!load_rom("c04-21.bin", &RAM[0x40000],0x20000)) return; for(ta=0;ta<0x60000;ta++){ ROM[ta+ta+1]=RAM[ta]; } /*-----[Sound Setup]-----*/ Z80ROM=RAM+0xA0000; if(!load_rom("c04-06.bin",Z80ROM,0x8000)) return; // Z80 SOUND ROM memset(Z80ROM+0x8000,0xFF,0x8000); Z80ROM[0x0253]=0xD3; // OUTA (AAh) Z80ROM[0x0254]=0xAA; // SetStopZ80Mode2(0x020E); AddZ80AROMBase(Z80ROM, 0x0038, 0x0066); AddZ80AReadByte(0x8800, 0x8801, tc0140syt_read_sub_z80, NULL); AddZ80AReadByte(0x9000, 0x9001, YM2203AReadZ80, NULL); AddZ80AReadByte(0x0000, 0xFFFF, NULL, Z80ROM+0x0000); // <test> AddZ80AReadByte(0x0000, 0xFFFF, DefBadReadZ80, NULL); // <bad reads> AddZ80AReadByte( -1, -1, NULL, NULL); AddZ80AWriteByte(0x8800, 0x8801, tc0140syt_write_sub_z80, NULL); AddZ80AWriteByte(0x9000, 0x9001, YM2203AWriteZ80, NULL); AddZ80AWriteByte(0x0000, 0xFFFF, NULL, Z80ROM+0x0000); // <test> AddZ80AWriteByte(0x0000, 0xFFFF, DefBadWriteZ80, NULL); // <bad writes> AddZ80AWriteByte( -1, -1, NULL, NULL); AddZ80AReadPort(0x00, 0xFF, DefBadReadZ80, NULL); AddZ80AReadPort( -1, -1, NULL, NULL); AddZ80AWritePort(0xAA, 0xAA, StopZ80Mode2, NULL); AddZ80AWritePort(0x00, 0xFF, DefBadWriteZ80, NULL); AddZ80AWritePort( -1, -1, NULL, NULL); AddZ80AInit(); tc0140syt_reset(); // Add [J3d!] /*-----------------------*/ memset(RAM+0x00000,0x00,0xA0000); memset(RAM+0x8A000,0xFF,0x00100); // C-Chip // ------ WriteWord68k(&ROM[0x13FB2],0x4E71); WriteWord68k(&ROM[0x08262],0x4E71); // Use unprotected code WriteWord68k(&ROM[0x08228],0x4E71); // better than nothing i guess // Sound Wait // ---------- WriteWord68k(&ROM[0x004F0],0x4E71); // Speed Hack // ---------- WriteWord68k(&ROM[0x0161C],0x4EF9); WriteLong68k(&ROM[0x0161E],0x00000300); WriteWord68k(&ROM[0x00300],0x4EB9); WriteLong68k(&ROM[0x00302],0x00005CD6); WriteLong68k(&ROM[0x00306],0x13FC0000); WriteLong68k(&ROM[0x0030A],0x00AA0000); WriteWord68k(&ROM[0x0030E],0x6100-16); WriteLong68k(&ROM[0x1438E],0x13FC0000); WriteLong68k(&ROM[0x14392],0x00AA0000); WriteWord68k(&ROM[0x14396],0x4E75); // DSW Hack // -------- WriteWord68k(&ROM[0x073A6],0x1039); // move.b $110000,d0 WriteLong68k(&ROM[0x073A8],0x00110000); WriteWord68k(&ROM[0x073AC],0x4EF9); // jmp $73E2 WriteLong68k(&ROM[0x073AE],0x000073E2); WriteWord68k(&ROM[0x073F4],0x1039); // move.b $110001,d0 WriteLong68k(&ROM[0x073F6],0x00110001); WriteWord68k(&ROM[0x073FA],0x4EF9); // jmp $7430 WriteLong68k(&ROM[0x073FC],0x00007430); InitPaletteMap(RAM+0x86000, 0x200, 0x10, 0x8000); set_colour_mapper(&col_map_xbbb_bbgg_gggr_rrrr); /* * StarScream Stuff follows */ ByteSwap(ROM,0xC0000); ByteSwap(RAM,0xA0000); AddMemFetch(0x000000, 0x03FFFF, ROM+0x000000-0x000000); // 68000 ROM AddMemFetch(-1, -1, NULL); AddReadByte(0x000000, 0x03FFFF, NULL, ROM+0x000000); // 68000 ROM AddReadByte(0x100000, 0x103FFF, NULL, RAM+0x000000); // MAIN RAM AddReadByte(0x080000, 0x0FFFFF, NULL, ROM+0x040000); // 68000 GFX ROM AddReadByte(0x200000, 0x201FFF, NULL, RAM+0x084000); // OBJECT RAM AddReadByte(0x400000, 0x47FFFF, NULL, RAM+0x004000); // PIXEL RAM AddReadByte(0xE00000, 0xE00003, tc0140syt_read_main_68k, NULL); // SOUND AddReadByte(0xF00000, 0xF00FFF, CChipReadB, NULL); // C-CHIP AddReadByte(0x110000, 0x110001, NULL, RAM+0x08A000); // DSW (HACKED) 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); // MAIN RAM AddReadWord(0x080000, 0x0FFFFF, NULL, ROM+0x040000); // 68000 GFX ROM AddReadWord(0x200000, 0x201FFF, NULL, RAM+0x084000); // OBJECT RAM AddReadWord(0x400000, 0x47FFFF, NULL, RAM+0x004000); // PIXEL RAM AddReadWord(0x500000, 0x503FFF, NULL, RAM+0x086000); // COLOR RAM AddReadWord(0xE00000, 0xE00003, tc0140syt_read_main_68k, NULL); // SOUND AddReadWord(0xF00000, 0xF00FFF, CChipReadW, NULL); // C-CHIP AddReadWord(0x000000, 0xFFFFFF, DefBadReadWord, NULL); // <Bad Reads> AddReadWord(-1, -1, NULL, NULL); AddWriteByte(0x100000, 0x103FFF, NULL, RAM+0x000000); // MAIN RAM AddWriteByte(0x200000, 0x201FFF, NULL, RAM+0x084000); // OBJECT RAM AddWriteByte(0x400000, 0x47FFFF, NULL, RAM+0x004000); // PIXEL RAM AddWriteByte(0xE00000, 0xE00003, tc0140syt_write_main_68k, NULL); // SOUND AddWriteByte(0xF00000, 0xF00FFF, CChipWriteB, NULL); // C-CHIP AddWriteByte(0xAA0000, 0xAA0001, Stop68000, NULL); // Trap Idle 68000 AddWriteByte(0x000000, 0xFFFFFF, BadWriteByte, NULL); // <Bad Writes> AddWriteByte(-1, -1, NULL, NULL); AddWriteWord(0x100000, 0x103FFF, NULL, RAM+0x000000); // MAIN RAM AddWriteWord(0x200000, 0x201FFF, NULL, RAM+0x084000); // OBJECT RAM AddWriteWord(0x400000, 0x47FFFF, NULL, RAM+0x004000); // PIXEL RAM AddWriteWord(0x500000, 0x503FFF, NULL, RAM+0x086000); // COLOR RAM AddWriteWord(0xE00000, 0xE00003, tc0140syt_write_main_68k, NULL); // SOUND AddWriteWord(0xF00000, 0xF00FFF, CChipWriteW, NULL); // C-CHIP AddWriteWord(0x000000, 0xFFFFFF, DefBadWriteWord, NULL); // <Bad Writes> AddWriteWord(-1, -1, NULL, NULL); AddInitMemory(); // Set Starscream mem pointers... }
int Application::loadROM(const char* filename) { LOGD("NDK:LoadingRom: %s", filename); if (_romLoaded) { // TODO: close genesis // save sram saveSRam(_sramDir); _romLoaded = false; } /* load ROM file */ if (!load_rom((char*)filename)) { LOGD("Error loading rom!"); return NATIVE_ERROR; } // store current rom strcpy(_currentRom, filename); // controllers options config.gun_cursor[0] = 1; config.gun_cursor[1] = 1; config.invert_mouse = 0; config.s_device = 0; LOGD("GenesisPlus Hardware: %d", system_hw); if (system_hw == SYSTEM_MEGADRIVE || system_hw == SYSTEM_GENESIS) { Input.setButtonVisibility(BUTTON_INDEX_C, true); Input.setButtonVisibility(BUTTON_INDEX_X, true); Input.setButtonVisibility(BUTTON_INDEX_Y, true); Input.setButtonVisibility(BUTTON_INDEX_Z, true); input.system[0] = SYSTEM_MD_GAMEPAD; input.system[1] = SYSTEM_MD_GAMEPAD; config.input[0].padtype = DEVICE_PAD6B; } else if (system_hw == SYSTEM_PBC) { Input.setButtonVisibility(BUTTON_INDEX_C, false); Input.setButtonVisibility(BUTTON_INDEX_X, false); Input.setButtonVisibility(BUTTON_INDEX_Y, false); Input.setButtonVisibility(BUTTON_INDEX_Z, false); input.system[0] = SYSTEM_MS_GAMEPAD; input.system[1] = SYSTEM_MS_GAMEPAD; config.input[0].padtype = DEVICE_PAD2B; } input_init(); // hot-swap previous & current cartridge bool hotswap = config.hot_swap && cart.romsize; //cart.romsize = size; if(hotswap) { if (system_hw == SYSTEM_PBC) { sms_cart_init(); sms_cart_reset(); } else { md_cart_init(); md_cart_reset(1); } } else { // initialize audio emulation audio_init(_sampleRate, vdp_pal ? 50.0 : 60.0); // system power ON system_init(); system_reset(); } // sram loadSRam(_currentRom); // mark video updated bitmap.viewport.changed |= 1; /* load Cheats */ //CheatLoad(); _ssize = 0; _romLoaded = true; return NATIVE_OK; }
static void cmd_loadrom(void) { uint32_t address = 0; uint8_t flags = LOADROM_WITH_SRAM | LOADROM_WITH_RESET; load_rom((uint8_t*)curchar, address, flags); }
static void load_masterw(void) { int ta,tb,tc; RAMSize=0x38000; if(!(RAM=AllocateMem(0x80000))) return; if(!(GFX=AllocateMem(0x240000))) return; GFX_BG0 = GFX+0x000000; GFX_BG2 = GFX+0x200000; if(!load_rom("mow-m01.rom", RAM, 0x80000)) return; tb=0x200000; for(ta=0;ta<0x10000;ta+=2){ tc=RAM[ta+1]; GFX[tb+0]=((tc&0x80)>>7)<<0; GFX[tb+1]=((tc&0x40)>>6)<<0; GFX[tb+2]=((tc&0x20)>>5)<<0; GFX[tb+3]=((tc&0x10)>>4)<<0; GFX[tb+4]=((tc&0x08)>>3)<<0; GFX[tb+5]=((tc&0x04)>>2)<<0; GFX[tb+6]=((tc&0x02)>>1)<<0; GFX[tb+7]=((tc&0x01)>>0)<<0; tc=RAM[ta]; GFX[tb+0]|=((tc&0x80)>>7)<<1; GFX[tb+1]|=((tc&0x40)>>6)<<1; GFX[tb+2]|=((tc&0x20)>>5)<<1; GFX[tb+3]|=((tc&0x10)>>4)<<1; GFX[tb+4]|=((tc&0x08)>>3)<<1; GFX[tb+5]|=((tc&0x04)>>2)<<1; GFX[tb+6]|=((tc&0x02)>>1)<<1; GFX[tb+7]|=((tc&0x01)>>0)<<1; tb+=8; } tb=0; for(ta=0;ta<0x80000;ta+=2){ tc=RAM[ta+1]; GFX[tb+0]=((tc&0x80)>>7)<<0; GFX[tb+1]=((tc&0x40)>>6)<<0; GFX[tb+2]=((tc&0x20)>>5)<<0; GFX[tb+3]=((tc&0x10)>>4)<<0; GFX[tb+4]=((tc&0x08)>>3)<<0; GFX[tb+5]=((tc&0x04)>>2)<<0; GFX[tb+6]=((tc&0x02)>>1)<<0; GFX[tb+7]=((tc&0x01)>>0)<<0; tc=RAM[ta]; GFX[tb+0]|=((tc&0x80)>>7)<<1; GFX[tb+1]|=((tc&0x40)>>6)<<1; GFX[tb+2]|=((tc&0x20)>>5)<<1; GFX[tb+3]|=((tc&0x10)>>4)<<1; GFX[tb+4]|=((tc&0x08)>>3)<<1; GFX[tb+5]|=((tc&0x04)>>2)<<1; GFX[tb+6]|=((tc&0x02)>>1)<<1; GFX[tb+7]|=((tc&0x01)>>0)<<1; tb+=16; if((tb&0x7F)==0){tb-=0x78;} else{if((tb&0x7F)==8){tb-=0x08;}} } if(!load_rom("mow-m02.rom", RAM, 0x80000)) return; tb=0x200000; for(ta=0;ta<0x10000;ta+=2){ tc=RAM[ta+1]; GFX[tb+0]|=((tc&0x80)>>7)<<2; GFX[tb+1]|=((tc&0x40)>>6)<<2; GFX[tb+2]|=((tc&0x20)>>5)<<2; GFX[tb+3]|=((tc&0x10)>>4)<<2; GFX[tb+4]|=((tc&0x08)>>3)<<2; GFX[tb+5]|=((tc&0x04)>>2)<<2; GFX[tb+6]|=((tc&0x02)>>1)<<2; GFX[tb+7]|=((tc&0x01)>>0)<<2; tc=RAM[ta]; GFX[tb+0]|=((tc&0x80)>>7)<<3; GFX[tb+1]|=((tc&0x40)>>6)<<3; GFX[tb+2]|=((tc&0x20)>>5)<<3; GFX[tb+3]|=((tc&0x10)>>4)<<3; GFX[tb+4]|=((tc&0x08)>>3)<<3; GFX[tb+5]|=((tc&0x04)>>2)<<3; GFX[tb+6]|=((tc&0x02)>>1)<<3; GFX[tb+7]|=((tc&0x01)>>0)<<3; tb+=8; } tb=0; for(ta=0;ta<0x80000;ta+=2){ tc=RAM[ta+1]; GFX[tb+0]|=((tc&0x80)>>7)<<2; GFX[tb+1]|=((tc&0x40)>>6)<<2; GFX[tb+2]|=((tc&0x20)>>5)<<2; GFX[tb+3]|=((tc&0x10)>>4)<<2; GFX[tb+4]|=((tc&0x08)>>3)<<2; GFX[tb+5]|=((tc&0x04)>>2)<<2; GFX[tb+6]|=((tc&0x02)>>1)<<2; GFX[tb+7]|=((tc&0x01)>>0)<<2; tc=RAM[ta]; GFX[tb+0]|=((tc&0x80)>>7)<<3; GFX[tb+1]|=((tc&0x40)>>6)<<3; GFX[tb+2]|=((tc&0x20)>>5)<<3; GFX[tb+3]|=((tc&0x10)>>4)<<3; GFX[tb+4]|=((tc&0x08)>>3)<<3; GFX[tb+5]|=((tc&0x04)>>2)<<3; GFX[tb+6]|=((tc&0x02)>>1)<<3; GFX[tb+7]|=((tc&0x01)>>0)<<3; tb+=16; if((tb&0x7F)==0){tb-=0x78;} else{if((tb&0x7F)==8){tb-=0x08;}} } Rotate16x16(GFX_BG0,0x2000); Flip16x16_X(GFX_BG0,0x2000); Rotate8x8 (GFX_BG2,0x1000); Flip8x8_X (GFX_BG2,0x1000); /*-----[Sound Setup]-----*/ Z80ROM=RAM+0x28000; if(!load_rom("b72-07.rom", Z80ROM, 0x10000)) return; // Z80 SOUND ROM AddTaitoYM2203(0x02CB, 0x025C, 0x10000, NULL, 0x00000); /*-----------------------*/ memset(RAM+0x00000,0x00,0x28000); RAM_INPUT = RAM+0x25100; RAM_VIDEO = RAM+0x04000; RAM_COLOUR = RAM+0x24000; GFX_BG0_SOLID = make_solid_mask_16x16(GFX_BG0, 0x2000); GFX_BG2_SOLID = make_solid_mask_8x8 (GFX_BG2, 0x1000); InitPaletteMap(RAM_COLOUR, 0x40, 0x10, 0x1000); set_colour_mapper(&col_map_rrrr_gggg_bbbb_xxxx); WriteLong68k(&ROM[0x0742],0x13FC0000); // move.b #$00,$AA0000 WriteLong68k(&ROM[0x0746],0x00AA0000); WriteWord68k(&ROM[0x074A],0x4E71); // nop // Init tc0220ioc emulation // ------------------------ tc0220ioc.RAM = input_buffer; tc0220ioc.ctrl = 0; //TC0220_STOPCPU; reset_tc0220ioc(); // Init tc0180vcu emulation // ------------------------ tc0180vcu.RAM = RAM_VIDEO; tc0180vcu.RAM_2 = RAM_VIDEO+0x18000; tc0180vcu.GFX_BG0 = GFX_BG0; tc0180vcu.GFX_BG0_MSK= GFX_BG0_SOLID; tc0180vcu.GFX_BG2 = GFX_BG2; tc0180vcu.GFX_BG2_MSK= GFX_BG2_SOLID; tc0180vcu.tile_mask = 0x1FFF; tc0180vcu.bmp_x = 32; tc0180vcu.bmp_y = 32; tc0180vcu.bmp_w = 224; tc0180vcu.bmp_h = 320; tc0180vcu.scr_x = 16; tc0180vcu.scr_y = 0; vcu_make_col_bankmap(0x10,0x30,0x20,0x10,0x00); /* * StarScream Stuff follows */ ByteSwap(ROM,0x80000); ByteSwap(RAM,0x25000); AddMemFetch(0x000000, 0x07FFFF, ROM+0x000000-0x000000); // 68000 ROM AddMemFetch(-1, -1, NULL); AddReadByte(0x000000, 0x07FFFF, NULL, ROM+0x000000); // 68000 ROM AddReadByte(0x200000, 0x203FFF, NULL, RAM+0x000000); // 68000 RAM AddReadByte(0x400000, 0x41FFFF, NULL, RAM_VIDEO); // SCREEN RAM AddReadByte(0x600000, 0x600FFF, NULL, RAM_COLOUR); // COLOR RAM AddReadByte(0x800000, 0x800003, tc0220ioc_rb_port, NULL); // INPUT AddReadByte(0xA00000, 0xA00003, tc0140syt_read_main_68k, NULL); // SOUND AddReadByte(0x000000, 0xFFFFFF, DefBadReadByte, NULL); // <Bad Reads> AddReadByte(-1, -1, NULL, NULL); AddReadWord(0x000000, 0x07FFFF, NULL, ROM+0x000000); // 68000 ROM AddReadWord(0x200000, 0x203FFF, NULL, RAM+0x000000); // 68000 RAM AddReadWord(0x400000, 0x41FFFF, NULL, RAM_VIDEO); // SCREEN RAM AddReadWord(0x600000, 0x600FFF, NULL, RAM_COLOUR); // COLOR RAM AddReadWord(0x800000, 0x800003, tc0220ioc_rw_port, NULL); // INPUT AddReadWord(0x000000, 0xFFFFFF, DefBadReadWord, NULL); // <Bad Reads> AddReadWord(-1, -1,NULL, NULL); AddWriteByte(0x200000, 0x203FFF, NULL, RAM+0x000000); // 68000 RAM AddWriteByte(0x400000, 0x41FFFF, NULL, RAM_VIDEO); // SCREEN RAM AddWriteByte(0x600000, 0x600FFF, NULL, RAM_COLOUR); // COLOR RAM AddWriteByte(0x800000, 0x800003, tc0220ioc_wb_port, NULL); // INPUT AddWriteByte(0xA00000, 0xA00003, tc0140syt_write_main_68k, NULL); // SOUND AddWriteByte(0xAA0000, 0xAA0001, Stop68000, NULL); // Trap Idle 68000 AddWriteByte(0x000000, 0xFFFFFF, DefBadWriteByte, NULL); // <Bad Writes> AddWriteByte(-1, -1, NULL, NULL); AddWriteWord(0x200000, 0x203FFF, NULL, RAM+0x000000); // 68000 RAM AddWriteWord(0x400000, 0x41FFFF, NULL, RAM_VIDEO); // SCREEN RAM AddWriteWord(0x600000, 0x600FFF, NULL, RAM_COLOUR); // COLOR RAM AddWriteWord(0x800000, 0x800003, tc0220ioc_ww_port, NULL); // INPUT AddWriteWord(0x000000, 0xFFFFFF, DefBadWriteWord, NULL); // <Bad Writes> AddWriteWord(-1, -1, NULL, NULL); AddInitMemory(); // Set Starscream mem pointers... }
int main(int argc, char *argv[]) { int ret = 1, i, idx, fd, num_apps = 0; char *dev_file = "/dev/uhid0", *banner, *file; struct stat sb; dldev_t dev; appinfo *app = NULL; u8 *data; u16 len; /* for data security */ /* umask(S_IRWXG | S_IRWXO); */ while((i = getopt(argc, argv, "hd:")) != -1){ switch(i){ case 'd': dev_file = optarg; break; case 'h': default: usage(); break; } } argc -= optind; argv += optind; #ifdef USB_USBHID dev.usb.file = dev_file; #endif BEGIN_OPT() #if 0 APP_OPT("rom", -3) APP_OPT("eeprom", -2) #endif APP_OPT("wristapp", -1) APP_OPT("contact", APP_CONTACT) APP_OPT("note", APP_NOTE) APP_OPT("appt", APP_APPT) APP_OPT("alarm", APP_ALARM) APP_OPT("schedule", APP_SCHEDULE) APP_OPT("occasion", APP_OCCASION) APP_OPT("chrono", APP_CHRONO) APP_OPT("countdn", APP_TIMER) APP_OPT("interval", APP_TIMER | 0x100) #if 0 APP_OPT("synchro", APP_SYNCHRO) #endif APP_OPT("option", APP_OPTION) END_OPT() if(!num_apps) usage(); if(open_dev(&dev)){ ERROR("open_dev"); goto exit; } tucp_progress(1); if(start_session(&dev)){ ERROR("read_app_info"); goto exit; } /******************************************************************************/ #ifdef DEBUG for(i = 0; i < NUM_APPS; i++){ if(!dev.app[i].acd.app_idx) continue; printf("%2d: %d%d%d%d%d%d%d%d %02x %02x %04x %04x %04x %04x %04x %04x %s\n", i, dev.app[i].acd.app_idx, dev.app[i].acd.code_loc, dev.app[i].acd.db_loc, dev.app[i].acd.code_invalid, dev.app[i].acd.db_modified, dev.app[i].acd.db_invalid, dev.app[i].acd.passwd_req, dev.app[i].acd.mode_name, dev.app[i].acb.app_type, dev.app[i].acb.app_inst, dev.app[i].acb.asd_addr, dev.app[i].acb.add_addr, dev.app[i].acb.state_mgr_addr, dev.app[i].acb.refresh_addr, dev.app[i].acb.banner_addr, dev.app[i].acb.code_addr, dev.app[i].banner ); } #endif /******************************************************************************/ for(i = 0; i < num_apps; i++){ if(app[i].file[0]) fprintf(stderr, "%s\n", app[i].file); else continue; banner = NULL; file = app[i].file; switch(app[i].app){ #if 0 case -3: if(load_rom(&dev, &data, &len)){ ERROR("load_rom"); goto end; } break; case -2: if(load_eeprom(&dev, &data, &len)){ ERROR("load_eeprom"); goto end; } break; #endif case -1: banner = file; for(; *file && *file != '='; file++); if(*file) *file++ = 0; if(!(*file)){ ERROR("%s: no file name specified", banner); goto end; } for(; *banner; banner++) *banner = toupper(*banner); banner = app[i].file; break; case APP_CONTACT: banner = "CONTACT"; break; case APP_NOTE: banner = "NOTE"; break; case APP_APPT: banner = "APPT"; break; case APP_ALARM: banner = "ALARM"; break; case APP_SCHEDULE: banner = "SCHEDULE"; break; case APP_OCCASION: banner = "OCCASION"; break; case APP_CHRONO: banner = "CHRONO"; break; case APP_TIMER: banner = "COUNTDN TIMER"; break; case APP_TIMER | 0x100: banner = "INTERVAL TIMER"; break; #if 0 case APP_SYNCHRO: banner = "SYNCHRO"; break; #endif case APP_OPTION: break; } if(stat(file, &sb)){ ERROR("%s: stat failed", file); goto end; } len = sb.st_size; if((fd = open(file, O_RDONLY)) < 0){ ERROR("%s: open failed", file); goto end; } data = (u8*)malloc(len); if(read(fd, data, len) != len){ ERROR("%s: read failed", file); goto end; } close(fd); if(banner){ if((idx = find_app(&dev, banner)) < 0){ ERROR("%s application not found", banner); goto end; } if(load_add(&dev, idx, data)){ ERROR("load_add"); goto end; } }else{ len = 15; if(write_abs_addr(&dev, dev.sysmap.opt_addr, int_mem, data, len)){ ERROR("write_abs_addr"); goto end; } } free(data); } /******************************************************************************/ end: if(end_session(&dev)){ ERROR("end_session"); goto exit; } tucp_progress(0); ret = 0; exit: close_dev(&dev); exit(ret); }
int main(void) { LPC_GPIO2->FIODIR = BV(4) | BV(5); LPC_GPIO1->FIODIR = BV(23) | BV(SNES_CIC_PAIR_BIT); BITBAND(SNES_CIC_PAIR_REG->FIOSET, SNES_CIC_PAIR_BIT) = 1; LPC_GPIO0->FIODIR = BV(16); /* connect UART3 on P0[25:26] + SSP0 on P0[15:18] + MAT3.0 on P0[10] */ LPC_PINCON->PINSEL1 = BV(18) | BV(19) | BV(20) | BV(21) /* UART3 */ | BV(3) | BV(5); /* SSP0 (FPGA) except SS */ LPC_PINCON->PINSEL0 = BV(31); /* SSP0 */ /* | BV(13) | BV(15) | BV(17) | BV(19) SSP1 (SD) */ /* pull-down CIC data lines */ LPC_PINCON->PINMODE0 = BV(0) | BV(1) | BV(2) | BV(3); clock_disconnect(); snes_init(); snes_reset(1); power_init(); timer_init(); uart_init(); fpga_spi_init(); spi_preinit(); led_init(); /* do this last because the peripheral init()s change PCLK dividers */ clock_init(); LPC_PINCON->PINSEL0 |= BV(20) | BV(21); /* MAT3.0 (FPGA clock) */ led_pwm(); sdn_init(); printf("\n\nsd2snes mk.2\n============\nfw ver.: " VER "\ncpu clock: %d Hz\n", CONFIG_CPU_FREQUENCY); printf("PCONP=%lx\n", LPC_SC->PCONP); file_init(); cic_init(0); /* setup timer (fpga clk) */ LPC_TIM3->CTCR=0; LPC_TIM3->EMR=EMC0TOGGLE; LPC_TIM3->MCR=MR0R; LPC_TIM3->MR0=1; LPC_TIM3->TCR=1; fpga_init(); char *testnames[11] = { "SD ", "USB ", "RTC ", "CIC ", "FPGA ", "RAM ", "CLK ", "DAC ", "SNES IRQ", "SNES RAM", "SNES PA "}; char *teststate_names [3] = { "no run", "\x1b[32;1mPassed\x1b[m", "\x1b[31;1mFAILED\x1b[m" }; int testresults[11] = { NO_RUN, NO_RUN, NO_RUN, NO_RUN, NO_RUN, NO_RUN, NO_RUN, NO_RUN, NO_RUN, NO_RUN, NO_RUN }; testresults[TEST_SD] = test_sd(); //testresults[TEST_USB] = test_usb(); testresults[TEST_RTC] = test_rtc(); delay_ms(209); testresults[TEST_CIC] = test_cic(); testresults[TEST_FPGA] = test_fpga(); testresults[TEST_RAM] = test_mem(); printf("Loading SNES test ROM\n=====================\n"); load_rom((uint8_t*)"/sd2snes/test.bin", 0, LOADROM_WITH_RESET); printf("\n\n\n"); delay_ms(1000); testresults[TEST_CLK] = test_clk(); fpga_set_bram_addr(0x1fff); fpga_write_bram_data(0x01); // tell SNES test program to continue uint8_t snestest_irq_state, snestest_pa_state, snestest_mem_state, snestest_mem_bank; uint8_t snestest_irq_done = 0, snestest_pa_done = 0, snestest_mem_done = 0; uint8_t last_irq_state = 0x77, last_pa_state = 0x77, last_mem_state = 0x77, last_mem_bank = 0x77; uint32_t failed_addr = 0; while(!(snestest_irq_done & snestest_pa_done & snestest_mem_done)) { fpga_set_bram_addr(0); snestest_irq_state = fpga_read_bram_data(); snestest_mem_state = fpga_read_bram_data(); snestest_pa_state = fpga_read_bram_data(); snestest_mem_bank = fpga_read_bram_data(); if(snestest_irq_state != last_irq_state || snestest_mem_state != last_mem_state || snestest_pa_state != last_pa_state || snestest_mem_bank != last_mem_bank) { printf("SNES test status: IRQ: %02x PA: %02x MEM: %02x/%02x\r", snestest_irq_state, snestest_pa_state, snestest_mem_state, snestest_mem_bank); } last_irq_state = snestest_irq_state; last_mem_state = snestest_mem_state; last_pa_state = snestest_pa_state; last_mem_bank = snestest_mem_bank; if(snestest_pa_state != 0x00) snestest_pa_done = 1; if(snestest_irq_state != 0x00) snestest_irq_done = 1; if(snestest_mem_state == 0xff || snestest_mem_state == 0x5a) snestest_mem_done = 1; cli_entrycheck(); } printf("\n"); if(snestest_pa_state == 0xff) testresults[TEST_SNES_PA] = FAILED; else testresults[TEST_SNES_PA] = PASSED; if(snestest_irq_state == 0xff) testresults[TEST_SNES_IRQ] = FAILED; else testresults[TEST_SNES_IRQ] = PASSED; if(snestest_mem_state == 0xff) { testresults[TEST_SNES_RAM] = FAILED; fpga_set_bram_addr(4); failed_addr = fpga_read_bram_data(); failed_addr |= fpga_read_bram_data() << 8; failed_addr |= fpga_read_bram_data() << 16; printf("SNES MEM test FAILED (failed address: %06lx)\n", failed_addr); } else testresults[TEST_SNES_RAM] = PASSED; printf("\n\nTEST SUMMARY\n============\n\n"); printf("Test Result\n----------------\n"); int testcount; for(testcount=0; testcount < 11; testcount++) { printf("%s %s\n", testnames[testcount], teststate_names[testresults[testcount]]); } cli_loop(); while(1); }
void call_user_start(uint32 readpos) { usercode* user; user = load_rom(readpos); user(); }
static void load_ninjaw(void) { int ta,tb,tc,td; UINT8 *TMP; setup_z80_frame(CPU_Z80_0,CPU_FRAME_MHz(4.5,60)); romset = 0; if(!(TMP=AllocateMem(0x80000))) return; if(!(GFX=AllocateMem(0x600000))) return; GFX_BG0 = GFX+0x000000; GFX_SPR = GFX+0x200000; tb=0; if(!load_rom("b31-01.23", TMP, 0x80000)) return; // 8x8 BACKGROUND TILES for(ta=0;ta<0x80000;ta+=2){ GFX[tb+1]=TMP[ta+1]&15; GFX[tb+0]=TMP[ta+1]>>4; GFX[tb+3]=TMP[ta+0]&15; GFX[tb+2]=TMP[ta+0]>>4; tb+=4; } if(!load_rom("b31-02.24", TMP, 0x80000)) return; for(ta=0;ta<0x80000;ta+=2){ GFX[tb+1]=TMP[ta+1]&15; GFX[tb+0]=TMP[ta+1]>>4; GFX[tb+3]=TMP[ta+0]&15; GFX[tb+2]=TMP[ta+0]>>4; tb+=4; } if(!load_rom("b31-07.176", TMP, 0x80000)) return; // 16x16 SPRITES for(ta=0;ta<0x80000;ta+=0){ for(td=0;td<2;td++){ tc=TMP[ta++]; GFX[tb+3]=(((tc&0x80)>>7)<<1); GFX[tb+2]=(((tc&0x40)>>6)<<1); GFX[tb+1]=(((tc&0x20)>>5)<<1); GFX[tb+0]=(((tc&0x10)>>4)<<1); GFX[tb+3]|=(((tc&0x08)>>3)<<0); GFX[tb+2]|=(((tc&0x04)>>2)<<0); GFX[tb+1]|=(((tc&0x02)>>1)<<0); GFX[tb+0]|=(((tc&0x01)>>0)<<0); tc=TMP[ta++]; GFX[tb+3]|=(((tc&0x80)>>7)<<3); GFX[tb+2]|=(((tc&0x40)>>6)<<3); GFX[tb+1]|=(((tc&0x20)>>5)<<3); GFX[tb+0]|=(((tc&0x10)>>4)<<3); GFX[tb+3]|=(((tc&0x08)>>3)<<2); GFX[tb+2]|=(((tc&0x04)>>2)<<2); GFX[tb+1]|=(((tc&0x02)>>1)<<2); GFX[tb+0]|=(((tc&0x01)>>0)<<2); tb+=4; } tb+=8; if((tb&0x7F)==0){tb-=0x78;} else{if((tb&0x7F)==8){tb-=8;}} } if(!load_rom("b31-06.175", TMP, 0x80000)) return; // 16x16 SPRITES for(ta=0;ta<0x80000;ta+=0){ for(td=0;td<2;td++){ tc=TMP[ta++]; GFX[tb+3]=(((tc&0x80)>>7)<<1); GFX[tb+2]=(((tc&0x40)>>6)<<1); GFX[tb+1]=(((tc&0x20)>>5)<<1); GFX[tb+0]=(((tc&0x10)>>4)<<1); GFX[tb+3]|=(((tc&0x08)>>3)<<0); GFX[tb+2]|=(((tc&0x04)>>2)<<0); GFX[tb+1]|=(((tc&0x02)>>1)<<0); GFX[tb+0]|=(((tc&0x01)>>0)<<0); tc=TMP[ta++]; GFX[tb+3]|=(((tc&0x80)>>7)<<3); GFX[tb+2]|=(((tc&0x40)>>6)<<3); GFX[tb+1]|=(((tc&0x20)>>5)<<3); GFX[tb+0]|=(((tc&0x10)>>4)<<3); GFX[tb+3]|=(((tc&0x08)>>3)<<2); GFX[tb+2]|=(((tc&0x04)>>2)<<2); GFX[tb+1]|=(((tc&0x02)>>1)<<2); GFX[tb+0]|=(((tc&0x01)>>0)<<2); tb+=4; } tb+=8; if((tb&0x7F)==0){tb-=0x78;} else{if((tb&0x7F)==8){tb-=8;}} } if(!load_rom("b31-05.174", TMP, 0x80000)) return; // 16x16 SPRITES for(ta=0;ta<0x80000;ta+=0){ for(td=0;td<2;td++){ tc=TMP[ta++]; GFX[tb+3]=(((tc&0x80)>>7)<<1); GFX[tb+2]=(((tc&0x40)>>6)<<1); GFX[tb+1]=(((tc&0x20)>>5)<<1); GFX[tb+0]=(((tc&0x10)>>4)<<1); GFX[tb+3]|=(((tc&0x08)>>3)<<0); GFX[tb+2]|=(((tc&0x04)>>2)<<0); GFX[tb+1]|=(((tc&0x02)>>1)<<0); GFX[tb+0]|=(((tc&0x01)>>0)<<0); tc=TMP[ta++]; GFX[tb+3]|=(((tc&0x80)>>7)<<3); GFX[tb+2]|=(((tc&0x40)>>6)<<3); GFX[tb+1]|=(((tc&0x20)>>5)<<3); GFX[tb+0]|=(((tc&0x10)>>4)<<3); GFX[tb+3]|=(((tc&0x08)>>3)<<2); GFX[tb+2]|=(((tc&0x04)>>2)<<2); GFX[tb+1]|=(((tc&0x02)>>1)<<2); GFX[tb+0]|=(((tc&0x01)>>0)<<2); tb+=4; } tb+=8; if((tb&0x7F)==0){tb-=0x78;} else{if((tb&0x7F)==8){tb-=8;}} } if(!load_rom("b31-04.173", TMP, 0x80000)) return; // 16x16 SPRITES for(ta=0;ta<0x80000;ta+=0){ for(td=0;td<2;td++){ tc=TMP[ta++]; GFX[tb+3]=(((tc&0x80)>>7)<<1); GFX[tb+2]=(((tc&0x40)>>6)<<1); GFX[tb+1]=(((tc&0x20)>>5)<<1); GFX[tb+0]=(((tc&0x10)>>4)<<1); GFX[tb+3]|=(((tc&0x08)>>3)<<0); GFX[tb+2]|=(((tc&0x04)>>2)<<0); GFX[tb+1]|=(((tc&0x02)>>1)<<0); GFX[tb+0]|=(((tc&0x01)>>0)<<0); tc=TMP[ta++]; GFX[tb+3]|=(((tc&0x80)>>7)<<3); GFX[tb+2]|=(((tc&0x40)>>6)<<3); GFX[tb+1]|=(((tc&0x20)>>5)<<3); GFX[tb+0]|=(((tc&0x10)>>4)<<3); GFX[tb+3]|=(((tc&0x08)>>3)<<2); GFX[tb+2]|=(((tc&0x04)>>2)<<2); GFX[tb+1]|=(((tc&0x02)>>1)<<2); GFX[tb+0]|=(((tc&0x01)>>0)<<2); tb+=4; } tb+=8; if((tb&0x7F)==0){tb-=0x78;} else{if((tb&0x7F)==8){tb-=8;}} } FreeMem(TMP); RAMSize=0xA0000; if(!(ROM=AllocateMem(0x120000))) return; if(!(RAM=AllocateMem(RAMSize))) return; RAM2=RAM+0x40000; if(!load_rom_index(13, RAM, 0x10000)) return; for(ta=0;ta<0x10000;ta++){ ROM[ta+ta]=RAM[ta]; } if(!load_rom_index(14, RAM, 0x10000)) return; for(ta=0;ta<0x10000;ta++){ ROM[ta+ta+1]=RAM[ta]; } if(!load_rom("b31_29.34", RAM, 0x10000)) return; for(ta=0;ta<0x10000;ta++){ ROM[ta+ta+0x20000]=RAM[ta]; } if(!load_rom("b31_27.31", RAM, 0x10000)) return; for(ta=0;ta<0x10000;ta++){ ROM[ta+ta+0x20001]=RAM[ta]; } if(!load_rom("b31_41.5", RAM, 0x20000)) return; for(ta=0;ta<0x20000;ta++){ ROM[ta+ta+0x40000]=RAM[ta]; } if(!load_rom("b31_39.2", RAM, 0x20000)) return; for(ta=0;ta<0x20000;ta++){ ROM[ta+ta+0x40001]=RAM[ta]; } if(!load_rom("b31_40.6", RAM, 0x20000)) return; for(ta=0;ta<0x20000;ta++){ ROM[ta+ta+0x80000]=RAM[ta]; } if(!load_rom("b31_38.3", RAM, 0x20000)) return; for(ta=0;ta<0x20000;ta++){ ROM[ta+ta+0x80001]=RAM[ta]; } if(!load_rom("b31_33.87", RAM, 0x10000)) return; for(ta=0;ta<0x10000;ta++){ ROM[ta+ta+0xC0000]=RAM[ta]; } if(!load_rom("b31_36.97", RAM, 0x10000)) return; for(ta=0;ta<0x10000;ta++){ ROM[ta+ta+0xC0001]=RAM[ta]; } if(!load_rom("b31_32.86", RAM, 0x10000)) return; for(ta=0;ta<0x10000;ta++){ ROM[ta+ta+0xE0000]=RAM[ta]; } if(!load_rom("b31_35.96", RAM, 0x10000)) return; for(ta=0;ta<0x10000;ta++){ ROM[ta+ta+0xE0001]=RAM[ta]; } if(!load_rom("b31_31.85", RAM, 0x10000)) return; for(ta=0;ta<0x10000;ta++){ ROM[ta+ta+0x100000]=RAM[ta]; } if(!load_rom("b31_34.95", RAM, 0x10000)) return; for(ta=0;ta<0x10000;ta++){ ROM[ta+ta+0x100001]=RAM[ta]; } /*-----[Sound Setup]-----*/ Z80ROM=RAM+0x80000; if(!load_rom("b31_37.11", Z80ROM, 0x20000)) return; // Z80 SOUND ROM AddTaitoYM2610(0x0345, 0x02B7, 0x20000); /*-----------------------*/ // This one avoids to send an explicit start command to the 2nd 68k (cpua_w) // this is used only at start of the game, so it's easier to just disable it ROM[0x199C]=0x4E; // Fix small 68000 communication problem ROM[0x199D]=0x71; ROM[0x07BA]=0x13; // move.b #$00,$AA0000 ROM[0x07BB]=0xFC; // Speed Hack ROM[0x07BC]=0x00; ROM[0x07BD]=0x00; ROM[0x07BE]=0x00; ROM[0x07BF]=0xAA; ROM[0x07C0]=0x00; ROM[0x07C1]=0x00; ROM[0x07C2]=0x60; ROM[0x07C3]=0xE2; ROM[0xC07A6]=0x13; // move.b #$00,$AA0000 ROM[0xC07A7]=0xFC; // Speed Hack ROM[0xC07A8]=0x00; ROM[0xC07A9]=0x00; ROM[0xC07AA]=0x00; ROM[0xC07AB]=0xAA; ROM[0xC07AC]=0x00; ROM[0xC07AD]=0x00; ROM[0xC07AE]=0x60; ROM[0xC07AF]=0xEE; // WriteWord68k(&ROM[0xc0ad4],0x4e71); // fast start, don't wait for the other memset(RAM+0x00000,0x00,0x80000); GFX_FG0 = RAM+0x64000; RAM_INPUT = RAM+0x3B000; tc0100scn[0].RAM = RAM+0x21000-0x6000; tc0100scn[0].GFX_FG0 = GFX_FG0; init_tc0100scn(0); tc0100scn_0_copy_gfx_fg0(ROM+0x22000, 0x1000); GFX_BG0_SOLID = make_solid_mask_8x8 (GFX_BG0, 0x8000); init_tile_cachex4(); GFX_SPR_SOLID = make_solid_mask_16x16(GFX_SPR, 0x4000); tc0110pcr_init_typeb(RAM+0x38000, 1, 0); tc0110pcr_init_typeb_2(RAM+0x39000, 1, 0); tc0110pcr_init_typeb_3(RAM+0x3A000, 1, 0); set_colour_mapper(&col_map_xbbb_bbgg_gggr_rrrr); InitPaletteMap(RAM+0x38000, 0x100, 0x10, 0x8000); // Init tc0220ioc emulation // ------------------------ tc0220ioc.RAM = RAM_INPUT; tc0220ioc.ctrl = 0; //TC0220_STOPCPU; reset_tc0220ioc(); memset(RAM_INPUT,0x00,0x20); /* * StarScream Stuff follows */ ByteSwap(ROM,0x120000); ByteSwap(RAM,0x50000); AddMemFetch(0x000000, 0x0BFFFF, ROM+0x000000-0x000000); // 68000 ROM AddMemFetch(-1, -1, NULL); AddReadByte(0x000000, 0x0BFFFF, NULL, ROM+0x000000); // 68000 ROM AddReadByte(0x0C0000, 0x0CFFFF, NULL, RAM+0x000000); // MAIN RAM AddReadByte(0x240000, 0x24FFFF, NULL, RAM+0x024000); // COMMON RAM AddReadByte(0x260000, 0x263FFF, NULL, RAM+0x034000); // OBJECT RAM AddReadByte(0x280000, 0x293FFF, NULL, RAM+0x010000); // SCREEN RAM AddReadByte(0x200000, 0x200003, tc0220ioc_rb_port, NULL); // INPUT AddReadByte(0x000000, 0xFFFFFF, DefBadReadByte, NULL); // <Bad Reads> AddReadByte(-1, -1, NULL, NULL); AddReadWord(0x000000, 0x0BFFFF, NULL, ROM+0x000000); // 68000 ROM AddReadWord(0x0C0000, 0x0CFFFF, NULL, RAM+0x000000); // MAIN RAM AddReadWord(0x240000, 0x24FFFF, NULL, RAM+0x024000); // COMMON RAM AddReadWord(0x260000, 0x263FFF, NULL, RAM+0x034000); // OBJECT RAM AddReadWord(0x280000, 0x293FFF, NULL, RAM+0x010000); // SCREEN RAM AddReadWord(0x340000, 0x340007, tc0110pcr_rw, NULL); // COLOR RAM SCREEN A AddReadWord(0x350000, 0x350007, tc0110pcr_rw_2, NULL); // COLOR RAM SCREEN B AddReadWord(0x360000, 0x360007, tc0110pcr_rw_3, NULL); // COLOR RAM SCREEN C AddReadWord(0x200000, 0x200003, tc0220ioc_rw_port, NULL); // INPUT AddReadWord(0x220000, 0x220003, tc0140syt_read_main_68k, NULL); // SOUND COMM AddReadWord(0x000000, 0xFFFFFF, DefBadReadWord, NULL); // <Bad Reads> AddReadWord(-1, -1, NULL, NULL); AddWriteByte(0x0C0000, 0x0CFFFF, NULL, RAM+0x000000); // MAIN RAM AddWriteByte(0x240000, 0x24FFFF, NULL, RAM+0x024000); // COMMON RAM AddWriteByte(0x260000, 0x263FFF, NULL, RAM+0x034000); // OBJECT RAM AddWriteByte(0x280000, 0x293FFF, NULL, RAM+0x010000); // SCREEN RAM AddWriteByte(0x200000, 0x200003, tc0220ioc_wb_port, NULL); // INPUT AddWriteByte(0xAA0000, 0xAA0001, Stop68000, NULL); // Trap Idle 68000 AddWriteByte(0x000000, 0xFFFFFF, DefBadWriteByte, NULL); // <Bad Writes> AddWriteByte(-1, -1, NULL, NULL); AddWriteWord(0x0C0000, 0x0CFFFF, NULL, RAM+0x000000); // MAIN RAM AddWriteWord(0x240000, 0x24FFFF, NULL, RAM+0x024000); // COMMON RAM AddWriteWord(0x260000, 0x263FFF, NULL, RAM+0x034000); // OBJECT RAM AddWriteWord(0x280000, 0x293FFF, NULL, RAM+0x010000); // SCREEN RAM AddWriteWord(0x340000, 0x340007, tc0110pcr_ww, NULL); // COLOR RAM SCREEN A AddWriteWord(0x350000, 0x350007, tc0110pcr_ww_2, NULL); // COLOR RAM SCREEN B AddWriteWord(0x360000, 0x360007, tc0110pcr_ww_3, NULL); // COLOR RAM SCREEN C AddWriteWord(0x200000, 0x200003, tc0220ioc_ww_port, NULL); // INPUT AddWriteWord(0x2A0000, 0x2A000F, NULL, RAM+0x03B100); // SCROLL A AddWriteWord(0x2E0000, 0x2E000F, NULL, RAM+0x03B200); // SCROLL B AddWriteWord(0x320000, 0x32000F, NULL, RAM+0x03B300); // SCROLL C AddWriteWord(0x220000, 0x220003, tc0140syt_write_main_68k, NULL); // SOUND COMM AddWriteWord(0x000000, 0xFFFFFF, DefBadWriteWord, NULL); // <Bad Writes> AddWriteWord(-1, -1, NULL, NULL); AddInitMemory(); // Set Starscream mem pointers... AddMemFetchMC68000B(0x000000, 0x05FFFF, ROM+0x0C0000-0x000000); // 68000 ROM AddMemFetchMC68000B(-1, -1, NULL); AddReadByteMC68000B(0x000000, 0x05FFFF, NULL, ROM+0x0C0000); // 68000 ROM AddReadByteMC68000B(0x080000, 0x08FFFF, NULL, RAM2+0x000000); // SUB LOCAL RAM AddReadByteMC68000B(0x240000, 0x24FFFF, NULL, RAM+0x024000); // COMMON RAM AddReadByteMC68000B(0x260000, 0x263FFF, NULL, RAM+0x034000); // OBJECT RAM AddReadByteMC68000B(0x280000, 0x293FFF, NULL, RAM+0x010000); // SCREEN RAM AddReadByteMC68000B(0x200000, 0x200003, tc0220ioc_rb_port, NULL); // INPUT AddReadByteMC68000B(0x000000, 0xFFFFFF, DefBadReadByte, NULL); // <Bad Reads> AddReadByteMC68000B(-1, -1, NULL, NULL); AddReadWordMC68000B(0x000000, 0x05FFFF, NULL, ROM+0x0C0000); // 68000 ROM AddReadWordMC68000B(0x080000, 0x08FFFF, NULL, RAM2+0x000000); // SUB LOCAL RAM AddReadWordMC68000B(0x240000, 0x24FFFF, NULL, RAM+0x024000); // COMMON RAM AddReadWordMC68000B(0x260000, 0x263FFF, NULL, RAM+0x034000); // OBJECT RAM AddReadWordMC68000B(0x280000, 0x293FFF, NULL, RAM+0x010000); // SCREEN RAM AddReadWordMC68000B(0x340000, 0x340007, tc0110pcr_rw, NULL); // COLOR RAM SCREEN A AddReadWordMC68000B(0x350000, 0x350007, tc0110pcr_rw_2, NULL); // COLOR RAM SCREEN B AddReadWordMC68000B(0x360000, 0x360007, tc0110pcr_rw_3, NULL); // COLOR RAM SCREEN C AddReadWordMC68000B(0x200000, 0x200003, tc0220ioc_rw_port, NULL); // INPUT AddReadWordMC68000B(0x000000, 0xFFFFFF, DefBadReadWord, NULL); // <Bad Reads> AddReadWordMC68000B(-1, -1, NULL, NULL); AddWriteByteMC68000B(0x080000, 0x08FFFF, NULL, RAM2+0x000000); // SUB LOCAL RAM AddWriteByteMC68000B(0x240000, 0x24FFFF, NULL, RAM+0x024000); // COMMON RAM AddWriteByteMC68000B(0x260000, 0x263FFF, NULL, RAM+0x034000); // OBJECT RAM AddWriteByteMC68000B(0x280000, 0x293FFF, NULL, RAM+0x010000); // SCREEN RAM AddWriteByteMC68000B(0x200000, 0x200003, tc0220ioc_wb_port, NULL); // INPUT AddWriteByteMC68000B(0xAA0000, 0xAA0001, Stop68000, NULL); // Trap Idle 68000 AddWriteByteMC68000B(0x000000, 0xFFFFFF, DefBadWriteByte, NULL); // <Bad Writes> AddWriteByteMC68000B(-1, -1, NULL, NULL); AddWriteWordMC68000B(0x080000, 0x08FFFF, NULL, RAM2+0x000000); // SUB LOCAL RAM AddWriteWordMC68000B(0x240000, 0x24FFFF, NULL, RAM+0x024000); // COMMON RAM AddWriteWordMC68000B(0x260000, 0x263FFF, NULL, RAM+0x034000); // OBJECT RAM AddWriteWordMC68000B(0x280000, 0x293FFF, NULL, RAM+0x010000); // SCREEN RAM AddWriteWordMC68000B(0x340000, 0x340007, tc0110pcr_ww, NULL); // COLOR RAM SCREEN A AddWriteWordMC68000B(0x350000, 0x350007, tc0110pcr_ww_2, NULL); // COLOR RAM SCREEN B AddWriteWordMC68000B(0x360000, 0x360007, tc0110pcr_ww_3, NULL); // COLOR RAM SCREEN C AddWriteWordMC68000B(0x200000, 0x200003, tc0220ioc_ww_port, NULL); // INPUT AddWriteWordMC68000B(0x000000, 0xFFFFFF, DefBadWriteWord, NULL); // <Bad Writes> AddWriteWordMC68000B(-1, -1, NULL, NULL); AddInitMemoryMC68000B(); // Set Starscream mem pointers... }
static void load_drius2do(void) { int ta,tb; UINT8 *TMP; if(!(GFX=AllocateMem(0x400000))) return; if(!(TMP=AllocateMem(0x080000))) return; GFX_BG0 = GFX+0x000000; GFX_SPR = GFX+0x200000; tb=0; if(!load_rom("c07-03.12", TMP, 0x80000)) return; // 8x8 BG0 for(ta=0;ta<0x80000;ta+=2){ GFX_BG0[tb+1]=TMP[ta+1]&15; GFX_BG0[tb+0]=TMP[ta+1]>>4; GFX_BG0[tb+3]=TMP[ta+0]&15; GFX_BG0[tb+2]=TMP[ta+0]>>4; tb+=4; } if(!load_rom("c07-04.11", TMP, 0x80000)) return; for(ta=0;ta<0x80000;ta+=2){ GFX_BG0[tb+1]=TMP[ta+1]&15; GFX_BG0[tb+0]=TMP[ta+1]>>4; GFX_BG0[tb+3]=TMP[ta+0]&15; GFX_BG0[tb+2]=TMP[ta+0]>>4; tb+=4; } if(!load_rom("c07-05.24", TMP, 0x40000)) return; // 16x16 OBJ tb=0; for(ta=0;ta<0x40000;ta+=2){ GFX_SPR[tb+0]=TMP[ta+0]&15; GFX_SPR[tb+1]=TMP[ta+0]>>4; GFX_SPR[tb+2]=TMP[ta+1]&15; GFX_SPR[tb+3]=TMP[ta+1]>>4; tb+=16; } if(!load_rom("c07-06.27", TMP, 0x40000)) return; // 16x16 OBJ tb=4; for(ta=0;ta<0x40000;ta+=2){ GFX_SPR[tb+0]=TMP[ta+0]&15; GFX_SPR[tb+1]=TMP[ta+0]>>4; GFX_SPR[tb+2]=TMP[ta+1]&15; GFX_SPR[tb+3]=TMP[ta+1]>>4; tb+=16; } if(!load_rom("c07-07.26", TMP, 0x40000)) return; // 16x16 OBJ tb=8; for(ta=0;ta<0x40000;ta+=2){ GFX_SPR[tb+0]=TMP[ta+0]&15; GFX_SPR[tb+1]=TMP[ta+0]>>4; GFX_SPR[tb+2]=TMP[ta+1]&15; GFX_SPR[tb+3]=TMP[ta+1]>>4; tb+=16; } if(!load_rom("c07-08.25", TMP, 0x40000)) return; // 16x16 OBJ tb=12; for(ta=0;ta<0x40000;ta+=2){ GFX_SPR[tb+0]=TMP[ta+0]&15; GFX_SPR[tb+1]=TMP[ta+0]>>4; GFX_SPR[tb+2]=TMP[ta+1]&15; GFX_SPR[tb+3]=TMP[ta+1]>>4; tb+=16; } FreeMem(TMP); RAMSize=0xA0000+0x20000; if(!(ROM=AllocateMem(0x100000))) return; if(!(RAM=AllocateMem(RAMSize))) return; if(!load_rom("c07_20-1.74", RAM+0x00000, 0x20000)) return; if(!load_rom("c07_21-1.76", RAM+0x20000, 0x20000)) return; for(ta=0;ta<0x40000;ta++){ ROM[ta+ta]=RAM[ta]; } if(!load_rom("c07_19-1.73", RAM+0x00000, 0x20000)) return; if(!load_rom("c07_18-1.71", RAM+0x20000, 0x20000)) return; for(ta=0;ta<0x40000;ta++){ ROM[ta+ta+1]=RAM[ta]; } if(!load_rom("c07-09.75", ROM+0x80000, 0x80000)) return; /*-----[Sound Setup]-----*/ Z80ROM=RAM+0xA0000; if(!load_rom("c07-17.69", Z80ROM, 0x20000)) return; // Z80 SOUND ROM if(!(PCMROM=AllocateMem(0x180000))) return; if(!load_rom("c07-12.107",PCMROM+0x000000,0x80000)) return; // ADPCM A rom if(!load_rom("c07-10.95",PCMROM+0x080000,0x80000)) return; // ADPCM B rom 1/2 if(!load_rom("c07-11.96",PCMROM+0x100000,0x80000)) return; // ADPCM B rom 2/2 YM2610SetBuffers(PCMROM, PCMROM+0x080000, 0x080000, 0x100000); AddTaitoYM2610(0x0247, 0x01C7, 0x20000); /*-----------------------*/ /// Checksum Fix WriteWord68k(&ROM[0x012BE],0x4E71); // nop /// Allow Rom Versions WriteLong68k(&ROM[0x01280],0x4E714E71); // nop // 68000 Speed Hack WriteLong68k(&ROM[0x012A4],0x13FC0000); // move.b #$00,$AA0000 WriteLong68k(&ROM[0x012A8],0x00AA0000); WriteWord68k(&ROM[0x012AC],0x6100-16); // bra.s <loop> memset(RAM+0x00000,0x00,0xA0000); GFX_FG0 = RAM+0x64000; RAM_INPUT = RAM+0x3B000; tc0100scn[0].RAM = RAM+0x21000-0x6000; tc0100scn[0].GFX_FG0 = GFX_FG0; init_tc0100scn(0); GFX_BG0_SOLID = make_solid_mask_8x8 (GFX_BG0, 0x8000); GFX_SPR_SOLID = make_solid_mask_16x16(GFX_SPR, 0x2000); tc0110pcr_init_typeb(RAM+0x38000, 1, 0); tc0110pcr_init_typeb_2(RAM+0x39000, 1, 0); set_colour_mapper(&col_map_xbbb_bbgg_gggr_rrrr); InitPaletteMap(RAM+0x38000, 0x80, 0x10, 0x8000); // Init tc0220ioc emulation // ------------------------ tc0220ioc.RAM = RAM_INPUT; tc0220ioc.ctrl = 0; //TC0220_STOPCPU; reset_tc0220ioc(); memset(RAM_INPUT,0x00,0x20); /* * StarScream Stuff follows */ ByteSwap(ROM,0x80000); ByteSwap(RAM,0x60000); AddMemFetch(0x000000, 0x0FFFFF, ROM+0x000000-0x000000); // 68000 ROM AddMemFetch(-1, -1, NULL); AddReadByte(0x000000, 0x0FFFFF, NULL, ROM+0x000000); // 68000 ROM AddReadByte(0x100000, 0x10FFFF, NULL, RAM+0x000000); // MAIN RAM AddReadByte(0x600000, 0x603FFF, NULL, RAM+0x034000); // OBJECT RAM AddReadByte(0x200000, 0x213FFF, NULL, RAM+0x010000); // SCREEN RAM AddReadByte(0x800000, 0x80001F, tc0220ioc_rb, NULL); // INPUT AddReadByte(0x000000, 0xFFFFFF, DefBadReadByte, NULL); // <Bad Reads> AddReadByte(-1, -1, NULL, NULL); AddReadWord(0x000000, 0x0FFFFF, NULL, ROM+0x000000); // 68000 ROM AddReadWord(0x100000, 0x10FFFF, NULL, RAM+0x000000); // MAIN RAM AddReadWord(0x600000, 0x603FFF, NULL, RAM+0x034000); // OBJECT RAM AddReadWord(0x200000, 0x213FFF, NULL, RAM+0x010000); // SCREEN RAM AddReadWord(0x240000, 0x253FFF, NULL, RAM+0x050000); // SCREEN B AddReadWord(0x400000, 0x400007, tc0110pcr_rw, NULL); // COLOR RAM SCREEN A AddReadWord(0x420000, 0x420007, tc0110pcr_rw_2, NULL); // COLOR RAM SCREEN B AddReadWord(0x800000, 0x80001F, tc0220ioc_rw, NULL); // INPUT AddReadWord(0x830000, 0x830003, tc0140syt_read_main_68k, NULL); // SOUND AddReadWord(0x000000, 0xFFFFFF, DefBadReadWord, NULL); // <Bad Reads> AddReadWord(-1, -1, NULL, NULL); AddWriteByte(0x100000, 0x10FFFF, NULL, RAM+0x000000); // MAIN RAM AddWriteByte(0x600000, 0x603FFF, NULL, RAM+0x034000); // OBJECT RAM AddWriteByte(0x200000, 0x210FFF, NULL, RAM+0x010000); // SCREEN RAM AddWriteByte(0x211000, 0x211FFF, tc0100scn_0_gfx_fg0_wb, NULL); // FG0 GFX RAM AddWriteByte(0x212000, 0x213FFF, NULL, RAM+0x022000); // FG0 RAM AddWriteByte(0x800000, 0x80001F, tc0220ioc_wb, NULL); // INPUT AddWriteByte(0xAA0000, 0xAA0001, Stop68000, NULL); // Trap Idle 68000 AddWriteByte(0x000000, 0xFFFFFF, DefBadWriteByte, NULL); // <Bad Writes> AddWriteByte(-1, -1, NULL, NULL); AddWriteWord(0x100000, 0x10FFFF, NULL, RAM+0x000000); // MAIN RAM AddWriteWord(0x600000, 0x603FFF, NULL, RAM+0x034000); // OBJECT RAM AddWriteWord(0x200000, 0x210FFF, NULL, RAM+0x010000); // SCREEN RAM AddWriteWord(0x211000, 0x211FFF, tc0100scn_0_gfx_fg0_ww, NULL); // FG0 GFX RAM AddWriteWord(0x212000, 0x213FFF, NULL, RAM+0x022000); // FG0 RAM AddWriteWord(0x240000, 0x253FFF, NULL, RAM+0x050000); // SCREEN B AddWriteWord(0x400000, 0x400007, tc0110pcr_ww, NULL); // COLOR RAM SCREEN A AddWriteWord(0x420000, 0x420007, tc0110pcr_ww_2, NULL); // COLOR RAM SCREEN B AddWriteWord(0x800000, 0x80001F, tc0220ioc_ww, NULL); // INPUT AddWriteWord(0x220000, 0x22000F, NULL, RAM+0x03B100); // SCROLL A AddWriteWord(0x260000, 0x26000F, NULL, RAM+0x03B200); // SCROLL B AddWriteWord(0x830000, 0x830003, tc0140syt_write_main_68k, NULL); // SOUND AddWriteWord(0x000000, 0xFFFFFF, DefBadWriteWord, NULL); // <Bad Writes> AddWriteWord(-1, -1, NULL, NULL); AddInitMemory(); // Set Starscream mem pointers... }
static void load_rastan(void) { RAMSize=0x20000+0x10000; if(!(RAM=AllocateMem(RAMSize))) return; /*-----[Sound Setup]-----*/ Z80ROM=RAM+0x20000; if(!(PCMROM=AllocateMem(0x10000))) return; if(!load_rom("ic49_19.bin", Z80ROM, 0x10000)) return; // Z80 SOUND ROM if(!load_rom("ic76_20.bin", PCMROM, 0x10000)) return; AddTaitoYM2151(0x01C0, 0x01AB, 0x10000, (UINT8 *) Rastan_M5205_W, NULL); msm5205_interface.rom[0] = PCMROM; msm5205_interface.romsize[0] = 0x10000; msm5205_interface.updatemode = MSM5205_MONO; /*-----------------------*/ memset(RAM+0x00000,0x00,0x20000); RAM[0x1A007]=0x9F; // !! Vital !! RAM_VIDEO = RAM+0x08000; RAM_SCROLL = RAM+0x1B080; RAM_OBJECT = RAM+0x18000; set_colour_mapper(&col_map_xbbb_bbgg_gggr_rrrr); InitPaletteMap(RAM+0x4000, 0x100, 0x10, 0x8000); // 68000 Speed Hack // ---------------- if(is_current_game("rastan")) { WriteLong68k(&ROM[0x00146],0x4E714E71); // nop WriteLong68k(&ROM[0x3B08C],0x13FC0000); // move.b #$00,$AA0000 WriteLong68k(&ROM[0x3B090],0x00AA0000); // WriteWord68k(&ROM[0x3B094],0x4E71); // nop } if(is_current_game("rastsaga")) { WriteLong68k(&ROM[0x3B088],0x13FC0000); // move.b #$00,$AA0000 WriteLong68k(&ROM[0x3B08C],0x00AA0000); // WriteWord68k(&ROM[0x3B090],0x4E71); // nop } // Init tc0100scn emulation // ------------------------ tc0100scn[0].layer[0].RAM =RAM_VIDEO+0x0000; tc0100scn[0].layer[0].SCR =RAM_SCROLL+0; tc0100scn[0].layer[0].type =0; tc0100scn[0].layer[0].bmp_x =32; tc0100scn[0].layer[0].bmp_y =32; tc0100scn[0].layer[0].bmp_w =320; tc0100scn[0].layer[0].bmp_h =240; // Mapper disabled tc0100scn[0].layer[0].tile_mask=0x3FFF; tc0100scn[0].layer[0].scr_x =16; tc0100scn[0].layer[0].scr_y =8; tc0100scn[0].layer[1].RAM =RAM_VIDEO+0x8000; tc0100scn[0].layer[1].SCR =RAM_SCROLL+2; tc0100scn[0].layer[1].type =0; tc0100scn[0].layer[1].bmp_x =32; tc0100scn[0].layer[1].bmp_y =32; tc0100scn[0].layer[1].bmp_w =320; tc0100scn[0].layer[1].bmp_h =240; // Mapper disabled tc0100scn[0].layer[1].tile_mask=0x3FFF; tc0100scn[0].layer[1].scr_x =16; tc0100scn[0].layer[1].scr_y =8; tc0100scn[0].RAM = RAM_VIDEO; init_tc0100scn(0); // Init tc0002obj emulation // ------------------------ tc0002obj.RAM = RAM_OBJECT; tc0002obj.GFX = NULL; tc0002obj.bmp_x = 32; tc0002obj.bmp_y = 32; tc0002obj.bmp_w = 320; tc0002obj.bmp_h = 240; // Mapper disabled tc0002obj.tile_mask = 0x0FFF; tc0002obj.ofs_x = 0; tc0002obj.ofs_y = -8; /* * StarScream Stuff follows */ ByteSwap(ROM,0x60000); ByteSwap(RAM,0x1B100); AddMemFetch(0x000000, 0x05FFFF, ROM+0x000000-0x000000); // 68000 ROM AddMemFetch(-1, -1, NULL); AddReadByte(0x000000, 0x05FFFF, NULL, ROM+0x000000); // 68000 ROM AddReadByte(0x10C000, 0x10FFFF, NULL, RAM+0x000000); // 68000 RAM AddReadByte(0xC00000, 0xC0FFFF, NULL, RAM_VIDEO); AddReadByte(0xD00000, 0xD01FFF, NULL, RAM+0x018000); AddReadByte(0x200000, 0x203FFF, NULL, RAM+0x004000); AddReadByte(0x390000, 0x390FFF, NULL, RAM+0x01A000); // INPUT AddReadByte(0x350000, 0x35000F, NULL, RAM+0x01B010); AddReadByte(0x380000, 0x380001, NULL, RAM+0x01B00A); AddReadByte(0x3C0000, 0x3C0001, NULL, RAM+0x01B020); AddReadByte(0x3E0000, 0x3E0003, tc0140syt_read_main_68k, NULL); AddReadByte(-1, -1, NULL, NULL); AddReadWord(0x000000, 0x05FFFF, NULL, ROM+0x000000); // 68000 ROM AddReadWord(0x10C000, 0x10FFFF, NULL, RAM+0x000000); // 68000 RAM AddReadWord(0xC00000, 0xC0FFFF, NULL, RAM_VIDEO); AddReadWord(0xD00000, 0xD01FFF, NULL, RAM+0x018000); AddReadWord(0x200000, 0x203FFF, NULL, RAM+0x004000); AddReadWord(0x390000, 0x390FFF, NULL, RAM+0x01A000); // INPUT AddReadWord(0x350000, 0x35000F, NULL, RAM+0x01B010); AddReadWord(0x380000, 0x380001, NULL, RAM+0x01B00A); AddReadWord(0x3C0000, 0x3C0001, NULL, RAM+0x01B020); AddReadWord(0x3E0000, 0x3E0003, NULL, RAM+0x01B00C); AddReadWord(-1, -1, NULL, NULL); AddWriteByte(0x10C000, 0x10FFFF, NULL, RAM+0x000000); // 68000 RAM AddWriteByte(0xC00000, 0xC0FFFF, NULL, RAM_VIDEO); AddWriteByte(0xD00000, 0xD01FFF, NULL, RAM+0x018000); AddWriteByte(0x200000, 0x203FFF, NULL, RAM+0x004000); AddWriteByte(0xC20000, 0xC20003, NULL, RAM_SCROLL+6); // SCROLL Y AddWriteByte(0xC40000, 0xC40003, NULL, RAM_SCROLL+0); // SCROLL X AddWriteByte(0xC50000, 0xC50001, NULL, RAM_SCROLL+14); // CTRL AddWriteByte(0x350000, 0x35000F, NULL, RAM+0x01B010); AddWriteByte(0x380000, 0x380001, NULL, RAM+0x01B00A); AddWriteByte(0x390000, 0x390FFF, NULL, RAM+0x01A000); // INPUT AddWriteByte(0x3C0000, 0x3C0001, NULL, RAM+0x01B020); AddWriteByte(0x3E0000, 0x3E0003, tc0140syt_write_main_68k, NULL); AddWriteByte(0xAA0000, 0xAA0001, Stop68000, NULL); // Trap Idle 68000 AddWriteByte(-1, -1, NULL, NULL); AddWriteWord(0x10C000, 0x10FFFF, NULL, RAM+0x000000); // 68000 RAM AddWriteWord(0xC00000, 0xC0FFFF, NULL, RAM_VIDEO); AddWriteWord(0xD00000, 0xD01FFF, NULL, RAM+0x018000); AddWriteWord(0x200000, 0x203FFF, NULL, RAM+0x004000); AddWriteWord(0xC20000, 0xC20003, NULL, RAM_SCROLL+6); // SCROLL Y AddWriteWord(0xC40000, 0xC40003, NULL, RAM_SCROLL+0); // SCROLL X AddWriteWord(0xC50000, 0xC50001, NULL, RAM_SCROLL+14); // CTRL AddWriteWord(0x350000, 0x35000F, NULL, RAM+0x01B010); AddWriteWord(0x380000, 0x380001, NULL, RAM+0x01B00A); AddWriteWord(0x390000, 0x390FFF, NULL, RAM+0x01A000); // INPUT AddWriteWord(0x3C0000, 0x3C0001, NULL, RAM+0x01B020); AddWriteWord(0x3E0000, 0x3E0003, NULL, RAM+0x01B00C); AddWriteWord(-1, -1, NULL, NULL); AddInitMemory(); // Set Starscream mem pointers... }
/* Intialize emulator with given ROM file, and * specify whether or not debug mode is active * (0 for OFF, any other value is on) * * returns 1 if successfully initialized, 0 * otherwise */ int init_emu(const char *file_path, int debugger, int dmg_mode, ClientOrServer cs) { uint8_t rom_header[0x50]; //Start logger set_log_level(LOG_INFO); log_message(LOG_INFO, "About to open file %s\n", file_path); FILE *file; if (!(file = PB_FOPEN(file_path,"rb"))) { log_message(LOG_ERROR, "Error opening file %s\n", file_path); return 0; } if ((PB_FSEEK(file, 0x100, SEEK_SET) != 0) || (PB_FREAD(rom_header, 1, sizeof(rom_header), file) != sizeof(rom_header))) { log_message(LOG_ERROR, "Error reading ROM header info\n"); fclose(file); return 0; }; PB_FCLOSE(file); log_message(LOG_INFO, "ROM Header loaded %s\n", file_path); if (!load_rom(file_path, rom_header, dmg_mode)) { log_message(LOG_ERROR, "failed to initialize GB memory\n"); return 0; } if (!init_gfx()) { log_message(LOG_ERROR, "Failed to initialize graphics\n"); return 0; } if (!setup_serial_io(cs, 5000)) { log_message(LOG_INFO, "No client or server created\n"); } init_joypad(); init_apu(); // Initialize sound reset_cpu(); if (debugger) { debug = 1; } cgb_features = is_colour_compatible() || is_colour_only(); //Log ROM info char name_buf[100]; int i; for(i = ROM_NAME_START; i <= ROM_NAME_END; i++) { name_buf[i - ROM_NAME_START] = get_mem(i); } name_buf[i - ROM_NAME_START] = '\0'; log_message(LOG_INFO,"Game Title: %s\n", name_buf); log_message(LOG_INFO,"Licensee: %s\n", get_licensee()); log_message(LOG_INFO,"Destination: %s\n", get_destination_code()); log_message(LOG_INFO,"ROM size: %dKB\n",get_rom_size()); log_message(LOG_INFO,"RAM save size: %dKB\n",get_ram_save_size()); const char *c_type = get_cartridge_type(); log_message(LOG_INFO,"Cartridge Type: %s\n",c_type != NULL ? c_type : "Unknown"); log_message(LOG_INFO, "Has Gameboy Color features: %s\n", is_colour_compatible() || is_colour_only() ? "Yes":"No"); log_message(LOG_INFO,"Gameboy Color Only Game:%s\n", is_colour_only() ? "Yes":"No"); log_message(LOG_INFO,"Super Gameboy Features:%s\n", has_sgb_features() ? "Yes":"No"); return 1; }