Ignore:
Timestamp:
Apr 10, 2019, 4:00:46 PM (6 years ago)
Author:
chronos
Message:
  • Added: Keyboard console.
  • Added: Show Hello World! message.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/virtualcpu4/UFormMain.pas

    r170 r171  
    11unit UFormMain;
    22
    3 {$mode objfpc}{$H+}
     3{$mode delphi}{$H+}
    44
    55interface
     
    1717    ButtonStop: TButton;
    1818    Label1: TLabel;
     19    Label2: TLabel;
    1920    ListViewMemory: TListView;
    2021    ListViewRegisters: TListView;
     22    Memo1: TMemo;
    2123    Timer1: TTimer;
    2224    procedure ButtonStartClick(Sender: TObject);
     
    2729    procedure ListViewMemoryData(Sender: TObject; Item: TListItem);
    2830    procedure ListViewRegistersData(Sender: TObject; Item: TListItem);
     31    procedure Memo1KeyPress(Sender: TObject; var Key: char);
    2932    procedure Timer1Timer(Sender: TObject);
    3033  private
     34    KeyInputBuffer: array of Char;
     35    function CpuInput(Port: TAddress): TRegister;
     36    procedure CpuOutput(Port: TAddress; Value: TRegister);
    3137    procedure ReloadMemoryDump;
    3238    procedure ReloadRegisterDump;
     
    6268begin
    6369  Cpu := TCpu.Create;
     70  Cpu.OnInput := CpuInput;
     71  Cpu.OnOutput := CpuOutput;
    6472  Cpu.DataSize := bw16;
    6573  Cpu.AddressSize := bw16;
     
    110118end;
    111119
     120procedure TFormMain.Memo1KeyPress(Sender: TObject; var Key: char);
     121begin
     122  SetLength(KeyInputBuffer, Length(KeyInputBuffer) + 1);
     123  KeyInputBuffer[High(KeyInputBuffer)] := Key;
     124end;
     125
    112126procedure TFormMain.Timer1Timer(Sender: TObject);
    113127begin
     
    133147  R1: Byte;
    134148  R2: Byte;
     149  R3: Byte;
    135150  LabelStart: Integer;
     151  LabelText: Integer;
     152  LabelPrint: Integer;
    136153begin
    137154  R1 := 1;
    138155  R2 := 2;
     156  R3 := 3;
    139157  with InstructionWriter do begin
     158    LabelText := 200;
     159    LoadConst(R1, LabelText);
     160    LoadConst(R2, 12);
     161  LabelPrint := IP;
     162    DataPrefix8; LoadMem(R3, R1);
     163    DataPrefix8; Output(0, R3);
     164    Increment(R1);
     165    Decrement(R2);
     166    Test(R2);
     167    JumpNotZero(LabelPrint);
     168
    140169    LoadConst(R1, 100);
     170  LabelStart := IP;
     171    Increment(R1);
    141172    LoadConst(R2, 100);
    142     LabelStart := IP;
    143     Increment(R1);
    144173    DataPrefix8; StoreMem(R2, R1);
     174    DataPrefix8; Input(R2, 0);
     175    DataPrefix8; Output(0, R2);
    145176    Jump(LabelStart);
    146177    Halt;
    147   end;
    148 end;
     178  IP := LabelText;
     179    WriteString('Hello World!');
     180  end;
     181end;
     182
     183function TFormMain.CpuInput(Port: TAddress): TRegister;
     184begin
     185  Result.Q := 0;
     186  case Port of
     187    0: begin
     188      while (Length(KeyInputBuffer) = 0) and not Cpu.Terminated do begin
     189        Sleep(100);
     190      end;
     191      if Length(KeyInputBuffer) > 0 then begin
     192        Result.B := Ord(KeyInputBuffer[0]);
     193        if Length(KeyInputBuffer) > 1 then
     194          Move(KeyInputBuffer[1], KeyInputBuffer[0], Length(KeyInputBuffer) - 1);
     195        SetLength(KeyInputBuffer, Length(KeyInputBuffer) - 1);
     196      end else Result.B := 0;
     197    end;
     198  end;
     199end;
     200
     201procedure TFormMain.CpuOutput(Port: TAddress; Value: TRegister);
     202begin
     203  case Port of
     204    0: Memo1.Lines.Text := Memo1.Lines.Text + Char(Value.B);
     205  end;
     206end;
     207
    149208
    150209
Note: See TracChangeset for help on using the changeset viewer.