store exe timestamp in JIM files; small game cleanups
This commit is contained in:
parent
640471a59e
commit
d23e8c1172
9
boot.jor
9
boot.jor
|
@ -60,11 +60,14 @@ defer onload
|
||||||
: postload ' onload definition ' noop ' onload redefine execute ;
|
: postload ' onload definition ' noop ' onload redefine execute ;
|
||||||
|
|
||||||
: loadimage ( -- [0 | onload] )
|
: loadimage ( -- [0 | onload] )
|
||||||
fget fget fget fget fget ( onload tasks latest size start )
|
imagemagic fget = if
|
||||||
here != if tell + seek drop drop drop 0 else
|
fget fget fget fget fget ( onload tasks latest size start )
|
||||||
dup here fread here + here! latest! tasks! then ;
|
here != if tell + seek drop drop drop 0 else
|
||||||
|
dup here fread here + here! latest! tasks! then
|
||||||
|
else 0 then ;
|
||||||
|
|
||||||
: saveimage ( herestart -- )
|
: saveimage ( herestart -- )
|
||||||
|
imagemagic fput
|
||||||
' onload definition here drop fput
|
' onload definition here drop fput
|
||||||
tasks fput
|
tasks fput
|
||||||
latest fput
|
latest fput
|
||||||
|
|
8
jopl.c
8
jopl.c
|
@ -53,13 +53,13 @@ void f_keydown() {
|
||||||
TOP().i = keyIsDown(TOP().i);
|
TOP().i = keyIsDown(TOP().i);
|
||||||
}
|
}
|
||||||
|
|
||||||
void do_repl() {
|
void do_repl(char *exe) {
|
||||||
char buf[128];
|
char buf[128];
|
||||||
|
|
||||||
adlib_init();
|
adlib_init();
|
||||||
|
|
||||||
timer_init(TIMER_18HZ);
|
timer_init(TIMER_18HZ);
|
||||||
f_init();
|
f_init(exe);
|
||||||
|
|
||||||
CDEF("quit", f_quit);
|
CDEF("quit", f_quit);
|
||||||
CDEF("adlib!", f_adlib_write);
|
CDEF("adlib!", f_adlib_write);
|
||||||
|
@ -84,7 +84,7 @@ void do_repl() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int main() {
|
int main(int argc, char *argv[]) {
|
||||||
do_repl();
|
do_repl(argv[0]);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
10
jopl.jor
10
jopl.jor
|
@ -99,6 +99,7 @@ var octave
|
||||||
: %V voice ! ;
|
: %V voice ! ;
|
||||||
: mknote create b, does> ub@ oct+ notestate @ if b, else noteon rest then ;
|
: mknote create b, does> ub@ oct+ notestate @ if b, else noteon rest then ;
|
||||||
: %loop 0xfe b, , ;
|
: %loop 0xfe b, , ;
|
||||||
|
: mod % ;
|
||||||
: % notestate @ if 0xf0 b, else rest then ;
|
: % notestate @ if 0xf0 b, else rest then ;
|
||||||
: %% 0 for % next ;
|
: %% 0 for % next ;
|
||||||
: %- notestate @ if 0xfd b, else noteoff then ;
|
: %- 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 ! ;
|
: ;track %loop 0 notestate ! ;
|
||||||
: shush 0 voice @ track ! %- ;
|
: shush 0 voice @ track ! %- ;
|
||||||
|
|
||||||
|
var tempo 1 tempo !
|
||||||
: player
|
: player
|
||||||
1 songticks +!
|
1 songticks +!
|
||||||
voice @
|
songticks @ tempo @ mod 0 = if
|
||||||
0 10 for i voice ! i track-tick next
|
voice @
|
||||||
voice ! ;
|
0 10 for i voice ! i track-tick next
|
||||||
|
voice !
|
||||||
|
then ;
|
||||||
|
|
||||||
var t2
|
var t2
|
||||||
: startt2
|
: startt2
|
||||||
|
|
46
jorth.c
46
jorth.c
|
@ -2,6 +2,7 @@
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
|
#include <dos.h>
|
||||||
#include "jorth.h"
|
#include "jorth.h"
|
||||||
#include "serial.h"
|
#include "serial.h"
|
||||||
|
|
||||||
|
@ -164,6 +165,26 @@ void f_bset() {
|
||||||
DROP(1);
|
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() {
|
void f_addset() {
|
||||||
TOP().p->i += ST1().i;
|
TOP().p->i += ST1().i;
|
||||||
DROP(2);
|
DROP(2);
|
||||||
|
@ -841,10 +862,25 @@ void f_image_up_to_date() {
|
||||||
TOP().i = uptodate;
|
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() {
|
void f_loadimage() {
|
||||||
cell *start, *latestNew, *tasksNew;
|
cell *start, *latestNew, *tasksNew;
|
||||||
size_t size;
|
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(&start, sizeof(cell *), 1, ACTIVE_FILE);
|
||||||
fread(&latestNew, sizeof(cell *), 1, ACTIVE_FILE);
|
fread(&latestNew, sizeof(cell *), 1, ACTIVE_FILE);
|
||||||
fread(&tasksNew, sizeof(cell *), 1, ACTIVE_FILE);
|
fread(&tasksNew, sizeof(cell *), 1, ACTIVE_FILE);
|
||||||
|
@ -863,6 +899,7 @@ void f_loadimage() {
|
||||||
|
|
||||||
void f_saveimage() {
|
void f_saveimage() {
|
||||||
size_t size = (size_t)(((char*)HERE) - TOP().s);
|
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(&TOP().p, sizeof(cell *), 1, ACTIVE_FILE);
|
||||||
fwrite(&LATEST, sizeof(cell *), 1, ACTIVE_FILE);
|
fwrite(&LATEST, sizeof(cell *), 1, ACTIVE_FILE);
|
||||||
fwrite(&TASKS, sizeof(cell *), 1, ACTIVE_FILE);
|
fwrite(&TASKS, sizeof(cell *), 1, ACTIVE_FILE);
|
||||||
|
@ -991,7 +1028,9 @@ void f_taskusersize() {
|
||||||
PUSHU(TASK_USER_SIZE);
|
PUSHU(TASK_USER_SIZE);
|
||||||
}
|
}
|
||||||
|
|
||||||
void f_init() {
|
void f_init(char *exe) {
|
||||||
|
f_calc_imagemagic(exe);
|
||||||
|
|
||||||
CDEF("[", f_compileoff); f_immediate();
|
CDEF("[", f_compileoff); f_immediate();
|
||||||
CDEF("]", f_compileon);
|
CDEF("]", f_compileon);
|
||||||
CDEF("key", f_key);
|
CDEF("key", f_key);
|
||||||
|
@ -1053,6 +1092,10 @@ void f_init() {
|
||||||
CDEF("b@", f_bget);
|
CDEF("b@", f_bget);
|
||||||
CDEF("ub@", f_ubget);
|
CDEF("ub@", f_ubget);
|
||||||
CDEF("b!", f_bset);
|
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("dup", f_dup);
|
||||||
CDEF("over", f_over);
|
CDEF("over", f_over);
|
||||||
CDEF("drop", f_drop);
|
CDEF("drop", f_drop);
|
||||||
|
@ -1112,6 +1155,7 @@ void f_init() {
|
||||||
PCONST("$DOCREATE", f_docreate);
|
PCONST("$DOCREATE", f_docreate);
|
||||||
PCONST("$DOVAR", f_dovar);
|
PCONST("$DOVAR", f_dovar);
|
||||||
PCONST("$DODEFERRED", f_dodeferred);
|
PCONST("$DODEFERRED", f_dodeferred);
|
||||||
|
ICONST("imagemagic", imagemagic);
|
||||||
#ifdef TRACE
|
#ifdef TRACE
|
||||||
CDEF("traceon", f_traceon);
|
CDEF("traceon", f_traceon);
|
||||||
CDEF("traceoff", f_traceoff);
|
CDEF("traceoff", f_traceoff);
|
||||||
|
|
2
jorth.h
2
jorth.h
|
@ -4,7 +4,7 @@
|
||||||
#define STACK_SIZE 64
|
#define STACK_SIZE 64
|
||||||
#define RSTACK_SIZE 32
|
#define RSTACK_SIZE 32
|
||||||
|
|
||||||
void f_init();
|
void f_init(char *exe);
|
||||||
|
|
||||||
void f_cdef();
|
void f_cdef();
|
||||||
void f_immediate();
|
void f_immediate();
|
||||||
|
|
4
road.jor
4
road.jor
|
@ -4,7 +4,9 @@
|
||||||
|
|
||||||
:noname
|
:noname
|
||||||
1 player.state DRIVING f!
|
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
|
touch-begin E leaving? dup
|
||||||
if pete say" It's 100 miles to the next town." then
|
if pete say" It's 100 miles to the next town." then
|
||||||
|
|
BIN
sprite.tif
BIN
sprite.tif
Binary file not shown.
|
@ -1,4 +1,5 @@
|
||||||
0 const CHUCK-LOST
|
0 const CHUCK-GONE
|
||||||
1 const CHUCK-FOLLOW
|
1 const CHUCK-SEARCH
|
||||||
2 const CHUCK-HOME
|
2 const CHUCK-FOLLOW
|
||||||
|
3 const CHUCK-HOME
|
||||||
var chuck.state
|
var chuck.state
|
||||||
|
|
14
testbed.c
14
testbed.c
|
@ -199,8 +199,8 @@ void f_adlib() {
|
||||||
DROP(2);
|
DROP(2);
|
||||||
}
|
}
|
||||||
|
|
||||||
void game_f_init() {
|
void game_f_init(char *exe) {
|
||||||
f_init();
|
f_init(exe);
|
||||||
CDEF("seremit", f_seremit);
|
CDEF("seremit", f_seremit);
|
||||||
CDEF("key-pressed", f_keyWasPressed);
|
CDEF("key-pressed", f_keyWasPressed);
|
||||||
CDEF("key-down", f_keyIsDown);
|
CDEF("key-down", f_keyIsDown);
|
||||||
|
@ -253,10 +253,10 @@ int DONE = 0;
|
||||||
static void f_quit() {
|
static void f_quit() {
|
||||||
DONE = 1;
|
DONE = 1;
|
||||||
}
|
}
|
||||||
void do_repl() {
|
void do_repl(char *exe) {
|
||||||
char buf[128];
|
char buf[128];
|
||||||
|
|
||||||
f_init();
|
f_init(exe);
|
||||||
CDEF("quit", f_quit);
|
CDEF("quit", f_quit);
|
||||||
CDEF("adlib", f_adlib);
|
CDEF("adlib", f_adlib);
|
||||||
|
|
||||||
|
@ -270,15 +270,15 @@ void do_repl() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(int argc) {
|
int main(int argc, char *argv[]) {
|
||||||
cell tick, draw;
|
cell tick, draw;
|
||||||
if (argc > 1) {
|
if (argc > 1) {
|
||||||
do_repl();
|
do_repl(argv[0]);
|
||||||
return 0;
|
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(argv[0]);
|
||||||
tick = f_lookupcp("tick");
|
tick = f_lookupcp("tick");
|
||||||
draw = f_lookupcp("draw");
|
draw = f_lookupcp("draw");
|
||||||
|
|
||||||
|
|
|
@ -11,7 +11,7 @@ car :touch
|
||||||
0 player.state DRIVING f!
|
0 player.state DRIVING f!
|
||||||
|
|
||||||
:| player yield
|
:| 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
|
player.driving? not if car yield then
|
||||||
0 |; ' entities redefine
|
0 |; ' entities redefine
|
||||||
|
|
||||||
|
@ -22,7 +22,7 @@ touch-begin S leaving? dup
|
||||||
else player move-entity 13 7 road.jor queue-level
|
else player move-entity 13 7 road.jor queue-level
|
||||||
then
|
then
|
||||||
then
|
then
|
||||||
chuck.state @ CHUCK-LOST = if
|
chuck.state @ CHUCK-SEARCH = if
|
||||||
touch-next 37 60 2= dup
|
touch-next 37 60 2= dup
|
||||||
if
|
if
|
||||||
pete say" Oh for the love of..."
|
pete say" Oh for the love of..."
|
||||||
|
|
Loading…
Reference in a new issue