static mame_time choose_delay(unicode_char_t ch) { subseconds_t delay = 0; if (current_rate.seconds || current_rate.subseconds) return current_rate; if (queue_chars) { /* systems with queue_chars can afford a much smaller delay */ delay = DOUBLE_TO_SUBSECONDS(0.01); } else { switch(ch) { case '\r': delay = DOUBLE_TO_SUBSECONDS(0.2); break; default: delay = DOUBLE_TO_SUBSECONDS(0.05); break; } } return make_mame_time(0, delay); }
mame_time video_screen_get_time_until_pos(int scrnum, int vpos, int hpos) { mame_time curdelta = sub_mame_times(mame_timer_get_time(), scrinfo[scrnum].vblank_time); subseconds_t targetdelta; assert(curdelta.seconds == 0); /* since we measure time relative to VBLANK, compute the scanline offset from VBLANK */ vpos += Machine->screen[scrnum].height - (Machine->screen[scrnum].visarea.max_y + 1); vpos %= Machine->screen[scrnum].height; /* compute the delta for the given X,Y position */ targetdelta = (subseconds_t)vpos * scrinfo[scrnum].scantime + (subseconds_t)hpos * scrinfo[scrnum].pixeltime; /* if we're past that time, head to the next frame */ if (targetdelta <= curdelta.subseconds) targetdelta += DOUBLE_TO_SUBSECONDS(TIME_IN_HZ(Machine->screen[scrnum].refresh)); /* return the difference */ return make_mame_time(0, targetdelta - curdelta.subseconds); }