Виртуальная машина, написанная неуверенной рукой гуманиста в среде программирования Arduino с использованием деревенского кода и велосипедов.
Для него также существует компилятор с C-подобного языка, написанный на JavaScript с использованием тех же методов.
Да.
Уже можно бросаться в комментарии и закидывать камнями.
Ну а тем, кому еще интересно, приглашаю продолжить чтение.
В общем моя поделка уже немного освещена уважаемым тормозедисон Здесь здесь .
Но в то время существовал скорее прототип сферической формы в вакууме.
И теперь у меня есть операционное устройство РоманС, которое он мне любезно предоставил для экспериментов совершенно бесплатно.
Это устройство называется ESPboy. От других поделок отличается компактностью и слотом расширения с использованием микросхемы MCP23017. Здесь вы можете узнать об этом больше.
Если кому-то интересно, как мне вообще пришла в голову такая странная идея, как виртуальная машина на микроконтроллере, можете прочитать под спойлером.
Фон Когда-то в школе я заинтересовался гейммейкером от YoYogames и, как и многие, ради бога, увлекся им.
Этими криво написанными и плохо прорисованными демками еще можно было похвастаться перед друзьями, но в Интернете они тонули среди подобных.
Я понял, насколько сложно самому написать даже простую игру, не говоря уже о серьезной, в которой можно было бы грабить коров.
Но желание писать игры не пропало.
Когда у меня появился мобильный телефон, я открыл для себя Midlet Pascal и наслаждался им несколько лет. Ведь я понимал, что написать игру для слабого устройства проще, чем для его более мощного старшего брата.
По крайней мере, всегда можно было говорить не о кривых руках, а об ограниченности возможностей платформы.
Однако на смену кнопочным операторам пришли датчики; еще один шанс завоевать мир был упущен.
И все же в какой-то момент я понял, что могу оживить свои мечты с помощью микроконтроллера.
Я начал с написания игры для Arduino Uno, куда бы я без нее был? Тогда он был у меня единственный, и я очень переживал за его работоспособность.
Старался прошивать как можно меньше.
Но путь повесы идет маленькими шагами.
Каждое небольшое редактирование кода заставляло меня прошивать его снова и снова.
И я решил написать виртуальную машину со стеком.
Ведь на борту огромные два килобайта оперативной памяти для байтов кода и данных.
Но какой же он медленный, и памяти почему-то всегда не хватало.
Наверное, все дело в том, что все мои велосипеды имели квадратные колеса и ехали медленно.
Тогда я решил написать эмулятор чипа-8 для только что прибывшей из Китая ардуино мега.
Конечно, тогда мне еще хотелось написать для него эмулятор Gameboy, первой PlayStation и какого-нибудь суперкомпьютера попроще.
В результате я понял главное.
Виртуальная машина чипа-8 была очень простой, даже слишком простой.
Настолько, что при написании собственных игр на умножение или деление приходилось писать отдельную медленную подпрограмму.
Это означает, что вам нужно написать свою собственную виртуальную машину, избавившись от фатального недостатка.
В это время прибыло и несколько esp8266, с их космическими 160МГц.
Если вы считаете, что виртуальная машина — это пустая трата ресурсов, то я еще и под нее переписал свой эмулятор чип-8. В результате получилась виртуальная машина внутри виртуальной машины на микроконтроллере.
Вероятно, мы можем пойти дальше и написать машину Тьюринга на чипе-8.
Технические характеристики игрового движка ESP Little
Виртуальная машина содержит 16 регистров по 16 бит, нулевой регистр — это указатель стека.Каждая инструкция двухбайтовая, некоторые инструкции содержат после себя два байта данных.
Адресная память 64КБ.
В случае ESP8266 доступно 20 КБ.
Загрузить программу можно со SPIFFS и UART. При желании можно добавить загрузку с карты памяти или через WiFi. Помимо обычных инструкций по арифметике и перемещению данных, есть отдельные инструкции по работе со спрайтами, экраном и звуком.
Размер экрана 128 на 128 пикселей.
При 16 цветах на пиксель экран занимает 8КБ памяти, столько же занимает буфер для отрисовки спрайтов и частиц.
Хотя использованная мной библиотека TFT_eSPI способна обновлять экран более 60 раз в секунду, мне пришлось ограничиться 20 кадрами в секунду.
В противном случае виртуальной машине не хватило процессорного времени.
Вы можете рисовать тайлы и 32 спрайта размером до 128x128 пикселей с возможностью вращения и зеркального отображения.
Для экономии памяти можно использовать однобитовые изображения или RLE-сжатие.
Есть упрощенная физика: обнаружение столкновений спрайтов со спрайтами и тайлами, разрешение столкновений, гравитация.
? Кран обновляется построчно только в том случае, если в строке происходит изменение пикселей.
Скорость ВМ в зависимости от того, сколько строк отрисовывается за кадр, варьируется от 100 тысяч до 900 тысяч операций в секунду.
Вы можете использовать разные цветные экраны, есть программное обеспечение для растягивания изображения до нужных пропорций.
Некоторые из написанных мною игр можно просмотреть здесь .
Одновременно с ВМ для ESP8266 я написал эмулятор JavaScript для браузера.
Чтобы не редактировать байткод вручную, был добавлен простой ассемблер, основанный на моем опыте работы с ассемблером для MOS6502. Затем я решил добавить язык более высокого уровня.
Все-таки моей главной целью было быстро написать простые игры, а не тратить много времени на отладку ассемблерного кода.
Мне казалось, что написать свой компилятор будет проще, чем добавлять LLVM. И написал я это на JavaScript, потому что знаю его не так плохо, как другие языки.
На данный момент он далек от поддержки стандартов C и при компиляции легко можно столкнуться с непонятной ошибкой в непонятном месте.
Но это быстро, потому что занимает менее 2000 строк.
А теперь к вопросу, зачем я все это сюда написал.
Теперь вы можете писать и запускать игры.
Однако до совершенства еще далеко.
Если бы кто-нибудь захотел помочь мне улучшить ESP LGE или написать собственную игру, я был бы очень рад. Если моя идея покажется вам интересной и вы захотите узнать больше, я буду рад ответить на ваши вопросы.
Имейте в виду, код Arduino довольно сложно прочитать.
Частично потому, что я самоучка.
Частично потому, что я пытался уменьшить количество вызовов функций для увеличения скорости.
В результате многие функции содержат огромные фрагменты кода.
Поэтому держите беременных женщин и детей подальше от экрана.
Постепенно я постараюсь это исправить и улучшить читабельность.
И для тех, кто дочитал, пример игры.
При компиляции он занимает менее ста строк и менее 1 КБ.
Теги: #Программирование микроконтроллеров #Сделай сам или Сделай сам #Разработка для Arduino #esp8266 arduinoint stickCount; char key,previouseKey,takenSticks; void redraw(){
-
Создание Демо Специально Для Хабра - Часть 1
19 Oct, 24 -
Центризбирком Запустил Живой Журнал
19 Oct, 24 -
Tomita Яндекс Парсер Для Всех
19 Oct, 24 -
Не Понимаю? Платить!
19 Oct, 24 -
От Commodore До Ipad
19 Oct, 24 -
Ретроподелиться
19 Oct, 24