snes wip: added a couple of registers to snes_ppu struct and a few cosmetic cleanups

This commit is contained in:
Fabio Priuli 2010-02-10 08:38:59 +00:00
parent dab2213b59
commit f2bb738b9e
3 changed files with 457 additions and 422 deletions

View File

@ -54,200 +54,200 @@
#define SNES_EXROM_START 0x1000000 #define SNES_EXROM_START 0x1000000
#define FIXED_COLOUR 256 /* Position in cgram for fixed colour */ #define FIXED_COLOUR 256 /* Position in cgram for fixed colour */
/* Definitions for PPU Memory-Mapped registers */ /* Definitions for PPU Memory-Mapped registers */
#define INIDISP 0x2100 #define INIDISP 0x2100
#define OBSEL 0x2101 #define OBSEL 0x2101
#define OAMADDL 0x2102 #define OAMADDL 0x2102
#define OAMADDH 0x2103 #define OAMADDH 0x2103
#define OAMDATA 0x2104 #define OAMDATA 0x2104
#define BGMODE 0x2105 /* abcdefff = abcd: bg4-1 tile size | e: BG3 high priority | f: mode */ #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 MOSAIC 0x2106 /* xxxxabcd = x: pixel size | abcd: affects bg 1-4 */
#define BG1SC 0x2107 #define BG1SC 0x2107
#define BG2SC 0x2108 #define BG2SC 0x2108
#define BG3SC 0x2109 #define BG3SC 0x2109
#define BG4SC 0x210A #define BG4SC 0x210A
#define BG12NBA 0x210B #define BG12NBA 0x210B
#define BG34NBA 0x210C #define BG34NBA 0x210C
#define BG1HOFS 0x210D #define BG1HOFS 0x210D
#define BG1VOFS 0x210E #define BG1VOFS 0x210E
#define BG2HOFS 0x210F #define BG2HOFS 0x210F
#define BG2VOFS 0x2110 #define BG2VOFS 0x2110
#define BG3HOFS 0x2111 #define BG3HOFS 0x2111
#define BG3VOFS 0x2112 #define BG3VOFS 0x2112
#define BG4HOFS 0x2113 #define BG4HOFS 0x2113
#define BG4VOFS 0x2114 #define BG4VOFS 0x2114
#define VMAIN 0x2115 /* i---ffrr = i: Increment timing | f: Full graphic | r: increment rate */ #define VMAIN 0x2115 /* i---ffrr = i: Increment timing | f: Full graphic | r: increment rate */
#define VMADDL 0x2116 /* aaaaaaaa = a: LSB of vram address */ #define VMADDL 0x2116 /* aaaaaaaa = a: LSB of vram address */
#define VMADDH 0x2117 /* aaaaaaaa = a: MSB of vram address */ #define VMADDH 0x2117 /* aaaaaaaa = a: MSB of vram address */
#define VMDATAL 0x2118 /* dddddddd = d: data to be written */ #define VMDATAL 0x2118 /* dddddddd = d: data to be written */
#define VMDATAH 0x2119 /* 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 M7SEL 0x211A /* ab----yx = a: screen over | y: vertical flip | x: horizontal flip */
#define M7A 0x211B /* aaaaaaaa = a: COSINE rotate angle / X expansion */ #define M7A 0x211B /* aaaaaaaa = a: COSINE rotate angle / X expansion */
#define M7B 0x211C /* aaaaaaaa = a: SINE 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 M7C 0x211D /* aaaaaaaa = a: SINE rotate angle / Y expansion */
#define M7D 0x211E /* aaaaaaaa = a: COSINE rotate angle / Y expansion */ #define M7D 0x211E /* aaaaaaaa = a: COSINE rotate angle / Y expansion */
#define M7X 0x211F #define M7X 0x211F
#define M7Y 0x2120 #define M7Y 0x2120
#define CGADD 0x2121 #define CGADD 0x2121
#define CGDATA 0x2122 #define CGDATA 0x2122
#define W12SEL 0x2123 #define W12SEL 0x2123
#define W34SEL 0x2124 #define W34SEL 0x2124
#define WOBJSEL 0x2125 #define WOBJSEL 0x2125
#define WH0 0x2126 /* pppppppp = p: Left position of window 1 */ #define WH0 0x2126 /* pppppppp = p: Left position of window 1 */
#define WH1 0x2127 /* pppppppp = p: Right 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 WH2 0x2128 /* pppppppp = p: Left position of window 2 */
#define WH3 0x2129 /* pppppppp = p: Right 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 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 WOBJLOG 0x212B /* ----ccoo = c: Colour window params | o: Object window params */
#define TM 0x212C #define TM 0x212C
#define TS 0x212D #define TS 0x212D
#define TMW 0x212E #define TMW 0x212E
#define TSW 0x212F #define TSW 0x212F
#define CGWSEL 0x2130 #define CGWSEL 0x2130
#define CGADSUB 0x2131 #define CGADSUB 0x2131
#define COLDATA 0x2132 #define COLDATA 0x2132
#define SETINI 0x2133 #define SETINI 0x2133
#define MPYL 0x2134 #define MPYL 0x2134
#define MPYM 0x2135 #define MPYM 0x2135
#define MPYH 0x2136 #define MPYH 0x2136
#define SLHV 0x2137 #define SLHV 0x2137
#define ROAMDATA 0x2138 #define ROAMDATA 0x2138
#define RVMDATAL 0x2139 #define RVMDATAL 0x2139
#define RVMDATAH 0x213A #define RVMDATAH 0x213A
#define RCGDATA 0x213B #define RCGDATA 0x213B
#define OPHCT 0x213C #define OPHCT 0x213C
#define OPVCT 0x213D #define OPVCT 0x213D
#define STAT77 0x213E #define STAT77 0x213E
#define STAT78 0x213F #define STAT78 0x213F
#define APU00 0x2140 #define APU00 0x2140
#define APU01 0x2141 #define APU01 0x2141
#define APU02 0x2142 #define APU02 0x2142
#define APU03 0x2143 #define APU03 0x2143
#define WMDATA 0x2180 #define WMDATA 0x2180
#define WMADDL 0x2181 #define WMADDL 0x2181
#define WMADDM 0x2182 #define WMADDM 0x2182
#define WMADDH 0x2183 #define WMADDH 0x2183
/* Definitions for CPU Memory-Mapped registers */ /* Definitions for CPU Memory-Mapped registers */
#define OLDJOY1 0x4016 #define OLDJOY1 0x4016
#define OLDJOY2 0x4017 #define OLDJOY2 0x4017
#define NMITIMEN 0x4200 #define NMITIMEN 0x4200
#define WRIO 0x4201 #define WRIO 0x4201
#define WRMPYA 0x4202 #define WRMPYA 0x4202
#define WRMPYB 0x4203 #define WRMPYB 0x4203
#define WRDIVL 0x4204 #define WRDIVL 0x4204
#define WRDIVH 0x4205 #define WRDIVH 0x4205
#define WRDVDD 0x4206 #define WRDVDD 0x4206
#define HTIMEL 0x4207 #define HTIMEL 0x4207
#define HTIMEH 0x4208 #define HTIMEH 0x4208
#define VTIMEL 0x4209 #define VTIMEL 0x4209
#define VTIMEH 0x420A #define VTIMEH 0x420A
#define MDMAEN 0x420B #define MDMAEN 0x420B
#define HDMAEN 0x420C #define HDMAEN 0x420C
#define MEMSEL 0x420D #define MEMSEL 0x420D
#define RDNMI 0x4210 #define RDNMI 0x4210
#define TIMEUP 0x4211 #define TIMEUP 0x4211
#define HVBJOY 0x4212 #define HVBJOY 0x4212
#define RDIO 0x4213 #define RDIO 0x4213
#define RDDIVL 0x4214 #define RDDIVL 0x4214
#define RDDIVH 0x4215 #define RDDIVH 0x4215
#define RDMPYL 0x4216 #define RDMPYL 0x4216
#define RDMPYH 0x4217 #define RDMPYH 0x4217
#define JOY1L 0x4218 #define JOY1L 0x4218
#define JOY1H 0x4219 #define JOY1H 0x4219
#define JOY2L 0x421A #define JOY2L 0x421A
#define JOY2H 0x421B #define JOY2H 0x421B
#define JOY3L 0x421C #define JOY3L 0x421C
#define JOY3H 0x421D #define JOY3H 0x421D
#define JOY4L 0x421E #define JOY4L 0x421E
#define JOY4H 0x421F #define JOY4H 0x421F
/* DMA */ /* DMA */
#define DMAP0 0x4300 #define DMAP0 0x4300
#define BBAD0 0x4301 #define BBAD0 0x4301
#define A1T0L 0x4302 #define A1T0L 0x4302
#define A1T0H 0x4303 #define A1T0H 0x4303
#define A1B0 0x4304 #define A1B0 0x4304
#define DAS0L 0x4305 #define DAS0L 0x4305
#define DAS0H 0x4306 #define DAS0H 0x4306
#define DSAB0 0x4307 #define DSAB0 0x4307
#define A2A0L 0x4308 #define A2A0L 0x4308
#define A2A0H 0x4309 #define A2A0H 0x4309
#define NTRL0 0x430A #define NTRL0 0x430A
#define DMAP1 0x4310 #define DMAP1 0x4310
#define BBAD1 0x4311 #define BBAD1 0x4311
#define A1T1L 0x4312 #define A1T1L 0x4312
#define A1T1H 0x4313 #define A1T1H 0x4313
#define A1B1 0x4314 #define A1B1 0x4314
#define DAS1L 0x4315 #define DAS1L 0x4315
#define DAS1H 0x4316 #define DAS1H 0x4316
#define DSAB1 0x4317 #define DSAB1 0x4317
#define A2A1L 0x4318 #define A2A1L 0x4318
#define A2A1H 0x4319 #define A2A1H 0x4319
#define NTRL1 0x431A #define NTRL1 0x431A
#define DMAP2 0x4320 #define DMAP2 0x4320
#define BBAD2 0x4321 #define BBAD2 0x4321
#define A1T2L 0x4322 #define A1T2L 0x4322
#define A1T2H 0x4323 #define A1T2H 0x4323
#define A1B2 0x4324 #define A1B2 0x4324
#define DAS2L 0x4325 #define DAS2L 0x4325
#define DAS2H 0x4326 #define DAS2H 0x4326
#define DSAB2 0x4327 #define DSAB2 0x4327
#define A2A2L 0x4328 #define A2A2L 0x4328
#define A2A2H 0x4329 #define A2A2H 0x4329
#define NTRL2 0x432A #define NTRL2 0x432A
#define DMAP3 0x4330 #define DMAP3 0x4330
#define BBAD3 0x4331 #define BBAD3 0x4331
#define A1T3L 0x4332 #define A1T3L 0x4332
#define A1T3H 0x4333 #define A1T3H 0x4333
#define A1B3 0x4334 #define A1B3 0x4334
#define DAS3L 0x4335 #define DAS3L 0x4335
#define DAS3H 0x4336 #define DAS3H 0x4336
#define DSAB3 0x4337 #define DSAB3 0x4337
#define A2A3L 0x4338 #define A2A3L 0x4338
#define A2A3H 0x4339 #define A2A3H 0x4339
#define NTRL3 0x433A #define NTRL3 0x433A
#define DMAP4 0x4340 #define DMAP4 0x4340
#define BBAD4 0x4341 #define BBAD4 0x4341
#define A1T4L 0x4342 #define A1T4L 0x4342
#define A1T4H 0x4343 #define A1T4H 0x4343
#define A1B4 0x4344 #define A1B4 0x4344
#define DAS4L 0x4345 #define DAS4L 0x4345
#define DAS4H 0x4346 #define DAS4H 0x4346
#define DSAB4 0x4347 #define DSAB4 0x4347
#define A2A4L 0x4348 #define A2A4L 0x4348
#define A2A4H 0x4349 #define A2A4H 0x4349
#define NTRL4 0x434A #define NTRL4 0x434A
#define DMAP5 0x4350 #define DMAP5 0x4350
#define BBAD5 0x4351 #define BBAD5 0x4351
#define A1T5L 0x4352 #define A1T5L 0x4352
#define A1T5H 0x4353 #define A1T5H 0x4353
#define A1B5 0x4354 #define A1B5 0x4354
#define DAS5L 0x4355 #define DAS5L 0x4355
#define DAS5H 0x4356 #define DAS5H 0x4356
#define DSAB5 0x4357 #define DSAB5 0x4357
#define A2A5L 0x4358 #define A2A5L 0x4358
#define A2A5H 0x4359 #define A2A5H 0x4359
#define NTRL5 0x435A #define NTRL5 0x435A
#define DMAP6 0x4360 #define DMAP6 0x4360
#define BBAD6 0x4361 #define BBAD6 0x4361
#define A1T6L 0x4362 #define A1T6L 0x4362
#define A1T6H 0x4363 #define A1T6H 0x4363
#define A1B6 0x4364 #define A1B6 0x4364
#define DAS6L 0x4365 #define DAS6L 0x4365
#define DAS6H 0x4366 #define DAS6H 0x4366
#define DSAB6 0x4367 #define DSAB6 0x4367
#define A2A6L 0x4368 #define A2A6L 0x4368
#define A2A6H 0x4369 #define A2A6H 0x4369
#define NTRL6 0x436A #define NTRL6 0x436A
#define DMAP7 0x4370 #define DMAP7 0x4370
#define BBAD7 0x4371 #define BBAD7 0x4371
#define A1T7L 0x4372 #define A1T7L 0x4372
#define A1T7H 0x4373 #define A1T7H 0x4373
#define A1B7 0x4374 #define A1B7 0x4374
#define DAS7L 0x4375 #define DAS7L 0x4375
#define DAS7H 0x4376 #define DAS7H 0x4376
#define DSAB7 0x4377 #define DSAB7 0x4377
#define A2A7L 0x4378 #define A2A7L 0x4378
#define A2A7H 0x4379 #define A2A7H 0x4379
#define NTRL7 0x437A #define NTRL7 0x437A
/* Definitions for sound DSP */ /* Definitions for sound DSP */
#define DSP_V0_VOLL 0x00 #define DSP_V0_VOLL 0x00
#define DSP_V0_VOLR 0x01 #define DSP_V0_VOLR 0x01
@ -376,6 +376,26 @@ HAS_SPC7110_RTC,
HAS_UNK 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 -----------*/ /*----------- defined in machine/snes.c -----------*/
extern DRIVER_INIT( snes ); 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; UINT16 shift_vert;
} offset; } offset;
} layer[5]; // this is for the BG1 - BG2 - BG3 - BG4 - OBJ layers } layer[5]; // this is for the BG1 - BG2 - BG3 - BG4 - OBJ layers
struct struct
{ {
UINT8 window1_enabled, window1_invert; UINT8 window1_enabled, window1_invert;
UINT8 window2_enabled, window2_invert; UINT8 window2_enabled, window2_invert;
UINT8 wlog_mask; UINT8 wlog_mask;
} colour; // this is for the color (which is 'seen' as a layer by the window masking code) } colour; // this is for the color (which is 'seen' as a layer by the window masking code)
struct struct
{ {
UINT8 address_low; UINT8 address_low;
@ -471,11 +493,13 @@ struct SNES_PPU_STRUCT /* once all the regs are saved in this structure, it woul
UINT8 flip; UINT8 flip;
UINT16 write_latch; UINT16 write_latch;
} oam; } oam;
struct struct
{ {
UINT16 horizontal[4]; UINT16 horizontal[4];
UINT16 vertical[4]; UINT16 vertical[4];
} bgd_offset; } bgd_offset;
struct struct
{ {
UINT16 latch_horz; 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 last_visible_line;
UINT8 interlace_count; UINT8 interlace_count;
} beam; } beam;
struct struct
{ {
UINT8 repeat; UINT8 repeat;
@ -498,7 +523,9 @@ struct SNES_PPU_STRUCT /* once all the regs are saved in this structure, it woul
INT16 origin_y; INT16 origin_y;
UINT16 hor_offset; UINT16 hor_offset;
UINT16 ver_offset; UINT16 ver_offset;
UINT8 extbg;
} mode7; } mode7;
UINT8 mosaic_size; UINT8 mosaic_size;
UINT8 main_color_mask; UINT8 main_color_mask;
UINT8 sub_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 mode;
UINT8 interlace; //doubles the visible resolution UINT8 interlace; //doubles the visible resolution
UINT8 obj_interlace; UINT8 obj_interlace;
UINT8 screen_brightness;
UINT8 screen_disabled;
UINT8 pseudo_hires;
UINT8 color_modes;
UINT8 stat77_flags;
}; };
struct snes_cart_info struct snes_cart_info

View File

@ -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 // 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); 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, OAMADDL, snes_ppu.oam.saved_address_low ); /* Reset oam address */
memory_write_byte(space, OAMADDH, snes_ppu.oam.saved_address_high ); memory_write_byte(space, OAMADDH, snes_ppu.oam.saved_address_high );
@ -152,7 +152,7 @@ static TIMER_CALLBACK( snes_scanline_tick )
} }
} }
/* Horizontal IRQ timer */ /* Horizontal IRQ timer */
if( snes_ram[NMITIMEN] & 0x10 ) if (snes_ram[NMITIMEN] & 0x10)
{ {
int setirq = 1; int setirq = 1;
int pixel = ((snes_ram[HTIMEH] << 8) | snes_ram[HTIMEL]) & 0x1ff; int pixel = ((snes_ram[HTIMEH] << 8) | snes_ram[HTIMEL]) & 0x1ff;
@ -181,14 +181,14 @@ static TIMER_CALLBACK( snes_scanline_tick )
} }
/* Start of VBlank */ /* 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); 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[HVBJOY] |= 0x81; /* Set vblank bit to on & indicate controllers being read */
snes_ram[RDNMI] |= 0x80; /* Set NMI occured bit */ 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) // 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); 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 */ 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 */ { /* VBlank is over, time for a new frame */
snes_ram[HVBJOY] &= 0x7f; /* Clear vblank bit */ snes_ram[HVBJOY] &= 0x7f; /* Clear vblank bit */
snes_ram[RDNMI] &= 0x7f; /* Clear nmi occured 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_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 ); 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) if (video_screen_get_vpos(machine->primary_screen) > 0)
{ {
/* Do HDMA */ /* Do HDMA */
if( snes_ram[HDMAEN] ) if (snes_ram[HDMAEN])
snes_hdma(cpu0space); 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); 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; UINT16 value, dividend, remainder;
dividend = remainder = 0; dividend = remainder = 0;
value = (snes_ram[WRDIVH] << 8) + snes_ram[WRDIVL]; value = (snes_ram[WRDIVH] << 8) + snes_ram[WRDIVL];
if( snes_ram[WRDVDD] > 0 ) if (snes_ram[WRDVDD] > 0)
{ {
dividend = value / snes_ram[WRDVDD]; dividend = value / snes_ram[WRDVDD];
remainder = 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; visarea.max_x = (SNES_SCR_WIDTH * 2) - 1;
// fixme: should compensate for SNES_DBG_video // 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; snes_htmult = 2;
else else
snes_htmult = 1; snes_htmult = 1;
@ -390,42 +390,42 @@ READ8_HANDLER( snes_r_io )
return spc_port_out[offset & 0x3]; 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); 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); 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); return sdd1_mmio_read(space, (UINT32)offset);
} }
if(offset < 0x80) if (offset < 0x80)
{ {
offset += 0x4300; 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; 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); return spc7110_mmio_read(space->machine, offset);
} }
} }
/* offset is from 0x000000 */ /* 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 OAMDATA: /* 21xy for x=0,1,2 and y=4,5,6,8,9,a returns PPU1 open bus*/
case BGMODE: 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_ppu.ppu1_open_bus = (snes_oam[oam_addr] >> (snes_ram[OAMDATA] << 3)) & 0xff;
snes_ram[OAMDATA] = (snes_ram[OAMDATA] + 1) % 2; 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++;
snes_ppu.oam.address_low = snes_ram[OAMADDL] = snes_ppu.oam.address & 0xff; 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; return snes_ppu.ppu2_open_bus;
} }
case STAT77: /* PPU status flag and version number */ 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. // 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_open_bus & 0x10);
value |= (snes_ppu.ppu1_version & 0x0f); 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; snes_ppu.ppu1_open_bus = value;
return snes_ppu.ppu1_open_bus; return snes_ppu.ppu1_open_bus;
case STAT78: /* PPU status flag and version number */ case STAT78: /* PPU status flag and version number */
@ -631,27 +631,27 @@ READ8_HANDLER( snes_r_io )
return snes_ram[offset]; return snes_ram[offset];
case OLDJOY1: /* Data for old NES controllers (JOYSER1) */ 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? return 0 | (snes_open_bus_r(space,0) & 0xfc); //correct?
} }
value = ((joy1l | (joy1h << 8) | 0x10000) >> (16 - (joypad[0].oldrol & 0xf))) & 0x1; value = ((joy1l | (joy1h << 8) | 0x10000) >> (16 - (joypad[0].oldrol & 0xf))) & 0x1;
joypad[0].oldrol++; joypad[0].oldrol++;
joypad[0].oldrol&=0xf; joypad[0].oldrol&=0xf;
if( !(joypad[0].oldrol % 17) ) if (!(joypad[0].oldrol % 17))
value = 0x1; value = 0x1;
return (value & 0x03) | (snes_open_bus_r(space,0) & 0xfc); //correct? return (value & 0x03) | (snes_open_bus_r(space,0) & 0xfc); //correct?
} }
case OLDJOY2: /* Data for old NES controllers (JOYSER2) */ 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? return 0 | 0x1c | (snes_open_bus_r(space,0) & 0xe0); //correct?
} }
value = ((joy2l | (joy2h << 8) | 0x10000) >> (16 - (joypad[1].oldrol & 0xf))) & 0x1; value = ((joy2l | (joy2h << 8) | 0x10000) >> (16 - (joypad[1].oldrol & 0xf))) & 0x1;
joypad[1].oldrol++; joypad[1].oldrol++;
joypad[1].oldrol&=0xf; joypad[1].oldrol&=0xf;
if( !(joypad[1].oldrol % 17) ) if (!(joypad[1].oldrol % 17))
value = 0x1; value = 0x1;
//value |= 0x1c; // bits 4, 3, and 2 are always set //value |= 0x1c; // bits 4, 3, and 2 are always set
return value | 0x1c | (snes_open_bus_r(space,0) & 0xe0); //correct? return value | 0x1c | (snes_open_bus_r(space,0) & 0xe0); //correct?
@ -765,39 +765,39 @@ WRITE8_HANDLER( snes_w_io )
return; 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); superfx_mmio_write(devtag_get_device(space->machine, "superfx"), offset, data);
return; 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); srtc_mmio_write(space->machine, offset, data);
return; 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)) (offset >= 0x4800 && offset < 0x4808))
{ {
sdd1_mmio_write(space, (UINT32)offset, data); sdd1_mmio_write(space, (UINT32)offset, data);
return; return;
} }
if(offset < 0x80) if (offset < 0x80)
{ {
offset += 0x4300; 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; 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); spc7110_mmio_write(space->machine, (UINT32)offset, data);
return; return;
@ -805,20 +805,22 @@ WRITE8_HANDLER( snes_w_io )
} }
/* offset is from 0x000000 */ /* offset is from 0x000000 */
switch( offset ) switch (offset)
{ {
case INIDISP: /* Initial settings for screen */ 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, OAMADDL, snes_ppu.oam.saved_address_low);
memory_write_byte(space, OAMADDH, snes_ppu.oam.saved_address_high ); 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; break;
case OBSEL: /* Object size and data area designation */ case OBSEL: /* Object size and data area designation */
snes_ppu.layer[4].data = ((data & 0x3) * 0x2000) << 1; snes_ppu.layer[SNES_OAM].data = ((data & 0x3) * 0x2000) << 1;
snes_ppu.oam.name_select = (((data & 0x18)>>3) * 0x1000) << 1; snes_ppu.oam.name_select = (((data & 0x18) >> 3) * 0x1000) << 1;
/* Determine object size */ /* Determine object size */
switch( (data & 0xe0) >> 5 ) switch ((data & 0xe0) >> 5)
{ {
case 0: /* 8 & 16 */ case 0: /* 8 & 16 */
snes_ppu.oam.size[0] = 1; snes_ppu.oam.size[0] = 1;
@ -846,12 +848,12 @@ WRITE8_HANDLER( snes_w_io )
break; break;
default: default:
/* Unknown size so default to 8 & 16 */ /* 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[0] = 1;
snes_ppu.oam.size[1] = 2; snes_ppu.oam.size[1] = 2;
#ifdef SNES_DBG_REG_W #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 #endif
} }
break; break;
@ -899,7 +901,7 @@ WRITE8_HANDLER( snes_w_io )
} }
} }
snes_ram[OAMDATA] = (snes_ram[OAMDATA] + 1) % 2; snes_ram[OAMDATA] = (snes_ram[OAMDATA] + 1) % 2;
if( snes_ram[OAMDATA] == 0 ) if (snes_ram[OAMDATA] == 0)
{ {
snes_ram[OAMDATA] = 0; snes_ram[OAMDATA] = 0;
snes_ppu.oam.address++; snes_ppu.oam.address++;
@ -912,19 +914,19 @@ WRITE8_HANDLER( snes_w_io )
snes_ppu.mode = data & 0x07; snes_ppu.mode = data & 0x07;
snes_dynamic_res_change(space->machine); snes_dynamic_res_change(space->machine);
snes_ppu.bg3_priority_bit = data & 0x08; snes_ppu.bg3_priority_bit = data & 0x08;
snes_ppu.layer[0].tile_size = (data >> 4) & 0x1; snes_ppu.layer[SNES_BG1].tile_size = (data >> 4) & 0x1;
snes_ppu.layer[1].tile_size = (data >> 5) & 0x1; snes_ppu.layer[SNES_BG2].tile_size = (data >> 5) & 0x1;
snes_ppu.layer[2].tile_size = (data >> 6) & 0x1; snes_ppu.layer[SNES_BG3].tile_size = (data >> 6) & 0x1;
snes_ppu.layer[3].tile_size = (data >> 7) & 0x1; snes_ppu.layer[SNES_BG4].tile_size = (data >> 7) & 0x1;
snes_ppu.update_offsets = 1; snes_ppu.update_offsets = 1;
break; break;
case MOSAIC: /* Size and screen designation for mosaic */ case MOSAIC: /* Size and screen designation for mosaic */
/* FIXME: We support horizontal mosaic only partially */ /* FIXME: We support horizontal mosaic only partially */
snes_ppu.mosaic_size = (data & 0xf0) >> 4; snes_ppu.mosaic_size = (data & 0xf0) >> 4;
snes_ppu.layer[0].mosaic_enabled = data & 0x01; snes_ppu.layer[SNES_BG1].mosaic_enabled = data & 0x01;
snes_ppu.layer[1].mosaic_enabled = data & 0x02; snes_ppu.layer[SNES_BG2].mosaic_enabled = data & 0x02;
snes_ppu.layer[2].mosaic_enabled = data & 0x04; snes_ppu.layer[SNES_BG3].mosaic_enabled = data & 0x04;
snes_ppu.layer[3].mosaic_enabled = data & 0x08; snes_ppu.layer[SNES_BG4].mosaic_enabled = data & 0x08;
break; break;
case BG1SC: /* Address for storing SC data BG1 SC size designation */ case BG1SC: /* Address for storing SC data BG1 SC size designation */
case BG2SC: /* Address for storing SC data BG2 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; snes_ppu.layer[offset - BG1SC].map_size = data & 0x3;
break; break;
case BG12NBA: /* Address for BG 1 and 2 character data */ case BG12NBA: /* Address for BG 1 and 2 character data */
snes_ppu.layer[0].data = (data & 0xf) << 13; snes_ppu.layer[SNES_BG1].data = (data & 0xf) << 13;
snes_ppu.layer[1].data = (data & 0xf0) << 9; snes_ppu.layer[SNES_BG2].data = (data & 0xf0) << 9;
break; break;
case BG34NBA: /* Address for BG 3 and 4 character data */ case BG34NBA: /* Address for BG 3 and 4 character data */
snes_ppu.layer[2].data = (data & 0xf) << 13; snes_ppu.layer[SNES_BG3].data = (data & 0xf) << 13;
snes_ppu.layer[3].data = (data & 0xf0) << 9; snes_ppu.layer[SNES_BG4].data = (data & 0xf0) << 9;
break; 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! // 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) */ case BG1HOFS: /* BG1 - horizontal scroll (DW) */
/* In Mode 0->6 we use ppu_last_scroll as Prev */ /* 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; snes_ppu.ppu_last_scroll = data;
/* In Mode 7 we use mode7_last_scroll as Prev */ /* 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); 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; return;
case BG1VOFS: /* BG1 - vertical scroll (DW) */ case BG1VOFS: /* BG1 - vertical scroll (DW) */
/* In Mode 0->6 we use ppu_last_scroll as Prev */ /* 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; snes_ppu.ppu_last_scroll = data;
/* In Mode 7 we use mode7_last_scroll as Prev */ /* In Mode 7 we use mode7_last_scroll as Prev */
snes_ppu.mode7.ver_offset = (data << 8) | snes_ppu.mode7_last_scroll; 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; snes_ppu.update_offsets = 1;
return; return;
case BG2HOFS: /* BG2 - horizontal scroll (DW) */ 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.ppu_last_scroll = data;
snes_ppu.update_offsets = 1; snes_ppu.update_offsets = 1;
return; return;
case BG2VOFS: /* BG2 - vertical scroll (DW) */ 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.ppu_last_scroll = data;
snes_ppu.update_offsets = 1; snes_ppu.update_offsets = 1;
return; return;
case BG3HOFS: /* BG3 - horizontal scroll (DW) */ 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.ppu_last_scroll = data;
snes_ppu.update_offsets = 1; snes_ppu.update_offsets = 1;
return; return;
case BG3VOFS: /* BG3 - vertical scroll (DW) */ 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.ppu_last_scroll = data;
snes_ppu.update_offsets = 1; snes_ppu.update_offsets = 1;
return; return;
case BG4HOFS: /* BG4 - horizontal scroll (DW) */ 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.ppu_last_scroll = data;
snes_ppu.update_offsets = 1; snes_ppu.update_offsets = 1;
return; return;
case BG4VOFS: /* BG4 - vertical scroll (DW) */ 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.ppu_last_scroll = data;
snes_ppu.update_offsets = 1; snes_ppu.update_offsets = 1;
return; return;
@ -1124,38 +1126,38 @@ WRITE8_HANDLER( snes_w_io )
case W12SEL: /* Window mask settings for BG1-2 */ case W12SEL: /* Window mask settings for BG1-2 */
if (data != snes_ram[offset]) if (data != snes_ram[offset])
{ {
snes_ppu.layer[0].window1_invert = data & 0x01; snes_ppu.layer[SNES_BG1].window1_invert = data & 0x01;
snes_ppu.layer[0].window1_enabled = data & 0x02; snes_ppu.layer[SNES_BG1].window1_enabled = data & 0x02;
snes_ppu.layer[0].window2_invert = data & 0x04; snes_ppu.layer[SNES_BG1].window2_invert = data & 0x04;
snes_ppu.layer[0].window2_enabled = data & 0x08; snes_ppu.layer[SNES_BG1].window2_enabled = data & 0x08;
snes_ppu.layer[1].window1_invert = data & 0x10; snes_ppu.layer[SNES_BG2].window1_invert = data & 0x10;
snes_ppu.layer[1].window1_enabled = data & 0x20; snes_ppu.layer[SNES_BG2].window1_enabled = data & 0x20;
snes_ppu.layer[1].window2_invert = data & 0x40; snes_ppu.layer[SNES_BG2].window2_invert = data & 0x40;
snes_ppu.layer[1].window2_enabled = data & 0x80; snes_ppu.layer[SNES_BG2].window2_enabled = data & 0x80;
snes_ppu.update_windows = 1; snes_ppu.update_windows = 1;
} }
break; break;
case W34SEL: /* Window mask settings for BG3-4 */ case W34SEL: /* Window mask settings for BG3-4 */
if (data != snes_ram[offset]) if (data != snes_ram[offset])
{ {
snes_ppu.layer[2].window1_invert = data & 0x01; snes_ppu.layer[SNES_BG3].window1_invert = data & 0x01;
snes_ppu.layer[2].window1_enabled = data & 0x02; snes_ppu.layer[SNES_BG3].window1_enabled = data & 0x02;
snes_ppu.layer[2].window2_invert = data & 0x04; snes_ppu.layer[SNES_BG3].window2_invert = data & 0x04;
snes_ppu.layer[2].window2_enabled = data & 0x08; snes_ppu.layer[SNES_BG3].window2_enabled = data & 0x08;
snes_ppu.layer[3].window1_invert = data & 0x10; snes_ppu.layer[SNES_BG4].window1_invert = data & 0x10;
snes_ppu.layer[3].window1_enabled = data & 0x20; snes_ppu.layer[SNES_BG4].window1_enabled = data & 0x20;
snes_ppu.layer[3].window2_invert = data & 0x40; snes_ppu.layer[SNES_BG4].window2_invert = data & 0x40;
snes_ppu.layer[3].window2_enabled = data & 0x80; snes_ppu.layer[SNES_BG4].window2_enabled = data & 0x80;
snes_ppu.update_windows = 1; snes_ppu.update_windows = 1;
} }
break; break;
case WOBJSEL: /* Window mask settings for objects */ case WOBJSEL: /* Window mask settings for objects */
if (data != snes_ram[offset]) if (data != snes_ram[offset])
{ {
snes_ppu.layer[4].window1_invert = data & 0x01; snes_ppu.layer[SNES_OAM].window1_invert = data & 0x01;
snes_ppu.layer[4].window1_enabled = data & 0x02; snes_ppu.layer[SNES_OAM].window1_enabled = data & 0x02;
snes_ppu.layer[4].window2_invert = data & 0x04; snes_ppu.layer[SNES_OAM].window2_invert = data & 0x04;
snes_ppu.layer[4].window2_enabled = data & 0x08; snes_ppu.layer[SNES_OAM].window2_enabled = data & 0x08;
snes_ppu.colour.window1_invert = data & 0x10; snes_ppu.colour.window1_invert = data & 0x10;
snes_ppu.colour.window1_enabled = data & 0x20; snes_ppu.colour.window1_enabled = data & 0x20;
snes_ppu.colour.window2_invert = data & 0x40; snes_ppu.colour.window2_invert = data & 0x40;
@ -1194,17 +1196,17 @@ WRITE8_HANDLER( snes_w_io )
case WBGLOG: /* Window mask logic for BG's */ case WBGLOG: /* Window mask logic for BG's */
if (data != snes_ram[offset]) if (data != snes_ram[offset])
{ {
snes_ppu.layer[0].wlog_mask = data & 0x03; snes_ppu.layer[SNES_BG1].wlog_mask = data & 0x03;
snes_ppu.layer[1].wlog_mask = (data & 0x0c) >> 2; snes_ppu.layer[SNES_BG2].wlog_mask = (data & 0x0c) >> 2;
snes_ppu.layer[2].wlog_mask = (data & 0x30) >> 4; snes_ppu.layer[SNES_BG3].wlog_mask = (data & 0x30) >> 4;
snes_ppu.layer[3].wlog_mask = (data & 0xc0) >> 6; snes_ppu.layer[SNES_BG4].wlog_mask = (data & 0xc0) >> 6;
snes_ppu.update_windows = 1; snes_ppu.update_windows = 1;
} }
break; break;
case WOBJLOG: /* Window mask logic for objects */ case WOBJLOG: /* Window mask logic for objects */
if (data != snes_ram[offset]) 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.colour.wlog_mask = (data & 0x0c) >> 2;
snes_ppu.update_windows = 1; snes_ppu.update_windows = 1;
} }
@ -1224,18 +1226,18 @@ WRITE8_HANDLER( snes_w_io )
snes_ppu.sub_bg_enabled[4] = data & 0x10; snes_ppu.sub_bg_enabled[4] = data & 0x10;
break; break;
case TMW: /* Window mask for main screen designation */ case TMW: /* Window mask for main screen designation */
snes_ppu.layer[0].main_window_enabled = data & 0x01; snes_ppu.layer[SNES_BG1].main_window_enabled = data & 0x01;
snes_ppu.layer[1].main_window_enabled = data & 0x02; snes_ppu.layer[SNES_BG2].main_window_enabled = data & 0x02;
snes_ppu.layer[2].main_window_enabled = data & 0x04; snes_ppu.layer[SNES_BG3].main_window_enabled = data & 0x04;
snes_ppu.layer[3].main_window_enabled = data & 0x08; snes_ppu.layer[SNES_BG4].main_window_enabled = data & 0x08;
snes_ppu.layer[4].main_window_enabled = data & 0x10; snes_ppu.layer[SNES_OAM].main_window_enabled = data & 0x10;
break; break;
case TSW: /* Window mask for subscreen designation */ case TSW: /* Window mask for subscreen designation */
snes_ppu.layer[0].sub_window_enabled = data & 0x01; snes_ppu.layer[SNES_BG1].sub_window_enabled = data & 0x01;
snes_ppu.layer[1].sub_window_enabled = data & 0x02; snes_ppu.layer[SNES_BG2].sub_window_enabled = data & 0x02;
snes_ppu.layer[2].sub_window_enabled = data & 0x04; snes_ppu.layer[SNES_BG3].sub_window_enabled = data & 0x04;
snes_ppu.layer[3].sub_window_enabled = data & 0x08; snes_ppu.layer[SNES_BG4].sub_window_enabled = data & 0x08;
snes_ppu.layer[4].sub_window_enabled = data & 0x10; snes_ppu.layer[SNES_OAM].sub_window_enabled = data & 0x10;
break; break;
case CGWSEL: /* Initial settings for Fixed colour addition or screen addition */ 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 */ /* 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.sub_add_mode = data & 0x02;
snes_ppu.direct_color = data & 0x01; snes_ppu.direct_color = data & 0x01;
#ifdef SNES_DBG_REG_W #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" ); mame_printf_debug( "Add/Sub Layer: %s\n", ((data & 0x2) >> 1) ? "Subscreen" : "Fixed colour" );
#endif #endif
break; break;
case CGADSUB: /* Addition/Subtraction designation for each screen */ case CGADSUB: /* Addition/Subtraction designation for each screen */
snes_ppu.color_modes = data & 0xc0;
{ {
UINT8 sub = (data & 0x80) >> 7; UINT8 sub = (data & 0x80) >> 7;
snes_ppu.layer[0].blend = (data & 0x1) << sub; snes_ppu.layer[SNES_BG1].blend = (data & 0x1) << sub;
snes_ppu.layer[1].blend = ((data & 0x2) >> 1) << sub; snes_ppu.layer[SNES_BG2].blend = ((data & 0x2) >> 1) << sub;
snes_ppu.layer[2].blend = ((data & 0x4) >> 2) << sub; snes_ppu.layer[SNES_BG3].blend = ((data & 0x4) >> 2) << sub;
snes_ppu.layer[3].blend = ((data & 0x8) >> 3) << sub; snes_ppu.layer[SNES_BG4].blend = ((data & 0x8) >> 3) << sub;
snes_ppu.layer[4].blend = ((data & 0x10) >> 4) << sub; snes_ppu.layer[SNES_OAM].blend = ((data & 0x10) >> 4) << sub;
} break; } break;
case COLDATA: /* Fixed colour data for fixed colour addition/subtraction */ case COLDATA: /* Fixed colour data for fixed colour addition/subtraction */
{ {
/* Store it in the extra space we made in the CGRAM /* 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. */
* It doesn't really go there, but it's as good a place as any. */ UINT8 r, g, b;
UINT8 r,g,b;
/* Get existing value. */ /* Get existing value. */
r = snes_cgram[FIXED_COLOUR] & 0x1f; r = snes_cgram[FIXED_COLOUR] & 0x1f;
g = (snes_cgram[FIXED_COLOUR] & 0x3e0) >> 5; g = (snes_cgram[FIXED_COLOUR] & 0x3e0) >> 5;
b = (snes_cgram[FIXED_COLOUR] & 0x7c00) >> 10; b = (snes_cgram[FIXED_COLOUR] & 0x7c00) >> 10;
/* Set new value */ /* Set new value */
if( data & 0x20 ) if (data & 0x20)
r = data & 0x1f; r = data & 0x1f;
if( data & 0x40 ) if (data & 0x40)
g = data & 0x1f; g = data & 0x1f;
if( data & 0x80 ) if (data & 0x80)
b = data & 0x1f; b = data & 0x1f;
snes_cgram[FIXED_COLOUR] = (r | (g << 5) | (b << 10)); snes_cgram[FIXED_COLOUR] = (r | (g << 5) | (b << 10));
} break; } break;
case SETINI: /* Screen mode/video select */ case SETINI: /* Screen mode/video select */
/* FIXME: We only support line count and interlace here */ /* FIXME: We only support line count and interlace here */
snes_ppu.interlace = (data & 1) ? 2 : 1; snes_ppu.interlace = (data & 0x01) ? 2 : 1;
snes_ppu.obj_interlace = (data & 2) ? 2 : 1; snes_ppu.obj_interlace = (data & 0x02) ? 2 : 1;
snes_ppu.beam.last_visible_line = (data & 0x4) ? 240 : 225; 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); snes_dynamic_res_change(space->machine);
#ifdef SNES_DBG_REG_W #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" ); mame_printf_debug( "Pseudo 512 mode: %s\n", (data & 0x8) ? "on" : "off" );
#endif #endif
break; break;
@ -1302,7 +1306,7 @@ WRITE8_HANDLER( snes_w_io )
case WMADDH: /* Address to read/write to wram (high) */ case WMADDH: /* Address to read/write to wram (high) */
break; break;
case OLDJOY1: /* Old NES joystick support */ 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[0].oldrol = 0;
joypad[1].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 */ data = 0; /* Once DMA is done we need to reset all bits to 0 */
break; break;
case HDMAEN: /* HDMA channel designation */ 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); 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; break;
case MEMSEL: /* Access cycle designation in memory (2) area */ 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 */ * Currently we are just increasing it no matter what */
// cpu_set_clockscale(devtag_get_device(space->machine, "maincpu"), (data & 0x1) ? 1.335820896 : 1.0 ); // cpu_set_clockscale(devtag_get_device(space->machine, "maincpu"), (data & 0x1) ? 1.335820896 : 1.0 );
#ifdef SNES_DBG_REG_W #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 ); mame_printf_debug( "CPU speed: %f Mhz\n", (data & 0x1) ? 3.58 : 2.68 );
#endif #endif
break; break;
@ -1586,7 +1590,10 @@ READ8_HANDLER( snes_r_bank3 )
else if (snes_cart.mode & 5) /* Mode 20 & 22 */ else if (snes_cart.mode & 5) /* Mode 20 & 22 */
{ {
if ((address < 0x8000) && (snes_cart.mode == SNES_MODE_20)) //FIXME: check this 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 else
value = snes_ram[0x400000 + offset]; value = snes_ram[0x400000 + offset];
} }
@ -1668,7 +1675,7 @@ READ8_HANDLER( snes_r_bank6 )
if (address < 0x8000) 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" ); logerror( "snes_r_bank6 hit in Super FX mode, please fix me\n" );
else if (snes_cart.mode != SNES_MODE_25) else if (snes_cart.mode != SNES_MODE_25)
value = memory_read_byte(space, offset); value = memory_read_byte(space, offset);
@ -1713,11 +1720,11 @@ READ8_HANDLER( snes_r_bank7 )
UINT8 value = 0; UINT8 value = 0;
UINT16 address = offset & 0xffff; UINT16 address = offset & 0xffff;
if(snes_has_addon_chip == HAS_SDD1) if (snes_has_addon_chip == HAS_SDD1)
{ {
return sdd1_read(space->machine, offset); 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" ); 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" ); 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" ); //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 // 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; snes_ppu.beam.current_vert = SNES_VTOTAL_NTSC;
} }
@ -2109,9 +2116,9 @@ void snes_hdma_init()
UINT8 mask = 1, dma = 0, i; UINT8 mask = 1, dma = 0, i;
snes_hdma_chnl = snes_ram[HDMAEN]; 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 + 8] = snes_ram[SNES_DMA_BASE + dma + 2];
snes_ram[SNES_DMA_BASE + dma + 9] = snes_ram[SNES_DMA_BASE + dma + 3]; 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[WRDIVL] = 0xff;
snes_ram[WRDIVH] = 0xff; snes_ram[WRDIVH] = 0xff;
switch(snes_has_addon_chip) switch (snes_has_addon_chip)
{ {
case HAS_SDD1: case HAS_SDD1:
sdd1_init(machine); sdd1_init(machine);
@ -2172,9 +2179,9 @@ MACHINE_RESET( snes )
snes_init_ram(machine); snes_init_ram(machine);
/* Set STAT78 to NTSC or PAL */ /* 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; 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; snes_ram[STAT78] = SNES_PAL;
// reset does this to these registers // reset does this to these registers
@ -2331,18 +2338,18 @@ void snes_hdma(const address_space *space)
UINT32 abus; UINT32 abus;
/* Assume priority of the 8 DMA channels is 0-7 */ /* 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 */ /* 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]; 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 */ /* Get the number of lines */
snes_ram[SNES_DMA_BASE + dma + 0xa] = memory_read_byte(space, abus); 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 */ /* No more lines so clear HDMA */
snes_hdma_chnl &= ~mask; snes_hdma_chnl &= ~mask;
@ -2351,7 +2358,7 @@ void snes_hdma(const address_space *space)
abus++; abus++;
snes_ram[SNES_DMA_BASE + dma + 8] = abus & 0xff; snes_ram[SNES_DMA_BASE + dma + 8] = abus & 0xff;
snes_ram[SNES_DMA_BASE + dma + 9] = (abus >> 8) & 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 + 5] = memory_read_byte(space, abus++);
snes_ram[SNES_DMA_BASE + dma + 6] = 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; contmode = (--snes_ram[SNES_DMA_BASE + dma + 0xa]) & 0x80;
/* Transfer addresses */ /* 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]; 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 */ 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]; 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] ); 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 #endif
switch( snes_ram[SNES_DMA_BASE + dma] & 0x7 ) switch (snes_ram[SNES_DMA_BASE + dma] & 0x7)
{ {
case 0: /* 1 address */ case 0: /* 1 address */
{ {
@ -2420,9 +2427,9 @@ void snes_hdma(const address_space *space)
} }
/* Update address */ /* 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 + 5] = abus & 0xff;
snes_ram[SNES_DMA_BASE + dma + 6] = (abus >> 8) & 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 + 8] = abus & 0xff;
snes_ram[SNES_DMA_BASE + dma + 9] = (abus >> 8) & 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; UINT32 abus, abus_bank, length;
/* Assume priority of the 8 DMA channels is 0-7 */ /* 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 ); //printf( "Making a transfer on channel %d\n", i );
/* Find transfer addresses */ /* Find transfer addresses */
@ -2471,13 +2478,13 @@ void snes_gdma( const address_space *space, UINT8 channels )
//printf( "Address: %06x\n", abus | abus_bank ); //printf( "Address: %06x\n", abus | abus_bank );
/* Auto increment */ /* Auto increment */
if( snes_ram[SNES_DMA_BASE + dma] & 0x8 ) if (snes_ram[SNES_DMA_BASE + dma] & 0x8)
{ {
increment = 0; increment = 0;
} }
else else
{ {
if( snes_ram[SNES_DMA_BASE + dma] & 0x10 ) if (snes_ram[SNES_DMA_BASE + dma] & 0x10)
increment = -1; increment = -1;
else else
increment = 1; increment = 1;
@ -2485,7 +2492,7 @@ void snes_gdma( const address_space *space, UINT8 channels )
/* Number of bytes to transfer */ /* Number of bytes to transfer */
length = (snes_ram[SNES_DMA_BASE + dma + 6] << 8) + snes_ram[SNES_DMA_BASE + dma + 5]; 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 */ 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 ); // 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 ); 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 #endif
switch( snes_ram[SNES_DMA_BASE + dma] & 0x7 ) switch (snes_ram[SNES_DMA_BASE + dma] & 0x7)
{ {
case 0: /* 1 address */ case 0: /* 1 address */
case 2: /* 1 address ?? */ case 2: /* 1 address ?? */
case 6: 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) ); memory_write_byte(space, ((abus & 0xffff) | (abus_bank)), memory_read_byte(space, bbus) );
else /* CPU->PPU */ else /* CPU->PPU */
memory_write_byte(space, bbus, memory_read_byte(space, ((abus & 0xffff) | (abus_bank))) ); 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 1: /* 2 addresses (l,h) */
case 5: 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) ); memory_write_byte(space, ((abus & 0xffff) | (abus_bank)), memory_read_byte(space, bbus) );
else /* CPU->PPU */ else /* CPU->PPU */
memory_write_byte(space, bbus, memory_read_byte(space, ((abus & 0xffff) | (abus_bank))) ); memory_write_byte(space, bbus, memory_read_byte(space, ((abus & 0xffff) | (abus_bank))) );
abus += increment; abus += increment;
if( !(length--) ) if (!(length--))
break; 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) ); memory_write_byte(space, ((abus & 0xffff) | (abus_bank)), memory_read_byte(space, bbus + 1) );
else /* CPU->PPU */ else /* CPU->PPU */
memory_write_byte(space, bbus + 1, memory_read_byte(space, ((abus & 0xffff) | (abus_bank))) ); 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 3: /* 2 addresses/write twice (l,l,h,h) */
case 7: 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) ); memory_write_byte(space, ((abus & 0xffff) | (abus_bank)), memory_read_byte(space, bbus) );
else /* CPU->PPU */ else /* CPU->PPU */
memory_write_byte(space, bbus, memory_read_byte(space, ((abus & 0xffff) | (abus_bank))) ); memory_write_byte(space, bbus, memory_read_byte(space, ((abus & 0xffff) | (abus_bank))) );
abus += increment; abus += increment;
if( !(length--) ) if (!(length--))
break; 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) ); memory_write_byte(space, ((abus & 0xffff) | (abus_bank)), memory_read_byte(space, bbus) );
else /* CPU->PPU */ else /* CPU->PPU */
memory_write_byte(space, bbus, memory_read_byte(space, ((abus & 0xffff) | (abus_bank))) ); memory_write_byte(space, bbus, memory_read_byte(space, ((abus & 0xffff) | (abus_bank))) );
abus += increment; abus += increment;
if( !(length--) ) if (!(length--))
break; 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) ); memory_write_byte(space, ((abus & 0xffff) | (abus_bank)), memory_read_byte(space, bbus + 1) );
else /* CPU->PPU */ else /* CPU->PPU */
memory_write_byte(space, bbus + 1, memory_read_byte(space, ((abus & 0xffff) | (abus_bank))) ); memory_write_byte(space, bbus + 1, memory_read_byte(space, ((abus & 0xffff) | (abus_bank))) );
abus += increment; abus += increment;
if( !(length--) ) if (!(length--))
break; 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) ); memory_write_byte(space, ((abus & 0xffff) | (abus_bank)), memory_read_byte(space, bbus + 1) );
else /* CPU->PPU */ else /* CPU->PPU */
memory_write_byte(space, bbus + 1, memory_read_byte(space, ((abus & 0xffff) | (abus_bank))) ); 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; } break;
case 4: /* 4 addresses (l,h,l,h) */ 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) ); memory_write_byte(space, ((abus & 0xffff) | (abus_bank)), memory_read_byte(space, bbus) );
else /* CPU->PPU */ else /* CPU->PPU */
memory_write_byte(space, bbus, memory_read_byte(space, ((abus & 0xffff) | (abus_bank))) ); memory_write_byte(space, bbus, memory_read_byte(space, ((abus & 0xffff) | (abus_bank))) );
abus += increment; abus += increment;
if( !(length--) ) if (!(length--))
break; 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) ); memory_write_byte(space, ((abus & 0xffff) | (abus_bank)), memory_read_byte(space, bbus + 1) );
else /* CPU->PPU */ else /* CPU->PPU */
memory_write_byte(space, bbus + 1, memory_read_byte(space, ((abus & 0xffff) | (abus_bank))) ); memory_write_byte(space, bbus + 1, memory_read_byte(space, ((abus & 0xffff) | (abus_bank))) );
abus += increment; abus += increment;
if( !(length--) ) if (!(length--))
break; 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) ); memory_write_byte(space, ((abus & 0xffff) | (abus_bank)), memory_read_byte(space, bbus + 2) );
else /* CPU->PPU */ else /* CPU->PPU */
memory_write_byte(space, bbus + 2, memory_read_byte(space, ((abus & 0xffff) | (abus_bank))) ); memory_write_byte(space, bbus + 2, memory_read_byte(space, ((abus & 0xffff) | (abus_bank))) );
abus += increment; abus += increment;
if( !(length--) ) if (!(length--))
break; 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) ); memory_write_byte(space, ((abus & 0xffff) | (abus_bank)), memory_read_byte(space, bbus + 3) );
else /* CPU->PPU */ else /* CPU->PPU */
memory_write_byte(space, bbus + 3, memory_read_byte(space, ((abus & 0xffff) | (abus_bank))) ); memory_write_byte(space, bbus + 3, memory_read_byte(space, ((abus & 0xffff) | (abus_bank))) );

