Changeset 8 for trunk/Z80/Z80.pas
- Timestamp:
- Apr 19, 2026, 9:00:16 PM (8 days ago)
- File:
-
- 1 edited
-
trunk/Z80/Z80.pas (modified) (57 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Z80/Z80.pas
r7 r8 48 48 FThread: TCpuThread; 49 49 Instruction: TInstruction; 50 InstructionAddress: Word; 50 51 MessageText: string; 52 procedure Error(Message: string); 51 53 procedure SetRunning(AValue: Boolean); 52 54 function DoRead(Address: Word): Byte; 55 function DoReadWord(Address: Word): Word; 53 56 procedure DoWrite(Address: Word; Data: Byte); 57 procedure DoWriteWord(Address: Word; Data: Word); 54 58 function DoInput(Address: Word): Byte; 55 59 procedure DoOutput(Address: Word; Data: Byte); … … 61 65 function PopWord: Word; 62 66 procedure Call(Address: Word); 67 procedure CallCond(Address: Word; Condition: Boolean); 63 68 procedure Cp(Data: Byte); 64 69 procedure Jr(Condition: Boolean); 65 70 procedure Djnz; 66 71 procedure Jp(Condition: Boolean); 67 //procedure Halt;68 72 procedure RetCond(Condition: Boolean); 69 73 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); 70 83 71 84 // Instruction methods … … 777 790 Carry: Boolean; 778 791 Zero: Boolean; 792 ParityOverflow: Boolean; 793 SignNegative: Boolean; 779 794 Memory: TMemory; 780 795 Ticks: Cardinal; … … 818 833 { TCpuZ80 } 819 834 835 procedure TCpuZ80.Error(Message: string); 836 begin 837 PC := InstructionAddress; 838 DoMessage(Message + ' on address ' + IntToHex(Word(PC), 4)); 839 Halt; 840 end; 841 820 842 procedure TCpuZ80.SetRunning(AValue: Boolean); 821 843 begin … … 841 863 end; 842 864 865 function TCpuZ80.DoReadWord(Address: Word): Word; 866 begin 867 Result := DoRead(Address) or (DoRead(Address + 1) shl 8); 868 end; 869 843 870 procedure TCpuZ80.DoWrite(Address: Word; Data: Byte); 844 871 begin 845 872 if Assigned(FOnRead) then FOnWrite(Address, Data); 873 end; 874 875 procedure TCpuZ80.DoWriteWord(Address: Word; Data: Word); 876 begin 877 DoWrite(Address, Data and $ff); 878 DoWrite(Address + 1, Data shr 8); 846 879 end; 847 880 … … 897 930 PushWord(PC); 898 931 PC := Address; 932 end; 933 934 procedure TCpuZ80.CallCond(Address: Word; Condition: Boolean); 935 begin 936 if Condition then begin 937 PushWord(PC); 938 PC := Address; 939 end; 899 940 end; 900 941 … … 948 989 procedure TCpuZ80.NotImplemented; 949 990 begin 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)); 992 end; 993 994 procedure TCpuZ80.AddByte(var Target: Byte; Second: Byte); 995 begin 996 Target := Target + Second; 997 end; 998 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 1009 procedure TCpuZ80.AdcWord(var Target: Word; Second: Word); 1010 begin 1011 Target := Target - Second; 1012 end; 1013 1014 procedure TCpuZ80.SubByte(var Target: Byte; Second: Byte); 1015 begin 1016 Target := Target - Second; 1017 end; 1018 1019 procedure TCpuZ80.SbcByte(var Target: Byte; Second: Byte); 1020 begin 1021 Target := Target - Second; 1022 end; 1023 1024 procedure TCpuZ80.SbcWord(var Target: Word; Second: Word); 1025 begin 1026 Target := Target - Second; 1027 end; 1028 1029 procedure TCpuZ80.XorByte(var Target: Byte; Second: Byte); 1030 begin 1031 Target := Target xor Second; 1032 end; 1033 1034 procedure TCpuZ80.OrByte(var Target: Byte; Second: Byte); 1035 begin 1036 Target := Target or Second; 954 1037 end; 955 1038 … … 1656 1739 procedure TCpuZ80.NOP; 1657 1740 begin 1658 // No ope aration1741 // No operation 1659 1742 end; 1660 1743 … … 1707 1790 procedure TCpuZ80.LD_A_BC_Indirect; 1708 1791 begin 1709 NotImplemented;1792 A := DoRead(BC.Value); 1710 1793 end; 1711 1794 1712 1795 procedure TCpuZ80.DEC_BC; 1713 1796 begin 1714 NotImplemented;1797 Dec(BC.Value); 1715 1798 end; 1716 1799 1717 1800 procedure TCpuZ80.INC_C; 1718 1801 begin 1719 NotImplemented;1802 Inc(BC.C); 1720 1803 end; 1721 1804 1722 1805 procedure TCpuZ80.DEC_C; 1723 1806 begin 1724 NotImplemented;1807 Dec(BC.C); 1725 1808 end; 1726 1809 1727 1810 procedure TCpuZ80.LD_C_N; 1728 1811 begin 1729 NotImplemented;1812 BC.C := ReadByte; 1730 1813 end; 1731 1814 … … 1747 1830 procedure TCpuZ80.LD_DE_Indirect_A; 1748 1831 begin 1749 NotImplemented;1832 DoWrite(DE.Value, A); 1750 1833 end; 1751 1834 1752 1835 procedure TCpuZ80.INC_DE; 1753 1836 begin 1754 NotImplemented;1837 Inc(DE.Value); 1755 1838 end; 1756 1839 1757 1840 procedure TCpuZ80.INC_D; 1758 1841 begin 1759 NotImplemented;1842 Inc(DE.D); 1760 1843 end; 1761 1844 1762 1845 procedure TCpuZ80.DEC_D; 1763 1846 begin 1764 NotImplemented;1847 Dec(DE.D); 1765 1848 end; 1766 1849 1767 1850 procedure TCpuZ80.LD_D_N; 1768 1851 begin 1769 NotImplemented;1852 DE.D := ReadByte; 1770 1853 end; 1771 1854 … … 1782 1865 procedure TCpuZ80.ADD_HL_DE; 1783 1866 begin 1784 NotImplemented;1867 AddWord(HL.Value, DE.Value); 1785 1868 end; 1786 1869 1787 1870 procedure TCpuZ80.LD_A_DE_Indirect; 1788 1871 begin 1789 NotImplemented;1872 A := DoRead(DE.Value); 1790 1873 end; 1791 1874 1792 1875 procedure TCpuZ80.DEC_DE; 1793 1876 begin 1794 NotImplemented;1877 Dec(DE.Value); 1795 1878 end; 1796 1879 1797 1880 procedure TCpuZ80.INC_E; 1798 1881 begin 1799 NotImplemented;1882 Inc(DE.E); 1800 1883 end; 1801 1884 1802 1885 procedure TCpuZ80.DEC_E; 1803 1886 begin 1804 NotImplemented;1887 Dec(DE.E); 1805 1888 end; 1806 1889 1807 1890 procedure TCpuZ80.LD_E_N; 1808 1891 begin 1809 NotImplemented;1892 DE.E := ReadByte; 1810 1893 end; 1811 1894 … … 1827 1910 procedure TCpuZ80.LD_NN_Indirect_HL; 1828 1911 begin 1829 NotImplemented;1912 DoWrite(ReadWord, HL.Value); 1830 1913 end; 1831 1914 … … 1837 1920 procedure TCpuZ80.INC_H; 1838 1921 begin 1839 NotImplemented;1922 Inc(HL.H); 1840 1923 end; 1841 1924 1842 1925 procedure TCpuZ80.DEC_H; 1843 1926 begin 1844 NotImplemented;1927 Dec(HL.H); 1845 1928 end; 1846 1929 1847 1930 procedure TCpuZ80.LD_H_N; 1848 1931 begin 1849 NotImplemented;1932 HL.H := ReadByte; 1850 1933 end; 1851 1934 … … 1857 1940 procedure TCpuZ80.JR_Z_D; 1858 1941 begin 1859 NotImplemented;1942 Jr(Zero); 1860 1943 end; 1861 1944 1862 1945 procedure TCpuZ80.ADD_HL_HL; 1863 1946 begin 1864 NotImplemented;1947 AddWord(Hl.Value, HL.Value); 1865 1948 end; 1866 1949 1867 1950 procedure TCpuZ80.LD_HL_NN_Indirect; 1868 1951 begin 1869 NotImplemented;1952 HL.Value := DoRead(ReadWord); 1870 1953 end; 1871 1954 … … 1877 1960 procedure TCpuZ80.INC_L; 1878 1961 begin 1879 NotImplemented;1962 Inc(HL.L); 1880 1963 end; 1881 1964 1882 1965 procedure TCpuZ80.DEC_L; 1883 1966 begin 1884 NotImplemented;1967 Dec(HL.L); 1885 1968 end; 1886 1969 1887 1970 procedure TCpuZ80.LD_L_N; 1888 1971 begin 1889 NotImplemented;1972 HL.L := ReadByte; 1890 1973 end; 1891 1974 … … 1912 1995 procedure TCpuZ80.INC_SP; 1913 1996 begin 1914 NotImplemented;1997 Inc(SP); 1915 1998 end; 1916 1999 1917 2000 procedure TCpuZ80.INC_HL_Indirect; 1918 2001 begin 1919 NotImplemented;2002 DoWrite(HL.Value, DoRead(HL.Value) + 1); 1920 2003 end; 1921 2004 1922 2005 procedure TCpuZ80.DEC_HL_Indirect; 1923 2006 begin 1924 NotImplemented;2007 DoWrite(HL.Value, DoRead(HL.Value) - 1); 1925 2008 end; 1926 2009 … … 1937 2020 procedure TCpuZ80.JR_C_D; 1938 2021 begin 1939 NotImplemented;2022 Jr(Carry); 1940 2023 end; 1941 2024 1942 2025 procedure TCpuZ80.ADD_HL_SP; 1943 2026 begin 1944 NotImplemented;2027 AddWord(HL.Value, SP); 1945 2028 end; 1946 2029 … … 1952 2035 procedure TCpuZ80.DEC_SP; 1953 2036 begin 1954 NotImplemented;2037 Dec(SP); 1955 2038 end; 1956 2039 1957 2040 procedure TCpuZ80.INC_A; 1958 2041 begin 1959 NotImplemented;2042 Inc(A); 1960 2043 end; 1961 2044 1962 2045 procedure TCpuZ80.DEC_A; 1963 2046 begin 1964 NotImplemented;2047 Dec(A); 1965 2048 end; 1966 2049 … … 1972 2055 procedure TCpuZ80.CCF; 1973 2056 begin 1974 NotImplemented;2057 Carry := not Carry; 1975 2058 end; 1976 2059 1977 2060 procedure TCpuZ80.LD_B_B; 1978 2061 begin 1979 NotImplemented;2062 BC.B := BC.B; 1980 2063 end; 1981 2064 1982 2065 procedure TCpuZ80.LD_B_C; 1983 2066 begin 1984 NotImplemented;2067 BC.B := BC.C; 1985 2068 end; 1986 2069 1987 2070 procedure TCpuZ80.LD_B_D; 1988 2071 begin 1989 NotImplemented;2072 BC.B := DE.D; 1990 2073 end; 1991 2074 1992 2075 procedure TCpuZ80.LD_B_E; 1993 2076 begin 1994 NotImplemented;2077 BC.B := DE.E; 1995 2078 end; 1996 2079 1997 2080 procedure TCpuZ80.LD_B_H; 1998 2081 begin 1999 NotImplemented;2082 BC.B := HL.H; 2000 2083 end; 2001 2084 2002 2085 procedure TCpuZ80.LD_B_L; 2003 2086 begin 2004 NotImplemented;2087 BC.B := HL.L; 2005 2088 end; 2006 2089 2007 2090 procedure TCpuZ80.LD_B_HL_Indirect; 2008 2091 begin 2009 NotImplemented;2092 BC.B := DoRead(HL.Value); 2010 2093 end; 2011 2094 … … 2017 2100 procedure TCpuZ80.LD_C_B; 2018 2101 begin 2019 NotImplemented;2102 BC.C := BC.B; 2020 2103 end; 2021 2104 2022 2105 procedure TCpuZ80.LD_C_C; 2023 2106 begin 2024 NotImplemented;2107 BC.C := BC.C; 2025 2108 end; 2026 2109 2027 2110 procedure TCpuZ80.LD_C_D; 2028 2111 begin 2029 NotImplemented;2112 BC.C := DE.D; 2030 2113 end; 2031 2114 2032 2115 procedure TCpuZ80.LD_C_E; 2033 2116 begin 2034 NotImplemented;2117 BC.C := DE.E; 2035 2118 end; 2036 2119 2037 2120 procedure TCpuZ80.LD_C_H; 2038 2121 begin 2039 NotImplemented;2122 BC.C := HL.H; 2040 2123 end; 2041 2124 2042 2125 procedure TCpuZ80.LD_C_L; 2043 2126 begin 2044 NotImplemented;2127 BC.C := HL.L; 2045 2128 end; 2046 2129 … … 2057 2140 procedure TCpuZ80.LD_D_B; 2058 2141 begin 2059 NotImplemented;2142 DE.D := BC.B; 2060 2143 end; 2061 2144 2062 2145 procedure TCpuZ80.LD_D_C; 2063 2146 begin 2064 NotImplemented;2147 DE.D := BC.C; 2065 2148 end; 2066 2149 2067 2150 procedure TCpuZ80.LD_D_D; 2068 2151 begin 2069 NotImplemented;2152 DE.D := DE.D; 2070 2153 end; 2071 2154 2072 2155 procedure TCpuZ80.LD_D_E; 2073 2156 begin 2074 NotImplemented;2157 DE.D := DE.E; 2075 2158 end; 2076 2159 2077 2160 procedure TCpuZ80.LD_D_H; 2078 2161 begin 2079 NotImplemented;2162 DE.D := HL.H; 2080 2163 end; 2081 2164 2082 2165 procedure TCpuZ80.LD_D_L; 2083 2166 begin 2084 NotImplemented;2167 DE.D := HL.L; 2085 2168 end; 2086 2169 2087 2170 procedure TCpuZ80.LD_D_HL_Indirect; 2088 2171 begin 2089 NotImplemented;2172 DE.D := DoRead(HL.Value); 2090 2173 end; 2091 2174 2092 2175 procedure TCpuZ80.LD_D_A; 2093 2176 begin 2094 NotImplemented;2177 DE.D := A; 2095 2178 end; 2096 2179 2097 2180 procedure TCpuZ80.LD_E_B; 2098 2181 begin 2099 NotImplemented;2182 DE.E := BC.B; 2100 2183 end; 2101 2184 2102 2185 procedure TCpuZ80.LD_E_C; 2103 2186 begin 2104 NotImplemented;2187 DE.E := BC.C; 2105 2188 end; 2106 2189 2107 2190 procedure TCpuZ80.LD_E_D; 2108 2191 begin 2109 NotImplemented;2192 DE.E := DE.D; 2110 2193 end; 2111 2194 2112 2195 procedure TCpuZ80.LD_E_E; 2113 2196 begin 2114 NotImplemented;2197 DE.E := DE.E; 2115 2198 end; 2116 2199 2117 2200 procedure TCpuZ80.LD_E_H; 2118 2201 begin 2119 NotImplemented;2202 DE.E := HL.H; 2120 2203 end; 2121 2204 2122 2205 procedure TCpuZ80.LD_E_L; 2123 2206 begin 2124 NotImplemented;2207 DE.E := HL.L; 2125 2208 end; 2126 2209 2127 2210 procedure TCpuZ80.LD_E_HL_Indirect; 2128 2211 begin 2129 NotImplemented;2212 DE.E := DoRead(HL.Value); 2130 2213 end; 2131 2214 2132 2215 procedure TCpuZ80.LD_E_A; 2133 2216 begin 2134 NotImplemented;2217 DE.E := A; 2135 2218 end; 2136 2219 … … 2142 2225 procedure TCpuZ80.LD_H_C; 2143 2226 begin 2144 NotImplemented;2227 HL.H := BC.C; 2145 2228 end; 2146 2229 2147 2230 procedure TCpuZ80.LD_H_D; 2148 2231 begin 2149 NotImplemented;2232 HL.H := DE.D; 2150 2233 end; 2151 2234 2152 2235 procedure TCpuZ80.LD_H_E; 2153 2236 begin 2154 NotImplemented;2237 HL.H := DE.E; 2155 2238 end; 2156 2239 2157 2240 procedure TCpuZ80.LD_H_H; 2158 2241 begin 2159 NotImplemented;2242 HL.H := HL.H; 2160 2243 end; 2161 2244 2162 2245 procedure TCpuZ80.LD_H_L; 2163 2246 begin 2164 NotImplemented;2247 HL.H := HL.L; 2165 2248 end; 2166 2249 2167 2250 procedure TCpuZ80.LD_H_HL_Indirect; 2168 2251 begin 2169 NotImplemented;2252 HL.H := DoRead(HL.Value); 2170 2253 end; 2171 2254 2172 2255 procedure TCpuZ80.LD_H_A; 2173 2256 begin 2174 NotImplemented;2257 HL.H := A; 2175 2258 end; 2176 2259 2177 2260 procedure TCpuZ80.LD_L_B; 2178 2261 begin 2179 NotImplemented;2262 HL.L := BC.B; 2180 2263 end; 2181 2264 … … 2187 2270 procedure TCpuZ80.LD_L_D; 2188 2271 begin 2189 NotImplemented;2272 HL.L := DE.D; 2190 2273 end; 2191 2274 2192 2275 procedure TCpuZ80.LD_L_E; 2193 2276 begin 2194 NotImplemented;2277 HL.L := DE.E; 2195 2278 end; 2196 2279 2197 2280 procedure TCpuZ80.LD_L_H; 2198 2281 begin 2199 NotImplemented;2282 HL.L := HL.H; 2200 2283 end; 2201 2284 2202 2285 procedure TCpuZ80.LD_L_L; 2203 2286 begin 2204 NotImplemented;2287 HL.L := HL.L; 2205 2288 end; 2206 2289 2207 2290 procedure TCpuZ80.LD_L_HL_Indirect; 2208 2291 begin 2209 NotImplemented;2292 HL.L := DoRead(HL.Value); 2210 2293 end; 2211 2294 2212 2295 procedure TCpuZ80.LD_L_A; 2213 2296 begin 2214 NotImplemented;2297 HL.L := A; 2215 2298 end; 2216 2299 2217 2300 procedure TCpuZ80.LD_HL_Indirect_B; 2218 2301 begin 2219 NotImplemented;2302 DoWrite(HL.Value, BC.B); 2220 2303 end; 2221 2304 2222 2305 procedure TCpuZ80.LD_HL_Indirect_C; 2223 2306 begin 2224 NotImplemented;2307 DoWrite(HL.Value, BC.C); 2225 2308 end; 2226 2309 … … 2237 2320 procedure TCpuZ80.LD_HL_Indirect_H; 2238 2321 begin 2239 NotImplemented;2322 DoWrite(HL.Value, HL.H); 2240 2323 end; 2241 2324 2242 2325 procedure TCpuZ80.LD_HL_Indirect_L; 2243 2326 begin 2244 NotImplemented;2327 DoWrite(HL.Value, HL.L); 2245 2328 end; 2246 2329 … … 2252 2335 procedure TCpuZ80.LD_HL_Indirect_A; 2253 2336 begin 2254 NotImplemented;2337 DoWrite(HL.Value, A); 2255 2338 end; 2256 2339 2257 2340 procedure TCpuZ80.LD_A_B; 2258 2341 begin 2259 NotImplemented;2342 A := BC.B; 2260 2343 end; 2261 2344 … … 2267 2350 procedure TCpuZ80.LD_A_D; 2268 2351 begin 2269 NotImplemented;2352 A := DE.D; 2270 2353 end; 2271 2354 2272 2355 procedure TCpuZ80.LD_A_E; 2273 2356 begin 2274 NotImplemented;2357 A := DE.E; 2275 2358 end; 2276 2359 2277 2360 procedure TCpuZ80.LD_A_H; 2278 2361 begin 2279 NotImplemented;2362 A := HL.H; 2280 2363 end; 2281 2364 2282 2365 procedure TCpuZ80.LD_A_L; 2283 2366 begin 2284 NotImplemented;2367 A := HL.L; 2285 2368 end; 2286 2369 … … 2292 2375 procedure TCpuZ80.LD_A_A; 2293 2376 begin 2294 NotImplemented;2377 A := A; 2295 2378 end; 2296 2379 2297 2380 procedure TCpuZ80.ADD_A_B; 2298 2381 begin 2299 NotImplemented;2382 AddByte(A, BC.B); 2300 2383 end; 2301 2384 2302 2385 procedure TCpuZ80.ADD_A_C; 2303 2386 begin 2304 NotImplemented;2387 AddByte(A, BC.C); 2305 2388 end; 2306 2389 2307 2390 procedure TCpuZ80.ADD_A_D; 2308 2391 begin 2309 NotImplemented;2392 AddByte(A, DE.D); 2310 2393 end; 2311 2394 2312 2395 procedure TCpuZ80.ADD_A_E; 2313 2396 begin 2314 NotImplemented;2397 AddByte(A, DE.E); 2315 2398 end; 2316 2399 2317 2400 procedure TCpuZ80.ADD_A_H; 2318 2401 begin 2319 NotImplemented;2402 AddByte(A, HL.H); 2320 2403 end; 2321 2404 2322 2405 procedure TCpuZ80.ADD_A_L; 2323 2406 begin 2324 NotImplemented;2407 AddByte(A, HL.L); 2325 2408 end; 2326 2409 2327 2410 procedure TCpuZ80.ADD_A_HL_Indirect; 2328 2411 begin 2329 NotImplemented;2412 AddByte(A, DoRead(HL.Value)); 2330 2413 end; 2331 2414 2332 2415 procedure TCpuZ80.ADD_A_A; 2333 2416 begin 2334 NotImplemented;2417 AddByte(A, A); 2335 2418 end; 2336 2419 2337 2420 procedure TCpuZ80.ADC_A_B; 2338 2421 begin 2339 NotImplemented;2422 AdcByte(A, BC.B); 2340 2423 end; 2341 2424 2342 2425 procedure TCpuZ80.ADC_A_C; 2343 2426 begin 2344 NotImplemented;2427 AdcByte(A, BC.C); 2345 2428 end; 2346 2429 2347 2430 procedure TCpuZ80.ADC_A_D; 2348 2431 begin 2349 NotImplemented;2432 AdcByte(A, DE.D); 2350 2433 end; 2351 2434 2352 2435 procedure TCpuZ80.ADC_A_E; 2353 2436 begin 2354 NotImplemented;2437 AdcByte(A, DE.E); 2355 2438 end; 2356 2439 2357 2440 procedure TCpuZ80.ADC_A_H; 2358 2441 begin 2359 NotImplemented;2442 AdcByte(A, HL.H); 2360 2443 end; 2361 2444 2362 2445 procedure TCpuZ80.ADC_A_L; 2363 2446 begin 2364 NotImplemented;2447 AdcByte(A, HL.L); 2365 2448 end; 2366 2449 2367 2450 procedure TCpuZ80.ADC_A_HL_Indirect; 2368 2451 begin 2369 NotImplemented;2452 AdcByte(A, DoRead(HL.Value)); 2370 2453 end; 2371 2454 2372 2455 procedure TCpuZ80.ADC_A_A; 2373 2456 begin 2374 NotImplemented;2457 AdcByte(A, A); 2375 2458 end; 2376 2459 2377 2460 procedure TCpuZ80.SUB_B; 2378 2461 begin 2379 NotImplemented;2462 SubByte(A, BC.B); 2380 2463 end; 2381 2464 2382 2465 procedure TCpuZ80.SUB_C; 2383 2466 begin 2384 NotImplemented;2467 SubByte(A, BC.C); 2385 2468 end; 2386 2469 2387 2470 procedure TCpuZ80.SUB_D; 2388 2471 begin 2389 NotImplemented;2472 SubByte(A, DE.D); 2390 2473 end; 2391 2474 2392 2475 procedure TCpuZ80.SUB_E; 2393 2476 begin 2394 NotImplemented;2477 SubByte(A, DE.E); 2395 2478 end; 2396 2479 2397 2480 procedure TCpuZ80.SUB_H; 2398 2481 begin 2399 NotImplemented;2482 SubByte(A, HL.H); 2400 2483 end; 2401 2484 2402 2485 procedure TCpuZ80.SUB_L; 2403 2486 begin 2404 NotImplemented;2487 SubByte(A, HL.L); 2405 2488 end; 2406 2489 2407 2490 procedure TCpuZ80.SUB_HL_Indirect; 2408 2491 begin 2409 NotImplemented;2492 SubByte(A, DoRead(HL.Value)); 2410 2493 end; 2411 2494 2412 2495 procedure TCpuZ80.SUB_A; 2413 2496 begin 2414 NotImplemented;2497 SubByte(A, A); 2415 2498 end; 2416 2499 2417 2500 procedure TCpuZ80.SBC_A_B; 2418 2501 begin 2419 NotImplemented;2502 SbcByte(A, BC.B); 2420 2503 end; 2421 2504 2422 2505 procedure TCpuZ80.SBC_A_C; 2423 2506 begin 2424 NotImplemented;2507 SbcByte(A, BC.C); 2425 2508 end; 2426 2509 2427 2510 procedure TCpuZ80.SBC_A_D; 2428 2511 begin 2429 NotImplemented;2512 SbcByte(A, DE.D); 2430 2513 end; 2431 2514 2432 2515 procedure TCpuZ80.SBC_A_E; 2433 2516 begin 2434 NotImplemented;2517 SbcByte(A, DE.E); 2435 2518 end; 2436 2519 2437 2520 procedure TCpuZ80.SBC_A_H; 2438 2521 begin 2439 NotImplemented;2522 SbcByte(A, HL.H); 2440 2523 end; 2441 2524 2442 2525 procedure TCpuZ80.SBC_A_L; 2443 2526 begin 2444 NotImplemented;2527 SbcByte(A, HL.L); 2445 2528 end; 2446 2529 2447 2530 procedure TCpuZ80.SBC_A_HL_Indirect; 2448 2531 begin 2449 NotImplemented;2532 SbcByte(A, DoRead(HL.Value)); 2450 2533 end; 2451 2534 2452 2535 procedure TCpuZ80.SBC_A_A; 2453 2536 begin 2454 NotImplemented;2537 SbcByte(A, A); 2455 2538 end; 2456 2539 … … 2502 2585 procedure TCpuZ80.XOR_C; 2503 2586 begin 2504 NotImplemented;2587 A := A xor BC.C; 2505 2588 end; 2506 2589 2507 2590 procedure TCpuZ80.XOR_D; 2508 2591 begin 2509 NotImplemented;2592 A := A xor DE.D; 2510 2593 end; 2511 2594 2512 2595 procedure TCpuZ80.XOR_E; 2513 2596 begin 2514 NotImplemented;2597 A := A xor DE.E; 2515 2598 end; 2516 2599 2517 2600 procedure TCpuZ80.XOR_H; 2518 2601 begin 2519 NotImplemented;2602 A := A xor HL.H; 2520 2603 end; 2521 2604 2522 2605 procedure TCpuZ80.XOR_L; 2523 2606 begin 2524 NotImplemented;2607 A := A xor HL.L; 2525 2608 end; 2526 2609 2527 2610 procedure TCpuZ80.XOR_HL_Indirect; 2528 2611 begin 2529 NotImplemented;2612 A := A xor DoRead(HL.Value); 2530 2613 end; 2531 2614 … … 2537 2620 procedure TCpuZ80.OR_B; 2538 2621 begin 2539 NotImplemented;2622 A := A or BC.B; 2540 2623 end; 2541 2624 2542 2625 procedure TCpuZ80.OR_C; 2543 2626 begin 2544 NotImplemented;2627 A := A or BC.C; 2545 2628 end; 2546 2629 2547 2630 procedure TCpuZ80.OR_D; 2548 2631 begin 2549 NotImplemented;2632 A := A or DE.D; 2550 2633 end; 2551 2634 2552 2635 procedure TCpuZ80.OR_E; 2553 2636 begin 2554 NotImplemented;2637 A := A or DE.E; 2555 2638 end; 2556 2639 2557 2640 procedure TCpuZ80.OR_H; 2558 2641 begin 2559 NotImplemented;2642 A := A or HL.H; 2560 2643 end; 2561 2644 2562 2645 procedure TCpuZ80.OR_L; 2563 2646 begin 2564 NotImplemented;2647 A := A or HL.L; 2565 2648 end; 2566 2649 2567 2650 procedure TCpuZ80.OR_HL_Indirect; 2568 2651 begin 2569 NotImplemented;2652 A := A or DoRead(HL.Value); 2570 2653 end; 2571 2654 … … 2577 2660 procedure TCpuZ80.CP_B; 2578 2661 begin 2579 NotImplemented;2662 Cp(BC.B); 2580 2663 end; 2581 2664 2582 2665 procedure TCpuZ80.CP_C; 2583 2666 begin 2584 NotImplemented;2667 Cp(BC.C); 2585 2668 end; 2586 2669 … … 2597 2680 procedure TCpuZ80.CP_H; 2598 2681 begin 2599 NotImplemented;2682 Cp(HL.H); 2600 2683 end; 2601 2684 2602 2685 procedure TCpuZ80.CP_L; 2603 2686 begin 2604 NotImplemented;2687 Cp(HL.L); 2605 2688 end; 2606 2689 2607 2690 procedure TCpuZ80.CP_HL_Indirect; 2608 2691 begin 2609 NotImplemented;2692 CP(DoRead(HL.Value)); 2610 2693 end; 2611 2694 2612 2695 procedure TCpuZ80.CP_A; 2613 2696 begin 2614 NotImplemented;2697 CP(A); 2615 2698 end; 2616 2699 2617 2700 procedure TCpuZ80.RET_NZ; 2618 2701 begin 2619 NotImplemented;2702 RetCond(not Zero); 2620 2703 end; 2621 2704 2622 2705 procedure TCpuZ80.POP_BC; 2623 2706 begin 2624 NotImplemented;2707 BC.Value := PopWord; 2625 2708 end; 2626 2709 … … 2637 2720 procedure TCpuZ80.CALL_NZ_NN; 2638 2721 begin 2639 NotImplemented;2722 CallCond(ReadWord, not Zero); 2640 2723 end; 2641 2724 … … 2647 2730 procedure TCpuZ80.ADD_A_N; 2648 2731 begin 2649 NotImplemented;2732 AddByte(A, ReadByte); 2650 2733 end; 2651 2734 … … 2667 2750 procedure TCpuZ80.JP_Z_NN; 2668 2751 begin 2669 NotImplemented;2752 Jp(Zero); 2670 2753 end; 2671 2754 2672 2755 procedure TCpuZ80.CALL_Z_NN; 2673 2756 begin 2674 NotImplemented;2757 CallCond(ReadWord, Zero); 2675 2758 end; 2676 2759 … … 2689 2772 procedure TCpuZ80.ADC_A_N; 2690 2773 begin 2691 NotImplemented;2774 AdcByte(A, ReadByte); 2692 2775 end; 2693 2776 … … 2699 2782 procedure TCpuZ80.RET_NC; 2700 2783 begin 2701 NotImplemented;2784 RetCond(not Carry); 2702 2785 end; 2703 2786 2704 2787 procedure TCpuZ80.POP_DE; 2705 2788 begin 2706 NotImplemented;2789 DE.Value := PopWord; 2707 2790 end; 2708 2791 2709 2792 procedure TCpuZ80.JP_NC_NN; 2710 2793 begin 2711 NotImplemented;2794 Jp(not Carry); 2712 2795 end; 2713 2796 … … 2719 2802 procedure TCpuZ80.CALL_NC_NN; 2720 2803 begin 2721 NotImplemented;2804 CallCond(ReadWord, not Carry); 2722 2805 end; 2723 2806 … … 2729 2812 procedure TCpuZ80.SUB_N; 2730 2813 begin 2731 NotImplemented;2814 SubByte(A, ReadByte); 2732 2815 end; 2733 2816 … … 2739 2822 procedure TCpuZ80.RET_C; 2740 2823 begin 2741 NotImplemented;2824 RetCond(Carry); 2742 2825 end; 2743 2826 … … 2749 2832 procedure TCpuZ80.JP_C_NN; 2750 2833 begin 2751 NotImplemented;2834 Jp(Carry); 2752 2835 end; 2753 2836 … … 2759 2842 procedure TCpuZ80.CALL_C_NN; 2760 2843 begin 2761 NotImplemented;2844 CallCond(ReadWord, Carry); 2762 2845 end; 2763 2846 2764 2847 procedure TCpuZ80.SBC_A_N; 2765 2848 begin 2766 NotImplemented;2849 SbcByte(A, ReadByte); 2767 2850 end; 2768 2851 … … 2774 2857 procedure TCpuZ80.RET_PO; 2775 2858 begin 2776 NotImplemented;2859 RetCond(not ParityOverflow); 2777 2860 end; 2778 2861 2779 2862 procedure TCpuZ80.POP_HL; 2780 2863 begin 2781 NotImplemented;2864 HL.Value := PopWord; 2782 2865 end; 2783 2866 … … 2819 2902 procedure TCpuZ80.JP_HL_Indirect; 2820 2903 begin 2821 NotImplemented;2904 PC := DoRead(HL.Value); 2822 2905 end; 2823 2906 … … 2843 2926 procedure TCpuZ80.XOR_N; 2844 2927 begin 2845 NotImplemented;2928 XorByte(A, ReadByte); 2846 2929 end; 2847 2930 … … 2858 2941 procedure TCpuZ80.POP_AF; 2859 2942 begin 2860 NotImplemented;2943 A := PopWord and $ff; 2861 2944 end; 2862 2945 … … 2883 2966 procedure TCpuZ80.OR_N; 2884 2967 begin 2885 NotImplemented;2968 OrByte(A, ReadByte); 2886 2969 end; 2887 2970 … … 2898 2981 procedure TCpuZ80.LD_SP_HL; 2899 2982 begin 2900 NotImplemented;2983 SP := HL.Value; 2901 2984 end; 2902 2985 … … 2928 3011 procedure TCpuZ80.IN_B_C_Indirect; 2929 3012 begin 2930 NotImplemented;3013 BC.B := DoInput(BC.Value); 2931 3014 end; 2932 3015 2933 3016 procedure TCpuZ80.OUT_C_Indirect_B; 2934 3017 begin 2935 NotImplemented;3018 BC.C := DoInput(BC.Value); 2936 3019 end; 2937 3020 2938 3021 procedure TCpuZ80.SBC_HL_BC; 2939 3022 begin 2940 NotImplemented;3023 SbcWord(HL.Value, BC.Value); 2941 3024 end; 2942 3025 2943 3026 procedure TCpuZ80.LD_NN_Indirect_BC; 2944 3027 begin 2945 NotImplemented;3028 DoWrite(ReadWord, BC.Value); 2946 3029 end; 2947 3030 … … 2953 3036 procedure TCpuZ80.RETN; 2954 3037 begin 2955 NotImplemented; 3038 InterruptEnabled := False; 3039 PC := PopWord; 2956 3040 end; 2957 3041 2958 3042 procedure TCpuZ80.IM_0; 2959 3043 begin 2960 NotImplemented;3044 InterruptMode := 0; 2961 3045 end; 2962 3046 … … 2988 3072 procedure TCpuZ80.RETI; 2989 3073 begin 2990 NotImplemented; 3074 InterruptEnabled := False; 3075 PC := PopWord; 2991 3076 end; 2992 3077 … … 3003 3088 procedure TCpuZ80.OUT_C_Indirect_D; 3004 3089 begin 3005 NotImplemented;3090 DoOutput(BC.Value, DE.D); 3006 3091 end; 3007 3092 3008 3093 procedure TCpuZ80.SBC_HL_DE; 3009 3094 begin 3010 HL.Value := HL.Value - DE.Value;3095 SbcWord(HL.Value, DE.Value); 3011 3096 end; 3012 3097 3013 3098 procedure TCpuZ80.LD_NN_Indirect_DE; 3014 3099 begin 3015 NotImplemented;3100 DoWriteWord(ReadWord, DE.Value); 3016 3101 end; 3017 3102 … … 3028 3113 procedure TCpuZ80.IN_E_C_Indirect; 3029 3114 begin 3030 NotImplemented;3115 DE.E := DoInput(BC.Value); 3031 3116 end; 3032 3117 3033 3118 procedure TCpuZ80.OUT_C_Indirect_E; 3034 3119 begin 3035 NotImplemented;3120 DoOutput(BC.Value, DE.E); 3036 3121 end; 3037 3122 3038 3123 procedure TCpuZ80.ADC_HL_DE; 3039 3124 begin 3040 NotImplemented;3125 AdcWord(HL.Value, DE.Value); 3041 3126 end; 3042 3127 3043 3128 procedure TCpuZ80.LD_DE_NN_Indirect; 3044 3129 begin 3045 NotImplemented;3130 DE.Value := DoReadWord(ReadWord); 3046 3131 end; 3047 3132 3048 3133 procedure TCpuZ80.IM_2; 3049 3134 begin 3050 NotImplemented;3135 InterruptMode := 2; 3051 3136 end; 3052 3137 … … 3058 3143 procedure TCpuZ80.IN_H_C_Indirect; 3059 3144 begin 3060 NotImplemented;3145 HL.H := DoInput(BC.Value); 3061 3146 end; 3062 3147 3063 3148 procedure TCpuZ80.OUT_C_Indirect_H; 3064 3149 begin 3065 NotImplemented;3150 DoOutput(BC.Value, HL.H); 3066 3151 end; 3067 3152 3068 3153 procedure TCpuZ80.SBC_HL_HL; 3069 3154 begin 3070 NotImplemented;3155 SbcWord(HL.Value, HL.Value); 3071 3156 end; 3072 3157 … … 3078 3163 procedure TCpuZ80.IN_L_C_Indirect; 3079 3164 begin 3080 NotImplemented;3165 HL.L := DoInput(BC.Value); 3081 3166 end; 3082 3167 3083 3168 procedure TCpuZ80.OUT_C_Indirect_L; 3084 3169 begin 3085 NotImplemented;3170 DoOutput(BC.Value, HL.L); 3086 3171 end; 3087 3172 3088 3173 procedure TCpuZ80.ADC_HL_HL; 3089 3174 begin 3090 NotImplemented;3175 AdcWord(HL.Value, HL.Value); 3091 3176 end; 3092 3177 … … 3098 3183 procedure TCpuZ80.SBC_HL_SP; 3099 3184 begin 3100 NotImplemented;3185 SbcWord(HL.Value, SP); 3101 3186 end; 3102 3187 3103 3188 procedure TCpuZ80.LD_NN_Indirect_SP; 3104 3189 begin 3105 NotImplemented;3190 DoWriteWord(ReadWord, SP); 3106 3191 end; 3107 3192 3108 3193 procedure TCpuZ80.IN_A_C_Indirect; 3109 3194 begin 3110 NotImplemented;3195 A := DoInput(BC.Value); 3111 3196 end; 3112 3197 3113 3198 procedure TCpuZ80.OUT_C_Indirect_A; 3114 3199 begin 3115 NotImplemented;3200 DoOutput(BC.Value, A); 3116 3201 end; 3117 3202 3118 3203 procedure TCpuZ80.ADC_HL_SP; 3119 3204 begin 3120 NotImplemented;3205 AdcWord(Hl.Value, SP); 3121 3206 end; 3122 3207 3123 3208 procedure TCpuZ80.LD_SP_NN_Indirect; 3124 3209 begin 3125 NotImplemented;3210 SP := DoReadWord(ReadWord); 3126 3211 end; 3127 3212 … … 5151 5236 Proc: TEvent; 5152 5237 begin 5238 InstructionAddress := PC; 5153 5239 Opcode := ReadByte; 5154 5240 if Opcode = $CB then begin … … 5169 5255 if Assigned(Proc) then Proc 5170 5256 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)); 5175 5258 end; 5176 5259 Ticks := Cardinal(Ticks + 1);
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)