
 Include "equ.h"
 Include "impequ.h"

 SECTION degasc,CODE,PUBLIC
***************************************************
***						***
***************************************************
dumbentry:
	clr.l	d0
	rts

	dc.l	"IMPP"
	dc.w	200
	dc.l	0

table:	dc.l	0
	dc.l	name,special,check,degasc


* Degas
*
* the first 32k of the picture is in buff1
*
check:	move.l	table,a0
	move.l	buff1(a0),a1
	move.l	(a1),a1
	move.w	(a1),d0
	cmp.w	#$8000,d0
	bcs	never
	cmp.w	#$8003,d0
	bcc	never
;	move.l	fname(a0),a1
;cdgs2:	move.b	(a1)+,d0
;	beq	maybe
;	cmp.b	#'.',d0
;	bne	cdgs2
;	cmp.b	#'P',(a1)+
;	bne	maybe
;	cmp.b	#'C',(a1)+
;	bne	maybe
;	cmp.b	#'1',(a1)
;	bcs	maybe
;	cmp.b	#'3',(a1)
;	bhi	maybe
	moveq	#2,d0
irts:	rts
*
*
*
degasc:	move.l	table,a0
	move.l	f_openr(a0),a0
	jsr	(a0)
	beq	irts

	move.l	table,a0
	move.l	spclnum(a0),a0
	cmp.w	#1,(a0)
	beq	impobj
*
*
*
imppic:	move.l	table,a0
	move.l	p_open(a0),a0
	jsr	(a0)
	beq	irts

	bsr	getpicinfo

	move.l	table,a4
	move.l	cwptr(a4),a4		;ptr to window handle
	move.l	(a4),a4			;window handle
	move.l	(a4),a4			;ptr to window structure

	lea	pic,a0
	move.w	pc_Type(a0),pi_Type(a4)
	move.w	pc_SFreq(a0),pi_SFreq(a4)
	move.w	pc_SAngle(a0),pi_SAngle(a4)
	move.w	pc_SSpot(a0),pi_SSpot(a4)
	move.l	pc_SMap(a0),pi_SMap(a4)
	move.l	pc_SMap+4(a0),pi_SMap+4(a4)
	move.w	pc_XDpi(a0),pi_XDpi(a4)
	move.w	pc_YDpi(a0),pi_YDpi(a4)
	move.w	pc_W(a0),pi_W(a4)
	move.w	pc_H(a0),pi_H(a4)
	move.w	pc_Width(a0),pi_Width(a4)
	move.w	pc_BitPln(a0),pi_BitPln(a4)
	move.w	pc_Palet(a0),pi_Palet(a4)

	move.w	pi_Palet(a4),d1
	mulu	#pl_Sizeof,d1
	move.w	pi_Width(a4),d0
	mulu	pi_BitPln(a4),d0
	mulu	pi_H(a4),d0
	add.l	d1,d0

	clr.w	d1
	clr.w	d2
	move.l	table,a0
	move.l	m_alloc(a0),a0
	jsr	(a0)
	beq	abortpic

	move.l	table,a3
	move.l	cwptr(a3),a3
	move.l	(a3),a3
	move.l	(a3),a3
	move.l	a0,pi_Ptr(a3)
	move.l	(a0),a4
	move.l	a4,picptr

	bsr	putcolor
	bsr	putpic

	move.l	table,a0
	move.l	p_close(a0),a0
	jsr	(a0)

	move.l	table,a0
	move.l	f_closer(a0),a0
	jmp	(a0)

abortpic:
	move.l	table,a0
	move.l	p_abort(a0),a0
	jsr	(a0)

	move.l	table,a0
	move.l	f_closer(a0),a0
	jmp	(a0)

