
Посмотрите это короткое видео:
SpeciARMlist - bare metal эмулятор ПК Специалист
Это зачаток моего эмулятора ПК Специалист для Raspberry Pi. Слева вы видите содержимое регистров виртуального процессора Intel 8080 и по несколько байт адресуемой ими памяти, а справа, собственно, экран эмулируемого Специалиста. Эмулятор пишется ровно с тем же подходом, который я использую при написании программ для Спектрума: чистый ассемблер (для процессоров архитектуры ARM) и прямое программирование экранной области. В своей работе эмулятор не использует никакой операционной системы или сторонних библиотек. Это значит, что я сам рисую на экране все символы по пикселям, делаю все необходимые вычисления и расчёты, и т.д. Ещё раз повторюсь – всё точно так же, как если бы я писал это на Спектруме. С той существенной разницей, что в моём распоряжении несопоставимо больше ресурсов по сравнению с любой моделью Спектрума. Интересно? Тогда я начну свой рассказ с самого начала.
За годы, проведённые за Специалистом и Спектрумом, я привык к ассемблеру и к тому, что я контролирую абсолютно всё, и чётко знаю на что будет потрачен каждый байт памяти и каждый такт процессора. Именно поэтому, когда я обзавёлся вначале Амигой, а потом и PC, у меня не возникло интереса программировать под эти платформы, так как там я терял полный контроль и понимание всех процессов. А программировать на условном Бейсике мне было уже не интересно. Я думаю, что этот факт и стал основополагающим почему я в итоге так и не бросил Спектрум. Шло время, интереса программировать на языках высокого уровня под операционные системы у меня так и не возникло, Спектрум был изучен вдоль и поперёк, а нового интереса у меня так и не появлялось. Безусловно, программировать на ассемблере можно на любой платформе, но вопрос с толстой многослойной прокладкой в виде операционной системы между программистом и железом никак не решался. Ну, либо я не видел такого решения…
В течение этого времени я постоянно искал что-то такое, что было бы сопоставимо с интересом программирования под Спектрум, но при этом было бы актуально и не являлось анахронизмом. И вот на горизонте замаячили КПК – карманные ПК, или, как их называют за рубежом, PDA (Personal Digital Assitent). Мне показалось, что это именно то, что я так долго искал и ждал!
Первые массовые КПК выпускались корпорацией Palm, Inc. и работали под управлением одноимённой операционной системы - Palm OS.

КПК Palm m100
Младшая, и самая доступная по цене, модель Palm m100 обладала монохромным экраном разрешение 160x160 пикселей с 16-тью градациями серого. Памяти у устройства было целых 2 мегабайта. Причём что интересно, у Палмов не было разделения на внешнее хранилище и ОЗУ – программа где хранилась, там же она и работала, то есть, по сути, вся пользовательская память являлась ОЗУ. Что касается CPU, то там использовался 32-битный процессор, совместимый с Motorola MC68000, с частотой 16 МГц. Когда-то процессоры данной архитектуры были главными конкурентами Intel x86. Они применялись в компьютерах Apple Macintosh, Amiga, Atari, игровых приставках Sega и Neo-Geo, и даже в небезызвестном компьютере Sinclair QL. Это сейчас, когда у каждого в кармане смартфон, который в десятки, а то и в сотни раз превышает по мощности любой КПК того времени, никого не удивишь таким устройством. Но тогда это казалось чем-то фантастическим – карманный компьютер, который всегда с тобой!

КПК Sony CLIE T615
Я не смог пройти мимо, и в итоге стал владельцем КПК Sony CLIE T615, который так же работал на Palm OS, но обладал некоторыми преимуществами перед оригинальными устройствами Palm. У Sony CLIE был экран высокого разрешение 320x320 пикселей с 16-битным цветом, 16 мегабайт памяти и процессор, работающий на частоте 33 МГц. Не нужно быть семи пядей во лбу, чтобы понять, что на эти характеристики очень неплохо ложится эмулятор ZX Spectrum. К сожалению, на тот момент не существовало эмулятора, которым можно было бы хоть как-то пользоваться. Поэтому, преодолев кучу проблем, такой эмулятор я написал сам для себя. Вначале была даже шальная мысль как-то заработать на этом поприще, так как программы для Palm OS неплохо продавались, но от неё в итоге пришлось отказаться. По части выбора языка программирования у меня сомнений не было – языком разработки должен был стать только ассемблер. Во-первых, на других языках я особо и не писал никогда. Во-вторых, для достижения приемлемой скорости эмуляции на таком слабом процессоре никакой другой язык не подошёл бы. Ну, и в-третьих, у меня была книга по программированию на ассемблере для Amiga, а как я уже упомянул выше, процессор там стоял совместимый.


