@jhlagado/azm 0.1.0 → 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 (412) hide show
  1. package/README.md +9 -1
  2. package/dist/{src → legacy-root-azm/src}/compile.js +12 -1
  3. package/dist/{src → legacy-root-azm/src}/formats/index.d.ts +1 -1
  4. package/dist/{src → legacy-root-azm/src}/formats/index.js +1 -1
  5. package/dist/{src → legacy-root-azm/src}/formats/types.d.ts +82 -7
  6. package/dist/{src → legacy-root-azm/src}/formats/writeD8m.js +17 -11
  7. package/dist/{src → legacy-root-azm/src}/formats/writeHex.d.ts +0 -1
  8. package/dist/{src → legacy-root-azm/src}/formats/writeHex.js +0 -1
  9. package/dist/legacy-root-azm/src/packageInfo.d.ts +1 -0
  10. package/dist/legacy-root-azm/src/packageInfo.js +15 -0
  11. package/dist/{src → legacy-root-azm/src}/pipeline.d.ts +18 -5
  12. package/dist/legacy-root-azm/src/z80/effects.d.ts +3 -0
  13. package/dist/legacy-root-azm/src/z80/effects.js +516 -0
  14. package/dist/legacy-root-azm/src/z80/encode.d.ts +10 -0
  15. package/dist/legacy-root-azm/src/z80/encode.js +412 -0
  16. package/dist/src/api-compile.d.ts +49 -8
  17. package/dist/src/api-compile.js +313 -3
  18. package/dist/src/api-tooling.d.ts +7 -25
  19. package/dist/src/api-tooling.js +3 -21
  20. package/dist/src/assembly/address-planning.d.ts +19 -0
  21. package/dist/src/assembly/address-planning.js +266 -0
  22. package/dist/src/assembly/assemble-program.d.ts +13 -0
  23. package/dist/src/assembly/assemble-program.js +34 -0
  24. package/dist/src/assembly/fixup-emission.d.ts +10 -0
  25. package/dist/src/assembly/fixup-emission.js +247 -0
  26. package/dist/src/assembly/placement.d.ts +26 -0
  27. package/dist/src/assembly/placement.js +79 -0
  28. package/dist/src/assembly/program-emission.d.ts +13 -0
  29. package/dist/src/assembly/program-emission.js +267 -0
  30. package/dist/src/cli/parse-args.d.ts +29 -0
  31. package/dist/src/cli/parse-args.js +372 -0
  32. package/dist/src/cli/run.d.ts +2 -0
  33. package/dist/src/cli/run.js +35 -0
  34. package/dist/src/cli/write-artifacts.d.ts +21 -0
  35. package/dist/src/cli/write-artifacts.js +175 -0
  36. package/dist/src/cli.d.ts +1 -29
  37. package/dist/src/cli.js +20 -508
  38. package/dist/src/core/compile-artifacts.d.ts +26 -0
  39. package/dist/src/core/compile-artifacts.js +17 -0
  40. package/dist/src/core/compile.d.ts +26 -0
  41. package/dist/src/core/compile.js +164 -0
  42. package/dist/src/diagnostics/format.d.ts +4 -0
  43. package/dist/src/diagnostics/format.js +9 -0
  44. package/dist/src/expansion/op-expansion.d.ts +96 -0
  45. package/dist/src/expansion/op-expansion.js +912 -0
  46. package/dist/src/index.d.ts +14 -3
  47. package/dist/src/index.js +7 -2
  48. package/dist/src/model/diagnostic.d.ts +50 -0
  49. package/dist/src/model/diagnostic.js +29 -0
  50. package/dist/src/model/expression.d.ts +51 -0
  51. package/dist/src/model/expression.js +1 -0
  52. package/dist/src/model/fixup.d.ts +18 -0
  53. package/dist/src/model/fixup.js +1 -0
  54. package/dist/src/model/source-item.d.ts +81 -0
  55. package/dist/src/model/source-item.js +1 -0
  56. package/dist/src/model/symbol.d.ts +1 -0
  57. package/dist/src/model/symbol.js +1 -0
  58. package/dist/src/node/source-host.d.ts +19 -0
  59. package/dist/src/node/source-host.js +146 -0
  60. package/dist/src/outputs/hex.d.ts +1 -0
  61. package/dist/src/outputs/hex.js +75 -0
  62. package/dist/src/outputs/index.d.ts +3 -0
  63. package/dist/src/outputs/index.js +13 -0
  64. package/dist/src/outputs/range.d.ts +3 -0
  65. package/dist/src/outputs/range.js +31 -0
  66. package/dist/src/outputs/types.d.ts +182 -0
  67. package/dist/src/outputs/types.js +1 -0
  68. package/dist/src/outputs/write-asm80.d.ts +7 -0
  69. package/dist/src/outputs/write-asm80.js +549 -0
  70. package/dist/src/outputs/write-bin.d.ts +2 -0
  71. package/dist/src/outputs/write-bin.js +27 -0
  72. package/dist/src/outputs/write-d8.d.ts +2 -0
  73. package/dist/src/outputs/write-d8.js +257 -0
  74. package/dist/src/outputs/write-hex.d.ts +2 -0
  75. package/dist/src/outputs/write-hex.js +53 -0
  76. package/dist/src/outputs/write-listing.d.ts +2 -0
  77. package/dist/src/outputs/write-listing.js +79 -0
  78. package/dist/src/register-care/accept-output.d.ts +2 -0
  79. package/dist/src/register-care/accept-output.js +35 -0
  80. package/dist/src/register-care/analyze.d.ts +26 -0
  81. package/dist/src/register-care/analyze.js +87 -0
  82. package/dist/src/register-care/annotations.d.ts +8 -0
  83. package/dist/src/register-care/annotations.js +154 -0
  84. package/dist/src/register-care/boundaryHints.d.ts +2 -0
  85. package/dist/src/register-care/boundaryHints.js +11 -0
  86. package/dist/src/register-care/carriers.d.ts +2 -0
  87. package/dist/src/register-care/carriers.js +78 -0
  88. package/dist/src/register-care/controlFlow.d.ts +5 -0
  89. package/dist/src/register-care/controlFlow.js +38 -0
  90. package/dist/src/register-care/fix.d.ts +9 -0
  91. package/dist/src/register-care/fix.js +78 -0
  92. package/dist/src/register-care/liveness.d.ts +3 -0
  93. package/dist/src/register-care/liveness.js +189 -0
  94. package/dist/src/register-care/profiles.d.ts +9 -0
  95. package/dist/src/register-care/profiles.js +43 -0
  96. package/dist/src/register-care/programModel.d.ts +3 -0
  97. package/dist/src/register-care/programModel.js +122 -0
  98. package/dist/src/register-care/report.d.ts +4 -0
  99. package/dist/src/register-care/report.js +82 -0
  100. package/dist/src/register-care/smartComments.d.ts +5 -0
  101. package/dist/src/register-care/smartComments.js +243 -0
  102. package/dist/src/register-care/summaries.d.ts +12 -0
  103. package/dist/src/register-care/summaries.js +154 -0
  104. package/dist/src/{registerCare → register-care}/tooling.d.ts +7 -6
  105. package/dist/src/{registerCare → register-care}/tooling.js +17 -6
  106. package/dist/src/register-care/types.d.ts +165 -0
  107. package/dist/src/register-care/types.js +1 -0
  108. package/dist/src/semantics/expression-evaluation.d.ts +29 -0
  109. package/dist/src/semantics/expression-evaluation.js +409 -0
  110. package/dist/src/source/logical-lines.d.ts +7 -0
  111. package/dist/src/source/logical-lines.js +11 -0
  112. package/dist/src/source/source-file.d.ts +5 -0
  113. package/dist/src/source/source-file.js +3 -0
  114. package/dist/src/source/source-span.d.ts +5 -0
  115. package/dist/src/source/source-span.js +1 -0
  116. package/dist/src/source/strip-line-comment.d.ts +4 -0
  117. package/dist/src/source/strip-line-comment.js +27 -0
  118. package/dist/src/syntax/directive-aliases.d.ts +10 -0
  119. package/dist/src/syntax/directive-aliases.js +199 -0
  120. package/dist/src/syntax/parse-expression.d.ts +3 -0
  121. package/dist/src/syntax/parse-expression.js +551 -0
  122. package/dist/src/syntax/parse-line.d.ts +12 -0
  123. package/dist/src/syntax/parse-line.js +329 -0
  124. package/dist/src/tooling/api.d.ts +42 -0
  125. package/dist/src/tooling/api.js +42 -0
  126. package/dist/src/tooling/case-style.d.ts +8 -0
  127. package/dist/src/tooling/case-style.js +163 -0
  128. package/dist/src/z80/effects.d.ts +3 -3
  129. package/dist/src/z80/effects.js +349 -302
  130. package/dist/src/z80/encode.d.ts +2 -10
  131. package/dist/src/z80/encode.js +951 -374
  132. package/dist/src/z80/instruction.d.ts +226 -0
  133. package/dist/src/z80/instruction.js +1 -0
  134. package/dist/src/z80/parse-instruction.d.ts +7 -0
  135. package/dist/src/z80/parse-instruction.js +1068 -0
  136. package/docs/reference/cli.md +15 -0
  137. package/docs/reference/tooling-api.md +67 -3
  138. package/package.json +20 -3
  139. /package/dist/{src → legacy-root-azm/src}/analysis.d.ts +0 -0
  140. /package/dist/{src → legacy-root-azm/src}/analysis.js +0 -0
  141. /package/dist/{src → legacy-root-azm/src}/compile.d.ts +0 -0
  142. /package/dist/{src → legacy-root-azm/src}/compileShared.d.ts +0 -0
  143. /package/dist/{src → legacy-root-azm/src}/compileShared.js +0 -0
  144. /package/dist/{src → legacy-root-azm/src}/diagnosticTypes.d.ts +0 -0
  145. /package/dist/{src → legacy-root-azm/src}/diagnosticTypes.js +0 -0
  146. /package/dist/{src → legacy-root-azm/src}/formats/range.d.ts +0 -0
  147. /package/dist/{src → legacy-root-azm/src}/formats/range.js +0 -0
  148. /package/dist/{src → legacy-root-azm/src}/formats/types.js +0 -0
  149. /package/dist/{src → legacy-root-azm/src}/formats/writeAsm80.d.ts +0 -0
  150. /package/dist/{src → legacy-root-azm/src}/formats/writeAsm80.js +0 -0
  151. /package/dist/{src → legacy-root-azm/src}/formats/writeBin.d.ts +0 -0
  152. /package/dist/{src → legacy-root-azm/src}/formats/writeBin.js +0 -0
  153. /package/dist/{src → legacy-root-azm/src}/formats/writeD8m.d.ts +0 -0
  154. /package/dist/{src → legacy-root-azm/src}/formats/writeListing.d.ts +0 -0
  155. /package/dist/{src → legacy-root-azm/src}/formats/writeListing.js +0 -0
  156. /package/dist/{src → legacy-root-azm/src}/frontend/asm80/asmLine.d.ts +0 -0
  157. /package/dist/{src → legacy-root-azm/src}/frontend/asm80/asmLine.js +0 -0
  158. /package/dist/{src → legacy-root-azm/src}/frontend/asm80/parseAsmRawValues.d.ts +0 -0
  159. /package/dist/{src → legacy-root-azm/src}/frontend/asm80/parseAsmRawValues.js +0 -0
  160. /package/dist/{src → legacy-root-azm/src}/frontend/asm80/quoteScan.d.ts +0 -0
  161. /package/dist/{src → legacy-root-azm/src}/frontend/asm80/quoteScan.js +0 -0
  162. /package/dist/{src → legacy-root-azm/src}/frontend/ast.d.ts +0 -0
  163. /package/dist/{src → legacy-root-azm/src}/frontend/ast.js +0 -0
  164. /package/dist/{src → legacy-root-azm/src}/frontend/directiveAliases.d.ts +0 -0
  165. /package/dist/{src → legacy-root-azm/src}/frontend/directiveAliases.js +0 -0
  166. /package/dist/{src → legacy-root-azm/src}/frontend/grammarData.d.ts +0 -0
  167. /package/dist/{src → legacy-root-azm/src}/frontend/grammarData.js +0 -0
  168. /package/dist/{src → legacy-root-azm/src}/frontend/immExprUtils.d.ts +0 -0
  169. /package/dist/{src → legacy-root-azm/src}/frontend/immExprUtils.js +0 -0
  170. /package/dist/{src → legacy-root-azm/src}/frontend/parseAsmFlatDirectiveLine.d.ts +0 -0
  171. /package/dist/{src → legacy-root-azm/src}/frontend/parseAsmFlatDirectiveLine.js +0 -0
  172. /package/dist/{src → legacy-root-azm/src}/frontend/parseAsmInstruction.d.ts +0 -0
  173. /package/dist/{src → legacy-root-azm/src}/frontend/parseAsmInstruction.js +0 -0
  174. /package/dist/{src → legacy-root-azm/src}/frontend/parseAsmStatements.d.ts +0 -0
  175. /package/dist/{src → legacy-root-azm/src}/frontend/parseAsmStatements.js +0 -0
  176. /package/dist/{src → legacy-root-azm/src}/frontend/parseAsmStream.d.ts +0 -0
  177. /package/dist/{src → legacy-root-azm/src}/frontend/parseAsmStream.js +0 -0
  178. /package/dist/{src → legacy-root-azm/src}/frontend/parseAsmTopLevel.d.ts +0 -0
  179. /package/dist/{src → legacy-root-azm/src}/frontend/parseAsmTopLevel.js +0 -0
  180. /package/dist/{src → legacy-root-azm/src}/frontend/parseDiagnostics.d.ts +0 -0
  181. /package/dist/{src → legacy-root-azm/src}/frontend/parseDiagnostics.js +0 -0
  182. /package/dist/{src → legacy-root-azm/src}/frontend/parseEnum.d.ts +0 -0
  183. /package/dist/{src → legacy-root-azm/src}/frontend/parseEnum.js +0 -0
  184. /package/dist/{src → legacy-root-azm/src}/frontend/parseImm.d.ts +0 -0
  185. /package/dist/{src → legacy-root-azm/src}/frontend/parseImm.js +0 -0
  186. /package/dist/{src → legacy-root-azm/src}/frontend/parseLogicalLines.d.ts +0 -0
  187. /package/dist/{src → legacy-root-azm/src}/frontend/parseLogicalLines.js +0 -0
  188. /package/dist/{src → legacy-root-azm/src}/frontend/parseOp.d.ts +0 -0
  189. /package/dist/{src → legacy-root-azm/src}/frontend/parseOp.js +0 -0
  190. /package/dist/{src → legacy-root-azm/src}/frontend/parseOpHeader.d.ts +0 -0
  191. /package/dist/{src → legacy-root-azm/src}/frontend/parseOpHeader.js +0 -0
  192. /package/dist/{src → legacy-root-azm/src}/frontend/parseOperands.d.ts +0 -0
  193. /package/dist/{src → legacy-root-azm/src}/frontend/parseOperands.js +0 -0
  194. /package/dist/{src → legacy-root-azm/src}/frontend/parseParams.d.ts +0 -0
  195. /package/dist/{src → legacy-root-azm/src}/frontend/parseParams.js +0 -0
  196. /package/dist/{src → legacy-root-azm/src}/frontend/parseParserRecovery.d.ts +0 -0
  197. /package/dist/{src → legacy-root-azm/src}/frontend/parseParserRecovery.js +0 -0
  198. /package/dist/{src → legacy-root-azm/src}/frontend/parseParserShared.d.ts +0 -0
  199. /package/dist/{src → legacy-root-azm/src}/frontend/parseParserShared.js +0 -0
  200. /package/dist/{src → legacy-root-azm/src}/frontend/parseRawDataDirectiveStart.d.ts +0 -0
  201. /package/dist/{src → legacy-root-azm/src}/frontend/parseRawDataDirectiveStart.js +0 -0
  202. /package/dist/{src → legacy-root-azm/src}/frontend/parseRawDataDirectives.d.ts +0 -0
  203. /package/dist/{src → legacy-root-azm/src}/frontend/parseRawDataDirectives.js +0 -0
  204. /package/dist/{src → legacy-root-azm/src}/frontend/parseRecordFieldDecl.d.ts +0 -0
  205. /package/dist/{src → legacy-root-azm/src}/frontend/parseRecordFieldDecl.js +0 -0
  206. /package/dist/{src → legacy-root-azm/src}/frontend/parseSourceItemDispatch.d.ts +0 -0
  207. /package/dist/{src → legacy-root-azm/src}/frontend/parseSourceItemDispatch.js +0 -0
  208. /package/dist/{src → legacy-root-azm/src}/frontend/parseSourceItemTable.d.ts +0 -0
  209. /package/dist/{src → legacy-root-azm/src}/frontend/parseSourceItemTable.js +0 -0
  210. /package/dist/{src → legacy-root-azm/src}/frontend/parseTopLevelCommon.d.ts +0 -0
  211. /package/dist/{src → legacy-root-azm/src}/frontend/parseTopLevelCommon.js +0 -0
  212. /package/dist/{src → legacy-root-azm/src}/frontend/parseTypes.d.ts +0 -0
  213. /package/dist/{src → legacy-root-azm/src}/frontend/parseTypes.js +0 -0
  214. /package/dist/{src → legacy-root-azm/src}/frontend/parser.d.ts +0 -0
  215. /package/dist/{src → legacy-root-azm/src}/frontend/parser.js +0 -0
  216. /package/dist/{src → legacy-root-azm/src}/frontend/source.d.ts +0 -0
  217. /package/dist/{src → legacy-root-azm/src}/frontend/source.js +0 -0
  218. /package/dist/{src → legacy-root-azm/src}/frontend/sourceExtensions.d.ts +0 -0
  219. /package/dist/{src → legacy-root-azm/src}/frontend/sourceExtensions.js +0 -0
  220. /package/dist/{src → legacy-root-azm/src}/lintCaseStyle.d.ts +0 -0
  221. /package/dist/{src → legacy-root-azm/src}/lintCaseStyle.js +0 -0
  222. /package/dist/{src → legacy-root-azm/src}/lowering/asmDirectiveLowering.d.ts +0 -0
  223. /package/dist/{src → legacy-root-azm/src}/lowering/asmDirectiveLowering.js +0 -0
  224. /package/dist/{src → legacy-root-azm/src}/lowering/asmDirectiveTraversal.d.ts +0 -0
  225. /package/dist/{src → legacy-root-azm/src}/lowering/asmDirectiveTraversal.js +0 -0
  226. /package/dist/{src → legacy-root-azm/src}/lowering/asmEquResolution.d.ts +0 -0
  227. /package/dist/{src → legacy-root-azm/src}/lowering/asmEquResolution.js +0 -0
  228. /package/dist/{src → legacy-root-azm/src}/lowering/asmInstructionLdHelpers.d.ts +0 -0
  229. /package/dist/{src → legacy-root-azm/src}/lowering/asmInstructionLdHelpers.js +0 -0
  230. /package/dist/{src → legacy-root-azm/src}/lowering/asmInstructionLowering.d.ts +0 -0
  231. /package/dist/{src → legacy-root-azm/src}/lowering/asmInstructionLowering.js +0 -0
  232. /package/dist/{src → legacy-root-azm/src}/lowering/asmInstructionStream.d.ts +0 -0
  233. /package/dist/{src → legacy-root-azm/src}/lowering/asmInstructionStream.js +0 -0
  234. /package/dist/{src → legacy-root-azm/src}/lowering/asmLoweringBranchCall.d.ts +0 -0
  235. /package/dist/{src → legacy-root-azm/src}/lowering/asmLoweringBranchCall.js +0 -0
  236. /package/dist/{src → legacy-root-azm/src}/lowering/asmLoweringHost.d.ts +0 -0
  237. /package/dist/{src → legacy-root-azm/src}/lowering/asmLoweringHost.js +0 -0
  238. /package/dist/{src → legacy-root-azm/src}/lowering/asmLoweringLd.d.ts +0 -0
  239. /package/dist/{src → legacy-root-azm/src}/lowering/asmLoweringLd.js +0 -0
  240. /package/dist/{src → legacy-root-azm/src}/lowering/asmRangeLowering.d.ts +0 -0
  241. /package/dist/{src → legacy-root-azm/src}/lowering/asmRangeLowering.js +0 -0
  242. /package/dist/{src → legacy-root-azm/src}/lowering/asmRawDataLowering.d.ts +0 -0
  243. /package/dist/{src → legacy-root-azm/src}/lowering/asmRawDataLowering.js +0 -0
  244. /package/dist/{src → legacy-root-azm/src}/lowering/asmSourceEmitter.d.ts +0 -0
  245. /package/dist/{src → legacy-root-azm/src}/lowering/asmSourceEmitter.js +0 -0
  246. /package/dist/{src → legacy-root-azm/src}/lowering/asmSourceInstructionLowering.d.ts +0 -0
  247. /package/dist/{src → legacy-root-azm/src}/lowering/asmSourceInstructionLowering.js +0 -0
  248. /package/dist/{src → legacy-root-azm/src}/lowering/asmUtils.d.ts +0 -0
  249. /package/dist/{src → legacy-root-azm/src}/lowering/asmUtils.js +0 -0
  250. /package/dist/{src → legacy-root-azm/src}/lowering/assemblerFlowSetup.d.ts +0 -0
  251. /package/dist/{src → legacy-root-azm/src}/lowering/assemblerFlowSetup.js +0 -0
  252. /package/dist/{src → legacy-root-azm/src}/lowering/assemblerLoweringContext.d.ts +0 -0
  253. /package/dist/{src → legacy-root-azm/src}/lowering/assemblerLoweringContext.js +0 -0
  254. /package/dist/{src → legacy-root-azm/src}/lowering/assemblerLoweringContextSplit.d.ts +0 -0
  255. /package/dist/{src → legacy-root-azm/src}/lowering/assemblerLoweringContextSplit.js +0 -0
  256. /package/dist/{src → legacy-root-azm/src}/lowering/assemblerLoweringPhases.d.ts +0 -0
  257. /package/dist/{src → legacy-root-azm/src}/lowering/assemblerLoweringPhases.js +0 -0
  258. /package/dist/{src → legacy-root-azm/src}/lowering/bytePlacement.d.ts +0 -0
  259. /package/dist/{src → legacy-root-azm/src}/lowering/bytePlacement.js +0 -0
  260. /package/dist/{src → legacy-root-azm/src}/lowering/capabilities.d.ts +0 -0
  261. /package/dist/{src → legacy-root-azm/src}/lowering/capabilities.js +0 -0
  262. /package/dist/{src → legacy-root-azm/src}/lowering/eaResolution.d.ts +0 -0
  263. /package/dist/{src → legacy-root-azm/src}/lowering/eaResolution.js +0 -0
  264. /package/dist/{src → legacy-root-azm/src}/lowering/emissionCore.d.ts +0 -0
  265. /package/dist/{src → legacy-root-azm/src}/lowering/emissionCore.js +0 -0
  266. /package/dist/{src → legacy-root-azm/src}/lowering/emit.d.ts +0 -0
  267. /package/dist/{src → legacy-root-azm/src}/lowering/emit.js +0 -0
  268. /package/dist/{src → legacy-root-azm/src}/lowering/emitContextBuilder.d.ts +0 -0
  269. /package/dist/{src → legacy-root-azm/src}/lowering/emitContextBuilder.js +0 -0
  270. /package/dist/{src → legacy-root-azm/src}/lowering/emitFinalization.d.ts +0 -0
  271. /package/dist/{src → legacy-root-azm/src}/lowering/emitFinalization.js +0 -0
  272. /package/dist/{src → legacy-root-azm/src}/lowering/emitFinalizationSetup.d.ts +0 -0
  273. /package/dist/{src → legacy-root-azm/src}/lowering/emitFinalizationSetup.js +0 -0
  274. /package/dist/{src → legacy-root-azm/src}/lowering/emitPhase1BuildProgramLoweringContext.d.ts +0 -0
  275. /package/dist/{src → legacy-root-azm/src}/lowering/emitPhase1BuildProgramLoweringContext.js +0 -0
  276. /package/dist/{src → legacy-root-azm/src}/lowering/emitPhase1Helpers.d.ts +0 -0
  277. /package/dist/{src → legacy-root-azm/src}/lowering/emitPhase1Helpers.js +0 -0
  278. /package/dist/{src → legacy-root-azm/src}/lowering/emitPhase1Types.d.ts +0 -0
  279. /package/dist/{src → legacy-root-azm/src}/lowering/emitPhase1Types.js +0 -0
  280. /package/dist/{src → legacy-root-azm/src}/lowering/emitPhase1WirePipeline.d.ts +0 -0
  281. /package/dist/{src → legacy-root-azm/src}/lowering/emitPhase1WirePipeline.js +0 -0
  282. /package/dist/{src → legacy-root-azm/src}/lowering/emitPhase1Workspace.d.ts +0 -0
  283. /package/dist/{src → legacy-root-azm/src}/lowering/emitPhase1Workspace.js +0 -0
  284. /package/dist/{src → legacy-root-azm/src}/lowering/emitPipeline.d.ts +0 -0
  285. /package/dist/{src → legacy-root-azm/src}/lowering/emitPipeline.js +0 -0
  286. /package/dist/{src → legacy-root-azm/src}/lowering/emitProgramContext.d.ts +0 -0
  287. /package/dist/{src → legacy-root-azm/src}/lowering/emitProgramContext.js +0 -0
  288. /package/dist/{src → legacy-root-azm/src}/lowering/emitState.d.ts +0 -0
  289. /package/dist/{src → legacy-root-azm/src}/lowering/emitState.js +0 -0
  290. /package/dist/{src → legacy-root-azm/src}/lowering/fixupBaseResolution.d.ts +0 -0
  291. /package/dist/{src → legacy-root-azm/src}/lowering/fixupBaseResolution.js +0 -0
  292. /package/dist/{src → legacy-root-azm/src}/lowering/fixupEmission.d.ts +0 -0
  293. /package/dist/{src → legacy-root-azm/src}/lowering/fixupEmission.js +0 -0
  294. /package/dist/{src → legacy-root-azm/src}/lowering/immMath.d.ts +0 -0
  295. /package/dist/{src → legacy-root-azm/src}/lowering/immMath.js +0 -0
  296. /package/dist/{src → legacy-root-azm/src}/lowering/inputAssets.d.ts +0 -0
  297. /package/dist/{src → legacy-root-azm/src}/lowering/inputAssets.js +0 -0
  298. /package/dist/{src → legacy-root-azm/src}/lowering/ldEncoding.d.ts +0 -0
  299. /package/dist/{src → legacy-root-azm/src}/lowering/ldEncoding.js +0 -0
  300. /package/dist/{src → legacy-root-azm/src}/lowering/ldEncodingRegMemHelpers.d.ts +0 -0
  301. /package/dist/{src → legacy-root-azm/src}/lowering/ldEncodingRegMemHelpers.js +0 -0
  302. /package/dist/{src → legacy-root-azm/src}/lowering/ldFormSelection.d.ts +0 -0
  303. /package/dist/{src → legacy-root-azm/src}/lowering/ldFormSelection.js +0 -0
  304. /package/dist/{src → legacy-root-azm/src}/lowering/ldLowering.d.ts +0 -0
  305. /package/dist/{src → legacy-root-azm/src}/lowering/ldLowering.js +0 -0
  306. /package/dist/{src → legacy-root-azm/src}/lowering/loweredAsmByteEmission.d.ts +0 -0
  307. /package/dist/{src → legacy-root-azm/src}/lowering/loweredAsmByteEmission.js +0 -0
  308. /package/dist/{src → legacy-root-azm/src}/lowering/loweredAsmPlacement.d.ts +0 -0
  309. /package/dist/{src → legacy-root-azm/src}/lowering/loweredAsmPlacement.js +0 -0
  310. /package/dist/{src → legacy-root-azm/src}/lowering/loweredAsmStreamRecording.d.ts +0 -0
  311. /package/dist/{src → legacy-root-azm/src}/lowering/loweredAsmStreamRecording.js +0 -0
  312. /package/dist/{src → legacy-root-azm/src}/lowering/loweredAsmTypes.d.ts +0 -0
  313. /package/dist/{src → legacy-root-azm/src}/lowering/loweredAsmTypes.js +0 -0
  314. /package/dist/{src → legacy-root-azm/src}/lowering/loweredFormat.d.ts +0 -0
  315. /package/dist/{src → legacy-root-azm/src}/lowering/loweredFormat.js +0 -0
  316. /package/dist/{src → legacy-root-azm/src}/lowering/loweredItemSize.d.ts +0 -0
  317. /package/dist/{src → legacy-root-azm/src}/lowering/loweredItemSize.js +0 -0
  318. /package/dist/{src → legacy-root-azm/src}/lowering/loweringDiagnostics.d.ts +0 -0
  319. /package/dist/{src → legacy-root-azm/src}/lowering/loweringDiagnostics.js +0 -0
  320. /package/dist/{src → legacy-root-azm/src}/lowering/loweringTypes.d.ts +0 -0
  321. /package/dist/{src → legacy-root-azm/src}/lowering/loweringTypes.js +0 -0
  322. /package/dist/{src → legacy-root-azm/src}/lowering/opCandidateRegistry.d.ts +0 -0
  323. /package/dist/{src → legacy-root-azm/src}/lowering/opCandidateRegistry.js +0 -0
  324. /package/dist/{src → legacy-root-azm/src}/lowering/opExpansionExecution.d.ts +0 -0
  325. /package/dist/{src → legacy-root-azm/src}/lowering/opExpansionExecution.js +0 -0
  326. /package/dist/{src → legacy-root-azm/src}/lowering/opExpansionOrchestration.d.ts +0 -0
  327. /package/dist/{src → legacy-root-azm/src}/lowering/opExpansionOrchestration.js +0 -0
  328. /package/dist/{src → legacy-root-azm/src}/lowering/opExpansionStream.d.ts +0 -0
  329. /package/dist/{src → legacy-root-azm/src}/lowering/opExpansionStream.js +0 -0
  330. /package/dist/{src → legacy-root-azm/src}/lowering/opMatching.d.ts +0 -0
  331. /package/dist/{src → legacy-root-azm/src}/lowering/opMatching.js +0 -0
  332. /package/dist/{src → legacy-root-azm/src}/lowering/opSubstitution.d.ts +0 -0
  333. /package/dist/{src → legacy-root-azm/src}/lowering/opSubstitution.js +0 -0
  334. /package/dist/{src → legacy-root-azm/src}/lowering/prescanTypes.d.ts +0 -0
  335. /package/dist/{src → legacy-root-azm/src}/lowering/prescanTypes.js +0 -0
  336. /package/dist/{src → legacy-root-azm/src}/lowering/programLowering.d.ts +0 -0
  337. /package/dist/{src → legacy-root-azm/src}/lowering/programLowering.js +0 -0
  338. /package/dist/{src → legacy-root-azm/src}/lowering/programLoweringDeclarations.d.ts +0 -0
  339. /package/dist/{src → legacy-root-azm/src}/lowering/programLoweringDeclarations.js +0 -0
  340. /package/dist/{src → legacy-root-azm/src}/lowering/programLoweringFinalize.d.ts +0 -0
  341. /package/dist/{src → legacy-root-azm/src}/lowering/programLoweringFinalize.js +0 -0
  342. /package/dist/{src → legacy-root-azm/src}/lowering/programLoweringTraversal.d.ts +0 -0
  343. /package/dist/{src → legacy-root-azm/src}/lowering/programLoweringTraversal.js +0 -0
  344. /package/dist/{src → legacy-root-azm/src}/lowering/programPrescan.d.ts +0 -0
  345. /package/dist/{src → legacy-root-azm/src}/lowering/programPrescan.js +0 -0
  346. /package/dist/{src → legacy-root-azm/src}/lowering/traceFormat.d.ts +0 -0
  347. /package/dist/{src → legacy-root-azm/src}/lowering/traceFormat.js +0 -0
  348. /package/dist/{src → legacy-root-azm/src}/pathCompare.d.ts +0 -0
  349. /package/dist/{src → legacy-root-azm/src}/pathCompare.js +0 -0
  350. /package/dist/{src → legacy-root-azm/src}/pipeline.js +0 -0
  351. /package/dist/{src → legacy-root-azm/src}/registerCare/analyze.d.ts +0 -0
  352. /package/dist/{src → legacy-root-azm/src}/registerCare/analyze.js +0 -0
  353. /package/dist/{src → legacy-root-azm/src}/registerCare/annotate.d.ts +0 -0
  354. /package/dist/{src → legacy-root-azm/src}/registerCare/annotate.js +0 -0
  355. /package/dist/{src → legacy-root-azm/src}/registerCare/boundaryHints.d.ts +0 -0
  356. /package/dist/{src → legacy-root-azm/src}/registerCare/boundaryHints.js +0 -0
  357. /package/dist/{src → legacy-root-azm/src}/registerCare/carriers.d.ts +0 -0
  358. /package/dist/{src → legacy-root-azm/src}/registerCare/carriers.js +0 -0
  359. /package/dist/{src → legacy-root-azm/src}/registerCare/controlFlow.d.ts +0 -0
  360. /package/dist/{src → legacy-root-azm/src}/registerCare/controlFlow.js +0 -0
  361. /package/dist/{src → legacy-root-azm/src}/registerCare/fix.d.ts +0 -0
  362. /package/dist/{src → legacy-root-azm/src}/registerCare/fix.js +0 -0
  363. /package/dist/{src → legacy-root-azm/src}/registerCare/liveness.d.ts +0 -0
  364. /package/dist/{src → legacy-root-azm/src}/registerCare/liveness.js +0 -0
  365. /package/dist/{src → legacy-root-azm/src}/registerCare/profiles.d.ts +0 -0
  366. /package/dist/{src → legacy-root-azm/src}/registerCare/profiles.js +0 -0
  367. /package/dist/{src → legacy-root-azm/src}/registerCare/programModel.d.ts +0 -0
  368. /package/dist/{src → legacy-root-azm/src}/registerCare/programModel.js +0 -0
  369. /package/dist/{src → legacy-root-azm/src}/registerCare/report.d.ts +0 -0
  370. /package/dist/{src → legacy-root-azm/src}/registerCare/report.js +0 -0
  371. /package/dist/{src → legacy-root-azm/src}/registerCare/smartComments.d.ts +0 -0
  372. /package/dist/{src → legacy-root-azm/src}/registerCare/smartComments.js +0 -0
  373. /package/dist/{src → legacy-root-azm/src}/registerCare/sourceText.d.ts +0 -0
  374. /package/dist/{src → legacy-root-azm/src}/registerCare/sourceText.js +0 -0
  375. /package/dist/{src → legacy-root-azm/src}/registerCare/summary.d.ts +0 -0
  376. /package/dist/{src → legacy-root-azm/src}/registerCare/summary.js +0 -0
  377. /package/dist/{src → legacy-root-azm/src}/registerCare/types.d.ts +0 -0
  378. /package/dist/{src → legacy-root-azm/src}/registerCare/types.js +0 -0
  379. /package/dist/{src → legacy-root-azm/src}/semantics/declVisitor.d.ts +0 -0
  380. /package/dist/{src → legacy-root-azm/src}/semantics/declVisitor.js +0 -0
  381. /package/dist/{src → legacy-root-azm/src}/semantics/env.d.ts +0 -0
  382. /package/dist/{src → legacy-root-azm/src}/semantics/env.js +0 -0
  383. /package/dist/{src → legacy-root-azm/src}/semantics/layout.d.ts +0 -0
  384. /package/dist/{src → legacy-root-azm/src}/semantics/layout.js +0 -0
  385. /package/dist/{src → legacy-root-azm/src}/semantics/layoutCastFold.d.ts +0 -0
  386. /package/dist/{src → legacy-root-azm/src}/semantics/layoutCastFold.js +0 -0
  387. /package/dist/{src → legacy-root-azm/src}/semantics/semanticsDiagnostics.d.ts +0 -0
  388. /package/dist/{src → legacy-root-azm/src}/semantics/semanticsDiagnostics.js +0 -0
  389. /package/dist/{src → legacy-root-azm/src}/semantics/typeQueries.d.ts +0 -0
  390. /package/dist/{src → legacy-root-azm/src}/semantics/typeQueries.js +0 -0
  391. /package/dist/{src → legacy-root-azm/src}/sourceIncludeExpansion.d.ts +0 -0
  392. /package/dist/{src → legacy-root-azm/src}/sourceIncludeExpansion.js +0 -0
  393. /package/dist/{src → legacy-root-azm/src}/sourceIncludePaths.d.ts +0 -0
  394. /package/dist/{src → legacy-root-azm/src}/sourceIncludePaths.js +0 -0
  395. /package/dist/{src → legacy-root-azm/src}/sourceLoader.d.ts +0 -0
  396. /package/dist/{src → legacy-root-azm/src}/sourceLoader.js +0 -0
  397. /package/dist/{src → legacy-root-azm/src}/z80/encodeAlu.d.ts +0 -0
  398. /package/dist/{src → legacy-root-azm/src}/z80/encodeAlu.js +0 -0
  399. /package/dist/{src → legacy-root-azm/src}/z80/encodeBitOps.d.ts +0 -0
  400. /package/dist/{src → legacy-root-azm/src}/z80/encodeBitOps.js +0 -0
  401. /package/dist/{src → legacy-root-azm/src}/z80/encodeContext.d.ts +0 -0
  402. /package/dist/{src → legacy-root-azm/src}/z80/encodeContext.js +0 -0
  403. /package/dist/{src → legacy-root-azm/src}/z80/encodeControl.d.ts +0 -0
  404. /package/dist/{src → legacy-root-azm/src}/z80/encodeControl.js +0 -0
  405. /package/dist/{src → legacy-root-azm/src}/z80/encodeCoreOps.d.ts +0 -0
  406. /package/dist/{src → legacy-root-azm/src}/z80/encodeCoreOps.js +0 -0
  407. /package/dist/{src → legacy-root-azm/src}/z80/encodeIo.d.ts +0 -0
  408. /package/dist/{src → legacy-root-azm/src}/z80/encodeIo.js +0 -0
  409. /package/dist/{src → legacy-root-azm/src}/z80/encodeLd.d.ts +0 -0
  410. /package/dist/{src → legacy-root-azm/src}/z80/encodeLd.js +0 -0
  411. /package/dist/{src → legacy-root-azm/src}/z80/encoderRegistry.d.ts +0 -0
  412. /package/dist/{src → legacy-root-azm/src}/z80/encoderRegistry.js +0 -0
