Previous 199869 Revisions Next

r21080 Friday 15th February, 2013 at 01:46:36 UTC by Ville Linde
cpu/jaguar: Fixed SUBC opcode. Added special case for internal RAM loads and stores.
[src/emu/cpu/jaguar]jaguar.c

trunk/src/emu/cpu/jaguar/jaguar.c
r21079r21080
102102   legacy_cpu_device *device;
103103   address_space *program;
104104   direct_read_data *direct;
105
106   UINT32      internal_ram_start;
107   UINT32      internal_ram_end;
105108};
106109
107110
r21079r21080
427430   device->save_item(NAME(jaguar->ctrl));
428431   device->save_item(NAME(jaguar->ppc));
429432   device->machine().save().register_postload(save_prepost_delegate(FUNC(jaguar_postload), jaguar));
433
434   if (isdsp)
435   {
436      jaguar->internal_ram_start = 0xf1b000;
437      jaguar->internal_ram_end = 0xf1cfff;
438   }
439   else
440   {
441      jaguar->internal_ram_start = 0xf03000;
442      jaguar->internal_ram_end = 0xf03fff;
443   }
430444}
431445
432446
r21079r21080
805819void loadb_rn_rn(jaguar_cpu_state *jaguar, UINT16 op)
806820{
807821   UINT32 r1 = jaguar->r[(op >> 5) & 31];
808   jaguar->r[op & 31] = READBYTE(jaguar, r1);
822   if (r1 >= jaguar->internal_ram_start && r1 <= jaguar->internal_ram_end)
823   {
824      jaguar->r[op & 31] = READLONG(jaguar, r1 & ~3);
825   }
826   else
827   {
828      jaguar->r[op & 31] = READBYTE(jaguar, r1);
829   }
809830}
810831
811832void loadw_rn_rn(jaguar_cpu_state *jaguar, UINT16 op)
812833{
813834   UINT32 r1 = jaguar->r[(op >> 5) & 31];
814   jaguar->r[op & 31] = READWORD(jaguar, r1);
835   if (r1 >= jaguar->internal_ram_start && r1 <= jaguar->internal_ram_end)
836   {
837      jaguar->r[op & 31] = READLONG(jaguar, r1 & ~3);
838   }
839   else
840   {
841      jaguar->r[op & 31] = READWORD(jaguar, r1);
842   }
815843}
816844
817845void loadp_rn_rn(jaguar_cpu_state *jaguar, UINT16 op)   /* GPU only */
818846{
819847   UINT32 r1 = jaguar->r[(op >> 5) & 31];
820   jaguar->ctrl[G_HIDATA] = READWORD(jaguar, r1);
821   jaguar->r[op & 31] = READWORD(jaguar, r1+4);
848   if (r1 >= jaguar->internal_ram_start && r1 <= jaguar->internal_ram_end)
849   {
850      jaguar->r[op & 31] = READLONG(jaguar, r1 & ~3);
851   }
852   else
853   {
854      jaguar->ctrl[G_HIDATA] = READLONG(jaguar, r1);
855      jaguar->r[op & 31] = READLONG(jaguar, r1+4);
856   }
822857}
823858
824859void mirror_rn(jaguar_cpu_state *jaguar, UINT16 op) /* DSP only */
r21079r21080
11511186void storeb_rn_rn(jaguar_cpu_state *jaguar, UINT16 op)
11521187{
11531188   UINT32 r1 = jaguar->r[(op >> 5) & 31];
1154   WRITEBYTE(jaguar, r1, jaguar->r[op & 31]);
1189   if (r1 >= jaguar->internal_ram_start && r1 <= jaguar->internal_ram_end)
1190   {
1191      WRITELONG(jaguar, r1 & ~3, jaguar->r[op & 31]);
1192   }
1193   else
1194   {
1195      WRITEBYTE(jaguar, r1, jaguar->r[op & 31]);
1196   }
11551197}
11561198
11571199void storew_rn_rn(jaguar_cpu_state *jaguar, UINT16 op)
11581200{
11591201   UINT32 r1 = jaguar->r[(op >> 5) & 31];
1160   WRITEWORD(jaguar, r1, jaguar->r[op & 31]);
1202   if (r1 >= jaguar->internal_ram_start && r1 <= jaguar->internal_ram_end)
1203   {
1204      WRITELONG(jaguar, r1 & ~3, jaguar->r[op & 31]);
1205   }
1206   else
1207   {
1208      WRITEWORD(jaguar, r1, jaguar->r[op & 31]);
1209   }
11611210}
11621211
11631212void storep_rn_rn(jaguar_cpu_state *jaguar, UINT16 op)  /* GPU only */
11641213{
11651214   UINT32 r1 = jaguar->r[(op >> 5) & 31];
1166   WRITELONG(jaguar, r1, jaguar->ctrl[G_HIDATA]);
1167   WRITELONG(jaguar, r1+4, jaguar->r[op & 31]);
1215   if (r1 >= jaguar->internal_ram_start && r1 <= jaguar->internal_ram_end)
1216   {
1217      WRITELONG(jaguar, r1 & ~3, jaguar->r[op & 31]);
1218   }
1219   else
1220   {
1221      WRITELONG(jaguar, r1, jaguar->ctrl[G_HIDATA]);
1222      WRITELONG(jaguar, r1+4, jaguar->r[op & 31]);
1223   }
11681224}
11691225
11701226void sub_rn_rn(jaguar_cpu_state *jaguar, UINT16 op)
r21079r21080
11821238   int dreg = op & 31;
11831239   UINT32 r1 = jaguar->r[(op >> 5) & 31];
11841240   UINT32 r2 = jaguar->r[dreg];
1185   UINT32 res = r2 - r1 - ((jaguar->FLAGS >> 1) & 1);
1241   UINT32 c = ((jaguar->FLAGS >> 1) & 1);
1242   UINT32 res = r2 - r1 - c;
11861243   jaguar->r[dreg] = res;
1187   CLR_ZNC(jaguar); SET_ZNC_SUB(jaguar, r2, r1, res);
1244   CLR_ZNC(jaguar); SET_ZNC_SUB(jaguar, r2, r1 + c, res);
11881245}
11891246
11901247void subq_n_rn(jaguar_cpu_state *jaguar, UINT16 op)

Previous 199869 Revisions Next


© 1997-2024 The MAME Team