begin
  ternary array f[-1:1, -3280:3280, -40:40, 1:6], m[-13:13, -40:40, 1:6],
                q[-1:1, 1:8], g[-1:1, 1:7], u[-1:1, 1:4], h[-1:1, 1:3],
                с[1:32], R[1:18], Y[1:18], р[1:10], v[1:9], е[1:6],
                k[1:6], w[1:4], hf[1:3], а[-1:1], start[1:1];

procedure INOUT (i); {ввод-вывод через символьные устройства, которых 3*(9-1)=24 штуки}
  comment Процедура INOUT, будучи активизированной в результате обращения к ней,
    определяет процесс, выполняемый параллельно с процедурой SETUN_70, в которой
    сразу же начинают выполняться следующие за этим обращением операторы.
    Повторное обращение к процедуре INOUT определяет новый процесс, не прекращая
    выполнения старого, определяемого той же процедурой INOUT. В процедуре
    SETUN_70 обращение к процедуре INOUT производится трижды с разными
    значениями параметра i =-1, 0, +1;

begin { формальное начало процедуры (сопроцесса) INOUT(i) }
  procedure SWON (j); {выбор активного устройства на канале символьного I/O}
    comment Процедура SWON (j) включает устройство ввода-вывода группы j с
      номером u[j, 3:4] и выключает все другие устройства ввода-вывода этой
      группы;
  procedure SWOFF(j); {запрет работы всех устройств на канале символьного I/O}
    comment Процедура SWOFF(j) выключает все устройства ввода-вывода группы j;
  procedure PASS (j); {вывод символа на устройство символьного I/O}
    comment Процедура PASS (j) передает значение g[j] устройству ввода-вывода с
      номером u[j, 3:4];
  procedure TAKE (j); {ввод символа с устройства символьного I/O}
    comment Процедура TAKE (j) присваивает массиву g[j] значение, поступившее
      от устройства ввода-вывода с номером u[j,3:4];
LO: { реальное начало процедуры (сопроцесса) INOUT(i) }
  IF (a[i] = 1) { исправлено, в оригинале было a[1]=1 }
  THEN begin
    IF (u[i,3:4] = 0) THEN SWOFF(i)
    ELSE begin
      SWON(i);
      IF (u[i,1] = 1) {причина прерывания в том, что устройство готово принимать?}
        THEN begin PASS(i);                     v[i+3]:= 1 end
      ELSE IF (u[i,1] = -1) {если нет, то м.б. устройство готово передавать?}
        THEN begin TAKE(i); IF (g[i] = 0) THEN  goto LO;
                                         {ELSE} v[i+3]:= 1
             end;  { в оригинале предыдущий “end” был пропущен}
      end ELSE IF
    end ELSE;
    a[i]:= 0
  end THEN;
  goto LO
end INOUT;

procedure WATCH; {формирование прерываний от таймера}
  comment Процедура WATCH формирует заявки на прерывание v[1]:= 1 через
    определенные промежутки времени. Как и процедура INOUT, работает
    параллельно с процедурой SETUN_70;

procedure SUIT (i); {выдача адреса на 1 из 3-х устройств блочного ввода-вывода}
  comment Процедура SUIT, будучи активизированной в результате обращения к ней,
    определяет процесс, выполняемый параллельно с процедурой SETUN_70. Сразу же
    после активизации процедуры SUIT выполняется оператор, следующий за
    обращением к этой процедуре. Процедура SUIT(i) осуществляет поиск страницы
    с номером q[i] в памяти второго уровня вида f[i] и завершает свою работу
    заявкой на прерывание v[i+6]:= 1, указывающей на то, что поиск закончен и
    страницу можно использовать. Повторное обращение к процедуре SUIT определяет
    новый процесс, прекращая старый, определяемый этой процедурой с тем же
    значением параметра i, но не прекращая другие, ранее активизированные
    процессы, определяемые этой процедурой с другими значениями параметров;

procedure STOP; {внезапное выключение машины}
  comment Процедура STOP осуществляет выполнение оператора start:= 0 в некоторый
    заранее не известный момент времени. Как и процедура INOUT, работает
    параллельно с процедурой SETUN_70;

procedure ATTENT;
  comment Процедура ATTENT формирует заявки на прерывание v[8]:= 1 при нажатии
    специальной кнопки на пульте управления машины. Как и процедура INOUT,
    работает параллельно с процедурой SETUN_70;

