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

 SECTION img,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,img

*
* IMG bit image file format
*
* the first 32k of the image is in buff1
*
check:	move.l	table,a0
	move.l	buff1(a0),a1
	move.l	(a1),a1
	cmp.w	#1,(a1)+
	bne	never
	cmp.w	#8,(a1)
	bne	never

;	move.l	fname(a0),a1
;cimg2:	move.b	(a1)+,d0
;	beq	maybe
;	cmp.b	#'.',d0
;	bne	cimg2
;	cmp.b	#'I',(a1)+
;	bne	maybe
;	cmp.b	#'M',(a1)+
;	bne	maybe
;	cmp.b	#'G',(a1)
;	bne	maybe
	moveq	#2,d0			;it's a match
irts:	rts
*
*
*
***********************************************************
***							***
***********************************************************
img:	move.l	table,a0
	move.l	spclnum(a0),a0
	cmp.w	#1,(a0)
	beq	imgobj
*
*
imgpic:	bsr	getpicinfo

	move.l	table,a0
	move.l	p_open(a0),a0
	jsr	(a0)
	beq	irts

	move.l	table,a4
	move.l	cwptr(a4),a4
	move.l	(a4),a4
	move.l	(a4),a4

	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_Width(a4),d0
	mulu	pi_BitPln(a4),d0
	mulu	pi_H(a4),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	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)

***********************************************************
***							***
***********************************************************
imgobj:	bsr	getpicinfo

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

	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
	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.l	#pc_Sizeof,pc_Ptr(a1)

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

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

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

*
*
abortobj:
	move.l	table,a0
	move.l	o_abort(a0),a0
	jsr	(a0)

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


getpicinfo:
	move.l	table,a0
	move.l	f_openr(a0),a0
	jsr	(a0)
	beq	irts

	move.l	table,a1
	move.l	buff1(a1),a0
	move.l	(a0),a0
	move.l	#16,d0
	move.l	f_getr(a1),a1
	jsr	(a1)
	beq	irts

	move.l	table,a0
	move.l	buff1(a0),a0
	move.l	(a0),a0
	move.w	4(a0),pic+pc_BitPln
	move.w	6(a0),ptrn
	move.w	8(a0),pxw
	move.w	10(a0),pxh
	move.w	12(a0),d0
	move.w	d0,pic+pc_W
	add.w	#15,d0
	lsr.w	#3,d0
	bclr	#0,d0
	move.w	d0,pic+pc_Width
	move.w	14(a0),dheight
	move.w	dheight,pic+pc_H
	move.w	#PC_BW,pic+pc_Type
	move.w	#-1,pic+pc_SFreq	;default frequency
	move.w	#-1,pic+pc_SAngle	;default angle
	clr.w	pic+pc_SSpot
	clr.l	pic+pc_SMap
	clr.l	pic+pc_SMap+4

	clr.w	pic+pc_Palet		;number of color pallet entries

	move.l	#25500,d0
	divu	pxw,d0
	move.w	d0,pic+pc_XDpi		;x dots per inch
	move.l	#25500,d0
	divu	pxh,d0
	move.w	d0,pic+pc_YDpi		;y dots per inch
	rts

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

	move.w	pic+pc_W,d0
	add.w	#7,d0
	lsr.w	#3,d0
	move.w	d0,wide

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

imgp4:	move.w	wide,temp3
	move.l	tpptr,a0
	clr.w	rlecnt			;current rle count
	move.w	#1,vrepcnt

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

	move.l	plane,d0
	add.l	d0,tpptr
	subq.w	#1,temp2
	bne	imgp4			;next bitplane row
*
*
	move.w	vrepcnt,d7
	subq.w	#1,d7
	move.l	picptr,a4
	bra	unc9
unc1:	move.l	a4,a3
	move.w	pic+pc_BitPln,d6
	bra	unc5
unc2:	move.l	a3,a1
	move.l	a2,a0
	move.w	wide,d5
	bra	unc4
