src/mame/machine/n64.c
| r14488 | r14489 | |
| 96 | 96 | pi_bsd_dom2_rls = 0; |
| 97 | 97 | pi_dma_dir = 0; |
| 98 | 98 | |
| 99 | dd_int = 0; |
| 100 | memset(dd_buffer, 0, sizeof(dd_buffer)); |
| 101 | memset(dd_sector_data, 0, sizeof(dd_sector_data)); |
| 102 | memset(dd_ram_seq_data, 0, sizeof(dd_ram_seq_data)); |
| 103 | dd_data_reg = 0; |
| 104 | dd_status_reg = 0; |
| 105 | dd_track_reg = 0; |
| 106 | dd_buf_status_reg = 0; |
| 107 | dd_sector_err_reg = 0; |
| 108 | dd_seq_status_reg = 0; |
| 109 | dd_seq_ctrl_reg = 0; |
| 110 | dd_int = 0; |
| 111 | |
| 99 | 112 | memset(pif_ram, 0, sizeof(pif_ram)); |
| 100 | 113 | memset(pif_cmd, 0, sizeof(pif_cmd)); |
| 101 | 114 | si_dram_addr = 0; |
| r14488 | r14489 | |
| 2017 | 2030 | } |
| 2018 | 2031 | } |
| 2019 | 2032 | |
| 2033 | #define DD_STATUS_INTR (1 << 25) |
| 2034 | |
| 2020 | 2035 | READ32_MEMBER( n64_periphs::dd_reg_r ) |
| 2021 | 2036 | { |
| 2022 | | logerror("dd_reg_r: %08X\n", offset << 2); |
| 2023 | | return 0; |
| 2037 | if(offset < 0x400/4) |
| 2038 | { |
| 2039 | return dd_buffer[offset]; |
| 2040 | } |
| 2041 | |
| 2042 | if(offset < 0x480/4) |
| 2043 | { |
| 2044 | return dd_sector_data[(offset - 0x400/4) / 4]; |
| 2045 | } |
| 2046 | |
| 2047 | if(offset < 0x500/4) |
| 2048 | { |
| 2049 | return dd_ram_seq_data[(offset - 0x480/4) / 4]; |
| 2050 | } |
| 2051 | |
| 2052 | offset -= 0x500/4; |
| 2053 | |
| 2054 | UINT32 ret = 0; |
| 2055 | switch(offset) |
| 2056 | { |
| 2057 | case 0x00/4: // DD Data |
| 2058 | ret = dd_data_reg; |
| 2059 | break; |
| 2060 | |
| 2061 | case 0x04/4: // ?? |
| 2062 | break; |
| 2063 | |
| 2064 | case 0x08/4: // DD Status |
| 2065 | ret = dd_status_reg; |
| 2066 | break; |
| 2067 | |
| 2068 | case 0x0c/4: // Current Track |
| 2069 | ret = dd_track_reg; |
| 2070 | break; |
| 2071 | |
| 2072 | case 0x10/4: // Transfer Buffer Status |
| 2073 | ret = dd_buf_status_reg; |
| 2074 | break; |
| 2075 | |
| 2076 | case 0x14/4: // Sector Error |
| 2077 | ret = dd_sector_err_reg; |
| 2078 | break; |
| 2079 | |
| 2080 | case 0x18/4: // Sequence Status |
| 2081 | ret = dd_seq_status_reg; |
| 2082 | break; |
| 2083 | |
| 2084 | case 0x1c/4: // Sequence Control |
| 2085 | ret = dd_seq_ctrl_reg; |
| 2086 | break; |
| 2087 | } |
| 2088 | |
| 2089 | //logerror("dd_reg_r: %08x (%08x)\n", offset << 2, ret); |
| 2090 | return ret; |
| 2024 | 2091 | } |
| 2025 | 2092 | |
| 2026 | 2093 | WRITE32_MEMBER( n64_periphs::dd_reg_w ) |
| 2027 | 2094 | { |
| 2028 | 2095 | logerror("dd_reg_w: %08X, %08X, %08X\n", data, offset << 2, mem_mask); |
| 2096 | |
| 2097 | if(offset < 0x400/4) |
| 2098 | { |
| 2099 | COMBINE_DATA(&dd_buffer[offset]); |
| 2100 | return; |
| 2101 | } |
| 2102 | |
| 2103 | if(offset < 0x480/4) |
| 2104 | { |
| 2105 | COMBINE_DATA(&dd_sector_data[(offset - 0x400/4) / 4]); |
| 2106 | return; |
| 2107 | } |
| 2108 | |
| 2109 | if(offset < 0x500/4) |
| 2110 | { |
| 2111 | COMBINE_DATA(&dd_ram_seq_data[(offset - 0x480/4) / 4]); |
| 2112 | return; |
| 2113 | } |
| 2114 | |
| 2115 | offset -= 0x500/4; |
| 2116 | |
| 2117 | switch(offset) |
| 2118 | { |
| 2119 | case 0x00/4: // DD Data |
| 2120 | dd_data_reg = data; |
| 2121 | break; |
| 2122 | |
| 2123 | case 0x08/4: // DD Command |
| 2124 | switch((data >> 16) & 0xff) |
| 2125 | { |
| 2126 | case 0x01: // Seek Read |
| 2127 | logerror("dd command: Seek Read\n"); |
| 2128 | break; |
| 2129 | case 0x02: // Seek Write |
| 2130 | logerror("dd command: Seek Write\n"); |
| 2131 | break; |
| 2132 | case 0x03: // Re-Zero / Recalibrate |
| 2133 | logerror("dd command: Re-Zero\n"); |
| 2134 | break; |
| 2135 | case 0x04: // Engage Brake |
| 2136 | logerror("dd command: Engage Brake\n"); |
| 2137 | break; |
| 2138 | case 0x05: // Start Motor |
| 2139 | logerror("dd command: Start Motor\n"); |
| 2140 | break; |
| 2141 | case 0x06: // Standby |
| 2142 | logerror("dd command: Standby\n"); |
| 2143 | break; |
| 2144 | case 0x07: // Set Sleep Mode |
| 2145 | logerror("dd command: Set Sleep Mode\n"); |
| 2146 | break; |
| 2147 | case 0x08: // Unknown |
| 2148 | logerror("dd command: Unknown\n"); |
| 2149 | break; |
| 2150 | case 0x09: // Initialize Drive(?) |
| 2151 | logerror("dd command: Initialize Drive\n"); |
| 2152 | break; |
| 2153 | case 0x0B: // Select Disk Type |
| 2154 | logerror("dd command: Select Disk Type\n"); |
| 2155 | break; |
| 2156 | case 0x0C: // ASIC Command Inquiry |
| 2157 | logerror("dd command: ASIC Commadn Inquiry\n"); |
| 2158 | break; |
| 2159 | case 0x0D: // Standby Mode (?) |
| 2160 | logerror("dd command: Standby Mode(?)\n"); |
| 2161 | break; |
| 2162 | case 0x0E: // Detect Disk Index |
| 2163 | logerror("dd command: Detect Disk Index\n"); |
| 2164 | break; |
| 2165 | case 0x0F: // Set RTC Year / Month |
| 2166 | logerror("dd command: Set RTC Year / Month\n"); |
| 2167 | break; |
| 2168 | case 0x10: // Set RTC Day / Hour |
| 2169 | logerror("dd command: Set RTC Day / Hour\n"); |
| 2170 | break; |
| 2171 | case 0x11: // Set RTC Minute / Second |
| 2172 | logerror("dd command: Set RTC Minute / Second\n"); |
| 2173 | break; |
| 2174 | case 0x12: // Read RTC Month / Year |
| 2175 | { |
| 2176 | logerror("dd command: Read RTC Month / Year\n"); |
| 2177 | |
| 2178 | system_time systime; |
| 2179 | machine().base_datetime(systime); |
| 2180 | |
| 2181 | dd_data_reg = (convert_to_bcd(systime.local_time.year % 100) << 24) | (convert_to_bcd(systime.local_time.month + 1) << 16); |
| 2182 | |
| 2183 | cputag_set_input_line(machine(), "maincpu", INPUT_LINE_IRQ1, ASSERT_LINE); |
| 2184 | dd_status_reg |= DD_STATUS_INTR; |
| 2185 | break; |
| 2186 | } |
| 2187 | |
| 2188 | case 0x13: // Read RTC Hour / Day |
| 2189 | { |
| 2190 | logerror("dd command: Read RTC Hour / Day\n"); |
| 2191 | |
| 2192 | system_time systime; |
| 2193 | machine().base_datetime(systime); |
| 2194 | |
| 2195 | dd_data_reg = (convert_to_bcd(systime.local_time.mday) << 24) | (convert_to_bcd(systime.local_time.hour) << 16); |
| 2196 | |
| 2197 | cputag_set_input_line(machine(), "maincpu", INPUT_LINE_IRQ1, ASSERT_LINE); |
| 2198 | dd_status_reg |= DD_STATUS_INTR; |
| 2199 | break; |
| 2200 | } |
| 2201 | |
| 2202 | case 0x14: // Read RTC Minute / Second |
| 2203 | { |
| 2204 | logerror("dd command: Read RTC Minute / Second\n"); |
| 2205 | |
| 2206 | system_time systime; |
| 2207 | machine().base_datetime(systime); |
| 2208 | |
| 2209 | dd_data_reg = (convert_to_bcd(systime.local_time.minute) << 24) | (convert_to_bcd(systime.local_time.second) << 16); |
| 2210 | |
| 2211 | cputag_set_input_line(machine(), "maincpu", INPUT_LINE_IRQ1, ASSERT_LINE); |
| 2212 | dd_status_reg |= DD_STATUS_INTR; |
| 2213 | break; |
| 2214 | } |
| 2215 | |
| 2216 | case 0x1B: // Disk Inquiry |
| 2217 | logerror("dd command: Disk Inquiry\n"); |
| 2218 | break; |
| 2219 | } |
| 2220 | // Do something here |
| 2221 | break; |
| 2222 | |
| 2223 | case 0x10/4: // Interrupt Clear |
| 2224 | logerror("dd interrupt clear\n"); |
| 2225 | cputag_set_input_line(machine(), "maincpu", INPUT_LINE_IRQ1, CLEAR_LINE); |
| 2226 | dd_status_reg &= ~DD_STATUS_INTR; |
| 2227 | break; |
| 2228 | |
| 2229 | case 0x1c/4: // Sequence Control |
| 2230 | dd_seq_ctrl_reg = data; |
| 2231 | break; |
| 2232 | } |
| 2029 | 2233 | } |
| 2030 | 2234 | |
| 2031 | 2235 | READ32_MEMBER( n64_periphs::pif_ram_r ) |