home *** CD-ROM | disk | FTP | other *** search
/ ST-Computer Leser 2002 January / STC_CD_01_2002.iso / SCENE / IMATROLL / SRC / ROTOZOOM.S < prev    next >
Text File  |  2001-12-09  |  7KB  |  213 lines

  1.     Section    Text
  2. ;
  3. ; Create a texture for the rotozoomer
  4. ;
  5. Init_rotozoomer:     
  6.  
  7.     lea    tex,a0    ; load texture
  8.     
  9.     move.w    #255,d0    ; for d0=0 to 255
  10.  
  11. .loopX:    move.w    #255,d1    ; for d1=0 to 255
  12. .loopY:    move.w    d0,d2    ; save d0
  13.     eor.w    d1,d2    ; d2 = d1 XOR d0    
  14.     ;lsr.w      #3,d2    ; shit right 3 bits -> get only blue pixels
  15.     lsl.w    #8,d2    ; shift left 8 bits -> exchange bytes    
  16.     andi.w    #%1111100000000000,d2    ; only get red pixels
  17.     
  18.     move.w      d2,(a0)+    
  19.     
  20.     dbra    d1,.loopY    ; next d1
  21.     dbra    d0,.loopX    ; next d0
  22.  
  23.     rts
  24. ;
  25. ; Main rotozoomer routine
  26. ;
  27. Main_RZ:    move.w    angle,d0        ; input for rotozoomer
  28.  
  29.     move.l    seed,d2        ; get a rnd number        
  30.     rol.l       d2,d2        ; and generate a new one
  31.     addq.l      #5,d2
  32.  
  33.     move.l    d2,seed        ; save it
  34.  
  35.     cmpi.w    #4<<11,d2        ; compare this rnd number to  4 shl 11 (8192)
  36.     bhi.s    .greater        ; if is not greater
  37.     neg.b    angleinc        ; then negate angle increment (change direction)
  38.  
  39. .greater    add.b    angleinc,d0     ; in all cases then add angle increment to the current angle 
  40.     move.w    d0,angle        ; save angle 
  41.  
  42.     move.w    zoomfactor,d1    ; get zoomfactor
  43.     
  44.     tst.w    d1        ; if zoomfactor < 0 
  45.     bpl.s    .positive        ; then negate zoom increment to have a  positive zoom factor
  46.     neg.w    zoominc    
  47.  
  48. .positive:    cmpi.w    #200,d1        ; in all cases 
  49.     blt    .below        ; if > 200 then 
  50.     neg.w    zoominc        ; negate zoom inc to have a zoom factor < 200
  51.  
  52. .below:
  53.     add.w       zoominc,d1        ; in all cases, add zoomfactor to current zoom value
  54.     move.w    d1,zoomfactor    ; and save it
  55.  
  56.     bsr    RotoZoom        ; call rotozoom routine (d0)
  57. ;    addq.b    #1,angle+1        ; used for normal angle increment (not for rnd)
  58.     
  59.     rts    
  60. ;
  61. ; Rotozoom routine
  62. ; d0 = angle
  63. ;
  64. ;
  65.  
  66. blurtbl:    dc.w 0,2,640,642        ; blur table
  67.  
  68. RotoZoom:    move.w    d0,d1        ; save angle value in d1
  69.     and.w    #3,d1        ; get 2 lower bits (d1=0,1,2 or 3) = angle mod 3
  70.     
  71.     move.l    screen_adr,a0    ; a0 = screen_adr
  72.     lea    20*640(a0),a0    ; start display on the 20th line (faster)
  73.     adda.w      (blurtbl,pc,d1.w*2),a0     ; + (0,2,640,642) depending on angle mod 3  
  74.                 ; this will do a blur effect as previous column will not be erased
  75.  
  76.     lea    SinCos+256,a1    ; a1=middle of sincos table
  77.     lea    tex+65536,a2    ; a2=end of texture 
  78.     ;lea    logo1+32768,a2
  79.  
  80.     move.w    (a1,d0.w*2),d1    ; get sin value in d1 
  81.     move.w    (128,a1,d0.w*2),d2    ; get cos value in d1 (sin+128) 
  82.  
  83.     muls.w    zoomfactor,d1    ; d1=sin(angle)*zoomfactor -> longword
  84.     muls.w    zoomfactor,d2    ; d2=cos(angle)*zoomfactor -> longword
  85.  
  86.     asr.l    #5,d1        ; shift right d1 from 5 bits : divide by 2^5=32   
  87.     asr.l    #5,d2        ; idem for d2
  88.  
  89.     move.w    d1,dx        ; save d1=dx*zf in dx (faster to use registers first)
  90.     move.w    d2,dy        ; save d2 in dy
  91.  
  92. ; rotozoom formulas
  93. ; u = -160*(dx*zf)-100*(dy*zf) for the whole screen of -80...-50 for halfof the screen dims (blur effect)
  94. ; v = -160*(dy*zf)+100*(dx*zf)
  95.  
  96.     move.w    dx,d3         
  97.     muls.w    #-80,d3        ; d3=-80dx -> .L
  98.     move.w    dy,d1
  99.     muls.w    #-50,d1        ; d1=-50dy -> .L
  100.  
  101.     add.l    d1,d3        ; d3=-80dx-50dy
  102.  
  103.     move.w    dy,d4
  104.     muls.w    #-80,d4        ; d4=-80dy -> .L
  105.     move.w    dx,d1
  106.     muls.w    #50,d1        ; d1=50dx    -> .L
  107.     
  108.     add.l    d1,d4        ; d4=-80dy+50dx
  109.  
  110.     move.w    dx,a3        ; put dx in a3 (faster)
  111.     move.w    dy,a4        ; put dy in a4
  112.  
  113.     move.w    #99,d1        ; for y=0 to 99 (half of the screen height)
  114.  
  115. .loopY:    move.w    d3,d5        ; save d3 : u1=u
  116.     move.w    d4,d6        ; save d4 : v1=v
  117.     
  118.     move.w    #159,d2        ; for x=0 to 159 (half of screen width)
  119.     
  120. .loopX:    move.w    d5,d7        ; save u1 in d7
  121.     move.w    d6,d0        ; save v1
  122.     lsr.w    #8,d0        ; divide v1 by 256 : get integer value for 8.8 fixed point nb
  123.     
  124.     move.b    d0,d7        ; put v1 integer value in d7 lower byte
  125.                 ; so d7 contains int(u1,v1) in d7
  126.  
  127.     move.w    (a2,d7.w*2),(a0)+     ; d5=tex[d6]=tex[hi(u)*256 OR hi(v)]
  128.     
  129.     addq.l    #2,a0        ; skip a word (a column)
  130.     add.w    a3,d5        ; add dx to u1
  131.     add.w    a4,d6        ; add dy to v1    
  132.     
  133.     dbra    d2,.loopX        ; next x
  134.  
  135.     add.w    a4,d3        ; add dy to u
  136.     sub.w    a3,d4         ; sub dx to v
  137.     
  138.     lea         640(a0),a0        ; skip a line
  139.  
  140.     dbra    d1,.loopY        ; next y
  141.  
  142.     rts
  143.  
  144.     section     DATA
  145.  
  146. SinCos:     
  147.         dc.w 0,6,13,19,25,31,38,44,50,56
  148.         dc.w 62,68,74,80,86,92,98,104,109,115
  149.         dc.w 121,126,132,137,142,147,152,157,162,167
  150.         dc.w 172,177,181,185,190,194,198,202,206,209
  151.         dc.w 213,216,220,223,226,229,231,234,237,239
  152.         dc.w 241,243,245,247,248,250,251,252,253,254
  153.         dc.w 255,255,256,256,256,256,256,255,255,254
  154.         dc.w 253,252,251,250,248,247,245,243,241,239
  155.         dc.w 237,234,231,229,226,223,220,216,213,209
  156.         dc.w 206,202,198,194,190,185,181,177,172,167
  157.         dc.w 162,157,152,147,142,137,132,126,121,115
  158.         dc.w 109,104,98,92,86,80,74,68,62,56
  159.         dc.w 50,44,38,31,25,19,13,6,0,-6
  160.         dc.w -13,-19,-25,-31,-38,-44,-50,-56,-62,-68
  161.         dc.w -74,-80,-86,-92,-98,-104,-109,-115,-121,-126
  162.         dc.w -132,-137,-142,-147,-152,-157,-162,-167,-172,-177
  163.         dc.w -181,-185,-190,-194,-198,-202,-206,-209,-213,-216
  164.         dc.w -220,-223,-226,-229,-231,-234,-237,-239,-241,-243
  165.         dc.w -245,-247,-248,-250,-251,-252,-253,-254,-255,-255
  166.         dc.w -256,-256,-256,-256,-256,-255,-255,-254,-253,-252
  167.         dc.w -251,-250,-248,-247,-245,-243,-241,-239,-237,-234
  168.         dc.w -231,-229,-226,-223,-220,-216,-213,-209,-206,-202
  169.         dc.w -198,-194,-190,-185,-181,-177,-172,-167,-162,-157
  170.         dc.w -152,-147,-142,-137,-132,-126,-121,-115,-109,-104
  171.         dc.w -98,-92,-86,-80,-74,-68,-62,-56,-50,-44
  172.         dc.w -38,-31,-25,-19,-13,-6
  173.         dc.w 0,6,13,19,25,31,38,44,50,56
  174.         dc.w 62,68,74,80,86,92,98,104,109,115
  175.         dc.w 121,126,132,137,142,147,152,157,162,167
  176.         dc.w 172,177,181,185,190,194,198,202,206,209
  177.         dc.w 213,216,220,223,226,229,231,234,237,239
  178.         dc.w 241,243,245,247,248,250,251,252,253,254
  179.         dc.w 255,255,256,256,256,256,256,255,255,254
  180.         dc.w 253,252,251,250,248,247,245,243,241,239
  181.         dc.w 237,234,231,229,226,223,220,216,213,209
  182.         dc.w 206,202,198,194,190,185,181,177,172,167
  183.         dc.w 162,157,152,147,142,137,132,126,121,115
  184.         dc.w 109,104,98,92,86,80,74,68,62,56
  185.         dc.w 50,44,38,31,25,19,13,6,0,-6
  186.         dc.w -13,-19,-25,-31,-38,-44,-50,-56,-62,-68
  187.         dc.w -74,-80,-86,-92,-98,-104,-109,-115,-121,-126
  188.         dc.w -132,-137,-142,-147,-152,-157,-162,-167,-172,-177
  189.         dc.w -181,-185,-190,-194,-198,-202,-206,-209,-213,-216
  190.         dc.w -220,-223,-226,-229,-231,-234,-237,-239,-241,-243
  191.         dc.w -245,-247,-248,-250,-251,-252,-253,-254,-255,-255
  192.         dc.w -256,-256,-256,-256,-256,-255,-255,-254,-253,-252
  193.         dc.w -251,-250,-248,-247,-245,-243,-241,-239,-237,-234
  194.         dc.w -231,-229,-226,-223,-220,-216,-213,-209,-206,-202
  195.         dc.w -198,-194,-190,-185,-181,-177,-172,-167,-162,-157
  196.         dc.w -152,-147,-142,-137,-132,-126,-121,-115,-109,-104
  197.         dc.w -98,-92,-86,-80,-74,-68,-62,-56,-50,-44
  198.         dc.w -38,-31,-25,-19,-13,-6
  199.  
  200. zoomfactor:        dc.w 1    
  201. zoominc:        dc.w 2
  202. seed:        dc.l 0344864426
  203. angleinc:        dc.b 1            
  204.         even
  205.  
  206.     section     BSS
  207.  
  208. tex:        ds.w    256*256
  209. angle:        ds.w    1
  210. dx:        ds.w    1
  211. dy:        ds.w    1
  212.  
  213.     Section     Text