@jhlagado/azm 0.2.1 → 0.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +16 -9
- package/dist/src/api-compile.d.ts +0 -2
- package/dist/src/api-compile.js +1 -8
- package/dist/src/assembly/address-planning.js +19 -1
- package/dist/src/cli/parse-args.d.ts +0 -1
- package/dist/src/cli/parse-args.js +0 -7
- package/dist/src/cli/write-artifacts.js +0 -11
- package/dist/src/core/compile.js +192 -9
- package/dist/src/expansion/op-expansion.js +1 -0
- package/dist/src/model/expression.d.ts +4 -0
- package/dist/src/model/source-item.d.ts +5 -0
- package/dist/src/outputs/index.js +0 -2
- package/dist/src/outputs/types.d.ts +3 -16
- package/dist/src/outputs/write-asm80.js +84 -0
- package/dist/src/semantics/expression-evaluation.d.ts +7 -3
- package/dist/src/semantics/expression-evaluation.js +57 -0
- package/dist/src/syntax/directive-aliases.js +9 -10
- package/dist/src/syntax/parse-expression.js +34 -9
- package/dist/src/syntax/parse-line.js +87 -44
- package/dist/src/tooling/case-style.js +3 -0
- package/docs/reference/cli.md +6 -4
- package/docs/reference/tooling-api.md +1 -4
- package/package.json +2 -6
- package/dist/legacy-root-azm/src/analysis.d.ts +0 -11
- package/dist/legacy-root-azm/src/analysis.js +0 -41
- package/dist/legacy-root-azm/src/compile.d.ts +0 -10
- package/dist/legacy-root-azm/src/compile.js +0 -186
- package/dist/legacy-root-azm/src/compileShared.d.ts +0 -3
- package/dist/legacy-root-azm/src/compileShared.js +0 -7
- package/dist/legacy-root-azm/src/diagnosticTypes.d.ts +0 -77
- package/dist/legacy-root-azm/src/diagnosticTypes.js +0 -53
- package/dist/legacy-root-azm/src/formats/index.d.ts +0 -7
- package/dist/legacy-root-azm/src/formats/index.js +0 -17
- package/dist/legacy-root-azm/src/formats/range.d.ts +0 -17
- package/dist/legacy-root-azm/src/formats/range.js +0 -45
- package/dist/legacy-root-azm/src/formats/types.d.ts +0 -283
- package/dist/legacy-root-azm/src/formats/types.js +0 -1
- package/dist/legacy-root-azm/src/formats/writeAsm80.d.ts +0 -6
- package/dist/legacy-root-azm/src/formats/writeAsm80.js +0 -86
- package/dist/legacy-root-azm/src/formats/writeBin.d.ts +0 -7
- package/dist/legacy-root-azm/src/formats/writeBin.js +0 -23
- package/dist/legacy-root-azm/src/formats/writeD8m.d.ts +0 -9
- package/dist/legacy-root-azm/src/formats/writeD8m.js +0 -245
- package/dist/legacy-root-azm/src/formats/writeHex.d.ts +0 -8
- package/dist/legacy-root-azm/src/formats/writeHex.js +0 -38
- package/dist/legacy-root-azm/src/formats/writeListing.d.ts +0 -8
- package/dist/legacy-root-azm/src/formats/writeListing.js +0 -83
- package/dist/legacy-root-azm/src/frontend/asm80/asmLine.d.ts +0 -39
- package/dist/legacy-root-azm/src/frontend/asm80/asmLine.js +0 -89
- package/dist/legacy-root-azm/src/frontend/asm80/parseAsmRawValues.d.ts +0 -4
- package/dist/legacy-root-azm/src/frontend/asm80/parseAsmRawValues.js +0 -94
- package/dist/legacy-root-azm/src/frontend/asm80/quoteScan.d.ts +0 -10
- package/dist/legacy-root-azm/src/frontend/asm80/quoteScan.js +0 -25
- package/dist/legacy-root-azm/src/frontend/ast.d.ts +0 -376
- package/dist/legacy-root-azm/src/frontend/ast.js +0 -1
- package/dist/legacy-root-azm/src/frontend/directiveAliases.d.ts +0 -14
- package/dist/legacy-root-azm/src/frontend/directiveAliases.js +0 -189
- package/dist/legacy-root-azm/src/frontend/grammarData.d.ts +0 -14
- package/dist/legacy-root-azm/src/frontend/grammarData.js +0 -65
- package/dist/legacy-root-azm/src/frontend/immExprUtils.d.ts +0 -2
- package/dist/legacy-root-azm/src/frontend/immExprUtils.js +0 -12
- package/dist/legacy-root-azm/src/frontend/parseAsmFlatDirectiveLine.d.ts +0 -17
- package/dist/legacy-root-azm/src/frontend/parseAsmFlatDirectiveLine.js +0 -187
- package/dist/legacy-root-azm/src/frontend/parseAsmInstruction.d.ts +0 -3
- package/dist/legacy-root-azm/src/frontend/parseAsmInstruction.js +0 -73
- package/dist/legacy-root-azm/src/frontend/parseAsmStatements.d.ts +0 -6
- package/dist/legacy-root-azm/src/frontend/parseAsmStatements.js +0 -16
- package/dist/legacy-root-azm/src/frontend/parseAsmStream.d.ts +0 -10
- package/dist/legacy-root-azm/src/frontend/parseAsmStream.js +0 -33
- package/dist/legacy-root-azm/src/frontend/parseAsmTopLevel.d.ts +0 -18
- package/dist/legacy-root-azm/src/frontend/parseAsmTopLevel.js +0 -34
- package/dist/legacy-root-azm/src/frontend/parseDiagnostics.d.ts +0 -9
- package/dist/legacy-root-azm/src/frontend/parseDiagnostics.js +0 -16
- package/dist/legacy-root-azm/src/frontend/parseEnum.d.ts +0 -12
- package/dist/legacy-root-azm/src/frontend/parseEnum.js +0 -70
- package/dist/legacy-root-azm/src/frontend/parseImm.d.ts +0 -10
- package/dist/legacy-root-azm/src/frontend/parseImm.js +0 -397
- package/dist/legacy-root-azm/src/frontend/parseLogicalLines.d.ts +0 -11
- package/dist/legacy-root-azm/src/frontend/parseLogicalLines.js +0 -94
- package/dist/legacy-root-azm/src/frontend/parseOp.d.ts +0 -25
- package/dist/legacy-root-azm/src/frontend/parseOp.js +0 -120
- package/dist/legacy-root-azm/src/frontend/parseOpHeader.d.ts +0 -20
- package/dist/legacy-root-azm/src/frontend/parseOpHeader.js +0 -32
- package/dist/legacy-root-azm/src/frontend/parseOperands.d.ts +0 -4
- package/dist/legacy-root-azm/src/frontend/parseOperands.js +0 -290
- package/dist/legacy-root-azm/src/frontend/parseParams.d.ts +0 -6
- package/dist/legacy-root-azm/src/frontend/parseParams.js +0 -62
- package/dist/legacy-root-azm/src/frontend/parseParserRecovery.d.ts +0 -12
- package/dist/legacy-root-azm/src/frontend/parseParserRecovery.js +0 -17
- package/dist/legacy-root-azm/src/frontend/parseParserShared.d.ts +0 -2
- package/dist/legacy-root-azm/src/frontend/parseParserShared.js +0 -8
- package/dist/legacy-root-azm/src/frontend/parseRawDataDirectiveStart.d.ts +0 -1
- package/dist/legacy-root-azm/src/frontend/parseRawDataDirectiveStart.js +0 -3
- package/dist/legacy-root-azm/src/frontend/parseRawDataDirectives.d.ts +0 -7
- package/dist/legacy-root-azm/src/frontend/parseRawDataDirectives.js +0 -142
- package/dist/legacy-root-azm/src/frontend/parseRecordFieldDecl.d.ts +0 -34
- package/dist/legacy-root-azm/src/frontend/parseRecordFieldDecl.js +0 -177
- package/dist/legacy-root-azm/src/frontend/parseSourceItemDispatch.d.ts +0 -46
- package/dist/legacy-root-azm/src/frontend/parseSourceItemDispatch.js +0 -53
- package/dist/legacy-root-azm/src/frontend/parseSourceItemTable.d.ts +0 -16
- package/dist/legacy-root-azm/src/frontend/parseSourceItemTable.js +0 -68
- package/dist/legacy-root-azm/src/frontend/parseTopLevelCommon.d.ts +0 -11
- package/dist/legacy-root-azm/src/frontend/parseTopLevelCommon.js +0 -50
- package/dist/legacy-root-azm/src/frontend/parseTypes.d.ts +0 -24
- package/dist/legacy-root-azm/src/frontend/parseTypes.js +0 -77
- package/dist/legacy-root-azm/src/frontend/parser.d.ts +0 -11
- package/dist/legacy-root-azm/src/frontend/parser.js +0 -88
- package/dist/legacy-root-azm/src/frontend/source.d.ts +0 -28
- package/dist/legacy-root-azm/src/frontend/source.js +0 -58
- package/dist/legacy-root-azm/src/frontend/sourceExtensions.d.ts +0 -2
- package/dist/legacy-root-azm/src/frontend/sourceExtensions.js +0 -6
- package/dist/legacy-root-azm/src/lintCaseStyle.d.ts +0 -4
- package/dist/legacy-root-azm/src/lintCaseStyle.js +0 -129
- package/dist/legacy-root-azm/src/lowering/asmDirectiveLowering.d.ts +0 -4
- package/dist/legacy-root-azm/src/lowering/asmDirectiveLowering.js +0 -229
- package/dist/legacy-root-azm/src/lowering/asmDirectiveTraversal.d.ts +0 -47
- package/dist/legacy-root-azm/src/lowering/asmDirectiveTraversal.js +0 -52
- package/dist/legacy-root-azm/src/lowering/asmEquResolution.d.ts +0 -8
- package/dist/legacy-root-azm/src/lowering/asmEquResolution.js +0 -69
- package/dist/legacy-root-azm/src/lowering/asmInstructionLdHelpers.d.ts +0 -15
- package/dist/legacy-root-azm/src/lowering/asmInstructionLdHelpers.js +0 -102
- package/dist/legacy-root-azm/src/lowering/asmInstructionLowering.d.ts +0 -5
- package/dist/legacy-root-azm/src/lowering/asmInstructionLowering.js +0 -54
- package/dist/legacy-root-azm/src/lowering/asmInstructionStream.d.ts +0 -46
- package/dist/legacy-root-azm/src/lowering/asmInstructionStream.js +0 -51
- package/dist/legacy-root-azm/src/lowering/asmLoweringBranchCall.d.ts +0 -43
- package/dist/legacy-root-azm/src/lowering/asmLoweringBranchCall.js +0 -254
- package/dist/legacy-root-azm/src/lowering/asmLoweringHost.d.ts +0 -23
- package/dist/legacy-root-azm/src/lowering/asmLoweringHost.js +0 -1
- package/dist/legacy-root-azm/src/lowering/asmLoweringLd.d.ts +0 -28
- package/dist/legacy-root-azm/src/lowering/asmLoweringLd.js +0 -144
- package/dist/legacy-root-azm/src/lowering/asmRangeLowering.d.ts +0 -17
- package/dist/legacy-root-azm/src/lowering/asmRangeLowering.js +0 -39
- package/dist/legacy-root-azm/src/lowering/asmRawDataLowering.d.ts +0 -16
- package/dist/legacy-root-azm/src/lowering/asmRawDataLowering.js +0 -209
- package/dist/legacy-root-azm/src/lowering/asmSourceEmitter.d.ts +0 -4
- package/dist/legacy-root-azm/src/lowering/asmSourceEmitter.js +0 -9
- package/dist/legacy-root-azm/src/lowering/asmSourceInstructionLowering.d.ts +0 -4
- package/dist/legacy-root-azm/src/lowering/asmSourceInstructionLowering.js +0 -14
- package/dist/legacy-root-azm/src/lowering/asmUtils.d.ts +0 -13
- package/dist/legacy-root-azm/src/lowering/asmUtils.js +0 -105
- package/dist/legacy-root-azm/src/lowering/assemblerFlowSetup.d.ts +0 -54
- package/dist/legacy-root-azm/src/lowering/assemblerFlowSetup.js +0 -128
- package/dist/legacy-root-azm/src/lowering/assemblerLoweringContext.d.ts +0 -151
- package/dist/legacy-root-azm/src/lowering/assemblerLoweringContext.js +0 -16
- package/dist/legacy-root-azm/src/lowering/assemblerLoweringContextSplit.d.ts +0 -7
- package/dist/legacy-root-azm/src/lowering/assemblerLoweringContextSplit.js +0 -75
- package/dist/legacy-root-azm/src/lowering/assemblerLoweringPhases.d.ts +0 -66
- package/dist/legacy-root-azm/src/lowering/assemblerLoweringPhases.js +0 -166
- package/dist/legacy-root-azm/src/lowering/bytePlacement.d.ts +0 -7
- package/dist/legacy-root-azm/src/lowering/bytePlacement.js +0 -37
- package/dist/legacy-root-azm/src/lowering/capabilities.d.ts +0 -67
- package/dist/legacy-root-azm/src/lowering/capabilities.js +0 -1
- package/dist/legacy-root-azm/src/lowering/eaResolution.d.ts +0 -58
- package/dist/legacy-root-azm/src/lowering/eaResolution.js +0 -159
- package/dist/legacy-root-azm/src/lowering/emissionCore.d.ts +0 -17
- package/dist/legacy-root-azm/src/lowering/emissionCore.js +0 -21
- package/dist/legacy-root-azm/src/lowering/emit.d.ts +0 -17
- package/dist/legacy-root-azm/src/lowering/emit.js +0 -46
- package/dist/legacy-root-azm/src/lowering/emitContextBuilder.d.ts +0 -63
- package/dist/legacy-root-azm/src/lowering/emitContextBuilder.js +0 -41
- package/dist/legacy-root-azm/src/lowering/emitFinalization.d.ts +0 -61
- package/dist/legacy-root-azm/src/lowering/emitFinalization.js +0 -66
- package/dist/legacy-root-azm/src/lowering/emitFinalizationSetup.d.ts +0 -19
- package/dist/legacy-root-azm/src/lowering/emitFinalizationSetup.js +0 -26
- package/dist/legacy-root-azm/src/lowering/emitPhase1BuildProgramLoweringContext.d.ts +0 -7
- package/dist/legacy-root-azm/src/lowering/emitPhase1BuildProgramLoweringContext.js +0 -119
- package/dist/legacy-root-azm/src/lowering/emitPhase1Helpers.d.ts +0 -4
- package/dist/legacy-root-azm/src/lowering/emitPhase1Helpers.js +0 -12
- package/dist/legacy-root-azm/src/lowering/emitPhase1Types.d.ts +0 -21
- package/dist/legacy-root-azm/src/lowering/emitPhase1Types.js +0 -1
- package/dist/legacy-root-azm/src/lowering/emitPhase1WirePipeline.d.ts +0 -70
- package/dist/legacy-root-azm/src/lowering/emitPhase1WirePipeline.js +0 -203
- package/dist/legacy-root-azm/src/lowering/emitPhase1Workspace.d.ts +0 -82
- package/dist/legacy-root-azm/src/lowering/emitPhase1Workspace.js +0 -55
- package/dist/legacy-root-azm/src/lowering/emitPipeline.d.ts +0 -121
- package/dist/legacy-root-azm/src/lowering/emitPipeline.js +0 -57
- package/dist/legacy-root-azm/src/lowering/emitProgramContext.d.ts +0 -39
- package/dist/legacy-root-azm/src/lowering/emitProgramContext.js +0 -29
- package/dist/legacy-root-azm/src/lowering/emitState.d.ts +0 -90
- package/dist/legacy-root-azm/src/lowering/emitState.js +0 -124
- package/dist/legacy-root-azm/src/lowering/fixupBaseResolution.d.ts +0 -7
- package/dist/legacy-root-azm/src/lowering/fixupBaseResolution.js +0 -23
- package/dist/legacy-root-azm/src/lowering/fixupEmission.d.ts +0 -64
- package/dist/legacy-root-azm/src/lowering/fixupEmission.js +0 -199
- package/dist/legacy-root-azm/src/lowering/immMath.d.ts +0 -2
- package/dist/legacy-root-azm/src/lowering/immMath.js +0 -34
- package/dist/legacy-root-azm/src/lowering/inputAssets.d.ts +0 -7
- package/dist/legacy-root-azm/src/lowering/inputAssets.js +0 -106
- package/dist/legacy-root-azm/src/lowering/ldEncoding.d.ts +0 -15
- package/dist/legacy-root-azm/src/lowering/ldEncoding.js +0 -12
- package/dist/legacy-root-azm/src/lowering/ldEncodingRegMemHelpers.d.ts +0 -5
- package/dist/legacy-root-azm/src/lowering/ldEncodingRegMemHelpers.js +0 -124
- package/dist/legacy-root-azm/src/lowering/ldFormSelection.d.ts +0 -26
- package/dist/legacy-root-azm/src/lowering/ldFormSelection.js +0 -92
- package/dist/legacy-root-azm/src/lowering/ldLowering.d.ts +0 -7
- package/dist/legacy-root-azm/src/lowering/ldLowering.js +0 -13
- package/dist/legacy-root-azm/src/lowering/loweredAsmByteEmission.d.ts +0 -23
- package/dist/legacy-root-azm/src/lowering/loweredAsmByteEmission.js +0 -185
- package/dist/legacy-root-azm/src/lowering/loweredAsmPlacement.d.ts +0 -13
- package/dist/legacy-root-azm/src/lowering/loweredAsmPlacement.js +0 -86
- package/dist/legacy-root-azm/src/lowering/loweredAsmStreamRecording.d.ts +0 -27
- package/dist/legacy-root-azm/src/lowering/loweredAsmStreamRecording.js +0 -215
- package/dist/legacy-root-azm/src/lowering/loweredAsmTypes.d.ts +0 -202
- package/dist/legacy-root-azm/src/lowering/loweredAsmTypes.js +0 -1
- package/dist/legacy-root-azm/src/lowering/loweredFormat.d.ts +0 -3
- package/dist/legacy-root-azm/src/lowering/loweredFormat.js +0 -26
- package/dist/legacy-root-azm/src/lowering/loweredItemSize.d.ts +0 -4
- package/dist/legacy-root-azm/src/lowering/loweredItemSize.js +0 -17
- package/dist/legacy-root-azm/src/lowering/loweringDiagnostics.d.ts +0 -9
- package/dist/legacy-root-azm/src/lowering/loweringDiagnostics.js +0 -55
- package/dist/legacy-root-azm/src/lowering/loweringTypes.d.ts +0 -27
- package/dist/legacy-root-azm/src/lowering/loweringTypes.js +0 -1
- package/dist/legacy-root-azm/src/lowering/opCandidateRegistry.d.ts +0 -9
- package/dist/legacy-root-azm/src/lowering/opCandidateRegistry.js +0 -9
- package/dist/legacy-root-azm/src/lowering/opExpansionExecution.d.ts +0 -15
- package/dist/legacy-root-azm/src/lowering/opExpansionExecution.js +0 -45
- package/dist/legacy-root-azm/src/lowering/opExpansionOrchestration.d.ts +0 -15
- package/dist/legacy-root-azm/src/lowering/opExpansionOrchestration.js +0 -88
- package/dist/legacy-root-azm/src/lowering/opExpansionStream.d.ts +0 -12
- package/dist/legacy-root-azm/src/lowering/opExpansionStream.js +0 -176
- package/dist/legacy-root-azm/src/lowering/opMatching.d.ts +0 -52
- package/dist/legacy-root-azm/src/lowering/opMatching.js +0 -355
- package/dist/legacy-root-azm/src/lowering/opSubstitution.d.ts +0 -13
- package/dist/legacy-root-azm/src/lowering/opSubstitution.js +0 -175
- package/dist/legacy-root-azm/src/lowering/prescanTypes.d.ts +0 -7
- package/dist/legacy-root-azm/src/lowering/prescanTypes.js +0 -1
- package/dist/legacy-root-azm/src/lowering/programLowering.d.ts +0 -144
- package/dist/legacy-root-azm/src/lowering/programLowering.js +0 -2
- package/dist/legacy-root-azm/src/lowering/programLoweringDeclarations.d.ts +0 -5
- package/dist/legacy-root-azm/src/lowering/programLoweringDeclarations.js +0 -5
- package/dist/legacy-root-azm/src/lowering/programLoweringFinalize.d.ts +0 -18
- package/dist/legacy-root-azm/src/lowering/programLoweringFinalize.js +0 -115
- package/dist/legacy-root-azm/src/lowering/programLoweringTraversal.d.ts +0 -2
- package/dist/legacy-root-azm/src/lowering/programLoweringTraversal.js +0 -93
- package/dist/legacy-root-azm/src/lowering/programPrescan.d.ts +0 -3
- package/dist/legacy-root-azm/src/lowering/programPrescan.js +0 -37
- package/dist/legacy-root-azm/src/lowering/traceFormat.d.ts +0 -13
- package/dist/legacy-root-azm/src/lowering/traceFormat.js +0 -211
- package/dist/legacy-root-azm/src/packageInfo.d.ts +0 -1
- package/dist/legacy-root-azm/src/packageInfo.js +0 -15
- package/dist/legacy-root-azm/src/pathCompare.d.ts +0 -3
- package/dist/legacy-root-azm/src/pathCompare.js +0 -26
- package/dist/legacy-root-azm/src/pipeline.d.ts +0 -91
- package/dist/legacy-root-azm/src/pipeline.js +0 -1
- package/dist/legacy-root-azm/src/registerCare/analyze.d.ts +0 -24
- package/dist/legacy-root-azm/src/registerCare/analyze.js +0 -327
- package/dist/legacy-root-azm/src/registerCare/annotate.d.ts +0 -11
- package/dist/legacy-root-azm/src/registerCare/annotate.js +0 -76
- package/dist/legacy-root-azm/src/registerCare/boundaryHints.d.ts +0 -2
- package/dist/legacy-root-azm/src/registerCare/boundaryHints.js +0 -10
- package/dist/legacy-root-azm/src/registerCare/carriers.d.ts +0 -4
- package/dist/legacy-root-azm/src/registerCare/carriers.js +0 -78
- package/dist/legacy-root-azm/src/registerCare/controlFlow.d.ts +0 -5
- package/dist/legacy-root-azm/src/registerCare/controlFlow.js +0 -35
- package/dist/legacy-root-azm/src/registerCare/fix.d.ts +0 -11
- package/dist/legacy-root-azm/src/registerCare/fix.js +0 -119
- package/dist/legacy-root-azm/src/registerCare/liveness.d.ts +0 -7
- package/dist/legacy-root-azm/src/registerCare/liveness.js +0 -227
- package/dist/legacy-root-azm/src/registerCare/profiles.d.ts +0 -11
- package/dist/legacy-root-azm/src/registerCare/profiles.js +0 -45
- package/dist/legacy-root-azm/src/registerCare/programModel.d.ts +0 -3
- package/dist/legacy-root-azm/src/registerCare/programModel.js +0 -181
- package/dist/legacy-root-azm/src/registerCare/report.d.ts +0 -5
- package/dist/legacy-root-azm/src/registerCare/report.js +0 -139
- package/dist/legacy-root-azm/src/registerCare/smartComments.d.ts +0 -5
- package/dist/legacy-root-azm/src/registerCare/smartComments.js +0 -247
- package/dist/legacy-root-azm/src/registerCare/sourceText.d.ts +0 -8
- package/dist/legacy-root-azm/src/registerCare/sourceText.js +0 -15
- package/dist/legacy-root-azm/src/registerCare/summary.d.ts +0 -3
- package/dist/legacy-root-azm/src/registerCare/summary.js +0 -492
- package/dist/legacy-root-azm/src/registerCare/types.d.ts +0 -154
- package/dist/legacy-root-azm/src/registerCare/types.js +0 -1
- package/dist/legacy-root-azm/src/semantics/declVisitor.d.ts +0 -5
- package/dist/legacy-root-azm/src/semantics/declVisitor.js +0 -11
- package/dist/legacy-root-azm/src/semantics/env.d.ts +0 -28
- package/dist/legacy-root-azm/src/semantics/env.js +0 -432
- package/dist/legacy-root-azm/src/semantics/layout.d.ts +0 -21
- package/dist/legacy-root-azm/src/semantics/layout.js +0 -226
- package/dist/legacy-root-azm/src/semantics/layoutCastFold.d.ts +0 -22
- package/dist/legacy-root-azm/src/semantics/layoutCastFold.js +0 -118
- package/dist/legacy-root-azm/src/semantics/semanticsDiagnostics.d.ts +0 -2
- package/dist/legacy-root-azm/src/semantics/semanticsDiagnostics.js +0 -4
- package/dist/legacy-root-azm/src/semantics/typeQueries.d.ts +0 -31
- package/dist/legacy-root-azm/src/semantics/typeQueries.js +0 -124
- package/dist/legacy-root-azm/src/sourceIncludeExpansion.d.ts +0 -17
- package/dist/legacy-root-azm/src/sourceIncludeExpansion.js +0 -124
- package/dist/legacy-root-azm/src/sourceIncludePaths.d.ts +0 -1
- package/dist/legacy-root-azm/src/sourceIncludePaths.js +0 -12
- package/dist/legacy-root-azm/src/sourceLoader.d.ts +0 -15
- package/dist/legacy-root-azm/src/sourceLoader.js +0 -118
- package/dist/legacy-root-azm/src/z80/effects.d.ts +0 -3
- package/dist/legacy-root-azm/src/z80/effects.js +0 -516
- package/dist/legacy-root-azm/src/z80/encode.d.ts +0 -10
- package/dist/legacy-root-azm/src/z80/encode.js +0 -412
- package/dist/legacy-root-azm/src/z80/encodeAlu.d.ts +0 -7
- package/dist/legacy-root-azm/src/z80/encodeAlu.js +0 -219
- package/dist/legacy-root-azm/src/z80/encodeBitOps.d.ts +0 -7
- package/dist/legacy-root-azm/src/z80/encodeBitOps.js +0 -123
- package/dist/legacy-root-azm/src/z80/encodeContext.d.ts +0 -29
- package/dist/legacy-root-azm/src/z80/encodeContext.js +0 -1
- package/dist/legacy-root-azm/src/z80/encodeControl.d.ts +0 -26
- package/dist/legacy-root-azm/src/z80/encodeControl.js +0 -180
- package/dist/legacy-root-azm/src/z80/encodeCoreOps.d.ts +0 -7
- package/dist/legacy-root-azm/src/z80/encodeCoreOps.js +0 -131
- package/dist/legacy-root-azm/src/z80/encodeIo.d.ts +0 -9
- package/dist/legacy-root-azm/src/z80/encodeIo.js +0 -128
- package/dist/legacy-root-azm/src/z80/encodeLd.d.ts +0 -13
- package/dist/legacy-root-azm/src/z80/encodeLd.js +0 -273
- package/dist/legacy-root-azm/src/z80/encoderRegistry.d.ts +0 -13
- package/dist/legacy-root-azm/src/z80/encoderRegistry.js +0 -169
- package/dist/src/outputs/write-listing.d.ts +0 -2
- package/dist/src/outputs/write-listing.js +0 -79
|
@@ -14,6 +14,7 @@ export function writeAsm80(items, symbols, opts = {}) {
|
|
|
14
14
|
void opts;
|
|
15
15
|
const evalContext = {
|
|
16
16
|
constants: collectConstants(symbols),
|
|
17
|
+
symbols: collectSymbolValues(symbols),
|
|
17
18
|
layouts: collectLayouts(items),
|
|
18
19
|
};
|
|
19
20
|
const lines = [asm80Header, ''];
|
|
@@ -43,6 +44,13 @@ function collectConstants(symbols) {
|
|
|
43
44
|
}
|
|
44
45
|
return constants;
|
|
45
46
|
}
|
|
47
|
+
function collectSymbolValues(symbols) {
|
|
48
|
+
const values = new Map();
|
|
49
|
+
for (const symbol of symbols) {
|
|
50
|
+
values.set(symbol.name, symbol.kind === 'constant' ? symbol.value : symbol.address);
|
|
51
|
+
}
|
|
52
|
+
return values;
|
|
53
|
+
}
|
|
46
54
|
function collectLayouts(items) {
|
|
47
55
|
const layouts = new Map();
|
|
48
56
|
for (const item of items) {
|
|
@@ -53,6 +61,13 @@ function collectLayouts(items) {
|
|
|
53
61
|
span: item.span,
|
|
54
62
|
});
|
|
55
63
|
}
|
|
64
|
+
else if (item.kind === 'type-alias') {
|
|
65
|
+
layouts.set(item.name, {
|
|
66
|
+
kind: 'alias',
|
|
67
|
+
typeExpr: item.typeExpr,
|
|
68
|
+
span: item.span,
|
|
69
|
+
});
|
|
70
|
+
}
|
|
56
71
|
}
|
|
57
72
|
return layouts;
|
|
58
73
|
}
|
|
@@ -95,6 +110,7 @@ function formatItem(item, evalContext, state) {
|
|
|
95
110
|
return withImplicitOrg(state, formatInstruction(item.instruction, evalContext)?.text, instructionSize(item.instruction));
|
|
96
111
|
case 'enum':
|
|
97
112
|
case 'type':
|
|
113
|
+
case 'type-alias':
|
|
98
114
|
case 'end':
|
|
99
115
|
case 'binfrom':
|
|
100
116
|
case 'binto':
|
|
@@ -497,12 +513,20 @@ function evaluateLoweredConstant(expression, evalContext) {
|
|
|
497
513
|
reportUnknown: false,
|
|
498
514
|
});
|
|
499
515
|
}
|
|
516
|
+
case 'offset':
|
|
500
517
|
case 'sizeof':
|
|
501
518
|
return evaluateExpression(expression, {}, new Map(), silentSpan, [], {
|
|
502
519
|
currentLocation: 0,
|
|
503
520
|
layouts: evalContext.layouts,
|
|
504
521
|
reportUnknown: false,
|
|
505
522
|
});
|
|
523
|
+
case 'byte-function': {
|
|
524
|
+
const value = evaluateLoweredResolvedConstant(expression.expression, evalContext);
|
|
525
|
+
if (value === undefined) {
|
|
526
|
+
return undefined;
|
|
527
|
+
}
|
|
528
|
+
return expression.function === 'LSB' ? value & 0xff : (value >> 8) & 0xff;
|
|
529
|
+
}
|
|
506
530
|
case 'unary': {
|
|
507
531
|
const value = evaluateLoweredConstant(expression.expression, evalContext);
|
|
508
532
|
if (value === undefined) {
|
|
@@ -552,6 +576,66 @@ function evaluateLoweredConstant(expression, evalContext) {
|
|
|
552
576
|
return undefined;
|
|
553
577
|
}
|
|
554
578
|
}
|
|
579
|
+
function evaluateLoweredResolvedConstant(expression, evalContext) {
|
|
580
|
+
switch (expression.kind) {
|
|
581
|
+
case 'symbol':
|
|
582
|
+
return evalContext.symbols.get(expression.name);
|
|
583
|
+
case 'unary': {
|
|
584
|
+
const value = evaluateLoweredResolvedConstant(expression.expression, evalContext);
|
|
585
|
+
if (value === undefined) {
|
|
586
|
+
return undefined;
|
|
587
|
+
}
|
|
588
|
+
switch (expression.operator) {
|
|
589
|
+
case '+':
|
|
590
|
+
return value;
|
|
591
|
+
case '-':
|
|
592
|
+
return -value;
|
|
593
|
+
case '~':
|
|
594
|
+
return ~value;
|
|
595
|
+
}
|
|
596
|
+
break;
|
|
597
|
+
}
|
|
598
|
+
case 'binary': {
|
|
599
|
+
const left = evaluateLoweredResolvedConstant(expression.left, evalContext);
|
|
600
|
+
const right = evaluateLoweredResolvedConstant(expression.right, evalContext);
|
|
601
|
+
if (left === undefined || right === undefined) {
|
|
602
|
+
return undefined;
|
|
603
|
+
}
|
|
604
|
+
switch (expression.operator) {
|
|
605
|
+
case '+':
|
|
606
|
+
return left + right;
|
|
607
|
+
case '-':
|
|
608
|
+
return left - right;
|
|
609
|
+
case '*':
|
|
610
|
+
return left * right;
|
|
611
|
+
case '/':
|
|
612
|
+
return right === 0 ? undefined : Math.trunc(left / right);
|
|
613
|
+
case '%':
|
|
614
|
+
return right === 0 ? undefined : left % right;
|
|
615
|
+
case '&':
|
|
616
|
+
return left & right;
|
|
617
|
+
case '^':
|
|
618
|
+
return left ^ right;
|
|
619
|
+
case '|':
|
|
620
|
+
return left | right;
|
|
621
|
+
case '<<':
|
|
622
|
+
return left << right;
|
|
623
|
+
case '>>':
|
|
624
|
+
return left >> right;
|
|
625
|
+
}
|
|
626
|
+
break;
|
|
627
|
+
}
|
|
628
|
+
case 'byte-function': {
|
|
629
|
+
const value = evaluateLoweredResolvedConstant(expression.expression, evalContext);
|
|
630
|
+
if (value === undefined) {
|
|
631
|
+
return undefined;
|
|
632
|
+
}
|
|
633
|
+
return expression.function === 'LSB' ? value & 0xff : (value >> 8) & 0xff;
|
|
634
|
+
}
|
|
635
|
+
default:
|
|
636
|
+
return evaluateLoweredConstant(expression, evalContext);
|
|
637
|
+
}
|
|
638
|
+
}
|
|
555
639
|
function formatLoweredNumber(value, width) {
|
|
556
640
|
const normalized = value < 0 ? 0x10000 + (value & 0xffff) : value;
|
|
557
641
|
const digits = normalized.toString(16).toUpperCase();
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { Diagnostic } from '../model/diagnostic.js';
|
|
2
|
-
import type { Expression } from '../model/expression.js';
|
|
2
|
+
import type { Expression, TypeExpr } from '../model/expression.js';
|
|
3
3
|
import type { LayoutField } from '../model/source-item.js';
|
|
4
4
|
import type { SourceSpan } from '../source/source-span.js';
|
|
5
5
|
export interface EquateRecord {
|
|
@@ -9,11 +9,15 @@ export interface EquateRecord {
|
|
|
9
9
|
readonly enumMember?: boolean;
|
|
10
10
|
readonly stringValue?: string;
|
|
11
11
|
}
|
|
12
|
-
export
|
|
12
|
+
export type LayoutRecord = {
|
|
13
13
|
readonly kind: 'record' | 'union';
|
|
14
14
|
readonly fields: readonly LayoutField[];
|
|
15
15
|
readonly span: SourceSpan;
|
|
16
|
-
}
|
|
16
|
+
} | {
|
|
17
|
+
readonly kind: 'alias';
|
|
18
|
+
readonly typeExpr: TypeExpr;
|
|
19
|
+
readonly span: SourceSpan;
|
|
20
|
+
};
|
|
17
21
|
export declare function lookupEquateRecord(equates: ReadonlyMap<string, EquateRecord>, name: string): {
|
|
18
22
|
readonly key: string;
|
|
19
23
|
readonly record: EquateRecord;
|
|
@@ -39,6 +39,8 @@ export function evaluateExpression(expression, labels, equates, span, diagnostic
|
|
|
39
39
|
return evaluateTypeSize(expression.typeExpr, labels, equates, span, diagnostics, options);
|
|
40
40
|
case 'sizeof':
|
|
41
41
|
return evaluateSizeof(expression.typeExpr, options.layouts, span, diagnostics);
|
|
42
|
+
case 'byte-function':
|
|
43
|
+
return evaluateByteFunction(expression, labels, equates, span, diagnostics, options);
|
|
42
44
|
case 'offset':
|
|
43
45
|
return evaluateOffset(expression.typeExpr, expression.path, options.layouts, span, diagnostics);
|
|
44
46
|
case 'layout-cast':
|
|
@@ -51,6 +53,13 @@ export function evaluateExpression(expression, labels, equates, span, diagnostic
|
|
|
51
53
|
return evaluateBinary(expression, labels, equates, span, diagnostics, options);
|
|
52
54
|
}
|
|
53
55
|
}
|
|
56
|
+
function evaluateByteFunction(expression, labels, equates, span, diagnostics, options) {
|
|
57
|
+
const value = evaluateExpression(expression.expression, labels, equates, span, diagnostics, options);
|
|
58
|
+
if (value === undefined) {
|
|
59
|
+
return undefined;
|
|
60
|
+
}
|
|
61
|
+
return expression.function === 'LSB' ? value & 0xff : (value >> 8) & 0xff;
|
|
62
|
+
}
|
|
54
63
|
function evaluateTypeSize(typeExpr, labels, equates, span, diagnostics, options) {
|
|
55
64
|
if (options.layouts) {
|
|
56
65
|
const sizeDiagnostics = [];
|
|
@@ -146,6 +155,13 @@ function evaluateOffset(typeExpr, path, layouts, span, diagnostics) {
|
|
|
146
155
|
return undefined;
|
|
147
156
|
}
|
|
148
157
|
function typeExprSize(typeExpr, layouts, span, diagnostics, visiting) {
|
|
158
|
+
const resolvedTypeExpr = resolveLayoutAlias(typeExpr, layouts, span, diagnostics, visiting);
|
|
159
|
+
if (!resolvedTypeExpr) {
|
|
160
|
+
return undefined;
|
|
161
|
+
}
|
|
162
|
+
if (resolvedTypeExpr !== typeExpr) {
|
|
163
|
+
return typeExprSize(resolvedTypeExpr, layouts, span, diagnostics, visiting);
|
|
164
|
+
}
|
|
149
165
|
const scalar = scalarSize(typeExpr.name);
|
|
150
166
|
const baseSize = scalar ??
|
|
151
167
|
(() => {
|
|
@@ -162,6 +178,9 @@ function typeExprSize(typeExpr, layouts, span, diagnostics, visiting) {
|
|
|
162
178
|
return typeExpr.length === undefined ? baseSize : baseSize * typeExpr.length;
|
|
163
179
|
}
|
|
164
180
|
function layoutSize(typeName, layout, layouts, span, diagnostics, visiting) {
|
|
181
|
+
if (layout.kind === 'alias') {
|
|
182
|
+
return typeExprSize(layout.typeExpr, layouts, span, diagnostics, visiting);
|
|
183
|
+
}
|
|
165
184
|
const fieldSizes = [];
|
|
166
185
|
for (const field of layout.fields) {
|
|
167
186
|
const size = fieldSize(field, layouts, span, diagnostics, visiting);
|
|
@@ -187,6 +206,13 @@ function fieldSize(field, layouts, span, diagnostics, visiting) {
|
|
|
187
206
|
return typeExprSize(field.typeExpr, layouts, span, diagnostics, new Set([...visiting, field.typeExpr.name]));
|
|
188
207
|
}
|
|
189
208
|
function offsetPath(typeExpr, parts, layouts, span, diagnostics) {
|
|
209
|
+
const resolvedTypeExpr = resolveLayoutAlias(typeExpr, layouts, span, diagnostics, new Set([typeExpr.name]));
|
|
210
|
+
if (!resolvedTypeExpr) {
|
|
211
|
+
return undefined;
|
|
212
|
+
}
|
|
213
|
+
if (resolvedTypeExpr !== typeExpr) {
|
|
214
|
+
return offsetPath(resolvedTypeExpr, parts, layouts, span, diagnostics);
|
|
215
|
+
}
|
|
190
216
|
const [head, ...tail] = parts;
|
|
191
217
|
if (head === undefined) {
|
|
192
218
|
return undefined;
|
|
@@ -218,6 +244,9 @@ function offsetPath(typeExpr, parts, layouts, span, diagnostics) {
|
|
|
218
244
|
diagnostics.push(diagnostic(span, `unknown type: ${typeExpr.name}`));
|
|
219
245
|
return undefined;
|
|
220
246
|
}
|
|
247
|
+
if (layout.kind === 'alias') {
|
|
248
|
+
return offsetPath(layout.typeExpr, parts, layouts, span, diagnostics);
|
|
249
|
+
}
|
|
221
250
|
let currentOffset = 0;
|
|
222
251
|
for (const field of layout.fields) {
|
|
223
252
|
const fieldOffset = layout.kind === 'union' ? 0 : currentOffset;
|
|
@@ -246,6 +275,13 @@ function offsetPath(typeExpr, parts, layouts, span, diagnostics) {
|
|
|
246
275
|
return undefined;
|
|
247
276
|
}
|
|
248
277
|
function layoutCastOffset(typeExpr, parts, labels, equates, layouts, span, diagnostics, options) {
|
|
278
|
+
const resolvedTypeExpr = resolveLayoutAlias(typeExpr, layouts, span, diagnostics, new Set([typeExpr.name]));
|
|
279
|
+
if (!resolvedTypeExpr) {
|
|
280
|
+
return undefined;
|
|
281
|
+
}
|
|
282
|
+
if (resolvedTypeExpr !== typeExpr) {
|
|
283
|
+
return layoutCastOffset(resolvedTypeExpr, parts, labels, equates, layouts, span, diagnostics, options);
|
|
284
|
+
}
|
|
249
285
|
const [head, ...tail] = parts;
|
|
250
286
|
if (head === undefined) {
|
|
251
287
|
return 0;
|
|
@@ -286,6 +322,9 @@ function layoutCastOffset(typeExpr, parts, labels, equates, layouts, span, diagn
|
|
|
286
322
|
diagnostics.push(diagnostic(span, `unknown type: ${typeExpr.name}`));
|
|
287
323
|
return undefined;
|
|
288
324
|
}
|
|
325
|
+
if (layout.kind === 'alias') {
|
|
326
|
+
return layoutCastOffset(layout.typeExpr, parts, labels, equates, layouts, span, diagnostics, options);
|
|
327
|
+
}
|
|
289
328
|
let currentOffset = 0;
|
|
290
329
|
for (const field of layout.fields) {
|
|
291
330
|
const fieldOffset = layout.kind === 'union' ? 0 : currentOffset;
|
|
@@ -330,6 +369,24 @@ function registerIndexName(expression) {
|
|
|
330
369
|
function formatTypeExpr(typeExpr) {
|
|
331
370
|
return typeExpr.length === undefined ? typeExpr.name : `${typeExpr.name}[${typeExpr.length}]`;
|
|
332
371
|
}
|
|
372
|
+
function resolveLayoutAlias(typeExpr, layouts, span, diagnostics, visiting) {
|
|
373
|
+
const layout = layouts.get(typeExpr.name);
|
|
374
|
+
if (!layout || layout.kind !== 'alias') {
|
|
375
|
+
return typeExpr;
|
|
376
|
+
}
|
|
377
|
+
if (visiting.has(layout.typeExpr.name)) {
|
|
378
|
+
diagnostics.push(diagnostic(span, `recursive type: ${typeExpr.name}`));
|
|
379
|
+
return undefined;
|
|
380
|
+
}
|
|
381
|
+
const target = resolveLayoutAlias(layout.typeExpr, layouts, span, diagnostics, new Set([...visiting, layout.typeExpr.name]));
|
|
382
|
+
if (!target) {
|
|
383
|
+
return undefined;
|
|
384
|
+
}
|
|
385
|
+
const length = typeExpr.length === undefined
|
|
386
|
+
? target.length
|
|
387
|
+
: (target.length ?? 1) * typeExpr.length;
|
|
388
|
+
return length === undefined ? { name: target.name } : { name: target.name, length };
|
|
389
|
+
}
|
|
333
390
|
function formatOffsetPath(path) {
|
|
334
391
|
return path.map((part) => (part.kind === 'field' ? part.name : `[${part.index}]`)).join('.');
|
|
335
392
|
}
|
|
@@ -160,14 +160,14 @@ export function normalizeDirectiveAlias(text, policy = DEFAULT_DIRECTIVE_ALIAS_P
|
|
|
160
160
|
if (label) {
|
|
161
161
|
return `${leading}${label[1]} ${normalizeHead(label[2] ?? '', policy)}`;
|
|
162
162
|
}
|
|
163
|
-
const equ = /^([A-Za-z_.$?][A-Za-z0-9_.$?]*)\s+([A-Za-z]
|
|
163
|
+
const equ = /^([A-Za-z_.$?][A-Za-z0-9_.$?]*)\s+([A-Za-z][A-Za-z0-9_]*)\b(.*)$/.exec(trimmed);
|
|
164
164
|
if (equ && resolveDirectiveAlias(equ[2] ?? '', policy) === '.equ') {
|
|
165
165
|
return `${leading}${equ[1]} .equ${equ[3] ?? ''}`;
|
|
166
166
|
}
|
|
167
167
|
return `${leading}${normalizeHead(trimmed, policy)}`;
|
|
168
168
|
}
|
|
169
169
|
function normalizeHead(text, policy) {
|
|
170
|
-
const head = /^([A-Za-z]
|
|
170
|
+
const head = /^([A-Za-z][A-Za-z0-9_]*)\b(.*)$/.exec(text);
|
|
171
171
|
if (!head) {
|
|
172
172
|
return text;
|
|
173
173
|
}
|
|
@@ -181,7 +181,7 @@ function normalizeAliasKey(key) {
|
|
|
181
181
|
const trimmed = key.trim();
|
|
182
182
|
if (!/^[.]?[A-Za-z][A-Za-z0-9_]*$/.test(trimmed))
|
|
183
183
|
return undefined;
|
|
184
|
-
return trimmed.replace(/^\./, '')
|
|
184
|
+
return trimmed.replace(/^\./, '');
|
|
185
185
|
}
|
|
186
186
|
function normalizeAliasTarget(value) {
|
|
187
187
|
const trimmed = value.trim().toLowerCase();
|
|
@@ -189,11 +189,10 @@ function normalizeAliasTarget(value) {
|
|
|
189
189
|
return CANONICAL_DIRECTIVES.has(dotted) ? dotted : undefined;
|
|
190
190
|
}
|
|
191
191
|
function resolveDirectiveAlias(head, policy) {
|
|
192
|
-
const
|
|
193
|
-
if (
|
|
194
|
-
return undefined;
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
return policy.directiveAliases.get(key);
|
|
192
|
+
const trimmed = head.trim();
|
|
193
|
+
if (trimmed.startsWith('.')) {
|
|
194
|
+
return CANONICAL_DIRECTIVES.has(trimmed) ? trimmed : undefined;
|
|
195
|
+
}
|
|
196
|
+
const key = head.trim();
|
|
197
|
+
return /^[A-Za-z][A-Za-z0-9_]*$/.test(key) ? policy.directiveAliases.get(key) : undefined;
|
|
199
198
|
}
|
|
@@ -36,7 +36,7 @@ export function parseExpression(text) {
|
|
|
36
36
|
}
|
|
37
37
|
if (token.kind === 'symbol') {
|
|
38
38
|
const next = tokenList[index + 1];
|
|
39
|
-
if (token.text
|
|
39
|
+
if (token.text === 'sizeof' && next?.kind === 'left-paren') {
|
|
40
40
|
index += 2;
|
|
41
41
|
const typeName = tokenList[index];
|
|
42
42
|
if (typeName?.kind !== 'symbol' || tokenList[index + 1]?.kind !== 'right-paren') {
|
|
@@ -45,7 +45,7 @@ export function parseExpression(text) {
|
|
|
45
45
|
index += 2;
|
|
46
46
|
return { kind: 'sizeof', typeExpr: { name: typeName.text } };
|
|
47
47
|
}
|
|
48
|
-
if (token.text
|
|
48
|
+
if (token.text === 'offset' && next?.kind === 'left-paren') {
|
|
49
49
|
index += 2;
|
|
50
50
|
const typeName = tokenList[index];
|
|
51
51
|
const comma = tokenList[index + 1];
|
|
@@ -133,12 +133,12 @@ function parseLayoutExpression(text) {
|
|
|
133
133
|
if (layoutCast) {
|
|
134
134
|
return layoutCast;
|
|
135
135
|
}
|
|
136
|
-
const sizeof = /^sizeof\s*\((.*)\)
|
|
136
|
+
const sizeof = /^sizeof\s*\((.*)\)$/.exec(trimmed);
|
|
137
137
|
if (sizeof) {
|
|
138
138
|
const typeExpr = parseTypeExpr(sizeof[1] ?? '');
|
|
139
139
|
return typeExpr ? { kind: 'sizeof', typeExpr } : undefined;
|
|
140
140
|
}
|
|
141
|
-
const offset = /^offset\s*\((.*),(.*)\)
|
|
141
|
+
const offset = /^offset\s*\((.*),(.*)\)$/.exec(trimmed);
|
|
142
142
|
if (offset) {
|
|
143
143
|
const typeExpr = parseTypeExpr(offset[1] ?? '');
|
|
144
144
|
const path = parseOffsetPath(offset[2] ?? '');
|
|
@@ -317,7 +317,7 @@ function tokenizeExpression(text) {
|
|
|
317
317
|
index += 1;
|
|
318
318
|
continue;
|
|
319
319
|
}
|
|
320
|
-
if (char === "'"
|
|
320
|
+
if (char === "'") {
|
|
321
321
|
const quoted = scanQuotedByte(input, index, char);
|
|
322
322
|
if (!quoted) {
|
|
323
323
|
return undefined;
|
|
@@ -326,7 +326,7 @@ function tokenizeExpression(text) {
|
|
|
326
326
|
index = quoted.end;
|
|
327
327
|
continue;
|
|
328
328
|
}
|
|
329
|
-
const layoutTerm =
|
|
329
|
+
const layoutTerm = scanSpecialTerm(input, index);
|
|
330
330
|
if (layoutTerm) {
|
|
331
331
|
tokens.push({ kind: 'expression', expression: layoutTerm.expression });
|
|
332
332
|
index = layoutTerm.end;
|
|
@@ -353,9 +353,34 @@ function tokenizeExpression(text) {
|
|
|
353
353
|
}
|
|
354
354
|
return tokens.length > 0 ? tokens : undefined;
|
|
355
355
|
}
|
|
356
|
+
function scanSpecialTerm(input, start) {
|
|
357
|
+
const byteFunction = scanByteFunction(input, start);
|
|
358
|
+
if (byteFunction) {
|
|
359
|
+
return byteFunction;
|
|
360
|
+
}
|
|
361
|
+
return scanLayoutTerm(input, start);
|
|
362
|
+
}
|
|
363
|
+
function scanByteFunction(input, start) {
|
|
364
|
+
const head = /^(LSB|MSB)\s*\(/.exec(input.slice(start));
|
|
365
|
+
if (!head) {
|
|
366
|
+
return undefined;
|
|
367
|
+
}
|
|
368
|
+
const name = head[1];
|
|
369
|
+
const open = input.indexOf('(', start + name.length);
|
|
370
|
+
if (open === -1 || input.slice(start + name.length, open).trim().length > 0) {
|
|
371
|
+
return undefined;
|
|
372
|
+
}
|
|
373
|
+
const close = findMatchingParen(input, open);
|
|
374
|
+
if (close === undefined) {
|
|
375
|
+
return undefined;
|
|
376
|
+
}
|
|
377
|
+
const expression = parseExpression(input.slice(open + 1, close));
|
|
378
|
+
return expression
|
|
379
|
+
? { expression: { kind: 'byte-function', function: name, expression }, end: close + 1 }
|
|
380
|
+
: undefined;
|
|
381
|
+
}
|
|
356
382
|
function scanLayoutTerm(input, start) {
|
|
357
|
-
|
|
358
|
-
if (lower.startsWith('sizeof')) {
|
|
383
|
+
if (input.slice(start).startsWith('sizeof')) {
|
|
359
384
|
const open = input.indexOf('(', start + 'sizeof'.length);
|
|
360
385
|
if (open === -1 || input.slice(start + 'sizeof'.length, open).trim().length > 0) {
|
|
361
386
|
return undefined;
|
|
@@ -367,7 +392,7 @@ function scanLayoutTerm(input, start) {
|
|
|
367
392
|
const expression = parseLayoutExpression(input.slice(start, close + 1));
|
|
368
393
|
return expression ? { expression, end: close + 1 } : undefined;
|
|
369
394
|
}
|
|
370
|
-
if (
|
|
395
|
+
if (input.slice(start).startsWith('offset')) {
|
|
371
396
|
const open = input.indexOf('(', start + 'offset'.length);
|
|
372
397
|
if (open === -1 || input.slice(start + 'offset'.length, open).trim().length > 0) {
|
|
373
398
|
return undefined;
|
|
@@ -14,9 +14,9 @@ export function parseLogicalLine(line, options = {}) {
|
|
|
14
14
|
const labelName = normalizeEntryLabelName(rawLabel);
|
|
15
15
|
const isEntry = rawLabel.startsWith('@');
|
|
16
16
|
const statementText = labelWithStatement[2] ?? '';
|
|
17
|
-
const
|
|
18
|
-
if (
|
|
19
|
-
return
|
|
17
|
+
const invalidDeclaration = parseColonDeclarationError(labelName, statementText);
|
|
18
|
+
if (invalidDeclaration) {
|
|
19
|
+
return { items: [], diagnostics: [parseError(line, invalidDeclaration)] };
|
|
20
20
|
}
|
|
21
21
|
const parsedStatement = parseCanonicalStatement(line, statementText, span);
|
|
22
22
|
return withLineComment(line, {
|
|
@@ -86,6 +86,13 @@ function withLineComment(line, result) {
|
|
|
86
86
|
}
|
|
87
87
|
function parseEquItem(line, name, expressionText, span) {
|
|
88
88
|
const stringValue = parseWholeQuotedString(expressionText.trim());
|
|
89
|
+
const quotePolicyError = parseEquQuotePolicyError(expressionText.trim());
|
|
90
|
+
if (quotePolicyError) {
|
|
91
|
+
return {
|
|
92
|
+
items: [],
|
|
93
|
+
diagnostics: [parseError(line, quotePolicyError)],
|
|
94
|
+
};
|
|
95
|
+
}
|
|
89
96
|
const expression = stringValue !== undefined && stringValue.length > 1
|
|
90
97
|
? { kind: 'number', value: 0 }
|
|
91
98
|
: parseExpression(expressionText);
|
|
@@ -108,19 +115,12 @@ function parseEquItem(line, name, expressionText, span) {
|
|
|
108
115
|
diagnostics: [],
|
|
109
116
|
};
|
|
110
117
|
}
|
|
111
|
-
function parseColonLabelEqu(line, name, text, span) {
|
|
112
|
-
const equ = /^\.equ\s+(.+)$/i.exec(text);
|
|
113
|
-
if (!equ) {
|
|
114
|
-
return undefined;
|
|
115
|
-
}
|
|
116
|
-
return parseEquItem(line, name, equ[1] ?? '', span);
|
|
117
|
-
}
|
|
118
118
|
function parseCanonicalStatement(line, text, span) {
|
|
119
|
-
const equ = /^([A-Za-z_.$?][A-Za-z0-9_.$?]*)\s+\.equ\s+(.+)
|
|
119
|
+
const equ = /^([A-Za-z_.$?][A-Za-z0-9_.$?]*)\s+\.equ\s+(.+)$/.exec(text);
|
|
120
120
|
if (equ) {
|
|
121
121
|
return parseEquItem(line, equ[1] ?? '', equ[2] ?? '', span);
|
|
122
122
|
}
|
|
123
|
-
const org = /^\.org\s+(.+)
|
|
123
|
+
const org = /^\.org\s+(.+)$/.exec(text);
|
|
124
124
|
if (org) {
|
|
125
125
|
const expressionText = org[1] ?? '';
|
|
126
126
|
const expression = parseExpression(expressionText);
|
|
@@ -132,32 +132,18 @@ function parseCanonicalStatement(line, text, span) {
|
|
|
132
132
|
}
|
|
133
133
|
return { items: [{ kind: 'org', expression, span }], diagnostics: [] };
|
|
134
134
|
}
|
|
135
|
-
const enumDecl = /^enum\s+([A-Za-z_][A-Za-z0-9_]*)\s+(.+)
|
|
135
|
+
const enumDecl = /^enum\s+([A-Za-z_][A-Za-z0-9_]*)\s+(.+)$/.exec(text);
|
|
136
136
|
if (enumDecl) {
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
}
|
|
146
|
-
const members = [];
|
|
147
|
-
const diagnostics = [];
|
|
148
|
-
for (const member of rawMembers) {
|
|
149
|
-
if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(member)) {
|
|
150
|
-
diagnostics.push(parseError(line, `Invalid enum member name "${member}": expected <identifier>.`));
|
|
151
|
-
continue;
|
|
152
|
-
}
|
|
153
|
-
members.push(member);
|
|
154
|
-
}
|
|
155
|
-
if (diagnostics.length > 0) {
|
|
156
|
-
return { items: [], diagnostics };
|
|
157
|
-
}
|
|
158
|
-
return { items: [{ kind: 'enum', name, members, span }], diagnostics: [] };
|
|
137
|
+
return {
|
|
138
|
+
items: [],
|
|
139
|
+
diagnostics: [parseError(line, `Use "${enumDecl[1] ?? ''} .enum ..." for enums.`)],
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
const nameLeftEnum = /^([A-Za-z_][A-Za-z0-9_]*)\s+\.enum\s+(.+)$/.exec(text);
|
|
143
|
+
if (nameLeftEnum) {
|
|
144
|
+
return parseEnumItem(line, nameLeftEnum[1] ?? '', nameLeftEnum[2] ?? '', span);
|
|
159
145
|
}
|
|
160
|
-
const data = /^(\.db|\.dw)\s+(.+)
|
|
146
|
+
const data = /^(\.db|\.dw)\s+(.+)$/.exec(text);
|
|
161
147
|
if (data) {
|
|
162
148
|
const directive = (data[1] ?? '').slice(1).toLowerCase();
|
|
163
149
|
const valueText = data[2] ?? '';
|
|
@@ -166,9 +152,10 @@ function parseCanonicalStatement(line, text, span) {
|
|
|
166
152
|
? parts.map(parseDataValue).filter((value) => value !== undefined)
|
|
167
153
|
: parts.map(parseExpression).filter((value) => value !== undefined);
|
|
168
154
|
if (values.length !== parts.length) {
|
|
155
|
+
const quotePolicyError = parts.map(parseDataQuotePolicyError).find(Boolean);
|
|
169
156
|
return {
|
|
170
157
|
items: [],
|
|
171
|
-
diagnostics: [parseError(line, `invalid .${directive} value list`)],
|
|
158
|
+
diagnostics: [parseError(line, quotePolicyError ?? `invalid .${directive} value list`)],
|
|
172
159
|
};
|
|
173
160
|
}
|
|
174
161
|
return {
|
|
@@ -178,7 +165,7 @@ function parseCanonicalStatement(line, text, span) {
|
|
|
178
165
|
diagnostics: [],
|
|
179
166
|
};
|
|
180
167
|
}
|
|
181
|
-
const ds = /^\.ds\s+(.+)
|
|
168
|
+
const ds = /^\.ds\s+(.+)$/.exec(text);
|
|
182
169
|
if (ds) {
|
|
183
170
|
const parts = splitValueList(ds[1] ?? '');
|
|
184
171
|
if (parts.length < 1 || parts.length > 2) {
|
|
@@ -208,7 +195,7 @@ function parseCanonicalStatement(line, text, span) {
|
|
|
208
195
|
diagnostics: [],
|
|
209
196
|
};
|
|
210
197
|
}
|
|
211
|
-
const align = /^\.align\s+(.+)
|
|
198
|
+
const align = /^\.align\s+(.+)$/.exec(text);
|
|
212
199
|
if (align) {
|
|
213
200
|
const expressionText = align[1] ?? '';
|
|
214
201
|
const alignment = parseExpression(expressionText);
|
|
@@ -220,10 +207,10 @@ function parseCanonicalStatement(line, text, span) {
|
|
|
220
207
|
}
|
|
221
208
|
return { items: [{ kind: 'align', alignment, span }], diagnostics: [] };
|
|
222
209
|
}
|
|
223
|
-
if (/^\.end\s
|
|
210
|
+
if (/^\.end\s*$/.test(text)) {
|
|
224
211
|
return { items: [{ kind: 'end', span }], diagnostics: [] };
|
|
225
212
|
}
|
|
226
|
-
const rangeControl = /^(\.binfrom|\.binto)\s+(.+)
|
|
213
|
+
const rangeControl = /^(\.binfrom|\.binto)\s+(.+)$/.exec(text);
|
|
227
214
|
if (rangeControl) {
|
|
228
215
|
const kind = (rangeControl[1] ?? '').slice(1).toLowerCase();
|
|
229
216
|
const expressionText = rangeControl[2] ?? '';
|
|
@@ -236,7 +223,7 @@ function parseCanonicalStatement(line, text, span) {
|
|
|
236
223
|
}
|
|
237
224
|
return { items: [{ kind, expression, span }], diagnostics: [] };
|
|
238
225
|
}
|
|
239
|
-
const stringData = /^(\.cstr|\.pstr|\.istr)\s+(.+)
|
|
226
|
+
const stringData = /^(\.cstr|\.pstr|\.istr)\s+(.+)$/.exec(text);
|
|
240
227
|
if (stringData) {
|
|
241
228
|
const directive = (stringData[1] ?? '').slice(1).toLowerCase();
|
|
242
229
|
const valueText = stringData[2] ?? '';
|
|
@@ -244,7 +231,7 @@ function parseCanonicalStatement(line, text, span) {
|
|
|
244
231
|
if (value === undefined) {
|
|
245
232
|
return {
|
|
246
233
|
items: [],
|
|
247
|
-
diagnostics: [parseError(line, `.${directive} expects one quoted string`)],
|
|
234
|
+
diagnostics: [parseError(line, `.${directive} expects one double-quoted string`)],
|
|
248
235
|
};
|
|
249
236
|
}
|
|
250
237
|
return { items: [{ kind: 'string-data', directive, value, span }], diagnostics: [] };
|
|
@@ -267,6 +254,46 @@ function parseCanonicalStatement(line, text, span) {
|
|
|
267
254
|
}
|
|
268
255
|
return { items: [], diagnostics: [parseError(line, `unsupported source line: ${text}`)] };
|
|
269
256
|
}
|
|
257
|
+
function parseColonDeclarationError(name, statementText) {
|
|
258
|
+
if (/^\.equ\b/.test(statementText)) {
|
|
259
|
+
return `Use "${name} .equ ..." for constants; colon labels mark addresses.`;
|
|
260
|
+
}
|
|
261
|
+
if (/^\.enum\b/.test(statementText)) {
|
|
262
|
+
return `Use "${name} .enum ..." for enums; colon labels mark addresses.`;
|
|
263
|
+
}
|
|
264
|
+
if (/^\.typealias\b/.test(statementText)) {
|
|
265
|
+
return `Use "${name} .typealias ..." for type aliases; colon labels mark addresses.`;
|
|
266
|
+
}
|
|
267
|
+
if (/^\.type\b/.test(statementText)) {
|
|
268
|
+
return `Use "${name} .type" for layouts; colon labels mark addresses.`;
|
|
269
|
+
}
|
|
270
|
+
if (/^\.union\b/.test(statementText)) {
|
|
271
|
+
return `Use "${name} .union" for layouts; colon labels mark addresses.`;
|
|
272
|
+
}
|
|
273
|
+
return undefined;
|
|
274
|
+
}
|
|
275
|
+
function parseEnumItem(line, name, membersText, span) {
|
|
276
|
+
const rawMembers = membersText.split(',').map((member) => member.trim());
|
|
277
|
+
if (membersText.trim().length === 0 || rawMembers.some((member) => member.length === 0)) {
|
|
278
|
+
return {
|
|
279
|
+
items: [],
|
|
280
|
+
diagnostics: [parseError(line, `invalid enum member list`)],
|
|
281
|
+
};
|
|
282
|
+
}
|
|
283
|
+
const members = [];
|
|
284
|
+
const diagnostics = [];
|
|
285
|
+
for (const member of rawMembers) {
|
|
286
|
+
if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(member)) {
|
|
287
|
+
diagnostics.push(parseError(line, `Invalid enum member name "${member}": expected <identifier>.`));
|
|
288
|
+
continue;
|
|
289
|
+
}
|
|
290
|
+
members.push(member);
|
|
291
|
+
}
|
|
292
|
+
if (diagnostics.length > 0) {
|
|
293
|
+
return { items: [], diagnostics };
|
|
294
|
+
}
|
|
295
|
+
return { items: [{ kind: 'enum', name, members, span }], diagnostics: [] };
|
|
296
|
+
}
|
|
270
297
|
function parseTypeSizeExpression(text) {
|
|
271
298
|
const typeExpr = parseTypeExpr(text);
|
|
272
299
|
return typeExpr ? { kind: 'type-size', typeExpr } : undefined;
|
|
@@ -342,7 +369,7 @@ function parseDataValue(text) {
|
|
|
342
369
|
function parseWholeQuotedString(text) {
|
|
343
370
|
const input = text.trim();
|
|
344
371
|
const quote = input[0];
|
|
345
|
-
if (
|
|
372
|
+
if (quote !== '"' || input[input.length - 1] !== quote) {
|
|
346
373
|
return undefined;
|
|
347
374
|
}
|
|
348
375
|
let value = '';
|
|
@@ -363,6 +390,22 @@ function parseWholeQuotedString(text) {
|
|
|
363
390
|
}
|
|
364
391
|
return value;
|
|
365
392
|
}
|
|
393
|
+
function parseEquQuotePolicyError(text) {
|
|
394
|
+
if (!text.startsWith('"') || !text.endsWith('"')) {
|
|
395
|
+
return undefined;
|
|
396
|
+
}
|
|
397
|
+
const stringValue = parseWholeQuotedString(text);
|
|
398
|
+
return stringValue !== undefined && stringValue.length === 1
|
|
399
|
+
? 'double-quoted values are strings; use single quotes for character literals'
|
|
400
|
+
: undefined;
|
|
401
|
+
}
|
|
402
|
+
function parseDataQuotePolicyError(text) {
|
|
403
|
+
const input = text.trim();
|
|
404
|
+
if (!input.startsWith("'") || !input.endsWith("'")) {
|
|
405
|
+
return undefined;
|
|
406
|
+
}
|
|
407
|
+
return 'single quotes are for one character literal; use double quotes for strings';
|
|
408
|
+
}
|
|
366
409
|
function normalizeEntryLabelName(raw) {
|
|
367
410
|
return raw.startsWith('@') ? raw.slice(1) : raw;
|
|
368
411
|
}
|
|
@@ -68,6 +68,9 @@ function isPotentialOpInvocationLine(text) {
|
|
|
68
68
|
return false;
|
|
69
69
|
if (/^[A-Za-z_][A-Za-z0-9_]*\s+\.?equ\b/i.test(text))
|
|
70
70
|
return false;
|
|
71
|
+
if (/^[A-Za-z_][A-Za-z0-9_]*\s+\.(?:enum|type|union|typealias|field|byte|word|addr)\b/.test(text)) {
|
|
72
|
+
return false;
|
|
73
|
+
}
|
|
71
74
|
if (/^(?:op|end|enum|type|union|field|byte|word|addr)\b/i.test(text))
|
|
72
75
|
return false;
|
|
73
76
|
if (/^(?:org|equ|db|dw|ds|align|include|binfrom|binto|cstr|pstr|istr)\b/i.test(text)) {
|