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

  1.  
  2. ; Lezione9a1.s - AZZERAMENTO DI $10 words tramite il BLITTER
  3. ; Prima di vedere questo esempio, date un'occhiata a LEZIONE2f.s dove viene
  4. ; cancellata memoria con il 68000
  5.  
  6.     SECTION Blit,CODE
  7.  
  8. Inizio:
  9.     move.l    4.w,a6        ; Execbase in a6
  10.     jsr    -$78(a6)    ; Disable - ferma il multitasking
  11.     lea    GfxName,a1    ; Indirizzo del nome della lib da aprire in a1
  12.     jsr    -$198(a6)    ; OpenLibrary
  13.     move.l    d0,a6        ; usa una routine della graphics library:
  14.  
  15.     jsr    -$1c8(a6)    ; OwnBlitter, che ci da l'esclusiva sul blitter
  16.                 ; impedendone l'uso al sistema operativo.
  17.  
  18.                 ; Prima di usare il blitter dobbiamo attendere
  19.                 ; che esso termini eventuali blittate in corso.
  20.                 ; Se ne occupano le istruzioni seguenti
  21.  
  22.     btst    #6,$dff002    ; attendi che il blitter finisca (test a vuoto)
  23.                 ; per il BUG di Agnus
  24. waitblit:
  25.     btst    #6,$dff002    ; blitter libero?
  26.     bne.s    waitblit
  27.  
  28. ; Ecco come fare una blittata!!! Solo 5 istruzioni per azzerare!!!
  29.  
  30. ;         __
  31. ;    __  /_/\   __
  32. ;    \/  \_\/  /\_\
  33. ;     __   __  \/_/   __
  34. ;    /\_\ /\_\  __   /\_\
  35. ;    \/_/ \/_/ /_/\  \/_/
  36. ;         __   \_\/
  37. ;        /\_\  __
  38. ;        \/_/  \/
  39.  
  40.     move.w    #$0100,$dff040     ; BLTCON0: solo DESTINAZIONE attivata
  41.                  ; i MINTERMS (cioe` i bits 0-7) sono tutti
  42.                  ; azzerati. In questo modo si definisce
  43.                  ; l'operazione di cancellazione
  44.  
  45.     move.w    #$0000,$dff042     ; BLTCON1: questo registro lo spiegheremo dopo
  46.     move.l    #START,$dff054     ; BLTDPT: Indirizzo del canale di destinazione
  47.     move.w    #$0000,$dff066     ; BLTDMOD: questo registro lo spiegheremo dopo
  48.     move.w    #(1*64)+$10,$dff058 ; BLTSIZE: definisce le dimensioni del
  49.                     ; rettangolo. In questo caso abbiamo
  50.                     ; larghezza $10 words e altezza 1 riga.
  51.                     ; Poiche` l'altezza del rettangolo va
  52.                     ; scritta nei bit 6-15 di BLTSIZE
  53.                     ; dobbiamo shiftarla a sinistra di 6 bit.
  54.                     ; Cio` equivale a moltiplicarne il valore
  55.                     ; per 64. La larghezza viene espressa nei
  56.                     ; 6 bit bassi e pertanto non viene 
  57.                     ; modificata.
  58.                     ; Inoltre questa istruzione da inizio
  59.                     ; alla blittata
  60.  
  61.     btst    #6,$dff002    ; attendi che il blitter finisca (test a vuoto)
  62. waitblit2:
  63.     btst    #6,$dff002    ; blitter libero?
  64.     bne.s    waitblit2
  65.  
  66.     jsr    -$1ce(a6)    ; DisOwnBlitter, il sistema operativo ora
  67.                 ; puo' nuovamente usare il blitter
  68.     move.l    a6,a1        ; Base della libreria grafica da chiudere
  69.     move.l    4.w,a6
  70.     jsr    -$19e(a6)    ; Closelibrary - chiudo la graphics lib
  71.     jsr    -$7e(a6)    ; Enable - riabilita il Multitasking
  72.     rts
  73.  
  74. ******************************************************************************
  75.  
  76.     SECTION THE_DATA,DATA_C
  77.  
  78. ; notate che i dati che cancelliamo devono essere in memoria CHIP
  79. ; infatti il Blitter opera solo in memoria CHIP
  80.  
  81. START:
  82.     dcb.b    $20,$fe
  83. THEEND:
  84.     dc.b    'Qui non cancelliamo'
  85.  
  86.     even
  87.  
  88. GfxName:
  89.     dc.b    "graphics.library",0,0
  90.  
  91.     end
  92.  
  93. Questo esempio e' la versione per blitter del listato Lezione2f.s, in cui si
  94. azzeravano dei bytes tramite un loop di "clr.l (a0)+".
  95.  
  96. Come in quel caso, assemblate, senza Jumpare, e controllate con un "M START"
  97. che sotto tale label sono assemblati $20 bytes "$fe". A questo punto eseguite
  98. il listato, attivando, per la prima volta nel corso, il blitter, dopodiche'
  99. rifate "M START" e verificherete che tali bytes sono stati azzerati, fino alla
  100. label THEEND, infatti con un "N THEEND" troverete la scritta sempre al suo
  101. posto.
  102.  
  103. L'operazione di cancellazione richiede l'uso del solo canale D.
  104. Inoltre e` necessario azzerare tutti i MINTERMS. Pertanto il valore da caricare
  105. nel registro BLTCON0 e` $0100.
  106. Notate bene il valore che viene scritto nel registro BLTSIZE. Dobbiamo
  107. cancellare un rettangolo largo $10 words e alto una riga. Dobbiamo scrivere
  108. la larghezza nei bit 0-5 di BLTSIZE e l'altezza nei bit 6-15 sempre di BLTSIZE.
  109. Per scrivere l'altezza nei bit 6-15 possiamo quindi shiftarla a sinistra di
  110. 6 bit, il che equivale a moltiplicarla per 64. Dunque per scrivere le
  111. dimensioni del rettangolo da blittare nel registro BLTSIZE si usa la seguente
  112. formula:
  113.  
  114. Valore da scrivere in BLTSIZE = (ALTEZZA*64)+LARGHEZZA
  115.  
  116. Vi ricordo che la LARGHEZZA e` espressa in words.
  117.  
  118. NOTA: E' stata usata una funzione del sistema operativo che non abbiamo mai
  119. trattato prima, cioe' quella che impedisce l'uso del blitter al sistema
  120. operativo per evitare di usare il blitter quando anche il workbench lo usa.
  121. Per inibire e riattivare l'uso del blitter da parte del sistema operativo basta
  122. eseguire le apposite routines gia' pronte nel kickstart, piu' in particolare
  123. nella graphics.library: avendo in A6 il GFXBASE, bastera' eseguire un
  124.  
  125.     jsr    -$1c8(a6)    ; OwnBlitter, che ci da l'esclusiva sul blitter
  126.  
  127. Per garantirci che siamo i soli a cercare il blitter, mentre un
  128.  
  129.     jsr    -$1ce(a6)    ; DisOwnBlitter, il sistema operativo ora
  130.                 ; puo' nuovamente usare il blitter
  131.  
  132. sara' necessario prima di uscire dal programma per riattivare il workbench.
  133.  
  134. Dunque basta ricordarsi che quando usiamo il blitter nei nostri capolavori e'
  135. necessario aggiungere l'OwnBlitter all'inizio e il DisownBlitter alla fine,
  136. oltre al noto Disable ed Enable.
  137.  
  138.