Previous 199869 Revisions Next

r32165 Thursday 18th September, 2014 at 02:38:10 UTC by Barry Rodewald
trident: fixed busy bit, added logging of 2D acceleration registers.
[src/emu/bus/isa]svga_trident.c trident.c trident.h

trunk/src/emu/bus/isa/trident.c
r32164r32165
5757   tri.dac_active = false;
5858   tri.linear_active = false;
5959   tri.mmio_active = false;
60   tri.sr0f = 0x6f;
61   tri.sr0c = 0x78;
62   tri.port_3c3 = true;
63   tri.accel_busy = false;
6064}
6165
6266UINT16 trident_vga_device::offset()
r32164r32165
141145            res = tri.sr0c & 0xef;
142146            if(tri.port_3c3)
143147               res |= 0x10;
148            break;
144149         case 0x0d:  // Mode Control 2
145150            //res = svga.rgb15_en;
146151            if(tri.new_mode)
r32164r32165
281286         break;
282287      case 0x1f:
283288         tri.cr1f = data;  // "Software Programming Register"  written to by software (BIOS?)
284         debugger_break(machine());
285289         break;
286290      case 0x21:  // Linear aperture
287291         tri.cr21 = data;
r32164r32165
585589   vga_device::mem_w(space,offset,data,mem_mask);
586590}
587591
592// 2D Acceleration functions (very WIP)
593
594// From XFree86 source:
595/*
596Graphics 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
654READ8_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
687WRITE8_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}
trunk/src/emu/bus/isa/trident.h
r32164r32165
2727   virtual READ8_MEMBER(mem_r);
2828   virtual WRITE8_MEMBER(mem_w);
2929   virtual UINT16 offset();
30
31   DECLARE_READ8_MEMBER(accel_r);
32   DECLARE_WRITE8_MEMBER(accel_w);
33
3034protected:
3135   virtual void device_start();
3236   virtual void device_reset();
r32164r32165
5862      UINT32 linear_address;
5963      bool linear_active;
6064      bool mmio_active;
65
66      // 2D acceleration
67      UINT16 accel_opermode;
68      UINT8 accel_command;
69      UINT8 accel_fmix;
70      UINT32 accel_drawflags;
71      UINT32 accel_fgcolour;
72      UINT32 accel_bgcolour;
73      UINT16 accel_pattern_loc;
74      UINT16 accel_source_x;
75      UINT16 accel_source_y;
76      UINT16 accel_dest_x;
77      UINT16 accel_dest_y;
78      UINT16 accel_dim_x;
79      UINT16 accel_dim_y;
80      UINT32 accel_style;
81      UINT32 accel_ckey;
82      UINT16 accel_source_x_clip;
83      UINT16 accel_source_y_clip;
84      UINT16 accel_dest_x_clip;
85      UINT16 accel_dest_y_clip;
86      UINT32 accel_fg_pattern_colour;
87      UINT32 accel_bg_pattern_colour;
88      UINT8 accel_pattern[0x80];
89      bool accel_busy;
6190   } tri;
6291private:
6392   UINT8 trident_seq_reg_read(UINT8 index);
trunk/src/emu/bus/isa/svga_trident.c
r32164r32165
8484   m_isa->install_device(0x83c4, 0x83cb, 0, 0, read8_delegate(FUNC(trident_vga_device::port_83c6_r),m_vga), write8_delegate(FUNC(trident_vga_device::port_83c6_w),m_vga));
8585
8686   m_isa->install_memory(0xa0000, 0xbffff, 0, 0, read8_delegate(FUNC(trident_vga_device::mem_r),m_vga), write8_delegate(FUNC(trident_vga_device::mem_w),m_vga));
87
88   // acceleration ports
89   m_isa->install_device(0x2120, 0x21ff, 0, 0, read8_delegate(FUNC(trident_vga_device::accel_r),m_vga), write8_delegate(FUNC(trident_vga_device::accel_w),m_vga));
8790}
8891
8992//-------------------------------------------------

Previous 199869 Revisions Next


© 1997-2024 The MAME Team