100 lines
2.4 KiB
Markdown
100 lines
2.4 KiB
Markdown
# TyVM - [T]in[y] [V]irtual [M]achine
|
|
TyVM is a 16bit VM based on the LC-3 architechture that runs Assembly code, and could more generally run even an operating system
|
|
|
|
## 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:
|
|
- 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
|
|
```
|