Ретро-компьютер (BASIC) на STM32

UPDATE:

PC приложение (под Линукс):
PC

OK после операций с SD картой:
loadOKsaveOKUPDATE:
Работа с SD-картой:

UPDATE:
Работают SAVE и LOAD Бейсик-программ на SD-карточку. Ниже скриншоты загрузки программы TEST.BAS и трассировка запуска из тестовой UART-консоли:
LOADtraces

Еще около 8000 байт во флеш-памяти для разных улучшалок прошивки:

** Programming Finished **
** Verify Started **
...
verified 55744 bytes in 0.836388s (65.086 KiB/s)
** Verified OK **
** Resetting Target **

TODO список:

  1. Изменение названия Stm32BASIC на stm32f1BASIC Done
  2. Рефакторинг кода Done
  3. Поддержка SD карточки Done
  4. Скроллинг программы кнопками курсора
  5. Выкладывание проекта в Гитхаб
  6. Разработка печатной платы и заказ первой партии плат

--------------------------------- Далее архив -------------------------------

UPDATE:
Подзаточил код stm32BASIC до состояния работы с клавиатурой PS2:

UPDATE:
Кнопочная клавиатура работает. На очереди - SD-карточка
stm32 basic
Прогнал тест 8-ферзей на Бейсике, который, напомню, на Arduino-Nano занял 3.4 секунды. Результат на stm32f1: 0.8 секунды или примерно в 10 раз быстрее МК161 (измерял ручным секундомером, не timestamps). Далее под катом старый текст про NodeMCU.

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

Архив --------------------------------------------
Попробовал сбилдить Ардуино-Васик под сабж (в конфигурации Serial Terminal Input), выделив под Васик 32Кб.

nodemcu-basic
Выглядит многообещающе:

Sketch uses 268212 bytes (25%) of program storage space. Maximum is 1044464 bytes.
Global variables use 67280 bytes (82%) of dynamic memory, 
    leaving 14640 bytes for local variables. Maximum is 81920 bytes

В общем, надо I2C подзапилить и подключить к дисплею.

UPDATE: Навскидку дисплей от NodeMCU не заработал. Скорее всего, проблема в 3в питании - дисплею надо 5. Либо NodeMCU у меня проблемная, доберусь до осцилла, проверю

UPDATE_2: Дисплей подключился (таки надо 5 вольт ему), Васик стартовал:

Однако при попытке ввести строку Васика с сериал терминала 8266 выпадает в exception:

Fatal exception 9(LoadStoreAlignmentCause):
epc1=0x402036f8, epc2=0x00000000, epc3=0x00000000, excvaddr=0x3ffeef3d, depc=0x00000000

Exception (9):
epc1=0x402036f8 epc2=0x00000000 epc3=0x00000000 excvaddr=0x3ffeef3d depc=0x00000000

ctx: cont
sp: 3fff04e0 end: 3fff0700 offset: 01a0

>>>stack>>>
3fff0680:  0000001f 3ffef438 3fff0e14 402036e0 
3fff0690:  40100031 3ffef3f0 00000000 3ffef3fc 
3fff06a0:  00000031 3ffef3f0 00000028 40205556 
3fff06b0:  00000001 3ffef6d8 40205fb8 3ffef6d8 
3fff06c0:  3fffdad0 00000000 3ffeef38 40203943 
3fff06d0:  3fffdad0 00000000 3ffeef38 40202706 
3fff06e0:  feefeffe feefeffe 3ffef6d0 40206004 
3fff06f0:  feefeffe feefeffe 3ffef6e0 40100108 
<<
Метки публикаций: 

Комментарии

Там же Lua и MicroPython есть. Хотя если нужны BCD операции,
библиотека то уже готовая есть для C++, то может стоит встроить в бейсик

Бейсик чтобы вот. Если мне нужен был бы Питон, я взял бы Распберри Пи Зиро. Тот же размер платы.

Из-за чего такой эксепшн может быть?

---------------------------
Истина где-то рядом
www.litres.ru/vitaliy-samurov/dozvonitsya-do-devy/

Общение с последовательным портом барахлит? Там может быть что-то, зависящее от железки. А Бейсик же универсальный, железки пока не знает.

Можно отладить свой терминал и сравнить с тем, как это делает Бейсик.

Для esp8266 в ардуину написали неплохой декодер exceptions.

Paste your stack trace hereException (9):
...
Exception 9: LoadStoreAlignmentCause: Load or store to an unaligned address
PC: 0x402034d0: nextToken() at /tmp/arduino_build_375645/sketch/basic.cpp line 804
EXCVADDR: 0x3ffeed9a

Проблема, похоже, связана с архитектурой esp8266:

The ESP8266 has limitations on accessing data through a pointer. Namely, 32 bit accesses need to be aligned on a 32 bit boundary, and 16 bit boundaries for a 16 bit access. If the lowest 2 bits of ptr (the actual address) are not zeroes, you get Exception (9).

---------------------------
Истина где-то рядом
www.litres.ru/vitaliy-samurov/dozvonitsya-do-devy/

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

но мне неохота ковыряться с этим. Переползаю на stm32.

---------------------------
Истина где-то рядом
www.litres.ru/vitaliy-samurov/dozvonitsya-do-devy/

Может проще соорудить транслятор в Lua ?

Если вы хорошо разбираетесь в lua или другом языке — пишите Бейсик на нём, никто не мешает.

Традиционно Бейсики писались на ассемблере, экономя ресурсы целевой системы. Позже стала востребована переносимость, Бейсики стали писать на Си. Видимо из-за того, что богатая AT&T сильнее распиарила юниксный подход к переносимости, чем Чак Мур фортовский.

Но если программист хорошо знает и свой инструмент, и Бейсик, написать транслятор для него относительно просто. Сложнее программиста мотивировать на работу, при этом её не оплатив — мечта класса эксплуататоров. :-)

...что кому то надо вас эксплуатировать. Начните лучше с простой и очевидной мысли, что бейсик на ESP нафиг никому не упёрся (как и Каллисто где либо), исключение составляют такие сообщества как наше, где люди просто радуют друг друга своими достижениями. Причём вообще заявления про эксплуатацию ? Напишете бейсик на Луа, а я им буду алчно пользоваться ? Вам не приходило в голову, что Луа гораздо лучше Бейсика ? :-)

Мыслите сами и говорите за себя, не-эксплуататор вы наш.

Уж большего любителя говорить за других, чем Вы, и не сыскать, скромный Вы наш !

Ну, за всех Вы уж тут не говорите. Есть несколько человек, которым Бейсик интересен, и один из них очень хочет, чтобы эксперимент Basic-Nano завершился полноценной печатной платой.

---------------------------
Истина где-то рядом
www.litres.ru/vitaliy-samurov/dozvonitsya-do-devy/

