Previous 15994 Revisions Next

r14487 Thursday 16th February, 2012 at 22:23:34 UTC by MooglyGuy
[N64] Fixed missing text in Super Mario 64 and other games. [Ryan Holtz]
[N64] Added skeleton 64DD driver. Boots the 64DD IPL, but does not emulate the hardware yet. [Ryan Holtz]
- User Note: You will need an unmodified 64DD IPL dump. NOT one that has had the first 4K replaced with a CIC-6102 or other game's boot block.
[N64] Tweaked MI interrupt handling to guard against interrupts getting "lost" [Ryan Holtz]

(nw): Historic note, to my knowledge this is the first time a public emulator can boot an unmodified 64DD IPL dump, but I'm not 100% sure.
[src/mame/includes]n64.h
[src/mame/machine]n64.c
[src/mame/video]n64.c n64.h
[src/mess]mess.lst
[src/mess/drivers]n64.c

src/mame/machine/n64.c
r14486r14487
4141   rspcpu = machine().device("rsp");
4242   mem_map = maincpu->memory().space(AS_PROGRAM);
4343
44   mi_version = 0;
44   mi_version = 0x02020102;
4545   mi_interrupt = 0;
4646   mi_intr_mask = 0;
4747   mi_mode = 0;
r14486r14487
115115        boot_checksum += cart[i/4]+i;
116116    }
117117
118    if (boot_checksum == U64(0x000000d057e84864))
118   // CIC-NUS-6102 (default)
119   pif_ram[0x24] = 0x00;
120   pif_ram[0x25] = 0x02;
121   pif_ram[0x26] = 0x3f;
122   pif_ram[0x27] = 0x3f;
123   dd_present = false;
124
125   if (boot_checksum == U64(0x00000000001ff230))
126   {
127      //printf("64DD detected\n");
128      pif_ram[0x24] = 0x00;
129      pif_ram[0x25] = 0x0a;
130      pif_ram[0x26] = 0xdd; // How utterly predictable
131      pif_ram[0x27] = 0x3f;
132      dd_present = true;
133   }
134    else if (boot_checksum == U64(0x000000cffb830843) || boot_checksum == U64(0x000000d0027fdf31))
119135    {
120136        // CIC-NUS-6101
121        printf("CIC-NUS-6102 detected\n");
137        //printf("CIC-NUS-6101 detected\n");
122138        pif_ram[0x24] = 0x00;
123        pif_ram[0x25] = 0x02;
124        pif_ram[0x26] = 0x3f;
125        pif_ram[0x27] = 0x3f;
126        // crc_seed = 0x3f;
127    }
128    else if (boot_checksum == U64(0x000000cffb830843) || boot_checksum == U64(0x000000d0027fdf31))
129    {
130        // CIC-NUS-6103
131        printf("CIC-NUS-6101 detected\n");
132        // crc_seed = 0x78;
133        pif_ram[0x24] = 0x00;
134139        pif_ram[0x25] = 0x06;
135140        pif_ram[0x26] = 0x3f;
136141        pif_ram[0x27] = 0x3f;
r14486r14487
138143    else if (boot_checksum == U64(0x000000d6499e376b))
139144    {
140145        // CIC-NUS-6103
141        printf("CIC-NUS-6103 detected\n");
142        // crc_seed = 0x78;
146        //printf("CIC-NUS-6103 detected\n");
143147        pif_ram[0x24] = 0x00;
144148        pif_ram[0x25] = 0x02;
145149        pif_ram[0x26] = 0x78;
r14486r14487
148152    else if (boot_checksum == U64(0x0000011a4a1604b6))
149153    {
150154        // CIC-NUS-6105
151        printf("CIC-NUS-6105 detected\n");
152        // crc_seed = 0x91;
155        //printf("CIC-NUS-6105 detected\n");
153156
154        // first_rsp = 0;
155157        pif_ram[0x24] = 0x00;
156158        pif_ram[0x25] = 0x02;
157159        pif_ram[0x26] = 0x91;
r14486r14487
160162    else if (boot_checksum == U64(0x000000d6d5de4ba0))
161163    {
162164        // CIC-NUS-6106
163        printf("CIC-NUS-6106 detected\n");
164        // crc_seed = 0x85;
165        //printf("CIC-NUS-6106 detected\n");
165166        pif_ram[0x24] = 0x00;
166167        pif_ram[0x25] = 0x02;
167168        pif_ram[0x26] = 0x85;
r14486r14487
169170    }
170171    else
171172    {
172        printf("Unknown BootCode Checksum %08X%08X\n", (UINT32)(boot_checksum>>32),(UINT32)(boot_checksum));
173        //printf("Unknown BootCode Checksum %08X%08X\n", (UINT32)(boot_checksum>>32),(UINT32)(boot_checksum));
173174    }
174175}
175176
r14486r14487
188189
189190READ32_MEMBER( n64_periphs::mi_reg_r )
190191{
191   //printf("mi_reg_r %08x\n", offset * 4);
192   UINT32 ret = 0;
192193   switch (offset)
193194   {
194195        case 0x00/4:            // MI_MODE_REG
195            return mi_mode;
196            ret = mi_mode;
197            break;
196198
197199      case 0x04/4:         // MI_VERSION_REG
198         return mi_version;
200         ret = mi_version;
201         break;
199202
200203      case 0x08/4:         // MI_INTR_REG
201         return mi_interrupt;
204         ret = mi_interrupt;
205         break;
202206
203207      case 0x0c/4:         // MI_INTR_MASK_REG
204         return mi_intr_mask;
208         ret = mi_intr_mask;
209         break;
205210
206211      default:
207212         logerror("mi_reg_r: %08X, %08X at %08X\n", offset, mem_mask, cpu_get_pc(&mem_map->device()));
208213         break;
209214   }
210215
211   return 0;
216   //printf("mi_reg_r %08x = %08x\n", offset * 4, ret);
217   return ret;
212218}
213219
214220WRITE32_MEMBER( n64_periphs::mi_reg_w )
r14486r14487
227233         {
228234            clear_rcp_interrupt(DP_INTERRUPT);
229235         }
236         mi_mode &= ~0x7f;
237         mi_mode |= data & 0x7f;
230238         break;
231239
232240      case 0x04/4:      // MI_VERSION_REG
r14486r14487
283291            {
284292                mi_intr_mask |= 0x20;      // set DP mask
285293            }
294            check_interrupts();
286295         break;
287296      }
288297
r14486r14487
297306   machine.device<n64_periphs>("rcp")->signal_rcp_interrupt(interrupt);
298307}
299308
300void n64_periphs::signal_rcp_interrupt(int interrupt)
309void n64_periphs::check_interrupts()
301310{
302   if (mi_intr_mask & interrupt)
311   if (mi_intr_mask & mi_interrupt)
303312   {
304      mi_interrupt |= interrupt;
305
306313      cputag_set_input_line(machine(), "maincpu", INPUT_LINE_IRQ0, ASSERT_LINE);
307314   }
315   else
316   {
317      cputag_set_input_line(machine(), "maincpu", INPUT_LINE_IRQ0, CLEAR_LINE);
318   }
308319}
309320
321void n64_periphs::signal_rcp_interrupt(int interrupt)
322{
323   mi_interrupt |= interrupt;
324
325   check_interrupts();
326}
327
310328void n64_periphs::clear_rcp_interrupt(int interrupt)
311329{
312330   mi_interrupt &= ~interrupt;
313331
314   if (!mi_interrupt)
315   {
316      cputag_set_input_line(machine(), "maincpu", INPUT_LINE_IRQ0, CLEAR_LINE);
317   }
332   check_interrupts();
318333}
319334
320335READ32_MEMBER( n64_periphs::is64_r )
r14486r14487
350365        case 0x0014/4:
351366            for(i = 0x20; i < (0x20 + data); i++)
352367            {
353                printf( "%c", is64_buffer[i] );
368                //printf( "%c", is64_buffer[i] );
354369                if(is64_buffer[i] == 0x0a)
355370                {
356                    printf( "%c", 0x0d );
371                    //printf( "%c", 0x0d );
357372                }
358373                is64_buffer[i] = 0;
359374            }
r14486r14487
371386READ32_MEMBER( n64_periphs::open_r )
372387{
373388    UINT32 retval = (offset << 2) & 0x0000ffff;
374    retval = (retval << 16) | retval;
389    retval = ((retval + 2) << 16) | retval;
375390    return retval;
376391}
377392
r14486r14487
395410
396411READ32_MEMBER( n64_periphs::rdram_reg_r )
397412{
398   //printf("rdram_reg_r %08x\n", offset * 4);
413   //printf("rdram_reg_r %08x = %08x\n", offset * 4, rdram_regs[offset]);
399414   if(offset > 0x24/4)
400415   {
401416      logerror("rdram_reg_r: %08X, %08X at %08X\n", offset, mem_mask, cpu_get_pc(maincpu));
r14486r14487
409424   //printf("rdram_reg_w %08x %08x %08x\n", offset * 4, data, mem_mask);
410425   if(offset > 0x24/4)
411426   {
412      logerror("mi_reg_w: %08X, %08X, %08X at %08X\n", data, offset, mem_mask, cpu_get_pc(maincpu));
427      logerror("rdram_reg_w: %08X, %08X, %08X at %08X\n", data, offset, mem_mask, cpu_get_pc(maincpu));
413428      return;
414429   }
415430   COMBINE_DATA(&rdram_regs[offset]);
r14486r14487
436451
437452   if ((sp_mem_addr & 0xfff) + (sp_dma_length) > 0x1000)
438453   {
439      printf("sp_dma: dma out of memory area: %08X, %08X\n", sp_mem_addr, sp_dma_length);
454      //printf("sp_dma: dma out of memory area: %08X, %08X\n", sp_mem_addr, sp_dma_length);
440455      //fatalerror("sp_dma: dma out of memory area: %08X, %08X\n", sp_mem_addr, sp_dma_length);
441456      sp_dma_length = 0x1000 - (sp_mem_addr & 0xfff);
442457   }
r14486r14487
508523
509524UINT32 n64_periphs::sp_reg_r(UINT32 offset)
510525{
511   //printf("sp_reg_r %08x\n", offset * 4);
526   UINT32 ret = 0;
512527   switch (offset)
513528   {
514529      case 0x00/4:      // SP_MEM_ADDR_REG
515         return sp_mem_addr;
530         ret = sp_mem_addr;
531         break;
516532
517533      case 0x04/4:      // SP_DRAM_ADDR_REG
518         return sp_dram_addr;
534         ret = sp_dram_addr;
535         break;
519536
520537      case 0x08/4:      // SP_RD_LEN_REG
521         return (sp_dma_skip << 20) | (sp_dma_count << 12) | sp_dma_length;
538         ret = (sp_dma_skip << 20) | (sp_dma_count << 12) | sp_dma_length;
539         break;
522540
523541      case 0x10/4:      // SP_STATUS_REG
524            return cpu_get_reg(rspcpu, RSP_SR);
542         //machine().scheduler().synchronize();
543         //machine().scheduler().boost_interleave(attotime::from_msec(1), attotime::from_msec(m));
544            ret = cpu_get_reg(rspcpu, RSP_SR);
545         break;
525546
526547      case 0x14/4:      // SP_DMA_FULL_REG
527         return 0;
548         ret = 0;
549         break;
528550
529551      case 0x18/4:      // SP_DMA_BUSY_REG
530         return 0;
552         ret = 0;
553         break;
531554
532555      case 0x1c/4:      // SP_SEMAPHORE_REG
556         //machine().scheduler().boost_interleave(attotime::from_usec(1), attotime::from_usec(1));
533557            if( sp_semaphore )
534558            {
535                return 1;
559                ret = 1;
536560            }
537561            else
538562            {
539563                sp_semaphore = 1;
540                return 0;
564                ret = 0;
541565            }
566         break;
542567
543568        case 0x20/4:        // DP_CMD_START
544569        case 0x24/4:        // DP_CMD_END
r14486r14487
546571        case 0x34/4:        // DP_CMD_BUSY
547572        case 0x38/4:        // DP_CMD_PIPE_BUSY
548573        case 0x3c/4:        // DP_CMD_TMEM_BUSY
549            return 0;
574         break;
550575
551576        case 0x2c/4:        // DP_CMD_STATUS
552           return 0x88;
577           ret = 0x88;
578         break;
553579
554580        case 0x30/4:        // DP_CMD_CLOCK
555           return ++dp_clock;
581           ret = ++dp_clock;
582         break;
556583
557584        case 0x40000/4:     // PC
558            return cpu_get_reg(rspcpu, RSP_PC) & 0x00000fff;
585            ret = cpu_get_reg(rspcpu, RSP_PC) & 0x00000fff;
586         break;
559587
560588        default:
561589            logerror("sp_reg_r: %08X at %08X\n", offset, cpu_get_pc(maincpu));
562590            break;
563591   }
564592
565   return 0;
593   //printf("sp_reg_r %08x = %08x\n", offset * 4, ret);
594   return ret;
566595}
567596
568597READ32_DEVICE_HANDLER( n64_sp_reg_r )
r14486r14487
573602void n64_periphs::sp_reg_w(UINT32 offset, UINT32 data, UINT32 mem_mask)
574603{
575604   //printf("sp_reg_w %08x %08x %08x\n", offset * 4, data, mem_mask);
605   //device_yield(machine().device("maincpu"));
606
576607   if ((offset & 0x10000) == 0)
577608   {
578609      switch (offset & 0xffff)
r14486r14487
716747            }
717748
718749         case 0x1c/4:      // SP_SEMAPHORE_REG
750            //machine().scheduler().boost_interleave(attotime::from_usec(1), attotime::from_usec(1));
719751            if(data == 0)
720752            {
721753                   sp_semaphore = 0;
r14486r14487
764796READ32_DEVICE_HANDLER( n64_dp_reg_r )
765797{
766798   n64_state *state = device->machine().driver_data<n64_state>();
767
768   //printf("dp_reg_r %08x\n", offset);
799   UINT32 ret = 0;
769800   switch (offset)
770801   {
771802      case 0x00/4:      // DP_START_REG
772         return state->m_rdp->GetStartReg();
803         ret = state->m_rdp->GetStartReg();
804         break;
773805
774806      case 0x04/4:      // DP_END_REG
775         return state->m_rdp->GetEndReg();
807         ret = state->m_rdp->GetEndReg();
808         break;
776809
777810      case 0x08/4:      // DP_CURRENT_REG
778         return state->m_rdp->GetCurrentReg();
811         ret = state->m_rdp->GetCurrentReg();
812         break;
779813
780814      case 0x0c/4:      // DP_STATUS_REG
781         return state->m_rdp->GetStatusReg();
815         ret = state->m_rdp->GetStatusReg();
816         break;
782817
783818      default:
784819         logerror("dp_reg_r: %08X, %08X at %08X\n", offset, mem_mask, cpu_get_pc(device));
785820         break;
786821   }
787822
788   return 0;
823   //printf("dp_reg_r %08x = %08x\n", offset, ret);
824   return ret;
789825}
790826
791827WRITE32_DEVICE_HANDLER( n64_dp_reg_w )
r14486r14487
893929
894930READ32_MEMBER( n64_periphs::vi_reg_r )
895931{
896   //printf("vi_reg_r %08x\n", offset * 4);
932   UINT32 ret = 0;
897933   switch (offset)
898934   {
899935      case 0x00/4:      // VI_CONTROL_REG
900         return vi_control;
936         ret = vi_control;
937         break;
901938
902939      case 0x04/4:      // VI_ORIGIN_REG
903            return vi_origin;
940            ret = vi_origin;
941         break;
904942
905943      case 0x08/4:      // VI_WIDTH_REG
906            return vi_width;
944            ret = vi_width;
945         break;
907946
908947      case 0x0c/4:
909            return vi_intr;
948            ret = vi_intr;
949         break;
910950
911951      case 0x10/4:      // VI_CURRENT_REG
912         return machine().primary_screen->vpos() << 1;
952         ret = machine().primary_screen->vpos() << 1;
953         break;
913954
914955      case 0x14/4:      // VI_BURST_REG
915            return vi_burst;
956            ret = vi_burst;
957         break;
916958
917959      case 0x18/4:      // VI_V_SYNC_REG
918            return vi_vsync;
960            ret = vi_vsync;
961         break;
919962
920963      case 0x1c/4:      // VI_H_SYNC_REG
921            return vi_hsync;
964            ret = vi_hsync;
965         break;
922966
923967      case 0x20/4:      // VI_LEAP_REG
924            return vi_leap;
968            ret = vi_leap;
969         break;
925970
926971      case 0x24/4:      // VI_H_START_REG
927            return vi_hstart;
972            ret = vi_hstart;
973         break;
928974
929975      case 0x28/4:      // VI_V_START_REG
930            return vi_vstart;
976            ret = vi_vstart;
977         break;
931978
932979      case 0x2c/4:      // VI_V_BURST_REG
933            return vi_vburst;
980            ret = vi_vburst;
981         break;
934982
935983      case 0x30/4:      // VI_X_SCALE_REG
936            return vi_xscale;
984            ret = vi_xscale;
985         break;
937986
938987      case 0x34/4:      // VI_Y_SCALE_REG
939            return vi_yscale;
988            ret = vi_yscale;
989         break;
940990
941991      default:
942992         logerror("vi_reg_r: %08X, %08X at %08X\n", offset, mem_mask, cpu_get_pc(maincpu));
943993         break;
944994   }
945   return 0;
995
996   //printf("vi_reg_r %08x = %08x\n", offset * 4, ret);
997   return ret;
946998}
947999
9481000WRITE32_MEMBER( n64_periphs::vi_reg_w )
r14486r14487
11491201
11501202READ32_MEMBER( n64_periphs::ai_reg_r )
11511203{
1152   //printf("ai_reg_r %08x\n", offset * 4);
1204   UINT32 ret = 0;
11531205    switch (offset)
11541206    {
11551207        case 0x04/4:        // AI_LEN_REG
11561208        {
11571209            if (ai_status & 0x80000001)
11581210            {
1159                return ai_len;
1211                ret = ai_len;
11601212            }
11611213            else if (ai_status & 0x40000000)
11621214            {
11631215                double secs_left = (ai_timer->expire() - machine().time()).as_double();
11641216                unsigned int samples_left = secs_left * DACRATE_NTSC / (ai_dacrate + 1);
1165                return samples_left * 4;
1217                ret = samples_left * 4;
11661218            }
1167            else return 0;
1219            else
1220            {
1221            ret = 0;
1222         }
1223         break;
11681224        }
11691225
11701226        case 0x0c/4:        // AI_STATUS_REG
1171            return ai_status;
1227            ret = ai_status;
1228         break;
11721229
11731230        default:
11741231            logerror("ai_reg_r: %08X, %08X at %08X\n", offset, mem_mask, cpu_get_pc(maincpu));
11751232            break;
11761233    }
11771234
1178    return 0;
1235   //printf("ai_reg_r %08x = %08x\n", offset * 4, ret);
1236    return ret;
11791237}
11801238
11811239WRITE32_MEMBER( n64_periphs::ai_reg_w )
r14486r14487
12301288   UINT16 *cart16 = (UINT16*)machine().region("user2")->base();
12311289   UINT16 *dram16 = (UINT16*)rdram;
12321290
1233   //printf("%08x Cart, %08x Dram\n", pi_cart_addr, pi_dram_addr);
1234
12351291   UINT32 cart_addr = (pi_cart_addr & 0x0fffffff) >> 1;
12361292   UINT32 dram_addr = (pi_dram_addr & 0x007fffff) >> 1;
12371293
1238   if(cart_addr & 0x04000000)
1294   if((cart_addr & 0x04000000) == 0x04000000)
12391295   {
12401296      cart16 = (UINT16*)n64_sram;
12411297      cart_addr = (pi_cart_addr & 0x0001ffff) >> 1;
12421298   }
1299   else if((cart_addr & 0x03000000) == 0x03000000 && dd_present)
1300   {
1301      cart16 = (UINT16*)machine().region("ddipl")->base();
1302       cart_addr = (pi_cart_addr & 0x003fffff) >> 1;
1303   }
1304   else
1305   {
1306       cart_addr &= ((machine().region("user2")->bytes() >> 1) - 1);
1307   }
12431308
1244 cart_addr &= ((machine().region("user2")->bytes() >> 1) - 1);
1309   //printf("%08x Cart, %08x Dram\n", cart_addr << 1, dram_addr << 1);
12451310
12461311   if(pi_dma_dir == 1)
12471312   {
r14486r14487
13001365
13011366READ32_MEMBER( n64_periphs::pi_reg_r )
13021367{
1303   //printf("pi_reg_r %08x\n", offset * 4);
1368   UINT32 ret = 0;
13041369   switch (offset)
13051370   {
13061371      case 0x00/4:      // PI_DRAM_ADDR_REG
1307         return pi_dram_addr;
1372         ret = pi_dram_addr;
1373            break;
13081374
13091375      case 0x04/4:      // PI_CART_ADDR_REG
1310         return pi_cart_addr;
1376         ret = pi_cart_addr;
1377            break;
13111378
13121379      case 0x10/4:      // PI_STATUS_REG
1313         return pi_status;
1380         ret = pi_status;
1381            break;
13141382
13151383        case 0x14/4:        // PI_BSD_DOM1_LAT
1316            return pi_bsd_dom1_lat;
1384            ret = pi_bsd_dom1_lat;
1385            break;
13171386
13181387        case 0x18/4:        // PI_BSD_DOM1_PWD
1319            return pi_bsd_dom1_pwd;
1388            ret = pi_bsd_dom1_pwd;
1389            break;
13201390
13211391        case 0x1c/4:        // PI_BSD_DOM1_PGS
1322            return pi_bsd_dom1_pgs;
1392            ret = pi_bsd_dom1_pgs;
1393            break;
13231394
13241395        case 0x20/4:        // PI_BSD_DOM1_RLS
1325            return pi_bsd_dom1_rls;
1396            ret = pi_bsd_dom1_rls;
1397            break;
13261398
13271399        case 0x24/4:        // PI_BSD_DOM2_LAT
1328            return pi_bsd_dom2_lat;
1400            ret = pi_bsd_dom2_lat;
1401            break;
13291402
13301403        case 0x28/4:        // PI_BSD_DOM2_PWD
1331            return pi_bsd_dom2_pwd;
1404            ret = pi_bsd_dom2_pwd;
1405            break;
13321406
13331407        case 0x2c/4:        // PI_BSD_DOM2_PGS
1334            return pi_bsd_dom2_pgs;
1408            ret = pi_bsd_dom2_pgs;
1409            break;
13351410
13361411        case 0x30/4:        // PI_BSD_DOM2_RLS
1337            return pi_bsd_dom2_rls;
1412            ret = pi_bsd_dom2_rls;
1413            break;
13381414
13391415      default:
13401416         logerror("pi_reg_r: %08X, %08X at %08X\n", offset, mem_mask, cpu_get_pc(maincpu));
13411417         break;
13421418   }
1343   return 0;
1419
1420   //printf("pi_reg_r %08x = %08x\n", offset * 4, ret);
1421   return ret;
13441422}
13451423
13461424WRITE32_MEMBER( n64_periphs::pi_reg_w )
r14486r14487
14381516
14391517READ32_MEMBER( n64_periphs::ri_reg_r )
14401518{
1441   //printf("ri_reg_r %08x\n", offset * 4);
1519   //printf("ri_reg_r %08x = %08x\n", offset * 4, ri_regs[offset]);
14421520   if(offset > 0x1c/4)
14431521   {
14441522      logerror("ri_reg_r: %08X, %08X at %08X\n", offset, mem_mask, cpu_get_pc(maincpu));
r14486r14487
18911969
18921970READ32_MEMBER( n64_periphs::si_reg_r )
18931971{
1894   //printf("si_reg_r %08x\n", offset * 4);
1972   UINT32 ret = 0;
18951973   switch (offset)
18961974   {
18971975      //case 0x00/4:      // SI_DRAM_ADDR_REG
18981976         //return si_dram_addr;
18991977
19001978      case 0x18/4:      // SI_STATUS_REG
1901         return si_status;
1979         ret = si_status;
19021980   }
1903   return 0;
1981
1982   //printf("si_reg_r %08x = %08x\n", offset * 4, ret);
1983   return ret;
19041984}
19051985
19061986WRITE32_MEMBER( n64_periphs::si_reg_w )
r14486r14487
19372017   }
19382018}
19392019
2020READ32_MEMBER( n64_periphs::dd_reg_r )
2021{
2022   logerror("dd_reg_r: %08X\n", offset << 2);
2023   return 0;
2024}
2025
2026WRITE32_MEMBER( n64_periphs::dd_reg_w )
2027{
2028   logerror("dd_reg_w: %08X, %08X, %08X\n", data, offset << 2, mem_mask);
2029}
2030
19402031READ32_MEMBER( n64_periphs::pif_ram_r )
19412032{
19422033    if(!space.debugger_access())
r14486r14487
19802071   n64_periphs *periphs = machine.device<n64_periphs>("rcp");
19812072
19822073   device_image_interface *image = dynamic_cast<device_image_interface *>(periphs->m_nvram_image);
1983   //printf("Saving\n");
2074   //printf("Saving stuff\n");
19842075   UINT8 data[0x30800];
19852076   memcpy(data, n64_sram, 0x20000);
19862077   memcpy(data + 0x20000, periphs->m_save_data.eeprom, 0x800);
src/mame/includes/n64.h
r14486r14487
6565   DECLARE_WRITE32_MEMBER( ri_reg_w );
6666   DECLARE_READ32_MEMBER( si_reg_r );
6767   DECLARE_WRITE32_MEMBER( si_reg_w );
68   DECLARE_READ32_MEMBER( dd_reg_r );
69   DECLARE_WRITE32_MEMBER( dd_reg_w );
6870   DECLARE_READ32_MEMBER( pif_ram_r );
6971   DECLARE_WRITE32_MEMBER( pif_ram_w );
7072
r14486r14487
7375
7476   void sp_set_status(UINT32 status);
7577   void signal_rcp_interrupt(int interrupt);
78   void check_interrupts();
7679
7780   void ai_timer_tick();
7881   void pi_dma_tick();
r14486r14487
99102
100103   n64_savable_data_t m_save_data;
101104
105   UINT32 cart_length;
106
107   bool dd_present;
108
102109protected:
103110    // device-level overrides
104111    virtual void device_start();
src/mame/video/n64.c
r14486r14487
3131
3232static FILE *rdp_exec;
3333
34bool n64_rdp::rdp_range_check(UINT32 addr)
35{
36   if(MiscState.FBSize == 0) return false;
37
38   int fbcount = ((MiscState.FBWidth * Scissor.m_yl) << (MiscState.FBSize - 1)) * 3;
39   int zbcount = MiscState.FBWidth * Scissor.m_yl * 2;
40   int fbaddr = MiscState.FBAddress & 0x007fffff;
41   int zbaddr = MiscState.ZBAddress & 0x007fffff;
42   if ((addr >= fbaddr) && (addr < (fbaddr + fbcount)))
43   {
44      return false;
45   }
46   if ((addr >= zbaddr) && (addr < (zbaddr + zbcount)))
47   {
48      return false;
49   }
50
51   printf("Check failed: %08x vs. %08x-%08x, %08x-%08x (%d, %d)\n", addr, fbaddr, fbaddr + fbcount, zbaddr, zbaddr + zbcount, MiscState.FBWidth, Scissor.m_yl);
52   fflush(stdout);
53   return true;
54}
55
3456/*****************************************************************************/
3557
3658// The functions in this file should be moved into the parent Processor class.
r14486r14487
113135      hres = 640;
114136   }
115137
116   UINT32 pixels = 0;
138    if (vres > bitmap.height()) // makes Perfect Dark boot w/o crashing
139    {
140        vres = bitmap.height();
141    }
117142
143    UINT32 pixels = 0;
144
118145   if (frame_buffer)
119146   {
120147      for(int j = 0; j < vres; j++)
r14486r14487
909936UINT32 n64_rdp::ZDecompress(UINT32 zcurpixel)
910937{
911938   UINT32 zb = RREADIDX16(zcurpixel);
939   CHECK16(zcurpixel);
912940   return z_complete_dec_table[(zb >> 2) & 0x3fff];
913941}
914942
915943UINT32 n64_rdp::DZDecompress(UINT32 zcurpixel, UINT32 dzcurpixel)
916944{
917945   UINT16 zval = RREADIDX16(zcurpixel);
946   CHECK16(zcurpixel);
918947   UINT8 dzval = (((dzcurpixel) <= 0x7fffff) ? (HiddenBits[(dzcurpixel) ^ BYTE_ADDR_XOR]) : 0);
919948   UINT32 dz_compressed = ((zval & 3) << 2) | (dzval & 3);
920949   return (1 << dz_compressed);
r14486r14487
10181047      oz = ZDecompress(zcurpixel);
10191048      dzmem = DZDecompress(zcurpixel, dzcurpixel);
10201049      zval = RREADIDX16(zcurpixel);
1050      CHECK16(zcurpixel);
10211051      rawdzmem = ((zval & 3) << 2) | ((((dzcurpixel) <= 0x3fffff) ? (HiddenBits[(dzcurpixel) ^ BYTE_ADDR_XOR]) : 0) & 3);
10221052   }
10231053   else
r14486r14487
21212151
21222152            if (spix == 0)
21232153            {
2124               Spans[j - (ycur >> 2)].userdata = (void*)((UINT8*)AuxBuf[AuxBufIndex] + AuxBufPtr[AuxBufIndex]);
2125               AuxBufPtr[AuxBufIndex] += sizeof(rdp_span_aux);
2154               Spans[j - (ycur >> 2)].userdata = (void*)((UINT8*)AuxBuf + AuxBufPtr);
2155               AuxBufPtr += sizeof(rdp_span_aux);
2156
2157               if(AuxBufPtr >= EXTENT_AUX_COUNT)
2158               {
2159                  fatalerror("n64_rdp::DrawTriangle: span aux buffer overflow\n");
2160               }
2161
21262162               rdp_span_aux *userdata = (rdp_span_aux*)Spans[j - (ycur >> 2)].userdata;
21272163               userdata->m_tmem = object.m_tmem;
21282164
r14486r14487
22732309
22742310            if (spix == 0)
22752311            {
2276               Spans[j - (ycur >> 2)].userdata = (void*)((UINT8*)AuxBuf[AuxBufIndex] + AuxBufPtr[AuxBufIndex]);
2277               AuxBufPtr[AuxBufIndex] += sizeof(rdp_span_aux);
2312               Spans[j - (ycur >> 2)].userdata = (void*)((UINT8*)AuxBuf + AuxBufPtr);
2313               AuxBufPtr += sizeof(rdp_span_aux);
22782314
2315               if(AuxBufPtr >= EXTENT_AUX_COUNT)
2316               {
2317                  fatalerror("n64_rdp::DrawTriangle: span aux buffer overflow\n");
2318               }
2319
22792320               rdp_span_aux *userdata = (rdp_span_aux*)Spans[j - (ycur >> 2)].userdata;
22802321               userdata->m_tmem = object.m_tmem;
22812322
r14486r14487
24092450   if (object.OtherModes.color_on_cvg && !userdata->PreWrap)
24102451   {
24112452      finalcolor = RREADIDX16(fb) & 0xfffe;
2453      CHECK16(fb);
24122454   }
24132455
24142456   finalcvg = userdata->CurrentPixCvg + userdata->CurrentMemCvg;
r14486r14487
24312473   if (object.OtherModes.color_on_cvg && !userdata->PreWrap)
24322474   {
24332475      finalcolor = RREADIDX16(fb) & 0xfffe;
2476      CHECK16(fb);
24342477   }
24352478
24362479   finalcvg = (userdata->CurrentPixCvg - 1) & 7;
r14486r14487
24492492   if (object.OtherModes.color_on_cvg && !userdata->PreWrap)
24502493   {
24512494      finalcolor = RREADIDX16(fb) & 0xfffe;
2495      CHECK16(fb);
24522496   }
24532497
24542498   finalcvg = (userdata->CurrentPixCvg + userdata->CurrentMemCvg) & 7;
r14486r14487
24662510   if (object.OtherModes.color_on_cvg && !userdata->PreWrap)
24672511   {
24682512      finalcolor = RREADIDX16(fb) & 0xfffe;
2513      CHECK16(fb);
24692514   }
24702515
24712516   RWRITEIDX16(fb, finalcolor | 1);
r14486r14487
24822527   if (object.OtherModes.color_on_cvg && !userdata->PreWrap)
24832528   {
24842529      finalcolor = RREADIDX16(fb) & 0xfffe;
2530      CHECK16(fb);
24852531   }
24862532
24872533   RWRITEIDX16(fb, finalcolor | ((userdata->CurrentMemCvg >> 2) & 1));
r14486r14487
24972543   if (object.OtherModes.color_on_cvg && !userdata->PreWrap)
24982544   {
24992545      finalcolor = RREADIDX32(fb) & 0xffffff00;
2546      CHECK32(fb);
25002547   }
25012548
25022549   finalcvg = userdata->CurrentPixCvg + userdata->CurrentMemCvg;
r14486r14487
25162563   if (object.OtherModes.color_on_cvg && !userdata->PreWrap)
25172564   {
25182565      finalcolor = RREADIDX32(fb) & 0xffffff00;
2566      CHECK32(fb);
25192567   }
25202568
25212569   finalcvg = (userdata->CurrentPixCvg - 1) & 7;
r14486r14487
25312579   if (object.OtherModes.color_on_cvg && !userdata->PreWrap)
25322580   {
25332581      finalcolor = RREADIDX32(fb) & 0xffffff00;
2582      CHECK32(fb);
25342583   }
25352584
25362585   finalcvg = (userdata->CurrentPixCvg + userdata->CurrentMemCvg) & 7;
r14486r14487
25462595   if (object.OtherModes.color_on_cvg && !userdata->PreWrap)
25472596   {
25482597      finalcolor = RREADIDX32(fb) & 0xffffff00;
2598      CHECK32(fb);
25492599   }
25502600
25512601   RWRITEIDX32(fb, finalcolor | 0xE0);
r14486r14487
25592609   if (object.OtherModes.color_on_cvg && !userdata->PreWrap)
25602610   {
25612611      finalcolor = RREADIDX32(fb) & 0xffffff00;
2612      CHECK32(fb);
25622613   }
25632614
25642615   RWRITEIDX32(fb, finalcolor | (userdata->CurrentMemCvg << 5));
r14486r14487
25682619void n64_rdp::_Read16Bit_ImgRead0(UINT32 curpixel, rdp_span_aux *userdata, const rdp_poly_state &object)
25692620{
25702621   UINT16 fword = RREADIDX16((object.MiscState.FBAddress >> 1) + curpixel);
2622   CHECK16((object.MiscState.FBAddress >> 1) + curpixel);
25712623   userdata->MemoryColor.i.r = GETHICOL(fword);
25722624   userdata->MemoryColor.i.g = GETMEDCOL(fword);
25732625   userdata->MemoryColor.i.b = GETLOWCOL(fword);
r14486r14487
25782630void n64_rdp::_Read16Bit_ImgRead1(UINT32 curpixel, rdp_span_aux *userdata, const rdp_poly_state &object)
25792631{
25802632   UINT16 fword = RREADIDX16((object.MiscState.FBAddress >> 1) + curpixel);
2633   CHECK16((object.MiscState.FBAddress >> 1) + curpixel);
25812634   UINT8 hbyte = HREADADDR8((object.MiscState.FBAddress >> 1) + curpixel);
25822635   userdata->MemoryColor.i.r = GETHICOL(fword);
25832636   userdata->MemoryColor.i.g = GETMEDCOL(fword);
r14486r14487
25892642void n64_rdp::_Read32Bit_ImgRead0(UINT32 curpixel, rdp_span_aux *userdata, const rdp_poly_state &object)
25902643{
25912644   UINT32 mem = RREADIDX32((object.MiscState.FBAddress >> 2) + curpixel);
2645   CHECK32((object.MiscState.FBAddress >> 2) + curpixel);
25922646   userdata->MemoryColor.i.r = (mem >> 24) & 0xff;
25932647   userdata->MemoryColor.i.g = (mem >> 16) & 0xff;
25942648   userdata->MemoryColor.i.b = (mem >> 8) & 0xff;
r14486r14487
25992653void n64_rdp::_Read32Bit_ImgRead1(UINT32 curpixel, rdp_span_aux *userdata, const rdp_poly_state &object)
26002654{
26012655   UINT32 mem = RREADIDX32((object.MiscState.FBAddress >> 2) + curpixel);
2656   CHECK32((object.MiscState.FBAddress >> 2) + curpixel);
26022657   userdata->MemoryColor.i.r = (mem >> 24) & 0xff;
26032658   userdata->MemoryColor.i.g = (mem >> 16) & 0xff;
26042659   userdata->MemoryColor.i.b = (mem >> 8) & 0xff;
r14486r14487
26112666   UINT16 val = ((r >> 3) << 11) | ((g >> 3) << 6) | ((b >> 3) << 1) | ((CurrentPixCvg >> 2) & 1);
26122667   RWRITEIDX16((object.MiscState.FBAddress >> 1) + curpixel, val);
26132668   HWRITEADDR8((object.MiscState.FBAddress >> 1) + curpixel, CurrentPixCvg & 3);
2669   CHECK16((object.MiscState.FBAddress >> 1) + curpixel);
26142670}
26152671
26162672void n64_rdp::_Copy32Bit(UINT32 curpixel, UINT32 r, UINT32 g, UINT32 b, int CurrentPixCvg, const rdp_poly_state &object)
26172673{
26182674   UINT32 val = (r << 24) | (g << 16) | (b << 8) | (CurrentPixCvg << 5);
26192675   RWRITEIDX32((object.MiscState.FBAddress >> 2) + curpixel, val);
2676   CHECK32((object.MiscState.FBAddress >> 2) + curpixel);
26202677}
26212678
26222679
r14486r14487
26322689      val = (object.FillColor >> 16) & 0xffff;
26332690   }
26342691   RWRITEIDX16((object.MiscState.FBAddress >> 1) + curpixel, val);
2692   CHECK16((object.MiscState.FBAddress >> 1) + curpixel);
26352693   HWRITEADDR8((object.MiscState.FBAddress >> 1) + curpixel, ((val & 1) << 1) | (val & 1));
26362694}
26372695
r14486r14487
26392697{
26402698   UINT32 FillColor = object.FillColor;
26412699   RWRITEIDX32((object.MiscState.FBAddress >> 2) + curpixel, FillColor);
2700   CHECK32((object.MiscState.FBAddress >> 2) + curpixel);
26422701   HWRITEADDR8((object.MiscState.FBAddress >> 1) + (curpixel << 1), (FillColor & 0x10000) ? 3 : 0);
26432702   HWRITEADDR8((object.MiscState.FBAddress >> 1) + (curpixel << 1) + 1, (FillColor & 0x1) ? 3 : 0);
26442703}
r14486r14487
26502709{
26512710   DrawTriangle(shade, texture, zbuffer, false);
26522711   m_pipe_clean = false;
2712   //wait();
26532713}
26542714
26552715void n64_rdp::CmdTriangle(UINT32 w1, UINT32 w2)
r14486r14487
28312891
28322892void n64_rdp::CmdSyncFull(UINT32 w1, UINT32 w2)
28332893{
2834   //wait("SyncFull");
2894   wait("SyncFull");
28352895   dp_full_sync(*m_machine);
28362896}
28372897
r14486r14487
29623022         {
29633023            if (dststart < 2048)
29643024            {
2965               dst[dststart] = RREADIDX16(srcstart);
3025               dst[dststart] = U_RREADIDX16(srcstart);
29663026               dst[dststart + 1] = dst[dststart];
29673027               dst[dststart + 2] = dst[dststart];
29683028               dst[dststart + 3] = dst[dststart];
r14486r14487
30483108            ptr = tb + (i << 2);
30493109            srcptr = src + (i << 2);
30503110
3051            tc[(ptr ^ t) & 0x7ff] = RREADIDX16(srcptr);
3052            tc[((ptr + 1) ^ t) & 0x7ff] = RREADIDX16(srcptr + 1);
3053            tc[((ptr + 2) ^ t) & 0x7ff] = RREADIDX16(srcptr + 2);
3054            tc[((ptr + 3) ^ t) & 0x7ff] = RREADIDX16(srcptr + 3);
3111            tc[(ptr ^ t) & 0x7ff] = U_RREADIDX16(srcptr);
3112            tc[((ptr + 1) ^ t) & 0x7ff] = U_RREADIDX16(srcptr + 1);
3113            tc[((ptr + 2) ^ t) & 0x7ff] = U_RREADIDX16(srcptr + 2);
3114            tc[((ptr + 3) ^ t) & 0x7ff] = U_RREADIDX16(srcptr + 3);
30553115            j += dxt;
30563116         }
30573117      }
r14486r14487
30693129            ptr = ((tb + (i << 1)) ^ t) & 0x3ff;
30703130            srcptr = src + (i << 2);
30713131
3072            first = RREADIDX16(srcptr);
3073            sec = RREADIDX16(srcptr + 1);
3132            first = U_RREADIDX16(srcptr);
3133            sec = U_RREADIDX16(srcptr + 1);
30743134            tc[ptr] = ((first >> 8) << 8) | (sec >> 8);
30753135            tc[ptr | 0x400] = ((first & 0xff) << 8) | (sec & 0xff);
30763136
30773137            ptr = ((tb + (i << 1) + 1) ^ t) & 0x3ff;
3078            first = RREADIDX16(srcptr + 2);
3079            sec = RREADIDX16(srcptr + 3);
3138            first = U_RREADIDX16(srcptr + 2);
3139            sec = U_RREADIDX16(srcptr + 3);
30803140            tc[ptr] = ((first >> 8) << 8) | (sec >> 8);
30813141            tc[ptr | 0x400] = ((first & 0xff) << 8) | (sec & 0xff);
30823142
r14486r14487
30943154
30953155            ptr = ((tb + (i << 1)) ^ t) & 0x3ff;
30963156            srcptr = src + (i << 2);
3097            tc[ptr] = RREADIDX16(srcptr);
3098            tc[ptr | 0x400] = RREADIDX16(srcptr + 1);
3157            tc[ptr] = U_RREADIDX16(srcptr);
3158            tc[ptr | 0x400] = U_RREADIDX16(srcptr + 1);
30993159
31003160            ptr = ((tb + (i << 1) + 1) ^ t) & 0x3ff;
3101            tc[ptr] = RREADIDX16(srcptr + 2);
3102            tc[ptr | 0x400] = RREADIDX16(srcptr + 3);
3161            tc[ptr] = U_RREADIDX16(srcptr + 2);
3162            tc[ptr | 0x400] = U_RREADIDX16(srcptr + 3);
31033163
31043164            j += dxt;
31053165         }
r14486r14487
31143174         {
31153175            ptr = tb + (i << 2);
31163176            srcptr = src + (i << 2);
3117            tc[(ptr ^ WORD_ADDR_XOR) & 0x7ff] = RREADIDX16(srcptr);
3118            tc[((ptr + 1) ^ WORD_ADDR_XOR) & 0x7ff] = RREADIDX16(srcptr + 1);
3119            tc[((ptr + 2) ^ WORD_ADDR_XOR) & 0x7ff] = RREADIDX16(srcptr + 2);
3120            tc[((ptr + 3) ^ WORD_ADDR_XOR) & 0x7ff] = RREADIDX16(srcptr + 3);
3177            tc[(ptr ^ WORD_ADDR_XOR) & 0x7ff] = U_RREADIDX16(srcptr);
3178            tc[((ptr + 1) ^ WORD_ADDR_XOR) & 0x7ff] = U_RREADIDX16(srcptr + 1);
3179            tc[((ptr + 2) ^ WORD_ADDR_XOR) & 0x7ff] = U_RREADIDX16(srcptr + 2);
3180            tc[((ptr + 3) ^ WORD_ADDR_XOR) & 0x7ff] = U_RREADIDX16(srcptr + 3);
31213181         }
31223182      }
31233183      else if (tile[tilenum].format == FORMAT_YUV)
r14486r14487
31263186         {
31273187            ptr = ((tb + (i << 1)) ^ WORD_ADDR_XOR) & 0x3ff;
31283188            srcptr = src + (i << 2);
3129            first = RREADIDX16(srcptr);
3130            sec = RREADIDX16(srcptr + 1);
3189            first = U_RREADIDX16(srcptr);
3190            sec = U_RREADIDX16(srcptr + 1);
31313191            tc[ptr] = ((first >> 8) << 8) | (sec >> 8);//UV pair
31323192            tc[ptr | 0x400] = ((first & 0xff) << 8) | (sec & 0xff);
31333193
31343194            ptr = ((tb + (i << 1) + 1) ^ WORD_ADDR_XOR) & 0x3ff;
3135            first = RREADIDX16(srcptr + 2);
3136            sec = RREADIDX16(srcptr + 3);
3195            first = U_RREADIDX16(srcptr + 2);
3196            sec = U_RREADIDX16(srcptr + 3);
31373197            tc[ptr] = ((first >> 8) << 8) | (sec >> 8);
31383198            tc[ptr | 0x400] = ((first & 0xff) << 8) | (sec & 0xff);
31393199         }
r14486r14487
31443204         {
31453205            ptr = ((tb + (i << 1)) ^ WORD_ADDR_XOR) & 0x3ff;
31463206            srcptr = src + (i << 2);
3147            tc[ptr] = RREADIDX16(srcptr);
3148            tc[ptr | 0x400] = RREADIDX16(srcptr + 1);
3207            tc[ptr] = U_RREADIDX16(srcptr);
3208            tc[ptr | 0x400] = U_RREADIDX16(srcptr + 1);
31493209
31503210            ptr = ((tb + (i << 1) + 1) ^ WORD_ADDR_XOR) & 0x3ff;
3151            tc[ptr] = RREADIDX16(srcptr + 2);
3152            tc[ptr | 0x400] = RREADIDX16(srcptr + 3);
3211            tc[ptr] = U_RREADIDX16(srcptr + 2);
3212            tc[ptr | 0x400] = U_RREADIDX16(srcptr + 3);
31533213         }
31543214      }
31553215      tile[tilenum].th = tl;
r14486r14487
32023262            int xorval8 = ((j & 1) ? BYTE_XOR_DWORD_SWAP : BYTE_ADDR_XOR);
32033263            for (int i = 0; i < width; i++)
32043264            {
3205               tc[((tline + i) ^ xorval8) & 0xfff] = RREADADDR8(src + s + i);
3265               tc[((tline + i) ^ xorval8) & 0xfff] = U_RREADADDR8(src + s + i);
32063266            }
32073267         }
32083268         break;
r14486r14487
32253285               for (int i = 0; i < width; i++)
32263286               {
32273287                  UINT32 taddr = (tline + i) ^ xorval16;
3228                  tc[taddr & 0x7ff] = RREADIDX16(src + s + i);
3288                  tc[taddr & 0x7ff] = U_RREADIDX16(src + s + i);
32293289               }
32303290            }
32313291         }
r14486r14487
32413301               for (int i = 0; i < width; i++)
32423302               {
32433303                  UINT32 taddr = ((tline + i) ^ xorval8) & 0x7ff;
3244                  yuvword = RREADIDX16(src + s + i);
3304                  yuvword = U_RREADIDX16(src + s + i);
32453305                  GetTMEM()[taddr] = yuvword >> 8;
32463306                  GetTMEM()[taddr | 0x800] = yuvword & 0xff;
32473307               }
r14486r14487
32633323            int xorval32cur = (j & 1) ? WORD_XOR_DWORD_SWAP : WORD_ADDR_XOR;
32643324            for (int i = 0; i < width; i++)
32653325            {
3266               UINT32 c = RREADIDX32(src + s + i);
3326               UINT32 c = U_RREADIDX32(src + s + i);
32673327               UINT32 ptr = ((tline + i) ^ xorval32cur) & 0x3ff;
32683328               tc16[ptr] = c >> 16;
32693329               tc16[ptr | 0x400] = c & 0xffff;
r14486r14487
33983458
33993459void n64_rdp::CmdSetMaskImage(UINT32 w1, UINT32 w2)
34003460{
3461   wait("SetMaskImage");
3462
34013463   MiscState.ZBAddress = w2 & 0x01ffffff;
34023464}
34033465
34043466void n64_rdp::CmdSetColorImage(UINT32 w1, UINT32 w2)
34053467{
3468   wait("SetColorImage");
3469
34063470   MiscState.FBFormat   = (w1 >> 21) & 0x7;
34073471   MiscState.FBSize   = (w1 >> 19) & 0x3;
34083472   MiscState.FBWidth      = (w1 & 0x3ff) + 1;
34093473   MiscState.FBAddress   = w2 & 0x01ffffff;
34103474
3411   if (MiscState.FBFormat && MiscState.FBFormat != 2) // Jet Force Gemini sets the format to 4, Intensity.  Protection?
3475   if (MiscState.FBFormat < 2 || MiscState.FBFormat > 32) // Jet Force Gemini sets the format to 4, Intensity.  Protection?
34123476   {
3413      if (MiscState.FBSize == 1)
3414      {
3415         MiscState.FBFormat = 2;
3416      }
3417      else
3418      {
3419         MiscState.FBFormat = 0;
3420      }
3477      MiscState.FBFormat = 2;
34213478   }
3422
3423   if (MiscState.FBFormat != 0)
3424   {
3425      MiscState.FBFormat = 0;
3426   }
34273479}
34283480
34293481UINT32 n64_rdp::AddRightCvg(UINT32 x, UINT32 k)
r14486r14487
36343686
36353687n64_rdp::n64_rdp(n64_state &state) : poly_manager<UINT32, rdp_poly_state, 8, 32000>(state.machine())
36363688{
3637   AuxBufIndex = 0;
3638   AuxBufPtr[0] = AuxBufPtr[1] = 0;
3639   AuxBuf[0] = AuxBuf[1] = NULL;
3689   AuxBufPtr = 0;
3690   AuxBuf = NULL;
36403691   m_pipe_clean = true;
36413692
36423693   m_pending_mode_block = false;
r14486r14487
37533804
37543805   state->m_rdp->TexPipe.SetMachine(machine);
37553806
3756   state->m_rdp->AuxBuf[0] = auto_alloc_array_clear(machine, UINT8, EXTENT_AUX_COUNT);
3757   state->m_rdp->AuxBuf[1] = auto_alloc_array_clear(machine, UINT8, EXTENT_AUX_COUNT);
3807   state->m_rdp->AuxBuf = auto_alloc_array_clear(machine, UINT8, EXTENT_AUX_COUNT);
37583808
37593809   if (LOG_RDP_EXECUTION)
37603810   {
r14486r14487
37683818   n64_periphs *n64 = screen.machine().device<n64_periphs>("rcp");
37693819    state->m_rdp->visarea = screen.visible_area();
37703820
3771    int height = state->m_rdp->MiscState.FBHeight;
37723821   //UINT16 *frame_buffer = (UINT16*)&rdram[(n64->vi_origin & 0xffffff) >> 2];
37733822   //UINT8  *cvg_buffer = &state->m_rdp.HiddenBits[((n64->vi_origin & 0xffffff) >> 2) >> 1];
37743823    //int vibuffering = ((n64->vi_control & 2) && fsaa && divot);
r14486r14487
38083857    */
38093858
38103859   state->m_rdp->wait();
3811   state->m_rdp->AuxBufPtr[state->m_rdp->AuxBufIndex] = 0;
3812   state->m_rdp->AuxBufIndex ^= 1;
3860   state->m_rdp->AuxBufPtr = 0;
38133861
38143862    if (n64->vi_blank)
38153863    {
3816        for (int j = 0; j <height; j++)
3864        for (int j = 0; j < state->m_rdp->visarea.max_y; j++)
38173865        {
38183866            UINT32 *d = &bitmap.pix32(j);
38193867            for (int i = 0; i < state->m_rdp->MiscState.FBWidth; i++)
src/mame/video/n64.h
r14486r14487
5656#define MEM16_LIMIT 0x3fffff
5757#define MEM32_LIMIT 0x1fffff
5858
59#define RREADADDR8(in) /*(((in) <= MEM8_LIMIT) ?  */(((UINT8*)rdram)[(in) ^ BYTE_ADDR_XOR]) /*: 0)*/
60#define RREADIDX16(in) /*(((in) <= MEM16_LIMIT) ? */(((UINT16*)rdram)[(in) ^ WORD_ADDR_XOR]) /*: 0)*/
61#define RREADIDX32(in) /*(((in) <= MEM32_LIMIT) ? */(rdram[(in)]) /*: 0)*/
59#define RDP_RANGE_CHECK   (0)
6260
63#define RWRITEADDR8(in, val)   {/*if ((in) <= MEM8_LIMIT) */((UINT8*)rdram)[(in) ^ BYTE_ADDR_XOR] = val;}
64#define RWRITEIDX16(in, val)   {/*if ((in) <= MEM16_LIMIT)*/ ((UINT16*)rdram)[(in) ^ WORD_ADDR_XOR] = val;}
65#define RWRITEIDX32(in, val)   {/*if ((in) <= MEM32_LIMIT)*/ rdram[(in)] = val;}
61#if RDP_RANGE_CHECK
62#define CHECK8(in) if(rdp_range_check((in))) { printf("Check8: Address %08x out of range!\n", (in)); fflush(stdout); fatalerror("Address %08x out of range!\n", (in)); }
63#define CHECK16(in) if(rdp_range_check((in) << 1)) { printf("Check16: Address %08x out of range!\n", (in) << 1); fflush(stdout); fatalerror("Address %08x out of range!\n", (in) << 1); }
64#define CHECK32(in) if(rdp_range_check((in) << 2)) { printf("Check32: Address %08x out of range!\n", (in) << 2); fflush(stdout); fatalerror("Address %08x out of range!\n", (in) << 2); }
65#else
66#define CHECK8(in) { }
67#define CHECK16(in) { }
68#define CHECK32(in) { }
69#endif
6670
71#if RDP_RANGE_CHECK
72#define RREADADDR8(in) ((rdp_range_check((in))) ? 0 : (((UINT8*)rdram)[(in) ^ BYTE_ADDR_XOR]))
73#define RREADIDX16(in) ((rdp_range_check((in) << 1)) ? 0 : (((UINT16*)rdram)[(in) ^ WORD_ADDR_XOR]))
74#define RREADIDX32(in) ((rdp_range_check((in) << 2)) ? 0 : rdram[(in)])
75
76#define RWRITEADDR8(in, val)   if(rdp_range_check((in))) { printf("Write8: Address %08x out of range!\n", (in)); fflush(stdout); fatalerror("Address %08x out of range!\n", (in)); } else { ((UINT8*)rdram)[(in) ^ BYTE_ADDR_XOR] = val;}
77#define RWRITEIDX16(in, val)   if(rdp_range_check((in) << 1)) { printf("Write16: Address %08x out of range!\n", (in) << 1); fflush(stdout); fatalerror("Address %08x out of range!\n", (in) << 1); } else { ((UINT16*)rdram)[(in) ^ WORD_ADDR_XOR] = val;}
78#define RWRITEIDX32(in, val)   if(rdp_range_check((in) << 2)) { printf("Write32: Address %08x out of range!\n", (in) << 2); fflush(stdout); fatalerror("Address %08x out of range!\n", (in) << 2); } else { rdram[(in)] = val;}
79#else
80#define RREADADDR8(in) (((UINT8*)rdram)[(in) ^ BYTE_ADDR_XOR])
81#define RREADIDX16(in) (((UINT16*)rdram)[(in) ^ WORD_ADDR_XOR])
82#define RREADIDX32(in) (rdram[(in)])
83
84#define RWRITEADDR8(in, val)   ((UINT8*)rdram)[(in) ^ BYTE_ADDR_XOR] = val;
85#define RWRITEIDX16(in, val)   ((UINT16*)rdram)[(in) ^ WORD_ADDR_XOR] = val;
86#define RWRITEIDX32(in, val)   rdram[(in)] = val
87#endif
88
89#define U_RREADADDR8(in) (((UINT8*)rdram)[(in) ^ BYTE_ADDR_XOR])
90#define U_RREADIDX16(in) (((UINT16*)rdram)[(in) ^ WORD_ADDR_XOR])
91#define U_RREADIDX32(in) (rdram[(in)])
92
93#define U_RWRITEADDR8(in, val)   ((UINT8*)rdram)[(in) ^ BYTE_ADDR_XOR] = val;
94#define U_RWRITEIDX16(in, val)   ((UINT16*)rdram)[(in) ^ WORD_ADDR_XOR] = val;
95#define U_RWRITEIDX32(in, val)   rdram[(in)] = val
96
6797#define GETLOWCOL(x)   (((x) & 0x3e) << 2)
6898#define GETMEDCOL(x)   (((x) & 0x7c0) >> 3)
6999#define GETHICOL(x)      (((x) & 0xf800) >> 8)
r14486r14487
93123
94124#define RDP_CVG_SPAN_MAX         (1024)
95125
96#define EXTENT_AUX_COUNT         (sizeof(rdp_span_aux)*(480*256)) // Screen coverage *128, more or less
126#define EXTENT_AUX_COUNT         (sizeof(rdp_span_aux)*(480*192)) // Screen coverage *192, more or less
97127
98128/*****************************************************************************/
99129
r14486r14487
307337   UINT8 *blender2b_a[2];
308338};
309339
340// This is enormous and horrible
310341struct rdp_span_aux
311342{
312343   UINT32            m_unscissored_rx;
r14486r14487
568599      void          compute_cvg_noflip(extent_t *Spans, INT32* majorx, INT32* minorx, INT32* majorxint, INT32* minorxint, INT32 scanline, INT32 yh, INT32 yl, INT32 base);
569600      void          compute_cvg_flip(extent_t *Spans, INT32* majorx, INT32* minorx, INT32* majorxint, INT32* minorxint, INT32 scanline, INT32 yh, INT32 yl, INT32 base);
570601
571      void*         AuxBuf[2];
572      UINT32         AuxBufPtr[2];
602      void*         AuxBuf;
603      UINT32         AuxBufPtr;
573604      UINT32         AuxBufIndex;
574605
575606      void*         ExtentBuf[2];
576607      UINT32         ExtentBufPtr[2];
577608      UINT32         ExtentBufIndex;
578609
610      bool          rdp_range_check(UINT32 addr);
579611   protected:
580612      CombineModesT   m_combine;
581613      bool         m_pending_mode_block;
src/mess/mess.lst
r14486r14487
7979snesst    // Nintendo Super Nintendo NTSC w/Sufami Turbo base cart
8080snesbsx   // Nintendo Super Nintendo NTSC w/BS-X compatible cart
8181n64       // Nintendo N64
82n64dd     // Nintendo N64 (64DD Attachment)
8283pokemini  // Nintendo Pokemon Mini
8384
8485megaduck  // Megaduck
src/mess/drivers/n64.c
r14486r14487
2828   AM_RANGE(0x04600000, 0x046fffff) AM_DEVREADWRITE_MODERN("rcp", n64_periphs, pi_reg_r, pi_reg_w)   // Peripheral Interface
2929   AM_RANGE(0x04700000, 0x047fffff) AM_DEVREADWRITE_MODERN("rcp", n64_periphs, ri_reg_r, ri_reg_w)   // RDRAM Interface
3030   AM_RANGE(0x04800000, 0x048fffff) AM_DEVREADWRITE_MODERN("rcp", n64_periphs, si_reg_r, si_reg_w)   // Serial Interface
31   AM_RANGE(0x08000000, 0x0801ffff) AM_RAM AM_BASE(&n64_sram)      // Cartridge SRAM
32   AM_RANGE(0x10000000, 0x13ffffff) AM_ROM AM_REGION("user2", 0)   // Cartridge
33   AM_RANGE(0x1fc00000, 0x1fc007bf) AM_ROM AM_REGION("user1", 0)   // PIF ROM
31   AM_RANGE(0x08000000, 0x0801ffff) AM_RAM AM_BASE(&n64_sram)                              // Cartridge SRAM
32   AM_RANGE(0x10000000, 0x13ffffff) AM_ROM AM_REGION("user2", 0)                           // Cartridge
33   AM_RANGE(0x1fc00000, 0x1fc007bf) AM_ROM AM_REGION("user1", 0)                           // PIF ROM
3434   AM_RANGE(0x1fc007c0, 0x1fc007ff) AM_DEVREADWRITE_MODERN("rcp", n64_periphs, pif_ram_r, pif_ram_w)
3535ADDRESS_MAP_END
3636
37static ADDRESS_MAP_START( n64dd_map, AS_PROGRAM, 32 )
38   AM_RANGE(0x00000000, 0x007fffff) AM_RAM   AM_BASE(&rdram)            // RDRAM
39   AM_RANGE(0x03f00000, 0x03f00027) AM_DEVREADWRITE_MODERN("rcp", n64_periphs, rdram_reg_r, rdram_reg_w)
40   AM_RANGE(0x04000000, 0x04000fff) AM_RAM AM_SHARE("dmem")               // RSP DMEM
41   AM_RANGE(0x04001000, 0x04001fff) AM_RAM AM_SHARE("imem")               // RSP IMEM
42   AM_RANGE(0x04040000, 0x040fffff) AM_DEVREADWRITE("rsp", n64_sp_reg_r, n64_sp_reg_w)   // RSP
43   AM_RANGE(0x04100000, 0x041fffff) AM_DEVREADWRITE("rsp", n64_dp_reg_r, n64_dp_reg_w)   // RDP
44   AM_RANGE(0x04300000, 0x043fffff) AM_DEVREADWRITE_MODERN("rcp", n64_periphs, mi_reg_r, mi_reg_w)   // MIPS Interface
45   AM_RANGE(0x04400000, 0x044fffff) AM_DEVREADWRITE_MODERN("rcp", n64_periphs, vi_reg_r, vi_reg_w)   // Video Interface
46   AM_RANGE(0x04500000, 0x045fffff) AM_DEVREADWRITE_MODERN("rcp", n64_periphs, ai_reg_r, ai_reg_w)   // Audio Interface
47   AM_RANGE(0x04600000, 0x046fffff) AM_DEVREADWRITE_MODERN("rcp", n64_periphs, pi_reg_r, pi_reg_w)   // Peripheral Interface
48   AM_RANGE(0x04700000, 0x047fffff) AM_DEVREADWRITE_MODERN("rcp", n64_periphs, ri_reg_r, ri_reg_w)   // RDRAM Interface
49   AM_RANGE(0x04800000, 0x048fffff) AM_DEVREADWRITE_MODERN("rcp", n64_periphs, si_reg_r, si_reg_w)   // Serial Interface
50   AM_RANGE(0x05000000, 0x05ffffff) AM_DEVREADWRITE_MODERN("rcp", n64_periphs, dd_reg_r, dd_reg_w) // 64DD Interface
51   AM_RANGE(0x06000000, 0x063fffff) AM_ROM AM_REGION("ddipl", 0)                           // 64DD IPL ROM
52   AM_RANGE(0x08000000, 0x0801ffff) AM_RAM AM_BASE(&n64_sram)                              // Cartridge SRAM
53   AM_RANGE(0x10000000, 0x13ffffff) AM_ROM AM_REGION("user2", 0)                           // Cartridge
54   AM_RANGE(0x1fc00000, 0x1fc007bf) AM_ROM AM_REGION("user1", 0)                           // PIF ROM
55   AM_RANGE(0x1fc007c0, 0x1fc007ff) AM_DEVREADWRITE_MODERN("rcp", n64_periphs, pif_ram_r, pif_ram_w)
56ADDRESS_MAP_END
57
3758static ADDRESS_MAP_START( rsp_map, AS_PROGRAM, 32 )
3859   AM_RANGE(0x00000000, 0x00000fff) AM_RAM AM_SHARE("dmem")
3960   AM_RANGE(0x00001000, 0x00001fff) AM_RAM AM_SHARE("imem")
r14486r14487
144165      length = image.get_software_region_length("rom");
145166      memcpy(cart, image.get_software_region("rom"), length);
146167   }
168   periphs->cart_length = length;
147169
148170   if (cart[0] == 0x37 && cart[1] == 0x80)
149171   {
r14486r14487
198220   return IMAGE_INIT_PASS;
199221}
200222
223MACHINE_START( n64dd )
224{
225   MACHINE_START_CALL( n64 );
226
227   UINT8 *ipl = machine.region("ddipl")->base();
228
229   for (int i = 0; i < 0x400000; i += 4)
230   {
231      UINT8 b1 = ipl[i + 0];
232      UINT8 b2 = ipl[i + 1];
233      UINT8 b3 = ipl[i + 2];
234      UINT8 b4 = ipl[i + 3];
235      ipl[i + 0] = b1;
236      ipl[i + 1] = b2;
237      ipl[i + 2] = b3;
238      ipl[i + 3] = b4;
239   }
240}
241
201242static MACHINE_CONFIG_START( n64, n64_state )
202243
203244   /* basic machine hardware */
r14486r14487
246287   MCFG_SOFTWARE_LIST_ADD("cart_list","n64")
247288MACHINE_CONFIG_END
248289
290static MACHINE_CONFIG_DERIVED( n64dd, n64 )
291   MCFG_CPU_MODIFY("maincpu")
292   MCFG_CPU_PROGRAM_MAP(n64dd_map)
293
294   MCFG_MACHINE_START( n64dd )
295
296   MCFG_CARTSLOT_MODIFY("cart")
297   MCFG_CARTSLOT_NOT_MANDATORY
298MACHINE_CONFIG_END
299
249300ROM_START( n64 )
250301   ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASEFF )      /* dummy region for R4300 */
251302
r14486r14487
261312   ROM_LOAD( "normslp.rom", 0x00, 0x80, CRC(4f2ae525) SHA1(eab43f8cc52c8551d9cff6fced18ef80eaba6f05) )
262313ROM_END
263314
315ROM_START( n64dd )
316   ROM_REGION( 0x800000, "maincpu", ROMREGION_ERASEFF )      /* dummy region for R4300 */
317
318   ROM_REGION32_BE( 0x800, "user1", 0 )
319   ROM_LOAD( "pifdata.bin", 0x0000, 0x0800, CRC(5ec82be9) SHA1(9174eadc0f0ea2654c95fd941406ab46b9dc9bdd) )
320
321   ROM_REGION32_BE( 0x4000000, "user2", ROMREGION_ERASEFF)
322
323   ROM_REGION32_BE( 0x400000, "ddipl", ROMREGION_ERASEFF)
324   ROM_LOAD( "64ddipl.bin", 0x000000, 0x400000, CRC(7f933ce2) SHA1(bf861922dcb78c316360e3e742f4f70ff63c9bc3) )
325
326   ROM_REGION16_BE( 0x80, "normpoint", 0 )
327   ROM_LOAD( "normpnt.rom", 0x00, 0x80, CRC(e7f2a005) SHA1(c27b4a364a24daeee6e99fd286753fd6216362b4) )
328
329   ROM_REGION16_BE( 0x80, "normslope", 0 )
330   ROM_LOAD( "normslp.rom", 0x00, 0x80, CRC(4f2ae525) SHA1(eab43f8cc52c8551d9cff6fced18ef80eaba6f05) )
331ROM_END
332
264333CONS(1996, n64,    0,      0,      n64,   n64,   0,   "Nintendo", "Nintendo 64", GAME_NOT_WORKING | GAME_IMPERFECT_GRAPHICS )
334CONS(1996, n64dd,    n64,   0,      n64dd,   n64,   0,   "Nintendo", "Nintendo 64DD", GAME_NOT_WORKING | GAME_IMPERFECT_GRAPHICS )

Previous 15994 Revisions Next


© 1998-2018 The MESS Team