unc3:	move.b	(a1)+,(a0)+
unc4:	dbf	d5,unc3
	add.l	plane,a3
	add.l	plane,a2
unc5:	dbf	d6,unc2
unc9:	move.l	picptr,a2
	add.w	pic+pc_Width,a2		;width
	move.l	a2,picptr
	subq.w	#1,pic+pc_H
	beq	irts
	dbf	d7,unc1

	bra	imgp3			;next scan line



***********************************************************
***							***
***********************************************************
*
*
* IMG getnext byte from run length encoded? picture
*   (something strange like it)
*
* rlecmd - 0 replicate zeros
* rlecmd - 1 replicate ones
* rlecmd - 2 from file
*
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
	cmp.b	#$80,d0			;bit string
	beq	gn3
	cmp.b	#0,d0			;pattern
	beq	gn4
	tst.b	d0
	bpl	gn2			;zero replicate
	move.w	#1,rlecmd		; ones replicate
gn2:	and.b	#$7f,d0
	move.w	d0,rlecnt
	bra	getnext

gn3:	move.l	table,a0
	move.l	f_get(a0),a0
	jsr	(a0)
	and.w	#$ff,d0
	move.w	d0,rlecnt
	move.w	#2,rlecmd		;bit string
	bra	getnext


gn4:	move.l	table,a0
	move.l	f_get(a0),a0
	jsr	(a0)
	tst.b	d0
	beq	gn5			;vertical replication count
	and.w	#$ff,d0
	mulu	ptrn,d0
	move.w	d0,rlecnt

	lea	pattern,a2
	move.w	ptrn,d1
	bra	gn4b
gn4a:	move.l	a2,-(sp)
	move.w	d1,-(sp)
	move.l	table,a0
	move.l	f_get(a0),a0
	jsr	(a0)
	move.w	(sp)+,d1
	move.l	(sp)+,a2
	move.b	d0,(a2)+
gn4b:	dbf	d1,gn4a

	move.w	#3,rlecmd		;pattern string
	bra	getnext

gn5:	move.l	table,a0
	move.l	f_get(a0),a0
	jsr	(a0)
	cmp.b	#$ff,d0
	bne	getnext
	move.l	table,a0
	move.l	f_get(a0),a0
	jsr	(a0)
	and.w	#$ff,d0
	move.b	d0,vrepcnt+1
	clr.w	rlecnt
	bra	getnext
*
*
more:	cmp.w	#1,rlecmd		;will take care of that for us.
	beq	rep_1
	bcs	rep_0
	cmp.w	#3,rlecmd
	beq	reppat
	move.l	table,a0
	move.l	f_get(a0),a0
	jmp	(a0)

reppat:	move.w	ptrn,d1
	lea	pattern,a0
	move.b	(a0),d0
	bra	repp2
repp1:	move.b	1(a0),(a0)+
repp2:	subq.w	#1,d1
	bne	repp1
	move.b	d0,(a0)
	rts

rep_1:	move.w	#$ff,d0
	rts
rep_0:	moveq	#0,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 img,DATA,PUBLIC

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

name:	dc.b	"IMG Bit Image File v2.0.0",0
spcl1:	dc.b	"Picture Window",0
spcl2:	dc.b	"Object",0

 SECTION img,BSS,PUBLIC
*
bitpln:		ds.w	1
colors:		ds.w	1
wide:		ds.w	1
dheight:	ds.w	1
nxtscn:		ds.w	1
pxh:		ds.w	1
pxw:		ds.w	1

plane:	ds.l	1
pptr:	ds.l	1
tpptr:	ds.l	1

rlecmd:	ds.w	1
rlecnt:	ds.w	1
ptrn:	ds.w	1
pattern:	ds.l	2
vrepcnt:	ds.w	1

temp1:	ds.w	1
temp2:	ds.w	1
temp3:	ds.w	1


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

count:		ds.l	1
len:		ds.l	1
fhandle:	ds.w	1

picptr:		ds.l	1

*