и зачем то повторяете практически слово в слово, то что я написал. Есть НЕСКОЛЬКО человек, которым Бейсик интересен, кроме НЕСКОЛЬКИХ человек, остальной массе людей оно не особо нужно (т.к. давно есть лучшие альтернативы). Это не умаляет ваших достижений, я лично восхищаюсь каждым вашим отчётом и сделанным устройством! И дай Бог чтобы оно вышло в серию, я бы тоже приобрёл как платформу :)

Прошу прощения :)

---------------------------
Истина где-то рядом
www.litres.ru/vitaliy-samurov/dozvonitsya-do-devy/

Бейсик это очень хороший язык для начального обучения, у меня есть даже бизнес идея по бейсику на мелком компе.

Договорились :)
Про бизнес-идею по Бейсику - кроме как конструктора для детских и школьных кружков, мне ничего в голову не приходит.

SD-карточка заработала на SPI порту 1:

Initializing SD card...Initialization done
SD card root directory:
SYSTEM~1/
	WPSETT~1.DAT		12
	INDEXE~1		76
README.TXT		142
Content of file "readme.txt":
readme.txt
------------------------
The GNU General Public License is a free,
copyleft license for software and other 
kinds of works.

Ok

Далее надо собрать в кучу с Бейсиком (придется код клавиатуры перенести на другие GPIO в свете занятости SPI)

---------------------------
Истина где-то рядом
www.litres.ru/vitaliy-samurov/dozvonitsya-do-devy/

А какая файловая система? FAT16/VFAT/FAT32? Много памяти ест?

Я на 0,5Мб диске МК-161 даже 25% ёмкости не добрал, а на SD карте кроме программ можно целую библиотеку книг хранить :) и читать их потом на ЖК-индикаторе :))

SD-карточка сейчас 4 Гб. Ардуино-библиотека стандартная, она поддерживает FAT16 и FAT32, но для экспериментов я форматировал карточку в FAТ16.

На stm32 немного косячно работает, по-сравнению с Ардуино-Нано (тут, к примеру, большая дискуссия). У меня заработало только тогда, когда я занизил скорость SPI шины:

SPI.setClockDivider(SPI_CLOCK_DIV32);

Я, кстати, забыл, почему в МК152-161 не поставили SD-карту, а сделали то, что сделали. В фирмвари места не было?

---------------------------
Истина где-то рядом
www.litres.ru/vitaliy-samurov/dozvonitsya-do-devy/

В узвмк не 256 байт/сектор, а 264, дополнительные 8 байт позволяют отказаться от таблиц разбиения файлов, хотя файлы каталогов остаются, это позволяет упростить файловую систему и машинные затраты на её обслуживание. Думаю, делали, как можно проще.

В бейсик-недокомпе 4Гб для хранения программ... как самолётный ангар для мопеда :) хотя, сейчас в продаже карт памяти менее 512Мб днём с огнём не сыщешь...

Лет 8 назад неиспользование карты SD в МК-161-/152 было мотивировано нежеланием вступать в соответстувующую ассоциацию производителей и платить за членство 1-2К долларов в год.

Понять тоже можно, с другой стороны

---------------------------
Истина где-то рядом
www.litres.ru/vitaliy-samurov/dozvonitsya-do-devy/

Один из демо-роликов.
Mecrisp Forth on STM32 Microcontroller (blue pill)
https://www.youtube.com/watch?v=dvTI3KmcZ7I

P.S. И какие то разработчики его внедряют в свои разработки.
https://github.com/jeelabs/embello/tree/master/explore/1608-forth
и публикуют свой опыт в статьях блога.

А это, даже, не коммерческая Форт-система сделанная физиком.
Наши разработчики, тоже что то публикуют в блогах

Примеры:
https://tuxotronic.org/post/mecrisp-forth/
http://tesla.zabotavdome.ru/forth.html
...

Есть и такая последняя новость http://www.forth.org.ru/news/Eclipse%20debug%20using#0

Вообще интересно развитие архитектуры, если за объединяющий язык взять не Си, а Форт. Операционка на Форте, драйверы, графинтерфейс, приложения и компиляторы. Наверняка это помогло бы и развить язык, и принесло новое в компьютерные науки. Да и аппаратные требования стали бы поскромней. Возможно, этот подход выгодней для России.

Только на STM32 (и вообще ARM), ESP и прочих "нормальных" архитектурах, куда и зачем тащить эту 51-ую хреновину не ясно.

Поднимать Форт до состояния Юникса (Линукса, Гну) означает переносимость. Нижний уровень относительно небольшой и ограничен — сотня-другая примитивов и форт-ассемблер. Основной труд, как в Гну-Линуксе, это разработка API и мощные программные пакеты вроде Emacs, GIMP, GCC, GNOME, bash и т.д. Просто их исходный код будет не на переносимом Си, а на переносимом Форте. После появления хороших компиляторов Си можно будет что-то и из гнушного мира заимствовать.

Нижний же уровень в такой системе взаимозаменяем. Собственно, на это Форт и был нацелен изначально. Ещё до того, как AT&T протолкнула ту же самую идею со своим Си. Написанное на форт-системе для 8051 будет востребовано на STM32 и наоборот.

Войны архитектур не должны особо задевать Форт-систему. Наоборот, если что задышит и заползает на 8051, на STM32 вообще летать будет. Как программы для МК-61 летают на МК-161. Начальная разработка для слабых систем создаёт запас прочности, их ограничения заставляют бережней относиться к ресурсам.

Приятно такое читать, я всеми руками за! Как будет время хочу в этой истории изучить вопрос оптимизирующего кодогенератора (прямо на борту пмк), а также эффективного управления памятью, тут вам и Дейкстра и другие материалы в изобилии.
А уж поверх и бейсик и что угодно быстро и приятно будет накатываться. Надо создать типа Forth CLR машину.

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

Для разработчиков в Каллисто-2 будет введена команда ;– Это обычная ; и подсказка компилятору, что здесь можно оптимизировать хвостовую рекурсию. В исходном коде Каллисто 1.0 я использовал этот вид оптимизации вручную.

Помня вашу любовь к оптимизации, посмотрел на реализацию знаменитого оптимизатора СПФ. Каллисто-2 будет работать на МК-161, там такое не реализовать даже при переходе на уровень камня. Если для отечественного ПМК будет разработана достойная аппаратная платформа (STM32 или отечественный форт-процессор), полностью использовать эти наработки станет возможным лишь при переходе на процедурный шитый код. Это существенная встряска транслятора, которая потребует полного расставания с гарвардской архитектурой и повлияет на часть языка, связанную с компиляцией и словарём. Практического смысла двигаться в этом направлении нет, хотя в теории препятствия отсутствуют.

