home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / enterprs / cpm / utils / f / lzh21src.lbr / ENCODECH.MYC / ENCODECH.MYC
Encoding:
Text File  |  1993-03-25  |  1.9 KB  |  88 lines

  1. ;
  2. ;   ENCODECH_  - Huffman encode and output a character
  3. ;
  4. ;    Action    - Encodes a value to a bit string according to the Huffman
  5. ;          tree.  Encoded character is output, tree is updated.
  6. ;    Input    - H/L is the value to be encoded
  7. ;          be inserted.
  8. ;    Output    - See Action
  9. ;    Entry    - encodech_
  10. ;    Registers - All scratch except B/C (preserved)
  11. ;    Calls    - Putcode_, Update_
  12.  
  13. ;void EncodeChar(unsigned c)
  14. ;{
  15. ;    unsigned i;
  16. ;    int j, k;
  17. ;
  18. ;    k = prnt[c + T];
  19. ;
  20. ;    /* search connections from leaf node to the root */
  21. ;    do {
  22. ;        i >>= 1;
  23. ;
  24. ;        /*
  25. ;        if node's address is odd, output 1
  26. ;        else output 0
  27. ;        */
  28. ;        if (k & 1) i += 0x8000;
  29. ;        j++;
  30. ;    } while ((k = prnt[k]) != R);
  31. ;    Putcode(j, i);
  32. ;    code = i;
  33. ;    len = j;
  34. ;    update(c);
  35. ;}
  36.     CSEG
  37. ENCODECH_:
  38.  
  39.     PUSH    B            ; Save b for exit
  40.  
  41.     SHLD    SMALLC            ; Save for exit call
  42.     DAD    H            ; Double (for pre-multiplication)
  43.  
  44.     LXI    D,T2            ; Index into beginning of char table
  45.     DAD    D            ; H/l is starting index
  46.     XRA    A            ; Length is 0
  47.     MOV    B,A            ; 'CODE' part 1
  48.     MOV    C,A            ; 'CODE' part 2
  49.     LOAD    <LXI    D>,%(PRNT_)    ; Point to parent base
  50. CODEL:    STA    TEMPL            ; Save length
  51.     DAD    D            ; Point to table
  52.     MOV    A,M            ; Get low
  53.     INX    H
  54.     MOV    H,M            ; 'k' in h/a
  55.     MOV    L,A            ; Get low
  56.  
  57.     CPI    R2 AND 0FFH
  58.     JNZ    LBL5            ; Not equal
  59.     MOV    A,H            ; Get high
  60.     CPI    R2 SHR 8 AND 0FFH
  61.     JZ    FROOT
  62.     MOV    A,L            ; Get node addr
  63. LBL5:
  64.     RAR                ; Lsb to carry
  65.     RAR                ; Times 2 (for index pre-mult)
  66.     MOV    A,B            ; Get code
  67.     RAR                ; Ripple in carry
  68.     MOV    B,A            ; Restore
  69.     MOV    A,C            ; Get low
  70.     RAR                ; Propagate
  71.     MOV    C,A            ; Save
  72.     MVI    A,00            ; Get length
  73. TEMPL    EQU    $-1
  74.     INR    A            ; Count
  75.     JMP    CODEL            ;
  76.  
  77. FROOT:    LDA    TEMPL            ; Get length
  78.     MOV    H,B            ; Get code
  79.     MOV    L,C            ; To h/l
  80.     CALL    PUTCODE_
  81.  
  82. ; note: 'c' saved for this call at entry
  83.  
  84.     CALL    UPDATE_
  85.     POP    B            ; Restore entry b/c
  86.     RET
  87.  
  88.