Previous 15994 Revisions Next

r14489 Friday 17th February, 2012 at 02:42:19 UTC by MooglyGuy
[N64] Hook up 64DD RTC and interrupts. Please insert disc. [Ryan Holtz]
[src/mame/includes]n64.h
[src/mame/machine]n64.c

src/mame/machine/n64.c
r14488r14489
9696   pi_bsd_dom2_rls = 0;
9797   pi_dma_dir = 0;
9898
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
99112   memset(pif_ram, 0, sizeof(pif_ram));
100113   memset(pif_cmd, 0, sizeof(pif_cmd));
101114   si_dram_addr = 0;
r14488r14489
20172030   }
20182031}
20192032
2033#define DD_STATUS_INTR      (1 << 25)
2034
20202035READ32_MEMBER( n64_periphs::dd_reg_r )
20212036{
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;
20242091}
20252092
20262093WRITE32_MEMBER( n64_periphs::dd_reg_w )
20272094{
20282095   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   }
20292233}
20302234
20312235READ32_MEMBER( n64_periphs::pif_ram_r )
src/mame/includes/n64.h
r14488r14489
165165   UINT32 sp_semaphore;
166166   UINT32 dp_clock;
167167
168   // Disk Drive (DD) registers and functions
169   UINT32 dd_buffer[256];
170   UINT32 dd_sector_data[32]; // ?
171   UINT32 dd_ram_seq_data[32]; // ?
172   UINT32 dd_data_reg;
173   UINT32 dd_status_reg;
174   UINT32 dd_track_reg;
175   UINT32 dd_buf_status_reg;
176   UINT32 dd_sector_err_reg;
177   UINT32 dd_seq_status_reg;
178   UINT32 dd_seq_ctrl_reg;
179   UINT8 dd_int;
180
168181   // Peripheral Interface (PI) registers and functions
169182   void pi_dma();
170183   emu_timer *pi_dma_timer;

Previous 15994 Revisions Next


© 1998-2018 The MESS Team