Previous 199869 Revisions Next

r23581 Monday 10th June, 2013 at 06:22:19 UTC by Fabio Priuli
(MESS) n64: improved PIF / RDRAM initialization [Joe]
[src/mame/includes]n64.h
[src/mame/machine]n64.c

trunk/src/mame/machine/n64.c
r23580r23581
3434void n64_periphs::reset_tick()
3535{
3636   reset_timer->adjust(attotime::never);
37   machine().device("maincpu")->execute().set_input_line(INPUT_LINE_IRQ2, CLEAR_LINE);
38   machine().device("maincpu")->reset();
39   machine().device("rsp")->reset();
40   machine().device("rcp")->reset();
41   machine().device("rsp")->execute().set_input_line(INPUT_LINE_HALT, ASSERT_LINE);
37   maincpu->reset();
38   maincpu->execute().set_input_line(INPUT_LINE_IRQ2, CLEAR_LINE);
39   rspcpu->reset();
40   rspcpu->execute().set_input_line(INPUT_LINE_HALT, ASSERT_LINE);
41   rspcpu->state().set_state_int(RSP_SR, rspcpu->state().state_int(RSP_SR) | RSP_STATUS_HALT);
4242   reset_held = false;
43   cic_status = 0;
44   memset(pif_ram, 0, sizeof(pif_ram));
45   switch(cic_type)
46   {
47      case 1:
48         pif_ram[0x24] = 0x00;
49         pif_ram[0x25] = 0x06;
50         pif_ram[0x26] = 0x3f;
51         pif_ram[0x27] = 0x3f;
52         break;
53      case 3:
54         pif_ram[0x24] = 0x00;
55         pif_ram[0x25] = 0x02;
56         pif_ram[0x26] = 0x78;
57         pif_ram[0x27] = 0x3f;
58         break;
59      case 5:
60         pif_ram[0x24] = 0x00;
61         pif_ram[0x25] = 0x02;
62         pif_ram[0x26] = 0x91;
63         pif_ram[0x27] = 0x3f;
64         break;
65      case 6:
66         pif_ram[0x24] = 0x00;
67         pif_ram[0x25] = 0x02;
68         pif_ram[0x26] = 0x85;
69         pif_ram[0x27] = 0x3f;
70         break;
71      case 0xd:
72         pif_ram[0x24] = 0x00;
73         pif_ram[0x25] = 0x0a;
74         pif_ram[0x26] = 0xdd;
75         pif_ram[0x27] = 0x3f;
76         break;
77      default:
78         pif_ram[0x24] = 0x00;
79         pif_ram[0x25] = 0x02;
80         pif_ram[0x26] = 0x3f;
81         pif_ram[0x27] = 0x3f;
82         break;
83   }
4384}
4485
4586void n64_periphs::poll_reset_button(bool button)
r23580r23581
79120   mi_version = 0x01010101;
80121   mi_interrupt = 0;
81122   mi_intr_mask = 0;
82   mi_mode = 0;
123   mi_mode = 0x80; // Skip RDRAM initialization
83124
84125   sp_mem_addr = 0;
85126   sp_dram_addr = 0;
r23580r23581
117158   ai_status = 0;
118159
119160   pi_dma_timer->adjust(attotime::never);
120   pi_first_dma = 1;
121161   pi_rd_len = 0;
122162   pi_wr_len = 0;
123163   pi_status = 0;
r23580r23581
146186
147187   memset(ri_regs, 0, sizeof(ri_regs));
148188
149   //ri_regs[3] = 1;
189   ri_regs[0] = 0xe; // Skip RDRAM initialization
190   ri_regs[1] = 0x40; //
191   ri_regs[3] = 0x14; //
192   ri_regs[4] = 0x63634; //
150193   memset(pif_ram, 0, sizeof(pif_ram));
151194   memset(pif_cmd, 0, sizeof(pif_cmd));
152195   si_dram_addr = 0;
r23580r23581
171214
172215   // CIC-NUS-6102 (default)
173216   pif_ram[0x24] = 0x00;
174   pif_ram[0x25] = 0x02;
217   pif_ram[0x25] = 0x00;
175218   pif_ram[0x26] = 0x3f;
176219   pif_ram[0x27] = 0x3f;
177220   dd_present = false;
221   cic_type=2;
222   mem_map->write_dword(0x00000318, 0x800000);
178223
179224   if (boot_checksum == U64(0x00000000001ff230))
180225   {
181226      //printf("64DD detected\n");
182227      pif_ram[0x24] = 0x00;
183      pif_ram[0x25] = 0x0a;
228      pif_ram[0x25] = 0x08;
184229      pif_ram[0x26] = 0xdd; // How utterly predictable
185230      pif_ram[0x27] = 0x3f;
186231      dd_present = true;
232      cic_type=0xd;
187233   }
188234   else if (boot_checksum == U64(0x000000cffb830843) || boot_checksum == U64(0x000000d0027fdf31))
189235   {
190236      // CIC-NUS-6101
191237      //printf("CIC-NUS-6101 detected\n");
192238      pif_ram[0x24] = 0x00;
193      pif_ram[0x25] = 0x06;
239      pif_ram[0x25] = 0x04;
194240      pif_ram[0x26] = 0x3f;
195241      pif_ram[0x27] = 0x3f;
242      cic_type=1;
196243   }
197244   else if (boot_checksum == U64(0x000000d6499e376b))
198245   {
199246      // CIC-NUS-6103
200247      //printf("CIC-NUS-6103 detected\n");
201248      pif_ram[0x24] = 0x00;
202      pif_ram[0x25] = 0x02;
249      pif_ram[0x25] = 0x00;
203250      pif_ram[0x26] = 0x78;
204251      pif_ram[0x27] = 0x3f;
252      cic_type=3;
205253   }
206254   else if (boot_checksum == U64(0x0000011a4a1604b6))
207255   {
208256      // CIC-NUS-6105
209257      //printf("CIC-NUS-6105 detected\n");
210258      pif_ram[0x24] = 0x00;
211      pif_ram[0x25] = 0x02;
259      pif_ram[0x25] = 0x00;
212260      pif_ram[0x26] = 0x91;
213261      pif_ram[0x27] = 0x3f;
262      cic_type=5;
263      mem_map->write_dword(0x000003f0, 0x800000);
214264   }
215265   else if (boot_checksum == U64(0x000000d6d5de4ba0))
216266   {
217267      // CIC-NUS-6106
218268      //printf("CIC-NUS-6106 detected\n");
219269      pif_ram[0x24] = 0x00;
220      pif_ram[0x25] = 0x02;
270      pif_ram[0x25] = 0x00;
221271      pif_ram[0x26] = 0x85;
222272      pif_ram[0x27] = 0x3f;
273      cic_type=6;
223274   }
224275   else
225276   {
r23580r23581
15801631         //printf("want write dma in %d\n", (pi_wr_len + 1));
15811632         pi_dma_timer->adjust(dma_period);
15821633
1583         if (pi_first_dma)
1584         {
1585            // TODO: CIC-6105 has different address...
1586            mem_map->write_dword(0x00000318, 0x800000);
1587            mem_map->write_dword(0x000003f0, 0x800000);
1588            pi_first_dma = 0;
1589         }
1590
15911634         //pi_dma_tick();
15921635         break;
15931636      }
trunk/src/mame/includes/n64.h
r23580r23581
202202   emu_timer *pi_dma_timer;
203203   UINT32 pi_dram_addr;
204204   UINT32 pi_cart_addr;
205   UINT32 pi_first_dma;
206205   UINT32 pi_rd_len;
207206   UINT32 pi_wr_len;
208207   UINT32 pi_status;
r23580r23581
229228   UINT32 si_pif_addr_wr64b;
230229   UINT32 si_status;
231230   UINT32 cic_status;
231   int cic_type;
232232
233233   n64_savable_data_t savable_data;
234234

Previous 199869 Revisions Next


© 1997-2024 The MAME Team