Add non multithread mode

This commit is contained in:
2025-02-22 16:15:05 +01:00
parent f184204be7
commit 274c99f98b
4 changed files with 74 additions and 34 deletions

View File

@@ -210,9 +210,9 @@ int resolveMOV(const char *dest, const char *src) {
}
}
int resolveALU(int baseOpcode, const char *src) {
int resolveALU(int baseOpcode, const char *src, const char *dest) {
// baseOpcode is one of our special negative values for ADD, SUB, etc.
if (src[0] == 'R' || src[0] == 'r') {
if (dest[0] == 'R' || dest[0] == 'r') {
switch (baseOpcode) {
case -3:
return ADD_RN_RM;
@@ -230,6 +230,11 @@ int resolveALU(int baseOpcode, const char *src) {
return OR_RN_RM;
case -10:
return XOR_RN_RM;
default:
return -1;
}
} else if (src[0] == 'r' || src[0] == 'R' && baseOpcode < -11) {
switch (baseOpcode) {
case -12:
return INC_RN;
case -13:
@@ -467,7 +472,7 @@ uint32_t completePass(const char *source, CPU *cpu, bool erase) {
fprintf(stderr, "Error: %s requires one operand.\n", mnemonic);
return 1;
}
int resolvedOpcode = resolveALU(baseOpcode, operand1);
int resolvedOpcode = resolveALU(baseOpcode, operand1, operand2);
cpu->memory[addr++] = resolvedOpcode;
if (operand1[0] == 'R' || operand1[0] == 'r') {
int reg = parseRegister(operand1);
@@ -491,7 +496,7 @@ uint32_t completePass(const char *source, CPU *cpu, bool erase) {
fprintf(stderr, "Error: %s requires two operands.\n", mnemonic);
return 1;
}
int resolvedOpcode = resolveALU(baseOpcode, operand1);
int resolvedOpcode = resolveALU(baseOpcode, operand1, operand2);
cpu->memory[addr++] = resolvedOpcode;
int regDest = parseRegister(operand1);
cpu->memory[addr++] = regDest;
@@ -509,7 +514,7 @@ uint32_t completePass(const char *source, CPU *cpu, bool erase) {
fprintf(stderr, "Error: JMP requires one operand.\n");
return 1;
}
int resolvedOpcode = resolveALU(baseOpcode, operand1);
int resolvedOpcode = resolveALU(baseOpcode, operand1, operand2);
cpu->memory[addr++] = resolvedOpcode;
if (operand1[0] == '+' || operand1[0] == '-') {
// Relative jump: one-byte offset.
@@ -529,7 +534,7 @@ uint32_t completePass(const char *source, CPU *cpu, bool erase) {
fprintf(stderr, "Error: %s requires three operands.\n", mnemonic);
return 1;
}
int resolvedOpcode = resolveALU(baseOpcode, operand1);
int resolvedOpcode = resolveALU(baseOpcode, operand1, operand2);
cpu->memory[addr++] = resolvedOpcode;
// Encode the source operand (register or memory).
if (operand1[0] == 'R' || operand1[0] == 'r') {

View File

@@ -70,7 +70,7 @@ int getOpcode(char *mnemonic);
//
int resolveMOV(const char *dest, const char *src);
int resolveALU(int baseOpcode, const char *src);
int resolveALU(int baseOpcode, const char *src, const char *dest);
//
// The first pass scans the assembly source file to record all labels and their addresses.