home *** CD-ROM | disk | FTP | other *** search
/ Fujiology Archive / fujiology_archive_v1_0.iso / !FALCON / LINEOUT / DELTA.ZIP / DELTASRC.ZIP / DELTA.SRC / TWIRL.SO < prev    next >
Text File  |  2002-12-12  |  8KB  |  516 lines

  1. ; 3d brownian noise. A screen for delta.
  2.  
  3. ******** OBJECT EQUATES ********
  4.  
  5. Twirl.MAX_POINTS:    =    4082
  6.  
  7. ******** OBJECT TABLE ********
  8.  
  9. * Must be first in object!!
  10. Twirl.table:
  11.     DC.L    Twirl.mainLoop
  12.     DC.L    Twirl.init
  13.     DC.L    Twirl.setRes
  14.     DC.L    Twirl.start
  15.     DC.L    0
  16.  
  17.             RSRESET
  18. Twirl.pointTable:    RS.W    3*Twirl.MAX_POINTS
  19. Twirl.restoreTable1:    RS.L    Twirl.MAX_POINTS+1
  20. Twirl.restoreTable2:    RS.L    Twirl.MAX_POINTS+1
  21. Twirl.restoreTable3:    RS.L    Twirl.MAX_POINTS+1
  22. Twirl.BLOCK_SIZE:    RS.B    0
  23.  
  24. ******** RESOLUTION SETTING ROUTINE ********
  25.  
  26. Twirl.setRes:
  27.     IFEQ    testmode
  28.     move.l    #rts,vbl_gfx
  29.  
  30.     move.w    $0468.w,d0
  31. .ck468:    cmp.w    $0468.w,d0
  32.     beq.s    .ck468
  33.     move.w    monitormode,d0
  34.     cmpi.w    #vga60,d0
  35.     beq.s    .vga60
  36.     cmpi.w    #vga100,d0
  37.     beq.s    .vga100
  38.     cmpi.w    #rgb50,d0
  39.     beq.s    .rgb50
  40. * Unknown monitormode..
  41.     rts
  42. .vga60:    bra.l    vga60_16bit_320_200
  43. .vga100:bra.l    vga100_16bit_320_200
  44. .rgb50:    bra.l    rgb50_16bit_320_200
  45.     ENDC
  46.     rts
  47.  
  48. ******** INIT SUBROUTINE ********
  49.  
  50. * OUTPUT: d0.l: 0   = All clear.
  51. *               neg = Error! Not initialized!
  52. Twirl.init:
  53.     move.l    #Twirl.BLOCK_SIZE,d0
  54.     bsr.l    Mem.register
  55.  
  56. .success:
  57.     moveq    #0,d0
  58.     rts
  59. .error:    moveq    #-1,d0
  60.     rts
  61.  
  62. ******** REALTIME INIT SUBROUTINE ********
  63.  
  64. Twirl.realtimeInit:
  65.     bsr.l    Mem.getBlock
  66.  
  67.     lea    Twirl.restoreAddress,a1
  68.     movea.l    d0,a0
  69.     move.l    a0,Twirl.pointTableAdr
  70.     adda.l    #Twirl.restoreTable1,a0
  71.     clr.l    (a0)
  72.     move.l    a0,(a1)+
  73.     REPT    2
  74.     adda.l    #(Twirl.MAX_POINTS+1)*4,a0
  75.     clr.l    (a0)
  76.     move.l    a0,(a1)+
  77.     ENDR
  78.  
  79. ; Kicks in P56 DSP-program..
  80.     move.l    #(Twirl.p56End-Twirl.p56)/3,d0
  81.     lea    Twirl.p56,a0
  82.     bsr.l    Dsp.loadProgram
  83.  
  84.     move.l    #$5114fd32,d0
  85.     bsr.w    Twirl.initPointsDsp
  86.     rts
  87.  
  88. ******** SCREENINIT SUBROUTINE ********
  89.  
  90. Twirl.initScreen:
  91.     IFEQ    testmode
  92.     movea.l    scr,a0
  93.     bsr.l    CLEAR_320200TSCR
  94.     ENDC
  95.     rts
  96.  
  97. ******** MAINLOOP SUBROUTINE ********
  98.  
  99. Twirl.mainLoop:
  100.     move.l    frmcnt,d0
  101.     sub.l    lastframecount,d0
  102.     bne.s    .end_realtime_init
  103.     move.l    d0,-(sp)
  104.     bsr.w    Twirl.realtimeInit
  105.     move.l    (sp)+,d0
  106. .end_realtime_init:
  107.     cmpi.l    #3,d0
  108.     bhs.s    .end_screeninit
  109.     bsr.w    Twirl.initScreen
  110. .end_screeninit:
  111.  
  112.     move.w    $468.w,.lastvbl
  113.  
  114.     bsr.w    Twirl.paint3d
  115.  
  116.     IFEQ    testmode
  117.     lea    scr,a0
  118.     move.l    (a0)+,d0
  119.     move.l    (a0)+,d1
  120.     move.l    (a0),-4(a0)
  121.     move.l    d0,(a0)
  122.     move.l    d1,-8(a0)
  123.     move.l    d0,d1
  124.     lsr.w    #8,d0
  125.     move.l    d0,$ffff8200.w
  126.     move.b    d1,$ffff820d.w
  127.     ENDC
  128.  
  129.     move.w    .lastvbl(pc),d0
  130. .wait:    cmp.w    $468.w,d0
  131.     beq.s    .wait
  132.  
  133.     move.l    frmcnt,d0
  134.     sub.l    lastframecount,d0
  135.     bne.s    .res_done
  136.     bsr.w    Twirl.setRes
  137. .res_done:
  138.  
  139.     rts
  140.  
  141. .lastvbl:
  142.     DC.W    0
  143.  
  144. ******** OBJECT SUBROUTINES ********
  145.  
  146. Twirl.start:
  147.     move.w    $4bc.w,Twirl.startTime
  148.     move.w    #1,Twirl.inc
  149.     rts
  150.  
  151. ; INPUT:
  152. ; d0.l=random seed
  153. Twirl.initPointsDsp:
  154.     sendLongToDsp    #(Twirl.MAX_POINTS/6)*6
  155.  
  156.     move.w    #Twirl.MAX_POINTS/6-1,d7
  157.     clr.l    d2                ; x = 0
  158.     clr.l    d3                ; y = 0
  159.     clr.l    d4                ; z = 0
  160.  
  161. .loop:    clr.l    d1
  162.     move.w    d0,d1
  163.     moveq    #3-1,d6
  164.  
  165. .pointloop1:
  166.     ext.l    d2
  167.     sendLongToDsp    d2
  168.     divu.w    #3,d1
  169.     swap    d1
  170.     subq.w    #1,d1
  171.     add.w    d1,d2
  172.     clr.w    d1
  173.     swap    d1
  174.  
  175.     ext.l    d3
  176.     sendLongToDsp    d3
  177.     divu.w    #3,d1
  178.     swap    d1
  179.     subq.w    #1,d1
  180.     add.w    d1,d3
  181.     clr.w    d1
  182.     swap    d1
  183.  
  184.     ext.l    d4
  185.     sendLongToDsp    d4
  186.     divu.w    #3,d1
  187.     swap    d1
  188.     subq.w    #1,d1
  189.     add.w    d1,d4
  190.     clr.w    d1
  191.     swap    d1
  192.     dbra    d6,.pointloop1
  193.  
  194.     move.l    d0,d1
  195.     clr.w    d1
  196.     swap    d1
  197.     moveq    #3-1,d6
  198.  
  199. .pointloop2:
  200.     ext.l    d2
  201.     sendLongToDsp    d2
  202.     divu.w    #3,d1
  203.     swap    d1
  204.     subq.w    #1,d1
  205.     add.w    d1,d2
  206.     clr.w    d1
  207.     swap    d1
  208.  
  209.     ext.l    d3
  210.     sendLongToDsp    d3
  211.     divu.w    #3,d1
  212.     swap    d1
  213.     subq.w    #1,d1
  214.     add.w    d1,d3
  215.     clr.w    d1
  216.     swap    d1
  217.  
  218.     ext.l    d4
  219.     sendLongToDsp    d4
  220.     divu.w    #3,d1
  221.     swap    d1
  222.     subq.w    #1,d1
  223.     add.w    d1,d4
  224.     clr.w    d1
  225.     swap    d1
  226.     dbra    d6,.pointloop2
  227.  
  228. ; Calculate next random value.
  229.     move.l    d0,d1
  230.     mulu.w    d0,d0
  231.     eor.l    d1,d0
  232.     addq.l    #7,d0
  233.     rol.l    d1,d0
  234.  
  235.     dbra    d7,.loop
  236.     rts
  237.  
  238.     IFNE    0
  239.  
  240. ; INPUT:
  241. ; d0.l=random seed
  242. Twirl.initPoints:
  243.     movea.l    Twirl.pointTableAdr,a0
  244.     move.w    #Twirl.MAX_POINTS/6-1,d7
  245.     clr.w    d2                ; x = 0
  246.     clr.w    d3                ; y = 0
  247.     clr.w    d4                ; z = 0
  248.  
  249. .loop:    clr.l    d1
  250.     move.w    d0,d1
  251.     moveq    #3-1,d6
  252.  
  253. .pointloop1:
  254.     move.w    d2,(a0)+
  255.     divu.w    #3,d1
  256.     swap    d1
  257.     subq.w    #1,d1
  258.     add.w    d1,d2
  259.     clr.w    d1
  260.     swap    d1
  261.  
  262.     move.w    d3,(a0)+
  263.     divu.w    #3,d1
  264.     swap    d1
  265.     subq.w    #1,d1
  266.     add.w    d1,d3
  267.     clr.w    d1
  268.     swap    d1
  269.  
  270.     move.w    d4,(a0)+
  271.     divu.w    #3,d1
  272.     swap    d1
  273.     subq.w    #1,d1
  274.     add.w    d1,d4
  275.     clr.w    d1
  276.     swap    d1
  277.     dbra    d6,.pointloop1
  278.  
  279.     move.l    d0,d1
  280.     clr.w    d1
  281.     swap    d1
  282.     moveq    #3-1,d6
  283.  
  284. .pointloop2:
  285.     move.w    d2,(a0)+
  286.     divu.w    #3,d1
  287.     swap    d1
  288.     subq.w    #1,d1
  289.     add.w    d1,d2
  290.     clr.w    d1
  291.     swap    d1
  292.  
  293.     move.w    d3,(a0)+
  294.     divu.w    #3,d1
  295.     swap    d1
  296.     subq.w    #1,d1
  297.     add.w    d1,d3
  298.     clr.w    d1
  299.     swap    d1
  300.  
  301.     move.w    d4,(a0)+
  302.     divu.w    #3,d1
  303.     swap    d1
  304.     subq.w    #1,d1
  305.     add.w    d1,d4
  306.     clr.w    d1
  307.     swap    d1
  308.     dbra    d6,.pointloop2
  309.  
  310. ; Calculate next random value.
  311.     move.l    d0,d1
  312.     mulu.w    d0,d0
  313.     eor.l    d1,d0
  314.     addq.l    #7,d0
  315.     rol.l    d1,d0
  316.  
  317.     dbra    d7,.loop
  318.     rts
  319.  
  320. Twirl.initPointsStupidly:
  321.     movea.l    Twirl.pointTableAdr,a0
  322.     move.w    #Twirl.MAX_POINTS/5-1,d7
  323.     clr.w    d2                ; x = 0
  324.     clr.w    d3                ; y = 0
  325.     clr.w    d4                ; z = 0
  326.  
  327. .loop:    move.l    d0,d1
  328.     moveq    #5-1,d6
  329.  
  330. .pointloop:
  331.     move.w    d2,(a0)+
  332.     ror.l    d1
  333.     move.l    d1,d5
  334.     rol.l    d5
  335.     andi.w    #1,d5
  336.     lsr.l    d1
  337.     bcc.s    .x_done
  338.     neg.w    d5
  339. .x_done:
  340.     add.w    d5,d2
  341.  
  342.     move.w    d3,(a0)+
  343.     ror.l    d1
  344.     move.l    d1,d5
  345.     rol.l    d5
  346.     andi.w    #1,d5
  347.     lsr.l    d1
  348.     bcc.s    .y_done
  349.     neg.w    d5
  350. .y_done:
  351.     add.w    d5,d3
  352.  
  353.     move.w    d4,(a0)+
  354.     ror.l    d1
  355.     move.l    d1,d5
  356.     rol.l    d5
  357.     andi.w    #1,d5
  358.     lsr.l    d1
  359.     bcc.s    .z_done
  360.     neg.w    d5
  361. .z_done:
  362.     add.w    d5,d4
  363.     dbra    d6,.pointloop
  364.  
  365. ; Calculate next random value.
  366.     move.l    d0,d1
  367.     mulu.w    d0,d0
  368.     eor.l    d1,d0
  369.     addq.l    #7,d0
  370.     rol.l    d1,d0
  371.  
  372.     dbra    d7,.loop
  373.     rts
  374.  
  375. Twirl.paint2d:
  376.     movea.l    scr,a0
  377.     movea.l    Twirl.pointTableAdr,a1
  378.     move.w    #Twirl.MAX_POINTS-1,d7
  379.     move.w    #160,d2
  380.     move.w    #100,d3
  381.     move.w    #320,d4
  382.     move.w    #200,d5
  383.     moveq    #$ffffffff,d6
  384.  
  385. .loop:    move.w    (a1)+,d0
  386.     move.w    (a1)+,d1
  387.     addq    #2,a1
  388.     add.w    d2,d0
  389.     add.w    d3,d1
  390.     cmp.w    d4,d0
  391.     bhs.s    .next
  392.     cmp.w    d5,d1
  393.     bhs.s    .next
  394.     mulu.w    d4,d1
  395.     add.w    d0,d1
  396.     move.w    d6,(a0,d1.l*2)
  397. .next:    dbra    d7,.loop
  398.     rts
  399.  
  400.     ENDC
  401.  
  402. Twirl.paint3d:
  403.     move.l    #(Twirl.MAX_POINTS/6)*6,d0
  404.     tst.w    Twirl.inc
  405.     beq.s    .transmit_amount
  406.     move.w    $4bc.w,d0
  407.     sub.w    Twirl.startTime,d0
  408.     cmpi.w    #(Twirl.MAX_POINTS/6)*6,d0
  409.     blo.s    .transmit_amount
  410.     move.w    #(Twirl.MAX_POINTS/6)*6,d0
  411.     clr.w    Twirl.inc
  412.  
  413. ; Send over the amount of points to render.
  414. .transmit_amount:
  415.     tst.w    d0
  416.     bne.s    .amount_not_zero
  417.     addq.w    #1,d0
  418. .amount_not_zero:
  419.     sendLongToDsp    d0    ;#(Twirl.MAX_POINTS/6)*6
  420.  
  421. ; First send rotation parameters to dsp..
  422.     move.w    $4bc.w,d0
  423.     move.w    d0,d2
  424.     move.w    d0,d4
  425.     mulu.w    #3,d2
  426.     lsr.w    #1,d2
  427.     mulu.w    #5,d4
  428.     lsr.w    #2,d4
  429.     Do_SinModulo    d0
  430.     Do_SinModulo    d2
  431.     Do_SinModulo    d4
  432.     lea    sine_tbl,a0
  433.     Get_SinCos    a0,d0,d0,d1
  434.     Get_SinCos    a0,d2,d2,d3
  435.     Get_SinCos    a0,d4,d4,d5
  436.     lsl.l    #8,d0
  437.     lsl.l    #8,d1
  438.     lsl.l    #8,d2
  439.     lsl.l    #8,d3
  440.     lsl.l    #8,d4
  441.     lsl.l    #8,d5
  442.     sendLongToDsp    d0
  443.     sendLongToDsp    d1
  444.     sendLongToDsp    d2
  445.     sendLongToDsp    d3
  446.     sendLongToDsp    d4
  447.     sendLongToDsp    d5
  448.  
  449. ; Send the screencenter...
  450.     movea.l    scr,a0
  451.     adda.l    #(320*100+160)*2,a0
  452.     sendLongToDsp    a0
  453.  
  454. ; Restore background..
  455.     movea.l    Twirl.restoreAddress,a3
  456.     move.w    (a3)+,d7
  457.     beq.s    .end_restore
  458.     subq.w    #1,d7
  459.     clr.w    d0
  460. .restore_loop:
  461.     movea.l    (a3)+,a0
  462.     move.w    d0,(a0)
  463.     dbra    d7,.restore_loop
  464. .end_restore:
  465.  
  466. ; Receive and paint! NOTE: can only be painted to STRAM!
  467.     movea.l    Twirl.restoreAddress,a3
  468.     moveq    #$ffffffff,d4
  469.     move.l    #$00ffffff,d5
  470.     move.w    #%0011100111000111,d6
  471.     lea    $ffffa204.w,a1
  472.     receiveWordFromDsp    d7
  473.     move.w    d7,(a3)+
  474.     beq.s    .end_plot
  475.     subq.w    #1,d7
  476.  
  477. .loop:    movea.l    (a1),a0
  478.     move.l    a0,(a3)+
  479.     add.w    d6,(a0)
  480.     bcc.s    .next
  481.     move.w    d4,(a0)
  482. .next:    dbra    d7,.loop
  483. .end_plot:
  484.  
  485. ; Swap restore table addresses.
  486.     lea    Twirl.restoreAddress,a0
  487.     move.l    (a0)+,d0
  488.     move.l    (a0)+,d1
  489.     move.l    (a0),-4(a0)
  490.     move.l    d0,(a0)
  491.     move.l    d1,-8(a0)
  492.     rts
  493.  
  494. ******** OBJECT DATA ********
  495.  
  496.     DATA
  497.  
  498. Twirl.p56:
  499.     INCBIN    TWIRL.P56
  500. Twirl.p56End:
  501.     EVEN
  502.  
  503. Twirl.inc:
  504.     DC.W    0
  505.  
  506. ******** OBJECT RESERVES ********
  507.  
  508.     BSS
  509.  
  510. Twirl.startTime:
  511.     DS.W    1
  512. Twirl.restoreAddress:
  513.     DS.L    3
  514. Twirl.pointTableAdr:
  515.     DS.L    1
  516.