trunk/src/mame/video/amiga.c
| r30727 | r30728 | |
| 197 | 197 | int amiga_copper_execute_next(running_machine &machine, int xpos) |
| 198 | 198 | { |
| 199 | 199 | amiga_state *state = machine.driver_data<amiga_state>(); |
| 200 | UINT8 ypos = state->m_last_scanline & 0xff; |
| 200 | 201 | int word0, word1; |
| 201 | 202 | |
| 202 | 203 | /* bail if not enabled */ |
| r30727 | r30728 | |
| 215 | 216 | /* if we're waiting, check for a breakthrough */ |
| 216 | 217 | if (state->m_copper_waiting) |
| 217 | 218 | { |
| 218 | | int curpos = (state->m_last_scanline << 8) | (xpos >> 1); |
| 219 | int curpos = (ypos << 8) | (xpos >> 1); |
| 219 | 220 | |
| 220 | 221 | /* if we're past the wait time, stop it and hold up 2 cycles */ |
| 221 | 222 | if ((curpos & state->m_copper_waitmask) >= (state->m_copper_waitval & state->m_copper_waitmask) && |
| r30727 | r30728 | |
| 283 | 284 | state->m_copper_waitmask = 0xffff; |
| 284 | 285 | state->m_copper_waitblit = FALSE; |
| 285 | 286 | state->m_copper_waiting = TRUE; |
| 287 | |
| 286 | 288 | return 511; |
| 287 | 289 | } |
| 288 | 290 | } |
| r30727 | r30728 | |
| 290 | 292 | { |
| 291 | 293 | /* extract common wait/skip values */ |
| 292 | 294 | state->m_copper_waitval = word0 & 0xfffe; |
| 295 | |
| 296 | #if 0 |
| 297 | if (state->m_copper_waitval != 0xfffe) |
| 298 | state->m_copper_waitval = (word0 & 0x00fe) | ((((word0 >> 8) & 0xff) + 1) << 8); |
| 299 | #endif |
| 300 | |
| 293 | 301 | state->m_copper_waitmask = word1 | 0x8001; |
| 294 | 302 | state->m_copper_waitblit = (~word1 >> 15) & 1; |
| 295 | 303 | |
| r30727 | r30728 | |
| 305 | 313 | /* handle a skip */ |
| 306 | 314 | else |
| 307 | 315 | { |
| 308 | | int curpos = (state->m_last_scanline << 8) | (xpos >> 1); |
| 316 | int curpos = (ypos << 8) | (xpos >> 1); |
| 309 | 317 | |
| 310 | 318 | if (LOG_COPPER) |
| 311 | 319 | logerror(" Skipping if %04x & %04x (currently %04x)\n", state->m_copper_waitval, state->m_copper_waitmask, (state->m_last_scanline << 8) | (xpos >> 1)); |
| r30727 | r30728 | |
| 613 | 621 | } |
| 614 | 622 | |
| 615 | 623 | |
| 624 | //************************************************************************** |
| 625 | // DISPLAY WINDOW |
| 626 | //************************************************************************** |
| 616 | 627 | |
| 628 | void amiga_state::update_display_window() |
| 629 | { |
| 630 | amiga_state *state = this; |
| 631 | |
| 632 | int vstart = CUSTOM_REG(REG_DIWSTRT) >> 8; |
| 633 | int vstop = CUSTOM_REG(REG_DIWSTOP) >> 8; |
| 634 | int hstart = CUSTOM_REG(REG_DIWSTRT) & 0xff; |
| 635 | int hstop = CUSTOM_REG(REG_DIWSTOP) & 0xff; |
| 636 | |
| 637 | if (m_diwhigh_valid) |
| 638 | { |
| 639 | vstart |= (CUSTOM_REG(REG_DIWHIGH) & 7) << 8; |
| 640 | vstop |= ((CUSTOM_REG(REG_DIWHIGH) >> 8) & 7) << 8; |
| 641 | hstart |= ((CUSTOM_REG(REG_DIWHIGH) >> 5) & 1) << 8; |
| 642 | hstop |= ((CUSTOM_REG(REG_DIWHIGH) >> 13) & 1) << 8; |
| 643 | } |
| 644 | else |
| 645 | { |
| 646 | vstop |= ((~CUSTOM_REG(REG_DIWSTOP) >> 7) & 0x100); |
| 647 | hstop |= 0x100; |
| 648 | } |
| 649 | |
| 650 | if (hstop < hstart) |
| 651 | { |
| 652 | hstart = 0x00; |
| 653 | hstop = 0x1ff; |
| 654 | } |
| 655 | |
| 656 | m_diw.set(hstart, hstop, vstart, vstop); |
| 657 | } |
| 658 | |
| 659 | |
| 617 | 660 | /************************************* |
| 618 | 661 | * |
| 619 | 662 | * Single scanline rasterizer |
| r30727 | r30728 | |
| 626 | 669 | UINT16 save_color0 = CUSTOM_REG(REG_COLOR00); |
| 627 | 670 | int ddf_start_pixel = 0, ddf_stop_pixel = 0; |
| 628 | 671 | int hires = 0, dualpf = 0, ham = 0; |
| 629 | | int hstart = 0, hstop = 0; |
| 630 | | int vstart = 0, vstop = 0; |
| 631 | 672 | int pf1pri = 0, pf2pri = 0; |
| 632 | 673 | int planes = 0; |
| 633 | 674 | |
| r30727 | r30728 | |
| 723 | 764 | if ( ( CUSTOM_REG(REG_DDFSTRT) ^ CUSTOM_REG(REG_DDFSTOP) ) & 0x04 ) |
| 724 | 765 | ddf_stop_pixel += 8; |
| 725 | 766 | |
| 726 | | /* compute the horizontal start/stop */ |
| 727 | | hstart = CUSTOM_REG(REG_DIWSTRT) & 0xff; |
| 728 | | hstop = (CUSTOM_REG(REG_DIWSTOP) & 0xff); |
| 729 | | hstop |= 0x100; |
| 767 | // display window |
| 768 | update_display_window(); |
| 730 | 769 | |
| 731 | | /* compute the vertical start/stop */ |
| 732 | | vstart = CUSTOM_REG(REG_DIWSTRT) >> 8; |
| 733 | | vstop = (CUSTOM_REG(REG_DIWSTOP) >> 8); |
| 734 | | vstop |= ((~CUSTOM_REG(REG_DIWSTOP) >> 7) & 0x100); |
| 735 | | |
| 736 | 770 | /* extract playfield priorities */ |
| 737 | 771 | pf1pri = CUSTOM_REG(REG_BPLCON2) & 7; |
| 738 | 772 | pf2pri = (CUSTOM_REG(REG_BPLCON2) >> 3) & 7; |
| r30727 | r30728 | |
| 780 | 814 | /* to render, we must have bitplane DMA enabled, at least 1 plane, and be within the */ |
| 781 | 815 | /* vertical display window */ |
| 782 | 816 | if ((CUSTOM_REG(REG_DMACON) & (DMACON_BPLEN | DMACON_DMAEN)) == (DMACON_BPLEN | DMACON_DMAEN) && |
| 783 | | planes > 0 && scanline >= vstart && scanline < vstop) |
| 817 | planes > 0 && scanline >= m_diw.min_y && scanline < m_diw.max_y) |
| 784 | 818 | { |
| 785 | 819 | int pfpix0 = 0, pfpix1 = 0, collide; |
| 786 | 820 | |
| r30727 | r30728 | |
| 885 | 919 | CUSTOM_REG(REG_CLXDAT) |= 0x001; |
| 886 | 920 | |
| 887 | 921 | /* if we are within the display region, render */ |
| 888 | | if (dst != NULL && x >= hstart && x < hstop) |
| 922 | if (dst != NULL && x >= m_diw.min_x && x < m_diw.max_x) |
| 889 | 923 | { |
| 890 | 924 | int pix, pri; |
| 891 | 925 | |
| r30727 | r30728 | |
| 975 | 1009 | } |
| 976 | 1010 | |
| 977 | 1011 | // end of the line: time to add the modulos |
| 978 | | if (scanline >= vstart && scanline < vstop) |
| 1012 | if (scanline >= m_diw.min_y && scanline < m_diw.max_y) |
| 979 | 1013 | { |
| 980 | 1014 | // update odd planes |
| 981 | 1015 | for (pl = 0; pl < planes; pl += 2) |
trunk/src/mame/video/amigaaga.c
| r30727 | r30728 | |
| 399 | 399 | } |
| 400 | 400 | } |
| 401 | 401 | |
| 402 | | void amiga_aga_diwhigh_written(running_machine &machine, int written) |
| 403 | | { |
| 404 | | amiga_state *state = machine.driver_data<amiga_state>(); |
| 405 | 402 | |
| 406 | | state->m_aga_diwhigh_written = written; |
| 407 | | } |
| 408 | 403 | |
| 409 | 404 | /************************************* |
| 410 | 405 | * |
| r30727 | r30728 | |
| 449 | 444 | UINT16 save_color0 = CUSTOM_REG(REG_COLOR00); |
| 450 | 445 | int ddf_start_pixel = 0, ddf_stop_pixel = 0; |
| 451 | 446 | int hires = 0, dualpf = 0, ham = 0; |
| 452 | | int hstart = 0, hstop = 0; |
| 453 | | int vstart = 0, vstop = 0; |
| 454 | 447 | int pf1pri = 0, pf2pri = 0; |
| 455 | 448 | int planes = 0; |
| 456 | 449 | |
| r30727 | r30728 | |
| 539 | 532 | hires = CUSTOM_REG(REG_BPLCON0) & BPLCON0_HIRES; |
| 540 | 533 | ham = CUSTOM_REG(REG_BPLCON0) & BPLCON0_HOMOD; |
| 541 | 534 | dualpf = CUSTOM_REG(REG_BPLCON0) & BPLCON0_DBLPF; |
| 542 | | // lace = CUSTOM_REG(REG_BPLCON0) & BPLCON0_LACE; |
| 543 | 535 | |
| 544 | 536 | /* get default bitoffset */ |
| 545 | 537 | switch(CUSTOM_REG(REG_FMODE) & 0x3) |
| r30727 | r30728 | |
| 557 | 549 | if ( ( CUSTOM_REG(REG_DDFSTRT) ^ CUSTOM_REG(REG_DDFSTOP) ) & 0x04 ) |
| 558 | 550 | ddf_stop_pixel += 8; |
| 559 | 551 | |
| 560 | | /* compute the horizontal start/stop */ |
| 561 | | hstart = CUSTOM_REG(REG_DIWSTRT) & 0xff; |
| 562 | | hstop = (CUSTOM_REG(REG_DIWSTOP) & 0xff); |
| 552 | // display window |
| 553 | update_display_window(); |
| 563 | 554 | |
| 564 | | if (m_aga_diwhigh_written) |
| 565 | | { |
| 566 | | hstart |= ((CUSTOM_REG(REG_DIWHIGH) >> 5) & 1) << 8; |
| 567 | | hstop |= ((CUSTOM_REG(REG_DIWHIGH) >> 13) & 1) << 8; |
| 568 | | } |
| 569 | | else |
| 570 | | { |
| 571 | | hstop |= 0x100; |
| 572 | | } |
| 573 | | if ( hstop < hstart ) |
| 574 | | { |
| 575 | | hstart = 0x00; |
| 576 | | hstop = 0x1ff; |
| 577 | | } |
| 578 | | |
| 579 | | /* compute the vertical start/stop */ |
| 580 | | vstart = CUSTOM_REG(REG_DIWSTRT) >> 8; |
| 581 | | vstop = (CUSTOM_REG(REG_DIWSTOP) >> 8); |
| 582 | | if (m_aga_diwhigh_written) |
| 583 | | { |
| 584 | | vstart |= (CUSTOM_REG(REG_DIWHIGH) & 7) << 8; |
| 585 | | vstop |= ((CUSTOM_REG(REG_DIWHIGH) >> 8) & 7) << 8; |
| 586 | | } |
| 587 | | else |
| 588 | | { |
| 589 | | vstop |= ((~CUSTOM_REG(REG_DIWSTOP) >> 7) & 0x100); |
| 590 | | } |
| 591 | | |
| 592 | 555 | /* extract playfield priorities */ |
| 593 | 556 | pf1pri = CUSTOM_REG(REG_BPLCON2) & 7; |
| 594 | 557 | pf2pri = (CUSTOM_REG(REG_BPLCON2) >> 3) & 7; |
| r30727 | r30728 | |
| 636 | 599 | /* to render, we must have bitplane DMA enabled, at least 1 plane, and be within the */ |
| 637 | 600 | /* vertical display window */ |
| 638 | 601 | if ((CUSTOM_REG(REG_DMACON) & (DMACON_BPLEN | DMACON_DMAEN)) == (DMACON_BPLEN | DMACON_DMAEN) && |
| 639 | | planes > 0 && scanline >= vstart && scanline < vstop) |
| 602 | planes > 0 && scanline >= m_diw.min_y && scanline < m_diw.max_y) |
| 640 | 603 | { |
| 641 | 604 | int pfpix0 = 0, pfpix1 = 0, collide; |
| 642 | 605 | |
| r30727 | r30728 | |
| 741 | 704 | CUSTOM_REG(REG_CLXDAT) |= 0x001; |
| 742 | 705 | |
| 743 | 706 | /* if we are within the display region, render */ |
| 744 | | if (dst != NULL && x >= hstart && x < hstop) |
| 707 | if (dst != NULL && x >= m_diw.min_x && x < m_diw.max_x) |
| 745 | 708 | { |
| 746 | 709 | int pix, pri; |
| 747 | 710 | |
| r30727 | r30728 | |
| 854 | 817 | #endif |
| 855 | 818 | |
| 856 | 819 | /* end of the line: time to add the modulos */ |
| 857 | | if (scanline >= vstart && scanline < vstop) |
| 820 | if (scanline >= m_diw.min_y && scanline < m_diw.max_y) |
| 858 | 821 | { |
| 859 | 822 | /* update odd planes */ |
| 860 | 823 | for (pl = 0; pl < planes; pl += 2) |