diff --git a/boot.jor b/boot.jor index b39e239..eab41fc 100755 --- a/boot.jor +++ b/boot.jor @@ -60,11 +60,14 @@ defer onload : postload ' onload definition ' noop ' onload redefine execute ; : loadimage ( -- [0 | onload] ) - fget fget fget fget fget ( onload tasks latest size start ) - here != if tell + seek drop drop drop 0 else - dup here fread here + here! latest! tasks! then ; + imagemagic fget = if + fget fget fget fget fget ( onload tasks latest size start ) + here != if tell + seek drop drop drop 0 else + dup here fread here + here! latest! tasks! then + else 0 then ; : saveimage ( herestart -- ) + imagemagic fput ' onload definition here drop fput tasks fput latest fput diff --git a/game.exe b/game.exe index 51307df..0eae2db 100755 Binary files a/game.exe and b/game.exe differ diff --git a/game.prj b/game.prj index 8c354f1..f55f6b0 100755 Binary files a/game.prj and b/game.prj differ diff --git a/jopl.c b/jopl.c index 591727e..3b14f2d 100755 --- a/jopl.c +++ b/jopl.c @@ -53,13 +53,13 @@ void f_keydown() { TOP().i = keyIsDown(TOP().i); } -void do_repl() { +void do_repl(char *exe) { char buf[128]; adlib_init(); timer_init(TIMER_18HZ); - f_init(); + f_init(exe); CDEF("quit", f_quit); CDEF("adlib!", f_adlib_write); @@ -84,7 +84,7 @@ void do_repl() { } } -int main() { - do_repl(); +int main(int argc, char *argv[]) { + do_repl(argv[0]); return 0; } \ No newline at end of file diff --git a/jopl.exe b/jopl.exe index dc2eab2..d019866 100755 Binary files a/jopl.exe and b/jopl.exe differ diff --git a/jopl.jor b/jopl.jor index d8e8df4..47255a0 100755 --- a/jopl.jor +++ b/jopl.jor @@ -99,6 +99,7 @@ var octave : %V voice ! ; : mknote create b, does> ub@ oct+ notestate @ if b, else noteon rest then ; : %loop 0xfe b, , ; +: mod % ; : % notestate @ if 0xf0 b, else rest then ; : %% 0 for % next ; : %- notestate @ if 0xfd b, else noteoff then ; @@ -134,11 +135,14 @@ array tracks 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , : ;track %loop 0 notestate ! ; : shush 0 voice @ track ! %- ; +var tempo 1 tempo ! : player 1 songticks +! - voice @ - 0 10 for i voice ! i track-tick next - voice ! ; + songticks @ tempo @ mod 0 = if + voice @ + 0 10 for i voice ! i track-tick next + voice ! + then ; var t2 : startt2 diff --git a/jopl.prj b/jopl.prj index 7624429..4f3b654 100755 Binary files a/jopl.prj and b/jopl.prj differ diff --git a/jorth.c b/jorth.c index b5d4fb2..cd26a41 100755 --- a/jorth.c +++ b/jorth.c @@ -2,6 +2,7 @@ #include #include +#include #include "jorth.h" #include "serial.h" @@ -164,6 +165,26 @@ void f_bset() { DROP(1); } +void f_farset() { + *((cell far *)MK_FP(TOP().u, ST1().u)) = ST2(); + DROP(3); +} + +void f_farget() { + ST1() = *((cell far *)MK_FP(TOP().u, ST1().u)); + DROP(1); +} + +void f_farbset() { + *((char far *)MK_FP(TOP().u, ST1().u)) = ST2().i; + DROP(3); +} + +void f_farbget() { + ST1().i = *((char far *)MK_FP(TOP().u, ST1().u)); + DROP(1); +} + void f_addset() { TOP().p->i += ST1().i; DROP(2); @@ -841,10 +862,25 @@ void f_image_up_to_date() { TOP().i = uptodate; } +static int imagemagic = -1; +static void f_calc_imagemagic(char *exefilename) { + struct stat exe; + if (stat(exefilename, &exe) == 0) { + imagemagic = exe.st_mtime; + } +} + + void f_loadimage() { cell *start, *latestNew, *tasksNew; size_t size; + int magic; + fread(&magic, sizeof(int), 1, ACTIVE_FILE); + if (magic != imagemagic) { + PUSHI(0); + return; + } fread(&start, sizeof(cell *), 1, ACTIVE_FILE); fread(&latestNew, sizeof(cell *), 1, ACTIVE_FILE); fread(&tasksNew, sizeof(cell *), 1, ACTIVE_FILE); @@ -863,6 +899,7 @@ void f_loadimage() { void f_saveimage() { size_t size = (size_t)(((char*)HERE) - TOP().s); + fwrite(&imagemagic, sizeof(int), 1, ACTIVE_FILE); fwrite(&TOP().p, sizeof(cell *), 1, ACTIVE_FILE); fwrite(&LATEST, sizeof(cell *), 1, ACTIVE_FILE); fwrite(&TASKS, sizeof(cell *), 1, ACTIVE_FILE); @@ -991,7 +1028,9 @@ void f_taskusersize() { PUSHU(TASK_USER_SIZE); } -void f_init() { +void f_init(char *exe) { + f_calc_imagemagic(exe); + CDEF("[", f_compileoff); f_immediate(); CDEF("]", f_compileon); CDEF("key", f_key); @@ -1053,6 +1092,10 @@ void f_init() { CDEF("b@", f_bget); CDEF("ub@", f_ubget); CDEF("b!", f_bset); + CDEF("!far", f_farset); + CDEF("@far", f_farget); + CDEF("b!far", f_farbset); + CDEF("b@far", f_farbget); CDEF("dup", f_dup); CDEF("over", f_over); CDEF("drop", f_drop); @@ -1112,6 +1155,7 @@ void f_init() { PCONST("$DOCREATE", f_docreate); PCONST("$DOVAR", f_dovar); PCONST("$DODEFERRED", f_dodeferred); + ICONST("imagemagic", imagemagic); #ifdef TRACE CDEF("traceon", f_traceon); CDEF("traceoff", f_traceoff); diff --git a/jorth.h b/jorth.h index 0b9b8b2..473fcdf 100755 --- a/jorth.h +++ b/jorth.h @@ -4,7 +4,7 @@ #define STACK_SIZE 64 #define RSTACK_SIZE 32 -void f_init(); +void f_init(char *exe); void f_cdef(); void f_immediate(); diff --git a/road.jor b/road.jor index 03dce2a..e0e991f 100755 --- a/road.jor +++ b/road.jor @@ -4,7 +4,9 @@ :noname 1 player.state DRIVING f! - :| player yield chuck yield 0 |; ' entities redefine + :| player yield + chuck.state @ CHUCK-HOME = if chuck yield then + 0 |; ' entities redefine :| touch-begin E leaving? dup if pete say" It's 100 miles to the next town." then diff --git a/sprite.tif b/sprite.tif index 187d571..ebdcc42 100755 Binary files a/sprite.tif and b/sprite.tif differ diff --git a/state.jor b/state.jor index 1078e4d..1c665f9 100755 --- a/state.jor +++ b/state.jor @@ -1,4 +1,5 @@ -0 const CHUCK-LOST -1 const CHUCK-FOLLOW -2 const CHUCK-HOME +0 const CHUCK-GONE +1 const CHUCK-SEARCH +2 const CHUCK-FOLLOW +3 const CHUCK-HOME var chuck.state diff --git a/testbed.c b/testbed.c index 6228088..83d2f94 100755 --- a/testbed.c +++ b/testbed.c @@ -199,8 +199,8 @@ void f_adlib() { DROP(2); } -void game_f_init() { - f_init(); +void game_f_init(char *exe) { + f_init(exe); CDEF("seremit", f_seremit); CDEF("key-pressed", f_keyWasPressed); CDEF("key-down", f_keyIsDown); @@ -253,10 +253,10 @@ int DONE = 0; static void f_quit() { DONE = 1; } -void do_repl() { +void do_repl(char *exe) { char buf[128]; - f_init(); + f_init(exe); CDEF("quit", f_quit); CDEF("adlib", f_adlib); @@ -270,15 +270,15 @@ void do_repl() { } } -int main(int argc) { +int main(int argc, char *argv[]) { cell tick, draw; if (argc > 1) { - do_repl(); + do_repl(argv[0]); return 0; } ser_init(SER_COM2, BAUD_19200, SER_8N1); game_init(); - game_f_init(); + game_f_init(argv[0]); tick = f_lookupcp("tick"); draw = f_lookupcp("draw"); diff --git a/trail1.jor b/trail1.jor index 717555b..e679f69 100755 --- a/trail1.jor +++ b/trail1.jor @@ -11,7 +11,7 @@ car :touch 0 player.state DRIVING f! :| player yield - chuck.state @ CHUCK-LOST = if e_chuck yield then + chuck.state @ CHUCK-SEARCH = if e_chuck yield then player.driving? not if car yield then 0 |; ' entities redefine @@ -22,7 +22,7 @@ touch-begin S leaving? dup else player move-entity 13 7 road.jor queue-level then then -chuck.state @ CHUCK-LOST = if +chuck.state @ CHUCK-SEARCH = if touch-next 37 60 2= dup if pete say" Oh for the love of..."