home *** CD-ROM | disk | FTP | other *** search
/ Crawly Crypt Collection 2 / crawlyvol2.bin / apps / dtp / pgsmodst / atariimp / pcx.s < prev    next >
Text File  |  1991-06-17  |  22KB  |  1,005 lines

  1.  
  2.  Include "equ.h"
  3.  Include "impequ.h"
  4.  
  5.  SECTION PCX,CODE,PUBLIC
  6.  
  7. ***************************************************
  8. ***                        ***
  9. ***************************************************
  10. dumbentry:
  11.     clr.l    d0
  12.     rts
  13.  
  14.     dc.l    "IMPP"        ; magik number for pic import
  15.     dc.w    200
  16.     dc.l    0
  17.  
  18. table:    dc.l    0
  19.     dc.l    name,special,check,PCX
  20.  
  21.  
  22. *****************************
  23. * Is it really a PCX pic?   *
  24. *****************************
  25. check:    move.l    table,a0
  26.     move.l    buff1(a0),a1
  27.     move.l    (a1),a1
  28.     cmp.b    #10,(a1)
  29.     bne    never
  30.     bra    right
  31.  
  32. rrts:   rts
  33.  
  34. ***********************************
  35. ***                             ***
  36. ***********************************
  37. PCX:    move.l    sp,savesp
  38.         clr.l   palhndl
  39.         clr.b   flag
  40.  
  41.     move.l    table,a0
  42.     move.l    f_openr(a0),a0
  43.     jsr    (a0)
  44.     beq    rrts
  45.  
  46.     move.l    table,a0
  47.     move.l    spclnum(a0),a0
  48.     cmp.w    #1,(a0)
  49.     beq    impobj
  50.         
  51.         
  52. *********************************
  53. *                               *
  54. *********************************
  55. imppic:    move.l    table,a0
  56.     move.l    p_open(a0),a0
  57.     jsr    (a0)
  58.     beq    rrts
  59.  
  60.     bsr    getpicinfo
  61.  
  62.     move.l    table,a4
  63.     move.l    cwptr(a4),a4        ;ptr to window handle
  64.     move.l    (a4),a4            ;window handle
  65.     move.l    (a4),a4            ;ptr to window structure
  66.         
  67.     lea    pic,a0
  68.     move.w    pc_Type(a0),pi_Type(a4)
  69.     move.w    pc_SFreq(a0),pi_SFreq(a4)
  70.     move.w    pc_SAngle(a0),pi_SAngle(a4)
  71.     move.w    pc_SSpot(a0),pi_SSpot(a4)
  72.     move.l    pc_SMap(a0),pi_SMap(a4)
  73.     move.l    pc_SMap+4(a0),pi_SMap+4(a4)
  74.     move.w    pc_XDpi(a0),pi_XDpi(a4)
  75.     move.w    pc_YDpi(a0),pi_YDpi(a4)
  76.     move.w    pc_W(a0),pi_W(a4)
  77.     move.w    pc_H(a0),pi_H(a4)
  78.     move.w    pc_Width(a0),pi_Width(a4)
  79.     move.w    pc_BitPln(a0),pi_BitPln(a4)
  80.     move.w    pc_Palet(a0),pi_Palet(a4)
  81.  
  82.     move.w    pi_Palet(a4),d1
  83.     mulu    #pl_Sizeof,d1
  84.     move.w    pi_Width(a4),d0
  85.     mulu    pi_BitPln(a4),d0
  86.     mulu    pi_H(a4),d0
  87.     add.l    d1,d0        ;size of bitmap +( 4 words * #colors)
  88.  
  89.     clr.w    d1
  90.     clr.w    d2
  91.     move.l    table,a0
  92.     move.l    m_alloc(a0),a0
  93.     jsr    (a0)
  94.     beq    abortpic
  95.  
  96.     move.l    table,a3
  97.     move.l    cwptr(a3),a3
  98.     move.l    (a3),a3
  99.     move.l    (a3),a3
  100.     move.l    a0,pi_Ptr(a3)
  101.     move.l    (a0),a4
  102.     move.l    a4,picptr
  103.         move.l  a4,palptr
  104.  
  105.         cmp.b   #2,version
  106.         bne     imp0
  107.     bsr    putcolor
  108.         bra     impic2
  109.  
  110. imp0:   cmp.b   #5,version
  111.         bne     impic2
  112.         cmp.w   #256,numcolors
  113.         bne     impic2
  114.         
  115.         clr.l   d0
  116.         move.w  numcolors,d0
  117.         move.w  d0,temp
  118.     mulu    #pl_Sizeof,d0
  119.         add.l   d0,a4
  120.         move.l  a4,picptr
  121.  
  122. impic2: bsr    putpic
  123.         
  124.         cmp.b   #5,version
  125.         bne     impic3
  126.         cmp.w   #256,numcolors
  127.         bne     impic3
  128.         
  129. imp21:  bsr     pget
  130.         cmp.b   #$0c,d0
  131.         bne     imp21
  132.         bsr     cmap
  133.     bsr    putcolor
  134.  
  135. impic3:    move.l    table,a0
  136.     move.l    p_close(a0),a0
  137.     jsr    (a0)
  138.  
  139.     move.l    table,a0
  140.     move.l    f_closer(a0),a0
  141.     jmp    (a0)
  142.  
  143.  
  144. abortpic:
  145.     move.l    table,a0
  146.     move.l    p_abort(a0),a0
  147.     jsr    (a0)
  148.  
  149. abort0:    move.l    table,a0
  150.     move.l    f_closer(a0),a0
  151.     jmp    (a0)
  152.  
  153.  
  154. *********************************
  155. *                               *
  156. *********************************
  157. impobj:    move.l    table,a0
  158.     move.l    o_open(a0),a0
  159.     jsr    (a0)
  160.     beq    abort0
  161.  
  162.     bsr    getpicinfo
  163.         
  164.     move.b    #tpic,object+ob_Type
  165.     clr.l    object+ob_Left
  166.     clr.l    object+ob_Top
  167.  
  168.     move.w    pic+pc_W,d1
  169.     move.l    #7200,d0
  170.     bsr    Mulu1632
  171.     move.w    pic+pc_XDpi,d2
  172.     bsr    Divu1648
  173.     move.l    d0,object+ob_Right
  174.  
  175.     move.w    pic+pc_H,d1
  176.     move.l    #7200,d0
  177.     bsr    Mulu1632
  178.     move.w    pic+pc_YDpi,d2
  179.     bsr    Divu1648
  180.     move.l    d0,object+ob_Bottom
  181.  
  182.     clr.b    object+ob_Flag
  183.     clr.w    object+ob_Slant
  184.     clr.w    object+ob_Twist
  185.     move.w    #50,object+ob_LWidth        ;1 point line
  186.     clr.b    object+ob_LType            ;no line
  187.     move.b    #1,object+ob_LColor        ;black line
  188.     clr.b    object+ob_FType            ;no fill
  189.     move.b    #1,object+ob_FColor        ;black fill
  190.     clr.b    object+ob_LBegin
  191.     clr.b    object+ob_LEnd
  192.     move.w    #900,object+ob_HStandOff    ;1/8 inch
  193.     move.w    #900,object+ob_VStandOff    ;1/8 inch
  194.  
  195.     move.l    table,a1
  196.     move.l    o_obj(a1),a1
  197.     lea    object,a0
  198.     jsr    (a1)
  199.     beq    abortobj
  200.  
  201.     move.w    pic+pc_Width,d0
  202.     mulu    pic+pc_BitPln,d0
  203.     mulu    pic+pc_H,d0
  204.     move.w    pic+pc_Palet,d1
  205.     mulu    #pl_Sizeof,d1
  206.     add.l    d1,d0
  207.     add.l    #pc_Sizeof,d0
  208.  
  209.     move.l    table,a0
  210.     move.l    o_malloc(a0),a0
  211.     jsr    (a0)
  212.     beq    abortobj
  213.  
  214.     lea    pic,a1
  215.     clr.l    pc_DPtr(a1)
  216.     clr.w    pc_DScale(a1)
  217.     move.w    pc_Palet(a1),d0
  218.     mulu    #pl_Sizeof,d0
  219.     add.l    #pc_Sizeof,d0
  220.     move.l    d0,pc_Ptr(a1)
  221.  
  222.     move.w    #pc_Sizeof/2-1,d0
  223. oppic1:    move.w    (a1)+,(a0)+
  224.     dbf    d0,oppic1
  225.         move.l  a0,palptr
  226.         move.l    a0,picptr
  227.  
  228.         cmp.b   #2,version
  229.         bne     oppic2
  230.     bsr    putcolor
  231.         bra     iop20
  232.         
  233. oppic2: cmp.b   #5,version
  234.         bne     iop20
  235.         cmp.w   #256,numcolors
  236.         bne     iop20
  237.         
  238.         clr.l   d0
  239.         move.w  numcolors,d0
  240.         move.w  d0,temp
  241.     mulu    #pl_Sizeof,d0
  242.         add.l   d0,a0
  243.         move.l  a0,picptr
  244.  
  245. iop20:  bsr    putpic
  246.         
  247.         cmp.b   #5,version
  248.         bne     oppic3
  249.         cmp.w   #256,numcolors
  250.         bne     oppic3
  251.         
  252. iop21:  bsr     pget
  253.         cmp.b   #$0c,d0
  254.         bne     iop21
  255.         bsr     cmap
  256.     bsr    putcolor
  257.  
  258. oppic3:    move.l    table,a0
  259.         move.l    o_close(a0),a0
  260.     jsr    (a0)
  261.  
  262.     move.l    table,a0
  263.     move.l    f_closer(a0),a0
  264.     jmp    (a0)
  265.  
  266.  
  267. abortobj:
  268.     move.l    table,a0
  269.     move.l    o_abort(a0),a0
  270.     jsr    (a0)
  271.  
  272.     move.l    table,a0
  273.     move.l    f_closer(a0),a0
  274.     jmp    (a0)
  275.         
  276.         
  277. *********************************
  278. *                               *
  279. *********************************
  280. getpicinfo:
  281.     lea    pic,a0
  282.     move.w    #pc_Sizeof-1,d0
  283. gpi1:    clr.b    (a0)+
  284.     dbra    d0,gpi1
  285.  
  286.         move.w    #-1,pic+pc_SFreq
  287.     move.w    #-1,pic+pc_SAngle
  288.  
  289.     clr.b    flag
  290.     clr.l    palhndl
  291.  
  292.     bsr    pgetl        ; get first four bytes
  293.         move.l  d0,d1
  294.         and.l   #$000000ff,d1   ; mask off the lower byte (bits per pixel)
  295.         move.l  d1,bpp
  296.         move.l  d0,d1
  297.         lsr.l   #8,d1
  298.         and.l   #$000000ff,d1
  299.         move.b  d1,compression
  300.         move.l  d0,d1
  301.         lsr.l   #8,d1
  302.         lsr.l   #8,d1
  303.         and.l   #$000000ff,d1
  304.         move.b  d1,version
  305.  
  306.     bsr    ipgetw
  307.         move.w  d0,xmin
  308.         bsr     ipgetw
  309.         move.w  d0,ymin
  310.         bsr     ipgetw
  311.         addq.w  #1,d0
  312.         move.w  d0,xmax
  313.         bsr     ipgetw
  314.         addq.w  #1,d0
  315.         move.w  d0,ymax
  316.         
  317.         move.w  xmax,d0                 ;calculate the width in pixels
  318.         sub.w   xmin,d0
  319.         move.w    d0,pc_W+pic
  320.     add.w    #15,d0
  321.     lsr.w    #3,d0
  322.     bclr    #0,d0
  323.     move.w    d0,pc_Width+pic        ; width in bytes (even)
  324.         
  325.         move.w  ymax,d0                 ;calculate the height in pixels
  326.         sub.w   ymin,d0
  327.         move.w  d0,pic+pc_H
  328.  
  329.     mulu    pc_Width+pic,d0         ;calculate the size of a bitplane
  330.     move.l    d0,planesize
  331.  
  332.         bsr     ipgetw                  ;skip the next two words
  333.         bsr     ipgetw
  334.         
  335.         move.w  #75,pic+pc_XDpi
  336.         move.w  #75,pic+pc_YDpi
  337.  
  338.         cmp.b   #0,version
  339.         bne     gpi2
  340.         move.w  #PC_BW,pc_Type+pic
  341.         move.w  #11,d4
  342. gpi11:  bsr     pgetl                   ;skip the 48 byte palette
  343.         dbf     d4,gpi11
  344.         bra     gpi5
  345.         
  346. gpi2:   cmp.b   #2,version
  347.         bne     gpi3
  348.         bclr    #1,flag                 ;clear bit reverse flag
  349.         move.w  #16,numcolors
  350.         move.w  #16,pc_Palet+pic
  351.         move.w    #PC_PALET,pc_Type+pic   ;all version 2 pcx pics are PC_PALET
  352.         bsr     cmap                    ;get the 16 color palette
  353.         bra     gpi5 
  354.                 
  355. gpi3:   cmp.b   #5,version
  356.         bne     gpi4
  357.         move.w  #256,numcolors
  358.         move.w  #256,pc_Palet+pic
  359.         move.w    #PC_PALET,pc_Type+pic   ;all version 5 pcx pics are PC_PALET
  360.         move.w  #11,d4
  361. gpi31:  bsr     pgetl                   ;skip the 48 byte palette
  362.         dbf     d4,gpi31
  363.         bra     gpi5                    ;get the cmap at the end of the pic
  364.  
  365. gpi4:   cmp.b   #3,version
  366.         bne     gpi49
  367.         bset    #1,flag                 ;set flag to reverse the bits
  368.         move.w  #2,numcolors
  369.         move.w  #0,pc_Palet+pic         ;no palette
  370.         move.w    #PC_BW,pc_Type+pic      ;version 3 pics are PC_BW
  371.         move.w  #11,d4
  372. gpi41:  bsr     pgetl                   ;skip the 48 byte palette
  373.         dbf     d4,gpi41
  374.         bra     gpi5
  375.         
  376. gpi49:  bra     errrts                  ;unknown version get out
  377.  
  378. gpi5:   bsr     pget                    ;reserved byte
  379.         bsr     pget                    ;get the number of bitplanes
  380.         move.b  d0,numplanes
  381.         move.l  bpp,d1
  382.         mulu    d1,d0
  383.         move.w  d0,truebitpln
  384.         move.w  d0,pc_BitPln+pic
  385.         move.w  #1,d1
  386.         lsl.w   d0,d1
  387.         move.w  d1,pc_Palet+pic
  388.         move.w  d1,numcolors
  389.         
  390.         cmp.w   #2,d1                   ;is it a BW pic?
  391.         bne     gpi51                   ;no
  392.         bset    #1,flag                 ;set flag to reverse the bits
  393.         move.w  #PC_BW,pc_Type+pic
  394.         move.w  #0,pc_Palet+pic
  395.         bra     gpi52
  396.         
  397. gpi51:  cmp.b   #5,version
  398.         bne     gpi52
  399.         cmp.w   #256,d1
  400.         beq     gpi52
  401.         move.w  #PC_BW,pc_Type+pic
  402.         move.w  #0,pc_Palet+pic
  403.         
  404. gpi52:  bsr     ipgetw
  405.         move.w  d0,bpr                  ;bytes per row
  406.         
  407.         bsr     pgetw                   ;skip the palette type (1=gray, 2=rgb)
  408.         move.w  #28,d4                  ;skip the remaining header bytes
  409. gpi6:   bsr     pgetw
  410.         dbf     d4,gpi6
  411.  
  412.         rts
  413.  
  414.  
  415.  
  416. ;bmhd3:    move.l    table,a0                ;check for manual DPI override
  417. ;    move.l    spclname(a0),a0
  418. ;    lea    4(a0),a0
  419. ;    move.w    -2(a0),d0
  420. ;    clr.b    0(a0,d0.w)
  421. ;    lea    dpistr1,a1
  422. ;        lea     dpistr2,a2
  423. ;        
  424. ;bmh3a:  move.b  (a0)+,d0
  425. ;        move.b  (a1)+,d1
  426. ;        cmp.b    d0,d1
  427. ;    bne    bmh3ab
  428. ;    tst.b    (a1)
  429. ;    bne    bmh3a
  430. ;        bra     bmh3ac
  431. ;        
  432. ;bmh3ab: move.b  (a2)+,d1
  433. ;        cmp.b    d0,d1
  434. ;    bne    bmh3b
  435. ;    tst.b    (a2)
  436. ;    bne    bmh3a
  437. ;
  438. ;bmh3ac: bset    #5,flag                 ;set resolution override flag
  439. ;    bsr    getnum
  440. ;    move.w    d0,pc_XDpi+pic
  441. ;    bsr    getnum
  442. ;    move.w    d0,pc_YDpi+pic
  443. ;
  444. ;bmh3b:  rts
  445.         
  446.  
  447. *********************************
  448. *                               *
  449. *********************************
  450. cmap:
  451.         clr.l   d0
  452.         move.w  numcolors,d0
  453.         move.w  d0,temp
  454.     mulu    #pl_Sizeof,d0
  455.     jsr    allocpalet              ;returns palette pointer in a4
  456.  
  457. getentry:
  458.     bsr    pget            ; red
  459.     and.w    #$ff,d0
  460.     mulu    #65535,d0
  461.     divu    #240,d0
  462.     move.w    d0,(a4)
  463.     bsr    pget            ; green
  464.     and.w    #$ff,d0
  465.     mulu    #65535,d0
  466.     divu    #240,d0
  467.     move.w    d0,2(a4)
  468.     bsr    pget            ; blue
  469.     and.w    #$ff,d0
  470.     mulu    #65535,d0
  471.     divu    #240,d0
  472.     move.w    d0,4(a4)
  473.  
  474.     move.w    (a4)+,d0
  475.     move.w    (a4)+,d1
  476.     move.w    (a4)+,d2
  477.     mulu    #19661,d0
  478.     mulu    #38666,d1
  479.     mulu    #7209,d2
  480.     add.l    d1,d0
  481.     add.l    d2,d0
  482.     swap    d0
  483.     cmp.w    #$8000,d0
  484.     bcc    ge1
  485.     moveq    #1,d0
  486.     bra    ge2
  487. ge1:    moveq    #0,d0
  488. ge2:    move.w    d0,(a4)+        ; black
  489.     sub.w    #1,temp
  490.     bne    getentry
  491.         
  492. ge4:    rts
  493.  
  494.         
  495. ***********************************
  496. ***                ***
  497. ***********************************
  498. allocpalet:
  499.     move.l    table,a1
  500.     clr.l    d1
  501.     clr.l    d2
  502.     move.l    m_alloc(a1),a1
  503.     jsr    (a1)            ; allocate memory for the color map
  504.         beq     errrts
  505.     move.l    a0,palhndl
  506.     move.l    (a0),a4
  507.     rts
  508.  
  509.  
  510. ***********************************
  511. **                               **
  512. ***********************************
  513. getnum:    moveq    #0,d0
  514. gn1:    move.b    (a0)+,d1
  515.     sub.b    #"0",d1
  516.     bcs    gn2
  517.     cmp.b    #10,d1
  518.     bcc    gn2
  519.     and.w    #$ff,d1
  520.     mulu    #10,d0
  521.     add.w    d1,d0
  522.     bra    gn1
  523.  
  524. gn2:    rts
  525.  
  526.  
  527. *********************************
  528. *                               *
  529. *********************************
  530. ipgetl:    move.l    table,a0
  531.     move.l    f_getl(a0),a0
  532.     jsr    (a0)
  533.     beq    errrts
  534.         move.l  d0,temp1
  535.         move.b  temp1+3,temp2
  536.         move.b  temp1+2,temp2+1
  537.         move.b  temp1+1,temp2+2
  538.         move.b  temp1,temp2+3
  539.         move.l  temp2,d0
  540.     rts
  541.  
  542. *********************************
  543. *                               *
  544. *********************************
  545. ipgetw:    move.l    table,a0
  546.     move.l    f_getw(a0),a0
  547.     jsr    (a0)
  548.     beq    errrts
  549.         move.w  d0,temp1
  550.         move.b  temp1+1,temp2
  551.         move.b  temp1,temp2+1
  552.         clr.l   d0
  553.         move.w  temp2,d0
  554.     rts
  555.  
  556. *********************************
  557. *                               *
  558. *********************************
  559. pgetl:    move.l    table,a0
  560.     move.l    f_getl(a0),a0
  561.     jsr    (a0)
  562.     beq    errrts
  563.     rts
  564.  
  565. *********************************
  566. *                               *
  567. *********************************
  568. pgetw:    move.l    table,a0
  569.     move.l    f_getw(a0),a0
  570.     jsr    (a0)
  571.     beq    errrts
  572.         and.l   #$0000ffff,d0
  573.     rts
  574.  
  575. *********************************
  576. *                               *
  577. *********************************
  578. pget:    movem.l d2-d4/a1/a4,-(sp)
  579.         move.l    table,a0
  580.     move.l    f_get(a0),a0
  581.     jsr    (a0)
  582.     beq    errrts
  583.         and.l   #$000000ff,d0
  584.         movem.l (sp)+,d2-d4/a1/a4
  585.     rts
  586.  
  587.  
  588. ***********************************
  589. ***                ***
  590. ***********************************
  591. errrts:    tst.l    palhndl
  592.     beq    er1
  593.     move.l    palhndl,a0
  594.     move.l    table,a1
  595.     move.l    m_delete(a1),a1
  596.     jsr    (a1)
  597.         clr.l   palhndl
  598.  
  599. er1:    move.l    savesp,sp
  600.         
  601.     move.l    table,a0        
  602.     move.l    spclnum(a0),a0  
  603.     cmp.w    #1,(a0)         
  604.     beq    abortobj        
  605.         bra     abortpic        
  606.         
  607.  
  608. ***********************************************************
  609. ***                            ***
  610. ***********************************************************
  611. putcolor:
  612.         cmp.w   #PC_PALET,pc_Type+pic
  613.         bne     pc3
  614.         
  615.     move.w    pc_Palet+pic,d1
  616.     mulu    #pl_Sizeof,d1
  617.  
  618.     move.l    palptr,a0
  619.     move.l    palhndl,a1
  620.     move.l    (a1),a1
  621.     bra    pc2
  622. pc1:    move.b    (a1)+,(a0)+
  623. pc2:    dbf    d1,pc1
  624.     move.l    a0,picptr
  625.  
  626. pc3:    rts
  627.  
  628.  
  629. ***********************************************************
  630. ***                            ***
  631. ***********************************************************
  632. putpic:
  633.         cmp.l   #1,bpp
  634.         beq     putilpic
  635.         cmp.b   #1,numplanes
  636.         beq     putchunkypic
  637.                 
  638. putilpic:        
  639.         move.w    truebitpln,bitplanes
  640.     move.w    pc_H+pic,theight
  641.     move.l    picptr,a4
  642.     move.l    a4,pptr
  643.  
  644. pi1:    bsr    getilrow        ;put a row into the amiga bitmap
  645.     add.l    planesize,a4    ;one for each bit plane
  646.     sub.w    #1,bitplanes
  647.     bne    pi1
  648.  
  649.     move.w    truebitpln,bitplanes    ;get next row
  650.     move.l    picptr,a4
  651.     add.w    pc_Width+pic,a4
  652.     move.l    a4,picptr
  653.     sub.w    #1,theight
  654.         bne     pi1
  655.         bra     pp1
  656.         
  657. putchunkypic:
  658.     move.w    pc_H+pic,theight
  659.     move.l    picptr,a4
  660.     move.l    a4,pptr
  661.  
  662. pk1:    bsr    getckrow                ;put a row into the amiga bitmap
  663.     move.l    picptr,a4
  664.     add.w    pc_Width+pic,a4
  665.     move.l    a4,picptr
  666.     sub.w    #1,theight
  667.         bne     pk1
  668.  
  669.         
  670. pp1:    tst.l   palhndl                 ;clean up memory
  671.         beq     pp2
  672.     move.l    palhndl,a0
  673.     move.l    table,a1
  674.     move.l    m_delete(a1),a1
  675.     jsr    (a1)
  676.         clr.l   palhndl
  677.  
  678. pp2:    rts
  679.  
  680.  
  681. *******************************************
  682. ***                    ***
  683. *******************************************
  684. getilrow:                       ;get interleaved row from file
  685.     move.l    a4,temp
  686.     move.w    bpr,d0
  687.         move.w  d0,twidth
  688.  
  689. gi1:    move.w  twidth,d2
  690.         cmp.w    #0,twidth
  691.     beq    gitn
  692.         
  693.     bsr    pget
  694.         move.b  d0,d1
  695.         and.b   #$c0,d1
  696.         cmp.b   #$c0,d1
  697.         bne     gi3
  698.         
  699.         and.w   #$003f,d0
  700.         move.b    d0,temp1
  701.     bsr    pget
  702.         tst.b   temp1
  703.         beq     gi1
  704.  
  705.         btst    #1,flag         ;check for reverse bits flag
  706.         beq     gi2             ;do not reverse bits
  707.         not.b   d0
  708.                 
  709. gi2:    move.b    d0,(a4)+
  710.     sub.w    #1,twidth
  711.     sub.b    #1,temp1
  712.     bne    gi2
  713.     bra    gi1
  714.  
  715. gi3:    btst    #1,flag
  716.         beq     gi4
  717.         not.b   d0
  718.                      
  719. gi4:    move.b    d0,(a4)+
  720.     sub.w    #1,twidth
  721.     bra    gi1
  722.     
  723. gitn:    move.l    temp,a4
  724.     rts
  725.  
  726. *******************************************
  727. ***                    ***
  728. *******************************************
  729. getckrow:                       ;get chunk row from file
  730.     move.l    a4,temp
  731.     move.w    bpr,d0
  732.         move.w  d0,twidth
  733.         move.w  #7,d2           ;bit pointer for amiga bitmap
  734.         move.w  truebitpln,d4   ;bit plane counter
  735.         subq.w  #1,d4
  736.         move.w  #7,d3           ;bit pointer for pcx data byte
  737.         move.l  a4,a1           ;set a1 to amiga bitmap pointer
  738.         
  739. gc1:    cmp.w    #0,twidth
  740.     beq    gctn
  741.         
  742.     bsr    pget
  743.         move.b  d0,d1
  744.         and.b   #$c0,d1
  745.         cmp.b   #$c0,d1
  746.         bne     gc3
  747.         
  748.         and.w   #$003f,d0
  749.         move.b    d0,temp1
  750.     bsr    pget
  751.         tst.b   temp1
  752.         beq     gc1
  753.  
  754.         ;compressed run of bytes
  755. gc2:    bsr     reversebyte
  756. gc20:   btst    d3,d0
  757.         beq     gc21
  758.         bset    d2,(a1)
  759.         bra     gc22
  760. gc21:   bclr    d2,(a1) 
  761. gc22:   add.l    planesize,a1    ;move to the next amiga bit plane
  762.         dbf     d4,gc25         ;decrement the bitplane counter
  763.         move.w  truebitpln,d4   ;if done - restore bit plane counter
  764.         subq.w  #1,d4
  765.         move.l  a4,a1           ;reset a1 to first bitplane
  766.         
  767.         dbf     d2,gc25         ;decrement amiga bitmap bit pointer
  768.         addq.l  #1,a4           ;move to next amiga bitmap byte
  769.         move.l  a4,a1           ;rest to first amiga bitplane
  770.         move.w  #7,d2           ;restore the amiga bitmap pointer
  771.         
  772. gc25:   dbf     d3,gc20         ;decrement the pcx data bit counter
  773.         move.w  #7,d3           ;restore the pcx data bit pointer
  774.     sub.w    #1,twidth
  775.     sub.b    #1,temp1
  776.     bne    gc20
  777.     bra    gc1
  778.  
  779.         ;single uncompressed byte
  780. gc3:    bsr     reversebyte   
  781. gc30:   btst    d3,d0
  782.         beq     gc31
  783.         bset    d2,(a1)
  784.         bra     gc32
  785. gc31:   bclr    d2,(a1) 
  786. gc32:   add.l    planesize,a1    ;move to the next amiga bit plane
  787.         dbf     d4,gc35         ;decrement the bitplane counter
  788.         move.w  truebitpln,d4   ;if done - restore bit plane counter
  789.         subq.w  #1,d4
  790.         move.l  a4,a1           ;rest to first amiga bitplane
  791.         
  792.         dbf     d2,gc35         ;decrement amiga bitmap bit pointer
  793.         addq.l  #1,a4           ;move to next amiga bitmap byte
  794.         move.l  a4,a1
  795.         move.w  #7,d2           ;restore the amiga bitmap pointer
  796.         
  797. gc35:   dbf     d3,gc30         ;decrement the pcx data bit counter
  798.         move.w  #7,d3           ;restore the pcx data bit pointer
  799.     sub.w    #1,twidth
  800.     bra    gc1
  801.     
  802. gctn:    move.l    temp,a4
  803.     rts
  804.  
  805. ***********************************
  806. ***                ***
  807. ***********************************
  808. reversebyte:
  809.         cmp.l   #8,bpp          ;is it a whole byte to reverse?
  810.         beq     rb              ;yes
  811.         
  812.         cmp.l   #4,bpp          ;is it a nibble I need to reverse?
  813.         beq     rn              ;yes
  814.         
  815.         ;cmp.l   #2,bpp          ;is it 2 bits I need to reverse?
  816.         ;beq     r2b             ;yes
  817.         
  818.         rts                     ;if not any of these, don't do anything
  819.         
  820.         ;reverse bytes
  821. rb:     clr.l   d7
  822.         move.w  #7,d5
  823.         move.w  #0,d6
  824.         
  825. rb0:    btst    d5,d0
  826.         beq     rb1
  827.         bset    d6,d7
  828.         bra     rb2
  829. rb1:    bclr    d6,d7
  830. rb2:    addq.w  #1,d6
  831.         dbf     d5,rb0
  832.         move.l  d7,d0
  833.         rts
  834.         
  835.         ;reverse nibbles
  836. rn:     clr.l   d7
  837.         moveq   #7,d5
  838.         moveq   #4,d6
  839.         
  840. rn0:    btst    d5,d0
  841.         beq     rn1
  842.         bset    d6,d7
  843.         bra     rn2
  844. rn1:    bclr    d6,d7
  845. rn2:    addq.w  #1,d6
  846.         subq    #1,d5
  847.         cmp.w   #3,d5
  848.         bne     rn0
  849.         
  850.         moveq   #0,d6
  851. rn3:    btst    d5,d0
  852.         beq     rn4
  853.         bset    d6,d7
  854.         bra     rn5
  855. rn4:    bclr    d6,d7
  856. rn5:    addq.w  #1,d6
  857.         subq    #1,d5
  858.         cmp.w   #3,d5
  859.         bne     rn3
  860.         move.l  d7,d0
  861.         rts
  862.         
  863.         ;reverse every 2 bits
  864. r2b:    clr.l   d7
  865.         moveq   #7,d5
  866.         moveq   #6,d6
  867.         
  868. r2b0:   btst    d5,d0
  869.         beq     r2b1
  870.         bset    d6,d7
  871.         bra     r2b2
  872. r2b1:   bclr    d6,d7
  873. r2b2:   addq    #1,d6
  874.         subq    #1,d5
  875.         cmp.w   #5,d5
  876.         bne     r2b0
  877.         
  878.         moveq   #4,d6
  879. r2b3:   btst    d5,d0
  880.         beq     r2b4
  881.         bset    d6,d7
  882.         bra     r2b5
  883. r2b4:   bclr    d6,d7
  884. r2b5:   addq    #1,d6
  885.         subq    #1,d5
  886.         cmp.w   #3,d5
  887.         bne     r2b3
  888.         
  889.         moveq   #2,d6
  890. r2b6:   btst    d5,d0
  891.         beq     r2b7
  892.         bset    d6,d7
  893.         bra     r2b8
  894. r2b7:   bclr    d6,d7
  895. r2b8:   addq    #1,d6
  896.         subq    #1,d5
  897.         cmp.w   #1,d5
  898.         bne     r2b6
  899.         
  900.         moveq   #0,d6
  901. r2b9:   btst    d5,d0
  902.         beq     r2b10
  903.         bset    d6,d7
  904.         bra     r2b11
  905. r2b10:  bclr    d6,d7
  906. r2b11:  addq    #1,d6
  907.         subq    #1,d5
  908.         cmp.w   #$ffff,d5
  909.         bne     r2b9
  910.         
  911.         move.l  d7,d0
  912.         rts
  913.         
  914. ***********************************
  915. ***                ***
  916. ***********************************
  917. Mulu1632:
  918.     move.l    table,a0
  919.     move.l    mulu1632(a0),a0
  920.     jmp    (a0)
  921.  
  922.  
  923. ***********************************
  924. ***                ***
  925. ***********************************
  926. Divu1648:
  927.     move.l    table,a0
  928.     move.l    divu1648(a0),a0
  929.     jmp    (a0)
  930.  
  931.         
  932. *******************************************************************
  933. ***    called when the import routine choosen finds something    ***
  934. ***    wrong with the file loaded.                ***
  935. *******************************************************************
  936. never:    clr.w    d0
  937.     rts
  938.  
  939. maybe:    move.w    #1,d0
  940.     rts
  941.  
  942. right:    move.w    #2,d0
  943.     rts
  944.  
  945.  
  946. *************************************************************
  947. *************************************************************
  948.  SECTION PCX,DATA,PUBLIC
  949.  
  950. special:
  951.     dc.w    2
  952.     dc.l    spcl1,spcl2
  953.  
  954. vers:   dc.b    "$VER: "
  955. name:    dc.b    "PCX  v2.1.1",0
  956.  
  957. spcl1:    dc.b    "Picture Window",0
  958. spcl2:    dc.b    "Object",0
  959.  
  960. dpistr1:        dc.b    "dpi=",0
  961. dpistr2:        dc.b    "DPI=",0
  962.  
  963.  
  964. **************************************************************
  965. **************************************************************
  966.  SECTION PCX,BSS,PUBLIC
  967. savesp:        ds.l    1
  968. bpp:            ds.l    1
  969. xmin:           ds.w    1
  970. ymin:           ds.w    1
  971. xmax:           ds.w    1
  972. ymax:           ds.w    1
  973. temp1:          ds.l    1
  974. temp2:          ds.l    1
  975. compression:    ds.b    1
  976. version:        ds.b    1
  977. numplanes:      ds.b    1
  978. flag:        ds.b    1
  979. pic:        ds.w    pc_Sizeof/2
  980. object:        ds.w    ob_SizeOf/2
  981. palhndl:        ds.l    1
  982. picptr:        ds.l    1
  983. pptr:        ds.l    1
  984. planesize:    ds.l    1
  985. twidth:        ds.w    1
  986. theight:    ds.w    1
  987. bitplanes:    ds.w    1
  988. truebitpln:    ds.w    1
  989. numcolors:      ds.w    1
  990. bpr:            ds.w    1
  991. palptr:         ds.l    1
  992. temp:        ds.l    1
  993.  
  994.  
  995. ******************************* CHANGES ************************************
  996. ;
  997. ;       version 2.1.1
  998. ;
  999. ;       - added a version string
  1000. ;
  1001. ;
  1002. ;       version 2.1.0
  1003. ;
  1004. ;       - initial release
  1005.