You've already forked CS-Box
- Move Bootstrap Studio design file into assets/bootstrap - Rename and relocate screenshots into assets/screenshot with kebab-case names - Add generated export HTML pages for simulators and site content - Preserve existing content with no functional changes to simulators Signed-off-by: Alexander Davis <alex@adcm.uk>
210 lines
7.4 KiB
JavaScript
210 lines
7.4 KiB
JavaScript
// ** Check if the filename contains "binary" **
|
|
if (window.location.pathname.includes('binary')) {
|
|
|
|
let denary = 0;
|
|
let bits = {
|
|
'-128': false,
|
|
'1': false,
|
|
'2': false,
|
|
'4': false,
|
|
'8': false,
|
|
'16': false,
|
|
'32': false,
|
|
'64': false,
|
|
'128': false
|
|
};
|
|
|
|
let bitValues = [];
|
|
const twosComplementCheck = document.getElementById("blbN128");
|
|
|
|
// ** Initialize the bit values on page load **
|
|
function initialize() {
|
|
setBitValues(); // Set the bit values dynamically
|
|
resetBinarySimulator(); // Reset the simulator to the initial state
|
|
}
|
|
|
|
// ** Dynamically set bit values based on 2's complement mode **
|
|
function setBitValues() {
|
|
bitValues = twosComplementCheck
|
|
? [-128, 64, 32, 16, 8, 4, 2, 1]
|
|
: [128, 64, 32, 16, 8, 4, 2, 1];
|
|
}
|
|
|
|
// ** Helper function to toggle power for a specific bit **
|
|
function togglePower(bitValue, isActive) {
|
|
const bitId = bitValue < 0 ? `N${Math.abs(bitValue)}` : bitValue;
|
|
const bulb = document.getElementById(`blb${bitId}`);
|
|
const switchBtn = document.getElementById(`swt${bitId}`);
|
|
if (bulb && switchBtn) {
|
|
bulb.classList.toggle('poweredOn', isActive);
|
|
bulb.classList.toggle('poweredOff', !isActive);
|
|
switchBtn.classList.toggle('btnActive', isActive);
|
|
}
|
|
}
|
|
|
|
// ** Reset all bits and denary **
|
|
function resetBinarySimulator() {
|
|
Object.keys(bits).forEach(bit => {
|
|
togglePower(parseInt(bit, 10), false);
|
|
bits[bit] = false;
|
|
});
|
|
denary = 0;
|
|
updateBinary();
|
|
}
|
|
|
|
// ** Toggle a specific bit **
|
|
function changeBit(bitValue) {
|
|
const key = getBitKey(bitValue);
|
|
const isActive = bits[key];
|
|
togglePower(bitValue, !isActive);
|
|
bits[key] = !isActive;
|
|
denary += isActive ? -bitValue : bitValue;
|
|
updateBinary();
|
|
}
|
|
|
|
// ** Update binary string and denary display **
|
|
function updateBinary() {
|
|
const binary = bitValues.map(bit => (bits[getBitKey(bit)] ? '1' : '0')).join('');
|
|
document.getElementById("denaryNumber").innerText = denary;
|
|
document.getElementById("binaryNumber").innerText = binary;
|
|
}
|
|
|
|
// ** Parse a custom binary string and set bits accordingly **
|
|
function customBinaryParser(binaryPattern) {
|
|
resetBinarySimulator();
|
|
binaryPattern = binaryPattern.padStart(8, '0'); // Ensure 8-bit format
|
|
binaryPattern.split('').forEach((bit, index) => {
|
|
if (bit === '1') {
|
|
changeBit(bitValues[index]);
|
|
}
|
|
});
|
|
}
|
|
|
|
// ** Parse a custom denary value and set bits accordingly **
|
|
function customDenaryParser(customDenary) {
|
|
const min = twosComplementCheck ? -128 : 0;
|
|
const max = twosComplementCheck ? 127 : 255;
|
|
|
|
if (customDenary === null) {
|
|
customDenary = 0; // Default to 0 if user cancels input
|
|
}
|
|
|
|
if (customDenary < min || customDenary > max) {
|
|
alert(`Invalid input! Please enter a denary value between ${min} and ${max}.`);
|
|
return requestDenary(); // Prompt user again
|
|
}
|
|
|
|
resetBinarySimulator();
|
|
if (twosComplementCheck && customDenary < 0) {
|
|
let absDenary = Math.abs(customDenary);
|
|
if (customDenary === -128) {
|
|
changeBit(-128);
|
|
} else {
|
|
bitValues.forEach(bit => {
|
|
if (absDenary >= Math.abs(bit)) {
|
|
changeBit(bit);
|
|
absDenary -= Math.abs(bit);
|
|
}
|
|
});
|
|
twosComplementFlip();
|
|
}
|
|
} else {
|
|
bitValues.forEach(bit => {
|
|
if (customDenary >= Math.abs(bit)) {
|
|
changeBit(bit);
|
|
customDenary -= Math.abs(bit);
|
|
}
|
|
});
|
|
}
|
|
}
|
|
|
|
// ** Handle logical binary shifting (left or right) **
|
|
function shiftBinary(direction) {
|
|
const binaryString = document.getElementById("binaryNumber").innerText;
|
|
let shiftedBinary;
|
|
if (direction === 'left') {
|
|
shiftedBinary = binaryString.slice(1) + '0';
|
|
} else if (direction === 'right') {
|
|
shiftedBinary = '0' + binaryString.slice(0, -1);
|
|
}
|
|
customBinaryParser(shiftedBinary);
|
|
}
|
|
|
|
// ** Handle arithmetic shifting for 2's complement **
|
|
function shiftTwosComplement(direction) {
|
|
const binaryString = document.getElementById("binaryNumber").innerText;
|
|
let shiftedBinary;
|
|
if (direction === 'left') {
|
|
shiftedBinary = binaryString.slice(1) + '0';
|
|
} else if (direction === 'right') {
|
|
shiftedBinary = binaryString[0] + binaryString.slice(0, -1);
|
|
}
|
|
customBinaryParser(shiftedBinary);
|
|
}
|
|
|
|
// ** Flip binary bits for 2's complement **
|
|
function twosComplementFlip() {
|
|
let binary = document.getElementById("binaryNumber").innerText;
|
|
const flippedBinary = binary.split('').map(bit => (bit === '1' ? '0' : '1')).join('');
|
|
const result = addBinaryNumbers(flippedBinary, '00000001');
|
|
customBinaryParser(result.binaryResult);
|
|
}
|
|
|
|
// ** Add two binary numbers **
|
|
function addBinaryNumbers(binary1, binary2) {
|
|
let carry = 0;
|
|
let result = '';
|
|
for (let i = 7; i >= 0; i--) {
|
|
const bit1 = parseInt(binary1[i], 10) || 0;
|
|
const bit2 = parseInt(binary2[i], 10) || 0;
|
|
const sum = bit1 + bit2 + carry;
|
|
result = (sum % 2) + result;
|
|
carry = Math.floor(sum / 2);
|
|
}
|
|
return { binaryResult: result.slice(-8), overflow: carry ? '1' : '0' };
|
|
}
|
|
|
|
// ** Helper to normalize bit keys **
|
|
function getBitKey(bitValue) {
|
|
return bitValue < 0 ? `N${Math.abs(bitValue)}` : bitValue.toString();
|
|
}
|
|
|
|
// ** Request binary input from user **
|
|
function requestBinary() {
|
|
let binary;
|
|
do {
|
|
binary = prompt("Please enter an 8-bit Binary Value (only 0s and 1s are allowed):");
|
|
if (binary === null) {
|
|
binary = "00000000"; // Default to 0 if user cancels input
|
|
break;
|
|
}
|
|
if (!/^[01]{1,8}$/.test(binary)) {
|
|
alert("Invalid input! Binary values must be up to 8 digits long and only contain 0 or 1.");
|
|
}
|
|
} while (!/^[01]{1,8}$/.test(binary));
|
|
customBinaryParser(binary);
|
|
}
|
|
|
|
// ** Request denary input from user **
|
|
function requestDenary() {
|
|
let customDenary;
|
|
const min = twosComplementCheck ? -128 : 0;
|
|
const max = twosComplementCheck ? 127 : 255;
|
|
|
|
do {
|
|
customDenary = prompt(`Enter a Denary Value (${min} to ${max}):`);
|
|
if (customDenary === null) {
|
|
customDenary = 0; // Default to 0 if user cancels input
|
|
break;
|
|
}
|
|
customDenary = parseInt(customDenary, 10);
|
|
if (isNaN(customDenary) || customDenary < min || customDenary > max) {
|
|
alert(`Invalid input! Please enter a denary value between ${min} and ${max}.`);
|
|
}
|
|
} while (isNaN(customDenary) || customDenary < min || customDenary > max);
|
|
customDenaryParser(customDenary);
|
|
}
|
|
|
|
// ** On page load, initialize the simulator **
|
|
document.addEventListener("DOMContentLoaded", initialize);
|
|
} |