home *** CD-ROM | disk | FTP | other *** search
/ World of Shareware - Software Farm 2 / wosw_2.zip / wosw_2 / CPROG / CEXPRESS.ZIP / BITS.ASM / COMPRS16.ASM < prev    next >
Assembly Source File  |  1989-05-03  |  3KB  |  89 lines

  1. ;unsigned int  compress_16(source,target,bits,pos,num);
  2. ;  unsigned char  *source,*target,bits,pos,num;
  3.  
  4.     EXTRN  _memory_model:byte
  5.     EXTRN  _error_code:byte
  6.  
  7. _TEXT    SEGMENT BYTE PUBLIC 'CODE'
  8.     ASSUME CS:_TEXT
  9.     PUBLIC _compress_16
  10. _compress_16 proc near
  11.     jmp  short start    ;
  12. target_count  dw  ?        ;
  13. start:    mov  cs:target_count,0    ;
  14.     push bp            ;
  15.     mov  bp,sp        ;set stack frame
  16.     push di            ;
  17.     push si            ;
  18.     pushf            ;
  19.     push ds            ;
  20.     cmp  _memory_model,0    ;near or far?
  21.     jle  begin        ;jump if near
  22.     inc  bp            ;else add 2 to BP
  23.     inc  bp            ;
  24. begin:    mov  _error_code,1    ;1 = error
  25.     cmp  _memory_model,2    ;data near or far?
  26.     jb   L1            ;jump if near
  27.     lds  si,dword ptr[bp+4] ;DS:SI pts to Source
  28.     les  di,dword ptr[bp+8] ;ES:DI pts to Target
  29.     add  bp,4        ;add 4 to bp since 2 far ptrs
  30.     jmp  short L2        ;jump ahead
  31. L1:    mov  ax,ds        ;ES = DS
  32.     mov  es,ax        ;
  33.     mov  si,[bp+4]        ;DS:SI
  34.     mov  di,[bp+6]        ;ES:DI
  35. L2:    cld            ;set direction flag
  36.     sub  ax,ax        ;clear AX
  37.     mov  al,[bp+8]        ;number bits to copy
  38.     or   ax,ax        ;test for zero
  39.     jz   L8            ;quit if zero
  40.     add  al,[bp+10]        ;add Position
  41.     cmp  al,16        ;does the pattern fit?
  42.     ja   L8            ;jump ahead if OK
  43.     mov  bx,1        ;BX holds mask for AX
  44.     mov  cl,[bp+10]        ;starting bit
  45.     shl  bx,cl        ;move mask to start pos
  46.     mov  [bp+10],bx        ;copy at [bp+10]
  47.     sub  dl,dl        ;DL holds Target byte
  48.     mov  dh,1        ;DH masks Target byte
  49. L3:    lodsw            ;Source element in AX
  50.     mov  bx,[bp+10]        ;get starting mask
  51.     sub  cx,cx        ;clear CX
  52.     mov  cx,[bp+8]        ;bit field length
  53. L4:    test ax,bx        ;test if bit set
  54.     jz   L5            ;jump if not set
  55.     or   dl,dh        ;set bit in Target value
  56. L5:    cmp  dh,128        ;end of Target byte?
  57.     jne  L6            ;jump ahead if not
  58.     mov  es:[di],dl        ;save the value
  59.     inc  cs:target_count    ;inc count of target bytes changed
  60.     inc  di            ;point to next target pos
  61.     sub  dl,dl        ;clear next target byte
  62.     mov  dh,1        ;else restart at bottom
  63.     jmp  short L7        ;don't shift target mask
  64. L6:    shl  dh,1        ;forward target mask
  65. L7:    shl  bx,1        ;forward source mask
  66.     loop L4            ;go do next bit of Source
  67.     dec  word ptr[bp+12]    ;dec source element ctr
  68.     jnz  L3            ;go get next element
  69.     pop  ds            ;
  70.     dec  _error_code    ;0 = no error
  71.     mov  es:[di],dl        ;save last byte of Target
  72.     cmp  dh,1        ;just beginning new byte?
  73.     je   L9            ;jump ahead if so
  74.     inc  cs:target_count    ;inc count of target bytes changes
  75.     jmp  short L9        ;
  76. L8:    pop  ds            ;
  77. L9:    mov  ax,cs:target_count    ;set return value
  78.     popf            ;
  79.     pop  si            ;
  80.     pop  di            ;
  81.     pop  bp            ;
  82.     cmp  _memory_model,0    ;quit
  83.     jle  quit        ;
  84.     db   0CBh        ;RET far
  85. quit:    ret            ;RET near
  86. _compress_16 endp
  87. _TEXT    ENDS
  88.     END
  89.