Эмулятор своего 16 битного процессора на С++ и ассемблер в придачу.

#MinePcProcessor #СвойПроцессор #C #Programming #Программирование Как то раз я играл в майнкрафт, и внезапно понял как работают процессоры... Сначала сделал несколько схем в игре, а потом понял, что хочу больше. Решил пойти с верху вниз. 1)Сначала разработать систему команд и ассемблер 2)Смоделировать процессор в эмуляторе с возможностью отладки программ, отладить и обкатать систему команд. 3)Смоделировать на основе процессора эмулятор компьютера, тоже все обкатать и отладить 4)Разработать логическую схему в точности по эмулятору. Добиться 100% совместимости с эмуляцией 5) Разработать электрическую схему просимулировать ее работу 6) Попытаться собрать руками Так как я нуб в схемотехнике, то нужно разрабатывать максимально простую архитектуру, чтобы было как можно меньше элементов, поэтому я начал с 8бит. Но 8битное все, без всяких хаков и усложнений логики оказалось сложно превратить во что-то реальное, поэтому после реализации 8битного быстро понял, что нужно переходить на 16бит. На данный момент обстановка такая: Есть эмулятор процессора на С с возможностью отладки программы\ Точки останова\ выполнение кода по шагам Есть компилятор асемблера на С с генерацией отладочных символов. Процессор: 2 регистра 16бит 1 регистр чисто флаговый для обработки переполнения ra - рабочий регистр, все активное взаимодействие происходит через него. rb - буферный регистр, для временного хранения данных rc - 0x00\0xff - при сложении двух чисел в регистр записывается 0xffff если произошло переполнение, аналог cary out 16битная адресация, что дает 65кб озу все числа 16битные - что немного усложняет кодинг, но значительно упрощает реализацию. При желании мы можем программно реализовать работу с более широкими числами. Числа пока в littleEndian, что мне не очень нравится, так как периодически ломает мозг. Я пока не занимался портированием компилятора и эмулятора на другие архитектуры, поэтому оставил родной для amd64 эндиан. Работа с памятью происходит по два байта за раз. То есть читаем и пишем мы содержимое 16битного регистра. 16 команд процессора в основном однобайтовые, но две из них 3 байтовые, по факту они тоже одно байтовые, просто они читают следующие за собой 2 байта в качестве аргумента hlt - стоп программы 8бит swp - меняет местами значение регистров ra и rb 8бит ld - загружает в регистр ra по адресу находящемуся в нем же два байта 8бит rast - устанавливает в регистр ra константное значение 8бит аргумент 16бит pt - записывает содержимое регистра ra по адресу 8бит аргумент 16бит ptrb - записывает содержимое регистра ra по адресу в регистре rb 8бит sum - суммирует содержимое ra и rb, если произошло переполнение в регистр rc выставляется 0xffff 8бит cmp - сравнивает значения ra и rb , если значения равны то в ra записывает 0x0000, иначе 0xffff 8бит jmp - условный переход, если в регистре ra = 0 то ничего не происходит, и переходит к следующей команде, иначе прыжок в адрес из регистра 8бит and - логическое бинарное И между ra & rb результат сохраняется в ra 8бит or - логическое бинарное ИЛИ ra | rb результат в ra 8бит not - логическое бинарное отрицание значение в регистре rb, результат пишется в ra 8бит rsh - бинарный сдвиг в право на 1 бит содержимого ra 8бит lsh - левый сдвиг 8бит cout - загружает в ra значение rc. значение rc - не меняется 8бит nop - no operation - пропустить шаг и перейти к следующей команде 8бит Компилятор и язык ассемблера: Полное описание смотрите в посте, сюда не влезло:) @-227502614-samodelnyi-processor
Back to Top