home *** CD-ROM | disk | FTP | other *** search
/ Enigma Amiga Life 109 / EnigmaAmiga109CD.iso / software / testi / corsoasm / sorgenti5 / lezione9a2.s < prev    next >
Text File  |  1995-10-23  |  5KB  |  134 lines

  1.  
  2. ; Lezione9a2.s - COPIA DI $10 words tramite il BLITTER
  3.  
  4.     SECTION Blit,CODE
  5.  
  6. Inizio:
  7.     move.l    4.w,a6        ; Execbase in a6
  8.     jsr    -$78(a6)    ; Disable - ferma il multitasking
  9.     lea    GfxName,a1    ; Indirizzo del nome della lib da aprire in a1
  10.     jsr    -$198(a6)    ; OpenLibrary
  11.     move.l    d0,a6        ; usa una routine della graphics library:
  12.     jsr    -$1c8(a6)    ; OwnBlitter, che ci da l'esclusiva sul blitter
  13.                 ; impedendone l'uso al sistema operativo.
  14.     btst    #6,$dff002    ; attendi che il blitter finisca (test a vuoto)
  15.                 ; per il BUG di Agnus
  16. waitblit:
  17.     btst    #6,$dff002    ; blitter libero?
  18.     bne.s    waitblit
  19.  
  20. ; Ecco come fare una copia
  21.  
  22. ;       __&__
  23. ;      /     \
  24. ;     |      |
  25. ;     |  (o)(o)
  26. ;     c   .---_)
  27. ;      | |.___|
  28. ;      |  \__/
  29. ;      /_____\
  30. ;     /_____/ \
  31. ;    /         \
  32.  
  33.     move.w    #$09f0,$dff040     ; BLTCON0: attivati canali A e D
  34.                  ; i MINTERMS (cioe` i bits 0-7) assumono il
  35.                  ; valore $f0. In questo modo si definisce
  36.                  ; l'operazione di copia da A a D
  37.  
  38.     move.w    #$0000,$dff042     ; BLTCON1: questo registro lo spiegheremo dopo
  39.     move.l    #SORG,$dff050     ; BLTAPT: Indirizzo del canale sorgente
  40.     move.l    #DEST,$dff054     ; BLTDPT: Indirizzo del canale di destinazione
  41.     move.w    #$0000,$dff064     ; BLTAMOD: questo registro lo spiegheremo dopo
  42.     move.w    #$0000,$dff066     ; BLTDMOD: questo registro lo spiegheremo dopo
  43.     move.w    #(1*64)+$10,$dff058 ; BLTSIZE: definisce le dimensioni del
  44.                     ; rettangolo. In questo caso abbiamo
  45.                     ; larghezza $10 words e altezza 1 riga.
  46.                     ; Poiche` l'altezza del rettangolo va
  47.                     ; scritta nei bit 6-15 di BLTSIZE
  48.                     ; dobbiamo shiftarla a sinistra di 6 bit.
  49.                     ; Cio` equivale a moltiplicarne il valore
  50.                     ; per 64. La larghezza viene espressa nei
  51.                     ; 6 bit bassi e pertanto non viene 
  52.                     ; modificata.
  53.                     ; Inoltre questa istruzione da inizio
  54.                     ; alla blittata
  55.  
  56.     btst    #6,$dff002    ; attendi che il blitter finisca (test a vuoto)
  57. waitblit2:
  58.     btst    #6,$dff002    ; blitter libero?
  59.     bne.s    waitblit2
  60.  
  61.     jsr    -$1ce(a6)    ; DisOwnBlitter, il sistema operativo ora
  62.                 ; puo' nuovamente usare il blitter
  63.     move.l    a6,a1        ; Base della libreria grafica da chiudere
  64.     move.l    4.w,a6
  65.     jsr    -$19e(a6)    ; Closelibrary - chiudo la graphics lib
  66.     jsr    -$7e(a6)    ; Enable - riabilita il Multitasking
  67.     rts
  68.  
  69. GfxName:
  70.     dc.b    "graphics.library",0,0
  71.  
  72. ******************************************************************************
  73.  
  74.     SECTION THE_DATA,DATA_C
  75.  
  76. ; notate che i dati che copiamo devono essere in memoria CHIP
  77. ; infatti il Blitter opera solo in memoria CHIP
  78.  
  79. ; questa e` la sorgente
  80.  
  81. SORG:
  82.     dc.w    $1111,$2222,$3333,$4444,$5555,$6666,$7777,$aaaa
  83.     dc.w    $8888,$2222,$3333,$4444,$5555,$6666,$7777,$ffff
  84. THEEND1:
  85.     dc.b    'Qui finisce la sorgente'
  86.     even
  87.  
  88. ; questa e' la destinazione
  89.  
  90. DEST:
  91.     dcb.w    $10,$0000
  92. THEEND2:
  93.     dc.b    'Qui finisce la destinazione'
  94.  
  95.     even
  96.  
  97.     end
  98.  
  99. Questo esempio mostra una SEMPLICE copia con il blitter.
  100. Assemblate, senza Jumpare, controllate con il comando dell'ASMONE "M SORG"
  101. che a partire dall'indirizzo SORG ci siano in memoria $10 word che assumono
  102. valori vari. Si tratta della sorgente della copia, cioe` della zona della quale
  103. leggeremo i dati. Allo stesso modo, con il comando "M DEST" verificate che 
  104. a partire dell'indirizzo DEST ci siano $10 word azzerate.
  105.  
  106. A questo punto eseguite l'esempio.
  107. Ora, sempre con il comando ASMONE "M" andate a vedere quello che e` successo
  108. in memoria: i dati all'indirizzo SORG sono rimasti gli stessi di prima.
  109. Cio` e` normale perche` il blitter ha semplicemente letto quei dati, senza
  110. modificarli. Le word a partire dall'indirizzo DEST, invece, ora non sono piu`
  111. azzerate, ma hanno assunto gli stessi valori dei dati sorgente.
  112.  
  113. L'operazione di copia richiede l'uso di un canale in lettura e di uno in
  114. scrittura. In questo caso usiamo A in lettura e D (ovviamente) per scrivere.
  115. Per copiare dal canale A al canale D e` necessario porre i MINTERMS al valore
  116. $f0. Pertanto il valore da caricare nel registro BLTCON0 e` $09f0.
  117.  
  118. Notate che avremmo potuto eseguire la copia usando un'altro canale (B o C)
  119. per la lettura. Potete provare a farlo voi per esercizio. Le modifiche
  120. da fare sono molto semplici:
  121.  
  122. - Abilitare il canale che volete usare invece che il canale A (bit 8-11 di
  123.   BLTCON0)
  124.  
  125. - Cambiare il valore dei MINTERMS (bit 0-7 di BLTCON0) per indicare una copia
  126.   dal canale che volete usare al canale D.
  127.   Per copiare dal canale B al D il valore giusto e` $CC, mentre per la copia
  128.   da C a D e` $AA.
  129.  
  130. - Scrivere l'indirizzo di partenza dei dati da copiare invece che nel puntatore
  131.   al canale A (BLTAPT) nel puntatore al canale che volete usare. Gli indirizzi
  132.   dei registri BLTBPT e BLTCPT sono riportati nella lezione.
  133.  
  134.