@jhlagado/azm 0.2.1 → 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 (313) hide show
  1. package/README.md +16 -9
  2. package/dist/src/api-compile.d.ts +0 -2
  3. package/dist/src/api-compile.js +1 -8
  4. package/dist/src/assembly/address-planning.js +19 -1
  5. package/dist/src/cli/parse-args.d.ts +0 -1
  6. package/dist/src/cli/parse-args.js +0 -7
  7. package/dist/src/cli/write-artifacts.js +0 -11
  8. package/dist/src/core/compile.js +192 -9
  9. package/dist/src/expansion/op-expansion.js +1 -0
  10. package/dist/src/model/expression.d.ts +4 -0
  11. package/dist/src/model/source-item.d.ts +5 -0
  12. package/dist/src/outputs/index.js +0 -2
  13. package/dist/src/outputs/types.d.ts +3 -16
  14. package/dist/src/outputs/write-asm80.js +84 -0
  15. package/dist/src/semantics/expression-evaluation.d.ts +7 -3
  16. package/dist/src/semantics/expression-evaluation.js +57 -0
  17. package/dist/src/syntax/directive-aliases.js +9 -10
  18. package/dist/src/syntax/parse-expression.js +34 -9
  19. package/dist/src/syntax/parse-line.js +87 -44
  20. package/dist/src/tooling/case-style.js +3 -0
  21. package/docs/reference/cli.md +6 -4
  22. package/docs/reference/tooling-api.md +1 -4
  23. package/package.json +2 -6
  24. package/dist/legacy-root-azm/src/analysis.d.ts +0 -11
  25. package/dist/legacy-root-azm/src/analysis.js +0 -41
  26. package/dist/legacy-root-azm/src/compile.d.ts +0 -10
  27. package/dist/legacy-root-azm/src/compile.js +0 -186
  28. package/dist/legacy-root-azm/src/compileShared.d.ts +0 -3
  29. package/dist/legacy-root-azm/src/compileShared.js +0 -7
  30. package/dist/legacy-root-azm/src/diagnosticTypes.d.ts +0 -77
  31. package/dist/legacy-root-azm/src/diagnosticTypes.js +0 -53
  32. package/dist/legacy-root-azm/src/formats/index.d.ts +0 -7
  33. package/dist/legacy-root-azm/src/formats/index.js +0 -17
  34. package/dist/legacy-root-azm/src/formats/range.d.ts +0 -17
  35. package/dist/legacy-root-azm/src/formats/range.js +0 -45
  36. package/dist/legacy-root-azm/src/formats/types.d.ts +0 -283
  37. package/dist/legacy-root-azm/src/formats/types.js +0 -1
  38. package/dist/legacy-root-azm/src/formats/writeAsm80.d.ts +0 -6
  39. package/dist/legacy-root-azm/src/formats/writeAsm80.js +0 -86
  40. package/dist/legacy-root-azm/src/formats/writeBin.d.ts +0 -7
  41. package/dist/legacy-root-azm/src/formats/writeBin.js +0 -23
  42. package/dist/legacy-root-azm/src/formats/writeD8m.d.ts +0 -9
  43. package/dist/legacy-root-azm/src/formats/writeD8m.js +0 -245
  44. package/dist/legacy-root-azm/src/formats/writeHex.d.ts +0 -8
  45. package/dist/legacy-root-azm/src/formats/writeHex.js +0 -38
  46. package/dist/legacy-root-azm/src/formats/writeListing.d.ts +0 -8
  47. package/dist/legacy-root-azm/src/formats/writeListing.js +0 -83
  48. package/dist/legacy-root-azm/src/frontend/asm80/asmLine.d.ts +0 -39
  49. package/dist/legacy-root-azm/src/frontend/asm80/asmLine.js +0 -89
  50. package/dist/legacy-root-azm/src/frontend/asm80/parseAsmRawValues.d.ts +0 -4
  51. package/dist/legacy-root-azm/src/frontend/asm80/parseAsmRawValues.js +0 -94
  52. package/dist/legacy-root-azm/src/frontend/asm80/quoteScan.d.ts +0 -10
  53. package/dist/legacy-root-azm/src/frontend/asm80/quoteScan.js +0 -25
  54. package/dist/legacy-root-azm/src/frontend/ast.d.ts +0 -376
  55. package/dist/legacy-root-azm/src/frontend/ast.js +0 -1
  56. package/dist/legacy-root-azm/src/frontend/directiveAliases.d.ts +0 -14
  57. package/dist/legacy-root-azm/src/frontend/directiveAliases.js +0 -189
  58. package/dist/legacy-root-azm/src/frontend/grammarData.d.ts +0 -14
  59. package/dist/legacy-root-azm/src/frontend/grammarData.js +0 -65
  60. package/dist/legacy-root-azm/src/frontend/immExprUtils.d.ts +0 -2
  61. package/dist/legacy-root-azm/src/frontend/immExprUtils.js +0 -12
  62. package/dist/legacy-root-azm/src/frontend/parseAsmFlatDirectiveLine.d.ts +0 -17
  63. package/dist/legacy-root-azm/src/frontend/parseAsmFlatDirectiveLine.js +0 -187
  64. package/dist/legacy-root-azm/src/frontend/parseAsmInstruction.d.ts +0 -3
  65. package/dist/legacy-root-azm/src/frontend/parseAsmInstruction.js +0 -73
  66. package/dist/legacy-root-azm/src/frontend/parseAsmStatements.d.ts +0 -6
  67. package/dist/legacy-root-azm/src/frontend/parseAsmStatements.js +0 -16
  68. package/dist/legacy-root-azm/src/frontend/parseAsmStream.d.ts +0 -10
  69. package/dist/legacy-root-azm/src/frontend/parseAsmStream.js +0 -33
  70. package/dist/legacy-root-azm/src/frontend/parseAsmTopLevel.d.ts +0 -18
  71. package/dist/legacy-root-azm/src/frontend/parseAsmTopLevel.js +0 -34
  72. package/dist/legacy-root-azm/src/frontend/parseDiagnostics.d.ts +0 -9
  73. package/dist/legacy-root-azm/src/frontend/parseDiagnostics.js +0 -16
  74. package/dist/legacy-root-azm/src/frontend/parseEnum.d.ts +0 -12
  75. package/dist/legacy-root-azm/src/frontend/parseEnum.js +0 -70
  76. package/dist/legacy-root-azm/src/frontend/parseImm.d.ts +0 -10
  77. package/dist/legacy-root-azm/src/frontend/parseImm.js +0 -397
  78. package/dist/legacy-root-azm/src/frontend/parseLogicalLines.d.ts +0 -11
  79. package/dist/legacy-root-azm/src/frontend/parseLogicalLines.js +0 -94
  80. package/dist/legacy-root-azm/src/frontend/parseOp.d.ts +0 -25
  81. package/dist/legacy-root-azm/src/frontend/parseOp.js +0 -120
  82. package/dist/legacy-root-azm/src/frontend/parseOpHeader.d.ts +0 -20
  83. package/dist/legacy-root-azm/src/frontend/parseOpHeader.js +0 -32
  84. package/dist/legacy-root-azm/src/frontend/parseOperands.d.ts +0 -4
  85. package/dist/legacy-root-azm/src/frontend/parseOperands.js +0 -290
  86. package/dist/legacy-root-azm/src/frontend/parseParams.d.ts +0 -6
  87. package/dist/legacy-root-azm/src/frontend/parseParams.js +0 -62
  88. package/dist/legacy-root-azm/src/frontend/parseParserRecovery.d.ts +0 -12
  89. package/dist/legacy-root-azm/src/frontend/parseParserRecovery.js +0 -17
  90. package/dist/legacy-root-azm/src/frontend/parseParserShared.d.ts +0 -2
  91. package/dist/legacy-root-azm/src/frontend/parseParserShared.js +0 -8
  92. package/dist/legacy-root-azm/src/frontend/parseRawDataDirectiveStart.d.ts +0 -1
  93. package/dist/legacy-root-azm/src/frontend/parseRawDataDirectiveStart.js +0 -3
  94. package/dist/legacy-root-azm/src/frontend/parseRawDataDirectives.d.ts +0 -7
  95. package/dist/legacy-root-azm/src/frontend/parseRawDataDirectives.js +0 -142
  96. package/dist/legacy-root-azm/src/frontend/parseRecordFieldDecl.d.ts +0 -34
  97. package/dist/legacy-root-azm/src/frontend/parseRecordFieldDecl.js +0 -177
  98. package/dist/legacy-root-azm/src/frontend/parseSourceItemDispatch.d.ts +0 -46
  99. package/dist/legacy-root-azm/src/frontend/parseSourceItemDispatch.js +0 -53
  100. package/dist/legacy-root-azm/src/frontend/parseSourceItemTable.d.ts +0 -16
  101. package/dist/legacy-root-azm/src/frontend/parseSourceItemTable.js +0 -68
  102. package/dist/legacy-root-azm/src/frontend/parseTopLevelCommon.d.ts +0 -11
  103. package/dist/legacy-root-azm/src/frontend/parseTopLevelCommon.js +0 -50
  104. package/dist/legacy-root-azm/src/frontend/parseTypes.d.ts +0 -24
  105. package/dist/legacy-root-azm/src/frontend/parseTypes.js +0 -77
  106. package/dist/legacy-root-azm/src/frontend/parser.d.ts +0 -11
  107. package/dist/legacy-root-azm/src/frontend/parser.js +0 -88
  108. package/dist/legacy-root-azm/src/frontend/source.d.ts +0 -28
  109. package/dist/legacy-root-azm/src/frontend/source.js +0 -58
  110. package/dist/legacy-root-azm/src/frontend/sourceExtensions.d.ts +0 -2
  111. package/dist/legacy-root-azm/src/frontend/sourceExtensions.js +0 -6
  112. package/dist/legacy-root-azm/src/lintCaseStyle.d.ts +0 -4
  113. package/dist/legacy-root-azm/src/lintCaseStyle.js +0 -129
  114. package/dist/legacy-root-azm/src/lowering/asmDirectiveLowering.d.ts +0 -4
  115. package/dist/legacy-root-azm/src/lowering/asmDirectiveLowering.js +0 -229
  116. package/dist/legacy-root-azm/src/lowering/asmDirectiveTraversal.d.ts +0 -47
  117. package/dist/legacy-root-azm/src/lowering/asmDirectiveTraversal.js +0 -52
  118. package/dist/legacy-root-azm/src/lowering/asmEquResolution.d.ts +0 -8
  119. package/dist/legacy-root-azm/src/lowering/asmEquResolution.js +0 -69
  120. package/dist/legacy-root-azm/src/lowering/asmInstructionLdHelpers.d.ts +0 -15
  121. package/dist/legacy-root-azm/src/lowering/asmInstructionLdHelpers.js +0 -102
  122. package/dist/legacy-root-azm/src/lowering/asmInstructionLowering.d.ts +0 -5
  123. package/dist/legacy-root-azm/src/lowering/asmInstructionLowering.js +0 -54
  124. package/dist/legacy-root-azm/src/lowering/asmInstructionStream.d.ts +0 -46
  125. package/dist/legacy-root-azm/src/lowering/asmInstructionStream.js +0 -51
  126. package/dist/legacy-root-azm/src/lowering/asmLoweringBranchCall.d.ts +0 -43
  127. package/dist/legacy-root-azm/src/lowering/asmLoweringBranchCall.js +0 -254
  128. package/dist/legacy-root-azm/src/lowering/asmLoweringHost.d.ts +0 -23
  129. package/dist/legacy-root-azm/src/lowering/asmLoweringHost.js +0 -1
  130. package/dist/legacy-root-azm/src/lowering/asmLoweringLd.d.ts +0 -28
  131. package/dist/legacy-root-azm/src/lowering/asmLoweringLd.js +0 -144
  132. package/dist/legacy-root-azm/src/lowering/asmRangeLowering.d.ts +0 -17
  133. package/dist/legacy-root-azm/src/lowering/asmRangeLowering.js +0 -39
  134. package/dist/legacy-root-azm/src/lowering/asmRawDataLowering.d.ts +0 -16
  135. package/dist/legacy-root-azm/src/lowering/asmRawDataLowering.js +0 -209
  136. package/dist/legacy-root-azm/src/lowering/asmSourceEmitter.d.ts +0 -4
  137. package/dist/legacy-root-azm/src/lowering/asmSourceEmitter.js +0 -9
  138. package/dist/legacy-root-azm/src/lowering/asmSourceInstructionLowering.d.ts +0 -4
  139. package/dist/legacy-root-azm/src/lowering/asmSourceInstructionLowering.js +0 -14
  140. package/dist/legacy-root-azm/src/lowering/asmUtils.d.ts +0 -13
  141. package/dist/legacy-root-azm/src/lowering/asmUtils.js +0 -105
  142. package/dist/legacy-root-azm/src/lowering/assemblerFlowSetup.d.ts +0 -54
  143. package/dist/legacy-root-azm/src/lowering/assemblerFlowSetup.js +0 -128
  144. package/dist/legacy-root-azm/src/lowering/assemblerLoweringContext.d.ts +0 -151
  145. package/dist/legacy-root-azm/src/lowering/assemblerLoweringContext.js +0 -16
  146. package/dist/legacy-root-azm/src/lowering/assemblerLoweringContextSplit.d.ts +0 -7
  147. package/dist/legacy-root-azm/src/lowering/assemblerLoweringContextSplit.js +0 -75
  148. package/dist/legacy-root-azm/src/lowering/assemblerLoweringPhases.d.ts +0 -66
  149. package/dist/legacy-root-azm/src/lowering/assemblerLoweringPhases.js +0 -166
  150. package/dist/legacy-root-azm/src/lowering/bytePlacement.d.ts +0 -7
  151. package/dist/legacy-root-azm/src/lowering/bytePlacement.js +0 -37
  152. package/dist/legacy-root-azm/src/lowering/capabilities.d.ts +0 -67
  153. package/dist/legacy-root-azm/src/lowering/capabilities.js +0 -1
  154. package/dist/legacy-root-azm/src/lowering/eaResolution.d.ts +0 -58
  155. package/dist/legacy-root-azm/src/lowering/eaResolution.js +0 -159
  156. package/dist/legacy-root-azm/src/lowering/emissionCore.d.ts +0 -17
  157. package/dist/legacy-root-azm/src/lowering/emissionCore.js +0 -21
  158. package/dist/legacy-root-azm/src/lowering/emit.d.ts +0 -17
  159. package/dist/legacy-root-azm/src/lowering/emit.js +0 -46
  160. package/dist/legacy-root-azm/src/lowering/emitContextBuilder.d.ts +0 -63
  161. package/dist/legacy-root-azm/src/lowering/emitContextBuilder.js +0 -41
  162. package/dist/legacy-root-azm/src/lowering/emitFinalization.d.ts +0 -61
  163. package/dist/legacy-root-azm/src/lowering/emitFinalization.js +0 -66
  164. package/dist/legacy-root-azm/src/lowering/emitFinalizationSetup.d.ts +0 -19
  165. package/dist/legacy-root-azm/src/lowering/emitFinalizationSetup.js +0 -26
  166. package/dist/legacy-root-azm/src/lowering/emitPhase1BuildProgramLoweringContext.d.ts +0 -7
  167. package/dist/legacy-root-azm/src/lowering/emitPhase1BuildProgramLoweringContext.js +0 -119
  168. package/dist/legacy-root-azm/src/lowering/emitPhase1Helpers.d.ts +0 -4
  169. package/dist/legacy-root-azm/src/lowering/emitPhase1Helpers.js +0 -12
  170. package/dist/legacy-root-azm/src/lowering/emitPhase1Types.d.ts +0 -21
  171. package/dist/legacy-root-azm/src/lowering/emitPhase1Types.js +0 -1
  172. package/dist/legacy-root-azm/src/lowering/emitPhase1WirePipeline.d.ts +0 -70
  173. package/dist/legacy-root-azm/src/lowering/emitPhase1WirePipeline.js +0 -203
  174. package/dist/legacy-root-azm/src/lowering/emitPhase1Workspace.d.ts +0 -82
  175. package/dist/legacy-root-azm/src/lowering/emitPhase1Workspace.js +0 -55
  176. package/dist/legacy-root-azm/src/lowering/emitPipeline.d.ts +0 -121
  177. package/dist/legacy-root-azm/src/lowering/emitPipeline.js +0 -57
  178. package/dist/legacy-root-azm/src/lowering/emitProgramContext.d.ts +0 -39
  179. package/dist/legacy-root-azm/src/lowering/emitProgramContext.js +0 -29
  180. package/dist/legacy-root-azm/src/lowering/emitState.d.ts +0 -90
  181. package/dist/legacy-root-azm/src/lowering/emitState.js +0 -124
  182. package/dist/legacy-root-azm/src/lowering/fixupBaseResolution.d.ts +0 -7
  183. package/dist/legacy-root-azm/src/lowering/fixupBaseResolution.js +0 -23
  184. package/dist/legacy-root-azm/src/lowering/fixupEmission.d.ts +0 -64
  185. package/dist/legacy-root-azm/src/lowering/fixupEmission.js +0 -199
  186. package/dist/legacy-root-azm/src/lowering/immMath.d.ts +0 -2
  187. package/dist/legacy-root-azm/src/lowering/immMath.js +0 -34
  188. package/dist/legacy-root-azm/src/lowering/inputAssets.d.ts +0 -7
  189. package/dist/legacy-root-azm/src/lowering/inputAssets.js +0 -106
  190. package/dist/legacy-root-azm/src/lowering/ldEncoding.d.ts +0 -15
  191. package/dist/legacy-root-azm/src/lowering/ldEncoding.js +0 -12
  192. package/dist/legacy-root-azm/src/lowering/ldEncodingRegMemHelpers.d.ts +0 -5
  193. package/dist/legacy-root-azm/src/lowering/ldEncodingRegMemHelpers.js +0 -124
  194. package/dist/legacy-root-azm/src/lowering/ldFormSelection.d.ts +0 -26
  195. package/dist/legacy-root-azm/src/lowering/ldFormSelection.js +0 -92
  196. package/dist/legacy-root-azm/src/lowering/ldLowering.d.ts +0 -7
  197. package/dist/legacy-root-azm/src/lowering/ldLowering.js +0 -13
  198. package/dist/legacy-root-azm/src/lowering/loweredAsmByteEmission.d.ts +0 -23
  199. package/dist/legacy-root-azm/src/lowering/loweredAsmByteEmission.js +0 -185
  200. package/dist/legacy-root-azm/src/lowering/loweredAsmPlacement.d.ts +0 -13
  201. package/dist/legacy-root-azm/src/lowering/loweredAsmPlacement.js +0 -86
  202. package/dist/legacy-root-azm/src/lowering/loweredAsmStreamRecording.d.ts +0 -27
  203. package/dist/legacy-root-azm/src/lowering/loweredAsmStreamRecording.js +0 -215
  204. package/dist/legacy-root-azm/src/lowering/loweredAsmTypes.d.ts +0 -202
  205. package/dist/legacy-root-azm/src/lowering/loweredAsmTypes.js +0 -1
  206. package/dist/legacy-root-azm/src/lowering/loweredFormat.d.ts +0 -3
  207. package/dist/legacy-root-azm/src/lowering/loweredFormat.js +0 -26
  208. package/dist/legacy-root-azm/src/lowering/loweredItemSize.d.ts +0 -4
  209. package/dist/legacy-root-azm/src/lowering/loweredItemSize.js +0 -17
  210. package/dist/legacy-root-azm/src/lowering/loweringDiagnostics.d.ts +0 -9
  211. package/dist/legacy-root-azm/src/lowering/loweringDiagnostics.js +0 -55
  212. package/dist/legacy-root-azm/src/lowering/loweringTypes.d.ts +0 -27
  213. package/dist/legacy-root-azm/src/lowering/loweringTypes.js +0 -1
  214. package/dist/legacy-root-azm/src/lowering/opCandidateRegistry.d.ts +0 -9
  215. package/dist/legacy-root-azm/src/lowering/opCandidateRegistry.js +0 -9
  216. package/dist/legacy-root-azm/src/lowering/opExpansionExecution.d.ts +0 -15
  217. package/dist/legacy-root-azm/src/lowering/opExpansionExecution.js +0 -45
  218. package/dist/legacy-root-azm/src/lowering/opExpansionOrchestration.d.ts +0 -15
  219. package/dist/legacy-root-azm/src/lowering/opExpansionOrchestration.js +0 -88
  220. package/dist/legacy-root-azm/src/lowering/opExpansionStream.d.ts +0 -12
  221. package/dist/legacy-root-azm/src/lowering/opExpansionStream.js +0 -176
  222. package/dist/legacy-root-azm/src/lowering/opMatching.d.ts +0 -52
  223. package/dist/legacy-root-azm/src/lowering/opMatching.js +0 -355
  224. package/dist/legacy-root-azm/src/lowering/opSubstitution.d.ts +0 -13
  225. package/dist/legacy-root-azm/src/lowering/opSubstitution.js +0 -175
  226. package/dist/legacy-root-azm/src/lowering/prescanTypes.d.ts +0 -7
  227. package/dist/legacy-root-azm/src/lowering/prescanTypes.js +0 -1
  228. package/dist/legacy-root-azm/src/lowering/programLowering.d.ts +0 -144
  229. package/dist/legacy-root-azm/src/lowering/programLowering.js +0 -2
  230. package/dist/legacy-root-azm/src/lowering/programLoweringDeclarations.d.ts +0 -5
  231. package/dist/legacy-root-azm/src/lowering/programLoweringDeclarations.js +0 -5
  232. package/dist/legacy-root-azm/src/lowering/programLoweringFinalize.d.ts +0 -18
  233. package/dist/legacy-root-azm/src/lowering/programLoweringFinalize.js +0 -115
  234. package/dist/legacy-root-azm/src/lowering/programLoweringTraversal.d.ts +0 -2
  235. package/dist/legacy-root-azm/src/lowering/programLoweringTraversal.js +0 -93
  236. package/dist/legacy-root-azm/src/lowering/programPrescan.d.ts +0 -3
  237. package/dist/legacy-root-azm/src/lowering/programPrescan.js +0 -37
  238. package/dist/legacy-root-azm/src/lowering/traceFormat.d.ts +0 -13
  239. package/dist/legacy-root-azm/src/lowering/traceFormat.js +0 -211
  240. package/dist/legacy-root-azm/src/packageInfo.d.ts +0 -1
  241. package/dist/legacy-root-azm/src/packageInfo.js +0 -15
  242. package/dist/legacy-root-azm/src/pathCompare.d.ts +0 -3
  243. package/dist/legacy-root-azm/src/pathCompare.js +0 -26
  244. package/dist/legacy-root-azm/src/pipeline.d.ts +0 -91
  245. package/dist/legacy-root-azm/src/pipeline.js +0 -1
  246. package/dist/legacy-root-azm/src/registerCare/analyze.d.ts +0 -24
  247. package/dist/legacy-root-azm/src/registerCare/analyze.js +0 -327
  248. package/dist/legacy-root-azm/src/registerCare/annotate.d.ts +0 -11
  249. package/dist/legacy-root-azm/src/registerCare/annotate.js +0 -76
  250. package/dist/legacy-root-azm/src/registerCare/boundaryHints.d.ts +0 -2
  251. package/dist/legacy-root-azm/src/registerCare/boundaryHints.js +0 -10
  252. package/dist/legacy-root-azm/src/registerCare/carriers.d.ts +0 -4
  253. package/dist/legacy-root-azm/src/registerCare/carriers.js +0 -78
  254. package/dist/legacy-root-azm/src/registerCare/controlFlow.d.ts +0 -5
  255. package/dist/legacy-root-azm/src/registerCare/controlFlow.js +0 -35
  256. package/dist/legacy-root-azm/src/registerCare/fix.d.ts +0 -11
  257. package/dist/legacy-root-azm/src/registerCare/fix.js +0 -119
  258. package/dist/legacy-root-azm/src/registerCare/liveness.d.ts +0 -7
  259. package/dist/legacy-root-azm/src/registerCare/liveness.js +0 -227
  260. package/dist/legacy-root-azm/src/registerCare/profiles.d.ts +0 -11
  261. package/dist/legacy-root-azm/src/registerCare/profiles.js +0 -45
  262. package/dist/legacy-root-azm/src/registerCare/programModel.d.ts +0 -3
  263. package/dist/legacy-root-azm/src/registerCare/programModel.js +0 -181
  264. package/dist/legacy-root-azm/src/registerCare/report.d.ts +0 -5
  265. package/dist/legacy-root-azm/src/registerCare/report.js +0 -139
  266. package/dist/legacy-root-azm/src/registerCare/smartComments.d.ts +0 -5
  267. package/dist/legacy-root-azm/src/registerCare/smartComments.js +0 -247
  268. package/dist/legacy-root-azm/src/registerCare/sourceText.d.ts +0 -8
  269. package/dist/legacy-root-azm/src/registerCare/sourceText.js +0 -15
  270. package/dist/legacy-root-azm/src/registerCare/summary.d.ts +0 -3
  271. package/dist/legacy-root-azm/src/registerCare/summary.js +0 -492
  272. package/dist/legacy-root-azm/src/registerCare/types.d.ts +0 -154
  273. package/dist/legacy-root-azm/src/registerCare/types.js +0 -1
  274. package/dist/legacy-root-azm/src/semantics/declVisitor.d.ts +0 -5
  275. package/dist/legacy-root-azm/src/semantics/declVisitor.js +0 -11
  276. package/dist/legacy-root-azm/src/semantics/env.d.ts +0 -28
  277. package/dist/legacy-root-azm/src/semantics/env.js +0 -432
  278. package/dist/legacy-root-azm/src/semantics/layout.d.ts +0 -21
  279. package/dist/legacy-root-azm/src/semantics/layout.js +0 -226
  280. package/dist/legacy-root-azm/src/semantics/layoutCastFold.d.ts +0 -22
  281. package/dist/legacy-root-azm/src/semantics/layoutCastFold.js +0 -118
  282. package/dist/legacy-root-azm/src/semantics/semanticsDiagnostics.d.ts +0 -2
  283. package/dist/legacy-root-azm/src/semantics/semanticsDiagnostics.js +0 -4
  284. package/dist/legacy-root-azm/src/semantics/typeQueries.d.ts +0 -31
  285. package/dist/legacy-root-azm/src/semantics/typeQueries.js +0 -124
  286. package/dist/legacy-root-azm/src/sourceIncludeExpansion.d.ts +0 -17
  287. package/dist/legacy-root-azm/src/sourceIncludeExpansion.js +0 -124
  288. package/dist/legacy-root-azm/src/sourceIncludePaths.d.ts +0 -1
  289. package/dist/legacy-root-azm/src/sourceIncludePaths.js +0 -12
  290. package/dist/legacy-root-azm/src/sourceLoader.d.ts +0 -15
  291. package/dist/legacy-root-azm/src/sourceLoader.js +0 -118
  292. package/dist/legacy-root-azm/src/z80/effects.d.ts +0 -3
  293. package/dist/legacy-root-azm/src/z80/effects.js +0 -516
  294. package/dist/legacy-root-azm/src/z80/encode.d.ts +0 -10
  295. package/dist/legacy-root-azm/src/z80/encode.js +0 -412
  296. package/dist/legacy-root-azm/src/z80/encodeAlu.d.ts +0 -7
  297. package/dist/legacy-root-azm/src/z80/encodeAlu.js +0 -219
  298. package/dist/legacy-root-azm/src/z80/encodeBitOps.d.ts +0 -7
  299. package/dist/legacy-root-azm/src/z80/encodeBitOps.js +0 -123
  300. package/dist/legacy-root-azm/src/z80/encodeContext.d.ts +0 -29
  301. package/dist/legacy-root-azm/src/z80/encodeContext.js +0 -1
  302. package/dist/legacy-root-azm/src/z80/encodeControl.d.ts +0 -26
  303. package/dist/legacy-root-azm/src/z80/encodeControl.js +0 -180
  304. package/dist/legacy-root-azm/src/z80/encodeCoreOps.d.ts +0 -7
  305. package/dist/legacy-root-azm/src/z80/encodeCoreOps.js +0 -131
  306. package/dist/legacy-root-azm/src/z80/encodeIo.d.ts +0 -9
  307. package/dist/legacy-root-azm/src/z80/encodeIo.js +0 -128
  308. package/dist/legacy-root-azm/src/z80/encodeLd.d.ts +0 -13
  309. package/dist/legacy-root-azm/src/z80/encodeLd.js +0 -273
  310. package/dist/legacy-root-azm/src/z80/encoderRegistry.d.ts +0 -13
  311. package/dist/legacy-root-azm/src/z80/encoderRegistry.js +0 -169
  312. package/dist/src/outputs/write-listing.d.ts +0 -2
  313. package/dist/src/outputs/write-listing.js +0 -79
