;
; LoadScreen-routine
;
; Deze 'slordig'-geprogrammeerde routine ondersteunt AmigaBasic met het
; binnenladen van een tekening. Er zijn een aantal beperkingen zodat slechts
; een bepaalde maat tekening gelezen kan worden.
;
; De maat van het scherm is 5 bitplanes, 320 bij 256.
;
; Er zijn kleine veranderingen mogelijk :
;
; De breedte (320) kan veranderd worden door de variabele BREEDTE een
; andere waarde te geven. Deze staat achterin de source. De waarde moet
; de breedte/8 zijn. 320/8=40.
;
; De hoogte (256) kan veranderd worden door een regel te veranderen. Deze
; staat achter het label HHH. Er staat CMP.L #256,D3. De 256 is het aantal
; regels.
;
; Het programma kan met SEKA geassembleerd worden.
;
; De aanroep vanuit AmigaBasic is :
;
; Routine SADD("Naam"+CHR$(0)),WINDOW(7)
;
; (C) 1988 Courbois Software Beuningen
;

ExecBase=	4
LoadRGB=	-192
AllocMem=	-198
FreeMem=	-210
Open=		-30
Close=		-36
Read=		-42
OpenLib=	-552
CloseLib=	-414

Start:	movem.l	d0-d7/a0-a6,-(sp)	;alles naar de stack

Aloc:	move.l	Lengte,d0		;aantal bytes
	move	#$02,d1			;chip_mem
	move.l	ExecBase,a6
	jsr	AllocMem(a6)		;geheugen alloceren
	move.l	d0,adress		;plaats van geheugen
	beq	error1			;exit routine

OpenL:	move.l	ExecBase,a6		;open de dos.library
	lea 	DosName,a1
	moveq	#0,d0
	jsr	OpenLib(a6)		;dos.library openen
	move.l	d0,DosBase
	beq	error2			;exit plus freemem

OpenF:	move.l	#1005,d2		;oud file openen
	move.l	DosBase,a6		;begin file openen
	move.l	64(sp),d1		;naam-pointer van Basic
	jsr	Open(a6)		;open tekening
	move.l	d0,FileHD
	beq	error3			;exit plus freemem closelib

ReadF:	move.l	adress,d2		;plaats van buffer
	move.l	DosBase,a6
	move.l	FileHD,d1
	move.l	Lengte,d3		;aantal bytes lezen
	jsr	Read(a6)		;lezen file

CloseF:	move.l	DosBase,a6		;sluiten van het file
	move.l	FileHD,d1
	jsr	Close(a6)		;close

DePack:	move.l	adress,a0		;plaats van gepacked plaatje
	add.l	#12,a0
	move.l	a0,bmhdchunk		;BMHD Chunk
	move.l	4(a0),d0
	add.l	d0,a0
	add.l	#8,a0
	move.l	a0,cmapchunk		;CMAP Chunk

BIT11:	move.l	4(a0),d0		;Zoeken naar BODY
	add.l	d0,a0
	add.l	#8,a0
	move.l	#'BODY',d1
	cmp.l	(a0),d1
	bne	BIT11
	move.l	a0,bodychunk		;BODY Chunk gevonden
	add.l	#4,a0
	move.l	(a0),aantal		;aantal Bytes
	add.l	#1,aantal
	and.l	#$fffffffe,aantal
	add.l	#4,a0			;First Byte in A0

BitF:	move.l	68(sp),a1		;WINDOW(7)
	add.l	#46,a1
	move.l	(a1),plane
	add.l	#88,plane
	move.l	plane,a1
	move.l	(a1),plane
	add.l	#8,plane
	move.l	plane,a1
	move.l	(a1),plane1		;bitplane 1 adres
	add.l	#4,a1
	move.l	(a1),plane2
	add.l	#4,a1
	move.l	(a1),plane3
	add.l	#4,a1
	move.l	(a1),plane4
	add.l	#4,a1
	move.l	(a1),plane5		;bitplane 5 adres

	clr.l	d3

