Программирование в машинных кодах 1993 г.

Математика Машинного Программирования - Шестнадцатиричное Представление; Абсолютная Двоичная Арифметика; Дополнительная Арифметика; Интегральное Представление; Представление С Плавающей Точкой.


3. МИКРОПРОЦЕССОР Z-80

3.1. ВВЕДЕНИЕ

Микропроцессор Z-80 - микросхема с 40 выводами, пронумерованными от 1 до 40. Рассмотрим функции

выводов.

A11

1

A12

2

A13

3

A14

4

A15

5

Т.Ч.

6

D4

7

D3

8

D5

9

D6

10

+5

11

D2

12

D7

13

D0

14

D1

15

INT

16

NMI

17

HALT

18

MREQ

19

IORQ

20

A10

A9

A8

A7

A6

A5

A4

A3

A2

Al

A0

GND

RESH

M1

RESET

RVSRO

WAIT

BUSAK

WR

RD

40 39 38 37 36 35 34 33 32 31 30 29 28 27 26 25 24 23 22 21

Z-80

Рис. 3.1

¦ напряжение питания +5В. общий.

тактовый вход. В SP используется тактовая частота 3.5 МГц.

Выв. 07-10, 12-15 - информационная шина.

Выв. 1-5, 30-40 - адресные шины от МП к памяти.

Оставшиеся 13 выводов присоединены к линиям, которые несут контрольные сигналы.

Выв. 21 - линия считывания RD. Эта линия становится активной, когда байт информации должен быть считан из памяти.

Выв. 22 - линия записи WR. Эта линия активна, когда байт информации должен быть записан от МП в

память.

Выв. 19 - запрос памяти MREQ. Эта линия активна в тех случаях, когда байт информации должен следовать как из процессора, так и в него.

Байт информации следует из памяти в соответствии с адресом, помещенным на адресной шине. Далее, в соответствии с откликом на сигналы RD и MREQ соответствующая микросхема памяти помещает байт информации на информационную шину, с которой эта информация в дальнейшем считывается МП. Байт данных записывается в память МП, который помещает требуемые адреса на адресную шину. Шины MREQ и WR активизируются, и байт данных выставляется на шину данных. В дальнейшем, если к микросхеме памяти продолжается обращение, байт данных будет скопирован в память.

Выв. 28 - линия регенерации RESH. Она используется для регенерации динамической памяти. Частично используется для регенерации TV сканирующих сигналов.

Выв. 27 - выборка памяти M1 наиболее важная линия, которая активизируется или по машинному коду, или по соответствующему байту информации, выбираемому из памяти.

Выборка инструкции или байта данных требует, чтобы все 3 линии M1, MREQ и RD были активизированы. В то же время выборка байта из ячейки памяти, которая является другой частью памяти, требует, чтобы только MREQ и RD были активизированы. Время, необходимое для выборки инструкции, составляет 1.14 мкс, что является 4 тактовыми циклами или Т-состояниями.

Выв. 20 - линия вход/выход IORQ. Эта линия активна при выполнении команд IN или OUT.

Выв. 18 - останов HALT. Линия активизируется при выполнении команды HALT.

Выв. 25 - линия запроса BUSRQ. Z-80 позволяет внешним устройствам использовать адресную и информационную шину в режиме пропуска цикла. Запрос МП пропустить следующий цикл выполняется внешними устройствами путем активизации этой линии.

Выв. 23 - линия подтверждения BUSAK. МП подтверждает запрос остановки после выполнения дальнейших команд и активизирует эту линию.

Оставшиеся 4 вывода находятся под контролем пользователя.

Выв. 26 - линия сброса RESET. Используется для инициализации МП. Она активизируется при включении питания. Сброс может быть использован в SP соединением линий RESET и GND.

Выв. Выв. Выв.

11

29 06

_Микропроцессор Z-80_

Выв. 24 - линия ожидания WAIT. "Медленная" память может требовать большего времени для цикла считывания или записи и об этом сообщает МП путем активизации линии WAIT.

Выв. 17 - "немаскируемое прерывание" NMI. Активизация этой линии приводит к остановке выполнения МП текущей программы, вместо этого МП выполняет программу прерывания, записанную специально для этой цели. В SP немаскируемое прерывание требует системного сброса, который выполняется записыванием 0 по адресу 23728.

