Lavr wrote: 10 Jan 2023 12:47
Lavr wrote:А процессор-то у него - 8-bit National Semiconductor SC/MP!
Собственно... меня заинтересовал Tiny BASIC этого весьма несуразного CPU...
Хотелось посмотреть в большой программе, как они обходят несуразности процессора
SC/MP при пересечении границ сегмента.
Ибо кроме этого несуразностей у процессора
SC/MP ой как много!
SC/MP absurditiesNational Semiconductor SC/MP wrote:National Semiconductor SC/MP
https://en.wikipedia.org/wiki/National_Semiconductor_SC/MP
Для снижения стоимости система использовала последовательное однобитное арифметико-логическое устройство (АЛУ) и, таким образом, была значительно медленнее современных ей разработок, таких как Intel 8080 или MOS 6502, которые имели параллельные АЛУ. Еще одной странностью было то, что счетчик программ мог получить доступ только к нижним 12 битам 16-битного адреса, а верхние 4 бита приходилось устанавливать с помощью специальных инструкций. Результатом было то, что инструкции обращались к основной памяти как к шестнадцати 4-килобайтным «страницам», и для достижения памяти за пределами этих страниц требовалось несколько инструкций.[a]
Как и большинство 8-битных микропроцессоров той эпохи, SC/MP микропроцессор основан на 16-битной адресной и 8-битной шине данных. Чтобы уменьшить количество контактов, внешняя адресная шина содержит только 12 контактов, разделяя 4 контакта с шиной данных для создания полного 16-битного адреса.[2] Внутри программный счетчик имеет ширину в двенадцать бит, и есть отдельные инструкции для установки старших четырех бит путем копирования 8-битного значения в старший байт. Это обеспечивает карту памяти из шестнадцати 4-килобайтных страниц, и программный код не может ссылаться на код или непосредственные или адресуемые относительно PC данные за пределами своей собственной страницы.[6] Таким образом, память организована как 16 страниц по 4 Кб каждая. Это приводит к любопытному эффекту конструкции: когда программный счетчик достигает конца страницы, он не переходит на следующую страницу, а возвращается в начало текущей страницы.[2]
Это было еще больше ограничено двухбайтовым форматом инструкции, который использовал один байт для кода операции и второй для указания смещения между 128 и +127, которое добавлялось к значению в регистрах процессора для получения полного 16-битного адреса. Например, адрес может ссылаться на местоположение в памяти, говоря, что это +10 позиций от значения в счетчике программ или +10 от значения в одном из 16-битных индексных регистров. Чтобы получить доступ к местоположению за пределами этого диапазона, адрес должен был быть сохранен в одном из индексных регистров, а затем смещение должно было быть установлено равным нулю.[6] Поскольку регистры 16-битные, а аккумулятор, загружающий значения, является 8-битным, для установки полного адреса требовалось несколько инструкций.[7]
Поскольку индексы были критически важны для модели адресации, SC/MP включал четыре индексных регистра, «регистры указателей» от PR0 до PR3. PR0 был счетчиком программ PC и обычно не доступен для манипуляции пользовательскими программами. По соглашению, PR1 обычно использовался как указатель на ПЗУ, PR2 на ОЗУ, а PR3 использовался для хранения адреса во время прерываний и вызовов подпрограмм.[5] SC/MP не имел стека, где возвращаемые значения обычно хранились в большинстве современных конструкций. Программы должны были сохранять адреса возврата с помощью явного кода.[7]
Система включает автоматическую обработку прерываний на линии Sense A. Когда получено прерывание и IE имеет высокий уровень (включен), перед началом выборки следующей инструкции система очищает IE, чтобы предотвратить другое прерывание, а затем обменивает значения в PC и PS3. Это приводит к сохранению адреса возврата в PR3 и отправке следующей инструкции в точку входа обработчика прерываний, ранее сохраненную в PR3.[8]
Система не включает привычный эквивалент возврата из прерывания. Это можно сделать с помощью операции XPPC, скопировав ранее сохраненный адрес в PR3 обратно в PC, и выполнение продолжится с того места, где оно было остановлено. Однако это оставляет неправильный адрес в PR3, не начало обработчика прерываний, а конец. Чтобы разрешить эту проблему, распространенным решением является размещение инструкции XPPC, которая возвращает управление в основной код, на одну инструкцию выше точки входа обработчика, а не в конце. Когда обработчик завершается, он возвращается к этой инструкции, поэтому при вызове XPPC PC указывается на одну позицию перед правильной точкой входа. Поскольку система увеличивает PC перед вызовом инструкции, это означает, что следующее прерывание приведет к его входу в правильную точку входа. Этот «обработчик выхода» обычно также сбрасывает IE в 1, чтобы снова включить прерывания.[9]
Но интересно, что если хоть раз конструировал собственный процессор, становится понятно, какие проблемы решали разработчики на пути упрощения конструкции, и каким образом это на странностях процессора отразилось…
Может быть, я бы ещё долго не собрался разобраться с этим древним процессором подробнее, но попался мне на глаза весьма интересный проект эмуляции этого раритетного
МК-14 на платформе микроконтроллеров
PIC16 от некоей широко известной в определённых кругах
Karen Orton.
PIC14_circuit.PNG
https://techlib.com/area_50/Readers/Karen/micro.htm#PIC14
И я решил, почему бы не совместить полезное с приятным: разобраться подробно с устройством весьма несуразного процессора
SC/MP и попрограммировать на его довольно нетривиальном языке ассемблера с помощью модели
МК-14?
В итоге у меня получилось вот что:
MK-14_PIC14.png
После запуска проект ждёт ввода программы по последовательному интерфейсу в формате
IntelHEX (это, собственно, текстовый файл, открываемый любым текстовым редактором).
В эмулятор терминала программа переносится через
copy-paste.
Если загрузка закончилась успешно, выводится
0000__00 на индикатор.
Следует ввести с клавиатуры адрес запуска: обычно
[0][F][2][0] и
[-GO-].
Если загрузка не нужна, нажимаем
[RESET], также выводится
0000__00 на индикатор.
Для работы с моделью
МК-14 неплохо бы скачать
MK14 Manual (later version).pdf – много где находится поисковиками.
Самое нужное я перевёл в файле:
PIC14 keyboard.doc
В двух словах: ОЗУ начинается с адреса
0F00H, его немного, около 256 Байт.
Программы обычно начинают с адреса
0F20H. Нажимаем
[0][F][2][0]. Видим содержимое ячейки памяти.
Нажатие
[TERM] позволяет редактировать байт по этому адресу.
Нажатие
[MEM] – сдвигает к следующему адресу.
Нажатие
[ABORT] – позволяет выйти из редакции и ввести новый адрес.
[RESET] прерывает программу, выводит
0000__00 на индикатор, содержимое ОЗУ не портит.
RES_PIC вызывает начальную загрузку с терминала.
В общем, в архиве ниже – играть подано!
PIC_MK14.zip
Игрушка, правда, там одна:
Duck Shoot, но как в неё играть, я не понял…

Я в ассемблеры наигрался.
P.S. Когда я уже почти всё закончил, попалась интересная ссылка:
Science of Cambridge MK14 simulator
Кто не уважает Proteus, по ссылке – онлайн simulator!
Ресурс добротный, интересного много там! 
You do not have the required permissions to view the files attached to this post.