trunk/src/emu/bus/isa/trident.c
| r32164 | r32165 | |
| 57 | 57 | tri.dac_active = false; |
| 58 | 58 | tri.linear_active = false; |
| 59 | 59 | tri.mmio_active = false; |
| 60 | tri.sr0f = 0x6f; |
| 61 | tri.sr0c = 0x78; |
| 62 | tri.port_3c3 = true; |
| 63 | tri.accel_busy = false; |
| 60 | 64 | } |
| 61 | 65 | |
| 62 | 66 | UINT16 trident_vga_device::offset() |
| r32164 | r32165 | |
| 141 | 145 | res = tri.sr0c & 0xef; |
| 142 | 146 | if(tri.port_3c3) |
| 143 | 147 | res |= 0x10; |
| 148 | break; |
| 144 | 149 | case 0x0d: // Mode Control 2 |
| 145 | 150 | //res = svga.rgb15_en; |
| 146 | 151 | if(tri.new_mode) |
| r32164 | r32165 | |
| 281 | 286 | break; |
| 282 | 287 | case 0x1f: |
| 283 | 288 | tri.cr1f = data; // "Software Programming Register" written to by software (BIOS?) |
| 284 | | debugger_break(machine()); |
| 285 | 289 | break; |
| 286 | 290 | case 0x21: // Linear aperture |
| 287 | 291 | tri.cr21 = data; |
| r32164 | r32165 | |
| 585 | 589 | vga_device::mem_w(space,offset,data,mem_mask); |
| 586 | 590 | } |
| 587 | 591 | |
| 592 | // 2D Acceleration functions (very WIP) |
| 593 | |
| 594 | // From XFree86 source: |
| 595 | /* |
| 596 | Graphics Engine for 9440/9660/9680 |
| 597 | |
| 598 | #define GER_STATUS 0x2120 |
| 599 | #define GE_BUSY 0x80 |
| 600 | #define GER_OPERMODE 0x2122 Byte for 9440, Word for 96xx |
| 601 | #define DST_ENABLE 0x200 // Destination Transparency |
| 602 | #define GER_COMMAND 0x2124 |
| 603 | #define GE_NOP 0x00 // No Operation |
| 604 | #define GE_BLT 0x01 // BitBLT ROP3 only |
| 605 | #define GE_BLT_ROP4 0x02 // BitBLT ROP4 (96xx only) |
| 606 | #define GE_SCANLINE 0x03 // Scan Line |
| 607 | #define GE_BRESLINE 0x04 // Bresenham Line |
| 608 | #define GE_SHVECTOR 0x05 // Short Vector |
| 609 | #define GE_FASTLINE 0x06 // Fast Line (96xx only) |
| 610 | #define GE_TRAPEZ 0x07 // Trapezoidal fill (96xx only) |
| 611 | #define GE_ELLIPSE 0x08 // Ellipse (96xx only) (RES) |
| 612 | #define GE_ELLIP_FILL 0x09 // Ellipse Fill (96xx only) (RES) |
| 613 | #define GER_FMIX 0x2127 |
| 614 | #define GER_DRAWFLAG 0x2128 // long |
| 615 | #define FASTMODE 1<<28 |
| 616 | #define STENCIL 0x8000 |
| 617 | #define SOLIDFILL 0x4000 |
| 618 | #define TRANS_ENABLE 0x1000 |
| 619 | #define TRANS_REVERSE 0x2000 |
| 620 | #define YMAJ 0x0400 |
| 621 | #define XNEG 0x0200 |
| 622 | #define YNEG 0x0100 |
| 623 | #define SRCMONO 0x0040 |
| 624 | #define PATMONO 0x0020 |
| 625 | #define SCR2SCR 0x0004 |
| 626 | #define PAT2SCR 0x0002 |
| 627 | #define GER_FCOLOUR 0x212C // Word for 9440, long for 96xx |
| 628 | #define GER_BCOLOUR 0x2130 // Word for 9440, long for 96xx |
| 629 | #define GER_PATLOC 0x2134 // Word |
| 630 | #define GER_DEST_XY 0x2138 |
| 631 | #define GER_DEST_X 0x2138 // Word |
| 632 | #define GER_DEST_Y 0x213A // Word |
| 633 | #define GER_SRC_XY 0x213C |
| 634 | #define GER_SRC_X 0x213C // Word |
| 635 | #define GER_SRC_Y 0x213E // Word |
| 636 | #define GER_DIM_XY 0x2140 |
| 637 | #define GER_DIM_X 0x2140 // Word |
| 638 | #define GER_DIM_Y 0x2142 // Word |
| 639 | #define GER_STYLE 0x2144 // Long |
| 640 | #define GER_CKEY 0x2168 // Long |
| 641 | #define GER_FPATCOL 0x2178 |
| 642 | #define GER_BPATCOL 0x217C |
| 643 | #define GER_PATTERN 0x2180 // from 0x2180 to 0x21FF |
| 644 | |
| 645 | Additional - Graphics Engine for 96xx |
| 646 | #define GER_SRCCLIP_XY 0x2148 |
| 647 | #define GER_SRCCLIP_X 0x2148 // Word |
| 648 | #define GER_SRCCLIP_Y 0x214A // Word |
| 649 | #define GER_DSTCLIP_XY 0x214C |
| 650 | #define GER_DSTCLIP_X 0x214C // Word |
| 651 | #define GER_DSTCLIP_Y 0x214E // Word |
| 652 | */ |
| 653 | |
| 654 | READ8_MEMBER(trident_vga_device::accel_r) |
| 655 | { |
| 656 | UINT8 res = 0xff; |
| 657 | |
| 658 | if(offset >= 0x60) |
| 659 | return tri.accel_pattern[(offset-0x60) % 0x80]; |
| 660 | |
| 661 | switch(offset) |
| 662 | { |
| 663 | case 0x00: // Status |
| 664 | if(tri.accel_busy) |
| 665 | res = 0x80; |
| 666 | else |
| 667 | res = 0x00; |
| 668 | break; |
| 669 | case 0x02: // Operation Mode |
| 670 | res = tri.accel_opermode & 0x00ff; |
| 671 | break; |
| 672 | case 0x03: |
| 673 | res = (tri.accel_opermode & 0xff00) >> 8; |
| 674 | break; |
| 675 | case 0x04: // Command register |
| 676 | res = tri.accel_command; |
| 677 | break; |
| 678 | case 0x07: // Foreground Mix? |
| 679 | res = tri.accel_fmix; |
| 680 | break; |
| 681 | default: |
| 682 | logerror("Trident: unimplemented acceleration register offset %02x read\n",offset); |
| 683 | } |
| 684 | return res; |
| 685 | } |
| 686 | |
| 687 | WRITE8_MEMBER(trident_vga_device::accel_w) |
| 688 | { |
| 689 | if(offset >= 0x60) |
| 690 | { |
| 691 | tri.accel_pattern[(offset-0x60) % 0x80] = data; |
| 692 | return; |
| 693 | } |
| 694 | |
| 695 | switch(offset) |
| 696 | { |
| 697 | case 0x02: // Operation Mode |
| 698 | tri.accel_opermode = (tri.accel_opermode & 0xff00) | data; |
| 699 | logerror("Trident: Operation Mode set to %04x\n",tri.accel_opermode); |
| 700 | break; |
| 701 | case 0x03: |
| 702 | tri.accel_opermode = (tri.accel_opermode & 0x00ff) | (data << 8); |
| 703 | logerror("Trident: Operation Mode set to %04x\n",tri.accel_opermode); |
| 704 | break; |
| 705 | case 0x04: // Command register |
| 706 | tri.accel_command = data; |
| 707 | switch(data) |
| 708 | { |
| 709 | case 0x00: |
| 710 | logerror("Trident: Command: NOP\n"); |
| 711 | break; |
| 712 | case 0x01: |
| 713 | logerror("Trident: Command: BitBLT ROP3\n"); |
| 714 | break; |
| 715 | case 0x02: |
| 716 | logerror("Trident: Command: BitBLT ROP4\n"); |
| 717 | break; |
| 718 | case 0x03: |
| 719 | logerror("Trident: Command: Scanline\n"); |
| 720 | break; |
| 721 | case 0x04: |
| 722 | logerror("Trident: Command: Bresenham Line\n"); |
| 723 | break; |
| 724 | case 0x05: |
| 725 | logerror("Trident: Command: Short Vector\n"); |
| 726 | break; |
| 727 | case 0x06: |
| 728 | logerror("Trident: Command: Fast Line\n"); |
| 729 | break; |
| 730 | case 0x07: |
| 731 | logerror("Trident: Command: Trapezoid Fill\n"); |
| 732 | break; |
| 733 | case 0x08: |
| 734 | logerror("Trident: Command: Ellipse\n"); |
| 735 | break; |
| 736 | case 0x09: |
| 737 | logerror("Trident: Command: Ellipse Fill\n"); |
| 738 | break; |
| 739 | default: |
| 740 | logerror("Trident: Unknown acceleration command %02x\n",data); |
| 741 | } |
| 742 | break; |
| 743 | case 0x07: // Foreground Mix? |
| 744 | tri.accel_fmix = data; |
| 745 | logerror("Trident: FMIX set to %02x\n",data); |
| 746 | break; |
| 747 | case 0x08: // Draw flags |
| 748 | tri.accel_drawflags = (tri.accel_drawflags & 0xffffff00) | data; |
| 749 | logerror("Trident: Draw flags set to %08x\n",tri.accel_drawflags); |
| 750 | break; |
| 751 | case 0x09: |
| 752 | tri.accel_drawflags = (tri.accel_drawflags & 0xffff00ff) | (data << 8); |
| 753 | logerror("Trident: Draw flags set to %08x\n",tri.accel_drawflags); |
| 754 | break; |
| 755 | case 0x0a: |
| 756 | tri.accel_drawflags = (tri.accel_drawflags & 0xff00ffff) | (data << 16); |
| 757 | logerror("Trident: Draw flags set to %08x\n",tri.accel_drawflags); |
| 758 | break; |
| 759 | case 0x0b: |
| 760 | tri.accel_drawflags = (tri.accel_drawflags & 0x00ffffff) | (data << 24); |
| 761 | logerror("Trident: Draw flags set to %08x\n",tri.accel_drawflags); |
| 762 | break; |
| 763 | case 0x0c: // Foreground Colour |
| 764 | tri.accel_fgcolour = (tri.accel_fgcolour & 0xffffff00) | data; |
| 765 | logerror("Trident: Foreground Colour set to %08x\n",tri.accel_fgcolour); |
| 766 | break; |
| 767 | case 0x0d: |
| 768 | tri.accel_fgcolour = (tri.accel_fgcolour & 0xffff00ff) | (data << 8); |
| 769 | logerror("Trident: Foreground Colour set to %08x\n",tri.accel_fgcolour); |
| 770 | break; |
| 771 | case 0x0e: |
| 772 | tri.accel_fgcolour = (tri.accel_fgcolour & 0xff00ffff) | (data << 16); |
| 773 | logerror("Trident: Foreground Colour set to %08x\n",tri.accel_fgcolour); |
| 774 | break; |
| 775 | case 0x0f: |
| 776 | tri.accel_fgcolour = (tri.accel_fgcolour & 0x00ffffff) | (data << 24); |
| 777 | logerror("Trident: Foreground Colour set to %08x\n",tri.accel_fgcolour); |
| 778 | break; |
| 779 | case 0x10: // Background Colour |
| 780 | tri.accel_bgcolour = (tri.accel_bgcolour & 0xffffff00) | data; |
| 781 | logerror("Trident: Background Colour set to %08x\n",tri.accel_bgcolour); |
| 782 | break; |
| 783 | case 0x11: |
| 784 | tri.accel_bgcolour = (tri.accel_bgcolour & 0xffff00ff) | (data << 8); |
| 785 | logerror("Trident: Background Colour set to %08x\n",tri.accel_bgcolour); |
| 786 | break; |
| 787 | case 0x12: |
| 788 | tri.accel_bgcolour = (tri.accel_bgcolour & 0xff00ffff) | (data << 16); |
| 789 | logerror("Trident: Background Colour set to %08x\n",tri.accel_bgcolour); |
| 790 | break; |
| 791 | case 0x13: |
| 792 | tri.accel_bgcolour = (tri.accel_bgcolour & 0x00ffffff) | (data << 24); |
| 793 | logerror("Trident: Background Colour set to %08x\n",tri.accel_bgcolour); |
| 794 | break; |
| 795 | case 0x14: // Pattern Location |
| 796 | tri.accel_pattern_loc = (tri.accel_pattern_loc & 0xff00) | data; |
| 797 | logerror("Trident: Pattern Location set to %04x\n",tri.accel_pattern_loc); |
| 798 | break; |
| 799 | case 0x15: |
| 800 | tri.accel_pattern_loc = (tri.accel_pattern_loc & 0x00ff) | (data << 8); |
| 801 | logerror("Trident: Pattern Location set to %04x\n",tri.accel_pattern_loc); |
| 802 | break; |
| 803 | case 0x18: // Destination X |
| 804 | tri.accel_dest_x = (tri.accel_dest_x & 0xff00) | data; |
| 805 | logerror("Trident: Destination X set to %04x\n",tri.accel_dest_x); |
| 806 | break; |
| 807 | case 0x19: |
| 808 | tri.accel_dest_x = (tri.accel_dest_x & 0x00ff) | (data << 8); |
| 809 | logerror("Trident: Destination X set to %04x\n",tri.accel_dest_x); |
| 810 | break; |
| 811 | case 0x1a: // Destination Y |
| 812 | tri.accel_dest_y = (tri.accel_dest_y & 0xff00) | data; |
| 813 | logerror("Trident: Destination Y set to %04x\n",tri.accel_dest_y); |
| 814 | break; |
| 815 | case 0x1b: |
| 816 | tri.accel_dest_y = (tri.accel_dest_y & 0x00ff) | (data << 8); |
| 817 | logerror("Trident: Destination Y set to %04x\n",tri.accel_dest_y); |
| 818 | break; |
| 819 | case 0x1c: // Source X |
| 820 | tri.accel_source_x = (tri.accel_source_x & 0xff00) | data; |
| 821 | logerror("Trident: Source X set to %04x\n",tri.accel_source_x); |
| 822 | break; |
| 823 | case 0x1d: |
| 824 | tri.accel_source_x = (tri.accel_source_x & 0x00ff) | (data << 8); |
| 825 | logerror("Trident: Source X set to %04x\n",tri.accel_source_x); |
| 826 | break; |
| 827 | case 0x1e: // Source Y |
| 828 | tri.accel_source_y = (tri.accel_source_y & 0xff00) | data; |
| 829 | logerror("Trident: Source Y set to %04x\n",tri.accel_source_y); |
| 830 | break; |
| 831 | case 0x1f: |
| 832 | tri.accel_source_y = (tri.accel_source_y & 0x00ff) | (data << 8); |
| 833 | logerror("Trident: Source Y set to %04x\n",tri.accel_source_y); |
| 834 | break; |
| 835 | case 0x20: // Dimension(?) X |
| 836 | tri.accel_dim_x = (tri.accel_dim_x & 0xff00) | data; |
| 837 | logerror("Trident: Dimension X set to %04x\n",tri.accel_dim_x); |
| 838 | break; |
| 839 | case 0x21: |
| 840 | tri.accel_dim_x = (tri.accel_dim_x & 0x00ff) | (data << 8); |
| 841 | logerror("Trident: Dimension X set to %04x\n",tri.accel_dim_x); |
| 842 | break; |
| 843 | case 0x22: // Dimension(?) Y |
| 844 | tri.accel_dim_y = (tri.accel_dim_y & 0xff00) | data; |
| 845 | logerror("Trident: Dimension y set to %04x\n",tri.accel_dim_y); |
| 846 | break; |
| 847 | case 0x23: |
| 848 | tri.accel_dim_y = (tri.accel_dim_y & 0x00ff) | (data << 8); |
| 849 | logerror("Trident: Dimension y set to %04x\n",tri.accel_dim_y); |
| 850 | break; |
| 851 | case 0x24: // Style |
| 852 | tri.accel_style = (tri.accel_style & 0xffffff00) | data; |
| 853 | logerror("Trident: Style set to %08x\n",tri.accel_style); |
| 854 | break; |
| 855 | case 0x25: |
| 856 | tri.accel_style = (tri.accel_style & 0xffff00ff) | (data << 8); |
| 857 | logerror("Trident: Style set to %08x\n",tri.accel_style); |
| 858 | break; |
| 859 | case 0x26: |
| 860 | tri.accel_style = (tri.accel_style & 0xff00ffff) | (data << 16); |
| 861 | logerror("Trident: Style set to %08x\n",tri.accel_style); |
| 862 | break; |
| 863 | case 0x27: |
| 864 | tri.accel_style = (tri.accel_style & 0x00ffffff) | (data << 24); |
| 865 | logerror("Trident: Style set to %08x\n",tri.accel_style); |
| 866 | break; |
| 867 | case 0x28: // Source Clip X |
| 868 | tri.accel_source_x_clip = (tri.accel_source_x_clip & 0xff00) | data; |
| 869 | logerror("Trident: Source X Clip set to %04x\n",tri.accel_source_x_clip); |
| 870 | break; |
| 871 | case 0x29: |
| 872 | tri.accel_source_x_clip = (tri.accel_source_x_clip & 0x00ff) | (data << 8); |
| 873 | logerror("Trident: Source X Clip set to %04x\n",tri.accel_source_x_clip); |
| 874 | break; |
| 875 | case 0x2a: // Source Clip Y |
| 876 | tri.accel_source_y_clip = (tri.accel_source_y_clip & 0xff00) | data; |
| 877 | logerror("Trident: Source Y Clip set to %04x\n",tri.accel_source_y_clip); |
| 878 | break; |
| 879 | case 0x2b: |
| 880 | tri.accel_source_y_clip = (tri.accel_source_y_clip & 0x00ff) | (data << 8); |
| 881 | logerror("Trident: Source Y Clip set to %04x\n",tri.accel_source_y_clip); |
| 882 | break; |
| 883 | case 0x2c: // Destination Clip X |
| 884 | tri.accel_dest_x_clip = (tri.accel_dest_x_clip & 0xff00) | data; |
| 885 | logerror("Trident: Destination X Clip set to %04x\n",tri.accel_dest_x_clip); |
| 886 | break; |
| 887 | case 0x2d: |
| 888 | tri.accel_dest_x_clip = (tri.accel_dest_x_clip & 0x00ff) | (data << 8); |
| 889 | logerror("Trident: Destination X Clip set to %04x\n",tri.accel_dest_x_clip); |
| 890 | break; |
| 891 | case 0x2e: // Destination Clip Y |
| 892 | tri.accel_dest_y_clip = (tri.accel_dest_y_clip & 0xff00) | data; |
| 893 | logerror("Trident: Destination Y Clip set to %04x\n",tri.accel_dest_y_clip); |
| 894 | break; |
| 895 | case 0x2f: |
| 896 | tri.accel_dest_y_clip = (tri.accel_dest_y_clip & 0x00ff) | (data << 8); |
| 897 | logerror("Trident: Destination Y Clip set to %04x\n",tri.accel_dest_y_clip); |
| 898 | break; |
| 899 | case 0x48: // CKEY (Chromakey?) |
| 900 | tri.accel_ckey = (tri.accel_ckey & 0xffffff00) | data; |
| 901 | logerror("Trident: CKey set to %08x\n",tri.accel_ckey); |
| 902 | break; |
| 903 | case 0x49: |
| 904 | tri.accel_ckey = (tri.accel_ckey & 0xffff00ff) | (data << 8); |
| 905 | logerror("Trident: CKey set to %08x\n",tri.accel_ckey); |
| 906 | break; |
| 907 | case 0x4a: |
| 908 | tri.accel_ckey = (tri.accel_ckey & 0xff00ffff) | (data << 16); |
| 909 | logerror("Trident: CKey set to %08x\n",tri.accel_ckey); |
| 910 | break; |
| 911 | case 0x4b: |
| 912 | tri.accel_ckey = (tri.accel_ckey & 0x00ffffff) | (data << 24); |
| 913 | logerror("Trident: CKey set to %08x\n",tri.accel_ckey); |
| 914 | break; |
| 915 | case 0x58: // Foreground Pattern Colour |
| 916 | tri.accel_fg_pattern_colour = (tri.accel_fg_pattern_colour & 0xffffff00) | data; |
| 917 | logerror("Trident: FG Pattern Colour set to %08x\n",tri.accel_fg_pattern_colour); |
| 918 | break; |
| 919 | case 0x59: |
| 920 | tri.accel_fg_pattern_colour = (tri.accel_fg_pattern_colour & 0xffff00ff) | (data << 8); |
| 921 | logerror("Trident: FG Pattern Colour set to %08x\n",tri.accel_fg_pattern_colour); |
| 922 | break; |
| 923 | case 0x5a: |
| 924 | tri.accel_fg_pattern_colour = (tri.accel_fg_pattern_colour & 0xff00ffff) | (data << 16); |
| 925 | logerror("Trident: FG Pattern Colour set to %08x\n",tri.accel_fg_pattern_colour); |
| 926 | break; |
| 927 | case 0x5b: |
| 928 | tri.accel_fg_pattern_colour = (tri.accel_fg_pattern_colour & 0x00ffffff) | (data << 24); |
| 929 | logerror("Trident: FG Pattern Colour set to %08x\n",tri.accel_fg_pattern_colour); |
| 930 | break; |
| 931 | case 0x5c: // Background Pattern Colour |
| 932 | tri.accel_bg_pattern_colour = (tri.accel_bg_pattern_colour & 0xffffff00) | data; |
| 933 | logerror("Trident: BG Pattern Colour set to %08x\n",tri.accel_bg_pattern_colour); |
| 934 | break; |
| 935 | case 0x5d: |
| 936 | tri.accel_bg_pattern_colour = (tri.accel_bg_pattern_colour & 0xffff00ff) | (data << 8); |
| 937 | logerror("Trident: BG Pattern Colour set to %08x\n",tri.accel_bg_pattern_colour); |
| 938 | break; |
| 939 | case 0x5e: |
| 940 | tri.accel_bg_pattern_colour = (tri.accel_bg_pattern_colour & 0xff00ffff) | (data << 16); |
| 941 | logerror("Trident: BG Pattern Colour set to %08x\n",tri.accel_bg_pattern_colour); |
| 942 | break; |
| 943 | case 0x5f: |
| 944 | tri.accel_bg_pattern_colour = (tri.accel_bg_pattern_colour & 0x00ffffff) | (data << 24); |
| 945 | logerror("Trident: BG Pattern Colour set to %08x\n",tri.accel_bg_pattern_colour); |
| 946 | break; |
| 947 | default: |
| 948 | logerror("Trident: unimplemented acceleration register offset %02x write %02x\n",offset,data); |
| 949 | } |
| 950 | } |