src/mess/video/thomson.c
| r1924 | r1925 | |
| 8 | 8 | |
| 9 | 9 | #include <math.h> |
| 10 | 10 | #include "driver.h" |
| 11 | | #include "deprecat.h" |
| 12 | 11 | #include "includes/thomson.h" |
| 13 | 12 | #include "cpu/m6809/m6809.h" |
| 14 | 13 | #include "machine/6821pia.h" |
| r1924 | r1925 | |
| 55 | 54 | |
| 56 | 55 | |
| 57 | 56 | |
| 58 | | static int thom_update_screen_size( void ) |
| 57 | static int thom_update_screen_size( running_machine *machine ) |
| 59 | 58 | { |
| 60 | 59 | UINT8 p = readinputport( THOM_INPUT_VCONFIG ); |
| 61 | 60 | int new_w, new_h, changed = 0; |
| r1924 | r1925 | |
| 76 | 75 | |
| 77 | 76 | new_w = ( 320 + thom_bwidth * 2 ) * ( thom_hires + 1 ) - 1; |
| 78 | 77 | new_h = ( 200 + thom_bheight * 2 ) /** (thom_hires + 1 )*/ - 1; |
| 79 | | if ( ( Machine->screen[0].visarea.max_x != new_w ) || ( Machine->screen[0].visarea.max_y != new_h ) ) |
| 78 | if ( ( machine->screen[0].visarea.max_x != new_w ) || ( machine->screen[0].visarea.max_y != new_h ) ) |
| 80 | 79 | { |
| 81 | 80 | changed = 1; |
| 82 | 81 | video_screen_set_visarea( 0, 0, new_w, 0, new_h ); |
| r1924 | r1925 | |
| 415 | 414 | |
| 416 | 415 | |
| 417 | 416 | |
| 418 | | typedef void ( *thom_scandraw ) ( UINT8* vram, UINT16* dst, UINT16* pal, |
| 417 | typedef void ( *thom_scandraw ) ( running_machine *machine, UINT8* vram, UINT16* dst, UINT16* pal, |
| 419 | 418 | int org, int len ); |
| 420 | 419 | |
| 421 | 420 | |
| 422 | 421 | |
| 423 | 422 | #define UPDATE( name, res ) \ |
| 424 | | static void name##_scandraw_##res ( UINT8* vram, UINT16* dst, UINT16* pal, \ |
| 423 | static void name##_scandraw_##res ( running_machine *machine, UINT8* vram, UINT16* dst, UINT16* pal, \ |
| 425 | 424 | int org, int len ) \ |
| 426 | 425 | { \ |
| 427 | 426 | unsigned gpl; \ |
| r1924 | r1925 | |
| 445 | 444 | { |
| 446 | 445 | int i; |
| 447 | 446 | pen_t c[2]; |
| 448 | | c[0] = Machine->pens[ pal[ ((ramb & 7) | ((ramb>>4) & 8)) ^ 8 ] ]; |
| 449 | | c[1] = Machine->pens[ pal[ ((ramb >> 3) & 15) ^ 8 ] ]; |
| 447 | c[0] = machine->pens[ pal[ ((ramb & 7) | ((ramb>>4) & 8)) ^ 8 ] ]; |
| 448 | c[1] = machine->pens[ pal[ ((ramb >> 3) & 15) ^ 8 ] ]; |
| 450 | 449 | for ( i = 0; i < 16; i += 2, rama >>= 1 ) |
| 451 | 450 | dst[ 15 - i ] = dst[ 14 - i ] = c[ rama & 1 ]; |
| 452 | 451 | } |
| r1924 | r1925 | |
| 456 | 455 | { |
| 457 | 456 | int i; |
| 458 | 457 | pen_t c[2]; |
| 459 | | c[0] = Machine->pens[ pal[ ((ramb & 7) | ((ramb>>4) & 8)) ^ 8 ] ]; |
| 460 | | c[1] = Machine->pens[ pal[ ((ramb >> 3) & 15) ^ 8 ] ]; |
| 458 | c[0] = machine->pens[ pal[ ((ramb & 7) | ((ramb>>4) & 8)) ^ 8 ] ]; |
| 459 | c[1] = machine->pens[ pal[ ((ramb >> 3) & 15) ^ 8 ] ]; |
| 461 | 460 | for ( i = 0; i < 8; i++, rama >>= 1 ) |
| 462 | 461 | dst[ 7 - i ] = c[ rama & 1 ]; |
| 463 | 462 | } |
| r1924 | r1925 | |
| 471 | 470 | { |
| 472 | 471 | int i; |
| 473 | 472 | pen_t c[2]; |
| 474 | | c[0] = Machine->pens[ pal[ ramb & 15 ] ]; |
| 475 | | c[1] = Machine->pens[ pal[ ramb >> 4 ] ]; |
| 473 | c[0] = machine->pens[ pal[ ramb & 15 ] ]; |
| 474 | c[1] = machine->pens[ pal[ ramb >> 4 ] ]; |
| 476 | 475 | for ( i = 0; i < 16; i += 2, rama >>= 1 ) |
| 477 | 476 | dst[ 15 - i ] = dst[ 14 - i ] = c[ rama & 1 ]; |
| 478 | 477 | } |
| r1924 | r1925 | |
| 482 | 481 | { |
| 483 | 482 | int i; |
| 484 | 483 | pen_t c[2]; |
| 485 | | c[0] = Machine->pens[ pal[ ramb & 15 ] ]; |
| 486 | | c[1] = Machine->pens[ pal[ ramb >> 4 ] ]; |
| 484 | c[0] = machine->pens[ pal[ ramb & 15 ] ]; |
| 485 | c[1] = machine->pens[ pal[ ramb >> 4 ] ]; |
| 487 | 486 | for ( i = 0; i < 8; i++, rama >>= 1 ) |
| 488 | 487 | dst[ 7 - i ] = c[ rama & 1 ]; |
| 489 | 488 | } |
| r1924 | r1925 | |
| 497 | 496 | { |
| 498 | 497 | int i; |
| 499 | 498 | pen_t c[2]; |
| 500 | | c[0] = Machine->pens[ pal[ (ramb & 7) | ((ramb>>4) & 8) ] ]; |
| 501 | | c[1] = Machine->pens[ pal[ (ramb >> 3) & 15 ] ]; |
| 499 | c[0] = machine->pens[ pal[ (ramb & 7) | ((ramb>>4) & 8) ] ]; |
| 500 | c[1] = machine->pens[ pal[ (ramb >> 3) & 15 ] ]; |
| 502 | 501 | for ( i = 0; i < 16; i += 2, rama >>= 1 ) |
| 503 | 502 | dst[ 15 - i ] = dst[ 14 - i ] = c[ rama & 1 ]; |
| 504 | 503 | } |
| r1924 | r1925 | |
| 508 | 507 | { |
| 509 | 508 | int i; |
| 510 | 509 | pen_t c[2]; |
| 511 | | c[0] = Machine->pens[ pal[ (ramb & 7) | ((ramb>>4) & 8) ] ]; |
| 512 | | c[1] = Machine->pens[ pal[ (ramb >> 3) & 15 ] ]; |
| 510 | c[0] = machine->pens[ pal[ (ramb & 7) | ((ramb>>4) & 8) ] ]; |
| 511 | c[1] = machine->pens[ pal[ (ramb >> 3) & 15 ] ]; |
| 513 | 512 | for ( i = 0; i < 8; i++, rama >>= 1 ) |
| 514 | 513 | dst[ 7 - i ] = c[ rama & 1 ]; |
| 515 | 514 | } |
| r1924 | r1925 | |
| 523 | 522 | { |
| 524 | 523 | int i; |
| 525 | 524 | pen_t c[2][2]; |
| 526 | | c[0][0] = Machine->pens[ pal[ 0 ] ]; |
| 527 | | c[0][1] = Machine->pens[ pal[ 1 ] ]; |
| 528 | | c[1][0] = Machine->pens[ pal[ 2 ] ]; |
| 529 | | c[1][1] = Machine->pens[ pal[ 3 ] ]; |
| 525 | c[0][0] = machine->pens[ pal[ 0 ] ]; |
| 526 | c[0][1] = machine->pens[ pal[ 1 ] ]; |
| 527 | c[1][0] = machine->pens[ pal[ 2 ] ]; |
| 528 | c[1][1] = machine->pens[ pal[ 3 ] ]; |
| 530 | 529 | for ( i = 0; i < 16; i += 2, rama >>= 1, ramb >>= 1 ) |
| 531 | 530 | dst[ 15 - i ] = dst[ 14 - i ] = c[ rama & 1 ] [ ramb & 1 ]; |
| 532 | 531 | } |
| r1924 | r1925 | |
| 536 | 535 | { |
| 537 | 536 | int i; |
| 538 | 537 | pen_t c[2][2]; |
| 539 | | c[0][0] = Machine->pens[ pal[ 0 ] ]; |
| 540 | | c[0][1] = Machine->pens[ pal[ 1 ] ]; |
| 541 | | c[1][0] = Machine->pens[ pal[ 2 ] ]; |
| 542 | | c[1][1] = Machine->pens[ pal[ 3 ] ]; |
| 538 | c[0][0] = machine->pens[ pal[ 0 ] ]; |
| 539 | c[0][1] = machine->pens[ pal[ 1 ] ]; |
| 540 | c[1][0] = machine->pens[ pal[ 2 ] ]; |
| 541 | c[1][1] = machine->pens[ pal[ 3 ] ]; |
| 543 | 542 | for ( i = 0; i < 8; i++, rama >>= 1, ramb >>= 1 ) |
| 544 | 543 | dst[ 7 - i ] = c[ rama & 1 ] [ ramb & 1 ]; |
| 545 | 544 | } |
| r1924 | r1925 | |
| 553 | 552 | { |
| 554 | 553 | int i; |
| 555 | 554 | pen_t c[4]; |
| 556 | | c[0] = Machine->pens[ pal[ 0 ] ]; |
| 557 | | c[1] = Machine->pens[ pal[ 1 ] ]; |
| 558 | | c[2] = Machine->pens[ pal[ 2 ] ]; |
| 559 | | c[3] = Machine->pens[ pal[ 3 ] ]; |
| 555 | c[0] = machine->pens[ pal[ 0 ] ]; |
| 556 | c[1] = machine->pens[ pal[ 1 ] ]; |
| 557 | c[2] = machine->pens[ pal[ 2 ] ]; |
| 558 | c[3] = machine->pens[ pal[ 3 ] ]; |
| 560 | 559 | for ( i = 0; i < 8; i += 2, ramb >>= 2 ) |
| 561 | 560 | dst[ 15 - i ] = dst[ 14 - i ] = c[ ramb & 3 ]; |
| 562 | 561 | for ( i = 0; i < 8; i += 2, rama >>= 2 ) |
| r1924 | r1925 | |
| 568 | 567 | { |
| 569 | 568 | int i; |
| 570 | 569 | pen_t c[4]; |
| 571 | | c[0] = Machine->pens[ pal[ 0 ] ]; |
| 572 | | c[1] = Machine->pens[ pal[ 1 ] ]; |
| 573 | | c[2] = Machine->pens[ pal[ 2 ] ]; |
| 574 | | c[3] = Machine->pens[ pal[ 3 ] ]; |
| 570 | c[0] = machine->pens[ pal[ 0 ] ]; |
| 571 | c[1] = machine->pens[ pal[ 1 ] ]; |
| 572 | c[2] = machine->pens[ pal[ 2 ] ]; |
| 573 | c[3] = machine->pens[ pal[ 3 ] ]; |
| 575 | 574 | for ( i = 0; i < 4; i++, ramb >>= 2 ) |
| 576 | 575 | dst[ 7 - i ] = c[ ramb & 3 ]; |
| 577 | 576 | for ( i = 0; i < 4; i++, rama >>= 2 ) |
| r1924 | r1925 | |
| 585 | 584 | |
| 586 | 585 | UPDATE_HI( bitmap16 ) |
| 587 | 586 | { |
| 588 | | dst[ 0] = dst[ 1] = dst[ 2] = dst[ 3] = Machine->pens[ pal[ rama >> 4 ] ]; |
| 589 | | dst[ 4] = dst[ 5] = dst[ 6] = dst[ 7] = Machine->pens[ pal[ rama & 15 ] ]; |
| 590 | | dst[ 8] = dst[ 9] = dst[10] = dst[11] = Machine->pens[ pal[ ramb >> 4 ] ]; |
| 591 | | dst[12] = dst[13] = dst[14] = dst[15] = Machine->pens[ pal[ ramb & 15 ] ]; |
| 587 | dst[ 0] = dst[ 1] = dst[ 2] = dst[ 3] = machine->pens[ pal[ rama >> 4 ] ]; |
| 588 | dst[ 4] = dst[ 5] = dst[ 6] = dst[ 7] = machine->pens[ pal[ rama & 15 ] ]; |
| 589 | dst[ 8] = dst[ 9] = dst[10] = dst[11] = machine->pens[ pal[ ramb >> 4 ] ]; |
| 590 | dst[12] = dst[13] = dst[14] = dst[15] = machine->pens[ pal[ ramb & 15 ] ]; |
| 592 | 591 | } |
| 593 | 592 | END_UPDATE |
| 594 | 593 | |
| 595 | 594 | UPDATE_LOW( bitmap16 ) |
| 596 | 595 | { |
| 597 | | dst[0] = dst[1] = Machine->pens[ pal[ rama >> 4 ] ]; |
| 598 | | dst[2] = dst[3] = Machine->pens[ pal[ rama & 15 ] ]; |
| 599 | | dst[4] = dst[5] = Machine->pens[ pal[ ramb >> 4 ] ]; |
| 600 | | dst[6] = dst[7] = Machine->pens[ pal[ ramb & 15 ] ]; |
| 596 | dst[0] = dst[1] = machine->pens[ pal[ rama >> 4 ] ]; |
| 597 | dst[2] = dst[3] = machine->pens[ pal[ rama & 15 ] ]; |
| 598 | dst[4] = dst[5] = machine->pens[ pal[ ramb >> 4 ] ]; |
| 599 | dst[6] = dst[7] = machine->pens[ pal[ ramb & 15 ] ]; |
| 601 | 600 | } |
| 602 | 601 | END_UPDATE |
| 603 | 602 | |
| r1924 | r1925 | |
| 609 | 608 | { |
| 610 | 609 | int i; |
| 611 | 610 | pen_t c[2]; |
| 612 | | c[0] = Machine->pens[ pal[ 0 ] ]; |
| 613 | | c[1] = Machine->pens[ pal[ 1 ] ]; |
| 611 | c[0] = machine->pens[ pal[ 0 ] ]; |
| 612 | c[1] = machine->pens[ pal[ 1 ] ]; |
| 614 | 613 | for ( i = 0; i < 8; i++, ramb >>= 1 ) |
| 615 | 614 | dst[ 15 - i ] = c[ ramb & 1 ]; |
| 616 | 615 | for ( i = 0; i < 8; i++, rama >>= 1 ) |
| r1924 | r1925 | |
| 623 | 622 | /* 640-pixel mode but 320 pixels emulated => we merge pixels */ |
| 624 | 623 | int i; |
| 625 | 624 | pen_t c[4]; |
| 626 | | c[0] = Machine->pens[ pal[ 0 ] ]; |
| 627 | | c[1] = c[2] = c[3] = Machine->pens[ pal[ 1 ] ]; |
| 625 | c[0] = machine->pens[ pal[ 0 ] ]; |
| 626 | c[1] = c[2] = c[3] = machine->pens[ pal[ 1 ] ]; |
| 628 | 627 | for ( i = 0; i < 4; i++, ramb >>= 2 ) |
| 629 | 628 | dst[ 7 - i ] = c[ ramb & 3 ]; |
| 630 | 629 | for ( i = 0; i < 4; i++, rama >>= 2 ) |
| r1924 | r1925 | |
| 640 | 639 | { |
| 641 | 640 | int i; |
| 642 | 641 | pen_t c[2]; |
| 643 | | c[0] = Machine->pens[ pal[ 0 ] ]; |
| 644 | | c[1] = Machine->pens[ pal[ 6 ] ]; |
| 642 | c[0] = machine->pens[ pal[ 0 ] ]; |
| 643 | c[1] = machine->pens[ pal[ 6 ] ]; |
| 645 | 644 | for ( i = 0; i < 8; i++, ramb >>= 1 ) |
| 646 | 645 | dst[ 15 - i ] = c[ ramb & 1 ]; |
| 647 | 646 | for ( i = 0; i < 8; i++, rama >>= 1 ) |
| r1924 | r1925 | |
| 653 | 652 | { |
| 654 | 653 | int i; |
| 655 | 654 | pen_t c[4]; |
| 656 | | c[0] = Machine->pens[ pal[ 0 ] ]; |
| 657 | | c[1] = c[2] = c[3] = Machine->pens[ pal[ 6 ] ]; |
| 655 | c[0] = machine->pens[ pal[ 0 ] ]; |
| 656 | c[1] = c[2] = c[3] = machine->pens[ pal[ 6 ] ]; |
| 658 | 657 | for ( i = 0; i < 4; i++, ramb >>= 2 ) |
| 659 | 658 | dst[ 7 - i ] = c[ ramb & 3 ]; |
| 660 | 659 | for ( i = 0; i < 4; i++, rama >>= 2 ) |
| r1924 | r1925 | |
| 670 | 669 | { |
| 671 | 670 | int i; |
| 672 | 671 | pen_t c[2]; |
| 673 | | c[0] = Machine->pens[ pal[ 0 ] ]; |
| 674 | | c[1] = Machine->pens[ pal[ 1 ] ]; |
| 672 | c[0] = machine->pens[ pal[ 0 ] ]; |
| 673 | c[1] = machine->pens[ pal[ 1 ] ]; |
| 675 | 674 | for ( i = 0; i < 16; i += 2, rama >>= 1 ) |
| 676 | 675 | dst[ 15 - i ] = dst[ 14 - i ] = c[ rama & 1 ]; |
| 677 | 676 | (void)ramb; |
| r1924 | r1925 | |
| 682 | 681 | { |
| 683 | 682 | int i; |
| 684 | 683 | pen_t c[2]; |
| 685 | | c[0] = Machine->pens[ pal[ 0 ] ]; |
| 686 | | c[1] = Machine->pens[ pal[ 1 ] ]; |
| 684 | c[0] = machine->pens[ pal[ 0 ] ]; |
| 685 | c[1] = machine->pens[ pal[ 1 ] ]; |
| 687 | 686 | for ( i = 0; i < 8; i++, rama >>= 1 ) |
| 688 | 687 | dst[ 7 - i ] = c[ rama & 1 ]; |
| 689 | 688 | (void)ramb; |
| r1924 | r1925 | |
| 694 | 693 | { |
| 695 | 694 | int i; |
| 696 | 695 | pen_t c[2]; |
| 697 | | c[0] = Machine->pens[ pal[ 0 ] ]; |
| 698 | | c[1] = Machine->pens[ pal[ 2 ] ]; |
| 696 | c[0] = machine->pens[ pal[ 0 ] ]; |
| 697 | c[1] = machine->pens[ pal[ 2 ] ]; |
| 699 | 698 | for ( i = 0; i < 16; i += 2, ramb >>= 1 ) |
| 700 | 699 | dst[ 15 - i ] = dst[ 14 - i ] = c[ ramb & 1 ]; |
| 701 | 700 | (void)rama; |
| r1924 | r1925 | |
| 706 | 705 | { |
| 707 | 706 | int i; |
| 708 | 707 | pen_t c[2]; |
| 709 | | c[0] = Machine->pens[ pal[ 0 ] ]; |
| 710 | | c[1] = Machine->pens[ pal[ 2 ] ]; |
| 708 | c[0] = machine->pens[ pal[ 0 ] ]; |
| 709 | c[1] = machine->pens[ pal[ 2 ] ]; |
| 711 | 710 | for ( i = 0; i < 8; i++, ramb >>= 1 ) |
| 712 | 711 | dst[ 7 - i ] = c[ ramb & 1 ]; |
| 713 | 712 | (void)rama; |
| r1924 | r1925 | |
| 722 | 721 | { |
| 723 | 722 | int i; |
| 724 | 723 | pen_t c[2][2]; |
| 725 | | c[0][0] = Machine->pens[ pal[ 0 ] ]; |
| 726 | | c[0][1] = c[1][1] = Machine->pens[ pal[ 1 ] ]; |
| 727 | | c[1][0] = Machine->pens[ pal[ 2 ] ]; |
| 724 | c[0][0] = machine->pens[ pal[ 0 ] ]; |
| 725 | c[0][1] = c[1][1] = machine->pens[ pal[ 1 ] ]; |
| 726 | c[1][0] = machine->pens[ pal[ 2 ] ]; |
| 728 | 727 | for ( i = 0; i < 16; i += 2, rama >>= 1, ramb >>= 1 ) |
| 729 | 728 | dst[ 15 - i ] = dst[ 14 - i ] = c[ ramb & 1 ] [ rama & 1 ]; |
| 730 | 729 | } |
| r1924 | r1925 | |
| 734 | 733 | { |
| 735 | 734 | int i; |
| 736 | 735 | pen_t c[2][2]; |
| 737 | | c[0][0] = Machine->pens[ pal[ 0 ] ]; |
| 738 | | c[0][1] = c[1][1] = Machine->pens[ pal[ 1 ] ]; |
| 739 | | c[1][0] = Machine->pens[ pal[ 2 ] ]; |
| 736 | c[0][0] = machine->pens[ pal[ 0 ] ]; |
| 737 | c[0][1] = c[1][1] = machine->pens[ pal[ 1 ] ]; |
| 738 | c[1][0] = machine->pens[ pal[ 2 ] ]; |
| 740 | 739 | for ( i = 0; i < 8; i++, rama >>= 1, ramb >>= 1 ) |
| 741 | 740 | dst[ 7 - i ] = c[ ramb & 1 ] [ rama & 1 ]; |
| 742 | 741 | } |
| r1924 | r1925 | |
| 754 | 753 | int i; |
| 755 | 754 | for ( i = 0; i < 16; i += 4, rama >>= 1, ramb >>= 1 ) |
| 756 | 755 | dst[ 15 - i ] = dst[ 14 - i ] = dst[ 13 - i ] = dst[ 12 - i ] = |
| 757 | | Machine->pens[ pal[ p[ ramb & 1 ] [ (ramb >> 4) & 1 ] |
| 756 | machine->pens[ pal[ p[ ramb & 1 ] [ (ramb >> 4) & 1 ] |
| 758 | 757 | [ rama & 1 ] [ (rama >> 4) & 1 ] ] ]; |
| 759 | 758 | } |
| 760 | 759 | END_UPDATE |
| r1924 | r1925 | |
| 767 | 766 | int i; |
| 768 | 767 | for ( i = 0; i < 8; i += 2, rama >>= 1, ramb >>= 1 ) |
| 769 | 768 | dst[ 7 - i ] = dst[ 6 - i ] = |
| 770 | | Machine->pens[ pal[ p[ ramb & 1 ] [ (ramb >> 4) & 1 ] |
| 769 | machine->pens[ pal[ p[ ramb & 1 ] [ (ramb >> 4) & 1 ] |
| 771 | 770 | [ rama & 1 ] [ (rama >> 4) & 1 ] ] ]; |
| 772 | 771 | } |
| 773 | 772 | END_UPDATE |
| r1924 | r1925 | |
| 809 | 808 | xx++; |
| 810 | 809 | } while ( xx < 40 && thom_vmodepage[xx] == -1 ); |
| 811 | 810 | thom_scandraw_funcs[ mode ][ thom_hires ] |
| 812 | | ( thom_vram + y * 40 + page * 0x4000, |
| 811 | ( machine, thom_vram + y * 40 + page * 0x4000, |
| 813 | 812 | thom_vbody + y * 320 * (thom_hires+1), |
| 814 | 813 | thom_last_pal, x, xx-x ); |
| 815 | 814 | x = xx; |
| r1924 | r1925 | |
| 1079 | 1078 | timer_adjust_oneshot(thom_video_timer, attotime_zero, 0); |
| 1080 | 1079 | |
| 1081 | 1080 | /* update screen size according to user options */ |
| 1082 | | if ( thom_update_screen_size() ) |
| 1081 | if ( thom_update_screen_size( machine ) ) |
| 1083 | 1082 | thom_vstate_dirty = 1; |
| 1084 | 1083 | |
| 1085 | 1084 | /* hi-res automatic */ |