procedure SETUN_70 (Т, S, t, k1, k2, k3, ka, ko, c1, ch, ca, ph, pa);
  comment Формальные параметры используются для введения сокращенных обозначений
    наиболее употребительных частей описанных выше массивов;
begin ternary array x[1:36], z[1:18];
  integer i;
    switch operation:= MACRO, BASIC, SPEC;

  procedure INCRC;
    comment Процедура INCRC осуществляет последовательное увеличение адреса
      очередного выполняемого слога (значения ca);
  begin IF (c1 != +1) & (ca = 40) THEN v[9]:= 1;
    ca:= ca+1
  end INCRC;
  procedure REFSYL;
    comment Процедура REFSYL реализует слог-ссылку;
  begin
    IF (c1 != +1) & (ka+k1+1 > 40) THEN goto genrt_IRQ_29;
                            {было "THEN begin w:= -29; goto IR end"}
    T:= 0; m[ph, 3*pa-1:3*pa+k1]:= m[h[k2], ka:ka+k1+1];
    INCRC
  end REFSYL;

START:
  IF (start = 0) THEN
  begin
    start:= 1; a[-1]:= 0; a[0]:= 0; a[+1]:= 0; { заменено, в оригинале было
                                       групповое присваивание a[-1]:= a[0]:= a[1]:= 0; }
    c1:= 1; ch:= 12; ca:= -40; {POST: в режиме прерываний начнём работу с адреса 12:-40}
    ph:= 0; pa:= 0; Y:= 0;
    INOUT(-1); INOUT(0); INOUT(+1);
    WATCH; ATTENT; STOP;

CYCLE: { начнём выполнение очередной команды }
  begin
    IF (start = 0)  THEN goto FINISH;
    IF (c1 != +1) THEN for i:= 1 step 1 until 9 do
      IF (v[i] != 0) THEN begin w:= i-41; v[i]:= 0; goto IR end;
    k:= m[ch, ca];
    IF (k1 = 0) & (k2 = 0) THEN goto operation[k3+2] {ветвление на MACRO, BASIC, SPEC}
      ELSE begin
        IF (c1 != +1) & (pa = 13) THEN goto genrt_IRQ_30;
                              {было "THEN begin w:= -30; goto IR end"}
        pa:= pa+1; REFSYL
      end ELSE;
  goto CYCLE
end CYCLE;

MACRO:
  begin
    IF (c1 = +1) THEN goto FINISH; {макрооперацию нельзя вызывать в режиме прерываний}
    IF (c1 = 0)  THEN goto genrt_IRQ_28;          {в режиме макроопераций тоже нельзя}
          {было "THEN begin w:= -28; goto IR end"}
    IF (pa = 13) THEN goto genrt_IRQ_30;        {не переполнена ли страница магазина?}
          {было "THEN begin w:= -30; goto IR end"}
    pa:= pa+1;
    cc:= cb; cb:= 0;      {заменено, в оригинале было с[21:32]:= с[9:20]; c[9:20]:= 0}
    cba:= ca; cb1:= c1; cbh:= ch;          {было c[17:20]:= c[5:8]; с[11:14]:= с[1:4]}
    c1:= 0; ch:= -13; ca:= -13; {в оригинале было групповое присваивание ch:=ca:= -13}
    T:= 0; t:= m[ch, ka];     {положим в старший слог вершины стека код макрооперации}
    goto CYCLE            {начнём выполнение первой команды обработчика макроопераций}
end MACRO

BASIC:
  begin switch basop:= B1,   B2,  B3,  B4,  B5,  B6,  B7,  B8,  B9,
                       B10, B11, B12, B13, B14, B15, B16, B17, B18,
                       B19, B20, B21, B22, B23, B24, B25, B26, B27;

    IF (c1 != +1) & (pa = -13) THEN goto genrt_IRQ_31;
                       {было "THEN begin w:= -31; goto IR end"}
    goto basop[ko+14]; {ветвление на B1..B27 в зависимости от ko=-13...+13}

B1: xa:= S; xb:= Y; x:= x*(3**t); S:= xa; Y:= xb;
                           goto CYCLE2; comment Name: "LST";

