@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
package/README.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
AZM is the Z80 assembler used by the Debug80 toolchain. It assembles plain
|
|
4
4
|
`.asm` and `.z80` source into machine-code artifacts for hardware, emulators,
|
|
5
|
-
and Debug80: Intel HEX, flat binary,
|
|
5
|
+
and Debug80: Intel HEX, flat binary, Debug80 maps, and optional
|
|
6
6
|
ASM80-compatible lowered source.
|
|
7
7
|
|
|
8
8
|
The user manual is the AZM book in the Debug80 documentation site:
|
|
@@ -22,19 +22,28 @@ AZM keeps the parts of the original assembler that matter for real Z80 work:
|
|
|
22
22
|
- global labels, with `@NAME:` labels marking routine entries for register-care
|
|
23
23
|
analysis
|
|
24
24
|
- canonical dotted directives such as `.org`, `.equ`, `.db`, `.dw`, and `.ds`
|
|
25
|
-
- compatibility spelling for common undotted directive heads such as
|
|
26
|
-
`EQU`, `DB`, `DW`, and `DS`
|
|
25
|
+
- exact compatibility spelling for common undotted directive heads such as
|
|
26
|
+
`ORG`, `EQU`, `DB`, `DW`, and `DS`
|
|
27
|
+
- lowercase, case-sensitive canonical dotted directives; compatibility spellings
|
|
28
|
+
are handled as directive aliases, not as canonical AZM style
|
|
29
|
+
- colon labels are address labels only; declarations use name-left forms such as
|
|
30
|
+
`Name .equ`, `Name .enum`, `Name .type`, `Name .union`, and
|
|
31
|
+
`Name .typealias`
|
|
27
32
|
- textual `.include`
|
|
33
|
+
- conditional source inclusion with lowercase `.if`, `.else`, and `.endif`
|
|
28
34
|
- register-care contracts, AZMDoc comments, and `.asmi` external interfaces
|
|
29
35
|
- `op` definitions for structured inline instruction idioms
|
|
30
36
|
- enums and qualified enum constants
|
|
31
|
-
- `.type` / `.union` layout metadata
|
|
37
|
+
- `.type` / `.union` layout metadata and `Name .typealias TypeExpr` layout aliases
|
|
32
38
|
- compile-time layout constants such as `sizeof(...)`, `offset(...)`, scalar
|
|
33
|
-
layout sizes,
|
|
39
|
+
layout sizes, constant-only layout casts, `LSB(...)`, and `MSB(...)`
|
|
40
|
+
- case-sensitive AZM function names with documented spelling, such as
|
|
41
|
+
`sizeof(...)`, `offset(...)`, `LSB(...)`, and `MSB(...)`
|
|
34
42
|
- data directives including `.db`, `.dw`, `.ds`, `.cstr`, `.pstr`, and `.istr`
|
|
43
|
+
- single quotes are character literals; double quotes are strings
|
|
35
44
|
|
|
36
45
|
AZM does not implement text macros, local labels, modules/imports, `func`,
|
|
37
|
-
formal arguments, generated stack frames, structured control flow, typed
|
|
46
|
+
formal arguments, generated stack frames, runtime structured control flow, typed
|
|
38
47
|
assignment lowering, hidden typed load/store lowering, or named section blocks.
|
|
39
48
|
Those features belong to older high-level ZAX-era code paths, not current AZM
|
|
40
49
|
source.
|
|
@@ -96,14 +105,13 @@ using the same base path.
|
|
|
96
105
|
| -------------- | --------------------------------------------- |
|
|
97
106
|
| `.hex` | Intel HEX |
|
|
98
107
|
| `.bin` | flat binary |
|
|
99
|
-
| `.lst` | listing with bytes and symbols |
|
|
100
108
|
| `.d8.json` | Debug80 map |
|
|
101
109
|
| `.z80` | ASM80-compatible lowered source when enabled |
|
|
102
110
|
| `.regcare.txt` | register-care report when enabled |
|
|
103
111
|
| `.asmi` | inferred register-care interface when enabled |
|
|
104
112
|
|
|
105
113
|
The `.z80` output is a generated compatibility artifact for ASM80-style
|
|
106
|
-
workflows and comparison tooling. BIN, HEX,
|
|
114
|
+
workflows and comparison tooling. BIN, HEX, Debug80 maps, and
|
|
107
115
|
register-care reports are the normal production outputs.
|
|
108
116
|
|
|
109
117
|
## Small Example
|
|
@@ -142,7 +150,6 @@ const result = await compile(
|
|
|
142
150
|
sourceRoot: '/abs/path/to/project',
|
|
143
151
|
d8mInputs: {
|
|
144
152
|
hex: '/abs/path/to/project/build/main.hex',
|
|
145
|
-
listing: '/abs/path/to/project/build/main.lst',
|
|
146
153
|
},
|
|
147
154
|
},
|
|
148
155
|
{ formats: defaultFormatWriters },
|
|
@@ -20,14 +20,12 @@ export interface CompileNextFunctionOptions {
|
|
|
20
20
|
readonly outputType?: 'bin' | 'hex';
|
|
21
21
|
readonly sourceRoot?: string;
|
|
22
22
|
readonly d8mInputs?: {
|
|
23
|
-
readonly listing?: string;
|
|
24
23
|
readonly hex?: string;
|
|
25
24
|
readonly bin?: string;
|
|
26
25
|
};
|
|
27
26
|
readonly emitBin?: boolean;
|
|
28
27
|
readonly emitHex?: boolean;
|
|
29
28
|
readonly emitD8m?: boolean;
|
|
30
|
-
readonly emitListing?: boolean;
|
|
31
29
|
readonly emitAsm80?: boolean;
|
|
32
30
|
readonly registerCare?: RegisterCareMode;
|
|
33
31
|
readonly emitRegisterReport?: boolean;
|
package/dist/src/api-compile.js
CHANGED
|
@@ -152,7 +152,6 @@ export async function compile(entryFile, options = {}, deps = { formats: default
|
|
|
152
152
|
packageVersion: await readPackageVersion(),
|
|
153
153
|
inputs: {
|
|
154
154
|
entry: normalizedEntry,
|
|
155
|
-
...(options.d8mInputs?.listing !== undefined ? { listing: options.d8mInputs.listing } : {}),
|
|
156
155
|
...(options.d8mInputs?.hex !== undefined ? { hex: options.d8mInputs.hex } : {}),
|
|
157
156
|
...(options.d8mInputs?.bin !== undefined ? { bin: options.d8mInputs.bin } : {}),
|
|
158
157
|
},
|
|
@@ -163,11 +162,6 @@ export async function compile(entryFile, options = {}, deps = { formats: default
|
|
|
163
162
|
};
|
|
164
163
|
artifacts.push(deps.formats.writeD8m(sidecarMap, symbols, d8mOpts));
|
|
165
164
|
}
|
|
166
|
-
if (emit.emitListing) {
|
|
167
|
-
if (deps.formats.writeListing !== undefined) {
|
|
168
|
-
artifacts.push(deps.formats.writeListing(sidecarMap, symbols));
|
|
169
|
-
}
|
|
170
|
-
}
|
|
171
165
|
if (emit.emitAsm80) {
|
|
172
166
|
if (deps.formats.writeAsm80 !== undefined) {
|
|
173
167
|
try {
|
|
@@ -196,9 +190,8 @@ function compileArtifactDefaults(options) {
|
|
|
196
190
|
const emitBin = anyPrimary ? (options.emitBin ?? false) : true;
|
|
197
191
|
const emitHex = anyPrimary ? (options.emitHex ?? false) : true;
|
|
198
192
|
const emitD8m = anyPrimary ? (options.emitD8m ?? false) : true;
|
|
199
|
-
const emitListing = options.emitListing ?? true;
|
|
200
193
|
const emitAsm80 = options.emitAsm80 ?? false;
|
|
201
|
-
return { emitBin, emitHex, emitD8m,
|
|
194
|
+
return { emitBin, emitHex, emitD8m, emitAsm80 };
|
|
202
195
|
}
|
|
203
196
|
function assembledImageToMap(bytes, origin, sourceSegments = []) {
|
|
204
197
|
const map = new Map();
|
|
@@ -52,6 +52,9 @@ function buildAddressStateOnce(items, diagnostics, previous, reportUnknown) {
|
|
|
52
52
|
case 'type':
|
|
53
53
|
defineLayout(layouts, labels, equates, enumNamesLower, item.name, item.layoutKind, item.fields, item.span, diagnostics);
|
|
54
54
|
break;
|
|
55
|
+
case 'type-alias':
|
|
56
|
+
defineTypeAlias(layouts, labels, equates, enumNamesLower, item.name, item.typeExpr, item.span, diagnostics);
|
|
57
|
+
break;
|
|
55
58
|
case 'equ':
|
|
56
59
|
defineEquate(equates, labels, layouts, enumNames, enumNamesLower, item.name, item.expression, item.span, placementAddress(placement), diagnostics, item.stringValue);
|
|
57
60
|
break;
|
|
@@ -156,7 +159,11 @@ function addressStateSignature(state) {
|
|
|
156
159
|
return JSON.stringify({
|
|
157
160
|
labels: state.labels,
|
|
158
161
|
equates: [...state.equates].map(([name, record]) => [name, record.currentLocation]),
|
|
159
|
-
layouts: [...state.layouts].map(([name, record]) => [
|
|
162
|
+
layouts: [...state.layouts].map(([name, record]) => [
|
|
163
|
+
name,
|
|
164
|
+
record.kind,
|
|
165
|
+
record.kind === 'alias' ? record.typeExpr : record.fields,
|
|
166
|
+
]),
|
|
160
167
|
origin: state.origin,
|
|
161
168
|
});
|
|
162
169
|
}
|
|
@@ -180,6 +187,17 @@ function defineLayout(layouts, labels, equates, enumNamesLower, name, layoutKind
|
|
|
180
187
|
}
|
|
181
188
|
layouts.set(name, { kind: layoutKind, fields, span });
|
|
182
189
|
}
|
|
190
|
+
function defineTypeAlias(layouts, labels, equates, enumNamesLower, name, typeExpr, span, diagnostics) {
|
|
191
|
+
const lowerName = name.toLowerCase();
|
|
192
|
+
if (hasCaseInsensitiveMapKey(layouts, lowerName) ||
|
|
193
|
+
hasCaseInsensitiveKey(labels, lowerName) ||
|
|
194
|
+
hasCaseInsensitiveMapKey(equates, lowerName) ||
|
|
195
|
+
enumNamesLower.has(lowerName)) {
|
|
196
|
+
diagnostics.push(diagnostic(span, `duplicate type name: ${name}`));
|
|
197
|
+
return;
|
|
198
|
+
}
|
|
199
|
+
layouts.set(name, { kind: 'alias', typeExpr, span });
|
|
200
|
+
}
|
|
183
201
|
function defineLabel(labels, equates, layouts, enumNamesLower, name, address, span, diagnostics) {
|
|
184
202
|
if (labels[name] !== undefined ||
|
|
185
203
|
equates.has(name) ||
|
|
@@ -7,7 +7,6 @@ export function cliUsage() {
|
|
|
7
7
|
'Options:',
|
|
8
8
|
' -o, --output <file> Primary output path (must match --type extension)',
|
|
9
9
|
' -t, --type <type> Primary output type: hex|bin (default: hex)',
|
|
10
|
-
' -n, --nolist Suppress .lst',
|
|
11
10
|
' --nobin Suppress .bin',
|
|
12
11
|
' --nohex Suppress .hex',
|
|
13
12
|
' --nod8m Suppress .d8.json',
|
|
@@ -44,7 +43,6 @@ function createDefaultCliState() {
|
|
|
44
43
|
emitBin: true,
|
|
45
44
|
emitHex: true,
|
|
46
45
|
emitD8m: true,
|
|
47
|
-
emitListing: true,
|
|
48
46
|
emitAsm80: false,
|
|
49
47
|
caseStyle: 'off',
|
|
50
48
|
registerCare: 'off',
|
|
@@ -249,7 +247,6 @@ function finalizeCliOptions(state) {
|
|
|
249
247
|
emitBin: state.emitBin,
|
|
250
248
|
emitHex: state.emitHex,
|
|
251
249
|
emitD8m: state.emitD8m,
|
|
252
|
-
emitListing: state.emitListing,
|
|
253
250
|
emitAsm80: state.emitAsm80,
|
|
254
251
|
caseStyle: state.caseStyle,
|
|
255
252
|
registerCare: state.registerCare,
|
|
@@ -278,10 +275,6 @@ export function parseCliArgs(argv) {
|
|
|
278
275
|
continue;
|
|
279
276
|
if (parseOutputTypeArg(arg, argv, indexRef, state))
|
|
280
277
|
continue;
|
|
281
|
-
if (arg === '-n' || arg === '--nolist') {
|
|
282
|
-
state.emitListing = false;
|
|
283
|
-
continue;
|
|
284
|
-
}
|
|
285
278
|
if (arg === '--nobin') {
|
|
286
279
|
state.emitBin = false;
|
|
287
280
|
continue;
|
|
@@ -52,7 +52,6 @@ export async function writeArtifacts(base, artifacts, outputType) {
|
|
|
52
52
|
const hexPath = `${base}.hex`;
|
|
53
53
|
const binPath = `${base}.bin`;
|
|
54
54
|
const d8mPath = `${base}.d8.json`;
|
|
55
|
-
const lstPath = `${base}.lst`;
|
|
56
55
|
const asm80Path = `${base}.z80`;
|
|
57
56
|
const registerCareReportPath = `${base}.regcare.txt`;
|
|
58
57
|
const registerCareInterfacePath = `${base}.asmi`;
|
|
@@ -90,13 +89,6 @@ export async function writeArtifacts(base, artifacts, outputType) {
|
|
|
90
89
|
await writeFile(d8mPath, `${text}\n`, 'utf8');
|
|
91
90
|
})());
|
|
92
91
|
}
|
|
93
|
-
const lst = byKind.get('lst');
|
|
94
|
-
if (lst && lst.kind === 'lst') {
|
|
95
|
-
writes.push((async () => {
|
|
96
|
-
await ensureDir(lstPath);
|
|
97
|
-
await writeFile(lstPath, lst.text, 'utf8');
|
|
98
|
-
})());
|
|
99
|
-
}
|
|
100
92
|
const asm80 = byKind.get('asm80');
|
|
101
93
|
if (asm80 && asm80.kind === 'asm80') {
|
|
102
94
|
writes.push((async () => {
|
|
@@ -141,14 +133,12 @@ export async function writeArtifacts(base, artifacts, outputType) {
|
|
|
141
133
|
export function buildCompileOptions(parsed, base) {
|
|
142
134
|
const hexPath = `${base}.hex`;
|
|
143
135
|
const binPath = `${base}.bin`;
|
|
144
|
-
const lstPath = `${base}.lst`;
|
|
145
136
|
return {
|
|
146
137
|
includeDirs: parsed.includeDirs,
|
|
147
138
|
directiveAliasFiles: parsed.directiveAliasFiles,
|
|
148
139
|
emitBin: parsed.emitBin,
|
|
149
140
|
emitHex: parsed.emitHex,
|
|
150
141
|
emitD8m: parsed.emitD8m,
|
|
151
|
-
emitListing: parsed.emitListing,
|
|
152
142
|
emitAsm80: parsed.emitAsm80,
|
|
153
143
|
caseStyle: parsed.caseStyle,
|
|
154
144
|
registerCare: parsed.registerCare,
|
|
@@ -165,7 +155,6 @@ export function buildCompileOptions(parsed, base) {
|
|
|
165
155
|
...(parsed.sourceRoot !== undefined
|
|
166
156
|
? {
|
|
167
157
|
d8mInputs: {
|
|
168
|
-
...(parsed.emitListing ? { listing: lstPath } : {}),
|
|
169
158
|
...(parsed.emitHex ? { hex: hexPath } : {}),
|
|
170
159
|
...(parsed.emitBin ? { bin: binPath } : {}),
|
|
171
160
|
},
|
package/dist/src/core/compile.js
CHANGED
|
@@ -4,15 +4,18 @@ import { createSourceFile } from '../source/source-file.js';
|
|
|
4
4
|
import { scanLogicalLines } from '../source/logical-lines.js';
|
|
5
5
|
import { stripLineComment } from '../source/strip-line-comment.js';
|
|
6
6
|
import { parseLogicalLine } from '../syntax/parse-line.js';
|
|
7
|
-
import { parseTypeExpr } from '../syntax/parse-expression.js';
|
|
7
|
+
import { parseExpression, parseTypeExpr } from '../syntax/parse-expression.js';
|
|
8
8
|
import { collectOps, expandOpInvocation, parseOpInvocation } from '../expansion/op-expansion.js';
|
|
9
|
+
import { normalizeDirectiveAlias } from '../syntax/directive-aliases.js';
|
|
10
|
+
import { evaluateExpression, lookupEquateRecord, } from '../semantics/expression-evaluation.js';
|
|
9
11
|
export function parseNextSourceItems(lines, options = {}) {
|
|
10
12
|
const diagnostics = [];
|
|
11
13
|
const items = [];
|
|
12
|
-
const pendingLines = [...lines];
|
|
13
14
|
const parseOptions = options.directiveAliasPolicy === undefined
|
|
14
15
|
? {}
|
|
15
16
|
: { directiveAliasPolicy: options.directiveAliasPolicy };
|
|
17
|
+
const conditional = applyConditionalAssembly(lines, diagnostics, parseOptions.directiveAliasPolicy);
|
|
18
|
+
const pendingLines = [...conditional.lines];
|
|
16
19
|
const { ops, opLineIndexes } = collectOps(pendingLines, diagnostics, parseOptions);
|
|
17
20
|
let afterTopLevelEnd = false;
|
|
18
21
|
for (let index = 0; index < pendingLines.length; index += 1) {
|
|
@@ -23,9 +26,61 @@ export function parseNextSourceItems(lines, options = {}) {
|
|
|
23
26
|
if (afterTopLevelEnd && !isPostEndParseAllowed(line.text)) {
|
|
24
27
|
continue;
|
|
25
28
|
}
|
|
26
|
-
const
|
|
29
|
+
const colonLayoutHeader = /^([A-Za-z_][A-Za-z0-9_]*):\s*\.(type|union)\s*$/.exec(stripLineComment(line.text).trim());
|
|
30
|
+
if (colonLayoutHeader) {
|
|
31
|
+
const directive = colonLayoutHeader[2] ?? 'type';
|
|
32
|
+
diagnostics.push(parseDiagnostic(line, `Use "${colonLayoutHeader[1] ?? ''} .${directive}" for layouts; colon labels mark addresses.`));
|
|
33
|
+
const endDirective = directive === 'union' ? '.endunion' : '.endtype';
|
|
34
|
+
for (index += 1; index < pendingLines.length; index += 1) {
|
|
35
|
+
if (stripLineComment(pendingLines[index].text).trim() === endDirective) {
|
|
36
|
+
break;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
continue;
|
|
40
|
+
}
|
|
41
|
+
const nameLeftTypeAlias = /^([A-Za-z_][A-Za-z0-9_]*)\s+\.typealias\s+(.+)$/.exec(stripLineComment(line.text).trim());
|
|
42
|
+
if (nameLeftTypeAlias) {
|
|
43
|
+
const typeExprText = nameLeftTypeAlias[2] ?? '';
|
|
44
|
+
const typeExpr = parseTypeExpr(typeExprText);
|
|
45
|
+
if (!typeExpr) {
|
|
46
|
+
diagnostics.push(parseDiagnostic(line, `invalid .typealias target: ${typeExprText}`));
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
items.push({
|
|
50
|
+
kind: 'type-alias',
|
|
51
|
+
name: nameLeftTypeAlias[1] ?? '',
|
|
52
|
+
typeExpr,
|
|
53
|
+
span: { sourceName: line.sourceName, line: line.line, column: firstColumn(line.text) },
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
continue;
|
|
57
|
+
}
|
|
58
|
+
const typeAlias = /^\.type\s+([A-Za-z_][A-Za-z0-9_]*)\s*=\s*(.+)$/.exec(stripLineComment(line.text).trim());
|
|
59
|
+
if (typeAlias) {
|
|
60
|
+
diagnostics.push(parseDiagnostic(line, `Use "${typeAlias[1] ?? ''} .typealias ..." for type aliases.`));
|
|
61
|
+
continue;
|
|
62
|
+
}
|
|
63
|
+
const nameLeftLayoutHeader = /^([A-Za-z_][A-Za-z0-9_]*)\s+\.(type|union)\s*$/.exec(stripLineComment(line.text).trim());
|
|
64
|
+
const prefixLayoutHeader = /^\.(type|union)\s+([A-Za-z_][A-Za-z0-9_]*)\s*$/.exec(stripLineComment(line.text).trim());
|
|
65
|
+
if (prefixLayoutHeader) {
|
|
66
|
+
const directive = prefixLayoutHeader[1] ?? 'type';
|
|
67
|
+
diagnostics.push(parseDiagnostic(line, `Use "${prefixLayoutHeader[2] ?? ''} .${directive}" for layouts.`));
|
|
68
|
+
const endDirective = directive === 'union' ? '.endunion' : '.endtype';
|
|
69
|
+
for (index += 1; index < pendingLines.length; index += 1) {
|
|
70
|
+
if (stripLineComment(pendingLines[index].text).trim() === endDirective) {
|
|
71
|
+
break;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
continue;
|
|
75
|
+
}
|
|
76
|
+
const layoutHeader = nameLeftLayoutHeader
|
|
77
|
+
? {
|
|
78
|
+
directive: nameLeftLayoutHeader[2] ?? '',
|
|
79
|
+
name: nameLeftLayoutHeader[1] ?? '',
|
|
80
|
+
}
|
|
81
|
+
: undefined;
|
|
27
82
|
if (layoutHeader) {
|
|
28
|
-
const layoutKind =
|
|
83
|
+
const layoutKind = layoutHeader.directive === 'union' ? 'union' : 'record';
|
|
29
84
|
const endDirective = layoutKind === 'union' ? '.endunion' : '.endtype';
|
|
30
85
|
const fields = [];
|
|
31
86
|
let terminated = false;
|
|
@@ -35,23 +90,23 @@ export function parseNextSourceItems(lines, options = {}) {
|
|
|
35
90
|
if (fieldText.length === 0) {
|
|
36
91
|
continue;
|
|
37
92
|
}
|
|
38
|
-
if (fieldText
|
|
93
|
+
if (fieldText === endDirective) {
|
|
39
94
|
terminated = true;
|
|
40
95
|
break;
|
|
41
96
|
}
|
|
42
97
|
const field = parseLayoutField(fieldText);
|
|
43
98
|
if (!field) {
|
|
44
|
-
diagnostics.push(parseDiagnostic(fieldLine, `invalid .${layoutHeader
|
|
99
|
+
diagnostics.push(parseDiagnostic(fieldLine, `invalid .${layoutHeader.directive} field declaration`));
|
|
45
100
|
continue;
|
|
46
101
|
}
|
|
47
102
|
fields.push(field);
|
|
48
103
|
}
|
|
49
104
|
if (!terminated) {
|
|
50
|
-
diagnostics.push(parseDiagnostic(line, `.${layoutHeader
|
|
105
|
+
diagnostics.push(parseDiagnostic(line, `.${layoutHeader.directive} ${layoutHeader.name} missing ${endDirective}`));
|
|
51
106
|
}
|
|
52
107
|
items.push({
|
|
53
108
|
kind: 'type',
|
|
54
|
-
name: layoutHeader
|
|
109
|
+
name: layoutHeader.name,
|
|
55
110
|
layoutKind,
|
|
56
111
|
fields,
|
|
57
112
|
span: { sourceName: line.sourceName, line: line.line, column: firstColumn(line.text) },
|
|
@@ -78,6 +133,134 @@ export function parseNextSourceItems(lines, options = {}) {
|
|
|
78
133
|
}
|
|
79
134
|
return { diagnostics, items };
|
|
80
135
|
}
|
|
136
|
+
function applyConditionalAssembly(lines, diagnostics, directiveAliasPolicy) {
|
|
137
|
+
const out = [];
|
|
138
|
+
const equates = new Map();
|
|
139
|
+
const locationDependentEquates = new Set();
|
|
140
|
+
const stack = [];
|
|
141
|
+
for (const line of lines) {
|
|
142
|
+
const text = stripLineComment(line.text).trim();
|
|
143
|
+
const ifDirective = /^\.if\s+(.+)$/.exec(text);
|
|
144
|
+
if (ifDirective) {
|
|
145
|
+
const parentActive = conditionalActive(stack);
|
|
146
|
+
const expressionText = ifDirective[1] ?? '';
|
|
147
|
+
const value = parentActive
|
|
148
|
+
? evaluateConditionalExpression(line, expressionText, equates, locationDependentEquates, diagnostics)
|
|
149
|
+
: undefined;
|
|
150
|
+
const conditionActive = parentActive && value !== undefined && value !== 0;
|
|
151
|
+
stack.push({ line, parentActive, conditionActive, elseSeen: false });
|
|
152
|
+
continue;
|
|
153
|
+
}
|
|
154
|
+
if (/^\.else\s*$/.test(text)) {
|
|
155
|
+
const frame = stack.pop();
|
|
156
|
+
if (!frame) {
|
|
157
|
+
diagnostics.push(parseDiagnostic(line, 'unmatched .else'));
|
|
158
|
+
continue;
|
|
159
|
+
}
|
|
160
|
+
if (frame.elseSeen) {
|
|
161
|
+
diagnostics.push(parseDiagnostic(line, 'duplicate .else'));
|
|
162
|
+
}
|
|
163
|
+
stack.push({
|
|
164
|
+
line: frame.line,
|
|
165
|
+
parentActive: frame.parentActive,
|
|
166
|
+
conditionActive: frame.parentActive && !frame.conditionActive,
|
|
167
|
+
elseSeen: true,
|
|
168
|
+
});
|
|
169
|
+
continue;
|
|
170
|
+
}
|
|
171
|
+
if (/^\.endif\s*$/.test(text)) {
|
|
172
|
+
if (!stack.pop()) {
|
|
173
|
+
diagnostics.push(parseDiagnostic(line, 'unmatched .endif'));
|
|
174
|
+
}
|
|
175
|
+
continue;
|
|
176
|
+
}
|
|
177
|
+
if (!conditionalActive(stack)) {
|
|
178
|
+
continue;
|
|
179
|
+
}
|
|
180
|
+
out.push(line);
|
|
181
|
+
recordConditionalEquate(line, equates, locationDependentEquates, directiveAliasPolicy);
|
|
182
|
+
}
|
|
183
|
+
for (const frame of stack) {
|
|
184
|
+
diagnostics.push(parseDiagnostic(frame.line, 'unterminated .if'));
|
|
185
|
+
}
|
|
186
|
+
return { lines: out };
|
|
187
|
+
}
|
|
188
|
+
function conditionalActive(stack) {
|
|
189
|
+
return stack.every((frame) => frame.parentActive && frame.conditionActive);
|
|
190
|
+
}
|
|
191
|
+
function evaluateConditionalExpression(line, expressionText, equates, locationDependentEquates, diagnostics) {
|
|
192
|
+
const expression = parseExpression(expressionText);
|
|
193
|
+
if (!expression) {
|
|
194
|
+
diagnostics.push(parseDiagnostic(line, `invalid .if expression: ${expressionText}`));
|
|
195
|
+
return undefined;
|
|
196
|
+
}
|
|
197
|
+
if (expressionReferencesCurrentLocation(expression, equates, locationDependentEquates)) {
|
|
198
|
+
diagnostics.push(parseDiagnostic(line, 'invalid .if expression: current location is not available during conditional assembly'));
|
|
199
|
+
return undefined;
|
|
200
|
+
}
|
|
201
|
+
return evaluateExpression(expression, {}, equates, { sourceName: line.sourceName, line: line.line, column: firstColumn(line.text) }, diagnostics, { currentLocation: 0 });
|
|
202
|
+
}
|
|
203
|
+
function recordConditionalEquate(line, equates, locationDependentEquates, directiveAliasPolicy) {
|
|
204
|
+
const text = normalizeDirectiveAlias(stripLineComment(line.text), directiveAliasPolicy).trim();
|
|
205
|
+
const statement = /^(@?[A-Za-z_.$?][A-Za-z0-9_.$?]*):\s*(.+)$/.exec(text);
|
|
206
|
+
if (statement && /^\.equ\b/.test(statement[2] ?? '')) {
|
|
207
|
+
return;
|
|
208
|
+
}
|
|
209
|
+
const equ = /^([A-Za-z_.$?][A-Za-z0-9_.$?]*)\s+\.equ\s+(.+)$/.exec(text);
|
|
210
|
+
if (!equ) {
|
|
211
|
+
return;
|
|
212
|
+
}
|
|
213
|
+
const name = equ[1] ?? '';
|
|
214
|
+
const expressionText = equ[2] ?? '';
|
|
215
|
+
const expression = parseExpression(expressionText);
|
|
216
|
+
if (!expression) {
|
|
217
|
+
return;
|
|
218
|
+
}
|
|
219
|
+
if (expressionReferencesCurrentLocation(expression, equates, locationDependentEquates)) {
|
|
220
|
+
locationDependentEquates.add(canonicalConditionalSymbolKey(name));
|
|
221
|
+
}
|
|
222
|
+
equates.set(name, {
|
|
223
|
+
expression,
|
|
224
|
+
span: { sourceName: line.sourceName, line: line.line, column: firstColumn(line.text) },
|
|
225
|
+
currentLocation: 0,
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
function expressionReferencesCurrentLocation(expression, equates, locationDependentEquates, visiting = new Set()) {
|
|
229
|
+
switch (expression.kind) {
|
|
230
|
+
case 'current-location':
|
|
231
|
+
return true;
|
|
232
|
+
case 'symbol': {
|
|
233
|
+
if (locationDependentEquates.has(canonicalConditionalSymbolKey(expression.name))) {
|
|
234
|
+
return true;
|
|
235
|
+
}
|
|
236
|
+
const lookup = lookupEquateRecord(equates, expression.name);
|
|
237
|
+
if (!lookup || visiting.has(canonicalConditionalSymbolKey(lookup.key))) {
|
|
238
|
+
return false;
|
|
239
|
+
}
|
|
240
|
+
const nextVisiting = new Set(visiting);
|
|
241
|
+
nextVisiting.add(canonicalConditionalSymbolKey(lookup.key));
|
|
242
|
+
return expressionReferencesCurrentLocation(lookup.record.expression, equates, locationDependentEquates, nextVisiting);
|
|
243
|
+
}
|
|
244
|
+
case 'byte-function':
|
|
245
|
+
case 'unary':
|
|
246
|
+
return expressionReferencesCurrentLocation(expression.expression, equates, locationDependentEquates, visiting);
|
|
247
|
+
case 'binary':
|
|
248
|
+
return (expressionReferencesCurrentLocation(expression.left, equates, locationDependentEquates, visiting) ||
|
|
249
|
+
expressionReferencesCurrentLocation(expression.right, equates, locationDependentEquates, visiting));
|
|
250
|
+
case 'layout-cast':
|
|
251
|
+
return (expressionReferencesCurrentLocation(expression.base, equates, locationDependentEquates, visiting) ||
|
|
252
|
+
expression.path.some((part) => part.kind === 'index' &&
|
|
253
|
+
expressionReferencesCurrentLocation(part.expression, equates, locationDependentEquates, visiting)));
|
|
254
|
+
case 'number':
|
|
255
|
+
case 'type-size':
|
|
256
|
+
case 'sizeof':
|
|
257
|
+
case 'offset':
|
|
258
|
+
return false;
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
function canonicalConditionalSymbolKey(name) {
|
|
262
|
+
return name.toLowerCase();
|
|
263
|
+
}
|
|
81
264
|
export function compileSource(sourceText, options = {}) {
|
|
82
265
|
const source = createSourceFile(options.entryName ?? '<memory>', sourceText);
|
|
83
266
|
const { diagnostics, items } = parseNextSourceItems(scanLogicalLines(source));
|
|
@@ -107,7 +290,7 @@ function isPostEndParseAllowed(text) {
|
|
|
107
290
|
return /^(?:\.binfrom|\.binto|binfrom|binto)\b/i.test(stripLineComment(text).trim());
|
|
108
291
|
}
|
|
109
292
|
function parseLayoutField(text) {
|
|
110
|
-
const match = /^([A-Za-z_][A-Za-z0-9_]*)\s+(\.(?:field|byte|word|addr))(?:\s+(.+))
|
|
293
|
+
const match = /^([A-Za-z_][A-Za-z0-9_]*)\s+(\.(?:field|byte|word|addr))(?:\s+(.+))?$/.exec(text);
|
|
111
294
|
if (!match) {
|
|
112
295
|
return undefined;
|
|
113
296
|
}
|
|
@@ -12,6 +12,10 @@ export type Expression = {
|
|
|
12
12
|
} | {
|
|
13
13
|
readonly kind: 'sizeof';
|
|
14
14
|
readonly typeExpr: TypeExpr;
|
|
15
|
+
} | {
|
|
16
|
+
readonly kind: 'byte-function';
|
|
17
|
+
readonly function: 'LSB' | 'MSB';
|
|
18
|
+
readonly expression: Expression;
|
|
15
19
|
} | {
|
|
16
20
|
readonly kind: 'offset';
|
|
17
21
|
readonly typeExpr: TypeExpr;
|
|
@@ -60,6 +60,11 @@ export type SourceItem = {
|
|
|
60
60
|
readonly layoutKind: 'record' | 'union';
|
|
61
61
|
readonly fields: readonly LayoutField[];
|
|
62
62
|
readonly span: SourceSpan;
|
|
63
|
+
} | {
|
|
64
|
+
readonly kind: 'type-alias';
|
|
65
|
+
readonly name: string;
|
|
66
|
+
readonly typeExpr: TypeExpr;
|
|
67
|
+
readonly span: SourceSpan;
|
|
63
68
|
} | {
|
|
64
69
|
readonly kind: 'string-data';
|
|
65
70
|
readonly directive: 'cstr' | 'pstr' | 'istr';
|
|
@@ -1,13 +1,11 @@
|
|
|
1
1
|
import { writeBin } from './write-bin.js';
|
|
2
2
|
import { writeD8m } from './write-d8.js';
|
|
3
3
|
import { writeHex } from './write-hex.js';
|
|
4
|
-
import { writeListing } from './write-listing.js';
|
|
5
4
|
import { writeAsm80 } from './write-asm80.js';
|
|
6
5
|
/** Default in-memory writers for Stage 12 compile API. */
|
|
7
6
|
export const defaultFormatWriters = {
|
|
8
7
|
writeBin,
|
|
9
8
|
writeHex,
|
|
10
9
|
writeD8m,
|
|
11
|
-
writeListing,
|
|
12
10
|
writeAsm80,
|
|
13
11
|
};
|
|
@@ -21,7 +21,7 @@ export interface EmittedSourceSegment {
|
|
|
21
21
|
kind: D8mSegmentKind;
|
|
22
22
|
confidence: D8mSegmentConfidence;
|
|
23
23
|
}
|
|
24
|
-
/** Symbol metadata shared by
|
|
24
|
+
/** Symbol metadata shared by output writers. */
|
|
25
25
|
export type SymbolEntry = {
|
|
26
26
|
kind: 'label' | 'data';
|
|
27
27
|
name: string;
|
|
@@ -50,12 +50,6 @@ export interface HexArtifact {
|
|
|
50
50
|
path?: string;
|
|
51
51
|
text: string;
|
|
52
52
|
}
|
|
53
|
-
/** Listing artifact. */
|
|
54
|
-
export interface ListingArtifact {
|
|
55
|
-
kind: 'lst';
|
|
56
|
-
path?: string;
|
|
57
|
-
text: string;
|
|
58
|
-
}
|
|
59
53
|
/** In-memory register-care audit report artifact. */
|
|
60
54
|
export interface RegisterCareReportArtifact {
|
|
61
55
|
kind: 'register-care-report';
|
|
@@ -122,7 +116,6 @@ export interface D8mGenerator {
|
|
|
122
116
|
version?: string;
|
|
123
117
|
inputs?: {
|
|
124
118
|
entry?: string;
|
|
125
|
-
listing?: string;
|
|
126
119
|
hex?: string;
|
|
127
120
|
bin?: string;
|
|
128
121
|
};
|
|
@@ -153,16 +146,11 @@ export interface WriteBinOptions {
|
|
|
153
146
|
binFrom?: number;
|
|
154
147
|
startAddress?: number;
|
|
155
148
|
}
|
|
156
|
-
export interface WriteListingOptions {
|
|
157
|
-
lineEnding?: '\n' | '\r\n';
|
|
158
|
-
bytesPerLine?: number;
|
|
159
|
-
}
|
|
160
149
|
export interface WriteD8mOptions {
|
|
161
150
|
rootDir?: string;
|
|
162
151
|
packageVersion?: string;
|
|
163
152
|
inputs?: {
|
|
164
153
|
entry?: string;
|
|
165
|
-
listing?: string;
|
|
166
154
|
hex?: string;
|
|
167
155
|
bin?: string;
|
|
168
156
|
};
|
|
@@ -171,12 +159,11 @@ export interface WriteD8mOptions {
|
|
|
171
159
|
}
|
|
172
160
|
export interface WriteAsm80Options {
|
|
173
161
|
}
|
|
174
|
-
export type Artifact = BinArtifact | HexArtifact |
|
|
175
|
-
/** Writer contract used by the
|
|
162
|
+
export type Artifact = BinArtifact | HexArtifact | D8mArtifact | Asm80Artifact | RegisterCareReportArtifact | RegisterCareInterfaceArtifact | RegisterCareAnnotationsArtifact;
|
|
163
|
+
/** Writer contract used by the compile API. */
|
|
176
164
|
export interface FormatWriters {
|
|
177
165
|
writeHex(map: EmittedByteMap, symbols: readonly SymbolEntry[], opts?: WriteHexOptions): HexArtifact;
|
|
178
166
|
writeBin(map: EmittedByteMap, symbols: readonly SymbolEntry[], opts?: WriteBinOptions): BinArtifact;
|
|
179
167
|
writeD8m(map: EmittedByteMap, symbols: readonly SymbolEntry[], opts?: WriteD8mOptions): D8mArtifact;
|
|
180
|
-
writeListing?(map: EmittedByteMap, symbols: readonly SymbolEntry[], opts?: WriteListingOptions): ListingArtifact;
|
|
181
168
|
writeAsm80?(items: readonly SourceItem[], symbols: readonly SymbolEntry[], opts?: WriteAsm80Options): Asm80Artifact;
|
|
182
169
|
}
|