@jhlagado/azm 0.2.0 → 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 +110 -78
- package/dist/src/api-compile.d.ts +0 -2
- package/dist/src/api-compile.js +2 -9
- package/dist/src/assembly/address-planning.js +21 -1
- package/dist/src/assembly/program-emission.js +1 -0
- 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 +2 -0
- package/dist/src/model/expression.d.ts +4 -0
- package/dist/src/model/source-item.d.ts +11 -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 +206 -5
- package/dist/src/register-care/analyze.js +36 -8
- package/dist/src/register-care/annotations.js +33 -146
- package/dist/src/register-care/fix.d.ts +2 -0
- package/dist/src/register-care/fix.js +52 -0
- package/dist/src/register-care/instruction-shape.d.ts +11 -0
- package/dist/src/register-care/instruction-shape.js +129 -0
- package/dist/src/register-care/liveness.js +15 -7
- package/dist/src/register-care/profiles.js +4 -0
- package/dist/src/register-care/programModel.js +79 -13
- package/dist/src/register-care/report.d.ts +2 -1
- package/dist/src/register-care/report.js +91 -34
- package/dist/src/register-care/routine-summaries.d.ts +6 -0
- package/dist/src/register-care/routine-summaries.js +89 -0
- package/dist/src/register-care/summaries.d.ts +3 -3
- package/dist/src/register-care/summaries.js +42 -75
- package/dist/{legacy-root-azm/src/registerCare → src/register-care}/summary.js +33 -51
- package/dist/src/register-care/types.d.ts +6 -1
- package/dist/src/semantics/expression-evaluation.d.ts +7 -3
- package/dist/src/semantics/expression-evaluation.js +57 -0
- package/dist/src/source/strip-line-comment.d.ts +2 -0
- package/dist/src/source/strip-line-comment.js +26 -0
- package/dist/src/syntax/directive-aliases.js +9 -10
- package/dist/src/syntax/parse-diagnostics.d.ts +12 -0
- package/dist/src/syntax/parse-diagnostics.js +18 -0
- package/dist/src/syntax/parse-expression.js +34 -9
- package/dist/src/syntax/parse-line.js +150 -54
- package/dist/src/tooling/case-style.js +3 -0
- package/docs/reference/cli.md +6 -4
- package/docs/reference/tooling-api.md +13 -9
- package/package.json +4 -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/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/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
- /package/dist/{legacy-root-azm/src/registerCare → src/register-care}/annotate.d.ts +0 -0
- /package/dist/{legacy-root-azm/src/registerCare → src/register-care}/annotate.js +0 -0
- /package/dist/{legacy-root-azm/src/registerCare → src/register-care}/sourceText.d.ts +0 -0
- /package/dist/{legacy-root-azm/src/registerCare → src/register-care}/sourceText.js +0 -0
- /package/dist/{legacy-root-azm/src/registerCare → src/register-care}/summary.d.ts +0 -0
|
@@ -1,123 +0,0 @@
|
|
|
1
|
-
const BIT_LIKE_OPS = {
|
|
2
|
-
bit: { base: 0x40, allowIndexedDestination: false },
|
|
3
|
-
res: { base: 0x80, allowIndexedDestination: true },
|
|
4
|
-
set: { base: 0xc0, allowIndexedDestination: true },
|
|
5
|
-
};
|
|
6
|
-
const ROTATE_SHIFT_OPS = {
|
|
7
|
-
rlc: 0x00,
|
|
8
|
-
rrc: 0x08,
|
|
9
|
-
rl: 0x10,
|
|
10
|
-
rr: 0x18,
|
|
11
|
-
sla: 0x20,
|
|
12
|
-
sra: 0x28,
|
|
13
|
-
sll: 0x30,
|
|
14
|
-
srl: 0x38,
|
|
15
|
-
};
|
|
16
|
-
function indexedCbDestinationCode(node, diagnostics, ctx, idxPrefix, operand, mnemonic, invalidDestinationMessage) {
|
|
17
|
-
const dstIndexed = ctx.indexedReg8(operand);
|
|
18
|
-
if (dstIndexed) {
|
|
19
|
-
ctx.diag(diagnostics, node, dstIndexed.prefix !== idxPrefix
|
|
20
|
-
? `${mnemonic} indexed destination family must match source index base`
|
|
21
|
-
: `${mnemonic} indexed destination must use plain reg8 B/C/D/E/H/L/A`);
|
|
22
|
-
return undefined;
|
|
23
|
-
}
|
|
24
|
-
const dstReg = ctx.regName(operand);
|
|
25
|
-
const dstCode = dstReg ? ctx.reg8Code(dstReg) : undefined;
|
|
26
|
-
if (dstCode === undefined) {
|
|
27
|
-
ctx.diag(diagnostics, node, invalidDestinationMessage);
|
|
28
|
-
return undefined;
|
|
29
|
-
}
|
|
30
|
-
return dstCode;
|
|
31
|
-
}
|
|
32
|
-
function checkedIndexedDisp(node, diagnostics, ctx, disp, mnemonic) {
|
|
33
|
-
if (disp < -128 || disp > 127) {
|
|
34
|
-
ctx.diag(diagnostics, node, `${mnemonic} (ix/iy+disp) expects disp8`);
|
|
35
|
-
return undefined;
|
|
36
|
-
}
|
|
37
|
-
return disp;
|
|
38
|
-
}
|
|
39
|
-
function encodeCbRegOrHl(node, diagnostics, ctx, operand, opcodeBase, mnemonic) {
|
|
40
|
-
if (ctx.isMemHL(operand))
|
|
41
|
-
return Uint8Array.of(0xcb, opcodeBase + 0x06);
|
|
42
|
-
const reg = ctx.regName(operand);
|
|
43
|
-
const code = reg ? ctx.reg8Code(reg) : undefined;
|
|
44
|
-
if (code === undefined) {
|
|
45
|
-
ctx.diag(diagnostics, node, `${mnemonic} expects reg8 or (hl)`);
|
|
46
|
-
return undefined;
|
|
47
|
-
}
|
|
48
|
-
return Uint8Array.of(0xcb, opcodeBase + code);
|
|
49
|
-
}
|
|
50
|
-
function encodeBitLike(node, env, diagnostics, ctx, base, mnemonic, allowIndexedDestination = false) {
|
|
51
|
-
const ops = node.operands;
|
|
52
|
-
if (ops.length !== 2 && !(allowIndexedDestination && ops.length === 3))
|
|
53
|
-
return undefined;
|
|
54
|
-
const bit = ctx.immValue(ops[0], env);
|
|
55
|
-
if (bit === undefined || bit < 0 || bit > 7) {
|
|
56
|
-
ctx.diag(diagnostics, node, `${mnemonic} expects bit index 0..7`);
|
|
57
|
-
return undefined;
|
|
58
|
-
}
|
|
59
|
-
const src = ops[1];
|
|
60
|
-
const idx = ctx.memIndexed(src, env);
|
|
61
|
-
if (idx) {
|
|
62
|
-
const disp = checkedIndexedDisp(node, diagnostics, ctx, idx.disp, mnemonic);
|
|
63
|
-
if (disp === undefined)
|
|
64
|
-
return undefined;
|
|
65
|
-
if (ops.length === 3) {
|
|
66
|
-
const dstCode = indexedCbDestinationCode(node, diagnostics, ctx, idx.prefix, ops[2], mnemonic, `${mnemonic} b,(ix/iy+disp),r expects reg8 destination`);
|
|
67
|
-
if (dstCode === undefined)
|
|
68
|
-
return undefined;
|
|
69
|
-
return Uint8Array.of(idx.prefix, 0xcb, disp & 0xff, base + (bit << 3) + dstCode);
|
|
70
|
-
}
|
|
71
|
-
return Uint8Array.of(idx.prefix, 0xcb, disp & 0xff, base + (bit << 3) + 0x06);
|
|
72
|
-
}
|
|
73
|
-
if (ops.length === 3) {
|
|
74
|
-
ctx.diag(diagnostics, node, `${mnemonic} b,(ix/iy+disp),r requires an indexed memory source`);
|
|
75
|
-
return undefined;
|
|
76
|
-
}
|
|
77
|
-
return encodeCbRegOrHl(node, diagnostics, ctx, src, base + (bit << 3), mnemonic);
|
|
78
|
-
}
|
|
79
|
-
function encodeCbRotateShift(node, env, diagnostics, ctx, base, mnemonic) {
|
|
80
|
-
const ops = node.operands;
|
|
81
|
-
if (ops.length !== 1 && ops.length !== 2)
|
|
82
|
-
return undefined;
|
|
83
|
-
const operand = ops[0];
|
|
84
|
-
const idx = ctx.memIndexed(operand, env);
|
|
85
|
-
if (idx) {
|
|
86
|
-
const disp = checkedIndexedDisp(node, diagnostics, ctx, idx.disp, mnemonic);
|
|
87
|
-
if (disp === undefined)
|
|
88
|
-
return undefined;
|
|
89
|
-
if (ops.length === 1) {
|
|
90
|
-
return Uint8Array.of(idx.prefix, 0xcb, disp & 0xff, base + 0x06);
|
|
91
|
-
}
|
|
92
|
-
const dstCode = indexedCbDestinationCode(node, diagnostics, ctx, idx.prefix, ops[1], mnemonic, `${mnemonic} (ix/iy+disp),r expects reg8 destination`);
|
|
93
|
-
if (dstCode === undefined)
|
|
94
|
-
return undefined;
|
|
95
|
-
return Uint8Array.of(idx.prefix, 0xcb, disp & 0xff, base + dstCode);
|
|
96
|
-
}
|
|
97
|
-
if (ops.length === 2) {
|
|
98
|
-
ctx.diag(diagnostics, node, `${mnemonic} two-operand form requires (ix/iy+disp) source`);
|
|
99
|
-
return undefined;
|
|
100
|
-
}
|
|
101
|
-
return encodeCbRegOrHl(node, diagnostics, ctx, operand, base, mnemonic);
|
|
102
|
-
}
|
|
103
|
-
export function encodeBitOpsInstruction(node, env, diagnostics, ctx) {
|
|
104
|
-
const head = node.head.toLowerCase();
|
|
105
|
-
const ops = node.operands;
|
|
106
|
-
const bitLike = BIT_LIKE_OPS[head];
|
|
107
|
-
if (bitLike) {
|
|
108
|
-
const encoded = encodeBitLike(node, env, diagnostics, ctx, bitLike.base, head, bitLike.allowIndexedDestination);
|
|
109
|
-
if (encoded)
|
|
110
|
-
return encoded;
|
|
111
|
-
if (ops.length === 2 || (bitLike.allowIndexedDestination && ops.length === 3))
|
|
112
|
-
return undefined;
|
|
113
|
-
}
|
|
114
|
-
const rotateShiftBase = ROTATE_SHIFT_OPS[head];
|
|
115
|
-
if (rotateShiftBase !== undefined) {
|
|
116
|
-
const encoded = encodeCbRotateShift(node, env, diagnostics, ctx, rotateShiftBase, head);
|
|
117
|
-
if (encoded)
|
|
118
|
-
return encoded;
|
|
119
|
-
if (ops.length === 1 || ops.length === 2)
|
|
120
|
-
return undefined;
|
|
121
|
-
}
|
|
122
|
-
return undefined;
|
|
123
|
-
}
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
import type { Diagnostic } from '../diagnosticTypes.js';
|
|
2
|
-
import type { AsmInstructionNode, AsmOperandNode } from '../frontend/ast.js';
|
|
3
|
-
import type { CompileEnv } from '../semantics/env.js';
|
|
4
|
-
type EncodeDiag = (diagnostics: Diagnostic[], node: {
|
|
5
|
-
span: AsmInstructionNode['span'];
|
|
6
|
-
}, message: string) => void;
|
|
7
|
-
type IndexedReg8 = {
|
|
8
|
-
prefix: number;
|
|
9
|
-
code: number;
|
|
10
|
-
display: 'IXH' | 'IXL' | 'IYH' | 'IYL';
|
|
11
|
-
};
|
|
12
|
-
export type EncoderRegisterContext = {
|
|
13
|
-
diag: EncodeDiag;
|
|
14
|
-
regName: (op: AsmOperandNode) => string | undefined;
|
|
15
|
-
indexedReg8: (op: AsmOperandNode) => IndexedReg8 | undefined;
|
|
16
|
-
reg8Code: (name: string) => number | undefined;
|
|
17
|
-
};
|
|
18
|
-
export type EncoderImmContext = {
|
|
19
|
-
immValue: (op: AsmOperandNode, env: CompileEnv) => number | undefined;
|
|
20
|
-
fitsImm8: (value: number) => boolean;
|
|
21
|
-
};
|
|
22
|
-
export type EncoderMemContext = {
|
|
23
|
-
isMemHL: (op: AsmOperandNode) => boolean;
|
|
24
|
-
memIndexed: (op: AsmOperandNode, env: CompileEnv) => {
|
|
25
|
-
prefix: number;
|
|
26
|
-
disp: number;
|
|
27
|
-
} | undefined;
|
|
28
|
-
};
|
|
29
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
import type { Diagnostic } from '../diagnosticTypes.js';
|
|
2
|
-
import type { AsmInstructionNode, AsmOperandNode } from '../frontend/ast.js';
|
|
3
|
-
import type { CompileEnv } from '../semantics/env.js';
|
|
4
|
-
type ControlEncodeContext = {
|
|
5
|
-
diag: (diagnostics: Diagnostic[], node: {
|
|
6
|
-
span: {
|
|
7
|
-
file: string;
|
|
8
|
-
start: {
|
|
9
|
-
line: number;
|
|
10
|
-
column: number;
|
|
11
|
-
};
|
|
12
|
-
};
|
|
13
|
-
}, message: string) => void;
|
|
14
|
-
immValue: (op: AsmOperandNode, env: CompileEnv) => number | undefined;
|
|
15
|
-
registerTokenName: (op: AsmOperandNode) => string | undefined;
|
|
16
|
-
conditionName: (op: AsmOperandNode) => string | undefined;
|
|
17
|
-
symbolicImmBaseName: (op: AsmOperandNode, env: CompileEnv) => string | undefined;
|
|
18
|
-
fitsImm16: (value: number) => boolean;
|
|
19
|
-
isMemRegName: (op: AsmOperandNode, reg: string) => boolean;
|
|
20
|
-
retConditionOpcode: (name: string) => number | undefined;
|
|
21
|
-
callConditionOpcode: (name: string) => number | undefined;
|
|
22
|
-
jpConditionOpcode: (name: string) => number | undefined;
|
|
23
|
-
jrConditionOpcode: (name: string) => number | undefined;
|
|
24
|
-
};
|
|
25
|
-
export declare function encodeControlInstruction(node: AsmInstructionNode, env: CompileEnv, diagnostics: Diagnostic[], ctx: ControlEncodeContext): Uint8Array | undefined;
|
|
26
|
-
export {};
|
|
@@ -1,180 +0,0 @@
|
|
|
1
|
-
function encodeConditionalAbs16(node, target, env, diagnostics, ctx, opcode, messages) {
|
|
2
|
-
if (opcode === undefined) {
|
|
3
|
-
ctx.diag(diagnostics, node, messages.badCondition);
|
|
4
|
-
return undefined;
|
|
5
|
-
}
|
|
6
|
-
if (target.kind === 'Mem') {
|
|
7
|
-
ctx.diag(diagnostics, node, messages.indirectTarget);
|
|
8
|
-
return undefined;
|
|
9
|
-
}
|
|
10
|
-
const n = ctx.immValue(target, env);
|
|
11
|
-
if (n === undefined || !ctx.fitsImm16(n)) {
|
|
12
|
-
ctx.diag(diagnostics, node, messages.badTarget);
|
|
13
|
-
return undefined;
|
|
14
|
-
}
|
|
15
|
-
return Uint8Array.of(opcode, n & 0xff, (n >> 8) & 0xff);
|
|
16
|
-
}
|
|
17
|
-
function rejectUnsupportedDirectTarget(node, target, env, diagnostics, ctx, messages) {
|
|
18
|
-
if (target.kind === 'Mem') {
|
|
19
|
-
ctx.diag(diagnostics, node, messages.indirect);
|
|
20
|
-
return true;
|
|
21
|
-
}
|
|
22
|
-
if (ctx.registerTokenName(target) !== undefined && ctx.immValue(target, env) === undefined) {
|
|
23
|
-
ctx.diag(diagnostics, node, messages.register);
|
|
24
|
-
return true;
|
|
25
|
-
}
|
|
26
|
-
return false;
|
|
27
|
-
}
|
|
28
|
-
function encodeRelativeDisp8(node, target, env, diagnostics, ctx, opcode, badTarget) {
|
|
29
|
-
const n = ctx.immValue(target, env);
|
|
30
|
-
if (n === undefined || n < -128 || n > 127) {
|
|
31
|
-
ctx.diag(diagnostics, node, badTarget);
|
|
32
|
-
return undefined;
|
|
33
|
-
}
|
|
34
|
-
return Uint8Array.of(opcode, n & 0xff);
|
|
35
|
-
}
|
|
36
|
-
export function encodeControlInstruction(node, env, diagnostics, ctx) {
|
|
37
|
-
const head = node.head.toLowerCase();
|
|
38
|
-
const ops = node.operands;
|
|
39
|
-
if (head === 'ret' && ops.length === 0)
|
|
40
|
-
return Uint8Array.of(0xc9);
|
|
41
|
-
if (head === 'ret' && ops.length === 1) {
|
|
42
|
-
const cc = ctx.conditionName(ops[0]);
|
|
43
|
-
const opcode = cc ? ctx.retConditionOpcode(cc) : undefined;
|
|
44
|
-
if (opcode === undefined) {
|
|
45
|
-
ctx.diag(diagnostics, node, `ret cc expects a valid condition code`);
|
|
46
|
-
return undefined;
|
|
47
|
-
}
|
|
48
|
-
return Uint8Array.of(opcode);
|
|
49
|
-
}
|
|
50
|
-
if (head === 'ret') {
|
|
51
|
-
ctx.diag(diagnostics, node, `ret expects no operands or one condition code`);
|
|
52
|
-
return undefined;
|
|
53
|
-
}
|
|
54
|
-
if (head === 'call' && ops.length === 1) {
|
|
55
|
-
if (rejectUnsupportedDirectTarget(node, ops[0], env, diagnostics, ctx, {
|
|
56
|
-
indirect: 'call does not support indirect targets; use imm16',
|
|
57
|
-
register: 'call does not support register targets; use imm16',
|
|
58
|
-
})) {
|
|
59
|
-
return undefined;
|
|
60
|
-
}
|
|
61
|
-
const cc = ctx.conditionName(ops[0]) ?? ctx.symbolicImmBaseName(ops[0], env);
|
|
62
|
-
if (cc && ctx.callConditionOpcode(cc) !== undefined) {
|
|
63
|
-
ctx.diag(diagnostics, node, `call cc, nn expects two operands (cc, nn)`);
|
|
64
|
-
return undefined;
|
|
65
|
-
}
|
|
66
|
-
const n = ctx.immValue(ops[0], env);
|
|
67
|
-
if (n === undefined || !ctx.fitsImm16(n)) {
|
|
68
|
-
ctx.diag(diagnostics, node, `call expects imm16`);
|
|
69
|
-
return undefined;
|
|
70
|
-
}
|
|
71
|
-
return Uint8Array.of(0xcd, n & 0xff, (n >> 8) & 0xff);
|
|
72
|
-
}
|
|
73
|
-
if (head === 'call' && ops.length === 2) {
|
|
74
|
-
const cc = ctx.conditionName(ops[0]);
|
|
75
|
-
return encodeConditionalAbs16(node, ops[1], env, diagnostics, ctx, cc ? ctx.callConditionOpcode(cc) : undefined, {
|
|
76
|
-
badCondition: 'call cc expects valid condition code NZ/Z/NC/C/PO/PE/P/M',
|
|
77
|
-
indirectTarget: 'call cc, nn does not support indirect targets',
|
|
78
|
-
badTarget: 'call cc, nn expects imm16',
|
|
79
|
-
});
|
|
80
|
-
}
|
|
81
|
-
if (head === 'call') {
|
|
82
|
-
ctx.diag(diagnostics, node, `call expects one operand (nn) or two operands (cc, nn)`);
|
|
83
|
-
return undefined;
|
|
84
|
-
}
|
|
85
|
-
if (head === 'djnz' && ops.length === 1) {
|
|
86
|
-
if (rejectUnsupportedDirectTarget(node, ops[0], env, diagnostics, ctx, {
|
|
87
|
-
indirect: 'djnz does not support indirect targets; expects disp8',
|
|
88
|
-
register: 'djnz does not support register targets; expects disp8',
|
|
89
|
-
})) {
|
|
90
|
-
return undefined;
|
|
91
|
-
}
|
|
92
|
-
return encodeRelativeDisp8(node, ops[0], env, diagnostics, ctx, 0x10, 'djnz expects disp8');
|
|
93
|
-
}
|
|
94
|
-
if (head === 'djnz') {
|
|
95
|
-
ctx.diag(diagnostics, node, `djnz expects one operand (disp8)`);
|
|
96
|
-
return undefined;
|
|
97
|
-
}
|
|
98
|
-
if (head === 'jp' && ops.length === 1) {
|
|
99
|
-
if (ops[0].kind === 'Mem') {
|
|
100
|
-
if (ctx.isMemRegName(ops[0], 'HL'))
|
|
101
|
-
return Uint8Array.of(0xe9);
|
|
102
|
-
if (ctx.isMemRegName(ops[0], 'IX'))
|
|
103
|
-
return Uint8Array.of(0xdd, 0xe9);
|
|
104
|
-
if (ctx.isMemRegName(ops[0], 'IY'))
|
|
105
|
-
return Uint8Array.of(0xfd, 0xe9);
|
|
106
|
-
ctx.diag(diagnostics, node, `jp indirect form supports (hl), (ix), or (iy) only`);
|
|
107
|
-
return undefined;
|
|
108
|
-
}
|
|
109
|
-
const jpReg = ctx.registerTokenName(ops[0]);
|
|
110
|
-
const jpImm = ctx.immValue(ops[0], env);
|
|
111
|
-
if (jpReg !== undefined && jpImm === undefined) {
|
|
112
|
-
if (jpReg === 'HL' || jpReg === 'IX' || jpReg === 'IY') {
|
|
113
|
-
ctx.diag(diagnostics, node, `jp indirect form requires parentheses; use (hl), (ix), or (iy)`);
|
|
114
|
-
return undefined;
|
|
115
|
-
}
|
|
116
|
-
ctx.diag(diagnostics, node, `jp does not support register targets; use imm16`);
|
|
117
|
-
return undefined;
|
|
118
|
-
}
|
|
119
|
-
const cc = ctx.conditionName(ops[0]) ?? ctx.symbolicImmBaseName(ops[0], env);
|
|
120
|
-
if (cc && ctx.jpConditionOpcode(cc) !== undefined) {
|
|
121
|
-
ctx.diag(diagnostics, node, `jp cc, nn expects two operands (cc, nn)`);
|
|
122
|
-
return undefined;
|
|
123
|
-
}
|
|
124
|
-
const n = jpImm;
|
|
125
|
-
if (n === undefined || !ctx.fitsImm16(n)) {
|
|
126
|
-
ctx.diag(diagnostics, node, `jp expects imm16`);
|
|
127
|
-
return undefined;
|
|
128
|
-
}
|
|
129
|
-
return Uint8Array.of(0xc3, n & 0xff, (n >> 8) & 0xff);
|
|
130
|
-
}
|
|
131
|
-
if (head === 'jp' && ops.length === 2) {
|
|
132
|
-
const cc = ctx.conditionName(ops[0]);
|
|
133
|
-
return encodeConditionalAbs16(node, ops[1], env, diagnostics, ctx, cc ? ctx.jpConditionOpcode(cc) : undefined, {
|
|
134
|
-
badCondition: 'jp cc expects valid condition code NZ/Z/NC/C/PO/PE/P/M',
|
|
135
|
-
indirectTarget: 'jp cc, nn does not support indirect targets',
|
|
136
|
-
badTarget: 'jp cc, nn expects imm16',
|
|
137
|
-
});
|
|
138
|
-
}
|
|
139
|
-
if (head === 'jp') {
|
|
140
|
-
ctx.diag(diagnostics, node, `jp expects one operand (nn/(hl)/(ix)/(iy)) or two operands (cc, nn)`);
|
|
141
|
-
return undefined;
|
|
142
|
-
}
|
|
143
|
-
if (head === 'jr' && ops.length === 1) {
|
|
144
|
-
if (rejectUnsupportedDirectTarget(node, ops[0], env, diagnostics, ctx, {
|
|
145
|
-
indirect: 'jr does not support indirect targets; expects disp8',
|
|
146
|
-
register: 'jr does not support register targets; expects disp8',
|
|
147
|
-
})) {
|
|
148
|
-
return undefined;
|
|
149
|
-
}
|
|
150
|
-
const cc = ctx.conditionName(ops[0]) ?? ctx.symbolicImmBaseName(ops[0], env);
|
|
151
|
-
if (cc && ctx.jrConditionOpcode(cc) !== undefined) {
|
|
152
|
-
ctx.diag(diagnostics, node, `jr cc, disp expects two operands (cc, disp8)`);
|
|
153
|
-
return undefined;
|
|
154
|
-
}
|
|
155
|
-
return encodeRelativeDisp8(node, ops[0], env, diagnostics, ctx, 0x18, 'jr expects disp8');
|
|
156
|
-
}
|
|
157
|
-
if (head === 'jr' && ops.length === 2) {
|
|
158
|
-
const cc = ctx.conditionName(ops[0]);
|
|
159
|
-
const opcode = cc ? ctx.jrConditionOpcode(cc) : undefined;
|
|
160
|
-
if (opcode === undefined) {
|
|
161
|
-
ctx.diag(diagnostics, node, `jr cc expects valid condition code NZ/Z/NC/C`);
|
|
162
|
-
return undefined;
|
|
163
|
-
}
|
|
164
|
-
if (ops[1].kind === 'Mem') {
|
|
165
|
-
ctx.diag(diagnostics, node, `jr cc, disp does not support indirect targets`);
|
|
166
|
-
return undefined;
|
|
167
|
-
}
|
|
168
|
-
const n = ctx.immValue(ops[1], env);
|
|
169
|
-
if (n === undefined || n < -128 || n > 127) {
|
|
170
|
-
ctx.diag(diagnostics, node, `jr cc, disp expects disp8`);
|
|
171
|
-
return undefined;
|
|
172
|
-
}
|
|
173
|
-
return Uint8Array.of(opcode, n & 0xff);
|
|
174
|
-
}
|
|
175
|
-
if (head === 'jr') {
|
|
176
|
-
ctx.diag(diagnostics, node, `jr expects one operand (disp8) or two operands (cc, disp8)`);
|
|
177
|
-
return undefined;
|
|
178
|
-
}
|
|
179
|
-
return undefined;
|
|
180
|
-
}
|
|
@@ -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 { EncoderMemContext, EncoderRegisterContext } from './encodeContext.js';
|
|
5
|
-
type CoreOpsEncodeContext = EncoderRegisterContext & EncoderMemContext;
|
|
6
|
-
export declare function encodeCoreOpsInstruction(node: AsmInstructionNode, env: CompileEnv, diagnostics: Diagnostic[], ctx: CoreOpsEncodeContext): Uint8Array | undefined;
|
|
7
|
-
export {};
|
|
@@ -1,131 +0,0 @@
|
|
|
1
|
-
function isMemSP(op) {
|
|
2
|
-
return op.kind === 'Mem' && op.expr.kind === 'EaName' && op.expr.name.toUpperCase() === 'SP';
|
|
3
|
-
}
|
|
4
|
-
const INC_SPEC = {
|
|
5
|
-
mnemonic: 'inc',
|
|
6
|
-
reg8Base: 0x04,
|
|
7
|
-
memOpcode: 0x34,
|
|
8
|
-
reg16Opcodes: {
|
|
9
|
-
BC: 0x03,
|
|
10
|
-
DE: 0x13,
|
|
11
|
-
HL: 0x23,
|
|
12
|
-
SP: 0x33,
|
|
13
|
-
IX: [0xdd, 0x23],
|
|
14
|
-
IY: [0xfd, 0x23],
|
|
15
|
-
},
|
|
16
|
-
};
|
|
17
|
-
const DEC_SPEC = {
|
|
18
|
-
mnemonic: 'dec',
|
|
19
|
-
reg8Base: 0x05,
|
|
20
|
-
memOpcode: 0x35,
|
|
21
|
-
reg16Opcodes: {
|
|
22
|
-
BC: 0x0b,
|
|
23
|
-
DE: 0x1b,
|
|
24
|
-
HL: 0x2b,
|
|
25
|
-
SP: 0x3b,
|
|
26
|
-
IX: [0xdd, 0x2b],
|
|
27
|
-
IY: [0xfd, 0x2b],
|
|
28
|
-
},
|
|
29
|
-
};
|
|
30
|
-
const PUSH_SPEC = {
|
|
31
|
-
mnemonic: 'push',
|
|
32
|
-
reg16Opcodes: {
|
|
33
|
-
BC: 0xc5,
|
|
34
|
-
DE: 0xd5,
|
|
35
|
-
HL: 0xe5,
|
|
36
|
-
AF: 0xf5,
|
|
37
|
-
IX: [0xdd, 0xe5],
|
|
38
|
-
IY: [0xfd, 0xe5],
|
|
39
|
-
},
|
|
40
|
-
};
|
|
41
|
-
const POP_SPEC = {
|
|
42
|
-
mnemonic: 'pop',
|
|
43
|
-
reg16Opcodes: {
|
|
44
|
-
BC: 0xc1,
|
|
45
|
-
DE: 0xd1,
|
|
46
|
-
HL: 0xe1,
|
|
47
|
-
AF: 0xf1,
|
|
48
|
-
IX: [0xdd, 0xe1],
|
|
49
|
-
IY: [0xfd, 0xe1],
|
|
50
|
-
},
|
|
51
|
-
};
|
|
52
|
-
function encodeIncDec(node, operand, env, diagnostics, ctx, spec) {
|
|
53
|
-
const indexed = ctx.indexedReg8(operand);
|
|
54
|
-
if (indexed)
|
|
55
|
-
return Uint8Array.of(indexed.prefix, spec.reg8Base + (indexed.code << 3));
|
|
56
|
-
const r = ctx.regName(operand);
|
|
57
|
-
if (r) {
|
|
58
|
-
const r8 = ctx.reg8Code(r);
|
|
59
|
-
if (r8 !== undefined) {
|
|
60
|
-
return Uint8Array.of(spec.reg8Base + (r8 << 3));
|
|
61
|
-
}
|
|
62
|
-
const reg16Opcode = spec.reg16Opcodes[r];
|
|
63
|
-
if (typeof reg16Opcode === 'number')
|
|
64
|
-
return Uint8Array.of(reg16Opcode);
|
|
65
|
-
if (reg16Opcode)
|
|
66
|
-
return Uint8Array.of(...reg16Opcode);
|
|
67
|
-
}
|
|
68
|
-
if (ctx.isMemHL(operand))
|
|
69
|
-
return Uint8Array.of(spec.memOpcode);
|
|
70
|
-
const idx = ctx.memIndexed(operand, env);
|
|
71
|
-
if (idx) {
|
|
72
|
-
const disp = idx.disp;
|
|
73
|
-
if (disp < -128 || disp > 127) {
|
|
74
|
-
ctx.diag(diagnostics, node, `${spec.mnemonic} (ix/iy+disp) expects disp8`);
|
|
75
|
-
return undefined;
|
|
76
|
-
}
|
|
77
|
-
return Uint8Array.of(idx.prefix, spec.memOpcode, disp & 0xff);
|
|
78
|
-
}
|
|
79
|
-
ctx.diag(diagnostics, node, `${spec.mnemonic} expects r8/rr/(hl) operand`);
|
|
80
|
-
return undefined;
|
|
81
|
-
}
|
|
82
|
-
function encodeStackRegPair(node, operand, diagnostics, ctx, spec) {
|
|
83
|
-
const r16 = ctx.regName(operand);
|
|
84
|
-
if (!r16) {
|
|
85
|
-
ctx.diag(diagnostics, node, `${spec.mnemonic} expects reg16`);
|
|
86
|
-
return undefined;
|
|
87
|
-
}
|
|
88
|
-
const opcode = spec.reg16Opcodes[r16];
|
|
89
|
-
if (typeof opcode === 'number')
|
|
90
|
-
return Uint8Array.of(opcode);
|
|
91
|
-
if (opcode)
|
|
92
|
-
return Uint8Array.of(...opcode);
|
|
93
|
-
ctx.diag(diagnostics, node, `${spec.mnemonic} supports BC/DE/HL/AF/IX/IY only`);
|
|
94
|
-
return undefined;
|
|
95
|
-
}
|
|
96
|
-
export function encodeCoreOpsInstruction(node, env, diagnostics, ctx) {
|
|
97
|
-
const head = node.head.toLowerCase();
|
|
98
|
-
const ops = node.operands;
|
|
99
|
-
if (head === 'inc' && ops.length === 1) {
|
|
100
|
-
return encodeIncDec(node, ops[0], env, diagnostics, ctx, INC_SPEC);
|
|
101
|
-
}
|
|
102
|
-
if (head === 'dec' && ops.length === 1) {
|
|
103
|
-
return encodeIncDec(node, ops[0], env, diagnostics, ctx, DEC_SPEC);
|
|
104
|
-
}
|
|
105
|
-
if (head === 'push' && ops.length === 1) {
|
|
106
|
-
return encodeStackRegPair(node, ops[0], diagnostics, ctx, PUSH_SPEC);
|
|
107
|
-
}
|
|
108
|
-
if (head === 'pop' && ops.length === 1) {
|
|
109
|
-
return encodeStackRegPair(node, ops[0], diagnostics, ctx, POP_SPEC);
|
|
110
|
-
}
|
|
111
|
-
if (head === 'ex' && ops.length === 2) {
|
|
112
|
-
const a = ctx.regName(ops[0]);
|
|
113
|
-
const b = ctx.regName(ops[1]);
|
|
114
|
-
if ((a === "AF'" && b === 'AF') || (a === 'AF' && b === "AF'"))
|
|
115
|
-
return Uint8Array.of(0x08);
|
|
116
|
-
if ((a === 'DE' && b === 'HL') || (a === 'HL' && b === 'DE'))
|
|
117
|
-
return Uint8Array.of(0xeb);
|
|
118
|
-
if ((isMemSP(ops[0]) && b === 'HL') || (isMemSP(ops[1]) && a === 'HL')) {
|
|
119
|
-
return Uint8Array.of(0xe3);
|
|
120
|
-
}
|
|
121
|
-
if ((isMemSP(ops[0]) && b === 'IX') || (isMemSP(ops[1]) && a === 'IX')) {
|
|
122
|
-
return Uint8Array.of(0xdd, 0xe3);
|
|
123
|
-
}
|
|
124
|
-
if ((isMemSP(ops[0]) && b === 'IY') || (isMemSP(ops[1]) && a === 'IY')) {
|
|
125
|
-
return Uint8Array.of(0xfd, 0xe3);
|
|
126
|
-
}
|
|
127
|
-
ctx.diag(diagnostics, node, `ex supports "AF, AF'", "DE, HL", "(SP), HL", "(SP), IX", and "(SP), IY" only`);
|
|
128
|
-
return undefined;
|
|
129
|
-
}
|
|
130
|
-
return undefined;
|
|
131
|
-
}
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import type { Diagnostic } from '../diagnosticTypes.js';
|
|
2
|
-
import type { AsmInstructionNode, AsmOperandNode } from '../frontend/ast.js';
|
|
3
|
-
import type { CompileEnv } from '../semantics/env.js';
|
|
4
|
-
import type { EncoderImmContext, EncoderRegisterContext } from './encodeContext.js';
|
|
5
|
-
type IoEncodeContext = EncoderRegisterContext & EncoderImmContext & {
|
|
6
|
-
portImmValue: (op: AsmOperandNode, env: CompileEnv) => number | undefined;
|
|
7
|
-
};
|
|
8
|
-
export declare function encodeIoInstruction(node: AsmInstructionNode, env: CompileEnv, diagnostics: Diagnostic[], ctx: IoEncodeContext): Uint8Array | undefined;
|
|
9
|
-
export {};
|
|
@@ -1,128 +0,0 @@
|
|
|
1
|
-
function outSourceReg8(node, diagnostics, ctx, operand) {
|
|
2
|
-
const name = ctx.regName(operand);
|
|
3
|
-
const code = name ? ctx.reg8Code(name) : undefined;
|
|
4
|
-
if (name !== undefined && code !== undefined)
|
|
5
|
-
return { name, code };
|
|
6
|
-
if (ctx.indexedReg8(operand)) {
|
|
7
|
-
ctx.diag(diagnostics, node, `out source must use plain reg8 B/C/D/E/H/L/A`);
|
|
8
|
-
return undefined;
|
|
9
|
-
}
|
|
10
|
-
ctx.diag(diagnostics, node, `out expects a reg8 source`);
|
|
11
|
-
return undefined;
|
|
12
|
-
}
|
|
13
|
-
function immediatePortByte(node, env, diagnostics, ctx, port, message) {
|
|
14
|
-
const n = ctx.portImmValue(port, env);
|
|
15
|
-
if (n === undefined || !ctx.fitsImm8(n)) {
|
|
16
|
-
ctx.diag(diagnostics, node, message);
|
|
17
|
-
return undefined;
|
|
18
|
-
}
|
|
19
|
-
return n & 0xff;
|
|
20
|
-
}
|
|
21
|
-
export function encodeIoInstruction(node, env, diagnostics, ctx) {
|
|
22
|
-
const head = node.head.toLowerCase();
|
|
23
|
-
const ops = node.operands;
|
|
24
|
-
if (head === 'rst' && ops.length === 1) {
|
|
25
|
-
const n = ctx.immValue(ops[0], env);
|
|
26
|
-
if (n === undefined || n < 0 || n > 0x38 || (n & 0x07) !== 0) {
|
|
27
|
-
ctx.diag(diagnostics, node, `rst expects an imm8 multiple of 8 (0..56)`);
|
|
28
|
-
return undefined;
|
|
29
|
-
}
|
|
30
|
-
return Uint8Array.of(0xc7 + n);
|
|
31
|
-
}
|
|
32
|
-
if (head === 'rst') {
|
|
33
|
-
ctx.diag(diagnostics, node, `rst expects one operand`);
|
|
34
|
-
return undefined;
|
|
35
|
-
}
|
|
36
|
-
if (head === 'im' && ops.length === 1) {
|
|
37
|
-
const n = ctx.immValue(ops[0], env);
|
|
38
|
-
if (n === 0)
|
|
39
|
-
return Uint8Array.of(0xed, 0x46);
|
|
40
|
-
if (n === 1)
|
|
41
|
-
return Uint8Array.of(0xed, 0x56);
|
|
42
|
-
if (n === 2)
|
|
43
|
-
return Uint8Array.of(0xed, 0x5e);
|
|
44
|
-
ctx.diag(diagnostics, node, `im expects 0, 1, or 2`);
|
|
45
|
-
return undefined;
|
|
46
|
-
}
|
|
47
|
-
if (head === 'im') {
|
|
48
|
-
ctx.diag(diagnostics, node, `im expects one operand`);
|
|
49
|
-
return undefined;
|
|
50
|
-
}
|
|
51
|
-
if (head === 'in' && ops.length === 1) {
|
|
52
|
-
if (ops[0].kind === 'PortC') {
|
|
53
|
-
return Uint8Array.of(0xed, 0x70);
|
|
54
|
-
}
|
|
55
|
-
ctx.diag(diagnostics, node, `in (c) is the only one-operand in form`);
|
|
56
|
-
return undefined;
|
|
57
|
-
}
|
|
58
|
-
if (head === 'in' && ops.length === 2) {
|
|
59
|
-
const dst = ctx.regName(ops[0]);
|
|
60
|
-
const dst8 = dst ? ctx.reg8Code(dst) : undefined;
|
|
61
|
-
if (dst8 === undefined) {
|
|
62
|
-
if (ctx.indexedReg8(ops[0])) {
|
|
63
|
-
ctx.diag(diagnostics, node, `in destination must use plain reg8 B/C/D/E/H/L/A`);
|
|
64
|
-
return undefined;
|
|
65
|
-
}
|
|
66
|
-
ctx.diag(diagnostics, node, `in expects a reg8 destination`);
|
|
67
|
-
return undefined;
|
|
68
|
-
}
|
|
69
|
-
const port = ops[1];
|
|
70
|
-
if (port.kind === 'PortC') {
|
|
71
|
-
return Uint8Array.of(0xed, 0x40 + (dst8 << 3));
|
|
72
|
-
}
|
|
73
|
-
if (port.kind === 'PortImm8') {
|
|
74
|
-
if (dst !== 'A') {
|
|
75
|
-
ctx.diag(diagnostics, node, `in a,(n) immediate port form requires destination A`);
|
|
76
|
-
return undefined;
|
|
77
|
-
}
|
|
78
|
-
const n = immediatePortByte(node, env, diagnostics, ctx, port, `in a,(n) expects an imm8 port number`);
|
|
79
|
-
if (n === undefined)
|
|
80
|
-
return undefined;
|
|
81
|
-
return Uint8Array.of(0xdb, n);
|
|
82
|
-
}
|
|
83
|
-
ctx.diag(diagnostics, node, `in expects a port operand (c) or (imm8)`);
|
|
84
|
-
return undefined;
|
|
85
|
-
}
|
|
86
|
-
if (head === 'in') {
|
|
87
|
-
ctx.diag(diagnostics, node, `in expects one or two operands`);
|
|
88
|
-
return undefined;
|
|
89
|
-
}
|
|
90
|
-
if (head === 'out' && ops.length === 2) {
|
|
91
|
-
const port = ops[0];
|
|
92
|
-
const srcOp = ops[1];
|
|
93
|
-
if (port.kind === 'PortC') {
|
|
94
|
-
if (srcOp.kind === 'Imm') {
|
|
95
|
-
const n = ctx.immValue(srcOp, env);
|
|
96
|
-
if (n === 0) {
|
|
97
|
-
return Uint8Array.of(0xed, 0x71);
|
|
98
|
-
}
|
|
99
|
-
ctx.diag(diagnostics, node, `out (c), n immediate form supports n=0 only`);
|
|
100
|
-
return undefined;
|
|
101
|
-
}
|
|
102
|
-
const src = outSourceReg8(node, diagnostics, ctx, srcOp);
|
|
103
|
-
if (!src)
|
|
104
|
-
return undefined;
|
|
105
|
-
return Uint8Array.of(0xed, 0x41 + (src.code << 3));
|
|
106
|
-
}
|
|
107
|
-
if (port.kind === 'PortImm8') {
|
|
108
|
-
const src = outSourceReg8(node, diagnostics, ctx, srcOp);
|
|
109
|
-
if (!src)
|
|
110
|
-
return undefined;
|
|
111
|
-
if (src.name !== 'A') {
|
|
112
|
-
ctx.diag(diagnostics, node, `out (n),a immediate port form requires source A`);
|
|
113
|
-
return undefined;
|
|
114
|
-
}
|
|
115
|
-
const n = immediatePortByte(node, env, diagnostics, ctx, port, `out (n),a expects an imm8 port number`);
|
|
116
|
-
if (n === undefined)
|
|
117
|
-
return undefined;
|
|
118
|
-
return Uint8Array.of(0xd3, n);
|
|
119
|
-
}
|
|
120
|
-
ctx.diag(diagnostics, node, `out expects a port operand (c) or (imm8)`);
|
|
121
|
-
return undefined;
|
|
122
|
-
}
|
|
123
|
-
if (head === 'out') {
|
|
124
|
-
ctx.diag(diagnostics, node, `out expects two operands`);
|
|
125
|
-
return undefined;
|
|
126
|
-
}
|
|
127
|
-
return undefined;
|
|
128
|
-
}
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import type { Diagnostic } from '../diagnosticTypes.js';
|
|
2
|
-
import type { AsmInstructionNode, AsmOperandNode } from '../frontend/ast.js';
|
|
3
|
-
import type { CompileEnv } from '../semantics/env.js';
|
|
4
|
-
import type { EncoderImmContext, EncoderMemContext, EncoderRegisterContext } from './encodeContext.js';
|
|
5
|
-
type LdEncodeContext = EncoderRegisterContext & EncoderImmContext & EncoderMemContext & {
|
|
6
|
-
fitsImm16: (value: number) => boolean;
|
|
7
|
-
memAbs16: (op: AsmOperandNode, env: CompileEnv) => number | undefined;
|
|
8
|
-
isMemRegName: (op: AsmOperandNode, reg: string) => boolean;
|
|
9
|
-
isReg16TransferName: (name: string | undefined) => boolean;
|
|
10
|
-
isPlainHLReg8: (name: string | undefined) => boolean;
|
|
11
|
-
};
|
|
12
|
-
export declare function encodeLdInstruction(node: AsmInstructionNode, env: CompileEnv, diagnostics: Diagnostic[], ctx: LdEncodeContext): Uint8Array | undefined;
|
|
13
|
-
export {};
|