home *** CD-ROM | disk | FTP | other *** search
/ Voyagers to the Outer Planets 2: Uranus / VoyagestotheOuterPlanetsVol2.cdr / software / dcmprs.mar < prev    next >
Text File  |  1988-09-14  |  4KB  |  83 lines

  1.         .title dcmprs
  2. ;*******************************************************************************
  3. ;_TITLE         DCMPRS, a subroutine to decompress a line of image data
  4. ;
  5. ;_CALL_SEQ      the FORTRAN call is
  6. ;               CALL DCMPRS (ibuf, obuf, nb, ns, tree)
  7. ;
  8. ;_ARGS          ibuf - input compressed bit string (character variable)
  9. ;               obuf - output decompressed image line (character variable)
  10. ;                      (both ibuf and obuf must declared as character
  11. ;                      variables in by the calling program)
  12. ;               nb -   number of bytes in input string
  13. ;               ns -   number of bytes expected in output line
  14. ;               tree - binary tree for decompressing line
  15. ;
  16. ;_DESC          The routine uses each successive bit in the input
  17. ;               string to trace down the tree to the leaf.  The value
  18. ;               of the pixel is stored in the leaf.  If diff is true
  19. ;               the routine reconstructs the undifferenced pixel
  20. ;               value.  For VAX/VMS users using the fortran versions
  21. ;               of the decompression software, this macro version
  22. ;               can replace the fortran version of the same name. By
  23. ;               utilizing the macro version, the speed of the decompression
  24. ;               software will improve by a factor of 2. This routine
  25. ;               only works with the fortran versions of the decompression
  26. ;               software
  27. ;
  28. ;_HIST          28Jul87, DMcMacken, ISD, Flagstaff, Original version
  29. ;
  30. ;_END
  31. ;*******************************************************************************
  32. ;
  33. ;       local variables
  34. ;
  35. root:   .long                   ;tree root pointer
  36. ;
  37.         .entry  dcmprs,^m<r2,r3,r4,r5,r6,r7,r8,r9,r10,r11>
  38. ;
  39.         movl    4(ap),r11       ;input buffer descriptor
  40.         movl    4(r11),r11      ;input buffer address
  41.         movl    8(ap),r10       ;output buffer descriptor
  42.         movl    4(r10),r10    ;output buffer address
  43.         movl    @12(ap),r9      ;number input bytes
  44.         movl    @16(ap),r8      ;number output samples expected
  45.         movl    20(ap),r7       ;address of code tree
  46. ;
  47.         movl    #1023,r5
  48.         mull2   #5,r5
  49.         movzwl  (r7)[r5],root
  50.         decl    root
  51.         mull2   #5,root
  52. ;
  53.         decl    r8              ;count first sample
  54.         decl    r9              ;..it is not compressed
  55.         movzbw  (r11)+,r6       ;get first sample
  56.         movb    r6,(r10)+       ;return it unchanged
  57. ;
  58.         movl    root,r5         ;pointer to root of tree
  59. loop:   movzbw  (r11)+,r3       ;get next byte
  60.         movl    #7,r4           ;bit pointer
  61. lp2:    bbc     r4,r3,right     ;test input bit
  62.                                 ;0 - right
  63.                                 ;1 - left
  64.         movw    4(r7)[r5],r5    ;get left pointer
  65.         brb     cont            ;continue
  66. right:  movw    2(r7)[r5],r5    ;get right pointer
  67. cont:   decl    r5              ;compute new
  68.         mull2   #5,r5           ;...offset
  69.         cmpw    #-1,(r7)[r5]    ;at leaf?
  70.         beql    next            ;no, go to next branch
  71.         movw    (r7)[r5],r2     ;yes, get value
  72.         subw2   r2,r6           ;compute difference
  73.         addw2   #256,r6         ;make it positive
  74.         movw    r6,r2           ;return value to r2
  75.         movb    r2,(r10)+       ;return sample
  76.         movl    root,r5         ;point back to root
  77.         sobgtr  r8,next         ;more samples?
  78.         ret                     ;no, return to caller
  79. next:   sobgeq  r4,lp2          ;more bits in current byte?
  80.         sobgtr  r9,loop         ;no, is there another input byte?
  81.         ret                     ;no, return
  82.         .end
  83.