home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Enigma Amiga Life 109
/
EnigmaAmiga109CD.iso
/
software
/
testi
/
corsoasm
/
sorgenti6
/
lezione10g1.s
< prev
next >
Wrap
Text File
|
1995-10-23
|
5KB
|
180 lines
; Lezione10g1.s BLITTATA, in cui disegnamo rettangoli a righe sullo schermo
; Tasto destro per eseguire la blittata, sinistro per uscire.
SECTION CiriCop,CODE
; Include "DaWorkBench.s" ; togliere il ; prima di salvare con "WO"
*****************************************************************************
include "startup1.s" ; Salva Copperlist Etc.
*****************************************************************************
;5432109876543210
DMASET EQU %1000001111000000 ; copper,bitplane,blitter DMA
START:
MOVE.L #BITPLANE1,d0 ; dove puntare
LEA BPLPOINTERS,A1 ; puntatori COP
MOVEQ #1-1,D1 ; numero di bitplanes
POINTBP:
move.w d0,6(a1)
swap d0
move.w d0,2(a1)
swap d0
ADD.L #40*256,d0 ; + lunghezza bitplane (qua e' alto 256 linee)
addq.w #8,a1
dbra d1,POINTBP
lea $dff000,a5 ; CUSTOM REGISTER in a5
MOVE.W #DMASET,$96(a5) ; DMACON - abilita bitplane, copper
move.l #COPPERLIST,$80(a5) ; Puntiamo la nostra COP
move.w d0,$88(a5) ; Facciamo partire la COP
move.w #0,$1fc(a5) ; Disattiva l'AGA
move.w #$c00,$106(a5) ; Disattiva l'AGA
move.w #$11,$10c(a5) ; Disattiva l'AGA
; parametri per routine di disegno
move.w #16,d0 ; X vertice superiore sinistro
move.w #10,d1 ; Y vertice superiore sinistro
move.w #48,d2 ; larghezza
move.w #20,d3 ; altezza
move.w #$aaaa,d4 ; "pattern" di disegno
bsr.s BlitRett ; esegui la routine di disegno
mouse1:
btst #2,$dff016 ; tasto destro del mouse premuto?
bne.s mouse1
; parametri per routine di disegno
move.w #64,d0 ; X vertice superiore sinistro
move.w #70,d1 ; Y vertice superiore sinistro
move.w #32,d2 ; larghezza
move.w #40,d3 ; altezza
move.w #$8FF1,d4 ; "pattern" di disegno
bsr.s BlitRett ; esegui la routine di disegno
mouse2:
btst #6,$bfe001 ; tasto sinistro del mouse premuto?
bne.s mouse2 ; se no, torna a mouse2:
rts
;****************************************************************************
; Questa routine disegna un rettangolo sullo schermo.
;
; D0 - coordinata X del vertice superiore sinistro
; D1 - coordinata Y del vertice superiore sinistro
; D2 - larghezza rettangolo in pixel
; D3 - altezza rettangolo
; D4 - "pattern" con cui disegnare un rettangolo
;****************************************************************************
; |\__/,| (`\
; |o o |__ _) )
; _.( T ) ` /
; n n._ ((_ `^--' /_< \
; <" _ }=- `` `-'(((/ (((/
; `" "
BlitRett:
btst #6,2(a5) ; dmaconr
WBlit1:
btst #6,2(a5) ; dmaconr - attendi che il blitter abbia finito
bne.s wblit1
; calcolo indirizzo di partenza del blitter
lea bitplane1,a1 ; indirizzo bitplane
mulu.w #40,d1 ; offset Y
add.l d1,a1 ; aggiungi ad indirizzo
lsr.w #3,d0 ; dividi per 8 la X
and.w #$fffe,d0 ; rendilo pari
add.w d0,a1 ; somma all'indirizzo del bitplane, trovando
; l'indirizzo giusto di destinazione
; calcolo modulo blitter
lsr.w #3,d2 ; dividi per 8 la larghezza
and.w #$fffe,d2 ; azzerro il bit 0 (rendo pari)
move.w #40,d5 ; larghezza schermo in bytes
sub.w d2,d5 ; modulo=larg. schermo-larg. rettangolo
; calcolo dimensione blittata
lsl.w #6,d3 ; altezza per 64
lsr.w #1,d2 ; larghezza in pixel diviso 16
; cioe` larghezza in words
or d2,d3 ; metti insieme le dimensioni
; carica i registri
move.l #$01f00000,$40(a5) ; BLTCON0 e BLTCON1
; usa SOLO il canale D
; LF=$F0 (copia da A a D)
; modo ascendente
move.w d4,$74(a5) ; BLTADAT
move.w d5,$66(a5) ; BLTDMOD
move.l a1,$54(a5) ; BLTDPT puntatore destinazione
move.w d3,$58(a5) ; BLTSIZE (via al blitter !)
rts
;****************************************************************************
SECTION GRAPHIC,DATA_C
COPPERLIST:
dc.w $8E,$2c81 ; DiwStrt
dc.w $90,$2cc1 ; DiwStop
dc.w $92,$38 ; DdfStart
dc.w $94,$d0 ; DdfStop
dc.w $102,0 ; BplCon1
dc.w $104,0 ; BplCon2
dc.w $108,0 ; Bpl1Mod
dc.w $10a,0 ; Bpl2Mod
dc.w $100,$1200 ; bplcon0 - 1 bitplane lowres
BPLPOINTERS:
dc.w $e0,$0000,$e2,$0000 ;primo bitplane
dc.w $0180,$000 ; color0
dc.w $0182,$aaa ; color1
dc.w $FFFF,$FFFE ; Fine della copperlist
;****************************************************************************
SECTION bitplane,BSS_C
BITPLANE1:
ds.b 40*256
;****************************************************************************
end
In questo esempio usiamo il blitter per disegnare dei rettangoli con un
"pattern", ovvero con un motivo grafico che si ripete.
Utilizziamo una routine parametrica, che traccia un rettangolo conoscendo le
coordinate del vertice superiore sinistro e le dimensioni (larghezza e altezza)
del rettangolo. Per semplificare la routine la larghezza e la posizione X
del vertice sono approssimate a multipli di 16.
Anche il "pattern" viene passato come parametro in un registro. In questo modo
con una sola routine possiamo tracciare tutti i "pattern" che vogliamo.
Il disegno viene realizzato mediante una blittata che prevede l'attivazione del
solo canale D, ma che copia il contenuto del registro BLTADAT in uscita.
Si deve utilizzare lo stesso valore di LF che si usa nella copia normale da A
a D, ma non si deve attivare il canale A. pertanto il valore da scrivere in
BLTCON0 e` $01F0, ovvero LF=$F0 (copia da A a D) e attivo il solo canale D.
Il valore del "pattern" che verra` copiato in uscita viene scritto nel registro
BLTADAT.