├── LICENSE
├── README.md
├── index.html
├── js
├── wee.d.ts
├── wee.js
└── wee.js.map
├── src
├── Assembler.ts
├── Diagnostic.ts
├── Lexer.ts
├── Tests.ts
└── VirtualMachine.ts
├── tests.html
└── tsconfig.json
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2017 Mario Zechner
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Wee
2 | Wee is a tiny educational programming environment. Wee is composed of:
3 |
4 | 1. An instruction set architecture (ISA) with a corresponding virtual machine (**Wee Machine**).
5 | 2. An assembly language plus assembler (**Wee Assembly**)
6 | 3. A higher level language (**Wee Lang**) that is an extension of the assembly language
7 | making common tasks, like defining types, functions, locals, etc., more comfortable.
8 | 4. A browser-based development environment with code editing, compilation and debugging tools (**Wee DE**).
9 |
10 | ## Wee Machine
11 | The Wee Machine resembles the architecture of real-world 32-bit machines like x86 and ARM. The Wee Machine is composed of the following components:
12 |
13 | 1. The **processor** with
14 | 1. 32-bit integer & float ALU
15 | 2. 14 general purpose registers (r0-r13)
16 | 3. A program counter register (pc)
17 | 4. A stack pointer register (sp)
18 | 2. Byte-addressable **random access memory**
19 | 3. Memory mapped **video memory** (32-bit RGBA, 320x200)
20 | 4. **Ports** to communicate with peripherals like
21 | 1. Keyboard
22 | 2. Mouse
23 | 3. Graphics card
24 | 5. Sound card
25 | 6. Networking card
26 | 7. Random number generator
27 | 8. High precision timer
28 | 5. A **Basic Input/Output System (BIOS)**
29 |
30 | Wee Machine implements the Von Neumann architecture: code & data are stored to and read from the same memory. This allows self-modifying code. Wee Machine uses little endian, the word size is 32-bit.
31 |
32 | ### Instruction Set
33 | Instructions are 32-bit in size, with 0-3 operands encoded in the instruction. Memory access instructions allow the specification of byte-offsets. The opcode of an instruction is always encoded in the first 6 bits. Some instruction may be made up of an additional 32-bit value encoding data or an address.
34 |
35 | #### Register encoding
36 | Wee Machine has 16 registers, `r0-r13`, `pc` and `sp`. When encoding a register in an instruction, the register is referred to by an index. Registers `r0` to `r13` are indexed from 0 to 13. Register `pc` has index 14, and register `sp` has index 15.
37 |
38 | #### Halting
39 | Wee Machine can be halted via the instruction `0x00000000` or `halt` in assembly.
40 |
41 | #### Arithmetic Operations
42 | Wee Machine supports 32-bit integer and floating point arithmetic. All arithmetic instructions operate only on registers and have the following format:
43 |
44 | | bits 0-5 | bits 6-9 | bits 10-12 | bits 14-17 | bits 18-31 |
45 | | -------- | -------- | -------- | ---------- | ---------- |
46 | | Opcode | Register (op1) | Register (op2) | Register (op3) | Unused |
47 |
48 | These instructions are supported:
49 |
50 | | Opcode | Assembly | Semantics |
51 | | ------ | -------- | --------- |
52 | | 0x01 | `add op1, op2, op3` | Adds the 32-bit integers in `op1` and `op2` and stores the result in `op3`. |
53 | | 0x02 | `sub op1, op2, op3` | Subtracts the 32-bit integers in `op1` and `op2` and stores the result in `op3`. |
54 | | 0x03 | `mul op1, op2, op3` | Multiplies the 32-bit integers in `op1` and `op2` and stores the result in `op3`. |
55 | | 0x04 | `div op1, op2, op3` | Divides the 32-bit signed integer in `op1` by `op2` and stores the result in `op3`. |
56 | | 0x05 | `div_unsigned op1, op2, op3` | Divides the 32-bit unsigned integer in `op1` by `op2` and stores the result in `op3`. |
57 | | 0x06 | `remainder op1, op2, op3` | Divides the 32-bit signed integer in `op1` by `op2` and stores the remainder in `op3`. The remainder has the sign of the dividend `op1` |
58 | | 0x07 | `remainder_unsigned op1, op2, op3` | Divides the 32-bit unsigned integer in `op1` by `op2` and stores the remainder in `op3`. The remainder has the sign of the dividend `op1` |
59 | | 0x08 | `add_float op1, op2, op3` | Adds the 32-bit floats in `op1` and `op2` and stores the result in `op3`. |
60 | | 0x09 | `sub_float op1, op2, op3` | Subtracts the 32-bit floats in `op1` and `op2` and stores the result in `op3`. |
61 | | 0x0a | `mul_float op1, op2, op3` | Multiplies the 32-bit floats in `op1` and `op2` and stores the result in `op3`. |
62 | | 0x0b | `div_float op1, op2, op3` | Divides the 32-bit float in `op1` by `op2` and stores the result in `op3`. |
63 | | 0x0c | `cos_float op1, op2` | Calculates the cosine of the angle given in radians in `op1` and stores the result in `op2` |
64 | | 0x0d | `sin_float op1, op2` | Calculates the sine of the angle given in radians in `op1` and stores the result in `op2` |
65 | | 0x0e | `atan2_float op1, op2, op2` | Calculates the angle of the vector (x, y) stored in `op1`, `op2` relative to the x-axis and stores the result in `op3` |
66 | | 0x0f | `sqrt_float op1, op2` | Calculates the square root of the float in `op1` and stores the result in `op2` |
67 | | 0x10 | `pow_float op1, op2` | Calculates the value of `op1` raised by the exponent in `op2` and stores the result in r3 |
68 | | 0x11 | `convert_int_float op1, op2` | Converts the 32-bit signed integer in `op1` to float and stores the result in `op2` |
69 | | 0x12 | `convert_float_int op1, op2` | Converts the 32-bit float in `op1` to a 32-bit signed integer, truncating the decimal portion, and stores the result in `op2` |
70 | | 0x13 | `cmp op1, op2, op3` | Compares the 32-bit signed integer in `op1` to `op2` and stores the result in `op3`. The result will be 0 if `op1` == `op2`, 1 if `op1` > `op2` and -1 (`0xffffffff`) if `op1` < `op2`. The result can be used with the jump instructions. |
71 | | 0x14 | `cmp_unsigned op1, op2, op3` | Compares the 32-bit unsigned integer in `op1` to `op2` and stores the result in `op3`. The result will be 0 if `op1` == `op2`, 1 if `op1` > `op2` and -1 (`0xffffffff`) if `op1` < `op2`. The result can be used with the jump instructions. |
72 | | 0x15 | `fcmp op1, op2, op3` | Compares the 32-bit float in `op1` to `op2` and stores the result in `op3`. The result will be 0 if `op1` == `op2`, 1 if `op1` > `op2` and -1 (`0xffffffff`) if `op1` < `op2`. The result can be used with the jump instructions. |
73 |
74 |
75 | *Note*: Underflow, overflow and division by zero are not reported. Floating point operations should follow the IEEE 754 standard. Conversions between float and int may result in undefined values if the precision is exceeded. All the nastiness of `NaN`s and infinities apply. Rounding modes TBD.
76 |
77 | #### Bit-wise Operations
78 | Wee Machine supports a standard set of bit-wise operations. All bit-wise operation instructions operate only on registers and have the following format:
79 |
80 | | bits 0-5 | bits 6-9 | bits 10-12 | bits 14-17 | bits 18-31 |
81 | | -------- | -------- | -------- | ---------- | ---------- |
82 | | Opcode | Register (op1) | Register (op2) | Register (op3) | Unused |
83 |
84 | The following instructions are supported:
85 |
86 | | Opcode | Assembly | Semantics |
87 | | ------ | -------- | --------- |
88 | | 0x16 | `not op1, op2` | Inverts the bits in `op1` and stores the result in `op2` |
89 | | 0x17 | `and op1, op2, op3` | Performs a bit-wise and of `op1` and `op2` and stores the result in `op3` |
90 | | 0x18 | `or op1, op2, op3` | Performs a bit-wise or of `op1` and `op2` and stores the result in `op3` |
91 | | 0x19 | `xor op1, op2, op3` | Performs a bit-wise exclusive or of `op1` and `op2` and stores the result in `op3` |
92 | | 0x1a | `shift_left op1, op2, op3` | Shifts the bits in `op1` to the left by the number of bits specified in `op2` and stores the result in `op3` |
93 | | 0x1b | `shift_right op1, op2, op3` | Shifts the bits in `op1` to the right by number of bits specified in `op2` and stores the result in `op3` |
94 |
95 | #### Jumps & Branching
96 | Wee Machine supports a variety of jumps, either directly or based on the result of a `cmp` or `fcmp`
97 | instruction. All jump target addresses are absolute. Jump instructions have the following format:
98 |
99 | | bits 0-5 | bits 6-9 | bits 10-31 | bits 32-64 |
100 | | -------- | -------- | -------- | -------- |
101 | | Opcode | Register (op1) | Unused | word2
102 |
103 | The following instructions are supported:
104 |
105 | | Opcode | Assembly | Semantics |
106 | | ------ | -------- | --------- |
107 | | 0x1c | `jump word2` | Jumps to the specified address in `word2` |
108 | | 0x1d | `jump_equal op1, word2` | Jumps to the specified relative address in `word2` if the operands of the comparison, the result of which is stored in `op1`, were equal |
109 | | 0x1e | `jump_not_equal op1, word2` | Jumps to the specified relative address in `word2` if the operands of the comparison, the result of which is stored in `op1`, were not equal |
110 | | 0x1f | `jump_less op1, word2` | Jumps to the specified relative address in `word2` if the first operand of the comparison, the result of which is stored in `op1`, was less than the second operand |
111 | | 0x20 | `jump_greater op1, word2` | Jumps to the specified relative address in `word2` if the first operand of the comparison, the result of which is stored in `op1`, was greater than the second operand |
112 | | 0x21 | `jump_less_equal op1, word2` | Jumps to the specified relative address in `word2` if the first operand of the comparison, the result of which is stored in `op1`, was less or equal to the second operand |
113 | | 0x22 | `jump_greater_equal op1, word2` | Jumps to the specified relative address in `word2` if the first operand of the comparison, the result of which is stored in `op1`, was greater or equal to the second operand |
114 |
115 | #### Memory operations
116 | Wee Machine has 16 megabytes of byte-addressable memory in which both code and data are stored, plus 16 registers that can hold data and addresses. Wee Machine provides instructions to load and store data from and to registers and memory.
117 |
118 | Memory operations can be 1 or 2 words wide. 2-word memory operations encode a 32-bit value in the second word, which can represent data or an address. The format of the first word is as follows
119 |
120 | | bits 0-5 | bits 6-9 | bits 10-13 | bits 14-31 | bits 32-63 |
121 | | -------- | -------- | -------- | ---------- | ---------- |
122 | | Opcode | Register (op1) | Register (op2) | Offset in bytes (offset) | Value (word)
123 |
124 | The following memory operations are available:
125 |
126 | | Opcode | Assembly | Semantics |
127 | | ------ | -------- | --------- |
128 | | 0x23 | `move op1, op2` | Copies the value in `op1` to `op2` |
129 | | 0x24 | `move word, op2` | Copies the 32-bit value in `word` to `op2` |
130 | | 0x25 | `load word, offset, op2` | Reads the 32-bit value at address `word` + `offset` from memory and stores it in `op2` |
131 | | 0x26 | `load op1, offset, op2` | Reads the 32-bit value at address `op1` + `offset` from memory and stores it in `op2` |
132 | | 0x27 | `store op1, word, offset` | Writes the 32-bit value in `op1` to memory at address `word` + `offset` |
133 | | 0x28 | `store op1, op2, offset` | Writes the 32-bit value in `op1` to memory at address `op2` + `offset` |
134 | | 0x29 | `load_byte word, offset, op2` | Reads the 8-bit value at address `word` + `offset` from memory and stores it in `op1` |
135 | | 0x2a | `load_byte op1, offset, op2` | Reads the 8-bit value at address `op1` + `offset` from memory and stores it in `op2` |
136 | | 0x2b | `store_byte op1, word, offset` | Writes the lowest 8 bits in `op1` to memory at address `word` + `offset` |
137 | | 0x2c | `store_byte op1, op2, offset` | Writes the lowest 8 bits in `op1` to memory at address `op2` + `offset` |
138 | | 0x2d | `load_short word, offset, op2` | Reads the 16-bit value at address `word` + `offset` from memory and stores it in `op1` |
139 | | 0x2e | `load_short op1, offset, op2` | Reads the 16-bit value at address `op1` + `offset` from memory and stores it in `op2` |
140 | | 0x2f | `store_short op1, word, offset` | Writes the lowest 16 bits in `op1` to memory at address `word` + `offset` |
141 | | 0x30 | `store_short op1, op2, offset` | Writes the lowest 16 bits in `op1` to memory at address `op2` + `offset` |
142 |
143 | #### Stack & Call Operations
144 | Wee Machine has a stack at the end of the available memory `0xffffff` which grows "downwards". The register `sp` keeps track of the top of the stack in memory. Wee Machine provides instructions to make working with
145 | the stack easier, e.g. pushing and popping values.
146 |
147 | The stack plays a pivotal role when implementing and calling functions in Wee Machine. A function can use the
148 | stack to store "local" values temporarily while the function is being executed. When calling another function,
149 | the parameters are passed to the function via the stack. Finally, the stack is also used to save the contents
150 | of registers, either because the function can not fit all local data into registers, or because another function is called that will itself modify registers.
151 |
152 | Wee Machine's calling convention works as follows:
153 |
154 | 1. The calling function (caller) saves all registers it uses to the stack, e.g. via `push`
155 | 2. The caller pushes all arguments it wants to pass to the called function (callee) to the stack. The
156 | arguments are pushed to the stack in such an order, that the last argument becomes the top of the stack. All arguments are word sized.
157 | 3. The caller calls the callee, via `call`, which will push the return address (the address of the the next instruction after `call`) onto the stack.
158 | 4. The callee executes its instructions and eventually uses `return `, which will pop the specified number of words from the stack so the stack pointer points at the return address, then pops the return address of the stack, writes it to `pc` and resumes execution.
159 | 5. The caller resumes at the instruction after `call`, with the stack pointer `sp` pointing to the location it pointed to after all arguments were pushed onto the stack. The caller pops the arguments from the stack. The callee may have returned a value in register `r0`.
160 |
161 | Memory operations can be 1 or 2 words wide. 2-word memory operations encode a 32-bit value in the second word, which can represent data or an address. The format of the first word is as follows:
162 |
163 | | bits 0-5 | bits 6-9 | bits 10-31 | bits 32-63 |
164 | | -------- | -------- | -------- | ---------- |
165 | | Opcode | Register (op1) | Number of words | Value (word2)
166 |
167 | The following stack & call operations are available:
168 |
169 | | Opcode | Assembly | Semantics |
170 | | ------ | -------- | --------- |
171 | | 0x31 | `push word2` | Decrease `sp` by 4, then write the 32-bit value `word2` to the stack at address `sp` |
172 | | 0x32 | `push op1` | decrease `sp` by 4, then write the 32-bit value in `op1` to the stack at address `sp` |
173 | | 0x33 | `stackalloc ` | Decrease `sp` by `4 * ` |
174 | | 0x34 | `pop op1` | Reads the 32-bit value at address `sp`, stores it in `op1`, then increases `sp` by 4 |
175 | | 0x35 | `pop ` | Pops the number of words from the stack by increasing `sp` by `4 * `. |
176 | | 0x36 | `call word1` | Pushes the address of the next instruction on the stack, sets `pc` to `word1` which holds the address of the first instruction of the function, and resumes execution |
177 | | 0x37 | `call op1` | Pushes the address of the next instruction on the stack, Sets `pc` to `op1` which holds the address of the first instruction of the function, and resumes execution |
178 | | 0x38 | `return ` | Decreases `sp` by `4 * `, sets `pc` to the value at address `sp`, pops one more word from the stack, and finally resumes execution |
179 |
180 | #### Ports
181 | Wee Machine supports peripherals like keyboard, mouse or graphics card. The processor communicate with these peripherals via ports. Each peripheral is assigned a port number through which the processor can read or write from and to the peripheral. Each peripheral has its own protocol through which it communicates with the processor.
182 |
183 | Port operations are 1 or 2-words wide and have the following format:
184 |
185 | | bits 0-5 | bits 6-9 | bits 10-13 | bits 14-31 | bits 32-63 |
186 | | -------- | -------- | ---------- | ---------- | ---------- |
187 | | Opcode | Register (op1) | Register (op2) | Port number | Value (word2) |
188 |
189 | The following port operations are available:
190 |
191 | | Opcode | Assembly | Semantics |
192 | | ------ | -------- | --------- |
193 | | 0x39 | `port_write op1, ` | Write the 32-bit value in `op1` to port `` |
194 | | 0x3a | `port_write word2, ` | Write the 32-bit value `word2` to port `` |
195 | | 0x3b | `port_write op2, op2` | Write the 32-bit value in `op1` to port `op2` |
196 | | 0x3c | `port_read , op1` | Read the 32-bit value from port `` and store it in `op1`. The operation may block until the peripheral has completed its work. |
197 | | 0x3d | `port_read op1, op2` | Read the 32-bit value from port `op1` and store it in `op2`. The operation may block until the peripheral has completed its work. |
198 |
199 | ### Unused opcodes
200 | All opcodes are encoded in the first 6 bits of an instruction. The instruction set ocupies opcodes `0x00` to `0x3d`, leaving
201 | only opcode `0x3f` unused. This opcode may be used in the future and is reserved.
202 |
203 | ### Peripherals
204 | Wee Machine simulates a system with a keyboard, mouse, graphics card, sound card and networking card. These peripherals are heavily simplified to make working with them simple enough for beginners. The following sections describe the peripheral capabilities and their respective port protocols.
205 |
206 | #### Keyboard
207 | TBD
208 | #### Mouse
209 | TBD
210 | #### Graphics Card
211 | TBD
212 | #### Sound Card
213 | TBD
214 | #### Networking Card
215 | TBD
216 | #### Random number generator
217 | TBD
218 | #### High precision timer
219 | TBD
220 |
221 | ### BIOS
222 | Wee Machine comes with a minimal BIOS that makes interacting with peripherals easier. The BIOS is composed of functions that are co-located in memory with the user code. The assembler knows the addresses of each BIOS function so a programmer can directly reference the function labels in their assembly program. The following sections describe the functions provided by the BIOS.
223 |
224 | TBD
225 |
226 | ### Bootup & Memory Layout
227 | When Wee Machine boots up, it reserves the memory area `0xff0000` to `0xffffff` for the stack, the area `0xfb1800` to `0xfeffff` for the memory mapped video memory (320x200 pixels, 32-bit RGBA), and the area `(0xfb1800 - BIOS code size)` to `0xfb17ff` for the BIOS code. Next, the program is loaded into memory at `0x000000` and executed. The BIOS can manage the unused memory between the program code & data and the BIOS code and provides functions to allocate and deallocate memory in this memory area. Programmers can choose to manage that memory themselves.
228 |
--------------------------------------------------------------------------------
/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
--------------------------------------------------------------------------------
/js/wee.d.ts:
--------------------------------------------------------------------------------
1 | declare module wee {
2 | interface StringMap {
3 | [key: string]: V;
4 | }
5 | interface IndexedMap {
6 | [key: number]: V;
7 | }
8 | class ParserResult {
9 | instructions: Array;
10 | labels: StringMap;
11 | diagnostics: Array;
12 | constructor(instructions: Array, labels: StringMap, diagnostics: Array);
13 | }
14 | class AssemblerResult {
15 | code: Uint8Array;
16 | instructions: Array;
17 | labels: StringMap;
18 | patches: Array;
19 | diagnostics: Array;
20 | constructor(code: Uint8Array, instructions: Array, labels: StringMap, patches: Array, diagnostics: Array);
21 | }
22 | class Assembler {
23 | assemble(source: string): AssemblerResult;
24 | parse(tokens: Array): ParserResult;
25 | emit(instructions: Array, labels: StringMap, diagnostics: Array): AssemblerResult;
26 | static getRegisterIndex(reg: Token): number;
27 | static encodeOpRegRegReg(op: number, reg1: number, reg2: number, reg3: number): number;
28 | static encodeOpRegNum(op: number, reg: number, num: number): number;
29 | static encodeOpRegRegNum(op: number, reg1: number, reg2: number, num: number): number;
30 | }
31 | class Patch {
32 | address: number;
33 | label: Token;
34 | constructor(address: number, label: Token);
35 | }
36 | class Label {
37 | token: Token;
38 | instructionIndex: number;
39 | constructor(token: Token, instructionIndex: number);
40 | }
41 | interface Instruction {
42 | address: number;
43 | emit(view: DataView, address: number, patches: Array, diagnostics: Array): number;
44 | }
45 | }
46 | declare module wee {
47 | class Position {
48 | line: number;
49 | column: number;
50 | index: number;
51 | constructor(line?: number, column?: number, index?: number);
52 | }
53 | class Range {
54 | source: string;
55 | start: Position;
56 | end: Position;
57 | constructor(source: string);
58 | length(): number;
59 | }
60 | enum Severity {
61 | Debug,
62 | Info,
63 | Warning,
64 | Error,
65 | }
66 | class Diagnostic {
67 | severity: Severity;
68 | range: Range;
69 | message: string;
70 | constructor(severity: Severity, range: Range, message: string);
71 | toString(): string;
72 | }
73 | }
74 | declare module wee {
75 | enum TokenType {
76 | IntegerLiteral,
77 | FloatLiteral,
78 | StringLiteral,
79 | Identifier,
80 | Opcode,
81 | Keyword,
82 | Register,
83 | Colon,
84 | Coma,
85 | EndOfFile,
86 | }
87 | class Token {
88 | range: Range;
89 | type: TokenType;
90 | value: string | number;
91 | constructor(range: Range, type: TokenType, value?: string | number);
92 | }
93 | class Tokenizer {
94 | private isDigit(char);
95 | private isHexDigit(char);
96 | private isBinaryDigit(char);
97 | private isAlpha(char);
98 | private isWhitespace(char);
99 | private getIdentifierType(identifier);
100 | tokenize(source: string): Token[];
101 | }
102 | }
103 | declare module wee.tests {
104 | function runTests(): void;
105 | }
106 | declare module wee {
107 | class VirtualMachine {
108 | }
109 | }
110 |
--------------------------------------------------------------------------------
/js/wee.js.map:
--------------------------------------------------------------------------------
1 | {"version":3,"file":"wee.js","sourceRoot":"","sources":["../src/Assembler.ts","../src/Diagnostic.ts","../src/Lexer.ts","../src/Tests.ts","../src/VirtualMachine.ts"],"names":[],"mappings":"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"}
--------------------------------------------------------------------------------
/src/Assembler.ts:
--------------------------------------------------------------------------------
1 | module wee {
2 | export interface StringMap {
3 | [key: string] : V;
4 | }
5 |
6 | export interface IndexedMap {
7 | [key: number] : V;
8 | }
9 |
10 | class TokenStream {
11 | private index = 0;
12 |
13 | constructor(private tokens: Array) { };
14 |
15 | next () {
16 | return this.tokens[this.index++];
17 | }
18 |
19 | peek () {
20 | return this.tokens[this.index];
21 | }
22 |
23 | lookAhead(types: TokenType | Array) {
24 | if (types instanceof Array) {
25 | if (this.tokens.length - this.index < types.length) return false;
26 | for (var i = this.index, j = 0; i < this.index + types.length; i++, j++) {
27 | let type = types[j] as TokenType;
28 | if (!(this.tokens[i].type == type)) return false;
29 | }
30 | return true;
31 | } else {
32 | if (this.index == this.tokens.length) return false;
33 | return this.tokens[this.index].type == types;
34 | }
35 | }
36 |
37 | hasLeft (tokens: number) {
38 | return tokens <= this.tokens.length - this.index;
39 | }
40 | }
41 |
42 | export class ParserResult {
43 | constructor (public instructions: Array, public labels: StringMap, public diagnostics: Array) {};
44 | }
45 |
46 | export class AssemblerResult {
47 | constructor (public code: Uint8Array, public instructions: Array, public labels: StringMap, public patches: Array, public diagnostics: Array) {};
48 | }
49 |
50 | export class Assembler {
51 | assemble (source: string): AssemblerResult {
52 | let tokens = new Tokenizer().tokenize(source);
53 | let parserResult = this.parse(tokens);
54 | return this.emit(parserResult.instructions, parserResult.labels, parserResult.diagnostics);
55 | }
56 |
57 | parse (tokens: Array): ParserResult {
58 | let instructions = new Array();
59 | let diagnostics = new Array();
60 | let stream = new TokenStream(tokens);
61 | var labels: StringMap = {};
62 |
63 | while (true) {
64 | var token = stream.next();
65 |
66 | if (token.type == TokenType.EndOfFile) {
67 | break;
68 | }
69 |
70 | // Label
71 | if (token.type == TokenType.Identifier) {
72 | if (!stream.lookAhead(TokenType.Colon)) {
73 | let otherToken = stream.next();
74 | diagnostics.push(new Diagnostic(Severity.Error, otherToken.range, `Expected a colon (:) after the label ${token.value}, got ${otherToken.value}`));
75 | break;
76 | }
77 | stream.next();
78 | let label = new Label(token, instructions.length);
79 | if (labels[token.value]) {
80 | let otherLabel = labels[token.value] as Label;
81 | diagnostics.push(new Diagnostic(Severity.Error, token.range, `Label '${token.value} already defined on line ${otherLabel.token.range.start.line}.`));
82 | break;
83 | } else {
84 | labels[token.value] = label;
85 | }
86 | continue;
87 | }
88 |
89 | // data
90 | if (token.value == "byte" || token.value == "short" || token.value == "integer" || token.value == "float" || token.value == "string") {
91 | if (!stream.hasLeft(1)) {
92 | diagnostics.push(new Diagnostic(Severity.Error, token.range, `Data definition is missing a value.`));
93 | break;
94 | }
95 | let literal = stream.next();
96 | if ((token.value == "byte" || token.value == "short" || token.value == "integer") && literal.type != TokenType.IntegerLiteral) {
97 | diagnostics.push(new Diagnostic(Severity.Error, token.range, `Defining ${token.value} data requires an integer value (123, 0xff, 0b1101), got ${literal.value}.`));
98 | break;
99 | }
100 | if (token.value == "float" && literal.type != TokenType.FloatLiteral) {
101 | diagnostics.push(new Diagnostic(Severity.Error, token.range, `Defining ${token.value} data requires a float value (123.456), got ${literal.value}.`));
102 | break;
103 | }
104 | if (token.value == "string" && literal.type != TokenType.StringLiteral) {
105 | diagnostics.push(new Diagnostic(Severity.Error, token.range, `Defining ${token.value} data requires a string value ("Hello world"), got ${literal.value}.`));
106 | break;
107 | }
108 | instructions.push(new Data(token, literal));
109 | continue;
110 | }
111 |
112 | // halt
113 | if (token.value == "halt") {
114 | instructions.push(new Halt(token));
115 | continue;
116 | }
117 |
118 | // arithmetic operations, 2 operands
119 | if (token.value == "cos_float" || token.value == "sin_float" ||
120 | token.value == "sqrt_float" || token.value == "pow_float" ||
121 | token.value == "convert_float_int" || token.value == "convert_int_float") {
122 | if (!stream.lookAhead([TokenType.Register, TokenType.Coma, TokenType.Register])) {
123 | diagnostics.push(new Diagnostic(Severity.Error, token.range, `Arithmetic instruction ${token.value} requires 2 register operands.`));
124 | break;
125 | }
126 | let op1 = stream.next();
127 | stream.next();
128 | let op2 = stream.next();
129 | instructions.push(new ArithmeticInstruction(token, op1, op2, null));
130 | continue;
131 | }
132 |
133 | // arithmetic operations, 3 operands
134 | if (token.value == "add" || token.value == "sub" || token.value == "mul" || token.value == "div" || token.value == "div_unsigned" ||
135 | token.value == "remainder" || token.value == "remainder_unsigned" ||
136 | token.value == "add_float" || token.value == "sub_float" || token.value == "mul_float" || token.value == "div_float" ||
137 | token.value == "atan2_float" ||
138 | token.value == "cmp" || token.value == "cmp_unsigned" || token.value == "fcmp") {
139 | if (!stream.lookAhead([TokenType.Register, TokenType.Coma, TokenType.Register, TokenType.Coma, TokenType.Register])) {
140 | diagnostics.push(new Diagnostic(Severity.Error, token.range, `Arithmetic instruction ${token.value} requires 3 register operands.`));
141 | break;
142 | }
143 | let op1 = stream.next();
144 | stream.next();
145 | let op2 = stream.next();
146 | stream.next();
147 | let op3 = stream.next();
148 | instructions.push(new ArithmeticInstruction(token, op1, op2, op3));
149 | continue;
150 | }
151 |
152 | // bit-wise operations, 2 operands
153 | if (token.value == "not") {
154 | if (!stream.lookAhead([TokenType.Register, TokenType.Coma, TokenType.Register])) {
155 | diagnostics.push(new Diagnostic(Severity.Error, token.range, `Bit-wise instruction ${token.value} requires 2 register operands.`));
156 | break;
157 | }
158 | let op1 = stream.next();
159 | stream.next();
160 | let op2 = stream.next();
161 | instructions.push(new BitwiseInstruction(token, op1, op2, null));
162 | continue;
163 | }
164 |
165 | // bit-wise operations, 3 operands
166 | if (token.value == "and" || token.value == "or" || token.value == "xor" ||
167 | token.value == "shift_left" || token.value == "shift_right") {
168 | if (!stream.lookAhead([TokenType.Register, TokenType.Coma, TokenType.Register, TokenType.Coma, TokenType.Register])) {
169 | diagnostics.push(new Diagnostic(Severity.Error, token.range, `Bit-wise instruction ${token.value} requires 2 register operands.`));
170 | break;
171 | }
172 | let op1 = stream.next();
173 | stream.next();
174 | let op2 = stream.next();
175 | stream.next();
176 | let op3 = stream.next();
177 | instructions.push(new BitwiseInstruction(token, op1, op2, op3));
178 | continue;
179 | }
180 |
181 | // Jumps and branching, 1 operand
182 | if (token.value == "jump") {
183 | if (!(stream.lookAhead(TokenType.IntegerLiteral) || stream.lookAhead(TokenType.Identifier))) {
184 | diagnostics.push(new Diagnostic(Severity.Error, token.range, `Jump/branch instruction ${token.value} requires an address as operand, e.g. 0xa000 or LABEL.`));
185 | break;
186 | }
187 | instructions.push(new JumpInstruction(token, stream.next(), null));
188 | continue;
189 | }
190 |
191 | // Jumps and branching, 2 operands
192 | if (token.value == "jump_equal" || token.value == "jump_not_equal" || token.value == "jump_less" || token.value == "jump_greater" || token.value == "jump_less_equal" || token.value == "jump_greater_equal") {
193 | if (!(stream.lookAhead([TokenType.Register, TokenType.Coma, TokenType.IntegerLiteral]) || stream.lookAhead([TokenType.Register, TokenType.Coma, TokenType.Identifier]))) {
194 | diagnostics.push(new Diagnostic(Severity.Error, token.range, `Jump/branch instruction ${token.value} requires one register operand holding the result of a comparison and an as address as the second operand, e.g. 0xa000 or LABEL.`));
195 | break;
196 | }
197 | let op1 = stream.next();
198 | stream.next();
199 | let op2 = stream.next();
200 | instructions.push(new JumpInstruction(token, op1, op2));
201 | continue;
202 | }
203 |
204 | // Memory operations, 2 operands
205 | if (token.value == "move") {
206 | if (!(
207 | stream.lookAhead([TokenType.Register, TokenType.Coma, TokenType.Register]) ||
208 | stream.lookAhead([TokenType.IntegerLiteral, TokenType.Coma, TokenType.Register]) ||
209 | stream.lookAhead([TokenType.FloatLiteral, TokenType.Coma, TokenType.Register]) ||
210 | stream.lookAhead([TokenType.Identifier, TokenType.Coma, TokenType.Register])
211 | )) {
212 | diagnostics.push(new Diagnostic(Severity.Error, token.range, `Memory instruction ${token.value} requires two register operands, or an int/float literal and a register operand, or a label and a register operand.`));
213 | break;
214 | }
215 | let op1 = stream.next();
216 | stream.next();
217 | let op2 = stream.next();
218 | instructions.push(new MemoryInstruction(token, op1, op2, null));
219 | continue;
220 | }
221 |
222 | // Memory operations, 3 operand loads
223 | if (token.value == "load" || token.value == "load_byte" || token.value == "load_short") {
224 | if (!(
225 | stream.lookAhead([TokenType.IntegerLiteral, TokenType.Coma, TokenType.IntegerLiteral, TokenType.Coma, TokenType.Register]) ||
226 | stream.lookAhead([TokenType.Identifier, TokenType.Coma, TokenType.IntegerLiteral, TokenType.Coma, TokenType.Register]) ||
227 | stream.lookAhead([TokenType.Register, TokenType.Coma, TokenType.IntegerLiteral, TokenType.Coma, TokenType.Register])
228 | )) {
229 | diagnostics.push(new Diagnostic(Severity.Error, token.range, `Memory instruction ${token.value} requires and address as an int literal, label or register, an offset as an int literal, and a register.`));
230 | break;
231 | }
232 | let op1 = stream.next();
233 | stream.next();
234 | let op2 = stream.next();
235 | stream.next();
236 | let op3 = stream.next();
237 | instructions.push(new MemoryInstruction(token, op1, op2, op3));
238 | continue;
239 | }
240 |
241 | // Memory operations, 3 operand stores
242 | if (token.value == "store" || token.value == "store_byte" || token.value == "store_short") {
243 | if (!(
244 | stream.lookAhead([TokenType.Register, TokenType.Coma, TokenType.IntegerLiteral, TokenType.Coma, TokenType.IntegerLiteral]) ||
245 | stream.lookAhead([TokenType.Register, TokenType.Coma, TokenType.Identifier, TokenType.Coma, TokenType.IntegerLiteral]) ||
246 | stream.lookAhead([TokenType.Register, TokenType.Coma, TokenType.Register, TokenType.Coma, TokenType.IntegerLiteral])
247 | )) {
248 | diagnostics.push(new Diagnostic(Severity.Error, token.range, `Memory instruction ${token.value} requires a register, an address as an int literal, label or register, and an offset as an int literal.`));
249 | break;
250 | }
251 | let op1 = stream.next();
252 | stream.next();
253 | let op2 = stream.next();
254 | stream.next();
255 | let op3 = stream.next();
256 | instructions.push(new MemoryInstruction(token, op1, op2, op3));
257 | continue;
258 | }
259 |
260 | // Stack & call operations, 1 register or literal operand
261 | if (token.value == "push" || token.value == "call") {
262 | if (!(stream.lookAhead(TokenType.Register) || stream.lookAhead(TokenType.IntegerLiteral) || stream.lookAhead(TokenType.FloatLiteral) || stream.lookAhead(TokenType.Identifier))) {
263 | diagnostics.push(new Diagnostic(Severity.Error, token.range, `Stack/call operation ${token.value} requires a register, integer or float literal or label as operand`));
264 | break;
265 | }
266 | instructions.push(new StackOrCallInstruction(token, stream.next()));
267 | continue;
268 | }
269 |
270 | // Stack & call operation, 1 integer literal or register operand
271 | if (token.value == "pop") {
272 | if (!(stream.lookAhead(TokenType.Register) || stream.lookAhead(TokenType.IntegerLiteral))) {
273 | diagnostics.push(new Diagnostic(Severity.Error, token.range, `Stack/call operation ${token.value} requires a register or integer literal as operand`));
274 | break;
275 | }
276 | instructions.push(new StackOrCallInstruction(token, stream.next()));
277 | continue;
278 | }
279 |
280 | // Stack & call operations, 1 integer literal operand
281 | if (token.value == "stackalloc" || token.value == "return") {
282 | if (!stream.lookAhead(TokenType.IntegerLiteral)) {
283 | diagnostics.push(new Diagnostic(Severity.Error, token.range, `Stack/call operation ${token.value} requires an integer literal as operand`));
284 | break;
285 | }
286 | instructions.push(new StackOrCallInstruction(token, stream.next()));
287 | continue;
288 | }
289 |
290 | // Port operation, write
291 | if (token.value == "port_write") {
292 | if (!(
293 | stream.lookAhead([TokenType.Register, TokenType.Coma, TokenType.IntegerLiteral]) ||
294 | stream.lookAhead([TokenType.IntegerLiteral, TokenType.Coma, TokenType.IntegerLiteral]) ||
295 | stream.lookAhead([TokenType.FloatLiteral, TokenType.Coma, TokenType.IntegerLiteral]) ||
296 | stream.lookAhead([TokenType.Identifier, TokenType.Coma, TokenType.IntegerLiteral]) ||
297 | stream.lookAhead([TokenType.Register, TokenType.Coma, TokenType.Register])
298 | )) {
299 | diagnostics.push(new Diagnostic(Severity.Error, token.range, `Port operation ${token.value} requires an integer or float literal or a label or a register as the first operand and an integer literal or a register as the second operand.`));
300 | break;
301 | }
302 | let op1 = stream.next();
303 | stream.next();
304 | let op2 = stream.next();
305 | instructions.push(new PortInstruction(token, op1, op2));
306 | continue;
307 | }
308 |
309 | // Port operation, read
310 | if (token.value == "port_read") {
311 | if (!(
312 | stream.lookAhead([TokenType.IntegerLiteral, TokenType.Coma, TokenType.Register]) ||
313 | stream.lookAhead([TokenType.Register, TokenType.Coma, TokenType.Register])
314 | )) {
315 | diagnostics.push(new Diagnostic(Severity.Error, token.range, `Port operation ${token.value} requires an integer literal or register as the first operand, and a register as the second operand.`));
316 | break;
317 | }
318 | let op1 = stream.next();
319 | stream.next();
320 | let op2 = stream.next();
321 | instructions.push(new PortInstruction(token, op1, op2));
322 | continue;
323 | }
324 |
325 | diagnostics.push(new Diagnostic(Severity.Error, token.range, `Expected a label, data definition or instruction, got ${token.value}`));
326 | break;
327 | }
328 |
329 | return new ParserResult(instructions, labels, diagnostics);
330 | }
331 |
332 | emit (instructions: Array, labels: StringMap, diagnostics: Array): AssemblerResult {
333 | let buffer = new ArrayBuffer(16 * 1024 * 1024);
334 | let view = new DataView(buffer);
335 | let address = 0;
336 | let patches = new Array();
337 |
338 | for (var i = 0; i < instructions.length; i++) {
339 | let instruction = instructions[i];
340 | address = instruction.emit(view, address, patches, diagnostics);
341 | }
342 |
343 | for (var i = 0; i < patches.length; i++) {
344 | let patch = patches[i];
345 | let label = labels[patch.label.value];
346 | if (label) {
347 | let address = instructions[label.instructionIndex].address;
348 | view.setUint32(patch.address, address);
349 | }
350 | }
351 |
352 | return new AssemblerResult(new Uint8Array(buffer), instructions, labels, patches, diagnostics);
353 | }
354 |
355 | static getRegisterIndex(reg: Token) {
356 | if (reg.type != TokenType.Register) throw new Error(`Unexpected token type ${reg.type}!`);
357 | if (reg.value == "pc") return 14;
358 | if (reg.value == "sp") return 15;
359 | let index = parseInt((reg.value as string).substr(1));
360 | if (index < 0 || index > 15) throw new Error("Unknown register name " + reg.value);
361 | return index;
362 | }
363 |
364 | static encodeOpRegRegReg(op: number, reg1: number, reg2: number, reg3: number) {
365 | return (op & 0x1f) |
366 | ((reg1 & 0xf) << 6) |
367 | ((reg2 & 0xf) << 10) |
368 | ((reg3 & 0xf) << 14);
369 | }
370 |
371 | static encodeOpRegNum(op: number, reg: number, num: number) {
372 | return (op & 0x1f) |
373 | ((reg & 0xf) << 6) |
374 | ((num & 0x3fffff) << 10);
375 | }
376 |
377 | static encodeOpRegRegNum(op: number, reg1: number, reg2: number, num: number) {
378 | return (op & 0x1f) |
379 | ((reg1 & 0xf) << 6) |
380 | ((reg2 & 0xf) << 10) |
381 | ((num & 0x3ffff) << 14)
382 | }
383 | }
384 |
385 | export class Patch {
386 | constructor (public address: number, public label: Token) {};
387 | }
388 |
389 | export class Label {
390 | constructor(public token: Token, public instructionIndex: number) {};
391 | }
392 |
393 | export interface Instruction {
394 | address: number;
395 |
396 | emit (view: DataView, address: number, patches: Array, diagnostics: Array): number;
397 | };
398 |
399 | class Data implements Instruction {
400 | address: number;
401 |
402 | constructor (public type: Token, public value: Token) {};
403 |
404 | emit (view: DataView, address: number, patches: Array, diagnostics: Array): number {
405 | this.address = address;
406 |
407 | if (this.type.value == "byte") {
408 | view.setUint8(address++, (this.value.value as number) & 0xff);
409 | return address;
410 | }
411 |
412 | if (this.type.value == "short") {
413 | view.setUint16(address, (this.value.value as number) & 0xffff);
414 | address += 2;
415 | return address;
416 | }
417 |
418 | if (this.type.value == "integer") {
419 | view.setUint32(address, (this.value.value as number) & 0xffffffff);
420 | address += 4;
421 | return address;
422 | }
423 |
424 | if (this.type.value == "float") {
425 | view.setFloat32(address, this.value.value as number);
426 | address += 4;
427 | return address;
428 | }
429 |
430 | if (this.type.value == "string") {
431 | let string = this.value.value as string;
432 | for (var i = 0; i < string.length; i++) {
433 | view.setUint8(address++, string.charCodeAt(i) & 0xff);
434 | }
435 | view.setUint8(address++, 0);
436 | return address;
437 | }
438 |
439 | diagnostics.push(new Diagnostic(Severity.Error, this.type.range, `Unknown data type ${this.type.value}.`));
440 | }
441 | }
442 |
443 | class Halt implements Instruction {
444 | address: number;
445 |
446 | constructor (public token: Token) {};
447 |
448 | emit (view: DataView, address: number, patches: Array, diagnostics: Array): number {
449 | this.address = address;
450 | view.setUint32(address, 0);
451 | return address + 4;
452 | }
453 | }
454 |
455 | class ArithmeticInstruction implements Instruction {
456 | address: number;
457 |
458 | constructor (public operation: Token, public operand1: Token, public operand2: Token, public operand3: Token) {};
459 |
460 | emit (view: DataView, address: number, patches: Array, diagnostics: Array): number {
461 | this.address = address;
462 |
463 | let op1 = Assembler.getRegisterIndex(this.operand1);
464 | let op2 = Assembler.getRegisterIndex(this.operand2);
465 | let op3 = this.operand3 ? Assembler.getRegisterIndex(this.operand3) : 0;
466 | let opcode = 0;
467 |
468 | if (this.operation.value == "add") opcode = 0x01;
469 | else if (this.operation.value == "sub") opcode = 0x02;
470 | else if (this.operation.value == "mul") opcode = 0x03;
471 | else if (this.operation.value == "div") opcode = 0x04;
472 | else if (this.operation.value == "div_unsigned") opcode = 0x05;
473 | else if (this.operation.value == "remainder") opcode = 0x06;
474 | else if (this.operation.value == "remainder_unsigned") opcode = 0x07;
475 | else if (this.operation.value == "add_float") opcode = 0x08;
476 | else if (this.operation.value == "sub_float") opcode = 0x09;
477 | else if (this.operation.value == "mul_float") opcode = 0x0a;
478 | else if (this.operation.value == "div_float") opcode = 0x0b;
479 | else if (this.operation.value == "cos_float") opcode = 0x0c;
480 | else if (this.operation.value == "sin_float") opcode = 0x0d;
481 | else if (this.operation.value == "atan2_float") opcode = 0x0e
482 | else if (this.operation.value == "sqrt_float") opcode = 0x0f;
483 | else if (this.operation.value == "pow_float") opcode = 0x10;
484 | else if (this.operation.value == "convert_int_float") opcode = 0x11;
485 | else if (this.operation.value == "convert_float_int") opcode = 0x12;
486 | else if (this.operation.value == "cmp") opcode = 0x13;
487 | else if (this.operation.value == "cmp_unsigned") opcode = 0x14;
488 | else if (this.operation.value == "fcmp") opcode = 0x15;
489 | else {
490 | diagnostics.push(new Diagnostic(Severity.Error, this.operation.range, `Unknown arithmetic instruction ${this.operation.value}`));
491 | return address;
492 | }
493 | view.setUint32(address, Assembler.encodeOpRegRegReg(opcode, op1, op2, op3));
494 | return address + 4;
495 | }
496 | }
497 |
498 | class BitwiseInstruction implements Instruction {
499 | address: number;
500 |
501 | constructor (public operation: Token, public operand1: Token, public operand2: Token, public operand3: Token) {};
502 |
503 | emit (view: DataView, address: number, patches: Array, diagnostics: Array): number {
504 | this.address = address;
505 |
506 | let op1 = Assembler.getRegisterIndex(this.operand1);
507 | let op2 = Assembler.getRegisterIndex(this.operand2);
508 | let op3 = this.operand3 ? Assembler.getRegisterIndex(this.operand3) : 0;
509 | let opcode = 0;
510 |
511 | if (this.operation.value == "not") opcode = 0x16;
512 | else if (this.operation.value == "and") opcode = 0x17;
513 | else if (this.operation.value == "or") opcode = 0x18;
514 | else if (this.operation.value == "xor") opcode = 0x19;
515 | else if (this.operation.value == "shift_left") opcode = 0x1a;
516 | else if (this.operation.value == "shift_right") opcode = 0x1b;
517 | else {
518 | diagnostics.push(new Diagnostic(Severity.Error, this.operation.range, `Unknown bit-wise instruction ${this.operation.value}`));
519 | return address;
520 | }
521 | view.setUint32(address, Assembler.encodeOpRegRegReg(opcode, op1, op2, op3));
522 | return address + 4;
523 | }
524 | }
525 |
526 | class JumpInstruction implements Instruction {
527 | address: number;
528 |
529 | constructor (public branchType: Token, public operand1: Token, public operand2: Token) {};
530 |
531 | emit (view: DataView, address: number, patches: Array, diagnostics: Array): number {
532 | this.address = address;
533 |
534 | if (this.branchType.value == "jump") {
535 | view.setUint32(address, 0x1c);
536 | address += 4;
537 |
538 | if (this.operand1.type == TokenType.IntegerLiteral) {
539 | view.setUint32(address, this.operand1.value as number);
540 | } else {
541 | view.setUint32(address, 0xdeadbeaf);
542 | patches.push(new Patch(address, this.operand1));
543 | }
544 | return address + 4;
545 | } else {
546 | let op1 = Assembler.getRegisterIndex(this.operand1);
547 | let opcode = 0;
548 |
549 | if (this.branchType.value == "jump_equal") opcode = 0x1d;
550 | else if (this.branchType.value == "jump_not_equal") opcode = 0x1e;
551 | else if (this.branchType.value == "jump_less") opcode = 0x1f;
552 | else if (this.branchType.value == "jump_greater") opcode = 0x20;
553 | else if (this.branchType.value == "jump_less_equal") opcode = 0x21;
554 | else if (this.branchType.value == "jump_greater_equal") opcode = 0x22;
555 | else {
556 | diagnostics.push(new Diagnostic(Severity.Error, this.branchType.range, `Unknown jump/branch instruction ${this.branchType.value}`));
557 | return address;
558 | }
559 |
560 | view.setUint32(address, Assembler.encodeOpRegNum(opcode, op1, 0));
561 | address += 4;
562 |
563 | if (this.operand2.type == TokenType.IntegerLiteral) {
564 | view.setUint32(address, this.operand2.value as number);
565 | } else {
566 | view.setUint32(address, 0xdeadbeaf);
567 | patches.push(new Patch(address, this.operand2));
568 | }
569 | return address + 4;
570 | }
571 | }
572 | }
573 |
574 | class MemoryInstruction implements Instruction {
575 | address: number;
576 |
577 | constructor (public operation: Token, public operand1: Token, public operand2: Token, public operand3: Token) {};
578 |
579 | emit (view: DataView, address: number, patches: Array, diagnostics: Array): number {
580 | this.address = address;
581 |
582 | if (this.operation.value == "move") {
583 | let op2 = Assembler.getRegisterIndex(this.operand2);
584 |
585 | if (this.operand1.type == TokenType.Register) {
586 | let op1 = Assembler.getRegisterIndex(this.operand1);
587 | view.setUint32(address, Assembler.encodeOpRegRegNum(0x23, op1, op2, 0));
588 | } else if (this.operand1.type == TokenType.IntegerLiteral) {
589 | let op1 = this.operand1.value as number;
590 | view.setUint32(address, Assembler.encodeOpRegRegNum(0x24, 0, op2, 0));
591 | address += 4;
592 | view.setUint32(address, op1);
593 | } else if (this.operand1.type == TokenType.FloatLiteral) {
594 | let op1 = this.operand1.value as number;
595 | view.setUint32(address, Assembler.encodeOpRegRegNum(0x24, 0, op2, 0));
596 | address += 4;
597 | view.setFloat32(address, op1);
598 | } else if (this.operand1.type == TokenType.Identifier) {
599 | view.setUint32(address, Assembler.encodeOpRegRegNum(0x24, 0, op2, 0));
600 | address += 4;
601 | view.setUint32(address, 0xdeadbeaf);
602 | patches.push(new Patch(address, this.operand1));
603 | } else {
604 | diagnostics.push(new Diagnostic(Severity.Error, this.operation.range, `Memory instruction ${this.operation.value} only operates on registers, float literals, integer litaterals or labels`));
605 | return address;
606 | }
607 | } else if (this.operation.value == "load" || this.operation.value == "load_byte" || this.operation.value == "load_short") {
608 | let offset = this.operand2.value as number;
609 | let op2 = Assembler.getRegisterIndex(this.operand3);
610 | if (this.operand1.type == TokenType.Register) {
611 | let op1 = Assembler.getRegisterIndex(this.operand1);
612 | let opcode = 0;
613 | if (this.operation.value == "load") opcode = 0x26;
614 | else if (this.operation.value == "load_byte") opcode = 0x2a;
615 | else if (this.operation.value == "load_short") opcode = 0x2e;
616 | view.setUint32(address, Assembler.encodeOpRegRegNum(opcode, op1, op2, offset));
617 | } else if (this.operand1.type == TokenType.IntegerLiteral || this.operand1.type == TokenType.Identifier) {
618 | let opcode = 0;
619 | if (this.operation.value == "load") opcode = 0x25;
620 | else if (this.operation.value == "load_byte") opcode = 0x29;
621 | else if (this.operation.value == "load_short") opcode = 0x2d;
622 | view.setUint32(address, Assembler.encodeOpRegRegNum(opcode, 0, op2, offset));
623 | address += 4;
624 |
625 | if (this.operand1.type == TokenType.IntegerLiteral) {
626 | let op1 = this.operand1.value as number;
627 | view.setUint32(address, op1);
628 | } else {
629 | view.setUint32(address, 0xdeadbeaf);
630 | patches.push(new Patch(address, this.operand1));
631 | }
632 | } else {
633 | diagnostics.push(new Diagnostic(Severity.Error, this.operation.range, `Memory instruction ${this.operation.value} only operates on registers, integer litaterals or labels`));
634 | return address;
635 | }
636 | } else if (this.operation.value == "store" || this.operation.value == "store_byte" || this.operation.value == "store_short") {
637 | let offset = this.operand3.value as number;
638 | let op1 = Assembler.getRegisterIndex(this.operand1);
639 | if (this.operand2.type == TokenType.Register) {
640 | let op2 = Assembler.getRegisterIndex(this.operand2);
641 | let opcode = 0;
642 | if (this.operation.value == "store") opcode = 0x28;
643 | else if (this.operation.value == "store_byte") opcode = 0x2c;
644 | else if (this.operation.value == "store_short") opcode = 0x30;
645 | view.setUint32(address, Assembler.encodeOpRegRegNum(opcode, op1, op2, offset));
646 | } else if (this.operand2.type == TokenType.IntegerLiteral || this.operand2.type == TokenType.Identifier) {
647 | let opcode = 0;
648 | if (this.operation.value == "store") opcode = 0x27;
649 | else if (this.operation.value == "store_byte") opcode = 0x2b;
650 | else if (this.operation.value == "store_short") opcode = 0x2f;
651 | view.setUint32(address, Assembler.encodeOpRegRegNum(opcode, op1, 0, offset));
652 | address += 4;
653 |
654 | if (this.operand2.type == TokenType.IntegerLiteral) {
655 | let op2 = this.operand2.value as number;
656 | view.setUint32(address, op2);
657 | } else {
658 | view.setUint32(address, 0xdeadbeaf);
659 | patches.push(new Patch(address, this.operand2));
660 | }
661 | } else {
662 | diagnostics.push(new Diagnostic(Severity.Error, this.operation.range, `Memory instruction ${this.operation.value} only operates on registers, integer litaterals or labels`));
663 | return address;
664 | }
665 | } else {
666 | diagnostics.push(new Diagnostic(Severity.Error, this.operation.range, `Unknown memory instruction ${this.operation.value}.`));
667 | return address;
668 | }
669 |
670 | return address + 4;
671 | }
672 | }
673 |
674 | class StackOrCallInstruction implements Instruction {
675 | address: number;
676 |
677 | constructor (public operation: Token, public operand1: Token) {};
678 |
679 | emit (view: DataView, address: number, patches: Array, diagnostics: Array): number {
680 | this.address = address;
681 |
682 | if (this.operation.value == "push") {
683 | if (this.operand1.type == TokenType.Register) {
684 | let register = Assembler.getRegisterIndex(this.operand1);
685 | view.setUint32(address, Assembler.encodeOpRegNum(0x32, register, 0));
686 | } else if (this.operand1.type == TokenType.IntegerLiteral) {
687 | view.setUint32(address, Assembler.encodeOpRegNum(0x31, 0, 0));
688 | address += 4;
689 | view.setUint32(address, this.operand1.value as number);
690 | } else if (this.operand1.type == TokenType.FloatLiteral) {
691 | view.setUint32(address, Assembler.encodeOpRegNum(0x31, 0, 0));
692 | address += 4;
693 | view.setFloat32(address, this.operand1.value as number);
694 | } else if (this.operand1.type == TokenType.Identifier) {
695 | view.setUint32(address, Assembler.encodeOpRegNum(0x31, 0, 0));
696 | address += 4;
697 | view.setUint32(address, 0xdeadbeaf);
698 | patches.push(new Patch(address, this.operand1));
699 | }
700 | } else if (this.operation.value == "stackalloc") {
701 | view.setUint32(address, Assembler.encodeOpRegNum(0x33, 0, this.operand1.value as number));
702 | } else if (this.operation.value == "pop") {
703 | if (this.operand1.type == TokenType.Register) {
704 | let register = Assembler.getRegisterIndex(this.operand1);
705 | view.setUint32(address, Assembler.encodeOpRegNum(0x34, register, 0));
706 | } else {
707 | view.setUint32(address, Assembler.encodeOpRegNum(0x35, 0, this.operand1.value as number));
708 | }
709 | } else if (this.operation.value == "call") {
710 | if (this.operand1.type == TokenType.Register) {
711 | let register = Assembler.getRegisterIndex(this.operand1);
712 | view.setUint32(address, Assembler.encodeOpRegNum(0x37, register, 0));
713 | } else if (this.operand1.type == TokenType.IntegerLiteral) {
714 | view.setUint32(address, Assembler.encodeOpRegNum(0x36, 0, 0));
715 | address += 4;
716 | view.setUint32(address, this.operand1.value as number);
717 | } else if (this.operand1.type == TokenType.FloatLiteral) {
718 | view.setUint32(address, Assembler.encodeOpRegNum(0x36, 0, 0));
719 | address += 4;
720 | view.setFloat32(address, this.operand1.value as number);
721 | } else if (this.operand1.type == TokenType.Identifier) {
722 | view.setUint32(address, Assembler.encodeOpRegNum(0x36, 0, 0));
723 | address += 4;
724 | view.setUint32(address, 0xdeadbeaf);
725 | patches.push(new Patch(address, this.operand1));
726 | }
727 | } else if (this.operation.value == "return") {
728 | view.setUint32(address, Assembler.encodeOpRegNum(0x38, 0, this.operand1.value as number));
729 | } else {
730 | diagnostics.push(new Diagnostic(Severity.Error, this.operation.range, `Unknown stack/call instruction ${this.operation.value}`));
731 | return address;
732 | }
733 |
734 | return address + 4;
735 | }
736 | }
737 |
738 | class PortInstruction implements Instruction {
739 | address: number;
740 |
741 | constructor (public operation: Token, public operand1: Token, public operand2: Token) {};
742 |
743 | emit (view: DataView, address: number, patches: Array, diagnostics: Array): number {
744 | this.address = address;
745 |
746 | if (this.operation.value == "port_write") {
747 | if (this.operand2.type == TokenType.IntegerLiteral) {
748 | let portNumber = this.operand2.value as number;
749 | if (this.operand1.type == TokenType.Register) {
750 | let register = Assembler.getRegisterIndex(this.operand1);
751 | view.setUint32(address, Assembler.encodeOpRegRegNum(0x39, register, 0, portNumber));
752 | } else if (this.operand1.type == TokenType.IntegerLiteral) {
753 | view.setUint32(address, Assembler.encodeOpRegRegNum(0x3a, 0, 0, portNumber));
754 | address += 4;
755 | view.setUint32(address, this.operand1.value as number);
756 | } else if (this.operand1.type == TokenType.FloatLiteral) {
757 | view.setUint32(address, Assembler.encodeOpRegRegNum(0x3a, 0, 0, portNumber));
758 | address += 4;
759 | view.setFloat32(address, this.operand1.value as number);
760 | } else if (this.operand1.type == TokenType.Identifier) {
761 | view.setUint32(address, Assembler.encodeOpRegRegNum(0x3a, 0, 0, portNumber));
762 | address += 4;
763 | view.setUint32(address, 0xdeadbeaf);
764 | patches.push(new Patch(address, this.operand1));
765 | }
766 | } else {
767 | let register1 = Assembler.getRegisterIndex(this.operand1);
768 | let register2 = Assembler.getRegisterIndex(this.operand2);
769 | view.setUint32(address, Assembler.encodeOpRegRegNum(0x3b, register1, register2, 0));
770 | }
771 | } else if (this.operation.value == "port_read") {
772 | if (this.operand1.type == TokenType.IntegerLiteral) {
773 | let portNumber = this.operand1.value as number;
774 | let register = Assembler.getRegisterIndex(this.operand2);
775 | view.setUint32(address, Assembler.encodeOpRegRegNum(0x3c, register, 0, portNumber));
776 | } else {
777 | let register1 = Assembler.getRegisterIndex(this.operand1);
778 | let register2 = Assembler.getRegisterIndex(this.operand2);
779 | view.setUint32(address, Assembler.encodeOpRegRegNum(0x3d, register1, register2, 0));
780 | }
781 | } else {
782 | diagnostics.push(new Diagnostic(Severity.Error, this.operation.range, `Unknown port instruction ${this.operation.value}`));
783 | return address;
784 | }
785 | return address + 4;
786 | }
787 | }
788 | }
--------------------------------------------------------------------------------
/src/Diagnostic.ts:
--------------------------------------------------------------------------------
1 | module wee {
2 | /**
3 | * Describes a position within a source text as line/column (both starting at one) and absolute
4 | * character index (starting at 0).
5 | */
6 | export class Position {
7 | constructor (public line: number = 0, public column: number = 0, public index: number = 0) { }
8 | }
9 |
10 | /**
11 | * Describes the location of a segment within a source text.
12 | */
13 | export class Range {
14 | start = new Position();
15 | end = new Position();
16 |
17 | constructor (public source: string) {};
18 |
19 | length () {
20 | return this.end.index - this.start.index;
21 | }
22 | }
23 |
24 | /**
25 | * Severity of a Diagnostic.
26 | */
27 | export enum Severity {
28 | Debug = "Debug",
29 | Info = "Info",
30 | Warning = "Warning",
31 | Error = "Error"
32 | }
33 |
34 | /**
35 | *
36 | */
37 | export class Diagnostic {
38 | constructor (public severity: Severity, public range: Range, public message: string) {};
39 |
40 | toString () {
41 | let lines = this.range.source.split(/\r?\n/);
42 | let result = `${this.severity} (${this.range.start.line}):${this.range.start.column}: ${this.message}\n\n `;
43 | let line = lines[this.range.start.line - 1];
44 | result += line + "\n ";
45 | let startColumn = this.range.start.column;
46 | let endColumn = this.range.start.line != this.range.end.line ? line.length : this.range.end.column;
47 | for (var i = 1; i <= line.length; i++) {
48 | if (i >= startColumn && i < endColumn) {
49 | result += "~";
50 | } else {
51 | result += line.charAt(i - 1) == '\t' ? '\t' : ' ';
52 | }
53 | }
54 | result += "\n";
55 | return result;
56 | }
57 | }
58 | }
--------------------------------------------------------------------------------
/src/Lexer.ts:
--------------------------------------------------------------------------------
1 | module wee {
2 | export enum TokenType {
3 | IntegerLiteral = "IntegerLiteral",
4 | FloatLiteral = "FloatLiteral",
5 | StringLiteral = "StringLiteral",
6 | Identifier = "Identifier",
7 | Opcode = "Opcode",
8 | Keyword = "Keyword",
9 | Register = "Register",
10 | Colon = "Colon",
11 | Coma = "Coma",
12 | EndOfFile = "EndOfFile"
13 | }
14 |
15 | export class Token {
16 | constructor (public range: Range, public type: TokenType, public value: string | number = null) {}
17 | }
18 |
19 | class CharacterStream {
20 | index: number = 0;
21 | line: number = 1;
22 | column: number = 1;
23 | private range: Range;
24 |
25 | constructor (public source: string) {}
26 |
27 | peek() {
28 | return this.source.charAt(this.index);
29 | }
30 |
31 | next() {
32 | let char = this.source.charAt(this.index);
33 | this.index++;
34 | this.column++;
35 | if (char == "\n") {
36 | this.line++;
37 | this.column = 1;
38 | }
39 | return char;
40 | }
41 |
42 | startRange() {
43 | let range = new Range(this.source);
44 | range.start.line = this.line;
45 | range.start.column = this.column;
46 | range.start.index = this.index;
47 | this.range = range;
48 | }
49 |
50 | endRange() {
51 | let range = this.range;
52 | range.end.line = this.line;
53 | range.end.column = this.column;
54 | range.end.index = this.index;
55 | this.range = null;
56 | return range;
57 | }
58 | }
59 |
60 | var OPCODES = [
61 | "halt",
62 | "add", "sub", "mul", "div", "div_unsigned", "remainder", "remainder_unsigned", "add_float", "sub_float", "mul_float", "div_float", "cos_float", "sin_float", "atan2_float", "sqrt_float", "pow_float", "convert_int_float", "convert_float_int", "cmp", "cmp_unsigned", "fcmp",
63 | "not", "and", "or", "xor", "shift_left", "shift_right",
64 | "jump", "jump_equal", "jump_not_equal", "jump_less", "jump_greater", "jump_less_equal", "jump_greater_equal",
65 | "move", "load", "store", "load_byte", "store_byte", "load_short", "store_short",
66 | "push", "stackalloc", "pop", "call", "return",
67 | "port_write", "port_read"
68 | ];
69 |
70 | var KEYWORDS = [
71 | "byte", "short", "integer", "float", "string"
72 | ]
73 |
74 | var REGISTERS = [ "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "r13", "pc", "sp" ];
75 |
76 | export class Tokenizer {
77 | private isDigit (char: string) {
78 | return char >= '0' && char <= '9';
79 | }
80 |
81 | private isHexDigit (char: string) {
82 | var lowerCase = char.toLowerCase();
83 | return this.isDigit(char) || lowerCase >= 'a' && lowerCase <= 'f';
84 | }
85 |
86 | private isBinaryDigit (char: string) {
87 | return char >= '0' && char <= '1';
88 | }
89 |
90 | private isAlpha (char: string) {
91 | var lowerCase = char.toLowerCase();
92 | return lowerCase >= 'a' && lowerCase <= 'z';
93 | }
94 |
95 | private isWhitespace (char: string) {
96 | return char == ' ' || char == '\n' || char == '\r' || char == '\t';
97 | }
98 |
99 | private getIdentifierType (identifier: string) {
100 | for (var i = 0; i < OPCODES.length; i++) {
101 | if (identifier == OPCODES[i])
102 | return TokenType.Opcode;
103 | }
104 |
105 | for (var i = 0; i < KEYWORDS.length; i++) {
106 | if (identifier == KEYWORDS[i])
107 | return TokenType.Keyword;
108 | }
109 |
110 | for (var i = 0; i < REGISTERS.length; i++) {
111 | if (identifier == REGISTERS[i])
112 | return TokenType.Register;
113 | }
114 |
115 | return TokenType.Identifier;
116 | }
117 |
118 | tokenize (source: string) {
119 | let tokens = new Array();
120 | let stream = new CharacterStream(source);
121 |
122 | while (true) {
123 | stream.startRange();
124 | var char = stream.next();
125 |
126 | // EOF
127 | if (char.length == 0) {
128 | tokens.push(new Token(stream.endRange(), TokenType.EndOfFile));
129 | break;
130 | }
131 |
132 | // whitespace
133 | if (this.isWhitespace(char)) {
134 | while (this.isWhitespace(stream.peek())) {
135 | stream.next();
136 | }
137 | stream.endRange();
138 | continue;
139 | }
140 |
141 | // colon
142 | if (char == ':') {
143 | tokens.push(new Token(stream.endRange(), TokenType.Colon, ":"));
144 | continue;
145 | }
146 |
147 | // coma
148 | if (char == ',') {
149 | tokens.push(new Token(stream.endRange(), TokenType.Coma, ","));
150 | continue;
151 | }
152 |
153 | // hex
154 | if (char == '0' && stream.peek() == 'x') {
155 | stream.next();
156 | var number = "";
157 | while (this.isHexDigit(stream.peek())) {
158 | number += stream.next();
159 | }
160 | if (number == "") {
161 | throw new Diagnostic(Severity.Error, stream.endRange(), "Expected a hex number (0xffa12)");
162 | }
163 | tokens.push(new Token(stream.endRange(), TokenType.IntegerLiteral, parseInt(number, 16)));
164 | continue;
165 | }
166 |
167 | // binary
168 | if (char == '0' && stream.peek() == 'b') {
169 | stream.next();
170 | var number = "";
171 | while (this.isBinaryDigit(stream.peek())) {
172 | number += stream.next();
173 | }
174 | if (number == "") {
175 | throw new Diagnostic(Severity.Error, stream.endRange(), "Expected a binary number (0b010111)");
176 | }
177 | tokens.push(new Token(stream.endRange(), TokenType.IntegerLiteral, parseInt(number, 2)));
178 | continue;
179 | }
180 |
181 | // number
182 | if (char == '-' || this.isDigit(char)) {
183 | var number = char;
184 | var isFloat = false;
185 |
186 | while (this.isDigit(stream.peek())) {
187 | number += stream.next();
188 | }
189 |
190 | if (stream.peek() == '.') {
191 | isFloat = true;
192 | number += stream.next();
193 |
194 | while (this.isDigit(stream.peek())) {
195 | number += stream.next();
196 | }
197 | }
198 |
199 | if (number == '-') {
200 | throw new Diagnostic(Severity.Error, stream.endRange(), "Expected a negative number (-1234)");
201 | }
202 |
203 | tokens.push(new Token(stream.endRange(), isFloat ? TokenType.FloatLiteral : TokenType.IntegerLiteral, number));
204 | continue;
205 | }
206 |
207 | // identifier or keyword
208 | if (char == '_' || this.isAlpha(char)) {
209 | var identifier = char;
210 |
211 | while (this.isAlpha(stream.peek()) || this.isDigit(stream.peek()) || stream.peek() == '_') {
212 | identifier += stream.next();
213 | }
214 | tokens.push(new Token(stream.endRange(), this.getIdentifierType(identifier), identifier));
215 | continue;
216 | }
217 |
218 | // string
219 | if (char == '"') {
220 | var string = "";
221 | while (true) {
222 | char = stream.next();
223 | if (char == '\\') {
224 | let special = stream.next();
225 | if (special == '\\') {
226 | string += special;
227 | } else if (special == "n") {
228 | string += "\n";
229 | } else if (special == "r") {
230 | string += "\r";
231 | } else if (special == "t") {
232 | string += "\t";
233 | } else if (special == "\"") {
234 | string += '"';
235 | } else {
236 | string += "\\" + special;
237 | }
238 | } else if (char == "\"") {
239 | break;
240 | } else if (char.length == 0) {
241 | throw new Diagnostic(Severity.Error, stream.endRange(), "Expected closing \" character for string")
242 | } else {
243 | string += char;
244 | }
245 | }
246 | tokens.push(new Token(stream.endRange(), TokenType.StringLiteral, string));
247 | continue;
248 | }
249 |
250 | // comment
251 | if (char == '#') {
252 | while (stream.peek() != '\n' && stream.peek().length > 0) {
253 | stream.next();
254 | }
255 | continue;
256 | }
257 |
258 | throw new Diagnostic(Severity.Error, stream.endRange(), `Expected a colon (:), coma (,), number (123.2), identifier (myLabel) or keyword (move, r1)! Got '${char}'`);
259 | }
260 |
261 | return tokens;
262 | }
263 | }
264 |
265 | }
--------------------------------------------------------------------------------
/src/Tests.ts:
--------------------------------------------------------------------------------
1 | module wee.tests {
2 | class Address {
3 | constructor (public address: number) {};
4 |
5 | nextInt() {
6 | let result = this.address;
7 | this.address += 4;
8 | return result;
9 | }
10 |
11 | nextByte() {
12 | let result = this.address;
13 | this.address += 1;
14 | return result;
15 | }
16 |
17 | nextShort() {
18 | let result = this.address;
19 | this.address += 2;
20 | return result;
21 | }
22 | }
23 |
24 | function assert (expression: boolean, errorMessage: string) {
25 | if (!expression) {
26 | console.log(errorMessage);
27 | throw errorMessage;
28 | }
29 | }
30 |
31 | export function runTests () {
32 | testLexer();
33 | testParser();
34 | testAssembler();
35 | }
36 |
37 | function testLexer () {
38 | try {
39 | let tokenizer = new wee.Tokenizer();
40 | console.log(tokenizer.tokenize(`
41 | STRING: "This is a test.\\nWith a new line."
42 | INTEGER: 234234
43 | NEGATIVEINTEGER: -234234
44 | FLOAT: 2.3423
45 | NEGATIVEFLOAT: -324.3242
46 | BINARY: 0b0110101
47 | HEX: 0xffeeff
48 |
49 | # This is a comment
50 | load LABEL, r0
51 | move 123,
52 | # eol comment
53 | _41546546`
54 | ));
55 | } catch (e) {
56 | let diagnostic = e as Diagnostic;
57 | console.log(diagnostic.toString());
58 | }
59 | }
60 |
61 | function testParser () {
62 | try {
63 | let assembler = new wee.Assembler();
64 | let parserResult = assembler.parse(new wee.Tokenizer().tokenize(`
65 | helloWorld: string "Hello world"
66 | move 10, r0
67 | move 1, r1
68 | loop:
69 | sub r0, r1, r0
70 | move 0, r2
71 | cmp r0, r2, r2
72 | jump_not_equal r2, loop
73 | # end loop
74 | halt
75 | `));
76 | for (var i = 0; i < parserResult.diagnostics.length; i++) {
77 | console.log(parserResult.diagnostics[i].toString());
78 | }
79 | } catch (e) {
80 | console.log(e);
81 | }
82 | }
83 |
84 | function testAssembler () {
85 | let assembler = new Assembler();
86 | let result = assembler.assemble(`
87 | byte 0
88 | byte 1
89 | byte 2
90 | byte 3
91 | byte -123
92 | short 0xabcd
93 | short -1234
94 | integer 0xaabbccdd
95 | integer -123456
96 | float 3.299999952316284
97 | string "Hello world"
98 |
99 | halt
100 |
101 | add sp, pc, r7
102 | sub r0, r1, r2
103 | mul r0, r1, r2
104 | div r0, r1, r2
105 | div_unsigned r0, r1, r2
106 | remainder r0, r1, r2
107 | remainder_unsigned r0, r1, r2
108 | add_float r0, r1, r2
109 | sub_float r0, r1, r2
110 | mul_float r0, r1, r2
111 | div_float r0, r1, r2
112 | cos_float r0, r1
113 | sin_float r0, r1
114 | atan2_float r0, r1, r2
115 | sqrt_float r0, r1
116 | pow_float r0, r1
117 | convert_int_float r0, r1
118 | convert_float_int r0, r1
119 | cmp r0, r1, r2
120 | cmp_unsigned r0, r1, r2
121 | fcmp r0, r1, r2
122 |
123 | not r0, r1
124 | and r0, r1, r2
125 | or r0, r1, r2
126 | xor r0, r1, r2
127 | shift_left r0, r1, r2
128 | shift_right r0, r1, r2
129 |
130 | jump 0xffffffff
131 | jump -1
132 | TARGET_JMP: jump TARGET_JMP
133 | jump_equal r0, 1234
134 | TARGET_JMP_EQUAL: jump_equal r0, TARGET_JMP_EQUAL
135 | jump_not_equal r0, 1234
136 | TARGET_JMP_NOT_EQUAL: jump_not_equal r0, TARGET_JMP_NOT_EQUAL
137 | jump_less r0, 1234
138 | TARGET_JMP_LESS: jump_less r0, TARGET_JMP_LESS
139 | jump_greater r0, 1234
140 | TARGET_JMP_GREATER: jump_greater r0, TARGET_JMP_GREATER
141 | jump_less_equal r0, 1234
142 | TARGET_JMP_LESS_EQUAL: jump_less_equal r0, TARGET_JMP_LESS_EQUAL
143 | jump_greater_equal r0, 1234
144 | TARGET_JMP_GREATER_EQUAL: jump_greater_equal r0, TARGET_JMP_GREATER_EQUAL
145 |
146 | move r0, r1
147 | move -1234, r0
148 | move 1.234, r0
149 | TARGET_MOVE: move TARGET_MOVE, r0
150 | load r0, 15, r1
151 | load 1234, 15, r1
152 | TARGET_LOAD: load TARGET_LOAD, 15, r1
153 | store r0, r1, 15
154 | store r0, 1234, 15
155 | TARGET_STORE: store r0, TARGET_STORE, 15
156 | load_byte r0, 15, r1
157 | load_byte 1234, 15, r1
158 | TARGET_LOAD_BYTE: load_byte TARGET_LOAD_BYTE, 15, r1
159 | store_byte r0, r1, 15
160 | store_byte r0, 1234, 15
161 | TARGET_STORE_BYTE: store_byte r0, TARGET_STORE_BYTE, 15
162 | load_short r0, 15, r1
163 | load_short 1234, 15, r1
164 | TARGET_LOAD_SHORT: load_short TARGET_LOAD_SHORT, 15, r1
165 | store_short r0, r1, 15
166 | store_short r0, 1234, 15
167 | TARGET_STORE_SHORT: store_short r0, TARGET_STORE_SHORT, 15
168 |
169 | push 1234
170 | push 1.234
171 | TARGET_PUSH: push TARGET_PUSH
172 | push r0
173 | stackalloc 123
174 | pop r0
175 | pop 123
176 | call 1234
177 | TARGET_CALL: call TARGET_CALL
178 | call r2
179 | return 123
180 |
181 | port_write r2, 123
182 | port_write 1234, 123
183 | port_write 1.234, 123
184 | TARGET_PORT_WRITE: port_write TARGET_PORT_WRITE, 123
185 | port_write r2, r3
186 | port_read 123, r3
187 | port_read r2, r3
188 | `);
189 |
190 | let memory = result.code;
191 | if (result.diagnostics.length != 0) {
192 | for (var i = 0; i < result.diagnostics.length; i++)
193 | console.log(result.diagnostics[i].toString());
194 | assert(false, "Error assembling test.");
195 | }
196 |
197 | let view = new DataView(memory.buffer);
198 | let addr = new Address(0);
199 |
200 | // data
201 | assert(view.getInt8(addr.nextByte()) == 0, "Expected 0");
202 | assert(view.getInt8(addr.nextByte()) == 1, "Expected 1");
203 | assert(view.getInt8(addr.nextByte()) == 2, "Expected 2");
204 | assert(view.getInt8(addr.nextByte()) == 3, "Expected 3");
205 | assert(view.getInt8(addr.nextByte()) == -123, "Expected -123");
206 | assert(view.getUint16(addr.nextShort()) == 0xabcd, "Expected 0xabcd");
207 | assert(view.getInt16(addr.nextShort()) == -1234, "Expected -1234");
208 | assert(view.getUint32(addr.nextInt()) == 0xaabbccdd, "Expected 0xaabbccdd");
209 | assert(view.getInt32(addr.nextInt()) == -123456, "Expected 123456");
210 | assert(view.getFloat32(addr.nextInt()) == 3.299999952316284, "Expected 3.3");
211 | let string = "Hello world";
212 | for (var i = 0; i < string.length; i++) {
213 | assert(view.getUint8(addr.nextByte()) == string.charCodeAt(i), `Expected ${string.charAt(i)}`);
214 | }
215 | assert(view.getUint8(addr.nextByte()) == 0, "Expected 0");
216 |
217 | // halt
218 | assert(view.getUint32(addr.nextInt()) == 0, "Expected 0");
219 |
220 | // arithmetic operations
221 | assert(view.getUint32(addr.nextInt()) == Assembler.encodeOpRegRegReg(0x01, 15, 14, 7), "Invalid add");
222 | assert(view.getUint32(addr.nextInt()) == Assembler.encodeOpRegRegReg(0x02, 0, 1, 2), "Invalid sub");
223 | assert(view.getUint32(addr.nextInt()) == Assembler.encodeOpRegRegReg(0x03, 0, 1, 2), "Invalid mul");
224 | assert(view.getUint32(addr.nextInt()) == Assembler.encodeOpRegRegReg(0x04, 0, 1, 2), "Invalid div");
225 | assert(view.getUint32(addr.nextInt()) == Assembler.encodeOpRegRegReg(0x05, 0, 1, 2), "Invalid div_unsigned");
226 | assert(view.getUint32(addr.nextInt()) == Assembler.encodeOpRegRegReg(0x06, 0, 1, 2), "Invalid remainder");
227 | assert(view.getUint32(addr.nextInt()) == Assembler.encodeOpRegRegReg(0x07, 0, 1, 2), "Invalid remainder_unsigned");
228 | assert(view.getUint32(addr.nextInt()) == Assembler.encodeOpRegRegReg(0x08, 0, 1, 2), "Invalid add_float");
229 | assert(view.getUint32(addr.nextInt()) == Assembler.encodeOpRegRegReg(0x09, 0, 1, 2), "Invalid sub_float");
230 | assert(view.getUint32(addr.nextInt()) == Assembler.encodeOpRegRegReg(0x0a, 0, 1, 2), "Invalid mul_float");
231 | assert(view.getUint32(addr.nextInt()) == Assembler.encodeOpRegRegReg(0x0b, 0, 1, 2), "Invalid div_float");
232 | assert(view.getUint32(addr.nextInt()) == Assembler.encodeOpRegRegReg(0x0c, 0, 1, 0), "Invalid cos_float");
233 | assert(view.getUint32(addr.nextInt()) == Assembler.encodeOpRegRegReg(0x0d, 0, 1, 0), "Invalid sin_float");
234 | assert(view.getUint32(addr.nextInt()) == Assembler.encodeOpRegRegReg(0x0e, 0, 1, 2), "Invalid atan2_float");
235 | assert(view.getUint32(addr.nextInt()) == Assembler.encodeOpRegRegReg(0x0f, 0, 1, 0), "Invalid sqrt_float");
236 | assert(view.getUint32(addr.nextInt()) == Assembler.encodeOpRegRegReg(0x10, 0, 1, 0), "Invalid pow_float");
237 | assert(view.getUint32(addr.nextInt()) == Assembler.encodeOpRegRegReg(0x11, 0, 1, 0), "Invalid convert_int_float");
238 | assert(view.getUint32(addr.nextInt()) == Assembler.encodeOpRegRegReg(0x12, 0, 1, 0), "Invalid convert_float_int");
239 | assert(view.getUint32(addr.nextInt()) == Assembler.encodeOpRegRegReg(0x13, 0, 1, 2), "Invalid cmp");
240 | assert(view.getUint32(addr.nextInt()) == Assembler.encodeOpRegRegReg(0x14, 0, 1, 2), "Invalid cmp_unsigned");
241 | assert(view.getUint32(addr.nextInt()) == Assembler.encodeOpRegRegReg(0x15, 0, 1, 2), "Invalid fcmp");
242 |
243 | // bitwise operations
244 | assert(view.getUint32(addr.nextInt()) == Assembler.encodeOpRegRegReg(0x16, 0, 1, 0), "Invalid not");
245 | assert(view.getUint32(addr.nextInt()) == Assembler.encodeOpRegRegReg(0x17, 0, 1, 2), "Invalid not");
246 | assert(view.getUint32(addr.nextInt()) == Assembler.encodeOpRegRegReg(0x18, 0, 1, 2), "Invalid not");
247 | assert(view.getUint32(addr.nextInt()) == Assembler.encodeOpRegRegReg(0x19, 0, 1, 2), "Invalid not");
248 | assert(view.getUint32(addr.nextInt()) == Assembler.encodeOpRegRegReg(0x1a, 0, 1, 2), "Invalid not");
249 | assert(view.getUint32(addr.nextInt()) == Assembler.encodeOpRegRegReg(0x1b, 0, 1, 2), "Invalid not");
250 |
251 | // jumps & branching operations
252 | assert(view.getUint32(addr.nextInt()) == Assembler.encodeOpRegRegReg(0x1c, 0, 0, 0), "Invalid jmp");
253 | assert(view.getUint32(addr.nextInt()) == 0xffffffff, "Invalid jmp");
254 | assert(view.getUint32(addr.nextInt()) == Assembler.encodeOpRegRegReg(0x1c, 0, 0, 0), "Invalid jmp");
255 | assert(view.getInt32(addr.nextInt()) == -1, "Invalid jmp");
256 | assert(view.getUint32(addr.nextInt()) == Assembler.encodeOpRegRegReg(0x1c, 0, 0, 0), "Invalid jmp");
257 | assert(view.getUint32(addr.nextInt()) == addr.address - 8, "Invalid jmp");
258 |
259 | assert(view.getUint32(addr.nextInt()) == Assembler.encodeOpRegRegReg(0x1d, 0, 0, 0), "Invalid jmp_equal");
260 | assert(view.getInt32(addr.nextInt()) == 1234, "Invalid jmp_equal");
261 | assert(view.getUint32(addr.nextInt()) == Assembler.encodeOpRegRegReg(0x1d, 0, 0, 0), "Invalid jmp_equal");
262 | assert(view.getUint32(addr.nextInt()) == addr.address - 8, "Invalid jmp_equal");
263 |
264 | assert(view.getUint32(addr.nextInt()) == Assembler.encodeOpRegRegReg(0x1e, 0, 0, 0), "Invalid jmp_not_equal");
265 | assert(view.getInt32(addr.nextInt()) == 1234, "Invalid jmp_not_equal");
266 | assert(view.getUint32(addr.nextInt()) == Assembler.encodeOpRegRegReg(0x1e, 0, 0, 0), "Invalid jmp_not_equal");
267 | assert(view.getUint32(addr.nextInt()) == addr.address - 8, "Invalid jmp_not_equal");
268 |
269 | assert(view.getUint32(addr.nextInt()) == Assembler.encodeOpRegRegReg(0x1f, 0, 0, 0), "Invalid jmp_less");
270 | assert(view.getInt32(addr.nextInt()) == 1234, "Invalid jmp_less");
271 | assert(view.getUint32(addr.nextInt()) == Assembler.encodeOpRegRegReg(0x1f, 0, 0, 0), "Invalid jmp_less");
272 | assert(view.getUint32(addr.nextInt()) == addr.address - 8, "Invalid jmp_less");
273 |
274 | assert(view.getUint32(addr.nextInt()) == Assembler.encodeOpRegRegReg(0x20, 0, 0, 0), "Invalid jmp_greater");
275 | assert(view.getInt32(addr.nextInt()) == 1234, "Invalid jmp_greater");
276 | assert(view.getUint32(addr.nextInt()) == Assembler.encodeOpRegRegReg(0x20, 0, 0, 0), "Invalid jmp_greater");
277 | assert(view.getUint32(addr.nextInt()) == addr.address - 8, "Invalid jmp_greater");
278 |
279 | assert(view.getUint32(addr.nextInt()) == Assembler.encodeOpRegRegReg(0x21, 0, 0, 0), "Invalid jmp_less_equal");
280 | assert(view.getInt32(addr.nextInt()) == 1234, "Invalid jmp_less_equal");
281 | assert(view.getUint32(addr.nextInt()) == Assembler.encodeOpRegRegReg(0x21, 0, 0, 0), "Invalid jmp_less_equal");
282 | assert(view.getUint32(addr.nextInt()) == addr.address - 8, "Invalid jmp_less_eqaul");
283 |
284 | assert(view.getUint32(addr.nextInt()) == Assembler.encodeOpRegRegReg(0x22, 0, 0, 0), "Invalid jmp_greater_equal");
285 | assert(view.getInt32(addr.nextInt()) == 1234, "Invalid jmp_greater_equal");
286 | assert(view.getUint32(addr.nextInt()) == Assembler.encodeOpRegRegReg(0x22, 0, 0, 0), "Invalid jmp_greater_equal");
287 | assert(view.getUint32(addr.nextInt()) == addr.address - 8, "Invalid jmp_greater_eqaul");
288 |
289 | // memory operations
290 | assert(view.getUint32(addr.nextInt()) == Assembler.encodeOpRegRegNum(0x23, 0, 1, 0), "Invalid move");
291 | assert(view.getUint32(addr.nextInt()) == Assembler.encodeOpRegRegNum(0x24, 0, 0, 0), "Invalid move");
292 | assert(view.getInt32(addr.nextInt()) == -1234, "Invalid move");
293 | assert(view.getUint32(addr.nextInt()) == Assembler.encodeOpRegRegNum(0x24, 0, 0, 0), "Invalid move");
294 | assert(view.getFloat32(addr.nextInt()) == 1.2339999675750732, "Invalid move");
295 | assert(view.getUint32(addr.nextInt()) == Assembler.encodeOpRegRegNum(0x24, 0, 0, 0), "Invalid move");
296 | assert(view.getUint32(addr.nextInt()) == addr.address - 8, "Invalid move");
297 |
298 | assert(view.getUint32(addr.nextInt()) == Assembler.encodeOpRegRegNum(0x26, 0, 1, 15), "Invalid load");
299 | assert(view.getUint32(addr.nextInt()) == Assembler.encodeOpRegRegNum(0x25, 0, 1, 15), "Invalid load");
300 | assert(view.getUint32(addr.nextInt()) == 1234, "Invalid load");
301 | assert(view.getUint32(addr.nextInt()) == Assembler.encodeOpRegRegNum(0x25, 0, 1, 15), "Invalid load");
302 | assert(view.getUint32(addr.nextInt()) == addr.address - 8, "Invalid load");
303 |
304 | assert(view.getUint32(addr.nextInt()) == Assembler.encodeOpRegRegNum(0x28, 0, 1, 15), "Invalid store");
305 | assert(view.getUint32(addr.nextInt()) == Assembler.encodeOpRegRegNum(0x27, 0, 0, 15), "Invalid store");
306 | assert(view.getUint32(addr.nextInt()) == 1234, "Invalid store");
307 | assert(view.getUint32(addr.nextInt()) == Assembler.encodeOpRegRegNum(0x27, 0, 0, 15), "Invalid store");
308 | assert(view.getUint32(addr.nextInt()) == addr.address - 8, "Invalid store");
309 |
310 | assert(view.getUint32(addr.nextInt()) == Assembler.encodeOpRegRegNum(0x2a, 0, 1, 15), "Invalid load_byte");
311 | assert(view.getUint32(addr.nextInt()) == Assembler.encodeOpRegRegNum(0x29, 0, 1, 15), "Invalid load_byte");
312 | assert(view.getUint32(addr.nextInt()) == 1234, "Invalid load_byte");
313 | assert(view.getUint32(addr.nextInt()) == Assembler.encodeOpRegRegNum(0x29, 0, 1, 15), "Invalid load_byte");
314 | assert(view.getUint32(addr.nextInt()) == addr.address - 8, "Invalid load_byte");
315 |
316 | assert(view.getUint32(addr.nextInt()) == Assembler.encodeOpRegRegNum(0x2c, 0, 1, 15), "Invalid store_byte");
317 | assert(view.getUint32(addr.nextInt()) == Assembler.encodeOpRegRegNum(0x2b, 0, 0, 15), "Invalid store_byte");
318 | assert(view.getUint32(addr.nextInt()) == 1234, "Invalid store_byte");
319 | assert(view.getUint32(addr.nextInt()) == Assembler.encodeOpRegRegNum(0x2b, 0, 0, 15), "Invalid store_byte");
320 | assert(view.getUint32(addr.nextInt()) == addr.address - 8, "Invalid store_byte");
321 |
322 | assert(view.getUint32(addr.nextInt()) == Assembler.encodeOpRegRegNum(0x2e, 0, 1, 15), "Invalid load_short");
323 | assert(view.getUint32(addr.nextInt()) == Assembler.encodeOpRegRegNum(0x2d, 0, 1, 15), "Invalid load_short");
324 | assert(view.getUint32(addr.nextInt()) == 1234, "Invalid load_short");
325 | assert(view.getUint32(addr.nextInt()) == Assembler.encodeOpRegRegNum(0x2d, 0, 1, 15), "Invalid load_short");
326 | assert(view.getUint32(addr.nextInt()) == addr.address - 8, "Invalid load_short");
327 |
328 | assert(view.getUint32(addr.nextInt()) == Assembler.encodeOpRegRegNum(0x30, 0, 1, 15), "Invalid store_short");
329 | assert(view.getUint32(addr.nextInt()) == Assembler.encodeOpRegRegNum(0x2f, 0, 0, 15), "Invalid store_short");
330 | assert(view.getUint32(addr.nextInt()) == 1234, "Invalid store_short");
331 | assert(view.getUint32(addr.nextInt()) == Assembler.encodeOpRegRegNum(0x2f, 0, 0, 15), "Invalid store_short");
332 | assert(view.getUint32(addr.nextInt()) == addr.address - 8, "Invalid store_short");
333 |
334 | // stack & call operations
335 | assert(view.getUint32(addr.nextInt()) == Assembler.encodeOpRegNum(0x31, 0, 0), "Invalid push");
336 | assert(view.getUint32(addr.nextInt()) == 1234, "Invalid push");
337 | assert(view.getUint32(addr.nextInt()) == Assembler.encodeOpRegNum(0x31, 0, 0), "Invalid push");
338 | assert(view.getFloat32(addr.nextInt()) == 1.2339999675750732, "Invalid push");
339 | assert(view.getUint32(addr.nextInt()) == Assembler.encodeOpRegNum(0x31, 0, 0), "Invalid push");
340 | assert(view.getUint32(addr.nextInt()) == addr.address - 8, "Invalid push");
341 | assert(view.getUint32(addr.nextInt()) == Assembler.encodeOpRegNum(0x32, 0, 0), "Invalid push");
342 | assert(view.getUint32(addr.nextInt()) == Assembler.encodeOpRegNum(0x33, 0, 123), "Invalid stackalloc");
343 | assert(view.getUint32(addr.nextInt()) == Assembler.encodeOpRegNum(0x34, 0, 0), "Invalid pop");
344 | assert(view.getUint32(addr.nextInt()) == Assembler.encodeOpRegNum(0x35, 0, 123), "Invalid pop");
345 | assert(view.getUint32(addr.nextInt()) == Assembler.encodeOpRegNum(0x36, 0, 0), "Invalid call");
346 | assert(view.getUint32(addr.nextInt()) == 1234, "Invalid call");
347 | assert(view.getUint32(addr.nextInt()) == Assembler.encodeOpRegNum(0x36, 0, 0), "Invalid call");
348 | assert(view.getUint32(addr.nextInt()) == addr.address - 8, "Invalid call");
349 | assert(view.getUint32(addr.nextInt()) == Assembler.encodeOpRegNum(0x37, 2, 0), "Invalid call");
350 | assert(view.getUint32(addr.nextInt()) == Assembler.encodeOpRegNum(0x38, 0, 123), "Invalid call");
351 |
352 | // ports
353 | assert(view.getUint32(addr.nextInt()) == Assembler.encodeOpRegRegNum(0x39, 2, 0, 123), "Invalid port_write");
354 | assert(view.getUint32(addr.nextInt()) == Assembler.encodeOpRegRegNum(0x3a, 0, 0, 123), "Invalid port_write");
355 | assert(view.getUint32(addr.nextInt()) == 1234, "Invalid port_write");
356 | assert(view.getUint32(addr.nextInt()) == Assembler.encodeOpRegRegNum(0x3a, 0, 0, 123), "Invalid port_write");
357 | assert(view.getFloat32(addr.nextInt()) == 1.2339999675750732, "Invalid port_write");
358 | assert(view.getUint32(addr.nextInt()) == Assembler.encodeOpRegRegNum(0x3a, 0, 0, 123), "Invalid port_write");
359 | assert(view.getUint32(addr.nextInt()) == addr.address - 8, "Invalid port_write");
360 | assert(view.getUint32(addr.nextInt()) == Assembler.encodeOpRegRegNum(0x3b, 2, 3, 0), "Invalid port_write");
361 |
362 | assert(view.getUint32(addr.nextInt()) == Assembler.encodeOpRegRegNum(0x3c, 3, 0, 123), "Invalid port_read");
363 | assert(view.getUint32(addr.nextInt()) == Assembler.encodeOpRegRegNum(0x3d, 2, 3, 0), "Invalid port_read");
364 |
365 | console.log(memory);
366 | }
367 | }
--------------------------------------------------------------------------------
/src/VirtualMachine.ts:
--------------------------------------------------------------------------------
1 | module wee {
2 | export class VirtualMachine {
3 | }
4 | }
--------------------------------------------------------------------------------
/tests.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/tsconfig.json:
--------------------------------------------------------------------------------
1 |
2 | {
3 | "compilerOptions": {
4 | "module": "none",
5 | "noImplicitAny": true,
6 | "removeComments": true,
7 | "preserveConstEnums": true,
8 | "outFile": "js/wee.js",
9 | "sourceMap": true,
10 | "declaration": true
11 | },
12 | "include": [
13 | "src/**/*"
14 | ],
15 | "exclude": [
16 | "js"
17 | ]
18 | }
--------------------------------------------------------------------------------