public static void Main(string[] args) { Window = new RenderWindow(new VideoMode(640, 480), "", Styles.Close); Window.SetFramerateLimit(60); Window.Closed += (sender, eventArgs) => Window.Close(); Window.Resized += (sender, eventArgs) => { var view = new View(); view.Size = new Vector2f(eventArgs.Width, eventArgs.Height); view.Center = view.Size / 2; Window.SetView(view); }; Machine = new VirtualMachine(512 * 1024); var prog = File.ReadAllBytes("bios.bin"); for (var i = 0; i < prog.Length; i++) Machine.Memory[i] = prog[i]; var kbd = new Devices.Keyboard(0x02, Window); Machine.Attach(kbd); var display = new Devices.Display(0x06, Machine, Window); Machine.Attach(display); var hdd = new Devices.HardDrive(0x08, "disk.img"); Machine.Attach(hdd); var running = true; var stepThread = new Thread(() => { while (running) { Machine.Step(); } }); stepThread.Start(); while (Window.IsOpen()) { Window.DispatchEvents(); Window.Clear(); Window.Draw(display); Window.Display(); } running = false; stepThread.Join(); Machine.Dispose(); }
public void Load(ShipCode code) { Vm = new VirtualMachine(4096); Vm.Attach(new Timer()); Navigation = new Navigation(Body); Vm.Attach(Navigation); Radar = new Radar(this); Vm.Attach(Radar); Engines = new Engines(); Vm.Attach(Engines); Guns = new Guns(); Vm.Attach(Guns); Broadcast = new Broadcast(this); Vm.Attach(Broadcast); Code = code; for (var i = 0; i < Code.Length; i++) { Vm.Memory[i] = Code[i]; } var ptr = 8; var varCount = Vm.Memory.ReadInt(ptr); ptr += sizeof(int); _variables.Clear(); for (var i = 0; i < varCount; i++) { var varAddr = ptr; ptr += sizeof(int); var varType = Vm.Memory.ReadSByte(ptr); ptr += sizeof(sbyte); _variables.Add(new Variable((VariableType)varType, varAddr)); } _programLen = Code.Length; _programOffset = ptr; _programDead = false; for (var i = 0; i < Vm.Registers.Length; i++) { Vm.Registers[i] = 0; } Vm.SP = Vm.Memory.Length; }