@jhlagado/azm 0.2.6 → 0.2.8
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 +170 -69
- 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 +31 -230
- 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/fixup-emission.js +30 -48
- 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/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 +68 -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 +13 -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 +128 -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/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 +14 -0
- package/dist/src/syntax/parse-directive-statement.js +307 -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 +180 -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 +4 -272
- 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/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/reference/cli.md +42 -35
- package/docs/reference/tooling-api.md +20 -16
- package/package.json +1 -1
- 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/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,136 @@
|
|
|
1
|
+
import { isAbsolute, normalize, relative, resolve } from 'node:path';
|
|
2
|
+
function toHexFilePath(path, rootDir) {
|
|
3
|
+
const normalized = normalize(path).replace(/\\/g, '/');
|
|
4
|
+
if (!rootDir) {
|
|
5
|
+
return normalized;
|
|
6
|
+
}
|
|
7
|
+
const root = normalize(resolve(rootDir)).replace(/\\/g, '/');
|
|
8
|
+
const resolvedPath = normalize(resolve(path)).replace(/\\/g, '/');
|
|
9
|
+
const rel = relative(root, resolvedPath).replace(/\\/g, '/');
|
|
10
|
+
if (rel.startsWith('..') || rel === '' || isAbsolute(rel)) {
|
|
11
|
+
return resolvedPath;
|
|
12
|
+
}
|
|
13
|
+
return rel;
|
|
14
|
+
}
|
|
15
|
+
export function toD8mSymbol(symbol, rootDir) {
|
|
16
|
+
if (symbol.kind === 'constant') {
|
|
17
|
+
return {
|
|
18
|
+
name: symbol.name,
|
|
19
|
+
kind: symbol.kind,
|
|
20
|
+
value: symbol.value,
|
|
21
|
+
...(symbol.file !== undefined ? { file: toHexFilePath(symbol.file, rootDir) } : {}),
|
|
22
|
+
...(symbol.line !== undefined ? { line: symbol.line } : {}),
|
|
23
|
+
...(symbol.scope !== undefined ? { scope: symbol.scope } : {}),
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
return {
|
|
27
|
+
name: symbol.name,
|
|
28
|
+
kind: symbol.kind,
|
|
29
|
+
address: symbol.address,
|
|
30
|
+
...(symbol.file !== undefined ? { file: toHexFilePath(symbol.file, rootDir) } : {}),
|
|
31
|
+
...(symbol.line !== undefined ? { line: symbol.line } : {}),
|
|
32
|
+
...(symbol.scope !== undefined ? { scope: symbol.scope } : {}),
|
|
33
|
+
...(symbol.size !== undefined ? { size: symbol.size } : {}),
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
export function compareSymbol(a, b) {
|
|
37
|
+
return firstNonZero([
|
|
38
|
+
symbolClass(a) - symbolClass(b),
|
|
39
|
+
symbolAddress(a) - symbolAddress(b),
|
|
40
|
+
a.name.toLowerCase().localeCompare(b.name.toLowerCase()),
|
|
41
|
+
a.kind.localeCompare(b.kind),
|
|
42
|
+
(a.file ?? '').localeCompare(b.file ?? ''),
|
|
43
|
+
(a.line ?? 0) - (b.line ?? 0),
|
|
44
|
+
symbolTieBreaker(a, b),
|
|
45
|
+
]);
|
|
46
|
+
}
|
|
47
|
+
function firstNonZero(values) {
|
|
48
|
+
return values.find((value) => value !== 0) ?? 0;
|
|
49
|
+
}
|
|
50
|
+
function symbolClass(symbol) {
|
|
51
|
+
return symbol.kind === 'constant' ? 1 : 0;
|
|
52
|
+
}
|
|
53
|
+
function symbolAddress(symbol) {
|
|
54
|
+
return symbol.kind === 'constant'
|
|
55
|
+
? (symbol.value ?? 0) & 0xffff
|
|
56
|
+
: (symbol.address ?? 0) & 0xffff;
|
|
57
|
+
}
|
|
58
|
+
function symbolTieBreaker(a, b) {
|
|
59
|
+
if (a.kind === 'constant' && b.kind === 'constant') {
|
|
60
|
+
return (a.value ?? 0) - (b.value ?? 0);
|
|
61
|
+
}
|
|
62
|
+
return (a.size ?? 0) - (b.size ?? 0);
|
|
63
|
+
}
|
|
64
|
+
export function compareFileSymbol(a, b) {
|
|
65
|
+
return compareSymbol(a, b);
|
|
66
|
+
}
|
|
67
|
+
export function compareSegment(a, b) {
|
|
68
|
+
if (a.start !== b.start)
|
|
69
|
+
return a.start - b.start;
|
|
70
|
+
if (a.end !== b.end)
|
|
71
|
+
return a.end - b.end;
|
|
72
|
+
if (a.lstLine !== b.lstLine)
|
|
73
|
+
return a.lstLine - b.lstLine;
|
|
74
|
+
const lineCmp = (a.line ?? 0) - (b.line ?? 0);
|
|
75
|
+
if (lineCmp !== 0)
|
|
76
|
+
return lineCmp;
|
|
77
|
+
const kindCmp = a.kind.localeCompare(b.kind);
|
|
78
|
+
if (kindCmp !== 0)
|
|
79
|
+
return kindCmp;
|
|
80
|
+
return a.confidence.localeCompare(b.confidence);
|
|
81
|
+
}
|
|
82
|
+
export function rangesOverlap(a, b) {
|
|
83
|
+
return a.start < b.end && b.start < a.end;
|
|
84
|
+
}
|
|
85
|
+
export function normalizeInputs(inputs, rootDir) {
|
|
86
|
+
const out = {};
|
|
87
|
+
for (const [key, value] of Object.entries(inputs)) {
|
|
88
|
+
if (value !== undefined && value.length > 0) {
|
|
89
|
+
out[key] = toHexFilePath(value, rootDir);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
return Object.keys(out).length > 0 ? out : undefined;
|
|
93
|
+
}
|
|
94
|
+
export function normalizeSourceSegments(sourceSegments, writtenSegments, rootDir) {
|
|
95
|
+
return coalesceSourceSegments(sourceSegments.flatMap((segment) => clipSourceSegmentToWrittenSegments(segment, writtenSegments).map((clipped) => ({
|
|
96
|
+
...clipped,
|
|
97
|
+
file: toHexFilePath(clipped.file, rootDir),
|
|
98
|
+
}))));
|
|
99
|
+
}
|
|
100
|
+
function clipSourceSegmentToWrittenSegments(segment, writtenSegments) {
|
|
101
|
+
const clipped = [];
|
|
102
|
+
for (const writtenSegment of writtenSegments) {
|
|
103
|
+
const start = Math.max(segment.start, writtenSegment.start);
|
|
104
|
+
const end = Math.min(segment.end, writtenSegment.end);
|
|
105
|
+
if (end > start) {
|
|
106
|
+
clipped.push({ ...segment, start, end });
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
return clipped;
|
|
110
|
+
}
|
|
111
|
+
function coalesceSourceSegments(segments) {
|
|
112
|
+
const sorted = [...segments].sort((a, b) => a.file.localeCompare(b.file) ||
|
|
113
|
+
a.line - b.line ||
|
|
114
|
+
a.column - b.column ||
|
|
115
|
+
a.kind.localeCompare(b.kind) ||
|
|
116
|
+
a.confidence.localeCompare(b.confidence) ||
|
|
117
|
+
a.start - b.start ||
|
|
118
|
+
a.end - b.end);
|
|
119
|
+
const coalesced = [];
|
|
120
|
+
for (const segment of sorted) {
|
|
121
|
+
const previous = coalesced[coalesced.length - 1];
|
|
122
|
+
if (previous &&
|
|
123
|
+
previous.file === segment.file &&
|
|
124
|
+
previous.line === segment.line &&
|
|
125
|
+
previous.column === segment.column &&
|
|
126
|
+
previous.kind === segment.kind &&
|
|
127
|
+
previous.confidence === segment.confidence &&
|
|
128
|
+
previous.end === segment.start) {
|
|
129
|
+
coalesced[coalesced.length - 1] = { ...previous, end: segment.end };
|
|
130
|
+
}
|
|
131
|
+
else {
|
|
132
|
+
coalesced.push(segment);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
return coalesced;
|
|
136
|
+
}
|
package/dist/src/outputs/hex.js
CHANGED
|
@@ -25,30 +25,18 @@ export function writeIntelHex(origin, bytes, reservedAddresses = [], initialized
|
|
|
25
25
|
return `${records.join('\n')}\n:00000001FF\n`;
|
|
26
26
|
}
|
|
27
27
|
function toNonReservedSegments(start, end, reservedAddresses, initializedAddresses) {
|
|
28
|
-
|
|
28
|
+
const bounds = initializedBounds(start, end, initializedAddresses);
|
|
29
|
+
if (!bounds)
|
|
29
30
|
return [];
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
if (inRangeInitialized.length === 0) {
|
|
33
|
-
return [];
|
|
34
|
-
}
|
|
35
|
-
const firstInitialized = inRangeInitialized.reduce((best, address) => Math.min(best, address), end);
|
|
36
|
-
const lastInitialized = inRangeInitialized.reduce((best, address) => Math.max(best, address), start - 1);
|
|
37
|
-
const reservedInRange = new Set(reservedAddresses.filter((address) => address >= start && address < end));
|
|
38
|
-
if (reservedInRange.size === 0) {
|
|
31
|
+
const reservedInRange = addressSetInRange(start, end, reservedAddresses);
|
|
32
|
+
if (reservedInRange.size === 0)
|
|
39
33
|
return [];
|
|
40
|
-
}
|
|
41
34
|
const segments = [];
|
|
42
35
|
let segmentStart;
|
|
43
36
|
let segmentEnd = start;
|
|
44
37
|
for (let address = start; address < end; address += 1) {
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
reservedInRange.has(address);
|
|
48
|
-
if (skipReserved) {
|
|
49
|
-
if (segmentStart !== undefined) {
|
|
50
|
-
segments.push({ start: segmentStart, end: segmentEnd });
|
|
51
|
-
}
|
|
38
|
+
if (shouldSkipReservedAddress(address, bounds, reservedInRange)) {
|
|
39
|
+
closeSegment(segments, segmentStart, segmentEnd);
|
|
52
40
|
segmentStart = undefined;
|
|
53
41
|
segmentEnd = address + 1;
|
|
54
42
|
continue;
|
|
@@ -63,6 +51,26 @@ function toNonReservedSegments(start, end, reservedAddresses, initializedAddress
|
|
|
63
51
|
}
|
|
64
52
|
return segments;
|
|
65
53
|
}
|
|
54
|
+
function initializedBounds(start, end, initializedAddresses) {
|
|
55
|
+
const inRange = initializedAddresses.filter((address) => address >= start && address < end);
|
|
56
|
+
if (inRange.length === 0)
|
|
57
|
+
return undefined;
|
|
58
|
+
return {
|
|
59
|
+
first: inRange.reduce((best, address) => Math.min(best, address), end),
|
|
60
|
+
last: inRange.reduce((best, address) => Math.max(best, address), start - 1),
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
function addressSetInRange(start, end, addresses) {
|
|
64
|
+
return new Set(addresses.filter((address) => address >= start && address < end));
|
|
65
|
+
}
|
|
66
|
+
function shouldSkipReservedAddress(address, initialized, reservedInRange) {
|
|
67
|
+
return address > initialized.first && address < initialized.last && reservedInRange.has(address);
|
|
68
|
+
}
|
|
69
|
+
function closeSegment(segments, segmentStart, segmentEnd) {
|
|
70
|
+
if (segmentStart !== undefined) {
|
|
71
|
+
segments.push({ start: segmentStart, end: segmentEnd });
|
|
72
|
+
}
|
|
73
|
+
}
|
|
66
74
|
function writeRecord(length, address, type, bytes) {
|
|
67
75
|
const fields = [length, (address >> 8) & 0xff, address & 0xff, type, ...bytes];
|
|
68
76
|
const checksum = ((~fields.reduce((sum, value) => sum + value, 0) + 1) & 0xff) >>> 0;
|
|
@@ -50,27 +50,33 @@ export interface HexArtifact {
|
|
|
50
50
|
path?: string;
|
|
51
51
|
text: string;
|
|
52
52
|
}
|
|
53
|
-
/** In-memory register
|
|
54
|
-
export interface
|
|
55
|
-
kind: 'register-
|
|
53
|
+
/** In-memory register contracts audit report artifact. */
|
|
54
|
+
export interface RegisterContractsReportArtifact {
|
|
55
|
+
kind: 'register-contracts-report';
|
|
56
56
|
path?: string;
|
|
57
57
|
text: string;
|
|
58
58
|
}
|
|
59
|
-
/**
|
|
60
|
-
export
|
|
61
|
-
|
|
59
|
+
/** @deprecated Use RegisterContractsReportArtifact. */
|
|
60
|
+
export type RegisterCareReportArtifact = RegisterContractsReportArtifact;
|
|
61
|
+
/** In-memory inferred register contracts interface artifact. */
|
|
62
|
+
export interface RegisterContractsInterfaceArtifact {
|
|
63
|
+
kind: 'register-contracts-interface';
|
|
62
64
|
path?: string;
|
|
63
65
|
text: string;
|
|
64
66
|
}
|
|
65
|
-
/**
|
|
66
|
-
export
|
|
67
|
-
|
|
67
|
+
/** @deprecated Use RegisterContractsInterfaceArtifact. */
|
|
68
|
+
export type RegisterCareInterfaceArtifact = RegisterContractsInterfaceArtifact;
|
|
69
|
+
/** In-memory register contracts source annotation artifact. */
|
|
70
|
+
export interface RegisterContractsAnnotationsArtifact {
|
|
71
|
+
kind: 'register-contracts-annotations';
|
|
68
72
|
path?: string;
|
|
69
73
|
files: {
|
|
70
74
|
path: string;
|
|
71
75
|
text: string;
|
|
72
76
|
}[];
|
|
73
77
|
}
|
|
78
|
+
/** @deprecated Use RegisterContractsAnnotationsArtifact. */
|
|
79
|
+
export type RegisterCareAnnotationsArtifact = RegisterContractsAnnotationsArtifact;
|
|
74
80
|
/** Lowered .z80 artifact. */
|
|
75
81
|
export interface Asm80Artifact {
|
|
76
82
|
kind: 'asm80';
|
|
@@ -159,7 +165,7 @@ export interface WriteD8mOptions {
|
|
|
159
165
|
}
|
|
160
166
|
export interface WriteAsm80Options {
|
|
161
167
|
}
|
|
162
|
-
export type Artifact = BinArtifact | HexArtifact | D8mArtifact | Asm80Artifact |
|
|
168
|
+
export type Artifact = BinArtifact | HexArtifact | D8mArtifact | Asm80Artifact | RegisterContractsReportArtifact | RegisterContractsInterfaceArtifact | RegisterContractsAnnotationsArtifact;
|
|
163
169
|
/** Writer contract used by the compile API. */
|
|
164
170
|
export interface FormatWriters {
|
|
165
171
|
writeHex(map: EmittedByteMap, symbols: readonly SymbolEntry[], opts?: WriteHexOptions): HexArtifact;
|