home *** CD-ROM | disk | FTP | other *** search
/ The Party 1994: Try This At Home / disk_image.bin / source / vexsrc / polygons.asm < prev    next >
Assembly Source File  |  1995-03-29  |  15KB  |  843 lines

  1. comment #
  2. /*****************************************************************************
  3.                                   ATTENTION!
  4.                            this source is VOTEWARE,
  5.               you may only use it to the conditions listed below:
  6.  
  7.   -You may modify it, or use parts of it in your own source as long as
  8.     this header stays on top of all files containing this source.
  9.   -You must give proper credit to the author, Niklas Beisert / pascal.
  10.   -You may not use it in commercial productions without the written
  11.     permission of the author.
  12.   -AND MOST IMPORTANT: you have to buy an Assembly '94 CD-ROM
  13.     by Sound Solutions (if you don't have it already) and vote for VEX-InTrO
  14.     in the PC-64k-Intro-Compo! (if you have already sent your voting card,
  15.     buy another one and fill it out CORRECTLY!!!)
  16. *****************************************************************************/
  17. #
  18.  
  19.  
  20.  
  21. ;// the polygon routine... uses 16bit fixed point for all coordinates
  22. ;// this looks much better for spacecuts, since it leaves no black lines
  23. ;// between two planes
  24. ;// has problems with division by zero in this version...
  25. ;// so watch out for further releases!
  26.  
  27. model large,c
  28. .386
  29. locals
  30.  
  31. .data
  32.  
  33. maxpts equ 16
  34.  
  35. public poly_width
  36. public poly_minx
  37. public poly_maxx
  38. public poly_miny
  39. public poly_maxy
  40. public poly_scrseg
  41. public poly_col
  42. public poly_tbmp
  43. public poly_twid
  44. public poly_x
  45. public poly_y
  46. public poly_len
  47. public poly_tx
  48. public poly_ty
  49. public poly_dtx
  50. public poly_dty
  51.  
  52. poly_width dw 320
  53. poly_minx dw 0
  54. poly_maxx dw 320
  55. poly_miny dw 0
  56. poly_maxy dw 200
  57. poly_scrseg dw 0
  58. poly_col db 0
  59. poly_tbmp dd 0
  60. poly_twid dw 0
  61. poly_y dw 0
  62. poly_x dw 0
  63. poly_len dw 0
  64. poly_tx dd 0
  65. poly_ty dd 0
  66. poly_dtx dd 0
  67. poly_dty dd 0
  68.  
  69. .code
  70.  
  71. public fillpolygon
  72. public vshadepolygon
  73. public vtexturepolygon
  74.  
  75.  
  76. fillpolygon proc uses si di, pts:dword, n:word, col:word, fill:dword, scrseg:word
  77. local pt:dword:2*maxpts*2,maxy:word,ny1:word,ny2:word,dx1:dword,dx2:dword,x1:dword,x2:dword
  78.   cld
  79.   mov ax,n
  80.   cmp ax,maxpts
  81.   jg @@done
  82.   cmp ax,3
  83.   jl @@done
  84.  
  85. ;2*copy pts to stack array
  86.   push ds
  87.   push ss
  88.   pop es
  89.   lea di,pt
  90.   lds si,pts
  91.   mov cx,n
  92.   shl cx,1
  93.   push cx
  94.   rep movsd
  95.   pop cx
  96.   mov si,word ptr pts
  97.   rep movsd
  98.   pop ds
  99.  
  100. ;find smallest and largest y
  101.   mov ebx,pt+4
  102.   mov edx,ebx
  103.   lea di,pt       ;di=minp
  104.   lea si,pt+8
  105.   mov cx,n
  106.   dec cx
  107. @@lminmax:
  108.     mov eax,dword ptr ss:[si+4]
  109.     cmp eax,ebx
  110.     jge @@nomin
  111.       mov di,si
  112.       mov ebx,eax
  113.   @@nomin:
  114.     cmp eax,edx
  115.     jle @@nomax
  116.       mov edx,eax
  117.   @@nomax:
  118.   add si,8
  119.   loop @@lminmax
  120.  
  121.   add ebx,0ffffh
  122.   shr ebx,16
  123.   add edx,0ffffh
  124.   shr edx,16
  125.  
  126. ;clip y coordinates
  127.   mov ax,poly_miny
  128.   mov cx,poly_maxy
  129.   cmp ax,dx
  130.   jge @@done
  131.   cmp cx,bx
  132.   jle @@done
  133.   cmp ax,bx
  134.   jle @@minok
  135.     mov bx,ax
  136. @@minok:
  137.   cmp cx,dx
  138.   jge @@maxok
  139.     mov dx,cx
  140. @@maxok:
  141.  
  142. ;init vars
  143.   mov maxy,dx
  144.   mov poly_y,bx
  145.   mov ny1,bx
  146.   mov ny2,bx
  147.   mov ax,scrseg
  148.   mov poly_scrseg,ax
  149.   mov al,byte ptr col
  150.   mov poly_col,al
  151.   mov si,di
  152.   mov ax,n
  153.   shl ax,3
  154.   add si,ax      ;di=p1,si=p2
  155.   jmp @@chkloop
  156. @@drawloop:
  157. ;reached a new point?
  158.     mov ax,ny1
  159.     cmp    ax,poly_y
  160.     jle @@newseg1
  161.     mov ax,ny2
  162.     cmp ax,poly_y
  163.     jle @@newseg2
  164. @@cont2:
  165.     mov ebx,x1
  166.     mov ecx,x2
  167.  
  168. ;sort x coordinates for line
  169.     add ebx,0ffffh
  170.     shr ebx,16
  171.     add ecx,0ffffh
  172.     shr ecx,16
  173.     cmp cx,bx
  174.     jge @@swap
  175.       xchg cx,bx
  176.   @@swap:
  177.  
  178. ;clip x coordinates for line
  179.     cmp bx,poly_maxx
  180.     jge @@nofill
  181.     cmp cx,poly_minx
  182.     jle @@nofill
  183.     cmp bx,poly_minx
  184.     jge @@x1ok
  185.       mov bx,poly_minx
  186.   @@x1ok:
  187.     cmp cx,poly_maxx
  188.     jle @@x2ok
  189.       mov cx,poly_maxx
  190.   @@x2ok:
  191.  
  192. ;init fill vars
  193.     sub cx,bx
  194.     jz @@nofill
  195.     mov poly_x,bx
  196.     mov poly_len,cx
  197.     call fill
  198.  
  199. ;update vars
  200.   @@nofill:
  201.     mov eax,dx1
  202.     add x1,eax
  203.     mov eax,dx2
  204.     add x2,eax
  205.     inc poly_y
  206. @@chkloop:
  207.   mov ax,poly_y
  208.   cmp ax,word ptr maxy
  209.   jl @@drawloop
  210. @@done:
  211.   ret
  212.  
  213. ;new point at line 1
  214. @@newseg1:
  215.   add di,8
  216.   mov eax,dword ptr ss:[di+4]
  217.   add eax,0ffffh
  218.   shr eax,16
  219.   cmp ax,poly_y
  220.   jle @@newseg1
  221.   mov ny1,ax
  222.  
  223.   mov ebx,dword ptr ss:[di+4]
  224.   sub ebx,dword ptr ss:[di-4]
  225.   mov cx,poly_y
  226.   shl ecx,16
  227.   sub ecx,dword ptr ss:[di-4]
  228.  
  229.   mov eax,dword ptr ss:[di]
  230.   sub eax,dword ptr ss:[di-8]
  231.   mov edx,eax
  232.   shl eax,16
  233.   sar edx,16
  234.   idiv ebx      ; careful here!
  235.   mov dx1,eax
  236.   imul ecx
  237.   shrd eax,edx,16
  238.   add eax,dword ptr ss:[di-8]
  239.   mov x1,eax
  240.  
  241.   mov ax,ny2
  242.   cmp ax,poly_y
  243.   jg @@cont2
  244.  
  245. ;new point at line 2
  246. @@newseg2:
  247.   sub si,8
  248.   mov eax,dword ptr ss:[si+4]
  249.   add eax,0ffffh
  250.   shr eax,16
  251.   cmp ax,poly_y
  252.   jle @@newseg2
  253.   mov ny2,ax
  254.  
  255.   mov ebx,dword ptr ss:[si+4]
  256.   sub ebx,dword ptr ss:[si+12]
  257.   mov cx,poly_y
  258.   shl ecx,16
  259.   sub ecx,dword ptr ss:[si+12]
  260.  
  261.   mov eax,dword ptr ss:[si]
  262.   sub eax,dword ptr ss:[si+8]
  263.   mov edx,eax
  264.   shl eax,16
  265.   sar edx,16
  266.   idiv ebx      ; careful here!
  267.   mov dx2,eax
  268.   imul ecx
  269.   shrd eax,edx,16
  270.   add eax,dword ptr ss:[si+8]
  271.   mov x2,eax
  272.  
  273.   jmp @@cont2
  274. endp
  275.  
  276. vshadepolygon proc uses si di, pts:dword, cols:dword, n:word, shade:dword, scrseg:word
  277. local co:dword:2*maxpts*2,pt:dword:2*maxpts*2,maxx:word,nx1:word,nx2:word,dy1:dword,dy2:dword
  278. local tx1:dword,tx2:dword,dtx1:dword,dtx2:dword,y1:dword,y2:dword
  279.   cld
  280.   mov ax,n
  281.   cmp ax,maxpts
  282.   jg @@done
  283.   cmp ax,3
  284.   jl @@done
  285.  
  286. ;2*copy pts and verts to stack array
  287.   push ds
  288.   push ss
  289.   pop es
  290.   lea di,pt
  291.   lds si,pts
  292.   mov cx,n
  293.   shl cx,1
  294.   push cx
  295.   rep movsd
  296.   pop cx
  297.   mov si,word ptr pts
  298.   push cx
  299.   rep movsd
  300.   pop cx
  301.   lea di,co
  302.   lds si,cols
  303.   push cx
  304. @@copycols:
  305.     movsd
  306.     add di,4
  307.   sub cx,2
  308.   jnz @@copycols
  309.   pop cx
  310.   lea si,co
  311.   push ss
  312.   pop ds
  313.   rep movsd
  314.   pop ds
  315.  
  316. ;find smallest and largest x
  317.   mov ebx,pt
  318.   mov edx,ebx
  319.   lea di,pt       ;di=minp
  320.   lea si,pt+8
  321.   mov cx,n
  322.   dec cx
  323. @@lminmax:
  324.     mov eax,dword ptr ss:[si]
  325.     cmp eax,ebx
  326.     jge @@nomin
  327.       mov di,si
  328.       mov ebx,eax
  329.   @@nomin:
  330.     cmp eax,edx
  331.     jle @@nomax
  332.       mov edx,eax
  333.   @@nomax:
  334.   add si,8
  335.   loop @@lminmax
  336.  
  337.   add ebx,0ffffh
  338.   shr ebx,16
  339.   add edx,0ffffh
  340.   shr edx,16
  341.  
  342. ;clip x coordinates
  343.   mov ax,poly_minx
  344.   mov cx,poly_maxx
  345.   cmp ax,dx
  346.   jge @@done
  347.   cmp cx,bx
  348.   jle @@done
  349.   cmp ax,bx
  350.   jle @@minok
  351.     mov bx,ax
  352. @@minok:
  353.   cmp cx,dx
  354.   jge @@maxok
  355.     mov dx,cx
  356. @@maxok:
  357.  
  358. ;init vars
  359.   mov maxx,dx
  360.   mov poly_x,bx
  361.   mov nx1,bx
  362.   mov nx2,bx
  363.   mov ax,scrseg
  364.   mov poly_scrseg,ax
  365.   mov si,di
  366.   mov ax,n
  367.   shl ax,3
  368.   add si,ax      ;di=p1,si=p2
  369.   jmp @@chkloop
  370. @@drawloop:
  371. ;reached a new point?
  372.     mov ax,nx1
  373.     cmp    ax,poly_x
  374.     jle @@newseg1
  375.     mov ax,nx2
  376.     cmp ax,poly_x
  377.     jle @@newseg2
  378. @@cont2:
  379.     mov ebx,y1
  380.     mov ecx,y2
  381.  
  382. ;sort y coordinates for line
  383.     add ebx,0ffffh
  384.     shr ebx,16
  385.     add ecx,0ffffh
  386.     shr ecx,16
  387.     cmp cx,bx
  388.     jge @@swap
  389.       xchg cx,bx
  390.   @@swap:
  391.  
  392. ;clip y coordinates for line
  393.     cmp bx,poly_maxy
  394.     jge @@nofill
  395.     cmp cx,poly_miny
  396.     jle @@nofill
  397.     cmp bx,poly_miny
  398.     jge @@y1ok
  399.       mov bx,poly_miny
  400.   @@y1ok:
  401.     cmp cx,poly_maxy
  402.     jle @@y2ok
  403.       mov cx,poly_maxy
  404.   @@y2ok:
  405.  
  406. ;init fill vars
  407.     sub cx,bx
  408.     jz @@nofill
  409.     mov poly_y,bx
  410.     mov poly_len,cx
  411.  
  412.     mov ebx,y1
  413.     sub ebx,y2
  414.     mov cx,poly_y
  415.     shl ecx,16
  416.     sub ecx,y1
  417.  
  418.     mov eax,tx1
  419.     sub eax,tx2
  420.     mov edx,eax
  421.     shl eax,16
  422.     sar edx,16
  423.     idiv ebx      ; careful here!
  424.     mov poly_dtx,eax
  425.     imul ecx
  426.     shrd eax,edx,16
  427.     add eax,tx1
  428.     mov poly_tx,eax
  429.  
  430.     call shade
  431.  
  432. ;update vars
  433.   @@nofill:
  434.     mov eax,dy1
  435.     add y1,eax
  436.     mov eax,dy2
  437.     add y2,eax
  438.     mov ebx,x1
  439.     mov eax,dtx1
  440.     add tx1,eax
  441.     mov eax,dtx2
  442.     add tx2,eax
  443.  
  444.     inc poly_x
  445. @@chkloop:
  446.   mov ax,poly_x
  447.   cmp ax,word ptr maxx
  448.   jl @@drawloop
  449. @@done:
  450.   ret
  451.  
  452. ;new point at line 1
  453. @@newseg1:
  454.   add di,8
  455.   mov eax,dword ptr ss:[di]
  456.   add eax,0ffffh
  457.   shr eax,16
  458.   cmp ax,poly_x
  459.   jle @@newseg1
  460.   mov nx1,ax
  461.  
  462.   mov ebx,dword ptr ss:[di]
  463.   sub ebx,dword ptr ss:[di-8]
  464.   mov cx,poly_x
  465.   shl ecx,16
  466.   sub ecx,dword ptr ss:[di-8]
  467.  
  468.   mov eax,dword ptr ss:[8*maxpts*2+di]
  469.   sub eax,dword ptr ss:[8*maxpts*2+di-8]
  470.   mov edx,eax
  471.   shl eax,16
  472.   sar edx,16
  473.   idiv ebx      ; careful here!
  474.   mov dtx1,eax
  475.   imul ecx
  476.   shrd eax,edx,16
  477.   add eax,dword ptr ss:[8*maxpts*2+di-8]
  478.   mov tx1,eax
  479.  
  480.   mov eax,dword ptr ss:[di+4]
  481.   sub eax,dword ptr ss:[di-4]
  482.   mov edx,eax
  483.   shl eax,16
  484.   sar edx,16
  485.   idiv ebx      ; careful here!
  486.   mov dy1,eax
  487.   imul ecx
  488.   shrd eax,edx,16
  489.   add eax,dword ptr ss:[di-4]
  490.   mov y1,eax
  491.  
  492.   mov ax,nx2
  493.   cmp ax,poly_x
  494.   jg @@cont2
  495.  
  496. ;new point at line 2
  497. @@newseg2:
  498.   sub si,8
  499.   mov eax,dword ptr ss:[si]
  500.   add eax,0ffffh
  501.   shr eax,16
  502.   cmp ax,poly_x
  503.   jle @@newseg2
  504.   mov nx2,ax
  505.  
  506.   mov ebx,dword ptr ss:[si]
  507.   sub ebx,dword ptr ss:[si+8]
  508.   mov cx,poly_x
  509.   shl ecx,16
  510.   sub ecx,dword ptr ss:[si+8]
  511.  
  512.   mov eax,dword ptr ss:[8*maxpts*2+si]
  513.   sub eax,dword ptr ss:[8*maxpts*2+si+8]
  514.   mov edx,eax
  515.   shl eax,16
  516.   sar edx,16
  517.   idiv ebx      ; careful here!
  518.   mov dtx2,eax
  519.   imul ecx
  520.   shrd eax,edx,16
  521.   add eax,dword ptr ss:[8*maxpts*2+si+8]
  522.   mov tx2,eax
  523.  
  524.   mov eax,dword ptr ss:[si+4]
  525.   sub eax,dword ptr ss:[si+12]
  526.   mov edx,eax
  527.   shl eax,16
  528.   sar edx,16
  529.   idiv ebx      ; careful here!
  530.   mov dy2,eax
  531.   imul ecx
  532.   shrd eax,edx,16
  533.   add eax,dword ptr ss:[si+12]
  534.   mov y2,eax
  535.  
  536.   jmp @@cont2
  537. endp
  538.  
  539. vtexturepolygon proc uses si di, pts:dword, verts:dword, n:word, bmp:dword, wid:word, col:word, texture:dword, scrseg:word
  540. local vr:dword:2*maxpts*2,pt:dword:2*maxpts*2,maxx:word,nx1:word,nx2:word,dy1:dword,dy2:dword
  541. local tx1:dword,ty1:dword,tx2:dword,ty2:dword,dtx1:dword,dty1:dword,dtx2:dword,dty2:dword,y1:dword,y2:dword
  542.   cld
  543.   mov ax,n
  544.   cmp ax,maxpts
  545.   jg @@done
  546.   cmp ax,3
  547.   jl @@done
  548.  
  549. ;2*copy pts and verts to stack array
  550.   push ds
  551.   push ss
  552.   pop es
  553.   lea di,pt
  554.   lds si,pts
  555.   mov cx,n
  556.   shl cx,1
  557.   push cx
  558.   rep movsd
  559.   pop cx
  560.   mov si,word ptr pts
  561.   push cx
  562.   rep movsd
  563.   pop cx
  564.   lea di,vr
  565.   lds si,verts
  566.   push cx
  567.   rep movsd
  568.   pop cx
  569.   mov si,word ptr verts
  570.   rep movsd
  571.   pop ds
  572.  
  573. ;find smallest and largest x
  574.   mov ebx,pt
  575.   mov edx,ebx
  576.   lea di,pt       ;di=minp
  577.   lea si,pt+8
  578.   mov cx,n
  579.   dec cx
  580. @@lminmax:
  581.     mov eax,dword ptr ss:[si]
  582.     cmp eax,ebx
  583.     jge @@nomin
  584.       mov di,si
  585.       mov ebx,eax
  586.   @@nomin:
  587.     cmp eax,edx
  588.     jle @@nomax
  589.       mov edx,eax
  590.   @@nomax:
  591.   add si,8
  592.   loop @@lminmax
  593.  
  594.   add ebx,0ffffh
  595.   shr ebx,16
  596.   add edx,0ffffh
  597.   shr edx,16
  598.  
  599. ;clip x coordinates
  600.   mov ax,poly_minx
  601.   mov cx,poly_maxx
  602.   cmp ax,dx
  603.   jge @@done
  604.   cmp cx,bx
  605.   jle @@done
  606.   cmp ax,bx
  607.   jle @@minok
  608.     mov bx,ax
  609. @@minok:
  610.   cmp cx,dx
  611.   jge @@maxok
  612.     mov dx,cx
  613. @@maxok:
  614.  
  615. ;init vars
  616.   mov maxx,dx
  617.   mov poly_x,bx
  618.   mov nx1,bx
  619.   mov nx2,bx
  620.   mov ax,scrseg
  621.   mov poly_scrseg,ax
  622.   mov al,byte ptr col
  623.   mov poly_col,al
  624.   mov eax,bmp
  625.   mov poly_tbmp,eax
  626.   mov ax,wid
  627.   mov poly_twid,ax
  628.   mov si,di
  629.   mov ax,n
  630.   shl ax,3
  631.   add si,ax      ;di=p1,si=p2
  632.   jmp @@chkloop
  633. @@drawloop:
  634. ;reached a new point?
  635.     mov ax,nx1
  636.     cmp    ax,poly_x
  637.     jle @@newseg1
  638.     mov ax,nx2
  639.     cmp ax,poly_x
  640.     jle @@newseg2
  641. @@cont2:
  642.     mov ebx,y1
  643.     mov ecx,y2
  644.  
  645. ;sort y coordinates for line
  646.     add ebx,0ffffh
  647.     shr ebx,16
  648.     add ecx,0ffffh
  649.     shr ecx,16
  650.     cmp cx,bx
  651.     jge @@swap
  652.       xchg cx,bx
  653.   @@swap:
  654.  
  655. ;clip y coordinates for line
  656.     cmp bx,poly_maxy
  657.     jge @@nofill
  658.     cmp cx,poly_miny
  659.     jle @@nofill
  660.     cmp bx,poly_miny
  661.     jge @@y1ok
  662.       mov bx,poly_miny
  663.   @@y1ok:
  664.     cmp cx,poly_maxy
  665.     jle @@y2ok
  666.       mov cx,poly_maxy
  667.   @@y2ok:
  668.  
  669. ;init fill vars
  670.     sub cx,bx
  671.     jz @@nofill
  672.     mov poly_y,bx
  673.     mov poly_len,cx
  674.  
  675.     mov ebx,y1
  676.     sub ebx,y2
  677.     mov cx,poly_y
  678.     shl ecx,16
  679.     sub ecx,y1
  680.  
  681.     mov eax,tx1
  682.     sub eax,tx2
  683.     mov edx,eax
  684.     shl eax,16
  685.     sar edx,16
  686.     idiv ebx      ; careful here!
  687.     mov poly_dtx,eax
  688.     imul ecx
  689.     shrd eax,edx,16
  690.     add eax,tx1
  691.     mov poly_tx,eax
  692.  
  693.     mov eax,ty1
  694.     sub eax,ty2
  695.     mov edx,eax
  696.     shl eax,16
  697.     sar edx,16
  698.     idiv ebx      ; careful here!
  699.     mov poly_dty,eax
  700.     imul ecx
  701.     shrd eax,edx,16
  702.     add eax,ty1
  703.     mov poly_ty,eax
  704.  
  705.     call texture
  706.  
  707. ;update vars
  708.   @@nofill:
  709.     mov eax,dy1
  710.     add y1,eax
  711.     mov eax,dy2
  712.     add y2,eax
  713.     mov ebx,x1
  714.     mov eax,dtx1
  715.     add tx1,eax
  716.     mov eax,dtx2
  717.     add tx2,eax
  718.     mov eax,dty1
  719.     add ty1,eax
  720.     mov eax,dty2
  721.     add ty2,eax
  722.  
  723.     inc poly_x
  724. @@chkloop:
  725.   mov ax,poly_x
  726.   cmp ax,word ptr maxx
  727.   jl @@drawloop
  728. @@done:
  729.   ret
  730.  
  731. ;new point at line 1
  732. @@newseg1:
  733.   add di,8
  734.   mov eax,dword ptr ss:[di]
  735.   add eax,0ffffh
  736.   shr eax,16
  737.   cmp ax,poly_x
  738.   jle @@newseg1
  739.   mov nx1,ax
  740.  
  741.   mov ebx,dword ptr ss:[di]
  742.   sub ebx,dword ptr ss:[di-8]
  743.   mov cx,poly_x
  744.   shl ecx,16
  745.   sub ecx,dword ptr ss:[di-8]
  746.  
  747.   mov eax,dword ptr ss:[8*maxpts*2+di]
  748.   sub eax,dword ptr ss:[8*maxpts*2+di-8]
  749.   mov edx,eax
  750.   shl eax,16
  751.   sar edx,16
  752.   idiv ebx      ; careful here!
  753.   mov dtx1,eax
  754.   imul ecx
  755.   shrd eax,edx,16
  756.   add eax,dword ptr ss:[8*maxpts*2+di-8]
  757.   mov tx1,eax
  758.  
  759.   mov eax,dword ptr ss:[8*maxpts*2+di+4]
  760.   sub eax,dword ptr ss:[8*maxpts*2+di-4]
  761.   mov edx,eax
  762.   shl eax,16
  763.   sar edx,16
  764.   idiv ebx      ; careful here!
  765.   mov dty1,eax
  766.   imul ecx
  767.   shrd eax,edx,16
  768.   add eax,dword ptr ss:[8*maxpts*2+di-4]
  769.   mov ty1,eax
  770.  
  771.   mov eax,dword ptr ss:[di+4]
  772.   sub eax,dword ptr ss:[di-4]
  773.   mov edx,eax
  774.   shl eax,16
  775.   sar edx,16
  776.   idiv ebx      ; careful here!
  777.   mov dy1,eax
  778.   imul ecx
  779.   shrd eax,edx,16
  780.   add eax,dword ptr ss:[di-4]
  781.   mov y1,eax
  782.  
  783.   mov ax,nx2
  784.   cmp ax,poly_x
  785.   jg @@cont2
  786.  
  787. ;new point at line 2
  788. @@newseg2:
  789.   sub si,8
  790.   mov eax,dword ptr ss:[si]
  791.   add eax,0ffffh
  792.   shr eax,16
  793.   cmp ax,poly_x
  794.   jle @@newseg2
  795.   mov nx2,ax
  796.  
  797.   mov ebx,dword ptr ss:[si]
  798.   sub ebx,dword ptr ss:[si+8]
  799.   mov cx,poly_x
  800.   shl ecx,16
  801.   sub ecx,dword ptr ss:[si+8]
  802.  
  803.   mov eax,dword ptr ss:[8*maxpts*2+si]
  804.   sub eax,dword ptr ss:[8*maxpts*2+si+8]
  805.   mov edx,eax
  806.   shl eax,16
  807.   sar edx,16
  808.   idiv ebx      ; careful here!
  809.   mov dtx2,eax
  810.   imul ecx
  811.   shrd eax,edx,16
  812.   add eax,dword ptr ss:[8*maxpts*2+si+8]
  813.   mov tx2,eax
  814.  
  815.   mov eax,dword ptr ss:[8*maxpts*2+si+4]
  816.   sub eax,dword ptr ss:[8*maxpts*2+si+12]
  817.   mov edx,eax
  818.   shl eax,16
  819.   sar edx,16
  820.   idiv ebx      ; careful here!
  821.   mov dty2,eax
  822.   imul ecx
  823.   shrd eax,edx,16
  824.   add eax,dword ptr ss:[8*maxpts*2+si+12]
  825.   mov ty2,eax
  826.  
  827.   mov eax,dword ptr ss:[si+4]
  828.   sub eax,dword ptr ss:[si+12]
  829.   mov edx,eax
  830.   shl eax,16
  831.   sar edx,16
  832.   idiv ebx      ; careful here!
  833.   mov dy2,eax
  834.   imul ecx
  835.   shrd eax,edx,16
  836.   add eax,dword ptr ss:[si+12]
  837.   mov y2,eax
  838.  
  839.   jmp @@cont2
  840. endp
  841.  
  842. end
  843.