107 lines
2.7 KiB
C
107 lines
2.7 KiB
C
/*
|
|
* ZRE - A lightweight, portable programming language for permacomputing.
|
|
* Copyright (C) 2025 zongor
|
|
*
|
|
* This program is free software: you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation, either version 3 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
*/
|
|
#include "debug.h"
|
|
#include "vm.h"
|
|
#ifdef __EMSCRIPTEN__
|
|
#include <emscripten.h>
|
|
#endif
|
|
|
|
/* #define MEMORY_SIZE 65536 /\* 64KB memory (adjustable) *\/ */
|
|
#define MEMORY_SIZE 1024
|
|
|
|
Word memory[MEMORY_SIZE] = {0}; /* Memory array */
|
|
uint32_t pc = 1; /* Program counter */
|
|
|
|
void mainloop() {
|
|
pc = step_vm(memory, MEMORY_SIZE, pc);
|
|
if (pc == 0) {
|
|
#ifdef __EMSCRIPTEN__
|
|
emscripten_cancel_main_loop(); /* this should "kill" the app. */
|
|
#else
|
|
core_dump(memory, MEMORY_SIZE);
|
|
exit(0);
|
|
#endif
|
|
}
|
|
}
|
|
|
|
int main() {
|
|
|
|
int i = 1;
|
|
memory[0].c[0] = 'z';
|
|
memory[0].c[1] = 'r';
|
|
memory[0].c[2] = 'e';
|
|
memory[0].c[3] = '0';
|
|
memory[i++].u = OP_ADD_REAL;
|
|
memory[i++].u = 102;
|
|
memory[i++].u = 103;
|
|
memory[i++].u = 103;
|
|
memory[i++].u = OP_SUB_UINT;
|
|
memory[i++].u = 100;
|
|
memory[i++].u = 101;
|
|
memory[i++].u = 100;
|
|
memory[i++].u = OP_JGT_UINT;
|
|
memory[i++].u = 100;
|
|
memory[i++].u = 99;
|
|
memory[i++].u = 1;
|
|
memory[i++].u = OP_REAL_TO_STRING;
|
|
memory[i++].u = 103;
|
|
memory[i++].u = 1;
|
|
memory[i++].u = 200;
|
|
memory[i++].u = OP_PRINT_STRING;
|
|
memory[i++].u = 201;
|
|
memory[i++].u = 1;
|
|
memory[i++].u = 1;
|
|
memory[i++].u = OP_REAL_TO_UINT;
|
|
memory[i++].u = 103;
|
|
memory[i++].u = 1;
|
|
memory[i++].u = 103;
|
|
memory[i++].u = OP_UINT_TO_STRING;
|
|
memory[i++].u = 103;
|
|
memory[i++].u = 1;
|
|
memory[i++].u = 104;
|
|
memory[i++].u = OP_PRINT_STRING;
|
|
memory[i++].u = 105;
|
|
memory[i++].u = 1;
|
|
memory[i++].u = 1;
|
|
memory[i++].u = OP_READ_STRING;
|
|
memory[i++].u = 1;
|
|
memory[i++].u = 1;
|
|
memory[i++].u = 109;
|
|
memory[i++].u = OP_PRINT_STRING;
|
|
memory[i++].u = 110;
|
|
memory[i++].u = 1;
|
|
memory[i++].u = 1;
|
|
memory[i++].u = OP_HALT;
|
|
memory[i++].u = 0;
|
|
memory[i++].u = 0;
|
|
memory[i++].u = 0;
|
|
memory[99].u = 0;
|
|
memory[100].u = 5;
|
|
memory[101].u = 1;
|
|
memory[102].q = FLOAT_TO_Q16_16(5.0f);
|
|
memory[103].q = FLOAT_TO_Q16_16(5.0f);
|
|
|
|
#ifdef __EMSCRIPTEN__
|
|
emscripten_set_main_loop(mainloop, 0, 1);
|
|
#else
|
|
while (1) {
|
|
mainloop();
|
|
}
|
|
#endif
|
|
}
|