home *** CD-ROM | disk | FTP | other *** search
/ Crawly Crypt Collection 2 / crawlyvol2.bin / apps / dtp / pgsmodst / atariimp / gif.s < prev    next >
Text File  |  1991-05-23  |  26KB  |  1,053 lines

  1.  Include "equ.h"
  2.  Include "impequ.h"
  3.  
  4.  SECTION GIF,CODE,PUBLIC
  5.  
  6. ***************************************************
  7. ***                        ***
  8. ***************************************************
  9. dumbentry:
  10.     clr.l    d0
  11.     rts
  12.  
  13.     dc.l    "IMPP"        ; magik number for pic import
  14.     dc.w    200
  15.     dc.l    0
  16.  
  17. table:    dc.l    0
  18.     dc.l    name,special,check,gifp
  19.  
  20.  
  21. **************************************
  22. *     Is it really a GIF file?       *
  23. **************************************
  24. check:    move.l    table,a0
  25.     move.l    buff1(a0),a1
  26.         move.l  (a1),a1
  27.         move.l  (a1),d0
  28.         and.l   #$ffffff00,d0
  29.         move.b  #' ',d0
  30.         cmp.l   #'GIF ',d0      
  31.         bne     never
  32.         bra     right
  33.  
  34.  
  35. ***********************************
  36. ***                             ***
  37. ***********************************
  38. gifp:    move.l    sp,savesp
  39.         
  40.         move.l  table,a0
  41.         move.l  flen(a0),a0
  42.         move.l  (a0),piclength
  43.         
  44.         move.l  table,a0
  45.     move.l    f_openr(a0),a0
  46.     jsr    (a0)
  47.     beq    rrts
  48.  
  49.         clr.l   gcmap
  50.         clr.l   gcmapsize
  51.         clr.l   picture
  52.         clr.l   prefix
  53.         clr.l   suffix
  54.         clr.l   outcode
  55.         
  56.     move.l    table,a0
  57.     move.l    spclnum(a0),a0
  58.     cmp.w    #1,(a0)
  59.     beq    impobj
  60.  
  61.  
  62. ***********************************
  63. ***                             ***
  64. ***********************************
  65. imppic:    move.l    table,a0
  66.     move.l    p_open(a0),a0
  67.     jsr    (a0)
  68.     beq    rrts
  69.  
  70.     bsr    getscrdes
  71.         bsr     getpicdes
  72.  
  73.     move.l    table,a4
  74.     move.l    cwptr(a4),a4        ;ptr to window handle
  75.     move.l    (a4),a4            ;window handle
  76.     move.l    (a4),a4            ;ptr to window structure
  77.  
  78.     lea    pic,a0
  79.     move.w    pc_Type(a0),pi_Type(a4)
  80.     move.w    pc_SFreq(a0),pi_SFreq(a4)
  81.     move.w    pc_SAngle(a0),pi_SAngle(a4)
  82.     move.w    pc_SSpot(a0),pi_SSpot(a4)
  83.     move.l    pc_SMap(a0),pi_SMap(a4)
  84.     move.l    pc_SMap+4(a0),pi_SMap+4(a4)
  85.     move.w    pc_XDpi(a0),pi_XDpi(a4)
  86.     move.w    pc_YDpi(a0),pi_YDpi(a4)
  87.     move.w    pc_W(a0),pi_W(a4)
  88.     move.w    pc_H(a0),pi_H(a4)
  89.     move.w    pc_Width(a0),pi_Width(a4)
  90.     move.w    pc_BitPln(a0),pi_BitPln(a4)
  91.     move.w    pc_Palet(a0),pi_Palet(a4)
  92.  
  93.     move.w    pi_Palet(a4),d1
  94.     mulu    #pl_Sizeof,d1
  95.     move.w    pi_Width(a4),d0
  96.     mulu    pi_BitPln(a4),d0
  97.     mulu    pi_H(a4),d0
  98.     add.l    d1,d0        ;size of bitmap +( 4 words * #colors)
  99.  
  100.     clr.w    d1
  101.     clr.w    d2
  102.     move.l    table,a0
  103.     move.l    m_alloc(a0),a0
  104.     jsr    (a0)
  105.     beq    abortpic
  106.  
  107.     move.l    table,a3
  108.     move.l    cwptr(a3),a3
  109.     move.l    (a3),a3
  110.     move.l    (a3),a3
  111.     move.l    a0,pi_Ptr(a3)
  112.     move.l    (a0),a4
  113.     move.l    a4,picptr
  114.  
  115.         bsr     putcolor
  116.         move.l  picptr,picptr2
  117.     bsr    putpic
  118.  
  119.     move.l    table,a0
  120.     move.l    p_close(a0),a0
  121.     jsr    (a0)
  122.  
  123.     move.l    table,a0
  124.     move.l    f_closer(a0),a0
  125.     jmp    (a0)
  126.  
  127.  
  128. abortpic:
  129.     bsr    purgepic
  130.  
  131.     move.l    table,a0
  132.     move.l    p_abort(a0),a0
  133.     jsr    (a0)
  134.  
  135. abort0:    move.l    table,a0
  136.     move.l    f_closer(a0),a0
  137.     jmp    (a0)
  138.  
  139.  
  140. ***********************************
  141. ***                             ***
  142. ***********************************
  143. impobj:    move.l    table,a0
  144.     move.l    o_open(a0),a0
  145.     jsr    (a0)
  146.     beq    abort0
  147.  
  148.     bsr    getscrdes
  149.         bsr     getpicdes
  150.         
  151.     move.b    #tpic,object+ob_Type
  152.     clr.l    object+ob_Left
  153.     clr.l    object+ob_Top
  154.  
  155.     move.w    pic+pc_W,d1
  156.     move.l    #7200,d0
  157.     bsr    Mulu1632
  158.     move.w    pic+pc_XDpi,d2
  159.     bsr    Divu1648
  160.     move.l    d0,object+ob_Right
  161.  
  162.     move.w    pic+pc_H,d1
  163.     move.l    #7200,d0
  164.     bsr    Mulu1632
  165.     move.w    pic+pc_YDpi,d2
  166.     bsr    Divu1648
  167.     move.l    d0,object+ob_Bottom
  168.  
  169.     clr.b    object+ob_Flag
  170.     clr.w    object+ob_Slant
  171.     clr.w    object+ob_Twist
  172.     move.w    #50,object+ob_LWidth        ;.5 point line
  173.     clr.b    object+ob_LType            ;no line style
  174.     move.b    #1,object+ob_LColor        ;line color = black
  175.     clr.b    object+ob_FType            ;no fill
  176.     move.b    #1,object+ob_FColor        ;fill color = black
  177.     clr.b    object+ob_LBegin
  178.     clr.b    object+ob_LEnd
  179.     move.w    #900,object+ob_HStandOff    ;1/8 inch
  180.     move.w    #900,object+ob_VStandOff    ;1/8 inch
  181.  
  182.     move.l    table,a1
  183.     move.l    o_obj(a1),a1
  184.     lea    object,a0
  185.     jsr    (a1)
  186.     beq    abortobj
  187.  
  188.         clr.l   d0
  189.         clr.l   d1
  190.     move.w    pic+pc_Width,d0
  191.     mulu    pic+pc_BitPln,d0
  192.     mulu    pic+pc_H,d0
  193.     move.w    pic+pc_Palet,d1
  194.     mulu    #pl_Sizeof,d1
  195.     add.l    d1,d0
  196.     add.l    #pc_Sizeof,d0
  197.  
  198.     move.l    table,a0
  199.     move.l    o_malloc(a0),a0
  200.     jsr    (a0)
  201.     beq    abortobj
  202.  
  203.     lea    pic,a1
  204.     clr.l    pc_DPtr(a1)
  205.     clr.w    pc_DScale(a1)
  206.     move.w    pc_Palet(a1),d0
  207.     mulu    #pl_Sizeof,d0
  208.     add.l    #pc_Sizeof,d0
  209.     move.l    d0,pc_Ptr(a1)
  210.  
  211.     move.w    #pc_Sizeof/2-1,d0
  212. oppic1:    move.w    (a1)+,(a0)+
  213.     dbf    d0,oppic1
  214.     move.l    a0,picptr               ;save start of amiga palette data
  215.         
  216.         bsr     putcolor
  217.         move.l  picptr,picptr2
  218.     bsr    putpic
  219.  
  220.     move.l    table,a0
  221.     move.l    o_close(a0),a0
  222.     jsr    (a0)
  223.  
  224.     move.l    table,a0
  225.     move.l    f_closer(a0),a0
  226.     jmp    (a0)
  227.  
  228. abortobj:
  229.     bsr    purgepic
  230.  
  231.     move.l    table,a0
  232.     move.l    o_abort(a0),a0
  233.     jsr    (a0)
  234.  
  235.     move.l    table,a0
  236.     move.l    f_closer(a0),a0
  237.     jmp    (a0)
  238.  
  239.  
  240. ***********************************
  241. ***                       ***
  242. ***********************************
  243. getscrdes:
  244.     lea    pic,a0
  245.     move.w    #pc_Sizeof-1,d0
  246. gpi1:    clr.b    (a0)+
  247.     dbra    d0,gpi1
  248.  
  249.     move.l    table,a1
  250.     move.l    piclength,d0
  251.     clr.w    d1
  252.     clr.w    d2
  253.     move.l    m_alloc(a1),a1
  254.     jsr    (a1)
  255.         beq     errrts
  256.     move.l    a0,picture
  257.  
  258.         move.l  #16384,d0
  259.         clr.l   d1
  260.         clr.l   d2
  261.         move.l  table,a1
  262.         move.l  m_alloc(a1),a1
  263.         jsr     (a1)
  264.         beq     errrts
  265.         move.l  a0,prefix
  266.  
  267.         move.l  #16384,d0
  268.         clr.l   d1
  269.         clr.l   d2
  270.         move.l  table,a1
  271.         move.l  m_alloc(a1),a1
  272.         jsr     (a1)
  273.         beq     errrts
  274.         move.l  a0,suffix
  275.         
  276.         move.l  #4100,d0
  277.         clr.l   d1
  278.         clr.l   d2
  279.         move.l  table,a1
  280.         move.l  m_alloc(a1),a1
  281.         jsr     (a1)
  282.         beq     errrts
  283.         move.l  a0,outcode
  284.         
  285.         move.l  picture,a0
  286.     move.l    (a0),a0                 ;read the file into memory 
  287.     move.l    piclength,d0
  288.     move.l    table,a1
  289.     move.l    f_getr(a1),a1
  290.     jsr    (a1)
  291.     beq    errrts
  292.         
  293.         move.l  picture,a0
  294.         move.l  (a0),a0
  295.         
  296.         add.l   #10,a0                  ;skip the signature and the screen res
  297.         move.b  (a0)+,d0
  298.         btst    #7,d0                   ;check for a global color map
  299.         beq     gpi2
  300.         
  301.         move.b  d0,d1
  302.         and.b   #112,d1                 ;get bits 6,5,4 into d0
  303.         lsr.b   #4,d1
  304.         addq.b  #1,d1
  305.         move.b  d1,gbitcres             ;bits of color resolution (global)
  306.         
  307.         and.w   #7,d0                   ;get bits 2,1,0 into d0
  308.         addq.b  #1,d0
  309.         move.b  d0,gbpp                 ;bits per pixel (global)
  310.         move.w  d0,pic+pc_BitPln
  311.  
  312.         move.b  (a0)+,d0                ;get the background color
  313.         move.b  d0,gbgcolor                       
  314.         addq.l  #1,a0                   ;point a0 to the color map
  315.         
  316.         clr.l   d1                      ;calculate the number of bytes in cmap
  317.         move.b  gbpp,d1
  318.         subq.b  #1,d1
  319.         moveq.l #2,d0
  320.         lsl.l   d1,d0
  321.         move.w  d0,gnumcolors
  322.         move.w  d0,pic+pc_Palet
  323.         mulu    #3,d0
  324.         move.l  d0,gcmapsize
  325.         move.l  a0,gcmap                ;a0 = start of global color map
  326.         
  327.         add.l   d0,a0                   ;move file pointer past gcm
  328.         
  329. gpi2:   move.l  a0,pptr                 ;save it
  330.  
  331.         lea    pic,a0
  332.     move.w    #-1,pc_SFreq(a0)
  333.     move.w    #-1,pc_SAngle(a0)
  334.     move.w    #0,pc_SSpot(a0)
  335.     move.l    #0,pc_SMap(a0)
  336.     move.l    #0,pc_SMap+4(a0)
  337.     move.w    #72,pc_XDpi(a0)
  338.     move.w    #72,pc_YDpi(a0)
  339.  
  340.     rts
  341.  
  342.  
  343. ***********************************
  344. ***                ***
  345. ***********************************
  346. getpicdes:
  347.         move.l  gcmap,d0
  348.         move.l  d0,lcmap             ;default if there is no local cmap
  349.         move.l  gcmapsize,d1
  350.         move.l  d1,lcmapsize
  351.         move.b  gbpp,d2
  352.         move.b  d2,lbpp
  353.         move.b  gbgcolor,d3
  354.         move.b  d3,lbgcolor
  355.         move.b  gbitcres,d4
  356.         move.b  d4,lbitcres
  357.         
  358.         bsr     skipextenders
  359.         
  360.         move.l  pptr,a0
  361.         addq.l  #5,a0                   ;skip the comma, left and top edge 
  362.         
  363.         move.b  (a0)+,tempw+1           ;intel format
  364.         move.b  (a0)+,tempw
  365.         move.w  tempw,d0
  366.         move.w  d0,pic+pc_W
  367.     add.w    #15,d0
  368.     lsr.w    #3,d0
  369.     bclr    #0,d0
  370.     move.w    d0,pic+pc_Width
  371.         move.b  (a0)+,tempw+1
  372.         move.b  (a0)+,tempw
  373.         move.w  tempw,d0
  374.         move.w  d0,pic+pc_H
  375.         
  376.         move.b  (a0)+,d0
  377.         bclr    #0,flag                 ;clear the image interlace flag
  378.         btst    #6,d0
  379.         beq     gp1
  380.         bset    #0,flag                 ;the image is stored as interlace 
  381.         
  382. gp1:    btst    #7,d0                   ;do I use the global or local cmap
  383.         beq     gp2                     ;use the global cmap stuff
  384.         
  385.         and.w   #7,d0                   ;mask off pixel value (lower 3 bits)
  386.         addq.b  #1,d0
  387.         move.b  d0,lbpp                 ;store the bits per pixel
  388.         move.w  d0,pic+pc_BitPln
  389.         
  390.         clr.l   d1                      ;calculate the # of bytes in the lcmap
  391.         move.b  d0,d1
  392.         subq.b  #1,d1
  393.         moveq.l #2,d0
  394.         lsl.l   d1,d0
  395.         move.w  d0,lnumcolors
  396.         move.w  d0,pic+pc_Palet
  397.         mulu    #3,d0
  398.         move.l  d0,lcmapsize
  399.         move.l  a0,lcmap                ;a0 = start of the local color map
  400.         
  401.         add.l   d0,a0                   ;move a0 past the cmap stuff
  402.         
  403.         move.b  #PC_PALET,pic+pc_Type
  404.         
  405. gp2:    move.l  a0,pptr
  406.         rts
  407.         
  408. ***********************************
  409. ***                ***
  410. ***********************************        
  411. skipextenders:
  412.         clr.l   d0
  413.         move.l  pptr,a0
  414.         cmp.b   #'!',(a0)               ;is a gif extender present?
  415.         bne     se3                     ;no
  416.         addq.l  #2,a0                   ;skip the ! and the function code
  417.  
  418. se1:    move.b  (a0)+,d0                ;get the length of the extention
  419.         beq     se2                     ;when 0 - it is the end
  420.         add.l   d0,a0                   ;skip data
  421.         bra     se1
  422.                 
  423. se2:    move.l  a0,pptr        
  424. se3:    rts
  425.  
  426.  
  427. ***********************************************************
  428. ***                            ***
  429. ***********************************************************
  430. putcolor:
  431.     move.w    pic+pc_Palet,d3
  432.  
  433.     move.l    picptr,a0
  434.     move.l    lcmap,a1
  435.     bra    pc4
  436.  
  437. pc1:    move.b    (a1)+,d0                ;red
  438.     and.w    #$ff,d0
  439.     mulu    #65535,d0
  440.     divu    #240,d0
  441.     move.w    d0,(a0)
  442.         
  443.     move.b  (a1)+,d0                ;green
  444.     and.w    #$ff,d0
  445.     mulu    #65535,d0
  446.     divu    #240,d0
  447.     move.w    d0,2(a0)
  448.         
  449.     move.b  (a1)+,d0        ;blue
  450.     and.w    #$ff,d0
  451.     mulu    #65535,d0
  452.     divu    #240,d0
  453.     move.w    d0,4(a0)
  454.  
  455.     move.w    (a0)+,d0
  456.     move.w    (a0)+,d1
  457.     move.w    (a0)+,d2
  458.     mulu    #19661,d0
  459.     mulu    #38666,d1
  460.     mulu    #7209,d2
  461.     add.l    d1,d0
  462.     add.l    d2,d0
  463.     swap    d0
  464.     cmp.w    #$8000,d0
  465.     bcc    pc2
  466.     moveq    #1,d0
  467.     bra    pc3
  468. pc2:    moveq    #0,d0
  469. pc3:    move.w    d0,(a0)+        ;calculate on screen color (B or W)
  470.  
  471. pc4:    dbf    d3,pc1
  472.     move.l    a0,picptr               ;set a0 to start of amiga bitmap
  473.     rts
  474.  
  475.  
  476. ***********************************
  477. ***                ***
  478. ***********************************
  479. putpic:
  480. ;       move.w    pic+pc_Width,d0         ;set amiga bitmap to all white ($ff)
  481. ;    mulu    pic+pc_BitPln,d0
  482. ;    mulu    pic+pc_H,d0
  483. ;    move.l    d0,d1
  484. ;    swap    d1
  485. ;    move.l    picptr,a0
  486. ;    bra    pp2
  487. ;pp1:    move.b    #$ff,(a0)+
  488. ;pp2:    dbf    d0,pp1
  489. ;    dbf    d1,pp1
  490.  
  491.         move.l  picptr,apos1            ;for cpystr stuff
  492.         move.l  picptr,apos2            ;
  493.         move.w  #7,bitcount             ; "      
  494.         move.w  #0,plncnt               ; "
  495.         move.w  pic+pc_W,d0             ; "
  496.         subq.w  #1,d0                   ; "
  497.         move.w  d0,pixcount             ; "
  498.         clr.l   d0                      ; "
  499.         move.w  pic+pc_Width,d0         ; "
  500.         mulu    pic+pc_H,d0             ; "
  501.         move.l  d0,plnlen               ; "
  502.         
  503.         move.l  pptr,a0
  504.         clr.w   d0
  505.         move.b  (a0)+,d0        ;get smallest code length
  506.         move.w  d0,codelength   ;initial code length is codelength bits
  507.         move.l  a0,pptr
  508.         
  509.         clr.l   d0
  510.         move.b  lbpp,d0
  511.         move.l  #1,d1
  512.         lsl.l   d0,d1
  513.         subq.l  #1,d1
  514.         move.l  d1,bitmask
  515.                 
  516.         clr.w   pass                    ;for interlaced gif pictures
  517.         clr.w   hcount
  518.         
  519.         bsr     setuplzwdata            ;sets up picture to have only LZW data
  520.         
  521.         move.l  outcode,a0
  522.         move.l  (a0),-(sp)
  523.         move.l  suffix,a0
  524.         move.l  (a0),-(sp)
  525.         move.l  prefix,a0
  526.         move.l  (a0),-(sp)
  527.         move.l  bitmask,-(sp)
  528.         move.w  codelength,d0
  529.         move.l  d0,-(sp)
  530.         move.l  picture,a0
  531.         move.l  (a0),-(sp)              ;pointer to LZW data
  532.         move.l  picptr,-(sp)            ;pointer to amiga bitmap
  533.         bsr     doGIF
  534.         add.l   #28,sp                  ;clean up stack
  535.   
  536.         bra     purgepic
  537.  
  538. ********************************
  539. ***                          ***
  540. ********************************
  541. readcode:
  542.         movem.l d3-d5/a2-a3,-(a7)
  543.         movea.l 24(a7),a3
  544.         move.l  28(a7),d5
  545.         movea.l 36(a7),a2
  546.         move.l  (a3),d1
  547.         lsr.l   #3,d1
  548.         moveq   #0,d3
  549.         move.b  1(a2,d1.l),d3
  550.         moveq   #0,d4
  551.         not.b   d4
  552.         and.l   d4,d3
  553.         asl.l   #8,d3
  554.         moveq   #0,d0
  555.         move.b  0(a2,d1.l),d0
  556.         and.l   d4,d0
  557.         add.l   d3,d0
  558.         cmp.l   #8,d5
  559.         bcs.b   rc1
  560.        
  561.         moveq   #0,d3
  562.         move.b  2(a2,d1.l),d3
  563.         and.l   d4,d3
  564.         swap    d3
  565.         clr.w   d3
  566.         add.l   d3,d0
  567.         
  568. rc1:    move.l  (a3),d1
  569.         add.l   d5,(a3)
  570.         and.l   #7,d1
  571.         lsr.l   d1,d0
  572.         and.l   32(a7),d0
  573.         movem.l (a7)+,d3-d5/a2-a3
  574.         rts
  575.        
  576. ********************************
  577. ***                          ***
  578. ********************************
  579. doGIF:       
  580.         link      a5,#$ffc0
  581.         movem.l   d2-d7/a2-a3,-(a7)
  582.         movea.l   32(a5),a3
  583.         move.l    16(a5),d7
  584.         moveq     #1,d0
  585.         move.l    d0,d1
  586.         asl.l     d7,d1
  587.         move.l    d1,d2
  588.         addq.l    #1,d2
  589.         move.l    d1,d3
  590.         addq.l    #2,d3
  591.         move.l    d7,d4
  592.         addq.l    #1,d4
  593.         move.l    d1,44(a7)
  594.         move.l    d4,d1
  595.         move.l    d1,32(a7)
  596.         move.l    d0,d1
  597.         asl.l     d4,d1
  598.         move.l    d1,d7
  599.         move.l    d7,d0
  600.         subq.l    #1,d0
  601.         moveq     #0,d1
  602.         move.l    d1,-36(a5)
  603.         move.l    d1,d6
  604.         movea.l   12(a5),a2
  605.         move.l    a2,-(a7)
  606.         move.l    d0,-(a7)
  607.         move.l    d4,-(a7)
  608.         pea       -36(a5)
  609.         move.l    d0,-28(a5)
  610.         move.l    d2,56(a7)
  611.         move.l    d3,-24(a5)
  612.         move.l    d3,52(a7)
  613.         bsr.w     readcode
  614.         lea       16(a7),a7
  615.         move.l    d0,d5
  616.         moveq     #1,d0
  617.         move.l    d0,-40(a5)
  618.         bra.w     dg7
  619.        
  620. dg0:    cmp.l     44(a7),d5
  621.         bne.b     dg1
  622.        
  623.         move.l    32(a7),d4
  624.         moveq     #1,d0
  625.         move.l    d0,d1
  626.         asl.l     d4,d1
  627.         move.l    d1,d7
  628.         move.l    d7,d0
  629.         subq.l    #1,d0
  630.         move.l    36(a7),-24(a5)
  631.         move.l    a2,-(a7)
  632.         move.l    d0,-(a7)
  633.         move.l    d4,-(a7)
  634.         pea       -36(a5)
  635.         move.l    d0,-28(a5)
  636.         bsr.w     readcode
  637.         move.l    d0,d5
  638.         move.l    d5,d0
  639.         and.l     20(a5),d0
  640.         move.l    d0,(a7)
  641.         move.l    d0,-48(a5)
  642.         bsr       addtopix2
  643.         lea       16(a7),a7
  644.         bra.w     dg6
  645.        
  646. dg1:    move.l    d5,d7
  647.         cmp.l     -24(a5),d7
  648.         bcs.b     dg2
  649.         move.l    -44(a5),d7
  650.         moveq     #1,d6
  651.         move.l    -48(a5),(a3)
  652.         
  653. dg2:    move.l    d6,d0
  654.         asl.l     #2,d0
  655.         movea.l   a3,a2
  656.         adda.l    d0,a2
  657.         bra.b     dg3
  658.        
  659. dg21:   addq.l    #1,d6
  660.         move.l    d7,d0
  661.         asl.l     #2,d0
  662.         movea.l   28(a5),a0
  663.         move.l    0(a0,d0.l),(a2)+
  664.         movea.l   24(a5),a0
  665.         move.l    0(a0,d0.l),d7
  666.         
  667. dg3:    cmp.l     20(a5),d7
  668.         bhi.b     dg21
  669.        
  670.         and.l     20(a5),d7
  671.         move.l    d7,-48(a5)
  672.         move.l    d7,(a2)
  673.         move.l    d6,d0
  674.         asl.l     #2,d0
  675.         movea.l   a3,a2
  676.         adda.l    d0,a2
  677.         bra.b     dg5
  678.        
  679. dg4:    move.l    (a2),-(a7)
  680.         bsr       addtopix2
  681.         addq.w    #4,a7
  682.         subq.l    #4,a2
  683.         
  684. dg5:    cmpa.l    a3,a2
  685.         bcc.b     dg4
  686.        
  687.         moveq     #0,d6
  688.         move.l    -24(a5),d0
  689.         move.l    d0,d1
  690.         asl.l     #2,d1
  691.         movea.l   24(a5),a0
  692.         move.l    -44(a5),0(a0,d1.l)
  693.         movea.l   28(a5),a0
  694.         move.l    d7,0(a0,d1.l)
  695.         addq.l    #1,-24(a5)
  696.         move.l    -32(a5),d7
  697.         move.l    -24(a5),d0
  698.         cmp.l     d7,d0
  699.         bcs.b     dg6
  700.        
  701.         moveq     #12,d0
  702.         cmp.l     d0,d4
  703.         bcc.b     dg6
  704.        
  705.         addq.l    #1,d4
  706.         add.l     d7,d7
  707.         moveq     #1,d0
  708.         move.l    d0,d1
  709.         asl.l     d4,d1
  710.         subq.l    #1,d1
  711.         move.l    d1,-28(a5)
  712.  
  713. dg6:    move.l    d5,-44(a5)
  714.         movea.l   12(a5),a2
  715.         move.l    a2,-(a7)
  716.         move.l    -28(a5),-(a7)
  717.         move.l    d4,-(a7)
  718.         pea       -36(a5)
  719.         bsr.w     readcode
  720.         lea       16(a7),a7
  721.         move.l    d0,d5
  722.         addq.l    #1,-40(a5)
  723.        
  724. dg7:    move.l    d7,-32(a5)
  725.         cmp.l     40(a7),d5
  726.         bne.w     dg0
  727.        
  728.         move.l    -40(a5),d0
  729.         movem.l   (a7)+,d2-d7/a2-a3
  730.         unlk      a5
  731.         rts
  732.         
  733. **********************************
  734. **                              **
  735. **********************************
  736. setuplzwdata:
  737.         move.l  pptr,a0
  738.         move.l  picture,a1
  739.         move.l  (a1),a1
  740.         
  741. set0:   clr.w   d0
  742.         clr.w   d1
  743.         move.b  (a0)+,d0                ;get length of block
  744.         move.b  d0,d1
  745.         bra     set2
  746. set1:   move.b  (a0)+,(a1)+             ;copy block
  747. set2:   dbf    d0,set1
  748.         dbf     d1,set0                 ;not a real dbf - it will branch back
  749.         rts                             ;if the length of the block is not 0
  750.                 
  751. **********************************
  752. **                              **
  753. **********************************
  754. addtopix2:
  755.         move.l  4(sp),d0        ;get the code off the stack into d0
  756.         movem.l d0-d7/a0-a6,-(sp)
  757.  
  758. cp0:    move.l  apos2,a2        ;restore place in amiga bitmap - plane x
  759.         move.l  apos1,a1        ;restore place in amiga bitmap - plane 1
  760.         move.l  plnlen,d7       ;d7 = amiga bitplane length in bytes
  761.         move.w  bitcount,d5     ;restore bit place in a2
  762.         move.w  plncnt,d1       ;restore plane counter
  763.         move.w  pixcount,d6     ;restore pixel counter
  764.         moveq    #0,d3           ;d1 = bit position in gif data
  765.  
  766. cp1:    btst    d3,d0           ;is the data bit on or off
  767.     beq    cp3             ;off
  768.     bset    d5,(a2)
  769.     bra    cp4
  770. cp3:    bclr    d5,(a2)
  771.         
  772. cp4:    add.l    d7,a2           ;go to next bitplane
  773.     addq.w    #1,d1           ;update bitplane counter
  774.         
  775.         cmp.w    pic+pc_BitPln,d1
  776.     bcs    cp7
  777.         
  778.         moveq    #0,d1           ;reset bitplane counter
  779.         move.l  a1,a2           ;reset a2 to first bitplane
  780.         
  781. cp5:    dbf    d5,cp6          ;update amiga bit pos
  782.     addq.l    #1,a1           ;move to next amiga bitmap byte
  783.         addq.l  #1,a2
  784.     moveq    #7,d5           ;reset d5 to top of byte
  785.         
  786. cp6:    dbf    d6,cp7          ;update pixel width counter
  787.         
  788.         btst    #0,flag         ;is this an interlaced image?
  789.         beq     cp64            ;no
  790.         
  791.         move.l  picptr2,a1
  792.  
  793.         cmp.w   #0,pass         ;pass 1
  794.         bne     cp61
  795.         clr.l   d4              ;move ahead 8 rows
  796.         move.w  pic+pc_Width,d4
  797.         lsl.l   #3,d4
  798.         add.l   d4,a1
  799.         move.l  a1,picptr2
  800.         move.l  a1,a2
  801.         add.w   #8,hcount
  802.         
  803.         move.w  hcount,d4       ;am I done with this pass?
  804.         cmp.w   pic+pc_H,d4
  805.         bcs     cp65            ;no
  806.         
  807.         addq.w  #1,pass         ;go to next pass 
  808.         move.l  picptr,a1       ;move to the fifth row
  809.         clr.l   d4
  810.         move.w  pic+pc_Width,d4
  811.         lsl.w   #2,d4
  812.         add.l   d4,a1
  813.         move.l  a1,picptr2
  814.         move.l  a1,a2
  815.         move.w  #5,hcount
  816.         bra     cp65
  817.         
  818. cp61:   cmp.w   #1,pass         ;pass 2
  819.         bne     cp62
  820.         clr.l   d4
  821.         move.w  pic+pc_Width,d4 ;move ahead 8 rows
  822.         lsl.l   #3,d4
  823.         add.l   d4,a1
  824.         move.l  a1,picptr2
  825.         move.l  a1,a2
  826.         add.w   #8,hcount
  827.         
  828.         move.w  hcount,d4       ;am I done with this pass?
  829.         cmp.w   pic+pc_H,d4
  830.         bcs     cp65            ;no
  831.         
  832.         addq.w  #1,pass         ;next pass please
  833.         move.l  picptr,a1       ;move to the third row
  834.         clr.l   d4
  835.         move.w  pic+pc_Width,d4
  836.         lsl.l   #1,d4
  837.         add.l   d4,a1
  838.         move.l  a1,picptr2
  839.         move.l  a1,a2
  840.         move.w  #3,hcount
  841.         bra     cp65
  842.         
  843. cp62:   cmp.w   #2,pass         ;pass 3
  844.         bne     cp63
  845.         clr.l   d4
  846.         move.w  pic+pc_Width,d4 ;move ahead 4 rows
  847.         lsl.l   #2,d4
  848.         add.l   d4,a1
  849.         move.l  a1,picptr2
  850.         move.l  a1,a2
  851.         add.w   #4,hcount
  852.         
  853.         move.w  hcount,d4       ;am I done with this pass?
  854.         cmp.w   pic+pc_H,d4
  855.         bcs     cp65            ;no
  856.         
  857.         addq.w  #1,pass         ;next pass please
  858.         move.l  picptr,a1       ;move to the second row
  859.         clr.l   d4
  860.         move.w  pic+pc_Width,d4
  861.         add.l   d4,a1
  862.         move.l  a1,picptr2
  863.         move.l  a1,a2
  864.         move.w  #2,hcount
  865.         bra     cp65
  866.         
  867. cp63:   clr.l   d4              ;pass 4
  868.         move.w  pic+pc_Width,d4 ;move ahead 2 rows
  869.         lsl.l   #1,d4
  870.         add.l   d4,a1
  871.         move.l  a1,picptr2
  872.         move.l  a1,a2
  873.         bra     cp65
  874.  
  875. cp64:   move.l  picptr2,a1
  876.         add.w   pic+pc_Width,a1
  877.         move.l  a1,picptr2
  878.         move.l  a1,a2        
  879.                                 
  880. cp65:   move.w  #7,d5
  881.         move.w  pic+pc_W,d6
  882.         subq.w  #1,d6
  883.      
  884. cp7:    addq.w  #1,d3           ;update gif bit counter
  885.         cmp.w   pic+pc_BitPln,d3
  886.         bcs     cp1
  887.         
  888. cp81:   move.l  a2,apos2        ;save place in amiga bitmap - plane x
  889.         move.l  a1,apos1        ;save place in amiga bitmap - plane 1
  890.         move.w  d5,bitcount     ;save bit place in a2
  891.         move.w  d1,plncnt       ;save plane counter
  892.         move.w  d6,pixcount     ;save pixel counter
  893.         
  894.         movem.l (sp)+,d0-d7/a0-a6
  895.         rts
  896.         
  897. ***********************************
  898. ***                ***
  899. ***********************************
  900. Mulu1632:
  901.         move.l  table,a0
  902.         move.l  mulu1632(a0),a0
  903.         jmp     (a0)
  904.  
  905.         
  906. ***********************************
  907. ***                ***
  908. ***********************************
  909. Divu1648:
  910.         move.l  table,a0
  911.         move.l  divu1648(a0),a0
  912.         jmp     (a0)
  913.  
  914.  
  915. ***********************************
  916. ***                ***
  917. ***********************************
  918. errrts: bsr     purgepic
  919.         move.l    savesp,sp
  920.         move.l  table,a0        ;clean up and exit
  921.         move.l  spclnum(a0),a0
  922.         cmp.w   #1,(a0)
  923.         beq     abortobj
  924.         bra     abortpic      
  925.  
  926. rrts:    rts
  927.  
  928.  
  929. ***********************************
  930. ***                             ***
  931. ***********************************
  932. purgepic:
  933.     tst.l    picture
  934.     beq    pu1
  935.     move.l    picture,a0
  936.     move.l    table,a1
  937.     move.l    m_delete(a1),a1
  938.     jsr    (a1)
  939.  
  940. pu1:    tst.l   prefix
  941.         beq     pu2
  942.         move.l    prefix,a0
  943.     move.l    table,a1
  944.     move.l    m_delete(a1),a1
  945.     jsr    (a1)
  946.  
  947. pu2:    tst.l   suffix
  948.         beq     pu3
  949.         move.l    suffix,a0
  950.     move.l    table,a1
  951.     move.l    m_delete(a1),a1
  952.     jsr    (a1)        
  953.  
  954. pu3:    tst.l   outcode
  955.         beq     pu4
  956.         move.l    outcode,a0
  957.     move.l    table,a1
  958.     move.l    m_delete(a1),a1
  959.     jsr    (a1)
  960.  
  961. pu4:    rts
  962.  
  963.  
  964. *******************************************************************
  965. ***    called when the import routine choosen finds something    ***
  966. ***    wrong with the file loaded.                ***
  967. *******************************************************************
  968. never:    clr.w    d0
  969.     rts
  970.  
  971. maybe:    move.w    #1,d0
  972.     rts
  973.  
  974. right:    move.w    #2,d0
  975.     rts
  976.  
  977.  
  978.  
  979. *************************************************************
  980. *************************************************************
  981.  SECTION GIF,DATA,PUBLIC
  982.  
  983. special:
  984.     dc.w    2
  985.     dc.l    spcl1,spcl2
  986.  
  987. name:    dc.b    "GIF  v2.0.2",0
  988.  
  989. spcl1:    dc.b    "Picture Window",0
  990. spcl2:    dc.b    "Object",0
  991.  
  992.  
  993. ***************************************************************
  994. ***************************************************************
  995.  SECTION GIF,BSS,PUBLIC
  996. temp:        ds.l    1
  997. temp2:        ds.l    1
  998. flag:           ds.l    1
  999. savesp:        ds.l    1
  1000. picptr:        ds.l    1
  1001. picptr2:        ds.l    1
  1002. pptr:        ds.l    1
  1003. pic:        ds.w    pc_Sizeof/2
  1004. object:        ds.w    ob_SizeOf/2
  1005.  
  1006. picture:    ds.l    1
  1007. piclength:    ds.l    1
  1008. gcmap:          ds.l    1
  1009. gcmapsize:      ds.l    1
  1010. lcmap:          ds.l    1
  1011. lcmapsize:      ds.l    1
  1012. gbitcres:       ds.b    1
  1013. gbpp:           ds.b    1
  1014. gbgcolor:       ds.b    1
  1015. lbitcres:       ds.b    1
  1016. lbpp:           ds.b    1
  1017. lbgcolor:       ds.b    1
  1018. gnumcolors:     ds.w    1
  1019. lnumcolors:     ds.w    1
  1020. tempw:          ds.w    1
  1021. bitcount:       ds.w    1
  1022. plncnt:         ds.w    1
  1023. pixcount:       ds.w    1
  1024. apos1:          ds.l    1
  1025. apos2:          ds.l    1
  1026. codelength:     ds.w    1
  1027. plnlen:         ds.l    1
  1028. pass:           ds.w    1
  1029. hcount:         ds.w    1
  1030. bitmask:        ds.l    1
  1031. prefix:         ds.l    1
  1032. suffix:         ds.l    1
  1033. outcode:        ds.l    1
  1034.  
  1035.  
  1036. ***************************** CHANGES ****************************************
  1037. ;
  1038. ;       version 2.0.2   (uploaded 11/07/90)
  1039. ;
  1040. ;       - added new LZW decompression code from code written in C
  1041. ;         on the mac for an increase in the decompression speed
  1042. ;         (readcode & doGIF)
  1043. ;
  1044. ;
  1045. ;       version 2.0.1
  1046. ;
  1047. ;       - changed linked list table to a static 4096 entry table
  1048. ;
  1049. ;
  1050. ;       version 2.0.0 (uploaded 11/02/90)
  1051. ;
  1052. ;       - initial release
  1053.