B2: { старый вариант     IF (abs(S) ? ?(3:17)/2)
                THEN begin ca:= t; pa:= pa-1 end
                ELSE begin pa:= pa-1; INCRC end;
    goto CYCLE; }
    xa:= T; IF (x[1] != 0) THEN ca:= t ELSE INCRC;
                pa:= pa-1; goto CYCLE;  comment Name: "COT"; { исправлено по
                            Брусенцов Н.П., Рамиль Альварес Х. Троичная ЭВМ
                           "Сетунь 70", из «ТРУДЫ SORUCOM-2011», стр. 85-89 }
B3: xa:= T; xb:= Y;
    IF (x[1] != 0) THEN begin i:= 1; x:= x/3 end { исправлено, было “x:=x,3”}
    ELSE begin
      for i:= 0 step -1 until -34 do IF (x[2] != 0) THEN goto EX ELSE x:= x*3;
      i:= 0
    end ELSE;
 EX: e:= e+i;           { заменено, в оригинале было “e:= e+1”      }
    T:= xa; Y:= xb;     { заменено, в оригинале было “Y:= x[19:30]” }
                           goto CYCLE1; comment Name: "XNN";

B4: e:= e-1;               goto CYCLE1; comment Name: "E-1"; {см. прилож. 2}
B5: e:= 0;                 goto CYCLE1; comment Name: "E=0"; {см. прилож. 2}
B6: e:= e+1;               goto CYCLE1; comment Name: "E+1"; {см. прилож. 2}

B7: T:= T-e*(3**12);       goto CYCLE1; comment Name: "T-E";
B8: e:= t;                 goto CYCLE2; comment Name: "E=T";
B9: T:= T+e*(3**12);       goto CYCLE1; comment Name: "T+E";

B10: IF (S < 0) THEN ca:= t ELSE INCRC; { B10, B11, B12 изменены согласно
                            Брусенцов Н.П., Рамиль Альварес Х. Троичная ЭВМ
                           "Сетунь 70", из «ТРУДЫ SORUCOM-2011», стр. 85-89 }
                pa:= pa-1; goto CYCLE;  comment Name: "CLT";
B11: IF (S = 0) THEN ca:= t ELSE INCRC;
                pa:= pa-1; goto CYCLE;  comment Name: "CET";
B12: IF (S > 0) THEN ca:= t ELSE INCRC;
                pa:= pa-1; goto CYCLE;  comment Name: "CGT";

B13: T:= 0; t:= ca;        goto CYCLE1; comment Name: "T=C"; {см. прилож. 2}
B14: R:= T;                goto CYCLE2; comment Name: "R=T";
B15: ca:= t;    pa:= pa-1; goto CYCLE;  comment Name: "C=T";
B16: k:= t; REFSYL;        goto CYCLE;  comment Name: "T=W";
B17: Y:= 0;                goto CYCLE2; comment Name: "YFT";

B18: k:= t; IF (c1 != +1) & (ka+k1+1 > 40) THEN goto genrt_IRQ_29;
                                   {было "THEN begin w:= -29; goto IR end"}
     IF (abs(h[k2]) <= 4)
                  THEN m[h[k2], ka:ka+k1+1]:= m[ph, 3*(pa-1)-1:3(pa-1)+k1];
                           goto CYCLE2; comment Name: "W=S";

B19: xa:= T; z:= S; for i:= 1 step 1 until 18 do z[i]:= z[i]*x[i]; S:= z;
                           goto CYCLE2; comment Name: "SMT";
B20: Y:= T;                goto CYCLE2; comment Name: "Y=T";
B21: xa:= T; z:= S;
     for i:= 1 step 1 until 18 do
     begin
       IF (z[i] = 0) THEN z[i]:= x[i]
                     ELSE IF (z[i] != x[i]) & (x[i] != 0) THEN z[i]:= 0
     end FOR;
     S:= z;                goto CYCLE2; comment Name: "SAT";

B22: S:= S - T;            goto CYCLE2; comment Name: "S-T";
B23: T:= -T;               goto CYCLE1; comment Name: "TDN"; 
B24: S:= S + T;            goto CYCLE2; comment Name: "S+T";

B25: xa:= S; xb:= 0; x:= x + T*R*(3**2); S:= xa; Y:= xb;
                           goto CYCLE2; comment Name: "LBT";
B26: R:= S; x:= T*R*(3**2); S:= xa; Y:= xb;
                           goto CYCLE2; comment Name: "L*T";
B27: xa:= S; xb:= Y; x:= x + T*R*(3**2); S:= xa; Y:= xb;
                           goto CYCLE2; comment Name: "LHT";
