Skip to content

Commit 336be99

Browse files
XingfengYangXingfengYang
XingfengYang
authored and
XingfengYang
committed
helloworld
1 parent 190a07a commit 336be99

File tree

7 files changed

+69
-19
lines changed

7 files changed

+69
-19
lines changed

.DS_Store

6 KB
Binary file not shown.

include/vm.h

+8-4
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ namespace lc3 {
4949
FL_NEG = 1 << 2, /* negative */
5050
};
5151

52-
enum Trap{
52+
enum Trap {
5353
TRAP_GETC = 0x20, /* get char from keyboard but not echo onto terminal */
5454
TRAP_OUT = 0x21, /* echo a char onto terminal */
5555
TRAP_PUTS = 0x22, /* echo a word string onto terminal */
@@ -60,6 +60,7 @@ namespace lc3 {
6060

6161
class VM {
6262
private:
63+
6364
bool running = false;
6465

6566
uint16_t *memory; /* memory */
@@ -72,7 +73,7 @@ namespace lc3 {
7273
uint16_t fetch();
7374

7475
/* signed extend */
75-
uint16_t signExtend(uint16_t source,uint16_t numberOfDigits);
76+
uint16_t signExtend(uint16_t source, uint16_t numberOfDigits);
7677

7778
void updateFlag(uint16_t reg);
7879

@@ -90,15 +91,18 @@ namespace lc3 {
9091
/* write into memory */
9192
uint16_t writeMemory(uint16_t address, uint16_t value);
9293

94+
void printRegister();
95+
9396
public:
94-
VM();
9597

9698
void loadProgram(std::vector<uint16_t> prog);
9799

98100
void run();
99101

100-
~VM();
102+
public:
103+
VM();
101104

105+
~VM();
102106
};
103107

104108
};

program/2048.obj

1.65 KB
Binary file not shown.

program/helloworld.bin

Whitespace-only changes.

program/rogue.obj

762 Bytes
Binary file not shown.

src/mian.cpp

+45-2
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,49 @@
77

88

99
int main(int argc, char *argv[]){
10-
11-
std::cout<<"=========lc3=========="<<std::endl;
1210
lc3::VM vm;
1311
std::vector<uint16_t> prog;
1412
prog.push_back(0b0001000000100000); /* ADD R0 R0 0 */
13+
prog.push_back(0b0001011011101111); /* ADD R3 R3 15 */
14+
prog.push_back(0b0001011011000011); /* ADD R3 R3 R3 */
15+
prog.push_back(0b0001011011000011); /* ADD R3 R3 R3 */
16+
prog.push_back(0b0001011011100101); /* ADD R3 R3 4 */
17+
prog.push_back(0b0001011011100111); /* ADD R3 R3 7 */
18+
prog.push_back(0b0111011000000000); /* STR R3 R0 0 (h 72)*/
19+
prog.push_back(0b0001011011111101); /* ADD R3 R3 -3 */
20+
prog.push_back(0b0111011000000001); /* STR R3 R0 1 (e 69)*/
21+
prog.push_back(0b0001011011100111); /* ADD R3 R3 7 */
22+
prog.push_back(0b0111011000000010); /* STR R3 R0 2 (l 76)*/
23+
prog.push_back(0b0111011000000011); /* STR R3 R0 3 (l 76)*/
24+
prog.push_back(0b0001011011100011); /* ADD R3 R3 3 */
25+
prog.push_back(0b0111011000000100); /* STR R3 R0 4 (o 79)*/
26+
prog.push_back(0b0001011011110000); /* ADD R3 R3 -16 */
27+
prog.push_back(0b0001011011110000); /* ADD R3 R3 -16 */
28+
prog.push_back(0b0001011011111101); /* ADD R3 R3 -3 */
29+
prog.push_back(0b0111011000000101); /* STR R3 R0 5 (, 44)*/
30+
prog.push_back(0b0001011011101111); /* ADD R3 R3 15 */
31+
prog.push_back(0b0001011011101111); /* ADD R3 R3 15 */
32+
prog.push_back(0b0001011011101101); /* ADD R3 R3 13 */
33+
prog.push_back(0b0111011000000110); /* STR R3 R0 6 (w 87)*/
34+
prog.push_back(0b0001011011111000); /* ADD R3 R3 -8 */
35+
prog.push_back(0b0111011000000111); /* STR R3 R0 7 (o 79)*/
36+
prog.push_back(0b0001011011100011); /* ADD R3 R3 3 */
37+
prog.push_back(0b0111011000001000); /* STR R3 R0 8 (r 82)*/
38+
prog.push_back(0b0001011011111010); /* ADD R3 R3 -6 */
39+
prog.push_back(0b0111011000001001); /* STR R3 R0 9 (l 76)*/
40+
prog.push_back(0b0001011011111000); /* ADD R3 R3 -8 */
41+
prog.push_back(0b0111011000001010); /* STR R3 R0 10 (d 68)*/
42+
prog.push_back(0b0001011011110000); /* ADD R3 R3 -16 */
43+
prog.push_back(0b0001011011110000); /* ADD R3 R3 -16 */
44+
prog.push_back(0b0001011011111101); /* ADD R3 R3 -3 */
45+
prog.push_back(0b0111011000001011); /* STR R3 R0 11 (! 33)*/
46+
prog.push_back(0b0001011011110000); /* ADD R3 R3 -16 */
47+
prog.push_back(0b0001011011111011); /* ADD R3 R3 -5 */
48+
prog.push_back(0b0111011000001100); /* STR R3 R0 12 (enter 10)*/
49+
prog.push_back(0b0001001001100000); /* ADD R1 R1 0 */
50+
prog.push_back(0b0111011000101101); /* STR R3 R1 13 */
51+
prog.push_back(0b1111000000100010); /* trap puts R0 */
52+
prog.push_back(0b0001000000100000); /* ADD R0 R0 0 */
1553
prog.push_back(0b0001001001101111); /* ADD R1 R1 15 */
1654
prog.push_back(0b0001000001000001); /* ADD R0 R1 R1 */
1755
prog.push_back(0b0001000000100010); /* ADD R0 R0 2 */
@@ -20,6 +58,11 @@ int main(int argc, char *argv[]){
2058
prog.push_back(0b0001000000100001); /* ADD R0 R0 1 */
2159
prog.push_back(0b1111000000100001); /* trap out R0 */
2260
}
61+
prog.push_back(0b1111000000100011); /* trap in */
62+
prog.push_back(0b1111000000100011); /* trap in */
63+
prog.push_back(0b1111000000100011); /* trap in */
64+
prog.push_back(0b1111000000100011); /* trap in */
65+
prog.push_back(0b1111000000100011); /* trap in */
2366
prog.push_back(0b1111000000100101); /* trap halt */
2467
vm.loadProgram(prog);
2568
vm.run();

src/vm.cpp

+16-13
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,7 @@ uint16_t VM::decode(uint16_t instruction) {
3232

3333

3434
uint16_t VM::signExtend(uint16_t source, uint16_t numberOfDigits) {
35-
if ((source >> (numberOfDigits - 1)) & 0b1) { /* negative */
36-
/* just set highest bit of source(CLZ(source)) to zero*/
35+
if ((source >> (numberOfDigits - 1)) & 1) {
3736
source |= (0xFFFF << numberOfDigits);
3837
}
3938
return source;
@@ -66,14 +65,15 @@ void VM::execute(uint16_t opcode, uint16_t instruction) {
6665
uint16_t DR = (instruction >> 9) & 0b111;
6766
uint16_t SR1 = (instruction >> 6) & 0b111;
6867
uint16_t immFlag = (instruction >> 5) & 0b1;
69-
7068
if (immFlag) { /* immediate */
71-
this->registers[DR] = this->registers[SR1] + this->signExtend(instruction & 0b11111, 5);
69+
uint16_t imm5 = this->signExtend(instruction & 0b11111, 5);
70+
this->registers[DR] = this->registers[SR1] + imm5;
7271
} else {
7372
uint16_t SR2 = instruction & (0b111);
7473
this->registers[DR] = this->registers[SR1] + this->registers[SR2];
7574
}
7675
this->updateFlag(DR); /* update cpu flag */
76+
7777
break;
7878
}
7979
case OP_LD: {
@@ -90,12 +90,12 @@ void VM::execute(uint16_t opcode, uint16_t instruction) {
9090
break;
9191
}
9292
case OP_JSR: {
93-
uint16_t flag = (instruction>>11) & 0b1;
93+
uint16_t flag = (instruction >> 11) & 0b1;
9494
this->registers[R7] = this->registers[PC];
9595
if (flag) { /* JSR */
9696
this->registers[PC] += this->signExtend(instruction & (0b11111111111), 11);
9797
} else { /* JSRR */
98-
uint16_t BaseR = (instruction>>6) & 0b111;
98+
uint16_t BaseR = (instruction >> 6) & 0b111;
9999
this->registers[PC] = this->registers[BaseR];
100100
}
101101
break;
@@ -159,6 +159,8 @@ void VM::execute(uint16_t opcode, uint16_t instruction) {
159159
}
160160
case OP_RES: {
161161
/* not used now */
162+
/* initiate an illegal opcode exception */
163+
162164
break;
163165
}
164166
case OP_LEA: {
@@ -180,6 +182,7 @@ void VM::execute(uint16_t opcode, uint16_t instruction) {
180182
}
181183

182184
void VM::printRegister() {
185+
std::cout << std::endl;
183186
std::cout << "REGISTERS: " << "R0:" << this->registers[R0] << " "
184187
<< "R1:" << this->registers[R1] << " "
185188
<< "R2:" << this->registers[R2] << " "
@@ -204,16 +207,17 @@ void VM::executeTrap(uint16_t trapCode) {
204207
break;
205208
}
206209
case TRAP_PUTS: {
207-
uint16_t *c = this->memory + this->registers[R0];
208-
while (*c) {
209-
std::putc((char) *c, stdout);
210-
++c;
210+
uint16_t offset = this->registers[R0];
211+
uint16_t c = this->readMemory(offset);
212+
while (c) {
213+
std::putc((char) c, stdout);
214+
++offset;
215+
c = this->readMemory(offset);
211216
}
212217
std::fflush(stdout);
213218
break;
214219
}
215220
case TRAP_IN: {
216-
std::cout << "Enter a character :" << std::endl;
217221
char c = getchar();
218222
std::putc(c, stdout);
219223
this->registers[R0] = (uint16_t) c;
@@ -234,8 +238,7 @@ void VM::executeTrap(uint16_t trapCode) {
234238
break;
235239
}
236240
case TRAP_HALT: {
237-
std::cout<<std::endl;
238-
std::puts("=========HALT=========");
241+
std::cout << std::endl;
239242
std::fflush(stdout);
240243
this->running = false;
241244
break;

0 commit comments

Comments
 (0)