@jhlagado/azm 0.2.1 → 0.2.3
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 +176 -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 +80 -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,273 +0,0 @@
|
|
|
1
|
-
export function encodeLdInstruction(node, env, diagnostics, ctx) {
|
|
2
|
-
const { diag, regName, immValue, indexedReg8, reg8Code, fitsImm8, fitsImm16 } = ctx;
|
|
3
|
-
const ops = node.operands;
|
|
4
|
-
if (ops.length !== 2) {
|
|
5
|
-
diag(diagnostics, node, `ld expects two operands`);
|
|
6
|
-
return undefined;
|
|
7
|
-
}
|
|
8
|
-
const dst = regName(ops[0]);
|
|
9
|
-
const src = regName(ops[1]);
|
|
10
|
-
if (dst === 'I' && src === 'A')
|
|
11
|
-
return Uint8Array.of(0xed, 0x47);
|
|
12
|
-
if (dst === 'A' && src === 'I')
|
|
13
|
-
return Uint8Array.of(0xed, 0x57);
|
|
14
|
-
if (dst === 'R' && src === 'A')
|
|
15
|
-
return Uint8Array.of(0xed, 0x4f);
|
|
16
|
-
if (dst === 'A' && src === 'R')
|
|
17
|
-
return Uint8Array.of(0xed, 0x5f);
|
|
18
|
-
const r = regName(ops[0]);
|
|
19
|
-
const n = immValue(ops[1], env);
|
|
20
|
-
if (n !== undefined && r) {
|
|
21
|
-
const indexedDst = indexedReg8(ops[0]);
|
|
22
|
-
if (indexedDst) {
|
|
23
|
-
if (!fitsImm8(n)) {
|
|
24
|
-
diag(diagnostics, node, `ld ${indexedDst.display}, n expects imm8`);
|
|
25
|
-
return undefined;
|
|
26
|
-
}
|
|
27
|
-
return Uint8Array.of(indexedDst.prefix, 0x06 + (indexedDst.code << 3), n & 0xff);
|
|
28
|
-
}
|
|
29
|
-
const r8 = reg8Code(r);
|
|
30
|
-
if (r8 !== undefined) {
|
|
31
|
-
if (!fitsImm8(n)) {
|
|
32
|
-
diag(diagnostics, node, `ld ${r}, n expects imm8`);
|
|
33
|
-
return undefined;
|
|
34
|
-
}
|
|
35
|
-
return Uint8Array.of(0x06 + (r8 << 3), n & 0xff);
|
|
36
|
-
}
|
|
37
|
-
if (r === 'BC' || r === 'DE' || r === 'HL' || r === 'SP') {
|
|
38
|
-
if (!fitsImm16(n)) {
|
|
39
|
-
diag(diagnostics, node, `ld ${r}, nn expects imm16`);
|
|
40
|
-
return undefined;
|
|
41
|
-
}
|
|
42
|
-
const op = r === 'BC' ? 0x01 : r === 'DE' ? 0x11 : r === 'HL' ? 0x21 : 0x31;
|
|
43
|
-
return Uint8Array.of(op, n & 0xff, (n >> 8) & 0xff);
|
|
44
|
-
}
|
|
45
|
-
if (r === 'IX' || r === 'IY') {
|
|
46
|
-
if (!fitsImm16(n)) {
|
|
47
|
-
diag(diagnostics, node, `ld ${r}, nn expects imm16`);
|
|
48
|
-
return undefined;
|
|
49
|
-
}
|
|
50
|
-
const prefix = r === 'IX' ? 0xdd : 0xfd;
|
|
51
|
-
return Uint8Array.of(prefix, 0x21, n & 0xff, (n >> 8) & 0xff);
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
const indexedDst = indexedReg8(ops[0]);
|
|
55
|
-
const indexedSrc = indexedReg8(ops[1]);
|
|
56
|
-
if ((indexedDst || indexedSrc) && ops[0].kind !== 'Mem' && ops[1].kind !== 'Mem') {
|
|
57
|
-
const prefix = indexedDst?.prefix ?? indexedSrc?.prefix;
|
|
58
|
-
if ((indexedDst && indexedDst.prefix !== prefix) ||
|
|
59
|
-
(indexedSrc && indexedSrc.prefix !== prefix)) {
|
|
60
|
-
diag(diagnostics, node, `ld between IX* and IY* byte registers is not supported`);
|
|
61
|
-
return undefined;
|
|
62
|
-
}
|
|
63
|
-
if ((indexedDst && !indexedSrc && ctx.isPlainHLReg8(src)) ||
|
|
64
|
-
(indexedSrc && !indexedDst && ctx.isPlainHLReg8(dst))) {
|
|
65
|
-
diag(diagnostics, node, `ld with IX*/IY* does not support plain H/L counterpart operands`);
|
|
66
|
-
return undefined;
|
|
67
|
-
}
|
|
68
|
-
const d = indexedDst ? indexedDst.code : dst ? reg8Code(dst) : undefined;
|
|
69
|
-
const s = indexedSrc ? indexedSrc.code : src ? reg8Code(src) : undefined;
|
|
70
|
-
if (prefix === undefined || d === undefined || s === undefined) {
|
|
71
|
-
diag(diagnostics, node, `ld with IX*/IY* byte registers expects reg8 operands`);
|
|
72
|
-
return undefined;
|
|
73
|
-
}
|
|
74
|
-
return Uint8Array.of(prefix, 0x40 + (d << 3) + s);
|
|
75
|
-
}
|
|
76
|
-
const srcAbs16 = ctx.memAbs16(ops[1], env);
|
|
77
|
-
if (srcAbs16 !== undefined) {
|
|
78
|
-
if (srcAbs16 < 0 || srcAbs16 > 0xffff) {
|
|
79
|
-
diag(diagnostics, node, `ld rr, (nn) expects abs16 address`);
|
|
80
|
-
return undefined;
|
|
81
|
-
}
|
|
82
|
-
if (dst === 'A')
|
|
83
|
-
return Uint8Array.of(0x3a, srcAbs16 & 0xff, (srcAbs16 >> 8) & 0xff);
|
|
84
|
-
if (dst === 'HL')
|
|
85
|
-
return Uint8Array.of(0x2a, srcAbs16 & 0xff, (srcAbs16 >> 8) & 0xff);
|
|
86
|
-
if (dst === 'BC')
|
|
87
|
-
return Uint8Array.of(0xed, 0x4b, srcAbs16 & 0xff, (srcAbs16 >> 8) & 0xff);
|
|
88
|
-
if (dst === 'DE')
|
|
89
|
-
return Uint8Array.of(0xed, 0x5b, srcAbs16 & 0xff, (srcAbs16 >> 8) & 0xff);
|
|
90
|
-
if (dst === 'SP')
|
|
91
|
-
return Uint8Array.of(0xed, 0x7b, srcAbs16 & 0xff, (srcAbs16 >> 8) & 0xff);
|
|
92
|
-
if (dst === 'IX')
|
|
93
|
-
return Uint8Array.of(0xdd, 0x2a, srcAbs16 & 0xff, (srcAbs16 >> 8) & 0xff);
|
|
94
|
-
if (dst === 'IY')
|
|
95
|
-
return Uint8Array.of(0xfd, 0x2a, srcAbs16 & 0xff, (srcAbs16 >> 8) & 0xff);
|
|
96
|
-
}
|
|
97
|
-
const dstAbs16 = ctx.memAbs16(ops[0], env);
|
|
98
|
-
if (dstAbs16 !== undefined) {
|
|
99
|
-
if (dstAbs16 < 0 || dstAbs16 > 0xffff) {
|
|
100
|
-
diag(diagnostics, node, `ld (nn), rr expects abs16 address`);
|
|
101
|
-
return undefined;
|
|
102
|
-
}
|
|
103
|
-
if (src === 'A')
|
|
104
|
-
return Uint8Array.of(0x32, dstAbs16 & 0xff, (dstAbs16 >> 8) & 0xff);
|
|
105
|
-
if (src === 'HL')
|
|
106
|
-
return Uint8Array.of(0x22, dstAbs16 & 0xff, (dstAbs16 >> 8) & 0xff);
|
|
107
|
-
if (src === 'BC')
|
|
108
|
-
return Uint8Array.of(0xed, 0x43, dstAbs16 & 0xff, (dstAbs16 >> 8) & 0xff);
|
|
109
|
-
if (src === 'DE')
|
|
110
|
-
return Uint8Array.of(0xed, 0x53, dstAbs16 & 0xff, (dstAbs16 >> 8) & 0xff);
|
|
111
|
-
if (src === 'SP')
|
|
112
|
-
return Uint8Array.of(0xed, 0x73, dstAbs16 & 0xff, (dstAbs16 >> 8) & 0xff);
|
|
113
|
-
if (src === 'IX')
|
|
114
|
-
return Uint8Array.of(0xdd, 0x22, dstAbs16 & 0xff, (dstAbs16 >> 8) & 0xff);
|
|
115
|
-
if (src === 'IY')
|
|
116
|
-
return Uint8Array.of(0xfd, 0x22, dstAbs16 & 0xff, (dstAbs16 >> 8) & 0xff);
|
|
117
|
-
}
|
|
118
|
-
if (dst && src) {
|
|
119
|
-
const d = reg8Code(dst);
|
|
120
|
-
const s = reg8Code(src);
|
|
121
|
-
if (d !== undefined && s !== undefined) {
|
|
122
|
-
return Uint8Array.of(0x40 + (d << 3) + s);
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
const indexedDstMem = indexedReg8(ops[0]);
|
|
126
|
-
if (indexedDstMem && ops[1].kind === 'Mem') {
|
|
127
|
-
const idx = ctx.memIndexed(ops[1], env);
|
|
128
|
-
if (!idx) {
|
|
129
|
-
diag(diagnostics, node, `ld ${indexedDstMem.display}, source expects (${indexedDstMem.display.startsWith('IX') ? 'ix' : 'iy'}+disp)`);
|
|
130
|
-
return undefined;
|
|
131
|
-
}
|
|
132
|
-
if (idx.prefix !== indexedDstMem.prefix) {
|
|
133
|
-
diag(diagnostics, node, `ld ${indexedDstMem.display}, source index base must match destination family`);
|
|
134
|
-
return undefined;
|
|
135
|
-
}
|
|
136
|
-
const disp = idx.disp;
|
|
137
|
-
if (disp < -128 || disp > 127) {
|
|
138
|
-
diag(diagnostics, node, `ld ${indexedDstMem.display}, (${indexedDstMem.display.startsWith('IX') ? 'ix' : 'iy'}+disp) expects disp8`);
|
|
139
|
-
return undefined;
|
|
140
|
-
}
|
|
141
|
-
return Uint8Array.of(indexedDstMem.prefix, 0x46 + (indexedDstMem.code << 3), disp & 0xff);
|
|
142
|
-
}
|
|
143
|
-
if (dst) {
|
|
144
|
-
const d = reg8Code(dst);
|
|
145
|
-
if (d !== undefined && ops[1].kind === 'Mem') {
|
|
146
|
-
const mem = ops[1];
|
|
147
|
-
if (mem.expr.kind === 'EaName' && mem.expr.name.toUpperCase() === 'HL') {
|
|
148
|
-
return Uint8Array.of(0x46 + (d << 3));
|
|
149
|
-
}
|
|
150
|
-
const idx = ctx.memIndexed(mem, env);
|
|
151
|
-
if (idx) {
|
|
152
|
-
const disp = idx.disp;
|
|
153
|
-
if (disp < -128 || disp > 127) {
|
|
154
|
-
diag(diagnostics, node, `ld ${dst}, (ix/iy+disp) expects disp8`);
|
|
155
|
-
return undefined;
|
|
156
|
-
}
|
|
157
|
-
return Uint8Array.of(idx.prefix, 0x46 + (d << 3), disp & 0xff);
|
|
158
|
-
}
|
|
159
|
-
if (dst.toUpperCase() === 'A' && mem.expr.kind === 'EaName') {
|
|
160
|
-
const ea = mem.expr.name.toUpperCase();
|
|
161
|
-
if (ea === 'BC')
|
|
162
|
-
return Uint8Array.of(0x0a);
|
|
163
|
-
if (ea === 'DE')
|
|
164
|
-
return Uint8Array.of(0x1a);
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
if (ops[0].kind === 'Mem') {
|
|
169
|
-
const mem = ops[0];
|
|
170
|
-
const indexedSrcMem = indexedReg8(ops[1]);
|
|
171
|
-
if (indexedSrcMem) {
|
|
172
|
-
const idx = ctx.memIndexed(mem, env);
|
|
173
|
-
if (!idx) {
|
|
174
|
-
diag(diagnostics, node, `ld destination expects (${indexedSrcMem.display.startsWith('IX') ? 'ix' : 'iy'}+disp) for source ${indexedSrcMem.display}`);
|
|
175
|
-
return undefined;
|
|
176
|
-
}
|
|
177
|
-
if (idx.prefix !== indexedSrcMem.prefix) {
|
|
178
|
-
diag(diagnostics, node, `ld destination index base must match source ${indexedSrcMem.display} family`);
|
|
179
|
-
return undefined;
|
|
180
|
-
}
|
|
181
|
-
const disp = idx.disp;
|
|
182
|
-
if (disp < -128 || disp > 127) {
|
|
183
|
-
diag(diagnostics, node, `ld (${indexedSrcMem.display.startsWith('IX') ? 'ix' : 'iy'}+disp), ${indexedSrcMem.display} expects disp8`);
|
|
184
|
-
return undefined;
|
|
185
|
-
}
|
|
186
|
-
return Uint8Array.of(idx.prefix, 0x70 + indexedSrcMem.code, disp & 0xff);
|
|
187
|
-
}
|
|
188
|
-
if (mem.expr.kind === 'EaName' && mem.expr.name.toUpperCase() === 'HL' && src) {
|
|
189
|
-
const s = reg8Code(src);
|
|
190
|
-
if (s !== undefined)
|
|
191
|
-
return Uint8Array.of(0x70 + s);
|
|
192
|
-
}
|
|
193
|
-
const idx = src ? ctx.memIndexed(mem, env) : undefined;
|
|
194
|
-
if (idx && src) {
|
|
195
|
-
const s = reg8Code(src);
|
|
196
|
-
if (s !== undefined) {
|
|
197
|
-
const disp = idx.disp;
|
|
198
|
-
if (disp < -128 || disp > 127) {
|
|
199
|
-
diag(diagnostics, node, `ld (ix/iy+disp), ${src} expects disp8`);
|
|
200
|
-
return undefined;
|
|
201
|
-
}
|
|
202
|
-
return Uint8Array.of(idx.prefix, 0x70 + s, disp & 0xff);
|
|
203
|
-
}
|
|
204
|
-
}
|
|
205
|
-
if (mem.expr.kind === 'EaName' && src?.toUpperCase() === 'A') {
|
|
206
|
-
const ea = mem.expr.name.toUpperCase();
|
|
207
|
-
if (ea === 'BC')
|
|
208
|
-
return Uint8Array.of(0x02);
|
|
209
|
-
if (ea === 'DE')
|
|
210
|
-
return Uint8Array.of(0x12);
|
|
211
|
-
}
|
|
212
|
-
}
|
|
213
|
-
if (ctx.isMemHL(ops[0]) && n !== undefined) {
|
|
214
|
-
if (!fitsImm8(n)) {
|
|
215
|
-
diag(diagnostics, node, `ld (hl), n expects imm8`);
|
|
216
|
-
return undefined;
|
|
217
|
-
}
|
|
218
|
-
return Uint8Array.of(0x36, n & 0xff);
|
|
219
|
-
}
|
|
220
|
-
if (n !== undefined) {
|
|
221
|
-
const idx = ctx.memIndexed(ops[0], env);
|
|
222
|
-
if (idx) {
|
|
223
|
-
if (!fitsImm8(n)) {
|
|
224
|
-
diag(diagnostics, node, `ld (ix/iy+disp), n expects imm8`);
|
|
225
|
-
return undefined;
|
|
226
|
-
}
|
|
227
|
-
const disp = idx.disp;
|
|
228
|
-
if (disp < -128 || disp > 127) {
|
|
229
|
-
diag(diagnostics, node, `ld (ix/iy+disp), n expects disp8`);
|
|
230
|
-
return undefined;
|
|
231
|
-
}
|
|
232
|
-
return Uint8Array.of(idx.prefix, 0x36, disp & 0xff, n & 0xff);
|
|
233
|
-
}
|
|
234
|
-
}
|
|
235
|
-
if (r === 'SP' && src) {
|
|
236
|
-
if (src === 'HL')
|
|
237
|
-
return Uint8Array.of(0xf9);
|
|
238
|
-
if (src === 'IX')
|
|
239
|
-
return Uint8Array.of(0xdd, 0xf9);
|
|
240
|
-
if (src === 'IY')
|
|
241
|
-
return Uint8Array.of(0xfd, 0xf9);
|
|
242
|
-
}
|
|
243
|
-
if (ops[0].kind === 'Mem' && ops[1].kind === 'Mem') {
|
|
244
|
-
diag(diagnostics, node, `ld does not support memory-to-memory transfers`);
|
|
245
|
-
return undefined;
|
|
246
|
-
}
|
|
247
|
-
if (dst !== undefined &&
|
|
248
|
-
dst !== 'A' &&
|
|
249
|
-
(ctx.isMemRegName(ops[1], 'BC') || ctx.isMemRegName(ops[1], 'DE'))) {
|
|
250
|
-
diag(diagnostics, node, `ld r8, (bc/de) supports destination A only`);
|
|
251
|
-
return undefined;
|
|
252
|
-
}
|
|
253
|
-
if (src !== undefined &&
|
|
254
|
-
src !== 'A' &&
|
|
255
|
-
(ctx.isMemRegName(ops[0], 'BC') || ctx.isMemRegName(ops[0], 'DE'))) {
|
|
256
|
-
diag(diagnostics, node, `ld (bc/de), r8 supports source A only`);
|
|
257
|
-
return undefined;
|
|
258
|
-
}
|
|
259
|
-
if (dst === 'AF' || src === 'AF') {
|
|
260
|
-
diag(diagnostics, node, `ld does not support AF in this form`);
|
|
261
|
-
return undefined;
|
|
262
|
-
}
|
|
263
|
-
if (ctx.isReg16TransferName(dst) && ctx.isReg16TransferName(src)) {
|
|
264
|
-
if (dst === 'SP') {
|
|
265
|
-
diag(diagnostics, node, `ld SP, rr supports HL/IX/IY only`);
|
|
266
|
-
return undefined;
|
|
267
|
-
}
|
|
268
|
-
diag(diagnostics, node, `ld rr, rr supports SP <- HL/IX/IY only`);
|
|
269
|
-
return undefined;
|
|
270
|
-
}
|
|
271
|
-
diag(diagnostics, node, `ld expects a supported register/memory/immediate transfer form`);
|
|
272
|
-
return undefined;
|
|
273
|
-
}
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
export type EncoderFamily = 'control' | 'alu' | 'io' | 'ld' | 'core' | 'bit';
|
|
2
|
-
type EncoderFallbackMode = 'none' | 'standard' | 'arity-short-circuit';
|
|
3
|
-
type EncoderRegistryEntry = {
|
|
4
|
-
kind: 'zero';
|
|
5
|
-
bytes: Uint8Array;
|
|
6
|
-
} | {
|
|
7
|
-
kind: 'family';
|
|
8
|
-
family: EncoderFamily;
|
|
9
|
-
fallback: EncoderFallbackMode;
|
|
10
|
-
arityDiagnostic: (head: string, operandCount: number) => string | undefined;
|
|
11
|
-
};
|
|
12
|
-
export declare function getEncoderRegistryEntry(head: string): EncoderRegistryEntry | undefined;
|
|
13
|
-
export {};
|
|
@@ -1,169 +0,0 @@
|
|
|
1
|
-
function expectOneOrTwoWithA(head, operandCount) {
|
|
2
|
-
if (operandCount === 1 || operandCount === 2)
|
|
3
|
-
return undefined;
|
|
4
|
-
return `${head} expects one operand, or two with destination A`;
|
|
5
|
-
}
|
|
6
|
-
function expectOneOrTwoWithAOrHl(head, operandCount) {
|
|
7
|
-
if (operandCount === 1 || operandCount === 2)
|
|
8
|
-
return undefined;
|
|
9
|
-
return `${head} expects one operand, two with destination A, or HL,rr form`;
|
|
10
|
-
}
|
|
11
|
-
function expectOne(head, operandCount) {
|
|
12
|
-
if (operandCount === 1)
|
|
13
|
-
return undefined;
|
|
14
|
-
return `${head} expects one operand`;
|
|
15
|
-
}
|
|
16
|
-
function expectTwo(head, operandCount) {
|
|
17
|
-
if (operandCount === 2)
|
|
18
|
-
return undefined;
|
|
19
|
-
return `${head} expects two operands`;
|
|
20
|
-
}
|
|
21
|
-
function expectTwoOrThreeIndexedToReg8(head, operandCount) {
|
|
22
|
-
if (operandCount === 2 || operandCount === 3)
|
|
23
|
-
return undefined;
|
|
24
|
-
return `${head} expects two operands, or three with indexed source + reg8 destination`;
|
|
25
|
-
}
|
|
26
|
-
function expectOneOrTwoIndexedToReg8(head, operandCount) {
|
|
27
|
-
if (operandCount === 1 || operandCount === 2)
|
|
28
|
-
return undefined;
|
|
29
|
-
return `${head} expects one operand, or two with indexed source + reg8 destination`;
|
|
30
|
-
}
|
|
31
|
-
function expectTwoOps(head, operandCount) {
|
|
32
|
-
if (operandCount === 2)
|
|
33
|
-
return undefined;
|
|
34
|
-
return `${head} expects two operands`;
|
|
35
|
-
}
|
|
36
|
-
const identityArity = (_head, _operandCount) => undefined;
|
|
37
|
-
const FAMILY_SPECS = [
|
|
38
|
-
{
|
|
39
|
-
heads: ['ret', 'call', 'djnz', 'jp', 'jr'],
|
|
40
|
-
family: 'control',
|
|
41
|
-
fallback: 'none',
|
|
42
|
-
arityDiagnostic: identityArity,
|
|
43
|
-
},
|
|
44
|
-
{
|
|
45
|
-
heads: ['add', 'sub', 'cp', 'and', 'or', 'xor', 'adc', 'sbc'],
|
|
46
|
-
family: 'alu',
|
|
47
|
-
fallback: 'standard',
|
|
48
|
-
arityDiagnostic: (head, operandCount) => {
|
|
49
|
-
switch (head) {
|
|
50
|
-
case 'add':
|
|
51
|
-
return expectTwoOps(head, operandCount);
|
|
52
|
-
case 'sub':
|
|
53
|
-
case 'cp':
|
|
54
|
-
case 'and':
|
|
55
|
-
case 'or':
|
|
56
|
-
case 'xor':
|
|
57
|
-
return expectOneOrTwoWithA(head, operandCount);
|
|
58
|
-
case 'adc':
|
|
59
|
-
case 'sbc':
|
|
60
|
-
return expectOneOrTwoWithAOrHl(head, operandCount);
|
|
61
|
-
default:
|
|
62
|
-
return undefined;
|
|
63
|
-
}
|
|
64
|
-
},
|
|
65
|
-
},
|
|
66
|
-
{
|
|
67
|
-
heads: ['rst', 'im', 'in', 'out'],
|
|
68
|
-
family: 'io',
|
|
69
|
-
fallback: 'standard',
|
|
70
|
-
arityDiagnostic: identityArity,
|
|
71
|
-
},
|
|
72
|
-
{
|
|
73
|
-
heads: ['ld'],
|
|
74
|
-
family: 'ld',
|
|
75
|
-
fallback: 'none',
|
|
76
|
-
arityDiagnostic: identityArity,
|
|
77
|
-
},
|
|
78
|
-
{
|
|
79
|
-
heads: ['inc', 'dec', 'push', 'pop', 'ex'],
|
|
80
|
-
family: 'core',
|
|
81
|
-
fallback: 'standard',
|
|
82
|
-
arityDiagnostic: (head, operandCount) => {
|
|
83
|
-
if (head === 'ex')
|
|
84
|
-
return expectTwo(head, operandCount);
|
|
85
|
-
return expectOne(head, operandCount);
|
|
86
|
-
},
|
|
87
|
-
},
|
|
88
|
-
{
|
|
89
|
-
heads: ['bit', 'res', 'set', 'rl', 'rr', 'sla', 'sra', 'srl', 'sll', 'rlc', 'rrc'],
|
|
90
|
-
family: 'bit',
|
|
91
|
-
fallback: 'arity-short-circuit',
|
|
92
|
-
arityDiagnostic: (head, operandCount) => {
|
|
93
|
-
switch (head) {
|
|
94
|
-
case 'bit':
|
|
95
|
-
return expectTwo(head, operandCount);
|
|
96
|
-
case 'res':
|
|
97
|
-
case 'set':
|
|
98
|
-
return expectTwoOrThreeIndexedToReg8(head, operandCount);
|
|
99
|
-
case 'rl':
|
|
100
|
-
case 'rr':
|
|
101
|
-
case 'sla':
|
|
102
|
-
case 'sra':
|
|
103
|
-
case 'srl':
|
|
104
|
-
case 'sll':
|
|
105
|
-
case 'rlc':
|
|
106
|
-
case 'rrc':
|
|
107
|
-
return expectOneOrTwoIndexedToReg8(head, operandCount);
|
|
108
|
-
default:
|
|
109
|
-
return undefined;
|
|
110
|
-
}
|
|
111
|
-
},
|
|
112
|
-
},
|
|
113
|
-
];
|
|
114
|
-
const ZERO_OPCODE_REGISTRY = {
|
|
115
|
-
nop: Uint8Array.of(0x00),
|
|
116
|
-
halt: Uint8Array.of(0x76),
|
|
117
|
-
di: Uint8Array.of(0xf3),
|
|
118
|
-
ei: Uint8Array.of(0xfb),
|
|
119
|
-
scf: Uint8Array.of(0x37),
|
|
120
|
-
ccf: Uint8Array.of(0x3f),
|
|
121
|
-
cpl: Uint8Array.of(0x2f),
|
|
122
|
-
daa: Uint8Array.of(0x27),
|
|
123
|
-
rlca: Uint8Array.of(0x07),
|
|
124
|
-
rrca: Uint8Array.of(0x0f),
|
|
125
|
-
rla: Uint8Array.of(0x17),
|
|
126
|
-
rra: Uint8Array.of(0x1f),
|
|
127
|
-
exx: Uint8Array.of(0xd9),
|
|
128
|
-
reti: Uint8Array.of(0xed, 0x4d),
|
|
129
|
-
retn: Uint8Array.of(0xed, 0x45),
|
|
130
|
-
neg: Uint8Array.of(0xed, 0x44),
|
|
131
|
-
rrd: Uint8Array.of(0xed, 0x67),
|
|
132
|
-
rld: Uint8Array.of(0xed, 0x6f),
|
|
133
|
-
ldi: Uint8Array.of(0xed, 0xa0),
|
|
134
|
-
ldir: Uint8Array.of(0xed, 0xb0),
|
|
135
|
-
ldd: Uint8Array.of(0xed, 0xa8),
|
|
136
|
-
lddr: Uint8Array.of(0xed, 0xb8),
|
|
137
|
-
cpi: Uint8Array.of(0xed, 0xa1),
|
|
138
|
-
cpir: Uint8Array.of(0xed, 0xb1),
|
|
139
|
-
cpd: Uint8Array.of(0xed, 0xa9),
|
|
140
|
-
cpdr: Uint8Array.of(0xed, 0xb9),
|
|
141
|
-
ini: Uint8Array.of(0xed, 0xa2),
|
|
142
|
-
inir: Uint8Array.of(0xed, 0xb2),
|
|
143
|
-
ind: Uint8Array.of(0xed, 0xaa),
|
|
144
|
-
indr: Uint8Array.of(0xed, 0xba),
|
|
145
|
-
outi: Uint8Array.of(0xed, 0xa3),
|
|
146
|
-
otir: Uint8Array.of(0xed, 0xb3),
|
|
147
|
-
outd: Uint8Array.of(0xed, 0xab),
|
|
148
|
-
otdr: Uint8Array.of(0xed, 0xbb),
|
|
149
|
-
};
|
|
150
|
-
const ENCODER_REGISTRY = new Map();
|
|
151
|
-
for (const [head, bytes] of Object.entries(ZERO_OPCODE_REGISTRY)) {
|
|
152
|
-
ENCODER_REGISTRY.set(head, {
|
|
153
|
-
kind: 'zero',
|
|
154
|
-
bytes,
|
|
155
|
-
});
|
|
156
|
-
}
|
|
157
|
-
for (const spec of FAMILY_SPECS) {
|
|
158
|
-
for (const head of spec.heads) {
|
|
159
|
-
ENCODER_REGISTRY.set(head, {
|
|
160
|
-
kind: 'family',
|
|
161
|
-
family: spec.family,
|
|
162
|
-
fallback: spec.fallback,
|
|
163
|
-
arityDiagnostic: spec.arityDiagnostic,
|
|
164
|
-
});
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
export function getEncoderRegistryEntry(head) {
|
|
168
|
-
return ENCODER_REGISTRY.get(head.toLowerCase());
|
|
169
|
-
}
|
|
@@ -1,79 +0,0 @@
|
|
|
1
|
-
import { getWrittenRange, getWrittenSegments } from './range.js';
|
|
2
|
-
function toHexByte(n) {
|
|
3
|
-
return (n & 0xff).toString(16).toUpperCase().padStart(2, '0');
|
|
4
|
-
}
|
|
5
|
-
function toHexWord(n) {
|
|
6
|
-
return (n & 0xffff).toString(16).toUpperCase().padStart(4, '0');
|
|
7
|
-
}
|
|
8
|
-
function symbolAddress(symbol) {
|
|
9
|
-
return symbol.kind === 'constant' ? symbol.value & 0xffff : symbol.address & 0xffff;
|
|
10
|
-
}
|
|
11
|
-
function sortSymbols(a, b) {
|
|
12
|
-
const aClass = a.kind === 'constant' ? 1 : 0;
|
|
13
|
-
const bClass = b.kind === 'constant' ? 1 : 0;
|
|
14
|
-
if (aClass !== bClass) {
|
|
15
|
-
return aClass - bClass;
|
|
16
|
-
}
|
|
17
|
-
const addressCmp = symbolAddress(a) - symbolAddress(b);
|
|
18
|
-
if (addressCmp !== 0) {
|
|
19
|
-
return addressCmp;
|
|
20
|
-
}
|
|
21
|
-
return a.name.toLowerCase().localeCompare(b.name.toLowerCase());
|
|
22
|
-
}
|
|
23
|
-
export function writeListing(map, symbols, opts) {
|
|
24
|
-
const lineEnding = opts?.lineEnding ?? '\n';
|
|
25
|
-
const bytesPerLine = opts?.bytesPerLine ?? 16;
|
|
26
|
-
const { start, end } = getWrittenRange(map);
|
|
27
|
-
const segments = getWrittenSegments(map);
|
|
28
|
-
const lines = [];
|
|
29
|
-
lines.push('; AZM listing');
|
|
30
|
-
lines.push(`; range: $${toHexWord(start)}..$${toHexWord(end)} (end exclusive)`);
|
|
31
|
-
lines.push('');
|
|
32
|
-
const lineBaseSet = new Set();
|
|
33
|
-
for (const segment of segments) {
|
|
34
|
-
const first = segment.start - (segment.start % bytesPerLine);
|
|
35
|
-
const last = segment.end - 1 - ((segment.end - 1) % bytesPerLine);
|
|
36
|
-
for (let address = first; address <= last; address += bytesPerLine) {
|
|
37
|
-
lineBaseSet.add(address);
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
const lineBases = [...lineBaseSet].sort((a, b) => a - b);
|
|
41
|
-
let previousBase;
|
|
42
|
-
for (const address of lineBases) {
|
|
43
|
-
if (previousBase !== undefined && address > previousBase + bytesPerLine) {
|
|
44
|
-
const gapStart = previousBase + bytesPerLine;
|
|
45
|
-
const gapEndInclusive = address - 1;
|
|
46
|
-
const gapLineCount = Math.ceil((address - gapStart) / bytesPerLine);
|
|
47
|
-
lines.push(`; ... gap $${toHexWord(gapStart)}..$${toHexWord(gapEndInclusive)} (${gapLineCount} lines)`);
|
|
48
|
-
}
|
|
49
|
-
const lineBytes = [];
|
|
50
|
-
const lineChars = [];
|
|
51
|
-
const count = Math.min(bytesPerLine, end - address);
|
|
52
|
-
for (let offset = 0; offset < count; offset += 1) {
|
|
53
|
-
const byte = map.bytes.get(address + offset);
|
|
54
|
-
if (byte === undefined) {
|
|
55
|
-
lineBytes.push('..');
|
|
56
|
-
lineChars.push(' ');
|
|
57
|
-
}
|
|
58
|
-
else {
|
|
59
|
-
const value = byte & 0xff;
|
|
60
|
-
lineBytes.push(toHexByte(value));
|
|
61
|
-
lineChars.push(value >= 0x20 && value <= 0x7e ? String.fromCharCode(value) : '.');
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
const payload = lineBytes.join(' ').padEnd(bytesPerLine * 3 - 1, ' ');
|
|
65
|
-
lines.push(`${toHexWord(address)}: ${payload} |${lineChars.join('')}|`);
|
|
66
|
-
previousBase = address;
|
|
67
|
-
}
|
|
68
|
-
lines.push('');
|
|
69
|
-
lines.push('; symbols:');
|
|
70
|
-
for (const symbol of [...symbols].sort(sortSymbols)) {
|
|
71
|
-
if (symbol.kind === 'constant') {
|
|
72
|
-
lines.push(`; constant ${symbol.name} = $${toHexWord(symbol.value)} (${symbol.value})`);
|
|
73
|
-
}
|
|
74
|
-
else {
|
|
75
|
-
lines.push(`; ${symbol.kind} ${symbol.name} = $${toHexWord(symbol.address)}`);
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
return { kind: 'lst', text: lines.join(lineEnding) + lineEnding };
|
|
79
|
-
}
|