mirror of
https://github.com/holub/mame
synced 2025-04-26 10:13:37 +03:00
snes wip: added a couple of registers to snes_ppu struct and a few cosmetic cleanups
This commit is contained in:
parent
dab2213b59
commit
f2bb738b9e
@ -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
|
||||||
|
@ -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))) );
|
||||||
|
@ -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]?" ":"*",
|
||||||
|
Loading…
Reference in New Issue
Block a user