*
*
*
impobj:	move.l	table,a0
	move.l	o_open(a0),a0
	jsr	(a0)
	beq	irts

	bsr	getpicinfo

	move.b	#tpic,object+ob_Type
	clr.l	object+ob_Left
	clr.l	object+ob_Top

	move.w	pic+pc_W,d1
	move.l	#7200,d0
	bsr	Mulu1632
	move.w	pic+pc_XDpi,d2
	bsr	Divu1648
	move.l	d0,object+ob_Right

	move.w	pic+pc_H,d1
	move.l	#7200,d0
	bsr	Mulu1632
	move.w	pic+pc_YDpi,d2
	bsr	Divu1648
	move.l	d0,object+ob_Bottom

	clr.b	object+ob_Flag
	clr.w	object+ob_Slant
	clr.w	object+ob_Twist
	move.w	#50,object+ob_LWidth		;1 point line
	clr.b	object+ob_LType			;no line
	move.b	#1,object+ob_LColor		;black line
	clr.b	object+ob_FType			;no fill
	move.b	#1,object+ob_FColor		;black fill
	clr.b	object+ob_LBegin
	clr.b	object+ob_LEnd
	move.w	#900,object+ob_HStandOff	;1/8 inch
	move.w	#900,object+ob_VStandOff	;1/8 inch
*
*
	move.l	table,a1
	move.l	o_obj(a1),a1
	lea	object,a0
	jsr	(a1)
	beq	abortobj

	move.w	pic+pc_Width,d0
	mulu	pic+pc_BitPln,d0
	mulu	pic+pc_H,d0
	move.w	pic+pc_Palet,d1
	mulu	#pl_Sizeof,d1
	add.l	d1,d0
	add.l	#pc_Sizeof,d0

	move.l	table,a0
	move.l	o_malloc(a0),a0
	jsr	(a0)
	beq	abortobj

	lea	pic,a1
	clr.l	pc_DPtr(a1)
	clr.w	pc_DScale(a1)
	move.w	pc_Palet(a1),d0
	mulu	#pl_Sizeof,d0
	add.l	#pc_Sizeof,d0
	move.l	d0,pc_Ptr(a1)

	move.w	#pc_Sizeof/2-1,d0
oppic1:	move.w	(a1)+,(a0)+
	dbf	d0,oppic1
	move.l	a0,picptr

	bsr	putcolor
	bsr	putpic

	move.l	table,a0		;end of input file.
	move.l	o_close(a0),a0		; close and flush buffer
	jsr	(a0)

	move.l	table,a0
	move.l	f_closer(a0),a0
	jmp	(a0)


abortobj:
	move.l	table,a0		;end of input file.
	move.l	o_abort(a0),a0		; close and flush buffer
	jsr	(a0)

	move.l	table,a0
	move.l	f_closer(a0),a0
	jmp	(a0)

*
*
*
getpicinfo:
	move.l	table,a0
	move.l	f_getw(a0),a0
	jsr	(a0)

	bclr	#15,d0
	lea	dgstbl,a0
	lsl.w	#2,d0
	move.l	0(a0,d0.w),a0

	lea	pic,a4

	move.w	(a0)+,pc_Palet(a4)	;number of color pallet entries
	move.w	(a0)+,pc_BitPln(a4)
	move.w	(a0)+,pc_W(a4)
	move.w	(a0)+,pc_H(a4)
	move.w	(a0)+,pc_Width(a4)
	move.w	(a0)+,pc_XDpi(a4)
	move.w	(a0),pc_YDpi(a4)

	clr.w	pc_Type(a4)
	move.w	#-1,pc_SFreq(a4)
	move.w	#-1,pc_SAngle(a4)
	clr.w	pc_SSpot(a4)
	clr.l	pc_SMap(a4)
	clr.l	pc_SMap+4(a4)
	rts


putcolor:
	move.w	pic+pc_Palet,temp1		;# of colors in bit map
dgsp2:	move.l	table,a0
	move.l	f_getw(a0),a0
	jsr	(a0)

	move.w	d0,d1
	move.w	d0,d2
	lsr.w	#8,d0
	lsr.w	#4,d1
	and.w	#%111,d0		;red
	and.w	#%111,d1		;green
	and.w	#%111,d2		;blue
	mulu	#65535,d0
	mulu	#65535,d1
	mulu	#65535,d2
	divu	#7,d0
	divu	#7,d1
	divu	#7,d2

	move.l	picptr,a4
	move.w	d0,(a4)+		;red
	move.w	d1,(a4)+		;green
	move.w	d2,(a4)+		;blue

	mulu	#19661,d0
	mulu	#38666,d1
	mulu	#7209,d2
	add.l	d1,d0
	add.l	d2,d0
	swap	d0
	cmp.w	#$8000,d0
	bcc	pcwhite
	moveq	#1,d0
	bra	pcblack
