home *** CD-ROM | disk | FTP | other *** search
/ Fujiology Archive / fujiology_archive_v1_0.iso / !FALCON / LINEOUT / DELTA.ZIP / DELTASRC.ZIP / DELTA.SRC / TWIRL.ASM < prev    next >
Assembly Source File  |  2002-10-16  |  4KB  |  183 lines

  1. ;======== GLOBAL MACROS ========
  2.  
  3. get:    MACRO
  4.     jclr    #0,x:<<$FFE9,*
  5.     movep    x:<<$FFEB,\1
  6.     ENDM
  7.  
  8. send:    MACRO
  9.     jclr    #1,x:<<$FFE9,*
  10.     movep    \1,x:<<$FFEB
  11.     ENDM
  12.  
  13.     ORG    P:$0000
  14.     jmp    <START
  15.  
  16.     ORG    P:$0040
  17.  
  18. START:    
  19. ; Initialize..
  20.     jsr    <receivePoints
  21.  
  22. ; Loop it..
  23. _loop:    get    x:>amount
  24.     move            #<sinX,r0
  25.     move            #<cosX,r1
  26.     move            #<sinY,r2
  27.     move            #<cosY,r3
  28.     move            #<sinZ,r4
  29.     move            #<cosZ,r5
  30.     jsr    <receiveRotation
  31.     jsr    <Matrix.generate
  32.     jsr    <rotate
  33.     jmp    <_loop
  34.  
  35. receivePoints:
  36.     move            #>points,r0
  37.     get    x0
  38.     do    x0,_loop
  39.     get    x:(r0)+
  40.     get    x:(r0)+
  41.     get    x:(r0)+
  42. _loop:
  43.     rts
  44.  
  45. ; Receives rotation cos/sin values from CPU.
  46. ; INPUT:
  47. ; r0: X-sine
  48. ; r1: X-cosine
  49. ; r2: Y-sine
  50. ; r3: Y-cosine
  51. ; r4: Z-sine
  52. ; r5: Z-cosine
  53. receiveRotation:
  54.     get    x:(r0)
  55.     get    x:(r1)
  56.     get    x:(r2)
  57.     get    x:(r3)
  58.     get    y:(r4)
  59.     get    y:(r5)
  60.     rts
  61.  
  62. rotate:    get    x:>center                    ; Read center from host.
  63.     move            #>points,r0
  64.     move            #>transformed,r1
  65.     move            #>matrix,r4
  66.     movec            #>2*3-1,m4
  67.     move            x:(r0)+,x0    y:(r4)+,y0    ; x0 = z, y0 = MXX
  68.  
  69. ; Transform all points.
  70.     do    x:<amount,_rotate_loop
  71.     mpy    x0,y0,a        x:(r0)+,x1    y:(r4)+,y0    ; x * MXX +
  72.     mac    x1,y0,a        x:(r0)-,x1    y:(r4)+,y0    ; y * MXY +
  73.     mac    x1,y0,a                y:(r4)+,y0    ; z * MXZ
  74.     mpy    x0,y0,b        x:(r0)+,x1    y:(r4)+,y0    ; x * MYX +
  75.     mac    x1,y0,b        x:(r0)+,x1    y:(r4)+,y0    ; y * MYY +
  76.     mac    x1,y0,b                y:(r4)+,y0    ; z * MYZ
  77.     move            l:<wh,x                ; x1 = width/2, x0 = height/2
  78.     cmpm    x1,a        b,y1                ; y1 = Y
  79.     jhs    <_next
  80.     cmpm    x0,b        a,b0                ; b0 = X
  81.     jhs    <_next
  82.     move                    a,y:(r1)+
  83.     move                    b,y:(r1)+
  84. _next:    move            x:(r0)+,x0            ; x0 = z
  85. _rotate_loop:
  86.  
  87.     movec            #$FFFF,m4
  88.     move            r1,a
  89.     move            #>transformed,x0
  90.     sub    x0,a        x:<wh,x1            ; x1 = width/2
  91.     asr    a        x0,r1
  92.     send    a1                        ; Send amount of visible dots.
  93.     move            #>$FFEB,r2
  94.  
  95. ; Send all of them!
  96.     do    a1,_sendloop
  97.     move                    y:(r1)+,b0    ; b0 = X
  98.     move                    y:(r1)+,y1    ; y1 = Y
  99.     mac    x1,y1,b        x:<center,a            ; b0 = Y*width+X, a = center
  100.     move            b0,b                ; b = Y*width+X
  101.     addl    a,b                        ; b = 2(Y*width+X)+center
  102.  
  103.     ;send    b1
  104.     jclr    #1,x:<<$FFE9,*
  105.     move            b1,x:(r2)
  106. _sendloop:
  107.  
  108.     rts
  109.  
  110. ; INPUT:
  111. ; r0: X-sine
  112. ; r1: X-cosine
  113. ; r2: Y-sine
  114. ; r3: Y-cosine
  115. ; r4: Z-sine
  116. ; r5: Z-cosine
  117. Matrix.generate:
  118.     move            #>matrix,r6
  119.  
  120. ; XX := + x*cos(b)*cos(c)
  121. ; XY := - y*cos(b)*sin(c)
  122. ; XZ := + z*sin(b)
  123.     move            x:(r3),x1    y:(r5),y1
  124. ; x0:-- x1:r3 y0:-- y1:r5
  125.     mpyr    +x1,y1,a    x:(r0),x0    y:(r4),y0    ; r3*r5
  126.  
  127. ; x0:r0 x1:r3 y0:r4 y1:r5
  128.     mpyr    -x1,y0,a    x:(r2),x1    a,y:(r6)+    ; -r3*r4
  129. ; x0:r0 x1:r3 y0:r2 y1:r5
  130.     move                    a,y:(r6)+
  131.  
  132.     move                    x1,y:(r6)+    ; r2
  133.     
  134. ; YX := + x*sin(a)*sin(b)*cos(c)+cos(a)*sin(c)
  135. ; YY := + y*cos(a)*cos(c)-sin(a)*sin(b)*sin(c)
  136. ; YZ := - z*sin(a)*cos(b)
  137.     mpyr    +x0,x1,a            y:(r5),y0    ; r0*r2
  138. ; x0:r0 x1:r3 y0:r5 y1:r5
  139.     move            a,y1
  140.     mpy    +y0,y1,a    x:(r1),x1    y:(r4),y1    ; a*r5
  141. ; x0:r0 x1:r1 y0:r5 y1:r4
  142.     macr    +x1,y1,a            y:(r5),y1    ; a+r1*r4
  143. ; x0:r0 x1:r1 y0:r5 y1:r5
  144.  
  145.     mpy    +x1,y1,a    x:(r2),x1    a,y:(r6)+    ; r1*r5
  146. ; x0:r0 x1:r2 y0:r5 y1:r5
  147.     mpyr    -x0,x1,b            y:(r4),y0    ; r0*r2
  148. ; x0:r0 x1:r2 y0:r4 y1:r5
  149.     move            b,y1
  150.     macr    +y0,y1,a    x:(r3),x1    y:(r4),y1    ; a+b*r4
  151. ; x0:r0 x1:r3 y0:r4 y1:r4
  152.  
  153.     mpyr    -x0,x1,a    x:(r2),x1    a,y:(r6)+    ; r0*r3
  154. ; x0:r0 x1:r2 y0:r4 y1:r4
  155.  
  156.     move                    a,y:(r6)+
  157.     rts
  158.  
  159.  
  160. ;== X RAM ==================================================================
  161.  
  162.         ORG    X:$0000
  163.  
  164. wh:        DC    320/2                    ; width/2
  165. amount:        DS    1
  166. transAmount:    DS    1
  167. center:        DS    1
  168. sinX:        DS    1
  169. cosX:        DS    1
  170. sinY:        DS    1
  171. cosY:        DS    1
  172. points:        DS    4082*3
  173.  
  174. ;== Y RAM ==================================================================
  175.  
  176.         ORG    Y:$0000
  177.  
  178.         DC    200/2                    ; height/2
  179. sinZ:        DS    1
  180. cosZ:        DS    1
  181.         DS    5
  182. matrix:        DS    2*3                    ; align on 8word boundary
  183. transformed:    DS    4082*2