BIT10:	clr.l	d2
	move.l	plane1,a1		;plaats van un-packed map0
BIT13:	move.b	(a0)+,teller
	clr.l	d5
	move.b	teller,d5
	and.b	#$80,d5			;gepacked ?
	bne	BIT14
	clr.l	d4
	move.b	teller,d4
BIT15:	move.b	(a0)+,(a1)+		;verplaats ongepacked
	add.l	#1,d2
	dbf	d4,BIT15
	sub.l	#1,a0
	bra	BIT16
BIT14:	neg.b	teller
	clr.l	d0
	move.b	teller,d0
BIT12:	move.b	(a0),(a1)+		;verplaats en unpack
	add.l	#1,d2
	dbf	d0,BIT12
BIT16:	add.l	#1,a0
	clr.l	d1
	move.l	Breed,d1		;test op breedte
	cmp.l	d2,d1
	beq	BIT17
	bra	BIT13
BIT17:	move.l	a1,plane1		;redden bit-plane-pointer

BIT20:	clr.l	d2			;next plane
	move.l	plane2,a1		;plaats van un-packed plaatje
BIT23:	move.b	(a0)+,teller
	clr.l	d5
	move.b	teller,d5
	and.b	#$80,d5
	bne	BIT24
	clr.l	d4
	move.b	teller,d4
BIT25:	move.b	(a0)+,(a1)+		;verplaats
	add.l	#1,d2
	dbf	d4,BIT25
	sub.l	#1,a0
	bra	BIT26
BIT24:	neg.b	teller
	clr.l	d0
	move.b	teller,d0
BIT22:	move.b	(a0),(a1)+		;verplaats en unpack
	add.l	#1,d2
	dbf	d0,BIT22
BIT26:	add.l	#1,a0
	clr.l	d1
	move.l	Breed,d1
	cmp.l	d2,d1
	beq	BIT27
	bra	BIT23
BIT27:	move.l	a1,plane2

BIT30:	clr.l	d2
	move.l	plane3,a1		;plaats van un-packed plaatje
BIT33:	move.b	(a0)+,teller
	clr.l	d5
	move.b	teller,d5
	and.b	#$80,d5
	bne	BIT34
	clr.l	d4
	move.b	teller,d4
BIT35:	move.b	(a0)+,(a1)+		;verplaats
	add.l	#1,d2
	dbf	d4,BIT35
	sub.l	#1,a0
	bra	BIT36
BIT34:	neg.b	teller
	clr.l	d0
	move.b	teller,d0
BIT32:	move.b	(a0),(a1)+		;verplaats en unpack
	add.l	#1,d2
	dbf	d0,BIT32
BIT36:	add.l	#1,a0
	clr.l	d1
	move.l	Breed,d1
	cmp.l	d2,d1
	beq	BIT37
	bra	BIT33
BIT37:	move.l	a1,plane3

BIT40:	clr.l	d2
	move.l	plane4,a1		;plaats van un-packed plaatje
BIT43:	move.b	(a0)+,teller
	clr.l	d5
	move.b	teller,d5
	and.b	#$80,d5
	bne	BIT44
	clr.l	d4
	move.b	teller,d4
BIT45:	move.b	(a0)+,(a1)+		;verplaats
	add.l	#1,d2
	dbf	d4,BIT45
	sub.l	#1,a0
	bra	BIT46
BIT44:	neg.b	teller
	clr.l	d0
	move.b	teller,d0
BIT42:	move.b	(a0),(a1)+		;verplaats en unpack
	add.l	#1,d2
	dbf	d0,BIT42
BIT46:	add.l	#1,a0
	clr.l	d1
	move.l	Breed,d1
	cmp.l	d2,d1
	beq	BIT47
	bra	BIT43
BIT47:	move.l	a1,plane4

