Границы совместимости ЭКВМ и советских ПМК


Главная / ЭКВМ / Общая информация

Несмотря на то, что система команд клавишных ЭВМ "Электроника МК-152" и "Электроника МК-161" основана на системе команд советских программируемых микрокалькуляторов МК-52, МК-61 (в дальнейшем - ПМК), между ними есть некоторые отличия.

Причины отличий заключаются в различной элементной базе. Функциональные возможности ПМК определяются микропрограммами и архитектурой микросхем К745ИК1302-2, К745ИК1303-2, К745ИК1306 на базе которых выполнены модели МК-52 и МК-61. ЭКВМ разработана на базе однокристальной микроЭВМ W77LE516. Она относится к серии МК51 (iMCS-51) и по архитектуре аналогична К1816ВЕ51, но имеет больший объём памяти и быстродействие. Система команд ПМК эмулируется в ЭКВМ при помощи программы, написанной на ассемблере этой микроЭВМ.

В ЭКВМ реализована базовая система команд ПМК и некоторые наиболее часто использовавшиеся в программах недокументированные возможности и особенности работы калькуляторов. Не вполне удачные решения и ошибки не воспроизводились. Далее будут рассмотрены основные отличия, которые могут иметь значение при переносе программ калькуляторов на ЭКВМ.

MK-161 и MK-61

Прежде всего, следует учесть, что ряд клавиш ЭКВМ имеет обозначения, которые использовались в Б3-34 и аналогичных калькуляторах. Клавиши "ИП" и "П" в МК-52 и МК-61 называются соответственно "П→x" и "x→П". Обилие лишних стрелок весьма затрудняло запись и чтение программ ПМК. Обратным тригонометрическим функциям возвращены корректные наименования "arcsin", "arccos"и "arctg", вместо принятых в этих же ПМК "sin-1", "cos-1" и "tg-1". По всей видимости, последние обозначения были скопированы с зарубежных аналогов, в которых такая запись является общепринятой.

Команды преобразования угловых и временных величин в ЭКВМ также переименованы в целях удобства записи программ. Изобразить, как они записывались в ПМК, довольно сложно, а в ЭКВМ они имеют обозначения "К М→Г", "К МС→Г", "К Г→МС", "К Г→М". Запись "Г→МС", например, подразумевает преобразование величины из градусов и долей градуса в формат записи с угловыми минутами и секундами. Остальные команды трактуются аналогичным образом. Такое преобразование применимо не только к угловым, но и к временным величинам, выраженным в часах, минутах и секундах. Приведённые команды с кодами 26h, 2Ah, 30h и 33h соответственно, несмотря на различные обозначения, действуют в ЭКВМ и ПМК одинаковым образом.

Система команд в ЭКВМ расширена по сравнению с ПМК. Коды новых команд ЭКВМ в ПМК не использовались, точнее, не выполняли полезных функций и не были документированы.

Большая часть новых команд предназначена для работы со значительно увеличенной, со 105 до 10000 байт, памятью программ и расширенному с 15 до 1000 набору регистров памяти. Прямые и косвенные команды записи и чтения регистров памяти используются также для обращения к специальным функциям и устройствам ЭКВМ.

Команда "К ИПРГ" с кодом 28h позволяет считать в регистр X содержимое ячейки памяти программ. Команда калькуляторов "К ×" с таким кодом служила для вывода аварийного сообщения "ERROR". Если в программе ПМК команда "К ×" использована для выдачи сообщения об ошибке, её следует заменить на "К -" или "К ÷". Эти команды в ЭКВМ, как и в ПМК, вызывают аварийный останов с выводом сообщения. Перед заменой следует внимательно изучить алгоритм работы программы, как и в других аналогичных случаях, поскольку код команды может быть использован одновременно и как адрес перехода.

