var hexchars = "0123456789ABCDEF";
function dec2hex(dec)
{
	var i = 0;
	var hexnum = "";
	while (dec>>i != 0) {
		hexnum = hexchars.charAt((dec>>i)&0xf) + hexnum;
 	 	i += 4;
	}
	return hexnum;
}

function bin2hex(bin)
{
	var l = bin.length;
	var h = "";
	for (var i = 0; i < l; i+=4) {
		var d = 0;
		if (bin.charAt(i)   == '1') d += 8;
		if (bin.charAt(i+1) == '1') d += 4;
		if (bin.charAt(i+2) == '1') d += 2;
		if (bin.charAt(i+3) == '1') d += 1;
		h += hexchars.charAt(d);
	}
	return h;
}

function bin2dec(bin)
{
	var l = bin.length;
	var d = 0;
	for (var i = 0; i < l; i++) {
		if (bin.charAt(l-i-1) == '1')
			d += Math.pow(2, i);
	}
	return d;
}

function dec2bin(val, min_digits)
{
	b = "";
	r = val; x = 0;
	while (r != 0) {
		x = r % 2;
		r = Math.floor(r / 2);
		b = "" + x + "" + b;
	}
	var l = b.length;
	for (var i = 0; i < min_digits - l; i++)
		b = "0" + b;
	return b;
}

function get_vid_index(voltage)
{
	return (voltage > 1550 || voltage < 800) ? -1 : (1550 - voltage) / 25;
}

function get_fid_index(frequency)
{
	return 8 + (frequency - 1600) / 100;
}

function calc_dsdt_pss_control_string(frequency, voltage)
{
	if (voltage >= 800 && voltage <= 1550) {
		IRT = "11";      // 80 uS (default)
		RVO = "10";      // 00 required?
		PLL_LOCK_TIME = "0000010"; // still unknown
		MVS = "00";      // 25 mV voltage step
		VST = "0000101"; // 100 uS (default)
		NewVID = dec2bin(get_vid_index(voltage),   5);
		NewFID = dec2bin(get_fid_index(frequency), 6);
		ctrl = IRT + RVO + "0" + PLL_LOCK_TIME + MVS + VST + NewVID + NewFID;
	}
	return (voltage < 800 || voltage > 1550) ? -1 : bin2hex(ctrl);
}

function calc_dsdt_pss_status_string(frequency, voltage)
{
	if (voltage >= 800 && voltage <= 1550) {
		VID = dec2bin(get_vid_index(voltage), 5);
		FID = dec2bin(get_fid_index(frequency), 6);
	}
	return (voltage < 800 || voltage > 1550) ? -1 : bin2hex("00000" + VID + FID);
}

function dsdt_update_display(frequency, voltage)
{
	//document.getElementById("javascript_warning").innerHTML = "";
	control_str = calc_dsdt_pss_control_string(frequency, voltage);
	status_str  = calc_dsdt_pss_status_string(frequency, voltage);
	if (control_str < 0 || status_str < 0) {
		//document.getElementById("javascript_warning").innerHTML = "<b>ERROR: Invalid core frequency and/or core voltage!</b>";
	} else {
		document.getElementById("freqhex").innerHTML = "0x0" + dec2hex(frequency);
		document.getElementById("freqdec").innerHTML = frequency;
		document.getElementById("voltdec").innerHTML = voltage;
		document.getElementById("control").innerHTML = "0x" + control_str;
		document.getElementById("status").innerHTML  = "0x" + status_str;
	}
}