@@ -16,8 +16,8 @@ export function codeActionForOutputCandidate(candidate) {
16
16
  };
17
17
  }
18
18
  export function diagnosticForOutputCandidate(candidate) {
19
- const codeAction = codeActionForOutputCandidate(candidate);
20
- return {
19
+ const codeAction = candidate.autoFixable === true ? codeActionForOutputCandidate(candidate) : undefined;
20
+ const diagnostic = {
21
21
  kind: 'register-care-output-candidate',
22
22
  severity: 'info',
23
23
  file: candidate.file,
@@ -27,23 +27,34 @@ export function diagnosticForOutputCandidate(candidate) {
27
27
  carriers: candidate.carriers,
28
28
  autoFixable: candidate.autoFixable === true,
29
29
  message: candidate.message,
30
- codeAction,
31
30
  };
31
+ if (codeAction !== undefined) {
32
+ diagnostic.codeAction = codeAction;
33
+ }
34
+ return diagnostic;
32
35
  }
33
36
  export function analyzeRegisterCareForTools(loaded, options) {
34
- const result = analyzeRegisterCare(loaded, {
37
+ const profile = options.registerCareProfile ?? options.profile;
38
+ const baseResultOptions = {
35
39
  ...options,
36
40
  emitReport: options.emitReport === true,
37
41
  emitInterface: options.emitInterface === true,
38
42
  emitAnnotations: false,
39
- });
43
+ fixRegisterContracts: false,
44
+ };
45
+ const result = analyzeRegisterCare(loaded, profile === undefined
46
+ ? baseResultOptions
47
+ : { ...baseResultOptions, registerCareProfile: profile });
40
48
  const outputCandidates = result.outputCandidates ?? [];
41
49
  const candidateDiagnostics = outputCandidates.map(diagnosticForOutputCandidate);
50
+ const codeActions = outputCandidates
51
+ .filter((candidate) => candidate.autoFixable === true)
52
+ .map(codeActionForOutputCandidate);
42
53
  return {
43
54
  diagnostics: result.diagnostics,
44
55
  outputCandidates,
45
56
  candidateDiagnostics,
46
- codeActions: candidateDiagnostics.map((diagnostic) => diagnostic.codeAction),
57
+ codeActions,
47
58
  ...(result.reportText !== undefined ? { reportText: result.reportText } : {}),
48
59
  ...(result.interfaceText !== undefined ? { interfaceText: result.interfaceText } : {}),
49
60
  };
@@ -0,0 +1,165 @@
1
+ import type { Z80Instruction } from '../z80/instruction.js';
2
+ export type RegisterCareMode = 'off' | 'audit' | 'warn' | 'error' | 'strict';
3
+ export type RegisterCareUnit = 'A' | 'B' | 'C' | 'D' | 'E' | 'H' | 'L' | 'IXH' | 'IXL' | 'IYH' | 'IYL' | 'SPH' | 'SPL' | 'carry' | 'zero' | 'sign' | 'parity' | 'halfCarry';
4
+ export type SmartComment = {
5
+ kind: 'extern';
6
+ name: string;
7
+ } | {
8
+ kind: 'end';
9
+ } | {
10
+ kind: 'in';
11
+ carriers: RegisterCareUnit[];
12
+ name?: string;
13
+ } | {
14
+ kind: 'out';
15
+ carriers: RegisterCareUnit[];
16
+ name?: string;
17
+ } | {
18
+ kind: 'clobbers';
19
+ carriers: RegisterCareUnit[];
20
+ } | {
21
+ kind: 'preserves';
22
+ carriers: RegisterCareUnit[];
23
+ } | {
24
+ kind: 'expectOut';
25
+ carriers: RegisterCareUnit[];
26
+ name?: string;
27
+ };
28
+ export interface LocatedSmartComment {
29
+ file: string;
30
+ line: number;
31
+ comment: SmartComment;
32
+ }
33
+ export interface RoutineContract {
34
+ name: string;
35
+ in: RegisterCareUnit[];
36
+ out: RegisterCareUnit[];
37
+ clobbers: RegisterCareUnit[];
38
+ preserves: RegisterCareUnit[];
39
+ complete?: boolean;
40
+ }
41
+ export interface RegisterCareInstruction {
42
+ instruction: Z80Instruction;
43
+ file: string;
44
+ line: number;
45
+ column: number;
46
+ labels: string[];
47
+ }
48
+ export interface RegisterCareRoutine {
49
+ name: string;
50
+ labels: string[];
51
+ entryLabels: string[];
52
+ instructions: RegisterCareInstruction[];
53
+ span: {
54
+ file: string;
55
+ start: {
56
+ line: number;
57
+ column: number;
58
+ };
59
+ end: {
60
+ line: number;
61
+ column: number;
62
+ };
63
+ };
64
+ }
65
+ export interface RegisterCareDirectCall {
66
+ target: string;
67
+ file: string;
68
+ line: number;
69
+ column: number;
70
+ }
71
+ export interface RegisterCareProgramModel {
72
+ routines: RegisterCareRoutine[];
73
+ directCalls: RegisterCareDirectCall[];
74
+ }
75
+ export type StackEffect = {
76
+ kind: 'none';
77
+ } | {
78
+ kind: 'push';
79
+ units: RegisterCareUnit[];
80
+ } | {
81
+ kind: 'pop';
82
+ units: RegisterCareUnit[];
83
+ } | {
84
+ kind: 'exchangeTop';
85
+ units: RegisterCareUnit[];
86
+ } | {
87
+ kind: 'unknown';
88
+ };
89
+ export type ControlEffect = {
90
+ kind: 'fallthrough';
91
+ } | {
92
+ kind: 'call';
93
+ target?: string;
94
+ conditional: boolean;
95
+ } | {
96
+ kind: 'rst';
97
+ vector?: number;
98
+ } | {
99
+ kind: 'return';
100
+ conditional: boolean;
101
+ } | {
102
+ kind: 'jump';
103
+ target?: string;
104
+ conditional: boolean;
105
+ } | {
106
+ kind: 'unknown';
107
+ };
108
+ export interface InstructionEffect {
109
+ reads: RegisterCareUnit[];
110
+ writes: RegisterCareUnit[];
111
+ stack: StackEffect;
112
+ control: ControlEffect;
113
+ }
114
+ export interface ValueRelation {
115
+ out: RegisterCareUnit[];
116
+ from: RegisterCareUnit[];
117
+ }
118
+ export interface RoutineSummary {
119
+ name: string;
120
+ mayRead: RegisterCareUnit[];
121
+ mayWrite: RegisterCareUnit[];
122
+ mayOutput?: RegisterCareUnit[];
123
+ preserved: RegisterCareUnit[];
124
+ valueRelations?: ValueRelation[];
125
+ }
126
+ export interface RegisterCareOutputCandidate {
127
+ file: string;
128
+ line: number;
129
+ column: number;
130
+ routine: string;
131
+ carriers: RegisterCareUnit[];
132
+ autoFixable?: boolean;
133
+ message: string;
134
+ }
135
+ export interface RegisterCareConflict {
136
+ file: string;
137
+ line: number;
138
+ column: number;
139
+ callTarget: string;
140
+ carriers: RegisterCareUnit[];
141
+ message: string;
142
+ }
143
+ export interface RegisterCareReportModel {
144
+ entryFile: string;
145
+ mode: RegisterCareMode;
146
+ profile?: string;
147
+ summaries: RoutineSummary[];
148
+ conflicts: RegisterCareConflict[];
149
+ outputCandidates?: RegisterCareOutputCandidate[];
150
+ unknownCalls: string[];
151
+ }
152
+ export interface AnalyzeRegisterCareOptions {
153
+ mode: RegisterCareMode;
154
+ emitReport: boolean;
155
+ emitInterface: boolean;
156
+ emitAnnotations?: boolean;
157
+ fixRegisterContracts?: boolean;
158
+ registerCareProfile?: 'mon3';
159
+ interfaceContracts?: RoutineContract[];
160
+ acceptedOutputCandidates?: ReadonlyMap<string, RegisterCareUnit[]>;
161
+ }
162
+ export interface RegisterCareAnnotationFile {
163
+ readonly path: string;
164
+ readonly text: string;
165
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,29 @@
1
+ import type { Diagnostic } from '../model/diagnostic.js';
2
+ import type { Expression } from '../model/expression.js';
3
+ import type { LayoutField } from '../model/source-item.js';
4
+ import type { SourceSpan } from '../source/source-span.js';
5
+ export interface EquateRecord {
6
+ readonly expression: Expression;
7
+ readonly span: SourceSpan;
8
+ readonly currentLocation: number;
9
+ readonly enumMember?: boolean;
10
+ readonly stringValue?: string;
11
+ }
12
+ export interface LayoutRecord {
13
+ readonly kind: 'record' | 'union';
14
+ readonly fields: readonly LayoutField[];
15
+ readonly span: SourceSpan;
16
+ }
17
+ export declare function lookupEquateRecord(equates: ReadonlyMap<string, EquateRecord>, name: string): {
18
+ readonly key: string;
19
+ readonly record: EquateRecord;
20
+ } | undefined;
21
+ export declare function lookupSymbolValue(symbols: Readonly<Record<string, number>>, name: string): number | undefined;
22
+ export declare function evaluateExpression(expression: Expression, labels: Readonly<Record<string, number>>, equates: ReadonlyMap<string, EquateRecord>, span: SourceSpan, diagnostics: Diagnostic[], options: {
23
+ readonly currentLocation: number;
24
+ readonly layouts?: ReadonlyMap<string, LayoutRecord> | undefined;
25
+ readonly visiting?: ReadonlySet<string>;
26
+ readonly reportUnknown?: boolean;
27
+ }): number | undefined;
28
+ export declare function diagnostic(span: SourceSpan, message: string): Diagnostic;
29
+ export declare function validateLayouts(layouts: ReadonlyMap<string, LayoutRecord>, diagnostics: Diagnostic[]): void;
@@ -0,0 +1,409 @@
1
+ function canonicalSymbolKey(name) {
2
+ return name.toLowerCase();
3
+ }
4
+ function lookupLabelValue(labels, name) {
5
+ if (labels[name] !== undefined) {
6
+ return labels[name];
7
+ }
8
+ const lower = canonicalSymbolKey(name);
9
+ for (const [key, value] of Object.entries(labels)) {
10
+ if (key.toLowerCase() === lower) {
11
+ return value;
12
+ }
13
+ }
14
+ return undefined;
15
+ }
16
+ export function lookupEquateRecord(equates, name) {
17
+ const direct = equates.get(name);
18
+ if (direct !== undefined) {
19
+ return { key: name, record: direct };
20
+ }
21
+ const lower = canonicalSymbolKey(name);
22
+ for (const [key, record] of equates) {
23
+ if (key.toLowerCase() === lower) {
24
+ return { key, record };
25
+ }
26
+ }
27
+ return undefined;
28
+ }
29
+ export function lookupSymbolValue(symbols, name) {
30
+ return lookupLabelValue(symbols, name);
31
+ }
32
+ export function evaluateExpression(expression, labels, equates, span, diagnostics, options) {
33
+ switch (expression.kind) {
34
+ case 'number':
35
+ return expression.value;
36
+ case 'current-location':
37
+ return options.currentLocation;
38
+ case 'type-size':
39
+ return evaluateTypeSize(expression.typeExpr, labels, equates, span, diagnostics, options);
40
+ case 'sizeof':
41
+ return evaluateSizeof(expression.typeExpr, options.layouts, span, diagnostics);
42
+ case 'offset':
43
+ return evaluateOffset(expression.typeExpr, expression.path, options.layouts, span, diagnostics);
44
+ case 'layout-cast':
45
+ return evaluateLayoutCast(expression, labels, equates, span, diagnostics, options);
46
+ case 'symbol':
47
+ return evaluateSymbol(expression.name, labels, equates, span, diagnostics, options);
48
+ case 'unary':
49
+ return evaluateUnary(expression, labels, equates, span, diagnostics, options);
50
+ case 'binary':
51
+ return evaluateBinary(expression, labels, equates, span, diagnostics, options);
52
+ }
53
+ }
54
+ function evaluateTypeSize(typeExpr, labels, equates, span, diagnostics, options) {
55
+ if (options.layouts) {
56
+ const sizeDiagnostics = [];
57
+ const size = typeExprSize(typeExpr, options.layouts, span, sizeDiagnostics, new Set([typeExpr.name]));
58
+ if (size !== undefined) {
59
+ return size;
60
+ }
61
+ if (typeExpr.length !== undefined || scalarSize(typeExpr.name) !== undefined) {
62
+ diagnostics.push(...sizeDiagnostics);
63
+ return undefined;
64
+ }
65
+ }
66
+ if (typeExpr.length !== undefined) {
67
+ diagnostics.push(diagnostic(span, `unknown type: ${formatTypeExpr(typeExpr)}`));
68
+ return undefined;
69
+ }
70
+ return evaluateSymbol(typeExpr.name, labels, equates, span, diagnostics, options);
71
+ }
72
+ function evaluateLayoutCast(expression, labels, equates, span, diagnostics, options) {
73
+ const base = evaluateExpression(expression.base, labels, equates, span, diagnostics, options);
74
+ if (base === undefined) {
75
+ return undefined;
76
+ }
77
+ if (!options.layouts) {
78
+ diagnostics.push(diagnostic(span, `unknown type: ${formatTypeExpr(expression.typeExpr)}`));
79
+ return undefined;
80
+ }
81
+ const offset = layoutCastOffset(expression.typeExpr, expression.path, labels, equates, options.layouts, span, diagnostics, options);
82
+ return offset === undefined ? undefined : base + offset;
83
+ }
84
+ export function diagnostic(span, message) {
85
+ return {
86
+ severity: 'error',
87
+ code: 'AZMN_SYMBOL',
88
+ message,
89
+ sourceName: span.sourceName,
90
+ line: span.line,
91
+ column: span.column,
92
+ };
93
+ }
94
+ export function validateLayouts(layouts, diagnostics) {
95
+ for (const [name, layout] of layouts) {
96
+ layoutSize(name, layout, layouts, layout.span, diagnostics, new Set([name]));
97
+ }
98
+ }
99
+ function evaluateSymbol(name, labels, equates, span, diagnostics, options) {
100
+ const label = lookupLabelValue(labels, name);
101
+ if (label !== undefined) {
102
+ return label;
103
+ }
104
+ const equate = lookupEquateRecord(equates, name);
105
+ if (equate) {
106
+ if (options.visiting?.has(equate.key)) {
107
+ diagnostics.push(diagnostic(span, `recursive symbol: ${name}`));
108
+ return undefined;
109
+ }
110
+ return evaluateExpression(equate.record.expression, labels, equates, equate.record.span, diagnostics, {
111
+ currentLocation: equate.record.currentLocation,
112
+ visiting: new Set([...(options.visiting ?? []), equate.key]),
113
+ layouts: options.layouts,
114
+ ...(options.reportUnknown !== undefined ? { reportUnknown: options.reportUnknown } : {}),
115
+ });
116
+ }
117
+ if (hasUnqualifiedEnumMember(name, equates)) {
118
+ diagnostics.push(diagnostic(span, `Enum member "${name}" must be qualified.`));
119
+ return undefined;
120
+ }
121
+ if (options.reportUnknown ?? true) {
122
+ diagnostics.push(diagnostic(span, `unknown symbol: ${name}`));
123
+ }
124
+ return undefined;
125
+ }
126
+ function evaluateSizeof(typeExpr, layouts, span, diagnostics) {
127
+ if (!layouts) {
128
+ diagnostics.push(diagnostic(span, `unknown type: ${formatTypeExpr(typeExpr)}`));
129
+ return undefined;
130
+ }
131
+ return typeExprSize(typeExpr, layouts, span, diagnostics, new Set([typeExpr.name]));
132
+ }
133
+ function evaluateOffset(typeExpr, path, layouts, span, diagnostics) {
134
+ if (!layouts) {
135
+ diagnostics.push(diagnostic(span, `unknown type: ${formatTypeExpr(typeExpr)}`));
136
+ return undefined;
137
+ }
138
+ const diagnosticCount = diagnostics.length;
139
+ const offset = offsetPath(typeExpr, path, layouts, span, diagnostics);
140
+ if (offset !== undefined) {
141
+ return offset;
142
+ }
143
+ if (diagnostics.length === diagnosticCount) {
144
+ diagnostics.push(diagnostic(span, `unknown field "${formatOffsetPath(path)}" in type ${formatTypeExpr(typeExpr)}`));
145
+ }
146
+ return undefined;
147
+ }
148
+ function typeExprSize(typeExpr, layouts, span, diagnostics, visiting) {
149
+ const scalar = scalarSize(typeExpr.name);
150
+ const baseSize = scalar ??
151
+ (() => {
152
+ const layout = layouts.get(typeExpr.name);
153
+ if (!layout) {
154
+ diagnostics.push(diagnostic(span, `unknown type: ${typeExpr.name}`));
155
+ return undefined;
156
+ }
157
+ return layoutSize(typeExpr.name, layout, layouts, span, diagnostics, visiting);
158
+ })();
159
+ if (baseSize === undefined) {
160
+ return undefined;
161
+ }
162
+ return typeExpr.length === undefined ? baseSize : baseSize * typeExpr.length;
163
+ }
164
+ function layoutSize(typeName, layout, layouts, span, diagnostics, visiting) {
165
+ const fieldSizes = [];
166
+ for (const field of layout.fields) {
167
+ const size = fieldSize(field, layouts, span, diagnostics, visiting);
168
+ if (size === undefined) {
169
+ return undefined;
170
+ }
171
+ fieldSizes.push(size);
172
+ }
173
+ return layout.kind === 'union'
174
+ ? fieldSizes.reduce((largest, size) => Math.max(largest, size), 0)
175
+ : fieldSizes.reduce((sum, size) => sum + size, 0);
176
+ }
177
+ function fieldSize(field, layouts, span, diagnostics, visiting) {
178
+ if (field.typeExpr === undefined) {
179
+ return field.size;
180
+ }
181
+ if (visiting.has(field.typeExpr.name)) {
182
+ diagnostics.push(diagnostic(span, visiting.size === 1
183
+ ? `Self-referential field type "${field.typeExpr.name}" has no finite size; use .addr for a pointer field.`
184
+ : `recursive type: ${field.typeExpr.name}`));
185
+ return undefined;
186
+ }
187
+ return typeExprSize(field.typeExpr, layouts, span, diagnostics, new Set([...visiting, field.typeExpr.name]));
188
+ }
189
+ function offsetPath(typeExpr, parts, layouts, span, diagnostics) {
190
+ const [head, ...tail] = parts;
191
+ if (head === undefined) {
192
+ return undefined;
193
+ }
194
+ if (head.kind === 'index') {
195
+ if (typeExpr.length === undefined) {
196
+ return undefined;
197
+ }
198
+ if (head.index >= typeExpr.length) {
199
+ diagnostics.push(diagnostic(span, `array index ${head.index} out of range for ${formatTypeExpr(typeExpr)}`));
200
+ return undefined;
201
+ }
202
+ const elementTypeExpr = { name: typeExpr.name };
203
+ const stride = typeExprSize(elementTypeExpr, layouts, span, diagnostics, new Set([typeExpr.name]));
204
+ if (stride === undefined) {
205
+ return undefined;
206
+ }
207
+ if (tail.length === 0) {
208
+ return head.index * stride;
209
+ }
210
+ const nestedOffset = offsetPath(elementTypeExpr, tail, layouts, span, diagnostics);
211
+ return nestedOffset === undefined ? undefined : head.index * stride + nestedOffset;
212
+ }
213
+ if (typeExpr.length !== undefined) {
214
+ return undefined;
215
+ }
216
+ const layout = layouts.get(typeExpr.name);
217
+ if (!layout) {
218
+ diagnostics.push(diagnostic(span, `unknown type: ${typeExpr.name}`));
219
+ return undefined;
220
+ }
221
+ let currentOffset = 0;
222
+ for (const field of layout.fields) {
223
+ const fieldOffset = layout.kind === 'union' ? 0 : currentOffset;
224
+ if (field.name === head.name) {
225
+ if (field.typeExpr !== undefined) {
226
+ const size = fieldSize(field, layouts, span, diagnostics, new Set([typeExpr.name]));
227
+ if (size === undefined) {
228
+ return undefined;
229
+ }
230
+ }
231
+ if (tail.length === 0) {
232
+ return fieldOffset;
233
+ }
234
+ if (field.typeExpr === undefined) {
235
+ return undefined;
236
+ }
237
+ const nestedOffset = offsetPath(field.typeExpr, tail, layouts, span, diagnostics);
238
+ return nestedOffset === undefined ? undefined : fieldOffset + nestedOffset;
239
+ }
240
+ const size = fieldSize(field, layouts, span, diagnostics, new Set([typeExpr.name]));
241
+ if (size === undefined) {
242
+ return undefined;
243
+ }
244
+ currentOffset += size;
245
+ }
246
+ return undefined;
247
+ }
248
+ function layoutCastOffset(typeExpr, parts, labels, equates, layouts, span, diagnostics, options) {
249
+ const [head, ...tail] = parts;
250
+ if (head === undefined) {
251
+ return 0;
252
+ }
253
+ if (head.kind === 'index') {
254
+ if (typeExpr.length === undefined) {
255
+ return undefined;
256
+ }
257
+ const registerName = registerIndexName(head.expression);
258
+ if (registerName) {
259
+ diagnostics.push(diagnostic(span, `runtime register index "${registerName}" is not supported in layout casts`));
260
+ return undefined;
261
+ }
262
+ const index = evaluateExpression(head.expression, labels, equates, span, diagnostics, {
263
+ ...options,
264
+ layouts,
265
+ });
266
+ if (index === undefined) {
267
+ return undefined;
268
+ }
269
+ if (index < 0 || index >= typeExpr.length) {
270
+ diagnostics.push(diagnostic(span, `array index ${index} out of range for ${formatTypeExpr(typeExpr)}`));
271
+ return undefined;
272
+ }
273
+ const elementTypeExpr = { name: typeExpr.name };
274
+ const stride = typeExprSize(elementTypeExpr, layouts, span, diagnostics, new Set([typeExpr.name]));
275
+ if (stride === undefined) {
276
+ return undefined;
277
+ }
278
+ const nestedOffset = layoutCastOffset(elementTypeExpr, tail, labels, equates, layouts, span, diagnostics, options);
279
+ return nestedOffset === undefined ? undefined : index * stride + nestedOffset;
280
+ }
281
+ if (typeExpr.length !== undefined) {
282
+ return undefined;
283
+ }
284
+ const layout = layouts.get(typeExpr.name);
285
+ if (!layout) {
286
+ diagnostics.push(diagnostic(span, `unknown type: ${typeExpr.name}`));
287
+ return undefined;
288
+ }
289
+ let currentOffset = 0;
290
+ for (const field of layout.fields) {
291
+ const fieldOffset = layout.kind === 'union' ? 0 : currentOffset;
292
+ if (field.name === head.name) {
293
+ if (field.typeExpr !== undefined) {
294
+ const size = fieldSize(field, layouts, span, diagnostics, new Set([typeExpr.name]));
295
+ if (size === undefined) {
296
+ return undefined;
297
+ }
298
+ }
299
+ if (tail.length === 0) {
300
+ return fieldOffset;
301
+ }
302
+ if (field.typeExpr === undefined) {
303
+ return undefined;
304
+ }
305
+ const nestedOffset = layoutCastOffset(field.typeExpr, tail, labels, equates, layouts, span, diagnostics, options);
306
+ return nestedOffset === undefined ? undefined : fieldOffset + nestedOffset;
307
+ }
308
+ const size = fieldSize(field, layouts, span, diagnostics, new Set([typeExpr.name]));
309
+ if (size === undefined) {
310
+ return undefined;
311
+ }
312
+ currentOffset += size;
313
+ }
314
+ return undefined;
315
+ }
316
+ function registerIndexName(expression) {
317
+ switch (expression.kind) {
318
+ case 'symbol':
319
+ return /^(a|b|c|d|e|h|l|af|bc|de|hl|ix|iy|sp|i|r|ixh|ixl|iyh|iyl)$/i.test(expression.name)
320
+ ? expression.name.toUpperCase()
321
+ : undefined;
322
+ case 'unary':
323
+ return registerIndexName(expression.expression);
324
+ case 'binary':
325
+ return registerIndexName(expression.left) ?? registerIndexName(expression.right);
326
+ default:
327
+ return undefined;
328
+ }
329
+ }
330
+ function formatTypeExpr(typeExpr) {
331
+ return typeExpr.length === undefined ? typeExpr.name : `${typeExpr.name}[${typeExpr.length}]`;
332
+ }
333
+ function formatOffsetPath(path) {
334
+ return path.map((part) => (part.kind === 'field' ? part.name : `[${part.index}]`)).join('.');
335
+ }
336
+ function scalarSize(typeName) {
337
+ switch (typeName.toLowerCase()) {
338
+ case 'byte':
339
+ return 1;
340
+ case 'word':
341
+ case 'addr':
342
+ return 2;
343
+ default:
344
+ return undefined;
345
+ }
346
+ }
347
+ function hasUnqualifiedEnumMember(name, equates) {
348
+ if (name.includes('.')) {
349
+ return false;
350
+ }
351
+ const suffix = `.${name}`;
352
+ for (const [key, record] of equates) {
353
+ if (record.enumMember === true && key.endsWith(suffix)) {
354
+ return true;
355
+ }
356
+ }
357
+ return false;
358
+ }
359
+ function evaluateUnary(expression, labels, equates, span, diagnostics, options) {
360
+ const value = evaluateExpression(expression.expression, labels, equates, span, diagnostics, options);
361
+ if (value === undefined) {
362
+ return undefined;
363
+ }
364
+ switch (expression.operator) {
365
+ case '+':
366
+ return value;
367
+ case '-':
368
+ return -value;
369
+ case '~':
370
+ return ~value;
371
+ }
372
+ }
373
+ function evaluateBinary(expression, labels, equates, span, diagnostics, options) {
374
+ const left = evaluateExpression(expression.left, labels, equates, span, diagnostics, options);
375
+ const right = evaluateExpression(expression.right, labels, equates, span, diagnostics, options);
376
+ if (left === undefined || right === undefined) {
377
+ return undefined;
378
+ }
379
+ switch (expression.operator) {
380
+ case '*':
381
+ return left * right;
382
+ case '/':
383
+ if (right === 0) {
384
+ diagnostics.push(diagnostic(span, 'Divide by zero in imm expression.'));
385
+ return undefined;
386
+ }
387
+ return Math.trunc(left / right);
388
+ case '%':
389
+ if (right === 0) {
390
+ diagnostics.push(diagnostic(span, 'modulo by zero in expression'));
391
+ return undefined;
392
+ }
393
+ return left % right;
394
+ case '+':
395
+ return left + right;
396
+ case '-':
397
+ return left - right;
398
+ case '&':
399
+ return left & right;
400
+ case '^':
401
+ return left ^ right;
402
+ case '|':
403
+ return left | right;
404
+ case '<<':
405
+ return left << right;
406
+ case '>>':
407
+ return left >> right;
408
+ }
409
+ }
@@ -0,0 +1,7 @@
1
+ import type { SourceFile } from './source-file.js';
2
+ export interface LogicalLine {
3
+ readonly sourceName: string;
4
+ readonly line: number;
5
+ readonly text: string;
6
+ }
7
+ export declare function scanLogicalLines(source: SourceFile): LogicalLine[];
@@ -0,0 +1,11 @@
1
+ export function scanLogicalLines(source) {
2
+ const normalized = source.text.replace(/\r\n/g, '\n').replace(/\r/g, '\n');
3
+ const rawLines = normalized.endsWith('\n')
4
+ ? normalized.slice(0, -1).split('\n')
5
+ : normalized.split('\n');
6
+ return rawLines.map((text, index) => ({
7
+ sourceName: source.name,
8
+ line: index + 1,
9
+ text,
10
+ }));
11
+ }
@@ -0,0 +1,5 @@
1
+ export interface SourceFile {
2
+ readonly name: string;
3
+ readonly text: string;
4
+ }
5
+ export declare function createSourceFile(name: string, text: string): SourceFile;
@@ -0,0 +1,3 @@
1
+ export function createSourceFile(name, text) {
2
+ return { name, text };
3
+ }
@@ -0,0 +1,5 @@
1
+ export interface SourceSpan {
2
+ readonly sourceName: string;
3
+ readonly line: number;
4
+ readonly column: number;
5
+ }