home *** CD-ROM | disk | FTP | other *** search
/ Dream 57 / Amiga_Dream_57.iso / Amiga / Programmation / c / QuakeC / qtools0.2-src.lha / src / libqdisplay / drawSpans16-m68k2.S < prev    next >
Encoding:
Text File  |  1998-08-11  |  5.8 KB  |  327 lines

  1.  
  2.  
  3.  
  4.  
  5.  
  6. void draw_spans16(register int y __asm__("a4"), register int ey __asm__("d5"));
  7.  
  8.     __asm ("
  9.  
  10.     .equ    len,a6
  11.     .equ    dest,a5
  12.     .equ    y,a4
  13.     .equ    storev,a3
  14.     .equ    storeu,a2
  15.     .equ    buf,a0        | parameter ...
  16.     
  17.     .equ    prew,fp7
  18.     .equ    prev,fp6
  19.     .equ    preu,fp5
  20.     .equ    w0,fp4
  21.     .equ    v0,fp3
  22.     .equ    u0,fp2
  23.     
  24.     .equ    slen,d7
  25.     .equ    sx,d6
  26.     .equ    ey,d5
  27.  
  28.     .equ    count,d4    | parameter ...
  29.     .equ    dv,d3        |
  30.     .equ    du,d2        |
  31.     .equ    v,d1        |
  32.     .equ    u,d0        |
  33.  
  34. .text
  35.     .globl    _draw_spans16
  36. | void draw_spans16(register int y __asm__ (a4), register int ey __asm__ (d5))
  37. _draw_spans16:
  38.     moveml    d2-d4/d6-d7/a2-a3/a5-a6,sp@-
  39.     fmovem    fp2-fp7,sp@-
  40.  
  41.     movel    _localDim+26,dest    | localDim.frameBuffer
  42.  
  43.     movel    y,d0
  44.     fmovel    d0,preu
  45.  
  46.     fmoves    _tmap+32,prew        | tmap[8]
  47.     fsglmulx preu,prew        | y * tmap[8]
  48.     fadds    _tmap+24,prew        | tmap[6] + y * tmap[8]
  49.  
  50.     fmoves    _tmap+20,prev
  51.     fsglmulx preu,prev
  52.     fadds    _tmap+12,prev
  53.  
  54.     fsglmuls _tmap+8,preu
  55.     fadds    _tmap+0,preu
  56.     
  57.     subl    y,ey            | y < ey
  58.     subql    #1,ey            | (y - 1) <= ey
  59.     blt    .bigEnd16
  60. .bigLoop16:
  61.     lea    @(_scan, y:l:8), a0    | scan[y][]
  62.     movel    a0@+,sx            | FIX_INT(scan[y][0])
  63.     |addl    #65535,sx
  64.     |swap    sx
  65.     movel    a0@,d0            | FIX_INT(scan[y][1])
  66.     |addl    #65535,d0
  67.     |swap    d0
  68.     subw    sx,d0            | scan[y][1] - sx
  69.     ble    .noSpan16        | len > 0
  70.     movew    d0,len
  71.     
  72.     movel    _multRows,buf
  73.     movel    buf@(y:l:4),buf        | multRows[y]
  74.     addl    dest,buf        | localDim.frameBuffer + multRows[y]
  75.     addw    sx,buf            | localDim.frameBuffer + multRows[y] + sx
  76.     addw    sx,buf            | localDim.frameBuffer + multRows[y] + sx
  77.     
  78.     fmovew    sx,u0
  79.     fmoves    #0r65536.0,w0        | 1.0
  80.     fmoves    _tmap+28,fp0        | tmap[7]
  81.     fsglmulx u0,fp0            | sx * tmap[7]
  82.     faddx    prew,fp0        | prew + sx * tmap[7]
  83.     fsgldivx fp0,w0            | 1 / (prew + sx * tmap[7])
  84.  
  85.     fmoves    _tmap+16,v0        | tmap[4]
  86.     fsglmulx u0,v0            | sx * tmap[4]
  87.  
  88.     fsglmuls _tmap+4,u0
  89.  
  90.     faddx    prev,v0            | prev + sx * tmap[4]
  91.     faddx    preu,u0
  92.  
  93.     fsglmulx w0,v0            | (prev + sx * tmap[4]) * w0
  94.     fsglmulx w0,u0
  95.     
  96.     fmovel    v0,v
  97.     fmovel    u0,u
  98.     
  99.     movew    len,slen
  100.     lsrw    #4,slen
  101.     subqw    #1,slen            | dbge if not blts ???
  102.     blt    .noSub16
  103. .sub16:    addw    #16,sx
  104.  
  105.     fmovew    sx,u0
  106.     fmoves    #0r65536.0,w0
  107.     fmoves    _tmap+28,fp0
  108.     fsglmulx u0,fp0
  109.     faddx    prew,fp0
  110.     fsgldivx fp0,w0
  111.  
  112.     fmoves    _tmap+16,v0
  113.     fsglmulx u0,v0
  114.  
  115.     fsglmuls _tmap+4,u0
  116.  
  117.     faddx    prev,v0
  118.     faddx    preu,u0
  119.  
  120.     fsglmulx w0,v0
  121.     fsglmulx w0,u0
  122.     
  123.     fmovel    v0,dv
  124.     fmovel    u0,du
  125.  
  126.     movel    dv,storev
  127.     movel    du,storeu
  128.  
  129.     subl    v,dv
  130.     asrl    #4,dv
  131.     subl    u,du
  132.     asrl    #4,du
  133.     
  134.     |moveq    #16,count
  135.     moveq    #15,count
  136.     bsr    _draw_affine16
  137.  
  138.     movel    storev,v
  139.     movel    storeu,u
  140.     
  141.     dbra    slen,.sub16
  142. .noSub16:
  143.     |moveq    #0,count    | sometimes something in upper word
  144.     movew    len,count
  145.     andw    #0x000F,count
  146.     subqw    #1,count
  147.     blts    .noSpan16    | nothing to do
  148.     beqs    .noRest16    | avoid division by 0
  149.     addw    count,sx    | count is near 15 and sx smaller than 32767
  150.  
  151.     fmovew    sx,fp1
  152.     fmoves    #0r65536.0,w0    | v0 and u0 are scaled by 65536.0 on entry
  153.     fmoves    _tmap+28,fp0
  154.     fsglmulx fp1,fp0
  155.     faddx    prew,fp0
  156.     fsgldivx fp0,w0
  157.  
  158.     fmoves    _tmap+16,fp0    | tmap[4]
  159.     fsglmulx fp1,fp0    | sx * tmap[4]
  160.  
  161.     fsglmuls _tmap+4,fp1
  162.  
  163.     faddx    prev,fp0    | prev + sx * tmap[4]
  164.     faddx    preu,fp1
  165.  
  166.     fsglmulx w0,fp0        | (prev + sx * tmap[4]) * w1
  167.     fsglmulx w0,fp1
  168.  
  169.     fsubx    v0,fp0        | v1 - v0
  170.     fsubx    u0,fp1
  171.  
  172.     fsgldivw count,fp0
  173.     fsgldivw count,fp1
  174.  
  175.     fmovel    fp0,dv
  176.     fmovel    fp1,du
  177.     
  178. .noRest16:
  179.     |addqw    #1,count
  180.     bsrs    _draw_affine16
  181. .noSpan16:
  182.     fadds    _tmap+32,prew
  183.     fadds    _tmap+20,prev
  184.     fadds    _tmap+8,preu
  185.     addql    #1,y        | y++
  186.     dbra    ey,.bigLoop16
  187. .bigEnd16:
  188.     fmovem    sp@+,fp2-fp7
  189.     moveml    sp@+,d2-d4/d6-d7/a2-a3/a5-a6
  190.     rts
  191.     .even
  192.  
  193. _draw_affine16:
  194.     movew    _textureType,a1
  195.     cmpw    #1,a1
  196.     bnes    .noWall16
  197.     moveml    d5-d7,sp@-
  198.     movel    _texture,a1
  199.     movel    #0x0000FF00,d7            | from tables.h        ,MAX_MASKX
  200.     asrl    #8,v                | inaccurate but fast    ,16-MAX_LOGX
  201.     asrl    #8,dv                | inaccurate but fast    ,16-MAX_LOGX
  202. .wall16:
  203.     movel    u,d6
  204.     movel    v,d5
  205.     clrw    d6
  206.     swap    d6
  207.     andl    d7,d5                | nessecary? -> yep
  208.     moveb    _textureRow+3,d5
  209.     addl    @(_multTMap, d5:l:4),d6
  210.     movew    a1@(d6:l:2),buf@+
  211.     addl    du,u
  212.     addl    dv,v    
  213.     dbra    count,.wall16
  214.     moveml    sp@+,d5-d7
  215.     rts
  216. .noWall16:
  217.     cmpw    #5,a1
  218.     bnes    .noSky16
  219.     moveml    d5-d7,sp@-
  220.     movel    _texture,a1
  221.     movew    #0x7F7F,d7
  222.     asrl    #8,u                | inaccurate but fast
  223.     asrl    #8,du                | inaccurate but fast
  224. .sky16:
  225.     movel    u,d6
  226.     movel    v,d5
  227.     swap    d5
  228.     moveb    d5,d6
  229.     movew    d6,d5
  230.     addw    _skyMovementX1+2,d6
  231.     addw    _skyMovementX2+2,d5
  232.     addb    _skyMovementY1+3,d6
  233.     addb    _skyMovementY2+3,d5
  234.     andw    d7,d6
  235.     andw    d7,d5
  236.     movew    a1@(0x100, d6:w:2),d6
  237.     movew    a1@(d5:w:2),d5
  238.     beqs    .skipSky16
  239.     movew    d5,d6
  240. .skipSky16:
  241.     movew    d6,buf@+
  242.     addl    du,u
  243.     addl    dv,v    
  244.     dbra    count,.sky16
  245.     moveml    sp@+,d5-d7
  246.     rts
  247.  
  248. .noSky16:
  249.     moveml    a2/d5-d7,sp@-
  250.     | fast configureable transparency for 16bit needed!!
  251.     subql    #2,a1            | textureType - WATER_TYPE + 1
  252.     movel    _texture,a2
  253.     moveq    #0,d7            | nessecary ? (asr is faster then)
  254. .liquid16:
  255.     movew    _textureShift2,d7
  256.     movel    u,d6            | bfextu    u{d7:8},d6
  257.     movel    v,d5            | bfextu    v{d7:8},d5
  258.     asrl    d7,d6            | ...
  259.     asrl    d7,d5            | ...
  260.     andw    #0x00FF,d6        | ...
  261.     andw    #0x00FF,d5        | ...
  262.     movel    @(_swim_v, d6:w:4),d6
  263.     movel    @(_swim_u, d5:w:4),d5
  264.     movew    _textureMip,d7
  265.     asrl    d7,d6
  266.     asrl    d7,d5
  267.     addl    v,d6
  268.     addl    u,d5
  269.     movew    _textureShift1,d7
  270.     swap    d6
  271.     asrl    d7,d5
  272.     andl    _textureMask2,d6
  273.     andl    _textureMask1,d5
  274.     orl    d6,d5
  275.     |moveq    #0,d6            | d6 is not greater than 64*64, so the upper bits are 0
  276.     movew    buf@,d6
  277.     movew    a2@(d5:w:2),d5
  278.  
  279.     | fast configureable transparency for 16bit needed!!
  280.     movel    d3,sp@-
  281.     movel    d4,sp@-
  282.     movel    a1,d3
  283.     
  284.     .equ    temp,d7
  285.     .equ    color1,d6
  286.     .equ    color2,d5
  287.     .equ    out,d4
  288.     | we only have percents
  289.     | with power of two    (100%,50%,25%,12.5%,6.5%)
  290.     .equ    perc,d3
  291.     
  292.     movel    color1,out
  293.     subl    color2,out
  294.     asrl    perc,out
  295.     andw    #0xF800,out
  296.     addw    color2,out
  297.     andw    #0xF800,out
  298.     andw    #0x07FF,color1
  299.     andw    #0x07FF,color2
  300.  
  301.     movel    color1,temp
  302.     subl    color2,temp
  303.     asrl    perc,temp
  304.     andw    #0x01E0,temp
  305.     addw    color2,temp
  306.     andw    #0x01E0,temp
  307.     orw    temp,out
  308.     andw    #0x001F,color1
  309.     andw    #0x001F,color2
  310.  
  311.     subl    color2,color1
  312.     asrl    perc,color1
  313.     addw    color2,color1
  314.     orw    color1,out
  315.  
  316.     movew    d4,buf@+
  317.     movel    sp@+,d4
  318.     movel    sp@+,d3
  319.     |
  320.     
  321.     addl    du,u
  322.     addl    dv,v    
  323.     dbra    count,.liquid16
  324.     moveml    sp@+,a2/d5-d7
  325.     rts
  326.     ");
  327.