pcwhite:
	moveq	#0,d0
pcblack:
	move.w	d0,(a4)+
	move.l	a4,picptr

	subq.w	#1,temp1
	bne	dgsp2

	move.l	#16,d0			;skip over unused color pallete entries
	sub.w	pic+pc_Palet,d0
	lsl.w	#1,d0
	move.l	table,a0
	move.l	f_skip(a0),a0
	jmp	(a0)
*
*

putpic:
	move.w	pic+pc_Width,d0
	mulu	pic+pc_H,d0
	move.l	d0,plane

dgsuc1:	move.l	picptr,tpptr
	move.w	pic+pc_BitPln,temp2		;do for each bitplane

dgsuc2:	move.w	pic+pc_Width,temp3
	move.l	tpptr,a0
	clr.w	rlecnt			;current rle count

dgsuc3:	move.l	a0,-(sp)
	jsr	getnext
	move.l	(sp)+,a0
	move.b	d0,(a0)+
	subq.w	#1,temp3		;next byte in row
	bne	dgsuc3

	move.l	plane,d0
	add.l	d0,tpptr
	subq.w	#1,temp2
	bne	dgsuc2			;next bitplane row

	move.l	picptr,a0
	add.w	pic+pc_Width,a0		;width
	move.l	a0,picptr
	subq.w	#1,pic+pc_H
	bne	dgsuc1			;next row
	rts
*
*
*
* Degas Compressed getnext byte from run length encoded picture
*
*
getnext:
	subq.w	#1,rlecnt
	bcc	more
gn1:	clr.w	rlecmd			;uncompressed
	move.l	table,a0
	move.l	f_get(a0),a0
	jsr	(a0)
	and.w	#$ff,d0
	tst.b	d0
	bpl	gn2			;the next bytes are not repeats
	cmp.b	#-128,d0
	beq	gn1
	neg.b	d0
	move.w	d0,rlecnt		;repeat count
	move.w	#1,rlecmd		;repeat command
	move.l	table,a0
	move.l	f_get(a0),a0
	jsr	(a0)
	move.b	d0,rlerep
	rts

gn2:	move.w	d0,rlecnt		;we should add one to d2, but the dbf
more:	tst.w	rlecmd			;will take care of that for us.
	bne	rle
	move.l	table,a0
	move.l	f_get(a0),a0
	jmp	(a0)

rle:	move.b	rlerep,d0
	rts


Mulu1632:
	move.l	table,a0
	move.l	mulu1632(a0),a0
	jmp	(a0)

Divu1648:
	move.l	table,a0
	move.l	divu1648(a0),a0
	jmp	(a0)

*******************************************************************
***	called when the import routine choosen finds something	***
***	wrong with the file loaded.				***
*******************************************************************
notright:
	rts

never:	moveq	#0,d0
	rts

maybe:	moveq	#1,d0
	rts

right:	moveq	#2,d0
	rts

*************************************************************
*************************************************************

 SECTION degasc,DATA,PUBLIC
dgstbl:	dc.l	dgslow,dgsmed,dgshi
dgslow:	dc.w	16,4,320,200,40,36,36
dgsmed:	dc.w	4,2,640,200,80,72,36
dgshi:	dc.w	2,1,640,400,80,77,77


special:
	dc.w	2
	dc.l	spcl1,spcl2

*
*
*
name:	dc.b	"Degas Compressed v2.1.0",0

spcl1:	dc.b	"Picture Window",0
spcl2:	dc.b	"Object",0

*
 SECTION degasc,BSS,PUBLIC
*
temp1:	ds.w	1
temp2:	ds.w	1
temp3:	ds.w	1


rlecmd:	ds.w	1
rlecnt:	ds.w	1
rlerep:	ds.b	1
	ds.b	1

plane:	ds.l	1
tpptr:	ds.l	1
picptr:	ds.l	1

object:	ds.w	ob_SizeOf/2
pic:	ds.w	pc_Sizeof/2
