@audiofab-io/fv1-core 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/assembler/AlgebraicCompiler.d.ts +74 -0
- package/dist/assembler/AlgebraicCompiler.d.ts.map +1 -0
- package/dist/assembler/AlgebraicCompiler.js +473 -0
- package/dist/assembler/AlgebraicCompiler.js.map +1 -0
- package/dist/assembler/FV1Assembler.d.ts +71 -0
- package/dist/assembler/FV1Assembler.d.ts.map +1 -0
- package/dist/assembler/FV1Assembler.js +343 -0
- package/dist/assembler/FV1Assembler.js.map +1 -0
- package/dist/assembler/FV1Encoder.d.ts +18 -0
- package/dist/assembler/FV1Encoder.d.ts.map +1 -0
- package/dist/assembler/FV1Encoder.js +226 -0
- package/dist/assembler/FV1Encoder.js.map +1 -0
- package/dist/assembler/FV1Parser.d.ts +87 -0
- package/dist/assembler/FV1Parser.d.ts.map +1 -0
- package/dist/assembler/FV1Parser.js +285 -0
- package/dist/assembler/FV1Parser.js.map +1 -0
- package/dist/hex/IntelHexParser.d.ts +19 -0
- package/dist/hex/IntelHexParser.d.ts.map +1 -0
- package/dist/hex/IntelHexParser.js +184 -0
- package/dist/hex/IntelHexParser.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -0
- package/dist/simulator/FV1Simulator.d.ts +206 -0
- package/dist/simulator/FV1Simulator.d.ts.map +1 -0
- package/dist/simulator/FV1Simulator.js +1081 -0
- package/dist/simulator/FV1Simulator.js.map +1 -0
- package/package.json +30 -0
|
@@ -0,0 +1,343 @@
|
|
|
1
|
+
import { Lexer, Parser, ParserError } from './FV1Parser.js';
|
|
2
|
+
import { INSTRUCTION_SET, Encoder } from './FV1Encoder.js';
|
|
3
|
+
export class FV1Assembler {
|
|
4
|
+
constructor(options = {}) {
|
|
5
|
+
this.problems = [];
|
|
6
|
+
this.symbols = new Map();
|
|
7
|
+
this.memories = [];
|
|
8
|
+
this.labels = new Map();
|
|
9
|
+
this.addressToLineMap = new Map();
|
|
10
|
+
this.usedRegisters = new Set();
|
|
11
|
+
this.usedLFOs = new Set();
|
|
12
|
+
this.configuredLFOs = new Set();
|
|
13
|
+
this.userSymbols = new Set();
|
|
14
|
+
this.symbolLines = new Map();
|
|
15
|
+
this.PREDEFINED_SYMBOLS = {
|
|
16
|
+
'SIN0_RATE': 0x00, 'SIN0_RANGE': 0x01, 'SIN1_RATE': 0x02, 'SIN1_RANGE': 0x03,
|
|
17
|
+
'RMP0_RATE': 0x04, 'RMP0_RANGE': 0x05, 'RMP1_RATE': 0x06, 'RMP1_RANGE': 0x07,
|
|
18
|
+
'POT0': 0x10, 'POT1': 0x11, 'POT2': 0x12, 'ADCL': 0x14, 'ADCR': 0x15,
|
|
19
|
+
'DACL': 0x16, 'DACR': 0x17, 'ADDR_PTR': 0x18,
|
|
20
|
+
'SIN0': 0x00, 'SIN1': 0x01, 'RMP0': 0x02, 'RMP1': 0x03,
|
|
21
|
+
'COS0': 0x08, 'COS1': 0x09,
|
|
22
|
+
'RDA': 0x00, 'SOF': 0x02, 'RDAL': 0x03,
|
|
23
|
+
'SIN': 0x00, 'COS': 0x01, 'REG': 0x02, 'COMPC': 0x04,
|
|
24
|
+
'COMPA': 0x08, 'RPTR2': 0x10, 'NA': 0x20,
|
|
25
|
+
'RUN': 0x10, 'ZRC': 0x08, 'ZRO': 0x04,
|
|
26
|
+
'GEZ': 0x02, 'NEG': 0x01
|
|
27
|
+
};
|
|
28
|
+
this.reservedSymbols = new Set();
|
|
29
|
+
this.options = {
|
|
30
|
+
fv1AsmMemBug: options.fv1AsmMemBug ?? true,
|
|
31
|
+
clampReals: options.clampReals ?? true,
|
|
32
|
+
regCount: options.regCount ?? 32,
|
|
33
|
+
progSize: options.progSize ?? 128,
|
|
34
|
+
delaySize: options.delaySize ?? 32768
|
|
35
|
+
};
|
|
36
|
+
this.reset();
|
|
37
|
+
}
|
|
38
|
+
reset() {
|
|
39
|
+
this.problems = [];
|
|
40
|
+
this.symbols.clear();
|
|
41
|
+
this.memories = [];
|
|
42
|
+
this.labels.clear();
|
|
43
|
+
this.addressToLineMap.clear();
|
|
44
|
+
this.usedRegisters.clear();
|
|
45
|
+
this.usedLFOs.clear();
|
|
46
|
+
this.configuredLFOs.clear();
|
|
47
|
+
this.userSymbols.clear();
|
|
48
|
+
this.symbolLines.clear(); // Added this line
|
|
49
|
+
this.initSymbols(); // Added this line
|
|
50
|
+
}
|
|
51
|
+
initSymbols() {
|
|
52
|
+
// Load predefined symbols
|
|
53
|
+
for (const [key, val] of Object.entries(this.PREDEFINED_SYMBOLS)) {
|
|
54
|
+
this.symbols.set(key, val);
|
|
55
|
+
this.reservedSymbols.add(key);
|
|
56
|
+
}
|
|
57
|
+
// Load REG0-31
|
|
58
|
+
for (let i = 0; i < this.options.regCount; i++) {
|
|
59
|
+
this.symbols.set(`REG${i}`, 0x20 + i);
|
|
60
|
+
this.reservedSymbols.add(`REG${i}`);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
assemble(source) {
|
|
64
|
+
this.reset();
|
|
65
|
+
try {
|
|
66
|
+
const lexer = new Lexer(source);
|
|
67
|
+
const tokens = lexer.tokenize();
|
|
68
|
+
const parser = new Parser(tokens);
|
|
69
|
+
const ast = parser.parse();
|
|
70
|
+
this.pass1_ResolveDirectives(ast);
|
|
71
|
+
this.pass2_ResolveLabels(ast);
|
|
72
|
+
const machineCode = this.pass3_GenerateCode(ast);
|
|
73
|
+
return {
|
|
74
|
+
machineCode,
|
|
75
|
+
problems: this.problems,
|
|
76
|
+
labels: this.labels,
|
|
77
|
+
symbols: Array.from(this.symbols.entries())
|
|
78
|
+
.filter(([name]) => this.userSymbols.has(name))
|
|
79
|
+
.map(([name, value]) => ({ name, value: value.toString(), line: this.symbolLines.get(name) })),
|
|
80
|
+
memories: this.memories,
|
|
81
|
+
addressToLineMap: this.addressToLineMap,
|
|
82
|
+
usedRegistersCount: this.usedRegisters.size,
|
|
83
|
+
usedLFOs: Array.from(this.usedLFOs)
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
catch (e) {
|
|
87
|
+
const line = (e instanceof ParserError) ? e.line : 1;
|
|
88
|
+
this.problems.push({ message: `Parser error: ${e instanceof Error ? e.message : String(e)}`, isfatal: true, line });
|
|
89
|
+
return {
|
|
90
|
+
machineCode: [],
|
|
91
|
+
problems: this.problems,
|
|
92
|
+
labels: new Map(),
|
|
93
|
+
symbols: [],
|
|
94
|
+
memories: [],
|
|
95
|
+
addressToLineMap: new Map(),
|
|
96
|
+
usedRegistersCount: 0,
|
|
97
|
+
usedLFOs: []
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
pass1_ResolveDirectives(ast) {
|
|
102
|
+
let nextDelayAddr = 0;
|
|
103
|
+
for (const node of ast) {
|
|
104
|
+
if (node.type === 'Directive') {
|
|
105
|
+
if (node.name === 'EQU') {
|
|
106
|
+
if (this.reservedSymbols.has(node.identifier)) {
|
|
107
|
+
this.problems.push({ message: `Cannot redefine reserved symbol '${node.identifier}'`, isfatal: true, line: node.line });
|
|
108
|
+
}
|
|
109
|
+
else if (this.userSymbols.has(node.identifier)) {
|
|
110
|
+
this.problems.push({ message: `Symbol '${node.identifier}' is already defined on line ${this.symbolLines.get(node.identifier)}`, isfatal: true, line: node.line });
|
|
111
|
+
}
|
|
112
|
+
else {
|
|
113
|
+
const value = this.evaluateExpression(node.expression, node.line);
|
|
114
|
+
this.symbols.set(node.identifier, value);
|
|
115
|
+
this.userSymbols.add(node.identifier);
|
|
116
|
+
this.symbolLines.set(node.identifier, node.line);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
else if (node.name === 'MEM') {
|
|
120
|
+
if (this.reservedSymbols.has(node.identifier)) {
|
|
121
|
+
this.problems.push({ message: `Cannot redefine reserved symbol '${node.identifier}'`, isfatal: true, line: node.line });
|
|
122
|
+
continue;
|
|
123
|
+
}
|
|
124
|
+
const size = this.evaluateExpression(node.expression, node.line);
|
|
125
|
+
const start = nextDelayAddr;
|
|
126
|
+
const middle = start + (size % 2 ? (size - 1) / 2 - 1 : size / 2);
|
|
127
|
+
const end = start + size - 1;
|
|
128
|
+
const buggyEnd = end + (this.options.fv1AsmMemBug ? 1 : 0);
|
|
129
|
+
const mem = { name: node.identifier, size, start, middle, end, line: node.line, original: '' };
|
|
130
|
+
this.memories.push(mem);
|
|
131
|
+
// Register special suffixes
|
|
132
|
+
this.symbols.set(node.identifier, start);
|
|
133
|
+
this.symbols.set(node.identifier + '^', middle);
|
|
134
|
+
this.symbols.set(node.identifier + '#', buggyEnd);
|
|
135
|
+
nextDelayAddr = buggyEnd + 1;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
pass2_ResolveLabels(ast) {
|
|
141
|
+
let pc = 0;
|
|
142
|
+
for (const node of ast) {
|
|
143
|
+
if (node.type === 'Label') {
|
|
144
|
+
this.labels.set(node.name, { line: node.line, instructionLine: pc });
|
|
145
|
+
}
|
|
146
|
+
else if (node.type === 'Instruction') {
|
|
147
|
+
pc++;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
pass3_GenerateCode(ast) {
|
|
152
|
+
const code = [];
|
|
153
|
+
let pc = 0;
|
|
154
|
+
for (const node of ast) {
|
|
155
|
+
if (node.type === 'Instruction') {
|
|
156
|
+
const schema = INSTRUCTION_SET[node.mnemonic];
|
|
157
|
+
if (!schema) {
|
|
158
|
+
this.problems.push({ message: `Unknown instruction ${node.mnemonic}`, isfatal: true, line: node.line });
|
|
159
|
+
code.push(0);
|
|
160
|
+
continue;
|
|
161
|
+
}
|
|
162
|
+
let operands = node.operands.map(op => {
|
|
163
|
+
// Special case for labels in JMP/SKP
|
|
164
|
+
if (op.type === 'Identifier' && this.labels.has(op.name)) {
|
|
165
|
+
return this.labels.get(op.name).instructionLine - pc - 1;
|
|
166
|
+
}
|
|
167
|
+
return this.evaluateExpression(op, node.line);
|
|
168
|
+
});
|
|
169
|
+
// --- Specialized Encoding Logic ---
|
|
170
|
+
// LFO Tracking for configurations
|
|
171
|
+
if (node.mnemonic === 'WLDS' || node.mnemonic === 'WLDR') {
|
|
172
|
+
const lfoReg = operands[0];
|
|
173
|
+
const lfoName = this.getLFOName(lfoReg);
|
|
174
|
+
if (lfoName) {
|
|
175
|
+
if (node.mnemonic === 'WLDS') {
|
|
176
|
+
if (this.configuredLFOs.has(lfoName)) {
|
|
177
|
+
this.problems.push({ message: `LFO ${lfoName} is configured more than once`, isfatal: true, line: node.line });
|
|
178
|
+
}
|
|
179
|
+
this.configuredLFOs.add(lfoName);
|
|
180
|
+
}
|
|
181
|
+
this.usedLFOs.add(lfoName);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
if (node.mnemonic === 'CHO') {
|
|
185
|
+
const mode = operands[0];
|
|
186
|
+
const n = operands[1];
|
|
187
|
+
const rdaMode = this.symbols.get('RDA');
|
|
188
|
+
const sofMode = this.symbols.get('SOF');
|
|
189
|
+
const rdalMode = this.symbols.get('RDAL');
|
|
190
|
+
if (mode === rdalMode) {
|
|
191
|
+
// CHO RDAL, N -> [mode, flags=0x02(fixed bit 25), n, param=0]
|
|
192
|
+
operands = [mode, 0x02, n, 0];
|
|
193
|
+
}
|
|
194
|
+
else if (mode === rdaMode || mode === sofMode) {
|
|
195
|
+
const flags = operands[2];
|
|
196
|
+
let param = operands[3];
|
|
197
|
+
if (mode === sofMode) {
|
|
198
|
+
param = Encoder.encode('S1_14', param);
|
|
199
|
+
}
|
|
200
|
+
operands = [mode, flags, n, param];
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
else if (node.mnemonic === 'WLDR') {
|
|
204
|
+
// Match previous backwards-encoded amplitude
|
|
205
|
+
let ampl = operands[2];
|
|
206
|
+
switch (ampl) {
|
|
207
|
+
case 512:
|
|
208
|
+
ampl = 3;
|
|
209
|
+
break;
|
|
210
|
+
case 1024:
|
|
211
|
+
ampl = 2;
|
|
212
|
+
break;
|
|
213
|
+
case 2048:
|
|
214
|
+
ampl = 1;
|
|
215
|
+
break;
|
|
216
|
+
case 4096:
|
|
217
|
+
ampl = 0;
|
|
218
|
+
break;
|
|
219
|
+
default:
|
|
220
|
+
this.problems.push({ message: `Invalid amplitude ${ampl} for WLDR`, isfatal: true, line: node.line });
|
|
221
|
+
}
|
|
222
|
+
// Handle RMP LFO mapping
|
|
223
|
+
let rmpLfo = operands[0];
|
|
224
|
+
if ([0, 2].includes(rmpLfo))
|
|
225
|
+
rmpLfo = 0;
|
|
226
|
+
else if ([1, 3].includes(rmpLfo))
|
|
227
|
+
rmpLfo = 1;
|
|
228
|
+
operands = [rmpLfo, operands[1], ampl];
|
|
229
|
+
}
|
|
230
|
+
else if (node.mnemonic === 'JAM') {
|
|
231
|
+
let rmpLfo = operands[0];
|
|
232
|
+
if ([0, 2].includes(rmpLfo))
|
|
233
|
+
rmpLfo = 0;
|
|
234
|
+
else if ([1, 3].includes(rmpLfo))
|
|
235
|
+
rmpLfo = 1;
|
|
236
|
+
operands = [rmpLfo];
|
|
237
|
+
}
|
|
238
|
+
// Track register usage
|
|
239
|
+
schema.fields.forEach((field, i) => {
|
|
240
|
+
if (field.type === 'REG' && operands[i] !== undefined) {
|
|
241
|
+
this.trackRegister(operands[i], node.line);
|
|
242
|
+
}
|
|
243
|
+
});
|
|
244
|
+
// Additional LFO tracking for register writes to RATE/RANGE
|
|
245
|
+
if (node.mnemonic === 'WRAX' || node.mnemonic === 'RDAX') {
|
|
246
|
+
const regNum = operands[0];
|
|
247
|
+
const lfoName = this.getLFONameFromRegister(regNum);
|
|
248
|
+
if (lfoName) {
|
|
249
|
+
this.usedLFOs.add(lfoName);
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
code.push(Encoder.assembleInstruction(node.mnemonic, operands, schema));
|
|
253
|
+
this.addressToLineMap.set(pc, node.line);
|
|
254
|
+
pc++;
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
// Pad to progSize
|
|
258
|
+
while (code.length < this.options.progSize)
|
|
259
|
+
code.push(0x00000011); // NOP
|
|
260
|
+
return code;
|
|
261
|
+
}
|
|
262
|
+
trackRegister(addr, line) {
|
|
263
|
+
if (addr >= 0x20 && addr <= 0x3F) {
|
|
264
|
+
const regNum = addr - 0x20;
|
|
265
|
+
if (regNum >= this.options.regCount) {
|
|
266
|
+
this.problems.push({ message: `Register REG${regNum} exceeds limit ${this.options.regCount}`, isfatal: true, line });
|
|
267
|
+
}
|
|
268
|
+
this.usedRegisters.add(regNum);
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
getLFOName(lfoId) {
|
|
272
|
+
switch (lfoId) {
|
|
273
|
+
case 0: return 'SIN0';
|
|
274
|
+
case 1: return 'SIN1';
|
|
275
|
+
case 2: return 'RMP0';
|
|
276
|
+
case 3: return 'RMP1';
|
|
277
|
+
default: return null;
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
getLFONameFromRegister(addr) {
|
|
281
|
+
// 0x00=SIN0_RATE, 0x01=SIN0_RANGE, 0x02=SIN1_RATE, 0x03=SIN1_RANGE
|
|
282
|
+
// 0x04=RMP0_RATE, 0x05=RMP0_RANGE, 0x06=RMP1_RATE, 0x07=RMP1_RANGE
|
|
283
|
+
switch (addr) {
|
|
284
|
+
case 0x00:
|
|
285
|
+
case 0x01: return 'SIN0';
|
|
286
|
+
case 0x02:
|
|
287
|
+
case 0x03: return 'SIN1';
|
|
288
|
+
case 0x04:
|
|
289
|
+
case 0x05: return 'RMP0';
|
|
290
|
+
case 0x06:
|
|
291
|
+
case 0x07: return 'RMP1';
|
|
292
|
+
default: return null;
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
evaluateExpression(expr, line) {
|
|
296
|
+
switch (expr.type) {
|
|
297
|
+
case 'Number': return expr.value;
|
|
298
|
+
case 'Identifier':
|
|
299
|
+
if (this.symbols.has(expr.name))
|
|
300
|
+
return this.symbols.get(expr.name);
|
|
301
|
+
this.problems.push({ message: `Undefined symbol ${expr.name}`, isfatal: true, line });
|
|
302
|
+
return 0;
|
|
303
|
+
case 'Binary':
|
|
304
|
+
const left = this.evaluateExpression(expr.left, line);
|
|
305
|
+
const right = this.evaluateExpression(expr.right, line);
|
|
306
|
+
switch (expr.operator) {
|
|
307
|
+
case '+': return left + right;
|
|
308
|
+
case '-': return left - right;
|
|
309
|
+
case '*': return left * right;
|
|
310
|
+
case '/': return left / right;
|
|
311
|
+
case '|': return left | right;
|
|
312
|
+
case '&': return left & right;
|
|
313
|
+
case '^': return left ^ right;
|
|
314
|
+
case '<': return (left << right) >>> 0;
|
|
315
|
+
case '>': return (left >>> right);
|
|
316
|
+
default: return 0;
|
|
317
|
+
}
|
|
318
|
+
case 'Unary':
|
|
319
|
+
const val = this.evaluateExpression(expr.expression, line);
|
|
320
|
+
if (expr.operator === '-')
|
|
321
|
+
return -val;
|
|
322
|
+
if (expr.operator === '!')
|
|
323
|
+
return (~Math.floor(val)) >>> 0;
|
|
324
|
+
return val;
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
static formatMachineCode(machineCode) {
|
|
328
|
+
return machineCode.map((word, index) => `${index.toString().padStart(4, '0')}\t${word.toString(16).toUpperCase().padStart(8, '0')}`).join('\n');
|
|
329
|
+
}
|
|
330
|
+
static toUint8Array(machineCode) {
|
|
331
|
+
const buffer = new ArrayBuffer(machineCode.length * 4);
|
|
332
|
+
const view = new DataView(buffer);
|
|
333
|
+
machineCode.forEach((val, i) => view.setUint32(i * 4, val, false));
|
|
334
|
+
return new Uint8Array(buffer);
|
|
335
|
+
}
|
|
336
|
+
static getMiddleAddr(start, size) {
|
|
337
|
+
return start + (size % 2 ? (size - 1) / 2 - 1 : size / 2);
|
|
338
|
+
}
|
|
339
|
+
static getEndAddr(start, size, fv1AsmMemBug) {
|
|
340
|
+
return start + size - 1 + (fv1AsmMemBug ? 1 : 0);
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
//# sourceMappingURL=FV1Assembler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FV1Assembler.js","sourceRoot":"","sources":["../../src/assembler/FV1Assembler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export interface EncodingField {
|
|
2
|
+
name: string;
|
|
3
|
+
bits: number;
|
|
4
|
+
offset: number;
|
|
5
|
+
type?: 'S1_14' | 'S_15' | 'S1_9' | 'S_10' | 'S4_6' | 'U' | 'S' | 'REG' | 'ADDR' | 'LFO';
|
|
6
|
+
value?: number;
|
|
7
|
+
}
|
|
8
|
+
export interface InstructionSchema {
|
|
9
|
+
opcode: number;
|
|
10
|
+
fields: EncodingField[];
|
|
11
|
+
}
|
|
12
|
+
export declare const INSTRUCTION_SET: Record<string, InstructionSchema>;
|
|
13
|
+
export declare class Encoder {
|
|
14
|
+
static encode(format: string, value: number): number;
|
|
15
|
+
private static toFixedPoint;
|
|
16
|
+
static assembleInstruction(mnemonic: string, operands: number[], schema: InstructionSchema): number;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=FV1Encoder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FV1Encoder.d.ts","sourceRoot":"","sources":["../../src/assembler/FV1Encoder.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,aAAa;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,GAAG,GAAG,GAAG,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,CAAC;IACxF,KAAK,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,iBAAiB;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,aAAa,EAAE,CAAC;CAC3B;AAED,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CA4L7D,CAAC;AAEF,qBAAa,OAAO;WACF,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM;IAW3D,OAAO,CAAC,MAAM,CAAC,YAAY;WAcb,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,iBAAiB,GAAG,MAAM;CAmB7G"}
|
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
export const INSTRUCTION_SET = {
|
|
2
|
+
// Accumulator
|
|
3
|
+
'SOF': {
|
|
4
|
+
opcode: 0b01101, fields: [
|
|
5
|
+
{ name: 'coeff', bits: 16, offset: 16, type: 'S1_14' },
|
|
6
|
+
{ name: 'd', bits: 11, offset: 5, type: 'S_10' },
|
|
7
|
+
{ name: 'op', bits: 5, offset: 0, value: 0b01101 }
|
|
8
|
+
]
|
|
9
|
+
},
|
|
10
|
+
'AND': {
|
|
11
|
+
opcode: 0b01110, fields: [
|
|
12
|
+
{ name: 'mask', bits: 24, offset: 8, type: 'U' },
|
|
13
|
+
{ name: 'op', bits: 8, offset: 0, value: 0b01110 }
|
|
14
|
+
]
|
|
15
|
+
},
|
|
16
|
+
'OR': {
|
|
17
|
+
opcode: 0b01111, fields: [
|
|
18
|
+
{ name: 'mask', bits: 24, offset: 8, type: 'U' },
|
|
19
|
+
{ name: 'op', bits: 8, offset: 0, value: 0b01111 }
|
|
20
|
+
]
|
|
21
|
+
},
|
|
22
|
+
'XOR': {
|
|
23
|
+
opcode: 0b10000, fields: [
|
|
24
|
+
{ name: 'mask', bits: 24, offset: 8, type: 'U' },
|
|
25
|
+
{ name: 'op', bits: 8, offset: 0, value: 0b10000 }
|
|
26
|
+
]
|
|
27
|
+
},
|
|
28
|
+
'LOG': {
|
|
29
|
+
opcode: 0b01011, fields: [
|
|
30
|
+
{ name: 'coeff', bits: 16, offset: 16, type: 'S1_14' },
|
|
31
|
+
{ name: 'd', bits: 11, offset: 5, type: 'S4_6' },
|
|
32
|
+
{ name: 'op', bits: 5, offset: 0, value: 0b01011 }
|
|
33
|
+
]
|
|
34
|
+
},
|
|
35
|
+
'EXP': {
|
|
36
|
+
opcode: 0b01100, fields: [
|
|
37
|
+
{ name: 'coeff', bits: 16, offset: 16, type: 'S1_14' },
|
|
38
|
+
{ name: 'd', bits: 11, offset: 5, type: 'S_10' },
|
|
39
|
+
{ name: 'op', bits: 5, offset: 0, value: 0b01100 }
|
|
40
|
+
]
|
|
41
|
+
},
|
|
42
|
+
'SKP': {
|
|
43
|
+
opcode: 0b10001, fields: [
|
|
44
|
+
{ name: 'flags', bits: 5, offset: 27, type: 'LFO' }, // Special handling for flag bits
|
|
45
|
+
{ name: 'n', bits: 6, offset: 21, type: 'S' },
|
|
46
|
+
{ name: 'op', bits: 5, offset: 0, value: 0b10001 }
|
|
47
|
+
]
|
|
48
|
+
},
|
|
49
|
+
'JMP': {
|
|
50
|
+
opcode: 0b10001, fields: [
|
|
51
|
+
{ name: 'flags', bits: 5, offset: 27, value: 0 },
|
|
52
|
+
{ name: 'n', bits: 6, offset: 21, type: 'S' },
|
|
53
|
+
{ name: 'op', bits: 5, offset: 0, value: 0b10001 }
|
|
54
|
+
]
|
|
55
|
+
},
|
|
56
|
+
'NOP': {
|
|
57
|
+
opcode: 0b10001, fields: [
|
|
58
|
+
{ name: 'flags', bits: 5, offset: 27, value: 0 },
|
|
59
|
+
{ name: 'n', bits: 6, offset: 21, value: 0 },
|
|
60
|
+
{ name: 'op', bits: 5, offset: 0, value: 0b10001 }
|
|
61
|
+
]
|
|
62
|
+
},
|
|
63
|
+
// Register
|
|
64
|
+
'RDAX': {
|
|
65
|
+
opcode: 0b00100, fields: [
|
|
66
|
+
{ name: 'addr', bits: 6, offset: 5, type: 'REG' },
|
|
67
|
+
{ name: 'coeff', bits: 16, offset: 16, type: 'S1_14' },
|
|
68
|
+
{ name: 'op', bits: 5, offset: 0, value: 0b00100 }
|
|
69
|
+
]
|
|
70
|
+
},
|
|
71
|
+
'WRAX': {
|
|
72
|
+
opcode: 0b00110, fields: [
|
|
73
|
+
{ name: 'addr', bits: 6, offset: 5, type: 'REG' },
|
|
74
|
+
{ name: 'coeff', bits: 16, offset: 16, type: 'S1_14' },
|
|
75
|
+
{ name: 'op', bits: 5, offset: 0, value: 0b00110 }
|
|
76
|
+
]
|
|
77
|
+
},
|
|
78
|
+
'MAXX': {
|
|
79
|
+
opcode: 0b01001, fields: [
|
|
80
|
+
{ name: 'addr', bits: 6, offset: 5, type: 'REG' },
|
|
81
|
+
{ name: 'coeff', bits: 16, offset: 16, type: 'S1_14' },
|
|
82
|
+
{ name: 'op', bits: 5, offset: 0, value: 0b01001 }
|
|
83
|
+
]
|
|
84
|
+
},
|
|
85
|
+
'MULX': {
|
|
86
|
+
opcode: 0b01010, fields: [
|
|
87
|
+
{ name: 'addr', bits: 6, offset: 5, type: 'REG' },
|
|
88
|
+
{ name: 'op', bits: 5, offset: 0, value: 0b01010 }
|
|
89
|
+
]
|
|
90
|
+
},
|
|
91
|
+
'RDFX': {
|
|
92
|
+
opcode: 0b00101, fields: [
|
|
93
|
+
{ name: 'addr', bits: 6, offset: 5, type: 'REG' },
|
|
94
|
+
{ name: 'coeff', bits: 16, offset: 16, type: 'S1_14' },
|
|
95
|
+
{ name: 'op', bits: 5, offset: 0, value: 0b00101 }
|
|
96
|
+
]
|
|
97
|
+
},
|
|
98
|
+
'WRLX': {
|
|
99
|
+
opcode: 0b01000, fields: [
|
|
100
|
+
{ name: 'addr', bits: 6, offset: 5, type: 'REG' },
|
|
101
|
+
{ name: 'coeff', bits: 16, offset: 16, type: 'S1_14' },
|
|
102
|
+
{ name: 'op', bits: 5, offset: 0, value: 0b01000 }
|
|
103
|
+
]
|
|
104
|
+
},
|
|
105
|
+
'WRHX': {
|
|
106
|
+
opcode: 0b00111, fields: [
|
|
107
|
+
{ name: 'addr', bits: 6, offset: 5, type: 'REG' },
|
|
108
|
+
{ name: 'coeff', bits: 16, offset: 16, type: 'S1_14' },
|
|
109
|
+
{ name: 'op', bits: 5, offset: 0, value: 0b00111 }
|
|
110
|
+
]
|
|
111
|
+
},
|
|
112
|
+
'LDAX': {
|
|
113
|
+
opcode: 0b00101, fields: [
|
|
114
|
+
{ name: 'coeff', bits: 16, offset: 16, value: 0 },
|
|
115
|
+
{ name: 'addr', bits: 6, offset: 5, type: 'REG' },
|
|
116
|
+
{ name: 'op', bits: 5, offset: 0, value: 0b00101 }
|
|
117
|
+
]
|
|
118
|
+
},
|
|
119
|
+
// Delay RAM
|
|
120
|
+
'RDA': {
|
|
121
|
+
opcode: 0b00000, fields: [
|
|
122
|
+
{ name: 'addr', bits: 16, offset: 5, type: 'ADDR' },
|
|
123
|
+
{ name: 'coeff', bits: 11, offset: 21, type: 'S1_9' },
|
|
124
|
+
{ name: 'op', bits: 5, offset: 0, value: 0b00000 }
|
|
125
|
+
]
|
|
126
|
+
},
|
|
127
|
+
'RMPA': {
|
|
128
|
+
opcode: 0b00001, fields: [
|
|
129
|
+
{ name: 'coeff', bits: 11, offset: 21, type: 'S1_9' },
|
|
130
|
+
{ name: 'op', bits: 5, offset: 0, value: 0b00001 }
|
|
131
|
+
]
|
|
132
|
+
},
|
|
133
|
+
'WRA': {
|
|
134
|
+
opcode: 0b00010, fields: [
|
|
135
|
+
{ name: 'addr', bits: 16, offset: 5, type: 'ADDR' },
|
|
136
|
+
{ name: 'coeff', bits: 11, offset: 21, type: 'S1_9' },
|
|
137
|
+
{ name: 'op', bits: 5, offset: 0, value: 0b00010 }
|
|
138
|
+
]
|
|
139
|
+
},
|
|
140
|
+
'WRAP': {
|
|
141
|
+
opcode: 0b00011, fields: [
|
|
142
|
+
{ name: 'addr', bits: 16, offset: 5, type: 'ADDR' },
|
|
143
|
+
{ name: 'coeff', bits: 11, offset: 21, type: 'S1_9' },
|
|
144
|
+
{ name: 'op', bits: 5, offset: 0, value: 0b00011 }
|
|
145
|
+
]
|
|
146
|
+
},
|
|
147
|
+
// LFO/CHO
|
|
148
|
+
'WLDS': {
|
|
149
|
+
opcode: 0b10010, fields: [
|
|
150
|
+
{ name: 'sinLfo', bits: 1, offset: 29, type: 'U' }, // N
|
|
151
|
+
{ name: 'freq', bits: 9, offset: 20, type: 'U' }, // F
|
|
152
|
+
{ name: 'ampl', bits: 15, offset: 5, type: 'U' }, // A
|
|
153
|
+
{ name: 'op', bits: 5, offset: 0, value: 0b10010 }
|
|
154
|
+
]
|
|
155
|
+
},
|
|
156
|
+
'WLDR': {
|
|
157
|
+
opcode: 0b10010, fields: [
|
|
158
|
+
{ name: 'type', bits: 1, offset: 30, value: 1 }, // Always 1 for WLDR
|
|
159
|
+
{ name: 'rmpLfo', bits: 1, offset: 29, type: 'U' }, // N
|
|
160
|
+
{ name: 'freq', bits: 16, offset: 13, type: 'U' }, // F (signed 16-bit)
|
|
161
|
+
{ name: 'ampl', bits: 2, offset: 5, type: 'U' }, // A (backward encoding handled in assembler)
|
|
162
|
+
{ name: 'op', bits: 5, offset: 0, value: 0b10010 }
|
|
163
|
+
]
|
|
164
|
+
},
|
|
165
|
+
'JAM': {
|
|
166
|
+
opcode: 0b10011, fields: [
|
|
167
|
+
{ name: 'rmpLfo', bits: 1, offset: 6, type: 'U' },
|
|
168
|
+
{ name: 'type', bits: 1, offset: 7, value: 1 },
|
|
169
|
+
{ name: 'op', bits: 5, offset: 0, value: 0b10011 }
|
|
170
|
+
]
|
|
171
|
+
},
|
|
172
|
+
'CHO': {
|
|
173
|
+
opcode: 0b10100, fields: [
|
|
174
|
+
{ name: 'mode', bits: 2, offset: 30, type: 'U' },
|
|
175
|
+
{ name: 'flags', bits: 6, offset: 24, type: 'U' },
|
|
176
|
+
{ name: 'n', bits: 3, offset: 21, type: 'U' },
|
|
177
|
+
{ name: 'param', bits: 16, offset: 5, type: 'ADDR' }, // Can be addr or coeff
|
|
178
|
+
{ name: 'op', bits: 5, offset: 0, value: 0b10100 }
|
|
179
|
+
]
|
|
180
|
+
},
|
|
181
|
+
// Pseudo-ops
|
|
182
|
+
'CLR': { opcode: 0b01110, fields: [{ name: 'val', bits: 32, offset: 0, value: 0b01110 }] },
|
|
183
|
+
'NOT': { opcode: 0b10000, fields: [{ name: 'val', bits: 32, offset: 0, value: 0b10000 }] },
|
|
184
|
+
'ABSA': { opcode: 0b01001, fields: [{ name: 'val', bits: 32, offset: 0, value: 0b01001 }] },
|
|
185
|
+
};
|
|
186
|
+
export class Encoder {
|
|
187
|
+
static encode(format, value) {
|
|
188
|
+
switch (format) {
|
|
189
|
+
case 'S1_14': return this.toFixedPoint(value, 1, 14, 2.0);
|
|
190
|
+
case 'S_15': return this.toFixedPoint(value, 0, 15, 1.0);
|
|
191
|
+
case 'S1_9': return this.toFixedPoint(value, 1, 9, 2.0);
|
|
192
|
+
case 'S_10': return this.toFixedPoint(value, 0, 10, 1.0);
|
|
193
|
+
case 'S4_6': return this.toFixedPoint(value, 4, 6, 16.0);
|
|
194
|
+
}
|
|
195
|
+
return value;
|
|
196
|
+
}
|
|
197
|
+
static toFixedPoint(value, intBits, fracBits, maxValue) {
|
|
198
|
+
const lsb = maxValue / (1 << fracBits);
|
|
199
|
+
const min = -maxValue;
|
|
200
|
+
const max = maxValue - lsb;
|
|
201
|
+
let num = Math.min(Math.max(value, min), max);
|
|
202
|
+
let encoded = Math.trunc(num * (1 << fracBits));
|
|
203
|
+
const totalBits = 1 + intBits + fracBits;
|
|
204
|
+
const mask = (1 << totalBits) - 1;
|
|
205
|
+
return (encoded < 0) ? (encoded + (1 << totalBits)) & mask : encoded & mask;
|
|
206
|
+
}
|
|
207
|
+
static assembleInstruction(mnemonic, operands, schema) {
|
|
208
|
+
let result = 0;
|
|
209
|
+
let operandIdx = 0;
|
|
210
|
+
for (const field of schema.fields) {
|
|
211
|
+
let val = 0;
|
|
212
|
+
if (field.value !== undefined) {
|
|
213
|
+
val = field.value;
|
|
214
|
+
}
|
|
215
|
+
else {
|
|
216
|
+
val = operands[operandIdx++];
|
|
217
|
+
if (field.type)
|
|
218
|
+
val = this.encode(field.type, val);
|
|
219
|
+
}
|
|
220
|
+
const mask = field.bits === 32 ? 0xFFFFFFFF : (1 << field.bits) - 1;
|
|
221
|
+
result |= (val & mask) << field.offset;
|
|
222
|
+
}
|
|
223
|
+
return result >>> 0;
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
//# sourceMappingURL=FV1Encoder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FV1Encoder.js","sourceRoot":"","sources":["../../src/assembler/FV1Encoder.ts"],"names":[],"mappings":"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"}
|