iigs-game-engine/demos/smb/swizzle.js
Lucas Scharenbroich 459bc645be Swizzle support
2023-06-02 00:37:14 -05:00

55 lines
1.6 KiB
JavaScript

// Generate seizzle tables
//
// Maps an 8-bit value of wwxxyyzz to a lookup table that takes each 2-bit
// value to a 16-bit pixel index. Zero always maps to zero. The input
// is three 4-bit values that define the targets for 1, 2, and 3.
// Run as: node swizzle.js label val1 val2 val3
if (process.argv.length !== 6) {
console.log(process.argv);
process.exit(1);
}
const output = process.stdout;
const values = [
0,
Number(process.argv[3]),
Number(process.argv[4]),
Number(process.argv[5]),
];
output.write(process.argv[2] + '\n');
for (let w = 0; w < 4; w++) {
for (let x = 0; x < 4; x++) {
output.write(' dw ');
const row = [];
for (let y = 0; y < 4; y++) {
for (let z = 0; z < 4; z++) {
// Because the NES PPU bits define the pixel order from high bit to low bit, but the
// 65816 is little endian, we need to swap the byte order in the mapping
/*
const target =
(values[w] * 4096) +
(values[x] * 256) +
(values[y] * 16) +
values[z];
*/
const target =
(values[w] * 16) +
(values[x] * 1) +
(values[y] * 4096) +
(values[z] * 256);
row.push(target);
}
}
// Output the values
output.write(row.map(s => '$' + s.toString(16).padStart(4, '0')).join(','));
// Line break
output.write('\n');
}
}