Previous 15994 Revisions Next

r7301 Wednesday 10th February, 2010 at 08:43:31 UTC by Fabio Priuli
[SNES] added a couple of registers to snes_ppu struct and performed a few cosmetic cleanups. also, fixed loading problem with Mode25 large carts (e.g. Tales of Phantasia & translated DQ3)
[src/mame/includes]snes.h
[src/mame/machine]snes.c
[src/mame/video]snes.c
[src/mess/machine]snescart.c

src/mame/machine/snes.c
r7300r7301
120120   // make sure we're in the 65816's context since we're messing with the OAM and stuff
121121   const address_space *space = cputag_get_address_space(machine, "maincpu", ADDRESS_SPACE_PROGRAM);
122122
123   if(!(snes_ram[INIDISP]&0x80)) //Reset OAM address, byuu says it happens at H=10
123   if (!(snes_ppu.screen_disabled)) //Reset OAM address, byuu says it happens at H=10
124124   {
125125      memory_write_byte(space, OAMADDL, snes_ppu.oam.saved_address_low ); /* Reset oam address */
126126      memory_write_byte(space, OAMADDH, snes_ppu.oam.saved_address_high );
r7300r7301
152152      }
153153   }
154154   /* Horizontal IRQ timer */
155   if( snes_ram[NMITIMEN] & 0x10 )
155   if (snes_ram[NMITIMEN] & 0x10)
156156   {
157157      int setirq = 1;
158158      int pixel = ((snes_ram[HTIMEH] << 8) | snes_ram[HTIMEL]) & 0x1ff;
r7300r7301
181181   }
182182
183183   /* Start of VBlank */
184   if( snes_ppu.beam.current_vert == snes_ppu.beam.last_visible_line )
184   if (snes_ppu.beam.current_vert == snes_ppu.beam.last_visible_line)
185185   {
186186      timer_set(machine, video_screen_get_time_until_pos(machine->primary_screen, snes_ppu.beam.current_vert, 10), NULL, 0, snes_reset_oam_address);
187187
188188      snes_ram[HVBJOY] |= 0x81;      /* Set vblank bit to on & indicate controllers being read */
189189      snes_ram[RDNMI] |= 0x80;      /* Set NMI occured bit */
190190
191      if( snes_ram[NMITIMEN] & 0x80 )   /* NMI only signaled if this bit set */
191      if (snes_ram[NMITIMEN] & 0x80)   /* NMI only signaled if this bit set */
192192      {
193193         // NMI goes off about 12 cycles after this (otherwise Chrono Trigger, NFL QB Club, etc. lock up)
194194         timer_adjust_oneshot(snes_nmi_timer, cputag_clocks_to_attotime(machine, "maincpu", 12), 0);
r7300r7301
244244      snes_ram[HVBJOY] &= 0xfe;      /* Clear busy bit */
245245   }
246246
247   if( snes_ppu.beam.current_vert == 0 )
247   if (snes_ppu.beam.current_vert == 0)
248248   {   /* VBlank is over, time for a new frame */
249249      snes_ram[HVBJOY] &= 0x7f;      /* Clear vblank bit */
250250      snes_ram[RDNMI]  &= 0x7f;      /* Clear nmi occured bit */
251      snes_ram[STAT77] &= 0x3f;      /* Clear Time Over and Range Over bits */
252251      snes_ram[STAT78] ^= 0x80;      /* Toggle field flag */
252      snes_ppu.stat77_flags &= 0x3f;   /* Clear Time Over and Range Over bits */
253253
254254      cputag_set_input_line(machine, "maincpu", G65816_LINE_NMI, CLEAR_LINE );
255255   }
r7300r7301
275275      if (video_screen_get_vpos(machine->primary_screen) > 0)
276276      {
277277         /* Do HDMA */
278         if( snes_ram[HDMAEN] )
278         if (snes_ram[HDMAEN])
279279            snes_hdma(cpu0space);
280280
281281         video_screen_update_partial(machine->primary_screen, (snes_ppu.interlace == 2) ? (snes_ppu.beam.current_vert*snes_ppu.interlace) : snes_ppu.beam.current_vert-1);
r7300r7301
301301   UINT16 value, dividend, remainder;
302302   dividend = remainder = 0;
303303   value = (snes_ram[WRDIVH] << 8) + snes_ram[WRDIVL];
304   if( snes_ram[WRDVDD] > 0 )
304   if (snes_ram[WRDVDD] > 0)
305305   {
306306      dividend = value / snes_ram[WRDVDD];
307307      remainder = value % snes_ram[WRDVDD];
r7300r7301
342342   visarea.max_x = (SNES_SCR_WIDTH * 2) - 1;
343343
344344   // fixme: should compensate for SNES_DBG_video
345   if( snes_ppu.mode == 5 || snes_ppu.mode == 6 )
345   if (snes_ram[SETINI] & 0x08 || snes_ppu.mode == 5 || snes_ppu.mode == 6 )
346346      snes_htmult = 2;
347347   else
348348      snes_htmult = 1;
r7300r7301
390390      return spc_port_out[offset & 0x3];
391391   }
392392
393   if(snes_has_addon_chip == HAS_SUPERFX && devtag_get_device(space->machine, "superfx") != NULL)
393   if (snes_has_addon_chip == HAS_SUPERFX && devtag_get_device(space->machine, "superfx") != NULL)
394394   {
395      if(offset >= 0x3000 && offset < 0x3300)
395      if (offset >= 0x3000 && offset < 0x3300)
396396      {
397397         return superfx_mmio_read(devtag_get_device(space->machine, "superfx"), offset);
398398      }
399399   }
400   else if(snes_has_addon_chip == HAS_RTC)
400   else if (snes_has_addon_chip == HAS_RTC)
401401   {
402      if(offset == 0x2800 || offset == 0x2801)
402      if (offset == 0x2800 || offset == 0x2801)
403403      {
404404         return srtc_mmio_read(space->machine, offset);
405405      }
406406   }
407   else if(snes_has_addon_chip == HAS_SDD1)
407   else if (snes_has_addon_chip == HAS_SDD1)
408408   {
409      if(offset >= 0x4800 && offset < 0x4808)
409      if (offset >= 0x4800 && offset < 0x4808)
410410      {
411411         return sdd1_mmio_read(space, (UINT32)offset);
412412      }
413      if(offset < 0x80)
413      if (offset < 0x80)
414414      {
415415         offset += 0x4300;
416416      }
417417   }
418   else if(snes_has_addon_chip == HAS_SPC7110 || snes_has_addon_chip == HAS_SPC7110_RTC)
418   else if (snes_has_addon_chip == HAS_SPC7110 || snes_has_addon_chip == HAS_SPC7110_RTC)
419419   {
420420      UINT16 limit = (snes_has_addon_chip == HAS_SPC7110_RTC) ? 0x4842 : 0x483f;
421      if(offset >= 0x4800 && offset < limit)
421      if (offset >= 0x4800 && offset < limit)
422422      {
423423         return spc7110_mmio_read(space->machine, offset);
424424      }
425425   }
426426
427427   /* offset is from 0x000000 */
428   switch( offset )
428   switch (offset)
429429   {
430430      case OAMDATA:   /* 21xy for x=0,1,2 and y=4,5,6,8,9,a returns PPU1 open bus*/
431431      case BGMODE:
r7300r7301
493493
494494            snes_ppu.ppu1_open_bus = (snes_oam[oam_addr] >> (snes_ram[OAMDATA] << 3)) & 0xff;
495495            snes_ram[OAMDATA] = (snes_ram[OAMDATA] + 1) % 2;
496            if( snes_ram[OAMDATA] == 0 )
496            if (snes_ram[OAMDATA] == 0)
497497            {
498498               snes_ppu.oam.address++;
499499               snes_ppu.oam.address_low = snes_ram[OAMADDL] = snes_ppu.oam.address & 0xff;
r7300r7301
597597            return snes_ppu.ppu2_open_bus;
598598         }
599599      case STAT77:   /* PPU status flag and version number */
600         value = snes_ram[offset] & 0xc0; // 0x80 & 0x40 are Time Over / Range Over Sprite flags, set by the video code
600         value = snes_ppu.stat77_flags & 0xc0; // 0x80 & 0x40 are Time Over / Range Over Sprite flags, set by the video code
601601         // 0x20 - Master/slave mode select. Little is known about this bit. We always seem to read back 0 here.
602602         value |= (snes_ppu.ppu1_open_bus & 0x10);
603603         value |= (snes_ppu.ppu1_version & 0x0f);
604         snes_ram[offset] = value;   // not sure if this is needed...
604         snes_ppu.stat77_flags = value;   // not sure if this is needed...
605605         snes_ppu.ppu1_open_bus = value;
606606         return snes_ppu.ppu1_open_bus;
607607      case STAT78:   /* PPU status flag and version number */
r7300r7301
631631         return snes_ram[offset];
632632      case OLDJOY1:   /* Data for old NES controllers (JOYSER1) */
633633         {
634            if( snes_ram[offset] & 0x1 )
634            if (snes_ram[offset] & 0x1)
635635            {
636636               return 0 | (snes_open_bus_r(space,0) & 0xfc); //correct?
637637            }
638638            value = ((joy1l | (joy1h << 8) | 0x10000) >> (16 - (joypad[0].oldrol & 0xf))) & 0x1;
639639            joypad[0].oldrol++;
640640            joypad[0].oldrol&=0xf;
641            if( !(joypad[0].oldrol % 17) )
641            if (!(joypad[0].oldrol % 17))
642642               value = 0x1;
643643            return (value & 0x03) | (snes_open_bus_r(space,0) & 0xfc); //correct?
644644         }
645645      case OLDJOY2:   /* Data for old NES controllers (JOYSER2) */
646646         {
647            if( snes_ram[OLDJOY1] & 0x1 )
647            if (snes_ram[OLDJOY1] & 0x1)
648648            {
649649               return 0 | 0x1c | (snes_open_bus_r(space,0) & 0xe0); //correct?
650650            }
651651            value = ((joy2l | (joy2h << 8) | 0x10000) >> (16 - (joypad[1].oldrol & 0xf))) & 0x1;
652652            joypad[1].oldrol++;
653653            joypad[1].oldrol&=0xf;
654            if( !(joypad[1].oldrol % 17) )
654            if (!(joypad[1].oldrol % 17))
655655               value = 0x1;
656656            //value |= 0x1c;    // bits 4, 3, and 2 are always set
657657            return value | 0x1c | (snes_open_bus_r(space,0) & 0xe0); //correct?
r7300r7301
765765      return;
766766   }
767767
768   if(snes_has_addon_chip == HAS_SUPERFX && devtag_get_device(space->machine, "superfx") != NULL)
768   if (snes_has_addon_chip == HAS_SUPERFX && devtag_get_device(space->machine, "superfx") != NULL)
769769   {
770      if(offset >= 0x3000 && offset < 0x3300)
770      if (offset >= 0x3000 && offset < 0x3300)
771771      {
772772         superfx_mmio_write(devtag_get_device(space->machine, "superfx"), offset, data);
773773         return;
774774      }
775775   }
776   else if(snes_has_addon_chip == HAS_RTC)
776   else if (snes_has_addon_chip == HAS_RTC)
777777   {
778      if(offset == 0x2800 || offset == 0x2801)
778      if (offset == 0x2800 || offset == 0x2801)
779779      {
780780         srtc_mmio_write(space->machine, offset, data);
781781         return;
782782      }
783783   }
784   else if(snes_has_addon_chip == HAS_SDD1)
784   else if (snes_has_addon_chip == HAS_SDD1)
785785   {
786      if((offset >= 0x4300 && offset < 0x4380) ||
786      if ((offset >= 0x4300 && offset < 0x4380) ||
787787         (offset >= 0x4800 && offset < 0x4808))
788788      {
789789         sdd1_mmio_write(space, (UINT32)offset, data);
790790         return;
791791      }
792      if(offset < 0x80)
792      if (offset < 0x80)
793793      {
794794         offset += 0x4300;
795795      }
796796   }
797   else if(snes_has_addon_chip == HAS_SPC7110 || snes_has_addon_chip == HAS_SPC7110_RTC)
797   else if (snes_has_addon_chip == HAS_SPC7110 || snes_has_addon_chip == HAS_SPC7110_RTC)
798798   {
799799      UINT16 limit = (snes_has_addon_chip == HAS_SPC7110_RTC) ? 0x4842 : 0x483f;
800      if(offset >= 0x4800 && offset < limit)
800      if (offset >= 0x4800 && offset < limit)
801801      {
802802         spc7110_mmio_write(space->machine, (UINT32)offset, data);
803803         return;
r7300r7301
805805   }
806806
807807   /* offset is from 0x000000 */
808   switch( offset )
808   switch (offset)
809809   {
810810      case INIDISP:   /* Initial settings for screen */
811         if((snes_ram[INIDISP] & 0x80) && (!(data & 0x80))) //a 1->0 force blank transition causes a reset OAM address
811         if ((snes_ppu.screen_disabled & 0x80) && (!(data & 0x80))) //a 1->0 force blank transition causes a reset OAM address
812812         {
813            memory_write_byte(space, OAMADDL, snes_ppu.oam.saved_address_low );
814            memory_write_byte(space, OAMADDH, snes_ppu.oam.saved_address_high );
813            memory_write_byte(space, OAMADDL, snes_ppu.oam.saved_address_low);
814            memory_write_byte(space, OAMADDH, snes_ppu.oam.saved_address_high);
815815         }
816         snes_ppu.screen_disabled = data & 0x80;
817         snes_ppu.screen_brightness = (data & 0x0f) + 1;
816818         break;
817819      case OBSEL:      /* Object size and data area designation */
818         snes_ppu.layer[4].data = ((data & 0x3) * 0x2000) << 1;
819         snes_ppu.oam.name_select = (((data & 0x18)>>3) * 0x1000) << 1;
820         snes_ppu.layer[SNES_OAM].data = ((data & 0x3) * 0x2000) << 1;
821         snes_ppu.oam.name_select = (((data & 0x18) >> 3) * 0x1000) << 1;
820822         /* Determine object size */
821         switch( (data & 0xe0) >> 5 )
823         switch ((data & 0xe0) >> 5)
822824         {
823825            case 0:         /* 8 & 16 */
824826               snes_ppu.oam.size[0] = 1;
r7300r7301
846848               break;
847849            default:
848850               /* Unknown size so default to 8 & 16 */
849               logerror( "Object size unsupported: %d\n", (data & 0xe0) >> 5 );
851               logerror("Object size unsupported: %d\n", (data & 0xe0) >> 5);
850852
851853               snes_ppu.oam.size[0] = 1;
852854               snes_ppu.oam.size[1] = 2;
853855#ifdef SNES_DBG_REG_W
854               mame_printf_debug( "Object size unsupported: %d\n", (data & 0xe0) >> 5 );
856               mame_printf_debug("Object size unsupported: %d\n", (data & 0xe0) >> 5);
855857#endif
856858         }
857859         break;
r7300r7301
899901               }
900902            }
901903            snes_ram[OAMDATA] = (snes_ram[OAMDATA] + 1) % 2;
902            if( snes_ram[OAMDATA] == 0 )
904            if (snes_ram[OAMDATA] == 0)
903905            {
904906               snes_ram[OAMDATA] = 0;
905907               snes_ppu.oam.address++;
r7300r7301
912914         snes_ppu.mode = data & 0x07;
913915         snes_dynamic_res_change(space->machine);
914916         snes_ppu.bg3_priority_bit = data & 0x08;
915         snes_ppu.layer[0].tile_size = (data >> 4) & 0x1;
916         snes_ppu.layer[1].tile_size = (data >> 5) & 0x1;
917         snes_ppu.layer[2].tile_size = (data >> 6) & 0x1;
918         snes_ppu.layer[3].tile_size = (data >> 7) & 0x1;
917         snes_ppu.layer[SNES_BG1].tile_size = (data >> 4) & 0x1;
918         snes_ppu.layer[SNES_BG2].tile_size = (data >> 5) & 0x1;
919         snes_ppu.layer[SNES_BG3].tile_size = (data >> 6) & 0x1;
920         snes_ppu.layer[SNES_BG4].tile_size = (data >> 7) & 0x1;
919921         snes_ppu.update_offsets = 1;
920922         break;
921923      case MOSAIC:   /* Size and screen designation for mosaic */
922924         /* FIXME: We support horizontal mosaic only partially */
923925         snes_ppu.mosaic_size = (data & 0xf0) >> 4;
924         snes_ppu.layer[0].mosaic_enabled = data & 0x01;
925         snes_ppu.layer[1].mosaic_enabled = data & 0x02;
926         snes_ppu.layer[2].mosaic_enabled = data & 0x04;
927         snes_ppu.layer[3].mosaic_enabled = data & 0x08;
926         snes_ppu.layer[SNES_BG1].mosaic_enabled = data & 0x01;
927         snes_ppu.layer[SNES_BG2].mosaic_enabled = data & 0x02;
928         snes_ppu.layer[SNES_BG3].mosaic_enabled = data & 0x04;
929         snes_ppu.layer[SNES_BG4].mosaic_enabled = data & 0x08;
928930         break;
929931      case BG1SC:      /* Address for storing SC data BG1 SC size designation */
930932      case BG2SC:      /* Address for storing SC data BG2 SC size designation  */
r7300r7301
934936         snes_ppu.layer[offset - BG1SC].map_size = data & 0x3;
935937         break;
936938      case BG12NBA:   /* Address for BG 1 and 2 character data */
937         snes_ppu.layer[0].data = (data & 0xf) << 13;
938         snes_ppu.layer[1].data = (data & 0xf0) << 9;
939         snes_ppu.layer[SNES_BG1].data = (data & 0xf) << 13;
940         snes_ppu.layer[SNES_BG2].data = (data & 0xf0) << 9;
939941         break;
940942      case BG34NBA:   /* Address for BG 3 and 4 character data */
941         snes_ppu.layer[2].data = (data & 0xf) << 13;
942         snes_ppu.layer[3].data = (data & 0xf0) << 9;
943         snes_ppu.layer[SNES_BG3].data = (data & 0xf) << 13;
944         snes_ppu.layer[SNES_BG4].data = (data & 0xf0) << 9;
943945         break;
944946
945947      // Anomie says "H Current = (Byte<<8) | (Prev&~7) | ((Current>>8)&7); V Current = (Current<<8) | Prev;" and Prev is shared by all scrolls but in Mode 7!
946948      case BG1HOFS:   /* BG1 - horizontal scroll (DW) */
947949         /* In Mode 0->6 we use ppu_last_scroll as Prev */
948         snes_ppu.layer[0].offset.horizontal = (data << 8) | (snes_ppu.ppu_last_scroll & ~7) | ((snes_ppu.layer[0].offset.horizontal >> 8) & 7);
950         snes_ppu.layer[SNES_BG1].offset.horizontal = (data << 8) | (snes_ppu.ppu_last_scroll & ~7) | ((snes_ppu.layer[SNES_BG1].offset.horizontal >> 8) & 7);
949951         snes_ppu.ppu_last_scroll = data;
950952         /* In Mode 7 we use mode7_last_scroll as Prev */
951953         snes_ppu.mode7.hor_offset = (data << 8) | (snes_ppu.mode7_last_scroll & ~7) | ((snes_ppu.mode7.hor_offset >> 8) & 7);
r7300r7301
954956         return;
955957      case BG1VOFS:   /* BG1 - vertical scroll (DW) */
956958         /* In Mode 0->6 we use ppu_last_scroll as Prev */
957         snes_ppu.layer[0].offset.vertical = (data << 8) | snes_ppu.ppu_last_scroll;
959         snes_ppu.layer[SNES_BG1].offset.vertical = (data << 8) | snes_ppu.ppu_last_scroll;
958960         snes_ppu.ppu_last_scroll = data;
959961         /* In Mode 7 we use mode7_last_scroll as Prev */
960962         snes_ppu.mode7.ver_offset = (data << 8) | snes_ppu.mode7_last_scroll;
r7300r7301
962964         snes_ppu.update_offsets = 1;
963965         return;
964966      case BG2HOFS:   /* BG2 - horizontal scroll (DW) */
965         snes_ppu.layer[1].offset.horizontal = (data << 8) | (snes_ppu.ppu_last_scroll & ~7) | ((snes_ppu.layer[1].offset.horizontal >> 8) & 7);
967         snes_ppu.layer[SNES_BG2].offset.horizontal = (data << 8) | (snes_ppu.ppu_last_scroll & ~7) | ((snes_ppu.layer[SNES_BG2].offset.horizontal >> 8) & 7);
966968         snes_ppu.ppu_last_scroll = data;
967969         snes_ppu.update_offsets = 1;
968970         return;
969971      case BG2VOFS:   /* BG2 - vertical scroll (DW) */
970         snes_ppu.layer[1].offset.vertical = (data << 8) | (snes_ppu.ppu_last_scroll);
972         snes_ppu.layer[SNES_BG2].offset.vertical = (data << 8) | (snes_ppu.ppu_last_scroll);
971973         snes_ppu.ppu_last_scroll = data;
972974         snes_ppu.update_offsets = 1;
973975         return;
974976      case BG3HOFS:   /* BG3 - horizontal scroll (DW) */
975         snes_ppu.layer[2].offset.horizontal = (data << 8) | (snes_ppu.ppu_last_scroll & ~7) | ((snes_ppu.layer[2].offset.horizontal >> 8) & 7);
977         snes_ppu.layer[SNES_BG3].offset.horizontal = (data << 8) | (snes_ppu.ppu_last_scroll & ~7) | ((snes_ppu.layer[SNES_BG3].offset.horizontal >> 8) & 7);
976978         snes_ppu.ppu_last_scroll = data;
977979         snes_ppu.update_offsets = 1;
978980         return;
979981      case BG3VOFS:   /* BG3 - vertical scroll (DW) */
980         snes_ppu.layer[2].offset.vertical = (data << 8) | (snes_ppu.ppu_last_scroll);
982         snes_ppu.layer[SNES_BG3].offset.vertical = (data << 8) | (snes_ppu.ppu_last_scroll);
981983         snes_ppu.ppu_last_scroll = data;
982984         snes_ppu.update_offsets = 1;
983985         return;
984986      case BG4HOFS:   /* BG4 - horizontal scroll (DW) */
985         snes_ppu.layer[3].offset.horizontal = (data << 8) | (snes_ppu.ppu_last_scroll & ~7) | ((snes_ppu.layer[3].offset.horizontal >> 8) & 7);
987         snes_ppu.layer[SNES_BG4].offset.horizontal = (data << 8) | (snes_ppu.ppu_last_scroll & ~7) | ((snes_ppu.layer[SNES_BG4].offset.horizontal >> 8) & 7);
986988         snes_ppu.ppu_last_scroll = data;
987989         snes_ppu.update_offsets = 1;
988990         return;
989991      case BG4VOFS:   /* BG4 - vertical scroll (DW) */
990         snes_ppu.layer[3].offset.vertical = (data << 8) | (snes_ppu.ppu_last_scroll);
992         snes_ppu.layer[SNES_BG4].offset.vertical = (data << 8) | (snes_ppu.ppu_last_scroll);
991993         snes_ppu.ppu_last_scroll = data;
992994         snes_ppu.update_offsets = 1;
993995         return;
r7300r7301
11241126      case W12SEL:   /* Window mask settings for BG1-2 */
11251127         if (data != snes_ram[offset])
11261128         {
1127            snes_ppu.layer[0].window1_invert = data & 0x01;
1128            snes_ppu.layer[0].window1_enabled = data & 0x02;
1129            snes_ppu.layer[0].window2_invert = data & 0x04;
1130            snes_ppu.layer[0].window2_enabled = data & 0x08;
1131            snes_ppu.layer[1].window1_invert = data & 0x10;
1132            snes_ppu.layer[1].window1_enabled = data & 0x20;
1133            snes_ppu.layer[1].window2_invert = data & 0x40;
1134            snes_ppu.layer[1].window2_enabled = data & 0x80;
1129            snes_ppu.layer[SNES_BG1].window1_invert = data & 0x01;
1130            snes_ppu.layer[SNES_BG1].window1_enabled = data & 0x02;
1131            snes_ppu.layer[SNES_BG1].window2_invert = data & 0x04;
1132            snes_ppu.layer[SNES_BG1].window2_enabled = data & 0x08;
1133            snes_ppu.layer[SNES_BG2].window1_invert = data & 0x10;
1134            snes_ppu.layer[SNES_BG2].window1_enabled = data & 0x20;
1135            snes_ppu.layer[SNES_BG2].window2_invert = data & 0x40;
1136            snes_ppu.layer[SNES_BG2].window2_enabled = data & 0x80;
11351137            snes_ppu.update_windows = 1;
11361138         }
11371139         break;
11381140      case W34SEL:   /* Window mask settings for BG3-4 */
11391141         if (data != snes_ram[offset])
11401142         {
1141            snes_ppu.layer[2].window1_invert = data & 0x01;
1142            snes_ppu.layer[2].window1_enabled = data & 0x02;
1143            snes_ppu.layer[2].window2_invert = data & 0x04;
1144            snes_ppu.layer[2].window2_enabled = data & 0x08;
1145            snes_ppu.layer[3].window1_invert = data & 0x10;
1146            snes_ppu.layer[3].window1_enabled = data & 0x20;
1147            snes_ppu.layer[3].window2_invert = data & 0x40;
1148            snes_ppu.layer[3].window2_enabled = data & 0x80;
1143            snes_ppu.layer[SNES_BG3].window1_invert = data & 0x01;
1144            snes_ppu.layer[SNES_BG3].window1_enabled = data & 0x02;
1145            snes_ppu.layer[SNES_BG3].window2_invert = data & 0x04;
1146            snes_ppu.layer[SNES_BG3].window2_enabled = data & 0x08;
1147            snes_ppu.layer[SNES_BG4].window1_invert = data & 0x10;
1148            snes_ppu.layer[SNES_BG4].window1_enabled = data & 0x20;
1149            snes_ppu.layer[SNES_BG4].window2_invert = data & 0x40;
1150            snes_ppu.layer[SNES_BG4].window2_enabled = data & 0x80;
11491151            snes_ppu.update_windows = 1;
11501152         }
11511153         break;
11521154      case WOBJSEL:   /* Window mask settings for objects */
11531155         if (data != snes_ram[offset])
11541156         {
1155            snes_ppu.layer[4].window1_invert = data & 0x01;
1156            snes_ppu.layer[4].window1_enabled = data & 0x02;
1157            snes_ppu.layer[4].window2_invert = data & 0x04;
1158            snes_ppu.layer[4].window2_enabled = data & 0x08;
1157            snes_ppu.layer[SNES_OAM].window1_invert = data & 0x01;
1158            snes_ppu.layer[SNES_OAM].window1_enabled = data & 0x02;
1159            snes_ppu.layer[SNES_OAM].window2_invert = data & 0x04;
1160            snes_ppu.layer[SNES_OAM].window2_enabled = data & 0x08;
11591161            snes_ppu.colour.window1_invert = data & 0x10;
11601162            snes_ppu.colour.window1_enabled = data & 0x20;
11611163            snes_ppu.colour.window2_invert = data & 0x40;
r7300r7301
11941196      case WBGLOG:   /* Window mask logic for BG's */
11951197         if (data != snes_ram[offset])
11961198         {
1197            snes_ppu.layer[0].wlog_mask = data & 0x03;
1198            snes_ppu.layer[1].wlog_mask = (data & 0x0c) >> 2;
1199            snes_ppu.layer[2].wlog_mask = (data & 0x30) >> 4;
1200            snes_ppu.layer[3].wlog_mask = (data & 0xc0) >> 6;
1199            snes_ppu.layer[SNES_BG1].wlog_mask = data & 0x03;
1200            snes_ppu.layer[SNES_BG2].wlog_mask = (data & 0x0c) >> 2;
1201            snes_ppu.layer[SNES_BG3].wlog_mask = (data & 0x30) >> 4;
1202            snes_ppu.layer[SNES_BG4].wlog_mask = (data & 0xc0) >> 6;
12011203            snes_ppu.update_windows = 1;
12021204         }
12031205         break;
12041206      case WOBJLOG:   /* Window mask logic for objects */
12051207         if (data != snes_ram[offset])
12061208         {
1207            snes_ppu.layer[4].wlog_mask = data & 0x03;
1209            snes_ppu.layer[SNES_OAM].wlog_mask = data & 0x03;
12081210            snes_ppu.colour.wlog_mask = (data & 0x0c) >> 2;
12091211            snes_ppu.update_windows = 1;
12101212         }
r7300r7301
12241226         snes_ppu.sub_bg_enabled[4] = data & 0x10;
12251227         break;
12261228      case TMW:      /* Window mask for main screen designation */
1227         snes_ppu.layer[0].main_window_enabled = data & 0x01;
1228         snes_ppu.layer[1].main_window_enabled = data & 0x02;
1229         snes_ppu.layer[2].main_window_enabled = data & 0x04;
1230         snes_ppu.layer[3].main_window_enabled = data & 0x08;
1231         snes_ppu.layer[4].main_window_enabled = data & 0x10;
1229         snes_ppu.layer[SNES_BG1].main_window_enabled = data & 0x01;
1230         snes_ppu.layer[SNES_BG2].main_window_enabled = data & 0x02;
1231         snes_ppu.layer[SNES_BG3].main_window_enabled = data & 0x04;
1232         snes_ppu.layer[SNES_BG4].main_window_enabled = data & 0x08;
1233         snes_ppu.layer[SNES_OAM].main_window_enabled = data & 0x10;
12321234         break;
12331235      case TSW:      /* Window mask for subscreen designation */
1234         snes_ppu.layer[0].sub_window_enabled = data & 0x01;
1235         snes_ppu.layer[1].sub_window_enabled = data & 0x02;
1236         snes_ppu.layer[2].sub_window_enabled = data & 0x04;
1237         snes_ppu.layer[3].sub_window_enabled = data & 0x08;
1238         snes_ppu.layer[4].sub_window_enabled = data & 0x10;
1236         snes_ppu.layer[SNES_BG1].sub_window_enabled = data & 0x01;
1237         snes_ppu.layer[SNES_BG2].sub_window_enabled = data & 0x02;
1238         snes_ppu.layer[SNES_BG3].sub_window_enabled = data & 0x04;
1239         snes_ppu.layer[SNES_BG4].sub_window_enabled = data & 0x08;
1240         snes_ppu.layer[SNES_OAM].sub_window_enabled = data & 0x10;
12391241         break;
12401242      case CGWSEL:   /* Initial settings for Fixed colour addition or screen addition */
12411243         /* FIXME: We don't support direct select for modes 3 & 4 or subscreen window stuff */
r7300r7301
12441246         snes_ppu.sub_add_mode = data & 0x02;
12451247         snes_ppu.direct_color  = data & 0x01;
12461248#ifdef SNES_DBG_REG_W
1247         if( (data & 0x2) != (snes_ram[CGWSEL] & 0x2) )
1249         if ((data & 0x2) != (snes_ram[CGWSEL] & 0x2))
12481250            mame_printf_debug( "Add/Sub Layer: %s\n", ((data & 0x2) >> 1) ? "Subscreen" : "Fixed colour" );
12491251#endif
12501252         break;
12511253      case CGADSUB:   /* Addition/Subtraction designation for each screen */
1254         snes_ppu.color_modes = data & 0xc0;
12521255         {
12531256            UINT8 sub = (data & 0x80) >> 7;
1254            snes_ppu.layer[0].blend = (data & 0x1) << sub;
1255            snes_ppu.layer[1].blend = ((data & 0x2) >> 1) << sub;
1256            snes_ppu.layer[2].blend = ((data & 0x4) >> 2) << sub;
1257            snes_ppu.layer[3].blend = ((data & 0x8) >> 3) << sub;
1258            snes_ppu.layer[4].blend = ((data & 0x10) >> 4) << sub;
1257            snes_ppu.layer[SNES_BG1].blend = (data & 0x1) << sub;
1258            snes_ppu.layer[SNES_BG2].blend = ((data & 0x2) >> 1) << sub;
1259            snes_ppu.layer[SNES_BG3].blend = ((data & 0x4) >> 2) << sub;
1260            snes_ppu.layer[SNES_BG4].blend = ((data & 0x8) >> 3) << sub;
1261            snes_ppu.layer[SNES_OAM].blend = ((data & 0x10) >> 4) << sub;
12591262         } break;
12601263      case COLDATA:   /* Fixed colour data for fixed colour addition/subtraction */
12611264         {
1262            /* Store it in the extra space we made in the CGRAM
1263                 * It doesn't really go there, but it's as good a place as any. */
1264            UINT8 r,g,b;
1265            /* Store it in the extra space we made in the CGRAM. It doesn't really go there, but it's as good a place as any. */
1266            UINT8 r, g, b;
12651267
12661268            /* Get existing value. */
12671269            r = snes_cgram[FIXED_COLOUR] & 0x1f;
12681270            g = (snes_cgram[FIXED_COLOUR] & 0x3e0) >> 5;
12691271            b = (snes_cgram[FIXED_COLOUR] & 0x7c00) >> 10;
12701272            /* Set new value */
1271            if( data & 0x20 )
1273            if (data & 0x20)
12721274               r = data & 0x1f;
1273            if( data & 0x40 )
1275            if (data & 0x40)
12741276               g = data & 0x1f;
1275            if( data & 0x80 )
1277            if (data & 0x80)
12761278               b = data & 0x1f;
12771279            snes_cgram[FIXED_COLOUR] = (r | (g << 5) | (b << 10));
12781280         } break;
12791281      case SETINI:   /* Screen mode/video select */
12801282         /* FIXME: We only support line count and interlace here */
1281         snes_ppu.interlace = (data & 1) ? 2 : 1;
1282         snes_ppu.obj_interlace = (data & 2) ? 2 : 1;
1283         snes_ppu.beam.last_visible_line = (data & 0x4) ? 240 : 225;
1283         snes_ppu.interlace = (data & 0x01) ? 2 : 1;
1284         snes_ppu.obj_interlace = (data & 0x02) ? 2 : 1;
1285         snes_ppu.beam.last_visible_line = (data & 0x04) ? 240 : 225;
1286         snes_ppu.pseudo_hires = data & 0x08;
1287         snes_ppu.mode7.extbg = data & 0x40;
12841288         snes_dynamic_res_change(space->machine);
12851289#ifdef SNES_DBG_REG_W
1286         if( (data & 0x8) != (snes_ram[SETINI] & 0x8) )
1290         if ((data & 0x8) != (snes_ram[SETINI] & 0x8))
12871291            mame_printf_debug( "Pseudo 512 mode: %s\n", (data & 0x8) ? "on" : "off" );
12881292#endif
12891293         break;
r7300r7301
13021306      case WMADDH:   /* Address to read/write to wram (high) */
13031307         break;
13041308      case OLDJOY1:   /* Old NES joystick support */
1305         if( ((data & 0x1) && !(snes_ram[offset] & 0x1)) || ((!(data & 0x1)) && (snes_ram[offset] & 0x1)) )
1309         if (((data & 0x1) && !(snes_ram[offset] & 0x1)) || ((!(data & 0x1)) && (snes_ram[offset] & 0x1)))
13061310         {
13071311            joypad[0].oldrol = 0;
13081312            joypad[1].oldrol = 0;
r7300r7301
13411345         data = 0;   /* Once DMA is done we need to reset all bits to 0 */
13421346         break;
13431347      case HDMAEN:   /* HDMA channel designation */
1344         if(data) //if a HDMA is enabled, data is inited at the next scanline
1348         if (data) //if a HDMA is enabled, data is inited at the next scanline
13451349            timer_set(space->machine, video_screen_get_time_until_pos(space->machine->primary_screen, snes_ppu.beam.current_vert+1, 0), NULL, 0, snes_reset_hdma);
13461350         break;
13471351      case MEMSEL:   /* Access cycle designation in memory (2) area */
r7300r7301
13491353             * Currently we are just increasing it no matter what */
13501354//          cpu_set_clockscale(devtag_get_device(space->machine, "maincpu"), (data & 0x1) ? 1.335820896 : 1.0 );
13511355#ifdef SNES_DBG_REG_W
1352         if( (data & 0x1) != (snes_ram[MEMSEL] & 0x1) )
1356         if ((data & 0x1) != (snes_ram[MEMSEL] & 0x1))
13531357            mame_printf_debug( "CPU speed: %f Mhz\n", (data & 0x1) ? 3.58 : 2.68 );
13541358#endif
13551359         break;
r7300r7301
15861590   else if (snes_cart.mode & 5)                     /* Mode 20 & 22 */
15871591   {
15881592      if ((address < 0x8000) && (snes_cart.mode == SNES_MODE_20)) //FIXME: check this
1589         value =  snes_ram[0x200000 + ((offset & ~0x8000) | 0x8000)];                     /* Reserved */
1593      {   
1594         value = 0xff;                     /* Reserved */
1595         //value =  snes_ram[0x200000 + ((offset & ~0x8000) | 0x8000)];   // is this hack still needed?   /* Reserved */
1596      }
15901597      else
15911598         value = snes_ram[0x400000 + offset];
15921599   }
r7300r7301
16681675
16691676   if (address < 0x8000)
16701677   {
1671      if(address >= 0x6000 && snes_has_addon_chip == HAS_SUPERFX && devtag_get_device(space->machine, "superfx") != NULL)
1678      if (address >= 0x6000 && snes_has_addon_chip == HAS_SUPERFX && devtag_get_device(space->machine, "superfx") != NULL)
16721679         logerror( "snes_r_bank6 hit in Super FX mode, please fix me\n" );
16731680      else if (snes_cart.mode != SNES_MODE_25)
16741681         value = memory_read_byte(space, offset);
r7300r7301
17131720   UINT8 value = 0;
17141721   UINT16 address = offset & 0xffff;
17151722
1716   if(snes_has_addon_chip == HAS_SDD1)
1723   if (snes_has_addon_chip == HAS_SDD1)
17171724   {
17181725      return sdd1_read(space->machine, offset);
17191726   }
1720   else if(snes_has_addon_chip == HAS_SUPERFX && devtag_get_device(space->machine, "superfx") != NULL)
1727   else if (snes_has_addon_chip == HAS_SUPERFX && devtag_get_device(space->machine, "superfx") != NULL)
17211728   {
17221729      logerror( "snes_r_bank7 hit in Super FX mode, please fix me\n" );
17231730   }
r7300r7301
18941901      {
18951902         logerror( "snes_w_bank6 hit (RAM) in Super FX mode, please fix me\n" );
18961903      }
1897      else if(snes_has_addon_chip == HAS_CX4)
1904      else if (snes_has_addon_chip == HAS_CX4)
18981905      {
18991906         //printf( "R: CX4 hit from 0x800000\n" );
19001907      }
r7300r7301
20942101   }
20952102
20962103   // init frame counter so first line is 0
2097   if( ATTOSECONDS_TO_HZ(video_screen_get_frame_period(machine->primary_screen).attoseconds) >= 59 )
2104   if (ATTOSECONDS_TO_HZ(video_screen_get_frame_period(machine->primary_screen).attoseconds) >= 59)
20982105   {
20992106      snes_ppu.beam.current_vert = SNES_VTOTAL_NTSC;
21002107   }
r7300r7301
21092116   UINT8 mask = 1, dma = 0, i;
21102117
21112118   snes_hdma_chnl = snes_ram[HDMAEN];
2112   for( i = 0; i < 8; i++ )
2119   for (i = 0; i < 8; i++)
21132120   {
2114      if( snes_ram[HDMAEN] & mask )
2121      if (snes_ram[HDMAEN] & mask)
21152122      {
21162123         snes_ram[SNES_DMA_BASE + dma + 8] = snes_ram[SNES_DMA_BASE + dma + 2];
21172124         snes_ram[SNES_DMA_BASE + dma + 9] = snes_ram[SNES_DMA_BASE + dma + 3];
r7300r7301
21502157   snes_ram[WRDIVL] = 0xff;
21512158   snes_ram[WRDIVH] = 0xff;
21522159
2153   switch(snes_has_addon_chip)
2160   switch (snes_has_addon_chip)
21542161   {
21552162      case HAS_SDD1:
21562163         sdd1_init(machine);
r7300r7301
21722179   snes_init_ram(machine);
21732180
21742181   /* Set STAT78 to NTSC or PAL */
2175   if( ATTOSECONDS_TO_HZ(video_screen_get_frame_period(machine->primary_screen).attoseconds) >= 59.0f )
2182   if (ATTOSECONDS_TO_HZ(video_screen_get_frame_period(machine->primary_screen).attoseconds) >= 59.0f)
21762183      snes_ram[STAT78] = SNES_NTSC;
2177   else /* if( ATTOSECONDS_TO_HZ(video_screen_get_frame_period(machine->primary_screen).attoseconds) == 50.0f ) */
2184   else /* if (ATTOSECONDS_TO_HZ(video_screen_get_frame_period(machine->primary_screen).attoseconds) == 50.0f) */
21782185      snes_ram[STAT78] = SNES_PAL;
21792186
21802187   // reset does this to these registers
r7300r7301
23312338   UINT32 abus;
23322339
23332340   /* Assume priority of the 8 DMA channels is 0-7 */
2334   for( i = 0; i < 8; i++ )
2341   for (i = 0; i < 8; i++)
23352342   {
2336      if( snes_hdma_chnl & mask )
2343      if (snes_hdma_chnl & mask)
23372344      {
23382345         /* Check if we need to read a new line from the table */
2339         if( !(snes_ram[SNES_DMA_BASE + dma + 0xa] & 0x7f ) )
2346         if (!(snes_ram[SNES_DMA_BASE + dma + 0xa] & 0x7f))
23402347         {
23412348            abus = (snes_ram[SNES_DMA_BASE + dma + 4] << 16) + (snes_ram[SNES_DMA_BASE + dma + 9] << 8) + snes_ram[SNES_DMA_BASE + dma + 8];
23422349
23432350            /* Get the number of lines */
23442351            snes_ram[SNES_DMA_BASE + dma + 0xa] = memory_read_byte(space, abus);
2345            if( !snes_ram[SNES_DMA_BASE + dma + 0xa] )
2352            if (!snes_ram[SNES_DMA_BASE + dma + 0xa])
23462353            {
23472354               /* No more lines so clear HDMA */
23482355               snes_hdma_chnl &= ~mask;
r7300r7301
23512358            abus++;
23522359            snes_ram[SNES_DMA_BASE + dma + 8] = abus & 0xff;
23532360            snes_ram[SNES_DMA_BASE + dma + 9] = (abus >> 8) & 0xff;
2354            if( snes_ram[SNES_DMA_BASE + dma] & 0x40 )
2361            if (snes_ram[SNES_DMA_BASE + dma] & 0x40)
23552362            {
23562363               snes_ram[SNES_DMA_BASE + dma + 5] = memory_read_byte(space, abus++);
23572364               snes_ram[SNES_DMA_BASE + dma + 6] = memory_read_byte(space, abus++);
r7300r7301
23632370         contmode = (--snes_ram[SNES_DMA_BASE + dma + 0xa]) & 0x80;
23642371
23652372         /* Transfer addresses */
2366         if( snes_ram[SNES_DMA_BASE + dma] & 0x40 )   /* Indirect */
2373         if (snes_ram[SNES_DMA_BASE + dma] & 0x40)   /* Indirect */
23672374            abus = (snes_ram[SNES_DMA_BASE + dma + 7] << 16) + (snes_ram[SNES_DMA_BASE + dma + 6] << 8) + snes_ram[SNES_DMA_BASE + dma + 5];
23682375         else                           /* Absolute */
23692376            abus = (snes_ram[SNES_DMA_BASE + dma + 4] << 16) + (snes_ram[SNES_DMA_BASE + dma + 9] << 8) + snes_ram[SNES_DMA_BASE + dma + 8];
r7300r7301
23732380         mame_printf_debug( "HDMA-Ch: %d(%s) abus: %X bbus: %X type: %d(%X %X)\n", i, snes_ram[SNES_DMA_BASE + dma] & 0x40 ? "Indirect" : "Absolute", abus, bbus, snes_ram[SNES_DMA_BASE + dma] & 0x7, snes_ram[SNES_DMA_BASE + dma + 8],snes_ram[SNES_DMA_BASE + dma + 9] );
23742381#endif
23752382
2376         switch( snes_ram[SNES_DMA_BASE + dma] & 0x7 )
2383         switch (snes_ram[SNES_DMA_BASE + dma] & 0x7)
23772384         {
23782385            case 0:      /* 1 address */
23792386            {
r7300r7301
24202427         }
24212428
24222429         /* Update address */
2423         if( contmode )
2430         if (contmode)
24242431         {
2425            if( snes_ram[SNES_DMA_BASE + dma] & 0x40 )   /* Indirect */
2432            if (snes_ram[SNES_DMA_BASE + dma] & 0x40)   /* Indirect */
24262433            {
24272434               snes_ram[SNES_DMA_BASE + dma + 5] = abus & 0xff;
24282435               snes_ram[SNES_DMA_BASE + dma + 6] = (abus >> 8) & 0xff;
r7300r7301
24342441            }
24352442         }
24362443
2437         if( !(snes_ram[SNES_DMA_BASE + dma + 0xa] & 0x7f) )
2444         if (!(snes_ram[SNES_DMA_BASE + dma + 0xa] & 0x7f))
24382445         {
2439            if( !(snes_ram[SNES_DMA_BASE + dma] & 0x40) )   /* Absolute */
2446            if (!(snes_ram[SNES_DMA_BASE + dma] & 0x40))   /* Absolute */
24402447            {
2441               if( !contmode )
2448               if (!contmode)
24422449               {
24432450                  snes_ram[SNES_DMA_BASE + dma + 8] = abus & 0xff;
24442451                  snes_ram[SNES_DMA_BASE + dma + 9] = (abus >> 8) & 0xff;
r7300r7301
24592466   UINT32 abus, abus_bank, length;
24602467
24612468   /* Assume priority of the 8 DMA channels is 0-7 */
2462   for( i = 0; i < 8; i++ )
2469   for (i = 0; i < 8; i++)
24632470   {
2464      if( channels & mask )
2471      if (channels & mask)
24652472      {
24662473         //printf( "Making a transfer on channel %d\n", i );
24672474         /* Find transfer addresses */
r7300r7301
24712478
24722479         //printf( "Address: %06x\n", abus | abus_bank );
24732480         /* Auto increment */
2474         if( snes_ram[SNES_DMA_BASE + dma] & 0x8 )
2481         if (snes_ram[SNES_DMA_BASE + dma] & 0x8)
24752482         {
24762483            increment = 0;
24772484         }
24782485         else
24792486         {
2480            if( snes_ram[SNES_DMA_BASE + dma] & 0x10 )
2487            if (snes_ram[SNES_DMA_BASE + dma] & 0x10)
24812488               increment = -1;
24822489            else
24832490               increment = 1;
r7300r7301
24852492
24862493         /* Number of bytes to transfer */
24872494         length = (snes_ram[SNES_DMA_BASE + dma + 6] << 8) + snes_ram[SNES_DMA_BASE + dma + 5];
2488         if( !length )
2495         if (!length)
24892496            length = 0x10000;   /* 0x0000 really means 0x10000 */
24902497
24912498//          printf( "GDMA-Ch %d: len: %X, abus: %X, bbus: %X, incr: %d, dir: %s, type: %d\n", i, length, abus, bbus, increment, snes_ram[SNES_DMA_BASE + dma] & 0x80 ? "PPU->CPU" : "CPU->PPU", snes_ram[SNES_DMA_BASE + dma] & 0x7 );
r7300r7301
24942501         mame_printf_debug( "GDMA-Ch %d: len: %X, abus: %X, bbus: %X, incr: %d, dir: %s, type: %d\n", i, length, abus, bbus, increment, snes_ram[SNES_DMA_BASE + dma] & 0x80 ? "PPU->CPU" : "CPU->PPU", snes_ram[SNES_DMA_BASE + dma] & 0x7 );
24952502#endif
24962503
2497         switch( snes_ram[SNES_DMA_BASE + dma] & 0x7 )
2504         switch (snes_ram[SNES_DMA_BASE + dma] & 0x7)
24982505         {
24992506            case 0:      /* 1 address */
25002507            case 2:      /* 1 address ?? */
25012508            case 6:
25022509            {
2503               while( length-- )
2510               while (length--)
25042511               {
2505                  if( snes_ram[SNES_DMA_BASE + dma] & 0x80 )   /* PPU->CPU */
2512                  if (snes_ram[SNES_DMA_BASE + dma] & 0x80)   /* PPU->CPU */
25062513                     memory_write_byte(space, ((abus & 0xffff) | (abus_bank)), memory_read_byte(space, bbus) );
25072514                  else                           /* CPU->PPU */
25082515                     memory_write_byte(space, bbus, memory_read_byte(space, ((abus & 0xffff) | (abus_bank))) );
r7300r7301
25122519            case 1:      /* 2 addresses (l,h) */
25132520            case 5:
25142521            {
2515               while( length-- )
2522               while (length--)
25162523               {
2517                  if( snes_ram[SNES_DMA_BASE + dma] & 0x80 )   /* PPU->CPU */
2524                  if (snes_ram[SNES_DMA_BASE + dma] & 0x80)   /* PPU->CPU */
25182525                     memory_write_byte(space, ((abus & 0xffff) | (abus_bank)), memory_read_byte(space, bbus) );
25192526                  else                           /* CPU->PPU */
25202527                     memory_write_byte(space, bbus, memory_read_byte(space, ((abus & 0xffff) | (abus_bank))) );
25212528                  abus += increment;
2522                  if( !(length--) )
2529                  if (!(length--))
25232530                     break;
2524                  if( snes_ram[SNES_DMA_BASE + dma] & 0x80 )   /* PPU->CPU */
2531                  if (snes_ram[SNES_DMA_BASE + dma] & 0x80)   /* PPU->CPU */
25252532                     memory_write_byte(space, ((abus & 0xffff) | (abus_bank)), memory_read_byte(space, bbus + 1) );
25262533                  else                           /* CPU->PPU */
25272534                     memory_write_byte(space, bbus + 1, memory_read_byte(space, ((abus & 0xffff) | (abus_bank))) );
r7300r7301
25312538            case 3:      /* 2 addresses/write twice (l,l,h,h) */
25322539            case 7:
25332540            {
2534               while( length-- )
2541               while (length--)
25352542               {
2536                  if( snes_ram[SNES_DMA_BASE + dma] & 0x80 )   /* PPU->CPU */
2543                  if (snes_ram[SNES_DMA_BASE + dma] & 0x80)   /* PPU->CPU */
25372544                     memory_write_byte(space, ((abus & 0xffff) | (abus_bank)), memory_read_byte(space, bbus) );
25382545                  else                           /* CPU->PPU */
25392546                     memory_write_byte(space, bbus, memory_read_byte(space, ((abus & 0xffff) | (abus_bank))) );
25402547                  abus += increment;
2541                  if( !(length--) )
2548                  if (!(length--))
25422549                     break;
2543                  if( snes_ram[SNES_DMA_BASE + dma] & 0x80 )   /* PPU->CPU */
2550                  if (snes_ram[SNES_DMA_BASE + dma] & 0x80)   /* PPU->CPU */
25442551                     memory_write_byte(space, ((abus & 0xffff) | (abus_bank)), memory_read_byte(space, bbus) );
25452552                  else                           /* CPU->PPU */
25462553                     memory_write_byte(space, bbus, memory_read_byte(space, ((abus & 0xffff) | (abus_bank))) );
25472554                  abus += increment;
2548                  if( !(length--) )
2555                  if (!(length--))
25492556                     break;
2550                  if( snes_ram[SNES_DMA_BASE + dma] & 0x80 )   /* PPU->CPU */
2557                  if (snes_ram[SNES_DMA_BASE + dma] & 0x80)   /* PPU->CPU */
25512558                     memory_write_byte(space, ((abus & 0xffff) | (abus_bank)), memory_read_byte(space, bbus + 1) );
25522559                  else                           /* CPU->PPU */
25532560                     memory_write_byte(space, bbus + 1, memory_read_byte(space, ((abus & 0xffff) | (abus_bank))) );
25542561                  abus += increment;
2555                  if( !(length--) )
2562                  if (!(length--))
25562563                     break;
2557                  if( snes_ram[SNES_DMA_BASE + dma] & 0x80 )   /* PPU->CPU */
2564                  if (snes_ram[SNES_DMA_BASE + dma] & 0x80)   /* PPU->CPU */
25582565                     memory_write_byte(space, ((abus & 0xffff) | (abus_bank)), memory_read_byte(space, bbus + 1) );
25592566                  else                           /* CPU->PPU */
25602567                     memory_write_byte(space, bbus + 1, memory_read_byte(space, ((abus & 0xffff) | (abus_bank))) );
r7300r7301
25632570            } break;
25642571            case 4:      /* 4 addresses (l,h,l,h) */
25652572            {
2566               while( length-- )
2573               while (length--)
25672574               {
2568                  if( snes_ram[SNES_DMA_BASE + dma] & 0x80 )   /* PPU->CPU */
2575                  if (snes_ram[SNES_DMA_BASE + dma] & 0x80)   /* PPU->CPU */
25692576                     memory_write_byte(space, ((abus & 0xffff) | (abus_bank)), memory_read_byte(space, bbus) );
25702577                  else                           /* CPU->PPU */
25712578                     memory_write_byte(space, bbus, memory_read_byte(space, ((abus & 0xffff) | (abus_bank))) );
25722579                  abus += increment;
2573                  if( !(length--) )
2580                  if (!(length--))
25742581                     break;
2575                  if( snes_ram[SNES_DMA_BASE + dma] & 0x80 )   /* PPU->CPU */
2582                  if (snes_ram[SNES_DMA_BASE + dma] & 0x80)   /* PPU->CPU */
25762583                     memory_write_byte(space, ((abus & 0xffff) | (abus_bank)), memory_read_byte(space, bbus + 1) );
25772584                  else                           /* CPU->PPU */
25782585                     memory_write_byte(space, bbus + 1, memory_read_byte(space, ((abus & 0xffff) | (abus_bank))) );
25792586                  abus += increment;
2580                  if( !(length--) )
2587                  if (!(length--))
25812588                     break;
2582                  if( snes_ram[SNES_DMA_BASE + dma] & 0x80 )   /* PPU->CPU */
2589                  if (snes_ram[SNES_DMA_BASE + dma] & 0x80)   /* PPU->CPU */
25832590                     memory_write_byte(space, ((abus & 0xffff) | (abus_bank)), memory_read_byte(space, bbus + 2) );
25842591                  else                           /* CPU->PPU */
25852592                     memory_write_byte(space, bbus + 2, memory_read_byte(space, ((abus & 0xffff) | (abus_bank))) );
25862593                  abus += increment;
2587                  if( !(length--) )
2594                  if (!(length--))
25882595                     break;
2589                  if( snes_ram[SNES_DMA_BASE + dma] & 0x80 )   /* PPU->CPU */
2596                  if (snes_ram[SNES_DMA_BASE + dma] & 0x80)   /* PPU->CPU */
25902597                     memory_write_byte(space, ((abus & 0xffff) | (abus_bank)), memory_read_byte(space, bbus + 3) );
25912598                  else                           /* CPU->PPU */
25922599                     memory_write_byte(space, bbus + 3, memory_read_byte(space, ((abus & 0xffff) | (abus_bank))) );
src/mame/includes/snes.h
r7300r7301
5454#define SNES_EXROM_START   0x1000000
5555#define FIXED_COLOUR      256      /* Position in cgram for fixed colour */
5656/* Definitions for PPU Memory-Mapped registers */
57#define INIDISP         0x2100
58#define OBSEL         0x2101
59#define OAMADDL         0x2102
60#define OAMADDH         0x2103
61#define OAMDATA         0x2104
62#define BGMODE         0x2105   /* abcdefff = abcd: bg4-1 tile size | e: BG3 high priority | f: mode */
63#define MOSAIC         0x2106   /* xxxxabcd = x: pixel size | abcd: affects bg 1-4 */
64#define BG1SC         0x2107
65#define BG2SC         0x2108
66#define BG3SC         0x2109
67#define BG4SC         0x210A
68#define BG12NBA         0x210B
69#define BG34NBA         0x210C
70#define BG1HOFS         0x210D
71#define BG1VOFS         0x210E
72#define BG2HOFS         0x210F
73#define BG2VOFS         0x2110
74#define BG3HOFS         0x2111
75#define BG3VOFS         0x2112
76#define BG4HOFS         0x2113
77#define BG4VOFS         0x2114
78#define VMAIN         0x2115   /* i---ffrr = i: Increment timing | f: Full graphic | r: increment rate */
79#define VMADDL         0x2116   /* aaaaaaaa = a: LSB of vram address */
80#define VMADDH         0x2117   /* aaaaaaaa = a: MSB of vram address */
81#define VMDATAL         0x2118   /* dddddddd = d: data to be written */
82#define VMDATAH         0x2119   /* dddddddd = d: data to be written */
83#define M7SEL         0x211A   /* ab----yx = a: screen over | y: vertical flip | x: horizontal flip */
84#define M7A            0x211B   /* aaaaaaaa = a: COSINE rotate angle / X expansion */
85#define M7B            0x211C   /* aaaaaaaa = a: SINE rotate angle / X expansion */
86#define M7C            0x211D   /* aaaaaaaa = a: SINE rotate angle / Y expansion */
87#define M7D            0x211E   /* aaaaaaaa = a: COSINE rotate angle / Y expansion */
88#define M7X            0x211F
89#define M7Y            0x2120
90#define CGADD         0x2121
91#define CGDATA         0x2122
92#define W12SEL         0x2123
93#define W34SEL         0x2124
94#define WOBJSEL         0x2125
95#define WH0            0x2126   /* pppppppp = p: Left position of window 1 */
96#define WH1            0x2127   /* pppppppp = p: Right position of window 1 */
97#define WH2            0x2128   /* pppppppp = p: Left position of window 2 */
98#define WH3            0x2129   /* pppppppp = p: Right position of window 2 */
99#define WBGLOG         0x212A   /* aabbccdd = a: BG4 params | b: BG3 params | c: BG2 params | d: BG1 params */
100#define WOBJLOG         0x212B   /* ----ccoo = c: Colour window params | o: Object window params */
101#define TM            0x212C
102#define TS            0x212D
103#define TMW            0x212E
104#define TSW            0x212F
105#define CGWSEL         0x2130
106#define CGADSUB         0x2131
107#define COLDATA         0x2132
108#define SETINI         0x2133
109#define MPYL         0x2134
110#define MPYM         0x2135
111#define MPYH         0x2136
112#define SLHV         0x2137
113#define ROAMDATA      0x2138
114#define RVMDATAL      0x2139
115#define RVMDATAH      0x213A
116#define RCGDATA         0x213B
117#define OPHCT         0x213C
118#define OPVCT         0x213D
119#define STAT77         0x213E
120#define STAT78         0x213F
121#define APU00         0x2140
122#define APU01         0x2141
123#define APU02         0x2142
124#define APU03         0x2143
125#define WMDATA         0x2180
126#define WMADDL         0x2181
127#define WMADDM         0x2182
128#define WMADDH         0x2183
57#define INIDISP        0x2100
58#define OBSEL          0x2101
59#define OAMADDL        0x2102
60#define OAMADDH        0x2103
61#define OAMDATA        0x2104
62#define BGMODE         0x2105   /* abcdefff = abcd: bg4-1 tile size | e: BG3 high priority | f: mode */
63#define MOSAIC         0x2106   /* xxxxabcd = x: pixel size | abcd: affects bg 1-4 */
64#define BG1SC          0x2107
65#define BG2SC          0x2108
66#define BG3SC          0x2109
67#define BG4SC          0x210A
68#define BG12NBA        0x210B
69#define BG34NBA        0x210C
70#define BG1HOFS        0x210D
71#define BG1VOFS        0x210E
72#define BG2HOFS        0x210F
73#define BG2VOFS        0x2110
74#define BG3HOFS        0x2111
75#define BG3VOFS        0x2112
76#define BG4HOFS        0x2113
77#define BG4VOFS        0x2114
78#define VMAIN          0x2115   /* i---ffrr = i: Increment timing | f: Full graphic | r: increment rate */
79#define VMADDL         0x2116   /* aaaaaaaa = a: LSB of vram address */
80#define VMADDH         0x2117   /* aaaaaaaa = a: MSB of vram address */
81#define VMDATAL        0x2118   /* dddddddd = d: data to be written */
82#define VMDATAH        0x2119   /* dddddddd = d: data to be written */
83#define M7SEL          0x211A   /* ab----yx = a: screen over | y: vertical flip | x: horizontal flip */
84#define M7A            0x211B   /* aaaaaaaa = a: COSINE rotate angle / X expansion */
85#define M7B            0x211C   /* aaaaaaaa = a: SINE rotate angle / X expansion */
86#define M7C            0x211D   /* aaaaaaaa = a: SINE rotate angle / Y expansion */
87#define M7D            0x211E   /* aaaaaaaa = a: COSINE rotate angle / Y expansion */
88#define M7X            0x211F
89#define M7Y            0x2120
90#define CGADD          0x2121
91#define CGDATA         0x2122
92#define W12SEL         0x2123
93#define W34SEL         0x2124
94#define WOBJSEL        0x2125
95#define WH0            0x2126   /* pppppppp = p: Left position of window 1 */
96#define WH1            0x2127   /* pppppppp = p: Right position of window 1 */
97#define WH2            0x2128   /* pppppppp = p: Left position of window 2 */
98#define WH3            0x2129   /* pppppppp = p: Right position of window 2 */
99#define WBGLOG         0x212A   /* aabbccdd = a: BG4 params | b: BG3 params | c: BG2 params | d: BG1 params */
100#define WOBJLOG        0x212B   /* ----ccoo = c: Colour window params | o: Object window params */
101#define TM             0x212C
102#define TS             0x212D
103#define TMW            0x212E
104#define TSW            0x212F
105#define CGWSEL         0x2130
106#define CGADSUB        0x2131
107#define COLDATA        0x2132
108#define SETINI         0x2133
109#define MPYL           0x2134
110#define MPYM           0x2135
111#define MPYH           0x2136
112#define SLHV           0x2137
113#define ROAMDATA       0x2138
114#define RVMDATAL       0x2139
115#define RVMDATAH       0x213A
116#define RCGDATA        0x213B
117#define OPHCT          0x213C
118#define OPVCT          0x213D
119#define STAT77         0x213E
120#define STAT78         0x213F
121#define APU00          0x2140
122#define APU01          0x2141
123#define APU02          0x2142
124#define APU03          0x2143
125#define WMDATA         0x2180
126#define WMADDL         0x2181
127#define WMADDM         0x2182
128#define WMADDH         0x2183
129129/* Definitions for CPU Memory-Mapped registers */
130#define OLDJOY1         0x4016
131#define OLDJOY2         0x4017
132#define NMITIMEN      0x4200
133#define WRIO         0x4201
134#define WRMPYA         0x4202
135#define WRMPYB         0x4203
136#define WRDIVL         0x4204
137#define WRDIVH         0x4205
138#define WRDVDD         0x4206
139#define HTIMEL         0x4207
140#define HTIMEH         0x4208
141#define VTIMEL         0x4209
142#define VTIMEH         0x420A
143#define MDMAEN         0x420B
144#define HDMAEN         0x420C
145#define MEMSEL         0x420D
146#define RDNMI         0x4210
147#define TIMEUP         0x4211
148#define HVBJOY         0x4212
149#define RDIO         0x4213
150#define RDDIVL         0x4214
151#define RDDIVH         0x4215
152#define RDMPYL         0x4216
153#define RDMPYH         0x4217
154#define JOY1L         0x4218
155#define JOY1H         0x4219
156#define JOY2L         0x421A
157#define JOY2H         0x421B
158#define JOY3L         0x421C
159#define JOY3H         0x421D
160#define JOY4L         0x421E
161#define JOY4H         0x421F
130#define OLDJOY1        0x4016
131#define OLDJOY2        0x4017
132#define NMITIMEN       0x4200
133#define WRIO           0x4201
134#define WRMPYA         0x4202
135#define WRMPYB         0x4203
136#define WRDIVL         0x4204
137#define WRDIVH         0x4205
138#define WRDVDD         0x4206
139#define HTIMEL         0x4207
140#define HTIMEH         0x4208
141#define VTIMEL         0x4209
142#define VTIMEH         0x420A
143#define MDMAEN         0x420B
144#define HDMAEN         0x420C
145#define MEMSEL         0x420D
146#define RDNMI          0x4210
147#define TIMEUP         0x4211
148#define HVBJOY         0x4212
149#define RDIO           0x4213
150#define RDDIVL         0x4214
151#define RDDIVH         0x4215
152#define RDMPYL         0x4216
153#define RDMPYH         0x4217
154#define JOY1L          0x4218
155#define JOY1H          0x4219
156#define JOY2L          0x421A
157#define JOY2H          0x421B
158#define JOY3L          0x421C
159#define JOY3H          0x421D
160#define JOY4L          0x421E
161#define JOY4H          0x421F
162162/* DMA */
163#define DMAP0         0x4300
164#define BBAD0         0x4301
165#define A1T0L         0x4302
166#define A1T0H         0x4303
167#define A1B0         0x4304
168#define DAS0L         0x4305
169#define DAS0H         0x4306
170#define DSAB0         0x4307
171#define A2A0L         0x4308
172#define A2A0H         0x4309
173#define NTRL0         0x430A
174#define DMAP1         0x4310
175#define BBAD1         0x4311
176#define A1T1L         0x4312
177#define A1T1H         0x4313
178#define A1B1         0x4314
179#define DAS1L         0x4315
180#define DAS1H         0x4316
181#define DSAB1         0x4317
182#define A2A1L         0x4318
183#define A2A1H         0x4319
184#define NTRL1         0x431A
185#define DMAP2         0x4320
186#define BBAD2         0x4321
187#define A1T2L         0x4322
188#define A1T2H         0x4323
189#define A1B2         0x4324
190#define DAS2L         0x4325
191#define DAS2H         0x4326
192#define DSAB2         0x4327
193#define A2A2L         0x4328
194#define A2A2H         0x4329
195#define NTRL2         0x432A
196#define DMAP3         0x4330
197#define BBAD3         0x4331
198#define A1T3L         0x4332
199#define A1T3H         0x4333
200#define A1B3         0x4334
201#define DAS3L         0x4335
202#define DAS3H         0x4336
203#define DSAB3         0x4337
204#define A2A3L         0x4338
205#define A2A3H         0x4339
206#define NTRL3         0x433A
207#define DMAP4         0x4340
208#define BBAD4         0x4341
209#define A1T4L         0x4342
210#define A1T4H         0x4343
211#define A1B4         0x4344
212#define DAS4L         0x4345
213#define DAS4H         0x4346
214#define DSAB4         0x4347
215#define A2A4L         0x4348
216#define A2A4H         0x4349
217#define NTRL4         0x434A
218#define DMAP5         0x4350
219#define BBAD5         0x4351
220#define A1T5L         0x4352
221#define A1T5H         0x4353
222#define A1B5         0x4354
223#define DAS5L         0x4355
224#define DAS5H         0x4356
225#define DSAB5         0x4357
226#define A2A5L         0x4358
227#define A2A5H         0x4359
228#define NTRL5         0x435A
229#define DMAP6         0x4360
230#define BBAD6         0x4361
231#define A1T6L         0x4362
232#define A1T6H         0x4363
233#define A1B6         0x4364
234#define DAS6L         0x4365
235#define DAS6H         0x4366
236#define DSAB6         0x4367
237#define A2A6L         0x4368
238#define A2A6H         0x4369
239#define NTRL6         0x436A
240#define DMAP7         0x4370
241#define BBAD7         0x4371
242#define A1T7L         0x4372
243#define A1T7H         0x4373
244#define A1B7         0x4374
245#define DAS7L         0x4375
246#define DAS7H         0x4376
247#define DSAB7         0x4377
248#define A2A7L         0x4378
249#define A2A7H         0x4379
250#define NTRL7         0x437A
163#define DMAP0          0x4300
164#define BBAD0          0x4301
165#define A1T0L          0x4302
166#define A1T0H          0x4303
167#define A1B0           0x4304
168#define DAS0L          0x4305
169#define DAS0H          0x4306
170#define DSAB0          0x4307
171#define A2A0L          0x4308
172#define A2A0H          0x4309
173#define NTRL0          0x430A
174#define DMAP1          0x4310
175#define BBAD1          0x4311
176#define A1T1L          0x4312
177#define A1T1H          0x4313
178#define A1B1           0x4314
179#define DAS1L          0x4315
180#define DAS1H          0x4316
181#define DSAB1          0x4317
182#define A2A1L          0x4318
183#define A2A1H          0x4319
184#define NTRL1          0x431A
185#define DMAP2          0x4320
186#define BBAD2          0x4321
187#define A1T2L          0x4322
188#define A1T2H          0x4323
189#define A1B2           0x4324
190#define DAS2L          0x4325
191#define DAS2H          0x4326
192#define DSAB2          0x4327
193#define A2A2L          0x4328
194#define A2A2H          0x4329
195#define NTRL2          0x432A
196#define DMAP3          0x4330
197#define BBAD3          0x4331
198#define A1T3L          0x4332
199#define A1T3H          0x4333
200#define A1B3           0x4334
201#define DAS3L          0x4335
202#define DAS3H          0x4336
203#define DSAB3          0x4337
204#define A2A3L          0x4338
205#define A2A3H          0x4339
206#define NTRL3          0x433A
207#define DMAP4          0x4340
208#define BBAD4          0x4341
209#define A1T4L          0x4342
210#define A1T4H          0x4343
211#define A1B4           0x4344
212#define DAS4L          0x4345
213#define DAS4H          0x4346
214#define DSAB4          0x4347
215#define A2A4L          0x4348
216#define A2A4H          0x4349
217#define NTRL4          0x434A
218#define DMAP5          0x4350
219#define BBAD5          0x4351
220#define A1T5L          0x4352
221#define A1T5H          0x4353
222#define A1B5           0x4354
223#define DAS5L          0x4355
224#define DAS5H          0x4356
225#define DSAB5          0x4357
226#define A2A5L          0x4358
227#define A2A5H          0x4359
228#define NTRL5          0x435A
229#define DMAP6          0x4360
230#define BBAD6          0x4361
231#define A1T6L          0x4362
232#define A1T6H          0x4363
233#define A1B6           0x4364
234#define DAS6L          0x4365
235#define DAS6H          0x4366
236#define DSAB6          0x4367
237#define A2A6L          0x4368
238#define A2A6H          0x4369
239#define NTRL6          0x436A
240#define DMAP7          0x4370
241#define BBAD7          0x4371
242#define A1T7L          0x4372
243#define A1T7H          0x4373
244#define A1B7           0x4374
245#define DAS7L          0x4375
246#define DAS7H          0x4376
247#define DSAB7          0x4377
248#define A2A7L          0x4378
249#define A2A7H          0x4379
250#define NTRL7          0x437A
251251/* Definitions for sound DSP */
252252#define DSP_V0_VOLL      0x00
253253#define DSP_V0_VOLR      0x01
r7300r7301
376376HAS_UNK
377377};
378378
379/* offset-per-tile modes */
380enum
381{
382   SNES_OPT_NONE = 0,
383   SNES_OPT_MODE2,
384   SNES_OPT_MODE4,
385   SNES_OPT_MODE6
386};
387
388/* layers */
389enum
390{
391   SNES_BG1 = 0,
392   SNES_BG2,
393   SNES_BG3,
394   SNES_BG4,
395   SNES_OAM,
396   SNES_COLOR
397};
398
379399/*----------- defined in machine/snes.c -----------*/
380400
381401extern DRIVER_INIT( snes );
r7300r7301
451471         UINT16 shift_vert;
452472      } offset;
453473   } layer[5];   // this is for the BG1 - BG2 - BG3 - BG4 - OBJ layers
474
454475   struct
455476   {
456477      UINT8 window1_enabled, window1_invert;
457478      UINT8 window2_enabled, window2_invert;
458479      UINT8 wlog_mask;
459480   } colour;   // this is for the color (which is 'seen' as a layer by the window masking code)
481
460482   struct
461483   {
462484      UINT8 address_low;
r7300r7301
471493      UINT8 flip;
472494      UINT16 write_latch;
473495   } oam;
496
474497   struct
475498   {
476499      UINT16 horizontal[4];
477500      UINT16 vertical[4];
478501   } bgd_offset;
502
479503   struct
480504   {
481505      UINT16 latch_horz;
r7300r7301
485509      UINT8 last_visible_line;
486510      UINT8 interlace_count;
487511   } beam;
512
488513   struct
489514   {
490515      UINT8 repeat;
r7300r7301
498523      INT16 origin_y;
499524      UINT16 hor_offset;
500525      UINT16 ver_offset;
526      UINT8 extbg;
501527   } mode7;
528
502529   UINT8 mosaic_size;
503530   UINT8 main_color_mask;
504531   UINT8 sub_color_mask;
r7300r7301
522549   UINT8 mode;
523550   UINT8 interlace; //doubles the visible resolution
524551   UINT8 obj_interlace;
552   UINT8 screen_brightness;
553   UINT8 screen_disabled;
554   UINT8 pseudo_hires;
555   UINT8 color_modes;
556   UINT8 stat77_flags;
525557};
526558
527559struct snes_cart_info
src/mame/video/snes.c
r7300r7301
140140INLINE void snes_draw_blend(UINT16 offset, UINT16 *colour, UINT8 mode, UINT8 clip, UINT8 black_pen_clip )
141141{
142142   if( (black_pen_clip == SNES_CLIP_ALL2) ||
143      (black_pen_clip == SNES_CLIP_IN && snes_ppu.clipmasks[5][offset]) ||
144      (black_pen_clip == SNES_CLIP_OUT && !snes_ppu.clipmasks[5][offset]))
143      (black_pen_clip == SNES_CLIP_IN && snes_ppu.clipmasks[SNES_COLOR][offset]) ||
144      (black_pen_clip == SNES_CLIP_OUT && !snes_ppu.clipmasks[SNES_COLOR][offset]))
145145      *colour = 0; //clip to black before color math
146146
147147   if (clip == SNES_CLIP_ALL2) // blending mode 3 == always OFF
r7300r7301
151151   if( !debug_options.transparency_disabled )
152152#endif /* MAME_DEBUG */
153153   if( (clip == SNES_CLIP_ALL) ||
154      (clip == SNES_CLIP_IN  && !snes_ppu.clipmasks[5][offset]) ||
155      (clip == SNES_CLIP_OUT && snes_ppu.clipmasks[5][offset]) )
154      (clip == SNES_CLIP_IN  && !snes_ppu.clipmasks[SNES_COLOR][offset]) ||
155      (clip == SNES_CLIP_OUT && snes_ppu.clipmasks[SNES_COLOR][offset]) )
156156   {
157157      UINT16 r, g, b;
158158
r7300r7301
165165            b = ((*colour & 0x7c00) >> 10) + ((scanlines[SUBSCREEN].buffer[offset] & 0x7c00) >> 10);
166166
167167            /* don't halve for the back colour */
168            if( (snes_ram[CGADSUB] & 0x40) && (scanlines[SUBSCREEN].zbuf[offset] || scanlines[SUBSCREEN].buffer[offset] != snes_cgram[FIXED_COLOUR]) )
168            if ((snes_ppu.color_modes & 0x40) && (scanlines[SUBSCREEN].zbuf[offset] || scanlines[SUBSCREEN].buffer[offset] != snes_cgram[FIXED_COLOUR]))
169169            {
170170               r >>= 1;
171171               g >>= 1;
r7300r7301
179179            b = ((*colour & 0x7c00) >> 10) + ((snes_cgram[FIXED_COLOUR] & 0x7c00) >> 10);
180180
181181            /* don't halve for the back colour */
182            if( (snes_ram[CGADSUB] & 0x40) && (scanlines[SUBSCREEN].zbuf[offset] || scanlines[SUBSCREEN].buffer[offset] != snes_cgram[FIXED_COLOUR]) )
182            if ((snes_ppu.color_modes & 0x40) && (scanlines[SUBSCREEN].zbuf[offset] || scanlines[SUBSCREEN].buffer[offset] != snes_cgram[FIXED_COLOUR]))
183183            {
184184               r >>= 1;
185185               g >>= 1;
r7300r7301
203203            if( b > 0x1f ) b = 0;
204204
205205            /* don't halve for the back colour */
206            if( (snes_ram[CGADSUB] & 0x40) && (scanlines[SUBSCREEN].zbuf[offset] || scanlines[SUBSCREEN].buffer[offset] != snes_cgram[FIXED_COLOUR]) )
206            if ((snes_ppu.color_modes & 0x40) && (scanlines[SUBSCREEN].zbuf[offset] || scanlines[SUBSCREEN].buffer[offset] != snes_cgram[FIXED_COLOUR]))
207207            {
208208               r >>= 1;
209209               g >>= 1;
r7300r7301
220220            if( b > 0x1f ) b = 0;
221221
222222            /* don't halve for the back colour */
223            if( (snes_ram[CGADSUB] & 0x40) && (scanlines[SUBSCREEN].zbuf[offset] || scanlines[SUBSCREEN].buffer[offset] != snes_cgram[FIXED_COLOUR]) )
223            if ((snes_ppu.color_modes & 0x40) && (scanlines[SUBSCREEN].zbuf[offset] || scanlines[SUBSCREEN].buffer[offset] != snes_cgram[FIXED_COLOUR]))
224224            {
225225               r >>= 1;
226226               g >>= 1;
r7300r7301
385385      if (!debug_options.windows_disabled)
386386#endif /* MAME_DEBUG */
387387      /* Clip to windows */
388      window_enabled = (screen == MAINSCREEN) ? snes_ppu.layer[4].main_window_enabled : snes_ppu.layer[4].sub_window_enabled;
388      window_enabled = (screen == MAINSCREEN) ? snes_ppu.layer[4].main_window_enabled : snes_ppu.layer[SNES_OAM].sub_window_enabled;
389389      if (window_enabled)
390         colour &= snes_ppu.clipmasks[4][ii];
390         colour &= snes_ppu.clipmasks[SNES_OAM][ii];
391391
392392      /* Only draw if we have a colour (0 == transparent) */
393393      if (colour)
r7300r7301
396396         {
397397            c = snes_cgram[pal + colour];
398398            if (blend && screen == MAINSCREEN)   /* Only blend main screens */
399               snes_draw_blend(ii/snes_htmult, &c, snes_ppu.layer[4].blend, snes_ppu.sub_color_mask, snes_ppu.main_color_mask);
399               snes_draw_blend(ii/snes_htmult, &c, snes_ppu.layer[SNES_OAM].blend, snes_ppu.sub_color_mask, snes_ppu.main_color_mask);
400400
401401            scanlines[screen].buffer[ii] = c;
402402            scanlines[screen].zbuf[ii] = priority;
r7300r7301
654654   /* MOSAIC - to be verified */
655655   if (layer == 1)   // BG2 use two different bits for horizontal and vertical mosaic
656656   {
657      mosaic_x = snes_ppu.mosaic_table[snes_ppu.layer[1].mosaic_enabled ? snes_ppu.mosaic_size : 0];
658      mosaic_y = snes_ppu.mosaic_table[snes_ppu.layer[0].mosaic_enabled ? snes_ppu.mosaic_size : 0];
657      mosaic_x = snes_ppu.mosaic_table[snes_ppu.layer[SNES_BG2].mosaic_enabled ? snes_ppu.mosaic_size : 0];
658      mosaic_y = snes_ppu.mosaic_table[snes_ppu.layer[SNES_BG1].mosaic_enabled ? snes_ppu.mosaic_size : 0];
659659   }
660660   else   // BG1 works as usual
661661   {
662      mosaic_x =  snes_ppu.mosaic_table[snes_ppu.layer[0].mosaic_enabled ? snes_ppu.mosaic_size : 0];
663      mosaic_y =  snes_ppu.mosaic_table[snes_ppu.layer[0].mosaic_enabled ? snes_ppu.mosaic_size : 0];
662      mosaic_x =  snes_ppu.mosaic_table[snes_ppu.layer[SNES_BG1].mosaic_enabled ? snes_ppu.mosaic_size : 0];
663      mosaic_y =  snes_ppu.mosaic_table[snes_ppu.layer[SNES_BG1].mosaic_enabled ? snes_ppu.mosaic_size : 0];
664664   }
665665
666666   /* Let's do some mode7 drawing huh? */
r7300r7301
830830               if( (x + (count << 3) < SNES_SCR_WIDTH + 8) )
831831               {
832832                  if( widemode )
833                     snes_draw_tile_object(screen, snes_ppu.layer[4].data + name_sel + tile + table_obj_offset[ys][xs] + line, x + (count++ << 3), priority, hflip, pal, blend, 1);
833                     snes_draw_tile_object(screen, snes_ppu.layer[SNES_OAM].data + name_sel + tile + table_obj_offset[ys][xs] + line, x + (count++ << 3), priority, hflip, pal, blend, 1);
834834                  else
835                     snes_draw_tile_object(screen, snes_ppu.layer[4].data + name_sel + tile + table_obj_offset[ys][xs] + line, x + (count++ << 3), priority, hflip, pal, blend, 0);
835                     snes_draw_tile_object(screen, snes_ppu.layer[SNES_OAM].data + name_sel + tile + table_obj_offset[ys][xs] + line, x + (count++ << 3), priority, hflip, pal, blend, 0);
836836               }
837837               time_over++;   /* Increase time_over. Should we stop drawing if exceeded 34 tiles? */
838838            }
r7300r7301
844844               if( (x + (xs << 3) < SNES_SCR_WIDTH + 8) )
845845               {
846846                  if( widemode )
847                     snes_draw_tile_object(screen, snes_ppu.layer[4].data + name_sel + tile + table_obj_offset[ys][xs] + line, x + (xs << 3), priority, hflip, pal, blend, 1);
847                     snes_draw_tile_object(screen, snes_ppu.layer[SNES_OAM].data + name_sel + tile + table_obj_offset[ys][xs] + line, x + (xs << 3), priority, hflip, pal, blend, 1);
848848                  else
849                     snes_draw_tile_object(screen, snes_ppu.layer[4].data + name_sel + tile + table_obj_offset[ys][xs] + line, x + (xs << 3), priority, hflip, pal, blend, 0);
849                     snes_draw_tile_object(screen, snes_ppu.layer[SNES_OAM].data + name_sel + tile + table_obj_offset[ys][xs] + line, x + (xs << 3), priority, hflip, pal, blend, 0);
850850               }
851851               time_over++;   /* Increase time_over. Should we stop drawing if exceeded 34 tiles? */
852852            }
853853         }
854854
855         /* Increase range_over.
856             * Stop drawing if exceeded 32 objects and
857             * enforcing that limit is enabled */
855         /* Increase range_over. Stop drawing if exceeded 32 objects and enforcing that limit is enabled */
858856         range_over++;
859         if( range_over == 32 ) //&& (input_port_read(machine, "INTERNAL") & 0x01) )
857         if (range_over == 32) //&& (input_port_read(machine, "INTERNAL") & 0x01) )
860858         {
861859            /* Set the flag in STAT77 register */
862            snes_ram[STAT77] |= 0x40;
863            /* FIXME: This stops the SNESTest rom from drawing the object
864                 *        test properly.  Maybe we shouldn't stop drawing? */
860            snes_ppu.stat77_flags |= 0x40;
861            /* FIXME: This stops the SNESTest rom from drawing the object test properly.  Maybe we shouldn't stop drawing? */
865862            /* return; */
866863         }
867864      }
868865   }
869866
870   if( time_over >= 34 )
867   if (time_over >= 34)
871868   {
872869      /* Set the flag in STAT77 register */
873      snes_ram[STAT77] |= 0x80;
870      snes_ppu.stat77_flags |= 0x80;
874871   }
875872}
876873
r7300r7301
964961
965962static void snes_update_mode_7( UINT8 screen, UINT16 curline )
966963{
967   UINT8 extbg_mode = snes_ram[SETINI] & 0x40;
968964   UINT8 *bg_enabled;
969965   bg_enabled = (screen == MAINSCREEN) ? snes_ppu.main_bg_enabled : snes_ppu.sub_bg_enabled;
970966
971   if (!extbg_mode)
967   if (!snes_ppu.mode7.extbg)
972968   {
973969      if (bg_enabled[4]) snes_update_objects(screen, 7, curline);
974970      if (bg_enabled[0]) snes_update_line_mode7(screen, 1, 1, 0, curline);
r7300r7301
10711067      }
10721068
10731069      /* update colour window */
1074      snes_ppu.clipmasks[5][ii] = 0xff;
1070      snes_ppu.clipmasks[SNES_COLOR][ii] = 0xff;
10751071      w1 = w2 = -1;
10761072      if (snes_ppu.colour.window1_enabled)
10771073      {
r7300r7301
10931089         if (snes_ppu.colour.window2_invert)
10941090            w2 = !w2;
10951091      }
1096      if( w1 >= 0 && w2 >= 0 )
1092      if (w1 >= 0 && w2 >= 0)
10971093      {
10981094         switch (snes_ppu.colour.wlog_mask)
10991095         {
11001096            case 0x0:   /* OR */
1101               snes_ppu.clipmasks[5][ii] = w1 | w2 ? 0x00 : 0xff;
1097               snes_ppu.clipmasks[SNES_COLOR][ii] = w1 | w2 ? 0x00 : 0xff;
11021098               break;
11031099            case 0x4:   /* AND */
1104               snes_ppu.clipmasks[5][ii] = w1 & w2 ? 0x00 : 0xff;
1100               snes_ppu.clipmasks[SNES_COLOR][ii] = w1 & w2 ? 0x00 : 0xff;
11051101               break;
11061102            case 0x8:   /* XOR */
1107               snes_ppu.clipmasks[5][ii] = w1 ^ w2 ? 0x00 : 0xff;
1103               snes_ppu.clipmasks[SNES_COLOR][ii] = w1 ^ w2 ? 0x00 : 0xff;
11081104               break;
11091105            case 0xc:   /* XNOR */
1110               snes_ppu.clipmasks[5][ii] = !(w1 ^ w2) ? 0x00 : 0xff;
1106               snes_ppu.clipmasks[SNES_COLOR][ii] = !(w1 ^ w2) ? 0x00 : 0xff;
11111107               break;
11121108         }
11131109      }
1114      else if( w1 >= 0 )
1115         snes_ppu.clipmasks[5][ii] = w1 ? 0x00 : 0xff;
1116      else if( w2 >= 0 )
1117         snes_ppu.clipmasks[5][ii] = w2 ? 0x00 : 0xff;
1110      else if (w1 >= 0)
1111         snes_ppu.clipmasks[SNES_COLOR][ii] = w1 ? 0x00 : 0xff;
1112      else if (w2 >= 0)
1113         snes_ppu.clipmasks[SNES_COLOR][ii] = w2 ? 0x00 : 0xff;
11181114   }
11191115}
11201116
r7300r7301
11351131   }
11361132   #if 0
11371133   popmessage("%04x %04x|%04x %04x|%04x %04x|%04x %04x",
1138   snes_ppu.layer[0].offset.tile_horz,
1139   snes_ppu.layer[0].offset.tile_vert,
1140   snes_ppu.layer[1].offset.tile_horz,
1141   snes_ppu.layer[1].offset.tile_vert,
1142   snes_ppu.layer[2].offset.tile_horz,
1143   snes_ppu.layer[2].offset.tile_vert,
1144   snes_ppu.layer[3].offset.tile_horz,
1145   snes_ppu.layer[3].offset.tile_vert
1134   snes_ppu.layer[SNES_BG1].offset.tile_horz,
1135   snes_ppu.layer[SNES_BG1].offset.tile_vert,
1136   snes_ppu.layer[SNES_BG2].offset.tile_horz,
1137   snes_ppu.layer[SNES_BG2].offset.tile_vert,
1138   snes_ppu.layer[SNES_BG3].offset.tile_horz,
1139   snes_ppu.layer[SNES_BG3].offset.tile_vert,
1140   snes_ppu.layer[SNES_BG4].offset.tile_horz,
1141   snes_ppu.layer[SNES_BG4].offset.tile_vert
11461142   );
11471143   #endif
11481144   snes_ppu.update_offsets = 0;
r7300r7301
11621158
11631159   profiler_mark_start(PROFILER_VIDEO);
11641160
1165   if (snes_ram[INIDISP] & 0x80) /* screen is forced blank */
1161   if (snes_ppu.screen_disabled) /* screen is forced blank */
11661162      for (x = 0; x < SNES_SCR_WIDTH * 2; x++)
11671163         *BITMAP_ADDR32(bitmap, curline, x) = RGB_BLACK;
11681164   else
r7300r7301
11991195      {
12001196         for(ii = 0; ii < SNES_SCR_WIDTH * snes_htmult; ii++)
12011197         {
1202            snes_draw_blend(ii/snes_htmult, &scanlines[MAINSCREEN].buffer[ii], (snes_ram[CGADSUB] & 0x80) ? SNES_BLEND_SUB : SNES_BLEND_ADD, snes_ppu.sub_color_mask, snes_ppu.main_color_mask);
1198            snes_draw_blend(ii/snes_htmult, &scanlines[MAINSCREEN].buffer[ii], (snes_ppu.color_modes & 0x80) ? SNES_BLEND_SUB : SNES_BLEND_ADD, snes_ppu.sub_color_mask, snes_ppu.main_color_mask);
12031199         }
12041200      }
12051201
r7300r7301
12211217         scanline = &scanlines[MAINSCREEN];
12221218
12231219      /* Phew! Draw the line to screen */
1224      fade = (snes_ram[INIDISP] & 0xf) + 1;
1220      fade = snes_ppu.screen_brightness;
12251221
12261222      for (x = 0; x < SNES_SCR_WIDTH * 2; x++)
12271223      {
r7300r7301
14171413            WINLOGIC[(snes_ram[WBGLOG] & 0x3)],
14181414            (snes_ram[W12SEL] & 0x2)?((snes_ram[W12SEL] & 0x1)?"o":"i"):" ",
14191415            (snes_ram[W12SEL] & 0x8)?((snes_ram[W12SEL] & 0x4)?"o":"i"):" ",
1420            snes_ppu.layer[0].tile_size + 1,
1416            snes_ppu.layer[SNES_BG1].tile_size + 1,
14211417            (snes_ram[MOSAIC] & 0x1)?"m":" ",
14221418            snes_ram[BG1SC] & 0x3,
14231419            (snes_ram[BG1SC] & 0xfc) << 9,
1424            snes_ppu.layer[0].data );
1420            snes_ppu.layer[SNES_BG1].data );
14251421      //ui_draw_text( t, SNES_DBG_HORZ_POS, y++ * 9 );
14261422      logerror("%s2 %s%s%s%s%s%c%s%s%d%s %d %4X %4X",
14271423            debug_options.bg_disabled[1]?" ":"*",
r7300r7301
14331429            WINLOGIC[(snes_ram[WBGLOG] & 0xc) >> 2],
14341430            (snes_ram[W12SEL] & 0x20)?((snes_ram[W12SEL] & 0x10)?"o":"i"):" ",
14351431            (snes_ram[W12SEL] & 0x80)?((snes_ram[W12SEL] & 0x40)?"o":"i"):" ",
1436            snes_ppu.layer[1].tile_size + 1,
1432            snes_ppu.layer[SNES_BG2].tile_size + 1,
14371433            (snes_ram[MOSAIC] & 0x2)?"m":" ",
14381434            snes_ram[BG2SC] & 0x3,
14391435            (snes_ram[BG2SC] & 0xfc) << 9,
1440            snes_ppu.layer[1].data );
1436            snes_ppu.layer[SNES_BG2].data );
14411437      //ui_draw_text( t, SNES_DBG_HORZ_POS, y++ * 9 );
14421438      logerror("%s3 %s%s%s%s%s%c%s%s%d%s%s%d %4X %4X",
14431439            debug_options.bg_disabled[2]?" ":"*",
r7300r7301
14491445            WINLOGIC[(snes_ram[WBGLOG] & 0x30)>>4],
14501446            (snes_ram[W34SEL] & 0x2)?((snes_ram[W34SEL] & 0x1)?"o":"i"):" ",
14511447            (snes_ram[W34SEL] & 0x8)?((snes_ram[W34SEL] & 0x4)?"o":"i"):" ",
1452            snes_ppu.layer[2].tile_size + 1,
1448            snes_ppu.layer[SNES_BG3].tile_size + 1,
14531449            (snes_ram[MOSAIC] & 0x4)?"m":" ",
14541450            (snes_ram[BGMODE] & 0x8)?"P":" ",
14551451            snes_ram[BG3SC] & 0x3,
14561452            (snes_ram[BG3SC] & 0xfc) << 9,
1457            snes_ppu.layer[2].data );
1453            snes_ppu.layer[SNES_BG3].data );
14581454      //ui_draw_text( t, SNES_DBG_HORZ_POS, y++ * 9 );
14591455      logerror("%s4 %s%s%s%s%s%c%s%s%d%s %d %4X %4X",
14601456            debug_options.bg_disabled[3]?" ":"*",
r7300r7301
14661462            WINLOGIC[(snes_ram[WBGLOG] & 0xc0)>>6],
14671463            (snes_ram[W34SEL] & 0x20)?((snes_ram[W34SEL] & 0x10)?"o":"i"):" ",
14681464            (snes_ram[W34SEL] & 0x80)?((snes_ram[W34SEL] & 0x40)?"o":"i"):" ",
1469            snes_ppu.layer[3].tile_size + 1,
1465            snes_ppu.layer[SNES_BG4].tile_size + 1,
14701466            (snes_ram[MOSAIC] & 0x8)?"m":" ",
14711467            snes_ram[BG4SC] & 0x3,
14721468            (snes_ram[BG4SC] & 0xfc) << 9,
1473            snes_ppu.layer[3].data );
1469            snes_ppu.layer[SNES_BG4].data );
14741470      //ui_draw_text( t, SNES_DBG_HORZ_POS, y++ * 9 );
14751471      logerror("%sO %s%s%s%s%s%c%s%s%d%d       %4X",
14761472            debug_options.bg_disabled[4]?" ":"*",
r7300r7301
14831479            (snes_ram[WOBJSEL] & 0x2)?((snes_ram[WOBJSEL] & 0x1)?"o":"i"):" ",
14841480            (snes_ram[WOBJSEL] & 0x8)?((snes_ram[WOBJSEL] & 0x4)?"o":"i"):" ",
14851481            snes_ppu.oam.size[0], snes_ppu.oam.size[1],
1486            snes_ppu.layer[4].data );
1482            snes_ppu.layer[SNES_OAM].data );
14871483      //ui_draw_text( t, SNES_DBG_HORZ_POS, y++ * 9 );
14881484      logerror("%sB   %s  %c%s%s",
14891485            debug_options.bg_disabled[5]?" ":"*",
src/mess/machine/snescart.c
r7300r7301
1212#include "snescart.h"
1313
1414
15#define SNES_CART_DEBUG 0
16
1517/****** Strings for Cart Header Logging ******/
1618
1719#define UNK "Unknown"
r7300r7301
380382      image_fseek(image, offset, SEEK_SET);
381383   }
382384
383   /* We need to take a sample to test what mode we need to be in (the
384    sample has to be quite large to cope with large carts in ExHiRom) */
385   /* We need to take a sample to test what mode we need to be in (the sample has to be quite large to cope with large carts in ExHiRom) */
385386   image_fread(image, temp_buffer, 0x40ffff);
386387   image_fseek(image, offset, SEEK_SET);   /* Rewind */
387388
r7300r7301
415416      snes_cart.sram_max = 0x20000;
416417   }
417418
419   if (SNES_CART_DEBUG) printf("mode %d\n", snes_cart.mode);
420
418421   /* Loading data */
419422   ROM = memory_region(image->machine, "cart");
420423   length = image_fread(image, ROM, snes_rom_size - offset);
421424
425   if (SNES_CART_DEBUG) printf("size %08X\n", snes_rom_size - offset);
426
422427   /* FIXME: Insert crc check here */
423428
424429   /* How many blocks of data are available to be loaded? */
425430   total_blocks = ((snes_rom_size - offset) / (snes_cart.mode & 0x05 ? 0x8000 : 0x10000));
426431   read_blocks = 0;
427432
433   if (SNES_CART_DEBUG) printf("blocks %d\n", total_blocks);
434
428435   /* Loading all the data blocks from cart, we only partially cover banks 0x00 to 0x7f. Therefore, we
429436     * have to mirror the blocks until we reach the end. E.g. for a 11Mbits image (44 blocks), we proceed
430437     * as follows:
r7300r7301
500507         {
501508            /* Loading data */
502509            memcpy(&snes_ram[0x400000 + read_blocks * 0x10000], &ROM[0x400000 + read_blocks * 0x10000], 0x10000);
503            memcpy(&snes_ram[0x1000000 + read_blocks * 0x10000], &snes_ram[0x400000 + read_blocks * 0x10000], 0x10000);
504510            /* Mirroring */
505511            memcpy(&snes_ram[0x8000 + read_blocks * 0x10000], &snes_ram[0x408000 + read_blocks * 0x10000], 0x8000);
506512            read_blocks++;

Previous 15994 Revisions Next


© 1998-2018 The MESS Team