Changeset 9 for trunk/Z80/Z80.pas


Ignore:
Timestamp:
Apr 19, 2026, 10:27:31 PM (7 days ago)
Author:
chronos
Message:
  • Modified: More instructions implemented.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Z80/Z80.pas

    r8 r9  
    1414    Cpu: TCpuZ80;
    1515    procedure Execute; override;
     16  end;
     17
     18  TRegAF = record
     19    case Byte of
     20      0: (F, A: Byte);
     21      1: (Value: Word);
    1622  end;
    1723
     
    6874    procedure Cp(Data: Byte);
    6975    procedure Jr(Condition: Boolean);
    70     procedure Djnz;
    7176    procedure Jp(Condition: Boolean);
    7277    procedure RetCond(Condition: Boolean);
     
    8186    procedure XorByte(var Target: Byte; Second: Byte);
    8287    procedure OrByte(var Target: Byte; Second: Byte);
     88    procedure AndByte(var Target: Byte; Second: Byte);
     89    procedure IncByte(var Reg: Byte);
     90    procedure IncWord(var Reg: Word);
     91    procedure DecByte(var Reg: Byte);
     92    procedure DecWord(var Reg: Word);
     93    procedure RlcByte(var Data: Byte);
     94    procedure RrcByte(var Data: Byte);
    8395
    8496    // Instruction methods
     
    782794    procedure InitInstructions;
    783795  public
    784     A: Byte;
    785796    PC: Word;
    786797    SP: Word;
     798    AF: TRegAF;
    787799    BC: TRegBC;
    788800    DE: TRegDE;
    789801    HL: TRegHL;
     802    AF2: TRegAF;
     803    BC2: TRegBC;
     804    DE2: TRegDE;
     805    HL2: TRegHL;
     806    IX: Word;
     807    IY: Word;
     808    RegI: Byte;
     809    RegR: Byte;
    790810    Carry: Boolean;
    791811    Zero: Boolean;
     
    928948procedure TCpuZ80.Call(Address: Word);
    929949begin
     950  if DebugMode = dmStepOver then begin
     951    DebugStopAddress := PC;
     952    DebugMode := dmStopAddress;
     953  end;
    930954  PushWord(PC);
    931955  PC := Address;
     
    934958procedure TCpuZ80.CallCond(Address: Word; Condition: Boolean);
    935959begin
     960  if DebugMode = dmStepOver then begin
     961    DebugStopAddress := PC;
     962    DebugMode := dmStopAddress;
     963  end;
    936964  if Condition then begin
    937965    PushWord(PC);
     
    944972  TempByte: Byte;
    945973begin
    946   Carry := Data > A;
    947   TempByte := Byte(ShortInt(A) - ShortInt(Data));
     974  Carry := Data > AF.A;
     975  TempByte := Byte(ShortInt(AF.A) - ShortInt(Data));
    948976  Zero := TempByte = 0;
    949977end;
     
    955983  Temp := ShortInt(ReadByte);
    956984  if Condition then
    957     PC := PC + Temp;
    958 end;
    959 
    960 procedure TCpuZ80.Djnz;
    961 var
    962   Temp: ShortInt;
    963 begin
    964   Dec(BC.B);
    965   Temp := ShortInt(ReadByte);
    966   if BC.B <> 0 then
    967985    PC := PC + Temp;
    968986end;
     
    9941012procedure TCpuZ80.AddByte(var Target: Byte; Second: Byte);
    9951013begin
     1014  Target := Byte(Target + Second);
     1015end;
     1016
     1017procedure TCpuZ80.AddWord(var Target: Word; Second: Word);
     1018begin
     1019  Target := Word(Target + Second);
     1020end;
     1021
     1022procedure TCpuZ80.AdcByte(var Target: Byte; Second: Byte);
     1023begin
    9961024  Target := Target + Second;
    9971025end;
    9981026
    999 procedure TCpuZ80.AddWord(var Target: Word; Second: Word);
    1000 begin
    1001   Target := Target + Second;
    1002 end;
    1003 
    1004 procedure TCpuZ80.AdcByte(var Target: Byte; Second: Byte);
    1005 begin
    1006   Target := Target + Second;
    1007 end;
    1008 
    10091027procedure TCpuZ80.AdcWord(var Target: Word; Second: Word);
    10101028begin
     
    10141032procedure TCpuZ80.SubByte(var Target: Byte; Second: Byte);
    10151033begin
     1034  Target := Byte(Target - Second);
     1035end;
     1036
     1037procedure TCpuZ80.SbcByte(var Target: Byte; Second: Byte);
     1038begin
    10161039  Target := Target - Second;
    10171040end;
    10181041
    1019 procedure TCpuZ80.SbcByte(var Target: Byte; Second: Byte);
     1042procedure TCpuZ80.SbcWord(var Target: Word; Second: Word);
    10201043begin
    10211044  Target := Target - Second;
    10221045end;
    10231046
    1024 procedure TCpuZ80.SbcWord(var Target: Word; Second: Word);
    1025 begin
    1026   Target := Target - Second;
    1027 end;
    1028 
    10291047procedure TCpuZ80.XorByte(var Target: Byte; Second: Byte);
    10301048begin
     
    10351053begin
    10361054  Target := Target or Second;
     1055end;
     1056
     1057procedure TCpuZ80.AndByte(var Target: Byte; Second: Byte);
     1058begin
     1059  Target := Target and Second;
     1060end;
     1061
     1062procedure TCpuZ80.IncByte(var Reg: Byte);
     1063begin
     1064  if Reg = High(Reg) then Reg := 0
     1065    else Inc(Reg);
     1066end;
     1067
     1068procedure TCpuZ80.IncWord(var Reg: Word);
     1069begin
     1070  if Reg = High(Reg) then Reg := 0
     1071    else Inc(Reg);
     1072end;
     1073
     1074procedure TCpuZ80.DecByte(var Reg: Byte);
     1075begin
     1076  if Reg = 0 then Reg := High(Reg)
     1077    else Dec(Reg)
     1078end;
     1079
     1080procedure TCpuZ80.DecWord(var Reg: Word);
     1081begin
     1082  if Reg = 0 then Reg := High(Reg)
     1083    else Dec(Reg)
     1084end;
     1085
     1086procedure TCpuZ80.RlcByte(var Data: Byte);
     1087begin
     1088  Carry := (Data and $80) <> 0;
     1089  Data := (Data shl 1) or Byte(Carry);
     1090end;
     1091
     1092procedure TCpuZ80.RrcByte(var Data: Byte);
     1093begin
     1094  Carry := (Data and 1) > 0;
     1095  Data := (Data shr 1) or ($80 * Byte(Carry));
    10371096end;
    10381097
     
    17491808procedure TCpuZ80.LD_BC_Indirect_A;
    17501809begin
    1751   DoWrite(BC.Value, A);
     1810  DoWrite(BC.Value, AF.A);
    17521811end;
    17531812
    17541813procedure TCpuZ80.INC_BC;
    17551814begin
    1756   Inc(BC.Value);
     1815  IncWord(BC.Value);
    17571816end;
    17581817
    17591818procedure TCpuZ80.INC_B;
    17601819begin
    1761   Inc(BC.B);
     1820  IncByte(BC.B);
    17621821end;
    17631822
    17641823procedure TCpuZ80.DEC_B;
    17651824begin
     1825  DecByte(BC.B);
     1826end;
     1827
     1828procedure TCpuZ80.LD_B_N;
     1829begin
     1830  BC.B := ReadByte;
     1831end;
     1832
     1833procedure TCpuZ80.RLCA;
     1834begin
     1835  RlcByte(AF.A);
     1836end;
     1837
     1838procedure TCpuZ80.EX_AF_AF_Pair;
     1839var
     1840  Temp: Word;
     1841begin
     1842  Temp := AF.Value;
     1843  AF2.Value := AF.Value;
     1844  AF.Value := Temp;
     1845end;
     1846
     1847procedure TCpuZ80.ADD_HL_BC;
     1848begin
     1849  AddWord(HL.Value, BC.Value);
     1850end;
     1851
     1852procedure TCpuZ80.LD_A_BC_Indirect;
     1853begin
     1854  AF.A := DoRead(BC.Value);
     1855end;
     1856
     1857procedure TCpuZ80.DEC_BC;
     1858begin
     1859  DecWord(BC.Value);
     1860end;
     1861
     1862procedure TCpuZ80.INC_C;
     1863begin
     1864  IncByte(BC.C);
     1865end;
     1866
     1867procedure TCpuZ80.DEC_C;
     1868begin
     1869  DecByte(BC.C);
     1870end;
     1871
     1872procedure TCpuZ80.LD_C_N;
     1873begin
     1874  BC.C := ReadByte;
     1875end;
     1876
     1877procedure TCpuZ80.RRCA;
     1878begin
     1879  RrcByte(AF.A);
     1880end;
     1881
     1882procedure TCpuZ80.DJNZ_D;
     1883var
     1884  Temp: ShortInt;
     1885begin
    17661886  Dec(BC.B);
    1767 end;
    1768 
    1769 procedure TCpuZ80.LD_B_N;
    1770 begin
    1771   BC.B := ReadByte;
    1772 end;
    1773 
    1774 procedure TCpuZ80.RLCA;
    1775 begin
    1776   Carry := (A and $80) <> 0;
    1777   A := A shl 1;
    1778 end;
    1779 
    1780 procedure TCpuZ80.EX_AF_AF_Pair;
    1781 begin
    1782   NotImplemented;
    1783 end;
    1784 
    1785 procedure TCpuZ80.ADD_HL_BC;
    1786 begin
    1787   HL.Value := HL.Value + BC.Value;
    1788 end;
    1789 
    1790 procedure TCpuZ80.LD_A_BC_Indirect;
    1791 begin
    1792   A := DoRead(BC.Value);
    1793 end;
    1794 
    1795 procedure TCpuZ80.DEC_BC;
    1796 begin
    1797   Dec(BC.Value);
    1798 end;
    1799 
    1800 procedure TCpuZ80.INC_C;
    1801 begin
    1802   Inc(BC.C);
    1803 end;
    1804 
    1805 procedure TCpuZ80.DEC_C;
    1806 begin
    1807   Dec(BC.C);
    1808 end;
    1809 
    1810 procedure TCpuZ80.LD_C_N;
    1811 begin
    1812   BC.C := ReadByte;
    1813 end;
    1814 
    1815 procedure TCpuZ80.RRCA;
    1816 begin
    1817   NotImplemented;
    1818 end;
    1819 
    1820 procedure TCpuZ80.DJNZ_D;
    1821 begin
    1822   Djnz;
     1887  Temp := ShortInt(ReadByte);
     1888  if BC.B <> 0 then
     1889    PC := PC + Temp;
    18231890end;
    18241891
     
    18301897procedure TCpuZ80.LD_DE_Indirect_A;
    18311898begin
    1832   DoWrite(DE.Value, A);
     1899  DoWrite(DE.Value, AF.A);
    18331900end;
    18341901
    18351902procedure TCpuZ80.INC_DE;
    18361903begin
    1837   Inc(DE.Value);
     1904  IncWord(DE.Value);
    18381905end;
    18391906
    18401907procedure TCpuZ80.INC_D;
    18411908begin
    1842   Inc(DE.D);
     1909  IncByte(DE.D);
    18431910end;
    18441911
    18451912procedure TCpuZ80.DEC_D;
    18461913begin
    1847   Dec(DE.D);
     1914  DecByte(DE.D);
    18481915end;
    18491916
     
    18541921
    18551922procedure TCpuZ80.RLA;
    1856 begin
    1857   NotImplemented;
     1923var
     1924  NewCarry: Boolean;
     1925begin
     1926  NewCarry := (AF.A and $80) > 0;
     1927  AF.A := (AF.A shl 1) or Byte(Carry);
     1928  Carry := NewCarry;
    18581929end;
    18591930
     
    18701941procedure TCpuZ80.LD_A_DE_Indirect;
    18711942begin
    1872   A := DoRead(DE.Value);
     1943  AF.A := DoRead(DE.Value);
    18731944end;
    18741945
    18751946procedure TCpuZ80.DEC_DE;
    18761947begin
    1877   Dec(DE.Value);
     1948  DecWord(DE.Value);
    18781949end;
    18791950
    18801951procedure TCpuZ80.INC_E;
    18811952begin
    1882   Inc(DE.E);
     1953  IncByte(DE.E);
    18831954end;
    18841955
    18851956procedure TCpuZ80.DEC_E;
    18861957begin
    1887   Dec(DE.E);
     1958  DecByte(DE.E);
    18881959end;
    18891960
     
    18941965
    18951966procedure TCpuZ80.RRA;
    1896 begin
    1897   NotImplemented;
     1967var
     1968  NewCarry: Boolean;
     1969begin
     1970  NewCarry := (AF.A and 1) > 0;
     1971  AF.A := (AF.A shr 1) or ($80 * Byte(Carry));
     1972  Carry := NewCarry;
    18981973end;
    18991974
     
    19101985procedure TCpuZ80.LD_NN_Indirect_HL;
    19111986begin
    1912   DoWrite(ReadWord, HL.Value);
     1987  DoWriteWord(ReadWord, HL.Value);
    19131988end;
    19141989
    19151990procedure TCpuZ80.INC_HL;
    19161991begin
    1917   Inc(HL.Value);
     1992  IncWord(HL.Value);
    19181993end;
    19191994
    19201995procedure TCpuZ80.INC_H;
    19211996begin
    1922   Inc(HL.H);
     1997  IncByte(HL.H);
    19231998end;
    19241999
    19252000procedure TCpuZ80.DEC_H;
    19262001begin
    1927   Dec(HL.H);
     2002  DecByte(HL.H);
    19282003end;
    19292004
     
    19502025procedure TCpuZ80.LD_HL_NN_Indirect;
    19512026begin
    1952   HL.Value := DoRead(ReadWord);
     2027  HL.Value := DoReadWord(ReadWord);
    19532028end;
    19542029
    19552030procedure TCpuZ80.DEC_HL;
    19562031begin
    1957   Dec(HL.Value);
     2032  DecWord(HL.Value);
    19582033end;
    19592034
    19602035procedure TCpuZ80.INC_L;
    19612036begin
    1962   Inc(HL.L);
     2037  IncByte(HL.L);
    19632038end;
    19642039
    19652040procedure TCpuZ80.DEC_L;
    19662041begin
    1967   Dec(HL.L);
     2042  DecByte(HL.L);
    19682043end;
    19692044
     
    19752050procedure TCpuZ80.CPL;
    19762051begin
    1977   NotImplemented;
     2052  AF.A := AF.A xor $ff;
    19782053end;
    19792054
     
    19902065procedure TCpuZ80.LD_NN_Indirect_A;
    19912066begin
    1992   DoWrite(ReadWord, A);
     2067  DoWrite(ReadWord, AF.A);
    19932068end;
    19942069
    19952070procedure TCpuZ80.INC_SP;
    19962071begin
    1997   Inc(SP);
     2072  IncWord(SP);
    19982073end;
    19992074
    20002075procedure TCpuZ80.INC_HL_Indirect;
    2001 begin
    2002   DoWrite(HL.Value, DoRead(HL.Value) + 1);
     2076var
     2077  Temp: Byte;
     2078begin
     2079  Temp := DoRead(HL.Value);
     2080  IncByte(Temp);
     2081  DoWrite(HL.Value, Temp);
    20032082end;
    20042083
    20052084procedure TCpuZ80.DEC_HL_Indirect;
    2006 begin
    2007   DoWrite(HL.Value, DoRead(HL.Value) - 1);
     2085var
     2086  Temp: Byte;
     2087begin
     2088  Temp := DoRead(HL.Value);
     2089  DecByte(Temp);
     2090  DoWrite(HL.Value, Temp);
    20082091end;
    20092092
     
    20152098procedure TCpuZ80.SCF;
    20162099begin
    2017   NotImplemented;
     2100  Carry := True;
    20182101end;
    20192102
     
    20302113procedure TCpuZ80.LD_A_NN_Indirect;
    20312114begin
    2032   A := DoRead(ReadWord);
     2115  AF.A := DoRead(ReadWord);
    20332116end;
    20342117
    20352118procedure TCpuZ80.DEC_SP;
    20362119begin
    2037   Dec(SP);
     2120  DecWord(SP);
    20382121end;
    20392122
    20402123procedure TCpuZ80.INC_A;
    20412124begin
    2042   Inc(A);
     2125  IncByte(AF.A);
    20432126end;
    20442127
    20452128procedure TCpuZ80.DEC_A;
    20462129begin
    2047   Dec(A);
     2130  DecByte(AF.A);
    20482131end;
    20492132
    20502133procedure TCpuZ80.LD_A_N;
    20512134begin
    2052   A := ReadByte;
     2135  AF.A := ReadByte;
    20532136end;
    20542137
     
    20952178procedure TCpuZ80.LD_B_A;
    20962179begin
    2097   BC.B := A;
     2180  BC.B := AF.A;
    20982181end;
    20992182
     
    21352218procedure TCpuZ80.LD_C_A;
    21362219begin
    2137   BC.C := A;
     2220  BC.C := AF.A;
    21382221end;
    21392222
     
    21752258procedure TCpuZ80.LD_D_A;
    21762259begin
    2177   DE.D := A;
     2260  DE.D := AF.A;
    21782261end;
    21792262
     
    22152298procedure TCpuZ80.LD_E_A;
    22162299begin
    2217   DE.E := A;
     2300  DE.E := AF.A;
    22182301end;
    22192302
     
    22552338procedure TCpuZ80.LD_H_A;
    22562339begin
    2257   HL.H := A;
     2340  HL.H := AF.A;
    22582341end;
    22592342
     
    22952378procedure TCpuZ80.LD_L_A;
    22962379begin
    2297   HL.L := A;
     2380  HL.L := AF.A;
    22982381end;
    22992382
     
    23352418procedure TCpuZ80.LD_HL_Indirect_A;
    23362419begin
    2337   DoWrite(HL.Value, A);
     2420  DoWrite(HL.Value, AF.A);
    23382421end;
    23392422
    23402423procedure TCpuZ80.LD_A_B;
    23412424begin
    2342   A := BC.B;
     2425  AF.A := BC.B;
    23432426end;
    23442427
    23452428procedure TCpuZ80.LD_A_C;
    23462429begin
    2347   A := BC.C;
     2430  AF.A := BC.C;
    23482431end;
    23492432
    23502433procedure TCpuZ80.LD_A_D;
    23512434begin
    2352   A := DE.D;
     2435  AF.A := DE.D;
    23532436end;
    23542437
    23552438procedure TCpuZ80.LD_A_E;
    23562439begin
    2357   A := DE.E;
     2440  AF.A := DE.E;
    23582441end;
    23592442
    23602443procedure TCpuZ80.LD_A_H;
    23612444begin
    2362   A := HL.H;
     2445  AF.A := HL.H;
    23632446end;
    23642447
    23652448procedure TCpuZ80.LD_A_L;
    23662449begin
    2367   A := HL.L;
     2450  AF.A := HL.L;
    23682451end;
    23692452
    23702453procedure TCpuZ80.LD_A_HL_Indirect;
    23712454begin
    2372   A := DoRead(HL.Value);
     2455  AF.A := DoRead(HL.Value);
    23732456end;
    23742457
    23752458procedure TCpuZ80.LD_A_A;
    23762459begin
    2377   A := A;
     2460  AF.A := AF.A;
    23782461end;
    23792462
    23802463procedure TCpuZ80.ADD_A_B;
    23812464begin
    2382   AddByte(A, BC.B);
     2465  AddByte(AF.A, BC.B);
    23832466end;
    23842467
    23852468procedure TCpuZ80.ADD_A_C;
    23862469begin
    2387   AddByte(A, BC.C);
     2470  AddByte(AF.A, BC.C);
    23882471end;
    23892472
    23902473procedure TCpuZ80.ADD_A_D;
    23912474begin
    2392   AddByte(A, DE.D);
     2475  AddByte(AF.A, DE.D);
    23932476end;
    23942477
    23952478procedure TCpuZ80.ADD_A_E;
    23962479begin
    2397   AddByte(A, DE.E);
     2480  AddByte(AF.A, DE.E);
    23982481end;
    23992482
    24002483procedure TCpuZ80.ADD_A_H;
    24012484begin
    2402   AddByte(A, HL.H);
     2485  AddByte(AF.A, HL.H);
    24032486end;
    24042487
    24052488procedure TCpuZ80.ADD_A_L;
    24062489begin
    2407   AddByte(A, HL.L);
     2490  AddByte(AF.A, HL.L);
    24082491end;
    24092492
    24102493procedure TCpuZ80.ADD_A_HL_Indirect;
    24112494begin
    2412   AddByte(A, DoRead(HL.Value));
     2495  AddByte(AF.A, DoRead(HL.Value));
    24132496end;
    24142497
    24152498procedure TCpuZ80.ADD_A_A;
    24162499begin
    2417   AddByte(A, A);
     2500  AddByte(AF.A, AF.A);
    24182501end;
    24192502
    24202503procedure TCpuZ80.ADC_A_B;
    24212504begin
    2422   AdcByte(A, BC.B);
     2505  AdcByte(AF.A, BC.B);
    24232506end;
    24242507
    24252508procedure TCpuZ80.ADC_A_C;
    24262509begin
    2427   AdcByte(A, BC.C);
     2510  AdcByte(AF.A, BC.C);
    24282511end;
    24292512
    24302513procedure TCpuZ80.ADC_A_D;
    24312514begin
    2432   AdcByte(A, DE.D);
     2515  AdcByte(AF.A, DE.D);
    24332516end;
    24342517
    24352518procedure TCpuZ80.ADC_A_E;
    24362519begin
    2437   AdcByte(A, DE.E);
     2520  AdcByte(AF.A, DE.E);
    24382521end;
    24392522
    24402523procedure TCpuZ80.ADC_A_H;
    24412524begin
    2442   AdcByte(A, HL.H);
     2525  AdcByte(AF.A, HL.H);
    24432526end;
    24442527
    24452528procedure TCpuZ80.ADC_A_L;
    24462529begin
    2447   AdcByte(A, HL.L);
     2530  AdcByte(AF.A, HL.L);
    24482531end;
    24492532
    24502533procedure TCpuZ80.ADC_A_HL_Indirect;
    24512534begin
    2452   AdcByte(A, DoRead(HL.Value));
     2535  AdcByte(AF.A, DoRead(HL.Value));
    24532536end;
    24542537
    24552538procedure TCpuZ80.ADC_A_A;
    24562539begin
    2457   AdcByte(A, A);
     2540  AdcByte(AF.A, AF.A);
    24582541end;
    24592542
    24602543procedure TCpuZ80.SUB_B;
    24612544begin
    2462   SubByte(A, BC.B);
     2545  SubByte(AF.A, BC.B);
    24632546end;
    24642547
    24652548procedure TCpuZ80.SUB_C;
    24662549begin
    2467   SubByte(A, BC.C);
     2550  SubByte(AF.A, BC.C);
    24682551end;
    24692552
    24702553procedure TCpuZ80.SUB_D;
    24712554begin
    2472   SubByte(A, DE.D);
     2555  SubByte(AF.A, DE.D);
    24732556end;
    24742557
    24752558procedure TCpuZ80.SUB_E;
    24762559begin
    2477   SubByte(A, DE.E);
     2560  SubByte(AF.A, DE.E);
    24782561end;
    24792562
    24802563procedure TCpuZ80.SUB_H;
    24812564begin
    2482   SubByte(A, HL.H);
     2565  SubByte(AF.A, HL.H);
    24832566end;
    24842567
    24852568procedure TCpuZ80.SUB_L;
    24862569begin
    2487   SubByte(A, HL.L);
     2570  SubByte(AF.A, HL.L);
    24882571end;
    24892572
    24902573procedure TCpuZ80.SUB_HL_Indirect;
    24912574begin
    2492   SubByte(A, DoRead(HL.Value));
     2575  SubByte(AF.A, DoRead(HL.Value));
    24932576end;
    24942577
    24952578procedure TCpuZ80.SUB_A;
    24962579begin
    2497   SubByte(A, A);
     2580  SubByte(AF.A, AF.A);
    24982581end;
    24992582
    25002583procedure TCpuZ80.SBC_A_B;
    25012584begin
    2502   SbcByte(A, BC.B);
     2585  SbcByte(AF.A, BC.B);
    25032586end;
    25042587
    25052588procedure TCpuZ80.SBC_A_C;
    25062589begin
    2507   SbcByte(A, BC.C);
     2590  SbcByte(AF.A, BC.C);
    25082591end;
    25092592
    25102593procedure TCpuZ80.SBC_A_D;
    25112594begin
    2512   SbcByte(A, DE.D);
     2595  SbcByte(AF.A, DE.D);
    25132596end;
    25142597
    25152598procedure TCpuZ80.SBC_A_E;
    25162599begin
    2517   SbcByte(A, DE.E);
     2600  SbcByte(AF.A, DE.E);
    25182601end;
    25192602
    25202603procedure TCpuZ80.SBC_A_H;
    25212604begin
    2522   SbcByte(A, HL.H);
     2605  SbcByte(AF.A, HL.H);
    25232606end;
    25242607
    25252608procedure TCpuZ80.SBC_A_L;
    25262609begin
    2527   SbcByte(A, HL.L);
     2610  SbcByte(AF.A, HL.L);
    25282611end;
    25292612
    25302613procedure TCpuZ80.SBC_A_HL_Indirect;
    25312614begin
    2532   SbcByte(A, DoRead(HL.Value));
     2615  SbcByte(AF.A, DoRead(HL.Value));
    25332616end;
    25342617
    25352618procedure TCpuZ80.SBC_A_A;
    25362619begin
    2537   SbcByte(A, A);
     2620  SbcByte(AF.A, AF.A);
    25382621end;
    25392622
    25402623procedure TCpuZ80.AND_B;
    25412624begin
    2542   NotImplemented;
     2625  AndByte(AF.A, BC.B);
    25432626end;
    25442627
    25452628procedure TCpuZ80.AND_C;
    25462629begin
    2547   NotImplemented;
     2630  AndByte(AF.A, BC.C);
    25482631end;
    25492632
    25502633procedure TCpuZ80.AND_D;
    25512634begin
    2552   NotImplemented;
     2635  AndByte(AF.A, DE.D);
    25532636end;
    25542637
    25552638procedure TCpuZ80.AND_E;
    25562639begin
    2557   NotImplemented;
     2640  AndByte(AF.A, DE.E);
    25582641end;
    25592642
    25602643procedure TCpuZ80.AND_H;
    25612644begin
    2562   NotImplemented;
     2645  AndByte(AF.A, HL.H);
    25632646end;
    25642647
    25652648procedure TCpuZ80.AND_L;
    25662649begin
    2567   NotImplemented;
     2650  AndByte(AF.A, HL.L);
    25682651end;
    25692652
    25702653procedure TCpuZ80.AND_HL_Indirect;
    25712654begin
    2572   NotImplemented;
     2655  AndByte(AF.A, DoRead(HL.Value));
    25732656end;
    25742657
    25752658procedure TCpuZ80.AND_A;
    25762659begin
    2577   NotImplemented;
     2660  AndByte(AF.A, AF.A);
    25782661end;
    25792662
    25802663procedure TCpuZ80.XOR_B;
    25812664begin
    2582   A := A xor BC.B;
     2665  XorByte(AF.A, BC.B);
    25832666end;
    25842667
    25852668procedure TCpuZ80.XOR_C;
    25862669begin
    2587   A := A xor BC.C;
     2670  XorByte(AF.A, BC.C);
    25882671end;
    25892672
    25902673procedure TCpuZ80.XOR_D;
    25912674begin
    2592   A := A xor DE.D;
     2675  XorByte(AF.A, DE.D);
    25932676end;
    25942677
    25952678procedure TCpuZ80.XOR_E;
    25962679begin
    2597   A := A xor DE.E;
     2680  XorByte(AF.A, DE.E);
    25982681end;
    25992682
    26002683procedure TCpuZ80.XOR_H;
    26012684begin
    2602   A := A xor HL.H;
     2685  XorByte(AF.A, HL.H);
    26032686end;
    26042687
    26052688procedure TCpuZ80.XOR_L;
    26062689begin
    2607   A := A xor HL.L;
     2690  XorByte(AF.A, HL.L);
    26082691end;
    26092692
    26102693procedure TCpuZ80.XOR_HL_Indirect;
    26112694begin
    2612   A := A xor DoRead(HL.Value);
     2695  XorByte(AF.A, DoRead(HL.Value));
    26132696end;
    26142697
    26152698procedure TCpuZ80.XOR_A;
    26162699begin
    2617   A := A xor A;
     2700  XorByte(AF.A, AF.A);
    26182701end;
    26192702
    26202703procedure TCpuZ80.OR_B;
    26212704begin
    2622   A := A or BC.B;
     2705  OrByte(AF.A, BC.B);
    26232706end;
    26242707
    26252708procedure TCpuZ80.OR_C;
    26262709begin
    2627   A := A or BC.C;
     2710  OrByte(AF.A, BC.C);
    26282711end;
    26292712
    26302713procedure TCpuZ80.OR_D;
    26312714begin
    2632   A := A or DE.D;
     2715  OrByte(AF.A, DE.D);
    26332716end;
    26342717
    26352718procedure TCpuZ80.OR_E;
    26362719begin
    2637   A := A or DE.E;
     2720  OrByte(AF.A, DE.E);
    26382721end;
    26392722
    26402723procedure TCpuZ80.OR_H;
    26412724begin
    2642   A := A or HL.H;
     2725  OrByte(AF.A, HL.H);
    26432726end;
    26442727
    26452728procedure TCpuZ80.OR_L;
    26462729begin
    2647   A := A or HL.L;
     2730  OrByte(AF.A, HL.L);
    26482731end;
    26492732
    26502733procedure TCpuZ80.OR_HL_Indirect;
    26512734begin
    2652   A := A or DoRead(HL.Value);
     2735  OrByte(AF.A, DoRead(HL.Value));
    26532736end;
    26542737
    26552738procedure TCpuZ80.OR_A;
    26562739begin
    2657   A := A or A;
     2740  OrByte(AF.A, AF.A);
    26582741end;
    26592742
     
    26952778procedure TCpuZ80.CP_A;
    26962779begin
    2697   CP(A);
     2780  CP(AF.A);
    26982781end;
    26992782
     
    27302813procedure TCpuZ80.ADD_A_N;
    27312814begin
    2732   AddByte(A, ReadByte);
     2815  AddByte(AF.A, ReadByte);
    27332816end;
    27342817
     
    27592842
    27602843procedure TCpuZ80.CALL_NN;
     2844begin
     2845  Call(ReadWord);
     2846end;
     2847
     2848procedure TCpuZ80.ADC_A_N;
     2849begin
     2850  AdcByte(AF.A, ReadByte);
     2851end;
     2852
     2853procedure TCpuZ80.RST_08H;
     2854begin
     2855  Call($08);
     2856end;
     2857
     2858procedure TCpuZ80.RET_NC;
     2859begin
     2860  RetCond(not Carry);
     2861end;
     2862
     2863procedure TCpuZ80.POP_DE;
     2864begin
     2865  DE.Value := PopWord;
     2866end;
     2867
     2868procedure TCpuZ80.JP_NC_NN;
     2869begin
     2870  Jp(not Carry);
     2871end;
     2872
     2873procedure TCpuZ80.OUT_N_Indirect_A;
     2874begin
     2875  DoOutput(ReadByte, AF.A);
     2876end;
     2877
     2878procedure TCpuZ80.CALL_NC_NN;
     2879begin
     2880  CallCond(ReadWord, not Carry);
     2881end;
     2882
     2883procedure TCpuZ80.PUSH_DE;
     2884begin
     2885  PushWord(DE.Value);
     2886end;
     2887
     2888procedure TCpuZ80.SUB_N;
     2889begin
     2890  SubByte(AF.A, ReadByte);
     2891end;
     2892
     2893procedure TCpuZ80.RST_10H;
     2894begin
     2895  Call($10);
     2896end;
     2897
     2898procedure TCpuZ80.RET_C;
     2899begin
     2900  RetCond(Carry);
     2901end;
     2902
     2903procedure TCpuZ80.EXX;
    27612904var
    2762   TempWord: Word;
    2763 begin
    2764   TempWord := ReadWord;
    2765   if DebugMode = dmStepOver then begin
    2766     DebugStopAddress := PC;
    2767     DebugMode := dmStopAddress;
    2768   end;
    2769   Call(TempWord);
    2770 end;
    2771 
    2772 procedure TCpuZ80.ADC_A_N;
    2773 begin
    2774   AdcByte(A, ReadByte);
    2775 end;
    2776 
    2777 procedure TCpuZ80.RST_08H;
    2778 begin
    2779   Call($08);
    2780 end;
    2781 
    2782 procedure TCpuZ80.RET_NC;
    2783 begin
    2784   RetCond(not Carry);
    2785 end;
    2786 
    2787 procedure TCpuZ80.POP_DE;
    2788 begin
    2789   DE.Value := PopWord;
    2790 end;
    2791 
    2792 procedure TCpuZ80.JP_NC_NN;
    2793 begin
    2794   Jp(not Carry);
    2795 end;
    2796 
    2797 procedure TCpuZ80.OUT_N_Indirect_A;
    2798 begin
    2799   DoOutput(ReadByte, A);
    2800 end;
    2801 
    2802 procedure TCpuZ80.CALL_NC_NN;
    2803 begin
    2804   CallCond(ReadWord, not Carry);
    2805 end;
    2806 
    2807 procedure TCpuZ80.PUSH_DE;
    2808 begin
    2809   PushWord(DE.Value);
    2810 end;
    2811 
    2812 procedure TCpuZ80.SUB_N;
    2813 begin
    2814   SubByte(A, ReadByte);
    2815 end;
    2816 
    2817 procedure TCpuZ80.RST_10H;
    2818 begin
    2819   Call($10);
    2820 end;
    2821 
    2822 procedure TCpuZ80.RET_C;
    2823 begin
    2824   RetCond(Carry);
    2825 end;
    2826 
    2827 procedure TCpuZ80.EXX;
    2828 begin
    2829   NotImplemented;
     2905  Temp: Word;
     2906begin
     2907  Temp := BC.Value;
     2908  BC.Value := BC2.Value;
     2909  BC2.Value := Temp;
     2910  Temp := DE.Value;
     2911  DE2.Value := DE2.Value;
     2912  DE2.Value := Temp;
     2913  Temp := HL.Value;
     2914  HL.Value := HL2.Value;
     2915  HL2.Value := Temp;
    28302916end;
    28312917
     
    28372923procedure TCpuZ80.IN_A_N_Indirect;
    28382924begin
    2839   NotImplemented;
     2925  AF.A := DoInput((AF.A shl 8) or ReadByte);
    28402926end;
    28412927
     
    28472933procedure TCpuZ80.SBC_A_N;
    28482934begin
    2849   SbcByte(A, ReadByte);
     2935  SbcByte(AF.A, ReadByte);
    28502936end;
    28512937
     
    28672953procedure TCpuZ80.JP_PO_NN;
    28682954begin
    2869   NotImplemented;
     2955  Jp(not ParityOverflow);
    28702956end;
    28712957
    28722958procedure TCpuZ80.EX_SP_Indirect_HL;
    2873 begin
    2874   NotImplemented;
     2959var
     2960  Temp: Word;
     2961begin
     2962  Temp := HL.Value;
     2963  HL.Value := DoReadWord(SP);
     2964  DoWriteWord(SP, Temp);
    28752965end;
    28762966
    28772967procedure TCpuZ80.CALL_PO_NN;
    28782968begin
    2879   NotImplemented;
     2969  CallCond(ReadWord, not ParityOverflow);
    28802970end;
    28812971
     
    28872977procedure TCpuZ80.AND_N;
    28882978begin
    2889   A := A and ReadByte;
     2979  AndByte(AF.A, ReadByte);
    28902980end;
    28912981
     
    28972987procedure TCpuZ80.RET_PE;
    28982988begin
    2899   NotImplemented;
     2989  RetCond(ParityOverflow);
    29002990end;
    29012991
     
    29072997procedure TCpuZ80.JP_PE_NN;
    29082998begin
    2909   NotImplemented;
     2999  Jp(ParityOverflow);
    29103000end;
    29113001
     
    29213011procedure TCpuZ80.CALL_PE_NN;
    29223012begin
    2923   NotImplemented;
     3013  CallCond(ReadWord, ParityOverflow);
    29243014end;
    29253015
    29263016procedure TCpuZ80.XOR_N;
    29273017begin
    2928   XorByte(A, ReadByte);
     3018  XorByte(AF.A, ReadByte);
    29293019end;
    29303020
     
    29363026procedure TCpuZ80.RET_P;
    29373027begin
    2938   NotImplemented;
     3028  RetCond(not SignNegative);
    29393029end;
    29403030
    29413031procedure TCpuZ80.POP_AF;
    29423032begin
    2943   A := PopWord and $ff;
     3033  AF.Value := PopWord;
    29443034end;
    29453035
    29463036procedure TCpuZ80.JP_P_NN;
    29473037begin
    2948   NotImplemented;
     3038  Jp(not SignNegative);
    29493039end;
    29503040
     
    29563046procedure TCpuZ80.CALL_P_NN;
    29573047begin
    2958   NotImplemented;
     3048  CallCond(ReadWord, not SignNegative);
    29593049end;
    29603050
    29613051procedure TCpuZ80.PUSH_AF;
    29623052begin
    2963   PushWord(A shl 8);
     3053  PushWord(AF.Value);
    29643054end;
    29653055
    29663056procedure TCpuZ80.OR_N;
    29673057begin
    2968   OrByte(A, ReadByte);
     3058  OrByte(AF.A, ReadByte);
    29693059end;
    29703060
     
    29763066procedure TCpuZ80.RET_M;
    29773067begin
    2978   NotImplemented;
     3068  RetCond(SignNegative);
    29793069end;
    29803070
     
    29863076procedure TCpuZ80.JP_M_NN;
    29873077begin
    2988   NotImplemented;
     3078  Jp(SignNegative);
    29893079end;
    29903080
     
    29963086procedure TCpuZ80.CALL_M_NN;
    29973087begin
    2998   NotImplemented;
     3088  CallCond(ReadWord, SignNegative);
    29993089end;
    30003090
     
    30313121procedure TCpuZ80.NEG;
    30323122begin
    3033   NotImplemented;
     3123  AF.A := AF.A xor $ff;
     3124  IncByte(AF.A);
    30343125end;
    30353126
     
    30473138procedure TCpuZ80.LD_I_A;
    30483139begin
    3049   NotImplemented;
     3140  RegI := AF.A;
    30503141end;
    30513142
    30523143procedure TCpuZ80.IN_C_C_Indirect;
    30533144begin
    3054   NotImplemented;
     3145  BC.C := DoInput(BC.Value);
    30553146end;
    30563147
    30573148procedure TCpuZ80.OUT_C_Indirect_C;
    30583149begin
    3059   NotImplemented;
     3150  DoOutput(BC.Value, BC.C);
    30603151end;
    30613152
    30623153procedure TCpuZ80.ADC_HL_BC;
    30633154begin
    3064   NotImplemented;
     3155  AdcWord(HL.Value, BC.Value);
    30653156end;
    30663157
    30673158procedure TCpuZ80.LD_BC_NN_Indirect;
    30683159begin
    3069   NotImplemented;
     3160  BC.Value := DoReadWord(ReadWord);
    30703161end;
    30713162
     
    30783169procedure TCpuZ80.LD_R_A;
    30793170begin
    3080   NotImplemented;
     3171  RegR := AF.A;
    30813172end;
    30823173
    30833174procedure TCpuZ80.IN_D_C_Indirect;
    30843175begin
    3085   NotImplemented;
     3176  DE.D := DoInput(BC.Value);
    30863177end;
    30873178
     
    31083199procedure TCpuZ80.LD_A_I;
    31093200begin
    3110   NotImplemented;
     3201  AF.A := RegI;
    31113202end;
    31123203
     
    31383229procedure TCpuZ80.LD_A_R;
    31393230begin
    3140   NotImplemented;
     3231  AF.A := RegR;
    31413232end;
    31423233
     
    31933284procedure TCpuZ80.IN_A_C_Indirect;
    31943285begin
    3195   A := DoInput(BC.Value);
     3286  AF.A := DoInput(BC.Value);
    31963287end;
    31973288
    31983289procedure TCpuZ80.OUT_C_Indirect_A;
    31993290begin
    3200   DoOutput(BC.Value, A);
     3291  DoOutput(BC.Value, AF.A);
    32013292end;
    32023293
     
    32133304procedure TCpuZ80.LDI;
    32143305begin
    3215   NotImplemented;
     3306  DoWrite(DE.Value, DoRead(HL.Value));
     3307  IncWord(HL.Value);
     3308  IncWord(DE.Value);
     3309  DecWord(BC.Value);
    32163310end;
    32173311
    32183312procedure TCpuZ80.CPI;
    32193313begin
    3220   NotImplemented;
     3314  Cp(DoRead(HL.Value));
     3315  IncWord(HL.Value);
     3316  DecWord(BC.Value);
    32213317end;
    32223318
    32233319procedure TCpuZ80.INI;
    32243320begin
    3225   NotImplemented;
     3321  DoWrite(HL.Value, DoInput(BC.Value));
     3322  DecByte(BC.B);
     3323  IncWord(HL.Value);
    32263324end;
    32273325
    32283326procedure TCpuZ80.OUTI;
    32293327begin
    3230   NotImplemented;
     3328  DoOutput(BC.Value, DoRead(HL.Value));
     3329  DecByte(BC.B);
     3330  IncWord(HL.Value);
    32313331end;
    32323332
    32333333procedure TCpuZ80.LDD;
    32343334begin
    3235   NotImplemented;
     3335  DoWrite(DE.Value, DoRead(HL.Value));
     3336  DecWord(HL.Value);
     3337  DecWord(DE.Value);
     3338  DecWord(BC.Value);
    32363339end;
    32373340
    32383341procedure TCpuZ80.CPD;
    32393342begin
    3240   NotImplemented;
     3343  Cp(DoRead(HL.Value));
     3344  DecWord(HL.Value);
     3345  DecWord(BC.Value);
    32413346end;
    32423347
    32433348procedure TCpuZ80.IND;
    32443349begin
    3245   NotImplemented;
     3350  DoWrite(HL.Value, DoInput(BC.Value));
     3351  DecByte(BC.B);
     3352  DecWord(HL.Value);
    32463353end;
    32473354
    32483355procedure TCpuZ80.OUTD;
    32493356begin
    3250   NotImplemented;
     3357  DoOutput(BC.Value, DoRead(HL.Value));
     3358  DecByte(BC.B);
     3359  DecWord(HL.Value);
    32513360end;
    32523361
    32533362procedure TCpuZ80.LDIR;
    32543363begin
    3255   NotImplemented;
     3364  repeat
     3365    LDI;
     3366  until BC.Value = 0;
    32563367end;
    32573368
    32583369procedure TCpuZ80.CPIR;
    32593370begin
    3260   NotImplemented;
     3371  repeat
     3372    CPI;
     3373  until (BC.Value = 0) or Zero;
    32613374end;
    32623375
    32633376procedure TCpuZ80.INIR;
    32643377begin
    3265   NotImplemented;
     3378  repeat
     3379    INI;
     3380  until (BC.B = 0);
    32663381end;
    32673382
    32683383procedure TCpuZ80.OTIR;
    32693384begin
    3270   NotImplemented;
     3385  repeat
     3386    OUTI;
     3387  until BC.B = 0;
    32713388end;
    32723389
    32733390procedure TCpuZ80.LDDR;
    32743391begin
    3275   NotImplemented;
     3392  repeat
     3393    LDD;
     3394  until BC.Value = 0;
    32763395end;
    32773396
    32783397procedure TCpuZ80.CPDR;
    32793398begin
    3280   NotImplemented;
     3399  repeat
     3400    CPD;
     3401  until (BC.Value = 0) or Zero;
    32813402end;
    32823403
    32833404procedure TCpuZ80.INDR;
    32843405begin
    3285   NotImplemented;
     3406  repeat
     3407    IND;
     3408  until (BC.B = 0);
    32863409end;
    32873410
    32883411procedure TCpuZ80.OTDR;
    32893412begin
    3290   NotImplemented;
     3413  repeat
     3414    OUTD;
     3415  until BC.B = 0;
    32913416end;
    32923417
    32933418procedure TCpuZ80.RLC_B;
    32943419begin
    3295   NotImplemented;
     3420  RlcByte(BC.B);
    32963421end;
    32973422
    32983423procedure TCpuZ80.RLC_C;
    32993424begin
    3300   NotImplemented;
     3425  RlcByte(BC.C);
    33013426end;
    33023427
    33033428procedure TCpuZ80.RLC_D;
    33043429begin
    3305   NotImplemented;
     3430  RlcByte(DE.D);
    33063431end;
    33073432
    33083433procedure TCpuZ80.RLC_E;
    33093434begin
    3310   NotImplemented;
     3435  RlcByte(DE.E);
    33113436end;
    33123437
    33133438procedure TCpuZ80.RLC_H;
    33143439begin
    3315   NotImplemented;
     3440  RlcByte(HL.H);
    33163441end;
    33173442
    33183443procedure TCpuZ80.RLC_L;
    33193444begin
    3320   NotImplemented;
     3445  RlcByte(HL.L);
    33213446end;
    33223447
    33233448procedure TCpuZ80.RLC_HL_Indirect;
    3324 begin
    3325   NotImplemented;
     3449var
     3450  Temp: Byte;
     3451begin
     3452  Temp := DoRead(HL.Value);
     3453  RlcByte(Temp);
     3454  DoWrite(HL.Value, Temp);
    33263455end;
    33273456
    33283457procedure TCpuZ80.RLC_A;
    33293458begin
    3330   NotImplemented;
     3459  RlcByte(AF.A);
    33313460end;
    33323461
    33333462procedure TCpuZ80.RRC_B;
    33343463begin
    3335   NotImplemented;
     3464  RrcByte(BC.B);
    33363465end;
    33373466
    33383467procedure TCpuZ80.RRC_C;
    33393468begin
    3340   NotImplemented;
     3469  RrcByte(BC.C);
    33413470end;
    33423471
    33433472procedure TCpuZ80.RRC_D;
    33443473begin
    3345   NotImplemented;
     3474  RrcByte(DE.D);
    33463475end;
    33473476
    33483477procedure TCpuZ80.RRC_E;
    33493478begin
    3350   NotImplemented;
     3479  RrcByte(DE.E);
    33513480end;
    33523481
    33533482procedure TCpuZ80.RRC_H;
    33543483begin
    3355   NotImplemented;
     3484  RrcByte(HL.H);
    33563485end;
    33573486
    33583487procedure TCpuZ80.RRC_L;
    33593488begin
    3360   NotImplemented;
     3489  RrcByte(HL.L);
    33613490end;
    33623491
    33633492procedure TCpuZ80.RRC_HL_Indirect;
    3364 begin
    3365   NotImplemented;
     3493var
     3494  Temp: Byte;
     3495begin
     3496  Temp := DoRead(HL.Value);
     3497  RrcByte(Temp);
     3498  DoWrite(HL.Value, Temp);
    33663499end;
    33673500
    33683501procedure TCpuZ80.RRC_A;
    33693502begin
    3370   NotImplemented;
     3503  RrcByte(AF.A);
    33713504end;
    33723505
     
    45384671procedure TCpuZ80.ADD_IX_DE;
    45394672begin
    4540   NotImplemented;
     4673  AddWord(IX, DE.Value);
    45414674end;
    45424675
    45434676procedure TCpuZ80.LD_IX_NN;
    45444677begin
    4545   NotImplemented;
     4678  IX := ReadWord;
    45464679end;
    45474680
     
    45534686procedure TCpuZ80.INC_IX;
    45544687begin
    4555   NotImplemented;
     4688  IncWord(IX);
    45564689end;
    45574690
    45584691procedure TCpuZ80.ADD_IX_IX;
    45594692begin
    4560   NotImplemented;
     4693  AddWord(IX, IX);
    45614694end;
    45624695
     
    52625395procedure TCpuZ80.Reset;
    52635396begin
    5264   A := 0;
    52655397  PC := 0;
     5398  AF.Value := 0;
    52665399  BC.Value := 0;
    52675400  DE.Value := 0;
    52685401  HL.Value := 0;
    52695402  SP := 0;
    5270   Carry := False;
    5271   Zero := False;
    52725403  InterruptEnabled := True;
    52735404  InterruptMode := 0;
Note: See TracChangeset for help on using the changeset viewer.