@jhlagado/azm 0.1.1 → 0.2.1

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 (423) hide show
  1. package/README.md +103 -70
  2. package/dist/{src → legacy-root-azm/src}/formats/index.d.ts +1 -1
  3. package/dist/{src → legacy-root-azm/src}/formats/index.js +1 -1
  4. package/dist/{src → legacy-root-azm/src}/formats/types.d.ts +67 -7
  5. package/dist/{src → legacy-root-azm/src}/formats/writeHex.d.ts +0 -1
  6. package/dist/{src → legacy-root-azm/src}/formats/writeHex.js +0 -1
  7. package/dist/{src → legacy-root-azm/src}/pipeline.d.ts +3 -5
  8. package/dist/legacy-root-azm/src/z80/effects.d.ts +3 -0
  9. package/dist/legacy-root-azm/src/z80/effects.js +516 -0
  10. package/dist/legacy-root-azm/src/z80/encode.d.ts +10 -0
  11. package/dist/legacy-root-azm/src/z80/encode.js +412 -0
  12. package/dist/src/api-compile.d.ts +49 -8
  13. package/dist/src/api-compile.js +313 -3
  14. package/dist/src/api-tooling.d.ts +7 -25
  15. package/dist/src/api-tooling.js +3 -21
  16. package/dist/src/assembly/address-planning.d.ts +19 -0
  17. package/dist/src/assembly/address-planning.js +268 -0
  18. package/dist/src/assembly/assemble-program.d.ts +13 -0
  19. package/dist/src/assembly/assemble-program.js +34 -0
  20. package/dist/src/assembly/fixup-emission.d.ts +10 -0
  21. package/dist/src/assembly/fixup-emission.js +247 -0
  22. package/dist/src/assembly/placement.d.ts +26 -0
  23. package/dist/src/assembly/placement.js +79 -0
  24. package/dist/src/assembly/program-emission.d.ts +13 -0
  25. package/dist/src/assembly/program-emission.js +268 -0
  26. package/dist/src/cli/parse-args.d.ts +29 -0
  27. package/dist/src/cli/parse-args.js +372 -0
  28. package/dist/src/cli/run.d.ts +2 -0
  29. package/dist/src/cli/run.js +35 -0
  30. package/dist/src/cli/write-artifacts.d.ts +21 -0
  31. package/dist/src/cli/write-artifacts.js +175 -0
  32. package/dist/src/cli.d.ts +1 -30
  33. package/dist/src/cli.js +20 -524
  34. package/dist/src/core/compile-artifacts.d.ts +26 -0
  35. package/dist/src/core/compile-artifacts.js +17 -0
  36. package/dist/src/core/compile.d.ts +26 -0
  37. package/dist/src/core/compile.js +164 -0
  38. package/dist/src/diagnostics/format.d.ts +4 -0
  39. package/dist/src/diagnostics/format.js +9 -0
  40. package/dist/src/expansion/op-expansion.d.ts +96 -0
  41. package/dist/src/expansion/op-expansion.js +913 -0
  42. package/dist/src/index.d.ts +14 -3
  43. package/dist/src/index.js +7 -2
  44. package/dist/src/model/diagnostic.d.ts +50 -0
  45. package/dist/src/model/diagnostic.js +29 -0
  46. package/dist/src/model/expression.d.ts +51 -0
  47. package/dist/src/model/expression.js +1 -0
  48. package/dist/src/model/fixup.d.ts +18 -0
  49. package/dist/src/model/fixup.js +1 -0
  50. package/dist/src/model/source-item.d.ts +87 -0
  51. package/dist/src/model/source-item.js +1 -0
  52. package/dist/src/model/symbol.d.ts +1 -0
  53. package/dist/src/model/symbol.js +1 -0
  54. package/dist/src/node/source-host.d.ts +19 -0
  55. package/dist/src/node/source-host.js +146 -0
  56. package/dist/src/outputs/hex.d.ts +1 -0
  57. package/dist/src/outputs/hex.js +75 -0
  58. package/dist/src/outputs/index.d.ts +3 -0
  59. package/dist/src/outputs/index.js +13 -0
  60. package/dist/src/outputs/range.d.ts +3 -0
  61. package/dist/src/outputs/range.js +31 -0
  62. package/dist/src/outputs/types.d.ts +182 -0
  63. package/dist/src/outputs/types.js +1 -0
  64. package/dist/src/outputs/write-asm80.d.ts +7 -0
  65. package/dist/src/outputs/write-asm80.js +666 -0
  66. package/dist/src/outputs/write-bin.d.ts +2 -0
  67. package/dist/src/outputs/write-bin.js +27 -0
  68. package/dist/src/outputs/write-d8.d.ts +2 -0
  69. package/dist/src/outputs/write-d8.js +257 -0
  70. package/dist/src/outputs/write-hex.d.ts +2 -0
  71. package/dist/src/outputs/write-hex.js +53 -0
  72. package/dist/src/outputs/write-listing.d.ts +2 -0
  73. package/dist/src/outputs/write-listing.js +79 -0
  74. package/dist/src/register-care/accept-output.d.ts +2 -0
  75. package/dist/src/register-care/accept-output.js +35 -0
  76. package/dist/src/register-care/analyze.d.ts +26 -0
  77. package/dist/src/register-care/analyze.js +115 -0
  78. package/dist/src/register-care/annotate.d.ts +11 -0
  79. package/dist/src/register-care/annotate.js +76 -0
  80. package/dist/src/register-care/annotations.d.ts +8 -0
  81. package/dist/src/register-care/annotations.js +41 -0
  82. package/dist/src/register-care/boundaryHints.d.ts +2 -0
  83. package/dist/src/register-care/boundaryHints.js +11 -0
  84. package/dist/src/register-care/carriers.d.ts +2 -0
  85. package/dist/src/register-care/carriers.js +78 -0
  86. package/dist/src/register-care/controlFlow.d.ts +5 -0
  87. package/dist/src/register-care/controlFlow.js +38 -0
  88. package/dist/src/register-care/fix.d.ts +11 -0
  89. package/dist/src/register-care/fix.js +130 -0
  90. package/dist/src/register-care/instruction-shape.d.ts +11 -0
  91. package/dist/src/register-care/instruction-shape.js +129 -0
  92. package/dist/src/register-care/liveness.d.ts +3 -0
  93. package/dist/src/register-care/liveness.js +197 -0
  94. package/dist/src/register-care/profiles.d.ts +9 -0
  95. package/dist/src/register-care/profiles.js +47 -0
  96. package/dist/src/register-care/programModel.d.ts +3 -0
  97. package/dist/src/register-care/programModel.js +188 -0
  98. package/dist/src/register-care/report.d.ts +5 -0
  99. package/dist/src/register-care/report.js +139 -0
  100. package/dist/src/register-care/routine-summaries.d.ts +6 -0
  101. package/dist/src/register-care/routine-summaries.js +89 -0
  102. package/dist/src/register-care/smartComments.d.ts +5 -0
  103. package/dist/src/register-care/smartComments.js +243 -0
  104. package/dist/src/register-care/sourceText.d.ts +8 -0
  105. package/dist/src/register-care/sourceText.js +15 -0
  106. package/dist/src/register-care/summaries.d.ts +12 -0
  107. package/dist/src/register-care/summaries.js +121 -0
  108. package/dist/src/register-care/summary.d.ts +3 -0
  109. package/dist/src/register-care/summary.js +474 -0
  110. package/dist/src/{registerCare → register-care}/tooling.d.ts +7 -6
  111. package/dist/src/{registerCare → register-care}/tooling.js +17 -6
  112. package/dist/src/register-care/types.d.ts +170 -0
  113. package/dist/src/register-care/types.js +1 -0
  114. package/dist/src/semantics/expression-evaluation.d.ts +29 -0
  115. package/dist/src/semantics/expression-evaluation.js +409 -0
  116. package/dist/src/source/logical-lines.d.ts +7 -0
  117. package/dist/src/source/logical-lines.js +11 -0
  118. package/dist/src/source/source-file.d.ts +5 -0
  119. package/dist/src/source/source-file.js +3 -0
  120. package/dist/src/source/source-span.d.ts +5 -0
  121. package/dist/src/source/source-span.js +1 -0
  122. package/dist/src/source/strip-line-comment.d.ts +6 -0
  123. package/dist/src/source/strip-line-comment.js +53 -0
  124. package/dist/src/syntax/directive-aliases.d.ts +10 -0
  125. package/dist/src/syntax/directive-aliases.js +199 -0
  126. package/dist/src/syntax/parse-diagnostics.d.ts +12 -0
  127. package/dist/src/syntax/parse-diagnostics.js +18 -0
  128. package/dist/src/syntax/parse-expression.d.ts +3 -0
  129. package/dist/src/syntax/parse-expression.js +551 -0
  130. package/dist/src/syntax/parse-line.d.ts +12 -0
  131. package/dist/src/syntax/parse-line.js +382 -0
  132. package/dist/src/tooling/api.d.ts +42 -0
  133. package/dist/src/tooling/api.js +42 -0
  134. package/dist/src/tooling/case-style.d.ts +8 -0
  135. package/dist/src/tooling/case-style.js +163 -0
  136. package/dist/src/z80/effects.d.ts +3 -3
  137. package/dist/src/z80/effects.js +349 -302
  138. package/dist/src/z80/encode.d.ts +2 -10
  139. package/dist/src/z80/encode.js +951 -374
  140. package/dist/src/z80/instruction.d.ts +226 -0
  141. package/dist/src/z80/instruction.js +1 -0
  142. package/dist/src/z80/parse-instruction.d.ts +7 -0
  143. package/dist/src/z80/parse-instruction.js +1068 -0
  144. package/docs/reference/tooling-api.md +68 -9
  145. package/package.json +22 -3
  146. /package/dist/{src → legacy-root-azm/src}/analysis.d.ts +0 -0
  147. /package/dist/{src → legacy-root-azm/src}/analysis.js +0 -0
  148. /package/dist/{src → legacy-root-azm/src}/compile.d.ts +0 -0
  149. /package/dist/{src → legacy-root-azm/src}/compile.js +0 -0
  150. /package/dist/{src → legacy-root-azm/src}/compileShared.d.ts +0 -0
  151. /package/dist/{src → legacy-root-azm/src}/compileShared.js +0 -0
  152. /package/dist/{src → legacy-root-azm/src}/diagnosticTypes.d.ts +0 -0
  153. /package/dist/{src → legacy-root-azm/src}/diagnosticTypes.js +0 -0
  154. /package/dist/{src → legacy-root-azm/src}/formats/range.d.ts +0 -0
  155. /package/dist/{src → legacy-root-azm/src}/formats/range.js +0 -0
  156. /package/dist/{src → legacy-root-azm/src}/formats/types.js +0 -0
  157. /package/dist/{src → legacy-root-azm/src}/formats/writeAsm80.d.ts +0 -0
  158. /package/dist/{src → legacy-root-azm/src}/formats/writeAsm80.js +0 -0
  159. /package/dist/{src → legacy-root-azm/src}/formats/writeBin.d.ts +0 -0
  160. /package/dist/{src → legacy-root-azm/src}/formats/writeBin.js +0 -0
  161. /package/dist/{src → legacy-root-azm/src}/formats/writeD8m.d.ts +0 -0
  162. /package/dist/{src → legacy-root-azm/src}/formats/writeD8m.js +0 -0
  163. /package/dist/{src → legacy-root-azm/src}/formats/writeListing.d.ts +0 -0
  164. /package/dist/{src → legacy-root-azm/src}/formats/writeListing.js +0 -0
  165. /package/dist/{src → legacy-root-azm/src}/frontend/asm80/asmLine.d.ts +0 -0
  166. /package/dist/{src → legacy-root-azm/src}/frontend/asm80/asmLine.js +0 -0
  167. /package/dist/{src → legacy-root-azm/src}/frontend/asm80/parseAsmRawValues.d.ts +0 -0
  168. /package/dist/{src → legacy-root-azm/src}/frontend/asm80/parseAsmRawValues.js +0 -0
  169. /package/dist/{src → legacy-root-azm/src}/frontend/asm80/quoteScan.d.ts +0 -0
  170. /package/dist/{src → legacy-root-azm/src}/frontend/asm80/quoteScan.js +0 -0
  171. /package/dist/{src → legacy-root-azm/src}/frontend/ast.d.ts +0 -0
  172. /package/dist/{src → legacy-root-azm/src}/frontend/ast.js +0 -0
  173. /package/dist/{src → legacy-root-azm/src}/frontend/directiveAliases.d.ts +0 -0
  174. /package/dist/{src → legacy-root-azm/src}/frontend/directiveAliases.js +0 -0
  175. /package/dist/{src → legacy-root-azm/src}/frontend/grammarData.d.ts +0 -0
  176. /package/dist/{src → legacy-root-azm/src}/frontend/grammarData.js +0 -0
  177. /package/dist/{src → legacy-root-azm/src}/frontend/immExprUtils.d.ts +0 -0
  178. /package/dist/{src → legacy-root-azm/src}/frontend/immExprUtils.js +0 -0
  179. /package/dist/{src → legacy-root-azm/src}/frontend/parseAsmFlatDirectiveLine.d.ts +0 -0
  180. /package/dist/{src → legacy-root-azm/src}/frontend/parseAsmFlatDirectiveLine.js +0 -0
  181. /package/dist/{src → legacy-root-azm/src}/frontend/parseAsmInstruction.d.ts +0 -0
  182. /package/dist/{src → legacy-root-azm/src}/frontend/parseAsmInstruction.js +0 -0
  183. /package/dist/{src → legacy-root-azm/src}/frontend/parseAsmStatements.d.ts +0 -0
  184. /package/dist/{src → legacy-root-azm/src}/frontend/parseAsmStatements.js +0 -0
  185. /package/dist/{src → legacy-root-azm/src}/frontend/parseAsmStream.d.ts +0 -0
  186. /package/dist/{src → legacy-root-azm/src}/frontend/parseAsmStream.js +0 -0
  187. /package/dist/{src → legacy-root-azm/src}/frontend/parseAsmTopLevel.d.ts +0 -0
  188. /package/dist/{src → legacy-root-azm/src}/frontend/parseAsmTopLevel.js +0 -0
  189. /package/dist/{src → legacy-root-azm/src}/frontend/parseDiagnostics.d.ts +0 -0
  190. /package/dist/{src → legacy-root-azm/src}/frontend/parseDiagnostics.js +0 -0
  191. /package/dist/{src → legacy-root-azm/src}/frontend/parseEnum.d.ts +0 -0
  192. /package/dist/{src → legacy-root-azm/src}/frontend/parseEnum.js +0 -0
  193. /package/dist/{src → legacy-root-azm/src}/frontend/parseImm.d.ts +0 -0
  194. /package/dist/{src → legacy-root-azm/src}/frontend/parseImm.js +0 -0
  195. /package/dist/{src → legacy-root-azm/src}/frontend/parseLogicalLines.d.ts +0 -0
  196. /package/dist/{src → legacy-root-azm/src}/frontend/parseLogicalLines.js +0 -0
  197. /package/dist/{src → legacy-root-azm/src}/frontend/parseOp.d.ts +0 -0
  198. /package/dist/{src → legacy-root-azm/src}/frontend/parseOp.js +0 -0
  199. /package/dist/{src → legacy-root-azm/src}/frontend/parseOpHeader.d.ts +0 -0
  200. /package/dist/{src → legacy-root-azm/src}/frontend/parseOpHeader.js +0 -0
  201. /package/dist/{src → legacy-root-azm/src}/frontend/parseOperands.d.ts +0 -0
  202. /package/dist/{src → legacy-root-azm/src}/frontend/parseOperands.js +0 -0
  203. /package/dist/{src → legacy-root-azm/src}/frontend/parseParams.d.ts +0 -0
  204. /package/dist/{src → legacy-root-azm/src}/frontend/parseParams.js +0 -0
  205. /package/dist/{src → legacy-root-azm/src}/frontend/parseParserRecovery.d.ts +0 -0
  206. /package/dist/{src → legacy-root-azm/src}/frontend/parseParserRecovery.js +0 -0
  207. /package/dist/{src → legacy-root-azm/src}/frontend/parseParserShared.d.ts +0 -0
  208. /package/dist/{src → legacy-root-azm/src}/frontend/parseParserShared.js +0 -0
  209. /package/dist/{src → legacy-root-azm/src}/frontend/parseRawDataDirectiveStart.d.ts +0 -0
  210. /package/dist/{src → legacy-root-azm/src}/frontend/parseRawDataDirectiveStart.js +0 -0
  211. /package/dist/{src → legacy-root-azm/src}/frontend/parseRawDataDirectives.d.ts +0 -0
  212. /package/dist/{src → legacy-root-azm/src}/frontend/parseRawDataDirectives.js +0 -0
  213. /package/dist/{src → legacy-root-azm/src}/frontend/parseRecordFieldDecl.d.ts +0 -0
  214. /package/dist/{src → legacy-root-azm/src}/frontend/parseRecordFieldDecl.js +0 -0
  215. /package/dist/{src → legacy-root-azm/src}/frontend/parseSourceItemDispatch.d.ts +0 -0
  216. /package/dist/{src → legacy-root-azm/src}/frontend/parseSourceItemDispatch.js +0 -0
  217. /package/dist/{src → legacy-root-azm/src}/frontend/parseSourceItemTable.d.ts +0 -0
  218. /package/dist/{src → legacy-root-azm/src}/frontend/parseSourceItemTable.js +0 -0
  219. /package/dist/{src → legacy-root-azm/src}/frontend/parseTopLevelCommon.d.ts +0 -0
  220. /package/dist/{src → legacy-root-azm/src}/frontend/parseTopLevelCommon.js +0 -0
  221. /package/dist/{src → legacy-root-azm/src}/frontend/parseTypes.d.ts +0 -0
  222. /package/dist/{src → legacy-root-azm/src}/frontend/parseTypes.js +0 -0
  223. /package/dist/{src → legacy-root-azm/src}/frontend/parser.d.ts +0 -0
  224. /package/dist/{src → legacy-root-azm/src}/frontend/parser.js +0 -0
  225. /package/dist/{src → legacy-root-azm/src}/frontend/source.d.ts +0 -0
  226. /package/dist/{src → legacy-root-azm/src}/frontend/source.js +0 -0
  227. /package/dist/{src → legacy-root-azm/src}/frontend/sourceExtensions.d.ts +0 -0
  228. /package/dist/{src → legacy-root-azm/src}/frontend/sourceExtensions.js +0 -0
  229. /package/dist/{src → legacy-root-azm/src}/lintCaseStyle.d.ts +0 -0
  230. /package/dist/{src → legacy-root-azm/src}/lintCaseStyle.js +0 -0
  231. /package/dist/{src → legacy-root-azm/src}/lowering/asmDirectiveLowering.d.ts +0 -0
  232. /package/dist/{src → legacy-root-azm/src}/lowering/asmDirectiveLowering.js +0 -0
  233. /package/dist/{src → legacy-root-azm/src}/lowering/asmDirectiveTraversal.d.ts +0 -0
  234. /package/dist/{src → legacy-root-azm/src}/lowering/asmDirectiveTraversal.js +0 -0
  235. /package/dist/{src → legacy-root-azm/src}/lowering/asmEquResolution.d.ts +0 -0
  236. /package/dist/{src → legacy-root-azm/src}/lowering/asmEquResolution.js +0 -0
  237. /package/dist/{src → legacy-root-azm/src}/lowering/asmInstructionLdHelpers.d.ts +0 -0
  238. /package/dist/{src → legacy-root-azm/src}/lowering/asmInstructionLdHelpers.js +0 -0
  239. /package/dist/{src → legacy-root-azm/src}/lowering/asmInstructionLowering.d.ts +0 -0
  240. /package/dist/{src → legacy-root-azm/src}/lowering/asmInstructionLowering.js +0 -0
  241. /package/dist/{src → legacy-root-azm/src}/lowering/asmInstructionStream.d.ts +0 -0
  242. /package/dist/{src → legacy-root-azm/src}/lowering/asmInstructionStream.js +0 -0
  243. /package/dist/{src → legacy-root-azm/src}/lowering/asmLoweringBranchCall.d.ts +0 -0
  244. /package/dist/{src → legacy-root-azm/src}/lowering/asmLoweringBranchCall.js +0 -0
  245. /package/dist/{src → legacy-root-azm/src}/lowering/asmLoweringHost.d.ts +0 -0
  246. /package/dist/{src → legacy-root-azm/src}/lowering/asmLoweringHost.js +0 -0
  247. /package/dist/{src → legacy-root-azm/src}/lowering/asmLoweringLd.d.ts +0 -0
  248. /package/dist/{src → legacy-root-azm/src}/lowering/asmLoweringLd.js +0 -0
  249. /package/dist/{src → legacy-root-azm/src}/lowering/asmRangeLowering.d.ts +0 -0
  250. /package/dist/{src → legacy-root-azm/src}/lowering/asmRangeLowering.js +0 -0
  251. /package/dist/{src → legacy-root-azm/src}/lowering/asmRawDataLowering.d.ts +0 -0
  252. /package/dist/{src → legacy-root-azm/src}/lowering/asmRawDataLowering.js +0 -0
  253. /package/dist/{src → legacy-root-azm/src}/lowering/asmSourceEmitter.d.ts +0 -0
  254. /package/dist/{src → legacy-root-azm/src}/lowering/asmSourceEmitter.js +0 -0
  255. /package/dist/{src → legacy-root-azm/src}/lowering/asmSourceInstructionLowering.d.ts +0 -0
  256. /package/dist/{src → legacy-root-azm/src}/lowering/asmSourceInstructionLowering.js +0 -0
  257. /package/dist/{src → legacy-root-azm/src}/lowering/asmUtils.d.ts +0 -0
  258. /package/dist/{src → legacy-root-azm/src}/lowering/asmUtils.js +0 -0
  259. /package/dist/{src → legacy-root-azm/src}/lowering/assemblerFlowSetup.d.ts +0 -0
  260. /package/dist/{src → legacy-root-azm/src}/lowering/assemblerFlowSetup.js +0 -0
  261. /package/dist/{src → legacy-root-azm/src}/lowering/assemblerLoweringContext.d.ts +0 -0
  262. /package/dist/{src → legacy-root-azm/src}/lowering/assemblerLoweringContext.js +0 -0
  263. /package/dist/{src → legacy-root-azm/src}/lowering/assemblerLoweringContextSplit.d.ts +0 -0
  264. /package/dist/{src → legacy-root-azm/src}/lowering/assemblerLoweringContextSplit.js +0 -0
  265. /package/dist/{src → legacy-root-azm/src}/lowering/assemblerLoweringPhases.d.ts +0 -0
  266. /package/dist/{src → legacy-root-azm/src}/lowering/assemblerLoweringPhases.js +0 -0
  267. /package/dist/{src → legacy-root-azm/src}/lowering/bytePlacement.d.ts +0 -0
  268. /package/dist/{src → legacy-root-azm/src}/lowering/bytePlacement.js +0 -0
  269. /package/dist/{src → legacy-root-azm/src}/lowering/capabilities.d.ts +0 -0
  270. /package/dist/{src → legacy-root-azm/src}/lowering/capabilities.js +0 -0
  271. /package/dist/{src → legacy-root-azm/src}/lowering/eaResolution.d.ts +0 -0
  272. /package/dist/{src → legacy-root-azm/src}/lowering/eaResolution.js +0 -0
  273. /package/dist/{src → legacy-root-azm/src}/lowering/emissionCore.d.ts +0 -0
  274. /package/dist/{src → legacy-root-azm/src}/lowering/emissionCore.js +0 -0
  275. /package/dist/{src → legacy-root-azm/src}/lowering/emit.d.ts +0 -0
  276. /package/dist/{src → legacy-root-azm/src}/lowering/emit.js +0 -0
  277. /package/dist/{src → legacy-root-azm/src}/lowering/emitContextBuilder.d.ts +0 -0
  278. /package/dist/{src → legacy-root-azm/src}/lowering/emitContextBuilder.js +0 -0
  279. /package/dist/{src → legacy-root-azm/src}/lowering/emitFinalization.d.ts +0 -0
  280. /package/dist/{src → legacy-root-azm/src}/lowering/emitFinalization.js +0 -0
  281. /package/dist/{src → legacy-root-azm/src}/lowering/emitFinalizationSetup.d.ts +0 -0
  282. /package/dist/{src → legacy-root-azm/src}/lowering/emitFinalizationSetup.js +0 -0
  283. /package/dist/{src → legacy-root-azm/src}/lowering/emitPhase1BuildProgramLoweringContext.d.ts +0 -0
  284. /package/dist/{src → legacy-root-azm/src}/lowering/emitPhase1BuildProgramLoweringContext.js +0 -0
  285. /package/dist/{src → legacy-root-azm/src}/lowering/emitPhase1Helpers.d.ts +0 -0
  286. /package/dist/{src → legacy-root-azm/src}/lowering/emitPhase1Helpers.js +0 -0
  287. /package/dist/{src → legacy-root-azm/src}/lowering/emitPhase1Types.d.ts +0 -0
  288. /package/dist/{src → legacy-root-azm/src}/lowering/emitPhase1Types.js +0 -0
  289. /package/dist/{src → legacy-root-azm/src}/lowering/emitPhase1WirePipeline.d.ts +0 -0
  290. /package/dist/{src → legacy-root-azm/src}/lowering/emitPhase1WirePipeline.js +0 -0
  291. /package/dist/{src → legacy-root-azm/src}/lowering/emitPhase1Workspace.d.ts +0 -0
  292. /package/dist/{src → legacy-root-azm/src}/lowering/emitPhase1Workspace.js +0 -0
  293. /package/dist/{src → legacy-root-azm/src}/lowering/emitPipeline.d.ts +0 -0
  294. /package/dist/{src → legacy-root-azm/src}/lowering/emitPipeline.js +0 -0
  295. /package/dist/{src → legacy-root-azm/src}/lowering/emitProgramContext.d.ts +0 -0
  296. /package/dist/{src → legacy-root-azm/src}/lowering/emitProgramContext.js +0 -0
  297. /package/dist/{src → legacy-root-azm/src}/lowering/emitState.d.ts +0 -0
  298. /package/dist/{src → legacy-root-azm/src}/lowering/emitState.js +0 -0
  299. /package/dist/{src → legacy-root-azm/src}/lowering/fixupBaseResolution.d.ts +0 -0
  300. /package/dist/{src → legacy-root-azm/src}/lowering/fixupBaseResolution.js +0 -0
  301. /package/dist/{src → legacy-root-azm/src}/lowering/fixupEmission.d.ts +0 -0
  302. /package/dist/{src → legacy-root-azm/src}/lowering/fixupEmission.js +0 -0
  303. /package/dist/{src → legacy-root-azm/src}/lowering/immMath.d.ts +0 -0
  304. /package/dist/{src → legacy-root-azm/src}/lowering/immMath.js +0 -0
  305. /package/dist/{src → legacy-root-azm/src}/lowering/inputAssets.d.ts +0 -0
  306. /package/dist/{src → legacy-root-azm/src}/lowering/inputAssets.js +0 -0
  307. /package/dist/{src → legacy-root-azm/src}/lowering/ldEncoding.d.ts +0 -0
  308. /package/dist/{src → legacy-root-azm/src}/lowering/ldEncoding.js +0 -0
  309. /package/dist/{src → legacy-root-azm/src}/lowering/ldEncodingRegMemHelpers.d.ts +0 -0
  310. /package/dist/{src → legacy-root-azm/src}/lowering/ldEncodingRegMemHelpers.js +0 -0
  311. /package/dist/{src → legacy-root-azm/src}/lowering/ldFormSelection.d.ts +0 -0
  312. /package/dist/{src → legacy-root-azm/src}/lowering/ldFormSelection.js +0 -0
  313. /package/dist/{src → legacy-root-azm/src}/lowering/ldLowering.d.ts +0 -0
  314. /package/dist/{src → legacy-root-azm/src}/lowering/ldLowering.js +0 -0
  315. /package/dist/{src → legacy-root-azm/src}/lowering/loweredAsmByteEmission.d.ts +0 -0
  316. /package/dist/{src → legacy-root-azm/src}/lowering/loweredAsmByteEmission.js +0 -0
  317. /package/dist/{src → legacy-root-azm/src}/lowering/loweredAsmPlacement.d.ts +0 -0
  318. /package/dist/{src → legacy-root-azm/src}/lowering/loweredAsmPlacement.js +0 -0
  319. /package/dist/{src → legacy-root-azm/src}/lowering/loweredAsmStreamRecording.d.ts +0 -0
  320. /package/dist/{src → legacy-root-azm/src}/lowering/loweredAsmStreamRecording.js +0 -0
  321. /package/dist/{src → legacy-root-azm/src}/lowering/loweredAsmTypes.d.ts +0 -0
  322. /package/dist/{src → legacy-root-azm/src}/lowering/loweredAsmTypes.js +0 -0
  323. /package/dist/{src → legacy-root-azm/src}/lowering/loweredFormat.d.ts +0 -0
  324. /package/dist/{src → legacy-root-azm/src}/lowering/loweredFormat.js +0 -0
  325. /package/dist/{src → legacy-root-azm/src}/lowering/loweredItemSize.d.ts +0 -0
  326. /package/dist/{src → legacy-root-azm/src}/lowering/loweredItemSize.js +0 -0
  327. /package/dist/{src → legacy-root-azm/src}/lowering/loweringDiagnostics.d.ts +0 -0
  328. /package/dist/{src → legacy-root-azm/src}/lowering/loweringDiagnostics.js +0 -0
  329. /package/dist/{src → legacy-root-azm/src}/lowering/loweringTypes.d.ts +0 -0
  330. /package/dist/{src → legacy-root-azm/src}/lowering/loweringTypes.js +0 -0
  331. /package/dist/{src → legacy-root-azm/src}/lowering/opCandidateRegistry.d.ts +0 -0
  332. /package/dist/{src → legacy-root-azm/src}/lowering/opCandidateRegistry.js +0 -0
  333. /package/dist/{src → legacy-root-azm/src}/lowering/opExpansionExecution.d.ts +0 -0
  334. /package/dist/{src → legacy-root-azm/src}/lowering/opExpansionExecution.js +0 -0
  335. /package/dist/{src → legacy-root-azm/src}/lowering/opExpansionOrchestration.d.ts +0 -0
  336. /package/dist/{src → legacy-root-azm/src}/lowering/opExpansionOrchestration.js +0 -0
  337. /package/dist/{src → legacy-root-azm/src}/lowering/opExpansionStream.d.ts +0 -0
  338. /package/dist/{src → legacy-root-azm/src}/lowering/opExpansionStream.js +0 -0
  339. /package/dist/{src → legacy-root-azm/src}/lowering/opMatching.d.ts +0 -0
  340. /package/dist/{src → legacy-root-azm/src}/lowering/opMatching.js +0 -0
  341. /package/dist/{src → legacy-root-azm/src}/lowering/opSubstitution.d.ts +0 -0
  342. /package/dist/{src → legacy-root-azm/src}/lowering/opSubstitution.js +0 -0
  343. /package/dist/{src → legacy-root-azm/src}/lowering/prescanTypes.d.ts +0 -0
  344. /package/dist/{src → legacy-root-azm/src}/lowering/prescanTypes.js +0 -0
  345. /package/dist/{src → legacy-root-azm/src}/lowering/programLowering.d.ts +0 -0
  346. /package/dist/{src → legacy-root-azm/src}/lowering/programLowering.js +0 -0
  347. /package/dist/{src → legacy-root-azm/src}/lowering/programLoweringDeclarations.d.ts +0 -0
  348. /package/dist/{src → legacy-root-azm/src}/lowering/programLoweringDeclarations.js +0 -0
  349. /package/dist/{src → legacy-root-azm/src}/lowering/programLoweringFinalize.d.ts +0 -0
  350. /package/dist/{src → legacy-root-azm/src}/lowering/programLoweringFinalize.js +0 -0
  351. /package/dist/{src → legacy-root-azm/src}/lowering/programLoweringTraversal.d.ts +0 -0
  352. /package/dist/{src → legacy-root-azm/src}/lowering/programLoweringTraversal.js +0 -0
  353. /package/dist/{src → legacy-root-azm/src}/lowering/programPrescan.d.ts +0 -0
  354. /package/dist/{src → legacy-root-azm/src}/lowering/programPrescan.js +0 -0
  355. /package/dist/{src → legacy-root-azm/src}/lowering/traceFormat.d.ts +0 -0
  356. /package/dist/{src → legacy-root-azm/src}/lowering/traceFormat.js +0 -0
  357. /package/dist/{src → legacy-root-azm/src}/packageInfo.d.ts +0 -0
  358. /package/dist/{src → legacy-root-azm/src}/packageInfo.js +0 -0
  359. /package/dist/{src → legacy-root-azm/src}/pathCompare.d.ts +0 -0
  360. /package/dist/{src → legacy-root-azm/src}/pathCompare.js +0 -0
  361. /package/dist/{src → legacy-root-azm/src}/pipeline.js +0 -0
  362. /package/dist/{src → legacy-root-azm/src}/registerCare/analyze.d.ts +0 -0
  363. /package/dist/{src → legacy-root-azm/src}/registerCare/analyze.js +0 -0
  364. /package/dist/{src → legacy-root-azm/src}/registerCare/annotate.d.ts +0 -0
  365. /package/dist/{src → legacy-root-azm/src}/registerCare/annotate.js +0 -0
  366. /package/dist/{src → legacy-root-azm/src}/registerCare/boundaryHints.d.ts +0 -0
  367. /package/dist/{src → legacy-root-azm/src}/registerCare/boundaryHints.js +0 -0
  368. /package/dist/{src → legacy-root-azm/src}/registerCare/carriers.d.ts +0 -0
  369. /package/dist/{src → legacy-root-azm/src}/registerCare/carriers.js +0 -0
  370. /package/dist/{src → legacy-root-azm/src}/registerCare/controlFlow.d.ts +0 -0
  371. /package/dist/{src → legacy-root-azm/src}/registerCare/controlFlow.js +0 -0
  372. /package/dist/{src → legacy-root-azm/src}/registerCare/fix.d.ts +0 -0
  373. /package/dist/{src → legacy-root-azm/src}/registerCare/fix.js +0 -0
  374. /package/dist/{src → legacy-root-azm/src}/registerCare/liveness.d.ts +0 -0
  375. /package/dist/{src → legacy-root-azm/src}/registerCare/liveness.js +0 -0
  376. /package/dist/{src → legacy-root-azm/src}/registerCare/profiles.d.ts +0 -0
  377. /package/dist/{src → legacy-root-azm/src}/registerCare/profiles.js +0 -0
  378. /package/dist/{src → legacy-root-azm/src}/registerCare/programModel.d.ts +0 -0
  379. /package/dist/{src → legacy-root-azm/src}/registerCare/programModel.js +0 -0
  380. /package/dist/{src → legacy-root-azm/src}/registerCare/report.d.ts +0 -0
  381. /package/dist/{src → legacy-root-azm/src}/registerCare/report.js +0 -0
  382. /package/dist/{src → legacy-root-azm/src}/registerCare/smartComments.d.ts +0 -0
  383. /package/dist/{src → legacy-root-azm/src}/registerCare/smartComments.js +0 -0
  384. /package/dist/{src → legacy-root-azm/src}/registerCare/sourceText.d.ts +0 -0
  385. /package/dist/{src → legacy-root-azm/src}/registerCare/sourceText.js +0 -0
  386. /package/dist/{src → legacy-root-azm/src}/registerCare/summary.d.ts +0 -0
  387. /package/dist/{src → legacy-root-azm/src}/registerCare/summary.js +0 -0
  388. /package/dist/{src → legacy-root-azm/src}/registerCare/types.d.ts +0 -0
  389. /package/dist/{src → legacy-root-azm/src}/registerCare/types.js +0 -0
  390. /package/dist/{src → legacy-root-azm/src}/semantics/declVisitor.d.ts +0 -0
  391. /package/dist/{src → legacy-root-azm/src}/semantics/declVisitor.js +0 -0
  392. /package/dist/{src → legacy-root-azm/src}/semantics/env.d.ts +0 -0
  393. /package/dist/{src → legacy-root-azm/src}/semantics/env.js +0 -0
  394. /package/dist/{src → legacy-root-azm/src}/semantics/layout.d.ts +0 -0
  395. /package/dist/{src → legacy-root-azm/src}/semantics/layout.js +0 -0
  396. /package/dist/{src → legacy-root-azm/src}/semantics/layoutCastFold.d.ts +0 -0
  397. /package/dist/{src → legacy-root-azm/src}/semantics/layoutCastFold.js +0 -0
  398. /package/dist/{src → legacy-root-azm/src}/semantics/semanticsDiagnostics.d.ts +0 -0
  399. /package/dist/{src → legacy-root-azm/src}/semantics/semanticsDiagnostics.js +0 -0
  400. /package/dist/{src → legacy-root-azm/src}/semantics/typeQueries.d.ts +0 -0
  401. /package/dist/{src → legacy-root-azm/src}/semantics/typeQueries.js +0 -0
  402. /package/dist/{src → legacy-root-azm/src}/sourceIncludeExpansion.d.ts +0 -0
  403. /package/dist/{src → legacy-root-azm/src}/sourceIncludeExpansion.js +0 -0
  404. /package/dist/{src → legacy-root-azm/src}/sourceIncludePaths.d.ts +0 -0
  405. /package/dist/{src → legacy-root-azm/src}/sourceIncludePaths.js +0 -0
  406. /package/dist/{src → legacy-root-azm/src}/sourceLoader.d.ts +0 -0
  407. /package/dist/{src → legacy-root-azm/src}/sourceLoader.js +0 -0
  408. /package/dist/{src → legacy-root-azm/src}/z80/encodeAlu.d.ts +0 -0
  409. /package/dist/{src → legacy-root-azm/src}/z80/encodeAlu.js +0 -0
  410. /package/dist/{src → legacy-root-azm/src}/z80/encodeBitOps.d.ts +0 -0
  411. /package/dist/{src → legacy-root-azm/src}/z80/encodeBitOps.js +0 -0
  412. /package/dist/{src → legacy-root-azm/src}/z80/encodeContext.d.ts +0 -0
  413. /package/dist/{src → legacy-root-azm/src}/z80/encodeContext.js +0 -0
  414. /package/dist/{src → legacy-root-azm/src}/z80/encodeControl.d.ts +0 -0
  415. /package/dist/{src → legacy-root-azm/src}/z80/encodeControl.js +0 -0
  416. /package/dist/{src → legacy-root-azm/src}/z80/encodeCoreOps.d.ts +0 -0
  417. /package/dist/{src → legacy-root-azm/src}/z80/encodeCoreOps.js +0 -0
  418. /package/dist/{src → legacy-root-azm/src}/z80/encodeIo.d.ts +0 -0
  419. /package/dist/{src → legacy-root-azm/src}/z80/encodeIo.js +0 -0
  420. /package/dist/{src → legacy-root-azm/src}/z80/encodeLd.d.ts +0 -0
  421. /package/dist/{src → legacy-root-azm/src}/z80/encodeLd.js +0 -0
  422. /package/dist/{src → legacy-root-azm/src}/z80/encoderRegistry.d.ts +0 -0
  423. /package/dist/{src → legacy-root-azm/src}/z80/encoderRegistry.js +0 -0
