4
See src/drivers/psikyo4.c for more info
6
Each sprite has a flag denoting the screen to which it should be drawn.
13
0x3003fe4 -- ??xx???? vblank? 86??0000 always?
14
0x3003fe8 -- c0c0???? flipscreen for screen 1 and 2 resp.
15
????8080 Screen size select
16
0x3003fec -- a0000xxx always? is in two working games. 0x00000fff is bank select for gfx test
17
0x3003ff0 -- 000000ff brightness for screen 1, ffffff00 are probably seperate rgb brightness (not used)
18
0x3003ff4 -- ffffff00 screen 1 clear colour
19
0x3003ff8 -- 000000ff brightness for screen 2, ffffff00 are probably seperate rgb brightness (not used)
20
0x3003ffc -- ffffff00 screen 2 clear colour
22
HotDebut: 86010000 00009998 80000000 Small Screen
23
LodeRnDF: 86010000 00009998 a0000000 Small Screen
25
HotGmck: 86010000 1f201918 a0000000 Large Screen
26
HgKairak: 86010000 1f201918 a0000000 Large Screen
30
#include "includes/psikyo4.h"
34
static void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, UINT32 scr )
36
/*- Sprite Format 0x0000 - 0x2bff -**
38
0 hhhh --yy yyyy yyyy | wwww --xx xxxx xxxx 1 Ffpp pppp ---- -nnn | nnnn nnnn nnnn nnnn
53
**- End Sprite Format -*/
55
psikyo4_state *state = machine.driver_data<psikyo4_state>();
56
const gfx_element *gfx = machine.gfx[0];
57
UINT32 *source = state->m_spriteram;
58
UINT16 *list = (UINT16 *)state->m_spriteram + 0x2c00/2 + 0x04/2; /* 0x2c00/0x2c02 what are these for, pointers? one for each screen */
59
UINT16 listlen = (0xc00/2 - 0x04/2), listcntr = 0;
60
int flipscreen1, flipscreen2;
62
flipscreen1 = (((state->m_vidregs[1] >> 30) & 2) == 2) ? 1 : 0;
63
flipscreen2 = (((state->m_vidregs[1] >> 22) & 2) == 2) ? 1 : 0;
65
while (listcntr < listlen)
67
UINT16 listdat, sprnum, thisscreen;
69
listdat = list[BYTE_XOR_BE(listcntr)];
70
sprnum = (listdat & 0x03ff) * 2;
73
if ((listdat & 0x2000) == scr) thisscreen = 1;
76
if (!(listdat & 0x8000) && thisscreen) /* draw only selected screen */
78
int loopnum = 0, i, j;
79
UINT32 xpos, ypos, tnum, wide, high, colr, flipx, flipy;
80
int xstart, ystart, xend, yend, xinc, yinc;
82
ypos = (source[sprnum + 0] & 0x03ff0000) >> 16;
83
xpos = (source[sprnum + 0] & 0x000003ff) >> 00;
85
high = ((source[sprnum + 0] & 0xf0000000) >> (12 + 16)) + 1;
86
wide = ((source[sprnum + 0] & 0x0000f000) >> 12) + 1;
88
tnum = (source[sprnum + 1] & 0x0007ffff) >> 00;
90
colr = (source[sprnum + 1] & 0x3f000000) >> 24;
92
colr += 0x40; /* Use second copy of palette which is dimmed appropriately */
94
flipx = (source[sprnum + 1] & 0x40000000);
95
flipy = (source[sprnum + 1] & 0x80000000); /* Guess */
97
if (ypos & 0x200) ypos -= 0x400;
98
if (xpos & 0x200) xpos -= 0x400;
100
if ((!scr && flipscreen1) || (scr && flipscreen2))
102
ypos = machine.primary_screen->visible_area().max_y + 1 - ypos - high * 16; /* Screen Height depends on game */
103
xpos = 40 * 8 - xpos - wide * 16;
108
if (flipx) { xstart = wide - 1; xend = -1; xinc = -1; }
109
else { xstart = 0; xend = wide; xinc = +1; }
111
if (flipy) { ystart = high - 1; yend = -1; yinc = -1; }
112
else { ystart = 0; yend = high; yinc = +1; }
114
for (j = ystart; j != yend; j += yinc)
116
for (i = xstart; i != xend; i += xinc)
118
drawgfx_transpen(bitmap, cliprect, gfx, tnum + loopnum, colr, flipx, flipy, xpos + 16 * i, ypos + 16 * j, 0);
125
if (listdat & 0x4000)
130
SCREEN_UPDATE( psikyo4 )
132
device_t *left_screen = screen->machine().device("lscreen");
133
device_t *right_screen = screen->machine().device("rscreen");
135
if (screen == left_screen)
137
bitmap_fill(bitmap, cliprect, 0x1000);
138
draw_sprites(screen->machine(), bitmap, cliprect, 0x0000);
140
if (screen == right_screen)
142
bitmap_fill(bitmap, cliprect, 0x1001);
143
draw_sprites(screen->machine(), bitmap, cliprect, 0x2000);
148
VIDEO_START( psikyo4 )
150
machine.gfx[0]->color_granularity = 32; /* 256 colour sprites with palette selectable on 32 colour boundaries */