
; Listing5e.s	Halvering van een beeld door veranderen van Modulo-Registers

	Section	CIPenCOP,CODE
Begin:
	move.l	4.w,a6		; Execbase in a6
	jsr	-$78(a6)	; Disable - stop Multitasking
	lea	GfxName(PC),a1  
	jsr	-$198(a6)	
	move.l	d0,GfxBase	
	move.l	d0,a6
	move.l	$26(a6),OldCop	

;	POINTEN Naar onze BITPLANES
 
	MOVE.L	#PIC,d0		

	LEA	BPLPOINTERS,A1	
				
	MOVEQ	#2,D1		
				
POINTBP:
	move.w	d0,6(a1)	
	swap	d0		
	move.w	d0,2(a1)	
	swap	d0		
	ADD.L	#40*256,d0	
	addq.w	#8,a1		
				
	dbra	d1,POINTBP	

	move.l	#COPPERLIST,$dff080	; COP1LC - Pointer naar onze COP
	move.w	d0,$dff088		; COPJMP1 - Start 'm

	move.w	#0,$dff1fc		; FMODE - Deactiveert AGA
	move.w	#$c00,$dff106		; BPLCON3 - Deactiveert AGA

mouse:
	cmpi.b	#$ff,$dff006	; Zijn we op lijn 255?
	bne.s	mouse		; Zo niet, ga terug.

Frame:
	cmpi.b	#$fe,$dff006	; Zijn we op lijn 254? 
	bne.s	Frame		; Zo niet, ga terug.
Frame2:
	cmpi.b	#$fd,$dff006	; Zijn we op lijn 253?
	bne.s	Frame2		; Zo niet, ga terug.
Frame3:
	cmpi.b	#$fc,$dff006	; Zijn we op lijn 252?
	bne.s	Frame3		; Zo niet, ga terug.
Frame4:
	cmpi.b	#$fb,$dff006	; Zijn we op lijn 251?
	bne.s	Frame4		; Zo niet, ga terug.
	
	btst	#2,$dff016	; Als de rechtermuisknop is ingedrukt
	beq.s	NietBewegen	; Slaan we de routine over

	bsr.s	BeweegCopper	; Effect

NietBewegen:
	btst	#6,$bfe001	; linker Muisknop gedrukt?
	bne.s	mouse		; Zo niet, ga terug.

	move.l	OldCop(PC),$dff080	; COP1LC - Pointer naar Orginele-COP
	move.w	d0,$dff088		; COPJMP1 - Start'm

	move.l	4.w,a6
	jsr	-$7e(a6)	; Enable - Multitasking aan
	move.l	GfxBase(PC),a1	
	jsr	-$19e(a6)	; Closelibrary 
	rts

; DATA

GfxName:
	dc.b	"graphics.library",0,0	
GfxBase:		
	dc.l	0	
OldCop:		 
	dc.l	0

; Met deze routine trekken we 40 van de Modulo af,of tellen er 40 bij op
; om het beeld te laten 'krimpen' en weer 'uitzetten'. Ik heb de Labels
; hetzelfde gelaten om tijd te sparen. 

BeweegCopper:
	TST.B	OpNeer		; Moeten we naar boven of beneden?
	beq.w	GaOmlaag
	tst.w	MOD1		; Zijn we op de standaard waarde van de
				; Modulo? (0)
	beq.s	ZetOmlaag	
	sub.w	#40,MOD1       ; Zo ja, trek 40 van de Modulo af, zodat
			       ; 'uitzet'
	sub.w	#40,MOD2       ; Dat geldt ook voor modulo 2
	rts

ZetOmlaag:
	clr.b	OpNeer	
	rts

GaOmlaag:
	cmpi.w	#40*20,MOD1 ; Genoeg gehalveerd?
	beq.s	ZetOmhoog    
			    
	add.w	#40,MOD1    ; Zo ja, tel 40 bij de Modulo op, zodat
			    ; Het scherm 'krimpt'.
	add.w	#40,MOD2    ; Dat geldt ook voor modulo 2
	rts

ZetOmhoog:
	move.b	#$ff,OpNeer 
	rts			

;	Flag...

OpNeer:
	dc.b	0,0


	SECTION GRAPHIC,DATA_C


COPPERLIST:
	; Sprites uit
	dc.w	$120,$0000,$122,$0000,$124,$0000,$126,$0000,$128,$0000 
	dc.w	$12a,$0000,$12c,$0000,$12e,$0000,$130,$0000,$132,$0000
	dc.w	$134,$0000,$136,$0000,$138,$0000,$13a,$0000,$13c,$0000
	dc.w	$13e,$0000

	dc.w	$8e,$2c81	; DiwStrt (Registers met Standaardwaarden)
	dc.w	$90,$2cc1	; DiwStop
	dc.w	$92,$0038	; DdfStart
	dc.w	$94,$00d0	; DdfStop
	dc.w	$102,0		; BplCon1
	dc.w	$104,0		; BplCon2
	dc.w	$108		; Bpl1Mod

MOD1:
	dc.w	0		; Bpl1Mod
	dc.w	$10a
MOD2:
	DC.W	0		; Bpl2Mod

		    ; 5432109876543210  ; BPLCON0:
	dc.w	$100,%0011001000000000  ; Bits 13 en 12 aan!! (3 = %011)
					; 3 Bitplanes Lowres,geen Lace
BPLPOINTERS:
	dc.w $e0,$0000,$e2,$0000	;1e Bitplane - BPL0PT
	dc.w $e4,$0000,$e6,$0000	;2e Bitplane - BPL1PT
	dc.w $e8,$0000,$ea,$0000	;3e Bitplane - BPL2PT

	dc.w	$0180,$000	; Color0
	dc.w	$0182,$475	; Color1
	dc.w	$0184,$fff	; Color2
	dc.w	$0186,$ccc	; Color3
	dc.w	$0188,$999	; Color4
	dc.w	$018a,$232	; Color5
	dc.w	$018c,$777	; Color6
	dc.w	$018e,$444	; Color7
	dc.w	$FFFF,$FFFE	; Einde van de Copperlist

;	BEELD

	dcb.b	30*40,0	; Stukje schoonmaken
PIC:
	incbin	"amiga.320*256*3"	; hier laden we het beeld in RAW.

	dcb.b	30*40,0	; Stukje schoonmaken

	end

Als we helemaal 'zuiver' hadden willen werken, hadden we een wait onder
het beeld moeten zetten, dat de overvloedige bytes, die onder het plaatje
verschijnen, elimineren zou. Maar de hoofdzaak is dat u begrijpt hoe de
zaak met de modulo werkt. De routine wordt 1 maal elke 4 frames uitgevoerd,
om alles wat langzamer te laten verlopen.