Выв. 16 - "маскируемые прерывания" INT. В SP сканирование клавиатуры и обмен в режиме реального времени называется "управляемым прерыванием". Это означает, что электроника системы каждые 1/50 секунды активизирует ШТ, вызывая остановку выполнения МП основной программы и, вместо неё, выполнение программы сканирования клавиатуры. Способность Z80 реагировать на 1NT может управляться программистом специальными машинными командами.

3.2. ЛОГИЧЕСКИЙ ВЗГЛЯД НА Z80

Z80 состоит: устройство управления, регистр команд, программный счетчик, 24 регистра пользователя и

АЛУ.

Устройство управления

В функции УУ входит пересылка байта данных в Z80, который, в свою очередь, результаты (байты данных) посылает из процессора в правильном направлении и убеждается, что операция успешно завершена.

В Z80 УУ выдаёт огромное число управляющих сигналов, а также управляющие сигналы на линии RD, WR,

MREQ.

Регистр команд (РК)

Термин "регистр" используется для описания простой ячейки внутри Z80. Регистр содержит 8 бит (1 байт). В Z80 имеется большой блок регистров, и пересылка байтов данных к регистрам и от них является простейшей и наиболее важной чертой программирования в машинных кодах.

РК - специальный регистр, где МП содержит копию выполняемой текущей команды. Одной из черт набора команд Z80 является то, что определенные инструкции содержатся в 2-х байтах данных. В этих случаях регистр команд содержит каждую команду по очереди.

Программный счётчик (ПС)

ПС - это пара регистров, которые используются совместно. ПС может содержать 16-ти битные значения. Программный счётчик имеет специфическую цепь в сохранении адресов, либо текущей выполняемой команды, в зависимости от того, был ли изменен ПС или нет.

Когда инструкции выбираются, УУ использует адреса в ПС как адрес памяти, содержащей команду, которая должна выполняться следующей, и затем УУ наращивает ПС.

Действие ПС очень похоже на переменную РРС интерпретатора Бейсик, которая содержит номер текущей строки Бейсик и также наращивается.

Регистры пользователя /основныерегистры/ (РП)

Имеется 24 регистра пользователя. Все регистры однобайтовые, обычно используются парами. 24 РП МП Z80 как 12 регистровых пар. Номера битов показаны.

Основной набор Альтернативный набор

76543210 7654

76543210 76543210

VA D.................С

A' H' В' D'

I

IX IY SP

R

Регистр A называется аккумулятором.

Регистр F - это флаговый регистр. Он часто рассматривается, как набор 8-ми флаговых битов, связанных вместе, а не как отдельный регистр. Флаг установлен - 1, флаг сброшен - 0. Программист обычно имеет дело с 4-мя основными флагами. Это флаг нуля, флаг знака, флаг переноса и флаг чётности переполнения. Дополнительные флаги используются УУ и не могут быть использованы программистом непосредственно.

Регистровая пара HL. При записи регистровой пары HL сначала указывается младшая часть (LOW), а затем старшая (HIGH).

Память 64K может быть рассмотрена как 256 страниц по 256 адресов в каждой. В этом случае значение старшего байта указывает на используемую страницу.

В МП регистровая пара HL является одной из 3-х регистровых пар, которая используется в качестве адресных

_Микропроцессор Z-80_

регистров. Однако регистровая пара HL является наиболее важной. HL-пара также может быть использована для хранения 16-ти байтного числа и существует определенный ряд арифметических операций, которые могут быть выполнены с этими числами. Н-регистр и L-регистр могут быть использованы и как отдельные регистры, хотя с ними может быть выполнено ограниченное число операций.

Регистровые пары ВС и DE.

Эти пары используются главным образом как адресные регистры. Регистры могут быть использованы как одинарные. Регистры ВС рекомендуется использовать в качестве счётчика циклов.

Набор альтернативных регистров.

Z80 имеет альтернативный набор регистров для A,F,H,L,B,C,D,F. Они обозначаются A',F', и т.д.

Существуют две специальные команды, которые позволяют обменивать основной и альтернативный набор регистров. После обмена для Z80 альтернативный набор становиться основным, а основной - альтернативным.

Альтернативные наборы регистров часто используются для сохранения среды, когда запускается независимая