Я тоже мог бы разразиться никак не связанными выдержками о том как "Запад" не комплексует по поводу Python или Lua, или C++, да даже ассемблер бы сгодился.
Зачем вы рассказываете про Forth и его успехи, совершенно не ясно! Я где то сказал, что Mecrisp Forth on STM32 или другие серьёзные реализации не нужны ???
Успокойтесь, никто на ваш Forth не покушается, и вообще я всегда говорил, что на HP была и есть уникальная Forth образная система, которую бы надо соорудить на новой платформе тоже. Но Каллисто на МК-161 к Форту не причисляйте, оно там и умрёт на МК. Если что то будет сделано аля RPL, то явно на другой платформе и реализации Форта. Поэтому я и сказал, что Каллисто - это местное достижение, но в масштабах того вашего "Запада" оно не нужно никому (как и МК-1XX), если смотреть правде в глаза, и не кривить душой.

Каллисто и не делалась для Запада. Хотя она и способна повлиять на развитие Форта (примерно как colorForth на неё), основная ценность Каллисто для тех, кто увлекался советскими ПМК. Преемственность технологий.

Примерно из этих соображений выбрана и МК-161. Пока STM32 в стадии эксперимента, МК-161 выпускается. Пусть по недружелюбной цене, пусть с НОДовскими тараканами — но система уже доступна в наших Чебурнетах. Подоспеет STM32 в серийном исполнении, уже отлаженную Каллисто перенесём туда относительно легко. Может автор ЭКВМ 2.0 будет даже ближе по идеологии, ко мне или Арбинаде — сразу приятней работать будет. :-)

http://basic.mindteq.com/index.php?i=full
может пригодится

насколько я понял:

Числа:
Все числа являются знаковыми целыми в диапазоне -32767 до +32767.
Допускаются три формы записи чисел:
- десятичная;
- шестнадцатеричная, числа имеют префикс &H;
- двоичная, числа имеют префикс &B;

Тот, что сейчас в stm32, float

Смысла прикручивать что-то другое пока не вижу

---------------------------
Истина где-то рядом
www.litres.ru/vitaliy-samurov/dozvonitsya-do-devy/

Похоже, с Бейсиком и SD-картой не влезаю в stm32f103 (это просто подключена SD библиотека с файловой системой, функции чтения/записи еще не написаны):

Build options changed, rebuilding all
Archiving built core (caching) in: /tmp/arduino_cache_936452/core/core_stm32duino_STM32F1_genericSTM32F103C_device_variant_STM32F103C8,upload_method_STLinkMethod,cpu_speed_speed_72mhz,opt_osstd_0e82247e1de16792242aa34ad90b88f2.a
Sketch uses 65512 bytes (99%) of program storage space. Maximum is 65536 bytes.
Global variables use 13712 bytes (66%) of dynamic memory, leaving 6768 bytes for local variables. Maximum is 20480 bytes.

---------------------------
Истина где-то рядом
www.litres.ru/vitaliy-samurov/dozvonitsya-do-devy/

Может есть смысл заменить SD карту микросхемой SPI Flash, например 25-й серии есть кристаллы 4, 8 и 16 МБ?
Вот, статейка про микросхему из УЗВМК

в первую очередь для обмена файлами с компьютером.

Вообще, размер прошивки поражает (много чего тянется за собой в ардуинских библиотеках). Я думал, влезет в 64 КБ. Такие бы ресурсы (72 МГц, 64 КБ ПЗУ) да во времена "Спектрума"...

В общем, challenge accepted :) Либо переползу из Ардуины на чистый GCC и останусь на нынешней stm32 (20КБ ОЗУ, 64КБ флеш), либо переползу на cortexM3 помощнее (64KB ОЗУ 512KB флеш), платка рядом валяется без дела.

---------------------------
Истина где-то рядом
www.litres.ru/vitaliy-samurov/dozvonitsya-do-devy/

Чистота - залог здоровья. Голосую за переползание на чистый GCC, чтобы не тянуть за собой наследство.

Обязательно буду переползать на "чистый" GCC. Хотя бы ради памяти предков, которым 64 КБ ПЗУ показалось бы роскошью :)
Тут пример, как реализована ардуинская функция записи в GPIO digitalWrite(). Цитаты:

void digitalWrite(uint8_t pin, uint8_t val)
{
    uint8_t timer = digitalPinToTimer(pin);
    uint8_t bit = digitalPinToBitMask(pin);
    uint8_t port = digitalPinToPort(pin);
    volatile uint8_t *out;

    if (port == NOT_A_PIN) return;

    // If the pin that support PWM output, we need to turn it off
    // before doing a digital write.
    if (timer != NOT_ON_TIMER) turnOffPWM(timer);

    out = portOutputRegister(port);

    uint8_t oldSREG = SREG;
    cli();

    if (val == LOW) {
        *out &= ~bit;
    } else {
        *out |= bit;
    } 

    SREG = oldSREG;
}
The Arduino-generated file (Blink.cpp.hex) was 2,918 bytes. The Atmel Studio file (blink.hex) was only 508 bytes – nearly six times smaller

measured the digitalWrite() performance, and approximated it at 100 clock cycles – or more than 60 times slower that the direct port manipulation

Ардуино IDE и вся инфраструктура вокруг удобны, безусловно, но за удобства надо платить

---------------------------
Истина где-то рядом
www.litres.ru/vitaliy-samurov/dozvonitsya-do-devy/

Российская платка на миландрокортексе для выводов битов в порты использует штатную функцию GPIO_DigitalWrite(), которая выполняется за 0,5мкс (~40 команд), а внутри неё происходит проверка на обращение к несуществующим контактам, и в дальнейшем вызов функции GPIO_SET(), которая выполняется за 0,11 мкс (~9 команд) и выводит бит в порт. Чтобы не переделывать софт, можно повырезать из библиотек всё лишнее, например, из GPIO_DigitalWrite() вырезать всё, кроме вызова GPIO_SET().

Кстати, да, в NetBeans используется GCC с оптимизацией О2, который нагло режет пустые циклы.

Я именно так и собираюсь сделать - взять за основу ардуинские библиотеки, вытащить их в тот же каталалог проекта и вырезать все лишнее. Так я уже сделал с I2C LCD библиотекой, на очереди - GPIO, I2C и SPI.

---------------------------
Истина где-то рядом
www.litres.ru/vitaliy-samurov/dozvonitsya-do-devy/

На грани влезания прошивки в stm32f103 заработали команды SAVE "filename", LOAD "filename" (команда DIR еще в разработке):

1. Cохранить программу TEST1 в файл TEST1.BAS:

save1
2. Cохранить программу TEST2 в файл TEST2.BAS:

save2
3. Список файлов на SD-карточке:

.../4GB_SD$ ls -l
total 192
-rw-r--r-- 1 vitali vitali 142 huhti 28 22:04 readme.txt
-rw-r--r-- 1 vitali vitali  26 tammi  1  2000 TEST1.BAS
-rw-r--r-- 1 vitali vitali  26 tammi  1  2000 TEST2.BAS


4. Загрузить программу TEST1 из файла и запустить:

load1
5. Загрузить программу TEST2 из файла и запустить:

load2

