@jhlagado/azm 0.2.7 → 0.2.9
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/README.md +239 -76
- package/dist/src/api-artifacts.d.ts +20 -0
- package/dist/src/api-artifacts.js +165 -0
- package/dist/src/api-compile.d.ts +8 -2
- package/dist/src/api-compile.js +55 -227
- package/dist/src/api-register-contracts.d.ts +9 -0
- package/dist/src/api-register-contracts.js +77 -0
- package/dist/src/api-tooling.d.ts +2 -2
- package/dist/src/api-tooling.js +1 -1
- package/dist/src/assembly/address-planning.d.ts +1 -2
- package/dist/src/assembly/address-planning.js +119 -218
- package/dist/src/assembly/address-symbols.d.ts +12 -0
- package/dist/src/assembly/address-symbols.js +118 -0
- package/dist/src/assembly/assemble-program.js +5 -0
- package/dist/src/assembly/fixup-emission.js +30 -48
- package/dist/src/assembly/import-visibility.d.ts +3 -0
- package/dist/src/assembly/import-visibility.js +204 -0
- package/dist/src/assembly/program-emission.js +163 -164
- package/dist/src/cli/artifact-files.d.ts +15 -0
- package/dist/src/cli/artifact-files.js +86 -0
- package/dist/src/cli/parse-args.d.ts +6 -5
- package/dist/src/cli/parse-args.js +162 -136
- package/dist/src/cli/run.js +4 -1
- package/dist/src/cli/usage.d.ts +1 -0
- package/dist/src/cli/usage.js +33 -0
- package/dist/src/cli/write-artifacts.js +18 -91
- package/dist/src/core/compile.js +51 -274
- package/dist/src/core/conditional-assembly.d.ts +6 -0
- package/dist/src/core/conditional-assembly.js +181 -0
- package/dist/src/expansion/op-constant-expression.d.ts +3 -0
- package/dist/src/expansion/op-constant-expression.js +52 -0
- package/dist/src/expansion/op-expand-selected.d.ts +5 -0
- package/dist/src/expansion/op-expand-selected.js +143 -0
- package/dist/src/expansion/op-expansion.d.ts +5 -53
- package/dist/src/expansion/op-expansion.js +85 -815
- package/dist/src/expansion/op-instruction-instantiation.d.ts +3 -0
- package/dist/src/expansion/op-instruction-instantiation.js +194 -0
- package/dist/src/expansion/op-local-labels.d.ts +8 -0
- package/dist/src/expansion/op-local-labels.js +166 -0
- package/dist/src/expansion/op-operand-splitting.d.ts +1 -0
- package/dist/src/expansion/op-operand-splitting.js +44 -0
- package/dist/src/expansion/op-operands.d.ts +53 -0
- package/dist/src/expansion/op-operands.js +66 -0
- package/dist/src/expansion/op-selection.d.ts +18 -0
- package/dist/src/expansion/op-selection.js +172 -0
- package/dist/src/index.d.ts +2 -1
- package/dist/src/index.js +1 -1
- package/dist/src/model/diagnostic.d.ts +4 -0
- package/dist/src/model/diagnostic.js +4 -0
- package/dist/src/node/source-host.js +40 -13
- package/dist/src/outputs/asm80-expression-evaluation.d.ts +10 -0
- package/dist/src/outputs/asm80-expression-evaluation.js +75 -0
- package/dist/src/outputs/asm80-expressions.d.ts +5 -0
- package/dist/src/outputs/asm80-expressions.js +47 -0
- package/dist/src/outputs/asm80-instruction-operands.d.ts +16 -0
- package/dist/src/outputs/asm80-instruction-operands.js +38 -0
- package/dist/src/outputs/asm80-instructions.d.ts +5 -0
- package/dist/src/outputs/asm80-instructions.js +272 -0
- package/dist/src/outputs/asm80-ld-operands.d.ts +10 -0
- package/dist/src/outputs/asm80-ld-operands.js +157 -0
- package/dist/src/outputs/asm80-strings.d.ts +4 -0
- package/dist/src/outputs/asm80-strings.js +14 -0
- package/dist/src/outputs/d8-files.d.ts +10 -0
- package/dist/src/outputs/d8-files.js +103 -0
- package/dist/src/outputs/d8-helpers.d.ts +21 -0
- package/dist/src/outputs/d8-helpers.js +136 -0
- package/dist/src/outputs/hex.js +26 -18
- package/dist/src/outputs/types.d.ts +16 -10
- package/dist/src/outputs/write-asm80.js +72 -597
- package/dist/src/outputs/write-d8.js +6 -216
- package/dist/src/register-contracts/accept-output.d.ts +2 -0
- package/dist/src/register-contracts/analyze-helpers.d.ts +29 -0
- package/dist/src/register-contracts/analyze-helpers.js +162 -0
- package/dist/src/{register-care → register-contracts}/analyze.d.ts +6 -6
- package/dist/src/register-contracts/analyze.js +73 -0
- package/dist/src/register-contracts/annotate.d.ts +11 -0
- package/dist/src/{register-care → register-contracts}/annotate.js +3 -3
- package/dist/src/register-contracts/annotations.d.ts +8 -0
- package/dist/src/{register-care → register-contracts}/annotations.js +3 -3
- package/dist/src/register-contracts/boundaryHints.d.ts +3 -0
- package/dist/src/register-contracts/boundaryHints.js +24 -0
- package/dist/src/register-contracts/carriers.d.ts +2 -0
- package/dist/src/register-contracts/constants.d.ts +4 -0
- package/dist/src/register-contracts/constants.js +51 -0
- package/dist/src/register-contracts/controlFlow.d.ts +5 -0
- package/dist/src/register-contracts/controlFlow.js +55 -0
- package/dist/src/register-contracts/fix.d.ts +11 -0
- package/dist/src/{register-care → register-contracts}/fix.js +47 -30
- package/dist/src/register-contracts/instruction-head.d.ts +2 -0
- package/dist/src/register-contracts/instruction-head.js +3 -0
- package/dist/src/register-contracts/instruction-operands.d.ts +3 -0
- package/dist/src/register-contracts/instruction-operands.js +101 -0
- package/dist/src/register-contracts/instruction-predicates.d.ts +6 -0
- package/dist/src/register-contracts/instruction-predicates.js +44 -0
- package/dist/src/register-contracts/interfaceContracts.d.ts +2 -0
- package/dist/src/register-contracts/interfaceContracts.js +68 -0
- package/dist/src/register-contracts/liveness.d.ts +3 -0
- package/dist/src/{register-care → register-contracts}/liveness.js +111 -79
- package/dist/src/register-contracts/operand-register-name.d.ts +2 -0
- package/dist/src/register-contracts/operand-register-name.js +13 -0
- package/dist/src/{register-care → register-contracts}/profiles.d.ts +5 -5
- package/dist/src/{register-care → register-contracts}/profiles.js +2 -2
- package/dist/src/register-contracts/programModel-boundaries.d.ts +6 -0
- package/dist/src/register-contracts/programModel-boundaries.js +64 -0
- package/dist/src/register-contracts/programModel-routines.d.ts +7 -0
- package/dist/src/register-contracts/programModel-routines.js +144 -0
- package/dist/src/register-contracts/programModel.d.ts +3 -0
- package/dist/src/register-contracts/programModel.js +14 -0
- package/dist/src/register-contracts/report.d.ts +5 -0
- package/dist/src/{register-care → register-contracts}/report.js +34 -17
- package/dist/src/register-contracts/routine-summaries.d.ts +6 -0
- package/dist/src/{register-care → register-contracts}/routine-summaries.js +11 -1
- package/dist/src/register-contracts/smartCommentBlocks.d.ts +5 -0
- package/dist/src/register-contracts/smartCommentBlocks.js +30 -0
- package/dist/src/register-contracts/smartCommentParsing.d.ts +3 -0
- package/dist/src/register-contracts/smartCommentParsing.js +80 -0
- package/dist/src/register-contracts/smartComments.d.ts +5 -0
- package/dist/src/register-contracts/smartComments.js +92 -0
- package/dist/src/register-contracts/summaries.d.ts +12 -0
- package/dist/src/{register-care → register-contracts}/summaries.js +7 -7
- package/dist/src/register-contracts/summary-boundary.d.ts +2 -0
- package/dist/src/register-contracts/summary-boundary.js +40 -0
- package/dist/src/register-contracts/summary-contract.d.ts +2 -0
- package/dist/src/register-contracts/summary-contract.js +45 -0
- package/dist/src/register-contracts/summary-result.d.ts +7 -0
- package/dist/src/register-contracts/summary-result.js +122 -0
- package/dist/src/register-contracts/summary-state.d.ts +23 -0
- package/dist/src/register-contracts/summary-state.js +88 -0
- package/dist/src/register-contracts/summary-token-transfer.d.ts +3 -0
- package/dist/src/register-contracts/summary-token-transfer.js +67 -0
- package/dist/src/register-contracts/summary.d.ts +3 -0
- package/dist/src/register-contracts/summary.js +266 -0
- package/dist/src/register-contracts/tooling.d.ts +57 -0
- package/dist/src/{register-care → register-contracts}/tooling.js +8 -6
- package/dist/src/register-contracts/types.d.ts +188 -0
- package/dist/src/semantics/binary-operators.d.ts +2 -0
- package/dist/src/semantics/binary-operators.js +15 -0
- package/dist/src/semantics/byte-functions.d.ts +2 -0
- package/dist/src/semantics/byte-functions.js +7 -0
- package/dist/src/semantics/constant-operator-types.d.ts +10 -0
- package/dist/src/semantics/constant-operator-types.js +1 -0
- package/dist/src/semantics/constant-operators.d.ts +3 -0
- package/dist/src/semantics/constant-operators.js +3 -0
- package/dist/src/semantics/diagnostics.d.ts +3 -0
- package/dist/src/semantics/diagnostics.js +10 -0
- package/dist/src/semantics/expression-evaluation.d.ts +11 -19
- package/dist/src/semantics/expression-evaluation.js +22 -334
- package/dist/src/semantics/layout-evaluation.d.ts +23 -0
- package/dist/src/semantics/layout-evaluation.js +202 -0
- package/dist/src/semantics/layout-format.d.ts +5 -0
- package/dist/src/semantics/layout-format.js +31 -0
- package/dist/src/semantics/layout-path.d.ts +24 -0
- package/dist/src/semantics/layout-path.js +58 -0
- package/dist/src/semantics/unary-operators.d.ts +2 -0
- package/dist/src/semantics/unary-operators.js +8 -0
- package/dist/src/source/line-comment-scanner.d.ts +1 -0
- package/dist/src/source/line-comment-scanner.js +51 -0
- package/dist/src/source/logical-lines.d.ts +3 -0
- package/dist/src/source/source-span.d.ts +2 -0
- package/dist/src/source/strip-line-comment.js +8 -44
- package/dist/src/syntax/directive-aliases.js +36 -22
- package/dist/src/syntax/expression-tokenizer.d.ts +30 -0
- package/dist/src/syntax/expression-tokenizer.js +310 -0
- package/dist/src/syntax/parse-directive-statement.d.ts +9 -0
- package/dist/src/syntax/parse-directive-statement.js +309 -0
- package/dist/src/syntax/parse-expression.d.ts +2 -2
- package/dist/src/syntax/parse-expression.js +7 -568
- package/dist/src/syntax/parse-layout-declarations.d.ts +9 -0
- package/dist/src/syntax/parse-layout-declarations.js +189 -0
- package/dist/src/syntax/parse-layout-expression.d.ts +5 -0
- package/dist/src/syntax/parse-layout-expression.js +175 -0
- package/dist/src/syntax/parse-line.js +21 -273
- package/dist/src/syntax/parse-token-expression.d.ts +3 -0
- package/dist/src/syntax/parse-token-expression.js +133 -0
- package/dist/src/tooling/api.js +1 -1
- package/dist/src/tooling/case-style.js +47 -30
- package/dist/src/z80/effect-groups.d.ts +38 -0
- package/dist/src/z80/effect-groups.js +265 -0
- package/dist/src/z80/effect-units.d.ts +18 -0
- package/dist/src/z80/effect-units.js +165 -0
- package/dist/src/z80/effects.d.ts +1 -1
- package/dist/src/z80/effects.js +94 -557
- package/dist/src/z80/encode-core.d.ts +2 -0
- package/dist/src/z80/encode-core.js +42 -0
- package/dist/src/z80/encode-ld-helpers.d.ts +25 -0
- package/dist/src/z80/encode-ld-helpers.js +172 -0
- package/dist/src/z80/encode-ld.d.ts +2 -0
- package/dist/src/z80/encode-ld.js +285 -0
- package/dist/src/z80/encode.js +190 -542
- package/dist/src/z80/ld-support.d.ts +3 -0
- package/dist/src/z80/ld-support.js +146 -0
- package/dist/src/z80/operand-split-state.d.ts +8 -0
- package/dist/src/z80/operand-split-state.js +46 -0
- package/dist/src/z80/operand-split.d.ts +1 -0
- package/dist/src/z80/operand-split.js +13 -0
- package/dist/src/z80/parse-basic.d.ts +4 -0
- package/dist/src/z80/parse-basic.js +39 -0
- package/dist/src/z80/parse-branch.d.ts +4 -0
- package/dist/src/z80/parse-branch.js +218 -0
- package/dist/src/z80/parse-conditions.d.ts +6 -0
- package/dist/src/z80/parse-conditions.js +10 -0
- package/dist/src/z80/parse-exchange.d.ts +2 -0
- package/dist/src/z80/parse-exchange.js +30 -0
- package/dist/src/z80/parse-instruction.js +224 -1010
- package/dist/src/z80/parse-io-control.d.ts +5 -0
- package/dist/src/z80/parse-io-control.js +108 -0
- package/dist/src/z80/parse-ld.d.ts +2 -0
- package/dist/src/z80/parse-ld.js +83 -0
- package/dist/src/z80/parse-operands.d.ts +41 -0
- package/dist/src/z80/parse-operands.js +259 -0
- package/docs/codebase/01-orientation-and-repository-layout.md +192 -0
- package/docs/codebase/02-source-loading-and-parsing.md +263 -0
- package/docs/codebase/03-assembly-and-z80-emission.md +251 -0
- package/docs/codebase/04-ops-and-register-contracts.md +237 -0
- package/docs/codebase/05-interfaces-and-output-artifacts.md +253 -0
- package/docs/codebase/06-verification-and-maintenance.md +202 -0
- package/docs/codebase/appendices/a-directory-file-reference.md +253 -0
- package/docs/codebase/appendices/b-compile-flow-reference.md +103 -0
- package/docs/codebase/appendices/c-public-surface-reference.md +106 -0
- package/docs/codebase/appendices/index.md +16 -0
- package/docs/codebase/index.md +46 -0
- package/package.json +2 -3
- package/dist/src/register-care/accept-output.d.ts +0 -2
- package/dist/src/register-care/analyze.js +0 -166
- package/dist/src/register-care/annotate.d.ts +0 -11
- package/dist/src/register-care/annotations.d.ts +0 -8
- package/dist/src/register-care/boundaryHints.d.ts +0 -3
- package/dist/src/register-care/boundaryHints.js +0 -80
- package/dist/src/register-care/carriers.d.ts +0 -2
- package/dist/src/register-care/controlFlow.d.ts +0 -5
- package/dist/src/register-care/controlFlow.js +0 -38
- package/dist/src/register-care/fix.d.ts +0 -11
- package/dist/src/register-care/instruction-shape.d.ts +0 -11
- package/dist/src/register-care/instruction-shape.js +0 -129
- package/dist/src/register-care/liveness.d.ts +0 -3
- package/dist/src/register-care/programModel.d.ts +0 -3
- package/dist/src/register-care/programModel.js +0 -266
- package/dist/src/register-care/report.d.ts +0 -5
- package/dist/src/register-care/routine-summaries.d.ts +0 -6
- package/dist/src/register-care/smartComments.d.ts +0 -5
- package/dist/src/register-care/smartComments.js +0 -243
- package/dist/src/register-care/summaries.d.ts +0 -12
- package/dist/src/register-care/summary.d.ts +0 -3
- package/dist/src/register-care/summary.js +0 -474
- package/dist/src/register-care/tooling.d.ts +0 -43
- package/dist/src/register-care/types.d.ts +0 -172
- package/docs/reference/cli.md +0 -151
- package/docs/reference/tooling-api.md +0 -316
- /package/dist/src/{register-care → register-contracts}/accept-output.js +0 -0
- /package/dist/src/{register-care → register-contracts}/carriers.js +0 -0
- /package/dist/src/{register-care → register-contracts}/sourceText.d.ts +0 -0
- /package/dist/src/{register-care → register-contracts}/sourceText.js +0 -0
- /package/dist/src/{register-care → register-contracts}/types.js +0 -0
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import { encodeZ80Instruction } from '../z80/encode.js';
|
|
2
|
+
import { parseZ80Instruction } from '../z80/parse-instruction.js';
|
|
3
|
+
import { instantiateTemplateInstruction } from './op-instruction-instantiation.js';
|
|
4
|
+
import { buildLocalLabelMap, renameInstructionExpressions, renameSourceItems, } from './op-local-labels.js';
|
|
5
|
+
import { formatOpOperand, } from './op-operands.js';
|
|
6
|
+
import { formatOpSelectionDiagnostic, selectOpOverload } from './op-selection.js';
|
|
7
|
+
export function expandSelectedOp(ops, overloads, operands, line, diagnostics, stack) {
|
|
8
|
+
const name = overloads[0]?.name ?? '<unknown>';
|
|
9
|
+
const cycleStart = stack.findIndex((entry) => entry.name.toLowerCase() === name.toLowerCase());
|
|
10
|
+
if (cycleStart !== -1) {
|
|
11
|
+
diagnostics.push(parseDiagnostic(line, formatCycleDiagnostic(name, stack, cycleStart, overloads)));
|
|
12
|
+
return [];
|
|
13
|
+
}
|
|
14
|
+
const selection = selectOpOverload(overloads, operands);
|
|
15
|
+
if (selection.kind !== 'selected') {
|
|
16
|
+
diagnostics.push(parseDiagnostic(line, formatOpSelectionDiagnostic(selection, overloads, operands)));
|
|
17
|
+
return [];
|
|
18
|
+
}
|
|
19
|
+
const bindings = bindOpOperands(selection.overload, operands);
|
|
20
|
+
const expanded = [];
|
|
21
|
+
const localLabelMap = buildLocalLabelMap(selection.overload, line);
|
|
22
|
+
const expansionStack = [...stack, selection.overload];
|
|
23
|
+
const emittedSource = opEmittedSource(line);
|
|
24
|
+
for (const item of selection.overload.body) {
|
|
25
|
+
expanded.push(...expandTemplateItem(ops, item, bindings, line, diagnostics, selection.overload, expansionStack, localLabelMap, emittedSource));
|
|
26
|
+
}
|
|
27
|
+
return expanded;
|
|
28
|
+
}
|
|
29
|
+
function bindOpOperands(overload, operands) {
|
|
30
|
+
const bindings = new Map();
|
|
31
|
+
overload.params.forEach((param, index) => {
|
|
32
|
+
bindings.set(param.name, operands[index]);
|
|
33
|
+
});
|
|
34
|
+
return bindings;
|
|
35
|
+
}
|
|
36
|
+
function expandTemplateItem(ops, item, bindings, line, diagnostics, overload, expansionStack, localLabelMap, emittedSource) {
|
|
37
|
+
if (item.kind === 'source-items') {
|
|
38
|
+
return renameSourceItems(item.items, localLabelMap).map((renamed) => stampOpSource(renamed, emittedSource));
|
|
39
|
+
}
|
|
40
|
+
const concreteOperands = instantiateTemplateOperands(item, bindings);
|
|
41
|
+
if (!concreteOperands) {
|
|
42
|
+
diagnostics.push(parseDiagnostic(line, `invalid op expansion in "${overload.name}"`));
|
|
43
|
+
return [];
|
|
44
|
+
}
|
|
45
|
+
const nested = ops.get(item.mnemonic);
|
|
46
|
+
if (nested) {
|
|
47
|
+
return expandSelectedOp(ops, nested, concreteOperands, line, diagnostics, expansionStack);
|
|
48
|
+
}
|
|
49
|
+
const instruction = instantiateTemplateInstruction(item.mnemonic, concreteOperands);
|
|
50
|
+
if (!instruction || encodeZ80Instruction(instruction).size === 0) {
|
|
51
|
+
reportInvalidOpExpansion(line, diagnostics, overload, expansionStack, item, concreteOperands);
|
|
52
|
+
return [];
|
|
53
|
+
}
|
|
54
|
+
return [{
|
|
55
|
+
kind: 'instruction',
|
|
56
|
+
instruction: renameInstructionExpressions(instruction, localLabelMap),
|
|
57
|
+
span: emittedSource.span,
|
|
58
|
+
emittedSource,
|
|
59
|
+
}];
|
|
60
|
+
}
|
|
61
|
+
function opEmittedSource(line) {
|
|
62
|
+
return {
|
|
63
|
+
span: { sourceName: line.sourceName, line: line.line, column: firstColumn(line.text) },
|
|
64
|
+
kind: 'macro',
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
function stampOpSource(item, emittedSource) {
|
|
68
|
+
if (item.kind !== 'instruction')
|
|
69
|
+
return item;
|
|
70
|
+
return { ...item, emittedSource };
|
|
71
|
+
}
|
|
72
|
+
function formatOpChainEntry(op) {
|
|
73
|
+
return `${op.name} (${op.sourceName}:${op.line})`;
|
|
74
|
+
}
|
|
75
|
+
function formatCycleDiagnostic(name, stack, cycleStart, overloads) {
|
|
76
|
+
return [
|
|
77
|
+
`Cyclic op expansion detected for "${name}".`,
|
|
78
|
+
`expansion chain: ${[...stack.slice(cycleStart), overloads[0]].map(formatOpChainEntry).join(' -> ')}`,
|
|
79
|
+
].join('\n');
|
|
80
|
+
}
|
|
81
|
+
function formatExpandedInstruction(mnemonic, operands) {
|
|
82
|
+
return `${mnemonic} ${operands.map(formatOpOperand).join(', ')}`.trim();
|
|
83
|
+
}
|
|
84
|
+
function reportInvalidOpExpansion(line, diagnostics, overload, expansionStack, item, concreteOperands) {
|
|
85
|
+
const expandedInstruction = formatExpandedInstruction(item.mnemonic, concreteOperands);
|
|
86
|
+
const underlying = expandedInstructionUnderlyingError(item, concreteOperands);
|
|
87
|
+
if (underlying) {
|
|
88
|
+
diagnostics.push(parseDiagnostic(line, underlying));
|
|
89
|
+
}
|
|
90
|
+
diagnostics.push(parseDiagnostic(line, formatInvalidOpExpansionDiagnostic(overload, expandedInstruction, expansionStack)));
|
|
91
|
+
}
|
|
92
|
+
function expandedInstructionUnderlyingError(item, concreteOperands) {
|
|
93
|
+
const instruction = instantiateTemplateInstruction(item.mnemonic, concreteOperands);
|
|
94
|
+
if (instruction && encodeZ80Instruction(instruction).size > 0) {
|
|
95
|
+
return undefined;
|
|
96
|
+
}
|
|
97
|
+
if (instruction?.mnemonic === 'ld' || item.mnemonic === 'ld') {
|
|
98
|
+
return 'ld expects a supported register/memory/immediate transfer form';
|
|
99
|
+
}
|
|
100
|
+
const parsed = parseZ80Instruction(formatExpandedInstruction(item.mnemonic, concreteOperands));
|
|
101
|
+
return parsed?.error;
|
|
102
|
+
}
|
|
103
|
+
function formatInvalidOpExpansionDiagnostic(overload, expandedInstruction, expansionStack) {
|
|
104
|
+
return [
|
|
105
|
+
`Invalid op expansion in "${overload.name}" at call site.`,
|
|
106
|
+
`expanded instruction: ${expandedInstruction}`,
|
|
107
|
+
`op definition: ${overload.sourceName}:${overload.line}`,
|
|
108
|
+
`expansion chain: ${expansionStack.map(formatOpChainEntry).join(' -> ')}`,
|
|
109
|
+
].join('\n');
|
|
110
|
+
}
|
|
111
|
+
function instantiateTemplateOperands(item, bindings) {
|
|
112
|
+
const operands = item.operands.map((operand) => operand.kind === 'param'
|
|
113
|
+
? bindings.get(operand.name)
|
|
114
|
+
: operand.kind === 'port-param'
|
|
115
|
+
? parenthesizedOperandFromBinding(item.mnemonic, bindings.get(operand.name))
|
|
116
|
+
: operand.operand);
|
|
117
|
+
if (operands.some((operand) => operand === undefined)) {
|
|
118
|
+
return undefined;
|
|
119
|
+
}
|
|
120
|
+
return operands;
|
|
121
|
+
}
|
|
122
|
+
function parenthesizedOperandFromBinding(mnemonic, operand) {
|
|
123
|
+
if (operand?.kind !== 'imm') {
|
|
124
|
+
return undefined;
|
|
125
|
+
}
|
|
126
|
+
return mnemonic === 'in' || mnemonic === 'out'
|
|
127
|
+
? operand
|
|
128
|
+
: { kind: 'mem-abs', expression: operand.expression, text: `(${operand.text})` };
|
|
129
|
+
}
|
|
130
|
+
function parseDiagnostic(line, message) {
|
|
131
|
+
return {
|
|
132
|
+
severity: 'error',
|
|
133
|
+
code: 'AZMN_PARSE',
|
|
134
|
+
message,
|
|
135
|
+
sourceName: line.sourceName,
|
|
136
|
+
line: line.line,
|
|
137
|
+
column: firstColumn(line.text),
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
function firstColumn(text) {
|
|
141
|
+
const match = /\S/.exec(text);
|
|
142
|
+
return match ? match.index + 1 : 1;
|
|
143
|
+
}
|
|
@@ -1,64 +1,17 @@
|
|
|
1
1
|
import type { Diagnostic } from '../model/diagnostic.js';
|
|
2
|
-
import type { Expression } from '../model/expression.js';
|
|
3
2
|
import type { SourceItem } from '../model/source-item.js';
|
|
4
3
|
import { type ParseLogicalLineOptions } from '../syntax/parse-line.js';
|
|
5
|
-
type
|
|
4
|
+
import { type OpMatcher, type OpOperand } from './op-operands.js';
|
|
5
|
+
export type LogicalLineLike = {
|
|
6
6
|
readonly sourceName: string;
|
|
7
7
|
readonly line: number;
|
|
8
8
|
readonly text: string;
|
|
9
9
|
};
|
|
10
|
-
type OpMatcher = {
|
|
11
|
-
readonly kind: 'reg8';
|
|
12
|
-
} | {
|
|
13
|
-
readonly kind: 'reg16';
|
|
14
|
-
} | {
|
|
15
|
-
readonly kind: 'imm8';
|
|
16
|
-
} | {
|
|
17
|
-
readonly kind: 'imm16';
|
|
18
|
-
} | {
|
|
19
|
-
readonly kind: 'cc';
|
|
20
|
-
} | {
|
|
21
|
-
readonly kind: 'idx16';
|
|
22
|
-
} | {
|
|
23
|
-
readonly kind: 'ea';
|
|
24
|
-
} | {
|
|
25
|
-
readonly kind: 'mem8';
|
|
26
|
-
} | {
|
|
27
|
-
readonly kind: 'mem16';
|
|
28
|
-
} | {
|
|
29
|
-
readonly kind: 'fixed';
|
|
30
|
-
readonly token: string;
|
|
31
|
-
};
|
|
32
10
|
interface OpParam {
|
|
33
11
|
readonly name: string;
|
|
34
12
|
readonly matcher: OpMatcher;
|
|
35
13
|
}
|
|
36
|
-
type OpOperand
|
|
37
|
-
readonly kind: 'reg8';
|
|
38
|
-
readonly register: string;
|
|
39
|
-
readonly text: string;
|
|
40
|
-
} | {
|
|
41
|
-
readonly kind: 'reg16';
|
|
42
|
-
readonly register: string;
|
|
43
|
-
readonly text: string;
|
|
44
|
-
} | {
|
|
45
|
-
readonly kind: 'reg-indirect';
|
|
46
|
-
readonly register: 'hl';
|
|
47
|
-
readonly text: string;
|
|
48
|
-
} | {
|
|
49
|
-
readonly kind: 'mem-abs';
|
|
50
|
-
readonly expression: Expression;
|
|
51
|
-
readonly text: string;
|
|
52
|
-
} | {
|
|
53
|
-
readonly kind: 'indexed';
|
|
54
|
-
readonly register: 'ix' | 'iy';
|
|
55
|
-
readonly displacement: Expression;
|
|
56
|
-
readonly text: string;
|
|
57
|
-
} | {
|
|
58
|
-
readonly kind: 'imm';
|
|
59
|
-
readonly expression: Expression;
|
|
60
|
-
readonly text: string;
|
|
61
|
-
};
|
|
14
|
+
export type { OpOperand } from './op-operands.js';
|
|
62
15
|
type OpTemplateOperand = {
|
|
63
16
|
readonly kind: 'param';
|
|
64
17
|
readonly name: string;
|
|
@@ -69,7 +22,7 @@ type OpTemplateOperand = {
|
|
|
69
22
|
readonly kind: 'literal';
|
|
70
23
|
readonly operand: OpOperand;
|
|
71
24
|
};
|
|
72
|
-
type OpTemplateItem = {
|
|
25
|
+
export type OpTemplateItem = {
|
|
73
26
|
readonly kind: 'source-items';
|
|
74
27
|
readonly items: readonly SourceItem[];
|
|
75
28
|
} | {
|
|
@@ -77,7 +30,7 @@ type OpTemplateItem = {
|
|
|
77
30
|
readonly mnemonic: string;
|
|
78
31
|
readonly operands: readonly OpTemplateOperand[];
|
|
79
32
|
};
|
|
80
|
-
interface OpDecl {
|
|
33
|
+
export interface OpDecl {
|
|
81
34
|
readonly name: string;
|
|
82
35
|
readonly params: readonly OpParam[];
|
|
83
36
|
readonly body: readonly OpTemplateItem[];
|
|
@@ -93,4 +46,3 @@ export declare function parseOpInvocation(line: LogicalLineLike): {
|
|
|
93
46
|
readonly operands: readonly OpOperand[];
|
|
94
47
|
} | undefined;
|
|
95
48
|
export declare function expandOpInvocation(ops: ReadonlyMap<string, readonly OpDecl[]>, overloads: readonly OpDecl[], operands: readonly OpOperand[], line: LogicalLineLike, diagnostics: Diagnostic[]): readonly SourceItem[];
|
|
96
|
-
export {};
|