Mercurial > repos > blastem
comparison z80.cpu @ 2442:52cfc7b14dd2
Sugar for some basic conditionals in CPU DSL
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Sun, 11 Feb 2024 20:41:28 -0800 |
parents | 4435abe5db5e |
children | 461fffc226e0 |
comparison
equal
deleted
inserted
replaced
2441:4435abe5db5e | 2442:52cfc7b14dd2 |
---|---|
88 #printf "Z80: %X - A: %X, B: %X, C: %X D: %X, E: %X, H: %X, L: %X, SP: %X, IX: %X, IY: %X @ %d\n" pc a b c d e h l sp ix iy cycles | 88 #printf "Z80: %X - A: %X, B: %X, C: %X D: %X, E: %X, H: %X, L: %X, SP: %X, IX: %X, IY: %X @ %d\n" pc a b c d e h l sp ix iy cycles |
89 z80_op_fetch | 89 z80_op_fetch |
90 dispatch scratch1 | 90 dispatch scratch1 |
91 | 91 |
92 z80_interrupt | 92 z80_interrupt |
93 cmp int_cycle cycles | 93 if cycles >=U int_cycle |
94 if >=U | |
95 | 94 |
96 iff1 = 0 | 95 iff1 = 0 |
97 iff2 = 0 | 96 iff2 = 0 |
98 cycles 6 | 97 cycles 6 |
99 update_sync | 98 update_sync |
104 | 103 |
105 case 1 | 104 case 1 |
106 dispatch 0xFF | 105 dispatch 0xFF |
107 | 106 |
108 case 2 | 107 case 2 |
109 lsl i 8 pc | 108 pc = i << 8 |
110 pc |= int_value | 109 pc |= int_value |
111 #CD is call | 110 #CD is call |
112 dispatch 0xCD | 111 dispatch 0xCD |
113 end | 112 end |
114 | 113 |
115 else | 114 else |
116 | 115 if cycles >=U nmi_cycle |
117 cmp nmi_cycle cycles | |
118 if >=U | |
119 | 116 |
120 nmi_cycle = 0xFFFFFFFF | 117 nmi_cycle = 0xFFFFFFFF |
121 iff1 = 0 | 118 iff1 = 0 |
122 local pch 8 | 119 local pch 8 |
123 lsr pc 8 pch | 120 pch = pc >> 8 |
124 meta high pch | 121 meta high pch |
125 meta low pc | 122 meta low pc |
126 z80_push | 123 z80_push |
127 pc = 0x66 | 124 pc = 0x66 |
128 update_sync | 125 update_sync |
129 | 126 |
130 end | 127 end |
131 end | 128 end |
132 | 129 |
133 | 130 |
1549 | 1546 |
1550 00000000 nop | 1547 00000000 nop |
1551 | 1548 |
1552 01110110 halt | 1549 01110110 halt |
1553 cmp nmi_cycle cycles | 1550 cmp nmi_cycle cycles |
1554 if >=U | 1551 if cycles >=U nmi_cycle |
1555 | 1552 |
1556 else | 1553 else |
1557 cmp int_cycle cycles | 1554 if cycles >=U int_cycle |
1558 if >=U | 1555 |
1559 | 1556 if iff1 |
1560 if iff1 | 1557 else |
1561 else | 1558 pc -= 1 |
1562 sub 1 pc pc | 1559 end |
1560 | |
1561 else | |
1562 pc -= 1 | |
1563 end | |
1563 end | 1564 end |
1564 | |
1565 else | |
1566 sub 1 pc pc | |
1567 end | |
1568 end | |
1569 | 1565 |
1570 11110011 di | 1566 11110011 di |
1571 mov 0 iff1 | 1567 iff1 = 0 |
1572 mov 0 iff2 | 1568 iff2 = 0 |
1573 update_sync | 1569 update_sync |
1574 | 1570 |
1575 11111011 ei | 1571 11111011 ei |
1576 mov 1 iff1 | 1572 iff1 = 1 |
1577 mov 1 iff2 | 1573 iff2 = 1 |
1578 update_sync | 1574 update_sync |
1579 cmp int_cycle cycles | 1575 |
1580 if >=U | 1576 if cycles >=U int_cycle |
1581 | 1577 int_cycle = cycles + 1 |
1582 add 1 cycles int_cycle | |
1583 | |
1584 end | 1578 end |
1585 | 1579 |
1586 ed 01D00110 im0 | 1580 ed 01D00110 im0 |
1587 mov 0 imode | 1581 mov 0 imode |
1588 | 1582 |
1613 | 1607 |
1614 11CCC010 jp_cc | 1608 11CCC010 jp_cc |
1615 z80_check_cond C | 1609 z80_check_cond C |
1616 z80_fetch_immed16 | 1610 z80_fetch_immed16 |
1617 if istrue | 1611 if istrue |
1618 | 1612 pc = wz |
1619 mov wz pc | |
1620 | |
1621 end | 1613 end |
1622 | 1614 |
1623 00011000 jr | 1615 00011000 jr |
1624 z80_fetch_immed | 1616 z80_fetch_immed |
1625 #TODO: determine if this updates wz | 1617 #TODO: determine if this updates wz |
1630 001CC000 jr_cc | 1622 001CC000 jr_cc |
1631 z80_check_cond C | 1623 z80_check_cond C |
1632 z80_fetch_immed | 1624 z80_fetch_immed |
1633 | 1625 |
1634 if istrue | 1626 if istrue |
1635 | 1627 sext 16 scratch1 scratch1 |
1636 sext 16 scratch1 scratch1 | 1628 pc += scratch1 |
1637 add scratch1 pc pc | 1629 cycles 5 |
1638 cycles 5 | |
1639 | |
1640 end | 1630 end |
1641 | 1631 |
1642 00010000 djnz | 1632 00010000 djnz |
1643 cycles 1 | 1633 cycles 1 |
1644 z80_fetch_immed | 1634 z80_fetch_immed |
1645 sub 1 b b | 1635 b -= 1 |
1646 | 1636 |
1647 if b | 1637 if b |
1648 | 1638 sext 16 scratch1 scratch1 |
1649 sext 16 scratch1 scratch1 | 1639 pc += scratch1 |
1650 add scratch1 pc pc | 1640 cycles 5 |
1651 cycles 5 | |
1652 | |
1653 end | 1641 end |
1654 | 1642 |
1655 | 1643 |
1656 11001101 call_uncond | 1644 11001101 call_uncond |
1657 z80_fetch_immed16 | 1645 z80_fetch_immed16 |
1666 local pch 8 | 1654 local pch 8 |
1667 z80_fetch_immed16 | 1655 z80_fetch_immed16 |
1668 z80_check_cond C | 1656 z80_check_cond C |
1669 | 1657 |
1670 if istrue | 1658 if istrue |
1671 | 1659 pch = pc >> 8 |
1672 lsr pc 8 pch | 1660 meta high pch |
1673 meta high pch | 1661 meta low pc |
1674 meta low pc | 1662 z80_push |
1675 z80_push | 1663 pc = wz |
1676 mov wz pc | |
1677 | |
1678 end | 1664 end |
1679 | 1665 |
1680 11TTT111 rst | 1666 11TTT111 rst |
1681 local pch 8 | 1667 local pch 8 |
1682 lsr pc 8 pch | 1668 lsr pc 8 pch |
1716 11CCC000 ret_cond | 1702 11CCC000 ret_cond |
1717 local pch 16 | 1703 local pch 16 |
1718 cycles 1 | 1704 cycles 1 |
1719 z80_check_cond C | 1705 z80_check_cond C |
1720 if istrue | 1706 if istrue |
1721 | 1707 meta high pch |
1722 meta high pch | 1708 meta low pc |
1723 meta low pc | 1709 z80_pop |
1724 z80_pop | 1710 pch = pch << 8 |
1725 lsl pch 8 pch | 1711 pc |= pch |
1726 or pch pc pc | |
1727 | |
1728 end | 1712 end |
1729 | 1713 |
1730 11011011 in_abs | 1714 11011011 in_abs |
1731 z80_fetch_immed | 1715 z80_fetch_immed |
1732 ocall io_read8 | 1716 ocall io_read8 |
1779 | 1763 |
1780 ed 10110010 inir | 1764 ed 10110010 inir |
1781 z80_ini_ind 1 | 1765 z80_ini_ind 1 |
1782 if zflag | 1766 if zflag |
1783 else | 1767 else |
1784 sub 2 pc pc | 1768 pc -= 2 |
1785 cycles 5 | 1769 cycles 5 |
1786 end | 1770 end |
1787 | 1771 |
1788 ed 10101010 ind | 1772 ed 10101010 ind |
1789 z80_ini_ind -1 | 1773 z80_ini_ind -1 |
1790 | 1774 |
1791 ed 10111010 indr | 1775 ed 10111010 indr |
1792 z80_ini_ind -1 | 1776 z80_ini_ind -1 |
1793 if zflag | 1777 if zflag |
1794 else | 1778 else |
1795 sub 2 pc pc | 1779 pc -= 2 |
1796 cycles 5 | 1780 cycles 5 |
1797 end | 1781 end |
1798 | 1782 |
1799 11010011 out_abs | 1783 11010011 out_abs |
1800 z80_fetch_immed | 1784 z80_fetch_immed |
1801 mov scratch1 scratch2 | 1785 mov scratch1 scratch2 |
1847 | 1831 |
1848 ed 10110011 otir | 1832 ed 10110011 otir |
1849 z80_outi_outd 1 | 1833 z80_outi_outd 1 |
1850 if zflag | 1834 if zflag |
1851 else | 1835 else |
1852 sub 2 pc pc | 1836 pc -= 2 |
1853 cycles 5 | 1837 cycles 5 |
1854 end | 1838 end |
1855 | 1839 |
1856 ed 10101011 outd | 1840 ed 10101011 outd |
1857 z80_outi_outd -1 | 1841 z80_outi_outd -1 |
1858 | 1842 |
1859 ed 10111011 otdr | 1843 ed 10111011 otdr |
1860 z80_outi_outd -1 | 1844 z80_outi_outd -1 |
1861 if zflag | 1845 if zflag |
1862 else | 1846 else |
1863 sub 2 pc pc | 1847 pc -= 2 |
1864 cycles 5 | 1848 cycles 5 |
1865 end | 1849 end |
1866 | 1850 |
1867 00000111 rlca | 1851 00000111 rlca |
1868 rol a 1 a | 1852 rol a 1 a |
1869 update_flags YH0XN0C | 1853 update_flags YH0XN0C |
2358 z80_ldd_ldi -1 | 2342 z80_ldd_ldi -1 |
2359 | 2343 |
2360 ed 10110000 ldir | 2344 ed 10110000 ldir |
2361 z80_ldd_ldi 1 | 2345 z80_ldd_ldi 1 |
2362 if pvflag | 2346 if pvflag |
2363 | 2347 wz = pc + 1 |
2364 add 1 pc wz | 2348 pc -= 2 |
2365 sub 2 pc pc | 2349 cycles 5 |
2366 cycles 5 | |
2367 | |
2368 end | 2350 end |
2369 | 2351 |
2370 ed 10111000 lddr | 2352 ed 10111000 lddr |
2371 z80_ldd_ldi -1 | 2353 z80_ldd_ldi -1 |
2372 if pvflag | 2354 if pvflag |
2373 | 2355 wz = pc + 1 |
2374 add 1 pc wz | 2356 pc -= 2 |
2375 sub 2 pc pc | 2357 cycles 5 |
2376 cycles 5 | |
2377 | |
2378 end | 2358 end |
2379 | 2359 |
2380 z80_cpd_cpi | 2360 z80_cpd_cpi |
2381 local tmp 16 | 2361 local tmp 16 |
2382 local tmp8 8 | 2362 local tmp8 8 |
2416 z80_cpd_cpi -1 | 2396 z80_cpd_cpi -1 |
2417 | 2397 |
2418 ed 10110001 cpir | 2398 ed 10110001 cpir |
2419 z80_cpd_cpi 1 | 2399 z80_cpd_cpi 1 |
2420 if pvflag | 2400 if pvflag |
2421 | 2401 if zflag |
2422 if zflag | 2402 else |
2423 | 2403 wz = pc + 1 |
2424 else | 2404 pc -= 2 |
2425 | 2405 cycles 5 |
2426 add 1 pc wz | 2406 end |
2427 sub 2 pc pc | |
2428 cycles 5 | |
2429 | |
2430 end | |
2431 end | 2407 end |
2432 | 2408 |
2433 ed 10111001 cpdr | 2409 ed 10111001 cpdr |
2434 z80_cpd_cpi -1 | 2410 z80_cpd_cpi -1 |
2435 if pvflag | 2411 if pvflag |
2436 | 2412 if zflag |
2437 if zflag | 2413 else |
2438 | 2414 wz = pc + 1 |
2439 else | 2415 pc -= 2 |
2440 | 2416 cycles 5 |
2441 add 1 pc wz | 2417 end |
2442 sub 2 pc pc | |
2443 cycles 5 | |
2444 | |
2445 end | |
2446 end | 2418 end |
2447 | 2419 |
2448 00100111 daa | 2420 00100111 daa |
2449 local diff 8 | 2421 local diff 8 |
2450 local tmp 8 | 2422 local tmp 8 |
2451 local low 8 | 2423 local low 8 |
2452 and 0xF a low | 2424 low = a & 0xF |
2453 and 0x8 chflags tmp | 2425 tmp = chflags & 8 |
2454 if tmp | 2426 if tmp |
2455 | 2427 diff = 6 |
2456 mov 6 diff | |
2457 | |
2458 else | 2428 else |
2459 | 2429 if low >=U 0xA |
2460 cmp 0xA low | 2430 diff = 6 |
2461 if >=U | 2431 else |
2462 mov 6 diff | 2432 diff = 0 |
2433 end | |
2434 end | |
2435 | |
2436 tmp = chflags & 0x80 | |
2437 if tmp | |
2438 diff |= 0x60 | |
2439 update_flags C1 | |
2440 else | |
2441 if a >=U 0x9A | |
2442 diff |= 0x60 | |
2443 update_flags C1 | |
2444 else | |
2445 update_flags C0 | |
2446 end | |
2447 end | |
2448 | |
2449 if nflag | |
2450 a -= diff | |
2451 update_flags SZYHPX | |
2463 else | 2452 else |
2464 mov 0 diff | 2453 a += diff |
2465 end | 2454 update_flags SZYHPX |
2466 | |
2467 end | |
2468 | |
2469 and 0x80 chflags tmp | |
2470 if tmp | |
2471 | |
2472 or 0x60 diff diff | |
2473 update_flags C1 | |
2474 | |
2475 else | |
2476 | |
2477 cmp 0x9A a | |
2478 if >=U | |
2479 or 0x60 diff diff | |
2480 update_flags C1 | |
2481 else | |
2482 update_flags C0 | |
2483 end | |
2484 end | |
2485 | |
2486 if nflag | |
2487 | |
2488 sub diff a a | |
2489 update_flags SZYHPX | |
2490 | |
2491 else | |
2492 | |
2493 add diff a a | |
2494 update_flags SZYHPX | |
2495 | |
2496 end | 2455 end |
2497 | 2456 |
2498 dd OOOOOOOO dd_normal | 2457 dd OOOOOOOO dd_normal |
2499 dispatch O | 2458 dispatch O |
2500 | 2459 |