View File

@ -140,8 +140,8 @@ enum
INLINE void snes_draw_blend(UINT16 offset, UINT16 *colour, UINT8 mode, UINT8 clip, UINT8 black_pen_clip ) INLINE void snes_draw_blend(UINT16 offset, UINT16 *colour, UINT8 mode, UINT8 clip, UINT8 black_pen_clip )
{ {
if( (black_pen_clip == SNES_CLIP_ALL2) || if( (black_pen_clip == SNES_CLIP_ALL2) ||
(black_pen_clip == SNES_CLIP_IN && 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[5][offset])) (black_pen_clip == SNES_CLIP_OUT && !snes_ppu.clipmasks[SNES_COLOR][offset]))
*colour = 0; //clip to black before color math *colour = 0; //clip to black before color math
if (clip == SNES_CLIP_ALL2) // blending mode 3 == always OFF 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 ) if( !debug_options.transparency_disabled )
#endif /* MAME_DEBUG */ #endif /* MAME_DEBUG */
if( (clip == SNES_CLIP_ALL) || if( (clip == SNES_CLIP_ALL) ||
(clip == SNES_CLIP_IN && !snes_ppu.clipmasks[5][offset]) || (clip == SNES_CLIP_IN && !snes_ppu.clipmasks[SNES_COLOR][offset]) ||
(clip == SNES_CLIP_OUT && snes_ppu.clipmasks[5][offset]) ) (clip == SNES_CLIP_OUT && snes_ppu.clipmasks[SNES_COLOR][offset]) )
{ {
UINT16 r, g, b; 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); b = ((*colour & 0x7c00) >> 10) + ((scanlines[SUBSCREEN].buffer[offset] & 0x7c00) >> 10);
/* don't halve for the back colour */ /* 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; r >>= 1;
g >>= 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); b = ((*colour & 0x7c00) >> 10) + ((snes_cgram[FIXED_COLOUR] & 0x7c00) >> 10);
/* don't halve for the back colour */ /* 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; r >>= 1;
g >>= 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; if( b > 0x1f ) b = 0;
/* don't halve for the back colour */ /* 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; r >>= 1;
g >>= 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; if( b > 0x1f ) b = 0;
/* don't halve for the back colour */ /* 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; r >>= 1;
g >>= 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) if (!debug_options.windows_disabled)
#endif /* MAME_DEBUG */ #endif /* MAME_DEBUG */
/* Clip to windows */ /* 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) 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) */ /* Only draw if we have a colour (0 == transparent) */
if (colour) if (colour)
@ -396,7 +396,7 @@ INLINE void snes_draw_tile_object(UINT8 screen, UINT16 tileaddr, INT16 x, UINT8
{ {
c = snes_cgram[pal + colour]; c = snes_cgram[pal + colour];
if (blend && screen == MAINSCREEN) /* Only blend main screens */ 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].buffer[ii] = c;
scanlines[screen].zbuf[ii] = priority; 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 */ /* MOSAIC - to be verified */
if (layer == 1) // BG2 use two different bits for horizontal and vertical mosaic 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_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[0].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 else // BG1 works as usual
{ {
mosaic_x = 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[0].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? */ /* 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( (x + (count << 3) < SNES_SCR_WIDTH + 8) )
{ {
if( widemode ) 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 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? */ 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( (x + (xs << 3) < SNES_SCR_WIDTH + 8) )
{ {
if( widemode ) 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 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? */ time_over++; /* Increase time_over. Should we stop drawing if exceeded 34 tiles? */
} }
} }
/* Increase range_over. /* Increase range_over. Stop drawing if exceeded 32 objects and enforcing that limit is enabled */
* Stop drawing if exceeded 32 objects and
* enforcing that limit is enabled */
range_over++; 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 */ /* Set the flag in STAT77 register */
snes_ram[STAT77] |= 0x40; snes_ppu.stat77_flags |= 0x40;
/* FIXME: This stops the SNESTest rom from drawing the object /* FIXME: This stops the SNESTest rom from drawing the object test properly. Maybe we shouldn't stop drawing? */
* test properly. Maybe we shouldn't stop drawing? */
/* return; */ /* return; */
} }
} }
} }
if( time_over >= 34 ) if (time_over >= 34)
{ {
/* Set the flag in STAT77 register */ /* 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 ) static void snes_update_mode_7( UINT8 screen, UINT16 curline )
{ {
UINT8 extbg_mode = snes_ram[SETINI] & 0x40;
UINT8 *bg_enabled; UINT8 *bg_enabled;
bg_enabled = (screen == MAINSCREEN) ? snes_ppu.main_bg_enabled : snes_ppu.sub_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[4]) snes_update_objects(screen, 7, curline);
if (bg_enabled[0]) snes_update_line_mode7(screen, 1, 1, 0, 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 */ /* update colour window */
snes_ppu.clipmasks[5][ii] = 0xff; snes_ppu.clipmasks[SNES_COLOR][ii] = 0xff;
w1 = w2 = -1; w1 = w2 = -1;
if (snes_ppu.colour.window1_enabled) if (snes_ppu.colour.window1_enabled)
{ {
@ -1093,28 +1089,28 @@ static void snes_update_windowmasks(void)
if (snes_ppu.colour.window2_invert) if (snes_ppu.colour.window2_invert)
w2 = !w2; w2 = !w2;
} }
if( w1 >= 0 && w2 >= 0 ) if (w1 >= 0 && w2 >= 0)
{ {
switch (snes_ppu.colour.wlog_mask) switch (snes_ppu.colour.wlog_mask)
{ {
case 0x0: /* OR */ case 0x0: /* OR */
snes_ppu.clipmasks[5][ii] = w1 | w2 ? 0x00 : 0xff; snes_ppu.clipmasks[SNES_COLOR][ii] = w1 | w2 ? 0x00 : 0xff;
break; break;
case 0x4: /* AND */ case 0x4: /* AND */
snes_ppu.clipmasks[5][ii] = w1 & w2 ? 0x00 : 0xff; snes_ppu.clipmasks[SNES_COLOR][ii] = w1 & w2 ? 0x00 : 0xff;
break; break;
case 0x8: /* XOR */ case 0x8: /* XOR */
snes_ppu.clipmasks[5][ii] = w1 ^ w2 ? 0x00 : 0xff; snes_ppu.clipmasks[SNES_COLOR][ii] = w1 ^ w2 ? 0x00 : 0xff;
break; break;
case 0xc: /* XNOR */ case 0xc: /* XNOR */
snes_ppu.clipmasks[5][ii] = !(w1 ^ w2) ? 0x00 : 0xff; snes_ppu.clipmasks[SNES_COLOR][ii] = !(w1 ^ w2) ? 0x00 : 0xff;
break; break;
} }
} }
else if( w1 >= 0 ) else if (w1 >= 0)
snes_ppu.clipmasks[5][ii] = w1 ? 0x00 : 0xff; snes_ppu.clipmasks[SNES_COLOR][ii] = w1 ? 0x00 : 0xff;
else if( w2 >= 0 ) else if (w2 >= 0)
snes_ppu.clipmasks[5][ii] = w2 ? 0x00 : 0xff; snes_ppu.clipmasks[SNES_COLOR][ii] = w2 ? 0x00 : 0xff;
} }
} }
@ -1135,14 +1131,14 @@ static void snes_update_offsets(void)
} }
#if 0 #if 0
popmessage("%04x %04x|%04x %04x|%04x %04x|%04x %04x", popmessage("%04x %04x|%04x %04x|%04x %04x|%04x %04x",
snes_ppu.layer[0].offset.tile_horz, snes_ppu.layer[SNES_BG1].offset.tile_horz,
snes_ppu.layer[0].offset.tile_vert, snes_ppu.layer[SNES_BG1].offset.tile_vert,
snes_ppu.layer[1].offset.tile_horz, snes_ppu.layer[SNES_BG2].offset.tile_horz,
snes_ppu.layer[1].offset.tile_vert, snes_ppu.layer[SNES_BG2].offset.tile_vert,
snes_ppu.layer[2].offset.tile_horz, snes_ppu.layer[SNES_BG3].offset.tile_horz,
snes_ppu.layer[2].offset.tile_vert, snes_ppu.layer[SNES_BG3].offset.tile_vert,
snes_ppu.layer[3].offset.tile_horz, snes_ppu.layer[SNES_BG4].offset.tile_horz,
snes_ppu.layer[3].offset.tile_vert snes_ppu.layer[SNES_BG4].offset.tile_vert
); );
#endif #endif
snes_ppu.update_offsets = 0; 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); 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++) for (x = 0; x < SNES_SCR_WIDTH * 2; x++)
*BITMAP_ADDR32(bitmap, curline, x) = RGB_BLACK; *BITMAP_ADDR32(bitmap, curline, x) = RGB_BLACK;
else 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++) 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]; scanline = &scanlines[MAINSCREEN];
/* Phew! Draw the line to screen */ /* 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++) 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)], WINLOGIC[(snes_ram[WBGLOG] & 0x3)],
(snes_ram[W12SEL] & 0x2)?((snes_ram[W12SEL] & 0x1)?"o":"i"):" ", (snes_ram[W12SEL] & 0x2)?((snes_ram[W12SEL] & 0x1)?"o":"i"):" ",
(snes_ram[W12SEL] & 0x8)?((snes_ram[W12SEL] & 0x4)?"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[MOSAIC] & 0x1)?"m":" ",
snes_ram[BG1SC] & 0x3, snes_ram[BG1SC] & 0x3,
(snes_ram[BG1SC] & 0xfc) << 9, (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 ); //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", logerror("%s2 %s%s%s%s%s%c%s%s%d%s %d %4X %4X",
debug_options.bg_disabled[1]?" ":"*", 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], WINLOGIC[(snes_ram[WBGLOG] & 0xc) >> 2],
(snes_ram[W12SEL] & 0x20)?((snes_ram[W12SEL] & 0x10)?"o":"i"):" ", (snes_ram[W12SEL] & 0x20)?((snes_ram[W12SEL] & 0x10)?"o":"i"):" ",
(snes_ram[W12SEL] & 0x80)?((snes_ram[W12SEL] & 0x40)?"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[MOSAIC] & 0x2)?"m":" ",
snes_ram[BG2SC] & 0x3, snes_ram[BG2SC] & 0x3,
(snes_ram[BG2SC] & 0xfc) << 9, (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 ); //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", logerror("%s3 %s%s%s%s%s%c%s%s%d%s%s%d %4X %4X",
debug_options.bg_disabled[2]?" ":"*", 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], WINLOGIC[(snes_ram[WBGLOG] & 0x30)>>4],
(snes_ram[W34SEL] & 0x2)?((snes_ram[W34SEL] & 0x1)?"o":"i"):" ", (snes_ram[W34SEL] & 0x2)?((snes_ram[W34SEL] & 0x1)?"o":"i"):" ",
(snes_ram[W34SEL] & 0x8)?((snes_ram[W34SEL] & 0x4)?"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[MOSAIC] & 0x4)?"m":" ",
(snes_ram[BGMODE] & 0x8)?"P":" ", (snes_ram[BGMODE] & 0x8)?"P":" ",
snes_ram[BG3SC] & 0x3, snes_ram[BG3SC] & 0x3,
(snes_ram[BG3SC] & 0xfc) << 9, (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 ); //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", logerror("%s4 %s%s%s%s%s%c%s%s%d%s %d %4X %4X",
debug_options.bg_disabled[3]?" ":"*", 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], WINLOGIC[(snes_ram[WBGLOG] & 0xc0)>>6],
(snes_ram[W34SEL] & 0x20)?((snes_ram[W34SEL] & 0x10)?"o":"i"):" ", (snes_ram[W34SEL] & 0x20)?((snes_ram[W34SEL] & 0x10)?"o":"i"):" ",
(snes_ram[W34SEL] & 0x80)?((snes_ram[W34SEL] & 0x40)?"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[MOSAIC] & 0x8)?"m":" ",
snes_ram[BG4SC] & 0x3, snes_ram[BG4SC] & 0x3,
(snes_ram[BG4SC] & 0xfc) << 9, (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 ); //ui_draw_text( t, SNES_DBG_HORZ_POS, y++ * 9 );
logerror("%sO %s%s%s%s%s%c%s%s%d%d %4X", logerror("%sO %s%s%s%s%s%c%s%s%d%d %4X",
debug_options.bg_disabled[4]?" ":"*", 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] & 0x2)?((snes_ram[WOBJSEL] & 0x1)?"o":"i"):" ",
(snes_ram[WOBJSEL] & 0x8)?((snes_ram[WOBJSEL] & 0x4)?"o":"i"):" ", (snes_ram[WOBJSEL] & 0x8)?((snes_ram[WOBJSEL] & 0x4)?"o":"i"):" ",
snes_ppu.oam.size[0], snes_ppu.oam.size[1], 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 ); //ui_draw_text( t, SNES_DBG_HORZ_POS, y++ * 9 );
logerror("%sB %s %c%s%s", logerror("%sB %s %c%s%s",
debug_options.bg_disabled[5]?" ":"*", debug_options.bg_disabled[5]?" ":"*",