@jhlagado/azm 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (301) hide show
  1. package/LICENSE +649 -0
  2. package/README.md +142 -0
  3. package/dist/src/analysis.d.ts +11 -0
  4. package/dist/src/analysis.js +41 -0
  5. package/dist/src/api-compile.d.ts +8 -0
  6. package/dist/src/api-compile.js +3 -0
  7. package/dist/src/api-tooling.d.ts +25 -0
  8. package/dist/src/api-tooling.js +21 -0
  9. package/dist/src/cli.d.ts +30 -0
  10. package/dist/src/cli.js +523 -0
  11. package/dist/src/compile.d.ts +10 -0
  12. package/dist/src/compile.js +175 -0
  13. package/dist/src/compileShared.d.ts +3 -0
  14. package/dist/src/compileShared.js +7 -0
  15. package/dist/src/diagnosticTypes.d.ts +77 -0
  16. package/dist/src/diagnosticTypes.js +53 -0
  17. package/dist/src/formats/index.d.ts +7 -0
  18. package/dist/src/formats/index.js +17 -0
  19. package/dist/src/formats/range.d.ts +17 -0
  20. package/dist/src/formats/range.js +45 -0
  21. package/dist/src/formats/types.d.ts +208 -0
  22. package/dist/src/formats/types.js +1 -0
  23. package/dist/src/formats/writeAsm80.d.ts +6 -0
  24. package/dist/src/formats/writeAsm80.js +86 -0
  25. package/dist/src/formats/writeBin.d.ts +7 -0
  26. package/dist/src/formats/writeBin.js +23 -0
  27. package/dist/src/formats/writeD8m.d.ts +9 -0
  28. package/dist/src/formats/writeD8m.js +239 -0
  29. package/dist/src/formats/writeHex.d.ts +9 -0
  30. package/dist/src/formats/writeHex.js +39 -0
  31. package/dist/src/formats/writeListing.d.ts +8 -0
  32. package/dist/src/formats/writeListing.js +83 -0
  33. package/dist/src/frontend/asm80/asmLine.d.ts +39 -0
  34. package/dist/src/frontend/asm80/asmLine.js +89 -0
  35. package/dist/src/frontend/asm80/parseAsmRawValues.d.ts +4 -0
  36. package/dist/src/frontend/asm80/parseAsmRawValues.js +94 -0
  37. package/dist/src/frontend/asm80/quoteScan.d.ts +10 -0
  38. package/dist/src/frontend/asm80/quoteScan.js +25 -0
  39. package/dist/src/frontend/ast.d.ts +376 -0
  40. package/dist/src/frontend/ast.js +1 -0
  41. package/dist/src/frontend/directiveAliases.d.ts +14 -0
  42. package/dist/src/frontend/directiveAliases.js +189 -0
  43. package/dist/src/frontend/grammarData.d.ts +14 -0
  44. package/dist/src/frontend/grammarData.js +65 -0
  45. package/dist/src/frontend/immExprUtils.d.ts +2 -0
  46. package/dist/src/frontend/immExprUtils.js +12 -0
  47. package/dist/src/frontend/parseAsmFlatDirectiveLine.d.ts +17 -0
  48. package/dist/src/frontend/parseAsmFlatDirectiveLine.js +187 -0
  49. package/dist/src/frontend/parseAsmInstruction.d.ts +3 -0
  50. package/dist/src/frontend/parseAsmInstruction.js +73 -0
  51. package/dist/src/frontend/parseAsmStatements.d.ts +6 -0
  52. package/dist/src/frontend/parseAsmStatements.js +16 -0
  53. package/dist/src/frontend/parseAsmStream.d.ts +10 -0
  54. package/dist/src/frontend/parseAsmStream.js +33 -0
  55. package/dist/src/frontend/parseAsmTopLevel.d.ts +18 -0
  56. package/dist/src/frontend/parseAsmTopLevel.js +34 -0
  57. package/dist/src/frontend/parseDiagnostics.d.ts +9 -0
  58. package/dist/src/frontend/parseDiagnostics.js +16 -0
  59. package/dist/src/frontend/parseEnum.d.ts +12 -0
  60. package/dist/src/frontend/parseEnum.js +70 -0
  61. package/dist/src/frontend/parseImm.d.ts +10 -0
  62. package/dist/src/frontend/parseImm.js +397 -0
  63. package/dist/src/frontend/parseLogicalLines.d.ts +11 -0
  64. package/dist/src/frontend/parseLogicalLines.js +94 -0
  65. package/dist/src/frontend/parseOp.d.ts +25 -0
  66. package/dist/src/frontend/parseOp.js +120 -0
  67. package/dist/src/frontend/parseOpHeader.d.ts +20 -0
  68. package/dist/src/frontend/parseOpHeader.js +32 -0
  69. package/dist/src/frontend/parseOperands.d.ts +4 -0
  70. package/dist/src/frontend/parseOperands.js +290 -0
  71. package/dist/src/frontend/parseParams.d.ts +6 -0
  72. package/dist/src/frontend/parseParams.js +62 -0
  73. package/dist/src/frontend/parseParserRecovery.d.ts +12 -0
  74. package/dist/src/frontend/parseParserRecovery.js +17 -0
  75. package/dist/src/frontend/parseParserShared.d.ts +2 -0
  76. package/dist/src/frontend/parseParserShared.js +8 -0
  77. package/dist/src/frontend/parseRawDataDirectiveStart.d.ts +1 -0
  78. package/dist/src/frontend/parseRawDataDirectiveStart.js +3 -0
  79. package/dist/src/frontend/parseRawDataDirectives.d.ts +7 -0
  80. package/dist/src/frontend/parseRawDataDirectives.js +142 -0
  81. package/dist/src/frontend/parseRecordFieldDecl.d.ts +34 -0
  82. package/dist/src/frontend/parseRecordFieldDecl.js +177 -0
  83. package/dist/src/frontend/parseSourceItemDispatch.d.ts +46 -0
  84. package/dist/src/frontend/parseSourceItemDispatch.js +53 -0
  85. package/dist/src/frontend/parseSourceItemTable.d.ts +16 -0
  86. package/dist/src/frontend/parseSourceItemTable.js +68 -0
  87. package/dist/src/frontend/parseTopLevelCommon.d.ts +11 -0
  88. package/dist/src/frontend/parseTopLevelCommon.js +50 -0
  89. package/dist/src/frontend/parseTypes.d.ts +24 -0
  90. package/dist/src/frontend/parseTypes.js +77 -0
  91. package/dist/src/frontend/parser.d.ts +11 -0
  92. package/dist/src/frontend/parser.js +88 -0
  93. package/dist/src/frontend/source.d.ts +28 -0
  94. package/dist/src/frontend/source.js +58 -0
  95. package/dist/src/frontend/sourceExtensions.d.ts +2 -0
  96. package/dist/src/frontend/sourceExtensions.js +6 -0
  97. package/dist/src/index.d.ts +3 -0
  98. package/dist/src/index.js +2 -0
  99. package/dist/src/lintCaseStyle.d.ts +4 -0
  100. package/dist/src/lintCaseStyle.js +129 -0
  101. package/dist/src/lowering/asmDirectiveLowering.d.ts +4 -0
  102. package/dist/src/lowering/asmDirectiveLowering.js +229 -0
  103. package/dist/src/lowering/asmDirectiveTraversal.d.ts +47 -0
  104. package/dist/src/lowering/asmDirectiveTraversal.js +52 -0
  105. package/dist/src/lowering/asmEquResolution.d.ts +8 -0
  106. package/dist/src/lowering/asmEquResolution.js +69 -0
  107. package/dist/src/lowering/asmInstructionLdHelpers.d.ts +15 -0
  108. package/dist/src/lowering/asmInstructionLdHelpers.js +102 -0
  109. package/dist/src/lowering/asmInstructionLowering.d.ts +5 -0
  110. package/dist/src/lowering/asmInstructionLowering.js +54 -0
  111. package/dist/src/lowering/asmInstructionStream.d.ts +46 -0
  112. package/dist/src/lowering/asmInstructionStream.js +51 -0
  113. package/dist/src/lowering/asmLoweringBranchCall.d.ts +43 -0
  114. package/dist/src/lowering/asmLoweringBranchCall.js +254 -0
  115. package/dist/src/lowering/asmLoweringHost.d.ts +23 -0
  116. package/dist/src/lowering/asmLoweringHost.js +1 -0
  117. package/dist/src/lowering/asmLoweringLd.d.ts +28 -0
  118. package/dist/src/lowering/asmLoweringLd.js +144 -0
  119. package/dist/src/lowering/asmRangeLowering.d.ts +17 -0
  120. package/dist/src/lowering/asmRangeLowering.js +39 -0
  121. package/dist/src/lowering/asmRawDataLowering.d.ts +16 -0
  122. package/dist/src/lowering/asmRawDataLowering.js +209 -0
  123. package/dist/src/lowering/asmSourceEmitter.d.ts +4 -0
  124. package/dist/src/lowering/asmSourceEmitter.js +9 -0
  125. package/dist/src/lowering/asmSourceInstructionLowering.d.ts +4 -0
  126. package/dist/src/lowering/asmSourceInstructionLowering.js +14 -0
  127. package/dist/src/lowering/asmUtils.d.ts +13 -0
  128. package/dist/src/lowering/asmUtils.js +105 -0
  129. package/dist/src/lowering/assemblerFlowSetup.d.ts +54 -0
  130. package/dist/src/lowering/assemblerFlowSetup.js +128 -0
  131. package/dist/src/lowering/assemblerLoweringContext.d.ts +151 -0
  132. package/dist/src/lowering/assemblerLoweringContext.js +16 -0
  133. package/dist/src/lowering/assemblerLoweringContextSplit.d.ts +7 -0
  134. package/dist/src/lowering/assemblerLoweringContextSplit.js +75 -0
  135. package/dist/src/lowering/assemblerLoweringPhases.d.ts +66 -0
  136. package/dist/src/lowering/assemblerLoweringPhases.js +166 -0
  137. package/dist/src/lowering/bytePlacement.d.ts +7 -0
  138. package/dist/src/lowering/bytePlacement.js +37 -0
  139. package/dist/src/lowering/capabilities.d.ts +67 -0
  140. package/dist/src/lowering/capabilities.js +1 -0
  141. package/dist/src/lowering/eaResolution.d.ts +58 -0
  142. package/dist/src/lowering/eaResolution.js +159 -0
  143. package/dist/src/lowering/emissionCore.d.ts +17 -0
  144. package/dist/src/lowering/emissionCore.js +21 -0
  145. package/dist/src/lowering/emit.d.ts +17 -0
  146. package/dist/src/lowering/emit.js +46 -0
  147. package/dist/src/lowering/emitContextBuilder.d.ts +63 -0
  148. package/dist/src/lowering/emitContextBuilder.js +41 -0
  149. package/dist/src/lowering/emitFinalization.d.ts +61 -0
  150. package/dist/src/lowering/emitFinalization.js +66 -0
  151. package/dist/src/lowering/emitFinalizationSetup.d.ts +19 -0
  152. package/dist/src/lowering/emitFinalizationSetup.js +26 -0
  153. package/dist/src/lowering/emitPhase1BuildProgramLoweringContext.d.ts +7 -0
  154. package/dist/src/lowering/emitPhase1BuildProgramLoweringContext.js +119 -0
  155. package/dist/src/lowering/emitPhase1Helpers.d.ts +4 -0
  156. package/dist/src/lowering/emitPhase1Helpers.js +12 -0
  157. package/dist/src/lowering/emitPhase1Types.d.ts +21 -0
  158. package/dist/src/lowering/emitPhase1Types.js +1 -0
  159. package/dist/src/lowering/emitPhase1WirePipeline.d.ts +70 -0
  160. package/dist/src/lowering/emitPhase1WirePipeline.js +203 -0
  161. package/dist/src/lowering/emitPhase1Workspace.d.ts +82 -0
  162. package/dist/src/lowering/emitPhase1Workspace.js +55 -0
  163. package/dist/src/lowering/emitPipeline.d.ts +121 -0
  164. package/dist/src/lowering/emitPipeline.js +57 -0
  165. package/dist/src/lowering/emitProgramContext.d.ts +39 -0
  166. package/dist/src/lowering/emitProgramContext.js +29 -0
  167. package/dist/src/lowering/emitState.d.ts +90 -0
  168. package/dist/src/lowering/emitState.js +124 -0
  169. package/dist/src/lowering/fixupBaseResolution.d.ts +7 -0
  170. package/dist/src/lowering/fixupBaseResolution.js +23 -0
  171. package/dist/src/lowering/fixupEmission.d.ts +64 -0
  172. package/dist/src/lowering/fixupEmission.js +199 -0
  173. package/dist/src/lowering/immMath.d.ts +2 -0
  174. package/dist/src/lowering/immMath.js +34 -0
  175. package/dist/src/lowering/inputAssets.d.ts +7 -0
  176. package/dist/src/lowering/inputAssets.js +106 -0
  177. package/dist/src/lowering/ldEncoding.d.ts +15 -0
  178. package/dist/src/lowering/ldEncoding.js +12 -0
  179. package/dist/src/lowering/ldEncodingRegMemHelpers.d.ts +5 -0
  180. package/dist/src/lowering/ldEncodingRegMemHelpers.js +124 -0
  181. package/dist/src/lowering/ldFormSelection.d.ts +26 -0
  182. package/dist/src/lowering/ldFormSelection.js +92 -0
  183. package/dist/src/lowering/ldLowering.d.ts +7 -0
  184. package/dist/src/lowering/ldLowering.js +13 -0
  185. package/dist/src/lowering/loweredAsmByteEmission.d.ts +23 -0
  186. package/dist/src/lowering/loweredAsmByteEmission.js +185 -0
  187. package/dist/src/lowering/loweredAsmPlacement.d.ts +13 -0
  188. package/dist/src/lowering/loweredAsmPlacement.js +86 -0
  189. package/dist/src/lowering/loweredAsmStreamRecording.d.ts +27 -0
  190. package/dist/src/lowering/loweredAsmStreamRecording.js +215 -0
  191. package/dist/src/lowering/loweredAsmTypes.d.ts +202 -0
  192. package/dist/src/lowering/loweredAsmTypes.js +1 -0
  193. package/dist/src/lowering/loweredFormat.d.ts +3 -0
  194. package/dist/src/lowering/loweredFormat.js +26 -0
  195. package/dist/src/lowering/loweredItemSize.d.ts +4 -0
  196. package/dist/src/lowering/loweredItemSize.js +17 -0
  197. package/dist/src/lowering/loweringDiagnostics.d.ts +9 -0
  198. package/dist/src/lowering/loweringDiagnostics.js +55 -0
  199. package/dist/src/lowering/loweringTypes.d.ts +27 -0
  200. package/dist/src/lowering/loweringTypes.js +1 -0
  201. package/dist/src/lowering/opCandidateRegistry.d.ts +9 -0
  202. package/dist/src/lowering/opCandidateRegistry.js +9 -0
  203. package/dist/src/lowering/opExpansionExecution.d.ts +15 -0
  204. package/dist/src/lowering/opExpansionExecution.js +45 -0
  205. package/dist/src/lowering/opExpansionOrchestration.d.ts +15 -0
  206. package/dist/src/lowering/opExpansionOrchestration.js +88 -0
  207. package/dist/src/lowering/opExpansionStream.d.ts +12 -0
  208. package/dist/src/lowering/opExpansionStream.js +176 -0
  209. package/dist/src/lowering/opMatching.d.ts +52 -0
  210. package/dist/src/lowering/opMatching.js +355 -0
  211. package/dist/src/lowering/opSubstitution.d.ts +13 -0
  212. package/dist/src/lowering/opSubstitution.js +175 -0
  213. package/dist/src/lowering/prescanTypes.d.ts +7 -0
  214. package/dist/src/lowering/prescanTypes.js +1 -0
  215. package/dist/src/lowering/programLowering.d.ts +144 -0
  216. package/dist/src/lowering/programLowering.js +2 -0
  217. package/dist/src/lowering/programLoweringDeclarations.d.ts +5 -0
  218. package/dist/src/lowering/programLoweringDeclarations.js +5 -0
  219. package/dist/src/lowering/programLoweringFinalize.d.ts +18 -0
  220. package/dist/src/lowering/programLoweringFinalize.js +115 -0
  221. package/dist/src/lowering/programLoweringTraversal.d.ts +2 -0
  222. package/dist/src/lowering/programLoweringTraversal.js +93 -0
  223. package/dist/src/lowering/programPrescan.d.ts +3 -0
  224. package/dist/src/lowering/programPrescan.js +37 -0
  225. package/dist/src/lowering/traceFormat.d.ts +13 -0
  226. package/dist/src/lowering/traceFormat.js +211 -0
  227. package/dist/src/pathCompare.d.ts +3 -0
  228. package/dist/src/pathCompare.js +26 -0
  229. package/dist/src/pipeline.d.ts +78 -0
  230. package/dist/src/pipeline.js +1 -0
  231. package/dist/src/registerCare/analyze.d.ts +24 -0
  232. package/dist/src/registerCare/analyze.js +327 -0
  233. package/dist/src/registerCare/annotate.d.ts +11 -0
  234. package/dist/src/registerCare/annotate.js +76 -0
  235. package/dist/src/registerCare/boundaryHints.d.ts +2 -0
  236. package/dist/src/registerCare/boundaryHints.js +10 -0
  237. package/dist/src/registerCare/carriers.d.ts +4 -0
  238. package/dist/src/registerCare/carriers.js +78 -0
  239. package/dist/src/registerCare/controlFlow.d.ts +5 -0
  240. package/dist/src/registerCare/controlFlow.js +35 -0
  241. package/dist/src/registerCare/fix.d.ts +11 -0
  242. package/dist/src/registerCare/fix.js +119 -0
  243. package/dist/src/registerCare/liveness.d.ts +7 -0
  244. package/dist/src/registerCare/liveness.js +227 -0
  245. package/dist/src/registerCare/profiles.d.ts +11 -0
  246. package/dist/src/registerCare/profiles.js +45 -0
  247. package/dist/src/registerCare/programModel.d.ts +3 -0
  248. package/dist/src/registerCare/programModel.js +181 -0
  249. package/dist/src/registerCare/report.d.ts +5 -0
  250. package/dist/src/registerCare/report.js +139 -0
  251. package/dist/src/registerCare/smartComments.d.ts +5 -0
  252. package/dist/src/registerCare/smartComments.js +247 -0
  253. package/dist/src/registerCare/sourceText.d.ts +8 -0
  254. package/dist/src/registerCare/sourceText.js +15 -0
  255. package/dist/src/registerCare/summary.d.ts +3 -0
  256. package/dist/src/registerCare/summary.js +492 -0
  257. package/dist/src/registerCare/tooling.d.ts +42 -0
  258. package/dist/src/registerCare/tooling.js +50 -0
  259. package/dist/src/registerCare/types.d.ts +154 -0
  260. package/dist/src/registerCare/types.js +1 -0
  261. package/dist/src/semantics/declVisitor.d.ts +5 -0
  262. package/dist/src/semantics/declVisitor.js +11 -0
  263. package/dist/src/semantics/env.d.ts +28 -0
  264. package/dist/src/semantics/env.js +432 -0
  265. package/dist/src/semantics/layout.d.ts +21 -0
  266. package/dist/src/semantics/layout.js +226 -0
  267. package/dist/src/semantics/layoutCastFold.d.ts +22 -0
  268. package/dist/src/semantics/layoutCastFold.js +118 -0
  269. package/dist/src/semantics/semanticsDiagnostics.d.ts +2 -0
  270. package/dist/src/semantics/semanticsDiagnostics.js +4 -0
  271. package/dist/src/semantics/typeQueries.d.ts +31 -0
  272. package/dist/src/semantics/typeQueries.js +124 -0
  273. package/dist/src/sourceIncludeExpansion.d.ts +17 -0
  274. package/dist/src/sourceIncludeExpansion.js +124 -0
  275. package/dist/src/sourceIncludePaths.d.ts +1 -0
  276. package/dist/src/sourceIncludePaths.js +12 -0
  277. package/dist/src/sourceLoader.d.ts +15 -0
  278. package/dist/src/sourceLoader.js +118 -0
  279. package/dist/src/z80/effects.d.ts +3 -0
  280. package/dist/src/z80/effects.js +516 -0
  281. package/dist/src/z80/encode.d.ts +10 -0
  282. package/dist/src/z80/encode.js +412 -0
  283. package/dist/src/z80/encodeAlu.d.ts +7 -0
  284. package/dist/src/z80/encodeAlu.js +219 -0
  285. package/dist/src/z80/encodeBitOps.d.ts +7 -0
  286. package/dist/src/z80/encodeBitOps.js +123 -0
  287. package/dist/src/z80/encodeContext.d.ts +29 -0
  288. package/dist/src/z80/encodeContext.js +1 -0
  289. package/dist/src/z80/encodeControl.d.ts +26 -0
  290. package/dist/src/z80/encodeControl.js +180 -0
  291. package/dist/src/z80/encodeCoreOps.d.ts +7 -0
  292. package/dist/src/z80/encodeCoreOps.js +131 -0
  293. package/dist/src/z80/encodeIo.d.ts +9 -0
  294. package/dist/src/z80/encodeIo.js +128 -0
  295. package/dist/src/z80/encodeLd.d.ts +13 -0
  296. package/dist/src/z80/encodeLd.js +273 -0
  297. package/dist/src/z80/encoderRegistry.d.ts +13 -0
  298. package/dist/src/z80/encoderRegistry.js +169 -0
  299. package/docs/reference/cli.md +134 -0
  300. package/docs/reference/tooling-api.md +248 -0
  301. package/package.json +98 -0
