home *** CD-ROM | disk | FTP | other *** search
/ Enigma Amiga Life 109 / EnigmaAmiga109CD.iso / software / testi / corsoasm / sorgenti_darkcoder / vari / helix.s < prev    next >
Encoding:
Text File  |  1995-12-06  |  8.1 KB  |  398 lines

  1. *****************************************************************************
  2. ; HELIX - coded by Dan Phillips  19 Jan 93
  3. ;
  4. ; Modified by Randy/Ram Jam in 1995
  5. *****************************************************************************
  6.  
  7. ;    Use joystick to move Helix!
  8.  
  9.     Section BITPLANEolljelly,code
  10.  
  11. ;    Include    "DaWorkBench.s"    ; togliere il ; prima di salvare con "WO"
  12.  
  13. *****************************************************************************
  14.     include    "startup2.s"    ; salva interrupt, dma eccetera.
  15. *****************************************************************************
  16.  
  17.  
  18. ; Con DMASET decidiamo quali canali DMA aprire e quali chiudere
  19.  
  20.         ;5432109876543210
  21. DMASET    EQU    %1000001110000000    ; copper,bitplane DMA abilitati
  22.  
  23. WaitDisk    EQU    10    ; 50-150 al salvataggio (secondo i casi)
  24.  
  25. PlaneSize:    equ    40*256        ; 10240
  26.  
  27. START:
  28.  
  29. ; Puntiamo i nostri 3 bitplanes:
  30.  
  31.     move.l    #BitMap,d0    ; Indirizzo bitplanes
  32.     move.w    d0,onelo
  33.     swap    d0
  34.     move.w    d0,onehi
  35.     swap    d0
  36.     add.l    #PlaneSize,d0
  37.     move.w    d0,twolo
  38.     swap    d0
  39.     move.w    d0,twohi
  40.     swap    d0
  41.     add.l    #PlaneSize,d0
  42.     move.w    d0,thrlo
  43.     swap    d0
  44.     move.w    d0,thrhi
  45.  
  46. ; Settiamo le variabili
  47.  
  48.     move.w    #1,RotationSpeed
  49.     move.w    #3,Tightness
  50.  
  51. ; Puntiamo la Copperlist
  52.  
  53.     lea    $dff000,a5
  54.     MOVE.W    #DMASET,$96(a5)        ; DMACON - abilita bitplane, copper
  55.                     ; e sprites.
  56.     move.l    #COPPERLIST,$80(a5)    ; Puntiamo la nostra COP
  57.     move.w    d0,$88(a5)        ; Facciamo partire la COP
  58.     move.w    #0,$1fc(a5)        ; Disattiva l'AGA
  59.     move.w    #$c00,$106(a5)        ; Disattiva l'AGA
  60.     move.w    #$11,$10c(a5)        ; Disattiva l'AGA
  61.  
  62. mouse:
  63.     MOVE.L    #$1ff00,d1    ; bit per la selezione tramite AND
  64.     MOVE.L    #$0d000,d2    ; linea da aspettare = $d0
  65. Waity1:
  66.     MOVE.L    4(A5),D0    ; VPOSR e VHPOSR - $dff004/$dff006
  67.     ANDI.L    D1,D0        ; Seleziona solo i bit della pos. verticale
  68.     CMPI.L    D2,D0        ; aspetta la linea $d0
  69.     BNE.S    Waity1
  70.  
  71.     MOVEM.L    D0-D7/A0-A6,-(SP)
  72.  
  73.     bsr.s    Joystick
  74.     bsr.w    MakeHelix        ;make new data & draw it  
  75.  
  76.     MOVEM.L    (SP)+,D0-D7/A0-A6
  77.  
  78.     MOVE.L    #$1ff00,d1    ; bit per la selezione tramite AND
  79.     MOVE.L    #$0d000,d2    ; linea da aspettare = $d0
  80. Aspetta:
  81.     MOVE.L    4(A5),D0    ; VPOSR e VHPOSR - $dff004/$dff006
  82.     ANDI.L    D1,D0        ; Seleziona solo i bit della pos. verticale
  83.     CMPI.L    D2,D0        ; aspetta la linea $d0
  84.     BEQ.S    Aspetta
  85.  
  86.     btst    #6,$bfe001    ; Mouse premuto?
  87.     bne.s    mouse
  88.     rts            ; esci
  89.  
  90.  
  91. ******************************************************************************
  92. ; Routine che legge il joystick e cambia i valori dell'effetto, in quanto
  93. ; modifica le 2 variabili RotationSpeed e Tightness
  94. ******************************************************************************
  95.  
  96. Joystick:
  97.     bsr.w    ReadJoystick    ; Leggi il joystick
  98.     move.w    StickX(PC),d0    ; destra/sinistra = 1/-1
  99.     move.w    RotationSpeed(PC),d1    ; Speed attuale
  100.     add.w    d0,d1        ; aggiungi valore destra/sinistra, ossia +1
  101.                 ; se destra, -1 se sinistra
  102.     move.w    d1,d0
  103.     bpl.s    poa
  104.     neg.w    d0
  105. poa:
  106.     cmpi.w    #360,d0        ; Siamo arrivati a 360?
  107.     bcc.s    toobig        ; Se no, ok
  108.     move.w    d1,RotationSpeed ; Altimenti, rimani a 360, e' il massimo!
  109. toobig:
  110.     addq.w    #1,slow        ; rallentiamo un poco la variazione di vel.
  111.     cmp.w    #3,slow        ; siamo arrivati a 3?
  112.     bne.s    too        ; Se non ancora aspetta
  113.     clr.w    slow        ; azzera la var slow
  114.  
  115.     move.w    StickY(PC),d0    ; alto/basso = -1/1
  116.     move.w    Tightness(PC),d1
  117.     add.w    d0,d1        ; aggiungi valore Y dal joy
  118.  
  119.     move.w    d1,d0
  120.     bpl.s    pos
  121.     neg.w    d0
  122. pos:
  123.     cmpi.w    #360,d0        ; siamo al massimo?
  124.     bcc.s    too
  125.     move.w    d1,Tightness    ; se si rimani a 360
  126. too:
  127.     rts
  128.  
  129. slow:    dc.w    0
  130.  
  131. ;---------------------- subroutine che legge il joystick --------------------
  132. ;
  133. ; In uscita, le variabili StickX e StickY segnalano la direzione dest/sin o
  134. ; alto/basso: se verso l'alto, StickY=-1, se verso il basso, StickY=1
  135. ; se verso destra, StickX=1, se verso sinistra, StickX=-1.
  136. ; Inoltre Fire=0 o 1 se il tasto fire e' premuto.
  137.  
  138. ReadJoystick:
  139.     move.w    #0,Fire
  140.     btst    #7,$bfe001    ; Tasto fire premuto?
  141.     bne.s    nofire        ; Se no, continua
  142.     move.b    #1,Fire        ; Altrinenti Fire=1
  143. nofire:
  144.     clr.w    StickX        ; Azzera le variabili
  145.     clr.w    StickY
  146.     move.w    $dff00c,d3    ; joy1dat in d3
  147.     move.w    d3,d1
  148.     lsr.w    #1,d1
  149.     eor.w    d3,d1
  150.     btst.l    #0,d1    ; in basso?
  151.     bne.s    jback    ; Se si, StickY=1
  152.     btst.l    #8,d1
  153.     bne.s    jforward
  154.     bra.s    jx
  155.  
  156. jback:
  157.     move.w    #1,StickY    ; In basso, StickY=1
  158.     bra.s    jx
  159.  
  160. jforward:
  161.     move.w    #-1,StickY    ; In alto, StickY=-1
  162.  
  163. ; Controlla destra-sinistra
  164.  
  165. jx:
  166.     btst.l    #9,d3
  167.     beq.s    jon3
  168.     move.w    #-1,StickX    ; Sinistra, StickX=-1
  169.     rts
  170.  
  171. jon3:
  172.     btst.l    #1,d3
  173.     beq.s    jon4
  174.     move.w    #1,StickX    ; Destra, StickX=1
  175. jon4:
  176.     rts
  177.  
  178. StickX:
  179.     dc.w    0
  180. StickY:
  181.     dc.w    0
  182. Fire:
  183.     dc.w    0
  184.  
  185. ******************************************************************************
  186. ; Routine che muove l'effetto per lo schermo
  187. ******************************************************************************
  188.  
  189. CenterOfScreen:    equ    160
  190.  
  191. ElementSize:    equ    4    ;size of each entry
  192.  
  193.  
  194. MakeHelix:
  195.     lea    SaveArray,a6
  196.     moveq    #0,d7            ;counter
  197.     move.w    AngleTop(PC),d0
  198.     add.w    RotationSpeed(PC),d0
  199.     bpl.s    ok
  200.     addi.w    #360,d0
  201.     bra.s    cont
  202.  
  203. ok:
  204.     cmpi.w    #360,d0
  205.     bcs.s    cont
  206.     subi.w    #360,d0
  207. cont:
  208.     move.w    d0,AngleTop
  209.     move.w    d0,CurrentAngle
  210.  
  211. doit:
  212.     tst.l    (a6)
  213.     beq.s    skip
  214.     move.l    (a6),a0
  215.     clr.l    (a0)
  216.     lea    PlaneSize(a0),a0
  217.     clr.l    (a0)
  218.     lea    PlaneSize(a0),a0
  219.     clr.l    (a0)
  220. skip:
  221.     move.w    CurrentAngle(PC),d0
  222.     add.w    Tightness(PC),d0
  223.  
  224.     bpl.s    ok2
  225.     addi.w    #360,d0
  226.     bra.s    cont2
  227. ok2:
  228.     cmpi.w    #360,d0
  229.     bcs.s    cont2
  230.     subi.w    #360,d0
  231. cont2:
  232.     move.w    d0,CurrentAngle
  233.     bsr.s    Cosine            ;find x co.
  234.     addi.w    #CenterOfScreen,d0
  235.     move.w    d0,xvalue        ;save this for now
  236.  
  237. ;draw it
  238.     lea    BitMap,a0
  239.     move.w    d7,d0        ;work out which line
  240.     move.w    d7,d1
  241.     asl.w    #5,d0        ;x 40
  242.     asl.w    #3,d1
  243.     add.w    d1,d0
  244.     adda.w    d0,a0
  245.  
  246.     move.w    xvalue(PC),d0
  247.     asr.w    #4,d0        ;x/16
  248.     move.w    d0,d1        ;save this
  249.     asl.w    #1,d0        ;convert to bytes
  250.     adda.w    d0,a0
  251.     move.l    a0,(a6)        ;save this while we're here
  252.  
  253.     move.w    xvalue(PC),d0
  254.     asl.w    #4,d1
  255.     sub.w    d1,d0        ;shift value
  256.  
  257.     moveq    #2,d2
  258.     lea    BobData,a1
  259. next:
  260.     moveq    #0,d1
  261.     move.w    (a1)+,d1
  262.     swap    d1
  263.     lsr.l    d0,d1        ;just like the blitter!
  264.     move.l    d1,(a0)        ;draw it
  265.     lea    PlaneSize(a0),a0
  266.     dbf    d2,next
  267.  
  268.     addq.w    #ElementSize,a6
  269.     addq.w    #1,d7
  270.     cmpi.w    #150,d7
  271.     bne.w    doit
  272.     rts    
  273.  
  274. xvalue:        dc.w    0
  275. CurrentAngle:    dc.w    0
  276. AngleTop:    dc.w    0
  277. Tightness:    dc.w    0
  278. RotationSpeed:    dc.w    0
  279.  
  280. Cosine:                ;d0 angle, returns cos in d0
  281.     move.l    a6,-(SP)
  282.     bsr.w    sok
  283.     move.l    (SP)+,a6
  284.     rts
  285.  
  286. sok:
  287.     lea    CosTable(PC),a6
  288.     cmpi.w    #90,d0
  289.     bcc.s    gt90
  290.     asl.w    #1,d0        ;< 90
  291.     move.w    0(a6,d0.w),d0
  292.     rts
  293.  
  294. gt90:
  295.     cmpi.w    #180,d0
  296.     bcc.s    gt180
  297.     move.w    #180,d1        ;90 < a < 180
  298.     sub.w    d0,d1
  299.     move.w    d1,d0
  300.     asl.w    #1,d0
  301.     move.w    0(a6,d0.w),d0
  302.     neg.w    d0
  303.     rts    
  304.  
  305. gt180:
  306.     cmpi.w    #270,d0
  307.     bcc.s    gt270
  308.  
  309.     subi.w    #180,d0        ;180 < a < 270
  310.     asl.w    #1,d0
  311.     move.w    0(a6,d0.w),d0
  312.     neg.w    d0
  313.     rts
  314.  
  315. gt270:
  316.     move.w    #360,d1        ;270 < a <360
  317.     sub.w    d0,d1
  318.     move.w    d1,d0
  319.     asl.w    #1,d0
  320.     move.w    0(a6,d0.w),d0
  321.     rts
  322.  
  323.  
  324. BobData:
  325.     dc.w    $cccc,$3c3c,$03fc
  326.  
  327. CosTable:
  328.     dc.w    100,100,100,100,100,100,99,99,99,99,98,98,98,97,97,97
  329.     dc.w    96,96,95,95,94,93,93,92,91,91,90,89,88,87,87,86,85,84
  330.     dc.w    83,82,81,80,79,78,77,75,74,73,72,71,69,68,67,66,64,63
  331.     dc.w    62,60,59,57,56,54,53,52,50,48,47,45,44,42,41,39,37,36
  332.     dc.w    34,33,31,29,28,26,24,22,21,19,17,16,14,12,10,9,7,5,3,2,0
  333.  
  334. ******************************************************************************
  335. ;                COPPERLIST
  336. ******************************************************************************
  337.  
  338.         section    cop,data_C
  339. CopperList:
  340.     dc.w    $108,0        ; bpl1mod
  341.     dc.w    $10a,0        ; bpl2mod
  342.     dc.w    $92,$38        ; ddfstrt
  343.     dc.w    $94,$d0        ; ddfstop
  344.     dc.w    $8e,$2c81    ; diwstrt
  345.     dc.w    $90,$2cc1    ; diwstop
  346.     dc.w    $102,0        ; bplcon1
  347.     dc.w    $104,0        ; bplcon2
  348.     dc.w    $100,$3200    ; bplcon0 - 3 bitplanes lowres (8 colori)
  349.  
  350.     dc.w    $e0    ; bpl0pth
  351. onehi:
  352.     dc.w    0
  353.     dc.w    $e2    ; bpl0ptl
  354. onelo:
  355.     dc.w    0
  356.     dc.w    $e4    ; bpl1pth
  357. twohi:
  358.     dc.w    0
  359.     dc.w    $e6    ; bpl1ptl
  360. twolo:
  361.     dc.w    0
  362.     dc.w    $e8    ; bpl2pth
  363. thrhi:
  364.     dc.w    0
  365.     dc.w    $ea    ; bpl2ptl
  366. thrlo:
  367.     dc.w    0
  368.  
  369.     dc.w    $180,$000    ; color0
  370.     dc.w    $182,$fff    ; color1
  371.     dc.w    $184,$ddd    ; color2
  372.     dc.w    $186,$bbb    ; color3
  373.     dc.w    $188,$999    ; color4
  374.     dc.w    $18a,$777    ; color5
  375.     dc.w    $18c,$555    ; color6
  376.     dc.w    $18e,$333    ; color7
  377.  
  378.     dc.w    $ffff,$fffe    ; Fine della copperlist
  379.  
  380. ******************************************************************************
  381. ;                BITPLANES
  382. ******************************************************************************
  383.  
  384.         section    bitmap,bss_C
  385.  
  386. BitMap:
  387.     ds.b    PlaneSize*3
  388.  
  389.  
  390. ******************************************************************************
  391.  
  392.         section    bufferozzo,bss
  393.  
  394. SaveArray:
  395.     ds.b    256*ElementSize    ;256 lines
  396.  
  397.     END
  398.