@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
@@ -36,7 +36,7 @@ export function parseExpression(text) {
36
36
  }
37
37
  if (token.kind === 'symbol') {
38
38
  const next = tokenList[index + 1];
39
- if (token.text.toLowerCase() === 'sizeof' && next?.kind === 'left-paren') {
39
+ if (token.text === 'sizeof' && next?.kind === 'left-paren') {
40
40
  index += 2;
41
41
  const typeName = tokenList[index];
42
42
  if (typeName?.kind !== 'symbol' || tokenList[index + 1]?.kind !== 'right-paren') {
@@ -45,7 +45,7 @@ export function parseExpression(text) {
45
45
  index += 2;
46
46
  return { kind: 'sizeof', typeExpr: { name: typeName.text } };
47
47
  }
48
- if (token.text.toLowerCase() === 'offset' && next?.kind === 'left-paren') {
48
+ if (token.text === 'offset' && next?.kind === 'left-paren') {
49
49
  index += 2;
50
50
  const typeName = tokenList[index];
51
51
  const comma = tokenList[index + 1];
@@ -133,12 +133,12 @@ function parseLayoutExpression(text) {
133
133
  if (layoutCast) {
134
134
  return layoutCast;
135
135
  }
136
- const sizeof = /^sizeof\s*\((.*)\)$/i.exec(trimmed);
136
+ const sizeof = /^sizeof\s*\((.*)\)$/.exec(trimmed);
137
137
  if (sizeof) {
138
138
  const typeExpr = parseTypeExpr(sizeof[1] ?? '');
139
139
  return typeExpr ? { kind: 'sizeof', typeExpr } : undefined;
140
140
  }
141
- const offset = /^offset\s*\((.*),(.*)\)$/i.exec(trimmed);
141
+ const offset = /^offset\s*\((.*),(.*)\)$/.exec(trimmed);
142
142
  if (offset) {
143
143
  const typeExpr = parseTypeExpr(offset[1] ?? '');
144
144
  const path = parseOffsetPath(offset[2] ?? '');
@@ -317,7 +317,7 @@ function tokenizeExpression(text) {
317
317
  index += 1;
318
318
  continue;
319
319
  }
320
- if (char === "'" || char === '"') {
320
+ if (char === "'") {
321
321
  const quoted = scanQuotedByte(input, index, char);
322
322
  if (!quoted) {
323
323
  return undefined;
@@ -326,7 +326,7 @@ function tokenizeExpression(text) {
326
326
  index = quoted.end;
327
327
  continue;
328
328
  }
329
- const layoutTerm = scanLayoutTerm(input, index);
329
+ const layoutTerm = scanSpecialTerm(input, index);
330
330
  if (layoutTerm) {
331
331
  tokens.push({ kind: 'expression', expression: layoutTerm.expression });
332
332
  index = layoutTerm.end;
@@ -353,9 +353,34 @@ function tokenizeExpression(text) {
353
353
  }
354
354
  return tokens.length > 0 ? tokens : undefined;
355
355
  }
356
+ function scanSpecialTerm(input, start) {
357
+ const byteFunction = scanByteFunction(input, start);
358
+ if (byteFunction) {
359
+ return byteFunction;
360
+ }
361
+ return scanLayoutTerm(input, start);
362
+ }
363
+ function scanByteFunction(input, start) {
364
+ const head = /^(LSB|MSB)\s*\(/.exec(input.slice(start));
365
+ if (!head) {
366
+ return undefined;
367
+ }
368
+ const name = head[1];
369
+ const open = input.indexOf('(', start + name.length);
370
+ if (open === -1 || input.slice(start + name.length, open).trim().length > 0) {
371
+ return undefined;
372
+ }
373
+ const close = findMatchingParen(input, open);
374
+ if (close === undefined) {
375
+ return undefined;
376
+ }
377
+ const expression = parseExpression(input.slice(open + 1, close));
378
+ return expression
379
+ ? { expression: { kind: 'byte-function', function: name, expression }, end: close + 1 }
380
+ : undefined;
381
+ }
356
382
  function scanLayoutTerm(input, start) {
357
- const lower = input.slice(start).toLowerCase();
358
- if (lower.startsWith('sizeof')) {
383
+ if (input.slice(start).startsWith('sizeof')) {
359
384
  const open = input.indexOf('(', start + 'sizeof'.length);
360
385
  if (open === -1 || input.slice(start + 'sizeof'.length, open).trim().length > 0) {
361
386
  return undefined;
@@ -367,7 +392,7 @@ function scanLayoutTerm(input, start) {
367
392
  const expression = parseLayoutExpression(input.slice(start, close + 1));
368
393
  return expression ? { expression, end: close + 1 } : undefined;
369
394
  }
370
- if (lower.startsWith('offset')) {
395
+ if (input.slice(start).startsWith('offset')) {
371
396
  const open = input.indexOf('(', start + 'offset'.length);
372
397
  if (open === -1 || input.slice(start + 'offset'.length, open).trim().length > 0) {
373
398
  return undefined;
@@ -1,38 +1,98 @@
1
- import { stripLineComment } from '../source/strip-line-comment.js';
1
+ import { extractLineComment, stripLineComment } from '../source/strip-line-comment.js';
2
2
  import { normalizeDirectiveAlias } from './directive-aliases.js';
3
3
  import { parseExpression, parseTypeExpr } from './parse-expression.js';
4
4
  import { parseZ80Instruction } from '../z80/parse-instruction.js';
5
5
  export function parseLogicalLine(line, options = {}) {
6
6
  const text = normalizeDirectiveAlias(stripLineComment(line.text), options.directiveAliasPolicy).trim();
7
7
  if (text.length === 0) {
8
- return { items: [], diagnostics: [] };
8
+ return commentOnlyLine(line);
9
9
  }
10
10
  const span = { sourceName: line.sourceName, line: line.line, column: firstColumn(line.text) };
11
11
  const labelWithStatement = /^(@?[A-Za-z_.$?][A-Za-z0-9_.$?]*):\s*(.+)$/.exec(text);
12
12
  if (labelWithStatement) {
13
- const labelName = normalizeEntryLabelName(labelWithStatement[1] ?? '');
13
+ const rawLabel = labelWithStatement[1] ?? '';
14
+ const labelName = normalizeEntryLabelName(rawLabel);
15
+ const isEntry = rawLabel.startsWith('@');
14
16
  const statementText = labelWithStatement[2] ?? '';
15
- const equStatement = parseColonLabelEqu(line, labelName, statementText, span);
16
- if (equStatement) {
17
- return equStatement;
17
+ const invalidDeclaration = parseColonDeclarationError(labelName, statementText);
18
+ if (invalidDeclaration) {
19
+ return { items: [], diagnostics: [parseError(line, invalidDeclaration)] };
18
20
  }
19
21
  const parsedStatement = parseCanonicalStatement(line, statementText, span);
20
- return {
21
- items: [{ kind: 'label', name: labelName, span }, ...parsedStatement.items],
22
+ return withLineComment(line, {
23
+ items: [{ kind: 'label', name: labelName, ...(isEntry ? { isEntry: true } : {}), span }, ...parsedStatement.items],
22
24
  diagnostics: parsedStatement.diagnostics,
23
- };
25
+ });
24
26
  }
25
27
  const labelOnly = /^(@?[A-Za-z_.$?][A-Za-z0-9_.$?]*):$/.exec(text);
26
28
  if (labelOnly) {
27
- return {
28
- items: [{ kind: 'label', name: normalizeEntryLabelName(labelOnly[1] ?? ''), span }],
29
+ const rawLabel = labelOnly[1] ?? '';
30
+ return withLineComment(line, {
31
+ items: [
32
+ {
33
+ kind: 'label',
34
+ name: normalizeEntryLabelName(rawLabel),
35
+ ...(rawLabel.startsWith('@') ? { isEntry: true } : {}),
36
+ span,
37
+ },
38
+ ],
29
39
  diagnostics: [],
30
- };
40
+ });
41
+ }
42
+ return withLineComment(line, parseCanonicalStatement(line, text, span));
43
+ }
44
+ function commentOnlyLine(line) {
45
+ const comment = extractLineComment(line.text);
46
+ if (!comment) {
47
+ return { items: [], diagnostics: [] };
48
+ }
49
+ return {
50
+ items: [
51
+ {
52
+ kind: 'comment',
53
+ text: comment,
54
+ origin: 'user',
55
+ span: {
56
+ sourceName: line.sourceName,
57
+ line: line.line,
58
+ column: firstColumn(line.text),
59
+ },
60
+ },
61
+ ],
62
+ diagnostics: [],
63
+ };
64
+ }
65
+ function withLineComment(line, result) {
66
+ const comment = extractLineComment(line.text);
67
+ if (!comment) {
68
+ return result;
31
69
  }
32
- return parseCanonicalStatement(line, text, span);
70
+ return {
71
+ items: [
72
+ ...result.items,
73
+ {
74
+ kind: 'comment',
75
+ text: comment,
76
+ origin: 'user',
77
+ span: {
78
+ sourceName: line.sourceName,
79
+ line: line.line,
80
+ column: firstColumn(line.text),
81
+ },
82
+ },
83
+ ],
84
+ diagnostics: result.diagnostics,
85
+ };
33
86
  }
34
87
  function parseEquItem(line, name, expressionText, span) {
35
88
  const stringValue = parseWholeQuotedString(expressionText.trim());
89
+ const quotePolicyError = parseEquQuotePolicyError(expressionText.trim());
90
+ if (quotePolicyError) {
91
+ return {
92
+ items: [],
93
+ diagnostics: [parseError(line, quotePolicyError)],
94
+ };
95
+ }
36
96
  const expression = stringValue !== undefined && stringValue.length > 1
37
97
  ? { kind: 'number', value: 0 }
38
98
  : parseExpression(expressionText);
@@ -55,19 +115,12 @@ function parseEquItem(line, name, expressionText, span) {
55
115
  diagnostics: [],
56
116
  };
57
117
  }
58
- function parseColonLabelEqu(line, name, text, span) {
59
- const equ = /^\.equ\s+(.+)$/i.exec(text);
60
- if (!equ) {
61
- return undefined;
62
- }
63
- return parseEquItem(line, name, equ[1] ?? '', span);
64
- }
65
118
  function parseCanonicalStatement(line, text, span) {
66
- const equ = /^([A-Za-z_.$?][A-Za-z0-9_.$?]*)\s+\.equ\s+(.+)$/i.exec(text);
119
+ const equ = /^([A-Za-z_.$?][A-Za-z0-9_.$?]*)\s+\.equ\s+(.+)$/.exec(text);
67
120
  if (equ) {
68
121
  return parseEquItem(line, equ[1] ?? '', equ[2] ?? '', span);
69
122
  }
70
- const org = /^\.org\s+(.+)$/i.exec(text);
123
+ const org = /^\.org\s+(.+)$/.exec(text);
71
124
  if (org) {
72
125
  const expressionText = org[1] ?? '';
73
126
  const expression = parseExpression(expressionText);
@@ -79,32 +132,18 @@ function parseCanonicalStatement(line, text, span) {
79
132
  }
80
133
  return { items: [{ kind: 'org', expression, span }], diagnostics: [] };
81
134
  }
82
- const enumDecl = /^enum\s+([A-Za-z_][A-Za-z0-9_]*)\s+(.+)$/i.exec(text);
135
+ const enumDecl = /^enum\s+([A-Za-z_][A-Za-z0-9_]*)\s+(.+)$/.exec(text);
83
136
  if (enumDecl) {
84
- const name = enumDecl[1] ?? '';
85
- const membersText = enumDecl[2] ?? '';
86
- const rawMembers = membersText.split(',').map((member) => member.trim());
87
- if (membersText.trim().length === 0 || rawMembers.some((member) => member.length === 0)) {
88
- return {
89
- items: [],
90
- diagnostics: [parseError(line, `invalid enum member list`)],
91
- };
92
- }
93
- const members = [];
94
- const diagnostics = [];
95
- for (const member of rawMembers) {
96
- if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(member)) {
97
- diagnostics.push(parseError(line, `Invalid enum member name "${member}": expected <identifier>.`));
98
- continue;
99
- }
100
- members.push(member);
101
- }
102
- if (diagnostics.length > 0) {
103
- return { items: [], diagnostics };
104
- }
105
- return { items: [{ kind: 'enum', name, members, span }], diagnostics: [] };
137
+ return {
138
+ items: [],
139
+ diagnostics: [parseError(line, `Use "${enumDecl[1] ?? ''} .enum ..." for enums.`)],
140
+ };
106
141
  }
107
- const data = /^(\.db|\.dw)\s+(.+)$/i.exec(text);
142
+ const nameLeftEnum = /^([A-Za-z_][A-Za-z0-9_]*)\s+\.enum\s+(.+)$/.exec(text);
143
+ if (nameLeftEnum) {
144
+ return parseEnumItem(line, nameLeftEnum[1] ?? '', nameLeftEnum[2] ?? '', span);
145
+ }
146
+ const data = /^(\.db|\.dw)\s+(.+)$/.exec(text);
108
147
  if (data) {
109
148
  const directive = (data[1] ?? '').slice(1).toLowerCase();
110
149
  const valueText = data[2] ?? '';
@@ -113,9 +152,10 @@ function parseCanonicalStatement(line, text, span) {
113
152
  ? parts.map(parseDataValue).filter((value) => value !== undefined)
114
153
  : parts.map(parseExpression).filter((value) => value !== undefined);
115
154
  if (values.length !== parts.length) {
155
+ const quotePolicyError = parts.map(parseDataQuotePolicyError).find(Boolean);
116
156
  return {
117
157
  items: [],
118
- diagnostics: [parseError(line, `invalid .${directive} value list`)],
158
+ diagnostics: [parseError(line, quotePolicyError ?? `invalid .${directive} value list`)],
119
159
  };
120
160
  }
121
161
  return {
@@ -125,7 +165,7 @@ function parseCanonicalStatement(line, text, span) {
125
165
  diagnostics: [],
126
166
  };
127
167
  }
128
- const ds = /^\.ds\s+(.+)$/i.exec(text);
168
+ const ds = /^\.ds\s+(.+)$/.exec(text);
129
169
  if (ds) {
130
170
  const parts = splitValueList(ds[1] ?? '');
131
171
  if (parts.length < 1 || parts.length > 2) {
@@ -155,7 +195,7 @@ function parseCanonicalStatement(line, text, span) {
155
195
  diagnostics: [],
156
196
  };
157
197
  }
158
- const align = /^\.align\s+(.+)$/i.exec(text);
198
+ const align = /^\.align\s+(.+)$/.exec(text);
159
199
  if (align) {
160
200
  const expressionText = align[1] ?? '';
161
201
  const alignment = parseExpression(expressionText);
@@ -167,10 +207,10 @@ function parseCanonicalStatement(line, text, span) {
167
207
  }
168
208
  return { items: [{ kind: 'align', alignment, span }], diagnostics: [] };
169
209
  }
170
- if (/^\.end\s*$/i.test(text)) {
210
+ if (/^\.end\s*$/.test(text)) {
171
211
  return { items: [{ kind: 'end', span }], diagnostics: [] };
172
212
  }
173
- const rangeControl = /^(\.binfrom|\.binto)\s+(.+)$/i.exec(text);
213
+ const rangeControl = /^(\.binfrom|\.binto)\s+(.+)$/.exec(text);
174
214
  if (rangeControl) {
175
215
  const kind = (rangeControl[1] ?? '').slice(1).toLowerCase();
176
216
  const expressionText = rangeControl[2] ?? '';
@@ -183,7 +223,7 @@ function parseCanonicalStatement(line, text, span) {
183
223
  }
184
224
  return { items: [{ kind, expression, span }], diagnostics: [] };
185
225
  }
186
- const stringData = /^(\.cstr|\.pstr|\.istr)\s+(.+)$/i.exec(text);
226
+ const stringData = /^(\.cstr|\.pstr|\.istr)\s+(.+)$/.exec(text);
187
227
  if (stringData) {
188
228
  const directive = (stringData[1] ?? '').slice(1).toLowerCase();
189
229
  const valueText = stringData[2] ?? '';
@@ -191,7 +231,7 @@ function parseCanonicalStatement(line, text, span) {
191
231
  if (value === undefined) {
192
232
  return {
193
233
  items: [],
194
- diagnostics: [parseError(line, `.${directive} expects one quoted string`)],
234
+ diagnostics: [parseError(line, `.${directive} expects one double-quoted string`)],
195
235
  };
196
236
  }
197
237
  return { items: [{ kind: 'string-data', directive, value, span }], diagnostics: [] };
@@ -214,6 +254,46 @@ function parseCanonicalStatement(line, text, span) {
214
254
  }
215
255
  return { items: [], diagnostics: [parseError(line, `unsupported source line: ${text}`)] };
216
256
  }
257
+ function parseColonDeclarationError(name, statementText) {
258
+ if (/^\.equ\b/.test(statementText)) {
259
+ return `Use "${name} .equ ..." for constants; colon labels mark addresses.`;
260
+ }
261
+ if (/^\.enum\b/.test(statementText)) {
262
+ return `Use "${name} .enum ..." for enums; colon labels mark addresses.`;
263
+ }
264
+ if (/^\.typealias\b/.test(statementText)) {
265
+ return `Use "${name} .typealias ..." for type aliases; colon labels mark addresses.`;
266
+ }
267
+ if (/^\.type\b/.test(statementText)) {
268
+ return `Use "${name} .type" for layouts; colon labels mark addresses.`;
269
+ }
270
+ if (/^\.union\b/.test(statementText)) {
271
+ return `Use "${name} .union" for layouts; colon labels mark addresses.`;
272
+ }
273
+ return undefined;
274
+ }
275
+ function parseEnumItem(line, name, membersText, span) {
276
+ const rawMembers = membersText.split(',').map((member) => member.trim());
277
+ if (membersText.trim().length === 0 || rawMembers.some((member) => member.length === 0)) {
278
+ return {
279
+ items: [],
280
+ diagnostics: [parseError(line, `invalid enum member list`)],
281
+ };
282
+ }
283
+ const members = [];
284
+ const diagnostics = [];
285
+ for (const member of rawMembers) {
286
+ if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(member)) {
287
+ diagnostics.push(parseError(line, `Invalid enum member name "${member}": expected <identifier>.`));
288
+ continue;
289
+ }
290
+ members.push(member);
291
+ }
292
+ if (diagnostics.length > 0) {
293
+ return { items: [], diagnostics };
294
+ }
295
+ return { items: [{ kind: 'enum', name, members, span }], diagnostics: [] };
296
+ }
217
297
  function parseTypeSizeExpression(text) {
218
298
  const typeExpr = parseTypeExpr(text);
219
299
  return typeExpr ? { kind: 'type-size', typeExpr } : undefined;
@@ -289,7 +369,7 @@ function parseDataValue(text) {
289
369
  function parseWholeQuotedString(text) {
290
370
  const input = text.trim();
291
371
  const quote = input[0];
292
- if ((quote !== '"' && quote !== "'") || input[input.length - 1] !== quote) {
372
+ if (quote !== '"' || input[input.length - 1] !== quote) {
293
373
  return undefined;
294
374
  }
295
375
  let value = '';
@@ -310,6 +390,22 @@ function parseWholeQuotedString(text) {
310
390
  }
311
391
  return value;
312
392
  }
393
+ function parseEquQuotePolicyError(text) {
394
+ if (!text.startsWith('"') || !text.endsWith('"')) {
395
+ return undefined;
396
+ }
397
+ const stringValue = parseWholeQuotedString(text);
398
+ return stringValue !== undefined && stringValue.length === 1
399
+ ? 'double-quoted values are strings; use single quotes for character literals'
400
+ : undefined;
401
+ }
402
+ function parseDataQuotePolicyError(text) {
403
+ const input = text.trim();
404
+ if (!input.startsWith("'") || !input.endsWith("'")) {
405
+ return undefined;
406
+ }
407
+ return 'single quotes are for one character literal; use double quotes for strings';
408
+ }
313
409
  function normalizeEntryLabelName(raw) {
314
410
  return raw.startsWith('@') ? raw.slice(1) : raw;
315
411
  }
@@ -68,6 +68,9 @@ function isPotentialOpInvocationLine(text) {
68
68
  return false;
69
69
  if (/^[A-Za-z_][A-Za-z0-9_]*\s+\.?equ\b/i.test(text))
70
70
  return false;
71
+ if (/^[A-Za-z_][A-Za-z0-9_]*\s+\.(?:enum|type|union|typealias|field|byte|word|addr)\b/.test(text)) {
72
+ return false;
73
+ }
71
74
  if (/^(?:op|end|enum|type|union|field|byte|word|addr)\b/i.test(text))
72
75
  return false;
73
76
  if (/^(?:org|equ|db|dw|ds|align|include|binfrom|binto|cstr|pstr|istr)\b/i.test(text)) {
@@ -55,7 +55,6 @@ same base path.
55
55
  | -------------- | -------------------------------- |
56
56
  | `.hex` | Intel HEX output |
57
57
  | `.bin` | flat binary output |
58
- | `.lst` | listing with bytes and symbols |
59
58
  | `.d8.json` | Debug80 map |
60
59
  | `.z80` | lowered assembler source |
61
60
  | `.regcare.txt` | register-care report |
@@ -64,7 +63,7 @@ same base path.
64
63
  Disable standard artifacts when they are not needed:
65
64
 
66
65
  ```sh
67
- azm --nolist --nod8m program.asm
66
+ azm --nod8m program.asm
68
67
  azm --nobin --nohex --reg-report --rc audit program.asm
69
68
  ```
70
69
 
@@ -74,13 +73,12 @@ azm --nobin --nohex --reg-report --rc audit program.asm
74
73
  | --------------------------------------------- | -------------------------------------------------------------------- |
75
74
  | `-o, --output <file>` | Primary output path. The extension must match `--type`. |
76
75
  | `-t, --type <hex\|bin>` | Primary output type. Default: `hex`. |
77
- | `-n, --nolist` | Do not write `.lst`. |
78
76
  | `--nobin` | Do not write `.bin`. |
79
77
  | `--nohex` | Do not write `.hex`. |
80
78
  | `--nod8m` | Do not write `.d8.json`. |
81
79
  | `--asm80` | Write lowered assembler source as `.z80`. |
82
80
  | `--source-root <dir>` | Emit project-relative source paths in `.d8.json`. |
83
- | `--case-style <mode>` | Lint opcode/register case: `off`, `upper`, `lower`, or `consistent`. |
81
+ | `--case-style <mode>` | Lint mnemonic/register/op-head case: `off`, `upper`, `lower`, or `consistent`. |
84
82
  | `--rc, --register-care <mode>` | Register-care mode: `off`, `audit`, `warn`, `error`, or `strict`. |
85
83
  | `--reg-report, --emit-register-report` | Write `.regcare.txt`. |
86
84
  | `--reg-interface, --emit-register-interface` | Write inferred `.asmi` interface. |
@@ -96,6 +94,10 @@ azm --nobin --nohex --reg-report --rc audit program.asm
96
94
 
97
95
  ## Debug80 Maps
98
96
 
97
+ `--case-style` is a source-style lint only. It checks instruction mnemonics,
98
+ register names, and visible `op` heads/bodies. It does not rename labels,
99
+ constants, directives, or compile-time functions.
100
+
99
101
  The `.d8.json` artifact records AZM as the generator, the package version, and
100
102
  the input/output paths used for the map. When `--source-root` is supplied, file
101
103
  keys and generator input paths are written relative to that directory with `/`
@@ -60,7 +60,6 @@ const result = await compile(
60
60
  includeDirs: ['/abs/path/to/includes'],
61
61
  sourceRoot: '/abs/path/to/project',
62
62
  d8mInputs: {
63
- listing: '/abs/path/to/project/build/main.lst',
64
63
  hex: '/abs/path/to/project/build/main.hex',
65
64
  bin: '/abs/path/to/project/build/main.bin',
66
65
  },
@@ -68,7 +67,6 @@ const result = await compile(
68
67
  emitBin: true,
69
68
  emitHex: true,
70
69
  emitD8m: true,
71
- emitListing: true,
72
70
  registerCare: 'audit',
73
71
  registerCareInterfaces: ['/abs/path/to/mon3.asmi'],
74
72
  },
@@ -89,7 +87,9 @@ The integration contract is:
89
87
  - `compile()` returns artifacts in memory; the CLI is only responsible for
90
88
  writing those artifacts to disk
91
89
  - Debug80 should consume the `d8m` artifact for source/address metadata and the
92
- `bin` or `hex` artifact for loadable bytes
90
+ `bin` artifact for loadable bytes (hex is acceptable when bin is not emitted)
91
+ - Do not rely on lowered `.z80` for Debug80 integration until asm80 coverage is
92
+ complete; use **bin + d8m** as the supported debugger path
93
93
  - pass `sourceRoot` so D8 file keys are stable project-relative source paths
94
94
  rather than basename-only paths
95
95
  - pass `d8mInputs` when Debug80 knows the intended artifact paths; AZM records
@@ -123,7 +123,6 @@ The top-level map contains:
123
123
  version: '0.1.1',
124
124
  inputs: {
125
125
  entry: 'src/pacmo/pacmo.z80',
126
- listing: 'build/pacmo.lst',
127
126
  hex: 'build/pacmo.hex',
128
127
  bin: 'build/pacmo.bin',
129
128
  },
@@ -252,6 +251,12 @@ const result = await compile(
252
251
  );
253
252
  ```
254
253
 
254
+ **`emitAsm80` caveat:** Lowered `.z80` emission is gated but not universal.
255
+ Unsupported instructions or operand forms throw `UnsupportedAsm80LoweringError`,
256
+ surfaced as `AZMN_ASM80`. When assembly already succeeded, `compile()` still
257
+ returns bin/hex/d8 artifacts alongside the asm80 error. Run
258
+ `npm run check:asm80-coverage` on your sources before relying on lowered output.
259
+
255
260
  The compiler accepts flat `.asm` / `.z80` source, retained AZM assembler
256
261
  features, and the same output writers used by the CLI. External register-care
257
262
  interfaces are `.asmi` metadata files, not compile entry files.
@@ -270,20 +275,19 @@ generated frames are outside this API contract for AZM source.
270
275
  The public tooling surface includes:
271
276
 
272
277
  - `Diagnostic`, `DiagnosticIds`, severity/id types
273
- - `SourcePosition`, `SourceSpan`
274
- - `ProgramNode`, `SourceFileNode`, `SourceItemNode`
275
278
  - `LoadedProgram`
276
- - `CompileEnv`
279
+ - `AnalyzeProgramResult`, `LoadProgramResult`
277
280
  - `RegisterCareCandidateDiagnostic`, `RegisterCareCodeAction`, `RegisterCareOutputCandidate`
278
281
 
279
- In v1, the AST exported from `src/frontend/ast.ts` is part of the public contract. Additive fields are minor-version changes; breaking shape changes are major-version changes.
282
+ The public tooling contract is the package export surface, not deep internal
283
+ paths. Do not document retired internal modules as public API.
280
284
 
281
285
  ## Syntax Highlighting Example
282
286
 
283
287
  Syntax colouring is an example consumer of the tooling API:
284
288
 
285
289
  1. Call `loadProgram()` with the file path and optional unsaved buffer text.
286
- 2. Walk `ProgramNode` and inspect `node.kind` plus `node.span`.
290
+ 2. Walk `loadedProgram.program.files[0].items` and inspect each item's `kind` and `span`.
287
291
  3. Map those spans to TextMate scopes or semantic token kinds in the editor.
288
292
  4. Fall back to regex/TextMate-only colouring if parsing fails or the editor needs a cheaper fast path.
289
293
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jhlagado/azm",
3
- "version": "0.2.0",
3
+ "version": "0.2.2",
4
4
  "description": "AZM assembler for the Z80 family (Node.js CLI)",
5
5
  "license": "GPL-3.0-only",
6
6
  "engines": {
@@ -33,7 +33,6 @@
33
33
  },
34
34
  "files": [
35
35
  "dist/src",
36
- "dist/legacy-root-azm",
37
36
  "docs/reference/cli.md",
38
37
  "docs/reference/tooling-api.md"
39
38
  ],
@@ -72,7 +71,9 @@
72
71
  "test:coverage": "vitest run --coverage",
73
72
  "test:ci:coverage-core": "node scripts/dev/run-coverage-core.mjs",
74
73
  "test:ci:slow-reliability": "vitest run --no-file-parallelism --maxWorkers=1 --minWorkers=1 --testTimeout=20000 --hookTimeout=300000 test/cli test/cli_*.test.ts",
74
+ "test:ci:asm80-parity": "node scripts/ci/run-asm80-parity.mjs",
75
75
  "check:fixture-coverage": "node scripts/dev/check-fixture-coverage.mjs",
76
+ "check:asm80-coverage": "node scripts/dev/check-asm80-lowering-coverage.mjs",
76
77
  "test:azm:alpha": "node scripts/dev/run-azm-alpha-guardrails.mjs",
77
78
  "test:azm:corpus": "node scripts/dev/run-azm-corpus-guardrails.mjs",
78
79
  "test:package": "npm run build && node scripts/dev/smoke-npm-package.mjs",
@@ -84,7 +85,7 @@
84
85
  "next:typecheck": "tsc -p tsconfig.json --noEmit",
85
86
  "next:test": "vitest run --config vitest.config.ts",
86
87
  "next:check": "npm run next:typecheck && npm run next:test",
87
- "next:guardrails:core": "npm run next:check && npm run next:diff-current:all",
88
+ "next:guardrails:core": "npm run next:check && npm run check:asm80-coverage && npm run test:ci:asm80-parity",
88
89
  "next:guardrails:package": "npm run test:package || npm run next:guardrails:package:local",
89
90
  "next:guardrails:package:local": "npm run build && vitest run -c vitest.config.ts test/integration/stage-16-package-smoke-local.test.ts && vitest run test/public_api_surface.test.ts",
90
91
  "next:guardrails:quality": "npm run lint && npm run check:source-file-sizes && node scripts/check-source-file-sizes.mjs",
@@ -93,9 +94,6 @@
93
94
  "format:check": "prettier -c .",
94
95
  "check:source-file-sizes": "node scripts/check-source-file-sizes.mjs",
95
96
  "check:source-file-sizes:enforce": "node scripts/check-source-file-sizes.mjs --enforce-hard-cap",
96
- "next:diff-current": "node scripts/diff-against-current.mjs --fixtures-dir test/differential/fixtures --skip-unsupported",
97
- "next:diff-current:root": "node scripts/diff-against-current.mjs --fixtures-dir test/fixtures --skip-unsupported",
98
- "next:diff-current:all": "npm run next:diff-current && npm run next:diff-current:root",
99
97
  "prepack": "npm run build",
100
98
  "prepublishOnly": "npm run build",
101
99
  "azm": "npm run build && node dist/src/cli.js"
@@ -1,11 +0,0 @@
1
- import type { Diagnostic } from './diagnosticTypes.js';
2
- import type { LoadedProgram } from './sourceLoader.js';
3
- import type { CompilerOptions } from './pipeline.js';
4
- import { type CompileEnv } from './semantics/env.js';
5
- export interface AnalyzeProgramOptions extends Pick<CompilerOptions, 'caseStyle' | 'requireMain'> {
6
- }
7
- export interface AnalyzeProgramResult {
8
- diagnostics: Diagnostic[];
9
- env?: CompileEnv;
10
- }
11
- export declare function analyzeLoadedProgram(loadedProgram: LoadedProgram, options?: AnalyzeProgramOptions): AnalyzeProgramResult;
@@ -1,41 +0,0 @@
1
- import { hasErrors } from './compileShared.js';
2
- import { DiagnosticIds } from './diagnosticTypes.js';
3
- import { lintCaseStyle } from './lintCaseStyle.js';
4
- import { buildEnv } from './semantics/env.js';
5
- function hasMainEntryLabel(program) {
6
- return program.files.some((sourceFile) => sourceFile.items.some((item) => item.kind === 'AsmLabel' && item.name.toLowerCase() === 'main'));
7
- }
8
- export function analyzeLoadedProgram(loadedProgram, options = {}) {
9
- const diagnostics = [];
10
- const { program, sourceTexts } = loadedProgram;
11
- const hasProgramItems = program.files.some((sourceFile) => sourceFile.items.length > 0);
12
- if (!hasProgramItems) {
13
- diagnostics.push({
14
- id: DiagnosticIds.SemanticsError,
15
- severity: 'error',
16
- message: 'Program contains no declarations or instruction streams.',
17
- file: program.entryFile,
18
- ...(program.span?.start
19
- ? { line: program.span.start.line, column: program.span.start.column }
20
- : {}),
21
- });
22
- return { diagnostics };
23
- }
24
- if ((options.requireMain ?? false) && !hasMainEntryLabel(program)) {
25
- diagnostics.push({
26
- id: DiagnosticIds.SemanticsError,
27
- severity: 'error',
28
- message: 'Program must define a "main" entry label.',
29
- file: program.entryFile,
30
- ...(program.span?.start
31
- ? { line: program.span.start.line, column: program.span.start.column }
32
- : {}),
33
- });
34
- return { diagnostics };
35
- }
36
- lintCaseStyle(program, sourceTexts, options.caseStyle ?? 'off', diagnostics);
37
- const env = buildEnv(program, diagnostics);
38
- if (hasErrors(diagnostics))
39
- return { diagnostics };
40
- return { diagnostics, env };
41
- }
@@ -1,10 +0,0 @@
1
- import type { CompileFn } from './pipeline.js';
2
- /**
3
- * Compile an AZM/ASM80-family program starting from an entry file.
4
- *
5
- * - Expands textual includes transitively with deterministic cycle checks.
6
- * - Runs parse → semantics → lowering → format writers.
7
- * - Produces artifacts in-memory via `deps.formats`.
8
- * - Defaults to emitting BIN + HEX + D8M unless an emit flag is explicitly provided.
9
- */
10
- export declare const compile: CompileFn;