end BASIC;

SPEC:
  begin switch specop:= S1,   S2,  S3,  S4,  S5,  S6,  S7,  S8,  S9,
                        S10, S11, S12, S13, S14, S15, S16, S17, S18,
                        S19, S20, S21, S22, S23, S24, S25, S26, S27;
  procedure TRANSIN(j);
    comment Процедура TRANSIN(j) передает в T значение g[j].
            Если g[j,7] = 1, то в t передается g[j,1:6],
            если g[j,7] = 0, то в t передается -g[j,1:6];
  begin T:= 0;
    IF (g[j,7] = 1) THEN t:=  g[j,1:6]
                    ELSE t:= -g[j,1:6];
    a[j]:= 1
  end TRANSIN;

  procedure TRANSOUT(j);
    comment Процедура TRANSOUT(j) передает в g[j] значение t, преобразуя его
              из троичного кода в некоторый двоичный код;
  begin x[1:6]:= t; g[j,7]:= 1;
    for i:= 1 step 1 until 6 do
      begin IF (x[i] != 0) THEN g[j,i]:= 1
                           ELSE g[j,i]:= 0;
            IF (x[i] = -1) THEN g[j,7]:= 0
      end;
    a[j]:= 1;
  end TRANSOUT;

  procedure COPY(j); {прочитать страницу с устройства блочного I/O канала номер “j”}
    comment Процедура COPY(j) присваивает странице оперативной памяти, номер
               которой определяет t, значение страницы с номером q[j] памяти
                                                   второго уровня вида f[j];

  begin z:= T; hf:= z[4:6]; IF (abs(hf) <= 4) THEN { исправлено, было <4 }
    for i:= 0 step 1 until 80 do m[hf, 40-i]:= f[j, q[j], 40-i]
  end COPY;

  procedure LOAD(j); {записать страницу в устройство блочного I/O канала номер “j”}
    comment Процедура LOAD(j) присваивает странице с номером q[j] памяти второго
       уровня вида f[j] значение страницы памяти первого уровня, номер которой
       определяет t;
  begin z:= T; hf:= z[4:6];
    for i:= 0 step 1 until 80 do f[j, q[j], 40-i]:= m[hf, 40-i]
  end LOAD;

    IF (c1 = -1)             THEN goto genrt_IRQ_28;
                      {было "THEN begin w:= -28; goto IR end"}
    IF (c1 = 0) & (pa = -13) THEN goto genrt_IRQ_31;
                      {было "THEN begin w:= -31; goto IR end"}
    goto specop[ko+14]; {ветвление на S1..S27 в зависимости от ko=-13...+13}

S1: TRANSIN(-1);                        goto CYCLE1; comment Name: "COPYG1";
S2: TRANSIN( 0);                        goto CYCLE1; comment Name: "COPYG2";
S3: TRANSIN(+1);                        goto CYCLE1; comment Name: "COPYG3";
S4: COPY(-1);                           goto CYCLE2; comment Name: "COPYF1";
S5: COPY( 0);                           goto CYCLE2; comment Name: "COPYF2";
S6: COPY(+1);                           goto CYCLE2; comment Name: "COPYF3";
S7: z:= T; q[-1]:= z[5:12]; SUIT(-1);   goto CYCLE2; comment Name: "LOADQ1";
S8: z:= T;  q[0]:= z[5:12]; SUIT (0);   goto CYCLE2; comment Name: "LOADQ2";
S9: z:= T; q[+1]:= z[5:12]; SUIT(+1);   goto CYCLE2; comment Name: "LOADQ3";

S10: z:= 0; z[5:6]:= ph; z[9:11]:= pa; T:= z;
                                        goto CYCLE1; comment Name: "COPYP";
S11: z[1:5]:= pha; pha:= pb; pb:= z[1:5];
                                        goto CYCLE1; comment Name: "EXCHP";
S12: z:= T; ph:= z[5:6]; pa:= z[9:11];  goto CYCLE1; comment Name: "LOADP";

S13: z:= 0; z[1:12]:= cb; cb:= cc; cc:= z[1:12]; T:= z;
                                        goto CYCLE1; comment Name: "COPYMC";
                                                    {см. прилож. 2}