---------------------------
Истина где-то рядом
www.litres.ru/vitaliy-samurov/dozvonitsya-do-devy/

Поздравляю! Отличная интеграция с компом.

Спасибо! Ну, при наличии SD-карточки со стандартной файловой системой интеграция с компом идет "из коробки" :)

Подумалось, что надо будет потом написать оффлайн-конвертер (хотя бы на Питоне) для декодирования файлов .BAS в читаемый текст, и обратно.

---------------------------
Истина где-то рядом
www.litres.ru/vitaliy-samurov/dozvonitsya-do-devy/

Во многих Бейсиках такой конвертор встроен в транслятор. Для получения текста, читаемого человеком, надо использовать команду SAVE "FILE",A

Да и неохота тратить драгоценную флеш-память прошивки на то, что можно сделать на компе

---------------------------
Истина где-то рядом
www.litres.ru/vitaliy-samurov/dozvonitsya-do-devy/

Дело в том, что нужный код в трансляторе уже есть. Это команда LIST с перенаправлением вывода в файл. Конечно, можно сделать такое перенаправрение на стороне десктопа.

Да, LIST команда есть, можно ее использовать для этих целей. Но Бейсик придется допилить немного, а сейчас это практически невозможно - места для прошивки осталось байт 100

---------------------------
Истина где-то рядом
www.litres.ru/vitaliy-samurov/dozvonitsya-do-devy/

Ведь на компе можно блокнот настроить на чтение *.BAS ну или написать какой-нибудь BAS2TXT.BAT, который будет выполнять команду REN *.BAS *.TXT :)

А второй скрипт будет конвертить .TXT в .BAS, если вдруг понадобится конвертировать листинг программы в файл на SD карточке

---------------------------
Истина где-то рядом
www.litres.ru/vitaliy-samurov/dozvonitsya-do-devy/

Это если Бейсик использует текстовый формат. Некоторые Бейсики просто скидывают на диск область памяти, где хранится программа. В этом случае ключевые слова, такие как PRINT, кодируются 1-2 байтами.

файл .BAS это просто "слепок" буфера памяти Бейсика. PC конвертор .BAS -> .TXT может парсить хидер-файл исходника Бейсика для того, чтобы всегда иметь последний список токенов.

---------------------------
Истина где-то рядом
www.litres.ru/vitaliy-samurov/dozvonitsya-do-devy/

В теории всё так. На практике там несколько подводных камней, вроде кодирования числовых и строковых констант. Если Бейсик компилируется под десктоп, может быть достаточно простого LOAD:LIST с переназначением вывода.

А это даже еще лучше вариант. PC хост у меня опробован в билде под Винду (под Линукс еще нет). Но это потом, второй или третий приоритет

---------------------------
Истина где-то рядом
www.litres.ru/vitaliy-samurov/dozvonitsya-do-devy/

обстоят перспективы :)

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

PC хост и тот только для того, чтобы сам Бейсик отлаживать было удобнее.

Но проект на Гитхабе, поэтому все, кто хочет поковырять - добро пожаловать.

---------------------------
Истина где-то рядом
www.litres.ru/vitaliy-samurov/dozvonitsya-do-devy/

Допилил клавиатурный тест Бейсик-железки на GCC. Разница в размерах прошивок между Arduino toolchain и GCC toolchain (на основе libopencm3 lowlevel Open-Source library for ARM cortex MCUs):

Arduino: 15528 байт

Sketch uses 15528 bytes (23%) of program storage space. Maximum is 65536 bytes.

GCC: 2092 байт

...Stm32Basic/kbd_test$ arm-none-eabi-size kbd_test.elf 
   text	   data	    bss	    dec	    hex	filename
   2076	     16	      0	   2092	    82c	kbd_test.elf

GCC прошивка меньше Ардуинской в 7.4 раза.

---------------------------
Истина где-то рядом
www.litres.ru/vitaliy-samurov/dozvonitsya-do-devy/

Поздравляю, я знал что ардуинокомпилятор плохо оптимизирует программу, но таких результатов я не ожидал! Думаю, ардуинокомпилятор сперва С++ портирует на Java, а его уже компилирует в машинный код.
Кстати, а как GCC по быстродействию по сравнении с ардуинокомпилятором? У меня выходило минимум в полтора раза, но я думаю тоже в разы быстрее работать будет.

Нет, в Ардуине не через java, там просто много чего подкдючено. Один Serial класс чего стоит.

Быстродействие интересно померять. Как только перенесу Бэйсик под GCC, прогоню 8 ферзей

---------------------------
Истина где-то рядом
www.litres.ru/vitaliy-samurov/dozvonitsya-do-devy/

Понемногу перепиливаю ардуинский I2C LCD драйвер на "чистый" С. Больше половины функционала уже работает (stm32 GCC toolchain).
Размер прошивки с драйвером дисплея пока радует (3024 байт):

&:~/GITprojects/Github/Stm32Basic/lcd_test$ arm-none-eabi-size lcd_test.elf 
   text	   data	    bss	    dec	    hex	filename
   3000	     12	     12	   3024	    bd0	lcd_test.elf

lcd driver

...
const char teststr[] = " Stm32Basic";
...
lcd_set_cursor(0, 0);
lcd_write_str("@0,0");
lcd_write_str(teststr);
lcd_set_cursor(1, 1);
lcd_write_str("@1,1");
lcd_write_str(teststr);   
lcd_set_cursor(2, 2);
lcd_write_str("@2,2");
lcd_write_str(teststr);     
lcd_set_cursor(3, 3);
lcd_write_str("@3,3");
lcd_write_str(teststr);

---------------------------
Истина где-то рядом
www.litres.ru/vitaliy-samurov/dozvonitsya-do-devy/

Бейсик переписался с "плюсов" на чистый Си. В процессе переписывания Бейсика допилил кроссплатформенный РС хост (проект под Code Blocks):
linwin

---------------------------
Истина где-то рядом
www.litres.ru/vitaliy-samurov/dozvonitsya-do-devy/

Это секунды или миллисекунды? Не думаешь допилить Бейсик, убрав номера срок и введя метки? :) Должно быть несложно, если транслятор толково написан.

Это секунды - сколько приложение проработало. Но это сам Code Blocks меряет.

Бейсик уже переписан из "плюсов" на чистый Си. На большее пока я не готов :) - и так надо допиливать - в "железяке" еще не работает.

И, опять же, ретро-фактор исчезнет, если убрать нумерацию :)

P.S. Хотя транслятор, в целом, написан неплохо. Вот причесанный "чистый Си" вариант (under construction). (Про фигурные скобки в однострочных условиях if(a < 0) a = 0; и циклах - мне нравится такой coding convention).

---------------------------
Истина где-то рядом
www.litres.ru/vitaliy-samurov/dozvonitsya-do-devy/

Spectrum-48 против пачки сигарет, каша из топора или что может STM32F103C8T6+video(update)
https://habr.com/post/412325/
Контроллер ускорен до 112 Мгц, Ресурс батарейки 50ч