В ПМК аварийный останов вызывали также команды с кодами 2Bh, 2Ch, 2Dh, 2Eh, 3Ch. В ЭКВМ все эти команды аналогичны "К НОП". В ПМК перед аварийным остановом происходил пропуск одного байта команды, следующей за командой, вызвавшей останов. В ЭКВМ эта особенность не воспроизведена, нажатием клавиши "С/П" выполнение программы может быть продолжено с команды, следующей за командой аварийного останова.

Еще две команды "К ЭКР" и "К ГРФ" используются для вывода на индикатор содержимого регистров стека или графического экрана без останова исполняемой программы. Коды этих команд 55h и 56h совпадают с кодами команд "К 1" и "К 2", которые в ПМК не выполняли никаких действий, как и документированная команда "К НОП" с кодом 54h. В программе ПМК команды "К 1" и "К 2" следует заменить на "К НОП". Но если коды этих команд используются как адреса переходов, и нет желания разбираться в работе программы, можно ничего не изменять. Алгоритм работы программы ПМК при использовании команд "К ЭКР" и "К ГРФ" нарушен не будет.

В малосерийных аналогах МК-52 команды с кодами 55h и 56h ("К ПВ" и "К ОД", соответственно) выполняли операции обмена содержимым регистров данных и памяти программ. Но программы для этих ПМК широко не публиковались.

Рассмотрим те команды, которые в ЭКВМ функционируют принципиально иным способом, чем в ПМК.

В калькуляторах МК-52 и МК-61 существовали команды логических операций: "K ^", "K v", "K (+)" и "К ИНВ" с кодами 37h-3Ah. Они выполнялись над числами, которые для этого переводились в специальный формат: показатель степени и знак аннулировались, первый разряд мантиссы заменялся признаком результата логической операции "8," а над остальными разрядами числа проводились логические операции в двоичном виде. При этом получающиеся шестнадцатеричные цифры 'A'-'F' отображались особым образом, как '-', 'L', 'C', 'Г', 'E' и пустое знакоместо соответственно. Например, операция "К ИНВ" над числом 123456 приводила к получению на индикаторе "8,ГCL-9".

Ввод шестнадцатеричных чисел с цифрами 'A'-'F' с клавиатуры ПМК был невозможен. Кроме того, появление цифры 'F' в числе могло привести к сбоям в работе, устранить которые удавалось только при помощи выключения питания.

Все перечисленное делало крайне неэффективным применение этих команд по прямому назначению. Они часто использовались для формирования на индикаторе условных сообщений, отличающихся по виду от обычных чисел. Но в ЭКВМ для этого есть широкие возможности - от печати текста в строку комментариев до вывода произвольных изображений в графическом режиме. Поэтому команды с соответствующими кодами выполняют в ней другие функции, а именно логические операции над байтами, представленными в виде десятичных чисел. Чтобы подчеркнуть это отличие, в ЭКВМ команды логических операций носят другие наименования: "K AND", "K OR", "K XOR" и "K NOT".

Программы ПМК, в которых используются команды логических операций, для выполнения на ЭКВМ требуют существенной переработки. Если эти команды использовались для формирования сообщений, следует использовать в качестве сообщений числа или вывод в строку комментария.

При реализации команды "К max", с кодом 36h, предназначенной для выделения большего из двух чисел, в калькуляторах был допущен ряд недоработок. Число ноль воспринималось этой командой как наибольшее из всех чисел. Передвижение чисел по стеку в результате операции могло быть выполнено различными способами, в зависимости от того, в X или Y находилось большее число, и было ли оно нулем. Меньшее число при этом могло оказаться как в регистре Y, так и в X1.

В ЭКВМ для команды "K max" реализовано пожелание, высказанное в статье В.А. Хмелюка, Д.Б. Хрусталева и А.В. Васильева в разделе "Школа начинающего программиста. Занятие 21" журнала "Наука и Жизнь" N11 - 1988 г. Если число в Y больше, чем в X, происходит операция "↔", обменивающая содержимое этих регистров. В противном случае обмена не происходит. Это позволяет использовать команду для сортировки.

