src/mame/machine/snes.c
| r7479 | r7480 | |
| 296 | 296 | } |
| 297 | 297 | |
| 298 | 298 | /* FIXME: multiplication should take 8 CPU cycles & division 16 CPU cycles, but |
| 299 | | using these timers breaks e.g. Chrono Trigger intro and Super Tennis gameplay. */ |
| 299 | using these timers breaks e.g. Chrono Trigger intro and Super Tennis gameplay. |
| 300 | On the other hand, timers are needed for the translation of Breath of Fire 2 |
| 301 | to work. More weirdness: we might need to leave 8 CPU cycles for division at |
| 302 | first, since using 16 produces bugs (see e.g. Triforce pieces in Zelda 3 intro) */ |
| 300 | 303 | |
| 301 | 304 | static TIMER_CALLBACK(snes_div_callback) |
| 302 | 305 | { |
| r7479 | r7480 | |
| 949 | 952 | // Anomie says "H Current = (Byte<<8) | (Prev&~7) | ((Current>>8)&7); V Current = (Current<<8) | Prev;" and Prev is shared by all scrolls but in Mode 7! |
| 950 | 953 | case BG1HOFS: /* BG1 - horizontal scroll (DW) */ |
| 951 | 954 | /* In Mode 0->6 we use ppu_last_scroll as Prev */ |
| 952 | | snes_ppu.layer[SNES_BG1].offset.horizontal = (data << 8) | (snes_ppu.ppu_last_scroll & ~7) | ((snes_ppu.layer[SNES_BG1].offset.horizontal >> 8) & 7); |
| 955 | snes_ppu.layer[SNES_BG1].hoffs = (data << 8) | (snes_ppu.ppu_last_scroll & ~7) | ((snes_ppu.layer[SNES_BG1].hoffs >> 8) & 7); |
| 953 | 956 | snes_ppu.ppu_last_scroll = data; |
| 954 | 957 | /* In Mode 7 we use mode7_last_scroll as Prev */ |
| 955 | 958 | snes_ppu.mode7.hor_offset = (data << 8) | (snes_ppu.mode7_last_scroll & ~7) | ((snes_ppu.mode7.hor_offset >> 8) & 7); |
| r7479 | r7480 | |
| 958 | 961 | return; |
| 959 | 962 | case BG1VOFS: /* BG1 - vertical scroll (DW) */ |
| 960 | 963 | /* In Mode 0->6 we use ppu_last_scroll as Prev */ |
| 961 | | snes_ppu.layer[SNES_BG1].offset.vertical = (data << 8) | snes_ppu.ppu_last_scroll; |
| 964 | snes_ppu.layer[SNES_BG1].voffs = (data << 8) | snes_ppu.ppu_last_scroll; |
| 962 | 965 | snes_ppu.ppu_last_scroll = data; |
| 963 | 966 | /* In Mode 7 we use mode7_last_scroll as Prev */ |
| 964 | 967 | snes_ppu.mode7.ver_offset = (data << 8) | snes_ppu.mode7_last_scroll; |
| r7479 | r7480 | |
| 966 | 969 | snes_ppu.update_offsets = 1; |
| 967 | 970 | return; |
| 968 | 971 | case BG2HOFS: /* BG2 - horizontal scroll (DW) */ |
| 969 | | snes_ppu.layer[SNES_BG2].offset.horizontal = (data << 8) | (snes_ppu.ppu_last_scroll & ~7) | ((snes_ppu.layer[SNES_BG2].offset.horizontal >> 8) & 7); |
| 972 | snes_ppu.layer[SNES_BG2].hoffs = (data << 8) | (snes_ppu.ppu_last_scroll & ~7) | ((snes_ppu.layer[SNES_BG2].hoffs >> 8) & 7); |
| 970 | 973 | snes_ppu.ppu_last_scroll = data; |
| 971 | 974 | snes_ppu.update_offsets = 1; |
| 972 | 975 | return; |
| 973 | 976 | case BG2VOFS: /* BG2 - vertical scroll (DW) */ |
| 974 | | snes_ppu.layer[SNES_BG2].offset.vertical = (data << 8) | (snes_ppu.ppu_last_scroll); |
| 977 | snes_ppu.layer[SNES_BG2].voffs = (data << 8) | (snes_ppu.ppu_last_scroll); |
| 975 | 978 | snes_ppu.ppu_last_scroll = data; |
| 976 | 979 | snes_ppu.update_offsets = 1; |
| 977 | 980 | return; |
| 978 | 981 | case BG3HOFS: /* BG3 - horizontal scroll (DW) */ |
| 979 | | snes_ppu.layer[SNES_BG3].offset.horizontal = (data << 8) | (snes_ppu.ppu_last_scroll & ~7) | ((snes_ppu.layer[SNES_BG3].offset.horizontal >> 8) & 7); |
| 982 | snes_ppu.layer[SNES_BG3].hoffs = (data << 8) | (snes_ppu.ppu_last_scroll & ~7) | ((snes_ppu.layer[SNES_BG3].hoffs >> 8) & 7); |
| 980 | 983 | snes_ppu.ppu_last_scroll = data; |
| 981 | 984 | snes_ppu.update_offsets = 1; |
| 982 | 985 | return; |
| 983 | 986 | case BG3VOFS: /* BG3 - vertical scroll (DW) */ |
| 984 | | snes_ppu.layer[SNES_BG3].offset.vertical = (data << 8) | (snes_ppu.ppu_last_scroll); |
| 987 | snes_ppu.layer[SNES_BG3].voffs = (data << 8) | (snes_ppu.ppu_last_scroll); |
| 985 | 988 | snes_ppu.ppu_last_scroll = data; |
| 986 | 989 | snes_ppu.update_offsets = 1; |
| 987 | 990 | return; |
| 988 | 991 | case BG4HOFS: /* BG4 - horizontal scroll (DW) */ |
| 989 | | snes_ppu.layer[SNES_BG4].offset.horizontal = (data << 8) | (snes_ppu.ppu_last_scroll & ~7) | ((snes_ppu.layer[SNES_BG4].offset.horizontal >> 8) & 7); |
| 992 | snes_ppu.layer[SNES_BG4].hoffs = (data << 8) | (snes_ppu.ppu_last_scroll & ~7) | ((snes_ppu.layer[SNES_BG4].hoffs >> 8) & 7); |
| 990 | 993 | snes_ppu.ppu_last_scroll = data; |
| 991 | 994 | snes_ppu.update_offsets = 1; |
| 992 | 995 | return; |
| 993 | 996 | case BG4VOFS: /* BG4 - vertical scroll (DW) */ |
| 994 | | snes_ppu.layer[SNES_BG4].offset.vertical = (data << 8) | (snes_ppu.ppu_last_scroll); |
| 997 | snes_ppu.layer[SNES_BG4].voffs = (data << 8) | (snes_ppu.ppu_last_scroll); |
| 995 | 998 | snes_ppu.ppu_last_scroll = data; |
| 996 | 999 | snes_ppu.update_offsets = 1; |
| 997 | 1000 | return; |
| r7479 | r7480 | |
| 1026 | 1029 | UINT32 rem = addr & vram_fgr_mask; |
| 1027 | 1030 | UINT32 faddr = (addr & ~vram_fgr_mask) + (rem >> vram_fgr_shift) + ((rem & (vram_fgr_count - 1)) << 3); |
| 1028 | 1031 | |
| 1029 | | vram_read_buffer = snes_vram[(faddr<<1)&0x1ffff] | snes_vram[((faddr<<1)+1) & 0x1ffff]<<8; |
| 1032 | vram_read_buffer = snes_vram[(faddr << 1) & 0x1ffff] | snes_vram[((faddr << 1) + 1) & 0x1ffff] << 8; |
| 1030 | 1033 | } |
| 1031 | 1034 | else |
| 1032 | 1035 | { |