package/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  AZM is the Z80 assembler used by the Debug80 toolchain. It assembles plain
4
4
  `.asm` and `.z80` source into machine-code artifacts for hardware, emulators,
5
- and Debug80: Intel HEX, flat binary, listings, Debug80 maps, and optional
5
+ and Debug80: Intel HEX, flat binary, Debug80 maps, and optional
6
6
  ASM80-compatible lowered source.
7
7
 
8
8
  The user manual is the AZM book in the Debug80 documentation site:
@@ -22,19 +22,28 @@ AZM keeps the parts of the original assembler that matter for real Z80 work:
22
22
  - global labels, with `@NAME:` labels marking routine entries for register-care
23
23
  analysis
24
24
  - canonical dotted directives such as `.org`, `.equ`, `.db`, `.dw`, and `.ds`
25
- - compatibility spelling for common undotted directive heads such as `ORG`,
26
- `EQU`, `DB`, `DW`, and `DS`
25
+ - exact compatibility spelling for common undotted directive heads such as
26
+ `ORG`, `EQU`, `DB`, `DW`, and `DS`
27
+ - lowercase, case-sensitive canonical dotted directives; compatibility spellings
28
+ are handled as directive aliases, not as canonical AZM style
29
+ - colon labels are address labels only; declarations use name-left forms such as
30
+ `Name .equ`, `Name .enum`, `Name .type`, `Name .union`, and
31
+ `Name .typealias`
27
32
  - textual `.include`
