home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / pc / 3DTOSHI2.ZIP / mpg3d / source / lg3drasw.cpp < prev   
Encoding:
C/C++ Source or Header  |  1996-04-02  |  32.5 KB  |  1,418 lines

  1.  
  2. // lg3drasw.cpp
  3. //
  4. // Copyright (c) 1996 by Toshiaki Tsuji, all rights reserved.
  5.  
  6. #include "stdgfx.h"
  7. #include "lg3dras.h"
  8.  
  9. LONG  _LeftX;
  10. LONG  _LeftY;
  11. LONG  _LeftU;
  12. LONG  _LeftV;
  13. LONG  _LeftI;
  14. LONG  _LeftZ;
  15.   
  16. LONG  _RightX;
  17. LONG  _RightY;
  18. LONG  _RightU;
  19. LONG  _RightV;
  20. LONG  _RightI;
  21. LONG  _RightZ;
  22.   
  23. LONG  _LeftDx;
  24. LONG  _LeftDy;
  25. LONG  _LeftDu;
  26. LONG  _LeftDv;
  27. LONG  _LeftDI;
  28. LONG  _LeftDz;
  29.   
  30. LONG  _RightDx;
  31. LONG  _RightDy;
  32. LONG  _RightDu;
  33. LONG  _RightDv;
  34. LONG  _RightDI;
  35. LONG  _RightDz;
  36.     
  37. BYTE*  _DestBuffer;
  38. BYTE*  _TextureBuffer;
  39. LONG   _AddDest;
  40. BYTE*  _ShadeBuffer;
  41. float* _DivTable;
  42.  
  43. LONG  Color;
  44. LONG  LoopCount;
  45. LONG  VMinX;
  46. LONG  VMaxX;
  47. LONG  VMinY;
  48. LONG  VMaxY;
  49. LONG  TempLen;
  50. LONG  TempVal;
  51.   
  52. // Inner Loop Delta
  53. LONG  InDeltaDI;
  54. LONG  InDeltaDu;
  55. LONG  InDeltaDv;
  56.  
  57. LONG  FracDv;
  58. LONG  FracDI;
  59. SHORT  FracDu;
  60. BYTE  IntDu;
  61. BYTE  IntDv;
  62. BYTE  IntDI;
  63.  
  64. float DummyFloat;
  65.  
  66. // VOID _SetViewPortData ( LONG MinX, LONG MinY, LONG MaxX, LONG MaxY )
  67. //
  68. // EAX = MinX, EDX = MinY, EBX = MaxX, ECX = MaxY
  69.  
  70. VOID _SetViewPortData ( LONG MinX, LONG MinY, 
  71.                         LONG MaxX, LONG MaxY );
  72. #pragma aux _SetViewPortData = \
  73.   "mov  VMinX, EAX" \
  74.   "mov  VMinY, EDX" \
  75.   "mov  VMaxX, EBX" \
  76.   "mov  VMaxY, ECX" \
  77.   parm [EAX] [EDX] [EBX] [ECX]
  78. // End of _SetViewPortData
  79.  
  80.  
  81. // VOID _DrawSolidNoHorz ( LONG Color, LONG LoopCount, LONG SkipRow, LONG SideClipped )
  82. //
  83. // EAX = Color, EDX = LoopCount, EBX = SkipRow, ECX = SideClipped
  84.  
  85. VOID _DrawSolidNoHorz ( LONG nColor, LONG nLoopCount, 
  86.                         LONG SkipRow, LONG SideClipped );
  87. #pragma aux _DrawSolidNoHorz = \
  88.   "mov  Color, EAX" \
  89. \  
  90.   "sub  EDX, EBX" \
  91.   "mov  LoopCount, EDX" \
  92. \  
  93.   "cmp  EBX, 0" \
  94.   "je   CheckClippedSolidNoHorz " \
  95. \  
  96.       "mov  EAX, _LeftDx" \
  97.     "imul  EBX" \
  98.     "add  _LeftX, EAX" \
  99.     "mov  EAX, _RightDx" \
  100.     "imul  EBX" \
  101.     "add  _RightX, EAX" \
  102. \
  103.     "mov  EAX, _AddDest" \
  104.     "imul  EBX" \
  105.     "add  _DestBuffer, EAX" \
  106. \
  107.   "CheckClippedSolidNoHorz :" \
  108.     "cmp  ECX, 0" \
  109.     "jne  DrawSolidNoHorzClip" \
  110. \
  111.   "DrawSolidNoHorzNoClip :" \
  112.     "cld" \
  113.     "mov  ESI, LoopCount" \
  114.     "cmp  ESI, 0" \
  115.     "jle  EndLoopOutSolidNoHorz" \
  116.     "adc  EAX, 0"  \
  117.     "nop" \
  118. \
  119.     "LoopOutSolidNoHorz :" \
  120.       "mov  EBX, _LeftX" \
  121.       "mov  EAX, EBX" \
  122.       "add  EBX, _LeftDx" \
  123.       "sar  EAX, 16" \
  124.       "mov  _LeftX, EBX" \
  125. \
  126.       "mov  EDX, _RightX" \
  127.       "mov  ECX, EDX" \
  128.       "add  EDX, _RightDx" \
  129.       "sar  ECX, 16" \
  130.       "mov  _RightX, EDX" \
  131. \
  132.       "mov  EBX, _DestBuffer" \
  133.       "mov  EDI, EBX" \
  134.       "add  EBX, _AddDest" \
  135.       "mov  _DestBuffer, EBX" \
  136. \
  137.       "sub  ECX, EAX           ; V" \
  138.       "add  EDI, EAX           ; U" \
  139.       "inc  ECX                ; V" \
  140.       "cmp  ECX, 0" \
  141.       "jle  NextRowSolidNoHorzNoClip " \
  142. \
  143.       "mov  EAX, Color         ; U" \
  144.       "mov  EDX, ECX           ; V" \
  145. \    
  146.       "shr  ECX, 2             ; U" \
  147.       "and  EDX, 3             ; V" \
  148.       "rep  stosd" \
  149.       "mov  ECX, EDX" \
  150.       "rep  stosb" \
  151. \
  152.       "NextRowSolidNoHorzNoClip :" \
  153.         "dec  ESI" \
  154.         "jnz  LoopOutSolidNoHorz" \
  155.       "jmp  EndLoopOutSolidNoHorz" \
  156. \
  157.   "DrawSolidNoHorzClip :" \
  158.     "cld" \
  159.     "mov  ESI, LoopCount" \
  160.     "cmp  ESI, 0" \
  161.     "jle  EndLoopOutSolidNoHorz" \
  162.     "adc  EAX, 0        ; Make sure the loop starts with U pipe" \
  163.     "nop" \
  164. \
  165.     "LoopOutClippedSolidNoHorz :" \
  166.       "mov  EBX, _LeftX    ; U" \
  167.       "mov  EAX, EBX        ; U" \
  168.       "add  EBX, _LeftDx   ; V" \
  169.       "sar  EAX, 16         ; U EAX is the Left X" \
  170.       "mov  _LeftX, EBX    ; V" \
  171. \
  172.       "mov  EDX, _RightX   ; U" \
  173.       "mov  ECX, EDX       ; U" \
  174.       "add  EDX, _RightDx  ; V" \
  175.       "sar  ECX, 16        ; U ECX is the Right X" \
  176.       "mov  _RightX, EDX   ; V" \
  177. \
  178.       "mov  EBX, _DestBuffer  ; U" \
  179.       "mov  EDI, EBX          ; U" \
  180.       "add  EBX, _AddDest     ; V" \
  181.       "mov  _DestBuffer, EBX  ; U" \
  182. \
  183.         "; Check for Easy reject" \
  184.         "cmp  EAX, VMaxX      ; Left is greater than MaxX" \
  185.         "jg   NextRowSolidNoHorz" \
  186.         "cmp  ECX, VMinX      ; Right is smaller than MinX" \
  187.         "jl   NextRowSolidNoHorz" \
  188. \
  189.         "; Check for Left" \
  190.         "cmp  EAX, VMinX" \
  191.         "jge  CheckRightSolidNoHorz" \
  192.           "mov  EAX, VMinX    ; Set Left to MinX" \
  193. \
  194.         "; Check for Right" \
  195.       "CheckRightSolidNoHorz :" \
  196.         "cmp  ECX, VMaxX" \
  197.         "jle  StartSolidNoHorz" \
  198.         "mov  ECX, VMaxX    ; Set Right to MaxX" \
  199. \
  200.     "StartSolidNoHorz :" \
  201.       "sub  ECX, EAX" \
  202.       "inc  ECX"
  203.       "cmp  ECX, 0" \
  204.       "jle  NextRowSolidNoHorz" \
  205. \
  206.       "add  EDI, EAX" \
  207. \
  208.       "mov  EAX, Color" \         
  209.       "mov  EDX, ECX" \
  210. \    
  211.       "shr  ECX, 2" \
  212.       "and  EDX, 3" \
  213.       "rep  stosd" \
  214.       "mov  ECX, EDX" \
  215.       "rep  stosb" \
  216. \    
  217.       "NextRowSolidNoHorz :" \ 
  218.         "dec  ESI" \
  219.       "jnz  LoopOutClippedSolidNoHorz" \
  220. \
  221.   "EndLoopOutSolidNoHorz :" \
  222.   parm [EAX] [EDX] [EBX] [ECX]
  223. // End of _DrawSolidNoHorz
  224.  
  225.  
  226. // VOID _DrawSolidGrdHorz ( LONG Color, LONG LoopCount, LONG SkipRow, LONG SideClipped )
  227. //
  228. // EAX = Color, EDX = LoopCount, EBX = SkipRow, ECX = SideClipped
  229.  
  230. VOID _DrawSolidGrdHorz ( LONG nColor, LONG nLoopCount, LONG SkipRow, 
  231.                                                  LONG SideClipped )
  232. {
  233. _asm {
  234.   pushad
  235.  
  236.   "mov EAX, nColor
  237.   "mov EDX, nLoopCount
  238.   "mov EBX, SkipRow
  239.   "mov ECX, SideClipped
  240.     
  241.   "mov  Color, EAX
  242.  
  243.   sub  EDX, EBX
  244.   "mov  LoopCount, EDX
  245.  
  246.   "cmp  EBX, 0
  247.   je   CheckClippedSolidGrdHorz 
  248.  
  249.     "mov  EAX, _LeftDx
  250.     imul  EBX
  251.     "add  _LeftX, EAX
  252.  
  253.     "mov  EAX, _RightDx
  254.     imul  EBX
  255.     "add  _RightX, EAX
  256.  
  257.     "mov  EAX, _LeftDI
  258.     imul  EBX
  259.     "add  _LeftI, EAX
  260.  
  261.     "mov  EAX, _RightDI
  262.     imul  EBX
  263.     "add  _RightI, EAX
  264.  
  265.     "mov  EAX, _"addDest
  266.     imul  EBX
  267.     "add  _DestBuffer, EAX
  268.  
  269.   CheckClippedSolidGrdHorz :
  270.     "cmp  ECX, 0
  271.     jne  DrawSolidGrdHorzClip
  272.  
  273.   DrawSolidGrdHorzNoClip :
  274.     "cld
  275.     "mov  ESI, LoopCount
  276.     "cmp  ESI, 0
  277.     "jle  EndLoopOutSolidGrdHorz
  278.     "adc  EAX, 0        ; Make sure the loop starts with U pipe
  279.     nop          
  280.  
  281.     LoopOutSolidGrdHorz :
  282.       "mov  EBX, _LeftX    ; U
  283.       "mov  EAX, EBX        ; U
  284.       "add  EBX, _LeftDx   ; V
  285.       "sar  EAX, 16         ; U EAX is the Left X
  286.       "mov  _LeftX, EBX    ; V
  287.  
  288.       "mov  EDX, _RightX   ; U
  289.       "mov  ECX, EDX        ; U
  290.       "add  EDX, _RightDx  ; V
  291.       "sar  ECX, 16         ; U ECX is the Right X
  292.       "mov  _RightX, EDX   ; V
  293.  
  294.       "mov  EBX, _DestBuffer  ; U
  295.       "mov  EDI, EBX           ; U
  296.       "add  EBX, _"addDest     ; V
  297.       sub  ECX, EAX           ; U
  298.  
  299.       "mov  _DestBuffer, EBX  ; V
  300.  
  301.       "add  EDI, EAX           ; U
  302.       inc  ECX                ; V
  303.       
  304.       "mov  EBX, _LeftI    ; U
  305.       "mov  EAX, EBX        ; U     EAX is the Left I
  306.       "add  EBX, _LeftDI   ; V
  307.       "mov  _LeftI, EBX    ; V
  308.       
  309.       "mov  EBX, _RightI   ; U
  310.       "mov  EDX, EBX        ; U     EDX is the Right I
  311.       "add  EBX, _RightDI  ; V
  312.       "mov  _RightI, EBX   ; V
  313.       
  314.       "cmp  ECX, 0
  315.       "jle  NextRowSolidGrdHorzNoClip
  316.  
  317.       "mov  EBX, EAX        ; EBX is the Left I
  318.       sub  EDX, EAX
  319.       "mov  EAX, EDX
  320.       "sar  EDX, 01Fh
  321.       idiv ECX
  322.       "mov  InDeltaDI, EAX
  323.  
  324.       "mov  EBP, EBX
  325.       "mov  EAX, Color        
  326.       "mov  EDX, InDeltaDI 
  327.       push ESI
  328.       "mov  ESI, _ShadeBuffer
  329.       
  330.         InLoopSolidGrdHorz :
  331.           "mov  EBX, EBP
  332.           shr  EBX, 8
  333.           "mov  BL, AL
  334.           "add  EBP, EDX
  335.           "mov  AH, [EBX+ESI]
  336.           "mov  [EDI], AH
  337.           inc  EDI
  338.           loop InLoopSolidGrdHorz
  339.  
  340.       pop  ESI
  341.  
  342.       NextRowSolidGrdHorzNoClip :
  343.         dec  ESI
  344.         jnz  LoopOutSolidGrdHorz
  345.       jmp  EndLoopOutSolidGrdHorz
  346.  
  347.   DrawSolidGrdHorzClip :
  348.     "cld
  349.     "mov  ESI, LoopCount
  350.     "cmp  ESI, 0
  351.     "jle  EndLoopOutSolidGrdHorz
  352.     "adc  EAX, 0        ; Make sure the loop starts with U pipe
  353.     nop          
  354.  
  355.     LoopOutClippedSolidGrdHorz :
  356.       "mov  EBX, _LeftX    ; U
  357.       "mov  EAX, EBX        ; U
  358.       "add  EBX, _LeftDx   ; V
  359.       "sar  EAX, 16         ; U EAX is the Left X
  360.       "mov  _LeftX, EBX    ; V
  361.  
  362.       "mov  EDX, _RightX   ; U
  363.       "mov  ECX, EDX        ; U
  364.       "add  EDX, _RightDx  ; V
  365.       "sar  ECX, 16         ; U ECX is the Right X
  366.       "mov  _RightX, EDX   ; V
  367.  
  368.       "mov  EBX, _DestBuffer  ; U
  369.       "mov  EDI, EBX           ; U
  370.       "add  EBX, _"addDest     ; V
  371.       "mov  _DestBuffer, EBX  ; U
  372.  
  373.       "mov  TempLen, ECX
  374.       sub  TempLen, EAX
  375.       inc  TempLen
  376.       "mov  EBX, 0
  377.  
  378.         ; Check for Easy reject
  379.         "cmp  EAX, VMaxX      ; Left is greater than MaxX
  380.         jg   NextRowSolidGrdHorz
  381.         "cmp  ECX, VMinX      ; Right is smaller than MinX
  382.         jl   NextRowSolidGrdHorz
  383.  
  384.         ; Check for Left
  385.         "cmp  EAX, VMinX
  386.         jge  CheckRightSolidGrdHorz
  387.           "mov  EBX, VMinX
  388.           sub  EBX, EAX
  389.           "mov  EAX, VMinX    ; Set Left to MinX
  390.  
  391.         ; Check for Right
  392.         CheckRightSolidGrdHorz :
  393.           "cmp  ECX, VMaxX
  394.           "jle  StartSolidGrdHorz
  395.           "mov  ECX, VMaxX    ; Set Right to MaxX
  396.  
  397.     StartSolidGrdHorz :  ; Clipped
  398.       sub  ECX, EAX
  399.       inc  ECX
  400.  
  401.       "add  EDI, EAX
  402.  
  403.       "mov  EBP, TempLen    ; EBP is the loop count before clipped
  404.       "mov  TempLen, EBX    ; TempLen is now the skip pixel in x-direction
  405.  
  406.       "mov  EBX, _LeftI    ; U
  407.       "mov  EAX, EBX        ; U   EAX is the Left I
  408.       "add  EBX, _LeftDI   ; V
  409.       "mov  _LeftI, EBX    ; V
  410.       
  411.       "mov  EBX, _RightI   ; U
  412.       "mov  EDX, EBX        ; U   EDX is the Right I
  413.       "add  EBX, _RightDI  ; V
  414.       "mov  _RightI, EBX   ; V
  415.             
  416.       "cmp  ECX, 0
  417.       "jle  NextRowSolidGrdHorz
  418.  
  419.       "mov  EBX, EAX        ; EAX is Left I
  420.       sub  EDX, EAX
  421.       "mov  EAX, EDX
  422.       "sar  EDX, 01Fh
  423.       idiv EBP
  424.       "mov  InDeltaDI, EAX
  425.  
  426.       ; "add Delta for Skipped pixel
  427.       "mov  EBP, EBX
  428.       "mov  EAX, InDeltaDI
  429.       imul TempLen 
  430.       "add  EBP, EAX
  431.  
  432.       "mov  EAX, Color        
  433.       "mov  EDX, InDeltaDI 
  434.       push ESI
  435.       "mov  ESI, _ShadeBuffer
  436.       
  437.         InLoopClippedSolidGrdHorz :
  438.           "mov  EBX, EBP
  439.           shr  EBX, 8
  440.           "mov  BL, AL
  441.           "mov  AH, [EBX+ESI]
  442.           "add  EBP, EDX
  443.           "mov  [EDI], AH
  444.           inc  EDI
  445.           loop InLoopClippedSolidGrdHorz
  446.     
  447.       pop  ESI
  448.       NextRowSolidGrdHorz : 
  449.         dec  ESI
  450.       jnz  LoopOutClippedSolidGrdHorz
  451.  
  452.   EndLoopOutSolidGrdHorz :
  453.  
  454.   popad
  455. } // End asm
  456. } // End of _DrawSolidGrdHorz
  457.  
  458.  
  459. // VOID _DrawTextureNoHorz ( LONG Color, LONG LoopCount, LONG SkipRow, LONG SideClipped )
  460. //
  461. // EAX = Color, EDX = LoopCount, EBX = SkipRow, ECX = SideClipped
  462.  
  463. VOID _DrawTextureNoHorz ( LONG nColor, LONG nLoopCount, 
  464.                                                   LONG SkipRow, LONG SideClipped )
  465. {
  466. _asm {
  467.   pushad
  468.  
  469.   "mov EAX, nColor
  470.   "mov EDX, nLoopCount
  471.   "mov EBX, SkipRow
  472.   "mov ECX, SideClipped
  473.  
  474.   sub  EDX, EBX
  475.   "mov  LoopCount, EDX
  476.  
  477.   "cmp  EBX, 0
  478.   je   CheckClippedTextureNoHorz 
  479.  
  480.     "mov  EAX, _LeftDx
  481.     imul  EBX
  482.     "add  _LeftX, EAX
  483.  
  484.     "mov  EAX, _RightDx
  485.     imul  EBX
  486.     "add  _RightX, EAX
  487.  
  488.     "mov  EAX, _LeftDu
  489.     imul  EBX
  490.     "add  _LeftU, EAX
  491.  
  492.     "mov  EAX, _RightDu
  493.     imul  EBX
  494.     "add  _RightU, EAX
  495.  
  496.     "mov  EAX, _LeftDv
  497.     imul  EBX
  498.     "add  _LeftV, EAX
  499.  
  500.     "mov  EAX, _RightDv
  501.     imul  EBX
  502.     "add  _RightV, EAX
  503.  
  504.     "mov  EAX, _"addDest
  505.     imul  EBX
  506.     "add  _DestBuffer, EAX
  507.  
  508.   CheckClippedTextureNoHorz :
  509.     "cmp  ECX, 0
  510.     jne  DrawTextureNoHorzClip
  511.  
  512.   DrawTextureNoHorzNoClip :
  513.     "cld
  514.     "mov  ESI, LoopCount
  515.     "cmp  ESI, 0
  516.     "jle  EndLoopOutTextureNoHorz
  517.     "adc  EAX, 0        ; Make sure the loop starts with U pipe
  518.     nop          
  519.  
  520.     LoopOutTextureNoHorz :
  521.       "mov  EBX, _LeftX    ; U
  522.       "mov  EAX, EBX        ; U
  523.       "add  EBX, _LeftDx   ; V
  524.       "sar  EAX, 16         ; U EAX is the Left X
  525.       "mov  _LeftX, EBX    ; V
  526.  
  527.       "mov  EDX, _RightX   ; U
  528.       "mov  ECX, EDX        ; U
  529.       "add  EDX, _RightDx  ; V
  530.       "sar  ECX, 16         ; U ECX is the Right X
  531.       "mov  _RightX, EDX   ; V
  532.  
  533.       "mov  EBX, _DestBuffer  ; U
  534.       "mov  EDI, EBX           ; U
  535.       "add  EBX, _"addDest     ; V
  536.       "mov  _DestBuffer, EBX  ; U
  537.  
  538.       sub  ECX, EAX           ; V
  539.       "add  EDI, EAX           ; U
  540.       inc  ECX                ; V
  541.             
  542.       "cmp  ECX, 0
  543.       "jle  NextRowTextureNoHorzNoClip
  544.  
  545.       "mov  EBP, ECX
  546.       "shl  EBP, 2
  547.       "add  EBP, _DivTable
  548.       fld  dword ptr [EBP] 
  549.       
  550.       "mov  EBP, ECX      ; EBP is the loop
  551.  
  552.       "mov  EAX, _LeftU    
  553.       "mov  EDX, _RightU         
  554.       sub  EDX, EAX
  555.       "sar  EDX, 8
  556.       "mov  InDeltaDu, EDX
  557.       fild InDeltaDu      
  558.       fmul st, st(1)
  559.       fistp InDeltaDu
  560.       
  561.       "mov  EAX, _LeftV    
  562.       "mov  EDX, _RightV         
  563.       sub  EDX, EAX
  564.       "sar  EDX, 8
  565.       "mov  InDeltaDv, EDX
  566.       fild InDeltaDv      
  567.       fmul st, st(1)
  568.       fistp InDeltaDv
  569.  
  570.       fstp DummyFloat
  571.  
  572.       push ESI
  573.  
  574.       "mov  ECX, _LeftU
  575.       "sar  ECX, 8
  576.       "mov  EDX, _LeftV
  577.       "sar  EDX, 8
  578.       "mov  ESI, _TextureBuffer
  579.       "mov  EBX, 0
  580.  
  581.         InLoopTextureNoHorz :
  582.           "mov  BH, DH
  583.           "mov  BL, CH
  584.           "add  ECX, InDeltaDu
  585.           "mov  AL, [EBX+ESI]
  586.           "add  EDX, InDeltaDv
  587.           "mov  [EDI], AL
  588.           inc  EDI
  589.           dec  EBP
  590.           jnz  InLoopTextureNoHorz
  591.  
  592.       pop  ESI
  593.  
  594.       NextRowTextureNoHorzNoClip :
  595.  
  596.       "mov  EAX, _LeftU
  597.       "mov  EBX, _LeftV
  598.       "add  EAX, _LeftDu
  599.       "add  EBX, _LeftDv
  600.       "mov  _LeftU, EAX
  601.       "mov  _LeftV, EBX
  602.  
  603.       "mov  EAX, _RightU
  604.       "mov  EBX, _RightV
  605.       "add  EAX, _RightDu
  606.       "add  EBX, _RightDv
  607.       "mov  _RightU, EAX
  608.       "mov  _RightV, EBX
  609.  
  610.       dec  ESI
  611.       jnz  LoopOutTextureNoHorz
  612.       jmp  EndLoopOutTextureNoHorz
  613.  
  614.   DrawTextureNoHorzClip :
  615.     "cld
  616.     "mov  ESI, LoopCount
  617.     "cmp  ESI, 0
  618.     "jle  EndLoopOutTextureNoHorz
  619.     "adc  EAX, 0        ; Make sure the loop starts with U pipe
  620.     nop          
  621.  
  622.     LoopOutClippedTextureNoHorz :
  623.       "mov  EBX, _LeftX    ; U
  624.       "mov  EAX, EBX        ; U
  625.       "add  EBX, _LeftDx   ; V
  626.       "sar  EAX, 16         ; U EAX is the Left X
  627.       "mov  _LeftX, EBX    ; V
  628.  
  629.       "mov  EDX, _RightX   ; U
  630.       "mov  ECX, EDX        ; U
  631.       "add  EDX, _RightDx  ; V
  632.       "sar  ECX, 16         ; U ECX is the Right X
  633.       "mov  _RightX, EDX   ; V
  634.  
  635.       "mov  EBX, _DestBuffer  ; U
  636.       "mov  EDI, EBX           ; U
  637.       "add  EBX, _"addDest     ; V
  638.       "mov  _DestBuffer, EBX  ; U
  639.  
  640.       "mov  TempLen, ECX
  641.       sub  TempLen, EAX
  642.       inc  TempLen
  643.       "mov  EBX, 0
  644.  
  645.         ; Check for Easy reject
  646.         "cmp  EAX, VMaxX      ; Left is greater than MaxX
  647.         jg   NextRowTextureNoHorz
  648.         "cmp  ECX, VMinX      ; Right is smaller than MinX
  649.         jl   NextRowTextureNoHorz
  650.  
  651.         ; Check for Left
  652.         "cmp  EAX, VMinX
  653.         jge  CheckRightTextureNoHorz
  654.           "mov  EBX, VMinX
  655.           sub  EBX, EAX
  656.           "mov  EAX, VMinX    ; Set Left to MinX
  657.  
  658.         ; Check for Right
  659.       CheckRightTextureNoHorz :
  660.         "cmp  ECX, VMaxX
  661.         "jle  StartTextureNoHorz
  662.         "mov  ECX, VMaxX    ; Set Right to MaxX
  663.  
  664.     StartTextureNoHorz :
  665.       sub  ECX, EAX
  666.       inc  ECX
  667.  
  668.       "cmp  ECX, 0
  669.       "jle  NextRowTextureNoHorz
  670.  
  671.       "add  EDI, EAX
  672.  
  673.       "mov  EBP, TempLen
  674.       "shl  EBP, 2
  675.       "add  EBP, _DivTable
  676.       fld  dword ptr [EBP]
  677.       
  678.       "mov  EBP, ECX      ; EBP is the loop
  679.       "mov  TempLen, EBX
  680.  
  681.       "mov  EAX, _LeftU
  682.       "mov  EDX, _RightU         
  683.       sub  EDX, EAX
  684.       "sar  EDX, 8
  685.       "mov  InDeltaDu, EDX
  686.       fild InDeltaDu      
  687.       fmul st, st(1)
  688.       fistp InDeltaDu
  689.       
  690.       "mov  EAX, _LeftV    
  691.       "mov  EDX, _RightV         
  692.       sub  EDX, EAX
  693.       "sar  EDX, 8
  694.       "mov  InDeltaDv, EDX
  695.       fild InDeltaDv      
  696.       fmul st, st(1)
  697.       fistp InDeltaDv
  698.  
  699.       fstp  DummyFloat
  700.  
  701.       push ESI
  702.  
  703.       "mov  EAX, InDeltaDu
  704.       imul TempLen
  705.       "mov  ECX, _LeftU
  706.       "sar  ECX, 8
  707.       "add  ECX, EAX
  708.  
  709.       "mov  EAX, InDeltaDv
  710.       imul TempLen
  711.       "mov  EDX, _LeftV
  712.       "sar  EDX, 8
  713.       "add  EDX, EAX
  714.  
  715.       "mov  ESI, _TextureBuffer
  716.       "mov  EBX, 0
  717.  
  718.         InLoopClippedTextureNoHorz :
  719.           "mov  BH, DH
  720.           "mov  BL, CH
  721.           "add  ECX, InDeltaDu
  722.           "mov  AL, [EBX+ESI]
  723.           "add  EDX, InDeltaDv
  724.           "mov  [EDI], AL
  725.           inc  EDI
  726.           dec  EBP
  727.           jnz  InLoopClippedTextureNoHorz
  728.  
  729.       pop  ESI
  730.  
  731.       NextRowTextureNoHorz : 
  732.         "mov  EAX, _LeftU
  733.         "mov  EBX, _LeftV
  734.         "add  EAX, _LeftDu
  735.         "add  EBX, _LeftDv
  736.         "mov  _LeftU, EAX
  737.         "mov  _LeftV, EBX
  738.  
  739.         "mov  EAX, _RightU
  740.         "mov  EBX, _RightV
  741.         "add  EAX, _RightDu
  742.         "add  EBX, _RightDv
  743.         "mov  _RightU, EAX
  744.         "mov  _RightV, EBX
  745.  
  746.         dec  ESI
  747.       jnz  LoopOutClippedTextureNoHorz
  748.  
  749.   EndLoopOutTextureNoHorz :
  750.  
  751.   popad
  752. } // End asm
  753. } // End of _DrawTextureNoHorz
  754.  
  755.  
  756. // VOID _DrawTextureFlatHorz ( LONG Color, LONG LoopCount, LONG SkipRow, LONG SideClipped )
  757. //
  758. // EAX = Color, EDX = LoopCount, EBX = SkipRow, ECX = SideClipped
  759.  
  760. VOID _DrawTextureFlatHorz ( LONG nColor, LONG nLoopCount, 
  761.                                                     LONG SkipRow, LONG SideClipped )
  762. {
  763. _asm {
  764.   pushad
  765.  
  766.   "mov EAX, nColor
  767.   "mov EDX, nLoopCount
  768.   "mov EBX, SkipRow
  769.   "mov ECX, SideClipped
  770.  
  771.   sub  EDX, EBX
  772.   "mov  LoopCount, EDX
  773.  
  774.   "cmp  EBX, 0
  775.   je   CheckClippedTextureFlatHorz 
  776.  
  777.     "mov  EAX, _LeftDx
  778.     imul  EBX
  779.     "add  _LeftX, EAX
  780.  
  781.     "mov  EAX, _RightDx
  782.     imul  EBX
  783.     "add  _RightX, EAX
  784.  
  785.     "mov  EAX, _LeftDu
  786.     imul  EBX
  787.     "add  _LeftU, EAX
  788.  
  789.     "mov  EAX, _RightDu
  790.     imul  EBX
  791.     "add  _RightU, EAX
  792.  
  793.     "mov  EAX, _LeftDv
  794.     imul  EBX
  795.     "add  _LeftV, EAX
  796.  
  797.     "mov  EAX, _RightDv
  798.     imul  EBX
  799.     "add  _RightV, EAX
  800.  
  801.     "mov  EAX, _"addDest
  802.     imul  EBX
  803.     "add  _DestBuffer, EAX
  804.  
  805.   CheckClippedTextureFlatHorz :
  806.     "cmp  ECX, 0
  807.     jne  DrawTextureFlatHorzClip
  808.  
  809.   DrawTextureFlatHorzNoClip :
  810.     "cld
  811.     "mov  ESI, LoopCount
  812.     "cmp  ESI, 0
  813.     "jle  EndLoopOutTextureFlatHorz
  814.     "adc  EAX, 0        ; Make sure the loop starts with U pipe
  815.     nop          
  816.  
  817.     LoopOutTextureFlatHorz :
  818.       "mov  EBX, _LeftX    ; U
  819.       "mov  EAX, EBX        ; U
  820.       "add  EBX, _LeftDx   ; V
  821.       "sar  EAX, 16         ; U EAX is the Left X
  822.       "mov  _LeftX, EBX    ; V
  823.  
  824.       "mov  EDX, _RightX   ; U
  825.       "mov  ECX, EDX        ; U
  826.       "add  EDX, _RightDx  ; V
  827.       "sar  ECX, 16         ; U ECX is the Right X
  828.       "mov  _RightX, EDX   ; V
  829.  
  830.       "mov  EBX, _DestBuffer  ; U
  831.       "mov  EDI, EBX           ; U
  832.       "add  EBX, _"addDest     ; V
  833.       sub  ECX, EAX           ; U
  834.  
  835.       "mov  _DestBuffer, EBX  ; V
  836.  
  837.       "add  EDI, EAX           ; U
  838.       inc  ECX                ; V
  839.  
  840.       "cmp  ECX, 0
  841.       "jle  NextRowTextureFlatHorzNoClip
  842.  
  843.       "mov  EBP, ECX
  844.       "shl  EBP, 2
  845.       "add  EBP, _DivTable
  846.       fld  dword ptr [EBP]
  847.       
  848.       "mov  EBP, ECX      ; EBP is the loop
  849.  
  850.       "mov  EAX, _LeftU    
  851.       "mov  EDX, _RightU         
  852.       sub  EDX, EAX
  853.       "sar  EDX, 8
  854.       "mov  InDeltaDu, EDX
  855.       fild InDeltaDu      
  856.       fmul st, st(1)
  857.       fistp InDeltaDu
  858.       
  859.       "mov  EAX, _LeftV    
  860.       "mov  EDX, _RightV         
  861.       sub  EDX, EAX
  862.       "sar  EDX, 8
  863.       "mov  InDeltaDv, EDX
  864.       fild InDeltaDv      
  865.       fmul st, st(1)
  866.       fistp InDeltaDv
  867.  
  868.       fstp DummyFloat
  869.  
  870.       push ESI
  871.  
  872.       "mov  ECX, _LeftU
  873.       "mov  EDX, _LeftV
  874.       "sar  ECX, 8
  875.       "sar  EDX, 8
  876.  
  877.       "mov  EAX, _LeftI
  878.       "sar  EAX, 8
  879.       "mov  ESI, _ShadeBuffer
  880.       
  881.         InLoopTextureFlatHorz :
  882.           "mov  EBX, 0
  883.           "mov  BH, DH
  884.           "mov  BL, CH
  885.           "add  ECX, InDeltaDu
  886.           "add  EBX, _TextureBuffer
  887.           "mov  AL, [EBX]
  888.           "add  EDX, InDeltaDv
  889.           "mov  BL, [ESI+EAX]
  890.           "mov  [EDI], BL
  891.           inc  EDI
  892.           dec  EBP
  893.           jnz  InLoopTextureFlatHorz
  894.     
  895.       pop  ESI
  896.  
  897.       NextRowTextureFlatHorzNoClip : 
  898.         "mov  EAX, _LeftU
  899.         "mov  EBX, _LeftV
  900.         "add  EAX, _LeftDu
  901.         "add  EBX, _LeftDv
  902.         "mov  _LeftU, EAX
  903.         "mov  _LeftV, EBX
  904.  
  905.         "mov  EAX, _RightU
  906.         "mov  EBX, _RightV
  907.         "add  EAX, _RightDu
  908.         "add  EBX, _RightDv
  909.         "mov  _RightU, EAX
  910.         "mov  _RightV, EBX
  911.  
  912.         dec  ESI
  913.       jnz  LoopOutTextureFlatHorz
  914.       jmp  EndLoopOutTextureFlatHorz
  915.  
  916.   DrawTextureFlatHorzClip :
  917.     "cld
  918.     "mov  ESI, LoopCount
  919.     "cmp  ESI, 0
  920.     "jle  EndLoopOutTextureFlatHorz
  921.     "adc  EAX, 0        ; Make sure the loop starts with U pipe
  922.     nop          
  923.  
  924.     LoopOutClippedTextureFlatHorz :
  925.       "mov  EBX, _LeftX    ; U
  926.       "mov  EAX, EBX        ; U
  927.       "add  EBX, _LeftDx   ; V
  928.       "sar  EAX, 16         ; U EAX is the Left X
  929.       "mov  _LeftX, EBX    ; V
  930.  
  931.       "mov  EDX, _RightX   ; U
  932.       "mov  ECX, EDX        ; U
  933.       "add  EDX, _RightDx  ; V
  934.       "sar  ECX, 16         ; U ECX is the Right X
  935.       "mov  _RightX, EDX   ; V
  936.  
  937.       "mov  EBX, _DestBuffer  ; U
  938.       "mov  EDI, EBX           ; U
  939.       "add  EBX, _"addDest     ; V
  940.       "mov  _DestBuffer, EBX  ; U
  941.  
  942.       "mov  TempLen, ECX
  943.       sub  TempLen, EAX
  944.       inc  TempLen
  945.       "mov  EBX, 0
  946.  
  947.         ; Check for Easy reject
  948.         "cmp  EAX, VMaxX      ; Left is greater than MaxX
  949.         jg   NextRowTextureFlatHorz
  950.         "cmp  ECX, VMinX      ; Right is smaller than MinX
  951.         jl   NextRowTextureFlatHorz
  952.  
  953.         ; Check for Left
  954.         "cmp  EAX, VMinX
  955.         jge  CheckRightTextureFlatHorz
  956.           "mov  EBX, VMinX
  957.           sub  EBX, EAX
  958.           "mov  EAX, VMinX    ; Set Left to MinX
  959.  
  960.         ; Check for Right
  961.         CheckRightTextureFlatHorz :
  962.           "cmp  ECX, VMaxX
  963.           "jle  StartTextureFlatHorz
  964.           "mov  ECX, VMaxX    ; Set Right to MaxX
  965.  
  966.     StartTextureFlatHorz :
  967.       sub  ECX, EAX
  968.       inc  ECX
  969.       "add  EDI, EAX
  970.  
  971.       "cmp  ECX, 0
  972.       "jle  NextRowTextureFlatHorz
  973.  
  974.       "mov  EBP, TempLen
  975.       "shl  EBP, 2
  976.       "add  EBP, _DivTable
  977.       fld  dword ptr [EBP]
  978.  
  979.       "mov  EBP, ECX      ; EBP is the loop
  980.  
  981.       "mov  ECX, TempLen
  982.       "mov  TempLen, EBX    ; TempLen is now the skip pixel in x-direction
  983.  
  984.       "mov  EAX, _LeftU    
  985.       "mov  EDX, _RightU         
  986.       sub  EDX, EAX
  987.       "sar  EDX, 8
  988.       "mov  InDeltaDu, EDX
  989.       fild InDeltaDu      
  990.       fmul st, st(1)
  991.       fistp InDeltaDu
  992.       
  993.       "mov  EAX, _LeftV    
  994.       "mov  EDX, _RightV         
  995.       sub  EDX, EAX
  996.       "sar  EDX, 8
  997.       "mov  InDeltaDv, EDX
  998.       fild InDeltaDv      
  999.       fmul st, st(1)
  1000.       fistp InDeltaDv
  1001.  
  1002.       fstp DummyFloat
  1003.  
  1004.       push ESI
  1005.  
  1006.       "mov  EAX, InDeltaDu
  1007.       imul TempLen
  1008.       "mov  ECX, _LeftU
  1009.       "sar  ECX, 8
  1010.       "add  ECX, EAX
  1011.  
  1012.       "mov  EAX, InDeltaDv
  1013.       imul TempLen
  1014.       "mov  EDX, _LeftV
  1015.       "sar  EDX, 8
  1016.       "add  EDX, EAX
  1017.  
  1018.       "mov  EAX, _LeftI
  1019.       "sar  EAX, 8
  1020.       "mov  ESI, _ShadeBuffer
  1021.       
  1022.         InLoopClippedTextureFlatHorz :
  1023.           "mov  EBX, 0
  1024.           "mov  BH, DH
  1025.           "mov  BL, CH
  1026.           "add  ECX, InDeltaDu
  1027.           "add  EBX, _TextureBuffer
  1028.           "mov  AL, [EBX]
  1029.           "add  EDX, InDeltaDv
  1030.           "mov  BL, [ESI+EAX]
  1031.           "mov  [EDI], BL
  1032.           inc  EDI
  1033.           dec  EBP
  1034.           jnz  InLoopClippedTextureFlatHorz
  1035.     
  1036.       pop  ESI
  1037.  
  1038.       NextRowTextureFlatHorz : 
  1039.         "mov  EAX, _LeftU
  1040.         "mov  EBX, _LeftV
  1041.         "add  EAX, _LeftDu
  1042.         "add  EBX, _LeftDv
  1043.         "mov  _LeftU, EAX
  1044.         "mov  _LeftV, EBX
  1045.  
  1046.         "mov  EAX, _RightU
  1047.         "mov  EBX, _RightV
  1048.         "add  EAX, _RightDu
  1049.         "add  EBX, _RightDv
  1050.         "mov  _RightU, EAX
  1051.         "mov  _RightV, EBX
  1052.  
  1053.         dec  ESI
  1054.       jnz  LoopOutClippedTextureFlatHorz
  1055.  
  1056.   EndLoopOutTextureFlatHorz :
  1057.  
  1058.   popad
  1059. } // End asm
  1060. } // End of _DrawTextureFlatHorz
  1061.  
  1062.  
  1063. // VOID _DrawTextureGrdHorz ( LONG Color, LONG LoopCount, LONG SkipRow, LONG SideClipped )
  1064. //
  1065. // EAX = Color, EDX = LoopCount, EBX = SkipRow, ECX = SideClipped
  1066.  
  1067. VOID _DrawTextureGrdHorz ( LONG nColor, LONG nLoopCount, 
  1068.                                                    LONG SkipRow, LONG SideClipped )
  1069. {
  1070. _asm {
  1071.   pushad
  1072.  
  1073.   "mov EAX, nColor
  1074.   "mov EDX, nLoopCount
  1075.   "mov EBX, SkipRow
  1076.   "mov ECX, SideClipped
  1077.  
  1078.   "mov  Color, EAX
  1079.  
  1080.   sub  EDX, EBX
  1081.   "mov  LoopCount, EDX
  1082.  
  1083.   "cmp  EBX, 0
  1084.   je   CheckClippedTextureGrdHorz 
  1085.  
  1086.     "mov  EAX, _LeftDx
  1087.     imul  EBX
  1088.     "add  _LeftX, EAX
  1089.  
  1090.     "mov  EAX, _RightDx
  1091.     imul  EBX
  1092.     "add  _RightX, EAX
  1093.  
  1094.     "mov  EAX, _LeftDu
  1095.     imul  EBX
  1096.     "add  _LeftU, EAX
  1097.  
  1098.     "mov  EAX, _RightDu
  1099.     imul  EBX
  1100.     "add  _RightU, EAX
  1101.  
  1102.     "mov  EAX, _LeftDv
  1103.     imul  EBX
  1104.     "add  _LeftV, EAX
  1105.  
  1106.     "mov  EAX, _RightDv
  1107.     imul  EBX
  1108.     "add  _RightV, EAX
  1109.  
  1110.     "mov  EAX, _LeftDI
  1111.     imul  EBX
  1112.     "add  _LeftI, EAX
  1113.  
  1114.     "mov  EAX, _RightDI
  1115.     imul  EBX
  1116.     "add  _RightI, EAX
  1117.  
  1118.     "mov  EAX, _"addDest
  1119.     imul  EBX
  1120.     "add  _DestBuffer, EAX
  1121.  
  1122.   CheckClippedTextureGrdHorz :
  1123.     "cmp  ECX, 0
  1124.     jne  DrawTextureGrdHorzClip
  1125.  
  1126.   DrawTextureGrdHorzNoClip :
  1127.     "cld
  1128.     "mov  ESI, LoopCount
  1129.     "cmp  ESI, 0
  1130.     "jle  EndLoopOutTextureGrdHorz
  1131.     "adc  EAX, 0        ; Make sure the loop starts with U pipe
  1132.     nop          
  1133.  
  1134.     LoopOutTextureGrdHorz :
  1135.       "mov  EBX, _LeftX    ; U
  1136.       "mov  EAX, EBX        ; U
  1137.       "add  EBX, _LeftDx   ; V
  1138.       "sar  EAX, 16         ; U EAX is the Left X
  1139.       "mov  _LeftX, EBX    ; V
  1140.  
  1141.       "mov  EDX, _RightX   ; U
  1142.       "mov  ECX, EDX        ; U
  1143.       "add  EDX, _RightDx  ; V
  1144.       "sar  ECX, 16         ; U ECX is the Right X
  1145.       "mov  _RightX, EDX   ; V
  1146.  
  1147.       "mov  EBX, _DestBuffer  ; U
  1148.       "mov  EDI, EBX           ; U
  1149.       "add  EBX, _"addDest     ; V
  1150.       sub  ECX, EAX           ; U
  1151.  
  1152.       "mov  _DestBuffer, EBX  ; V
  1153.  
  1154.       "add  EDI, EAX           ; U
  1155.       inc  ECX                ; V
  1156.  
  1157.       "cmp  ECX, 0
  1158.       "jle  NextRowTextureGrdHorzNoClip
  1159.  
  1160.       "mov  EBP, ECX
  1161.       "shl  EBP, 2
  1162.       "add  EBP, _DivTable
  1163.       fld  dword ptr [EBP]
  1164.       
  1165.       "mov  EBP, ECX      ; EBP is the loop
  1166.  
  1167.       "mov  EAX, _LeftI    ; U
  1168.       "mov  EDX, _RightI   ; U      
  1169.       sub  EDX, EAX
  1170.       "sar  EDX, 8
  1171.       "mov  EAX, EDX
  1172.       "sar  EDX, 01Fh
  1173.       idiv ECX
  1174.       "mov  InDeltaDI, EAX
  1175.  
  1176.       "mov  EAX, _LeftU
  1177.       "mov  EDX, _RightU         
  1178.       sub  EDX, EAX
  1179.       "sar  EDX, 8
  1180.       "mov  InDeltaDu, EDX
  1181.       fild InDeltaDu      
  1182.       fmul st, st(1)
  1183.       fistp InDeltaDu
  1184.       
  1185.       "mov  EAX, _LeftV    
  1186.       "mov  EDX, _RightV         
  1187.       sub  EDX, EAX
  1188.       "sar  EDX, 8
  1189.       "mov  InDeltaDv, EDX
  1190.       fild InDeltaDv      
  1191.       fmul st, st(1)
  1192.       fistp InDeltaDv
  1193.  
  1194.       fstp DummyFloat
  1195.  
  1196.       push ESI
  1197.       
  1198.       "mov  ECX, _LeftU
  1199.       "mov  EDX, _LeftV
  1200.       "mov  ESI, _LeftI
  1201.       "sar  ECX, 8
  1202.       "sar  EDX, 8
  1203.       "sar  ESI, 8
  1204.       
  1205.         InLoopTextureGrdHorz :
  1206.           "mov  EBX, 0
  1207.           "mov  BH, DH
  1208.           "mov  BL, CH
  1209.           "add  ECX, InDeltaDu
  1210.           "add  EBX, _TextureBuffer
  1211.           "mov  EAX, ESI
  1212.           "mov  AL, [EBX]
  1213.           "add  EDX, InDeltaDv
  1214.           "add  EAX, _ShadeBuffer
  1215.           "mov  BL, [EAX]
  1216.           "add  ESI, InDeltaDI
  1217.           "mov  [EDI], BL
  1218.           inc  EDI
  1219.           dec  EBP
  1220.           jnz  InLoopTextureGrdHorz
  1221.    
  1222.       pop  ESI
  1223.  
  1224.       NextRowTextureGrdHorzNoClip :
  1225.         "mov  EAX, _LeftU
  1226.         "mov  EBX, _LeftV
  1227.         "add  EAX, _LeftDu
  1228.         "add  EBX, _LeftDv
  1229.         "mov  _LeftU, EAX
  1230.         "mov  _LeftV, EBX
  1231.  
  1232.         "mov  EAX, _RightU
  1233.         "mov  EBX, _RightV
  1234.         "add  EAX, _RightDu
  1235.         "add  EBX, _RightDv
  1236.         "mov  _RightU, EAX
  1237.         "mov  _RightV, EBX
  1238.  
  1239.         "mov  EAX, _LeftI
  1240.         "mov  EBX, _RightI
  1241.         "add  EAX, _LeftDI
  1242.         "add  EBX, _RightDI
  1243.         "mov  _LeftI, EAX
  1244.         "mov  _RightI, EBX
  1245.  
  1246.         dec  ESI
  1247.       jnz  LoopOutTextureGrdHorz
  1248.       jmp  EndLoopOutTextureGrdHorz
  1249.  
  1250.   DrawTextureGrdHorzClip :
  1251.     "cld
  1252.     "mov  ESI, LoopCount
  1253.     "cmp  ESI, 0
  1254.     "jle  EndLoopOutTextureGrdHorz
  1255.     "adc  EAX, 0        ; Make sure the loop starts with U pipe
  1256.     nop          
  1257.  
  1258.     LoopOutClippedTextureGrdHorz :
  1259.       "mov  EBX, _LeftX    ; U
  1260.       "mov  EAX, EBX        ; U
  1261.       "add  EBX, _LeftDx   ; V
  1262.       "sar  EAX, 16         ; U EAX is the Left X
  1263.       "mov  _LeftX, EBX    ; V
  1264.  
  1265.       "mov  EDX, _RightX   ; U
  1266.       "mov  ECX, EDX        ; U
  1267.       "add  EDX, _RightDx  ; V
  1268.       "sar  ECX, 16         ; U ECX is the Right X
  1269.       "mov  _RightX, EDX   ; V
  1270.  
  1271.       "mov  EBX, _DestBuffer  ; U
  1272.       "mov  EDI, EBX           ; U
  1273.       "add  EBX, _"addDest     ; V
  1274.       "mov  _DestBuffer, EBX  ; U
  1275.  
  1276.       "mov  TempLen, ECX
  1277.       sub  TempLen, EAX
  1278.       inc  TempLen
  1279.       "mov  EBX, 0
  1280.  
  1281.         ; Check for Easy reject
  1282.         "cmp  EAX, VMaxX      ; Left is greater than MaxX
  1283.         jg   NextRowTextureGrdHorz
  1284.         "cmp  ECX, VMinX      ; Right is smaller than MinX
  1285.         jl   NextRowTextureGrdHorz
  1286.  
  1287.         ; Check for Left
  1288.         "cmp  EAX, VMinX
  1289.         jge  CheckRightTextureGrdHorz
  1290.           "mov  EBX, VMinX
  1291.           sub  EBX, EAX
  1292.           "mov  EAX, VMinX    ; Set Left to MinX
  1293.  
  1294.         ; Check for Right
  1295.         CheckRightTextureGrdHorz :
  1296.           "cmp  ECX, VMaxX
  1297.           "jle  StartTextureGrdHorz
  1298.           "mov  ECX, VMaxX    ; Set Right to MaxX
  1299.  
  1300.     StartTextureGrdHorz :
  1301.       sub  ECX, EAX
  1302.       inc  ECX
  1303.       "add  EDI, EAX
  1304.  
  1305.       "cmp  ECX, 0
  1306.       "jle  NextRowTextureGrdHorz
  1307.  
  1308.       "mov  EBP, TempLen
  1309.       "shl  EBP, 2
  1310.       "add  EBP, _DivTable
  1311.       fld  dword ptr [EBP]
  1312.  
  1313.       "mov  EBP, ECX      ; EBP is the loop
  1314.  
  1315.       "mov  ECX, TempLen
  1316.       "mov  TempLen, EBX    ; TempLen is now the skip pixel in x-direction
  1317.  
  1318.       "mov  EAX, _LeftI    ; U
  1319.       "mov  EDX, _RightI   ; U      
  1320.       sub  EDX, EAX
  1321.       "sar  EDX, 8
  1322.       "mov  EAX, EDX
  1323.       "sar  EDX, 01Fh
  1324.       idiv ECX
  1325.       "mov  InDeltaDI, EAX
  1326.  
  1327.       "mov  EAX, _LeftU    
  1328.       "mov  EDX, _RightU         
  1329.       sub  EDX, EAX
  1330.       "sar  EDX, 8
  1331.       "mov  InDeltaDu, EDX
  1332.       fild InDeltaDu      
  1333.       fmul st, st(1)
  1334.       fistp InDeltaDu
  1335.       
  1336.       "mov  EAX, _LeftV    
  1337.       "mov  EDX, _RightV         
  1338.       sub  EDX, EAX
  1339.       "sar  EDX, 8
  1340.       "mov  InDeltaDv, EDX
  1341.       fild InDeltaDv      
  1342.       fmul st, st(1)
  1343.       fistp InDeltaDv
  1344.  
  1345.       fstp DummyFloat
  1346.  
  1347.       push ESI
  1348.  
  1349.       "mov  EAX, InDeltaDu
  1350.       imul TempLen
  1351.       "mov  ECX, _LeftU
  1352.       "sar  ECX, 8
  1353.       "add  ECX, EAX
  1354.  
  1355.       "mov  EAX, InDeltaDI
  1356.       imul TempLen
  1357.       "mov  ESI, _LeftI
  1358.       "sar  ESI, 8
  1359.       "add  ESI, EAX
  1360.       
  1361.       "mov  EAX, InDeltaDv
  1362.       imul TempLen
  1363.       "mov  EDX, _LeftV
  1364.       "sar  EDX, 8
  1365.       "add  EDX, EAX
  1366.  
  1367.         InLoopClippedTextureGrdHorz :
  1368.           "mov  EBX, 0
  1369.           "mov  BH, DH
  1370.           "mov  BL, CH
  1371.           "add  ECX, InDeltaDu
  1372.           "add  EBX, _TextureBuffer
  1373.           "mov  EAX, ESI
  1374.           "mov  AL, [EBX]
  1375.           "add  EDX, InDeltaDv
  1376.           "add  EAX, _ShadeBuffer
  1377.           "mov  BL, [EAX]
  1378.           "add  ESI, InDeltaDI
  1379.           "mov  [EDI], BL
  1380.           inc  EDI
  1381.           dec  EBP
  1382.           jnz  InLoopClippedTextureGrdHorz
  1383.     
  1384.       pop  ESI
  1385.  
  1386.       NextRowTextureGrdHorz : 
  1387.         "mov  EAX, _LeftU
  1388.         "mov  EBX, _LeftV
  1389.         "add  EAX, _LeftDu
  1390.         "add  EBX, _LeftDv
  1391.         "mov  _LeftU, EAX
  1392.         "mov  _LeftV, EBX
  1393.    
  1394.         "mov  EAX, _RightU
  1395.         "mov  EBX, _RightV
  1396.         "add  EAX, _RightDu
  1397.         "add  EBX, _RightDv
  1398.         "mov  _RightU, EAX
  1399.         "mov  _RightV, EBX
  1400.  
  1401.         "mov  EAX, _LeftI
  1402.         "mov  EBX, _RightI
  1403.         "add  EAX, _LeftDI
  1404.         "add  EBX, _RightDI
  1405.         "mov  _LeftI, EAX
  1406.         "mov  _RightI, EBX
  1407.  
  1408.         dec  ESI
  1409.       jnz  LoopOutClippedTextureGrdHorz
  1410.  
  1411.   EndLoopOutTextureGrdHorz :
  1412.  
  1413.   popad
  1414. } // End asm
  1415. } // End of _DrawTextureGrdHorz
  1416.  
  1417.  
  1418.