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

 SECTION GIF,CODE,PUBLIC

***************************************************
***						***
***************************************************
dumbentry:
	clr.l	d0
	rts

	dc.l	"IMPP"		; magik number for pic import
	dc.w	200
	dc.l	0

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


**************************************
*     Is it really a GIF file?       *
**************************************
check:	move.l	table,a0
	move.l	buff1(a0),a1
        move.l  (a1),a1
        move.l  (a1),d0
        and.l   #$ffffff00,d0
        move.b  #' ',d0
        cmp.l   #'GIF ',d0      
        bne     never
        bra     right


***********************************
***                             ***
***********************************
gifp:	move.l	sp,savesp
        
        move.l  table,a0
        move.l  flen(a0),a0
        move.l  (a0),piclength
        
        move.l  table,a0
	move.l	f_openr(a0),a0
	jsr	(a0)
	beq	rrts

        clr.l   gcmap
        clr.l   gcmapsize
        clr.l   picture
        clr.l   prefix
        clr.l   suffix
        clr.l   outcode
        
	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	rrts

	bsr	getscrdes
        bsr     getpicdes

	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		;size of bitmap +( 4 words * #colors)

	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
        move.l  picptr,picptr2
	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:
	bsr	purgepic

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

abort0:	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	abort0

	bsr	getscrdes
        bsr     getpicdes
        
	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		;.5 point line
	clr.b	object+ob_LType			;no line style
	move.b	#1,object+ob_LColor		;line color = black
	clr.b	object+ob_FType			;no fill
	move.b	#1,object+ob_FColor		;fill color = black
	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

        clr.l   d0
        clr.l   d1
	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               ;save start of amiga palette data
        
        bsr     putcolor
        move.l  picptr,picptr2
	bsr	putpic

	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:
	bsr	purgepic

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

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


***********************************
***	       			***
***********************************
getscrdes:
	lea	pic,a0
	move.w	#pc_Sizeof-1,d0
gpi1:	clr.b	(a0)+
	dbra	d0,gpi1

	move.l	table,a1
	move.l	piclength,d0
	clr.w	d1
	clr.w	d2
	move.l	m_alloc(a1),a1
	jsr	(a1)
        beq     errrts
	move.l	a0,picture

        move.l  #16384,d0
        clr.l   d1
        clr.l   d2
        move.l  table,a1
        move.l  m_alloc(a1),a1
        jsr     (a1)
        beq     errrts
        move.l  a0,prefix

        move.l  #16384,d0
        clr.l   d1
        clr.l   d2
        move.l  table,a1
        move.l  m_alloc(a1),a1
        jsr     (a1)
        beq     errrts
        move.l  a0,suffix
        
        move.l  #4100,d0
        clr.l   d1
        clr.l   d2
        move.l  table,a1
        move.l  m_alloc(a1),a1
        jsr     (a1)
        beq     errrts
        move.l  a0,outcode
        
        move.l  picture,a0
	move.l	(a0),a0                 ;read the file into memory 
	move.l	piclength,d0
	move.l	table,a1
	move.l	f_getr(a1),a1
	jsr	(a1)
	beq	errrts
        
        move.l  picture,a0
        move.l  (a0),a0
        
        add.l   #10,a0                  ;skip the signature and the screen res
        move.b  (a0)+,d0
        btst    #7,d0                   ;check for a global color map
        beq     gpi2
        
        move.b  d0,d1
        and.b   #112,d1                 ;get bits 6,5,4 into d0
        lsr.b   #4,d1
        addq.b  #1,d1
        move.b  d1,gbitcres             ;bits of color resolution (global)
        
        and.w   #7,d0                   ;get bits 2,1,0 into d0
        addq.b  #1,d0
        move.b  d0,gbpp                 ;bits per pixel (global)
        move.w  d0,pic+pc_BitPln

        move.b  (a0)+,d0                ;get the background color
        move.b  d0,gbgcolor                       
        addq.l  #1,a0                   ;point a0 to the color map
        
        clr.l   d1                      ;calculate the number of bytes in cmap
        move.b  gbpp,d1
        subq.b  #1,d1
        moveq.l #2,d0
        lsl.l   d1,d0
        move.w  d0,gnumcolors
        move.w  d0,pic+pc_Palet
        mulu    #3,d0
        move.l  d0,gcmapsize
        move.l  a0,gcmap                ;a0 = start of global color map
        
        add.l   d0,a0                   ;move file pointer past gcm
        
gpi2:   move.l  a0,pptr                 ;save it

        lea	pic,a0
	move.w	#-1,pc_SFreq(a0)
	move.w	#-1,pc_SAngle(a0)
	move.w	#0,pc_SSpot(a0)
	move.l	#0,pc_SMap(a0)
	move.l	#0,pc_SMap+4(a0)
	move.w	#72,pc_XDpi(a0)
	move.w	#72,pc_YDpi(a0)

	rts


***********************************
***				***
***********************************
getpicdes:
        move.l  gcmap,d0
        move.l  d0,lcmap             ;default if there is no local cmap
        move.l  gcmapsize,d1
        move.l  d1,lcmapsize
        move.b  gbpp,d2
        move.b  d2,lbpp
        move.b  gbgcolor,d3
        move.b  d3,lbgcolor
        move.b  gbitcres,d4
        move.b  d4,lbitcres
        
        bsr     skipextenders
        
        move.l  pptr,a0
        addq.l  #5,a0                   ;skip the comma, left and top edge 
        
        move.b  (a0)+,tempw+1           ;intel format
        move.b  (a0)+,tempw
        move.w  tempw,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.b  (a0)+,tempw+1
        move.b  (a0)+,tempw
        move.w  tempw,d0
        move.w  d0,pic+pc_H
        
        move.b  (a0)+,d0
        bclr    #0,flag                 ;clear the image interlace flag
        btst    #6,d0
        beq     gp1
        bset    #0,flag                 ;the image is stored as interlace 
        
gp1:    btst    #7,d0                   ;do I use the global or local cmap
        beq     gp2                     ;use the global cmap stuff
        
        and.w   #7,d0                   ;mask off pixel value (lower 3 bits)
        addq.b  #1,d0
        move.b  d0,lbpp                 ;store the bits per pixel
        move.w  d0,pic+pc_BitPln
        
        clr.l   d1                      ;calculate the # of bytes in the lcmap
        move.b  d0,d1
        subq.b  #1,d1
        moveq.l #2,d0
        lsl.l   d1,d0
        move.w  d0,lnumcolors
        move.w  d0,pic+pc_Palet
        mulu    #3,d0
        move.l  d0,lcmapsize
        move.l  a0,lcmap                ;a0 = start of the local color map
        
        add.l   d0,a0                   ;move a0 past the cmap stuff
        
        move.b  #PC_PALET,pic+pc_Type
        
gp2:    move.l  a0,pptr
        rts
        
***********************************
***				***
***********************************        
skipextenders:
        clr.l   d0
        move.l  pptr,a0
        cmp.b   #'!',(a0)               ;is a gif extender present?
        bne     se3                     ;no
        addq.l  #2,a0                   ;skip the ! and the function code

se1:    move.b  (a0)+,d0                ;get the length of the extention
        beq     se2                     ;when 0 - it is the end
        add.l   d0,a0                   ;skip data
        bra     se1
                
se2:    move.l  a0,pptr        
se3:    rts


***********************************************************
***							***
***********************************************************
putcolor:
	move.w	pic+pc_Palet,d3

	move.l	picptr,a0
	move.l	lcmap,a1
	bra	pc4

pc1:	move.b	(a1)+,d0                ;red
	and.w	#$ff,d0
	mulu	#65535,d0
	divu	#240,d0
	move.w	d0,(a0)
        
	move.b  (a1)+,d0                ;green
	and.w	#$ff,d0
	mulu	#65535,d0
	divu	#240,d0
	move.w	d0,2(a0)
        
	move.b  (a1)+,d0		;blue
	and.w	#$ff,d0
	mulu	#65535,d0
	divu	#240,d0
	move.w	d0,4(a0)

	move.w	(a0)+,d0
	move.w	(a0)+,d1
	move.w	(a0)+,d2
	mulu	#19661,d0
	mulu	#38666,d1
	mulu	#7209,d2
	add.l	d1,d0
	add.l	d2,d0
	swap	d0
	cmp.w	#$8000,d0
	bcc	pc2
	moveq	#1,d0
	bra	pc3
pc2:	moveq	#0,d0
pc3:	move.w	d0,(a0)+		;calculate on screen color (B or W)

pc4:	dbf	d3,pc1
	move.l	a0,picptr               ;set a0 to start of amiga bitmap
	rts


***********************************
***				***
***********************************
putpic:
;       move.w	pic+pc_Width,d0         ;set amiga bitmap to all white ($ff)
;	mulu	pic+pc_BitPln,d0
;	mulu	pic+pc_H,d0
;	move.l	d0,d1
;	swap	d1
;	move.l	picptr,a0
;	bra	pp2
;pp1:	move.b	#$ff,(a0)+
;pp2:	dbf	d0,pp1
;	dbf	d1,pp1

        move.l  picptr,apos1            ;for cpystr stuff
        move.l  picptr,apos2            ;
        move.w  #7,bitcount             ; "      
        move.w  #0,plncnt               ; "
        move.w  pic+pc_W,d0             ; "
        subq.w  #1,d0                   ; "
        move.w  d0,pixcount             ; "
        clr.l   d0                      ; "
        move.w  pic+pc_Width,d0         ; "
        mulu    pic+pc_H,d0             ; "
        move.l  d0,plnlen               ; "
        
        move.l  pptr,a0
        clr.w   d0
        move.b  (a0)+,d0        ;get smallest code length
        move.w  d0,codelength   ;initial code length is codelength bits
        move.l  a0,pptr
        
        clr.l   d0
        move.b  lbpp,d0
        move.l  #1,d1
        lsl.l   d0,d1
        subq.l  #1,d1
        move.l  d1,bitmask
                
        clr.w   pass                    ;for interlaced gif pictures
        clr.w   hcount
        
        bsr     setuplzwdata            ;sets up picture to have only LZW data
        
        move.l  outcode,a0
        move.l  (a0),-(sp)
        move.l  suffix,a0
        move.l  (a0),-(sp)
        move.l  prefix,a0
        move.l  (a0),-(sp)
        move.l  bitmask,-(sp)
        move.w  codelength,d0
        move.l  d0,-(sp)
        move.l  picture,a0
        move.l  (a0),-(sp)              ;pointer to LZW data
        move.l  picptr,-(sp)            ;pointer to amiga bitmap
        bsr     doGIF
        add.l   #28,sp                  ;clean up stack
  
        bra     purgepic

********************************
***                          ***
********************************
readcode:
        movem.l d3-d5/a2-a3,-(a7)
        movea.l 24(a7),a3
        move.l  28(a7),d5
        movea.l 36(a7),a2
        move.l  (a3),d1
        lsr.l   #3,d1
        moveq   #0,d3
        move.b  1(a2,d1.l),d3
        moveq   #0,d4
        not.b   d4
        and.l   d4,d3
        asl.l   #8,d3
        moveq   #0,d0
        move.b  0(a2,d1.l),d0
        and.l   d4,d0
        add.l   d3,d0
        cmp.l   #8,d5
        bcs.b   rc1
       
        moveq   #0,d3
        move.b  2(a2,d1.l),d3
        and.l   d4,d3
        swap    d3
        clr.w   d3
        add.l   d3,d0
        
rc1:    move.l  (a3),d1
        add.l   d5,(a3)
        and.l   #7,d1
        lsr.l   d1,d0
        and.l   32(a7),d0
        movem.l (a7)+,d3-d5/a2-a3
        rts
       
********************************
***                          ***
********************************
doGIF:       
        link      a5,#$ffc0
        movem.l   d2-d7/a2-a3,-(a7)
        movea.l   32(a5),a3
        move.l    16(a5),d7
        moveq     #1,d0
        move.l    d0,d1
        asl.l     d7,d1
        move.l    d1,d2
        addq.l    #1,d2
        move.l    d1,d3
        addq.l    #2,d3
        move.l    d7,d4
        addq.l    #1,d4
        move.l    d1,44(a7)
        move.l    d4,d1
        move.l    d1,32(a7)
        move.l    d0,d1
        asl.l     d4,d1
        move.l    d1,d7
        move.l    d7,d0
        subq.l    #1,d0
        moveq     #0,d1
        move.l    d1,-36(a5)
        move.l    d1,d6
        movea.l   12(a5),a2
        move.l    a2,-(a7)
        move.l    d0,-(a7)
        move.l    d4,-(a7)
        pea       -36(a5)
        move.l    d0,-28(a5)
        move.l    d2,56(a7)
        move.l    d3,-24(a5)
        move.l    d3,52(a7)
        bsr.w     readcode
        lea       16(a7),a7
        move.l    d0,d5
        moveq     #1,d0
        move.l    d0,-40(a5)
        bra.w     dg7
       
dg0:    cmp.l     44(a7),d5
        bne.b     dg1
       
        move.l    32(a7),d4
        moveq     #1,d0
        move.l    d0,d1
        asl.l     d4,d1
        move.l    d1,d7
        move.l    d7,d0
        subq.l    #1,d0
        move.l    36(a7),-24(a5)
        move.l    a2,-(a7)
        move.l    d0,-(a7)
        move.l    d4,-(a7)
        pea       -36(a5)
        move.l    d0,-28(a5)
        bsr.w     readcode
        move.l    d0,d5
        move.l    d5,d0
        and.l     20(a5),d0
        move.l    d0,(a7)
        move.l    d0,-48(a5)
        bsr       addtopix2
        lea       16(a7),a7
        bra.w     dg6
       
dg1:    move.l    d5,d7
        cmp.l     -24(a5),d7
        bcs.b     dg2
        move.l    -44(a5),d7
        moveq     #1,d6
        move.l    -48(a5),(a3)
        
dg2:    move.l    d6,d0
        asl.l     #2,d0
        movea.l   a3,a2
        adda.l    d0,a2
        bra.b     dg3
       
dg21:   addq.l    #1,d6
        move.l    d7,d0
        asl.l     #2,d0
        movea.l   28(a5),a0
        move.l    0(a0,d0.l),(a2)+
        movea.l   24(a5),a0
        move.l    0(a0,d0.l),d7
        
dg3:    cmp.l     20(a5),d7
        bhi.b     dg21
       
        and.l     20(a5),d7
        move.l    d7,-48(a5)
        move.l    d7,(a2)
        move.l    d6,d0
        asl.l     #2,d0
        movea.l   a3,a2
        adda.l    d0,a2
        bra.b     dg5
       
dg4:    move.l    (a2),-(a7)
        bsr       addtopix2
        addq.w    #4,a7
        subq.l    #4,a2
        
dg5:    cmpa.l    a3,a2
        bcc.b     dg4
       
        moveq     #0,d6
        move.l    -24(a5),d0
        move.l    d0,d1
        asl.l     #2,d1
        movea.l   24(a5),a0
        move.l    -44(a5),0(a0,d1.l)
        movea.l   28(a5),a0
        move.l    d7,0(a0,d1.l)
        addq.l    #1,-24(a5)
        move.l    -32(a5),d7
        move.l    -24(a5),d0
        cmp.l     d7,d0
        bcs.b     dg6
       
        moveq     #12,d0
        cmp.l     d0,d4
        bcc.b     dg6
       
        addq.l    #1,d4
        add.l     d7,d7
        moveq     #1,d0
        move.l    d0,d1
        asl.l     d4,d1
        subq.l    #1,d1
        move.l    d1,-28(a5)

dg6:    move.l    d5,-44(a5)
        movea.l   12(a5),a2
        move.l    a2,-(a7)
        move.l    -28(a5),-(a7)
        move.l    d4,-(a7)
        pea       -36(a5)
        bsr.w     readcode
        lea       16(a7),a7
        move.l    d0,d5
        addq.l    #1,-40(a5)
       
dg7:    move.l    d7,-32(a5)
        cmp.l     40(a7),d5
        bne.w     dg0
       
        move.l    -40(a5),d0
        movem.l   (a7)+,d2-d7/a2-a3
        unlk      a5
        rts
        
**********************************
**                              **
**********************************
setuplzwdata:
        move.l  pptr,a0
        move.l  picture,a1
        move.l  (a1),a1
        
set0:   clr.w   d0
        clr.w   d1
        move.b  (a0)+,d0                ;get length of block
        move.b  d0,d1
        bra     set2
set1:   move.b  (a0)+,(a1)+             ;copy block
set2:   dbf	d0,set1
        dbf     d1,set0                 ;not a real dbf - it will branch back
        rts                             ;if the length of the block is not 0
                
**********************************
**                              **
**********************************
addtopix2:
        move.l  4(sp),d0        ;get the code off the stack into d0
        movem.l d0-d7/a0-a6,-(sp)

cp0:    move.l  apos2,a2        ;restore place in amiga bitmap - plane x
        move.l  apos1,a1        ;restore place in amiga bitmap - plane 1
        move.l  plnlen,d7       ;d7 = amiga bitplane length in bytes
        move.w  bitcount,d5     ;restore bit place in a2
        move.w  plncnt,d1       ;restore plane counter
        move.w  pixcount,d6     ;restore pixel counter
        moveq	#0,d3           ;d1 = bit position in gif data

cp1:    btst	d3,d0           ;is the data bit on or off
	beq	cp3             ;off
	bset	d5,(a2)
	bra	cp4
cp3:	bclr	d5,(a2)
        
cp4:    add.l	d7,a2           ;go to next bitplane
	addq.w	#1,d1           ;update bitplane counter
        
        cmp.w	pic+pc_BitPln,d1
	bcs	cp7
        
        moveq	#0,d1           ;reset bitplane counter
        move.l  a1,a2           ;reset a2 to first bitplane
        
cp5:    dbf	d5,cp6          ;update amiga bit pos
	addq.l	#1,a1           ;move to next amiga bitmap byte
        addq.l  #1,a2
	moveq	#7,d5           ;reset d5 to top of byte
        
cp6:    dbf	d6,cp7          ;update pixel width counter
        
        btst    #0,flag         ;is this an interlaced image?
        beq     cp64            ;no
        
        move.l  picptr2,a1

        cmp.w   #0,pass         ;pass 1
        bne     cp61
        clr.l   d4              ;move ahead 8 rows
        move.w  pic+pc_Width,d4
        lsl.l   #3,d4
        add.l   d4,a1
        move.l  a1,picptr2
        move.l  a1,a2
        add.w   #8,hcount
        
        move.w  hcount,d4       ;am I done with this pass?
        cmp.w   pic+pc_H,d4
        bcs     cp65            ;no
        
        addq.w  #1,pass         ;go to next pass 
        move.l  picptr,a1       ;move to the fifth row
        clr.l   d4
        move.w  pic+pc_Width,d4
        lsl.w   #2,d4
        add.l   d4,a1
        move.l  a1,picptr2
        move.l  a1,a2
        move.w  #5,hcount
        bra     cp65
        
cp61:   cmp.w   #1,pass         ;pass 2
        bne     cp62
        clr.l   d4
        move.w  pic+pc_Width,d4 ;move ahead 8 rows
        lsl.l   #3,d4
        add.l   d4,a1
        move.l  a1,picptr2
        move.l  a1,a2
        add.w   #8,hcount
        
        move.w  hcount,d4       ;am I done with this pass?
        cmp.w   pic+pc_H,d4
        bcs     cp65            ;no
        
        addq.w  #1,pass         ;next pass please
        move.l  picptr,a1       ;move to the third row
        clr.l   d4
        move.w  pic+pc_Width,d4
        lsl.l   #1,d4
        add.l   d4,a1
        move.l  a1,picptr2
        move.l  a1,a2
        move.w  #3,hcount
        bra     cp65
        
cp62:   cmp.w   #2,pass         ;pass 3
        bne     cp63
        clr.l   d4
        move.w  pic+pc_Width,d4 ;move ahead 4 rows
        lsl.l   #2,d4
        add.l   d4,a1
        move.l  a1,picptr2
        move.l  a1,a2
        add.w   #4,hcount
        
        move.w  hcount,d4       ;am I done with this pass?
        cmp.w   pic+pc_H,d4
        bcs     cp65            ;no
        
        addq.w  #1,pass         ;next pass please
        move.l  picptr,a1       ;move to the second row
        clr.l   d4
        move.w  pic+pc_Width,d4
        add.l   d4,a1
        move.l  a1,picptr2
        move.l  a1,a2
        move.w  #2,hcount
        bra     cp65
        
cp63:   clr.l   d4              ;pass 4
        move.w  pic+pc_Width,d4 ;move ahead 2 rows
        lsl.l   #1,d4
        add.l   d4,a1
        move.l  a1,picptr2
        move.l  a1,a2
        bra     cp65

cp64:   move.l  picptr2,a1
        add.w   pic+pc_Width,a1
        move.l  a1,picptr2
        move.l  a1,a2        
                                
cp65:   move.w  #7,d5
        move.w  pic+pc_W,d6
        subq.w  #1,d6
     
cp7:    addq.w  #1,d3           ;update gif bit counter
        cmp.w   pic+pc_BitPln,d3
        bcs     cp1
        
cp81:   move.l  a2,apos2        ;save place in amiga bitmap - plane x
        move.l  a1,apos1        ;save place in amiga bitmap - plane 1
        move.w  d5,bitcount     ;save bit place in a2
        move.w  d1,plncnt       ;save plane counter
        move.w  d6,pixcount     ;save pixel counter
        
        movem.l (sp)+,d0-d7/a0-a6
        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)


