From 9ecb53ad57527ae5c4a5095139dbd2c76535c9cc Mon Sep 17 00:00:00 2001 From: Jeremy Penner Date: Sun, 24 Feb 2019 12:18:34 -0500 Subject: [PATCH] Refactor file I/O to have implicit active file; add map load/save --- blart.map | 0 boot.jor | 2 +- defs.jor | 19 ++++++--- game.exe | Bin 109992 -> 111924 bytes game.jor | 34 ++++++++++----- game.prj | Bin 5265 -> 5265 bytes jorth.c | 122 +++++++++++++++++++++++++++++++++++++++++++++++------- jorts.map | Bin 0 -> 10004 bytes testbed.c | 6 +++ 9 files changed, 151 insertions(+), 32 deletions(-) create mode 100755 blart.map create mode 100755 jorts.map diff --git a/blart.map b/blart.map new file mode 100755 index 0000000..e69de29 diff --git a/boot.jor b/boot.jor index 9ed64a2..7d4a211 100755 --- a/boot.jor +++ b/boot.jor @@ -47,4 +47,4 @@ key " const '"' begin word dup b@ while compileword repeat drop ; : load-input swap-input r> r> interpreter r< r< swap-input ; : loadstring ' key-string load-input drop drop ; -: loadfile ' key-file load-input drop close ; +: loadfile fdeactivate ' key-file load-input drop close ; diff --git a/defs.jor b/defs.jor index d822746..ef5cd72 100755 --- a/defs.jor +++ b/defs.jor @@ -1,11 +1,12 @@ : stdout ' putc task-emit ! ; -s" jorth.log" open const LOGFILE -: log-emit LOGFILE fputc ; +s" jorth.log" open seekend deactivate const LOGFILE +: withfp ( xt fp -- ) fdeactivate r> factivate execute fdeactivate drop r< factivate ; +: log-emit ' fputc LOGFILE withfp ; -: -rot rot rot ; +: >rot 2dup r@ -rot r< ; -: 4dup r> r> 2dup r@ -rot rswap r@ -rot r< r< swap ; +: 3dup r> 2dup r@ >rot r< ; +: 4dup r> r> 2dup r@ >rot rswap r@ >rot r< r< swap ; : noop ; @@ -18,6 +19,12 @@ s" jorth.log" open const LOGFILE : defer word new-word docolon , ' noop , ' ret , ; : redefine ( cp cpdeferred ) cell + ! ; +: for ( from to -- ) here ' r> , ' r> , ; immediate ( r: to from ) +: i ' r@ , ; immediate +: next ' r< , 1 lit ' + , ' r< , ( from+1 to ) + ' 2dup , ' - , ' BNZ_ , , + ' drop , ' drop , ; immediate + : decompile word lookup if 1 begin ( cp i ) 2dup cells + @ ( cp i @cp+i ) @@ -56,5 +63,5 @@ s" jorth.log" open const LOGFILE : receive ( -- val ) running mailbox begin dup @ not while suspend repeat ( wait for mail ) - dup @ 0 rot ! ; + dup @ 0 C#!it|*Ge7HsG$_7)S9Siq8~t73z-uLfgcVv8-t zo;VscwrEUZVv8*%8e3LTL`AT&_j_gmjrV!~&wKB4hv&?G&*$_qXJ*bhqwD{4*?Gss zt7EULY%RHxfr#w(PZoMLSG*TYlX|Sk8t@}BX-RA<#r5*924`Z9Ht(>|DM_XE#Iz=1iwluBY zNQFL|NF_BCvZX-Ew#{x?aKuHLBxKt@GFq=XMJTRiWZSxs$ri2H;pKea$#qSqF4?vR z9j(raB-iZD(0e-WXrgE@cxfA%EKdsT_Iyu!s;z#U^%Kuzp-i+M_pB@YDq8P(wqXaX zY0CP}2Qo-HU>&7w=&ckBnoynxyf3aa+3bRKk21_$iu7(KnM@KxZYnEGeGYfG+%0If zKZEkT?dkh7EWvv+?Bl9z4{Q9K`H!Et8b6jcRS|YX@iY9r#r!=Ab66t;Jx!|$Mk%j8Q zOAj)#rPADNTd)zmgTrHOs!DThTkLX1YkWP1uPXR@lJd$|Rj#ej;VWn5cNxw;WGO3A zTK>+;ve&n@du;turFY3f9+thd?okCcyh9DQc zLx-GWSye=Hv#PSCry13qrpnef*;?pbH~H;H)y7@L zy7JI^*?XMJ`X@QI;}5MSb>N`2Pk2=nqQB3wm*{0r$q!AIRF8`MgS@+pe^}j8IhORT z871jCwh0eSwo!H-3ReLCY24;TzD^EV`2b~h#1>{RsUx%N53Co|tzBMZWZN_ktznu} z&yi1UdtOL6UfH%E9#{uyBF#w;Og7L$S>Sq5gqrfaso=Tz?=rnNgC7bAQ zv~_weIfK3rn)zJzZ_AVOQ(&&5{6smjb7dx5!AqVe4)c^UJP5eLUY*>|GLzZ1)m|dn zavhCe+a}kDrC-&Q=9I6O+>nL>X@GRBU!!q-72?`9%Mr(yRadlaycTMt#%9; zHuo||@0F7qRQ7suw$U|BQsepZeTQcx$twUq7}eyEU3toKq7wHLjq#6UR1#>@Ax1aHr?1aH;ix&VPUg&G%iY$=3d5iOSZZ!nW_ZT=1Ccp!Ts& zwqiI-FQq#0IS2AHhYwfCi;gUCPoqmsk^w&61)kvWar2(Zw(F_2u|7>hd_Y<$WfVFU zrb`()Hdbn#rXMEEcxo-t*EJ8g=g6nTN6cfc50O|mA9mwyAl!zpM1nLZQ63FF=G!$3rcA(xs`+y!*O3hT+ zwl9GO0c`}jS}7HXs6L<(K*c~ODy0QL6YiSK(kQU$V0$X1bzno`Z5+@jpmmkfPN1$p zlY#mIEv}TTx@=np&~%{oKvOGiKF_4X-r2T#pff?!K;NsB{DJBK%?7Fq)U#4b0&)Uc z2;>FS+FU7RfjuZONuPneC^6YmDy5M?e*>)px(yUkDSeEx{{plb=p2w|rPKmQ0@@06 z80cw*ZQfJqJUZ(t(Cwh#fL^bV>_GE@B%ozLCo3col{68^yccX1*uDzs6v{dr><~~M z(8dbsB~T8~5ugD;#T8PFQ?@M==qOMppy?G-cc3JopMV+zjjE73x@FsffPMyw2I^ZO zy$hrOIsv2yYF{Bub28&G=Z;A_1tx$ssE~FcvKv5WfbQQh*&-^WyFjOa&H-Hp(o{&H z&e^v8Ko^0I1KA%VvTWPeKz{;#2XyzblmlN&f&Kzo4RrCbWC5B1bOmU^9gMF>A4>bP$W

