From ca38564024b1e6cbc0ed470724a2e34481c8dc2e Mon Sep 17 00:00:00 2001 From: Jeremy Penner Date: Sun, 1 Oct 2023 21:54:58 -0400 Subject: [PATCH] iteration, cooperative multitasking, touchtone noises --- asm.jrt | 8 +-- assemble.com | Bin 12885 -> 12934 bytes beep.jrt | 14 ++++- common.jrt | 1 + dialer.jrt | 17 ++++++ iter.jrt | 166 +++++++++++++++++++++++++++++++++++++++++++++++++++ jort.com | Bin 4838 -> 4879 bytes logic.jrt | 9 +++ swine.com | Bin 6401 -> 6646 bytes swine.jrt | 13 ++-- swine.txt | 6 ++ task.jrt | 120 +++++++++++++++++++++++++++++++++++++ timer.jrt | 12 ++-- tinyjort.com | Bin 4838 -> 4879 bytes tinyjort.jrt | 3 +- zipoff.com | Bin 18324 -> 18756 bytes zipoff.jrt | 34 +++++++---- zipstub.seg | Bin 2960 -> 3198 bytes 18 files changed, 369 insertions(+), 34 deletions(-) create mode 100755 dialer.jrt create mode 100755 iter.jrt create mode 100755 task.jrt diff --git a/asm.jrt b/asm.jrt index 7fd4d3a..8173b3d 100755 --- a/asm.jrt +++ b/asm.jrt @@ -54,16 +54,16 @@ array oparg2 3 cells allot : # oparg-imm! oparg-complete! ; : @[ 0 oparg-mem! ; -: @] -1 oparg-base ! oparg-complete! ; +: @] oparg-val ! -1 oparg-base ! oparg-complete! ; : unexpected-addr ( addr -- ) drop s" unexpected address" operror ; : @+ ( disp -- ) opargs-remaining @ if - oparg-unset? if oparg-mem! @] return then + oparg-unset? if @[ @] return then oparg-mem? if oparg-val ! return then then drop unexpected-addr ; -: @FAR ( offset segment -- ) 4 set-oparg! oparg-base ! ; +: @FAR ( offset segment -- ) 4 set-oparg! oparg-base ! oparg-complete! ; : oparg-faraddr? oparg-type @ 4 = ; array patchtable 10 2 cells * allot @@ -76,7 +76,7 @@ array patchtable 10 2 cells * allot : patch-r8 ( tptr targ -- ) over 1 + - swap b!t ; : apply-patch ( tptr type -- ) target swap execute ; -: @> ( patchid -- ) 0x13 set-oparg! @] ; +: @> ( patchid -- ) dup 0x13 set-oparg! @] ; : <: ( patchid -- ) find-patch dup @ swap cell + @ swap apply-patch ; : L: here create wordname lastlabel ! 0 , target here cell - ! does> @ @+ ; diff --git a/assemble.com b/assemble.com index 04d17ebdb8d164e98321df9dbda80e445d056b7d..c1230acf4d9ee4d5e5ec000b28ff032fdc3aa542 100755 GIT binary patch literal 12934 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 Bdj|jj literal 12885 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 XtJ)!jspk ( div -- ) MOV AL 0xb6 # OUT 0x43 # AL @@ -12,6 +10,14 @@ import timer.jrt OUT 0x61 # AL NEXT +:asm freq>div ( f -- d ) + MOV AX 0x34df # + MOV DX 0x12 # + POP BX + DIV BX + PUSH AX + NEXT + :asm silence ( -- ) IN AL 0x61 # AND AL 0xfc # @@ -19,9 +25,11 @@ import timer.jrt NEXT : slide ( div count + -- ) - >r begin over >spk 1 sleep-csec swap r@ + swap 1- dup not until + >r begin over >spk 2 sleep-csec swap r@ + swap 1- dup not until rdrop drop drop silence ; : boop ( div count -- ) swap >spk sleep-csec silence ; : noise ( count -- ) begin rand >spk 1 sleep-csec 1- dup not until drop silence ; +: arp ( d1 d2 count -- ) + begin >rot dup 1 boop swap div , 1336 freq>div , 1477 freq>div , +array dtmf-row 697 freq>div , 770 freq>div , 852 freq>div , 941 freq>div , + +( 0 1 2 + 3 4 5 + 6 7 8 + -3 -1 -2 ) + +-2 const D* +-1 const D# + +: dtmf ( digit -- f1 f2 ) 1- + dup 0 < if abs 3 % 3 swap else 3 /mod then + cells dtmf-col + @ swap cells dtmf-row + @ ; +: dial ( digit -- ) dtmf 20 arp 7 sleep-csec ; +: dialtone [ 350 freq>div lit 440 freq>div lit ] 200 arp ; + diff --git a/iter.jrt b/iter.jrt new file mode 100755 index 0000000..67523a6 --- /dev/null +++ b/iter.jrt @@ -0,0 +1,166 @@ +( iteration control stack + We create two new stacks - a small stack to hold the "current" value + of the loop, or the "i" stack, and a larger stack to hold any extra + state, as well as the cp of a word that moves to the next value, which + we call the "next" stack. + With these two new stacks, we can create a generic loop construct for + iterating over streaming values. Not only that, but those values can be + arbitrarily filtered and transformed simply by pushing a new value onto + the iter-next stack which calls out to the previous one. ) + +uservar itop +4 cells userallot +{ userhere @ } const itop-init +uservar nexttop +16 cells userallot +{ userhere @ } const nexttop-init + +' task-init :chain + >r itop-init itop r@ !far + nexttop-init nexttop r@ !far r + ( i -- v ) + POP AX + SHL AX 1 # + MOV BX @[ SS: r + MOV BX @[ SS: r@ @] + INC BX INC BX + MOV @[ SS: r + ( v -- ) + POP AX + MOV BX @[ SS: r@ @] + DEC BX DEC BX + MOV @[ SS: i +nexttop :push >next + +: r ; + +{ ( Because we dereference pointers on the return stack, we must run this + from the caller's segment. Copy the definition into the host segment. ) + : EACH_ r ; + : each ' EACH_ , here 0 , ; immediate + : continue ' GOTO_ , dup cell - , ; immediate + : more ['] continue here swap ! ; immediate + :timm each t, EACH_ patchpt ; + : CONTINUE t, GOTO_ dup cell - w>t ; + :timm continue CONTINUE ; + :timm more CONTINUE patch!t ; } + +0 var, cancelled +: cancel 1 cancelled ! + :| nextdrop get-next if idrop then 0 cancelled ! 0 swap |; >next ; + +: nothing :| 0 1 |; >next ; +: single >i :| nextdrop :| idrop 0 1 |; >next 1 1 |; >next ; +: times ( n -- ) >i :| i 1 then 1 |; >next ; +: links ( p -- ) + dup if >i :| i 1 then 1 |; >next else nothing then ; +: +for? ( n -- f ) i 1 then ; +: for ( start lim -- ) >next 1- >i :| 1 +for? 2 |; >next ; +: for+ ( start lim inc -- ) + >next >next 1 nextpeek - >i :| 2 nextpeek +for? 3 |; >next ; + +( Mapping is complex because iterators use the i-stack to store their own + state - when asking for the next value, we must restore the previous value. + However, we do not want to touch the i-stack until the iterator has run, + in case it is an empty iterator with no values. We want to handle this + using a minimum of next-stack space; ideally never more than two slots. + + The user defines a mapping iterator by defining a word or no-name that + passes an anonymous function to "map" and returning. "map" must assume that + the current i value sits below the mapper on the next-stack and + the iterator to remap sits below that. + + "initial-map" assumes a mapper is below it on the stack with no initial + i value, and the iterator to remap sits below that. It queries the iterator + to ensure it's not empty, and then sets up the environment to allow the + mapper to continue working. ) + +: initial-map ( -- f c ) + nextdrop next i >next >next get-next drop drop + next >next ( remove the fake iterator ) + 2 + 1 swap ( add mapper to count and return success ) + else drop drop 0 0 then ; + +: map ( cp -- f c ) + i ( cpnext cp: restore i to previous value ) + get-next if ( cpnext cp c ) + >rot i >next i >next 2 + 1 swap + else >rot drop drop 0 swap then ; + +: >map ( mapper -- ) >next ' initial-map >next ; + +: filter ( cp -- f c ) + >r next 1 swap 1+ rdrop return then ( filter hit -- f c ) + drop ( cpnext ) + else ( no more items ) + swap drop 0 swap rdrop return + then again ; + +: .all each i [ key 0 lit ] + draw-char more ; +: doubled :| ' 2* map |; >map ; + diff --git a/jort.com b/jort.com index 7afbfb739756ac4478debeebd0ba15670bf5fe81..84d3e4718f9f7ab0b9badeda533ed1bf19e42ced 100755 GIT binary patch literal 4879 zcmc&&dvKK16+icW&)w`RyYVqhBEBkUEB-mII znL1hGGwAr%sa2~$#F30|F;46X+d|cf6JLmuIz)8F`bsOv_MH1Ip`G@x{?ovQdw=KL z^SbA8m$7f%8TIDU1MYpEk3A2ThMa5N&z7$B{K`}1e9S%MQ9O3n$DZ2Srh)8mVH$uA zQx-0(UADBT8K$z@+QMZ5uVfa&7n~w&(e7;&Bp4-ELP8h% z>U_(W`xXj2`_3y&d&e}gcDZkUv+tC!zRON|C&QBZ<`y`e5194=$PkOi6L0}9YAk{J zrAz9U`WDV_p5Fp<`M@>VoFKi-Bv`Pz1(x$wht&ZA4HQWL3M^XIysQNR{0k;SD2Wnp z;C{gr=Msc63E0B@ji%DYT!u>sdWic2O^r>bOu3ZMU5Ku_x~UQW3IR_dd#a-~0e?b5 zuHA-=&#!XchLJiE|gT3>>kRmpf7ejpJjL7e{?qBVrtBt%iHK)bmG(nc~Gj-=S4x4xG$wI842z`O>+oj8$)lX37FaDcG!%+A(vMJb9z>7(Qro*?$GJe!V4xsNdqwx^va=`C>XZ%>>a-r`h ziNQ=5V5;27bF30~Q^hXNY5##FL2FwIs%5`rXd@pl>MIlg3bTJ93kikUOUy+LGRH8w z*Aa92ld-=R_Mo_GxIy*@t{6%0AA7fOH3C)8N5F8`t7F53Yh?yC@Sp%T?HGHuaH)(M zV7RF#6Y*qrrE)qtLws~-u5}4>7=cD5p#GWK< z)~G4_SBebt+FO&bThRg)#lwAyf`d>JXT8hNQ#7`r78E`qe(%Pu`{2Adw75Taz0rL*ZZ=yPw1iltY_vJcc-o zvYXXovIZ3qtiV(nZ|y#{P2Dc#*h8uU73++oflbU=Mmf4sWG@1dGcsNUR|zjM_P_8Q1Qx4_~d~cdquX07T1vsV>8;L4OV&guHIK}X2=U@ zOFUu3;E*<0{S2SL4`{l;Q%0m6j%$7D#en5>_H9Gnf_LcY%ui2ee%zV;@!VU6ZX2O< z`^wKV<*gupBJq>~UVX48u&-RC(o|i=kQnRJaagQ-hrD|S7X(n1pzXpaw+G{ySXxAH zrLI7G(r67qQXiZfSiNdrc~%YSg0&sRw3}|+t`E-pcjCi}1iodIM1`Al4cgl>?d{mt z=|;AZ%(X_EuHymrocE~6Wru~t zEf#!qt)J;SkkF!-C~Bl5?^)kKVkh5(j5AaT$hJ|IvswWbDk{V>(KgJVzgx58Yp!`y zJ%Tu9?uXvJz3La%-r*fLkLVw!Cmp`D``8tm=64^R)ny%@am30-=8t_^$e!@-HQx+} zzw55~!U}1eec2PMiw}wJW0jdb0?!=iJ@*Ui*v>-tvCfQp^FLU|ZW+p0NSzDD?k#j5 zo!|9r_po)&xks#Bk8~fM-u2kY-JM8gfQ=B2NG^PDil3uajSR0zVcefBxn<L6ca8^+x|wocy9wrM&1 zj9R0-$ChJ;O%rGTw*sib&?SvfI9X{nP#^YdA9mF%BtQP4?%IecosK4o^rNWpw>DX5 zL}SZ%+%{k%&||j`Qoo)YIIj&x1zu(@=dvHa&Jf~9p1U^;Fmcl2?H(Oz4hLq zZ=N21zy88M*Kbj#INv_RhO^)Fore#!^XDw%neVS&nLW5UCx81y%c{(gzD1nKht-3+w5t zOcevxX0<>#8pWHY_xb>%D3JHV4v%8`z6*s^q|!vDHpCqYdTla)=b(2(5?@Nc#G?tw2`G3OPST|3acVW;yHXR#FyFz#&R zC9ct|7;kukT_V*GrCv6={iD6Vrb0Vt8bbZv9}+7;y=xG0tP zxHt>9i!e80nDeT684tK*W<>CTL-CIyfnX{r^C7k$131+oGkir-J(~nnYFAjBu{LaC zIkpn_*hg{Fk(hs#UtOxQq>(UM%^M~Sd7<7+PD4{z>)KW!$kb0cp_M8OUr=H5eL>;~ zeMe>N0#q<+E#ntLCtmPNr8)MsOGE!7;h51SlvfMsrgObc4Z2Js(k?~r=}yk(5aYY0 zl*~CcTFP11sa*aVdEzb!Qj;k^sa==x$#6hEi0%1+Jb*gqxwmOiKE-{qVV~vZEHxRK zDVti{@0Lz>lMp=SF0toWLn&j^ka~`NCw3I#xzT+GUZduw(ryj4Cy+=p+$TkG%#XNe z?HB7D+vL_wCNr`JwJq+MIOM07DiAX0IY@=|8TwJiE70v6TU)AA*EiZR97v>IO%?sJ z8yhTvVfvC$Bv9#ZvvZh1U44!#kK+L!_GmbV{WvVvOIh@GmWQ5hn=lI=;CcRva;zlE z&-CQjVmG}XMTJ%tzl4E+~$PwG*k{7JMa$E;2nqLetJY{XUL(eRya zw8pSUkFpAWk4J}eIJWV+c#@Pn>e=gg-!m1x*!`u);a9+Q+gn++Lc>aZ70mxU`X?qh B-pT*~ literal 4838 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 diff --git a/logic.jrt b/logic.jrt index 8b10d31..dc87a1e 100755 --- a/logic.jrt +++ b/logic.jrt @@ -36,6 +36,15 @@ dbg" math" :t / /mod drop ; :t % /mod swap drop ; +:ASM abs ( n -- n ) + POP AX + OR AX AX + JNS 0 @> + NEG AX +0 <: + PUSH AX + NEXT + dbg" comparisons" L: TRUE 0xffff w>t L: FALSE 0 w>t diff --git a/swine.com b/swine.com index 8b29bd8cecc41f8da3f290243234be34c90d49b5..1c3c249d10e4ad4815049f87810848b0478e6528 100755 GIT binary patch literal 6646 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 const tasksegsize + +( taskseg -- taskseg ) +deferred task-init noop + +: init-first-task + taskseg dup next-task !u task-init dup first-task ! last-task ! ; + +init-first-task +' init :chain init-first-task ; + +:asm unlink-task ( prevtaskseg taskseg -- ) + MOV CX SS + POP AX + POP BX + MOV SS AX + MOV DX @[ SS: next-task @] + XOR AX AX + MOV @[ SS: next-task @] AX + MOV SS BX + MOV @[ SS: next-task @] DX + MOV SS CX + NEXT + +: prev-taskseg ( -- taskseg ) + first-task @ begin next-task over @far taskseg != while + tasksegsize + repeat ; +: next-unused-taskseg + first-task @ begin next-task over @far over last-task @ <= and while + tasksegsize + repeat ; + +: task-complete next-task @u prev-taskseg taskseg unlink-task resume-task [ +: task-arise execute task-complete [ +{ : task-arise-host execute task-complete [ } + +:asm link-new-task ( taskseg -- ) + MOV CX SS + POP AX ( taskseg ) + ( save the current next task in BX so we can point the new task at it ) + MOV BX @[ SS: next-task @] + ( link our task segment to the new task ) + MOV @[ SS: next-task @] AX + MOV SS AX + MOV AX 0x100 # + MOV @[ SS: tasksp @] AX + XOR AX AX + MOV @[ SS: taskbp @] AX + MOV @[ SS: next-task @] BX + MOV SS CX ( restore the current task ) + NEXT + +: push-into-task ( v taskseg -- ) + >r tasksp r@ @far 2 - dup tasksp r@ !far r r@ link-new-task + r@ last-task @ > if r@ last-task ! then + cell + tasksi r@ !far + taskcs r@ !far + r@ push-into-task + int ( isr -- int ) 2 cells + @ ; : isr>code ( isr -- p ) 3 cells + ; : uninstall-isr ( isr -- ) @@ -46,7 +42,7 @@ var timer MOV AX CS: timer @+ INC AX MOV CS: timer @+ AX - AND AX 0x03 # + AND AX 0x07 # JZ 0 @> ISR-DONE 0 <: @@ -62,7 +58,7 @@ var timer NEXT : sleep-csec ( cs -- ) - timer @ + begin dup timer @ <= until drop ; -: install-timer 0xffff 2 >> set-timer-div timer-isr install-isr ; -: uninstall-timer 0xffff set-timer-div timer-isr uninstall-isr ; + timer @ + begin suspend dup timer @ <= until drop ; +' init :chain [ 0xffff 3 >> lit ] set-timer-div timer-isr install-isr ; +' cleanup :chain 0xffff set-timer-div timer-isr uninstall-isr ; diff --git a/tinyjort.com b/tinyjort.com index 7afbfb739756ac4478debeebd0ba15670bf5fe81..84d3e4718f9f7ab0b9badeda533ed1bf19e42ced 100755 GIT binary patch literal 4879 zcmc&&dvKK16+icW&)w`RyYVqhBEBkUEB-mII znL1hGGwAr%sa2~$#F30|F;46X+d|cf6JLmuIz)8F`bsOv_MH1Ip`G@x{?ovQdw=KL z^SbA8m$7f%8TIDU1MYpEk3A2ThMa5N&z7$B{K`}1e9S%MQ9O3n$DZ2Srh)8mVH$uA zQx-0(UADBT8K$z@+QMZ5uVfa&7n~w&(e7;&Bp4-ELP8h% z>U_(W`xXj2`_3y&d&e}gcDZkUv+tC!zRON|C&QBZ<`y`e5194=$PkOi6L0}9YAk{J zrAz9U`WDV_p5Fp<`M@>VoFKi-Bv`Pz1(x$wht&ZA4HQWL3M^XIysQNR{0k;SD2Wnp z;C{gr=Msc63E0B@ji%DYT!u>sdWic2O^r>bOu3ZMU5Ku_x~UQW3IR_dd#a-~0e?b5 zuHA-=&#!XchLJiE|gT3>>kRmpf7ejpJjL7e{?qBVrtBt%iHK)bmG(nc~Gj-=S4x4xG$wI842z`O>+oj8$)lX37FaDcG!%+A(vMJb9z>7(Qro*?$GJe!V4xsNdqwx^va=`C>XZ%>>a-r`h ziNQ=5V5;27bF30~Q^hXNY5##FL2FwIs%5`rXd@pl>MIlg3bTJ93kikUOUy+LGRH8w z*Aa92ld-=R_Mo_GxIy*@t{6%0AA7fOH3C)8N5F8`t7F53Yh?yC@Sp%T?HGHuaH)(M zV7RF#6Y*qrrE)qtLws~-u5}4>7=cD5p#GWK< z)~G4_SBebt+FO&bThRg)#lwAyf`d>JXT8hNQ#7`r78E`qe(%Pu`{2Adw75Taz0rL*ZZ=yPw1iltY_vJcc-o zvYXXovIZ3qtiV(nZ|y#{P2Dc#*h8uU73++oflbU=Mmf4sWG@1dGcsNUR|zjM_P_8Q1Qx4_~d~cdquX07T1vsV>8;L4OV&guHIK}X2=U@ zOFUu3;E*<0{S2SL4`{l;Q%0m6j%$7D#en5>_H9Gnf_LcY%ui2ee%zV;@!VU6ZX2O< z`^wKV<*gupBJq>~UVX48u&-RC(o|i=kQnRJaagQ-hrD|S7X(n1pzXpaw+G{ySXxAH zrLI7G(r67qQXiZfSiNdrc~%YSg0&sRw3}|+t`E-pcjCi}1iodIM1`Al4cgl>?d{mt z=|;AZ%(X_EuHymrocE~6Wru~t zEf#!qt)J;SkkF!-C~Bl5?^)kKVkh5(j5AaT$hJ|IvswWbDk{V>(KgJVzgx58Yp!`y zJ%Tu9?uXvJz3La%-r*fLkLVw!Cmp`D``8tm=64^R)ny%@am30-=8t_^$e!@-HQx+} zzw55~!U}1eec2PMiw}wJW0jdb0?!=iJ@*Ui*v>-tvCfQp^FLU|ZW+p0NSzDD?k#j5 zo!|9r_po)&xks#Bk8~fM-u2kY-JM8gfQ=B2NG^PDil3uajSR0zVcefBxn<L6ca8^+x|wocy9wrM&1 zj9R0-$ChJ;O%rGTw*sib&?SvfI9X{nP#^YdA9mF%BtQP4?%IecosK4o^rNWpw>DX5 zL}SZ%+%{k%&||j`Qoo)YIIj&x1zu(@=dvHa&Jf~9p1U^;Fmcl2?H(Oz4hLq zZ=N21zy88M*Kbj#INv_RhO^)Fore#!^XDw%neVS&nLW5UCx81y%c{(gzD1nKht-3+w5t zOcevxX0<>#8pWHY_xb>%D3JHV4v%8`z6*s^q|!vDHpCqYdTla)=b(2(5?@Nc#G?tw2`G3OPST|3acVW;yHXR#FyFz#&R zC9ct|7;kukT_V*GrCv6={iD6Vrb0Vt8bbZv9}+7;y=xG0tP zxHt>9i!e80nDeT684tK*W<>CTL-CIyfnX{r^C7k$131+oGkir-J(~nnYFAjBu{LaC zIkpn_*hg{Fk(hs#UtOxQq>(UM%^M~Sd7<7+PD4{z>)KW!$kb0cp_M8OUr=H5eL>;~ zeMe>N0#q<+E#ntLCtmPNr8)MsOGE!7;h51SlvfMsrgObc4Z2Js(k?~r=}yk(5aYY0 zl*~CcTFP11sa*aVdEzb!Qj;k^sa==x$#6hEi0%1+Jb*gqxwmOiKE-{qVV~vZEHxRK zDVti{@0Lz>lMp=SF0toWLn&j^ka~`NCw3I#xzT+GUZduw(ryj4Cy+=p+$TkG%#XNe z?HB7D+vL_wCNr`JwJq+MIOM07DiAX0IY@=|8TwJiE70v6TU)AA*EiZR97v>IO%?sJ z8yhTvVfvC$Bv9#ZvvZh1U44!#kK+L!_GmbV{WvVvOIh@GmWQ5hn=lI=;CcRva;zlE z&-CQjVmG}XMTJ%tzl4E+~$PwG*k{7JMa$E;2nqLetJY{XUL(eRya zw8pSUkFpAWk4J}eIJWV+c#@Pn>e=gg-!m1x*!`u);a9+Q+gn++Lc>aZ70mxU`X?qh B-pT*~ literal 4838 zcmc&&dvw&*o&VnZd(L|@6Kfw^Au6C^l))|*Bq0z6$blpS2{1+g>A}{%w5||e$s^FQamzoO9-@*S-R`D6Y$o(FyZ;{T)XW6yK` z`udiE!pYJ+03EJh*<9b;)Y1xbSbcrzc7azj8{sRi5cX+DLV^@zb|P*3D_US=pJoy7 zW-1XkE#Cl3*&GJIU;%8ze{m7O1-plp6|QS;LWPB05DeDW7fzS0Q6X!X`D_YaW{r(~ zyFkD{Vh$3zGPo+ZVMB1Gu(NMgY2F)_k@Xvb%Ugq2g!SEi#XA|+HMDMn&+!4vJ^&d~ z>2wBe;AM>tXlPp3&=g#`ymk3DSjGo76^erN0+V3HmTj80#IOeb8GW9 zi171FhFBIQew~K}Q<_T<%V%I84~HzJYq$&x3Hl)qM_NKHS4_E$&_P5uuWt$AUm@Ue zWY6tx%fP=OA$0kkWJvEavT%kM&MhkKwybv`=hAH2gpWxCN)YG2jA$*PP6<&IE6^Tp z1JlSRTU6%w;Oi~~#!tgC*6HuNY;m3ESzEzj{wq7i3y;N9rQ4lE~=EDFQ$R;eW z4>Jyd`7k1d>n_KKK{dQCMZ!0hS)NDR0@ZL%3a`1saua-rEElFNE-6l8{#p1tMF)tArzgGS9~(b17V>Y!1J9#$wVHlv@jn2>QT+dNIli zZ-NFTe5%Y;hfE7^g$N>Lp8bqL9VC=Uxm|2Pj_q}Dj}n<_6W7TSR3E#Vw;m#6Uw1YJe@)uCRtjYlr@-} zz*5VZcx(5mYt>^?kv*U)Fn6bsHLzR#!B5RdYzEk4YKKx}Pav6qDm?O-`WhlRL`=c6 zk(Fvx6=p>Cixa<9wK7C!`o)?56j;v889Pu7z>8c5T(>0>=_oR}v<{_`gZG%!%Uv2N zsnBGI8i@q@#}{gfSm%&)HPWUrnsk!9=;a}v)y_)&Y*0O;464J@OKOsD(Wr!&#^7e; z8AKBX)jPCfNGr1WDqfidUp`P|kIFXD%XVku*ma)KhL#3Kw~SX=8S)dfC7m%+FscpJ zJk4kDVNDl!&PcSw`&yrRGhjJ=>A*;!6c~9j|CcB8pFUOi^qT!62PWv;c-1URUM=~P zNaqarqCQj`8LtwlyrQN7MO~DWX@WE6|=b+F}sV zhn7XQY#y&FsExW{ZALNemK$CAP~G1WzpY3RY^EeCb?O?lZ_l^4V*{rfIYcsd7$#lE zQTB-b5#Ovoq90V&>K)2@ImAcxF8&?8$bLqAnY`c|4Z^j zB;zK0st-}Pgkin93<8{F|E>SK&LNsbRh8ThE?Xsc;qM~bui@P!1Uy>+Ux_Gbcu&tkM*69ifeb|23b_^?JjGs{s+elnM@X@utqU%6H z%VIX6Mmq8<`v4NV_)cWJT9tron`BSf?Euw^3aNZ@JLb<>d*Q;?O}|!8A&!~*ZeX-m zebe51^7sQ2`n%@rbGP+;w)o!VJ<|)i?H6u2WoHx1r_PoNmja{KYv z3YWH&Ukp8;Rp(z8c>e9)Yu>a^Jyq)YtSj%^`w7dtY$JIasq@0rky6j}^6qDQPTH4T zbIRWRNYC_5-9Nv)dkD!4uo1!sk{2JA;^!^9MuyksFz!bk`zH>J{OSP*j?;V8qEdZf zV)dqB9bV{m{HqK&tiOt?)N^vflnQ}SWdS@hm^6qngWT$LG=^0 zA0>2a-P)iUb`Gjz{8j0!^u9XF^_ud&`W4q+S1<3t74612mEz0j*}`~=I_9u6#_3aJ ztuAciX4bNlYK{6%i{_H)a){Afok*uU@v%MIO-UHp78q>^jQsh@3-2`C z_*%n0<$BMlGwfvH&waD-fp*=JW}g4A^>-Fd?=8w7KDKRh{)4{NoV~L5q|y>9{6^&A zo%BpBuXkx~u*6qK^VzI{lY>V7HSQwIx^ZM%nkU))?w?{DS8Z!(Yz(e!pzkb88L+i> z8^n`IylHxv4={=Xd4Jq}QMP=47=_HunM9^GH0@H*Ym51JZhALF@TK%MJbIM<&P~C3 z$<9~=_xie>4cgh^(w%ZW>$WSyS-J@(5O zwghZ#dpu9OUD#kTqcZrlubdsn-RI?L_j;MC>J86g%&x;|-f@rT3TL?$4zOu=h=1gH z9O=Kocf&FxOO~#{5w{E{+UK!7%yUXW=p-w7e&E5lW#;E{Fvr{aIdO|FuO0HKn2~Ky zq<1fa8t=C*0{f=(m%#qMVSE93qdSdgC&oV7iF)qvhWLHn8vaf1jEE{&A=KWCyhhiI z_XF&Rn>zeYyu)Z}7k|$l;sf6ExW3AZremyTf*^`Z!33a0e%pJ{Se)+buJEMN&Om1XSu$*mh$_+`@{i z4)@qcang~Pzm`9@LS}`Hj$q7yPq|B74WHq5p|^%IFr#YlL*mxqtF#&}|Ws_7BMI_i(m^7*AAC zG8fr+1!vt?a`_$P340~TT}$~%?Yfd*3&ZkhY|q2;_fY4JzC&7)yL^`$w&de1cP%ng zHm&iUsBrj5NF{gpKEn37sDiP1NL5@%++Cb_+I@TQ>i$$grQH^5&mfUzcu?AeWBx@i zt;1qnWIKJj#bibH*ILf^c^vZo3I$>YJqM|iR}Ih69PztEr-Y z?!yL4V4S{WlnGS&hg=+Pp{{{=#;YP?HBy?bh{U`;3yyCk1CUn zBxn923;5{$C@QqN{3WE4cX}%MVb3eRO1=kIkK+o{u7c7tZswxdc*exy!4~u$+P{QA zRD8F;17G}i`(IP6*7CMbg&59>86su=qyAn_z67NXCCMK`n~Lm1w+u;2oJsbgx5ux8 n8Bgu$NM}iCpZ{6^9JG1(CBHkYfcL=b1=XWrU7i5z|AhVrE*Hdh diff --git a/tinyjort.jrt b/tinyjort.jrt index 2a246ac..8c5ba73 100755 --- a/tinyjort.jrt +++ b/tinyjort.jrt @@ -494,7 +494,8 @@ dbg" flow control words and misc." [ patch!t ] drop ; DEFERRED main interpreter -:t tinyjort doinit main terminate ; +DEFERRED cleanup noop +:t tinyjort doinit main cleanup terminate ; dbg" boot" diff --git a/zipoff.com b/zipoff.com index 71bfa3c6aece25bae4880daaa14e3d5aa0682594..f66d5cf6d2edd0e54e6a304a966214a735fcb36c 100755 GIT binary patch literal 18756 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 diff --git a/zipoff.jrt b/zipoff.jrt index 25b5e91..6ea7819 100755 --- a/zipoff.jrt +++ b/zipoff.jrt @@ -38,8 +38,9 @@ array $DOFAR JMP @[ BX] asm-com -: te word tdict dict-lookup interpretword ; immediate -: tlookup ( -- tcp ) word tdict dict-lookup not if dup err then cell + @ ; +: tdict-lookup word tdict dict-lookup ; +: te tdict-lookup interpretword ; immediate +: tlookup ( -- tcp ) tdict-lookup not if dup err then cell + @ ; : t' tlookup interpretnumber ; immediate : t& tlookup cell + interpretnumber ; immediate : t, tlookup state if lit ' w>t , else w>t then ; immediate @@ -99,13 +100,14 @@ s" coredefs.jrt" loadfile : t", begin key dup [ key " lit ] != while >t repeat drop 0 >t ; :timm s" state if t, INLINEDATA_ patchpt t", patch!t else target t", then ; -:timm :| t, INLINEDATA_ patchpt t& $DOCOLON w>t ; +: startcolon t& $DOCOLON w>t ] ; +:timm :| t, INLINEDATA_ patchpt startcolon ; :timm |; t, return patch!t ; -:noname DEF t& $DOCOLON w>t ] ; +:noname DEF startcolon ; :timm : [ dup , ] ; :timm :t [ , ] ; :timm ' ['] t' ; -:timm :noname target t& $DOCOLON w>t ] ; +:timm :noname target startcolon ; :timm const CONST ; :timm var, VAR, ; :timm var 0 VAR, ; @@ -117,6 +119,9 @@ s" coredefs.jrt" loadfile :timm lit compilenum ; :timm deferred DEFERRED ; +: :chain ( cpdeferred -- ) + cell + dup @t target t ; + dbg" CREATE" : CREATE DEF t& $DOCREATE w>t 0 w>t ; : FINISHCREATE ' latest ' tdict with-dict codepointer cell + @ cell + !t ; @@ -139,19 +144,26 @@ var comfilename : readcom ( filename ) open 0x100 target! begin dup fgetc dup EOF != while >t repeat drop close ; -( we write a fake all-null PSP so openself can fail gracefully ) -:init 0 target! 0xff ALLOT comfilename @ readcom } ; +DEFERRED init noop +DEFERRED main noop +DEFERRED cleanup noop + +tdict-lookup cleanup drop ' cleanup redefine + +:init + ( we write a fake all-null PSP so openself can fail gracefully ) + 0 target! 0xff ALLOT + comfilename @ readcom } + [ tdict-lookup init drop , ] ; : writeenv ( comfile wrapper -- ) swap comfilename ! dup type cr writeself comfilename @ dup type cr writecom ; -DEFERRED main terminate - dbg" boot" -} : start main terminate ; { +} : start init main cleanup terminate ; { 9 <: ( actual entry point ) MOV SI t& start # @@ -165,5 +177,7 @@ dbg" boot" } import common.jrt { +tdict-lookup init drop execute + here s", zipstub.seg" s" zipoff.com" writeenv diff --git a/zipstub.seg b/zipstub.seg index 192cd705efc6d79f4b0b53bf31cecc7a301e83b1..2ecde3c368dba1eb1c2cc4631a2872c5ac624cab 100755 GIT binary patch literal 3198 zcmZ8j4Qv$072Y?q|92QjBnTn#k4TN{P{&8>qa<0!=41$Mj~uvd)^`DkYlYHQm8@Xg zMomdl)QI(2Mv-Ezw9l3YsR>ZmxEF&~X?BnCLod=Wt&(zx*;GjItvDoN^Fz0ye8YJ!`whTs-8H1LTK35Q*; zpr?r2dYhw7h;k)P66LSU-r;0Vm~R+{fN%~ zL+IV82R@vgi);~|;V>D3W{9Jl0j7OGY$N?Vnf1K5t|Ym^aZ#BYoDj-2MrxVPeeT}E zJl2l2e44xD>J-(17qYnv?!8=n@pSH-TZ}4lPZ{Ga>0HYF3Ny!A-pL(w<1k15O<3&3 zR7jP}2vW+t@Xv6%Nc~yV10LQ&o9xlg1pX4!uL!-J+F1|oLe)bL(3p4J-lnm_Y3pZt z^<}YekZQ4VkCbJ4fp(F`_Gx^xax`Y|73vp^;=z)v#q4r#Vu2j9spbfl1tbn_l$Cg& zypv3zwi_Px?}jAGZ}{Wzu>6SpRk;E;;lx_G$X2999p{fpa9k2+J1X~6X=D)(UICKC zMjSHmeR+a*fnR!#K8sp2{6e-;+hS^#`Es!lxEKn`bEYK}5EHEwbS>U%|fdxetER4f3If)tkOWH)E^cc^9d6Y3D zF|%;qj0F)3maPVQ4jA?LyBmCFBH3J^8UMhW&aLEAtjshs#>O=LsseCtivx4y&-Mfbv++&-VTIR zwyl7h$12+Z z*o6<`(4fpfK@?Nz^U_JSD;dzVdcsbU#%CLp8X|nm zV0-n!KebMh!x{k5Qt7I~^iCy=D+ggj8^Vk7X?`mA<8CPWNo^1`eLwfa)<3V!U^B3c zfXr&IBECXT-7~U8+%%8qfplJHO`}V@`CIG)*Lyo%@RAfo%z|%P5Vqh+-a!xW7Jbly zN(+J(eBFYz7CdUfV{!PI-ifWj7HqI!qXkb{u-Sqw7BphNR^WMhOHZh8>druRy!z9< z)8{W%U#~vpAR;n)k7aa!{)2E*|E#05R|cwjg>QYJ`Kddlj>Tg5Z~gC18&c(E_< zNC(_Nx@Xs|o?SP7@7ySEPj`$l>PT6MSXpYMYGWg1{FtvY0_nhTYF!K+70!LVk$NH) zZ5kn@B^3}^VnHdp`s1+F%s`KE+^9rZ zVouN%I9T>cs4|-&Vzy`P7>l#Sgg_d-V${)~gH}hDJB;J1B<(SP4A7-!koG~lxzgN8 z2B8(#&z}Xd0-3e+0p#?0oYy#~$LKSf&86lhbFmqRYSL$(VR3_rViT+7h4!=JRY~N) z_5h~}8Pt&1jWEU+2R#GKx=QPDunaoP8WJX_%`lI@7^AQ9F@1uv58(mMJ;a~5%B&}q zJf~r!3)1EyUo(8$7Z~pth-D|UljZokD*t8v(f{Ea`1vj0w}H%gJHi@?^#E%rA}z-# zNuEg;P;RjqmJ^Ggq+uNOq}}%ej3w}P-xkbp0%ydhdKj~N-IwQ7;H6Ljk4qry(v3(} zLcQ#(t8(!9B~5D4dP}ED?YWFSSLIe+@h$TA2B$*yRNdasrs}-xF8Pvp`DKj^Fs&B% zqrxwKcda+E@k@&QQ@#^Cmn7!zy3GC^+RylVk1${B(AT=l+x>KEJNMY)@4xu9qxVR$ z*=wT7e(Arw{h^!QEUO4e)X#RJ)IS4Zyd7qslVpH(%WM9p@i*TP?D4bOXCUe?^$UH! z9`$d9Qh%O#26GfM%W>^iIEucCNPhMb&ayw|B?C!X#G{CloPk50JOu%mPa=G!|8 vHmi9DXI|55FxGPZCi>u~3o^JL5;*wgDvkSOR?B9io)jB{@WKLCM>G5nlbJ`* literal 2960 zcmb7Ge{57$7Jld6_ha6?Zp#{@Q3P6}!%(%$kWf(fLSfPhsS_&A$}1DdGKTCQW+S_l zZX&xPvT6D{n>NjctsApTP~$GC)uxWv$`1!hDP7u5N8P1TqAsn~QQYi?WWcuedG5V$ z#sa&4Y|`mD-*>-z?z!ilduKBDQw%EW1O0m8l9Lpo z?$U6$w$tfzmj)pmc30)yX5+=0JP0M54T)Aj5Ev*7&^irDWo0<*d@OXogh(XbpycPo zm++XLCcY}S%pajsMtT{9^ayl5>6{gA0_rC8PT_WX)Cm{_TQF&`Yvjanu%op#wGw=R zpzev<8vGNo>xgUQhA43+%H3ZP!7m`FLzw`JIKU|al#;~bUCMCD3WCL0MX*Gbm0}=F zA`#cy&?e$G%n7y*S>eP;ylO7Keb(7N=TyxKY7fSRF`3AIVpm8nPNMcQk8LOR2FV^q z_S#p{??gZJ{0^;*&lo=`CoAV3+exc+G&q&Lf2z|PorLc{fS2N?RA9v%O~Z; zqtu87Jke?H=VhZb+G>dET%=LENxGkLiAVnjeLLU{%%O%Fj#M!qG1yD_7EN_G8A0zk z2qJfn8pMsCyjLx>HDy7|=y3&3D6)aqsy$R0ULY0>f}-$G3{tRB9ii<|pgct*=4C_h+ielkO5_&GSC?43=9T7 z1||bP1B*ccgC8&`WKa}?!)hC5@NZ=;t)_=X4m_fY8Of2Nc_R#J7~Hi2l%68ZZqY5R zIq-@aU$aT=9W}0YS~}zHYEBzMRq@TLj{O6FRyOXro?CEU1%f&+D`4^X4!6NtDw#P^&Y&)LE;)i+ zV_vt{Q+|7cG6j$5F`dVfb5t*K4prl<`7vj3JjXn!cf&co9fp;D7(#nS;c+%2`!S+- zk-d!eEy4Ea7c@RPqR$H3qxX84Te%v=*t^L~lrxQ>8W;cmk3nwV>v`uGx5*DbILGZr zCr=#bHu3h+UT*u&4h(U7DmD5yZcnG*KhJId*oBc8lxkVH!)OPhIAl^^Y&@$~iIoF+ zuFT+>@oriv`sE<0(o%3mUq^T+T@lqO)m9Q2Ba7Fo8$L7+k`dekAX}_l(76As7QvbQ z&}|IhYq&*pWg}MOOXF3eAFddUVjVtzyOG7qz%v4J$!I{{=S$o+e208pZufrTkVo=JUoWW`a4>Nd#!J{$wsqY|O4L;#9 z1{)b{V()90g~EWf_|jDw8K=rx|v-MLr)Ro@Ff z-V?`ti64gsw+@#`(Rp8jb>XYx!HXF2K?NW4g)PaD8%n;h=i4{-Ouy+&FaBM!WsFOQ zOP0u)nweM=9WD`V{zEgA3=JmMM=?;o?*nFHZFFnhaEYVeYYKL?nW(stVc^QwZyQvb zh2%c7+WZSGHrw#qq8pwz2VjHAk2#B@V^nI&k=bvC##{QL>52420KbHDulkGM)6@8L z2U;H^Gh$(RAiS2x%)&fFlmdLR+q`3<0`b*Wk_h3Cc^i%3XB|0Z{y}8H`BUaTGlI{& zRE*GGL@6_;$-U-^;!~z;%HsN6{)#dO|KCrQdZVj&s@R@M*)wHs*&=_XzpH#IY)@4* zeL7X)<#eaN4KGs)xcw3BhHZZNRgF#L^45EXhW!iuS4B3Q<7gaFoBzMo%lFr$Iq>s z>rrbxU{Q-_!|TD(SD4#jtLrGQ?Ru>3`pF#ybZUpFaIZDF?F zs%7CI7N57?Icp34N*aK7MCdFWvUXb1Z}iC-Ips8_Bu7%vMhit0`SzyZB@d5@7L&M| yW???wlE-`lTZD4Vw-WPMDB7$WnhR36IRzYSzarCAd9LNya@6dHmI9vVF8B^K)B#KY