trunk/src/emu/cpu/rsp/rsp.c
| r241981 | r241982 | |
| 146 | 146 | return CPU_DISASSEMBLE_NAME( rsp )(this, buffer, pc, oprom, opram, options); |
| 147 | 147 | } |
| 148 | 148 | |
| 149 | void rsp_device::rsp_add_imem(UINT32 *base) |
| 150 | { |
| 151 | m_imem32 = base; |
| 152 | m_imem16 = (UINT16*)base; |
| 153 | m_imem8 = (UINT8*)base; |
| 154 | } |
| 155 | |
| 156 | void rsp_device::rsp_add_dmem(UINT32 *base) |
| 157 | { |
| 158 | m_dmem32 = base; |
| 159 | m_dmem16 = (UINT16*)base; |
| 160 | m_dmem8 = (UINT8*)base; |
| 161 | } |
| 162 | |
| 163 | UINT8 rsp_device::DM_READ8(UINT32 address) |
| 164 | { |
| 165 | UINT8 ret = m_dmem8[BYTE4_XOR_BE(address & 0xfff)]; |
| 166 | //printf("R8:%08x=%02x\n", address, ret); |
| 167 | return ret; |
| 168 | } |
| 169 | |
| 170 | UINT16 rsp_device::DM_READ16(UINT32 address) |
| 171 | { |
| 172 | UINT16 ret; |
| 173 | address &= 0xfff; |
| 174 | ret = m_dmem8[BYTE4_XOR_BE(address)] << 8; |
| 175 | ret |= m_dmem8[BYTE4_XOR_BE(address + 1)]; |
| 176 | //printf("R16:%08x=%04x\n", address, ret); |
| 177 | return ret; |
| 178 | } |
| 179 | |
| 180 | UINT32 rsp_device::DM_READ32(UINT32 address) |
| 181 | { |
| 182 | UINT32 ret; |
| 183 | address &= 0xfff; |
| 184 | ret = m_dmem8[BYTE4_XOR_BE(address)] << 24; |
| 185 | ret |= m_dmem8[BYTE4_XOR_BE(address + 1)] << 16; |
| 186 | ret |= m_dmem8[BYTE4_XOR_BE(address + 2)] << 8; |
| 187 | ret |= m_dmem8[BYTE4_XOR_BE(address + 3)]; |
| 188 | //printf("R32:%08x=%08x\n", address, ret); |
| 189 | return ret; |
| 190 | } |
| 191 | |
| 192 | void rsp_device::DM_WRITE8(UINT32 address, UINT8 data) |
| 193 | { |
| 194 | address &= 0xfff; |
| 195 | m_dmem8[BYTE4_XOR_BE(address)] = data; |
| 196 | //printf("W8:%08x=%02x\n", address, data); |
| 197 | } |
| 198 | |
| 199 | void rsp_device::DM_WRITE16(UINT32 address, UINT16 data) |
| 200 | { |
| 201 | address &= 0xfff; |
| 202 | m_dmem8[BYTE4_XOR_BE(address)] = data >> 8; |
| 203 | m_dmem8[BYTE4_XOR_BE(address + 1)] = data & 0xff; |
| 204 | //printf("W16:%08x=%04x\n", address, data); |
| 205 | } |
| 206 | |
| 207 | void rsp_device::DM_WRITE32(UINT32 address, UINT32 data) |
| 208 | { |
| 209 | address &= 0xfff; |
| 210 | m_dmem8[BYTE4_XOR_BE(address)] = data >> 24; |
| 211 | m_dmem8[BYTE4_XOR_BE(address + 1)] = (data >> 16) & 0xff; |
| 212 | m_dmem8[BYTE4_XOR_BE(address + 2)] = (data >> 8) & 0xff; |
| 213 | m_dmem8[BYTE4_XOR_BE(address + 3)] = data & 0xff; |
| 214 | //printf("W32:%08x=%08x\n", address, data); |
| 215 | } |
| 216 | |
| 149 | 217 | UINT8 rsp_device::READ8(UINT32 address) |
| 150 | 218 | { |
| 151 | 219 | UINT8 ret; |
trunk/src/emu/cpu/rsp/rspcp2.c
| r241981 | r241982 | |
| 844 | 844 | Vector Accumulator Helpers |
| 845 | 845 | ***************************************************************************/ |
| 846 | 846 | |
| 847 | | inline UINT16 rsp_cop2::SATURATE_ACCUM1(int accum, UINT16 negative, UINT16 positive) |
| 848 | | { |
| 849 | | if ((INT16)ACCUM_H(accum) < 0) |
| 850 | | { |
| 851 | | if ((UINT16)(ACCUM_H(accum)) != 0xffff) |
| 852 | | { |
| 853 | | return negative; |
| 854 | | } |
| 855 | | else |
| 856 | | { |
| 857 | | if ((INT16)ACCUM_M(accum) >= 0) |
| 858 | | { |
| 859 | | return negative; |
| 860 | | } |
| 861 | | else |
| 862 | | { |
| 863 | | return ACCUM_M(accum); |
| 864 | | } |
| 865 | | } |
| 866 | | } |
| 867 | | else |
| 868 | | { |
| 869 | | if ((UINT16)(ACCUM_H(accum)) != 0) |
| 870 | | { |
| 871 | | return positive; |
| 872 | | } |
| 873 | | else |
| 874 | | { |
| 875 | | if ((INT16)ACCUM_M(accum) < 0) |
| 876 | | { |
| 877 | | return positive; |
| 878 | | } |
| 879 | | else |
| 880 | | { |
| 881 | | return ACCUM_M(accum); |
| 882 | | } |
| 883 | | } |
| 884 | | } |
| 885 | | } |
| 886 | | |
| 887 | 847 | UINT16 rsp_cop2::SATURATE_ACCUM(int accum, int slice, UINT16 negative, UINT16 positive) |
| 888 | 848 | { |
| 889 | 849 | if ((INT16)ACCUM_H(accum) < 0) |
| r241981 | r241982 | |
| 1174 | 1134 | WRITEBACK_RESULT(); |
| 1175 | 1135 | break; |
| 1176 | 1136 | } |
| 1177 | | |
| 1178 | 1137 | case 0x09: /* VMACU */ |
| 1179 | 1138 | { |
| 1180 | 1139 | // 31 25 24 20 15 10 5 0 |
| r241981 | r241982 | |
| 1274 | 1233 | SET_ACCUM_M((UINT16)(r3), i); |
| 1275 | 1234 | SET_ACCUM_H(ACCUM_H(i) + (UINT16)(r3 >> 16), i); |
| 1276 | 1235 | if ((INT32)(r1) < 0) |
| 1277 | | SET_ACCUM_H(i, ACCUM_H(i) - 1); |
| 1236 | SET_ACCUM_H(ACCUM_H(i) - 1, i); |
| 1278 | 1237 | |
| 1279 | 1238 | m_vres[i] = SATURATE_ACCUM(i, 1, 0x8000, 0x7fff); |
| 1280 | 1239 | } |
| r241981 | r241982 | |
| 1339 | 1298 | SET_ACCUM_H((UINT16)(accum >> 16), i); |
| 1340 | 1299 | SET_ACCUM_M((UINT16)accum, i); |
| 1341 | 1300 | |
| 1342 | | m_vres[i] = SATURATE_ACCUM1(i, 0x8000, 0x7fff); |
| 1301 | m_vres[i] = SATURATE_ACCUM(i, 1, 0x8000, 0x7fff); |
| 1343 | 1302 | } |
| 1344 | 1303 | WRITEBACK_RESULT(); |
| 1345 | 1304 | |
trunk/src/emu/cpu/rsp/rspdrc.c
| r241981 | r241982 | |
| 118 | 118 | CORE CALLBACKS |
| 119 | 119 | ***************************************************************************/ |
| 120 | 120 | |
| 121 | | void rsp_device::rspdrc_add_imem(UINT32 *base) |
| 122 | | { |
| 123 | | m_imem32 = base; |
| 124 | | m_imem16 = (UINT16*)base; |
| 125 | | m_imem8 = (UINT8*)base; |
| 126 | | } |
| 127 | | |
| 128 | | void rsp_device::rspdrc_add_dmem(UINT32 *base) |
| 129 | | { |
| 130 | | m_dmem32 = base; |
| 131 | | m_dmem16 = (UINT16*)base; |
| 132 | | m_dmem8 = (UINT8*)base; |
| 133 | | } |
| 134 | | |
| 135 | | UINT8 rsp_device::DM_READ8(UINT32 address) |
| 136 | | { |
| 137 | | UINT8 ret = m_dmem8[BYTE4_XOR_BE(address & 0xfff)]; |
| 138 | | //printf("R8:%08x=%02x\n", address, ret); |
| 139 | | return ret; |
| 140 | | } |
| 141 | | |
| 142 | 121 | inline void rsp_device::ccfunc_read8() |
| 143 | 122 | { |
| 144 | 123 | m_rsp_state->arg0 = DM_READ8(m_rsp_state->arg0); |
| r241981 | r241982 | |
| 149 | 128 | ((rsp_device *)param)->ccfunc_read8(); |
| 150 | 129 | } |
| 151 | 130 | |
| 152 | | UINT16 rsp_device::DM_READ16(UINT32 address) |
| 153 | | { |
| 154 | | UINT16 ret; |
| 155 | | address &= 0xfff; |
| 156 | | ret = m_dmem8[BYTE4_XOR_BE(address)] << 8; |
| 157 | | ret |= m_dmem8[BYTE4_XOR_BE(address + 1)]; |
| 158 | | //printf("R16:%08x=%04x\n", address, ret); |
| 159 | | return ret; |
| 160 | | } |
| 161 | | |
| 162 | 131 | inline void rsp_device::ccfunc_read16() |
| 163 | 132 | { |
| 164 | 133 | m_rsp_state->arg0 = DM_READ16(m_rsp_state->arg0); |
| r241981 | r241982 | |
| 169 | 138 | ((rsp_device *)param)->ccfunc_read16(); |
| 170 | 139 | } |
| 171 | 140 | |
| 172 | | UINT32 rsp_device::DM_READ32(UINT32 address) |
| 173 | | { |
| 174 | | UINT32 ret; |
| 175 | | address &= 0xfff; |
| 176 | | ret = m_dmem8[BYTE4_XOR_BE(address)] << 24; |
| 177 | | ret |= m_dmem8[BYTE4_XOR_BE(address + 1)] << 16; |
| 178 | | ret |= m_dmem8[BYTE4_XOR_BE(address + 2)] << 8; |
| 179 | | ret |= m_dmem8[BYTE4_XOR_BE(address + 3)]; |
| 180 | | //printf("R32:%08x=%08x\n", address, ret); |
| 181 | | return ret; |
| 182 | | } |
| 183 | | |
| 184 | 141 | inline void rsp_device::ccfunc_read32() |
| 185 | 142 | { |
| 186 | 143 | m_rsp_state->arg0 = DM_READ32(m_rsp_state->arg0); |
| r241981 | r241982 | |
| 191 | 148 | ((rsp_device *)param)->ccfunc_read32();; |
| 192 | 149 | } |
| 193 | 150 | |
| 194 | | void rsp_device::DM_WRITE8(UINT32 address, UINT8 data) |
| 195 | | { |
| 196 | | address &= 0xfff; |
| 197 | | m_dmem8[BYTE4_XOR_BE(address)] = data; |
| 198 | | //printf("W8:%08x=%02x\n", address, data); |
| 199 | | } |
| 200 | | |
| 201 | 151 | inline void rsp_device::ccfunc_write8() |
| 202 | 152 | { |
| 203 | 153 | DM_WRITE8(m_rsp_state->arg0, m_rsp_state->arg1); |
| r241981 | r241982 | |
| 208 | 158 | ((rsp_device *)param)->ccfunc_write8();; |
| 209 | 159 | } |
| 210 | 160 | |
| 211 | | void rsp_device::DM_WRITE16(UINT32 address, UINT16 data) |
| 212 | | { |
| 213 | | address &= 0xfff; |
| 214 | | m_dmem8[BYTE4_XOR_BE(address)] = data >> 8; |
| 215 | | m_dmem8[BYTE4_XOR_BE(address + 1)] = data & 0xff; |
| 216 | | //printf("W16:%08x=%04x\n", address, data); |
| 217 | | } |
| 218 | | |
| 219 | 161 | inline void rsp_device::ccfunc_write16() |
| 220 | 162 | { |
| 221 | 163 | DM_WRITE16(m_rsp_state->arg0, m_rsp_state->arg1); |
| r241981 | r241982 | |
| 226 | 168 | ((rsp_device *)param)->ccfunc_write16();; |
| 227 | 169 | } |
| 228 | 170 | |
| 229 | | void rsp_device::DM_WRITE32(UINT32 address, UINT32 data) |
| 230 | | { |
| 231 | | address &= 0xfff; |
| 232 | | m_dmem8[BYTE4_XOR_BE(address)] = data >> 24; |
| 233 | | m_dmem8[BYTE4_XOR_BE(address + 1)] = (data >> 16) & 0xff; |
| 234 | | m_dmem8[BYTE4_XOR_BE(address + 2)] = (data >> 8) & 0xff; |
| 235 | | m_dmem8[BYTE4_XOR_BE(address + 3)] = data & 0xff; |
| 236 | | //printf("W32:%08x=%08x\n", address, data); |
| 237 | | } |
| 238 | | |
| 239 | 171 | inline void rsp_device::ccfunc_write32() |
| 240 | 172 | { |
| 241 | 173 | DM_WRITE32(m_rsp_state->arg0, m_rsp_state->arg1); |