// Выгружаем DinRus из памяти
:void fastcall UnLoadDinrus()
{
 // Узнаем сегмент программы
 AX=0E901h; int 2fh
 IF (AX==0E901h) WRITESTR("\nПрограмма не запущена");
 else{
    // Проверяем таблицу векторов
    // Устанавливаем ES в 0
    ES=0;
    // Если все в порядке
    if (ESWORD[09h*4+2]==AX)&&(ESWORD[010h*4+2]==AX)&&(ESWORD[016h*4+2]==AX)&&(ESWORD[02Fh*4+2]==AX){
       // Сохраняем DS
       push DS

        // Устанавливаем DS на CS (AX)
        DS=AX;
        // Устанавливаем старые обработчики прерываний
        SETINTVECT(,09h,OldKeyboardInterrupt[2],OldKeyboardInterrupt[0]);
        SETINTVECT(,016h,OldInt16h[2],OldInt16h[0]);
        SETINTVECT(,010h,OldInt10h[2],OldInt10h[0]);
        SETINTVECT(,02Fh,OldInt2fh[2],OldInt2fh[0]);
        // Освобождаем использованную память
        FOR (BX=DS,CX=0,DX=0; CX<#main+1; CX+=16,BX++,DX++){
            ES=BX; AH=49h; int 21h
        }

       // Восстанавливаем DS
       pop DS

       $push DX WRITESTR("\nКоличество распределенных параграфоф: "); $pop DX
       WRITEWORD(DX);

       // Вывод информации о выгрузке DinRus-а
       WRITESTR("\n\nDinRus выгружен из памяти");
    }ELSE WRITESTR("\nDinRus не может быть выгружен из памяти");
 }
}

// Переназначаем цвет бордюра
:void fastcall SetBorderColor()
{
 // Проверяем на параметр
 IF (PARAMCOUNT()<3) WRITESTR("\nОпущен обязательный параметр");
 ELSE{
    // Преобразуем из шестнадцатиричного числа-строки в byte
    BorderColor=StrHex2Byte(PARAMSTR(2));

    // Правим конциг
    BX=FOPEN(#CMDLine,1);
     FWRITE(BX,#BorderColor,1);
    FCLOSE(BX);

    WRITESTR("\nКонфиг подправлен");
 }
}

// Выводим информацию о DinRus-е
:void fastcall DinRusInfo()
{
 WRITESTR("\nКомпилятор: "); WRITESTR(__COMPILER__);
 WRITESTR("\nДата создания: "); WRITESTR(__DATESTR__);
 WRITESTR(DinInfo);
}

// Переназначаем сканкод переключателя
:void fastcall SetHotKeyScanCode()
{
 // Проверяем на параметр (расширенный сканкод)
 IF (PARAMCOUNT()<3) WRITESTR("\nОпущен обязательный параметр");
 ELSE{
    // Преобразуем из шестнадцатиричного числа-строки в word
    StrHex2Word(PARAMSTR(2));
    sw=AL; ExtendedSwitch=AH;

    // Правим конфиг
    BX=FOPEN(#CMDLine,1);
     FSEEK32(BX,dword 1,0);
     FWRITE(BX,#sw,1);
     FWRITE(BX,#ExtendedSwitch,1);
    FCLOSE(BX);

    WRITESTR("\nКонфиг подправлен");
 }
}

// Принимаем изменения (перечитка конфига)
:void fastcall ApplyChanges()
{
 // Узнаем сегмент программы (AX)
 AX=0E901h; int 2fh
 IF (AX==0E901h) WRITESTR("\nПрограмма не запущена");
 ELSE{
    // Сохраняем DS
    $push DS

     // Сохраняем сегмент резидентного DinRus-a на стеке
     $push AX
     // Читаем конфиг и правим настройки резидентного DinRus-а
     // Открываем конфиг
     BX=FOPEN(#CMDLine,0);
      // Устанавливаем DS на сегмент резидентного DinRus-а
      $pop DS
      // Читаем конфиг
      FREAD(BX,#BorderColor,1);
      FREAD(BX,#sw,1);
      FREAD(BX,#ExtendedSwitch,1);
     // Закрываем конфиг
     FCLOSE(BX);

    // Восстанавливаем DS
    $pop DS

    WRITESTR("\nИзменения приняты");
 }
}
