Я отложил разработку игры Radio Attack на неопределенный срок. Всё из-за проблем с бюджетом на сервера и малым количеством желающих в неё поиграть. Но работать надо, и я сделал компилятор ещё лучше и также к нему эмулятор. Пока что эмулятор можно сказать как виртуальная машина. Для каждой игры в самой игре мы можем обрабатывать прерывания, которые присылает эмулятор, так что с ним удобно работать. Есть обработка прерываний. Пока что есть только одно прерывание, инструкция называется IREAD. Как и все прерывания, во время выполнения какой-то задачи, всё регистры и флаги сохраняются в стек, и начинает работать код прерывания. Пока в компиляторе мало возможностей, и поэтому код для лифта выглядит так.
iread interrupted start: mov al, 0x0 ; команда открыть дверь int 0x0 ; прерывание, связанное с работой двери лифта cycle: cmp byte [size], 0x0 ; если в [size] размер клиентов ноль, то работаем в цикле je cycle mov byte cl, 2 ; для теста занес сюда два mov al, 0x1 ; команда закрытия двери int 0x0 ; закрыть дверь down: mov al, 0x1 ; команда ехать вниз int 0x1 ; едем dec cl ; уменьшаем этаж до нашего клиента cmp cl, 0x0 ; если достигли нужного этажа, то jnz down ; если не достигли нужного этажа, то едем ниже mov byte [size], 0 ; в [size] заносим ноль mov al, 0x0 ; команда открытия двери int 0x0 ; открыть дверь jmp cycle ; идем проверять новые данные interrupted: ; вызывается по прерыванию mov byte [stages], al ; в al храниться этаж mov byte [size], 0x2 ; здесь храниться сколько этажей надо пройти. это тестовый код, так что здесь логические ошибки iret ; выход из прерывания size: db 0 ; здесь выделены байты, пока что так. stages: db 0, 0, 0
Уже реализовал, что по коду лифт едет и открывается на том этаже, котором скажет код.
Описание игры: Вы часто пользуетесь лифтами. Возможно вы злитесь на то, если вдруг лифт едет не так как нужно. Предлагаю вам попробывать самостоятельно разработать программу для управления лифтами.
На скриншоте один лифт, но если усложнить, и сделать два или три лифта, то код должен быть другой. Можно поиграться и посмотреть как люди будут счастливы ездить на ваших лифтах.
Ссылка на то, что сейчас реализовано.
link
Реализованы команды
enum { INT = 0x00, ADD = 0x01, SUB = 0x08, XCHG = 0x0f, MOV = 0x13, MUL = 0x1a, DIV = 0x1c, INC = 0x1e, DEC = 0x20, AND = 0x22, OR = 0x29, CLI = 0x30, STI = 0x31, CMP = 0x32, XOR = 0x39, CLC = 0x40, STC = 0x41, CLD = 0x42, STD = 0x43, SAL = 0x44, SAR = 0x48, SHL = 0x4c, SHR = 0x50, IN = 0x54, // не реализовано, так как нужно придумать для чего использовать OUT = 0x58, // не реализовано, так как нужно придумать для чего использовать PUSHA = 0x5c, PUSHF = 0x5d, POPA = 0x5e, POPF = 0x5f, // 0x60 for extended 32-bit if that is needed in future. PUSH = 0x61, POP = 0x65, NEG = 0x67, CMPSB = 0x69, CMPSW = 0x70, INSB = 0x71, // не реализовано, так как нужно придумать для чего использовать INSW = 0x72, // не реализовано, так как нужно придумать для чего использовать JA = 0x73, JNBE = 0x73, JAE = 0x74, JNB = 0x74, JNC = 0x74, JB = 0x75, JNAE = 0x75, JC = 0x75, JBE = 0x76, JNA = 0x76, JCXZ = 0x77, JECXZ = 0x77, JE = 0x78, JZ = 0x78, JG = 0x79, JNLE = 0x79, JGE = 0x80, JNL = 0x80, JL = 0x81, JLE = 0x82, JNE = 0x83, JNZ = 0x83, JNO = 0x84, JNP = 0x85, JNS = 0x86, JO = 0x87, JP = 0x88, JPE = 0x88, JPO = 0x89, JS = 0x91, NOP = 0x90, RET = 0x92, IRET = 0x93, LEAVE = 0x94, CALL = 0x95, IREAD = 0x99, JMP = 0x9d };
А не проще было бы написать интерпритатор бейсика или си ? С более понятным и приятным синтаксисом для большинства людей.
gambit_oz
> А не проще было бы написать интерпритатор бейсика или си ? С более понятным и приятным синтаксисом для большинства людей.
Проще? Не знаю. Я пробовал как-то подобие javascript сделать, но надоело. А вот свой компилятор с эмулятором, это круто. Я хотел сделать что-то сложное и чтобы это работало. Надоело знаешь писать обычный софт, который пишешь десять лет. Хотелось взяться за computer science и например написать ОС, что собственно и будет в дальнейшем. У меня планы такие. Я дорабатываю компилятор с эмулятором. Мотивацией служит мысль о том, что я это делаю для игр. Потом пишу ОС или МОНИТОР (раньше вместо ОС они были) на этом языке. В игре можно будет пользоваться реальной ОС, и если заморочиться, то можно будет создать неплохую таки производительность, и программы в игре будут реальные, так как байткод для эмулятора реален. Это я всё использую эмоциональный интеллект, чтобы развивать то что задумал. Как только научусь писать нормально компиляторы и эмуляторы, то если с играми не заладиться, то сделаю для реальных систем, типа Linux или Windows. Я сначала начал делать эмулятор i386 и компилятор i386, но понял, что не потяну и для игры нужно что-то попроще. Исследуя инструкции, я понял, что для вещей подобного рода точно нужен предварительный дизайн, просто так не получиться написать компилятор, нужно учесть, прочитать каждый оператор и посмотреть какие параметры есть и как используется это всё. Этим мне это нравиться. Сложность и железо.
archinaragu
На счет делать - сейчас есть много уже готовых библиотек интерпритаторов разных языков на разных языках - подключай и работай. Из старенького тот же LUA. Так же и с компиляторами на базе асма. Не думаю что получится придумать что то новое. Да и i386 сейчас устарел - у всех сейчас компы 64 битные.
Но если задумка такая глобальная, то в принципе идею поддерживаю.
Как совет - чтобы реально видеть как все работает на железе - лучше купить себе отладочную плату на микроконтроллере STM/Atmega/ESP32/Arduino. Еще лучше конечно купить платку Raspberry Pi.
Далее подключай к нему дисплей, клавиатуру и программируй на асме. Зачем ? Так будет более проще чем на компе - заодно получится освоить программирование реального железа и причем с минимальными затратами. В итоге можно будет сделать свой реальный миникомп за мало денег.
Как пример pico-8. Там и игры на нем пишут и прочие тулзы. И есть сложность и железо.)))
https://www.lexaloffle.com/pico-8.php
gambit_oz
Ты меня немного не туда отводишь. Нет нужды брать готовый компилятор, так как для него потребуется готовый эмулятор, например qemu, а это проблема. В моей эмуляторе я могу дать такую команду emu_run (pc, 10);, где 10 это число команд, которое оно выполнит, плюс прерывания int обрабатываются уже в движке игры, то-есть как только эмулятор встречает int, он возвращает команду под номером прерывания. И в движке игры мы уже вольны как хотим интерпретировать это прерывание. Я таких виртуалок могу штук 10 включить одновременно и FPS не будет падать, а как обстоят дела с qemu непонятно. Я нашел лучший вариант, это сделать свой компилятор асма и его эмулятор. В моем компиляторе уже реализованы комментарии и дефайны, впрочем вот, можно посмотреть скриншот, я как раз только что доделал дефайны и они работают.
Да, i386 старый, но я не использую даже 32 битный вариант и не использую сегменты. У меня 16-битный и его хватает для деланья разные мелких программ. К тому же это выполняется быстрее. В i386 уже появляется защищенный режим, задачи, защищенный режим, это сложнее в реализации и требует от эмулятора больше работы. Если потребуется, то я распечатал две книги по i386, и буду делать, но пока этого не нужно, я думаю хватет и 16 битного режима.
Вообще у меня мечта есть, создать игру про программиста на космическом корабле, где он будет чинить всякие штуки с помощью кодинга, ходить с отладчиком, взламывать двери, решать головоломки. Но, чтобы дойти до такой игры, нужно прокачать эмулятор с компилятором и устранить все баги.
archinaragu
Сегодня ссылка в новостях попалась - может чего оттуда себе дернешь))
— SIC-1 — одноинструментальная игра по программированию: store.steampowered.com/app/2124440; — MHRD — игра, в которой вы проектируете различные аппаратные схемы на языке оборудования: store.steampowered.com/app/576030/; — A=B — программистская головоломка, в которой есть только одна инструкция: A=B, что означает замену A на B: store.steampowered.com/app/1720850/; — Virtual Circuit Board — логический симулятор, основанный на рисовании, в котором вы можете строить, программировать, украшать и моделировать что угодно: store.steampowered.com/app/1885690/; — One Dreamer — манипулируйте окружающим миром, редактируя исходный код, в стремлении выгоревшего разработчика инди-игр исполнить мечту всей жизни: store.steampowered.com/app/1156380/; — The Farmer Was Replaced — запрограммируйте и оптимизируйте беспилотник для автоматизации фермы и наблюдайте, как он делает работу за вас: store.steampowered.com/app/2060160/; — One Dreamer — изменяйте мир вокруг себя с помощью псевдокода, путешествуя по смешанным реальностям, и узнайте, почему Фрэнк стал разработчиком игр: store.steampowered.com/app/1274140/; — OCTOPTICOM — бессрочная игра-головоломка, посвященная проектированию и оптимизации оптических вычислительных устройств: store.steampowered.com/app/943190/; — Comet 64 — игра-головоломка для программистов: store.steampowered.com/app/1397290/; — EXAPUNKS — раньше вы были хакером, а теперь у вас есть фаг: store.steampowered.com/app/716490/; — Glitchspace — перепрограммирование игры для решения головоломок: store.steampowered.com/app/290060/; — Else Heart.Break() — игра о дружбе, любви и технологиях в месте, где биты заменили атомы: store.steampowered.com/app/400110/; — Grey Hack — симулятор хакера, где вы играете за хакера с полной свободой действий в обширной сети процедурно генерируемых компьютеров: store.steampowered.com/app/605230/; — Bitburner — инкрементальная игра, основанная на программировании: store.steampowered.com/app/1812820/; — Turing Complete — изучите архитектуру процессора с помощью головоломок: store.steampowered.com/app/1444480/; — 7 Billion Humans — автоматизируйте толпы офисных работников для решения головоломок внутри вашего собственного распараллеленного компьютера, сделанного из людей: store.steampowered.com/app/792100/; — TIS-100 — задача в этой игре переписать поврежденные блоки кода, чтобы починить код и узнать все его секреты: store.steampowered.com/app/370360/; — Opus Magnum — вам предстоит придумывать и строить хитроумные машины для получения зелий, ядов и других веществ: store.steampowered.com/app/558990/; — SHENZHEN I/O — создавайте схемы и пишите код: store.steampowered.com/app/504210/; — Human Resource Machine — возьмите контроль над небольшими офисными работниками и запрограммируйте их на решение головоломок: store.steampowered.com/app/375820/.