задача.

Особенным примером для программы SP с монитором 16K является ситуация, когда при вычислениях с плавающей точкой используется Н и L регистры для сохранения адреса возврата. Если эти регистры испорчены, то возвращение в Бейсик невозможно.

Регистровые пары IX и IY - используются для выполнения операции, которая включает индексацию. Это даёт возможность работать со списком или таблицей. Начальный адрес списка или таблицы должен быть первоначально занесен в подходящую пару регистров IX или IY. В программе SP с монитором 16K IY пара содержится по 10-му адресу 23610 (5C3A), что является начальным адресом таблицы системных переменных. IX пара широко используется как указатель в программах обработки команд LOAD, SAVE, VERIFY, MERGE.

Указатель стека - это адресный регистр. Он используется для указания в памяти области машинного стека и всегда рассматривается как одинарный двухбайтовый регистр. Z80 использует стек, заполняемый в памяти сверху вниз. Аналогией является магазин автомата - по принципу: "последний пришел - первым ушел".

Указатель стека используется для указания различных размещений в области стека в каждом случае. Указатель стека всегда содержит адрес, куда последний раз была произведена запись. Поэтому УУ сначала уменьшает значение указателя стека, а затем помещает туда значение. Пересылка в стек 2-х байтовая и поэтому указатель стека должен быть дважды уменьшен при помещении в стек, и дважды увеличен при выборке из стека. Машинный стек обычно используется как место сохранения адресов возврата, но можно использовать его и как рабочую область.

Регистр I - регистр вектора прерываний, используется для размещения адресов устройств ввода-вывода. Однако в SP эта возможность не используется и I - регистр используется для генерации светового TV - сигнала.

Регистр R - регистр регенерации памяти. Он является простым счётчиком, который увеличивается каждый раз при выполнении цикла регенерации. Значение в регистре циклически изменяется от 0 до 127.

АЛУ

В АЛУ выполняются арифметические и логические операции. Возможно выполнение сложения и вычитания, а также АЛУ способно выполнять большое количество битовых операций и устанавливать флаги, чтобы показать результат.

3.3. СТРУКТУРА ПРОГРАММ В МАШИННЫХ КОДАХ

Программа должна существовать как набор машинных команд и данных, размещенных в последовательных адресах памяти. В SP единицей памяти является один байт.

Поэтому программа в машинных кодах является последовательностью 8-ми битовых значений. Пример.

LOCATION

11110011 11001100 11001100 10101010 Это представление является иллюстра ошибкам. Поэтому лучше использовать ш1 печатает адреса в десятичной форме. 10 FOR A=0 TO 7

PRINT "LOCATION"; TAB 10; A; TAB NEXT A

и приводит к ике, которая

15; PEEK A

20 30

Программа, показывающая 16-ричное представление рассматривается на следующем примере: 10 FOR A=0 TO 7 20 LET H=INT (PEEK A/16) 30 LET L=PEEK A-H*16

40 PRINT "LOCATION"; TAB 10; A; TAB 15; CHR$(48+H+7*(H>9)); CHR$ (48+L+7*(L>9)) 50 NEXT A

Эти программы включены, чтобы показать способ получения 10-ного или 16-ричного листинга программы в машинных кодах.

Рассмотрим шаги получения документированного листинга. Используя таблицу машинных кодов из приложения, можно представить эти машинные команды в следующем виде:

_Микропроцессор Z-80_

LOCATION 0 - DI запрещение маскированного прерывания

LOCATION 1 - XOR A сложение по модулю 2 регистра A

LOCATION 2 - 4 LD DE,+FFFF загрузка регистровой пары DE LOCATION 5 - 7 JP +11СВ переход по абсолютному адресу

Все машинные команды Z-80 имеют свою мнемонику, и программы в машинных кодах записываются с использованием мнемоники, а не двоичного или 16-ричного представления. Такая мнемоническая форма представления называется ассемблеровской. Программист вначале обычно составляет программу в мнемоническом виде на языке ассемблера, а затем, в процессе трансляции, это представление преобразуется в 10 или 16-ричное. Поэтому такое написание очень удобно при записи программ.

VA

PRINT

4. МАТЕМАТИКА МАШИННОГО ПРОГРАММИРОВАНИЯ

