home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / ENTERPRS / CPM / UTILS / A / CRLZH21.LBR / ENCODEPO.MYC / ENCODEPO.MYC
Text File  |  2000-06-30  |  2KB  |  81 lines

  1. ;
  2. ;   ENCODEPO_ - Encode buffer postion and output
  3. ;
  4. ;    Action    - The relative buffer position is encoded and output.
  5. ;    Input    - match_po_ is the (relative) match position
  6. ;    Output    - As above
  7. ;    Entry    - encodepo_
  8. ;    Registers - All scratch except B/C (preserved)
  9. ;    Calls    - putcode_
  10.  
  11. ; Additional notes:
  12. ;    The original algorithm used a 4096 character buffer, requiring
  13. ;    Encoding for 12 bits (0-4095).  Space for auxilliary tables
  14. ;    necessitated the shortening of the buffer to 2048 for the CP/M
  15. ;    version.  This made the most significant bit of the index 0.
  16. ;    Version 1 encoding made use of this fact.    The encoding data tables were
  17. ;    'shortend' to reflect the fact that only 5 bits of the upper 6 were
  18. ;    non-zero.    However, since the design wasn't 'finalized', the generalized
  19. ;    12-bit encoding capability was preserved.
  20. ;
  21. ;    With version 2 encoding, the decision to employ the additional (or
  22. ;    original) capability of the encoding algorithm was made.  This results
  23. ;    in slightly better compression capability (the version 1 encoding caused
  24. ;    a certain amount of usable information bits to go unused).  Since the
  25. ;    index is still only 11 bits in lenght, version 2 encoding table-encodes
  26. ;    the upper 6 bits and sends the lower 5 bits out directly.
  27.  
  28.  
  29. ;extern char p_len[],p_code[];
  30. ;
  31. ;void EncodePosition(unsigned c)
  32. ;{
  33. ;    unsigned i;
  34.  
  35.     CSEG
  36. ENCODEPO_:
  37.     PUSH    B            ; Save general counter regs
  38.  
  39. ;    /* output upper 6 bits with encoding */
  40. ;    i = c >> 6;
  41.  
  42.     LHLD    MATCH_PO_
  43.     DAD    H            ; Same as shift left 2
  44.     DAD    H            ; And use high byte
  45.  
  46.      IF    VERS2
  47.     DAD    H            ; Version 2 requires 1 more shift for
  48.                     ; Upper 6 bits
  49.      ENDIF
  50.  
  51.     MOV    A,L            ; Get low
  52.     STA    LOWSAVE            ; Save for later
  53.     MOV    C,H            ; Get high
  54.     MVI    B,0            ; Convert to 16 bits
  55.  
  56. ;    Putcode(p_len[i], (unsigned)p_code[i] << 8);
  57.  
  58.     LXI    H,P_LEN_
  59.     DAD    B            ; Get index
  60.     MOV    A,M            ; Get length
  61.     LXI    H,P_CODE_        ; Get code
  62.     DAD    B            ; Index
  63.     MOV    H,M            ; Get into high
  64.     CALL    PUTCODE_
  65. ;
  66. ;    /* output lower 6 bits directly */
  67. ;    Putcode(6, (c & 0x3f) << 10);
  68.  
  69.     MVI    H,0            ; Low of shl x
  70. LOWSAVE    EQU    $-1
  71.  
  72.      IF    VERS2
  73.     MVI    A,5            ; Only 5 bits for version 2
  74.      ELSE
  75.     MVI    A,6            ; 6 bits for version 1
  76.      ENDIF
  77.     CALL    PUTCODE_
  78. ;}
  79.     POP    B            ; Restore entry B/C
  80.     RET
  81.