Эмулятор ZX-Pilot для КПК Palm
Для чего я вообще вспомнил этот свой старый эмулятор? А дело в том, что в процессе его написания у меня получилось оставить Palm OS за бортом и начать программировать ровно в том же стиле, к которому я привык на Спектруме. Если мне нужно было нарисовать точку на экране, то я записывал нужные данные напрямую в экранную память. То же касается опроса кнопок и вывода звука – я напрямую читал и записывал данные в соответствующие внешние порты, которые отыскал, копясь в ПЗУ. Palm OS лишь выделяла память и передавала управление моему эмулятору, а дальше я делал всё сам своими средствами при прямом обращении к железу. Во время разработки эмулятора я вёл дневник, который позже опубликовал в газете "Абзац". Если кому-то будет интересно, то вы можете ознакомиться с ним на сайте газеты. Исходный код эмулятора также доступен на Github.
Это было интересно и круто, но, к сожалению, век устройств с Motorola-совместимыми процессорами оказался недолог. Их сменили ARM-процессоры. А устройства с Palm OS вытеснили устройства под управление Windows Mobile. Ну а потом появились Android и iOS, которые вытеснили всё остальное. Вот так, вместе с эпохой старых Палмов и иссяк мой интерес к программированию этих устройств. И, к сожалению, ничего нового в течение нескольких последующих лет в поле моего зрения не попадало.

Микрокомпьютер Raspberry Pi 1 модель А
Когда в 2012 году вышла первая модель Raspberry Pi, я, как и многие, с энтузиазмом отнёсся к этому событию. Ещё бы, этот микрокомпьютер вышел в Великобританни - там же, где когда-то родился мой любимый ZX Spectrum. А к созданию Raspberry Pi приложил руку ни кто иной, как сам Дэвид Брэбен – автор культовой для любого спектрумиста игры Elite.

Дэвид Брэбен - автор игры Elite и микрокомпьютера Raspberry Pi с его прототипом в руках
Авторы открыто проводили аналогию своего детища с ZX Spectrum, начиная от невысокой цены и заканчивая областью применения – обучения школьников компьютерной грамотности. Как ни странно, но проект «взлетел»! Raspberry Pi завоевал повсеместную популярность. На этой волне многие производители начали выпускать похожие микрокомпьютеры. Но все они, как, собственно, и Raspberry Pi работали под управлением одного из дистрибутива операционной системы Linux, что по-прежнему не вызывало у меня какого-либо желания там программировать. Тем не менее Raspberry Pi мне очень понравился, и я начал покупать каждую новую модель, чтобы ознакомиться и поиграться с ними. К сожалению, я так и оставался рядовым пользователем, применяя только готовые программные решения. Так, например, в качестве моего домашнего сервера и одновременно медиаплеера уже почти два года с успехом используется вначале Raspberry Pi 3, а затем 4-я модель.
Увлекаясь Спектрумом и интересуясь Raspberry Pi я по-прежнему думал о том, что было бы интересно изучить некую новую для себя платформу, на которой можно было бы программировать на ассемблере и при этом иметь полный доступ к железу. Я смотрел в сторону GameBoy – это практически идеальный вариант, так как не пришлось бы изучать какой-то новый ассемблер, а можно было бы писать код в привычной мне мнемонике, так как там используется разновидность Z80. Также я смотрел в сторону NES и SNES. Но, к сожалению, все эти платформы давно уже не являются актуальными, и их поддерживают лишь фанаты по ностальгическим или каким-либо другим своим соображениям. Однако лично для меня эти платформы, в отличие от Специалиста и Спектрума, не значили ровным счётом ничего, а поэтому интереса писать под них у меня так и не возникло.
Тем не менее для меня всё-таки оставалось два интересных варианта – это ZX Evolution с прошивкой от TSL и небезызвестный ZX Spectrum Next. И, возможно, в итоге я бы всё-таки сделал шаг в сторону одного из них, но я увидел ZXBaremulator для Raspberry Pi.
ZXBaremulator - bare metal эмулятор ZX Spectrum для Raspberry Pi
Меня удивило, что эмулятор запускается практически моментально после подачи питания на Raspberry Pi, и при этом практически не занимает места на SD-карте. В глаза бросалось полное отсутствие операционной системы, под которой эмулятор бы запускался и работал. Я полез изучать данный вопрос и впервые столкнулся с понятием "bare metal", то есть дословно с "голым железом". Я не понимаю как так произошло, но все эти годы это довольно популярное явление неведомым образом проходило мимо меня и в то же самое время именно bare metal программирование меня так привлекало. Ведь, как оказалось, именно в этой самой стилистике, сам того не зная, я написал эмулятор ZX Spectrum для Palm-совместимых устройств. Именно к bare metal программированию я стремился все эти годы!
ZXBaremulator, хоть и поставляется без исходного кода, но мне легко удалось выяснить, что он написан на С++ с использованием популярной библиотеки Circle, которая даёт прямой доступ к основным аппаратным компонентам Raspberry Pi, позволяя писать собственные программы без участия какой-либо операционной системы, то есть в стиле bare metal. Конечно же я начал искать информацию о том, а не пишут ли под Raspberry Pi bare metal программы и на ассемблере. И конечно же выяснилось, что пишут, и ещё как пишут, а писать их начали практически сразу, как только Raspberry Pi вышла на рынок. В очередной раз я огорчился, что ранее ничего не слышал об этом явлении и потерял столько времени в поисках чего-то интересного. Хотя это интересное всегда находилось рядом!

