@jhlagado/azm 0.2.0 → 0.2.2

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 (334) hide show
  1. package/README.md +110 -78
  2. package/dist/src/api-compile.d.ts +0 -2
  3. package/dist/src/api-compile.js +2 -9
  4. package/dist/src/assembly/address-planning.js +21 -1
  5. package/dist/src/assembly/program-emission.js +1 -0
  6. package/dist/src/cli/parse-args.d.ts +0 -1
  7. package/dist/src/cli/parse-args.js +0 -7
  8. package/dist/src/cli/write-artifacts.js +0 -11
  9. package/dist/src/core/compile.js +192 -9
  10. package/dist/src/expansion/op-expansion.js +2 -0
  11. package/dist/src/model/expression.d.ts +4 -0
  12. package/dist/src/model/source-item.d.ts +11 -0
  13. package/dist/src/outputs/index.js +0 -2
  14. package/dist/src/outputs/types.d.ts +3 -16
  15. package/dist/src/outputs/write-asm80.js +206 -5
  16. package/dist/src/register-care/analyze.js +36 -8
  17. package/dist/src/register-care/annotations.js +33 -146
  18. package/dist/src/register-care/fix.d.ts +2 -0
  19. package/dist/src/register-care/fix.js +52 -0
  20. package/dist/src/register-care/instruction-shape.d.ts +11 -0
  21. package/dist/src/register-care/instruction-shape.js +129 -0
  22. package/dist/src/register-care/liveness.js +15 -7
  23. package/dist/src/register-care/profiles.js +4 -0
  24. package/dist/src/register-care/programModel.js +79 -13
  25. package/dist/src/register-care/report.d.ts +2 -1
  26. package/dist/src/register-care/report.js +91 -34
  27. package/dist/src/register-care/routine-summaries.d.ts +6 -0
  28. package/dist/src/register-care/routine-summaries.js +89 -0
  29. package/dist/src/register-care/summaries.d.ts +3 -3
  30. package/dist/src/register-care/summaries.js +42 -75
  31. package/dist/{legacy-root-azm/src/registerCare → src/register-care}/summary.js +33 -51
  32. package/dist/src/register-care/types.d.ts +6 -1
  33. package/dist/src/semantics/expression-evaluation.d.ts +7 -3
  34. package/dist/src/semantics/expression-evaluation.js +57 -0
  35. package/dist/src/source/strip-line-comment.d.ts +2 -0
  36. package/dist/src/source/strip-line-comment.js +26 -0
  37. package/dist/src/syntax/directive-aliases.js +9 -10
  38. package/dist/src/syntax/parse-diagnostics.d.ts +12 -0
  39. package/dist/src/syntax/parse-diagnostics.js +18 -0
  40. package/dist/src/syntax/parse-expression.js +34 -9
  41. package/dist/src/syntax/parse-line.js +150 -54
  42. package/dist/src/tooling/case-style.js +3 -0
  43. package/docs/reference/cli.md +6 -4
  44. package/docs/reference/tooling-api.md +13 -9
  45. package/package.json +4 -6
  46. package/dist/legacy-root-azm/src/analysis.d.ts +0 -11
  47. package/dist/legacy-root-azm/src/analysis.js +0 -41
  48. package/dist/legacy-root-azm/src/compile.d.ts +0 -10
  49. package/dist/legacy-root-azm/src/compile.js +0 -186
  50. package/dist/legacy-root-azm/src/compileShared.d.ts +0 -3
  51. package/dist/legacy-root-azm/src/compileShared.js +0 -7
  52. package/dist/legacy-root-azm/src/diagnosticTypes.d.ts +0 -77
  53. package/dist/legacy-root-azm/src/diagnosticTypes.js +0 -53
  54. package/dist/legacy-root-azm/src/formats/index.d.ts +0 -7
  55. package/dist/legacy-root-azm/src/formats/index.js +0 -17
  56. package/dist/legacy-root-azm/src/formats/range.d.ts +0 -17
  57. package/dist/legacy-root-azm/src/formats/range.js +0 -45
  58. package/dist/legacy-root-azm/src/formats/types.d.ts +0 -283
  59. package/dist/legacy-root-azm/src/formats/types.js +0 -1
  60. package/dist/legacy-root-azm/src/formats/writeAsm80.d.ts +0 -6
  61. package/dist/legacy-root-azm/src/formats/writeAsm80.js +0 -86
  62. package/dist/legacy-root-azm/src/formats/writeBin.d.ts +0 -7
  63. package/dist/legacy-root-azm/src/formats/writeBin.js +0 -23
  64. package/dist/legacy-root-azm/src/formats/writeD8m.d.ts +0 -9
  65. package/dist/legacy-root-azm/src/formats/writeD8m.js +0 -245
  66. package/dist/legacy-root-azm/src/formats/writeHex.d.ts +0 -8
  67. package/dist/legacy-root-azm/src/formats/writeHex.js +0 -38
  68. package/dist/legacy-root-azm/src/formats/writeListing.d.ts +0 -8
  69. package/dist/legacy-root-azm/src/formats/writeListing.js +0 -83
  70. package/dist/legacy-root-azm/src/frontend/asm80/asmLine.d.ts +0 -39
  71. package/dist/legacy-root-azm/src/frontend/asm80/asmLine.js +0 -89
  72. package/dist/legacy-root-azm/src/frontend/asm80/parseAsmRawValues.d.ts +0 -4
  73. package/dist/legacy-root-azm/src/frontend/asm80/parseAsmRawValues.js +0 -94
  74. package/dist/legacy-root-azm/src/frontend/asm80/quoteScan.d.ts +0 -10
  75. package/dist/legacy-root-azm/src/frontend/asm80/quoteScan.js +0 -25
  76. package/dist/legacy-root-azm/src/frontend/ast.d.ts +0 -376
  77. package/dist/legacy-root-azm/src/frontend/ast.js +0 -1
  78. package/dist/legacy-root-azm/src/frontend/directiveAliases.d.ts +0 -14
  79. package/dist/legacy-root-azm/src/frontend/directiveAliases.js +0 -189
  80. package/dist/legacy-root-azm/src/frontend/grammarData.d.ts +0 -14
  81. package/dist/legacy-root-azm/src/frontend/grammarData.js +0 -65
  82. package/dist/legacy-root-azm/src/frontend/immExprUtils.d.ts +0 -2
  83. package/dist/legacy-root-azm/src/frontend/immExprUtils.js +0 -12
  84. package/dist/legacy-root-azm/src/frontend/parseAsmFlatDirectiveLine.d.ts +0 -17
  85. package/dist/legacy-root-azm/src/frontend/parseAsmFlatDirectiveLine.js +0 -187
  86. package/dist/legacy-root-azm/src/frontend/parseAsmInstruction.d.ts +0 -3
  87. package/dist/legacy-root-azm/src/frontend/parseAsmInstruction.js +0 -73
  88. package/dist/legacy-root-azm/src/frontend/parseAsmStatements.d.ts +0 -6
  89. package/dist/legacy-root-azm/src/frontend/parseAsmStatements.js +0 -16
  90. package/dist/legacy-root-azm/src/frontend/parseAsmStream.d.ts +0 -10
  91. package/dist/legacy-root-azm/src/frontend/parseAsmStream.js +0 -33
  92. package/dist/legacy-root-azm/src/frontend/parseAsmTopLevel.d.ts +0 -18
  93. package/dist/legacy-root-azm/src/frontend/parseAsmTopLevel.js +0 -34
  94. package/dist/legacy-root-azm/src/frontend/parseDiagnostics.d.ts +0 -9
  95. package/dist/legacy-root-azm/src/frontend/parseDiagnostics.js +0 -16
  96. package/dist/legacy-root-azm/src/frontend/parseEnum.d.ts +0 -12
  97. package/dist/legacy-root-azm/src/frontend/parseEnum.js +0 -70
  98. package/dist/legacy-root-azm/src/frontend/parseImm.d.ts +0 -10
  99. package/dist/legacy-root-azm/src/frontend/parseImm.js +0 -397
  100. package/dist/legacy-root-azm/src/frontend/parseLogicalLines.d.ts +0 -11
  101. package/dist/legacy-root-azm/src/frontend/parseLogicalLines.js +0 -94
  102. package/dist/legacy-root-azm/src/frontend/parseOp.d.ts +0 -25
  103. package/dist/legacy-root-azm/src/frontend/parseOp.js +0 -120
  104. package/dist/legacy-root-azm/src/frontend/parseOpHeader.d.ts +0 -20
  105. package/dist/legacy-root-azm/src/frontend/parseOpHeader.js +0 -32
  106. package/dist/legacy-root-azm/src/frontend/parseOperands.d.ts +0 -4
  107. package/dist/legacy-root-azm/src/frontend/parseOperands.js +0 -290
  108. package/dist/legacy-root-azm/src/frontend/parseParams.d.ts +0 -6
  109. package/dist/legacy-root-azm/src/frontend/parseParams.js +0 -62
  110. package/dist/legacy-root-azm/src/frontend/parseParserRecovery.d.ts +0 -12
  111. package/dist/legacy-root-azm/src/frontend/parseParserRecovery.js +0 -17
  112. package/dist/legacy-root-azm/src/frontend/parseParserShared.d.ts +0 -2
  113. package/dist/legacy-root-azm/src/frontend/parseParserShared.js +0 -8
  114. package/dist/legacy-root-azm/src/frontend/parseRawDataDirectiveStart.d.ts +0 -1
  115. package/dist/legacy-root-azm/src/frontend/parseRawDataDirectiveStart.js +0 -3
  116. package/dist/legacy-root-azm/src/frontend/parseRawDataDirectives.d.ts +0 -7
  117. package/dist/legacy-root-azm/src/frontend/parseRawDataDirectives.js +0 -142
  118. package/dist/legacy-root-azm/src/frontend/parseRecordFieldDecl.d.ts +0 -34
  119. package/dist/legacy-root-azm/src/frontend/parseRecordFieldDecl.js +0 -177
  120. package/dist/legacy-root-azm/src/frontend/parseSourceItemDispatch.d.ts +0 -46
  121. package/dist/legacy-root-azm/src/frontend/parseSourceItemDispatch.js +0 -53
  122. package/dist/legacy-root-azm/src/frontend/parseSourceItemTable.d.ts +0 -16
  123. package/dist/legacy-root-azm/src/frontend/parseSourceItemTable.js +0 -68
  124. package/dist/legacy-root-azm/src/frontend/parseTopLevelCommon.d.ts +0 -11
  125. package/dist/legacy-root-azm/src/frontend/parseTopLevelCommon.js +0 -50
  126. package/dist/legacy-root-azm/src/frontend/parseTypes.d.ts +0 -24
  127. package/dist/legacy-root-azm/src/frontend/parseTypes.js +0 -77
  128. package/dist/legacy-root-azm/src/frontend/parser.d.ts +0 -11
  129. package/dist/legacy-root-azm/src/frontend/parser.js +0 -88
  130. package/dist/legacy-root-azm/src/frontend/source.d.ts +0 -28
  131. package/dist/legacy-root-azm/src/frontend/source.js +0 -58
  132. package/dist/legacy-root-azm/src/frontend/sourceExtensions.d.ts +0 -2
  133. package/dist/legacy-root-azm/src/frontend/sourceExtensions.js +0 -6
  134. package/dist/legacy-root-azm/src/lintCaseStyle.d.ts +0 -4
  135. package/dist/legacy-root-azm/src/lintCaseStyle.js +0 -129
  136. package/dist/legacy-root-azm/src/lowering/asmDirectiveLowering.d.ts +0 -4
  137. package/dist/legacy-root-azm/src/lowering/asmDirectiveLowering.js +0 -229
  138. package/dist/legacy-root-azm/src/lowering/asmDirectiveTraversal.d.ts +0 -47
  139. package/dist/legacy-root-azm/src/lowering/asmDirectiveTraversal.js +0 -52
  140. package/dist/legacy-root-azm/src/lowering/asmEquResolution.d.ts +0 -8
  141. package/dist/legacy-root-azm/src/lowering/asmEquResolution.js +0 -69
  142. package/dist/legacy-root-azm/src/lowering/asmInstructionLdHelpers.d.ts +0 -15
  143. package/dist/legacy-root-azm/src/lowering/asmInstructionLdHelpers.js +0 -102
  144. package/dist/legacy-root-azm/src/lowering/asmInstructionLowering.d.ts +0 -5
  145. package/dist/legacy-root-azm/src/lowering/asmInstructionLowering.js +0 -54
  146. package/dist/legacy-root-azm/src/lowering/asmInstructionStream.d.ts +0 -46
  147. package/dist/legacy-root-azm/src/lowering/asmInstructionStream.js +0 -51
  148. package/dist/legacy-root-azm/src/lowering/asmLoweringBranchCall.d.ts +0 -43
  149. package/dist/legacy-root-azm/src/lowering/asmLoweringBranchCall.js +0 -254
  150. package/dist/legacy-root-azm/src/lowering/asmLoweringHost.d.ts +0 -23
  151. package/dist/legacy-root-azm/src/lowering/asmLoweringHost.js +0 -1
  152. package/dist/legacy-root-azm/src/lowering/asmLoweringLd.d.ts +0 -28
  153. package/dist/legacy-root-azm/src/lowering/asmLoweringLd.js +0 -144
  154. package/dist/legacy-root-azm/src/lowering/asmRangeLowering.d.ts +0 -17
  155. package/dist/legacy-root-azm/src/lowering/asmRangeLowering.js +0 -39
  156. package/dist/legacy-root-azm/src/lowering/asmRawDataLowering.d.ts +0 -16
  157. package/dist/legacy-root-azm/src/lowering/asmRawDataLowering.js +0 -209
  158. package/dist/legacy-root-azm/src/lowering/asmSourceEmitter.d.ts +0 -4
  159. package/dist/legacy-root-azm/src/lowering/asmSourceEmitter.js +0 -9
  160. package/dist/legacy-root-azm/src/lowering/asmSourceInstructionLowering.d.ts +0 -4
  161. package/dist/legacy-root-azm/src/lowering/asmSourceInstructionLowering.js +0 -14
  162. package/dist/legacy-root-azm/src/lowering/asmUtils.d.ts +0 -13
  163. package/dist/legacy-root-azm/src/lowering/asmUtils.js +0 -105
  164. package/dist/legacy-root-azm/src/lowering/assemblerFlowSetup.d.ts +0 -54
  165. package/dist/legacy-root-azm/src/lowering/assemblerFlowSetup.js +0 -128
  166. package/dist/legacy-root-azm/src/lowering/assemblerLoweringContext.d.ts +0 -151
  167. package/dist/legacy-root-azm/src/lowering/assemblerLoweringContext.js +0 -16
  168. package/dist/legacy-root-azm/src/lowering/assemblerLoweringContextSplit.d.ts +0 -7
  169. package/dist/legacy-root-azm/src/lowering/assemblerLoweringContextSplit.js +0 -75
  170. package/dist/legacy-root-azm/src/lowering/assemblerLoweringPhases.d.ts +0 -66
  171. package/dist/legacy-root-azm/src/lowering/assemblerLoweringPhases.js +0 -166
  172. package/dist/legacy-root-azm/src/lowering/bytePlacement.d.ts +0 -7
  173. package/dist/legacy-root-azm/src/lowering/bytePlacement.js +0 -37
  174. package/dist/legacy-root-azm/src/lowering/capabilities.d.ts +0 -67
  175. package/dist/legacy-root-azm/src/lowering/capabilities.js +0 -1
  176. package/dist/legacy-root-azm/src/lowering/eaResolution.d.ts +0 -58
  177. package/dist/legacy-root-azm/src/lowering/eaResolution.js +0 -159
  178. package/dist/legacy-root-azm/src/lowering/emissionCore.d.ts +0 -17
  179. package/dist/legacy-root-azm/src/lowering/emissionCore.js +0 -21
  180. package/dist/legacy-root-azm/src/lowering/emit.d.ts +0 -17
  181. package/dist/legacy-root-azm/src/lowering/emit.js +0 -46
  182. package/dist/legacy-root-azm/src/lowering/emitContextBuilder.d.ts +0 -63
  183. package/dist/legacy-root-azm/src/lowering/emitContextBuilder.js +0 -41
  184. package/dist/legacy-root-azm/src/lowering/emitFinalization.d.ts +0 -61
  185. package/dist/legacy-root-azm/src/lowering/emitFinalization.js +0 -66
  186. package/dist/legacy-root-azm/src/lowering/emitFinalizationSetup.d.ts +0 -19
  187. package/dist/legacy-root-azm/src/lowering/emitFinalizationSetup.js +0 -26
  188. package/dist/legacy-root-azm/src/lowering/emitPhase1BuildProgramLoweringContext.d.ts +0 -7
  189. package/dist/legacy-root-azm/src/lowering/emitPhase1BuildProgramLoweringContext.js +0 -119
  190. package/dist/legacy-root-azm/src/lowering/emitPhase1Helpers.d.ts +0 -4
  191. package/dist/legacy-root-azm/src/lowering/emitPhase1Helpers.js +0 -12
  192. package/dist/legacy-root-azm/src/lowering/emitPhase1Types.d.ts +0 -21
  193. package/dist/legacy-root-azm/src/lowering/emitPhase1Types.js +0 -1
  194. package/dist/legacy-root-azm/src/lowering/emitPhase1WirePipeline.d.ts +0 -70
  195. package/dist/legacy-root-azm/src/lowering/emitPhase1WirePipeline.js +0 -203
  196. package/dist/legacy-root-azm/src/lowering/emitPhase1Workspace.d.ts +0 -82
  197. package/dist/legacy-root-azm/src/lowering/emitPhase1Workspace.js +0 -55
  198. package/dist/legacy-root-azm/src/lowering/emitPipeline.d.ts +0 -121
  199. package/dist/legacy-root-azm/src/lowering/emitPipeline.js +0 -57
  200. package/dist/legacy-root-azm/src/lowering/emitProgramContext.d.ts +0 -39
  201. package/dist/legacy-root-azm/src/lowering/emitProgramContext.js +0 -29
  202. package/dist/legacy-root-azm/src/lowering/emitState.d.ts +0 -90
  203. package/dist/legacy-root-azm/src/lowering/emitState.js +0 -124
  204. package/dist/legacy-root-azm/src/lowering/fixupBaseResolution.d.ts +0 -7
  205. package/dist/legacy-root-azm/src/lowering/fixupBaseResolution.js +0 -23
  206. package/dist/legacy-root-azm/src/lowering/fixupEmission.d.ts +0 -64
  207. package/dist/legacy-root-azm/src/lowering/fixupEmission.js +0 -199
  208. package/dist/legacy-root-azm/src/lowering/immMath.d.ts +0 -2
  209. package/dist/legacy-root-azm/src/lowering/immMath.js +0 -34
  210. package/dist/legacy-root-azm/src/lowering/inputAssets.d.ts +0 -7
  211. package/dist/legacy-root-azm/src/lowering/inputAssets.js +0 -106
  212. package/dist/legacy-root-azm/src/lowering/ldEncoding.d.ts +0 -15
  213. package/dist/legacy-root-azm/src/lowering/ldEncoding.js +0 -12
  214. package/dist/legacy-root-azm/src/lowering/ldEncodingRegMemHelpers.d.ts +0 -5
  215. package/dist/legacy-root-azm/src/lowering/ldEncodingRegMemHelpers.js +0 -124
  216. package/dist/legacy-root-azm/src/lowering/ldFormSelection.d.ts +0 -26
  217. package/dist/legacy-root-azm/src/lowering/ldFormSelection.js +0 -92
  218. package/dist/legacy-root-azm/src/lowering/ldLowering.d.ts +0 -7
  219. package/dist/legacy-root-azm/src/lowering/ldLowering.js +0 -13
  220. package/dist/legacy-root-azm/src/lowering/loweredAsmByteEmission.d.ts +0 -23
  221. package/dist/legacy-root-azm/src/lowering/loweredAsmByteEmission.js +0 -185
  222. package/dist/legacy-root-azm/src/lowering/loweredAsmPlacement.d.ts +0 -13
  223. package/dist/legacy-root-azm/src/lowering/loweredAsmPlacement.js +0 -86
  224. package/dist/legacy-root-azm/src/lowering/loweredAsmStreamRecording.d.ts +0 -27
  225. package/dist/legacy-root-azm/src/lowering/loweredAsmStreamRecording.js +0 -215
  226. package/dist/legacy-root-azm/src/lowering/loweredAsmTypes.d.ts +0 -202
  227. package/dist/legacy-root-azm/src/lowering/loweredAsmTypes.js +0 -1
  228. package/dist/legacy-root-azm/src/lowering/loweredFormat.d.ts +0 -3
  229. package/dist/legacy-root-azm/src/lowering/loweredFormat.js +0 -26
  230. package/dist/legacy-root-azm/src/lowering/loweredItemSize.d.ts +0 -4
  231. package/dist/legacy-root-azm/src/lowering/loweredItemSize.js +0 -17
  232. package/dist/legacy-root-azm/src/lowering/loweringDiagnostics.d.ts +0 -9
  233. package/dist/legacy-root-azm/src/lowering/loweringDiagnostics.js +0 -55
  234. package/dist/legacy-root-azm/src/lowering/loweringTypes.d.ts +0 -27
  235. package/dist/legacy-root-azm/src/lowering/loweringTypes.js +0 -1
  236. package/dist/legacy-root-azm/src/lowering/opCandidateRegistry.d.ts +0 -9
  237. package/dist/legacy-root-azm/src/lowering/opCandidateRegistry.js +0 -9
  238. package/dist/legacy-root-azm/src/lowering/opExpansionExecution.d.ts +0 -15
  239. package/dist/legacy-root-azm/src/lowering/opExpansionExecution.js +0 -45
  240. package/dist/legacy-root-azm/src/lowering/opExpansionOrchestration.d.ts +0 -15
  241. package/dist/legacy-root-azm/src/lowering/opExpansionOrchestration.js +0 -88
  242. package/dist/legacy-root-azm/src/lowering/opExpansionStream.d.ts +0 -12
  243. package/dist/legacy-root-azm/src/lowering/opExpansionStream.js +0 -176
  244. package/dist/legacy-root-azm/src/lowering/opMatching.d.ts +0 -52
  245. package/dist/legacy-root-azm/src/lowering/opMatching.js +0 -355
  246. package/dist/legacy-root-azm/src/lowering/opSubstitution.d.ts +0 -13
  247. package/dist/legacy-root-azm/src/lowering/opSubstitution.js +0 -175
  248. package/dist/legacy-root-azm/src/lowering/prescanTypes.d.ts +0 -7
  249. package/dist/legacy-root-azm/src/lowering/prescanTypes.js +0 -1
  250. package/dist/legacy-root-azm/src/lowering/programLowering.d.ts +0 -144
  251. package/dist/legacy-root-azm/src/lowering/programLowering.js +0 -2
  252. package/dist/legacy-root-azm/src/lowering/programLoweringDeclarations.d.ts +0 -5
  253. package/dist/legacy-root-azm/src/lowering/programLoweringDeclarations.js +0 -5
  254. package/dist/legacy-root-azm/src/lowering/programLoweringFinalize.d.ts +0 -18
  255. package/dist/legacy-root-azm/src/lowering/programLoweringFinalize.js +0 -115
  256. package/dist/legacy-root-azm/src/lowering/programLoweringTraversal.d.ts +0 -2
  257. package/dist/legacy-root-azm/src/lowering/programLoweringTraversal.js +0 -93
  258. package/dist/legacy-root-azm/src/lowering/programPrescan.d.ts +0 -3
  259. package/dist/legacy-root-azm/src/lowering/programPrescan.js +0 -37
  260. package/dist/legacy-root-azm/src/lowering/traceFormat.d.ts +0 -13
  261. package/dist/legacy-root-azm/src/lowering/traceFormat.js +0 -211
  262. package/dist/legacy-root-azm/src/packageInfo.d.ts +0 -1
  263. package/dist/legacy-root-azm/src/packageInfo.js +0 -15
  264. package/dist/legacy-root-azm/src/pathCompare.d.ts +0 -3
  265. package/dist/legacy-root-azm/src/pathCompare.js +0 -26
  266. package/dist/legacy-root-azm/src/pipeline.d.ts +0 -91
  267. package/dist/legacy-root-azm/src/pipeline.js +0 -1
  268. package/dist/legacy-root-azm/src/registerCare/analyze.d.ts +0 -24
  269. package/dist/legacy-root-azm/src/registerCare/analyze.js +0 -327
  270. package/dist/legacy-root-azm/src/registerCare/boundaryHints.d.ts +0 -2
  271. package/dist/legacy-root-azm/src/registerCare/boundaryHints.js +0 -10
  272. package/dist/legacy-root-azm/src/registerCare/carriers.d.ts +0 -4
  273. package/dist/legacy-root-azm/src/registerCare/carriers.js +0 -78
  274. package/dist/legacy-root-azm/src/registerCare/controlFlow.d.ts +0 -5
  275. package/dist/legacy-root-azm/src/registerCare/controlFlow.js +0 -35
  276. package/dist/legacy-root-azm/src/registerCare/fix.d.ts +0 -11
  277. package/dist/legacy-root-azm/src/registerCare/fix.js +0 -119
  278. package/dist/legacy-root-azm/src/registerCare/liveness.d.ts +0 -7
  279. package/dist/legacy-root-azm/src/registerCare/liveness.js +0 -227
  280. package/dist/legacy-root-azm/src/registerCare/profiles.d.ts +0 -11
  281. package/dist/legacy-root-azm/src/registerCare/profiles.js +0 -45
  282. package/dist/legacy-root-azm/src/registerCare/programModel.d.ts +0 -3
  283. package/dist/legacy-root-azm/src/registerCare/programModel.js +0 -181
  284. package/dist/legacy-root-azm/src/registerCare/report.d.ts +0 -5
  285. package/dist/legacy-root-azm/src/registerCare/report.js +0 -139
  286. package/dist/legacy-root-azm/src/registerCare/smartComments.d.ts +0 -5
  287. package/dist/legacy-root-azm/src/registerCare/smartComments.js +0 -247
  288. package/dist/legacy-root-azm/src/registerCare/types.d.ts +0 -154
  289. package/dist/legacy-root-azm/src/registerCare/types.js +0 -1
  290. package/dist/legacy-root-azm/src/semantics/declVisitor.d.ts +0 -5
  291. package/dist/legacy-root-azm/src/semantics/declVisitor.js +0 -11
  292. package/dist/legacy-root-azm/src/semantics/env.d.ts +0 -28
  293. package/dist/legacy-root-azm/src/semantics/env.js +0 -432
  294. package/dist/legacy-root-azm/src/semantics/layout.d.ts +0 -21
  295. package/dist/legacy-root-azm/src/semantics/layout.js +0 -226
  296. package/dist/legacy-root-azm/src/semantics/layoutCastFold.d.ts +0 -22
  297. package/dist/legacy-root-azm/src/semantics/layoutCastFold.js +0 -118
  298. package/dist/legacy-root-azm/src/semantics/semanticsDiagnostics.d.ts +0 -2
  299. package/dist/legacy-root-azm/src/semantics/semanticsDiagnostics.js +0 -4
  300. package/dist/legacy-root-azm/src/semantics/typeQueries.d.ts +0 -31
  301. package/dist/legacy-root-azm/src/semantics/typeQueries.js +0 -124
  302. package/dist/legacy-root-azm/src/sourceIncludeExpansion.d.ts +0 -17
  303. package/dist/legacy-root-azm/src/sourceIncludeExpansion.js +0 -124
  304. package/dist/legacy-root-azm/src/sourceIncludePaths.d.ts +0 -1
  305. package/dist/legacy-root-azm/src/sourceIncludePaths.js +0 -12
  306. package/dist/legacy-root-azm/src/sourceLoader.d.ts +0 -15
  307. package/dist/legacy-root-azm/src/sourceLoader.js +0 -118
  308. package/dist/legacy-root-azm/src/z80/effects.d.ts +0 -3
  309. package/dist/legacy-root-azm/src/z80/effects.js +0 -516
  310. package/dist/legacy-root-azm/src/z80/encode.d.ts +0 -10
  311. package/dist/legacy-root-azm/src/z80/encode.js +0 -412
  312. package/dist/legacy-root-azm/src/z80/encodeAlu.d.ts +0 -7
  313. package/dist/legacy-root-azm/src/z80/encodeAlu.js +0 -219
  314. package/dist/legacy-root-azm/src/z80/encodeBitOps.d.ts +0 -7
  315. package/dist/legacy-root-azm/src/z80/encodeBitOps.js +0 -123
  316. package/dist/legacy-root-azm/src/z80/encodeContext.d.ts +0 -29
  317. package/dist/legacy-root-azm/src/z80/encodeContext.js +0 -1
  318. package/dist/legacy-root-azm/src/z80/encodeControl.d.ts +0 -26
  319. package/dist/legacy-root-azm/src/z80/encodeControl.js +0 -180
  320. package/dist/legacy-root-azm/src/z80/encodeCoreOps.d.ts +0 -7
  321. package/dist/legacy-root-azm/src/z80/encodeCoreOps.js +0 -131
  322. package/dist/legacy-root-azm/src/z80/encodeIo.d.ts +0 -9
  323. package/dist/legacy-root-azm/src/z80/encodeIo.js +0 -128
  324. package/dist/legacy-root-azm/src/z80/encodeLd.d.ts +0 -13
  325. package/dist/legacy-root-azm/src/z80/encodeLd.js +0 -273
  326. package/dist/legacy-root-azm/src/z80/encoderRegistry.d.ts +0 -13
  327. package/dist/legacy-root-azm/src/z80/encoderRegistry.js +0 -169
  328. package/dist/src/outputs/write-listing.d.ts +0 -2
  329. package/dist/src/outputs/write-listing.js +0 -79
  330. /package/dist/{legacy-root-azm/src/registerCare → src/register-care}/annotate.d.ts +0 -0
  331. /package/dist/{legacy-root-azm/src/registerCare → src/register-care}/annotate.js +0 -0
  332. /package/dist/{legacy-root-azm/src/registerCare → src/register-care}/sourceText.d.ts +0 -0
  333. /package/dist/{legacy-root-azm/src/registerCare → src/register-care}/sourceText.js +0 -0
  334. /package/dist/{legacy-root-azm/src/registerCare → src/register-care}/summary.d.ts +0 -0
