diff --git a/README.md b/README.md index 5324367..47717a0 100644 --- a/README.md +++ b/README.md @@ -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 +```