home *** CD-ROM | disk | FTP | other *** search
/ Enigma Amiga Life 109 / EnigmaAmiga109CD.iso / software / testi / corsoasm / sorgenti8 / lezione14-2a.s < prev    next >
Text File  |  1995-09-29  |  2KB  |  81 lines

  1.  
  2. ; Lezione14-2a.s    ** SUONARE UN'ARMONICA A VARIE NOTE **
  3.  
  4.  
  5.     SECTION    Armonica2,CODE
  6.  
  7. Start:
  8.     move.l    4.w,a6
  9.     jsr    -$78(A6)        ; _LVODisable
  10.  
  11.     bset    #1,$bfe001        ; Spegne il filtro passa-basso
  12.  
  13.     lea    $dff000,a6
  14.     move.w    $2(a6),d7        ; dmaconr - Salva DMA dell'OS
  15.  
  16. Clock    equ    3546895
  17.  
  18.     move.l    #armonica,$a0(a6)    ; AUD0LCH.w+AUD0LCL.w=AUD0LC.l
  19.     move.w    #16/2,$a4(a6)        ; 16 bytes/2=8 word di dati (AUD0LEN)
  20.     move.l    #clock/16,d1        ; 1/16 = un 16esimo del clock
  21.     divu.w    do3(pc),d1        ; <<< CAMBIATE IL PRIMO OPERANDO DI
  22.                     ;  QUESTO MOVE PER GENERARE ALTRE
  23.                     ; NOTE >>>
  24.     move.w    d1,$a6(a6)        ; AUD0PER col periodo calcolato
  25.     move.w    #64,$a8(a6)        ; AUD0VOL al massimo (0 dB)
  26.     move.w    #$8001,$96(a6)        ; Accende AUD0 DMA in DMACONW
  27.  
  28. WLMB:    btst    #6,$bfe001        ; Aspetta il tasto sinistro del mouse
  29.     bne.s    WLMB
  30.  
  31.     or.w    #$8000,d7        ; accende il bit 15 (SET/CLR)
  32.     move.w    #$0001,$96(a6)        ; dmacon - spegne aud0
  33.     move.w    d7,$96(a6)        ; dmacon - reimposta DMA dell'OS
  34.     move.l    4.w,a6
  35.     jsr    -$7e(a6)        ; _LVOEnable
  36.     rts
  37.  
  38.  
  39. DO3:    dc.w    528        ;frequenze delle note
  40. RE3:    dc.w    528*9/8
  41. MI3:    dc.w    528*5/4
  42. FA3:    dc.w    528*4/3
  43. SOL3:    dc.w    528*3/2
  44. LA3:    dc.w    528*5/3
  45. SI3:    dc.w    528*15/8
  46. DO4:    dc.w    528*2
  47.  
  48.  
  49. ******************************************************************************
  50.  
  51.     SECTION    Sample,DATA_C    ;venendo letta dal DMA deve essere in CHIP
  52.  
  53.     ; Armonica di 16 valori creata col'IS del trash'm-one
  54.  
  55. Armonica:
  56.     DC.B    $19,$46,$69,$7C,$7D,$6A,$47,$1A,$E8,$BB,$97,$84,$83,$95,$B8,$E5
  57.  
  58.     END
  59.  
  60. ******************************************************************************
  61.  
  62. Al periodo 1/16 del clock (= 35468095/16) si leggerebbe l'armonica ad 1 Hz,
  63. poiche' e' lunga 16 byte, e - come dicevamo nel primo sorgente -, leggendone
  64. 16 al secondo, si legge tutta l'armonica 1 volta al secondo (= 1 Hz, appunto);
  65. dividendo il periodo 1/16 per la frequenza della nota da suonare contenuta
  66. in RAM alla relativa label, si moltiplica la frequenza di lettura di 1 Hz
  67. per la frequenza della nota, appunto, facendo leggere all'hardware l'intera
  68. armonica piu' volte al secondo.
  69.  
  70. Sarebbe stato possibile raggiungere il medesimo risultato da imserire in 
  71. AUD0PER anche con il seguende codice:
  72.  
  73.     [...]
  74.     move.l    #clock,d1        ; costante di clock
  75.     move.w    do3(pc),d2        ; ...o qualsiasi altra frequenza...
  76.     mulu.w    #16,d2            ; d2.l = 16*frequenza della nota
  77.     divu.w    d2,d1            ; d1.w = clock/(16*freq)
  78.     move.w    d1,$a6(a6)        ; imposta AUD0PER
  79.     [...]
  80.  
  81.