Ignore:
Timestamp:
Jul 10, 2022, 12:37:58 AM (2 years ago)
Author:
chronos
Message:
  • Added: Interrupt handling.
Location:
branches/UltimatOS
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • branches/UltimatOS

    • Property svn:ignore
      •  

        old new  
        22UltimatOS.lps
        33UltimatOS.res
         4UltimatOS.dbg
        45lib
  • branches/UltimatOS/UMachine.pas

    r31 r32  
    44
    55uses
    6   Classes, SysUtils, UCpu, UMemory;
     6  Classes, SysUtils, UCpu, UMemory, ExtCtrls;
    77
    88type
     9  TMachine = class;
    910
    1011  { TDevice }
    1112
    1213  TDevice = class
     14    Machine: TMachine;
    1315    procedure Reset; virtual;
    1416  end;
     17
     18  { TMouse }
    1519
    1620  TMouse = class(TDevice)
    1721    Position: TPoint;
     22    InterruptVector: Integer;
     23    procedure Move(X, Y: Integer);
    1824  end;
    1925
     
    5460  TKeyboard = class(TDevice)
    5561    Buffer: TFifo;
     62    InterruptVector: Integer;
    5663    function ReadKey: Integer;
    5764    function KeyReady: Integer;
     
    5966    destructor Destroy; override;
    6067    procedure Reset; override;
     68    procedure Press(KeyCode: Integer);
     69  end;
     70
     71  { TCounter }
     72
     73  TCounter = class(TDevice)
     74  private
     75    Timer: TTimer;
     76    function GetEnabled: Boolean;
     77    function GetInterval: Integer;
     78    procedure SetEnabled(AValue: Boolean);
     79    procedure SetInterval(AValue: Integer);
     80    procedure DoTimer(Sender: TObject);
     81  public
     82    InterruptVector: Integer;
     83    constructor Create;
     84    destructor Destroy; override;
     85    property Enabled: Boolean read GetEnabled write SetEnabled;
     86    property Interval: Integer read GetInterval write SetInterval;
    6187  end;
    6288
     
    6793    function CpuInput(Address: TAddress): TData;
    6894    procedure CpuOutput(Address: TAddress; Value: TData);
     95    function GetRunning: Boolean;
     96    procedure SetRunning(AValue: Boolean);
    6997  public
    7098    Cpu: TCpu;
     
    73101    Mouse: TMouse;
    74102    Screen: TScreen;
     103    Counter: TCounter;
    75104    procedure Reset;
    76105    constructor Create;
    77106    destructor Destroy; override;
     107    property Running: Boolean read GetRunning write SetRunning;
    78108  end;
    79109
    80110
    81111implementation
     112
     113{ TMouse }
     114
     115procedure TMouse.Move(X, Y: Integer);
     116begin
     117  Position := Point(X, Y);
     118  Machine.Cpu.Interrupt(InterruptVector);
     119end;
     120
     121{ TCounter }
     122
     123function TCounter.GetEnabled: Boolean;
     124begin
     125  Result := Timer.Enabled;
     126end;
     127
     128function TCounter.GetInterval: Integer;
     129begin
     130  Result := Timer.Interval;
     131end;
     132
     133procedure TCounter.SetEnabled(AValue: Boolean);
     134begin
     135  Timer.Enabled := AValue;
     136end;
     137
     138procedure TCounter.SetInterval(AValue: Integer);
     139begin
     140  Timer.Interval := AValue;
     141end;
     142
     143procedure TCounter.DoTimer(Sender: TObject);
     144begin
     145  Machine.Cpu.Interrupt(InterruptVector);
     146end;
     147
     148constructor TCounter.Create;
     149begin
     150  Timer := TTimer.Create(nil);
     151  Timer.OnTimer := DoTimer;
     152  Enabled := False;
     153end;
     154
     155destructor TCounter.Destroy;
     156begin
     157  FreeAndNil(Timer);
     158  inherited;
     159end;
    82160
    83161{ TDevice }
     
    183261begin
    184262  Buffer.Clear;
     263end;
     264
     265procedure TKeyboard.Press(KeyCode: Integer);
     266begin
     267  Buffer.Put(KeyCode);
     268  Machine.Cpu.Interrupt(InterruptVector);
    185269end;
    186270
     
    201285begin
    202286  if Address = 0 then Screen.SetPointer(Value)
    203   else if Address = 1 then Screen.WriteData(Value);
     287  else if Address = 1 then Screen.WriteData(Value)
     288  else if Address = 2 then Counter.Interval := Value
     289  else if Address = 3 then Counter.Enabled := Value = 1;
     290end;
     291
     292function TMachine.GetRunning: Boolean;
     293begin
     294  Result := Cpu.Running;
     295end;
     296
     297procedure TMachine.SetRunning(AValue: Boolean);
     298begin
     299  Cpu.Running := AValue;
    204300end;
    205301
     
    213309constructor TMachine.Create;
    214310begin
     311  Counter := TCounter.Create;
     312  Counter.Machine := Self;
     313  Counter.InterruptVector := 2;
    215314  Memory := TMemory.Create;
    216315  Memory.Size := 200000;
    217316  Keyboard := TKeyboard.Create;
     317  Keyboard.Machine := Self;
     318  Keyboard.InterruptVector := 4;
    218319  Mouse := TMouse.Create;
     320  Mouse.Machine := Self;
     321  Mouse.InterruptVector := 3;
    219322  Screen := TScreen.Create;
    220323  Screen.Size := Point(640, 480);
     
    232335  FreeAndNil(Screen);
    233336  FreeAndNil(Memory);
     337  FreeAndNil(Counter);
    234338  inherited;
    235339end;
Note: See TracChangeset for help on using the changeset viewer.