18
18
#define BG_PAL_INTENSITY_RG 0x1fe
19
19
#define BG_PAL_INTENSITY_BU 0x1ff
21
static UINT8 ps5_vram_page;
22
static UINT8 bg_clip_mode;
23
static UINT8 title_screen;
24
static UINT8 psychic5_bg_status;
26
static UINT8 *ps5_pagedram[2];
29
static UINT8 *psychic5_bg_videoram;
30
static UINT8 *ps5_dummy_bg_ram;
33
static UINT8 *ps5_io_ram;
34
static UINT8 *ps5_palette_ram;
35
static UINT8 *psychic5_fg_videoram;
37
static tilemap_t *bg_tilemap, *fg_tilemap;
39
static int bg_palette_ram_base;
40
static int bg_palette_base;
42
static UINT16 palette_intensity;
44
static UINT8 bombsa_unknown;
47
22
/***************************************************************************
49
24
***************************************************************************/
51
static void psychic5_change_palette(running_machine *machine, int color, int offset)
26
static void psychic5_change_palette(running_machine &machine, int color, int offset)
53
UINT8 lo = ps5_palette_ram[offset & ~1];
54
UINT8 hi = ps5_palette_ram[offset | 1];
55
if (jal_blend_table != NULL) jal_blend_table[color] = hi & 0x0f;
28
psychic5_state *state = machine.driver_data<psychic5_state>();
29
UINT8 lo = state->m_ps5_palette_ram[offset & ~1];
30
UINT8 hi = state->m_ps5_palette_ram[offset | 1];
31
jal_blend_set(color, hi & 0x0f);
56
32
palette_set_color_rgb(machine, color, pal4bit(lo >> 4), pal4bit(lo), pal4bit(hi >> 4));
59
static void psychic5_change_bg_palette(running_machine *machine, int color, int lo_offs, int hi_offs)
35
static void psychic5_change_bg_palette(running_machine &machine, int color, int lo_offs, int hi_offs)
37
psychic5_state *state = machine.driver_data<psychic5_state>();
61
38
UINT8 r,g,b,lo,hi,ir,ig,ib,ix;
64
41
/* red,green,blue intensities */
65
ir = pal4bit(palette_intensity >> 12);
66
ig = pal4bit(palette_intensity >> 8);
67
ib = pal4bit(palette_intensity >> 4);
68
ix = palette_intensity & 0x0f;
42
ir = pal4bit(state->m_palette_intensity >> 12);
43
ig = pal4bit(state->m_palette_intensity >> 8);
44
ib = pal4bit(state->m_palette_intensity >> 4);
45
ix = state->m_palette_intensity & 0x0f;
70
47
irgb = MAKE_RGB(ir,ig,ib);
72
lo = ps5_palette_ram[lo_offs];
73
hi = ps5_palette_ram[hi_offs];
49
lo = state->m_ps5_palette_ram[lo_offs];
50
hi = state->m_ps5_palette_ram[hi_offs];
75
52
/* red,green,blue component */
76
53
r = pal4bit(lo >> 4);
114
92
READ8_HANDLER( psychic5_vram_page_select_r )
116
return ps5_vram_page;
94
psychic5_state *state = space->machine().driver_data<psychic5_state>();
95
return state->m_ps5_vram_page;
119
98
WRITE8_HANDLER( psychic5_vram_page_select_w )
121
ps5_vram_page = data & 1;
100
psychic5_state *state = space->machine().driver_data<psychic5_state>();
101
state->m_ps5_vram_page = data & 1;
124
104
WRITE8_HANDLER( psychic5_title_screen_w )
106
psychic5_state *state = space->machine().driver_data<psychic5_state>();
107
state->m_title_screen = data;
129
110
READ8_HANDLER( psychic5_paged_ram_r )
131
if (ps5_vram_page == 1)
112
psychic5_state *state = space->machine().driver_data<psychic5_state>();
113
if (state->m_ps5_vram_page == 1)
135
case 0x00: return input_port_read(space->machine, "SYSTEM");
136
case 0x01: return input_port_read(space->machine, "P1");
137
case 0x02: return input_port_read(space->machine, "P2");
138
case 0x03: return input_port_read(space->machine, "DSW1");
139
case 0x04: return input_port_read(space->machine, "DSW2");
117
case 0x00: return input_port_read(space->machine(), "SYSTEM");
118
case 0x01: return input_port_read(space->machine(), "P1");
119
case 0x02: return input_port_read(space->machine(), "P2");
120
case 0x03: return input_port_read(space->machine(), "DSW1");
121
case 0x04: return input_port_read(space->machine(), "DSW2");
143
return ps5_pagedram[ps5_vram_page][offset];
125
return state->m_ps5_pagedram[state->m_ps5_vram_page][offset];
146
128
WRITE8_HANDLER( psychic5_paged_ram_w )
148
ps5_pagedram[ps5_vram_page][offset] = data;
130
psychic5_state *state = space->machine().driver_data<psychic5_state>();
131
state->m_ps5_pagedram[state->m_ps5_vram_page][offset] = data;
150
if (ps5_vram_page == 0)
133
if (state->m_ps5_vram_page == 0)
152
135
if (offset <= 0xfff)
153
tilemap_mark_tile_dirty(bg_tilemap, offset >> 1);
136
tilemap_mark_tile_dirty(state->m_bg_tilemap, offset >> 1);
157
140
if (offset == BG_SCROLLX_LSB || offset == BG_SCROLLX_MSB)
159
UINT16 bg_scrollx = ps5_io_ram[BG_SCROLLX_LSB] | (ps5_io_ram[BG_SCROLLX_MSB] << 8);
160
tilemap_set_scrollx(bg_tilemap, 0, bg_scrollx);
142
UINT16 bg_scrollx = state->m_ps5_io_ram[BG_SCROLLX_LSB] | (state->m_ps5_io_ram[BG_SCROLLX_MSB] << 8);
143
tilemap_set_scrollx(state->m_bg_tilemap, 0, bg_scrollx);
162
145
else if (offset == BG_SCROLLY_LSB || offset == BG_SCROLLY_MSB)
164
UINT16 bg_scrolly = ps5_io_ram[BG_SCROLLY_LSB] | (ps5_io_ram[BG_SCROLLY_MSB] << 8);
165
tilemap_set_scrolly(bg_tilemap, 0, bg_scrolly);
147
UINT16 bg_scrolly = state->m_ps5_io_ram[BG_SCROLLY_LSB] | (state->m_ps5_io_ram[BG_SCROLLY_MSB] << 8);
148
tilemap_set_scrolly(state->m_bg_tilemap, 0, bg_scrolly);
167
150
else if (offset == BG_SCREEN_MODE)
169
psychic5_bg_status = ps5_io_ram[BG_SCREEN_MODE];
152
state->m_bg_status = state->m_ps5_io_ram[BG_SCREEN_MODE];
171
154
else if (offset >= 0x400 && offset <= 0x5ff) /* Sprite color */
172
psychic5_change_palette(space->machine,((offset >> 1) & 0xff)+0x000,offset-0x400);
155
psychic5_change_palette(space->machine(),((offset >> 1) & 0xff)+0x000,offset-0x400);
173
156
else if (offset >= 0x800 && offset <= 0x9ff) /* BG color */
174
psychic5_change_palette(space->machine,((offset >> 1) & 0xff)+0x100,offset-0x400);
157
psychic5_change_palette(space->machine(),((offset >> 1) & 0xff)+0x100,offset-0x400);
175
158
else if (offset >= 0xa00 && offset <= 0xbff) /* Text color */
176
psychic5_change_palette(space->machine,((offset >> 1) & 0xff)+0x200,offset-0x400);
159
psychic5_change_palette(space->machine(),((offset >> 1) & 0xff)+0x200,offset-0x400);
177
160
else if (offset >= 0x1000)
178
tilemap_mark_tile_dirty(fg_tilemap, (offset-0x1000) >> 1);
161
tilemap_mark_tile_dirty(state->m_fg_tilemap, (offset-0x1000) >> 1);
182
165
WRITE8_HANDLER( bombsa_paged_ram_w )
184
ps5_pagedram[ps5_vram_page][offset] = data;
167
psychic5_state *state = space->machine().driver_data<psychic5_state>();
168
state->m_ps5_pagedram[state->m_ps5_vram_page][offset] = data;
186
if (ps5_vram_page == 0)
170
if (state->m_ps5_vram_page == 0)
188
tilemap_mark_tile_dirty(bg_tilemap, offset >> 1);
172
tilemap_mark_tile_dirty(state->m_bg_tilemap, offset >> 1);
192
176
if (offset == BG_SCROLLX_LSB || offset == BG_SCROLLX_MSB)
194
UINT16 bg_scrollx = ps5_io_ram[BG_SCROLLX_LSB] | (ps5_io_ram[BG_SCROLLX_MSB] << 8);
195
tilemap_set_scrollx(bg_tilemap, 0, bg_scrollx);
178
UINT16 bg_scrollx = state->m_ps5_io_ram[BG_SCROLLX_LSB] | (state->m_ps5_io_ram[BG_SCROLLX_MSB] << 8);
179
tilemap_set_scrollx(state->m_bg_tilemap, 0, bg_scrollx);
197
181
else if (offset == BG_SCROLLY_LSB || offset == BG_SCROLLY_MSB)
199
UINT16 bg_scrolly = ps5_io_ram[BG_SCROLLY_LSB] | (ps5_io_ram[BG_SCROLLY_MSB] << 8);
200
tilemap_set_scrolly(bg_tilemap, 0, bg_scrolly);
183
UINT16 bg_scrolly = state->m_ps5_io_ram[BG_SCROLLY_LSB] | (state->m_ps5_io_ram[BG_SCROLLY_MSB] << 8);
184
tilemap_set_scrolly(state->m_bg_tilemap, 0, bg_scrolly);
202
186
else if (offset == BG_SCREEN_MODE)
204
psychic5_bg_status = ps5_io_ram[BG_SCREEN_MODE];
188
state->m_bg_status = state->m_ps5_io_ram[BG_SCREEN_MODE];
206
190
else if (offset >= 0x0800 && offset <= 0x0fff)
207
tilemap_mark_tile_dirty(fg_tilemap, (offset & 0x7ff) >> 1);
191
tilemap_mark_tile_dirty(state->m_fg_tilemap, (offset & 0x7ff) >> 1);
208
192
else if (offset >= 0x1000 && offset <= 0x15ff)
209
psychic5_change_palette(space->machine, (offset >> 1) & 0x3ff, offset-0x1000);
193
psychic5_change_palette(space->machine(), (offset >> 1) & 0x3ff, offset-0x1000);
213
197
WRITE8_HANDLER( bombsa_unknown_w )
215
bombsa_unknown = data;
199
psychic5_state *state = space->machine().driver_data<psychic5_state>();
200
state->m_bombsa_unknown = data;
250
237
VIDEO_START( psychic5 )
239
psychic5_state *state = machine.driver_data<psychic5_state>();
252
240
/* info offset w h col row */
253
bg_tilemap = tilemap_create(machine, get_bg_tile_info, tilemap_scan_cols, 16, 16, 64, 32);
254
fg_tilemap = tilemap_create(machine, get_fg_tile_info, tilemap_scan_cols, 8, 8, 32, 32);
256
tilemap_set_transparent_pen(fg_tilemap, 15);
258
ps5_pagedram[0] = auto_alloc_array(machine, UINT8, 0x2000);
259
ps5_pagedram[1] = auto_alloc_array(machine, UINT8, 0x2000);
261
psychic5_bg_videoram = &ps5_pagedram[0][0x0000];
262
ps5_dummy_bg_ram = &ps5_pagedram[0][0x1000];
263
ps5_io_ram = &ps5_pagedram[1][0x0000];
264
ps5_palette_ram = &ps5_pagedram[1][0x0400];
265
psychic5_fg_videoram = &ps5_pagedram[1][0x1000];
267
jal_blend_table = auto_alloc_array(machine, UINT8, 0xc00);
269
bg_palette_ram_base = 0x400;
270
bg_palette_base = 0x100;
241
state->m_bg_tilemap = tilemap_create(machine, get_bg_tile_info, tilemap_scan_cols, 16, 16, 64, 32);
242
state->m_fg_tilemap = tilemap_create(machine, get_fg_tile_info, tilemap_scan_cols, 8, 8, 32, 32);
244
tilemap_set_transparent_pen(state->m_fg_tilemap, 15);
246
state->m_ps5_pagedram[0] = auto_alloc_array(machine, UINT8, 0x2000);
247
state->m_ps5_pagedram[1] = auto_alloc_array(machine, UINT8, 0x2000);
249
state->m_bg_videoram = &state->m_ps5_pagedram[0][0x0000];
250
state->m_ps5_dummy_bg_ram = &state->m_ps5_pagedram[0][0x1000];
251
state->m_ps5_io_ram = &state->m_ps5_pagedram[1][0x0000];
252
state->m_ps5_palette_ram = &state->m_ps5_pagedram[1][0x0400];
253
state->m_fg_videoram = &state->m_ps5_pagedram[1][0x1000];
255
jal_blend_init(machine, 1);
257
state->m_bg_palette_ram_base = 0x400;
258
state->m_bg_palette_base = 0x100;
273
261
VIDEO_START( bombsa )
263
psychic5_state *state = machine.driver_data<psychic5_state>();
275
264
/* info offset w h col row */
276
bg_tilemap = tilemap_create(machine, get_bg_tile_info, tilemap_scan_cols, 16, 16, 128, 32);
277
fg_tilemap = tilemap_create(machine, get_fg_tile_info, tilemap_scan_cols, 8, 8, 32, 32);
279
tilemap_set_transparent_pen(fg_tilemap, 15);
281
ps5_pagedram[0] = auto_alloc_array(machine, UINT8, 0x2000);
282
ps5_pagedram[1] = auto_alloc_array(machine, UINT8, 0x2000);
284
psychic5_bg_videoram = &ps5_pagedram[0][0x0000];
285
ps5_dummy_bg_ram = &ps5_pagedram[0][0x1000];
286
ps5_io_ram = &ps5_pagedram[1][0x0000];
287
psychic5_fg_videoram = &ps5_pagedram[1][0x0800];
288
ps5_palette_ram = &ps5_pagedram[1][0x1000];
290
//jal_blend_table = auto_alloc_array(machine, UINT8, 0xc00);
291
jal_blend_table = NULL;
293
bg_palette_ram_base = 0x000;
294
bg_palette_base = 0x000;
265
state->m_bg_tilemap = tilemap_create(machine, get_bg_tile_info, tilemap_scan_cols, 16, 16, 128, 32);
266
state->m_fg_tilemap = tilemap_create(machine, get_fg_tile_info, tilemap_scan_cols, 8, 8, 32, 32);
268
tilemap_set_transparent_pen(state->m_fg_tilemap, 15);
270
state->m_ps5_pagedram[0] = auto_alloc_array(machine, UINT8, 0x2000);
271
state->m_ps5_pagedram[1] = auto_alloc_array(machine, UINT8, 0x2000);
273
state->m_bg_videoram = &state->m_ps5_pagedram[0][0x0000];
274
state->m_ps5_dummy_bg_ram = &state->m_ps5_pagedram[0][0x1000];
275
state->m_ps5_io_ram = &state->m_ps5_pagedram[1][0x0000];
276
state->m_fg_videoram = &state->m_ps5_pagedram[1][0x0800];
277
state->m_ps5_palette_ram = &state->m_ps5_pagedram[1][0x1000];
279
jal_blend_init(machine, 0);
281
state->m_bg_palette_ram_base = 0x000;
282
state->m_bg_palette_base = 0x000;
297
285
VIDEO_RESET( psychic5 )
301
psychic5_bg_status = 0;
302
memset(ps5_pagedram[0],0,0x2000);
303
memset(ps5_pagedram[1],0,0x2000);
304
palette_intensity = 0;
305
if (jal_blend_table != NULL) memset(jal_blend_table,0,0xc00);
287
psychic5_state *state = machine.driver_data<psychic5_state>();
288
state->m_bg_clip_mode = 0;
289
state->m_ps5_vram_page = 0;
290
state->m_bg_status = 0;
291
memset(state->m_ps5_pagedram[0],0,0x2000);
292
memset(state->m_ps5_pagedram[1],0,0x2000);
293
state->m_palette_intensity = 0;
308
296
VIDEO_RESET( bombsa )
311
psychic5_bg_status = 0;
313
memset(ps5_pagedram[0],0,0x2000);
314
memset(ps5_pagedram[1],0,0x2000);
315
palette_intensity = 0;
316
if (jal_blend_table != NULL) memset(jal_blend_table,0,0xc00);
298
psychic5_state *state = machine.driver_data<psychic5_state>();
299
state->m_ps5_vram_page = 0;
300
state->m_bg_status = 0;
301
state->m_title_screen = 0;
302
memset(state->m_ps5_pagedram[0],0,0x2000);
303
memset(state->m_ps5_pagedram[1],0,0x2000);
304
state->m_palette_intensity = 0;
322
310
***************************************************************************/
324
#define DRAW_SPRITE(code, sx, sy) jal_blend_drawgfx(bitmap, cliprect, machine->gfx[0], code, color, flipx, flipy, sx, sy, 15);
312
#define DRAW_SPRITE(code, sx, sy) jal_blend_drawgfx(bitmap, cliprect, machine.gfx[0], code, color, flipx, flipy, sx, sy, 15);
326
static void draw_sprites(running_machine *machine, bitmap_t *bitmap, const rectangle *cliprect)
314
static void draw_sprites(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect)
328
UINT8 *spriteram = machine->generic.spriteram.u8;
316
psychic5_state *state = machine.driver_data<psychic5_state>();
317
UINT8 *spriteram = state->m_spriteram;
331
320
/* Draw the sprites */
332
for (offs = 0; offs < machine->generic.spriteram_size; offs += 16)
321
for (offs = 0; offs < state->m_spriteram_size; offs += 16)
334
323
int attr = spriteram[offs + 13];
335
324
int code = spriteram[offs + 14] | ((attr & 0xc0) << 2);
379
static void draw_background(running_machine *machine, bitmap_t *bitmap, const rectangle *cliprect)
368
static void draw_background(running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect)
381
UINT8 *spriteram = machine->generic.spriteram.u8;
382
static int sx1 = 0, sy1 = 0, sy2 = 0;
370
psychic5_state *state = machine.driver_data<psychic5_state>();
371
UINT8 *spriteram = state->m_spriteram;
384
373
rectangle clip = *cliprect;
386
375
set_background_palette_intensity(machine);
388
if (!(title_screen & 1))
377
if (!(state->m_title_screen & 1))
379
state->m_bg_clip_mode = 0;
380
state->m_sx1 = state->m_sy1 = state->m_sy2 = 0;
399
sy1 = spriteram[11]; /* sprite 0 */
401
sy2 = spriteram[11+128]; /* sprite 8 */
403
switch (bg_clip_mode)
384
int sy1_old = state->m_sy1;
385
int sx1_old = state->m_sx1;
386
int sy2_old = state->m_sy2;
388
state->m_sy1 = spriteram[11]; /* sprite 0 */
389
state->m_sx1 = spriteram[12];
390
state->m_sy2 = spriteram[11+128]; /* sprite 8 */
392
switch (state->m_bg_clip_mode)
405
case 0: case 4: if (sy1_old != sy1) bg_clip_mode++; break;
406
case 2: case 6: if (sy2_old != sy2) bg_clip_mode++; break;
394
case 0: case 4: if (sy1_old != state->m_sy1) state->m_bg_clip_mode++; break;
395
case 2: case 6: if (sy2_old != state->m_sy2) state->m_bg_clip_mode++; break;
408
case 12: case 14: if (sx1_old != sx1) bg_clip_mode++; break;
409
case 1: case 5: if (sy1 == 0xf0) bg_clip_mode++; break;
410
case 3: case 7: if (sy2 == 0xf0) bg_clip_mode++; break;
411
case 9: case 11: if (sx1 == 0xf0) bg_clip_mode++; break;
412
case 13: case 15: if (sx1_old == 0xf0) bg_clip_mode++;
413
case 16: if (sy1 != 0x00) bg_clip_mode = 0; break;
397
case 12: case 14: if (sx1_old != state->m_sx1) state->m_bg_clip_mode++; break;
398
case 1: case 5: if (state->m_sy1 == 0xf0) state->m_bg_clip_mode++; break;
399
case 3: case 7: if (state->m_sy2 == 0xf0) state->m_bg_clip_mode++; break;
400
case 9: case 11: if (state->m_sx1 == 0xf0) state->m_bg_clip_mode++; break;
401
case 13: case 15: if (sx1_old == 0xf0) state->m_bg_clip_mode++;
402
case 16: if (state->m_sy1 != 0x00) state->m_bg_clip_mode = 0; break;
416
switch (bg_clip_mode)
405
switch (state->m_bg_clip_mode)
418
407
case 0: case 4: case 8: case 12: case 16:
419
408
clip.min_x = clip.max_x = clip.min_y = clip.max_y = 0;
421
case 1: clip.min_y = sy1; break;
422
case 3: clip.max_y = sy2; break;
423
case 5: clip.max_y = sy1; break;
424
case 7: clip.min_y = sy2; break;
425
case 9: case 15: clip.min_x = sx1; break;
426
case 11: case 13: clip.max_x = sx1; break;
410
case 1: clip.min_y = state->m_sy1; break;
411
case 3: clip.max_y = state->m_sy2; break;
412
case 5: clip.max_y = state->m_sy1; break;
413
case 7: clip.min_y = state->m_sy2; break;
414
case 9: case 15: clip.min_x = state->m_sx1; break;
415
case 11: case 13: clip.max_x = state->m_sx1; break;
429
418
if (flip_screen_get(machine))
443
tilemap_draw(bitmap, &clip, bg_tilemap, 0, 0);
432
tilemap_draw(bitmap, &clip, state->m_bg_tilemap, 0, 0);
446
VIDEO_UPDATE( psychic5 )
435
SCREEN_UPDATE( psychic5 )
448
bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine));
449
if (psychic5_bg_status & 1) /* Backgound enable */
450
draw_background(screen->machine, bitmap, cliprect);
451
if (!(title_screen & 1))
452
draw_sprites(screen->machine, bitmap, cliprect);
453
tilemap_draw(bitmap, cliprect, fg_tilemap, 0, 0);
437
psychic5_state *state = screen->machine().driver_data<psychic5_state>();
438
bitmap_fill(bitmap, cliprect, get_black_pen(screen->machine()));
439
if (state->m_bg_status & 1) /* Backgound enable */
440
draw_background(screen->machine(), bitmap, cliprect);
441
if (!(state->m_title_screen & 1))
442
draw_sprites(screen->machine(), bitmap, cliprect);
443
tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 0);
457
VIDEO_UPDATE( bombsa )
447
SCREEN_UPDATE( bombsa )
459
if (psychic5_bg_status & 1) /* Backgound enable */
460
tilemap_draw(bitmap, cliprect, bg_tilemap, 0, 0);
449
psychic5_state *state = screen->machine().driver_data<psychic5_state>();
450
if (state->m_bg_status & 1) /* Backgound enable */
451
tilemap_draw(bitmap, cliprect, state->m_bg_tilemap, 0, 0);
462
bitmap_fill(bitmap, cliprect, screen->machine->pens[0x0ff]);
463
draw_sprites(screen->machine, bitmap, cliprect);
464
tilemap_draw(bitmap, cliprect, fg_tilemap, 0, 0);
453
bitmap_fill(bitmap, cliprect, screen->machine().pens[0x0ff]);
454
draw_sprites(screen->machine(), bitmap, cliprect);
455
tilemap_draw(bitmap, cliprect, state->m_fg_tilemap, 0, 0);