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

  1. ;unsigned short  char_field(value,start_bit,number_bits);
  2. ;  unsigned char  value,start_bit,number_bits;
  3.  
  4.     EXTRN  _memory_model:byte
  5.     EXTRN  _error_code:byte
  6.  
  7. _TEXT    SEGMENT BYTE PUBLIC 'CODE'
  8.     ASSUME CS:_TEXT
  9.     PUBLIC _char_field
  10. _char_field proc near
  11.     push bp            ;save BP
  12.     mov  bp,sp        ;set stack frame
  13.     push di            ;
  14.     cmp  _memory_model,0    ;near or far?
  15.     jle  begin        ;jump if near
  16.     inc  bp            ;else add 2 to BP
  17.     inc  bp            ;
  18. begin:    mov  _error_code,0    ;clear _error_code
  19.     sub  ax,ax        ;clear AX
  20.     mov  bx,ax        ;BX too
  21.     mov  dx,ax        ;DX too
  22.     mov  bl,[bp+8]        ;number of bits
  23.     mov  dl,[bp+6]        ;starting bit
  24.     inc  _error_code    ;1 = bits out of range
  25.     cmp  dl,7        ;in range?
  26.     ja   L1            ;quit if not
  27.     mov  di,dx        ;copy start bit
  28.     add  di,bx        ;add number bits
  29.     inc  _error_code    ;2 = field doesn't fit
  30.     cmp  di,8        ;fits in the byte?
  31.     ja   L1            ;quit if not
  32.     mov  cx,8        ;from 8 bits...
  33.     sub  cx,bx        ;subtract number of bits
  34.     sub  cx,dx        ;subtract starting bit
  35.     mov  al,[bp+4]        ;get the byte
  36.     shl  al,cl        ;shift field to high end
  37.     add  cx,dx        ;prepare to shift back
  38.     shr  al,cl        ;shift field to low end
  39.     mov  _error_code,0    ;0 = success
  40. L1:    pop  di            ;
  41.     pop  bp            ;
  42.     cmp  _memory_model,0    ;quit
  43.     jle  quit        ;
  44.     db   0CBh        ;RET far
  45. quit:    ret            ;RET near
  46. _char_field endp
  47. _TEXT    ENDS
  48.     END
  49.