From: ian Date: Tue, 20 Dec 2005 15:15:58 +0000 (+0000) Subject: support timer2; get timer[013] calculations right! X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ijackson/git?a=commitdiff_plain;h=46db0810c8b38c79f11bc3b299a46c4915d95042;p=trains.git support timer2; get timer[013] calculations right! --- diff --git a/detpic/make-clocks b/detpic/make-clocks index 40ee2e2..9d0bc7d 100755 --- a/detpic/make-clocks +++ b/detpic/make-clocks @@ -27,14 +27,15 @@ our ($name,$ms,$interval,$msclock); # ie cycles = interval * foscscale * msclock / prescale # or msclock = cycles * prescale / (foscscale * interval) -sub scaleable ($$$$$) { - my ($width, $foscscale, $scalebitnums, $scales, $deadcycles) = @_; +sub scaleable ($$$$$$) { + my ($width, $foscscale, $scalebitnums, $scales, + $deadcycles, $overflowp) = @_; my ($maxcycles, $scalespec, $scalebits); my ($cycles, $cyequ, @scalebits); my ($prescale); $maxcycles = (1 << $width) - $deadcycles; foreach $scalespec (@$scales) { - $scalespec =~ m/^(\d+)\:([01]+)$/; + $scalespec =~ m/^0*(\d+)\-([01]+)$/; ($prescale,$scalebits) = ($1,$2); length($scalebits) == @$scalebitnums or die "$scalespec @$scalebitnums"; @@ -54,35 +55,48 @@ sub scaleable ($$$$$) { $cyequ= "${name}cycles"; p(sprintf "%s equ %d\n", $cyequ, $cycles); - if ($width == 16) { - p("${name}inith equ $cyequ / 256\n"); - p("${name}initl equ $cyequ & 255\n"); - } elsif ($width == 8) { - p("${name}init equ $cyequ\n"); - } else { - die "$width"; + if ($overflowp) { + p("${name}init equ ".(1<<$width)." - $cyequ\n"); + if ($width == 16) { + p("${name}inith equ ${name}init / 256\n"); + p("${name}initl equ ${name}init & 255\n"); + } } return; } warn "clock speed too high for $name\n"; } +sub do_T2period { + my (@scales, $pre, $prex, $prebits, $posti, $this); + for $pre (qw(1-00 4-01 16-10)) { + $pre =~ m/^(\d+)\-([01]+)$/; + ($prex,$prebits) = ($1,$2); + for ($posti=0; $posti<15; $posti++) { + $this= sprintf "%03d-%s%04b", $prex * ($posti+1), $prebits, $posti; + push @scales, $this; + } + } + local ($name) = "${name}_t2"; + scaleable(8, 250.0, [qw(T2CKPS1 T2CKPS0 TOUTPS3 TOUTPS2 TOUTPS1 TOUTPS0)], + [ sort @scales ], 0, 0); +} + sub do_T13ov ($) { my ($n) = @_; local ($name) = "${name}_t${n}"; scaleable(16, 250.0, ["T${n}CKPS1","T${n}CKPS0"], - [qw(1:00 2:01 4:10 8:11)], 1); + [qw(1-00 2-01 4-10 8-11)], 1, 1); } sub do_T0ov ($) { my ($w) = @_; local ($name) = "${name}_t0"; scaleable($w, 250.0, ["PSA","T0PS2","T0PS1","T0PS0"], - [qw(1:1000 2:0000 4:0001 8:0010 16:0011 - 32:0100 64:0101 128:0110 256:0111)], 1); + [qw(1-1000 2-0000 4-0001 8-0010 16-0011 + 32-0100 64-0101 128-0110 256-0111)], 1, 1); } -sub do_T0ov8 { do_T0ov(8); } sub do_T0ov16 { do_T0ov(16); } sub do_T1ov { do_T13ov(1); } sub do_T3ov { do_T13ov(3); }