home *** CD-ROM | disk | FTP | other *** search
/ Fujiology Archive / fujiology_archive_v1_0.iso / !FALCON / LINEOUT / DELTA.ZIP / DELTASRC.ZIP / DELTA.SRC / TUNNEL.I < prev    next >
Text File  |  2002-08-20  |  2KB  |  123 lines

  1. ; Tunnel generation library. For convenience only, basicly.
  2.  
  3. ; Generate offsettable for tunnel.
  4. ; Only one quadrant is actually calculated. The rest is (inverse) mirrored.
  5. ; 0 1  + -
  6. ; 2 3  - +
  7. Tunnel.genOffsetMap:
  8.     lea    Tunnel.offsetMap,a0
  9.     lea    320*2(a0),a1
  10.     movea.l    a0,a2
  11.     adda.l    #320*199*2,a2
  12.     movea.l    a0,a3
  13.     adda.l    #320*200*2,a3
  14.     move.l    #199,d7                ; d7.l=y (15:1)
  15.  
  16. .yloop:    move.l    #319,d6                ; d6.l=x (15:1)
  17.  
  18. .xloop:
  19. ; Calc ringnumber..
  20.     move.l    d6,d0
  21.     move.l    d7,d1
  22.     muls.w    d0,d0
  23.     muls.w    d1,d1
  24.     add.l    d0,d1
  25. ; d1.l=trunc(2x)^2+trunc(2y)^2
  26.     bsr    Math.sqrt
  27. ; d0.l=sqrt[trunc(2x)^2+trunc(2y)^2]
  28.     move.l    #5000<<16,d5            ; d5.l=radius of tunnel (16:16)
  29.     divu.l    d0,d5
  30.     andi.w    #$007F,d5
  31.     lsl.w    #8,d5
  32.  
  33. ; Calc raynumber.. tan(rayangle)=y/x, rayangle=arctan(y/x)
  34.     move.l    d7,d0
  35.     move.l    d6,d1
  36.     bsr    Frac.atan2
  37. ; Convert radians to degrees [0..127].
  38.     muls.l    #20860/2,d1
  39.     swap    d1
  40.     lsr.w    #8,d1
  41. ;    andi.w    #$007F,d1
  42.     move.b    d1,d5
  43.     move.w    d5,(a0)+            ; d1.w=raynumber, store it.
  44.     move.w    d5,-(a3)
  45.     not.b    d5
  46.     andi.w    #$7F7F,d5
  47.     move.w    d5,(a2)+
  48.     move.w    d5,-(a1)
  49.  
  50.     subq.w    #2,d6
  51.     bpl.s    .xloop
  52.  
  53.     adda.w    #160*2,a0
  54.     adda.w    #480*2,a1
  55.     suba.w    #480*2,a2
  56.     suba.w    #160*2,a3
  57.     subq.w    #2,d7
  58.     bpl.s    .yloop
  59.     rts
  60.  
  61. Tunnel.calcFlareOctant:
  62.     lea    Tunnel.squareTable,a0
  63.     move.w    #-255,d0
  64.  
  65. .calc_sqr_loop:
  66.     move.w    d0,d1
  67.     muls.w    d1,d1
  68.     move.l    d1,(a0)+
  69.     addq.w    #2,d0
  70.     bmi.s    .calc_sqr_loop
  71.  
  72.     lea    Tunnel.flareOctant,a0
  73.     move.l    #256-1,d7
  74.     lea    Tunnel.squareTable,a4
  75.  
  76. .yloop:    move.l    #256-1,d6
  77.     move.l    (a4)+,d5
  78.     lea    Tunnel.squareTable,a5
  79.  
  80. .xloop:    cmp.l    d6,d7
  81.     blt.s    .next
  82.  
  83. ; In upper triangle, so calc it..
  84.  
  85. ; Calc raynumber.. tan(rayangle)=y/x, rayangle=arctan(y/x)
  86.     move.l    d7,d0
  87.     move.l    d6,d1
  88.     bsr.l    Frac.atan2
  89. ; Convert radians to degrees [0..127].
  90.     lsr.l    #8,d1
  91.     mulu.w    #20860,d1
  92.     lsr.l    #8,d1
  93.     move.w    d1,d4
  94.  
  95. ; Calc ringnumber..
  96.     move.l    (a5),d1
  97.     add.l    d5,d1
  98. ; d1.l=trunc(2x)^2+trunc(2y)^2
  99.     bsr.l    Math.sqrt
  100. ; d0.l=sqrt[trunc(2x)^2+trunc(2y)^2]
  101.     divu.w    #362,d0                ; d0=/(2*sqrt[2*(128)^2])
  102.     lsr.w    #8,d0
  103.     move.b    d0,d4
  104.     move.w    d4,(a0)+
  105.  
  106. .next:    addq    #4,a5
  107.     subq.w    #2,d6
  108.     bpl.s    .xloop
  109.  
  110.     subq.w    #2,d7
  111.     bpl.s    .yloop
  112.  
  113.     rts
  114.  
  115.  
  116.     BSS
  117.  
  118. Tunnel.offsetMap:
  119.     DS.W    320*200
  120. Tunnel.flareOctant:
  121.     DS.W    128*128/2
  122. Tunnel.squareTable:
  123.     DS.L    128