home *** CD-ROM | disk | FTP | other *** search
/ No Fragments Archive 4: The Falcon Archive / nf_archive_four_v1.0.iso / ARCHIVE / DEMOS / LAZER / LAZEROS.ZIP / LAZEROS / ROTATOR / ROT_03.S < prev    next >
Text File  |  1995-10-03  |  16KB  |  591 lines

  1.      OUTPUT    h:\dba\rot.PRG
  2.  
  3.     jmp    main
  4.     bra    init_rout
  5.     bra    exit_rout
  6.     bra    do_once
  7.  
  8. ;-----------------------------------------------------------
  9.     include startup.s
  10.     include    demo.s
  11. ;-----------------------------------------------------------
  12. BLITTER = $ffff8a00
  13.  
  14. HALFTONE    = 0
  15. SRC_XINC    = 32
  16. SRC_YINC    = 34
  17. SRC_ADDR    = 36
  18. ENDMASK1    = 40
  19. ENDMASK2    = 42
  20. ENDMASK3    = 44
  21. DST_XINC    = 46
  22. DST_YINC    = 48
  23. DST_ADDR    = 50
  24. X_COUNT        = 54
  25. Y_COUNT        = 56
  26. HOP        = 58
  27. OP        = 59
  28. LINE_NUM    = 60
  29. SKEW        = 61
  30.  
  31. FHOP_SOURCE    = 1
  32. FHOP_HALFTONE    = 0
  33. FSKEWFXSR    = 7
  34. FSKEWNFSR    = 6
  35. FLINEBUSY    = 7
  36. FLINEHOG    = 6
  37. FLINESMUDGE    = 5
  38.  
  39. MHOP_SOURCE    = $02
  40. MHOP_HALFTONE    = $01
  41. MSKEWFXSR    = $80
  42. MSKEWNFSR     = $40
  43. MLINEBUSY    = $80
  44. MLINEHOG    = $40
  45. MLINESMUDGE    = $20
  46.  
  47.  
  48. ;-----------------------------------------------------------
  49. ;-----------------------------------------------------------
  50. main
  51.     shrink_memory
  52.  
  53.     bsr    init
  54.     save_stack
  55.     bsr    phoenix_init
  56.  
  57.     save_interrupts
  58.     set_interrupts
  59.  
  60.         addi.w  #20,$FFFF8284.w
  61.     move.w    #0,$ffff820e
  62.     bsr    setup_logo
  63.     bsr    singen
  64.     bsr    setup_rotator
  65.  
  66. .main_loop
  67.     move.l    scr1,d0
  68.     move.l    scr2,scr1
  69.     move.l    d0,scr2
  70.     setscreen
  71.     vsync
  72.     
  73.     bset    #0,$ffff82c3.w        ;doublescan
  74.  
  75.     *move.l    #$4f0000,$ffff9800.w
  76.     bsr    rotator
  77.     *move.l    #$6f0000,$ffff9800.w
  78.  
  79.     move.l    #$0,$ffff9800.w
  80.  
  81.     tst.w    exit_flag
  82.     beq.s    .exit
  83.  
  84.     move.b    key,old_key
  85.     move.b    $fffffc02.w,key
  86.     cmp.b    #$39,key
  87.     bne    .main_loop
  88.  
  89. .exit
  90.  
  91.     restore_interrupts
  92.     bsr    phoenix_exit
  93.     restore_stack
  94.     bsr    exit
  95.     terminate
  96. ;-----------------------------------------------------------
  97. init_rout
  98.     move.l    a0,parameters
  99.  
  100.     move.l    parameters,a0
  101.     move.l    WORK_SCREEN(a0),scr1
  102.     move.l    SHOW_SCREEN(a0),scr2
  103.     move.l    EXTRA_SCREEN(a0),scr3
  104.  
  105.     rts
  106. ;-----------------------------------------------------------
  107. exit_rout
  108.     rts
  109. ;-----------------------------------------------------------
  110. do_once
  111.     move.l    parameters,a0
  112.     lea    rgb_320x200xtrue,a1
  113.     move.l    a1,SCRMODE(a0)
  114.     move.w    #TRUE,SCRMODE_UPDATE(a0)
  115.  
  116.     move.l    parameters,a0
  117.     move.w    #2,SCREEN_COUNT(a0)
  118.     move.w    #TRUE,SCREEN_SWAP(a0)
  119.  
  120.     move.l    parameters,a0
  121.     move.w    #TRUE,PALETTE_UPDATE(a0)
  122.     move.l    #coltab3,PALETTE(a0)
  123.     move.l    parameters,a0
  124.     move.l    WORK_SCREEN(a0),scr1
  125.     move.l    SHOW_SCREEN(a0),scr2
  126.     bsr    clrscr
  127.  
  128.         addi.w  #20,$FFFF8284.w
  129.     move.w    #0,$ffff820e
  130.     bsr    setup_logo
  131.     bsr    singen
  132.     bsr    setup_rotator
  133.  
  134.     bset    #0,$ffff82c3.w        ;doublescan
  135.  
  136. taskloop
  137.  
  138.     move.l    parameters,a0
  139.     move.l    COUNTER_ABS(a0),d0
  140. .11    cmp.l    COUNTER_ABS(a0),d0
  141.     beq.s    .11
  142.  
  143.     move.l    parameters,a0
  144.     move.l    WORK_SCREEN(a0),scr1
  145.     move.l    SHOW_SCREEN(a0),scr2
  146.  
  147.  
  148.     bsr    rotator
  149.  
  150.     demo_swapscreens
  151.  
  152.     bra    taskloop
  153. ;-----------------------------------------------------------
  154. ;-> a0...palette
  155. set_palette
  156.  
  157.     lea    coltab3,a1
  158.     move.w    #155,d0
  159. .1    move.l    (a1)+,(a0)+
  160.     dbf    d0,.1
  161.  
  162.     rts
  163. ;-----------------------------------------------------------
  164. setup_logo
  165.  
  166.         lea     maglogo+8(PC),A0
  167.         lea     orig_gfx,A1
  168.         move.w  #128-1,D0
  169. mag_l0  move.w  #128-1,D1
  170. mag_l1
  171. *        move.w  #-1,512(A1)
  172. *        move.w  #-1,256(A1)
  173. *        move.w  #-1,512+256(A1)
  174. *        move.w  #-1,(A1)+
  175.         move.w  (A0),512(A1)
  176.         move.w  (A0),256(A1)
  177.         move.w  (A0),512+256(A1)
  178.         move.w  (A0)+,(A1)+
  179.         dbra    D1,mag_l1
  180.     lea     256+512(A1),A1
  181.     dbra    D0,mag_l0
  182.  
  183.     rts
  184. ;-----------------------------------------------------------
  185. ;512 Werte im Padded-24-Format (für den DSP geeignet !)
  186. ;d.h. 0 ... $007fffff ... 0 ... $00800001 ...
  187. singen:
  188. size                    EQU 512 ;nicht ändern !
  189.  
  190. sin_gen:                lea     sin,A0
  191.                         moveq   #0,D6
  192.                         lea     size*2+4(A0),A1
  193.                         movea.l A0,A2
  194.                         moveq   #size/4-1,D7
  195. sin_gen1:               lea     sin_fakdiv+16,A3
  196.                         move.l  D6,D5
  197.                         moveq   #7,D2
  198. sin_gen2:               move.w  D2,D1
  199.                         move.l  D6,D3
  200. sin_gen3:               mulu.l  D6,D4:D3
  201.                         rol.l   #8,D3
  202.                         rol.l   #8,D4
  203.                         move.b  D3,D4
  204.                         move.l  D4,D3
  205.                         dbra    D1,sin_gen3
  206.                         divs.l  -(A3),D3
  207.                         add.l   D3,D5
  208.                         subq.w  #2,D2
  209.                         bcc.s   sin_gen2
  210. sin_gen4:               asr.l   #1,D5
  211.                         move.l  D5,(A0)+
  212.                         move.l  D5,-(A1)
  213.                         add.l   #$06487ED5/size,D6 ;2*pi*(2^24)
  214.                         dbra    D7,sin_gen1
  215.                         move.l  #$007FFFFF,-(A1)
  216.                         lea     size(A1),A1
  217.                         move.w  #size/2+size/4-1,D1
  218. sin_gen6:               move.l  (A2)+,(A1)
  219.                         neg.l   (A1)+
  220.                         dbra    D1,sin_gen6
  221.                         rts
  222. ;-----------------------------------------------------------
  223. setup_rotator
  224.                             ; Grafik doppeln
  225.                         lea     orig_gfx+2*65536,A0
  226.                         lea     gfx+4*65536,A1
  227.                         moveq   #0,D1
  228.                         move.w  #$00010000>>1-1,D0
  229. rotator_gengfx_l0:      move.w  -(A0),D1
  230.                         move.w  D1,-(A1)
  231.                         move.w  d1,-(A1)
  232.                         move.w  -(A0),D1
  233.                         move.w  d1,-(A1)
  234.                         move.w  D1,-(A1)
  235.                         dbra    D0,rotator_gengfx_l0
  236.  
  237.  
  238.                         ; Doubletab generieren...
  239. abdunkelwert            EQU 4
  240.                         lea     doubletab,A0
  241.                         move.l  #$0000FFFF,D0
  242. rota_gendouble_l0:      move.w  D0,D1
  243.                         and.w   #%0000000000011111,D1
  244.                         subq.w  #abdunkelwert,D1
  245.                         bpl.s   rota_gendouble_w0
  246.                         moveq   #0,D1
  247. rota_gendouble_w0:      move.w  D0,D2
  248.                         and.w   #%0000011111100000,D2
  249.                         sub.w   #abdunkelwert<<6,D2
  250.                         bmi.s   rota_gendouble_w2
  251.                         or.w    D2,D1
  252. rota_gendouble_w2:      move.w  D0,D2
  253.                         and.w   #%1111100000000000,D2
  254.                         sub.w   #abdunkelwert<<11,D2
  255.                         bcs.s   rota_gendouble_w3
  256.                         or.w    D2,D1
  257. rota_gendouble_w3:      move.w  D1,0(A0,D0.l*4)
  258.                         move.w  D1,2(A0,D0.l*4)
  259.                         dbra    D0,rota_gendouble_l0
  260.                         ;»w%=30
  261.                         move.w  #0,w
  262.                         ;»si%=SINQ(w%)*65536
  263.  
  264.             rts
  265. ;-----------------------------------------------------------
  266. rotator
  267.                         bsr     gen_rotdist
  268.  
  269.                         lea     sin,A0
  270.                         move.w  w,D0
  271.                         move.l  0(A0,D0.w*4),si
  272.  
  273.                         moveq   #8,D3
  274.                         move.l  si,D6
  275.                         asr.l   D3,D6
  276.                         move.l  D6,si
  277.                         ;»co%=COSQ(w%)*65536
  278.                         lea     cos,A0
  279.                         move.l  0(A0,D0.w*4),co
  280.  
  281.                         move.l  co,D6
  282.                         asr.l   D3,D6
  283.                         move.l  D6,co
  284.  
  285.                         lea     gfx+128*1024,A0
  286.                 move.l     scr1,A1
  287.             add.l    #640*200/2,a1
  288.                         lea     rotdist+100*4,A4
  289.                             ;»FOR y%=-50 TO 49
  290.                         move.l  #-50,y
  291. rotator_next_y:         move.l  -(A4),D6
  292.                         cmp.l   #$00000A00,D6
  293.                         ble.s   dorot
  294.                         move.w  #640/4-1,D7
  295. norot_l0:
  296.                         move.l  #0,-(A1)
  297.                         dbra    D7,norot_l0
  298.                         bra     norot
  299. dorot:                    ;»xstart%=(-50*faktor%) DIV 256
  300.                         move.l  #-80,D3
  301.                         muls    D6,D3
  302.                         asr.l   #8,D3
  303.                     ;»ystart%=(y%*faktor%) DIV 256
  304.                         move.l  y,D4
  305.                         add.l   #70-20,D4
  306.                         muls    D6,D4
  307.                         asr.l   #8,D4
  308.                     ;»xpos%=xstart%*si%+ystart%*co%
  309.                     ;»ypos%=ystart%*si%-xstart%*co%
  310.                         move.l  D3,D0
  311.                         move.l  D4,D1
  312.                         muls.l  si,D0
  313.                         muls.l  co,D4
  314.                         add.l   D4,D0
  315.                         muls.l  si,D1
  316.                         muls.l  co,D3
  317.                         sub.l   D3,D1
  318.                     ;»xofs%=(si%*faktor%) DIV 256
  319.                         move.l  si,D2
  320.                         muls.l  D6,D2
  321.                         clr.w   D2
  322.                         swap    D2
  323.                     ;»yofs%=-(co%*faktor%) DIV 256
  324.                         move.l  co,D3
  325.                         muls.l  D6,D3
  326.                         asr.l   #8,D3
  327.                     ;»FOR x%=0 TO 99
  328.                         neg.l   D3
  329.                         lsr.l   #8,D0
  330.                         swap    D1
  331.                         swap    D3
  332.                         move.l  D1,D7
  333.                         clr.w   D7
  334.                         add.l   D7,D0
  335.                         move.l  D3,D7
  336.                         clr.w   D7
  337.                         add.l   D7,D2
  338.                         move.w  #160/10-1,D7
  339. rotator_next_x:
  340. ;»WORD{scrcntr%+(ypos% DIV 65536)*640+(xpos% DIV 65536)*2}=-1
  341. ; d0 xpos  yn|00|xv|xn
  342. ; d1 ypos  00|00|00|yv
  343. ; d2 xofs  yn|00|xv|xn
  344. ; d3 yofs  00|00|00|yv
  345.                         REPT 10
  346.                         move.w  D0,D4
  347.                         move.b  D1,D4
  348.                         move.l  0(A0,D4.w*4),-(A1)
  349.                         *move.l  #-1,-(A1)
  350.                         add.l   D2,D0
  351.                         addx.b  D3,D1
  352.                         ENDR
  353.                         ;»NEXT x%
  354.                         dbra    D7,rotator_next_x
  355.                         ;»ADD faktor%,3
  356.                         ;»NEXT y%
  357. norot:
  358.                         addq.l  #1,y
  359.                         cmpi.l  #50,y
  360.                         bne     rotator_next_y
  361.  
  362.                         addi.w  #3+2,w
  363.                         cmpi.w  #512,w
  364.                         blt.s   rotator_winkel_w0
  365.                         subi.w  #512,w
  366. rotator_winkel_w0:
  367. rotator_w0:
  368.                         rts
  369.  
  370. inverse:    dc.w    0
  371. ;-----------------------------------------------------------
  372. ;> a = 60                      d0   <<20
  373. ;> b = 20
  374. ;> aofs = b/100                d1   <<20
  375. ;> h = 50                      d2   <<20
  376. ;» FOR c=0 TO 99               d3
  377. ;»   d=h/(TAN(RAD(a))/16)      d4
  378. ;»   PRINT #1,MKL$(d);
  379. ;»   ADD a,aofs
  380. ;» NEXT c
  381. gen_rotdist:
  382.                         lea     splinewerte,A0
  383.                         lea     splines,A1
  384.                         move.w  splinecnt,D0
  385.                         moveq   #3-1,D6
  386.                         bsr     spline
  387.  
  388.                         add.w   #$0100,splinecnt
  389.                         andi.w  #$7FFF,splinecnt
  390.  
  391.                         lea     splinewerte,A0
  392.                         moveq   #0,D0
  393.                         move.w  (A0)+,D0
  394.                         lsl.l   #8,D0
  395.  
  396.                         moveq   #0,D1
  397.                         move.w  (A0)+,D1
  398.                         lsl.l   #8,D1
  399.  
  400.                         moveq   #0,D2
  401.                         move.w  (A0)+,D2
  402.                         lsl.l   #8,D2
  403.  
  404.                         lea     rotdist,A0
  405.                         lea     tan,A1
  406.                         moveq   #128-1,D3
  407. gen_rotdist_l0:         move.l  D2,D4
  408.                         move.l  D0,D5
  409.                         swap    D5
  410.                         ext.l   D5
  411.                         divs.l  0(A1,D5.w*4),D4
  412.                         move.l  D4,(A0)+
  413.                         add.l   D1,D0
  414.                         dbra    D3,gen_rotdist_l0
  415.  
  416.                         rts
  417. ;-----------------------------------------------------------
  418. spline:
  419.                         moveq   #15,D7
  420. .l0:                    lea     tbuff,A2
  421.                         move.l  D0,D1
  422.                         eori.w  #$7FFF,D0 ; t2%   d1
  423.                         move.w  D0,D2
  424.                         move.w  D1,D3
  425.                         mulu    D0,D2
  426.                         lsr.l   D7,D2   ; t_2
  427.                         move.w  D2,D4
  428.                         mulu    D0,D4
  429.                         lsr.l   D7,D4   ; t_3  >>1
  430.                         move.w  D4,(A2)+
  431.                         move.w  D1,D4
  432.                         mulu    D2,D4
  433.                         lsr.l   D7,D4   ; 3*t_2_m_t2 >>2
  434.                         move.w  D4,(A2)+
  435.                         mulu    D1,D3
  436.                         lsr.l   D7,D3
  437.                         move.w  D3,D4
  438.                         mulu    D0,D4
  439.                         lsr.l   D7,D4   ; 3*t_m_t2_2 >>3
  440.                         move.w  D4,(A2)+
  441.                         mulu    D1,D3
  442.                         lsr.l   D7,D3   ; t2_3 >>4
  443.                         move.w  D3,(A2)+
  444. .l1:                    lea     tbuff,A2
  445.                         move.w  (A2)+,D1
  446.                         muls    (A1)+,D1
  447.                         REPT 2
  448.                         move.w  (A2)+,D2
  449.                         muls    (A1)+,D2
  450.                         muls.l  #3,D2
  451.                         add.l   D2,D1
  452.                         ENDR
  453.                         move.w  (A2)+,D2
  454.                         muls    (A1)+,D2
  455.                         add.l   D2,D1
  456.                         add.l   D1,D1
  457.                         swap    D1
  458.                         move.w  D1,(A0)+
  459.                         dbra    D6,.l1
  460.  
  461.                         rts
  462. ;-----------------------------------------------------------
  463. splinewerte:            DS.W 10
  464. splines:                DC.W $A000,$A000,$A000,$0000
  465.                         DC.W $0000,$0000,$0000,$0D00
  466.                         DC.W $0000,$3000,-$1000,$3000+$2000
  467. splinecnt:              DC.W 0
  468. sin_fakdiv:             DC.L -6,120,-5040,362880 ;-3!, 5!, -7!, 9!
  469. ;-----------------------------------------------------------
  470.  
  471.  
  472.  
  473. ;-----------------------------------------------------------
  474. clrscr
  475.     move.l    scr1,a5
  476.     move.l    scr2,a6
  477.     moveq    #0,d0
  478.     moveq    #0,d1
  479.     moveq    #0,d2
  480.     moveq    #0,d3
  481.     moveq    #0,d4
  482.     moveq    #0,d5
  483.     moveq    #0,d6
  484.     move.l    d0,a0
  485.     move.l    d0,a1
  486.     move.l    d0,a2
  487.  
  488.     move.w    #489,d7
  489. .1    
  490.     rept    10
  491.     movem.l    d0-d6/a0-a2,(a5)
  492.     movem.l    d0-d6/a0-a2,(a6)
  493.     lea    40(a5),a5
  494.     lea    40(a6),a6
  495.     endr
  496.     dbf    d7,.1
  497.     rts
  498. ;-----------------------------------------------------------
  499. vbl
  500.  
  501. old_vbl    jmp    $12345678
  502.     rte
  503. ;-----------------------------------------------------------
  504. init
  505.     clr_bss
  506.  
  507.     super_on
  508.     mouse_off
  509.  
  510.     cache_on
  511.  
  512.         move.l  $44e.w,old_screen
  513.     save_resolution
  514.  
  515.     move.l    #screens+256,d0
  516.     clr.b    d0
  517.     move.l    d0,scr1
  518.     add.l    #384*240*2,d0
  519.     move.l    d0,scr2
  520.     add.l    #384*240*2,d0
  521.     move.l    d0,scr3
  522.  
  523.     move.l    scr1,d0
  524.     setscreen
  525.  
  526.     lea    rgb_320x200xtrue,a0
  527.     set_resolution
  528.  
  529.     move.l    #0,$ffff9800.w
  530.         rts
  531. ;-----------------------------------------------------------
  532. exit
  533.     
  534.     move.l    old_screen,d0
  535.     setscreen
  536.     restore_resolution
  537.  
  538.     mouse_on
  539.     super_off
  540.     rts
  541. ;-----------------------------------------------------------
  542.  
  543.  
  544.  
  545. ;-----------------------------------------------------------
  546. scr1        dc.l    0
  547. scr2        dc.l    0
  548. scr3        dc.l    0
  549.  
  550. exit_flag    dc.w    -1
  551.  
  552. ;-----------------------------------------------------------
  553. coltab3    REPT 256
  554.     dc.l    0
  555.     ENDR
  556.  
  557. maglogo        incbin yy.tru
  558. magnetic
  559.  
  560. tan        incbin tan.bin
  561. ;-----------------------------------------------------------
  562.  
  563.     even
  564.  
  565.     section bss
  566.  
  567.     ds.l    1000
  568. mystack        ds.l    0
  569.  
  570. start_bss
  571.  
  572. rotdist:                DS.L 128
  573. sin:                    DS.L 512/4
  574. cos:                    DS.L 512
  575. w:                      DS.W 1
  576. si:                     DS.L 1
  577. co:                     DS.L 1
  578. y:                      DS.L 1
  579. doubletab:              REPT 4
  580.                         DS.L 65536/2
  581.                         ENDR
  582. gfx:                    DS.L 256*256
  583. inverse_gfx:            DS.L 256*256
  584. tbuff:                  DS.L 6
  585.  
  586. orig_gfx    ds.w    128*128*4
  587.  
  588. screens        ds.w    3*384*240+256
  589.  
  590. end_bss
  591.