Changeset 17


Ignore:
Timestamp:
Mar 25, 2026, 8:52:34 PM (4 days ago)
Author:
chronos
Message:
  • Fixed: Wrong PC register increment.
Location:
branches/test3
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • branches/test3/Cpu.pas

    r16 r17  
    234234begin
    235235  Move(PMax(@Memory[PC])^, Result, Count);
    236   Inc(PC, SizeOf(Count));
     236  Inc(PC, Count);
    237237end;
    238238
  • branches/test3/FormMain.pas

    r16 r17  
    1717  TCpu16A64 = TCpu<Word,QWord,QWord>;
    1818  TCpu24 = TCpu<UInt24,UInt24,UInt24>;
     19  TCpu32 = TCpu<DWord,DWord,DWord>;
    1920  TCpu64 = TCpu<QWord,QWord,QWord>;
    2021
     
    2829    procedure FormShow(Sender: TObject);
    2930  private
    30     Buffer: Word;
    31     procedure CpuOutput(Addr: Word; Data: Word; Count: Byte);
    32     function CpuInput(Addr: Word; Count: Byte): Word;
     31    Buffer: QWord;
     32    procedure CpuOutput8(Addr: Byte; Data: Byte; Count: Byte);
     33    function CpuInput8(Addr: Byte; Count: Byte): Byte;
     34    procedure CpuOutput16(Addr: Word; Data: Word; Count: Byte);
     35    function CpuInput16(Addr: Word; Count: Byte): Word;
     36    procedure CpuOutput32(Addr: DWord; Data: DWord; Count: Byte);
     37    function CpuInput32(Addr: DWord; Count: Byte): DWord;
     38    procedure CpuOutput64(Addr: QWord; Data: QWord; Count: Byte);
     39    function CpuInput64(Addr: QWord; Count: Byte): QWord;
    3340  public
    34     Cpu: TCpu16;
     41    Cpu8: TCpu8;
     42    Cpu16: TCpu16;
     43    Cpu32: TCpu32;
     44    Cpu64: TCpu64;
    3545  end;
    3646
     
    4757procedure TFormMain.FormCreate(Sender: TObject);
    4858begin
    49   Cpu := TCpu16.Create;
    50   Cpu.OnInput := CpuInput;
    51   Cpu.OnOutput := CpuOutput;
     59  Cpu8 := TCpu8.Create;
     60  Cpu8.OnInput := CpuInput8;
     61  Cpu8.OnOutput := CpuOutput8;
     62  Cpu16 := TCpu16.Create;
     63  Cpu16.OnInput := CpuInput16;
     64  Cpu16.OnOutput := CpuOutput16;
     65  Cpu32 := TCpu32.Create;
     66  Cpu32.OnInput := CpuInput32;
     67  Cpu32.OnOutput := CpuOutput32;
     68  Cpu64 := TCpu64.Create;
     69  Cpu64.OnInput := CpuInput64;
     70  Cpu64.OnOutput := CpuOutput64;
    5271end;
    5372
    5473procedure TFormMain.FormDestroy(Sender: TObject);
    5574begin
    56   FreeAndNil(Cpu);
     75  FreeAndNil(Cpu8);
     76  FreeAndNil(Cpu16);
     77  FreeAndNil(Cpu32);
     78  FreeAndNil(Cpu64);
    5779end;
    5880
    5981procedure TFormMain.FormShow(Sender: TObject);
    6082begin
    61   with Cpu do begin
     83  with Cpu8 do begin
     84    AddConstN(1, 0, $ab);
     85    AddOutputN(1, 0, 0);
     86    AddHalt;
     87    Run;
     88    Memo1.Lines.Add(IntToHex(Buffer, 2));
     89  end;
     90  with Cpu16 do begin
    6291    AddConstN(2, 0, $abcd);
    6392    AddOutputN(2, 0, 0);
    6493    AddHalt;
    6594    Run;
    66     Memo1.Lines.Add(IntToHex(Buffer));
     95    Memo1.Lines.Add(IntToHex(Buffer, 4));
     96  end;
     97  with Cpu32 do begin
     98    AddConstN(4, 0, $abcdef01);
     99    AddOutputN(4, 0, 0);
     100    AddHalt;
     101    Run;
     102    Memo1.Lines.Add(IntToHex(Buffer, 8));
     103  end;
     104  with Cpu64 do begin
     105    AddConstN(8, 0, $abcdef0123456789);
     106    AddOutputN(8, 0, 0);
     107    AddHalt;
     108    Run;
     109    Memo1.Lines.Add(IntToHex(Buffer, 16));
    67110  end;
    68111end;
    69112
    70 procedure TFormMain.CpuOutput(Addr: Word; Data: Word; Count: Byte);
     113procedure TFormMain.CpuOutput8(Addr: Byte; Data: Byte; Count: Byte);
    71114begin
    72115  case Addr of
     
    75118end;
    76119
    77 function TFormMain.CpuInput(Addr: Word; Count: Byte): Word;
     120function TFormMain.CpuInput8(Addr: Byte; Count: Byte): Byte;
     121begin
     122  case Addr of
     123    0: Result := Buffer;
     124  end;
     125end;
     126
     127procedure TFormMain.CpuOutput16(Addr: Word; Data: Word; Count: Byte);
     128begin
     129  case Addr of
     130    0: Buffer := Data;
     131  end;
     132end;
     133
     134function TFormMain.CpuInput16(Addr: Word; Count: Byte): Word;
     135begin
     136  case Addr of
     137    0: Result := Buffer;
     138  end;
     139end;
     140
     141procedure TFormMain.CpuOutput32(Addr: DWord; Data: DWord; Count: Byte);
     142begin
     143  case Addr of
     144    0: Buffer := Data;
     145  end;
     146end;
     147
     148function TFormMain.CpuInput32(Addr: DWord; Count: Byte): DWord;
     149begin
     150  case Addr of
     151    0: Result := Buffer;
     152  end;
     153end;
     154
     155procedure TFormMain.CpuOutput64(Addr: QWord; Data: QWord; Count: Byte);
     156begin
     157  case Addr of
     158    0: Buffer := Data;
     159  end;
     160end;
     161
     162function TFormMain.CpuInput64(Addr: QWord; Count: Byte): QWord;
    78163begin
    79164  case Addr of
  • branches/test3/Project1.lpi

    r16 r17  
    3838        <IsPartOfProject Value="True"/>
    3939        <ComponentName Value="FormMain"/>
     40        <HasResources Value="True"/>
    4041        <ResourceBaseClass Value="Form"/>
    4142      </Unit>
Note: See TracChangeset for help on using the changeset viewer.