// DI = адрес строки
void fastcall StringUp(DI)
{
 SI=DI;
 do{
  $lodsb
  IF (AL>='a')&&(AL<='z') AL-=32;
  $stosb
 }while (AL!=0);
}

// ES = destination seg
// DS = sours seg
// SI = sours offset
// DI = destination offset
word fastcall StrCpy(SI,DI)
{
 BX=DI;
 do{
  $lodsb
  $stosb
 }while (AL!=0);
 return(DI-BX);
}

// DS = Сегмент строки
// SI = Адрес строки
byte fastcall StrHex2Byte(SI)
{
 BL=0; CX=2;
 loop(CX){
  $lodsb

  IF (AL==0)||(AL=='H')||(AL=='h') BREAK;

  IF (AL>='0')&&(AL<='9') AL-='0';
  ELSE IF (AL>='a')&&(AL<='f') AL-='a'-10;
  ELSE AL-='A'-10;

  BL=BL*16+AL;
 }
 return(BL);
}

// DS = Сегмент строки
// SI = Адрес строки
word fastcall StrHex2Word(SI)
{
 BX=0; CX=4; AH=0;
 loop(CX){
  $lodsb

  IF (AL==0)||(AL=='H')||(AL=='h') BREAK;

  IF (AL>='0')&&(AL<='9') AL-='0';
  ELSE IF (AL>='a')&&(AL<='f') AL-='a'-10;
  ELSE AL-='A'-10;

  BX=BX*16+AX;
 }
 return(BX);
}

// DS = Сегмент первой строки
// ES = Сегмент второй строки
// SI = адрес первой строки
// DI = адрес второй строки
:byte fastcall StrCompare(SI,DI)
{
 AH=TRUE;
 do{
  $lodsb
  IF (AL!=ESBYTE[DI]){AH=FALSE; BREAK;}
  DI++;
 }while (AL!=0);
 return(AH);
}

