(*~\Глагол\Приложения\Свои\~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
                                  ОТДЕЛ Регистр;
(*============================================================================
 *      Пример библиотечного отдела (используется в приложении ПроРегистр+)
 *============================================================================*)

ИСПОЛЬЗУЕТ
  ОБХОД (*,
  Асм     ИЗ "..\..\Отделы\Заграница\"
        *);

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА БайтИзРядаЯчеек-
      (
            регистр-:РЯД ИЗ ОБХОД.Ячейка;  (* ОБХОД.Ячейки, РАЗМЕР(регистр)=4 или 8 *)
          номерБайта:ЦЕЛ                   (* номер извлекаемого байта: 0..7 *)
      ):ЯЧЦЕЛ;
УКАЗ
(*
  ЕСЛИ (номерБайта >= 0)
      И
       (номерБайта < РАЗМЕР(регистр))
  ТО
    ВОЗВРАТ ОБХОД.Значение(ЯЧЦЕЛ,
                  регистр[номерБайта] (* преобразование эл.ряда в ЯЧЦЕЛ *)
                          )
(*
  ИНАЧЕ
    СТОП (номерБайта) (* работа приложения *)
или
    ВОЗВРАТ ОБХОД.Значение(ЯЧЦЕЛ,УЗК(УЗК(РАЗМЕР(регистр))))
 *)
  КОН;
*)
    ВОЗВРАТ ОБХОД.Значение(ЯЧЦЕЛ,
                  регистр[номерБайта] (* преобразование эл.ряда Байт *)
                          )
КОН БайтИзРядаЯчеек;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА ЯчейкаИзРядаЯчеек-
      (
            регистр-:РЯД ИЗ ОБХОД.Ячейка;  (* ОБХОД.Ячейки, РАЗМЕР(регистр)=4 или 8 *)
         номерЯчейки:ЦЕЛ;                  (* номер извлекаемой Ячейки: 0..7 *)
                 яц+:ЯЧЦЕЛ
      );
УКАЗ
(*
  ЕСЛИ (номерЯчейки >= 0)
      И
       (номерЯчейки < РАЗМЕР(регистр))
  ТО
    ЕСЛИ  номерЯчейки = 0 ТО
      ОБХОД.ИзПамяти(ОБХОД.ПолучитьАдрес(регистр)+номерЯчейки (* *1 *), (* Адрес эл.ряда яц, 1=SIZE(ЯЧЦЕЛ) *)
                     яц)
    АЕСЛИ номерЯчейки > 0 ТО
(*
  ИНАЧЕ
    СТОП (номерЯчейки) (* работа приложения *)
 *)
  КОН;
или
      ОБХОД.Образ   (ОБХОД.ПолучитьАдрес(регистр)+номерЯчейки (* *1 *), (* Адрес эл.ряда яц, 1=SIZE(ЯЧЦЕЛ) *)
                     яц,1)
*)
      ОБХОД.ИзПамяти(ОБХОД.ПолучитьАдрес(регистр)+номерЯчейки (* *1 *), (* Адрес эл.ряда яц, 1=SIZE(ЯЧЦЕЛ) *)
                     яц)
КОН ЯчейкаИзРядаЯчеек;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА УзкИзРядаЯчеек-
      (
            регистр-:РЯД ИЗ ОБХОД.Ячейка;  (* ОБХОД.Ячейки, РАЗМЕР(регистр)=4 или 8 *)
            номерУзк:ЦЕЛ;                  (* номер извлекаемого узк: 0,1,2 или 3 *)
                узк+:УЗКЦЕЛ
      );
УКАЗ
(*
  ЕСЛИ (номерУзк >= 0)
      И
       (номерУзк < (РАЗМЕР(регистр) ДЕЛИТЬ 2))
  ТО
    ЕСЛИ  номерУзк = 0 ТО
      ОБХОД.ИзПамяти(ОБХОД.ПолучитьАдрес(регистр),            (* Адрес эл.ряда узк, 2=SIZE(УЗКЦЕЛ) *)
                     узк)
    АЕСЛИ номерУзк > 0 ТО
      ОБХОД.ИзПамяти(ОБХОД.ПолучитьАдрес(регистр)+номерУзк*2, (* Адрес эл.ряда узк, 2=SIZE(УЗКЦЕЛ) *)
                     узк)
    КОН
 (*
  ИНАЧЕ
    СТОП (номерУзк) (* работа приложения *)
 *)
  КОН;
или
      ОБХОД.Образ   (ОБХОД.ПолучитьАдрес(регистр)+номерУзк*2, (* Адрес эл.ряда узк, 2=SIZE(УЗКЦЕЛ) *)
                     узк,2)
*)
      ОБХОД.ИзПамяти(ОБХОД.ПолучитьАдрес(регистр)+номерУзк*2, (* Адрес эл.ряда узк, 2=SIZE(УЗКЦЕЛ) *)
                     узк)
КОН УзкИзРядаЯчеек;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА ЦелИзРядаЯчеек-
      (
            регистр-:РЯД ИЗ ОБХОД.Ячейка;  (* ОБХОД.Ячейки, РАЗМЕР(регистр)=4 или 8 *)
            номерЦел:ЦЕЛ;                  (* номер извлекаемого Цел: 0 или 1 *)
                цел+:ЦЕЛ
      );
УКАЗ
(*
  ЕСЛИ (номерЦел >= 0)
      И
       (номерЦел < (РАЗМЕР(регистр) ДЕЛИТЬ 4))
  ТО
    ЕСЛИ  номерЦел = 0 ТО
      ОБХОД.ИзПамяти(ОБХОД.ПолучитьАдрес(регистр),            (* Адрес эл.ряда цел, 4=SIZE(ЦЕЛ) *)
                     Цел)
    АЕСЛИ номерЦел > 0 ТО
      ОБХОД.ИзПамяти(ОБХОД.ПолучитьАдрес(регистр)+номерЦел*4, (* Адрес эл.ряда цел, 4=SIZE(ЦЕЛ) *)
                     Цел)
    КОН
 (*
  ИНАЧЕ
    СТОП (номерЦел) (* работа приложения *)
 *)
  КОН;
или
      ОБХОД.Образ   (ОБХОД.ПолучитьАдрес(регистр)+номерЦел*4, (* Адрес эл.ряда цел, 4=SIZE(ЦЕЛ) *)
                     цел,4)
*)
      ОБХОД.ИзПамяти(ОБХОД.ПолучитьАдрес(регистр)+номерЦел*4, (* Адрес эл.ряда цел, 4=SIZE(ЦЕЛ) *)
                     цел)
КОН ЦелИзРядаЯчеек;

КОН Регистр.
