commit 1022bb1cfb80b07890168f3100d8a5cdd65e943f
parent b7e539596dcbb82539906fa3fe974cf18cdffb5e
Author: Luxferre <lux@ferre>
Date: Mon, 22 Aug 2022 19:55:24 +0300
even more optimizations
Diffstat:
M | nrj.c | | | 42 | +++++++++++++++++++++--------------------- |
1 file changed, 21 insertions(+), 21 deletions(-)
diff --git a/nrj.c b/nrj.c
@@ -1,6 +1,6 @@
/*
- * NRJ (NOR and Reference Jump) OISC ANSI C emulator by Luxferre
- * Public domain
+ * NRJ (NOR and Reference Jump) OISC ANSI C emulator
+ * Created by Luxferre, 2022, public domain
* Build with: cc -Os -o nrj nrj.c
*/
#include <stdlib.h>
@@ -23,43 +23,43 @@ int kbhit() {
return select(1, &fds, NULL, NULL, &tv) > 0;
}
-struct termios tty_opts_backup, tty_opts_raw;
-void restore_term() {
- tcsetattr(STDIN_FILENO, TCSANOW, &tty_opts_backup);
-}
-
-void nrj_in(NRJWORD *ctxid, NRJWORD *val) {
+void nrj_in(NRJWORD *ctxid, NRJWORD *val) { /* context-dependent input handler */
unsigned char c;
if(*ctxid == (NRJWORD) 0) { /* for now, only emulate standard context id */
*val = (NRJWORD) 0;
- if(kbhit()) {
- if(read(0, &c, 1) > -1)
- *val = (NRJWORD) c;
- }
+ if(kbhit() && read(0, &c, 1) > -1)
+ *val = (NRJWORD) c;
}
}
-void nrj_out(NRJWORD *ctxid, NRJWORD *val) {
+void nrj_out(NRJWORD *ctxid, NRJWORD *val) { /* context-dependent output handler */
if(*ctxid == (NRJWORD) 0) /* for now, only emulate standard context id */
putchar((unsigned char) *val);
}
-void nrj_run(NRJWORD *mem, NRJWORD pc) { /* 0 - input, 1 - output, 2 - I/O context, 3 - program start */
- while(pc != MAXADDR) {
- if(mem[0]) nrj_in(&mem[2], &mem[mem[0]]);
- mem[mem[pc]] = (~(mem[mem[pc]] | mem[mem[pc+1]])) & MAXADDR;
- pc = mem[mem[pc+2]];
- mem[0] = (NRJWORD) 0;
- if(mem[1]) {
+void nrj_run(NRJWORD *mem, NRJWORD pc) { /* Main NRJ engine - just 12 lines of C within this function */
+ while(pc != MAXADDR) { /* halt if jumped to the last word */
+ if(mem[0]) { /* handle input if the first word is set, and clear it */
+ nrj_in(&mem[2], &mem[mem[0]]);
+ mem[0] = (NRJWORD) 0;
+ }
+ mem[mem[pc]] = (~(mem[mem[pc]] | mem[mem[pc+1]])) & MAXADDR; /* then perform the NOR operation */
+ pc = mem[mem[pc+2]]; /* then perform the reference jump operation */
+ if(mem[1]) { /* then handle output if the second word is set, and clear it */
nrj_out(&mem[2], &mem[mem[1]]);
mem[1] = (NRJWORD) 0;
}
}
}
+struct termios tty_opts_backup, tty_opts_raw;
+void restore_term() {
+ tcsetattr(STDIN_FILENO, TCSANOW, &tty_opts_backup);
+}
+
int main(int argc, char* argv[]) {
if(argc > 1) {
- NRJWORD mem[NRJSIZE];
+ NRJWORD mem[NRJSIZE]; /* NRJ memory: word 0 - input, 1 - output, 2 - I/O context, 3 - program start */
FILE *prog = fopen(argv[1], "rb");
if(prog) {
/* load the program */