int wow_interrupt(void) { int res,i,next; if (!osd_skip_this_frame()) wow_update_line(Machine->scrbitmap,CurrentScan); next = (CurrentScan + 1) % MAX_INT_PER_FRAME; for (i = 0;i < 8;i++) colors[next][i] = colors[CurrentScan][i]; for (i = 0;i < 4;i++) sparkle[next][i] = sparkle[CurrentScan][i]; colorsplit[next] = colorsplit[CurrentScan]; CurrentScan = next; /* Scanline interrupt enabled ? */ res = ignore_interrupt(); if ((InterruptFlag & 0x08) && (CurrentScan == NextScanInt)) res = interrupt(); return res; }
void updatescreen(void) { /* update sound */ sound_frame_update(); /* if we're not skipping this frame, draw the screen */ if (!osd_skip_this_frame()) { profiler_mark(PROFILER_VIDEO); draw_screen(); profiler_mark(PROFILER_END); } /* the user interface must be called between vh_update() and osd_update_video_and_audio(), */ /* to allow it to overlay things on the game display. We must call it even */ /* if the frame is skipped, to keep a consistent timing. */ ui_update_and_render(artwork_get_ui_bitmap()); /* update our movie recording state */ if (!mame_is_paused()) record_movie_frame(scrbitmap[0]); /* blit to the screen */ update_video_and_audio(); /* call the end-of-frame callback */ if (Machine->drv->video_eof && !mame_is_paused()) { profiler_mark(PROFILER_VIDEO); (*Machine->drv->video_eof)(); profiler_mark(PROFILER_END); } }
int updatescreen(void) { /* update sound */ sound_update(); if (osd_skip_this_frame() == 0) { profiler_mark(PROFILER_VIDEO); if (need_to_clear_bitmap) { osd_clearbitmap(real_scrbitmap); need_to_clear_bitmap = 0; } draw_screen(bitmap_dirty); /* update screen */ bitmap_dirty = 0; profiler_mark(PROFILER_END); } /* the user interface must be called between vh_update() and osd_update_video_and_audio(), */ /* to allow it to overlay things on the game display. We must call it even */ /* if the frame is skipped, to keep a consistent timing. */ if (handle_user_interface(real_scrbitmap)) /* quit if the user asked to */ return 1; update_video_and_audio(); if (drv->vh_eof_callback) (*drv->vh_eof_callback)(); return 0; }
static INTERRUPT_GEN( m107_raster_interrupt ) { static int last_line=0; int line = 256 - cpu_getiloops(); if (keyboard_pressed_memory(KEYCODE_F1)) { raster_enable ^= 1; if (raster_enable) usrintf_showmessage("Raster IRQ enabled"); else usrintf_showmessage("Raster IRQ disabled"); } /* Raster interrupt */ if (raster_enable && line==m107_raster_irq_position) { if (osd_skip_this_frame()==0) m107_vh_raster_partial_refresh(Machine->scrbitmap,last_line,line); last_line=line+1; cpu_set_irq_line_and_vector(0, 0, HOLD_LINE, m107_IRQ_2); } /* Kludge to get Fire Barrel running */ else if (line==118) { cpu_set_irq_line_and_vector(0, 0, HOLD_LINE, m107_IRQ_3); } /* Redraw screen, then set vblank and trigger the VBL interrupt */ else if (line==248) { if (osd_skip_this_frame()==0) m107_vh_raster_partial_refresh(Machine->scrbitmap,last_line,248); last_line=0; m107_vblank=1; cpu_set_irq_line_and_vector(0, 0, HOLD_LINE, m107_IRQ_0); } /* End of vblank */ else if (line==255) m107_vblank=0; }
/* DISPCTL EQU $FD92 ; set to $D by INITMIKEY ; B7..B4 0 ; B3 1 EQU color ; B2 1 EQU 4 bit mode ; B1 1 EQU flip screen ; B0 1 EQU video DMA enabled */ void lynx_draw_lines(int newline) { static int height=-1, width=-1; int h,w; int x, yend; UINT16 j; // clipping needed! UINT8 byte; UINT16 *line; if (osd_skip_this_frame()) newline=-1; if (newline==-1) yend = 102; else yend = newline; if (yend > 102) yend=102; if (yend==lynx_line_y) { if (newline==-1) lynx_line_y=0; return; } j=(mikey.data[0x94]|(mikey.data[0x95]<<8))+lynx_line_y*160/2; if (mikey.data[0x92]&2) j-=160*102/2-1; if (lynx_rotate&3) { /* rotation */ h=160; w=102; if ( ((lynx_rotate==1)&&(mikey.data[0x92]&2)) ||( (lynx_rotate==2)&&!(mikey.data[0x92]&2)) ) { for (;lynx_line_y<yend;lynx_line_y++) { line = (UINT16 *) tmpbitmap->line[lynx_line_y]; for (x=160-2;x>=0;j++,x-=2) { byte = lynx_read_vram(j); line[x + 1] = lynx_palette[(byte >> 4) & 0x0f]; line[x + 0] = lynx_palette[(byte >> 0) & 0x0f]; } } } else { for (;lynx_line_y<yend;lynx_line_y++)
static void interrupt_common(void) { int i,next; if (!osd_skip_this_frame()) wow_update_line(Machine->scrbitmap,CurrentScan); next = (CurrentScan + 1) % MAX_INT_PER_FRAME; for (i = 0;i < 8;i++) colors[next][i] = colors[CurrentScan][i]; for (i = 0;i < 4;i++) sparkle[next][i] = sparkle[CurrentScan][i]; colorsplit[next] = colorsplit[CurrentScan]; CurrentScan = next; }
void force_partial_update(int scanline) { rectangle clip = Machine->visible_area; /* if skipping this frame, bail */ if (osd_skip_this_frame()) return; /* skip if less than the lowest so far */ if (scanline < last_partial_scanline) return; /* if there's a dirty bitmap and we didn't do any partial updates yet, handle it now */ if (full_refresh_pending && last_partial_scanline == 0) { fillbitmap(scrbitmap[0], get_black_pen(), NULL); full_refresh_pending = 0; } /* set the start/end scanlines */ if (last_partial_scanline > clip.min_y) clip.min_y = last_partial_scanline; if (scanline < clip.max_y) clip.max_y = scanline; /* render if necessary */ if (clip.min_y <= clip.max_y) { profiler_mark(PROFILER_VIDEO); (*Machine->drv->video_update)(0, scrbitmap[0], &clip); performance.partial_updates_this_frame++; profiler_mark(PROFILER_END); } /* remember where we left off */ last_partial_scanline = scanline + 1; }
int skip_this_frame(void) { return osd_skip_this_frame(); }
void update_video_and_audio(void) { int skipped_it = osd_skip_this_frame(); #if defined(MAME_DEBUG) && !defined(NEW_DEBUGGER) debug_trace_delay = 0; #endif /* fill in our portion of the display */ current_display.changed_flags = 0; /* set the main game bitmap */ current_display.game_bitmap = scrbitmap[0]; current_display.game_bitmap_update = Machine->absolute_visible_area; if (!skipped_it) current_display.changed_flags |= GAME_BITMAP_CHANGED; /* set the visible area */ current_display.game_visible_area = Machine->absolute_visible_area; if (visible_area_changed) current_display.changed_flags |= GAME_VISIBLE_AREA_CHANGED; /* set the refresh rate */ current_display.game_refresh_rate = Machine->refresh_rate; if (refresh_rate_changed) current_display.changed_flags |= GAME_REFRESH_RATE_CHANGED; /* set the vector dirty list */ if (Machine->drv->video_attributes & VIDEO_TYPE_VECTOR) if (!full_refresh_pending && !ui_is_dirty() && !skipped_it) { current_display.vector_dirty_pixels = vector_dirty_list; current_display.changed_flags |= VECTOR_PIXELS_CHANGED; } #if defined(MAME_DEBUG) && !defined(NEW_DEBUGGER) /* set the debugger bitmap */ current_display.debug_bitmap = Machine->debug_bitmap; if (debugger_bitmap_changed) current_display.changed_flags |= DEBUG_BITMAP_CHANGED; debugger_bitmap_changed = 0; /* adjust the debugger focus */ if (debugger_focus != current_display.debug_focus) { current_display.debug_focus = debugger_focus; current_display.changed_flags |= DEBUG_FOCUS_CHANGED; } #endif /* set the LED status */ if (leds_status != current_display.led_state) { current_display.led_state = leds_status; current_display.changed_flags |= LED_STATE_CHANGED; } /* update with data from other parts of the system */ palette_update_display(¤t_display); /* render */ artwork_update_video_and_audio(¤t_display); /* update FPS */ recompute_fps(skipped_it); /* reset dirty flags */ visible_area_changed = 0; refresh_rate_changed = 0; }
/* Update the display. */ void osd_update_video_and_audio(struct osd_bitmap *bitmap) { static const int waittable[FRAMESKIP_LEVELS][FRAMESKIP_LEVELS] = { { 1,1,1,1,1,1,1,1,1,1,1,1 }, { 2,1,1,1,1,1,1,1,1,1,1,0 }, { 2,1,1,1,1,0,2,1,1,1,1,0 }, { 2,1,1,0,2,1,1,0,2,1,1,0 }, { 2,1,0,2,1,0,2,1,0,2,1,0 }, { 2,0,2,1,0,2,0,2,1,0,2,0 }, { 2,0,2,0,2,0,2,0,2,0,2,0 }, { 2,0,2,0,0,3,0,2,0,0,3,0 }, { 3,0,0,3,0,0,3,0,0,3,0,0 }, { 4,0,0,0,4,0,0,0,4,0,0,0 }, { 6,0,0,0,0,0,6,0,0,0,0,0 }, {12,0,0,0,0,0,0,0,0,0,0,0 } }; int i; static int showfps,showfpstemp; TICKER curr; static TICKER prev_measure=0,this_frame_base,prev; static int speed = 100; static int vups,vfcount; int have_to_clear_bitmap = 0; if (prev_measure==0) { /* first time through, initialize timer */ prev_measure = ticker() - FRAMESKIP_LEVELS * TICKS_PER_SEC/video_fps; } if (frameskip_counter == 0) this_frame_base = prev_measure + FRAMESKIP_LEVELS * TICKS_PER_SEC/video_fps; /* update audio */ msdos_update_audio(); if (osd_skip_this_frame() == 0) { if (showfpstemp) { showfpstemp--; if (showfps == 0 && showfpstemp == 0) { have_to_clear_bitmap = 1; } } if (input_ui_pressed(IPT_UI_SHOW_FPS)) { if (showfpstemp) { showfpstemp = 0; have_to_clear_bitmap = 1; } else { showfps ^= 1; if (showfps == 0) { have_to_clear_bitmap = 1; } } } /* now wait until it's time to update the screen */ if (throttle) { profiler_mark(PROFILER_IDLE); if (video_sync) { static TICKER last; do { vsync(); curr = ticker(); } while (TICKS_PER_SEC / (curr - last) > video_fps * 11 /10); last = curr; } else { TICKER target; /* wait for video sync but use normal throttling */ if (wait_vsync) vsync(); curr = ticker(); target = this_frame_base + frameskip_counter * TICKS_PER_SEC/video_fps; if ((curr < target) && (target-curr<TICKS_PER_SEC)) { do { #ifdef WIZ spend_cycles(1024); // WIZ #endif curr = ticker(); } while ((curr < target) && (target-curr<TICKS_PER_SEC)); } } profiler_mark(PROFILER_END); } else curr = ticker(); if (frameskip_counter == 0) { int divdr; divdr = video_fps * (curr - prev_measure) / (100 * FRAMESKIP_LEVELS); if (divdr==0) divdr=1; speed = (TICKS_PER_SEC + divdr/2) / divdr; prev_measure = curr; } prev = curr; vfcount += waittable[frameskip][frameskip_counter]; if (vfcount >= video_fps) { extern int vector_updates; /* avgdvg_go_w()'s per Mame frame, should be 1 */ vfcount = 0; vups = vector_updates; vector_updates = 0; } if (showfps || showfpstemp) { int fps; char buf[30]; int divdr; divdr = 100 * FRAMESKIP_LEVELS; fps = (video_fps * (FRAMESKIP_LEVELS - frameskip) * speed + (divdr / 2)) / divdr; sprintf(buf,"%s%2d%4d%%%4d/%d fps",autoframeskip?"auto":"fskp",frameskip,speed,fps,(int)(video_fps+0.5)); ui_text(bitmap,buf,Machine->uiwidth-strlen(buf)*Machine->uifontwidth,0); if (vector_game) { sprintf(buf," %d vector updates",vups); ui_text(bitmap,buf,Machine->uiwidth-strlen(buf)*Machine->uifontwidth,Machine->uifontheight); } } if (bitmap->depth == 8) { if (dirty_bright) { dirty_bright = 0; for (i = 0;i < 256;i++) { float rate = brightness * brightness_paused_adjust * pow(i / 255.0, 1 / osd_gamma_correction) / 100; bright_lookup[i] = 255 * rate + 0.5; } } if (dirtypalette) { dirtypalette = 0; for (i = 0;i < screen_colors;i++) { if (dirtycolor[i]) { unsigned char r,g,b; dirtycolor[i] = 0; r = current_palette[3*i+0]; g = current_palette[3*i+1]; b = current_palette[3*i+2]; if (i != Machine->uifont->colortable[1]) /* don't adjust the user interface text */ { r = bright_lookup[r]; g = bright_lookup[g]; b = bright_lookup[b]; } wiz_video_color8(i,r,g,b); } } wiz_video_setpalette(); } } else { if (dirty_bright) { dirty_bright = 0; for (i = 0;i < 256;i++) { float rate = brightness * brightness_paused_adjust * pow(i / 255.0, 1 / osd_gamma_correction) / 100; bright_lookup[i] = 255 * rate + 0.5; } } if (dirtypalette) { if (use_dirty) init_dirty(1); /* have to redraw the whole screen */ dirtypalette = 0; for (i = 0;i < screen_colors;i++) { if (dirtycolor[i]) { int r,g,b; dirtycolor[i] = 0; r = current_palette[3*i+0]; g = current_palette[3*i+1]; b = current_palette[3*i+2]; if (i != Machine->uifont->colortable[1]) /* don't adjust the user interface text */ { r = bright_lookup[r]; g = bright_lookup[g]; b = bright_lookup[b]; } palette_16bit_lookup[i] = makecol(r,g,b); } } } } /* copy the bitmap to screen memory */ profiler_mark(PROFILER_BLIT); update_screen(bitmap); profiler_mark(PROFILER_END); if (have_to_clear_bitmap) osd_clearbitmap(bitmap); if (use_dirty) { if (!vector_game) swap_dirty(); init_dirty(0); } if (have_to_clear_bitmap) osd_clearbitmap(bitmap); if (throttle && autoframeskip && frameskip_counter == 0) { static int frameskipadjust; int adjspeed; /* adjust speed to video refresh rate if vsync is on */ adjspeed = speed * video_fps / vsync_frame_rate; if (adjspeed >= 92) { frameskipadjust++; if (frameskipadjust >= 3) { frameskipadjust = 0; if (frameskip > 0) frameskip--; } } else { if (adjspeed < 80) frameskipadjust -= (90 - adjspeed) / 5; else { /* don't push frameskip too far if we are close to 100% speed */ if (frameskip < 8) frameskipadjust--; } while (frameskipadjust <= -2) { frameskipadjust += 2; #ifdef WIZ if (frameskip < 7) frameskip++; #else if (frameskip < FRAMESKIP_LEVELS-1) frameskip++; #endif } } } } /* Check for PGUP, PGDN and pan screen */ pan_display(); if (input_ui_pressed(IPT_UI_FRAMESKIP_INC)) { if (autoframeskip) { autoframeskip = 0; frameskip = 0; } else { if (frameskip == FRAMESKIP_LEVELS-1) { frameskip = 0; autoframeskip = 1; } else frameskip++; } if (showfps == 0) showfpstemp = 2*video_fps; } if (input_ui_pressed(IPT_UI_FRAMESKIP_DEC)) { if (autoframeskip) { autoframeskip = 0; frameskip = FRAMESKIP_LEVELS-1; } else { if (frameskip == 0) autoframeskip = 1; else frameskip--; } if (showfps == 0) showfpstemp = 2*video_fps; } if (input_ui_pressed(IPT_UI_THROTTLE)) { throttle ^= 1; } frameskip_counter = (frameskip_counter + 1) % FRAMESKIP_LEVELS; }
int cinemat_clear_list(void) { if (osd_skip_this_frame()) vector_clear_list (); return ignore_interrupt(); }