add uint toS

This commit is contained in:
zongor 2025-06-14 14:48:11 -04:00
parent d9ab352c68
commit bf2609c6ee
3 changed files with 22 additions and 5 deletions

View File

@ -53,7 +53,7 @@ int main() {
memory[i++].u = 103;
memory[i++].u = 1;
memory[i++].u = 103;
memory[i++].u = OP_INT_TO_STRING;
memory[i++].u = OP_UINT_TO_STRING;
memory[i++].u = 103;
memory[i++].u = 1;
memory[i++].u = 104;

View File

@ -227,6 +227,22 @@ uint32_t step_vm(Word *memory, uint32_t memory_size, uint32_t pc) {
mem_strcpy(memory, buffer + i, MAX_LEN_INT32 - i, dest_addr);
return pc;
}
case OP_UINT_TO_STRING: {
uint32_t v = memory[src1_addr].u;
char buffer[MAX_LEN_INT32];
uint32_t n = v;
int i = MAX_LEN_INT32;
do {
buffer[--i] = radix_set[n % 10];
n /= 10;
} while (n > 0);
/* Ensure at least one digit is written for 0 */
if (v == 0)
buffer[--i] = '0';
/* Copy from buffer[i] to buffer + MAX_LEN_INT32 */
mem_strcpy(memory, buffer + i, MAX_LEN_INT32 - i, dest_addr);
return pc;
}
case OP_REAL_TO_STRING: {
int32_t q = memory[src1_addr].q;
char buffer[32]; /* Max 10 digits for integer part + 6 for fractional + sign

View File

@ -57,10 +57,11 @@ typedef enum {
OP_MOV, /* dest = src1 */
OP_JMP, /* jump to address src1 unconditionally */
OP_INT_TO_STRING, /* dest = src1 as str */
OP_REAL_TO_STRING, /* dest = src2 as str */
OP_READ_STRING, /* dest = src1 */
OP_PRINT_STRING, /* dest = src1 */
OP_CMP_STRING, /* dest = src1 */
OP_UINT_TO_STRING, /* dest = src1 as str */
OP_REAL_TO_STRING, /* dest = src1 as str */
OP_READ_STRING, /* dest = read as str */
OP_PRINT_STRING, /* write src1 to stdout */
OP_CMP_STRING, /* dest = src1 as str == src2 as str */
} Opcode;
uint32_t step_vm(Word *memory, uint32_t memory_size, uint32_t pc);