*************************************************************************
* Nome: PLAYFIELD1.s							*
*									*
* Autore: Fabrizio Farenga						*
*									*
* Commento: Attiva e visualizza 3 bitplane (8 colori) mostrando delle	*
*	    barre verticali sfumate.					*
*									*
* Versione: 1.0								*
*									*
* Ultimo aggiornamento: 6-Apr-93 | 12:10				*
*									*
* Bugs: Nessuno conosciuto						*
*									*
*************************************************************************

DMACONR:	EQU   $DFF002	;Registri dei Chip Custom utilizzati dal
VHPOSR:		EQU   $DFF006	;programma.
COP1LC:		EQU   $DFF080
DMACON:		EQU   $DFF096


CALLEXEC:	MACRO			;Macro di chiamata per le routine
	MOVE.L	[_SysBase].W,A6		;dell'Exec.
	JSR	_LVO\1(A6)
	ENDM


	SECTION Playfield,Code

_SysBase=4			;EXECBASE.

_LVODisable	=	-120 	;Routine dell'EXEC utilizzate dal programma.
_LVOEnable	=	-126 
_LVOAllocMem	=	-198 
_LVOFreeMem	=	-210 
_LVOOpenLibrary	=	-552 

MEMF_CHIP:	EQU 2		;Flag di definizione del tipo di Memoria.
MEMF_CLEAR:	EQU $10000

CIAAPRA:	EQU   $BFE001	;Registro del CIAA utilizzato dal programma.

Start:
	lea	GFXName,a1	;Apre la 'graphics.library'.
	moveq	#0,d0
	CALLEXEC OpenLibrary
	move.l	d0,GFXBase

	move.l	d0,a0		;Memorizza in OLDCOP l'indirizzo della
	move.l	$26(a0),OldCop	;Copperlist del Sistema Operativo.

	move.l	#$1F40*3,d0			;Tenta di allocare la memoria
	move.l	#MEMF_CHIP!MEMF_CLEAR,d1	;necessaria per uno schermo
	CALLEXEC AllocMem			;320x200 a 3 bitplane.
	move.l	d0,Screen
	beq	ErrorExit	;Se non c'e' abbastanza memoria esci.

	CALLEXEC Disable	;Disabilita il Sistema Operativo.

	move.l	Screen,d0	;Punta il primo bitplane della nostra
	move.w	d0,BPL1L	;Copperlist al primo bitplane dello schermo che
	swap	d0		;abbiamo allocato.
	move.w	d0,BPL1H

	move.l	Screen,d0	;Punta il secondo bitplane della nostra
	add.l	#$1F40,d0	;Copperlist al secondo bitplane dello schermo
	move.w	d0,BPL2L	;che abbiamo allocato.
	swap	d0
	move.w	d0,BPL2H

	move.l	Screen,d0	;Punta il terzo bitplane della nostra
	add.l	#$1F40*2,d0	;Copperlist al terzo bitplane dello schermo che
	move.w	d0,BPL3L	;abbiamo allocato.
	swap	d0
	move.w	d0,BPL3H

	move.w	#$1F39,d0	;Disegna il primo bitplane.
	move.l	Screen,a0
FillScreenLoop:
	move.b	#$55,(a0,d0)
	dbf	d0,FillScreenLoop

	move.w	#$1F39,d0	;Disegna il secondo bitplane.
	move.l	Screen,a0
	add.l	#$1F40,a0
FillScreenLoop2:
	move.b	#$33,(a0,d0)
	dbf	d0,FillScreenLoop2

	move.w	#$1F39,d0	;Disegna il terzo bitplane.
	move.l	Screen,a0
	add.l	#$1F40*2,a0
FillScreenLoop3:
	move.b	#$0f,(a0,d0)
	dbf	d0,FillScreenLoop3

	move.w	#$0020,DMACON	;Spegne gli Sprite.
	move.l	#CopList,COP1LC	;Attiva la nostra CopperList.

WaitLoop:
	btst	#6,CIAAPRA	;Se il tasto sinistro del Mouse e' premuto
	bne	WaitLoop	;esce.

Exit:				;Routine di uscita.
	move.l	OldCop,COP1LC	;Rimette a posto la CopperList del S.O.
	move.w	#$8020,DMACON	;Riattiva gli sprite.
	CALLEXEC Enable		;Riattiva il Sistema Operativo.
	jsr	FreeMem		;Libera la memoria allocata.
ErrorExit:
	moveq	#0,d0
	rts

;*************************************

FreeMem:			;Routine che libera la memoria allocata.
	move.l	Screen,a1
	move.l	#$1F40,d0
	CALLEXEC FreeMem
	rts

;*************************

	dc.b 0,'$VER: PLAYFIELD1.EXE 1.0 (7.4.93)',0	;Versione

;*************************

	SECTION PlayfieldChipData,DATA_C

CopList:
	dc.w $0100,$0200		;Spegne tutti i bitplane.
	dc.w $0180,$0000,$0182,$0200	;Inizializza gli otto colori dei
	dc.w $0184,$0400,$0186,$0600	;tre bitplane.
	dc.w $0188,$0800,$018A,$0A00
	dc.w $018C,$0C00,$018E,$0E00
	dc.w $008E,$2C81,$0090,$F4C1	;Dimensioni dello schermo.
	dc.w $0092,$0038,$0094,$00D0	;Data fetch.
	dc.w $3001,$fffe,$00E0		;Aspetta la riga $30 dello schermo.
BPL1H:
	dc.w $0000,$00E2		;Word alta del primo bitplane.
BPL1L:
	dc.w $0000,$00E4		;Word bassa del primo bitplane.
BPL2H:
	dc.w $0000,$00E6		;Word alta del secondo bitplane.
BPL2L:
	dc.w $0000,$00E8		;Word bassa del secondo bitplane.
BPL3H:
	dc.w $0000,$00Ea		;Word alta del terzo bitplane.
BPL3L:
	dc.w $0000			;Word bassa del terzo bitplane.
	dc.w $0108,$0000,$010A,$0000	;Moduli dei due bitplane.
	dc.w $3101,$FFFE,$0100,$3200	;Aspetta la riga $31 e accende
					;i tre bitplane.
	dc.w $FF01,$FFFE,$0100,$0200	;Aspetta la riga $FF e spegne tutti
					;i bitplane.
	dc.w $FFFF,$FFFE		;Fine della copperlist.

	SECTION PlayfiledData,DATA

Screen:		dc.l 0		;Puntatore alla memoria per lo schermo
GFXBase:	dc.l 0		;Puntatore alla Base della 'graphics.library'
OldCop:		dc.l 0		;Puntatore alla Copperlist del S.O.
GFXName:	dc.b 'graphics.library',0	;Nome della libreria
		CNOP 0,2