В МП Z-80 все данные передаются 8-битовыми комбинациями, но такое представление трудно для работы и поэтому программисты обычно используют 16-ричное представление.

4.1. ШЕСТНАДЦАТИРИЧНОЕ ПРЕДСТАВЛЕНИЕ

Принцип представления состоит в описании чисел по основанию 16. В этой системе счисления первые 10 знаков записываются цифрами от 0 до 9 и к ним добавляются 6 знаков, записываемых буквами от A до F. Таблица показывает соответствие чисел 0-15.

2-ное

10-ное

16-ное

0000

0

0

0001

1

1

0010

2

2

0011

3

3

0100

4

4

0101

5

5

0110

6

0111

7

7

1000

8

S

1001

9

9

1010

10

А

1011

11

В

1100

12

С

1101

13

D

1110

14

Е

1111

15

F

Из таблицы видно, что одна 16-ричная цифра записывается 4-х битовыми двоичными числами. Поэтому 8-ми битовое число записывается парой 16-ричных знаков, а 16-битовое 4-мя 16-ми знаками.

Примеры: 0000 0000 (2-ное) - 00(16)

0100 1111 (2-ное) - 4F(16)

0000 0000 0000 0000 (2-ное) - 0000(16) 0100 1100 1010 1111 (2-ное) - 4CAF(16)

Следующая программа переводит числа из 10-ной в 16-ричную систему. 10 INPUT "DECIMAL NUMBER",D 20 IF D>65535 THEN GO TO 170 30 PRINT "DECIMAL",D 40 DIM H(4) 50 DIM H$(4) 60 LET H(1)=INT(D/4096) 70 LET D=D-H(1)*4096 80 LET H(2)=INT(D/256) 90 LET D=D-H(2)*256 100 LET H(3)=INT(D/16) 110 LET D=D-H(3)*16 120 LET H(4)=D 130 FOR A=1 TO 4

140 LET H$(A)=CHR$(H(A)+48+7*(H(A)>9)) 150 NEXT A

160 PRINT "HEX A DECIMAL",H$ 170 PRINT 180 GOTO 10

В программе десятичное значение последователоно уменьшается для поиска 16-ричного эквивалента. Строки 130-150 эти значения переводят в код ASCII.

Следующая программа показывает 16-ричное в 10-ное преобразование. 10 DIM H$(4)

20 INPUT "HEX. CHARACTERS",H$ 30 IF CODE H$=32 THEN GO TO 20 40 LET D=0 50 FOR A=1 TO 4

60 IF H$(A)=CHR$ 32 THEN GO TO 100

70 IF H$(A)<"0" OR H$(A)>"9" AND H$(A)<"A" OR H$(A)>"F" THEN GO TO 120

_Математика машинного программирования_

80 LET D=D+16A(4-A)*(CODE H$(A)-48-7* (CODE H$(A)>57)) 90 NEXT A

100 PRINT "HEX A DECIMAL",H$ 110 PRINT "DECIMAL",D 120 PRINT 130 GO TO 20

В программе строка 16-ричных знаков H$ всегда имеет 4 знака. Если значение не задано пользователем, требование всегда повторяется. Последний пример в этом разделе показывает, как преобразование 16-ного в 10-ное может быть выполнено вручную.

16-ричный член = 789А.

Десятичный эквивалент - 7*4096=28672

8*256=2048 9*16=144 + А*1=10 789А=30,874

или попарно:

десятичный эквивалент - 78*256=30720

9А*1=154 789А=30,874

4.3. АБСОЛЮТНАЯ ДВОИЧНАЯ АРИФМЕТИКА

Одинарный регистр или адрес памяти содержит 8-ми битовое двоичное число. Это число может быть в диапазоне 0000 0000 - 1111 1111. Ни в одном из этих случаев число не может быть ни отрицательным, ни дробным, и это образует основу абсолютной двоичной арифметики - значение в памяти или в регистре всегда положительное и целое.

Также важно представлять себе, что значение, содержащееся в памяти или в регистре, изменяется циклически в пределах от 0 до 255. Это означает, что если в операции сложения полученное значение превышает число 255, то окончательный результат записывается после вычитания 256, а при вычитаниях к значению меньше 0 прибавляется 256.

Это показано на следующих примерах.

252+44 даёт 40 или FC+2C даёт 28; 87-200 даёт 143 или 57-С8 даёт 8F.

