@jhlagado/azm 0.1.1 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (411) hide show
  1. package/README.md +9 -1
  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 +266 -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 +267 -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 +912 -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 +81 -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 +549 -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 +87 -0
  78. package/dist/src/register-care/annotations.d.ts +8 -0
  79. package/dist/src/register-care/annotations.js +154 -0
  80. package/dist/src/register-care/boundaryHints.d.ts +2 -0
  81. package/dist/src/register-care/boundaryHints.js +11 -0
  82. package/dist/src/register-care/carriers.d.ts +2 -0
  83. package/dist/src/register-care/carriers.js +78 -0
  84. package/dist/src/register-care/controlFlow.d.ts +5 -0
  85. package/dist/src/register-care/controlFlow.js +38 -0
  86. package/dist/src/register-care/fix.d.ts +9 -0
  87. package/dist/src/register-care/fix.js +78 -0
  88. package/dist/src/register-care/liveness.d.ts +3 -0
  89. package/dist/src/register-care/liveness.js +189 -0
  90. package/dist/src/register-care/profiles.d.ts +9 -0
  91. package/dist/src/register-care/profiles.js +43 -0
  92. package/dist/src/register-care/programModel.d.ts +3 -0
  93. package/dist/src/register-care/programModel.js +122 -0
  94. package/dist/src/register-care/report.d.ts +4 -0
  95. package/dist/src/register-care/report.js +82 -0
  96. package/dist/src/register-care/smartComments.d.ts +5 -0
  97. package/dist/src/register-care/smartComments.js +243 -0
  98. package/dist/src/register-care/summaries.d.ts +12 -0
  99. package/dist/src/register-care/summaries.js +154 -0
  100. package/dist/src/{registerCare → register-care}/tooling.d.ts +7 -6
  101. package/dist/src/{registerCare → register-care}/tooling.js +17 -6
  102. package/dist/src/register-care/types.d.ts +165 -0
  103. package/dist/src/register-care/types.js +1 -0
  104. package/dist/src/semantics/expression-evaluation.d.ts +29 -0
  105. package/dist/src/semantics/expression-evaluation.js +409 -0
  106. package/dist/src/source/logical-lines.d.ts +7 -0
  107. package/dist/src/source/logical-lines.js +11 -0
  108. package/dist/src/source/source-file.d.ts +5 -0
  109. package/dist/src/source/source-file.js +3 -0
  110. package/dist/src/source/source-span.d.ts +5 -0
  111. package/dist/src/source/source-span.js +1 -0
  112. package/dist/src/source/strip-line-comment.d.ts +4 -0
  113. package/dist/src/source/strip-line-comment.js +27 -0
  114. package/dist/src/syntax/directive-aliases.d.ts +10 -0
  115. package/dist/src/syntax/directive-aliases.js +199 -0
  116. package/dist/src/syntax/parse-expression.d.ts +3 -0
  117. package/dist/src/syntax/parse-expression.js +551 -0
  118. package/dist/src/syntax/parse-line.d.ts +12 -0
  119. package/dist/src/syntax/parse-line.js +329 -0
  120. package/dist/src/tooling/api.d.ts +42 -0
  121. package/dist/src/tooling/api.js +42 -0
  122. package/dist/src/tooling/case-style.d.ts +8 -0
  123. package/dist/src/tooling/case-style.js +163 -0
  124. package/dist/src/z80/effects.d.ts +3 -3
  125. package/dist/src/z80/effects.js +349 -302
  126. package/dist/src/z80/encode.d.ts +2 -10
  127. package/dist/src/z80/encode.js +951 -374
  128. package/dist/src/z80/instruction.d.ts +226 -0
  129. package/dist/src/z80/instruction.js +1 -0
  130. package/dist/src/z80/parse-instruction.d.ts +7 -0
  131. package/dist/src/z80/parse-instruction.js +1068 -0
  132. package/docs/reference/tooling-api.md +55 -3
  133. package/package.json +20 -3
  134. /package/dist/{src → legacy-root-azm/src}/analysis.d.ts +0 -0
  135. /package/dist/{src → legacy-root-azm/src}/analysis.js +0 -0
  136. /package/dist/{src → legacy-root-azm/src}/compile.d.ts +0 -0
  137. /package/dist/{src → legacy-root-azm/src}/compile.js +0 -0
  138. /package/dist/{src → legacy-root-azm/src}/compileShared.d.ts +0 -0
  139. /package/dist/{src → legacy-root-azm/src}/compileShared.js +0 -0
  140. /package/dist/{src → legacy-root-azm/src}/diagnosticTypes.d.ts +0 -0
  141. /package/dist/{src → legacy-root-azm/src}/diagnosticTypes.js +0 -0
  142. /package/dist/{src → legacy-root-azm/src}/formats/range.d.ts +0 -0
  143. /package/dist/{src → legacy-root-azm/src}/formats/range.js +0 -0
  144. /package/dist/{src → legacy-root-azm/src}/formats/types.js +0 -0
  145. /package/dist/{src → legacy-root-azm/src}/formats/writeAsm80.d.ts +0 -0
  146. /package/dist/{src → legacy-root-azm/src}/formats/writeAsm80.js +0 -0
  147. /package/dist/{src → legacy-root-azm/src}/formats/writeBin.d.ts +0 -0
  148. /package/dist/{src → legacy-root-azm/src}/formats/writeBin.js +0 -0
  149. /package/dist/{src → legacy-root-azm/src}/formats/writeD8m.d.ts +0 -0
  150. /package/dist/{src → legacy-root-azm/src}/formats/writeD8m.js +0 -0
  151. /package/dist/{src → legacy-root-azm/src}/formats/writeListing.d.ts +0 -0
  152. /package/dist/{src → legacy-root-azm/src}/formats/writeListing.js +0 -0
  153. /package/dist/{src → legacy-root-azm/src}/frontend/asm80/asmLine.d.ts +0 -0
  154. /package/dist/{src → legacy-root-azm/src}/frontend/asm80/asmLine.js +0 -0
  155. /package/dist/{src → legacy-root-azm/src}/frontend/asm80/parseAsmRawValues.d.ts +0 -0
  156. /package/dist/{src → legacy-root-azm/src}/frontend/asm80/parseAsmRawValues.js +0 -0
  157. /package/dist/{src → legacy-root-azm/src}/frontend/asm80/quoteScan.d.ts +0 -0
  158. /package/dist/{src → legacy-root-azm/src}/frontend/asm80/quoteScan.js +0 -0
  159. /package/dist/{src → legacy-root-azm/src}/frontend/ast.d.ts +0 -0
  160. /package/dist/{src → legacy-root-azm/src}/frontend/ast.js +0 -0
  161. /package/dist/{src → legacy-root-azm/src}/frontend/directiveAliases.d.ts +0 -0
  162. /package/dist/{src → legacy-root-azm/src}/frontend/directiveAliases.js +0 -0
  163. /package/dist/{src → legacy-root-azm/src}/frontend/grammarData.d.ts +0 -0
  164. /package/dist/{src → legacy-root-azm/src}/frontend/grammarData.js +0 -0
  165. /package/dist/{src → legacy-root-azm/src}/frontend/immExprUtils.d.ts +0 -0
  166. /package/dist/{src → legacy-root-azm/src}/frontend/immExprUtils.js +0 -0
  167. /package/dist/{src → legacy-root-azm/src}/frontend/parseAsmFlatDirectiveLine.d.ts +0 -0
  168. /package/dist/{src → legacy-root-azm/src}/frontend/parseAsmFlatDirectiveLine.js +0 -0
  169. /package/dist/{src → legacy-root-azm/src}/frontend/parseAsmInstruction.d.ts +0 -0
  170. /package/dist/{src → legacy-root-azm/src}/frontend/parseAsmInstruction.js +0 -0
  171. /package/dist/{src → legacy-root-azm/src}/frontend/parseAsmStatements.d.ts +0 -0
  172. /package/dist/{src → legacy-root-azm/src}/frontend/parseAsmStatements.js +0 -0
  173. /package/dist/{src → legacy-root-azm/src}/frontend/parseAsmStream.d.ts +0 -0
  174. /package/dist/{src → legacy-root-azm/src}/frontend/parseAsmStream.js +0 -0
  175. /package/dist/{src → legacy-root-azm/src}/frontend/parseAsmTopLevel.d.ts +0 -0
  176. /package/dist/{src → legacy-root-azm/src}/frontend/parseAsmTopLevel.js +0 -0
  177. /package/dist/{src → legacy-root-azm/src}/frontend/parseDiagnostics.d.ts +0 -0
  178. /package/dist/{src → legacy-root-azm/src}/frontend/parseDiagnostics.js +0 -0
  179. /package/dist/{src → legacy-root-azm/src}/frontend/parseEnum.d.ts +0 -0
  180. /package/dist/{src → legacy-root-azm/src}/frontend/parseEnum.js +0 -0
  181. /package/dist/{src → legacy-root-azm/src}/frontend/parseImm.d.ts +0 -0
  182. /package/dist/{src → legacy-root-azm/src}/frontend/parseImm.js +0 -0
  183. /package/dist/{src → legacy-root-azm/src}/frontend/parseLogicalLines.d.ts +0 -0
  184. /package/dist/{src → legacy-root-azm/src}/frontend/parseLogicalLines.js +0 -0
  185. /package/dist/{src → legacy-root-azm/src}/frontend/parseOp.d.ts +0 -0
  186. /package/dist/{src → legacy-root-azm/src}/frontend/parseOp.js +0 -0
  187. /package/dist/{src → legacy-root-azm/src}/frontend/parseOpHeader.d.ts +0 -0
  188. /package/dist/{src → legacy-root-azm/src}/frontend/parseOpHeader.js +0 -0
  189. /package/dist/{src → legacy-root-azm/src}/frontend/parseOperands.d.ts +0 -0
  190. /package/dist/{src → legacy-root-azm/src}/frontend/parseOperands.js +0 -0
  191. /package/dist/{src → legacy-root-azm/src}/frontend/parseParams.d.ts +0 -0
  192. /package/dist/{src → legacy-root-azm/src}/frontend/parseParams.js +0 -0
  193. /package/dist/{src → legacy-root-azm/src}/frontend/parseParserRecovery.d.ts +0 -0
  194. /package/dist/{src → legacy-root-azm/src}/frontend/parseParserRecovery.js +0 -0
  195. /package/dist/{src → legacy-root-azm/src}/frontend/parseParserShared.d.ts +0 -0
  196. /package/dist/{src → legacy-root-azm/src}/frontend/parseParserShared.js +0 -0
  197. /package/dist/{src → legacy-root-azm/src}/frontend/parseRawDataDirectiveStart.d.ts +0 -0
  198. /package/dist/{src → legacy-root-azm/src}/frontend/parseRawDataDirectiveStart.js +0 -0
  199. /package/dist/{src → legacy-root-azm/src}/frontend/parseRawDataDirectives.d.ts +0 -0
  200. /package/dist/{src → legacy-root-azm/src}/frontend/parseRawDataDirectives.js +0 -0
  201. /package/dist/{src → legacy-root-azm/src}/frontend/parseRecordFieldDecl.d.ts +0 -0
  202. /package/dist/{src → legacy-root-azm/src}/frontend/parseRecordFieldDecl.js +0 -0
  203. /package/dist/{src → legacy-root-azm/src}/frontend/parseSourceItemDispatch.d.ts +0 -0
  204. /package/dist/{src → legacy-root-azm/src}/frontend/parseSourceItemDispatch.js +0 -0
  205. /package/dist/{src → legacy-root-azm/src}/frontend/parseSourceItemTable.d.ts +0 -0
  206. /package/dist/{src → legacy-root-azm/src}/frontend/parseSourceItemTable.js +0 -0
  207. /package/dist/{src → legacy-root-azm/src}/frontend/parseTopLevelCommon.d.ts +0 -0
  208. /package/dist/{src → legacy-root-azm/src}/frontend/parseTopLevelCommon.js +0 -0
  209. /package/dist/{src → legacy-root-azm/src}/frontend/parseTypes.d.ts +0 -0
  210. /package/dist/{src → legacy-root-azm/src}/frontend/parseTypes.js +0 -0
  211. /package/dist/{src → legacy-root-azm/src}/frontend/parser.d.ts +0 -0
  212. /package/dist/{src → legacy-root-azm/src}/frontend/parser.js +0 -0
  213. /package/dist/{src → legacy-root-azm/src}/frontend/source.d.ts +0 -0
  214. /package/dist/{src → legacy-root-azm/src}/frontend/source.js +0 -0
  215. /package/dist/{src → legacy-root-azm/src}/frontend/sourceExtensions.d.ts +0 -0
  216. /package/dist/{src → legacy-root-azm/src}/frontend/sourceExtensions.js +0 -0
  217. /package/dist/{src → legacy-root-azm/src}/lintCaseStyle.d.ts +0 -0
  218. /package/dist/{src → legacy-root-azm/src}/lintCaseStyle.js +0 -0
  219. /package/dist/{src → legacy-root-azm/src}/lowering/asmDirectiveLowering.d.ts +0 -0
  220. /package/dist/{src → legacy-root-azm/src}/lowering/asmDirectiveLowering.js +0 -0
  221. /package/dist/{src → legacy-root-azm/src}/lowering/asmDirectiveTraversal.d.ts +0 -0
  222. /package/dist/{src → legacy-root-azm/src}/lowering/asmDirectiveTraversal.js +0 -0
  223. /package/dist/{src → legacy-root-azm/src}/lowering/asmEquResolution.d.ts +0 -0
  224. /package/dist/{src → legacy-root-azm/src}/lowering/asmEquResolution.js +0 -0
  225. /package/dist/{src → legacy-root-azm/src}/lowering/asmInstructionLdHelpers.d.ts +0 -0
  226. /package/dist/{src → legacy-root-azm/src}/lowering/asmInstructionLdHelpers.js +0 -0
  227. /package/dist/{src → legacy-root-azm/src}/lowering/asmInstructionLowering.d.ts +0 -0
  228. /package/dist/{src → legacy-root-azm/src}/lowering/asmInstructionLowering.js +0 -0
  229. /package/dist/{src → legacy-root-azm/src}/lowering/asmInstructionStream.d.ts +0 -0
  230. /package/dist/{src → legacy-root-azm/src}/lowering/asmInstructionStream.js +0 -0
  231. /package/dist/{src → legacy-root-azm/src}/lowering/asmLoweringBranchCall.d.ts +0 -0
  232. /package/dist/{src → legacy-root-azm/src}/lowering/asmLoweringBranchCall.js +0 -0
  233. /package/dist/{src → legacy-root-azm/src}/lowering/asmLoweringHost.d.ts +0 -0
  234. /package/dist/{src → legacy-root-azm/src}/lowering/asmLoweringHost.js +0 -0
  235. /package/dist/{src → legacy-root-azm/src}/lowering/asmLoweringLd.d.ts +0 -0
  236. /package/dist/{src → legacy-root-azm/src}/lowering/asmLoweringLd.js +0 -0
  237. /package/dist/{src → legacy-root-azm/src}/lowering/asmRangeLowering.d.ts +0 -0
  238. /package/dist/{src → legacy-root-azm/src}/lowering/asmRangeLowering.js +0 -0
  239. /package/dist/{src → legacy-root-azm/src}/lowering/asmRawDataLowering.d.ts +0 -0
  240. /package/dist/{src → legacy-root-azm/src}/lowering/asmRawDataLowering.js +0 -0
  241. /package/dist/{src → legacy-root-azm/src}/lowering/asmSourceEmitter.d.ts +0 -0
  242. /package/dist/{src → legacy-root-azm/src}/lowering/asmSourceEmitter.js +0 -0
  243. /package/dist/{src → legacy-root-azm/src}/lowering/asmSourceInstructionLowering.d.ts +0 -0
  244. /package/dist/{src → legacy-root-azm/src}/lowering/asmSourceInstructionLowering.js +0 -0
  245. /package/dist/{src → legacy-root-azm/src}/lowering/asmUtils.d.ts +0 -0
  246. /package/dist/{src → legacy-root-azm/src}/lowering/asmUtils.js +0 -0
  247. /package/dist/{src → legacy-root-azm/src}/lowering/assemblerFlowSetup.d.ts +0 -0
  248. /package/dist/{src → legacy-root-azm/src}/lowering/assemblerFlowSetup.js +0 -0
  249. /package/dist/{src → legacy-root-azm/src}/lowering/assemblerLoweringContext.d.ts +0 -0
  250. /package/dist/{src → legacy-root-azm/src}/lowering/assemblerLoweringContext.js +0 -0
  251. /package/dist/{src → legacy-root-azm/src}/lowering/assemblerLoweringContextSplit.d.ts +0 -0
  252. /package/dist/{src → legacy-root-azm/src}/lowering/assemblerLoweringContextSplit.js +0 -0
  253. /package/dist/{src → legacy-root-azm/src}/lowering/assemblerLoweringPhases.d.ts +0 -0
  254. /package/dist/{src → legacy-root-azm/src}/lowering/assemblerLoweringPhases.js +0 -0
  255. /package/dist/{src → legacy-root-azm/src}/lowering/bytePlacement.d.ts +0 -0
  256. /package/dist/{src → legacy-root-azm/src}/lowering/bytePlacement.js +0 -0
  257. /package/dist/{src → legacy-root-azm/src}/lowering/capabilities.d.ts +0 -0
  258. /package/dist/{src → legacy-root-azm/src}/lowering/capabilities.js +0 -0
  259. /package/dist/{src → legacy-root-azm/src}/lowering/eaResolution.d.ts +0 -0
  260. /package/dist/{src → legacy-root-azm/src}/lowering/eaResolution.js +0 -0
  261. /package/dist/{src → legacy-root-azm/src}/lowering/emissionCore.d.ts +0 -0
  262. /package/dist/{src → legacy-root-azm/src}/lowering/emissionCore.js +0 -0
  263. /package/dist/{src → legacy-root-azm/src}/lowering/emit.d.ts +0 -0
  264. /package/dist/{src → legacy-root-azm/src}/lowering/emit.js +0 -0
  265. /package/dist/{src → legacy-root-azm/src}/lowering/emitContextBuilder.d.ts +0 -0
  266. /package/dist/{src → legacy-root-azm/src}/lowering/emitContextBuilder.js +0 -0
  267. /package/dist/{src → legacy-root-azm/src}/lowering/emitFinalization.d.ts +0 -0
  268. /package/dist/{src → legacy-root-azm/src}/lowering/emitFinalization.js +0 -0
  269. /package/dist/{src → legacy-root-azm/src}/lowering/emitFinalizationSetup.d.ts +0 -0
  270. /package/dist/{src → legacy-root-azm/src}/lowering/emitFinalizationSetup.js +0 -0
  271. /package/dist/{src → legacy-root-azm/src}/lowering/emitPhase1BuildProgramLoweringContext.d.ts +0 -0
  272. /package/dist/{src → legacy-root-azm/src}/lowering/emitPhase1BuildProgramLoweringContext.js +0 -0
  273. /package/dist/{src → legacy-root-azm/src}/lowering/emitPhase1Helpers.d.ts +0 -0
  274. /package/dist/{src → legacy-root-azm/src}/lowering/emitPhase1Helpers.js +0 -0
  275. /package/dist/{src → legacy-root-azm/src}/lowering/emitPhase1Types.d.ts +0 -0
  276. /package/dist/{src → legacy-root-azm/src}/lowering/emitPhase1Types.js +0 -0
  277. /package/dist/{src → legacy-root-azm/src}/lowering/emitPhase1WirePipeline.d.ts +0 -0
  278. /package/dist/{src → legacy-root-azm/src}/lowering/emitPhase1WirePipeline.js +0 -0
  279. /package/dist/{src → legacy-root-azm/src}/lowering/emitPhase1Workspace.d.ts +0 -0
  280. /package/dist/{src → legacy-root-azm/src}/lowering/emitPhase1Workspace.js +0 -0
  281. /package/dist/{src → legacy-root-azm/src}/lowering/emitPipeline.d.ts +0 -0
  282. /package/dist/{src → legacy-root-azm/src}/lowering/emitPipeline.js +0 -0
  283. /package/dist/{src → legacy-root-azm/src}/lowering/emitProgramContext.d.ts +0 -0
  284. /package/dist/{src → legacy-root-azm/src}/lowering/emitProgramContext.js +0 -0
  285. /package/dist/{src → legacy-root-azm/src}/lowering/emitState.d.ts +0 -0
  286. /package/dist/{src → legacy-root-azm/src}/lowering/emitState.js +0 -0
  287. /package/dist/{src → legacy-root-azm/src}/lowering/fixupBaseResolution.d.ts +0 -0
  288. /package/dist/{src → legacy-root-azm/src}/lowering/fixupBaseResolution.js +0 -0
  289. /package/dist/{src → legacy-root-azm/src}/lowering/fixupEmission.d.ts +0 -0
  290. /package/dist/{src → legacy-root-azm/src}/lowering/fixupEmission.js +0 -0
  291. /package/dist/{src → legacy-root-azm/src}/lowering/immMath.d.ts +0 -0
  292. /package/dist/{src → legacy-root-azm/src}/lowering/immMath.js +0 -0
  293. /package/dist/{src → legacy-root-azm/src}/lowering/inputAssets.d.ts +0 -0
  294. /package/dist/{src → legacy-root-azm/src}/lowering/inputAssets.js +0 -0
  295. /package/dist/{src → legacy-root-azm/src}/lowering/ldEncoding.d.ts +0 -0
  296. /package/dist/{src → legacy-root-azm/src}/lowering/ldEncoding.js +0 -0
  297. /package/dist/{src → legacy-root-azm/src}/lowering/ldEncodingRegMemHelpers.d.ts +0 -0
  298. /package/dist/{src → legacy-root-azm/src}/lowering/ldEncodingRegMemHelpers.js +0 -0
  299. /package/dist/{src → legacy-root-azm/src}/lowering/ldFormSelection.d.ts +0 -0
  300. /package/dist/{src → legacy-root-azm/src}/lowering/ldFormSelection.js +0 -0
  301. /package/dist/{src → legacy-root-azm/src}/lowering/ldLowering.d.ts +0 -0
  302. /package/dist/{src → legacy-root-azm/src}/lowering/ldLowering.js +0 -0
  303. /package/dist/{src → legacy-root-azm/src}/lowering/loweredAsmByteEmission.d.ts +0 -0
  304. /package/dist/{src → legacy-root-azm/src}/lowering/loweredAsmByteEmission.js +0 -0
  305. /package/dist/{src → legacy-root-azm/src}/lowering/loweredAsmPlacement.d.ts +0 -0
  306. /package/dist/{src → legacy-root-azm/src}/lowering/loweredAsmPlacement.js +0 -0
  307. /package/dist/{src → legacy-root-azm/src}/lowering/loweredAsmStreamRecording.d.ts +0 -0
  308. /package/dist/{src → legacy-root-azm/src}/lowering/loweredAsmStreamRecording.js +0 -0
  309. /package/dist/{src → legacy-root-azm/src}/lowering/loweredAsmTypes.d.ts +0 -0
  310. /package/dist/{src → legacy-root-azm/src}/lowering/loweredAsmTypes.js +0 -0
  311. /package/dist/{src → legacy-root-azm/src}/lowering/loweredFormat.d.ts +0 -0
  312. /package/dist/{src → legacy-root-azm/src}/lowering/loweredFormat.js +0 -0
  313. /package/dist/{src → legacy-root-azm/src}/lowering/loweredItemSize.d.ts +0 -0
  314. /package/dist/{src → legacy-root-azm/src}/lowering/loweredItemSize.js +0 -0
  315. /package/dist/{src → legacy-root-azm/src}/lowering/loweringDiagnostics.d.ts +0 -0
  316. /package/dist/{src → legacy-root-azm/src}/lowering/loweringDiagnostics.js +0 -0
  317. /package/dist/{src → legacy-root-azm/src}/lowering/loweringTypes.d.ts +0 -0
  318. /package/dist/{src → legacy-root-azm/src}/lowering/loweringTypes.js +0 -0
  319. /package/dist/{src → legacy-root-azm/src}/lowering/opCandidateRegistry.d.ts +0 -0
  320. /package/dist/{src → legacy-root-azm/src}/lowering/opCandidateRegistry.js +0 -0
  321. /package/dist/{src → legacy-root-azm/src}/lowering/opExpansionExecution.d.ts +0 -0
  322. /package/dist/{src → legacy-root-azm/src}/lowering/opExpansionExecution.js +0 -0
  323. /package/dist/{src → legacy-root-azm/src}/lowering/opExpansionOrchestration.d.ts +0 -0
  324. /package/dist/{src → legacy-root-azm/src}/lowering/opExpansionOrchestration.js +0 -0
  325. /package/dist/{src → legacy-root-azm/src}/lowering/opExpansionStream.d.ts +0 -0
  326. /package/dist/{src → legacy-root-azm/src}/lowering/opExpansionStream.js +0 -0
  327. /package/dist/{src → legacy-root-azm/src}/lowering/opMatching.d.ts +0 -0
  328. /package/dist/{src → legacy-root-azm/src}/lowering/opMatching.js +0 -0
  329. /package/dist/{src → legacy-root-azm/src}/lowering/opSubstitution.d.ts +0 -0
  330. /package/dist/{src → legacy-root-azm/src}/lowering/opSubstitution.js +0 -0
  331. /package/dist/{src → legacy-root-azm/src}/lowering/prescanTypes.d.ts +0 -0
  332. /package/dist/{src → legacy-root-azm/src}/lowering/prescanTypes.js +0 -0
  333. /package/dist/{src → legacy-root-azm/src}/lowering/programLowering.d.ts +0 -0
  334. /package/dist/{src → legacy-root-azm/src}/lowering/programLowering.js +0 -0
  335. /package/dist/{src → legacy-root-azm/src}/lowering/programLoweringDeclarations.d.ts +0 -0
  336. /package/dist/{src → legacy-root-azm/src}/lowering/programLoweringDeclarations.js +0 -0
  337. /package/dist/{src → legacy-root-azm/src}/lowering/programLoweringFinalize.d.ts +0 -0
  338. /package/dist/{src → legacy-root-azm/src}/lowering/programLoweringFinalize.js +0 -0
  339. /package/dist/{src → legacy-root-azm/src}/lowering/programLoweringTraversal.d.ts +0 -0
  340. /package/dist/{src → legacy-root-azm/src}/lowering/programLoweringTraversal.js +0 -0
  341. /package/dist/{src → legacy-root-azm/src}/lowering/programPrescan.d.ts +0 -0
  342. /package/dist/{src → legacy-root-azm/src}/lowering/programPrescan.js +0 -0
  343. /package/dist/{src → legacy-root-azm/src}/lowering/traceFormat.d.ts +0 -0
  344. /package/dist/{src → legacy-root-azm/src}/lowering/traceFormat.js +0 -0
  345. /package/dist/{src → legacy-root-azm/src}/packageInfo.d.ts +0 -0
  346. /package/dist/{src → legacy-root-azm/src}/packageInfo.js +0 -0
  347. /package/dist/{src → legacy-root-azm/src}/pathCompare.d.ts +0 -0
  348. /package/dist/{src → legacy-root-azm/src}/pathCompare.js +0 -0
  349. /package/dist/{src → legacy-root-azm/src}/pipeline.js +0 -0
  350. /package/dist/{src → legacy-root-azm/src}/registerCare/analyze.d.ts +0 -0
  351. /package/dist/{src → legacy-root-azm/src}/registerCare/analyze.js +0 -0
  352. /package/dist/{src → legacy-root-azm/src}/registerCare/annotate.d.ts +0 -0
  353. /package/dist/{src → legacy-root-azm/src}/registerCare/annotate.js +0 -0
  354. /package/dist/{src → legacy-root-azm/src}/registerCare/boundaryHints.d.ts +0 -0
  355. /package/dist/{src → legacy-root-azm/src}/registerCare/boundaryHints.js +0 -0
  356. /package/dist/{src → legacy-root-azm/src}/registerCare/carriers.d.ts +0 -0
  357. /package/dist/{src → legacy-root-azm/src}/registerCare/carriers.js +0 -0
  358. /package/dist/{src → legacy-root-azm/src}/registerCare/controlFlow.d.ts +0 -0
  359. /package/dist/{src → legacy-root-azm/src}/registerCare/controlFlow.js +0 -0
  360. /package/dist/{src → legacy-root-azm/src}/registerCare/fix.d.ts +0 -0
  361. /package/dist/{src → legacy-root-azm/src}/registerCare/fix.js +0 -0
  362. /package/dist/{src → legacy-root-azm/src}/registerCare/liveness.d.ts +0 -0
  363. /package/dist/{src → legacy-root-azm/src}/registerCare/liveness.js +0 -0
  364. /package/dist/{src → legacy-root-azm/src}/registerCare/profiles.d.ts +0 -0
  365. /package/dist/{src → legacy-root-azm/src}/registerCare/profiles.js +0 -0
  366. /package/dist/{src → legacy-root-azm/src}/registerCare/programModel.d.ts +0 -0
  367. /package/dist/{src → legacy-root-azm/src}/registerCare/programModel.js +0 -0
  368. /package/dist/{src → legacy-root-azm/src}/registerCare/report.d.ts +0 -0
  369. /package/dist/{src → legacy-root-azm/src}/registerCare/report.js +0 -0
  370. /package/dist/{src → legacy-root-azm/src}/registerCare/smartComments.d.ts +0 -0
  371. /package/dist/{src → legacy-root-azm/src}/registerCare/smartComments.js +0 -0
  372. /package/dist/{src → legacy-root-azm/src}/registerCare/sourceText.d.ts +0 -0
  373. /package/dist/{src → legacy-root-azm/src}/registerCare/sourceText.js +0 -0
  374. /package/dist/{src → legacy-root-azm/src}/registerCare/summary.d.ts +0 -0
  375. /package/dist/{src → legacy-root-azm/src}/registerCare/summary.js +0 -0
  376. /package/dist/{src → legacy-root-azm/src}/registerCare/types.d.ts +0 -0
  377. /package/dist/{src → legacy-root-azm/src}/registerCare/types.js +0 -0
  378. /package/dist/{src → legacy-root-azm/src}/semantics/declVisitor.d.ts +0 -0
  379. /package/dist/{src → legacy-root-azm/src}/semantics/declVisitor.js +0 -0
  380. /package/dist/{src → legacy-root-azm/src}/semantics/env.d.ts +0 -0
  381. /package/dist/{src → legacy-root-azm/src}/semantics/env.js +0 -0
  382. /package/dist/{src → legacy-root-azm/src}/semantics/layout.d.ts +0 -0
  383. /package/dist/{src → legacy-root-azm/src}/semantics/layout.js +0 -0
  384. /package/dist/{src → legacy-root-azm/src}/semantics/layoutCastFold.d.ts +0 -0
  385. /package/dist/{src → legacy-root-azm/src}/semantics/layoutCastFold.js +0 -0
  386. /package/dist/{src → legacy-root-azm/src}/semantics/semanticsDiagnostics.d.ts +0 -0
  387. /package/dist/{src → legacy-root-azm/src}/semantics/semanticsDiagnostics.js +0 -0
  388. /package/dist/{src → legacy-root-azm/src}/semantics/typeQueries.d.ts +0 -0
  389. /package/dist/{src → legacy-root-azm/src}/semantics/typeQueries.js +0 -0
  390. /package/dist/{src → legacy-root-azm/src}/sourceIncludeExpansion.d.ts +0 -0
  391. /package/dist/{src → legacy-root-azm/src}/sourceIncludeExpansion.js +0 -0
  392. /package/dist/{src → legacy-root-azm/src}/sourceIncludePaths.d.ts +0 -0
  393. /package/dist/{src → legacy-root-azm/src}/sourceIncludePaths.js +0 -0
  394. /package/dist/{src → legacy-root-azm/src}/sourceLoader.d.ts +0 -0
  395. /package/dist/{src → legacy-root-azm/src}/sourceLoader.js +0 -0
  396. /package/dist/{src → legacy-root-azm/src}/z80/encodeAlu.d.ts +0 -0
  397. /package/dist/{src → legacy-root-azm/src}/z80/encodeAlu.js +0 -0
  398. /package/dist/{src → legacy-root-azm/src}/z80/encodeBitOps.d.ts +0 -0
  399. /package/dist/{src → legacy-root-azm/src}/z80/encodeBitOps.js +0 -0
  400. /package/dist/{src → legacy-root-azm/src}/z80/encodeContext.d.ts +0 -0
  401. /package/dist/{src → legacy-root-azm/src}/z80/encodeContext.js +0 -0
  402. /package/dist/{src → legacy-root-azm/src}/z80/encodeControl.d.ts +0 -0
  403. /package/dist/{src → legacy-root-azm/src}/z80/encodeControl.js +0 -0
  404. /package/dist/{src → legacy-root-azm/src}/z80/encodeCoreOps.d.ts +0 -0
  405. /package/dist/{src → legacy-root-azm/src}/z80/encodeCoreOps.js +0 -0
  406. /package/dist/{src → legacy-root-azm/src}/z80/encodeIo.d.ts +0 -0
  407. /package/dist/{src → legacy-root-azm/src}/z80/encodeIo.js +0 -0
  408. /package/dist/{src → legacy-root-azm/src}/z80/encodeLd.d.ts +0 -0
  409. /package/dist/{src → legacy-root-azm/src}/z80/encodeLd.js +0 -0
  410. /package/dist/{src → legacy-root-azm/src}/z80/encoderRegistry.d.ts +0 -0
  411. /package/dist/{src → legacy-root-azm/src}/z80/encoderRegistry.js +0 -0
