src/emu/cpu/h6280/h6280ops.h
| r983 | r984 | |
| 29 | 29 | |
| 30 | 30 | #define TRANSLATED(addr) ((h6280.mmr[(addr)>>13] << 13) | ((addr)&0x1fff)) |
| 31 | 31 | #define CHANGE_PC do { offs_t temp = TRANSLATED(PCW); change_pc(temp); } while (0) |
| 32 | #define H6280_CYCLES(cyc) \ |
| 33 | { \ |
| 34 | h6280_ICount -= ((cyc) * h6280.clocks_per_cycle); \ |
| 35 | h6280.timer_value -= ((cyc) * h6280.clocks_per_cycle); \ |
| 36 | } |
| 32 | 37 | |
| 33 | 38 | #if LAZY_FLAGS |
| 34 | 39 | |
| r983 | r984 | |
| 66 | 71 | |
| 67 | 72 | #define DO_INTERRUPT(vector) \ |
| 68 | 73 | { \ |
| 69 | | h6280.extra_cycles += 7; /* 7 cycles for an int */ \ |
| 74 | H6280_CYCLES(7); /* 7 cycles for an int */ \ |
| 70 | 75 | PUSH(PCH); \ |
| 71 | 76 | PUSH(PCL); \ |
| 72 | 77 | COMPOSE_P(0,_fB); \ |
| r983 | r984 | |
| 77 | 82 | CHANGE_PC; \ |
| 78 | 83 | } |
| 79 | 84 | |
| 80 | | #define CHECK_IRQ_LINES \ |
| 81 | | if( !(P & _fI) ) \ |
| 85 | #define CHECK_AND_TAKE_IRQ_LINES \ |
| 86 | if ( h6280.nmi_state != CLEAR_LINE ) { \ |
| 87 | DO_INTERRUPT(H6280_NMI_VEC); \ |
| 88 | } \ |
| 89 | else if( !(P & _fI) ) \ |
| 82 | 90 | { \ |
| 83 | 91 | if ( h6280.irq_state[2] != CLEAR_LINE && \ |
| 84 | 92 | !(h6280.irq_mask & 0x4) ) \ |
| 85 | 93 | { \ |
| 86 | 94 | DO_INTERRUPT(H6280_TIMER_VEC); \ |
| 87 | | } \ |
| 88 | | else \ |
| 95 | } else \ |
| 89 | 96 | if ( h6280.irq_state[0] != CLEAR_LINE && \ |
| 90 | 97 | !(h6280.irq_mask & 0x2) ) \ |
| 91 | 98 | { \ |
| 92 | 99 | DO_INTERRUPT(H6280_IRQ1_VEC); \ |
| 93 | 100 | (*h6280.irq_callback)(0); \ |
| 94 | | } \ |
| 95 | | else \ |
| 101 | } else \ |
| 96 | 102 | if ( h6280.irq_state[1] != CLEAR_LINE && \ |
| 97 | 103 | !(h6280.irq_mask & 0x1) ) \ |
| 98 | 104 | { \ |
| r983 | r984 | |
| 101 | 107 | } \ |
| 102 | 108 | } |
| 103 | 109 | |
| 110 | #define CHECK_IRQ_LINES \ |
| 111 | if ( ! h6280.irq_pending ) \ |
| 112 | h6280.irq_pending = 2; |
| 113 | |
| 104 | 114 | /*************************************************************** |
| 115 | * CHECK_VDC_VCE_PENALTY |
| 116 | * The CPU inserts 1 clock delay when accessing the VDC or VCE |
| 117 | * area. |
| 118 | ***************************************************************/ |
| 119 | #define CHECK_VDC_VCE_PENALTY(addr) \ |
| 120 | if ( ( TRANSLATED(addr) & 0x1FF800 ) == 0x1FE000 ) { \ |
| 121 | H6280_CYCLES(1); \ |
| 122 | } |
| 123 | |
| 124 | /*************************************************************** |
| 105 | 125 | * RDMEM read memory |
| 106 | 126 | ***************************************************************/ |
| 107 | | #define RDMEM(addr) \ |
| 108 | | program_read_byte_8(TRANSLATED(addr)) |
| 127 | INLINE UINT8 RDMEM(offs_t addr) { |
| 128 | CHECK_VDC_VCE_PENALTY(addr); |
| 129 | return program_read_byte_8(TRANSLATED(addr)); |
| 130 | } |
| 109 | 131 | |
| 110 | 132 | /*************************************************************** |
| 111 | 133 | * WRMEM write memory |
| 112 | 134 | ***************************************************************/ |
| 113 | | #define WRMEM(addr,data) \ |
| 135 | INLINE void WRMEM(offs_t addr, UINT8 data) { |
| 136 | CHECK_VDC_VCE_PENALTY(addr); |
| 114 | 137 | program_write_byte_8(TRANSLATED(addr),data); |
| 138 | } |
| 115 | 139 | |
| 116 | 140 | /*************************************************************** |
| 117 | 141 | * RDMEMZ read memory - zero page |
| r983 | r984 | |
| 172 | 196 | CLEAR_T; \ |
| 173 | 197 | if (cond) \ |
| 174 | 198 | { \ |
| 175 | | h6280_ICount -= 4; \ |
| 199 | H6280_CYCLES(4); \ |
| 176 | 200 | tmp = RDOPARG(); \ |
| 177 | 201 | PCW++; \ |
| 178 | 202 | EAW = PCW + (signed char)tmp; \ |
| r983 | r984 | |
| 182 | 206 | else \ |
| 183 | 207 | { \ |
| 184 | 208 | PCW++; \ |
| 185 | | h6280_ICount -= 2; \ |
| 209 | H6280_CYCLES(2); \ |
| 186 | 210 | } |
| 187 | 211 | |
| 188 | 212 | /*************************************************************** |
| r983 | r984 | |
| 373 | 397 | if (hi & 0xff00) \ |
| 374 | 398 | P |= _fC; \ |
| 375 | 399 | tflagtemp = (lo & 0x0f) + (hi & 0xf0); \ |
| 400 | H6280_CYCLES(1); \ |
| 376 | 401 | } \ |
| 377 | 402 | else \ |
| 378 | 403 | { \ |
| r983 | r984 | |
| 385 | 410 | P |= _fC; \ |
| 386 | 411 | tflagtemp = (UINT8) sum; \ |
| 387 | 412 | } \ |
| 388 | | SET_NZ(A); \ |
| 413 | SET_NZ(tflagtemp); \ |
| 389 | 414 | WB_TFL; \ |
| 415 | H6280_CYCLES(3); \ |
| 390 | 416 | } |
| 391 | 417 | |
| 392 | 418 | |
| r983 | r984 | |
| 410 | 436 | if (hi & 0xff00) \ |
| 411 | 437 | P |= _fC; \ |
| 412 | 438 | A = (lo & 0x0f) + (hi & 0xf0); \ |
| 439 | H6280_CYCLES(1); \ |
| 413 | 440 | } \ |
| 414 | 441 | else \ |
| 415 | 442 | { \ |
| r983 | r984 | |
| 436 | 463 | tflagtemp = (UINT8)(tflagtemp & tmp); \ |
| 437 | 464 | WB_TFL; \ |
| 438 | 465 | SET_NZ(tflagtemp); \ |
| 466 | H6280_CYCLES(3); \ |
| 439 | 467 | } |
| 440 | 468 | |
| 441 | 469 | #define AND \ |
| r983 | r984 | |
| 546 | 574 | #define BSR \ |
| 547 | 575 | PUSH(PCH); \ |
| 548 | 576 | PUSH(PCL); \ |
| 549 | | h6280_ICount -= 4; /* 4 cycles here, 4 in BRA */ \ |
| 577 | H6280_CYCLES(4); /* 4 cycles here, 4 in BRA */ \ |
| 550 | 578 | BRA(1) |
| 551 | 579 | |
| 552 | 580 | /* 6280 ******************************************************** |
| r983 | r984 | |
| 678 | 706 | /* 6280 ******************************************************** |
| 679 | 707 | * EOR Logical exclusive or |
| 680 | 708 | ***************************************************************/ |
| 681 | | |
| 682 | 709 | #define TEOR \ |
| 683 | 710 | { \ |
| 684 | 711 | int tflagtemp; \ |
| r983 | r984 | |
| 687 | 714 | tflagtemp = (UINT8)(tflagtemp ^ tmp); \ |
| 688 | 715 | WB_TFL; \ |
| 689 | 716 | SET_NZ(tflagtemp); \ |
| 717 | H6280_CYCLES(3); \ |
| 690 | 718 | } |
| 691 | 719 | |
| 692 | 720 | #define EOR \ |
| r983 | r984 | |
| 698 | 726 | } |
| 699 | 727 | |
| 700 | 728 | /* 6280 ******************************************************** |
| 701 | | * ILL Illegal opcode |
| 702 | | ***************************************************************/ |
| 703 | | #define ILL \ |
| 704 | | CLEAR_T; \ |
| 705 | | h6280_ICount -= 2; /* (assumed) */ \ |
| 706 | | logerror("%04x: WARNING - h6280 illegal opcode\n",activecpu_get_pc()) |
| 707 | | |
| 708 | | /* 6280 ******************************************************** |
| 709 | 729 | * INA Increment accumulator |
| 710 | 730 | ***************************************************************/ |
| 711 | 731 | #define INA \ |
| r983 | r984 | |
| 810 | 830 | tflagtemp = (UINT8)(tflagtemp | tmp); \ |
| 811 | 831 | WB_TFL; \ |
| 812 | 832 | SET_NZ(tflagtemp); \ |
| 833 | H6280_CYCLES(3); \ |
| 813 | 834 | } |
| 814 | 835 | |
| 815 | 836 | #define ORA \ |
| r983 | r984 | |
| 980 | 1001 | /* 6280 ******************************************************** |
| 981 | 1002 | * SBC Subtract with carry |
| 982 | 1003 | ***************************************************************/ |
| 983 | | #define SBC \ |
| 984 | | CLEAR_T; \ |
| 985 | | if (P & _fD) \ |
| 1004 | #define TSBC \ |
| 986 | 1005 | { \ |
| 987 | | int c = (P & _fC) ^ _fC; \ |
| 988 | | int sum = A - tmp - c; \ |
| 989 | | int lo = (A & 0x0f) - (tmp & 0x0f) - c; \ |
| 990 | | int hi = (A & 0xf0) - (tmp & 0xf0); \ |
| 991 | | P &= ~_fC; \ |
| 992 | | if (lo & 0xf0) \ |
| 993 | | lo -= 6; \ |
| 994 | | if (lo & 0x80) \ |
| 995 | | hi -= 0x10; \ |
| 996 | | if (hi & 0x0f00) \ |
| 997 | | hi -= 0x60; \ |
| 998 | | if ((sum & 0xff00) == 0) \ |
| 999 | | P |= _fC; \ |
| 1000 | | A = (lo & 0x0f) + (hi & 0xf0); \ |
| 1001 | | } \ |
| 1002 | | else \ |
| 1003 | | { \ |
| 1004 | | int c = (P & _fC) ^ _fC; \ |
| 1005 | | int sum = A - tmp - c; \ |
| 1006 | | P &= ~(_fV | _fC); \ |
| 1007 | | if ((A^tmp) & (A^sum) & _fN) \ |
| 1008 | | P |= _fV; \ |
| 1009 | | if ((sum & 0xff00) == 0) \ |
| 1010 | | P |= _fC; \ |
| 1011 | | A = (UINT8) sum; \ |
| 1012 | | } \ |
| 1013 | | SET_NZ(A) |
| 1006 | int tflagtemp; \ |
| 1007 | CLEAR_T; \ |
| 1008 | RD_TFL; \ |
| 1009 | if (P & _fD) \ |
| 1010 | { \ |
| 1011 | int c = (P & _fC) ^ _fC; \ |
| 1012 | int sum = tflagtemp - tmp -c; \ |
| 1013 | int lo = (tflagtemp & 0x0f) - (tmp & 0x0f) - c; \ |
| 1014 | int hi = (tflagtemp & 0xf0) - (tmp & 0xf0); \ |
| 1015 | P &= ~_fC; \ |
| 1016 | if (lo & 0xf0) \ |
| 1017 | lo -= 6; \ |
| 1018 | if (lo & 0x80) \ |
| 1019 | hi -= 0x10; \ |
| 1020 | if (hi & 0x0f00) \ |
| 1021 | hi -= 0x60; \ |
| 1022 | if ((sum & 0xff00) == 0) \ |
| 1023 | P |= _fC; \ |
| 1024 | tflagtemp = (lo & 0x0f) + (hi & 0xf0); \ |
| 1025 | H6280_CYCLES(1); \ |
| 1026 | } \ |
| 1027 | else \ |
| 1028 | { \ |
| 1029 | int c = (P & _fC) ^ _fC; \ |
| 1030 | int sum = tflagtemp - tmp - c; \ |
| 1031 | P &= ~(_fV | _fC); \ |
| 1032 | if ((tflagtemp^tmp) & (tflagtemp^sum) & _fN) \ |
| 1033 | P |= _fV; \ |
| 1034 | if ((sum & 0xff00) == 0) \ |
| 1035 | P |= _fC; \ |
| 1036 | tflagtemp = (UINT8) sum; \ |
| 1037 | } \ |
| 1038 | SET_NZ(tflagtemp); \ |
| 1039 | WB_TFL; \ |
| 1040 | H6280_CYCLES(3); \ |
| 1041 | } |
| 1014 | 1042 | |
| 1043 | #define SBC \ |
| 1044 | if(P & _fT) \ |
| 1045 | TSBC \ |
| 1046 | else { \ |
| 1047 | if (P & _fD) \ |
| 1048 | { \ |
| 1049 | int c = (P & _fC) ^ _fC; \ |
| 1050 | int sum = A - tmp - c; \ |
| 1051 | int lo = (A & 0x0f) - (tmp & 0x0f) - c; \ |
| 1052 | int hi = (A & 0xf0) - (tmp & 0xf0); \ |
| 1053 | P &= ~_fC; \ |
| 1054 | if (lo & 0xf0) \ |
| 1055 | lo -= 6; \ |
| 1056 | if (lo & 0x80) \ |
| 1057 | hi -= 0x10; \ |
| 1058 | if (hi & 0x0f00) \ |
| 1059 | hi -= 0x60; \ |
| 1060 | if ((sum & 0xff00) == 0) \ |
| 1061 | P |= _fC; \ |
| 1062 | A = (lo & 0x0f) + (hi & 0xf0); \ |
| 1063 | H6280_CYCLES(1); \ |
| 1064 | } \ |
| 1065 | else \ |
| 1066 | { \ |
| 1067 | int c = (P & _fC) ^ _fC; \ |
| 1068 | int sum = A - tmp - c; \ |
| 1069 | P &= ~(_fV | _fC); \ |
| 1070 | if ((A^tmp) & (A^sum) & _fN) \ |
| 1071 | P |= _fV; \ |
| 1072 | if ((sum & 0xff00) == 0) \ |
| 1073 | P |= _fC; \ |
| 1074 | A = (UINT8) sum; \ |
| 1075 | } \ |
| 1076 | SET_NZ(A); \ |
| 1077 | } |
| 1078 | |
| 1015 | 1079 | /* 6280 ******************************************************** |
| 1016 | 1080 | * SEC Set carry flag |
| 1017 | 1081 | ***************************************************************/ |
| r983 | r984 | |
| 1115 | 1179 | length=RDMEMW(PCW+4); \ |
| 1116 | 1180 | PCW+=6; \ |
| 1117 | 1181 | alternate=0; \ |
| 1182 | if (!length) length = 0x10000; \ |
| 1183 | H6280_CYCLES( ((6 * length) + 17) ); \ |
| 1118 | 1184 | while ((length--) != 0) { \ |
| 1119 | 1185 | WRMEM(to,RDMEM(from+alternate)); \ |
| 1120 | 1186 | to++; \ |
| 1121 | 1187 | alternate ^= 1; \ |
| 1122 | | } \ |
| 1123 | | h6280_ICount-=(6 * length) + 17; |
| 1188 | } |
| 1124 | 1189 | |
| 1125 | 1190 | /* H6280 ******************************************************* |
| 1126 | 1191 | * TAM Transfer accumulator to memory mapper register(s) |
| r983 | r984 | |
| 1162 | 1227 | to =RDMEMW(PCW+2); \ |
| 1163 | 1228 | length=RDMEMW(PCW+4); \ |
| 1164 | 1229 | PCW+=6; \ |
| 1230 | if (!length) length = 0x10000; \ |
| 1231 | H6280_CYCLES( ((6 * length) + 17) ); \ |
| 1165 | 1232 | while ((length--) != 0) { \ |
| 1166 | 1233 | WRMEM(to,RDMEM(from)); \ |
| 1167 | 1234 | to--; \ |
| 1168 | 1235 | from--; \ |
| 1169 | | } \ |
| 1170 | | h6280_ICount-=(6 * length) + 17; |
| 1236 | } |
| 1171 | 1237 | |
| 1172 | 1238 | /* 6280 ******************************************************** |
| 1173 | 1239 | * TIA Transfer Increment Alternate |
| r983 | r984 | |
| 1179 | 1245 | length=RDMEMW(PCW+4); \ |
| 1180 | 1246 | PCW+=6; \ |
| 1181 | 1247 | alternate=0; \ |
| 1248 | if (!length) length = 0x10000; \ |
| 1249 | H6280_CYCLES( ((6 * length) + 17) ); \ |
| 1182 | 1250 | while ((length--) != 0) { \ |
| 1183 | 1251 | WRMEM(to+alternate,RDMEM(from)); \ |
| 1184 | 1252 | from++; \ |
| 1185 | 1253 | alternate ^= 1; \ |
| 1186 | | } \ |
| 1187 | | h6280_ICount-=(6 * length) + 17; |
| 1254 | } |
| 1188 | 1255 | |
| 1189 | 1256 | /* 6280 ******************************************************** |
| 1190 | 1257 | * TII Transfer Increment Increment |
| r983 | r984 | |
| 1195 | 1262 | to =RDMEMW(PCW+2); \ |
| 1196 | 1263 | length=RDMEMW(PCW+4); \ |
| 1197 | 1264 | PCW+=6; \ |
| 1265 | if (!length) length = 0x10000; \ |
| 1266 | H6280_CYCLES( ((6 * length) + 17) ); \ |
| 1198 | 1267 | while ((length--) != 0) { \ |
| 1199 | 1268 | WRMEM(to,RDMEM(from)); \ |
| 1200 | 1269 | to++; \ |
| 1201 | 1270 | from++; \ |
| 1202 | | } \ |
| 1203 | | h6280_ICount-=(6 * length) + 17; |
| 1271 | } |
| 1204 | 1272 | |
| 1205 | 1273 | /* 6280 ******************************************************** |
| 1206 | 1274 | * TIN Transfer block, source increments every loop |
| r983 | r984 | |
| 1211 | 1279 | to =RDMEMW(PCW+2); \ |
| 1212 | 1280 | length=RDMEMW(PCW+4); \ |
| 1213 | 1281 | PCW+=6; \ |
| 1282 | if (!length) length = 0x10000; \ |
| 1283 | H6280_CYCLES( ((6 * length) + 17) ); \ |
| 1214 | 1284 | while ((length--) != 0) { \ |
| 1215 | 1285 | WRMEM(to,RDMEM(from)); \ |
| 1216 | 1286 | from++; \ |
| 1217 | | } \ |
| 1218 | | h6280_ICount-=(6 * length) + 17; |
| 1287 | } |
| 1219 | 1288 | |
| 1220 | 1289 | /* 6280 ******************************************************** |
| 1221 | 1290 | * TMA Transfer memory mapper register(s) to accumulator |
| r983 | r984 | |
| 1240 | 1309 | P = (P & ~(_fN|_fV|_fT|_fZ)) \ |
| 1241 | 1310 | | ((tmp&0x80) ? _fN:0) \ |
| 1242 | 1311 | | ((tmp&0x40) ? _fV:0) \ |
| 1243 | | | ((tmp&A) ? 0:_fZ); \ |
| 1312 | | ((tmp&~A) ? 0:_fZ); \ |
| 1244 | 1313 | tmp &= ~A |
| 1245 | 1314 | |
| 1246 | 1315 | /* 6280 ******************************************************** |
| r983 | r984 | |
| 1251 | 1320 | P = (P & ~(_fN|_fV|_fT|_fZ)) \ |
| 1252 | 1321 | | ((tmp&0x80) ? _fN:0) \ |
| 1253 | 1322 | | ((tmp&0x40) ? _fV:0) \ |
| 1254 | | | ((tmp&A) ? 0:_fZ); \ |
| 1323 | | ((tmp|A) ? 0:_fZ); \ |
| 1255 | 1324 | tmp |= A |
| 1256 | 1325 | |
| 1257 | 1326 | /* 6280 ******************************************************** |
| r983 | r984 | |
| 1267 | 1336 | ***************************************************************/ |
| 1268 | 1337 | #define TST \ |
| 1269 | 1338 | P = (P & ~(_fN|_fV|_fT|_fZ)) \ |
| 1270 | | | ((tmp2&0x80) ? _fN:0) \ |
| 1271 | | | ((tmp2&0x40) ? _fV:0) \ |
| 1272 | | | ((tmp2&tmp) ? 0:_fZ) |
| 1339 | | ((tmp&0x80) ? _fN:0) \ |
| 1340 | | ((tmp&0x40) ? _fV:0) \ |
| 1341 | | ((tmp&tmp2) ? 0:_fZ) |
| 1273 | 1342 | |
| 1274 | 1343 | /* 6280 ******************************************************** |
| 1275 | 1344 | * TXA Transfer index X to accumulator |
| r983 | r984 | |
| 1294 | 1363 | CLEAR_T; \ |
| 1295 | 1364 | A = Y; \ |
| 1296 | 1365 | SET_NZ(A) |
| 1366 | |
| 1367 | /* 6280 ******************************************************** |
| 1368 | * CSH Set CPU in high speed mode |
| 1369 | ***************************************************************/ |
| 1370 | #define CSH \ |
| 1371 | h6280.clocks_per_cycle = 1; |
| 1372 | |
| 1373 | /* 6280 ******************************************************** |
| 1374 | * CSL Set CPU in low speed mode |
| 1375 | ***************************************************************/ |
| 1376 | #define CSL \ |
| 1377 | h6280.clocks_per_cycle = 3; |
| 1378 | |
src/emu/cpu/h6280/h6280.c
| r983 | r984 | |
| 16 | 16 | due to lack of programs using these features. |
| 17 | 17 | |
| 18 | 18 | csh, csl opcodes are not supported. |
| 19 | | set opcode and T flag behaviour are not supported. |
| 20 | 19 | |
| 21 | | I am unsure if instructions like SBC take an extra cycle when used in |
| 22 | | decimal mode. I am unsure if flag B is set upon execution of rti. |
| 20 | I am unsure if flag B is set upon execution of rti. |
| 23 | 21 | |
| 24 | | Cycle counts should be quite accurate, illegal instructions are assumed |
| 25 | | to take two cycles. |
| 22 | Cycle counts should be quite accurate. |
| 26 | 23 | |
| 27 | 24 | |
| 28 | 25 | Changelog, version 1.02: |
| r983 | r984 | |
| 82 | 79 | Fixed interrupt processing order (Timer has highest priority followed |
| 83 | 80 | by IRQ1 and finally IRQ2). |
| 84 | 81 | |
| 85 | | Changelog, version 1.08, 1/07/06: (Rob Bohms) |
| 82 | Changelog, version 1.09, 1/07/06: (Rob Bohms) |
| 86 | 83 | |
| 87 | 84 | Added emulation of the T flag, fixes PCE Ankuku Densetsu title screen |
| 88 | 85 | |
| 86 | Changelog, version 1.10, 5/09/07: (Wilbert Pol) |
| 87 | |
| 88 | - Taking of interrupts is delayed to respect a pending instruction already |
| 89 | in the instruction pipeline; fixes After Burner. |
| 90 | - Added 1 cycle for decimal mode ADC and SBC instructions. |
| 91 | - Changed cycle counts for CSH and CSL instructions to 3. |
| 92 | - Added T flag support to the SBC instruction. |
| 93 | - Fixed ADC T flag to set the Z flag based on the value read. |
| 94 | - Added 3 cycle penalty to ADC, AND, EOR, ORA, and SBC instructions |
| 95 | when the T flag is set. |
| 96 | - Fixed cycle count and support for 65536 byte blocks for the TAI, TDD, |
| 97 | TIA, TII, and TIN instructions. |
| 98 | - Fixed RDWORD macro in the disassembler. |
| 99 | - Fixed setting of N and V flags in the TST instructions. |
| 100 | - Removed unneeded debug_mmr code. |
| 101 | - Fixed TSB and TRB instructions. |
| 102 | - Added 1 delay when accessing the VDC or VCE areas. |
| 103 | - Implemented low and high speed cpu modes. |
| 104 | |
| 89 | 105 | ******************************************************************************/ |
| 90 | 106 | #include "debugger.h" |
| 91 | 107 | #include "h6280.h" |
| 92 | 108 | |
| 93 | | extern FILE * errorlog; |
| 94 | | |
| 95 | 109 | static int h6280_ICount = 0; |
| 96 | 110 | |
| 97 | 111 | /**************************************************************************** |
| r983 | r984 | |
| 112 | 126 | UINT8 irq_mask; /* interrupt enable/disable */ |
| 113 | 127 | UINT8 timer_status; /* timer status */ |
| 114 | 128 | UINT8 timer_ack; /* timer acknowledge */ |
| 129 | UINT8 clocks_per_cycle; /* 3 = low speed mode, 1 = high speed mode */ |
| 115 | 130 | INT32 timer_value; /* timer interrupt */ |
| 116 | 131 | INT32 timer_load; /* reload value */ |
| 117 | | INT32 extra_cycles; /* cycles used taking an interrupt */ |
| 118 | 132 | UINT8 nmi_state; |
| 119 | 133 | UINT8 irq_state[3]; |
| 134 | UINT8 irq_pending; |
| 120 | 135 | int (*irq_callback)(int irqline); |
| 121 | 136 | |
| 122 | 137 | #if LAZY_FLAGS |
| r983 | r984 | |
| 127 | 142 | |
| 128 | 143 | static h6280_Regs h6280; |
| 129 | 144 | |
| 130 | | #ifdef MAME_DEBUG /* Need some public segmentation registers for debugger */ |
| 131 | | UINT8 H6280_debug_mmr[8]; |
| 132 | | #endif |
| 133 | | |
| 134 | 145 | static void set_irq_line(int irqline, int state); |
| 135 | 146 | |
| 136 | 147 | /* include the macros */ |
| r983 | r984 | |
| 155 | 166 | state_save_register_item("h6280", index, h6280.irq_mask); |
| 156 | 167 | state_save_register_item("h6280", index, h6280.timer_status); |
| 157 | 168 | state_save_register_item("h6280", index, h6280.timer_ack); |
| 169 | state_save_register_item("h6280", index, h6280.clocks_per_cycle); |
| 158 | 170 | state_save_register_item("h6280", index, h6280.timer_value); |
| 159 | 171 | state_save_register_item("h6280", index, h6280.timer_load); |
| 160 | | state_save_register_item("h6280", index, h6280.extra_cycles); |
| 161 | 172 | state_save_register_item("h6280", index, h6280.nmi_state); |
| 162 | 173 | state_save_register_item("h6280", index, h6280.irq_state[0]); |
| 163 | 174 | state_save_register_item("h6280", index, h6280.irq_state[1]); |
| 164 | 175 | state_save_register_item("h6280", index, h6280.irq_state[2]); |
| 176 | state_save_register_item("h6280", index, h6280.irq_pending); |
| 165 | 177 | |
| 166 | 178 | #if LAZY_FLAGS |
| 167 | 179 | state_save_register_item("h6280", index, h6280.NZ); |
| r983 | r984 | |
| 192 | 204 | PCH = RDMEM((H6280_RESET_VEC+1)); |
| 193 | 205 | CHANGE_PC; |
| 194 | 206 | |
| 207 | /* CPU starts in low speed mode */ |
| 208 | h6280.clocks_per_cycle = 3; |
| 209 | |
| 195 | 210 | /* timer off by default */ |
| 196 | 211 | h6280.timer_status=0; |
| 197 | 212 | |
| 198 | 213 | /* clear pending interrupts */ |
| 199 | 214 | for (i = 0; i < 3; i++) |
| 200 | 215 | h6280.irq_state[i] = CLEAR_LINE; |
| 216 | h6280.nmi_state = CLEAR_LINE; |
| 217 | |
| 218 | h6280.irq_pending = 0; |
| 201 | 219 | } |
| 202 | 220 | |
| 203 | 221 | static void h6280_exit(void) |
| r983 | r984 | |
| 207 | 225 | |
| 208 | 226 | static int h6280_execute(int cycles) |
| 209 | 227 | { |
| 210 | | int in,lastcycle,deltacycle; |
| 228 | int in; |
| 211 | 229 | h6280_ICount = cycles; |
| 212 | 230 | |
| 213 | | /* Subtract cycles used for taking an interrupt */ |
| 214 | | h6280_ICount -= h6280.extra_cycles; |
| 215 | | h6280.extra_cycles = 0; |
| 216 | | lastcycle = h6280_ICount; |
| 217 | | |
| 218 | 231 | /* Execute instructions */ |
| 219 | 232 | do |
| 220 | 233 | { |
| r983 | r984 | |
| 222 | 235 | CHANGE_PC; |
| 223 | 236 | h6280.ppc = h6280.pc; |
| 224 | 237 | |
| 225 | | #ifdef MAME_DEBUG |
| 226 | | { |
| 227 | | if (Machine->debug_mode) |
| 228 | | { |
| 229 | | /* Copy the segmentation registers for debugger to use */ |
| 230 | | int i; |
| 231 | | for (i=0; i<8; i++) |
| 232 | | H6280_debug_mmr[i]=h6280.mmr[i]; |
| 238 | CALL_MAME_DEBUG; |
| 233 | 239 | |
| 234 | | mame_debug_hook(); |
| 235 | | } |
| 236 | | } |
| 237 | | #endif |
| 238 | | |
| 239 | 240 | /* Execute 1 instruction */ |
| 240 | 241 | in=RDOP(); |
| 241 | 242 | PCW++; |
| 242 | 243 | insnh6280[in](); |
| 243 | 244 | |
| 245 | if ( h6280.irq_pending ) { |
| 246 | h6280.irq_pending--; |
| 247 | if ( ! h6280.irq_pending ) { |
| 248 | CHECK_AND_TAKE_IRQ_LINES; |
| 249 | } |
| 250 | } |
| 251 | |
| 244 | 252 | /* Check internal timer */ |
| 245 | 253 | if(h6280.timer_status) |
| 246 | 254 | { |
| 247 | | deltacycle = lastcycle - h6280_ICount; |
| 248 | | h6280.timer_value -= deltacycle; |
| 249 | 255 | if(h6280.timer_value<=0) |
| 250 | 256 | { |
| 251 | | h6280.timer_value=h6280.timer_load; |
| 257 | if ( ! h6280.irq_pending ) |
| 258 | h6280.irq_pending = 2; |
| 259 | while( h6280.timer_value <= 0 ) |
| 260 | h6280.timer_value += h6280.timer_load; |
| 252 | 261 | set_irq_line(2,ASSERT_LINE); |
| 253 | 262 | } |
| 254 | 263 | } |
| 255 | | lastcycle = h6280_ICount; |
| 256 | | |
| 257 | | /* If PC has not changed we are stuck in a tight loop, may as well finish */ |
| 258 | | if( h6280.pc.d == h6280.ppc.d ) |
| 259 | | { |
| 260 | | if (h6280_ICount > 0) h6280_ICount=0; |
| 261 | | h6280.extra_cycles = 0; |
| 262 | | return cycles; |
| 263 | | } |
| 264 | | |
| 265 | 264 | } while (h6280_ICount > 0); |
| 266 | 265 | |
| 267 | | /* Subtract cycles used for taking an interrupt */ |
| 268 | | h6280_ICount -= h6280.extra_cycles; |
| 269 | | h6280.extra_cycles = 0; |
| 270 | | |
| 271 | 266 | return cycles - h6280_ICount; |
| 272 | 267 | } |
| 273 | 268 | |
| r983 | r984 | |
| 293 | 288 | { |
| 294 | 289 | if (h6280.nmi_state == state) return; |
| 295 | 290 | h6280.nmi_state = state; |
| 296 | | if (state != CLEAR_LINE) |
| 297 | | { |
| 298 | | DO_INTERRUPT(H6280_NMI_VEC); |
| 299 | | } |
| 291 | CHECK_IRQ_LINES; |
| 300 | 292 | } |
| 301 | 293 | else if (irqline < 3) |
| 302 | 294 | { |
| 295 | /* If the state has not changed, just return */ |
| 296 | if ( h6280.irq_state[irqline] == state ) |
| 297 | return; |
| 298 | |
| 303 | 299 | h6280.irq_state[irqline] = state; |
| 304 | 300 | |
| 305 | | /* If line is cleared, just exit */ |
| 306 | | if (state == CLEAR_LINE) return; |
| 307 | | |
| 308 | | /* Check if interrupts are enabled and the IRQ mask is clear */ |
| 309 | 301 | CHECK_IRQ_LINES; |
| 310 | 302 | } |
| 311 | 303 | } |
| r983 | r984 | |
| 516 | 508 | /* --- the following bits of info are returned as NULL-terminated strings --- */ |
| 517 | 509 | case CPUINFO_STR_NAME: strcpy(info->s, "HuC6280"); break; |
| 518 | 510 | case CPUINFO_STR_CORE_FAMILY: strcpy(info->s, "Hudsonsoft 6280"); break; |
| 519 | | case CPUINFO_STR_CORE_VERSION: strcpy(info->s, "1.07"); break; |
| 511 | case CPUINFO_STR_CORE_VERSION: strcpy(info->s, "1.10"); break; |
| 520 | 512 | case CPUINFO_STR_CORE_FILE: strcpy(info->s, __FILE__); break; |
| 521 | 513 | case CPUINFO_STR_CORE_CREDITS: strcpy(info->s, "Copyright (c) 1999, 2000 Bryan McPhail, mish@tendril.co.uk"); break; |
| 522 | 514 | |
src/emu/cpu/h6280/tblh6280.c
| r983 | r984 | |
| 20 | 20 | * |
| 21 | 21 | ***************************************************************************** |
| 22 | 22 | * op temp cycles rdmem opc wrmem ******************/ |
| 23 | | OP(_000) { h6280_ICount -= 8; BRK; } // 8 BRK |
| 24 | | OP(_020) { h6280_ICount -= 7; EA_ABS; JSR; } // 7 JSR ABS |
| 25 | | OP(_040) { h6280_ICount -= 7; RTI; } // 7 RTI |
| 26 | | OP(_060) { h6280_ICount -= 7; RTS; } // 7 RTS |
| 23 | OP(_000) { H6280_CYCLES(8); BRK; } // 8 BRK |
| 24 | OP(_020) { H6280_CYCLES(7); EA_ABS; JSR; } // 7 JSR ABS |
| 25 | OP(_040) { H6280_CYCLES(7); RTI; } // 7 RTI |
| 26 | OP(_060) { H6280_CYCLES(7); RTS; } // 7 RTS |
| 27 | 27 | OP(_080) { int tmp; BRA(1); } // 4 BRA REL |
| 28 | | OP(_0a0) { int tmp; h6280_ICount -= 2; RD_IMM; LDY; } // 2 LDY IMM |
| 29 | | OP(_0c0) { int tmp; h6280_ICount -= 2; RD_IMM; CPY; } // 2 CPY IMM |
| 30 | | OP(_0e0) { int tmp; h6280_ICount -= 2; RD_IMM; CPX; } // 2 CPX IMM |
| 28 | OP(_0a0) { int tmp; H6280_CYCLES(2); RD_IMM; LDY; } // 2 LDY IMM |
| 29 | OP(_0c0) { int tmp; H6280_CYCLES(2); RD_IMM; CPY; } // 2 CPY IMM |
| 30 | OP(_0e0) { int tmp; H6280_CYCLES(2); RD_IMM; CPX; } // 2 CPX IMM |
| 31 | 31 | |
| 32 | 32 | OP(_010) { int tmp; BPL; } // 2/4 BPL REL |
| 33 | 33 | OP(_030) { int tmp; BMI; } // 2/4 BMI REL |
| r983 | r984 | |
| 38 | 38 | OP(_0d0) { int tmp; BNE; } // 2/4 BNE REL |
| 39 | 39 | OP(_0f0) { int tmp; BEQ; } // 2/4 BEQ REL |
| 40 | 40 | |
| 41 | | OP(_001) { int tmp; h6280_ICount -= 7; RD_IDX; ORA; } // 7 ORA IDX |
| 42 | | OP(_021) { int tmp; h6280_ICount -= 7; RD_IDX; AND; } // 7 AND IDX |
| 43 | | OP(_041) { int tmp; h6280_ICount -= 7; RD_IDX; EOR; } // 7 EOR IDX |
| 44 | | OP(_061) { int tmp; h6280_ICount -= 7; RD_IDX; ADC; } // 7 ADC IDX |
| 45 | | OP(_081) { int tmp; h6280_ICount -= 7; STA; WR_IDX; } // 7 STA IDX |
| 46 | | OP(_0a1) { int tmp; h6280_ICount -= 7; RD_IDX; LDA; } // 7 LDA IDX |
| 47 | | OP(_0c1) { int tmp; h6280_ICount -= 7; RD_IDX; CMP; } // 7 CMP IDX |
| 48 | | OP(_0e1) { int tmp; h6280_ICount -= 7; RD_IDX; SBC; } // 7 SBC IDX |
| 41 | OP(_001) { int tmp; H6280_CYCLES(7); RD_IDX; ORA; } // 7 ORA IDX |
| 42 | OP(_021) { int tmp; H6280_CYCLES(7); RD_IDX; AND; } // 7 AND IDX |
| 43 | OP(_041) { int tmp; H6280_CYCLES(7); RD_IDX; EOR; } // 7 EOR IDX |
| 44 | OP(_061) { int tmp; H6280_CYCLES(7); RD_IDX; ADC; } // 7 ADC IDX |
| 45 | OP(_081) { int tmp; H6280_CYCLES(7); STA; WR_IDX; } // 7 STA IDX |
| 46 | OP(_0a1) { int tmp; H6280_CYCLES(7); RD_IDX; LDA; } // 7 LDA IDX |
| 47 | OP(_0c1) { int tmp; H6280_CYCLES(7); RD_IDX; CMP; } // 7 CMP IDX |
| 48 | OP(_0e1) { int tmp; H6280_CYCLES(7); RD_IDX; SBC; } // 7 SBC IDX |
| 49 | 49 | |
| 50 | | OP(_011) { int tmp; h6280_ICount -= 7; RD_IDY; ORA; } // 7 ORA IDY |
| 51 | | OP(_031) { int tmp; h6280_ICount -= 7; RD_IDY; AND; } // 7 AND IDY |
| 52 | | OP(_051) { int tmp; h6280_ICount -= 7; RD_IDY; EOR; } // 7 EOR IDY |
| 53 | | OP(_071) { int tmp; h6280_ICount -= 7; RD_IDY; ADC; } // 7 ADC AZP |
| 54 | | OP(_091) { int tmp; h6280_ICount -= 7; STA; WR_IDY; } // 7 STA IDY |
| 55 | | OP(_0b1) { int tmp; h6280_ICount -= 7; RD_IDY; LDA; } // 7 LDA IDY |
| 56 | | OP(_0d1) { int tmp; h6280_ICount -= 7; RD_IDY; CMP; } // 7 CMP IDY |
| 57 | | OP(_0f1) { int tmp; h6280_ICount -= 7; RD_IDY; SBC; } // 7 SBC IDY |
| 50 | OP(_011) { int tmp; H6280_CYCLES(7); RD_IDY; ORA; } // 7 ORA IDY |
| 51 | OP(_031) { int tmp; H6280_CYCLES(7); RD_IDY; AND; } // 7 AND IDY |
| 52 | OP(_051) { int tmp; H6280_CYCLES(7); RD_IDY; EOR; } // 7 EOR IDY |
| 53 | OP(_071) { int tmp; H6280_CYCLES(7); RD_IDY; ADC; } // 7 ADC AZP |
| 54 | OP(_091) { int tmp; H6280_CYCLES(7); STA; WR_IDY; } // 7 STA IDY |
| 55 | OP(_0b1) { int tmp; H6280_CYCLES(7); RD_IDY; LDA; } // 7 LDA IDY |
| 56 | OP(_0d1) { int tmp; H6280_CYCLES(7); RD_IDY; CMP; } // 7 CMP IDY |
| 57 | OP(_0f1) { int tmp; H6280_CYCLES(7); RD_IDY; SBC; } // 7 SBC IDY |
| 58 | 58 | |
| 59 | | OP(_002) { int tmp; h6280_ICount -= 3; SXY; } // 3 SXY |
| 60 | | OP(_022) { int tmp; h6280_ICount -= 3; SAX; } // 3 SAX |
| 61 | | OP(_042) { int tmp; h6280_ICount -= 3; SAY; } // 3 SAY |
| 62 | | OP(_062) { h6280_ICount -= 2; CLA; } // 2 CLA |
| 63 | | OP(_082) { h6280_ICount -= 2; CLX; } // 2 CLX |
| 64 | | OP(_0a2) { int tmp; h6280_ICount -= 2; RD_IMM; LDX; } // 2 LDX IMM |
| 65 | | OP(_0c2) { h6280_ICount -= 2; CLY; } // 2 CLY |
| 66 | | OP(_0e2) { ILL; } // 2 ??? |
| 59 | OP(_002) { int tmp; H6280_CYCLES(3); SXY; } // 3 SXY |
| 60 | OP(_022) { int tmp; H6280_CYCLES(3); SAX; } // 3 SAX |
| 61 | OP(_042) { int tmp; H6280_CYCLES(3); SAY; } // 3 SAY |
| 62 | OP(_062) { H6280_CYCLES(2); CLA; } // 2 CLA |
| 63 | OP(_082) { H6280_CYCLES(2); CLX; } // 2 CLX |
| 64 | OP(_0a2) { int tmp; H6280_CYCLES(2); RD_IMM; LDX; } // 2 LDX IMM |
| 65 | OP(_0c2) { H6280_CYCLES(2); CLY; } // 2 CLY |
| 66 | OP(_0e2) { H6280_CYCLES(2); NOP; } // 2 NOP |
| 67 | 67 | |
| 68 | | OP(_012) { int tmp; h6280_ICount -= 7; RD_ZPI; ORA; } // 7 ORA ZPI |
| 69 | | OP(_032) { int tmp; h6280_ICount -= 7; RD_ZPI; AND; } // 7 AND ZPI |
| 70 | | OP(_052) { int tmp; h6280_ICount -= 7; RD_ZPI; EOR; } // 7 EOR ZPI |
| 71 | | OP(_072) { int tmp; h6280_ICount -= 7; RD_ZPI; ADC; } // 7 ADC ZPI |
| 72 | | OP(_092) { int tmp; h6280_ICount -= 7; STA; WR_ZPI; } // 7 STA ZPI |
| 73 | | OP(_0b2) { int tmp; h6280_ICount -= 7; RD_ZPI; LDA; } // 7 LDA ZPI |
| 74 | | OP(_0d2) { int tmp; h6280_ICount -= 7; RD_ZPI; CMP; } // 7 CMP ZPI |
| 75 | | OP(_0f2) { int tmp; h6280_ICount -= 7; RD_ZPI; SBC; } // 7 SBC ZPI |
| 68 | OP(_012) { int tmp; H6280_CYCLES(7); RD_ZPI; ORA; } // 7 ORA ZPI |
| 69 | OP(_032) { int tmp; H6280_CYCLES(7); RD_ZPI; AND; } // 7 AND ZPI |
| 70 | OP(_052) { int tmp; H6280_CYCLES(7); RD_ZPI; EOR; } // 7 EOR ZPI |
| 71 | OP(_072) { int tmp; H6280_CYCLES(7); RD_ZPI; ADC; } // 7 ADC ZPI |
| 72 | OP(_092) { int tmp; H6280_CYCLES(7); STA; WR_ZPI; } // 7 STA ZPI |
| 73 | OP(_0b2) { int tmp; H6280_CYCLES(7); RD_ZPI; LDA; } // 7 LDA ZPI |
| 74 | OP(_0d2) { int tmp; H6280_CYCLES(7); RD_ZPI; CMP; } // 7 CMP ZPI |
| 75 | OP(_0f2) { int tmp; H6280_CYCLES(7); RD_ZPI; SBC; } // 7 SBC ZPI |
| 76 | 76 | |
| 77 | | OP(_003) { int tmp; h6280_ICount -= 4; RD_IMM; ST0; } // 4 ST0 IMM |
| 78 | | OP(_023) { int tmp; h6280_ICount -= 4; RD_IMM; ST2; } // 4 ST2 IMM |
| 79 | | OP(_043) { int tmp; h6280_ICount -= 4; RD_IMM; TMA; } // 4 TMA |
| 80 | | OP(_063) { ILL; } // 2 ??? |
| 81 | | OP(_083) { int tmp,tmp2; h6280_ICount -= 7; RD_IMM2; RD_ZPG; TST; } // 7 TST IMM,ZPG |
| 82 | | OP(_0a3) { int tmp,tmp2; h6280_ICount -= 7; RD_IMM2; RD_ZPX; TST; } // 7 TST IMM,ZPX |
| 77 | OP(_003) { int tmp; H6280_CYCLES(5); RD_IMM; ST0; } // 4 + 1 penalty cycle ST0 IMM |
| 78 | OP(_023) { int tmp; H6280_CYCLES(5); RD_IMM; ST2; } // 4 + 1 penalty cycle ST2 IMM |
| 79 | OP(_043) { int tmp; H6280_CYCLES(4); RD_IMM; TMA; } // 4 TMA |
| 80 | OP(_063) { H6280_CYCLES(4); NOP; } // 2 NOP |
| 81 | OP(_083) { int tmp,tmp2; H6280_CYCLES(7); RD_IMM2; RD_ZPG; TST; } // 7 TST IMM,ZPG |
| 82 | OP(_0a3) { int tmp,tmp2; H6280_CYCLES(7); RD_IMM2; RD_ZPX; TST; } // 7 TST IMM,ZPX |
| 83 | 83 | OP(_0c3) { int to,from,length; TDD; } // 6*l+17 TDD XFER |
| 84 | 84 | OP(_0e3) { int to,from,length,alternate; TIA; } // 6*l+17 TIA XFER |
| 85 | 85 | |
| 86 | | OP(_013) { int tmp; h6280_ICount -= 4; RD_IMM; ST1; } // 4 ST1 |
| 87 | | OP(_033) { ILL; } // 2 ??? |
| 88 | | OP(_053) { int tmp; h6280_ICount -= 5; RD_IMM; TAM; } // 5 TAM IMM |
| 86 | OP(_013) { int tmp; H6280_CYCLES(5); RD_IMM; ST1; } // 4 + 1 penalty cycle ST1 |
| 87 | OP(_033) { H6280_CYCLES(2); NOP; } // 2 NOP |
| 88 | OP(_053) { int tmp; H6280_CYCLES(5); RD_IMM; TAM; } // 5 TAM IMM |
| 89 | 89 | OP(_073) { int to,from,length; TII; } // 6*l+17 TII XFER |
| 90 | | OP(_093) { int tmp,tmp2; h6280_ICount -= 8; RD_IMM2; RD_ABS; TST; } // 8 TST IMM,ABS |
| 91 | | OP(_0b3) { int tmp,tmp2; h6280_ICount -= 8; RD_IMM2; RD_ABX; TST; } // 8 TST IMM,ABX |
| 90 | OP(_093) { int tmp,tmp2; H6280_CYCLES(8); RD_IMM2; RD_ABS; TST; } // 8 TST IMM,ABS |
| 91 | OP(_0b3) { int tmp,tmp2; H6280_CYCLES(8); RD_IMM2; RD_ABX; TST; } // 8 TST IMM,ABX |
| 92 | 92 | OP(_0d3) { int to,from,length; TIN; } // 6*l+17 TIN XFER |
| 93 | 93 | OP(_0f3) { int to,from,length,alternate; TAI; } // 6*l+17 TAI XFER |
| 94 | 94 | |
| 95 | | OP(_004) { int tmp; h6280_ICount -= 6; RD_ZPG; TSB; WB_EAZ; } // 6 TSB ZPG |
| 96 | | OP(_024) { int tmp; h6280_ICount -= 4; RD_ZPG; BIT; } // 4 BIT ZPG |
| 95 | OP(_004) { int tmp; H6280_CYCLES(6); RD_ZPG; TSB; WB_EAZ; } // 6 TSB ZPG |
| 96 | OP(_024) { int tmp; H6280_CYCLES(4); RD_ZPG; BIT; } // 4 BIT ZPG |
| 97 | 97 | OP(_044) { int tmp; BSR; } // 8 BSR REL |
| 98 | | OP(_064) { int tmp; h6280_ICount -= 4; STZ; WR_ZPG; } // 4 STZ ZPG |
| 99 | | OP(_084) { int tmp; h6280_ICount -= 4; STY; WR_ZPG; } // 4 STY ZPG |
| 100 | | OP(_0a4) { int tmp; h6280_ICount -= 4; RD_ZPG; LDY; } // 4 LDY ZPG |
| 101 | | OP(_0c4) { int tmp; h6280_ICount -= 4; RD_ZPG; CPY; } // 4 CPY ZPG |
| 102 | | OP(_0e4) { int tmp; h6280_ICount -= 4; RD_ZPG; CPX; } // 4 CPX ZPG |
| 98 | OP(_064) { int tmp; H6280_CYCLES(4); STZ; WR_ZPG; } // 4 STZ ZPG |
| 99 | OP(_084) { int tmp; H6280_CYCLES(4); STY; WR_ZPG; } // 4 STY ZPG |
| 100 | OP(_0a4) { int tmp; H6280_CYCLES(4); RD_ZPG; LDY; } // 4 LDY ZPG |
| 101 | OP(_0c4) { int tmp; H6280_CYCLES(4); RD_ZPG; CPY; } // 4 CPY ZPG |
| 102 | OP(_0e4) { int tmp; H6280_CYCLES(4); RD_ZPG; CPX; } // 4 CPX ZPG |
| 103 | 103 | |
| 104 | | OP(_014) { int tmp; h6280_ICount -= 6; RD_ZPG; TRB; WB_EAZ; } // 6 TRB ZPG |
| 105 | | OP(_034) { int tmp; h6280_ICount -= 4; RD_ZPX; BIT; } // 4 BIT ZPX |
| 106 | | OP(_054) { h6280_ICount -= 2; } // 2 CSL |
| 107 | | OP(_074) { int tmp; h6280_ICount -= 4; STZ; WR_ZPX; } // 4 STZ ZPX |
| 108 | | OP(_094) { int tmp; h6280_ICount -= 4; STY; WR_ZPX; } // 4 STY ZPX |
| 109 | | OP(_0b4) { int tmp; h6280_ICount -= 4; RD_ZPX; LDY; } // 4 LDY ZPX |
| 110 | | OP(_0d4) { h6280_ICount -= 2; } // 2 CSH |
| 111 | | OP(_0f4) { h6280_ICount -= 2; SET; } // 2 SET |
| 104 | OP(_014) { int tmp; H6280_CYCLES(6); RD_ZPG; TRB; WB_EAZ; } // 6 TRB ZPG |
| 105 | OP(_034) { int tmp; H6280_CYCLES(4); RD_ZPX; BIT; } // 4 BIT ZPX |
| 106 | OP(_054) { H6280_CYCLES(3); CSL; } // 3 CSL |
| 107 | OP(_074) { int tmp; H6280_CYCLES(4); STZ; WR_ZPX; } // 4 STZ ZPX |
| 108 | OP(_094) { int tmp; H6280_CYCLES(4); STY; WR_ZPX; } // 4 STY ZPX |
| 109 | OP(_0b4) { int tmp; H6280_CYCLES(4); RD_ZPX; LDY; } // 4 LDY ZPX |
| 110 | OP(_0d4) { H6280_CYCLES(3); CSH; } // 3 CSH |
| 111 | OP(_0f4) { H6280_CYCLES(2); SET; } // 2 SET |
| 112 | 112 | |
| 113 | | OP(_005) { int tmp; h6280_ICount -= 4; RD_ZPG; ORA; } // 4 ORA ZPG |
| 114 | | OP(_025) { int tmp; h6280_ICount -= 4; RD_ZPG; AND; } // 4 AND ZPG |
| 115 | | OP(_045) { int tmp; h6280_ICount -= 4; RD_ZPG; EOR; } // 4 EOR ZPG |
| 116 | | OP(_065) { int tmp; h6280_ICount -= 4; RD_ZPG; ADC; } // 4 ADC ZPG |
| 117 | | OP(_085) { int tmp; h6280_ICount -= 4; STA; WR_ZPG; } // 4 STA ZPG |
| 118 | | OP(_0a5) { int tmp; h6280_ICount -= 4; RD_ZPG; LDA; } // 4 LDA ZPG |
| 119 | | OP(_0c5) { int tmp; h6280_ICount -= 4; RD_ZPG; CMP; } // 4 CMP ZPG |
| 120 | | OP(_0e5) { int tmp; h6280_ICount -= 4; RD_ZPG; SBC; } // 4 SBC ZPG |
| 113 | OP(_005) { int tmp; H6280_CYCLES(4); RD_ZPG; ORA; } // 4 ORA ZPG |
| 114 | OP(_025) { int tmp; H6280_CYCLES(4); RD_ZPG; AND; } // 4 AND ZPG |
| 115 | OP(_045) { int tmp; H6280_CYCLES(4); RD_ZPG; EOR; } // 4 EOR ZPG |
| 116 | OP(_065) { int tmp; H6280_CYCLES(4); RD_ZPG; ADC; } // 4 ADC ZPG |
| 117 | OP(_085) { int tmp; H6280_CYCLES(4); STA; WR_ZPG; } // 4 STA ZPG |
| 118 | OP(_0a5) { int tmp; H6280_CYCLES(4); RD_ZPG; LDA; } // 4 LDA ZPG |
| 119 | OP(_0c5) { int tmp; H6280_CYCLES(4); RD_ZPG; CMP; } // 4 CMP ZPG |
| 120 | OP(_0e5) { int tmp; H6280_CYCLES(4); RD_ZPG; SBC; } // 4 SBC ZPG |
| 121 | 121 | |
| 122 | | OP(_015) { int tmp; h6280_ICount -= 4; RD_ZPX; ORA; } // 4 ORA ZPX |
| 123 | | OP(_035) { int tmp; h6280_ICount -= 4; RD_ZPX; AND; } // 4 AND ZPX |
| 124 | | OP(_055) { int tmp; h6280_ICount -= 4; RD_ZPX; EOR; } // 4 EOR ZPX |
| 125 | | OP(_075) { int tmp; h6280_ICount -= 4; RD_ZPX; ADC; } // 4 ADC ZPX |
| 126 | | OP(_095) { int tmp; h6280_ICount -= 4; STA; WR_ZPX; } // 4 STA ZPX |
| 127 | | OP(_0b5) { int tmp; h6280_ICount -= 4; RD_ZPX; LDA; } // 4 LDA ZPX |
| 128 | | OP(_0d5) { int tmp; h6280_ICount -= 4; RD_ZPX; CMP; } // 4 CMP ZPX |
| 129 | | OP(_0f5) { int tmp; h6280_ICount -= 4; RD_ZPX; SBC; } // 4 SBC ZPX |
| 122 | OP(_015) { int tmp; H6280_CYCLES(4); RD_ZPX; ORA; } // 4 ORA ZPX |
| 123 | OP(_035) { int tmp; H6280_CYCLES(4); RD_ZPX; AND; } // 4 AND ZPX |
| 124 | OP(_055) { int tmp; H6280_CYCLES(4); RD_ZPX; EOR; } // 4 EOR ZPX |
| 125 | OP(_075) { int tmp; H6280_CYCLES(4); RD_ZPX; ADC; } // 4 ADC ZPX |
| 126 | OP(_095) { int tmp; H6280_CYCLES(4); STA; WR_ZPX; } // 4 STA ZPX |
| 127 | OP(_0b5) { int tmp; H6280_CYCLES(4); RD_ZPX; LDA; } // 4 LDA ZPX |
| 128 | OP(_0d5) { int tmp; H6280_CYCLES(4); RD_ZPX; CMP; } // 4 CMP ZPX |
| 129 | OP(_0f5) { int tmp; H6280_CYCLES(4); RD_ZPX; SBC; } // 4 SBC ZPX |
| 130 | 130 | |
| 131 | | OP(_006) { int tmp; h6280_ICount -= 6; RD_ZPG; ASL; WB_EAZ; } // 6 ASL ZPG |
| 132 | | OP(_026) { int tmp; h6280_ICount -= 6; RD_ZPG; ROL; WB_EAZ; } // 6 ROL ZPG |
| 133 | | OP(_046) { int tmp; h6280_ICount -= 6; RD_ZPG; LSR; WB_EAZ; } // 6 LSR ZPG |
| 134 | | OP(_066) { int tmp; h6280_ICount -= 6; RD_ZPG; ROR; WB_EAZ; } // 6 ROR ZPG |
| 135 | | OP(_086) { int tmp; h6280_ICount -= 4; STX; WR_ZPG; } // 4 STX ZPG |
| 136 | | OP(_0a6) { int tmp; h6280_ICount -= 4; RD_ZPG; LDX; } // 4 LDX ZPG |
| 137 | | OP(_0c6) { int tmp; h6280_ICount -= 6; RD_ZPG; DEC; WB_EAZ; } // 6 DEC ZPG |
| 138 | | OP(_0e6) { int tmp; h6280_ICount -= 6; RD_ZPG; INC; WB_EAZ; } // 6 INC ZPG |
| 131 | OP(_006) { int tmp; H6280_CYCLES(6); RD_ZPG; ASL; WB_EAZ; } // 6 ASL ZPG |
| 132 | OP(_026) { int tmp; H6280_CYCLES(6); RD_ZPG; ROL; WB_EAZ; } // 6 ROL ZPG |
| 133 | OP(_046) { int tmp; H6280_CYCLES(6); RD_ZPG; LSR; WB_EAZ; } // 6 LSR ZPG |
| 134 | OP(_066) { int tmp; H6280_CYCLES(6); RD_ZPG; ROR; WB_EAZ; } // 6 ROR ZPG |
| 135 | OP(_086) { int tmp; H6280_CYCLES(4); STX; WR_ZPG; } // 4 STX ZPG |
| 136 | OP(_0a6) { int tmp; H6280_CYCLES(4); RD_ZPG; LDX; } // 4 LDX ZPG |
| 137 | OP(_0c6) { int tmp; H6280_CYCLES(6); RD_ZPG; DEC; WB_EAZ; } // 6 DEC ZPG |
| 138 | OP(_0e6) { int tmp; H6280_CYCLES(6); RD_ZPG; INC; WB_EAZ; } // 6 INC ZPG |
| 139 | 139 | |
| 140 | | OP(_016) { int tmp; h6280_ICount -= 6; RD_ZPX; ASL; WB_EAZ } // 6 ASL ZPX |
| 141 | | OP(_036) { int tmp; h6280_ICount -= 6; RD_ZPX; ROL; WB_EAZ } // 6 ROL ZPX |
| 142 | | OP(_056) { int tmp; h6280_ICount -= 6; RD_ZPX; LSR; WB_EAZ } // 6 LSR ZPX |
| 143 | | OP(_076) { int tmp; h6280_ICount -= 6; RD_ZPX; ROR; WB_EAZ } // 6 ROR ZPX |
| 144 | | OP(_096) { int tmp; h6280_ICount -= 4; STX; WR_ZPY; } // 4 STX ZPY |
| 145 | | OP(_0b6) { int tmp; h6280_ICount -= 4; RD_ZPY; LDX; } // 4 LDX ZPY |
| 146 | | OP(_0d6) { int tmp; h6280_ICount -= 6; RD_ZPX; DEC; WB_EAZ; } // 6 DEC ZPX |
| 147 | | OP(_0f6) { int tmp; h6280_ICount -= 6; RD_ZPX; INC; WB_EAZ; } // 6 INC ZPX |
| 140 | OP(_016) { int tmp; H6280_CYCLES(6); RD_ZPX; ASL; WB_EAZ } // 6 ASL ZPX |
| 141 | OP(_036) { int tmp; H6280_CYCLES(6); RD_ZPX; ROL; WB_EAZ } // 6 ROL ZPX |
| 142 | OP(_056) { int tmp; H6280_CYCLES(6); RD_ZPX; LSR; WB_EAZ } // 6 LSR ZPX |
| 143 | OP(_076) { int tmp; H6280_CYCLES(6); RD_ZPX; ROR; WB_EAZ } // 6 ROR ZPX |
| 144 | OP(_096) { int tmp; H6280_CYCLES(4); STX; WR_ZPY; } // 4 STX ZPY |
| 145 | OP(_0b6) { int tmp; H6280_CYCLES(4); RD_ZPY; LDX; } // 4 LDX ZPY |
| 146 | OP(_0d6) { int tmp; H6280_CYCLES(6); RD_ZPX; DEC; WB_EAZ; } // 6 DEC ZPX |
| 147 | OP(_0f6) { int tmp; H6280_CYCLES(6); RD_ZPX; INC; WB_EAZ; } // 6 INC ZPX |
| 148 | 148 | |
| 149 | | OP(_007) { int tmp; h6280_ICount -= 7; RD_ZPG; RMB(0);WB_EAZ;} // 7 RMB0 ZPG |
| 150 | | OP(_027) { int tmp; h6280_ICount -= 7; RD_ZPG; RMB(2);WB_EAZ;} // 7 RMB2 ZPG |
| 151 | | OP(_047) { int tmp; h6280_ICount -= 7; RD_ZPG; RMB(4);WB_EAZ;} // 7 RMB4 ZPG |
| 152 | | OP(_067) { int tmp; h6280_ICount -= 7; RD_ZPG; RMB(6);WB_EAZ;} // 7 RMB6 ZPG |
| 153 | | OP(_087) { int tmp; h6280_ICount -= 7; RD_ZPG; SMB(0);WB_EAZ;} // 7 SMB0 ZPG |
| 154 | | OP(_0a7) { int tmp; h6280_ICount -= 7; RD_ZPG; SMB(2);WB_EAZ;} // 7 SMB2 ZPG |
| 155 | | OP(_0c7) { int tmp; h6280_ICount -= 7; RD_ZPG; SMB(4);WB_EAZ;} // 7 SMB4 ZPG |
| 156 | | OP(_0e7) { int tmp; h6280_ICount -= 7; RD_ZPG; SMB(6);WB_EAZ;} // 7 SMB6 ZPG |
| 149 | OP(_007) { int tmp; H6280_CYCLES(7); RD_ZPG; RMB(0);WB_EAZ;} // 7 RMB0 ZPG |
| 150 | OP(_027) { int tmp; H6280_CYCLES(7); RD_ZPG; RMB(2);WB_EAZ;} // 7 RMB2 ZPG |
| 151 | OP(_047) { int tmp; H6280_CYCLES(7); RD_ZPG; RMB(4);WB_EAZ;} // 7 RMB4 ZPG |
| 152 | OP(_067) { int tmp; H6280_CYCLES(7); RD_ZPG; RMB(6);WB_EAZ;} // 7 RMB6 ZPG |
| 153 | OP(_087) { int tmp; H6280_CYCLES(7); RD_ZPG; SMB(0);WB_EAZ;} // 7 SMB0 ZPG |
| 154 | OP(_0a7) { int tmp; H6280_CYCLES(7); RD_ZPG; SMB(2);WB_EAZ;} // 7 SMB2 ZPG |
| 155 | OP(_0c7) { int tmp; H6280_CYCLES(7); RD_ZPG; SMB(4);WB_EAZ;} // 7 SMB4 ZPG |
| 156 | OP(_0e7) { int tmp; H6280_CYCLES(7); RD_ZPG; SMB(6);WB_EAZ;} // 7 SMB6 ZPG |
| 157 | 157 | |
| 158 | | OP(_017) { int tmp; h6280_ICount -= 7; RD_ZPG; RMB(1);WB_EAZ;} // 7 RMB1 ZPG |
| 159 | | OP(_037) { int tmp; h6280_ICount -= 7; RD_ZPG; RMB(3);WB_EAZ;} // 7 RMB3 ZPG |
| 160 | | OP(_057) { int tmp; h6280_ICount -= 7; RD_ZPG; RMB(5);WB_EAZ;} // 7 RMB5 ZPG |
| 161 | | OP(_077) { int tmp; h6280_ICount -= 7; RD_ZPG; RMB(7);WB_EAZ;} // 7 RMB7 ZPG |
| 162 | | OP(_097) { int tmp; h6280_ICount -= 7; RD_ZPG; SMB(1);WB_EAZ;} // 7 SMB1 ZPG |
| 163 | | OP(_0b7) { int tmp; h6280_ICount -= 7; RD_ZPG; SMB(3);WB_EAZ;} // 7 SMB3 ZPG |
| 164 | | OP(_0d7) { int tmp; h6280_ICount -= 7; RD_ZPG; SMB(5);WB_EAZ;} // 7 SMB5 ZPG |
| 165 | | OP(_0f7) { int tmp; h6280_ICount -= 7; RD_ZPG; SMB(7);WB_EAZ;} // 7 SMB7 ZPG |
| 158 | OP(_017) { int tmp; H6280_CYCLES(7); RD_ZPG; RMB(1);WB_EAZ;} // 7 RMB1 ZPG |
| 159 | OP(_037) { int tmp; H6280_CYCLES(7); RD_ZPG; RMB(3);WB_EAZ;} // 7 RMB3 ZPG |
| 160 | OP(_057) { int tmp; H6280_CYCLES(7); RD_ZPG; RMB(5);WB_EAZ;} // 7 RMB5 ZPG |
| 161 | OP(_077) { int tmp; H6280_CYCLES(7); RD_ZPG; RMB(7);WB_EAZ;} // 7 RMB7 ZPG |
| 162 | OP(_097) { int tmp; H6280_CYCLES(7); RD_ZPG; SMB(1);WB_EAZ;} // 7 SMB1 ZPG |
| 163 | OP(_0b7) { int tmp; H6280_CYCLES(7); RD_ZPG; SMB(3);WB_EAZ;} // 7 SMB3 ZPG |
| 164 | OP(_0d7) { int tmp; H6280_CYCLES(7); RD_ZPG; SMB(5);WB_EAZ;} // 7 SMB5 ZPG |
| 165 | OP(_0f7) { int tmp; H6280_CYCLES(7); RD_ZPG; SMB(7);WB_EAZ;} // 7 SMB7 ZPG |
| 166 | 166 | |
| 167 | | OP(_008) { h6280_ICount -= 3; PHP; } // 3 PHP |
| 168 | | OP(_028) { h6280_ICount -= 4; PLP; } // 4 PLP |
| 169 | | OP(_048) { h6280_ICount -= 3; PHA; } // 3 PHA |
| 170 | | OP(_068) { h6280_ICount -= 4; PLA; } // 4 PLA |
| 171 | | OP(_088) { h6280_ICount -= 2; DEY; } // 2 DEY |
| 172 | | OP(_0a8) { h6280_ICount -= 2; TAY; } // 2 TAY |
| 173 | | OP(_0c8) { h6280_ICount -= 2; INY; } // 2 INY |
| 174 | | OP(_0e8) { h6280_ICount -= 2; INX; } // 2 INX |
| 167 | OP(_008) { H6280_CYCLES(3); PHP; } // 3 PHP |
| 168 | OP(_028) { H6280_CYCLES(4); PLP; } // 4 PLP |
| 169 | OP(_048) { H6280_CYCLES(3); PHA; } // 3 PHA |
| 170 | OP(_068) { H6280_CYCLES(4); PLA; } // 4 PLA |
| 171 | OP(_088) { H6280_CYCLES(2); DEY; } // 2 DEY |
| 172 | OP(_0a8) { H6280_CYCLES(2); TAY; } // 2 TAY |
| 173 | OP(_0c8) { H6280_CYCLES(2); INY; } // 2 INY |
| 174 | OP(_0e8) { H6280_CYCLES(2); INX; } // 2 INX |
| 175 | 175 | |
| 176 | | OP(_018) { h6280_ICount -= 2; CLC; } // 2 CLC |
| 177 | | OP(_038) { h6280_ICount -= 2; SEC; } // 2 SEC |
| 178 | | OP(_058) { h6280_ICount -= 2; CLI; } // 2 CLI |
| 179 | | OP(_078) { h6280_ICount -= 2; SEI; } // 2 SEI |
| 180 | | OP(_098) { h6280_ICount -= 2; TYA; } // 2 TYA |
| 181 | | OP(_0b8) { h6280_ICount -= 2; CLV; } // 2 CLV |
| 182 | | OP(_0d8) { h6280_ICount -= 2; CLD; } // 2 CLD |
| 183 | | OP(_0f8) { h6280_ICount -= 2; SED; } // 2 SED |
| 176 | OP(_018) { H6280_CYCLES(2); CLC; } // 2 CLC |
| 177 | OP(_038) { H6280_CYCLES(2); SEC; } // 2 SEC |
| 178 | OP(_058) { H6280_CYCLES(2); CLI; } // 2 CLI |
| 179 | OP(_078) { H6280_CYCLES(2); SEI; } // 2 SEI |
| 180 | OP(_098) { H6280_CYCLES(2); TYA; } // 2 TYA |
| 181 | OP(_0b8) { H6280_CYCLES(2); CLV; } // 2 CLV |
| 182 | OP(_0d8) { H6280_CYCLES(2); CLD; } // 2 CLD |
| 183 | OP(_0f8) { H6280_CYCLES(2); SED; } // 2 SED |
| 184 | 184 | |
| 185 | | OP(_009) { int tmp; h6280_ICount -= 2; RD_IMM; ORA; } // 2 ORA IMM |
| 186 | | OP(_029) { int tmp; h6280_ICount -= 2; RD_IMM; AND; } // 2 AND IMM |
| 187 | | OP(_049) { int tmp; h6280_ICount -= 2; RD_IMM; EOR; } // 2 EOR IMM |
| 188 | | OP(_069) { int tmp; h6280_ICount -= 2; RD_IMM; ADC; } // 2 ADC IMM |
| 189 | | OP(_089) { int tmp; h6280_ICount -= 2; RD_IMM; BIT; } // 2 BIT IMM |
| 190 | | OP(_0a9) { int tmp; h6280_ICount -= 2; RD_IMM; LDA; } // 2 LDA IMM |
| 191 | | OP(_0c9) { int tmp; h6280_ICount -= 2; RD_IMM; CMP; } // 2 CMP IMM |
| 192 | | OP(_0e9) { int tmp; h6280_ICount -= 2; RD_IMM; SBC; } // 2 SBC IMM |
| 185 | OP(_009) { int tmp; H6280_CYCLES(2); RD_IMM; ORA; } // 2 ORA IMM |
| 186 | OP(_029) { int tmp; H6280_CYCLES(2); RD_IMM; AND; } // 2 AND IMM |
| 187 | OP(_049) { int tmp; H6280_CYCLES(2); RD_IMM; EOR; } // 2 EOR IMM |
| 188 | OP(_069) { int tmp; H6280_CYCLES(2); RD_IMM; ADC; } // 2 ADC IMM |
| 189 | OP(_089) { int tmp; H6280_CYCLES(2); RD_IMM; BIT; } // 2 BIT IMM |
| 190 | OP(_0a9) { int tmp; H6280_CYCLES(2); RD_IMM; LDA; } // 2 LDA IMM |
| 191 | OP(_0c9) { int tmp; H6280_CYCLES(2); RD_IMM; CMP; } // 2 CMP IMM |
| 192 | OP(_0e9) { int tmp; H6280_CYCLES(2); RD_IMM; SBC; } // 2 SBC IMM |
| 193 | 193 | |
| 194 | | OP(_019) { int tmp; h6280_ICount -= 5; RD_ABY; ORA; } // 5 ORA ABY |
| 195 | | OP(_039) { int tmp; h6280_ICount -= 5; RD_ABY; AND; } // 5 AND ABY |
| 196 | | OP(_059) { int tmp; h6280_ICount -= 5; RD_ABY; EOR; } // 5 EOR ABY |
| 197 | | OP(_079) { int tmp; h6280_ICount -= 5; RD_ABY; ADC; } // 5 ADC ABY |
| 198 | | OP(_099) { int tmp; h6280_ICount -= 5; STA; WR_ABY; } // 5 STA ABY |
| 199 | | OP(_0b9) { int tmp; h6280_ICount -= 5; RD_ABY; LDA; } // 5 LDA ABY |
| 200 | | OP(_0d9) { int tmp; h6280_ICount -= 5; RD_ABY; CMP; } // 5 CMP ABY |
| 201 | | OP(_0f9) { int tmp; h6280_ICount -= 5; RD_ABY; SBC; } // 5 SBC ABY |
| 194 | OP(_019) { int tmp; H6280_CYCLES(5); RD_ABY; ORA; } // 5 ORA ABY |
| 195 | OP(_039) { int tmp; H6280_CYCLES(5); RD_ABY; AND; } // 5 AND ABY |
| 196 | OP(_059) { int tmp; H6280_CYCLES(5); RD_ABY; EOR; } // 5 EOR ABY |
| 197 | OP(_079) { int tmp; H6280_CYCLES(5); RD_ABY; ADC; } // 5 ADC ABY |
| 198 | OP(_099) { int tmp; H6280_CYCLES(5); STA; WR_ABY; } // 5 STA ABY |
| 199 | OP(_0b9) { int tmp; H6280_CYCLES(5); RD_ABY; LDA; } // 5 LDA ABY |
| 200 | OP(_0d9) { int tmp; H6280_CYCLES(5); RD_ABY; CMP; } // 5 CMP ABY |
| 201 | OP(_0f9) { int tmp; H6280_CYCLES(5); RD_ABY; SBC; } // 5 SBC ABY |
| 202 | 202 | |
| 203 | | OP(_00a) { int tmp; h6280_ICount -= 2; RD_ACC; ASL; WB_ACC; } // 2 ASL A |
| 204 | | OP(_02a) { int tmp; h6280_ICount -= 2; RD_ACC; ROL; WB_ACC; } // 2 ROL A |
| 205 | | OP(_04a) { int tmp; h6280_ICount -= 2; RD_ACC; LSR; WB_ACC; } // 2 LSR A |
| 206 | | OP(_06a) { int tmp; h6280_ICount -= 2; RD_ACC; ROR; WB_ACC; } // 2 ROR A |
| 207 | | OP(_08a) { h6280_ICount -= 2; TXA; } // 2 TXA |
| 208 | | OP(_0aa) { h6280_ICount -= 2; TAX; } // 2 TAX |
| 209 | | OP(_0ca) { h6280_ICount -= 2; DEX; } // 2 DEX |
| 210 | | OP(_0ea) { h6280_ICount -= 2; NOP; } // 2 NOP |
| 203 | OP(_00a) { int tmp; H6280_CYCLES(2); RD_ACC; ASL; WB_ACC; } // 2 ASL A |
| 204 | OP(_02a) { int tmp; H6280_CYCLES(2); RD_ACC; ROL; WB_ACC; } // 2 ROL A |
| 205 | OP(_04a) { int tmp; H6280_CYCLES(2); RD_ACC; LSR; WB_ACC; } // 2 LSR A |
| 206 | OP(_06a) { int tmp; H6280_CYCLES(2); RD_ACC; ROR; WB_ACC; } // 2 ROR A |
| 207 | OP(_08a) { H6280_CYCLES(2); TXA; } // 2 TXA |
| 208 | OP(_0aa) { H6280_CYCLES(2); TAX; } // 2 TAX |
| 209 | OP(_0ca) { H6280_CYCLES(2); DEX; } // 2 DEX |
| 210 | OP(_0ea) { H6280_CYCLES(2); NOP; } // 2 NOP |
| 211 | 211 | |
| 212 | | OP(_01a) { h6280_ICount -= 2; INA; } // 2 INC A |
| 213 | | OP(_03a) { h6280_ICount -= 2; DEA; } // 2 DEC A |
| 214 | | OP(_05a) { h6280_ICount -= 3; PHY; } // 3 PHY |
| 215 | | OP(_07a) { h6280_ICount -= 4; PLY; } // 4 PLY |
| 216 | | OP(_09a) { h6280_ICount -= 2; TXS; } // 2 TXS |
| 217 | | OP(_0ba) { h6280_ICount -= 2; TSX; } // 2 TSX |
| 218 | | OP(_0da) { h6280_ICount -= 3; PHX; } // 3 PHX |
| 219 | | OP(_0fa) { h6280_ICount -= 4; PLX; } // 4 PLX |
| 212 | OP(_01a) { H6280_CYCLES(2); INA; } // 2 INC A |
| 213 | OP(_03a) { H6280_CYCLES(2); DEA; } // 2 DEC A |
| 214 | OP(_05a) { H6280_CYCLES(3); PHY; } // 3 PHY |
| 215 | OP(_07a) { H6280_CYCLES(4); PLY; } // 4 PLY |
| 216 | OP(_09a) { H6280_CYCLES(2); TXS; } // 2 TXS |
| 217 | OP(_0ba) { H6280_CYCLES(2); TSX; } // 2 TSX |
| 218 | OP(_0da) { H6280_CYCLES(3); PHX; } // 3 PHX |
| 219 | OP(_0fa) { H6280_CYCLES(4); PLX; } // 4 PLX |
| 220 | 220 | |
| 221 | | OP(_00b) { ILL; } // 2 ??? |
| 222 | | OP(_02b) { ILL; } // 2 ??? |
| 223 | | OP(_04b) { ILL; } // 2 ??? |
| 224 | | OP(_06b) { ILL; } // 2 ??? |
| 225 | | OP(_08b) { ILL; } // 2 ??? |
| 226 | | OP(_0ab) { ILL; } // 2 ??? |
| 227 | | OP(_0cb) { ILL; } // 2 ??? |
| 228 | | OP(_0eb) { ILL; } // 2 ??? |
| 221 | OP(_00b) { H6280_CYCLES(2); NOP; } // 2 NOP |
| 222 | OP(_02b) { H6280_CYCLES(2); NOP; } // 2 NOP |
| 223 | OP(_04b) { H6280_CYCLES(2); NOP; } // 2 NOP |
| 224 | OP(_06b) { H6280_CYCLES(2); NOP; } // 2 NOP |
| 225 | OP(_08b) { H6280_CYCLES(2); NOP; } // 2 NOP |
| 226 | OP(_0ab) { H6280_CYCLES(2); NOP; } // 2 NOP |
| 227 | OP(_0cb) { H6280_CYCLES(2); NOP; } // 2 NOP |
| 228 | OP(_0eb) { H6280_CYCLES(2); NOP; } // 2 NOP |
| 229 | 229 | |
| 230 | | OP(_01b) { ILL; } // 2 ??? |
| 231 | | OP(_03b) { ILL; } // 2 ??? |
| 232 | | OP(_05b) { ILL; } // 2 ??? |
| 233 | | OP(_07b) { ILL; } // 2 ??? |
| 234 | | OP(_09b) { ILL; } // 2 ??? |
| 235 | | OP(_0bb) { ILL; } // 2 ??? |
| 236 | | OP(_0db) { ILL; } // 2 ??? |
| 237 | | OP(_0fb) { ILL; } // 2 ??? |
| 230 | OP(_01b) { H6280_CYCLES(2); NOP; } // 2 NOP |
| 231 | OP(_03b) { H6280_CYCLES(2); NOP; } // 2 NOP |
| 232 | OP(_05b) { H6280_CYCLES(2); NOP; } // 2 NOP |
| 233 | OP(_07b) { H6280_CYCLES(2); NOP; } // 2 NOP |
| 234 | OP(_09b) { H6280_CYCLES(2); NOP; } // 2 NOP |
| 235 | OP(_0bb) { H6280_CYCLES(2); NOP; } // 2 NOP |
| 236 | OP(_0db) { H6280_CYCLES(2); NOP; } // 2 NOP |
| 237 | OP(_0fb) { H6280_CYCLES(2); NOP; } // 2 NOP |
| 238 | 238 | |
| 239 | | OP(_00c) { int tmp; h6280_ICount -= 7; RD_ABS; TSB; WB_EA; } // 7 TSB ABS |
| 240 | | OP(_02c) { int tmp; h6280_ICount -= 5; RD_ABS; BIT; } // 5 BIT ABS |
| 241 | | OP(_04c) { h6280_ICount -= 4; EA_ABS; JMP; } // 4 JMP ABS |
| 242 | | OP(_06c) { int tmp; h6280_ICount -= 7; EA_IND; JMP; } // 7 JMP IND |
| 243 | | OP(_08c) { int tmp; h6280_ICount -= 5; STY; WR_ABS; } // 5 STY ABS |
| 244 | | OP(_0ac) { int tmp; h6280_ICount -= 5; RD_ABS; LDY; } // 5 LDY ABS |
| 245 | | OP(_0cc) { int tmp; h6280_ICount -= 5; RD_ABS; CPY; } // 5 CPY ABS |
| 246 | | OP(_0ec) { int tmp; h6280_ICount -= 5; RD_ABS; CPX; } // 5 CPX ABS |
| 239 | OP(_00c) { int tmp; H6280_CYCLES(7); RD_ABS; TSB; WB_EA; } // 7 TSB ABS |
| 240 | OP(_02c) { int tmp; H6280_CYCLES(5); RD_ABS; BIT; } // 5 BIT ABS |
| 241 | OP(_04c) { H6280_CYCLES(4); EA_ABS; JMP; } // 4 JMP ABS |
| 242 | OP(_06c) { int tmp; H6280_CYCLES(7); EA_IND; JMP; } // 7 JMP IND |
| 243 | OP(_08c) { int tmp; H6280_CYCLES(5); STY; WR_ABS; } // 5 STY ABS |
| 244 | OP(_0ac) { int tmp; H6280_CYCLES(5); RD_ABS; LDY; } // 5 LDY ABS |
| 245 | OP(_0cc) { int tmp; H6280_CYCLES(5); RD_ABS; CPY; } // 5 CPY ABS |
| 246 | OP(_0ec) { int tmp; H6280_CYCLES(5); RD_ABS; CPX; } // 5 CPX ABS |
| 247 | 247 | |
| 248 | | OP(_01c) { int tmp; h6280_ICount -= 7; RD_ABS; TRB; WB_EA; } // 7 TRB ABS |
| 249 | | OP(_03c) { int tmp; h6280_ICount -= 5; RD_ABX; BIT; } // 5 BIT ABX |
| 250 | | OP(_05c) { ILL; } // 2 ??? |
| 251 | | OP(_07c) { int tmp; h6280_ICount -= 7; EA_IAX; JMP; } // 7 JMP IAX |
| 252 | | OP(_09c) { int tmp; h6280_ICount -= 5; STZ; WR_ABS; } // 5 STZ ABS |
| 253 | | OP(_0bc) { int tmp; h6280_ICount -= 5; RD_ABX; LDY; } // 5 LDY ABX |
| 254 | | OP(_0dc) { ILL; } // 2 ??? |
| 255 | | OP(_0fc) { ILL; } // 2 ??? |
| 248 | OP(_01c) { int tmp; H6280_CYCLES(7); RD_ABS; TRB; WB_EA; } // 7 TRB ABS |
| 249 | OP(_03c) { int tmp; H6280_CYCLES(5); RD_ABX; BIT; } // 5 BIT ABX |
| 250 | OP(_05c) { H6280_CYCLES(2); NOP; } // 2 NOP |
| 251 | OP(_07c) { int tmp; H6280_CYCLES(7); EA_IAX; JMP; } // 7 JMP IAX |
| 252 | OP(_09c) { int tmp; H6280_CYCLES(5); STZ; WR_ABS; } // 5 STZ ABS |
| 253 | OP(_0bc) { int tmp; H6280_CYCLES(5); RD_ABX; LDY; } // 5 LDY ABX |
| 254 | OP(_0dc) { H6280_CYCLES(2); NOP; } // 2 NOP |
| 255 | OP(_0fc) { H6280_CYCLES(2); NOP; } // 2 NOP |
| 256 | 256 | |
| 257 | | OP(_00d) { int tmp; h6280_ICount -= 5; RD_ABS; ORA; } // 5 ORA ABS |
| 258 | | OP(_02d) { int tmp; h6280_ICount -= 5; RD_ABS; AND; } // 4 AND ABS |
| 259 | | OP(_04d) { int tmp; h6280_ICount -= 5; RD_ABS; EOR; } // 4 EOR ABS |
| 260 | | OP(_06d) { int tmp; h6280_ICount -= 5; RD_ABS; ADC; } // 4 ADC ABS |
| 261 | | OP(_08d) { int tmp; h6280_ICount -= 5; STA; WR_ABS; } // 4 STA ABS |
| 262 | | OP(_0ad) { int tmp; h6280_ICount -= 5; RD_ABS; LDA; } // 4 LDA ABS |
| 263 | | OP(_0cd) { int tmp; h6280_ICount -= 5; RD_ABS; CMP; } // 4 CMP ABS |
| 264 | | OP(_0ed) { int tmp; h6280_ICount -= 5; RD_ABS; SBC; } // 4 SBC ABS |
| 257 | OP(_00d) { int tmp; H6280_CYCLES(5); RD_ABS; ORA; } // 5 ORA ABS |
| 258 | OP(_02d) { int tmp; H6280_CYCLES(5); RD_ABS; AND; } // 5 AND ABS |
| 259 | OP(_04d) { int tmp; H6280_CYCLES(5); RD_ABS; EOR; } // 5 EOR ABS |
| 260 | OP(_06d) { int tmp; H6280_CYCLES(5); RD_ABS; ADC; } // 5 ADC ABS |
| 261 | OP(_08d) { int tmp; H6280_CYCLES(5); STA; WR_ABS; } // 5 STA ABS |
| 262 | OP(_0ad) { int tmp; H6280_CYCLES(5); RD_ABS; LDA; } // 5 LDA ABS |
| 263 | OP(_0cd) { int tmp; H6280_CYCLES(5); RD_ABS; CMP; } // 5 CMP ABS |
| 264 | OP(_0ed) { int tmp; H6280_CYCLES(5); RD_ABS; SBC; } // 5 SBC ABS |
| 265 | 265 | |
| 266 | | OP(_01d) { int tmp; h6280_ICount -= 5; RD_ABX; ORA; } // 5 ORA ABX |
| 267 | | OP(_03d) { int tmp; h6280_ICount -= 5; RD_ABX; AND; } // 4 AND ABX |
| 268 | | OP(_05d) { int tmp; h6280_ICount -= 5; RD_ABX; EOR; } // 4 EOR ABX |
| 269 | | OP(_07d) { int tmp; h6280_ICount -= 5; RD_ABX; ADC; } // 4 ADC ABX |
| 270 | | OP(_09d) { int tmp; h6280_ICount -= 5; STA; WR_ABX; } // 5 STA ABX |
| 271 | | OP(_0bd) { int tmp; h6280_ICount -= 5; RD_ABX; LDA; } // 5 LDA ABX |
| 272 | | OP(_0dd) { int tmp; h6280_ICount -= 5; RD_ABX; CMP; } // 4 CMP ABX |
| 273 | | OP(_0fd) { int tmp; h6280_ICount -= 5; RD_ABX; SBC; } // 4 SBC ABX |
| 266 | OP(_01d) { int tmp; H6280_CYCLES(5); RD_ABX; ORA; } // 5 ORA ABX |
| 267 | OP(_03d) { int tmp; H6280_CYCLES(5); RD_ABX; AND; } // 5 AND ABX |
| 268 | OP(_05d) { int tmp; H6280_CYCLES(5); RD_ABX; EOR; } // 5 EOR ABX |
| 269 | OP(_07d) { int tmp; H6280_CYCLES(5); RD_ABX; ADC; } // 5 ADC ABX |
| 270 | OP(_09d) { int tmp; H6280_CYCLES(5); STA; WR_ABX; } // 5 STA ABX |
| 271 | OP(_0bd) { int tmp; H6280_CYCLES(5); RD_ABX; LDA; } // 5 LDA ABX |
| 272 | OP(_0dd) { int tmp; H6280_CYCLES(5); RD_ABX; CMP; } // 5 CMP ABX |
| 273 | OP(_0fd) { int tmp; H6280_CYCLES(5); RD_ABX; SBC; } // 5 SBC ABX |
| 274 | 274 | |
| 275 | | OP(_00e) { int tmp; h6280_ICount -= 7; RD_ABS; ASL; WB_EA; } // 6 ASL ABS |
| 276 | | OP(_02e) { int tmp; h6280_ICount -= 7; RD_ABS; ROL; WB_EA; } // 6 ROL ABS |
| 277 | | OP(_04e) { int tmp; h6280_ICount -= 7; RD_ABS; LSR; WB_EA; } // 6 LSR ABS |
| 278 | | OP(_06e) { int tmp; h6280_ICount -= 7; RD_ABS; ROR; WB_EA; } // 6 ROR ABS |
| 279 | | OP(_08e) { int tmp; h6280_ICount -= 5; STX; WR_ABS; } // 4 STX ABS |
| 280 | | OP(_0ae) { int tmp; h6280_ICount -= 5; RD_ABS; LDX; } // 5 LDX ABS |
| 281 | | OP(_0ce) { int tmp; h6280_ICount -= 7; RD_ABS; DEC; WB_EA; } // 6 DEC ABS |
| 282 | | OP(_0ee) { int tmp; h6280_ICount -= 7; RD_ABS; INC; WB_EA; } // 6 INC ABS |
| 275 | OP(_00e) { int tmp; H6280_CYCLES(7); RD_ABS; ASL; WB_EA; } // 7 ASL ABS |
| 276 | OP(_02e) { int tmp; H6280_CYCLES(7); RD_ABS; ROL; WB_EA; } // 7 ROL ABS |
| 277 | OP(_04e) { int tmp; H6280_CYCLES(7); RD_ABS; LSR; WB_EA; } // 7 LSR ABS |
| 278 | OP(_06e) { int tmp; H6280_CYCLES(7); RD_ABS; ROR; WB_EA; } // 7 ROR ABS |
| 279 | OP(_08e) { int tmp; H6280_CYCLES(5); STX; WR_ABS; } // 5 STX ABS |
| 280 | OP(_0ae) { int tmp; H6280_CYCLES(5); RD_ABS; LDX; } // 5 LDX ABS |
| 281 | OP(_0ce) { int tmp; H6280_CYCLES(7); RD_ABS; DEC; WB_EA; } // 7 DEC ABS |
| 282 | OP(_0ee) { int tmp; H6280_CYCLES(7); RD_ABS; INC; WB_EA; } // 7 INC ABS |
| 283 | 283 | |
| 284 | | OP(_01e) { int tmp; h6280_ICount -= 7; RD_ABX; ASL; WB_EA; } // 7 ASL ABX |
| 285 | | OP(_03e) { int tmp; h6280_ICount -= 7; RD_ABX; ROL; WB_EA; } // 7 ROL ABX |
| 286 | | OP(_05e) { int tmp; h6280_ICount -= 7; RD_ABX; LSR; WB_EA; } // 7 LSR ABX |
| 287 | | OP(_07e) { int tmp; h6280_ICount -= 7; RD_ABX; ROR; WB_EA; } // 7 ROR ABX |
| 288 | | OP(_09e) { int tmp; h6280_ICount -= 5; STZ; WR_ABX; } // 5 STZ ABX |
| 289 | | OP(_0be) { int tmp; h6280_ICount -= 5; RD_ABY; LDX; } // 4 LDX ABY |
| 290 | | OP(_0de) { int tmp; h6280_ICount -= 7; RD_ABX; DEC; WB_EA; } // 7 DEC ABX |
| 291 | | OP(_0fe) { int tmp; h6280_ICount -= 7; RD_ABX; INC; WB_EA; } // 7 INC ABX |
| 284 | OP(_01e) { int tmp; H6280_CYCLES(7); RD_ABX; ASL; WB_EA; } // 7 ASL ABX |
| 285 | OP(_03e) { int tmp; H6280_CYCLES(7); RD_ABX; ROL; WB_EA; } // 7 ROL ABX |
| 286 | OP(_05e) { int tmp; H6280_CYCLES(7); RD_ABX; LSR; WB_EA; } // 7 LSR ABX |
| 287 | OP(_07e) { int tmp; H6280_CYCLES(7); RD_ABX; ROR; WB_EA; } // 7 ROR ABX |
| 288 | OP(_09e) { int tmp; H6280_CYCLES(5); STZ; WR_ABX; } // 5 STZ ABX |
| 289 | OP(_0be) { int tmp; H6280_CYCLES(5); RD_ABY; LDX; } // 5 LDX ABY |
| 290 | OP(_0de) { int tmp; H6280_CYCLES(7); RD_ABX; DEC; WB_EA; } // 7 DEC ABX |
| 291 | OP(_0fe) { int tmp; H6280_CYCLES(7); RD_ABX; INC; WB_EA; } // 7 INC ABX |
| 292 | 292 | |
| 293 | | OP(_00f) { int tmp; h6280_ICount -= 4; RD_ZPG; BBR(0); } // 6/8 BBR0 ZPG,REL |
| 294 | | OP(_02f) { int tmp; h6280_ICount -= 4; RD_ZPG; BBR(2); } // 6/8 BBR2 ZPG,REL |
| 295 | | OP(_04f) { int tmp; h6280_ICount -= 4; RD_ZPG; BBR(4); } // 6/8 BBR4 ZPG,REL |
| 296 | | OP(_06f) { int tmp; h6280_ICount -= 4; RD_ZPG; BBR(6); } // 6/8 BBR6 ZPG,REL |
| 297 | | OP(_08f) { int tmp; h6280_ICount -= 4; RD_ZPG; BBS(0); } // 6/8 BBS0 ZPG,REL |
| 298 | | OP(_0af) { int tmp; h6280_ICount -= 4; RD_ZPG; BBS(2); } // 6/8 BBS2 ZPG,REL |
| 299 | | OP(_0cf) { int tmp; h6280_ICount -= 4; RD_ZPG; BBS(4); } // 6/8 BBS4 ZPG,REL |
| 300 | | OP(_0ef) { int tmp; h6280_ICount -= 4; RD_ZPG; BBS(6); } // 6/8 BBS6 ZPG,REL |
| 293 | OP(_00f) { int tmp; H6280_CYCLES(4); RD_ZPG; BBR(0); } // 6/8 BBR0 ZPG,REL |
| 294 | OP(_02f) { int tmp; H6280_CYCLES(4); RD_ZPG; BBR(2); } // 6/8 BBR2 ZPG,REL |
| 295 | OP(_04f) { int tmp; H6280_CYCLES(4); RD_ZPG; BBR(4); } // 6/8 BBR4 ZPG,REL |
| 296 | OP(_06f) { int tmp; H6280_CYCLES(4); RD_ZPG; BBR(6); } // 6/8 BBR6 ZPG,REL |
| 297 | OP(_08f) { int tmp; H6280_CYCLES(4); RD_ZPG; BBS(0); } // 6/8 BBS0 ZPG,REL |
| 298 | OP(_0af) { int tmp; H6280_CYCLES(4); RD_ZPG; BBS(2); } // 6/8 BBS2 ZPG,REL |
| 299 | OP(_0cf) { int tmp; H6280_CYCLES(4); RD_ZPG; BBS(4); } // 6/8 BBS4 ZPG,REL |
| 300 | OP(_0ef) { int tmp; H6280_CYCLES(4); RD_ZPG; BBS(6); } // 6/8 BBS6 ZPG,REL |
| 301 | 301 | |
| 302 | | OP(_01f) { int tmp; h6280_ICount -= 4; RD_ZPG; BBR(1); } // 6/8 BBR1 ZPG,REL |
| 303 | | OP(_03f) { int tmp; h6280_ICount -= 4; RD_ZPG; BBR(3); } // 6/8 BBR3 ZPG,REL |
| 304 | | OP(_05f) { int tmp; h6280_ICount -= 4; RD_ZPG; BBR(5); } // 6/8 BBR5 ZPG,REL |
| 305 | | OP(_07f) { int tmp; h6280_ICount -= 4; RD_ZPG; BBR(7); } // 6/8 BBR7 ZPG,REL |
| 306 | | OP(_09f) { int tmp; h6280_ICount -= 4; RD_ZPG; BBS(1); } // 6/8 BBS1 ZPG,REL |
| 307 | | OP(_0bf) { int tmp; h6280_ICount -= 4; RD_ZPG; BBS(3); } // 6/8 BBS3 ZPG,REL |
| 308 | | OP(_0df) { int tmp; h6280_ICount -= 4; RD_ZPG; BBS(5); } // 6/8 BBS5 ZPG,REL |
| 309 | | OP(_0ff) { int tmp; h6280_ICount -= 4; RD_ZPG; BBS(7); } // 6/8 BBS7 ZPG,REL |
| 302 | OP(_01f) { int tmp; H6280_CYCLES(4); RD_ZPG; BBR(1); } // 6/8 BBR1 ZPG,REL |
| 303 | OP(_03f) { int tmp; H6280_CYCLES(4); RD_ZPG; BBR(3); } // 6/8 BBR3 ZPG,REL |
| 304 | OP(_05f) { int tmp; H6280_CYCLES(4); RD_ZPG; BBR(5); } // 6/8 BBR5 ZPG,REL |
| 305 | OP(_07f) { int tmp; H6280_CYCLES(4); RD_ZPG; BBR(7); } // 6/8 BBR7 ZPG,REL |
| 306 | OP(_09f) { int tmp; H6280_CYCLES(4); RD_ZPG; BBS(1); } // 6/8 BBS1 ZPG,REL |
| 307 | OP(_0bf) { int tmp; H6280_CYCLES(4); RD_ZPG; BBS(3); } // 6/8 BBS3 ZPG,REL |
| 308 | OP(_0df) { int tmp; H6280_CYCLES(4); RD_ZPG; BBS(5); } // 6/8 BBS5 ZPG,REL |
| 309 | OP(_0ff) { int tmp; H6280_CYCLES(4); RD_ZPG; BBS(7); } // 6/8 BBS7 ZPG,REL |
| 310 | 310 | |
| 311 | 311 | static void (*insnh6280[0x100])(void) = { |
| 312 | 312 | h6280_000,h6280_001,h6280_002,h6280_003,h6280_004,h6280_005,h6280_006,h6280_007, |