#!/usr/bin/perl # use diagnostics; use strict; no strict 'vars'; sub to_readable { my $conv_f = shift; return join(" ", map {sprintf("%.3f", $_ * $conv_f)} @_); } sub to_vidmode { my $s = 0; return join(" ", map {$s += $_} @_); } $h_res = 1152; $v_res = 910; $h_freq = 80.00 * 1000; $v_freq = 83.000; $dot_freq = 125.000 * 1000000; $h_sync_time = 300.0 / 1000000000; $h_dots = int(0.5 + $dot_freq / $h_freq); $h_freq = $dot_freq / $h_dots; $h_dots_remaining = $h_dots - $h_res; $h_dots_remaining -= ($h_sync_dots = int(0.5 + $h_sync_time * $dot_freq)); $h_dots_remaining -= ($h_lead_in_dots = int($h_dots_remaining * 0.8)); $h_lead_out_dots = $h_dots_remaining; @h_sum = ($h_res, $h_lead_out_dots, $h_sync_dots, $h_lead_in_dots); $v_sync_time = 140.0 / 1000000; $v_lines = int(0.5 + $h_freq / $v_freq); $v_freq = $h_freq / $v_lines; $v_lines_remaining = $v_lines - $v_res; $v_lines_remaining -= ($v_sync_lines = int(0.5 + $v_sync_time * $h_freq)); $v_lines_remaining -= ($v_lead_in_lines = int($v_lines_remaining * 0.7)); $v_lead_out_lines = $v_lines_remaining; @v_sum = ($v_res, $v_lead_out_lines, $v_sync_lines, $v_lead_in_lines); $dots_to_us = 1000000 / $dot_freq; $lines_to_ms = 1000 / $h_freq; $mode_name = "\"", $h_res, "x", $v_res, "\""; #print " Mode $mode_name\n"; #print " DotClock ", $dot_freq / 1000000, "\n"; #print " # ", to_readable($dots_to_us, @h_sum), " us\n"; #print " HTimings ", to_vidmode(@h_sum), "\n"; #print " # ", to_readable($lines_to_ms, @v_sum), " ms\n"; #print " VTimings ", to_vidmode(@v_sum), "\n"; #print " EndMode"; $modeline = $dot_freq / 1000000 . " " . to_vidmode(@h_sum) . " " . to_vidmode(@v_sum); while(<>) { if (s/NEW_MODELINE/$modeline/g) { print STDERR $_; } print; }