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

  1. ;void  set_mem_byte(bit_string,position,segment,offset);
  2. ;  unsigned char   *bit_string,position;
  3. ;  unsigned short  segment,offset;
  4.  
  5.     EXTRN  _memory_model:byte
  6.     EXTRN  _error_code:byte
  7.  
  8. _TEXT    SEGMENT  BYTE PUBLIC 'CODE'
  9.     ASSUME CS:_TEXT
  10.     PUBLIC _set_mem_byte
  11. _set_mem_byte proc near
  12.     push bp            ;
  13.     mov  bp,sp        ;set stack frame
  14.     push di            ;
  15.     push si            ;
  16.     cmp  _memory_model,0    ;near or far?
  17.     jle  begin        ;jump if near
  18.     inc  bp            ;else add 2 to BP
  19.     inc  bp            ;
  20. begin:    push ds            ;save DS
  21.     cmp  _memory_model,2    ;data near or far?
  22.     jb   L0            ;jump ahead if near
  23.     lds  si,dword ptr[bp+4] ;DS:SI pts to Bits
  24.     inc  bp            ;add 2 to BP since dword ptr
  25.     inc  bp            ;
  26.     jmp  short L00        ;
  27. L0:    mov  si,[bp+4]        ;
  28. L00:    mov  byte ptr[bp+4],0    ;errorcode 0 = no error
  29.     mov  ax,[bp+8]        ;get segment
  30.     mov  es,ax        ;place in ES
  31.     mov  di,[bp+10]        ;get offset
  32.     mov  bx,1        ;BX is mask, set low bit
  33.     sub  cx,cx        ;clear CX
  34.     mov  cl,[bp+6]        ;get field start pos
  35.     jcxz L1            ;jump if start at bit 0
  36.     shl  bl,cl        ;mov mask bit to starting pos
  37. L1:    cmp  byte ptr[si],0    ;null string?
  38.     je   L6            ;quit if so
  39.     mov  cx,8        ;as many as eight bits
  40.     sub  cx,dx        ;minus start position = max bits to write
  41.     mov  dl,es:[di]        ;place memory value in DL
  42. L2:    mov  al,[si]        ;get byte from string
  43.     cmp  al,0        ;end of string?
  44.     je   L5            ;quit
  45.     cmp  al,'1'        ;a '1'?
  46.     jne  L3            ;jump if not
  47.     or   dl,bl        ;set bit
  48.     jmp  short L4        ;jump ahead
  49. L3:    not  bl            ;reverse mask
  50.     and  dl,bl        ;clear the bit
  51.     not  bl            ;restore mask
  52. L4:    inc  si            ;forward string pointer
  53.     shl  bl,1        ;shift mask
  54.     loop L2            ;go do next
  55.     inc  byte ptr[bp+4]    ;1 = binary string too long
  56. L5:    mov  es:[di],dl        ;return value to memory
  57. L6:    pop  ds            ;restore DS
  58.     mov  al,[bp+4]        ;fetch _error_code
  59.     mov  _error_code,al    ;set it
  60.     pop  si            ;
  61.     pop  di            ;
  62.     pop  bp            ;
  63.     cmp  _memory_model,0    ;quit
  64.     jle  quit        ;
  65.     db   0CBh        ;RET far
  66. quit:    ret            ;RET near
  67. _set_mem_byte endp
  68. _TEXT    ENDS
  69.     END
  70.