Работа с ZX-Spectrum 1993 г.

Приложение С (часть 2) - язык программирования BASIC.


ПРИЛОЖЕНИЕ С (ЧАСТЬ 2)

ЯЗЫК ПРОГРАММИРОВАНИЯ BASIC

СПРАВОЧНОЕ ПОСОБИЕ

Все числа в системе могут иметь точность 9 или 10 знаков. Наибольшее
число 10**38, а наименьшее положительное число 4*10**(-39). Числа имеют
внутреннее представление как числа с плавающей (двоичной) точкой, с выде-
лением одного байта на показатель степени "Е" (экспоненты) в интервале от
1 до 255, и четырёх байтов на мантиссу "М" в интервале от 0.5 до 1 (0.5 М1).
Это представляется числом М * 2 ** (Е-128).

Поскольку 1/2 М<1, старший значащий бит мантиссы всегда 1. Следо-
вательно, мы можем заменять его на бит, обозначающий знак:

0 - для положительного числа и

1 - для отрицательного числа.

Наименьшее целое имеет специальное представление, в котором пер-
вый байт 0, второй байт знака (0 и FF Н), а^третий и четвёртый - само число в
дополнительном коде (младшие значащие цифры в первом байте).

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

Управляющие переменные для FOR-NEXT циклов имеют имена длиной в
одну букву.

Числовые массивы имеют имена длиной в одну букву, которая может
быть такой же, как имя скалярной переменной. Эти массивы могут иметь
произвольное количество измерений и произвольный размер. Начальный
индекс Всегда 1.

Строки символов более гибкие в своей длине. Имя строковой перемен-
ной в отличии от простой переменной заканчивается символом доллара ($).

Строковые массивы также могут иметь произвольное количество изме-
рений и размер. Их имена представляют собой одну букву и следующий за
ней символ $, но не могут совпадать с именем простой строки символов.

Все строки в массивах имеют фиксированную длину, которая определя-
ется числом, задающим последнюю размерность в операторе DIM. Началь-
ный индекс 1.

Подстрока от строки может быть получена как сечение. Сечение может

быть:

а) пустым;

б) числовым выражением;

в) некоторым "числовым выражением" ТО. другим "числовым
выражением" и использоваться в:

*) строковых выражениях (сечениях) ;
••) строковых массивах переменных

(индекс 1,индекс 2,...индекс N,сечение)
или, что тоже самое,

(индекс 1,индекс 2,...индекс N) (сечение).

В случае *) строка выражения имеет значение S$. Если сечение
массива пусто, то SS считается подстрокой от самой себя.

Если сечение представляется числовым выражением со значением "М",
то результатом будет М-й символ от SS (подстрока длиной 1).

Если сечение представлено в форме в) и первое числовое выражение
имеет значение М (умалчиваемое значение 1), а второе N (умалчиваемое
значение SS), и если 1<= М <= N <= ,чем длина строки SS, то результатом
будет подстрока от SS с М-м начальным символом и N-ым конечным.

Если 0 <- N < М, то результатом будет пустая строка. В любом другом
случае выдаётся сообщение оо ошибке "3 ...

Сечение выполняется перед функцией или операцией, которая осущест-
вляется, если скобками не предписано иначе.

Подстрока может назначаться (смотри оператор LET). Если часть строки
записывается в строковый литерал, она должна удваиваться.

ФУНКЦИИ

имя

функции

ТИП
аргумента

ДЕЙСТВИЕ
(возвращаемое значение)

1

2

3

ABS

число

абсолютное значение

ASC

число

арккосинус в радианах. Выдаёт сообщение об ошибке
"А ... * если X не лежит в интервале от -1 до 1.

AND

логическая опе-
рация. Правый
операнд всегда
число. Слева мо-
жет быть:
-число,

тогда
- строка,

тогда

