Both the assembler and the disassembler should now support all the instructions I've layed out thus far.

This commit is contained in:
2022-08-29 18:51:48 +00:00
parent e3b4293314
commit 5f437b6869
6 changed files with 133 additions and 16 deletions
+100 -9
View File
@@ -83,13 +83,13 @@ unsigned char* ParseTokens(List* tokens) {
Heap[2] = 2 >> totalSize & 0xFF;
Heap[3] = totalSize & 0xFF;
for(int i = 0; i < 33; i++) {
if (i != 0 && i % 3 == 0) printf("\n");
printf("%02X ", Heap[i] & 0xFF);
}
printf("\n");
printf("Program Counter: %d\n", ProgramCounter);
printf("Heap Top: %#06X\n", HeapTop);
// for(int i = 0; i < 33; i++) {
// if (i != 0 && i % 3 == 0) printf("\n");
// printf("%02X ", Heap[i] & 0xFF);
// }
// printf("\n");
// printf("Program Counter: %d\n", ProgramCounter);
// printf("Heap Top: %#06X\n", HeapTop);
return Heap;
}
@@ -112,7 +112,7 @@ void HandleAssemblerDirective(void) {
switch(identifier->type) {
case STRING:
printf("[INFO] %s = '%s' (%#04X)\n", identifier->lexeme, identifier->lexeme, HeapTop);
//printf("[INFO] %s = '%s' (%#04X)\n", identifier->lexeme, identifier->lexeme, HeapTop);
for(int i = 0; i < strlen(identifier->lexeme); i++) {
//Memory[ProgramCounter + i] = PeekToken()->lexeme[i];
@@ -215,7 +215,6 @@ void HandleOperation(void) {
AdvanceParser();
//Memory[ProgramCounter] = GetInstructionMask(inst->op, inst->parameter_one);
unsigned char mask = GetInstructionMask(inst->op, inst->parameter_one);
if (mask & registerBasedOpcodeMask) {
@@ -277,6 +276,98 @@ void HandleOperation(void) {
ProgramCounter += 2;
return;
case 3: //YLD
Memory[ProgramCounter] = 0x03;
ProgramCounter++;
break;
case 4: //RET
Memory[ProgramCounter] = 0x04;
ProgramCounter++;
break;
case 5: //CALL
Memory[ProgramCounter] = 0x05;
ProgramCounter++;
if (PeekToken()->type == IDENTIFIER || PeekToken()->type == LABEL) {
const Symbol* symbol = GetSymbol(PeekToken()->lexeme);
if (!symbol) {
fprintf(stderr, "[Error] Line %d: %s is undefined.\n", PeekToken()->line, PeekToken()->lexeme);
exit(1);
}
Memory[ProgramCounter] = 2 >> symbol->address & 0xFF;
Memory[ProgramCounter + 1] = symbol->address & 0xFF;
}
else {
fprintf(stderr, "[Error] Line %d: Expected address or label.\n", PeekToken()->line);
exit(1);
}
ProgramCounter += 2;
break;
case 6: //JMP
Memory[ProgramCounter] = 0x06;
ProgramCounter++;
if (PeekToken()->type == IDENTIFIER || PeekToken()->type == LABEL) {
const Symbol* symbol = GetSymbol(PeekToken()->lexeme);
if (!symbol) {
fprintf(stderr, "[Error] Line %d: %s is undefined.\n", PeekToken()->line, PeekToken()->lexeme);
exit(1);
}
Memory[ProgramCounter] = 2 >> symbol->address & 0xFF;
Memory[ProgramCounter + 1] = symbol->address & 0xFF;
}
else {
fprintf(stderr, "[Error] Line %d: Expected address or label.\n", PeekToken()->line);
exit(1);
}
ProgramCounter += 2;
break;
case 7: //IN
Memory[ProgramCounter] = 0x07;
ProgramCounter++;
if (PeekToken()->type == NUMBER) {
int* value = PeekToken()->value;
Memory[ProgramCounter] = 2 >> *value & 0xFF;
Memory[ProgramCounter + 1] = *value & 0xFF;
}
else {
fprintf(stderr, "[Error] Line %d: Expected port number.\n", PeekToken()->line);
exit(1);
}
ProgramCounter += 2;
break;
case 8: //OUT
Memory[ProgramCounter] = 0x08;
ProgramCounter++;
if (PeekToken()->type == NUMBER) {
int* value = PeekToken()->value;
Memory[ProgramCounter] = 2 >> *value & 0xFF;
Memory[ProgramCounter + 1] = *value & 0xFF;
}
else {
fprintf(stderr, "[Error] Line %d: Expected port number.\n", PeekToken()->line);
exit(1);
}
ProgramCounter += 2;
break;
}
return;