

; Paradroid´90    Piccy with Scroller
;-------------------------------------
; Written (C) 27/01/1991, 11:36 17  by Nekron.


************************* Library-Funktionen *********************

Execbase=	4		Basis-Adresse der Ex.Base
OldopenLib=	-408		Um später Gfx-Lib. zu öffnen

************************* Definitionen ***************************

BUFFERSIZE=	44*9		Größe des Scrollbuffers
SCREENSIZE=	40*56		Größe des Scroll-Bildschirmes
SCROLLPOS=	40*20		Position des Scrollers
MODULO1=	44		Modulo für Zeichenausgabe

TEST=		0		1 für Testversion
DEBUG=		0		1 für debugging!

************************* Hauptprogramm **************************

	INCDIR	"df1:"

	IFNE	TEST
	SECTION	P90_Intro,CODE_C
	ENDC

	IFNE	DEBUG
	OPT	d+
	ENDC

	IFEQ	TEST
	ORG	$4f000
	ENDC

Begin
	IFNE	TEST
	IFEQ	DEBUG
	movem.l	a0-a6/d0-d7,-(SP)	Rette die Register
	move.l	#Trapy,$0080.w		und veranlasse einen Trap
	trap	#0
	movem.l	(SP)+,a0-a6/d0-d7
	rts
	ENDC

Trapy
	move.l	(Execbase).w,a6	
	lea	GfxName,a1
	jsr	OldopenLib(a6)		Öffne die Graph.Lib.
	move.l	d0,Gfxbase		und merke die Basis
	ENDC
		
	bsr	Install
rloop
	cmpi.b	#10,$6(a6)		Warte auf R.Zeile #10
	bne	rloop
	bsr	Scrolly			Springe zum Scrolly
	clr.w	d0
	move.b	$bfec01,d0
	not.b	d0
	ror.b	#1,d0			Lese die Tastatur
	cmpi.b	#$50,d0			und überprüfe, ob nicht
	beq	nofast			F1 oder F2 gedrückt worden ist!
	cmpi.b	#$51,d0
	beq	fastmem

	IFEQ	TEST
	bra	rloop			Sonst wieder zum Anfang!
	ENDC

	IFNE	TEST
	btst	#6,$bfe001		Überprüfe ob Maus gedrückt
	bne	rloop
	bsr	Reset
	rte
	ENDC

nofast
	lea	$5400,a0
	move.w	#$600a,$168c(a0)
	move.w	#$600a,$16c8(a0)

fastmem
	move.w	#$7fff,$96(a6)
	move.w	#$7fff,$9a(a6)
	jmp	$5400

*******************
* Installierungen *
*******************

Install
	lea	$dff000,a6
	move.w	$02(a6),d0		Merke DMA und
	move.w	$1c(a6),d1		 Interrupt Register
	bset	#15,d0
	bset	#15,d1
	move.w	d0,OldDMACON
	move.w	d1,OldIRQENA

	move.w	#$7fff,$96(a6)		Lösche sie beide
	move.w	#$7fff,$9a(a6)
	
	lea	ScrollBuffer,a0
clrloop
	clr.w	(a0)+
	cmpa.l	#BufferEnd,a0		Lösche ScrollBuffer
	blo	clrloop

	lea	Screen2,a0
clrloop2
	clr.w	(a0)+
	cmpa.l	#Screen2End,a0		Lösche Bildschirm
	blo	clrloop2

	lea	Planes,a0
	move.l	#Piccy+128,d0
	moveq	#4-1,d1
ploop
	move.w	d0,6(a0)
	swap	d0			Installiere die Planes
	move.w	d0,2(a0)
	swap	d0
	add.w	#40,d0
	adda.w	#8,a0
	dbf	d1,ploop

	lea	Planes2,a0
	move.l	#Screen2,d0
	move.w	d0,6(a0)
	swap	d0
	move.w	d0,2(a0)
	swap	d0
	add.w	#40,d0
	move.w	d0,14(a0)
	swap	d0
	move.w	d0,10(a0)

	move.w	#%1000001111000000,$96(a6)
	move.l	#CopperList,$80(a6)
	clr.w	$88(a6)			Starte CopperList
	rts

*******************
* Ausgangszustand *
*******************

	IFNE	TEST
Reset
	move.w	OldDMACON,$96(a6)
	move.w	OldIRQENA,$9a(a6)	Setze alte Werte zurück
	move.l	Gfxbase,a5
	move.l	38(a5),$80(a6)
	clr.w	$88(a6)
	rts
	ENDC

