Changeset 9 for trunk/Z80/Z80.pas
- Timestamp:
- Apr 19, 2026, 10:27:31 PM (7 days ago)
- File:
-
- 1 edited
-
trunk/Z80/Z80.pas (modified) (54 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Z80/Z80.pas
r8 r9 14 14 Cpu: TCpuZ80; 15 15 procedure Execute; override; 16 end; 17 18 TRegAF = record 19 case Byte of 20 0: (F, A: Byte); 21 1: (Value: Word); 16 22 end; 17 23 … … 68 74 procedure Cp(Data: Byte); 69 75 procedure Jr(Condition: Boolean); 70 procedure Djnz;71 76 procedure Jp(Condition: Boolean); 72 77 procedure RetCond(Condition: Boolean); … … 81 86 procedure XorByte(var Target: Byte; Second: Byte); 82 87 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); 83 95 84 96 // Instruction methods … … 782 794 procedure InitInstructions; 783 795 public 784 A: Byte;785 796 PC: Word; 786 797 SP: Word; 798 AF: TRegAF; 787 799 BC: TRegBC; 788 800 DE: TRegDE; 789 801 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; 790 810 Carry: Boolean; 791 811 Zero: Boolean; … … 928 948 procedure TCpuZ80.Call(Address: Word); 929 949 begin 950 if DebugMode = dmStepOver then begin 951 DebugStopAddress := PC; 952 DebugMode := dmStopAddress; 953 end; 930 954 PushWord(PC); 931 955 PC := Address; … … 934 958 procedure TCpuZ80.CallCond(Address: Word; Condition: Boolean); 935 959 begin 960 if DebugMode = dmStepOver then begin 961 DebugStopAddress := PC; 962 DebugMode := dmStopAddress; 963 end; 936 964 if Condition then begin 937 965 PushWord(PC); … … 944 972 TempByte: Byte; 945 973 begin 946 Carry := Data > A ;947 TempByte := Byte(ShortInt(A ) - ShortInt(Data));974 Carry := Data > AF.A; 975 TempByte := Byte(ShortInt(AF.A) - ShortInt(Data)); 948 976 Zero := TempByte = 0; 949 977 end; … … 955 983 Temp := ShortInt(ReadByte); 956 984 if Condition then 957 PC := PC + Temp;958 end;959 960 procedure TCpuZ80.Djnz;961 var962 Temp: ShortInt;963 begin964 Dec(BC.B);965 Temp := ShortInt(ReadByte);966 if BC.B <> 0 then967 985 PC := PC + Temp; 968 986 end; … … 994 1012 procedure TCpuZ80.AddByte(var Target: Byte; Second: Byte); 995 1013 begin 1014 Target := Byte(Target + Second); 1015 end; 1016 1017 procedure TCpuZ80.AddWord(var Target: Word; Second: Word); 1018 begin 1019 Target := Word(Target + Second); 1020 end; 1021 1022 procedure TCpuZ80.AdcByte(var Target: Byte; Second: Byte); 1023 begin 996 1024 Target := Target + Second; 997 1025 end; 998 1026 999 procedure TCpuZ80.AddWord(var Target: Word; Second: Word);1000 begin1001 Target := Target + Second;1002 end;1003 1004 procedure TCpuZ80.AdcByte(var Target: Byte; Second: Byte);1005 begin1006 Target := Target + Second;1007 end;1008 1009 1027 procedure TCpuZ80.AdcWord(var Target: Word; Second: Word); 1010 1028 begin … … 1014 1032 procedure TCpuZ80.SubByte(var Target: Byte; Second: Byte); 1015 1033 begin 1034 Target := Byte(Target - Second); 1035 end; 1036 1037 procedure TCpuZ80.SbcByte(var Target: Byte; Second: Byte); 1038 begin 1016 1039 Target := Target - Second; 1017 1040 end; 1018 1041 1019 procedure TCpuZ80.Sbc Byte(var Target: Byte; Second: Byte);1042 procedure TCpuZ80.SbcWord(var Target: Word; Second: Word); 1020 1043 begin 1021 1044 Target := Target - Second; 1022 1045 end; 1023 1046 1024 procedure TCpuZ80.SbcWord(var Target: Word; Second: Word);1025 begin1026 Target := Target - Second;1027 end;1028 1029 1047 procedure TCpuZ80.XorByte(var Target: Byte; Second: Byte); 1030 1048 begin … … 1035 1053 begin 1036 1054 Target := Target or Second; 1055 end; 1056 1057 procedure TCpuZ80.AndByte(var Target: Byte; Second: Byte); 1058 begin 1059 Target := Target and Second; 1060 end; 1061 1062 procedure TCpuZ80.IncByte(var Reg: Byte); 1063 begin 1064 if Reg = High(Reg) then Reg := 0 1065 else Inc(Reg); 1066 end; 1067 1068 procedure TCpuZ80.IncWord(var Reg: Word); 1069 begin 1070 if Reg = High(Reg) then Reg := 0 1071 else Inc(Reg); 1072 end; 1073 1074 procedure TCpuZ80.DecByte(var Reg: Byte); 1075 begin 1076 if Reg = 0 then Reg := High(Reg) 1077 else Dec(Reg) 1078 end; 1079 1080 procedure TCpuZ80.DecWord(var Reg: Word); 1081 begin 1082 if Reg = 0 then Reg := High(Reg) 1083 else Dec(Reg) 1084 end; 1085 1086 procedure TCpuZ80.RlcByte(var Data: Byte); 1087 begin 1088 Carry := (Data and $80) <> 0; 1089 Data := (Data shl 1) or Byte(Carry); 1090 end; 1091 1092 procedure TCpuZ80.RrcByte(var Data: Byte); 1093 begin 1094 Carry := (Data and 1) > 0; 1095 Data := (Data shr 1) or ($80 * Byte(Carry)); 1037 1096 end; 1038 1097 … … 1749 1808 procedure TCpuZ80.LD_BC_Indirect_A; 1750 1809 begin 1751 DoWrite(BC.Value, A );1810 DoWrite(BC.Value, AF.A); 1752 1811 end; 1753 1812 1754 1813 procedure TCpuZ80.INC_BC; 1755 1814 begin 1756 Inc (BC.Value);1815 IncWord(BC.Value); 1757 1816 end; 1758 1817 1759 1818 procedure TCpuZ80.INC_B; 1760 1819 begin 1761 Inc (BC.B);1820 IncByte(BC.B); 1762 1821 end; 1763 1822 1764 1823 procedure TCpuZ80.DEC_B; 1765 1824 begin 1825 DecByte(BC.B); 1826 end; 1827 1828 procedure TCpuZ80.LD_B_N; 1829 begin 1830 BC.B := ReadByte; 1831 end; 1832 1833 procedure TCpuZ80.RLCA; 1834 begin 1835 RlcByte(AF.A); 1836 end; 1837 1838 procedure TCpuZ80.EX_AF_AF_Pair; 1839 var 1840 Temp: Word; 1841 begin 1842 Temp := AF.Value; 1843 AF2.Value := AF.Value; 1844 AF.Value := Temp; 1845 end; 1846 1847 procedure TCpuZ80.ADD_HL_BC; 1848 begin 1849 AddWord(HL.Value, BC.Value); 1850 end; 1851 1852 procedure TCpuZ80.LD_A_BC_Indirect; 1853 begin 1854 AF.A := DoRead(BC.Value); 1855 end; 1856 1857 procedure TCpuZ80.DEC_BC; 1858 begin 1859 DecWord(BC.Value); 1860 end; 1861 1862 procedure TCpuZ80.INC_C; 1863 begin 1864 IncByte(BC.C); 1865 end; 1866 1867 procedure TCpuZ80.DEC_C; 1868 begin 1869 DecByte(BC.C); 1870 end; 1871 1872 procedure TCpuZ80.LD_C_N; 1873 begin 1874 BC.C := ReadByte; 1875 end; 1876 1877 procedure TCpuZ80.RRCA; 1878 begin 1879 RrcByte(AF.A); 1880 end; 1881 1882 procedure TCpuZ80.DJNZ_D; 1883 var 1884 Temp: ShortInt; 1885 begin 1766 1886 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; 1823 1890 end; 1824 1891 … … 1830 1897 procedure TCpuZ80.LD_DE_Indirect_A; 1831 1898 begin 1832 DoWrite(DE.Value, A );1899 DoWrite(DE.Value, AF.A); 1833 1900 end; 1834 1901 1835 1902 procedure TCpuZ80.INC_DE; 1836 1903 begin 1837 Inc (DE.Value);1904 IncWord(DE.Value); 1838 1905 end; 1839 1906 1840 1907 procedure TCpuZ80.INC_D; 1841 1908 begin 1842 Inc (DE.D);1909 IncByte(DE.D); 1843 1910 end; 1844 1911 1845 1912 procedure TCpuZ80.DEC_D; 1846 1913 begin 1847 Dec (DE.D);1914 DecByte(DE.D); 1848 1915 end; 1849 1916 … … 1854 1921 1855 1922 procedure TCpuZ80.RLA; 1856 begin 1857 NotImplemented; 1923 var 1924 NewCarry: Boolean; 1925 begin 1926 NewCarry := (AF.A and $80) > 0; 1927 AF.A := (AF.A shl 1) or Byte(Carry); 1928 Carry := NewCarry; 1858 1929 end; 1859 1930 … … 1870 1941 procedure TCpuZ80.LD_A_DE_Indirect; 1871 1942 begin 1872 A := DoRead(DE.Value);1943 AF.A := DoRead(DE.Value); 1873 1944 end; 1874 1945 1875 1946 procedure TCpuZ80.DEC_DE; 1876 1947 begin 1877 Dec (DE.Value);1948 DecWord(DE.Value); 1878 1949 end; 1879 1950 1880 1951 procedure TCpuZ80.INC_E; 1881 1952 begin 1882 Inc (DE.E);1953 IncByte(DE.E); 1883 1954 end; 1884 1955 1885 1956 procedure TCpuZ80.DEC_E; 1886 1957 begin 1887 Dec (DE.E);1958 DecByte(DE.E); 1888 1959 end; 1889 1960 … … 1894 1965 1895 1966 procedure TCpuZ80.RRA; 1896 begin 1897 NotImplemented; 1967 var 1968 NewCarry: Boolean; 1969 begin 1970 NewCarry := (AF.A and 1) > 0; 1971 AF.A := (AF.A shr 1) or ($80 * Byte(Carry)); 1972 Carry := NewCarry; 1898 1973 end; 1899 1974 … … 1910 1985 procedure TCpuZ80.LD_NN_Indirect_HL; 1911 1986 begin 1912 DoWrite (ReadWord, HL.Value);1987 DoWriteWord(ReadWord, HL.Value); 1913 1988 end; 1914 1989 1915 1990 procedure TCpuZ80.INC_HL; 1916 1991 begin 1917 Inc (HL.Value);1992 IncWord(HL.Value); 1918 1993 end; 1919 1994 1920 1995 procedure TCpuZ80.INC_H; 1921 1996 begin 1922 Inc (HL.H);1997 IncByte(HL.H); 1923 1998 end; 1924 1999 1925 2000 procedure TCpuZ80.DEC_H; 1926 2001 begin 1927 Dec (HL.H);2002 DecByte(HL.H); 1928 2003 end; 1929 2004 … … 1950 2025 procedure TCpuZ80.LD_HL_NN_Indirect; 1951 2026 begin 1952 HL.Value := DoRead (ReadWord);2027 HL.Value := DoReadWord(ReadWord); 1953 2028 end; 1954 2029 1955 2030 procedure TCpuZ80.DEC_HL; 1956 2031 begin 1957 Dec (HL.Value);2032 DecWord(HL.Value); 1958 2033 end; 1959 2034 1960 2035 procedure TCpuZ80.INC_L; 1961 2036 begin 1962 Inc (HL.L);2037 IncByte(HL.L); 1963 2038 end; 1964 2039 1965 2040 procedure TCpuZ80.DEC_L; 1966 2041 begin 1967 Dec (HL.L);2042 DecByte(HL.L); 1968 2043 end; 1969 2044 … … 1975 2050 procedure TCpuZ80.CPL; 1976 2051 begin 1977 NotImplemented;2052 AF.A := AF.A xor $ff; 1978 2053 end; 1979 2054 … … 1990 2065 procedure TCpuZ80.LD_NN_Indirect_A; 1991 2066 begin 1992 DoWrite(ReadWord, A );2067 DoWrite(ReadWord, AF.A); 1993 2068 end; 1994 2069 1995 2070 procedure TCpuZ80.INC_SP; 1996 2071 begin 1997 Inc (SP);2072 IncWord(SP); 1998 2073 end; 1999 2074 2000 2075 procedure TCpuZ80.INC_HL_Indirect; 2001 begin 2002 DoWrite(HL.Value, DoRead(HL.Value) + 1); 2076 var 2077 Temp: Byte; 2078 begin 2079 Temp := DoRead(HL.Value); 2080 IncByte(Temp); 2081 DoWrite(HL.Value, Temp); 2003 2082 end; 2004 2083 2005 2084 procedure TCpuZ80.DEC_HL_Indirect; 2006 begin 2007 DoWrite(HL.Value, DoRead(HL.Value) - 1); 2085 var 2086 Temp: Byte; 2087 begin 2088 Temp := DoRead(HL.Value); 2089 DecByte(Temp); 2090 DoWrite(HL.Value, Temp); 2008 2091 end; 2009 2092 … … 2015 2098 procedure TCpuZ80.SCF; 2016 2099 begin 2017 NotImplemented;2100 Carry := True; 2018 2101 end; 2019 2102 … … 2030 2113 procedure TCpuZ80.LD_A_NN_Indirect; 2031 2114 begin 2032 A := DoRead(ReadWord);2115 AF.A := DoRead(ReadWord); 2033 2116 end; 2034 2117 2035 2118 procedure TCpuZ80.DEC_SP; 2036 2119 begin 2037 Dec (SP);2120 DecWord(SP); 2038 2121 end; 2039 2122 2040 2123 procedure TCpuZ80.INC_A; 2041 2124 begin 2042 Inc (A);2125 IncByte(AF.A); 2043 2126 end; 2044 2127 2045 2128 procedure TCpuZ80.DEC_A; 2046 2129 begin 2047 Dec (A);2130 DecByte(AF.A); 2048 2131 end; 2049 2132 2050 2133 procedure TCpuZ80.LD_A_N; 2051 2134 begin 2052 A := ReadByte;2135 AF.A := ReadByte; 2053 2136 end; 2054 2137 … … 2095 2178 procedure TCpuZ80.LD_B_A; 2096 2179 begin 2097 BC.B := A ;2180 BC.B := AF.A; 2098 2181 end; 2099 2182 … … 2135 2218 procedure TCpuZ80.LD_C_A; 2136 2219 begin 2137 BC.C := A ;2220 BC.C := AF.A; 2138 2221 end; 2139 2222 … … 2175 2258 procedure TCpuZ80.LD_D_A; 2176 2259 begin 2177 DE.D := A ;2260 DE.D := AF.A; 2178 2261 end; 2179 2262 … … 2215 2298 procedure TCpuZ80.LD_E_A; 2216 2299 begin 2217 DE.E := A ;2300 DE.E := AF.A; 2218 2301 end; 2219 2302 … … 2255 2338 procedure TCpuZ80.LD_H_A; 2256 2339 begin 2257 HL.H := A ;2340 HL.H := AF.A; 2258 2341 end; 2259 2342 … … 2295 2378 procedure TCpuZ80.LD_L_A; 2296 2379 begin 2297 HL.L := A ;2380 HL.L := AF.A; 2298 2381 end; 2299 2382 … … 2335 2418 procedure TCpuZ80.LD_HL_Indirect_A; 2336 2419 begin 2337 DoWrite(HL.Value, A );2420 DoWrite(HL.Value, AF.A); 2338 2421 end; 2339 2422 2340 2423 procedure TCpuZ80.LD_A_B; 2341 2424 begin 2342 A := BC.B;2425 AF.A := BC.B; 2343 2426 end; 2344 2427 2345 2428 procedure TCpuZ80.LD_A_C; 2346 2429 begin 2347 A := BC.C;2430 AF.A := BC.C; 2348 2431 end; 2349 2432 2350 2433 procedure TCpuZ80.LD_A_D; 2351 2434 begin 2352 A := DE.D;2435 AF.A := DE.D; 2353 2436 end; 2354 2437 2355 2438 procedure TCpuZ80.LD_A_E; 2356 2439 begin 2357 A := DE.E;2440 AF.A := DE.E; 2358 2441 end; 2359 2442 2360 2443 procedure TCpuZ80.LD_A_H; 2361 2444 begin 2362 A := HL.H;2445 AF.A := HL.H; 2363 2446 end; 2364 2447 2365 2448 procedure TCpuZ80.LD_A_L; 2366 2449 begin 2367 A := HL.L;2450 AF.A := HL.L; 2368 2451 end; 2369 2452 2370 2453 procedure TCpuZ80.LD_A_HL_Indirect; 2371 2454 begin 2372 A := DoRead(HL.Value);2455 AF.A := DoRead(HL.Value); 2373 2456 end; 2374 2457 2375 2458 procedure TCpuZ80.LD_A_A; 2376 2459 begin 2377 A :=A;2460 AF.A := AF.A; 2378 2461 end; 2379 2462 2380 2463 procedure TCpuZ80.ADD_A_B; 2381 2464 begin 2382 AddByte(A , BC.B);2465 AddByte(AF.A, BC.B); 2383 2466 end; 2384 2467 2385 2468 procedure TCpuZ80.ADD_A_C; 2386 2469 begin 2387 AddByte(A , BC.C);2470 AddByte(AF.A, BC.C); 2388 2471 end; 2389 2472 2390 2473 procedure TCpuZ80.ADD_A_D; 2391 2474 begin 2392 AddByte(A , DE.D);2475 AddByte(AF.A, DE.D); 2393 2476 end; 2394 2477 2395 2478 procedure TCpuZ80.ADD_A_E; 2396 2479 begin 2397 AddByte(A , DE.E);2480 AddByte(AF.A, DE.E); 2398 2481 end; 2399 2482 2400 2483 procedure TCpuZ80.ADD_A_H; 2401 2484 begin 2402 AddByte(A , HL.H);2485 AddByte(AF.A, HL.H); 2403 2486 end; 2404 2487 2405 2488 procedure TCpuZ80.ADD_A_L; 2406 2489 begin 2407 AddByte(A , HL.L);2490 AddByte(AF.A, HL.L); 2408 2491 end; 2409 2492 2410 2493 procedure TCpuZ80.ADD_A_HL_Indirect; 2411 2494 begin 2412 AddByte(A , DoRead(HL.Value));2495 AddByte(AF.A, DoRead(HL.Value)); 2413 2496 end; 2414 2497 2415 2498 procedure TCpuZ80.ADD_A_A; 2416 2499 begin 2417 AddByte(A ,A);2500 AddByte(AF.A, AF.A); 2418 2501 end; 2419 2502 2420 2503 procedure TCpuZ80.ADC_A_B; 2421 2504 begin 2422 AdcByte(A , BC.B);2505 AdcByte(AF.A, BC.B); 2423 2506 end; 2424 2507 2425 2508 procedure TCpuZ80.ADC_A_C; 2426 2509 begin 2427 AdcByte(A , BC.C);2510 AdcByte(AF.A, BC.C); 2428 2511 end; 2429 2512 2430 2513 procedure TCpuZ80.ADC_A_D; 2431 2514 begin 2432 AdcByte(A , DE.D);2515 AdcByte(AF.A, DE.D); 2433 2516 end; 2434 2517 2435 2518 procedure TCpuZ80.ADC_A_E; 2436 2519 begin 2437 AdcByte(A , DE.E);2520 AdcByte(AF.A, DE.E); 2438 2521 end; 2439 2522 2440 2523 procedure TCpuZ80.ADC_A_H; 2441 2524 begin 2442 AdcByte(A , HL.H);2525 AdcByte(AF.A, HL.H); 2443 2526 end; 2444 2527 2445 2528 procedure TCpuZ80.ADC_A_L; 2446 2529 begin 2447 AdcByte(A , HL.L);2530 AdcByte(AF.A, HL.L); 2448 2531 end; 2449 2532 2450 2533 procedure TCpuZ80.ADC_A_HL_Indirect; 2451 2534 begin 2452 AdcByte(A , DoRead(HL.Value));2535 AdcByte(AF.A, DoRead(HL.Value)); 2453 2536 end; 2454 2537 2455 2538 procedure TCpuZ80.ADC_A_A; 2456 2539 begin 2457 AdcByte(A ,A);2540 AdcByte(AF.A, AF.A); 2458 2541 end; 2459 2542 2460 2543 procedure TCpuZ80.SUB_B; 2461 2544 begin 2462 SubByte(A , BC.B);2545 SubByte(AF.A, BC.B); 2463 2546 end; 2464 2547 2465 2548 procedure TCpuZ80.SUB_C; 2466 2549 begin 2467 SubByte(A , BC.C);2550 SubByte(AF.A, BC.C); 2468 2551 end; 2469 2552 2470 2553 procedure TCpuZ80.SUB_D; 2471 2554 begin 2472 SubByte(A , DE.D);2555 SubByte(AF.A, DE.D); 2473 2556 end; 2474 2557 2475 2558 procedure TCpuZ80.SUB_E; 2476 2559 begin 2477 SubByte(A , DE.E);2560 SubByte(AF.A, DE.E); 2478 2561 end; 2479 2562 2480 2563 procedure TCpuZ80.SUB_H; 2481 2564 begin 2482 SubByte(A , HL.H);2565 SubByte(AF.A, HL.H); 2483 2566 end; 2484 2567 2485 2568 procedure TCpuZ80.SUB_L; 2486 2569 begin 2487 SubByte(A , HL.L);2570 SubByte(AF.A, HL.L); 2488 2571 end; 2489 2572 2490 2573 procedure TCpuZ80.SUB_HL_Indirect; 2491 2574 begin 2492 SubByte(A , DoRead(HL.Value));2575 SubByte(AF.A, DoRead(HL.Value)); 2493 2576 end; 2494 2577 2495 2578 procedure TCpuZ80.SUB_A; 2496 2579 begin 2497 SubByte(A ,A);2580 SubByte(AF.A, AF.A); 2498 2581 end; 2499 2582 2500 2583 procedure TCpuZ80.SBC_A_B; 2501 2584 begin 2502 SbcByte(A , BC.B);2585 SbcByte(AF.A, BC.B); 2503 2586 end; 2504 2587 2505 2588 procedure TCpuZ80.SBC_A_C; 2506 2589 begin 2507 SbcByte(A , BC.C);2590 SbcByte(AF.A, BC.C); 2508 2591 end; 2509 2592 2510 2593 procedure TCpuZ80.SBC_A_D; 2511 2594 begin 2512 SbcByte(A , DE.D);2595 SbcByte(AF.A, DE.D); 2513 2596 end; 2514 2597 2515 2598 procedure TCpuZ80.SBC_A_E; 2516 2599 begin 2517 SbcByte(A , DE.E);2600 SbcByte(AF.A, DE.E); 2518 2601 end; 2519 2602 2520 2603 procedure TCpuZ80.SBC_A_H; 2521 2604 begin 2522 SbcByte(A , HL.H);2605 SbcByte(AF.A, HL.H); 2523 2606 end; 2524 2607 2525 2608 procedure TCpuZ80.SBC_A_L; 2526 2609 begin 2527 SbcByte(A , HL.L);2610 SbcByte(AF.A, HL.L); 2528 2611 end; 2529 2612 2530 2613 procedure TCpuZ80.SBC_A_HL_Indirect; 2531 2614 begin 2532 SbcByte(A , DoRead(HL.Value));2615 SbcByte(AF.A, DoRead(HL.Value)); 2533 2616 end; 2534 2617 2535 2618 procedure TCpuZ80.SBC_A_A; 2536 2619 begin 2537 SbcByte(A ,A);2620 SbcByte(AF.A, AF.A); 2538 2621 end; 2539 2622 2540 2623 procedure TCpuZ80.AND_B; 2541 2624 begin 2542 NotImplemented;2625 AndByte(AF.A, BC.B); 2543 2626 end; 2544 2627 2545 2628 procedure TCpuZ80.AND_C; 2546 2629 begin 2547 NotImplemented;2630 AndByte(AF.A, BC.C); 2548 2631 end; 2549 2632 2550 2633 procedure TCpuZ80.AND_D; 2551 2634 begin 2552 NotImplemented;2635 AndByte(AF.A, DE.D); 2553 2636 end; 2554 2637 2555 2638 procedure TCpuZ80.AND_E; 2556 2639 begin 2557 NotImplemented;2640 AndByte(AF.A, DE.E); 2558 2641 end; 2559 2642 2560 2643 procedure TCpuZ80.AND_H; 2561 2644 begin 2562 NotImplemented;2645 AndByte(AF.A, HL.H); 2563 2646 end; 2564 2647 2565 2648 procedure TCpuZ80.AND_L; 2566 2649 begin 2567 NotImplemented;2650 AndByte(AF.A, HL.L); 2568 2651 end; 2569 2652 2570 2653 procedure TCpuZ80.AND_HL_Indirect; 2571 2654 begin 2572 NotImplemented;2655 AndByte(AF.A, DoRead(HL.Value)); 2573 2656 end; 2574 2657 2575 2658 procedure TCpuZ80.AND_A; 2576 2659 begin 2577 NotImplemented;2660 AndByte(AF.A, AF.A); 2578 2661 end; 2579 2662 2580 2663 procedure TCpuZ80.XOR_B; 2581 2664 begin 2582 A := A xor BC.B;2665 XorByte(AF.A, BC.B); 2583 2666 end; 2584 2667 2585 2668 procedure TCpuZ80.XOR_C; 2586 2669 begin 2587 A := A xor BC.C;2670 XorByte(AF.A, BC.C); 2588 2671 end; 2589 2672 2590 2673 procedure TCpuZ80.XOR_D; 2591 2674 begin 2592 A := A xor DE.D;2675 XorByte(AF.A, DE.D); 2593 2676 end; 2594 2677 2595 2678 procedure TCpuZ80.XOR_E; 2596 2679 begin 2597 A := A xor DE.E;2680 XorByte(AF.A, DE.E); 2598 2681 end; 2599 2682 2600 2683 procedure TCpuZ80.XOR_H; 2601 2684 begin 2602 A := A xor HL.H;2685 XorByte(AF.A, HL.H); 2603 2686 end; 2604 2687 2605 2688 procedure TCpuZ80.XOR_L; 2606 2689 begin 2607 A := A xor HL.L;2690 XorByte(AF.A, HL.L); 2608 2691 end; 2609 2692 2610 2693 procedure TCpuZ80.XOR_HL_Indirect; 2611 2694 begin 2612 A := A xor DoRead(HL.Value);2695 XorByte(AF.A, DoRead(HL.Value)); 2613 2696 end; 2614 2697 2615 2698 procedure TCpuZ80.XOR_A; 2616 2699 begin 2617 A := A xor A;2700 XorByte(AF.A, AF.A); 2618 2701 end; 2619 2702 2620 2703 procedure TCpuZ80.OR_B; 2621 2704 begin 2622 A := A or BC.B;2705 OrByte(AF.A, BC.B); 2623 2706 end; 2624 2707 2625 2708 procedure TCpuZ80.OR_C; 2626 2709 begin 2627 A := A or BC.C;2710 OrByte(AF.A, BC.C); 2628 2711 end; 2629 2712 2630 2713 procedure TCpuZ80.OR_D; 2631 2714 begin 2632 A := A or DE.D;2715 OrByte(AF.A, DE.D); 2633 2716 end; 2634 2717 2635 2718 procedure TCpuZ80.OR_E; 2636 2719 begin 2637 A := A or DE.E;2720 OrByte(AF.A, DE.E); 2638 2721 end; 2639 2722 2640 2723 procedure TCpuZ80.OR_H; 2641 2724 begin 2642 A := A or HL.H;2725 OrByte(AF.A, HL.H); 2643 2726 end; 2644 2727 2645 2728 procedure TCpuZ80.OR_L; 2646 2729 begin 2647 A := A or HL.L;2730 OrByte(AF.A, HL.L); 2648 2731 end; 2649 2732 2650 2733 procedure TCpuZ80.OR_HL_Indirect; 2651 2734 begin 2652 A := A or DoRead(HL.Value);2735 OrByte(AF.A, DoRead(HL.Value)); 2653 2736 end; 2654 2737 2655 2738 procedure TCpuZ80.OR_A; 2656 2739 begin 2657 A := A or A;2740 OrByte(AF.A, AF.A); 2658 2741 end; 2659 2742 … … 2695 2778 procedure TCpuZ80.CP_A; 2696 2779 begin 2697 CP(A );2780 CP(AF.A); 2698 2781 end; 2699 2782 … … 2730 2813 procedure TCpuZ80.ADD_A_N; 2731 2814 begin 2732 AddByte(A , ReadByte);2815 AddByte(AF.A, ReadByte); 2733 2816 end; 2734 2817 … … 2759 2842 2760 2843 procedure TCpuZ80.CALL_NN; 2844 begin 2845 Call(ReadWord); 2846 end; 2847 2848 procedure TCpuZ80.ADC_A_N; 2849 begin 2850 AdcByte(AF.A, ReadByte); 2851 end; 2852 2853 procedure TCpuZ80.RST_08H; 2854 begin 2855 Call($08); 2856 end; 2857 2858 procedure TCpuZ80.RET_NC; 2859 begin 2860 RetCond(not Carry); 2861 end; 2862 2863 procedure TCpuZ80.POP_DE; 2864 begin 2865 DE.Value := PopWord; 2866 end; 2867 2868 procedure TCpuZ80.JP_NC_NN; 2869 begin 2870 Jp(not Carry); 2871 end; 2872 2873 procedure TCpuZ80.OUT_N_Indirect_A; 2874 begin 2875 DoOutput(ReadByte, AF.A); 2876 end; 2877 2878 procedure TCpuZ80.CALL_NC_NN; 2879 begin 2880 CallCond(ReadWord, not Carry); 2881 end; 2882 2883 procedure TCpuZ80.PUSH_DE; 2884 begin 2885 PushWord(DE.Value); 2886 end; 2887 2888 procedure TCpuZ80.SUB_N; 2889 begin 2890 SubByte(AF.A, ReadByte); 2891 end; 2892 2893 procedure TCpuZ80.RST_10H; 2894 begin 2895 Call($10); 2896 end; 2897 2898 procedure TCpuZ80.RET_C; 2899 begin 2900 RetCond(Carry); 2901 end; 2902 2903 procedure TCpuZ80.EXX; 2761 2904 var 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; 2906 begin 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; 2830 2916 end; 2831 2917 … … 2837 2923 procedure TCpuZ80.IN_A_N_Indirect; 2838 2924 begin 2839 NotImplemented;2925 AF.A := DoInput((AF.A shl 8) or ReadByte); 2840 2926 end; 2841 2927 … … 2847 2933 procedure TCpuZ80.SBC_A_N; 2848 2934 begin 2849 SbcByte(A , ReadByte);2935 SbcByte(AF.A, ReadByte); 2850 2936 end; 2851 2937 … … 2867 2953 procedure TCpuZ80.JP_PO_NN; 2868 2954 begin 2869 NotImplemented;2955 Jp(not ParityOverflow); 2870 2956 end; 2871 2957 2872 2958 procedure TCpuZ80.EX_SP_Indirect_HL; 2873 begin 2874 NotImplemented; 2959 var 2960 Temp: Word; 2961 begin 2962 Temp := HL.Value; 2963 HL.Value := DoReadWord(SP); 2964 DoWriteWord(SP, Temp); 2875 2965 end; 2876 2966 2877 2967 procedure TCpuZ80.CALL_PO_NN; 2878 2968 begin 2879 NotImplemented;2969 CallCond(ReadWord, not ParityOverflow); 2880 2970 end; 2881 2971 … … 2887 2977 procedure TCpuZ80.AND_N; 2888 2978 begin 2889 A := A and ReadByte;2979 AndByte(AF.A, ReadByte); 2890 2980 end; 2891 2981 … … 2897 2987 procedure TCpuZ80.RET_PE; 2898 2988 begin 2899 NotImplemented;2989 RetCond(ParityOverflow); 2900 2990 end; 2901 2991 … … 2907 2997 procedure TCpuZ80.JP_PE_NN; 2908 2998 begin 2909 NotImplemented;2999 Jp(ParityOverflow); 2910 3000 end; 2911 3001 … … 2921 3011 procedure TCpuZ80.CALL_PE_NN; 2922 3012 begin 2923 NotImplemented;3013 CallCond(ReadWord, ParityOverflow); 2924 3014 end; 2925 3015 2926 3016 procedure TCpuZ80.XOR_N; 2927 3017 begin 2928 XorByte(A , ReadByte);3018 XorByte(AF.A, ReadByte); 2929 3019 end; 2930 3020 … … 2936 3026 procedure TCpuZ80.RET_P; 2937 3027 begin 2938 NotImplemented;3028 RetCond(not SignNegative); 2939 3029 end; 2940 3030 2941 3031 procedure TCpuZ80.POP_AF; 2942 3032 begin 2943 A := PopWord and $ff;3033 AF.Value := PopWord; 2944 3034 end; 2945 3035 2946 3036 procedure TCpuZ80.JP_P_NN; 2947 3037 begin 2948 NotImplemented;3038 Jp(not SignNegative); 2949 3039 end; 2950 3040 … … 2956 3046 procedure TCpuZ80.CALL_P_NN; 2957 3047 begin 2958 NotImplemented;3048 CallCond(ReadWord, not SignNegative); 2959 3049 end; 2960 3050 2961 3051 procedure TCpuZ80.PUSH_AF; 2962 3052 begin 2963 PushWord(A shl 8);3053 PushWord(AF.Value); 2964 3054 end; 2965 3055 2966 3056 procedure TCpuZ80.OR_N; 2967 3057 begin 2968 OrByte(A , ReadByte);3058 OrByte(AF.A, ReadByte); 2969 3059 end; 2970 3060 … … 2976 3066 procedure TCpuZ80.RET_M; 2977 3067 begin 2978 NotImplemented;3068 RetCond(SignNegative); 2979 3069 end; 2980 3070 … … 2986 3076 procedure TCpuZ80.JP_M_NN; 2987 3077 begin 2988 NotImplemented;3078 Jp(SignNegative); 2989 3079 end; 2990 3080 … … 2996 3086 procedure TCpuZ80.CALL_M_NN; 2997 3087 begin 2998 NotImplemented;3088 CallCond(ReadWord, SignNegative); 2999 3089 end; 3000 3090 … … 3031 3121 procedure TCpuZ80.NEG; 3032 3122 begin 3033 NotImplemented; 3123 AF.A := AF.A xor $ff; 3124 IncByte(AF.A); 3034 3125 end; 3035 3126 … … 3047 3138 procedure TCpuZ80.LD_I_A; 3048 3139 begin 3049 NotImplemented;3140 RegI := AF.A; 3050 3141 end; 3051 3142 3052 3143 procedure TCpuZ80.IN_C_C_Indirect; 3053 3144 begin 3054 NotImplemented;3145 BC.C := DoInput(BC.Value); 3055 3146 end; 3056 3147 3057 3148 procedure TCpuZ80.OUT_C_Indirect_C; 3058 3149 begin 3059 NotImplemented;3150 DoOutput(BC.Value, BC.C); 3060 3151 end; 3061 3152 3062 3153 procedure TCpuZ80.ADC_HL_BC; 3063 3154 begin 3064 NotImplemented;3155 AdcWord(HL.Value, BC.Value); 3065 3156 end; 3066 3157 3067 3158 procedure TCpuZ80.LD_BC_NN_Indirect; 3068 3159 begin 3069 NotImplemented;3160 BC.Value := DoReadWord(ReadWord); 3070 3161 end; 3071 3162 … … 3078 3169 procedure TCpuZ80.LD_R_A; 3079 3170 begin 3080 NotImplemented;3171 RegR := AF.A; 3081 3172 end; 3082 3173 3083 3174 procedure TCpuZ80.IN_D_C_Indirect; 3084 3175 begin 3085 NotImplemented;3176 DE.D := DoInput(BC.Value); 3086 3177 end; 3087 3178 … … 3108 3199 procedure TCpuZ80.LD_A_I; 3109 3200 begin 3110 NotImplemented;3201 AF.A := RegI; 3111 3202 end; 3112 3203 … … 3138 3229 procedure TCpuZ80.LD_A_R; 3139 3230 begin 3140 NotImplemented;3231 AF.A := RegR; 3141 3232 end; 3142 3233 … … 3193 3284 procedure TCpuZ80.IN_A_C_Indirect; 3194 3285 begin 3195 A := DoInput(BC.Value);3286 AF.A := DoInput(BC.Value); 3196 3287 end; 3197 3288 3198 3289 procedure TCpuZ80.OUT_C_Indirect_A; 3199 3290 begin 3200 DoOutput(BC.Value, A );3291 DoOutput(BC.Value, AF.A); 3201 3292 end; 3202 3293 … … 3213 3304 procedure TCpuZ80.LDI; 3214 3305 begin 3215 NotImplemented; 3306 DoWrite(DE.Value, DoRead(HL.Value)); 3307 IncWord(HL.Value); 3308 IncWord(DE.Value); 3309 DecWord(BC.Value); 3216 3310 end; 3217 3311 3218 3312 procedure TCpuZ80.CPI; 3219 3313 begin 3220 NotImplemented; 3314 Cp(DoRead(HL.Value)); 3315 IncWord(HL.Value); 3316 DecWord(BC.Value); 3221 3317 end; 3222 3318 3223 3319 procedure TCpuZ80.INI; 3224 3320 begin 3225 NotImplemented; 3321 DoWrite(HL.Value, DoInput(BC.Value)); 3322 DecByte(BC.B); 3323 IncWord(HL.Value); 3226 3324 end; 3227 3325 3228 3326 procedure TCpuZ80.OUTI; 3229 3327 begin 3230 NotImplemented; 3328 DoOutput(BC.Value, DoRead(HL.Value)); 3329 DecByte(BC.B); 3330 IncWord(HL.Value); 3231 3331 end; 3232 3332 3233 3333 procedure TCpuZ80.LDD; 3234 3334 begin 3235 NotImplemented; 3335 DoWrite(DE.Value, DoRead(HL.Value)); 3336 DecWord(HL.Value); 3337 DecWord(DE.Value); 3338 DecWord(BC.Value); 3236 3339 end; 3237 3340 3238 3341 procedure TCpuZ80.CPD; 3239 3342 begin 3240 NotImplemented; 3343 Cp(DoRead(HL.Value)); 3344 DecWord(HL.Value); 3345 DecWord(BC.Value); 3241 3346 end; 3242 3347 3243 3348 procedure TCpuZ80.IND; 3244 3349 begin 3245 NotImplemented; 3350 DoWrite(HL.Value, DoInput(BC.Value)); 3351 DecByte(BC.B); 3352 DecWord(HL.Value); 3246 3353 end; 3247 3354 3248 3355 procedure TCpuZ80.OUTD; 3249 3356 begin 3250 NotImplemented; 3357 DoOutput(BC.Value, DoRead(HL.Value)); 3358 DecByte(BC.B); 3359 DecWord(HL.Value); 3251 3360 end; 3252 3361 3253 3362 procedure TCpuZ80.LDIR; 3254 3363 begin 3255 NotImplemented; 3364 repeat 3365 LDI; 3366 until BC.Value = 0; 3256 3367 end; 3257 3368 3258 3369 procedure TCpuZ80.CPIR; 3259 3370 begin 3260 NotImplemented; 3371 repeat 3372 CPI; 3373 until (BC.Value = 0) or Zero; 3261 3374 end; 3262 3375 3263 3376 procedure TCpuZ80.INIR; 3264 3377 begin 3265 NotImplemented; 3378 repeat 3379 INI; 3380 until (BC.B = 0); 3266 3381 end; 3267 3382 3268 3383 procedure TCpuZ80.OTIR; 3269 3384 begin 3270 NotImplemented; 3385 repeat 3386 OUTI; 3387 until BC.B = 0; 3271 3388 end; 3272 3389 3273 3390 procedure TCpuZ80.LDDR; 3274 3391 begin 3275 NotImplemented; 3392 repeat 3393 LDD; 3394 until BC.Value = 0; 3276 3395 end; 3277 3396 3278 3397 procedure TCpuZ80.CPDR; 3279 3398 begin 3280 NotImplemented; 3399 repeat 3400 CPD; 3401 until (BC.Value = 0) or Zero; 3281 3402 end; 3282 3403 3283 3404 procedure TCpuZ80.INDR; 3284 3405 begin 3285 NotImplemented; 3406 repeat 3407 IND; 3408 until (BC.B = 0); 3286 3409 end; 3287 3410 3288 3411 procedure TCpuZ80.OTDR; 3289 3412 begin 3290 NotImplemented; 3413 repeat 3414 OUTD; 3415 until BC.B = 0; 3291 3416 end; 3292 3417 3293 3418 procedure TCpuZ80.RLC_B; 3294 3419 begin 3295 NotImplemented;3420 RlcByte(BC.B); 3296 3421 end; 3297 3422 3298 3423 procedure TCpuZ80.RLC_C; 3299 3424 begin 3300 NotImplemented;3425 RlcByte(BC.C); 3301 3426 end; 3302 3427 3303 3428 procedure TCpuZ80.RLC_D; 3304 3429 begin 3305 NotImplemented;3430 RlcByte(DE.D); 3306 3431 end; 3307 3432 3308 3433 procedure TCpuZ80.RLC_E; 3309 3434 begin 3310 NotImplemented;3435 RlcByte(DE.E); 3311 3436 end; 3312 3437 3313 3438 procedure TCpuZ80.RLC_H; 3314 3439 begin 3315 NotImplemented;3440 RlcByte(HL.H); 3316 3441 end; 3317 3442 3318 3443 procedure TCpuZ80.RLC_L; 3319 3444 begin 3320 NotImplemented;3445 RlcByte(HL.L); 3321 3446 end; 3322 3447 3323 3448 procedure TCpuZ80.RLC_HL_Indirect; 3324 begin 3325 NotImplemented; 3449 var 3450 Temp: Byte; 3451 begin 3452 Temp := DoRead(HL.Value); 3453 RlcByte(Temp); 3454 DoWrite(HL.Value, Temp); 3326 3455 end; 3327 3456 3328 3457 procedure TCpuZ80.RLC_A; 3329 3458 begin 3330 NotImplemented;3459 RlcByte(AF.A); 3331 3460 end; 3332 3461 3333 3462 procedure TCpuZ80.RRC_B; 3334 3463 begin 3335 NotImplemented;3464 RrcByte(BC.B); 3336 3465 end; 3337 3466 3338 3467 procedure TCpuZ80.RRC_C; 3339 3468 begin 3340 NotImplemented;3469 RrcByte(BC.C); 3341 3470 end; 3342 3471 3343 3472 procedure TCpuZ80.RRC_D; 3344 3473 begin 3345 NotImplemented;3474 RrcByte(DE.D); 3346 3475 end; 3347 3476 3348 3477 procedure TCpuZ80.RRC_E; 3349 3478 begin 3350 NotImplemented;3479 RrcByte(DE.E); 3351 3480 end; 3352 3481 3353 3482 procedure TCpuZ80.RRC_H; 3354 3483 begin 3355 NotImplemented;3484 RrcByte(HL.H); 3356 3485 end; 3357 3486 3358 3487 procedure TCpuZ80.RRC_L; 3359 3488 begin 3360 NotImplemented;3489 RrcByte(HL.L); 3361 3490 end; 3362 3491 3363 3492 procedure TCpuZ80.RRC_HL_Indirect; 3364 begin 3365 NotImplemented; 3493 var 3494 Temp: Byte; 3495 begin 3496 Temp := DoRead(HL.Value); 3497 RrcByte(Temp); 3498 DoWrite(HL.Value, Temp); 3366 3499 end; 3367 3500 3368 3501 procedure TCpuZ80.RRC_A; 3369 3502 begin 3370 NotImplemented;3503 RrcByte(AF.A); 3371 3504 end; 3372 3505 … … 4538 4671 procedure TCpuZ80.ADD_IX_DE; 4539 4672 begin 4540 NotImplemented;4673 AddWord(IX, DE.Value); 4541 4674 end; 4542 4675 4543 4676 procedure TCpuZ80.LD_IX_NN; 4544 4677 begin 4545 NotImplemented;4678 IX := ReadWord; 4546 4679 end; 4547 4680 … … 4553 4686 procedure TCpuZ80.INC_IX; 4554 4687 begin 4555 NotImplemented;4688 IncWord(IX); 4556 4689 end; 4557 4690 4558 4691 procedure TCpuZ80.ADD_IX_IX; 4559 4692 begin 4560 NotImplemented;4693 AddWord(IX, IX); 4561 4694 end; 4562 4695 … … 5262 5395 procedure TCpuZ80.Reset; 5263 5396 begin 5264 A := 0;5265 5397 PC := 0; 5398 AF.Value := 0; 5266 5399 BC.Value := 0; 5267 5400 DE.Value := 0; 5268 5401 HL.Value := 0; 5269 5402 SP := 0; 5270 Carry := False;5271 Zero := False;5272 5403 InterruptEnabled := True; 5273 5404 InterruptMode := 0;
Note:
See TracChangeset
for help on using the changeset viewer.
![(please configure the [header_logo] section in trac.ini)](/mzxemu/chrome/site/your_project_logo.png)