@jhlagado/azm 0.2.0 → 0.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +110 -78
- package/dist/src/api-compile.d.ts +0 -2
- package/dist/src/api-compile.js +2 -9
- package/dist/src/assembly/address-planning.js +21 -1
- package/dist/src/assembly/program-emission.js +1 -0
- package/dist/src/cli/parse-args.d.ts +0 -1
- package/dist/src/cli/parse-args.js +0 -7
- package/dist/src/cli/write-artifacts.js +0 -11
- package/dist/src/core/compile.js +192 -9
- package/dist/src/expansion/op-expansion.js +2 -0
- package/dist/src/model/expression.d.ts +4 -0
- package/dist/src/model/source-item.d.ts +11 -0
- package/dist/src/outputs/index.js +0 -2
- package/dist/src/outputs/types.d.ts +3 -16
- package/dist/src/outputs/write-asm80.js +206 -5
- package/dist/src/register-care/analyze.js +36 -8
- package/dist/src/register-care/annotations.js +33 -146
- package/dist/src/register-care/fix.d.ts +2 -0
- package/dist/src/register-care/fix.js +52 -0
- package/dist/src/register-care/instruction-shape.d.ts +11 -0
- package/dist/src/register-care/instruction-shape.js +129 -0
- package/dist/src/register-care/liveness.js +15 -7
- package/dist/src/register-care/profiles.js +4 -0
- package/dist/src/register-care/programModel.js +79 -13
- package/dist/src/register-care/report.d.ts +2 -1
- package/dist/src/register-care/report.js +91 -34
- package/dist/src/register-care/routine-summaries.d.ts +6 -0
- package/dist/src/register-care/routine-summaries.js +89 -0
- package/dist/src/register-care/summaries.d.ts +3 -3
- package/dist/src/register-care/summaries.js +42 -75
- package/dist/{legacy-root-azm/src/registerCare → src/register-care}/summary.js +33 -51
- package/dist/src/register-care/types.d.ts +6 -1
- package/dist/src/semantics/expression-evaluation.d.ts +7 -3
- package/dist/src/semantics/expression-evaluation.js +57 -0
- package/dist/src/source/strip-line-comment.d.ts +2 -0
- package/dist/src/source/strip-line-comment.js +26 -0
- package/dist/src/syntax/directive-aliases.js +9 -10
- package/dist/src/syntax/parse-diagnostics.d.ts +12 -0
- package/dist/src/syntax/parse-diagnostics.js +18 -0
- package/dist/src/syntax/parse-expression.js +34 -9
- package/dist/src/syntax/parse-line.js +150 -54
- package/dist/src/tooling/case-style.js +3 -0
- package/docs/reference/cli.md +6 -4
- package/docs/reference/tooling-api.md +13 -9
- package/package.json +4 -6
- package/dist/legacy-root-azm/src/analysis.d.ts +0 -11
- package/dist/legacy-root-azm/src/analysis.js +0 -41
- package/dist/legacy-root-azm/src/compile.d.ts +0 -10
- package/dist/legacy-root-azm/src/compile.js +0 -186
- package/dist/legacy-root-azm/src/compileShared.d.ts +0 -3
- package/dist/legacy-root-azm/src/compileShared.js +0 -7
- package/dist/legacy-root-azm/src/diagnosticTypes.d.ts +0 -77
- package/dist/legacy-root-azm/src/diagnosticTypes.js +0 -53
- package/dist/legacy-root-azm/src/formats/index.d.ts +0 -7
- package/dist/legacy-root-azm/src/formats/index.js +0 -17
- package/dist/legacy-root-azm/src/formats/range.d.ts +0 -17
- package/dist/legacy-root-azm/src/formats/range.js +0 -45
- package/dist/legacy-root-azm/src/formats/types.d.ts +0 -283
- package/dist/legacy-root-azm/src/formats/types.js +0 -1
- package/dist/legacy-root-azm/src/formats/writeAsm80.d.ts +0 -6
- package/dist/legacy-root-azm/src/formats/writeAsm80.js +0 -86
- package/dist/legacy-root-azm/src/formats/writeBin.d.ts +0 -7
- package/dist/legacy-root-azm/src/formats/writeBin.js +0 -23
- package/dist/legacy-root-azm/src/formats/writeD8m.d.ts +0 -9
- package/dist/legacy-root-azm/src/formats/writeD8m.js +0 -245
- package/dist/legacy-root-azm/src/formats/writeHex.d.ts +0 -8
- package/dist/legacy-root-azm/src/formats/writeHex.js +0 -38
- package/dist/legacy-root-azm/src/formats/writeListing.d.ts +0 -8
- package/dist/legacy-root-azm/src/formats/writeListing.js +0 -83
- package/dist/legacy-root-azm/src/frontend/asm80/asmLine.d.ts +0 -39
- package/dist/legacy-root-azm/src/frontend/asm80/asmLine.js +0 -89
- package/dist/legacy-root-azm/src/frontend/asm80/parseAsmRawValues.d.ts +0 -4
- package/dist/legacy-root-azm/src/frontend/asm80/parseAsmRawValues.js +0 -94
- package/dist/legacy-root-azm/src/frontend/asm80/quoteScan.d.ts +0 -10
- package/dist/legacy-root-azm/src/frontend/asm80/quoteScan.js +0 -25
- package/dist/legacy-root-azm/src/frontend/ast.d.ts +0 -376
- package/dist/legacy-root-azm/src/frontend/ast.js +0 -1
- package/dist/legacy-root-azm/src/frontend/directiveAliases.d.ts +0 -14
- package/dist/legacy-root-azm/src/frontend/directiveAliases.js +0 -189
- package/dist/legacy-root-azm/src/frontend/grammarData.d.ts +0 -14
- package/dist/legacy-root-azm/src/frontend/grammarData.js +0 -65
- package/dist/legacy-root-azm/src/frontend/immExprUtils.d.ts +0 -2
- package/dist/legacy-root-azm/src/frontend/immExprUtils.js +0 -12
- package/dist/legacy-root-azm/src/frontend/parseAsmFlatDirectiveLine.d.ts +0 -17
- package/dist/legacy-root-azm/src/frontend/parseAsmFlatDirectiveLine.js +0 -187
- package/dist/legacy-root-azm/src/frontend/parseAsmInstruction.d.ts +0 -3
- package/dist/legacy-root-azm/src/frontend/parseAsmInstruction.js +0 -73
- package/dist/legacy-root-azm/src/frontend/parseAsmStatements.d.ts +0 -6
- package/dist/legacy-root-azm/src/frontend/parseAsmStatements.js +0 -16
- package/dist/legacy-root-azm/src/frontend/parseAsmStream.d.ts +0 -10
- package/dist/legacy-root-azm/src/frontend/parseAsmStream.js +0 -33
- package/dist/legacy-root-azm/src/frontend/parseAsmTopLevel.d.ts +0 -18
- package/dist/legacy-root-azm/src/frontend/parseAsmTopLevel.js +0 -34
- package/dist/legacy-root-azm/src/frontend/parseDiagnostics.d.ts +0 -9
- package/dist/legacy-root-azm/src/frontend/parseDiagnostics.js +0 -16
- package/dist/legacy-root-azm/src/frontend/parseEnum.d.ts +0 -12
- package/dist/legacy-root-azm/src/frontend/parseEnum.js +0 -70
- package/dist/legacy-root-azm/src/frontend/parseImm.d.ts +0 -10
- package/dist/legacy-root-azm/src/frontend/parseImm.js +0 -397
- package/dist/legacy-root-azm/src/frontend/parseLogicalLines.d.ts +0 -11
- package/dist/legacy-root-azm/src/frontend/parseLogicalLines.js +0 -94
- package/dist/legacy-root-azm/src/frontend/parseOp.d.ts +0 -25
- package/dist/legacy-root-azm/src/frontend/parseOp.js +0 -120
- package/dist/legacy-root-azm/src/frontend/parseOpHeader.d.ts +0 -20
- package/dist/legacy-root-azm/src/frontend/parseOpHeader.js +0 -32
- package/dist/legacy-root-azm/src/frontend/parseOperands.d.ts +0 -4
- package/dist/legacy-root-azm/src/frontend/parseOperands.js +0 -290
- package/dist/legacy-root-azm/src/frontend/parseParams.d.ts +0 -6
- package/dist/legacy-root-azm/src/frontend/parseParams.js +0 -62
- package/dist/legacy-root-azm/src/frontend/parseParserRecovery.d.ts +0 -12
- package/dist/legacy-root-azm/src/frontend/parseParserRecovery.js +0 -17
- package/dist/legacy-root-azm/src/frontend/parseParserShared.d.ts +0 -2
- package/dist/legacy-root-azm/src/frontend/parseParserShared.js +0 -8
- package/dist/legacy-root-azm/src/frontend/parseRawDataDirectiveStart.d.ts +0 -1
- package/dist/legacy-root-azm/src/frontend/parseRawDataDirectiveStart.js +0 -3
- package/dist/legacy-root-azm/src/frontend/parseRawDataDirectives.d.ts +0 -7
- package/dist/legacy-root-azm/src/frontend/parseRawDataDirectives.js +0 -142
- package/dist/legacy-root-azm/src/frontend/parseRecordFieldDecl.d.ts +0 -34
- package/dist/legacy-root-azm/src/frontend/parseRecordFieldDecl.js +0 -177
- package/dist/legacy-root-azm/src/frontend/parseSourceItemDispatch.d.ts +0 -46
- package/dist/legacy-root-azm/src/frontend/parseSourceItemDispatch.js +0 -53
- package/dist/legacy-root-azm/src/frontend/parseSourceItemTable.d.ts +0 -16
- package/dist/legacy-root-azm/src/frontend/parseSourceItemTable.js +0 -68
- package/dist/legacy-root-azm/src/frontend/parseTopLevelCommon.d.ts +0 -11
- package/dist/legacy-root-azm/src/frontend/parseTopLevelCommon.js +0 -50
- package/dist/legacy-root-azm/src/frontend/parseTypes.d.ts +0 -24
- package/dist/legacy-root-azm/src/frontend/parseTypes.js +0 -77
- package/dist/legacy-root-azm/src/frontend/parser.d.ts +0 -11
- package/dist/legacy-root-azm/src/frontend/parser.js +0 -88
- package/dist/legacy-root-azm/src/frontend/source.d.ts +0 -28
- package/dist/legacy-root-azm/src/frontend/source.js +0 -58
- package/dist/legacy-root-azm/src/frontend/sourceExtensions.d.ts +0 -2
- package/dist/legacy-root-azm/src/frontend/sourceExtensions.js +0 -6
- package/dist/legacy-root-azm/src/lintCaseStyle.d.ts +0 -4
- package/dist/legacy-root-azm/src/lintCaseStyle.js +0 -129
- package/dist/legacy-root-azm/src/lowering/asmDirectiveLowering.d.ts +0 -4
- package/dist/legacy-root-azm/src/lowering/asmDirectiveLowering.js +0 -229
- package/dist/legacy-root-azm/src/lowering/asmDirectiveTraversal.d.ts +0 -47
- package/dist/legacy-root-azm/src/lowering/asmDirectiveTraversal.js +0 -52
- package/dist/legacy-root-azm/src/lowering/asmEquResolution.d.ts +0 -8
- package/dist/legacy-root-azm/src/lowering/asmEquResolution.js +0 -69
- package/dist/legacy-root-azm/src/lowering/asmInstructionLdHelpers.d.ts +0 -15
- package/dist/legacy-root-azm/src/lowering/asmInstructionLdHelpers.js +0 -102
- package/dist/legacy-root-azm/src/lowering/asmInstructionLowering.d.ts +0 -5
- package/dist/legacy-root-azm/src/lowering/asmInstructionLowering.js +0 -54
- package/dist/legacy-root-azm/src/lowering/asmInstructionStream.d.ts +0 -46
- package/dist/legacy-root-azm/src/lowering/asmInstructionStream.js +0 -51
- package/dist/legacy-root-azm/src/lowering/asmLoweringBranchCall.d.ts +0 -43
- package/dist/legacy-root-azm/src/lowering/asmLoweringBranchCall.js +0 -254
- package/dist/legacy-root-azm/src/lowering/asmLoweringHost.d.ts +0 -23
- package/dist/legacy-root-azm/src/lowering/asmLoweringHost.js +0 -1
- package/dist/legacy-root-azm/src/lowering/asmLoweringLd.d.ts +0 -28
- package/dist/legacy-root-azm/src/lowering/asmLoweringLd.js +0 -144
- package/dist/legacy-root-azm/src/lowering/asmRangeLowering.d.ts +0 -17
- package/dist/legacy-root-azm/src/lowering/asmRangeLowering.js +0 -39
- package/dist/legacy-root-azm/src/lowering/asmRawDataLowering.d.ts +0 -16
- package/dist/legacy-root-azm/src/lowering/asmRawDataLowering.js +0 -209
- package/dist/legacy-root-azm/src/lowering/asmSourceEmitter.d.ts +0 -4
- package/dist/legacy-root-azm/src/lowering/asmSourceEmitter.js +0 -9
- package/dist/legacy-root-azm/src/lowering/asmSourceInstructionLowering.d.ts +0 -4
- package/dist/legacy-root-azm/src/lowering/asmSourceInstructionLowering.js +0 -14
- package/dist/legacy-root-azm/src/lowering/asmUtils.d.ts +0 -13
- package/dist/legacy-root-azm/src/lowering/asmUtils.js +0 -105
- package/dist/legacy-root-azm/src/lowering/assemblerFlowSetup.d.ts +0 -54
- package/dist/legacy-root-azm/src/lowering/assemblerFlowSetup.js +0 -128
- package/dist/legacy-root-azm/src/lowering/assemblerLoweringContext.d.ts +0 -151
- package/dist/legacy-root-azm/src/lowering/assemblerLoweringContext.js +0 -16
- package/dist/legacy-root-azm/src/lowering/assemblerLoweringContextSplit.d.ts +0 -7
- package/dist/legacy-root-azm/src/lowering/assemblerLoweringContextSplit.js +0 -75
- package/dist/legacy-root-azm/src/lowering/assemblerLoweringPhases.d.ts +0 -66
- package/dist/legacy-root-azm/src/lowering/assemblerLoweringPhases.js +0 -166
- package/dist/legacy-root-azm/src/lowering/bytePlacement.d.ts +0 -7
- package/dist/legacy-root-azm/src/lowering/bytePlacement.js +0 -37
- package/dist/legacy-root-azm/src/lowering/capabilities.d.ts +0 -67
- package/dist/legacy-root-azm/src/lowering/capabilities.js +0 -1
- package/dist/legacy-root-azm/src/lowering/eaResolution.d.ts +0 -58
- package/dist/legacy-root-azm/src/lowering/eaResolution.js +0 -159
- package/dist/legacy-root-azm/src/lowering/emissionCore.d.ts +0 -17
- package/dist/legacy-root-azm/src/lowering/emissionCore.js +0 -21
- package/dist/legacy-root-azm/src/lowering/emit.d.ts +0 -17
- package/dist/legacy-root-azm/src/lowering/emit.js +0 -46
- package/dist/legacy-root-azm/src/lowering/emitContextBuilder.d.ts +0 -63
- package/dist/legacy-root-azm/src/lowering/emitContextBuilder.js +0 -41
- package/dist/legacy-root-azm/src/lowering/emitFinalization.d.ts +0 -61
- package/dist/legacy-root-azm/src/lowering/emitFinalization.js +0 -66
- package/dist/legacy-root-azm/src/lowering/emitFinalizationSetup.d.ts +0 -19
- package/dist/legacy-root-azm/src/lowering/emitFinalizationSetup.js +0 -26
- package/dist/legacy-root-azm/src/lowering/emitPhase1BuildProgramLoweringContext.d.ts +0 -7
- package/dist/legacy-root-azm/src/lowering/emitPhase1BuildProgramLoweringContext.js +0 -119
- package/dist/legacy-root-azm/src/lowering/emitPhase1Helpers.d.ts +0 -4
- package/dist/legacy-root-azm/src/lowering/emitPhase1Helpers.js +0 -12
- package/dist/legacy-root-azm/src/lowering/emitPhase1Types.d.ts +0 -21
- package/dist/legacy-root-azm/src/lowering/emitPhase1Types.js +0 -1
- package/dist/legacy-root-azm/src/lowering/emitPhase1WirePipeline.d.ts +0 -70
- package/dist/legacy-root-azm/src/lowering/emitPhase1WirePipeline.js +0 -203
- package/dist/legacy-root-azm/src/lowering/emitPhase1Workspace.d.ts +0 -82
- package/dist/legacy-root-azm/src/lowering/emitPhase1Workspace.js +0 -55
- package/dist/legacy-root-azm/src/lowering/emitPipeline.d.ts +0 -121
- package/dist/legacy-root-azm/src/lowering/emitPipeline.js +0 -57
- package/dist/legacy-root-azm/src/lowering/emitProgramContext.d.ts +0 -39
- package/dist/legacy-root-azm/src/lowering/emitProgramContext.js +0 -29
- package/dist/legacy-root-azm/src/lowering/emitState.d.ts +0 -90
- package/dist/legacy-root-azm/src/lowering/emitState.js +0 -124
- package/dist/legacy-root-azm/src/lowering/fixupBaseResolution.d.ts +0 -7
- package/dist/legacy-root-azm/src/lowering/fixupBaseResolution.js +0 -23
- package/dist/legacy-root-azm/src/lowering/fixupEmission.d.ts +0 -64
- package/dist/legacy-root-azm/src/lowering/fixupEmission.js +0 -199
- package/dist/legacy-root-azm/src/lowering/immMath.d.ts +0 -2
- package/dist/legacy-root-azm/src/lowering/immMath.js +0 -34
- package/dist/legacy-root-azm/src/lowering/inputAssets.d.ts +0 -7
- package/dist/legacy-root-azm/src/lowering/inputAssets.js +0 -106
- package/dist/legacy-root-azm/src/lowering/ldEncoding.d.ts +0 -15
- package/dist/legacy-root-azm/src/lowering/ldEncoding.js +0 -12
- package/dist/legacy-root-azm/src/lowering/ldEncodingRegMemHelpers.d.ts +0 -5
- package/dist/legacy-root-azm/src/lowering/ldEncodingRegMemHelpers.js +0 -124
- package/dist/legacy-root-azm/src/lowering/ldFormSelection.d.ts +0 -26
- package/dist/legacy-root-azm/src/lowering/ldFormSelection.js +0 -92
- package/dist/legacy-root-azm/src/lowering/ldLowering.d.ts +0 -7
- package/dist/legacy-root-azm/src/lowering/ldLowering.js +0 -13
- package/dist/legacy-root-azm/src/lowering/loweredAsmByteEmission.d.ts +0 -23
- package/dist/legacy-root-azm/src/lowering/loweredAsmByteEmission.js +0 -185
- package/dist/legacy-root-azm/src/lowering/loweredAsmPlacement.d.ts +0 -13
- package/dist/legacy-root-azm/src/lowering/loweredAsmPlacement.js +0 -86
- package/dist/legacy-root-azm/src/lowering/loweredAsmStreamRecording.d.ts +0 -27
- package/dist/legacy-root-azm/src/lowering/loweredAsmStreamRecording.js +0 -215
- package/dist/legacy-root-azm/src/lowering/loweredAsmTypes.d.ts +0 -202
- package/dist/legacy-root-azm/src/lowering/loweredAsmTypes.js +0 -1
- package/dist/legacy-root-azm/src/lowering/loweredFormat.d.ts +0 -3
- package/dist/legacy-root-azm/src/lowering/loweredFormat.js +0 -26
- package/dist/legacy-root-azm/src/lowering/loweredItemSize.d.ts +0 -4
- package/dist/legacy-root-azm/src/lowering/loweredItemSize.js +0 -17
- package/dist/legacy-root-azm/src/lowering/loweringDiagnostics.d.ts +0 -9
- package/dist/legacy-root-azm/src/lowering/loweringDiagnostics.js +0 -55
- package/dist/legacy-root-azm/src/lowering/loweringTypes.d.ts +0 -27
- package/dist/legacy-root-azm/src/lowering/loweringTypes.js +0 -1
- package/dist/legacy-root-azm/src/lowering/opCandidateRegistry.d.ts +0 -9
- package/dist/legacy-root-azm/src/lowering/opCandidateRegistry.js +0 -9
- package/dist/legacy-root-azm/src/lowering/opExpansionExecution.d.ts +0 -15
- package/dist/legacy-root-azm/src/lowering/opExpansionExecution.js +0 -45
- package/dist/legacy-root-azm/src/lowering/opExpansionOrchestration.d.ts +0 -15
- package/dist/legacy-root-azm/src/lowering/opExpansionOrchestration.js +0 -88
- package/dist/legacy-root-azm/src/lowering/opExpansionStream.d.ts +0 -12
- package/dist/legacy-root-azm/src/lowering/opExpansionStream.js +0 -176
- package/dist/legacy-root-azm/src/lowering/opMatching.d.ts +0 -52
- package/dist/legacy-root-azm/src/lowering/opMatching.js +0 -355
- package/dist/legacy-root-azm/src/lowering/opSubstitution.d.ts +0 -13
- package/dist/legacy-root-azm/src/lowering/opSubstitution.js +0 -175
- package/dist/legacy-root-azm/src/lowering/prescanTypes.d.ts +0 -7
- package/dist/legacy-root-azm/src/lowering/prescanTypes.js +0 -1
- package/dist/legacy-root-azm/src/lowering/programLowering.d.ts +0 -144
- package/dist/legacy-root-azm/src/lowering/programLowering.js +0 -2
- package/dist/legacy-root-azm/src/lowering/programLoweringDeclarations.d.ts +0 -5
- package/dist/legacy-root-azm/src/lowering/programLoweringDeclarations.js +0 -5
- package/dist/legacy-root-azm/src/lowering/programLoweringFinalize.d.ts +0 -18
- package/dist/legacy-root-azm/src/lowering/programLoweringFinalize.js +0 -115
- package/dist/legacy-root-azm/src/lowering/programLoweringTraversal.d.ts +0 -2
- package/dist/legacy-root-azm/src/lowering/programLoweringTraversal.js +0 -93
- package/dist/legacy-root-azm/src/lowering/programPrescan.d.ts +0 -3
- package/dist/legacy-root-azm/src/lowering/programPrescan.js +0 -37
- package/dist/legacy-root-azm/src/lowering/traceFormat.d.ts +0 -13
- package/dist/legacy-root-azm/src/lowering/traceFormat.js +0 -211
- package/dist/legacy-root-azm/src/packageInfo.d.ts +0 -1
- package/dist/legacy-root-azm/src/packageInfo.js +0 -15
- package/dist/legacy-root-azm/src/pathCompare.d.ts +0 -3
- package/dist/legacy-root-azm/src/pathCompare.js +0 -26
- package/dist/legacy-root-azm/src/pipeline.d.ts +0 -91
- package/dist/legacy-root-azm/src/pipeline.js +0 -1
- package/dist/legacy-root-azm/src/registerCare/analyze.d.ts +0 -24
- package/dist/legacy-root-azm/src/registerCare/analyze.js +0 -327
- package/dist/legacy-root-azm/src/registerCare/boundaryHints.d.ts +0 -2
- package/dist/legacy-root-azm/src/registerCare/boundaryHints.js +0 -10
- package/dist/legacy-root-azm/src/registerCare/carriers.d.ts +0 -4
- package/dist/legacy-root-azm/src/registerCare/carriers.js +0 -78
- package/dist/legacy-root-azm/src/registerCare/controlFlow.d.ts +0 -5
- package/dist/legacy-root-azm/src/registerCare/controlFlow.js +0 -35
- package/dist/legacy-root-azm/src/registerCare/fix.d.ts +0 -11
- package/dist/legacy-root-azm/src/registerCare/fix.js +0 -119
- package/dist/legacy-root-azm/src/registerCare/liveness.d.ts +0 -7
- package/dist/legacy-root-azm/src/registerCare/liveness.js +0 -227
- package/dist/legacy-root-azm/src/registerCare/profiles.d.ts +0 -11
- package/dist/legacy-root-azm/src/registerCare/profiles.js +0 -45
- package/dist/legacy-root-azm/src/registerCare/programModel.d.ts +0 -3
- package/dist/legacy-root-azm/src/registerCare/programModel.js +0 -181
- package/dist/legacy-root-azm/src/registerCare/report.d.ts +0 -5
- package/dist/legacy-root-azm/src/registerCare/report.js +0 -139
- package/dist/legacy-root-azm/src/registerCare/smartComments.d.ts +0 -5
- package/dist/legacy-root-azm/src/registerCare/smartComments.js +0 -247
- package/dist/legacy-root-azm/src/registerCare/types.d.ts +0 -154
- package/dist/legacy-root-azm/src/registerCare/types.js +0 -1
- package/dist/legacy-root-azm/src/semantics/declVisitor.d.ts +0 -5
- package/dist/legacy-root-azm/src/semantics/declVisitor.js +0 -11
- package/dist/legacy-root-azm/src/semantics/env.d.ts +0 -28
- package/dist/legacy-root-azm/src/semantics/env.js +0 -432
- package/dist/legacy-root-azm/src/semantics/layout.d.ts +0 -21
- package/dist/legacy-root-azm/src/semantics/layout.js +0 -226
- package/dist/legacy-root-azm/src/semantics/layoutCastFold.d.ts +0 -22
- package/dist/legacy-root-azm/src/semantics/layoutCastFold.js +0 -118
- package/dist/legacy-root-azm/src/semantics/semanticsDiagnostics.d.ts +0 -2
- package/dist/legacy-root-azm/src/semantics/semanticsDiagnostics.js +0 -4
- package/dist/legacy-root-azm/src/semantics/typeQueries.d.ts +0 -31
- package/dist/legacy-root-azm/src/semantics/typeQueries.js +0 -124
- package/dist/legacy-root-azm/src/sourceIncludeExpansion.d.ts +0 -17
- package/dist/legacy-root-azm/src/sourceIncludeExpansion.js +0 -124
- package/dist/legacy-root-azm/src/sourceIncludePaths.d.ts +0 -1
- package/dist/legacy-root-azm/src/sourceIncludePaths.js +0 -12
- package/dist/legacy-root-azm/src/sourceLoader.d.ts +0 -15
- package/dist/legacy-root-azm/src/sourceLoader.js +0 -118
- package/dist/legacy-root-azm/src/z80/effects.d.ts +0 -3
- package/dist/legacy-root-azm/src/z80/effects.js +0 -516
- package/dist/legacy-root-azm/src/z80/encode.d.ts +0 -10
- package/dist/legacy-root-azm/src/z80/encode.js +0 -412
- package/dist/legacy-root-azm/src/z80/encodeAlu.d.ts +0 -7
- package/dist/legacy-root-azm/src/z80/encodeAlu.js +0 -219
- package/dist/legacy-root-azm/src/z80/encodeBitOps.d.ts +0 -7
- package/dist/legacy-root-azm/src/z80/encodeBitOps.js +0 -123
- package/dist/legacy-root-azm/src/z80/encodeContext.d.ts +0 -29
- package/dist/legacy-root-azm/src/z80/encodeContext.js +0 -1
- package/dist/legacy-root-azm/src/z80/encodeControl.d.ts +0 -26
- package/dist/legacy-root-azm/src/z80/encodeControl.js +0 -180
- package/dist/legacy-root-azm/src/z80/encodeCoreOps.d.ts +0 -7
- package/dist/legacy-root-azm/src/z80/encodeCoreOps.js +0 -131
- package/dist/legacy-root-azm/src/z80/encodeIo.d.ts +0 -9
- package/dist/legacy-root-azm/src/z80/encodeIo.js +0 -128
- package/dist/legacy-root-azm/src/z80/encodeLd.d.ts +0 -13
- package/dist/legacy-root-azm/src/z80/encodeLd.js +0 -273
- package/dist/legacy-root-azm/src/z80/encoderRegistry.d.ts +0 -13
- package/dist/legacy-root-azm/src/z80/encoderRegistry.js +0 -169
- package/dist/src/outputs/write-listing.d.ts +0 -2
- package/dist/src/outputs/write-listing.js +0 -79
- /package/dist/{legacy-root-azm/src/registerCare → src/register-care}/annotate.d.ts +0 -0
- /package/dist/{legacy-root-azm/src/registerCare → src/register-care}/annotate.js +0 -0
- /package/dist/{legacy-root-azm/src/registerCare → src/register-care}/sourceText.d.ts +0 -0
- /package/dist/{legacy-root-azm/src/registerCare → src/register-care}/sourceText.js +0 -0
- /package/dist/{legacy-root-azm/src/registerCare → src/register-care}/summary.d.ts +0 -0
|
@@ -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;
|
|
@@ -1,38 +1,98 @@
|
|
|
1
|
-
import { stripLineComment } from '../source/strip-line-comment.js';
|
|
1
|
+
import { extractLineComment, stripLineComment } from '../source/strip-line-comment.js';
|
|
2
2
|
import { normalizeDirectiveAlias } from './directive-aliases.js';
|
|
3
3
|
import { parseExpression, parseTypeExpr } from './parse-expression.js';
|
|
4
4
|
import { parseZ80Instruction } from '../z80/parse-instruction.js';
|
|
5
5
|
export function parseLogicalLine(line, options = {}) {
|
|
6
6
|
const text = normalizeDirectiveAlias(stripLineComment(line.text), options.directiveAliasPolicy).trim();
|
|
7
7
|
if (text.length === 0) {
|
|
8
|
-
return
|
|
8
|
+
return commentOnlyLine(line);
|
|
9
9
|
}
|
|
10
10
|
const span = { sourceName: line.sourceName, line: line.line, column: firstColumn(line.text) };
|
|
11
11
|
const labelWithStatement = /^(@?[A-Za-z_.$?][A-Za-z0-9_.$?]*):\s*(.+)$/.exec(text);
|
|
12
12
|
if (labelWithStatement) {
|
|
13
|
-
const
|
|
13
|
+
const rawLabel = labelWithStatement[1] ?? '';
|
|
14
|
+
const labelName = normalizeEntryLabelName(rawLabel);
|
|
15
|
+
const isEntry = rawLabel.startsWith('@');
|
|
14
16
|
const statementText = labelWithStatement[2] ?? '';
|
|
15
|
-
const
|
|
16
|
-
if (
|
|
17
|
-
return
|
|
17
|
+
const invalidDeclaration = parseColonDeclarationError(labelName, statementText);
|
|
18
|
+
if (invalidDeclaration) {
|
|
19
|
+
return { items: [], diagnostics: [parseError(line, invalidDeclaration)] };
|
|
18
20
|
}
|
|
19
21
|
const parsedStatement = parseCanonicalStatement(line, statementText, span);
|
|
20
|
-
return {
|
|
21
|
-
items: [{ kind: 'label', name: labelName, span }, ...parsedStatement.items],
|
|
22
|
+
return withLineComment(line, {
|
|
23
|
+
items: [{ kind: 'label', name: labelName, ...(isEntry ? { isEntry: true } : {}), span }, ...parsedStatement.items],
|
|
22
24
|
diagnostics: parsedStatement.diagnostics,
|
|
23
|
-
};
|
|
25
|
+
});
|
|
24
26
|
}
|
|
25
27
|
const labelOnly = /^(@?[A-Za-z_.$?][A-Za-z0-9_.$?]*):$/.exec(text);
|
|
26
28
|
if (labelOnly) {
|
|
27
|
-
|
|
28
|
-
|
|
29
|
+
const rawLabel = labelOnly[1] ?? '';
|
|
30
|
+
return withLineComment(line, {
|
|
31
|
+
items: [
|
|
32
|
+
{
|
|
33
|
+
kind: 'label',
|
|
34
|
+
name: normalizeEntryLabelName(rawLabel),
|
|
35
|
+
...(rawLabel.startsWith('@') ? { isEntry: true } : {}),
|
|
36
|
+
span,
|
|
37
|
+
},
|
|
38
|
+
],
|
|
29
39
|
diagnostics: [],
|
|
30
|
-
};
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
return withLineComment(line, parseCanonicalStatement(line, text, span));
|
|
43
|
+
}
|
|
44
|
+
function commentOnlyLine(line) {
|
|
45
|
+
const comment = extractLineComment(line.text);
|
|
46
|
+
if (!comment) {
|
|
47
|
+
return { items: [], diagnostics: [] };
|
|
48
|
+
}
|
|
49
|
+
return {
|
|
50
|
+
items: [
|
|
51
|
+
{
|
|
52
|
+
kind: 'comment',
|
|
53
|
+
text: comment,
|
|
54
|
+
origin: 'user',
|
|
55
|
+
span: {
|
|
56
|
+
sourceName: line.sourceName,
|
|
57
|
+
line: line.line,
|
|
58
|
+
column: firstColumn(line.text),
|
|
59
|
+
},
|
|
60
|
+
},
|
|
61
|
+
],
|
|
62
|
+
diagnostics: [],
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
function withLineComment(line, result) {
|
|
66
|
+
const comment = extractLineComment(line.text);
|
|
67
|
+
if (!comment) {
|
|
68
|
+
return result;
|
|
31
69
|
}
|
|
32
|
-
return
|
|
70
|
+
return {
|
|
71
|
+
items: [
|
|
72
|
+
...result.items,
|
|
73
|
+
{
|
|
74
|
+
kind: 'comment',
|
|
75
|
+
text: comment,
|
|
76
|
+
origin: 'user',
|
|
77
|
+
span: {
|
|
78
|
+
sourceName: line.sourceName,
|
|
79
|
+
line: line.line,
|
|
80
|
+
column: firstColumn(line.text),
|
|
81
|
+
},
|
|
82
|
+
},
|
|
83
|
+
],
|
|
84
|
+
diagnostics: result.diagnostics,
|
|
85
|
+
};
|
|
33
86
|
}
|
|
34
87
|
function parseEquItem(line, name, expressionText, span) {
|
|
35
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
|
+
}
|
|
36
96
|
const expression = stringValue !== undefined && stringValue.length > 1
|
|
37
97
|
? { kind: 'number', value: 0 }
|
|
38
98
|
: parseExpression(expressionText);
|
|
@@ -55,19 +115,12 @@ function parseEquItem(line, name, expressionText, span) {
|
|
|
55
115
|
diagnostics: [],
|
|
56
116
|
};
|
|
57
117
|
}
|
|
58
|
-
function parseColonLabelEqu(line, name, text, span) {
|
|
59
|
-
const equ = /^\.equ\s+(.+)$/i.exec(text);
|
|
60
|
-
if (!equ) {
|
|
61
|
-
return undefined;
|
|
62
|
-
}
|
|
63
|
-
return parseEquItem(line, name, equ[1] ?? '', span);
|
|
64
|
-
}
|
|
65
118
|
function parseCanonicalStatement(line, text, span) {
|
|
66
|
-
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);
|
|
67
120
|
if (equ) {
|
|
68
121
|
return parseEquItem(line, equ[1] ?? '', equ[2] ?? '', span);
|
|
69
122
|
}
|
|
70
|
-
const org = /^\.org\s+(.+)
|
|
123
|
+
const org = /^\.org\s+(.+)$/.exec(text);
|
|
71
124
|
if (org) {
|
|
72
125
|
const expressionText = org[1] ?? '';
|
|
73
126
|
const expression = parseExpression(expressionText);
|
|
@@ -79,32 +132,18 @@ function parseCanonicalStatement(line, text, span) {
|
|
|
79
132
|
}
|
|
80
133
|
return { items: [{ kind: 'org', expression, span }], diagnostics: [] };
|
|
81
134
|
}
|
|
82
|
-
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);
|
|
83
136
|
if (enumDecl) {
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
return {
|
|
89
|
-
items: [],
|
|
90
|
-
diagnostics: [parseError(line, `invalid enum member list`)],
|
|
91
|
-
};
|
|
92
|
-
}
|
|
93
|
-
const members = [];
|
|
94
|
-
const diagnostics = [];
|
|
95
|
-
for (const member of rawMembers) {
|
|
96
|
-
if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(member)) {
|
|
97
|
-
diagnostics.push(parseError(line, `Invalid enum member name "${member}": expected <identifier>.`));
|
|
98
|
-
continue;
|
|
99
|
-
}
|
|
100
|
-
members.push(member);
|
|
101
|
-
}
|
|
102
|
-
if (diagnostics.length > 0) {
|
|
103
|
-
return { items: [], diagnostics };
|
|
104
|
-
}
|
|
105
|
-
return { items: [{ kind: 'enum', name, members, span }], diagnostics: [] };
|
|
137
|
+
return {
|
|
138
|
+
items: [],
|
|
139
|
+
diagnostics: [parseError(line, `Use "${enumDecl[1] ?? ''} .enum ..." for enums.`)],
|
|
140
|
+
};
|
|
106
141
|
}
|
|
107
|
-
const
|
|
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);
|
|
145
|
+
}
|
|
146
|
+
const data = /^(\.db|\.dw)\s+(.+)$/.exec(text);
|
|
108
147
|
if (data) {
|
|
109
148
|
const directive = (data[1] ?? '').slice(1).toLowerCase();
|
|
110
149
|
const valueText = data[2] ?? '';
|
|
@@ -113,9 +152,10 @@ function parseCanonicalStatement(line, text, span) {
|
|
|
113
152
|
? parts.map(parseDataValue).filter((value) => value !== undefined)
|
|
114
153
|
: parts.map(parseExpression).filter((value) => value !== undefined);
|
|
115
154
|
if (values.length !== parts.length) {
|
|
155
|
+
const quotePolicyError = parts.map(parseDataQuotePolicyError).find(Boolean);
|
|
116
156
|
return {
|
|
117
157
|
items: [],
|
|
118
|
-
diagnostics: [parseError(line, `invalid .${directive} value list`)],
|
|
158
|
+
diagnostics: [parseError(line, quotePolicyError ?? `invalid .${directive} value list`)],
|
|
119
159
|
};
|
|
120
160
|
}
|
|
121
161
|
return {
|
|
@@ -125,7 +165,7 @@ function parseCanonicalStatement(line, text, span) {
|
|
|
125
165
|
diagnostics: [],
|
|
126
166
|
};
|
|
127
167
|
}
|
|
128
|
-
const ds = /^\.ds\s+(.+)
|
|
168
|
+
const ds = /^\.ds\s+(.+)$/.exec(text);
|
|
129
169
|
if (ds) {
|
|
130
170
|
const parts = splitValueList(ds[1] ?? '');
|
|
131
171
|
if (parts.length < 1 || parts.length > 2) {
|
|
@@ -155,7 +195,7 @@ function parseCanonicalStatement(line, text, span) {
|
|
|
155
195
|
diagnostics: [],
|
|
156
196
|
};
|
|
157
197
|
}
|
|
158
|
-
const align = /^\.align\s+(.+)
|
|
198
|
+
const align = /^\.align\s+(.+)$/.exec(text);
|
|
159
199
|
if (align) {
|
|
160
200
|
const expressionText = align[1] ?? '';
|
|
161
201
|
const alignment = parseExpression(expressionText);
|
|
@@ -167,10 +207,10 @@ function parseCanonicalStatement(line, text, span) {
|
|
|
167
207
|
}
|
|
168
208
|
return { items: [{ kind: 'align', alignment, span }], diagnostics: [] };
|
|
169
209
|
}
|
|
170
|
-
if (/^\.end\s
|
|
210
|
+
if (/^\.end\s*$/.test(text)) {
|
|
171
211
|
return { items: [{ kind: 'end', span }], diagnostics: [] };
|
|
172
212
|
}
|
|
173
|
-
const rangeControl = /^(\.binfrom|\.binto)\s+(.+)
|
|
213
|
+
const rangeControl = /^(\.binfrom|\.binto)\s+(.+)$/.exec(text);
|
|
174
214
|
if (rangeControl) {
|
|
175
215
|
const kind = (rangeControl[1] ?? '').slice(1).toLowerCase();
|
|
176
216
|
const expressionText = rangeControl[2] ?? '';
|
|
@@ -183,7 +223,7 @@ function parseCanonicalStatement(line, text, span) {
|
|
|
183
223
|
}
|
|
184
224
|
return { items: [{ kind, expression, span }], diagnostics: [] };
|
|
185
225
|
}
|
|
186
|
-
const stringData = /^(\.cstr|\.pstr|\.istr)\s+(.+)
|
|
226
|
+
const stringData = /^(\.cstr|\.pstr|\.istr)\s+(.+)$/.exec(text);
|
|
187
227
|
if (stringData) {
|
|
188
228
|
const directive = (stringData[1] ?? '').slice(1).toLowerCase();
|
|
189
229
|
const valueText = stringData[2] ?? '';
|
|
@@ -191,7 +231,7 @@ function parseCanonicalStatement(line, text, span) {
|
|
|
191
231
|
if (value === undefined) {
|
|
192
232
|
return {
|
|
193
233
|
items: [],
|
|
194
|
-
diagnostics: [parseError(line, `.${directive} expects one quoted string`)],
|
|
234
|
+
diagnostics: [parseError(line, `.${directive} expects one double-quoted string`)],
|
|
195
235
|
};
|
|
196
236
|
}
|
|
197
237
|
return { items: [{ kind: 'string-data', directive, value, span }], diagnostics: [] };
|
|
@@ -214,6 +254,46 @@ function parseCanonicalStatement(line, text, span) {
|
|
|
214
254
|
}
|
|
215
255
|
return { items: [], diagnostics: [parseError(line, `unsupported source line: ${text}`)] };
|
|
216
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
|
+
}
|
|
217
297
|
function parseTypeSizeExpression(text) {
|
|
218
298
|
const typeExpr = parseTypeExpr(text);
|
|
219
299
|
return typeExpr ? { kind: 'type-size', typeExpr } : undefined;
|
|
@@ -289,7 +369,7 @@ function parseDataValue(text) {
|
|
|
289
369
|
function parseWholeQuotedString(text) {
|
|
290
370
|
const input = text.trim();
|
|
291
371
|
const quote = input[0];
|
|
292
|
-
if (
|
|
372
|
+
if (quote !== '"' || input[input.length - 1] !== quote) {
|
|
293
373
|
return undefined;
|
|
294
374
|
}
|
|
295
375
|
let value = '';
|
|
@@ -310,6 +390,22 @@ function parseWholeQuotedString(text) {
|
|
|
310
390
|
}
|
|
311
391
|
return value;
|
|
312
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
|
+
}
|
|
313
409
|
function normalizeEntryLabelName(raw) {
|
|
314
410
|
return raw.startsWith('@') ? raw.slice(1) : raw;
|
|
315
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)) {
|
package/docs/reference/cli.md
CHANGED
|
@@ -55,7 +55,6 @@ same base path.
|
|
|
55
55
|
| -------------- | -------------------------------- |
|
|
56
56
|
| `.hex` | Intel HEX output |
|
|
57
57
|
| `.bin` | flat binary output |
|
|
58
|
-
| `.lst` | listing with bytes and symbols |
|
|
59
58
|
| `.d8.json` | Debug80 map |
|
|
60
59
|
| `.z80` | lowered assembler source |
|
|
61
60
|
| `.regcare.txt` | register-care report |
|
|
@@ -64,7 +63,7 @@ same base path.
|
|
|
64
63
|
Disable standard artifacts when they are not needed:
|
|
65
64
|
|
|
66
65
|
```sh
|
|
67
|
-
azm --
|
|
66
|
+
azm --nod8m program.asm
|
|
68
67
|
azm --nobin --nohex --reg-report --rc audit program.asm
|
|
69
68
|
```
|
|
70
69
|
|
|
@@ -74,13 +73,12 @@ azm --nobin --nohex --reg-report --rc audit program.asm
|
|
|
74
73
|
| --------------------------------------------- | -------------------------------------------------------------------- |
|
|
75
74
|
| `-o, --output <file>` | Primary output path. The extension must match `--type`. |
|
|
76
75
|
| `-t, --type <hex\|bin>` | Primary output type. Default: `hex`. |
|
|
77
|
-
| `-n, --nolist` | Do not write `.lst`. |
|
|
78
76
|
| `--nobin` | Do not write `.bin`. |
|
|
79
77
|
| `--nohex` | Do not write `.hex`. |
|
|
80
78
|
| `--nod8m` | Do not write `.d8.json`. |
|
|
81
79
|
| `--asm80` | Write lowered assembler source as `.z80`. |
|
|
82
80
|
| `--source-root <dir>` | Emit project-relative source paths in `.d8.json`. |
|
|
83
|
-
| `--case-style <mode>` | Lint
|
|
81
|
+
| `--case-style <mode>` | Lint mnemonic/register/op-head case: `off`, `upper`, `lower`, or `consistent`. |
|
|
84
82
|
| `--rc, --register-care <mode>` | Register-care mode: `off`, `audit`, `warn`, `error`, or `strict`. |
|
|
85
83
|
| `--reg-report, --emit-register-report` | Write `.regcare.txt`. |
|
|
86
84
|
| `--reg-interface, --emit-register-interface` | Write inferred `.asmi` interface. |
|
|
@@ -96,6 +94,10 @@ azm --nobin --nohex --reg-report --rc audit program.asm
|
|
|
96
94
|
|
|
97
95
|
## Debug80 Maps
|
|
98
96
|
|
|
97
|
+
`--case-style` is a source-style lint only. It checks instruction mnemonics,
|
|
98
|
+
register names, and visible `op` heads/bodies. It does not rename labels,
|
|
99
|
+
constants, directives, or compile-time functions.
|
|
100
|
+
|
|
99
101
|
The `.d8.json` artifact records AZM as the generator, the package version, and
|
|
100
102
|
the input/output paths used for the map. When `--source-root` is supplied, file
|
|
101
103
|
keys and generator input paths are written relative to that directory with `/`
|
|
@@ -60,7 +60,6 @@ const result = await compile(
|
|
|
60
60
|
includeDirs: ['/abs/path/to/includes'],
|
|
61
61
|
sourceRoot: '/abs/path/to/project',
|
|
62
62
|
d8mInputs: {
|
|
63
|
-
listing: '/abs/path/to/project/build/main.lst',
|
|
64
63
|
hex: '/abs/path/to/project/build/main.hex',
|
|
65
64
|
bin: '/abs/path/to/project/build/main.bin',
|
|
66
65
|
},
|
|
@@ -68,7 +67,6 @@ const result = await compile(
|
|
|
68
67
|
emitBin: true,
|
|
69
68
|
emitHex: true,
|
|
70
69
|
emitD8m: true,
|
|
71
|
-
emitListing: true,
|
|
72
70
|
registerCare: 'audit',
|
|
73
71
|
registerCareInterfaces: ['/abs/path/to/mon3.asmi'],
|
|
74
72
|
},
|
|
@@ -89,7 +87,9 @@ The integration contract is:
|
|
|
89
87
|
- `compile()` returns artifacts in memory; the CLI is only responsible for
|
|
90
88
|
writing those artifacts to disk
|
|
91
89
|
- Debug80 should consume the `d8m` artifact for source/address metadata and the
|
|
92
|
-
`bin`
|
|
90
|
+
`bin` artifact for loadable bytes (hex is acceptable when bin is not emitted)
|
|
91
|
+
- Do not rely on lowered `.z80` for Debug80 integration until asm80 coverage is
|
|
92
|
+
complete; use **bin + d8m** as the supported debugger path
|
|
93
93
|
- pass `sourceRoot` so D8 file keys are stable project-relative source paths
|
|
94
94
|
rather than basename-only paths
|
|
95
95
|
- pass `d8mInputs` when Debug80 knows the intended artifact paths; AZM records
|
|
@@ -123,7 +123,6 @@ The top-level map contains:
|
|
|
123
123
|
version: '0.1.1',
|
|
124
124
|
inputs: {
|
|
125
125
|
entry: 'src/pacmo/pacmo.z80',
|
|
126
|
-
listing: 'build/pacmo.lst',
|
|
127
126
|
hex: 'build/pacmo.hex',
|
|
128
127
|
bin: 'build/pacmo.bin',
|
|
129
128
|
},
|
|
@@ -252,6 +251,12 @@ const result = await compile(
|
|
|
252
251
|
);
|
|
253
252
|
```
|
|
254
253
|
|
|
254
|
+
**`emitAsm80` caveat:** Lowered `.z80` emission is gated but not universal.
|
|
255
|
+
Unsupported instructions or operand forms throw `UnsupportedAsm80LoweringError`,
|
|
256
|
+
surfaced as `AZMN_ASM80`. When assembly already succeeded, `compile()` still
|
|
257
|
+
returns bin/hex/d8 artifacts alongside the asm80 error. Run
|
|
258
|
+
`npm run check:asm80-coverage` on your sources before relying on lowered output.
|
|
259
|
+
|
|
255
260
|
The compiler accepts flat `.asm` / `.z80` source, retained AZM assembler
|
|
256
261
|
features, and the same output writers used by the CLI. External register-care
|
|
257
262
|
interfaces are `.asmi` metadata files, not compile entry files.
|
|
@@ -270,20 +275,19 @@ generated frames are outside this API contract for AZM source.
|
|
|
270
275
|
The public tooling surface includes:
|
|
271
276
|
|
|
272
277
|
- `Diagnostic`, `DiagnosticIds`, severity/id types
|
|
273
|
-
- `SourcePosition`, `SourceSpan`
|
|
274
|
-
- `ProgramNode`, `SourceFileNode`, `SourceItemNode`
|
|
275
278
|
- `LoadedProgram`
|
|
276
|
-
- `
|
|
279
|
+
- `AnalyzeProgramResult`, `LoadProgramResult`
|
|
277
280
|
- `RegisterCareCandidateDiagnostic`, `RegisterCareCodeAction`, `RegisterCareOutputCandidate`
|
|
278
281
|
|
|
279
|
-
|
|
282
|
+
The public tooling contract is the package export surface, not deep internal
|
|
283
|
+
paths. Do not document retired internal modules as public API.
|
|
280
284
|
|
|
281
285
|
## Syntax Highlighting Example
|
|
282
286
|
|
|
283
287
|
Syntax colouring is an example consumer of the tooling API:
|
|
284
288
|
|
|
285
289
|
1. Call `loadProgram()` with the file path and optional unsaved buffer text.
|
|
286
|
-
2. Walk `
|
|
290
|
+
2. Walk `loadedProgram.program.files[0].items` and inspect each item's `kind` and `span`.
|
|
287
291
|
3. Map those spans to TextMate scopes or semantic token kinds in the editor.
|
|
288
292
|
4. Fall back to regex/TextMate-only colouring if parsing fails or the editor needs a cheaper fast path.
|
|
289
293
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jhlagado/azm",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.2",
|
|
4
4
|
"description": "AZM assembler for the Z80 family (Node.js CLI)",
|
|
5
5
|
"license": "GPL-3.0-only",
|
|
6
6
|
"engines": {
|
|
@@ -33,7 +33,6 @@
|
|
|
33
33
|
},
|
|
34
34
|
"files": [
|
|
35
35
|
"dist/src",
|
|
36
|
-
"dist/legacy-root-azm",
|
|
37
36
|
"docs/reference/cli.md",
|
|
38
37
|
"docs/reference/tooling-api.md"
|
|
39
38
|
],
|
|
@@ -72,7 +71,9 @@
|
|
|
72
71
|
"test:coverage": "vitest run --coverage",
|
|
73
72
|
"test:ci:coverage-core": "node scripts/dev/run-coverage-core.mjs",
|
|
74
73
|
"test:ci:slow-reliability": "vitest run --no-file-parallelism --maxWorkers=1 --minWorkers=1 --testTimeout=20000 --hookTimeout=300000 test/cli test/cli_*.test.ts",
|
|
74
|
+
"test:ci:asm80-parity": "node scripts/ci/run-asm80-parity.mjs",
|
|
75
75
|
"check:fixture-coverage": "node scripts/dev/check-fixture-coverage.mjs",
|
|
76
|
+
"check:asm80-coverage": "node scripts/dev/check-asm80-lowering-coverage.mjs",
|
|
76
77
|
"test:azm:alpha": "node scripts/dev/run-azm-alpha-guardrails.mjs",
|
|
77
78
|
"test:azm:corpus": "node scripts/dev/run-azm-corpus-guardrails.mjs",
|
|
78
79
|
"test:package": "npm run build && node scripts/dev/smoke-npm-package.mjs",
|
|
@@ -84,7 +85,7 @@
|
|
|
84
85
|
"next:typecheck": "tsc -p tsconfig.json --noEmit",
|
|
85
86
|
"next:test": "vitest run --config vitest.config.ts",
|
|
86
87
|
"next:check": "npm run next:typecheck && npm run next:test",
|
|
87
|
-
"next:guardrails:core": "npm run next:check && npm run
|
|
88
|
+
"next:guardrails:core": "npm run next:check && npm run check:asm80-coverage && npm run test:ci:asm80-parity",
|
|
88
89
|
"next:guardrails:package": "npm run test:package || npm run next:guardrails:package:local",
|
|
89
90
|
"next:guardrails:package:local": "npm run build && vitest run -c vitest.config.ts test/integration/stage-16-package-smoke-local.test.ts && vitest run test/public_api_surface.test.ts",
|
|
90
91
|
"next:guardrails:quality": "npm run lint && npm run check:source-file-sizes && node scripts/check-source-file-sizes.mjs",
|
|
@@ -93,9 +94,6 @@
|
|
|
93
94
|
"format:check": "prettier -c .",
|
|
94
95
|
"check:source-file-sizes": "node scripts/check-source-file-sizes.mjs",
|
|
95
96
|
"check:source-file-sizes:enforce": "node scripts/check-source-file-sizes.mjs --enforce-hard-cap",
|
|
96
|
-
"next:diff-current": "node scripts/diff-against-current.mjs --fixtures-dir test/differential/fixtures --skip-unsupported",
|
|
97
|
-
"next:diff-current:root": "node scripts/diff-against-current.mjs --fixtures-dir test/fixtures --skip-unsupported",
|
|
98
|
-
"next:diff-current:all": "npm run next:diff-current && npm run next:diff-current:root",
|
|
99
97
|
"prepack": "npm run build",
|
|
100
98
|
"prepublishOnly": "npm run build",
|
|
101
99
|
"azm": "npm run build && node dist/src/cli.js"
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import type { Diagnostic } from './diagnosticTypes.js';
|
|
2
|
-
import type { LoadedProgram } from './sourceLoader.js';
|
|
3
|
-
import type { CompilerOptions } from './pipeline.js';
|
|
4
|
-
import { type CompileEnv } from './semantics/env.js';
|
|
5
|
-
export interface AnalyzeProgramOptions extends Pick<CompilerOptions, 'caseStyle' | 'requireMain'> {
|
|
6
|
-
}
|
|
7
|
-
export interface AnalyzeProgramResult {
|
|
8
|
-
diagnostics: Diagnostic[];
|
|
9
|
-
env?: CompileEnv;
|
|
10
|
-
}
|
|
11
|
-
export declare function analyzeLoadedProgram(loadedProgram: LoadedProgram, options?: AnalyzeProgramOptions): AnalyzeProgramResult;
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
import { hasErrors } from './compileShared.js';
|
|
2
|
-
import { DiagnosticIds } from './diagnosticTypes.js';
|
|
3
|
-
import { lintCaseStyle } from './lintCaseStyle.js';
|
|
4
|
-
import { buildEnv } from './semantics/env.js';
|
|
5
|
-
function hasMainEntryLabel(program) {
|
|
6
|
-
return program.files.some((sourceFile) => sourceFile.items.some((item) => item.kind === 'AsmLabel' && item.name.toLowerCase() === 'main'));
|
|
7
|
-
}
|
|
8
|
-
export function analyzeLoadedProgram(loadedProgram, options = {}) {
|
|
9
|
-
const diagnostics = [];
|
|
10
|
-
const { program, sourceTexts } = loadedProgram;
|
|
11
|
-
const hasProgramItems = program.files.some((sourceFile) => sourceFile.items.length > 0);
|
|
12
|
-
if (!hasProgramItems) {
|
|
13
|
-
diagnostics.push({
|
|
14
|
-
id: DiagnosticIds.SemanticsError,
|
|
15
|
-
severity: 'error',
|
|
16
|
-
message: 'Program contains no declarations or instruction streams.',
|
|
17
|
-
file: program.entryFile,
|
|
18
|
-
...(program.span?.start
|
|
19
|
-
? { line: program.span.start.line, column: program.span.start.column }
|
|
20
|
-
: {}),
|
|
21
|
-
});
|
|
22
|
-
return { diagnostics };
|
|
23
|
-
}
|
|
24
|
-
if ((options.requireMain ?? false) && !hasMainEntryLabel(program)) {
|
|
25
|
-
diagnostics.push({
|
|
26
|
-
id: DiagnosticIds.SemanticsError,
|
|
27
|
-
severity: 'error',
|
|
28
|
-
message: 'Program must define a "main" entry label.',
|
|
29
|
-
file: program.entryFile,
|
|
30
|
-
...(program.span?.start
|
|
31
|
-
? { line: program.span.start.line, column: program.span.start.column }
|
|
32
|
-
: {}),
|
|
33
|
-
});
|
|
34
|
-
return { diagnostics };
|
|
35
|
-
}
|
|
36
|
-
lintCaseStyle(program, sourceTexts, options.caseStyle ?? 'off', diagnostics);
|
|
37
|
-
const env = buildEnv(program, diagnostics);
|
|
38
|
-
if (hasErrors(diagnostics))
|
|
39
|
-
return { diagnostics };
|
|
40
|
-
return { diagnostics, env };
|
|
41
|
-
}
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
import type { CompileFn } from './pipeline.js';
|
|
2
|
-
/**
|
|
3
|
-
* Compile an AZM/ASM80-family program starting from an entry file.
|
|
4
|
-
*
|
|
5
|
-
* - Expands textual includes transitively with deterministic cycle checks.
|
|
6
|
-
* - Runs parse → semantics → lowering → format writers.
|
|
7
|
-
* - Produces artifacts in-memory via `deps.formats`.
|
|
8
|
-
* - Defaults to emitting BIN + HEX + D8M unless an emit flag is explicitly provided.
|
|
9
|
-
*/
|
|
10
|
-
export declare const compile: CompileFn;
|