Флаг переноса действует в большинстве операций, требующих переноса. Для дальнейшей детализации см.

главу 5.

В системах, основанных на Z-80, все числа представлены в абсолютной двоичной арифметике, но программист часто нуждается в различной интерпретации чисел, таких как положительное или отрицательное, целое или дробное.

4.4. ДОПОЛНИТЕЛЬНАЯ АРИФМЕТИКА

Принцип дополнительной арифметики очень прост, но при использовании её программы результат может быть очень неожидан.

Метод позволяет рассматривать программисту двоичные значения в интервале 0000 0000 - 0111 1111, как эквивалент 10-ных значений от 0 до 127, а двоичные значения в интервале 1000 0000 - 1111 1111, как эквивалент 10-ных значений от -128 до -1.

В результате такой интерпретации бит 7 (левый крайний бит 8-ми битового числа) рассматривается как знаковый. Он будет 0 для положительного числа и 1 для отрицательного.

Заметим, что возможно распространить принципы дополнительной арифметики на 16-битовые числа. В этом случае интервал возможных значений чисел будет от -32678 до 32767 десятичных.

Преобразование отрицательных 10-ных чисел в дополнительную двоичную или 16-ричную форму просто.

Порядок следующий:

1. Найдите двоичную форму для абсолютного двоичного значения, например: 54 - 00110110.

2. Получите обратный код - изменить 0 на 1 и наоборот 0011 0110 - 1100 1001.

3. Прибавьте 1 - 1100 1001 + 1 = 1100 1010.

4. Используйте двоичную форму или переведите в 16-ричную. -54 в дополнительном коде - 1100 1010, или

СА.

Операцию можно провести в обратном порядке. Для перевода числа в дополнительном коде в 10-ный вид.

4.5. ИНТЕГРАЛЬНОЕ ПРЕДСТАВЛЕНИЕ

Интерпретатор Бейсик в системе SP использует 5 байт для представления чисел. Любое целое в интервале -65535 - +65535 включительно записывают в интегральной форме, в то время как любые дробные или целые числа вне этого диапазона записываются в 5 байт плавающего числа.

В интегральной форме первый байт всегда 0. Второй байт содержит 0, если число положительное и 255 (FF), если оно отрицательное. 3-й и 4-й байты содержат целое значение как 16-битовое беззнаковое число в дополнительном коде. Но 3-й байт содержит всегда младшую часть, а 4-й старшую. 5-й байт не используется, но

_Математика машинного программирования_

всегда содержит 0.

Следующая программа демонстрирует интегральную форму (в десятичном виде) для любых целых чисел, вводимых пользователем. Строка 20 программы гарантирует получение интегральной формы. 10 INPUT N

20 IF N<>INT N OR N<-65535 OR N>65535 THEN GO TO 10

30 PRINT "NUMBER CHOSEN =",N

40 LET V=PEEK 23627+256*PEEK 23628

50 FOR A=1 TO 5

60 PRINT A;".";TAB 5;PEEK(A+V)

70 NEXT A

80 GO TO 10

2-ное

10-ное

16-ное

0111 1111

+127

7F

0111 1110

+126

7E

0000 0010

+2

02

0000 0001

+1

01

0000 0000

0

00

1111 1111

-1

FF

11111110

-2

FE

1000 0001

-127

81

1000 0000

-128

80

Диаграмма 4.1. Крайний левый бит в двоичном знаковый бит. В приведенной выше программе указатель указывает на начало поля переменных, и адреса с +1 по +5 будут содержать 5 байт введенного числа. Программа дает результаты в виде: выбрано значение 0 1.0 2.0 3.0 4.0 5.0

так как 0 - положителен и представляется как 0*1+0*256. выбрано значение 1516 1.0 2.0 3.236 4.5 5.0

так как 1516 - положительно и представляется как 236*1+5*256. выбрано значение -1 1.0 2.255 3.255 4.255 5.0

так как -1 отрицательно и имеет форму FFFF.

Замечание: ошибкой программиста бу, еревод -65535. Это значение не соответствует интегральной форме 0,255,0,0,0

4.6. ПРЕДСТАВЛЕНИЕ С ПЛАВАЮЩЕЙ ТОЧКОЙ

