Example:
	lea Pic+4,a0
	move.l (a0)+,d0
	lea (a0,d0.l),a2
	addq.w #4,a0
	moveq #0,d3			;iff-convert BODY
	lea Buff0,a4			;dest
	bsr IFFConv
	move.l RAWLen(PC),d0
	beq.w EXIT
	move.b RCode(PC),d0
	bne.w EXIT
	moveq #-1,d3			;iff-convert CMAP
	lea Pal(PC),a4			;dest
	bsr IFFConv
	move.l RAWLen(PC),d0
	beq.w EXIT
	move.b RCode(PC),d0
	bne.w EXIT
;	...
EXIT:	RTS
****************
IFFConv:;de-hunk ILBM data.a0=PIC+8,a2=end,a4=dest,d3=0/-1=bmap/cmapconv
	MOVEM.L D0-A6,-(SP)
	clr.b RCode
	lea BMHD(PC),a3
.Lp1:	move.l (a0)+,d0			;FIND BMHD,CMAP & BODY HUNKPTRS
	cmp.l #"BMHD",d0
	bne.s .No1
	move.l a0,(a3)
.No1:	cmp.l #"CMAP",d0
	bne.s .No2
	move.l a0,4(a3)
.No2:	cmp.l #"BODY",d0
	bne.s .No3
	move.l a0,8(a3)
.No3:	move.l (a0)+,d0
	add.l d0,a0
	btst #0,d0
	beq.s .NoPad
	addq.w #1,a0
.NoPad:	cmp.l a2,a0
	blt.s .Lp1

	lea RAWlen(PC),a3
	move.l BMHD(PC),d0
	beq.w .Err			;no BMHD hunk!!
	move.l d0,a0
	addq.w #4,a0			;skip hunklen.L!
	tst.w d3
	beq.s .BMAP

.CMAP:	move.l CMAP(PC),d0		;no CMAP to convert!
	beq.w .Err
	move.l d0,a1
	move.l (a1)+,d0			;length (#cols/3)
	divu #3,d0
	cmp.w #32,d0			;no more than 32 palette colors!
	bgt.w .Err
	ext.l d0
	MOVE.W D0,D2
	add.l d0,d0
	move.l d0,(a3)+
	beq.w .Err
	MOVE.L A4,D0			;instead of alloc!
	move.l d0,(a3)+
	beq.w .Err
	move.l d0,a2
	MOVE.W D2,D0
	subq.w #1,d0
.Lp2:	move.b (a1)+,d1
	lsr.b #4,d1
	move.b d1,(a2)+
	move.b (a1)+,d1
	and.b #$f0,d1
	move.b (a1)+,d2
	lsr.b #4,d2
	or.b d2,d1
	move.b d1,(a2)+
	dbra d0,.Lp2
	bra .ERR			;RETURN

.BMAP:	move.l BODY(PC),d0
	beq.w .Err			;no BODY?? then what's the point
	move.l d0,a1
	addq.w #4,a1			;skip hunklen.l
	
	move.w (a0)+,d2
	add.w #15,d2
	lsr.w #4,d2
	add.w d2,d2			;bytes/row
	move.w (a0)+,d3			;height
	addq.w #4,a0
	moveq #0,d4
	move.b (a0)+,d4			;depth
	move.b (a0)+,d5			;masking
	cmp.b #1,d5
	bhi.w .Err			;unknown masking type!
	move.b (a0)+,d6
	cmp.b #1,d6
	bhi.w .Err			;unknown compression type!

.Conv:	move.w d2,d0			;bwid
	mulu d4,d0			;× #bpls
	mulu d3,d0			;× hgt (order is important!)
	move.l d0,(a3)+
	MOVE.L A4,D0			;instead of alloc!
	move.l d0,(a3)+			;addr
	beq.w .Err
	move.l d0,a0
	subq.w #1,d4
	move.w d4,a3			;a3=#bpls-1
	subq.w #1,d3			;d3=hgt-1

	tst.b d6
	bne.s .Compr

	lsr.w #1,d2			;#words/scanline
	subq.w #1,d2
	move.w d2,a2
.Line:	move.w a3,d4
.Bpl:	move.w a2,d2
.Word:	move.w (a1)+,(a0)+
	dbra d2,.Word
	dbra d4,.Bpl
	tst.b d5
	beq.s .NoAd
	add.w d2,a1
	add.w d2,a1			;skip mask bpl if one is present
.NoAd:	dbra d3,.Line
	bra.b .Err

.Compr:	move.w d2,a2
.CLine:	move.w a3,d4
.CBpl:	move.w a2,d2

.Byte:	moveq #0,d0
	move.b (a1)+,d0
	bmi.s .NoCpy
	sub.w d0,d2
.CLp1:	move.b (a1)+,(a0)+
	dbra d0,.CLp1
	subq.w #1,d2
	bgt.s .Byte			;repeat until bpl done
	bpl.s .BplD			;bpl done! (minus SHOULD gen error!)
	bra.s .Err2
.NoCpy:	cmp.b #-128,d0			;-128=NOP (weird!)
	beq.s .Byte
	neg.b d0
	sub.w d0,d2
.Rep:	move.b (a1)+,d1
.CLp2:	move.b d1,(a0)+
	dbra d0,.CLp2
	subq.w #1,d2
	bgt.s .Byte			;repeat until bpl done
	bmi.s .Err2
.BplD:	dbra d4,.CBpl
	tst.b d5			;DO ALL BPLS,
	beq.s .NoMsk			;THEN SKIP EV. MASKBPL

	move.w a2,d2
.Byte2:	moveq #0,d0
	move.b (a1)+,d0
	bmi.s .NoCpy2
	addq.w #1,d0
	add.w d0,a1
	sub.w d0,d2
	bgt.s .Byte2			;repeat until bpl done
	bpl.s .NoMsk
	bra.s .Err2
.NoCpy2:cmp.b #-128,d0			;-128=NOP (weird!)
	beq.s .Byte2
	neg.b d0
	tst.b (a1)+			;poll fill-byte (not used)
	sub.w d0,d2
	subq.w #1,d2
	bgt.s .Byte2			;repeat until bpl done
	bmi.s .Err2
.NoMsk:	dbra d3,.CLine
	bra.s .Err

.Err2:	not.b RCode
.Err:	MOVEM.L (SP)+,D0-A6		;returns [RAWadr] & [RAWlen].0=error
	RTS
BMHD:	dc.w 0
CMAP:	dc.w 0
BODY:	dc.w 0
RAWlen:	dc.l 0
RCode:	dc.b 0
EVEN
