@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,74 @@
1
+ export declare enum AlgTokenType {
2
+ IDENTIFIER = 0,
3
+ NUMBER = 1,
4
+ OPERATOR = 2,
5
+ ASSIGN = 3,
6
+ LPAREN = 4,
7
+ RPAREN = 5,
8
+ COMMA = 6,
9
+ EOF = 7
10
+ }
11
+ export interface AlgToken {
12
+ type: AlgTokenType;
13
+ value: string;
14
+ pos: number;
15
+ }
16
+ export declare class AlgebraicLexer {
17
+ private source;
18
+ private pos;
19
+ constructor(source: string);
20
+ private peek;
21
+ private advance;
22
+ tokenize(): AlgToken[];
23
+ private isNumberStart;
24
+ private readIdentifier;
25
+ private readNumber;
26
+ private readOperatorOrAssign;
27
+ }
28
+ export type Expr = {
29
+ type: 'Identifier';
30
+ name: string;
31
+ } | {
32
+ type: 'Number';
33
+ value: string;
34
+ } | {
35
+ type: 'Binary';
36
+ left: Expr;
37
+ operator: string;
38
+ right: Expr;
39
+ } | {
40
+ type: 'Call';
41
+ name: string;
42
+ args: Expr[];
43
+ };
44
+ export type Statement = {
45
+ type: 'Assignment';
46
+ left: Expr;
47
+ operator: string;
48
+ right: Expr;
49
+ };
50
+ export declare class AlgebraicParser {
51
+ private tokens;
52
+ private pos;
53
+ constructor(tokens: AlgToken[]);
54
+ private peek;
55
+ private advance;
56
+ private match;
57
+ parse(): Statement | null;
58
+ private parseExpression;
59
+ private parseTerm;
60
+ private parseFactor;
61
+ private parsePrimary;
62
+ }
63
+ export declare class AlgebraicCompiler {
64
+ /**
65
+ * Attempts to compile an algebraic line into an FV-1 assembly instruction.
66
+ * Returns the compiled instruction string, or null if it's not a valid algebraic expression.
67
+ */
68
+ evaluateConstantExpression(code: string): number | null;
69
+ compileLine(line: string, isMemoryCheck: (id: string) => boolean, onError?: (msg: string) => void): string | null;
70
+ private generateCode;
71
+ private evaluateConstant;
72
+ private compileAccumulate;
73
+ }
74
+ //# sourceMappingURL=AlgebraicCompiler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AlgebraicCompiler.d.ts","sourceRoot":"","sources":["../../src/assembler/AlgebraicCompiler.ts"],"names":[],"mappings":"AAEA,oBAAY,YAAY;IACpB,UAAU,IAAA;IACV,MAAM,IAAA;IACN,QAAQ,IAAA;IACR,MAAM,IAAA;IACN,MAAM,IAAA;IACN,MAAM,IAAA;IACN,KAAK,IAAA;IACL,GAAG,IAAA;CACN;AAED,MAAM,WAAW,QAAQ;IACrB,IAAI,EAAE,YAAY,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;CACf;AAED,qBAAa,cAAc;IAGX,OAAO,CAAC,MAAM;IAF1B,OAAO,CAAC,GAAG,CAAK;gBAEI,MAAM,EAAE,MAAM;IAElC,OAAO,CAAC,IAAI;IAIZ,OAAO,CAAC,OAAO;IAIR,QAAQ,IAAI,QAAQ,EAAE;IA6B7B,OAAO,CAAC,aAAa;IAuBrB,OAAO,CAAC,cAAc;IAStB,OAAO,CAAC,UAAU;IAUlB,OAAO,CAAC,oBAAoB;CAgB/B;AAED,MAAM,MAAM,IAAI,GACV;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACpC;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACjC;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,IAAI,EAAE,IAAI,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,IAAI,CAAA;CAAE,GAC7D;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,IAAI,EAAE,CAAA;CAAE,CAAC;AAEnD,MAAM,MAAM,SAAS,GACf;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,IAAI,EAAE,IAAI,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,IAAI,CAAA;CAAE,CAAC;AAExE,qBAAa,eAAe;IAGZ,OAAO,CAAC,MAAM;IAF1B,OAAO,CAAC,GAAG,CAAK;gBAEI,MAAM,EAAE,QAAQ,EAAE;IAEtC,OAAO,CAAC,IAAI;IAIZ,OAAO,CAAC,OAAO;IAIf,OAAO,CAAC,KAAK;IAKN,KAAK,IAAI,SAAS,GAAG,IAAI;IAehC,OAAO,CAAC,eAAe;IAIvB,OAAO,CAAC,SAAS;IAYjB,OAAO,CAAC,WAAW;IAYnB,OAAO,CAAC,YAAY;CAoCvB;AAED,qBAAa,iBAAiB;IAC1B;;;OAGG;IACI,0BAA0B,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAgBvD,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,OAAO,EAAE,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,GAAG,MAAM,GAAG,IAAI;IAyCxH,OAAO,CAAC,YAAY;IAuKpB,OAAO,CAAC,gBAAgB;IA2BxB,OAAO,CAAC,iBAAiB;CAqC5B"}
@@ -0,0 +1,473 @@
1
+ export var AlgTokenType;
2
+ (function (AlgTokenType) {
3
+ AlgTokenType[AlgTokenType["IDENTIFIER"] = 0] = "IDENTIFIER";
4
+ AlgTokenType[AlgTokenType["NUMBER"] = 1] = "NUMBER";
5
+ AlgTokenType[AlgTokenType["OPERATOR"] = 2] = "OPERATOR";
6
+ AlgTokenType[AlgTokenType["ASSIGN"] = 3] = "ASSIGN";
7
+ AlgTokenType[AlgTokenType["LPAREN"] = 4] = "LPAREN";
8
+ AlgTokenType[AlgTokenType["RPAREN"] = 5] = "RPAREN";
9
+ AlgTokenType[AlgTokenType["COMMA"] = 6] = "COMMA";
10
+ AlgTokenType[AlgTokenType["EOF"] = 7] = "EOF";
11
+ })(AlgTokenType || (AlgTokenType = {}));
12
+ export class AlgebraicLexer {
13
+ constructor(source) {
14
+ this.source = source;
15
+ this.pos = 0;
16
+ }
17
+ peek() {
18
+ return this.source[this.pos] || '';
19
+ }
20
+ advance() {
21
+ return this.source[this.pos++] || '';
22
+ }
23
+ tokenize() {
24
+ const tokens = [];
25
+ while (this.pos < this.source.length) {
26
+ const char = this.peek();
27
+ if (/\s/.test(char)) {
28
+ this.advance();
29
+ }
30
+ else if (char === '(') {
31
+ tokens.push({ type: AlgTokenType.LPAREN, value: this.advance(), pos: this.pos - 1 });
32
+ }
33
+ else if (char === ')') {
34
+ tokens.push({ type: AlgTokenType.RPAREN, value: this.advance(), pos: this.pos - 1 });
35
+ }
36
+ else if (char === ',') {
37
+ tokens.push({ type: AlgTokenType.COMMA, value: this.advance(), pos: this.pos - 1 });
38
+ }
39
+ else if (/[a-zA-Z_@\$]/.test(char)) {
40
+ tokens.push(this.readIdentifier());
41
+ }
42
+ else if (/[0-9\.\-]/.test(char) && this.isNumberStart(tokens.length > 0 ? tokens[tokens.length - 1] : null)) {
43
+ tokens.push(this.readNumber());
44
+ }
45
+ else if (/[=+\-*/&|^]/.test(char)) {
46
+ tokens.push(this.readOperatorOrAssign());
47
+ }
48
+ else {
49
+ throw new Error(`Unexpected character '${char}' at position ${this.pos}`);
50
+ }
51
+ }
52
+ tokens.push({ type: AlgTokenType.EOF, value: '', pos: this.pos });
53
+ return tokens;
54
+ }
55
+ isNumberStart(prevToken) {
56
+ const char = this.peek();
57
+ if (/[0-9\.]/.test(char))
58
+ return true;
59
+ // Handle negative numbers like -1.0 vs subtraction
60
+ if (char === '-') {
61
+ const next = this.source[this.pos + 1];
62
+ if (next && /[0-9\.]/.test(next)) {
63
+ // Heuristic: if previous token was an identifier, number, or closing paren, it's subtraction.
64
+ // Otherwise it's unary minus/negative number.
65
+ if (prevToken) {
66
+ if (prevToken.type === AlgTokenType.IDENTIFIER ||
67
+ prevToken.type === AlgTokenType.NUMBER ||
68
+ prevToken.type === AlgTokenType.RPAREN) {
69
+ return false; // It's subtraction
70
+ }
71
+ }
72
+ return true; // Unary minus (negative number)
73
+ }
74
+ }
75
+ return false;
76
+ }
77
+ readIdentifier() {
78
+ let value = '';
79
+ const startPos = this.pos;
80
+ while (/[a-zA-Z0-9_\.\@\$\{\}]/.test(this.peek())) {
81
+ value += this.advance();
82
+ }
83
+ return { type: AlgTokenType.IDENTIFIER, value, pos: startPos };
84
+ }
85
+ readNumber() {
86
+ let value = '';
87
+ const startPos = this.pos;
88
+ if (this.peek() === '-')
89
+ value += this.advance();
90
+ while (/[0-9\.]/.test(this.peek())) {
91
+ value += this.advance();
92
+ }
93
+ return { type: AlgTokenType.NUMBER, value, pos: startPos };
94
+ }
95
+ readOperatorOrAssign() {
96
+ const startPos = this.pos;
97
+ const char = this.advance();
98
+ const next = this.peek();
99
+ if (next === '=') {
100
+ this.advance();
101
+ return { type: AlgTokenType.ASSIGN, value: char + '=', pos: startPos };
102
+ }
103
+ if (char === '=') {
104
+ return { type: AlgTokenType.ASSIGN, value: '=', pos: startPos };
105
+ }
106
+ return { type: AlgTokenType.OPERATOR, value: char, pos: startPos };
107
+ }
108
+ }
109
+ export class AlgebraicParser {
110
+ constructor(tokens) {
111
+ this.tokens = tokens;
112
+ this.pos = 0;
113
+ }
114
+ peek() {
115
+ return this.tokens[this.pos] || { type: AlgTokenType.EOF, value: '', pos: -1 };
116
+ }
117
+ advance() {
118
+ return this.tokens[this.pos++];
119
+ }
120
+ match(type) {
121
+ if (this.peek().type === type)
122
+ return this.advance();
123
+ return null;
124
+ }
125
+ parse() {
126
+ if (this.tokens.length === 0 || this.peek().type === AlgTokenType.EOF)
127
+ return null;
128
+ // Try to parse an assignment statement
129
+ const left = this.parseExpression();
130
+ const assignToken = this.match(AlgTokenType.ASSIGN);
131
+ if (assignToken) {
132
+ const right = this.parseExpression();
133
+ return { type: 'Assignment', left, operator: assignToken.value, right };
134
+ }
135
+ return null; // Not an assignment
136
+ }
137
+ parseExpression() {
138
+ return this.parseTerm();
139
+ }
140
+ parseTerm() {
141
+ let left = this.parseFactor();
142
+ while (this.peek().type === AlgTokenType.OPERATOR && ['+', '-'].includes(this.peek().value)) {
143
+ const op = this.advance().value;
144
+ const right = this.parseFactor();
145
+ left = { type: 'Binary', left, operator: op, right };
146
+ }
147
+ return left;
148
+ }
149
+ parseFactor() {
150
+ let left = this.parsePrimary();
151
+ while (this.peek().type === AlgTokenType.OPERATOR && ['*', '/', '&', '|', '^'].includes(this.peek().value)) {
152
+ const op = this.advance().value;
153
+ const right = this.parsePrimary();
154
+ left = { type: 'Binary', left, operator: op, right };
155
+ }
156
+ return left;
157
+ }
158
+ parsePrimary() {
159
+ const token = this.peek();
160
+ if (token.type === AlgTokenType.NUMBER) {
161
+ return { type: 'Number', value: this.advance().value };
162
+ }
163
+ if (token.type === AlgTokenType.IDENTIFIER) {
164
+ const id = this.advance();
165
+ // Check for function call
166
+ if (this.peek().type === AlgTokenType.LPAREN) {
167
+ this.advance();
168
+ const args = [];
169
+ if (this.peek().type !== AlgTokenType.RPAREN) {
170
+ args.push(this.parseExpression());
171
+ while (this.match(AlgTokenType.COMMA)) {
172
+ args.push(this.parseExpression());
173
+ }
174
+ }
175
+ if (!this.match(AlgTokenType.RPAREN))
176
+ throw new Error('Expected )');
177
+ return { type: 'Call', name: id.value, args };
178
+ }
179
+ return { type: 'Identifier', name: id.value };
180
+ }
181
+ if (token.type === AlgTokenType.LPAREN) {
182
+ this.advance();
183
+ const expr = this.parseExpression();
184
+ if (!this.match(AlgTokenType.RPAREN))
185
+ throw new Error('Expected )');
186
+ return expr;
187
+ }
188
+ throw new Error(`Unexpected token: ${token.value}`);
189
+ }
190
+ }
191
+ export class AlgebraicCompiler {
192
+ /**
193
+ * Attempts to compile an algebraic line into an FV-1 assembly instruction.
194
+ * Returns the compiled instruction string, or null if it's not a valid algebraic expression.
195
+ */
196
+ evaluateConstantExpression(code) {
197
+ try {
198
+ const lexer = new AlgebraicLexer(code);
199
+ const tokens = lexer.tokenize();
200
+ const parser = new AlgebraicParser(tokens);
201
+ // Ignore assignments, just parse as an expression
202
+ const expr = parser['parseExpression']();
203
+ if (expr) {
204
+ return this.evaluateConstant(expr);
205
+ }
206
+ }
207
+ catch (e) {
208
+ // Fallthrough
209
+ }
210
+ return null;
211
+ }
212
+ compileLine(line, isMemoryCheck, onError) {
213
+ // Only process lines that look vaguely algebraic to save time
214
+ if (!line.includes('='))
215
+ return null;
216
+ let tokens;
217
+ try {
218
+ const lexer = new AlgebraicLexer(line);
219
+ tokens = lexer.tokenize();
220
+ }
221
+ catch (e) {
222
+ // Not complaining on lexer error as it might just be normal assembly that contains equal signs or other weird things
223
+ return null;
224
+ }
225
+ // Let's filter out comments if they managed to sneak in
226
+ const cleanTokens = tokens.filter(t => t.type !== AlgTokenType.EOF);
227
+ if (cleanTokens.length === 0)
228
+ return null;
229
+ let stmt = null;
230
+ try {
231
+ const parser = new AlgebraicParser(cleanTokens);
232
+ stmt = parser.parse();
233
+ }
234
+ catch (e) {
235
+ // If the left side heavily implied it was an algebraic assignment but failed, bubble error up
236
+ if (line.trim().startsWith('@acc =') || line.trim().startsWith('@acc=')) {
237
+ if (onError)
238
+ onError(`Syntax error parsing algebraic statement '${line}': ${e.message}`);
239
+ }
240
+ return null;
241
+ }
242
+ if (!stmt)
243
+ return null;
244
+ const result = this.generateCode(stmt, isMemoryCheck);
245
+ // If we successfully parsed it into an AST statement but generateCode couldn't map it to an FV-1 opcode
246
+ if (result === null && (line.trim().startsWith('@acc =') || line.trim().startsWith('@acc='))) {
247
+ if (onError)
248
+ onError(`Unsupported algebraic operation in '${line}'. Check variable mapping and operators!`);
249
+ }
250
+ return result;
251
+ }
252
+ generateCode(stmt, isMemoryCheck) {
253
+ const { left, operator, right } = stmt;
254
+ // Ensure left side is an identifier
255
+ if (left.type !== 'Identifier')
256
+ return null;
257
+ const isAcc = (name) => name.toLowerCase() === '@acc' || name.toLowerCase() === 'acc';
258
+ // 1. Accumulator Assignment
259
+ if (isAcc(left.name)) {
260
+ // @acc += src * C
261
+ if (operator === '+=' || operator === '-=') {
262
+ return this.compileAccumulate(right, operator === '-=', isMemoryCheck);
263
+ }
264
+ // @acc *= src
265
+ if (operator === '*=') {
266
+ if (right.type === 'Identifier')
267
+ return `MULX ${right.name}`;
268
+ return null;
269
+ }
270
+ // @acc &= mask
271
+ if (operator === '&=') {
272
+ if (right.type === 'Identifier' || right.type === 'Number') {
273
+ const val = right.type === 'Identifier' ? right.name : right.value;
274
+ return `AND ${val}`;
275
+ }
276
+ return null;
277
+ }
278
+ if (operator === '|=') {
279
+ if (right.type === 'Identifier' || right.type === 'Number') {
280
+ const val = right.type === 'Identifier' ? right.name : right.value;
281
+ return `OR ${val}`;
282
+ }
283
+ return null;
284
+ }
285
+ if (operator === '^=') {
286
+ if (right.type === 'Identifier' || right.type === 'Number') {
287
+ const val = right.type === 'Identifier' ? right.name : right.value;
288
+ return `XOR ${val}`;
289
+ }
290
+ return null;
291
+ }
292
+ // @acc = ...
293
+ if (operator === '=') {
294
+ // @acc = 0
295
+ if (right.type === 'Number' && parseFloat(right.value) === 0) {
296
+ return 'CLR';
297
+ }
298
+ // @acc = POT0 (implicit LDAX POT0)
299
+ if (right.type === 'Identifier') {
300
+ if (isMemoryCheck(right.name)) {
301
+ return `CLR\nRDA ${right.name}, 1.0`;
302
+ }
303
+ else {
304
+ return `LDAX ${right.name}`;
305
+ }
306
+ }
307
+ // @acc = abs(@acc)
308
+ if (right.type === 'Call') {
309
+ if (right.name.toLowerCase() === 'abs' && right.args.length === 1) {
310
+ const arg = right.args[0];
311
+ if (arg.type === 'Identifier' && isAcc(arg.name)) {
312
+ return 'ABSA';
313
+ }
314
+ }
315
+ }
316
+ // @acc = -@acc
317
+ if (right.type === 'Binary' && right.operator === '-' && right.left.type === 'Number' && parseFloat(right.left.value) === 0) {
318
+ // 0 - @acc (effectively -@acc) handled poorly by parser if unary minus didn't catch it.
319
+ // Let's rely on SOF for now.
320
+ }
321
+ // @acc = @acc * C + D (SOF)
322
+ if (right.type === 'Binary') {
323
+ // Try to match @acc * C + D
324
+ if (right.operator === '+') {
325
+ const mulTerm = right.left;
326
+ const dTerm = right.right;
327
+ if (mulTerm.type === 'Binary' && mulTerm.operator === '*') {
328
+ const accTerm = mulTerm.left;
329
+ const cTerm = mulTerm.right;
330
+ const valC = this.evaluateConstant(cTerm);
331
+ const valD = this.evaluateConstant(dTerm);
332
+ if (accTerm.type === 'Identifier' && isAcc(accTerm.name) && valC !== null && valD !== null) {
333
+ return `SOF ${valC}, ${valD}`;
334
+ }
335
+ }
336
+ }
337
+ // Try @acc * C
338
+ if (right.operator === '*') {
339
+ const leftTerm = right.left;
340
+ const rightTerm = right.right;
341
+ const valRight = this.evaluateConstant(rightTerm);
342
+ if (leftTerm.type === 'Identifier' && isAcc(leftTerm.name) && valRight !== null) {
343
+ return `SOF ${valRight}, 0.0`;
344
+ }
345
+ }
346
+ }
347
+ // Try @acc = src * C
348
+ if (right.type === 'Binary' && right.operator === '*') {
349
+ let srcName = '';
350
+ let coeff = '1.0';
351
+ if (right.left.type === 'Identifier' && right.right.type === 'Number') {
352
+ srcName = right.left.name;
353
+ coeff = right.right.value;
354
+ }
355
+ else if (right.right.type === 'Identifier' && right.left.type === 'Number') {
356
+ srcName = right.right.name;
357
+ coeff = right.left.value;
358
+ }
359
+ if (srcName && !isAcc(srcName)) {
360
+ if (isMemoryCheck(srcName)) {
361
+ return `CLR\nRDA ${srcName}, ${coeff}`;
362
+ }
363
+ else {
364
+ return `CLR\nRDAX ${srcName}, ${coeff}`;
365
+ }
366
+ }
367
+ }
368
+ // Unary minus -@acc
369
+ // If lexer parses -@acc differently, we might need a unary operator in AST. Currently we dont have one.
370
+ }
371
+ }
372
+ else {
373
+ // 2. Register/Memory Assignment
374
+ // dest = @acc * C
375
+ if (operator === '=') {
376
+ let coeff = '0.0'; // Default, typically WRAX clears ACC if no coeff
377
+ let isAccSrc = false;
378
+ if (right.type === 'Identifier' && isAcc(right.name)) {
379
+ isAccSrc = true;
380
+ // dest = @acc implies WRAX dest, 0.0 (clears the accumulator after writing)
381
+ // If you wanted to keep accumulator, you'd do dest = @acc * 1.0
382
+ }
383
+ else if (right.type === 'Binary' && right.operator === '*') {
384
+ if (right.left.type === 'Identifier' && isAcc(right.left.name) && right.right.type === 'Number') {
385
+ isAccSrc = true;
386
+ coeff = right.right.value;
387
+ }
388
+ else if (right.right.type === 'Identifier' && isAcc(right.right.name) && right.left.type === 'Number') {
389
+ isAccSrc = true;
390
+ coeff = right.left.value;
391
+ }
392
+ }
393
+ if (isAccSrc) {
394
+ if (isMemoryCheck(left.name)) {
395
+ return `WRA ${left.name}, ${coeff}`;
396
+ }
397
+ else {
398
+ return `WRAX ${left.name}, ${coeff}`;
399
+ }
400
+ }
401
+ }
402
+ }
403
+ return null;
404
+ }
405
+ evaluateConstant(expr) {
406
+ if (expr.type === 'Number') {
407
+ const val = parseFloat(expr.value);
408
+ return isNaN(val) ? null : val;
409
+ }
410
+ if (expr.type === 'Binary') {
411
+ const left = this.evaluateConstant(expr.left);
412
+ const right = this.evaluateConstant(expr.right);
413
+ if (left === null || right === null)
414
+ return null;
415
+ switch (expr.operator) {
416
+ case '+': return left + right;
417
+ case '-': return left - right;
418
+ case '*': return left * right;
419
+ case '/': return left / right;
420
+ }
421
+ }
422
+ if (expr.type === 'Call') {
423
+ // Support Math functions like round()
424
+ if (expr.name.toLowerCase() === 'round' && expr.args.length === 1) {
425
+ const arg = this.evaluateConstant(expr.args[0]);
426
+ if (arg !== null)
427
+ return Math.round(arg);
428
+ }
429
+ }
430
+ return null;
431
+ }
432
+ compileAccumulate(expr, negate, isMemoryCheck) {
433
+ let srcName = '';
434
+ let coeff = '1.0';
435
+ if (expr.type === 'Number') {
436
+ let offsetToken = expr.value;
437
+ if (negate) {
438
+ offsetToken = offsetToken.startsWith('-') ? offsetToken.substring(1) : '-' + offsetToken;
439
+ }
440
+ return `SOF 1.0, ${offsetToken}`;
441
+ }
442
+ else if (expr.type === 'Identifier') {
443
+ srcName = expr.name;
444
+ }
445
+ else if (expr.type === 'Binary' && expr.operator === '*') {
446
+ // src * C
447
+ if (expr.left.type === 'Identifier' && expr.right.type === 'Number') {
448
+ srcName = expr.left.name;
449
+ coeff = expr.right.value;
450
+ }
451
+ else if (expr.right.type === 'Identifier' && expr.left.type === 'Number') {
452
+ srcName = expr.right.name;
453
+ coeff = expr.left.value;
454
+ }
455
+ else {
456
+ return null;
457
+ }
458
+ }
459
+ else {
460
+ return null;
461
+ }
462
+ if (negate) {
463
+ coeff = coeff.startsWith('-') ? coeff.substring(1) : '-' + coeff;
464
+ }
465
+ if (isMemoryCheck(srcName)) {
466
+ return `RDA ${srcName}, ${coeff}`;
467
+ }
468
+ else {
469
+ return `RDAX ${srcName}, ${coeff}`;
470
+ }
471
+ }
472
+ }
473
+ //# sourceMappingURL=AlgebraicCompiler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AlgebraicCompiler.js","sourceRoot":"","sources":["../../src/assembler/AlgebraicCompiler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,71 @@
1
+ export interface FV1AssemblerOptions {
2
+ fv1AsmMemBug?: boolean;
3
+ clampReals?: boolean;
4
+ regCount?: number;
5
+ progSize?: number;
6
+ delaySize?: number;
7
+ }
8
+ export interface FV1AssemblerProblem {
9
+ message: string;
10
+ isfatal: boolean;
11
+ line: number;
12
+ }
13
+ export interface FV1Memory {
14
+ size: number;
15
+ start?: number;
16
+ middle?: number;
17
+ end?: number;
18
+ name: string;
19
+ line: number;
20
+ original: string;
21
+ }
22
+ export interface FV1Symbol {
23
+ name: string;
24
+ value: string;
25
+ line?: number;
26
+ original?: string;
27
+ }
28
+ export interface FV1AssemblerResult {
29
+ machineCode: number[];
30
+ problems: FV1AssemblerProblem[];
31
+ labels: Map<string, {
32
+ line: number;
33
+ instructionLine: number;
34
+ }>;
35
+ symbols: FV1Symbol[];
36
+ memories: FV1Memory[];
37
+ addressToLineMap: Map<number, number>;
38
+ usedRegistersCount: number;
39
+ usedLFOs: string[];
40
+ }
41
+ export declare class FV1Assembler {
42
+ private options;
43
+ private problems;
44
+ private symbols;
45
+ private memories;
46
+ private labels;
47
+ private addressToLineMap;
48
+ private usedRegisters;
49
+ private usedLFOs;
50
+ private configuredLFOs;
51
+ private userSymbols;
52
+ private symbolLines;
53
+ private PREDEFINED_SYMBOLS;
54
+ constructor(options?: FV1AssemblerOptions);
55
+ private reset;
56
+ private reservedSymbols;
57
+ private initSymbols;
58
+ assemble(source: string): FV1AssemblerResult;
59
+ private pass1_ResolveDirectives;
60
+ private pass2_ResolveLabels;
61
+ private pass3_GenerateCode;
62
+ private trackRegister;
63
+ private getLFOName;
64
+ private getLFONameFromRegister;
65
+ private evaluateExpression;
66
+ static formatMachineCode(machineCode: number[]): string;
67
+ static toUint8Array(machineCode: number[]): Uint8Array;
68
+ static getMiddleAddr(start: number, size: number): number;
69
+ static getEndAddr(start: number, size: number, fv1AsmMemBug: boolean): number;
70
+ }
71
+ //# sourceMappingURL=FV1Assembler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FV1Assembler.d.ts","sourceRoot":"","sources":["../../src/assembler/FV1Assembler.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,mBAAmB;IAClC,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,kBAAkB;IACjC,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,QAAQ,EAAE,mBAAmB,EAAE,CAAC;IAChC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,eAAe,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC/D,OAAO,EAAE,SAAS,EAAE,CAAC;IACrB,QAAQ,EAAE,SAAS,EAAE,CAAC;IACtB,gBAAgB,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,kBAAkB,EAAE,MAAM,CAAC;IAC3B,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,OAAO,CAAgC;IAC/C,OAAO,CAAC,QAAQ,CAA6B;IAC7C,OAAO,CAAC,OAAO,CAA6B;IAC5C,OAAO,CAAC,QAAQ,CAAmB;IACnC,OAAO,CAAC,MAAM,CAAgE;IAC9E,OAAO,CAAC,gBAAgB,CAA6B;IACrD,OAAO,CAAC,aAAa,CAAqB;IAC1C,OAAO,CAAC,QAAQ,CAAqB;IACrC,OAAO,CAAC,cAAc,CAAqB;IAC3C,OAAO,CAAC,WAAW,CAAqB;IACxC,OAAO,CAAC,WAAW,CAA6B;IAEhD,OAAO,CAAC,kBAAkB,CAYxB;gBAEU,OAAO,GAAE,mBAAwB;IAW7C,OAAO,CAAC,KAAK;IAcb,OAAO,CAAC,eAAe,CAAqB;IAE5C,OAAO,CAAC,WAAW;IAaZ,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,kBAAkB;IAyCnD,OAAO,CAAC,uBAAuB;IAwC/B,OAAO,CAAC,mBAAmB;IAW3B,OAAO,CAAC,kBAAkB;IA0G1B,OAAO,CAAC,aAAa;IAUrB,OAAO,CAAC,UAAU;IAUlB,OAAO,CAAC,sBAAsB;IAY9B,OAAO,CAAC,kBAAkB;WA8BZ,iBAAiB,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,MAAM;WAIhD,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,UAAU;WAO/C,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM;WAIlD,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,OAAO,GAAG,MAAM;CAGrF"}