***********************************
***				***
***********************************
errrts: bsr     purgepic
        move.l	savesp,sp
        move.l  table,a0        ;clean up and exit
        move.l  spclnum(a0),a0
        cmp.w   #1,(a0)
        beq     abortobj
        bra     abortpic      

rrts:	rts


***********************************
***                             ***
***********************************
purgepic:
	tst.l	picture
	beq	pu1
	move.l	picture,a0
	move.l	table,a1
	move.l	m_delete(a1),a1
	jsr	(a1)

pu1:    tst.l   prefix
        beq     pu2
        move.l	prefix,a0
	move.l	table,a1
	move.l	m_delete(a1),a1
	jsr	(a1)

pu2:    tst.l   suffix
        beq     pu3
        move.l	suffix,a0
	move.l	table,a1
	move.l	m_delete(a1),a1
	jsr	(a1)        

pu3:    tst.l   outcode
        beq     pu4
        move.l	outcode,a0
	move.l	table,a1
	move.l	m_delete(a1),a1
	jsr	(a1)

pu4:    rts


*******************************************************************
***	called when the import routine choosen finds something	***
***	wrong with the file loaded.				***
*******************************************************************
never:	clr.w	d0
	rts

maybe:	move.w	#1,d0
	rts

right:	move.w	#2,d0
	rts