При корректном применении команды "K max" в программах калькуляторов, с предварительной проверкой на нуль и использованием только регистра X в качестве результата операции, ее действие в ПМК и ЭКВМ идентично.

Если программа ПМК использует данную команду, следует обратить внимание, не применяется ли она для проверки на нулевое значение. В этом случае программу следует переработать.

Генератор случайных чисел "К СЧ" в калькуляторах имел слишком короткий период, и был склонен к зацикливанию в пределах одного-двух чисел при использовании в реальных программах. На результат его работы влияли другие команды, начинающиеся с клавиши "К", а также содержимое регистров памяти и стека. К примеру, команда "K max" с нулевыми аргументами вызывала повторение последовательности чисел с одного и того же значения 0,404067. Эта же последовательность выдавалась после включения питания. По данным разработчиков ПМК, сотрудников киевского ПО "Кристалл", в этом случае генератор выдавал 89 неповторяющихся чисел и далее зацикливался с периодом 145 чисел ("Наука и Жизнь", N6 - 1989г.). В связи с этим по прямому назначению команда практически не использовалась.

По мнению Л. Титова (Красноярск) ("Наука и Жизнь", N6 - 1989 г.) для генерации псевдослучайных чисел в ПМК использовано соотношение:

ξi+1 = {10(ξi + Y + X7)/3 + 0,404067},

где ξi+1 - очередное случайное число,
ξi - предыдущее случайное число,
Y - модифицированное содержимое регистра Y,
X7 - цифра, находящаяся в седьмом разряде регистра X.

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

В ПМК при выполнении команды "К СЧ" происходит замещение содержимого регистра X, а в ЭКВМ подъём стека, что следует учитывать при переносе программ.

При останове программы ПМК клавишей "С/П" во время выполнения калькулятор пропускал одну команду, как и при аварийном останове. Таким образом, последующий запуск вызывал сбой. Для корректного продолжения в калькуляторах требовалось предварительно сделать шаг назад по программе. ЭКВМ работает более корректно и при запуске продолжает выполнение с команды, следующей за последней выполненной.

Команда "ВП" с кодом 0Ch предназначена в ПМК для ввода порядка числа. В ПМК команда часто использовалась для изменения порядка результата предыдущих вычислений, в ЭКВМ данная возможность документирована. Команда "ВП" в ЭКВМ выполняет умножение числа X на соответствующую целую степень числа 10. Выполнение команды "запятая" после "ВП" приводит к ошибке.

Если в регистре X до выполнения команды был ноль, в него заносится число 1, как и в калькуляторах. Это следует учитывать при выполнении умножения на степень десяти при помощи команды "ВП".

Прочие особенности работы команды "ВП", основанные на её некорректном использовании, в ЭКВМ не реализованы. К примеру, в ПМК выполнение последовательности команд "В↑", "Cx", "↔", "↔", "ВП" в программе приводило к отбрасыванию у исходного числа всех разрядов, кроме первого, обнулению порядка, вычислению модуля числа и прибавлению к нему единицы. А последовательность команд "Cx", "K ×", "ВП", "ВП", "В↑", выполненная в автоматическом режиме, приводила к появлению на индикаторе сообщения "Г", то есть шестнадцатеричной цифры 'D'. Воспроизведение в ЭКВМ этих и нескольких десятков других подобных "особенностей" было бы явно излишне.

Команда "запятая" также имела в ПМК дополнительные свойства. Как отметил С. Зазовский (г. Новомосковск, Тульской обл.): "Команда "запятая", использованная в программе, стирает содержимое регистра X и восстанавливает в нем значение, бывшее после последней из команд: 0,1,... 9, В↑, П→хR (R=0...E)." (раздел "Маленькие хитрости", журнал "Наука и Жизнь" N4 - 1989 г. - С.112).