33
+ - conditional source inclusion with lowercase `.if`, `.else`, and `.endif`
28
34
  - register-care contracts, AZMDoc comments, and `.asmi` external interfaces
29
35
  - `op` definitions for structured inline instruction idioms
30
36
  - enums and qualified enum constants
31
- - `.type` / `.union` layout metadata
37
+ - `.type` / `.union` layout metadata and `Name .typealias TypeExpr` layout aliases
32
38
  - compile-time layout constants such as `sizeof(...)`, `offset(...)`, scalar
33
- layout sizes, and constant-only layout casts
39
+ layout sizes, constant-only layout casts, `LSB(...)`, and `MSB(...)`
40
+ - case-sensitive AZM function names with documented spelling, such as
41
+ `sizeof(...)`, `offset(...)`, `LSB(...)`, and `MSB(...)`
34
42
  - data directives including `.db`, `.dw`, `.ds`, `.cstr`, `.pstr`, and `.istr`
43
+ - single quotes are character literals; double quotes are strings
35
44
 
36
45
  AZM does not implement text macros, local labels, modules/imports, `func`,
37
- formal arguments, generated stack frames, structured control flow, typed
46
+ formal arguments, generated stack frames, runtime structured control flow, typed
38
47
  assignment lowering, hidden typed load/store lowering, or named section blocks.