*****************
* ScrollRoutine *
*****************

Scrolly
	subi.b	#1,Row
	bne	scroll2		Schon 8 Pixel gescrollt?
	move.b	#8,Row
	bsr	PrntChar	Ja,dann gib neues Zeichen aus!
scroll2
	bsr	Scroll
	bsr	OnScreen
	rts

PrntChar
	clr.l	d0
	clr.l	d1
	move.l	ScrollAdr,a0
	move.b	(a0)+,d0		Hohle nächstes Zeichen
	cmpi.b	#$ff,d0
	bne	prnt2
	move.l	#ScrollTx,ScrollAdr
	bra	PrntChar
prnt2
	move.l	a0,ScrollAdr
	lea	Font,a0
	lea	ScrollBuffer+42,a1
	subi.b	#$20,d0
	bpl	prnt3
	move.b	#0,d0			und gib es aus!
prnt3
	asl.w	#3,d0
	moveq	#8-1,d1
prntloop
	move.b	(a0,d0.w),(a1)
	adda.w	#1,a0
	adda.w	#MODULO1,a1
	dbf	d1,prntloop
	rts

Scroll
	move.w	#%1111100111110000,$40(a6)
	sf	$42(a6)
	st	$44(a6)
	st	$46(a6)
	move.l	#ScrollBuffer+2,$50(a6)		Scrolle Buffer
	move.l	#ScrollBuffer,$54(a6)
	sf	$64(a6)
	sf	$66(a6)
	move.w	#%0000001001010110,$58(a6)
blwait2
	btst	#14,$2(a6)
	bne	blwait2
	rts

OnScreen
	move.w	#%0000100111110000,$40(a6)
	sf	$42(a6)
	st	$44(a6)
	st	$46(a6)
	move.l	#ScrollBuffer,$50(a6)
	move.l	#Screen2+SCROLLPOS,$54(a6)	Gib Buffer aus!
	move.w	#4,$64(a6)
	sf	$66(a6)
	move.w	#%0000001000010100,$58(a6)
blwait
	btst	#14,$2(a6)
	bne	blwait
	rts

************************* Gfx and CopperL. ***********************

GfxName		dc.b	"graphics.library",0
		EVEN

Gfxbase		ds.l	1
OldDMACON	ds.w	1
OldIRQENA	ds.w	1
ScrollAdr	dc.l	ScrollTx
Row		dc.b	4
		EVEN


CopperList	dc.w	$008e,$2c81,$0090,$27c1
		dc.w	$0092,$0038,$0094,$00d0
		dc.w	$0102,$0000,$0104,$0000
		dc.w	$0108,$0078,$010a,$0078
		dc.w	$0100,$4200

Planes		dc.w	$00e0,$0000,$00e2,$0000
		dc.w	$00e4,$0000,$00e6,$0000
		dc.w	$00e8,$0000,$00ea,$0000
		dc.w	$00ec,$0000,$00ee,$0000

		dc.w	$0180,$0111,$0182,$0711
		dc.w	$0184,$0d55,$0186,$0111
		dc.w	$0188,$0531,$018a,$0753
		dc.w	$018c,$0973,$018e,$0b95
		dc.w	$0190,$0db5,$0192,$0ff5
		dc.w	$0194,$0335,$0196,$0557
		dc.w	$0198,$0779,$019a,$079b
		dc.w	$019c,$0bbd,$019e,$0fff

		dc.w	$f40f,$fffe

Planes2		dc.w	$00e0,$0000,$00e2,$0000
		dc.w	$00e4,$0000,$00e6,$0000
		dc.w	$0102,$0001,$0104,$0000
		dc.w	$0108,$0000,$010a,$0000
		dc.w	$0100,$2200

		dc.w	$0182,$0745,$0184,$0d45
		dc.w	$0186,$0f56
		dc.w	$0,$0b
		EVEN

ScrollBuffer	ds.b	BUFFERSIZE
BufferEnd
		EVEN

Screen2		ds.b	SCREENSIZE
Screen2End
		EVEN

************************* Daten etc. *****************************

Piccy		INCBIN	"Gfx/piccy.blit"
		EVEN

Font		INCBIN	"Gfx/FontObj"
		EVEN

ScrollTx	INCBIN	"Code/ScrollTx"
		dc.b	$ff
		EVEN