S14: z[1:12]:= cb; cb:= cc; cc:= z[1:12]; c1:= z[3]; ch:= z[4:6]; ca:= z[9:12];
                                    { было c[1:4]:= z[3:6]; c[5:8]:= z[9:12]; }
                                        goto CYCLE;  comment Name: "RETNMC";
                                                    {см. прилож. 2}
S15: z:= T; cc:= cb; cb:= z[1:12];      goto CYCLE2; comment Name: "LOADMC";
                                                    {см. прилож. 2}

S16: z:= T; h[-1]:= z[4:6];             goto CYCLE2; comment Name: "LOADH1";
S17: z:= T; h[0] := z[4:6];             goto CYCLE2; comment Name: "LOADH2";
S18: z:= T; h[+1]:= z[4:6];             goto CYCLE2; comment Name: "LOADH3";
S19: u[-1, 1:4]:= t; a[-1]:= 1;         goto CYCLE2; comment Name: "LOADU1";
S20: u[ 0, 1:4]:= t;  a[0]:= 1;         goto CYCLE2; comment Name: "LOADU2";
              {в S20 исправлено, было pa:=-1; INCRC; goto CYCLE;}
S21: u[+1, 1:4]:= t; a[+1]:= 1;         goto CYCLE2; comment Name: "LOADU3";
S22: LOAD(-1);                          goto CYCLE2; comment Name: "LOADF1";
S23: LOAD(0);                           goto CYCLE2; comment Name: "LOADF2";
S24: LOAD(+1);                          goto CYCLE2; comment Name: "LOADF3";
S25: TRANSOUT(-1);                      goto CYCLE2; comment Name: "LOADG1";
S26: TRANSOUT(0);                       goto CYCLE2; comment Name: "LOADG2";
S27: TRANSOUT(+1);                      goto CYCLE2; comment Name: "LOADG3";

end SPEC;

CYCLE2: { перед выполнением следующей команды выбросим последнее слово из стека }
    pa:= pa-1;

CYCLE1: { перед выполнением следующей команды увеличим её адрес }
    INCRC;

goto CYCLE;

genrt_IRQ_28:		w:= -28; goto IR
genrt_IRQ_29:		w:= -29; goto IR
genrt_IRQ_30:		w:= -30; goto IR
genrt_IRQ_31:		w:= -31; goto IR

IR: begin			{ обработчик прерываний }
      cc:= cb; cb:= 0; cba:= ca; cb1:= c1; cbh:= ch;
{было с[21:32]:= с[9:20]; c[9:20]:= 0; c[17:20]:= c[5:8]; с[11:14]:= с[1:4];}
      c1:= 1; ch:= 13; ca:= -13; x[1:5]:= pb; pb:= pha;
      pha:= x[1:5]; pa:= pa+1; T:= 0; t:= m[ch,w];
      goto CYCLE;
end IR;

FINISH:				{ останов машины }
  start:= 0;
end START
end SETUN_70;

SETUN_70 (m[p[1:2], 3*p[3:5]-1:				{ T }
                    3*p[3:5]+1
           ],
          m[p[1:2], 3*(p[3:5]-1)-1: 			{ S }
                    3*(p[3:5]-1)+1
           ],
          m[p[1:2], 3*p[3:5]-1				{ t }
           ],
          k[1], k[2], k[3], k[3:6], k[4:6],		{ k1, k2, k3, ka, ko }
          c[1], c[2:4], c[5:8], p[1:2], p[3:5]		{ c1, ch, ca, ph, pa }
         );
