@jhlagado/azm 0.1.1 → 0.2.1

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 (423) hide show
  1. package/README.md +103 -70
  2. package/dist/{src → legacy-root-azm/src}/formats/index.d.ts +1 -1
  3. package/dist/{src → legacy-root-azm/src}/formats/index.js +1 -1
  4. package/dist/{src → legacy-root-azm/src}/formats/types.d.ts +67 -7
  5. package/dist/{src → legacy-root-azm/src}/formats/writeHex.d.ts +0 -1
  6. package/dist/{src → legacy-root-azm/src}/formats/writeHex.js +0 -1
  7. package/dist/{src → legacy-root-azm/src}/pipeline.d.ts +3 -5
  8. package/dist/legacy-root-azm/src/z80/effects.d.ts +3 -0
  9. package/dist/legacy-root-azm/src/z80/effects.js +516 -0
  10. package/dist/legacy-root-azm/src/z80/encode.d.ts +10 -0
  11. package/dist/legacy-root-azm/src/z80/encode.js +412 -0
  12. package/dist/src/api-compile.d.ts +49 -8
  13. package/dist/src/api-compile.js +313 -3
  14. package/dist/src/api-tooling.d.ts +7 -25
  15. package/dist/src/api-tooling.js +3 -21
  16. package/dist/src/assembly/address-planning.d.ts +19 -0
  17. package/dist/src/assembly/address-planning.js +268 -0
  18. package/dist/src/assembly/assemble-program.d.ts +13 -0
  19. package/dist/src/assembly/assemble-program.js +34 -0
  20. package/dist/src/assembly/fixup-emission.d.ts +10 -0
  21. package/dist/src/assembly/fixup-emission.js +247 -0
  22. package/dist/src/assembly/placement.d.ts +26 -0
  23. package/dist/src/assembly/placement.js +79 -0
  24. package/dist/src/assembly/program-emission.d.ts +13 -0
  25. package/dist/src/assembly/program-emission.js +268 -0
  26. package/dist/src/cli/parse-args.d.ts +29 -0
  27. package/dist/src/cli/parse-args.js +372 -0
  28. package/dist/src/cli/run.d.ts +2 -0
  29. package/dist/src/cli/run.js +35 -0
  30. package/dist/src/cli/write-artifacts.d.ts +21 -0
  31. package/dist/src/cli/write-artifacts.js +175 -0
  32. package/dist/src/cli.d.ts +1 -30
  33. package/dist/src/cli.js +20 -524
  34. package/dist/src/core/compile-artifacts.d.ts +26 -0
  35. package/dist/src/core/compile-artifacts.js +17 -0
  36. package/dist/src/core/compile.d.ts +26 -0
  37. package/dist/src/core/compile.js +164 -0
  38. package/dist/src/diagnostics/format.d.ts +4 -0
  39. package/dist/src/diagnostics/format.js +9 -0
  40. package/dist/src/expansion/op-expansion.d.ts +96 -0
  41. package/dist/src/expansion/op-expansion.js +913 -0
  42. package/dist/src/index.d.ts +14 -3
  43. package/dist/src/index.js +7 -2
  44. package/dist/src/model/diagnostic.d.ts +50 -0
  45. package/dist/src/model/diagnostic.js +29 -0
  46. package/dist/src/model/expression.d.ts +51 -0
  47. package/dist/src/model/expression.js +1 -0
  48. package/dist/src/model/fixup.d.ts +18 -0
  49. package/dist/src/model/fixup.js +1 -0
  50. package/dist/src/model/source-item.d.ts +87 -0
  51. package/dist/src/model/source-item.js +1 -0
  52. package/dist/src/model/symbol.d.ts +1 -0
  53. package/dist/src/model/symbol.js +1 -0
  54. package/dist/src/node/source-host.d.ts +19 -0
  55. package/dist/src/node/source-host.js +146 -0
  56. package/dist/src/outputs/hex.d.ts +1 -0
  57. package/dist/src/outputs/hex.js +75 -0
  58. package/dist/src/outputs/index.d.ts +3 -0
  59. package/dist/src/outputs/index.js +13 -0
  60. package/dist/src/outputs/range.d.ts +3 -0
  61. package/dist/src/outputs/range.js +31 -0
  62. package/dist/src/outputs/types.d.ts +182 -0
  63. package/dist/src/outputs/types.js +1 -0
  64. package/dist/src/outputs/write-asm80.d.ts +7 -0
  65. package/dist/src/outputs/write-asm80.js +666 -0
  66. package/dist/src/outputs/write-bin.d.ts +2 -0
  67. package/dist/src/outputs/write-bin.js +27 -0
  68. package/dist/src/outputs/write-d8.d.ts +2 -0
  69. package/dist/src/outputs/write-d8.js +257 -0
  70. package/dist/src/outputs/write-hex.d.ts +2 -0
  71. package/dist/src/outputs/write-hex.js +53 -0
  72. package/dist/src/outputs/write-listing.d.ts +2 -0
  73. package/dist/src/outputs/write-listing.js +79 -0
  74. package/dist/src/register-care/accept-output.d.ts +2 -0
  75. package/dist/src/register-care/accept-output.js +35 -0
  76. package/dist/src/register-care/analyze.d.ts +26 -0
  77. package/dist/src/register-care/analyze.js +115 -0
  78. package/dist/src/register-care/annotate.d.ts +11 -0
  79. package/dist/src/register-care/annotate.js +76 -0
  80. package/dist/src/register-care/annotations.d.ts +8 -0
  81. package/dist/src/register-care/annotations.js +41 -0
  82. package/dist/src/register-care/boundaryHints.d.ts +2 -0
  83. package/dist/src/register-care/boundaryHints.js +11 -0
  84. package/dist/src/register-care/carriers.d.ts +2 -0
  85. package/dist/src/register-care/carriers.js +78 -0
  86. package/dist/src/register-care/controlFlow.d.ts +5 -0
  87. package/dist/src/register-care/controlFlow.js +38 -0
  88. package/dist/src/register-care/fix.d.ts +11 -0
  89. package/dist/src/register-care/fix.js +130 -0
  90. package/dist/src/register-care/instruction-shape.d.ts +11 -0
  91. package/dist/src/register-care/instruction-shape.js +129 -0
  92. package/dist/src/register-care/liveness.d.ts +3 -0
  93. package/dist/src/register-care/liveness.js +197 -0
  94. package/dist/src/register-care/profiles.d.ts +9 -0
  95. package/dist/src/register-care/profiles.js +47 -0
  96. package/dist/src/register-care/programModel.d.ts +3 -0
  97. package/dist/src/register-care/programModel.js +188 -0
  98. package/dist/src/register-care/report.d.ts +5 -0
  99. package/dist/src/register-care/report.js +139 -0
  100. package/dist/src/register-care/routine-summaries.d.ts +6 -0
  101. package/dist/src/register-care/routine-summaries.js +89 -0
  102. package/dist/src/register-care/smartComments.d.ts +5 -0
  103. package/dist/src/register-care/smartComments.js +243 -0
  104. package/dist/src/register-care/sourceText.d.ts +8 -0
  105. package/dist/src/register-care/sourceText.js +15 -0
  106. package/dist/src/register-care/summaries.d.ts +12 -0
  107. package/dist/src/register-care/summaries.js +121 -0
  108. package/dist/src/register-care/summary.d.ts +3 -0
  109. package/dist/src/register-care/summary.js +474 -0
  110. package/dist/src/{registerCare → register-care}/tooling.d.ts +7 -6
  111. package/dist/src/{registerCare → register-care}/tooling.js +17 -6
  112. package/dist/src/register-care/types.d.ts +170 -0
  113. package/dist/src/register-care/types.js +1 -0
  114. package/dist/src/semantics/expression-evaluation.d.ts +29 -0
  115. package/dist/src/semantics/expression-evaluation.js +409 -0
  116. package/dist/src/source/logical-lines.d.ts +7 -0
  117. package/dist/src/source/logical-lines.js +11 -0
  118. package/dist/src/source/source-file.d.ts +5 -0
  119. package/dist/src/source/source-file.js +3 -0
  120. package/dist/src/source/source-span.d.ts +5 -0
  121. package/dist/src/source/source-span.js +1 -0
  122. package/dist/src/source/strip-line-comment.d.ts +6 -0
  123. package/dist/src/source/strip-line-comment.js +53 -0
  124. package/dist/src/syntax/directive-aliases.d.ts +10 -0
  125. package/dist/src/syntax/directive-aliases.js +199 -0
  126. package/dist/src/syntax/parse-diagnostics.d.ts +12 -0
  127. package/dist/src/syntax/parse-diagnostics.js +18 -0
  128. package/dist/src/syntax/parse-expression.d.ts +3 -0
  129. package/dist/src/syntax/parse-expression.js +551 -0
  130. package/dist/src/syntax/parse-line.d.ts +12 -0
  131. package/dist/src/syntax/parse-line.js +382 -0
  132. package/dist/src/tooling/api.d.ts +42 -0
  133. package/dist/src/tooling/api.js +42 -0
  134. package/dist/src/tooling/case-style.d.ts +8 -0
  135. package/dist/src/tooling/case-style.js +163 -0
  136. package/dist/src/z80/effects.d.ts +3 -3
  137. package/dist/src/z80/effects.js +349 -302
  138. package/dist/src/z80/encode.d.ts +2 -10
  139. package/dist/src/z80/encode.js +951 -374
  140. package/dist/src/z80/instruction.d.ts +226 -0
  141. package/dist/src/z80/instruction.js +1 -0
  142. package/dist/src/z80/parse-instruction.d.ts +7 -0
  143. package/dist/src/z80/parse-instruction.js +1068 -0
  144. package/docs/reference/tooling-api.md +68 -9
  145. package/package.json +22 -3
  146. /package/dist/{src → legacy-root-azm/src}/analysis.d.ts +0 -0
  147. /package/dist/{src → legacy-root-azm/src}/analysis.js +0 -0
  148. /package/dist/{src → legacy-root-azm/src}/compile.d.ts +0 -0
  149. /package/dist/{src → legacy-root-azm/src}/compile.js +0 -0
  150. /package/dist/{src → legacy-root-azm/src}/compileShared.d.ts +0 -0
  151. /package/dist/{src → legacy-root-azm/src}/compileShared.js +0 -0
  152. /package/dist/{src → legacy-root-azm/src}/diagnosticTypes.d.ts +0 -0
  153. /package/dist/{src → legacy-root-azm/src}/diagnosticTypes.js +0 -0
  154. /package/dist/{src → legacy-root-azm/src}/formats/range.d.ts +0 -0
  155. /package/dist/{src → legacy-root-azm/src}/formats/range.js +0 -0
  156. /package/dist/{src → legacy-root-azm/src}/formats/types.js +0 -0
  157. /package/dist/{src → legacy-root-azm/src}/formats/writeAsm80.d.ts +0 -0
  158. /package/dist/{src → legacy-root-azm/src}/formats/writeAsm80.js +0 -0
  159. /package/dist/{src → legacy-root-azm/src}/formats/writeBin.d.ts +0 -0
  160. /package/dist/{src → legacy-root-azm/src}/formats/writeBin.js +0 -0
  161. /package/dist/{src → legacy-root-azm/src}/formats/writeD8m.d.ts +0 -0
  162. /package/dist/{src → legacy-root-azm/src}/formats/writeD8m.js +0 -0
  163. /package/dist/{src → legacy-root-azm/src}/formats/writeListing.d.ts +0 -0
  164. /package/dist/{src → legacy-root-azm/src}/formats/writeListing.js +0 -0
  165. /package/dist/{src → legacy-root-azm/src}/frontend/asm80/asmLine.d.ts +0 -0
  166. /package/dist/{src → legacy-root-azm/src}/frontend/asm80/asmLine.js +0 -0
  167. /package/dist/{src → legacy-root-azm/src}/frontend/asm80/parseAsmRawValues.d.ts +0 -0
  168. /package/dist/{src → legacy-root-azm/src}/frontend/asm80/parseAsmRawValues.js +0 -0
  169. /package/dist/{src → legacy-root-azm/src}/frontend/asm80/quoteScan.d.ts +0 -0
  170. /package/dist/{src → legacy-root-azm/src}/frontend/asm80/quoteScan.js +0 -0
  171. /package/dist/{src → legacy-root-azm/src}/frontend/ast.d.ts +0 -0
  172. /package/dist/{src → legacy-root-azm/src}/frontend/ast.js +0 -0
  173. /package/dist/{src → legacy-root-azm/src}/frontend/directiveAliases.d.ts +0 -0
  174. /package/dist/{src → legacy-root-azm/src}/frontend/directiveAliases.js +0 -0
  175. /package/dist/{src → legacy-root-azm/src}/frontend/grammarData.d.ts +0 -0
  176. /package/dist/{src → legacy-root-azm/src}/frontend/grammarData.js +0 -0
  177. /package/dist/{src → legacy-root-azm/src}/frontend/immExprUtils.d.ts +0 -0
  178. /package/dist/{src → legacy-root-azm/src}/frontend/immExprUtils.js +0 -0
  179. /package/dist/{src → legacy-root-azm/src}/frontend/parseAsmFlatDirectiveLine.d.ts +0 -0
  180. /package/dist/{src → legacy-root-azm/src}/frontend/parseAsmFlatDirectiveLine.js +0 -0
  181. /package/dist/{src → legacy-root-azm/src}/frontend/parseAsmInstruction.d.ts +0 -0
  182. /package/dist/{src → legacy-root-azm/src}/frontend/parseAsmInstruction.js +0 -0
  183. /package/dist/{src → legacy-root-azm/src}/frontend/parseAsmStatements.d.ts +0 -0
  184. /package/dist/{src → legacy-root-azm/src}/frontend/parseAsmStatements.js +0 -0
  185. /package/dist/{src → legacy-root-azm/src}/frontend/parseAsmStream.d.ts +0 -0
  186. /package/dist/{src → legacy-root-azm/src}/frontend/parseAsmStream.js +0 -0
  187. /package/dist/{src → legacy-root-azm/src}/frontend/parseAsmTopLevel.d.ts +0 -0
  188. /package/dist/{src → legacy-root-azm/src}/frontend/parseAsmTopLevel.js +0 -0
  189. /package/dist/{src → legacy-root-azm/src}/frontend/parseDiagnostics.d.ts +0 -0
  190. /package/dist/{src → legacy-root-azm/src}/frontend/parseDiagnostics.js +0 -0
  191. /package/dist/{src → legacy-root-azm/src}/frontend/parseEnum.d.ts +0 -0
  192. /package/dist/{src → legacy-root-azm/src}/frontend/parseEnum.js +0 -0
  193. /package/dist/{src → legacy-root-azm/src}/frontend/parseImm.d.ts +0 -0
  194. /package/dist/{src → legacy-root-azm/src}/frontend/parseImm.js +0 -0
  195. /package/dist/{src → legacy-root-azm/src}/frontend/parseLogicalLines.d.ts +0 -0
  196. /package/dist/{src → legacy-root-azm/src}/frontend/parseLogicalLines.js +0 -0
  197. /package/dist/{src → legacy-root-azm/src}/frontend/parseOp.d.ts +0 -0
  198. /package/dist/{src → legacy-root-azm/src}/frontend/parseOp.js +0 -0
  199. /package/dist/{src → legacy-root-azm/src}/frontend/parseOpHeader.d.ts +0 -0
  200. /package/dist/{src → legacy-root-azm/src}/frontend/parseOpHeader.js +0 -0
  201. /package/dist/{src → legacy-root-azm/src}/frontend/parseOperands.d.ts +0 -0
  202. /package/dist/{src → legacy-root-azm/src}/frontend/parseOperands.js +0 -0
  203. /package/dist/{src → legacy-root-azm/src}/frontend/parseParams.d.ts +0 -0
  204. /package/dist/{src → legacy-root-azm/src}/frontend/parseParams.js +0 -0
  205. /package/dist/{src → legacy-root-azm/src}/frontend/parseParserRecovery.d.ts +0 -0
  206. /package/dist/{src → legacy-root-azm/src}/frontend/parseParserRecovery.js +0 -0
  207. /package/dist/{src → legacy-root-azm/src}/frontend/parseParserShared.d.ts +0 -0
  208. /package/dist/{src → legacy-root-azm/src}/frontend/parseParserShared.js +0 -0
  209. /package/dist/{src → legacy-root-azm/src}/frontend/parseRawDataDirectiveStart.d.ts +0 -0
  210. /package/dist/{src → legacy-root-azm/src}/frontend/parseRawDataDirectiveStart.js +0 -0
  211. /package/dist/{src → legacy-root-azm/src}/frontend/parseRawDataDirectives.d.ts +0 -0
  212. /package/dist/{src → legacy-root-azm/src}/frontend/parseRawDataDirectives.js +0 -0
  213. /package/dist/{src → legacy-root-azm/src}/frontend/parseRecordFieldDecl.d.ts +0 -0
  214. /package/dist/{src → legacy-root-azm/src}/frontend/parseRecordFieldDecl.js +0 -0
  215. /package/dist/{src → legacy-root-azm/src}/frontend/parseSourceItemDispatch.d.ts +0 -0
  216. /package/dist/{src → legacy-root-azm/src}/frontend/parseSourceItemDispatch.js +0 -0
  217. /package/dist/{src → legacy-root-azm/src}/frontend/parseSourceItemTable.d.ts +0 -0
  218. /package/dist/{src → legacy-root-azm/src}/frontend/parseSourceItemTable.js +0 -0
  219. /package/dist/{src → legacy-root-azm/src}/frontend/parseTopLevelCommon.d.ts +0 -0
  220. /package/dist/{src → legacy-root-azm/src}/frontend/parseTopLevelCommon.js +0 -0
  221. /package/dist/{src → legacy-root-azm/src}/frontend/parseTypes.d.ts +0 -0
  222. /package/dist/{src → legacy-root-azm/src}/frontend/parseTypes.js +0 -0
  223. /package/dist/{src → legacy-root-azm/src}/frontend/parser.d.ts +0 -0
  224. /package/dist/{src → legacy-root-azm/src}/frontend/parser.js +0 -0
  225. /package/dist/{src → legacy-root-azm/src}/frontend/source.d.ts +0 -0
  226. /package/dist/{src → legacy-root-azm/src}/frontend/source.js +0 -0
  227. /package/dist/{src → legacy-root-azm/src}/frontend/sourceExtensions.d.ts +0 -0
  228. /package/dist/{src → legacy-root-azm/src}/frontend/sourceExtensions.js +0 -0
  229. /package/dist/{src → legacy-root-azm/src}/lintCaseStyle.d.ts +0 -0
  230. /package/dist/{src → legacy-root-azm/src}/lintCaseStyle.js +0 -0
  231. /package/dist/{src → legacy-root-azm/src}/lowering/asmDirectiveLowering.d.ts +0 -0
  232. /package/dist/{src → legacy-root-azm/src}/lowering/asmDirectiveLowering.js +0 -0
  233. /package/dist/{src → legacy-root-azm/src}/lowering/asmDirectiveTraversal.d.ts +0 -0
  234. /package/dist/{src → legacy-root-azm/src}/lowering/asmDirectiveTraversal.js +0 -0
  235. /package/dist/{src → legacy-root-azm/src}/lowering/asmEquResolution.d.ts +0 -0
  236. /package/dist/{src → legacy-root-azm/src}/lowering/asmEquResolution.js +0 -0
  237. /package/dist/{src → legacy-root-azm/src}/lowering/asmInstructionLdHelpers.d.ts +0 -0
  238. /package/dist/{src → legacy-root-azm/src}/lowering/asmInstructionLdHelpers.js +0 -0
  239. /package/dist/{src → legacy-root-azm/src}/lowering/asmInstructionLowering.d.ts +0 -0
  240. /package/dist/{src → legacy-root-azm/src}/lowering/asmInstructionLowering.js +0 -0
  241. /package/dist/{src → legacy-root-azm/src}/lowering/asmInstructionStream.d.ts +0 -0
  242. /package/dist/{src → legacy-root-azm/src}/lowering/asmInstructionStream.js +0 -0
  243. /package/dist/{src → legacy-root-azm/src}/lowering/asmLoweringBranchCall.d.ts +0 -0
  244. /package/dist/{src → legacy-root-azm/src}/lowering/asmLoweringBranchCall.js +0 -0
  245. /package/dist/{src → legacy-root-azm/src}/lowering/asmLoweringHost.d.ts +0 -0
  246. /package/dist/{src → legacy-root-azm/src}/lowering/asmLoweringHost.js +0 -0
  247. /package/dist/{src → legacy-root-azm/src}/lowering/asmLoweringLd.d.ts +0 -0
  248. /package/dist/{src → legacy-root-azm/src}/lowering/asmLoweringLd.js +0 -0
  249. /package/dist/{src → legacy-root-azm/src}/lowering/asmRangeLowering.d.ts +0 -0
  250. /package/dist/{src → legacy-root-azm/src}/lowering/asmRangeLowering.js +0 -0
  251. /package/dist/{src → legacy-root-azm/src}/lowering/asmRawDataLowering.d.ts +0 -0
  252. /package/dist/{src → legacy-root-azm/src}/lowering/asmRawDataLowering.js +0 -0
  253. /package/dist/{src → legacy-root-azm/src}/lowering/asmSourceEmitter.d.ts +0 -0
  254. /package/dist/{src → legacy-root-azm/src}/lowering/asmSourceEmitter.js +0 -0
  255. /package/dist/{src → legacy-root-azm/src}/lowering/asmSourceInstructionLowering.d.ts +0 -0
  256. /package/dist/{src → legacy-root-azm/src}/lowering/asmSourceInstructionLowering.js +0 -0
  257. /package/dist/{src → legacy-root-azm/src}/lowering/asmUtils.d.ts +0 -0
  258. /package/dist/{src → legacy-root-azm/src}/lowering/asmUtils.js +0 -0
  259. /package/dist/{src → legacy-root-azm/src}/lowering/assemblerFlowSetup.d.ts +0 -0
  260. /package/dist/{src → legacy-root-azm/src}/lowering/assemblerFlowSetup.js +0 -0
  261. /package/dist/{src → legacy-root-azm/src}/lowering/assemblerLoweringContext.d.ts +0 -0
  262. /package/dist/{src → legacy-root-azm/src}/lowering/assemblerLoweringContext.js +0 -0
  263. /package/dist/{src → legacy-root-azm/src}/lowering/assemblerLoweringContextSplit.d.ts +0 -0
  264. /package/dist/{src → legacy-root-azm/src}/lowering/assemblerLoweringContextSplit.js +0 -0
  265. /package/dist/{src → legacy-root-azm/src}/lowering/assemblerLoweringPhases.d.ts +0 -0
  266. /package/dist/{src → legacy-root-azm/src}/lowering/assemblerLoweringPhases.js +0 -0
  267. /package/dist/{src → legacy-root-azm/src}/lowering/bytePlacement.d.ts +0 -0
  268. /package/dist/{src → legacy-root-azm/src}/lowering/bytePlacement.js +0 -0
  269. /package/dist/{src → legacy-root-azm/src}/lowering/capabilities.d.ts +0 -0
  270. /package/dist/{src → legacy-root-azm/src}/lowering/capabilities.js +0 -0
  271. /package/dist/{src → legacy-root-azm/src}/lowering/eaResolution.d.ts +0 -0
  272. /package/dist/{src → legacy-root-azm/src}/lowering/eaResolution.js +0 -0
  273. /package/dist/{src → legacy-root-azm/src}/lowering/emissionCore.d.ts +0 -0
  274. /package/dist/{src → legacy-root-azm/src}/lowering/emissionCore.js +0 -0
  275. /package/dist/{src → legacy-root-azm/src}/lowering/emit.d.ts +0 -0
  276. /package/dist/{src → legacy-root-azm/src}/lowering/emit.js +0 -0
  277. /package/dist/{src → legacy-root-azm/src}/lowering/emitContextBuilder.d.ts +0 -0
  278. /package/dist/{src → legacy-root-azm/src}/lowering/emitContextBuilder.js +0 -0
  279. /package/dist/{src → legacy-root-azm/src}/lowering/emitFinalization.d.ts +0 -0
  280. /package/dist/{src → legacy-root-azm/src}/lowering/emitFinalization.js +0 -0
  281. /package/dist/{src → legacy-root-azm/src}/lowering/emitFinalizationSetup.d.ts +0 -0
  282. /package/dist/{src → legacy-root-azm/src}/lowering/emitFinalizationSetup.js +0 -0
  283. /package/dist/{src → legacy-root-azm/src}/lowering/emitPhase1BuildProgramLoweringContext.d.ts +0 -0
  284. /package/dist/{src → legacy-root-azm/src}/lowering/emitPhase1BuildProgramLoweringContext.js +0 -0
  285. /package/dist/{src → legacy-root-azm/src}/lowering/emitPhase1Helpers.d.ts +0 -0
  286. /package/dist/{src → legacy-root-azm/src}/lowering/emitPhase1Helpers.js +0 -0
  287. /package/dist/{src → legacy-root-azm/src}/lowering/emitPhase1Types.d.ts +0 -0
  288. /package/dist/{src → legacy-root-azm/src}/lowering/emitPhase1Types.js +0 -0
  289. /package/dist/{src → legacy-root-azm/src}/lowering/emitPhase1WirePipeline.d.ts +0 -0
  290. /package/dist/{src → legacy-root-azm/src}/lowering/emitPhase1WirePipeline.js +0 -0
  291. /package/dist/{src → legacy-root-azm/src}/lowering/emitPhase1Workspace.d.ts +0 -0
  292. /package/dist/{src → legacy-root-azm/src}/lowering/emitPhase1Workspace.js +0 -0
  293. /package/dist/{src → legacy-root-azm/src}/lowering/emitPipeline.d.ts +0 -0
  294. /package/dist/{src → legacy-root-azm/src}/lowering/emitPipeline.js +0 -0
  295. /package/dist/{src → legacy-root-azm/src}/lowering/emitProgramContext.d.ts +0 -0
  296. /package/dist/{src → legacy-root-azm/src}/lowering/emitProgramContext.js +0 -0
  297. /package/dist/{src → legacy-root-azm/src}/lowering/emitState.d.ts +0 -0
  298. /package/dist/{src → legacy-root-azm/src}/lowering/emitState.js +0 -0
  299. /package/dist/{src → legacy-root-azm/src}/lowering/fixupBaseResolution.d.ts +0 -0
  300. /package/dist/{src → legacy-root-azm/src}/lowering/fixupBaseResolution.js +0 -0
  301. /package/dist/{src → legacy-root-azm/src}/lowering/fixupEmission.d.ts +0 -0
  302. /package/dist/{src → legacy-root-azm/src}/lowering/fixupEmission.js +0 -0
  303. /package/dist/{src → legacy-root-azm/src}/lowering/immMath.d.ts +0 -0
  304. /package/dist/{src → legacy-root-azm/src}/lowering/immMath.js +0 -0
  305. /package/dist/{src → legacy-root-azm/src}/lowering/inputAssets.d.ts +0 -0
  306. /package/dist/{src → legacy-root-azm/src}/lowering/inputAssets.js +0 -0
  307. /package/dist/{src → legacy-root-azm/src}/lowering/ldEncoding.d.ts +0 -0
  308. /package/dist/{src → legacy-root-azm/src}/lowering/ldEncoding.js +0 -0
  309. /package/dist/{src → legacy-root-azm/src}/lowering/ldEncodingRegMemHelpers.d.ts +0 -0
  310. /package/dist/{src → legacy-root-azm/src}/lowering/ldEncodingRegMemHelpers.js +0 -0
  311. /package/dist/{src → legacy-root-azm/src}/lowering/ldFormSelection.d.ts +0 -0
  312. /package/dist/{src → legacy-root-azm/src}/lowering/ldFormSelection.js +0 -0
  313. /package/dist/{src → legacy-root-azm/src}/lowering/ldLowering.d.ts +0 -0
  314. /package/dist/{src → legacy-root-azm/src}/lowering/ldLowering.js +0 -0
  315. /package/dist/{src → legacy-root-azm/src}/lowering/loweredAsmByteEmission.d.ts +0 -0
  316. /package/dist/{src → legacy-root-azm/src}/lowering/loweredAsmByteEmission.js +0 -0
  317. /package/dist/{src → legacy-root-azm/src}/lowering/loweredAsmPlacement.d.ts +0 -0
  318. /package/dist/{src → legacy-root-azm/src}/lowering/loweredAsmPlacement.js +0 -0
  319. /package/dist/{src → legacy-root-azm/src}/lowering/loweredAsmStreamRecording.d.ts +0 -0
  320. /package/dist/{src → legacy-root-azm/src}/lowering/loweredAsmStreamRecording.js +0 -0
  321. /package/dist/{src → legacy-root-azm/src}/lowering/loweredAsmTypes.d.ts +0 -0
  322. /package/dist/{src → legacy-root-azm/src}/lowering/loweredAsmTypes.js +0 -0
  323. /package/dist/{src → legacy-root-azm/src}/lowering/loweredFormat.d.ts +0 -0
  324. /package/dist/{src → legacy-root-azm/src}/lowering/loweredFormat.js +0 -0
  325. /package/dist/{src → legacy-root-azm/src}/lowering/loweredItemSize.d.ts +0 -0
  326. /package/dist/{src → legacy-root-azm/src}/lowering/loweredItemSize.js +0 -0
  327. /package/dist/{src → legacy-root-azm/src}/lowering/loweringDiagnostics.d.ts +0 -0
  328. /package/dist/{src → legacy-root-azm/src}/lowering/loweringDiagnostics.js +0 -0
  329. /package/dist/{src → legacy-root-azm/src}/lowering/loweringTypes.d.ts +0 -0
  330. /package/dist/{src → legacy-root-azm/src}/lowering/loweringTypes.js +0 -0
  331. /package/dist/{src → legacy-root-azm/src}/lowering/opCandidateRegistry.d.ts +0 -0
  332. /package/dist/{src → legacy-root-azm/src}/lowering/opCandidateRegistry.js +0 -0
  333. /package/dist/{src → legacy-root-azm/src}/lowering/opExpansionExecution.d.ts +0 -0
  334. /package/dist/{src → legacy-root-azm/src}/lowering/opExpansionExecution.js +0 -0
  335. /package/dist/{src → legacy-root-azm/src}/lowering/opExpansionOrchestration.d.ts +0 -0
  336. /package/dist/{src → legacy-root-azm/src}/lowering/opExpansionOrchestration.js +0 -0
  337. /package/dist/{src → legacy-root-azm/src}/lowering/opExpansionStream.d.ts +0 -0
  338. /package/dist/{src → legacy-root-azm/src}/lowering/opExpansionStream.js +0 -0
  339. /package/dist/{src → legacy-root-azm/src}/lowering/opMatching.d.ts +0 -0
  340. /package/dist/{src → legacy-root-azm/src}/lowering/opMatching.js +0 -0
  341. /package/dist/{src → legacy-root-azm/src}/lowering/opSubstitution.d.ts +0 -0
  342. /package/dist/{src → legacy-root-azm/src}/lowering/opSubstitution.js +0 -0
  343. /package/dist/{src → legacy-root-azm/src}/lowering/prescanTypes.d.ts +0 -0
  344. /package/dist/{src → legacy-root-azm/src}/lowering/prescanTypes.js +0 -0
  345. /package/dist/{src → legacy-root-azm/src}/lowering/programLowering.d.ts +0 -0
  346. /package/dist/{src → legacy-root-azm/src}/lowering/programLowering.js +0 -0
  347. /package/dist/{src → legacy-root-azm/src}/lowering/programLoweringDeclarations.d.ts +0 -0
  348. /package/dist/{src → legacy-root-azm/src}/lowering/programLoweringDeclarations.js +0 -0
  349. /package/dist/{src → legacy-root-azm/src}/lowering/programLoweringFinalize.d.ts +0 -0
  350. /package/dist/{src → legacy-root-azm/src}/lowering/programLoweringFinalize.js +0 -0
  351. /package/dist/{src → legacy-root-azm/src}/lowering/programLoweringTraversal.d.ts +0 -0
  352. /package/dist/{src → legacy-root-azm/src}/lowering/programLoweringTraversal.js +0 -0
  353. /package/dist/{src → legacy-root-azm/src}/lowering/programPrescan.d.ts +0 -0
  354. /package/dist/{src → legacy-root-azm/src}/lowering/programPrescan.js +0 -0
  355. /package/dist/{src → legacy-root-azm/src}/lowering/traceFormat.d.ts +0 -0
  356. /package/dist/{src → legacy-root-azm/src}/lowering/traceFormat.js +0 -0
  357. /package/dist/{src → legacy-root-azm/src}/packageInfo.d.ts +0 -0
  358. /package/dist/{src → legacy-root-azm/src}/packageInfo.js +0 -0
  359. /package/dist/{src → legacy-root-azm/src}/pathCompare.d.ts +0 -0
  360. /package/dist/{src → legacy-root-azm/src}/pathCompare.js +0 -0
  361. /package/dist/{src → legacy-root-azm/src}/pipeline.js +0 -0
  362. /package/dist/{src → legacy-root-azm/src}/registerCare/analyze.d.ts +0 -0
  363. /package/dist/{src → legacy-root-azm/src}/registerCare/analyze.js +0 -0
  364. /package/dist/{src → legacy-root-azm/src}/registerCare/annotate.d.ts +0 -0
  365. /package/dist/{src → legacy-root-azm/src}/registerCare/annotate.js +0 -0
  366. /package/dist/{src → legacy-root-azm/src}/registerCare/boundaryHints.d.ts +0 -0
  367. /package/dist/{src → legacy-root-azm/src}/registerCare/boundaryHints.js +0 -0
  368. /package/dist/{src → legacy-root-azm/src}/registerCare/carriers.d.ts +0 -0
  369. /package/dist/{src → legacy-root-azm/src}/registerCare/carriers.js +0 -0
  370. /package/dist/{src → legacy-root-azm/src}/registerCare/controlFlow.d.ts +0 -0
  371. /package/dist/{src → legacy-root-azm/src}/registerCare/controlFlow.js +0 -0
  372. /package/dist/{src → legacy-root-azm/src}/registerCare/fix.d.ts +0 -0
  373. /package/dist/{src → legacy-root-azm/src}/registerCare/fix.js +0 -0
  374. /package/dist/{src → legacy-root-azm/src}/registerCare/liveness.d.ts +0 -0
  375. /package/dist/{src → legacy-root-azm/src}/registerCare/liveness.js +0 -0
  376. /package/dist/{src → legacy-root-azm/src}/registerCare/profiles.d.ts +0 -0
  377. /package/dist/{src → legacy-root-azm/src}/registerCare/profiles.js +0 -0
  378. /package/dist/{src → legacy-root-azm/src}/registerCare/programModel.d.ts +0 -0
  379. /package/dist/{src → legacy-root-azm/src}/registerCare/programModel.js +0 -0
  380. /package/dist/{src → legacy-root-azm/src}/registerCare/report.d.ts +0 -0
  381. /package/dist/{src → legacy-root-azm/src}/registerCare/report.js +0 -0
  382. /package/dist/{src → legacy-root-azm/src}/registerCare/smartComments.d.ts +0 -0
  383. /package/dist/{src → legacy-root-azm/src}/registerCare/smartComments.js +0 -0
  384. /package/dist/{src → legacy-root-azm/src}/registerCare/sourceText.d.ts +0 -0
  385. /package/dist/{src → legacy-root-azm/src}/registerCare/sourceText.js +0 -0
  386. /package/dist/{src → legacy-root-azm/src}/registerCare/summary.d.ts +0 -0
  387. /package/dist/{src → legacy-root-azm/src}/registerCare/summary.js +0 -0
  388. /package/dist/{src → legacy-root-azm/src}/registerCare/types.d.ts +0 -0
  389. /package/dist/{src → legacy-root-azm/src}/registerCare/types.js +0 -0
  390. /package/dist/{src → legacy-root-azm/src}/semantics/declVisitor.d.ts +0 -0
  391. /package/dist/{src → legacy-root-azm/src}/semantics/declVisitor.js +0 -0
  392. /package/dist/{src → legacy-root-azm/src}/semantics/env.d.ts +0 -0
  393. /package/dist/{src → legacy-root-azm/src}/semantics/env.js +0 -0
  394. /package/dist/{src → legacy-root-azm/src}/semantics/layout.d.ts +0 -0
  395. /package/dist/{src → legacy-root-azm/src}/semantics/layout.js +0 -0
  396. /package/dist/{src → legacy-root-azm/src}/semantics/layoutCastFold.d.ts +0 -0
  397. /package/dist/{src → legacy-root-azm/src}/semantics/layoutCastFold.js +0 -0
  398. /package/dist/{src → legacy-root-azm/src}/semantics/semanticsDiagnostics.d.ts +0 -0
  399. /package/dist/{src → legacy-root-azm/src}/semantics/semanticsDiagnostics.js +0 -0
  400. /package/dist/{src → legacy-root-azm/src}/semantics/typeQueries.d.ts +0 -0
  401. /package/dist/{src → legacy-root-azm/src}/semantics/typeQueries.js +0 -0
  402. /package/dist/{src → legacy-root-azm/src}/sourceIncludeExpansion.d.ts +0 -0
  403. /package/dist/{src → legacy-root-azm/src}/sourceIncludeExpansion.js +0 -0
  404. /package/dist/{src → legacy-root-azm/src}/sourceIncludePaths.d.ts +0 -0
  405. /package/dist/{src → legacy-root-azm/src}/sourceIncludePaths.js +0 -0
  406. /package/dist/{src → legacy-root-azm/src}/sourceLoader.d.ts +0 -0
  407. /package/dist/{src → legacy-root-azm/src}/sourceLoader.js +0 -0
  408. /package/dist/{src → legacy-root-azm/src}/z80/encodeAlu.d.ts +0 -0
  409. /package/dist/{src → legacy-root-azm/src}/z80/encodeAlu.js +0 -0
  410. /package/dist/{src → legacy-root-azm/src}/z80/encodeBitOps.d.ts +0 -0
  411. /package/dist/{src → legacy-root-azm/src}/z80/encodeBitOps.js +0 -0
  412. /package/dist/{src → legacy-root-azm/src}/z80/encodeContext.d.ts +0 -0
  413. /package/dist/{src → legacy-root-azm/src}/z80/encodeContext.js +0 -0
  414. /package/dist/{src → legacy-root-azm/src}/z80/encodeControl.d.ts +0 -0
  415. /package/dist/{src → legacy-root-azm/src}/z80/encodeControl.js +0 -0
  416. /package/dist/{src → legacy-root-azm/src}/z80/encodeCoreOps.d.ts +0 -0
  417. /package/dist/{src → legacy-root-azm/src}/z80/encodeCoreOps.js +0 -0
  418. /package/dist/{src → legacy-root-azm/src}/z80/encodeIo.d.ts +0 -0
  419. /package/dist/{src → legacy-root-azm/src}/z80/encodeIo.js +0 -0
  420. /package/dist/{src → legacy-root-azm/src}/z80/encodeLd.d.ts +0 -0
  421. /package/dist/{src → legacy-root-azm/src}/z80/encodeLd.js +0 -0
  422. /package/dist/{src → legacy-root-azm/src}/z80/encoderRegistry.d.ts +0 -0
  423. /package/dist/{src → legacy-root-azm/src}/z80/encoderRegistry.js +0 -0
