137 lines
3.3 KiB
JavaScript
137 lines
3.3 KiB
JavaScript
import { S16_0, S16_1, S16_2, S16_3, S16_4, S16_5, S16_6, S16_7, S16_8, S16_9, S16_A, S16_B, S16_C, S16_D, S16_E, S16_F } from "./symbol/S16.js"
|
|
import { S8_0, S8_1, S8_2, S8_3, S8_4, S8_5, S8_6, S8_7 } from "./symbol/S8.js"
|
|
import { S2_0, S2_1 } from "./symbol/S2.js"
|
|
import { S10_0, S10_1, S10_2, S10_3, S10_4, S10_5, S10_6, S10_7, S10_8, S10_9 } from "./symbol/S10.js"
|
|
import { kBuffer, Num } from "./num.js"
|
|
import { add16, add8, add2, add10 } from "./add.js"
|
|
import { size16, size8, size2, size10 } from "./alloc.js"
|
|
import { one10, one16, one2, one8 } from "./num.js"
|
|
|
|
/**
|
|
* @param { symbol } a
|
|
*/
|
|
function not16B(a) {
|
|
switch (a) {
|
|
case S16_0: return S16_F;
|
|
case S16_1: return S16_E;
|
|
case S16_2: return S16_D;
|
|
case S16_3: return S16_C;
|
|
case S16_4: return S16_B;
|
|
case S16_5: return S16_A;
|
|
case S16_6: return S16_9;
|
|
case S16_7: return S16_8;
|
|
case S16_8: return S16_7;
|
|
case S16_9: return S16_6;
|
|
case S16_A: return S16_5;
|
|
case S16_B: return S16_4;
|
|
case S16_C: return S16_3;
|
|
case S16_D: return S16_2;
|
|
case S16_E: return S16_1;
|
|
case S16_F: return S16_0;
|
|
default: throw new Error("unexpected symbol");
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @param { symbol } a
|
|
*/
|
|
function not8B(a) {
|
|
switch (a) {
|
|
case S8_0: return S8_7;
|
|
case S8_1: return S8_6;
|
|
case S8_2: return S8_5;
|
|
case S8_3: return S8_4;
|
|
case S8_4: return S8_3;
|
|
case S8_5: return S8_2;
|
|
case S8_6: return S8_1;
|
|
case S8_7: return S8_0;
|
|
default: throw new Error("unexpected symbol");
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @param { symbol } a
|
|
*/
|
|
function not2B(a) {
|
|
switch (a) {
|
|
case S2_0: return S2_1;
|
|
case S2_1: return S2_0;
|
|
default: throw new Error("unexpected symbol");
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @param { symbol } a
|
|
*/
|
|
function not10B(a) {
|
|
switch (a) {
|
|
case S10_0: return S10_9;
|
|
case S10_1: return S10_8;
|
|
case S10_2: return S10_7;
|
|
case S10_3: return S10_6;
|
|
case S10_4: return S10_5;
|
|
case S10_5: return S10_4;
|
|
case S10_6: return S10_3;
|
|
case S10_7: return S10_2;
|
|
case S10_8: return S10_1;
|
|
case S10_9: return S10_0;
|
|
default: throw new Error("unexpected symbol");
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @param { Num } a
|
|
*/
|
|
export function not16(a) {
|
|
const { [kBuffer]: buff } = a;
|
|
for (let i = 0; i < size16; i++) {
|
|
buff[i] = not16B(buff[i]);
|
|
}
|
|
add16(a, one16);
|
|
}
|
|
|
|
/**
|
|
* @param { Num } a
|
|
*/
|
|
export function not8(a) {
|
|
const { [kBuffer]: buff } = a;
|
|
for (let i = 0; i < size8; i++) {
|
|
buff[i] = not8B(buff[i]);
|
|
}
|
|
add8(a, one8);
|
|
}
|
|
|
|
/**
|
|
* @param { Num } a
|
|
*/
|
|
export function not2(a) {
|
|
const { [kBuffer]: buff } = a;
|
|
for (let i = 0; i < size2; i++) {
|
|
buff[i] = not2B(buff[i]);
|
|
}
|
|
add2(a, one2);
|
|
}
|
|
|
|
/**
|
|
* @param { Num } a
|
|
*/
|
|
export function not10(a) {
|
|
const { [kBuffer]: buff } = a;
|
|
for (let i = 0; i < size10; i++) {
|
|
buff[i] = not10B(buff[i]);
|
|
}
|
|
add10(a, one10);
|
|
}
|
|
|
|
/**
|
|
* @param { Num } a
|
|
*/
|
|
export function not(a) {
|
|
switch (a.radix) {
|
|
case 2: return not2(a);
|
|
case 8: return not8(a);
|
|
case 16: return not16(a);
|
|
case 10: return not10(a);
|
|
default: throw new Error(`unsupported radix (${a.radix})`);
|
|
}
|
|
} |