@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,119 +0,0 @@
|
|
|
1
|
-
import { getZ80InstructionEffect } from '../z80/effects.js';
|
|
2
|
-
import { instructionSuccessors, labelIndex } from './controlFlow.js';
|
|
3
|
-
import { contractCarrierList } from './report.js';
|
|
4
|
-
import { joinSourceLines, splitSourceLines } from './sourceText.js';
|
|
5
|
-
function sameLocation(a, b) {
|
|
6
|
-
return a.file === b.file && a.line === b.line && a.column === b.column;
|
|
7
|
-
}
|
|
8
|
-
function isUnconditionalDirectCall(item) {
|
|
9
|
-
const effect = getZ80InstructionEffect(item.instruction);
|
|
10
|
-
return (effect.control.kind === 'call' &&
|
|
11
|
-
effect.control.target !== undefined &&
|
|
12
|
-
!effect.control.conditional);
|
|
13
|
-
}
|
|
14
|
-
function continuationReads(routine, callIndex, carriers) {
|
|
15
|
-
const labels = labelIndex(routine);
|
|
16
|
-
const confirmed = new Set();
|
|
17
|
-
const work = callIndex + 1 < routine.instructions.length
|
|
18
|
-
? [{ index: callIndex + 1, pending: [...new Set(carriers)] }]
|
|
19
|
-
: [];
|
|
20
|
-
const seen = new Set();
|
|
21
|
-
let steps = 0;
|
|
22
|
-
while (work.length > 0 && steps < 512) {
|
|
23
|
-
steps += 1;
|
|
24
|
-
const state = work.pop();
|
|
25
|
-
const pending = state.pending.filter((unit) => !confirmed.has(unit));
|
|
26
|
-
if (pending.length === 0)
|
|
27
|
-
continue;
|
|
28
|
-
const key = `${state.index}:${pending.join(',')}`;
|
|
29
|
-
if (seen.has(key))
|
|
30
|
-
continue;
|
|
31
|
-
seen.add(key);
|
|
32
|
-
const item = routine.instructions[state.index];
|
|
33
|
-
if (!item)
|
|
34
|
-
continue;
|
|
35
|
-
const effect = getZ80InstructionEffect(item.instruction);
|
|
36
|
-
const reads = new Set(effect.reads);
|
|
37
|
-
const writes = new Set(effect.writes);
|
|
38
|
-
const remaining = [];
|
|
39
|
-
for (const unit of pending) {
|
|
40
|
-
if (reads.has(unit)) {
|
|
41
|
-
confirmed.add(unit);
|
|
42
|
-
continue;
|
|
43
|
-
}
|
|
44
|
-
if (!writes.has(unit))
|
|
45
|
-
remaining.push(unit);
|
|
46
|
-
}
|
|
47
|
-
if (remaining.length === 0)
|
|
48
|
-
continue;
|
|
49
|
-
for (const next of instructionSuccessors(routine, state.index, effect, labels)) {
|
|
50
|
-
work.push({ index: next, pending: remaining });
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
return carriers.filter((unit) => confirmed.has(unit));
|
|
54
|
-
}
|
|
55
|
-
export function findExpectOutFixes(routines, candidates) {
|
|
56
|
-
const out = [];
|
|
57
|
-
for (const routine of routines) {
|
|
58
|
-
for (let index = 0; index < routine.instructions.length; index += 1) {
|
|
59
|
-
const item = routine.instructions[index];
|
|
60
|
-
if (!isUnconditionalDirectCall(item))
|
|
61
|
-
continue;
|
|
62
|
-
const candidate = candidates.find((entry) => sameLocation(item, entry));
|
|
63
|
-
if (!candidate)
|
|
64
|
-
continue;
|
|
65
|
-
const carriers = continuationReads(routine, index, candidate.carriers);
|
|
66
|
-
if (carriers.length === 0)
|
|
67
|
-
continue;
|
|
68
|
-
out.push({ ...candidate, carriers });
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
return out;
|
|
72
|
-
}
|
|
73
|
-
function isExpectOutLine(line) {
|
|
74
|
-
return /^\s*;\s*expects\s+out\b/i.test(line);
|
|
75
|
-
}
|
|
76
|
-
function expectedCallLine(originalLines, fix) {
|
|
77
|
-
return originalLines[fix.line - 1]?.trim();
|
|
78
|
-
}
|
|
79
|
-
function findCallLineIndex(lines, originalLines, fix) {
|
|
80
|
-
const expected = expectedCallLine(originalLines, fix);
|
|
81
|
-
if (!expected)
|
|
82
|
-
return undefined;
|
|
83
|
-
const preferred = fix.line - 1;
|
|
84
|
-
if (lines[preferred]?.trim() === expected)
|
|
85
|
-
return preferred;
|
|
86
|
-
let best;
|
|
87
|
-
let bestDistance = Number.POSITIVE_INFINITY;
|
|
88
|
-
for (let index = 0; index < lines.length; index += 1) {
|
|
89
|
-
if (lines[index]?.trim() !== expected)
|
|
90
|
-
continue;
|
|
91
|
-
const distance = Math.abs(index - preferred);
|
|
92
|
-
if (distance < bestDistance) {
|
|
93
|
-
best = index;
|
|
94
|
-
bestDistance = distance;
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
return best;
|
|
98
|
-
}
|
|
99
|
-
function indentation(line) {
|
|
100
|
-
return line.match(/^\s*/)?.[0] ?? '';
|
|
101
|
-
}
|
|
102
|
-
export function applyExpectOutFixesToSource(source, fixes, referenceSource = source) {
|
|
103
|
-
if (fixes.length === 0)
|
|
104
|
-
return source;
|
|
105
|
-
const originalLines = referenceSource.split(/\r?\n/);
|
|
106
|
-
const sourceLines = splitSourceLines(source);
|
|
107
|
-
const { lines } = sourceLines;
|
|
108
|
-
const sorted = [...fixes].sort((a, b) => b.line - a.line || b.column - a.column);
|
|
109
|
-
for (const fix of sorted) {
|
|
110
|
-
const index = findCallLineIndex(lines, originalLines, fix);
|
|
111
|
-
if (index === undefined)
|
|
112
|
-
continue;
|
|
113
|
-
if (index > 0 && isExpectOutLine(lines[index - 1] ?? ''))
|
|
114
|
-
continue;
|
|
115
|
-
const prefix = indentation(lines[index] ?? '');
|
|
116
|
-
lines.splice(index, 0, `${prefix}; expects out ${contractCarrierList(fix.carriers)}`);
|
|
117
|
-
}
|
|
118
|
-
return joinSourceLines(sourceLines);
|
|
119
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
import { type Diagnostic } from '../diagnosticTypes.js';
|
|
2
|
-
import type { LocatedSmartComment, RegisterCareConflict, RegisterCareOutputCandidate, RegisterCareRoutine, RegisterCareUnit, RoutineSummary } from './types.js';
|
|
3
|
-
export declare function findRegisterCareConflicts(routine: RegisterCareRoutine, summaries: Map<string, RoutineSummary>, hints: LocatedSmartComment[]): RegisterCareConflict[];
|
|
4
|
-
export declare function findCallerOutputCandidateObservations(routines: RegisterCareRoutine[], summaries: Map<string, RoutineSummary>): RegisterCareOutputCandidate[];
|
|
5
|
-
export declare function findCallerOutputCandidates(routines: RegisterCareRoutine[], summaries: Map<string, RoutineSummary>): Map<string, RegisterCareUnit[]>;
|
|
6
|
-
export declare function findAcceptedOutputCandidatesFromHints(routines: RegisterCareRoutine[], summaries: Map<string, RoutineSummary>, hints: LocatedSmartComment[]): Map<string, RegisterCareUnit[]>;
|
|
7
|
-
export declare function diagnosticsForRegisterCareConflicts(conflicts: RegisterCareConflict[], severity: 'warning' | 'error'): Diagnostic[];
|
|
@@ -1,227 +0,0 @@
|
|
|
1
|
-
import { DiagnosticIds } from '../diagnosticTypes.js';
|
|
2
|
-
import { getZ80InstructionEffect } from '../z80/effects.js';
|
|
3
|
-
import { precedingCServiceName } from './boundaryHints.js';
|
|
4
|
-
import { instructionSuccessors, labelIndex } from './controlFlow.js';
|
|
5
|
-
import { rstServiceTargetName, rstTargetName } from './profiles.js';
|
|
6
|
-
function unique(units) {
|
|
7
|
-
return [...new Set(units)];
|
|
8
|
-
}
|
|
9
|
-
function withImpliedFlagUnits(units) {
|
|
10
|
-
return unique(units);
|
|
11
|
-
}
|
|
12
|
-
function boundaryTarget(routine, index, effect) {
|
|
13
|
-
const item = routine.instructions[index];
|
|
14
|
-
if (effect.control.kind === 'call' && effect.control.target) {
|
|
15
|
-
return {
|
|
16
|
-
targets: [effect.control.target],
|
|
17
|
-
conditional: effect.control.conditional,
|
|
18
|
-
subject: `CALL ${effect.control.target}`,
|
|
19
|
-
};
|
|
20
|
-
}
|
|
21
|
-
if (effect.control.kind === 'jump' &&
|
|
22
|
-
item?.head.toLowerCase() === 'jp' &&
|
|
23
|
-
!effect.control.conditional &&
|
|
24
|
-
effect.control.target &&
|
|
25
|
-
!effect.control.target.startsWith('.')) {
|
|
26
|
-
return {
|
|
27
|
-
targets: [effect.control.target],
|
|
28
|
-
conditional: false,
|
|
29
|
-
subject: `JP ${effect.control.target}`,
|
|
30
|
-
};
|
|
31
|
-
}
|
|
32
|
-
if (effect.control.kind === 'rst' && effect.control.vector !== undefined) {
|
|
33
|
-
const target = rstTargetName(effect.control.vector);
|
|
34
|
-
const service = precedingCServiceName(routine.instructions[index - 1]);
|
|
35
|
-
const targets = service
|
|
36
|
-
? [rstServiceTargetName(effect.control.vector, service), target]
|
|
37
|
-
: [target];
|
|
38
|
-
return { targets, conditional: false, subject: target };
|
|
39
|
-
}
|
|
40
|
-
return undefined;
|
|
41
|
-
}
|
|
42
|
-
function summaryForBoundary(boundary, summaries) {
|
|
43
|
-
for (const target of boundary.targets) {
|
|
44
|
-
const summary = summaries.get(target);
|
|
45
|
-
if (summary)
|
|
46
|
-
return { target, summary };
|
|
47
|
-
}
|
|
48
|
-
return undefined;
|
|
49
|
-
}
|
|
50
|
-
function hintUnitsForLine(hints, file, callLine) {
|
|
51
|
-
const prior = hints.find((hint) => hint.file === file && hint.line === callLine - 1 && hint.comment.kind === 'expectOut');
|
|
52
|
-
return prior?.comment.kind === 'expectOut' ? withImpliedFlagUnits(prior.comment.carriers) : [];
|
|
53
|
-
}
|
|
54
|
-
function outputUnits(summary) {
|
|
55
|
-
return withImpliedFlagUnits(summary.valueRelations.flatMap((relation) => relation.out));
|
|
56
|
-
}
|
|
57
|
-
function setEqual(left, right) {
|
|
58
|
-
if (left.size !== right.size)
|
|
59
|
-
return false;
|
|
60
|
-
for (const item of left)
|
|
61
|
-
if (!right.has(item))
|
|
62
|
-
return false;
|
|
63
|
-
return true;
|
|
64
|
-
}
|
|
65
|
-
function unionLive(sets) {
|
|
66
|
-
const out = new Set();
|
|
67
|
-
for (const set of sets) {
|
|
68
|
-
for (const unit of set)
|
|
69
|
-
out.add(unit);
|
|
70
|
-
}
|
|
71
|
-
return out;
|
|
72
|
-
}
|
|
73
|
-
function transferLiveBefore(item, effect, boundary, summary, liveAfter, hints) {
|
|
74
|
-
const live = new Set(liveAfter);
|
|
75
|
-
if (boundary && summary) {
|
|
76
|
-
const accepted = new Set();
|
|
77
|
-
for (const unit of hintUnitsForLine(hints, item.file, item.line))
|
|
78
|
-
accepted.add(unit);
|
|
79
|
-
for (const unit of outputUnits(summary))
|
|
80
|
-
accepted.add(unit);
|
|
81
|
-
if (!boundary.conditional) {
|
|
82
|
-
for (const unit of summary.mayWrite)
|
|
83
|
-
live.delete(unit);
|
|
84
|
-
for (const unit of accepted)
|
|
85
|
-
live.delete(unit);
|
|
86
|
-
}
|
|
87
|
-
for (const unit of summary.mayRead)
|
|
88
|
-
live.add(unit);
|
|
89
|
-
}
|
|
90
|
-
const instructionWritesAreConditional = effect.control.kind === 'call' && effect.control.conditional;
|
|
91
|
-
if (!instructionWritesAreConditional) {
|
|
92
|
-
for (const unit of effect.writes)
|
|
93
|
-
live.delete(unit);
|
|
94
|
-
}
|
|
95
|
-
for (const unit of effect.reads)
|
|
96
|
-
live.add(unit);
|
|
97
|
-
return live;
|
|
98
|
-
}
|
|
99
|
-
function liveSetsForRoutine(routine, summaries, hints = []) {
|
|
100
|
-
const labels = labelIndex(routine);
|
|
101
|
-
const effects = routine.instructions.map((item) => getZ80InstructionEffect(item.instruction));
|
|
102
|
-
const boundaries = effects.map((effect, index) => boundaryTarget(routine, index, effect));
|
|
103
|
-
const resolvedSummaries = boundaries.map((boundary) => boundary ? summaryForBoundary(boundary, summaries)?.summary : undefined);
|
|
104
|
-
const successorIndexes = effects.map((effect, index) => instructionSuccessors(routine, index, effect, labels, { boundaryFallthrough: true }));
|
|
105
|
-
const liveIn = routine.instructions.map(() => new Set());
|
|
106
|
-
const liveOut = routine.instructions.map(() => new Set());
|
|
107
|
-
let changed = true;
|
|
108
|
-
let passes = 0;
|
|
109
|
-
while (changed && passes < Math.max(8, routine.instructions.length * 4)) {
|
|
110
|
-
changed = false;
|
|
111
|
-
passes += 1;
|
|
112
|
-
for (let index = routine.instructions.length - 1; index >= 0; index -= 1) {
|
|
113
|
-
const nextOut = unionLive(successorIndexes[index].map((successor) => liveIn[successor]));
|
|
114
|
-
const nextIn = transferLiveBefore(routine.instructions[index], effects[index], boundaries[index], resolvedSummaries[index], nextOut, hints);
|
|
115
|
-
if (!setEqual(nextOut, liveOut[index])) {
|
|
116
|
-
liveOut[index] = nextOut;
|
|
117
|
-
changed = true;
|
|
118
|
-
}
|
|
119
|
-
if (!setEqual(nextIn, liveIn[index])) {
|
|
120
|
-
liveIn[index] = nextIn;
|
|
121
|
-
changed = true;
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
return { liveIn, liveOut };
|
|
126
|
-
}
|
|
127
|
-
function resolvedBoundariesForRoutine(routine, summaries) {
|
|
128
|
-
const out = [];
|
|
129
|
-
for (let index = 0; index < routine.instructions.length; index += 1) {
|
|
130
|
-
const item = routine.instructions[index];
|
|
131
|
-
const effect = getZ80InstructionEffect(item.instruction);
|
|
132
|
-
const boundary = boundaryTarget(routine, index, effect);
|
|
133
|
-
if (!boundary)
|
|
134
|
-
continue;
|
|
135
|
-
const resolved = summaryForBoundary(boundary, summaries);
|
|
136
|
-
if (!resolved)
|
|
137
|
-
continue;
|
|
138
|
-
out.push({ item, index, boundary, target: resolved.target, summary: resolved.summary });
|
|
139
|
-
}
|
|
140
|
-
return out;
|
|
141
|
-
}
|
|
142
|
-
export function findRegisterCareConflicts(routine, summaries, hints) {
|
|
143
|
-
const conflicts = [];
|
|
144
|
-
const { liveOut } = liveSetsForRoutine(routine, summaries, hints);
|
|
145
|
-
for (const { item, index, boundary, target, summary } of resolvedBoundariesForRoutine(routine, summaries)) {
|
|
146
|
-
const accepted = new Set();
|
|
147
|
-
for (const unit of hintUnitsForLine(hints, item.file, item.line))
|
|
148
|
-
accepted.add(unit);
|
|
149
|
-
for (const unit of outputUnits(summary))
|
|
150
|
-
accepted.add(unit);
|
|
151
|
-
const carriers = unique(summary.mayWrite.filter((unit) => liveOut[index].has(unit) && !accepted.has(unit)));
|
|
152
|
-
if (carriers.length > 0) {
|
|
153
|
-
conflicts.push({
|
|
154
|
-
file: item.file,
|
|
155
|
-
line: item.line,
|
|
156
|
-
column: item.column,
|
|
157
|
-
callTarget: target,
|
|
158
|
-
carriers,
|
|
159
|
-
message: `${boundary.subject} may modify ${carriers.join(',')}, but the pre-call value is used later.`,
|
|
160
|
-
});
|
|
161
|
-
}
|
|
162
|
-
}
|
|
163
|
-
return conflicts;
|
|
164
|
-
}
|
|
165
|
-
function appendMapUnits(out, target, units) {
|
|
166
|
-
const existing = out.get(target) ?? [];
|
|
167
|
-
for (const unit of units) {
|
|
168
|
-
if (!existing.includes(unit))
|
|
169
|
-
existing.push(unit);
|
|
170
|
-
}
|
|
171
|
-
out.set(target, existing);
|
|
172
|
-
}
|
|
173
|
-
function candidateMessage(boundary, units) {
|
|
174
|
-
const carriers = units.join(',');
|
|
175
|
-
const expectation = units.length === 1 ? units[0] : `{${carriers}}`;
|
|
176
|
-
return `${boundary.subject} writes ${carriers} and caller reads it later; review the call site and add \`; expects out ${expectation}\` above the call if this is intentional.`;
|
|
177
|
-
}
|
|
178
|
-
export function findCallerOutputCandidateObservations(routines, summaries) {
|
|
179
|
-
const out = [];
|
|
180
|
-
for (const routine of routines) {
|
|
181
|
-
const { liveOut } = liveSetsForRoutine(routine, summaries);
|
|
182
|
-
for (const { item, index, boundary, target, summary } of resolvedBoundariesForRoutine(routine, summaries)) {
|
|
183
|
-
const alreadyOutput = new Set(outputUnits(summary));
|
|
184
|
-
const carriers = unique(summary.mayWrite.filter((unit) => liveOut[index].has(unit) && !alreadyOutput.has(unit)));
|
|
185
|
-
if (carriers.length > 0) {
|
|
186
|
-
out.push({
|
|
187
|
-
file: item.file,
|
|
188
|
-
line: item.line,
|
|
189
|
-
column: item.column,
|
|
190
|
-
routine: target,
|
|
191
|
-
carriers,
|
|
192
|
-
message: candidateMessage(boundary, carriers),
|
|
193
|
-
});
|
|
194
|
-
}
|
|
195
|
-
}
|
|
196
|
-
}
|
|
197
|
-
return out;
|
|
198
|
-
}
|
|
199
|
-
export function findCallerOutputCandidates(routines, summaries) {
|
|
200
|
-
const candidates = new Map();
|
|
201
|
-
for (const item of findCallerOutputCandidateObservations(routines, summaries)) {
|
|
202
|
-
appendMapUnits(candidates, item.routine, item.carriers);
|
|
203
|
-
}
|
|
204
|
-
return candidates;
|
|
205
|
-
}
|
|
206
|
-
export function findAcceptedOutputCandidatesFromHints(routines, summaries, hints) {
|
|
207
|
-
const accepted = new Map();
|
|
208
|
-
for (const routine of routines) {
|
|
209
|
-
for (const { item, target } of resolvedBoundariesForRoutine(routine, summaries)) {
|
|
210
|
-
const units = hintUnitsForLine(hints, item.file, item.line);
|
|
211
|
-
if (units.length === 0)
|
|
212
|
-
continue;
|
|
213
|
-
appendMapUnits(accepted, target, units);
|
|
214
|
-
}
|
|
215
|
-
}
|
|
216
|
-
return accepted;
|
|
217
|
-
}
|
|
218
|
-
export function diagnosticsForRegisterCareConflicts(conflicts, severity) {
|
|
219
|
-
return conflicts.map((conflict) => ({
|
|
220
|
-
id: DiagnosticIds.RegisterCareConflict,
|
|
221
|
-
severity,
|
|
222
|
-
message: conflict.message,
|
|
223
|
-
file: conflict.file,
|
|
224
|
-
line: conflict.line,
|
|
225
|
-
column: conflict.column,
|
|
226
|
-
}));
|
|
227
|
-
}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import type { RoutineSummary } from './types.js';
|
|
2
|
-
export type RegisterCareProfileName = 'mon3';
|
|
3
|
-
interface RegisterCareProfile {
|
|
4
|
-
name: RegisterCareProfileName;
|
|
5
|
-
rst: Map<number, RoutineSummary>;
|
|
6
|
-
rstServices: Map<string, RoutineSummary>;
|
|
7
|
-
}
|
|
8
|
-
export declare function rstTargetName(vector: number): string;
|
|
9
|
-
export declare function rstServiceTargetName(vector: number, service: string): string;
|
|
10
|
-
export declare function getRegisterCareProfile(name: RegisterCareProfileName | undefined): RegisterCareProfile | undefined;
|
|
11
|
-
export {};
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
const FLAG_UNITS = ['carry', 'zero', 'sign', 'parity', 'halfCarry'];
|
|
2
|
-
export function rstTargetName(vector) {
|
|
3
|
-
return `RST_$${vector.toString(16).toUpperCase().padStart(2, '0')}`;
|
|
4
|
-
}
|
|
5
|
-
function normalizeServiceName(service) {
|
|
6
|
-
return service.replace(/[^A-Za-z0-9]/gu, '').toUpperCase();
|
|
7
|
-
}
|
|
8
|
-
export function rstServiceTargetName(vector, service) {
|
|
9
|
-
return `${rstTargetName(vector)}:${normalizeServiceName(service)}`;
|
|
10
|
-
}
|
|
11
|
-
export function getRegisterCareProfile(name) {
|
|
12
|
-
if (name !== 'mon3')
|
|
13
|
-
return undefined;
|
|
14
|
-
return {
|
|
15
|
-
name: 'mon3',
|
|
16
|
-
rst: new Map([
|
|
17
|
-
[
|
|
18
|
-
0x10,
|
|
19
|
-
{
|
|
20
|
-
name: rstTargetName(0x10),
|
|
21
|
-
mayRead: [],
|
|
22
|
-
mayWrite: ['A', ...FLAG_UNITS],
|
|
23
|
-
preserved: ['B', 'C', 'D', 'E', 'H', 'L'],
|
|
24
|
-
valueRelations: [],
|
|
25
|
-
stackBalanced: true,
|
|
26
|
-
hasUnknownStackEffect: false,
|
|
27
|
-
},
|
|
28
|
-
],
|
|
29
|
-
]),
|
|
30
|
-
rstServices: new Map([
|
|
31
|
-
[
|
|
32
|
-
rstServiceTargetName(0x10, 'API_SCANKEYS'),
|
|
33
|
-
{
|
|
34
|
-
name: rstServiceTargetName(0x10, 'API_SCANKEYS'),
|
|
35
|
-
mayRead: ['C'],
|
|
36
|
-
mayWrite: ['sign', 'parity', 'halfCarry'],
|
|
37
|
-
preserved: ['B', 'C', 'D', 'E', 'H', 'L'],
|
|
38
|
-
valueRelations: [{ out: ['A', 'carry', 'zero'], from: [] }],
|
|
39
|
-
stackBalanced: true,
|
|
40
|
-
hasUnknownStackEffect: false,
|
|
41
|
-
},
|
|
42
|
-
],
|
|
43
|
-
]),
|
|
44
|
-
};
|
|
45
|
-
}
|
|
@@ -1,181 +0,0 @@
|
|
|
1
|
-
import { createInlineOpInstructionStreamExpander } from '../lowering/opExpansionStream.js';
|
|
2
|
-
function flattenItems(items, out, expandInstruction) {
|
|
3
|
-
for (const item of items) {
|
|
4
|
-
if (item.kind === 'AsmLabel') {
|
|
5
|
-
out.push({ kind: 'label', label: item });
|
|
6
|
-
continue;
|
|
7
|
-
}
|
|
8
|
-
if (item.kind === 'AsmInstruction') {
|
|
9
|
-
out.push(...expandInstruction(item));
|
|
10
|
-
}
|
|
11
|
-
}
|
|
12
|
-
}
|
|
13
|
-
function directCallTarget(inst) {
|
|
14
|
-
if (inst.head.toLowerCase() !== 'call')
|
|
15
|
-
return undefined;
|
|
16
|
-
if (inst.operands.length !== 1 && inst.operands.length !== 2)
|
|
17
|
-
return undefined;
|
|
18
|
-
const op = inst.operands[inst.operands.length - 1];
|
|
19
|
-
if (op?.kind !== 'Imm' || op.expr.kind !== 'ImmName')
|
|
20
|
-
return undefined;
|
|
21
|
-
return op.expr.name;
|
|
22
|
-
}
|
|
23
|
-
function directTailJumpTarget(inst, entryNames) {
|
|
24
|
-
if (inst.head.toLowerCase() !== 'jp')
|
|
25
|
-
return undefined;
|
|
26
|
-
if (inst.operands.length !== 1 && inst.operands.length !== 2)
|
|
27
|
-
return undefined;
|
|
28
|
-
if (inst.operands.length === 2 && entryNames === undefined)
|
|
29
|
-
return undefined;
|
|
30
|
-
const op = inst.operands[inst.operands.length - 1];
|
|
31
|
-
if (op?.kind !== 'Imm' || op.expr.kind !== 'ImmName')
|
|
32
|
-
return undefined;
|
|
33
|
-
if (op.expr.name.startsWith('.'))
|
|
34
|
-
return undefined;
|
|
35
|
-
if (entryNames !== undefined && !entryNames.has(op.expr.name))
|
|
36
|
-
return undefined;
|
|
37
|
-
return op.expr.name;
|
|
38
|
-
}
|
|
39
|
-
function toInstruction(inst, labels = []) {
|
|
40
|
-
return {
|
|
41
|
-
instruction: inst,
|
|
42
|
-
head: inst.head.toLowerCase(),
|
|
43
|
-
file: inst.span.file,
|
|
44
|
-
line: inst.span.start.line,
|
|
45
|
-
column: inst.span.start.column,
|
|
46
|
-
labels,
|
|
47
|
-
};
|
|
48
|
-
}
|
|
49
|
-
function spanFrom(start, end) {
|
|
50
|
-
if (start.file !== end.file)
|
|
51
|
-
return start;
|
|
52
|
-
return {
|
|
53
|
-
file: start.file,
|
|
54
|
-
start: start.start,
|
|
55
|
-
end: end.end,
|
|
56
|
-
};
|
|
57
|
-
}
|
|
58
|
-
function isLocalLabel(name) {
|
|
59
|
-
return name.startsWith('.');
|
|
60
|
-
}
|
|
61
|
-
function isEntryLabel(label) {
|
|
62
|
-
return label.isEntry === true;
|
|
63
|
-
}
|
|
64
|
-
function flatItemFile(item) {
|
|
65
|
-
return item.kind === 'label' ? item.label.span.file : item.instruction.span.file;
|
|
66
|
-
}
|
|
67
|
-
function isTerminalReturn(inst) {
|
|
68
|
-
const head = inst.head.toLowerCase();
|
|
69
|
-
if (head === 'ret')
|
|
70
|
-
return inst.operands.length === 0;
|
|
71
|
-
return head === 'retn' || head === 'reti';
|
|
72
|
-
}
|
|
73
|
-
export function buildRegisterCareProgramModel(program) {
|
|
74
|
-
const flat = [];
|
|
75
|
-
const { expandInstruction } = createInlineOpInstructionStreamExpander(program);
|
|
76
|
-
for (const file of program.files) {
|
|
77
|
-
flattenItems(file.items, flat, expandInstruction);
|
|
78
|
-
}
|
|
79
|
-
const labelItems = flat.filter((item) => item.kind === 'label');
|
|
80
|
-
const filesWithEntryLabels = new Set(labelItems.filter((item) => isEntryLabel(item.label)).map((item) => item.label.span.file));
|
|
81
|
-
const entryLabelNames = new Set(labelItems
|
|
82
|
-
.filter((item) => isEntryLabel(item.label) ||
|
|
83
|
-
(!filesWithEntryLabels.has(item.label.span.file) && !isLocalLabel(item.label.name)))
|
|
84
|
-
.map((item) => item.label.name));
|
|
85
|
-
const directCalls = flat.flatMap((item) => {
|
|
86
|
-
if (item.kind !== 'instruction')
|
|
87
|
-
return [];
|
|
88
|
-
const target = directCallTarget(item.instruction);
|
|
89
|
-
if (target === undefined)
|
|
90
|
-
return [];
|
|
91
|
-
return [
|
|
92
|
-
{
|
|
93
|
-
target,
|
|
94
|
-
subject: `CALL ${target}`,
|
|
95
|
-
file: item.instruction.span.file,
|
|
96
|
-
line: item.instruction.span.start.line,
|
|
97
|
-
column: item.instruction.span.start.column,
|
|
98
|
-
},
|
|
99
|
-
];
|
|
100
|
-
});
|
|
101
|
-
const directTailJumps = flat.flatMap((item) => {
|
|
102
|
-
if (item.kind !== 'instruction')
|
|
103
|
-
return [];
|
|
104
|
-
const sourceFileUsesEntryLabels = filesWithEntryLabels.has(item.instruction.span.file);
|
|
105
|
-
const target = directTailJumpTarget(item.instruction, sourceFileUsesEntryLabels ? entryLabelNames : undefined);
|
|
106
|
-
if (target === undefined)
|
|
107
|
-
return [];
|
|
108
|
-
return [
|
|
109
|
-
{
|
|
110
|
-
target,
|
|
111
|
-
subject: `JP ${target}`,
|
|
112
|
-
file: item.instruction.span.file,
|
|
113
|
-
line: item.instruction.span.start.line,
|
|
114
|
-
column: item.instruction.span.start.column,
|
|
115
|
-
},
|
|
116
|
-
];
|
|
117
|
-
});
|
|
118
|
-
const directBoundaries = [...directCalls, ...directTailJumps];
|
|
119
|
-
const directCallTargets = Array.from(new Set(directCalls.map((call) => call.target))).sort();
|
|
120
|
-
const routines = [];
|
|
121
|
-
const coalescedGlobalLabelIndexes = new Set();
|
|
122
|
-
for (let index = 0; index < flat.length; index += 1) {
|
|
123
|
-
const item = flat[index];
|
|
124
|
-
if (coalescedGlobalLabelIndexes.has(index))
|
|
125
|
-
continue;
|
|
126
|
-
if (item?.kind !== 'label' || isLocalLabel(item.label.name))
|
|
127
|
-
continue;
|
|
128
|
-
const routineFile = item.label.span.file;
|
|
129
|
-
const fileUsesEntryLabels = filesWithEntryLabels.has(routineFile);
|
|
130
|
-
if (fileUsesEntryLabels && !isEntryLabel(item.label))
|
|
131
|
-
continue;
|
|
132
|
-
const labels = [item.label.name];
|
|
133
|
-
const entryLabels = isEntryLabel(item.label) ? [item.label.name] : undefined;
|
|
134
|
-
const instructions = [];
|
|
135
|
-
let pendingInstructionLabels = [item.label.name];
|
|
136
|
-
let endSpan = item.label.span;
|
|
137
|
-
for (let rangeIndex = index + 1; rangeIndex < flat.length; rangeIndex += 1) {
|
|
138
|
-
const rangeItem = flat[rangeIndex];
|
|
139
|
-
if (!rangeItem)
|
|
140
|
-
break;
|
|
141
|
-
if (flatItemFile(rangeItem) !== routineFile)
|
|
142
|
-
break;
|
|
143
|
-
if (rangeItem.kind === 'label') {
|
|
144
|
-
if (fileUsesEntryLabels && isEntryLabel(rangeItem.label)) {
|
|
145
|
-
if (instructions.length > 0)
|
|
146
|
-
break;
|
|
147
|
-
labels.push(rangeItem.label.name);
|
|
148
|
-
entryLabels?.push(rangeItem.label.name);
|
|
149
|
-
coalescedGlobalLabelIndexes.add(rangeIndex);
|
|
150
|
-
endSpan = rangeItem.label.span;
|
|
151
|
-
continue;
|
|
152
|
-
}
|
|
153
|
-
if (!fileUsesEntryLabels && !isLocalLabel(rangeItem.label.name)) {
|
|
154
|
-
if (instructions.length > 0)
|
|
155
|
-
break;
|
|
156
|
-
labels.push(rangeItem.label.name);
|
|
157
|
-
coalescedGlobalLabelIndexes.add(rangeIndex);
|
|
158
|
-
endSpan = rangeItem.label.span;
|
|
159
|
-
continue;
|
|
160
|
-
}
|
|
161
|
-
labels.push(rangeItem.label.name);
|
|
162
|
-
pendingInstructionLabels.push(rangeItem.label.name);
|
|
163
|
-
endSpan = rangeItem.label.span;
|
|
164
|
-
continue;
|
|
165
|
-
}
|
|
166
|
-
instructions.push(toInstruction(rangeItem.instruction, pendingInstructionLabels));
|
|
167
|
-
pendingInstructionLabels = [];
|
|
168
|
-
endSpan = rangeItem.instruction.span;
|
|
169
|
-
if (isTerminalReturn(rangeItem.instruction))
|
|
170
|
-
break;
|
|
171
|
-
}
|
|
172
|
-
routines.push({
|
|
173
|
-
name: item.label.name,
|
|
174
|
-
span: spanFrom(item.label.span, endSpan),
|
|
175
|
-
labels,
|
|
176
|
-
...(entryLabels ? { entryLabels } : {}),
|
|
177
|
-
instructions,
|
|
178
|
-
});
|
|
179
|
-
}
|
|
180
|
-
return { routines, directCallTargets, directCalls, directBoundaries };
|
|
181
|
-
}
|
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
import type { RegisterCareReportModel, RegisterCareUnit, RoutineSummary } from './types.js';
|
|
2
|
-
export declare function contractCarrierList(units: RegisterCareUnit[]): string;
|
|
3
|
-
export declare function renderRegisterCareReport(model: RegisterCareReportModel): string;
|
|
4
|
-
export declare function renderRegisterCareInterface(summaries: RoutineSummary[]): string;
|
|
5
|
-
export declare function renderRegisterCareSourceBlock(summary: RoutineSummary): string[];
|