39
48
  Those features belong to older high-level ZAX-era code paths, not current AZM
40
49
  source.
@@ -96,14 +105,13 @@ using the same base path.
96
105
  | -------------- | --------------------------------------------- |
97
106
  | `.hex` | Intel HEX |
98
107
  | `.bin` | flat binary |
99
- | `.lst` | listing with bytes and symbols |
100
108
  | `.d8.json` | Debug80 map |
101
109
  | `.z80` | ASM80-compatible lowered source when enabled |
102
110
  | `.regcare.txt` | register-care report when enabled |
103
111
  | `.asmi` | inferred register-care interface when enabled |
104
112
 
105
113
  The `.z80` output is a generated compatibility artifact for ASM80-style
106
- workflows and comparison tooling. BIN, HEX, listings, Debug80 maps, and
114
+ workflows and comparison tooling. BIN, HEX, Debug80 maps, and
107
115
  register-care reports are the normal production outputs.
108
116
 
109
117
  ## Small Example
@@ -142,7 +150,6 @@ const result = await compile(
142
150
  sourceRoot: '/abs/path/to/project',
143
151
  d8mInputs: {
144
152
  hex: '/abs/path/to/project/build/main.hex',
145
- listing: '/abs/path/to/project/build/main.lst',
146
153
  },
147
154
  },
