home *** CD-ROM | disk | FTP | other *** search
/ 17 Bit Software 2: Collection B / 17Bit_Collection_B.iso / files / 1794.dms / in.adf / Extensions_Sources / Extension_Sources.Lzh / _Compact.s < prev    next >
Encoding:
Text File  |  1992-02-01  |  16.3 KB  |  759 lines

  1. ;---------------------------------------------------------------------
  2. ;    **   **   **  ***   ***   ****     **    ***  **  ****
  3. ;   ****  *** *** ** ** **     ** **   ****  **    ** **  **
  4. ;  **  ** ** * ** ** **  ***   *****  **  **  ***  ** **
  5. ;  ****** **   ** ** **    **  **  ** ******    ** ** **
  6. ;  **  ** **   ** ** ** *  **  **  ** **  ** *  ** ** **  **
  7. ;  **  ** **   **  ***   ***   *****  **  **  ***  **  ****
  8. ;---------------------------------------------------------------------
  9. ; Picture compactor extension source code, V1.2
  10. ; By François Lionet
  11. ; AMOS and AMOS Compiler (c) Europress Software 1991
  12. ; To be used with AMOS1.3 and over
  13. ;--------------------------------------------------------------------- 
  14. ; This file is public domain
  15. ;---------------------------------------------------------------------
  16. ; Please refer to the _Music.s file for more informations
  17. ;---------------------------------------------------------------------
  18. *
  19. ExtNb        equ    2-1
  20. *
  21.          Include    "_Equ.s"
  22.         RsSet    DataLong
  23.         Include "_Pointe.s"
  24.         Include "_CEqu.s"
  25.         Include    "_WEqu.s"
  26.         Include    "_LEqu.s"
  27. *
  28. * Packed screen header
  29.         RsReset
  30. PsCode        rs.l 1
  31. PsTx        rs.w 1
  32. PsTy        rs.w 1
  33. PsAWx        rs.w 1
  34. PsAWy        rs.w 1
  35. PsAWTx        rs.w 1
  36. PsAWTy        rs.w 1
  37. PsAVx        rs.w 1
  38. PsAVy        rs.w 1
  39. PsCon0        rs.w 1
  40. PsNbCol        rs.w 1
  41. PsNPlan        rs.w 1
  42. PsPal        rs.w 32
  43. PsLong        equ __Rs
  44. SCCode        equ $12031990
  45. * Packed picture header
  46.         RsReset
  47. Pkcode       rs.l 1
  48. Pkdx         rs.w 1
  49. Pkdy         rs.w 1
  50. Pktx         rs.w 1
  51. Pkty         rs.w 1
  52. Pktcar       rs.w 1
  53. Pknplan        rs.w 1
  54. PkDatas2     rs.l 1
  55. PkPoint2     rs.l 1
  56. PkLong      equ __Rs
  57. PkDatas1    equ __Rs
  58. BMCode        equ $06071963
  59. *
  60. Start        dc.l    C_Tk-C_Off
  61.         dc.l    C_Lib-C_Tk
  62.         dc.l    C_Title-C_Lib
  63.         dc.l    C_End-C_Title
  64.         dc.w    0
  65.  
  66. ***********************************************************
  67. *         OFFSETS TO FUNCTIONS
  68. C_Off       dc.w (L1-L0)/2,(L2-L1)/2,(L3-L2)/2,(L4-L3)/2
  69.             dc.w (L5-L4)/2,(L6-L5)/2,(L7-L6)/2,(L8-L7)/2
  70.             dc.w (L9-L8)/2,(L10-L9)/2,(L11-L10)/2,(L12-L11)/2
  71.                dc.w (L13-L12)/2,(L14-L13)/2,(L15-L14)/2,(L16-L15)/2
  72.             dc.w (L17-L16)/2,(L18-L17)/2,(L19-L18)/2,(L20-L19)/2
  73.         dc.w (L21-L20)/2,(L22-L21)/2,(L23-L22)/2
  74.  
  75. ***********************************************************
  76. *         COMPACTOR TOKENS
  77. C_Tk        dc.w     1,0
  78.         dc.b     $80,-1
  79.         dc.w     L_Pack2,-1
  80.         dc.b     "!pac","k"+$80,"I0t0",-2
  81.         dc.w    L_Pack6,-1
  82.         dc.b    $80,"I0t0,0,0,0,0",-1
  83.         dc.w     L_SPack2,-1
  84.         dc.b     "!spac","k"+$80,"I0t0",-2
  85.         dc.w    L_SPack6,-1
  86.         dc.b    $80,"I0t0,0,0,0,0",-1
  87.         dc.w    L_UPack1,-1
  88.         dc.b    "!unpac","k"+$80,"I0",-2
  89.         dc.w     L_UPack2,-1
  90.         dc.b    $80,"I0t0",-2
  91.         dc.w     L_UPack3,-1
  92.         dc.b    $80,"I0,0,0",-1
  93.         dc.w     0
  94.  
  95. ******************************************************************
  96. *        Start of library
  97. C_Lib
  98.  
  99. ******************************************************************
  100. *        COLD START
  101. L0    moveq    #ExtNb,d0
  102.     rts
  103.  
  104. ******************************************************************
  105. *
  106. L1
  107.  
  108. ******************************************************************
  109. *    
  110. L2
  111.  
  112. ******************************************************************
  113. *        PACK Screen,Bank#
  114. L_Pack2        equ    3
  115. L3    clr.l    -(a3)
  116.     clr.l    -(a3)
  117.     move.l    #10000,-(a3)
  118.     move.l    (a3),-(a3)
  119.     RBra    L_Pack6
  120.  
  121. ******************************************************************
  122. *        PACK Screen,Bank#
  123. L_Pack6        equ    4
  124. L4    Rbsr    L_PacPar
  125.     Rbsr    L_GetSize
  126.     Rbsr    L_ResBank
  127.     Rbsr    L_Pack
  128.     rts
  129.  
  130. *******************************************************************
  131. *        SPACK Screen,Bank#
  132. L_SPack2    equ    5
  133. L5    clr.l    -(a3)
  134.     clr.l    -(a3)
  135.     move.l    #10000,-(a3)
  136.     move.l    (a3),-(a3)
  137.     Rbra    L_SPack6
  138.  
  139. *******************************************************************
  140. *        SPACK Screen,Bank#,X1,Y1 TO X2,Y2
  141. L_SPack6    equ    6
  142. L6    Rbsr    L_PacPar
  143.     Rbsr    L_GetSize
  144.     add.l    #PsLong,d0
  145.     Rbsr    L_ResBank
  146. * Screen definition header
  147.     move.l    #SCCode,(a1)
  148.     move.w    EcTx(a0),PsTx(a1)
  149.     move.w    EcTy(a0),PsTy(a1)
  150.     move.w    EcNbCol(a0),PsNbCol(a1)
  151.     move.w    EcNPlan(a0),PsNPlan(a1)
  152.     move.w    EcCon0(a0),PsCon0(a1)
  153.     move.w    EcAWX(a0),PsAWX(a1)
  154.     move.w    EcAWY(a0),PsAWY(a1)
  155.     move.w    EcAWTX(a0),PsAWTX(a1)
  156.     move.w    EcAWTY(a0),PsAWTY(a1)
  157.     move.w    EcAVX(a0),PsAVX(a1)
  158.     move.w    EcAVY(a0),PsAVY(a1)
  159.     movem.l    a0/a1,-(sp)
  160.     moveq    #31,d0
  161.     lea    EcPal(a0),a0
  162.     lea    PsPal(a1),a1
  163. SPac1    move.w    (a0)+,(a1)+
  164.     dbra    d0,SPac1
  165.     movem.l    (sp)+,a0/a1
  166.     lea    PsLong(a1),a1
  167. * Finish packing!
  168.     Rbsr    L_Pack
  169.     rts
  170.  
  171. *************************************************************************
  172. *        UNPACK Bank#         -> To current screen
  173. L_UPack1    equ    7
  174. L7    move.l    ScOnAd(a5),d0
  175.     Rbeq    L_JFonCall
  176.     move.l    d0,a1
  177.     moveq    #-1,d1
  178.     moveq    #-1,d2
  179.     Rbra    L_UPack
  180.  
  181. *************************************************************************
  182. *        UNPACK Bank#,X,Y    -> To current screen
  183. L_UPack3    equ    8
  184. L8    move.l    ScOnAd(a5),d0
  185.     Rbeq    L_JFonCall
  186.     move.l    d0,a1
  187.     move.l    (a3)+,d2
  188.     move.l    (a3)+,d1
  189.     lsr.l    #3,d1
  190.     Rbra    L_UPack
  191.  
  192. L_UPack        equ    9
  193. L9    movem.l    d1/d2/a1/a2,-(sp)
  194.     RJsr    L_AdOuBank
  195.     movem.l    (sp)+,d1/d2/a1/a2
  196.     move.l    d3,a0
  197. * Autoback 
  198.     tst.w    EcAuto(a1)        * Is screen autobacked?
  199.     Rbeq    L_UnPack        * NOPE! Do simple unpack
  200.     movem.l    d0-d7/a0-a2,-(sp)    * YEP! First step
  201.     EcCall    AutoBack1
  202.     movem.l    (sp),d0-d7/a0-a2
  203.     btst    #BitDble,EcFlags(a1)    * DOUBLE BUFFER?
  204.     beq.s    ABPac1
  205.     Rbsr    L_UnPack
  206.     EcCall    AutoBack2        * Second step
  207.     movem.l    (sp),d0-d7/a0-a2
  208.     Rbsr    L_UnPack
  209.     EcCall    AutoBack3        * Third step
  210.     bra.s    ABPac2
  211. ABPac1    Rbsr    L_UnPack        * SINGLE BUFFER autobacked
  212.     EcCall    AutoBack4
  213. ABPac2    movem.l    (sp)+,d0-d7/a0-a2
  214.     rts
  215.  
  216. *************************************************************************
  217. *        UNPACK Bank# TO screen    -> Creates/Erases screen!
  218. L_UPack2    equ    10
  219. L10    move.l    (a3)+,d1
  220.     cmp.l    #8,d1
  221.     Rbcc    L_JFoncall
  222. * Creates new screen
  223.     move.l    d1,-(sp)
  224.     RJsr    L_AdOuBank
  225.     move.l    (sp)+,d1
  226.     move.l    d3,a0
  227.     cmp.l    #SCCode,PsCode(a0)
  228.     Rbne    L_NoScr
  229.     moveq    #0,d2
  230.     moveq    #0,d3
  231.     moveq    #0,d4
  232.     moveq    #0,d5
  233.     move.w    PsTx(a0),d2
  234.     move.w    PsTy(a0),d3
  235.     move.w    PsNPlan(a0),d4
  236.     move.w    PsCon0(a0),d5
  237.     move.w    PsNbCol(a0),d6
  238.     lea    PsPal(a0),a1
  239.     move.l    a0,-(sp)
  240.     EcCall    Cree
  241.     Rbne    L_JOOfMem
  242.     move.l    a0,a1
  243.     move.l    (sp)+,a0
  244.     move.l    a1,ScOnAd(a5)
  245.     move.w    EcNumber(a1),ScOn(a5)
  246.     addq.w    #1,ScOn(a5)
  247. * Enleve le curseur
  248.     movem.l    a0-a6/d0-d7,-(sp)
  249.     lea    CuCuOff(pc),a1
  250.     WiCall    Print
  251.     movem.l    (sp)+,a0-a6/d0-d7
  252. * Change View/Offset
  253.     move.w    PsAWX(a0),EcAWX(a1)
  254.     move.w    PsAWY(a0),EcAWY(a1)
  255.     move.w    PsAWTx(a0),EcAWTx(a1)
  256.     move.w    PsAWTy(a0),EcAWTy(a1)
  257.     move.w    PsAVX(a0),EcAVX(a1)
  258.     move.w    PsAVY(a0),EcAVY(a1)
  259.     move.b    #%110,EcAW(a1)
  260.     move.b    #%110,EcAWT(a1)
  261.     move.b    #%110,EcAV(a1)
  262. * Unpack!
  263.     lea    PsLong(a0),a0
  264.     moveq    #0,d1
  265.     moveq    #0,d2
  266.     Rbra    L_UnPack
  267. CuCuOff    dc.b    27,"C0",0
  268.     even
  269.  
  270. ***********************************************************
  271. *        Reserves memory bank
  272. L_ResBank    equ    11
  273. L11    movem.l    a0/d1,-(sp)
  274.     addq.l    #8,d0
  275.     move.l    d0,d1
  276.     Rjsr    L_RamFast
  277.     Rbeq    L_JOOfMem
  278.     move.l    d0,(a1)+
  279.     bset    #31,d1
  280.     move.l    d1,(a1)+
  281.     move.l    d0,a1
  282.     lea    BkPac(pc),a0
  283.     move.l    (a0)+,(a1)+
  284.     move.l    (a0)+,(a1)+
  285.     movem.l    (sp)+,a0/d1
  286.     rts
  287. ******* Definition banque de samples
  288. BkPac:    dc.b "Pac.Pic."
  289.     even
  290.  
  291. ***********************************************************
  292. *        Unpile parameters
  293. L_PacPar    equ    12
  294. L12    move.l    (a3)+,d5
  295.     move.l    (a3)+,d4
  296.     move.l    (a3)+,d3
  297.     move.l    (a3)+,d2
  298.     lsr.w    #3,d4
  299.     lsr.w    #3,d2
  300. * Screen
  301.     move.l    4(a3),d1
  302.     RJsr    L_GetEc
  303.     move.l    d0,a2
  304.     cmp.w    EcTLigne(a0),d4
  305.     bls.s    PacP1
  306.     move.w    EcTLigne(a0),d4
  307. PacP1    cmp.w    EcTy(a0),d5
  308.     bls.s    PacP2
  309.     move.w    EcTy(a0),d5
  310. PacP2    sub.w    d2,d4
  311.     Rble    L_JFoncall
  312.     sub.w    d3,d5
  313.     Rble    L_JFoncall
  314. * Memory bank
  315.     move.l    d3,-(sp)
  316.     move.l    (a3)+,d3
  317.     subq.l    #1,d3
  318.     cmp.l    #16,d3
  319.     Rbcc    L_JFoncall
  320.     RJsr    L_EffBank
  321.     lsl.w    #3,d3            * Address of pointer
  322.     move.l    ABanks(a5),a1
  323.     add.w    d3,a1
  324.     tst.l    (a1)
  325.     Rbne    L_JFoncall
  326.     move.l    (sp)+,d3
  327.     addq.l    #4,a3
  328.     rts
  329.  
  330. ***************************************************************************
  331. *       BITMAP COMPACTOR
  332. *                       A0: Origin screen datas
  333. *                       A1: Destination zone
  334. *            A2: Origin screen bitmap
  335. *                       D2: DX in BYTES
  336. *                       D3: DY in LINES
  337. *                       D4: TX in BYTES
  338. *                       D5: TY in LINES
  339. *
  340. ***************************************************************************
  341. *     ESTIMATE THE SIZE OF A PICTURE
  342.  
  343. ******* Makes differents tries
  344. *    And finds the best square size in D1
  345. L_GetSize    equ    13
  346. L13    movem.l    a1-a3,-(sp)
  347.     lea    TSize(pc),a3
  348.     move.l    Buffer(a5),a1
  349.     moveq    #0,d7
  350.     move.w    d5,d7
  351.     clr.w    -(sp)
  352.     move.l    #$10000000,-(sp)
  353. GSize1    move.l    d7,d5
  354.     move.w    (a3)+,d1
  355.     beq.s    GSize2
  356.     divu    d1,d5
  357.     swap    d5
  358.     tst.w    d5
  359.     bne.s    GSize1
  360.     swap    d5
  361.     bsr    PacSize
  362.     cmp.l    (sp),d0
  363.     bcc.s    GSize1
  364.     move.l    d0,(sp)
  365.     move.w    d1,4(sp)
  366.     bra.s    GSize1
  367. GSize2    move.l    (sp)+,d0
  368.     move.w    (sp)+,d1
  369.     move.l    d7,d5
  370.     divu    d1,d5
  371.     movem.l    (sp)+,a1-a3
  372.     rts
  373.  
  374. ******* Simulate a packing
  375. PacSize    movem.l    d1-d7/a0-a6,-(sp)
  376. * Fake data zone
  377.         move.w     d2,Pkdx(a1)
  378.         move.w     d3,Pkdy(a1)  
  379.         move.w     d4,Pktx(a1)  
  380.         move.w     d5,Pkty(a1)   
  381.         move.w     d1,Pktcar(a1)  
  382. * Reserve intermediate table space
  383.     move.w    d1,d0
  384.     mulu    d4,d0
  385.     mulu    d5,d0
  386.     mulu    EcNPlan(a0),d0
  387.     lsr.l    #3,d0
  388.     addq.l    #2,d0
  389.     move.l    d0,-(sp)
  390.     move.l    a0,-(sp)
  391.     Rjsr    L_RamFast
  392.     Rbeq    L_JOofMem
  393.     move.l    (sp)+,a0
  394.     move.l    d0,a6
  395.     move.l    d0,-(sp)
  396. * Prepare registers
  397.         move.l    a2,a4                ;a4--> picture address
  398.         lea     PkDatas1(a1),a5            ;a5--> main datas
  399.     move.w    EcTLigne(a0),d7
  400.     move.w    d7,d5
  401.     mulu    d1,d5            ;d5--> SY line of square
  402.         move.w     Pkdy(a1),d3
  403.         mulu     d7,d3
  404.         move.w     Pkdx(a1),d0
  405.     ext.l    d0
  406.     add.l    d0,d3
  407.     move.w    EcNPlan(a0),-(sp)
  408. * Main packing
  409.         moveq     #7,d1                  * Bit pointer
  410.     moveq    #0,d0
  411. Iplan:  move.l     (a4)+,a3
  412.     add.l    d3,a3
  413.         move.w     Pkty(a1),d6
  414.     subq.w    #1,d6
  415. Iligne: move.l     a3,a2
  416.     move.w    Pktx(a1),d4
  417.     subq.w    #1,d4
  418. Icarre: move.l     a2,a0
  419.         move.w     Pktcar(a1),d2
  420.     subq.w    #1,d2
  421. Ioct0:     cmp.b     (a0),d0             * Compactage d'un carre
  422.         beq.s     Ioct1
  423.     move.b    (a0),d0
  424.         addq.l     #1,a5
  425.         bset     d1,(a6)
  426. Ioct1:  dbra     d1,Ioct2
  427.         moveq     #7,d1
  428.         addq.l     #1,a6
  429.     clr.b    (a6)
  430. Ioct2:  add.w     d7,a0
  431.         dbra     d2,Ioct0
  432.         addq.l    #1,a2    
  433.         dbra     d4,Icarre    
  434.     add.l    d5,a3    
  435.         dbra     d6,Iligne    
  436.     subq.w    #1,(sp)
  437.     bne.s    IPlan
  438.     addq.l    #2,sp
  439.     addq.l    #1,a5
  440. * Packing of first pointers table
  441.     move.l    a5,a6
  442.     move.l    4(sp),d2
  443.     move.l    d2,d0
  444.     subq.w    #1,d2
  445.     lsr.w    #3,d0
  446.     addq.w    #2,d0
  447.     add.w    d0,a5
  448.     move.l    (sp),a0
  449.     moveq    #0,d0
  450.         moveq     #7,d1
  451. Icomp2  cmp.b     (a0)+,d0
  452.         beq.s     Icomp2a
  453.     move.b    -1(a0),d0
  454.         addq.l     #1,a5
  455. Icomp2a dbra    d2,Icomp2
  456. * Final size (EVEN!)
  457.     move.l    a5,d2
  458.     sub.l    a1,d2
  459.     addq.l    #3,d2
  460.     and.l    #$FFFFFFFE,d2
  461. * Free intermediate memory
  462.     move.l    (sp)+,a1
  463.     move.l    (sp)+,d0
  464.     Rjsr    L_RamFree
  465. * Finished!
  466.     move.l    d2,d0
  467.     movem.l    (sp)+,d1-d7/a0-a6
  468.     rts
  469. ******* Packing methods
  470. TSize    dc.w     1,2,3,4,5,6,7,8,12,16,24,32,48,64,0
  471.  
  472.  
  473. ***********************************************************
  474. *    REAL PACKING!!!
  475. L_Pack        equ    14
  476. L14
  477. * Header of the packed bitmap
  478.     movem.l    d1-d7/a0-a6,-(sp)
  479.  
  480. * Packed bitmap header
  481.         move.l     #BMCode,PkCode(a1)
  482.         move.w     d2,Pkdx(a1)
  483.         move.w     d3,Pkdy(a1)  
  484.         move.w     d4,Pktx(a1)  
  485.         move.w     d5,Pkty(a1)   
  486.         move.w     d1,Pktcar(a1)  
  487.     move.w    EcNPlan(a0),PkNPlan(a1)
  488.  
  489. * Reserve intermediate table space
  490.     move.w    d1,d0
  491.     mulu    d4,d0
  492.     mulu    d5,d0
  493.     mulu    EcNPlan(a0),d0
  494.     lsr.l    #3,d0
  495.     addq.l    #2,d0
  496.     move.l    d0,-(sp)
  497.     move.l    a0,-(sp)
  498.     Rjsr    L_RamFast
  499.     Rbeq    L_JOofMem
  500.     move.l    (sp)+,a0
  501.     move.l    d0,a6
  502.     move.l    d0,-(sp)
  503.  
  504. * Prepare registers
  505.         move.l    a2,a4                ;a4--> picture address
  506.         lea     PkDatas1(a1),a5            ;a5--> main datas
  507.     move.w    EcTLigne(a0),d7
  508.     move.w    d7,d5
  509.     mulu    d1,d5            ;d5--> SY line of square
  510.         move.w     Pkdy(a1),d3
  511.         mulu     d7,d3
  512.         move.w     Pkdx(a1),d0
  513.     ext.l    d0
  514.     add.l    d0,d3
  515.     move.w    EcNPlan(a0),-(sp)
  516.  
  517. * Main packing
  518.         moveq     #7,d1                  * Bit pointer
  519.     moveq    #0,d0
  520.         clr.b     (a5)                  * First byte to zero
  521.         clr.b     (a6)              
  522. plan:   move.l     (a4)+,a3
  523.     add.l    d3,a3
  524.         move.w     Pkty(a1),d6
  525.     subq.w    #1,d6
  526. ligne:  move.l     a3,a2
  527.     move.w    Pktx(a1),d4
  528.     subq.w    #1,d4
  529. carre:  move.l     a2,a0
  530.         move.w     Pktcar(a1),d2
  531.     subq.w    #1,d2
  532. oct0:     cmp.b     (a0),d0             * Compactage d'un carre
  533.         beq.s     oct1
  534.     move.b    (a0),d0
  535.         addq.l     #1,a5
  536.         move.b     d0,(a5)
  537.         bset     d1,(a6)
  538. oct1:   dbra     d1,oct2
  539.         moveq     #7,d1
  540.         addq.l     #1,a6
  541.         clr.b     (a6)
  542. oct2:   add.w     d7,a0
  543.         dbra     d2,oct0
  544.         addq.l    #1,a2            * Carre suivant en X
  545.         dbra     d4,carre    
  546.     add.l    d5,a3            * Ligne suivante
  547.         dbra     d6,ligne    
  548.     subq.w    #1,(sp)            * Plan couleur suivant
  549.     bne.s    Plan
  550.     addq.l    #2,sp
  551.     addq.l    #1,a5
  552.  
  553. ; Packing of first pointers table
  554.     move.l    a5,d0
  555.     sub.l    a1,d0
  556.     move.l    d0,PkPoint2(a1)
  557.     move.l    a5,a6
  558.     move.l    4(sp),d0
  559.     move.l    d0,d2
  560.     subq.w    #1,d2
  561.     lsr.w    #3,d0
  562.     addq.w    #2,d0
  563.     add.w    d0,a5
  564.     move.l    a5,d0
  565.     sub.l    a1,d0
  566.     move.l    d0,PkDatas2(a1)
  567.     move.l    (sp),a0
  568.     moveq    #0,d0
  569.         moveq     #7,d1
  570.         clr.b     (a5)
  571.         clr.b     (a6)
  572. comp2:  cmp.b     (a0)+,d0
  573.         beq.s     comp2a
  574.     move.b    -1(a0),d0
  575.         addq.l     #1,a5
  576.         move.b     d0,(a5)
  577.         bset     d1,(a6)
  578. comp2a: dbra     d1,comp2b
  579.         moveq     #7,d1
  580.         addq.l     #1,a6
  581.         clr.b     (a6)
  582. comp2b: dbra    d2,Comp2
  583.  
  584. * Free intermediate memory
  585.     move.l    (sp)+,a1
  586.     move.l    (sp)+,d0
  587.     RJsr    L_RamFree
  588.     movem.l    (sp)+,d1-d7/a0-a6
  589.     rts
  590.  
  591. ***********************************************************
  592. *        Bitmap unpacker
  593. *        A0-> packed picture
  594. *        A1-> Destination screen
  595. *        D1.L Start in X
  596. *        D2.L Start in Y
  597. UAEc:    equ 0
  598. UDEc:    equ 4
  599. UITy:    equ 8
  600. UTy:    equ 10
  601. UTLine:    equ 12
  602. UNPlan:    equ 14
  603. UPile:    equ 16
  604. L_UnPack    equ    15
  605. L15    movem.l    a0-a6/d1-d7,-(sp)
  606.  
  607. * Jump over SCREEN DEFINITION
  608.     cmp.l    #SCCode,(a0)
  609.     bne.s    dec0
  610.     lea    PsLong(a0),a0
  611. * Is it a packed bitmap?
  612. dec0    cmp.l    #BMCode,(a0)
  613.     Rbne    L_NoPac
  614.  
  615. * Parameter preparation
  616.     lea    -UPile(sp),sp        * Space to work
  617.     lea    EcCurrent(a1),a2
  618.     move.l    a2,UAEc(sp)        * Bitmaps address
  619.         move.w     EcTLigne(a1),d7        * d7--> line size
  620.     move.w    EcNPlan(a1),d0        * How many bitplanes
  621.     cmp.w    PkNPlan(a0),d0
  622.     Rbne    L_JFoncall
  623.     move.w    d0,UNPlan(sp)
  624.     move.w    Pktcar(a0),d6        * d6--> SY square
  625.  
  626.         tst.l     d1            * Screen address in X
  627.         bpl.s     dec1
  628.         move.w     Pkdx(a0),d1
  629. dec1:   tst.l     d2            * In Y
  630.         bpl.s     dec2
  631.         move.w     Pkdy(a0),d2
  632. dec2:   move.w    Pktx(a0),d0
  633.     add.w    d1,d0
  634.     cmp.w    d7,d0
  635.     Rbhi    L_JFoncall
  636.     move.w    Pkty(a0),d0
  637.     mulu    d6,d0
  638.     add.w    d2,d0
  639.     cmp.w    EcTy(a1),d0
  640.     Rbhi    L_JFoncall
  641.  
  642.     mulu    d7,d2            * Screen address
  643.     ext.l    d1    
  644.     add.l    d2,d1
  645.     move.l    d1,UDEc(sp)
  646.     
  647.     move.w    d6,d0            * Size of one line
  648.         mulu     d7,d0
  649.         move     d0,UTLine(sp)
  650.  
  651.         move.w     Pktx(a0),a3        * Size in X
  652.         subq.w    #1,a3
  653.         move.w     Pkty(a0),UITy(sp)    * in Y
  654.         lea     PkDatas1(a0),a4            * a4--> bytes table 1
  655.         move.l     a0,a5
  656.         move.l     a0,a6
  657.         add.l     PkDatas2(a0),a5         * a5--> bytes table 2
  658.         add.l     PkPoint2(a0),a6         * a6--> pointer table
  659.  
  660.         moveq     #7,d0            
  661.         moveq     #7,d1
  662.         move.b     (a5)+,d2
  663.         move.b     (a4)+,d3
  664.         btst     d1,(a6)
  665.         beq.s     prep
  666.         move.b     (a5)+,d2
  667. prep:   subq.w     #1,d1
  668.  
  669. * Unpack!
  670. dplan:  move.l     UAEc(sp),a2
  671.     addq.l    #4,UAEc(sp)
  672.     move.l    (a2),a2
  673.     add.l    UDEc(sp),a2
  674.         move.w     UITy(sp),UTy(sp)    * Y Heigth counter
  675. dligne: move.l     a2,a1
  676.         move.w     a3,d4
  677. dcarre: move.l     a1,a0
  678.         move.w     d6,d5           * Square height
  679. doctet1:subq.w     #1,d5
  680.         bmi.s     doct3
  681.         btst     d0,d2
  682.         beq.s     doct1
  683.         move.b     (a4)+,d3
  684. doct1:  move.b     d3,(a0)
  685.         add.w     d7,a0
  686.         dbra     d0,doctet1
  687.         moveq     #7,d0
  688.         btst     d1,(a6)
  689.         beq.s     doct2
  690.         move.b     (a5)+,d2
  691. doct2:  dbra     d1,doctet1
  692.         moveq     #7,d1
  693.         addq.l     #1,a6
  694.         bra.s     doctet1
  695. doct3:  addq.l    #1,a1               * Other squares?
  696.         dbra     d4,Dcarre
  697.         add.w     UTLine(sp),a2              * Other square line?
  698.         subq.w     #1,UTy(sp)
  699.         bne.s     Dligne
  700.         subq.w     #1,UNPlan(sp)
  701.         bne.s     Dplan
  702.         lea    UPile(sp),sp            * Restore the pile
  703. * Finished!
  704.     movem.l    (sp)+,a0-a6/d1-d7
  705.     rts
  706.  
  707.  
  708. ***********************************************************
  709. *        JUMP TO ERROR MESSAGES
  710. L_JFoncall    equ    16
  711. L16    moveq    #23,d0
  712.     RJmp    L_Error
  713. L_JScnop    equ    17
  714. L17    moveq    #47,d0
  715.     RJmp    L_Error
  716. L_JOOfmem    equ    18
  717. L18    moveq    #24,d0
  718.     RJmp    L_Error
  719.  
  720. ***********************************************************
  721. *        ERROR HANDLING
  722. L_NoPac        equ    19
  723. L19    moveq    #0,d0
  724.     RBra    L_Custom
  725. L_NoScr        equ    20
  726. L20    moveq    #1,d0
  727.     RBra    L_Custom
  728.  
  729. ***********************************************************
  730. *        ERROR MESSAGES
  731.  
  732. ******* First routine
  733. L_Custom    equ    21
  734. L21    lea    ErrMes(pc),a0
  735.     moveq    #0,d1
  736.     moveq    #ExtNb,d2
  737.     moveq    #0,d3
  738.     RJmp    L_ErrorExt
  739. ErrMes    dc.b     "Not a packed bitmap",0
  740.     dc.b     "Not a packed screen",0
  741.     even    
  742. ******* Second routine
  743. L22    moveq    #0,d1
  744.     moveq    #ExtNb,d2
  745.     moveq    #0,d3
  746.     RJmp    L_ErrorExt
  747. L23
  748.  
  749. ***********************************************************
  750. *         Welcome message
  751. C_Title    dc.b     31,"Picture compactor V 1.2",0
  752.     even
  753.  
  754. ***********************************************************
  755. C_End    dc.w    0
  756.  
  757.  
  758.