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

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