P.S. Видео https://youtu.be/n4u6VNxCTdA

Давно уже время от времени всплывают обсуждения спектрума с ЖК экраном, оказывается сделали-таки! Можно спекбук собирать:) Идея видеопамять как своп на спектруме меня весьма удивила:) Миландровцы на опытах свои кортексы для счётчиков с 36МГц разгоняли до 90, так что ничего удивительного :) Интересно на нём Wolfenstein 2004 будет работать?

Гитхаб сделал бесплатные приватные репозитории.
Отлично! Буду переносить туда stm32BASIC из Гитлаба (пока еще не готов открывать в открытый доступ)

---------------------------
Истина где-то рядом
www.litres.ru/vitaliy-samurov/dozvonitsya-do-devy/

Доперли, наконец-то, на сурсфордже это изначально было. Покупка Микрософта на них позитивно влияет.

Хотя сейчас на них скорее, Gitlab давил - у него чуть ли не более удобный функционал и 5 человек в команде приватного бесплатного репозитория.

---------------------------
Истина где-то рядом
www.litres.ru/vitaliy-samurov/dozvonitsya-do-devy/

Заработала PS2 клавиатура.

---------------------------
Истина где-то рядом
www.litres.ru/vitaliy-samurov/dozvonitsya-do-devy/

Приехали ч/б 20х4 дисплеи с отражением. Это без подсветки, с настольной лампой:
BW, no backlight

---------------------------
Истина где-то рядом
www.litres.ru/vitaliy-samurov/dozvonitsya-do-devy/

А с этими ЖК индикаторами нет задержек в отображении символов? Смотрятся явно лучше старых синих :)

Не, тут все очень адекватно. И да, мне сильно больше такой экран нравится, по сравнению с синим

---------------------------
Истина где-то рядом
www.litres.ru/vitaliy-samurov/dozvonitsya-do-devy/

Шрифты намного лучше читаются. Хотя после МК-161 такие широкие точки и буква «i» выглядят очень необычно.

Конечно, моноширинные экраны программировать привычней. Мне пришлось многому переучиваться, делая Каллисто для пропорциональной командной строки. Но результат того стоит. Физический размер экрана ПМК крайне мал. Трюк с разной шириной символов позволяет втиснуть больше информации, причём с улучшением читаемости. Здесь я на стороне Новосибирска, хотя в 2007 принятое ими решение было не таким очевидным.

Если удастся закончить stm32f1BASIC. то я планирую перебраться с Бэйсиком на 320x240 графический экран, скорее всего на более мощный STM32F103RET6.

---------------------------
Истина где-то рядом
www.litres.ru/vitaliy-samurov/dozvonitsya-do-devy/

Только высота индикатора в два раза меньше и шрифт моноширинный. Ну и импорт, конечно.

Увы, не графический. А насчет импорта - вот у МЭЛТА почти один в один, это кто производит, "Ангстрем"? В нем прошит русский знакогенератор - это, конечно, плюс

Так и МК161 "идеологически не очень чистая", если про импорт :)

---------------------------
Истина где-то рядом
www.litres.ru/vitaliy-samurov/dozvonitsya-do-devy/

МК-161 — наиболее чистый русский ПМК, из современных. Отсутствие в «Электронике» более мощных финтифлюшек вполне объяснимо отсутствием русских аналогов. Сделать МК-161 ещё более чистокровным — от цен ещё сильней взвоем.

Альтернативы на Ардуино и других иностранных платках — значительно менее отечественные и вдохновляют меньше. Преимущества таких самоделок перед HP Prime обьяснить сложнее. Отечественностью пожертвовали, и всё равно рыночных высот не достигли.

Ну, если взять что-то вроде К1986ВЕ92QI и вышеупомянутый МЭЛТ дисплей, то stm32f1BASIC будет 100% отечественным. Или наличие "нерусского" ARM-GCC подточит чистоту? :)

---------------------------
Истина где-то рядом
www.litres.ru/vitaliy-samurov/dozvonitsya-do-devy/

Мне импортные системы команд не по нраву. Форт-процессор был бы круче.

Но музыку заказывает тот, кто платит. Если отечественные разрабочики решат использовать К1986ВЕ92QI, как им запретишь? Чтобы выпустить не маниловские замки, а готовый продукт, часто приходится идти на компромиссы.

Да, КБ145ВГ6 Ангстрем делает. А вот мэлтовские символьные ЖКИ с управлением по SPI уже с импортными кристаллами идут.

Заработали SAVE и LOAD на SD-карточку.

---------------------------
Истина где-то рядом
www.litres.ru/vitaliy-samurov/dozvonitsya-do-devy/

---------------------------
Истина где-то рядом
www.litres.ru/vitaliy-samurov/dozvonitsya-do-devy/

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

Добавил ОК в работу с SD картой.

Еще порядка 7900 байт во флеш-памяти остается для улучшалок:

verified 57560 bytes in 0.862142s (65.199 KiB/s)
** Verified OK **
** Resetting Target **

---------------------------
Истина где-то рядом
www.litres.ru/vitaliy-samurov/dozvonitsya-do-devy/

А что с русским языком? Знакогенератор, клавиатура… советую сделать кодировку, как в МК-161 (cp866). Может потом помочь с переносом Каллисто. Ну или Бейсика на МК-161, если прошивку вскроем.

Этот экран, что у меня, без русских символов в прошивке. Поэтому никак. МЭЛТ-овский экран покупать - дороговато и неудобно логистически.

Почему именно cp866, а не win1251?

---------------------------
Истина где-то рядом
www.litres.ru/vitaliy-samurov/dozvonitsya-do-devy/

Для совместимости с ЭКВМ. Почему в Новосибирске выбрали кодировку ДОС — могу только догадываться.

В своё время cp866 была распространена. Под неё больше текстов было набрано, чем под MSX и КОИ-8. Винда, конечно, добавила неразберихи. Но если двигаться дальше, имхо надо UTF-8 или сразу 16-битный Юникод. Даже для проекта российского (не советского) ПМК потребуется несколько национальных алфавитов, помимо русского. Не говоря даже о научных обозначениях.

Как-то раз ЗонаТеХе нашёл схему калькулятора, вот ссылка на скачанный в прошлом году файл. Это версия схемы с микроконтроллером в панельке.

Спасибо. То, что нужно. Теперь нужны специалисты по 8051 — какие сигналы генерируются контроллером автоматически, а какие надо дёргать вручную через P2 и др. Ещё нужны схемы клавиатуры и индикатора.

Аппаратный интерфейс к внешней памяти
ALE - для защёлкивания младших линий данных/адреса
P3.6 (WR) - запись данных
P3.7 (RD) - чтение данных

P2.7 (CS) - старшую линию адреса A15 применили для селектора разных микросхем.
OE - принудительно подтянули к 5В (т.к. используют A15)

