home *** CD-ROM | disk | FTP | other *** search
/ M.u.C.S. Disc 2000 / MUCS2000.iso / falcon / whip.031 / vlm / raytun11 / raytun.s < prev    next >
Text File  |  1999-08-19  |  14KB  |  761 lines

  1. VLM_MODULE:    =    0
  2. SHOWVBL:    =    0
  3.  
  4. ******** OBJECT EQUS ********
  5.  
  6. tunnelxblocks:    =    20
  7. tunnelwidth:    =    tunnelxblocks*16
  8. tunnelyblocks:    =    100/8
  9. defdist:    =    $5000
  10.  
  11.         RSRESET
  12. camparam1:    RS.W    1
  13. camparam2:    RS.W    1
  14. camparam3:    RS.W    1
  15. camparam4:    RS.W    1
  16. camtblsize:    RS.W    1
  17.  
  18.     TEXT
  19.  
  20.     OPT    D-
  21.  
  22.     IFNE    VLM_MODULE
  23.     OUTPUT    E:\WHIP!\VLM\RAYTUN.VLM
  24.     ELSE
  25.     OPT    ATARI
  26.     COMMENT    HEAD=%101
  27.     INCBIN    MINIWHIP.BIN
  28.     ENDC
  29.  
  30.     DC.B    "VLM2"
  31.     DC.L    infotext
  32.     DC.L    settings
  33.     DC.L    init
  34.     DC.L    deinit
  35.     DC.L    main
  36.  
  37.     INCLUDE    VLMSERV.S
  38.     INCLUDE    FIMATH.I
  39.     TEXT
  40.     INCLUDE    FSCR.I
  41.     TEXT
  42.  
  43. main:    vlm_get_left_volume    d0
  44.     move.w    $4ba.w,d0    
  45.     mulu.w    #11,d0
  46.     Do_SinModulo    d0
  47.     Get_Sin    sine_tbl,d0,d0
  48.     addi.l    #$8000,d0
  49.     lsl.l    #8,d0
  50.     lsl.l    #6,d0
  51.     move.l    d0,leftvol
  52.     vlm_get_right_volume    d0
  53.     lsl.l    #8,d0
  54.     lsl.l    #6,d0
  55.     move.l    d0,rightvol
  56.  
  57. * Do left spectrum shit...
  58.     movea.l    service_struct,a1
  59.     movea.l    16(a1),a1
  60.     jsr    (a1)
  61.     moveq    #128-1,d7
  62.     lea    leftspec_tbl,a1
  63.     lea    pal16d_tbl,a2
  64.     moveq    #0,d0
  65.  
  66. .leftspecloop:
  67.     move.b    (a0),d0
  68.     addq    #2,a0
  69.     move.l    (a2,d0.l*4),(a1)+
  70.     dbra    d7,.leftspecloop
  71.     
  72. * Do right spectrum shit..
  73.     movea.l    service_struct,a1
  74.     movea.l    20(a1),a1
  75.     jsr    (a1)
  76.     moveq    #128-1,d7
  77.     lea    rightspec_tbl+128*4,a1
  78.     lea    pal16d_tbl,a2
  79.     moveq    #0,d0
  80.  
  81. .rightspecloop:
  82.     move.b    (a0),d0
  83.     addq    #2,a0
  84.     move.l    (a2,d0.l*4),-(a1)
  85.     dbra    d7,.rightspecloop
  86.  
  87.     lea    cam_tbl,a4
  88.     lea    sine_tbl,a2
  89.     move.w    $4bc.w,d0
  90.     move.w    d0,d1
  91.     lsr.w    #4,d0
  92.     lsr.w    #2,d1
  93.     ;move.w    d1,camparam4(a4)
  94.     Do_SinModulo    d1
  95.     Get_SinCos    a2,d1,d0,d1
  96.     asr.w    #4,d0
  97.     asr.w    #3,d1
  98.     move.w    d0,camparam1(a4)
  99.     move.w    d1,camparam2(a4)
  100.     asr.w    #1,d1
  101.     eori.w    #$8000,d1
  102.     Do_SinModulo    d1
  103.     Get_Sin    a2,d1,d0
  104.     asr.w    #2,d0
  105.     move.w    $4bc.w,d1
  106.     lsl.w    #5,d1
  107.     move.w    d1,camparam3(a4)
  108.  
  109.     lea    grid_tbl,a1
  110.     lea    cam_tbl,a4
  111.     bsr    CALC_FASTRAYTUNNEL
  112.  
  113. .plot:    lea    leftspec_tbl,a5
  114.     lea    grid_tbl,a1
  115.     tst.w    drawtype+2
  116.     bne.s    .sloppy
  117.     bsr    PLOT_TIDYRAYTUNNEL
  118.     bra.s    .end_plot
  119. .sloppy:
  120.     bsr    PLOT_SLOPPYRAYTUNNEL
  121. .end_plot:
  122.  
  123.     IFNE    SHOWVBL
  124.  
  125.     movea.l    scr,a3
  126.     move.w    $4bc.w,d7
  127.     move.w    .old4bc(pc),d6
  128.     move.w    d7,.old4bc
  129.     sub.w    d6,d7
  130.     subq.w    #1,d7
  131.     cmpi.w    #50,d7
  132.     bhs.s    .end_showvbl
  133.  
  134. .vsl:    move.l    #$ffff0000,(a3)+
  135.     dbra    d7,.vsl
  136.  
  137. .end_showvbl:
  138.     moveq    #0,d0
  139.     move.l    d0,(a3)+
  140.     move.l    d0,(a3)+
  141.     move.l    d0,(a3)+
  142.     move.l    d0,(a3)+
  143.  
  144.     ENDC
  145.  
  146.     lea    scr,a0
  147.     move.l    (a0)+,d0
  148.     move.l    (a0)+,-8(a0)
  149.     move.l    (a0),-4(a0)
  150.     move.l    d0,(a0)
  151.     move.l    d0,d1
  152.     lsr.w    #8,d0
  153.     move.l    d0,$ffff8200.w
  154.     move.b    d1,$ffff820d.w
  155.     rts
  156.  
  157. .old4bc:
  158.     DC.W    0
  159.  
  160. init:    move.l    a0,service_struct
  161.     vlm_set_resolution #VLM_320x100x16
  162.  
  163.     lea    pal32_tbl,a0
  164.     move.w    tunnelcolor+2,d0
  165.     movea.l    (colorselect_tbl,d0.w*4),a1
  166.     lea    pal16d_tbl,a2
  167.     bsr    MAKE_COLORFLOWD
  168.  
  169.     lea    cam_tbl,a0
  170.     move.w    #0,camparam1(a0)
  171.     move.w    #0,camparam2(a0)
  172.     move.w    #0,camparam3(a0)
  173.     move.w    #0,camparam4(a0)
  174.     
  175.     lea    scr1,a0
  176.     bsr    CLEAR_320100TSCR
  177.     lea    scr2,a0
  178.     bsr    CLEAR_320100TSCR
  179.     lea    scr3,a0
  180.     bsr    CLEAR_320100TSCR
  181.     rts
  182.  
  183. deinit:    rts
  184.  
  185. * <UNIT><GRaDiaToR><UNIT>
  186. * INPUT: a0: 32 bitch output palette
  187. *        a1: colorflow instruction table
  188. *        a2: 16bit*2 output palette
  189. MAKE_COLORFLOWD:
  190.     movea.l    a0,a3
  191.     move.w    (a1)+,d7
  192.     moveq    #0,d0
  193.     move.w    (a1)+,d0
  194.     moveq    #1,d6
  195.     lsl.w    d0,d6
  196.     move.w    d7,d5
  197.     mulu.w    d6,d5
  198.     move.w    d5,(a0)+
  199.     subq.w    #1,d6
  200.     move.w    d6,d5
  201.     subq.w    #1,d7
  202.  
  203. .biglop:
  204.     move.l    (a1)+,d1
  205.     move.l    (a1),d2
  206.     moveq.l    #0,d3
  207.     move.l    d3,d4
  208.     move.b    d1,d3
  209.     move.b    d2,d4
  210.     swap    d3
  211.     swap    d4
  212.     sub.l    d3,d4
  213.     asr.l    d0,d4
  214.     move.l    a0,a6
  215. .lop1:    swap    d3
  216.     move.b    d3,3(a0)
  217.     addq    #4,a0
  218.     swap    d3
  219.     add.l    d4,d3
  220.     dbra    d6,.lop1
  221.     move.w    d5,d6
  222.     move.l    a6,a0
  223.     moveq    #0,d3
  224.     move.l    d3,d4
  225.     swap    d1
  226.     swap    d2
  227.     move.b    d1,d3
  228.     move.b    d2,d4
  229.     swap    d3
  230.     swap    d4
  231.     sub.l    d3,d4
  232.     asr.l    d0,d4
  233. .lop2:    swap    d3
  234.     move.b    d3,1(a0)
  235.     addq    #4,a0
  236.     swap    d3
  237.     add.l    d4,d3
  238.     dbra    d6,.lop2
  239.     move.l    a6,a0
  240.     move.w    d5,d6
  241.     moveq.l    #0,d3
  242.     move.l    d3,d4
  243.     swap    d1
  244.     swap    d2
  245.     rol.l    #8,d1
  246.     rol.l    #8,d2
  247.     move.b    d1,d3
  248.     move.b    d2,d4
  249.     swap    d3
  250.     swap    d4
  251.     sub.l    d3,d4
  252.     asr.l    d0,d4
  253. .lop3:    swap    d3
  254.     move.b    d3,(a0)
  255.     addq    #4,a0
  256.     swap    d3
  257.     add.l    d4,d3
  258.     dbra    d6,.lop3
  259.     move.w    d5,d6
  260.     dbra    d7,.biglop
  261.  
  262.     movea.l    a3,a1            * truepal (32 bit)
  263.     move.l    a2,a0            * realpal (16 bit)
  264.     move.w    (a1)+,d7
  265.  
  266. .loop:    moveq    #0,d0
  267.     move.b    (a1)+,d0
  268.     andi.b    #%11111000,d0
  269.     lsl.w    #8,d0
  270.     moveq    #0,d1
  271.     move.b    (a1)+,d1
  272.     andi.b    #%11111100,d1
  273.     lsl.w    #3,d1
  274.     moveq    #0,d2
  275.     addq.l    #1,a1
  276.     move.b    (a1)+,d2
  277.     lsr.w    #3,d2
  278.     or.w    d2,d0
  279.     or.w    d1,d0
  280.     move.w    d0,(a0)+
  281.     move.w    d0,(a0)+
  282.     dbra    d7,.loop
  283.  
  284.     rts
  285.  
  286. * INPUT: a1: address of gridtable
  287. *        a4: address of cameratable
  288. CALC_FASTRAYTUNNEL:
  289.  
  290.         RSRESET
  291. .x0:        RS.L    1
  292. .y0:        RS.L    1
  293. .z0:        RS.L    1
  294. .x1:        RS.L    1
  295. .y1:        RS.L    1
  296. .z1:        RS.L    1
  297. .x2:        RS.L    1
  298. .y2:        RS.L    1
  299. .z2:        RS.L    1
  300. .dx:        RS.L    1
  301. .dy:        RS.W    1
  302. .dz:        RS.W    1
  303. .cornertblsize:    RS.W    1
  304.  
  305.     Do_SinModulo    camparam1(a4)
  306.     Do_SinModulo    camparam2(a4)
  307.     lea    sine_tbl,a0
  308.     move.w    #tunnelxblocks*1900,d7    * x end value
  309.     move.w    #-tunnelxblocks*1900,d0    * x start value
  310.     swap    d7
  311.     move.w    #tunnelyblocks*1900,d7    * y end value
  312.     move.w    #-tunnelyblocks*1900,d1    * y start value
  313.     lea    .corner_tbl(pc),a5
  314.  
  315. * Precalculate 3d-transformations of the corner, so you can interpolate all
  316. * the inbetween coordinates.
  317. * Calculate (x0,y0,z0) upperleft corner of grid.
  318.     move.w    tunneldistance+2,d2    * Screen distance by observer (ie. focal lenght!)
  319.     move.w    camparam1(a4),d3    * Rotates ray on X axis.
  320.     Get_SinCos    a0,d3,d3,d4    * Get sin(a) and cos(a).
  321.     move.w    d3,d5
  322.     move.w    d4,d6
  323.     muls.w    d2,d3            * z*sin
  324.     muls.w    d1,d4            * y*cos
  325.     muls.w    d1,d5            * y*sin
  326.     muls.w    d2,d6            * z*cos
  327.     add.l    d5,d6            * Z
  328.     sub.l    d3,d4            * Y
  329.     add.l    d6,d6
  330. ;    add.l    d4,d4
  331.     swap    d6
  332.     move.l    d4,.y0(a5)
  333.     move.w    camparam2(a4),d3    * Rotate ray on Y axis.
  334.     Get_SinCos    a0,d3,d3,d4     * Get sin(b) and cos(b).
  335.     move.w    d3,d5
  336.     move.w    d4,d2
  337.     muls.w    d0,d3            * x*sin
  338.     muls.w    d6,d5            * Z*sin
  339.     muls.w    d0,d2            * x*cos
  340.     muls.w    d6,d4            * Z*cos
  341.     add.l    d2,d5            * X
  342.     sub.l    d3,d4            * Z
  343. ;    add.l    d5,d5
  344. ;    add.l    d4,d4
  345.     ;add.l    leftvol,d5
  346.     move.l    d5,.x0(a5)        * Store X.
  347.     move.l    d4,.z0(a5)        * Store Z.
  348. * Calculate (x2,y2,z2) lower left corner of grid.
  349.     move.w    tunneldistance+2,d2    * Screen distance by observer (ie. focal lenght!)
  350.     move.w    camparam1(a4),d3    * Rotates ray on X axis.
  351.     Get_SinCos    a0,d3,d3,d4    * Get sin(a) and cos(a).
  352.     move.w    d3,d5
  353.     move.w    d4,d6
  354.     muls.w    d2,d3            * z*sin
  355.     muls.w    d7,d4            * y*cos
  356.     muls.w    d7,d5            * y*sin
  357.     muls.w    d2,d6            * z*cos
  358.     add.l    d5,d6            * Z
  359.     sub.l    d3,d4            * Y
  360.     add.l    d6,d6
  361. ;    add.l    d4,d4
  362.     swap    d6
  363.     move.l    d4,.y2(a5)
  364.     move.w    camparam2(a4),d3    * Rotate ray on Y axis.
  365.     Get_SinCos    a0,d3,d3,d4     * Get sin(b) and cos(b).
  366.     move.w    d3,d5
  367.     move.w    d4,d2
  368.     muls.w    d0,d3            * x*sin
  369.     muls.w    d6,d5            * Z*sin
  370.     muls.w    d0,d2            * x*cos
  371.     muls.w    d6,d4            * Z*cos
  372.     add.l    d2,d5            * X
  373.     sub.l    d3,d4            * Z
  374. ;    add.l    d5,d5
  375. ;    add.l    d4,d4
  376.     ;add.l    leftvol,d5
  377.     move.l    d5,.x2(a5)        * Store X.
  378.     move.l    d4,.z2(a5)        * Store Z.
  379. * Calculate (x1,y1,z1) upper right corner of grid.
  380.     move.w    tunneldistance+2,d2    * Screen distance by observer (ie. focal lenght!)
  381.     swap    d7
  382.     move.w    camparam1(a4),d3    * Rotates ray on X axis.
  383.     Get_SinCos    a0,d3,d3,d4    * Get sin(a) and cos(a).
  384.     move.w    d3,d5
  385.     move.w    d4,d6
  386.     muls.w    d2,d3            * z*sin
  387.     muls.w    d1,d4            * y*cos
  388.     muls.w    d1,d5            * y*sin
  389.     muls.w    d2,d6            * z*cos
  390.     add.l    d5,d6            * Z
  391.     sub.l    d3,d4            * Y
  392.     add.l    d6,d6
  393. ;    add.l    d4,d4
  394.     swap    d6
  395.     move.l    d4,.y1(a5)
  396.     move.w    camparam2(a4),d3    * Rotate ray on Y axis.
  397.     Get_SinCos    a0,d3,d3,d4     * Get sin(b) and cos(b).
  398.     move.w    d3,d5
  399.     move.w    d4,d2
  400.     muls.w    d7,d3            * x*sin
  401.     muls.w    d6,d5            * Z*sin
  402.     muls.w    d7,d2            * x*cos
  403.     muls.w    d6,d4            * Z*cos
  404.     add.l    d2,d5            * X
  405.     sub.l    d3,d4            * Z
  406. ;    add.l    d5,d5
  407. ;    add.l    d4,d4
  408.     ;add.l    leftvol,d5
  409.     move.l    d5,.x1(a5)        * Store X.
  410.     move.l    d4,.z1(a5)        * Store Z.
  411.  
  412. * Interpolate all the coordinates in the grid and do the texture-calculation.
  413.     movea.l    a1,a3
  414.     move.w    camparam3(a4),-(sp)
  415. * Do xloop-increment initialization.
  416.     movem.l    .x0(a5),d4-d6
  417.     movem.l    .x1(a5),d0-d2
  418.     sub.l    d4,d0
  419.     sub.l    d5,d1
  420.     sub.l    d6,d2
  421.     movea.l    d4,a0
  422.     movea.l    d5,a1
  423.     movea.l    d6,a2
  424.     divs.l    #tunnelxblocks,d0
  425.     divs.l    #tunnelxblocks,d1
  426.     divs.l    #tunnelxblocks,d2
  427.     asr.l    #8,d5
  428.     move.w    d5,d4
  429.     swap    d4
  430.     swap    d5
  431.     swap    d6
  432.     movem.l    d4-d6,(a5)
  433.     asr.l    #8,d1
  434.     move.w    d1,d0
  435.     swap    d0
  436.     swap    d1
  437.     swap    d2
  438.     move.l    d0,a4
  439.     move.l    d1,d3
  440.     move.l    d2,a6
  441. * Do yloop-increment initialization.
  442.     movem.l    .x2(a5),d0-d2
  443.     sub.l    a0,d0
  444.     sub.l    a1,d1
  445.     sub.l    a2,d2
  446.     divs.l    #tunnelyblocks,d0
  447.     divs.l    #tunnelyblocks,d1
  448.     divs.l    #tunnelyblocks,d2
  449.     asr.l    #8,d1
  450.     move.w    d1,d0
  451.     swap    d0
  452.     swap    d1
  453.     swap    d2
  454.     move.l    d0,.dx(a5)
  455.     move.w    d1,.dy(a5)
  456.     move.w    d2,.dz(a5)
  457.     
  458.     moveq    #tunnelyblocks,d7
  459.     lea    atan2_tbl+(32768+128)*2,a2
  460.     move.w    (sp)+,d2
  461.  
  462. .yloop:    swap    d7
  463.     move.w    #tunnelxblocks,d7    * x loopcounter
  464.  
  465. * t = r / sqrt(x^2 + y^2)
  466. * v = t * z
  467. * u = atan2(y, x)
  468.  
  469. * a0    LUT    lut[(a<<8)+b] = r / sqrt(a^2 + b^2)
  470. * a1    LUT    lut[(a<<8)+b] = a * b
  471. * a2    LUT    lut[(a<<8)+b] = (atan2(b, a)/PI) << 8
  472. * a3    tunneltab
  473. * d4    x,y    yy00XXxx
  474. * d5    y    ......YY
  475. * d6    z    ....ZZzz
  476. * a4    dx,dy    yy00XXxx
  477. * d3    dy    ......YY
  478. * a6    dz    ....ZZzz
  479. * d0,d1: trashed.
  480.  
  481. .xloop:    move.w    d4,d0            * 2   Combine x & y vectors.
  482.     move.b    d5,d0            * 2
  483.     move.w    (a2,d0.w*2),(a3)+    * 12? u = atan2(y, x)
  484.     add.l    a4,d4            * 4?  / Interpolate
  485.     addx.b    d3,d5            * 2   | direction-
  486.     dbra    d7,.xloop
  487.  
  488.     movem.l    (a5),d4-d6
  489.     add.l    .dx(a5),d4
  490.     move.w    .dy(a5),d0
  491.     addx.w    d0,d5
  492.     add.w    .dz(a5),d6
  493.     movem.l    d4-d6,(a5)
  494.  
  495.     swap    d7
  496.     dbra    d7,.yloop
  497.  
  498.     rts
  499.  
  500. .corner_tbl:
  501.     DS.B    .cornertblsize
  502.  
  503. * INPUT: a1: address of (u,v) grid
  504. *        a5: address of texture
  505. PLOT_TIDYRAYTUNNEL:
  506.     movea.l    scr,a0
  507.     lea    (tunnelxblocks+1)*2(a1),a2
  508.     lea    320-tunnelwidth(a0),a0
  509.     moveq    #tunnelyblocks-1,d7    * y loop counter
  510.     moveq    #0,d0
  511.  
  512. .scanlineloop:
  513.     moveq    #tunnelwidth/16-1,d6    * x loop counter
  514.     
  515. .square:
  516.     move.w    (a2)+,d1        * u4
  517.     move.w    (a1)+,d3        * u1
  518.     move.w    (a2),d2            * u3
  519.     move.w    (a1),d4            * u2
  520.     sub.w    d3,d1            * u4-u1
  521.     sub.w    d4,d2            * u3-u2
  522.     lsl.w    #3,d1            * / sign-extend
  523.     lsl.w    #3,d2            * | to prevent
  524.     asr.w    #3,d1            * | carry-errors..
  525.     asr.w    #3,d2            * \
  526.     lsl.w    #3,d3            * / Multiply start U's by 8.
  527.     lsl.w    #3,d4            * \ (instead of dividing dU's by 8)
  528.     movea.l    d3,a3
  529.     movea.l    d4,a4
  530.     moveq    #8-1,d5
  531.  
  532. .Yspan:    move.w    a3,d3            * uL
  533.     move.w    a4,d4            * uR
  534.     sub.w    a3,d4            * du := uR-uL
  535.     asr.w    #3,d4            * du := du/8
  536.  
  537.     REPT    8
  538.     move.w    d3,d0            * / Get integer
  539.     lsr.w    #8,d0            * \ part in d0.b
  540.     move.l    (a5,d0.l*4),(a0)+    * put doublepixel on screen
  541.     add.w    d4,d3            * u+du
  542.     ENDR
  543.  
  544.     lea    (320-16)*2(a0),a0    * next span
  545.     adda.l    d1,a3            * uL+duL
  546.     adda.l    d2,a4            * ur+duR
  547.     dbra    d5,.Yspan
  548.  
  549.     lea    (-8*320+16)*2(a0),a0    * next nice little square
  550.     dbra    d6,.square
  551.  
  552.     addq    #2,a1
  553.     addq    #2,a2
  554.     lea    ((320-tunnelwidth)+320*7)*2(a0),a0
  555.     dbra    d7,.scanlineloop
  556.     rts
  557.  
  558. * Sloppy Wrench Body algorithm
  559. * INPUT: a1: address of (u,v) grid
  560. *        a5: address of texture
  561. PLOT_SLOPPYRAYTUNNEL:
  562.     movea.l    scr,a0
  563.     lea    (tunnelxblocks+1)*2(a1),a2
  564.     lea    320-tunnelwidth(a0),a0
  565.     movea.w    #(320-16)*2,a6
  566.     moveq    #tunnelyblocks-1,d7    * y loop counter
  567.     moveq    #0,d0
  568.  
  569. .scanlineloop:
  570.     moveq    #tunnelwidth/16-1,d6    * x loop counter
  571.     
  572. .square:
  573.     move.w    (a2)+,d1        * u4
  574.     move.w    (a1)+,d3        * u1
  575.     move.w    (a2),d2            * u3
  576.     move.w    (a1),d4            * u2
  577.     sub.w    d3,d1            * u4-u1
  578.     sub.w    d4,d2            * u3-u2
  579.     lsl.w    #3,d1            * / sign-extend
  580.     lsl.w    #3,d2            * | to prevent
  581.     asr.w    #3,d1            * | carry-errors..
  582.     asr.w    #3,d2            * \
  583.     lsl.w    #3,d3            * / Multiply start U's by 8.
  584.     lsl.w    #3,d4            * \ (instead of dividing dU's by 8)
  585.     movea.w    d3,a3
  586.     movea.w    d4,a4
  587.     moveq    #8-1,d5
  588.  
  589. .Yspan:    move.w    a3,d3            * uL
  590.     move.w    a4,d4            * uR
  591.     sub.w    a3,d4            * du := uR-uL
  592.     asr.w    #3,d4            * du := du/8
  593.     ror.l    #8,d4            * / Prepare
  594.     ror.l    #8,d3            * | for
  595.     move.b    d3,d0            * | addx.l
  596.     add.l    d4,d3            * \ loop..
  597.  
  598.     move.b    d0,d3            * Restore integer part of U
  599.     move.l    (a5,d0.l*4),(a0)+    * Put doublepixel on screen.
  600.     addx.l    d4,d3            * u+du
  601.     REPT    6
  602.     move.b    d3,d0            * Get integer part of U in d0.b
  603.     move.l    (a5,d0.l*4),(a0)+    * Put doublepixel on screen.
  604.     addx.l    d4,d3            * u+du
  605.     ENDR
  606.     move.b    d3,d0            * Get integer part of U in d0.b
  607.     move.l    (a5,d0.l*4),(a0)+    * Put doublepixel on screen.
  608.  
  609.     adda.l    a6,a0            * next span
  610.     adda.l    d1,a3            * uL+duL
  611.     adda.l    d2,a4            * ur+duR
  612.     dbra    d5,.Yspan
  613.  
  614.     lea    (-8*320+16)*2(a0),a0    * next nice little square
  615.     dbra    d6,.square
  616.  
  617.     addq    #2,a1
  618.     addq    #2,a2
  619.     lea    ((320-tunnelwidth)+320*7)*2(a0),a0
  620.     dbra    d7,.scanlineloop
  621.     rts
  622.  
  623.     DATA
  624.  
  625. atan2_tbl:
  626.     INCBIN    ATAN2TBL.DAT
  627. sine_tbl:
  628.     INCBIN    SINUS.DAT
  629.  
  630. scr:    DC.L    scr1,scr2,scr3
  631.  
  632. colorselect_tbl:
  633.     DC.L    redflowinstr_tbl
  634.     DC.L    greenflowinstr_tbl
  635.  
  636. redflowinstr_tbl:
  637.     DC.W    (.end-.start)/4
  638.     DC.W    4
  639.  
  640. .start:    DC.L    $00000000
  641.     DC.L    $1f000000
  642.     DC.L    $3f000000
  643.     DC.L    $5f000000
  644.     DC.L    $7f000000
  645.     DC.L    $9f000000
  646.     DC.L    $bf000000
  647.     DC.L    $df000000
  648.     DC.L    $ff00003f
  649.     DC.L    $ff00007f
  650.     DC.L    $ff0000bf
  651.     DC.L    $ff0000ff
  652.     DC.L    $ff3f00ff
  653.     DC.L    $ff7f00ff
  654.     DC.L    $ffbf00ff
  655.     DC.L    $ffff00ff
  656.     DC.L    $ffff00ff
  657. .end:
  658.  
  659. greenflowinstr_tbl:
  660.     DC.W    (.end-.start)/4
  661.     DC.W    4
  662.  
  663. .start:    DC.L    $00000000
  664.     DC.L    $003f0000
  665.     DC.L    $007f0000
  666.     DC.L    $3fdf0000
  667.     DC.L    $7fff0000
  668.     DC.L    $dfff0000
  669.     DC.L    $ffff0000
  670.     DC.L    $ffff003f
  671.     DC.L    $ffff007f
  672.     DC.L    $ffff00bf
  673.     DC.L    $ffff00ff
  674.     DC.L    $ffff00ff
  675.     DC.L    $ffff00ff
  676.     DC.L    $ffff00ff
  677.     DC.L    $ffff00ff
  678.     DC.L    $ffff00ff
  679.     DC.L    $ffff00ff
  680. .end:
  681.  
  682. settings:
  683.     DC.L    3
  684.  
  685.     DC.L    drawtype_txt
  686.     DC.L    2
  687. drawtype:
  688.     DC.L    1
  689.     DC.L    drawtype_tbl
  690.  
  691.     DC.L    tunneldist_txt
  692.     DC.L    3
  693. tunneldistance:
  694.     DC.L    defdist
  695.     DC.L    tunneldist_dat
  696.  
  697.     DC.L    tunnelcolor_txt
  698.     DC.L    2
  699. tunnelcolor:
  700.     DC.L    0
  701.     DC.L    tunnelcolor_tbl
  702.  
  703. tunneldist_dat:
  704.     DC.L    0,$5b00
  705. drawtype_tbl:
  706.     DC.L    2
  707.     DC.B    "Tidy   (slower)",0
  708.     DC.B    "Sloppy (faster)",0
  709. tunnelcolor_tbl:
  710.     DC.L    2
  711.     DC.B    "Infra Violet",0
  712.     DC.B    "Greenery",0
  713.  
  714. drawtype_txt:
  715.     DC.B    "PAINTING ALGORITHM",0
  716. tunneldist_txt:
  717.     DC.B    "PERSPECTIVE",0
  718. tunnelcolor_txt:
  719.     DC.B    "TUNNEL COLOR",0
  720.  
  721. infotext:
  722.     DC.B    "FREE SPECTRAL TUNNEL",0
  723.     DC.B    "Author:  eARx/fUN InD.",0
  724.     DC.B    "Version: 1.1",0
  725.     DC.B    "Date:    19-08-1999",0
  726.     DC.B    0
  727.     EVEN
  728.     
  729.     BSS
  730.  
  731. pal32_tbl:
  732.     DS.L    256
  733. pal16d_tbl:
  734.     DS.L    256
  735. tuntextureadr:
  736.     DS.L    1
  737. grid_tbl:
  738.     DS.L    (tunnelxblocks+1)*(tunnelyblocks+1)
  739. raytunstarttime:
  740.     DS.W    1
  741. cam_tbl:
  742.     DS.B    camtblsize
  743.  
  744. service_struct:
  745.     DS.L    1
  746.     
  747. leftvol:
  748.     DS.L    1
  749. rightvol:
  750.     DS.L    1
  751. leftspec_tbl:
  752.     DS.L    128
  753. rightspec_tbl:
  754.     DS.L    128
  755.  
  756. ;    DS.W    1
  757.  
  758. scr1:    DS.W    320*100
  759. scr2:    DS.W    320*100
  760. scr3:    DS.W    320*100