void fixedfreq_device::recompute_parameters(bool postload) { bool needs_realloc = (m_htotal != m_hbackporch) && (m_vtotal != m_vbackporch); if (m_bitmap[0] != NULL || needs_realloc) auto_free(machine(), m_bitmap[0]); if (m_bitmap[1] != NULL || needs_realloc) auto_free(machine(), m_bitmap[0]); m_htotal = m_hbackporch; m_vtotal = m_vbackporch; /* sync separator */ m_int_trig = (exp(- 3.0/(3.0+3.0))) - exp(-1.0); m_mult = (double) (m_monitor_clock) / (double) m_htotal * 1.0; // / (3.0 + 3.0); VERBOSE_OUT(("trigger %f with len %f\n", m_int_trig, 1e6 / m_mult)); m_bitmap[0] = auto_bitmap_rgb32_alloc(machine(),m_htotal, m_vtotal); m_bitmap[1] = auto_bitmap_rgb32_alloc(machine(),m_htotal, m_vtotal); rectangle visarea( m_hbackporch - m_hfrontporch, m_hbackporch - m_hfrontporch + m_hvisible - 1, m_vbackporch - m_vfrontporch, m_vbackporch - m_vfrontporch + m_vvisible - 1); m_clock_period = attotime::from_hz(m_monitor_clock); m_refresh = attotime::from_hz(m_monitor_clock) * m_vtotal * m_htotal; screen().configure(m_htotal, m_vtotal, visarea, m_refresh.as_attoseconds()); }
void fixedfreq_device::update_screen_parameters(attotime refresh) { rectangle visarea( // m_hsync - m_hvisible, // m_hsync - 1 , m_hbackporch - m_hfrontporch, m_hbackporch - m_hfrontporch + m_hvisible - 1, m_vbackporch - m_vfrontporch, m_vbackporch - m_vfrontporch + m_vvisible - 1); m_refresh = refresh; screen().configure(m_htotal, m_vtotal, visarea, m_refresh.as_attoseconds()); }
void vector06_state::vector06_set_video_mode(int width) { rectangle visarea(0, width+64-1, 0, 256+64-1); machine().primary_screen->configure(width+64, 256+64, visarea, machine().primary_screen->frame_period().attoseconds); }
void crtc_ega_device::recompute_parameters(bool postload) { UINT16 hsync_on_pos, hsync_off_pos, vsync_on_pos, vsync_off_pos; /* compute the screen sizes */ UINT16 horiz_pix_total = (m_horiz_char_total + 2) * m_hpixels_per_column; UINT16 vert_pix_total = m_vert_total + 1; /* determine the visible area, avoid division by 0 */ UINT16 max_visible_x = ( m_horiz_disp + 1 ) * m_hpixels_per_column - 1; UINT16 max_visible_y = m_vert_disp_end; /* determine the syncing positions */ int horiz_sync_char_width = ( m_horiz_retr_end + 1 ) - ( m_horiz_retr_start & 0x1f ); int vert_sync_pix_width = m_vert_retr_end - ( m_vert_retr_start & 0x0f ); if (horiz_sync_char_width <= 0) horiz_sync_char_width += 0x10; if (vert_sync_pix_width <= 0) vert_sync_pix_width += 0x10; hsync_on_pos = m_horiz_retr_start * m_hpixels_per_column; hsync_off_pos = hsync_on_pos + (horiz_sync_char_width * m_hpixels_per_column); vsync_on_pos = m_vert_retr_start; /* + 1 ?? */ vsync_off_pos = vsync_on_pos + vert_sync_pix_width; if (hsync_off_pos > horiz_pix_total) hsync_off_pos = horiz_pix_total; if (vsync_off_pos > vert_pix_total) vsync_off_pos = vert_pix_total; if ( vsync_on_pos >= vsync_off_pos ) { vsync_on_pos = vsync_off_pos - 2; } /* update only if screen parameters changed, unless we are coming here after loading the saved state */ if (postload || (horiz_pix_total != m_horiz_pix_total) || (vert_pix_total != m_vert_pix_total) || (max_visible_x != m_max_visible_x) || (max_visible_y != m_max_visible_y) || (hsync_on_pos != m_hsync_on_pos) || (vsync_on_pos != m_vsync_on_pos) || (hsync_off_pos != m_hsync_off_pos) || (vsync_off_pos != m_vsync_off_pos)) { /* update the screen if we have valid data */ if ((horiz_pix_total > 0) && (max_visible_x < horiz_pix_total) && (vert_pix_total > 0) && (max_visible_y < vert_pix_total) && (hsync_on_pos <= horiz_pix_total) && (vsync_on_pos <= vert_pix_total) && (hsync_on_pos != hsync_off_pos)) { attoseconds_t refresh = HZ_TO_ATTOSECONDS(m_clock) * (m_horiz_char_total + 2) * vert_pix_total; rectangle visarea(0, max_visible_x, 0, max_visible_y); if (LOG) logerror("CRTC_EGA config screen: HTOTAL: 0x%x VTOTAL: 0x%x MAX_X: 0x%x MAX_Y: 0x%x HSYNC: 0x%x-0x%x VSYNC: 0x%x-0x%x Freq: %ffps\n", horiz_pix_total, vert_pix_total, max_visible_x, max_visible_y, hsync_on_pos, hsync_off_pos - 1, vsync_on_pos, vsync_off_pos - 1, 1 / ATTOSECONDS_TO_DOUBLE(refresh)); if ( m_screen != NULL ) m_screen->configure(horiz_pix_total, vert_pix_total, visarea, refresh); m_has_valid_parameters = true; } else { m_has_valid_parameters = false; if (LOG) logerror("CRTC_EGA bad config screen: HTOTAL: 0x%x VTOTAL: 0x%x MAX_X: 0x%x MAX_Y: 0x%x HSYNC: 0x%x-0x%x VSYNC: 0x%x-0x%x\n", horiz_pix_total, vert_pix_total, max_visible_x, max_visible_y, hsync_on_pos, hsync_off_pos - 1, vsync_on_pos, vsync_off_pos - 1); } m_horiz_pix_total = horiz_pix_total; m_vert_pix_total = vert_pix_total; m_max_visible_x = max_visible_x; m_max_visible_y = max_visible_y; m_hsync_on_pos = hsync_on_pos; m_hsync_off_pos = hsync_off_pos; m_vsync_on_pos = vsync_on_pos; m_vsync_off_pos = vsync_off_pos; } }
void orion_state::orion_set_video_mode(int width) { rectangle visarea(0, width-1, 0, 255); machine().first_screen()->configure(width, 256, visarea, machine().first_screen()->frame_period().attoseconds()); }
void update_vid() { const netlist_time clock_period = netlist_time::from_hz(NETLIST_CLOCK); const netlist_time hsync_min_time = netlist_time::from_us(4); const netlist_time vsync_min_time = netlist_time::from_us(50); /* usec */ const int vsync_min_pulses = 4; UINT64 clocks = m_maincpu->total_cycles(); // m_maincpu->attotime_to_cycles(m_maincpu->local_time()); int pw = NETLIST_CLOCK / ((UINT64)MASTER_CLOCK) / HRES_MULT; netlist_time time = clock_period * (clocks - m_last_clock); //UINT64 clocks = m_maincpu->netlist().time().as_raw() >> 10; // m_maincpu->attotime_to_cycles(m_maincpu->local_time()); //int pw = (NETLIST_INTERNAL_CLOCK / ((UINT64)MASTER_CLOCK) / HRES_MULT) >> 8; if (m_last_y < m_bitmap->height()) { int colv = (int) (m_vid / 3.5 * 255.0); rgb_t col = MAKE_RGB(colv, colv, colv); int pixels = (clocks - m_line_clock) / pw; while (pixels >= m_bitmap->width()) { for (int i = m_last_x ; i < m_bitmap->width() - 1; i++) m_bitmap->pix(m_last_y, i) = col; pixels -= m_bitmap->width(); m_last_x = 0; } for (int i = m_last_x ; i < pixels; i++) m_bitmap->pix(m_last_y, i) = col; m_last_x = pixels; } if (m_vid <= 0.34) { if (time >= vsync_min_time) { m_vsync_cnt++; if (m_vsync_cnt >= vsync_min_pulses) { m_vsync_cnt = 0; m_last_y = 0; attoseconds_t new_refresh = DOUBLE_TO_ATTOSECONDS((double) (clocks - m_vsync_clock) / (double) NETLIST_CLOCK); if (new_refresh != m_refresh) { m_refresh = new_refresh; rectangle visarea(0, H_TOTAL * HRES_MULT - 1, 0, V_TOTAL-1); this->mconfig().first_screen()->configure(H_TOTAL * HRES_MULT, V_TOTAL, visarea, m_refresh); m_vsync_clock = clocks; } } m_last_y++; m_last_x = 0; } else if (time >= hsync_min_time) { m_last_x = 0; // hsync m_last_y++; m_line_clock = clocks; } } m_last_clock = clocks; }