Шины данных/адреса согласно выводам из описания на микросхему (при беглом взгляде)
P4.0 ... P4.3 управляются вручную или смотреть их спецификацию в описании.
RST - штатная линия прерывания
RX, TX - уточнить по пинам контроллера, но должны совпасть
Другие линии портов P1.1 ..P1.7 P3.0 ..P3.5 - общего назначения

P.S. Остальная логика работы с внешними микросхемами, согласно их описанию.
Примерно так, Есть контроллеры AVR с таким интерфейсом к памяти как у 51-го Atmega162 ... Atmega128 ...
но можно через переходник подключить любой на выбор (например STM32 с 5-ти вольтовыми пинами)
51-й этот вроде пятивольтовый.А прошивка с него не считывается программатором? (хотя смысла наверное нет в ней)
С таким количеством микросхем и ключей (да и сам контроллер не экономичный) + Индикатор ... интересно какой ток потребления при штатном напряжении питания?

Возможно контроллер nuvoton W78E516d как аналог применим вместо штатного. Стоят мало, поддержаны компиляторами и имеют режим самопрограммирования. Документацию на них (nuvoton 51-e вроде даже кто то переводит).

Очдавно этим занимался. Вот основные наработки:
https://vk.com/topic-10838600_33160857
https://pmk.arbinada.com/ru/node/1245
https://pmk.arbinada.com/ru/node/1247

Сейчас я занимаюсь оптимизацией Каллисто на СПФ, поверх языка МК. Но мне очень интересен вопрос встраивания Каллисто в прошивку. Есть МК-161 для опытов, пара W77LE516P и программатор. Не лень загружать двоичные образы и пробовать их на «железке». Главное — получить точки на MT–12864J и научиться опрашивать клавиатуру ЭКВМ. Впрочем, для начала можно оживить машинку через COM-порт, управляя самодельной прошивкой с соседней МК-161 вот этим терминалом:
https://pmk.arbinada.com/ru/node/1331

«А прошивка с него не считывается программатором?» — Нет. В W77LE516P есть бит защиты. Видимо, с его помощью считывание заводской прошивки запрещено. Результат, afair, FF FF …

Имхо, мои попытки были весьма наивными. Возможно, я вручную дёргал те сигналы, которые микроконтроллер выдаёт самостоятельно, выполняя команды обращения к внешней памяти. В любом случае успех был достигнут только в прошивке W77LE516P. Написать код, работающий внутри МК-161, пока не удалось.

и переходник PLCC-> DIP40 в местном магазине, теперь разобраться как их заливать через встроенный загрузчик и требуемую обвязку
и можно создавать какую то прошивку для Каллисто :)
Может быть развести схему подобную МК-161 (152)

P.S. На Github много кода при поиске по 8051, Эту архитектуру, похоже, до сих пор изучают в учебных курсах.
Как я понял МТ12864J сделан на совместимом контроллере дисплея KS0108 (2-a контроллерa для 128x64) Библиотечка для данного контроллера http://en.radzio.dxp.pl/ks0108/ (может ещё надо учесть временные параметры при пересылке данных дисплею согласно документации произволителя МЭЛТ)
Ещё какая то статья по часам с дисплеем от МЭЛТ https://xakep.ru/2014/09/10/hardware-clock/

Загрузчик — важная тема.

  1. В новых микроконтроллерах загрузчика может не быть, afaik. Его туда надо прошить, пример загрузчика есть в даташитах.
  2. Если получится написать свой загрузчик в обвязке МК-161 (она не во всём совпадает с обвязкой МК-152), к работе могут подключиться другие владельцы ЭКВМ. Один раз программатор найти, чтобы прописать в чип загрузчик, просто и дёшево — а дальше можно экспериментировать без программатора. В Москве я могу помочь, с этой первой прошивкой.
  3. На AliExpress.com можно было найти родные W77LE516P, они могут в чём-то отличаться от W78E516D-PG, придётся меньше править код.
  4. Код Каллисто можно будет начать переводить на 8051 сразу, как заработает клавиатура и индикатор. Можно даже побегать чуть впереди паровоза, как заработает терминал через COM. Опять же, я смогу проверять гипотезы о работе и подключению периферии на родном новосибирском железе.
  5. Документация на индикатор здесь, там же можно заказать себе оригинал (1200 руб. за 1-40 шт.): http://www.melt.com.ru/docs/MT-12864J.pdf
  6. Даже если мы сделаем отечественное железо, альтернативное МК-161 и по гуманной цене (не обязательно клон), наладить его производство в России — отдельное приключение. Похожее на разработку «плавучки» для 8051. ^_^ Впрочем, к моменту создания макета ситуация может поменяться в лучшую сторону. :-)

Если делать альтернативное МК161 железо, то стоит ли оставаться на 8051?

---------------------------
Истина где-то рядом
www.litres.ru/vitaliy-samurov/dozvonitsya-do-devy/

Первая задача — отладить Каллисто внутри МК-161. Макет должен по возможности эмулировать новосибирскую схему.

Если доводить свой ПМК до производства, мы не ограничены 8051. Мне бы хотелось полностью отечественный процессор. Пишут, что во время бума FPGA была волна разработки процессоров с отечественной системой команд. Но мне не удалось выяснить, что с той эпохи осталось в камне — так, чтобы потребление было скромным.

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

//Пример программы для вывода картинки на индикатор MT-12864

void main(void) {
byte	p;//Номер текущей страницы индикатора
byte	c;//Позиция по горизонтали выводимого байта

	LCDinit();
	for(p=0; p<8; p++) {//Цикл по всем 8-ми страницам индикатора
		WriteCodeL(p|0xB8);//Установка текущей страницы для левого кристалла индикатора
		WriteCodeL(0x40);//Установка текущего адреса для записи данных в 0 для левого кристалла индикатора
		for(c=0; c<64; c++) {//Цикл вывода данных в левую половину индикатора
			WriteDataL(Logo128[p][c]);//Вывод очередного байта в индикатор
		}
		WriteCodeR(p|0xB8);//Установка текущей страницы для правого кристалла индикатора
		WriteCodeR(0x40);//Установка текущего адреса для записи данных в 0 для правого кристалла индикатора
		for(c=64; c<128; c++) {//Цикл вывода данных в правую половину индикатора
			WriteDataR(Logo128[p][c]);//Вывод очередного байта в индикатор
		}
	}
}

//Процедура программной инициализации индикатора
void LCDinit(void) {
	LCD.E=0;//Начальное значение сигнала индикатору
	LCD.RES=0;//Выдать сигнал RES=0 индикатору
	Delay(>1us);//Задержка на время больше 1 мкс
	LCD.RES=1;//Снять сигнал RES
	Delay(>10us);//Задержка на время больше 10 мкс
	WriteCodeL(0xC0);//Верхнюю строку на 0
	WriteCodeR(0xC0);//Верхнюю строку на 0
	WriteCodeL(0x3F);//Display on
	WriteCodeR(0x3F);//Display on
}

