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

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