26 Commits a20edd8b09 ... 8b447e8270

Tác giả SHA1 Thông báo Ngày
  ApisNecros 8b447e8270 Move string to decimal conversion to last step 1 tháng trước cách đây
  ApisNecros 392b4acf8d Add less than and equality check 1 tháng trước cách đây
  Bee Hudson a20edd8b09 Add start to intcode transpiler 1 tháng trước cách đây
  ApisNecros f833f72004 Add start to intcode transpiler 1 tháng trước cách đây
  Bee Hudson 1ffdb5ab02 Add more tests 1 tháng trước cách đây
  ApisNecros 146e649587 Add more tests 1 tháng trước cách đây
  Bee Hudson 904b77a262 Remove perl file 1 tháng trước cách đây
  ApisNecros 2cf6b9c86e Remove perl file 1 tháng trước cách đây
  Bee Hudson a9c27c6839 Update isImmediate check 4 tháng trước cách đây
  ApisNecros b973b3ebb0 Update isImmediate check 4 tháng trước cách đây
  Bee Hudson 71151ded11 Add isLabel function 4 tháng trước cách đây
  ApisNecros 0226cbc478 Add isLabel function 4 tháng trước cách đây
  Bee Hudson 44bfc312ca Move hash of labels to global scope 4 tháng trước cách đây
  ApisNecros f3f2348222 Move hash of labels to global scope 4 tháng trước cách đây
  Bee Hudson 0fec9cea29 Rename test from simple to addition 4 tháng trước cách đây
  ApisNecros 706fee431f Rename test from simple to addition 4 tháng trước cách đây
  Bee Hudson f9e605ab12 Add comments to getAddress 4 tháng trước cách đây
  ApisNecros 00aac07920 Add comments to getAddress 4 tháng trước cách đây
  Bee Hudson 26da645f6e Switch parameter parsing to separate function 4 tháng trước cách đây
  ApisNecros 1a8c27fcd8 Switch parameter parsing to separate function 4 tháng trước cách đây
  Bee Hudson e82cab0e05 Consolidate final output 4 tháng trước cách đây
  ApisNecros eaf88e0448 Consolidate final output 4 tháng trước cách đây
  Bee Hudson 7c162a5483 Swap substr for regex in getAddress 4 tháng trước cách đây
  ApisNecros cec798cadc Swap substr for regex in getAddress 4 tháng trước cách đây
  Bee Hudson b214d20bab Initial commit 5 tháng trước cách đây
  ApisNecros 473e4f4d6e Initial commit 5 tháng trước cách đây
1 tập tin đã thay đổi với 56 bổ sung13 xóa
  1. 56 13
      yaict

+ 56 - 13
yaict

@@ -6,7 +6,7 @@ const fs = require("node:fs");
  * The tape of integers
  * @type {number[]}
  */
-const tape = [];
+let tape = [];
 /**
  * The current address of the tape being modified
  * 
@@ -44,8 +44,8 @@ const ASM_DICTIONARY = {
     "out": insertOutput,
     "jnz": insertTestJump.bind(null, OP_CODE_DICTIONARY.JUMP_IF_TRUE),
     "jz": insertTestJump.bind(null, OP_CODE_DICTIONARY.JUMP_IF_FALSE),
-    "slt": instructionNotYetImplemented.bind(null, "SLT"),
-    "seq": instructionNotYetImplemented.bind(null, "SEQ"),
+    "slt": insertLessThanCheck,
+    "seq": insertEqualityCheck,
     "incb": instructionNotYetImplemented.bind(null, "INCB"),
     "hlt": insertHalt,
 };
@@ -65,6 +65,9 @@ function transpileAssembly(assembly) {
         // Call the function for this instruction, and pass the rest of the line as parameters
         ASM_DICTIONARY[instruction](...line);
     }
+
+    // Clean the values on the tape
+    tape = tape.map((inst) => strToDecimal(inst));
 }
 
 /* ASSEMBLY HANDLERS */