void Pset(byte x, byte y, bit c) {//Записать одну точку в индикатор (координата 0,0 в левом верхнем углу индикатора)
byte c8;//Временное хранение считаного из индикатора байта
byte m8;//Маска нужного бита в байте
	if ((x>127)||(y>63)) return;//Выход за пределы индикатора
	if (x<64) {//Выводить в левую половину индикатора
		WriteCodeL(0xB8|(y>>3));//Установить нужную страницу индикатора
		WriteCodeL(0x40|x);//Установить адрес нужного байта
		c8=ReadDataL();//Фиктивное чтение
		c8=ReadDataL();//Чтение нужного байта из индикатора
		m8=1<<(y&0x07);//Вычислить маску нужного бита в байте
		if (c==1)	//Зажигать точку?
			c8|=m8//Установить нужный бит в байте
		else		//Или гасить точку?
			c8&=~m8;//Сбросить нужный бит в байте
		WriteCodeL(0x40|x);//Снова установить адрес нужного байта
		WriteDataL(c8);//Записать изменённый байт обратно в индикатор
	} else {//Выводить в правую половину индикатора
		WriteCodeR(0xB8|(y>>3));//Установить нужную страницу индикатора
		WriteCodeR(0x40|(x-64));//Установить адрес нужного байта
		c8=ReadDataR();//Фиктивное чтение
		c8=ReadDataR();//Чтение нужного байта из индикатора
		m8=1<<(y&0x07);//Вычислить маску нужного бита в байте
		if (c==1)	//Зажигать точку?
			c8|=m8//Установить нужный бит в байте
		else		//Или гасить точку?
			c8&=~m8;//Сбросить нужный бит в байте
		WriteCodeR(0x40|(x-64));//Снова установить адрес нужного байта
		WriteDataR(c8);//Записать изменённый байт обратно в индикатор
	}
}

void WriteCodeL(byte b) { WriteByte(b,0,1,0); }//Команду в левый кристалл индикатора
void WriteCodeR(byte b) { WriteByte(b,0,0,1); }//Команду в правый кристалл индикатора

void WriteDataL(byte b) { WriteByte(b,1,1,0); }//Данные в левую половину индикатора
void WriteDataR(byte b) { WriteByte(b,1,0,1); }//Данные в правую половину индикатора

byte ReadDataL(void) { return ReadByte(1,1,0); }//Прочитать байт данных из левой половины индикатора
byte ReadDataR(void) { return ReadByte(1,0,1); }//Прочитать байт данных из правой половины индикатора

//Процедура выдачи байта в индикатор
void WriteByte(byte b, bit cd, bit l, bit r) {
	if ((l==1)&&(r==1)) return;	//Читать (для опроса готовности) одновременно из обоих кристаллов недопустимо!
	WaitReady(l,r);		//Ждать готовности индикатора
//При необходимости настроить здесь шину данных на вывод
	LCD.RW=0; LCD.A0=cd;	//Выдача байта в индикатор как данных или команды
	LCD.E1=l; LCD.E2=r;	//Выбрать нужные нужные кристаллы в индикаторе
	LCD.D=b;		//Выдать байт на шину данных индикатора
	Delay(>140ns);		//Это время предустановки адреса (tAW)
	LCD.E=1;		//Сформировать строб записи в индикатор E=1
	Delay(>450ns);		//Длительность сигнала E=1 (время предустановки данных попало сюда (tDS))
	LCD.E=0;		//Сбросить сигнал E
	Delay(>(1000ns-140ns-450ns));	//Минимально допустимый интервал между сигналами E=1
}

byte ReadByte(bit cd, bit l, bit r) {
byte b;
	if ((l==1)&&(r==1)) return 0;	//Читать одновременно из обоих кристаллов недопустимо!
	WaitReady(l,r);		//Ждать готовности индикатора
	LCD.RW=1; LCD.A0=cd;	//Будем читать байт как команду или данные
	LCD.E1=l; LCD.E2=r;	//Выбрать нужные нужные кристаллы в индикаторе
	Delay(>140ns);		//Это время предустановки адреса (tAW)
	LCD.E=1; 		//Выдать строб в индикатор
	Delay(>450ns);		//Минимально допустимая длительность сигнала E=1 (время доступа (tDDR) попало сюда)
	b=LCD.D;		//Прочитать данные с шины индикатора (они на ней уже минимум 130нс)
	LCD.E=0;		//Сбросить сигнал E
	Delay(>(1000ns-140ns-450ns));	//Минимально допустимый интервал между сигналами E=1
	return b;		//Вернуть прочитанный байт
}

void WaitReady(bit l, bit r) {//Ждать готовности индикатора, опрашивая байт статуса
//При необходимости настроить здесь шину данных на ввод
	LCD.RW=1; LCD.A0=0;	//Чтение флага занятости
	LCD.E1=l; LCD.E2=r;	//Выбрать нужные нужные кристаллы в индикаторе
	Delay(>140ns);		//Это время предустановки адреса (tAW)
	LCD.E=1; Delay(>450ns);	//Минимальная длительность сигнала E=1 (информация на шину данных индикатором будет выдана раньше, не более чем через 320нс)
	while(LCD.D.7==1);	//Ждать сброса флага занятости
	LCD.E=0;		//Сбросить сигнал E
	Delay(>(1000ns-140ns-450ns));	//Минимально допустимый интервал между сигналами E=1
}

