trunk/src/mame/machine/n64.c
| r25485 | r25486 | |
| 45 | 45 | switch(cic_type) |
| 46 | 46 | { |
| 47 | 47 | case 1: |
| 48 | | pif_ram[0x09] = 0x00063f3f; |
| 48 | pif_ram[0x24] = 0x00; |
| 49 | pif_ram[0x25] = 0x06; |
| 50 | pif_ram[0x26] = 0x3f; |
| 51 | pif_ram[0x27] = 0x3f; |
| 49 | 52 | break; |
| 50 | 53 | case 3: |
| 51 | | pif_ram[0x09] = 0x0002783f; |
| 54 | pif_ram[0x24] = 0x00; |
| 55 | pif_ram[0x25] = 0x02; |
| 56 | pif_ram[0x26] = 0x78; |
| 57 | pif_ram[0x27] = 0x3f; |
| 52 | 58 | break; |
| 53 | 59 | case 5: |
| 54 | | pif_ram[0x09] = 0x0002913f; |
| 60 | pif_ram[0x24] = 0x00; |
| 61 | pif_ram[0x25] = 0x02; |
| 62 | pif_ram[0x26] = 0x91; |
| 63 | pif_ram[0x27] = 0x3f; |
| 55 | 64 | break; |
| 56 | 65 | case 6: |
| 57 | | pif_ram[0x09] = 0x0002853f; |
| 66 | pif_ram[0x24] = 0x00; |
| 67 | pif_ram[0x25] = 0x02; |
| 68 | pif_ram[0x26] = 0x85; |
| 69 | pif_ram[0x27] = 0x3f; |
| 58 | 70 | break; |
| 59 | 71 | case 0xd: |
| 60 | | pif_ram[0x09] = 0x000add3f; |
| 72 | pif_ram[0x24] = 0x00; |
| 73 | pif_ram[0x25] = 0x0a; |
| 74 | pif_ram[0x26] = 0xdd; |
| 75 | pif_ram[0x27] = 0x3f; |
| 61 | 76 | break; |
| 62 | 77 | default: |
| 63 | | pif_ram[0x09] = 0x00023f3f; |
| 78 | pif_ram[0x24] = 0x00; |
| 79 | pif_ram[0x25] = 0x02; |
| 80 | pif_ram[0x26] = 0x3f; |
| 81 | pif_ram[0x27] = 0x3f; |
| 64 | 82 | break; |
| 65 | 83 | } |
| 66 | 84 | } |
| r25485 | r25486 | |
| 195 | 213 | } |
| 196 | 214 | |
| 197 | 215 | // CIC-NUS-6102 (default) |
| 198 | | pif_ram[0x09] = 0x00003f3f; |
| 216 | pif_ram[0x24] = 0x00; |
| 217 | pif_ram[0x25] = 0x00; |
| 218 | pif_ram[0x26] = 0x3f; |
| 219 | pif_ram[0x27] = 0x3f; |
| 199 | 220 | dd_present = false; |
| 200 | 221 | cic_type=2; |
| 201 | 222 | mem_map->write_dword(0x00000318, 0x800000); |
| 202 | 223 | |
| 203 | 224 | if (boot_checksum == U64(0x00000000001ff230)) |
| 204 | 225 | { |
| 205 | | pif_ram[0x09] = 0x3fdd0800; |
| 226 | pif_ram[0x24] = 0x00; |
| 227 | pif_ram[0x25] = 0x08; |
| 228 | pif_ram[0x26] = 0xdd; |
| 229 | pif_ram[0x27] = 0x3f; |
| 206 | 230 | dd_present = true; |
| 207 | 231 | cic_type=0xd; |
| 208 | 232 | } |
| 209 | 233 | else if (boot_checksum == U64(0x000000cffb830843) || boot_checksum == U64(0x000000d0027fdf31)) |
| 210 | 234 | { |
| 211 | 235 | // CIC-NUS-6101 |
| 212 | | pif_ram[0x09] = 0x00043f3f; |
| 236 | pif_ram[0x24] = 0x00; |
| 237 | pif_ram[0x25] = 0x04; |
| 238 | pif_ram[0x26] = 0x3f; |
| 239 | pif_ram[0x27] = 0x3f; |
| 213 | 240 | cic_type=1; |
| 214 | 241 | } |
| 215 | 242 | else if (boot_checksum == U64(0x000000d6499e376b)) |
| 216 | 243 | { |
| 217 | 244 | // CIC-NUS-6103 |
| 218 | | pif_ram[0x09] = 0x0000783f; |
| 245 | pif_ram[0x24] = 0x00; |
| 246 | pif_ram[0x25] = 0x00; |
| 247 | pif_ram[0x26] = 0x78; |
| 248 | pif_ram[0x27] = 0x3f; |
| 219 | 249 | cic_type=3; |
| 220 | 250 | } |
| 221 | 251 | else if (boot_checksum == U64(0x0000011a4a1604b6)) |
| 222 | 252 | { |
| 223 | 253 | // CIC-NUS-6105 |
| 224 | | pif_ram[0x09] = 0x0000913f; |
| 254 | pif_ram[0x24] = 0x00; |
| 255 | pif_ram[0x25] = 0x00; |
| 256 | pif_ram[0x26] = 0x91; |
| 257 | pif_ram[0x27] = 0x3f; |
| 225 | 258 | cic_type=5; |
| 226 | 259 | mem_map->write_dword(0x000003f0, 0x800000); |
| 227 | 260 | } |
| 228 | 261 | else if (boot_checksum == U64(0x000000d6d5de4ba0)) |
| 229 | 262 | { |
| 230 | 263 | // CIC-NUS-6106 |
| 231 | | pif_ram[0x09] = 0x0000853f; |
| 264 | pif_ram[0x24] = 0x00; |
| 265 | pif_ram[0x25] = 0x00; |
| 266 | pif_ram[0x26] = 0x85; |
| 267 | pif_ram[0x27] = 0x3f; |
| 232 | 268 | cic_type=6; |
| 233 | 269 | } |
| 234 | 270 | else |
| r25485 | r25486 | |
| 2015 | 2051 | } |
| 2016 | 2052 | for(int j = 0; j < bytes_to_recv; j++) |
| 2017 | 2053 | { |
| 2018 | | ram[cmd_ptr ^ BYTE4_XOR_BE(0)] = recv_buffer[j]; |
| 2019 | | cmd_ptr++; |
| 2054 | pif_ram[cmd_ptr++] = recv_buffer[j]; |
| 2020 | 2055 | } |
| 2021 | 2056 | } |
| 2022 | 2057 | else if (res == 1) |
| 2023 | 2058 | { |
| 2024 | 2059 | int offset = 0;//bytes_to_send; |
| 2025 | | ram[(cmd_ptr - offset - 2) ^ BYTE4_XOR_BE(0)] |= 0x80; |
| 2060 | pif_ram[cmd_ptr - offset - 2] |= 0x80; |
| 2026 | 2061 | } |
| 2027 | 2062 | } |
| 2028 | 2063 | |
| r25485 | r25486 | |
| 2046 | 2081 | |
| 2047 | 2082 | void n64_periphs::pif_dma(int direction) |
| 2048 | 2083 | { |
| 2049 | | UINT8 *ram = (UINT8*)pif_ram; |
| 2050 | | |
| 2051 | 2084 | if (si_dram_addr & 0x3) |
| 2052 | 2085 | { |
| 2053 | 2086 | fatalerror("pif_dma: si_dram_addr unaligned: %08X\n", si_dram_addr); |
| r25485 | r25486 | |
| 2059 | 2092 | |
| 2060 | 2093 | for(int i = 0; i < 64; i+=4) |
| 2061 | 2094 | { |
| 2062 | | ram[i >> 2] = *src; |
| 2063 | | src++; |
| 2095 | UINT32 d = *src++; |
| 2096 | pif_ram[i+0] = (d >> 24) & 0xff; |
| 2097 | pif_ram[i+1] = (d >> 16) & 0xff; |
| 2098 | pif_ram[i+2] = (d >> 8) & 0xff; |
| 2099 | pif_ram[i+3] = (d >> 0) & 0xff; |
| 2064 | 2100 | } |
| 2065 | 2101 | |
| 2066 | 2102 | memcpy(pif_cmd, pif_ram, 0x40); |
| r25485 | r25486 | |
| 2073 | 2109 | |
| 2074 | 2110 | for(int i = 0; i < 64; i+=4) |
| 2075 | 2111 | { |
| 2076 | | *dst = ram[i >> 2]; |
| 2077 | | dst++; |
| 2112 | UINT32 d = 0; |
| 2113 | d |= pif_ram[i+0] << 24; |
| 2114 | d |= pif_ram[i+1] << 16; |
| 2115 | d |= pif_ram[i+2] << 8; |
| 2116 | d |= pif_ram[i+3] << 0; |
| 2117 | |
| 2118 | *dst++ = d; |
| 2078 | 2119 | } |
| 2079 | 2120 | } |
| 2080 | 2121 | |
| r25485 | r25486 | |
| 2347 | 2388 | return cic_status; |
| 2348 | 2389 | } |
| 2349 | 2390 | } |
| 2350 | | return pif_ram[offset] & mem_mask; |
| 2391 | return ( ( pif_ram[offset*4+0] << 24 ) | ( pif_ram[offset*4+1] << 16 ) | ( pif_ram[offset*4+2] << 8 ) | ( pif_ram[offset*4+3] << 0 ) ) & mem_mask; |
| 2351 | 2392 | } |
| 2352 | 2393 | |
| 2353 | 2394 | WRITE32_MEMBER( n64_periphs::pif_ram_w ) |
| 2354 | 2395 | { |
| 2355 | | COMBINE_DATA(&pif_ram[offset]); |
| 2396 | if( mem_mask & 0xff000000 ) |
| 2397 | { |
| 2398 | pif_ram[offset*4+0] = ( data >> 24 ) & 0x000000ff; |
| 2399 | } |
| 2400 | if( mem_mask & 0x00ff0000 ) |
| 2401 | { |
| 2402 | pif_ram[offset*4+1] = ( data >> 16 ) & 0x000000ff; |
| 2403 | } |
| 2404 | if( mem_mask & 0x0000ff00 ) |
| 2405 | { |
| 2406 | pif_ram[offset*4+2] = ( data >> 8 ) & 0x000000ff; |
| 2407 | } |
| 2408 | if( mem_mask & 0x000000ff ) |
| 2409 | { |
| 2410 | pif_ram[offset*4+3] = ( data >> 0 ) & 0x000000ff; |
| 2411 | } |
| 2412 | |
| 2356 | 2413 | signal_rcp_interrupt(SI_INTERRUPT); |
| 2357 | 2414 | } |
| 2358 | 2415 | |