littlebigcomputer/assembler/util.ts
2024-05-17 18:37:51 +02:00

49 lines
1.2 KiB
TypeScript

export function toBitString(n: number, bits: number, signed: boolean = false, littleEndianByteSize: null | number = null): string {
const minimum = -(2 ** (bits - 1));
const maximum = signed ? (2 ** (bits - 1)) - 1 : 2 ** bits - 1;
if (n < minimum || n > maximum) {
throw new Error(`Value ${n} out of range for ${bits}-bit ${signed ? 'signed' : 'unsigned'} integer`);
}
if (n < 0) {
n = (2 ** bits) + n;
}
let result = '';
for (let i = 0; i < bits; i++) {
result = (n & 1) + result;
n >>= 1;
}
if (n !== 0) {
throw new Error(`Internal error: ${n} not zero after conversion to ${bits}-bit ${signed ? 'signed' : 'unsigned'} integer`);
}
if (littleEndianByteSize !== null) {
const bytes = [];
for (let i = 0; i < result.length / littleEndianByteSize; i++) {
bytes.push(result.substring(i * littleEndianByteSize, (i + 1) * littleEndianByteSize));
}
result = bytes.reverse().join('');
}
return result;
}
export function toNote(n: number, bits: number): string {
if (bits <= 19) {
return `${n}`;
} else {
const scaling = 2 ** (bits - 19);
return `${(n / scaling).toFixed(5)} x${scaling}`
}
}
export function toNote24(n: number): string {
return toNote(n, 24);
}
export function toNote8(n: number): string {
return toNote(n, 8);
}