Кроме перечисленных команд аналогично действуют "/-/", "Cx" "КП→xR (R=0...E) (В. Силаев, г. Киев, журнал "Наука и жизнь" N12 - 1989 г.) и "FBx".

Использованию команды "запятая" в программе по прямому назначению, для ввода чисел, эта особенность не мешала. При пошаговом проходе эффект отсутствовал. В ЭКВМ особые свойства этой команды не реализованы.

В ЭКВМ при вводе адресов в командах запрещен набор шестнадцатеричных чисел. В ПМК ввод адреса 100-104 (или A0...A4) в команды переходов выполнялся при помощи клавиши "запятая". В ЭКВМ можно использовать команду длинного перехода или перейти в режим ввода шестнадцатеричных чисел "P ПРГ" и ввести нужный адрес. Шестнадцатиричные адреса в командах переходов ЭКВМ воспринимаются так же, как и в ПМК. При вычислении адреса значение шестнадцатеричной цифры умножается на десятичное значение разряда. Например, для перехода на адрес 101 можно ввести адрес A1 (10*10+1) или 9B (9*10+11). Это относится не только к однобайтовым, но и к двухбайтовым адресам в командах.

Использование шестнадцатеричных адресов в ЭКВМ может привести к переходу на другую страницу памяти программ. Если в исходной программе ПМК в адресах 100-104 использовались команды переходов или команда "В/О" вне подпрограммы, вместо них в ЭКВМ можно использовать команды переходов с расширенным адресом.

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

В ПМК при полном заполнении стека возвратов из подпрограмм, а его глубина составляла всего 5 адресов, команда "В/О" вне подпрограммы начинала выполнять переход на адреса, зависящие от предыдущего содержимого стека (см. "Школа начинающего программиста. Занятие 26", В.А. Хмелюк, "Наука и Жизнь" N11 - 1989 г.). В ЭКВМ переход в этом случае всегда выполняется по адресу 01 текущей страницы и от предыдущего содержимого стека не зависит. Глубина стека возвратов в ЭКВМ увеличена до 64 адресов, переполнение вызывает сообщение об ошибке.

Команды организации циклов "F L0", "F L1", "F L2" и "F L3" при корректном содержимом регистров R0...R3 выполняют в ПМК и ЭКВМ одинаковые действия. Но если в регистрах содержатся числа, не входящие в диапазон от 1 до 99999999, действие этих команд отличается.

В ПМК отрицательные числа и нуль записывают в регистр число минус 99999999 и дальнейший счет ведется в сторону увеличения, дробные числа уменьшаются на единицу младшего разряда мантиссы, эти особенности в ЭКВМ не поддерживаются. Но в ЭКВМ, как и в ПМК, число 1 после выхода из цикла остается записанным в соответствующий регистр, поскольку это свойство достаточно часто использовалось в программах.

Еще одно отличие ЭКВМ от ПМК заключается в работе команд с косвенной адресацией. В ПМК возможности команд были ограничены адресами программы от 0 до 99 и регистрами от 0 до E. Числа, по модулю меньшие единицы, или превышающие допустимое значение 14 или 99, в зависимости от команды, вызывали обращение соответственно к регистру памяти или шагу программы, номер которого вычислялся по определенным, довольно сложным правилам.

При корректном использовании этих команд в программах ПМК они будут выполняться на ЭКВМ без каких-либо отличий. В ЭКВМ, как и в ПМК, происходит отсечение целой части и модификация содержимого регистров, использующихся для косвенной адресации. Под модификацией понимается уменьшение на единицу содержимого регистров R0...R3 и увеличение на единицу содержимого регистров R4...R6 при косвенном обращении.

Поскольку при косвенном обращении происходило отсечение дробной части, для нахождения целой части числа в калькуляторах Б3-34 и аналогичных использовалась последовательность ПR, КИПR, ИПR, где R - немодифицируемый регистр памяти от 7 до D (регистра E в Б3-34 не было).

