General list of stuff left to do...

Matthijs

Later

Even Later

Assembly Plug Example

Old way

(3 classes, often 3 source files as well)

				public class CPUBus 
				{
					// Plugged
					public static void Write8(UInt16 aPort, byte aData) { }
					...

					[Plug(Target = typeof(Cosmos.Kernel.CPUBus))]
					class CPUBus { 
					[PlugMethod(Assembler = typeof(Assemblers.IOWrite8))]
					public static void Write8(UInt16 aPort, byte aData) { }
					...

					public sealed class IOWrite8: AssemblerMethod 
					{ 
						public override void AssembleNew(Cosmos.Assembler.Assembler aAssembler, object aMethodInfo) 
						{ 
							//TODO: This is a lot of work to write to a single port. We need to have some kind of inline ASM option that can emit a single out instruction 
							new CPUx86.Move { DestinationReg = CPUx86.Registers.EDX, SourceReg = CPUx86.Registers.EBP, SourceDisplacement = 0xC, SourceIsIndirect = true };
							new CPUx86.Move { DestinationReg = CPUx86.Registers.EAX, SourceReg = CPUx86.Registers.EBP, SourceDisplacement = 0x8, SourceIsIndirect = true };
							new CPUx86.Out { DestinationReg = CPUx86.Registers.AL }; 
						}
					} 
					...
			

New way

See how much neater and self contained this is? :)

				public class CPUBus 
				{   
					[AsmBody(Assembler = typeof(IOWrite8))]
					public static void Write8(UInt16 aPort, byte aData) { }

					// Nested class even... :) Keeps it all in one unit!
					public class IOWrite8 : CodeBlock 
					{
						public override void Assemble() 
						{
							EDX = EBP + 0x0C;
							EAX = EBP + 0x08;
							Port[DX] = AL;
						}
					}
				}