@@ -76,7 +79,7 @@ function transpileAssembly(assembly) {
  * @param {number} value
  */
 function loadToAddress(address, value) {
-    tape[strToDecimal(address)] = strToDecimal(value);
+    tape[strToDecimal(address)] = value;
 }
 
 /**
@@ -95,10 +98,10 @@ function insertArithmetic(opCode, operand1, operand2, outputDestination) {
     // Add the parameter mode for the two operands
     opCode = getParameterMode(operand2) + getParameterMode(operand1) + opCode;
 
-    tape[tapePointer++] = strToDecimal(opCode);
-    tape[tapePointer++] = strToDecimal(operand1);
-    tape[tapePointer++] = strToDecimal(operand2);
-    tape[tapePointer++] = strToDecimal(outputDestination);
+    tape[tapePointer++] = opCode;
+    tape[tapePointer++] = operand1;
+    tape[tapePointer++] = operand2;
+    tape[tapePointer++] = outputDestination;
 }
 
 /*
@@ -113,8 +116,8 @@ function insertInput() {
  * @param {string} outputParameter The parameter of the value to output. May be an immediate value or an address
  */
 function insertOutput(outputParameter) {
-    tape[tapePointer++] = strToDecimal(getParameterMode(outputParameter) + OP_CODE_DICTIONARY.OUTPUT);
-    tape[tapePointer++] = strToDecimal(outputParameter);
+    tape[tapePointer++] = getParameterMode(outputParameter) + OP_CODE_DICTIONARY.OUTPUT;
+    tape[tapePointer++] = outputParameter;
 }
 
 /**
@@ -125,9 +128,45 @@ function insertOutput(outputParameter) {
  * @param {string} jumpDestination The address to jump to if the test passes
  */
 function insertTestJump(opcode, testingParameter, jumpDestination) {
-    tape[tapePointer++] = strToDecimal(getParameterMode(jumpDestination) + getParameterMode(testingParameter) + opcode);
-    tape[tapePointer++] = strToDecimal(testingParameter);
-    tape[tapePointer++] = strToDecimal(jumpDestination);
+    tape[tapePointer++] = getParameterMode(jumpDestination) + getParameterMode(testingParameter) + opcode;
+    tape[tapePointer++] = testingParameter;
+    tape[tapePointer++] = jumpDestination;
+}
+
+/**
+ * Insert a less than check onto the tape
+ *
+ * @param {string} operand1 The first parameter to test. Can be either an immediate value or an address
+ * @param {string} operand2 The parameter to test against. Can be either an immediate value or an address
+ * @param {string} outputDestination The address to write the output to
+ */
+function insertLessThanCheck(operand1, operand2, outputDestination) {
+    if (!isAddress(outputDestination)) {
+        throw new WrongParameterModeError();
+    }
+
+    tape[tapePointer++] = getParameterMode(operand2) + getParameterMode(operand1) + OP_CODE_DICTIONARY.LESS_THAN;
+    tape[tapePointer++] = operand1;
+    tape[tapePointer++] = operand2;
+    tape[tapePointer++] = outputDestination;
+}
+
+/**
+ * Insert an equality check onto the tape
+ *
+ * @param {string} operand1 The first parameter to test. Can be either an immediate value or an address
+ * @param {string} operand2 The parameter to test equality against. Can be either an immediate value or an address
+ * @param {string} outputDestination The address to write the output to
+ */
+function insertEqualityCheck(operand1, operand2, outputDestination) {
+    if (!isAddress(outputDestination)) {
+        throw new WrongParameterModeError();
+    }
+
+    tape[tapePointer++] = getParameterMode(operand2) + getParameterMode(operand1) + OP_CODE_DICTIONARY.EQUALS;
+    tape[tapePointer++] = operand1;
+    tape[tapePointer++] = operand2;
+    tape[tapePointer++] = outputDestination;
 }
 
 /**
@@ -179,6 +218,10 @@ function getParameterMode(parameter) {
  * @returns {number}
  */
 function strToDecimal(decimalValue) {
+    if (typeof decimalValue == "number") {
+        return decimalValue;
+    }
+
     return parseInt(decimalValue.replace(/^0d/, ""), 10);
 }