@@ -0,0 +1,144 @@
1
+ import { diagLayoutCastRuntimeIndex, isConstantLayoutCastEa } from '../semantics/layoutCastFold.js';
2
+ function eaOperandExpr(op) {
3
+ if (op.kind === 'Ea')
4
+ return op.expr;
5
+ if (op.kind === 'Mem')
6
+ return op.expr;
7
+ return undefined;
8
+ }
9
+ function ldImmediateOpcode(dst) {
10
+ switch (dst) {
11
+ case 'BC':
12
+ return 0x01;
13
+ case 'DE':
14
+ return 0x11;
15
+ case 'HL':
16
+ return 0x21;
17
+ case 'SP':
18
+ return 0x31;
19
+ default:
20
+ return undefined;
21
+ }
22
+ }
23
+ function tryEmitUnresolvedSymbolicImmLd(asmItem, ctx, dst, srcOp) {
24
+ if (srcOp.kind !== 'Imm')
25
+ return false;
26
+ if (ctx.evalImmExpr(srcOp.expr) !== undefined)
27
+ return false;
28
+ const symbolic = ctx.symbolicTargetFromExpr(srcOp.expr);
29
+ if (!symbolic)
30
+ return false;
31
+ const baseLower = ctx.resolveRawLabelName(symbolic.baseLower).toLowerCase();
32
+ const opcode = ldImmediateOpcode(dst);
33
+ if (opcode !== undefined) {
34
+ ctx.emitAbs16Fixup(opcode, baseLower, symbolic.addend, asmItem.span);
35
+ return true;
36
+ }
37
+ if (dst === 'IX' || dst === 'IY') {
38
+ ctx.emitAbs16FixupPrefixed(dst === 'IX' ? 0xdd : 0xfd, 0x21, baseLower, symbolic.addend, asmItem.span);
39
+ return true;
40
+ }
41
+ return false;
42
+ }
43
+ /** Emit ordinary abs16 fixups for folded layout-cast address expressions. */
44
+ function tryLdFoldedLayoutCast(asmItem, ctx) {
45
+ if (asmItem.operands.length !== 2)
46
+ return false;
47
+ const dstOp = asmItem.operands[0];
48
+ const srcOp = asmItem.operands[1];
49
+ const span = asmItem.span;
50
+ const emitFromAbs = (opcode, resolved, prefixed) => {
51
+ if (resolved.kind !== 'abs')
52
+ return;
53
+ if (prefixed) {
54
+ ctx.emitAbs16FixupPrefixed(prefixed.prefix, prefixed.opcode2, resolved.baseLower, resolved.addend, span);
55
+ }
56
+ else {
57
+ ctx.emitAbs16Fixup(opcode, resolved.baseLower, resolved.addend, span);
58
+ }
59
+ };
60
+ const dstName = dstOp.kind === 'Reg' ? dstOp.name.toUpperCase() : undefined;
61
+ const srcEa = eaOperandExpr(srcOp);
62
+ const dstEa = eaOperandExpr(dstOp);
63
+ if (srcEa && isConstantLayoutCastEa(srcEa)) {
64
+ const resolved = ctx.resolveEa(srcEa, span);
65
+ if (resolved?.kind === 'abs') {
66
+ if (dstName === 'A' && srcOp.kind === 'Mem') {
67
+ emitFromAbs(0x3a, resolved);
68
+ return true;
69
+ }
70
+ if (dstName === 'HL') {
71
+ emitFromAbs(0x21, resolved);
72
+ return true;
73
+ }
74
+ if (dstName === 'DE') {
75
+ emitFromAbs(0x11, resolved);
76
+ return true;
77
+ }
78
+ if (dstName === 'BC') {
79
+ emitFromAbs(0x01, resolved);
80
+ return true;
81
+ }
82
+ if (dstName === 'SP') {
83
+ emitFromAbs(0x31, resolved);
84
+ return true;
85
+ }
86
+ if (dstName === 'IX') {
87
+ emitFromAbs(0x21, resolved, { prefix: 0xdd, opcode2: 0x21 });
88
+ return true;
89
+ }
90
+ if (dstName === 'IY') {
91
+ emitFromAbs(0x21, resolved, { prefix: 0xfd, opcode2: 0x21 });
92
+ return true;
93
+ }
94
+ }
95
+ }
96
+ if (dstEa && isConstantLayoutCastEa(dstEa)) {
97
+ const resolved = ctx.resolveEa(dstEa, span);
98
+ if (resolved?.kind === 'abs' && srcOp.kind === 'Reg' && srcOp.name.toUpperCase() === 'A') {
99
+ emitFromAbs(0x32, resolved);
100
+ return true;
101
+ }
102
+ }
103
+ return false;
104
+ }
105
+ export function tryLowerLdInstruction(asmItem, ctx) {
106
+ const head = asmItem.head.toLowerCase();
107
+ if (head !== 'ld')
108
+ return undefined;
109
+ for (const op of asmItem.operands) {
110
+ const ea = eaOperandExpr(op);
111
+ if (ea && diagLayoutCastRuntimeIndex(ctx.diagnostics, asmItem.span, ea)) {
112
+ ctx.syncToFlow();
113
+ return true;
114
+ }
115
+ }
116
+ if (asmItem.operands.length === 2) {
117
+ const dstOp = asmItem.operands[0];
118
+ const srcOp = asmItem.operands[1];
119
+ const dst = dstOp.kind === 'Reg' ? dstOp.name.toUpperCase() : undefined;
120
+ if (tryEmitUnresolvedSymbolicImmLd(asmItem, ctx, dst, srcOp)) {
121
+ ctx.syncToFlow();
122
+ return true;
123
+ }
124
+ if (ctx.emitAbs16LdFixup(dstOp, srcOp, asmItem.span)) {
125
+ ctx.syncToFlow();
126
+ return true;
127
+ }
128
+ if (tryLdFoldedLayoutCast(asmItem, ctx)) {
129
+ ctx.syncToFlow();
130
+ return true;
131
+ }
132
+ }
133
+ if (asmItem.operands.some((op) => op.kind === 'Mem' && op.expr.kind !== 'EaImm' && !ctx.isRegisterLikeMemEa(op.expr))) {
134
+ if (ctx.lowerLdWithEa(asmItem)) {
135
+ ctx.syncToFlow();
136
+ return true;
137
+ }
138
+ }
139
+ if (asmItem.operands.some(ctx.isUnresolvedLayoutLdOperand)) {
140
+ ctx.diagAt(ctx.diagnostics, asmItem.span, `"ld" does not accept unresolved layout operands; use explicit labels, directives, and constant layout expressions.`);
141
+ return true;
142
+ }
143
+ return undefined;
144
+ }
@@ -0,0 +1,17 @@
1
+ import type { AsmInstructionNode, AsmItemNode, SourceSpan } from '../frontend/ast.js';
2
+ import type { FlowState } from './assemblerFlowSetup.js';
3
+ type Context<TCodeSegmentTag> = {
4
+ sourceTagForSpan: (span: SourceSpan) => TCodeSegmentTag;
5
+ getCurrentCodeSegmentTag: () => TCodeSegmentTag | undefined;
6
+ setCurrentCodeSegmentTag: (tag: TCodeSegmentTag | undefined) => void;
7
+ defineCodeLabel: (name: string, span: SourceSpan, scope: 'global' | 'local') => void;
8
+ emitAsmInstruction: (item: AsmInstructionNode) => void;
9
+ flowRef: {
10
+ readonly current: FlowState;
11
+ };
12
+ syncFromFlow: () => void;
13
+ };
14
+ export declare function createAsmRangeLoweringHelpers<TCodeSegmentTag>(ctx: Context<TCodeSegmentTag>): {
15
+ lowerAsmRange: (asmItems: readonly AsmItemNode[], startIndex: number, stopKinds: Set<string>) => number;
16
+ };
17
+ export {};
@@ -0,0 +1,39 @@
1
+ export function createAsmRangeLoweringHelpers(ctx) {
2
+ const lowerAsmRange = (asmItems, startIndex, stopKinds) => {
3
+ let i = startIndex;
4
+ while (i < asmItems.length) {
5
+ const item = asmItems[i];
6
+ if (stopKinds.has(item.kind))
7
+ return i;
8
+ const prevTag = ctx.getCurrentCodeSegmentTag();
9
+ ctx.setCurrentCodeSegmentTag(ctx.sourceTagForSpan(item.span));
10
+ try {
11
+ if (item.kind === 'AsmLabel') {
12
+ ctx.defineCodeLabel(item.name, item.span, 'global');
13
+ if (!ctx.flowRef.current.reachable) {
14
+ ctx.flowRef.current.reachable = true;
15
+ ctx.flowRef.current.spValid = false;
16
+ ctx.flowRef.current.spDelta = 0;
17
+ ctx.flowRef.current.spInvalidDueToMutation = false;
18
+ ctx.syncFromFlow();
19
+ }
20
+ i++;
21
+ continue;
22
+ }
23
+ if (item.kind === 'AsmInstruction') {
24
+ ctx.emitAsmInstruction(item);
25
+ i++;
26
+ continue;
27
+ }
28
+ }
29
+ finally {
30
+ ctx.setCurrentCodeSegmentTag(prevTag);
31
+ }
32
+ i++;
33
+ }
34
+ return i;
35
+ };
36
+ return {
37
+ lowerAsmRange,
38
+ };
39
+ }
@@ -0,0 +1,16 @@
1
+ import type { ImmExprNode, SourceSpan } from '../frontend/ast.js';
2
+ import type { Context } from './programLowering.js';
3
+ type RawValueLike = ImmExprNode | string | {
4
+ kind: string;
5
+ value?: unknown;
6
+ };
7
+ export type RawDataLike = {
8
+ span: SourceSpan;
9
+ name?: string;
10
+ directive: 'db' | 'dw' | 'ds' | 'cstr' | 'pstr' | 'istr';
11
+ values?: RawValueLike[];
12
+ size?: ImmExprNode;
13
+ fill?: ImmExprNode;
14
+ };
15
+ export declare function createAsmRawDataLowerer(ctx: Context): (decl: RawDataLike) => void;
16
+ export {};
@@ -0,0 +1,209 @@
1
+ import { sizeOfTypeExpr } from '../semantics/layout.js';
2
+ import { containsCurrentLocation, evalAsmImmAtCurrent, placementAddressAtOffset, publishAsmAddressConst, } from './asmDirectiveTraversal.js';
3
+ function rawStringValue(value) {
4
+ if (typeof value === 'string')
5
+ return value;
6
+ if (!('kind' in value))
7
+ return undefined;
8
+ if (value.kind === 'AsmString') {
9
+ return typeof value.value === 'string' ? value.value : undefined;
10
+ }
11
+ return undefined;
12
+ }
13
+ function rawImmValue(value) {
14
+ if (typeof value === 'string')
15
+ return undefined;
16
+ if (!('kind' in value))
17
+ return undefined;
18
+ return value.kind.startsWith('Imm') ? value : undefined;
19
+ }
20
+ function evalRawDataSize(ctx, size) {
21
+ if (size.kind === 'ImmName') {
22
+ const constValue = ctx.env.equates.get(size.name) ?? ctx.env.equates.get(size.name.toLowerCase());
23
+ const enumValue = ctx.env.enums.get(size.name);
24
+ if (constValue === undefined && enumValue === undefined) {
25
+ const typeExpr = { kind: 'TypeName', span: size.span, name: size.name };
26
+ const typeSize = sizeOfTypeExpr(typeExpr, ctx.env, undefined);
27
+ if (typeSize !== undefined)
28
+ return typeSize;
29
+ }
30
+ }
31
+ return ctx.evalImmExpr(size, ctx.env, ctx.diagnostics);
32
+ }
33
+ export function createAsmRawDataLowerer(ctx) {
34
+ return (decl) => {
35
+ const activePlacement = ctx.activePlacementRef.current;
36
+ const name = decl.name ?? '';
37
+ if (name.length > 0) {
38
+ const lower = name.toLowerCase();
39
+ if (ctx.taken.has(lower)) {
40
+ const alreadyPending = ctx.pending.some((symbol) => symbol.name.toLowerCase() === lower);
41
+ if (!alreadyPending)
42
+ ctx.diag(ctx.diagnostics, decl.span.file, `Duplicate symbol name "${name}".`);
43
+ }
44
+ else {
45
+ ctx.taken.add(lower);
46
+ const offset = activePlacement === 'code' ? ctx.codeOffsetRef.current : ctx.dataOffsetRef.current;
47
+ const address = placementAddressAtOffset(ctx, activePlacement, offset);
48
+ if (address !== undefined)
49
+ publishAsmAddressConst(ctx, name, address);
50
+ const pending = {
51
+ kind: 'label',
52
+ name,
53
+ placement: activePlacement,
54
+ offset,
55
+ file: decl.span.file,
56
+ line: decl.span.start.line,
57
+ scope: 'global',
58
+ };
59
+ ctx.pending.push(pending);
60
+ ctx.recordLoweredAsmItem({ kind: 'label', name }, decl.span);
61
+ }
62
+ }
63
+ const writeByte = (value) => {
64
+ if (activePlacement === 'code') {
65
+ const offset = ctx.codeOffsetRef.current;
66
+ ctx.codeBytes.set(offset, value & 0xff);
67
+ ctx.codeOffsetRef.current = offset + 1;
68
+ }
69
+ else {
70
+ const offset = ctx.dataOffsetRef.current;
71
+ ctx.dataBytes.set(offset, value & 0xff);
72
+ ctx.dataOffsetRef.current = offset + 1;
73
+ }
74
+ };
75
+ const writeWord = (value) => {
76
+ writeByte(value & 0xff);
77
+ writeByte((value >> 8) & 0xff);
78
+ };
79
+ const currentAddress = () => {
80
+ const offset = activePlacement === 'code' ? ctx.codeOffsetRef.current : ctx.dataOffsetRef.current;
81
+ return placementAddressAtOffset(ctx, activePlacement, offset);
82
+ };
83
+ if (decl.directive === 'ds') {
84
+ if (!decl.size) {
85
+ ctx.diag(ctx.diagnostics, decl.span.file, `Raw data size is missing for "${name}".`);
86
+ return;
87
+ }
88
+ const size = evalRawDataSize(ctx, decl.size);
89
+ if (size === undefined || size < 0) {
90
+ ctx.diag(ctx.diagnostics, decl.span.file, `Failed to evaluate raw data size for "${name}".`);
91
+ return;
92
+ }
93
+ const fill = decl.fill ? ctx.evalImmExpr(decl.fill, ctx.env, ctx.diagnostics) : undefined;
94
+ if (decl.fill && fill === undefined) {
95
+ ctx.diag(ctx.diagnostics, decl.span.file, `Failed to evaluate raw data fill for "${name}".`);
96
+ return;
97
+ }
98
+ ctx.recordLoweredAsmItem({
99
+ kind: 'ds',
100
+ size: { kind: 'literal', value: size },
101
+ ...(decl.fill ? { fill: ctx.lowerImmExprForLoweredAsm(decl.fill) } : {}),
102
+ }, decl.span);
103
+ if (fill === undefined) {
104
+ if (activePlacement === 'code') {
105
+ ctx.codeOffsetRef.current += size;
106
+ }
107
+ else {
108
+ ctx.dataOffsetRef.current += size;
109
+ }
110
+ return;
111
+ }
112
+ for (let i = 0; i < size; i++)
113
+ writeByte(fill);
114
+ return;
115
+ }
116
+ if (decl.directive === 'cstr' || decl.directive === 'pstr' || decl.directive === 'istr') {
117
+ const stringValue = rawStringValue((decl.values ?? [])[0] ?? '');
118
+ if (stringValue === undefined) {
119
+ ctx.diag(ctx.diagnostics, decl.span.file, `"${decl.directive}" expects a string value.`);
120
+ return;
121
+ }
122
+ const bytes = [...stringValue].map((char) => char.codePointAt(0) ?? 0);
123
+ const emittedBytes = [];
124
+ const writeStringByte = (value) => {
125
+ const byte = value & 0xff;
126
+ writeByte(byte);
127
+ emittedBytes.push(byte);
128
+ };
129
+ if (decl.directive === 'cstr') {
130
+ for (const byte of bytes)
131
+ writeStringByte(byte);
132
+ writeStringByte(0);
133
+ }
134
+ else if (decl.directive === 'pstr') {
135
+ writeStringByte(bytes.length);
136
+ for (const byte of bytes)
137
+ writeStringByte(byte);
138
+ }
139
+ else if (bytes.length > 0) {
140
+ for (let i = 0; i < bytes.length; i++) {
141
+ const isLast = i === bytes.length - 1;
142
+ writeStringByte(bytes[i] | (isLast ? 0x80 : 0));
143
+ }
144
+ }
145
+ if (emittedBytes.length > 0) {
146
+ ctx.recordLoweredAsmItem({
147
+ kind: 'db',
148
+ values: emittedBytes.map((value) => ({ kind: 'literal', value })),
149
+ }, decl.span);
150
+ }
151
+ return;
152
+ }
153
+ const loweredValues = [];
154
+ for (const value of decl.values ?? []) {
155
+ const stringValue = rawStringValue(value);
156
+ if (stringValue !== undefined) {
157
+ if (decl.directive !== 'db') {
158
+ ctx.diag(ctx.diagnostics, decl.span.file, `String raw data values are only valid for "db".`);
159
+ continue;
160
+ }
161
+ for (const char of stringValue) {
162
+ const byte = char.codePointAt(0) ?? 0;
163
+ writeByte(byte);
164
+ loweredValues.push({ kind: 'literal', value: byte & 0xff });
165
+ }
166
+ continue;
167
+ }
168
+ const imm = rawImmValue(value);
169
+ if (!imm) {
170
+ ctx.diag(ctx.diagnostics, decl.span.file, `Failed to evaluate raw data value for "${name}".`);
171
+ if (decl.directive === 'db')
172
+ writeByte(0);
173
+ else
174
+ writeWord(0);
175
+ continue;
176
+ }
177
+ const usesCurrentLocation = containsCurrentLocation(imm);
178
+ const current = usesCurrentLocation ? currentAddress() : undefined;
179
+ if (usesCurrentLocation && current === undefined) {
180
+ ctx.diag(ctx.diagnostics, decl.span.file, `Failed to evaluate current location.`);
181
+ if (decl.directive === 'db')
182
+ writeByte(0);
183
+ else
184
+ writeWord(0);
185
+ continue;
186
+ }
187
+ const evaluated = current === undefined
188
+ ? ctx.evalImmExpr(imm, ctx.env, ctx.diagnostics)
189
+ : evalAsmImmAtCurrent(ctx, imm, current);
190
+ loweredValues.push(evaluated === undefined
191
+ ? ctx.lowerImmExprForLoweredAsm(imm)
192
+ : { kind: 'literal', value: evaluated });
193
+ if (evaluated !== undefined) {
194
+ if (decl.directive === 'db')
195
+ writeByte(evaluated);
196
+ else
197
+ writeWord(evaluated);
198
+ continue;
199
+ }
200
+ if (decl.directive === 'db')
201
+ writeByte(0);
202
+ else
203
+ writeWord(0);
204
+ }
205
+ ctx.recordLoweredAsmItem(decl.directive === 'db'
206
+ ? { kind: 'db', values: loweredValues }
207
+ : { kind: 'dw', values: loweredValues }, decl.span);
208
+ };
209
+ }
@@ -0,0 +1,4 @@
1
+ import type { LoweringContext } from './programLowering.js';
2
+ import { createAssemblerInstructionEmitters } from './assemblerLoweringPhases.js';
3
+ export type AsmSourceEmitter = ReturnType<typeof createAssemblerInstructionEmitters>;
4
+ export declare function createAsmSourceEmitter(ctx: LoweringContext): AsmSourceEmitter;
@@ -0,0 +1,9 @@
1
+ import { createAssemblerInstructionEmitters, createAsmSourceFlowPhase, prepareAssemblerInstructionSetupPhase, } from './assemblerLoweringPhases.js';
2
+ function createAsmSourceSetup(ctx) {
3
+ return prepareAssemblerInstructionSetupPhase(ctx);
4
+ }
5
+ export function createAsmSourceEmitter(ctx) {
6
+ const setup = createAsmSourceSetup(ctx);
7
+ const flow = createAsmSourceFlowPhase(setup);
8
+ return createAssemblerInstructionEmitters(setup, flow);
9
+ }
@@ -0,0 +1,4 @@
1
+ import type { AsmInstructionNode } from '../frontend/ast.js';
2
+ import type { LoweringContext } from './programLowering.js';
3
+ /** Lowers one top-level instruction in ASM source via op expansion and full ld/ea pipelines. */
4
+ export declare function lowerAsmSourceInstruction(ctx: LoweringContext, item: AsmInstructionNode): void;
@@ -0,0 +1,14 @@
1
+ import { createAsmSourceEmitter } from './asmSourceEmitter.js';
2
+ const asmSourceEmitterByContext = new WeakMap();
3
+ function asmSourceEmitterForContext(ctx) {
4
+ let emitter = asmSourceEmitterByContext.get(ctx);
5
+ if (emitter)
6
+ return emitter;
7
+ emitter = createAsmSourceEmitter(ctx);
8
+ asmSourceEmitterByContext.set(ctx, emitter);
9
+ return emitter;
10
+ }
11
+ /** Lowers one top-level instruction in ASM source via op expansion and full ld/ea pipelines. */
12
+ export function lowerAsmSourceInstruction(ctx, item) {
13
+ asmSourceEmitterForContext(ctx).emitAsmInstruction(item);
14
+ }
@@ -0,0 +1,13 @@
1
+ import type { AsmOperandNode, EaExprNode, ImmExprNode } from '../frontend/ast.js';
2
+ type AsmUtilsContext = {
3
+ /** Returns true when `name` matches a declared enum (used to normalize asm tokens); callback must stay pure. */
4
+ isEnumName: (name: string) => boolean;
5
+ };
6
+ export declare function cloneImmExpr(expr: ImmExprNode): ImmExprNode;
7
+ export declare function cloneEaExpr(ea: EaExprNode): EaExprNode;
8
+ export declare function cloneOperand(op: AsmOperandNode): AsmOperandNode;
9
+ export declare function flattenEaDottedName(ea: EaExprNode): string | undefined;
10
+ export declare function createAsmUtilityHelpers(ctx: AsmUtilsContext): {
11
+ normalizeFixedToken: (op: AsmOperandNode) => string | undefined;
12
+ };
13
+ export {};
@@ -0,0 +1,105 @@
1
+ function cloneOffsetPath(path) {
2
+ return {
3
+ ...path,
4
+ steps: path.steps.map((step) => step.kind === 'OffsetIndex' ? { ...step, expr: cloneImmExpr(step.expr) } : { ...step }),
5
+ };
6
+ }
7
+ export function cloneImmExpr(expr) {
8
+ if (expr.kind === 'ImmLiteral')
9
+ return { ...expr };
10
+ if (expr.kind === 'ImmCurrentLocation')
11
+ return { ...expr };
12
+ if (expr.kind === 'ImmName')
13
+ return { ...expr };
14
+ if (expr.kind === 'ImmSizeof')
15
+ return { ...expr };
16
+ if (expr.kind === 'ImmOffset')
17
+ return { ...expr, path: cloneOffsetPath(expr.path) };
18
+ if (expr.kind === 'ImmUnary')
19
+ return { ...expr, expr: cloneImmExpr(expr.expr) };
20
+ return { ...expr, left: cloneImmExpr(expr.left), right: cloneImmExpr(expr.right) };
21
+ }
22
+ export function cloneEaExpr(ea) {
23
+ switch (ea.kind) {
24
+ case 'EaName':
25
+ return { ...ea };
26
+ case 'EaImm':
27
+ return { ...ea, expr: cloneImmExpr(ea.expr) };
28
+ case 'EaLayoutCast':
29
+ return { ...ea, base: cloneEaExpr(ea.base) };
30
+ case 'EaField':
31
+ return { ...ea, base: cloneEaExpr(ea.base) };
32
+ case 'EaIndex':
33
+ return {
34
+ ...ea,
35
+ base: cloneEaExpr(ea.base),
36
+ index: ea.index.kind === 'IndexEa'
37
+ ? { ...ea.index, expr: cloneEaExpr(ea.index.expr) }
38
+ : ea.index.kind === 'IndexImm'
39
+ ? { ...ea.index, value: cloneImmExpr(ea.index.value) }
40
+ : ea.index.kind === 'IndexMemIxIy' && ea.index.disp
41
+ ? { ...ea.index, disp: cloneImmExpr(ea.index.disp) }
42
+ : { ...ea.index },
43
+ };
44
+ case 'EaAdd':
45
+ case 'EaSub':
46
+ return { ...ea, base: cloneEaExpr(ea.base), offset: cloneImmExpr(ea.offset) };
47
+ }
48
+ }
49
+ export function cloneOperand(op) {
50
+ switch (op.kind) {
51
+ case 'Reg':
52
+ case 'PortC':
53
+ return { ...op };
54
+ case 'Imm':
55
+ case 'PortImm8':
56
+ return { ...op, expr: cloneImmExpr(op.expr) };
57
+ case 'Ea':
58
+ case 'Mem':
59
+ return { ...op, expr: cloneEaExpr(op.expr) };
60
+ }
61
+ }
62
+ export function flattenEaDottedName(ea) {
63
+ if (ea.kind === 'EaName')
64
+ return ea.name;
65
+ if (ea.kind === 'EaImm')
66
+ return undefined;
67
+ if (ea.kind === 'EaLayoutCast')
68
+ return undefined;
69
+ if (ea.kind === 'EaField') {
70
+ const base = flattenEaDottedName(ea.base);
71
+ return base ? `${base}.${ea.field}` : undefined;
72
+ }
73
+ return undefined;
74
+ }
75
+ export function createAsmUtilityHelpers(ctx) {
76
+ const enumImmExprFromOperand = (op) => {
77
+ if (op.kind === 'Imm')
78
+ return op.expr;
79
+ if (op.kind !== 'Ea')
80
+ return undefined;
81
+ const name = flattenEaDottedName(op.expr);
82
+ if (!name || !ctx.isEnumName(name))
83
+ return undefined;
84
+ return { kind: 'ImmName', span: op.span, name };
85
+ };
86
+ const normalizeFixedToken = (op) => {
87
+ switch (op.kind) {
88
+ case 'Reg':
89
+ return op.name.toUpperCase();
90
+ case 'Imm':
91
+ if (op.expr.kind === 'ImmName')
92
+ return op.expr.name.toUpperCase();
93
+ return undefined;
94
+ case 'Ea': {
95
+ const enumExpr = enumImmExprFromOperand(op);
96
+ return enumExpr?.kind === 'ImmName' ? enumExpr.name.toUpperCase() : undefined;
97
+ }
98
+ default:
99
+ return undefined;
100
+ }
101
+ };
102
+ return {
103
+ normalizeFixedToken,
104
+ };
105
+ }
@@ -0,0 +1,54 @@
1
+ import type { Diagnostic, DiagnosticId } from '../diagnosticTypes.js';
2
+ import type { AsmInstructionNode, AsmOperandNode, SourceSpan } from '../frontend/ast.js';
3
+ import type { PendingSymbol, SourceSegmentTag } from './loweringTypes.js';
4
+ export type FlowState = {
5
+ reachable: boolean;
6
+ spDelta: number;
7
+ spValid: boolean;
8
+ spInvalidDueToMutation: boolean;
9
+ };
10
+ export type OpExpansionFrame = {
11
+ key: string;
12
+ name: string;
13
+ declSpan: SourceSpan;
14
+ callSiteSpan: SourceSpan;
15
+ };
16
+ type AssemblerFlowSetupContext = {
17
+ diagnostics: Diagnostic[];
18
+ diagAt: (diagnostics: Diagnostic[], span: SourceSpan, message: string) => void;
19
+ diagAtWithId: (diagnostics: Diagnostic[], span: SourceSpan, id: DiagnosticId, message: string) => void;
20
+ getCurrentCodeSegmentTag: () => SourceSegmentTag | undefined;
21
+ setCurrentCodeSegmentTag: (tag: SourceSegmentTag | undefined) => void;
22
+ taken: Set<string>;
23
+ traceLabel: (offset: number, name: string, span?: SourceSpan) => void;
24
+ pending: PendingSymbol[];
25
+ getCodeOffset: () => number;
26
+ emitInstr: (head: string, operands: AsmOperandNode[], span: SourceSpan) => boolean;
27
+ generatedLabelCounterRef: {
28
+ current: number;
29
+ };
30
+ formatAsmOperandForOpDiag: (op: AsmOperandNode) => string;
31
+ };
32
+ export declare function createAssemblerFlowSetupHelpers({ diagnostics, diagAt, diagAtWithId, getCurrentCodeSegmentTag, setCurrentCodeSegmentTag, taken, traceLabel, pending, getCodeOffset, emitInstr, generatedLabelCounterRef, formatAsmOperandForOpDiag, }: AssemblerFlowSetupContext): {
33
+ currentOpExpansionFrame: (opExpansionStack: OpExpansionFrame[]) => OpExpansionFrame | undefined;
34
+ rootOpExpansionFrame: (opExpansionStack: OpExpansionFrame[]) => OpExpansionFrame | undefined;
35
+ currentMacroCallSiteSpan: (opExpansionStack: OpExpansionFrame[]) => SourceSpan | undefined;
36
+ formatInstructionForOpExpansionDiag: (inst: AsmInstructionNode) => string;
37
+ appendInvalidOpExpansionDiagnostic: (inst: AsmInstructionNode, diagnosticsStart: number, opExpansionStack: OpExpansionFrame[]) => void;
38
+ sourceTagForSpan: (span: SourceSpan, opExpansionStack: OpExpansionFrame[]) => SourceSegmentTag;
39
+ withCodeSourceTag: <T>(tag: SourceSegmentTag, fn: () => T) => T;
40
+ syncFromFlow: (flow: FlowState, tracked: {
41
+ delta: number;
42
+ valid: boolean;
43
+ invalid: boolean;
44
+ }) => void;
45
+ syncToFlow: (flow: FlowState, tracked: {
46
+ delta: number;
47
+ valid: boolean;
48
+ invalid: boolean;
49
+ }) => void;
50
+ newHiddenLabel: (prefix: string) => string;
51
+ defineCodeLabel: (name: string, span: SourceSpan, scope: "global" | "local") => void;
52
+ emitVirtualReg16Transfer: (asmItem: AsmInstructionNode) => boolean;
53
+ };
54
+ export {};