5 байт, используемых в системе SP для представления чисел с плавающей точкой, позволяют хранить числа в диапазоне 0.29е-38 - 1.7е38 (приблизительно).

Нулевое значение всегда хранится как 5 нулевых байтов. Все остальные значения хранятся: экспонента в первом байте, мантисса в остальных 4-х. Теория описания чисел в терминах экспонент и мантисс первоначально появилась в десятичной записи, поскольку в ней лучше работать.

Нахождение экспоненты и мантиссы десятичного числа - это, в сущности, перевод числа в е-формат. Рассмотрим число 12345, которое в ЕХР-формате может быть представлено как .12345 Е+5. Для получения мантиссы 10-ная точка двигается налево до тех пор, пока она не становится перед значащей старшей цифрой. Экспонента -число необходимых сдвигов, мантисса - дробное десятичное число. Экспонента - +5; мантисса - 0.12345.

Поскольку система SP имеет дело скорее с двоичными числами, чем с десятичными, подобные операции могут быть рассмотрены для двоичного числа.

Рассмотрим двоичное число 0001 1111, что эквивалентно +31. Двоичная точка лежит справа от 8-го бита и требует +5 сдвигов, чтобы перевести её перед старшим значащим битом. Поэтому экспонента =+5; мантисса =.1111 1000 ......

В SP производятся ещё некоторые действия для экспоненты: - положительная экспонента всегда увеличивается на 10-ное значение +128 (16-ное 80), в нашем примере +5+128=133.

Для мантиссы: первый бит мантиссы всегда будет единичным, поэтому его можно использовать как знаковый - для положительного числа он будет 0, а для отрицательного останется 1.

В нашем примере мантисса становится .0111 1000... И теперь остается поместить число в 5 байтов. Неиспользуемые байты мантиссы зануляются. В десятичном плавающем виде +31 записывается как 133,120,000, в шестнадцатеричном 85,78,00,00,00 и, если хотите, в двоичном 1000 0101 0111 1000 0000.

Подобная операция позволяет переводить и отрицательные, и дробные числа, хотя и не так просто. Следующая программа показывает 10-ную форму плавающих чисел. Включение строки 30 гарантирует, что всегда получится плавающая форма числа.

10 INPUT N

IF N=0 THEN GO TO 40 LET N=N-.2E-38 PRINT "NUMBER CHOSEN";N PRINT

20 30 40 50 60 70 80 90 100 110 120 130

PRINT "EXP";TAB 9;"MANTISSA" LET V=PEEK 23627+256*PEEK 2362

PRINT PEEK (V+1);TAB 9; FOR A=2 TO 5 PRINT PEEK (V+A); CHR$32; NEXT A PRINT GO TO 10

Приведенная выше программа даёт следующие результаты. EXP MANTISSA 1 =129 0 0 0 0 1 =130 0 0 0 0 35456 =144 10 128 0 0 -1 =129 128 0 0 0 -35456 =144 138 128 0 0 6.333 =131 74 167 239 158

Интересно заметить, что 0.5 и 1/2 дадут различные значения. .5 =127 127 255 255 255 1/2 =128 0 0 0 0




СОДЕРЖАНИЕ:
  1. Принципы Работы Микрокомпьютерной Системы - Z80 - Микропроцессор; 16k Rom; Ula; Pal - Кодировщик; Rom Область; Карта Памяти Экранной Области; Область Атрибутов; Буфер Печати; Системные Переменные; Карты Микродрайвов; Область Информационных Каналов; Область Бейсик-Программы; Формат Строк Бп; Область Переменны; Область Редактора; Рабочая Область; Стек Вычислителя; Резервная Память; Машинный Стек; Go Sub - Стек; Графическая Область, Определенная Пользователем.


  Оставте Ваш отзыв:

  НИК/ИМЯ
  ПОЧТА (шифруется)
  КОД



Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
RiP - А вы знаете, что... Билл Гилберт является тайным псевдонимом Билла Гейтса ?
Новый СОФТ - О том как ненадо делать релизы игр. Список лидеров в той или иной области спектрумовской деятельности. О работах Новгородской группы Digital Reality.
Sofтинка - Список версий новой операционной системы для спектрума ZXVGS.
Poke's
Система - Обзор системных программ: Smart boot

В этот день...   20 апреля