1. Введение
eMKatic — это кроссплатформенный эмулятор современных ЭКВМ серии
«Электроника» производства НПП «СЕМИКО» (г. Новосибирск), являющихся
развитием советских программируемых микрокалькуляторов с обратной польской
нотацией Б3-34, МК-52, МК-61.
Поскольку встроенное программное обеспечение («прошивка») оригинальных
устройств является закрытым, то эмуляция реализована путём воспроизведения
функционала. Идентичность поведения соблюдена насколько это возможно. При
вычислениях используется стандартная двоичная арифметика, но с коррекцией
для имитации десятичной арифметики. Разрядность соответствует оригиналу.
Кроме функционала оригинальных устройств в эмуляторе реализованы средства
отладки и редактор исходного кода программ. Также есть возможность
подключения эмуляторов периферийных устройств через межпроцессное
взаимодействие, или эту роль может взять на себя сам пользователь.
2. Основное окно
Основное окно эмулятора имеет вид передней панели оригинального устройства
(были использованы оригинальные SVG-файлы от производителя). Левой кнопкой
мыши можно нажимать на кнопки, а правой — вызвать меню для выполнения
некоторых функций. Большинство сервисных функций эмулятора реализованы через
сервисное окно, которое вызывается при нажатии левой кнопки мыши на дисплее
устройства.
В эмуляторе реализовано включение и выключение устройства. Для моделей
отличных от МК-161 выключатель находится в левом нижнем углу сервисного
окна. В выключенном состоянии виртуальная клавиатура может использоваться
для ввода исходного кода программы во встроенном редакторе. Его описание
содержится в файле EDITOR.xx.txt, где xx - это идентификатор языка.
Контекстное меню основного окна состоит из трёх секций, первые две из
которых относятся к оперативной работе и связаны с назначаемыми клавишами,
а третья секция относится к настройкам. О функциях, собранных во второй и
третьей секции, будет рассказано в последующих разделах.
Первая секция контекстного меню содержит пункты «Копировать» и «Вставить»,
с помощью которых выполняются соответственно копирование числа из регистра X
в буфер обмена компьютера и вставка содержимого буфера обмена в регистр X с
подъёмом стека. В буфер обмена копируется до 8 или 14 значащих разрядов, в
зависимости от состояния регистра 9110. Используемый разделитель целой и
дробной части определяется настройками операционной системы. При вставке
пробелы и неразрывные пробелы игнорируются, а разделитель целой и дробной
части может быть как точкой, так и запятой, вне зависимости от настроек
операционной системы.
3. Сервисное окно
Сервисное окно вызывается из основного окна нажатием левой кнопки мыши на
дисплее, выбором соответствующего пункта контекстного меню или нажатием
назначенной клавиши. Сервисное окно не является модальным и может постоянно
присутствовать на экране. Функционал сервисного окна поделён на несколько
секций, переключаемых при помощи закладок. В следующих подразделах каждая
такая секция-закладка описана отдельно.
3.1. «Загрузка/Сохранение»
В верхней части расположены элементы управления, относящиеся к загрузке
файлов. Экранная кнопка «Загрузить из файла» вызывает диалоговое окно выбора
файла, который необходимо загрузить. С помощью кнопки «Загрузить пакет»
можно выбрав один файл загрузить группу файлов, имеющих такое же имя и
расширения .mkp, .mkd, .mkb, .mkt, .mkn и .mki, если они существуют.
Программа (.mkp) загружается со страницы, указанной в соответствующем поле
справа или, если стоит соответствующая галочка, со страницы, указанной в
файле. Более подробно загрузка файлов описана в отдельном разделе.
В средней части расположены элементы управления, относящиеся к сохранению
программы и данных в файлах. Здесь расположены кнопки сохранения программы,
десятичных и двоичных данных, области текста и данных электронного блокнота
в отдельности, а также кнопка сохранения пакета, с помощью которой можно
одним разом сохранить отмеченные галочкой области памяти. Для программы и
блокнота предусмотрены поля ввода, определяющие нужный фрагмент памяти. При
загрузке программы или данных блокнота соответствующие поля устанавливаются,
показывая загруженный фрагмент памяти. Для текущего фрагмента памяти
программ рассчитывается и отображается контрольная сумма. Более подробно
сохранение описано в отдельном разделе.
В нижней части расположено поле, отображающее путь к подключенному файлу
электронного диска (.mkf), который играет роль внешнего устройства УЗВМК-1.
Справа расположены кнопки для выбора другого файла и извлечения диска.
3.2. «Скорость»
Предусмотрены три режима быстродействия: «Без ограничения», когда
производительность ограничивается только быстродействием компьютера
(нагружается только одно ядро процессора); «Упрощено», когда все команды
выполняются за одинаковое время, а для команд «K ЭКР» и «K ГРФ» добавляется
единое дополнительное время; и «Имитация реального быстродействия» — пока
нереализованный режим, в котором время выполнения команд приближено к
оригиналу (с возможностью масштабирования), за исключением сложных
математических операций, оригинальное время выполнения которых сложным
образом зависит от аргументов.
Время выполнения команд можно настроить с помощью соответствующих ползунков.
3.3. «Отладка»
Средства отладки позволяют управлять исполнением при помощи стандартных
средств трассировки, при этом останов программы является специальным режимом
«остановленного времени». В этом режиме калькулятор находится в состоянии
исполнения программы, но исполнение не производится. Таймеры также
останавливаются. Окончательная остановка программы клавишей «С/П» в этом
режиме не блокируется регистром 9048.
Как во время останова, так и при исполнении программы можно наблюдать
состояние регистров, стека возвратов и положение счётчика команд. Можно
открыть несколько окон для работы с различными областями памяти,
отображаемых в виде таблиц. Кроме содержимого памяти в них отображаются
счётчики обращений к ячейкам. Каждая клетка имеет контекстное меню,
отражающее возможные операции. Если существуют индексные регистры,
указывающие на определённые ячейки, то это отображается в виде зелёных
треугольников слева.
Есть возможность отображения всплывающих подсказок в окнах отладки для
памяти программ и обращений к регистрам функций. Если в редактор исходного
кода добавлены шаблоны объявления констант для соответствующих регистров с
комментариями, то можно видеть название раздела и комментарий в виде
всплывающей подсказки при наведении курсора мыши на ячейку памяти программ,
содержащую команду обращения к соответствующему регистру, или на
соответствующую ячейку окна обращений к регистрам функций. Изначально
подсказки отображаются только при нажатой клавише Shift (но не в Windows).
Если клавишу Shift нажать кратковременно, то включается режим отображения
подсказок без удержания клавиши Shift. При удержании клавиши Shift более
четверти секунды этот режим выключается. Удержание клавиш Ctrl или Alt
блокирует появление подсказок (для Windows также Shift, к сожалению).
В окнах отладки можно устанавливать точки останова для разных клеток, при
этом останов будет происходить при изменении содержимого клетки. Например,
при чтении ячейки, если останов поставлен на счётчик чтений. Точки останова
на ячейках памяти программ вызывают останов при исполнении, при этом останов
происходит до выполнения команды. Остановы по операциям чтения/записи
происходят после выполнения команды.
Содержимое ячеек памяти, а также регистров стека вычислений, можно изменять
(даже во время исполнения программы). Для этого нужно нажать клавишу Enter
или произвести двойное нажатие левой кнопки мыши. При изменении памяти в
символьном (текстовом) представлении можно ввести несколько символов, то
есть строку текста. Введённые символы последовательно заполнят ячейки
памяти, начиная с редактируемой ячейки.
3.4. «ВУ» (внешние устройства)
Каждый периферийный интерфейс представлен отдельной панелью. Панели
размещены последовательно по вертикали в прокручиваемом окне. На каждой
панели есть кнопка для активации работы соответствующего интерфейса через
межпроцессное взаимодействие с внешним приложением, выполняющим функцию
эмулятора внешнего устройства. Для всех интерфейсов, кроме последовательного
порта, она расположена в правом верхнем углу панели. Последовательный порт
может играть ведущую или подчинённую роль, поэтому на его панели расположены
две таких кнопки.
Если работа с внешним приложением не активирована, то панель позволяет
пользователю самому контролировать периферийный интерфейс на базовом уровне.
Так пользователь может устанавливать напряжение на входе АЦП, логические
уровни на цифровых входах, и наблюдать состояние цифровых выходов. Для
интерфейса SPI пользователю предоставлен однобайтовый внешний регистр.
Интерфейс последовательного порта может соединяться с реальным портом
компьютера. Для этого нужно указать системное имя устройства (порта) и
поставить галочку перед заголовком «Универсальный последовательный порт».
Управление параметрами порта осуществляется через регистры-функции. Панель
сервисного окна позволяет только установить режим работы девятого бита для
девятибитного режима передачи. При передаче девятый бит формируется по
основному байту. Буфер передачи девятого бита игнорируется. При приёме
корректность девятого бита проверяется физическим портом компьютера, а буфер
приёма девятого бита заполняется согласно принятым байтам.
Последовательный порт компьютера также может использоваться для подключения
реальной ЭКВМ в качестве физической клавиатуры. Для этого нужно поставить
отметку возле слова «Клавиатура» в правом верхнем углу панели. На реальной
ЭКВМ при этом должна быть запущена программа, которая посылает код клавиши
при её нажатии и код 255 при отпускании. При приёме любого байта программа
должна завершать свою работу (остановка программы осуществляется при
отключении режима физической клавиатуры). Обмен производится на скорости
9600 бод в формате 8N1. Можно использовать готовую программу com-keys.
3.5. «Вид»
Выпадающий список «Модель» позволяет выбрать внешний вид передней панели
устройства, кроме того, от выбранной модели зависят доступные периферийные
интерфейсы. Дополнительно на клавиатуру устройства можно наложить
пользовательскую накладку с обозначениями специфическими для конкретной
программы. Для выбора накладки служит экранная кнопка справа, открывающая
диалоговое окно выбора графического файла. В файле накладки нужны только
обозначения, необходимые «отверстия» (в том числе для дисплея) будут сделаны
автоматически. Выбранную накладку можно оперативно снимать и снова
накладывать с помощью соответствующих экранных кнопок сервисного окна или
назначаемой клавиши, если фокус ввода находится на основном окне.
Цветовую гамму дисплея устройства также можно произвольно менять.
Как и в оригинальном устройстве, в эмуляторе предусмотрена генерация звука.
Звук может выводиться разными способами. Доступные способы вывода звука
зависят от операционной системы.
Если выбрано использование внешней программы, то следует задать команду (имя
и параметры командной строки) для генерации и выключения звука. В параметрах
команды генерации звука места, куда должны быть вставлены частота тона и
длительность (если внешняя программа это требует), должны быть обозначены
буквосочетаниями Hz, cs или ms в угловых скобках. Hz — это частота в герцах,
cs — длительность в сотых долях секунды, ms — длительность в миллисекундах.
Если выбрано использование РСМ-звука, то в системе должна быть установлена
библиотека PortAudio2 версии 19 или выше. Возможна работа с библиотекой,
поставляемой вместе с эмулятором ЭКВМ. Для Unix-подобных систем приоритет
отдаётся установленной библиотеке. Для работы эмулятора наличие библиотеки
необязательно (необходимо только для PCM-звука).
Для операционной системы Windows доступны другие способы вывода звука.
Windows XP при этом предоставляет доступ к системному динамику (зуммеру), а
Windows 7 эмулирует системный динамик через аудио выход.
3.6. «Клавиши»
Для каждой кнопки клавиатуры ЭКВМ, а также для ряда сервисных функций, можно
назначить несколько альтернативных клавиш клавиатуры компьютера. Комбинации
клавиш назначать нельзя. Такие клавиши, как Shift и Ctrl, воспринимаются
равнозначно обычным.
В прокручиваемом списке отображается текущее назначение клавиш. Чтобы
добавить новую клавишу или переназначить уже используемую, следует выбрать
нужную строку списка при помощи мыши и нажать экранную кнопку «Назначить»
или воспользоваться клавишами управления курсором и клавишей пробела или
Enter. После чего будет предложено нажать клавишу, которую необходимо
назначить. Для удаления клавиши из списка нужно её выбрать и нажать экранную
кнопку «Удалить» или клавишу Delete. Можно восстановить назначение клавиш по
умолчанию при помощи соответствующей экранной кнопки.
Независимо от назначения клавиш компьютера, кнопки ЭКВМ «ВВОД» и перемещения
вверх/вниз также связаны с колесом мыши.
4. Загрузка из файлов
Файлы можно загружать через диалоговое окно выбора файла, которое
открывается нажатием экранной кнопки в сервисном окне, выбором пункта
контекстного меню основного окна или нажатием назначенной клавиши
компьютера. Альтернативно файлы можно загрузить путём их перетаскивания
мышью из какого-либо диспетчера файлов в основное окно эмулятора.
Поддерживается перетаскивание сразу нескольких файлов.
Загружаемые файлы могут быть в двоичном формате ЭКВМ (.mkp, .mkd, .mkb,
.mkt, .mkn и .mki), в текстовом формате CSV (только данные), или это могут
быть растровые графические файлы в распространённых форматах. Также возможна
загрузка исходного кода программы (.mkl), для чего используется внешний
компилятор. Исполняемый файл компилятора следует выбрать с помощью
диалогового окна, вызываемого через пункт «Подключить компилятор»
контекстного меню основного окна. Если компилятор не подключен, то это будет
предложено при попытке загрузить MKL-файл. Компилятор можно скачать с сайта
НПП «СЕМИКО» (http://mk.semico.ru/mkl2mkp.htm).
Файлы в формате CSV должны содержать в себе две или пять колонок. Количество
колонок в файле определяет, куда будут загружаться данные, в память или в
электронный блокнот. Первая колонка должна содержать номера регистров или
групп блокнота. Для регистров с номерами от 0 до 999 во второй колонке
должно быть вещественное значение, а для остальных — целое десятичное или
шестнадцатеричное (с префиксом «$» или «0x») значение в диапазоне 0-255.
Для данных блокнота со второй по пятую колонку должны занимать четыре
вещественных значения соответствующей группы. Порядок строк в файле не имеет
значения. Регистры относящиеся к области десятичных, двоичных данных и
текста могут быть собраны в одном файле. Символы-разделители определяются
автоматически.
При загрузке графических файлов осуществляется импорт изображений. Размеры
изображений не должны превышать 128×64 пикселов. Можно загружать
полноцветные изображения, при этом пикселы считаются установленными
(чёрными), если уровень всех трёх цветовых компонент ниже 50%.
В автоматическом режиме работы калькулятора изображение загружается в буфер
графического экрана. В режиме программирования или ввода байтов в память
программ изображение записывается в память программ с адреса, на который
указывает счётчик команд, после чего значение счётчика команд увеличивается
на количество байт, занимаемое изображением в памяти. При загрузке
нескольких изображений они будут последовательно записываться в память.
Загрузку изображений в память программ также можно производить в режиме
просмотра и очистки памяти программ. При этом изображение будет загружаться
с адреса, отображаемого в верхней строке экрана. Аналогично в режиме
просмотра и очистки двоичных данных изображения загружаются в область
двоичных данных. Изображения записываются в память в формате, определённом
для функций R9015 и R9016.
5. Сохранение в файлы
При отдельном сохранении данных с помощью сервисного окна, кроме двоичного
формата ЭКВМ, можно выбрать текстовый формат CSV. В первой колонке такого
файла записываются номера регистров или групп блокнота, далее следуют
значения. Символы-разделители определяются настройками операционной системы
с изменениями, позволяющими не использовать кавычки.
Для сохранения копии экрана ЭКВМ нужно выбрать пункт «Сохранить изображение»
контекстного меню основного окна или нажать назначенную клавишу, затем
указать папку назначения и имя файла. Если имя файла будет иметь расширение
.mki, то изображение сразу сохранится в формате ЭКВМ, а при указании
расширения какого-либо стандартного графического формата появится диалоговое
окно экспорта изображения.
В eMKatic воспроизводятся особенности использования энергонезависимой памяти
ЭКВМ. Если программа не устанавливает разрешение записи в энергонезависимую
память (регистр 9047), то содержимое оперативной и энергонезависимой памяти
может различаться. При включении ЭКВМ содержимое оперативной памяти
восстанавливается из энергонезависимой. При завершении работы эмулятора его
состояние сохраняется, в том числе, содержимое энергонезависимой памяти.
Содержимое оперативной памяти не сохраняется. При сохранении данных в
формате ЭКВМ сохраняется содержимое энергонезависимой памяти, как в
оригинальном устройстве, а при сохранении в формате CSV — оперативной. Так
с помощью формата CSV можно сохранить результаты работы программы, которая
не устанавливает разрешение записи в энергонезависимую память.
Состояние эмулятора хранится в папке пользователя. Конкретное место зависит
от операционной системы. Существует режим хранения состояния в той же
папке, где находится исполняемый файл. Для его активации нужно создать
в этой папке пустой файл emkatic.ini.
6. Интернационализация
В eMKatic реализована поддержка перевода интерфейса на другие языки.
Переводы текстовых сообщений содержатся в файлах emkatic.xx.po (для
сообщений приложения) и lclstrconsts.xx.po (для LCL), где xx - это
идентификатор языка. Нужные файлы необходимо открыть в эмуляторе или указать
в командной строке. Также можно перетащить их в основное окно. В результате
языковые файлы будут скопированы в папку, где хранится состояние эмулятора,
и будут применены при его повторном запуске (командная строка действует
сразу же). Редактировать языковые файлы можно в обычном текстовом редакторе,
но лучше в специальных редакторах (например, Poedit).
Языковые файлы для русского и английского языков интегрированы в исполняемый
файл, при том, что можно устанавливать пользовательские переводы
вышеуказанным способом. Применить интегрированные файлы перевода можно через
контекстное меню (пункт «Переключить язык») или при помощи ключа командной
строки. Если перевод не установлен, то при запуске эмулятора будет
предложено выбрать язык.
Шрифт, которым отображаются текстовые сообщения интерфейса, можно изменить,
если шрифт по умолчанию не подходит. Для этого служит пункт контекстного
меню «Поменять шрифт». Он вызывает специальное диалоговое окно выбора
шрифта, в котором, кроме названий установленных в системе шрифтов,
отображается ряд символов, показывая для каждого шрифта, как эти символы им
воспроизводятся. Если в системе действует подмена шрифтов для отсутствующих
символов, то все символы в любом случае будут корректно отображаться, но
могут использоваться шрифты отличные от выбранного.
7. Параметры командной строки
В качестве параметров командной строки для eMKatic могут быть указаны
несколько файлов, которые будут загружены. Если в пути или имени файла
содержатся пробелы, то следует использовать кавычки. При загрузке программы
счётчик команд устанавливается на её начало.
Также в командной строке могут быть указаны следующие ключи:
-p Включить ЭКВМ
-r Включить ЭКВМ и запустить программу
-c адрес Установить счётчик команд (должен располагаться после
ключей -p и -r, которые обнуляют счётчик команд)
-b страница Установить номер начальной страницы для последующей
загрузки программы
-f Установить использование номера начальной страницы из файла
-g Указывается перед файлом, имя которого следует использовать
по умолчанию в диалоге сохранения (основной файл).
-n номер Установить сетевой номер
-m мнемоника Установить внешний вид под определённую модель ЭКВМ (152,
152m,1152,161,161b)
-l файл/- Загрузить/снять накладку на клавиатуру
-i ид. языка Установить язык интерфейса (ru,en)
-s мнемоника Задать способ генерации звука (none,util,ioc,beep,pcm)
-x файл Установить путь к внешнему компилятору MKL-файлов
-t Не сохранять последующие параметры при закрытии приложения
(также действует на языковые файлы, указанные в командной
строке после него)
-d папка Задать директорию для хранения настроек и состояния
-a модификаторы Задать альтернативное поведение при помощи модификаторов
Ключ командной строки -a позволяет изменить поведение приложения. В качестве
параметра для этого ключа указывается перечень слов-модификаторов,
разделяемых запятыми без пробелов. Модификаторы могут быть написаны в любом
регистре, то есть нет разницы между SHOW и show. В командной строке ключ -a
может располагаться в любом месте, и его положение не играет роли. Порядок
указания модификаторов также неважен. Некоторые модификаторы могут иметь
опцию, указываемую через двоеточие. Для опции допускается сокращение,
однозначно её идентифицирующее. Например, вместо Delete может быть указано
Del или D.
На данный момент поддерживаются следующие модификаторы:
Default Предписывает использовать состояние по умолчанию с чистой
памятью. Если не указаны модификатор NoSave или опция Set,
то при закрытии приложения это состояние (с изменениями,
если таковые были сделаны) будет сохранено, как основное.
Указание опции Set приводит к изменению самого состояния
по умолчанию (кроме содержимого памяти), которое сохраняется
в файле «default.ini». Если указана опция Delete, то файл
«default.ini» удаляется, и используется изначальная
конфигурация.
Clean Предписывает запуск с чистой памятью и блокнотом, не влияет
на загрузку электронных дисков. Если указан модификатор
Default, то модификатор Clean также считается указанным.
NoSave Запрещает сохранение состояния эмулятора при закрытии
приложения. Также запрещает сохранение изменений на
электронных дисках. Если указан модификатор Temporary, то
модификатор NoSave считается указанным и не требуется.
Temporary Включает режим работы с временными файлами. В этом режиме
ВСЕ файлы, указанные в командной строке, удаляются после их
загрузки (за исключением тех, которые указаны в параметрах
ключей). БУДЬТЕ ОСТОРОЖНЫ!
Show Вызывает отображение содержимого файлов, указанных в
командной строке. MKI- и MKF-файлы отображаются средствами
эмулятора, а остальные — при помощи окон отладки.
SP Активирует универсальный последовательный порт. Если опция
не указана или указана опция Slave, то будет произведено
подключение через межпроцессное взаимодействие в качестве
подчинённого устройства. При указании опции Master
запускаемый экземпляр приложения будет ведущим устройством.
Опции Real и Keyboard активируют работу с реальным портом
компьютера для использования его программой пользователя или
для подключения клавиатуры реальной ЭКВМ соответственно.
PP Активирует работу универсального параллельного порта через
межпроцессное взаимодействие.
SPI Активирует работу порта последовательного периферийного
интерфейса через межпроцессное взаимодействие.
ADC Активирует получение входных напряжений для АЦП через
межпроцессное взаимодействие. В качестве опции может быть
указан номер канала (от 0 до 3), который будет выбран в
сервисном окне.
Примеры использования модификаторов:
emkatic -a temporary,show /tmp/wumpus.mkp
(загрузить файл wumpus.mkp из папки для временных файлов, отобразить
его содержимое, и удалить исходный файл)
emkatic -a sp,pp,spi,adc
(активировать межпроцессное взаимодействие по всем интерфейсам)
emkatic -a sp:real
(использовать реальный последовательный порт компьютера)
emkatic -a default
(запустить эмулятор в исходном состоянии; новое состояние будет
сохранено, как основное рабочее)
emkatic -a default:set
(запустить эмулятор в исходном состоянии, чтобы изменить само исходное
состояние; например, задать внешний вид и положение окна на экране)
emkatic -a default,nosave
(запустить эмулятор в исходном состоянии без сохранения)
emkatic -a default:delete,nosave
(очистить исходное состояние без изменения основного)