Changeset 8


Ignore:
Timestamp:
Apr 19, 2026, 9:00:16 PM (7 days ago)
Author:
chronos
Message:
  • Modified: Implemented more instructions.
  • Added: Hardware emulation of 8255 and 8253 chips.
Location:
trunk
Files:
2 added
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/SharpMz800.pas

    r6 r8  
    44
    55uses
    6   Classes, SysUtils, Z80, Memory, Base;
     6  Classes, SysUtils, Z80, Memory, Base, I8255, I8253;
    77
    88type
     
    3838    MappedMemory: TMemoryMapped;
    3939    MappedIO: TMemoryIO;
     40    I8255: T8255;
     41    I8253: T8253;
    4042    procedure PowerOn;
    4143    procedure PowerOff;
     
    6567begin
    6668  Result := 0;
     69  case Address of
     70    $e0..$e6: Result := MemoryBankControl[Address - $e0];
     71    $d0..$d3: Result := I8255.Read(Address - $d0);
     72    $d4..$d7: Result := I8253.Read(Address - $d4);
     73    else MesssageExecute('Unsupported I/O port read from ' + IntToHex(Address, 4));
     74  end;
    6775end;
    6876
     
    7987    end;
    8088    $e0..$e6: MemoryBankControl[Address - $e0] := Data;
    81     else MesssageExecute('Unsupported I/O port ' + IntToHex(Address, 4) + ' data ' + IntToHex(Data, 2));
     89    $d0..$d3: I8255.Write(Address - $d0, Data);
     90    $d4..$d7: I8253.Write(Address - $d4, Data);
     91    else MesssageExecute('Unsupported I/O port write to ' + IntToHex(Address, 4) + ' data ' + IntToHex(Data, 2));
    8292  end;
    8393end;
     
    97107      VideoRam.Size := $1000;
    98108      MappedMemory.Areas.AddNew($e000, MappedIO);
    99       MappedMemory.Areas.AddNew($e010, ExtendedRom);
     109      MappedMemory.Areas.AddNew($e000, ExtendedRom);
    100110    end;
    101111    md800: begin
     
    133143  Mode := md800;
    134144  Resolution := rs320x200;
     145  I8255 := T8255.Create;
     146  I8253 := T8253.Create;
    135147  Memory := TMemoryData.Create;
    136148  Memory.Title := 'Main memory';
     
    176188  FreeAndNil(Memory);
    177189  FreeAndNil(MappedIO);
     190  FreeAndNil(I8255);
     191  FreeAndNil(I8253);
    178192  inherited;
    179193end;
  • trunk/Z80/Z80.pas

    r7 r8  
    4848    FThread: TCpuThread;
    4949    Instruction: TInstruction;
     50    InstructionAddress: Word;
    5051    MessageText: string;
     52    procedure Error(Message: string);
    5153    procedure SetRunning(AValue: Boolean);
    5254    function DoRead(Address: Word): Byte;
     55    function DoReadWord(Address: Word): Word;
    5356    procedure DoWrite(Address: Word; Data: Byte);
     57    procedure DoWriteWord(Address: Word; Data: Word);
    5458    function DoInput(Address: Word): Byte;
    5559    procedure DoOutput(Address: Word; Data: Byte);
     
    6165    function PopWord: Word;
    6266    procedure Call(Address: Word);
     67    procedure CallCond(Address: Word; Condition: Boolean);
    6368    procedure Cp(Data: Byte);
    6469    procedure Jr(Condition: Boolean);
    6570    procedure Djnz;
    6671    procedure Jp(Condition: Boolean);
    67     //procedure Halt;
    6872    procedure RetCond(Condition: Boolean);
    6973    procedure NotImplemented;
     74    procedure AddByte(var Target: Byte; Second: Byte);
     75    procedure AddWord(var Target: Word; Second: Word);
     76    procedure AdcByte(var Target: Byte; Second: Byte);
     77    procedure AdcWord(var Target: Word; Second: Word);
     78    procedure SubByte(var Target: Byte; Second: Byte);
     79    procedure SbcByte(var Target: Byte; Second: Byte);
     80    procedure SbcWord(var Target: Word; Second: Word);
     81    procedure XorByte(var Target: Byte; Second: Byte);
     82    procedure OrByte(var Target: Byte; Second: Byte);
    7083
    7184    // Instruction methods
     
    777790    Carry: Boolean;
    778791    Zero: Boolean;
     792    ParityOverflow: Boolean;
     793    SignNegative: Boolean;
    779794    Memory: TMemory;
    780795    Ticks: Cardinal;
     
    818833{ TCpuZ80 }
    819834
     835procedure TCpuZ80.Error(Message: string);
     836begin
     837  PC := InstructionAddress;
     838  DoMessage(Message + ' on address ' + IntToHex(Word(PC), 4));
     839  Halt;
     840end;
     841
    820842procedure TCpuZ80.SetRunning(AValue: Boolean);
    821843begin
     
    841863end;
    842864
     865function TCpuZ80.DoReadWord(Address: Word): Word;
     866begin
     867  Result := DoRead(Address) or (DoRead(Address + 1) shl 8);
     868end;
     869
    843870procedure TCpuZ80.DoWrite(Address: Word; Data: Byte);
    844871begin
    845872  if Assigned(FOnRead) then FOnWrite(Address, Data);
     873end;
     874
     875procedure TCpuZ80.DoWriteWord(Address: Word; Data: Word);
     876begin
     877  DoWrite(Address, Data and $ff);
     878  DoWrite(Address + 1, Data shr 8);
    846879end;
    847880
     
    897930  PushWord(PC);
    898931  PC := Address;
     932end;
     933
     934procedure TCpuZ80.CallCond(Address: Word; Condition: Boolean);
     935begin
     936  if Condition then begin
     937    PushWord(PC);
     938    PC := Address;
     939  end;
    899940end;
    900941
     
    948989procedure TCpuZ80.NotImplemented;
    949990begin
    950   Dec(PC);
    951   DoMessage('Not implemented instruction ' + IntToHex(Word(Instruction), 4) +
    952     ' on address ' + IntToHex(Word(PC), 4));
    953   Halt;
     991  Error('Not implemented instruction ' + IntToHex(Word(Instruction), 4));
     992end;
     993
     994procedure TCpuZ80.AddByte(var Target: Byte; Second: Byte);
     995begin
     996  Target := Target + Second;
     997end;
     998
     999procedure TCpuZ80.AddWord(var Target: Word; Second: Word);
     1000begin
     1001  Target := Target + Second;
     1002end;
     1003
     1004procedure TCpuZ80.AdcByte(var Target: Byte; Second: Byte);
     1005begin
     1006  Target := Target + Second;
     1007end;
     1008
     1009procedure TCpuZ80.AdcWord(var Target: Word; Second: Word);
     1010begin
     1011  Target := Target - Second;
     1012end;
     1013
     1014procedure TCpuZ80.SubByte(var Target: Byte; Second: Byte);
     1015begin
     1016  Target := Target - Second;
     1017end;
     1018
     1019procedure TCpuZ80.SbcByte(var Target: Byte; Second: Byte);
     1020begin
     1021  Target := Target - Second;
     1022end;
     1023
     1024procedure TCpuZ80.SbcWord(var Target: Word; Second: Word);
     1025begin
     1026  Target := Target - Second;
     1027end;
     1028
     1029procedure TCpuZ80.XorByte(var Target: Byte; Second: Byte);
     1030begin
     1031  Target := Target xor Second;
     1032end;
     1033
     1034procedure TCpuZ80.OrByte(var Target: Byte; Second: Byte);
     1035begin
     1036  Target := Target or Second;
    9541037end;
    9551038
     
    16561739procedure TCpuZ80.NOP;
    16571740begin
    1658   // No opearation
     1741  // No operation
    16591742end;
    16601743
     
    17071790procedure TCpuZ80.LD_A_BC_Indirect;
    17081791begin
    1709   NotImplemented;
     1792  A := DoRead(BC.Value);
    17101793end;
    17111794
    17121795procedure TCpuZ80.DEC_BC;
    17131796begin
    1714   NotImplemented;
     1797  Dec(BC.Value);
    17151798end;
    17161799
    17171800procedure TCpuZ80.INC_C;
    17181801begin
    1719   NotImplemented;
     1802  Inc(BC.C);
    17201803end;
    17211804
    17221805procedure TCpuZ80.DEC_C;
    17231806begin
    1724   NotImplemented;
     1807  Dec(BC.C);
    17251808end;
    17261809
    17271810procedure TCpuZ80.LD_C_N;
    17281811begin
    1729   NotImplemented;
     1812  BC.C := ReadByte;
    17301813end;
    17311814
     
    17471830procedure TCpuZ80.LD_DE_Indirect_A;
    17481831begin
    1749   NotImplemented;
     1832  DoWrite(DE.Value, A);
    17501833end;
    17511834
    17521835procedure TCpuZ80.INC_DE;
    17531836begin
    1754   NotImplemented;
     1837  Inc(DE.Value);
    17551838end;
    17561839
    17571840procedure TCpuZ80.INC_D;
    17581841begin
    1759   NotImplemented;
     1842  Inc(DE.D);
    17601843end;
    17611844
    17621845procedure TCpuZ80.DEC_D;
    17631846begin
    1764   NotImplemented;
     1847  Dec(DE.D);
    17651848end;
    17661849
    17671850procedure TCpuZ80.LD_D_N;
    17681851begin
    1769   NotImplemented;
     1852  DE.D := ReadByte;
    17701853end;
    17711854
     
    17821865procedure TCpuZ80.ADD_HL_DE;
    17831866begin
    1784   NotImplemented;
     1867  AddWord(HL.Value, DE.Value);
    17851868end;
    17861869
    17871870procedure TCpuZ80.LD_A_DE_Indirect;
    17881871begin
    1789   NotImplemented;
     1872  A := DoRead(DE.Value);
    17901873end;
    17911874
    17921875procedure TCpuZ80.DEC_DE;
    17931876begin
    1794   NotImplemented;
     1877  Dec(DE.Value);
    17951878end;
    17961879
    17971880procedure TCpuZ80.INC_E;
    17981881begin
    1799   NotImplemented;
     1882  Inc(DE.E);
    18001883end;
    18011884
    18021885procedure TCpuZ80.DEC_E;
    18031886begin
    1804   NotImplemented;
     1887  Dec(DE.E);
    18051888end;
    18061889
    18071890procedure TCpuZ80.LD_E_N;
    18081891begin
    1809   NotImplemented;
     1892  DE.E := ReadByte;
    18101893end;
    18111894
     
    18271910procedure TCpuZ80.LD_NN_Indirect_HL;
    18281911begin
    1829   NotImplemented;
     1912  DoWrite(ReadWord, HL.Value);
    18301913end;
    18311914
     
    18371920procedure TCpuZ80.INC_H;
    18381921begin
    1839   NotImplemented;
     1922  Inc(HL.H);
    18401923end;
    18411924
    18421925procedure TCpuZ80.DEC_H;
    18431926begin
    1844   NotImplemented;
     1927  Dec(HL.H);
    18451928end;
    18461929
    18471930procedure TCpuZ80.LD_H_N;
    18481931begin
    1849   NotImplemented;
     1932  HL.H := ReadByte;
    18501933end;
    18511934
     
    18571940procedure TCpuZ80.JR_Z_D;
    18581941begin
    1859   NotImplemented;
     1942  Jr(Zero);
    18601943end;
    18611944
    18621945procedure TCpuZ80.ADD_HL_HL;
    18631946begin
    1864   NotImplemented;
     1947  AddWord(Hl.Value, HL.Value);
    18651948end;
    18661949
    18671950procedure TCpuZ80.LD_HL_NN_Indirect;
    18681951begin
    1869   NotImplemented;
     1952  HL.Value := DoRead(ReadWord);
    18701953end;
    18711954
     
    18771960procedure TCpuZ80.INC_L;
    18781961begin
    1879   NotImplemented;
     1962  Inc(HL.L);
    18801963end;
    18811964
    18821965procedure TCpuZ80.DEC_L;
    18831966begin
    1884   NotImplemented;
     1967  Dec(HL.L);
    18851968end;
    18861969
    18871970procedure TCpuZ80.LD_L_N;
    18881971begin
    1889   NotImplemented;
     1972  HL.L := ReadByte;
    18901973end;
    18911974
     
    19121995procedure TCpuZ80.INC_SP;
    19131996begin
    1914   NotImplemented;
     1997  Inc(SP);
    19151998end;
    19161999
    19172000procedure TCpuZ80.INC_HL_Indirect;
    19182001begin
    1919   NotImplemented;
     2002  DoWrite(HL.Value, DoRead(HL.Value) + 1);
    19202003end;
    19212004
    19222005procedure TCpuZ80.DEC_HL_Indirect;
    19232006begin
    1924   NotImplemented;
     2007  DoWrite(HL.Value, DoRead(HL.Value) - 1);
    19252008end;
    19262009
     
    19372020procedure TCpuZ80.JR_C_D;
    19382021begin
    1939   NotImplemented;
     2022  Jr(Carry);
    19402023end;
    19412024
    19422025procedure TCpuZ80.ADD_HL_SP;
    19432026begin
    1944   NotImplemented;
     2027  AddWord(HL.Value, SP);
    19452028end;
    19462029
     
    19522035procedure TCpuZ80.DEC_SP;
    19532036begin
    1954   NotImplemented;
     2037  Dec(SP);
    19552038end;
    19562039
    19572040procedure TCpuZ80.INC_A;
    19582041begin
    1959   NotImplemented;
     2042  Inc(A);
    19602043end;
    19612044
    19622045procedure TCpuZ80.DEC_A;
    19632046begin
    1964   NotImplemented;
     2047  Dec(A);
    19652048end;
    19662049
     
    19722055procedure TCpuZ80.CCF;
    19732056begin
    1974   NotImplemented;
     2057  Carry := not Carry;
    19752058end;
    19762059
    19772060procedure TCpuZ80.LD_B_B;
    19782061begin
    1979   NotImplemented;
     2062  BC.B := BC.B;
    19802063end;
    19812064
    19822065procedure TCpuZ80.LD_B_C;
    19832066begin
    1984   NotImplemented;
     2067  BC.B := BC.C;
    19852068end;
    19862069
    19872070procedure TCpuZ80.LD_B_D;
    19882071begin
    1989   NotImplemented;
     2072  BC.B := DE.D;
    19902073end;
    19912074
    19922075procedure TCpuZ80.LD_B_E;
    19932076begin
    1994   NotImplemented;
     2077  BC.B := DE.E;
    19952078end;
    19962079
    19972080procedure TCpuZ80.LD_B_H;
    19982081begin
    1999   NotImplemented;
     2082  BC.B := HL.H;
    20002083end;
    20012084
    20022085procedure TCpuZ80.LD_B_L;
    20032086begin
    2004   NotImplemented;
     2087  BC.B := HL.L;
    20052088end;
    20062089
    20072090procedure TCpuZ80.LD_B_HL_Indirect;
    20082091begin
    2009   NotImplemented;
     2092  BC.B := DoRead(HL.Value);
    20102093end;
    20112094
     
    20172100procedure TCpuZ80.LD_C_B;
    20182101begin
    2019   NotImplemented;
     2102  BC.C := BC.B;
    20202103end;
    20212104
    20222105procedure TCpuZ80.LD_C_C;
    20232106begin
    2024   NotImplemented;
     2107  BC.C := BC.C;
    20252108end;
    20262109
    20272110procedure TCpuZ80.LD_C_D;
    20282111begin
    2029   NotImplemented;
     2112  BC.C := DE.D;
    20302113end;
    20312114
    20322115procedure TCpuZ80.LD_C_E;
    20332116begin
    2034   NotImplemented;
     2117  BC.C := DE.E;
    20352118end;
    20362119
    20372120procedure TCpuZ80.LD_C_H;
    20382121begin
    2039   NotImplemented;
     2122  BC.C := HL.H;
    20402123end;
    20412124
    20422125procedure TCpuZ80.LD_C_L;
    20432126begin
    2044   NotImplemented;
     2127  BC.C := HL.L;
    20452128end;
    20462129
     
    20572140procedure TCpuZ80.LD_D_B;
    20582141begin
    2059   NotImplemented;
     2142  DE.D := BC.B;
    20602143end;
    20612144
    20622145procedure TCpuZ80.LD_D_C;
    20632146begin
    2064   NotImplemented;
     2147  DE.D := BC.C;
    20652148end;
    20662149
    20672150procedure TCpuZ80.LD_D_D;
    20682151begin
    2069   NotImplemented;
     2152  DE.D := DE.D;
    20702153end;
    20712154
    20722155procedure TCpuZ80.LD_D_E;
    20732156begin
    2074   NotImplemented;
     2157  DE.D := DE.E;
    20752158end;
    20762159
    20772160procedure TCpuZ80.LD_D_H;
    20782161begin
    2079   NotImplemented;
     2162  DE.D := HL.H;
    20802163end;
    20812164
    20822165procedure TCpuZ80.LD_D_L;
    20832166begin
    2084   NotImplemented;
     2167  DE.D := HL.L;
    20852168end;
    20862169
    20872170procedure TCpuZ80.LD_D_HL_Indirect;
    20882171begin
    2089   NotImplemented;
     2172  DE.D := DoRead(HL.Value);
    20902173end;
    20912174
    20922175procedure TCpuZ80.LD_D_A;
    20932176begin
    2094   NotImplemented;
     2177  DE.D := A;
    20952178end;
    20962179
    20972180procedure TCpuZ80.LD_E_B;
    20982181begin
    2099   NotImplemented;
     2182  DE.E := BC.B;
    21002183end;
    21012184
    21022185procedure TCpuZ80.LD_E_C;
    21032186begin
    2104   NotImplemented;
     2187  DE.E := BC.C;
    21052188end;
    21062189
    21072190procedure TCpuZ80.LD_E_D;
    21082191begin
    2109   NotImplemented;
     2192  DE.E := DE.D;
    21102193end;
    21112194
    21122195procedure TCpuZ80.LD_E_E;
    21132196begin
    2114   NotImplemented;
     2197  DE.E := DE.E;
    21152198end;
    21162199
    21172200procedure TCpuZ80.LD_E_H;
    21182201begin
    2119   NotImplemented;
     2202  DE.E := HL.H;
    21202203end;
    21212204
    21222205procedure TCpuZ80.LD_E_L;
    21232206begin
    2124   NotImplemented;
     2207  DE.E := HL.L;
    21252208end;
    21262209
    21272210procedure TCpuZ80.LD_E_HL_Indirect;
    21282211begin
    2129   NotImplemented;
     2212  DE.E := DoRead(HL.Value);
    21302213end;
    21312214
    21322215procedure TCpuZ80.LD_E_A;
    21332216begin
    2134   NotImplemented;
     2217  DE.E := A;
    21352218end;
    21362219
     
    21422225procedure TCpuZ80.LD_H_C;
    21432226begin
    2144   NotImplemented;
     2227  HL.H := BC.C;
    21452228end;
    21462229
    21472230procedure TCpuZ80.LD_H_D;
    21482231begin
    2149   NotImplemented;
     2232  HL.H := DE.D;
    21502233end;
    21512234
    21522235procedure TCpuZ80.LD_H_E;
    21532236begin
    2154   NotImplemented;
     2237  HL.H := DE.E;
    21552238end;
    21562239
    21572240procedure TCpuZ80.LD_H_H;
    21582241begin
    2159   NotImplemented;
     2242  HL.H := HL.H;
    21602243end;
    21612244
    21622245procedure TCpuZ80.LD_H_L;
    21632246begin
    2164   NotImplemented;
     2247  HL.H := HL.L;
    21652248end;
    21662249
    21672250procedure TCpuZ80.LD_H_HL_Indirect;
    21682251begin
    2169   NotImplemented;
     2252  HL.H := DoRead(HL.Value);
    21702253end;
    21712254
    21722255procedure TCpuZ80.LD_H_A;
    21732256begin
    2174   NotImplemented;
     2257  HL.H := A;
    21752258end;
    21762259
    21772260procedure TCpuZ80.LD_L_B;
    21782261begin
    2179   NotImplemented;
     2262  HL.L := BC.B;
    21802263end;
    21812264
     
    21872270procedure TCpuZ80.LD_L_D;
    21882271begin
    2189   NotImplemented;
     2272  HL.L := DE.D;
    21902273end;
    21912274
    21922275procedure TCpuZ80.LD_L_E;
    21932276begin
    2194   NotImplemented;
     2277  HL.L := DE.E;
    21952278end;
    21962279
    21972280procedure TCpuZ80.LD_L_H;
    21982281begin
    2199   NotImplemented;
     2282  HL.L := HL.H;
    22002283end;
    22012284
    22022285procedure TCpuZ80.LD_L_L;
    22032286begin
    2204   NotImplemented;
     2287  HL.L := HL.L;
    22052288end;
    22062289
    22072290procedure TCpuZ80.LD_L_HL_Indirect;
    22082291begin
    2209   NotImplemented;
     2292  HL.L := DoRead(HL.Value);
    22102293end;
    22112294
    22122295procedure TCpuZ80.LD_L_A;
    22132296begin
    2214   NotImplemented;
     2297  HL.L := A;
    22152298end;
    22162299
    22172300procedure TCpuZ80.LD_HL_Indirect_B;
    22182301begin
    2219   NotImplemented;
     2302  DoWrite(HL.Value, BC.B);
    22202303end;
    22212304
    22222305procedure TCpuZ80.LD_HL_Indirect_C;
    22232306begin
    2224   NotImplemented;
     2307  DoWrite(HL.Value, BC.C);
    22252308end;
    22262309
     
    22372320procedure TCpuZ80.LD_HL_Indirect_H;
    22382321begin
    2239   NotImplemented;
     2322  DoWrite(HL.Value, HL.H);
    22402323end;
    22412324
    22422325procedure TCpuZ80.LD_HL_Indirect_L;
    22432326begin
    2244   NotImplemented;
     2327  DoWrite(HL.Value, HL.L);
    22452328end;
    22462329
     
    22522335procedure TCpuZ80.LD_HL_Indirect_A;
    22532336begin
    2254   NotImplemented;
     2337  DoWrite(HL.Value, A);
    22552338end;
    22562339
    22572340procedure TCpuZ80.LD_A_B;
    22582341begin
    2259   NotImplemented;
     2342  A := BC.B;
    22602343end;
    22612344
     
    22672350procedure TCpuZ80.LD_A_D;
    22682351begin
    2269   NotImplemented;
     2352  A := DE.D;
    22702353end;
    22712354
    22722355procedure TCpuZ80.LD_A_E;
    22732356begin
    2274   NotImplemented;
     2357  A := DE.E;
    22752358end;
    22762359
    22772360procedure TCpuZ80.LD_A_H;
    22782361begin
    2279   NotImplemented;
     2362  A := HL.H;
    22802363end;
    22812364
    22822365procedure TCpuZ80.LD_A_L;
    22832366begin
    2284   NotImplemented;
     2367  A := HL.L;
    22852368end;
    22862369
     
    22922375procedure TCpuZ80.LD_A_A;
    22932376begin
    2294   NotImplemented;
     2377  A := A;
    22952378end;
    22962379
    22972380procedure TCpuZ80.ADD_A_B;
    22982381begin
    2299   NotImplemented;
     2382  AddByte(A, BC.B);
    23002383end;
    23012384
    23022385procedure TCpuZ80.ADD_A_C;
    23032386begin
    2304   NotImplemented;
     2387  AddByte(A, BC.C);
    23052388end;
    23062389
    23072390procedure TCpuZ80.ADD_A_D;
    23082391begin
    2309   NotImplemented;
     2392  AddByte(A, DE.D);
    23102393end;
    23112394
    23122395procedure TCpuZ80.ADD_A_E;
    23132396begin
    2314   NotImplemented;
     2397  AddByte(A, DE.E);
    23152398end;
    23162399
    23172400procedure TCpuZ80.ADD_A_H;
    23182401begin
    2319   NotImplemented;
     2402  AddByte(A, HL.H);
    23202403end;
    23212404
    23222405procedure TCpuZ80.ADD_A_L;
    23232406begin
    2324   NotImplemented;
     2407  AddByte(A, HL.L);
    23252408end;
    23262409
    23272410procedure TCpuZ80.ADD_A_HL_Indirect;
    23282411begin
    2329   NotImplemented;
     2412  AddByte(A, DoRead(HL.Value));
    23302413end;
    23312414
    23322415procedure TCpuZ80.ADD_A_A;
    23332416begin
    2334   NotImplemented;
     2417  AddByte(A, A);
    23352418end;
    23362419
    23372420procedure TCpuZ80.ADC_A_B;
    23382421begin
    2339   NotImplemented;
     2422  AdcByte(A, BC.B);
    23402423end;
    23412424
    23422425procedure TCpuZ80.ADC_A_C;
    23432426begin
    2344   NotImplemented;
     2427  AdcByte(A, BC.C);
    23452428end;
    23462429
    23472430procedure TCpuZ80.ADC_A_D;
    23482431begin
    2349   NotImplemented;
     2432  AdcByte(A, DE.D);
    23502433end;
    23512434
    23522435procedure TCpuZ80.ADC_A_E;
    23532436begin
    2354   NotImplemented;
     2437  AdcByte(A, DE.E);
    23552438end;
    23562439
    23572440procedure TCpuZ80.ADC_A_H;
    23582441begin
    2359   NotImplemented;
     2442  AdcByte(A, HL.H);
    23602443end;
    23612444
    23622445procedure TCpuZ80.ADC_A_L;
    23632446begin
    2364   NotImplemented;
     2447  AdcByte(A, HL.L);
    23652448end;
    23662449
    23672450procedure TCpuZ80.ADC_A_HL_Indirect;
    23682451begin
    2369   NotImplemented;
     2452  AdcByte(A, DoRead(HL.Value));
    23702453end;
    23712454
    23722455procedure TCpuZ80.ADC_A_A;
    23732456begin
    2374   NotImplemented;
     2457  AdcByte(A, A);
    23752458end;
    23762459
    23772460procedure TCpuZ80.SUB_B;
    23782461begin
    2379   NotImplemented;
     2462  SubByte(A, BC.B);
    23802463end;
    23812464
    23822465procedure TCpuZ80.SUB_C;
    23832466begin
    2384   NotImplemented;
     2467  SubByte(A, BC.C);
    23852468end;
    23862469
    23872470procedure TCpuZ80.SUB_D;
    23882471begin
    2389   NotImplemented;
     2472  SubByte(A, DE.D);
    23902473end;
    23912474
    23922475procedure TCpuZ80.SUB_E;
    23932476begin
    2394   NotImplemented;
     2477  SubByte(A, DE.E);
    23952478end;
    23962479
    23972480procedure TCpuZ80.SUB_H;
    23982481begin
    2399   NotImplemented;
     2482  SubByte(A, HL.H);
    24002483end;
    24012484
    24022485procedure TCpuZ80.SUB_L;
    24032486begin
    2404   NotImplemented;
     2487  SubByte(A, HL.L);
    24052488end;
    24062489
    24072490procedure TCpuZ80.SUB_HL_Indirect;
    24082491begin
    2409   NotImplemented;
     2492  SubByte(A, DoRead(HL.Value));
    24102493end;
    24112494
    24122495procedure TCpuZ80.SUB_A;
    24132496begin
    2414   NotImplemented;
     2497  SubByte(A, A);
    24152498end;
    24162499
    24172500procedure TCpuZ80.SBC_A_B;
    24182501begin
    2419   NotImplemented;
     2502  SbcByte(A, BC.B);
    24202503end;
    24212504
    24222505procedure TCpuZ80.SBC_A_C;
    24232506begin
    2424   NotImplemented;
     2507  SbcByte(A, BC.C);
    24252508end;
    24262509
    24272510procedure TCpuZ80.SBC_A_D;
    24282511begin
    2429   NotImplemented;
     2512  SbcByte(A, DE.D);
    24302513end;
    24312514
    24322515procedure TCpuZ80.SBC_A_E;
    24332516begin
    2434   NotImplemented;
     2517  SbcByte(A, DE.E);
    24352518end;
    24362519
    24372520procedure TCpuZ80.SBC_A_H;
    24382521begin
    2439   NotImplemented;
     2522  SbcByte(A, HL.H);
    24402523end;
    24412524
    24422525procedure TCpuZ80.SBC_A_L;
    24432526begin
    2444   NotImplemented;
     2527  SbcByte(A, HL.L);
    24452528end;
    24462529
    24472530procedure TCpuZ80.SBC_A_HL_Indirect;
    24482531begin
    2449   NotImplemented;
     2532  SbcByte(A, DoRead(HL.Value));
    24502533end;
    24512534
    24522535procedure TCpuZ80.SBC_A_A;
    24532536begin
    2454   NotImplemented;
     2537  SbcByte(A, A);
    24552538end;
    24562539
     
    25022585procedure TCpuZ80.XOR_C;
    25032586begin
    2504   NotImplemented;
     2587  A := A xor BC.C;
    25052588end;
    25062589
    25072590procedure TCpuZ80.XOR_D;
    25082591begin
    2509   NotImplemented;
     2592  A := A xor DE.D;
    25102593end;
    25112594
    25122595procedure TCpuZ80.XOR_E;
    25132596begin
    2514   NotImplemented;
     2597  A := A xor DE.E;
    25152598end;
    25162599
    25172600procedure TCpuZ80.XOR_H;
    25182601begin
    2519   NotImplemented;
     2602  A := A xor HL.H;
    25202603end;
    25212604
    25222605procedure TCpuZ80.XOR_L;
    25232606begin
    2524   NotImplemented;
     2607  A := A xor HL.L;
    25252608end;
    25262609
    25272610procedure TCpuZ80.XOR_HL_Indirect;
    25282611begin
    2529   NotImplemented;
     2612  A := A xor DoRead(HL.Value);
    25302613end;
    25312614
     
    25372620procedure TCpuZ80.OR_B;
    25382621begin
    2539   NotImplemented;
     2622  A := A or BC.B;
    25402623end;
    25412624
    25422625procedure TCpuZ80.OR_C;
    25432626begin
    2544   NotImplemented;
     2627  A := A or BC.C;
    25452628end;
    25462629
    25472630procedure TCpuZ80.OR_D;
    25482631begin
    2549   NotImplemented;
     2632  A := A or DE.D;
    25502633end;
    25512634
    25522635procedure TCpuZ80.OR_E;
    25532636begin
    2554   NotImplemented;
     2637  A := A or DE.E;
    25552638end;
    25562639
    25572640procedure TCpuZ80.OR_H;
    25582641begin
    2559   NotImplemented;
     2642  A := A or HL.H;
    25602643end;
    25612644
    25622645procedure TCpuZ80.OR_L;
    25632646begin
    2564   NotImplemented;
     2647  A := A or HL.L;
    25652648end;
    25662649
    25672650procedure TCpuZ80.OR_HL_Indirect;
    25682651begin
    2569   NotImplemented;
     2652  A := A or DoRead(HL.Value);
    25702653end;
    25712654
     
    25772660procedure TCpuZ80.CP_B;
    25782661begin
    2579   NotImplemented;
     2662  Cp(BC.B);
    25802663end;
    25812664
    25822665procedure TCpuZ80.CP_C;
    25832666begin
    2584   NotImplemented;
     2667  Cp(BC.C);
    25852668end;
    25862669
     
    25972680procedure TCpuZ80.CP_H;
    25982681begin
    2599   NotImplemented;
     2682  Cp(HL.H);
    26002683end;
    26012684
    26022685procedure TCpuZ80.CP_L;
    26032686begin
    2604   NotImplemented;
     2687  Cp(HL.L);
    26052688end;
    26062689
    26072690procedure TCpuZ80.CP_HL_Indirect;
    26082691begin
    2609   NotImplemented;
     2692  CP(DoRead(HL.Value));
    26102693end;
    26112694
    26122695procedure TCpuZ80.CP_A;
    26132696begin
    2614   NotImplemented;
     2697  CP(A);
    26152698end;
    26162699
    26172700procedure TCpuZ80.RET_NZ;
    26182701begin
    2619   NotImplemented;
     2702  RetCond(not Zero);
    26202703end;
    26212704
    26222705procedure TCpuZ80.POP_BC;
    26232706begin
    2624   NotImplemented;
     2707  BC.Value := PopWord;
    26252708end;
    26262709
     
    26372720procedure TCpuZ80.CALL_NZ_NN;
    26382721begin
    2639   NotImplemented;
     2722  CallCond(ReadWord, not Zero);
    26402723end;
    26412724
     
    26472730procedure TCpuZ80.ADD_A_N;
    26482731begin
    2649   NotImplemented;
     2732  AddByte(A, ReadByte);
    26502733end;
    26512734
     
    26672750procedure TCpuZ80.JP_Z_NN;
    26682751begin
    2669   NotImplemented;
     2752  Jp(Zero);
    26702753end;
    26712754
    26722755procedure TCpuZ80.CALL_Z_NN;
    26732756begin
    2674   NotImplemented;
     2757  CallCond(ReadWord, Zero);
    26752758end;
    26762759
     
    26892772procedure TCpuZ80.ADC_A_N;
    26902773begin
    2691   NotImplemented;
     2774  AdcByte(A, ReadByte);
    26922775end;
    26932776
     
    26992782procedure TCpuZ80.RET_NC;
    27002783begin
    2701   NotImplemented;
     2784  RetCond(not Carry);
    27022785end;
    27032786
    27042787procedure TCpuZ80.POP_DE;
    27052788begin
    2706   NotImplemented;
     2789  DE.Value := PopWord;
    27072790end;
    27082791
    27092792procedure TCpuZ80.JP_NC_NN;
    27102793begin
    2711   NotImplemented;
     2794  Jp(not Carry);
    27122795end;
    27132796
     
    27192802procedure TCpuZ80.CALL_NC_NN;
    27202803begin
    2721   NotImplemented;
     2804  CallCond(ReadWord, not Carry);
    27222805end;
    27232806
     
    27292812procedure TCpuZ80.SUB_N;
    27302813begin
    2731   NotImplemented;
     2814  SubByte(A, ReadByte);
    27322815end;
    27332816
     
    27392822procedure TCpuZ80.RET_C;
    27402823begin
    2741   NotImplemented;
     2824  RetCond(Carry);
    27422825end;
    27432826
     
    27492832procedure TCpuZ80.JP_C_NN;
    27502833begin
    2751   NotImplemented;
     2834  Jp(Carry);
    27522835end;
    27532836
     
    27592842procedure TCpuZ80.CALL_C_NN;
    27602843begin
    2761   NotImplemented;
     2844  CallCond(ReadWord, Carry);
    27622845end;
    27632846
    27642847procedure TCpuZ80.SBC_A_N;
    27652848begin
    2766   NotImplemented;
     2849  SbcByte(A, ReadByte);
    27672850end;
    27682851
     
    27742857procedure TCpuZ80.RET_PO;
    27752858begin
    2776   NotImplemented;
     2859  RetCond(not ParityOverflow);
    27772860end;
    27782861
    27792862procedure TCpuZ80.POP_HL;
    27802863begin
    2781   NotImplemented;
     2864  HL.Value := PopWord;
    27822865end;
    27832866
     
    28192902procedure TCpuZ80.JP_HL_Indirect;
    28202903begin
    2821   NotImplemented;
     2904  PC := DoRead(HL.Value);
    28222905end;
    28232906
     
    28432926procedure TCpuZ80.XOR_N;
    28442927begin
    2845   NotImplemented;
     2928  XorByte(A, ReadByte);
    28462929end;
    28472930
     
    28582941procedure TCpuZ80.POP_AF;
    28592942begin
    2860   NotImplemented;
     2943  A := PopWord and $ff;
    28612944end;
    28622945
     
    28832966procedure TCpuZ80.OR_N;
    28842967begin
    2885   NotImplemented;
     2968  OrByte(A, ReadByte);
    28862969end;
    28872970
     
    28982981procedure TCpuZ80.LD_SP_HL;
    28992982begin
    2900   NotImplemented;
     2983  SP := HL.Value;
    29012984end;
    29022985
     
    29283011procedure TCpuZ80.IN_B_C_Indirect;
    29293012begin
    2930   NotImplemented;
     3013  BC.B := DoInput(BC.Value);
    29313014end;
    29323015
    29333016procedure TCpuZ80.OUT_C_Indirect_B;
    29343017begin
    2935   NotImplemented;
     3018  BC.C := DoInput(BC.Value);
    29363019end;
    29373020
    29383021procedure TCpuZ80.SBC_HL_BC;
    29393022begin
    2940   NotImplemented;
     3023  SbcWord(HL.Value, BC.Value);
    29413024end;
    29423025
    29433026procedure TCpuZ80.LD_NN_Indirect_BC;
    29443027begin
    2945   NotImplemented;
     3028  DoWrite(ReadWord, BC.Value);
    29463029end;
    29473030
     
    29533036procedure TCpuZ80.RETN;
    29543037begin
    2955   NotImplemented;
     3038  InterruptEnabled := False;
     3039  PC := PopWord;
    29563040end;
    29573041
    29583042procedure TCpuZ80.IM_0;
    29593043begin
    2960   NotImplemented;
     3044  InterruptMode := 0;
    29613045end;
    29623046
     
    29883072procedure TCpuZ80.RETI;
    29893073begin
    2990   NotImplemented;
     3074  InterruptEnabled := False;
     3075  PC := PopWord;
    29913076end;
    29923077
     
    30033088procedure TCpuZ80.OUT_C_Indirect_D;
    30043089begin
    3005   NotImplemented;
     3090  DoOutput(BC.Value, DE.D);
    30063091end;
    30073092
    30083093procedure TCpuZ80.SBC_HL_DE;
    30093094begin
    3010   HL.Value := HL.Value - DE.Value;
     3095  SbcWord(HL.Value, DE.Value);
    30113096end;
    30123097
    30133098procedure TCpuZ80.LD_NN_Indirect_DE;
    30143099begin
    3015   NotImplemented;
     3100  DoWriteWord(ReadWord, DE.Value);
    30163101end;
    30173102
     
    30283113procedure TCpuZ80.IN_E_C_Indirect;
    30293114begin
    3030   NotImplemented;
     3115  DE.E := DoInput(BC.Value);
    30313116end;
    30323117
    30333118procedure TCpuZ80.OUT_C_Indirect_E;
    30343119begin
    3035   NotImplemented;
     3120  DoOutput(BC.Value, DE.E);
    30363121end;
    30373122
    30383123procedure TCpuZ80.ADC_HL_DE;
    30393124begin
    3040   NotImplemented;
     3125  AdcWord(HL.Value, DE.Value);
    30413126end;
    30423127
    30433128procedure TCpuZ80.LD_DE_NN_Indirect;
    30443129begin
    3045   NotImplemented;
     3130  DE.Value := DoReadWord(ReadWord);
    30463131end;
    30473132
    30483133procedure TCpuZ80.IM_2;
    30493134begin
    3050   NotImplemented;
     3135  InterruptMode := 2;
    30513136end;
    30523137
     
    30583143procedure TCpuZ80.IN_H_C_Indirect;
    30593144begin
    3060   NotImplemented;
     3145  HL.H := DoInput(BC.Value);
    30613146end;
    30623147
    30633148procedure TCpuZ80.OUT_C_Indirect_H;
    30643149begin
    3065   NotImplemented;
     3150  DoOutput(BC.Value, HL.H);
    30663151end;
    30673152
    30683153procedure TCpuZ80.SBC_HL_HL;
    30693154begin
    3070   NotImplemented;
     3155  SbcWord(HL.Value, HL.Value);
    30713156end;
    30723157
     
    30783163procedure TCpuZ80.IN_L_C_Indirect;
    30793164begin
    3080   NotImplemented;
     3165  HL.L := DoInput(BC.Value);
    30813166end;
    30823167
    30833168procedure TCpuZ80.OUT_C_Indirect_L;
    30843169begin
    3085   NotImplemented;
     3170  DoOutput(BC.Value, HL.L);
    30863171end;
    30873172
    30883173procedure TCpuZ80.ADC_HL_HL;
    30893174begin
    3090   NotImplemented;
     3175  AdcWord(HL.Value, HL.Value);
    30913176end;
    30923177
     
    30983183procedure TCpuZ80.SBC_HL_SP;
    30993184begin
    3100   NotImplemented;
     3185  SbcWord(HL.Value, SP);
    31013186end;
    31023187
    31033188procedure TCpuZ80.LD_NN_Indirect_SP;
    31043189begin
    3105   NotImplemented;
     3190  DoWriteWord(ReadWord, SP);
    31063191end;
    31073192
    31083193procedure TCpuZ80.IN_A_C_Indirect;
    31093194begin
    3110   NotImplemented;
     3195  A := DoInput(BC.Value);
    31113196end;
    31123197
    31133198procedure TCpuZ80.OUT_C_Indirect_A;
    31143199begin
    3115   NotImplemented;
     3200  DoOutput(BC.Value, A);
    31163201end;
    31173202
    31183203procedure TCpuZ80.ADC_HL_SP;
    31193204begin
    3120   NotImplemented;
     3205  AdcWord(Hl.Value, SP);
    31213206end;
    31223207
    31233208procedure TCpuZ80.LD_SP_NN_Indirect;
    31243209begin
    3125   NotImplemented;
     3210  SP := DoReadWord(ReadWord);
    31263211end;
    31273212
     
    51515236  Proc: TEvent;
    51525237begin
     5238  InstructionAddress := PC;
    51535239  Opcode := ReadByte;
    51545240  if Opcode = $CB then begin
     
    51695255  if Assigned(Proc) then Proc
    51705256  else begin
    5171     Dec(PC);
    5172     DoMessage('Unsupported instruction ' + IntToHex(Word(Instruction), 4) +
    5173       ' on address ' + IntToHex(Word(PC), 4));
    5174     Halt;
     5257    Error('Unsupported instruction ' + IntToHex(Word(Instruction), 4));
    51755258  end;
    51765259  Ticks := Cardinal(Ticks + 1);
  • trunk/mzxemu.lpi

    r6 r8  
    165165        <IsPartOfProject Value="True"/>
    166166      </Unit>
     167      <Unit>
     168        <Filename Value="I8253.pas"/>
     169        <IsPartOfProject Value="True"/>
     170      </Unit>
     171      <Unit>
     172        <Filename Value="I8255.pas"/>
     173        <IsPartOfProject Value="True"/>
     174      </Unit>
    167175    </Units>
    168176  </ProjectOptions>
  • trunk/mzxemu.lpr

    r6 r8  
    1313  Forms, FormMain, FormMemory, FormDisassembler, Z80, SharpMz800, Memory, Core,
    1414  Z80InstructionInfo, Z80Instructions, Disassembler, FormCpu, FormScreen,
    15   FormGoToAddress, FormMessages, Base, InstructionSetGen;
     15  FormGoToAddress, FormMessages, Base, InstructionSetGen, I8253, I8255;
    1616
    1717{$if declared(UseHeapTrace)}
Note: See TracChangeset for help on using the changeset viewer.