1 А , если В <> 0;
A AND В-{

0 , если В - 0.

• А$, если В <> 0;
А$AND В -{

" если В - 0.

ASN

число

арксинус в радианах. Выдаёт сообщение "А..., если X
не лежит в интервале от -1 до 1.

ATN

число

арктангенс в радианах.

ATTR

два числовых ар-
гумента X и Y,
заключаемые в
скобки

число, двоичный код которого, представляет собой
атрибуты Y-ой позиции Х-ой строки экрана. Бит 7
(старший ) равен 1 для мерцающего поля, и 0 для не
мерцающего. Биты с 5 по 3 - цвет фона. Биты с 2 по 0 -
цвет тона. Выдаёт сообщение "В ... * если не соблю-
дается условие 0 <- X <- 23 и 0 <- Y <- 31.

BIN

это не двоичная функция. За BIN записывается пос-
ледовательность нулей и единиц, представляющая со-
бой двоичное представление числа, которое записыва-
ется в память.

1

2

3

CHR$

число

символ, чей код представим числом X. округленным
к ближайшему целому.

CODE

строка символов

код первого символа в строке Х$ ( или 0. если Х$'-
пустая строка).

1 COS

число в радианах

косинус X.

EXP

число

Е в степени X

FN

FN с последующим именем, определённым пользова-
телем функции ( см. DEF ). Аргументы должны за-
ключаться в скобки. Даже если нет аргументов,
скобки всё равно должны записываться.

IN

число

осуществляет ввод на уровне микропроцессора из
порта X ( 0 <■ X <■ FFFF Н ). Загружается пара
регистров ВС и выполняется команда ассемблера IN
А(С).

INKEYS

нет

чтение с клавиатуры. Возвращает символ . введенный
с клавиатуры ( в режиме [Lj или [С] ). если было
действительное нажатие клавиши, или пустую строку
в противном случае.

INT

число

округление к ближайшему меньшему целому.

LEN

строка символов

длина строки.

LN

число

натуральный логарифм- Выдаёт сообщение "А ...
если X <» 0.

NOT

число

0, если X <> 0 и 1, если X - 0. Операция имеет
четвёртый приоритет.

OR

логическая опе-
рация. Оба опе-
ранда - числа

. « , 1. если В <>0:
A OR В » {

А, если В - 0.

PEEK

число

значение байта в памяти по адресу X, округленному
к ближайшему целому. Выдаётся сообщение "В ...
если X < 0 и X > 65535

PI

нет

число Pi (3.14159265... )

POINT

два числовых ар-
гумента X и Y,
заключённых в
скобки

1, если точка экрана с координатами ( X. Y ) закраше-
на. 0, если эта точка имеет цвет фона. Выдаёт, сооб-
щение "В ... "если не выполняются условия
0 <- X <- 255 и 0 <- Y<- 175.

RND

нет

очередное псевдослучайное число из последователь-
ности, получаемой возведением в 75 степень модуля
числа 65537, вычитанием 1 и делением на 65536.
Число лежит в интервале 0 <- Y <- 1.

1

2

3

SCREENS

два числовых ар-
гумента X и Y,
заключённых в
скобки

символ (обычный или инверсный), который появляет-
ся на экране в строке X, позиции Y. Даёт пустую стро-
ку, если символ не опознан.

SGN

число в радианах

-1, если X < 0;

0, если X - 0;

1, если X > 0.

SQR

число

корень квадратный. Выдаёт сообщение "А ... если
Х<0.

STR$

число

строка символов, которая должна быть отображена,
если X выводится.

USR

число

вызывает подпрограмму в машинных кодах, началь-
ный адрес которой X. При возврате результатом бу-
дет содержимое регистровой пары ВС.

USR

строка символов

адрес группы байтов, задающих определённый поль-
зователем символ для закрепления его за X.

VAL

строка символов

вычисление X, как числового выражения. Выдаёт со-
общение "С ... если X содержит синтаксические
ошибки или даё¥ строковое (не числовое) значение
Возможны и другие ошибки.

VAL$

строка символов

вычисляет X, как строковое выражение. Выдаёт сооб-
щение "С ... **, если X содержит синтаксическую
ошибку или даёт нестроковое (числовое) значение.

ОПЕРАЦИИ

Префиксные:

- число отрицательное значение.
Инфиксные (двухоперандовые):

+ сложение для чисел, конкатенация для строк;

вычитание;
* умножение;
/ деление;

** возведение в степень (стрелка вверх).Сообщение " В ...

если левый операнд отрицательный;

- равенство;

> больше; Оба операнда должны быть одного типа.

< меньше; Результат равен 1, если сравнение

>- больше или равно; истинно и равен 0, если нет.
<= меньше или равно;
<> не равно.

Функции и операции имеют следующие приоритеты:

индексация и сечения - 12

все функции за исключением: NOT и префиксного минуса - 11

возведение в степень - 10

префиксный минус - 9

*, / - 8

+, - (вычитание) - 6

>, <, >«, <=, о - 5

NOT - 4

AND - 3

OR - 2

ОПЕРАТОРЫ

Принятые обозначения:

А - одна буква;

V - переменная;

X, Y, Z - числовые выражения;

М, N - числовые выражения, которые округляются к

ближайшему целому;
Е - некоторое выражение;

F - выражение, имеющее строковое значение;

S - последовательность операторов, разделённых

двоеточием;

С - последовательность символов управления цветом.

Каждый заканчивается запятой или точкой с запя-
той. Цветовой символ имеет форму операндов:
PAPER, INK, FLASH, BRIGHT, INVERSE или
OVER.

Текст произвольного выражения может располагаться в любом месте
строки (за исключением номера строки, который должен размещаться в нача-
ле строки).

Все операторы, кроме INPUT, DEF и DATA могут использоваться и как
команды, и в программах.

Команда или строка программы может содержать несколько операто-
ров, разделённых двоеточием (*:w).

Нет ограничений на положение оператора в строке, хотя есть некоторые
ограничения в IF и REM.

Все операторы языка сведены в следующую таблицу:

Оператор

Действие оператора

1

2

ВЕЕР X,Y

Воспроизводится звук длительностью X сек. и высотой Y
полутонов вверх от основного тона ДО (или вниз, если Y
отрицательное).

1

2

BORDER N

Устанавливает цвет рамки (бордюра) экрана, выдаёт сооб-
щение об ошибке "К ... ", если не соблюдается 0 <- N <- 7.

BRIGHT N

Устанавливает яркость выводимого символа:

0 - для обычной яркости;

1 - для повышеной яркости;

8 - сохраняет существующую яркость.

CAT

Без MICRODRIVE не работает.

CIRCLE X,Y,Z

Изображает дугу или окружность с центром в точке с ко-
ординатами (X.Y) и радиусом Z.

CLEAR

Уничтожает все переменные и очищает занимаемую ими
память. Выполняет RESTORE и CLS, устанавливает PLOT
позицию в нижнюю левую точку экрана и очищает GO SUB
СТЕК.

CLEAR M

Подобно CLEAR, но дополнительно изменяет системную
переменную RAMTOP на 'N' и задает новый GO CUB СТЕК.

CLOSE #

Без MICRODRIVE не работает.

CLS

(CLear Screen) очищает файл экрана.

CONTINUE

Продолжает выполнение программы, начатой ранее и оста-
новленной с сообщением, отличным от "0...Если было со-
общение "9 ... " или "L ...", то выполнение продолжается со
следующего оператора, в других случаях — с того операто-
ра, где случилось прерывание. Если сообщение возникло в
командной строке, то CONTINUE вызовет попытку пов-
торить командную строку и перейдёт в цикл, если было со-
общение "0:1", даёт сообщение "0", если было "0:2", или даёт
сообщение "N если было "0:3" или более. В качестве
CONTINUE используется ключевое слово CONT на
клавиатуре.

COPY

Пересылает копию 22-х строк экрана на принтер, если он
подключен. Помните, что по COPY нельзя распечатать на-
ходящийся на экране автоматический листинг. Выдаёт со-
общение "D ...", если нажать клавишу BREAK.

DATA E1,E2,E3,...

Часть списка данных. Должна располагаться в программе.

DEF FN A(A1,A2,A3,...)«E

Определяемая пользователем функция. Должна распола-
гаться в программе. А1.А2,АЗ и т.д. единственные буквы или
буквы и $ для строковых аргументов, значений. Использует-
ся форма DEF FN А(), если нет аргументов.

DELETE F

Без MICRODRIVE не работает.

1

2

DIM A(Ni,N2,...NK)

Уничтожает массив с именем А и устанавливает числовой
массив А с К-измерениями и присваивает всем его элемен-
там значение

DIM A$(N1,N2,...NK)

Уничтожает массив или строку с именем А и устанавливает
символьный массив А с К-измерениями и присваивает всем
его элементам значение " ". Массив может быть представлен
как массив строк фиксированной длины NK, с К-1 размер-
ностью. Сообщение "4..." выдаётся, если недостаточно мес-
та для размещения массива. Массив не определён до его
описания в операторе DIM.

DRAW X,Y

То же самое, что и DRAW X,Y,0. Чертит прямую линию.

DRAW X,Y,Z

Изображает линию от текущей графической позиции в точ-
ку с приращениями X.Y по дуге в Z радиан. Выдаёт сооб-
щение "В ..." при выходе за пределы экрана.

ERASE

Без MICRODRIVE не работает.

FLASH N

Определяет, будет ли символ мерцающим или постоянно
светящимся:
N -0 для постоянного свечения;
N - 1 для мерцания;

N - 8 для сохранения предыдущего состояния.

FOR. A-X TO Y

То же самое, что и FOR A-X ТО Y STEP 1.

FOR A-X TOY STEP Z

Уничтожает скалярную переменную А и устанавливает уп-
равляющую переменную X, предел Y, шаг приращения Z и
зацикливает адрес, указанный в утверждении после FOR
оператора. Проверяет, если начальное значение больше
(если STEP 0) или меньше (если STEP 0), чем предел, то
происходит переход к утверждению NEXT А или выдача со-
общения "1 ..Л если нет (см. NEXT). Сообщение "4 ..." вы-
даётся, если недостаточно места для размещения управляю-
щей переменной.

FORMAT F

Без MICRODRIVE не работает.

GO SUB N

Проталкивает строку с оператором GO SUB в СТЕК для
использования затем как GO ТО N. Выдаёт сообщение
"4если не все подпрограммы завершились с RETURN.

GO TON

Продолжает выполнение программы со строки N. Если N
опущено, то с первой строки после этой.

IF X THEN S

Если X истинно (не равно 0), то выполняется S. S включает
все операторы до конца строки. Форма IF X THEN N (где N
- номер строки) недопустима.

I

2

INK N

Устанавливает цвет закрашивания (т.е. цвет, которым бу-
дут изображаться символы на цвете фона):
N в интервале от 0 до 7 указывает цвет;
N■8- оставить цвет без изменения;
N-9 - увеличение контраста.
Выдаёт сообщение "К если N не лежит в интервале от 0
до 9.

INPUT...

Где ... есть последовательность вводимых символов, разде-
ляемых, как в операторе PRINT, запятыми, точками с запя-
той или апострофами. Вводимыми символами могут быть:

а) некоторый PR1 NT-символ, начинающийся не с буквы;

б) имя переменной;

в) строка имён переменных строкового типа.
PRlNT-символы в случае а) представляются так же, как и в
операторе PRINT, за исключением того, что они все выво-
дятся в нижнюю часть экрана. В случае б) компьютер оста-
навливается и ждёт ввода некоторого выражения с
клавиатуры, значение которого будет присвоено перемен-
ной. Ввод осуществляется обычным образом, а
синтаксические ошибки выдаются мерцающим [?]. Дла
строкового выражения вводной буфер устанавливается дла
размещения двух таких строк (который при необходимости
может быть увеличен). Если первый вводимый символ
STOP, то программа останавливаетя с сообщением "Н
Случай в) подобен случаю б) с той лишь разницей, что
вводимая информация представляет собой строковый лите-
рал неограниченной длины, и STOP в этом случае ие срабо-
тает. Для останова Вы должны нажать клавишу "курсор
вниз".

