From 4881064908deedfe14d20f88696a386ca527daf8 Mon Sep 17 00:00:00 2001 From: Jeremy Penner Date: Sun, 24 Feb 2019 10:14:56 -0500 Subject: [PATCH] Rewrote move-to to be usable from multiple tasks --- boot.jor | 9 ++++++++ defs.jor | 12 +++++++--- game.exe | Bin 109136 -> 109992 bytes game.jor | 22 +++++++------------ game.prj | Bin 5265 -> 5265 bytes jorth.c | 64 +++++++++++++++++++++++------------------------------- repl.jor | 5 +++++ testbed.c | 26 +++++++++++++++++++++- 8 files changed, 83 insertions(+), 55 deletions(-) create mode 100755 repl.jor diff --git a/boot.jor b/boot.jor index 2d3e63e..9ed64a2 100755 --- a/boot.jor +++ b/boot.jor @@ -24,6 +24,15 @@ key const sp : ( begin key ')' = until ; immediate : 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 ; : interpretnumber state if lit then ; : interpretunknown type s" ?" type cr ; diff --git a/defs.jor b/defs.jor index 360ce80..d822746 100755 --- a/defs.jor +++ b/defs.jor @@ -2,12 +2,18 @@ s" jorth.log" open const LOGFILE : 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 ) : :noname here docolon , ] ; -: 2dup over over ; -: noop ; - +: :| inline| :noname ; immediate +: |; ' ret , |inline ; immediate : defer word new-word docolon , ' noop , ' ret , ; : redefine ( cp cpdeferred ) cell + ! ; diff --git a/game.exe b/game.exe index 956badc70dbfe8e211a235ff743059d7abe24465..8c930d6e9e07108d65ada4bd74950924236817fb 100755 GIT binary patch delta 23679 zcmchRc+-~TU3=+RnbjpRW}_%5F|llp3k{=lBnl-e$VT9{&=p}x%r&;*}v!9bC+|* z=^wn`z2I%`KVmGsO+M6!h}`bcyUb;b&6PPH5m!E9ft&aYpF_k8li@iYUYgxPN-iCd z-FTPo`y1&=H?l(u5I{LT1<9py5l?EoD(mC$(&+E1Zg1O5-_|b-UPXnb)s%2udC6

(bZ)TF0w5Zfjf>sqoG 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 delta 22721 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 Sw`b$WtczyP{ZH6d_J07a%J{+n diff --git a/game.jor b/game.jor index 0968b20..ec9d397 100755 --- a/game.jor +++ b/game.jor @@ -74,8 +74,8 @@ defentity player : lerpr ( start end ratio ) r> >range r< >range r< rot - >ratio lerpr ; -: lerp ( start end duration timer -- i ) - @ ticks udelta ( start end duration delta ) +: lerp ( start end duration start -- i ) + ticks udelta ( start end duration delta ) >ratio lerpr ; : triggered ( duration timer -- b ) @@ -94,20 +94,14 @@ var footer-y : text2 6 12 rot text ; : 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-speed ! swap dup r> @ swap ( from to -- ) - move-timer now! + rot dup r> @ -rot ticks ( from to duration start ) begin - 2dup move-speed @ move-timer lerp ( from to now -- ) - dup r< dup r> ! - over != ( from to -- ) + 4dup lerp r@ ! + rot dup r@ @ != ( from duration start to !done ) while - suspend - repeat drop drop r< drop ; + -rot suspend + repeat rdrop drop drop drop drop ; : show-footer footer-y 24 10 move-to ; : hide-footer footer-y 0 10 move-to ; @@ -170,7 +164,7 @@ JOB listen-for-jobs player entity.dir @ dir>pos dup if swap drop player entity.y ( d v -- ) else drop player entity.x then - swap 16 * over @ + 5 move-to ; + swap 16 * over @ + 4 move-to ; : tick-player 0 ^LEFT key-down if drop 1 W player entity.dir ! then diff --git a/game.prj b/game.prj index 9889ef24ebe3c22539d841ab350c1e20808c8fee..70a93fdada6a5c72efb13fc289f8a7af25859f62 100755 GIT binary patch delta 190 zcmbQJIZ<=NR95E1qLRrEnQJDCun99OEDYPM#dd;?S7u?D-(v{|hNVsn47r>C^E_u_ zKC&uk@=N~joR1jt8Q(EoVyc_`Qb5|#i@}S5fq{cToIwDng`GixBSuV&fv+*pkBedP zQdhtK|M_27fEZj1$_&B>WjFo@ae`eL7z7vu8Fm8A6clt-Wp9*tb=Q*NxV;lYqXZ8F kKLa}uhyDjj`-Qj$hd8;q=s7b?UN3ln8EDJqA|ZJu00rDTzW@LL delta 169 zcmbQJIZ<=NRMyFl+3F{Yun9BYYzo}0#dd;?_hM6^-(v{|hAB=A4CR~u^E_u_zTOl# z`6d5%&UFm=jPIB(F?mgXDIm?em%)pHfkA*lkfCo&z+_iJS3S0!;;-&nGPnjfG3*rQ zVc=(A2jbBGKxw}a*WeH*R~J2JpcW1WafU5GBLxM;L|64KUh3+{#h}a}d{B1de-J0w Rb@F<_1I$1bn~Q|xnE>2lHzNQ5 diff --git a/jorth.c b/jorth.c index 19f81a9..9199b31 100755 --- a/jorth.c +++ b/jorth.c @@ -55,6 +55,10 @@ void f_here() { PUSHCP(HERE); } +void f_here_set() { + HERE = TOP().p; + DROP(1); +} void f_latest() { PUSHCP(LATEST); } @@ -179,6 +183,21 @@ void f_rtake() { 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_key_string() { @@ -638,40 +657,9 @@ void f_goto_() { IP.p = IP.p->p; } -void f_string_() { - PUSHP(IP.p + 1); - IP.p = CELL_OFFSET(IP.p + 1, IP.p->i + 1); -} - -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_inline_data_() { + PUSHCP(IP.p + 1); + IP = *IP.p; } void f_quote() { @@ -773,6 +761,7 @@ void f_init() { CDEF("execute", f_execute); CDEF("new-word", f_create); CDEF("here", f_here); + CDEF("here!", f_here_set); CDEF("latest", f_latest); CDEF("state", f_state); CDEF("'", f_quote); f_immediate(); @@ -824,7 +813,9 @@ void f_init() { CDEF("rot", f_rot); CDEF("r>", f_rput); 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-echo", f_taskecho); CDEF("swap-input", f_swapinput); @@ -835,6 +826,7 @@ void f_init() { CDEF("GOTO_", f_goto_); CDEF("BZ_", f_bz_); CDEF("BNZ_", f_bnz_); + CDEF("INLINEDATA_", f_inline_data_); CDEF("ret", f_ret); CDEF(".", f_dot); CDEF("u.", f_udot); @@ -842,8 +834,6 @@ void f_init() { CDEF(".s", f_printstack); CDEF(",", f_comma); CDEF("b,", f_bcomma); - CDEF("s\"", f_string); f_immediate(); - CDEF("S\"_", f_string_); CDEF("open", f_open); CDEF("close", f_close); CDEF("quiet", f_quiet); diff --git a/repl.jor b/repl.jor new file mode 100755 index 0000000..35dee6b --- /dev/null +++ b/repl.jor @@ -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 diff --git a/testbed.c b/testbed.c index 0db6ec9..5c44ac8 100755 --- a/testbed.c +++ b/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); game_init(); game_f_init();