end Алгоритмического описания функционирования машины SETUN_70;
5.1. Спецификация массивов.
Обозначение	Интерпретация	
f[-1:1, -3280:3280, -40:40, 1:6]	Память второго уровня	
f[i, j, -40:40, 1:6]	Одна страница памяти второго уровня	
m[-13:13, -40:40, 1:6]	Память первого уровня	
m[i, -40:40, 1:6]	Одна страница памяти первого уровня	
m[i, j, 1:6]	Один слог памяти первого уровня	
m[-4:4, -40:40, 1:6]	Оперативная память	
m[-13:-5, -40:40, 1:6],
m[  5:13, -40:40, 1:6]	Постоянная память	
q[i, 1:8]	Указатель (регистр) страницы памяти второго
уровня (одного вида), участвующей в обмене	
g[i, 1:7]	Буферный регистр для I/O информации для i-й группы устройств I/O	
u[i, 1:4]	Указатель режима работы устройств I/O i-й группы	
a[i]	Триггер, синхронизирующий работу устройств I/O i-ой группы	
h[i, 1:3]	Указатель открытых страниц операндов программы	
c[1:32]	Указатель режимов и выполняемого слога программы	
c1 ~ c[1:1]	Указатель включенного режима работы программы	
ch[1:3]  ~ c[2:4]	Указатель выполняемой страницы программы	
ca[1:4]  ~ c[5:8]	Указатель выполняемого слога программы	
cb[1:12] ~ c[9:20]	Второй уровень стека «с» (режима и адреса работы)	
cc[1:12] ~ c[21:32]	Третий уровень стека «с» (режима и адреса работы)	
cb1[1:1] ~ cb[3:3]  ~ c[11:11]	Место размещения c1 во втором уровне стека «с»	
cba[1:4] ~ cb[9:12] ~ c[17:20]	Место размещения ca во втором уровне стека «с»	
cbh[1:3] ~ cb[4:6]  ~ c[12:14]	Место размещения ch во втором уровне стека «с»	
R[1:18]	Регистр множителя	
Y[1:18]	Регистр младших разрядов	
p[1:10]	Указатель магазина	
ph[1:2] ~  p[1:2]	Указатель страницы ОЗУ, отведённой под магазин	
pa[1:3] ~  p[3:5]	Указатель окна магазина	
pha[1:5] ~ p[1:5]	Для краткости записи одновременных присвоений ph и pa	
pb[1:5] ~  p[6:10]	Место для хранения p[1:5] при обработке прерывания	
v[1:9]	Регистр заявок на прерывание	
e[1:6]	Малый сумматор	
k[1:6]	Регистр выполняемого слога	
k1 ~ k[1:1]	Указатель длины слова-операнда	
k2 ~ k[2:2]	Значение индекса указателя открытой страницы операндов	
k3 ~ k[3:3]	Тип операции, если k1=0 и k2=0 (см.таблицу 5.3)	
ka[1:4] ~ k[3:6]	Адрес операнда на странице	
ko[1:3] ~ k[4:6]	Указатель выполняемой операции	
w[1:4]	Указатель причины прерывания	
hf[1:3]	Указатель обменной страницы памяти первого уровня	
start[1:1]	Триггер состояния машины	
T ~ m[ph, 3*pa-1:3*pa+1]	Окно магазина           (вершина, последний элемент стека)	
t ~ m[ph, 3*pa-1]	Старший слог окна магазина	
S ~ m[ph, 3*(pa-1)-1:
          3*(pa-1)+1]	Ячейка магазина, расположенного непосредственно за его окном
                 (подвершина, предпоследний элемент стека)	
x[1:36]	Временная переменная	
xa[1:18] ~  x[1:18]	Старшая половина x	
xb[1:18] ~  x[19:36]	Младшая половина x	
z[1:18]	Временная переменная	
5.2 Спецификация заявок на прерывание
v[i]	w	Источник или причина заявки	
v[1]	-40	Часы1	
v[2]	-39	Сигнал от  -1-й  группы устройств ввода-вывода	
v[3]	-38	Сигнал от   0-й  группы устройств ввода-вывода	
v[4]	-37	Сигнал от  +1-й  группы устройств ввода-вывода	
v[5]	-36	Сигнал от памяти второго уровня вида -1	
v[6]	-35	Сигнал от памяти второго уровня вида 0	
v[7]	-34	Сигнал от памяти второго уровня вида +1	
v[8]	-33	Сигнал от кнопки пульта управления	
v[9]	-32	Исчерпание страницы программы (переполнение ca)	
	-31	Исчерпание страницы магазина	
	-30	Переполнение страницы магазина	
	-29	Захват операндом следующей страницы (переполнение ka)	
	-28	Запрещенный слог	

5.3. Условие выполнения операций разных типов.
Тип операции	Режим работы машины	
	Пользователя (с1=-1)	Макроопераций (с1=0)	Прерываний (с1=+1)
{исправлено, было c1=0}	
Макрооперация (k3=-1)	Выполняется с пере-ходом в режим макроопераций	Прерывание (w=-28)	Останов машины	
Основная      (k3=0)	Выполняется нормально	Выполняется нормально	Выполняется нормально	
Служебная     (k3=+1)
{исправлено, было k3=0}	Прерывание (w=-28)	Выполняется нормально	Выполняется нормально	
Примечание. В режиме прерываний прерывания заблокированы.

Приложение 1.