//Данные изображения, побитые по строкам и байты будут на индикаторе вертикально.
//Это просто последовательность байт для записи в индикатор начиная с верхней страницы.
//Полностью соответствуют картинке распределения ОЗУ в документации на модуль.
const byte Logo128[8][128]=//128x64 pixel, каждые 8 вертикальных точек собраны в байт
{
	{	0xFF,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
		0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
		0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
		0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
		0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
		0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
		0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
		0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0xFF
	},
	{	0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xC0,0xE0,0xC0,0xE0,0xF0,0xF0,0xF0,
		0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0xE0,0xE0,0xE0,0xC0,0x80,0x00,
		0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,
		0x00,0x80,0x80,0x00,0x00,0x80,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x80,0x00,0x00,
		0x80,0x00,0x00,0x80,0x00,0x80,0x00,0x80,0x80,0x80,0x00,0x80,0x80,0x00,0x00,0x80,
		0x00,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,
		0x00,0x00,0x80,0x00,0x80,0x00,0x00,0x80,0x80,0x80,0x00,0x80,0x00,0x00,0x80,0x00,
		0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x3F
	},
	{	0x1F,0xC0,0xE0,0xE0,0xFC,0xFE,0xF3,0xE3,0xE3,0xE3,0xE3,0xAF,0x6F,0xFF,0xFF,0xFF,
		0xBF,0xBF,0xFF,0xFF,0x7F,0x7F,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
		0xFF,0xF6,0xF4,0x1F,0x21,0xE2,0x61,0x6F,0x60,0x6F,0x64,0x6F,0x60,0x6F,0x65,0x68,
		0x60,0x6F,0x62,0x61,0x67,0x68,0x67,0x60,0x6A,0x67,0x60,0x6E,0x61,0x6F,0x60,0x67,
		0x6A,0x6B,0x60,0x6F,0x65,0x68,0x60,0x60,0x6F,0x60,0x60,0x6F,0x62,0x61,0x67,0x68,
		0x67,0x60,0x6F,0x62,0x6F,0x60,0x6F,0x64,0x6F,0x60,0x6F,0x65,0x68,0x64,0x6A,0x6F,
		0x60,0x60,0x6F,0x64,0x6F,0x60,0x60,0x60,0x6F,0x60,0x67,0x6A,0x6B,0x60,0x6D,0x62,
		0x6D,0x60,0x6F,0x62,0x6F,0x60,0x6F,0x64,0x6F,0x60,0x6F,0x65,0x68,0x64,0x6A,0x6F
	},
	{	0xFE,0x3F,0x3F,0x3F,0xBF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xF9,0x77,0x37,
		0x03,0x03,0x01,0x00,0x00,0x00,0x00,0x01,0x07,0x0F,0x13,0x01,0x00,0x00,0x01,0x07,
		0xD7,0x0E,0x08,0xC0,0x00,0x10,0x0F,0xF8,0x00,0x00,0x80,0xE0,0xF8,0xFE,0xFF,0xFF,
		0xFF,0xFE,0x00,0x00,0x00,0x00,0x00,0xC0,0xF0,0xFE,0xFF,0xFF,0xFF,0xFE,0x00,0x00,
		0x00,0xE0,0xF0,0xF8,0xFC,0x7C,0x3E,0x1E,0x1F,0x0F,0x0F,0x0F,0x0F,0x1F,0x1E,0x1E,
		0x3E,0x7C,0xFC,0xF8,0xF0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
		0x80,0xC0,0xF0,0xFC,0xFE,0xFF,0xFF,0xFE,0x00,0x00,0x06,0x0F,0x0F,0x0F,0x0F,0x0F,
		0x0F,0x0F,0xFF,0xFF,0xFF,0xFF,0xFF,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x06,0xF0
	},
	{	0x3F,0xE0,0x00,0x00,0x01,0x3F,0xFF,0xFF,0xFF,0xFF,0xFF,0x3F,0x3F,0x00,0x00,0xE0,
		0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
		0x00,0x01,0x01,0xC1,0xE0,0xE0,0xF9,0xFF,0xFC,0xFF,0xFF,0x7F,0x1F,0xFF,0xFF,0xFF,
		0xFF,0xFF,0x80,0xE0,0xF8,0xFE,0xFF,0xFF,0x3F,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,
		0x00,0x00,0x01,0x01,0x00,0x00,0x00,0x30,0x78,0x78,0xFC,0xFC,0xFC,0xFC,0x78,0x78,
		0x30,0x00,0x01,0x07,0xFF,0xFF,0xFF,0xFC,0x00,0x00,0x00,0x00,0x80,0xE0,0xF8,0xFE,
		0xFF,0xFF,0x3F,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
		0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF
	},
	{	0xFC,0x01,0x03,0x04,0x18,0x20,0x40,0x81,0x87,0x07,0x07,0x00,0x00,0x00,0x00,0x00,
		0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,
		0x80,0xE4,0xE7,0xFB,0xFF,0xFF,0x7F,0x3F,0x0F,0x03,0x01,0x00,0x00,0xFF,0xFF,0xFF,
		0xFF,0xFF,0xFF,0x7F,0x1F,0x07,0x03,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,
		0x00,0x70,0xF8,0xF8,0xF0,0xE0,0xE0,0xC0,0xC0,0x80,0x80,0x80,0x80,0xC0,0xC0,0xC0,
		0xE0,0xF0,0xFC,0xFF,0x7F,0x3F,0x0F,0x81,0xE0,0xF8,0xFC,0xFF,0xFF,0x3F,0x1F,0x07,
		0x01,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
		0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF
	},
	{	0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02,0x02,0x04,0x04,0x04,0x0C,
		0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x04,0x04,0x04,0x02,0x03,0x01,0x00,
		0x00,0x03,0x07,0x07,0x03,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x07,0x07,
		0x07,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x07,0x07,0x07,0x03,0x00,0x00,
		0x00,0x00,0x00,0x01,0x01,0x03,0x03,0x03,0x07,0x07,0x07,0x07,0x07,0x07,0x03,0x03,
		0x03,0x01,0x01,0x00,0x00,0x00,0x00,0x03,0x07,0x07,0x07,0x03,0x00,0x00,0x00,0x00,
		0x00,0x00,0x00,0x03,0x07,0x07,0x07,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
		0x00,0x00,0x03,0x07,0x07,0x07,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF
	},
	{	0xFF,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
		0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
		0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
		0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
		0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
		0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
		0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
		0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xFF
	}
};

по ссылкам выше схема подключения дисплея в МК-151
и указано, что в МК-161 есть отличия (какие?)

P.S. Теоретически сначала можно код и в симуляторе, типа протеус проверить для 8051 и индикатора т.к. пока у меня нет интереса в этом индикаторе. :) (а собранный бинарный файл на чьём то железе)
Интересно, что для 8051 есть и Паскаль http://turbo51.com/

Вот здесь была похожая схема с кодом, работающим на эмуляторе:
https://pmk.arbinada.com/ru/comment/8418#comment-8418

Но она не была доведена до бинарника, который я мог бы проверить в МК-161. Также схема подключения была взята из МК-152 и говорят, что в МК-161 она немножко другая. Можно запланировать встречу в Скайпе. К ней я могу подготовить сохранённые схемы МК-161 (схему платы индикатора пока не нашёл), мультитестер и другие инструменты. Или просто передать мне кучу бинарников, которые я буду загружать в W77 и проверять их работу на железе.

Один из вариантов для бинарников — попробовать оживить RS-232. Там вариантов подключения меньше. Потом загрузить в камень интерактивную программу на основе кода МЭЛТ, передавая ей по терминалу разные варианты подключения индикатора. Если сразу не нащупаем, можно найти нужный вариант автоматическим перебором под видеокамерой.

Но т.к МК-ххх у меня нет и не планировал покупать - то естественно далее приведенного кода смысла дергаться не было.
Меня не покидает иногда "дурная"мысль - все таки развести плату с кнопками, STM32, SDCard, выведеными наружу интерфесами RS232/485 и несколькими IO и вот таким индикатором c сенсорной панелью: https://www.buydisplay.com/default/2-8-inch-128x64-graphic-module-serial...
Пусть пока просто плату. По отдельности у меня есть наработки на все это. Код симулятора МК-61 тоже Сергей Вакуленко написал. Расширение для МК-161 у меня работает в контроллерах.
Время - ну можно выкроить.