BIT50:	clr.l	d2
	move.l	plane5,a1		;plaats van un-packed plaatje
BIT53:	move.b	(a0)+,teller
	clr.l	d5
	move.b	teller,d5
	and.b	#$80,d5
	bne	BIT54
	clr.l	d4
	move.b	teller,d4
BIT55:	move.b	(a0)+,(a1)+		;verplaats
	add.l	#1,d2
	dbf	d4,BIT55
	sub.l	#1,a0
	bra	BIT56
BIT54:	neg.b	teller
	clr.l	d0
	move.b	teller,d0
BIT52:	move.b	(a0),(a1)+		;verplaats en unpack
	add.l	#1,d2
	dbf	d0,BIT52
BIT56:	add.l	#1,a0
	clr.l	d1
	move.l	Breed,d1
	cmp.l	d2,d1
	beq	BIT57
	bra	BIT53
BIT57:	move.l	a1,plane5
	add.l	#1,d3
HHH:	cmp.l	#256,d3
	beq	BIT99
	bra	BIT10

BIT99:	move.l	cmapchunk,a0
	add.l	#8,a0
	lea	KleurenBuffer,a1
	move.w	#31,d7
KleurL:	clr.w	d0
	move.b	(a0)+,d0
	and.b	#$F0,d0
	lsl.w	#4,d0
	move.b	(a0)+,d0
	and.w	#$0FF0,d0
	clr.w	d1
	move.b	(a0)+,d1
	lsr.b	#4,d1
	and.b	#$0F,d1
	or.b	d1,d0
	move.w	d0,(a1)+
	dbra	d7,KleurL

Kleur:	move.l	ExecBase,a6		;open de gfx.library
	lea 	GfxName,a1
	moveq	#0,d0
	jsr	OpenLib(a6)		;gfx.library openen
	move.l	d0,GfxBase
	move.l	68(sp),a0		;WINDOW(7)->Viewport
	move.l	46(a0),a0
	add.l	#44,a0			;viewport
	lea	KleurenBuffer,a1
	move.w	#32,d0
	move.l	GFXBase,a6
	jsr	LoadRGB(a6)
	move.l	ExecBase,a6		;sluiten gfx.lib
	move.l	GfxBase,a1
	jsr	CloseLib(a6)
error3:	move.l	ExecBase,a6		;sluiten dos.lib
	move.l	DosBase,a1
	jsr	CloseLib(a6)
error2:	move.l	Lengte,d0		;geheugen teruggeven
	move.l	adress,a1
	move.l	ExecBase,a6
	jsr	FreeMem(a6)
error1:	movem.l	(sp)+,d0-d7/a0-a6	;stack terug
	rts

even
bmhdchunk:	dc.l	0		;BMHD plaats
cmapchunk:	dc.l	0,0		;CMAP plaats
bodychunk:	dc.l	0		;BODY plaats
aantal:		dc.l	0		;Aantal bytes in gepacked plaatje
breed:		dc.l	40		;Breedte tekening
adress:		dc.l	0		;Plaats van gepacked plaatje
DosBase:	dc.l	0		;DOS-adres
GfxBase:	dc.l	0		;Graphics-adres
FileHD:		dc.l	0		;File-adres
Lengte:		dc.l	40000		;Lengte AllocMem-buffer
Plane:		dc.l	0		;Rekenadres voor bitplanes
Plane1:		dc.l	0		;Adres plane 1
Plane2:		dc.l	0
Plane3:		dc.l	0
Plane4:		dc.l	0
Plane5:		dc.l	0		;Adres plane 5
KleurenBuffer:	blk.w	32		;Kleurenbuffer.
teller:		dc.b	0		;Byte-teller
even
DosName:	dc.b	'dos.library',0	;Naam van dos.library
even
GfxName:	dc.b	'graphics.library',0
even
Copyright:	dc.b	'(C) 1988 bij Courbois Software Beuningen',0
even
