@jhlagado/azm 0.1.1 → 0.2.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.
- package/README.md +9 -1
- package/dist/{src → legacy-root-azm/src}/formats/index.d.ts +1 -1
- package/dist/{src → legacy-root-azm/src}/formats/index.js +1 -1
- package/dist/{src → legacy-root-azm/src}/formats/types.d.ts +67 -7
- package/dist/{src → legacy-root-azm/src}/formats/writeHex.d.ts +0 -1
- package/dist/{src → legacy-root-azm/src}/formats/writeHex.js +0 -1
- package/dist/{src → legacy-root-azm/src}/pipeline.d.ts +3 -5
- package/dist/legacy-root-azm/src/z80/effects.d.ts +3 -0
- package/dist/legacy-root-azm/src/z80/effects.js +516 -0
- package/dist/legacy-root-azm/src/z80/encode.d.ts +10 -0
- package/dist/legacy-root-azm/src/z80/encode.js +412 -0
- package/dist/src/api-compile.d.ts +49 -8
- package/dist/src/api-compile.js +313 -3
- package/dist/src/api-tooling.d.ts +7 -25
- package/dist/src/api-tooling.js +3 -21
- package/dist/src/assembly/address-planning.d.ts +19 -0
- package/dist/src/assembly/address-planning.js +266 -0
- package/dist/src/assembly/assemble-program.d.ts +13 -0
- package/dist/src/assembly/assemble-program.js +34 -0
- package/dist/src/assembly/fixup-emission.d.ts +10 -0
- package/dist/src/assembly/fixup-emission.js +247 -0
- package/dist/src/assembly/placement.d.ts +26 -0
- package/dist/src/assembly/placement.js +79 -0
- package/dist/src/assembly/program-emission.d.ts +13 -0
- package/dist/src/assembly/program-emission.js +267 -0
- package/dist/src/cli/parse-args.d.ts +29 -0
- package/dist/src/cli/parse-args.js +372 -0
- package/dist/src/cli/run.d.ts +2 -0
- package/dist/src/cli/run.js +35 -0
- package/dist/src/cli/write-artifacts.d.ts +21 -0
- package/dist/src/cli/write-artifacts.js +175 -0
- package/dist/src/cli.d.ts +1 -30
- package/dist/src/cli.js +20 -524
- package/dist/src/core/compile-artifacts.d.ts +26 -0
- package/dist/src/core/compile-artifacts.js +17 -0
- package/dist/src/core/compile.d.ts +26 -0
- package/dist/src/core/compile.js +164 -0
- package/dist/src/diagnostics/format.d.ts +4 -0
- package/dist/src/diagnostics/format.js +9 -0
- package/dist/src/expansion/op-expansion.d.ts +96 -0
- package/dist/src/expansion/op-expansion.js +912 -0
- package/dist/src/index.d.ts +14 -3
- package/dist/src/index.js +7 -2
- package/dist/src/model/diagnostic.d.ts +50 -0
- package/dist/src/model/diagnostic.js +29 -0
- package/dist/src/model/expression.d.ts +51 -0
- package/dist/src/model/expression.js +1 -0
- package/dist/src/model/fixup.d.ts +18 -0
- package/dist/src/model/fixup.js +1 -0
- package/dist/src/model/source-item.d.ts +81 -0
- package/dist/src/model/source-item.js +1 -0
- package/dist/src/model/symbol.d.ts +1 -0
- package/dist/src/model/symbol.js +1 -0
- package/dist/src/node/source-host.d.ts +19 -0
- package/dist/src/node/source-host.js +146 -0
- package/dist/src/outputs/hex.d.ts +1 -0
- package/dist/src/outputs/hex.js +75 -0
- package/dist/src/outputs/index.d.ts +3 -0
- package/dist/src/outputs/index.js +13 -0
- package/dist/src/outputs/range.d.ts +3 -0
- package/dist/src/outputs/range.js +31 -0
- package/dist/src/outputs/types.d.ts +182 -0
- package/dist/src/outputs/types.js +1 -0
- package/dist/src/outputs/write-asm80.d.ts +7 -0
- package/dist/src/outputs/write-asm80.js +549 -0
- package/dist/src/outputs/write-bin.d.ts +2 -0
- package/dist/src/outputs/write-bin.js +27 -0
- package/dist/src/outputs/write-d8.d.ts +2 -0
- package/dist/src/outputs/write-d8.js +257 -0
- package/dist/src/outputs/write-hex.d.ts +2 -0
- package/dist/src/outputs/write-hex.js +53 -0
- package/dist/src/outputs/write-listing.d.ts +2 -0
- package/dist/src/outputs/write-listing.js +79 -0
- package/dist/src/register-care/accept-output.d.ts +2 -0
- package/dist/src/register-care/accept-output.js +35 -0
- package/dist/src/register-care/analyze.d.ts +26 -0
- package/dist/src/register-care/analyze.js +87 -0
- package/dist/src/register-care/annotations.d.ts +8 -0
- package/dist/src/register-care/annotations.js +154 -0
- package/dist/src/register-care/boundaryHints.d.ts +2 -0
- package/dist/src/register-care/boundaryHints.js +11 -0
- package/dist/src/register-care/carriers.d.ts +2 -0
- package/dist/src/register-care/carriers.js +78 -0
- package/dist/src/register-care/controlFlow.d.ts +5 -0
- package/dist/src/register-care/controlFlow.js +38 -0
- package/dist/src/register-care/fix.d.ts +9 -0
- package/dist/src/register-care/fix.js +78 -0
- package/dist/src/register-care/liveness.d.ts +3 -0
- package/dist/src/register-care/liveness.js +189 -0
- package/dist/src/register-care/profiles.d.ts +9 -0
- package/dist/src/register-care/profiles.js +43 -0
- package/dist/src/register-care/programModel.d.ts +3 -0
- package/dist/src/register-care/programModel.js +122 -0
- package/dist/src/register-care/report.d.ts +4 -0
- package/dist/src/register-care/report.js +82 -0
- package/dist/src/register-care/smartComments.d.ts +5 -0
- package/dist/src/register-care/smartComments.js +243 -0
- package/dist/src/register-care/summaries.d.ts +12 -0
- package/dist/src/register-care/summaries.js +154 -0
- package/dist/src/{registerCare → register-care}/tooling.d.ts +7 -6
- package/dist/src/{registerCare → register-care}/tooling.js +17 -6
- package/dist/src/register-care/types.d.ts +165 -0
- package/dist/src/register-care/types.js +1 -0
- package/dist/src/semantics/expression-evaluation.d.ts +29 -0
- package/dist/src/semantics/expression-evaluation.js +409 -0
- package/dist/src/source/logical-lines.d.ts +7 -0
- package/dist/src/source/logical-lines.js +11 -0
- package/dist/src/source/source-file.d.ts +5 -0
- package/dist/src/source/source-file.js +3 -0
- package/dist/src/source/source-span.d.ts +5 -0
- package/dist/src/source/source-span.js +1 -0
- package/dist/src/source/strip-line-comment.d.ts +4 -0
- package/dist/src/source/strip-line-comment.js +27 -0
- package/dist/src/syntax/directive-aliases.d.ts +10 -0
- package/dist/src/syntax/directive-aliases.js +199 -0
- package/dist/src/syntax/parse-expression.d.ts +3 -0
- package/dist/src/syntax/parse-expression.js +551 -0
- package/dist/src/syntax/parse-line.d.ts +12 -0
- package/dist/src/syntax/parse-line.js +329 -0
- package/dist/src/tooling/api.d.ts +42 -0
- package/dist/src/tooling/api.js +42 -0
- package/dist/src/tooling/case-style.d.ts +8 -0
- package/dist/src/tooling/case-style.js +163 -0
- package/dist/src/z80/effects.d.ts +3 -3
- package/dist/src/z80/effects.js +349 -302
- package/dist/src/z80/encode.d.ts +2 -10
- package/dist/src/z80/encode.js +951 -374
- package/dist/src/z80/instruction.d.ts +226 -0
- package/dist/src/z80/instruction.js +1 -0
- package/dist/src/z80/parse-instruction.d.ts +7 -0
- package/dist/src/z80/parse-instruction.js +1068 -0
- package/docs/reference/tooling-api.md +55 -3
- package/package.json +20 -3
- /package/dist/{src → legacy-root-azm/src}/analysis.d.ts +0 -0
- /package/dist/{src → legacy-root-azm/src}/analysis.js +0 -0
- /package/dist/{src → legacy-root-azm/src}/compile.d.ts +0 -0
- /package/dist/{src → legacy-root-azm/src}/compile.js +0 -0
- /package/dist/{src → legacy-root-azm/src}/compileShared.d.ts +0 -0
- /package/dist/{src → legacy-root-azm/src}/compileShared.js +0 -0
- /package/dist/{src → legacy-root-azm/src}/diagnosticTypes.d.ts +0 -0
- /package/dist/{src → legacy-root-azm/src}/diagnosticTypes.js +0 -0
- /package/dist/{src → legacy-root-azm/src}/formats/range.d.ts +0 -0
- /package/dist/{src → legacy-root-azm/src}/formats/range.js +0 -0
- /package/dist/{src → legacy-root-azm/src}/formats/types.js +0 -0
- /package/dist/{src → legacy-root-azm/src}/formats/writeAsm80.d.ts +0 -0
- /package/dist/{src → legacy-root-azm/src}/formats/writeAsm80.js +0 -0
- /package/dist/{src → legacy-root-azm/src}/formats/writeBin.d.ts +0 -0
- /package/dist/{src → legacy-root-azm/src}/formats/writeBin.js +0 -0
- /package/dist/{src → legacy-root-azm/src}/formats/writeD8m.d.ts +0 -0
- /package/dist/{src → legacy-root-azm/src}/formats/writeD8m.js +0 -0
- /package/dist/{src → legacy-root-azm/src}/formats/writeListing.d.ts +0 -0
- /package/dist/{src → legacy-root-azm/src}/formats/writeListing.js +0 -0
- /package/dist/{src → legacy-root-azm/src}/frontend/asm80/asmLine.d.ts +0 -0
- /package/dist/{src → legacy-root-azm/src}/frontend/asm80/asmLine.js +0 -0
- /package/dist/{src → legacy-root-azm/src}/frontend/asm80/parseAsmRawValues.d.ts +0 -0
- /package/dist/{src → legacy-root-azm/src}/frontend/asm80/parseAsmRawValues.js +0 -0
- /package/dist/{src → legacy-root-azm/src}/frontend/asm80/quoteScan.d.ts +0 -0
- /package/dist/{src → legacy-root-azm/src}/frontend/asm80/quoteScan.js +0 -0
- /package/dist/{src → legacy-root-azm/src}/frontend/ast.d.ts +0 -0
- /package/dist/{src → legacy-root-azm/src}/frontend/ast.js +0 -0
- /package/dist/{src → legacy-root-azm/src}/frontend/directiveAliases.d.ts +0 -0
- /package/dist/{src → legacy-root-azm/src}/frontend/directiveAliases.js +0 -0
- /package/dist/{src → legacy-root-azm/src}/frontend/grammarData.d.ts +0 -0
- /package/dist/{src → legacy-root-azm/src}/frontend/grammarData.js +0 -0
- /package/dist/{src → legacy-root-azm/src}/frontend/immExprUtils.d.ts +0 -0
- /package/dist/{src → legacy-root-azm/src}/frontend/immExprUtils.js +0 -0
- /package/dist/{src → legacy-root-azm/src}/frontend/parseAsmFlatDirectiveLine.d.ts +0 -0
- /package/dist/{src → legacy-root-azm/src}/frontend/parseAsmFlatDirectiveLine.js +0 -0
- /package/dist/{src → legacy-root-azm/src}/frontend/parseAsmInstruction.d.ts +0 -0
- /package/dist/{src → legacy-root-azm/src}/frontend/parseAsmInstruction.js +0 -0
- /package/dist/{src → legacy-root-azm/src}/frontend/parseAsmStatements.d.ts +0 -0
- /package/dist/{src → legacy-root-azm/src}/frontend/parseAsmStatements.js +0 -0
- /package/dist/{src → legacy-root-azm/src}/frontend/parseAsmStream.d.ts +0 -0
- /package/dist/{src → legacy-root-azm/src}/frontend/parseAsmStream.js +0 -0
- /package/dist/{src → legacy-root-azm/src}/frontend/parseAsmTopLevel.d.ts +0 -0
- /package/dist/{src → legacy-root-azm/src}/frontend/parseAsmTopLevel.js +0 -0
- /package/dist/{src → legacy-root-azm/src}/frontend/parseDiagnostics.d.ts +0 -0
- /package/dist/{src → legacy-root-azm/src}/frontend/parseDiagnostics.js +0 -0
- /package/dist/{src → legacy-root-azm/src}/frontend/parseEnum.d.ts +0 -0
- /package/dist/{src → legacy-root-azm/src}/frontend/parseEnum.js +0 -0
- /package/dist/{src → legacy-root-azm/src}/frontend/parseImm.d.ts +0 -0
- /package/dist/{src → legacy-root-azm/src}/frontend/parseImm.js +0 -0
- /package/dist/{src → legacy-root-azm/src}/frontend/parseLogicalLines.d.ts +0 -0
- /package/dist/{src → legacy-root-azm/src}/frontend/parseLogicalLines.js +0 -0
- /package/dist/{src → legacy-root-azm/src}/frontend/parseOp.d.ts +0 -0
- /package/dist/{src → legacy-root-azm/src}/frontend/parseOp.js +0 -0
- /package/dist/{src → legacy-root-azm/src}/frontend/parseOpHeader.d.ts +0 -0
- /package/dist/{src → legacy-root-azm/src}/frontend/parseOpHeader.js +0 -0
- /package/dist/{src → legacy-root-azm/src}/frontend/parseOperands.d.ts +0 -0
- /package/dist/{src → legacy-root-azm/src}/frontend/parseOperands.js +0 -0
- /package/dist/{src → legacy-root-azm/src}/frontend/parseParams.d.ts +0 -0
- /package/dist/{src → legacy-root-azm/src}/frontend/parseParams.js +0 -0
- /package/dist/{src → legacy-root-azm/src}/frontend/parseParserRecovery.d.ts +0 -0
- /package/dist/{src → legacy-root-azm/src}/frontend/parseParserRecovery.js +0 -0
- /package/dist/{src → legacy-root-azm/src}/frontend/parseParserShared.d.ts +0 -0
- /package/dist/{src → legacy-root-azm/src}/frontend/parseParserShared.js +0 -0
- /package/dist/{src → legacy-root-azm/src}/frontend/parseRawDataDirectiveStart.d.ts +0 -0
- /package/dist/{src → legacy-root-azm/src}/frontend/parseRawDataDirectiveStart.js +0 -0
- /package/dist/{src → legacy-root-azm/src}/frontend/parseRawDataDirectives.d.ts +0 -0
- /package/dist/{src → legacy-root-azm/src}/frontend/parseRawDataDirectives.js +0 -0
- /package/dist/{src → legacy-root-azm/src}/frontend/parseRecordFieldDecl.d.ts +0 -0
- /package/dist/{src → legacy-root-azm/src}/frontend/parseRecordFieldDecl.js +0 -0
- /package/dist/{src → legacy-root-azm/src}/frontend/parseSourceItemDispatch.d.ts +0 -0
- /package/dist/{src → legacy-root-azm/src}/frontend/parseSourceItemDispatch.js +0 -0
- /package/dist/{src → legacy-root-azm/src}/frontend/parseSourceItemTable.d.ts +0 -0
- /package/dist/{src → legacy-root-azm/src}/frontend/parseSourceItemTable.js +0 -0
- /package/dist/{src → legacy-root-azm/src}/frontend/parseTopLevelCommon.d.ts +0 -0
- /package/dist/{src → legacy-root-azm/src}/frontend/parseTopLevelCommon.js +0 -0
- /package/dist/{src → legacy-root-azm/src}/frontend/parseTypes.d.ts +0 -0
- /package/dist/{src → legacy-root-azm/src}/frontend/parseTypes.js +0 -0
- /package/dist/{src → legacy-root-azm/src}/frontend/parser.d.ts +0 -0
- /package/dist/{src → legacy-root-azm/src}/frontend/parser.js +0 -0
- /package/dist/{src → legacy-root-azm/src}/frontend/source.d.ts +0 -0
- /package/dist/{src → legacy-root-azm/src}/frontend/source.js +0 -0
- /package/dist/{src → legacy-root-azm/src}/frontend/sourceExtensions.d.ts +0 -0
- /package/dist/{src → legacy-root-azm/src}/frontend/sourceExtensions.js +0 -0
- /package/dist/{src → legacy-root-azm/src}/lintCaseStyle.d.ts +0 -0
- /package/dist/{src → legacy-root-azm/src}/lintCaseStyle.js +0 -0
- /package/dist/{src → legacy-root-azm/src}/lowering/asmDirectiveLowering.d.ts +0 -0
- /package/dist/{src → legacy-root-azm/src}/lowering/asmDirectiveLowering.js +0 -0
- /package/dist/{src → legacy-root-azm/src}/lowering/asmDirectiveTraversal.d.ts +0 -0
- /package/dist/{src → legacy-root-azm/src}/lowering/asmDirectiveTraversal.js +0 -0
- /package/dist/{src → legacy-root-azm/src}/lowering/asmEquResolution.d.ts +0 -0
- /package/dist/{src → legacy-root-azm/src}/lowering/asmEquResolution.js +0 -0
- /package/dist/{src → legacy-root-azm/src}/lowering/asmInstructionLdHelpers.d.ts +0 -0
- /package/dist/{src → legacy-root-azm/src}/lowering/asmInstructionLdHelpers.js +0 -0
- /package/dist/{src → legacy-root-azm/src}/lowering/asmInstructionLowering.d.ts +0 -0
- /package/dist/{src → legacy-root-azm/src}/lowering/asmInstructionLowering.js +0 -0
- /package/dist/{src → legacy-root-azm/src}/lowering/asmInstructionStream.d.ts +0 -0
- /package/dist/{src → legacy-root-azm/src}/lowering/asmInstructionStream.js +0 -0
- /package/dist/{src → legacy-root-azm/src}/lowering/asmLoweringBranchCall.d.ts +0 -0
- /package/dist/{src → legacy-root-azm/src}/lowering/asmLoweringBranchCall.js +0 -0
- /package/dist/{src → legacy-root-azm/src}/lowering/asmLoweringHost.d.ts +0 -0
- /package/dist/{src → legacy-root-azm/src}/lowering/asmLoweringHost.js +0 -0
- /package/dist/{src → legacy-root-azm/src}/lowering/asmLoweringLd.d.ts +0 -0
- /package/dist/{src → legacy-root-azm/src}/lowering/asmLoweringLd.js +0 -0
- /package/dist/{src → legacy-root-azm/src}/lowering/asmRangeLowering.d.ts +0 -0
- /package/dist/{src → legacy-root-azm/src}/lowering/asmRangeLowering.js +0 -0
- /package/dist/{src → legacy-root-azm/src}/lowering/asmRawDataLowering.d.ts +0 -0
- /package/dist/{src → legacy-root-azm/src}/lowering/asmRawDataLowering.js +0 -0
- /package/dist/{src → legacy-root-azm/src}/lowering/asmSourceEmitter.d.ts +0 -0
- /package/dist/{src → legacy-root-azm/src}/lowering/asmSourceEmitter.js +0 -0
- /package/dist/{src → legacy-root-azm/src}/lowering/asmSourceInstructionLowering.d.ts +0 -0
- /package/dist/{src → legacy-root-azm/src}/lowering/asmSourceInstructionLowering.js +0 -0
- /package/dist/{src → legacy-root-azm/src}/lowering/asmUtils.d.ts +0 -0
- /package/dist/{src → legacy-root-azm/src}/lowering/asmUtils.js +0 -0
- /package/dist/{src → legacy-root-azm/src}/lowering/assemblerFlowSetup.d.ts +0 -0
- /package/dist/{src → legacy-root-azm/src}/lowering/assemblerFlowSetup.js +0 -0
- /package/dist/{src → legacy-root-azm/src}/lowering/assemblerLoweringContext.d.ts +0 -0
- /package/dist/{src → legacy-root-azm/src}/lowering/assemblerLoweringContext.js +0 -0
- /package/dist/{src → legacy-root-azm/src}/lowering/assemblerLoweringContextSplit.d.ts +0 -0
- /package/dist/{src → legacy-root-azm/src}/lowering/assemblerLoweringContextSplit.js +0 -0
- /package/dist/{src → legacy-root-azm/src}/lowering/assemblerLoweringPhases.d.ts +0 -0
- /package/dist/{src → legacy-root-azm/src}/lowering/assemblerLoweringPhases.js +0 -0
- /package/dist/{src → legacy-root-azm/src}/lowering/bytePlacement.d.ts +0 -0
- /package/dist/{src → legacy-root-azm/src}/lowering/bytePlacement.js +0 -0
- /package/dist/{src → legacy-root-azm/src}/lowering/capabilities.d.ts +0 -0
- /package/dist/{src → legacy-root-azm/src}/lowering/capabilities.js +0 -0
- /package/dist/{src → legacy-root-azm/src}/lowering/eaResolution.d.ts +0 -0
- /package/dist/{src → legacy-root-azm/src}/lowering/eaResolution.js +0 -0
- /package/dist/{src → legacy-root-azm/src}/lowering/emissionCore.d.ts +0 -0
- /package/dist/{src → legacy-root-azm/src}/lowering/emissionCore.js +0 -0
- /package/dist/{src → legacy-root-azm/src}/lowering/emit.d.ts +0 -0
- /package/dist/{src → legacy-root-azm/src}/lowering/emit.js +0 -0
- /package/dist/{src → legacy-root-azm/src}/lowering/emitContextBuilder.d.ts +0 -0
- /package/dist/{src → legacy-root-azm/src}/lowering/emitContextBuilder.js +0 -0
- /package/dist/{src → legacy-root-azm/src}/lowering/emitFinalization.d.ts +0 -0
- /package/dist/{src → legacy-root-azm/src}/lowering/emitFinalization.js +0 -0
- /package/dist/{src → legacy-root-azm/src}/lowering/emitFinalizationSetup.d.ts +0 -0
- /package/dist/{src → legacy-root-azm/src}/lowering/emitFinalizationSetup.js +0 -0
- /package/dist/{src → legacy-root-azm/src}/lowering/emitPhase1BuildProgramLoweringContext.d.ts +0 -0
- /package/dist/{src → legacy-root-azm/src}/lowering/emitPhase1BuildProgramLoweringContext.js +0 -0
- /package/dist/{src → legacy-root-azm/src}/lowering/emitPhase1Helpers.d.ts +0 -0
- /package/dist/{src → legacy-root-azm/src}/lowering/emitPhase1Helpers.js +0 -0
- /package/dist/{src → legacy-root-azm/src}/lowering/emitPhase1Types.d.ts +0 -0
- /package/dist/{src → legacy-root-azm/src}/lowering/emitPhase1Types.js +0 -0
- /package/dist/{src → legacy-root-azm/src}/lowering/emitPhase1WirePipeline.d.ts +0 -0
- /package/dist/{src → legacy-root-azm/src}/lowering/emitPhase1WirePipeline.js +0 -0
- /package/dist/{src → legacy-root-azm/src}/lowering/emitPhase1Workspace.d.ts +0 -0
- /package/dist/{src → legacy-root-azm/src}/lowering/emitPhase1Workspace.js +0 -0
- /package/dist/{src → legacy-root-azm/src}/lowering/emitPipeline.d.ts +0 -0
- /package/dist/{src → legacy-root-azm/src}/lowering/emitPipeline.js +0 -0
- /package/dist/{src → legacy-root-azm/src}/lowering/emitProgramContext.d.ts +0 -0
- /package/dist/{src → legacy-root-azm/src}/lowering/emitProgramContext.js +0 -0
- /package/dist/{src → legacy-root-azm/src}/lowering/emitState.d.ts +0 -0
- /package/dist/{src → legacy-root-azm/src}/lowering/emitState.js +0 -0
- /package/dist/{src → legacy-root-azm/src}/lowering/fixupBaseResolution.d.ts +0 -0
- /package/dist/{src → legacy-root-azm/src}/lowering/fixupBaseResolution.js +0 -0
- /package/dist/{src → legacy-root-azm/src}/lowering/fixupEmission.d.ts +0 -0
- /package/dist/{src → legacy-root-azm/src}/lowering/fixupEmission.js +0 -0
- /package/dist/{src → legacy-root-azm/src}/lowering/immMath.d.ts +0 -0
- /package/dist/{src → legacy-root-azm/src}/lowering/immMath.js +0 -0
- /package/dist/{src → legacy-root-azm/src}/lowering/inputAssets.d.ts +0 -0
- /package/dist/{src → legacy-root-azm/src}/lowering/inputAssets.js +0 -0
- /package/dist/{src → legacy-root-azm/src}/lowering/ldEncoding.d.ts +0 -0
- /package/dist/{src → legacy-root-azm/src}/lowering/ldEncoding.js +0 -0
- /package/dist/{src → legacy-root-azm/src}/lowering/ldEncodingRegMemHelpers.d.ts +0 -0
- /package/dist/{src → legacy-root-azm/src}/lowering/ldEncodingRegMemHelpers.js +0 -0
- /package/dist/{src → legacy-root-azm/src}/lowering/ldFormSelection.d.ts +0 -0
- /package/dist/{src → legacy-root-azm/src}/lowering/ldFormSelection.js +0 -0
- /package/dist/{src → legacy-root-azm/src}/lowering/ldLowering.d.ts +0 -0
- /package/dist/{src → legacy-root-azm/src}/lowering/ldLowering.js +0 -0
- /package/dist/{src → legacy-root-azm/src}/lowering/loweredAsmByteEmission.d.ts +0 -0
- /package/dist/{src → legacy-root-azm/src}/lowering/loweredAsmByteEmission.js +0 -0
- /package/dist/{src → legacy-root-azm/src}/lowering/loweredAsmPlacement.d.ts +0 -0
- /package/dist/{src → legacy-root-azm/src}/lowering/loweredAsmPlacement.js +0 -0
- /package/dist/{src → legacy-root-azm/src}/lowering/loweredAsmStreamRecording.d.ts +0 -0
- /package/dist/{src → legacy-root-azm/src}/lowering/loweredAsmStreamRecording.js +0 -0
- /package/dist/{src → legacy-root-azm/src}/lowering/loweredAsmTypes.d.ts +0 -0
- /package/dist/{src → legacy-root-azm/src}/lowering/loweredAsmTypes.js +0 -0
- /package/dist/{src → legacy-root-azm/src}/lowering/loweredFormat.d.ts +0 -0
- /package/dist/{src → legacy-root-azm/src}/lowering/loweredFormat.js +0 -0
- /package/dist/{src → legacy-root-azm/src}/lowering/loweredItemSize.d.ts +0 -0
- /package/dist/{src → legacy-root-azm/src}/lowering/loweredItemSize.js +0 -0
- /package/dist/{src → legacy-root-azm/src}/lowering/loweringDiagnostics.d.ts +0 -0
- /package/dist/{src → legacy-root-azm/src}/lowering/loweringDiagnostics.js +0 -0
- /package/dist/{src → legacy-root-azm/src}/lowering/loweringTypes.d.ts +0 -0
- /package/dist/{src → legacy-root-azm/src}/lowering/loweringTypes.js +0 -0
- /package/dist/{src → legacy-root-azm/src}/lowering/opCandidateRegistry.d.ts +0 -0
- /package/dist/{src → legacy-root-azm/src}/lowering/opCandidateRegistry.js +0 -0
- /package/dist/{src → legacy-root-azm/src}/lowering/opExpansionExecution.d.ts +0 -0
- /package/dist/{src → legacy-root-azm/src}/lowering/opExpansionExecution.js +0 -0
- /package/dist/{src → legacy-root-azm/src}/lowering/opExpansionOrchestration.d.ts +0 -0
- /package/dist/{src → legacy-root-azm/src}/lowering/opExpansionOrchestration.js +0 -0
- /package/dist/{src → legacy-root-azm/src}/lowering/opExpansionStream.d.ts +0 -0
- /package/dist/{src → legacy-root-azm/src}/lowering/opExpansionStream.js +0 -0
- /package/dist/{src → legacy-root-azm/src}/lowering/opMatching.d.ts +0 -0
- /package/dist/{src → legacy-root-azm/src}/lowering/opMatching.js +0 -0
- /package/dist/{src → legacy-root-azm/src}/lowering/opSubstitution.d.ts +0 -0
- /package/dist/{src → legacy-root-azm/src}/lowering/opSubstitution.js +0 -0
- /package/dist/{src → legacy-root-azm/src}/lowering/prescanTypes.d.ts +0 -0
- /package/dist/{src → legacy-root-azm/src}/lowering/prescanTypes.js +0 -0
- /package/dist/{src → legacy-root-azm/src}/lowering/programLowering.d.ts +0 -0
- /package/dist/{src → legacy-root-azm/src}/lowering/programLowering.js +0 -0
- /package/dist/{src → legacy-root-azm/src}/lowering/programLoweringDeclarations.d.ts +0 -0
- /package/dist/{src → legacy-root-azm/src}/lowering/programLoweringDeclarations.js +0 -0
- /package/dist/{src → legacy-root-azm/src}/lowering/programLoweringFinalize.d.ts +0 -0
- /package/dist/{src → legacy-root-azm/src}/lowering/programLoweringFinalize.js +0 -0
- /package/dist/{src → legacy-root-azm/src}/lowering/programLoweringTraversal.d.ts +0 -0
- /package/dist/{src → legacy-root-azm/src}/lowering/programLoweringTraversal.js +0 -0
- /package/dist/{src → legacy-root-azm/src}/lowering/programPrescan.d.ts +0 -0
- /package/dist/{src → legacy-root-azm/src}/lowering/programPrescan.js +0 -0
- /package/dist/{src → legacy-root-azm/src}/lowering/traceFormat.d.ts +0 -0
- /package/dist/{src → legacy-root-azm/src}/lowering/traceFormat.js +0 -0
- /package/dist/{src → legacy-root-azm/src}/packageInfo.d.ts +0 -0
- /package/dist/{src → legacy-root-azm/src}/packageInfo.js +0 -0
- /package/dist/{src → legacy-root-azm/src}/pathCompare.d.ts +0 -0
- /package/dist/{src → legacy-root-azm/src}/pathCompare.js +0 -0
- /package/dist/{src → legacy-root-azm/src}/pipeline.js +0 -0
- /package/dist/{src → legacy-root-azm/src}/registerCare/analyze.d.ts +0 -0
- /package/dist/{src → legacy-root-azm/src}/registerCare/analyze.js +0 -0
- /package/dist/{src → legacy-root-azm/src}/registerCare/annotate.d.ts +0 -0
- /package/dist/{src → legacy-root-azm/src}/registerCare/annotate.js +0 -0
- /package/dist/{src → legacy-root-azm/src}/registerCare/boundaryHints.d.ts +0 -0
- /package/dist/{src → legacy-root-azm/src}/registerCare/boundaryHints.js +0 -0
- /package/dist/{src → legacy-root-azm/src}/registerCare/carriers.d.ts +0 -0
- /package/dist/{src → legacy-root-azm/src}/registerCare/carriers.js +0 -0
- /package/dist/{src → legacy-root-azm/src}/registerCare/controlFlow.d.ts +0 -0
- /package/dist/{src → legacy-root-azm/src}/registerCare/controlFlow.js +0 -0
- /package/dist/{src → legacy-root-azm/src}/registerCare/fix.d.ts +0 -0
- /package/dist/{src → legacy-root-azm/src}/registerCare/fix.js +0 -0
- /package/dist/{src → legacy-root-azm/src}/registerCare/liveness.d.ts +0 -0
- /package/dist/{src → legacy-root-azm/src}/registerCare/liveness.js +0 -0
- /package/dist/{src → legacy-root-azm/src}/registerCare/profiles.d.ts +0 -0
- /package/dist/{src → legacy-root-azm/src}/registerCare/profiles.js +0 -0
- /package/dist/{src → legacy-root-azm/src}/registerCare/programModel.d.ts +0 -0
- /package/dist/{src → legacy-root-azm/src}/registerCare/programModel.js +0 -0
- /package/dist/{src → legacy-root-azm/src}/registerCare/report.d.ts +0 -0
- /package/dist/{src → legacy-root-azm/src}/registerCare/report.js +0 -0
- /package/dist/{src → legacy-root-azm/src}/registerCare/smartComments.d.ts +0 -0
- /package/dist/{src → legacy-root-azm/src}/registerCare/smartComments.js +0 -0
- /package/dist/{src → legacy-root-azm/src}/registerCare/sourceText.d.ts +0 -0
- /package/dist/{src → legacy-root-azm/src}/registerCare/sourceText.js +0 -0
- /package/dist/{src → legacy-root-azm/src}/registerCare/summary.d.ts +0 -0
- /package/dist/{src → legacy-root-azm/src}/registerCare/summary.js +0 -0
- /package/dist/{src → legacy-root-azm/src}/registerCare/types.d.ts +0 -0
- /package/dist/{src → legacy-root-azm/src}/registerCare/types.js +0 -0
- /package/dist/{src → legacy-root-azm/src}/semantics/declVisitor.d.ts +0 -0
- /package/dist/{src → legacy-root-azm/src}/semantics/declVisitor.js +0 -0
- /package/dist/{src → legacy-root-azm/src}/semantics/env.d.ts +0 -0
- /package/dist/{src → legacy-root-azm/src}/semantics/env.js +0 -0
- /package/dist/{src → legacy-root-azm/src}/semantics/layout.d.ts +0 -0
- /package/dist/{src → legacy-root-azm/src}/semantics/layout.js +0 -0
- /package/dist/{src → legacy-root-azm/src}/semantics/layoutCastFold.d.ts +0 -0
- /package/dist/{src → legacy-root-azm/src}/semantics/layoutCastFold.js +0 -0
- /package/dist/{src → legacy-root-azm/src}/semantics/semanticsDiagnostics.d.ts +0 -0
- /package/dist/{src → legacy-root-azm/src}/semantics/semanticsDiagnostics.js +0 -0
- /package/dist/{src → legacy-root-azm/src}/semantics/typeQueries.d.ts +0 -0
- /package/dist/{src → legacy-root-azm/src}/semantics/typeQueries.js +0 -0
- /package/dist/{src → legacy-root-azm/src}/sourceIncludeExpansion.d.ts +0 -0
- /package/dist/{src → legacy-root-azm/src}/sourceIncludeExpansion.js +0 -0
- /package/dist/{src → legacy-root-azm/src}/sourceIncludePaths.d.ts +0 -0
- /package/dist/{src → legacy-root-azm/src}/sourceIncludePaths.js +0 -0
- /package/dist/{src → legacy-root-azm/src}/sourceLoader.d.ts +0 -0
- /package/dist/{src → legacy-root-azm/src}/sourceLoader.js +0 -0
- /package/dist/{src → legacy-root-azm/src}/z80/encodeAlu.d.ts +0 -0
- /package/dist/{src → legacy-root-azm/src}/z80/encodeAlu.js +0 -0
- /package/dist/{src → legacy-root-azm/src}/z80/encodeBitOps.d.ts +0 -0
- /package/dist/{src → legacy-root-azm/src}/z80/encodeBitOps.js +0 -0
- /package/dist/{src → legacy-root-azm/src}/z80/encodeContext.d.ts +0 -0
- /package/dist/{src → legacy-root-azm/src}/z80/encodeContext.js +0 -0
- /package/dist/{src → legacy-root-azm/src}/z80/encodeControl.d.ts +0 -0
- /package/dist/{src → legacy-root-azm/src}/z80/encodeControl.js +0 -0
- /package/dist/{src → legacy-root-azm/src}/z80/encodeCoreOps.d.ts +0 -0
- /package/dist/{src → legacy-root-azm/src}/z80/encodeCoreOps.js +0 -0
- /package/dist/{src → legacy-root-azm/src}/z80/encodeIo.d.ts +0 -0
- /package/dist/{src → legacy-root-azm/src}/z80/encodeIo.js +0 -0
- /package/dist/{src → legacy-root-azm/src}/z80/encodeLd.d.ts +0 -0
- /package/dist/{src → legacy-root-azm/src}/z80/encodeLd.js +0 -0
- /package/dist/{src → legacy-root-azm/src}/z80/encoderRegistry.d.ts +0 -0
- /package/dist/{src → legacy-root-azm/src}/z80/encoderRegistry.js +0 -0
package/README.md
CHANGED
|
@@ -85,6 +85,7 @@ Options:
|
|
|
85
85
|
--nohex Suppress .hex
|
|
86
86
|
--nod8m Suppress .d8.json
|
|
87
87
|
--asm80 Emit assembler-valid lowered source (.z80)
|
|
88
|
+
--source-root <d> Normalize D8 source paths relative to this directory
|
|
88
89
|
--case-style <m> Case-style lint mode: off|upper|lower|consistent
|
|
89
90
|
--rc <m> Register-care mode: off|audit|warn|error|strict
|
|
90
91
|
--reg-report Emit .regcare.txt report
|
|
@@ -115,7 +116,14 @@ import { compile, defaultFormatWriters } from '@jhlagado/azm/compile';
|
|
|
115
116
|
|
|
116
117
|
const result = await compile(
|
|
117
118
|
'/abs/path/to/main.asm',
|
|
118
|
-
{
|
|
119
|
+
{
|
|
120
|
+
outputType: 'hex',
|
|
121
|
+
sourceRoot: '/abs/path/to/project',
|
|
122
|
+
d8mInputs: {
|
|
123
|
+
hex: '/abs/path/to/project/build/main.hex',
|
|
124
|
+
listing: '/abs/path/to/project/build/main.lst',
|
|
125
|
+
},
|
|
126
|
+
},
|
|
119
127
|
{ formats: defaultFormatWriters },
|
|
120
128
|
);
|
|
121
129
|
|
|
@@ -4,7 +4,7 @@ import { writeHex } from './writeHex.js';
|
|
|
4
4
|
import { writeListing } from './writeListing.js';
|
|
5
5
|
import { writeAsm80 } from './writeAsm80.js';
|
|
6
6
|
/**
|
|
7
|
-
* Default in-memory artifact writers
|
|
7
|
+
* Default in-memory artifact writers.
|
|
8
8
|
*
|
|
9
9
|
* These writers implement the `FormatWriters` contract and return artifacts without writing to disk.
|
|
10
10
|
*/
|
|
@@ -68,14 +68,10 @@ export interface WriteHexOptions {
|
|
|
68
68
|
*/
|
|
69
69
|
lineEnding?: '\n' | '\r\n';
|
|
70
70
|
}
|
|
71
|
-
/**
|
|
72
|
-
* Options for BIN writing (reserved for future options).
|
|
73
|
-
*/
|
|
71
|
+
/** Options for BIN writing. */
|
|
74
72
|
export interface WriteBinOptions {
|
|
75
73
|
}
|
|
76
|
-
/**
|
|
77
|
-
* Options for D8M writing (reserved for future options).
|
|
78
|
-
*/
|
|
74
|
+
/** Options for D8M writing. */
|
|
79
75
|
export interface WriteD8mOptions {
|
|
80
76
|
/**
|
|
81
77
|
* Base directory used to normalize file paths in D8M symbol entries.
|
|
@@ -170,6 +166,64 @@ export interface D8mArtifact {
|
|
|
170
166
|
path?: string;
|
|
171
167
|
json: D8mJson;
|
|
172
168
|
}
|
|
169
|
+
export type D8mSegmentKind = 'code' | 'data' | 'directive' | 'label' | 'macro' | 'unknown';
|
|
170
|
+
export type D8mSegmentConfidence = 'high' | 'medium' | 'low';
|
|
171
|
+
export interface D8mSegment {
|
|
172
|
+
start: number;
|
|
173
|
+
end: number;
|
|
174
|
+
lstLine: number;
|
|
175
|
+
/** 1-based original source line when known. */
|
|
176
|
+
line?: number;
|
|
177
|
+
kind: D8mSegmentKind;
|
|
178
|
+
confidence: D8mSegmentConfidence;
|
|
179
|
+
}
|
|
180
|
+
export type D8mSymbol = {
|
|
181
|
+
name: string;
|
|
182
|
+
kind: 'constant';
|
|
183
|
+
value: number;
|
|
184
|
+
file?: string;
|
|
185
|
+
line?: number;
|
|
186
|
+
scope?: 'global' | 'local';
|
|
187
|
+
} | {
|
|
188
|
+
name: string;
|
|
189
|
+
kind: 'label' | 'data' | 'unknown';
|
|
190
|
+
address: number;
|
|
191
|
+
file?: string;
|
|
192
|
+
line?: number;
|
|
193
|
+
scope?: 'global' | 'local';
|
|
194
|
+
size?: number;
|
|
195
|
+
};
|
|
196
|
+
export type D8mFileSymbol = {
|
|
197
|
+
name: string;
|
|
198
|
+
kind: 'constant';
|
|
199
|
+
value: number;
|
|
200
|
+
line?: number;
|
|
201
|
+
scope?: 'global' | 'local';
|
|
202
|
+
} | {
|
|
203
|
+
name: string;
|
|
204
|
+
kind: 'label' | 'data' | 'unknown';
|
|
205
|
+
address: number;
|
|
206
|
+
line?: number;
|
|
207
|
+
scope?: 'global' | 'local';
|
|
208
|
+
size?: number;
|
|
209
|
+
};
|
|
210
|
+
export interface D8mFileEntry {
|
|
211
|
+
segments?: D8mSegment[];
|
|
212
|
+
symbols?: D8mFileSymbol[];
|
|
213
|
+
}
|
|
214
|
+
export interface D8mGenerator {
|
|
215
|
+
name: 'azm';
|
|
216
|
+
tool: 'azm';
|
|
217
|
+
version?: string;
|
|
218
|
+
inputs?: {
|
|
219
|
+
entry?: string;
|
|
220
|
+
listing?: string;
|
|
221
|
+
hex?: string;
|
|
222
|
+
bin?: string;
|
|
223
|
+
};
|
|
224
|
+
entrySymbol?: string;
|
|
225
|
+
entryAddress?: number;
|
|
226
|
+
}
|
|
173
227
|
/**
|
|
174
228
|
* In-memory register-care audit report artifact.
|
|
175
229
|
*/
|
|
@@ -209,7 +263,13 @@ export type D8mJson = {
|
|
|
209
263
|
format: 'd8-debug-map';
|
|
210
264
|
version: 1;
|
|
211
265
|
arch: 'z80';
|
|
212
|
-
|
|
266
|
+
addressWidth: 16;
|
|
267
|
+
endianness: 'little';
|
|
268
|
+
files: Record<string, D8mFileEntry>;
|
|
269
|
+
segments: AddressRange[];
|
|
270
|
+
fileList?: string[];
|
|
271
|
+
symbols: D8mSymbol[];
|
|
272
|
+
generator: D8mGenerator;
|
|
213
273
|
};
|
|
214
274
|
/**
|
|
215
275
|
* Format writers used by the pipeline to turn emitted bytes/symbols into artifacts.
|
|
@@ -2,7 +2,6 @@ import type { EmittedByteMap, HexArtifact, SymbolEntry, WriteHexOptions } from '
|
|
|
2
2
|
/**
|
|
3
3
|
* Create an Intel HEX artifact from an emitted address->byte map.
|
|
4
4
|
*
|
|
5
|
-
* PR1 implementation note:
|
|
6
5
|
* - Emits only type-00 data records and a type-01 EOF record.
|
|
7
6
|
* - Does not emit extended address records (assumes 16-bit address space).
|
|
8
7
|
*/
|
|
@@ -9,7 +9,6 @@ function checksum(bytes) {
|
|
|
9
9
|
/**
|
|
10
10
|
* Create an Intel HEX artifact from an emitted address->byte map.
|
|
11
11
|
*
|
|
12
|
-
* PR1 implementation note:
|
|
13
12
|
* - Emits only type-00 data records and a type-01 EOF record.
|
|
14
13
|
* - Does not emit extended address records (assumes 16-bit address space).
|
|
15
14
|
*/
|
|
@@ -4,8 +4,6 @@ import type { RegisterCareMode } from './registerCare/types.js';
|
|
|
4
4
|
export type CaseStyleMode = 'off' | 'upper' | 'lower' | 'consistent';
|
|
5
5
|
/**
|
|
6
6
|
* Options that influence compilation behavior and which artifacts are produced.
|
|
7
|
-
*
|
|
8
|
-
* PR1 implementation note: most options are accepted but only a subset is currently honored.
|
|
9
7
|
*/
|
|
10
8
|
export interface CompilerOptions {
|
|
11
9
|
/**
|
|
@@ -15,9 +13,9 @@ export interface CompilerOptions {
|
|
|
15
13
|
* importing source file.
|
|
16
14
|
*/
|
|
17
15
|
includeDirs?: string[];
|
|
18
|
-
/** Primary output path
|
|
16
|
+
/** Primary output path supplied by wrappers that derive sibling artifacts. */
|
|
19
17
|
outputPath?: string;
|
|
20
|
-
/** Primary output type
|
|
18
|
+
/** Primary output type selected by wrappers such as the CLI. */
|
|
21
19
|
outputType?: 'hex' | 'bin';
|
|
22
20
|
/**
|
|
23
21
|
* Root used for source paths in debug maps.
|
|
@@ -42,7 +40,7 @@ export interface CompilerOptions {
|
|
|
42
40
|
emitD8m?: boolean;
|
|
43
41
|
/** Emit listing (`.lst`). */
|
|
44
42
|
emitListing?: boolean;
|
|
45
|
-
/** Emit ASM80-compatible lowered source (`.
|
|
43
|
+
/** Emit ASM80-compatible lowered source (`.z80`). */
|
|
46
44
|
emitAsm80?: boolean;
|
|
47
45
|
/** Optional case-style lint mode for asm keywords/register tokens. */
|
|
48
46
|
caseStyle?: CaseStyleMode;
|
|
@@ -0,0 +1,516 @@
|
|
|
1
|
+
import { expandCarrier } from '../registerCare/carriers.js';
|
|
2
|
+
const FLAG_WRITES = ['sign', 'zero', 'halfCarry', 'parity', 'carry'];
|
|
3
|
+
const INC_DEC_FLAG_WRITES = ['sign', 'zero', 'halfCarry', 'parity'];
|
|
4
|
+
const ROTATE_SHIFT_FLAG_WRITES = [
|
|
5
|
+
'sign',
|
|
6
|
+
'zero',
|
|
7
|
+
'halfCarry',
|
|
8
|
+
'parity',
|
|
9
|
+
'carry',
|
|
10
|
+
];
|
|
11
|
+
const BIT_FLAG_WRITES = ['sign', 'zero', 'halfCarry', 'parity'];
|
|
12
|
+
const STACK_POINTER_UNITS = ['SPH', 'SPL'];
|
|
13
|
+
const UNKNOWN_UNITS = [
|
|
14
|
+
'A',
|
|
15
|
+
'B',
|
|
16
|
+
'C',
|
|
17
|
+
'D',
|
|
18
|
+
'E',
|
|
19
|
+
'H',
|
|
20
|
+
'L',
|
|
21
|
+
'IXH',
|
|
22
|
+
'IXL',
|
|
23
|
+
'IYH',
|
|
24
|
+
'IYL',
|
|
25
|
+
'SPH',
|
|
26
|
+
'SPL',
|
|
27
|
+
'carry',
|
|
28
|
+
'zero',
|
|
29
|
+
'sign',
|
|
30
|
+
'parity',
|
|
31
|
+
'halfCarry',
|
|
32
|
+
];
|
|
33
|
+
function baseEffect() {
|
|
34
|
+
return {
|
|
35
|
+
reads: [],
|
|
36
|
+
writes: [],
|
|
37
|
+
stack: { kind: 'none' },
|
|
38
|
+
control: { kind: 'fallthrough' },
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
function unknownEffect() {
|
|
42
|
+
return {
|
|
43
|
+
reads: UNKNOWN_UNITS,
|
|
44
|
+
writes: UNKNOWN_UNITS,
|
|
45
|
+
stack: { kind: 'unknown' },
|
|
46
|
+
control: { kind: 'unknown' },
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
function appendUnique(out, units) {
|
|
50
|
+
for (const unit of units) {
|
|
51
|
+
if (!out.includes(unit))
|
|
52
|
+
out.push(unit);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
function concatUnique(...groups) {
|
|
56
|
+
const out = [];
|
|
57
|
+
for (const group of groups)
|
|
58
|
+
appendUnique(out, group);
|
|
59
|
+
return out;
|
|
60
|
+
}
|
|
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':
|
|
83
|
+
return ['zero'];
|
|
84
|
+
case 'C':
|
|
85
|
+
case 'NC':
|
|
86
|
+
return ['carry'];
|
|
87
|
+
case 'M':
|
|
88
|
+
case 'P':
|
|
89
|
+
return ['sign'];
|
|
90
|
+
case 'PE':
|
|
91
|
+
case 'PO':
|
|
92
|
+
return ['parity'];
|
|
93
|
+
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
|
+
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
|
+
}
|
|
119
|
+
}
|
|
120
|
+
function indexReads(index) {
|
|
121
|
+
switch (index.kind) {
|
|
122
|
+
case 'IndexImm':
|
|
123
|
+
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
|
+
default:
|
|
134
|
+
return undefined;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
function operandReads(op) {
|
|
138
|
+
if (!op)
|
|
139
|
+
return undefined;
|
|
140
|
+
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);
|
|
152
|
+
default:
|
|
153
|
+
return undefined;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
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
|
+
function callControl(target, conditional) {
|
|
172
|
+
return target === undefined
|
|
173
|
+
? { kind: 'call', conditional }
|
|
174
|
+
: { kind: 'call', target, conditional };
|
|
175
|
+
}
|
|
176
|
+
function rstControl(vector) {
|
|
177
|
+
return vector === undefined ? { kind: 'rst' } : { kind: 'rst', vector };
|
|
178
|
+
}
|
|
179
|
+
function jumpControl(target, conditional) {
|
|
180
|
+
return target === undefined
|
|
181
|
+
? { kind: 'jump', conditional }
|
|
182
|
+
: { kind: 'jump', target, conditional };
|
|
183
|
+
}
|
|
184
|
+
function isConditionalControl(operands) {
|
|
185
|
+
return operands.length > 1;
|
|
186
|
+
}
|
|
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)
|
|
197
|
+
return unknownEffect();
|
|
198
|
+
if (dst.kind === 'Reg') {
|
|
199
|
+
const dstWrites = expandCarrier(dst.name);
|
|
200
|
+
if (!dstWrites)
|
|
201
|
+
return unknownEffect();
|
|
202
|
+
effect.reads = srcReads;
|
|
203
|
+
effect.writes = dstWrites;
|
|
204
|
+
return effect;
|
|
205
|
+
}
|
|
206
|
+
if (dst.kind === 'Mem') {
|
|
207
|
+
const dstReads = operandReads(dst);
|
|
208
|
+
if (!dstReads)
|
|
209
|
+
return unknownEffect();
|
|
210
|
+
effect.reads = concatUnique(dstReads, srcReads);
|
|
211
|
+
return effect;
|
|
212
|
+
}
|
|
213
|
+
return unknownEffect();
|
|
214
|
+
}
|
|
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)
|
|
226
|
+
return unknownEffect();
|
|
227
|
+
return {
|
|
228
|
+
...baseEffect(),
|
|
229
|
+
reads,
|
|
230
|
+
writes: concatUnique(writes, flagWrites),
|
|
231
|
+
};
|
|
232
|
+
}
|
|
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)
|
|
253
|
+
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
|
+
}
|
|
261
|
+
}
|
|
262
|
+
else {
|
|
263
|
+
const aReads = expandCarrier('A');
|
|
264
|
+
if (!aReads)
|
|
265
|
+
return unknownEffect();
|
|
266
|
+
reads = xorSelfZero ? [] : concatUnique(aReads, firstReads);
|
|
267
|
+
if (inst.head !== 'cp')
|
|
268
|
+
writes = aReads;
|
|
269
|
+
}
|
|
270
|
+
const carryReads = inst.head === 'adc' || inst.head === 'sbc' ? ['carry'] : [];
|
|
271
|
+
return {
|
|
272
|
+
...baseEffect(),
|
|
273
|
+
reads: concatUnique(reads, carryReads),
|
|
274
|
+
writes: concatUnique(writes, FLAG_WRITES),
|
|
275
|
+
};
|
|
276
|
+
}
|
|
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();
|
|
283
|
+
return {
|
|
284
|
+
...baseEffect(),
|
|
285
|
+
reads: units,
|
|
286
|
+
writes: STACK_POINTER_UNITS,
|
|
287
|
+
stack: { kind: 'push', units },
|
|
288
|
+
};
|
|
289
|
+
}
|
|
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();
|
|
296
|
+
return {
|
|
297
|
+
...baseEffect(),
|
|
298
|
+
writes: concatUnique(units, STACK_POINTER_UNITS),
|
|
299
|
+
stack: { kind: 'pop', units },
|
|
300
|
+
};
|
|
301
|
+
}
|
|
302
|
+
function controlEffect(control, reads = []) {
|
|
303
|
+
return {
|
|
304
|
+
...baseEffect(),
|
|
305
|
+
reads,
|
|
306
|
+
control,
|
|
307
|
+
};
|
|
308
|
+
}
|
|
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)
|
|
322
|
+
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)
|
|
337
|
+
return unknownEffect();
|
|
338
|
+
return stackControlEffect({ kind: 'return' }, reads);
|
|
339
|
+
}
|
|
340
|
+
function djnzEffect(inst) {
|
|
341
|
+
return {
|
|
342
|
+
...baseEffect(),
|
|
343
|
+
reads: ['B'],
|
|
344
|
+
writes: ['B'],
|
|
345
|
+
control: jumpControl(targetName(inst.operands), true),
|
|
346
|
+
};
|
|
347
|
+
}
|
|
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'];
|
|
353
|
+
return {
|
|
354
|
+
...baseEffect(),
|
|
355
|
+
reads,
|
|
356
|
+
writes: ['A', 'carry', 'halfCarry'],
|
|
357
|
+
};
|
|
358
|
+
}
|
|
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();
|
|
368
|
+
return {
|
|
369
|
+
...baseEffect(),
|
|
370
|
+
reads,
|
|
371
|
+
writes: BIT_FLAG_WRITES,
|
|
372
|
+
};
|
|
373
|
+
}
|
|
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();
|
|
381
|
+
return {
|
|
382
|
+
...baseEffect(),
|
|
383
|
+
reads: concatUnique(portReads, valueReads),
|
|
384
|
+
};
|
|
385
|
+
}
|
|
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') {
|
|
397
|
+
return {
|
|
398
|
+
...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),
|
|
408
|
+
};
|
|
409
|
+
}
|
|
410
|
+
return unknownEffect();
|
|
411
|
+
}
|
|
412
|
+
function blockTransferEffect(inst) {
|
|
413
|
+
if (inst.operands.length !== 0)
|
|
414
|
+
return unknownEffect();
|
|
415
|
+
return {
|
|
416
|
+
...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),
|
|
439
|
+
};
|
|
440
|
+
}
|
|
441
|
+
export function getZ80InstructionEffect(inst) {
|
|
442
|
+
switch (inst.head.toLowerCase()) {
|
|
443
|
+
case 'nop':
|
|
444
|
+
case 'halt':
|
|
445
|
+
case 'di':
|
|
446
|
+
case 'ei':
|
|
447
|
+
return baseEffect();
|
|
448
|
+
case 'ld':
|
|
449
|
+
return ldEffect(inst);
|
|
450
|
+
case 'inc':
|
|
451
|
+
case 'dec':
|
|
452
|
+
return incDecEffect(inst);
|
|
453
|
+
case 'add':
|
|
454
|
+
case 'adc':
|
|
455
|
+
case 'sbc':
|
|
456
|
+
case 'sub':
|
|
457
|
+
case 'and':
|
|
458
|
+
case 'or':
|
|
459
|
+
case 'xor':
|
|
460
|
+
case 'cp':
|
|
461
|
+
return aluEffect(inst);
|
|
462
|
+
case 'push':
|
|
463
|
+
return pushEffect(inst);
|
|
464
|
+
case 'pop':
|
|
465
|
+
return popEffect(inst);
|
|
466
|
+
case 'call':
|
|
467
|
+
return callEffect(inst);
|
|
468
|
+
case 'rst':
|
|
469
|
+
return stackControlEffect(rstControl(immLiteral(inst.operands[0])));
|
|
470
|
+
case 'ret':
|
|
471
|
+
case 'retn':
|
|
472
|
+
case 'reti':
|
|
473
|
+
return retEffect(inst);
|
|
474
|
+
case 'jp':
|
|
475
|
+
case 'jr':
|
|
476
|
+
return jumpEffect(inst);
|
|
477
|
+
case 'djnz':
|
|
478
|
+
return djnzEffect(inst);
|
|
479
|
+
case 'rlc':
|
|
480
|
+
case 'rrc':
|
|
481
|
+
case 'rl':
|
|
482
|
+
case 'rr':
|
|
483
|
+
case 'sla':
|
|
484
|
+
case 'sra':
|
|
485
|
+
case 'srl':
|
|
486
|
+
return rotateShiftEffect(inst);
|
|
487
|
+
case 'rlca':
|
|
488
|
+
case 'rrca':
|
|
489
|
+
case 'rla':
|
|
490
|
+
case 'rra':
|
|
491
|
+
return accumulatorRotateEffect(inst.head.toLowerCase());
|
|
492
|
+
case 'bit':
|
|
493
|
+
return bitEffect(inst);
|
|
494
|
+
case 'scf':
|
|
495
|
+
return { ...baseEffect(), writes: ['carry', 'halfCarry'] };
|
|
496
|
+
case 'ccf':
|
|
497
|
+
return { ...baseEffect(), reads: ['carry'], writes: ['carry', 'halfCarry'] };
|
|
498
|
+
case 'cpl':
|
|
499
|
+
return { ...baseEffect(), reads: ['A'], writes: ['A', 'halfCarry'] };
|
|
500
|
+
case 'neg':
|
|
501
|
+
return { ...baseEffect(), reads: ['A'], writes: concatUnique(['A'], FLAG_WRITES) };
|
|
502
|
+
case 'out':
|
|
503
|
+
return outEffect(inst);
|
|
504
|
+
case 'in':
|
|
505
|
+
return inEffect(inst);
|
|
506
|
+
case 'ldi':
|
|
507
|
+
case 'ldir':
|
|
508
|
+
case 'ldd':
|
|
509
|
+
case 'lddr':
|
|
510
|
+
return blockTransferEffect(inst);
|
|
511
|
+
case 'ex':
|
|
512
|
+
return exEffect(inst);
|
|
513
|
+
default:
|
|
514
|
+
return unknownEffect();
|
|
515
|
+
}
|
|
516
|
+
}
|