@@ -1,4 +1,3 @@
1
- import { expandCarrier } from '../registerCare/carriers.js';
2
1
  const FLAG_WRITES = ['sign', 'zero', 'halfCarry', 'parity', 'carry'];
3
2
  const INC_DEC_FLAG_WRITES = ['sign', 'zero', 'halfCarry', 'parity'];
4
3
  const ROTATE_SHIFT_FLAG_WRITES = [
@@ -58,116 +57,111 @@ function concatUnique(...groups) {
58
57
  appendUnique(out, group);
59
58
  return out;
60
59
  }
61
- function registerUnits(op) {
62
- if (!op || op.kind !== 'Reg')
63
- return undefined;
64
- return expandCarrier(op.name);
65
- }
66
- function immName(op) {
67
- return op?.kind === 'Imm' && op.expr.kind === 'ImmName' ? op.expr.name : undefined;
68
- }
69
- function immLiteral(op) {
70
- return op?.kind === 'Imm' && op.expr.kind === 'ImmLiteral' ? op.expr.value : undefined;
71
- }
72
- function operandTokenName(op) {
73
- if (op?.kind === 'Reg')
74
- return op.name.toUpperCase();
75
- if (op?.kind === 'Imm' && op.expr.kind === 'ImmName')
76
- return op.expr.name.toUpperCase();
77
- return undefined;
78
- }
79
- function conditionFlagRead(op) {
80
- switch (operandTokenName(op)) {
81
- case 'Z':
82
- case 'NZ':
60
+ function reg8Units(raw) {
61
+ const reg = raw.toLowerCase();
62
+ if (reg === 'a')
63
+ return ['A'];
64
+ if (reg === 'b')
65
+ return ['B'];
66
+ if (reg === 'c')
67
+ return ['C'];
68
+ if (reg === 'd')
69
+ return ['D'];
70
+ if (reg === 'e')
71
+ return ['E'];
72
+ if (reg === 'h')
73
+ return ['H'];
74
+ if (reg === 'l')
75
+ return ['L'];
76
+ return [];
77
+ }
78
+ function reg16Units(raw) {
79
+ const reg = raw.toLowerCase();
80
+ if (reg === 'bc')
81
+ return ['B', 'C'];
82
+ if (reg === 'de')
83
+ return ['D', 'E'];
84
+ if (reg === 'hl')
85
+ return ['H', 'L'];
86
+ if (reg === 'sp')
87
+ return ['SPH', 'SPL'];
88
+ if (reg === 'ix')
89
+ return ['IXH', 'IXL'];
90
+ if (reg === 'iy')
91
+ return ['IYH', 'IYL'];
92
+ if (reg === 'af')
93
+ return ['A', ...FLAG_WRITES];
94
+ return [];
95
+ }
96
+ function regHalfUnits(raw) {
97
+ const reg = raw.toLowerCase();
98
+ if (reg === 'ixh')
99
+ return ['IXH'];
100
+ if (reg === 'ixl')
101
+ return ['IXL'];
102
+ if (reg === 'iyh')
103
+ return ['IYH'];
104
+ if (reg === 'iyl')
105
+ return ['IYL'];
106
+ return [];
107
+ }
108
+ function expressionSymbol(expression) {
109
+ return expression.kind === 'symbol' ? expression.name : undefined;
110
+ }
111
+ function conditionFlagRead(condition) {
112
+ switch (condition) {
113
+ case 'z':
114
+ case 'nz':
83
115
  return ['zero'];
84
- case 'C':
85
- case 'NC':
116
+ case 'c':
117
+ case 'nc':
86
118
  return ['carry'];
87
- case 'M':
88
- case 'P':
119
+ case 'm':
120
+ case 'p':
89
121
  return ['sign'];
90
- case 'PE':
91
- case 'PO':
122
+ case 'pe':
123
+ case 'po':
92
124
  return ['parity'];
93
125
  default:
94
- return undefined;
95
- }
96
- }
97
- function eaReads(ea) {
98
- switch (ea.kind) {
99
- case 'EaName':
100
- return expandCarrier(ea.name) ?? [];
101
- case 'EaImm':
102
126
  return [];
103
- case 'EaLayoutCast':
104
- case 'EaField':
105
- return eaReads(ea.base);
106
- case 'EaAdd':
107
- case 'EaSub':
108
- return eaReads(ea.base);
109
- case 'EaIndex': {
110
- const base = eaReads(ea.base);
111
- const index = indexReads(ea.index);
112
- if (!base || !index)
113
- return undefined;
114
- return concatUnique(base, index);
115
- }
116
- default:
117
- return undefined;
118
127
  }
119
128
  }
120
- function indexReads(index) {
121
- switch (index.kind) {
122
- case 'IndexImm':
129
+ function operandReads(op) {
130
+ switch (op.kind) {
131
+ case 'reg8':
132
+ return reg8Units(op.register);
133
+ case 'reg16':
134
+ case 'reg-index16':
135
+ return reg16Units(op.register);
136
+ case 'reg-half-index':
137
+ return regHalfUnits(op.register);
138
+ case 'special8':
139
+ return [];
140
+ case 'reg-indirect':
141
+ return reg16Units(op.register);
142
+ case 'indexed':
143
+ return reg16Units(op.register);
144
+ case 'mem-abs':
145
+ case 'imm':
123
146
  return [];
124
- case 'IndexReg8':
125
- case 'IndexReg16':
126
- return expandCarrier(index.reg);
127
- case 'IndexMemHL':
128
- return expandCarrier('HL');
129
- case 'IndexMemIxIy':
130
- return expandCarrier(index.base);
131
- case 'IndexEa':
132
- return eaReads(index.expr);
133
147
  default:
134
148
  return undefined;
135
149
  }
136
150
  }
137
- function operandReads(op) {
138
- if (!op)
139
- return undefined;
151
+ function operandWrites(op) {
140
152
  switch (op.kind) {
141
- case 'Reg':
142
- return expandCarrier(op.name);
143
- case 'Imm':
144
- return immReads(op.expr);
145
- case 'Ea':
146
- case 'Mem':
147
- return eaReads(op.expr);
148
- case 'PortC':
149
- return expandCarrier('C');
150
- case 'PortImm8':
151
- return immReads(op.expr);
153
+ case 'reg8':
154
+ return reg8Units(op.register);
155
+ case 'reg16':
156
+ return reg16Units(op.register);
157
+ case 'reg-index16':
158
+ return reg16Units(op.register);
159
+ case 'reg-half-index':
160
+ return regHalfUnits(op.register);
152
161
  default:
153
162
  return undefined;
154
163
  }
155
164
  }
156
- function immReads(expr) {
157
- switch (expr.kind) {
158
- case 'ImmBinary':
159
- return concatUnique(immReads(expr.left), immReads(expr.right));
160
- case 'ImmUnary':
161
- return immReads(expr.expr);
162
- default:
163
- return [];
164
- }
165
- }
166
- function targetName(operands) {
167
- if (operands.length === 0)
168
- return undefined;
169
- return immName(operands[operands.length - 1]);
170
- }
171
165
  function callControl(target, conditional) {
172
166
  return target === undefined
173
167
  ? { kind: 'call', conditional }
@@ -181,105 +175,181 @@ function jumpControl(target, conditional) {
181
175
  ? { kind: 'jump', conditional }
182
176
  : { kind: 'jump', target, conditional };
183
177
  }
184
- function isConditionalControl(operands) {
185
- return operands.length > 1;
178
+ function controlEffect(control, reads = []) {
179
+ return {
180
+ ...baseEffect(),
181
+ reads,
182
+ control,
183
+ };
186
184
  }
187
- function ldEffect(inst) {
188
- if (inst.operands.length !== 2)
189
- return unknownEffect();
190
- const dst = inst.operands[0];
191
- const src = inst.operands[1];
192
- if (!dst || !src)
193
- return unknownEffect();
194
- const effect = baseEffect();
195
- const srcReads = operandReads(src);
196
- if (!srcReads)
185
+ function stackControlEffect(control, reads = []) {
186
+ return {
187
+ ...controlEffect(control, reads),
188
+ writes: STACK_POINTER_UNITS,
189
+ stack: { kind: 'unknown' },
190
+ };
191
+ }
192
+ function ldEffect(instruction) {
193
+ const srcReads = operandReads(instruction.source);
194
+ if (srcReads === undefined)
197
195
  return unknownEffect();
198
- if (dst.kind === 'Reg') {
199
- const dstWrites = expandCarrier(dst.name);
200
- if (!dstWrites)
196
+ const dstWrites = operandWrites(instruction.target);
197
+ if (instruction.target.kind === 'reg8' || instruction.target.kind === 'reg16') {
198
+ if (dstWrites === undefined)
201
199
  return unknownEffect();
202
- effect.reads = srcReads;
203
- effect.writes = dstWrites;
204
- return effect;
200
+ return {
201
+ ...baseEffect(),
202
+ reads: srcReads,
203
+ writes: dstWrites,
204
+ };
205
+ }
206
+ if (instruction.target.kind === 'reg-index16' ||
207
+ instruction.target.kind === 'reg-half-index') {
208
+ if (dstWrites === undefined)
209
+ return unknownEffect();
210
+ return {
211
+ ...baseEffect(),
212
+ reads: srcReads,
213
+ writes: dstWrites,
214
+ };
205
215
  }
206
- if (dst.kind === 'Mem') {
207
- const dstReads = operandReads(dst);
208
- if (!dstReads)
216
+ if (instruction.target.kind === 'reg-indirect' || instruction.target.kind === 'indexed') {
217
+ const dstReads = operandReads(instruction.target);
218
+ if (dstReads === undefined)
209
219
  return unknownEffect();
210
- effect.reads = concatUnique(dstReads, srcReads);
211
- return effect;
220
+ return {
221
+ ...baseEffect(),
222
+ reads: concatUnique(dstReads, srcReads),
223
+ };
224
+ }
225
+ if (instruction.target.kind === 'mem-abs') {
226
+ return {
227
+ ...baseEffect(),
228
+ reads: srcReads,
229
+ };
212
230
  }
213
231
  return unknownEffect();
214
232
  }
215
- function unaryOperandEffect(inst, flagWrites) {
216
- if (inst.operands.length !== 1)
217
- return unknownEffect();
218
- const op = inst.operands[0];
219
- if (!op)
220
- return unknownEffect();
221
- const reads = operandReads(op);
222
- if (!reads)
223
- return unknownEffect();
224
- const writes = op.kind === 'Reg' ? registerUnits(op) : [];
225
- if (!writes)
233
+ function incDecEffect(instruction) {
234
+ const operand = instruction.operand;
235
+ if (operand.kind === 'reg8') {
236
+ const units = reg8Units(operand.register);
237
+ return {
238
+ ...baseEffect(),
239
+ reads: units,
240
+ writes: concatUnique(units, INC_DEC_FLAG_WRITES),
241
+ };
242
+ }
243
+ if (operand.kind === 'reg16') {
244
+ const units = reg16Units(operand.register);
245
+ return {
246
+ ...baseEffect(),
247
+ reads: units,
248
+ writes: units,
249
+ };
250
+ }
251
+ if (operand.kind === 'reg-half-index') {
252
+ const units = regHalfUnits(operand.register);
253
+ return {
254
+ ...baseEffect(),
255
+ reads: units,
256
+ writes: concatUnique(units, INC_DEC_FLAG_WRITES),
257
+ };
258
+ }
259
+ const reads = operandReads(operand);
260
+ if (reads === undefined)
226
261
  return unknownEffect();
227
262
  return {
228
263
  ...baseEffect(),
229
264
  reads,
230
- writes: concatUnique(writes, flagWrites),
265
+ writes: INC_DEC_FLAG_WRITES,
231
266
  };
232
267
  }
233
- function incDecEffect(inst) {
234
- return unaryOperandEffect(inst, INC_DEC_FLAG_WRITES);
235
- }
236
- function aluEffect(inst) {
237
- if (inst.operands.length < 1 || inst.operands.length > 2)
238
- return unknownEffect();
239
- const first = inst.operands[0];
240
- const second = inst.operands[1];
241
- const xorSelfZero = inst.head === 'xor' &&
242
- second === undefined &&
243
- first?.kind === 'Reg' &&
244
- first.name.toUpperCase() === 'A';
245
- const firstReads = operandReads(first);
246
- if (!firstReads)
247
- return unknownEffect();
248
- let reads;
249
- let writes = [];
250
- if (second) {
251
- const secondReads = operandReads(second);
252
- if (!secondReads)
268
+ function aluEffect(instruction) {
269
+ if (instruction.mnemonic === 'add' &&
270
+ 'target' in instruction &&
271
+ (instruction.target.kind === 'reg16' || instruction.target.kind === 'reg-index16')) {
272
+ const targetReads = operandReads(instruction.target);
273
+ const sourceReads = operandReads(instruction.source);
274
+ if (targetReads === undefined || sourceReads === undefined)
253
275
  return unknownEffect();
254
- reads = concatUnique(firstReads, secondReads);
255
- if (inst.head !== 'cp' && first?.kind === 'Reg') {
256
- const firstWrites = registerUnits(first);
257
- if (!firstWrites)
258
- return unknownEffect();
259
- writes = firstWrites;
260
- }
276
+ return {
277
+ ...baseEffect(),
278
+ reads: concatUnique(targetReads, sourceReads),
279
+ writes: concatUnique(operandWrites(instruction.target) ?? [], FLAG_WRITES),
280
+ };
261
281
  }
262
- else {
263
- const aReads = expandCarrier('A');
264
- if (!aReads)
282
+ if (instruction.mnemonic === 'adc' &&
283
+ 'target' in instruction &&
284
+ (instruction.target.kind === 'reg16' || instruction.target.kind === 'reg-index16')) {
285
+ const targetReads = operandReads(instruction.target);
286
+ const sourceReads = operandReads(instruction.source);
287
+ if (targetReads === undefined || sourceReads === undefined)
265
288
  return unknownEffect();
266
- reads = xorSelfZero ? [] : concatUnique(aReads, firstReads);
267
- if (inst.head !== 'cp')
268
- writes = aReads;
289
+ return {
290
+ ...baseEffect(),
291
+ reads: concatUnique(targetReads, sourceReads, ['carry']),
292
+ writes: concatUnique(operandWrites(instruction.target) ?? [], FLAG_WRITES),
293
+ };
294
+ }
295
+ if (instruction.mnemonic === 'sbc' &&
296
+ 'target' in instruction &&
297
+ (instruction.target.kind === 'reg16' || instruction.target.kind === 'reg-index16')) {
298
+ const targetReads = operandReads(instruction.target);
299
+ const sourceReads = operandReads(instruction.source);
300
+ if (targetReads === undefined || sourceReads === undefined)
301
+ return unknownEffect();
302
+ return {
303
+ ...baseEffect(),
304
+ reads: concatUnique(targetReads, sourceReads, ['carry']),
305
+ writes: concatUnique(operandWrites(instruction.target) ?? [], FLAG_WRITES),
306
+ };
307
+ }
308
+ if (!('source' in instruction))
309
+ return unknownEffect();
310
+ const source = instruction.source;
311
+ let sourceReads;
312
+ if (source.kind === 'reg8') {
313
+ sourceReads = reg8Units(source.register);
314
+ }
315
+ else if (source.kind === 'reg-indirect' || source.kind === 'indexed') {
316
+ sourceReads = operandReads(source) ?? [];
317
+ }
318
+ else if (source.kind === 'mem-abs' || source.kind === 'imm') {
319
+ sourceReads = [];
320
+ }
321
+ else if (source.kind === 'reg16' || source.kind === 'reg-index16') {
322
+ sourceReads = reg16Units(source.register);
323
+ }
324
+ else if (source.kind === 'reg-half-index') {
325
+ sourceReads = regHalfUnits(source.register);
326
+ }
327
+ else {
328
+ sourceReads = [];
329
+ }
330
+ const xorSelfZero = instruction.mnemonic === 'xor' &&
331
+ source.kind === 'reg8' &&
332
+ source.register === 'a';
333
+ const reads = xorSelfZero ? [] : concatUnique(['A'], sourceReads);
334
+ const carryReads = instruction.mnemonic === 'adc' || instruction.mnemonic === 'sbc' ? ['carry'] : [];
335
+ if (instruction.mnemonic === 'cp') {
336
+ return {
337
+ ...baseEffect(),
338
+ reads: concatUnique(reads, carryReads),
339
+ writes: FLAG_WRITES,
340
+ };
269
341
  }
270
- const carryReads = inst.head === 'adc' || inst.head === 'sbc' ? ['carry'] : [];
271
342
  return {
272
343
  ...baseEffect(),
273
344
  reads: concatUnique(reads, carryReads),
274
- writes: concatUnique(writes, FLAG_WRITES),
345
+ writes: concatUnique(['A'], FLAG_WRITES),
275
346
  };
276
347
  }
277
- function pushEffect(inst) {
278
- if (inst.operands.length !== 1)
279
- return unknownEffect();
280
- const units = registerUnits(inst.operands[0]);
281
- if (!units)
282
- return unknownEffect();
348
+ function stackRegisterUnits(register) {
349
+ return reg16Units(register);
350
+ }
351
+ function pushEffect(register) {
352
+ const units = stackRegisterUnits(register);
283
353
  return {
284
354
  ...baseEffect(),
285
355
  reads: units,
@@ -287,169 +357,116 @@ function pushEffect(inst) {
287
357
  stack: { kind: 'push', units },
288
358
  };
289
359
  }
290
- function popEffect(inst) {
291
- if (inst.operands.length !== 1)
292
- return unknownEffect();
293
- const units = registerUnits(inst.operands[0]);
294
- if (!units)
295
- return unknownEffect();
360
+ function popEffect(register) {
361
+ const units = stackRegisterUnits(register);
296
362
  return {
297
363
  ...baseEffect(),
298
364
  writes: concatUnique(units, STACK_POINTER_UNITS),
299
365
  stack: { kind: 'pop', units },
300
366
  };
301
367
  }
302
- function controlEffect(control, reads = []) {
368
+ function rotateShiftEffect(instruction) {
369
+ const reads = operandReads(instruction.operand);
370
+ const writes = operandWrites(instruction.operand);
371
+ if (reads === undefined || writes === undefined)
372
+ return unknownEffect();
303
373
  return {
304
374
  ...baseEffect(),
305
375
  reads,
306
- control,
376
+ writes: concatUnique(writes, ROTATE_SHIFT_FLAG_WRITES),
307
377
  };
308
378
  }
309
- function stackControlEffect(control, reads = []) {
310
- return {
311
- ...controlEffect(control, reads),
312
- writes: STACK_POINTER_UNITS,
313
- stack: { kind: 'unknown' },
314
- };
315
- }
316
- function jumpEffect(inst) {
317
- const conditional = isConditionalControl(inst.operands);
318
- const reads = conditional
319
- ? conditionFlagRead(inst.operands[0])
320
- : operandReads(inst.operands[inst.operands.length - 1]);
321
- if (!reads)
379
+ function bitEffect(instruction) {
380
+ const reads = operandReads(instruction.operand);
381
+ if (reads === undefined)
322
382
  return unknownEffect();
323
- const effect = controlEffect(jumpControl(targetName(inst.operands), conditional));
324
- effect.reads = reads;
325
- return effect;
326
- }
327
- function callEffect(inst) {
328
- const conditional = isConditionalControl(inst.operands);
329
- const reads = conditional ? conditionFlagRead(inst.operands[0]) : [];
330
- if (!reads)
331
- return unknownEffect();
332
- return stackControlEffect(callControl(targetName(inst.operands), conditional), reads);
333
- }
334
- function retEffect(inst) {
335
- const reads = inst.operands.length > 0 ? conditionFlagRead(inst.operands[0]) : [];
336
- if (!reads)
383
+ if (instruction.mnemonic === 'bit') {
384
+ return {
385
+ ...baseEffect(),
386
+ reads,
387
+ writes: BIT_FLAG_WRITES,
388
+ };
389
+ }
390
+ const writes = operandWrites(instruction.operand);
391
+ if (writes === undefined)
337
392
  return unknownEffect();
338
- return stackControlEffect({ kind: 'return' }, reads);
339
- }
340
- function djnzEffect(inst) {
341
393
  return {
342
394
  ...baseEffect(),
343
- reads: ['B'],
344
- writes: ['B'],
345
- control: jumpControl(targetName(inst.operands), true),
395
+ reads,
396
+ writes,
346
397
  };
347
398
  }
348
- function rotateShiftEffect(inst) {
349
- return unaryOperandEffect(inst, ROTATE_SHIFT_FLAG_WRITES);
350
- }
351
- function accumulatorRotateEffect(head) {
352
- const reads = head === 'rla' || head === 'rra' ? ['A', 'carry'] : ['A'];
399
+ function inEffect(instruction) {
400
+ const targetWrites = instruction.target?.kind === 'reg8' ? reg8Units(instruction.target.register) : undefined;
401
+ if (instruction.port.kind === 'imm') {
402
+ return {
403
+ ...baseEffect(),
404
+ reads: ['A'],
405
+ writes: targetWrites ?? [],
406
+ };
407
+ }
353
408
  return {
354
409
  ...baseEffect(),
355
- reads,
356
- writes: ['A', 'carry', 'halfCarry'],
410
+ reads: ['C'],
411
+ writes: concatUnique(targetWrites ?? [], BIT_FLAG_WRITES),
357
412
  };
358
413
  }
359
- function bitEffect(inst) {
360
- if (inst.operands.length !== 2)
361
- return unknownEffect();
362
- const target = inst.operands[1];
363
- if (!target)
364
- return unknownEffect();
365
- const reads = operandReads(target);
366
- if (!reads)
367
- return unknownEffect();
414
+ function outEffect(instruction) {
415
+ const valueReads = instruction.source.kind === 'reg8' ? reg8Units(instruction.source.register) : [];
416
+ if (instruction.port.kind === 'c') {
417
+ return {
418
+ ...baseEffect(),
419
+ reads: concatUnique(['C'], valueReads),
420
+ };
421
+ }
368
422
  return {
369
423
  ...baseEffect(),
370
- reads,
371
- writes: BIT_FLAG_WRITES,
424
+ reads: valueReads,
372
425
  };
373
426
  }
374
- function outEffect(inst) {
375
- if (inst.operands.length !== 2)
376
- return unknownEffect();
377
- const portReads = operandReads(inst.operands[0]);
378
- const valueReads = operandReads(inst.operands[1]);
379
- if (!portReads || !valueReads)
380
- return unknownEffect();
427
+ function blockTransferEffect() {
381
428
  return {
382
429
  ...baseEffect(),
383
- reads: concatUnique(portReads, valueReads),
430
+ reads: ['H', 'L', 'D', 'E', 'B', 'C'],
431
+ writes: ['H', 'L', 'D', 'E', 'B', 'C', 'halfCarry', 'parity'],
384
432
  };
385
433
  }
386
- function inEffect(inst) {
387
- if (inst.operands.length !== 2)
388
- return unknownEffect();
389
- const target = inst.operands[0];
390
- const port = inst.operands[1];
391
- if (target?.kind !== 'Reg')
392
- return unknownEffect();
393
- const writes = registerUnits(target);
394
- if (!writes)
395
- return unknownEffect();
396
- if (port?.kind === 'PortImm8') {
434
+ function exEffect(instruction) {
435
+ if (instruction.form === 'de-hl') {
397
436
  return {
398
437
  ...baseEffect(),
399
- reads: concatUnique(['A'], operandReads(port) ?? []),
400
- writes,
401
- };
402
- }
403
- if (port?.kind === 'PortC') {
404
- return {
405
- ...baseEffect(),
406
- reads: ['C'],
407
- writes: concatUnique(writes, BIT_FLAG_WRITES),
438
+ reads: ['D', 'E', 'H', 'L'],
439
+ writes: ['D', 'E', 'H', 'L'],
408
440
  };
409
441
  }
410
442
  return unknownEffect();
411
443
  }
412
- function blockTransferEffect(inst) {
413
- if (inst.operands.length !== 0)
414
- return unknownEffect();
444
+ function accumulatorRotateEffect(mnemonic) {
445
+ const reads = mnemonic === 'rla' || mnemonic === 'rra' ? ['A', 'carry'] : ['A'];
415
446
  return {
416
447
  ...baseEffect(),
417
- reads: ['H', 'L', 'D', 'E', 'B', 'C'],
418
- writes: ['H', 'L', 'D', 'E', 'B', 'C', 'halfCarry', 'parity'],
419
- };
420
- }
421
- function exEffect(inst) {
422
- if (inst.operands.length !== 2)
423
- return unknownEffect();
424
- const left = inst.operands[0];
425
- const right = inst.operands[1];
426
- const leftUnits = registerUnits(left);
427
- const rightUnits = registerUnits(right);
428
- if (!leftUnits || !rightUnits)
429
- return unknownEffect();
430
- const leftName = left?.kind === 'Reg' ? left.name.toUpperCase() : '';
431
- const rightName = right?.kind === 'Reg' ? right.name.toUpperCase() : '';
432
- const isDeHl = (leftName === 'DE' && rightName === 'HL') || (leftName === 'HL' && rightName === 'DE');
433
- if (!isDeHl)
434
- return unknownEffect();
435
- return {
436
- ...baseEffect(),
437
- reads: concatUnique(leftUnits, rightUnits),
438
- writes: concatUnique(leftUnits, rightUnits),
448
+ reads,
449
+ writes: ['A', 'carry', 'halfCarry'],
439
450
  };
440
451
  }
441
- export function getZ80InstructionEffect(inst) {
442
- switch (inst.head.toLowerCase()) {
452
+ export function getZ80InstructionEffect(instruction) {
453
+ switch (instruction.mnemonic) {
443
454
  case 'nop':
444
455
  case 'halt':
445
456
  case 'di':
446
457
  case 'ei':
458
+ case 'im':
447
459
  return baseEffect();
460
+ case 'reti':
461
+ case 'retn':
462
+ return stackControlEffect({ kind: 'return', conditional: false });
463
+ case 'ld-a-imm':
464
+ return { ...baseEffect(), writes: ['A'] };
448
465
  case 'ld':
449
- return ldEffect(inst);
466
+ return ldEffect(instruction);
450
467
  case 'inc':
451
468
  case 'dec':
452
- return incDecEffect(inst);
469
+ return incDecEffect(instruction);
453
470
  case 'add':
454
471
  case 'adc':
455
472
  case 'sbc':
@@ -458,39 +475,57 @@ export function getZ80InstructionEffect(inst) {
458
475
  case 'or':
459
476
  case 'xor':
460
477
  case 'cp':
461
- return aluEffect(inst);
478
+ return aluEffect(instruction);
462
479
  case 'push':
463
- return pushEffect(inst);
480
+ return pushEffect(instruction.register);
464
481
  case 'pop':
465
- return popEffect(inst);
482
+ return popEffect(instruction.register);
466
483
  case 'call':
467
- return callEffect(inst);
484
+ return stackControlEffect(callControl(expressionSymbol(instruction.expression), false));
485
+ case 'call-cc':
486
+ return stackControlEffect(callControl(expressionSymbol(instruction.expression), true), conditionFlagRead(instruction.condition));
468
487
  case 'rst':
469
- return stackControlEffect(rstControl(immLiteral(inst.operands[0])));
488
+ return stackControlEffect(rstControl(instruction.vector));
470
489
  case 'ret':
471
- case 'retn':
472
- case 'reti':
473
- return retEffect(inst);
490
+ return stackControlEffect({ kind: 'return', conditional: false });
491
+ case 'ret-cc':
492
+ return stackControlEffect({ kind: 'return', conditional: true }, conditionFlagRead(instruction.condition));
474
493
  case 'jp':
494
+ return controlEffect(jumpControl(expressionSymbol(instruction.expression), false));
495
+ case 'jp-cc':
496
+ return controlEffect(jumpControl(expressionSymbol(instruction.expression), true), conditionFlagRead(instruction.condition));
497
+ case 'jp-indirect':
498
+ return controlEffect(jumpControl(undefined, false), reg16Units(instruction.register));
475
499
  case 'jr':
476
- return jumpEffect(inst);
500
+ return controlEffect(jumpControl(expressionSymbol(instruction.expression), false));
501
+ case 'jr-cc':
502
+ return controlEffect(jumpControl(expressionSymbol(instruction.expression), true), conditionFlagRead(instruction.condition));
477
503
  case 'djnz':
478
- return djnzEffect(inst);
504
+ return {
505
+ ...baseEffect(),
506
+ reads: ['B'],
507
+ writes: ['B'],
508
+ control: jumpControl(expressionSymbol(instruction.expression), true),
509
+ };
479
510
  case 'rlc':
480
511
  case 'rrc':
481
512
  case 'rl':
482
513
  case 'rr':
483
514
  case 'sla':
484
515
  case 'sra':
516
+ case 'sll':
517
+ case 'sls':
485
518
  case 'srl':
486
- return rotateShiftEffect(inst);
519
+ return rotateShiftEffect(instruction);
487
520
  case 'rlca':
488
521
  case 'rrca':
489
522
  case 'rla':
490
523
  case 'rra':
491
- return accumulatorRotateEffect(inst.head.toLowerCase());
524
+ return accumulatorRotateEffect(instruction.mnemonic);
492
525
  case 'bit':
493
- return bitEffect(inst);
526
+ case 'res':
527
+ case 'set':
528
+ return bitEffect(instruction);
494
529
  case 'scf':
495
530
  return { ...baseEffect(), writes: ['carry', 'halfCarry'] };
496
531
  case 'ccf':
@@ -500,16 +535,28 @@ export function getZ80InstructionEffect(inst) {
500
535
  case 'neg':
501
536
  return { ...baseEffect(), reads: ['A'], writes: concatUnique(['A'], FLAG_WRITES) };
502
537
  case 'out':
503
- return outEffect(inst);
538
+ return outEffect(instruction);
504
539
  case 'in':
505
- return inEffect(inst);
540
+ return inEffect(instruction);
506
541
  case 'ldi':
507
542
  case 'ldir':
508
543
  case 'ldd':
509
544
  case 'lddr':
510
- return blockTransferEffect(inst);
545
+ case 'cpi':
546
+ case 'cpir':
547
+ case 'cpd':
548
+ case 'cpdr':
549
+ case 'ini':
550
+ case 'inir':
551
+ case 'ind':
552
+ case 'indr':
553
+ case 'outi':
554
+ case 'otir':
555
+ case 'outd':
556
+ case 'otdr':
557
+ return blockTransferEffect();
511
558
  case 'ex':
512
- return exEffect(inst);
559
+ return exEffect(instruction);
513
560
  default:
514
561
  return unknownEffect();
515
562
  }