trunk/src/mame/video/jagblit.c
| r21049 | r21050 | |
| 296 | 296 | adest_xmask = (COMMAND & 0x00000800) ? a2_xmask : a1_xmask; |
| 297 | 297 | adest_ymask = (COMMAND & 0x00000800) ? a2_ymask : a1_ymask; |
| 298 | 298 | |
| 299 | int gouraud_color[4]; |
| 300 | gouraud_color[0] = (m_blitter_regs[B_PATD_H] >> 16) & 0xff00; |
| 301 | gouraud_color[1] = m_blitter_regs[B_PATD_H] & 0xff00; |
| 302 | gouraud_color[2] = (m_blitter_regs[B_PATD_L] >> 16) & 0xff00; |
| 303 | gouraud_color[3] = m_blitter_regs[B_PATD_L] & 0xff00; |
| 304 | |
| 305 | int gouraud_inten[4]; |
| 306 | gouraud_inten[3] = m_blitter_regs[B_I0] & 0xffffff; |
| 307 | gouraud_inten[2] = m_blitter_regs[B_I1] & 0xffffff; |
| 308 | gouraud_inten[1] = m_blitter_regs[B_I2] & 0xffffff; |
| 309 | gouraud_inten[0] = m_blitter_regs[B_I3] & 0xffffff; |
| 310 | |
| 311 | int gouraud_iinc = m_blitter_regs[B_IINC] & 0xffffff; |
| 312 | if (gouraud_iinc & 0x800000) |
| 313 | gouraud_iinc |= 0xff000000; |
| 314 | |
| 299 | 315 | if (LOG_BLITS) |
| 300 | 316 | { |
| 301 | 317 | logerror("%s:Blit!\n", machine().describe_context()); |
| r21049 | r21050 | |
| 347 | 363 | /* load src data and Z */ |
| 348 | 364 | if (COMMAND & 0x00000001) |
| 349 | 365 | { |
| 350 | | srcdata = READ_PIXEL(asrc, asrcflags); |
| 366 | srcdata = READ_PIXEL(asrc, asrcflags); |
| 351 | 367 | if (COMMAND & 0x00000002) |
| 352 | | srczdata = READ_ZDATA(asrc, asrcflags); |
| 368 | srczdata = READ_ZDATA(asrc, asrcflags); |
| 353 | 369 | else if (COMMAND & 0x001c020) |
| 354 | | srczdata = READ_RDATA(B_SRCZ1_H, asrc, asrcflags, asrc_phrase_mode); |
| 370 | srczdata = READ_RDATA(B_SRCZ1_H, asrc, asrcflags, asrc_phrase_mode); |
| 355 | 371 | } |
| 356 | 372 | else |
| 357 | 373 | { |
| 358 | | srcdata = READ_RDATA(B_SRCD_H, asrc, asrcflags, asrc_phrase_mode); |
| 374 | srcdata = READ_RDATA(B_SRCD_H, asrc, asrcflags, asrc_phrase_mode); |
| 359 | 375 | if (COMMAND & 0x001c020) |
| 360 | | srczdata = READ_RDATA(B_SRCZ1_H, asrc, asrcflags, asrc_phrase_mode); |
| 376 | srczdata = READ_RDATA(B_SRCZ1_H, asrc, asrcflags, asrc_phrase_mode); |
| 361 | 377 | } |
| 362 | 378 | |
| 363 | 379 | /* load dst data and Z */ |
| 364 | 380 | if (COMMAND & 0x00000008) |
| 365 | 381 | { |
| 366 | | dstdata = READ_PIXEL(adest, adestflags); |
| 382 | dstdata = READ_PIXEL(adest, adestflags); |
| 367 | 383 | if (COMMAND & 0x00000010) |
| 368 | | dstzdata = READ_ZDATA(adest, adestflags); |
| 384 | dstzdata = READ_ZDATA(adest, adestflags); |
| 369 | 385 | else |
| 370 | | dstzdata = READ_RDATA(B_DSTZ_H, adest, adestflags, adest_phrase_mode); |
| 386 | dstzdata = READ_RDATA(B_DSTZ_H, adest, adestflags, adest_phrase_mode); |
| 371 | 387 | } |
| 372 | 388 | else |
| 373 | 389 | { |
| 374 | | dstdata = READ_RDATA(B_DSTD_H, adest, adestflags, adest_phrase_mode); |
| 390 | dstdata = READ_RDATA(B_DSTD_H, adest, adestflags, adest_phrase_mode); |
| 375 | 391 | if (COMMAND & 0x00000010) |
| 376 | | dstzdata = READ_RDATA(B_DSTZ_H, adest, adestflags, adest_phrase_mode); |
| 392 | dstzdata = READ_RDATA(B_DSTZ_H, adest, adestflags, adest_phrase_mode); |
| 377 | 393 | } |
| 378 | 394 | |
| 379 | 395 | /* handle clipping */ |
| 380 | 396 | if (COMMAND & 0x00000040) |
| 381 | 397 | { |
| 382 | | if (adest_x < 0 || adest_y < 0 || |
| 383 | | (adest_x >> 16) >= (m_blitter_regs[A1_CLIP] & 0x7fff) || |
| 384 | | (adest_y >> 16) >= ((m_blitter_regs[A1_CLIP] >> 16) & 0x7fff)) |
| 398 | if (adest_x < 0 || adest_y < 0 || |
| 399 | (adest_x >> 16) >= (m_blitter_regs[A1_CLIP] & 0x7fff) || |
| 400 | (adest_y >> 16) >= ((m_blitter_regs[A1_CLIP] >> 16) & 0x7fff)) |
| 385 | 401 | inhibit = 1; |
| 386 | 402 | } |
| 387 | 403 | |
| r21049 | r21050 | |
| 398 | 414 | { |
| 399 | 415 | if (!(COMMAND & 0x02000000)) |
| 400 | 416 | { |
| 401 | | if (srcdata == READ_RDATA(B_PATD_H, asrc, asrcflags, asrc_phrase_mode)) |
| 417 | if (srcdata == READ_RDATA(B_PATD_H, asrc, asrcflags, asrc_phrase_mode)) |
| 402 | 418 | inhibit = 1; |
| 403 | 419 | } |
| 404 | 420 | else |
| 405 | 421 | { |
| 406 | | if (dstdata == READ_RDATA(B_PATD_H, adest, adestflags, adest_phrase_mode)) |
| 422 | if (dstdata == READ_RDATA(B_PATD_H, adest, adestflags, adest_phrase_mode)) |
| 407 | 423 | inhibit = 1; |
| 408 | 424 | } |
| 409 | 425 | } |
| r21049 | r21050 | |
| 413 | 429 | { |
| 414 | 430 | /* handle patterns/additive/LFU */ |
| 415 | 431 | if (COMMAND & 0x00010000) |
| 416 | | writedata = READ_RDATA(B_PATD_H, adest, adestflags, adest_phrase_mode); |
| 432 | writedata = READ_RDATA(B_PATD_H, adest, adestflags, adest_phrase_mode); |
| 417 | 433 | else if (COMMAND & 0x00020000) |
| 418 | 434 | { |
| 419 | 435 | writedata = (srcdata & 0xff) + (dstdata & 0xff); |
| r21049 | r21050 | |
| 436 | 452 | writedata |= srcdata & dstdata; |
| 437 | 453 | } |
| 438 | 454 | |
| 439 | | /* handle source shading */ |
| 440 | | if (COMMAND & 0x40000000) |
| 441 | | { |
| 442 | | int intensity = srcdata & 0x00ff; |
| 443 | | intensity += (INT8) (m_blitter_regs[B_IINC] >> 16); |
| 444 | | if (intensity < 0) |
| 445 | | intensity = 0; |
| 446 | | else if (intensity > 0xff) |
| 447 | | intensity = 0xff; |
| 448 | | writedata = (srcdata & 0xff00) | intensity; |
| 455 | /* handle source shading */ |
| 456 | if (COMMAND & 0x40000000) |
| 457 | { |
| 458 | int intensity = srcdata & 0x00ff; |
| 459 | intensity += (INT8) (m_blitter_regs[B_IINC] >> 16); |
| 460 | if (intensity < 0) |
| 461 | intensity = 0; |
| 462 | else if (intensity > 0xff) |
| 463 | intensity = 0xff; |
| 464 | writedata = (srcdata & 0xff00) | intensity; |
| 465 | } |
| 466 | |
| 467 | /* handle gouraud shading */ |
| 468 | if (COMMAND & 0x1000) |
| 469 | { |
| 470 | int p = asrc_phrase_mode ? (asrc_x & 3) : 3; |
| 471 | writedata = ((gouraud_inten[p] >> 16) & 0xff) | gouraud_color[p]; |
| 472 | |
| 473 | int intensity = gouraud_inten[p]; |
| 474 | intensity += gouraud_iinc; |
| 475 | if (intensity < 0) intensity = 0; |
| 476 | if (intensity > 0xffffff) intensity = 0xffffff; |
| 477 | gouraud_inten[p] = intensity; |
| 478 | } |
| 449 | 479 | } |
| 450 | | } |
| 451 | 480 | else |
| 452 | 481 | writedata = dstdata; |
| 453 | 482 | |
| 454 | | if (adest_phrase_mode || (command & 0x10000000) || !inhibit) |
| 455 | | { |
| 456 | | /* write to the destination */ |
| 457 | | WRITE_PIXEL(adestflags, writedata); |
| 458 | | if (COMMAND & 0x00000020) |
| 483 | if ((command & 0x10000000) || !inhibit) |
| 484 | { |
| 485 | /* write to the destination */ |
| 486 | WRITE_PIXEL(adestflags, writedata); |
| 487 | if (COMMAND & 0x00000020) |
| 459 | 488 | WRITE_ZDATA(adestflags, srczdata); |
| 460 | | } |
| 489 | } |
| 461 | 490 | |
| 462 | 491 | /* update X/Y */ |
| 463 | 492 | asrc_x = (asrc_x + asrc_xadd) & asrc_xmask; |