Микрокомпьютер Raspberry Pi Zero
Теперь, глядя глазами спектрумиста на Raspberry Pi с точки зрения bare metal программирования, у меня аж дух захватывает! Вы только представьте, что в вашем распоряжении имеется процессор, который выполняет одну команду за такт, а всего этих тактов не много, не мало, а целых 800 млн. в секунду (800 МГц)! И это для самой слабой из доступных на сегодня моделей Raspberry Pi Zero, которую можно недорого купить на Aliexpress. Все эти вычитания, сложения, и даже умножения, не говоря уже про логические операции и ротации битов выполняются за одни такт и сразу с 32-ми битами! Правда, в отличие от Спектрума одна команда занимает уже не один-два байта, а сразу 4 (в режиме Thumb), но это с лихвой окупается объёмом памяти. Вы только вдумайтесь! На Raspberry Pi Zero – 512 мегабайт оперативной памяти. Не килобайт, а именно мегабайт, то есть в 512 раз (!) больше, чем, например, у Pentagon’а 1024. Я уже промолчу про стандартную 128 Кб машину! Про графику и говорить не стоит – в вашем распоряжении разрешение вплоть до 4K при 24-битном цвете. Но Спектрумисту с головой хватит и минимальных 640х480 с любыми 256 цветами из палитры в 16 млн. И всё это доступно вам напрямую, из ассемблера без каких-либо посредников в виде операционных систем и библиотек! А ведь помимо Raspberry Pi Zero доступны и другие модели, где процессорных ядер уже не одно, а целых четыре, и работают они на ещё больших частотах. А памяти может быть не 512 Мб, а вплоть до 8 Гб! И я ещё не беру в расчёт графический процессор, DMA, таймер и многие другие, имеющиеся на борту Raspberry Pi, компоненты. Однако повторюсь, что для спектрумиста даже тех скромных по современным меркам аппаратных возможностей, которые предлагает самая младшая модель, будет хватать с избытком.
Всё это, безусловно, круто! Но сходу заглянув в описание команд ассемблера я, честно говоря, испугался. После Z80/i8080 и MC68000 мне показалось, что в ассемблере архитектуры ARM сам чёрт ногу сломит:
add r5,r1,r5,lsl 6
strb r5,[r0,r2]
Что тут к чему прибавляется? Почему несколько команд с строке? Откуда столько регистров в одной команде? Ну как это вообще можно понять!
Но терпение и труд всё перетрут! Через некоторое время мне удалось получить своё первое "Hello, world!", выводимое на экран компьютера шрифтом из ПЗУ ZX Spectrum:

Программа "Hello, World!", запущенная под эмулятором

Программа "Hello, World!" на Raspberry Pi
Так с чего же начать? Об этом я расскажу, но в следующий раз, если, конечно, аудитория проявит интерес к данному вопросу.
***
Продолжение, наверное, следует.
Продолжение, наверное, следует.
Сообщение форума