@@ -0,0 +1,2 @@
1
+ import type { D8mArtifact, EmittedByteMap, SymbolEntry, WriteD8mOptions } from './types.js';
2
+ export declare function writeD8m(map: EmittedByteMap, symbols: readonly SymbolEntry[], opts?: WriteD8mOptions): D8mArtifact;
@@ -0,0 +1,257 @@
1
+ import { normalize, relative, resolve, isAbsolute } from 'node:path';
2
+ import { getWrittenRange, getWrittenSegments } from './range.js';
3
+ function toHexFilePath(path, rootDir) {
4
+ const normalized = normalize(path).replace(/\\/g, '/');
5
+ if (!rootDir) {
6
+ return normalized;
7
+ }
8
+ const root = normalize(resolve(rootDir)).replace(/\\/g, '/');
9
+ const resolvedPath = normalize(resolve(path)).replace(/\\/g, '/');
10
+ const rel = relative(root, resolvedPath).replace(/\\/g, '/');
11
+ if (rel.startsWith('..') || rel === '' || isAbsolute(rel)) {
12
+ return resolvedPath;
13
+ }
14
+ return rel;
15
+ }
16
+ function compareSymbol(a, b) {
17
+ const aClass = a.kind === 'constant' ? 1 : 0;
18
+ const bClass = b.kind === 'constant' ? 1 : 0;
19
+ if (aClass !== bClass)
20
+ return aClass - bClass;
21
+ const aAddress = a.kind === 'constant' ? (a.value ?? 0) & 0xffff : (a.address ?? 0) & 0xffff;
22
+ const bAddress = b.kind === 'constant' ? (b.value ?? 0) & 0xffff : (b.address ?? 0) & 0xffff;
23
+ if (aAddress !== bAddress) {
24
+ return aAddress - bAddress;
25
+ }
26
+ const nameCmp = a.name.toLowerCase().localeCompare(b.name.toLowerCase());
27
+ if (nameCmp !== 0)
28
+ return nameCmp;
29
+ const kindCmp = a.kind.localeCompare(b.kind);
30
+ if (kindCmp !== 0)
31
+ return kindCmp;
32
+ const fileCmp = (a.file ?? '').localeCompare(b.file ?? '');
33
+ if (fileCmp !== 0)
34
+ return fileCmp;
35
+ const lineCmp = (a.line ?? 0) - (b.line ?? 0);
36
+ if (lineCmp !== 0)
37
+ return lineCmp;
38
+ if (a.kind === 'constant' && b.kind === 'constant') {
39
+ return (a.value ?? 0) - (b.value ?? 0);
40
+ }
41
+ return (a.size ?? 0) - (b.size ?? 0);
42
+ }
43
+ function compareFileSymbol(a, b) {
44
+ return compareSymbol(a, b);
45
+ }
46
+ function compareSegment(a, b) {
47
+ if (a.start !== b.start)
48
+ return a.start - b.start;
49
+ if (a.end !== b.end)
50
+ return a.end - b.end;
51
+ if (a.lstLine !== b.lstLine)
52
+ return a.lstLine - b.lstLine;
53
+ const lineCmp = (a.line ?? 0) - (b.line ?? 0);
54
+ if (lineCmp !== 0)
55
+ return lineCmp;
56
+ const kindCmp = a.kind.localeCompare(b.kind);
57
+ if (kindCmp !== 0)
58
+ return kindCmp;
59
+ return a.confidence.localeCompare(b.confidence);
60
+ }
61
+ function rangesOverlap(a, b) {
62
+ return a.start < b.end && b.start < a.end;
63
+ }
64
+ function hasOverlappingSourceSegment(sourceSegmentsByFile, file, range) {
65
+ return (sourceSegmentsByFile.get(file) ?? []).some((segment) => rangesOverlap({ start: segment.start, end: segment.end }, range));
66
+ }
67
+ export function writeD8m(map, symbols, opts) {
68
+ const { start, end } = getWrittenRange(map);
69
+ const writtenSegments = getWrittenSegments(map);
70
+ const segments = writtenSegments.length > 0
71
+ ? writtenSegments
72
+ : start < end
73
+ ? [{ start, end }]
74
+ : [{ start: 0, end: 0 }];
75
+ const jsonSymbols = symbols.map((symbol) => symbol.kind === 'constant'
76
+ ? {
77
+ name: symbol.name,
78
+ kind: symbol.kind,
79
+ value: symbol.value,
80
+ ...(symbol.file !== undefined ? { file: toHexFilePath(symbol.file, opts?.rootDir) } : {}),
81
+ ...(symbol.line !== undefined ? { line: symbol.line } : {}),
82
+ ...(symbol.scope !== undefined ? { scope: symbol.scope } : {}),
83
+ }
84
+ : {
85
+ name: symbol.name,
86
+ kind: symbol.kind,
87
+ address: symbol.address,
88
+ ...(symbol.file !== undefined ? { file: toHexFilePath(symbol.file, opts?.rootDir) } : {}),
89
+ ...(symbol.line !== undefined ? { line: symbol.line } : {}),
90
+ ...(symbol.scope !== undefined ? { scope: symbol.scope } : {}),
91
+ ...(symbol.size !== undefined ? { size: symbol.size } : {}),
92
+ });
93
+ const normalizedSourceSegments = coalesceSourceSegments((map.sourceSegments ?? []).flatMap((segment) => clipSourceSegmentToWrittenSegments(segment, segments).map((clipped) => ({
94
+ ...clipped,
95
+ file: toHexFilePath(clipped.file, opts?.rootDir),
96
+ }))));
97
+ const fileSet = new Set(jsonSymbols
98
+ .map((symbol) => symbol.file)
99
+ .filter((file) => typeof file === 'string' && file.length > 0));
100
+ for (const segment of normalizedSourceSegments) {
101
+ if (segment.file.length > 0)
102
+ fileSet.add(segment.file);
103
+ }
104
+ const fileList = [...fileSet].sort((a, b) => a.localeCompare(b));
105
+ const entries = new Map();
106
+ const ensureEntry = (file) => {
107
+ let entry = entries.get(file);
108
+ if (!entry) {
109
+ entry = { symbols: [], segments: [] };
110
+ entries.set(file, entry);
111
+ }
112
+ return entry;
113
+ };
114
+ const sortedSymbolList = [...jsonSymbols].sort(compareSymbol);
115
+ for (const symbol of sortedSymbolList) {
116
+ const entry = ensureEntry(symbol.file ?? '');
117
+ const symbolWithoutFile = { ...symbol };
118
+ delete symbolWithoutFile.file;
119
+ entry.symbols?.push(symbolWithoutFile);
120
+ }
121
+ for (const segment of normalizedSourceSegments) {
122
+ ensureEntry(segment.file).segments.push({
123
+ start: segment.start,
124
+ end: segment.end,
125
+ line: segment.line,
126
+ lstLine: segment.line,
127
+ kind: segment.kind,
128
+ confidence: segment.confidence,
129
+ });
130
+ }
131
+ const sourceSegmentsByFile = new Map();
132
+ for (const segment of normalizedSourceSegments) {
133
+ const sourceSegments = sourceSegmentsByFile.get(segment.file);
134
+ if (sourceSegments) {
135
+ sourceSegments.push(segment);
136
+ }
137
+ else {
138
+ sourceSegmentsByFile.set(segment.file, [segment]);
139
+ }
140
+ }
141
+ const symbolRangesByFile = new Map();
142
+ for (const symbol of sortedSymbolList) {
143
+ if (symbol.kind === 'constant' || symbol.file === undefined)
144
+ continue;
145
+ if (symbol.address === undefined)
146
+ continue;
147
+ const size = symbol.size !== undefined && symbol.size > 0 ? symbol.size : 1;
148
+ const ranges = symbolRangesByFile.get(symbol.file) ?? [];
149
+ ranges.push({ start: symbol.address, end: Math.min(0x10000, symbol.address + size) });
150
+ symbolRangesByFile.set(symbol.file, ranges);
151
+ }
152
+ for (const segment of segments) {
153
+ const targetFiles = [...symbolRangesByFile.entries()]
154
+ .filter(([, ranges]) => ranges.some((range) => rangesOverlap(range, segment)))
155
+ .map(([file]) => file)
156
+ .sort((a, b) => a.localeCompare(b));
157
+ const targets = targetFiles.length > 0 ? targetFiles : [fileList[0] ?? ''];
158
+ for (const target of targets) {
159
+ if (hasOverlappingSourceSegment(sourceSegmentsByFile, target, segment))
160
+ continue;
161
+ ensureEntry(target).segments.push({
162
+ start: segment.start,
163
+ end: segment.end,
164
+ lstLine: 1,
165
+ kind: 'unknown',
166
+ confidence: 'low',
167
+ });
168
+ }
169
+ }
170
+ for (const entry of entries.values()) {
171
+ entry.symbols.sort(compareFileSymbol);
172
+ entry.segments.sort(compareSegment);
173
+ }
174
+ const files = Object.fromEntries([...entries.entries()]
175
+ .sort(([a], [b]) => a.localeCompare(b))
176
+ .map(([path, fileEntry]) => [
177
+ path,
178
+ {
179
+ ...(fileEntry.segments && fileEntry.segments.length > 0
180
+ ? { segments: fileEntry.segments }
181
+ : {}),
182
+ ...(fileEntry.symbols && fileEntry.symbols.length > 0
183
+ ? { symbols: fileEntry.symbols }
184
+ : {}),
185
+ },
186
+ ]));
187
+ const generatorInputs = opts?.inputs !== undefined ? normalizeInputs(opts.inputs, opts.rootDir) : undefined;
188
+ const generator = {
189
+ name: 'azm',
190
+ tool: 'azm',
191
+ ...(opts?.packageVersion !== undefined ? { version: opts.packageVersion } : {}),
192
+ ...(generatorInputs !== undefined ? { inputs: generatorInputs } : {}),
193
+ ...(opts?.entrySymbol !== undefined ? { entrySymbol: opts.entrySymbol } : {}),
194
+ ...(opts?.entryAddress !== undefined ? { entryAddress: opts.entryAddress & 0xffff } : {}),
195
+ };
196
+ return {
197
+ kind: 'd8m',
198
+ json: {
199
+ format: 'd8-debug-map',
200
+ version: 1,
201
+ arch: 'z80',
202
+ addressWidth: 16,
203
+ endianness: 'little',
204
+ files,
205
+ segments,
206
+ ...(fileList.length > 0 ? { fileList } : {}),
207
+ symbols: sortedSymbolList,
208
+ generator,
209
+ },
210
+ };
211
+ }
212
+ function normalizeInputs(inputs, rootDir) {
213
+ const out = {};
214
+ for (const [key, value] of Object.entries(inputs)) {
215
+ if (value !== undefined && value.length > 0) {
216
+ out[key] = toHexFilePath(value, rootDir);
217
+ }
218
+ }
219
+ return Object.keys(out).length > 0 ? out : undefined;
220
+ }
221
+ function clipSourceSegmentToWrittenSegments(segment, writtenSegments) {
222
+ const clipped = [];
223
+ for (const writtenSegment of writtenSegments) {
224
+ const start = Math.max(segment.start, writtenSegment.start);
225
+ const end = Math.min(segment.end, writtenSegment.end);
226
+ if (end > start) {
227
+ clipped.push({ ...segment, start, end });
228
+ }
229
+ }
230
+ return clipped;
231
+ }
232
+ function coalesceSourceSegments(segments) {
233
+ const sorted = [...segments].sort((a, b) => a.file.localeCompare(b.file) ||
234
+ a.line - b.line ||
235
+ a.column - b.column ||
236
+ a.kind.localeCompare(b.kind) ||
237
+ a.confidence.localeCompare(b.confidence) ||
238
+ a.start - b.start ||
239
+ a.end - b.end);
240
+ const coalesced = [];
241
+ for (const segment of sorted) {
242
+ const previous = coalesced[coalesced.length - 1];
243
+ if (previous &&
244
+ previous.file === segment.file &&
245
+ previous.line === segment.line &&
246
+ previous.column === segment.column &&
247
+ previous.kind === segment.kind &&
248
+ previous.confidence === segment.confidence &&
249
+ previous.end === segment.start) {
250
+ coalesced[coalesced.length - 1] = { ...previous, end: segment.end };
251
+ }
252
+ else {
253
+ coalesced.push(segment);
254
+ }
255
+ }
256
+ return coalesced;
257
+ }
@@ -0,0 +1,2 @@
1
+ import type { EmittedByteMap, HexArtifact, SymbolEntry, WriteHexOptions } from './types.js';
2
+ export declare function writeHex(map: EmittedByteMap, _symbols: readonly SymbolEntry[], opts?: WriteHexOptions): HexArtifact;
@@ -0,0 +1,53 @@
1
+ function toHexByte(n) {
2
+ return (n & 0xff).toString(16).toUpperCase().padStart(2, '0');
3
+ }
4
+ function toChecksum(bytes) {
5
+ const sum = bytes.reduce((acc, b) => acc + (b & 0xff), 0) & 0xff;
6
+ return ((0x100 - sum) & 0xff) >>> 0;
7
+ }
8
+ function writeSegments(map) {
9
+ const addresses = [...map.bytes.keys()].sort((a, b) => a - b);
10
+ if (addresses.length === 0) {
11
+ return [];
12
+ }
13
+ const [firstAddress, ...rest] = addresses;
14
+ if (firstAddress === undefined) {
15
+ return [];
16
+ }
17
+ const out = [];
18
+ let segmentStart = firstAddress;
19
+ let segmentEnd = firstAddress + 1;
20
+ for (const address of rest) {
21
+ if (address === segmentEnd) {
22
+ segmentEnd = address + 1;
23
+ continue;
24
+ }
25
+ out.push({ start: segmentStart, end: segmentEnd });
26
+ segmentStart = address;
27
+ segmentEnd = address + 1;
28
+ }
29
+ out.push({ start: segmentStart, end: segmentEnd });
30
+ return out;
31
+ }
32
+ export function writeHex(map, _symbols, opts) {
33
+ const lineEnding = opts?.lineEnding ?? '\n';
34
+ const lines = [];
35
+ for (const segment of writeSegments(map)) {
36
+ for (let address = segment.start; address < segment.end; address += 16) {
37
+ const count = Math.min(16, segment.end - address);
38
+ const data = [];
39
+ for (let index = 0; index < count; index += 1) {
40
+ data.push(map.bytes.get(address + index) ?? 0);
41
+ }
42
+ const hi = (address >> 8) & 0xff;
43
+ const lo = address & 0xff;
44
+ const recType = 0x00;
45
+ const payload = [count, hi, lo, recType, ...data];
46
+ lines.push(`:${toHexByte(count)}${toHexByte(hi)}${toHexByte(lo)}00${data
47
+ .map(toHexByte)
48
+ .join('')}${toHexByte(toChecksum(payload))}`);
49
+ }
50
+ }
51
+ lines.push(':00000001FF');
52
+ return { kind: 'hex', text: lines.join(lineEnding) + lineEnding };
53
+ }
@@ -0,0 +1,2 @@
1
+ import type { EmittedByteMap, ListingArtifact, SymbolEntry, WriteListingOptions } from './types.js';
2
+ export declare function writeListing(map: EmittedByteMap, symbols: readonly SymbolEntry[], opts?: WriteListingOptions): ListingArtifact;
@@ -0,0 +1,79 @@
1
+ import { getWrittenRange, getWrittenSegments } from './range.js';
2
+ function toHexByte(n) {
3
+ return (n & 0xff).toString(16).toUpperCase().padStart(2, '0');
4
+ }
5
+ function toHexWord(n) {
6
+ return (n & 0xffff).toString(16).toUpperCase().padStart(4, '0');
7
+ }
8
+ function symbolAddress(symbol) {
9
+ return symbol.kind === 'constant' ? symbol.value & 0xffff : symbol.address & 0xffff;
10
+ }
11
+ function sortSymbols(a, b) {
12
+ const aClass = a.kind === 'constant' ? 1 : 0;
13
+ const bClass = b.kind === 'constant' ? 1 : 0;
14
+ if (aClass !== bClass) {
15
+ return aClass - bClass;
16
+ }
17
+ const addressCmp = symbolAddress(a) - symbolAddress(b);
18
+ if (addressCmp !== 0) {
19
+ return addressCmp;
20
+ }
21
+ return a.name.toLowerCase().localeCompare(b.name.toLowerCase());
22
+ }
23
+ export function writeListing(map, symbols, opts) {
24
+ const lineEnding = opts?.lineEnding ?? '\n';
25
+ const bytesPerLine = opts?.bytesPerLine ?? 16;
26
+ const { start, end } = getWrittenRange(map);
27
+ const segments = getWrittenSegments(map);
28
+ const lines = [];
29
+ lines.push('; AZM listing');
30
+ lines.push(`; range: $${toHexWord(start)}..$${toHexWord(end)} (end exclusive)`);
31
+ lines.push('');
32
+ const lineBaseSet = new Set();
33
+ for (const segment of segments) {
34
+ const first = segment.start - (segment.start % bytesPerLine);
35
+ const last = segment.end - 1 - ((segment.end - 1) % bytesPerLine);
36
+ for (let address = first; address <= last; address += bytesPerLine) {
37
+ lineBaseSet.add(address);
38
+ }
39
+ }
40
+ const lineBases = [...lineBaseSet].sort((a, b) => a - b);
41
+ let previousBase;
42
+ for (const address of lineBases) {
43
+ if (previousBase !== undefined && address > previousBase + bytesPerLine) {
44
+ const gapStart = previousBase + bytesPerLine;
45
+ const gapEndInclusive = address - 1;
46
+ const gapLineCount = Math.ceil((address - gapStart) / bytesPerLine);
47
+ lines.push(`; ... gap $${toHexWord(gapStart)}..$${toHexWord(gapEndInclusive)} (${gapLineCount} lines)`);
48
+ }
49
+ const lineBytes = [];
50
+ const lineChars = [];
51
+ const count = Math.min(bytesPerLine, end - address);
52
+ for (let offset = 0; offset < count; offset += 1) {
53
+ const byte = map.bytes.get(address + offset);
54
+ if (byte === undefined) {
55
+ lineBytes.push('..');
56
+ lineChars.push(' ');
57
+ }
58
+ else {
59
+ const value = byte & 0xff;
60
+ lineBytes.push(toHexByte(value));
61
+ lineChars.push(value >= 0x20 && value <= 0x7e ? String.fromCharCode(value) : '.');
62
+ }
63
+ }
64
+ const payload = lineBytes.join(' ').padEnd(bytesPerLine * 3 - 1, ' ');
65
+ lines.push(`${toHexWord(address)}: ${payload} |${lineChars.join('')}|`);
66
+ previousBase = address;
67
+ }
68
+ lines.push('');
69
+ lines.push('; symbols:');
70
+ for (const symbol of [...symbols].sort(sortSymbols)) {
71
+ if (symbol.kind === 'constant') {
72
+ lines.push(`; constant ${symbol.name} = $${toHexWord(symbol.value)} (${symbol.value})`);
73
+ }
74
+ else {
75
+ lines.push(`; ${symbol.kind} ${symbol.name} = $${toHexWord(symbol.address)}`);
76
+ }
77
+ }
78
+ return { kind: 'lst', text: lines.join(lineEnding) + lineEnding };
79
+ }
@@ -0,0 +1,2 @@
1
+ import type { RegisterCareUnit } from './types.js';
2
+ export declare function parseAcceptedOutputCandidates(items?: readonly string[]): Map<string, RegisterCareUnit[]>;
@@ -0,0 +1,35 @@
1
+ import { expandCarrierList } from './carriers.js';
2
+ function appendUniqueUnits(target, units) {
3
+ for (const unit of units) {
4
+ if (!target.includes(unit))
5
+ target.push(unit);
6
+ }
7
+ }
8
+ export function parseAcceptedOutputCandidates(items = []) {
9
+ const out = new Map();
10
+ for (const item of items) {
11
+ const splitIndex = item.indexOf(':');
12
+ if (splitIndex <= 0 || splitIndex === item.length - 1) {
13
+ throw new Error(`Invalid --accept-out value "${item}" (expected ROUTINE:carriers)`);
14
+ }
15
+ const name = item.slice(0, splitIndex).trim();
16
+ if (!name) {
17
+ throw new Error(`Invalid --accept-out value "${item}" (missing routine name)`);
18
+ }
19
+ const carriers = item
20
+ .slice(splitIndex + 1)
21
+ .split(',')
22
+ .map((candidate) => candidate.trim());
23
+ if (carriers.length === 0 || carriers.some((candidate) => candidate.length === 0)) {
24
+ throw new Error(`Invalid --accept-out value "${item}" (missing carriers)`);
25
+ }
26
+ const units = expandCarrierList(carriers);
27
+ if (!units) {
28
+ throw new Error(`Invalid --accept-out value "${item}" (unknown carrier)`);
29
+ }
30
+ const existing = out.get(name) ?? [];
31
+ appendUniqueUnits(existing, units);
32
+ out.set(name, existing);
33
+ }
34
+ return out;
35
+ }
@@ -0,0 +1,26 @@
1
+ import type { Diagnostic } from '../model/diagnostic.js';
2
+ import type { SourceItem } from '../model/source-item.js';
3
+ import type { AnalyzeRegisterCareOptions, RegisterCareAnnotationFile, RegisterCareOutputCandidate } from './types.js';
4
+ interface AnalyzeRegisterCareResult {
5
+ diagnostics: Diagnostic[];
6
+ outputCandidates?: RegisterCareOutputCandidate[];
7
+ reportText?: string;
8
+ interfaceText?: string;
9
+ annotations?: readonly RegisterCareAnnotationFile[];
10
+ unknownCalls?: string[];
11
+ }
12
+ export declare function analyzeRegisterCare(loaded: {
13
+ program: {
14
+ files: readonly [
15
+ {
16
+ readonly kind: 'SourceFile';
17
+ readonly name: string;
18
+ readonly items: readonly SourceItem[];
19
+ }
20
+ ];
21
+ entryFile: string;
22
+ };
23
+ sourceLineComments: ReadonlyMap<string, ReadonlyMap<number, string>>;
24
+ sourceTexts: ReadonlyMap<string, string>;
25
+ }, options: AnalyzeRegisterCareOptions): AnalyzeRegisterCareResult;
26
+ export {};
@@ -0,0 +1,115 @@
1
+ import { buildRegisterCareProgramModel } from './programModel.js';
2
+ import { buildRoutineContracts, parseSmartComments } from './smartComments.js';
3
+ import { renderRegisterCareInterface, renderRegisterCareReport } from './report.js';
4
+ import { autoFixableCandidateKeys } from './fix.js';
5
+ import { findCallerOutputCandidateObservations, findRegisterCareConflicts, } from './liveness.js';
6
+ import { buildAnnotations } from './annotations.js';
7
+ import { buildOutputCandidateFixability, buildProfileSummaries, buildProfileSummaryLookup, buildSummaries, buildSummaryByName, outputCandidateKey, routineNames, unknownBoundaryDiagnostics, unknownCallList, withAcceptedOutputs, } from './summaries.js';
8
+ function candidateMessageWithFixability(candidate, autoFixable) {
9
+ const carriers = candidate.carriers.join(',');
10
+ const expectation = candidate.carriers.length === 1 ? candidate.carriers[0] : `{${carriers}}`;
11
+ const base = `CALL ${candidate.routine} writes ${carriers} and caller reads it later`;
12
+ return autoFixable
13
+ ? `${base}; generated contracts promote this to \`out ${expectation}\` automatically.`
14
+ : `${base}; manual review required before adding \`; expects out ${expectation}\` because the later read is not a simple direct continuation.`;
15
+ }
16
+ export function analyzeRegisterCare(loaded, options) {
17
+ const file = loaded.program.files[0];
18
+ const items = file?.items ?? [];
19
+ const program = buildRegisterCareProgramModel(items);
20
+ const smartComments = parseSmartComments(loaded.sourceLineComments);
21
+ const contractMap = buildRoutineContracts(smartComments, program.routines, loaded.sourceTexts);
22
+ if (options.interfaceContracts !== undefined) {
23
+ for (const contract of options.interfaceContracts) {
24
+ contractMap.set(contract.name, contract);
25
+ }
26
+ }
27
+ const profileSummaries = buildProfileSummaries(options.registerCareProfile);
28
+ let summaries = buildSummaries(program.routines, contractMap, profileSummaries);
29
+ summaries = withAcceptedOutputs(summaries, options.acceptedOutputCandidates);
30
+ const allSummaries = [...summaries, ...profileSummaries];
31
+ const summariesByName = buildSummaryByName(program.routines, summaries, profileSummaries);
32
+ const knownRoutines = new Set(routineNames(program.routines));
33
+ for (const [name] of contractMap) {
34
+ knownRoutines.add(name);
35
+ }
36
+ for (const name of buildProfileSummaryLookup(options.registerCareProfile).keys()) {
37
+ knownRoutines.add(name);
38
+ }
39
+ const diagnostics = [];
40
+ const shouldBuildOutputCandidates = options.mode !== 'off' ||
41
+ options.emitAnnotations === true ||
42
+ options.fixRegisterContracts === true;
43
+ const analyzed = shouldBuildOutputCandidates
44
+ ? {
45
+ conflicts: program.routines.flatMap((routine) => findRegisterCareConflicts(routine, summariesByName, smartComments)),
46
+ outputCandidates: findCallerOutputCandidateObservations(program.routines, summariesByName),
47
+ }
48
+ : { conflicts: [], outputCandidates: [] };
49
+ const conflicts = analyzed.conflicts;
50
+ const outputCandidates = analyzed.outputCandidates;
51
+ const outputCandidateFixability = buildOutputCandidateFixability(program.routines, outputCandidates, autoFixableCandidateKeys);
52
+ const outputCandidatesWithFixability = outputCandidates.map((candidate) => {
53
+ const autoFixable = outputCandidateFixability.get(outputCandidateKey(candidate.file, candidate.line, candidate.column)) ?? false;
54
+ return {
55
+ ...candidate,
56
+ autoFixable,
57
+ message: candidateMessageWithFixability(candidate, autoFixable),
58
+ };
59
+ });
60
+ if (options.mode !== 'audit') {
61
+ for (const conflict of conflicts) {
62
+ diagnostics.push({
63
+ severity: options.mode === 'error' ? 'error' : 'warning',
64
+ code: 'AZMN_REGISTER_CARE',
65
+ sourceName: conflict.file,
66
+ line: conflict.line,
67
+ column: conflict.column,
68
+ message: conflict.message,
69
+ });
70
+ }
71
+ }
72
+ if (options.mode === 'strict') {
73
+ diagnostics.push(...unknownBoundaryDiagnostics(program.directBoundaries, knownRoutines));
74
+ }
75
+ const reportModel = {
76
+ entryFile: loaded.program.entryFile,
77
+ mode: options.mode,
78
+ summaries: allSummaries,
79
+ conflicts,
80
+ outputCandidates: outputCandidatesWithFixability,
81
+ ...(options.registerCareProfile !== undefined ? { profile: options.registerCareProfile } : {}),
82
+ unknownCalls: options.mode === 'off' ? [] : unknownCallList(program.directBoundaries, knownRoutines),
83
+ };
84
+ const summariesForAnnotations = new Map(summariesByName);
85
+ const outputCandidatesByRoutine = new Map();
86
+ for (const candidate of outputCandidatesWithFixability) {
87
+ const existing = outputCandidatesByRoutine.get(candidate.routine) ?? [];
88
+ for (const unit of candidate.carriers) {
89
+ if (!existing.includes(unit))
90
+ existing.push(unit);
91
+ }
92
+ outputCandidatesByRoutine.set(candidate.routine, existing);
93
+ }
94
+ for (const [name, summary] of summariesForAnnotations) {
95
+ const candidates = outputCandidatesByRoutine.get(name);
96
+ if (candidates !== undefined && candidates.length > 0) {
97
+ summariesForAnnotations.set(name, { ...summary, outputCandidates: candidates });
98
+ }
99
+ }
100
+ const annotations = options.emitAnnotations
101
+ ? buildAnnotations(loaded, program.routines, summariesForAnnotations, outputCandidatesWithFixability, {
102
+ fixOutputCandidates: options.fixRegisterContracts === true,
103
+ outputCandidateFixability,
104
+ outputCandidateKey,
105
+ })
106
+ : [];
107
+ return {
108
+ diagnostics,
109
+ outputCandidates: outputCandidatesWithFixability,
110
+ ...(options.emitReport ? { reportText: renderRegisterCareReport(reportModel) } : {}),
111
+ ...(options.emitInterface ? { interfaceText: renderRegisterCareInterface(summaries) } : {}),
112
+ ...(annotations.length > 0 ? { annotations } : {}),
113
+ ...(reportModel.unknownCalls.length > 0 ? { unknownCalls: reportModel.unknownCalls } : {}),
114
+ };
115
+ }
@@ -0,0 +1,11 @@
1
+ import type { RegisterCareRoutine, RoutineSummary } from './types.js';
2
+ export interface RegisterCareAnnotatedFile {
3
+ path: string;
4
+ text: string;
5
+ }
6
+ interface RegisterCareAnnotationInput {
7
+ routine: RegisterCareRoutine;
8
+ summary: RoutineSummary;
9
+ }
10
+ export declare function annotateRegisterCareContracts(sourceTexts: ReadonlyMap<string, string>, routines: RegisterCareAnnotationInput[]): RegisterCareAnnotatedFile[];
11
+ export {};
@@ -0,0 +1,76 @@
1
+ import { renderRegisterCareSourceBlock } from './report.js';
2
+ import { joinSourceLines, splitSourceLines } from './sourceText.js';
3
+ const GENERATED_COMPACT_LINE_RE = /^\s*;\s*!\s*(?:in|out|maybe-out|clobbers|preserves)(?:\s|$)/i;
4
+ function isCommentLine(line) {
5
+ return /^\s*;/.test(line);
6
+ }
7
+ function isGeneratedCompactLine(line) {
8
+ return GENERATED_COMPACT_LINE_RE.test(line);
9
+ }
10
+ function precedingCommentBlockStart(lines, labelIndex) {
11
+ let index = labelIndex - 1;
12
+ if (index < 0 || !isCommentLine(lines[index] ?? ''))
13
+ return undefined;
14
+ while (index >= 0 && isCommentLine(lines[index] ?? ''))
15
+ index -= 1;
16
+ return index + 1;
17
+ }
18
+ function generatedBlockBeforeLabel(lines, labelIndex) {
19
+ let compactStart = labelIndex;
20
+ while (compactStart > 0 && isGeneratedCompactLine(lines[compactStart - 1] ?? '')) {
21
+ compactStart -= 1;
22
+ }
23
+ if (compactStart < labelIndex)
24
+ return { start: compactStart, end: labelIndex - 1 };
25
+ return undefined;
26
+ }
27
+ function hasPrecedingCommentBlock(lines, labelIndex) {
28
+ return precedingCommentBlockStart(lines, labelIndex) !== undefined;
29
+ }
30
+ function isExplicitEntryRoutine(routine) {
31
+ return routine.entryLabels?.includes(routine.name) === true;
32
+ }
33
+ function annotateFile(source, routines) {
34
+ const sourceLines = splitSourceLines(source);
35
+ const { lines } = sourceLines;
36
+ const sorted = [...routines].sort((a, b) => b.routine.span.start.line - a.routine.span.start.line);
37
+ for (const item of sorted) {
38
+ const labelIndex = item.routine.span.start.line - 1;
39
+ if (labelIndex < 0 || labelIndex > lines.length)
40
+ continue;
41
+ const block = renderRegisterCareSourceBlock(item.summary);
42
+ const hasContractContent = block.length > 0;
43
+ const existing = generatedBlockBeforeLabel(lines, labelIndex);
44
+ if (existing) {
45
+ lines.splice(existing.start, existing.end - existing.start + 1, ...(hasContractContent ? block : []));
46
+ continue;
47
+ }
48
+ if (!hasContractContent)
49
+ continue;
50
+ if (!isExplicitEntryRoutine(item.routine) && !hasPrecedingCommentBlock(lines, labelIndex)) {
51
+ continue;
52
+ }
53
+ lines.splice(labelIndex, 0, ...block);
54
+ }
55
+ return joinSourceLines(sourceLines);
56
+ }
57
+ export function annotateRegisterCareContracts(sourceTexts, routines) {
58
+ const byFile = new Map();
59
+ for (const item of routines) {
60
+ if (!sourceTexts.has(item.routine.span.file))
61
+ continue;
62
+ const items = byFile.get(item.routine.span.file) ?? [];
63
+ items.push(item);
64
+ byFile.set(item.routine.span.file, items);
65
+ }
66
+ const out = [];
67
+ for (const [file, items] of [...byFile].sort(([a], [b]) => a.localeCompare(b))) {
68
+ const source = sourceTexts.get(file);
69
+ if (source === undefined)
70
+ continue;
71
+ const text = annotateFile(source, items);
72
+ if (text !== source)
73
+ out.push({ path: file, text });
74
+ }
75
+ return out;
76
+ }