54
56
#define SETFLAG(f,c) AF = (c) ? AF | FLAG_ ## f : AF & ~FLAG_ ## f
55
57
#define TSTFLAG(f) ((AF & FLAG_ ## f) != 0)
57
#define ldig(x) ((x) & 0xf)
58
#define hdig(x) (((x) >> 4) & 0xf)
59
#define lreg(x) ((x) & 0xff)
60
#define hreg(x) (((x) >> 8) & 0xff)
62
#define Setlreg(x, v) x = (((x) & 0xff00) | ((v) & 0xff))
63
#define Sethreg(x, v) x = (((x) & 0xff) | (((v) & 0xff) << 8))
65
#define parity(x) parityTable[(x) & 0xff]
66
/* SetPV and SetPV2 are used to provide correct parity flag semantics for the 8080 in cases
59
#define LOW_DIGIT(x) ((x) & 0xf)
60
#define HIGH_DIGIT(x) (((x) >> 4) & 0xf)
61
#define LOW_REGISTER(x) ((x) & 0xff)
62
#define HIGH_REGISTER(x) (((x) >> 8) & 0xff)
64
#define SET_LOW_REGISTER(x, v) x = (((x) & 0xff00) | ((v) & 0xff))
65
#define SET_HIGH_REGISTER(x, v) x = (((x) & 0xff) | (((v) & 0xff) << 8))
67
#define PARITY(x) parityTable[(x) & 0xff]
68
/* SET_PV and SET_PV2 are used to provide correct PARITY flag semantics for the 8080 in cases
67
69
where the Z80 uses the overflow flag
69
#define SetPVS(s) ((cpu_unit.flags & UNIT_CHIP) ? (((cbits >> 6) ^ (cbits >> 5)) & 4) : (parity(s)))
70
#define SetPV (SetPVS(sum))
71
#define SetPV2(x) ((cpu_unit.flags & UNIT_CHIP) ? (((temp == (x)) << 2)) : (parity(temp)))
71
#define SET_PVS(s) ((cpu_unit.flags & UNIT_CHIP) ? (((cbits >> 6) ^ (cbits >> 5)) & 4) : (PARITY(s)))
72
#define SET_PV (SET_PVS(sum))
73
#define SET_PV2(x) ((cpu_unit.flags & UNIT_CHIP) ? (((temp == (x)) << 2)) : (PARITY(temp)))
73
/* checkCPU8080 must be invoked whenever a Z80 only instruction is executed
75
/* CHECK_CPU_8080 must be invoked whenever a Z80 only instruction is executed
74
76
In case a Z80 instruction is executed on an 8080 the following two cases exist:
75
77
1) Trapping is enabled: execution stops
76
78
2) Trapping is not enabled: decoding continues with the next byte
78
#define checkCPU8080 \
80
#define CHECK_CPU_8080 \
79
81
if ((cpu_unit.flags & UNIT_CHIP) == 0) { \
80
82
if (cpu_unit.flags & UNIT_OPSTOP) { \
81
83
reason = STOP_OPCODE; \
134
136
extern int32 dsk10 (const int32 port, const int32 io, const int32 data);
135
137
extern int32 dsk11 (const int32 port, const int32 io, const int32 data);
136
138
extern int32 dsk12 (const int32 port, const int32 io, const int32 data);
139
extern int32 netStatus (const int32 port, const int32 io, const int32 data);
140
extern int32 netData (const int32 port, const int32 io, const int32 data);
137
141
extern int32 nulldev (const int32 port, const int32 io, const int32 data);
138
142
extern int32 hdsk_io (const int32 port, const int32 io, const int32 data);
139
143
extern int32 simh_dev (const int32 port, const int32 io, const int32 data);
315
319
{&nulldev}, {&nulldev}, {&nulldev}, {&nulldev}, /* 1C */
316
320
{&nulldev}, {&nulldev}, {&nulldev}, {&nulldev}, /* 20 */
317
321
{&nulldev}, {&nulldev}, {&nulldev}, {&nulldev}, /* 24 */
318
{&nulldev}, {&nulldev}, {&nulldev}, {&nulldev}, /* 28 */
322
{&netStatus},{&netData},{&netStatus},{&netData}, /* 28 */
319
323
{&nulldev}, {&nulldev}, {&nulldev}, {&nulldev}, /* 2C */
320
{&nulldev}, {&nulldev}, {&nulldev}, {&nulldev}, /* 30 */
324
{&nulldev}, {&nulldev}, {&netStatus},{&netData}, /* 30 */
321
325
{&nulldev}, {&nulldev}, {&nulldev}, {&nulldev}, /* 34 */
322
326
{&nulldev}, {&nulldev}, {&nulldev}, {&nulldev}, /* 38 */
323
327
{&nulldev}, {&nulldev}, {&nulldev}, {&nulldev}, /* 3C */
1621
#define Reduce(Addr) ((Addr) & ADDRMASK)
1623
#define GetBYTE(Addr) \
1624
((cpu_unit.flags & UNIT_BANKED) ? \
1625
(Reduce(Addr) < common ? \
1626
M[Reduce(Addr)][bankSelect] \
1628
M[Reduce(Addr)][0]) \
1630
(((Reduce(Addr) < MEMSIZE) || ( (cpu_unit.flags & UNIT_ROM) && (ROMLow <= Reduce(Addr)) && (Reduce(Addr) <= ROMHigh) )) ? \
1631
M[Reduce(Addr)][0] \
1633
warnUnsuccessfulReadAttempt(Reduce(Addr))))
1635
#define RAM_pp(Addr) \
1636
((cpu_unit.flags & UNIT_BANKED) ? \
1637
(Reduce(Addr) < common ? \
1638
M[Reduce(Addr++)][bankSelect] \
1640
M[Reduce(Addr++)][0]) \
1642
(((Reduce(Addr) < MEMSIZE) || ( (cpu_unit.flags & UNIT_ROM) && (ROMLow <= Reduce(Addr)) && (Reduce(Addr) <= ROMHigh) )) ? \
1643
M[Reduce(Addr++)][0] \
1645
warnUnsuccessfulReadAttempt(Reduce(Addr++))))
1647
#define RAM_mm(Addr) \
1648
((cpu_unit.flags & UNIT_BANKED) ? \
1649
(Reduce(Addr) < common ? \
1650
M[Reduce(Addr--)][bankSelect] \
1652
M[Reduce(Addr--)][0]) \
1654
(((Reduce(Addr) < MEMSIZE) || ( (cpu_unit.flags & UNIT_ROM) && (ROMLow <= Reduce(Addr)) && (Reduce(Addr) <= ROMHigh) )) ? \
1655
M[Reduce(Addr--)][0] \
1657
warnUnsuccessfulReadAttempt(Reduce(Addr--))))
1659
#define GetWORD(Addr) (GetBYTE(Addr) | (GetBYTE(Addr + 1) << 8))
1625
#define REDUCE(Addr) ((Addr) & ADDRMASK)
1627
#define GET_BYTE(Addr) \
1628
((cpu_unit.flags & UNIT_BANKED) ? \
1629
(REDUCE(Addr) < common ? \
1630
M[REDUCE(Addr)][bankSelect] \
1632
M[REDUCE(Addr)][0]) \
1634
(((REDUCE(Addr) < MEMSIZE) || ( (cpu_unit.flags & UNIT_ROM) && (ROMLow <= REDUCE(Addr)) && (REDUCE(Addr) <= ROMHigh) )) ? \
1635
M[REDUCE(Addr)][0] \
1637
warnUnsuccessfulReadAttempt(REDUCE(Addr))))
1639
#define RAM_PP(Addr) \
1640
((cpu_unit.flags & UNIT_BANKED) ? \
1641
(REDUCE(Addr) < common ? \
1642
M[REDUCE(Addr++)][bankSelect] \
1644
M[REDUCE(Addr++)][0]) \
1646
(((REDUCE(Addr) < MEMSIZE) || ( (cpu_unit.flags & UNIT_ROM) && (ROMLow <= REDUCE(Addr)) && (REDUCE(Addr) <= ROMHigh) )) ? \
1647
M[REDUCE(Addr++)][0] \
1649
warnUnsuccessfulReadAttempt(REDUCE(Addr++))))
1651
#define RAM_MM(Addr) \
1652
((cpu_unit.flags & UNIT_BANKED) ? \
1653
(REDUCE(Addr) < common ? \
1654
M[REDUCE(Addr--)][bankSelect] \
1656
M[REDUCE(Addr--)][0]) \
1658
(((REDUCE(Addr) < MEMSIZE) || ( (cpu_unit.flags & UNIT_ROM) && (ROMLow <= REDUCE(Addr)) && (REDUCE(Addr) <= ROMHigh) )) ? \
1659
M[REDUCE(Addr--)][0] \
1661
warnUnsuccessfulReadAttempt(REDUCE(Addr--))))
1663
#define GET_WORD(Addr) (GET_BYTE(Addr) | (GET_BYTE(Addr + 1) << 8))
1661
1665
uint8 GetBYTEWrapper(const uint32 Addr) {
1662
return GetBYTE(Addr);
1666
return GET_BYTE(Addr);
1665
1669
void PutBYTEWrapper(const uint32 Addr, const uint32 Value) {
1666
1670
PutBYTE(Addr, Value);
1669
#define PutBYTE_pp(a,v) PutBYTE(a++, v)
1670
#define PutBYTE_mm(a,v) PutBYTE(a--, v)
1671
#define mm_PutBYTE(a,v) PutBYTE(--a, v)
1673
#define PUT_BYTE_PP(a,v) PutBYTE(a++, v)
1674
#define PUT_BYTE_MM(a,v) PutBYTE(a--, v)
1675
#define MM_PUT_BYTE(a,v) PutBYTE(--a, v)
1673
1677
#define MASK_BRK (TRUE + 1)
1702
1706
#define PUSH(x) { \
1703
mm_PutBYTE(SP, (x) >> 8); \
1704
mm_PutBYTE(SP, x); \
1707
MM_PUT_BYTE(SP, (x) >> 8); \
1708
MM_PUT_BYTE(SP, x); \
1707
#define CheckBreakByte(a) \
1708
if (sim_brk_summ && sim_brk_test(a, SWMASK('M'))) { \
1711
#define CHECK_BREAK_BYTE(a) \
1712
if (sim_brk_summ && sim_brk_test(a & 0xffff, SWMASK('M'))) {\
1709
1713
reason = STOP_MEM; \
1710
prepareMemoryAccessMessage(a); \
1714
prepareMemoryAccessMessage(a & 0xffff); \
1711
1715
goto end_decode; \
1714
#define CheckBreakTwoBytesExtended(a1, a2, iCode) \
1718
#define CHECK_BREAK_TWO_BYTES_EXTENDED(a1, a2, iCode) \
1715
1719
if (sim_brk_summ) { \
1716
br1 = sim_brk_lookup(a1, SWMASK('M')); \
1717
br2 = br1 ? FALSE : sim_brk_lookup(a2, SWMASK('M')); \
1720
br1 = sim_brk_lookup(a1 & 0xffff, SWMASK('M')); \
1721
br2 = br1 ? FALSE : sim_brk_lookup(a2 & 0xffff, SWMASK('M'));\
1718
1722
if ((br1 == MASK_BRK) || (br2 == MASK_BRK)) { \
1719
1723
sim_brk_pend[0] = FALSE; \
1721
1725
else if (br1 || br2) { \
1722
1726
reason = STOP_MEM; \
1724
prepareMemoryAccessMessage(a1); \
1728
prepareMemoryAccessMessage(a1 & 0xffff); \
1727
prepareMemoryAccessMessage(a2); \
1731
prepareMemoryAccessMessage(a2 & 0xffff); \
1730
1734
goto end_decode; \
1803
1812
/* clockFrequency != 0 implies that real time clock is available */
1804
1813
startTime += sliceLength;
1805
1814
tStates -= tStatesInSlice;
1815
if (startTime > (now = sim_os_msec())) {
1806
1816
#if defined (_WIN32)
1807
while (sim_os_msec() <= startTime) {} /* poor man's sleep */
1817
Sleep(startTime - now);
1811
if (startTime > (now = sim_os_msec())) {
1812
usleep(1000 * (startTime - now));
1819
usleep(1000 * (startTime - now));
1818
1824
if (timerInterrupt && (IFF_S & 1)) {
1819
1825
timerInterrupt = FALSE;
1820
1826
specialProcessing = clockFrequency | sim_brk_summ;
1821
1827
IFF_S = 0; /* disable interrupts */
1822
CheckBreakTwoBytesExtended(SP - 2, SP - 1, (timerInterrupt = TRUE, IFF_S |= 1));
1828
CHECK_BREAK_TWO_BYTES_EXTENDED(SP - 2, SP - 1, (timerInterrupt = TRUE, IFF_S |= 1));
1824
1830
PCQ_ENTRY(PC - 1);
1825
1831
PC = timerInterruptHandler & ADDRMASK;
1927
1933
case 0x0c: /* INC C */
1929
1935
sim_brk_pend[0] = FALSE;
1930
temp = lreg(BC) + 1;
1932
AF = (AF & ~0xfe) | incTable[temp] | SetPV2(0x80);
1936
temp = LOW_REGISTER(BC) + 1;
1937
SET_LOW_REGISTER(BC, temp);
1938
AF = (AF & ~0xfe) | incTable[temp] | SET_PV2(0x80);
1935
1941
case 0x0d: /* DEC C */
1937
1943
sim_brk_pend[0] = FALSE;
1938
temp = lreg(BC) - 1;
1940
AF = (AF & ~0xfe) | decTable[temp & 0xff] | SetPV2(0x7f);
1944
temp = LOW_REGISTER(BC) - 1;
1945
SET_LOW_REGISTER(BC, temp);
1946
AF = (AF & ~0xfe) | decTable[temp & 0xff] | SET_PV2(0x7f);
1943
1949
case 0x0e: /* LD C,nn */
1945
1951
sim_brk_pend[0] = FALSE;
1946
Setlreg(BC, RAM_pp(PC));
1952
SET_LOW_REGISTER(BC, RAM_PP(PC));
1949
1955
case 0x0f: /* RRCA */
1951
1957
sim_brk_pend[0] = FALSE;
1952
AF = (AF & 0xc4) | rrcaTable[hreg(AF)];
1958
AF = (AF & 0xc4) | rrcaTable[HIGH_REGISTER(AF)];
1955
1961
case 0x10: /* DJNZ dd */
1956
1962
sim_brk_pend[0] = FALSE;
1958
1964
if ((BC -= 0x100) & 0xff00) {
1959
1965
PCQ_ENTRY(PC - 1);
1960
PC += (int8) GetBYTE(PC) + 1;
1966
PC += (int8) GET_BYTE(PC) + 1;
2047
2053
case 0x1c: /* INC E */
2049
2055
sim_brk_pend[0] = FALSE;
2050
temp = lreg(DE) + 1;
2052
AF = (AF & ~0xfe) | incTable[temp] | SetPV2(0x80);
2056
temp = LOW_REGISTER(DE) + 1;
2057
SET_LOW_REGISTER(DE, temp);
2058
AF = (AF & ~0xfe) | incTable[temp] | SET_PV2(0x80);
2055
2061
case 0x1d: /* DEC E */
2057
2063
sim_brk_pend[0] = FALSE;
2058
temp = lreg(DE) - 1;
2060
AF = (AF & ~0xfe) | decTable[temp & 0xff] | SetPV2(0x7f);
2064
temp = LOW_REGISTER(DE) - 1;
2065
SET_LOW_REGISTER(DE, temp);
2066
AF = (AF & ~0xfe) | decTable[temp & 0xff] | SET_PV2(0x7f);
2063
2069
case 0x1e: /* LD E,nn */
2065
2071
sim_brk_pend[0] = FALSE;
2066
Setlreg(DE, RAM_pp(PC));
2072
SET_LOW_REGISTER(DE, RAM_PP(PC));
2069
2075
case 0x1f: /* RRA */
2071
2077
sim_brk_pend[0] = FALSE;
2072
AF = ((AF & 1) << 15) | (AF & 0xc4) | rraTable[hreg(AF)];
2078
AF = ((AF & 1) << 15) | (AF & 0xc4) | rraTable[HIGH_REGISTER(AF)];
2075
2081
case 0x20: /* JR NZ,dd */
2076
2082
sim_brk_pend[0] = FALSE;
2078
2084
if (TSTFLAG(Z)) {
2083
2089
PCQ_ENTRY(PC - 1);
2084
PC += (int8) GetBYTE(PC) + 1;
2090
PC += (int8) GET_BYTE(PC) + 1;
2639
2645
case 0x70: /* LD (HL),B */
2642
PutBYTE(HL, hreg(BC));
2647
CHECK_BREAK_BYTE(HL);
2648
PutBYTE(HL, HIGH_REGISTER(BC));
2645
2651
case 0x71: /* LD (HL),C */
2648
PutBYTE(HL, lreg(BC));
2653
CHECK_BREAK_BYTE(HL);
2654
PutBYTE(HL, LOW_REGISTER(BC));
2651
2657
case 0x72: /* LD (HL),D */
2654
PutBYTE(HL, hreg(DE));
2659
CHECK_BREAK_BYTE(HL);
2660
PutBYTE(HL, HIGH_REGISTER(DE));
2657
2663
case 0x73: /* LD (HL),E */
2660
PutBYTE(HL, lreg(DE));
2665
CHECK_BREAK_BYTE(HL);
2666
PutBYTE(HL, LOW_REGISTER(DE));
2663
2669
case 0x74: /* LD (HL),H */
2666
PutBYTE(HL, hreg(HL));
2671
CHECK_BREAK_BYTE(HL);
2672
PutBYTE(HL, HIGH_REGISTER(HL));
2669
2675
case 0x75: /* LD (HL),L */
2672
PutBYTE(HL, lreg(HL));
2677
CHECK_BREAK_BYTE(HL);
2678
PutBYTE(HL, LOW_REGISTER(HL));
2675
2681
case 0x76: /* HALT */
2735
2741
case 0x80: /* ADD A,B */
2737
2743
sim_brk_pend[0] = FALSE;
2744
temp = HIGH_REGISTER(BC);
2745
acu = HIGH_REGISTER(AF);
2740
2746
sum = acu + temp;
2741
2747
cbits = acu ^ temp ^ sum;
2742
AF = addTable[sum] | cbitsTable[cbits] | (SetPV);
2748
AF = addTable[sum] | cbitsTable[cbits] | (SET_PV);
2745
2751
case 0x81: /* ADD A,C */
2747
2753
sim_brk_pend[0] = FALSE;
2754
temp = LOW_REGISTER(BC);
2755
acu = HIGH_REGISTER(AF);
2750
2756
sum = acu + temp;
2751
2757
cbits = acu ^ temp ^ sum;
2752
AF = addTable[sum] | cbitsTable[cbits] | (SetPV);
2758
AF = addTable[sum] | cbitsTable[cbits] | (SET_PV);
2755
2761
case 0x82: /* ADD A,D */
2757
2763
sim_brk_pend[0] = FALSE;
2764
temp = HIGH_REGISTER(DE);
2765
acu = HIGH_REGISTER(AF);
2760
2766
sum = acu + temp;
2761
2767
cbits = acu ^ temp ^ sum;
2762
AF = addTable[sum] | cbitsTable[cbits] | (SetPV);
2768
AF = addTable[sum] | cbitsTable[cbits] | (SET_PV);
2765
2771
case 0x83: /* ADD A,E */
2767
2773
sim_brk_pend[0] = FALSE;
2774
temp = LOW_REGISTER(DE);
2775
acu = HIGH_REGISTER(AF);
2770
2776
sum = acu + temp;
2771
2777
cbits = acu ^ temp ^ sum;
2772
AF = addTable[sum] | cbitsTable[cbits] | (SetPV);
2778
AF = addTable[sum] | cbitsTable[cbits] | (SET_PV);
2775
2781
case 0x84: /* ADD A,H */
2777
2783
sim_brk_pend[0] = FALSE;
2784
temp = HIGH_REGISTER(HL);
2785
acu = HIGH_REGISTER(AF);
2780
2786
sum = acu + temp;
2781
2787
cbits = acu ^ temp ^ sum;
2782
AF = addTable[sum] | cbitsTable[cbits] | (SetPV);
2788
AF = addTable[sum] | cbitsTable[cbits] | (SET_PV);
2785
2791
case 0x85: /* ADD A,L */
2787
2793
sim_brk_pend[0] = FALSE;
2794
temp = LOW_REGISTER(HL);
2795
acu = HIGH_REGISTER(AF);
2790
2796
sum = acu + temp;
2791
2797
cbits = acu ^ temp ^ sum;
2792
AF = addTable[sum] | cbitsTable[cbits] | (SetPV);
2798
AF = addTable[sum] | cbitsTable[cbits] | (SET_PV);
2795
2801
case 0x86: /* ADD A,(HL) */
2803
CHECK_BREAK_BYTE(HL);
2804
temp = GET_BYTE(HL);
2805
acu = HIGH_REGISTER(AF);
2800
2806
sum = acu + temp;
2801
2807
cbits = acu ^ temp ^ sum;
2802
AF = addTable[sum] | cbitsTable[cbits] | (SetPV);
2808
AF = addTable[sum] | cbitsTable[cbits] | (SET_PV);
2805
2811
case 0x87: /* ADD A,A */
2807
2813
sim_brk_pend[0] = FALSE;
2808
cbits = 2 * hreg(AF);
2809
AF = cbitsDup8Table[cbits] | (SetPVS(cbits));
2814
cbits = 2 * HIGH_REGISTER(AF);
2815
AF = cbitsDup8Table[cbits] | (SET_PVS(cbits));
2812
2818
case 0x88: /* ADC A,B */
2814
2820
sim_brk_pend[0] = FALSE;
2821
temp = HIGH_REGISTER(BC);
2822
acu = HIGH_REGISTER(AF);
2817
2823
sum = acu + temp + TSTFLAG(C);
2818
2824
cbits = acu ^ temp ^ sum;
2819
AF = addTable[sum] | cbitsTable[cbits] | (SetPV);
2825
AF = addTable[sum] | cbitsTable[cbits] | (SET_PV);
2822
2828
case 0x89: /* ADC A,C */
2824
2830
sim_brk_pend[0] = FALSE;
2831
temp = LOW_REGISTER(BC);
2832
acu = HIGH_REGISTER(AF);
2827
2833
sum = acu + temp + TSTFLAG(C);
2828
2834
cbits = acu ^ temp ^ sum;
2829
AF = addTable[sum] | cbitsTable[cbits] | (SetPV);
2835
AF = addTable[sum] | cbitsTable[cbits] | (SET_PV);
2832
2838
case 0x8a: /* ADC A,D */
2834
2840
sim_brk_pend[0] = FALSE;
2841
temp = HIGH_REGISTER(DE);
2842
acu = HIGH_REGISTER(AF);
2837
2843
sum = acu + temp + TSTFLAG(C);
2838
2844
cbits = acu ^ temp ^ sum;
2839
AF = addTable[sum] | cbitsTable[cbits] | (SetPV);
2845
AF = addTable[sum] | cbitsTable[cbits] | (SET_PV);
2842
2848
case 0x8b: /* ADC A,E */
2844
2850
sim_brk_pend[0] = FALSE;
2851
temp = LOW_REGISTER(DE);
2852
acu = HIGH_REGISTER(AF);
2847
2853
sum = acu + temp + TSTFLAG(C);
2848
2854
cbits = acu ^ temp ^ sum;
2849
AF = addTable[sum] | cbitsTable[cbits] | (SetPV);
2855
AF = addTable[sum] | cbitsTable[cbits] | (SET_PV);
2852
2858
case 0x8c: /* ADC A,H */
2854
2860
sim_brk_pend[0] = FALSE;
2861
temp = HIGH_REGISTER(HL);
2862
acu = HIGH_REGISTER(AF);
2857
2863
sum = acu + temp + TSTFLAG(C);
2858
2864
cbits = acu ^ temp ^ sum;
2859
AF = addTable[sum] | cbitsTable[cbits] | (SetPV);
2865
AF = addTable[sum] | cbitsTable[cbits] | (SET_PV);
2862
2868
case 0x8d: /* ADC A,L */
2864
2870
sim_brk_pend[0] = FALSE;
2871
temp = LOW_REGISTER(HL);
2872
acu = HIGH_REGISTER(AF);
2867
2873
sum = acu + temp + TSTFLAG(C);
2868
2874
cbits = acu ^ temp ^ sum;
2869
AF = addTable[sum] | cbitsTable[cbits] | (SetPV);
2875
AF = addTable[sum] | cbitsTable[cbits] | (SET_PV);
2872
2878
case 0x8e: /* ADC A,(HL) */
2880
CHECK_BREAK_BYTE(HL);
2881
temp = GET_BYTE(HL);
2882
acu = HIGH_REGISTER(AF);
2877
2883
sum = acu + temp + TSTFLAG(C);
2878
2884
cbits = acu ^ temp ^ sum;
2879
AF = addTable[sum] | cbitsTable[cbits] | (SetPV);
2885
AF = addTable[sum] | cbitsTable[cbits] | (SET_PV);
2882
2888
case 0x8f: /* ADC A,A */
2884
2890
sim_brk_pend[0] = FALSE;
2885
cbits = 2 * hreg(AF) + TSTFLAG(C);
2886
AF = cbitsDup8Table[cbits] | (SetPVS(cbits));
2891
cbits = 2 * HIGH_REGISTER(AF) + TSTFLAG(C);
2892
AF = cbitsDup8Table[cbits] | (SET_PVS(cbits));
2889
2895
case 0x90: /* SUB B */
2891
2897
sim_brk_pend[0] = FALSE;
2898
temp = HIGH_REGISTER(BC);
2899
acu = HIGH_REGISTER(AF);
2894
2900
sum = acu - temp;
2895
2901
cbits = acu ^ temp ^ sum;
2896
AF = subTable[sum & 0xff] | cbitsTable[cbits & 0x1ff] | (SetPV);
2902
AF = subTable[sum & 0xff] | cbitsTable[cbits & 0x1ff] | (SET_PV);
2899
2905
case 0x91: /* SUB C */
2901
2907
sim_brk_pend[0] = FALSE;
2908
temp = LOW_REGISTER(BC);
2909
acu = HIGH_REGISTER(AF);
2904
2910
sum = acu - temp;
2905
2911
cbits = acu ^ temp ^ sum;
2906
AF = subTable[sum & 0xff] | cbitsTable[cbits & 0x1ff] | (SetPV);
2912
AF = subTable[sum & 0xff] | cbitsTable[cbits & 0x1ff] | (SET_PV);
2909
2915
case 0x92: /* SUB D */
2911
2917
sim_brk_pend[0] = FALSE;
2918
temp = HIGH_REGISTER(DE);
2919
acu = HIGH_REGISTER(AF);
2914
2920
sum = acu - temp;
2915
2921
cbits = acu ^ temp ^ sum;
2916
AF = subTable[sum & 0xff] | cbitsTable[cbits & 0x1ff] | (SetPV);
2922
AF = subTable[sum & 0xff] | cbitsTable[cbits & 0x1ff] | (SET_PV);
2919
2925
case 0x93: /* SUB E */
2921
2927
sim_brk_pend[0] = FALSE;
2928
temp = LOW_REGISTER(DE);
2929
acu = HIGH_REGISTER(AF);
2924
2930
sum = acu - temp;
2925
2931
cbits = acu ^ temp ^ sum;
2926
AF = subTable[sum & 0xff] | cbitsTable[cbits & 0x1ff] | (SetPV);
2932
AF = subTable[sum & 0xff] | cbitsTable[cbits & 0x1ff] | (SET_PV);
2929
2935
case 0x94: /* SUB H */
2931
2937
sim_brk_pend[0] = FALSE;
2938
temp = HIGH_REGISTER(HL);
2939
acu = HIGH_REGISTER(AF);
2934
2940
sum = acu - temp;
2935
2941
cbits = acu ^ temp ^ sum;
2936
AF = subTable[sum & 0xff] | cbitsTable[cbits & 0x1ff] | (SetPV);
2942
AF = subTable[sum & 0xff] | cbitsTable[cbits & 0x1ff] | (SET_PV);
2939
2945
case 0x95: /* SUB L */
2941
2947
sim_brk_pend[0] = FALSE;
2948
temp = LOW_REGISTER(HL);
2949
acu = HIGH_REGISTER(AF);
2944
2950
sum = acu - temp;
2945
2951
cbits = acu ^ temp ^ sum;
2946
AF = subTable[sum & 0xff] | cbitsTable[cbits & 0x1ff] | (SetPV);
2952
AF = subTable[sum & 0xff] | cbitsTable[cbits & 0x1ff] | (SET_PV);
2949
2955
case 0x96: /* SUB (HL) */
2957
CHECK_BREAK_BYTE(HL);
2958
temp = GET_BYTE(HL);
2959
acu = HIGH_REGISTER(AF);
2954
2960
sum = acu - temp;
2955
2961
cbits = acu ^ temp ^ sum;
2956
AF = subTable[sum & 0xff] | cbitsTable[cbits & 0x1ff] | (SetPV);
2962
AF = subTable[sum & 0xff] | cbitsTable[cbits & 0x1ff] | (SET_PV);
2959
2965
case 0x97: /* SUB A */
2965
2971
case 0x98: /* SBC A,B */
2967
2973
sim_brk_pend[0] = FALSE;
2974
temp = HIGH_REGISTER(BC);
2975
acu = HIGH_REGISTER(AF);
2970
2976
sum = acu - temp - TSTFLAG(C);
2971
2977
cbits = acu ^ temp ^ sum;
2972
AF = subTable[sum & 0xff] | cbitsTable[cbits & 0x1ff] | (SetPV);
2978
AF = subTable[sum & 0xff] | cbitsTable[cbits & 0x1ff] | (SET_PV);
2975
2981
case 0x99: /* SBC A,C */
2977
2983
sim_brk_pend[0] = FALSE;
2984
temp = LOW_REGISTER(BC);
2985
acu = HIGH_REGISTER(AF);
2980
2986
sum = acu - temp - TSTFLAG(C);
2981
2987
cbits = acu ^ temp ^ sum;
2982
AF = subTable[sum & 0xff] | cbitsTable[cbits & 0x1ff] | (SetPV);
2988
AF = subTable[sum & 0xff] | cbitsTable[cbits & 0x1ff] | (SET_PV);
2985
2991
case 0x9a: /* SBC A,D */
2987
2993
sim_brk_pend[0] = FALSE;
2994
temp = HIGH_REGISTER(DE);
2995
acu = HIGH_REGISTER(AF);
2990
2996
sum = acu - temp - TSTFLAG(C);
2991
2997
cbits = acu ^ temp ^ sum;
2992
AF = subTable[sum & 0xff] | cbitsTable[cbits & 0x1ff] | (SetPV);
2998
AF = subTable[sum & 0xff] | cbitsTable[cbits & 0x1ff] | (SET_PV);
2995
3001
case 0x9b: /* SBC A,E */
2997
3003
sim_brk_pend[0] = FALSE;
3004
temp = LOW_REGISTER(DE);
3005
acu = HIGH_REGISTER(AF);
3000
3006
sum = acu - temp - TSTFLAG(C);
3001
3007
cbits = acu ^ temp ^ sum;
3002
AF = subTable[sum & 0xff] | cbitsTable[cbits & 0x1ff] | (SetPV);
3008
AF = subTable[sum & 0xff] | cbitsTable[cbits & 0x1ff] | (SET_PV);
3005
3011
case 0x9c: /* SBC A,H */
3007
3013
sim_brk_pend[0] = FALSE;
3014
temp = HIGH_REGISTER(HL);
3015
acu = HIGH_REGISTER(AF);
3010
3016
sum = acu - temp - TSTFLAG(C);
3011
3017
cbits = acu ^ temp ^ sum;
3012
AF = subTable[sum & 0xff] | cbitsTable[cbits & 0x1ff] | (SetPV);
3018
AF = subTable[sum & 0xff] | cbitsTable[cbits & 0x1ff] | (SET_PV);
3015
3021
case 0x9d: /* SBC A,L */
3017
3023
sim_brk_pend[0] = FALSE;
3024
temp = LOW_REGISTER(HL);
3025
acu = HIGH_REGISTER(AF);
3020
3026
sum = acu - temp - TSTFLAG(C);
3021
3027
cbits = acu ^ temp ^ sum;
3022
AF = subTable[sum & 0xff] | cbitsTable[cbits & 0x1ff] | (SetPV);
3028
AF = subTable[sum & 0xff] | cbitsTable[cbits & 0x1ff] | (SET_PV);
3025
3031
case 0x9e: /* SBC A,(HL) */
3033
CHECK_BREAK_BYTE(HL);
3034
temp = GET_BYTE(HL);
3035
acu = HIGH_REGISTER(AF);
3030
3036
sum = acu - temp - TSTFLAG(C);
3031
3037
cbits = acu ^ temp ^ sum;
3032
AF = subTable[sum & 0xff] | cbitsTable[cbits & 0x1ff] | (SetPV);
3038
AF = subTable[sum & 0xff] | cbitsTable[cbits & 0x1ff] | (SET_PV);
3035
3041
case 0x9f: /* SBC A,A */
3037
3043
sim_brk_pend[0] = FALSE;
3038
3044
cbits = -TSTFLAG(C);
3039
AF = subTable[cbits & 0xff] | cbitsTable[cbits & 0x1ff] | (SetPVS(cbits));
3045
AF = subTable[cbits & 0xff] | cbitsTable[cbits & 0x1ff] | (SET_PVS(cbits));
3042
3048
case 0xa0: /* AND B */
3186
3192
case 0xb8: /* CP B */
3188
3194
sim_brk_pend[0] = FALSE;
3195
temp = HIGH_REGISTER(BC);
3190
3196
AF = (AF & ~0x28) | (temp & 0x28);
3197
acu = HIGH_REGISTER(AF);
3192
3198
sum = acu - temp;
3193
3199
cbits = acu ^ temp ^ sum;
3194
3200
AF = (AF & ~0xff) | cpTable[sum & 0xff] | (temp & 0x28) |
3195
(SetPV) | cbits2Table[cbits & 0x1ff];
3201
(SET_PV) | cbits2Table[cbits & 0x1ff];
3198
3204
case 0xb9: /* CP C */
3200
3206
sim_brk_pend[0] = FALSE;
3207
temp = LOW_REGISTER(BC);
3202
3208
AF = (AF & ~0x28) | (temp & 0x28);
3209
acu = HIGH_REGISTER(AF);
3204
3210
sum = acu - temp;
3205
3211
cbits = acu ^ temp ^ sum;
3206
3212
AF = (AF & ~0xff) | cpTable[sum & 0xff] | (temp & 0x28) |
3207
(SetPV) | cbits2Table[cbits & 0x1ff];
3213
(SET_PV) | cbits2Table[cbits & 0x1ff];
3210
3216
case 0xba: /* CP D */
3212
3218
sim_brk_pend[0] = FALSE;
3219
temp = HIGH_REGISTER(DE);
3214
3220
AF = (AF & ~0x28) | (temp & 0x28);
3221
acu = HIGH_REGISTER(AF);
3216
3222
sum = acu - temp;
3217
3223
cbits = acu ^ temp ^ sum;
3218
3224
AF = (AF & ~0xff) | cpTable[sum & 0xff] | (temp & 0x28) |
3219
(SetPV) | cbits2Table[cbits & 0x1ff];
3225
(SET_PV) | cbits2Table[cbits & 0x1ff];
3222
3228
case 0xbb: /* CP E */
3224
3230
sim_brk_pend[0] = FALSE;
3231
temp = LOW_REGISTER(DE);
3226
3232
AF = (AF & ~0x28) | (temp & 0x28);
3233
acu = HIGH_REGISTER(AF);
3228
3234
sum = acu - temp;
3229
3235
cbits = acu ^ temp ^ sum;
3230
3236
AF = (AF & ~0xff) | cpTable[sum & 0xff] | (temp & 0x28) |
3231
(SetPV) | cbits2Table[cbits & 0x1ff];
3237
(SET_PV) | cbits2Table[cbits & 0x1ff];
3234
3240
case 0xbc: /* CP H */
3236
3242
sim_brk_pend[0] = FALSE;
3243
temp = HIGH_REGISTER(HL);
3238
3244
AF = (AF & ~0x28) | (temp & 0x28);
3245
acu = HIGH_REGISTER(AF);
3240
3246
sum = acu - temp;
3241
3247
cbits = acu ^ temp ^ sum;
3242
3248
AF = (AF & ~0xff) | cpTable[sum & 0xff] | (temp & 0x28) |
3243
(SetPV) | cbits2Table[cbits & 0x1ff];
3249
(SET_PV) | cbits2Table[cbits & 0x1ff];
3246
3252
case 0xbd: /* CP L */
3248
3254
sim_brk_pend[0] = FALSE;
3255
temp = LOW_REGISTER(HL);
3250
3256
AF = (AF & ~0x28) | (temp & 0x28);
3257
acu = HIGH_REGISTER(AF);
3252
3258
sum = acu - temp;
3253
3259
cbits = acu ^ temp ^ sum;
3254
3260
AF = (AF & ~0xff) | cpTable[sum & 0xff] | (temp & 0x28) |
3255
(SetPV) | cbits2Table[cbits & 0x1ff];
3261
(SET_PV) | cbits2Table[cbits & 0x1ff];
3258
3264
case 0xbe: /* CP (HL) */
3266
CHECK_BREAK_BYTE(HL);
3267
temp = GET_BYTE(HL);
3262
3268
AF = (AF & ~0x28) | (temp & 0x28);
3269
acu = HIGH_REGISTER(AF);
3264
3270
sum = acu - temp;
3265
3271
cbits = acu ^ temp ^ sum;
3266
3272
AF = (AF & ~0xff) | cpTable[sum & 0xff] | (temp & 0x28) |
3267
(SetPV) | cbits2Table[cbits & 0x1ff];
3273
(SET_PV) | cbits2Table[cbits & 0x1ff];
3270
3276
case 0xbf: /* CP A */
3272
3278
sim_brk_pend[0] = FALSE;
3273
Setlreg(AF, (hreg(AF) & 0x28) | (cpu_unit.flags & UNIT_CHIP ? 0x42 : 0x46));
3279
SET_LOW_REGISTER(AF, (HIGH_REGISTER(AF) & 0x28) | (cpu_unit.flags & UNIT_CHIP ? 0x42 : 0x46));
3276
3282
case 0xc0: /* RET NZ */
3744
3750
case 0x2c: /* INC IXL */
3746
3752
sim_brk_pend[0] = FALSE;
3747
temp = lreg(IX) + 1;
3753
temp = LOW_REGISTER(IX) + 1;
3754
SET_LOW_REGISTER(IX, temp);
3749
3755
AF = (AF & ~0xfe) | incZ80Table[temp];
3752
3758
case 0x2d: /* DEC IXL */
3754
3760
sim_brk_pend[0] = FALSE;
3755
temp = lreg(IX) - 1;
3761
temp = LOW_REGISTER(IX) - 1;
3762
SET_LOW_REGISTER(IX, temp);
3757
3763
AF = (AF & ~0xfe) | decZ80Table[temp & 0xff];
3760
3766
case 0x2e: /* LD IXL,nn */
3762
3768
sim_brk_pend[0] = FALSE;
3763
Setlreg(IX, RAM_pp(PC));
3769
SET_LOW_REGISTER(IX, RAM_PP(PC));
3766
3772
case 0x34: /* INC (IX+dd) */
3768
adr = IX + (int8) RAM_pp(PC);
3769
CheckBreakByte(adr);
3770
temp = GetBYTE(adr) + 1;
3774
adr = IX + (int8) RAM_PP(PC);
3775
CHECK_BREAK_BYTE(adr);
3776
temp = GET_BYTE(adr) + 1;
3771
3777
PutBYTE(adr, temp);
3772
3778
AF = (AF & ~0xfe) | incZ80Table[temp];
3775
3781
case 0x35: /* DEC (IX+dd) */
3777
adr = IX + (int8) RAM_pp(PC);
3778
CheckBreakByte(adr);
3779
temp = GetBYTE(adr) - 1;
3783
adr = IX + (int8) RAM_PP(PC);
3784
CHECK_BREAK_BYTE(adr);
3785
temp = GET_BYTE(adr) - 1;
3780
3786
PutBYTE(adr, temp);
3781
3787
AF = (AF & ~0xfe) | decZ80Table[temp & 0xff];
3784
3790
case 0x36: /* LD (IX+dd),nn */
3786
adr = IX + (int8) RAM_pp(PC);
3787
CheckBreakByte(adr);
3788
PutBYTE(adr, RAM_pp(PC));
3792
adr = IX + (int8) RAM_PP(PC);
3793
CHECK_BREAK_BYTE(adr);
3794
PutBYTE(adr, RAM_PP(PC));
3791
3797
case 0x39: /* ADD IX,SP */
3801
3807
case 0x44: /* LD B,IXH */
3803
3809
sim_brk_pend[0] = FALSE;
3804
Sethreg(BC, hreg(IX));
3810
SET_HIGH_REGISTER(BC, HIGH_REGISTER(IX));
3807
3813
case 0x45: /* LD B,IXL */
3809
3815
sim_brk_pend[0] = FALSE;
3810
Sethreg(BC, lreg(IX));
3816
SET_HIGH_REGISTER(BC, LOW_REGISTER(IX));
3813
3819
case 0x46: /* LD B,(IX+dd) */
3815
adr = IX + (int8) RAM_pp(PC);
3816
CheckBreakByte(adr);
3817
Sethreg(BC, GetBYTE(adr));
3821
adr = IX + (int8) RAM_PP(PC);
3822
CHECK_BREAK_BYTE(adr);
3823
SET_HIGH_REGISTER(BC, GET_BYTE(adr));
3820
3826
case 0x4c: /* LD C,IXH */
3822
3828
sim_brk_pend[0] = FALSE;
3823
Setlreg(BC, hreg(IX));
3829
SET_LOW_REGISTER(BC, HIGH_REGISTER(IX));
3826
3832
case 0x4d: /* LD C,IXL */
3828
3834
sim_brk_pend[0] = FALSE;
3829
Setlreg(BC, lreg(IX));
3835
SET_LOW_REGISTER(BC, LOW_REGISTER(IX));
3832
3838
case 0x4e: /* LD C,(IX+dd) */
3834
adr = IX + (int8) RAM_pp(PC);
3835
CheckBreakByte(adr);
3836
Setlreg(BC, GetBYTE(adr));
3840
adr = IX + (int8) RAM_PP(PC);
3841
CHECK_BREAK_BYTE(adr);
3842
SET_LOW_REGISTER(BC, GET_BYTE(adr));
3839
3845
case 0x54: /* LD D,IXH */
3841
3847
sim_brk_pend[0] = FALSE;
3842
Sethreg(DE, hreg(IX));
3848
SET_HIGH_REGISTER(DE, HIGH_REGISTER(IX));
3845
3851
case 0x55: /* LD D,IXL */
3847
3853
sim_brk_pend[0] = FALSE;
3848
Sethreg(DE, lreg(IX));
3854
SET_HIGH_REGISTER(DE, LOW_REGISTER(IX));
3851
3857
case 0x56: /* LD D,(IX+dd) */
3853
adr = IX + (int8) RAM_pp(PC);
3854
CheckBreakByte(adr);
3855
Sethreg(DE, GetBYTE(adr));
3859
adr = IX + (int8) RAM_PP(PC);
3860
CHECK_BREAK_BYTE(adr);
3861
SET_HIGH_REGISTER(DE, GET_BYTE(adr));
3858
3864
case 0x5c: /* LD E,IXH */
3860
3866
sim_brk_pend[0] = FALSE;
3861
Setlreg(DE, hreg(IX));
3867
SET_LOW_REGISTER(DE, HIGH_REGISTER(IX));
3864
3870
case 0x5d: /* LD E,IXL */
3866
3872
sim_brk_pend[0] = FALSE;
3867
Setlreg(DE, lreg(IX));
3873
SET_LOW_REGISTER(DE, LOW_REGISTER(IX));
3870
3876
case 0x5e: /* LD E,(IX+dd) */
3872
adr = IX + (int8) RAM_pp(PC);
3873
CheckBreakByte(adr);
3874
Setlreg(DE, GetBYTE(adr));
3878
adr = IX + (int8) RAM_PP(PC);
3879
CHECK_BREAK_BYTE(adr);
3880
SET_LOW_REGISTER(DE, GET_BYTE(adr));
3877
3883
case 0x60: /* LD IXH,B */
3879
3885
sim_brk_pend[0] = FALSE;
3880
Sethreg(IX, hreg(BC));
3886
SET_HIGH_REGISTER(IX, HIGH_REGISTER(BC));
3883
3889
case 0x61: /* LD IXH,C */
3885
3891
sim_brk_pend[0] = FALSE;
3886
Sethreg(IX, lreg(BC));
3892
SET_HIGH_REGISTER(IX, LOW_REGISTER(BC));
3889
3895
case 0x62: /* LD IXH,D */
3891
3897
sim_brk_pend[0] = FALSE;
3892
Sethreg(IX, hreg(DE));
3898
SET_HIGH_REGISTER(IX, HIGH_REGISTER(DE));
3895
3901
case 0x63: /* LD IXH,E */
3897
3903
sim_brk_pend[0] = FALSE;
3898
Sethreg(IX, lreg(DE));
3904
SET_HIGH_REGISTER(IX, LOW_REGISTER(DE));
3901
3907
case 0x64: /* LD IXH,IXH */
3906
3912
case 0x65: /* LD IXH,IXL */
3908
3914
sim_brk_pend[0] = FALSE;
3909
Sethreg(IX, lreg(IX));
3915
SET_HIGH_REGISTER(IX, LOW_REGISTER(IX));
3912
3918
case 0x66: /* LD H,(IX+dd) */
3914
adr = IX + (int8) RAM_pp(PC);
3915
CheckBreakByte(adr);
3916
Sethreg(HL, GetBYTE(adr));
3920
adr = IX + (int8) RAM_PP(PC);
3921
CHECK_BREAK_BYTE(adr);
3922
SET_HIGH_REGISTER(HL, GET_BYTE(adr));
3919
3925
case 0x67: /* LD IXH,A */
3921
3927
sim_brk_pend[0] = FALSE;
3922
Sethreg(IX, hreg(AF));
3928
SET_HIGH_REGISTER(IX, HIGH_REGISTER(AF));
3925
3931
case 0x68: /* LD IXL,B */
3927
3933
sim_brk_pend[0] = FALSE;
3928
Setlreg(IX, hreg(BC));
3934
SET_LOW_REGISTER(IX, HIGH_REGISTER(BC));
3931
3937
case 0x69: /* LD IXL,C */
3933
3939
sim_brk_pend[0] = FALSE;
3934
Setlreg(IX, lreg(BC));
3940
SET_LOW_REGISTER(IX, LOW_REGISTER(BC));
3937
3943
case 0x6a: /* LD IXL,D */
3939
3945
sim_brk_pend[0] = FALSE;
3940
Setlreg(IX, hreg(DE));
3946
SET_LOW_REGISTER(IX, HIGH_REGISTER(DE));
3943
3949
case 0x6b: /* LD IXL,E */
3945
3951
sim_brk_pend[0] = FALSE;
3946
Setlreg(IX, lreg(DE));
3952
SET_LOW_REGISTER(IX, LOW_REGISTER(DE));
3949
3955
case 0x6c: /* LD IXL,IXH */
3951
3957
sim_brk_pend[0] = FALSE;
3952
Setlreg(IX, hreg(IX));
3958
SET_LOW_REGISTER(IX, HIGH_REGISTER(IX));
3955
3961
case 0x6d: /* LD IXL,IXL */
3960
3966
case 0x6e: /* LD L,(IX+dd) */
3962
adr = IX + (int8) RAM_pp(PC);
3963
CheckBreakByte(adr);
3964
Setlreg(HL, GetBYTE(adr));
3968
adr = IX + (int8) RAM_PP(PC);
3969
CHECK_BREAK_BYTE(adr);
3970
SET_LOW_REGISTER(HL, GET_BYTE(adr));
3967
3973
case 0x6f: /* LD IXL,A */
3969
3975
sim_brk_pend[0] = FALSE;
3970
Setlreg(IX, hreg(AF));
3976
SET_LOW_REGISTER(IX, HIGH_REGISTER(AF));
3973
3979
case 0x70: /* LD (IX+dd),B */
3975
adr = IX + (int8) RAM_pp(PC);
3976
CheckBreakByte(adr);
3977
PutBYTE(adr, hreg(BC));
3981
adr = IX + (int8) RAM_PP(PC);
3982
CHECK_BREAK_BYTE(adr);
3983
PutBYTE(adr, HIGH_REGISTER(BC));
3980
3986
case 0x71: /* LD (IX+dd),C */
3982
adr = IX + (int8) RAM_pp(PC);
3983
CheckBreakByte(adr);
3984
PutBYTE(adr, lreg(BC));
3988
adr = IX + (int8) RAM_PP(PC);
3989
CHECK_BREAK_BYTE(adr);
3990
PutBYTE(adr, LOW_REGISTER(BC));
3987
3993
case 0x72: /* LD (IX+dd),D */
3989
adr = IX + (int8) RAM_pp(PC);
3990
CheckBreakByte(adr);
3991
PutBYTE(adr, hreg(DE));
3995
adr = IX + (int8) RAM_PP(PC);
3996
CHECK_BREAK_BYTE(adr);
3997
PutBYTE(adr, HIGH_REGISTER(DE));
3994
4000
case 0x73: /* LD (IX+dd),E */
3996
adr = IX + (int8) RAM_pp(PC);
3997
CheckBreakByte(adr);
3998
PutBYTE(adr, lreg(DE));
4002
adr = IX + (int8) RAM_PP(PC);
4003
CHECK_BREAK_BYTE(adr);
4004
PutBYTE(adr, LOW_REGISTER(DE));
4001
4007
case 0x74: /* LD (IX+dd),H */
4003
adr = IX + (int8) RAM_pp(PC);
4004
CheckBreakByte(adr);
4005
PutBYTE(adr, hreg(HL));
4009
adr = IX + (int8) RAM_PP(PC);
4010
CHECK_BREAK_BYTE(adr);
4011
PutBYTE(adr, HIGH_REGISTER(HL));
4008
4014
case 0x75: /* LD (IX+dd),L */
4010
adr = IX + (int8) RAM_pp(PC);
4011
CheckBreakByte(adr);
4012
PutBYTE(adr, lreg(HL));
4016
adr = IX + (int8) RAM_PP(PC);
4017
CHECK_BREAK_BYTE(adr);
4018
PutBYTE(adr, LOW_REGISTER(HL));
4015
4021
case 0x77: /* LD (IX+dd),A */
4017
adr = IX + (int8) RAM_pp(PC);
4018
CheckBreakByte(adr);
4019
PutBYTE(adr, hreg(AF));
4023
adr = IX + (int8) RAM_PP(PC);
4024
CHECK_BREAK_BYTE(adr);
4025
PutBYTE(adr, HIGH_REGISTER(AF));
4022
4028
case 0x7c: /* LD A,IXH */
4024
4030
sim_brk_pend[0] = FALSE;
4025
Sethreg(AF, hreg(IX));
4031
SET_HIGH_REGISTER(AF, HIGH_REGISTER(IX));
4028
4034
case 0x7d: /* LD A,IXL */
4030
4036
sim_brk_pend[0] = FALSE;
4031
Sethreg(AF, lreg(IX));
4037
SET_HIGH_REGISTER(AF, LOW_REGISTER(IX));
4034
4040
case 0x7e: /* LD A,(IX+dd) */
4036
adr = IX + (int8) RAM_pp(PC);
4037
CheckBreakByte(adr);
4038
Sethreg(AF, GetBYTE(adr));
4042
adr = IX + (int8) RAM_PP(PC);
4043
CHECK_BREAK_BYTE(adr);
4044
SET_HIGH_REGISTER(AF, GET_BYTE(adr));
4041
4047
case 0x84: /* ADD A,IXH */
4043
4049
sim_brk_pend[0] = FALSE;
4050
temp = HIGH_REGISTER(IX);
4051
acu = HIGH_REGISTER(AF);
4046
4052
sum = acu + temp;
4047
4053
AF = addTable[sum] | cbitsZ80Table[acu ^ temp ^ sum];
4956
4962
case 0xa3: /* OUTI */
4959
out(lreg(BC), GetBYTE(HL));
4964
CHECK_BREAK_BYTE(HL);
4965
out(LOW_REGISTER(BC), GET_BYTE(HL));
4962
Sethreg(BC, lreg(BC) - 1);
4963
SETFLAG(Z, lreg(BC) == 0);
4968
SET_HIGH_REGISTER(BC, LOW_REGISTER(BC) - 1);
4969
SETFLAG(Z, LOW_REGISTER(BC) == 0);
4966
4972
case 0xa8: /* LDD */
4968
CheckBreakTwoBytes(HL, DE);
4970
PutBYTE_mm(DE, acu);
4974
CHECK_BREAK_TWO_BYTES(HL, DE);
4976
PUT_BYTE_MM(DE, acu);
4977
acu += HIGH_REGISTER(AF);
4972
4978
AF = (AF & ~0x3e) | (acu & 8) | ((acu & 2) << 4) |
4973
4979
(((--BC & ADDRMASK) != 0) << 2);
4976
4982
case 0xa9: /* CPD */
4984
CHECK_BREAK_BYTE(HL);
4985
acu = HIGH_REGISTER(AF);
4981
4987
sum = acu - temp;
4982
4988
cbits = acu ^ temp ^ sum;
4983
4989
AF = (AF & ~0xfe) | (sum & 0x80) | (!(sum & 0xff) << 6) |
4992
4998
case 0xaa: /* IND */
4995
PutBYTE(HL, in(lreg(BC)));
5000
CHECK_BREAK_BYTE(HL);
5001
PutBYTE(HL, in(LOW_REGISTER(BC)));
4998
Sethreg(BC, lreg(BC) - 1);
4999
SETFLAG(Z, lreg(BC) == 0);
5004
SET_HIGH_REGISTER(BC, LOW_REGISTER(BC) - 1);
5005
SETFLAG(Z, LOW_REGISTER(BC) == 0);
5002
5008
case 0xab: /* OUTD */
5005
out(lreg(BC), GetBYTE(HL));
5010
CHECK_BREAK_BYTE(HL);
5011
out(LOW_REGISTER(BC), GET_BYTE(HL));
5008
Sethreg(BC, lreg(BC) - 1);
5009
SETFLAG(Z, lreg(BC) == 0);
5014
SET_HIGH_REGISTER(BC, LOW_REGISTER(BC) - 1);
5015
SETFLAG(Z, LOW_REGISTER(BC) == 0);
5012
5018
case 0xb0: /* LDIR */
5020
acu = HIGH_REGISTER(AF);
5015
5021
BC &= ADDRMASK;
5018
CheckBreakTwoBytes(HL, DE);
5020
PutBYTE_pp(DE, acu);
5024
CHECK_BREAK_TWO_BYTES(HL, DE);
5026
PUT_BYTE_PP(DE, acu);
5021
5027
} while (--BC);
5028
acu += HIGH_REGISTER(AF);
5023
5029
AF = (AF & ~0x3e) | (acu & 8) | ((acu & 2) << 4);
5026
5032
case 0xb1: /* CPIR */
5034
acu = HIGH_REGISTER(AF);
5029
5035
BC &= ADDRMASK;
5038
CHECK_BREAK_BYTE(HL);
5034
5040
op = --BC != 0;
5035
5041
sum = acu - temp;
5036
5042
} while (op && sum != 0);
5333
5339
case 0x2c: /* INC IYL */
5335
5341
sim_brk_pend[0] = FALSE;
5336
temp = lreg(IY) + 1;
5342
temp = LOW_REGISTER(IY) + 1;
5343
SET_LOW_REGISTER(IY, temp);
5338
5344
AF = (AF & ~0xfe) | incZ80Table[temp];
5341
5347
case 0x2d: /* DEC IYL */
5343
5349
sim_brk_pend[0] = FALSE;
5344
temp = lreg(IY) - 1;
5350
temp = LOW_REGISTER(IY) - 1;
5351
SET_LOW_REGISTER(IY, temp);
5346
5352
AF = (AF & ~0xfe) | decZ80Table[temp & 0xff];
5349
5355
case 0x2e: /* LD IYL,nn */
5351
5357
sim_brk_pend[0] = FALSE;
5352
Setlreg(IY, RAM_pp(PC));
5358
SET_LOW_REGISTER(IY, RAM_PP(PC));
5355
5361
case 0x34: /* INC (IY+dd) */
5357
adr = IY + (int8) RAM_pp(PC);
5358
CheckBreakByte(adr);
5359
temp = GetBYTE(adr) + 1;
5363
adr = IY + (int8) RAM_PP(PC);
5364
CHECK_BREAK_BYTE(adr);
5365
temp = GET_BYTE(adr) + 1;
5360
5366
PutBYTE(adr, temp);
5361
5367
AF = (AF & ~0xfe) | incZ80Table[temp];
5364
5370
case 0x35: /* DEC (IY+dd) */
5366
adr = IY + (int8) RAM_pp(PC);
5367
CheckBreakByte(adr);
5368
temp = GetBYTE(adr) - 1;
5372
adr = IY + (int8) RAM_PP(PC);
5373
CHECK_BREAK_BYTE(adr);
5374
temp = GET_BYTE(adr) - 1;
5369
5375
PutBYTE(adr, temp);
5370
5376
AF = (AF & ~0xfe) | decZ80Table[temp & 0xff];
5373
5379
case 0x36: /* LD (IY+dd),nn */
5375
adr = IY + (int8) RAM_pp(PC);
5376
CheckBreakByte(adr);
5377
PutBYTE(adr, RAM_pp(PC));
5381
adr = IY + (int8) RAM_PP(PC);
5382
CHECK_BREAK_BYTE(adr);
5383
PutBYTE(adr, RAM_PP(PC));
5380
5386
case 0x39: /* ADD IY,SP */
5390
5396
case 0x44: /* LD B,IYH */
5392
5398
sim_brk_pend[0] = FALSE;
5393
Sethreg(BC, hreg(IY));
5399
SET_HIGH_REGISTER(BC, HIGH_REGISTER(IY));
5396
5402
case 0x45: /* LD B,IYL */
5398
5404
sim_brk_pend[0] = FALSE;
5399
Sethreg(BC, lreg(IY));
5405
SET_HIGH_REGISTER(BC, LOW_REGISTER(IY));
5402
5408
case 0x46: /* LD B,(IY+dd) */
5404
adr = IY + (int8) RAM_pp(PC);
5405
CheckBreakByte(adr);
5406
Sethreg(BC, GetBYTE(adr));
5410
adr = IY + (int8) RAM_PP(PC);
5411
CHECK_BREAK_BYTE(adr);
5412
SET_HIGH_REGISTER(BC, GET_BYTE(adr));
5409
5415
case 0x4c: /* LD C,IYH */
5411
5417
sim_brk_pend[0] = FALSE;
5412
Setlreg(BC, hreg(IY));
5418
SET_LOW_REGISTER(BC, HIGH_REGISTER(IY));
5415
5421
case 0x4d: /* LD C,IYL */
5417
5423
sim_brk_pend[0] = FALSE;
5418
Setlreg(BC, lreg(IY));
5424
SET_LOW_REGISTER(BC, LOW_REGISTER(IY));
5421
5427
case 0x4e: /* LD C,(IY+dd) */
5423
adr = IY + (int8) RAM_pp(PC);
5424
CheckBreakByte(adr);
5425
Setlreg(BC, GetBYTE(adr));
5429
adr = IY + (int8) RAM_PP(PC);
5430
CHECK_BREAK_BYTE(adr);
5431
SET_LOW_REGISTER(BC, GET_BYTE(adr));
5428
5434
case 0x54: /* LD D,IYH */
5430
5436
sim_brk_pend[0] = FALSE;
5431
Sethreg(DE, hreg(IY));
5437
SET_HIGH_REGISTER(DE, HIGH_REGISTER(IY));
5434
5440
case 0x55: /* LD D,IYL */
5436
5442
sim_brk_pend[0] = FALSE;
5437
Sethreg(DE, lreg(IY));
5443
SET_HIGH_REGISTER(DE, LOW_REGISTER(IY));
5440
5446
case 0x56: /* LD D,(IY+dd) */
5442
adr = IY + (int8) RAM_pp(PC);
5443
CheckBreakByte(adr);
5444
Sethreg(DE, GetBYTE(adr));
5448
adr = IY + (int8) RAM_PP(PC);
5449
CHECK_BREAK_BYTE(adr);
5450
SET_HIGH_REGISTER(DE, GET_BYTE(adr));
5447
5453
case 0x5c: /* LD E,IYH */
5449
5455
sim_brk_pend[0] = FALSE;
5450
Setlreg(DE, hreg(IY));
5456
SET_LOW_REGISTER(DE, HIGH_REGISTER(IY));
5453
5459
case 0x5d: /* LD E,IYL */
5455
5461
sim_brk_pend[0] = FALSE;
5456
Setlreg(DE, lreg(IY));
5462
SET_LOW_REGISTER(DE, LOW_REGISTER(IY));
5459
5465
case 0x5e: /* LD E,(IY+dd) */
5461
adr = IY + (int8) RAM_pp(PC);
5462
CheckBreakByte(adr);
5463
Setlreg(DE, GetBYTE(adr));
5467
adr = IY + (int8) RAM_PP(PC);
5468
CHECK_BREAK_BYTE(adr);
5469
SET_LOW_REGISTER(DE, GET_BYTE(adr));
5466
5472
case 0x60: /* LD IYH,B */
5468
5474
sim_brk_pend[0] = FALSE;
5469
Sethreg(IY, hreg(BC));
5475
SET_HIGH_REGISTER(IY, HIGH_REGISTER(BC));
5472
5478
case 0x61: /* LD IYH,C */
5474
5480
sim_brk_pend[0] = FALSE;
5475
Sethreg(IY, lreg(BC));
5481
SET_HIGH_REGISTER(IY, LOW_REGISTER(BC));
5478
5484
case 0x62: /* LD IYH,D */
5480
5486
sim_brk_pend[0] = FALSE;
5481
Sethreg(IY, hreg(DE));
5487
SET_HIGH_REGISTER(IY, HIGH_REGISTER(DE));
5484
5490
case 0x63: /* LD IYH,E */
5486
5492
sim_brk_pend[0] = FALSE;
5487
Sethreg(IY, lreg(DE));
5493
SET_HIGH_REGISTER(IY, LOW_REGISTER(DE));
5490
5496
case 0x64: /* LD IYH,IYH */
5495
5501
case 0x65: /* LD IYH,IYL */
5497
5503
sim_brk_pend[0] = FALSE;
5498
Sethreg(IY, lreg(IY));
5504
SET_HIGH_REGISTER(IY, LOW_REGISTER(IY));
5501
5507
case 0x66: /* LD H,(IY+dd) */
5503
adr = IY + (int8) RAM_pp(PC);
5504
CheckBreakByte(adr);
5505
Sethreg(HL, GetBYTE(adr));
5509
adr = IY + (int8) RAM_PP(PC);
5510
CHECK_BREAK_BYTE(adr);
5511
SET_HIGH_REGISTER(HL, GET_BYTE(adr));
5508
5514
case 0x67: /* LD IYH,A */
5510
5516
sim_brk_pend[0] = FALSE;
5511
Sethreg(IY, hreg(AF));
5517
SET_HIGH_REGISTER(IY, HIGH_REGISTER(AF));
5514
5520
case 0x68: /* LD IYL,B */
5516
5522
sim_brk_pend[0] = FALSE;
5517
Setlreg(IY, hreg(BC));
5523
SET_LOW_REGISTER(IY, HIGH_REGISTER(BC));
5520
5526
case 0x69: /* LD IYL,C */
5522
5528
sim_brk_pend[0] = FALSE;
5523
Setlreg(IY, lreg(BC));
5529
SET_LOW_REGISTER(IY, LOW_REGISTER(BC));
5526
5532
case 0x6a: /* LD IYL,D */
5528
5534
sim_brk_pend[0] = FALSE;
5529
Setlreg(IY, hreg(DE));
5535
SET_LOW_REGISTER(IY, HIGH_REGISTER(DE));
5532
5538
case 0x6b: /* LD IYL,E */
5534
5540
sim_brk_pend[0] = FALSE;
5535
Setlreg(IY, lreg(DE));
5541
SET_LOW_REGISTER(IY, LOW_REGISTER(DE));
5538
5544
case 0x6c: /* LD IYL,IYH */
5540
5546
sim_brk_pend[0] = FALSE;
5541
Setlreg(IY, hreg(IY));
5547
SET_LOW_REGISTER(IY, HIGH_REGISTER(IY));
5544
5550
case 0x6d: /* LD IYL,IYL */
5549
5555
case 0x6e: /* LD L,(IY+dd) */
5551
adr = IY + (int8) RAM_pp(PC);
5552
CheckBreakByte(adr);
5553
Setlreg(HL, GetBYTE(adr));
5557
adr = IY + (int8) RAM_PP(PC);
5558
CHECK_BREAK_BYTE(adr);
5559
SET_LOW_REGISTER(HL, GET_BYTE(adr));
5556
5562
case 0x6f: /* LD IYL,A */
5558
5564
sim_brk_pend[0] = FALSE;
5559
Setlreg(IY, hreg(AF));
5565
SET_LOW_REGISTER(IY, HIGH_REGISTER(AF));
5562
5568
case 0x70: /* LD (IY+dd),B */
5564
adr = IY + (int8) RAM_pp(PC);
5565
CheckBreakByte(adr);
5566
PutBYTE(adr, hreg(BC));
5570
adr = IY + (int8) RAM_PP(PC);
5571
CHECK_BREAK_BYTE(adr);
5572
PutBYTE(adr, HIGH_REGISTER(BC));
5569
5575
case 0x71: /* LD (IY+dd),C */
5571
adr = IY + (int8) RAM_pp(PC);
5572
CheckBreakByte(adr);
5573
PutBYTE(adr, lreg(BC));
5577
adr = IY + (int8) RAM_PP(PC);
5578
CHECK_BREAK_BYTE(adr);
5579
PutBYTE(adr, LOW_REGISTER(BC));
5576
5582
case 0x72: /* LD (IY+dd),D */
5578
adr = IY + (int8) RAM_pp(PC);
5579
CheckBreakByte(adr);
5580
PutBYTE(adr, hreg(DE));
5584
adr = IY + (int8) RAM_PP(PC);
5585
CHECK_BREAK_BYTE(adr);
5586
PutBYTE(adr, HIGH_REGISTER(DE));
5583
5589
case 0x73: /* LD (IY+dd),E */
5585
adr = IY + (int8) RAM_pp(PC);
5586
CheckBreakByte(adr);
5587
PutBYTE(adr, lreg(DE));
5591
adr = IY + (int8) RAM_PP(PC);
5592
CHECK_BREAK_BYTE(adr);
5593
PutBYTE(adr, LOW_REGISTER(DE));
5590
5596
case 0x74: /* LD (IY+dd),H */
5592
adr = IY + (int8) RAM_pp(PC);
5593
CheckBreakByte(adr);
5594
PutBYTE(adr, hreg(HL));
5598
adr = IY + (int8) RAM_PP(PC);
5599
CHECK_BREAK_BYTE(adr);
5600
PutBYTE(adr, HIGH_REGISTER(HL));
5597
5603
case 0x75: /* LD (IY+dd),L */
5599
adr = IY + (int8) RAM_pp(PC);
5600
CheckBreakByte(adr);
5601
PutBYTE(adr, lreg(HL));
5605
adr = IY + (int8) RAM_PP(PC);
5606
CHECK_BREAK_BYTE(adr);
5607
PutBYTE(adr, LOW_REGISTER(HL));
5604
5610
case 0x77: /* LD (IY+dd),A */
5606
adr = IY + (int8) RAM_pp(PC);
5607
CheckBreakByte(adr);
5608
PutBYTE(adr, hreg(AF));
5612
adr = IY + (int8) RAM_PP(PC);
5613
CHECK_BREAK_BYTE(adr);
5614
PutBYTE(adr, HIGH_REGISTER(AF));
5611
5617
case 0x7c: /* LD A,IYH */
5613
5619
sim_brk_pend[0] = FALSE;
5614
Sethreg(AF, hreg(IY));
5620
SET_HIGH_REGISTER(AF, HIGH_REGISTER(IY));
5617
5623
case 0x7d: /* LD A,IYL */
5619
5625
sim_brk_pend[0] = FALSE;
5620
Sethreg(AF, lreg(IY));
5626
SET_HIGH_REGISTER(AF, LOW_REGISTER(IY));
5623
5629
case 0x7e: /* LD A,(IY+dd) */
5625
adr = IY + (int8) RAM_pp(PC);
5626
CheckBreakByte(adr);
5627
Sethreg(AF, GetBYTE(adr));
5631
adr = IY + (int8) RAM_PP(PC);
5632
CHECK_BREAK_BYTE(adr);
5633
SET_HIGH_REGISTER(AF, GET_BYTE(adr));
5630
5636
case 0x84: /* ADD A,IYH */
5632
5638
sim_brk_pend[0] = FALSE;
5639
temp = HIGH_REGISTER(IY);
5640
acu = HIGH_REGISTER(AF);
5635
5641
sum = acu + temp;
5636
5642
AF = addTable[sum] | cbitsZ80Table[acu ^ temp ^ sum];
6128
6134
ROMHigh = temp;
6130
6136
if (cpu_unit.flags & UNIT_ALTAIRROM) {
6131
if (defaultROMLow < ROMLow) {
6132
printf("ROMLOW [%04X] reset to %04X since Altair ROM was desired.\n", ROMLow, defaultROMLow);
6133
ROMLow = defaultROMLow;
6137
if (DEFAULT_ROM_LOW < ROMLow) {
6138
printf("ROMLOW [%04X] reset to %04X since Altair ROM was desired.\n", ROMLow, DEFAULT_ROM_LOW);
6139
ROMLow = DEFAULT_ROM_LOW;
6135
if (ROMHigh < defaultROMHigh) {
6136
printf("ROMHIGH [%04X] reset to %04X since Altair ROM was desired.\n", ROMHigh, defaultROMHigh);
6137
ROMHigh = defaultROMHigh;
6141
if (ROMHigh < DEFAULT_ROM_HIGH) {
6142
printf("ROMHIGH [%04X] reset to %04X since Altair ROM was desired.\n", ROMHigh, DEFAULT_ROM_HIGH);
6143
ROMHigh = DEFAULT_ROM_HIGH;
6155
6161
static t_stat cpu_set_altairrom(UNIT *uptr, int32 value, char *cptr, void *desc) {
6156
6162
install_bootrom();
6157
if (ROMLow != defaultROMLow) {
6158
printf("\"D ROMLOW %04X\" also executed.\n", defaultROMLow);
6159
ROMLow = defaultROMLow;
6163
if (ROMLow != DEFAULT_ROM_LOW) {
6164
printf("\"D ROMLOW %04X\" also executed.\n", DEFAULT_ROM_LOW);
6165
ROMLow = DEFAULT_ROM_LOW;
6161
if (ROMHigh != defaultROMHigh) {
6162
printf("\"D ROMHIGH %04X\" also executed.\n", defaultROMHigh);
6163
ROMHigh = defaultROMHigh;
6167
if (ROMHigh != DEFAULT_ROM_HIGH) {
6168
printf("\"D ROMHIGH %04X\" also executed.\n", DEFAULT_ROM_HIGH);
6169
ROMHigh = DEFAULT_ROM_HIGH;
6165
6171
if (!(cpu_unit.flags & UNIT_ROM)) {
6166
6172
printf("\"SET CPU ROM\" also executed.\n");