INVERSE N

Символ управления инверсией выводимого символа. Если
N-0, символ выводится в обычном виде с прорисовкой цве-
та закрашивания (INK) на цвете фона (PAPER). Если N -1,
то цветовое решение изображения символа меняется на
обратное. Смотри приложение В. Выдаёт сообщение "К
ec.iHN не 0 или 1.

1

2

LET V-E

Присваивает значение "E" переменной "V". Ключевое слово
LET не может быть опущено. Скалярная переменная не
определена, пока не встретится в операторах LET, READ
или INPUT. Если "V" индексируемая строковая переменная
или сечение строкового массива (подстрока), то
присваивание осуществляется с усечением справа или до-
полнением пробелами до фиксированной длины.

LIST

То же, что и LIST 0.

LIST N

Записывает текст программы в верхнюю часть экрана,
начиная с первой строки, большей, чем "N", и делает "N" те-
кущей строкой.

LLIST

То же, что и LLIST 0.

LLIST N

Подобно LIST N, но вывод осуществляется на принтер.

LOAD F

Загружает программу и переменные.

LOAD F DATA ()

Загружает числовой массив.

LOAD F DATA $()

Загружает строковый массив.

LOAD F CODE M,N

Загружает старшие "N" байтов, начиная с адреса "М".

LOAD F CODE M