В 1975 году система команд малой ЭВМ Сетунь-70 была изменена для реализации идей структурного программирования. Изменения затронули архитектуру ЭВМ и коснулись работы 7 команд (B4..B6, B13, S13..S15)

Таблица 1. Изменённые операции малой ЭВМ Сетунь-70

Имя
Операции	Троичный
код	Псевдокод операции	Название	
Основные операции	
DOW	000-0-	IF (T != 0) THEN SUBR(ca+1, ca)
            ELSE begin INCRC; INCRC end	B4	
BRT	000-00	INCRC; IF (T<0) THEN z:= ca ELSE
       IF (T=0) THEN z:= ca+1 ELSE z:= ca+2;
       {исправлено «а» на «ca» в трёх ветвях условия!}
SUBR(z, ca+3); pa:= pa-1	B5	
JMP	000-0+	z:= T; pa:= pa-1; c1:= z[3]; ch:= z[4:6]; ca:= z[9:12]	B6	
JSR	00000-	INCRC; SUBR(ca, ca+1)	B13	
Служебные операции	
CMC	00+00-	z:= 0; z[1:12]:= TSR; T:= z; INCRC	S13	
RMC	00+000 {исправлено,
в оригинале 00+00+}	z:= TSR; psr:= psr-1; c1:= z[3]; ch:= z[4:6]; ca:= z[9:12]
{было в оригинале c[1:4]:= z[3:6]; c[5:8]:= z[9:12]}	S14	
LMC	00+00+	z:= T; psr:= psr+1; TSR:= z[1:12]; INCRC; pa:= pa-1	S15	

Пояснения к таблице 1

REFSYL	- реализует слог-ссылку.
INCRC	- осуществляет последовательное увеличение ca с проверкой выхода за пределы страницы.
Регистр приписки H2 всегда указывает на ch - страницу программы.
В алгоритм описания машины "Сетунь 70" надо добавить следующие описания:

ternary array SR[-13:13, 1:12], psr[1:3]
(SR[-13:13, 1:12] - страница стека возвратов, а psr [1:3] - указатель окна стека возвратов);

и в спецификацию массивов:
TSR ~ SR[psr, 1:12] - окно стека возвратов.

procedure SUBR (adr, ret);
  ternary ret. adr;
comment SUBR - переход на подпрограмму adr с запоминанием адреса возврата ret;
begin
  IF (ret>40) THEN goto genrt_IRQ_29;
  z:= 0; z[3]:= c1; z[5:6]:= ch; z[9:12]:= ret;
  psr:= psr+1; TSR:= z[1:12]; x:= m[ch, ca]; ch:= x[1:2]; ca:= x[3:6]
end SUBR;

Если в названии операции последняя буква T, после выполнения операции происходит удаление позиции в стеке.

Смысл команды S17 (LOADH2) - никакого, т.е. пратически Н2 отсутствует.

Стек возвратов SR представляет собой отдельную область памяти, не лежащую в m[-13:13],

Приложение 2.

