trunk/src/emu/cpu/pps4/pps4.c
| r242185 | r242186 | |
| 33 | 33 | #include "pps4.h" |
| 34 | 34 | |
| 35 | 35 | |
| 36 | | #define VERBOSE 1 //!< set to 1 to log certain instruction conditions |
| 36 | #define VERBOSE 0 //!< set to 1 to log certain instruction conditions |
| 37 | 37 | |
| 38 | 38 | #if VERBOSE |
| 39 | 39 | #define LOG(x) logerror x |
| r242185 | r242186 | |
| 219 | 219 | * @brief pps4_device::iADI Add immediate |
| 220 | 220 | * OPCODE cycles mnemonic |
| 221 | 221 | * ----------------------------- |
| 222 | | * 0110 xxxx 1 cyc ADI #x |
| 222 | * 0110 xxxx 1 cyc ADI x |
| 223 | 223 | * |
| 224 | 224 | * Symbolic equation |
| 225 | 225 | * ----------------------------- |
| r242185 | r242186 | |
| 248 | 248 | * @brief pps4_device::iDC Decimal correction |
| 249 | 249 | * OPCODE cycles mnemonic |
| 250 | 250 | * ----------------------------- |
| 251 | | * 0110 0110 1 cyc DC |
| 251 | * 0110 0101 1 cyc DC |
| 252 | 252 | * |
| 253 | 253 | * Symbolic equation |
| 254 | 254 | * ----------------------------- |
| r242185 | r242186 | |
| 337 | 337 | */ |
| 338 | 338 | void pps4_device::iCOMP() |
| 339 | 339 | { |
| 340 | | m_A = ~m_A & 15; |
| 340 | m_A = m_A ^ 15; |
| 341 | 341 | } |
| 342 | 342 | |
| 343 | 343 | /** |
| r242185 | r242186 | |
| 395 | 395 | * @brief pps4_device::iRF1 Reset flip-flop FF1 |
| 396 | 396 | * OPCODE cycles mnemonic |
| 397 | 397 | * ----------------------------- |
| 398 | | * 0010 0100 1 cyc RF1 |
| 398 | * 0010 0110 1 cyc RF1 |
| 399 | 399 | * |
| 400 | 400 | * Symbolic equation |
| 401 | 401 | * ----------------------------- |
| r242185 | r242186 | |
| 463 | 463 | */ |
| 464 | 464 | void pps4_device::iLD() |
| 465 | 465 | { |
| 466 | | const UINT16 imm = ~m_I & 7; |
| 466 | const UINT16 i3c = ~m_I & 7; |
| 467 | 467 | m_A = M(); |
| 468 | | m_B = m_B ^ (imm << 4); |
| 468 | m_B = m_B ^ (i3c << 4); |
| 469 | 469 | } |
| 470 | 470 | |
| 471 | 471 | /** |
| r242185 | r242186 | |
| 486 | 486 | */ |
| 487 | 487 | void pps4_device::iEX() |
| 488 | 488 | { |
| 489 | | const UINT16 imm = ~m_I & 7; |
| 489 | const UINT16 i3c = ~m_I & 7; |
| 490 | 490 | const UINT8 mem = M(); |
| 491 | 491 | W(m_A); |
| 492 | 492 | m_A = mem; |
| 493 | | m_B = m_B ^ (imm << 4); |
| 493 | m_B = m_B ^ (i3c << 4); |
| 494 | 494 | } |
| 495 | 495 | |
| 496 | 496 | /** |
| r242185 | r242186 | |
| 515 | 515 | */ |
| 516 | 516 | void pps4_device::iEXD() |
| 517 | 517 | { |
| 518 | | const UINT8 imm = ~m_I & 7; |
| 518 | const UINT8 i3c = ~m_I & 7; |
| 519 | 519 | const UINT8 mem = M(); |
| 520 | 520 | UINT8 bl = m_B & 15; |
| 521 | 521 | W(m_A); |
| 522 | 522 | m_A = mem; |
| 523 | | m_B = m_B ^ (imm << 4); |
| 523 | m_B = m_B ^ (i3c << 4); |
| 524 | // if decrement BL wraps to 1111b |
| 524 | 525 | if (0 == bl) { |
| 525 | | // decrement BL wraps to 1111b |
| 526 | 526 | bl = 15; |
| 527 | 527 | m_Skip = 1; |
| 528 | 528 | } else { |
| 529 | | // decrement BL |
| 530 | 529 | bl = bl - 1; |
| 531 | 530 | } |
| 532 | 531 | m_B = (m_B & ~15) | bl; |
| r242185 | r242186 | |
| 583 | 582 | * @brief pps4_device::iLXA |
| 584 | 583 | * OPCODE cycles mnemonic |
| 585 | 584 | * ----------------------------- |
| 586 | | * 0001 1011 1 cyc LAX |
| 585 | * 0001 1011 1 cyc LXA |
| 587 | 586 | * |
| 588 | 587 | * Symbolic equation |
| 589 | 588 | * ----------------------------- |
| r242185 | r242186 | |
| 637 | 636 | * @brief pps4_device::iLBUA |
| 638 | 637 | * OPCODE cycles mnemonic |
| 639 | 638 | * ----------------------------- |
| 640 | | * 0001 0000 1 cyc LBUA |
| 639 | * 0000 0100 1 cyc LBUA |
| 641 | 640 | * |
| 642 | 641 | * Symbolic equation |
| 643 | 642 | * ----------------------------- |
| r242185 | r242186 | |
| 760 | 759 | */ |
| 761 | 760 | void pps4_device::iCYS() |
| 762 | 761 | { |
| 763 | | const UINT16 sa = (m_SA >> 4) | (m_A << 12); |
| 762 | const UINT16 sa = (m_SA >> 4) | (m_A << 8); |
| 764 | 763 | m_A = m_SA & 15; |
| 765 | 764 | m_SA = sa; |
| 766 | 765 | } |
| r242185 | r242186 | |
| 841 | 840 | */ |
| 842 | 841 | void pps4_device::iLBL() |
| 843 | 842 | { |
| 843 | const UINT8 i8 = ~ARG() & 255; |
| 844 | 844 | // previous LB or LBL instruction? |
| 845 | 845 | if (0xc0 == m_Ip || 0x00 == m_Ip) { |
| 846 | 846 | LOG(("%s: skip prev:%02x op:%02x\n", __FUNCTION__, m_Ip, m_I)); |
| 847 | 847 | return; |
| 848 | 848 | } |
| 849 | | m_B = ~ARG() & 255; |
| 849 | m_B = i8; |
| 850 | 850 | } |
| 851 | 851 | |
| 852 | 852 | /** |
| r242185 | r242186 | |
| 879 | 879 | * @brief pps4_device::iDECB |
| 880 | 880 | * OPCODE cycles mnemonic |
| 881 | 881 | * ----------------------------- |
| 882 | | * 0001 1111 1 cyc DECq |
| 882 | * 0001 1111 1 cyc DECB |
| 883 | 883 | * |
| 884 | 884 | * Symbolic equation |
| 885 | 885 | * ----------------------------- |
| r242185 | r242186 | |
| 905 | 905 | * @brief pps4_device::iT Transfer |
| 906 | 906 | * OPCODE cycles mnemonic |
| 907 | 907 | * ----------------------------- |
| 908 | | * 10xx xxxx 1 cyc T * |
| 908 | * 10xx xxxx 1 cyc T *xx |
| 909 | 909 | * |
| 910 | 910 | * Symbolic equation |
| 911 | 911 | * ----------------------------- |
| r242185 | r242186 | |
| 952 | 952 | { |
| 953 | 953 | m_SB = m_SA; |
| 954 | 954 | m_SA = m_P; |
| 955 | | m_P = 3 << 6; |
| 956 | | m_P = m_P | (m_I & 63); |
| 955 | m_P = (3 << 6) | (m_I & 63); |
| 957 | 956 | m_I2 = ARG(); |
| 958 | 957 | m_P = (1 << 8) | m_I2; |
| 959 | 958 | } |
| r242185 | r242186 | |
| 978 | 977 | void pps4_device::iTL() |
| 979 | 978 | { |
| 980 | 979 | m_I2 = ARG(); |
| 981 | | m_P = (m_I & 15) << 8; |
| 982 | | m_P = m_P | m_I2; |
| 980 | m_P = ((m_I & 15) << 8) | m_I2; |
| 983 | 981 | } |
| 984 | 982 | |
| 985 | 983 | /** |
| r242185 | r242186 | |
| 1040 | 1038 | */ |
| 1041 | 1039 | void pps4_device::iSKZ() |
| 1042 | 1040 | { |
| 1043 | | m_Skip = 0 == m_A ? 1 : 0; |
| 1041 | m_Skip = (0 == m_A) ? 1 : 0; |
| 1044 | 1042 | } |
| 1045 | 1043 | |
| 1046 | 1044 | /** |
| r242185 | r242186 | |
| 1059 | 1057 | */ |
| 1060 | 1058 | void pps4_device::iSKBI() |
| 1061 | 1059 | { |
| 1062 | | const UINT8 imm = m_I & 15; |
| 1060 | const UINT8 i4 = m_I & 15; |
| 1063 | 1061 | const UINT8 bl = m_B & 15; |
| 1064 | | m_Skip = bl == imm ? 1 : 0; |
| 1062 | m_Skip = bl == i4 ? 1 : 0; |
| 1065 | 1063 | } |
| 1066 | 1064 | |
| 1067 | 1065 | /** |
| r242185 | r242186 | |
| 1098 | 1096 | * @brief pps4_device::iRTN Return |
| 1099 | 1097 | * OPCODE cycles mnemonic |
| 1100 | 1098 | * ----------------------------- |
| 1101 | | * 0000 0101 1 cyc RET |
| 1099 | * 0000 0101 1 cyc RTN |
| 1102 | 1100 | * |
| 1103 | 1101 | * Symbolic equation |
| 1104 | 1102 | * ----------------------------- |
| r242185 | r242186 | |
| 1121 | 1119 | * @brief pps4_device::iRTN Return |
| 1122 | 1120 | * OPCODE cycles mnemonic |
| 1123 | 1121 | * ----------------------------- |
| 1124 | | * 0000 0111 1 cyc RETSK |
| 1122 | * 0000 0111 1 cyc RTNSK |
| 1125 | 1123 | * |
| 1126 | 1124 | * Symbolic equation |
| 1127 | 1125 | * ----------------------------- |
| r242185 | r242186 | |
| 1138 | 1136 | m_SA ^= m_SB; |
| 1139 | 1137 | m_SB ^= m_SA; |
| 1140 | 1138 | m_SA ^= m_SB; |
| 1141 | | ROP(); // next opcode is ignored |
| 1142 | | m_I = 0; // avoid LB/LBL or LDI skipping due to m_Ip |
| 1139 | m_Skip = 1; // next opcode is ignored |
| 1143 | 1140 | } |
| 1144 | 1141 | |
| 1145 | 1142 | /** |
| r242185 | r242186 | |
| 1166 | 1163 | */ |
| 1167 | 1164 | void pps4_device::iIOL() |
| 1168 | 1165 | { |
| 1169 | | const UINT8 a = ~m_A & 15; |
| 1166 | const UINT8 ac = ~m_A & 15; |
| 1170 | 1167 | m_I2 = ARG(); |
| 1171 | | m_io->write_byte(m_I2, a); |
| 1172 | | LOG(("%s: port:%02x <- %x\n", __FUNCTION__, m_I2, a)); |
| 1168 | m_io->write_byte(m_I2, ac); |
| 1169 | LOG(("%s: port:%02x <- %x\n", __FUNCTION__, m_I2, ac)); |
| 1173 | 1170 | m_A = ~m_io->read_byte(m_I2) & 15; |
| 1174 | 1171 | LOG(("%s: port:%02x -> %x\n", __FUNCTION__, m_I2, m_A)); |
| 1175 | 1172 | } |
| r242185 | r242186 | |
| 1189 | 1186 | */ |
| 1190 | 1187 | void pps4_device::iDIA() |
| 1191 | 1188 | { |
| 1192 | | m_A = m_io->read_byte(PPS4_PORT_A); |
| 1189 | m_A = m_io->read_byte(PPS4_PORT_A) & 15; |
| 1193 | 1190 | } |
| 1194 | 1191 | |
| 1195 | 1192 | /** |
| r242185 | r242186 | |
| 1207 | 1204 | */ |
| 1208 | 1205 | void pps4_device::iDIB() |
| 1209 | 1206 | { |
| 1210 | | m_A = m_io->read_byte(PPS4_PORT_B); |
| 1207 | m_A = m_io->read_byte(PPS4_PORT_B) & 15; |
| 1211 | 1208 | } |
| 1212 | 1209 | |
| 1213 | 1210 | /** |
| 1214 | | * @brief pps4_device::iDIA Discrete input group A |
| 1211 | * @brief pps4_device::iDOA Discrete output |
| 1215 | 1212 | * OPCODE cycles mnemonic |
| 1216 | 1213 | * ----------------------------- |
| 1217 | | * 0010 1101 1 cyc DOA |
| 1214 | * 0001 1101 1 cyc DOA |
| 1218 | 1215 | * |
| 1219 | 1216 | * Symbolic equation |
| 1220 | 1217 | * ----------------------------- |