home *** CD-ROM | disk | FTP | other *** search
/ PC Underground / UNDERGROUND.ISO / doom / source / cxygpoly.asm < prev    next >
Encoding:
Assembly Source File  |  1995-02-05  |  9.2 KB  |  471 lines

  1. ;-----------------------------------------------------------------------------
  2. ; Gouraud Shading assembler modul
  3. ; Copyright (c) 1994,95 by J.E. Hoffmann
  4. ; All rights reserved
  5. ;----------------------------------------------------------------------------
  6.   TITLE CxyGPOLY.ASM
  7.  
  8.  
  9.   MODEL SMALL
  10.  
  11.  
  12.   IDEAL
  13.   NOJUMPS
  14.   LOCALS @@
  15.  
  16.  
  17.  
  18.   INCLUDE "_VGAXASM.INC"
  19.  
  20.  
  21.   STRUC TLine
  22.     x     dw ?
  23.     ddy   dw ?
  24.     ddx   dw ?
  25.     icx   dw ?
  26.     error dw ?
  27.     yTo   dw ?
  28.     xTo   dw ?
  29.     Col   dd ?
  30.     icC   dd ?
  31.   ENDS
  32.  
  33.  
  34.   STRUC TEntry
  35.     x     dw ?
  36.     Col   dd ?
  37.   ENDS
  38.  
  39.  
  40.   DATASEG
  41.     EXTRN _VirtualVSeg :Word
  42.     EXTRN xSize        :Word
  43.  
  44.     yi     dw ?
  45.     LL     TLine ?
  46.     RL     TLine ?
  47.     yMin   dw ?
  48.     yMax   dw ?
  49.     min    dw ?
  50.  
  51.     L      dw ?
  52.     R      dw ?
  53.     K      dw ?
  54.     k1     TEntry ?
  55.     k2     TEntry ?
  56.  
  57.     DeltaX dw ?
  58.     Cic    dd ?
  59.  
  60.  
  61.  
  62.   CODESEG
  63.  
  64.   PUBLIC CxyShadedPoly
  65.  
  66.   P386N
  67.  
  68.  
  69.  
  70. ;≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡
  71. ; CxyShadedPoly(P :PPoints; C :PBytes; Count :Word);
  72. ;≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡
  73.   PROC CxyShadedPoly FAR
  74.        ARG Count:Word, C:DWord, P:DWord = @@return
  75.        enter  0,0
  76.        cld
  77.        mov    [min],-1
  78.        mov    [yMin],200
  79.        mov    [yMax],-1
  80.  
  81.        xor    cx,cx
  82.        les    si,[P]
  83.        mov    bx,si
  84.        inc    si
  85.        inc    si
  86.   @@11:
  87.        mov    ax,[es:si]
  88.        cmp    ax,[yMin]
  89.        jnl    @@12
  90.        mov    [yMin],ax
  91.        mov    [min],cx
  92.   @@12:
  93.        mov    ax,[es:si]
  94.        cmp    ax,[yMax]
  95.        jnge   @@13
  96.        mov    [yMax],ax
  97.   @@13:
  98.        add    si,4
  99.        inc    cx
  100.        cmp    cx,[Count]
  101.        jb     @@11
  102.        cmp    [yMin],199
  103.        jg     @@71
  104.        cmp    [yMax],0
  105.        jl     @@71
  106.  
  107.        mov    ax,[yMin]
  108.        mov    [yi],ax
  109.  
  110.        mov    ax,[min]
  111.        mov    [L],ax
  112.        mov    [R],ax
  113.        shl    ax,2
  114.        add    bx,ax
  115.        mov    ax,[es:bx]
  116.        mov    [LL.x],ax
  117.        mov    [RL.x],ax
  118.  
  119.        call   InitLeft
  120.        call   InitRight
  121.  
  122.        mov    ax,199
  123.        cmp    [yMax],ax
  124.        jng    @@14
  125.        mov    [yMax],ax
  126.   @@14:
  127.        mov    ax,[yMin]
  128.        cmp    ax,[yMax]
  129.        jg     @@71
  130.        mov    [yi],ax
  131.   @@21:
  132.        mov    ax,[LL.x]
  133.        mov    dx,[LL.ddy]
  134.        mov    bx,[LL.error]
  135.        cmp    bx,[LL.ddx]
  136.        jge    @@33
  137.        cmp    ax,[LL.xTo]
  138.        je     @@33
  139.   @@31:
  140.        add    bx,dx
  141.        add    ax,[LL.icx]
  142.        mov    [LL.error],bx
  143.        mov    [LL.x],ax
  144.        cmp    bx,[LL.ddx]
  145.        jge    @@32
  146.        cmp    ax,[LL.xTo]
  147.        jne    @@31
  148.   @@32:
  149.        mov    [LL.x],ax
  150.   @@33:
  151.        sub    bx,[LL.ddx]
  152.        mov    [LL.error],bx
  153.        mov    eax,[LL.icC]
  154.        add    [LL.Col],eax
  155.  
  156.        mov    ax,[RL.x]
  157.        mov    dx,[RL.ddy]
  158.        mov    bx,[RL.error]
  159.        cmp    bx,[RL.ddx]
  160.        jge    @@43
  161.        cmp    ax,[RL.xTo]
  162.        je     @@43
  163.   @@41:
  164.        add    bx,dx
  165.        add    ax,[RL.icx]
  166.        mov    [RL.error],bx
  167.        mov    [RL.x],ax
  168.        cmp    bx,[RL.ddx]
  169.        jge    @@42
  170.        cmp    ax,[RL.xTo]
  171.        jne    @@41
  172.   @@42:
  173.        mov    [RL.x],ax
  174.   @@43:
  175.        sub    bx,[RL.ddx]
  176.        mov    [RL.error],bx
  177.        mov    eax,[RL.icC]
  178.        add    [RL.Col],eax
  179.  
  180.        cmp    [yi],0
  181.        jl     @@60
  182.        mov    ax,[LL.x]
  183.        mov    [k1.x],ax
  184.        mov    eax,[LL.Col]
  185.        mov    [k1.Col],eax
  186.        mov    ax,[RL.x]
  187.        mov    [k2.x],ax
  188.        mov    eax,[RL.Col]
  189.        mov    [k2.Col],eax
  190.        call   GouraudVLine
  191.   @@60:
  192.  
  193.        mov    ax,[yi]
  194.        cmp    [LL.yTo],ax
  195.        jne    @@61
  196.        call   InitLeft
  197.        mov    ax,[yi]
  198.   @@61:
  199.        cmp    [RL.yTo],ax
  200.        jne    @@62
  201.        call   InitRight
  202.   @@62:
  203.        inc    [yi]
  204.        mov    ax,[yMax]
  205.        cmp    [yi],ax
  206.        jle    @@21
  207.   @@71:
  208.        leave
  209.        ret    @@return
  210.   ENDP
  211.  
  212.  
  213.  
  214. ;----------------------------------------------------------------------------
  215. ; procedure GouraudVLine; near;
  216. ;----------------------------------------------------------------------------
  217.   PROC GouraudVLine NEAR
  218.        push   ds
  219.  
  220.        movzx  ebx,[k2.x]
  221.        sub    bx,[k1.x]
  222.        jns    @@01
  223.        neg    bx
  224.   @@01:
  225.        inc    bx
  226.        mov    [DeltaX],bx
  227.  
  228.        xor    edx,edx
  229.        mov    eax,[k2.Col]
  230.        sub    eax,[k1.Col]
  231.        jns    @@02
  232.        neg    eax
  233.   @@02:
  234.        div    ebx
  235.        mov    [Cic],eax
  236.  
  237.        movzx  ebx,[k1.x]
  238.        movzx  ecx,[k2.x]
  239.        cmp    bx,cx
  240.        jnl    @@13
  241.  
  242.        cmp    bx,0
  243.        jnl    @@11
  244.        neg    bx
  245.        mov    eax,[Cic]
  246.        imul   ebx
  247.        add    [k1.Col],eax
  248.        xor    bx,bx
  249.   @@11:
  250.        cmp    cx,319
  251.        jng    @@12
  252.        sub    cx,319
  253.        mov    eax,[Cic]
  254.        imul   ecx
  255.        add    [k2.Col],eax
  256.        mov    cx,319
  257.   @@12:
  258.        cmp    bx,cx
  259.        jg     @@40
  260.        jmp    @@16
  261.  
  262.   @@13:
  263.        cmp    cx,0
  264.        jnl    @@14
  265.        neg    cx
  266.        mov    eax,[Cic]
  267.        imul   ecx
  268.        add    [k1.Col],eax
  269.        xor    cx,cx
  270.   @@14:
  271.        cmp    bx,319
  272.        jng    @@15
  273.        sub    bx,319
  274.        mov    eax,[Cic]
  275.        imul   ebx
  276.        add    [k2.Col],eax
  277.        mov    bx,319
  278.   @@15:
  279.        cmp    cx,bx
  280.        jg     @@40
  281.   @@16:
  282.        mov    [k1.x],bx
  283.        mov    [k2.x],cx
  284.  
  285.        mov    bx,[k2.x]
  286.        sub    bx,[k1.x]
  287.        jns    @@03
  288.        neg    bx
  289.   @@03:
  290.        inc    bx
  291.        mov    [DeltaX],bx
  292.  
  293.        mov    eax,[Cic]
  294.        mov    bx,ax
  295.        rol    ebx,16
  296.        rol    eax,16
  297.        mov    cl,al
  298.  
  299.        mov    bx,1
  300.        mov    ax,[k1.x]
  301.        cmp    ax,[k2.x]
  302.        jng    @@10
  303.        neg    bx
  304.   @@10:
  305.  
  306.        mov    eax,[k1.Col]
  307.        cmp    eax,[k2.Col]
  308.        jnle   @@21
  309.  
  310.        mov    di,[WORD PTR k1.Col]
  311.        rol    edi,16
  312.        mov    ax,[xSize]
  313.        mul    [yi]
  314.        mov    di,[k1.x]
  315.        add    di,ax
  316.        mov    al,[BYTE PTR 2+k1.Col]
  317.        jmp    @@22
  318.  @@21:
  319.        mov    di,[WORD PTR k2.Col]
  320.        rol    edi,16
  321.        mov    ax,[xSize]
  322.        mul    [yi]
  323.        mov    di,[k2.x]
  324.        add    di,ax
  325.        mov    al,[BYTE PTR 2+k2.Col]
  326.        neg    bx
  327.  @@22:
  328.        mov    ah,cl
  329.  
  330.        mov    cx,[DeltaX]
  331.        mov    ds,[_VirtualVSeg]
  332.   @@31:
  333.        mov    [di],al
  334.        add    edi,ebx
  335.        adc    al,ah
  336.        loop   @@31
  337.   @@40:
  338.        pop    ds
  339.        ret
  340.   ENDP
  341.  
  342.  
  343.  
  344. ;----------------------------------------------------------------------------
  345. ; procedure InitLeft;
  346. ;----------------------------------------------------------------------------
  347.   PROC InitLeft NEAR
  348.        les    si,[P]
  349.   @@11:
  350.        mov    bx,[L]
  351.        mov    [K],bx
  352.        shl    bx,2
  353.        mov    ax,[es:si+bx]
  354.        mov    [LL.x],ax
  355.  
  356.        mov    bx,[L]
  357.        cmp    bx,0
  358.        jne    @@12
  359.        mov    bx,[Count]
  360.   @@12:
  361.        dec    bx
  362.        mov    [L],bx
  363.  
  364.        shl    bx,2
  365.        mov    ax,[es:si+bx+2]
  366.        mov    [LL.yTo],ax
  367.        sub    ax,[yi]
  368.        jns    @@13
  369.        neg    ax
  370.   @@13:
  371.        inc    ax
  372.        mov    [LL.ddy],ax
  373.  
  374.        mov    ax,[es:si+bx]
  375.        mov    [LL.xTo],ax
  376.  
  377.        les    si,[C]
  378.        mov    bx,[k]
  379.        movzx  ax,[BYTE PTR es:si+bx]
  380.        shl    eax,16
  381.        mov    [LL.Col],eax
  382.  
  383.        mov    [LL.icx],1
  384.        mov    ax,[LL.xTo]
  385.        sub    ax,[LL.x]
  386.        jns    @@14
  387.        neg    [LL.icx]
  388.        neg    ax
  389.   @@14:
  390.        mov    [LL.ddx],ax
  391.        mov    [LL.error],0
  392.  
  393.        mov    bx,[L]
  394.        movzx  ax,[BYTE PTR es:si+bx]
  395.        shl    eax,16
  396.        sub    eax,[LL.Col]
  397.        cdq
  398.        movzx  ebx,[LL.ddy]
  399.        idiv   ebx
  400.        mov    [LL.icC],eax
  401.   @@15:
  402.        ret
  403.   ENDP
  404.  
  405.  
  406.  
  407. ;----------------------------------------------------------------------------
  408. ; procedure InitRight;
  409. ;----------------------------------------------------------------------------
  410.   PROC InitRight NEAR
  411.        les    si,[P]
  412.   @@11:
  413.        mov    bx,[R]
  414.        mov    [K],bx
  415.        shl    bx,2
  416.        mov    ax,[es:si+bx]
  417.        mov    [RL.x],ax
  418.  
  419.        mov    bx,[R]
  420.        mov    ax,[Count]
  421.        dec    ax
  422.        cmp    bx,ax
  423.        jne    @@12
  424.        mov    bx,-1
  425.   @@12:
  426.        inc    bx
  427.        mov    [R],bx
  428.  
  429.        shl    bx,2
  430.        mov    ax,[es:si+bx+2]
  431.        mov    [RL.yTo],ax
  432.        sub    ax,[yi]
  433.        jns    @@13
  434.        neg    ax
  435.   @@13:
  436.        inc    ax
  437.        mov    [RL.ddy],ax
  438.  
  439.        mov    ax,[es:si+bx]
  440.        mov    [RL.xTo],ax
  441.  
  442.        les    si,[C]
  443.        mov    bx,[k]
  444.        movzx  ax,[BYTE PTR es:si+bx]
  445.        shl    eax,16
  446.        mov    [RL.Col],eax
  447.  
  448.        mov    [RL.icx],1
  449.        mov    ax,[RL.xTo]
  450.        sub    ax,[RL.x]
  451.        jns    @@14
  452.        neg    [RL.icx]
  453.        neg    ax
  454.   @@14:
  455.        mov    [RL.ddx],ax
  456.        mov    [RL.error],0
  457.  
  458.        mov    bx,[R]
  459.        movzx  ax,[BYTE PTR es:si+bx]
  460.        shl    eax,16
  461.        sub    eax,[RL.Col]
  462.        cdq
  463.        movzx  ebx,[RL.ddy]
  464.        idiv   ebx
  465.        mov    [RL.icC],eax
  466.   @@15:
  467.        ret
  468.   ENDP
  469.   END
  470.  
  471.