*************************************************************************
* Nome: BLIT1.s								*
*									*
* Autore: Fabrizio Farenga						*
*									*
* Commento: Copia di un rettangolo di grafica di dimensioni variabili	*
*	    da uno shermo "Sorgente" ad uno "Destinazione".		*
*									*
* Versione: 1.0								*
*									*
* Ultimo aggiornamento: 17-Sep-92 | 14:40:45				*
*									*
* Bugs: Nessuno conosciuto						*
*									*
*************************************************************************


WIDTHS EQU 40			;Larghezza dello schermo sorgente
WIDTHD EQU 40			;Larghezza dello schermo destinazione
DIMX EQU 32			;Larghezza dell'area da trasferire.
DIMY EQU 32			;Altezza dell'area da trasferire.

;TUTTE LE MISURE SOVRASTANTI SONO ESPRESSE IN BYTES (PIXEL/8)


SORG EQU $60000			;Da dove prendere i dati.
DEST EQU $70000			;Dove trasferirli.

DMACONR	EQU   $DFF002	;Registri dei Chip Custom utilizzati dalla routine
BLTCON0	EQU   $DFF040
BLTCON1	EQU   $DFF042
BLTAFWM	EQU   $DFF044
BLTALWM	EQU   $DFF046
BLTAPT	EQU   $DFF050
BLTDPT	EQU   $DFF054
BLTSIZE	EQU   $DFF058
BLTAMOD	EQU   $DFF064
BLTDMOD	EQU   $DFF066

Start
	jsr	WaitBlit	;Attende che il Blitter sia libero.

	move.w	#%0000100111110000,BLTCON0
;		  |
;		  |
;Questi 16 bit rappresentano il valore che verra' immesso il BLTCON0 ed
;e' cosi' ripartito a cominciare da destra
;Bit 00-07 -> Minitermi=11110000 (copia del Canale A)
;Bit 08-11 -> Attivazione canali=1001 (A--D)
;Bit 12-15 -> Shifter=0000 (spostamento a destra di 0 pixel)

	move.w	#0,BLTCON1	;Azzera il BLTCON1 (modo linea spento).
	move.w	#$FFFF,BLTAFWM	;Mascheratura delle Word di sinistra tutta a 1.
				;In questo modo sono trasferite integralmente.
	move.w	#$FFFF,BLTALWM	;Mascheratura delle Word di destra tutta a 0.
				;In questo modo sono trasferite integralmente.
	move.l	#SORG,BLTAPT	;Punta il Canale A alla sorgente.
	move.l	#DEST,BLTDPT	;Punta il Canale D alla destinazione.
	move.w	#WIDTHS-((DIMX)/8),BLTAMOD	;modulo del Canale A
	move.w	#WIDTHD-((DIMX)/8),BLTDMOD	;Modulo del Canale D
	move.w	#(DIMY*64)!((DIMX)/16),BLTSIZE	;Dimensioni del Blitter
;		 |
;	         |
;L'altezza e' impostata secondo il valore di DIMY, mentre la larghezza e'
;basata sul valore di DIMX.

	rts

WaitBlit			;Routine che attende che il Blitter sia libero
	btst	#14,DMACONR	;Fa un controllo fittizio per evitare il BUG di
WaitBlitLoop			;alcuni vecchi AGNUS
	btst	#14,DMACONR	;Esegue il vero controllo.
	bne	WaitBlitLoop
	rts

