Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/gto76/comp-cpp
Comp Mark I – Simple 4-bit virtual computer
https://github.com/gto76/comp-cpp
educational-software virtual-machine
Last synced: 16 days ago
JSON representation
Comp Mark I – Simple 4-bit virtual computer
- Host: GitHub
- URL: https://github.com/gto76/comp-cpp
- Owner: gto76
- License: mit
- Created: 2015-05-25T09:52:20.000Z (over 9 years ago)
- Default Branch: master
- Last Pushed: 2024-03-09T01:16:19.000Z (8 months ago)
- Last Synced: 2024-10-14T16:39:07.382Z (28 days ago)
- Topics: educational-software, virtual-machine
- Language: C++
- Homepage:
- Size: 300 KB
- Stars: 342
- Watchers: 10
- Forks: 32
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
Comp
====#### Simple 4-bit/1 Hz virtual computer for learning purposes
![screenshot](doc/screenshot.png)
For quick start see [**HOW TO RUN**](#how-to-run-on).
Memory
------
```
instructions - 4 bits
| +-- addresses - 4 bits
v v
----***- <- 0 ----
--*-**-* <- 1 ---*
---***-- <- 2 --*-
---***** <- 3 --**
----***- <- 4 -*--
---***-* <- 5 -*-*
----**-- <- 6 -**-
---****- <- 7 -***
-***---* <- 8 *---
-*--**** <- 9 *--*
-------- <- 10 *-*-
-------- <- 11 *-**
-------- <- 12 **--
-------* <- 13 **-*
-------* <- 14 ***-
<- 15 ****
```* Execution starts at the first address (0).
* Execution stops when program reaches last address (15).
* Whatever gets written to the last address is sent to the printer.
* When reading from the last address (15), we get a random byte value.
* CPU has one 8 bit register.Instruction set
---------------* `READ ----` - Copies the value at the specified address into register.
* `WRITE ---*` - Copies value of the register to the specified address.
* `ADD --*-` - Adds value at the specified address to the value of the register, and writes result to the register. If the result is bigger than the maximum possible value (255 = ********) then 255 gets written.
* `SUBTRACT --**` - Subtracts value at the speicfied address from the value of the register, and writes result to the register. If the result is smaller than 0 then 0 gets written.
* `JUMP -*--` - Changes the value of the program counter to the specified address, meaning that in the next cycle execution will continue at that address.
* `IF MAX -*-*` - Jumps to the specified address if register has value 255 = `********`.
* `IF MIN -**-` - Jumps to the specified address if register has value 0 = `--------`.
* `SHIFT R -***` - Moves every bit of the register one spot to the right. This way rightmost bit gets lost, and a leftmost becomes '*-*'. This is the only instruction that doesn't use the address part, making the last four bits irrelevant.
* Any instruction that is not defined above is interpreted as `READ ----` instruction.How to run on…
--------------### Windows
* Install *Tiny Core Linux* on *VirtualBox* using this [**instructions**](https://github.com/gto76/my-linux-setup/tree/gh-pages/conf-files/tiny-core-linux).
* Run the *UNIX* commands.### UNIX
```
$ git clone https://github.com/gto76/comp-cpp.git
$ cd comp-cpp
$ ./run
```Other versions
--------------
* [**Mark II**](https://github.com/gto76/comp-m2), model with separate address space for code and data, and with more instructions. Programs can be saved and loaded and it can run without the interface (instead of a printer, it then uses stdout). Also input can be piped in.![screenshot](https://github.com/gto76/comp-m2/raw/master/doc/screenshot.png)