/*************************************************************************** Run the emulation. Start the various subsystems and the CPU emulation. Returns non zero in case of error. ***************************************************************************/ int run_machine(void) { int res = 1; if (vh_open() == 0) { tilemap_init(); sprite_init(); gfxobj_init(); if (drv->vh_start == 0 || (*drv->vh_start)() == 0) /* start the video hardware */ { if (sound_start() == 0) /* start the audio hardware */ { int region; real_scrbitmap = artwork_overlay ? overlay_real_scrbitmap : Machine->scrbitmap; /* free memory regions allocated with REGIONFLAG_DISPOSE (typically gfx roms) */ for (region = 0; region < MAX_MEMORY_REGIONS; region++) { if (Machine->memory_region_type[region] & REGIONFLAG_DISPOSE) { int i; /* invalidate contents to avoid subtle bugs */ for (i = 0;i < memory_region_length(region);i++) memory_region(region)[i] = rand(); free(Machine->memory_region[region]); Machine->memory_region[region] = 0; } } if (settingsloaded == 0) { /* if there is no saved config, it must be first time we run this game, */ /* so show the disclaimer. */ //sq if (showcopyright(real_scrbitmap)) goto userquit; } //sq if (showgamewarnings(real_scrbitmap) == 0) /* show info about incorrect behaviour (wrong colors etc.) */ { /* shut down the leds (work around Allegro hanging bug in the DOS port) */ osd_led_w(0,1); osd_led_w(1,1); osd_led_w(2,1); osd_led_w(3,1); osd_led_w(0,0); osd_led_w(1,0); osd_led_w(2,0); osd_led_w(3,0); init_user_interface(); /* disable cheat if no roms */ if (!gamedrv->rom) options.cheat = 0; if (options.cheat) InitCheat(); if (drv->nvram_handler) { void *f; f = osd_fopen(Machine->gamedrv->name,0,OSD_FILETYPE_NVRAM,0); (*drv->nvram_handler)(f,0); if (f) osd_fclose(f); } cpu_run(); /* run the emulation! */ if (drv->nvram_handler) { void *f; if ((f = osd_fopen(Machine->gamedrv->name,0,OSD_FILETYPE_NVRAM,1)) != 0) { (*drv->nvram_handler)(f,1); osd_fclose(f); } } if (options.cheat) StopCheat(); /* save input ports settings */ save_input_port_settings(); } userquit: /* the following MUST be done after hiscore_save() otherwise */ /* some 68000 games will not work */ sound_stop(); if (drv->vh_stop) (*drv->vh_stop)(); overlay_free(); backdrop_free(); res = 0; } else if (!bailing) { bailing = 1; printf("Unable to start audio emulation\n"); } } else if (!bailing) { bailing = 1; printf("Unable to start video emulation\n"); } gfxobj_close(); sprite_close(); tilemap_close(); vh_close(); } else if (!bailing) { bailing = 1; printf("Unable to start video emulation\n"); } return res; }
/*************************************************************************** Run the emulation. Start the various subsystems and the CPU emulation. Returns non zero in case of error. ***************************************************************************/ int run_machine(const char *gamename) { int res = 1; if (vh_open() == 0) { if (*drv->vh_start == 0 || (*drv->vh_start)() == 0) /* start the video hardware */ { if (*drv->sh_start == 0 || (*drv->sh_start)() == 0) /* start the audio hardware */ { FILE *f; char name[100]; int i,incount, keycount; incount = 0; while (gamedrv->input_ports[incount].default_value != -1) incount++; /* read dipswitch settings from disk */ sprintf(name,"%s/%s.dsw",gamename,gamename); if ((f = fopen(name,"rb")) != 0) { /* use name as temporary buffer */ if (fread(name,1,incount,f) == incount) { for (i = 0;i < incount;i++) gamedrv->input_ports[i].default_value = ((unsigned char)name[i]); } fclose(f); } keycount = 0; while (gamedrv->keysettings[keycount].num != -1) keycount++; /* read dipswitch settings from disk */ sprintf(name,"%s/%s.key",gamename,gamename); if ((f = fopen(name,"rb")) != 0) { /* use name as temporary buffer */ if (fread(name,1,keycount,f) == keycount) { for (i = 0;i < keycount;i++) gamedrv->input_ports[ gamedrv->keysettings[i].num ].keyboard[ gamedrv->keysettings[i].mask ] = ((unsigned char)name[i]); } fclose(f); } /* we have to load the hi scores, but this will be done while */ /* the game is running */ hiscoreloaded = 0; sprintf(hiscorename,"%s/%s.hi",gamename,gamename); cpu_run(); /* run the emulation! */ if (*drv->sh_stop) (*drv->sh_stop)(); if (*drv->vh_stop) (*drv->vh_stop)(); /* write hi scores to disk */ if (hiscoreloaded != 0 && *gamedrv->hiscore_save) (*gamedrv->hiscore_save)(hiscorename); /* write dipswitch settings to disk */ sprintf(name,"%s/%s.dsw",gamename,gamename); if ((f = fopen(name,"wb")) != 0) { /* use name as temporary buffer */ for (i = 0;i < incount;i++) name[i] = gamedrv->input_ports[i].default_value; fwrite(name,1,incount,f); fclose(f); } /* write key settings to disk */ sprintf(name,"%s/%s.key",gamename,gamename); if ((f = fopen(name,"wb")) != 0) { /* use name as temporary buffer */ for (i = 0;i < keycount;i++) name[i] = gamedrv->input_ports[ gamedrv->keysettings[i].num ].keyboard[ gamedrv->keysettings[i].mask ]; fwrite(name,1,keycount,f); fclose(f); } res = 0; } else printf("Unable to start audio emulation\n"); } else printf("Unable to start video emulation\n"); vh_close(); } else printf("Unable to initialize display\n"); return res; }
static int vh_open(void) { int i; int width,height; for (i = 0;i < MAX_GFX_ELEMENTS;i++) Machine->gfx[i] = 0; Machine->uifont = 0; if (palette_start() != 0) { vh_close(); return 1; } /* convert the gfx ROMs into character sets. This is done BEFORE calling the driver's */ /* convert_color_prom() routine (in palette_init()) because it might need to check the */ /* Machine->gfx[] data */ if (drv->gfxdecodeinfo) { for (i = 0;i < MAX_GFX_ELEMENTS && drv->gfxdecodeinfo[i].memory_region != -1;i++) { int reglen = 8*memory_region_length(drv->gfxdecodeinfo[i].memory_region); struct GfxLayout glcopy; int j; memcpy(&glcopy,drv->gfxdecodeinfo[i].gfxlayout,sizeof(glcopy)); if (IS_FRAC(glcopy.total)) glcopy.total = reglen / glcopy.charincrement * FRAC_NUM(glcopy.total) / FRAC_DEN(glcopy.total); for (j = 0;j < MAX_GFX_PLANES;j++) { if (IS_FRAC(glcopy.planeoffset[j])) { glcopy.planeoffset[j] = FRAC_OFFSET(glcopy.planeoffset[j]) + reglen * FRAC_NUM(glcopy.planeoffset[j]) / FRAC_DEN(glcopy.planeoffset[j]); } } for (j = 0;j < MAX_GFX_SIZE;j++) { if (IS_FRAC(glcopy.xoffset[j])) { glcopy.xoffset[j] = FRAC_OFFSET(glcopy.xoffset[j]) + reglen * FRAC_NUM(glcopy.xoffset[j]) / FRAC_DEN(glcopy.xoffset[j]); } if (IS_FRAC(glcopy.yoffset[j])) { glcopy.yoffset[j] = FRAC_OFFSET(glcopy.yoffset[j]) + reglen * FRAC_NUM(glcopy.yoffset[j]) / FRAC_DEN(glcopy.yoffset[j]); } } if ((Machine->gfx[i] = decodegfx(memory_region(drv->gfxdecodeinfo[i].memory_region) + drv->gfxdecodeinfo[i].start, &glcopy)) == 0) { vh_close(); bailing = 1; printf("Out of memory decoding gfx\n"); return 1; } if (Machine->remapped_colortable) Machine->gfx[i]->colortable = &Machine->remapped_colortable[drv->gfxdecodeinfo[i].color_codes_start]; Machine->gfx[i]->total_colors = drv->gfxdecodeinfo[i].total_color_codes; } } width = drv->screen_width; height = drv->screen_height; if (Machine->drv->video_attributes & VIDEO_TYPE_VECTOR) scale_vectorgames(options.vector_width,options.vector_height,&width,&height); Machine->scrbitmap = bitmap_alloc_depth(width,height,Machine->color_depth); if (!Machine->scrbitmap) { vh_close(); return 1; } if (!(Machine->drv->video_attributes & VIDEO_TYPE_VECTOR)) { width = drv->default_visible_area.max_x - drv->default_visible_area.min_x + 1; height = drv->default_visible_area.max_y - drv->default_visible_area.min_y + 1; } if (Machine->orientation & ORIENTATION_SWAP_XY) { int temp; temp = width; width = height; height = temp; } /* create the display bitmap, and allocate the palette */ if (osd_create_display(width,height,Machine->color_depth, drv->frames_per_second,drv->video_attributes,Machine->orientation)) { vh_close(); return 1; } set_visible_area( drv->default_visible_area.min_x, drv->default_visible_area.max_x, drv->default_visible_area.min_y, drv->default_visible_area.max_y); /* create spriteram buffers if necessary */ if (drv->video_attributes & VIDEO_BUFFERS_SPRITERAM) { if (spriteram_size!=0) { buffered_spriteram= (unsigned char *) malloc(spriteram_size); if (!buffered_spriteram) { vh_close(); return 1; } if (spriteram_2_size!=0) buffered_spriteram_2 = (unsigned char *) malloc(spriteram_2_size); if (spriteram_2_size && !buffered_spriteram_2) { vh_close(); return 1; } } else { logerror("vh_open(): Video buffers spriteram but spriteram_size is 0\n"); buffered_spriteram=NULL; buffered_spriteram_2=NULL; } } /* build our private user interface font */ /* This must be done AFTER osd_create_display() so the function knows the */ /* resolution we are running at and can pick a different font depending on it. */ /* It must be done BEFORE palette_init() because that will also initialize */ /* (through osd_allocate_colors()) the uifont colortable. */ if ((Machine->uifont = builduifont()) == 0) { vh_close(); return 1; } /* initialize the palette - must be done after osd_create_display() */ if (palette_init()) { vh_close(); return 1; } return 0; }
int vh_open(void) { int i; unsigned char pens[MAX_COLORS]; const unsigned char *palette,*colortable; unsigned char convpalette[3 * MAX_COLORS]; unsigned char convtable[MAX_COLOR_TUPLE*MAX_COLOR_CODES]; struct DisplayText dt[2]; if ((Machine->scrbitmap = osd_create_display(drv->screen_width,drv->screen_height)) == 0) return 1; if (drv->vh_convert_color_prom) { (*drv->vh_convert_color_prom)(convpalette,convtable,gamedrv->color_prom); palette = convpalette; colortable = convtable; } else { palette = gamedrv->palette; colortable = gamedrv->colortable; } for (i = 0;i < drv->total_colors;i++) pens[i] = osd_obtain_pen(palette[3*i],palette[3*i+1],palette[3*i+2]); Machine->background_pen = pens[0]; for (i = 0;i < drv->color_table_len;i++) remappedtable[i] = pens[colortable[i]]; for (i = 0;i < MAX_GFX_ELEMENTS;i++) Machine->gfx[i] = 0; for (i = 0;i < MAX_GFX_ELEMENTS && drv->gfxdecodeinfo[i].memory_region != -1;i++) { if ((Machine->gfx[i] = decodegfx(Machine->memory_region[drv->gfxdecodeinfo[i].memory_region] + drv->gfxdecodeinfo[i].start, drv->gfxdecodeinfo[i].gfxlayout)) == 0) { vh_close(); return 1; } Machine->gfx[i]->colortable = &remappedtable[drv->gfxdecodeinfo[i].color_codes_start]; Machine->gfx[i]->total_colors = drv->gfxdecodeinfo[i].total_color_codes; } /* free the graphics ROMs, they are no longer needed */ free(Machine->memory_region[1]); Machine->memory_region[1] = 0; dt[0].text = "PLEASE DO NOT DISTRIBUTE THE SOURCE CODE AND OR THE EXECUTABLE " "APPLICATION WITH ANY ROM IMAGES\n" "DOING AS SUCH WILL HARM ANY FURTHER DEVELOPMENT OF MAME AND COULD " "RESULT IN LEGAL ACTION BEING TAKEN BY THE LAWFUL COPYRIGHT HOLDERS " "OF ANY ROM IMAGES\n\n" "IF YOU DO NOT AGREE WITH THESE CONDITIONS THEN PLEASE PRESS ESC NOW"; dt[0].color = gamedrv->paused_color; dt[0].x = 0; dt[0].y = 0; dt[1].text = 0; displaytext(dt,0); i = osd_read_key(); while (osd_key_pressed(i)); /* wait for key release */ if (i == OSD_KEY_ESC) return 1; clearbitmap(Machine->scrbitmap); /* initialize the bitmap to the correct background color */ osd_update_display(); return 0; }