Команды ЭВМ “Сетунь70” после модификации 1975 года и их троичные и девятеричные коды (звёздочкой отмечены команды, работа которых изменилась):
Goto
basop[ko+14]	ko(3)	ko(9)	goto
specop[ko+14]	ko(3)	ko(9)	ch:=ca:=-13;
t:=m[ch,ka];	ko(3)	ko(9)	
B01:   "LST"	0---	ZW	S01:   "COPYG1"	+---	2W	M01:	----	WW	
B02:   "COT"	0--0	ZX	S02:   "COPYG2"	+--0	2X	M02:	---0	WX	
B03:   "XNN"	0--+	ZY	S03:   "COPYG3"	+--+	2Y	M03:	---+	WY	
B04: * "DOW"	0-0-	ZZ	S04:   "COPYF1"	+-0-	2Z	M04:	--0-	WZ	
B05: * "BRT"	0-00	Z0	S05:   "COPYF2"	+-00	20	M05:	--00	W0	
B06: * "JMP"	0-0+	Z1	S06:   "COPYF3"	+-0+	21	M06:	--0+	W1	
B07:   "T-E"	0-+-	Z2	S07:   "LOADQ1"	+-+-	22	M07:	--+-	W2	
B08:   "E=T"	0-+0	Z3	S08:   "LOADQ2"	+-+0	23	M08:	--+0	W3	
B09:   "T+E"	0-++	Z4	S09:   "LOADQ3"	+-++	24	M09:	--++	W4	
B10:   "CLT"	00--	0W	S10:   "COPYP" 	+0--	3W	M10:	-0--	XW	
B11:   "CET"	00-0	0X	S11:   "EXCHP" 	+0-0	3X	M11:	-0-0	XX	
B12:   "CGT"	00-+	0Y	S12:   "LOADP" 	+0-+	3Y	M12:	-0-+	XY	
B13: * "JSR"	000-	0Z	S13: * "CMC"   	+00-	3Z	M13:	-00-	XZ	
B14:   "R=T"	0000	00	S14: * "RMC"   	+000	30	M14:	-000	X0	
B15:   "C=T"	000+	01	S15: * "LMC"   	+00+	31	M15:	-00+	X1	
B16:   "T=W"	00+-	02	S16:   "LOADH1"	+0+-	32	M16:	-0+-	X2	
B17:   "YFT"	00+0	03	S17: * "LOADH2"	+0+0	33	M17:	-0+0	X3	
B18:   "W=S"	00++	04	S18:   "LOADH3"	+0++	34	M18:	-0++	X4	
B19:   "SMT"	0+--	1W	S19:   "LOADU1"	++--	4W	M19:	-+--	YW	
B20:   "Y=T"	0+-0	1X	S20:   "LOADU2"	++-0	4X	M20:	-+-0	YX	
B21:   "SAT"	0+-+	1Y	S21:   "LOADU3"	++-+	4Y	M21:	-+-+	YY	
B22:   "S-T"	0+0-	1Z	S22:   "LOADF1"	++0-	4Z	M22:	-+0-	YZ	
B23:   "TDN"	0+00	10	S23:   "LOADF2"	++00	40	M23:	-+00	Y0	
B24:   "S+T"	0+0+	11	S24:   "LOADF3"	++0+	41	M24:	-+0+	Y1	
B25:   "LBT"	0++-	12	S25:   "LOADG1"	+++-	42	M25:	-++-	Y2	
B26:   "L*T"	0++0	13	S26:   "LOADG2"	+++0	43	M26:	-++0	Y3	
B27:   "LHT"	0+++	14	S27:   "LOADG3"	++++	44	M27:	-+++	Y4	

Изменявшиеся в 1975 году команды ЭВМ “Сетунь70” до модификации и их троичные и девятеричные коды:
Базовые команды	ko(3)	ko(9)		Служебные команды	ko(3)	ko(9)	
B04:   "E-1"   	0-0-	ZZ		S13:   "COPYMC"	+00-	3Z	
B05:   "E=0"   	0-00	Z0		S14:   "RETNMC"	+000	30	
B06:   "E+1"   	0-0+	Z1		S15:   "LOADMC"	+00+	31	
B13:   "T=C"   	000-	0Z		S17:   "LOADH2"	+0+0	33	

Микрокоманды, оканчивающие команды ЭВМ “Сетунь70” после модификации 1975 года:
  INCRC     (+1) увеличим адрес команды
pa := pa-1  (+2) уменьшим указатель стека (выбросим последнее слово из стека)
Базовые
команды	+1
+2	Служебные
команды	+1
+2		Базовые
команды	+1
+2	Служебные
команды	+1
+2		Базовые
команды	+1
+2	Служебные
Команды	+1
+2	
B01	3	S01	1		B10	2	S10	1		B19	3	S19	3	
B02	0	S02	1		B11	2	S11	1		B20	3	S20	3	
B03	1	S03	1		B12	2	S12	1		B21	3	S21	3	
B04	1	S04	3		B13	1	S13	1		B22	3	S22	3	
B05	1	S05	3		B14	3	S14	0		B23	1	S23	3	
B06	1	S06	3		B15	2	S15	3		B24	3	S24	3	
B07	1	S07	3		B16	0	S16	3		B25	3	S25	3	
B08	3	S08	3		B17	3	S17	3		B26	3	S26	3	
B09	1	S09	3		B18	3	S18	3		B27	3	S27	3	

Приложение 3.

Соединения ЭВМ Сетунь-70 с периферийными устройствами
К каналу U1 - с номером -1 регистр пульта,- с номером 1 - класс Наставника,
к каналу U2 - с номером -1 - фотоввод,    - с номером 1 - перфоратор,
к каналу U3 - с номером -3 - Консул для ввода и вывода.