diff --git a/src/mame/includes/snes.h b/src/mame/includes/snes.h index 67f48f01912..5d77076be0f 100644 --- a/src/mame/includes/snes.h +++ b/src/mame/includes/snes.h @@ -54,200 +54,200 @@ #define SNES_EXROM_START 0x1000000 #define FIXED_COLOUR 256 /* Position in cgram for fixed colour */ /* Definitions for PPU Memory-Mapped registers */ -#define INIDISP 0x2100 -#define OBSEL 0x2101 -#define OAMADDL 0x2102 -#define OAMADDH 0x2103 -#define OAMDATA 0x2104 -#define BGMODE 0x2105 /* abcdefff = abcd: bg4-1 tile size | e: BG3 high priority | f: mode */ -#define MOSAIC 0x2106 /* xxxxabcd = x: pixel size | abcd: affects bg 1-4 */ -#define BG1SC 0x2107 -#define BG2SC 0x2108 -#define BG3SC 0x2109 -#define BG4SC 0x210A -#define BG12NBA 0x210B -#define BG34NBA 0x210C -#define BG1HOFS 0x210D -#define BG1VOFS 0x210E -#define BG2HOFS 0x210F -#define BG2VOFS 0x2110 -#define BG3HOFS 0x2111 -#define BG3VOFS 0x2112 -#define BG4HOFS 0x2113 -#define BG4VOFS 0x2114 -#define VMAIN 0x2115 /* i---ffrr = i: Increment timing | f: Full graphic | r: increment rate */ -#define VMADDL 0x2116 /* aaaaaaaa = a: LSB of vram address */ -#define VMADDH 0x2117 /* aaaaaaaa = a: MSB of vram address */ -#define VMDATAL 0x2118 /* dddddddd = d: data to be written */ -#define VMDATAH 0x2119 /* dddddddd = d: data to be written */ -#define M7SEL 0x211A /* ab----yx = a: screen over | y: vertical flip | x: horizontal flip */ -#define M7A 0x211B /* aaaaaaaa = a: COSINE rotate angle / X expansion */ -#define M7B 0x211C /* aaaaaaaa = a: SINE rotate angle / X expansion */ -#define M7C 0x211D /* aaaaaaaa = a: SINE rotate angle / Y expansion */ -#define M7D 0x211E /* aaaaaaaa = a: COSINE rotate angle / Y expansion */ -#define M7X 0x211F -#define M7Y 0x2120 -#define CGADD 0x2121 -#define CGDATA 0x2122 -#define W12SEL 0x2123 -#define W34SEL 0x2124 -#define WOBJSEL 0x2125 -#define WH0 0x2126 /* pppppppp = p: Left position of window 1 */ -#define WH1 0x2127 /* pppppppp = p: Right position of window 1 */ -#define WH2 0x2128 /* pppppppp = p: Left position of window 2 */ -#define WH3 0x2129 /* pppppppp = p: Right position of window 2 */ -#define WBGLOG 0x212A /* aabbccdd = a: BG4 params | b: BG3 params | c: BG2 params | d: BG1 params */ -#define WOBJLOG 0x212B /* ----ccoo = c: Colour window params | o: Object window params */ -#define TM 0x212C -#define TS 0x212D -#define TMW 0x212E -#define TSW 0x212F -#define CGWSEL 0x2130 -#define CGADSUB 0x2131 -#define COLDATA 0x2132 -#define SETINI 0x2133 -#define MPYL 0x2134 -#define MPYM 0x2135 -#define MPYH 0x2136 -#define SLHV 0x2137 -#define ROAMDATA 0x2138 -#define RVMDATAL 0x2139 -#define RVMDATAH 0x213A -#define RCGDATA 0x213B -#define OPHCT 0x213C -#define OPVCT 0x213D -#define STAT77 0x213E -#define STAT78 0x213F -#define APU00 0x2140 -#define APU01 0x2141 -#define APU02 0x2142 -#define APU03 0x2143 -#define WMDATA 0x2180 -#define WMADDL 0x2181 -#define WMADDM 0x2182 -#define WMADDH 0x2183 +#define INIDISP 0x2100 +#define OBSEL 0x2101 +#define OAMADDL 0x2102 +#define OAMADDH 0x2103 +#define OAMDATA 0x2104 +#define BGMODE 0x2105 /* abcdefff = abcd: bg4-1 tile size | e: BG3 high priority | f: mode */ +#define MOSAIC 0x2106 /* xxxxabcd = x: pixel size | abcd: affects bg 1-4 */ +#define BG1SC 0x2107 +#define BG2SC 0x2108 +#define BG3SC 0x2109 +#define BG4SC 0x210A +#define BG12NBA 0x210B +#define BG34NBA 0x210C +#define BG1HOFS 0x210D +#define BG1VOFS 0x210E +#define BG2HOFS 0x210F +#define BG2VOFS 0x2110 +#define BG3HOFS 0x2111 +#define BG3VOFS 0x2112 +#define BG4HOFS 0x2113 +#define BG4VOFS 0x2114 +#define VMAIN 0x2115 /* i---ffrr = i: Increment timing | f: Full graphic | r: increment rate */ +#define VMADDL 0x2116 /* aaaaaaaa = a: LSB of vram address */ +#define VMADDH 0x2117 /* aaaaaaaa = a: MSB of vram address */ +#define VMDATAL 0x2118 /* dddddddd = d: data to be written */ +#define VMDATAH 0x2119 /* dddddddd = d: data to be written */ +#define M7SEL 0x211A /* ab----yx = a: screen over | y: vertical flip | x: horizontal flip */ +#define M7A 0x211B /* aaaaaaaa = a: COSINE rotate angle / X expansion */ +#define M7B 0x211C /* aaaaaaaa = a: SINE rotate angle / X expansion */ +#define M7C 0x211D /* aaaaaaaa = a: SINE rotate angle / Y expansion */ +#define M7D 0x211E /* aaaaaaaa = a: COSINE rotate angle / Y expansion */ +#define M7X 0x211F +#define M7Y 0x2120 +#define CGADD 0x2121 +#define CGDATA 0x2122 +#define W12SEL 0x2123 +#define W34SEL 0x2124 +#define WOBJSEL 0x2125 +#define WH0 0x2126 /* pppppppp = p: Left position of window 1 */ +#define WH1 0x2127 /* pppppppp = p: Right position of window 1 */ +#define WH2 0x2128 /* pppppppp = p: Left position of window 2 */ +#define WH3 0x2129 /* pppppppp = p: Right position of window 2 */ +#define WBGLOG 0x212A /* aabbccdd = a: BG4 params | b: BG3 params | c: BG2 params | d: BG1 params */ +#define WOBJLOG 0x212B /* ----ccoo = c: Colour window params | o: Object window params */ +#define TM 0x212C +#define TS 0x212D +#define TMW 0x212E +#define TSW 0x212F +#define CGWSEL 0x2130 +#define CGADSUB 0x2131 +#define COLDATA 0x2132 +#define SETINI 0x2133 +#define MPYL 0x2134 +#define MPYM 0x2135 +#define MPYH 0x2136 +#define SLHV 0x2137 +#define ROAMDATA 0x2138 +#define RVMDATAL 0x2139 +#define RVMDATAH 0x213A +#define RCGDATA 0x213B +#define OPHCT 0x213C +#define OPVCT 0x213D +#define STAT77 0x213E +#define STAT78 0x213F +#define APU00 0x2140 +#define APU01 0x2141 +#define APU02 0x2142 +#define APU03 0x2143 +#define WMDATA 0x2180 +#define WMADDL 0x2181 +#define WMADDM 0x2182 +#define WMADDH 0x2183 /* Definitions for CPU Memory-Mapped registers */ -#define OLDJOY1 0x4016 -#define OLDJOY2 0x4017 -#define NMITIMEN 0x4200 -#define WRIO 0x4201 -#define WRMPYA 0x4202 -#define WRMPYB 0x4203 -#define WRDIVL 0x4204 -#define WRDIVH 0x4205 -#define WRDVDD 0x4206 -#define HTIMEL 0x4207 -#define HTIMEH 0x4208 -#define VTIMEL 0x4209 -#define VTIMEH 0x420A -#define MDMAEN 0x420B -#define HDMAEN 0x420C -#define MEMSEL 0x420D -#define RDNMI 0x4210 -#define TIMEUP 0x4211 -#define HVBJOY 0x4212 -#define RDIO 0x4213 -#define RDDIVL 0x4214 -#define RDDIVH 0x4215 -#define RDMPYL 0x4216 -#define RDMPYH 0x4217 -#define JOY1L 0x4218 -#define JOY1H 0x4219 -#define JOY2L 0x421A -#define JOY2H 0x421B -#define JOY3L 0x421C -#define JOY3H 0x421D -#define JOY4L 0x421E -#define JOY4H 0x421F +#define OLDJOY1 0x4016 +#define OLDJOY2 0x4017 +#define NMITIMEN 0x4200 +#define WRIO 0x4201 +#define WRMPYA 0x4202 +#define WRMPYB 0x4203 +#define WRDIVL 0x4204 +#define WRDIVH 0x4205 +#define WRDVDD 0x4206 +#define HTIMEL 0x4207 +#define HTIMEH 0x4208 +#define VTIMEL 0x4209 +#define VTIMEH 0x420A +#define MDMAEN 0x420B +#define HDMAEN 0x420C +#define MEMSEL 0x420D +#define RDNMI 0x4210 +#define TIMEUP 0x4211 +#define HVBJOY 0x4212 +#define RDIO 0x4213 +#define RDDIVL 0x4214 +#define RDDIVH 0x4215 +#define RDMPYL 0x4216 +#define RDMPYH 0x4217 +#define JOY1L 0x4218 +#define JOY1H 0x4219 +#define JOY2L 0x421A +#define JOY2H 0x421B +#define JOY3L 0x421C +#define JOY3H 0x421D +#define JOY4L 0x421E +#define JOY4H 0x421F /* DMA */ -#define DMAP0 0x4300 -#define BBAD0 0x4301 -#define A1T0L 0x4302 -#define A1T0H 0x4303 -#define A1B0 0x4304 -#define DAS0L 0x4305 -#define DAS0H 0x4306 -#define DSAB0 0x4307 -#define A2A0L 0x4308 -#define A2A0H 0x4309 -#define NTRL0 0x430A -#define DMAP1 0x4310 -#define BBAD1 0x4311 -#define A1T1L 0x4312 -#define A1T1H 0x4313 -#define A1B1 0x4314 -#define DAS1L 0x4315 -#define DAS1H 0x4316 -#define DSAB1 0x4317 -#define A2A1L 0x4318 -#define A2A1H 0x4319 -#define NTRL1 0x431A -#define DMAP2 0x4320 -#define BBAD2 0x4321 -#define A1T2L 0x4322 -#define A1T2H 0x4323 -#define A1B2 0x4324 -#define DAS2L 0x4325 -#define DAS2H 0x4326 -#define DSAB2 0x4327 -#define A2A2L 0x4328 -#define A2A2H 0x4329 -#define NTRL2 0x432A -#define DMAP3 0x4330 -#define BBAD3 0x4331 -#define A1T3L 0x4332 -#define A1T3H 0x4333 -#define A1B3 0x4334 -#define DAS3L 0x4335 -#define DAS3H 0x4336 -#define DSAB3 0x4337 -#define A2A3L 0x4338 -#define A2A3H 0x4339 -#define NTRL3 0x433A -#define DMAP4 0x4340 -#define BBAD4 0x4341 -#define A1T4L 0x4342 -#define A1T4H 0x4343 -#define A1B4 0x4344 -#define DAS4L 0x4345 -#define DAS4H 0x4346 -#define DSAB4 0x4347 -#define A2A4L 0x4348 -#define A2A4H 0x4349 -#define NTRL4 0x434A -#define DMAP5 0x4350 -#define BBAD5 0x4351 -#define A1T5L 0x4352 -#define A1T5H 0x4353 -#define A1B5 0x4354 -#define DAS5L 0x4355 -#define DAS5H 0x4356 -#define DSAB5 0x4357 -#define A2A5L 0x4358 -#define A2A5H 0x4359 -#define NTRL5 0x435A -#define DMAP6 0x4360 -#define BBAD6 0x4361 -#define A1T6L 0x4362 -#define A1T6H 0x4363 -#define A1B6 0x4364 -#define DAS6L 0x4365 -#define DAS6H 0x4366 -#define DSAB6 0x4367 -#define A2A6L 0x4368 -#define A2A6H 0x4369 -#define NTRL6 0x436A -#define DMAP7 0x4370 -#define BBAD7 0x4371 -#define A1T7L 0x4372 -#define A1T7H 0x4373 -#define A1B7 0x4374 -#define DAS7L 0x4375 -#define DAS7H 0x4376 -#define DSAB7 0x4377 -#define A2A7L 0x4378 -#define A2A7H 0x4379 -#define NTRL7 0x437A +#define DMAP0 0x4300 +#define BBAD0 0x4301 +#define A1T0L 0x4302 +#define A1T0H 0x4303 +#define A1B0 0x4304 +#define DAS0L 0x4305 +#define DAS0H 0x4306 +#define DSAB0 0x4307 +#define A2A0L 0x4308 +#define A2A0H 0x4309 +#define NTRL0 0x430A +#define DMAP1 0x4310 +#define BBAD1 0x4311 +#define A1T1L 0x4312 +#define A1T1H 0x4313 +#define A1B1 0x4314 +#define DAS1L 0x4315 +#define DAS1H 0x4316 +#define DSAB1 0x4317 +#define A2A1L 0x4318 +#define A2A1H 0x4319 +#define NTRL1 0x431A +#define DMAP2 0x4320 +#define BBAD2 0x4321 +#define A1T2L 0x4322 +#define A1T2H 0x4323 +#define A1B2 0x4324 +#define DAS2L 0x4325 +#define DAS2H 0x4326 +#define DSAB2 0x4327 +#define A2A2L 0x4328 +#define A2A2H 0x4329 +#define NTRL2 0x432A +#define DMAP3 0x4330 +#define BBAD3 0x4331 +#define A1T3L 0x4332 +#define A1T3H 0x4333 +#define A1B3 0x4334 +#define DAS3L 0x4335 +#define DAS3H 0x4336 +#define DSAB3 0x4337 +#define A2A3L 0x4338 +#define A2A3H 0x4339 +#define NTRL3 0x433A +#define DMAP4 0x4340 +#define BBAD4 0x4341 +#define A1T4L 0x4342 +#define A1T4H 0x4343 +#define A1B4 0x4344 +#define DAS4L 0x4345 +#define DAS4H 0x4346 +#define DSAB4 0x4347 +#define A2A4L 0x4348 +#define A2A4H 0x4349 +#define NTRL4 0x434A +#define DMAP5 0x4350 +#define BBAD5 0x4351 +#define A1T5L 0x4352 +#define A1T5H 0x4353 +#define A1B5 0x4354 +#define DAS5L 0x4355 +#define DAS5H 0x4356 +#define DSAB5 0x4357 +#define A2A5L 0x4358 +#define A2A5H 0x4359 +#define NTRL5 0x435A +#define DMAP6 0x4360 +#define BBAD6 0x4361 +#define A1T6L 0x4362 +#define A1T6H 0x4363 +#define A1B6 0x4364 +#define DAS6L 0x4365 +#define DAS6H 0x4366 +#define DSAB6 0x4367 +#define A2A6L 0x4368 +#define A2A6H 0x4369 +#define NTRL6 0x436A +#define DMAP7 0x4370 +#define BBAD7 0x4371 +#define A1T7L 0x4372 +#define A1T7H 0x4373 +#define A1B7 0x4374 +#define DAS7L 0x4375 +#define DAS7H 0x4376 +#define DSAB7 0x4377 +#define A2A7L 0x4378 +#define A2A7H 0x4379 +#define NTRL7 0x437A /* Definitions for sound DSP */ #define DSP_V0_VOLL 0x00 #define DSP_V0_VOLR 0x01 @@ -376,6 +376,26 @@ HAS_SPC7110_RTC, HAS_UNK }; +/* offset-per-tile modes */ +enum +{ + SNES_OPT_NONE = 0, + SNES_OPT_MODE2, + SNES_OPT_MODE4, + SNES_OPT_MODE6 +}; + +/* layers */ +enum +{ + SNES_BG1 = 0, + SNES_BG2, + SNES_BG3, + SNES_BG4, + SNES_OAM, + SNES_COLOR +}; + /*----------- defined in machine/snes.c -----------*/ extern DRIVER_INIT( snes ); @@ -451,12 +471,14 @@ struct SNES_PPU_STRUCT /* once all the regs are saved in this structure, it woul UINT16 shift_vert; } offset; } layer[5]; // this is for the BG1 - BG2 - BG3 - BG4 - OBJ layers + struct { UINT8 window1_enabled, window1_invert; UINT8 window2_enabled, window2_invert; UINT8 wlog_mask; } colour; // this is for the color (which is 'seen' as a layer by the window masking code) + struct { UINT8 address_low; @@ -471,11 +493,13 @@ struct SNES_PPU_STRUCT /* once all the regs are saved in this structure, it woul UINT8 flip; UINT16 write_latch; } oam; + struct { UINT16 horizontal[4]; UINT16 vertical[4]; } bgd_offset; + struct { UINT16 latch_horz; @@ -485,6 +509,7 @@ struct SNES_PPU_STRUCT /* once all the regs are saved in this structure, it woul UINT8 last_visible_line; UINT8 interlace_count; } beam; + struct { UINT8 repeat; @@ -498,7 +523,9 @@ struct SNES_PPU_STRUCT /* once all the regs are saved in this structure, it woul INT16 origin_y; UINT16 hor_offset; UINT16 ver_offset; + UINT8 extbg; } mode7; + UINT8 mosaic_size; UINT8 main_color_mask; UINT8 sub_color_mask; @@ -522,6 +549,11 @@ struct SNES_PPU_STRUCT /* once all the regs are saved in this structure, it woul UINT8 mode; UINT8 interlace; //doubles the visible resolution UINT8 obj_interlace; + UINT8 screen_brightness; + UINT8 screen_disabled; + UINT8 pseudo_hires; + UINT8 color_modes; + UINT8 stat77_flags; }; struct snes_cart_info diff --git a/src/mame/machine/snes.c b/src/mame/machine/snes.c index 8c844e9823a..fb34074483a 100644 --- a/src/mame/machine/snes.c +++ b/src/mame/machine/snes.c @@ -120,7 +120,7 @@ static TIMER_CALLBACK( snes_reset_oam_address ) // make sure we're in the 65816's context since we're messing with the OAM and stuff const address_space *space = cputag_get_address_space(machine, "maincpu", ADDRESS_SPACE_PROGRAM); - if(!(snes_ram[INIDISP]&0x80)) //Reset OAM address, byuu says it happens at H=10 + if (!(snes_ppu.screen_disabled)) //Reset OAM address, byuu says it happens at H=10 { memory_write_byte(space, OAMADDL, snes_ppu.oam.saved_address_low ); /* Reset oam address */ memory_write_byte(space, OAMADDH, snes_ppu.oam.saved_address_high ); @@ -152,7 +152,7 @@ static TIMER_CALLBACK( snes_scanline_tick ) } } /* Horizontal IRQ timer */ - if( snes_ram[NMITIMEN] & 0x10 ) + if (snes_ram[NMITIMEN] & 0x10) { int setirq = 1; int pixel = ((snes_ram[HTIMEH] << 8) | snes_ram[HTIMEL]) & 0x1ff; @@ -181,14 +181,14 @@ static TIMER_CALLBACK( snes_scanline_tick ) } /* Start of VBlank */ - if( snes_ppu.beam.current_vert == snes_ppu.beam.last_visible_line ) + if (snes_ppu.beam.current_vert == snes_ppu.beam.last_visible_line) { timer_set(machine, video_screen_get_time_until_pos(machine->primary_screen, snes_ppu.beam.current_vert, 10), NULL, 0, snes_reset_oam_address); snes_ram[HVBJOY] |= 0x81; /* Set vblank bit to on & indicate controllers being read */ snes_ram[RDNMI] |= 0x80; /* Set NMI occured bit */ - if( snes_ram[NMITIMEN] & 0x80 ) /* NMI only signaled if this bit set */ + if (snes_ram[NMITIMEN] & 0x80) /* NMI only signaled if this bit set */ { // NMI goes off about 12 cycles after this (otherwise Chrono Trigger, NFL QB Club, etc. lock up) timer_adjust_oneshot(snes_nmi_timer, cputag_clocks_to_attotime(machine, "maincpu", 12), 0); @@ -244,12 +244,12 @@ static TIMER_CALLBACK( snes_scanline_tick ) snes_ram[HVBJOY] &= 0xfe; /* Clear busy bit */ } - if( snes_ppu.beam.current_vert == 0 ) + if (snes_ppu.beam.current_vert == 0) { /* VBlank is over, time for a new frame */ snes_ram[HVBJOY] &= 0x7f; /* Clear vblank bit */ snes_ram[RDNMI] &= 0x7f; /* Clear nmi occured bit */ - snes_ram[STAT77] &= 0x3f; /* Clear Time Over and Range Over bits */ snes_ram[STAT78] ^= 0x80; /* Toggle field flag */ + snes_ppu.stat77_flags &= 0x3f; /* Clear Time Over and Range Over bits */ cputag_set_input_line(machine, "maincpu", G65816_LINE_NMI, CLEAR_LINE ); } @@ -275,7 +275,7 @@ static TIMER_CALLBACK( snes_hblank_tick ) if (video_screen_get_vpos(machine->primary_screen) > 0) { /* Do HDMA */ - if( snes_ram[HDMAEN] ) + if (snes_ram[HDMAEN]) snes_hdma(cpu0space); 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); @@ -301,7 +301,7 @@ static TIMER_CALLBACK(snes_div_callback) UINT16 value, dividend, remainder; dividend = remainder = 0; value = (snes_ram[WRDIVH] << 8) + snes_ram[WRDIVL]; - if( snes_ram[WRDVDD] > 0 ) + if (snes_ram[WRDVDD] > 0) { dividend = value / snes_ram[WRDVDD]; remainder = value % snes_ram[WRDVDD]; @@ -342,7 +342,7 @@ static void snes_dynamic_res_change( running_machine *machine ) visarea.max_x = (SNES_SCR_WIDTH * 2) - 1; // fixme: should compensate for SNES_DBG_video - if( snes_ppu.mode == 5 || snes_ppu.mode == 6 ) + if (snes_ram[SETINI] & 0x08 || snes_ppu.mode == 5 || snes_ppu.mode == 6 ) snes_htmult = 2; else snes_htmult = 1; @@ -390,42 +390,42 @@ READ8_HANDLER( snes_r_io ) return spc_port_out[offset & 0x3]; } - if(snes_has_addon_chip == HAS_SUPERFX && devtag_get_device(space->machine, "superfx") != NULL) + if (snes_has_addon_chip == HAS_SUPERFX && devtag_get_device(space->machine, "superfx") != NULL) { - if(offset >= 0x3000 && offset < 0x3300) + if (offset >= 0x3000 && offset < 0x3300) { return superfx_mmio_read(devtag_get_device(space->machine, "superfx"), offset); } } - else if(snes_has_addon_chip == HAS_RTC) + else if (snes_has_addon_chip == HAS_RTC) { - if(offset == 0x2800 || offset == 0x2801) + if (offset == 0x2800 || offset == 0x2801) { return srtc_mmio_read(space->machine, offset); } } - else if(snes_has_addon_chip == HAS_SDD1) + else if (snes_has_addon_chip == HAS_SDD1) { - if(offset >= 0x4800 && offset < 0x4808) + if (offset >= 0x4800 && offset < 0x4808) { return sdd1_mmio_read(space, (UINT32)offset); } - if(offset < 0x80) + if (offset < 0x80) { offset += 0x4300; } } - else if(snes_has_addon_chip == HAS_SPC7110 || snes_has_addon_chip == HAS_SPC7110_RTC) + else if (snes_has_addon_chip == HAS_SPC7110 || snes_has_addon_chip == HAS_SPC7110_RTC) { UINT16 limit = (snes_has_addon_chip == HAS_SPC7110_RTC) ? 0x4842 : 0x483f; - if(offset >= 0x4800 && offset < limit) + if (offset >= 0x4800 && offset < limit) { return spc7110_mmio_read(space->machine, offset); } } /* offset is from 0x000000 */ - switch( offset ) + switch (offset) { case OAMDATA: /* 21xy for x=0,1,2 and y=4,5,6,8,9,a returns PPU1 open bus*/ case BGMODE: @@ -493,7 +493,7 @@ READ8_HANDLER( snes_r_io ) snes_ppu.ppu1_open_bus = (snes_oam[oam_addr] >> (snes_ram[OAMDATA] << 3)) & 0xff; snes_ram[OAMDATA] = (snes_ram[OAMDATA] + 1) % 2; - if( snes_ram[OAMDATA] == 0 ) + if (snes_ram[OAMDATA] == 0) { snes_ppu.oam.address++; snes_ppu.oam.address_low = snes_ram[OAMADDL] = snes_ppu.oam.address & 0xff; @@ -597,11 +597,11 @@ READ8_HANDLER( snes_r_io ) return snes_ppu.ppu2_open_bus; } case STAT77: /* PPU status flag and version number */ - value = snes_ram[offset] & 0xc0; // 0x80 & 0x40 are Time Over / Range Over Sprite flags, set by the video code + value = snes_ppu.stat77_flags & 0xc0; // 0x80 & 0x40 are Time Over / Range Over Sprite flags, set by the video code // 0x20 - Master/slave mode select. Little is known about this bit. We always seem to read back 0 here. value |= (snes_ppu.ppu1_open_bus & 0x10); value |= (snes_ppu.ppu1_version & 0x0f); - snes_ram[offset] = value; // not sure if this is needed... + snes_ppu.stat77_flags = value; // not sure if this is needed... snes_ppu.ppu1_open_bus = value; return snes_ppu.ppu1_open_bus; case STAT78: /* PPU status flag and version number */ @@ -631,27 +631,27 @@ READ8_HANDLER( snes_r_io ) return snes_ram[offset]; case OLDJOY1: /* Data for old NES controllers (JOYSER1) */ { - if( snes_ram[offset] & 0x1 ) + if (snes_ram[offset] & 0x1) { return 0 | (snes_open_bus_r(space,0) & 0xfc); //correct? } value = ((joy1l | (joy1h << 8) | 0x10000) >> (16 - (joypad[0].oldrol & 0xf))) & 0x1; joypad[0].oldrol++; joypad[0].oldrol&=0xf; - if( !(joypad[0].oldrol % 17) ) + if (!(joypad[0].oldrol % 17)) value = 0x1; return (value & 0x03) | (snes_open_bus_r(space,0) & 0xfc); //correct? } case OLDJOY2: /* Data for old NES controllers (JOYSER2) */ { - if( snes_ram[OLDJOY1] & 0x1 ) + if (snes_ram[OLDJOY1] & 0x1) { return 0 | 0x1c | (snes_open_bus_r(space,0) & 0xe0); //correct? } value = ((joy2l | (joy2h << 8) | 0x10000) >> (16 - (joypad[1].oldrol & 0xf))) & 0x1; joypad[1].oldrol++; joypad[1].oldrol&=0xf; - if( !(joypad[1].oldrol % 17) ) + if (!(joypad[1].oldrol % 17)) value = 0x1; //value |= 0x1c; // bits 4, 3, and 2 are always set return value | 0x1c | (snes_open_bus_r(space,0) & 0xe0); //correct? @@ -765,39 +765,39 @@ WRITE8_HANDLER( snes_w_io ) return; } - if(snes_has_addon_chip == HAS_SUPERFX && devtag_get_device(space->machine, "superfx") != NULL) + if (snes_has_addon_chip == HAS_SUPERFX && devtag_get_device(space->machine, "superfx") != NULL) { - if(offset >= 0x3000 && offset < 0x3300) + if (offset >= 0x3000 && offset < 0x3300) { superfx_mmio_write(devtag_get_device(space->machine, "superfx"), offset, data); return; } } - else if(snes_has_addon_chip == HAS_RTC) + else if (snes_has_addon_chip == HAS_RTC) { - if(offset == 0x2800 || offset == 0x2801) + if (offset == 0x2800 || offset == 0x2801) { srtc_mmio_write(space->machine, offset, data); return; } } - else if(snes_has_addon_chip == HAS_SDD1) + else if (snes_has_addon_chip == HAS_SDD1) { - if((offset >= 0x4300 && offset < 0x4380) || + if ((offset >= 0x4300 && offset < 0x4380) || (offset >= 0x4800 && offset < 0x4808)) { sdd1_mmio_write(space, (UINT32)offset, data); return; } - if(offset < 0x80) + if (offset < 0x80) { offset += 0x4300; } } - else if(snes_has_addon_chip == HAS_SPC7110 || snes_has_addon_chip == HAS_SPC7110_RTC) + else if (snes_has_addon_chip == HAS_SPC7110 || snes_has_addon_chip == HAS_SPC7110_RTC) { UINT16 limit = (snes_has_addon_chip == HAS_SPC7110_RTC) ? 0x4842 : 0x483f; - if(offset >= 0x4800 && offset < limit) + if (offset >= 0x4800 && offset < limit) { spc7110_mmio_write(space->machine, (UINT32)offset, data); return; @@ -805,20 +805,22 @@ WRITE8_HANDLER( snes_w_io ) } /* offset is from 0x000000 */ - switch( offset ) + switch (offset) { case INIDISP: /* Initial settings for screen */ - if((snes_ram[INIDISP] & 0x80) && (!(data & 0x80))) //a 1->0 force blank transition causes a reset OAM address + if ((snes_ppu.screen_disabled & 0x80) && (!(data & 0x80))) //a 1->0 force blank transition causes a reset OAM address { - memory_write_byte(space, OAMADDL, snes_ppu.oam.saved_address_low ); - memory_write_byte(space, OAMADDH, snes_ppu.oam.saved_address_high ); + memory_write_byte(space, OAMADDL, snes_ppu.oam.saved_address_low); + memory_write_byte(space, OAMADDH, snes_ppu.oam.saved_address_high); } + snes_ppu.screen_disabled = data & 0x80; + snes_ppu.screen_brightness = (data & 0x0f) + 1; break; case OBSEL: /* Object size and data area designation */ - snes_ppu.layer[4].data = ((data & 0x3) * 0x2000) << 1; - snes_ppu.oam.name_select = (((data & 0x18)>>3) * 0x1000) << 1; + snes_ppu.layer[SNES_OAM].data = ((data & 0x3) * 0x2000) << 1; + snes_ppu.oam.name_select = (((data & 0x18) >> 3) * 0x1000) << 1; /* Determine object size */ - switch( (data & 0xe0) >> 5 ) + switch ((data & 0xe0) >> 5) { case 0: /* 8 & 16 */ snes_ppu.oam.size[0] = 1; @@ -846,12 +848,12 @@ WRITE8_HANDLER( snes_w_io ) break; default: /* Unknown size so default to 8 & 16 */ - logerror( "Object size unsupported: %d\n", (data & 0xe0) >> 5 ); + logerror("Object size unsupported: %d\n", (data & 0xe0) >> 5); snes_ppu.oam.size[0] = 1; snes_ppu.oam.size[1] = 2; #ifdef SNES_DBG_REG_W - mame_printf_debug( "Object size unsupported: %d\n", (data & 0xe0) >> 5 ); + mame_printf_debug("Object size unsupported: %d\n", (data & 0xe0) >> 5); #endif } break; @@ -899,7 +901,7 @@ WRITE8_HANDLER( snes_w_io ) } } snes_ram[OAMDATA] = (snes_ram[OAMDATA] + 1) % 2; - if( snes_ram[OAMDATA] == 0 ) + if (snes_ram[OAMDATA] == 0) { snes_ram[OAMDATA] = 0; snes_ppu.oam.address++; @@ -912,19 +914,19 @@ WRITE8_HANDLER( snes_w_io ) snes_ppu.mode = data & 0x07; snes_dynamic_res_change(space->machine); snes_ppu.bg3_priority_bit = data & 0x08; - snes_ppu.layer[0].tile_size = (data >> 4) & 0x1; - snes_ppu.layer[1].tile_size = (data >> 5) & 0x1; - snes_ppu.layer[2].tile_size = (data >> 6) & 0x1; - snes_ppu.layer[3].tile_size = (data >> 7) & 0x1; + snes_ppu.layer[SNES_BG1].tile_size = (data >> 4) & 0x1; + snes_ppu.layer[SNES_BG2].tile_size = (data >> 5) & 0x1; + snes_ppu.layer[SNES_BG3].tile_size = (data >> 6) & 0x1; + snes_ppu.layer[SNES_BG4].tile_size = (data >> 7) & 0x1; snes_ppu.update_offsets = 1; break; case MOSAIC: /* Size and screen designation for mosaic */ /* FIXME: We support horizontal mosaic only partially */ snes_ppu.mosaic_size = (data & 0xf0) >> 4; - snes_ppu.layer[0].mosaic_enabled = data & 0x01; - snes_ppu.layer[1].mosaic_enabled = data & 0x02; - snes_ppu.layer[2].mosaic_enabled = data & 0x04; - snes_ppu.layer[3].mosaic_enabled = data & 0x08; + snes_ppu.layer[SNES_BG1].mosaic_enabled = data & 0x01; + snes_ppu.layer[SNES_BG2].mosaic_enabled = data & 0x02; + snes_ppu.layer[SNES_BG3].mosaic_enabled = data & 0x04; + snes_ppu.layer[SNES_BG4].mosaic_enabled = data & 0x08; break; case BG1SC: /* Address for storing SC data BG1 SC size designation */ case BG2SC: /* Address for storing SC data BG2 SC size designation */ @@ -934,18 +936,18 @@ WRITE8_HANDLER( snes_w_io ) snes_ppu.layer[offset - BG1SC].map_size = data & 0x3; break; case BG12NBA: /* Address for BG 1 and 2 character data */ - snes_ppu.layer[0].data = (data & 0xf) << 13; - snes_ppu.layer[1].data = (data & 0xf0) << 9; + snes_ppu.layer[SNES_BG1].data = (data & 0xf) << 13; + snes_ppu.layer[SNES_BG2].data = (data & 0xf0) << 9; break; case BG34NBA: /* Address for BG 3 and 4 character data */ - snes_ppu.layer[2].data = (data & 0xf) << 13; - snes_ppu.layer[3].data = (data & 0xf0) << 9; + snes_ppu.layer[SNES_BG3].data = (data & 0xf) << 13; + snes_ppu.layer[SNES_BG4].data = (data & 0xf0) << 9; break; // 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! case BG1HOFS: /* BG1 - horizontal scroll (DW) */ /* In Mode 0->6 we use ppu_last_scroll as Prev */ - snes_ppu.layer[0].offset.horizontal = (data << 8) | (snes_ppu.ppu_last_scroll & ~7) | ((snes_ppu.layer[0].offset.horizontal >> 8) & 7); + snes_ppu.layer[SNES_BG1].offset.horizontal = (data << 8) | (snes_ppu.ppu_last_scroll & ~7) | ((snes_ppu.layer[SNES_BG1].offset.horizontal >> 8) & 7); snes_ppu.ppu_last_scroll = data; /* In Mode 7 we use mode7_last_scroll as Prev */ snes_ppu.mode7.hor_offset = (data << 8) | (snes_ppu.mode7_last_scroll & ~7) | ((snes_ppu.mode7.hor_offset >> 8) & 7); @@ -954,7 +956,7 @@ WRITE8_HANDLER( snes_w_io ) return; case BG1VOFS: /* BG1 - vertical scroll (DW) */ /* In Mode 0->6 we use ppu_last_scroll as Prev */ - snes_ppu.layer[0].offset.vertical = (data << 8) | snes_ppu.ppu_last_scroll; + snes_ppu.layer[SNES_BG1].offset.vertical = (data << 8) | snes_ppu.ppu_last_scroll; snes_ppu.ppu_last_scroll = data; /* In Mode 7 we use mode7_last_scroll as Prev */ snes_ppu.mode7.ver_offset = (data << 8) | snes_ppu.mode7_last_scroll; @@ -962,32 +964,32 @@ WRITE8_HANDLER( snes_w_io ) snes_ppu.update_offsets = 1; return; case BG2HOFS: /* BG2 - horizontal scroll (DW) */ - snes_ppu.layer[1].offset.horizontal = (data << 8) | (snes_ppu.ppu_last_scroll & ~7) | ((snes_ppu.layer[1].offset.horizontal >> 8) & 7); + snes_ppu.layer[SNES_BG2].offset.horizontal = (data << 8) | (snes_ppu.ppu_last_scroll & ~7) | ((snes_ppu.layer[SNES_BG2].offset.horizontal >> 8) & 7); snes_ppu.ppu_last_scroll = data; snes_ppu.update_offsets = 1; return; case BG2VOFS: /* BG2 - vertical scroll (DW) */ - snes_ppu.layer[1].offset.vertical = (data << 8) | (snes_ppu.ppu_last_scroll); + snes_ppu.layer[SNES_BG2].offset.vertical = (data << 8) | (snes_ppu.ppu_last_scroll); snes_ppu.ppu_last_scroll = data; snes_ppu.update_offsets = 1; return; case BG3HOFS: /* BG3 - horizontal scroll (DW) */ - snes_ppu.layer[2].offset.horizontal = (data << 8) | (snes_ppu.ppu_last_scroll & ~7) | ((snes_ppu.layer[2].offset.horizontal >> 8) & 7); + snes_ppu.layer[SNES_BG3].offset.horizontal = (data << 8) | (snes_ppu.ppu_last_scroll & ~7) | ((snes_ppu.layer[SNES_BG3].offset.horizontal >> 8) & 7); snes_ppu.ppu_last_scroll = data; snes_ppu.update_offsets = 1; return; case BG3VOFS: /* BG3 - vertical scroll (DW) */ - snes_ppu.layer[2].offset.vertical = (data << 8) | (snes_ppu.ppu_last_scroll); + snes_ppu.layer[SNES_BG3].offset.vertical = (data << 8) | (snes_ppu.ppu_last_scroll); snes_ppu.ppu_last_scroll = data; snes_ppu.update_offsets = 1; return; case BG4HOFS: /* BG4 - horizontal scroll (DW) */ - snes_ppu.layer[3].offset.horizontal = (data << 8) | (snes_ppu.ppu_last_scroll & ~7) | ((snes_ppu.layer[3].offset.horizontal >> 8) & 7); + snes_ppu.layer[SNES_BG4].offset.horizontal = (data << 8) | (snes_ppu.ppu_last_scroll & ~7) | ((snes_ppu.layer[SNES_BG4].offset.horizontal >> 8) & 7); snes_ppu.ppu_last_scroll = data; snes_ppu.update_offsets = 1; return; case BG4VOFS: /* BG4 - vertical scroll (DW) */ - snes_ppu.layer[3].offset.vertical = (data << 8) | (snes_ppu.ppu_last_scroll); + snes_ppu.layer[SNES_BG4].offset.vertical = (data << 8) | (snes_ppu.ppu_last_scroll); snes_ppu.ppu_last_scroll = data; snes_ppu.update_offsets = 1; return; @@ -1124,38 +1126,38 @@ WRITE8_HANDLER( snes_w_io ) case W12SEL: /* Window mask settings for BG1-2 */ if (data != snes_ram[offset]) { - snes_ppu.layer[0].window1_invert = data & 0x01; - snes_ppu.layer[0].window1_enabled = data & 0x02; - snes_ppu.layer[0].window2_invert = data & 0x04; - snes_ppu.layer[0].window2_enabled = data & 0x08; - snes_ppu.layer[1].window1_invert = data & 0x10; - snes_ppu.layer[1].window1_enabled = data & 0x20; - snes_ppu.layer[1].window2_invert = data & 0x40; - snes_ppu.layer[1].window2_enabled = data & 0x80; + snes_ppu.layer[SNES_BG1].window1_invert = data & 0x01; + snes_ppu.layer[SNES_BG1].window1_enabled = data & 0x02; + snes_ppu.layer[SNES_BG1].window2_invert = data & 0x04; + snes_ppu.layer[SNES_BG1].window2_enabled = data & 0x08; + snes_ppu.layer[SNES_BG2].window1_invert = data & 0x10; + snes_ppu.layer[SNES_BG2].window1_enabled = data & 0x20; + snes_ppu.layer[SNES_BG2].window2_invert = data & 0x40; + snes_ppu.layer[SNES_BG2].window2_enabled = data & 0x80; snes_ppu.update_windows = 1; } break; case W34SEL: /* Window mask settings for BG3-4 */ if (data != snes_ram[offset]) { - snes_ppu.layer[2].window1_invert = data & 0x01; - snes_ppu.layer[2].window1_enabled = data & 0x02; - snes_ppu.layer[2].window2_invert = data & 0x04; - snes_ppu.layer[2].window2_enabled = data & 0x08; - snes_ppu.layer[3].window1_invert = data & 0x10; - snes_ppu.layer[3].window1_enabled = data & 0x20; - snes_ppu.layer[3].window2_invert = data & 0x40; - snes_ppu.layer[3].window2_enabled = data & 0x80; + snes_ppu.layer[SNES_BG3].window1_invert = data & 0x01; + snes_ppu.layer[SNES_BG3].window1_enabled = data & 0x02; + snes_ppu.layer[SNES_BG3].window2_invert = data & 0x04; + snes_ppu.layer[SNES_BG3].window2_enabled = data & 0x08; + snes_ppu.layer[SNES_BG4].window1_invert = data & 0x10; + snes_ppu.layer[SNES_BG4].window1_enabled = data & 0x20; + snes_ppu.layer[SNES_BG4].window2_invert = data & 0x40; + snes_ppu.layer[SNES_BG4].window2_enabled = data & 0x80; snes_ppu.update_windows = 1; } break; case WOBJSEL: /* Window mask settings for objects */ if (data != snes_ram[offset]) { - snes_ppu.layer[4].window1_invert = data & 0x01; - snes_ppu.layer[4].window1_enabled = data & 0x02; - snes_ppu.layer[4].window2_invert = data & 0x04; - snes_ppu.layer[4].window2_enabled = data & 0x08; + snes_ppu.layer[SNES_OAM].window1_invert = data & 0x01; + snes_ppu.layer[SNES_OAM].window1_enabled = data & 0x02; + snes_ppu.layer[SNES_OAM].window2_invert = data & 0x04; + snes_ppu.layer[SNES_OAM].window2_enabled = data & 0x08; snes_ppu.colour.window1_invert = data & 0x10; snes_ppu.colour.window1_enabled = data & 0x20; snes_ppu.colour.window2_invert = data & 0x40; @@ -1194,17 +1196,17 @@ WRITE8_HANDLER( snes_w_io ) case WBGLOG: /* Window mask logic for BG's */ if (data != snes_ram[offset]) { - snes_ppu.layer[0].wlog_mask = data & 0x03; - snes_ppu.layer[1].wlog_mask = (data & 0x0c) >> 2; - snes_ppu.layer[2].wlog_mask = (data & 0x30) >> 4; - snes_ppu.layer[3].wlog_mask = (data & 0xc0) >> 6; + snes_ppu.layer[SNES_BG1].wlog_mask = data & 0x03; + snes_ppu.layer[SNES_BG2].wlog_mask = (data & 0x0c) >> 2; + snes_ppu.layer[SNES_BG3].wlog_mask = (data & 0x30) >> 4; + snes_ppu.layer[SNES_BG4].wlog_mask = (data & 0xc0) >> 6; snes_ppu.update_windows = 1; } break; case WOBJLOG: /* Window mask logic for objects */ if (data != snes_ram[offset]) { - snes_ppu.layer[4].wlog_mask = data & 0x03; + snes_ppu.layer[SNES_OAM].wlog_mask = data & 0x03; snes_ppu.colour.wlog_mask = (data & 0x0c) >> 2; snes_ppu.update_windows = 1; } @@ -1224,18 +1226,18 @@ WRITE8_HANDLER( snes_w_io ) snes_ppu.sub_bg_enabled[4] = data & 0x10; break; case TMW: /* Window mask for main screen designation */ - snes_ppu.layer[0].main_window_enabled = data & 0x01; - snes_ppu.layer[1].main_window_enabled = data & 0x02; - snes_ppu.layer[2].main_window_enabled = data & 0x04; - snes_ppu.layer[3].main_window_enabled = data & 0x08; - snes_ppu.layer[4].main_window_enabled = data & 0x10; + snes_ppu.layer[SNES_BG1].main_window_enabled = data & 0x01; + snes_ppu.layer[SNES_BG2].main_window_enabled = data & 0x02; + snes_ppu.layer[SNES_BG3].main_window_enabled = data & 0x04; + snes_ppu.layer[SNES_BG4].main_window_enabled = data & 0x08; + snes_ppu.layer[SNES_OAM].main_window_enabled = data & 0x10; break; case TSW: /* Window mask for subscreen designation */ - snes_ppu.layer[0].sub_window_enabled = data & 0x01; - snes_ppu.layer[1].sub_window_enabled = data & 0x02; - snes_ppu.layer[2].sub_window_enabled = data & 0x04; - snes_ppu.layer[3].sub_window_enabled = data & 0x08; - snes_ppu.layer[4].sub_window_enabled = data & 0x10; + snes_ppu.layer[SNES_BG1].sub_window_enabled = data & 0x01; + snes_ppu.layer[SNES_BG2].sub_window_enabled = data & 0x02; + snes_ppu.layer[SNES_BG3].sub_window_enabled = data & 0x04; + snes_ppu.layer[SNES_BG4].sub_window_enabled = data & 0x08; + snes_ppu.layer[SNES_OAM].sub_window_enabled = data & 0x10; break; case CGWSEL: /* Initial settings for Fixed colour addition or screen addition */ /* FIXME: We don't support direct select for modes 3 & 4 or subscreen window stuff */ @@ -1244,46 +1246,48 @@ WRITE8_HANDLER( snes_w_io ) snes_ppu.sub_add_mode = data & 0x02; snes_ppu.direct_color = data & 0x01; #ifdef SNES_DBG_REG_W - if( (data & 0x2) != (snes_ram[CGWSEL] & 0x2) ) + if ((data & 0x2) != (snes_ram[CGWSEL] & 0x2)) mame_printf_debug( "Add/Sub Layer: %s\n", ((data & 0x2) >> 1) ? "Subscreen" : "Fixed colour" ); #endif break; case CGADSUB: /* Addition/Subtraction designation for each screen */ + snes_ppu.color_modes = data & 0xc0; { UINT8 sub = (data & 0x80) >> 7; - snes_ppu.layer[0].blend = (data & 0x1) << sub; - snes_ppu.layer[1].blend = ((data & 0x2) >> 1) << sub; - snes_ppu.layer[2].blend = ((data & 0x4) >> 2) << sub; - snes_ppu.layer[3].blend = ((data & 0x8) >> 3) << sub; - snes_ppu.layer[4].blend = ((data & 0x10) >> 4) << sub; + snes_ppu.layer[SNES_BG1].blend = (data & 0x1) << sub; + snes_ppu.layer[SNES_BG2].blend = ((data & 0x2) >> 1) << sub; + snes_ppu.layer[SNES_BG3].blend = ((data & 0x4) >> 2) << sub; + snes_ppu.layer[SNES_BG4].blend = ((data & 0x8) >> 3) << sub; + snes_ppu.layer[SNES_OAM].blend = ((data & 0x10) >> 4) << sub; } break; case COLDATA: /* Fixed colour data for fixed colour addition/subtraction */ { - /* 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. */ - UINT8 r,g,b; + /* 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. */ + UINT8 r, g, b; /* Get existing value. */ r = snes_cgram[FIXED_COLOUR] & 0x1f; g = (snes_cgram[FIXED_COLOUR] & 0x3e0) >> 5; b = (snes_cgram[FIXED_COLOUR] & 0x7c00) >> 10; /* Set new value */ - if( data & 0x20 ) + if (data & 0x20) r = data & 0x1f; - if( data & 0x40 ) + if (data & 0x40) g = data & 0x1f; - if( data & 0x80 ) + if (data & 0x80) b = data & 0x1f; snes_cgram[FIXED_COLOUR] = (r | (g << 5) | (b << 10)); } break; case SETINI: /* Screen mode/video select */ /* FIXME: We only support line count and interlace here */ - snes_ppu.interlace = (data & 1) ? 2 : 1; - snes_ppu.obj_interlace = (data & 2) ? 2 : 1; - snes_ppu.beam.last_visible_line = (data & 0x4) ? 240 : 225; + snes_ppu.interlace = (data & 0x01) ? 2 : 1; + snes_ppu.obj_interlace = (data & 0x02) ? 2 : 1; + snes_ppu.beam.last_visible_line = (data & 0x04) ? 240 : 225; + snes_ppu.pseudo_hires = data & 0x08; + snes_ppu.mode7.extbg = data & 0x40; snes_dynamic_res_change(space->machine); #ifdef SNES_DBG_REG_W - if( (data & 0x8) != (snes_ram[SETINI] & 0x8) ) + if ((data & 0x8) != (snes_ram[SETINI] & 0x8)) mame_printf_debug( "Pseudo 512 mode: %s\n", (data & 0x8) ? "on" : "off" ); #endif break; @@ -1302,7 +1306,7 @@ WRITE8_HANDLER( snes_w_io ) case WMADDH: /* Address to read/write to wram (high) */ break; case OLDJOY1: /* Old NES joystick support */ - if( ((data & 0x1) && !(snes_ram[offset] & 0x1)) || ((!(data & 0x1)) && (snes_ram[offset] & 0x1)) ) + if (((data & 0x1) && !(snes_ram[offset] & 0x1)) || ((!(data & 0x1)) && (snes_ram[offset] & 0x1))) { joypad[0].oldrol = 0; joypad[1].oldrol = 0; @@ -1341,7 +1345,7 @@ WRITE8_HANDLER( snes_w_io ) data = 0; /* Once DMA is done we need to reset all bits to 0 */ break; case HDMAEN: /* HDMA channel designation */ - if(data) //if a HDMA is enabled, data is inited at the next scanline + if (data) //if a HDMA is enabled, data is inited at the next scanline 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); break; case MEMSEL: /* Access cycle designation in memory (2) area */ @@ -1349,7 +1353,7 @@ WRITE8_HANDLER( snes_w_io ) * Currently we are just increasing it no matter what */ // cpu_set_clockscale(devtag_get_device(space->machine, "maincpu"), (data & 0x1) ? 1.335820896 : 1.0 ); #ifdef SNES_DBG_REG_W - if( (data & 0x1) != (snes_ram[MEMSEL] & 0x1) ) + if ((data & 0x1) != (snes_ram[MEMSEL] & 0x1)) mame_printf_debug( "CPU speed: %f Mhz\n", (data & 0x1) ? 3.58 : 2.68 ); #endif break; @@ -1586,7 +1590,10 @@ READ8_HANDLER( snes_r_bank3 ) else if (snes_cart.mode & 5) /* Mode 20 & 22 */ { if ((address < 0x8000) && (snes_cart.mode == SNES_MODE_20)) //FIXME: check this - value = snes_ram[0x200000 + ((offset & ~0x8000) | 0x8000)]; /* Reserved */ + { + value = 0xff; /* Reserved */ + //value = snes_ram[0x200000 + ((offset & ~0x8000) | 0x8000)]; // is this hack still needed? /* Reserved */ + } else value = snes_ram[0x400000 + offset]; } @@ -1668,7 +1675,7 @@ READ8_HANDLER( snes_r_bank6 ) if (address < 0x8000) { - if(address >= 0x6000 && snes_has_addon_chip == HAS_SUPERFX && devtag_get_device(space->machine, "superfx") != NULL) + if (address >= 0x6000 && snes_has_addon_chip == HAS_SUPERFX && devtag_get_device(space->machine, "superfx") != NULL) logerror( "snes_r_bank6 hit in Super FX mode, please fix me\n" ); else if (snes_cart.mode != SNES_MODE_25) value = memory_read_byte(space, offset); @@ -1713,11 +1720,11 @@ READ8_HANDLER( snes_r_bank7 ) UINT8 value = 0; UINT16 address = offset & 0xffff; - if(snes_has_addon_chip == HAS_SDD1) + if (snes_has_addon_chip == HAS_SDD1) { return sdd1_read(space->machine, offset); } - else if(snes_has_addon_chip == HAS_SUPERFX && devtag_get_device(space->machine, "superfx") != NULL) + else if (snes_has_addon_chip == HAS_SUPERFX && devtag_get_device(space->machine, "superfx") != NULL) { logerror( "snes_r_bank7 hit in Super FX mode, please fix me\n" ); } @@ -1894,7 +1901,7 @@ WRITE8_HANDLER( snes_w_bank6 ) { logerror( "snes_w_bank6 hit (RAM) in Super FX mode, please fix me\n" ); } - else if(snes_has_addon_chip == HAS_CX4) + else if (snes_has_addon_chip == HAS_CX4) { //printf( "R: CX4 hit from 0x800000\n" ); } @@ -2094,7 +2101,7 @@ static void snes_init_ram(running_machine *machine) } // init frame counter so first line is 0 - if( ATTOSECONDS_TO_HZ(video_screen_get_frame_period(machine->primary_screen).attoseconds) >= 59 ) + if (ATTOSECONDS_TO_HZ(video_screen_get_frame_period(machine->primary_screen).attoseconds) >= 59) { snes_ppu.beam.current_vert = SNES_VTOTAL_NTSC; } @@ -2109,9 +2116,9 @@ void snes_hdma_init() UINT8 mask = 1, dma = 0, i; snes_hdma_chnl = snes_ram[HDMAEN]; - for( i = 0; i < 8; i++ ) + for (i = 0; i < 8; i++) { - if( snes_ram[HDMAEN] & mask ) + if (snes_ram[HDMAEN] & mask) { snes_ram[SNES_DMA_BASE + dma + 8] = snes_ram[SNES_DMA_BASE + dma + 2]; snes_ram[SNES_DMA_BASE + dma + 9] = snes_ram[SNES_DMA_BASE + dma + 3]; @@ -2150,7 +2157,7 @@ MACHINE_START( snes ) snes_ram[WRDIVL] = 0xff; snes_ram[WRDIVH] = 0xff; - switch(snes_has_addon_chip) + switch (snes_has_addon_chip) { case HAS_SDD1: sdd1_init(machine); @@ -2172,9 +2179,9 @@ MACHINE_RESET( snes ) snes_init_ram(machine); /* Set STAT78 to NTSC or PAL */ - if( ATTOSECONDS_TO_HZ(video_screen_get_frame_period(machine->primary_screen).attoseconds) >= 59.0f ) + if (ATTOSECONDS_TO_HZ(video_screen_get_frame_period(machine->primary_screen).attoseconds) >= 59.0f) snes_ram[STAT78] = SNES_NTSC; - else /* if( ATTOSECONDS_TO_HZ(video_screen_get_frame_period(machine->primary_screen).attoseconds) == 50.0f ) */ + else /* if (ATTOSECONDS_TO_HZ(video_screen_get_frame_period(machine->primary_screen).attoseconds) == 50.0f) */ snes_ram[STAT78] = SNES_PAL; // reset does this to these registers @@ -2331,18 +2338,18 @@ void snes_hdma(const address_space *space) UINT32 abus; /* Assume priority of the 8 DMA channels is 0-7 */ - for( i = 0; i < 8; i++ ) + for (i = 0; i < 8; i++) { - if( snes_hdma_chnl & mask ) + if (snes_hdma_chnl & mask) { /* Check if we need to read a new line from the table */ - if( !(snes_ram[SNES_DMA_BASE + dma + 0xa] & 0x7f ) ) + if (!(snes_ram[SNES_DMA_BASE + dma + 0xa] & 0x7f)) { abus = (snes_ram[SNES_DMA_BASE + dma + 4] << 16) + (snes_ram[SNES_DMA_BASE + dma + 9] << 8) + snes_ram[SNES_DMA_BASE + dma + 8]; /* Get the number of lines */ snes_ram[SNES_DMA_BASE + dma + 0xa] = memory_read_byte(space, abus); - if( !snes_ram[SNES_DMA_BASE + dma + 0xa] ) + if (!snes_ram[SNES_DMA_BASE + dma + 0xa]) { /* No more lines so clear HDMA */ snes_hdma_chnl &= ~mask; @@ -2351,7 +2358,7 @@ void snes_hdma(const address_space *space) abus++; snes_ram[SNES_DMA_BASE + dma + 8] = abus & 0xff; snes_ram[SNES_DMA_BASE + dma + 9] = (abus >> 8) & 0xff; - if( snes_ram[SNES_DMA_BASE + dma] & 0x40 ) + if (snes_ram[SNES_DMA_BASE + dma] & 0x40) { snes_ram[SNES_DMA_BASE + dma + 5] = memory_read_byte(space, abus++); snes_ram[SNES_DMA_BASE + dma + 6] = memory_read_byte(space, abus++); @@ -2363,7 +2370,7 @@ void snes_hdma(const address_space *space) contmode = (--snes_ram[SNES_DMA_BASE + dma + 0xa]) & 0x80; /* Transfer addresses */ - if( snes_ram[SNES_DMA_BASE + dma] & 0x40 ) /* Indirect */ + if (snes_ram[SNES_DMA_BASE + dma] & 0x40) /* Indirect */ abus = (snes_ram[SNES_DMA_BASE + dma + 7] << 16) + (snes_ram[SNES_DMA_BASE + dma + 6] << 8) + snes_ram[SNES_DMA_BASE + dma + 5]; else /* Absolute */ abus = (snes_ram[SNES_DMA_BASE + dma + 4] << 16) + (snes_ram[SNES_DMA_BASE + dma + 9] << 8) + snes_ram[SNES_DMA_BASE + dma + 8]; @@ -2373,7 +2380,7 @@ void snes_hdma(const address_space *space) 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] ); #endif - switch( snes_ram[SNES_DMA_BASE + dma] & 0x7 ) + switch (snes_ram[SNES_DMA_BASE + dma] & 0x7) { case 0: /* 1 address */ { @@ -2420,9 +2427,9 @@ void snes_hdma(const address_space *space) } /* Update address */ - if( contmode ) + if (contmode) { - if( snes_ram[SNES_DMA_BASE + dma] & 0x40 ) /* Indirect */ + if (snes_ram[SNES_DMA_BASE + dma] & 0x40) /* Indirect */ { snes_ram[SNES_DMA_BASE + dma + 5] = abus & 0xff; snes_ram[SNES_DMA_BASE + dma + 6] = (abus >> 8) & 0xff; @@ -2434,11 +2441,11 @@ void snes_hdma(const address_space *space) } } - if( !(snes_ram[SNES_DMA_BASE + dma + 0xa] & 0x7f) ) + if (!(snes_ram[SNES_DMA_BASE + dma + 0xa] & 0x7f)) { - if( !(snes_ram[SNES_DMA_BASE + dma] & 0x40) ) /* Absolute */ + if (!(snes_ram[SNES_DMA_BASE + dma] & 0x40)) /* Absolute */ { - if( !contmode ) + if (!contmode) { snes_ram[SNES_DMA_BASE + dma + 8] = abus & 0xff; snes_ram[SNES_DMA_BASE + dma + 9] = (abus >> 8) & 0xff; @@ -2459,9 +2466,9 @@ void snes_gdma( const address_space *space, UINT8 channels ) UINT32 abus, abus_bank, length; /* Assume priority of the 8 DMA channels is 0-7 */ - for( i = 0; i < 8; i++ ) + for (i = 0; i < 8; i++) { - if( channels & mask ) + if (channels & mask) { //printf( "Making a transfer on channel %d\n", i ); /* Find transfer addresses */ @@ -2471,13 +2478,13 @@ void snes_gdma( const address_space *space, UINT8 channels ) //printf( "Address: %06x\n", abus | abus_bank ); /* Auto increment */ - if( snes_ram[SNES_DMA_BASE + dma] & 0x8 ) + if (snes_ram[SNES_DMA_BASE + dma] & 0x8) { increment = 0; } else { - if( snes_ram[SNES_DMA_BASE + dma] & 0x10 ) + if (snes_ram[SNES_DMA_BASE + dma] & 0x10) increment = -1; else increment = 1; @@ -2485,7 +2492,7 @@ void snes_gdma( const address_space *space, UINT8 channels ) /* Number of bytes to transfer */ length = (snes_ram[SNES_DMA_BASE + dma + 6] << 8) + snes_ram[SNES_DMA_BASE + dma + 5]; - if( !length ) + if (!length) length = 0x10000; /* 0x0000 really means 0x10000 */ // 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 ); @@ -2494,15 +2501,15 @@ void snes_gdma( const address_space *space, UINT8 channels ) 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 ); #endif - switch( snes_ram[SNES_DMA_BASE + dma] & 0x7 ) + switch (snes_ram[SNES_DMA_BASE + dma] & 0x7) { case 0: /* 1 address */ case 2: /* 1 address ?? */ case 6: { - while( length-- ) + while (length--) { - if( snes_ram[SNES_DMA_BASE + dma] & 0x80 ) /* PPU->CPU */ + if (snes_ram[SNES_DMA_BASE + dma] & 0x80) /* PPU->CPU */ memory_write_byte(space, ((abus & 0xffff) | (abus_bank)), memory_read_byte(space, bbus) ); else /* CPU->PPU */ memory_write_byte(space, bbus, memory_read_byte(space, ((abus & 0xffff) | (abus_bank))) ); @@ -2512,16 +2519,16 @@ void snes_gdma( const address_space *space, UINT8 channels ) case 1: /* 2 addresses (l,h) */ case 5: { - while( length-- ) + while (length--) { - if( snes_ram[SNES_DMA_BASE + dma] & 0x80 ) /* PPU->CPU */ + if (snes_ram[SNES_DMA_BASE + dma] & 0x80) /* PPU->CPU */ memory_write_byte(space, ((abus & 0xffff) | (abus_bank)), memory_read_byte(space, bbus) ); else /* CPU->PPU */ memory_write_byte(space, bbus, memory_read_byte(space, ((abus & 0xffff) | (abus_bank))) ); abus += increment; - if( !(length--) ) + if (!(length--)) break; - if( snes_ram[SNES_DMA_BASE + dma] & 0x80 ) /* PPU->CPU */ + if (snes_ram[SNES_DMA_BASE + dma] & 0x80) /* PPU->CPU */ memory_write_byte(space, ((abus & 0xffff) | (abus_bank)), memory_read_byte(space, bbus + 1) ); else /* CPU->PPU */ memory_write_byte(space, bbus + 1, memory_read_byte(space, ((abus & 0xffff) | (abus_bank))) ); @@ -2531,30 +2538,30 @@ void snes_gdma( const address_space *space, UINT8 channels ) case 3: /* 2 addresses/write twice (l,l,h,h) */ case 7: { - while( length-- ) + while (length--) { - if( snes_ram[SNES_DMA_BASE + dma] & 0x80 ) /* PPU->CPU */ + if (snes_ram[SNES_DMA_BASE + dma] & 0x80) /* PPU->CPU */ memory_write_byte(space, ((abus & 0xffff) | (abus_bank)), memory_read_byte(space, bbus) ); else /* CPU->PPU */ memory_write_byte(space, bbus, memory_read_byte(space, ((abus & 0xffff) | (abus_bank))) ); abus += increment; - if( !(length--) ) + if (!(length--)) break; - if( snes_ram[SNES_DMA_BASE + dma] & 0x80 ) /* PPU->CPU */ + if (snes_ram[SNES_DMA_BASE + dma] & 0x80) /* PPU->CPU */ memory_write_byte(space, ((abus & 0xffff) | (abus_bank)), memory_read_byte(space, bbus) ); else /* CPU->PPU */ memory_write_byte(space, bbus, memory_read_byte(space, ((abus & 0xffff) | (abus_bank))) ); abus += increment; - if( !(length--) ) + if (!(length--)) break; - if( snes_ram[SNES_DMA_BASE + dma] & 0x80 ) /* PPU->CPU */ + if (snes_ram[SNES_DMA_BASE + dma] & 0x80) /* PPU->CPU */ memory_write_byte(space, ((abus & 0xffff) | (abus_bank)), memory_read_byte(space, bbus + 1) ); else /* CPU->PPU */ memory_write_byte(space, bbus + 1, memory_read_byte(space, ((abus & 0xffff) | (abus_bank))) ); abus += increment; - if( !(length--) ) + if (!(length--)) break; - if( snes_ram[SNES_DMA_BASE + dma] & 0x80 ) /* PPU->CPU */ + if (snes_ram[SNES_DMA_BASE + dma] & 0x80) /* PPU->CPU */ memory_write_byte(space, ((abus & 0xffff) | (abus_bank)), memory_read_byte(space, bbus + 1) ); else /* CPU->PPU */ memory_write_byte(space, bbus + 1, memory_read_byte(space, ((abus & 0xffff) | (abus_bank))) ); @@ -2563,30 +2570,30 @@ void snes_gdma( const address_space *space, UINT8 channels ) } break; case 4: /* 4 addresses (l,h,l,h) */ { - while( length-- ) + while (length--) { - if( snes_ram[SNES_DMA_BASE + dma] & 0x80 ) /* PPU->CPU */ + if (snes_ram[SNES_DMA_BASE + dma] & 0x80) /* PPU->CPU */ memory_write_byte(space, ((abus & 0xffff) | (abus_bank)), memory_read_byte(space, bbus) ); else /* CPU->PPU */ memory_write_byte(space, bbus, memory_read_byte(space, ((abus & 0xffff) | (abus_bank))) ); abus += increment; - if( !(length--) ) + if (!(length--)) break; - if( snes_ram[SNES_DMA_BASE + dma] & 0x80 ) /* PPU->CPU */ + if (snes_ram[SNES_DMA_BASE + dma] & 0x80) /* PPU->CPU */ memory_write_byte(space, ((abus & 0xffff) | (abus_bank)), memory_read_byte(space, bbus + 1) ); else /* CPU->PPU */ memory_write_byte(space, bbus + 1, memory_read_byte(space, ((abus & 0xffff) | (abus_bank))) ); abus += increment; - if( !(length--) ) + if (!(length--)) break; - if( snes_ram[SNES_DMA_BASE + dma] & 0x80 ) /* PPU->CPU */ + if (snes_ram[SNES_DMA_BASE + dma] & 0x80) /* PPU->CPU */ memory_write_byte(space, ((abus & 0xffff) | (abus_bank)), memory_read_byte(space, bbus + 2) ); else /* CPU->PPU */ memory_write_byte(space, bbus + 2, memory_read_byte(space, ((abus & 0xffff) | (abus_bank))) ); abus += increment; - if( !(length--) ) + if (!(length--)) break; - if( snes_ram[SNES_DMA_BASE + dma] & 0x80 ) /* PPU->CPU */ + if (snes_ram[SNES_DMA_BASE + dma] & 0x80) /* PPU->CPU */ memory_write_byte(space, ((abus & 0xffff) | (abus_bank)), memory_read_byte(space, bbus + 3) ); else /* CPU->PPU */ memory_write_byte(space, bbus + 3, memory_read_byte(space, ((abus & 0xffff) | (abus_bank))) ); diff --git a/src/mame/video/snes.c b/src/mame/video/snes.c index 63f7fac6b1a..b6bf8bbeaf4 100644 --- a/src/mame/video/snes.c +++ b/src/mame/video/snes.c @@ -140,8 +140,8 @@ enum INLINE void snes_draw_blend(UINT16 offset, UINT16 *colour, UINT8 mode, UINT8 clip, UINT8 black_pen_clip ) { if( (black_pen_clip == SNES_CLIP_ALL2) || - (black_pen_clip == SNES_CLIP_IN && snes_ppu.clipmasks[5][offset]) || - (black_pen_clip == SNES_CLIP_OUT && !snes_ppu.clipmasks[5][offset])) + (black_pen_clip == SNES_CLIP_IN && snes_ppu.clipmasks[SNES_COLOR][offset]) || + (black_pen_clip == SNES_CLIP_OUT && !snes_ppu.clipmasks[SNES_COLOR][offset])) *colour = 0; //clip to black before color math if (clip == SNES_CLIP_ALL2) // blending mode 3 == always OFF @@ -151,8 +151,8 @@ INLINE void snes_draw_blend(UINT16 offset, UINT16 *colour, UINT8 mode, UINT8 cli if( !debug_options.transparency_disabled ) #endif /* MAME_DEBUG */ if( (clip == SNES_CLIP_ALL) || - (clip == SNES_CLIP_IN && !snes_ppu.clipmasks[5][offset]) || - (clip == SNES_CLIP_OUT && snes_ppu.clipmasks[5][offset]) ) + (clip == SNES_CLIP_IN && !snes_ppu.clipmasks[SNES_COLOR][offset]) || + (clip == SNES_CLIP_OUT && snes_ppu.clipmasks[SNES_COLOR][offset]) ) { UINT16 r, g, b; @@ -165,7 +165,7 @@ INLINE void snes_draw_blend(UINT16 offset, UINT16 *colour, UINT8 mode, UINT8 cli b = ((*colour & 0x7c00) >> 10) + ((scanlines[SUBSCREEN].buffer[offset] & 0x7c00) >> 10); /* don't halve for the back colour */ - if( (snes_ram[CGADSUB] & 0x40) && (scanlines[SUBSCREEN].zbuf[offset] || scanlines[SUBSCREEN].buffer[offset] != snes_cgram[FIXED_COLOUR]) ) + if ((snes_ppu.color_modes & 0x40) && (scanlines[SUBSCREEN].zbuf[offset] || scanlines[SUBSCREEN].buffer[offset] != snes_cgram[FIXED_COLOUR])) { r >>= 1; g >>= 1; @@ -179,7 +179,7 @@ INLINE void snes_draw_blend(UINT16 offset, UINT16 *colour, UINT8 mode, UINT8 cli b = ((*colour & 0x7c00) >> 10) + ((snes_cgram[FIXED_COLOUR] & 0x7c00) >> 10); /* don't halve for the back colour */ - if( (snes_ram[CGADSUB] & 0x40) && (scanlines[SUBSCREEN].zbuf[offset] || scanlines[SUBSCREEN].buffer[offset] != snes_cgram[FIXED_COLOUR]) ) + if ((snes_ppu.color_modes & 0x40) && (scanlines[SUBSCREEN].zbuf[offset] || scanlines[SUBSCREEN].buffer[offset] != snes_cgram[FIXED_COLOUR])) { r >>= 1; g >>= 1; @@ -203,7 +203,7 @@ INLINE void snes_draw_blend(UINT16 offset, UINT16 *colour, UINT8 mode, UINT8 cli if( b > 0x1f ) b = 0; /* don't halve for the back colour */ - if( (snes_ram[CGADSUB] & 0x40) && (scanlines[SUBSCREEN].zbuf[offset] || scanlines[SUBSCREEN].buffer[offset] != snes_cgram[FIXED_COLOUR]) ) + if ((snes_ppu.color_modes & 0x40) && (scanlines[SUBSCREEN].zbuf[offset] || scanlines[SUBSCREEN].buffer[offset] != snes_cgram[FIXED_COLOUR])) { r >>= 1; g >>= 1; @@ -220,7 +220,7 @@ INLINE void snes_draw_blend(UINT16 offset, UINT16 *colour, UINT8 mode, UINT8 cli if( b > 0x1f ) b = 0; /* don't halve for the back colour */ - if( (snes_ram[CGADSUB] & 0x40) && (scanlines[SUBSCREEN].zbuf[offset] || scanlines[SUBSCREEN].buffer[offset] != snes_cgram[FIXED_COLOUR]) ) + if ((snes_ppu.color_modes & 0x40) && (scanlines[SUBSCREEN].zbuf[offset] || scanlines[SUBSCREEN].buffer[offset] != snes_cgram[FIXED_COLOUR])) { r >>= 1; g >>= 1; @@ -385,9 +385,9 @@ INLINE void snes_draw_tile_object(UINT8 screen, UINT16 tileaddr, INT16 x, UINT8 if (!debug_options.windows_disabled) #endif /* MAME_DEBUG */ /* Clip to windows */ - window_enabled = (screen == MAINSCREEN) ? snes_ppu.layer[4].main_window_enabled : snes_ppu.layer[4].sub_window_enabled; + window_enabled = (screen == MAINSCREEN) ? snes_ppu.layer[4].main_window_enabled : snes_ppu.layer[SNES_OAM].sub_window_enabled; if (window_enabled) - colour &= snes_ppu.clipmasks[4][ii]; + colour &= snes_ppu.clipmasks[SNES_OAM][ii]; /* Only draw if we have a colour (0 == transparent) */ if (colour) @@ -396,7 +396,7 @@ INLINE void snes_draw_tile_object(UINT8 screen, UINT16 tileaddr, INT16 x, UINT8 { c = snes_cgram[pal + colour]; if (blend && screen == MAINSCREEN) /* Only blend main screens */ - snes_draw_blend(ii/snes_htmult, &c, snes_ppu.layer[4].blend, snes_ppu.sub_color_mask, snes_ppu.main_color_mask); + snes_draw_blend(ii/snes_htmult, &c, snes_ppu.layer[SNES_OAM].blend, snes_ppu.sub_color_mask, snes_ppu.main_color_mask); scanlines[screen].buffer[ii] = c; scanlines[screen].zbuf[ii] = priority; @@ -654,13 +654,13 @@ static void snes_update_line_mode7(UINT8 screen, UINT8 priority_a, UINT8 priorit /* MOSAIC - to be verified */ if (layer == 1) // BG2 use two different bits for horizontal and vertical mosaic { - mosaic_x = snes_ppu.mosaic_table[snes_ppu.layer[1].mosaic_enabled ? snes_ppu.mosaic_size : 0]; - mosaic_y = snes_ppu.mosaic_table[snes_ppu.layer[0].mosaic_enabled ? snes_ppu.mosaic_size : 0]; + mosaic_x = snes_ppu.mosaic_table[snes_ppu.layer[SNES_BG2].mosaic_enabled ? snes_ppu.mosaic_size : 0]; + mosaic_y = snes_ppu.mosaic_table[snes_ppu.layer[SNES_BG1].mosaic_enabled ? snes_ppu.mosaic_size : 0]; } else // BG1 works as usual { - mosaic_x = snes_ppu.mosaic_table[snes_ppu.layer[0].mosaic_enabled ? snes_ppu.mosaic_size : 0]; - mosaic_y = snes_ppu.mosaic_table[snes_ppu.layer[0].mosaic_enabled ? snes_ppu.mosaic_size : 0]; + mosaic_x = snes_ppu.mosaic_table[snes_ppu.layer[SNES_BG1].mosaic_enabled ? snes_ppu.mosaic_size : 0]; + mosaic_y = snes_ppu.mosaic_table[snes_ppu.layer[SNES_BG1].mosaic_enabled ? snes_ppu.mosaic_size : 0]; } /* Let's do some mode7 drawing huh? */ @@ -830,9 +830,9 @@ static void snes_update_objects( UINT8 screen, UINT8 priority_tbl, UINT16 curlin if( (x + (count << 3) < SNES_SCR_WIDTH + 8) ) { if( widemode ) - 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); + 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); else - 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); + 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); } time_over++; /* Increase time_over. Should we stop drawing if exceeded 34 tiles? */ } @@ -844,33 +844,30 @@ static void snes_update_objects( UINT8 screen, UINT8 priority_tbl, UINT16 curlin if( (x + (xs << 3) < SNES_SCR_WIDTH + 8) ) { if( widemode ) - 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); + 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); else - 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); + 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); } time_over++; /* Increase time_over. Should we stop drawing if exceeded 34 tiles? */ } } - /* Increase range_over. - * Stop drawing if exceeded 32 objects and - * enforcing that limit is enabled */ + /* Increase range_over. Stop drawing if exceeded 32 objects and enforcing that limit is enabled */ range_over++; - if( range_over == 32 ) //&& (input_port_read(machine, "INTERNAL") & 0x01) ) + if (range_over == 32) //&& (input_port_read(machine, "INTERNAL") & 0x01) ) { /* Set the flag in STAT77 register */ - snes_ram[STAT77] |= 0x40; - /* FIXME: This stops the SNESTest rom from drawing the object - * test properly. Maybe we shouldn't stop drawing? */ + snes_ppu.stat77_flags |= 0x40; + /* FIXME: This stops the SNESTest rom from drawing the object test properly. Maybe we shouldn't stop drawing? */ /* return; */ } } } - if( time_over >= 34 ) + if (time_over >= 34) { /* Set the flag in STAT77 register */ - snes_ram[STAT77] |= 0x80; + snes_ppu.stat77_flags |= 0x80; } } @@ -964,11 +961,10 @@ static void snes_update_mode_6( UINT8 screen, UINT16 curline ) static void snes_update_mode_7( UINT8 screen, UINT16 curline ) { - UINT8 extbg_mode = snes_ram[SETINI] & 0x40; UINT8 *bg_enabled; bg_enabled = (screen == MAINSCREEN) ? snes_ppu.main_bg_enabled : snes_ppu.sub_bg_enabled; - if (!extbg_mode) + if (!snes_ppu.mode7.extbg) { if (bg_enabled[4]) snes_update_objects(screen, 7, curline); if (bg_enabled[0]) snes_update_line_mode7(screen, 1, 1, 0, curline); @@ -1071,7 +1067,7 @@ static void snes_update_windowmasks(void) } /* update colour window */ - snes_ppu.clipmasks[5][ii] = 0xff; + snes_ppu.clipmasks[SNES_COLOR][ii] = 0xff; w1 = w2 = -1; if (snes_ppu.colour.window1_enabled) { @@ -1093,28 +1089,28 @@ static void snes_update_windowmasks(void) if (snes_ppu.colour.window2_invert) w2 = !w2; } - if( w1 >= 0 && w2 >= 0 ) + if (w1 >= 0 && w2 >= 0) { switch (snes_ppu.colour.wlog_mask) { case 0x0: /* OR */ - snes_ppu.clipmasks[5][ii] = w1 | w2 ? 0x00 : 0xff; + snes_ppu.clipmasks[SNES_COLOR][ii] = w1 | w2 ? 0x00 : 0xff; break; case 0x4: /* AND */ - snes_ppu.clipmasks[5][ii] = w1 & w2 ? 0x00 : 0xff; + snes_ppu.clipmasks[SNES_COLOR][ii] = w1 & w2 ? 0x00 : 0xff; break; case 0x8: /* XOR */ - snes_ppu.clipmasks[5][ii] = w1 ^ w2 ? 0x00 : 0xff; + snes_ppu.clipmasks[SNES_COLOR][ii] = w1 ^ w2 ? 0x00 : 0xff; break; case 0xc: /* XNOR */ - snes_ppu.clipmasks[5][ii] = !(w1 ^ w2) ? 0x00 : 0xff; + snes_ppu.clipmasks[SNES_COLOR][ii] = !(w1 ^ w2) ? 0x00 : 0xff; break; } } - else if( w1 >= 0 ) - snes_ppu.clipmasks[5][ii] = w1 ? 0x00 : 0xff; - else if( w2 >= 0 ) - snes_ppu.clipmasks[5][ii] = w2 ? 0x00 : 0xff; + else if (w1 >= 0) + snes_ppu.clipmasks[SNES_COLOR][ii] = w1 ? 0x00 : 0xff; + else if (w2 >= 0) + snes_ppu.clipmasks[SNES_COLOR][ii] = w2 ? 0x00 : 0xff; } } @@ -1135,14 +1131,14 @@ static void snes_update_offsets(void) } #if 0 popmessage("%04x %04x|%04x %04x|%04x %04x|%04x %04x", - snes_ppu.layer[0].offset.tile_horz, - snes_ppu.layer[0].offset.tile_vert, - snes_ppu.layer[1].offset.tile_horz, - snes_ppu.layer[1].offset.tile_vert, - snes_ppu.layer[2].offset.tile_horz, - snes_ppu.layer[2].offset.tile_vert, - snes_ppu.layer[3].offset.tile_horz, - snes_ppu.layer[3].offset.tile_vert + snes_ppu.layer[SNES_BG1].offset.tile_horz, + snes_ppu.layer[SNES_BG1].offset.tile_vert, + snes_ppu.layer[SNES_BG2].offset.tile_horz, + snes_ppu.layer[SNES_BG2].offset.tile_vert, + snes_ppu.layer[SNES_BG3].offset.tile_horz, + snes_ppu.layer[SNES_BG3].offset.tile_vert, + snes_ppu.layer[SNES_BG4].offset.tile_horz, + snes_ppu.layer[SNES_BG4].offset.tile_vert ); #endif snes_ppu.update_offsets = 0; @@ -1162,7 +1158,7 @@ static void snes_refresh_scanline( running_machine *machine, bitmap_t *bitmap, U profiler_mark_start(PROFILER_VIDEO); - if (snes_ram[INIDISP] & 0x80) /* screen is forced blank */ + if (snes_ppu.screen_disabled) /* screen is forced blank */ for (x = 0; x < SNES_SCR_WIDTH * 2; x++) *BITMAP_ADDR32(bitmap, curline, x) = RGB_BLACK; else @@ -1199,7 +1195,7 @@ static void snes_refresh_scanline( running_machine *machine, bitmap_t *bitmap, U { for(ii = 0; ii < SNES_SCR_WIDTH * snes_htmult; ii++) { - 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); + 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); } } @@ -1221,7 +1217,7 @@ static void snes_refresh_scanline( running_machine *machine, bitmap_t *bitmap, U scanline = &scanlines[MAINSCREEN]; /* Phew! Draw the line to screen */ - fade = (snes_ram[INIDISP] & 0xf) + 1; + fade = snes_ppu.screen_brightness; for (x = 0; x < SNES_SCR_WIDTH * 2; x++) { @@ -1417,11 +1413,11 @@ static UINT8 snes_dbg_video( running_machine *machine, bitmap_t *bitmap, UINT16 WINLOGIC[(snes_ram[WBGLOG] & 0x3)], (snes_ram[W12SEL] & 0x2)?((snes_ram[W12SEL] & 0x1)?"o":"i"):" ", (snes_ram[W12SEL] & 0x8)?((snes_ram[W12SEL] & 0x4)?"o":"i"):" ", - snes_ppu.layer[0].tile_size + 1, + snes_ppu.layer[SNES_BG1].tile_size + 1, (snes_ram[MOSAIC] & 0x1)?"m":" ", snes_ram[BG1SC] & 0x3, (snes_ram[BG1SC] & 0xfc) << 9, - snes_ppu.layer[0].data ); + snes_ppu.layer[SNES_BG1].data ); //ui_draw_text( t, SNES_DBG_HORZ_POS, y++ * 9 ); logerror("%s2 %s%s%s%s%s%c%s%s%d%s %d %4X %4X", debug_options.bg_disabled[1]?" ":"*", @@ -1433,11 +1429,11 @@ static UINT8 snes_dbg_video( running_machine *machine, bitmap_t *bitmap, UINT16 WINLOGIC[(snes_ram[WBGLOG] & 0xc) >> 2], (snes_ram[W12SEL] & 0x20)?((snes_ram[W12SEL] & 0x10)?"o":"i"):" ", (snes_ram[W12SEL] & 0x80)?((snes_ram[W12SEL] & 0x40)?"o":"i"):" ", - snes_ppu.layer[1].tile_size + 1, + snes_ppu.layer[SNES_BG2].tile_size + 1, (snes_ram[MOSAIC] & 0x2)?"m":" ", snes_ram[BG2SC] & 0x3, (snes_ram[BG2SC] & 0xfc) << 9, - snes_ppu.layer[1].data ); + snes_ppu.layer[SNES_BG2].data ); //ui_draw_text( t, SNES_DBG_HORZ_POS, y++ * 9 ); logerror("%s3 %s%s%s%s%s%c%s%s%d%s%s%d %4X %4X", debug_options.bg_disabled[2]?" ":"*", @@ -1449,12 +1445,12 @@ static UINT8 snes_dbg_video( running_machine *machine, bitmap_t *bitmap, UINT16 WINLOGIC[(snes_ram[WBGLOG] & 0x30)>>4], (snes_ram[W34SEL] & 0x2)?((snes_ram[W34SEL] & 0x1)?"o":"i"):" ", (snes_ram[W34SEL] & 0x8)?((snes_ram[W34SEL] & 0x4)?"o":"i"):" ", - snes_ppu.layer[2].tile_size + 1, + snes_ppu.layer[SNES_BG3].tile_size + 1, (snes_ram[MOSAIC] & 0x4)?"m":" ", (snes_ram[BGMODE] & 0x8)?"P":" ", snes_ram[BG3SC] & 0x3, (snes_ram[BG3SC] & 0xfc) << 9, - snes_ppu.layer[2].data ); + snes_ppu.layer[SNES_BG3].data ); //ui_draw_text( t, SNES_DBG_HORZ_POS, y++ * 9 ); logerror("%s4 %s%s%s%s%s%c%s%s%d%s %d %4X %4X", debug_options.bg_disabled[3]?" ":"*", @@ -1466,11 +1462,11 @@ static UINT8 snes_dbg_video( running_machine *machine, bitmap_t *bitmap, UINT16 WINLOGIC[(snes_ram[WBGLOG] & 0xc0)>>6], (snes_ram[W34SEL] & 0x20)?((snes_ram[W34SEL] & 0x10)?"o":"i"):" ", (snes_ram[W34SEL] & 0x80)?((snes_ram[W34SEL] & 0x40)?"o":"i"):" ", - snes_ppu.layer[3].tile_size + 1, + snes_ppu.layer[SNES_BG4].tile_size + 1, (snes_ram[MOSAIC] & 0x8)?"m":" ", snes_ram[BG4SC] & 0x3, (snes_ram[BG4SC] & 0xfc) << 9, - snes_ppu.layer[3].data ); + snes_ppu.layer[SNES_BG4].data ); //ui_draw_text( t, SNES_DBG_HORZ_POS, y++ * 9 ); logerror("%sO %s%s%s%s%s%c%s%s%d%d %4X", debug_options.bg_disabled[4]?" ":"*", @@ -1483,7 +1479,7 @@ static UINT8 snes_dbg_video( running_machine *machine, bitmap_t *bitmap, UINT16 (snes_ram[WOBJSEL] & 0x2)?((snes_ram[WOBJSEL] & 0x1)?"o":"i"):" ", (snes_ram[WOBJSEL] & 0x8)?((snes_ram[WOBJSEL] & 0x4)?"o":"i"):" ", snes_ppu.oam.size[0], snes_ppu.oam.size[1], - snes_ppu.layer[4].data ); + snes_ppu.layer[SNES_OAM].data ); //ui_draw_text( t, SNES_DBG_HORZ_POS, y++ * 9 ); logerror("%sB %s %c%s%s", debug_options.bg_disabled[5]?" ":"*",