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

Придумал систему команд, а для команд нужен исполнитель. Собственно, его и делаю. Основная идея: Разработать минемалистичный процессор, с точки зрения элементов и сложности. В идеале - когда-нибудь, может быть, воплотить в железе. Текущий вариант чисто 8битный, регистры, адресное пространство. Соответственно, чтобы был хоть какой-то смысл его нужно сделать хотябы 16битным, ибо в 256 байт особо ничего не запрограммируешь. Варианта решить 2 План - А) уместить в 256 байт программу-микрокод, котрая будет эмулировать процессор, но в 16разрядном виде. Сделает процессор практически применимым Не увеличит сложность реализации - просадка в производительности - попробуй-ка запихни это 256 байт План-Б) Если не выйдет раширить архитектуру до 16 бит в “железном“ виде. 100% вариант В эмуляторном виде почти бесплатно Нет просадки по производительности - Увеличит сложность\стоимость производства в железе в возможном будущем. На данный момент есть рабочий ассемблер и рабочий эмулятор, в какой-то степени. Спецификация, если можно это так назвать: /* * memory bytes * registers:ra,rb,rc * opcodes: * [id203992|*one] line - one opcode * oppcodes without argument size is 8bits, * with argument 8bit registerSize bits * * hlt - stops programm(end) * 8bits * * swp - swap ra with rb * 8bits * * ld - loads byte from memory by addres from current value in ra, and * writes byte value in to ra * 8bits * * rast - sets to ra a value * 8bits register_size * * pt - write from ra to mem * 8bits registerSize * ptrb - wirtes from ra by adr in rb * 8bits * * sum - * summ ra rb and writes result to ra, * writes to rc(caryout) - 1 if owerflowed or 0 else. * 8bits * * cmp - compares ra and rb. Writes result to ra * 0x00 - equals * 0xff - else * 8bits * * jmp - jump to adress in ra. if adr == 0 then nop * 8bits * * and - binary ra & rb -> ra * 8bits * * or - binary ra | rb -> ra * 8bits * * not - binary inversion rb -> ra * 8bits * * one bit shfts * * from ra to ra * * new bits is 0 * rsh - binary right shift * 8bits * lsh - binary left shift * 8bits * * cout - loads value from caryout(rc) to ra. * Value caryout(rc) register is not change. * 8bits * nop - no operation * 8bits * —---------------------------------------------------------------- * programm struct * : - label * * .data - palces after end of programm. * Partition for constants and variables * * : - refs to adress with value * * exam. * :my_var * 42 * * : - refs to adress with first byte of value * {string value} - 0 terminated, byte sequence(C-str) * String expands to 0-terminated byte sequnce */ /* compilation. * command max len 16bits. 8bits - oppcode * 8bits arg for ld\pt oppcode ex. ld * For values look at enum class OppCodes : std::uint8_t */
Back to Top