home *** CD-ROM | disk | FTP | other *** search
/ Enigma Amiga Life 109 / EnigmaAmiga109CD.iso / software / testi / corsoasm / sorgenti7 / lezione11d2.s < prev    next >
Text File  |  1995-09-29  |  8KB  |  251 lines

  1.  
  2. ; Lezione11d2.s - Utilizzo di interrupts COPER e VERTB dell livello 3 ($6c).
  3. ;          Questa volta si fa ciclare la palette. Tasto destro del
  4. ;          mouse per bloccare la routine temporaneamente.
  5.  
  6.     Section    Interrupt,CODE
  7.  
  8. ;    Include    "DaWorkBench.s"    ; togliere il ; prima di salvare con "WO"
  9.  
  10. *****************************************************************************
  11.     include    "startup2.s"    ; salva interrupt, dma eccetera.
  12. *****************************************************************************
  13.  
  14.  
  15. ; Con DMASET decidiamo quali canali DMA aprire e quali chiudere
  16.  
  17.         ;5432109876543210
  18. DMASET    EQU    %1000001110000000    ; copper e bitplane DMA abilitati
  19.  
  20. WaitDisk    EQU    30    ; 50-150 al salvataggio (secondo i casi)
  21.  
  22. START:
  23.  
  24. ; Puntiamo la PIC
  25.  
  26.     MOVE.L    #PICTURE2,d0
  27.     LEA    BPLPOINTERS2,A1
  28.     MOVEQ    #5-1,D1            ; num di bitplanes
  29. POINTBT2:
  30.     move.w    d0,6(a1)
  31.     swap    d0
  32.     move.w    d0,2(a1)
  33.     swap    d0
  34.     add.l    #34*40,d0        ; lunghezza del bitplane
  35.     addq.w    #8,a1
  36.     dbra    d1,POINTBT2    ; Rifai D1 volte (D1=num do bitplanes)
  37.  
  38. ; Puntiamo il nostro int di livello 3
  39.  
  40.     move.l    BaseVBR(PC),a0         ; In a0 il valore del VBR
  41.     move.l    #MioInt6c,$6c(a0)    ; metto la mia rout. int. livello 3.
  42.  
  43.     MOVE.W    #DMASET,$96(a5)        ; DMACON - abilita bitplane, copper
  44.                     ; e sprites.
  45.     move.l    #COPPERLIST,$80(a5)    ; Puntiamo la nostra COP
  46.     move.w    d0,$88(a5)        ; Facciamo partire la COP
  47.     move.w    #0,$1fc(a5)        ; Disattiva l'AGA
  48.     move.w    #$c00,$106(a5)        ; Disattiva l'AGA
  49.     move.w    #$11,$10c(a5)        ; Disattiva l'AGA
  50.  
  51.     movem.l    d0-d7/a0-a6,-(SP)
  52.     bsr.w    mt_init        ; inizializza la routine musicale
  53.     movem.l    (SP)+,d0-d7/a0-a6
  54.  
  55.     move.w    #$c030,$9a(a5)    ; INTENA - abilito interrupt "VERTB" e "COPER"
  56.                 ; del livello 3 ($6c)
  57.  
  58. mouse:
  59.     btst    #6,$bfe001    ; Mouse premuto? (il processore esegue questo
  60.     bne.s    mouse        ; loop in modo utente, e ogni vertical blank
  61.                 ; nonche' ogni WAIT della linea raster $a0
  62.                 ; lo interrompe per suonare la musica!).
  63.  
  64.     bsr.w    mt_end        ; fine del replay!
  65.  
  66.     rts            ; esci
  67.  
  68. *****************************************************************************
  69. *    ROUTINE IN INTERRUPT $6c (livello 3) - usato il VERTB e COPER.
  70. *****************************************************************************
  71.  
  72. ;         ,,,,;;;;;;;;;;;;;;;;;;;;;,
  73. ;      ,;;;;;;;;;;'''''''';;;;;;;;;;;;,
  74. ;      ;|                     \   ';;'
  75. ;      ;|   _______  ______,   )
  76. ;      _| _________   ________/
  77. ;     / T ¬/   ¬©) \ /  ¬©) \¯¡
  78. ;    ( C|  \_______/ \______/ |
  79. ;     \_j ______      \  ____ |
  80. ;      `|     /        \  \   l
  81. ;       |    /     (, _/   \  /
  82. ;       |  _   __________    /
  83. ;       |  '\   --------¬   /
  84. ;       |    \_____________/
  85. ;       |          __,   T
  86. ;       l________________! xCz
  87.  
  88. MioInt6c:
  89.     btst.b    #5,$dff01f    ; INTREQR - il bit 5, VERTB, e' azzerato?
  90.     beq.s    NointVERTB        ; Se si, non e' un "vero" int VERTB!
  91.     movem.l    d0-d7/a0-a6,-(SP)    ; salvo i registri nello stack
  92.     bsr.w    mt_music        ; suono la musica
  93.     movem.l    (SP)+,d0-d7/a0-a6    ; riprendo i reg. dallo stack
  94.     move.w    #$20,$dff09c    ; INTREQ - int eseguito, cancello la richiesta
  95.                 ; dato che il 680x0 non la cancella da solo!!!
  96.     rte    ; Uscita dall'int VERTB
  97.  
  98. nointVERTB:
  99.     btst.b    #4,$dff01f    ; INTREQR - COPER azzerato?
  100.     beq.s    NointCOPER    ; se si, non e' un int COPER!
  101.     movem.l    d0-d7/a0-a6,-(SP)    ; salvo i registri nello stack
  102.     bsr.w    ColorCicla        ; Cicla i colori della pic
  103.     movem.l    (SP)+,d0-d7/a0-a6    ; riprendo i reg. dallo stack
  104.  
  105. NointCOPER:
  106.          ;6543210
  107.     move.w    #%1010000,$dff09c ; INTREQ - cancello richiesta BLIT e COPER
  108.     rte    ; uscita dall'int COPER/BLIT
  109.  
  110.  
  111. *****************************************************************************
  112. *    Routine che "cicla" i colori di tutta la palette.            *
  113. *    Questa routine cicla i primi 15 colori separatamente dal secondo    *
  114. *    secondo blocco di colori. Funziona come i "RANGE" del Dpaint.       *
  115. *****************************************************************************
  116.  
  117. ;    Il contatore "cont" serve a far aspettare 3 fotogrammi prima di
  118. ;    eseguire la routine cont. In pratica a "rallentare" l'esecuzione
  119.  
  120. cont:
  121.     dc.w    0
  122.  
  123. ColorCicla:
  124.     btst.b    #2,$dff016    ; Tasto destro del mouse premuto?
  125.     beq.s    NonAncora    ; Se si, esci
  126.     addq.b    #1,cont
  127.     cmp.b    #3,cont        ; Agisci 1 volta ogni 3 fotogrammi solamente
  128.     bne.s    NonAncora    ; Non siamo ancora al terzo? Esci!
  129.     clr.b    cont        ; Siamo al terzo, azzera il contatore
  130.  
  131. ; Roteazione all'indietro dei primi 15 colori
  132.  
  133.     lea    cols+2,a0    ; Indirizzo primo colore del primo gruppo
  134.     move.w    (a0),d0        ; Salva il primo colore in d0
  135.     moveq    #15-1,d7    ; 15 colori da "roteare" nel primo gruppo
  136. cloop1:
  137.     move.w    4(a0),(a0)    ; Copia il colore avanti in quello prima
  138.     addq.w    #4,a0        ; salta alla prossimo col. da "indietreggiare"
  139.     dbra    d7,cloop1    ; ripeti d7 volte
  140.     move.w    d0,(a0)        ; Sistema il primo colore salvato come ultimo.
  141.  
  142. ; Roteazione in avanti dei secondi 15 colori
  143.  
  144.     lea    cole-2,a0    ; Indirizzo ultimo colore del secondo gruppo
  145.     move.w    (a0),d0        ; Salva l'ultimo colore in d0
  146.     moveq    #15-1,d7    ; Altri 15 colori da "roteare" separatamente
  147. cloop2:    
  148.     move.w    -4(a0),(a0)    ; Copia il colore indietro in quello dopo
  149.     subq.w    #4,a0        ; salta al precedente col. da "avanzare"
  150.     dbra    d7,cloop2    ; ripeti d7 volte
  151.     move.w    d0,(a0)        ; Sistema l'ultimo colore salvato come primo
  152. NonAncora:
  153.     rts
  154.  
  155.  
  156. *****************************************************************************
  157. ;    Routine di replay del protracker/soundtracker/noisetracker
  158. ;
  159.     include    "assembler2:sorgenti4/music.s"
  160. *****************************************************************************
  161.  
  162.     SECTION    GRAPHIC,DATA_C
  163.  
  164. COPPERLIST:
  165.     dc.w    $8E,$2c81    ; DiwStrt
  166.     dc.w    $90,$2cc1    ; DiwStop
  167.     dc.w    $92,$0038    ; DdfStart
  168.     dc.w    $94,$00d0    ; DdfStop
  169.     dc.w    $102,0        ; BplCon1
  170.     dc.w    $104,0        ; BplCon2
  171.     dc.w    $108,0        ; Bpl1Mod
  172.     dc.w    $10a,0        ; Bpl2Mod
  173.  
  174.     dc.w    $100,$200    ; BPLCON0 - no bitplanes
  175.     dc.w    $180,$00e    ; color0 BLU
  176.  
  177.     dc.w    $b807,$fffe    ; WAIT - attendi la linea $b8
  178.     dc.w    $9c,$8010    ; INTREQ - Richiedo un interrupt COPER, il
  179.                 ; quale fa agire sui 32 colori della palette.
  180.  
  181.     dc.w    $b907,$fffe    ; WAIT - attendi linea $b9
  182. BPLPOINTERS2:
  183.     dc.w $e0,0,$e2,0        ;primo      bitplane
  184.     dc.w $e4,0,$e6,0        ;secondo    "
  185.     dc.w $e8,0,$ea,0        ;terzo        "
  186.     dc.w $ec,0,$ee,0        ;quarto        "
  187.     dc.w $f0,0,$f2,0        ;quinto        "
  188.  
  189.     dc.w    $100,%0101001000000000    ; BPLCON0 - 5 bitplanes LOWRES
  190.  
  191. ; La palette, che sara' "ruotata" in 2 gruppi di 16 colori.
  192.  
  193. cols:
  194.     dc.w $180,$040,$182,$050,$184,$060,$186,$080    ; tono verde
  195.     dc.w $188,$090,$18a,$0b0,$18c,$0c0,$18e,$0e0
  196.     dc.w $190,$0f0,$192,$0d0,$194,$0c0,$196,$0a0
  197.     dc.w $198,$090,$19a,$070,$19c,$060,$19e,$040
  198.  
  199.     dc.w $1a0,$029,$1a2,$02a,$1a4,$13b,$1a6,$24b    ; tono blu
  200.     dc.w $1a8,$35c,$1aa,$36d,$1ac,$57e,$1ae,$68f
  201.     dc.w $1b0,$79f,$1b2,$68f,$1b4,$58e,$1b6,$37e
  202.     dc.w $1b8,$26d,$1ba,$15d,$1bc,$04c,$1be,$04c
  203. cole:
  204.  
  205.     dc.w    $da07,$fffe    ; WAIT - attendi la linea $da
  206.     dc.w    $100,$200    ; BPLCON0 - disabilita i bitplanes
  207.     dc.w    $180,$00e    ; color0 BLU
  208.  
  209.     dc.w    $FFFF,$FFFE    ; Fine della copperlist
  210.  
  211.  
  212. *****************************************************************************
  213. ;         DISEGNO 320*34 a 5 bitplanes (32 colori)
  214. *****************************************************************************
  215.  
  216. PICTURE2:
  217.     INCBIN    "pic320*34*5.raw"
  218.  
  219. *****************************************************************************
  220. ;                MUSICA
  221. *****************************************************************************
  222.  
  223. mt_data:
  224.     dc.l    mt_data1
  225.  
  226. mt_data1:
  227.     incbin    "assembler2:sorgenti4/mod.fuck the bass"
  228.  
  229.     end
  230.  
  231. In questo esempio cambiato la palette proprio una linea prima del disegno.
  232. Infatti basta cambiarlo una linea prima!
  233. Nel frattempo col processore si possono svolgere compiti vari, ma saremo
  234. sicuri che alla linea $b9 i colori sono cambiati ogni volta.
  235. Altra cosa da notare e' che nonostante l'interrupt avvenga ogni fotogramma,
  236. tramite un "contatore" e' possibile far eseguire la routine una volta ogni
  237. 3 fotogrammi. Dunque abbiamo visto che e' possibile mettere piu' routines
  238. e piu' interrupt nella stessa copperlist, a linee diverse, in Lezione11d.s,
  239. basta fare in modo che ogni volta sia eseguita la routine per quella linea.
  240. Ora vediamo che si puo' far eseguire qualcuna di queste routine una volta
  241. ogni X frames, per cui si puo' fare ogni cosa!
  242. Ricordatevi pero' che ogni interrupt porta via un poco di tempo per i salti
  243. che devono essere fatti.
  244.  
  245. Una nota: i 2 numeri sono della bbs Fidonet AmigaLink di Grosseto, infatti
  246. questo e' un "pezzo" della piccola demo che ho fatto al sysop di questa bbs.
  247. Sono segnato come "Fabio Ciucci", ma raramente chiamo, per motivi tutti
  248. di bolletta galattica. Fino a che non ci sara' l'accesso gratuito in tutte le
  249. citta' ad Internet per i coder sara' dura scambiare via modem. Meglio la posta!
  250.  
  251.