1 /***************************************************************************
4 begin : Sun Oct 28 2001
5 copyright : (C) 2001 by Pete Bernert
6 email : BlackDove@addcom.de
7 ***************************************************************************/
8 /***************************************************************************
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. See also the license.txt file for *
14 * additional informations. *
16 ***************************************************************************/
18 ////////////////////////////////////////////////////////////////////////
20 ////////////////////////////////////////////////////////////////////////
22 BOOL bUsingTWin=FALSE;
24 //unsigned long clutid; // global clut
25 unsigned short usMirror=0; // sprite mirror
32 uint32_t dwActFixes=0;
35 BOOL bDoVSyncUpdate=FALSE;
38 static inline unsigned short BGR24to16 (uint32_t BGR)
40 return (unsigned short)(((BGR>>3)&0x1f)|((BGR&0xf80000)>>9)|((BGR&0xf800)>>6));
43 ////////////////////////////////////////////////////////////////////////
44 // Update global TP infos
45 ////////////////////////////////////////////////////////////////////////
47 static inline void UpdateGlobalTP(unsigned short gdata)
49 GlobalTextAddrX = (gdata << 6) & 0x3c0; // texture addr
51 GlobalTextAddrY = (gdata << 4) & 0x100;
53 GlobalTextTP = (gdata >> 7) & 0x3; // tex mode (4,8,15)
55 if(GlobalTextTP==3) GlobalTextTP=2; // seen in Wild9 :(
57 GlobalTextABR = (gdata >> 5) & 0x3; // blend mode
59 lGPUstatusRet&=~0x000001ff; // Clear the necessary bits
60 lGPUstatusRet|=(gdata & 0x01ff); // set the necessary bits
68 if(lGPUstatusRet&0x0200) iDither=2;
77 ////////////////////////////////////////////////////////////////////////
79 static inline void SetRenderMode(uint32_t DrawAttributes)
81 DrawSemiTrans = (SEMITRANSBIT(DrawAttributes)) ? TRUE : FALSE;
83 if(SHADETEXBIT(DrawAttributes))
87 if((dwActFixes&4) && ((DrawAttributes&0x00ffffff)==0))
88 DrawAttributes|=0x007f7f7f;
90 g_m1=(short)(DrawAttributes&0xff);
91 g_m2=(short)((DrawAttributes>>8)&0xff);
92 g_m3=(short)((DrawAttributes>>16)&0xff);
96 ////////////////////////////////////////////////////////////////////////
98 // oki, here are the psx gpu coord rules: poly coords are
99 // 11 bit signed values (-1024...1023). If the x or y distance
100 // exceeds 1024, the polygon will not be drawn.
101 // Since quads are treated as two triangles by the real gpu,
102 // this 'discard rule' applies to each of the quad's triangle
103 // (so one triangle can be drawn, the other one discarded).
104 // Also, y drawing is wrapped at 512 one time,
105 // then it will get negative (and therefore not drawn). The
106 // 'CheckCoord' funcs are a simple (not comlete!) approach to
107 // do things right, I will add a better detection soon... the
108 // current approach will be easier to do in hw/accel plugins, imho
112 #define CHKMAX_X 1024
115 static inline void AdjustCoord4(void)
117 lx0=(short)(((int)lx0<<SIGNSHIFT)>>SIGNSHIFT);
118 lx1=(short)(((int)lx1<<SIGNSHIFT)>>SIGNSHIFT);
119 lx2=(short)(((int)lx2<<SIGNSHIFT)>>SIGNSHIFT);
120 lx3=(short)(((int)lx3<<SIGNSHIFT)>>SIGNSHIFT);
121 ly0=(short)(((int)ly0<<SIGNSHIFT)>>SIGNSHIFT);
122 ly1=(short)(((int)ly1<<SIGNSHIFT)>>SIGNSHIFT);
123 ly2=(short)(((int)ly2<<SIGNSHIFT)>>SIGNSHIFT);
124 ly3=(short)(((int)ly3<<SIGNSHIFT)>>SIGNSHIFT);
127 static inline void AdjustCoord3(void)
129 lx0=(short)(((int)lx0<<SIGNSHIFT)>>SIGNSHIFT);
130 lx1=(short)(((int)lx1<<SIGNSHIFT)>>SIGNSHIFT);
131 lx2=(short)(((int)lx2<<SIGNSHIFT)>>SIGNSHIFT);
132 ly0=(short)(((int)ly0<<SIGNSHIFT)>>SIGNSHIFT);
133 ly1=(short)(((int)ly1<<SIGNSHIFT)>>SIGNSHIFT);
134 ly2=(short)(((int)ly2<<SIGNSHIFT)>>SIGNSHIFT);
137 static inline void AdjustCoord2(void)
139 lx0=(short)(((int)lx0<<SIGNSHIFT)>>SIGNSHIFT);
140 lx1=(short)(((int)lx1<<SIGNSHIFT)>>SIGNSHIFT);
141 ly0=(short)(((int)ly0<<SIGNSHIFT)>>SIGNSHIFT);
142 ly1=(short)(((int)ly1<<SIGNSHIFT)>>SIGNSHIFT);
145 static inline void AdjustCoord1(void)
147 lx0=(short)(((int)lx0<<SIGNSHIFT)>>SIGNSHIFT);
148 ly0=(short)(((int)ly0<<SIGNSHIFT)>>SIGNSHIFT);
150 if(lx0<-512 && PSXDisplay.DrawOffset.x<=-512)
153 if(ly0<-512 && PSXDisplay.DrawOffset.y<=-512)
157 ////////////////////////////////////////////////////////////////////////
158 // special checks... nascar, syphon filter 2, mgs
159 ////////////////////////////////////////////////////////////////////////
161 // xenogears FT4: not removed correctly right now... the tri 0,1,2
162 // should get removed, the tri 1,2,3 should stay... pfff
164 // x -466 1023 180 1023
165 // y 20 -228 222 -100
171 static inline BOOL CheckCoord4(void)
175 if(((lx1-lx0)>CHKMAX_X) ||
176 ((lx2-lx0)>CHKMAX_X))
180 if((lx1-lx3)>CHKMAX_X) return TRUE;
181 if((lx2-lx3)>CHKMAX_X) return TRUE;
187 if((lx0-lx1)>CHKMAX_X) return TRUE;
188 if((lx2-lx1)>CHKMAX_X) return TRUE;
189 if((lx3-lx1)>CHKMAX_X) return TRUE;
193 if((lx0-lx2)>CHKMAX_X) return TRUE;
194 if((lx1-lx2)>CHKMAX_X) return TRUE;
195 if((lx3-lx2)>CHKMAX_X) return TRUE;
199 if(((lx1-lx3)>CHKMAX_X) ||
200 ((lx2-lx3)>CHKMAX_X))
204 if((lx1-lx0)>CHKMAX_X) return TRUE;
205 if((lx2-lx0)>CHKMAX_X) return TRUE;
213 if((ly1-ly0)>CHKMAX_Y) return TRUE;
214 if((ly2-ly0)>CHKMAX_Y) return TRUE;
218 if((ly0-ly1)>CHKMAX_Y) return TRUE;
219 if((ly2-ly1)>CHKMAX_Y) return TRUE;
220 if((ly3-ly1)>CHKMAX_Y) return TRUE;
224 if((ly0-ly2)>CHKMAX_Y) return TRUE;
225 if((ly1-ly2)>CHKMAX_Y) return TRUE;
226 if((ly3-ly2)>CHKMAX_Y) return TRUE;
230 if((ly1-ly3)>CHKMAX_Y) return TRUE;
231 if((ly2-ly3)>CHKMAX_Y) return TRUE;
237 static inline BOOL CheckCoord3(void)
241 if((lx1-lx0)>CHKMAX_X) return TRUE;
242 if((lx2-lx0)>CHKMAX_X) return TRUE;
246 if((lx0-lx1)>CHKMAX_X) return TRUE;
247 if((lx2-lx1)>CHKMAX_X) return TRUE;
251 if((lx0-lx2)>CHKMAX_X) return TRUE;
252 if((lx1-lx2)>CHKMAX_X) return TRUE;
256 if((ly1-ly0)>CHKMAX_Y) return TRUE;
257 if((ly2-ly0)>CHKMAX_Y) return TRUE;
261 if((ly0-ly1)>CHKMAX_Y) return TRUE;
262 if((ly2-ly1)>CHKMAX_Y) return TRUE;
266 if((ly0-ly2)>CHKMAX_Y) return TRUE;
267 if((ly1-ly2)>CHKMAX_Y) return TRUE;
274 static inline BOOL CheckCoord2(void)
278 if((lx1-lx0)>CHKMAX_X) return TRUE;
282 if((lx0-lx1)>CHKMAX_X) return TRUE;
286 if((ly1-ly0)>CHKMAX_Y) return TRUE;
290 if((ly0-ly1)>CHKMAX_Y) return TRUE;
296 static inline BOOL CheckCoordL(short slx0,short sly0,short slx1,short sly1)
300 if((slx1-slx0)>CHKMAX_X) return TRUE;
304 if((slx0-slx1)>CHKMAX_X) return TRUE;
308 if((sly1-sly0)>CHKMAX_Y) return TRUE;
312 if((sly0-sly1)>CHKMAX_Y) return TRUE;
319 ////////////////////////////////////////////////////////////////////////
320 // mask stuff... used in silent hill
321 ////////////////////////////////////////////////////////////////////////
323 static inline void cmdSTP(unsigned char * baseAddr)
325 uint32_t gdata = GETLE32(&((uint32_t*)baseAddr)[0]);
327 lGPUstatusRet&=~0x1800; // Clear the necessary bits
328 lGPUstatusRet|=((gdata & 0x03) << 11); // Set the necessary bits
330 if(gdata&1) {sSetMask=0x8000;lSetMask=0x80008000;}
331 else {sSetMask=0; lSetMask=0; }
333 if(gdata&2) bCheckMask=TRUE;
334 else bCheckMask=FALSE;
337 ////////////////////////////////////////////////////////////////////////
338 // cmd: Set texture page infos
339 ////////////////////////////////////////////////////////////////////////
341 static void cmdTexturePage(unsigned char * baseAddr)
343 uint32_t gdata = GETLE32(&((uint32_t*)baseAddr)[0]);
345 lGPUstatusRet&=~0x000007ff;
346 lGPUstatusRet|=(gdata & 0x07ff);
348 usMirror=gdata&0x3000;
350 UpdateGlobalTP((unsigned short)gdata);
351 GlobalTextREST = (gdata&0x00ffffff)>>9;
354 ////////////////////////////////////////////////////////////////////////
355 // cmd: turn on/off texture window
356 ////////////////////////////////////////////////////////////////////////
358 static void cmdTextureWindow(unsigned char *baseAddr)
360 uint32_t gdata = GETLE32(&((uint32_t*)baseAddr)[0]);
362 uint32_t YAlign,XAlign;
364 lGPUInfoVals[INFO_TW]=gdata&0xFFFFF;
367 TWin.Position.y1 = 8; // xxxx1
368 else if (gdata & 0x040)
369 TWin.Position.y1 = 16; // xxx10
370 else if (gdata & 0x080)
371 TWin.Position.y1 = 32; // xx100
372 else if (gdata & 0x100)
373 TWin.Position.y1 = 64; // x1000
374 else if (gdata & 0x200)
375 TWin.Position.y1 = 128; // 10000
377 TWin.Position.y1 = 256; // 00000
378 TWin.ymask = TWin.Position.y1 - 1;
380 // Texture window size is determined by the least bit set of the relevant 5 bits
383 TWin.Position.x1 = 8; // xxxx1
384 else if (gdata & 0x002)
385 TWin.Position.x1 = 16; // xxx10
386 else if (gdata & 0x004)
387 TWin.Position.x1 = 32; // xx100
388 else if (gdata & 0x008)
389 TWin.Position.x1 = 64; // x1000
390 else if (gdata & 0x010)
391 TWin.Position.x1 = 128; // 10000
393 TWin.Position.x1 = 256; // 00000
394 TWin.xmask = TWin.Position.x1 - 1;
396 // Re-calculate the bit field, because we can't trust what is passed in the data
399 YAlign = (uint32_t)(32 - (TWin.Position.y1 >> 3));
400 XAlign = (uint32_t)(32 - (TWin.Position.x1 >> 3));
402 // Absolute position of the start of the texture window
404 TWin.Position.y0 = (short)(((gdata >> 15) & YAlign) << 3);
405 TWin.Position.x0 = (short)(((gdata >> 10) & XAlign) << 3);
407 if((TWin.Position.x0 == 0 && // tw turned off
408 TWin.Position.y0 == 0 &&
409 TWin.Position.x1 == 0 &&
410 TWin.Position.y1 == 0) ||
411 (TWin.Position.x1 == 256 &&
412 TWin.Position.y1 == 256))
414 bUsingTWin = FALSE; // -> just do it
418 bUsingTWin = TRUE; // -> tw turned on
422 ////////////////////////////////////////////////////////////////////////
423 // cmd: start of drawing area... primitives will be clipped inside
424 ////////////////////////////////////////////////////////////////////////
428 static void cmdDrawAreaStart(unsigned char * baseAddr)
430 uint32_t gdata = GETLE32(&((uint32_t*)baseAddr)[0]);
432 drawX = gdata & 0x3ff; // for soft drawing
434 lGPUInfoVals[INFO_DRAWSTART]=gdata&0xFFFFF;
435 drawY = (gdata>>10)&0x3ff;
436 if(drawY>=512) drawY=511; // some security
439 ////////////////////////////////////////////////////////////////////////
440 // cmd: end of drawing area... primitives will be clipped inside
441 ////////////////////////////////////////////////////////////////////////
443 static void cmdDrawAreaEnd(unsigned char * baseAddr)
445 uint32_t gdata = GETLE32(&((uint32_t*)baseAddr)[0]);
447 drawW = gdata & 0x3ff; // for soft drawing
449 lGPUInfoVals[INFO_DRAWEND]=gdata&0xFFFFF;
450 drawH = (gdata>>10)&0x3ff;
451 if(drawH>=512) drawH=511; // some security
454 ////////////////////////////////////////////////////////////////////////
455 // cmd: draw offset... will be added to prim coords
456 ////////////////////////////////////////////////////////////////////////
458 static void cmdDrawOffset(unsigned char * baseAddr)
460 uint32_t gdata = GETLE32(&((uint32_t*)baseAddr)[0]);
462 PSXDisplay.DrawOffset.x = (short)(gdata & 0x7ff);
464 lGPUInfoVals[INFO_DRAWOFF]=gdata&0x3FFFFF;
465 PSXDisplay.DrawOffset.y = (short)((gdata>>11) & 0x7ff);
467 PSXDisplay.DrawOffset.y=(short)(((int)PSXDisplay.DrawOffset.y<<21)>>21);
468 PSXDisplay.DrawOffset.x=(short)(((int)PSXDisplay.DrawOffset.x<<21)>>21);
471 ////////////////////////////////////////////////////////////////////////
472 // cmd: load image to vram
473 ////////////////////////////////////////////////////////////////////////
475 static void primLoadImage(unsigned char * baseAddr)
477 unsigned short *sgpuData = ((unsigned short *) baseAddr);
479 VRAMWrite.x = GETLEs16(&sgpuData[2])&0x3ff;
480 VRAMWrite.y = GETLEs16(&sgpuData[3])&511;
481 VRAMWrite.Width = GETLEs16(&sgpuData[4]);
482 VRAMWrite.Height = GETLEs16(&sgpuData[5]);
484 DataWriteMode = DR_VRAMTRANSFER;
486 VRAMWrite.ImagePtr = psxVuw + (VRAMWrite.y<<10) + VRAMWrite.x;
487 VRAMWrite.RowsRemaining = VRAMWrite.Width;
488 VRAMWrite.ColsRemaining = VRAMWrite.Height;
491 ////////////////////////////////////////////////////////////////////////
492 // cmd: vram -> psx mem
493 ////////////////////////////////////////////////////////////////////////
495 static void primStoreImage(unsigned char * baseAddr)
497 unsigned short *sgpuData = ((unsigned short *) baseAddr);
499 VRAMRead.x = GETLEs16(&sgpuData[2])&0x03ff;
500 VRAMRead.y = GETLEs16(&sgpuData[3])&511;
501 VRAMRead.Width = GETLEs16(&sgpuData[4]);
502 VRAMRead.Height = GETLEs16(&sgpuData[5]);
504 VRAMRead.ImagePtr = psxVuw + (VRAMRead.y<<10) + VRAMRead.x;
505 VRAMRead.RowsRemaining = VRAMRead.Width;
506 VRAMRead.ColsRemaining = VRAMRead.Height;
508 DataReadMode = DR_VRAMTRANSFER;
510 lGPUstatusRet |= GPUSTATUS_READYFORVRAM;
513 ////////////////////////////////////////////////////////////////////////
514 // cmd: blkfill - NO primitive! Doesn't care about draw areas...
515 ////////////////////////////////////////////////////////////////////////
517 static void primBlkFill(unsigned char * baseAddr)
519 uint32_t *gpuData = ((uint32_t *) baseAddr);
520 short *sgpuData = ((short *) baseAddr);
522 short sX = GETLEs16(&sgpuData[2]);
523 short sY = GETLEs16(&sgpuData[3]);
524 short sW = GETLEs16(&sgpuData[4]) & 0x3ff;
525 short sH = GETLEs16(&sgpuData[5]) & 0x3ff;
529 // Increase H & W if they are one short of full values, because they never can be full values
530 if (sH >= 1023) sH=1024;
531 if (sW >= 1023) sW=1024;
533 // x and y of end pos
537 FillSoftwareArea(sX, sY, sW, sH, BGR24to16(GETLE32(&gpuData[0])));
542 ////////////////////////////////////////////////////////////////////////
543 // cmd: move image vram -> vram
544 ////////////////////////////////////////////////////////////////////////
546 static void primMoveImage(unsigned char * baseAddr)
548 short *sgpuData = ((short *) baseAddr);
550 short imageY0,imageX0,imageY1,imageX1,imageSX,imageSY,i,j;
552 imageX0 = GETLEs16(&sgpuData[2])&0x03ff;
553 imageY0 = GETLEs16(&sgpuData[3])&511;
554 imageX1 = GETLEs16(&sgpuData[4])&0x03ff;
555 imageY1 = GETLEs16(&sgpuData[5])&511;
556 imageSX = GETLEs16(&sgpuData[6]);
557 imageSY = GETLEs16(&sgpuData[7]);
559 if((imageX0 == imageX1) && (imageY0 == imageY1)) return;
560 if(imageSX<=0) return;
561 if(imageSY<=0) return;
563 if((imageY0+imageSY)>512 ||
564 (imageX0+imageSX)>1024 ||
565 (imageY1+imageSY)>512 ||
566 (imageX1+imageSX)>1024)
569 for(j=0;j<imageSY;j++)
570 for(i=0;i<imageSX;i++)
571 psxVuw [(1024*((imageY1+j)&511))+((imageX1+i)&0x3ff)]=
572 psxVuw[(1024*((imageY0+j)&511))+((imageX0+i)&0x3ff)];
579 if(imageSX&1) // not dword aligned? slower func
581 unsigned short *SRCPtr, *DSTPtr;
582 unsigned short LineOffset;
584 SRCPtr = psxVuw + (1024*imageY0) + imageX0;
585 DSTPtr = psxVuw + (1024*imageY1) + imageX1;
587 LineOffset = 1024 - imageSX;
589 for(j=0;j<imageSY;j++)
591 for(i=0;i<imageSX;i++) *DSTPtr++ = *SRCPtr++;
592 SRCPtr += LineOffset;
593 DSTPtr += LineOffset;
596 else // dword aligned
598 uint32_t *SRCPtr, *DSTPtr;
599 unsigned short LineOffset;
602 SRCPtr = (uint32_t *)(psxVuw + (1024*imageY0) + imageX0);
603 DSTPtr = (uint32_t *)(psxVuw + (1024*imageY1) + imageX1);
605 LineOffset = 512 - dx;
607 for(j=0;j<imageSY;j++)
609 for(i=0;i<dx;i++) *DSTPtr++ = *SRCPtr++;
610 SRCPtr += LineOffset;
611 DSTPtr += LineOffset;
621 ////////////////////////////////////////////////////////////////////////
622 // cmd: draw free-size Tile
623 ////////////////////////////////////////////////////////////////////////
625 static void primTileS(unsigned char * baseAddr)
627 uint32_t *gpuData = ((uint32_t*)baseAddr);
628 short *sgpuData = ((short *) baseAddr);
629 short sW = GETLEs16(&sgpuData[4]) & 0x3ff;
630 short sH = GETLEs16(&sgpuData[5]) & 511; // mmm... limit tiles to 0x1ff or height?
632 lx0 = GETLEs16(&sgpuData[2]);
633 ly0 = GETLEs16(&sgpuData[3]);
635 if(!(dwActFixes&8)) AdjustCoord1();
638 ly2 = ly3 = ly0+sH +PSXDisplay.DrawOffset.y;
639 ly0 = ly1 = ly0 +PSXDisplay.DrawOffset.y;
640 lx1 = lx2 = lx0+sW +PSXDisplay.DrawOffset.x;
641 lx0 = lx3 = lx0 +PSXDisplay.DrawOffset.x;
643 DrawSemiTrans = (SEMITRANSBIT(GETLE32(&gpuData[0]))) ? TRUE : FALSE;
645 FillSoftwareAreaTrans(lx0,ly0,lx2,ly2,
646 BGR24to16(GETLE32(&gpuData[0])));
651 ////////////////////////////////////////////////////////////////////////
652 // cmd: draw 1 dot Tile (point)
653 ////////////////////////////////////////////////////////////////////////
655 static void primTile1(unsigned char * baseAddr)
657 uint32_t *gpuData = ((uint32_t*)baseAddr);
658 short *sgpuData = ((short *) baseAddr);
662 lx0 = GETLEs16(&sgpuData[2]);
663 ly0 = GETLEs16(&sgpuData[3]);
665 if(!(dwActFixes&8)) AdjustCoord1();
668 ly2 = ly3 = ly0+sH +PSXDisplay.DrawOffset.y;
669 ly0 = ly1 = ly0 +PSXDisplay.DrawOffset.y;
670 lx1 = lx2 = lx0+sW +PSXDisplay.DrawOffset.x;
671 lx0 = lx3 = lx0 +PSXDisplay.DrawOffset.x;
673 DrawSemiTrans = (SEMITRANSBIT(GETLE32(&gpuData[0]))) ? TRUE : FALSE;
675 FillSoftwareAreaTrans(lx0,ly0,lx2,ly2,
676 BGR24to16(GETLE32(&gpuData[0]))); // Takes Start and Offset
681 ////////////////////////////////////////////////////////////////////////
682 // cmd: draw 8 dot Tile (small rect)
683 ////////////////////////////////////////////////////////////////////////
685 static void primTile8(unsigned char * baseAddr)
687 uint32_t *gpuData = ((uint32_t*)baseAddr);
688 short *sgpuData = ((short *) baseAddr);
692 lx0 = GETLEs16(&sgpuData[2]);
693 ly0 = GETLEs16(&sgpuData[3]);
695 if(!(dwActFixes&8)) AdjustCoord1();
698 ly2 = ly3 = ly0+sH +PSXDisplay.DrawOffset.y;
699 ly0 = ly1 = ly0 +PSXDisplay.DrawOffset.y;
700 lx1 = lx2 = lx0+sW +PSXDisplay.DrawOffset.x;
701 lx0 = lx3 = lx0 +PSXDisplay.DrawOffset.x;
703 DrawSemiTrans = (SEMITRANSBIT(GETLE32(&gpuData[0]))) ? TRUE : FALSE;
705 FillSoftwareAreaTrans(lx0,ly0,lx2,ly2,
706 BGR24to16(GETLE32(&gpuData[0]))); // Takes Start and Offset
711 ////////////////////////////////////////////////////////////////////////
712 // cmd: draw 16 dot Tile (medium rect)
713 ////////////////////////////////////////////////////////////////////////
715 static void primTile16(unsigned char * baseAddr)
717 uint32_t *gpuData = ((uint32_t*)baseAddr);
718 short *sgpuData = ((short *) baseAddr);
722 lx0 = GETLEs16(&sgpuData[2]);
723 ly0 = GETLEs16(&sgpuData[3]);
725 if(!(dwActFixes&8)) AdjustCoord1();
728 ly2 = ly3 = ly0+sH +PSXDisplay.DrawOffset.y;
729 ly0 = ly1 = ly0 +PSXDisplay.DrawOffset.y;
730 lx1 = lx2 = lx0+sW +PSXDisplay.DrawOffset.x;
731 lx0 = lx3 = lx0 +PSXDisplay.DrawOffset.x;
733 DrawSemiTrans = (SEMITRANSBIT(GETLE32(&gpuData[0]))) ? TRUE : FALSE;
735 FillSoftwareAreaTrans(lx0,ly0,lx2,ly2,
736 BGR24to16(GETLE32(&gpuData[0]))); // Takes Start and Offset
741 ////////////////////////////////////////////////////////////////////////
742 // cmd: small sprite (textured rect)
743 ////////////////////////////////////////////////////////////////////////
745 static void primSprt8(unsigned char * baseAddr)
747 uint32_t *gpuData = ((uint32_t *) baseAddr);
748 short *sgpuData = ((short *) baseAddr);
750 lx0 = GETLEs16(&sgpuData[2]);
751 ly0 = GETLEs16(&sgpuData[3]);
753 if(!(dwActFixes&8)) AdjustCoord1();
755 SetRenderMode(GETLE32(&gpuData[0]));
757 if(bUsingTWin) DrawSoftwareSpriteTWin(baseAddr,8,8);
759 if(usMirror) DrawSoftwareSpriteMirror(baseAddr,8,8);
760 else DrawSoftwareSprite(baseAddr,8,8,
767 ////////////////////////////////////////////////////////////////////////
768 // cmd: medium sprite (textured rect)
769 ////////////////////////////////////////////////////////////////////////
771 static void primSprt16(unsigned char * baseAddr)
773 uint32_t *gpuData = ((uint32_t *) baseAddr);
774 short *sgpuData = ((short *) baseAddr);
776 lx0 = GETLEs16(&sgpuData[2]);
777 ly0 = GETLEs16(&sgpuData[3]);
779 if(!(dwActFixes&8)) AdjustCoord1();
781 SetRenderMode(GETLE32(&gpuData[0]));
783 if(bUsingTWin) DrawSoftwareSpriteTWin(baseAddr,16,16);
785 if(usMirror) DrawSoftwareSpriteMirror(baseAddr,16,16);
786 else DrawSoftwareSprite(baseAddr,16,16,
793 ////////////////////////////////////////////////////////////////////////
794 // cmd: free-size sprite (textured rect)
795 ////////////////////////////////////////////////////////////////////////
797 // func used on texture coord wrap
798 static void primSprtSRest(unsigned char * baseAddr,unsigned short type)
800 uint32_t *gpuData = ((uint32_t *) baseAddr);
801 short *sgpuData = ((short *) baseAddr);
802 unsigned short sTypeRest=0;
805 short sX = GETLEs16(&sgpuData[2]);
806 short sY = GETLEs16(&sgpuData[3]);
807 short sW = GETLEs16(&sgpuData[6]) & 0x3ff;
808 short sH = GETLEs16(&sgpuData[7]) & 0x1ff;
809 short tX = baseAddr[8];
810 short tY = baseAddr[9];
860 SetRenderMode(GETLE32(&gpuData[0]));
862 if(tX+sW>256) {sW=256-tX;sTypeRest+=1;}
863 if(tY+sH>256) {sH=256-tY;sTypeRest+=2;}
868 if(!(dwActFixes&8)) AdjustCoord1();
870 DrawSoftwareSprite(baseAddr,sW,sH,tX,tY);
872 if(sTypeRest && type<4)
874 if(sTypeRest&1 && type==1) primSprtSRest(baseAddr,4);
875 if(sTypeRest&2 && type==2) primSprtSRest(baseAddr,5);
876 if(sTypeRest==3 && type==3) primSprtSRest(baseAddr,6);
881 ////////////////////////////////////////////////////////////////////////
883 static void primSprtS(unsigned char * baseAddr)
885 uint32_t *gpuData = ((uint32_t *) baseAddr);
886 short *sgpuData = ((short *) baseAddr);
889 lx0 = GETLEs16(&sgpuData[2]);
890 ly0 = GETLEs16(&sgpuData[3]);
892 if(!(dwActFixes&8)) AdjustCoord1();
894 sW = GETLEs16(&sgpuData[6]) & 0x3ff;
895 sH = GETLEs16(&sgpuData[7]) & 0x1ff;
897 SetRenderMode(GETLE32(&gpuData[0]));
899 if(bUsingTWin) DrawSoftwareSpriteTWin(baseAddr,sW,sH);
901 if(usMirror) DrawSoftwareSpriteMirror(baseAddr,sW,sH);
904 unsigned short sTypeRest=0;
905 short tX=baseAddr[8];
906 short tY=baseAddr[9];
908 if(tX+sW>256) {sW=256-tX;sTypeRest+=1;}
909 if(tY+sH>256) {sH=256-tY;sTypeRest+=2;}
911 DrawSoftwareSprite(baseAddr,sW,sH,tX,tY);
915 if(sTypeRest&1) primSprtSRest(baseAddr,1);
916 if(sTypeRest&2) primSprtSRest(baseAddr,2);
917 if(sTypeRest==3) primSprtSRest(baseAddr,3);
925 ////////////////////////////////////////////////////////////////////////
926 // cmd: flat shaded Poly4
927 ////////////////////////////////////////////////////////////////////////
929 static void primPolyF4(unsigned char *baseAddr)
931 uint32_t *gpuData = ((uint32_t *) baseAddr);
932 short *sgpuData = ((short *) baseAddr);
934 lx0 = GETLEs16(&sgpuData[2]);
935 ly0 = GETLEs16(&sgpuData[3]);
936 lx1 = GETLEs16(&sgpuData[4]);
937 ly1 = GETLEs16(&sgpuData[5]);
938 lx2 = GETLEs16(&sgpuData[6]);
939 ly2 = GETLEs16(&sgpuData[7]);
940 lx3 = GETLEs16(&sgpuData[8]);
941 ly3 = GETLEs16(&sgpuData[9]);
946 if(CheckCoord4()) return;
950 DrawSemiTrans = (SEMITRANSBIT(GETLE32(&gpuData[0]))) ? TRUE : FALSE;
952 drawPoly4F(GETLE32(&gpuData[0]));
957 ////////////////////////////////////////////////////////////////////////
958 // cmd: smooth shaded Poly4
959 ////////////////////////////////////////////////////////////////////////
961 static void primPolyG4(unsigned char * baseAddr)
963 uint32_t *gpuData = (uint32_t *)baseAddr;
964 short *sgpuData = ((short *) baseAddr);
966 lx0 = GETLEs16(&sgpuData[2]);
967 ly0 = GETLEs16(&sgpuData[3]);
968 lx1 = GETLEs16(&sgpuData[6]);
969 ly1 = GETLEs16(&sgpuData[7]);
970 lx2 = GETLEs16(&sgpuData[10]);
971 ly2 = GETLEs16(&sgpuData[11]);
972 lx3 = GETLEs16(&sgpuData[14]);
973 ly3 = GETLEs16(&sgpuData[15]);
978 if(CheckCoord4()) return;
982 DrawSemiTrans = (SEMITRANSBIT(GETLE32(&gpuData[0]))) ? TRUE : FALSE;
984 drawPoly4G(GETLE32(&gpuData[0]), GETLE32(&gpuData[2]),
985 GETLE32(&gpuData[4]), GETLE32(&gpuData[6]));
990 ////////////////////////////////////////////////////////////////////////
991 // cmd: flat shaded Texture3
992 ////////////////////////////////////////////////////////////////////////
994 static void primPolyFT3(unsigned char * baseAddr)
996 uint32_t *gpuData = ((uint32_t *) baseAddr);
997 short *sgpuData = ((short *) baseAddr);
999 lx0 = GETLEs16(&sgpuData[2]);
1000 ly0 = GETLEs16(&sgpuData[3]);
1001 lx1 = GETLEs16(&sgpuData[6]);
1002 ly1 = GETLEs16(&sgpuData[7]);
1003 lx2 = GETLEs16(&sgpuData[10]);
1004 ly2 = GETLEs16(&sgpuData[11]);
1006 lLowerpart=GETLE32(&gpuData[4])>>16;
1007 UpdateGlobalTP((unsigned short)lLowerpart);
1012 if(CheckCoord3()) return;
1016 SetRenderMode(GETLE32(&gpuData[0]));
1018 drawPoly3FT(baseAddr);
1020 bDoVSyncUpdate=TRUE;
1023 ////////////////////////////////////////////////////////////////////////
1024 // cmd: flat shaded Texture4
1025 ////////////////////////////////////////////////////////////////////////
1027 static void primPolyFT4(unsigned char * baseAddr)
1029 uint32_t *gpuData = ((uint32_t *) baseAddr);
1030 short *sgpuData = ((short *) baseAddr);
1032 lx0 = GETLEs16(&sgpuData[2]);
1033 ly0 = GETLEs16(&sgpuData[3]);
1034 lx1 = GETLEs16(&sgpuData[6]);
1035 ly1 = GETLEs16(&sgpuData[7]);
1036 lx2 = GETLEs16(&sgpuData[10]);
1037 ly2 = GETLEs16(&sgpuData[11]);
1038 lx3 = GETLEs16(&sgpuData[14]);
1039 ly3 = GETLEs16(&sgpuData[15]);
1041 lLowerpart=GETLE32(&gpuData[4])>>16;
1042 UpdateGlobalTP((unsigned short)lLowerpart);
1047 if(CheckCoord4()) return;
1052 SetRenderMode(GETLE32(&gpuData[0]));
1054 drawPoly4FT(baseAddr);
1056 bDoVSyncUpdate=TRUE;
1059 ////////////////////////////////////////////////////////////////////////
1060 // cmd: smooth shaded Texture3
1061 ////////////////////////////////////////////////////////////////////////
1063 static void primPolyGT3(unsigned char *baseAddr)
1065 uint32_t *gpuData = ((uint32_t *) baseAddr);
1066 short *sgpuData = ((short *) baseAddr);
1068 lx0 = GETLEs16(&sgpuData[2]);
1069 ly0 = GETLEs16(&sgpuData[3]);
1070 lx1 = GETLEs16(&sgpuData[8]);
1071 ly1 = GETLEs16(&sgpuData[9]);
1072 lx2 = GETLEs16(&sgpuData[14]);
1073 ly2 = GETLEs16(&sgpuData[15]);
1075 lLowerpart=GETLE32(&gpuData[5])>>16;
1076 UpdateGlobalTP((unsigned short)lLowerpart);
1081 if(CheckCoord3()) return;
1085 DrawSemiTrans = (SEMITRANSBIT(GETLE32(&gpuData[0]))) ? TRUE : FALSE;
1087 if(SHADETEXBIT(GETLE32(&gpuData[0])))
1089 gpuData[0] = (gpuData[0]&HOST2LE32(0xff000000))|HOST2LE32(0x00808080);
1090 gpuData[3] = (gpuData[3]&HOST2LE32(0xff000000))|HOST2LE32(0x00808080);
1091 gpuData[6] = (gpuData[6]&HOST2LE32(0xff000000))|HOST2LE32(0x00808080);
1094 drawPoly3GT(baseAddr);
1096 bDoVSyncUpdate=TRUE;
1099 ////////////////////////////////////////////////////////////////////////
1100 // cmd: smooth shaded Poly3
1101 ////////////////////////////////////////////////////////////////////////
1103 static void primPolyG3(unsigned char *baseAddr)
1105 uint32_t *gpuData = ((uint32_t *) baseAddr);
1106 short *sgpuData = ((short *) baseAddr);
1108 lx0 = GETLEs16(&sgpuData[2]);
1109 ly0 = GETLEs16(&sgpuData[3]);
1110 lx1 = GETLEs16(&sgpuData[6]);
1111 ly1 = GETLEs16(&sgpuData[7]);
1112 lx2 = GETLEs16(&sgpuData[10]);
1113 ly2 = GETLEs16(&sgpuData[11]);
1118 if(CheckCoord3()) return;
1122 DrawSemiTrans = (SEMITRANSBIT(GETLE32(&gpuData[0]))) ? TRUE : FALSE;
1124 drawPoly3G(GETLE32(&gpuData[0]), GETLE32(&gpuData[2]), GETLE32(&gpuData[4]));
1126 bDoVSyncUpdate=TRUE;
1129 ////////////////////////////////////////////////////////////////////////
1130 // cmd: smooth shaded Texture4
1131 ////////////////////////////////////////////////////////////////////////
1133 static void primPolyGT4(unsigned char *baseAddr)
1135 uint32_t *gpuData = ((uint32_t *) baseAddr);
1136 short *sgpuData = ((short *) baseAddr);
1138 lx0 = GETLEs16(&sgpuData[2]);
1139 ly0 = GETLEs16(&sgpuData[3]);
1140 lx1 = GETLEs16(&sgpuData[8]);
1141 ly1 = GETLEs16(&sgpuData[9]);
1142 lx2 = GETLEs16(&sgpuData[14]);
1143 ly2 = GETLEs16(&sgpuData[15]);
1144 lx3 = GETLEs16(&sgpuData[20]);
1145 ly3 = GETLEs16(&sgpuData[21]);
1147 lLowerpart=GETLE32(&gpuData[5])>>16;
1148 UpdateGlobalTP((unsigned short)lLowerpart);
1153 if(CheckCoord4()) return;
1157 DrawSemiTrans = (SEMITRANSBIT(GETLE32(&gpuData[0]))) ? TRUE : FALSE;
1159 if(SHADETEXBIT(GETLE32(&gpuData[0])))
1161 gpuData[0] = (gpuData[0]&HOST2LE32(0xff000000))|HOST2LE32(0x00808080);
1162 gpuData[3] = (gpuData[3]&HOST2LE32(0xff000000))|HOST2LE32(0x00808080);
1163 gpuData[6] = (gpuData[6]&HOST2LE32(0xff000000))|HOST2LE32(0x00808080);
1164 gpuData[9] = (gpuData[9]&HOST2LE32(0xff000000))|HOST2LE32(0x00808080);
1167 drawPoly4GT(baseAddr);
1169 bDoVSyncUpdate=TRUE;
1172 ////////////////////////////////////////////////////////////////////////
1173 // cmd: smooth shaded Poly3
1174 ////////////////////////////////////////////////////////////////////////
1176 static void primPolyF3(unsigned char *baseAddr)
1178 uint32_t *gpuData = ((uint32_t *) baseAddr);
1179 short *sgpuData = ((short *) baseAddr);
1181 lx0 = GETLEs16(&sgpuData[2]);
1182 ly0 = GETLEs16(&sgpuData[3]);
1183 lx1 = GETLEs16(&sgpuData[4]);
1184 ly1 = GETLEs16(&sgpuData[5]);
1185 lx2 = GETLEs16(&sgpuData[6]);
1186 ly2 = GETLEs16(&sgpuData[7]);
1191 if(CheckCoord3()) return;
1195 SetRenderMode(GETLE32(&gpuData[0]));
1197 drawPoly3F(GETLE32(&gpuData[0]));
1199 bDoVSyncUpdate=TRUE;
1202 ////////////////////////////////////////////////////////////////////////
1203 // cmd: skipping shaded polylines
1204 ////////////////////////////////////////////////////////////////////////
1206 static void primLineGSkip(unsigned char *baseAddr)
1208 uint32_t *gpuData = ((uint32_t *) baseAddr);
1212 ly1 = (short)((GETLE32(&gpuData[1])>>16) & 0xffff);
1213 lx1 = (short)(GETLE32(&gpuData[1]) & 0xffff);
1215 while(!(((GETLE32(&gpuData[i]) & 0xF000F000) == 0x50005000) && i>=4))
1218 ly1 = (short)((GETLE32(&gpuData[i])>>16) & 0xffff);
1219 lx1 = (short)(GETLE32(&gpuData[i]) & 0xffff);
1220 i++;if(i>iMax) break;
1224 ////////////////////////////////////////////////////////////////////////
1225 // cmd: shaded polylines
1226 ////////////////////////////////////////////////////////////////////////
1228 static void primLineGEx(unsigned char *baseAddr)
1230 uint32_t *gpuData = ((uint32_t *) baseAddr);
1233 short slx0,slx1,sly0,sly1;int i=2;BOOL bDraw=TRUE;
1235 sly1 = (short)((GETLE32(&gpuData[1])>>16) & 0xffff);
1236 slx1 = (short)(GETLE32(&gpuData[1]) & 0xffff);
1240 slx1=(short)(((int)slx1<<SIGNSHIFT)>>SIGNSHIFT);
1241 sly1=(short)(((int)sly1<<SIGNSHIFT)>>SIGNSHIFT);
1244 lc1 = gpuData[0] & 0xffffff;
1246 DrawSemiTrans = (SEMITRANSBIT(GETLE32(&gpuData[0]))) ? TRUE : FALSE;
1248 while(!(((GETLE32(&gpuData[i]) & 0xF000F000) == 0x50005000) && i>=4))
1250 sly0=sly1; slx0=slx1; lc0=lc1;
1251 lc1=GETLE32(&gpuData[i]) & 0xffffff;
1255 // no check needed on gshaded polyline positions
1256 // if((gpuData[i] & 0xF000F000) == 0x50005000) break;
1258 sly1 = (short)((GETLE32(&gpuData[i])>>16) & 0xffff);
1259 slx1 = (short)(GETLE32(&gpuData[i]) & 0xffff);
1263 slx1=(short)(((int)slx1<<SIGNSHIFT)>>SIGNSHIFT);
1264 sly1=(short)(((int)sly1<<SIGNSHIFT)>>SIGNSHIFT);
1265 if(CheckCoordL(slx0,sly0,slx1,sly1)) bDraw=FALSE; else bDraw=TRUE;
1268 if ((lx0 != lx1) || (ly0 != ly1))
1276 if(bDraw) DrawSoftwareLineShade(lc0, lc1);
1282 bDoVSyncUpdate=TRUE;
1285 ////////////////////////////////////////////////////////////////////////
1286 // cmd: shaded polyline2
1287 ////////////////////////////////////////////////////////////////////////
1289 static void primLineG2(unsigned char *baseAddr)
1291 uint32_t *gpuData = ((uint32_t *) baseAddr);
1292 short *sgpuData = ((short *) baseAddr);
1294 lx0 = GETLEs16(&sgpuData[2]);
1295 ly0 = GETLEs16(&sgpuData[3]);
1296 lx1 = GETLEs16(&sgpuData[6]);
1297 ly1 = GETLEs16(&sgpuData[7]);
1302 if(CheckCoord2()) return;
1305 if((lx0 == lx1) && (ly0 == ly1)) {lx1++;ly1++;}
1307 DrawSemiTrans = (SEMITRANSBIT(GETLE32(&gpuData[0]))) ? TRUE : FALSE;
1309 DrawSoftwareLineShade(GETLE32(&gpuData[0]),GETLE32(&gpuData[2]));
1311 bDoVSyncUpdate=TRUE;
1314 ////////////////////////////////////////////////////////////////////////
1315 // cmd: skipping flat polylines
1316 ////////////////////////////////////////////////////////////////////////
1318 static void primLineFSkip(unsigned char *baseAddr)
1320 uint32_t *gpuData = ((uint32_t *) baseAddr);
1323 ly1 = (short)((GETLE32(&gpuData[1])>>16) & 0xffff);
1324 lx1 = (short)(GETLE32(&gpuData[1]) & 0xffff);
1326 while(!(((GETLE32(&gpuData[i]) & 0xF000F000) == 0x50005000) && i>=3))
1328 ly1 = (short)((GETLE32(&gpuData[i])>>16) & 0xffff);
1329 lx1 = (short)(GETLE32(&gpuData[i]) & 0xffff);
1330 i++;if(i>iMax) break;
1334 ////////////////////////////////////////////////////////////////////////
1335 // cmd: drawing flat polylines
1336 ////////////////////////////////////////////////////////////////////////
1338 static void primLineFEx(unsigned char *baseAddr)
1340 uint32_t *gpuData = ((uint32_t *) baseAddr);
1342 short slx0,slx1,sly0,sly1;int i=2;BOOL bDraw=TRUE;
1346 sly1 = (short)((GETLE32(&gpuData[1])>>16) & 0xffff);
1347 slx1 = (short)(GETLE32(&gpuData[1]) & 0xffff);
1350 slx1=(short)(((int)slx1<<SIGNSHIFT)>>SIGNSHIFT);
1351 sly1=(short)(((int)sly1<<SIGNSHIFT)>>SIGNSHIFT);
1354 SetRenderMode(GETLE32(&gpuData[0]));
1356 while(!(((GETLE32(&gpuData[i]) & 0xF000F000) == 0x50005000) && i>=3))
1358 sly0 = sly1;slx0=slx1;
1359 sly1 = (short)((GETLE32(&gpuData[i])>>16) & 0xffff);
1360 slx1 = (short)(GETLE32(&gpuData[i]) & 0xffff);
1363 slx1=(short)(((int)slx1<<SIGNSHIFT)>>SIGNSHIFT);
1364 sly1=(short)(((int)sly1<<SIGNSHIFT)>>SIGNSHIFT);
1366 if(CheckCoordL(slx0,sly0,slx1,sly1)) bDraw=FALSE; else bDraw=TRUE;
1375 if(bDraw) DrawSoftwareLineFlat(GETLE32(&gpuData[0]));
1377 i++;if(i>iMax) break;
1380 bDoVSyncUpdate=TRUE;
1383 ////////////////////////////////////////////////////////////////////////
1384 // cmd: drawing flat polyline2
1385 ////////////////////////////////////////////////////////////////////////
1387 static void primLineF2(unsigned char *baseAddr)
1389 uint32_t *gpuData = ((uint32_t *) baseAddr);
1390 short *sgpuData = ((short *) baseAddr);
1392 lx0 = GETLEs16(&sgpuData[2]);
1393 ly0 = GETLEs16(&sgpuData[3]);
1394 lx1 = GETLEs16(&sgpuData[4]);
1395 ly1 = GETLEs16(&sgpuData[5]);
1400 if(CheckCoord2()) return;
1403 if((lx0 == lx1) && (ly0 == ly1)) {lx1++;ly1++;}
1406 SetRenderMode(GETLE32(&gpuData[0]));
1408 DrawSoftwareLineFlat(GETLE32(&gpuData[0]));
1410 bDoVSyncUpdate=TRUE;
1413 ////////////////////////////////////////////////////////////////////////
1414 // cmd: well, easiest command... not implemented
1415 ////////////////////////////////////////////////////////////////////////
1417 static void primNI(unsigned char *bA)
1421 ////////////////////////////////////////////////////////////////////////
1422 // cmd func ptr table
1423 ////////////////////////////////////////////////////////////////////////
1426 void (*primTableJ[256])(unsigned char *) =
1429 primNI,primNI,primBlkFill,primNI,primNI,primNI,primNI,primNI,
1431 primNI,primNI,primNI,primNI,primNI,primNI,primNI,primNI,
1433 primNI,primNI,primNI,primNI,primNI,primNI,primNI,primNI,
1435 primNI,primNI,primNI,primNI,primNI,primNI,primNI,primNI,
1437 primPolyF3,primPolyF3,primPolyF3,primPolyF3,primPolyFT3,primPolyFT3,primPolyFT3,primPolyFT3,
1439 primPolyF4,primPolyF4,primPolyF4,primPolyF4,primPolyFT4,primPolyFT4,primPolyFT4,primPolyFT4,
1441 primPolyG3,primPolyG3,primPolyG3,primPolyG3,primPolyGT3,primPolyGT3,primPolyGT3,primPolyGT3,
1443 primPolyG4,primPolyG4,primPolyG4,primPolyG4,primPolyGT4,primPolyGT4,primPolyGT4,primPolyGT4,
1445 primLineF2,primLineF2,primLineF2,primLineF2,primNI,primNI,primNI,primNI,
1447 primLineFEx,primLineFEx,primLineFEx,primLineFEx,primLineFEx,primLineFEx,primLineFEx,primLineFEx,
1449 primLineG2,primLineG2,primLineG2,primLineG2,primNI,primNI,primNI,primNI,
1451 primLineGEx,primLineGEx,primLineGEx,primLineGEx,primLineGEx,primLineGEx,primLineGEx,primLineGEx,
1453 primTileS,primTileS,primTileS,primTileS,primSprtS,primSprtS,primSprtS,primSprtS,
1455 primTile1,primTile1,primTile1,primTile1,primNI,primNI,primNI,primNI,
1457 primTile8,primTile8,primTile8,primTile8,primSprt8,primSprt8,primSprt8,primSprt8,
1459 primTile16,primTile16,primTile16,primTile16,primSprt16,primSprt16,primSprt16,primSprt16,
1461 primMoveImage,primNI,primNI,primNI,primNI,primNI,primNI,primNI,
1463 primNI,primNI,primNI,primNI,primNI,primNI,primNI,primNI,
1465 primNI,primNI,primNI,primNI,primNI,primNI,primNI,primNI,
1467 primNI,primNI,primNI,primNI,primNI,primNI,primNI,primNI,
1469 primLoadImage,primNI,primNI,primNI,primNI,primNI,primNI,primNI,
1471 primNI,primNI,primNI,primNI,primNI,primNI,primNI,primNI,
1473 primNI,primNI,primNI,primNI,primNI,primNI,primNI,primNI,
1475 primNI,primNI,primNI,primNI,primNI,primNI,primNI,primNI,
1477 primStoreImage,primNI,primNI,primNI,primNI,primNI,primNI,primNI,
1479 primNI,primNI,primNI,primNI,primNI,primNI,primNI,primNI,
1481 primNI,primNI,primNI,primNI,primNI,primNI,primNI,primNI,
1483 primNI,primNI,primNI,primNI,primNI,primNI,primNI,primNI,
1485 primNI,cmdTexturePage,cmdTextureWindow,cmdDrawAreaStart,cmdDrawAreaEnd,cmdDrawOffset,cmdSTP,primNI,
1487 primNI,primNI,primNI,primNI,primNI,primNI,primNI,primNI,
1489 primNI,primNI,primNI,primNI,primNI,primNI,primNI,primNI,
1491 primNI,primNI,primNI,primNI,primNI,primNI,primNI,primNI
1494 ////////////////////////////////////////////////////////////////////////
1495 // cmd func ptr table for skipping
1496 ////////////////////////////////////////////////////////////////////////
1498 void (*primTableSkip[256])(unsigned char *) =
1501 primNI,primNI,primBlkFill,primNI,primNI,primNI,primNI,primNI,
1503 primNI,primNI,primNI,primNI,primNI,primNI,primNI,primNI,
1505 primNI,primNI,primNI,primNI,primNI,primNI,primNI,primNI,
1507 primNI,primNI,primNI,primNI,primNI,primNI,primNI,primNI,
1509 primNI,primNI,primNI,primNI,primNI,primNI,primNI,primNI,
1511 primNI,primNI,primNI,primNI,primNI,primNI,primNI,primNI,
1513 primNI,primNI,primNI,primNI,primNI,primNI,primNI,primNI,
1515 primNI,primNI,primNI,primNI,primNI,primNI,primNI,primNI,
1517 primNI,primNI,primNI,primNI,primNI,primNI,primNI,primNI,
1519 primLineFSkip,primLineFSkip,primLineFSkip,primLineFSkip,primLineFSkip,primLineFSkip,primLineFSkip,primLineFSkip,
1521 primNI,primNI,primNI,primNI,primNI,primNI,primNI,primNI,
1523 primLineGSkip,primLineGSkip,primLineGSkip,primLineGSkip,primLineGSkip,primLineGSkip,primLineGSkip,primLineGSkip,
1525 primNI,primNI,primNI,primNI,primNI,primNI,primNI,primNI,
1527 primNI,primNI,primNI,primNI,primNI,primNI,primNI,primNI,
1529 primNI,primNI,primNI,primNI,primNI,primNI,primNI,primNI,
1531 primNI,primNI,primNI,primNI,primNI,primNI,primNI,primNI,
1533 primMoveImage,primNI,primNI,primNI,primNI,primNI,primNI,primNI,
1535 primNI,primNI,primNI,primNI,primNI,primNI,primNI,primNI,
1537 primNI,primNI,primNI,primNI,primNI,primNI,primNI,primNI,
1539 primNI,primNI,primNI,primNI,primNI,primNI,primNI,primNI,
1541 primLoadImage,primNI,primNI,primNI,primNI,primNI,primNI,primNI,
1543 primNI,primNI,primNI,primNI,primNI,primNI,primNI,primNI,
1545 primNI,primNI,primNI,primNI,primNI,primNI,primNI,primNI,
1547 primNI,primNI,primNI,primNI,primNI,primNI,primNI,primNI,
1549 primStoreImage,primNI,primNI,primNI,primNI,primNI,primNI,primNI,
1551 primNI,primNI,primNI,primNI,primNI,primNI,primNI,primNI,
1553 primNI,primNI,primNI,primNI,primNI,primNI,primNI,primNI,
1555 primNI,primNI,primNI,primNI,primNI,primNI,primNI,primNI,
1557 primNI,cmdTexturePage,cmdTextureWindow,cmdDrawAreaStart,cmdDrawAreaEnd,cmdDrawOffset,cmdSTP,primNI,
1559 primNI,primNI,primNI,primNI,primNI,primNI,primNI,primNI,
1561 primNI,primNI,primNI,primNI,primNI,primNI,primNI,primNI,
1563 primNI,primNI,primNI,primNI,primNI,primNI,primNI,primNI