В ЭКВМ, как и в калькуляторах МК-52, МК-61 для нахождения целой части есть специальная команда выделения целой части К[x]. Эта команда в ЭКВМ реализована так же, как и в ПМК. Фактически она выполняет отсечение дробной части. Соответственно, команда выделения дробной части K {x} в ЭКВМ и ПМК выполняет отсечение целой части числа. При использовании функций с отрицательными значениями аргумента результат не соответствует определению целой и дробной части числа, принятой в математике. Например, целая часть числа минус 3,14 равна минус 4, а дробная 0,86. Это, согласно определению, ближайшее целое, не превышающее исходного числа и их разность. Но при использовании функций в ЭКВМ и ПМК получаем минус 3 и минус 0,14. Эта особенность команд ПМК сохранена в ЭКВМ для совместимости.

Две недокументированные команды ПМК выполняли операции со стеком. Команда с кодом 3Dh копировала содержимое регистра X в X1. Команда 3Eh копировала Y в X, и X в X1. Регистры Z и T при этом не затрагивались. В литературе они не описаны и в реальных программах ПМК, насколько известно, не использовались. В малосерийных аналогах МК-52 команды "К Р" с этими кодами выполняли операцию ввода сегмента из накопителя эмулятора внешнего запоминающего устройства, но программы для этих ПМК широко не публиковались. В ЭКВМ они выполняются аналогично "К НОП".

Другая группа команд связана с кодами, содержащими шестнадцатеричную цифру F. В них заключается основное отличие системы команд ЭКВМ от ПМК.

Из документированных команд ПМК только "F Вх" имела код 0Fh. Команды с кодами 1Fh, 2Fh, 3Fh как в ПМК, так и в ЭКВМ, аналогичны "К НОП" и не вызывают никаких действий. В ПМК команды с кодами от F0h до FFh также аналогичны "К НОП". Команда 5Fh вызывала сбой внутренней программы, сбрасываемый только при отключении питания калькулятора. (Что такое "тьма", "еггогологи", наверное, ещё помнят).

Команды с кодами 4Fh, 6Fh до EFh в ПМК полностью аналогичны командам обращения к регистру R0 c кодами 40h, 60h-E0h (Д.Б. Хрусталев, В.А. Хмелюк, "Школа начинающего программиста. Занятие 22" // "Наука и Жизнь" N1 - 1989 г. - С.124).

В ЭКВМ команды с кодами 4Fh, 6Fh-EFh являются двухбайтовыми и предназначены для работы с регистрами памяти от 0 до 99. Команды 4Fh и 6Fh записывают и считывают числа, остальные команды вызывают косвенное обращение. Команда 5Fh никаких действий не выполняет.

Команды F0h, F5h и FFh в ЭКВМ действий не выполняют, при этом код FFh может использоваться наравне с 0 для указания конца строки в некоторых функциях.

Команда F2h "РР В/О" выполняет выход из прерывания. При использовании вне прерывания эта команда выполняется аналогично "В/О".

Команды F1h, F3h, F4h, F6-FEh в ЭКВМ трехбайтовые. Команды F4h и F6h записывают и считывают числа в регистры от 0 до 9999 и используются для обращения как к регистрам памяти, так и к функциям и регистрам устройств. Остальные трехбайтовые команды выполняют переходы, циклы и обращения к подпрограммам по расширенным адресам от 0000 до 9999.

Команды в ЭКВМ выполняются одинаково при работе по программе, при пошаговом проходе программы и в автоматическом режиме, то есть при непосредственном выполнении команд введенных вручную. В ПМК это не всегда так.

Следует упомянуть, что команды ЭКВМ могут быть записаны как в русской, так и в латинской транскрипции. Переключение вывода выполняется клавишей "Рус/Лат" в режиме программирования. Использование команд с латинскими символами устраняет большинство неудобств при вводе и разборе программ для ЭКВМ с использованием компилятора на компьютере.



НПП "СЕМИКО" (383) 271-01-25 (многоканальный)