@jhlagado/azm 0.2.7 → 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.
Files changed (235) hide show
  1. package/README.md +170 -69
  2. package/dist/src/api-artifacts.d.ts +20 -0
  3. package/dist/src/api-artifacts.js +165 -0
  4. package/dist/src/api-compile.d.ts +8 -2
  5. package/dist/src/api-compile.js +31 -230
  6. package/dist/src/api-register-contracts.d.ts +9 -0
  7. package/dist/src/api-register-contracts.js +77 -0
  8. package/dist/src/api-tooling.d.ts +2 -2
  9. package/dist/src/api-tooling.js +1 -1
  10. package/dist/src/assembly/address-planning.d.ts +1 -2
  11. package/dist/src/assembly/address-planning.js +119 -218
  12. package/dist/src/assembly/address-symbols.d.ts +12 -0
  13. package/dist/src/assembly/address-symbols.js +118 -0
  14. package/dist/src/assembly/fixup-emission.js +30 -48
  15. package/dist/src/assembly/program-emission.js +163 -164
  16. package/dist/src/cli/artifact-files.d.ts +15 -0
  17. package/dist/src/cli/artifact-files.js +86 -0
  18. package/dist/src/cli/parse-args.d.ts +6 -5
  19. package/dist/src/cli/parse-args.js +162 -136
  20. package/dist/src/cli/run.js +4 -1
  21. package/dist/src/cli/usage.d.ts +1 -0
  22. package/dist/src/cli/usage.js +33 -0
  23. package/dist/src/cli/write-artifacts.js +18 -91
  24. package/dist/src/core/compile.js +51 -274
  25. package/dist/src/core/conditional-assembly.d.ts +6 -0
  26. package/dist/src/core/conditional-assembly.js +181 -0
  27. package/dist/src/expansion/op-constant-expression.d.ts +3 -0
  28. package/dist/src/expansion/op-constant-expression.js +52 -0
  29. package/dist/src/expansion/op-expand-selected.d.ts +5 -0
  30. package/dist/src/expansion/op-expand-selected.js +143 -0
  31. package/dist/src/expansion/op-expansion.d.ts +5 -53
  32. package/dist/src/expansion/op-expansion.js +85 -815
  33. package/dist/src/expansion/op-instruction-instantiation.d.ts +3 -0
  34. package/dist/src/expansion/op-instruction-instantiation.js +194 -0
  35. package/dist/src/expansion/op-local-labels.d.ts +8 -0
  36. package/dist/src/expansion/op-local-labels.js +166 -0
  37. package/dist/src/expansion/op-operand-splitting.d.ts +1 -0
  38. package/dist/src/expansion/op-operand-splitting.js +44 -0
  39. package/dist/src/expansion/op-operands.d.ts +53 -0
  40. package/dist/src/expansion/op-operands.js +66 -0
  41. package/dist/src/expansion/op-selection.d.ts +18 -0
  42. package/dist/src/expansion/op-selection.js +172 -0
  43. package/dist/src/index.d.ts +2 -1
  44. package/dist/src/index.js +1 -1
  45. package/dist/src/model/diagnostic.d.ts +4 -0
  46. package/dist/src/model/diagnostic.js +4 -0
  47. package/dist/src/outputs/asm80-expression-evaluation.d.ts +10 -0
  48. package/dist/src/outputs/asm80-expression-evaluation.js +75 -0
  49. package/dist/src/outputs/asm80-expressions.d.ts +5 -0
  50. package/dist/src/outputs/asm80-expressions.js +47 -0
  51. package/dist/src/outputs/asm80-instruction-operands.d.ts +16 -0
  52. package/dist/src/outputs/asm80-instruction-operands.js +38 -0
  53. package/dist/src/outputs/asm80-instructions.d.ts +5 -0
  54. package/dist/src/outputs/asm80-instructions.js +272 -0
  55. package/dist/src/outputs/asm80-ld-operands.d.ts +10 -0
  56. package/dist/src/outputs/asm80-ld-operands.js +157 -0
  57. package/dist/src/outputs/asm80-strings.d.ts +4 -0
  58. package/dist/src/outputs/asm80-strings.js +14 -0
  59. package/dist/src/outputs/d8-files.d.ts +10 -0
  60. package/dist/src/outputs/d8-files.js +103 -0
  61. package/dist/src/outputs/d8-helpers.d.ts +21 -0
  62. package/dist/src/outputs/d8-helpers.js +136 -0
  63. package/dist/src/outputs/hex.js +26 -18
  64. package/dist/src/outputs/types.d.ts +16 -10
  65. package/dist/src/outputs/write-asm80.js +68 -597
  66. package/dist/src/outputs/write-d8.js +6 -216
  67. package/dist/src/register-contracts/accept-output.d.ts +2 -0
  68. package/dist/src/register-contracts/analyze-helpers.d.ts +29 -0
  69. package/dist/src/register-contracts/analyze-helpers.js +162 -0
  70. package/dist/src/{register-care → register-contracts}/analyze.d.ts +6 -6
  71. package/dist/src/register-contracts/analyze.js +73 -0
  72. package/dist/src/register-contracts/annotate.d.ts +11 -0
  73. package/dist/src/{register-care → register-contracts}/annotate.js +3 -3
  74. package/dist/src/register-contracts/annotations.d.ts +8 -0
  75. package/dist/src/{register-care → register-contracts}/annotations.js +3 -3
  76. package/dist/src/register-contracts/boundaryHints.d.ts +3 -0
  77. package/dist/src/register-contracts/boundaryHints.js +24 -0
  78. package/dist/src/register-contracts/carriers.d.ts +2 -0
  79. package/dist/src/register-contracts/constants.d.ts +4 -0
  80. package/dist/src/register-contracts/constants.js +51 -0
  81. package/dist/src/register-contracts/controlFlow.d.ts +5 -0
  82. package/dist/src/register-contracts/controlFlow.js +55 -0
  83. package/dist/src/register-contracts/fix.d.ts +11 -0
  84. package/dist/src/{register-care → register-contracts}/fix.js +47 -30
  85. package/dist/src/register-contracts/instruction-head.d.ts +2 -0
  86. package/dist/src/register-contracts/instruction-head.js +3 -0
  87. package/dist/src/register-contracts/instruction-operands.d.ts +3 -0
  88. package/dist/src/register-contracts/instruction-operands.js +101 -0
  89. package/dist/src/register-contracts/instruction-predicates.d.ts +6 -0
  90. package/dist/src/register-contracts/instruction-predicates.js +44 -0
  91. package/dist/src/register-contracts/interfaceContracts.d.ts +2 -0
  92. package/dist/src/register-contracts/interfaceContracts.js +68 -0
  93. package/dist/src/register-contracts/liveness.d.ts +3 -0
  94. package/dist/src/{register-care → register-contracts}/liveness.js +111 -79
  95. package/dist/src/register-contracts/operand-register-name.d.ts +2 -0
  96. package/dist/src/register-contracts/operand-register-name.js +13 -0
  97. package/dist/src/{register-care → register-contracts}/profiles.d.ts +5 -5
  98. package/dist/src/{register-care → register-contracts}/profiles.js +2 -2
  99. package/dist/src/register-contracts/programModel-boundaries.d.ts +6 -0
  100. package/dist/src/register-contracts/programModel-boundaries.js +64 -0
  101. package/dist/src/register-contracts/programModel-routines.d.ts +7 -0
  102. package/dist/src/register-contracts/programModel-routines.js +128 -0
  103. package/dist/src/register-contracts/programModel.d.ts +3 -0
  104. package/dist/src/register-contracts/programModel.js +14 -0
  105. package/dist/src/register-contracts/report.d.ts +5 -0
  106. package/dist/src/{register-care → register-contracts}/report.js +34 -17
  107. package/dist/src/register-contracts/routine-summaries.d.ts +6 -0
  108. package/dist/src/{register-care → register-contracts}/routine-summaries.js +11 -1
  109. package/dist/src/register-contracts/smartCommentBlocks.d.ts +5 -0
  110. package/dist/src/register-contracts/smartCommentBlocks.js +30 -0
  111. package/dist/src/register-contracts/smartCommentParsing.d.ts +3 -0
  112. package/dist/src/register-contracts/smartCommentParsing.js +80 -0
  113. package/dist/src/register-contracts/smartComments.d.ts +5 -0
  114. package/dist/src/register-contracts/smartComments.js +92 -0
  115. package/dist/src/register-contracts/summaries.d.ts +12 -0
  116. package/dist/src/{register-care → register-contracts}/summaries.js +7 -7
  117. package/dist/src/register-contracts/summary-boundary.d.ts +2 -0
  118. package/dist/src/register-contracts/summary-boundary.js +40 -0
  119. package/dist/src/register-contracts/summary-contract.d.ts +2 -0
  120. package/dist/src/register-contracts/summary-contract.js +45 -0
  121. package/dist/src/register-contracts/summary-result.d.ts +7 -0
  122. package/dist/src/register-contracts/summary-result.js +122 -0
  123. package/dist/src/register-contracts/summary-state.d.ts +23 -0
  124. package/dist/src/register-contracts/summary-state.js +88 -0
  125. package/dist/src/register-contracts/summary-token-transfer.d.ts +3 -0
  126. package/dist/src/register-contracts/summary-token-transfer.js +67 -0
  127. package/dist/src/register-contracts/summary.d.ts +3 -0
  128. package/dist/src/register-contracts/summary.js +266 -0
  129. package/dist/src/register-contracts/tooling.d.ts +57 -0
  130. package/dist/src/{register-care → register-contracts}/tooling.js +8 -6
  131. package/dist/src/register-contracts/types.d.ts +188 -0
  132. package/dist/src/semantics/binary-operators.d.ts +2 -0
  133. package/dist/src/semantics/binary-operators.js +15 -0
  134. package/dist/src/semantics/byte-functions.d.ts +2 -0
  135. package/dist/src/semantics/byte-functions.js +7 -0
  136. package/dist/src/semantics/constant-operator-types.d.ts +10 -0
  137. package/dist/src/semantics/constant-operator-types.js +1 -0
  138. package/dist/src/semantics/constant-operators.d.ts +3 -0
  139. package/dist/src/semantics/constant-operators.js +3 -0
  140. package/dist/src/semantics/diagnostics.d.ts +3 -0
  141. package/dist/src/semantics/diagnostics.js +10 -0
  142. package/dist/src/semantics/expression-evaluation.d.ts +11 -19
  143. package/dist/src/semantics/expression-evaluation.js +22 -334
  144. package/dist/src/semantics/layout-evaluation.d.ts +23 -0
  145. package/dist/src/semantics/layout-evaluation.js +202 -0
  146. package/dist/src/semantics/layout-format.d.ts +5 -0
  147. package/dist/src/semantics/layout-format.js +31 -0
  148. package/dist/src/semantics/layout-path.d.ts +24 -0
  149. package/dist/src/semantics/layout-path.js +58 -0
  150. package/dist/src/semantics/unary-operators.d.ts +2 -0
  151. package/dist/src/semantics/unary-operators.js +8 -0
  152. package/dist/src/source/line-comment-scanner.d.ts +1 -0
  153. package/dist/src/source/line-comment-scanner.js +51 -0
  154. package/dist/src/source/strip-line-comment.js +8 -44
  155. package/dist/src/syntax/directive-aliases.js +36 -22
  156. package/dist/src/syntax/expression-tokenizer.d.ts +30 -0
  157. package/dist/src/syntax/expression-tokenizer.js +310 -0
  158. package/dist/src/syntax/parse-directive-statement.d.ts +14 -0
  159. package/dist/src/syntax/parse-directive-statement.js +307 -0
  160. package/dist/src/syntax/parse-expression.d.ts +2 -2
  161. package/dist/src/syntax/parse-expression.js +7 -568
  162. package/dist/src/syntax/parse-layout-declarations.d.ts +9 -0
  163. package/dist/src/syntax/parse-layout-declarations.js +180 -0
  164. package/dist/src/syntax/parse-layout-expression.d.ts +5 -0
  165. package/dist/src/syntax/parse-layout-expression.js +175 -0
  166. package/dist/src/syntax/parse-line.js +4 -272
  167. package/dist/src/syntax/parse-token-expression.d.ts +3 -0
  168. package/dist/src/syntax/parse-token-expression.js +133 -0
  169. package/dist/src/tooling/case-style.js +47 -30
  170. package/dist/src/z80/effect-groups.d.ts +38 -0
  171. package/dist/src/z80/effect-groups.js +265 -0
  172. package/dist/src/z80/effect-units.d.ts +18 -0
  173. package/dist/src/z80/effect-units.js +165 -0
  174. package/dist/src/z80/effects.d.ts +1 -1
  175. package/dist/src/z80/effects.js +94 -557
  176. package/dist/src/z80/encode-core.d.ts +2 -0
  177. package/dist/src/z80/encode-core.js +42 -0
  178. package/dist/src/z80/encode-ld-helpers.d.ts +25 -0
  179. package/dist/src/z80/encode-ld-helpers.js +172 -0
  180. package/dist/src/z80/encode-ld.d.ts +2 -0
  181. package/dist/src/z80/encode-ld.js +285 -0
  182. package/dist/src/z80/encode.js +190 -542
  183. package/dist/src/z80/ld-support.d.ts +3 -0
  184. package/dist/src/z80/ld-support.js +146 -0
  185. package/dist/src/z80/operand-split-state.d.ts +8 -0
  186. package/dist/src/z80/operand-split-state.js +46 -0
  187. package/dist/src/z80/operand-split.d.ts +1 -0
  188. package/dist/src/z80/operand-split.js +13 -0
  189. package/dist/src/z80/parse-basic.d.ts +4 -0
  190. package/dist/src/z80/parse-basic.js +39 -0
  191. package/dist/src/z80/parse-branch.d.ts +4 -0
  192. package/dist/src/z80/parse-branch.js +218 -0
  193. package/dist/src/z80/parse-conditions.d.ts +6 -0
  194. package/dist/src/z80/parse-conditions.js +10 -0
  195. package/dist/src/z80/parse-exchange.d.ts +2 -0
  196. package/dist/src/z80/parse-exchange.js +30 -0
  197. package/dist/src/z80/parse-instruction.js +224 -1010
  198. package/dist/src/z80/parse-io-control.d.ts +5 -0
  199. package/dist/src/z80/parse-io-control.js +108 -0
  200. package/dist/src/z80/parse-ld.d.ts +2 -0
  201. package/dist/src/z80/parse-ld.js +83 -0
  202. package/dist/src/z80/parse-operands.d.ts +41 -0
  203. package/dist/src/z80/parse-operands.js +259 -0
  204. package/docs/reference/cli.md +42 -35
  205. package/docs/reference/tooling-api.md +20 -16
  206. package/package.json +1 -1
  207. package/dist/src/register-care/accept-output.d.ts +0 -2
  208. package/dist/src/register-care/analyze.js +0 -166
  209. package/dist/src/register-care/annotate.d.ts +0 -11
  210. package/dist/src/register-care/annotations.d.ts +0 -8
  211. package/dist/src/register-care/boundaryHints.d.ts +0 -3
  212. package/dist/src/register-care/boundaryHints.js +0 -80
  213. package/dist/src/register-care/carriers.d.ts +0 -2
  214. package/dist/src/register-care/controlFlow.d.ts +0 -5
  215. package/dist/src/register-care/controlFlow.js +0 -38
  216. package/dist/src/register-care/fix.d.ts +0 -11
  217. package/dist/src/register-care/instruction-shape.d.ts +0 -11
  218. package/dist/src/register-care/instruction-shape.js +0 -129
  219. package/dist/src/register-care/liveness.d.ts +0 -3
  220. package/dist/src/register-care/programModel.d.ts +0 -3
  221. package/dist/src/register-care/programModel.js +0 -266
  222. package/dist/src/register-care/report.d.ts +0 -5
  223. package/dist/src/register-care/routine-summaries.d.ts +0 -6
  224. package/dist/src/register-care/smartComments.d.ts +0 -5
  225. package/dist/src/register-care/smartComments.js +0 -243
  226. package/dist/src/register-care/summaries.d.ts +0 -12
  227. package/dist/src/register-care/summary.d.ts +0 -3
  228. package/dist/src/register-care/summary.js +0 -474
  229. package/dist/src/register-care/tooling.d.ts +0 -43
  230. package/dist/src/register-care/types.d.ts +0 -172
  231. /package/dist/src/{register-care → register-contracts}/accept-output.js +0 -0
  232. /package/dist/src/{register-care → register-contracts}/carriers.js +0 -0
  233. /package/dist/src/{register-care → register-contracts}/sourceText.d.ts +0 -0
  234. /package/dist/src/{register-care → register-contracts}/sourceText.js +0 -0
  235. /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
+ }
@@ -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
- if (reservedAddresses.length === 0 || initializedAddresses.length === 0) {
28
+ const bounds = initializedBounds(start, end, initializedAddresses);
29
+ if (!bounds)
29
30
  return [];
30
- }
31
- const inRangeInitialized = initializedAddresses.filter((address) => address >= start && address < end);
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
- const skipReserved = address > firstInitialized &&
46
- address < lastInitialized &&
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-care audit report artifact. */
54
- export interface RegisterCareReportArtifact {
55
- kind: 'register-care-report';
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
- /** In-memory inferred register-care interface artifact. */
60
- export interface RegisterCareInterfaceArtifact {
61
- kind: 'register-care-interface';
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
- /** In-memory register-care source annotation artifact. */
66
- export interface RegisterCareAnnotationsArtifact {
67
- kind: 'register-care-annotations';
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 | RegisterCareReportArtifact | RegisterCareInterfaceArtifact | RegisterCareAnnotationsArtifact;
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;