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

  1.  
  2. ; Lezione11b.s - Primo utilizzo della nuova startup2.s e di un interrupt.
  3.  
  4.     Section    PrimoInterrupt,CODE
  5.  
  6. ;    Include    "DaWorkBench.s"    ; togliere il ; prima di salvare con "WO"
  7.  
  8. *****************************************************************************
  9.     include    "startup2.s"    ; salva interrupt, dma eccetera.
  10. *****************************************************************************
  11.  
  12.  
  13. ; Con DMASET decidiamo quali canali DMA aprire e quali chiudere
  14.  
  15.         ;5432109876543210
  16. DMASET    EQU    %1000001010000000    ; copper DMA abilitato
  17.  
  18. WaitDisk    EQU    30    ; 50-150 al salvataggio (secondo i casi)
  19.  
  20. START:
  21.     move.l    BaseVBR(PC),a0         ; In a0 il valore del VBR
  22.     move.l    #MioInt6c,$6c(a0)    ; metto la mia rout. int. livello 3.
  23.  
  24.     MOVE.W    #DMASET,$96(a5)        ; DMACON - abilita bitplane, copper
  25.                     ; e sprites.
  26.     move.l    #COPPERLIST,$80(a5)    ; Puntiamo la nostra COP
  27.     move.w    d0,$88(a5)        ; Facciamo partire la COP
  28.     move.w    #0,$1fc(a5)        ; Disattiva l'AGA
  29.     move.w    #$c00,$106(a5)        ; Disattiva l'AGA
  30.     move.w    #$11,$10c(a5)        ; Disattiva l'AGA
  31.  
  32.     movem.l    d0-d7/a0-a6,-(SP)
  33.     bsr.w    mt_init        ; inizializza la routine musicale
  34.     movem.l    (SP)+,d0-d7/a0-a6
  35.  
  36.     move.w    #$c020,$9a(a5)    ; INTENA - abilito interrupt "VERTB" del
  37.                 ; livello 3 ($6c), quello che viene generato
  38.                 ; una volta al fotogramma (alla linea $00).
  39.  
  40. mouse:
  41.     btst    #6,$bfe001    ; Mouse premuto? (il processore esegue questo
  42.     bne.s    mouse        ; loop in modo utente, e ogni vertical blank
  43.                 ; lo interrompe per suonare la musica!).
  44.  
  45.     bsr.w    mt_end        ; fine del replay!
  46.  
  47.     rts            ; esci
  48.  
  49. *****************************************************************************
  50. *    ROUTINE IN INTERRUPT $6c (livello 3) - usato il VERTB solamente.
  51. *****************************************************************************
  52. ;         ..,..,.,
  53. ;       /~""~""~""~\
  54. ;      /_____ ¸_____)
  55. ;     _) ¬(_° \°_)¬\
  56. ;    ( __   (__)    \
  57. ;     \ \___ _____, /
  58. ;      \__  Y  ____/xCz
  59. ;        `-----'
  60.  
  61. MioInt6c:
  62.     btst.b    #5,$dff01f    ; INTREQR - il bit 5, VERTB, e' azzerato?
  63.     beq.s    NointVERTB        ; Se si, non e' un "vero" int VERTB!
  64.     movem.l    d0-d7/a0-a6,-(SP)    ; salvo i registri nello stack
  65.     bsr.w    mt_music        ; suono la musica
  66.     movem.l    (SP)+,d0-d7/a0-a6    ; riprendo i reg. dallo stack
  67. nointVERTB:     ;6543210
  68.     move.w    #%1110000,$dff09c ; INTREQ - cancello rich. BLIT,COPER,VERTB
  69.                 ; dato che il 680x0 non la cancella da solo!!!
  70.     rte    ; uscita dall'int COPER/BLIT/VERTB
  71.  
  72. *****************************************************************************
  73. ;    Routine di replay del protracker/soundtracker/noisetracker
  74. ;
  75.     include    "assembler2:sorgenti4/music.s"
  76. *****************************************************************************
  77.  
  78.     SECTION    GRAPHIC,DATA_C
  79.  
  80. COPPERLIST:
  81.     dc.w    $100,$200    ; BPLCON0 - no bitplanes
  82.     dc.w    $180,$00e    ; color0 BLU
  83.     dc.w    $FFFF,$FFFE    ; Fine della copperlist
  84.  
  85. *****************************************************************************
  86. ;                MUSICA
  87. *****************************************************************************
  88.  
  89. mt_data:
  90.     dc.l    mt_data1
  91.  
  92. mt_data1:
  93.     incbin    "assembler2:sorgenti4/mod.yellowcandy"
  94.  
  95.     end
  96.  
  97. Se non settassimo l'interrupt VERTB del livello 3 ($6c), questo listato
  98. si concluderebbe in un solo loop:
  99.  
  100. mouse:
  101.     btst    #6,$bfe001    ; Mouse premuto? (il processore esegue questo
  102.     bne.s    mouse        ; loop in modo utente, e ogni vertical blank
  103.                 ; lo interrompe per suonare la musica!).
  104.  
  105. Invece il processore lavora in "multitasking" bloccando il loop ogni volta che
  106. il pennello elettronico raggiunge la linea $00, eseguendo MT_MUSIC e ritornando
  107. ad eseguire lo sterile loop.
  108. Anziche' questo vile loop di attesa del mouse, avremmo potuto mettere una
  109. routine di calcolo di un frattale, che poteva richiedere diversi secondi,
  110. durante i quali la musica avrebbe suonato in "contemporanea" e sincronizzata,
  111. senza disturbare il calcolo del frattale, rallentandolo solo il poco che serve
  112. a suonare la musica ogni fotogramma.
  113.  
  114. Da notare i 2 EQUATE all'inizio del programma, uno per l'accensione dei DMA,
  115. che ormai conosciamo, e quello nuovo:
  116.  
  117. WaitDisk    EQU    30    ; 50-150 al salvataggio (secondo i casi)
  118.  
  119. Che "aspetta" un poco prima di prendere il controllo dell'hardware.
  120. Per fare un calcolo del tempo atteso condiderate 50 come 1 secondo, essendo
  121. usato il Vblank, che va al "conquantesimo". Per cui 150 sono 3 secondi.
  122. Se comunque il vostro programma e' un file abbastanza grosso e compattato,
  123. a scompattare ci mettera' quel seconduccio o due che basta, per cui si puo'
  124. lasciare a un valore basso. Se invece salvaste il file non compresso, e lo
  125. faceste partire da dischetto, l'esecuzione partirebbe prima che la spia del
  126. drive si sia spenta, e una volta su 5 succede che all'uscita il dos e' andato
  127. in coma totale. Per evitare cio', calcolate sempre che tra scompattazione e
  128. tempo perso con il loop "waitdisk" il programma parta dopo 3 secondi almeno
  129. dalla fine del caricamento.
  130.  
  131.