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