@@ -11,13 +11,27 @@ namespace Asm6502;
1111/// <summary>
1212/// Represents a 6502 assembler for generating machine code and managing labels.
1313/// </summary>
14- public partial class Mos6502Assembler : Mos6502AssemblerBase < Mos6502Assembler >
14+ public partial class Mos6502Assembler : Mos6502Assembler < Mos6502Assembler >
1515{
1616 /// <summary>
1717 /// Initializes a new instance of the <see cref="Mos6502Assembler"/> class.
1818 /// </summary>
1919 /// <param name="baseAddress">The base address for code generation.</param>
20- public Mos6502Assembler ( ushort baseAddress = 0xC000 ) : base ( baseAddress )
20+ public Mos6502Assembler ( ushort baseAddress = 0xC000 ) : base ( baseAddress )
21+ {
22+ }
23+ }
24+
25+ /// <summary>
26+ /// Represents a 6502 assembler base class for generating machine code and managing labels.
27+ /// </summary>
28+ public abstract partial class Mos6502Assembler < TAsm > : Mos6502AssemblerBase < TAsm > where TAsm : Mos6502Assembler < TAsm >
29+ {
30+ /// <summary>
31+ /// Initializes a new instance of the <see cref="Mos6502Assembler"/> class.
32+ /// </summary>
33+ /// <param name="baseAddress">The base address for code generation.</param>
34+ protected Mos6502Assembler ( ushort baseAddress = 0xC000 ) : base ( baseAddress )
2135 {
2236 }
2337
@@ -28,7 +42,7 @@ public Mos6502Assembler(ushort baseAddress = 0xC000) : base(baseAddress)
2842 /// <param name="debugFilePath">The file path for debugging information (optional).</param>
2943 /// <param name="debugLineNumber">The line number for debugging information (optional).</param>
3044 /// <returns>The current assembler instance.</returns>
31- public Mos6502Assembler AddInstruction ( Mos6502Instruction instruction , [ CallerFilePath ] string debugFilePath = "" , [ CallerLineNumber ] int debugLineNumber = 0 )
45+ public TAsm AddInstruction ( Mos6502Instruction instruction , [ CallerFilePath ] string debugFilePath = "" , [ CallerLineNumber ] int debugLineNumber = 0 )
3246 {
3347 if ( ! instruction . IsValid ) throw new ArgumentException ( "Invalid instruction" , nameof ( instruction ) ) ;
3448
@@ -52,7 +66,7 @@ public Mos6502Assembler AddInstruction(Mos6502Instruction instruction, [CallerFi
5266 debugMap . LogDebugLineInfo ( debugLineInfo ) ;
5367 }
5468
55- return this ;
69+ return ( TAsm ) this ;
5670 }
5771
5872 /// <summary>
@@ -63,7 +77,7 @@ public Mos6502Assembler AddInstruction(Mos6502Instruction instruction, [CallerFi
6377 /// <param name="debugFilePath">The file path for debugging information (optional).</param>
6478 /// <param name="debugLineNumber">The line number for debugging information (optional).</param>
6579 /// <returns>The current assembler instance.</returns>
66- public Mos6502Assembler AddInstruction ( Mos6502Instruction instruction , Mos6502Expression expression , [ CallerFilePath ] string debugFilePath = "" , [ CallerLineNumber ] int debugLineNumber = 0 )
80+ public TAsm AddInstruction ( Mos6502Instruction instruction , Mos6502Expression expression , [ CallerFilePath ] string debugFilePath = "" , [ CallerLineNumber ] int debugLineNumber = 0 )
6781 {
6882 var currentAddress = CurrentAddress ;
6983 var bufferOffset = SizeInBytes ;
@@ -73,20 +87,34 @@ public Mos6502Assembler AddInstruction(Mos6502Instruction instruction, Mos6502Ex
7387
7488 Patches . Add ( new ( currentAddress , ( ushort ) ( bufferOffset + 1 ) , instruction . AddressingMode , expression ) ) ;
7589
76- return this ;
90+ return ( TAsm ) this ;
7791 }
7892}
7993
8094/// <summary>
81- /// Represents a 6502 assembler for generating machine code and managing labels.
95+ /// Represents a 6510 assembler for generating machine code and managing labels.
96+ /// </summary>
97+ public partial class Mos6510Assembler : Mos6510Assembler < Mos6510Assembler >
98+ {
99+ /// <summary>
100+ /// Initializes a new instance of the <see cref="Mos6510Assembler"/> class.
101+ /// </summary>
102+ /// <param name="baseAddress">The base address for code generation.</param>
103+ public Mos6510Assembler ( ushort baseAddress = 0xC000 ) : base ( baseAddress )
104+ {
105+ }
106+ }
107+
108+ /// <summary>
109+ /// Represents a 6510 assembler base class for generating machine code and managing labels.
82110/// </summary>
83- public partial class Mos6510Assembler : Mos6502AssemblerBase < Mos6510Assembler >
111+ public abstract partial class Mos6510Assembler < TAsm > : Mos6502AssemblerBase < TAsm > where TAsm : Mos6510Assembler < TAsm >
84112{
85113 /// <summary>
86114 /// Initializes a new instance of the <see cref="Mos6510Assembler"/> class.
87115 /// </summary>
88116 /// <param name="baseAddress">The base address for code generation.</param>
89- public Mos6510Assembler ( ushort baseAddress = 0xC000 ) : base ( baseAddress )
117+ protected Mos6510Assembler ( ushort baseAddress = 0xC000 ) : base ( baseAddress )
90118 {
91119 }
92120
@@ -97,7 +125,7 @@ public Mos6510Assembler(ushort baseAddress = 0xC000) : base(baseAddress)
97125 /// <param name="debugFilePath">The file path for debugging information (optional).</param>
98126 /// <param name="debugLineNumber">The line number for debugging information (optional).</param>
99127 /// <returns>The current assembler instance.</returns>
100- public Mos6510Assembler AddInstruction ( Mos6510Instruction instruction , [ CallerFilePath ] string debugFilePath = "" , [ CallerLineNumber ] int debugLineNumber = 0 )
128+ public TAsm AddInstruction ( Mos6510Instruction instruction , [ CallerFilePath ] string debugFilePath = "" , [ CallerLineNumber ] int debugLineNumber = 0 )
101129 {
102130 if ( ! instruction . IsValid ) throw new ArgumentException ( "Invalid instruction" , nameof ( instruction ) ) ;
103131
@@ -121,7 +149,7 @@ public Mos6510Assembler AddInstruction(Mos6510Instruction instruction, [CallerFi
121149 debugMap . LogDebugLineInfo ( debugLineInfo ) ;
122150 }
123151
124- return this ;
152+ return ( TAsm ) this ;
125153 }
126154
127155 /// <summary>
@@ -132,7 +160,7 @@ public Mos6510Assembler AddInstruction(Mos6510Instruction instruction, [CallerFi
132160 /// <param name="debugFilePath">The file path for debugging information (optional).</param>
133161 /// <param name="debugLineNumber">The line number for debugging information (optional).</param>
134162 /// <returns>The current assembler instance.</returns>
135- public Mos6510Assembler AddInstruction ( Mos6510Instruction instruction , Mos6502Expression expression , [ CallerFilePath ] string debugFilePath = "" , [ CallerLineNumber ] int debugLineNumber = 0 )
163+ public TAsm AddInstruction ( Mos6510Instruction instruction , Mos6502Expression expression , [ CallerFilePath ] string debugFilePath = "" , [ CallerLineNumber ] int debugLineNumber = 0 )
136164 {
137165 var currentAddress = CurrentAddress ;
138166 var bufferOffset = SizeInBytes ;
@@ -142,6 +170,6 @@ public Mos6510Assembler AddInstruction(Mos6510Instruction instruction, Mos6502Ex
142170
143171 Patches . Add ( new ( currentAddress , ( ushort ) ( bufferOffset + 1 ) , instruction . AddressingMode , expression ) ) ;
144172
145- return this ;
173+ return ( TAsm ) this ;
146174 }
147175}
0 commit comments