;yC9!n`;_ime{r$A3`n`{Y>rM^IyfSv>0 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 delta 24845 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 diff --git a/game.jor b/game.jor index ec9d397..33e9706 100755 --- a/game.jor +++ b/game.jor @@ -73,7 +73,7 @@ defentity player : >range r< >range r< rot - >ratio lerpr ; + r> >range r< ratio lerpr ; : lerp ( start end duration start -- i ) ticks udelta ( start end duration delta ) >ratio lerpr ; @@ -90,21 +90,21 @@ var footer-y : draw-footer footer-y @ split-screen ; -: text1 6 4 rot text ; -: text2 6 12 rot text ; +: text1 6 4 @ -rot ticks ( from to duration start ) +: move-to ( target speed p -- ) + dup r> @ >rot ticks ( from to duration start ) begin 4dup lerp r@ ! - rot dup r@ @ != ( from duration start to !done ) + rot suspend repeat rdrop drop drop drop drop ; -: show-footer footer-y 24 10 move-to ; -: hide-footer footer-y 0 10 move-to ; +: show-footer 24 10 footer-y move-to ; +: hide-footer 0 10 footer-y move-to ; : say1 ( s -- ) clear text1 show-footer ^ENTER wait-key ; : say2 ( s1 s2 -- ) clear text2 text1 show-footer ^ENTER wait-key ; @@ -123,7 +123,7 @@ var prevbutton ( M A P ) : +pos ( x1 y1 x2 y2 -- x y ) - rot + rot rot + swap ; + rot + swap ; var tileselect 3 const MAXTILE @@ -142,6 +142,18 @@ var tileselect MOUSEL mousedown if tileselect @ mousetile tile b! then ; +: save-map ( filename -- ) + fdeactivate swap overwrite + mapsize swap fput fput + mapsize * map fwrite + factivate ; + +: load-map ( filename -- ) + fdeactivate swap open + fget fget + 2dup * map fread + mapsize! + factivate ; ( J O B ) var MODE-MOVE @@ -164,7 +176,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 @ + 4 move-to ; + swap 16 * over @ + 4 PJJkOb! zqZ1-FzvNeCWEM<{m@FtLCdXy6c&V!&7lSf`@Il#)|3RE!R|WC^E_u_ zKC&uk^GkkJMrMJ9VUq;~#pGUCEMDsB$Hkz`Abe1E<9`q**p-1nfI*O9=c=H|u7W> 8) & 0xff, ACTIVE_FILE); + } + DROP(1); +} + +void f_fwrite() { // ( length p ) + if (ACTIVE_FILE) { + fwrite(TOP().p, ST1().u, 1, ACTIVE_FILE); + } DROP(2); } +void f_fgetc() { + if (ACTIVE_FILE) { + PUSHI(fgetc(ACTIVE_FILE)); + } else { + PUSHI(EOF); + } +} + +void f_fget() { + if (ACTIVE_FILE) { + int low = fgetc(ACTIVE_FILE); + int high = fgetc(ACTIVE_FILE); + PUSHU(low | (high << 8)); + } else { + PUSHU(0); // no way to signal EOF + } +} + +void f_fread() { // ( length p ) + if (ACTIVE_FILE) { + fread(TOP().p, ST1().u, 1, ACTIVE_FILE); + } + DROP(2); +} + +void f_feof() { + if (ACTIVE_FILE) { + PUSHI(feof(ACTIVE_FILE)); + } else { + PUSHI(1); + } +} + void f_puts() { char *s = TOP().s; while (s && *s) { @@ -369,6 +417,7 @@ void f_cdef() { // func name -- } void f_docolon(); + // C code must always call a colon word through f_cexecute() void f_cexecute() { cell oldW = W; @@ -578,19 +627,52 @@ void f_interpreter() { } } -void f_open() { - FILE *fp = fopen(TOP().s, "a+"); - fseek(fp, 0, SEEK_SET); - TOP().fp = fp; +void f_close() { + if (ACTIVE_FILE) { + fclose(ACTIVE_FILE); + ACTIVE_FILE = NULL; + } } -void f_close() { - if (TOP().fp) { - fclose(TOP().fp); - } +void f_open() { + FILE *fp; + f_close(); + fp = fopen(TOP().s, "a+"); + fseek(fp, 0, SEEK_SET); + ACTIVE_FILE = fp; DROP(1); } +void f_overwrite() { + f_close(); + ACTIVE_FILE = fopen(TOP().s, "w+"); + DROP(1); +} + +void f_deactivate() { + PUSHP(ACTIVE_FILE); + ACTIVE_FILE = NULL; +} + +void f_activate() { + f_close(); + ACTIVE_FILE = TOP().fp; + DROP(1); +} + +void f_seek() { + fseek(ACTIVE_FILE, TOP().u, SEEK_SET); + DROP(1); +} + +void f_seekend() { + fseek(ACTIVE_FILE, 0, SEEK_END); +} + +void f_tell() { + PUSHU(ftell(ACTIVE_FILE)); +} + void f_swapinput() { cell *key = RUNNING + TASK_USER_KEY; cell *keysrc = RUNNING + TASK_USER_KEYSRC; @@ -810,7 +892,7 @@ void f_init() { CDEF("over", f_over); CDEF("drop", f_drop); CDEF("swap", f_swap); - CDEF("rot", f_rot); + CDEF("", f_rput); CDEF("r<", f_rtake); CDEF("r@", f_rtop); @@ -835,7 +917,18 @@ void f_init() { CDEF(",", f_comma); CDEF("b,", f_bcomma); CDEF("open", f_open); + CDEF("overwrite", f_overwrite); CDEF("close", f_close); + CDEF("factivate", f_activate); + CDEF("fdeactivate", f_deactivate); + CDEF("seek", f_seek); + CDEF("seekend", f_seekend); + CDEF("fputc", f_fputc); + CDEF("fput", f_fput); + CDEF("fgetc", f_fgetc); + CDEF("fget", f_fget); + CDEF("fwrite", f_fwrite); + CDEF("fread", f_fread); CDEF("quiet", f_quiet); CDEF("loud", f_loud); CDEF("task", f_task); @@ -848,6 +941,7 @@ void f_init() { PUSHS("boot.jor"); f_open(); + f_deactivate(); PUSHS("key-file"); f_lookup(); DROP(1); diff --git a/jorts.map b/jorts.map new file mode 100755 index 0000000000000000000000000000000000000000..f0997563909558523675fb2bfc93300aafaf77ca GIT binary patch literal 10004 zcmeI2VUofi424^IRquZW^MJIdI3_g74=1eC*}5YiB=04~*~j+SW@D#OXdE=~_q+FB z7?y|~i`;gswO{MHO%a%#e;Ni1TLkt2Onc#X8pepdPKZg{V1`w?t6b&`Q$(o?f4i88 zwu}C4`g&`-i!$AZk@ZgNV&T=y!-j0!eIkyR*msUe0l5$eecJ}T2l>*S7Xn^v2lcS<~l>P%z`~y|W zU=>cky}}%Q!Ey>f9QJ|vw6df1E;;r7!Lj>X1y|K%HUW70}y%sP~?UrGp6URf~KDj zK;-vV3hQS7kSkJQrDY#w|Bx#(`-ei20mVH4k>?ME==1!cP^7|2tHnJ4k>6h_M6a+C grEcxirFaxuMcDsi!R*OhVI_*|(%CTp@i+bB3Cp@VMF0Q* literal 0 HcmV?d00001 diff --git a/testbed.c b/testbed.c index 5c44ac8..d3196cc 100755 --- a/testbed.c +++ b/testbed.c @@ -158,6 +158,11 @@ void f_mapsize() { // ( -- w h ) PUSHI(screen.h); } +void f_mapsize_set() { // ( w h -- ) + loadMap(map, ST1().i, TOP().i); + DROP(2); +} + void f_mousepos() { // ( -- x y ) PUSHI(MOUSE.x); PUSHI(MOUSE.y); @@ -180,6 +185,7 @@ void game_f_init() { CDEF("text", f_text); CDEF("map", f_map); CDEF("mapsize", f_mapsize); + CDEF("mapsize!", f_mapsize_set); CDEF("mousepos", f_mousepos); CDEF("mousebuttons", f_mousebuttons);