Загружает байты, начиная с адреса " М

LOAD F CODE

Загружает байты по тому же адресу, с которого они были
записаны.

LOAD F SCREEN$

Аналогично LOAD CODE 16384,6912. Очищает файл экрана
й загружает его с кассетного магнитофона. Смотри главу 20.

LPRINT

Подобно PRINT, но использует принтер.

MERGEF

Подобно LOAD F, но не затирает всю старую программу в
памяти, а заменяет только те строки и переменные, у кото-
рых совпадают номера или имена с такими же на ленте.

MOVE F1,F2

Без MICRODRIVE не работает.

NEW

Запускает по новой систему программирования BASIC,
уничтожая старую программу и переменные, и используе-
мую память, включая и байт адреса в системной переменной
RAMBOT, но сохраняет системные переменные UDG,
Р RAMT, RASP и PIP.

NEXT A

а) находит управляющую переменную "А";

б) прибавляет к ней значение STEP;

в) если STEP 0, а значение "А" не стало больше значения
"предел", или STEP 0, а значение "А" не стало меньше зна-

2

чения "предел", то происходит переход к оператору цикла.
Сообщение "2 ..." выдаётся, если не найдена переменная
"А". Сообщение "1..." выдаётся, если "А" не является управ-
ляющей переменной цикла.

