Эмулятор 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
*/
30 views
2482
941
4 days ago 03:49:12 30
Эмулятор 16 битного процессора на С++ и ассемблер в придачу.