static TIMER_CALLBACK( de_changed_timer_cb ) { device_t *device = (device_t *)ptr; crtc_ega_t *crtc_ega = get_safe_token(device); /* call the callback function -- we know it exists */ crtc_ega->intf->on_de_changed(device, is_display_enabled(crtc_ega)); update_de_changed_timer(crtc_ega); }
static void recompute_parameters(crtc_ega_t *crtc_ega, int postload) { if (crtc_ega->intf != NULL) { UINT16 hsync_on_pos, hsync_off_pos, vsync_on_pos, vsync_off_pos; /* compute the screen sizes */ UINT16 horiz_pix_total = (crtc_ega->horiz_char_total + 5) * crtc_ega->hpixels_per_column; UINT16 vert_pix_total = crtc_ega->vert_total + 1; /* determine the visible area, avoid division by 0 */ UINT16 max_visible_x = ( crtc_ega->horiz_disp + 1 ) * crtc_ega->hpixels_per_column - 1; UINT16 max_visible_y = crtc_ega->vert_disp_end; /* determine the syncing positions */ int horiz_sync_char_width = ( crtc_ega->horiz_retr_end + 1 ) - ( crtc_ega->horiz_retr_start & 0x1f ); int vert_sync_pix_width = crtc_ega->vert_retr_end - ( crtc_ega->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 = crtc_ega->horiz_retr_start * crtc_ega->hpixels_per_column; hsync_off_pos = hsync_on_pos + (horiz_sync_char_width * crtc_ega->hpixels_per_column); vsync_on_pos = crtc_ega->vert_retr_start; /* + 1 ?? */ vsync_off_pos = vsync_on_pos + vert_sync_pix_width; /* the Commodore PET computers program a horizontal synch pulse that extends past the scanline width. I assume that the real device will clamp it */ 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; /* update only if screen parameters changed, unless we are coming here after loading the saved state */ if (postload || (horiz_pix_total != crtc_ega->horiz_pix_total) || (vert_pix_total != crtc_ega->vert_pix_total) || (max_visible_x != crtc_ega->max_visible_x) || (max_visible_y != crtc_ega->max_visible_y) || (hsync_on_pos != crtc_ega->hsync_on_pos) || (vsync_on_pos != crtc_ega->vsync_on_pos) || (hsync_off_pos != crtc_ega->hsync_off_pos) || (vsync_off_pos != crtc_ega->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)) { rectangle visarea; attoseconds_t refresh = HZ_TO_ATTOSECONDS(crtc_ega->clock) * (crtc_ega->horiz_char_total + 1) * vert_pix_total; visarea.min_x = 0; visarea.min_y = 0; visarea.max_x = max_visible_x; visarea.max_y = 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)); crtc_ega->screen->configure(horiz_pix_total, vert_pix_total, visarea, refresh); crtc_ega->has_valid_parameters = TRUE; } else crtc_ega->has_valid_parameters = FALSE; crtc_ega->horiz_pix_total = horiz_pix_total; crtc_ega->vert_pix_total = vert_pix_total; crtc_ega->max_visible_x = max_visible_x; crtc_ega->max_visible_y = max_visible_y; crtc_ega->hsync_on_pos = hsync_on_pos; crtc_ega->hsync_off_pos = hsync_off_pos; crtc_ega->vsync_on_pos = vsync_on_pos; crtc_ega->vsync_off_pos = vsync_off_pos; update_de_changed_timer(crtc_ega); update_hsync_changed_timers(crtc_ega); update_vsync_changed_timers(crtc_ega); update_vblank_changed_timers(crtc_ega); } } }
static void recompute_parameters(mc6845_t *mc6845, int postload) { if (mc6845->intf != NULL) { UINT16 hsync_on_pos, hsync_off_pos, vsync_on_pos, vsync_off_pos; /* compute the screen sizes */ UINT16 horiz_pix_total = (mc6845->horiz_char_total + 1) * mc6845->hpixels_per_column; UINT16 vert_pix_total = (mc6845->vert_char_total + 1) * (mc6845->max_ras_addr + 1) + mc6845->vert_total_adj; /* determine the visible area, avoid division by 0 */ UINT16 max_visible_x = mc6845->horiz_disp * mc6845->hpixels_per_column - 1; UINT16 max_visible_y = mc6845->vert_disp * (mc6845->max_ras_addr + 1) - 1; /* determine the syncing positions */ UINT8 horiz_sync_char_width = mc6845->sync_width & 0x0f; UINT8 vert_sync_pix_width = supports_vert_sync_width[mc6845->device_type] ? (mc6845->sync_width >> 4) & 0x0f : 0x10; 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 = mc6845->horiz_sync_pos * mc6845->hpixels_per_column; hsync_off_pos = hsync_on_pos + (horiz_sync_char_width * mc6845->hpixels_per_column); vsync_on_pos = mc6845->vert_sync_pos * (mc6845->max_ras_addr + 1); vsync_off_pos = vsync_on_pos + vert_sync_pix_width; /* the Commodore PET computers program a horizontal synch pulse that extends past the scanline width. I assume that the real device will clamp it */ 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; /* update only if screen parameters changed, unless we are coming here after loading the saved state */ if (postload || (horiz_pix_total != mc6845->horiz_pix_total) || (vert_pix_total != mc6845->vert_pix_total) || (max_visible_x != mc6845->max_visible_x) || (max_visible_y != mc6845->max_visible_y) || (hsync_on_pos != mc6845->hsync_on_pos) || (vsync_on_pos != mc6845->vsync_on_pos) || (hsync_off_pos != mc6845->hsync_off_pos) || (vsync_off_pos != mc6845->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)) { rectangle visarea; attoseconds_t refresh = HZ_TO_ATTOSECONDS(mc6845->clock) * (mc6845->horiz_char_total + 1) * vert_pix_total; visarea.min_x = 0; visarea.min_y = 0; visarea.max_x = max_visible_x; visarea.max_y = max_visible_y; if (LOG) logerror("M6845 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)); video_screen_configure(mc6845->screen, horiz_pix_total, vert_pix_total, &visarea, refresh); mc6845->has_valid_parameters = TRUE; } else mc6845->has_valid_parameters = FALSE; mc6845->horiz_pix_total = horiz_pix_total; mc6845->vert_pix_total = vert_pix_total; mc6845->max_visible_x = max_visible_x; mc6845->max_visible_y = max_visible_y; mc6845->hsync_on_pos = hsync_on_pos; mc6845->hsync_off_pos = hsync_off_pos; mc6845->vsync_on_pos = vsync_on_pos; mc6845->vsync_off_pos = vsync_off_pos; update_de_changed_timer(mc6845); update_hsync_changed_timers(mc6845); update_vsync_changed_timers(mc6845); } }