Важная информация
  • Bare metal - выбор настоящего ретрокомпьютерщика!

    В этой заметке я попытаюсь рассказать о своём личном опыте программирования на голом железе (bare metal), как я к этому пришёл и почему меня, как спектрумиста, это заинтересовало.


    Посмотрите это короткое видео:

    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

    Так с чего же начать? Об этом я расскажу, но в следующий раз, если, конечно, аудитория проявит интерес к данному вопросу.

    ***
    Продолжение, наверное, следует.

    Комментарии 13 Комментарии
    1. Аватар для polikarpov76
      polikarpov76 -
      Очень интересная статья. И, конечно же, буду ждать продолжения. На самом деле, это могло бы стать отличным учебным примером, как сегодня писать на ассемблере под современные железки: с пошаговыми уроками, с примерами и проектом на гитхабе. Чтобы даже те кто не в теме (а сейчас тех, кто программирует на ассемблере, не много) могли бы взять готовый тулчейн и повторить шаги автора.
    1. Аватар для Vortex
      Vortex -
      Желание писать на ассемблере и контроллировать все и вся у меня отпало после того, как году так в 2000 я вооружившись умной книжкой сел писать небольшую прогу чисто на x86 асме под голый DOS писюка. Отладив код, как мне казалось до немыслимых высот и скоростей я все же решил переписать его на си и скормить модному тогда интеловскому компилеру в режиме оптимизации по скорости. Каково было мое удивление, когда моя программа стала работать раза в два быстрее, тк интел компилер учитывал все эти кеширования, параллелизм и предсказания переходов, которые я учесть был не в состоянии. С тех пор я всегда взвешенно оцениваю возможности того или иного инструмента и доверяю работу ему, абстрагируясь от самого низкого уровня где это можно и нужно.
      Недавно начал изучать ПЛИС. Там тоже все здорово, там вообще можно производить тысячи логических операций (или даже команд нескольких синтезированных процессоров) за один такт, есть несколько уровней абстракции, и вот уж где совсем не хочется все делать на самом нижнем уровне, ибо результат ручной работы уж точно не будет лучше машинного синтеза.
    1. Аватар для Jordon/SDM
      Jordon/SDM -
      Полностью согласен! Асм нравится тем, что накодил, то и получил. Под 8 бит процы только он. Кто то кроссворды гадает, а мне нравится под z80 мОзги свои шебуршить
    1. Аватар для Dimon spb
      Dimon spb -
      Я буду ждать продолжение прямо-таки с нетерпением. Тоже давно посматриваю в сторону Arduino и Raspberry, но никак не заставлю себя начать. А они могли бы решить мне многие задачи гораздо меньшими деньгами в сравнении в решениями на Windows. Это я про рабочие моменты.
    1. Аватар для sdima1357
      sdima1357 -
      Ставлю сто баксов против десяти , что ничего не выйдет. Для потактовой эмуляции не хватит скорости прерываний. Эмулирующему прцессору нужно по очереди обрабатывать задачу симуляции собсвенно Z80, контроллера звука AY-3-8910, рендеринг собственно биппера. правильную в относительном времени отрисовку экрана, правильный захват порта чтения магнитофона и клавиатуры и все это на ассемблере ? Это не реально. Sorry... Так можно только сделать поделку умеющую худо бедно эмулировать Z80, на котором работает половина игр в лучшем случае и то кое как... Не стоит, не тратьте свое время. Или пишите на Си или делайте на FPGA (на нем будет проще всего).

      - - - Добавлено - - -

      Даже bare metal лучше писать на Си для таких объемов работы. Слишком много обрабатываемых очередей.
    1. Аватар для CityAceE
      CityAceE -
      Цитата Сообщение от sdima1357 Посмотреть сообщение
      Ставлю сто баксов против десяти , что ничего не выйдет.
      Вы, видимо, по диагонали пробежались по статье. Так как нигде в ней я не обозначал никаких целей по части написания чего-либо. Цель статьи просто рассказать о такой явлении, как "bare metal", ну и по возможности поделиться тем, что я сам накопал, интересуясь данным вопросом.

      Цитата Сообщение от sdima1357 Посмотреть сообщение
      Для потактовой эмуляции не хватит скорости прерываний. Эмулирующему прцессору нужно по очереди обрабатывать задачу симуляции собсвенно Z80, контроллера звука AY-3-8910, рендеринг собственно биппера. правильную в относительном времени отрисовку экрана, правильный захват порта чтения магнитофона и клавиатуры и все это на ассемблере ? Это не реально. Sorry... Так можно только сделать поделку умеющую худо бедно эмулировать Z80, на котором работает половина игр в лучшем случае и то кое как...
      Я так понимаю, что это вы про эмулятор ZX Spectruma. Так есть он уже - ZXBareumulator, вполне работающий и неплохо эмулирующий и Z80, и AY-3-8910. И работающий при этом на одном ядре ARM и без операционной системы.

      Цитата Сообщение от sdima1357 Посмотреть сообщение
      Не стоит, не тратьте свое время.
      Иногда важен не только результат, а сам процесс. Это же своего рода спорт.
    1. Аватар для sdima1357
      sdima1357 -
      Цитата Сообщение от CityAceE Посмотреть сообщение
      Так есть он уже - ZXBareumulator
      Так ведь он не на ассемблере написан. Bare metal - это правильное направление, я ведь с этим и не спорил. Просто ассемблер малопригоден для данной задачи(эмуляции чего нибудь неординарного, а что еще можно писать ? ), я об этом.


      Цитата Сообщение от CityAceE Посмотреть сообщение
      Иногда важен не только результат, а сам процесс. Это же своего рода спорт.
      Тут согласен однозначно.
    1. Аватар для goodboy
      goodboy -
      Цитата Сообщение от sdima1357 Посмотреть сообщение
      ассемблер малопригоден для данной задачи
      расскажи это авторам эмуляторов например на Амиге.
      для PC msdos есть эмуль `бактерия` ; на чистом асме, размер чуть меньше 4к
    1. Аватар для sdima1357
      sdima1357 -
      Цитата Сообщение от goodboy Посмотреть сообщение
      расскажи это авторам эмуляторов например на Амиге.
      Ко мне обращайтесь на Вы пожалуйста. Я Вам не хамил и несколько старше.
      Вы видимо написали много эмуляторов компьютерных систем на ассемблере 68000 , дайте ссылку хотя бы на один ?

      Цитата Сообщение от goodboy Посмотреть сообщение
      для PC msdos есть эмуль `бактерия` ; на чистом асме, размер чуть меньше 4к
      Вы вообще поняли о чем шла речь ?
    1. Аватар для goodboy
      goodboy -
      Цитата Сообщение от sdima1357 Посмотреть сообщение
      Вы вообще поняли о чем шла речь ?
      о Вашей фразе "что ASM малопригоден для создания эмуляторов"

      - - - Добавлено - - -

      Цитата Сообщение от sdima1357 Посмотреть сообщение
      Вы видимо написали много эмуляторов компьютерных систем на ассемблере 68000 , дайте ссылку хотя бы на один ?
      автор не я, но смотрите на здоровье https://zx-pk.ru/attachment.php?atta...8&d=1171950144
    1. Аватар для sdima1357
      sdima1357 -
      Цитата Сообщение от goodboy Посмотреть сообщение
      автор не я,


      Цитата Сообщение от goodboy Посмотреть сообщение
      но смотрите на здоровье https://zx-pk.ru/attachment.php?atta...8&d=1171950144
      Посмотрел.
      Это не весь код
      Не факт что это не правленная трансляция с языка высокого уровня(похоже на то , я сам так делал в 95 для эмуляции z80 на PC )
      Я не знаю уровня этого эмуля спектрума
      Я не говорил , что невозможно, я говорил что не стоит писать более или менее детальный эмулятор спектрума на ассемблере ARM на процессоре в 800 MHz, проще и аккуратнее на Си, в частности для голого металла

      ПС Почитал другую статью ТС про эмуляцию на палме. Автору( CityAceE ) респект. Но 800 MHz не 30 и 10% оставшейся работы , как обычно, и занимают 90% времени
    1. Аватар для Dr.Dash
      Dr.Dash -
      Отличная статья и тема! Прочитал на одном дыхании, побольше бы таких интересных статей, спасибо. С не терпением буду ждать продолжения!
    1. Аватар для CityAceE
      CityAceE -
      Продолжение будет. По плану у меня ещё не менее трёх частей. Вот только со временем и настроением не очень... Вторую часть почти дописал уже.