148
155
  { formats: defaultFormatWriters },
@@ -20,14 +20,12 @@ export interface CompileNextFunctionOptions {
20
20
  readonly outputType?: 'bin' | 'hex';
21
21
  readonly sourceRoot?: string;
22
22
  readonly d8mInputs?: {
23
- readonly listing?: string;
24
23
  readonly hex?: string;
25
24
  readonly bin?: string;
26
25
  };
27
26
  readonly emitBin?: boolean;
28
27
  readonly emitHex?: boolean;
29
28
  readonly emitD8m?: boolean;
30
- readonly emitListing?: boolean;
31
29
  readonly emitAsm80?: boolean;
32
30
  readonly registerCare?: RegisterCareMode;
33
31
  readonly emitRegisterReport?: boolean;
@@ -152,7 +152,6 @@ export async function compile(entryFile, options = {}, deps = { formats: default
152
152
  packageVersion: await readPackageVersion(),
153
153
  inputs: {
154
154
  entry: normalizedEntry,
155
- ...(options.d8mInputs?.listing !== undefined ? { listing: options.d8mInputs.listing } : {}),
156
155
  ...(options.d8mInputs?.hex !== undefined ? { hex: options.d8mInputs.hex } : {}),
157
156
  ...(options.d8mInputs?.bin !== undefined ? { bin: options.d8mInputs.bin } : {}),
158
157
  },
@@ -163,11 +162,6 @@ export async function compile(entryFile, options = {}, deps = { formats: default
163
162
  };
164
163
  artifacts.push(deps.formats.writeD8m(sidecarMap, symbols, d8mOpts));
165
164
  }
166
- if (emit.emitListing) {
167
- if (deps.formats.writeListing !== undefined) {
168
- artifacts.push(deps.formats.writeListing(sidecarMap, symbols));
169
- }
170
- }
171
165
  if (emit.emitAsm80) {
172
166
  if (deps.formats.writeAsm80 !== undefined) {
173
167
  try {
@@ -196,9 +190,8 @@ function compileArtifactDefaults(options) {
196
190
  const emitBin = anyPrimary ? (options.emitBin ?? false) : true;
197
191
  const emitHex = anyPrimary ? (options.emitHex ?? false) : true;
198
192
  const emitD8m = anyPrimary ? (options.emitD8m ?? false) : true;
199
- const emitListing = options.emitListing ?? true;
200
193
  const emitAsm80 = options.emitAsm80 ?? false;
201
- return { emitBin, emitHex, emitD8m, emitListing, emitAsm80 };
194
+ return { emitBin, emitHex, emitD8m, emitAsm80 };
202
195
  }
203
196
  function assembledImageToMap(bytes, origin, sourceSegments = []) {
204
197
  const map = new Map();
@@ -52,6 +52,9 @@ function buildAddressStateOnce(items, diagnostics, previous, reportUnknown) {
52
52
  case 'type':
53
53
  defineLayout(layouts, labels, equates, enumNamesLower, item.name, item.layoutKind, item.fields, item.span, diagnostics);
54
54
  break;
55
+ case 'type-alias':
56
+ defineTypeAlias(layouts, labels, equates, enumNamesLower, item.name, item.typeExpr, item.span, diagnostics);
57
+ break;
55
58
  case 'equ':
56
59
  defineEquate(equates, labels, layouts, enumNames, enumNamesLower, item.name, item.expression, item.span, placementAddress(placement), diagnostics, item.stringValue);
57
60
  break;
@@ -156,7 +159,11 @@ function addressStateSignature(state) {
156
159
  return JSON.stringify({
157
160
  labels: state.labels,
158
161
  equates: [...state.equates].map(([name, record]) => [name, record.currentLocation]),
159
- layouts: [...state.layouts].map(([name, record]) => [name, record.kind, record.fields]),
162
+ layouts: [...state.layouts].map(([name, record]) => [
163
+ name,
164
+ record.kind,
165
+ record.kind === 'alias' ? record.typeExpr : record.fields,
166
+ ]),
160
167
  origin: state.origin,
161
168
  });
162
169
  }
@@ -180,6 +187,17 @@ function defineLayout(layouts, labels, equates, enumNamesLower, name, layoutKind
180
187
  }
181
188
  layouts.set(name, { kind: layoutKind, fields, span });
182
189
  }
190
+ function defineTypeAlias(layouts, labels, equates, enumNamesLower, name, typeExpr, span, diagnostics) {
191
+ const lowerName = name.toLowerCase();
192
+ if (hasCaseInsensitiveMapKey(layouts, lowerName) ||
193
+ hasCaseInsensitiveKey(labels, lowerName) ||
194
+ hasCaseInsensitiveMapKey(equates, lowerName) ||
195
+ enumNamesLower.has(lowerName)) {
196
+ diagnostics.push(diagnostic(span, `duplicate type name: ${name}`));
197
+ return;
198
+ }
199
+ layouts.set(name, { kind: 'alias', typeExpr, span });
200
+ }
183
201
  function defineLabel(labels, equates, layouts, enumNamesLower, name, address, span, diagnostics) {
184
202
  if (labels[name] !== undefined ||
185
203
  equates.has(name) ||
@@ -11,7 +11,6 @@ export type CliOptions = {
11
11
  emitBin: boolean;
12
12
  emitHex: boolean;
13
13
  emitD8m: boolean;
14
- emitListing: boolean;
15
14
  emitAsm80: boolean;
16
15
  caseStyle: CaseStyleMode;
17
16
  registerCare: RegisterCareMode;
@@ -7,7 +7,6 @@ export function cliUsage() {
7
7
  'Options:',
8
8
  ' -o, --output <file> Primary output path (must match --type extension)',
9
9
  ' -t, --type <type> Primary output type: hex|bin (default: hex)',
10
- ' -n, --nolist Suppress .lst',
11
10
  ' --nobin Suppress .bin',
12
11
  ' --nohex Suppress .hex',
13
12
  ' --nod8m Suppress .d8.json',
@@ -44,7 +43,6 @@ function createDefaultCliState() {
44
43
  emitBin: true,
45
44
  emitHex: true,
46
45
  emitD8m: true,
47
- emitListing: true,
48
46
  emitAsm80: false,
49
47
  caseStyle: 'off',
50
48
  registerCare: 'off',
@@ -249,7 +247,6 @@ function finalizeCliOptions(state) {
249
247
  emitBin: state.emitBin,
250
248
  emitHex: state.emitHex,
251
249
  emitD8m: state.emitD8m,
252
- emitListing: state.emitListing,
253
250
  emitAsm80: state.emitAsm80,
254
251
  caseStyle: state.caseStyle,
255
252
  registerCare: state.registerCare,
@@ -278,10 +275,6 @@ export function parseCliArgs(argv) {
278
275
  continue;
279
276
  if (parseOutputTypeArg(arg, argv, indexRef, state))
280
277
  continue;
281
- if (arg === '-n' || arg === '--nolist') {
282
- state.emitListing = false;
283
- continue;
284
- }
285
278
  if (arg === '--nobin') {
286
279
  state.emitBin = false;
287
280
  continue;
@@ -52,7 +52,6 @@ export async function writeArtifacts(base, artifacts, outputType) {
52
52
  const hexPath = `${base}.hex`;
53
53
  const binPath = `${base}.bin`;
54
54
  const d8mPath = `${base}.d8.json`;
55
- const lstPath = `${base}.lst`;
56
55
  const asm80Path = `${base}.z80`;
57
56
  const registerCareReportPath = `${base}.regcare.txt`;
58
57
  const registerCareInterfacePath = `${base}.asmi`;
@@ -90,13 +89,6 @@ export async function writeArtifacts(base, artifacts, outputType) {
90
89
  await writeFile(d8mPath, `${text}\n`, 'utf8');
91
90
  })());
92
91
  }
93
- const lst = byKind.get('lst');
94
- if (lst && lst.kind === 'lst') {
95
- writes.push((async () => {
96
- await ensureDir(lstPath);
97
- await writeFile(lstPath, lst.text, 'utf8');
98
- })());
99
- }
100
92
  const asm80 = byKind.get('asm80');
101
93
  if (asm80 && asm80.kind === 'asm80') {
102
94
  writes.push((async () => {
@@ -141,14 +133,12 @@ export async function writeArtifacts(base, artifacts, outputType) {
141
133
  export function buildCompileOptions(parsed, base) {
142
134
  const hexPath = `${base}.hex`;
143
135
  const binPath = `${base}.bin`;
144
- const lstPath = `${base}.lst`;
145
136
  return {
146
137
  includeDirs: parsed.includeDirs,
147
138
  directiveAliasFiles: parsed.directiveAliasFiles,
148
139
  emitBin: parsed.emitBin,
149
140
  emitHex: parsed.emitHex,
150
141
  emitD8m: parsed.emitD8m,
151
- emitListing: parsed.emitListing,
152
142
  emitAsm80: parsed.emitAsm80,
153
143
  caseStyle: parsed.caseStyle,
154
144
  registerCare: parsed.registerCare,
@@ -165,7 +155,6 @@ export function buildCompileOptions(parsed, base) {
165
155
  ...(parsed.sourceRoot !== undefined
166
156
  ? {
167
157
  d8mInputs: {
168
- ...(parsed.emitListing ? { listing: lstPath } : {}),
169
158
  ...(parsed.emitHex ? { hex: hexPath } : {}),
170
159
  ...(parsed.emitBin ? { bin: binPath } : {}),
171
160
  },
@@ -4,15 +4,18 @@ import { createSourceFile } from '../source/source-file.js';
4
4
  import { scanLogicalLines } from '../source/logical-lines.js';
5
5
  import { stripLineComment } from '../source/strip-line-comment.js';
6
6
  import { parseLogicalLine } from '../syntax/parse-line.js';
7
- import { parseTypeExpr } from '../syntax/parse-expression.js';
7
+ import { parseExpression, parseTypeExpr } from '../syntax/parse-expression.js';
8
8
  import { collectOps, expandOpInvocation, parseOpInvocation } from '../expansion/op-expansion.js';
9
+ import { normalizeDirectiveAlias } from '../syntax/directive-aliases.js';
10
+ import { evaluateExpression, lookupEquateRecord, } from '../semantics/expression-evaluation.js';
9
11
  export function parseNextSourceItems(lines, options = {}) {
10
12
  const diagnostics = [];
11
13
  const items = [];
12
- const pendingLines = [...lines];
13
14
  const parseOptions = options.directiveAliasPolicy === undefined
14
15
  ? {}
15
16
  : { directiveAliasPolicy: options.directiveAliasPolicy };
17
+ const conditional = applyConditionalAssembly(lines, diagnostics, parseOptions.directiveAliasPolicy);
18
+ const pendingLines = [...conditional.lines];
16
19
  const { ops, opLineIndexes } = collectOps(pendingLines, diagnostics, parseOptions);
17
20
  let afterTopLevelEnd = false;
18
21
  for (let index = 0; index < pendingLines.length; index += 1) {
@@ -23,9 +26,61 @@ export function parseNextSourceItems(lines, options = {}) {
23
26
  if (afterTopLevelEnd && !isPostEndParseAllowed(line.text)) {
24
27
  continue;
25
28
  }
26
- const layoutHeader = /^\.(type|union)\s+([A-Za-z_][A-Za-z0-9_]*)\s*$/i.exec(stripLineComment(line.text).trim());
29
+ const colonLayoutHeader = /^([A-Za-z_][A-Za-z0-9_]*):\s*\.(type|union)\s*$/.exec(stripLineComment(line.text).trim());
30
+ if (colonLayoutHeader) {
31
+ const directive = colonLayoutHeader[2] ?? 'type';
32
+ diagnostics.push(parseDiagnostic(line, `Use "${colonLayoutHeader[1] ?? ''} .${directive}" for layouts; colon labels mark addresses.`));
33
+ const endDirective = directive === 'union' ? '.endunion' : '.endtype';
34
+ for (index += 1; index < pendingLines.length; index += 1) {
35
+ if (stripLineComment(pendingLines[index].text).trim() === endDirective) {
36
+ break;
37
+ }
38
+ }
39
+ continue;
40
+ }
41
+ const nameLeftTypeAlias = /^([A-Za-z_][A-Za-z0-9_]*)\s+\.typealias\s+(.+)$/.exec(stripLineComment(line.text).trim());
42
+ if (nameLeftTypeAlias) {
43
+ const typeExprText = nameLeftTypeAlias[2] ?? '';
44
+ const typeExpr = parseTypeExpr(typeExprText);
45
+ if (!typeExpr) {
46
+ diagnostics.push(parseDiagnostic(line, `invalid .typealias target: ${typeExprText}`));
47
+ }
48
+ else {
49
+ items.push({
50
+ kind: 'type-alias',
51
+ name: nameLeftTypeAlias[1] ?? '',
52
+ typeExpr,
53
+ span: { sourceName: line.sourceName, line: line.line, column: firstColumn(line.text) },
54
+ });
55
+ }
56
+ continue;
57
+ }
58
+ const typeAlias = /^\.type\s+([A-Za-z_][A-Za-z0-9_]*)\s*=\s*(.+)$/.exec(stripLineComment(line.text).trim());
59
+ if (typeAlias) {
60
+ diagnostics.push(parseDiagnostic(line, `Use "${typeAlias[1] ?? ''} .typealias ..." for type aliases.`));
61
+ continue;
62
+ }
63
+ const nameLeftLayoutHeader = /^([A-Za-z_][A-Za-z0-9_]*)\s+\.(type|union)\s*$/.exec(stripLineComment(line.text).trim());
64
+ const prefixLayoutHeader = /^\.(type|union)\s+([A-Za-z_][A-Za-z0-9_]*)\s*$/.exec(stripLineComment(line.text).trim());
65
+ if (prefixLayoutHeader) {
66
+ const directive = prefixLayoutHeader[1] ?? 'type';
67
+ diagnostics.push(parseDiagnostic(line, `Use "${prefixLayoutHeader[2] ?? ''} .${directive}" for layouts.`));
68
+ const endDirective = directive === 'union' ? '.endunion' : '.endtype';
69
+ for (index += 1; index < pendingLines.length; index += 1) {
70
+ if (stripLineComment(pendingLines[index].text).trim() === endDirective) {
71
+ break;
72
+ }
73
+ }
74
+ continue;
75
+ }
76
+ const layoutHeader = nameLeftLayoutHeader
77
+ ? {
78
+ directive: nameLeftLayoutHeader[2] ?? '',
79
+ name: nameLeftLayoutHeader[1] ?? '',
80
+ }
81
+ : undefined;
27
82
  if (layoutHeader) {
28
- const layoutKind = (layoutHeader[1] ?? '').toLowerCase() === 'union' ? 'union' : 'record';
83
+ const layoutKind = layoutHeader.directive === 'union' ? 'union' : 'record';
29
84
  const endDirective = layoutKind === 'union' ? '.endunion' : '.endtype';
30
85
  const fields = [];
31
86
  let terminated = false;
@@ -35,23 +90,23 @@ export function parseNextSourceItems(lines, options = {}) {
35
90
  if (fieldText.length === 0) {
36
91
  continue;
37
92
  }
38
- if (fieldText.toLowerCase() === endDirective) {
93
+ if (fieldText === endDirective) {
39
94
  terminated = true;
40
95
  break;
41
96
  }
42
97
  const field = parseLayoutField(fieldText);
43
98
  if (!field) {
44
- diagnostics.push(parseDiagnostic(fieldLine, `invalid .${layoutHeader[1]} field declaration`));
99
+ diagnostics.push(parseDiagnostic(fieldLine, `invalid .${layoutHeader.directive} field declaration`));
45
100
  continue;
46
101
  }
47
102
  fields.push(field);
48
103
  }
49
104
  if (!terminated) {
50
- diagnostics.push(parseDiagnostic(line, `.${layoutHeader[1] ?? ''} ${layoutHeader[2] ?? ''} missing ${endDirective}`));
105
+ diagnostics.push(parseDiagnostic(line, `.${layoutHeader.directive} ${layoutHeader.name} missing ${endDirective}`));
51
106
  }
52
107
  items.push({
53
108
  kind: 'type',
54
- name: layoutHeader[2] ?? '',
109
+ name: layoutHeader.name,
55
110
  layoutKind,
56
111
  fields,
57
112
  span: { sourceName: line.sourceName, line: line.line, column: firstColumn(line.text) },
@@ -78,6 +133,134 @@ export function parseNextSourceItems(lines, options = {}) {
78
133
  }
79
134
  return { diagnostics, items };
80
135
  }
136
+ function applyConditionalAssembly(lines, diagnostics, directiveAliasPolicy) {
137
+ const out = [];
138
+ const equates = new Map();
139
+ const locationDependentEquates = new Set();
140
+ const stack = [];
141
+ for (const line of lines) {
142
+ const text = stripLineComment(line.text).trim();
143
+ const ifDirective = /^\.if\s+(.+)$/.exec(text);
144
+ if (ifDirective) {
145
+ const parentActive = conditionalActive(stack);
146
+ const expressionText = ifDirective[1] ?? '';
147
+ const value = parentActive
148
+ ? evaluateConditionalExpression(line, expressionText, equates, locationDependentEquates, diagnostics)
149
+ : undefined;
150
+ const conditionActive = parentActive && value !== undefined && value !== 0;
151
+ stack.push({ line, parentActive, conditionActive, elseSeen: false });
152
+ continue;
153
+ }
154
+ if (/^\.else\s*$/.test(text)) {
155
+ const frame = stack.pop();
156
+ if (!frame) {
157
+ diagnostics.push(parseDiagnostic(line, 'unmatched .else'));
158
+ continue;
159
+ }
160
+ if (frame.elseSeen) {
161
+ diagnostics.push(parseDiagnostic(line, 'duplicate .else'));
162
+ }
163
+ stack.push({
164
+ line: frame.line,
165
+ parentActive: frame.parentActive,
166
+ conditionActive: frame.parentActive && !frame.conditionActive,
167
+ elseSeen: true,
168
+ });
169
+ continue;
170
+ }
171
+ if (/^\.endif\s*$/.test(text)) {
172
+ if (!stack.pop()) {
173
+ diagnostics.push(parseDiagnostic(line, 'unmatched .endif'));
174
+ }
175
+ continue;
176
+ }
177
+ if (!conditionalActive(stack)) {
178
+ continue;
179
+ }
180
+ out.push(line);
181
+ recordConditionalEquate(line, equates, locationDependentEquates, directiveAliasPolicy);
182
+ }
183
+ for (const frame of stack) {
184
+ diagnostics.push(parseDiagnostic(frame.line, 'unterminated .if'));
185
+ }
186
+ return { lines: out };
187
+ }
188
+ function conditionalActive(stack) {
189
+ return stack.every((frame) => frame.parentActive && frame.conditionActive);
190
+ }
191
+ function evaluateConditionalExpression(line, expressionText, equates, locationDependentEquates, diagnostics) {
192
+ const expression = parseExpression(expressionText);
193
+ if (!expression) {
194
+ diagnostics.push(parseDiagnostic(line, `invalid .if expression: ${expressionText}`));
195
+ return undefined;
196
+ }
197
+ if (expressionReferencesCurrentLocation(expression, equates, locationDependentEquates)) {
198
+ diagnostics.push(parseDiagnostic(line, 'invalid .if expression: current location is not available during conditional assembly'));
199
+ return undefined;
200
+ }
201
+ return evaluateExpression(expression, {}, equates, { sourceName: line.sourceName, line: line.line, column: firstColumn(line.text) }, diagnostics, { currentLocation: 0 });
202
+ }
203
+ function recordConditionalEquate(line, equates, locationDependentEquates, directiveAliasPolicy) {
204
+ const text = normalizeDirectiveAlias(stripLineComment(line.text), directiveAliasPolicy).trim();
205
+ const statement = /^(@?[A-Za-z_.$?][A-Za-z0-9_.$?]*):\s*(.+)$/.exec(text);
206
+ if (statement && /^\.equ\b/.test(statement[2] ?? '')) {
207
+ return;
208
+ }
209
+ const equ = /^([A-Za-z_.$?][A-Za-z0-9_.$?]*)\s+\.equ\s+(.+)$/.exec(text);
210
+ if (!equ) {
211
+ return;
212
+ }
213
+ const name = equ[1] ?? '';
214
+ const expressionText = equ[2] ?? '';
215
+ const expression = parseExpression(expressionText);
216
+ if (!expression) {
217
+ return;
218
+ }
219
+ if (expressionReferencesCurrentLocation(expression, equates, locationDependentEquates)) {
220
+ locationDependentEquates.add(canonicalConditionalSymbolKey(name));
221
+ }
222
+ equates.set(name, {
223
+ expression,
224
+ span: { sourceName: line.sourceName, line: line.line, column: firstColumn(line.text) },
225
+ currentLocation: 0,
226
+ });
227
+ }
228
+ function expressionReferencesCurrentLocation(expression, equates, locationDependentEquates, visiting = new Set()) {
229
+ switch (expression.kind) {
230
+ case 'current-location':
231
+ return true;
232
+ case 'symbol': {
233
+ if (locationDependentEquates.has(canonicalConditionalSymbolKey(expression.name))) {
234
+ return true;
235
+ }
236
+ const lookup = lookupEquateRecord(equates, expression.name);
237
+ if (!lookup || visiting.has(canonicalConditionalSymbolKey(lookup.key))) {
238
+ return false;
239
+ }
240
+ const nextVisiting = new Set(visiting);
241
+ nextVisiting.add(canonicalConditionalSymbolKey(lookup.key));
242
+ return expressionReferencesCurrentLocation(lookup.record.expression, equates, locationDependentEquates, nextVisiting);
243
+ }
244
+ case 'byte-function':
245
+ case 'unary':
246
+ return expressionReferencesCurrentLocation(expression.expression, equates, locationDependentEquates, visiting);
247
+ case 'binary':
248
+ return (expressionReferencesCurrentLocation(expression.left, equates, locationDependentEquates, visiting) ||
249
+ expressionReferencesCurrentLocation(expression.right, equates, locationDependentEquates, visiting));
250
+ case 'layout-cast':
251
+ return (expressionReferencesCurrentLocation(expression.base, equates, locationDependentEquates, visiting) ||
252
+ expression.path.some((part) => part.kind === 'index' &&
253
+ expressionReferencesCurrentLocation(part.expression, equates, locationDependentEquates, visiting)));
254
+ case 'number':
255
+ case 'type-size':
256
+ case 'sizeof':
257
+ case 'offset':
258
+ return false;
259
+ }
260
+ }
261
+ function canonicalConditionalSymbolKey(name) {
262
+ return name.toLowerCase();
263
+ }
81
264
  export function compileSource(sourceText, options = {}) {
82
265
  const source = createSourceFile(options.entryName ?? '<memory>', sourceText);
83
266
  const { diagnostics, items } = parseNextSourceItems(scanLogicalLines(source));
@@ -107,7 +290,7 @@ function isPostEndParseAllowed(text) {
107
290
  return /^(?:\.binfrom|\.binto|binfrom|binto)\b/i.test(stripLineComment(text).trim());
108
291
  }
109
292
  function parseLayoutField(text) {
110
- const match = /^([A-Za-z_][A-Za-z0-9_]*)\s+(\.(?:field|byte|word|addr))(?:\s+(.+))?$/i.exec(text);
293
+ const match = /^([A-Za-z_][A-Za-z0-9_]*)\s+(\.(?:field|byte|word|addr))(?:\s+(.+))?$/.exec(text);
111
294
  if (!match) {
112
295
  return undefined;
113
296
  }
@@ -667,6 +667,7 @@ function renameSourceItem(item, localLabelMap) {
667
667
  case 'end':
668
668
  case 'enum':
669
669
  case 'type':
670
+ case 'type-alias':
670
671
  case 'string-data':
671
672
  return item;
672
673
  }
@@ -12,6 +12,10 @@ export type Expression = {
12
12
  } | {
13
13
  readonly kind: 'sizeof';
14
14
  readonly typeExpr: TypeExpr;
15
+ } | {
16
+ readonly kind: 'byte-function';
17
+ readonly function: 'LSB' | 'MSB';
18
+ readonly expression: Expression;
15
19
  } | {
16
20
  readonly kind: 'offset';
17
21
  readonly typeExpr: TypeExpr;
@@ -60,6 +60,11 @@ export type SourceItem = {
60
60
  readonly layoutKind: 'record' | 'union';
61
61
  readonly fields: readonly LayoutField[];
62
62
  readonly span: SourceSpan;
63
+ } | {
64
+ readonly kind: 'type-alias';
65
+ readonly name: string;
66
+ readonly typeExpr: TypeExpr;
67
+ readonly span: SourceSpan;
63
68
  } | {
64
69
  readonly kind: 'string-data';
65
70
  readonly directive: 'cstr' | 'pstr' | 'istr';
@@ -1,13 +1,11 @@
1
1
  import { writeBin } from './write-bin.js';
2
2
  import { writeD8m } from './write-d8.js';
3
3
  import { writeHex } from './write-hex.js';
4
- import { writeListing } from './write-listing.js';
5
4
  import { writeAsm80 } from './write-asm80.js';
6
5
  /** Default in-memory writers for Stage 12 compile API. */
7
6
  export const defaultFormatWriters = {
8
7
  writeBin,
9
8
  writeHex,
10
9
  writeD8m,
11
- writeListing,
12
10
  writeAsm80,
13
11
  };
@@ -21,7 +21,7 @@ export interface EmittedSourceSegment {
21
21
  kind: D8mSegmentKind;
22
22
  confidence: D8mSegmentConfidence;
23
23
  }
24
- /** Symbol metadata shared by listing and D8 writers. */
24
+ /** Symbol metadata shared by output writers. */
25
25
  export type SymbolEntry = {
26
26
  kind: 'label' | 'data';
27
27
  name: string;
@@ -50,12 +50,6 @@ export interface HexArtifact {
50
50
  path?: string;
51
51
  text: string;
52
52
  }
53
- /** Listing artifact. */
54
- export interface ListingArtifact {
55
- kind: 'lst';
56
- path?: string;
57
- text: string;
58
- }
59
53
  /** In-memory register-care audit report artifact. */
60
54
  export interface RegisterCareReportArtifact {
61
55
  kind: 'register-care-report';
@@ -122,7 +116,6 @@ export interface D8mGenerator {
122
116
  version?: string;
123
117
  inputs?: {
124
118
  entry?: string;
125
- listing?: string;
126
119
  hex?: string;
127
120
  bin?: string;
128
121
  };
@@ -153,16 +146,11 @@ export interface WriteBinOptions {
153
146
  binFrom?: number;
154
147
  startAddress?: number;
155
148
  }
156
- export interface WriteListingOptions {
157
- lineEnding?: '\n' | '\r\n';
158
- bytesPerLine?: number;
159
- }
160
149
  export interface WriteD8mOptions {
161
150
  rootDir?: string;
162
151
  packageVersion?: string;
163
152
  inputs?: {
164
153
  entry?: string;
165
- listing?: string;
166
154
  hex?: string;
167
155
  bin?: string;
168
156
  };
@@ -171,12 +159,11 @@ export interface WriteD8mOptions {
171
159
  }
172
160
  export interface WriteAsm80Options {
173
161
  }
174
- export type Artifact = BinArtifact | HexArtifact | ListingArtifact | D8mArtifact | Asm80Artifact | RegisterCareReportArtifact | RegisterCareInterfaceArtifact | RegisterCareAnnotationsArtifact;
175
- /** Writer contract used by the Stage 12 compile API. */
162
+ export type Artifact = BinArtifact | HexArtifact | D8mArtifact | Asm80Artifact | RegisterCareReportArtifact | RegisterCareInterfaceArtifact | RegisterCareAnnotationsArtifact;
163
+ /** Writer contract used by the compile API. */
176
164
  export interface FormatWriters {
177
165
  writeHex(map: EmittedByteMap, symbols: readonly SymbolEntry[], opts?: WriteHexOptions): HexArtifact;
178
166
  writeBin(map: EmittedByteMap, symbols: readonly SymbolEntry[], opts?: WriteBinOptions): BinArtifact;
179
167
  writeD8m(map: EmittedByteMap, symbols: readonly SymbolEntry[], opts?: WriteD8mOptions): D8mArtifact;
180
- writeListing?(map: EmittedByteMap, symbols: readonly SymbolEntry[], opts?: WriteListingOptions): ListingArtifact;
181
168
  writeAsm80?(items: readonly SourceItem[], symbols: readonly SymbolEntry[], opts?: WriteAsm80Options): Asm80Artifact;
182
169
  }