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

  1. ;----------------------------------------------------------------------------
  2. ; Texture Mapping assembler modul
  3. ; Copyright (c) 1994,95 by J.E. Hoffmann
  4. ; All rights reserved
  5. ;----------------------------------------------------------------------------
  6.   TITLE TPOLY.ASM
  7.  
  8.  
  9.   MODEL SMALL
  10.  
  11.  
  12.   IDEAL
  13.   NOJUMPS
  14.   LOCALS @@
  15.  
  16.  
  17.  
  18.   INCLUDE "_VGAXASM.INC"
  19.  
  20.  
  21.  
  22.   STRUC TLine
  23.     x     dw ?
  24.     Tx    dd ?
  25.     Ty    dd ?
  26.     Ticx  dd ?
  27.     Ticy  dd ?
  28.     ddy   dw ?
  29.     ddx   dw ?
  30.     icx   dw ?
  31.     error dw ?
  32.     yTo   dw ?
  33.     xTo   dw ?
  34.   ENDS
  35.  
  36.  
  37.   STRUC TEntry
  38.     x     dw ?
  39.     Tx    dd ?
  40.     Ty    dd ?
  41.   ENDS
  42.  
  43.  
  44.  
  45.  
  46.   DATASEG
  47.     EXTRN _VirtualVSeg :Word
  48.     EXTRN xSize       :Word
  49.  
  50.     EXTRN TexXSize    :Word
  51.     EXTRN TexYSize    :Word
  52.  
  53.     LL          TLine ?
  54.     RL          TLine ?
  55.     yMin        dw ?
  56.     yMax        dw ?
  57.     min         dw ?
  58.     L           dw ?
  59.     R           dw ?
  60.     yi          dw ?
  61.     K           dw ?
  62.  
  63.     k1          TEntry ?
  64.     k2          TEntry ?
  65.  
  66.     DeltaX      dw ?
  67.     uicx        dd ?
  68.     uicy        dd ?
  69.     TextureSeg  dw ?
  70.  
  71.  
  72.   CODESEG
  73.  
  74.  
  75.   PUBLIC CxyTexturedPoly
  76.   P386N
  77.  
  78.  
  79.  
  80. ;≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡
  81. ; procedure CxyTexturedPoly(P,T :Pointer; Count :Word; Texture :Pointer);
  82. ;≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡
  83.   PROC CxyTexturedPoly FAR
  84.        ARG Texture:DWord, Count:Word, T:DWord, P:DWord = @@return
  85.        enter  0,0
  86.        cld
  87.        mov    ax,[WORD PTR 2+Texture]
  88.        mov    [TextureSeg],ax
  89.        mov    [min],-1
  90.        mov    [yMin],200
  91.        mov    [yMax],-1
  92.  
  93.        xor    cx,cx
  94.        les    si,[P]
  95.        mov    bx,si
  96.        inc    si
  97.        inc    si
  98.   @@11:
  99.        mov    ax,[es:si]
  100.        cmp    ax,[yMin]
  101.        jnl    @@12
  102.        mov    [yMin],ax
  103.        mov    [min],cx
  104.   @@12:
  105.        mov    ax,[es:si]
  106.        cmp    ax,[yMax]
  107.        jnge   @@13
  108.        mov    [yMax],ax
  109.   @@13:
  110.        add    si,4
  111.        inc    cx
  112.        cmp    cx,[Count]
  113.        jb     @@11
  114.        cmp    [yMin],199
  115.        jg     @@71
  116.        cmp    [yMax],0
  117.        jl     @@71
  118.  
  119.        mov    ax,199
  120.        cmp    [yMax],ax
  121.        jle    @@14
  122.        mov    [yMax],ax
  123.   @@14:
  124.        mov    ax,[yMin]
  125.        mov    [yi],ax
  126.  
  127.        mov    ax,[min]
  128.        mov    [L],ax
  129.        mov    [R],ax
  130.        shl    ax,2
  131.        add    bx,ax
  132.        mov    ax,[es:bx]
  133.        mov    [LL.x],ax
  134.        mov    [RL.x],ax
  135.  
  136.        call   _InitLeft
  137.        call   _InitRight
  138.  
  139.        mov    ax,[yMin]
  140.        inc    ax
  141.        cmp    ax,[yMax]
  142.        jg     @@71
  143.        mov    [yi],ax
  144.   @@21:
  145.        mov    ax,[LL.x]
  146.        mov    dx,[LL.ddy]
  147.        mov    bx,[LL.error]
  148.        cmp    bx,[LL.ddx]
  149.        jge    @@33
  150.        cmp    ax,[LL.xTo]
  151.        je     @@33
  152.   @@31:
  153.        add    bx,dx
  154.        add    ax,[LL.icx]
  155.        mov    [LL.error],bx
  156.        mov    [LL.x],ax
  157.        cmp    bx,[LL.ddx]
  158.        jge    @@32
  159.        cmp    ax,[LL.xTo]
  160.        jne    @@31
  161.   @@32:
  162.        mov    [LL.x],ax
  163.   @@33:
  164.        sub    bx,[LL.ddx]
  165.        mov    [LL.error],bx
  166.        mov    eax,[LL.Ticx]
  167.        add    [LL.Tx],eax
  168.        mov    eax,[LL.Ticy]
  169.        add    [LL.Ty],eax
  170.  
  171.        mov    ax,[RL.x]
  172.        mov    dx,[RL.ddy]
  173.        mov    bx,[RL.error]
  174.        cmp    bx,[RL.ddx]
  175.        jge    @@43
  176.        cmp    ax,[RL.xTo]
  177.        je     @@43
  178.   @@41:
  179.        add    bx,dx
  180.        add    ax,[RL.icx]
  181.        mov    [RL.error],bx
  182.        mov    [RL.x],ax
  183.        cmp    bx,[RL.ddx]
  184.        jge    @@42
  185.        cmp    ax,[RL.xTo]
  186.        jne    @@41
  187.   @@42:
  188.        mov    [RL.x],ax
  189.   @@43:
  190.        sub    bx,[RL.ddx]
  191.        mov    [RL.error],bx
  192.        mov    eax,[RL.Ticx]
  193.        add    [RL.Tx],eax
  194.        mov    eax,[RL.Ticy]
  195.        add    [RL.Ty],eax
  196.  
  197.        cmp    [yi],0
  198.        jl     @@60
  199.        push   ds
  200.        pop    es
  201.        mov    si,OFFSET LL
  202.        mov    di,OFFSET k1
  203.        movsd
  204.        movsd
  205.        movsw
  206.        mov    si,OFFSET RL
  207.        mov    di,OFFSET k2
  208.        movsd
  209.        movsd
  210.        movsw
  211.        call   TextureVLine
  212.  
  213.   @@60:
  214.        mov    ax,[yi]
  215.        cmp    [LL.yTo],ax
  216.        jne    @@61
  217.        call   _InitLeft
  218.        mov    ax,[yi]
  219.   @@61:
  220.        cmp    [RL.yTo],ax
  221.        jne    @@62
  222.        call   _InitRight
  223.   @@62:
  224.        inc    [yi]
  225.        mov    ax,[yMax]
  226.        cmp    [yi],ax
  227.        jle    @@21
  228.   @@71:
  229.        leave
  230.        ret    @@return
  231.   ENDP
  232.  
  233.  
  234.  
  235. ;---------------------------------------------------------------------------
  236. ; procedure TextureVLine
  237. ;---------------------------------------------------------------------------
  238.   PROC TextureVLine NEAR
  239.        push   ds
  240.        push   bp
  241.  
  242.        movzx  ebx,[k2.x]
  243.        sub    bx,[k1.x]
  244.        jns    @@01
  245.        neg    bx
  246.   @@01:
  247.        inc    bx
  248.        mov    [DeltaX],bx
  249.  
  250.        mov    eax,[k2.Tx]
  251.        sub    eax,[k1.Tx]
  252.        cdq
  253.        idiv   ebx
  254.        mov    [uicx],eax
  255.  
  256.        mov    eax,[k2.Ty]
  257.        sub    eax,[k1.Ty]
  258.        cdq
  259.        idiv   ebx
  260.        mov    [uicy],eax
  261.  
  262. ;------------------------------
  263.        movsx  eax,[k1.x]
  264.        cmp    ax,[k2.x]
  265.        jnl    @@c3
  266.  
  267.        movsx  eax,[k1.x]
  268.        or     ax,ax
  269.        jnl    @@c1
  270.        push   eax
  271.        imul   [uicx]
  272.        sub    [k1.Tx],eax
  273.        pop    eax
  274.        imul   [uicy]
  275.        sub    [k1.Ty],eax
  276.        mov    [k1.x],0
  277.   @@c1:
  278.        movsx  eax,[k2.x]
  279.        cmp    ax,319
  280.        jng    @@c2
  281.        sub    eax,319
  282.        push   eax
  283.        imul   [uicx]
  284.        sub    [k2.Tx],eax
  285.        pop    eax
  286.        imul   [uicy]
  287.        sub    [k2.Ty],eax
  288.        mov    ax,319
  289.        mov    [k2.x],ax
  290.   @@c2:
  291.        cmp    [k1.x],ax
  292.        jnle   @@40
  293.        jmp    @@c6
  294.   @@c3:
  295.  
  296.        movsx  eax,[k1.x]
  297.        cmp    ax,319
  298.        jng    @@c4
  299.        sub    eax,319
  300.        push   eax
  301.        imul   [uicx]
  302.        add    [k1.Tx],eax
  303.        pop    eax
  304.        imul   [uicy]
  305.        add    [k1.Ty],eax
  306.        mov    [k1.x],319
  307.   @@c4:
  308.        movsx  eax,[k2.x]
  309.        or     ax,ax
  310.        jnl    @@c5
  311.        push   eax
  312.        imul   [uicx]
  313.        add    [k2.Tx],eax
  314.        pop    eax
  315.        imul   [uicy]
  316.        add    [k2.Ty],eax
  317.        xor    ax,ax
  318.        mov    [k2.x],ax
  319.   @@c5:
  320.        cmp    ax,[k1.x]
  321.        jnle   @@40
  322.   @@c6:
  323.  
  324.        mov    bx,[k1.x]
  325.        sub    bx,[k2.x]
  326.        jns    @@11
  327.        neg    bx
  328.   @@11:
  329.        inc    bx
  330.        mov    [DeltaX],bx
  331. ;--------------------------------------------------------------------------
  332.  
  333.        mov    eax,[k2.Tx]
  334.        cmp    eax,[k1.Tx]
  335.        jng    @@21
  336.  
  337.        movzx  edi,[k1.x]
  338.        mov    ax,[xSize]
  339.        mul    [yi]
  340.        add    di,ax
  341.  
  342.        mov    ax,[WORD PTR 2+k1.Ty]
  343.        mul    [TexXSize]
  344.        add    ax,[WORD PTR 2+k1.Tx]
  345.        add    ax,[WORD PTR Texture]
  346.        movzx  esi,ax
  347.  
  348.        mov    eax,[k2.Ty]
  349.        cmp    eax,[k1.Ty]
  350.        jng    @@12
  351.  
  352.        mov    ax,[TexXSize]
  353.        mul    [WORD PTR 2+uicy]
  354.        mov    bp,[WORD PTR 2+uicx]
  355.        add    bp,ax
  356.  
  357.        mov    dx,[TexXSize]
  358.        jmp    @@13
  359.   @@12:
  360.        neg    [uicy]
  361.        mov    ax,[TexXSize]
  362.        mul    [WORD PTR 2+uicy]
  363.        mov    bp,[WORD PTR 2+uicx]
  364.        sub    bp,ax
  365.  
  366.        mov    dx,[TexXSize]
  367.        neg    dx
  368.   @@13:
  369.        push   1
  370.        jmp    @@24
  371.   @@21:
  372.        neg    [uicx]
  373.        movzx  edi,[k2.x]
  374.        mov    ax,[xSize]
  375.        mul    [yi]
  376.        add    di,ax
  377.  
  378.        mov    ax,[WORD PTR 2+k2.Ty]
  379.        mul    [TexXSize]
  380.        add    ax,[WORD PTR 2+k2.Tx]
  381.        add    ax,[WORD PTR Texture]
  382.        movzx  esi,ax
  383.  
  384.        mov    eax,[k2.Ty]
  385.        cmp    eax,[k1.Ty]
  386.        jng    @@22
  387.        mov    ax,[TexXSize]
  388.        mul    [WORD PTR 2+uicy]
  389.        mov    bp,[WORD PTR 2+uicx]
  390.        sub    bp,ax
  391.        mov    dx,[TexXSize]
  392.        neg    dx
  393.        jmp    @@23
  394.   @@22:
  395.        neg    [uicy]
  396.        mov    ax,[TexXSize]
  397.        mul    [WORD PTR 2+uicy]
  398.        mov    bp,[WORD PTR 2+uicx]
  399.        add    bp,ax
  400.        mov    dx,[TexXSize]
  401.   @@23:
  402.        push   -1
  403.   @@24:
  404.  
  405.        movzx  ebx,[WORD PTR uicx]
  406.        rol    ebx,16
  407.        rol    ebp,16
  408.        mov    bp,[WORD PTR uicy]
  409.        rol    ebp,16
  410.  
  411.        add    edi,ebx
  412.        adc    esi,ebp
  413.        jnc    @@30
  414.        add    si,dx
  415.   @@30:
  416.        pop    bx
  417.  
  418.        mov    ax,[k1.x]
  419.        cmp    ax,[k2.x]
  420.        jng    @@31
  421.        neg    bx
  422.   @@31:
  423.        mov    cx,[DeltaX]
  424.        mov    es,[_VirtualVSeg]
  425.        mov    ds,[TextureSeg]
  426.   @@32:
  427.        mov    al,[si]
  428.        mov    [es:di],al
  429.        add    edi,ebx
  430.        adc    esi,ebp
  431.        jnc    @@33
  432.        add    si,dx
  433.   @@33:
  434.        loop   @@32
  435.   @@40:
  436.        pop    bp
  437.        pop    ds
  438.        ret
  439.   ENDP
  440.  
  441.  
  442.  
  443. ;----------------------------------------------------------------------------
  444. ; procedure InitLeft;
  445. ;----------------------------------------------------------------------------
  446.   PROC _InitLeft NEAR
  447.        les    si,[P]
  448.   @@11:
  449.        mov    bx,[L]
  450.        mov    [K],bx
  451.        shl    bx,2
  452.        mov    ax,[es:si+bx]
  453.        mov    [LL.x],ax
  454.  
  455.        mov    bx,[L]
  456.        cmp    bx,0
  457.        jne    @@12
  458.        mov    bx,[Count]
  459.   @@12:
  460.        dec    bx
  461.        mov    cx,bx
  462.        mov    [L],bx
  463.  
  464.        shl    bx,2
  465.        mov    ax,[es:si+bx+2]
  466.        mov    [LL.yTo],ax
  467.        sub    ax,[yi]
  468.        jns    @@13
  469.        neg    ax
  470.   @@13:
  471.        mov    [LL.ddy],ax
  472.        cmp    ax,0
  473.        jne    @@14
  474.        cmp    cx,[min]
  475.        je     @@16
  476.        jmp    @@11
  477.   @@14:
  478.        mov    ax,[es:si+bx]
  479.        mov    [LL.xTo],ax
  480.  
  481.        les    si,[T]
  482.        mov    bx,[k]
  483.        shl    bx,2
  484.        mov    ax,[es:si+bx]
  485.        shl    eax,16
  486.        mov    [LL.Tx],eax
  487.  
  488.        mov    ax,[es:si+bx+2]
  489.        shl    eax,16
  490.        mov    [LL.Ty],eax
  491.  
  492.        mov    [LL.icx],1
  493.        mov    ax,[LL.xTo]
  494.        sub    ax,[LL.x]
  495.        jns    @@15
  496.        neg    [LL.icx]
  497.        neg    ax
  498.   @@15:
  499.        mov    [LL.ddx],ax
  500.        mov    [LL.error],0
  501.  
  502.        mov    bx,[L]
  503.        shl    bx,2
  504.        mov    ax,[es:si+bx]
  505.        shl    eax,16
  506.        sub    eax,[LL.Tx]
  507.        cdq
  508.        movzx  ecx,[LL.ddy]
  509.        idiv   ecx
  510.        mov    [LL.Ticx],eax
  511.  
  512.        mov    ax,[es:si+bx+2]
  513.        shl    eax,16
  514.        sub    eax,[LL.Ty]
  515.        cdq
  516.        movzx  ecx,[LL.ddy]
  517.        idiv   ecx
  518.        mov    [LL.Ticy],eax
  519.   @@16:
  520.        ret
  521.   ENDP
  522.  
  523.  
  524.  
  525. ;----------------------------------------------------------------------------
  526. ; procedure InitRight;
  527. ;----------------------------------------------------------------------------
  528.   PROC _InitRight NEAR
  529.        les    si,[P]
  530.   @@11:
  531.        mov    dx,[K]
  532.        mov    bx,[R]
  533.        mov    [K],bx
  534.        shl    bx,2
  535.        mov    ax,[es:si+bx]
  536.        mov    [RL.x],ax
  537.  
  538.        mov    bx,[R]
  539.        mov    ax,[Count]
  540.        dec    ax
  541.        cmp    bx,ax
  542.        jne    @@12
  543.        mov    bx,-1
  544.   @@12:
  545.        inc    bx
  546.        mov    cx,bx
  547.        mov    [R],bx
  548.  
  549.        shl    bx,2
  550.        mov    ax,[es:si+bx+2]
  551.        mov    [RL.yTo],ax
  552.        sub    ax,[yi]
  553.        jns    @@13
  554.        neg    ax
  555.   @@13:
  556.        mov    [RL.ddy],ax
  557.        cmp    ax,0
  558.        jne    @@14
  559.        cmp    cx,[min]
  560.        je     @@16
  561.        jmp    @@11
  562.   @@14:
  563.        mov    ax,[es:si+bx]
  564.        mov    [RL.xTo],ax
  565.  
  566.        les    si,[T]
  567.        mov    bx,[k]
  568.        shl    bx,2
  569.        mov    ax,[es:si+bx]
  570.        shl    eax,16
  571.        mov    [RL.Tx],eax
  572.  
  573.        mov    ax,[es:si+bx+2]
  574.        shl    eax,16
  575.        mov    [RL.Ty],eax
  576.  
  577.        mov    [RL.icx],1
  578.        mov    ax,[RL.xTo]
  579.        sub    ax,[RL.x]
  580.        jns    @@15
  581.        neg    [RL.icx]
  582.        neg    ax
  583.   @@15:
  584.        mov    [RL.ddx],ax
  585.        mov    [RL.error],0
  586.  
  587.        mov    bx,[R]
  588.        shl    bx,2
  589.        mov    ax,[es:si+bx]
  590.        shl    eax,16
  591.        sub    eax,[RL.Tx]
  592.        cdq
  593.        movzx  ecx,[RL.ddy]
  594.        idiv   ecx
  595.        mov    [RL.Ticx],eax
  596.  
  597.        mov    ax,[es:si+bx+2]
  598.        shl    eax,16
  599.        sub    eax,[RL.Ty]
  600.        cdq
  601.        movzx  ecx,[RL.ddy]
  602.        idiv   ecx
  603.        mov    [RL.Ticy],eax
  604.   @@16:
  605.        ret
  606.   ENDP
  607.   END
  608.  
  609.