Аскота предназначена, в основном, для автоматизации бухгалтерских операций, к тому же её язык программирования разработан в начале 50-х годов, и непривычен для нас.
Ниже я постараюсь сделать пересказ инструкции по управлению Аскотой в более привычных для современного ассемблера терминах. Инструкция не претендует на полноту, многие детали, важные, в первую очередь, для обработки бухгалтерских таблиц, опущены. Для более подробного знакомства с темой рекомендую прочитать замечательную книгу Т.А.Поляковой и В.И.Тихомирова "Эксплуатация бухгалтерских машин Аскота класса 170" 1974 года издания.
Вопросы ассемблирования в данном руководстве также не поднимаются.
Память программы технически представляет собой программную доску со 159 колонками отверстий, по 46 отверстий в колонке. В отверстия устанавливаются металлические пластинки (стопсы) разных форм, установка считывается рядом щупов.
На практике программа может содержать примерно 50 шагов.
Шаги выполняются последовательно, у каждого шага есть признак номера программы (№1, №2 или одновременно №1+№2). В каждый момент времени машина настроена на выполнение программы 1 или программы 2, и шаги, не промаркированные как принадлежащие этой программе, игнорируются.
За каждый шаг выполняется одна или несколько команд, по одной команде каждого типа (см. список ниже).
После выполнения шага машина может остановиться, перейти к следующему шагу или перейти в указанную точку программы.
После выполнения программы машина автоматически возвращается к назад (к началу программы, если не выбрана иная точка), выполняя бесконечный цикл.
Программная доска жёстко закреплена на каретке, движущейся вдоль печатного узла. Все данные выводятся на бумагу с помощью этого печатного узла - поэтому печать на каждом шагу происходит на определённой точке бумаги по ширине. Если печать происходит много раз при многократном выполнении программы, то формируется колонка чисел.
Память данных представляет собой 56 регистров по 12 десятичных знаков, поддержка нецелых чисел минимальна, отрицательные числа хранятся в виде дополнения (но изменение знака происходит только при переходе через ноль, не после переполнения).
У машины есть клавиатурный регистр, регистры I, II, K, работающие независимо, пара регистров III и IV и несколько (в моём случае 5) банков по 10 "накапливающих" регистров. Номер накапливающего регистра состоит из двух цифр - номера банка и номера регистра в банке, например, "00" или "38".
Клавиатурный регистр работает только на чтение (число вводится в него с клавиатуры), остальные регистры не могут быть записаны оператором напрямую, но работают на чтение и запись.
[1] В одной команде нельзя использовать одновременно III и IV регистры. В одной команде нельзя использовать одновременно два "накапливающих" регистра с разными номерами в банке (17 и 37 - можно, 17 и 18 нельзя, 17 и 38 нельзя), нельзя складывать и вычитать из "накапливающих" регистров одной командой (17+=, 37+= можно, 17-=, 37-= можно, 17+=, 37-= нельзя).
Одновременно с любой операцией чтения чисел может быть напечатано прочтённое число и код операции, формат печати гибко настраивается. Отрицательные числа из регистров I, II, K печатаются в естественной форме, со знаком минус, из остальных -- в виде дополнения.
Регистр K, формально, весьма удобен и функционален, но для его программирования используются стопсы 9 и 10, которых в комплекте машины обычно очень мало, поэтому лучше использовать его пореже.
2. Прибавить и отнять прочитанное число к другим регистрам, в любой комбинации, кроме запрещённых (см. [1]):
I+=;
K-=;
II+=; III-=; 03+=; 23+=; 33+=; 43+=;
Нельзя: kbd+=;
3. Распечатать прочитанное число:
prn([options]);
По умолчанию - распечатать прочитанное число как целое, чёрным цветом, если оно положительное, и красным, если отрицательное.
Опции - см. раздел Г., "печать".
4. Обнулить прочитанный ранее регистр
clr;
5. Перейти к другой программе (от I к II или от II к I)
goto prog1;
goto prog2;
6. Перейти по программе вперёд, до метки:
goto forward;
...
forward1:
forward2:
Примечания:
Переход осуществляется до метки, соответствующей номеру исполняемой в данный момент программы (forward1 при выполнении программы 1, forward2 при выполнении программы 2).
В программе может быть любое количество меток forward1 и forward2, переход будет выполнен до ближайшей.
Технически, метка перехода находится на шаг раньше, чем указанно в программе. Поэтому, если метка перехода находится на шаге, сразу же следующем после команды Goto forward, метка игнорируется. Это бывает важно при создании условных конструкций:
goto forward:
if (I>0) goto forward;
forward1:
...
forward1:
В этом примере первая метка forward приводит к тому, что следующий оператор после условного перехода выполняется всегда, а переход ко второй метке выполняется по логическому условию.
Если нужная метка не будет найдена до конца программы, программа (как обычно) перейдёт к началу, и будет искать метку сначала, например:
forward1: 1: read I; prn();
1: goto forward1;
После выполнения команды "goto forward1;" программа долистается до конца, перейдёт к началу, долистается до метки "forward1:" и выполнит печать содержимого регистра I;
Внимание! Если между командой goto forward и соответствующей меткой forward находится команда if (><), эта команда if сработает независимо от номера программы! Ограничение не относится к случаю, когда if находится на участке, проходимом кареткой обратным ходом, а также к переходу по второй программе на машинах с установленной блокировкой if по второй программе.
При отсутствии соответствующей метки в программе машина зависает, бесконечно сканируя программу в поисках метки.
7. Перейти по программе назад, до метки:
backward1:
...
goto backward1;
или
backward2:
...
goto backward2;
Примечания:
При переходе назад номер метки не связан с номером программы, и определяется меткой в команде перехода.
Количество меток в программе может быть любым, переход осуществляется до ближайшей.
При отсутствии метки до начала программы, машина останавливается на первом шаге, и начинает выполнять программу с него.
Технически, автоматический возврат каретки после прохождения последнего шага программы является командой goto backward1 - поэтому, если нужно, чтобы после последнего шага программа переходила к первому, использовать метку backward1 нельзя! В смысле, можно, но только на первом шагу, а там каретка и так остановится, без метки.
9. Выполнить переход, вперёд/назад если не 0
{весь шаг, кроме переходов forward/backward} if(!=0) goto forward/backward1/backward2;
0 должно быть равно то число, которое было прочитано в данном шаге.
read k; if(!=0) goto forward;
1: goto forward;
1: if(I>0) read k; II+=; clr; prn(); goto prog2; if(!=0) goto backward1;
12: forward1: forward2: read 00; prn();
В данном случае, если I<0, то шаг с условием пропускается, и сразу распечатывается значение регистра 00.
Если I>0, то считывается k, его значение прибавляется к регистру II и распечатывается, затем k обнуляется, машина переключается на работу по второй программе. В случае, если считанный k был равен нулю и до обнуления, выполняется goto backward1; иначе машина переходит к следующему шагу, и распечатывается значение регистра 00.
11. Форматированная печать прочитанного числа
prn(options);
options:
frac - поставить точку после второго разряда справа (печатать число как дробное)
red - распечатать красным цветом
symbol - распечатать дополнительно специальный знак операции
no0 - не распечатывать 2, 3 и 4 разряды, если в них нули (3 разряд не печатается в случае, если ноль в 3 и 4 разряде одновременно)
12. Печать текста
text;
После выполнения этой команды оператор может напечатать текстовую запись. Текст вводится на клавиатуре пишущей машинки, доступны заглавные кириллические буквы, цифры, знаки '.', ',', '-', '/', '%', а также пробел.
После окончания печати текста для продолжения исполнения программы следует перевести вверх рычаг "B/S" и нажать на среднюю пусковую клавишу.
13. Печать двухзначного кода
code;
Распечатать код из двух цифр. Код устанавливается на дополнительной клавиатуре, печатается слева от зоны печати прочитанного числа.
14. Печать даты
date;
Распечатать дату. Дата устанавливается на специальном валике, распечатывается слева от двухзначного кода.
16. Остановка и ожидание выбора регистра
wait_reg;
В начале шага выполнение программы останавливается, и не может быть продолжено до выбора оператором накопительного регистра, к которому будет прибавлено следующее прочитанное число.
Запускать машину рекомендуется средней из трёх больших белых клавиш. Многие из перечисленных выше клавиш (любое чтение регистров, сброс и чтение без повторения клавиатуры, вычитание из накапливающих регистров) также запускают машину на выполнение выбранного клавишей действия, остальные клавиши только выбирают список действий, которые будут выполнены при пуске машины.
Ко всем страницам про Аскоту
К главной странице про механику (alple.net/arif-ru)
К главной странице моего сайта (alple.net)