@@ -1,5 +1,5 @@
1
1
  import { getRegisterCareProfile } from './profiles.js';
2
- import { getZ80InstructionEffect } from '../z80/effects.js';
2
+ import { inferRoutineSummariesToFixedPoint, summariesWithExternalContracts, } from './routine-summaries.js';
3
3
  function unique(values) {
4
4
  const out = [];
5
5
  for (const value of values) {
@@ -8,22 +8,16 @@ function unique(values) {
8
8
  }
9
9
  return out;
10
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
- };
11
+ function isLocalLabel(name) {
12
+ return name.startsWith('.');
13
+ }
14
+ function boundaryLabels(routine) {
15
+ return routine.entryLabels.length > 0
16
+ ? routine.entryLabels
17
+ : routine.labels.filter((label) => !isLocalLabel(label));
18
+ }
19
+ function routineNameSet(routines) {
20
+ return new Set(routines.flatMap((routine) => boundaryLabels(routine)));
27
21
  }
28
22
  export function buildProfileSummaries(profileName) {
29
23
  const profile = getRegisterCareProfile(profileName);
@@ -46,48 +40,13 @@ export function buildProfileSummaryLookup(profileName) {
46
40
  return out;
47
41
  }
48
42
  export function routineNames(routines) {
49
- return routines.flatMap((routine) => routine.entryLabels.length > 0 ? routine.entryLabels : [routine.name]);
43
+ return routines.flatMap((routine) => boundaryLabels(routine));
50
44
  }
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;
45
+ export function buildSummaries(routines, contractMap, profileSummaries = []) {
46
+ const names = routineNameSet(routines);
47
+ const routineSummaries = inferRoutineSummariesToFixedPoint([...routines], contractMap, names, [...profileSummaries]);
48
+ const summaries = routineSummaries.map((item) => item.summary);
49
+ return summariesWithExternalContracts(summaries, contractMap, names);
91
50
  }
92
51
  export function buildSummaryByName(routines, summaries, profileSummaries = []) {
93
52
  const out = new Map();
@@ -103,7 +62,7 @@ export function buildSummaryByName(routines, summaries, profileSummaries = []) {
103
62
  const routineSummary = byRoutine.get(routine.name);
104
63
  if (routineSummary === undefined)
105
64
  continue;
106
- for (const alias of routine.entryLabels.length > 0 ? routine.entryLabels : [routine.name]) {
65
+ for (const alias of boundaryLabels(routine)) {
107
66
  out.set(alias, routineSummary);
108
67
  }
109
68
  }
@@ -118,28 +77,36 @@ export function withAcceptedOutputs(summaries, acceptedOutputCandidates) {
118
77
  if (!accepted || accepted.length === 0) {
119
78
  return summary;
120
79
  }
121
- const merged = unique([...summary.mayWrite, ...accepted]);
122
- return {
123
- ...summary,
124
- mayWrite: merged,
125
- mayOutput: unique([...accepted]),
126
- };
80
+ const written = new Set(summary.mayWrite);
81
+ const promoted = accepted.filter((unit) => written.has(unit));
82
+ if (promoted.length === 0) {
83
+ return summary;
84
+ }
85
+ const valueRelations = [...summary.valueRelations];
86
+ for (const unit of promoted) {
87
+ if (!valueRelations.some((relation) => relation.out.includes(unit))) {
88
+ valueRelations.push({ out: [unit], from: [] });
89
+ }
90
+ }
91
+ return { ...summary, valueRelations };
127
92
  });
128
93
  }
129
- export function unknownBoundaryDiagnostics(directCalls, knownRoutines) {
130
- return directCalls
131
- .filter((call) => !knownRoutines.has(call.target))
132
- .map((call) => ({
94
+ export function unknownBoundaryDiagnostics(directBoundaries, knownRoutines) {
95
+ return directBoundaries
96
+ .filter((boundary) => !knownRoutines.has(boundary.target))
97
+ .map((boundary) => ({
133
98
  severity: 'warning',
134
99
  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,
100
+ message: `Register-care cannot prove ${boundary.subject}; add a routine body or .asmi extern contract.`,
101
+ sourceName: boundary.file,
102
+ line: boundary.line,
103
+ column: boundary.column,
139
104
  }));
140
105
  }
141
- export function unknownCallList(directCalls, knownRoutines) {
142
- return unique(directCalls.filter((call) => !knownRoutines.has(call.target)).map((call) => call.target)).sort();
106
+ export function unknownCallList(directBoundaries, knownRoutines) {
107
+ return unique(directBoundaries
108
+ .filter((boundary) => !knownRoutines.has(boundary.target))
109
+ .map((boundary) => boundary.target)).sort();
143
110
  }
144
111
  export function buildOutputCandidateFixability(routines, outputCandidates, autoFixableCandidateKeys) {
145
112
  const autoFixable = autoFixableCandidateKeys([...routines], [...outputCandidates]);
@@ -1,6 +1,7 @@
1
1
  import { getZ80InstructionEffect } from '../z80/effects.js';
2
+ import { instructionHead, instructionOperand, instructionOperandCount, isAccumulatorSelfOperand, isImmediateZeroOperand, isPureTokenTransferInstruction, isRegisterOperand, isUnconditionalReturnInstruction, regName, } from './instruction-shape.js';
2
3
  import { precedingCServiceName } from './boundaryHints.js';
3
- import { expandCarrier } from './carriers.js';
4
+ import { expandCarrierList } from './carriers.js';
4
5
  import { rstServiceTargetName, rstTargetName } from './profiles.js';
5
6
  const FLAG_UNIT_LIST = ['carry', 'zero', 'sign', 'parity', 'halfCarry'];
6
7
  const TRACKED_UNITS = [
@@ -32,7 +33,7 @@ function isTrackedUnit(unit) {
32
33
  return TRACKED_UNITS.includes(unit);
33
34
  }
34
35
  function getRegisterUnits(name) {
35
- return expandCarrier(name);
36
+ return expandCarrierList([name]);
36
37
  }
37
38
  function readToken(tokens, unit) {
38
39
  return tokens.get(unit) ?? { origin: 'unknown' };
@@ -54,7 +55,7 @@ function markProducedReadsConsumed(tokens, consumedProduced, reads, writes, item
54
55
  for (const unit of reads) {
55
56
  if (!isTrackedUnit(unit) || writes.has(unit))
56
57
  continue;
57
- if (item?.head.toLowerCase() === 'cp' && unit === 'A')
58
+ if (item !== undefined && instructionHead(item) === 'cp' && unit === 'A')
58
59
  continue;
59
60
  if (readToken(tokens, unit).origin === 'produced')
60
61
  consumedProduced.add(unit);
@@ -67,7 +68,7 @@ function isOpaqueBoundary(item, effect) {
67
68
  if (effect.control.kind === 'call' || effect.control.kind === 'rst')
68
69
  return true;
69
70
  return (effect.control.kind === 'jump' &&
70
- item.head.toLowerCase() === 'jp' &&
71
+ (instructionHead(item) === 'jp' || instructionHead(item) === 'jp-cc') &&
71
72
  !effect.control.conditional &&
72
73
  Boolean(effect.control.target) &&
73
74
  !effect.control.target?.startsWith('.'));
@@ -81,7 +82,7 @@ function boundarySummary(routine, index, summaries) {
81
82
  return summaries.get(effect.control.target);
82
83
  }
83
84
  if (effect.control.kind === 'jump' &&
84
- item.head.toLowerCase() === 'jp' &&
85
+ (instructionHead(item) === 'jp' || instructionHead(item) === 'jp-cc') &&
85
86
  effect.control.target &&
86
87
  !effect.control.target.startsWith('.') &&
87
88
  !routine.labels.includes(effect.control.target)) {
@@ -147,46 +148,23 @@ function contractOutRelation(contractIn, contractOut) {
147
148
  };
148
149
  }
149
150
  function isUnconditionalReturn(item) {
150
- const head = item.head.toLowerCase();
151
- if (head === 'ret')
152
- return item.instruction.operands.length === 0;
153
- return head === 'retn' || head === 'reti';
151
+ return isUnconditionalReturnInstruction(item);
154
152
  }
155
153
  function isPureTokenTransfer(item) {
156
- const inst = item.instruction;
157
- const head = item.head.toLowerCase();
158
- if (head === 'ex')
159
- return true;
160
- if (head !== 'ld' || inst.operands.length !== 2)
161
- return false;
162
- const dst = inst.operands[0];
163
- const src = inst.operands[1];
164
- if (dst?.kind !== 'Reg')
165
- return false;
166
- return src?.kind === 'Reg' || src?.kind === 'Imm';
167
- }
168
- function isAccumulatorSelfOperand(item) {
169
- const operand = item.instruction.operands[0];
170
- return operand?.kind === 'Reg' && operand.name.toUpperCase() === 'A';
171
- }
172
- function isImmediateZeroOperand(item) {
173
- const operand = item.instruction.operands[0];
174
- return operand?.kind === 'Imm' && operand.expr.kind === 'ImmLiteral' && operand.expr.value === 0;
175
- }
176
- function isRegisterOperand(item, index, name) {
177
- const operand = item?.instruction.operands[index];
178
- return operand?.kind === 'Reg' && operand.name.toUpperCase() === name;
154
+ return isPureTokenTransferInstruction(item);
179
155
  }
180
156
  function isCarryClearBeforeSbcHl(item, next) {
181
- const head = item.head.toLowerCase();
157
+ const head = instructionHead(item).toLowerCase();
182
158
  if (head !== 'or' && head !== 'and')
183
159
  return false;
184
160
  if (!isAccumulatorSelfOperand(item))
185
161
  return false;
186
- return next?.head.toLowerCase() === 'sbc' && isRegisterOperand(next, 0, 'HL');
162
+ return (next !== undefined &&
163
+ instructionHead(next) === 'sbc' &&
164
+ isRegisterOperand(next, 0, 'HL'));
187
165
  }
188
166
  function intentOutputUnits(item) {
189
- const head = item.head.toLowerCase();
167
+ const head = instructionHead(item).toLowerCase();
190
168
  if (head === 'scf' || head === 'ccf')
191
169
  return ['carry'];
192
170
  if (head === 'cp')
@@ -197,7 +175,7 @@ function intentOutputUnits(item) {
197
175
  return [];
198
176
  }
199
177
  function isMechanicalResidueWrite(item, unit) {
200
- const head = item.head.toLowerCase();
178
+ const head = instructionHead(item).toLowerCase();
201
179
  if (head === 'djnz')
202
180
  return unit === 'B';
203
181
  if (head === 'ldi' || head === 'ldir' || head === 'ldd' || head === 'lddr') {
@@ -207,16 +185,18 @@ function isMechanicalResidueWrite(item, unit) {
207
185
  }
208
186
  function applyPureTokenTransfer(tokens, consumedProduced, item) {
209
187
  const inst = item.instruction;
210
- const head = item.head.toLowerCase();
211
- if (head === 'ld' && inst.operands.length === 2) {
212
- const dst = inst.operands[0];
213
- const src = inst.operands[1];
214
- if (dst?.kind !== 'Reg')
188
+ const head = instructionHead(item).toLowerCase();
189
+ if (head === 'ld' && instructionOperandCount(inst) === 2) {
190
+ const dst = instructionOperand(inst, 0);
191
+ const src = instructionOperand(inst, 1);
192
+ const dstName = regName(dst);
193
+ if (dstName === undefined)
215
194
  return [];
216
- const dstUnits = dst.kind === 'Reg' ? getRegisterUnits(dst.name) : undefined;
195
+ const dstUnits = getRegisterUnits(dstName);
217
196
  if (!dstUnits)
218
197
  return [];
219
- const srcUnits = src?.kind === 'Reg' ? getRegisterUnits(src.name) : undefined;
198
+ const srcName = regName(src);
199
+ const srcUnits = srcName ? getRegisterUnits(srcName) : undefined;
220
200
  if (srcUnits && srcUnits.length === dstUnits.length) {
221
201
  dstUnits.forEach((unit, index) => {
222
202
  tokens.set(unit, readToken(tokens, srcUnits[index]));
@@ -234,13 +214,15 @@ function applyPureTokenTransfer(tokens, consumedProduced, item) {
234
214
  }
235
215
  return dstUnits;
236
216
  }
237
- if (head === 'ex' && inst.operands.length === 2) {
238
- const left = inst.operands[0];
239
- const right = inst.operands[1];
240
- if (left?.kind !== 'Reg' || right?.kind !== 'Reg')
217
+ if (head === 'ex' && instructionOperandCount(inst) === 2) {
218
+ const left = instructionOperand(inst, 0);
219
+ const right = instructionOperand(inst, 1);
220
+ const leftName = regName(left);
221
+ const rightName = regName(right);
222
+ if (leftName === undefined || rightName === undefined)
241
223
  return [];
242
- const leftUnits = getRegisterUnits(left.name);
243
- const rightUnits = getRegisterUnits(right.name);
224
+ const leftUnits = getRegisterUnits(leftName);
225
+ const rightUnits = getRegisterUnits(rightName);
244
226
  if (!leftUnits || !rightUnits || leftUnits.length !== rightUnits.length)
245
227
  return [];
246
228
  const leftTokens = leftUnits.map((unit) => readToken(tokens, unit));
@@ -308,7 +290,7 @@ export function inferRoutineSummary(routine, boundarySummaries = new Map()) {
308
290
  mayRead.push(...semanticReadOrigins(tokens, semanticReads));
309
291
  markProducedReadsConsumed(tokens, consumedProduced, semanticReads, effectWrites, item);
310
292
  }
311
- if (item.head.toLowerCase() === 'djnz') {
293
+ if (instructionHead(item).toLowerCase() === 'djnz') {
312
294
  for (const unit of TRACKED_UNITS) {
313
295
  if (readToken(tokens, unit).origin === 'produced')
314
296
  consumedProduced.add(unit);
@@ -379,7 +361,7 @@ export function inferRoutineSummary(routine, boundarySummaries = new Map()) {
379
361
  if (transferWrites.has(unit) && isTrackedUnit(unit))
380
362
  continue;
381
363
  if (unit === 'A' &&
382
- (item.head.toLowerCase() === 'or' || item.head.toLowerCase() === 'and') &&
364
+ (instructionHead(item).toLowerCase() === 'or' || instructionHead(item).toLowerCase() === 'and') &&
383
365
  isAccumulatorSelfOperand(item)) {
384
366
  if (!carryClearBeforeSbcHl)
385
367
  intendedProduced.add(unit);
@@ -64,6 +64,7 @@ export interface RegisterCareRoutine {
64
64
  }
65
65
  export interface RegisterCareDirectCall {
66
66
  target: string;
67
+ subject: string;
67
68
  file: string;
68
69
  line: number;
69
70
  column: number;
@@ -71,6 +72,7 @@ export interface RegisterCareDirectCall {
71
72
  export interface RegisterCareProgramModel {
72
73
  routines: RegisterCareRoutine[];
73
74
  directCalls: RegisterCareDirectCall[];
75
+ directBoundaries: RegisterCareDirectCall[];
74
76
  }
75
77
  export type StackEffect = {
76
78
  kind: 'none';
@@ -121,7 +123,10 @@ export interface RoutineSummary {
121
123
  mayWrite: RegisterCareUnit[];
122
124
  mayOutput?: RegisterCareUnit[];
123
125
  preserved: RegisterCareUnit[];
124
- valueRelations?: ValueRelation[];
126
+ valueRelations: ValueRelation[];
127
+ stackBalanced: boolean;
128
+ hasUnknownStackEffect?: boolean;
129
+ outputCandidates?: RegisterCareUnit[];
125
130
  }
126
131
  export interface RegisterCareOutputCandidate {
127
132
  file: string;
@@ -1,5 +1,5 @@
1
1
  import type { Diagnostic } from '../model/diagnostic.js';
2
- import type { Expression } from '../model/expression.js';
2
+ import type { Expression, TypeExpr } from '../model/expression.js';
3
3
  import type { LayoutField } from '../model/source-item.js';
4
4
  import type { SourceSpan } from '../source/source-span.js';
5
5
  export interface EquateRecord {
@@ -9,11 +9,15 @@ export interface EquateRecord {
9
9
  readonly enumMember?: boolean;
10
10
  readonly stringValue?: string;
11
11
  }
12
- export interface LayoutRecord {
12
+ export type LayoutRecord = {
13
13
  readonly kind: 'record' | 'union';
14
14
  readonly fields: readonly LayoutField[];
15
15
  readonly span: SourceSpan;
16
- }
16
+ } | {
17
+ readonly kind: 'alias';
18
+ readonly typeExpr: TypeExpr;
19
+ readonly span: SourceSpan;
20
+ };
17
21
  export declare function lookupEquateRecord(equates: ReadonlyMap<string, EquateRecord>, name: string): {
18
22
  readonly key: string;
19
23
  readonly record: EquateRecord;
@@ -39,6 +39,8 @@ export function evaluateExpression(expression, labels, equates, span, diagnostic
39
39
  return evaluateTypeSize(expression.typeExpr, labels, equates, span, diagnostics, options);
40
40
  case 'sizeof':
41
41
  return evaluateSizeof(expression.typeExpr, options.layouts, span, diagnostics);
42
+ case 'byte-function':
43
+ return evaluateByteFunction(expression, labels, equates, span, diagnostics, options);
42
44
  case 'offset':
43
45
  return evaluateOffset(expression.typeExpr, expression.path, options.layouts, span, diagnostics);
44
46
  case 'layout-cast':
@@ -51,6 +53,13 @@ export function evaluateExpression(expression, labels, equates, span, diagnostic
51
53
  return evaluateBinary(expression, labels, equates, span, diagnostics, options);
52
54
  }
53
55
  }
56
+ function evaluateByteFunction(expression, labels, equates, span, diagnostics, options) {
57
+ const value = evaluateExpression(expression.expression, labels, equates, span, diagnostics, options);
58
+ if (value === undefined) {
59
+ return undefined;
60
+ }
61
+ return expression.function === 'LSB' ? value & 0xff : (value >> 8) & 0xff;
62
+ }
54
63
  function evaluateTypeSize(typeExpr, labels, equates, span, diagnostics, options) {
55
64
  if (options.layouts) {
56
65
  const sizeDiagnostics = [];
@@ -146,6 +155,13 @@ function evaluateOffset(typeExpr, path, layouts, span, diagnostics) {
146
155
  return undefined;
147
156
  }
148
157
  function typeExprSize(typeExpr, layouts, span, diagnostics, visiting) {
158
+ const resolvedTypeExpr = resolveLayoutAlias(typeExpr, layouts, span, diagnostics, visiting);
159
+ if (!resolvedTypeExpr) {
160
+ return undefined;
161
+ }
162
+ if (resolvedTypeExpr !== typeExpr) {
163
+ return typeExprSize(resolvedTypeExpr, layouts, span, diagnostics, visiting);
164
+ }
149
165
  const scalar = scalarSize(typeExpr.name);
150
166
  const baseSize = scalar ??
151
167
  (() => {
@@ -162,6 +178,9 @@ function typeExprSize(typeExpr, layouts, span, diagnostics, visiting) {
162
178
  return typeExpr.length === undefined ? baseSize : baseSize * typeExpr.length;
163
179
  }
164
180
  function layoutSize(typeName, layout, layouts, span, diagnostics, visiting) {
181
+ if (layout.kind === 'alias') {
182
+ return typeExprSize(layout.typeExpr, layouts, span, diagnostics, visiting);
183
+ }
165
184
  const fieldSizes = [];
166
185
  for (const field of layout.fields) {
167
186
  const size = fieldSize(field, layouts, span, diagnostics, visiting);
@@ -187,6 +206,13 @@ function fieldSize(field, layouts, span, diagnostics, visiting) {
187
206
  return typeExprSize(field.typeExpr, layouts, span, diagnostics, new Set([...visiting, field.typeExpr.name]));
188
207
  }
189
208
  function offsetPath(typeExpr, parts, layouts, span, diagnostics) {
209
+ const resolvedTypeExpr = resolveLayoutAlias(typeExpr, layouts, span, diagnostics, new Set([typeExpr.name]));
210
+ if (!resolvedTypeExpr) {
211
+ return undefined;
212
+ }
213
+ if (resolvedTypeExpr !== typeExpr) {
214
+ return offsetPath(resolvedTypeExpr, parts, layouts, span, diagnostics);
215
+ }
190
216
  const [head, ...tail] = parts;
191
217
  if (head === undefined) {
192
218
  return undefined;
@@ -218,6 +244,9 @@ function offsetPath(typeExpr, parts, layouts, span, diagnostics) {
218
244
  diagnostics.push(diagnostic(span, `unknown type: ${typeExpr.name}`));
219
245
  return undefined;
220
246
  }
247
+ if (layout.kind === 'alias') {
248
+ return offsetPath(layout.typeExpr, parts, layouts, span, diagnostics);
249
+ }
221
250
  let currentOffset = 0;
222
251
  for (const field of layout.fields) {
223
252
  const fieldOffset = layout.kind === 'union' ? 0 : currentOffset;
@@ -246,6 +275,13 @@ function offsetPath(typeExpr, parts, layouts, span, diagnostics) {
246
275
  return undefined;
247
276
  }
248
277
  function layoutCastOffset(typeExpr, parts, labels, equates, layouts, span, diagnostics, options) {
278
+ const resolvedTypeExpr = resolveLayoutAlias(typeExpr, layouts, span, diagnostics, new Set([typeExpr.name]));
279
+ if (!resolvedTypeExpr) {
280
+ return undefined;
281
+ }
282
+ if (resolvedTypeExpr !== typeExpr) {
283
+ return layoutCastOffset(resolvedTypeExpr, parts, labels, equates, layouts, span, diagnostics, options);
284
+ }
249
285
  const [head, ...tail] = parts;
250
286
  if (head === undefined) {
251
287
  return 0;
@@ -286,6 +322,9 @@ function layoutCastOffset(typeExpr, parts, labels, equates, layouts, span, diagn
286
322
  diagnostics.push(diagnostic(span, `unknown type: ${typeExpr.name}`));
287
323
  return undefined;
288
324
  }
325
+ if (layout.kind === 'alias') {
326
+ return layoutCastOffset(layout.typeExpr, parts, labels, equates, layouts, span, diagnostics, options);
327
+ }
289
328
  let currentOffset = 0;
290
329
  for (const field of layout.fields) {
291
330
  const fieldOffset = layout.kind === 'union' ? 0 : currentOffset;
@@ -330,6 +369,24 @@ function registerIndexName(expression) {
330
369
  function formatTypeExpr(typeExpr) {
331
370
  return typeExpr.length === undefined ? typeExpr.name : `${typeExpr.name}[${typeExpr.length}]`;
332
371
  }
372
+ function resolveLayoutAlias(typeExpr, layouts, span, diagnostics, visiting) {
373
+ const layout = layouts.get(typeExpr.name);
374
+ if (!layout || layout.kind !== 'alias') {
375
+ return typeExpr;
376
+ }
377
+ if (visiting.has(layout.typeExpr.name)) {
378
+ diagnostics.push(diagnostic(span, `recursive type: ${typeExpr.name}`));
379
+ return undefined;
380
+ }
381
+ const target = resolveLayoutAlias(layout.typeExpr, layouts, span, diagnostics, new Set([...visiting, layout.typeExpr.name]));
382
+ if (!target) {
383
+ return undefined;
384
+ }
385
+ const length = typeExpr.length === undefined
386
+ ? target.length
387
+ : (target.length ?? 1) * typeExpr.length;
388
+ return length === undefined ? { name: target.name } : { name: target.name, length };
389
+ }
333
390
  function formatOffsetPath(path) {
334
391
  return path.map((part) => (part.kind === 'field' ? part.name : `[${part.index}]`)).join('.');
335
392
  }
@@ -2,3 +2,5 @@
2
2
  * Remove an ASM80-style end-of-line comment (`;`), respecting quoted strings.
3
3
  */
4
4
  export declare function stripLineComment(text: string): string;
5
+ /** Trailing `;` comment text, or undefined when absent or whitespace-only. */
6
+ export declare function extractLineComment(text: string): string | undefined;
@@ -25,3 +25,29 @@ export function stripLineComment(text) {
25
25
  }
26
26
  return text;
27
27
  }
28
+ /** Trailing `;` comment text, or undefined when absent or whitespace-only. */
29
+ export function extractLineComment(text) {
30
+ let quote;
31
+ let escaped = false;
32
+ for (let index = 0; index < text.length; index += 1) {
33
+ const char = text[index];
34
+ if (escaped) {
35
+ escaped = false;
36
+ continue;
37
+ }
38
+ if (char === '\\' && quote) {
39
+ escaped = true;
40
+ continue;
41
+ }
42
+ if ((char === '"' || char === "'") &&
43
+ !(char === "'" && quote === undefined && /[A-Za-z0-9_]/.test(text[index - 1] ?? ''))) {
44
+ quote = quote === char ? undefined : (quote ?? char);
45
+ continue;
46
+ }
47
+ if (char === ';' && !quote) {
48
+ const comment = text.slice(index + 1).trim();
49
+ return comment.length > 0 ? comment : undefined;
50
+ }
51
+ }
52
+ return undefined;
53
+ }
@@ -160,14 +160,14 @@ export function normalizeDirectiveAlias(text, policy = DEFAULT_DIRECTIVE_ALIAS_P
160
160
  if (label) {
161
161
  return `${leading}${label[1]} ${normalizeHead(label[2] ?? '', policy)}`;
162
162
  }
163
- const equ = /^([A-Za-z_.$?][A-Za-z0-9_.$?]*)\s+([A-Za-z]+)\b(.*)$/.exec(trimmed);
163
+ const equ = /^([A-Za-z_.$?][A-Za-z0-9_.$?]*)\s+([A-Za-z][A-Za-z0-9_]*)\b(.*)$/.exec(trimmed);
164
164
  if (equ && resolveDirectiveAlias(equ[2] ?? '', policy) === '.equ') {
165
165
  return `${leading}${equ[1]} .equ${equ[3] ?? ''}`;
166
166
  }
167
167
  return `${leading}${normalizeHead(trimmed, policy)}`;
168
168
  }
169
169
  function normalizeHead(text, policy) {
170
- const head = /^([A-Za-z]+)\b(.*)$/.exec(text);
170
+ const head = /^([A-Za-z][A-Za-z0-9_]*)\b(.*)$/.exec(text);
171
171
  if (!head) {
172
172
  return text;
173
173
  }
@@ -181,7 +181,7 @@ function normalizeAliasKey(key) {
181
181
  const trimmed = key.trim();
182
182
  if (!/^[.]?[A-Za-z][A-Za-z0-9_]*$/.test(trimmed))
183
183
  return undefined;
184
- return trimmed.replace(/^\./, '').toUpperCase();
184
+ return trimmed.replace(/^\./, '');
185
185
  }
186
186
  function normalizeAliasTarget(value) {
187
187
  const trimmed = value.trim().toLowerCase();
@@ -189,11 +189,10 @@ function normalizeAliasTarget(value) {
189
189
  return CANONICAL_DIRECTIVES.has(dotted) ? dotted : undefined;
190
190
  }
191
191
  function resolveDirectiveAlias(head, policy) {
192
- const key = normalizeAliasKey(head);
193
- if (!key)
194
- return undefined;
195
- const dotted = `.${key.toLowerCase()}`;
196
- if (head.trim().startsWith('.') && CANONICAL_DIRECTIVES.has(dotted))
197
- return dotted;
198
- return policy.directiveAliases.get(key);
192
+ const trimmed = head.trim();
193
+ if (trimmed.startsWith('.')) {
194
+ return CANONICAL_DIRECTIVES.has(trimmed) ? trimmed : undefined;
195
+ }
196
+ const key = head.trim();
197
+ return /^[A-Za-z][A-Za-z0-9_]*$/.test(key) ? policy.directiveAliases.get(key) : undefined;
199
198
  }
@@ -0,0 +1,12 @@
1
+ import type { Diagnostic, DiagnosticId, DiagnosticSeverity } from '../model/diagnostic.js';
2
+ type ParseDiagLocation = {
3
+ line: number;
4
+ column: number;
5
+ };
6
+ /** Push a parse diagnostic with Next default code/severity (`AZMN_PARSE` / error). */
7
+ export declare function parseDiag(diagnostics: Diagnostic[], sourceName: string, message: string, where?: ParseDiagLocation): void;
8
+ /** Push a parse diagnostic at an explicit 1-based line/column. */
9
+ export declare function parseDiagAt(diagnostics: Diagnostic[], sourceName: string, message: string, line: number, column: number): void;
10
+ /** Push a diagnostic with explicit code, severity, and optional location. */
11
+ export declare function parseDiagAtWithId(diagnostics: Diagnostic[], sourceName: string, code: DiagnosticId | string, severity: DiagnosticSeverity, message: string, where?: ParseDiagLocation): void;
12
+ export {};
@@ -0,0 +1,18 @@
1
+ /** Push a parse diagnostic with Next default code/severity (`AZMN_PARSE` / error). */
2
+ export function parseDiag(diagnostics, sourceName, message, where) {
3
+ parseDiagAtWithId(diagnostics, sourceName, 'AZMN_PARSE', 'error', message, where);
4
+ }
5
+ /** Push a parse diagnostic at an explicit 1-based line/column. */
6
+ export function parseDiagAt(diagnostics, sourceName, message, line, column) {
7
+ parseDiag(diagnostics, sourceName, message, { line, column });
8
+ }
9
+ /** Push a diagnostic with explicit code, severity, and optional location. */
10
+ export function parseDiagAtWithId(diagnostics, sourceName, code, severity, message, where) {
11
+ diagnostics.push({
12
+ code,
13
+ severity,
14
+ message,
15
+ sourceName,
16
+ ...(where ? { line: where.line, column: where.column } : {}),
17
+ });
18
+ }