Previous 199869 Revisions Next

r33470 Thursday 20th November, 2014 at 20:34:10 UTC by Ryan Holtz
Fix RSP interpreter, nw
[src/emu/cpu/rsp]rsp.c rsp.h rspcp2.c rspdrc.c
[src/mame/machine]n64.c

trunk/src/emu/cpu/rsp/rsp.c
r241981r241982
146146   return CPU_DISASSEMBLE_NAME( rsp )(this, buffer, pc, oprom, opram, options);
147147}
148148
149void rsp_device::rsp_add_imem(UINT32 *base)
150{
151   m_imem32 = base;
152   m_imem16 = (UINT16*)base;
153   m_imem8 = (UINT8*)base;
154}
155
156void rsp_device::rsp_add_dmem(UINT32 *base)
157{
158   m_dmem32 = base;
159   m_dmem16 = (UINT16*)base;
160   m_dmem8 = (UINT8*)base;
161}
162
163UINT8 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
170UINT16 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
180UINT32 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
192void 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
199void 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
207void 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
149217UINT8 rsp_device::READ8(UINT32 address)
150218{
151219   UINT8 ret;
trunk/src/emu/cpu/rsp/rsp.h
r241981r241982
150150
151151   void rspdrc_flush_drc_cache();
152152   void rspdrc_set_options(UINT32 options);
153   void rspdrc_add_dmem(UINT32 *base);
154   void rspdrc_add_imem(UINT32 *base);
153   void rsp_add_dmem(UINT32 *base);
154   void rsp_add_imem(UINT32 *base);
155155
156156   void ccfunc_read8();
157157   void ccfunc_read16();
trunk/src/emu/cpu/rsp/rspcp2.c
r241981r241982
844844    Vector Accumulator Helpers
845845***************************************************************************/
846846
847inline UINT16 rsp_cop2::SATURATE_ACCUM1(int accum, UINT16 negative, UINT16 positive)
848{
849if ((INT16)ACCUM_H(accum) < 0)
850{
851if ((UINT16)(ACCUM_H(accum)) != 0xffff)
852{
853return negative;
854}
855else
856{
857if ((INT16)ACCUM_M(accum) >= 0)
858{
859return negative;
860}
861else
862{
863return ACCUM_M(accum);
864}
865}
866}
867else
868{
869if ((UINT16)(ACCUM_H(accum)) != 0)
870{
871return positive;
872}
873else
874{
875if ((INT16)ACCUM_M(accum) < 0)
876{
877return positive;
878}
879else
880{
881return ACCUM_M(accum);
882}
883}
884}
885}
886
887847UINT16 rsp_cop2::SATURATE_ACCUM(int accum, int slice, UINT16 negative, UINT16 positive)
888848{
889849   if ((INT16)ACCUM_H(accum) < 0)
r241981r241982
11741134         WRITEBACK_RESULT();
11751135         break;
11761136      }
1177
11781137      case 0x09:      /* VMACU */
11791138      {
11801139         // 31       25  24     20      15      10      5        0
r241981r241982
12741233            SET_ACCUM_M((UINT16)(r3), i);
12751234            SET_ACCUM_H(ACCUM_H(i) + (UINT16)(r3 >> 16), i);
12761235            if ((INT32)(r1) < 0)
1277               SET_ACCUM_H(i, ACCUM_H(i) - 1);
1236               SET_ACCUM_H(ACCUM_H(i) - 1, i);
12781237
12791238            m_vres[i] = SATURATE_ACCUM(i, 1, 0x8000, 0x7fff);
12801239         }
r241981r241982
13391298            SET_ACCUM_H((UINT16)(accum >> 16), i);
13401299            SET_ACCUM_M((UINT16)accum, i);
13411300
1342            m_vres[i] = SATURATE_ACCUM1(i, 0x8000, 0x7fff);
1301            m_vres[i] = SATURATE_ACCUM(i, 1, 0x8000, 0x7fff);
13431302         }
13441303         WRITEBACK_RESULT();
13451304
trunk/src/emu/cpu/rsp/rspdrc.c
r241981r241982
118118    CORE CALLBACKS
119119***************************************************************************/
120120
121void rsp_device::rspdrc_add_imem(UINT32 *base)
122{
123   m_imem32 = base;
124   m_imem16 = (UINT16*)base;
125   m_imem8 = (UINT8*)base;
126}
127
128void rsp_device::rspdrc_add_dmem(UINT32 *base)
129{
130   m_dmem32 = base;
131   m_dmem16 = (UINT16*)base;
132   m_dmem8 = (UINT8*)base;
133}
134
135UINT8 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
142121inline void rsp_device::ccfunc_read8()
143122{
144123   m_rsp_state->arg0 = DM_READ8(m_rsp_state->arg0);
r241981r241982
149128   ((rsp_device *)param)->ccfunc_read8();
150129}
151130
152UINT16 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
162131inline void rsp_device::ccfunc_read16()
163132{
164133   m_rsp_state->arg0 = DM_READ16(m_rsp_state->arg0);
r241981r241982
169138   ((rsp_device *)param)->ccfunc_read16();
170139}
171140
172UINT32 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
184141inline void rsp_device::ccfunc_read32()
185142{
186143   m_rsp_state->arg0 = DM_READ32(m_rsp_state->arg0);
r241981r241982
191148   ((rsp_device *)param)->ccfunc_read32();;
192149}
193150
194void 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
201151inline void rsp_device::ccfunc_write8()
202152{
203153   DM_WRITE8(m_rsp_state->arg0, m_rsp_state->arg1);
r241981r241982
208158   ((rsp_device *)param)->ccfunc_write8();;
209159}
210160
211void 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
219161inline void rsp_device::ccfunc_write16()
220162{
221163   DM_WRITE16(m_rsp_state->arg0, m_rsp_state->arg1);
r241981r241982
226168   ((rsp_device *)param)->ccfunc_write16();;
227169}
228170
229void 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
239171inline void rsp_device::ccfunc_write32()
240172{
241173   DM_WRITE32(m_rsp_state->arg0, m_rsp_state->arg1);
trunk/src/mame/machine/n64.c
r241981r241982
23232323   rsp_device *rsp = machine().device<rsp_device>("rsp");
23242324   rsp->rspdrc_set_options(RSPDRC_STRICT_VERIFY);
23252325   rsp->rspdrc_flush_drc_cache();
2326   rsp->rspdrc_add_dmem(rsp_dmem);
2327   rsp->rspdrc_add_imem(rsp_imem);
2326   rsp->rsp_add_dmem(rsp_dmem);
2327   rsp->rsp_add_imem(rsp_imem);
23282328
23292329   /* add a hook for battery save */
23302330   machine().add_notifier(MACHINE_NOTIFY_EXIT, machine_notify_delegate(FUNC(n64_state::n64_machine_stop),this));


Previous 199869 Revisions Next


© 1997-2024 The MAME Team