|
48 | 48 | is supported; the "unused" opcodes behave as the guaranteed NOPs of their |
49 | 49 | documented length. |
50 | 50 |
|
51 | | - The instruction timing is verified cycle-by-cycle against the SingleStepTests |
52 | | - "wdc65c02" test vectors (every opcode except WAI and STP, which halt the CPU |
53 | | - and cannot be single-stepped), and the instruction behaviour against Klaus |
54 | | - Dormann's 65C02 extended opcodes functional test. |
| 51 | + The instruction timing is verified cycle-by-cycle against the |
| 52 | + SingleStepTests/65x02 "wdc65c02" (v1) test vectors (every opcode except WAI |
| 53 | + and STP, which halt the CPU and cannot be single-stepped), and the |
| 54 | + instruction behaviour against Klaus Dormann's 65C02 extended opcodes |
| 55 | + functional test. |
55 | 56 |
|
56 | 57 | To initialize the emulator, fill out a w65c02_desc_t structure with |
57 | 58 | initialization parameters and then call w65c02_init(). |
@@ -733,11 +734,11 @@ uint64_t w65c02_tick(w65c02_t* c, uint64_t pins) { |
733 | 734 | /* BBR0 */ |
734 | 735 | case (0x0F<<3)|0: _SA(c->PC++);break; |
735 | 736 | case (0x0F<<3)|1: c->AD=_GD();_SA(c->AD);break; |
736 | | - case (0x0F<<3)|2: c->AD=_GD();_SD(c->AD);_WR();break; |
| 737 | + case (0x0F<<3)|2: c->AD=_GD();_SA(_GA());break; |
737 | 738 | case (0x0F<<3)|3: c->AD=(c->AD>>0)&1;_SA(c->PC++);break; |
738 | | - case (0x0F<<3)|4: {uint16_t _t=c->PC+(int8_t)_GD();_SA((c->PC&0xFF00)|(_t&0x00FF));if(0==(uint8_t)c->AD){c->PC=_t;}}break; |
739 | | - case (0x0F<<3)|5: _FETCH();break; |
740 | | - case (0x0F<<3)|6: assert(false);break; |
| 739 | + case (0x0F<<3)|4: if(0==(uint8_t)c->AD){c->AD=c->PC+(int8_t)_GD();_SA(c->PC);}else{_FETCH();}break; |
| 740 | + case (0x0F<<3)|5: if((c->AD&0xFF00)==(c->PC&0xFF00)){c->PC=c->AD;_FETCH();}else{_SA(c->PC);}break; |
| 741 | + case (0x0F<<3)|6: c->PC=c->AD;_FETCH();break; |
741 | 742 | case (0x0F<<3)|7: assert(false);break; |
742 | 743 | /* BPL */ |
743 | 744 | case (0x10<<3)|0: _SA(c->PC++);break; |
@@ -877,11 +878,11 @@ uint64_t w65c02_tick(w65c02_t* c, uint64_t pins) { |
877 | 878 | /* BBR1 */ |
878 | 879 | case (0x1F<<3)|0: _SA(c->PC++);break; |
879 | 880 | case (0x1F<<3)|1: c->AD=_GD();_SA(c->AD);break; |
880 | | - case (0x1F<<3)|2: c->AD=_GD();_SD(c->AD);_WR();break; |
| 881 | + case (0x1F<<3)|2: c->AD=_GD();_SA(_GA());break; |
881 | 882 | case (0x1F<<3)|3: c->AD=(c->AD>>1)&1;_SA(c->PC++);break; |
882 | | - case (0x1F<<3)|4: {uint16_t _t=c->PC+(int8_t)_GD();_SA((c->PC&0xFF00)|(_t&0x00FF));if(0==(uint8_t)c->AD){c->PC=_t;}}break; |
883 | | - case (0x1F<<3)|5: _FETCH();break; |
884 | | - case (0x1F<<3)|6: assert(false);break; |
| 883 | + case (0x1F<<3)|4: if(0==(uint8_t)c->AD){c->AD=c->PC+(int8_t)_GD();_SA(c->PC);}else{_FETCH();}break; |
| 884 | + case (0x1F<<3)|5: if((c->AD&0xFF00)==(c->PC&0xFF00)){c->PC=c->AD;_FETCH();}else{_SA(c->PC);}break; |
| 885 | + case (0x1F<<3)|6: c->PC=c->AD;_FETCH();break; |
885 | 886 | case (0x1F<<3)|7: assert(false);break; |
886 | 887 | /* JSR */ |
887 | 888 | case (0x20<<3)|0: _SA(c->PC++);break; |
@@ -1021,11 +1022,11 @@ uint64_t w65c02_tick(w65c02_t* c, uint64_t pins) { |
1021 | 1022 | /* BBR2 */ |
1022 | 1023 | case (0x2F<<3)|0: _SA(c->PC++);break; |
1023 | 1024 | case (0x2F<<3)|1: c->AD=_GD();_SA(c->AD);break; |
1024 | | - case (0x2F<<3)|2: c->AD=_GD();_SD(c->AD);_WR();break; |
| 1025 | + case (0x2F<<3)|2: c->AD=_GD();_SA(_GA());break; |
1025 | 1026 | case (0x2F<<3)|3: c->AD=(c->AD>>2)&1;_SA(c->PC++);break; |
1026 | | - case (0x2F<<3)|4: {uint16_t _t=c->PC+(int8_t)_GD();_SA((c->PC&0xFF00)|(_t&0x00FF));if(0==(uint8_t)c->AD){c->PC=_t;}}break; |
1027 | | - case (0x2F<<3)|5: _FETCH();break; |
1028 | | - case (0x2F<<3)|6: assert(false);break; |
| 1027 | + case (0x2F<<3)|4: if(0==(uint8_t)c->AD){c->AD=c->PC+(int8_t)_GD();_SA(c->PC);}else{_FETCH();}break; |
| 1028 | + case (0x2F<<3)|5: if((c->AD&0xFF00)==(c->PC&0xFF00)){c->PC=c->AD;_FETCH();}else{_SA(c->PC);}break; |
| 1029 | + case (0x2F<<3)|6: c->PC=c->AD;_FETCH();break; |
1029 | 1030 | case (0x2F<<3)|7: assert(false);break; |
1030 | 1031 | /* BMI */ |
1031 | 1032 | case (0x30<<3)|0: _SA(c->PC++);break; |
@@ -1165,11 +1166,11 @@ uint64_t w65c02_tick(w65c02_t* c, uint64_t pins) { |
1165 | 1166 | /* BBR3 */ |
1166 | 1167 | case (0x3F<<3)|0: _SA(c->PC++);break; |
1167 | 1168 | case (0x3F<<3)|1: c->AD=_GD();_SA(c->AD);break; |
1168 | | - case (0x3F<<3)|2: c->AD=_GD();_SD(c->AD);_WR();break; |
| 1169 | + case (0x3F<<3)|2: c->AD=_GD();_SA(_GA());break; |
1169 | 1170 | case (0x3F<<3)|3: c->AD=(c->AD>>3)&1;_SA(c->PC++);break; |
1170 | | - case (0x3F<<3)|4: {uint16_t _t=c->PC+(int8_t)_GD();_SA((c->PC&0xFF00)|(_t&0x00FF));if(0==(uint8_t)c->AD){c->PC=_t;}}break; |
1171 | | - case (0x3F<<3)|5: _FETCH();break; |
1172 | | - case (0x3F<<3)|6: assert(false);break; |
| 1171 | + case (0x3F<<3)|4: if(0==(uint8_t)c->AD){c->AD=c->PC+(int8_t)_GD();_SA(c->PC);}else{_FETCH();}break; |
| 1172 | + case (0x3F<<3)|5: if((c->AD&0xFF00)==(c->PC&0xFF00)){c->PC=c->AD;_FETCH();}else{_SA(c->PC);}break; |
| 1173 | + case (0x3F<<3)|6: c->PC=c->AD;_FETCH();break; |
1173 | 1174 | case (0x3F<<3)|7: assert(false);break; |
1174 | 1175 | /* RTI */ |
1175 | 1176 | case (0x40<<3)|0: _SA(c->PC);break; |
@@ -1309,11 +1310,11 @@ uint64_t w65c02_tick(w65c02_t* c, uint64_t pins) { |
1309 | 1310 | /* BBR4 */ |
1310 | 1311 | case (0x4F<<3)|0: _SA(c->PC++);break; |
1311 | 1312 | case (0x4F<<3)|1: c->AD=_GD();_SA(c->AD);break; |
1312 | | - case (0x4F<<3)|2: c->AD=_GD();_SD(c->AD);_WR();break; |
| 1313 | + case (0x4F<<3)|2: c->AD=_GD();_SA(_GA());break; |
1313 | 1314 | case (0x4F<<3)|3: c->AD=(c->AD>>4)&1;_SA(c->PC++);break; |
1314 | | - case (0x4F<<3)|4: {uint16_t _t=c->PC+(int8_t)_GD();_SA((c->PC&0xFF00)|(_t&0x00FF));if(0==(uint8_t)c->AD){c->PC=_t;}}break; |
1315 | | - case (0x4F<<3)|5: _FETCH();break; |
1316 | | - case (0x4F<<3)|6: assert(false);break; |
| 1315 | + case (0x4F<<3)|4: if(0==(uint8_t)c->AD){c->AD=c->PC+(int8_t)_GD();_SA(c->PC);}else{_FETCH();}break; |
| 1316 | + case (0x4F<<3)|5: if((c->AD&0xFF00)==(c->PC&0xFF00)){c->PC=c->AD;_FETCH();}else{_SA(c->PC);}break; |
| 1317 | + case (0x4F<<3)|6: c->PC=c->AD;_FETCH();break; |
1317 | 1318 | case (0x4F<<3)|7: assert(false);break; |
1318 | 1319 | /* BVC */ |
1319 | 1320 | case (0x50<<3)|0: _SA(c->PC++);break; |
@@ -1453,11 +1454,11 @@ uint64_t w65c02_tick(w65c02_t* c, uint64_t pins) { |
1453 | 1454 | /* BBR5 */ |
1454 | 1455 | case (0x5F<<3)|0: _SA(c->PC++);break; |
1455 | 1456 | case (0x5F<<3)|1: c->AD=_GD();_SA(c->AD);break; |
1456 | | - case (0x5F<<3)|2: c->AD=_GD();_SD(c->AD);_WR();break; |
| 1457 | + case (0x5F<<3)|2: c->AD=_GD();_SA(_GA());break; |
1457 | 1458 | case (0x5F<<3)|3: c->AD=(c->AD>>5)&1;_SA(c->PC++);break; |
1458 | | - case (0x5F<<3)|4: {uint16_t _t=c->PC+(int8_t)_GD();_SA((c->PC&0xFF00)|(_t&0x00FF));if(0==(uint8_t)c->AD){c->PC=_t;}}break; |
1459 | | - case (0x5F<<3)|5: _FETCH();break; |
1460 | | - case (0x5F<<3)|6: assert(false);break; |
| 1459 | + case (0x5F<<3)|4: if(0==(uint8_t)c->AD){c->AD=c->PC+(int8_t)_GD();_SA(c->PC);}else{_FETCH();}break; |
| 1460 | + case (0x5F<<3)|5: if((c->AD&0xFF00)==(c->PC&0xFF00)){c->PC=c->AD;_FETCH();}else{_SA(c->PC);}break; |
| 1461 | + case (0x5F<<3)|6: c->PC=c->AD;_FETCH();break; |
1461 | 1462 | case (0x5F<<3)|7: assert(false);break; |
1462 | 1463 | /* RTS */ |
1463 | 1464 | case (0x60<<3)|0: _SA(c->PC);break; |
@@ -1597,11 +1598,11 @@ uint64_t w65c02_tick(w65c02_t* c, uint64_t pins) { |
1597 | 1598 | /* BBR6 */ |
1598 | 1599 | case (0x6F<<3)|0: _SA(c->PC++);break; |
1599 | 1600 | case (0x6F<<3)|1: c->AD=_GD();_SA(c->AD);break; |
1600 | | - case (0x6F<<3)|2: c->AD=_GD();_SD(c->AD);_WR();break; |
| 1601 | + case (0x6F<<3)|2: c->AD=_GD();_SA(_GA());break; |
1601 | 1602 | case (0x6F<<3)|3: c->AD=(c->AD>>6)&1;_SA(c->PC++);break; |
1602 | | - case (0x6F<<3)|4: {uint16_t _t=c->PC+(int8_t)_GD();_SA((c->PC&0xFF00)|(_t&0x00FF));if(0==(uint8_t)c->AD){c->PC=_t;}}break; |
1603 | | - case (0x6F<<3)|5: _FETCH();break; |
1604 | | - case (0x6F<<3)|6: assert(false);break; |
| 1603 | + case (0x6F<<3)|4: if(0==(uint8_t)c->AD){c->AD=c->PC+(int8_t)_GD();_SA(c->PC);}else{_FETCH();}break; |
| 1604 | + case (0x6F<<3)|5: if((c->AD&0xFF00)==(c->PC&0xFF00)){c->PC=c->AD;_FETCH();}else{_SA(c->PC);}break; |
| 1605 | + case (0x6F<<3)|6: c->PC=c->AD;_FETCH();break; |
1605 | 1606 | case (0x6F<<3)|7: assert(false);break; |
1606 | 1607 | /* BVS */ |
1607 | 1608 | case (0x70<<3)|0: _SA(c->PC++);break; |
@@ -1741,11 +1742,11 @@ uint64_t w65c02_tick(w65c02_t* c, uint64_t pins) { |
1741 | 1742 | /* BBR7 */ |
1742 | 1743 | case (0x7F<<3)|0: _SA(c->PC++);break; |
1743 | 1744 | case (0x7F<<3)|1: c->AD=_GD();_SA(c->AD);break; |
1744 | | - case (0x7F<<3)|2: c->AD=_GD();_SD(c->AD);_WR();break; |
| 1745 | + case (0x7F<<3)|2: c->AD=_GD();_SA(_GA());break; |
1745 | 1746 | case (0x7F<<3)|3: c->AD=(c->AD>>7)&1;_SA(c->PC++);break; |
1746 | | - case (0x7F<<3)|4: {uint16_t _t=c->PC+(int8_t)_GD();_SA((c->PC&0xFF00)|(_t&0x00FF));if(0==(uint8_t)c->AD){c->PC=_t;}}break; |
1747 | | - case (0x7F<<3)|5: _FETCH();break; |
1748 | | - case (0x7F<<3)|6: assert(false);break; |
| 1747 | + case (0x7F<<3)|4: if(0==(uint8_t)c->AD){c->AD=c->PC+(int8_t)_GD();_SA(c->PC);}else{_FETCH();}break; |
| 1748 | + case (0x7F<<3)|5: if((c->AD&0xFF00)==(c->PC&0xFF00)){c->PC=c->AD;_FETCH();}else{_SA(c->PC);}break; |
| 1749 | + case (0x7F<<3)|6: c->PC=c->AD;_FETCH();break; |
1749 | 1750 | case (0x7F<<3)|7: assert(false);break; |
1750 | 1751 | /* BRA */ |
1751 | 1752 | case (0x80<<3)|0: _SA(c->PC++);break; |
@@ -1885,11 +1886,11 @@ uint64_t w65c02_tick(w65c02_t* c, uint64_t pins) { |
1885 | 1886 | /* BBS0 */ |
1886 | 1887 | case (0x8F<<3)|0: _SA(c->PC++);break; |
1887 | 1888 | case (0x8F<<3)|1: c->AD=_GD();_SA(c->AD);break; |
1888 | | - case (0x8F<<3)|2: c->AD=_GD();_SD(c->AD);_WR();break; |
| 1889 | + case (0x8F<<3)|2: c->AD=_GD();_SA(_GA());break; |
1889 | 1890 | case (0x8F<<3)|3: c->AD=(c->AD>>0)&1;_SA(c->PC++);break; |
1890 | | - case (0x8F<<3)|4: {uint16_t _t=c->PC+(int8_t)_GD();_SA((c->PC&0xFF00)|(_t&0x00FF));if(0!=(uint8_t)c->AD){c->PC=_t;}}break; |
1891 | | - case (0x8F<<3)|5: _FETCH();break; |
1892 | | - case (0x8F<<3)|6: assert(false);break; |
| 1891 | + case (0x8F<<3)|4: if(0!=(uint8_t)c->AD){c->AD=c->PC+(int8_t)_GD();_SA(c->PC);}else{_FETCH();}break; |
| 1892 | + case (0x8F<<3)|5: if((c->AD&0xFF00)==(c->PC&0xFF00)){c->PC=c->AD;_FETCH();}else{_SA(c->PC);}break; |
| 1893 | + case (0x8F<<3)|6: c->PC=c->AD;_FETCH();break; |
1893 | 1894 | case (0x8F<<3)|7: assert(false);break; |
1894 | 1895 | /* BCC */ |
1895 | 1896 | case (0x90<<3)|0: _SA(c->PC++);break; |
@@ -2029,11 +2030,11 @@ uint64_t w65c02_tick(w65c02_t* c, uint64_t pins) { |
2029 | 2030 | /* BBS1 */ |
2030 | 2031 | case (0x9F<<3)|0: _SA(c->PC++);break; |
2031 | 2032 | case (0x9F<<3)|1: c->AD=_GD();_SA(c->AD);break; |
2032 | | - case (0x9F<<3)|2: c->AD=_GD();_SD(c->AD);_WR();break; |
| 2033 | + case (0x9F<<3)|2: c->AD=_GD();_SA(_GA());break; |
2033 | 2034 | case (0x9F<<3)|3: c->AD=(c->AD>>1)&1;_SA(c->PC++);break; |
2034 | | - case (0x9F<<3)|4: {uint16_t _t=c->PC+(int8_t)_GD();_SA((c->PC&0xFF00)|(_t&0x00FF));if(0!=(uint8_t)c->AD){c->PC=_t;}}break; |
2035 | | - case (0x9F<<3)|5: _FETCH();break; |
2036 | | - case (0x9F<<3)|6: assert(false);break; |
| 2035 | + case (0x9F<<3)|4: if(0!=(uint8_t)c->AD){c->AD=c->PC+(int8_t)_GD();_SA(c->PC);}else{_FETCH();}break; |
| 2036 | + case (0x9F<<3)|5: if((c->AD&0xFF00)==(c->PC&0xFF00)){c->PC=c->AD;_FETCH();}else{_SA(c->PC);}break; |
| 2037 | + case (0x9F<<3)|6: c->PC=c->AD;_FETCH();break; |
2037 | 2038 | case (0x9F<<3)|7: assert(false);break; |
2038 | 2039 | /* LDY */ |
2039 | 2040 | case (0xA0<<3)|0: _SA(c->PC++);break; |
@@ -2173,11 +2174,11 @@ uint64_t w65c02_tick(w65c02_t* c, uint64_t pins) { |
2173 | 2174 | /* BBS2 */ |
2174 | 2175 | case (0xAF<<3)|0: _SA(c->PC++);break; |
2175 | 2176 | case (0xAF<<3)|1: c->AD=_GD();_SA(c->AD);break; |
2176 | | - case (0xAF<<3)|2: c->AD=_GD();_SD(c->AD);_WR();break; |
| 2177 | + case (0xAF<<3)|2: c->AD=_GD();_SA(_GA());break; |
2177 | 2178 | case (0xAF<<3)|3: c->AD=(c->AD>>2)&1;_SA(c->PC++);break; |
2178 | | - case (0xAF<<3)|4: {uint16_t _t=c->PC+(int8_t)_GD();_SA((c->PC&0xFF00)|(_t&0x00FF));if(0!=(uint8_t)c->AD){c->PC=_t;}}break; |
2179 | | - case (0xAF<<3)|5: _FETCH();break; |
2180 | | - case (0xAF<<3)|6: assert(false);break; |
| 2179 | + case (0xAF<<3)|4: if(0!=(uint8_t)c->AD){c->AD=c->PC+(int8_t)_GD();_SA(c->PC);}else{_FETCH();}break; |
| 2180 | + case (0xAF<<3)|5: if((c->AD&0xFF00)==(c->PC&0xFF00)){c->PC=c->AD;_FETCH();}else{_SA(c->PC);}break; |
| 2181 | + case (0xAF<<3)|6: c->PC=c->AD;_FETCH();break; |
2181 | 2182 | case (0xAF<<3)|7: assert(false);break; |
2182 | 2183 | /* BCS */ |
2183 | 2184 | case (0xB0<<3)|0: _SA(c->PC++);break; |
@@ -2317,11 +2318,11 @@ uint64_t w65c02_tick(w65c02_t* c, uint64_t pins) { |
2317 | 2318 | /* BBS3 */ |
2318 | 2319 | case (0xBF<<3)|0: _SA(c->PC++);break; |
2319 | 2320 | case (0xBF<<3)|1: c->AD=_GD();_SA(c->AD);break; |
2320 | | - case (0xBF<<3)|2: c->AD=_GD();_SD(c->AD);_WR();break; |
| 2321 | + case (0xBF<<3)|2: c->AD=_GD();_SA(_GA());break; |
2321 | 2322 | case (0xBF<<3)|3: c->AD=(c->AD>>3)&1;_SA(c->PC++);break; |
2322 | | - case (0xBF<<3)|4: {uint16_t _t=c->PC+(int8_t)_GD();_SA((c->PC&0xFF00)|(_t&0x00FF));if(0!=(uint8_t)c->AD){c->PC=_t;}}break; |
2323 | | - case (0xBF<<3)|5: _FETCH();break; |
2324 | | - case (0xBF<<3)|6: assert(false);break; |
| 2323 | + case (0xBF<<3)|4: if(0!=(uint8_t)c->AD){c->AD=c->PC+(int8_t)_GD();_SA(c->PC);}else{_FETCH();}break; |
| 2324 | + case (0xBF<<3)|5: if((c->AD&0xFF00)==(c->PC&0xFF00)){c->PC=c->AD;_FETCH();}else{_SA(c->PC);}break; |
| 2325 | + case (0xBF<<3)|6: c->PC=c->AD;_FETCH();break; |
2325 | 2326 | case (0xBF<<3)|7: assert(false);break; |
2326 | 2327 | /* CPY */ |
2327 | 2328 | case (0xC0<<3)|0: _SA(c->PC++);break; |
@@ -2461,11 +2462,11 @@ uint64_t w65c02_tick(w65c02_t* c, uint64_t pins) { |
2461 | 2462 | /* BBS4 */ |
2462 | 2463 | case (0xCF<<3)|0: _SA(c->PC++);break; |
2463 | 2464 | case (0xCF<<3)|1: c->AD=_GD();_SA(c->AD);break; |
2464 | | - case (0xCF<<3)|2: c->AD=_GD();_SD(c->AD);_WR();break; |
| 2465 | + case (0xCF<<3)|2: c->AD=_GD();_SA(_GA());break; |
2465 | 2466 | case (0xCF<<3)|3: c->AD=(c->AD>>4)&1;_SA(c->PC++);break; |
2466 | | - case (0xCF<<3)|4: {uint16_t _t=c->PC+(int8_t)_GD();_SA((c->PC&0xFF00)|(_t&0x00FF));if(0!=(uint8_t)c->AD){c->PC=_t;}}break; |
2467 | | - case (0xCF<<3)|5: _FETCH();break; |
2468 | | - case (0xCF<<3)|6: assert(false);break; |
| 2467 | + case (0xCF<<3)|4: if(0!=(uint8_t)c->AD){c->AD=c->PC+(int8_t)_GD();_SA(c->PC);}else{_FETCH();}break; |
| 2468 | + case (0xCF<<3)|5: if((c->AD&0xFF00)==(c->PC&0xFF00)){c->PC=c->AD;_FETCH();}else{_SA(c->PC);}break; |
| 2469 | + case (0xCF<<3)|6: c->PC=c->AD;_FETCH();break; |
2469 | 2470 | case (0xCF<<3)|7: assert(false);break; |
2470 | 2471 | /* BNE */ |
2471 | 2472 | case (0xD0<<3)|0: _SA(c->PC++);break; |
@@ -2605,11 +2606,11 @@ uint64_t w65c02_tick(w65c02_t* c, uint64_t pins) { |
2605 | 2606 | /* BBS5 */ |
2606 | 2607 | case (0xDF<<3)|0: _SA(c->PC++);break; |
2607 | 2608 | case (0xDF<<3)|1: c->AD=_GD();_SA(c->AD);break; |
2608 | | - case (0xDF<<3)|2: c->AD=_GD();_SD(c->AD);_WR();break; |
| 2609 | + case (0xDF<<3)|2: c->AD=_GD();_SA(_GA());break; |
2609 | 2610 | case (0xDF<<3)|3: c->AD=(c->AD>>5)&1;_SA(c->PC++);break; |
2610 | | - case (0xDF<<3)|4: {uint16_t _t=c->PC+(int8_t)_GD();_SA((c->PC&0xFF00)|(_t&0x00FF));if(0!=(uint8_t)c->AD){c->PC=_t;}}break; |
2611 | | - case (0xDF<<3)|5: _FETCH();break; |
2612 | | - case (0xDF<<3)|6: assert(false);break; |
| 2611 | + case (0xDF<<3)|4: if(0!=(uint8_t)c->AD){c->AD=c->PC+(int8_t)_GD();_SA(c->PC);}else{_FETCH();}break; |
| 2612 | + case (0xDF<<3)|5: if((c->AD&0xFF00)==(c->PC&0xFF00)){c->PC=c->AD;_FETCH();}else{_SA(c->PC);}break; |
| 2613 | + case (0xDF<<3)|6: c->PC=c->AD;_FETCH();break; |
2613 | 2614 | case (0xDF<<3)|7: assert(false);break; |
2614 | 2615 | /* CPX */ |
2615 | 2616 | case (0xE0<<3)|0: _SA(c->PC++);break; |
@@ -2749,11 +2750,11 @@ uint64_t w65c02_tick(w65c02_t* c, uint64_t pins) { |
2749 | 2750 | /* BBS6 */ |
2750 | 2751 | case (0xEF<<3)|0: _SA(c->PC++);break; |
2751 | 2752 | case (0xEF<<3)|1: c->AD=_GD();_SA(c->AD);break; |
2752 | | - case (0xEF<<3)|2: c->AD=_GD();_SD(c->AD);_WR();break; |
| 2753 | + case (0xEF<<3)|2: c->AD=_GD();_SA(_GA());break; |
2753 | 2754 | case (0xEF<<3)|3: c->AD=(c->AD>>6)&1;_SA(c->PC++);break; |
2754 | | - case (0xEF<<3)|4: {uint16_t _t=c->PC+(int8_t)_GD();_SA((c->PC&0xFF00)|(_t&0x00FF));if(0!=(uint8_t)c->AD){c->PC=_t;}}break; |
2755 | | - case (0xEF<<3)|5: _FETCH();break; |
2756 | | - case (0xEF<<3)|6: assert(false);break; |
| 2755 | + case (0xEF<<3)|4: if(0!=(uint8_t)c->AD){c->AD=c->PC+(int8_t)_GD();_SA(c->PC);}else{_FETCH();}break; |
| 2756 | + case (0xEF<<3)|5: if((c->AD&0xFF00)==(c->PC&0xFF00)){c->PC=c->AD;_FETCH();}else{_SA(c->PC);}break; |
| 2757 | + case (0xEF<<3)|6: c->PC=c->AD;_FETCH();break; |
2757 | 2758 | case (0xEF<<3)|7: assert(false);break; |
2758 | 2759 | /* BEQ */ |
2759 | 2760 | case (0xF0<<3)|0: _SA(c->PC++);break; |
@@ -2893,11 +2894,11 @@ uint64_t w65c02_tick(w65c02_t* c, uint64_t pins) { |
2893 | 2894 | /* BBS7 */ |
2894 | 2895 | case (0xFF<<3)|0: _SA(c->PC++);break; |
2895 | 2896 | case (0xFF<<3)|1: c->AD=_GD();_SA(c->AD);break; |
2896 | | - case (0xFF<<3)|2: c->AD=_GD();_SD(c->AD);_WR();break; |
| 2897 | + case (0xFF<<3)|2: c->AD=_GD();_SA(_GA());break; |
2897 | 2898 | case (0xFF<<3)|3: c->AD=(c->AD>>7)&1;_SA(c->PC++);break; |
2898 | | - case (0xFF<<3)|4: {uint16_t _t=c->PC+(int8_t)_GD();_SA((c->PC&0xFF00)|(_t&0x00FF));if(0!=(uint8_t)c->AD){c->PC=_t;}}break; |
2899 | | - case (0xFF<<3)|5: _FETCH();break; |
2900 | | - case (0xFF<<3)|6: assert(false);break; |
| 2899 | + case (0xFF<<3)|4: if(0!=(uint8_t)c->AD){c->AD=c->PC+(int8_t)_GD();_SA(c->PC);}else{_FETCH();}break; |
| 2900 | + case (0xFF<<3)|5: if((c->AD&0xFF00)==(c->PC&0xFF00)){c->PC=c->AD;_FETCH();}else{_SA(c->PC);}break; |
| 2901 | + case (0xFF<<3)|6: c->PC=c->AD;_FETCH();break; |
2901 | 2902 | case (0xFF<<3)|7: assert(false);break; |
2902 | 2903 | // %> |
2903 | 2904 | default: _W65C02_UNREACHABLE; |
|
0 commit comments