@jhlagado/azm 0.2.1 → 0.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +16 -9
- package/dist/src/api-compile.d.ts +0 -2
- package/dist/src/api-compile.js +1 -8
- package/dist/src/assembly/address-planning.js +19 -1
- package/dist/src/cli/parse-args.d.ts +0 -1
- package/dist/src/cli/parse-args.js +0 -7
- package/dist/src/cli/write-artifacts.js +0 -11
- package/dist/src/core/compile.js +192 -9
- package/dist/src/expansion/op-expansion.js +1 -0
- package/dist/src/model/expression.d.ts +4 -0
- package/dist/src/model/source-item.d.ts +5 -0
- package/dist/src/outputs/index.js +0 -2
- package/dist/src/outputs/types.d.ts +3 -16
- package/dist/src/outputs/write-asm80.js +84 -0
- package/dist/src/semantics/expression-evaluation.d.ts +7 -3
- package/dist/src/semantics/expression-evaluation.js +57 -0
- package/dist/src/syntax/directive-aliases.js +9 -10
- package/dist/src/syntax/parse-expression.js +34 -9
- package/dist/src/syntax/parse-line.js +87 -44
- package/dist/src/tooling/case-style.js +3 -0
- package/docs/reference/cli.md +6 -4
- package/docs/reference/tooling-api.md +1 -4
- package/package.json +2 -6
- package/dist/legacy-root-azm/src/analysis.d.ts +0 -11
- package/dist/legacy-root-azm/src/analysis.js +0 -41
- package/dist/legacy-root-azm/src/compile.d.ts +0 -10
- package/dist/legacy-root-azm/src/compile.js +0 -186
- package/dist/legacy-root-azm/src/compileShared.d.ts +0 -3
- package/dist/legacy-root-azm/src/compileShared.js +0 -7
- package/dist/legacy-root-azm/src/diagnosticTypes.d.ts +0 -77
- package/dist/legacy-root-azm/src/diagnosticTypes.js +0 -53
- package/dist/legacy-root-azm/src/formats/index.d.ts +0 -7
- package/dist/legacy-root-azm/src/formats/index.js +0 -17
- package/dist/legacy-root-azm/src/formats/range.d.ts +0 -17
- package/dist/legacy-root-azm/src/formats/range.js +0 -45
- package/dist/legacy-root-azm/src/formats/types.d.ts +0 -283
- package/dist/legacy-root-azm/src/formats/types.js +0 -1
- package/dist/legacy-root-azm/src/formats/writeAsm80.d.ts +0 -6
- package/dist/legacy-root-azm/src/formats/writeAsm80.js +0 -86
- package/dist/legacy-root-azm/src/formats/writeBin.d.ts +0 -7
- package/dist/legacy-root-azm/src/formats/writeBin.js +0 -23
- package/dist/legacy-root-azm/src/formats/writeD8m.d.ts +0 -9
- package/dist/legacy-root-azm/src/formats/writeD8m.js +0 -245
- package/dist/legacy-root-azm/src/formats/writeHex.d.ts +0 -8
- package/dist/legacy-root-azm/src/formats/writeHex.js +0 -38
- package/dist/legacy-root-azm/src/formats/writeListing.d.ts +0 -8
- package/dist/legacy-root-azm/src/formats/writeListing.js +0 -83
- package/dist/legacy-root-azm/src/frontend/asm80/asmLine.d.ts +0 -39
- package/dist/legacy-root-azm/src/frontend/asm80/asmLine.js +0 -89
- package/dist/legacy-root-azm/src/frontend/asm80/parseAsmRawValues.d.ts +0 -4
- package/dist/legacy-root-azm/src/frontend/asm80/parseAsmRawValues.js +0 -94
- package/dist/legacy-root-azm/src/frontend/asm80/quoteScan.d.ts +0 -10
- package/dist/legacy-root-azm/src/frontend/asm80/quoteScan.js +0 -25
- package/dist/legacy-root-azm/src/frontend/ast.d.ts +0 -376
- package/dist/legacy-root-azm/src/frontend/ast.js +0 -1
- package/dist/legacy-root-azm/src/frontend/directiveAliases.d.ts +0 -14
- package/dist/legacy-root-azm/src/frontend/directiveAliases.js +0 -189
- package/dist/legacy-root-azm/src/frontend/grammarData.d.ts +0 -14
- package/dist/legacy-root-azm/src/frontend/grammarData.js +0 -65
- package/dist/legacy-root-azm/src/frontend/immExprUtils.d.ts +0 -2
- package/dist/legacy-root-azm/src/frontend/immExprUtils.js +0 -12
- package/dist/legacy-root-azm/src/frontend/parseAsmFlatDirectiveLine.d.ts +0 -17
- package/dist/legacy-root-azm/src/frontend/parseAsmFlatDirectiveLine.js +0 -187
- package/dist/legacy-root-azm/src/frontend/parseAsmInstruction.d.ts +0 -3
- package/dist/legacy-root-azm/src/frontend/parseAsmInstruction.js +0 -73
- package/dist/legacy-root-azm/src/frontend/parseAsmStatements.d.ts +0 -6
- package/dist/legacy-root-azm/src/frontend/parseAsmStatements.js +0 -16
- package/dist/legacy-root-azm/src/frontend/parseAsmStream.d.ts +0 -10
- package/dist/legacy-root-azm/src/frontend/parseAsmStream.js +0 -33
- package/dist/legacy-root-azm/src/frontend/parseAsmTopLevel.d.ts +0 -18
- package/dist/legacy-root-azm/src/frontend/parseAsmTopLevel.js +0 -34
- package/dist/legacy-root-azm/src/frontend/parseDiagnostics.d.ts +0 -9
- package/dist/legacy-root-azm/src/frontend/parseDiagnostics.js +0 -16
- package/dist/legacy-root-azm/src/frontend/parseEnum.d.ts +0 -12
- package/dist/legacy-root-azm/src/frontend/parseEnum.js +0 -70
- package/dist/legacy-root-azm/src/frontend/parseImm.d.ts +0 -10
- package/dist/legacy-root-azm/src/frontend/parseImm.js +0 -397
- package/dist/legacy-root-azm/src/frontend/parseLogicalLines.d.ts +0 -11
- package/dist/legacy-root-azm/src/frontend/parseLogicalLines.js +0 -94
- package/dist/legacy-root-azm/src/frontend/parseOp.d.ts +0 -25
- package/dist/legacy-root-azm/src/frontend/parseOp.js +0 -120
- package/dist/legacy-root-azm/src/frontend/parseOpHeader.d.ts +0 -20
- package/dist/legacy-root-azm/src/frontend/parseOpHeader.js +0 -32
- package/dist/legacy-root-azm/src/frontend/parseOperands.d.ts +0 -4
- package/dist/legacy-root-azm/src/frontend/parseOperands.js +0 -290
- package/dist/legacy-root-azm/src/frontend/parseParams.d.ts +0 -6
- package/dist/legacy-root-azm/src/frontend/parseParams.js +0 -62
- package/dist/legacy-root-azm/src/frontend/parseParserRecovery.d.ts +0 -12
- package/dist/legacy-root-azm/src/frontend/parseParserRecovery.js +0 -17
- package/dist/legacy-root-azm/src/frontend/parseParserShared.d.ts +0 -2
- package/dist/legacy-root-azm/src/frontend/parseParserShared.js +0 -8
- package/dist/legacy-root-azm/src/frontend/parseRawDataDirectiveStart.d.ts +0 -1
- package/dist/legacy-root-azm/src/frontend/parseRawDataDirectiveStart.js +0 -3
- package/dist/legacy-root-azm/src/frontend/parseRawDataDirectives.d.ts +0 -7
- package/dist/legacy-root-azm/src/frontend/parseRawDataDirectives.js +0 -142
- package/dist/legacy-root-azm/src/frontend/parseRecordFieldDecl.d.ts +0 -34
- package/dist/legacy-root-azm/src/frontend/parseRecordFieldDecl.js +0 -177
- package/dist/legacy-root-azm/src/frontend/parseSourceItemDispatch.d.ts +0 -46
- package/dist/legacy-root-azm/src/frontend/parseSourceItemDispatch.js +0 -53
- package/dist/legacy-root-azm/src/frontend/parseSourceItemTable.d.ts +0 -16
- package/dist/legacy-root-azm/src/frontend/parseSourceItemTable.js +0 -68
- package/dist/legacy-root-azm/src/frontend/parseTopLevelCommon.d.ts +0 -11
- package/dist/legacy-root-azm/src/frontend/parseTopLevelCommon.js +0 -50
- package/dist/legacy-root-azm/src/frontend/parseTypes.d.ts +0 -24
- package/dist/legacy-root-azm/src/frontend/parseTypes.js +0 -77
- package/dist/legacy-root-azm/src/frontend/parser.d.ts +0 -11
- package/dist/legacy-root-azm/src/frontend/parser.js +0 -88
- package/dist/legacy-root-azm/src/frontend/source.d.ts +0 -28
- package/dist/legacy-root-azm/src/frontend/source.js +0 -58
- package/dist/legacy-root-azm/src/frontend/sourceExtensions.d.ts +0 -2
- package/dist/legacy-root-azm/src/frontend/sourceExtensions.js +0 -6
- package/dist/legacy-root-azm/src/lintCaseStyle.d.ts +0 -4
- package/dist/legacy-root-azm/src/lintCaseStyle.js +0 -129
- package/dist/legacy-root-azm/src/lowering/asmDirectiveLowering.d.ts +0 -4
- package/dist/legacy-root-azm/src/lowering/asmDirectiveLowering.js +0 -229
- package/dist/legacy-root-azm/src/lowering/asmDirectiveTraversal.d.ts +0 -47
- package/dist/legacy-root-azm/src/lowering/asmDirectiveTraversal.js +0 -52
- package/dist/legacy-root-azm/src/lowering/asmEquResolution.d.ts +0 -8
- package/dist/legacy-root-azm/src/lowering/asmEquResolution.js +0 -69
- package/dist/legacy-root-azm/src/lowering/asmInstructionLdHelpers.d.ts +0 -15
- package/dist/legacy-root-azm/src/lowering/asmInstructionLdHelpers.js +0 -102
- package/dist/legacy-root-azm/src/lowering/asmInstructionLowering.d.ts +0 -5
- package/dist/legacy-root-azm/src/lowering/asmInstructionLowering.js +0 -54
- package/dist/legacy-root-azm/src/lowering/asmInstructionStream.d.ts +0 -46
- package/dist/legacy-root-azm/src/lowering/asmInstructionStream.js +0 -51
- package/dist/legacy-root-azm/src/lowering/asmLoweringBranchCall.d.ts +0 -43
- package/dist/legacy-root-azm/src/lowering/asmLoweringBranchCall.js +0 -254
- package/dist/legacy-root-azm/src/lowering/asmLoweringHost.d.ts +0 -23
- package/dist/legacy-root-azm/src/lowering/asmLoweringHost.js +0 -1
- package/dist/legacy-root-azm/src/lowering/asmLoweringLd.d.ts +0 -28
- package/dist/legacy-root-azm/src/lowering/asmLoweringLd.js +0 -144
- package/dist/legacy-root-azm/src/lowering/asmRangeLowering.d.ts +0 -17
- package/dist/legacy-root-azm/src/lowering/asmRangeLowering.js +0 -39
- package/dist/legacy-root-azm/src/lowering/asmRawDataLowering.d.ts +0 -16
- package/dist/legacy-root-azm/src/lowering/asmRawDataLowering.js +0 -209
- package/dist/legacy-root-azm/src/lowering/asmSourceEmitter.d.ts +0 -4
- package/dist/legacy-root-azm/src/lowering/asmSourceEmitter.js +0 -9
- package/dist/legacy-root-azm/src/lowering/asmSourceInstructionLowering.d.ts +0 -4
- package/dist/legacy-root-azm/src/lowering/asmSourceInstructionLowering.js +0 -14
- package/dist/legacy-root-azm/src/lowering/asmUtils.d.ts +0 -13
- package/dist/legacy-root-azm/src/lowering/asmUtils.js +0 -105
- package/dist/legacy-root-azm/src/lowering/assemblerFlowSetup.d.ts +0 -54
- package/dist/legacy-root-azm/src/lowering/assemblerFlowSetup.js +0 -128
- package/dist/legacy-root-azm/src/lowering/assemblerLoweringContext.d.ts +0 -151
- package/dist/legacy-root-azm/src/lowering/assemblerLoweringContext.js +0 -16
- package/dist/legacy-root-azm/src/lowering/assemblerLoweringContextSplit.d.ts +0 -7
- package/dist/legacy-root-azm/src/lowering/assemblerLoweringContextSplit.js +0 -75
- package/dist/legacy-root-azm/src/lowering/assemblerLoweringPhases.d.ts +0 -66
- package/dist/legacy-root-azm/src/lowering/assemblerLoweringPhases.js +0 -166
- package/dist/legacy-root-azm/src/lowering/bytePlacement.d.ts +0 -7
- package/dist/legacy-root-azm/src/lowering/bytePlacement.js +0 -37
- package/dist/legacy-root-azm/src/lowering/capabilities.d.ts +0 -67
- package/dist/legacy-root-azm/src/lowering/capabilities.js +0 -1
- package/dist/legacy-root-azm/src/lowering/eaResolution.d.ts +0 -58
- package/dist/legacy-root-azm/src/lowering/eaResolution.js +0 -159
- package/dist/legacy-root-azm/src/lowering/emissionCore.d.ts +0 -17
- package/dist/legacy-root-azm/src/lowering/emissionCore.js +0 -21
- package/dist/legacy-root-azm/src/lowering/emit.d.ts +0 -17
- package/dist/legacy-root-azm/src/lowering/emit.js +0 -46
- package/dist/legacy-root-azm/src/lowering/emitContextBuilder.d.ts +0 -63
- package/dist/legacy-root-azm/src/lowering/emitContextBuilder.js +0 -41
- package/dist/legacy-root-azm/src/lowering/emitFinalization.d.ts +0 -61
- package/dist/legacy-root-azm/src/lowering/emitFinalization.js +0 -66
- package/dist/legacy-root-azm/src/lowering/emitFinalizationSetup.d.ts +0 -19
- package/dist/legacy-root-azm/src/lowering/emitFinalizationSetup.js +0 -26
- package/dist/legacy-root-azm/src/lowering/emitPhase1BuildProgramLoweringContext.d.ts +0 -7
- package/dist/legacy-root-azm/src/lowering/emitPhase1BuildProgramLoweringContext.js +0 -119
- package/dist/legacy-root-azm/src/lowering/emitPhase1Helpers.d.ts +0 -4
- package/dist/legacy-root-azm/src/lowering/emitPhase1Helpers.js +0 -12
- package/dist/legacy-root-azm/src/lowering/emitPhase1Types.d.ts +0 -21
- package/dist/legacy-root-azm/src/lowering/emitPhase1Types.js +0 -1
- package/dist/legacy-root-azm/src/lowering/emitPhase1WirePipeline.d.ts +0 -70
- package/dist/legacy-root-azm/src/lowering/emitPhase1WirePipeline.js +0 -203
- package/dist/legacy-root-azm/src/lowering/emitPhase1Workspace.d.ts +0 -82
- package/dist/legacy-root-azm/src/lowering/emitPhase1Workspace.js +0 -55
- package/dist/legacy-root-azm/src/lowering/emitPipeline.d.ts +0 -121
- package/dist/legacy-root-azm/src/lowering/emitPipeline.js +0 -57
- package/dist/legacy-root-azm/src/lowering/emitProgramContext.d.ts +0 -39
- package/dist/legacy-root-azm/src/lowering/emitProgramContext.js +0 -29
- package/dist/legacy-root-azm/src/lowering/emitState.d.ts +0 -90
- package/dist/legacy-root-azm/src/lowering/emitState.js +0 -124
- package/dist/legacy-root-azm/src/lowering/fixupBaseResolution.d.ts +0 -7
- package/dist/legacy-root-azm/src/lowering/fixupBaseResolution.js +0 -23
- package/dist/legacy-root-azm/src/lowering/fixupEmission.d.ts +0 -64
- package/dist/legacy-root-azm/src/lowering/fixupEmission.js +0 -199
- package/dist/legacy-root-azm/src/lowering/immMath.d.ts +0 -2
- package/dist/legacy-root-azm/src/lowering/immMath.js +0 -34
- package/dist/legacy-root-azm/src/lowering/inputAssets.d.ts +0 -7
- package/dist/legacy-root-azm/src/lowering/inputAssets.js +0 -106
- package/dist/legacy-root-azm/src/lowering/ldEncoding.d.ts +0 -15
- package/dist/legacy-root-azm/src/lowering/ldEncoding.js +0 -12
- package/dist/legacy-root-azm/src/lowering/ldEncodingRegMemHelpers.d.ts +0 -5
- package/dist/legacy-root-azm/src/lowering/ldEncodingRegMemHelpers.js +0 -124
- package/dist/legacy-root-azm/src/lowering/ldFormSelection.d.ts +0 -26
- package/dist/legacy-root-azm/src/lowering/ldFormSelection.js +0 -92
- package/dist/legacy-root-azm/src/lowering/ldLowering.d.ts +0 -7
- package/dist/legacy-root-azm/src/lowering/ldLowering.js +0 -13
- package/dist/legacy-root-azm/src/lowering/loweredAsmByteEmission.d.ts +0 -23
- package/dist/legacy-root-azm/src/lowering/loweredAsmByteEmission.js +0 -185
- package/dist/legacy-root-azm/src/lowering/loweredAsmPlacement.d.ts +0 -13
- package/dist/legacy-root-azm/src/lowering/loweredAsmPlacement.js +0 -86
- package/dist/legacy-root-azm/src/lowering/loweredAsmStreamRecording.d.ts +0 -27
- package/dist/legacy-root-azm/src/lowering/loweredAsmStreamRecording.js +0 -215
- package/dist/legacy-root-azm/src/lowering/loweredAsmTypes.d.ts +0 -202
- package/dist/legacy-root-azm/src/lowering/loweredAsmTypes.js +0 -1
- package/dist/legacy-root-azm/src/lowering/loweredFormat.d.ts +0 -3
- package/dist/legacy-root-azm/src/lowering/loweredFormat.js +0 -26
- package/dist/legacy-root-azm/src/lowering/loweredItemSize.d.ts +0 -4
- package/dist/legacy-root-azm/src/lowering/loweredItemSize.js +0 -17
- package/dist/legacy-root-azm/src/lowering/loweringDiagnostics.d.ts +0 -9
- package/dist/legacy-root-azm/src/lowering/loweringDiagnostics.js +0 -55
- package/dist/legacy-root-azm/src/lowering/loweringTypes.d.ts +0 -27
- package/dist/legacy-root-azm/src/lowering/loweringTypes.js +0 -1
- package/dist/legacy-root-azm/src/lowering/opCandidateRegistry.d.ts +0 -9
- package/dist/legacy-root-azm/src/lowering/opCandidateRegistry.js +0 -9
- package/dist/legacy-root-azm/src/lowering/opExpansionExecution.d.ts +0 -15
- package/dist/legacy-root-azm/src/lowering/opExpansionExecution.js +0 -45
- package/dist/legacy-root-azm/src/lowering/opExpansionOrchestration.d.ts +0 -15
- package/dist/legacy-root-azm/src/lowering/opExpansionOrchestration.js +0 -88
- package/dist/legacy-root-azm/src/lowering/opExpansionStream.d.ts +0 -12
- package/dist/legacy-root-azm/src/lowering/opExpansionStream.js +0 -176
- package/dist/legacy-root-azm/src/lowering/opMatching.d.ts +0 -52
- package/dist/legacy-root-azm/src/lowering/opMatching.js +0 -355
- package/dist/legacy-root-azm/src/lowering/opSubstitution.d.ts +0 -13
- package/dist/legacy-root-azm/src/lowering/opSubstitution.js +0 -175
- package/dist/legacy-root-azm/src/lowering/prescanTypes.d.ts +0 -7
- package/dist/legacy-root-azm/src/lowering/prescanTypes.js +0 -1
- package/dist/legacy-root-azm/src/lowering/programLowering.d.ts +0 -144
- package/dist/legacy-root-azm/src/lowering/programLowering.js +0 -2
- package/dist/legacy-root-azm/src/lowering/programLoweringDeclarations.d.ts +0 -5
- package/dist/legacy-root-azm/src/lowering/programLoweringDeclarations.js +0 -5
- package/dist/legacy-root-azm/src/lowering/programLoweringFinalize.d.ts +0 -18
- package/dist/legacy-root-azm/src/lowering/programLoweringFinalize.js +0 -115
- package/dist/legacy-root-azm/src/lowering/programLoweringTraversal.d.ts +0 -2
- package/dist/legacy-root-azm/src/lowering/programLoweringTraversal.js +0 -93
- package/dist/legacy-root-azm/src/lowering/programPrescan.d.ts +0 -3
- package/dist/legacy-root-azm/src/lowering/programPrescan.js +0 -37
- package/dist/legacy-root-azm/src/lowering/traceFormat.d.ts +0 -13
- package/dist/legacy-root-azm/src/lowering/traceFormat.js +0 -211
- package/dist/legacy-root-azm/src/packageInfo.d.ts +0 -1
- package/dist/legacy-root-azm/src/packageInfo.js +0 -15
- package/dist/legacy-root-azm/src/pathCompare.d.ts +0 -3
- package/dist/legacy-root-azm/src/pathCompare.js +0 -26
- package/dist/legacy-root-azm/src/pipeline.d.ts +0 -91
- package/dist/legacy-root-azm/src/pipeline.js +0 -1
- package/dist/legacy-root-azm/src/registerCare/analyze.d.ts +0 -24
- package/dist/legacy-root-azm/src/registerCare/analyze.js +0 -327
- package/dist/legacy-root-azm/src/registerCare/annotate.d.ts +0 -11
- package/dist/legacy-root-azm/src/registerCare/annotate.js +0 -76
- package/dist/legacy-root-azm/src/registerCare/boundaryHints.d.ts +0 -2
- package/dist/legacy-root-azm/src/registerCare/boundaryHints.js +0 -10
- package/dist/legacy-root-azm/src/registerCare/carriers.d.ts +0 -4
- package/dist/legacy-root-azm/src/registerCare/carriers.js +0 -78
- package/dist/legacy-root-azm/src/registerCare/controlFlow.d.ts +0 -5
- package/dist/legacy-root-azm/src/registerCare/controlFlow.js +0 -35
- package/dist/legacy-root-azm/src/registerCare/fix.d.ts +0 -11
- package/dist/legacy-root-azm/src/registerCare/fix.js +0 -119
- package/dist/legacy-root-azm/src/registerCare/liveness.d.ts +0 -7
- package/dist/legacy-root-azm/src/registerCare/liveness.js +0 -227
- package/dist/legacy-root-azm/src/registerCare/profiles.d.ts +0 -11
- package/dist/legacy-root-azm/src/registerCare/profiles.js +0 -45
- package/dist/legacy-root-azm/src/registerCare/programModel.d.ts +0 -3
- package/dist/legacy-root-azm/src/registerCare/programModel.js +0 -181
- package/dist/legacy-root-azm/src/registerCare/report.d.ts +0 -5
- package/dist/legacy-root-azm/src/registerCare/report.js +0 -139
- package/dist/legacy-root-azm/src/registerCare/smartComments.d.ts +0 -5
- package/dist/legacy-root-azm/src/registerCare/smartComments.js +0 -247
- package/dist/legacy-root-azm/src/registerCare/sourceText.d.ts +0 -8
- package/dist/legacy-root-azm/src/registerCare/sourceText.js +0 -15
- package/dist/legacy-root-azm/src/registerCare/summary.d.ts +0 -3
- package/dist/legacy-root-azm/src/registerCare/summary.js +0 -492
- package/dist/legacy-root-azm/src/registerCare/types.d.ts +0 -154
- package/dist/legacy-root-azm/src/registerCare/types.js +0 -1
- package/dist/legacy-root-azm/src/semantics/declVisitor.d.ts +0 -5
- package/dist/legacy-root-azm/src/semantics/declVisitor.js +0 -11
- package/dist/legacy-root-azm/src/semantics/env.d.ts +0 -28
- package/dist/legacy-root-azm/src/semantics/env.js +0 -432
- package/dist/legacy-root-azm/src/semantics/layout.d.ts +0 -21
- package/dist/legacy-root-azm/src/semantics/layout.js +0 -226
- package/dist/legacy-root-azm/src/semantics/layoutCastFold.d.ts +0 -22
- package/dist/legacy-root-azm/src/semantics/layoutCastFold.js +0 -118
- package/dist/legacy-root-azm/src/semantics/semanticsDiagnostics.d.ts +0 -2
- package/dist/legacy-root-azm/src/semantics/semanticsDiagnostics.js +0 -4
- package/dist/legacy-root-azm/src/semantics/typeQueries.d.ts +0 -31
- package/dist/legacy-root-azm/src/semantics/typeQueries.js +0 -124
- package/dist/legacy-root-azm/src/sourceIncludeExpansion.d.ts +0 -17
- package/dist/legacy-root-azm/src/sourceIncludeExpansion.js +0 -124
- package/dist/legacy-root-azm/src/sourceIncludePaths.d.ts +0 -1
- package/dist/legacy-root-azm/src/sourceIncludePaths.js +0 -12
- package/dist/legacy-root-azm/src/sourceLoader.d.ts +0 -15
- package/dist/legacy-root-azm/src/sourceLoader.js +0 -118
- package/dist/legacy-root-azm/src/z80/effects.d.ts +0 -3
- package/dist/legacy-root-azm/src/z80/effects.js +0 -516
- package/dist/legacy-root-azm/src/z80/encode.d.ts +0 -10
- package/dist/legacy-root-azm/src/z80/encode.js +0 -412
- package/dist/legacy-root-azm/src/z80/encodeAlu.d.ts +0 -7
- package/dist/legacy-root-azm/src/z80/encodeAlu.js +0 -219
- package/dist/legacy-root-azm/src/z80/encodeBitOps.d.ts +0 -7
- package/dist/legacy-root-azm/src/z80/encodeBitOps.js +0 -123
- package/dist/legacy-root-azm/src/z80/encodeContext.d.ts +0 -29
- package/dist/legacy-root-azm/src/z80/encodeContext.js +0 -1
- package/dist/legacy-root-azm/src/z80/encodeControl.d.ts +0 -26
- package/dist/legacy-root-azm/src/z80/encodeControl.js +0 -180
- package/dist/legacy-root-azm/src/z80/encodeCoreOps.d.ts +0 -7
- package/dist/legacy-root-azm/src/z80/encodeCoreOps.js +0 -131
- package/dist/legacy-root-azm/src/z80/encodeIo.d.ts +0 -9
- package/dist/legacy-root-azm/src/z80/encodeIo.js +0 -128
- package/dist/legacy-root-azm/src/z80/encodeLd.d.ts +0 -13
- package/dist/legacy-root-azm/src/z80/encodeLd.js +0 -273
- package/dist/legacy-root-azm/src/z80/encoderRegistry.d.ts +0 -13
- package/dist/legacy-root-azm/src/z80/encoderRegistry.js +0 -169
- package/dist/src/outputs/write-listing.d.ts +0 -2
- package/dist/src/outputs/write-listing.js +0 -79
|
@@ -1,412 +0,0 @@
|
|
|
1
|
-
import { flattenEaDottedName } from '../lowering/asmUtils.js';
|
|
2
|
-
import { diagEncodeAt } from '../lowering/loweringDiagnostics.js';
|
|
3
|
-
import { evalImmExpr } from '../semantics/env.js';
|
|
4
|
-
import { getEncoderRegistryEntry } from './encoderRegistry.js';
|
|
5
|
-
import { encodeAluInstruction } from './encodeAlu.js';
|
|
6
|
-
import { encodeBitOpsInstruction } from './encodeBitOps.js';
|
|
7
|
-
import { encodeControlInstruction } from './encodeControl.js';
|
|
8
|
-
import { encodeCoreOpsInstruction } from './encodeCoreOps.js';
|
|
9
|
-
import { encodeIoInstruction } from './encodeIo.js';
|
|
10
|
-
import { encodeLdInstruction } from './encodeLd.js';
|
|
11
|
-
/** Pass-through to {@link diagEncodeAt} for encoder submodules that take an instruction node. */
|
|
12
|
-
function diag(diagnostics, node, message) {
|
|
13
|
-
diagEncodeAt(diagnostics, node.span, message);
|
|
14
|
-
}
|
|
15
|
-
function immValue(op, env) {
|
|
16
|
-
if (op.kind === 'Imm')
|
|
17
|
-
return evalImmExpr(op.expr, env);
|
|
18
|
-
if (op.kind !== 'Ea')
|
|
19
|
-
return undefined;
|
|
20
|
-
const dotted = flattenEaDottedName(op.expr);
|
|
21
|
-
if (!dotted || !env.enums.has(dotted))
|
|
22
|
-
return undefined;
|
|
23
|
-
return evalImmExpr({ kind: 'ImmName', span: op.span, name: dotted }, env);
|
|
24
|
-
}
|
|
25
|
-
function portImmValue(op, env) {
|
|
26
|
-
if (op.kind !== 'PortImm8')
|
|
27
|
-
return undefined;
|
|
28
|
-
return evalImmExpr(op.expr, env);
|
|
29
|
-
}
|
|
30
|
-
function fitsImm8(value) {
|
|
31
|
-
return value >= -0x80 && value <= 0xff;
|
|
32
|
-
}
|
|
33
|
-
function fitsImm16(value) {
|
|
34
|
-
return value >= -0x8000 && value <= 0xffff;
|
|
35
|
-
}
|
|
36
|
-
function regName(op) {
|
|
37
|
-
return op.kind === 'Reg' ? op.name.toUpperCase() : undefined;
|
|
38
|
-
}
|
|
39
|
-
function registerTokenName(op) {
|
|
40
|
-
const name = op.kind === 'Reg'
|
|
41
|
-
? op.name.toUpperCase()
|
|
42
|
-
: op.kind === 'Imm' && op.expr.kind === 'ImmName'
|
|
43
|
-
? op.expr.name.toUpperCase()
|
|
44
|
-
: undefined;
|
|
45
|
-
if (!name)
|
|
46
|
-
return undefined;
|
|
47
|
-
switch (name) {
|
|
48
|
-
case 'A':
|
|
49
|
-
case 'B':
|
|
50
|
-
case 'C':
|
|
51
|
-
case 'D':
|
|
52
|
-
case 'E':
|
|
53
|
-
case 'H':
|
|
54
|
-
case 'L':
|
|
55
|
-
case 'BC':
|
|
56
|
-
case 'DE':
|
|
57
|
-
case 'HL':
|
|
58
|
-
case 'SP':
|
|
59
|
-
case 'AF':
|
|
60
|
-
case 'IX':
|
|
61
|
-
case 'IY':
|
|
62
|
-
case 'IXH':
|
|
63
|
-
case 'IXL':
|
|
64
|
-
case 'IYH':
|
|
65
|
-
case 'IYL':
|
|
66
|
-
return name;
|
|
67
|
-
default:
|
|
68
|
-
return undefined;
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
function reg8Code(name) {
|
|
72
|
-
switch (name.toUpperCase()) {
|
|
73
|
-
case 'B':
|
|
74
|
-
return 0;
|
|
75
|
-
case 'C':
|
|
76
|
-
return 1;
|
|
77
|
-
case 'D':
|
|
78
|
-
return 2;
|
|
79
|
-
case 'E':
|
|
80
|
-
return 3;
|
|
81
|
-
case 'H':
|
|
82
|
-
return 4;
|
|
83
|
-
case 'L':
|
|
84
|
-
return 5;
|
|
85
|
-
case 'A':
|
|
86
|
-
return 7;
|
|
87
|
-
default:
|
|
88
|
-
return undefined;
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
function isPlainHLReg8(name) {
|
|
92
|
-
return name === 'H' || name === 'L';
|
|
93
|
-
}
|
|
94
|
-
function indexedReg8(op) {
|
|
95
|
-
const n = regName(op);
|
|
96
|
-
switch (n) {
|
|
97
|
-
case 'IXH':
|
|
98
|
-
return { prefix: 0xdd, code: 4, display: 'IXH' };
|
|
99
|
-
case 'IXL':
|
|
100
|
-
return { prefix: 0xdd, code: 5, display: 'IXL' };
|
|
101
|
-
case 'IYH':
|
|
102
|
-
return { prefix: 0xfd, code: 4, display: 'IYH' };
|
|
103
|
-
case 'IYL':
|
|
104
|
-
return { prefix: 0xfd, code: 5, display: 'IYL' };
|
|
105
|
-
default:
|
|
106
|
-
return undefined;
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
function isMemHL(op) {
|
|
110
|
-
return op.kind === 'Mem' && op.expr.kind === 'EaName' && op.expr.name.toUpperCase() === 'HL';
|
|
111
|
-
}
|
|
112
|
-
function isMemRegName(op, reg) {
|
|
113
|
-
return op.kind === 'Mem' && op.expr.kind === 'EaName' && op.expr.name.toUpperCase() === reg;
|
|
114
|
-
}
|
|
115
|
-
function isReg16TransferName(name) {
|
|
116
|
-
return (name === 'BC' ||
|
|
117
|
-
name === 'DE' ||
|
|
118
|
-
name === 'HL' ||
|
|
119
|
-
name === 'SP' ||
|
|
120
|
-
name === 'AF' ||
|
|
121
|
-
name === 'IX' ||
|
|
122
|
-
name === 'IY');
|
|
123
|
-
}
|
|
124
|
-
function memIndexed(op, env, _diagnostics) {
|
|
125
|
-
if (op.kind !== 'Mem')
|
|
126
|
-
return undefined;
|
|
127
|
-
const ea = op.expr;
|
|
128
|
-
const encodeBaseDisp = (baseExpr, dispExpr, negate = false) => {
|
|
129
|
-
if (baseExpr.kind !== 'EaName')
|
|
130
|
-
return undefined;
|
|
131
|
-
const base = baseExpr.name.toUpperCase();
|
|
132
|
-
if (base !== 'IX' && base !== 'IY')
|
|
133
|
-
return undefined;
|
|
134
|
-
const rawDisp = evalImmExpr(dispExpr, env);
|
|
135
|
-
if (rawDisp === undefined)
|
|
136
|
-
return undefined;
|
|
137
|
-
const prefix = base === 'IX' ? 0xdd : 0xfd;
|
|
138
|
-
return { prefix, disp: negate ? -rawDisp : rawDisp };
|
|
139
|
-
};
|
|
140
|
-
if (ea.kind === 'EaIndex' && ea.index.kind === 'IndexImm') {
|
|
141
|
-
return encodeBaseDisp(ea.base, ea.index.value);
|
|
142
|
-
}
|
|
143
|
-
if (ea.kind === 'EaName') {
|
|
144
|
-
const base = ea.name.toUpperCase();
|
|
145
|
-
if (base === 'IX')
|
|
146
|
-
return { prefix: 0xdd, disp: 0 };
|
|
147
|
-
if (base === 'IY')
|
|
148
|
-
return { prefix: 0xfd, disp: 0 };
|
|
149
|
-
}
|
|
150
|
-
if (ea.kind === 'EaAdd') {
|
|
151
|
-
return encodeBaseDisp(ea.base, ea.offset);
|
|
152
|
-
}
|
|
153
|
-
if (ea.kind === 'EaSub') {
|
|
154
|
-
return encodeBaseDisp(ea.base, ea.offset, true);
|
|
155
|
-
}
|
|
156
|
-
return undefined;
|
|
157
|
-
}
|
|
158
|
-
function memAbs16(op, env) {
|
|
159
|
-
if (op.kind !== 'Mem')
|
|
160
|
-
return undefined;
|
|
161
|
-
const evalEaAbs16 = (ea) => {
|
|
162
|
-
switch (ea.kind) {
|
|
163
|
-
case 'EaName':
|
|
164
|
-
return evalImmExpr({
|
|
165
|
-
kind: 'ImmName',
|
|
166
|
-
span: ea.span,
|
|
167
|
-
name: ea.name,
|
|
168
|
-
}, env);
|
|
169
|
-
case 'EaImm':
|
|
170
|
-
return evalImmExpr(ea.expr, env);
|
|
171
|
-
case 'EaAdd': {
|
|
172
|
-
const base = evalEaAbs16(ea.base);
|
|
173
|
-
const delta = evalImmExpr(ea.offset, env);
|
|
174
|
-
if (base === undefined || delta === undefined)
|
|
175
|
-
return undefined;
|
|
176
|
-
return base + delta;
|
|
177
|
-
}
|
|
178
|
-
case 'EaSub': {
|
|
179
|
-
const base = evalEaAbs16(ea.base);
|
|
180
|
-
const delta = evalImmExpr(ea.offset, env);
|
|
181
|
-
if (base === undefined || delta === undefined)
|
|
182
|
-
return undefined;
|
|
183
|
-
return base - delta;
|
|
184
|
-
}
|
|
185
|
-
default:
|
|
186
|
-
return undefined;
|
|
187
|
-
}
|
|
188
|
-
};
|
|
189
|
-
return evalEaAbs16(op.expr);
|
|
190
|
-
}
|
|
191
|
-
function conditionName(op) {
|
|
192
|
-
if (op.kind === 'Reg')
|
|
193
|
-
return op.name.toUpperCase();
|
|
194
|
-
if (op.kind === 'Imm' && op.expr.kind === 'ImmName')
|
|
195
|
-
return op.expr.name.toUpperCase();
|
|
196
|
-
return undefined;
|
|
197
|
-
}
|
|
198
|
-
function symbolicImmBaseName(op, env) {
|
|
199
|
-
if (op.kind !== 'Imm')
|
|
200
|
-
return undefined;
|
|
201
|
-
const expr = op.expr;
|
|
202
|
-
if (expr.kind === 'ImmName')
|
|
203
|
-
return expr.name.toUpperCase();
|
|
204
|
-
if (expr.kind !== 'ImmBinary')
|
|
205
|
-
return undefined;
|
|
206
|
-
if (expr.op !== '+' && expr.op !== '-')
|
|
207
|
-
return undefined;
|
|
208
|
-
const leftName = expr.left.kind === 'ImmName' ? expr.left.name.toUpperCase() : undefined;
|
|
209
|
-
const rightName = expr.right.kind === 'ImmName' ? expr.right.name.toUpperCase() : undefined;
|
|
210
|
-
if (leftName) {
|
|
211
|
-
const right = evalImmExpr(expr.right, env);
|
|
212
|
-
if (right !== undefined)
|
|
213
|
-
return leftName;
|
|
214
|
-
}
|
|
215
|
-
if (expr.op === '+' && rightName) {
|
|
216
|
-
const left = evalImmExpr(expr.left, env);
|
|
217
|
-
if (left !== undefined)
|
|
218
|
-
return rightName;
|
|
219
|
-
}
|
|
220
|
-
return undefined;
|
|
221
|
-
}
|
|
222
|
-
function jpConditionOpcode(name) {
|
|
223
|
-
switch (name) {
|
|
224
|
-
case 'NZ':
|
|
225
|
-
return 0xc2;
|
|
226
|
-
case 'Z':
|
|
227
|
-
return 0xca;
|
|
228
|
-
case 'NC':
|
|
229
|
-
return 0xd2;
|
|
230
|
-
case 'C':
|
|
231
|
-
return 0xda;
|
|
232
|
-
case 'PO':
|
|
233
|
-
return 0xe2;
|
|
234
|
-
case 'PE':
|
|
235
|
-
return 0xea;
|
|
236
|
-
case 'P':
|
|
237
|
-
return 0xf2;
|
|
238
|
-
case 'M':
|
|
239
|
-
return 0xfa;
|
|
240
|
-
default:
|
|
241
|
-
return undefined;
|
|
242
|
-
}
|
|
243
|
-
}
|
|
244
|
-
function jrConditionOpcode(name) {
|
|
245
|
-
switch (name) {
|
|
246
|
-
case 'NZ':
|
|
247
|
-
return 0x20;
|
|
248
|
-
case 'Z':
|
|
249
|
-
return 0x28;
|
|
250
|
-
case 'NC':
|
|
251
|
-
return 0x30;
|
|
252
|
-
case 'C':
|
|
253
|
-
return 0x38;
|
|
254
|
-
default:
|
|
255
|
-
return undefined;
|
|
256
|
-
}
|
|
257
|
-
}
|
|
258
|
-
function callConditionOpcode(name) {
|
|
259
|
-
switch (name) {
|
|
260
|
-
case 'NZ':
|
|
261
|
-
return 0xc4;
|
|
262
|
-
case 'Z':
|
|
263
|
-
return 0xcc;
|
|
264
|
-
case 'NC':
|
|
265
|
-
return 0xd4;
|
|
266
|
-
case 'C':
|
|
267
|
-
return 0xdc;
|
|
268
|
-
case 'PO':
|
|
269
|
-
return 0xe4;
|
|
270
|
-
case 'PE':
|
|
271
|
-
return 0xec;
|
|
272
|
-
case 'P':
|
|
273
|
-
return 0xf4;
|
|
274
|
-
case 'M':
|
|
275
|
-
return 0xfc;
|
|
276
|
-
default:
|
|
277
|
-
return undefined;
|
|
278
|
-
}
|
|
279
|
-
}
|
|
280
|
-
function retConditionOpcode(name) {
|
|
281
|
-
switch (name) {
|
|
282
|
-
case 'NZ':
|
|
283
|
-
return 0xc0;
|
|
284
|
-
case 'Z':
|
|
285
|
-
return 0xc8;
|
|
286
|
-
case 'NC':
|
|
287
|
-
return 0xd0;
|
|
288
|
-
case 'C':
|
|
289
|
-
return 0xd8;
|
|
290
|
-
case 'PO':
|
|
291
|
-
return 0xe0;
|
|
292
|
-
case 'PE':
|
|
293
|
-
return 0xe8;
|
|
294
|
-
case 'P':
|
|
295
|
-
return 0xf0;
|
|
296
|
-
case 'M':
|
|
297
|
-
return 0xf8;
|
|
298
|
-
default:
|
|
299
|
-
return undefined;
|
|
300
|
-
}
|
|
301
|
-
}
|
|
302
|
-
function encodeFamilyInstruction(family, node, env, diagnostics) {
|
|
303
|
-
switch (family) {
|
|
304
|
-
case 'control':
|
|
305
|
-
return encodeControlInstruction(node, env, diagnostics, {
|
|
306
|
-
diag,
|
|
307
|
-
immValue,
|
|
308
|
-
registerTokenName,
|
|
309
|
-
conditionName,
|
|
310
|
-
symbolicImmBaseName,
|
|
311
|
-
fitsImm16,
|
|
312
|
-
isMemRegName,
|
|
313
|
-
retConditionOpcode,
|
|
314
|
-
callConditionOpcode,
|
|
315
|
-
jpConditionOpcode,
|
|
316
|
-
jrConditionOpcode,
|
|
317
|
-
});
|
|
318
|
-
case 'alu':
|
|
319
|
-
return encodeAluInstruction(node, env, diagnostics, {
|
|
320
|
-
diag,
|
|
321
|
-
regName,
|
|
322
|
-
immValue,
|
|
323
|
-
indexedReg8,
|
|
324
|
-
reg8Code,
|
|
325
|
-
fitsImm8,
|
|
326
|
-
isMemHL,
|
|
327
|
-
memIndexed: (op, env) => memIndexed(op, env, diagnostics),
|
|
328
|
-
});
|
|
329
|
-
case 'io':
|
|
330
|
-
return encodeIoInstruction(node, env, diagnostics, {
|
|
331
|
-
diag,
|
|
332
|
-
regName,
|
|
333
|
-
immValue,
|
|
334
|
-
portImmValue,
|
|
335
|
-
indexedReg8,
|
|
336
|
-
reg8Code,
|
|
337
|
-
fitsImm8,
|
|
338
|
-
});
|
|
339
|
-
case 'ld':
|
|
340
|
-
return encodeLdInstruction(node, env, diagnostics, {
|
|
341
|
-
diag,
|
|
342
|
-
regName,
|
|
343
|
-
immValue,
|
|
344
|
-
indexedReg8,
|
|
345
|
-
reg8Code,
|
|
346
|
-
fitsImm8,
|
|
347
|
-
fitsImm16,
|
|
348
|
-
memAbs16,
|
|
349
|
-
memIndexed: (op, env) => memIndexed(op, env, diagnostics),
|
|
350
|
-
isMemHL,
|
|
351
|
-
isMemRegName,
|
|
352
|
-
isReg16TransferName,
|
|
353
|
-
isPlainHLReg8,
|
|
354
|
-
});
|
|
355
|
-
case 'core':
|
|
356
|
-
return encodeCoreOpsInstruction(node, env, diagnostics, {
|
|
357
|
-
diag,
|
|
358
|
-
regName,
|
|
359
|
-
indexedReg8,
|
|
360
|
-
reg8Code,
|
|
361
|
-
isMemHL,
|
|
362
|
-
memIndexed: (op, env) => memIndexed(op, env, diagnostics),
|
|
363
|
-
});
|
|
364
|
-
case 'bit':
|
|
365
|
-
return encodeBitOpsInstruction(node, env, diagnostics, {
|
|
366
|
-
diag,
|
|
367
|
-
regName,
|
|
368
|
-
immValue,
|
|
369
|
-
indexedReg8,
|
|
370
|
-
reg8Code,
|
|
371
|
-
isMemHL,
|
|
372
|
-
memIndexed: (op, env) => memIndexed(op, env, diagnostics),
|
|
373
|
-
});
|
|
374
|
-
}
|
|
375
|
-
}
|
|
376
|
-
/**
|
|
377
|
-
* Encode a single `asm` instruction node into Z80 machine-code bytes.
|
|
378
|
-
*
|
|
379
|
-
* - Immediate operands may be `imm` expressions (const/enum names and operators), evaluated via the env.
|
|
380
|
-
* - Unsupported forms append an error diagnostic and return `undefined`.
|
|
381
|
-
*/
|
|
382
|
-
export function encodeInstruction(node, env, diagnostics) {
|
|
383
|
-
const diagnosticsBefore = diagnostics.length;
|
|
384
|
-
const head = node.head.toLowerCase();
|
|
385
|
-
const entry = getEncoderRegistryEntry(head);
|
|
386
|
-
if (!entry) {
|
|
387
|
-
diagEncodeAt(diagnostics, node.span, `Unsupported instruction: ${node.head}`);
|
|
388
|
-
return undefined;
|
|
389
|
-
}
|
|
390
|
-
if (entry.kind === 'zero') {
|
|
391
|
-
if (node.operands.length === 0)
|
|
392
|
-
return entry.bytes;
|
|
393
|
-
diagEncodeAt(diagnostics, node.span, `${head} expects no operands`);
|
|
394
|
-
return undefined;
|
|
395
|
-
}
|
|
396
|
-
const encoded = encodeFamilyInstruction(entry.family, node, env, diagnostics);
|
|
397
|
-
if (encoded)
|
|
398
|
-
return encoded;
|
|
399
|
-
if (entry.fallback === 'none')
|
|
400
|
-
return undefined;
|
|
401
|
-
if (diagnostics.length > diagnosticsBefore)
|
|
402
|
-
return undefined;
|
|
403
|
-
const arityMessage = entry.arityDiagnostic(head, node.operands.length);
|
|
404
|
-
if (entry.fallback === 'arity-short-circuit' && arityMessage === undefined)
|
|
405
|
-
return undefined;
|
|
406
|
-
if (arityMessage !== undefined) {
|
|
407
|
-
diagEncodeAt(diagnostics, node.span, arityMessage);
|
|
408
|
-
return undefined;
|
|
409
|
-
}
|
|
410
|
-
diagEncodeAt(diagnostics, node.span, `${head} has unsupported operand form`);
|
|
411
|
-
return undefined;
|
|
412
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
import type { Diagnostic } from '../diagnosticTypes.js';
|
|
2
|
-
import type { AsmInstructionNode } from '../frontend/ast.js';
|
|
3
|
-
import type { CompileEnv } from '../semantics/env.js';
|
|
4
|
-
import type { EncoderImmContext, EncoderMemContext, EncoderRegisterContext } from './encodeContext.js';
|
|
5
|
-
type AluEncodeContext = EncoderRegisterContext & EncoderImmContext & EncoderMemContext;
|
|
6
|
-
export declare function encodeAluInstruction(node: AsmInstructionNode, env: CompileEnv, diagnostics: Diagnostic[], ctx: AluEncodeContext): Uint8Array | undefined;
|
|
7
|
-
export {};
|
|
@@ -1,219 +0,0 @@
|
|
|
1
|
-
function encodeAluAOrImm8OrMemHL(node, env, diagnostics, ctx, rBase, immOpcode, memOpcode, mnemonic, allowExplicitA = false) {
|
|
2
|
-
const ops = node.operands;
|
|
3
|
-
let src;
|
|
4
|
-
if (ops.length === 1)
|
|
5
|
-
src = ops[0];
|
|
6
|
-
else if (ops.length === 2) {
|
|
7
|
-
if (allowExplicitA) {
|
|
8
|
-
if (ctx.regName(ops[0]) === 'A')
|
|
9
|
-
src = ops[1];
|
|
10
|
-
else {
|
|
11
|
-
ctx.diag(diagnostics, node, `${mnemonic} two-operand form requires destination A`);
|
|
12
|
-
return undefined;
|
|
13
|
-
}
|
|
14
|
-
}
|
|
15
|
-
}
|
|
16
|
-
if (!src)
|
|
17
|
-
return undefined;
|
|
18
|
-
const reg = ctx.regName(src);
|
|
19
|
-
const indexed = ctx.indexedReg8(src);
|
|
20
|
-
if (indexed)
|
|
21
|
-
return Uint8Array.of(indexed.prefix, rBase + indexed.code);
|
|
22
|
-
if (reg) {
|
|
23
|
-
const code = ctx.reg8Code(reg);
|
|
24
|
-
if (code === undefined) {
|
|
25
|
-
ctx.diag(diagnostics, node, `${mnemonic} expects reg8/imm8/(hl)`);
|
|
26
|
-
return undefined;
|
|
27
|
-
}
|
|
28
|
-
return Uint8Array.of(rBase + code);
|
|
29
|
-
}
|
|
30
|
-
if (ctx.isMemHL(src))
|
|
31
|
-
return Uint8Array.of(memOpcode);
|
|
32
|
-
const idx = ctx.memIndexed(src, env);
|
|
33
|
-
if (idx) {
|
|
34
|
-
const disp = idx.disp;
|
|
35
|
-
if (disp < -128 || disp > 127) {
|
|
36
|
-
ctx.diag(diagnostics, node, `${mnemonic} (ix/iy+disp) expects disp8`);
|
|
37
|
-
return undefined;
|
|
38
|
-
}
|
|
39
|
-
return Uint8Array.of(idx.prefix, memOpcode, disp & 0xff);
|
|
40
|
-
}
|
|
41
|
-
const n = ctx.immValue(src, env);
|
|
42
|
-
if (n === undefined || !ctx.fitsImm8(n)) {
|
|
43
|
-
ctx.diag(diagnostics, node, `${mnemonic} expects imm8`);
|
|
44
|
-
return undefined;
|
|
45
|
-
}
|
|
46
|
-
return Uint8Array.of(immOpcode, n & 0xff);
|
|
47
|
-
}
|
|
48
|
-
function encodeHlReg16Alu(node, diagnostics, ctx, src, mnemonic, opcodes) {
|
|
49
|
-
const opcode = src ? opcodes[src] : undefined;
|
|
50
|
-
if (opcode === undefined) {
|
|
51
|
-
ctx.diag(diagnostics, node, `${mnemonic} HL, rr expects BC/DE/HL/SP`);
|
|
52
|
-
return undefined;
|
|
53
|
-
}
|
|
54
|
-
return Uint8Array.of(0xed, opcode);
|
|
55
|
-
}
|
|
56
|
-
export function encodeAluInstruction(node, env, diagnostics, ctx) {
|
|
57
|
-
const head = node.head.toLowerCase();
|
|
58
|
-
const ops = node.operands;
|
|
59
|
-
if (head === 'add' && ops.length === 2) {
|
|
60
|
-
const dst = ctx.regName(ops[0]);
|
|
61
|
-
const src = ctx.regName(ops[1]);
|
|
62
|
-
if (dst === 'A') {
|
|
63
|
-
const indexedSrc = ctx.indexedReg8(ops[1]);
|
|
64
|
-
if (indexedSrc)
|
|
65
|
-
return Uint8Array.of(indexedSrc.prefix, 0x80 + indexedSrc.code);
|
|
66
|
-
if (src) {
|
|
67
|
-
const s = ctx.reg8Code(src);
|
|
68
|
-
if (s !== undefined)
|
|
69
|
-
return Uint8Array.of(0x80 + s);
|
|
70
|
-
}
|
|
71
|
-
if (ctx.isMemHL(ops[1]))
|
|
72
|
-
return Uint8Array.of(0x86);
|
|
73
|
-
const idx = ctx.memIndexed(ops[1], env);
|
|
74
|
-
if (idx) {
|
|
75
|
-
const disp = idx.disp;
|
|
76
|
-
if (disp < -128 || disp > 127) {
|
|
77
|
-
ctx.diag(diagnostics, node, `add A, (ix/iy+disp) expects disp8`);
|
|
78
|
-
return undefined;
|
|
79
|
-
}
|
|
80
|
-
return Uint8Array.of(idx.prefix, 0x86, disp & 0xff);
|
|
81
|
-
}
|
|
82
|
-
const n = ctx.immValue(ops[1], env);
|
|
83
|
-
if (n !== undefined) {
|
|
84
|
-
if (!ctx.fitsImm8(n)) {
|
|
85
|
-
ctx.diag(diagnostics, node, `add A, n expects imm8`);
|
|
86
|
-
return undefined;
|
|
87
|
-
}
|
|
88
|
-
return Uint8Array.of(0xc6, n & 0xff);
|
|
89
|
-
}
|
|
90
|
-
ctx.diag(diagnostics, node, `add A, src expects reg8/imm8/(hl)/(ix/iy+disp)`);
|
|
91
|
-
return undefined;
|
|
92
|
-
}
|
|
93
|
-
if (dst === 'HL' && src) {
|
|
94
|
-
switch (src) {
|
|
95
|
-
case 'BC':
|
|
96
|
-
return Uint8Array.of(0x09);
|
|
97
|
-
case 'DE':
|
|
98
|
-
return Uint8Array.of(0x19);
|
|
99
|
-
case 'HL':
|
|
100
|
-
return Uint8Array.of(0x29);
|
|
101
|
-
case 'SP':
|
|
102
|
-
return Uint8Array.of(0x39);
|
|
103
|
-
}
|
|
104
|
-
ctx.diag(diagnostics, node, `add HL, rr expects BC/DE/HL/SP`);
|
|
105
|
-
return undefined;
|
|
106
|
-
}
|
|
107
|
-
if (dst === 'HL') {
|
|
108
|
-
ctx.diag(diagnostics, node, `add HL, rr expects BC/DE/HL/SP`);
|
|
109
|
-
return undefined;
|
|
110
|
-
}
|
|
111
|
-
if ((dst === 'IX' || dst === 'IY') && src) {
|
|
112
|
-
const prefix = dst === 'IX' ? 0xdd : 0xfd;
|
|
113
|
-
switch (src) {
|
|
114
|
-
case 'BC':
|
|
115
|
-
return Uint8Array.of(prefix, 0x09);
|
|
116
|
-
case 'DE':
|
|
117
|
-
return Uint8Array.of(prefix, 0x19);
|
|
118
|
-
case 'SP':
|
|
119
|
-
return Uint8Array.of(prefix, 0x39);
|
|
120
|
-
case 'IX':
|
|
121
|
-
if (dst === 'IX')
|
|
122
|
-
return Uint8Array.of(0xdd, 0x29);
|
|
123
|
-
break;
|
|
124
|
-
case 'IY':
|
|
125
|
-
if (dst === 'IY')
|
|
126
|
-
return Uint8Array.of(0xfd, 0x29);
|
|
127
|
-
break;
|
|
128
|
-
}
|
|
129
|
-
ctx.diag(diagnostics, node, `add ${dst}, rr supports BC/DE/SP and same-index pair only`);
|
|
130
|
-
return undefined;
|
|
131
|
-
}
|
|
132
|
-
if (dst === 'IX' || dst === 'IY') {
|
|
133
|
-
ctx.diag(diagnostics, node, `add ${dst}, rr supports BC/DE/SP and same-index pair only`);
|
|
134
|
-
return undefined;
|
|
135
|
-
}
|
|
136
|
-
ctx.diag(diagnostics, node, `add expects destination A, HL, IX, or IY`);
|
|
137
|
-
return undefined;
|
|
138
|
-
}
|
|
139
|
-
if (head === 'sub') {
|
|
140
|
-
const encoded = encodeAluAOrImm8OrMemHL(node, env, diagnostics, ctx, 0x90, 0xd6, 0x96, 'sub', true);
|
|
141
|
-
if (encoded)
|
|
142
|
-
return encoded;
|
|
143
|
-
if (ops.length === 1 || ops.length === 2)
|
|
144
|
-
return undefined;
|
|
145
|
-
}
|
|
146
|
-
if (head === 'cp') {
|
|
147
|
-
const encoded = encodeAluAOrImm8OrMemHL(node, env, diagnostics, ctx, 0xb8, 0xfe, 0xbe, 'cp', true);
|
|
148
|
-
if (encoded)
|
|
149
|
-
return encoded;
|
|
150
|
-
if (ops.length === 1 || ops.length === 2)
|
|
151
|
-
return undefined;
|
|
152
|
-
}
|
|
153
|
-
if (head === 'and') {
|
|
154
|
-
const encoded = encodeAluAOrImm8OrMemHL(node, env, diagnostics, ctx, 0xa0, 0xe6, 0xa6, 'and', true);
|
|
155
|
-
if (encoded)
|
|
156
|
-
return encoded;
|
|
157
|
-
if (ops.length === 1 || ops.length === 2)
|
|
158
|
-
return undefined;
|
|
159
|
-
}
|
|
160
|
-
if (head === 'or') {
|
|
161
|
-
const encoded = encodeAluAOrImm8OrMemHL(node, env, diagnostics, ctx, 0xb0, 0xf6, 0xb6, 'or', true);
|
|
162
|
-
if (encoded)
|
|
163
|
-
return encoded;
|
|
164
|
-
if (ops.length === 1 || ops.length === 2)
|
|
165
|
-
return undefined;
|
|
166
|
-
}
|
|
167
|
-
if (head === 'xor') {
|
|
168
|
-
const encoded = encodeAluAOrImm8OrMemHL(node, env, diagnostics, ctx, 0xa8, 0xee, 0xae, 'xor', true);
|
|
169
|
-
if (encoded)
|
|
170
|
-
return encoded;
|
|
171
|
-
if (ops.length === 1 || ops.length === 2)
|
|
172
|
-
return undefined;
|
|
173
|
-
}
|
|
174
|
-
if (head === 'adc') {
|
|
175
|
-
if (ops.length === 2) {
|
|
176
|
-
const dst = ctx.regName(ops[0]);
|
|
177
|
-
if (dst === 'HL') {
|
|
178
|
-
return encodeHlReg16Alu(node, diagnostics, ctx, ctx.regName(ops[1]), 'adc', {
|
|
179
|
-
BC: 0x4a,
|
|
180
|
-
DE: 0x5a,
|
|
181
|
-
HL: 0x6a,
|
|
182
|
-
SP: 0x7a,
|
|
183
|
-
});
|
|
184
|
-
}
|
|
185
|
-
if (dst !== 'A') {
|
|
186
|
-
ctx.diag(diagnostics, node, `adc expects destination A or HL`);
|
|
187
|
-
return undefined;
|
|
188
|
-
}
|
|
189
|
-
}
|
|
190
|
-
const encoded = encodeAluAOrImm8OrMemHL(node, env, diagnostics, ctx, 0x88, 0xce, 0x8e, 'adc', true);
|
|
191
|
-
if (encoded)
|
|
192
|
-
return encoded;
|
|
193
|
-
if (ops.length === 1 || ops.length === 2)
|
|
194
|
-
return undefined;
|
|
195
|
-
}
|
|
196
|
-
if (head === 'sbc') {
|
|
197
|
-
if (ops.length === 2) {
|
|
198
|
-
const dst = ctx.regName(ops[0]);
|
|
199
|
-
if (dst === 'HL') {
|
|
200
|
-
return encodeHlReg16Alu(node, diagnostics, ctx, ctx.regName(ops[1]), 'sbc', {
|
|
201
|
-
BC: 0x42,
|
|
202
|
-
DE: 0x52,
|
|
203
|
-
HL: 0x62,
|
|
204
|
-
SP: 0x72,
|
|
205
|
-
});
|
|
206
|
-
}
|
|
207
|
-
if (dst !== 'A') {
|
|
208
|
-
ctx.diag(diagnostics, node, `sbc expects destination A or HL`);
|
|
209
|
-
return undefined;
|
|
210
|
-
}
|
|
211
|
-
}
|
|
212
|
-
const encoded = encodeAluAOrImm8OrMemHL(node, env, diagnostics, ctx, 0x98, 0xde, 0x9e, 'sbc', true);
|
|
213
|
-
if (encoded)
|
|
214
|
-
return encoded;
|
|
215
|
-
if (ops.length === 1 || ops.length === 2)
|
|
216
|
-
return undefined;
|
|
217
|
-
}
|
|
218
|
-
return undefined;
|
|
219
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
import type { Diagnostic } from '../diagnosticTypes.js';
|
|
2
|
-
import type { AsmInstructionNode } from '../frontend/ast.js';
|
|
3
|
-
import type { CompileEnv } from '../semantics/env.js';
|
|
4
|
-
import type { EncoderImmContext, EncoderMemContext, EncoderRegisterContext } from './encodeContext.js';
|
|
5
|
-
type BitOpsEncodeContext = EncoderRegisterContext & Pick<EncoderImmContext, 'immValue'> & EncoderMemContext;
|
|
6
|
-
export declare function encodeBitOpsInstruction(node: AsmInstructionNode, env: CompileEnv, diagnostics: Diagnostic[], ctx: BitOpsEncodeContext): Uint8Array | undefined;
|
|
7
|
-
export {};
|