@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
@@ -14,6 +14,7 @@ export function writeAsm80(items, symbols, opts = {}) {
14
14
  void opts;
15
15
  const evalContext = {
16
16
  constants: collectConstants(symbols),
17
+ symbols: collectSymbolValues(symbols),
17
18
  layouts: collectLayouts(items),
18
19
  };
19
20
  const lines = [asm80Header, ''];
@@ -43,6 +44,13 @@ function collectConstants(symbols) {
43
44
  }
44
45
  return constants;
45
46
  }
47
+ function collectSymbolValues(symbols) {
48
+ const values = new Map();
49
+ for (const symbol of symbols) {
50
+ values.set(symbol.name, symbol.kind === 'constant' ? symbol.value : symbol.address);
51
+ }
52
+ return values;
53
+ }
46
54
  function collectLayouts(items) {
47
55
  const layouts = new Map();
48
56
  for (const item of items) {
@@ -53,6 +61,13 @@ function collectLayouts(items) {
53
61
  span: item.span,
54
62
  });
55
63
  }
64
+ else if (item.kind === 'type-alias') {
65
+ layouts.set(item.name, {
66
+ kind: 'alias',
67
+ typeExpr: item.typeExpr,
68
+ span: item.span,
69
+ });
70
+ }
56
71
  }
57
72
  return layouts;
58
73
  }
@@ -95,6 +110,7 @@ function formatItem(item, evalContext, state) {
95
110
  return withImplicitOrg(state, formatInstruction(item.instruction, evalContext)?.text, instructionSize(item.instruction));
96
111
  case 'enum':
97
112
  case 'type':
113
+ case 'type-alias':
98
114
  case 'end':
99
115
  case 'binfrom':
100
116
  case 'binto':
@@ -497,12 +513,20 @@ function evaluateLoweredConstant(expression, evalContext) {
497
513
  reportUnknown: false,
498
514
  });
499
515
  }
516
+ case 'offset':
500
517
  case 'sizeof':
501
518
  return evaluateExpression(expression, {}, new Map(), silentSpan, [], {
502
519
  currentLocation: 0,
503
520
  layouts: evalContext.layouts,
504
521
  reportUnknown: false,
505
522
  });
