#!/bin/sh
# res - figure X386 resolutions - rick sladkey

if [ $# -eq 0 ]
then
	cat
else
	echo $*
fi | awk '
{
	if (NF == 2) {
		clock = $1; hsyncmax = $2

		hflmin = int((clock*1000/hsyncmax + 4)/8)*8
		hvimin = int((int(0.8*hflmin) + 4)/8)*8
		vvimin = int(0.75*hvimin)
		vflmin = int(1.05*vvimin)
		hfl = hflmin; hvi = hvimin; vfl = vflmin; vvi = vvimin
		refresh = clock*1e6/(hfl*vfl)
		hdiff = hfl - hvi
		spstd = 3.8*clock
		spoff = int(((hdiff - spstd)/2 + 4)/8)*8
		sp = hdiff - 2*spoff
		sptime = sp/clock
		vspstd = int(150/(hfl/clock))

		printf("For a %d MHz clock and %g kHz max horiz sync:\n", \
			clock, hsyncmax)
		printf("Min horiz frame length: %d\n", hflmin)
		printf("Min horiz viewing image: %d\n", hvimin)
		printf("Min vert frame length: %d\n", vflmin)
		printf("Min vert viewing image: %d\n", vvimin)
		printf("Max refresh rate: %4.1f Hz\n", refresh)
		printf("Std horiz sync pulse length: %d\n", spstd)
		printf("Horiz surplus ticks: %d\n", hdiff)

		printf("Our horiz sync pulse time: %4.1f usec\n", sptime)
		printf("Recommended settings:\n")
		printf("           %3d", clock);
		printf("  %4d %4d %4d %4d", hvi, hvi + spoff, hfl - spoff, hfl)
		printf("  %4d %4d %4d %4d\n", vvi, vvi, vvi + vspstd, vfl)

		if (sptime < 3.5 || sptime > 4.0)
			printf("Warning: sync pulse is out of range\n");
		if (spoff < 24)
			printf("Warning: sync pulse offset is too short\n");
	}
	else if (NF >= 9) {
		if ($1 ~ /^"/) {
			name = "$1"; clock = $2
			hvi = $3; hss = $4; hse = $5; hfl = $6
			vvi = $7; vss = $8; vse = $9; vfl = $10
		}
		else {
			name = "\"<unnamed>\""; clock = $1
			hvi = $2; hss = $3; hse = $4; hfl = $5
			vvi = $6; vss = $7; vse = $8; vfl = $9
		}

		printf("For settings %s\n", $0)
		printf("Refresh rate: %4.1f\n", clock*1e6/(hfl*vfl))
		printf("Horizontal sync rate: %4.1f\n", clock*1000/hfl)
		printf("Sync pulse time: %4.1f usec\n", (hse - hss)/clock)
		printf("Sync pulse offsets: %d and %d\n", hss - hvi, hfl - hse)
		printf("Vert sync pulse time: %4.1f usec\n", \
			(vse - vss)*(hfl/clock))
	} 
	else {
		printf("usage: res clock hsyncmax\n")
	}
}
'
