trunk/src/mame/video/konicdev.c
| r20769 | r20770 | |
| 10135 | 10135 | { |
| 10136 | 10136 | screen_device *screen; |
| 10137 | 10137 | tilemap_t *layer_8x8[2]; |
| 10138 | | tilemap_t *layer_roz[2]; |
| 10138 | tilemap_t *layer_roz; |
| 10139 | 10139 | int gfx_index[2]; |
| 10140 | 10140 | |
| 10141 | 10141 | UINT32 * tile_ram; |
| r20769 | r20770 | |
| 10235 | 10235 | return (row * 128) + col + 64 + 16384; |
| 10236 | 10236 | } |
| 10237 | 10237 | |
| 10238 | | TILEMAP_MAPPER_MEMBER(k001604_device::k001604_scan_layer_roz_0_size0) |
| 10238 | TILEMAP_MAPPER_MEMBER(k001604_device::k001604_scan_layer_roz_128) |
| 10239 | 10239 | { |
| 10240 | 10240 | /* logical (col,row) -> memory offset */ |
| 10241 | 10241 | return (row * 128) + col; |
| 10242 | 10242 | } |
| 10243 | 10243 | |
| 10244 | | TILEMAP_MAPPER_MEMBER(k001604_device::k001604_scan_layer_roz_0_size1) |
| 10244 | TILEMAP_MAPPER_MEMBER(k001604_device::k001604_scan_layer_roz_256) |
| 10245 | 10245 | { |
| 10246 | 10246 | /* logical (col,row) -> memory offset */ |
| 10247 | 10247 | return (row * 256) + col + 128; |
| 10248 | 10248 | } |
| 10249 | 10249 | |
| 10250 | | TILEMAP_MAPPER_MEMBER(k001604_device::k001604_scan_layer_roz_1_size0) |
| 10251 | | { |
| 10252 | | /* logical (col,row) -> memory offset */ |
| 10253 | | return (row * 128) + col + 64; |
| 10254 | | } |
| 10255 | | |
| 10256 | | TILEMAP_MAPPER_MEMBER(k001604_device::k001604_scan_layer_roz_1_size1) |
| 10257 | | { |
| 10258 | | /* logical (col,row) -> memory offset */ |
| 10259 | | return (row * 256) + col + 128 + 64; |
| 10260 | | } |
| 10261 | | |
| 10262 | 10250 | TILE_GET_INFO_MEMBER(k001604_device::k001604_tile_info_layer_8x8) |
| 10263 | 10251 | { |
| 10264 | 10252 | k001604_state *k001604 = k001604_get_safe_token(this); |
| r20769 | r20770 | |
| 10297 | 10285 | void k001604_draw_back_layer( device_t *device, bitmap_rgb32 &bitmap, const rectangle &cliprect ) |
| 10298 | 10286 | { |
| 10299 | 10287 | k001604_state *k001604 = k001604_get_safe_token(device); |
| 10300 | | int layer; |
| 10301 | | int num_layers; |
| 10302 | 10288 | bitmap.fill(0, cliprect); |
| 10303 | 10289 | |
| 10304 | | num_layers = k001604->layer_size ? 2 : 1; |
| 10305 | | |
| 10306 | 10290 | if ((k001604->reg[0x60 / 4] & 0x40000000) == 0) |
| 10307 | 10291 | return; |
| 10308 | 10292 | |
| 10309 | | for (layer = 0; layer < num_layers; layer++) |
| 10293 | int tile_size = k001604->roz_size ? 16 : 8; |
| 10294 | |
| 10295 | INT32 x = (INT16)((k001604->reg[0x08] >> 16) & 0xffff); |
| 10296 | INT32 y = (INT16)((k001604->reg[0x08] >> 0) & 0xffff); |
| 10297 | INT32 xx = (INT16)((k001604->reg[0x09] >> 0) & 0xffff); |
| 10298 | INT32 xy = (INT16)((k001604->reg[0x09] >> 16) & 0xffff); |
| 10299 | INT32 yx = (INT16)((k001604->reg[0x0a] >> 0) & 0xffff); |
| 10300 | INT32 yy = (INT16)((k001604->reg[0x0a] >> 16) & 0xffff); |
| 10301 | |
| 10302 | int pivotx = (INT16)((k001604->reg[0x00] >> 16) & 0xffff); |
| 10303 | int pivoty = (INT16)((k001604->reg[0x00] >> 0) & 0xffff); |
| 10304 | |
| 10305 | int startx = ((x - pivotx) * 256) * 32; |
| 10306 | int starty = ((y - pivoty) * 256) * 32; |
| 10307 | int incxx = (xx) * 32; |
| 10308 | int incxy = (-xy) * 32; |
| 10309 | int incyx = (-yx) * 32; |
| 10310 | int incyy = (yy) * 32; |
| 10311 | |
| 10312 | bitmap_ind16& pixmap = k001604->layer_roz->pixmap(); |
| 10313 | |
| 10314 | // extract start/end points |
| 10315 | int sx = cliprect.min_x; |
| 10316 | int sy = cliprect.min_y; |
| 10317 | int ex = cliprect.max_x; |
| 10318 | int ey = cliprect.max_y; |
| 10319 | |
| 10320 | const rgb_t *clut = palette_entry_list_raw(bitmap.palette()); |
| 10321 | |
| 10322 | int window_x, window_y, window_xmask, window_ymask; |
| 10323 | |
| 10324 | int layer_size = (k001604->reg[0x1b] >> 9) & 3; |
| 10325 | |
| 10326 | if (k001604->roz_size) |
| 10327 | window_x = ((k001604->reg[0x1b] >> 1) & 3) * 512; |
| 10328 | else |
| 10329 | window_x = ((k001604->reg[0x1b] >> 1) & 1) * 512; |
| 10330 | |
| 10331 | window_y = 0; |
| 10332 | |
| 10333 | switch (layer_size) |
| 10310 | 10334 | { |
| 10311 | | int reg = 0x08; |
| 10335 | case 0: window_xmask = (128 * tile_size) - 1; break; |
| 10336 | case 2: window_xmask = (64 * tile_size) - 1; break; |
| 10337 | case 3: window_xmask = (32 * tile_size) - 1; break; |
| 10338 | default: fatalerror("k001604_draw_back_layer(): layer_size %d\n", layer_size); break; |
| 10339 | } |
| 10312 | 10340 | |
| 10313 | | INT32 x = (INT16)((k001604->reg[reg + 0] >> 16) & 0xffff); |
| 10314 | | INT32 y = (INT16)((k001604->reg[reg + 0] >> 0) & 0xffff); |
| 10315 | | INT32 xx = (INT16)((k001604->reg[reg + 1] >> 0) & 0xffff); |
| 10316 | | INT32 xy = (INT16)((k001604->reg[reg + 1] >> 16) & 0xffff); |
| 10317 | | INT32 yx = (INT16)((k001604->reg[reg + 2] >> 0) & 0xffff); |
| 10318 | | INT32 yy = (INT16)((k001604->reg[reg + 2] >> 16) & 0xffff); |
| 10341 | window_ymask = pixmap.height() - 1; |
| 10342 | |
| 10319 | 10343 | |
| 10320 | | x = (x + 320) * 256; |
| 10321 | | y = (y + 208) * 256; |
| 10322 | | // xx = (xx); |
| 10323 | | xy = (-xy); |
| 10324 | | yx = (-yx); |
| 10325 | | // yy = (yy); |
| 10344 | // loop over rows |
| 10345 | while (sy <= ey) |
| 10346 | { |
| 10347 | // initialize X counters |
| 10348 | int x = sx; |
| 10349 | UINT32 cx = startx; |
| 10350 | UINT32 cy = starty; |
| 10326 | 10351 | |
| 10327 | | if ((k001604->reg[0x6c / 4] & (0x08 >> layer)) != 0) |
| 10352 | UINT32 *dest = &bitmap.pix(sy, sx); |
| 10353 | |
| 10354 | // loop over columns |
| 10355 | while (x <= ex) |
| 10328 | 10356 | { |
| 10329 | | k001604->layer_roz[layer]->draw_roz(bitmap, cliprect, |
| 10330 | | x << 5, y << 5, xx << 5, xy << 5, yx << 5, yy << 5, 1, 0, 0); |
| 10357 | *dest = clut[pixmap.pix16(((cy >> 16) & window_ymask) + window_y, ((cx >> 16) & window_xmask) + window_x)]; |
| 10358 | |
| 10359 | // advance in X |
| 10360 | cx += incxx; |
| 10361 | cy += incxy; |
| 10362 | x++; |
| 10363 | dest++; |
| 10331 | 10364 | } |
| 10365 | |
| 10366 | // advance in Y |
| 10367 | startx += incyx; |
| 10368 | starty += incyy; |
| 10369 | sy++; |
| 10332 | 10370 | } |
| 10333 | 10371 | } |
| 10334 | 10372 | |
| r20769 | r20770 | |
| 10413 | 10451 | { |
| 10414 | 10452 | k001604->layer_8x8[1]->mark_tile_dirty(offset); |
| 10415 | 10453 | } |
| 10416 | | else if (x < 192) |
| 10417 | | { |
| 10418 | | k001604->layer_roz[0]->mark_tile_dirty(offset); |
| 10419 | | } |
| 10420 | 10454 | else |
| 10421 | 10455 | { |
| 10422 | | k001604->layer_roz[1]->mark_tile_dirty(offset); |
| 10456 | k001604->layer_roz->mark_tile_dirty(offset); |
| 10423 | 10457 | } |
| 10424 | 10458 | } |
| 10425 | 10459 | else |
| r20769 | r20770 | |
| 10427 | 10461 | if (x < 64) |
| 10428 | 10462 | { |
| 10429 | 10463 | k001604->layer_8x8[0]->mark_tile_dirty(offset); |
| 10430 | | k001604->layer_roz[0]->mark_tile_dirty(offset); |
| 10431 | 10464 | } |
| 10432 | 10465 | else |
| 10433 | 10466 | { |
| 10434 | 10467 | k001604->layer_8x8[1]->mark_tile_dirty(offset); |
| 10435 | | k001604->layer_roz[1]->mark_tile_dirty(offset); |
| 10436 | 10468 | } |
| 10469 | |
| 10470 | k001604->layer_roz->mark_tile_dirty(offset); |
| 10437 | 10471 | } |
| 10438 | 10472 | } |
| 10439 | 10473 | |
| r20769 | r20770 | |
| 10526 | 10560 | { |
| 10527 | 10561 | k001604->layer_8x8[0] = &machine().tilemap().create(tilemap_get_info_delegate(FUNC(k001604_device::k001604_tile_info_layer_8x8),this), tilemap_mapper_delegate(FUNC(k001604_device::k001604_scan_layer_8x8_0_size1),this), 8, 8, 64, 64); |
| 10528 | 10562 | k001604->layer_8x8[1] = &machine().tilemap().create(tilemap_get_info_delegate(FUNC(k001604_device::k001604_tile_info_layer_8x8),this), tilemap_mapper_delegate(FUNC(k001604_device::k001604_scan_layer_8x8_1_size1),this), 8, 8, 64, 64); |
| 10529 | | k001604->layer_roz[0] = &machine().tilemap().create(tilemap_get_info_delegate(FUNC(k001604_device::k001604_tile_info_layer_roz),this), tilemap_mapper_delegate(FUNC(k001604_device::k001604_scan_layer_roz_0_size1),this), roz_tile_size, roz_tile_size, 64, 64); |
| 10530 | | k001604->layer_roz[1] = &machine().tilemap().create(tilemap_get_info_delegate(FUNC(k001604_device::k001604_tile_info_layer_roz),this), tilemap_mapper_delegate(FUNC(k001604_device::k001604_scan_layer_roz_1_size1),this), roz_tile_size, roz_tile_size, 64, 64); |
| 10563 | |
| 10564 | k001604->layer_roz = &machine().tilemap().create(tilemap_get_info_delegate(FUNC(k001604_device::k001604_tile_info_layer_roz),this), tilemap_mapper_delegate(FUNC(k001604_device::k001604_scan_layer_roz_256),this), roz_tile_size, roz_tile_size, 128, 64); |
| 10531 | 10565 | } |
| 10532 | 10566 | else |
| 10533 | 10567 | { |
| 10534 | 10568 | k001604->layer_8x8[0] = &machine().tilemap().create(tilemap_get_info_delegate(FUNC(k001604_device::k001604_tile_info_layer_8x8),this), tilemap_mapper_delegate(FUNC(k001604_device::k001604_scan_layer_8x8_0_size0),this), 8, 8, 64, 64); |
| 10535 | 10569 | k001604->layer_8x8[1] = &machine().tilemap().create(tilemap_get_info_delegate(FUNC(k001604_device::k001604_tile_info_layer_8x8),this), tilemap_mapper_delegate(FUNC(k001604_device::k001604_scan_layer_8x8_1_size0),this), 8, 8, 64, 64); |
| 10536 | | k001604->layer_roz[0] = &machine().tilemap().create(tilemap_get_info_delegate(FUNC(k001604_device::k001604_tile_info_layer_roz),this), tilemap_mapper_delegate(FUNC(k001604_device::k001604_scan_layer_roz_0_size0),this), roz_tile_size, roz_tile_size, 128, 64); |
| 10537 | | k001604->layer_roz[1] = &machine().tilemap().create(tilemap_get_info_delegate(FUNC(k001604_device::k001604_tile_info_layer_roz),this), tilemap_mapper_delegate(FUNC(k001604_device::k001604_scan_layer_roz_1_size0),this), roz_tile_size, roz_tile_size, 64, 64); |
| 10570 | |
| 10571 | k001604->layer_roz = &machine().tilemap().create(tilemap_get_info_delegate(FUNC(k001604_device::k001604_tile_info_layer_roz),this), tilemap_mapper_delegate(FUNC(k001604_device::k001604_scan_layer_roz_128),this), roz_tile_size, roz_tile_size, 128, 64); |
| 10538 | 10572 | } |
| 10539 | 10573 | } |
| 10540 | 10574 | else /* slrasslt has shifted tilemaps (but only has k001604->layer_size = 0) */ |
| 10541 | 10575 | { |
| 10542 | 10576 | k001604->layer_8x8[0] = &machine().tilemap().create(tilemap_get_info_delegate(FUNC(k001604_device::k001604_tile_info_layer_8x8),this), tilemap_mapper_delegate(FUNC(k001604_device::slrasslt_scan_layer_8x8_0_size0),this), 8, 8, 64, 64); |
| 10543 | 10577 | k001604->layer_8x8[1] = &machine().tilemap().create(tilemap_get_info_delegate(FUNC(k001604_device::k001604_tile_info_layer_8x8),this), tilemap_mapper_delegate(FUNC(k001604_device::slrasslt_scan_layer_8x8_1_size0),this), 8, 8, 64, 64); |
| 10544 | | k001604->layer_roz[0] = &machine().tilemap().create(tilemap_get_info_delegate(FUNC(k001604_device::k001604_tile_info_layer_roz),this), tilemap_mapper_delegate(FUNC(k001604_device::k001604_scan_layer_roz_0_size0),this), roz_tile_size, roz_tile_size, 128, 64); |
| 10545 | | k001604->layer_roz[1] = &machine().tilemap().create(tilemap_get_info_delegate(FUNC(k001604_device::k001604_tile_info_layer_roz),this), tilemap_mapper_delegate(FUNC(k001604_device::k001604_scan_layer_roz_1_size0),this), roz_tile_size, roz_tile_size, 64, 64); |
| 10578 | |
| 10579 | k001604->layer_roz = &machine().tilemap().create(tilemap_get_info_delegate(FUNC(k001604_device::k001604_tile_info_layer_roz),this), tilemap_mapper_delegate(FUNC(k001604_device::k001604_scan_layer_roz_128),this), roz_tile_size, roz_tile_size, 128, 64); |
| 10546 | 10580 | } |
| 10547 | 10581 | |
| 10548 | 10582 | k001604->layer_8x8[0]->set_transparent_pen(0); |