Rewrote move-to to be usable from multiple tasks
This commit is contained in:
parent
a876a9332f
commit
4881064908
9
boot.jor
9
boot.jor
|
@ -24,6 +24,15 @@ key const sp
|
||||||
: ( begin key ')' = until ; immediate
|
: ( begin key ')' = until ; immediate
|
||||||
: lit ' LIT_ , , ;
|
: lit ' LIT_ , , ;
|
||||||
|
|
||||||
|
: inline| ' INLINEDATA_ , here 0 , ;
|
||||||
|
: |inline [ ' then , ] ;
|
||||||
|
|
||||||
|
key " const '"'
|
||||||
|
|
||||||
|
: s" state if inline| else here then
|
||||||
|
begin key dup '"' != over 0 != and while b, repeat drop 0 b,
|
||||||
|
state if |inline else dup here! then ; immediate
|
||||||
|
|
||||||
: interpretword F_IMMEDIATE & state not or if execute else , then ;
|
: interpretword F_IMMEDIATE & state not or if execute else , then ;
|
||||||
: interpretnumber state if lit then ;
|
: interpretnumber state if lit then ;
|
||||||
: interpretunknown type s" ?" type cr ;
|
: interpretunknown type s" ?" type cr ;
|
||||||
|
|
12
defs.jor
12
defs.jor
|
@ -2,12 +2,18 @@
|
||||||
s" jorth.log" open const LOGFILE
|
s" jorth.log" open const LOGFILE
|
||||||
: log-emit LOGFILE fputc ;
|
: log-emit LOGFILE fputc ;
|
||||||
|
|
||||||
|
: -rot rot rot ;
|
||||||
|
: 2dup over over ;
|
||||||
|
: 3dup r> 2dup r@ -rot r< ;
|
||||||
|
: 4dup r> r> 2dup r@ -rot rswap r@ -rot r< r< swap ;
|
||||||
|
|
||||||
|
: noop ;
|
||||||
|
|
||||||
' cells @ const docolon ( get the colon execution token )
|
' cells @ const docolon ( get the colon execution token )
|
||||||
: :noname here docolon , ] ;
|
: :noname here docolon , ] ;
|
||||||
|
|
||||||
: 2dup over over ;
|
: :| inline| :noname ; immediate
|
||||||
: noop ;
|
: |; ' ret , |inline ; immediate
|
||||||
|
|
||||||
|
|
||||||
: defer word new-word docolon , ' noop , ' ret , ;
|
: defer word new-word docolon , ' noop , ' ret , ;
|
||||||
: redefine ( cp cpdeferred ) cell + ! ;
|
: redefine ( cp cpdeferred ) cell + ! ;
|
||||||
|
|
22
game.jor
22
game.jor
|
@ -74,8 +74,8 @@ defentity player
|
||||||
: lerpr ( start end ratio ) r> >range r< <ratio + ;
|
: lerpr ( start end ratio ) r> >range r< <ratio + ;
|
||||||
: lerpn ( start1 end1 start2 end2 val )
|
: lerpn ( start1 end1 start2 end2 val )
|
||||||
r> >range r< rot - >ratio lerpr ;
|
r> >range r< rot - >ratio lerpr ;
|
||||||
: lerp ( start end duration timer -- i )
|
: lerp ( start end duration start -- i )
|
||||||
@ ticks udelta ( start end duration delta )
|
ticks udelta ( start end duration delta )
|
||||||
>ratio lerpr ;
|
>ratio lerpr ;
|
||||||
|
|
||||||
: triggered ( duration timer -- b )
|
: triggered ( duration timer -- b )
|
||||||
|
@ -94,20 +94,14 @@ var footer-y
|
||||||
: text2 6 12 rot text ;
|
: text2 6 12 rot text ;
|
||||||
: clear s" " dup text1 text2 ;
|
: clear s" " dup text1 text2 ;
|
||||||
|
|
||||||
( hmmm, todo: explicit "mover" struct with create does> ? )
|
|
||||||
var move-timer
|
|
||||||
var move-speed
|
|
||||||
|
|
||||||
: move-to ( p target speed -- )
|
: move-to ( p target speed -- )
|
||||||
move-speed ! swap dup r> @ swap ( from to -- )
|
rot dup r> @ -rot ticks ( from to duration start )
|
||||||
move-timer now!
|
|
||||||
begin
|
begin
|
||||||
2dup move-speed @ move-timer lerp ( from to now -- )
|
4dup lerp r@ !
|
||||||
dup r< dup r> !
|
rot dup r@ @ != ( from duration start to !done )
|
||||||
over != ( from to -- )
|
|
||||||
while
|
while
|
||||||
suspend
|
-rot suspend
|
||||||
repeat drop drop r< drop ;
|
repeat rdrop drop drop drop drop ;
|
||||||
|
|
||||||
: show-footer footer-y 24 10 move-to ;
|
: show-footer footer-y 24 10 move-to ;
|
||||||
: hide-footer footer-y 0 10 move-to ;
|
: hide-footer footer-y 0 10 move-to ;
|
||||||
|
@ -170,7 +164,7 @@ JOB listen-for-jobs
|
||||||
player entity.dir @ dir>pos
|
player entity.dir @ dir>pos
|
||||||
dup if swap drop player entity.y ( d v -- )
|
dup if swap drop player entity.y ( d v -- )
|
||||||
else drop player entity.x then
|
else drop player entity.x then
|
||||||
swap 16 * over @ + 5 move-to ;
|
swap 16 * over @ + 4 move-to ;
|
||||||
|
|
||||||
: tick-player
|
: tick-player
|
||||||
0 ^LEFT key-down if drop 1 W player entity.dir ! then
|
0 ^LEFT key-down if drop 1 W player entity.dir ! then
|
||||||
|
|
64
jorth.c
64
jorth.c
|
@ -55,6 +55,10 @@ void f_here() {
|
||||||
PUSHCP(HERE);
|
PUSHCP(HERE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void f_here_set() {
|
||||||
|
HERE = TOP().p;
|
||||||
|
DROP(1);
|
||||||
|
}
|
||||||
void f_latest() {
|
void f_latest() {
|
||||||
PUSHCP(LATEST);
|
PUSHCP(LATEST);
|
||||||
}
|
}
|
||||||
|
@ -179,6 +183,21 @@ void f_rtake() {
|
||||||
PUSHC(*RPOP());
|
PUSHC(*RPOP());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void f_rtop() {
|
||||||
|
PUSHC(*(rstack - 1));
|
||||||
|
}
|
||||||
|
|
||||||
|
void f_rdrop() {
|
||||||
|
RPOP();
|
||||||
|
}
|
||||||
|
|
||||||
|
void f_rswap() {
|
||||||
|
cell top = *(rstack - 1);
|
||||||
|
cell under = *(rstack - 2);
|
||||||
|
*(rstack - 1) = under;
|
||||||
|
*(rstack - 2) = top;
|
||||||
|
}
|
||||||
|
|
||||||
void f_cexecute();
|
void f_cexecute();
|
||||||
|
|
||||||
void f_key_string() {
|
void f_key_string() {
|
||||||
|
@ -638,40 +657,9 @@ void f_goto_() {
|
||||||
IP.p = IP.p->p;
|
IP.p = IP.p->p;
|
||||||
}
|
}
|
||||||
|
|
||||||
void f_string_() {
|
void f_inline_data_() {
|
||||||
PUSHP(IP.p + 1);
|
PUSHCP(IP.p + 1);
|
||||||
IP.p = CELL_OFFSET(IP.p + 1, IP.p->i + 1);
|
IP = *IP.p;
|
||||||
}
|
|
||||||
|
|
||||||
void f_string() {
|
|
||||||
cell *length;
|
|
||||||
char *s;
|
|
||||||
char b;
|
|
||||||
if (STATE.i) {
|
|
||||||
PUSHS("S\"_");
|
|
||||||
f_compileword();
|
|
||||||
length = HERE;
|
|
||||||
PUSHI(0);
|
|
||||||
f_comma();
|
|
||||||
}
|
|
||||||
s = (char*)HERE;
|
|
||||||
while(1) {
|
|
||||||
f_key();
|
|
||||||
b = TOP().i;
|
|
||||||
DROP(1);
|
|
||||||
if (b == '\"') {
|
|
||||||
*s++ = 0;
|
|
||||||
break;
|
|
||||||
} else {
|
|
||||||
*s++ = b;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (STATE.i) {
|
|
||||||
length->i = (int)((s - ((char*)HERE)) - 1);
|
|
||||||
HERE = (cell *)s;
|
|
||||||
} else {
|
|
||||||
PUSHP(HERE);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void f_quote() {
|
void f_quote() {
|
||||||
|
@ -773,6 +761,7 @@ void f_init() {
|
||||||
CDEF("execute", f_execute);
|
CDEF("execute", f_execute);
|
||||||
CDEF("new-word", f_create);
|
CDEF("new-word", f_create);
|
||||||
CDEF("here", f_here);
|
CDEF("here", f_here);
|
||||||
|
CDEF("here!", f_here_set);
|
||||||
CDEF("latest", f_latest);
|
CDEF("latest", f_latest);
|
||||||
CDEF("state", f_state);
|
CDEF("state", f_state);
|
||||||
CDEF("'", f_quote); f_immediate();
|
CDEF("'", f_quote); f_immediate();
|
||||||
|
@ -824,7 +813,9 @@ void f_init() {
|
||||||
CDEF("rot", f_rot);
|
CDEF("rot", f_rot);
|
||||||
CDEF("r>", f_rput);
|
CDEF("r>", f_rput);
|
||||||
CDEF("r<", f_rtake);
|
CDEF("r<", f_rtake);
|
||||||
CDEF("emit", f_emit);
|
CDEF("r@", f_rtop);
|
||||||
|
CDEF("rdrop", f_rdrop);
|
||||||
|
CDEF("rswap", f_rswap);
|
||||||
CDEF("task-emit", f_taskemit);
|
CDEF("task-emit", f_taskemit);
|
||||||
CDEF("task-echo", f_taskecho);
|
CDEF("task-echo", f_taskecho);
|
||||||
CDEF("swap-input", f_swapinput);
|
CDEF("swap-input", f_swapinput);
|
||||||
|
@ -835,6 +826,7 @@ void f_init() {
|
||||||
CDEF("GOTO_", f_goto_);
|
CDEF("GOTO_", f_goto_);
|
||||||
CDEF("BZ_", f_bz_);
|
CDEF("BZ_", f_bz_);
|
||||||
CDEF("BNZ_", f_bnz_);
|
CDEF("BNZ_", f_bnz_);
|
||||||
|
CDEF("INLINEDATA_", f_inline_data_);
|
||||||
CDEF("ret", f_ret);
|
CDEF("ret", f_ret);
|
||||||
CDEF(".", f_dot);
|
CDEF(".", f_dot);
|
||||||
CDEF("u.", f_udot);
|
CDEF("u.", f_udot);
|
||||||
|
@ -842,8 +834,6 @@ void f_init() {
|
||||||
CDEF(".s", f_printstack);
|
CDEF(".s", f_printstack);
|
||||||
CDEF(",", f_comma);
|
CDEF(",", f_comma);
|
||||||
CDEF("b,", f_bcomma);
|
CDEF("b,", f_bcomma);
|
||||||
CDEF("s\"", f_string); f_immediate();
|
|
||||||
CDEF("S\"_", f_string_);
|
|
||||||
CDEF("open", f_open);
|
CDEF("open", f_open);
|
||||||
CDEF("close", f_close);
|
CDEF("close", f_close);
|
||||||
CDEF("quiet", f_quiet);
|
CDEF("quiet", f_quiet);
|
||||||
|
|
5
repl.jor
Executable file
5
repl.jor
Executable file
|
@ -0,0 +1,5 @@
|
||||||
|
: start-repl activate ' putc task-emit !
|
||||||
|
s" .:: J O R T H ( jean forth) ::." type cr
|
||||||
|
begin receive loadstring s" ok" type cr again ;
|
||||||
|
task const REPL
|
||||||
|
REPL start-repl
|
26
testbed.c
26
testbed.c
|
@ -213,7 +213,31 @@ void f_poll() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int main() {
|
int DONE = 0;
|
||||||
|
static void f_quit() {
|
||||||
|
DONE = 1;
|
||||||
|
}
|
||||||
|
void do_repl() {
|
||||||
|
char buf[256];
|
||||||
|
|
||||||
|
f_init();
|
||||||
|
CDEF("quit", f_quit);
|
||||||
|
|
||||||
|
f_loadfile("repl.jor");
|
||||||
|
f_taskloop();
|
||||||
|
|
||||||
|
while (!DONE) {
|
||||||
|
PUSHS(gets(buf));
|
||||||
|
f_runstring("REPL send");
|
||||||
|
f_taskloop();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc) {
|
||||||
|
if (argc > 1) {
|
||||||
|
do_repl();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
ser_init(SER_COM2, BAUD_19200, SER_8N1);
|
ser_init(SER_COM2, BAUD_19200, SER_8N1);
|
||||||
game_init();
|
game_init();
|
||||||
game_f_init();
|
game_f_init();
|
||||||
|
|
Loading…
Reference in a new issue