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
379 // Texture window size is determined by the least bit set of the relevant 5 bits
382 TWin.Position.x1 = 8; // xxxx1
383 else if (gdata & 0x002)
384 TWin.Position.x1 = 16; // xxx10
385 else if (gdata & 0x004)
386 TWin.Position.x1 = 32; // xx100
387 else if (gdata & 0x008)
388 TWin.Position.x1 = 64; // x1000
389 else if (gdata & 0x010)
390 TWin.Position.x1 = 128; // 10000
392 TWin.Position.x1 = 256; // 00000
394 // Re-calculate the bit field, because we can't trust what is passed in the data
397 YAlign = (uint32_t)(32 - (TWin.Position.y1 >> 3));
398 XAlign = (uint32_t)(32 - (TWin.Position.x1 >> 3));
400 // Absolute position of the start of the texture window
402 TWin.Position.y0 = (short)(((gdata >> 15) & YAlign) << 3);
403 TWin.Position.x0 = (short)(((gdata >> 10) & XAlign) << 3);
405 if((TWin.Position.x0 == 0 && // tw turned off
406 TWin.Position.y0 == 0 &&
407 TWin.Position.x1 == 0 &&
408 TWin.Position.y1 == 0) ||
409 (TWin.Position.x1 == 256 &&
410 TWin.Position.y1 == 256))
412 bUsingTWin = FALSE; // -> just do it
416 bUsingTWin = TRUE; // -> tw turned on
420 ////////////////////////////////////////////////////////////////////////
421 // cmd: start of drawing area... primitives will be clipped inside
422 ////////////////////////////////////////////////////////////////////////
426 static void cmdDrawAreaStart(unsigned char * baseAddr)
428 uint32_t gdata = GETLE32(&((uint32_t*)baseAddr)[0]);
430 drawX = gdata & 0x3ff; // for soft drawing
432 lGPUInfoVals[INFO_DRAWSTART]=gdata&0xFFFFF;
433 drawY = (gdata>>10)&0x3ff;
434 if(drawY>=512) drawY=511; // some security
437 ////////////////////////////////////////////////////////////////////////
438 // cmd: end of drawing area... primitives will be clipped inside
439 ////////////////////////////////////////////////////////////////////////
441 static void cmdDrawAreaEnd(unsigned char * baseAddr)
443 uint32_t gdata = GETLE32(&((uint32_t*)baseAddr)[0]);
445 drawW = gdata & 0x3ff; // for soft drawing
447 lGPUInfoVals[INFO_DRAWEND]=gdata&0xFFFFF;
448 drawH = (gdata>>10)&0x3ff;
449 if(drawH>=512) drawH=511; // some security
452 ////////////////////////////////////////////////////////////////////////
453 // cmd: draw offset... will be added to prim coords
454 ////////////////////////////////////////////////////////////////////////
456 static void cmdDrawOffset(unsigned char * baseAddr)
458 uint32_t gdata = GETLE32(&((uint32_t*)baseAddr)[0]);
460 PSXDisplay.DrawOffset.x = (short)(gdata & 0x7ff);
462 lGPUInfoVals[INFO_DRAWOFF]=gdata&0x3FFFFF;
463 PSXDisplay.DrawOffset.y = (short)((gdata>>11) & 0x7ff);
465 PSXDisplay.DrawOffset.y=(short)(((int)PSXDisplay.DrawOffset.y<<21)>>21);
466 PSXDisplay.DrawOffset.x=(short)(((int)PSXDisplay.DrawOffset.x<<21)>>21);
469 ////////////////////////////////////////////////////////////////////////
470 // cmd: load image to vram
471 ////////////////////////////////////////////////////////////////////////
473 static void primLoadImage(unsigned char * baseAddr)
475 unsigned short *sgpuData = ((unsigned short *) baseAddr);
477 VRAMWrite.x = GETLEs16(&sgpuData[2])&0x3ff;
478 VRAMWrite.y = GETLEs16(&sgpuData[3])&511;
479 VRAMWrite.Width = GETLEs16(&sgpuData[4]);
480 VRAMWrite.Height = GETLEs16(&sgpuData[5]);
482 DataWriteMode = DR_VRAMTRANSFER;
484 VRAMWrite.ImagePtr = psxVuw + (VRAMWrite.y<<10) + VRAMWrite.x;
485 VRAMWrite.RowsRemaining = VRAMWrite.Width;
486 VRAMWrite.ColsRemaining = VRAMWrite.Height;
489 ////////////////////////////////////////////////////////////////////////
490 // cmd: vram -> psx mem
491 ////////////////////////////////////////////////////////////////////////
493 static void primStoreImage(unsigned char * baseAddr)
495 unsigned short *sgpuData = ((unsigned short *) baseAddr);
497 VRAMRead.x = GETLEs16(&sgpuData[2])&0x03ff;
498 VRAMRead.y = GETLEs16(&sgpuData[3])&511;
499 VRAMRead.Width = GETLEs16(&sgpuData[4]);
500 VRAMRead.Height = GETLEs16(&sgpuData[5]);
502 VRAMRead.ImagePtr = psxVuw + (VRAMRead.y<<10) + VRAMRead.x;
503 VRAMRead.RowsRemaining = VRAMRead.Width;
504 VRAMRead.ColsRemaining = VRAMRead.Height;
506 DataReadMode = DR_VRAMTRANSFER;
508 lGPUstatusRet |= GPUSTATUS_READYFORVRAM;
511 ////////////////////////////////////////////////////////////////////////
512 // cmd: blkfill - NO primitive! Doesn't care about draw areas...
513 ////////////////////////////////////////////////////////////////////////
515 static void primBlkFill(unsigned char * baseAddr)
517 uint32_t *gpuData = ((uint32_t *) baseAddr);
518 short *sgpuData = ((short *) baseAddr);
520 short sX = GETLEs16(&sgpuData[2]);
521 short sY = GETLEs16(&sgpuData[3]);
522 short sW = GETLEs16(&sgpuData[4]) & 0x3ff;
523 short sH = GETLEs16(&sgpuData[5]) & 0x3ff;
527 // Increase H & W if they are one short of full values, because they never can be full values
528 if (sH >= 1023) sH=1024;
529 if (sW >= 1023) sW=1024;
531 // x and y of end pos
535 FillSoftwareArea(sX, sY, sW, sH, BGR24to16(GETLE32(&gpuData[0])));
540 ////////////////////////////////////////////////////////////////////////
541 // cmd: move image vram -> vram
542 ////////////////////////////////////////////////////////////////////////
544 static void primMoveImage(unsigned char * baseAddr)
546 short *sgpuData = ((short *) baseAddr);
548 short imageY0,imageX0,imageY1,imageX1,imageSX,imageSY,i,j;
550 imageX0 = GETLEs16(&sgpuData[2])&0x03ff;
551 imageY0 = GETLEs16(&sgpuData[3])&511;
552 imageX1 = GETLEs16(&sgpuData[4])&0x03ff;
553 imageY1 = GETLEs16(&sgpuData[5])&511;
554 imageSX = GETLEs16(&sgpuData[6]);
555 imageSY = GETLEs16(&sgpuData[7]);
557 if((imageX0 == imageX1) && (imageY0 == imageY1)) return;
558 if(imageSX<=0) return;
559 if(imageSY<=0) return;
561 if((imageY0+imageSY)>512 ||
562 (imageX0+imageSX)>1024 ||
563 (imageY1+imageSY)>512 ||
564 (imageX1+imageSX)>1024)
567 for(j=0;j<imageSY;j++)
568 for(i=0;i<imageSX;i++)
569 psxVuw [(1024*((imageY1+j)&511))+((imageX1+i)&0x3ff)]=
570 psxVuw[(1024*((imageY0+j)&511))+((imageX0+i)&0x3ff)];
577 if(imageSX&1) // not dword aligned? slower func
579 unsigned short *SRCPtr, *DSTPtr;
580 unsigned short LineOffset;
582 SRCPtr = psxVuw + (1024*imageY0) + imageX0;
583 DSTPtr = psxVuw + (1024*imageY1) + imageX1;
585 LineOffset = 1024 - imageSX;
587 for(j=0;j<imageSY;j++)
589 for(i=0;i<imageSX;i++) *DSTPtr++ = *SRCPtr++;
590 SRCPtr += LineOffset;
591 DSTPtr += LineOffset;
594 else // dword aligned
596 uint32_t *SRCPtr, *DSTPtr;
597 unsigned short LineOffset;
600 SRCPtr = (uint32_t *)(psxVuw + (1024*imageY0) + imageX0);
601 DSTPtr = (uint32_t *)(psxVuw + (1024*imageY1) + imageX1);
603 LineOffset = 512 - dx;
605 for(j=0;j<imageSY;j++)
607 for(i=0;i<dx;i++) *DSTPtr++ = *SRCPtr++;
608 SRCPtr += LineOffset;
609 DSTPtr += LineOffset;
619 ////////////////////////////////////////////////////////////////////////
620 // cmd: draw free-size Tile
621 ////////////////////////////////////////////////////////////////////////
623 static void primTileS(unsigned char * baseAddr)
625 uint32_t *gpuData = ((uint32_t*)baseAddr);
626 short *sgpuData = ((short *) baseAddr);
627 short sW = GETLEs16(&sgpuData[4]) & 0x3ff;
628 short sH = GETLEs16(&sgpuData[5]) & 511; // mmm... limit tiles to 0x1ff or height?
630 lx0 = GETLEs16(&sgpuData[2]);
631 ly0 = GETLEs16(&sgpuData[3]);
633 if(!(dwActFixes&8)) AdjustCoord1();
636 ly2 = ly3 = ly0+sH +PSXDisplay.DrawOffset.y;
637 ly0 = ly1 = ly0 +PSXDisplay.DrawOffset.y;
638 lx1 = lx2 = lx0+sW +PSXDisplay.DrawOffset.x;
639 lx0 = lx3 = lx0 +PSXDisplay.DrawOffset.x;
641 DrawSemiTrans = (SEMITRANSBIT(GETLE32(&gpuData[0]))) ? TRUE : FALSE;
643 FillSoftwareAreaTrans(lx0,ly0,lx2,ly2,
644 BGR24to16(GETLE32(&gpuData[0])));
649 ////////////////////////////////////////////////////////////////////////
650 // cmd: draw 1 dot Tile (point)
651 ////////////////////////////////////////////////////////////////////////
653 static void primTile1(unsigned char * baseAddr)
655 uint32_t *gpuData = ((uint32_t*)baseAddr);
656 short *sgpuData = ((short *) baseAddr);
660 lx0 = GETLEs16(&sgpuData[2]);
661 ly0 = GETLEs16(&sgpuData[3]);
663 if(!(dwActFixes&8)) AdjustCoord1();
666 ly2 = ly3 = ly0+sH +PSXDisplay.DrawOffset.y;
667 ly0 = ly1 = ly0 +PSXDisplay.DrawOffset.y;
668 lx1 = lx2 = lx0+sW +PSXDisplay.DrawOffset.x;
669 lx0 = lx3 = lx0 +PSXDisplay.DrawOffset.x;
671 DrawSemiTrans = (SEMITRANSBIT(GETLE32(&gpuData[0]))) ? TRUE : FALSE;
673 FillSoftwareAreaTrans(lx0,ly0,lx2,ly2,
674 BGR24to16(GETLE32(&gpuData[0]))); // Takes Start and Offset
679 ////////////////////////////////////////////////////////////////////////
680 // cmd: draw 8 dot Tile (small rect)
681 ////////////////////////////////////////////////////////////////////////
683 static void primTile8(unsigned char * baseAddr)
685 uint32_t *gpuData = ((uint32_t*)baseAddr);
686 short *sgpuData = ((short *) baseAddr);
690 lx0 = GETLEs16(&sgpuData[2]);
691 ly0 = GETLEs16(&sgpuData[3]);
693 if(!(dwActFixes&8)) AdjustCoord1();
696 ly2 = ly3 = ly0+sH +PSXDisplay.DrawOffset.y;
697 ly0 = ly1 = ly0 +PSXDisplay.DrawOffset.y;
698 lx1 = lx2 = lx0+sW +PSXDisplay.DrawOffset.x;
699 lx0 = lx3 = lx0 +PSXDisplay.DrawOffset.x;
701 DrawSemiTrans = (SEMITRANSBIT(GETLE32(&gpuData[0]))) ? TRUE : FALSE;
703 FillSoftwareAreaTrans(lx0,ly0,lx2,ly2,
704 BGR24to16(GETLE32(&gpuData[0]))); // Takes Start and Offset
709 ////////////////////////////////////////////////////////////////////////
710 // cmd: draw 16 dot Tile (medium rect)
711 ////////////////////////////////////////////////////////////////////////
713 static void primTile16(unsigned char * baseAddr)
715 uint32_t *gpuData = ((uint32_t*)baseAddr);
716 short *sgpuData = ((short *) baseAddr);
720 lx0 = GETLEs16(&sgpuData[2]);
721 ly0 = GETLEs16(&sgpuData[3]);
723 if(!(dwActFixes&8)) AdjustCoord1();
726 ly2 = ly3 = ly0+sH +PSXDisplay.DrawOffset.y;
727 ly0 = ly1 = ly0 +PSXDisplay.DrawOffset.y;
728 lx1 = lx2 = lx0+sW +PSXDisplay.DrawOffset.x;
729 lx0 = lx3 = lx0 +PSXDisplay.DrawOffset.x;
731 DrawSemiTrans = (SEMITRANSBIT(GETLE32(&gpuData[0]))) ? TRUE : FALSE;
733 FillSoftwareAreaTrans(lx0,ly0,lx2,ly2,
734 BGR24to16(GETLE32(&gpuData[0]))); // Takes Start and Offset
739 ////////////////////////////////////////////////////////////////////////
740 // cmd: small sprite (textured rect)
741 ////////////////////////////////////////////////////////////////////////
743 static void primSprt8(unsigned char * baseAddr)
745 uint32_t *gpuData = ((uint32_t *) baseAddr);
746 short *sgpuData = ((short *) baseAddr);
748 lx0 = GETLEs16(&sgpuData[2]);
749 ly0 = GETLEs16(&sgpuData[3]);
751 if(!(dwActFixes&8)) AdjustCoord1();
753 SetRenderMode(GETLE32(&gpuData[0]));
755 if(bUsingTWin) DrawSoftwareSpriteTWin(baseAddr,8,8);
757 if(usMirror) DrawSoftwareSpriteMirror(baseAddr,8,8);
758 else DrawSoftwareSprite(baseAddr,8,8,
765 ////////////////////////////////////////////////////////////////////////
766 // cmd: medium sprite (textured rect)
767 ////////////////////////////////////////////////////////////////////////
769 static void primSprt16(unsigned char * baseAddr)
771 uint32_t *gpuData = ((uint32_t *) baseAddr);
772 short *sgpuData = ((short *) baseAddr);
774 lx0 = GETLEs16(&sgpuData[2]);
775 ly0 = GETLEs16(&sgpuData[3]);
777 if(!(dwActFixes&8)) AdjustCoord1();
779 SetRenderMode(GETLE32(&gpuData[0]));
781 if(bUsingTWin) DrawSoftwareSpriteTWin(baseAddr,16,16);
783 if(usMirror) DrawSoftwareSpriteMirror(baseAddr,16,16);
784 else DrawSoftwareSprite(baseAddr,16,16,
791 ////////////////////////////////////////////////////////////////////////
792 // cmd: free-size sprite (textured rect)
793 ////////////////////////////////////////////////////////////////////////
795 // func used on texture coord wrap
796 static void primSprtSRest(unsigned char * baseAddr,unsigned short type)
798 uint32_t *gpuData = ((uint32_t *) baseAddr);
799 short *sgpuData = ((short *) baseAddr);
800 unsigned short sTypeRest=0;
803 short sX = GETLEs16(&sgpuData[2]);
804 short sY = GETLEs16(&sgpuData[3]);
805 short sW = GETLEs16(&sgpuData[6]) & 0x3ff;
806 short sH = GETLEs16(&sgpuData[7]) & 0x1ff;
807 short tX = baseAddr[8];
808 short tY = baseAddr[9];
858 SetRenderMode(GETLE32(&gpuData[0]));
860 if(tX+sW>256) {sW=256-tX;sTypeRest+=1;}
861 if(tY+sH>256) {sH=256-tY;sTypeRest+=2;}
866 if(!(dwActFixes&8)) AdjustCoord1();
868 DrawSoftwareSprite(baseAddr,sW,sH,tX,tY);
870 if(sTypeRest && type<4)
872 if(sTypeRest&1 && type==1) primSprtSRest(baseAddr,4);
873 if(sTypeRest&2 && type==2) primSprtSRest(baseAddr,5);
874 if(sTypeRest==3 && type==3) primSprtSRest(baseAddr,6);
879 ////////////////////////////////////////////////////////////////////////
881 static void primSprtS(unsigned char * baseAddr)
883 uint32_t *gpuData = ((uint32_t *) baseAddr);
884 short *sgpuData = ((short *) baseAddr);
887 lx0 = GETLEs16(&sgpuData[2]);
888 ly0 = GETLEs16(&sgpuData[3]);
890 if(!(dwActFixes&8)) AdjustCoord1();
892 sW = GETLEs16(&sgpuData[6]) & 0x3ff;
893 sH = GETLEs16(&sgpuData[7]) & 0x1ff;
895 SetRenderMode(GETLE32(&gpuData[0]));
897 if(bUsingTWin) DrawSoftwareSpriteTWin(baseAddr,sW,sH);
899 if(usMirror) DrawSoftwareSpriteMirror(baseAddr,sW,sH);
902 unsigned short sTypeRest=0;
903 short tX=baseAddr[8];
904 short tY=baseAddr[9];
906 if(tX+sW>256) {sW=256-tX;sTypeRest+=1;}
907 if(tY+sH>256) {sH=256-tY;sTypeRest+=2;}
909 DrawSoftwareSprite(baseAddr,sW,sH,tX,tY);
913 if(sTypeRest&1) primSprtSRest(baseAddr,1);
914 if(sTypeRest&2) primSprtSRest(baseAddr,2);
915 if(sTypeRest==3) primSprtSRest(baseAddr,3);
923 ////////////////////////////////////////////////////////////////////////
924 // cmd: flat shaded Poly4
925 ////////////////////////////////////////////////////////////////////////
927 static void primPolyF4(unsigned char *baseAddr)
929 uint32_t *gpuData = ((uint32_t *) baseAddr);
930 short *sgpuData = ((short *) baseAddr);
932 lx0 = GETLEs16(&sgpuData[2]);
933 ly0 = GETLEs16(&sgpuData[3]);
934 lx1 = GETLEs16(&sgpuData[4]);
935 ly1 = GETLEs16(&sgpuData[5]);
936 lx2 = GETLEs16(&sgpuData[6]);
937 ly2 = GETLEs16(&sgpuData[7]);
938 lx3 = GETLEs16(&sgpuData[8]);
939 ly3 = GETLEs16(&sgpuData[9]);
944 if(CheckCoord4()) return;
948 DrawSemiTrans = (SEMITRANSBIT(GETLE32(&gpuData[0]))) ? TRUE : FALSE;
950 drawPoly4F(GETLE32(&gpuData[0]));
955 ////////////////////////////////////////////////////////////////////////
956 // cmd: smooth shaded Poly4
957 ////////////////////////////////////////////////////////////////////////
959 static void primPolyG4(unsigned char * baseAddr)
961 uint32_t *gpuData = (uint32_t *)baseAddr;
962 short *sgpuData = ((short *) baseAddr);
964 lx0 = GETLEs16(&sgpuData[2]);
965 ly0 = GETLEs16(&sgpuData[3]);
966 lx1 = GETLEs16(&sgpuData[6]);
967 ly1 = GETLEs16(&sgpuData[7]);
968 lx2 = GETLEs16(&sgpuData[10]);
969 ly2 = GETLEs16(&sgpuData[11]);
970 lx3 = GETLEs16(&sgpuData[14]);
971 ly3 = GETLEs16(&sgpuData[15]);
976 if(CheckCoord4()) return;
980 DrawSemiTrans = (SEMITRANSBIT(GETLE32(&gpuData[0]))) ? TRUE : FALSE;
982 drawPoly4G(GETLE32(&gpuData[0]), GETLE32(&gpuData[2]),
983 GETLE32(&gpuData[4]), GETLE32(&gpuData[6]));
988 ////////////////////////////////////////////////////////////////////////
989 // cmd: flat shaded Texture3
990 ////////////////////////////////////////////////////////////////////////
992 static void primPolyFT3(unsigned char * baseAddr)
994 uint32_t *gpuData = ((uint32_t *) baseAddr);
995 short *sgpuData = ((short *) baseAddr);
997 lx0 = GETLEs16(&sgpuData[2]);
998 ly0 = GETLEs16(&sgpuData[3]);
999 lx1 = GETLEs16(&sgpuData[6]);
1000 ly1 = GETLEs16(&sgpuData[7]);
1001 lx2 = GETLEs16(&sgpuData[10]);
1002 ly2 = GETLEs16(&sgpuData[11]);
1004 lLowerpart=GETLE32(&gpuData[4])>>16;
1005 UpdateGlobalTP((unsigned short)lLowerpart);
1010 if(CheckCoord3()) return;
1014 SetRenderMode(GETLE32(&gpuData[0]));
1016 drawPoly3FT(baseAddr);
1018 bDoVSyncUpdate=TRUE;
1021 ////////////////////////////////////////////////////////////////////////
1022 // cmd: flat shaded Texture4
1023 ////////////////////////////////////////////////////////////////////////
1025 static void primPolyFT4(unsigned char * baseAddr)
1027 uint32_t *gpuData = ((uint32_t *) baseAddr);
1028 short *sgpuData = ((short *) baseAddr);
1030 lx0 = GETLEs16(&sgpuData[2]);
1031 ly0 = GETLEs16(&sgpuData[3]);
1032 lx1 = GETLEs16(&sgpuData[6]);
1033 ly1 = GETLEs16(&sgpuData[7]);
1034 lx2 = GETLEs16(&sgpuData[10]);
1035 ly2 = GETLEs16(&sgpuData[11]);
1036 lx3 = GETLEs16(&sgpuData[14]);
1037 ly3 = GETLEs16(&sgpuData[15]);
1039 lLowerpart=GETLE32(&gpuData[4])>>16;
1040 UpdateGlobalTP((unsigned short)lLowerpart);
1045 if(CheckCoord4()) return;
1050 SetRenderMode(GETLE32(&gpuData[0]));
1052 drawPoly4FT(baseAddr);
1054 bDoVSyncUpdate=TRUE;
1057 ////////////////////////////////////////////////////////////////////////
1058 // cmd: smooth shaded Texture3
1059 ////////////////////////////////////////////////////////////////////////
1061 static void primPolyGT3(unsigned char *baseAddr)
1063 uint32_t *gpuData = ((uint32_t *) baseAddr);
1064 short *sgpuData = ((short *) baseAddr);
1066 lx0 = GETLEs16(&sgpuData[2]);
1067 ly0 = GETLEs16(&sgpuData[3]);
1068 lx1 = GETLEs16(&sgpuData[8]);
1069 ly1 = GETLEs16(&sgpuData[9]);
1070 lx2 = GETLEs16(&sgpuData[14]);
1071 ly2 = GETLEs16(&sgpuData[15]);
1073 lLowerpart=GETLE32(&gpuData[5])>>16;
1074 UpdateGlobalTP((unsigned short)lLowerpart);
1079 if(CheckCoord3()) return;
1083 DrawSemiTrans = (SEMITRANSBIT(GETLE32(&gpuData[0]))) ? TRUE : FALSE;
1085 if(SHADETEXBIT(GETLE32(&gpuData[0])))
1087 gpuData[0] = (gpuData[0]&HOST2LE32(0xff000000))|HOST2LE32(0x00808080);
1088 gpuData[3] = (gpuData[3]&HOST2LE32(0xff000000))|HOST2LE32(0x00808080);
1089 gpuData[6] = (gpuData[6]&HOST2LE32(0xff000000))|HOST2LE32(0x00808080);
1092 drawPoly3GT(baseAddr);
1094 bDoVSyncUpdate=TRUE;
1097 ////////////////////////////////////////////////////////////////////////
1098 // cmd: smooth shaded Poly3
1099 ////////////////////////////////////////////////////////////////////////
1101 static void primPolyG3(unsigned char *baseAddr)
1103 uint32_t *gpuData = ((uint32_t *) baseAddr);
1104 short *sgpuData = ((short *) baseAddr);
1106 lx0 = GETLEs16(&sgpuData[2]);
1107 ly0 = GETLEs16(&sgpuData[3]);
1108 lx1 = GETLEs16(&sgpuData[6]);
1109 ly1 = GETLEs16(&sgpuData[7]);
1110 lx2 = GETLEs16(&sgpuData[10]);
1111 ly2 = GETLEs16(&sgpuData[11]);
1116 if(CheckCoord3()) return;
1120 DrawSemiTrans = (SEMITRANSBIT(GETLE32(&gpuData[0]))) ? TRUE : FALSE;
1122 drawPoly3G(GETLE32(&gpuData[0]), GETLE32(&gpuData[2]), GETLE32(&gpuData[4]));
1124 bDoVSyncUpdate=TRUE;
1127 ////////////////////////////////////////////////////////////////////////
1128 // cmd: smooth shaded Texture4
1129 ////////////////////////////////////////////////////////////////////////
1131 static void primPolyGT4(unsigned char *baseAddr)
1133 uint32_t *gpuData = ((uint32_t *) baseAddr);
1134 short *sgpuData = ((short *) baseAddr);
1136 lx0 = GETLEs16(&sgpuData[2]);
1137 ly0 = GETLEs16(&sgpuData[3]);
1138 lx1 = GETLEs16(&sgpuData[8]);
1139 ly1 = GETLEs16(&sgpuData[9]);
1140 lx2 = GETLEs16(&sgpuData[14]);
1141 ly2 = GETLEs16(&sgpuData[15]);
1142 lx3 = GETLEs16(&sgpuData[20]);
1143 ly3 = GETLEs16(&sgpuData[21]);
1145 lLowerpart=GETLE32(&gpuData[5])>>16;
1146 UpdateGlobalTP((unsigned short)lLowerpart);
1151 if(CheckCoord4()) return;
1155 DrawSemiTrans = (SEMITRANSBIT(GETLE32(&gpuData[0]))) ? TRUE : FALSE;
1157 if(SHADETEXBIT(GETLE32(&gpuData[0])))
1159 gpuData[0] = (gpuData[0]&HOST2LE32(0xff000000))|HOST2LE32(0x00808080);
1160 gpuData[3] = (gpuData[3]&HOST2LE32(0xff000000))|HOST2LE32(0x00808080);
1161 gpuData[6] = (gpuData[6]&HOST2LE32(0xff000000))|HOST2LE32(0x00808080);
1162 gpuData[9] = (gpuData[9]&HOST2LE32(0xff000000))|HOST2LE32(0x00808080);
1165 drawPoly4GT(baseAddr);
1167 bDoVSyncUpdate=TRUE;
1170 ////////////////////////////////////////////////////////////////////////
1171 // cmd: smooth shaded Poly3
1172 ////////////////////////////////////////////////////////////////////////
1174 static void primPolyF3(unsigned char *baseAddr)
1176 uint32_t *gpuData = ((uint32_t *) baseAddr);
1177 short *sgpuData = ((short *) baseAddr);
1179 lx0 = GETLEs16(&sgpuData[2]);
1180 ly0 = GETLEs16(&sgpuData[3]);
1181 lx1 = GETLEs16(&sgpuData[4]);
1182 ly1 = GETLEs16(&sgpuData[5]);
1183 lx2 = GETLEs16(&sgpuData[6]);
1184 ly2 = GETLEs16(&sgpuData[7]);
1189 if(CheckCoord3()) return;
1193 SetRenderMode(GETLE32(&gpuData[0]));
1195 drawPoly3F(GETLE32(&gpuData[0]));
1197 bDoVSyncUpdate=TRUE;
1200 ////////////////////////////////////////////////////////////////////////
1201 // cmd: skipping shaded polylines
1202 ////////////////////////////////////////////////////////////////////////
1204 static void primLineGSkip(unsigned char *baseAddr)
1206 uint32_t *gpuData = ((uint32_t *) baseAddr);
1210 ly1 = (short)((GETLE32(&gpuData[1])>>16) & 0xffff);
1211 lx1 = (short)(GETLE32(&gpuData[1]) & 0xffff);
1213 while(!(((GETLE32(&gpuData[i]) & 0xF000F000) == 0x50005000) && i>=4))
1216 ly1 = (short)((GETLE32(&gpuData[i])>>16) & 0xffff);
1217 lx1 = (short)(GETLE32(&gpuData[i]) & 0xffff);
1218 i++;if(i>iMax) break;
1222 ////////////////////////////////////////////////////////////////////////
1223 // cmd: shaded polylines
1224 ////////////////////////////////////////////////////////////////////////
1226 static void primLineGEx(unsigned char *baseAddr)
1228 uint32_t *gpuData = ((uint32_t *) baseAddr);
1231 short slx0,slx1,sly0,sly1;int i=2;BOOL bDraw=TRUE;
1233 sly1 = (short)((GETLE32(&gpuData[1])>>16) & 0xffff);
1234 slx1 = (short)(GETLE32(&gpuData[1]) & 0xffff);
1238 slx1=(short)(((int)slx1<<SIGNSHIFT)>>SIGNSHIFT);
1239 sly1=(short)(((int)sly1<<SIGNSHIFT)>>SIGNSHIFT);
1242 lc1 = gpuData[0] & 0xffffff;
1244 DrawSemiTrans = (SEMITRANSBIT(GETLE32(&gpuData[0]))) ? TRUE : FALSE;
1246 while(!(((GETLE32(&gpuData[i]) & 0xF000F000) == 0x50005000) && i>=4))
1248 sly0=sly1; slx0=slx1; lc0=lc1;
1249 lc1=GETLE32(&gpuData[i]) & 0xffffff;
1253 // no check needed on gshaded polyline positions
1254 // if((gpuData[i] & 0xF000F000) == 0x50005000) break;
1256 sly1 = (short)((GETLE32(&gpuData[i])>>16) & 0xffff);
1257 slx1 = (short)(GETLE32(&gpuData[i]) & 0xffff);
1261 slx1=(short)(((int)slx1<<SIGNSHIFT)>>SIGNSHIFT);
1262 sly1=(short)(((int)sly1<<SIGNSHIFT)>>SIGNSHIFT);
1263 if(CheckCoordL(slx0,sly0,slx1,sly1)) bDraw=FALSE; else bDraw=TRUE;
1266 if ((lx0 != lx1) || (ly0 != ly1))
1274 if(bDraw) DrawSoftwareLineShade(lc0, lc1);
1280 bDoVSyncUpdate=TRUE;
1283 ////////////////////////////////////////////////////////////////////////
1284 // cmd: shaded polyline2
1285 ////////////////////////////////////////////////////////////////////////
1287 static void primLineG2(unsigned char *baseAddr)
1289 uint32_t *gpuData = ((uint32_t *) baseAddr);
1290 short *sgpuData = ((short *) baseAddr);
1292 lx0 = GETLEs16(&sgpuData[2]);
1293 ly0 = GETLEs16(&sgpuData[3]);
1294 lx1 = GETLEs16(&sgpuData[6]);
1295 ly1 = GETLEs16(&sgpuData[7]);
1300 if(CheckCoord2()) return;
1303 if((lx0 == lx1) && (ly0 == ly1)) {lx1++;ly1++;}
1305 DrawSemiTrans = (SEMITRANSBIT(GETLE32(&gpuData[0]))) ? TRUE : FALSE;
1307 DrawSoftwareLineShade(GETLE32(&gpuData[0]),GETLE32(&gpuData[2]));
1309 bDoVSyncUpdate=TRUE;
1312 ////////////////////////////////////////////////////////////////////////
1313 // cmd: skipping flat polylines
1314 ////////////////////////////////////////////////////////////////////////
1316 static void primLineFSkip(unsigned char *baseAddr)
1318 uint32_t *gpuData = ((uint32_t *) baseAddr);
1321 ly1 = (short)((GETLE32(&gpuData[1])>>16) & 0xffff);
1322 lx1 = (short)(GETLE32(&gpuData[1]) & 0xffff);
1324 while(!(((GETLE32(&gpuData[i]) & 0xF000F000) == 0x50005000) && i>=3))
1326 ly1 = (short)((GETLE32(&gpuData[i])>>16) & 0xffff);
1327 lx1 = (short)(GETLE32(&gpuData[i]) & 0xffff);
1328 i++;if(i>iMax) break;
1332 ////////////////////////////////////////////////////////////////////////
1333 // cmd: drawing flat polylines
1334 ////////////////////////////////////////////////////////////////////////
1336 static void primLineFEx(unsigned char *baseAddr)
1338 uint32_t *gpuData = ((uint32_t *) baseAddr);
1340 short slx0,slx1,sly0,sly1;int i=2;BOOL bDraw=TRUE;
1344 sly1 = (short)((GETLE32(&gpuData[1])>>16) & 0xffff);
1345 slx1 = (short)(GETLE32(&gpuData[1]) & 0xffff);
1348 slx1=(short)(((int)slx1<<SIGNSHIFT)>>SIGNSHIFT);
1349 sly1=(short)(((int)sly1<<SIGNSHIFT)>>SIGNSHIFT);
1352 SetRenderMode(GETLE32(&gpuData[0]));
1354 while(!(((GETLE32(&gpuData[i]) & 0xF000F000) == 0x50005000) && i>=3))
1356 sly0 = sly1;slx0=slx1;
1357 sly1 = (short)((GETLE32(&gpuData[i])>>16) & 0xffff);
1358 slx1 = (short)(GETLE32(&gpuData[i]) & 0xffff);
1361 slx1=(short)(((int)slx1<<SIGNSHIFT)>>SIGNSHIFT);
1362 sly1=(short)(((int)sly1<<SIGNSHIFT)>>SIGNSHIFT);
1364 if(CheckCoordL(slx0,sly0,slx1,sly1)) bDraw=FALSE; else bDraw=TRUE;
1373 if(bDraw) DrawSoftwareLineFlat(GETLE32(&gpuData[0]));
1375 i++;if(i>iMax) break;
1378 bDoVSyncUpdate=TRUE;
1381 ////////////////////////////////////////////////////////////////////////
1382 // cmd: drawing flat polyline2
1383 ////////////////////////////////////////////////////////////////////////
1385 static void primLineF2(unsigned char *baseAddr)
1387 uint32_t *gpuData = ((uint32_t *) baseAddr);
1388 short *sgpuData = ((short *) baseAddr);
1390 lx0 = GETLEs16(&sgpuData[2]);
1391 ly0 = GETLEs16(&sgpuData[3]);
1392 lx1 = GETLEs16(&sgpuData[4]);
1393 ly1 = GETLEs16(&sgpuData[5]);
1398 if(CheckCoord2()) return;
1401 if((lx0 == lx1) && (ly0 == ly1)) {lx1++;ly1++;}
1404 SetRenderMode(GETLE32(&gpuData[0]));
1406 DrawSoftwareLineFlat(GETLE32(&gpuData[0]));
1408 bDoVSyncUpdate=TRUE;
1411 ////////////////////////////////////////////////////////////////////////
1412 // cmd: well, easiest command... not implemented
1413 ////////////////////////////////////////////////////////////////////////
1415 static void primNI(unsigned char *bA)
1419 ////////////////////////////////////////////////////////////////////////
1420 // cmd func ptr table
1421 ////////////////////////////////////////////////////////////////////////
1424 void (*primTableJ[256])(unsigned char *) =
1427 primNI,primNI,primBlkFill,primNI,primNI,primNI,primNI,primNI,
1429 primNI,primNI,primNI,primNI,primNI,primNI,primNI,primNI,
1431 primNI,primNI,primNI,primNI,primNI,primNI,primNI,primNI,
1433 primNI,primNI,primNI,primNI,primNI,primNI,primNI,primNI,
1435 primPolyF3,primPolyF3,primPolyF3,primPolyF3,primPolyFT3,primPolyFT3,primPolyFT3,primPolyFT3,
1437 primPolyF4,primPolyF4,primPolyF4,primPolyF4,primPolyFT4,primPolyFT4,primPolyFT4,primPolyFT4,
1439 primPolyG3,primPolyG3,primPolyG3,primPolyG3,primPolyGT3,primPolyGT3,primPolyGT3,primPolyGT3,
1441 primPolyG4,primPolyG4,primPolyG4,primPolyG4,primPolyGT4,primPolyGT4,primPolyGT4,primPolyGT4,
1443 primLineF2,primLineF2,primLineF2,primLineF2,primNI,primNI,primNI,primNI,
1445 primLineFEx,primLineFEx,primLineFEx,primLineFEx,primLineFEx,primLineFEx,primLineFEx,primLineFEx,
1447 primLineG2,primLineG2,primLineG2,primLineG2,primNI,primNI,primNI,primNI,
1449 primLineGEx,primLineGEx,primLineGEx,primLineGEx,primLineGEx,primLineGEx,primLineGEx,primLineGEx,
1451 primTileS,primTileS,primTileS,primTileS,primSprtS,primSprtS,primSprtS,primSprtS,
1453 primTile1,primTile1,primTile1,primTile1,primNI,primNI,primNI,primNI,
1455 primTile8,primTile8,primTile8,primTile8,primSprt8,primSprt8,primSprt8,primSprt8,
1457 primTile16,primTile16,primTile16,primTile16,primSprt16,primSprt16,primSprt16,primSprt16,
1459 primMoveImage,primNI,primNI,primNI,primNI,primNI,primNI,primNI,
1461 primNI,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 primLoadImage,primNI,primNI,primNI,primNI,primNI,primNI,primNI,
1469 primNI,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 primStoreImage,primNI,primNI,primNI,primNI,primNI,primNI,primNI,
1477 primNI,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,cmdTexturePage,cmdTextureWindow,cmdDrawAreaStart,cmdDrawAreaEnd,cmdDrawOffset,cmdSTP,primNI,
1485 primNI,primNI,primNI,primNI,primNI,primNI,primNI,primNI,
1487 primNI,primNI,primNI,primNI,primNI,primNI,primNI,primNI,
1489 primNI,primNI,primNI,primNI,primNI,primNI,primNI,primNI
1492 ////////////////////////////////////////////////////////////////////////
1493 // cmd func ptr table for skipping
1494 ////////////////////////////////////////////////////////////////////////
1496 void (*primTableSkip[256])(unsigned char *) =
1499 primNI,primNI,primBlkFill,primNI,primNI,primNI,primNI,primNI,
1501 primNI,primNI,primNI,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 primLineFSkip,primLineFSkip,primLineFSkip,primLineFSkip,primLineFSkip,primLineFSkip,primLineFSkip,primLineFSkip,
1519 primNI,primNI,primNI,primNI,primNI,primNI,primNI,primNI,
1521 primLineGSkip,primLineGSkip,primLineGSkip,primLineGSkip,primLineGSkip,primLineGSkip,primLineGSkip,primLineGSkip,
1523 primNI,primNI,primNI,primNI,primNI,primNI,primNI,primNI,
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 primMoveImage,primNI,primNI,primNI,primNI,primNI,primNI,primNI,
1533 primNI,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 primLoadImage,primNI,primNI,primNI,primNI,primNI,primNI,primNI,
1541 primNI,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 primStoreImage,primNI,primNI,primNI,primNI,primNI,primNI,primNI,
1549 primNI,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,cmdTexturePage,cmdTextureWindow,cmdDrawAreaStart,cmdDrawAreaEnd,cmdDrawOffset,cmdSTP,primNI,
1557 primNI,primNI,primNI,primNI,primNI,primNI,primNI,primNI,
1559 primNI,primNI,primNI,primNI,primNI,primNI,primNI,primNI,
1561 primNI,primNI,primNI,primNI,primNI,primNI,primNI,primNI