*************************************************************
*************************************************************
 SECTION GIF,DATA,PUBLIC

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

name:	dc.b	"GIF  v2.0.2",0

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


***************************************************************
***************************************************************
 SECTION GIF,BSS,PUBLIC
temp:		ds.l	1
temp2:		ds.l	1
flag:           ds.l    1
savesp:		ds.l	1
picptr:		ds.l	1
picptr2:        ds.l    1
pptr:		ds.l	1
pic:		ds.w	pc_Sizeof/2
object:		ds.w	ob_SizeOf/2

picture:	ds.l	1
piclength:	ds.l	1
gcmap:          ds.l    1
gcmapsize:      ds.l    1
lcmap:          ds.l    1
lcmapsize:      ds.l    1
gbitcres:       ds.b    1
gbpp:           ds.b    1
gbgcolor:       ds.b    1
lbitcres:       ds.b    1
lbpp:           ds.b    1
lbgcolor:       ds.b    1
gnumcolors:     ds.w    1
lnumcolors:     ds.w    1
tempw:          ds.w    1
bitcount:       ds.w    1
plncnt:         ds.w    1
pixcount:       ds.w    1
apos1:          ds.l    1
apos2:          ds.l    1
codelength:     ds.w    1
plnlen:         ds.l    1
pass:           ds.w    1
hcount:         ds.w    1
bitmask:        ds.l    1
prefix:         ds.l    1
suffix:         ds.l    1
outcode:        ds.l    1


***************************** CHANGES ****************************************
;
;       version 2.0.2   (uploaded 11/07/90)
;
;       - added new LZW decompression code from code written in C
;         on the mac for an increase in the decompression speed
;         (readcode & doGIF)
;
;
;       version 2.0.1
;
;       - changed linked list table to a static 4096 entry table
;
;
;       version 2.0.0 (uploaded 11/02/90)
;
;       - initial release
