Update README.md
This commit is contained in:
@@ -1,11 +1,99 @@
|
||||
# TyVM - [T]in[y] [V]irtual [M]achine
|
||||
TyVM is a 16bit VM based on the LC-3 architechture
|
||||
TyVM is a 16bit VM based on the LC-3 architechture that runs Assembly code, and could more generally run even an operating system
|
||||
|
||||
### HARDWARE:
|
||||
- 16-bit on LC-3 architecture
|
||||
- 128kb memory
|
||||
## Resources
|
||||
https://en.wikipedia.org/wiki/Little_Computer_3
|
||||
|
||||
### Build
|
||||
On file "preprocessor.c" define the OS where you want to run TYVM:
|
||||
|
||||
#define __UNIX
|
||||
|
||||
Uncomment this line if you want to build for Unix based OS, otherwise comment it out to build for Windows
|
||||
Build using the command:
|
||||
```
|
||||
gcc tyvm.c -o tyvm
|
||||
```
|
||||
Or simply using makefile (optional: in makefile change binary file name wether building on Unix or Windows):
|
||||
|
||||
```
|
||||
make
|
||||
```
|
||||
|
||||
### Hardware
|
||||
TYVM is a very barebone 16-bit system on LC-3 architechture. It has:
|
||||
- 128kb memory (65,536 memory locations)
|
||||
- 10 registers:
|
||||
- 8 general purpose
|
||||
- 1 program counter
|
||||
- 1 condition register
|
||||
- 3 condition flags
|
||||
|
||||
#### Memory
|
||||
It has 2^16(=65,536) individual memory locations
|
||||
```
|
||||
uint16_t memory[UINT16_MAX];
|
||||
```
|
||||
#### Registers
|
||||
TYVM has n.10 16-bit registers.
|
||||
- 8 general purpose registers
|
||||
- 1 program counter (PC)
|
||||
- 1 conditional register (COND)
|
||||
|
||||
```c
|
||||
enum {
|
||||
RG_000 = 0,
|
||||
RG_001,
|
||||
RG_010,
|
||||
RG_011,
|
||||
RG_100,
|
||||
RG_101,
|
||||
RG_110,
|
||||
RG_111,
|
||||
RG_PC,
|
||||
RG_COND,
|
||||
RG_COUNT
|
||||
};
|
||||
uint16_t registers[R_COUNT];
|
||||
```
|
||||
#### Instruction set
|
||||
TYVM has n.16 16-bit opcodes, that instructs the machine to do some simple calculation:
|
||||
```c
|
||||
enum { // [name, 8-bit value]
|
||||
OP_BR = 0, // branch, 0000
|
||||
OP_ADD, // add, 0001
|
||||
OP_LD, // load, 0010
|
||||
OP_ST, // store, 0011
|
||||
OP_JSR, // jump register, 0100
|
||||
OP_AND, // bitwise and, 0101
|
||||
OP_LDR, // load register, 0110
|
||||
OP_STR, // store register, 0111
|
||||
OP_RTI, // unused opcode
|
||||
OP_NOT, // bitwise not, 1001
|
||||
OP_LDI, // indirect load, 1010
|
||||
OP_STI, // indirect store, 1011
|
||||
OP_JMP, // jump, 1100
|
||||
OP_RES, // reserved opcode,
|
||||
OP_LEA, // load effective address, 1110
|
||||
OP_TRAP, // execute trap, 1111
|
||||
};
|
||||
```
|
||||
|
||||
### Logic
|
||||
10 Load instruction from memory at program counter [RG_PC] address;
|
||||
20 Increment RG_PC;
|
||||
30 Read opcode for next instruction;
|
||||
40 Perform instruction read in 40;
|
||||
50 Goto 10;
|
||||
|
||||
### Usage
|
||||
```bash
|
||||
./tyvm <*.asm>
|
||||
```
|
||||
|
||||
- Below is a `hello-word` program for `TYVM`, the assembled program can be found in `asm` directory
|
||||
```shell
|
||||
.ORIG x3000
|
||||
LEA R0, HENLO_WORLD
|
||||
PUTS
|
||||
HALT
|
||||
HELLO_STR .STRINGZ "Henlo World!"
|
||||
.END
|
||||
```
|
||||
|
||||
Reference in New Issue
Block a user