@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.
@@ -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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"}