*************************************************************************
* Nome: PLAYFIELD2.s							*
*									*
* Autore: Fabrizio Farenga						*
*									*
* Commento: Fa scivolare un bitplane in sovraimpressione ad un altro	*
*	    usando la modalita' Double Playfiled.			*
*									*
* Versione: 1.0								*
*									*
* Ultimo aggiornamento: 7-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*2,d0			;Tenta di allocare la memoria
	move.l	#MEMF_CHIP!MEMF_CLEAR,d1	;necessaria per due schermi
	CALLEXEC AllocMem			;320x200 a 1 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 schermo 320x200.
	swap	d0
	move.w	d0,BPL1H

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

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

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

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

WaitLoopB:
	move.w	#20,d0		;Aspetta 20 cinquantesimi di secondo.
WaitLoop:
	cmp.b	#$ff,VHPOSR
	bne	Waitloop
	dbf	d0,WaitLoop

	move.b	Shifter+1,d0	;Fai scorrere i bitplane pari.
	add.b	#$10,d0
	and.b	#$f0,d0
	move.b	d0,Shifter+1

	btst	#6,CIAAPRA	;Se il tasto sinistro del Mouse e' premuto
	bne	WaitLoopB	;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: PLAYFIELD.EXE 1.0 (6.4.93)',0	;Versione

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

	SECTION PlayfieldChipData,DATA_C

CopList:
	dc.w $0100,$0200		;Spegne tutti i bitplane.
	dc.w $0180,$0000,$0182,$0fff	;Colori del primo bitplane.
	dc.w $0190,$0000,$0192,$0888	;Colori del secondo bitplane.
	dc.w $008E,$2C91,$0090,$F4B1	;Dimensioni dello schermo.
	dc.w $0092,$0038,$0094,$00D0	;Data Fetch.
	dc.w $3001,$fffe,$00e0		;Aspetta la riga $30.
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			;Word bassa del secondo bitplane.

	dc.w $0108,$0000,$010a,$0000	;Moduli dei due bitplane.

	dc.w $0104,$0000,$0102		;Priorita' dei due bitplane.
Shifter:
	dc.w $0000			;Shifter dei due bitplane
	dc.w $3101,$fffe,$0100,$2600	;Aspetta la riga $31 e accende i
					;bitplane.
	dc.w $ff01,$fffe,$0100,$0200	;Aspetta la riga $FF e spegne i
					;due 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