OPEN #

Без MICRODRIVE не работает.

OUT M.N

Выводит байт "N" в порт "М". Операция выполняется на
уровне микропроцессора (загружаете регистровую пару ВС
адрес "М", а в регистр А - "N" и выполняет команду ассемб-
лера OUT (С),А). 0 <- М <- 65535, -255 <- N <« 255, иначе
выдаётся сообщение "В...".

OVERN

Управляющий символ надпечатывания по выведенной стро-
ке. Если N - 0, то выводимый символ затирает существу-
ющий в данной позиции. Если N - I, то новый символ со-
единяется со старым, образуя закрашивающий цвет, при ус-
ловии, что старый символ имел указание цвета, отличное от
старого, или цвет фона, если оба указывают на один и тот
же цвет (либо фона, либо закрашивания. Сложение по мо-
дулю 2). Смотри приложение В.

PAPER N

Подобен INK, но управляет цветом фона.

PAUSE N

Останавливает выполнение программы и задерживает изоб-
ражение на экране на N кадров (50 кадров в секунду - часто-
та кадровой развёртки телевизора) или до нажатия любой
клавиши. 0 <» N <- 65535, иначе выдаётся сообщение "В...".
При N - 0 время задержки не учитывается и пауза продол-
жается до первого нажатия клавиши.

PLOT C;M,N

Выводит точку закрашивающего цвета (обработанная
OVER и INVERSE) с координатами (ABS (М), ABS (N))
смещает графическую PLOT-позицию. Если цветовой
символ С не специфицирован иначе, то цвет закрашивания в
позиции, где расположена эта точка, изменится на текущий
сплошной закрашивающий цвет, и другие указания (цвет
фона, мерцание, яркость) остаются без изменения.
0 <- ABS ( М ) 255, 0 <« ABS ( N ) <- 175 иначе выдаётся
сообщение "В...".

1

2

POKE M,N

Записывает значение N в байт памяти по адресу М.
0 <« М <» 65535, ( 16384 <- М <- 65535 ),-255 <- N <- 255,
иначе выдаётся сообщение "В

PRINT...

