From 0e36599524b6165d2b5acb568560a6c2d4c545fb Mon Sep 17 00:00:00 2001 From: Jeremy Penner Date: Sun, 3 Feb 2019 21:04:02 -0500 Subject: [PATCH] Forp: Lightweight suspendable round-robin task system --- defs.frp | 61 ++++++++++- forp.c | 314 +++++++++++++++++++++++++++++++++++++++--------------- forp.h | 67 ++++++++++++ game.exe | Bin 67440 -> 101409 bytes game.prj | Bin 4755 -> 4930 bytes testbed.c | 5 + 6 files changed, 357 insertions(+), 90 deletions(-) create mode 100755 forp.h diff --git a/defs.frp b/defs.frp index aa44704..f9ed1a5 100755 --- a/defs.frp +++ b/defs.frp @@ -1,3 +1,10 @@ +: stdout ' putc task-emit ! ; +s" forp.log" open const LOGFILE +: log-emit LOGFILE fputc ; + +stdout +' log-emit task-echo ! + 2 const cell : cells cell * ; @@ -16,16 +23,60 @@ key const sp : begin here ; immediate : while ' BZ_ , here 0 , ; immediate : repeat ' GOTO_ , swap , here swap ! ; immediate +: again ' GOTO_ , , ; immediate +: until ' BZ_ , , ; immediate -: ( begin key ')' != while repeat ; immediate +: ( begin key ')' = until ; immediate : 2dup over over ; : decompile - word lookup drop 1 begin ( cp i ) + word lookup if 1 begin ( cp i ) 2dup cells + @ ( cp i @cp+i ) - dup ' _RET != ( cp i @cp+i bool ) + dup ' ret != ( cp i @cp+i bool ) while - dup ` dup if .s drop else drop . then bl ( cp i ) + dup ` dup if type drop else drop . then bl ( cp i ) 1 + ( cp i+1 ) - repeat drop drop drop ; + repeat drop drop then drop ; + +: lit ' LIT_ , , ; + +( tasks ) +: mailbox 2 cells + ; +: task-ip task-user-size cells + ; +: task-sp task-user-size 1 + cells + ; +: task-rsp task-user-size 2 + cells + ; +: task-stack task-user-size 3 + cells + ; +: task-rstack task-stack stacksize cells + ; + +: doactivate ( task ip -- ) + over task-ip ! + dup task-stack over task-sp ! + dup task-rstack over task-rsp ! + drop +; + +: activate + here 4 cells + lit + ' doactivate , + ' ret , +; immediate + +: send ( val task -- ) + mailbox + begin dup @ while suspend repeat ( wait for empty mailbox ) + ! ; + +: receive ( -- val ) + running mailbox + begin dup @ not while suspend repeat ( wait for mail ) + dup @ 0 rot ! ; + + +: start-repl activate + stdout + ' log-emit task-echo ! + begin receive loadstring again ; +task const REPL + +REPL start-repl \ No newline at end of file diff --git a/forp.c b/forp.c index 1aca100..9f3ab96 100755 --- a/forp.c +++ b/forp.c @@ -1,53 +1,54 @@ #include +#include "forp.h" -#define MEM_SIZE 16384 -#define STACK_SIZE 64 -#define RSTACK_SIZE 32 +#define TASK_REGISTER_SIZE 3 +#define TASK_USER_SIZE 8 +#define TASK_HEADER_SIZE (TASK_USER_SIZE + TASK_REGISTER_SIZE) +#define TASK_SIZE (TASK_HEADER_SIZE + STACK_SIZE + RSTACK_SIZE) +#define STACK_OFFSET (TASK_HEADER_SIZE) +#define RSTACK_OFFSET (TASK_HEADER_SIZE + STACK_SIZE) -union cell_union; -typedef union cell_union cell; +#define TASK_USER_NEXT 0 +#define TASK_USER_STATE 1 +#define TASK_USER_MAILBOX 2 +#define TASK_USER_QUIET 3 +#define TASK_USER_KEY 4 +#define TASK_USER_KEYSRC 5 +#define TASK_USER_ECHO 6 +#define TASK_USER_EMIT 7 -union cell_union { - int i; - unsigned int u; - cell *p; - char *s; - void (*f)(); - FILE *fp; -}; - -char mem[MEM_SIZE]; -cell *HERE = (cell*)mem; +char mem[MEM_SIZE] = { 0 }; +cell *HERE = ((cell*)mem) + TASK_SIZE; cell *LATEST = NULL; cell IP = NULL; cell W = NULL; -cell STATE = 0; -cell rstack_mem[RSTACK_SIZE]; -cell *rstack = rstack_mem; -cell stack_mem[STACK_SIZE]; -cell *stack = stack_mem; +#define STATE (*(RUNNING + TASK_USER_STATE)) +cell *RUNNING = (cell*)mem; +cell *TASKS = (cell*)mem; +cell *stack = ((cell*)mem) + STACK_OFFSET; +cell *rstack = ((cell*)mem) + RSTACK_OFFSET; char *INPUT = NULL; FILE *INPUT_FILE = NULL; FILE *OUTPUT_FILE = NULL; -cell QUIET = 0; +#define QUIET (*(RUNNING + TASK_USER_QUIET)) -#define F_IMMEDIATE 0x80 +void DROP(n) { + stack -= n; + if (stack < RUNNING + STACK_OFFSET) { + stack = RUNNING + STACK_OFFSET; + PUSHS("underflow!\n"); + f_puts(); + } +} -#define CELL_OFFSET(cp, b) ((cell*)(((char *)(cp)) + b)) -#define TOP() (*(stack - 1)) -#define ST1() (*(stack - 2)) -#define ST2() (*(stack - 3)) -#define DROP(n) (stack -= n) void PUSHC(cell c) { *stack = c; stack++; } void PUSHI(int i) { stack->i = i; stack++; } void PUSHU(unsigned int u) { stack->u = u; stack++; } void PUSHCP(cell *c) { stack->p = c; stack++; } -#define PUSHP(p) PUSHCP((cell*)p) void PUSHS(char *s) { stack->s = s; stack++; } void RPUSH(cell c) { *rstack = c; rstack++; } -#define RPOP() (--rstack) void f_here() { PUSHCP(HERE); @@ -60,6 +61,11 @@ void f_latest() { void f_state() { PUSHC(STATE); } + +void f_running() { + PUSHCP(RUNNING); +} + #define BINOP(name, op) \ void name() { \ cell r = TOP(); \ @@ -135,27 +141,49 @@ void f_rot() { // a b c -- b c a ST2() = b; } -void f_key() { - if (INPUT) { - PUSHI(*INPUT); - INPUT++; - if (TOP().i == 0) { - INPUT = NULL; - } - } else if (INPUT_FILE) { - int val = fgetc(INPUT_FILE); - if (val == EOF) { - fclose(INPUT_FILE); - INPUT_FILE = NULL; - PUSHI(0); +void f_execute(); + +void f_key_string() { + cell *INPUT = RUNNING + TASK_USER_KEYSRC; + if (INPUT->p) { + PUSHCP(INPUT->p); + f_bget(); + if (TOP().i != 0) { + INPUT->p = CELL_OFFSET(INPUT->p, 1); } else { - PUSHI(val); + INPUT->p = NULL; } } else { PUSHI(0); } - if (OUTPUT_FILE && TOP().i != 0) { - fputc(TOP().i, OUTPUT_FILE); +} + +void f_key_file() { + cell *INPUT = RUNNING + TASK_USER_KEYSRC; + int val = 0; + if (INPUT->fp) { + val = fgetc(INPUT->fp); + if (val == EOF) { + fclose(INPUT->fp); + INPUT->fp = NULL; + val = 0; + } + } + PUSHI(val); +} + +void f_key() { + cell *keyword = RUNNING + TASK_USER_KEY; + cell *echoword = RUNNING + TASK_USER_ECHO; + if (keyword->f) { + keyword->f(); + } else { + PUSHI(0); + } + if (!QUIET.i && echoword->p) { + f_dup(); + PUSHCP(echoword->p); + f_execute(); } } @@ -182,14 +210,30 @@ void f_word() { void f_emit() { if (!QUIET.i) { - printf("%c", TOP().i); - } - if (OUTPUT_FILE) { - fputc(TOP().i, OUTPUT_FILE); + cell *echoword = RUNNING + TASK_USER_ECHO; + cell *emitword = RUNNING + TASK_USER_EMIT; + if (echoword->p) { + f_dup(); + PUSHCP(echoword->p); + f_execute(); + } + if (emitword->p) { + PUSHCP(emitword->p); + f_execute(); + } } +} + +void f_putc() { + printf("%c", TOP().i); DROP(1); } +void f_fputc() { + fputc(ST1().i, TOP().fp); + DROP(2); +} + void f_puts() { char *s = TOP().s; while (s && *s) { @@ -207,6 +251,13 @@ void f_dot() { f_puts(); } +void f_printstack() { + cell *v = RUNNING + STACK_OFFSET; + while (v != stack) { + PUSHC(*v++); + f_dot(); + } +} void f_cr() { PUSHI('\n'); @@ -243,11 +294,27 @@ void f_cdef() { // func name -- DROP(1); } -void f_docolon() { - RPUSH(W); +void f_execute() { + cell oldW = W; + cell oldIP = IP; + cell *oldRstack; + cell retIP; + retIP.p = NULL; + RPUSH(retIP); + oldRstack = rstack; + W = TOP(); + DROP(1); + W.p->f(); + if (oldRstack == rstack) { + RPOP(); + } + W = oldW; + IP = oldIP; +} - IP.p = W.p + 1; - while (rstack != rstack_mem) { +void f_docolon(); +void f_colonloop() { + while (IP.p) { cell codeptr; W = *IP.p; IP.p++; @@ -261,6 +328,11 @@ void f_docolon() { } } +void f_docolon() { + IP.p = W.p + 1; + f_colonloop(); +} + void f_noop() { } @@ -329,13 +401,17 @@ void f_immediate() { void f_compileword(); void f_semicolon() { - PUSHS("_RET"); + PUSHS("ret"); f_compileword(); f_compileoff(); } void f_ret() { - IP = *RPOP(); + if (rstack == RUNNING + RSTACK_OFFSET) { + IP.p = NULL; + } else { + IP = *RPOP(); + } } void f_colon() { @@ -401,12 +477,6 @@ void f_interpreter() { return; } f_compileword(); - if (stack < stack_mem) { - stack = stack_mem; - PUSHS("stack underflow!\n"); - f_puts(); - return; - } } } @@ -422,26 +492,40 @@ void f_close() { } void f__loadfile() { - INPUT_FILE = TOP().fp; + cell *key = RUNNING + TASK_USER_KEY; + cell *keysrc = RUNNING + TASK_USER_KEYSRC; + cell oldKey = *key; + cell oldKeysrc = *keysrc; + key->f = f_key_file; + keysrc->fp = TOP().fp; DROP(1); f_interpreter(); - if (INPUT_FILE != NULL) { - fclose(INPUT_FILE); - INPUT_FILE = NULL; + if (key->fp != NULL) { + fclose(key->fp); } + *key = oldKey; + *keysrc = oldKeysrc; } void f_loadstring() { - INPUT = TOP().s; + cell *key = RUNNING + TASK_USER_KEY; + cell *keysrc = RUNNING + TASK_USER_KEYSRC; + cell oldKey = *key; + cell oldKeysrc = *keysrc; + key->f = f_key_string; + keysrc->s = TOP().s; DROP(1); f_interpreter(); - INPUT = NULL; + *key = oldKey; + *keysrc = oldKeysrc; } -void f_appendlog() { - OUTPUT_FILE = TOP().fp; - fseek(OUTPUT_FILE, 0, SEEK_END); - DROP(1); +void f_taskemit() { + PUSHCP(RUNNING + TASK_USER_EMIT); +} + +void f_taskecho() { + PUSHCP(RUNNING + TASK_USER_ECHO); } void f_doconst() { @@ -544,6 +628,56 @@ void f_loud() { QUIET.i = 0; } +// task switching +void f_task() { + cell *task = HERE; + HERE += TASK_SIZE; + memset(task, 0, TASK_SIZE * 2); + task->p = TASKS; + TASKS = task; + PUSHP(task); +} + +void f_suspend() { + cell *registers = RUNNING + TASK_USER_SIZE; + registers[0] = IP; + registers[1].p = stack; + registers[2].p = rstack; + IP.p = 0; +} + +void f_restore() { + cell *registers = RUNNING + TASK_USER_SIZE; + IP = registers[0]; + stack = registers[1].p; + rstack = registers[2].p; +} + +// run all tasks once, except the task that triggered the loop +void f_taskloop() { + cell *task = RUNNING; + f_suspend(); + RUNNING = TASKS; + while (RUNNING) { + if (RUNNING != task) { + f_restore(); + f_colonloop(); + } + RUNNING = RUNNING->p; + } + RUNNING = task; + f_restore(); +} + +void f_stacksize() { + PUSHU(STACK_SIZE); +} +void f_rstacksize() { + PUSHU(RSTACK_SIZE); +} +void f_taskusersize() { + PUSHU(TASK_USER_SIZE); +} #define CDEF(name, def) PUSHP(def); PUSHS(name); f_cdef() void f_init() { CDEF("[", f_compileoff); f_immediate(); @@ -585,14 +719,19 @@ void f_init() { CDEF("swap", f_swap); CDEF("rot", f_rot); CDEF("emit", f_emit); + CDEF("task-emit", f_taskemit); + CDEF("task-echo", f_taskecho); + CDEF("putc", f_putc); + CDEF("fputc", f_fputc); CDEF("number", f_number); CDEF("LIT_", f_lit_); CDEF("GOTO_", f_goto_); CDEF("BZ_", f_bz_); CDEF("BNZ_", f_bnz_); - CDEF("_RET", f_ret); + CDEF("ret", f_ret); CDEF(".", f_dot); - CDEF(".s", f_puts); + CDEF("type", f_puts); + CDEF(".s", f_printstack); CDEF(",", f_comma); CDEF("b,", f_bcomma); CDEF("s\"", f_string); f_immediate(); @@ -604,13 +743,13 @@ void f_init() { CDEF("loadstring", f_loadstring); CDEF("quiet", f_quiet); CDEF("loud", f_loud); - CDEF("appendlog", f_appendlog); - - - PUSHS("forp.log"); - f_open(); - f_appendlog(); - + CDEF("task", f_task); + CDEF("suspend", f_suspend); + CDEF("taskloop", f_taskloop); + CDEF("running", f_running); + CDEF("stacksize", f_stacksize); + CDEF("rstacksize", f_rstacksize); + CDEF("task-user-size", f_taskusersize); f_loadfile("defs.frp"); } @@ -620,13 +759,18 @@ void f_quit() { DIE = 1; } -int main() { +void f_repl() { char inputbuf[256]; - f_init(); CDEF("quit", f_quit); while (!DIE) { - f_runstring(gets(inputbuf)); + int len; + gets(inputbuf); + len = strlen(inputbuf); + inputbuf[len] = '\n'; + inputbuf[len + 1] = 0; + PUSHS(inputbuf); + f_runstring("REPL send"); + f_taskloop(); } - return 0; } \ No newline at end of file diff --git a/forp.h b/forp.h new file mode 100755 index 0000000..256231b --- /dev/null +++ b/forp.h @@ -0,0 +1,67 @@ +#include + +#define MEM_SIZE 16384 +#define STACK_SIZE 64 +#define RSTACK_SIZE 32 + +void f_init(); + +#define CDEF(name, def) PUSHP(def); PUSHS(name); f_cdef() +void f_immediate(); + +void f_loadfile(char *filename); +void f_runstring(char *s); + +void f_quiet(); +void f_loud(); +void f_interpreter(); + +union cell_union; +typedef union cell_union cell; + +union cell_union { + int i; + unsigned int u; + cell *p; + char *s; + void (*f)(); + FILE *fp; +}; + +extern char mem[MEM_SIZE]; +extern cell *HERE; +extern cell *LATEST; +extern cell IP; +extern cell W; +extern cell *rstack; +extern cell *stack; + +#define F_IMMEDIATE 0x80 + +#define CELL_OFFSET(cp, b) ((cell*)(((char *)(cp)) + b)) +#define TOP() (*(stack - 1)) +#define ST1() (*(stack - 2)) +#define ST2() (*(stack - 3)) +void DROP(int n); +void PUSHC(cell c); +void PUSHI(int i); +void PUSHU(unsigned int u); +void PUSHCP(cell *c); +#define PUSHP(p) PUSHCP((cell*)p) +void PUSHS(char *s); +void RPUSH(cell c); +#define RPOP() (--rstack) +#define RTOP() (*(rstack - 1)) + +void f_key(); +void f_word(); +void f_emit(); +void f_puts(); +void f_dot(); +void f_cr(); +void f_comma(); +void f_bcomma(); +void f_create(); // name -- +void f_cdef(); // func name -- +void f_compileword(); + diff --git a/game.exe b/game.exe index 25249a6a8764075daebb93ed818820758e579b55..0bc30deb8f152fde79a602fe88edbfbaebba70c5 100755 GIT binary patch literal 101409 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

LaC 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⪚F0HGG~a=_Ed3s3k4jsacB| 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 T`$a=AcU;n)+HUDS*5iKxxVJ2d delta 12407 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 delta 205 zcmX@4Hd%FpIvca*TIE@QmK7{*w{XvWab;LI?O!HnU*?@|lD5KkZ1 zU_B3@ejWyK21THe2L#L|{{IIGb+L3XEV*m-A1LS-;u;*{