trunk/src/emu/cpu/jaguar/jaguar.c
| r21079 | r21080 | |
| 102 | 102 | legacy_cpu_device *device; |
| 103 | 103 | address_space *program; |
| 104 | 104 | direct_read_data *direct; |
| 105 | |
| 106 | UINT32 internal_ram_start; |
| 107 | UINT32 internal_ram_end; |
| 105 | 108 | }; |
| 106 | 109 | |
| 107 | 110 | |
| r21079 | r21080 | |
| 427 | 430 | device->save_item(NAME(jaguar->ctrl)); |
| 428 | 431 | device->save_item(NAME(jaguar->ppc)); |
| 429 | 432 | 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 | } |
| 430 | 444 | } |
| 431 | 445 | |
| 432 | 446 | |
| r21079 | r21080 | |
| 805 | 819 | void loadb_rn_rn(jaguar_cpu_state *jaguar, UINT16 op) |
| 806 | 820 | { |
| 807 | 821 | 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 | } |
| 809 | 830 | } |
| 810 | 831 | |
| 811 | 832 | void loadw_rn_rn(jaguar_cpu_state *jaguar, UINT16 op) |
| 812 | 833 | { |
| 813 | 834 | 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 | } |
| 815 | 843 | } |
| 816 | 844 | |
| 817 | 845 | void loadp_rn_rn(jaguar_cpu_state *jaguar, UINT16 op) /* GPU only */ |
| 818 | 846 | { |
| 819 | 847 | 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 | } |
| 822 | 857 | } |
| 823 | 858 | |
| 824 | 859 | void mirror_rn(jaguar_cpu_state *jaguar, UINT16 op) /* DSP only */ |
| r21079 | r21080 | |
| 1151 | 1186 | void storeb_rn_rn(jaguar_cpu_state *jaguar, UINT16 op) |
| 1152 | 1187 | { |
| 1153 | 1188 | 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 | } |
| 1155 | 1197 | } |
| 1156 | 1198 | |
| 1157 | 1199 | void storew_rn_rn(jaguar_cpu_state *jaguar, UINT16 op) |
| 1158 | 1200 | { |
| 1159 | 1201 | 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 | } |
| 1161 | 1210 | } |
| 1162 | 1211 | |
| 1163 | 1212 | void storep_rn_rn(jaguar_cpu_state *jaguar, UINT16 op) /* GPU only */ |
| 1164 | 1213 | { |
| 1165 | 1214 | 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 | } |
| 1168 | 1224 | } |
| 1169 | 1225 | |
| 1170 | 1226 | void sub_rn_rn(jaguar_cpu_state *jaguar, UINT16 op) |
| r21079 | r21080 | |
| 1182 | 1238 | int dreg = op & 31; |
| 1183 | 1239 | UINT32 r1 = jaguar->r[(op >> 5) & 31]; |
| 1184 | 1240 | 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; |
| 1186 | 1243 | 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); |
| 1188 | 1245 | } |
| 1189 | 1246 | |
| 1190 | 1247 | void subq_n_rn(jaguar_cpu_state *jaguar, UINT16 op) |