@@ -0,0 +1,122 @@
1
+ function isGlobalLabel(name) {
2
+ return !name.startsWith('.');
3
+ }
4
+ function routineNameFromExpression(expression) {
5
+ return expression.kind === 'symbol' ? expression.name : undefined;
6
+ }
7
+ function instructionCallTarget(item) {
8
+ if (item.kind !== 'instruction')
9
+ return undefined;
10
+ const mnemonic = item.instruction.mnemonic;
11
+ if (mnemonic === 'call' || mnemonic === 'call-cc') {
12
+ return routineNameFromExpression(item.instruction.expression);
13
+ }
14
+ return undefined;
15
+ }
16
+ function toInstruction(item, labels) {
17
+ return {
18
+ instruction: item.instruction,
19
+ file: item.span.sourceName,
20
+ line: item.span.line,
21
+ column: item.span.column,
22
+ labels: [...labels],
23
+ };
24
+ }
25
+ export function buildRegisterCareProgramModel(items) {
26
+ const routines = [];
27
+ const directCalls = [];
28
+ let routineName;
29
+ let entryLabels = [];
30
+ let labels = [];
31
+ let sourceName;
32
+ let routineStartLine;
33
+ let routineStartColumn;
34
+ let instructions = [];
35
+ const startRoutine = (item) => {
36
+ sourceName = item.span.sourceName;
37
+ routineName = item.name;
38
+ entryLabels = [item.name];
39
+ labels = [item.name];
40
+ routineStartLine = item.span.line;
41
+ routineStartColumn = item.span.column;
42
+ instructions = [];
43
+ };
44
+ const flushRoutine = () => {
45
+ if (routineName === undefined || instructions.length === 0 || routineStartLine === undefined) {
46
+ return;
47
+ }
48
+ const end = instructions[instructions.length - 1];
49
+ if (end === undefined)
50
+ return;
51
+ routines.push({
52
+ name: routineName,
53
+ labels: [...labels],
54
+ entryLabels: [...entryLabels],
55
+ instructions: [...instructions],
56
+ span: {
57
+ file: sourceName ?? '',
58
+ start: { line: routineStartLine, column: routineStartColumn ?? 1 },
59
+ end: { line: end.line, column: end.column },
60
+ },
61
+ });
62
+ };
63
+ const resetRoutine = () => {
64
+ routineName = undefined;
65
+ entryLabels = [];
66
+ labels = [];
67
+ sourceName = undefined;
68
+ routineStartLine = undefined;
69
+ routineStartColumn = undefined;
70
+ instructions = [];
71
+ };
72
+ const finalizeAndRestart = (item) => {
73
+ flushRoutine();
74
+ resetRoutine();
75
+ startRoutine(item);
76
+ };
77
+ for (const item of items) {
78
+ if (item.kind !== 'label') {
79
+ if (item.kind !== 'instruction') {
80
+ continue;
81
+ }
82
+ if (routineName === undefined || sourceName === undefined) {
83
+ continue;
84
+ }
85
+ if (item.span.sourceName !== sourceName) {
86
+ continue;
87
+ }
88
+ instructions.push(toInstruction(item, labels));
89
+ const directTarget = instructionCallTarget(item);
90
+ if (directTarget !== undefined) {
91
+ directCalls.push({
92
+ target: directTarget,
93
+ file: item.span.sourceName,
94
+ line: item.span.line,
95
+ column: item.span.column,
96
+ });
97
+ }
98
+ continue;
99
+ }
100
+ if (!isGlobalLabel(item.name)) {
101
+ if (routineName !== undefined) {
102
+ labels.push(item.name);
103
+ }
104
+ continue;
105
+ }
106
+ if (routineName === undefined) {
107
+ startRoutine(item);
108
+ continue;
109
+ }
110
+ if (instructions.length > 0 ||
111
+ sourceName === undefined ||
112
+ sourceName !== item.span.sourceName) {
113
+ finalizeAndRestart(item);
114
+ continue;
115
+ }
116
+ // Multiple global labels before body on same routine are coalesced as entry labels.
117
+ labels.push(item.name);
118
+ entryLabels.push(item.name);
119
+ }
120
+ flushRoutine();
121
+ return { routines, directCalls };
122
+ }
@@ -0,0 +1,4 @@
1
+ import type { RegisterCareReportModel, RegisterCareUnit, RoutineSummary } from './types.js';
2
+ export declare function renderRegisterCareReport(model: RegisterCareReportModel): string;
3
+ export declare function contractCarrierList(units: RegisterCareUnit[]): string;
4
+ export declare function renderRegisterCareInterface(summaries: RoutineSummary[]): string;
@@ -0,0 +1,82 @@
1
+ function listUnits(units) {
2
+ return units.length === 0 ? '-' : units.join(',');
3
+ }
4
+ export function renderRegisterCareReport(model) {
5
+ const lines = [
6
+ 'AZM Register-Care Report',
7
+ `Entry: ${model.entryFile}`,
8
+ `Mode: ${model.mode}`,
9
+ ...(model.profile !== undefined ? [`Profile: ${model.profile}`] : []),
10
+ '',
11
+ ];
12
+ if (model.summaries.length === 0) {
13
+ lines.push('Routines: none', '');
14
+ }
15
+ else {
16
+ for (const summary of model.summaries) {
17
+ lines.push(`Routine: ${summary.name}`);
18
+ lines.push(` reads: ${listUnits(summary.mayRead)}`);
19
+ lines.push(` writes: ${listUnits(summary.mayWrite)}`);
20
+ lines.push(` preserves: ${listUnits(summary.preserved)}`);
21
+ lines.push('');
22
+ }
23
+ }
24
+ lines.push('Conflicts:');
25
+ if (model.conflicts.length === 0) {
26
+ lines.push(' none');
27
+ }
28
+ else {
29
+ for (const conflict of model.conflicts) {
30
+ lines.push(` ${conflict.file}:${conflict.line}:${conflict.column}: ${conflict.callTarget}: ${conflict.message}`);
31
+ }
32
+ }
33
+ lines.push('');
34
+ lines.push('Output candidates:');
35
+ if (model.outputCandidates === undefined || model.outputCandidates.length === 0) {
36
+ lines.push(' none');
37
+ }
38
+ else {
39
+ for (const candidate of model.outputCandidates) {
40
+ lines.push(` ${candidate.file}:${candidate.line}:${candidate.column}: ${candidate.routine}: ${candidate.carriers.join(',')}: ${candidate.message}`);
41
+ }
42
+ }
43
+ lines.push('');
44
+ lines.push('Unknown calls:');
45
+ if (model.unknownCalls.length === 0) {
46
+ lines.push(' none');
47
+ }
48
+ else {
49
+ for (const call of model.unknownCalls) {
50
+ lines.push(` ${call}`);
51
+ }
52
+ }
53
+ lines.push('');
54
+ return `${lines.join('\n')}\n`;
55
+ }
56
+ export function contractCarrierList(units) {
57
+ return units.length === 0 ? '-' : units.join(',');
58
+ }
59
+ export function renderRegisterCareInterface(summaries) {
60
+ const lines = [];
61
+ for (const summary of summaries) {
62
+ if (summary.mayRead.length === 0 &&
63
+ summary.mayWrite.length === 0 &&
64
+ summary.preserved.length === 0) {
65
+ continue;
66
+ }
67
+ lines.push(`extern ${summary.name}`);
68
+ if (summary.mayRead.length > 0) {
69
+ lines.push(`in ${contractCarrierList(summary.mayRead)}`);
70
+ }
71
+ if (summary.mayWrite.length > 0) {
72
+ lines.push(`clobbers ${contractCarrierList(summary.mayWrite)}`);
73
+ }
74
+ if (summary.preserved.length > 0) {
75
+ lines.push(`preserves ${contractCarrierList(summary.preserved)}`);
76
+ }
77
+ lines.push('end', '');
78
+ }
79
+ if (lines.length === 0)
80
+ lines.push('No inferred contracts were emitted.', '');
81
+ return `${lines.join('\n')}\n`;
82
+ }
@@ -0,0 +1,5 @@
1
+ import type { LocatedSmartComment, RegisterCareRoutine, RoutineContract, SmartComment } from './types.js';
2
+ export declare function parseSmartCommentLine(line: string): SmartComment | undefined;
3
+ export declare function parseSmartComments(sourceLineComments: ReadonlyMap<string, ReadonlyMap<number, string>>): LocatedSmartComment[];
4
+ export declare function buildRoutineContracts(comments: LocatedSmartComment[], routines?: RegisterCareRoutine[], sourceTexts?: ReadonlyMap<string, string>): Map<string, RoutineContract>;
5
+ export declare function parseInterfaceContracts(text: string, file?: string): Map<string, RoutineContract>;
@@ -0,0 +1,243 @@
1
+ import { expandCarrierList } from './carriers.js';
2
+ const COMPACT_SOURCE_TAG_RE = /^;?\s*!\s*(in|out|clobbers|preserves)(?:\s+(.+))?$/i;
3
+ const COMPACT_SOURCE_LINE_RE = /^\s*;\s*!\s*(?:in|out|maybe-out|clobbers|preserves)(?:\s|$)/i;
4
+ const INTERFACE_TAG_RE = /^\s*(in|out|clobbers|preserves)(?:\s+(.+))?$/i;
5
+ const CARRIER_RE = /^\{([^}]+)\}(?:\s+(.+))?$/;
6
+ function parseCarrierPayload(rest) {
7
+ if (!rest)
8
+ return undefined;
9
+ const match = CARRIER_RE.exec(rest.trim());
10
+ if (match) {
11
+ const carriers = match[1].split(',').map((value) => value.trim()).filter(Boolean);
12
+ const name = match[2]?.trim();
13
+ return { carriers, ...(name ? { name } : {}) };
14
+ }
15
+ const tokens = rest.trim().split(/\s+/u);
16
+ const carriers = [];
17
+ let consumed = 0;
18
+ for (const token of tokens) {
19
+ const cleaned = token.replace(/[.:;]+$/u, '');
20
+ const parts = cleaned
21
+ .split(',')
22
+ .map((value) => value.trim())
23
+ .filter(Boolean);
24
+ if (parts.length === 0 || !expandCarrierList(parts))
25
+ break;
26
+ carriers.push(...parts);
27
+ consumed += 1;
28
+ }
29
+ if (carriers.length === 0)
30
+ return undefined;
31
+ const name = tokens.slice(consumed).join(' ').trim();
32
+ return { carriers, ...(name ? { name } : {}) };
33
+ }
34
+ export function parseSmartCommentLine(line) {
35
+ const trimmed = line.trim();
36
+ const expectOut = /^;?\s*expects\s+out\s+(.+)$/i.exec(trimmed);
37
+ if (expectOut !== null) {
38
+ const payload = parseCarrierPayload(expectOut[1]?.trim());
39
+ if (!payload)
40
+ return undefined;
41
+ const carriers = expandCarrierList(payload.carriers);
42
+ if (!carriers || carriers.length === 0)
43
+ return undefined;
44
+ return { kind: 'expectOut', carriers, ...(payload.name ? { name: payload.name } : {}) };
45
+ }
46
+ const match = COMPACT_SOURCE_TAG_RE.exec(trimmed);
47
+ if (!match)
48
+ return undefined;
49
+ const tag = match[1].toLowerCase();
50
+ const rest = match[2]?.trim();
51
+ const payload = parseCarrierPayload(rest);
52
+ if (!payload)
53
+ return undefined;
54
+ const carriers = expandCarrierList(payload.carriers);
55
+ if (!carriers || carriers.length === 0)
56
+ return undefined;
57
+ if (tag === 'in')
58
+ return { kind: 'in', carriers, ...(payload.name ? { name: payload.name } : {}) };
59
+ if (tag === 'out')
60
+ return { kind: 'out', carriers, ...(payload.name ? { name: payload.name } : {}) };
61
+ if (tag === 'clobbers')
62
+ return { kind: 'clobbers', carriers };
63
+ if (tag === 'preserves')
64
+ return { kind: 'preserves', carriers };
65
+ return undefined;
66
+ }
67
+ function parseInterfaceContractLine(line) {
68
+ const trimmed = line.trim();
69
+ if (trimmed.length === 0 || trimmed.startsWith(';'))
70
+ return undefined;
71
+ const extern = /^extern\s+(\S+)\s*$/i.exec(trimmed);
72
+ if (extern !== null)
73
+ return { kind: 'extern', name: extern[1] };
74
+ if (/^end\s*$/i.test(trimmed))
75
+ return { kind: 'end' };
76
+ const match = INTERFACE_TAG_RE.exec(trimmed);
77
+ if (!match)
78
+ return undefined;
79
+ const tag = match[1].toLowerCase();
80
+ const rest = match[2]?.trim();
81
+ if (!rest)
82
+ return undefined;
83
+ const rawCarriers = rest.split(',').map((part) => part.trim());
84
+ if (rawCarriers.length === 0 || rawCarriers.some((part) => part.length === 0))
85
+ return undefined;
86
+ const carriers = expandCarrierList(rawCarriers);
87
+ if (!carriers || carriers.length === 0)
88
+ return undefined;
89
+ if (tag === 'in')
90
+ return { kind: 'in', carriers };
91
+ if (tag === 'out')
92
+ return { kind: 'out', carriers };
93
+ if (tag === 'clobbers')
94
+ return { kind: 'clobbers', carriers };
95
+ if (tag === 'preserves')
96
+ return { kind: 'preserves', carriers };
97
+ return undefined;
98
+ }
99
+ function isCompactSourceCommentLine(line) {
100
+ return COMPACT_SOURCE_LINE_RE.test(line);
101
+ }
102
+ export function parseSmartComments(sourceLineComments) {
103
+ const out = [];
104
+ for (const [file, comments] of sourceLineComments) {
105
+ for (const [line, text] of comments) {
106
+ const parsed = parseSmartCommentLine(`;${text}`);
107
+ if (parsed) {
108
+ out.push({ file, line, comment: parsed });
109
+ }
110
+ }
111
+ }
112
+ return out.sort((a, b) => (a.file === b.file ? a.line - b.line : a.file.localeCompare(b.file)));
113
+ }
114
+ function appendUnique(items, values) {
115
+ for (const value of values) {
116
+ if (!items.includes(value)) {
117
+ items.push(value);
118
+ }
119
+ }
120
+ }
121
+ function isCommentOnlyLine(line) {
122
+ return /^\s*;/.test(line);
123
+ }
124
+ function applyContractComment(contract, comment) {
125
+ if (comment.kind === 'in')
126
+ appendUnique(contract.in, comment.carriers);
127
+ if (comment.kind === 'out')
128
+ appendUnique(contract.out, comment.carriers);
129
+ if (comment.kind === 'clobbers')
130
+ appendUnique(contract.clobbers, comment.carriers);
131
+ if (comment.kind === 'preserves')
132
+ appendUnique(contract.preserves, comment.carriers);
133
+ }
134
+ function hasContractContent(contract) {
135
+ return (contract.in.length > 0 ||
136
+ contract.out.length > 0 ||
137
+ contract.clobbers.length > 0 ||
138
+ contract.preserves.length > 0);
139
+ }
140
+ function collectPrecedingCommentBlock(routine, sourceTexts) {
141
+ const source = sourceTexts.get(routine.span.file);
142
+ if (source === undefined)
143
+ return { comments: [], complete: false };
144
+ const lines = source.split(/\r?\n/);
145
+ const rawBlock = [];
146
+ for (let index = routine.span.start.line - 2; index >= 0; index -= 1) {
147
+ const text = lines[index] ?? '';
148
+ if (!isCommentOnlyLine(text))
149
+ break;
150
+ rawBlock.push({ line: index + 1, text });
151
+ }
152
+ rawBlock.reverse();
153
+ let compactStart = rawBlock.length;
154
+ while (compactStart > 0 &&
155
+ isCompactSourceCommentLine(rawBlock[compactStart - 1]?.text ?? '')) {
156
+ compactStart -= 1;
157
+ }
158
+ return {
159
+ complete: compactStart < rawBlock.length,
160
+ comments: (compactStart < rawBlock.length ? rawBlock.slice(compactStart) : rawBlock).flatMap((item) => {
161
+ const parsed = parseSmartCommentLine(item.text);
162
+ return parsed ? [{ file: routine.span.file, line: item.line, comment: parsed }] : [];
163
+ }),
164
+ };
165
+ }
166
+ function buildImplicitRoutineContracts(routines, sourceTexts) {
167
+ const contracts = new Map();
168
+ for (const routine of routines) {
169
+ const docBlock = collectPrecedingCommentBlock(routine, sourceTexts);
170
+ if (docBlock.comments.some((item) => item.comment.kind === 'extern' || item.comment.kind === 'end')) {
171
+ continue;
172
+ }
173
+ const contract = {
174
+ name: routine.name,
175
+ in: [],
176
+ out: [],
177
+ clobbers: [],
178
+ preserves: [],
179
+ ...(docBlock.complete ? { complete: true } : {}),
180
+ };
181
+ for (const item of docBlock.comments) {
182
+ applyContractComment(contract, item.comment);
183
+ }
184
+ if (hasContractContent(contract)) {
185
+ contracts.set(routine.name, contract);
186
+ }
187
+ }
188
+ return contracts;
189
+ }
190
+ export function buildRoutineContracts(comments, routines = [], sourceTexts = new Map()) {
191
+ const contracts = new Map();
192
+ let current;
193
+ for (const item of comments) {
194
+ if (item.comment.kind === 'extern') {
195
+ current = {
196
+ name: item.comment.name,
197
+ in: [],
198
+ out: [],
199
+ clobbers: [],
200
+ preserves: [],
201
+ };
202
+ contracts.set(item.comment.name, current);
203
+ continue;
204
+ }
205
+ if (item.comment.kind === 'end') {
206
+ current = undefined;
207
+ continue;
208
+ }
209
+ if (current !== undefined) {
210
+ applyContractComment(current, item.comment);
211
+ }
212
+ }
213
+ for (const [name, contract] of buildImplicitRoutineContracts(routines, sourceTexts)) {
214
+ if (!contracts.has(name)) {
215
+ contracts.set(name, contract);
216
+ }
217
+ }
218
+ return contracts;
219
+ }
220
+ export function parseInterfaceContracts(text, file = '<register-care-interface>') {
221
+ const comments = [];
222
+ const lines = text.split(/\r?\n/u);
223
+ for (const [index, line] of lines.entries()) {
224
+ const trimmed = line.trim();
225
+ if (trimmed.length === 0)
226
+ continue;
227
+ if (trimmed.startsWith(';')) {
228
+ throw new Error(`${file}:${index + 1}: .asmi files do not permit comments`);
229
+ }
230
+ const comment = parseInterfaceContractLine(line);
231
+ if (comment === undefined) {
232
+ throw new Error(`${file}:${index + 1}: invalid register-care interface line \"${trimmed}\"`);
233
+ }
234
+ comments.push({ file, line: index + 1, comment });
235
+ }
236
+ const routines = buildRoutineContracts(comments);
237
+ const out = new Map();
238
+ for (const [name, contract] of routines) {
239
+ if (hasContractContent(contract))
240
+ out.set(name, contract);
241
+ }
242
+ return out;
243
+ }
@@ -0,0 +1,12 @@
1
+ import type { Diagnostic } from '../model/diagnostic.js';
2
+ import type { AnalyzeRegisterCareOptions, RegisterCareDirectCall, RegisterCareRoutine, RoutineContract, RoutineSummary, RegisterCareUnit, RegisterCareOutputCandidate } from './types.js';
3
+ export declare function buildProfileSummaries(profileName: AnalyzeRegisterCareOptions['registerCareProfile']): RoutineSummary[];
4
+ export declare function buildProfileSummaryLookup(profileName: AnalyzeRegisterCareOptions['registerCareProfile']): Map<string, RoutineSummary>;
5
+ export declare function routineNames(routines: readonly RegisterCareRoutine[]): string[];
6
+ export declare function buildSummaries(routines: readonly RegisterCareRoutine[], contractMap: Map<string, RoutineContract>): RoutineSummary[];
7
+ export declare function buildSummaryByName(routines: readonly RegisterCareRoutine[], summaries: readonly RoutineSummary[], profileSummaries?: readonly RoutineSummary[]): Map<string, RoutineSummary>;
8
+ export declare function withAcceptedOutputs(summaries: readonly RoutineSummary[], acceptedOutputCandidates: ReadonlyMap<string, RegisterCareUnit[]> | undefined): RoutineSummary[];
9
+ export declare function unknownBoundaryDiagnostics(directCalls: readonly RegisterCareDirectCall[], knownRoutines: ReadonlySet<string>): Diagnostic[];
10
+ export declare function unknownCallList(directCalls: readonly RegisterCareDirectCall[], knownRoutines: ReadonlySet<string>): string[];
11
+ export declare function buildOutputCandidateFixability(routines: readonly RegisterCareRoutine[], outputCandidates: readonly RegisterCareOutputCandidate[], autoFixableCandidateKeys: (routines: RegisterCareRoutine[], outputCandidates: RegisterCareOutputCandidate[]) => ReadonlySet<string>): ReadonlyMap<string, boolean>;
12
+ export declare function outputCandidateKey(file: string, line: number, column: number): string;
@@ -0,0 +1,154 @@
1
+ import { getRegisterCareProfile } from './profiles.js';
2
+ import { getZ80InstructionEffect } from '../z80/effects.js';
3
+ function unique(values) {
4
+ const out = [];
5
+ for (const value of values) {
6
+ if (!out.includes(value))
7
+ out.push(value);
8
+ }
9
+ return out;
10
+ }
11
+ function inferRoutineSummary(routine) {
12
+ const reads = new Set();
13
+ const writes = new Set();
14
+ for (const instruction of routine.instructions) {
15
+ const effect = getZ80InstructionEffect(instruction.instruction);
16
+ for (const unit of effect.reads)
17
+ reads.add(unit);
18
+ for (const unit of effect.writes)
19
+ writes.add(unit);
20
+ }
21
+ return {
22
+ name: routine.name,
23
+ mayRead: Array.from(reads),
24
+ mayWrite: Array.from(writes),
25
+ preserved: [],
26
+ };
27
+ }
28
+ export function buildProfileSummaries(profileName) {
29
+ const profile = getRegisterCareProfile(profileName);
30
+ if (profile === undefined) {
31
+ return [];
32
+ }
33
+ return [...profile.rst.values(), ...profile.rstServices.values()];
34
+ }
35
+ export function buildProfileSummaryLookup(profileName) {
36
+ const profile = getRegisterCareProfile(profileName);
37
+ const out = new Map();
38
+ if (profile === undefined)
39
+ return out;
40
+ for (const summary of profile.rst.values()) {
41
+ out.set(summary.name, summary);
42
+ }
43
+ for (const summary of profile.rstServices.values()) {
44
+ out.set(summary.name, summary);
45
+ }
46
+ return out;
47
+ }
48
+ export function routineNames(routines) {
49
+ return routines.flatMap((routine) => routine.entryLabels.length > 0 ? routine.entryLabels : [routine.name]);
50
+ }
51
+ function entryContract(routine, contractMap) {
52
+ for (const label of routine.entryLabels.length > 0 ? routine.entryLabels : [routine.name]) {
53
+ const contract = contractMap.get(label);
54
+ if (contract !== undefined)
55
+ return contract;
56
+ }
57
+ return contractMap.get(routine.name);
58
+ }
59
+ export function buildSummaries(routines, contractMap) {
60
+ const out = [];
61
+ const written = new Set();
62
+ for (const routine of routines) {
63
+ const inferred = inferRoutineSummary(routine);
64
+ const contract = entryContract(routine, contractMap);
65
+ out.push({
66
+ name: routine.name,
67
+ mayRead: unique([...inferred.mayRead, ...(contract?.in ?? [])]),
68
+ mayWrite: unique([
69
+ ...inferred.mayWrite,
70
+ ...(contract?.out ?? []),
71
+ ...(contract?.clobbers ?? []),
72
+ ]),
73
+ preserved: unique([...inferred.preserved, ...(contract?.preserves ?? [])]),
74
+ });
75
+ written.add(routine.name);
76
+ for (const alias of routine.entryLabels)
77
+ written.add(alias);
78
+ }
79
+ for (const [name, contract] of contractMap) {
80
+ if (written.has(name))
81
+ continue;
82
+ out.push({
83
+ name,
84
+ mayRead: [...contract.in],
85
+ mayWrite: [...contract.out, ...contract.clobbers],
86
+ preserved: [...contract.preserves],
87
+ });
88
+ written.add(name);
89
+ }
90
+ return out;
91
+ }
92
+ export function buildSummaryByName(routines, summaries, profileSummaries = []) {
93
+ const out = new Map();
94
+ const byRoutine = new Map();
95
+ for (const summary of summaries) {
96
+ byRoutine.set(summary.name, summary);
97
+ out.set(summary.name, summary);
98
+ }
99
+ for (const summary of profileSummaries) {
100
+ out.set(summary.name, summary);
101
+ }
102
+ for (const routine of routines) {
103
+ const routineSummary = byRoutine.get(routine.name);
104
+ if (routineSummary === undefined)
105
+ continue;
106
+ for (const alias of routine.entryLabels.length > 0 ? routine.entryLabels : [routine.name]) {
107
+ out.set(alias, routineSummary);
108
+ }
109
+ }
110
+ return out;
111
+ }
112
+ export function withAcceptedOutputs(summaries, acceptedOutputCandidates) {
113
+ if (!acceptedOutputCandidates || acceptedOutputCandidates.size === 0) {
114
+ return [...summaries];
115
+ }
116
+ return summaries.map((summary) => {
117
+ const accepted = acceptedOutputCandidates.get(summary.name);
118
+ if (!accepted || accepted.length === 0) {
119
+ return summary;
120
+ }
121
+ const merged = unique([...summary.mayWrite, ...accepted]);
122
+ return {
123
+ ...summary,
124
+ mayWrite: merged,
125
+ mayOutput: unique([...accepted]),
126
+ };
127
+ });
128
+ }
129
+ export function unknownBoundaryDiagnostics(directCalls, knownRoutines) {
130
+ return directCalls
131
+ .filter((call) => !knownRoutines.has(call.target))
132
+ .map((call) => ({
133
+ severity: 'warning',
134
+ code: 'AZMN_REGISTER_CARE',
135
+ message: `Register-care cannot prove ${call.target}; add a routine body or .asmi extern contract.`,
136
+ sourceName: call.file,
137
+ line: call.line,
138
+ column: call.column,
139
+ }));
140
+ }
141
+ export function unknownCallList(directCalls, knownRoutines) {
142
+ return unique(directCalls.filter((call) => !knownRoutines.has(call.target)).map((call) => call.target)).sort();
143
+ }
144
+ export function buildOutputCandidateFixability(routines, outputCandidates, autoFixableCandidateKeys) {
145
+ const autoFixable = autoFixableCandidateKeys([...routines], [...outputCandidates]);
146
+ const out = new Map();
147
+ for (const candidate of outputCandidates) {
148
+ out.set(outputCandidateKey(candidate.file, candidate.line, candidate.column), autoFixable.has(outputCandidateKey(candidate.file, candidate.line, candidate.column)));
149
+ }
150
+ return out;
151
+ }
152
+ export function outputCandidateKey(file, line, column) {
153
+ return `${file}:${line}:${column}`;
154
+ }
@@ -1,7 +1,6 @@
1
- import type { Diagnostic } from '../diagnosticTypes.js';
2
- import type { LoadedProgram } from '../sourceLoader.js';
3
- import { type AnalyzeRegisterCareOptions } from './analyze.js';
4
- import type { RegisterCareOutputCandidate, RegisterCareUnit } from './types.js';
1
+ import type { Diagnostic } from '../model/diagnostic.js';
2
+ import type { LoadedProgram } from '../tooling/api.js';
3
+ import type { AnalyzeRegisterCareOptions, RegisterCareOutputCandidate, RegisterCareUnit } from './types.js';
5
4
  export interface RegisterCareTextEdit {
6
5
  file: string;
7
6
  line: number;
@@ -23,11 +22,13 @@ export interface RegisterCareCandidateDiagnostic {
23
22
  carriers: RegisterCareUnit[];
24
23
  autoFixable: boolean;
25
24
  message: string;
26
- codeAction: RegisterCareCodeAction;
25
+ codeAction?: RegisterCareCodeAction;
27
26
  }
28
- export interface AnalyzeRegisterCareForToolsOptions extends Omit<AnalyzeRegisterCareOptions, 'emitReport' | 'emitInterface' | 'emitAnnotations'> {
27
+ export interface AnalyzeRegisterCareForToolsOptions extends Omit<AnalyzeRegisterCareOptions, 'emitReport' | 'emitInterface' | 'emitAnnotations' | 'fixRegisterContracts'> {
29
28
  emitReport?: boolean;
30
29
  emitInterface?: boolean;
30
+ /** Back-compat alias for registerCareProfile used by some tooling integrations. */
31
+ profile?: AnalyzeRegisterCareOptions['registerCareProfile'];
31
32
  }
32
33
  export interface AnalyzeRegisterCareForToolsResult {
33
34
  diagnostics: Diagnostic[];