Где - последовательность PRINT-символов, раз-
делённых запятыми, точками с запятой или апострофами,
которые выводятся на экранный файл для отображения на
экране телевизора. Точка с запятой сама действия не вызы-
вает, а используется для разграничения символов. Запятая
порождает управляющий символ "запятая", и апостроф
порождает символ ENTER.

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

а) пустая строка (т.е. ничего);

б) числовое выражение.

Если значение выражения отрицательно, то выводится
знак минус.

Если X <« 10 ** (-5) или X >- 10 ** 13, вывод осуществля-
ется в показательной форме. Мантисса представляется
8 - мью цифрами (с нормализацией) и десятичной точкой
(отсутствует только тогда, когда в мантиссе одна цифра)
после первой цифры. Показатель степени записывается
после буквы "Е" с последующим знаком и двумя цифрами
порядка. Иначе X выводится как обычное десятичное число
с 8-мью значащими цифрами;

в) строковое выражение.

В строке возможны пробелы до и после символов. Управ-
ляющие символы вызывают определяемое ими действие. Не
отражаемые на экране символы выводятся как "?";

г) AT M,N

Вывод в строку М в позицию N;

д) TAB N

Вывод управляющего символа TAB с последующими дву-
мя байтами N (первый байт старший). Вызывает ТАВ-оста-
нов;

е) цветовой символ в форме PAPER, INK, FLASH,
BRIGHT, INVERSE или OVER оператора.

RANDOMIZE

To же, что и RANDOMIZE 0.

1

2

RANDOMIZE N

Устанавливает системную переменную SEED, используе-
мую для вычисления очередного значения функции RND.
Если N <> 0. то SEED принимает значение N. ЕС ли N - 0, то
SEED принимает значение другой системной переменной
FRAMES, подсчитывающей кадры, отображаемые на экра-
не. что обеспечивает вполне случайное число.

Оператор допускает сокращение RAND (смотри клавишу).
Выдаётся сообщение МВ если N не лежит в интервале от
0 до 65535.

READ V1,V2,...VK

Присваивает переменным одной за другой значения, после-
довательно представленные в списке DATA.

REM...

Не выполняется. - может быть последовательностью
символов (исключая ENTER). Может включать двоеточие
CY*) для указания отсутствия оператора в строке с REM.

RESTORE

То же самое, что и RESTORE 0.

RESTORE N

Перезаписывает указатель данных в первый оператор DATA
в строке, меньшей, чем N. Следующий оператор READ
начнёт считывание отсюда.

RETURN

Ссылается на оператор GO SUB в стеке и передаёт управ-
ление на строку после него. Выдаётся сообщение "7 ...",
если нет указываемого оператора в стеке.

Характерная ошибка, когда операторы GO SUB не сба-
лансированы операторами RETURN.

RUN

То же самое, что и RUN 0.

RUN N

Выполняет CLEAR, и затем GO ТО N.

SAVE F

Записывает на ленту программу и переменные.

SAVEF LINEN

Записывает на ленту программу и переменные таким обра-
зом, что при загрузке программа автоматически выполняет -
ся со строки N.

SAVE F DATA ()

Запись на ленту числового массива.

SAVE F DATA $()

Запись на ленту строкового массива $.

SAVE F CODE M,N

Записывает на ленту N байтов, начиная с адреса М.

SAVE F SCREENS

Аналогично SAVE CODE I63S4.6912. Выдаётся сообщение
**F если F пустая строка или имеет длину более 10
символов. Смотри главу 20.

STOP

Останавливает выполнение' программы с* выдачей сооб-
щения м 9

CONTINUE (продолжение) будет осуществляться со следу-
ющего оператора.

VERIFY

То же, что и LOAD, за исключением того, что данные не за-
гружаются в ОЗУ, а сравниваются с находящимися там.
Выдаётся сообщение МВ если обнаружен хотя бы один
несовпадающий байт.




СОДЕРЖАНИЕ:


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

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



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

Похожие статьи:
"Балаган" N 3 - подборка анекдотов и приколов из HUMOR и COMMONPLACE.
Мозаика - О программах-каллеках... Парочка "фирменных секретов".
Приветы - приветы от редакции.
Словарь - Сексопатологические термины.
Warez Pack - Описания приложения журнала: First Association

В этот день...   21 ноября