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

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