Make the system24 linscroll screen-relative. [Olivier Galibert]

This commit is contained in:
Yasuhiro Ogawa 2009-03-02 08:39:55 +00:00
parent 9671bd3455
commit bd35db8db4

View File

@ -428,15 +428,12 @@ void sys24_tile_draw(running_machine *machine, bitmap_t *bitmap, const rectangle
return; return;
if(ctrl & 0x6000) { if(ctrl & 0x6000) {
UINT16 v;
// Special window/scroll modes // Special window/scroll modes
if(layer & 1) if(layer & 1)
return; return;
v = vscr & 0x1ff; tilemap_set_scrolly(sys24_tile_layer[layer], 0, vscr & 0x1ff);
tilemap_set_scrolly(sys24_tile_layer[layer|1], 0, vscr & 0x1ff);
tilemap_set_scrolly(sys24_tile_layer[layer], 0, v);
tilemap_set_scrolly(sys24_tile_layer[layer|1], 0, v);
if(hscr & 0x8000) { if(hscr & 0x8000) {
UINT16 *hscrtb = sys24_tile_ram + 0x4000 + 0x200*layer; UINT16 *hscrtb = sys24_tile_ram + 0x4000 + 0x200*layer;
@ -444,60 +441,51 @@ void sys24_tile_draw(running_machine *machine, bitmap_t *bitmap, const rectangle
switch((ctrl & 0x6000) >> 13) { switch((ctrl & 0x6000) >> 13) {
case 1: { case 1: {
int y; int y;
UINT16 vv; UINT16 v = (-vscr) & 0x1ff;
vv = (-vscr) & 0x1ff;
if(!((-vscr) & 0x200)) if(!((-vscr) & 0x200))
layer ^= 1; layer ^= 1;
for(y=0; y<384; y++) { for(y=cliprect->min_y; y<=cliprect->max_y; y++) {
if(y >= cliprect->min_y && y <= cliprect->max_y) { UINT16 h;
UINT16 h; rectangle c = *cliprect;
rectangle c = *cliprect; int l1 = layer;
int l1 = layer; if(y >= v)
if(y >= vv) l1 ^= 1;
l1 ^= 1;
c.min_y = c.max_y = y; c.min_y = c.max_y = y;
// Whether it's tilemap-relative or screen-relative is unknown hscr = hscrtb[y];
hscr = hscrtb[v];
h = hscr & 0x1ff; h = hscr & 0x1ff;
tilemap_set_scrollx(sys24_tile_layer[l1], 0, -h); tilemap_set_scrollx(sys24_tile_layer[l1], 0, -h);
tilemap_draw(bitmap, &c, sys24_tile_layer[l1], tpri, lpri); tilemap_draw(bitmap, &c, sys24_tile_layer[l1], tpri, lpri);
}
v = (v + 1) & 0x1ff;
} }
break; break;
} }
case 2: case 3: { case 2: case 3: {
int y; int y;
for(y=0; y<384; y++) { for(y=cliprect->min_y; y<=cliprect->max_y; y++) {
if(y >= cliprect->min_y && y <= cliprect->max_y) { UINT16 h;
UINT16 h; rectangle c1 = *cliprect;
rectangle c1 = *cliprect; rectangle c2 = *cliprect;
rectangle c2 = *cliprect; int l1 = layer;
int l1 = layer;
// Whether it's tilemap-relative or screen-relative is unknown hscr = hscrtb[y];
hscr = hscrtb[v];
h = hscr & 0x1ff; h = hscr & 0x1ff;
tilemap_set_scrollx(sys24_tile_layer[layer], 0, -h); tilemap_set_scrollx(sys24_tile_layer[layer], 0, -h);
tilemap_set_scrollx(sys24_tile_layer[layer|1], 0, -h); tilemap_set_scrollx(sys24_tile_layer[layer|1], 0, -h);
if(c1.max_x >= h) if(c1.max_x >= h)
c1.max_x = h-1; c1.max_x = h-1;
if(c2.min_x < h) if(c2.min_x < h)
c2.min_x = h; c2.min_x = h;
if(!(hscr & 0x200)) if(!(hscr & 0x200))
l1 ^= 1; l1 ^= 1;
c1.min_y = c1.max_y = c2.min_y = c2.max_y = y; c1.min_y = c1.max_y = c2.min_y = c2.max_y = y;
tilemap_draw(bitmap, &c1, sys24_tile_layer[l1], tpri, lpri); tilemap_draw(bitmap, &c1, sys24_tile_layer[l1], tpri, lpri);
tilemap_draw(bitmap, &c2, sys24_tile_layer[l1^1], tpri, lpri); tilemap_draw(bitmap, &c2, sys24_tile_layer[l1^1], tpri, lpri);
}
v = (v + 1) & 0x1ff;
} }
break; break;
} }
@ -563,8 +551,7 @@ void sys24_tile_draw(running_machine *machine, bitmap_t *bitmap, const rectangle
vscr &= 0x1ff; vscr &= 0x1ff;
for(y=0; y<384; y++) { for(y=0; y<384; y++) {
// Whether it's tilemap-relative or screen-relative is unknown hscr = (-hscrtb[y]) & 0x1ff;
hscr = (-hscrtb[vscr]) & 0x1ff;
if(hscr + 496 <= 512) { if(hscr + 496 <= 512) {
// Horizontal split unnecessary // Horizontal split unnecessary
draw(machine, bm, tm, bitmap, mask, tpri, lpri, win, hscr, vscr, 0, y, 496, y+1); draw(machine, bm, tm, bitmap, mask, tpri, lpri, win, hscr, vscr, 0, y, 496, y+1);