src/mame/machine/snes.c
| r7480 | r7481 | |
| 655 | 655 | } |
| 656 | 656 | value = ((joy2l | (joy2h << 8) | 0x10000) >> (16 - (joypad[1].oldrol & 0xf))) & 0x1; |
| 657 | 657 | joypad[1].oldrol++; |
| 658 | | joypad[1].oldrol&=0xf; |
| 658 | joypad[1].oldrol &= 0xf; |
| 659 | 659 | if (!(joypad[1].oldrol % 17)) |
| 660 | 660 | value = 0x1; |
| 661 | 661 | //value |= 0x1c; // bits 4, 3, and 2 are always set |
| 662 | | return value | 0x1c | (snes_open_bus_r(space,0) & 0xe0); //correct? |
| 662 | return value | 0x1c | (snes_open_bus_r(space, 0) & 0xe0); //correct? |
| 663 | 663 | } |
| 664 | 664 | case HTIMEL: |
| 665 | 665 | case HTIMEH: |
| r7480 | r7481 | |
| 918 | 918 | case BGMODE: /* BG mode and character size settings */ |
| 919 | 919 | snes_ppu.mode = data & 0x07; |
| 920 | 920 | snes_dynamic_res_change(space->machine); |
| 921 | | snes_ppu.bg3_priority_bit = data & 0x08; |
| 922 | | snes_ppu.layer[SNES_BG1].tile_size = (data >> 4) & 0x1; |
| 923 | | snes_ppu.layer[SNES_BG2].tile_size = (data >> 5) & 0x1; |
| 924 | | snes_ppu.layer[SNES_BG3].tile_size = (data >> 6) & 0x1; |
| 925 | | snes_ppu.layer[SNES_BG4].tile_size = (data >> 7) & 0x1; |
| 921 | snes_ppu.bg3_priority_bit = BIT(data, 3); |
| 922 | snes_ppu.layer[SNES_BG1].tile_size = BIT(data, 4); |
| 923 | snes_ppu.layer[SNES_BG2].tile_size = BIT(data, 5); |
| 924 | snes_ppu.layer[SNES_BG3].tile_size = BIT(data, 6); |
| 925 | snes_ppu.layer[SNES_BG4].tile_size = BIT(data, 7); |
| 926 | 926 | snes_ppu.update_offsets = 1; |
| 927 | 927 | break; |
| 928 | 928 | case MOSAIC: /* Size and screen designation for mosaic */ |
| 929 | 929 | /* FIXME: We support horizontal mosaic only partially */ |
| 930 | 930 | snes_ppu.mosaic_size = (data & 0xf0) >> 4; |
| 931 | | snes_ppu.layer[SNES_BG1].mosaic_enabled = data & 0x01; |
| 932 | | snes_ppu.layer[SNES_BG2].mosaic_enabled = data & 0x02; |
| 933 | | snes_ppu.layer[SNES_BG3].mosaic_enabled = data & 0x04; |
| 934 | | snes_ppu.layer[SNES_BG4].mosaic_enabled = data & 0x08; |
| 931 | snes_ppu.layer[SNES_BG1].mosaic_enabled = BIT(data, 0); |
| 932 | snes_ppu.layer[SNES_BG2].mosaic_enabled = BIT(data, 1); |
| 933 | snes_ppu.layer[SNES_BG3].mosaic_enabled = BIT(data, 2); |
| 934 | snes_ppu.layer[SNES_BG4].mosaic_enabled = BIT(data, 3); |
| 935 | 935 | break; |
| 936 | 936 | case BG1SC: /* Address for storing SC data BG1 SC size designation */ |
| 937 | 937 | case BG2SC: /* Address for storing SC data BG2 SC size designation */ |
| r7480 | r7481 | |
| 1033 | 1033 | } |
| 1034 | 1034 | else |
| 1035 | 1035 | { |
| 1036 | | vram_read_buffer = snes_vram[(addr<<1)&0x1ffff] | snes_vram[((addr<<1)+1) & 0x1ffff]<<8; |
| 1036 | vram_read_buffer = snes_vram[(addr << 1) & 0x1ffff] | snes_vram[((addr << 1) + 1) & 0x1ffff] << 8; |
| 1037 | 1037 | } |
| 1038 | 1038 | |
| 1039 | 1039 | } |
| r7480 | r7481 | |
| 1047 | 1047 | UINT32 rem = addr & vram_fgr_mask; |
| 1048 | 1048 | UINT32 faddr = (addr & ~vram_fgr_mask) + (rem >> vram_fgr_shift) + ((rem & (vram_fgr_count - 1)) << 3); |
| 1049 | 1049 | |
| 1050 | | snes_vram[(faddr<<1)&0x1ffff] = data; |
| 1050 | snes_vram[(faddr << 1) & 0x1ffff] = data; |
| 1051 | 1051 | } |
| 1052 | 1052 | else |
| 1053 | 1053 | { |
| 1054 | | snes_vram[(addr<<1)&0x1ffff] = data; |
| 1054 | snes_vram[(addr << 1) & 0x1ffff] = data; |
| 1055 | 1055 | } |
| 1056 | 1056 | |
| 1057 | 1057 | if (!vram_fgr_high) |
| 1058 | 1058 | { |
| 1059 | 1059 | addr += vram_fgr_increment; |
| 1060 | | snes_ram[VMADDL] = addr&0xff; |
| 1061 | | snes_ram[VMADDH] = (addr>>8)&0xff; |
| 1060 | snes_ram[VMADDL] = addr & 0xff; |
| 1061 | snes_ram[VMADDH] = (addr >> 8) & 0xff; |
| 1062 | 1062 | } |
| 1063 | 1063 | } |
| 1064 | 1064 | return; |
| r7480 | r7481 | |
| 1071 | 1071 | UINT32 rem = addr & vram_fgr_mask; |
| 1072 | 1072 | UINT32 faddr = (addr & ~vram_fgr_mask) + (rem >> vram_fgr_shift) + ((rem & (vram_fgr_count - 1)) << 3); |
| 1073 | 1073 | |
| 1074 | | snes_vram[((faddr<<1)+1)&0x1ffff] = data; |
| 1074 | snes_vram[((faddr << 1) + 1) & 0x1ffff] = data; |
| 1075 | 1075 | } |
| 1076 | 1076 | else |
| 1077 | 1077 | { |
| 1078 | | snes_vram[((addr<<1)+1)&0x1ffff] = data; |
| 1078 | snes_vram[((addr << 1) + 1) & 0x1ffff] = data; |
| 1079 | 1079 | } |
| 1080 | 1080 | |
| 1081 | 1081 | if (vram_fgr_high) |
| 1082 | 1082 | { |
| 1083 | 1083 | addr += vram_fgr_increment; |
| 1084 | | snes_ram[VMADDL] = addr&0xff; |
| 1085 | | snes_ram[VMADDH] = (addr>>8)&0xff; |
| 1084 | snes_ram[VMADDL] = addr & 0xff; |
| 1085 | snes_ram[VMADDH] = (addr >> 8) & 0xff; |
| 1086 | 1086 | } |
| 1087 | 1087 | } |
| 1088 | 1088 | return; |
| 1089 | 1089 | case M7SEL: /* Mode 7 initial settings */ |
| 1090 | 1090 | snes_ppu.mode7.repeat = (data >> 6) & 3; |
| 1091 | | snes_ppu.mode7.vflip = data & 0x02; |
| 1092 | | snes_ppu.mode7.hflip = data & 0x01; |
| 1091 | snes_ppu.mode7.vflip = BIT(data, 1); |
| 1092 | snes_ppu.mode7.hflip = BIT(data, 0); |
| 1093 | 1093 | break; |
| 1094 | 1094 | /* As per Anomie's doc: Reg = (Current<<8) | Prev; and there is only one Prev, shared by these matrix regs and Mode 7 scroll regs */ |
| 1095 | 1095 | case M7A: /* Mode 7 COS angle/x expansion (DW) */ |
| r7480 | r7481 | |
| 1128 | 1128 | case W12SEL: /* Window mask settings for BG1-2 */ |
| 1129 | 1129 | if (data != snes_ram[offset]) |
| 1130 | 1130 | { |
| 1131 | | snes_ppu.layer[SNES_BG1].window1_invert = data & 0x01; |
| 1132 | | snes_ppu.layer[SNES_BG1].window1_enabled = data & 0x02; |
| 1133 | | snes_ppu.layer[SNES_BG1].window2_invert = data & 0x04; |
| 1134 | | snes_ppu.layer[SNES_BG1].window2_enabled = data & 0x08; |
| 1135 | | snes_ppu.layer[SNES_BG2].window1_invert = data & 0x10; |
| 1136 | | snes_ppu.layer[SNES_BG2].window1_enabled = data & 0x20; |
| 1137 | | snes_ppu.layer[SNES_BG2].window2_invert = data & 0x40; |
| 1138 | | snes_ppu.layer[SNES_BG2].window2_enabled = data & 0x80; |
| 1131 | snes_ppu.layer[SNES_BG1].window1_invert = BIT(data, 0); |
| 1132 | snes_ppu.layer[SNES_BG1].window1_enabled = BIT(data, 1); |
| 1133 | snes_ppu.layer[SNES_BG1].window2_invert = BIT(data, 2); |
| 1134 | snes_ppu.layer[SNES_BG1].window2_enabled = BIT(data, 3); |
| 1135 | snes_ppu.layer[SNES_BG2].window1_invert = BIT(data, 4); |
| 1136 | snes_ppu.layer[SNES_BG2].window1_enabled = BIT(data, 5); |
| 1137 | snes_ppu.layer[SNES_BG2].window2_invert = BIT(data, 6); |
| 1138 | snes_ppu.layer[SNES_BG2].window2_enabled = BIT(data, 7); |
| 1139 | 1139 | snes_ppu.update_windows = 1; |
| 1140 | 1140 | } |
| 1141 | 1141 | break; |
| 1142 | 1142 | case W34SEL: /* Window mask settings for BG3-4 */ |
| 1143 | 1143 | if (data != snes_ram[offset]) |
| 1144 | 1144 | { |
| 1145 | | snes_ppu.layer[SNES_BG3].window1_invert = data & 0x01; |
| 1146 | | snes_ppu.layer[SNES_BG3].window1_enabled = data & 0x02; |
| 1147 | | snes_ppu.layer[SNES_BG3].window2_invert = data & 0x04; |
| 1148 | | snes_ppu.layer[SNES_BG3].window2_enabled = data & 0x08; |
| 1149 | | snes_ppu.layer[SNES_BG4].window1_invert = data & 0x10; |
| 1150 | | snes_ppu.layer[SNES_BG4].window1_enabled = data & 0x20; |
| 1151 | | snes_ppu.layer[SNES_BG4].window2_invert = data & 0x40; |
| 1152 | | snes_ppu.layer[SNES_BG4].window2_enabled = data & 0x80; |
| 1145 | snes_ppu.layer[SNES_BG3].window1_invert = BIT(data, 0); |
| 1146 | snes_ppu.layer[SNES_BG3].window1_enabled = BIT(data, 1); |
| 1147 | snes_ppu.layer[SNES_BG3].window2_invert = BIT(data, 2); |
| 1148 | snes_ppu.layer[SNES_BG3].window2_enabled = BIT(data, 3); |
| 1149 | snes_ppu.layer[SNES_BG4].window1_invert = BIT(data, 4); |
| 1150 | snes_ppu.layer[SNES_BG4].window1_enabled = BIT(data, 5); |
| 1151 | snes_ppu.layer[SNES_BG4].window2_invert = BIT(data, 6); |
| 1152 | snes_ppu.layer[SNES_BG4].window2_enabled = BIT(data, 7); |
| 1153 | 1153 | snes_ppu.update_windows = 1; |
| 1154 | 1154 | } |
| 1155 | 1155 | break; |
| 1156 | 1156 | case WOBJSEL: /* Window mask settings for objects */ |
| 1157 | 1157 | if (data != snes_ram[offset]) |
| 1158 | 1158 | { |
| 1159 | | snes_ppu.layer[SNES_OAM].window1_invert = data & 0x01; |
| 1160 | | snes_ppu.layer[SNES_OAM].window1_enabled = data & 0x02; |
| 1161 | | snes_ppu.layer[SNES_OAM].window2_invert = data & 0x04; |
| 1162 | | snes_ppu.layer[SNES_OAM].window2_enabled = data & 0x08; |
| 1163 | | snes_ppu.layer[SNES_COLOR].window1_invert = data & 0x10; |
| 1164 | | snes_ppu.layer[SNES_COLOR].window1_enabled = data & 0x20; |
| 1165 | | snes_ppu.layer[SNES_COLOR].window2_invert = data & 0x40; |
| 1166 | | snes_ppu.layer[SNES_COLOR].window2_enabled = data & 0x80; |
| 1159 | snes_ppu.layer[SNES_OAM].window1_invert = BIT(data, 0); |
| 1160 | snes_ppu.layer[SNES_OAM].window1_enabled = BIT(data, 1); |
| 1161 | snes_ppu.layer[SNES_OAM].window2_invert = BIT(data, 2); |
| 1162 | snes_ppu.layer[SNES_OAM].window2_enabled = BIT(data, 3); |
| 1163 | snes_ppu.layer[SNES_COLOR].window1_invert = BIT(data, 4); |
| 1164 | snes_ppu.layer[SNES_COLOR].window1_enabled = BIT(data, 5); |
| 1165 | snes_ppu.layer[SNES_COLOR].window2_invert = BIT(data, 6); |
| 1166 | snes_ppu.layer[SNES_COLOR].window2_enabled = BIT(data, 7); |
| 1167 | 1167 | snes_ppu.update_windows = 1; |
| 1168 | 1168 | } |
| 1169 | 1169 | break; |
| r7480 | r7481 | |
| 1214 | 1214 | } |
| 1215 | 1215 | break; |
| 1216 | 1216 | case TM: /* Main screen designation */ |
| 1217 | | snes_ppu.main_bg_enabled[0] = data & 0x01; |
| 1218 | | snes_ppu.main_bg_enabled[1] = data & 0x02; |
| 1219 | | snes_ppu.main_bg_enabled[2] = data & 0x04; |
| 1220 | | snes_ppu.main_bg_enabled[3] = data & 0x08; |
| 1221 | | snes_ppu.main_bg_enabled[4] = data & 0x10; |
| 1217 | snes_ppu.main_bg_enabled[0] = BIT(data, 0); |
| 1218 | snes_ppu.main_bg_enabled[1] = BIT(data, 1); |
| 1219 | snes_ppu.main_bg_enabled[2] = BIT(data, 2); |
| 1220 | snes_ppu.main_bg_enabled[3] = BIT(data, 3); |
| 1221 | snes_ppu.main_bg_enabled[4] = BIT(data, 4); |
| 1222 | 1222 | break; |
| 1223 | 1223 | case TS: /* Subscreen designation */ |
| 1224 | | snes_ppu.sub_bg_enabled[0] = data & 0x01; |
| 1225 | | snes_ppu.sub_bg_enabled[1] = data & 0x02; |
| 1226 | | snes_ppu.sub_bg_enabled[2] = data & 0x04; |
| 1227 | | snes_ppu.sub_bg_enabled[3] = data & 0x08; |
| 1228 | | snes_ppu.sub_bg_enabled[4] = data & 0x10; |
| 1224 | snes_ppu.sub_bg_enabled[0] = BIT(data, 0); |
| 1225 | snes_ppu.sub_bg_enabled[1] = BIT(data, 1); |
| 1226 | snes_ppu.sub_bg_enabled[2] = BIT(data, 2); |
| 1227 | snes_ppu.sub_bg_enabled[3] = BIT(data, 3); |
| 1228 | snes_ppu.sub_bg_enabled[4] = BIT(data, 4); |
| 1229 | 1229 | break; |
| 1230 | 1230 | case TMW: /* Window mask for main screen designation */ |
| 1231 | | snes_ppu.layer[SNES_BG1].main_window_enabled = data & 0x01; |
| 1232 | | snes_ppu.layer[SNES_BG2].main_window_enabled = data & 0x02; |
| 1233 | | snes_ppu.layer[SNES_BG3].main_window_enabled = data & 0x04; |
| 1234 | | snes_ppu.layer[SNES_BG4].main_window_enabled = data & 0x08; |
| 1235 | | snes_ppu.layer[SNES_OAM].main_window_enabled = data & 0x10; |
| 1231 | snes_ppu.layer[SNES_BG1].main_window_enabled = BIT(data, 0); |
| 1232 | snes_ppu.layer[SNES_BG2].main_window_enabled = BIT(data, 1); |
| 1233 | snes_ppu.layer[SNES_BG3].main_window_enabled = BIT(data, 2); |
| 1234 | snes_ppu.layer[SNES_BG4].main_window_enabled = BIT(data, 3); |
| 1235 | snes_ppu.layer[SNES_OAM].main_window_enabled = BIT(data, 4); |
| 1236 | 1236 | break; |
| 1237 | 1237 | case TSW: /* Window mask for subscreen designation */ |
| 1238 | | snes_ppu.layer[SNES_BG1].sub_window_enabled = data & 0x01; |
| 1239 | | snes_ppu.layer[SNES_BG2].sub_window_enabled = data & 0x02; |
| 1240 | | snes_ppu.layer[SNES_BG3].sub_window_enabled = data & 0x04; |
| 1241 | | snes_ppu.layer[SNES_BG4].sub_window_enabled = data & 0x08; |
| 1242 | | snes_ppu.layer[SNES_OAM].sub_window_enabled = data & 0x10; |
| 1238 | snes_ppu.layer[SNES_BG1].sub_window_enabled = BIT(data, 0); |
| 1239 | snes_ppu.layer[SNES_BG2].sub_window_enabled = BIT(data, 1); |
| 1240 | snes_ppu.layer[SNES_BG3].sub_window_enabled = BIT(data, 2); |
| 1241 | snes_ppu.layer[SNES_BG4].sub_window_enabled = BIT(data, 3); |
| 1242 | snes_ppu.layer[SNES_OAM].sub_window_enabled = BIT(data, 4); |
| 1243 | 1243 | break; |
| 1244 | 1244 | case CGWSEL: /* Initial settings for Fixed colour addition or screen addition */ |
| 1245 | 1245 | /* FIXME: We don't support direct select for modes 3 & 4 or subscreen window stuff */ |
| 1246 | 1246 | snes_ppu.main_color_mask = (data >> 6) & 0x03; |
| 1247 | 1247 | snes_ppu.sub_color_mask = (data >> 4) & 0x03; |
| 1248 | | snes_ppu.sub_add_mode = data & 0x02; |
| 1249 | | snes_ppu.direct_color = data & 0x01; |
| 1248 | snes_ppu.sub_add_mode = BIT(data, 1); |
| 1249 | snes_ppu.direct_color = BIT(data, 0); |
| 1250 | 1250 | #ifdef SNES_DBG_REG_W |
| 1251 | 1251 | if ((data & 0x2) != (snes_ram[CGWSEL] & 0x2)) |
| 1252 | 1252 | mame_printf_debug( "Add/Sub Layer: %s\n", ((data & 0x2) >> 1) ? "Subscreen" : "Fixed colour" ); |
| r7480 | r7481 | |
| 1254 | 1254 | break; |
| 1255 | 1255 | case CGADSUB: /* Addition/Subtraction designation for each screen */ |
| 1256 | 1256 | snes_ppu.color_modes = data & 0xc0; |
| 1257 | | snes_ppu.layer[SNES_BG1].color_math = data & 0x01; |
| 1258 | | snes_ppu.layer[SNES_BG2].color_math = data & 0x02; |
| 1259 | | snes_ppu.layer[SNES_BG3].color_math = data & 0x04; |
| 1260 | | snes_ppu.layer[SNES_BG4].color_math = data & 0x08; |
| 1261 | | snes_ppu.layer[SNES_OAM].color_math = data & 0x10; |
| 1262 | | snes_ppu.layer[SNES_COLOR].color_math = data & 0x20; |
| 1257 | snes_ppu.layer[SNES_BG1].color_math = BIT(data, 0); |
| 1258 | snes_ppu.layer[SNES_BG2].color_math = BIT(data, 1); |
| 1259 | snes_ppu.layer[SNES_BG3].color_math = BIT(data, 2); |
| 1260 | snes_ppu.layer[SNES_BG4].color_math = BIT(data, 3); |
| 1261 | snes_ppu.layer[SNES_OAM].color_math = BIT(data, 4); |
| 1262 | snes_ppu.layer[SNES_COLOR].color_math = BIT(data, 5); |
| 1263 | 1263 | break; |
| 1264 | 1264 | case COLDATA: /* Fixed colour data for fixed colour addition/subtraction */ |
| 1265 | 1265 | { |
| r7480 | r7481 | |
| 1284 | 1284 | snes_ppu.interlace = (data & 0x01) ? 2 : 1; |
| 1285 | 1285 | snes_ppu.obj_interlace = (data & 0x02) ? 2 : 1; |
| 1286 | 1286 | snes_ppu.beam.last_visible_line = (data & 0x04) ? 240 : 225; |
| 1287 | | snes_ppu.pseudo_hires = data & 0x08; |
| 1288 | | snes_ppu.mode7.extbg = data & 0x40; |
| 1287 | snes_ppu.pseudo_hires = BIT(data, 3); |
| 1288 | snes_ppu.mode7.extbg = BIT(data, 6); |
| 1289 | 1289 | snes_dynamic_res_change(space->machine); |
| 1290 | 1290 | #ifdef SNES_DBG_REG_W |
| 1291 | 1291 | if ((data & 0x8) != (snes_ram[SETINI] & 0x8)) |