523
+ case 'byte-function': {
524
+ const value = evaluateLoweredResolvedConstant(expression.expression, evalContext);
525
+ if (value === undefined) {
526
+ return undefined;
527
+ }
528
+ return expression.function === 'LSB' ? value & 0xff : (value >> 8) & 0xff;
529
+ }
506
530
  case 'unary': {
507
531
  const value = evaluateLoweredConstant(expression.expression, evalContext);
508
532
  if (value === undefined) {
@@ -552,6 +576,66 @@ function evaluateLoweredConstant(expression, evalContext) {
552
576
  return undefined;
553
577
  }
554
578
  }
579
+ function evaluateLoweredResolvedConstant(expression, evalContext) {
580
+ switch (expression.kind) {
581
+ case 'symbol':
582
+ return evalContext.symbols.get(expression.name);
583
+ case 'unary': {
584
+ const value = evaluateLoweredResolvedConstant(expression.expression, evalContext);
585
+ if (value === undefined) {
586
+ return undefined;
587
+ }
588
+ switch (expression.operator) {
589
+ case '+':
590
+ return value;
591
+ case '-':
592
+ return -value;
593
+ case '~':
594
+ return ~value;
595
+ }
596
+ break;
597
+ }
598
+ case 'binary': {
599
+ const left = evaluateLoweredResolvedConstant(expression.left, evalContext);
600
+ const right = evaluateLoweredResolvedConstant(expression.right, evalContext);
601
+ if (left === undefined || right === undefined) {
602
+ return undefined;
603
+ }
604
+ switch (expression.operator) {
605
+ case '+':
606
+ return left + right;
607
+ case '-':
608
+ return left - right;
609
+ case '*':
610
+ return left * right;
611
+ case '/':
612
+ return right === 0 ? undefined : Math.trunc(left / right);
613
+ case '%':
614
+ return right === 0 ? undefined : left % right;
615
+ case '&':
616
+ return left & right;
617
+ case '^':
618
+ return left ^ right;
619
+ case '|':
620
+ return left | right;
621
+ case '<<':
622
+ return left << right;
623
+ case '>>':
624
+ return left >> right;
625
+ }
626
+ break;
627
+ }
628
+ case 'byte-function': {
629
+ const value = evaluateLoweredResolvedConstant(expression.expression, evalContext);
630
+ if (value === undefined) {
631
+ return undefined;
632
+ }
633
+ return expression.function === 'LSB' ? value & 0xff : (value >> 8) & 0xff;
634
+ }
635
+ default:
636
+ return evaluateLoweredConstant(expression, evalContext);
637
+ }
638
+ }
555
639
  function formatLoweredNumber(value, width) {
556
640
  const normalized = value < 0 ? 0x10000 + (value & 0xffff) : value;
557
641
  const digits = normalized.toString(16).toUpperCase();
@@ -1,5 +1,5 @@
1
1
  import type { Diagnostic } from '../model/diagnostic.js';
2
- import type { Expression } from '../model/expression.js';
2
+ import type { Expression, TypeExpr } from '../model/expression.js';
3
3
  import type { LayoutField } from '../model/source-item.js';
4
4
  import type { SourceSpan } from '../source/source-span.js';
5
5
  export interface EquateRecord {
@@ -9,11 +9,15 @@ export interface EquateRecord {
9
9
  readonly enumMember?: boolean;
10
10
  readonly stringValue?: string;
11
11
  }
12
- export interface LayoutRecord {
12
+ export type LayoutRecord = {
13
13
  readonly kind: 'record' | 'union';
14
14
  readonly fields: readonly LayoutField[];
15
15
  readonly span: SourceSpan;
16
- }
16
+ } | {
17
+ readonly kind: 'alias';
18
+ readonly typeExpr: TypeExpr;
19
+ readonly span: SourceSpan;
20
+ };
17
21
  export declare function lookupEquateRecord(equates: ReadonlyMap<string, EquateRecord>, name: string): {
18
22
  readonly key: string;
19
23
  readonly record: EquateRecord;
@@ -39,6 +39,8 @@ export function evaluateExpression(expression, labels, equates, span, diagnostic
39
39
  return evaluateTypeSize(expression.typeExpr, labels, equates, span, diagnostics, options);
40
40
  case 'sizeof':
41
41
  return evaluateSizeof(expression.typeExpr, options.layouts, span, diagnostics);
42
+ case 'byte-function':
43
+ return evaluateByteFunction(expression, labels, equates, span, diagnostics, options);
42
44
  case 'offset':
43
45
  return evaluateOffset(expression.typeExpr, expression.path, options.layouts, span, diagnostics);
44
46
  case 'layout-cast':
@@ -51,6 +53,13 @@ export function evaluateExpression(expression, labels, equates, span, diagnostic
51
53
  return evaluateBinary(expression, labels, equates, span, diagnostics, options);
52
54
  }
53
55
  }
56
+ function evaluateByteFunction(expression, labels, equates, span, diagnostics, options) {
57
+ const value = evaluateExpression(expression.expression, labels, equates, span, diagnostics, options);
58
+ if (value === undefined) {
59
+ return undefined;
60
+ }
61
+ return expression.function === 'LSB' ? value & 0xff : (value >> 8) & 0xff;
62
+ }
54
63
  function evaluateTypeSize(typeExpr, labels, equates, span, diagnostics, options) {
55
64
  if (options.layouts) {
56
65
  const sizeDiagnostics = [];
@@ -146,6 +155,13 @@ function evaluateOffset(typeExpr, path, layouts, span, diagnostics) {
146
155
  return undefined;
147
156
  }
148
157
  function typeExprSize(typeExpr, layouts, span, diagnostics, visiting) {
158
+ const resolvedTypeExpr = resolveLayoutAlias(typeExpr, layouts, span, diagnostics, visiting);
159
+ if (!resolvedTypeExpr) {
160
+ return undefined;
161
+ }
162
+ if (resolvedTypeExpr !== typeExpr) {
163
+ return typeExprSize(resolvedTypeExpr, layouts, span, diagnostics, visiting);
164
+ }
149
165
  const scalar = scalarSize(typeExpr.name);
150
166
  const baseSize = scalar ??
151
167
  (() => {
@@ -162,6 +178,9 @@ function typeExprSize(typeExpr, layouts, span, diagnostics, visiting) {
162
178
  return typeExpr.length === undefined ? baseSize : baseSize * typeExpr.length;
163
179
  }
164
180
  function layoutSize(typeName, layout, layouts, span, diagnostics, visiting) {
181
+ if (layout.kind === 'alias') {
182
+ return typeExprSize(layout.typeExpr, layouts, span, diagnostics, visiting);
183
+ }
165
184
  const fieldSizes = [];
166
185
  for (const field of layout.fields) {
167
186
  const size = fieldSize(field, layouts, span, diagnostics, visiting);
@@ -187,6 +206,13 @@ function fieldSize(field, layouts, span, diagnostics, visiting) {
187
206
  return typeExprSize(field.typeExpr, layouts, span, diagnostics, new Set([...visiting, field.typeExpr.name]));
188
207
  }
189
208
  function offsetPath(typeExpr, parts, layouts, span, diagnostics) {
209
+ const resolvedTypeExpr = resolveLayoutAlias(typeExpr, layouts, span, diagnostics, new Set([typeExpr.name]));
210
+ if (!resolvedTypeExpr) {
211
+ return undefined;
212
+ }
213
+ if (resolvedTypeExpr !== typeExpr) {
214
+ return offsetPath(resolvedTypeExpr, parts, layouts, span, diagnostics);
215
+ }
190
216
  const [head, ...tail] = parts;
191
217
  if (head === undefined) {
192
218
  return undefined;
@@ -218,6 +244,9 @@ function offsetPath(typeExpr, parts, layouts, span, diagnostics) {
218
244
  diagnostics.push(diagnostic(span, `unknown type: ${typeExpr.name}`));
219
245
  return undefined;
220
246
  }
247
+ if (layout.kind === 'alias') {
248
+ return offsetPath(layout.typeExpr, parts, layouts, span, diagnostics);
249
+ }
221
250
  let currentOffset = 0;
222
251
  for (const field of layout.fields) {
223
252
  const fieldOffset = layout.kind === 'union' ? 0 : currentOffset;
@@ -246,6 +275,13 @@ function offsetPath(typeExpr, parts, layouts, span, diagnostics) {
246
275
  return undefined;
247
276
  }
248
277
  function layoutCastOffset(typeExpr, parts, labels, equates, layouts, span, diagnostics, options) {
278
+ const resolvedTypeExpr = resolveLayoutAlias(typeExpr, layouts, span, diagnostics, new Set([typeExpr.name]));
279
+ if (!resolvedTypeExpr) {
280
+ return undefined;
281
+ }
282
+ if (resolvedTypeExpr !== typeExpr) {
283
+ return layoutCastOffset(resolvedTypeExpr, parts, labels, equates, layouts, span, diagnostics, options);
284
+ }
249
285
  const [head, ...tail] = parts;
250
286
  if (head === undefined) {
251
287
  return 0;
@@ -286,6 +322,9 @@ function layoutCastOffset(typeExpr, parts, labels, equates, layouts, span, diagn
286
322
  diagnostics.push(diagnostic(span, `unknown type: ${typeExpr.name}`));
287
323
  return undefined;
288
324
  }
325
+ if (layout.kind === 'alias') {
326
+ return layoutCastOffset(layout.typeExpr, parts, labels, equates, layouts, span, diagnostics, options);
327
+ }
289
328
  let currentOffset = 0;
290
329
  for (const field of layout.fields) {
291
330
  const fieldOffset = layout.kind === 'union' ? 0 : currentOffset;
@@ -330,6 +369,24 @@ function registerIndexName(expression) {
330
369
  function formatTypeExpr(typeExpr) {
331
370
  return typeExpr.length === undefined ? typeExpr.name : `${typeExpr.name}[${typeExpr.length}]`;
332
371
  }
372
+ function resolveLayoutAlias(typeExpr, layouts, span, diagnostics, visiting) {
373
+ const layout = layouts.get(typeExpr.name);
374
+ if (!layout || layout.kind !== 'alias') {
375
+ return typeExpr;
376
+ }
377
+ if (visiting.has(layout.typeExpr.name)) {
378
+ diagnostics.push(diagnostic(span, `recursive type: ${typeExpr.name}`));
379
+ return undefined;
380
+ }
381
+ const target = resolveLayoutAlias(layout.typeExpr, layouts, span, diagnostics, new Set([...visiting, layout.typeExpr.name]));
382
+ if (!target) {
383
+ return undefined;
384
+ }
385
+ const length = typeExpr.length === undefined
386
+ ? target.length
387
+ : (target.length ?? 1) * typeExpr.length;
388
+ return length === undefined ? { name: target.name } : { name: target.name, length };
389
+ }
333
390
  function formatOffsetPath(path) {
334
391
  return path.map((part) => (part.kind === 'field' ? part.name : `[${part.index}]`)).join('.');
335
392
  }
@@ -160,14 +160,14 @@ export function normalizeDirectiveAlias(text, policy = DEFAULT_DIRECTIVE_ALIAS_P
160
160
  if (label) {
161
161
  return `${leading}${label[1]} ${normalizeHead(label[2] ?? '', policy)}`;
162
162
  }
163
- const equ = /^([A-Za-z_.$?][A-Za-z0-9_.$?]*)\s+([A-Za-z]+)\b(.*)$/.exec(trimmed);
163
+ const equ = /^([A-Za-z_.$?][A-Za-z0-9_.$?]*)\s+([A-Za-z][A-Za-z0-9_]*)\b(.*)$/.exec(trimmed);
164
164
  if (equ && resolveDirectiveAlias(equ[2] ?? '', policy) === '.equ') {
165
165
  return `${leading}${equ[1]} .equ${equ[3] ?? ''}`;
166
166
  }
167
167
  return `${leading}${normalizeHead(trimmed, policy)}`;
168
168
  }
169
169
  function normalizeHead(text, policy) {
170
- const head = /^([A-Za-z]+)\b(.*)$/.exec(text);
170
+ const head = /^([A-Za-z][A-Za-z0-9_]*)\b(.*)$/.exec(text);
171
171
  if (!head) {
172
172
  return text;
173
173
  }
@@ -181,7 +181,7 @@ function normalizeAliasKey(key) {
181
181
  const trimmed = key.trim();
182
182
  if (!/^[.]?[A-Za-z][A-Za-z0-9_]*$/.test(trimmed))
183
183
  return undefined;
184
- return trimmed.replace(/^\./, '').toUpperCase();
184
+ return trimmed.replace(/^\./, '');
185
185
  }
186
186
  function normalizeAliasTarget(value) {
187
187
  const trimmed = value.trim().toLowerCase();
@@ -189,11 +189,10 @@ function normalizeAliasTarget(value) {
189
189
  return CANONICAL_DIRECTIVES.has(dotted) ? dotted : undefined;
190
190
  }
191
191
  function resolveDirectiveAlias(head, policy) {
192
- const key = normalizeAliasKey(head);
193
- if (!key)
194
- return undefined;
195
- const dotted = `.${key.toLowerCase()}`;
196
- if (head.trim().startsWith('.') && CANONICAL_DIRECTIVES.has(dotted))
197
- return dotted;
198
- return policy.directiveAliases.get(key);
192
+ const trimmed = head.trim();
193
+ if (trimmed.startsWith('.')) {
194
+ return CANONICAL_DIRECTIVES.has(trimmed) ? trimmed : undefined;
195
+ }
196
+ const key = head.trim();
197
+ return /^[A-Za-z][A-Za-z0-9_]*$/.test(key) ? policy.directiveAliases.get(key) : undefined;
199
198
  }
@@ -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;
@@ -14,9 +14,9 @@ export function parseLogicalLine(line, options = {}) {
14
14
  const labelName = normalizeEntryLabelName(rawLabel);
15
15
  const isEntry = rawLabel.startsWith('@');
16
16
  const statementText = labelWithStatement[2] ?? '';
17
- const equStatement = parseColonLabelEqu(line, labelName, statementText, span);
18
- if (equStatement) {
19
- return equStatement;
17
+ const invalidDeclaration = parseColonDeclarationError(labelName, statementText);
18
+ if (invalidDeclaration) {
19
+ return { items: [], diagnostics: [parseError(line, invalidDeclaration)] };
20
20
  }
21
21
  const parsedStatement = parseCanonicalStatement(line, statementText, span);
22
22
  return withLineComment(line, {
@@ -86,6 +86,13 @@ function withLineComment(line, result) {
86
86
  }
87
87
  function parseEquItem(line, name, expressionText, span) {
88
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
+ }
89
96
  const expression = stringValue !== undefined && stringValue.length > 1
90
97
  ? { kind: 'number', value: 0 }
91
98
  : parseExpression(expressionText);
@@ -108,19 +115,12 @@ function parseEquItem(line, name, expressionText, span) {
108
115
  diagnostics: [],
109
116
  };
110
117
  }
111
- function parseColonLabelEqu(line, name, text, span) {
112
- const equ = /^\.equ\s+(.+)$/i.exec(text);
113
- if (!equ) {
114
- return undefined;
115
- }
116
- return parseEquItem(line, name, equ[1] ?? '', span);
117
- }
118
118
  function parseCanonicalStatement(line, text, span) {
119
- 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);
120
120
  if (equ) {
121
121
  return parseEquItem(line, equ[1] ?? '', equ[2] ?? '', span);
122
122
  }
123
- const org = /^\.org\s+(.+)$/i.exec(text);
123
+ const org = /^\.org\s+(.+)$/.exec(text);
124
124
  if (org) {
125
125
  const expressionText = org[1] ?? '';
126
126
  const expression = parseExpression(expressionText);
@@ -132,32 +132,18 @@ function parseCanonicalStatement(line, text, span) {
132
132
  }
133
133
  return { items: [{ kind: 'org', expression, span }], diagnostics: [] };
134
134
  }
135
- 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);
136
136
  if (enumDecl) {
137
- const name = enumDecl[1] ?? '';
138
- const membersText = enumDecl[2] ?? '';
139
- const rawMembers = membersText.split(',').map((member) => member.trim());
140
- if (membersText.trim().length === 0 || rawMembers.some((member) => member.length === 0)) {
141
- return {
142
- items: [],
143
- diagnostics: [parseError(line, `invalid enum member list`)],
144
- };
145
- }
146
- const members = [];
147
- const diagnostics = [];
148
- for (const member of rawMembers) {
149
- if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(member)) {
150
- diagnostics.push(parseError(line, `Invalid enum member name "${member}": expected <identifier>.`));
151
- continue;
152
- }
153
- members.push(member);
154
- }
155
- if (diagnostics.length > 0) {
156
- return { items: [], diagnostics };
157
- }
158
- return { items: [{ kind: 'enum', name, members, span }], diagnostics: [] };
137
+ return {
138
+ items: [],
139
+ diagnostics: [parseError(line, `Use "${enumDecl[1] ?? ''} .enum ..." for enums.`)],
140
+ };
141
+ }
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);
159
145
  }
160
- const data = /^(\.db|\.dw)\s+(.+)$/i.exec(text);
146
+ const data = /^(\.db|\.dw)\s+(.+)$/.exec(text);
161
147
  if (data) {
162
148
  const directive = (data[1] ?? '').slice(1).toLowerCase();
163
149
  const valueText = data[2] ?? '';
@@ -166,9 +152,10 @@ function parseCanonicalStatement(line, text, span) {
166
152
  ? parts.map(parseDataValue).filter((value) => value !== undefined)
167
153
  : parts.map(parseExpression).filter((value) => value !== undefined);
168
154
  if (values.length !== parts.length) {
155
+ const quotePolicyError = parts.map(parseDataQuotePolicyError).find(Boolean);
169
156
  return {
170
157
  items: [],
171
- diagnostics: [parseError(line, `invalid .${directive} value list`)],
158
+ diagnostics: [parseError(line, quotePolicyError ?? `invalid .${directive} value list`)],
172
159
  };
173
160
  }
174
161
  return {
@@ -178,7 +165,7 @@ function parseCanonicalStatement(line, text, span) {
178
165
  diagnostics: [],
179
166
  };
180
167
  }
181
- const ds = /^\.ds\s+(.+)$/i.exec(text);
168
+ const ds = /^\.ds\s+(.+)$/.exec(text);
182
169
  if (ds) {
183
170
  const parts = splitValueList(ds[1] ?? '');
184
171
  if (parts.length < 1 || parts.length > 2) {
@@ -208,7 +195,7 @@ function parseCanonicalStatement(line, text, span) {
208
195
  diagnostics: [],
209
196
  };
210
197
  }
211
- const align = /^\.align\s+(.+)$/i.exec(text);
198
+ const align = /^\.align\s+(.+)$/.exec(text);
212
199
  if (align) {
213
200
  const expressionText = align[1] ?? '';
214
201
  const alignment = parseExpression(expressionText);
@@ -220,10 +207,10 @@ function parseCanonicalStatement(line, text, span) {
220
207
  }
221
208
  return { items: [{ kind: 'align', alignment, span }], diagnostics: [] };
222
209
  }
223
- if (/^\.end\s*$/i.test(text)) {
210
+ if (/^\.end\s*$/.test(text)) {
224
211
  return { items: [{ kind: 'end', span }], diagnostics: [] };
225
212
  }
226
- const rangeControl = /^(\.binfrom|\.binto)\s+(.+)$/i.exec(text);
213
+ const rangeControl = /^(\.binfrom|\.binto)\s+(.+)$/.exec(text);
227
214
  if (rangeControl) {
228
215
  const kind = (rangeControl[1] ?? '').slice(1).toLowerCase();
229
216
  const expressionText = rangeControl[2] ?? '';
@@ -236,7 +223,7 @@ function parseCanonicalStatement(line, text, span) {
236
223
  }
237
224
  return { items: [{ kind, expression, span }], diagnostics: [] };
238
225
  }
239
- const stringData = /^(\.cstr|\.pstr|\.istr)\s+(.+)$/i.exec(text);
226
+ const stringData = /^(\.cstr|\.pstr|\.istr)\s+(.+)$/.exec(text);
240
227
  if (stringData) {
241
228
  const directive = (stringData[1] ?? '').slice(1).toLowerCase();
242
229
  const valueText = stringData[2] ?? '';
@@ -244,7 +231,7 @@ function parseCanonicalStatement(line, text, span) {
244
231
  if (value === undefined) {
245
232
  return {
246
233
  items: [],
247
- diagnostics: [parseError(line, `.${directive} expects one quoted string`)],
234
+ diagnostics: [parseError(line, `.${directive} expects one double-quoted string`)],
248
235
  };
249
236
  }
250
237
  return { items: [{ kind: 'string-data', directive, value, span }], diagnostics: [] };
@@ -267,6 +254,46 @@ function parseCanonicalStatement(line, text, span) {
267
254
  }
268
255
  return { items: [], diagnostics: [parseError(line, `unsupported source line: ${text}`)] };
269
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
+ }
270
297
  function parseTypeSizeExpression(text) {
271
298
  const typeExpr = parseTypeExpr(text);
272
299
  return typeExpr ? { kind: 'type-size', typeExpr } : undefined;
@@ -342,7 +369,7 @@ function parseDataValue(text) {
342
369
  function parseWholeQuotedString(text) {
343
370
  const input = text.trim();
344
371
  const quote = input[0];
345
- if ((quote !== '"' && quote !== "'") || input[input.length - 1] !== quote) {
372
+ if (quote !== '"' || input[input.length - 1] !== quote) {
346
373
  return undefined;
347
374
  }
348
375
  let value = '';
@@ -363,6 +390,22 @@ function parseWholeQuotedString(text) {
363
390
  }
364
391
  return value;
365
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
+ }
366
409
  function normalizeEntryLabelName(raw) {
367
410
  return raw.startsWith('@') ? raw.slice(1) : raw;
368
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)) {