Add non multithread mode
This commit is contained in:
@@ -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') {
|
||||
|
@@ -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.
|
||||
|
Reference in New Issue
Block a user