From 85766dad460d1bcfa8d84b673d6453308c338b0d Mon Sep 17 00:00:00 2001 From: Jeremy Penner Date: Fri, 29 Sep 2023 15:25:28 -0400 Subject: [PATCH] add file i/o to zipoff, implement persistent variables, write swine meeper instructions --- assemble.com | Bin 12801 -> 12885 bytes common.jrt | 8 +++++ file.jrt | 81 +++++++++++++++++++++++++++++++++++++++++++++++++++ jort.com | Bin 4709 -> 4838 bytes swine.com | Bin 6108 -> 6401 bytes swine.jrt | 22 +++++++++----- swine.txt | 20 +++++++++++++ tinyjort.com | Bin 4754 -> 4838 bytes tinyjort.jrt | 48 +----------------------------- zipoff.com | Bin 17237 -> 18324 bytes zipoff.jrt | 3 +- zipstub.seg | Bin 2052 -> 2960 bytes 12 files changed, 127 insertions(+), 55 deletions(-) create mode 100755 file.jrt create mode 100755 swine.txt diff --git a/assemble.com b/assemble.com index c87cb60fd68bab3f367c210c7d99b3a0b7979d01..04d17ebdb8d164e98321df9dbda80e445d056b7d 100755 GIT binary patch literal 12885 zcmaEPN@$C^s?mJ|UBeBACl!v#XdC~~-)t1DeNF7CVYQ*X(K#b+V`t~!wVj9mt1~cg zFsQirJNx?uhcKuzIy?V22aD@6a)QL25E5PNGXlU;u8dqDsZb<2!vkIH5Xl5aHjreP zV-SN4qbef<10#b0LntEyh+)VO%E(yD2({41-;Y6+v9pZ9)z#U#^B&k}1_m~UqSTVo zqCAEZjK03zWei~9d5qj3LtR|mT!VsKUBK?_mjADQ3F1iSAXmo_SA=2R<_O=hF!*?e z#50I7t%bOcfq{h~FF(J4L4yfwGy?-SgQuU5r=P2fV~ArsgFVyQu+C#(sojjs3{Fw; z3_(nhkJ;9Oh1No)7#LU?-2FrR;~AovUNN#Tq!i^BFjO%`fEDF4F*Br;7BF-%MFc=B z^`i zWvN9B512Y1oBc0`xSpGdg~6sMzl7l%$cW&8K(GU3nOGR?K%zX%5z&zWfe;fKm^c|q zQj2mk^Abx^8Pu7#_-tS}tH{8>&X8J>np|3v%3#eL{a>AtnTf%!h{2t?-;Kf56>Q#X zCME`(B8DhtU*G@G7@5Sx#8BkGkjwnP>>pT73NtH15jYqcnSFi1LZu)fus^0Scf0-T zj{DOY_pj6K4_FeE9<&+OGDk!+-hc$hR7NHSLv4lw%n=R{0gw`1h6~Km5t>jX+nJdd z40RbEGe>wJlxQ)0W{!^d{u&~3m5GHxKQ}*xfrBMF!tm1f-vL2j`~EUBGUzj`Wn^Qi zU^>RA%go523g(?+0`dRy!&I2WjIB%ECdpYU9C<_xqei6eukm!w)o|g^(`&gJ56m1#SGA6PFvK(W~VPRsh z0dbqb+*%eU20IY92+ReAjT*xnmWXIYXxJQMVPvRb_y;x*8Wb#y3~>wstP#R@JKFw$c1WR188Rph|R#9*Y)5X~BK5vrz# zk&(fHA%`^@T3iINGBG4MFx0X}!;1-J7G{RhBnO6xATfg{5VKQQSr{DB5{np?v$994 zK{c1KvN9xrMfZY4;U;WnVPsHbxX2pa&kl~5jUY=D86L4lM|40$PO`EvD1wap2GR&s zb`xYASd@p2Jvu@Ss&*+e6N9!Qg92N01T%XlL_Y%?7lTu%v$t!AuVb(`LntG^6e}l# zk7I~yaEQN~8$&3gf;ck=gNvtgNU&#=D?=!w(i~PEhJvEZ+{B_v-IUDa5(XPaW=20Y zE(Q=MGe0k}sFL9cV?Nsx7Ip@;oWzpU;u40nj7@CbY^#}%F}AU>GN@&w7Ns(%GKLz1 zN&qltE#oq_EY@R;tJqi>Kmv*kAd&N|#~6#*SQ$z{LJXmd|83dW7~n=u0_(WN#tsz% z>6yd^((@K9R$Nk?n$Dog7^ilSiG!gyH9avWCqJ2CEh8^`7OMyogTQL$4kli9kOo0^ z7KY^1oE(NwMkXV6RxrDmVJ)LO>oLaHtgH+mogiOyFarpa#dZS|Tznrp2Uxr~H7AYXDSJ1Y4g=?b66wAJ zhW`x@tSkMyuJqUX&R=pp2l{S+^qp0dhnQyv@=s2FaVmop#}>Qjvx?xP#K*zLP@I~Y zU6RjW$YFTE@Z=V!=qRY%95yzFwB-EKyb=agMn47z4pxS=qSV9`hG>p0_R&$1XB9iy zd^y0z_;au^q(Qt}MNG=bw7<6@Ayf>N-$Q%v(Y9%Z zNY2kI&d*8JP0h_LVfe+d1r%IhhjnnUFn|T0F#h0p&cVcxT*R=JQG|($ftOQ+iI;(w z^B7|fI}<}v4p>+LEO3^Mg`uRfAeCV)V+T_;D=4t zl?-{DTR6@t!g9AR6DNbGpHrwCG_%xKak4UG<|UP;F{mfo>VvOVf zMIlIZ4%bx9)y$I^Pcc1UoyrL^&Je5)6s@N@I2b^NLX8RI$^r-Wey+6~Afqz4jxma} zF*AVN_JnagmjDBUE-M>DUTJPpY7xUjuFmgqVaM4na&a*j9x%LZc(Q}-GFQjpHElOI zZkH%LHg5QBS?}2J+MtH(yWT}E#v6_=AO7$BXLu6QIC%V}!R|5_LkZLO8=e26pe=@m z-@2tIz~ZG>JLE2NyT@1rOlIO{D9^|&Ni8l&Ois0DVBm?cRbVLLx8-Fh;j-moC}Fkb zWGLmttle2SSr}6DGwm6Scp^9tl(5?V|Bp@CJ8o8n^8BI{P$4#nv4ZI=R|nHSZcrwT z;Q_JkF&XfzVF_Sr;HhAm#5kG#7~^F2vs}4MSv$(8vin2rT~I)R>xiFhlNdXgYS?SoH?u|XY-T&fbdLEU^HVl?-t(+a z*-Utwc{`Z0Sf8?ic&C^^S@8r93xiQ+9;n3J$9#$jgpV*~O~DfAIn1 z;m%Lp@|?Fzl&$=kO1}n%ciwA0#`1Ytd}Qg1Zg(ce)6Iujg9AFRfzx3)sF?_5m$CCP zK#bQ-E-flb%>#u%6Pq00F~%Z3HmDTC6UJ7)MO@qrZtHP7x-123}4H&SQ+~Jj@Ir(I<@m`DgO8G87kR7Z)?A3WSJ(W06;Yi=i|x zCABCmC%@dD!B(L04+CQz&mIOw%mPDFfQunHBQ-g@xFj(-n_(@ZwLkz+qy!3U}o77Fa+KgL+Wbe}7LX|2F3{$q@y0>>Dy@pB`*2F_fp zypV)^Rba9}x5XSi2;(DJcRZNatnbB5nTp-)Fs}2g2L(Xv2r&B?V}=k1Lr#8T3aGkgSj%{vy;w+s;~1l` zAS**kDyTUK%9M{7YuH7Y)R;g)6d=gKP?VaInwFUdicwHm4a(6=gt$N&GV?M^GV?)k z29f|}{mHyc40@naU0L81lPj|b69XftC_l&C!IaHh#1gtP{Mh_cu=50n1i7tGp{l$zX(*4bPI11R%JfMxbLViUj!?IK;MN< zHh%U!42*jjAY(%BgqRufGC@HP>B8?5Vr4J_wF4Q}GFE`ws&Q;g3=W`P5vVZbVg`j` zs~{URTS8;oM5Km2m&r^7RLZFGGc!i3gNji|OoL)0MVOtzDlZ>eM{Z^Vr8rRWnJ>u7 zkXTfdSP3pvK?UP6Ms;B}hUB7DP$>qY4)M7huRVl*607bNrA!N(M zCc2gp)F%2W1S5H zL_s}+bIc-4jtr}rL45-*QC0@Mq>R)Gus#u{4-BtZKn^is6%!R<;%9ipA|?uIeYuFT zfNg*(WB344#=~I33RBd5WGg9Auvg4j1F|TIcBYKQ6N0f=d4wPwTGd>o3C3=i8K!};494rDV3LcBy6FtTlCC19& z=;Pxb0*-`h~lf_>vFGws(XHaFdmzXLpzyRhI>lUSg z3ZBe7kOTvRqy!s8!Vv5(P>b9MCS(K`5))@(NGwV>1Vz1ss07Hl5fWe_BZjq%0Z<`k z2~P0ft!`owxUnrNk;Q5&0jla2NR&wAGA)uwlsLxdD!~P@Q5V|b1}QtnxI_XJu!%+K zx@C!=niC`nDiw|~?uKhfN(5K+ASqDnLfY(g5?l<$sU;B4g3`xkiSw){CC;->VtfL2 z=~W3HsD-6@#i=Erz}+m7#X1QbxT2CU*JS4Af^^SjWR^U}XoM^b(*cPNPq< z$SEK_DaaBqJs?R?wA4!SK^;+)nhxrXfE1jR0Od|l0h7qmBRP%b7~?ESP+9?nLQ+v` zI!KKOlK{h7$zzNM;WFiL83wS-ZAo6J(Z#9ha5)9A+*i1pa#O+H6JcUz06A7r3g++J z)Lf7~pdf*iTp%SNCu>RZL(R=i%?0NVggRjckcvIx?BFDuUjUN1DA^-%QF0ASkHksw zH7v&%^Q9mOx-2mVBn>JK>lx0noMIATYWRPL1>{{{DOl7b!F*LM6~J^}>Y`*W(?zM* zlE)Y~NU?(kzlw_TLG9am@hny+PFto=QVMygiA4$wPMi~=LX6T@Ag&X*5h^Xh$pFct zy7>hRYZ(i~vsf*eCovX)v)UI4UPyBmnvYW$)-tXUb!8Tpj$mFR3QDjU(zZ-#(wTW> zi8+}m3W-JOrManjB?_PvTg-4@>KNl?c;JAV^*N~}si35wCjlAGSSCH25!4LPlQ_>B zz%)-9ocg5`B`l?Lnf6QDGVPTv$rv09Rt1RX^J6)%MGOK~nx8zDs(oan&i z9;k!SEdq;zS_n)GtC`O+L*xx)IiR|VEEv`@-ea202$2L;HQ5r} z42cB=IhAmCf~*8JrvhY|7#u)N7!f9624+c6ur`Y`G1!3mp;u)x-!QYw}X^BfLh){ zpyCBo41y}+XCPrvDhz`QgB%1ZtaD|#7!vdH^T3r7s2Phb68_3EG1!2N^mUL!70e6=rI{IE2Cy(}5M^e7$+0r*mt$sd3V;~S z#_$Hji-7Rh8GgwzGa$Q7P9Ea6VsN&SkYi$Sj9~c1C@0Ura6yiV!5P9~WVk2C#NYzq zFfnk*Gch7XlAH|p%{QN-?xn03naYCjXD}%3pSg;erFUIW(PKrzH6d?lPV1Z!8 zrB4-D8Jv9spej-nmnA4d1RyF(6_+b0GBX6ZhJZD+DIT6J$ifie;|SqTRlGh?k(t56 z2f|&d_@z*hnZel!qIrwrj13@exC>bGVa1uV6<8SpLW4crzyg;P=bTeyVF>UKfbbtH z&fTxb!Vv5TmH(_bk5Q3@!3V}?R+|4_k(D7h#2@NhVWn04N)Q2vjVem3|0}XG`1rd( zRhTNRF;s#GKvcLXtyKVNadw2N2v=Gc3>AQ=$WU6}1P;^?h^s1D zsdTPYiG{%v7A7;5&Zj6bGdTM=gQZt0{aC8R%n%#`;qFlSxdki>%0k-}jw}5-43>p( zuPOb$1eS$_&{L&955ck!?iZ!MA3(Cc5TlrtzXr)MGgzS{xf*szFII%fKpB)YK?(03 zv?w-LfEA{YMuNX0H>ik9EK0XahO|4MfNOV9&#l=)#MrDPTt6lYd}hBsoAJD5N%$^fQA$`woy^*_M+K&D?( z2ATas8Dwe)6Uf{ErWeYfVVhj0AIh_&0+_x)Re*FJW1ObU3$r6PKSjF;)JsFypr!)S z336vHlYgwCLGC!l_)D3cAvZszC>Pqp zVrO^-ZqG4;`^anzimae75PAAgD%MXy5PwGhP8|_aL?{n5nZZ5bh!>h^$8g8}+n=Y*inQ-(|jgSmr@>2!b#i<&=D{?Z}ftsq?`2|{_ffUIArbe*VKP*4QB2_^SNmS)# zu!A(kp{m%W0+=>~RUul~ima=dVLDn>Ss3hcQ$ca|LySiyN9Bx4kA#-$F~;qx>|hB< zUDhK3a$}FgDW(Ie#~3fDaxmDXR+QwX=7L;eDOD{M2p-ztRy&{?smdU7jPZ>sCs;`m zk{VF*)P<|yS7QgOfLQQDEJP&-YPF#nRBusgI>`Ksk^xMqYPM<+lfBg-mO~|9O9n7C z!6o^WnHaP{twCF+xoT?}Etw}VMyeiTv}B&mc#JVqjTdYqC=hF)?wZXc!c?Z#s}{g? zT#Z2_QdNZMrz(hdSq-FbF;oYrM}({+60GAVREI2>$Eps}aaE0t!7jb1z!>CkP`~3F zg9y`eumTPB3MP;R-x)-hwt_`0z*+)SK{Z2&F2gTI17$mPMuxSFpkxuRF2Zz(;fEL~ z;6Vw(N*z?8gt$S}rNY&pu){S`2kd&14BMo#XpAUY9N*W z8Mdk&V?3zB%;4e*QOTtN@`?zP2SdIpD7S-Df@p}!JL(`aLDi9gvI$rv$kRC*An$_0 zjTt;pouUCMpUyCV@tYrjgI>od`6x2dK#+V}m z>pg-xY9J+`6k#a^DrO)>D5wL-t`5p88Tmyex>>p495r7ffa$dcsEDf8=wO;9l_&+8 z40)+>is^@#2ve-=7a2&d0p+xf8oUg4Ameq5Qge{>%W8rOpK7QcJJ~NXT;hCY2L>*WQL}oTrrWhM|4^A~uuO^;6N4A1A#0%A1eK@(OVok1xI+w^4V9?{ z%S;E!_&{W~LS^c}G8;jLxr04(9x71}mT*#HWAO3!hcxO8lwUw4AAlvFXn~q9{sEAH zW7UR)!b7keqc*5*2yX5fC@Vsx9)YD!Yq2nRIY&Tr*+8WpgQYCAnHju%L2X0><#4df zSMdO*Qf(0?Rt88G7GZkHz^Ez0^qS$Ih6vLu27OJ?SR6?4a5lI+$ZA)gy6Gsz(BpVH7nv8SIjBi*(C#!NY`C zv;&xUbU;Oa027N2sC#-x71VMN&;ix>#~2gUK{M&FVWHQOJrW=cGD%2>lL1tuf-op+ zLWXZ3wmi~iXRs>*k0vp!WrWl_r$P*kK_UIcc5oK65!6WHclrU^P$ zI-vCd6QH(-=zxm+6tIrOBHi-DB1nl`q!YljNe5ICf6xwK+NA?3w5RC^!hNQjRFtb* z4q7JwT8{%#^8l>6g9)Vb4VVooB33i^NPN)lkqBV=2R3657BfJ8o6UHN=@QgU47$7w zc4p~C`K1NAxrrqi5EqH*1~9qkf?NcOJdn8&l06b2zeMSRikcot5IYUb1{D*a(oq0h zIyUKoS|y+3voL@~XX%3C;)fVa9ApNQI2VI@YDGy=YC5E{2aR>@)df{exlBjF z8bFoOF-8?#Nd099a$AW6s7#j81KB!DDp3Ly*Pu$AK~IDURFZS5f(HDX7;>3d^hB5% z7}o0cs);aFONlUnWCEBZ^dePrnH2OAB|vUC4mH{cWV8s=1%@7p2uYC9pr+_F7LX@1 z^?JY}B20n|iQpDRvK}O`bD1*rdL%$C3s5o&V5-#vc@k82=Q6F=1GNyk^+cE=)j&MZ zIMQ0Zlj0x~=YrMQGOg5G%Lr z2g4;DP#7jk1TYoogIX$f`XCRBFzsLfHQGwRttwFE4)Q<(R1P%HBf_)+Nd>6J1J$v| z7-Ye9?Qw>ms-T8l3sgrRLy5#zwM2;$36SUvsAvyEq68>MAChNgaC8CnR1B2oL0!hc zV5U2X@sjQ_###CxSxAk&2P!MTV5SQSc98rIkh~v6_Z_Ib0$84f0VID^kC`FDKM3sa zKTvrCusj=BzFUKd0V*wH00|Zj1~c8+V9O_KGcyD`L24&UsH_B7Gc#DTsR1)Xa41AR z5-P6&mS+XahZ-=0I>lhiE1~ihV0m`1yp9etLy$kD0GtVypTwxEcZ_kW0Z1I;=#60U z*45>V*?(+6q~rwo}GJpI5Su-yn0JtYz%OiviR zjgB!&7%(&VheD#^5?D@z=^0ptfkBR4gvm_|G;ujkmxBS^rG!jPu4i`zuLS5|S|bWt z1E6f&!E{+PoB1jSXfY?ZaRpNZGiVvY7b8xHHqfF=;WN3H+> literal 12801 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 diff --git a/common.jrt b/common.jrt index d10612c..a904804 100755 --- a/common.jrt +++ b/common.jrt @@ -1,9 +1,17 @@ import text.jrt import keys.jrt import random.jrt +import file.jrt +import timer.jrt +import beep.jrt : !+ ( v p -- ) dup @ r dup >rot ! + r@ if dup 0x100 - r@ seekto cell swap r@ fwrite ( we're in a target .com and there is no "self" - abort with 0 ) + MOV ES AX + XOR DI DI + XOR AX AX +0 :> ( search for two zeroes in a row ) + SCASB + JNZ 0 <@ + SCASB + JNZ 0 <@ + SCASW ( consume the 0x0001. DI is now a pointer to the filename ) + MOV DX DI + PUSH DS + MOV AX ES + MOV DS AX + MOV AH 0x3d # + MOV AL 2 # ( read/write access, allow child inheritance ) + INT 0x21 # + POP DS +1 <: + PUSH AX + NEXT + +:ASM close + MOV AH 0x3e # + POP BX + INT 0x21 # + NEXT + +:ASM seekto ( loc fp -- ) + XOR AX AX + XOR CX CX + MOV AH 0x42 # + POP BX + POP DX + INT 0x21 # + NEXT + +0 VAR, fcount +:ASM fread + MOV AH 0x3f # + POP BX ( fp ) + POP DX ( buffer ) + POP CX ( length ) + INT 0x21 # + MOV t& fcount @+ AX ( save number of bytes read ) + NEXT + +:ASM fwrite + MOV AH 0x40 # + POP BX ( fp ) + POP DX ( buffer ) + POP CX ( length ) + INT 0x21 # + MOV t& fcount @+ AX ( save number of bytes written ) + NEXT + +-1 CONST EOF +0 VAR, fbuffer +:t fgetc ( fp -- c ) + 1 fbuffer 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 >t >t >t >t >t DOES} theme ! ; +{ :timm deftheme CREATE >t >t >t >t >t >t DOES} theme !save ; ( cursor grid block mine flag bg ) blue white black magenta red lgray deftheme win31 white yellow black lmagenta yellow red deftheme hotdog @@ -144,6 +146,7 @@ var theme win31 ( minesweeper board drawing ) +dbg" board drawing" : draw-neighbour-count ( b -- ) NEIGHBOUR-MASK & dup col-count dup if [ key 0 lit ] + else drop [ key lit ] then draw-char ; @@ -176,7 +179,7 @@ win31 drop draw-board-bottom ; ( general-purpose drawing ) - +dbg" general-purpose drawing" : clear [ key lit ] fill-page ; : emptych? ( ch -- f ) dup 32 = swap 0 = or ; @@ -190,6 +193,7 @@ win31 begin dup b@ dup while draw-char dup spacer 1+ repeat drop drop ; ( menu subsystem ) +dbg" menu" 2 cells const menu-optsize var current-menu : menu-options current-menu @ cell + 1+ ; @@ -235,6 +239,7 @@ var current-menu { :timm defitem ( cp name iopt -- ) menu-option dup >rot !t cell + !t ; } ( minesweeper game UI ) +dbg" game ui" 0 bvar, cursx 0 bvar, cursy : draw-cursor ( -- ) @@ -270,7 +275,8 @@ var current-menu 5 popupbox ( x ) 10 textxy! draw-spaced-text wait-key drop ; -: fanfare meep moop meep moop meep moop meep ; +: beat 10 sleep-csec ; +: fanfare meep beat moop beat meep beat moop beat meep beat meep beat meeeep ; : display-result game-state b@ dup WON = if fanfare green bg! lcyan fg! s" YOU WON" 26 result-message then @@ -280,7 +286,7 @@ var current-menu ' leave s" Return to game" 0 defitem :noname QUIT game-state b! ; s" Quit to title" 1 defitem -: confirm-quit cancelled? if quitmenu then ; +: confirm-quit cancelled? if quitmenu col-bg clear then ; : draw-game draw-board draw-cursor ; : play enter col-bg clear @@ -290,6 +296,7 @@ var current-menu : start init-board boardw @ 2/ cursx b! boardh @ 2/ cursy b! play ; ( title menu ) +dbg" title" array title-text t", SWINE MEEPER" 5 :noname col-bg clear ; defmenu theme-menu @@ -301,7 +308,7 @@ array title-text t", SWINE MEEPER" 20 12 30 minecount ! boardh ! boardw ! : config-game ( boardw boardh minecount -- ) - minecount ! boardh ! boardw ! leave ; + minecount !save boardh !save boardw !save leave ; 3 :noname red bg! clear ; defmenu difficulty-menu :noname 10 10 10 config-game ; s" Easy ( 10x10, 10 swine )" 0 defitem @@ -323,5 +330,6 @@ array title-text t", SWINE MEEPER" textmode uninstall-timer ; ' title ' main redefine +dbg" saving" { s" swine.com" writecom } diff --git a/swine.txt b/swine.txt new file mode 100755 index 0000000..9a9b58a --- /dev/null +++ b/swine.txt @@ -0,0 +1,20 @@ + S * W * I * N * E M * E * E * P * E * R + +Waddles, your trusty pig, is ready to go on the hunt for truffles! Leash him +up and make your way through the grove. But be warned! Digging too close can +cause damage to the truffles' mycelia, which can take years to recover from! + +HOW TO PLAY: +Select a square with the arrow keys, and press the space bar or enter to dig. +Waddles will tell you how many truffles are nearby by marking the square with +a number. This is the number of neighbouring squares (including diagonals) +that have truffles. + +If you select a square with no truffles nearby, the neighbouring squares will +automatically be cleared out. If you select a square with a truffle, it's +game over! + +You can use the "F" key to flag and unflag a square as containing a truffle +without digging there. If you select a square that has already been dug up, +and the number on the square matches the number of flags next to it, the +unflagged squares will be dug up automatically. diff --git a/tinyjort.com b/tinyjort.com index 5145478ca60ca8c76e41a7db2f96005c3ada803d..7afbfb739756ac4478debeebd0ba15670bf5fe81 100755 GIT binary patch delta 2537 zcmbQF`b<^j!wtT^TLh8cXgj)rD`2&Pz3kC?M2&?k<3au1=C-jYf+eVcZR>o(W zSF-9d*6(BIV8|~>%_~mLNn?1*-p!`Nz4a{k6XHmt4<*z8hO? zH!z)5ln+?jdHBD&9Xl&Sa!!76DuWcq7Q5)PieOPb4mO73)YR;fdU*d zLFMMKu`#42=a=S{FsL#zFgS3qGNcvNrzWN_M00GhkB*8wtJulr%KjKu`y)krDf)%f`cfAlaryiBqcKss?CrKtMhwY*m1UtTwDx>2Mli;p6p<|Jb3}9 zg!n}+#v6_=AO7$BXLvFYoERQ|X|TII`8=n1{beqO(yJYEm$_c9|KIStqEx8)Cu1ou z=YdjAkVygzFK7I3c}VF0RpaY zv4h-XS6ouWFq^yQM&E(`ZQK!@2Wr`lvFd)m;U2b+gJE|K_f8fD!%LG>xn#B4xWmD& z>g8r+&|_H3IFs9nQ=jt~V=@yrLwQDKNosLHVsffI0|U?GHC*c4ESxM1sri}q3`RVY z?{Uf4z2jzOD9=`2?V(?4!d+Kk}=vFKv z`&o}MMonhq5#}}FJ;mh1yPA0)^D)L(lNEX781GGX;E}11;MvS}is>BlL*}P!^1SC+ zpR$?oHuH8cWwAbG1MyBVfl}cK9u@|p%sf!W+{b*1351U^hVZg66qgi1>;fe-Q0@p| z;^Mo{o6Gcv7nChZc)1x;GLuVmbMo`EOA8nj_&{+K9dCHj)9}Ejb>DAJzReR=FUNO` zv51e20jlT;V=LbxE^Y?5cu!wnR~Jvm5LX5pMg~T2E>4Eb+}zZZ%)}Cqw?PgDIdl!* z9~Ou+=kT#Hs1=uhq(Oz$YhG3c2yZRpUA`>VV~o)(j0~~h(&a86$X`df7#X8MrN|^k zh`?)RMg}W}wTugRS2NbI|KvNy$jr~kXbp~&V~jQIoczZaAM&w+^LhzbofTsZdky^IX^Q)aseokLA+i*W`>+hkUkM65hjSfWd3?k(UDt_ znUe}iS`1GZv-w;3xfqi3!D4x(xeQMjEBQC@@iJuQm82FG6s4Ac6|QAm!}p5iHD4eL zD9K&ow`4xXIFZ&!GuR4De#s|Y zFDbyqkerd4oLyX!n4Aqtp#lL+O#-$|bpmk3iVRL*3v>jy7*Z?X9$m{ggAY_rEfm99ZrlhiTBjRH)J znQ7n{3Sg>X-^>OH`IgCZ`IYSX_*fWAGQhb3l+HnMevOxvF)1}Y6O=L2sOdU|M-n{KM1fgmgbdYLh1yN0#ID;W@BX3U|7p|mP>?5lOd5MfN8Pd zF~*yd;{>GZ3;Ed@YBKY3GV?&`R7UU^qcA@cqg4&VTE@MCpoDdd@vI;dV+|r*-4r~= z7$LySP^<(>E1+UUgh`2EAIm+aNsRkgrm+MtX$nnd&t>8jf)y;xLQIUsN(_*Q^$^-C z$SnjiM1+Z3sQwGjF-9{%Mn-jpwT!I1Gx#c)K(U`DRLOsg@q-{Jqa~)K6)>!21Qq+P z%wb&TSq}<;*b!j%F~$rb4u+ik#1v2s!LXL`ID4^>1jjK(VL?`glvGf44ay;p7;D%? znADg+p%Ea+!BCW%l9~qcay_J+0tNOGAuf=P%)HE!%zRLYg9xwVwGH<7}o=OiNjxaOW~H3Lj%M6av-n;H;sW zky-=_U=gNlei5dr{HKLPm@4^2nCe&XpB6gCxKR+4f-*~rlZ!G7N{Yet=Y2s|1}l(j z7}hc-2xqZwW=jx0&kD)uSB2OZQu2``L5Xvza0e5}&92N@thr1Rg+Zm-XFe8&+{Da0 zh9`^%1sa4o7)mnpDzoy7KpDGRc$2WKD)TYMeMg1)B3Ky&`Yv>`@w4w?VBE{V0M17M D?5O>X delta 2521 zcmaE+I!RUKWtmVMo3vn-&}E?{VMD>6e18Pp1^);M2w&v06bcodCA5e?X`@ODE90ci zD_M0J>+RTC8Ip7Ii&GgMv2U@9KC8I4^YDN5Ic#hUY03Gec_j?0j0_BK*jX9Uic%9( z7}zlB*`^gSg`kS4NA+5Y9vm}*4g=32Ys$@GWGlQ$Y8$&4Le{l|WhP0&8 zw6xSBu$lH8tPE-C^{FMv3~L!@GkSA;VPfU*=ICer&Yr~@$P&O*%2B~&!*Pt!AEdCL z6s+zPlQ+i$R)}gPj$@41*m)R|^Ye=Hb5eCvb2CdAmT_!hih_E=goA|vEck?R3CCm( zCWho9hP8|$Ok4~*IYgLv8Fq3UV|49dXJSao0gEeuMb5IZFqBjlq%y2!>|m;9?O+OE zV&dG%v5z^I=>tavQw7s8#=RWea9gueD;cCF=W@s~s!i_U=&m>CWM#MjUh8HEi)$-95Ni7oD9V!DVcdt zZFf0Aj!@t_##q5*!s*C4iIJ596i6UZ4=zW})y$I^Pcc1Ub>uwDS%04OE+mnb|oZuo6k@7VC#poZ(aUM&~n4ab)c|995^ zGdvjxP8W~AG}zU1F_bWUztQhTR&IH*+a#8F7b$ooLC;$e_ot zmeG~_9mj2sV~oj6+zjOznI);k1&PV2_6%#dCvmH%ZU7~t{7id>dm!UVSZ)9RFXjAi zX3PRM3H}<|XEWlCTI96N3j>;xZ3ASRyAi zk6|t2X`X)8V~lKEpoE-~T9BWaSCR_K9UV*$>UmBv{oq;6ypQ=9<1`*FhLp_YlBCk) z?9>v5wT%6&R&1|WJlLDqK$dlJb1>wkmg|E2&9IhnGuuzLNsJv#HS9I)o7q@+HnW{# zI>-Ew`6=6Jp7X3v*&gud^L8+0u|8!3@lG*;(tZgK3xiQ+9;gu5$9#%uAM+^-rell@ zylf1`B}EXof>JjqD+Vxa@t%7hBM++e5a=H%yRmliOb;hn6&n^}K~_ZXub z9~%Qy^a-OOpC1=DgIm0(udl0%r(=jKgAF4C<9AL@hRodD)RfG`5>PmSoCtDS1m7PP zh{HVi*cjA`OF+_~B5*n{D+7eLma&sBi}e^|Gz%j`EV%6I&t0ee5g@_Nhf6r@rG5VX`-8*vWB(;~3** zZe|9M@Ds+>{I2}048;Z7#l;L4`9s9Oxn?In7ei@YN@`JBPJX#P!%P0jw*1odM?o&l zNKMWzE=f$zW?0MkoIij`Pr#N*O8~A|k>MTKf*br?45<}xkFI5O;RBV2z5-eNpt7x- zD}X6dU>g51#)JIF7@PRH5xxMY^Nl=^6xAqTFCZ+C%akur!6bEzF;;+yF*6MuLjg>n zL<|XegUKKHmF#!%vM`opfU^%MWrO0piIEr6%Dcx zmjosU2^iPU5nyF3%`3@-)Homopt#)4#>l9_u$HlsON2?2A(173$zSjoW2*o=LuOu1 zW?pIy*hRKTE|TSEXQ+WlGOT4hA#jXwKOYmL6-Z&GASk&VW2_WpVyr==wpPJoj4bs6 z%nZd!pdmNC0J=M~pS> zB1~#bpg{T~F!_L>XnlYX7f3;7US>&VJ}BHlvZc5Y&hOXAs?t)FM!EAi^Zh zFT&)=UoIrVq{=VC6vAIFbc``pkegw0h>$>bw;(Hn703k)YZ-ZjvsgE?@d%%1h2-%@ zAvT7Td?ZOwvJ4dNU;??*l{t$wm&sNbRDjLrV`0cm%*t repeat drop 0 >t ; dbg" i/o" -:ASM overwrite - MOV AH 0x3c # - XOR CX CX ( non-system, non-hidden ) - POP DX ( filename ptr ) - INT 0x21 # - PUSH AX - NEXT - -:ASM open - MOV AH 0x3d # - MOV AL 2 # ( read/write access, allow child inheritance ) - POP DX ( filename ptr ) - INT 0x21 # - PUSH AX - NEXT - -:ASM close - MOV AH 0x3e # - POP BX - INT 0x21 # - NEXT - -0 VAR, fcount -:ASM fread - MOV AH 0x3f # - POP BX ( fp ) - POP DX ( buffer ) - POP CX ( length ) - INT 0x21 # - MOV t& fcount @+ AX ( save number of bytes read ) - NEXT - -:ASM fwrite - MOV AH 0x40 # - POP BX ( fp ) - POP DX ( buffer ) - POP CX ( length ) - INT 0x21 # - MOV t& fcount @+ AX ( save number of bytes written ) - NEXT - --1 CONST EOF -0 VAR, fbuffer -:t fgetc ( fp -- c ) - 1 fbuffer ngj(q1@5i9Z*jdKl>gw#=c@Jzf0|OgFQEEwP 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 BYd-)0 literal 17237 zcmaD^CiKMqoXH&+-Sboq{=AD(b+k8ZRg?t>I@7V z3@R@E&i;PEAq=XF&d&eM!Q#4%oFH*0ghUtni~z8dD?~t&b#->`yazU#fq{*oD7B=t zD39R;qpxpw83R~&9wRr%P#0G>*PtL*7qC0K<^QW+f;iGS$kj2#6=7JnIl^}=3_hMA z@eE>2Ya#AqU|?a$%g--h&|m@^&A`CT;OXb%>F4U=7~&YuV9&HRtn(OHYBwV@gHu#I zLl9HsW45(mp|wyc1_o9JcmELoc!p@ESBxwSDMk4O3{^}KU`6>%%nT`|1q@wG5djcO zJ(yS+j6gzjnIfWt1A-xzQ4?j4EhXf8QEAW zn2s^(GBYx$f_bNyK>Yvz85sVX8MAs)FzlF_8S?T=7=l?MI1iNEfBE$P31&tH zTZUwoh-k|jCFfpV`5(y4$Y8@z0une}v-joU|DG(240a5yV1fEIFE{lp0K5X#6e#mdRx z;~3%^9OCch#t_P=AkNIe;Ns~V66_h}$`Hz^G>4Ukp`a);H?gQvHzhNAe_J*-2Dp)vz&dWRu|tJG zdM2@f^t=U&6_*sJrZcEAp3ptW#KBOUnx2@Glb_76mXVh|i&cb)L0~m=2NN$lNP{3d z3qx{hP7XsTBa;z3E0|r(u$IxC^%&!8R#pa(PLMA;m;#uJ*dH=aV%*I3fORw5KIWrr zxlB>)pe)45&d8v{u$FN%+j-W_Y}V|nnUAs^W7KA2Vn~7r!!#UYT*|@;F3ZY`GD}h! zHnMNAF+3S{RuPgy7P7N2GBXJbf%SgFFX#Q{~aot2rv z)gKh$|HV1j8PbwU)6!Cl7*rX#80mpOdPanwwd|u#961$ZKFf zm~gN#fCZm0F5#HW!NibU#ITl8go%q`Cx-|VFT+lbV~joQObkgmU||KYz*#mHhLXyH zRED*T9Zc1%pqOFe+{v+zIhW}JM+LZ0+snZXw=_Gol0k}d3&&YSSWeVs;$-mja|(5X zChU4OPF9A@yrj}J231A{rvL?m3IhWLWnL}?1wYq_5MC}`u3Cl6+=Bd~5{2aa+}!*; zy{w`Vg=&xlD19mvE9odyWfl~dlqTsFr=}|@6f1%F`Dtl-$@#fT3gDnm%_{?GUEd5eL8gOih?xFjVr5321hCn$^*xQ;PaFqv>Va!z7oYdHr81ISRQF-%-p;K0u2isS$(5#c(?+@#bZhF-4D?{Q(r*=o7C7z_^>-Znhh!B)@Jad=JJ4UXF- z3XhE&ep}W%HoP{d;rgyu%f)!Z@#Vw+o&O9^LMrmdUmEP{xfn{AzTfEl7X_`|8-DAS zo&bxNUhR;p=X$yRf5Y#JQlaLbjHSGs2TD0X)(J4YobkWmwPVeuhQnM|a&b-&+m z58KDVuv>$BCkun&rSBG;2TIuafgFbwk0|ni+3;;{43=9mJDJeOrkO0C>UgTtF zC`wJqEYbzpy_wCGxr51-`6!zua|Ck)xFmea!OBpQTL6`B;5o)<#=`=(5uB@8c$|1Z zf-879!GdWyiRqvs7*voRW8BNb0T#_m%mw9m5hf-E4|Y&}a+wF>>YUU(hP8~RdHPw8 zF|u)i@_kBbL4IalNh+u;>0o-mbBgH)&uZp<%*Pm~@jxo8q|)TbmhiAJ7-i;xO3Z!Cr6XKAqu?Q;A&JiCqF;Cw1D9ZFDMa4#~YsXG(7NW-S?ZGn&&;cSXKBhK43iD`Keo; z^LB}{l|NJI*TC@3d(FpKJ}--pEPc`K&ct}S`7mp6K<71ZIt&Lj>7eW~c0LA(@w&;S zMMbH3pb%(cJH>m9QI3xdD#h@G(c0XPi<`kM-qY9D)x{Ikzp!CsVEoR>$&i_wo0^gd zYDBMP1cd^~_Yr)5SRj7);A3M@D=q;^gKDJdysQim-de^^K2RMW&BDkK%dnPlHe)9r zD6k5-7#X7()-q0l@?SGEGFUOJW%S`)%~->}l-d-%$`U~l?!()`Si?Svv4;H^<6}N%hU5ZJvIOxg`Is4UGC}%8 zm_)#ldW?~uACzEn3o>(3!IA!iv4-7{pNkx)A<6J7VwAgA7k9d&ca}yS_E?G zI}Q;hdxo7HM>vi#Ugl=F)`MDTM^HNfa(sJ_4 z?HOM3H~wK@tmE0kz=&C390fT)BQ-g@xFj(-n_(^EbN&D(Jpo%LEdjU@iVW|-*52Uf zVo0rk`+hB>3m>Rb@D<472bJ*MTmejx0@L`9F&^YU#@NKqjqn;cb8X~-B;-Z`djVmA zT&8>hP*RQ+U}DTn14mi_6Da3EBEvv{g)ud!7?O!|nILfl%2JR<(>dm2jJtSQ7)vt1 z`57W{jIoKAl`$zbJrk72H?tjMe8a=aSe^l@=|JrSWb-cxurU^;7NjOZVi;t@DX{gB z#OcS*%9xm*2sTKB2_y?j6LSPu8B6m@G9m2?kZ~Z<-E54E8VqY0E4f6NG#L_E0+{>- zk1@6iurp-l>El^D!}6ffQy6f)evF#!5jZ z#u`LgZWTPn$RfbZP^<(>pP=Gegh`2EAIm+aNsRkgrm+MtT@{?np3AgT5LRHX7i3~A zR$_pprZ0k-g4+c_hKMk27hJ$|jPa2GBcnRQTE>k$E_@YCpcE%0q{@GcagHD;YbU0p z6)>!21l8fL%uHP8S#t$I>~2SZMNVhX6bXIRU4oLye%0sAq={Q|5EDXF05 zAShElVys~oVNzoP1<@Y?4p6C|nwFUdicwHm4a(60LR=sXnR%HdnfahN14)3gzCAA! zgC3|oGT91)((`;i z7KU6xUCw;#>C(N>cM~tQ!ZvuC>jc~L9-<^wjT)B zu;(&85(bqr7x|bOqt!vhC?uvqu^}ML&R~_753M6Nvw>0^sQ8o?WMxP!DoU&b7pkCw z@fhP}AvT8OqEt{R4T{ts@Y3=p9}B1q1tmu*5s<02B0LOfnR%JT8F2Ma*#vk&;RAAI zk}xY{N`7jw9k{9#VPXMS%%BK~7Xc-dW6&}@SA>NzB`F=0a-Rs=GHnuB%Lr-{EffM3 ze3yieF-{U@XVA+?t;owv0=MZWG2UUh$0WkU$#52&5gv$$Fc~o9GQAQ3^$gB2i!eDd ztY!xF4YrA}GUz2`q*j3Si7t49(Ffs6hL^&8hntzELW1K3&#!!-2l%86`@Ptu9%vY2h%2i}|!l)&-MVN`f z0VHK3wn&(nAqmX(6B7_&Vo(GLCy14cGBYHB*+pW_q8to~#kq(iyqQgeDMA#Kgpaa` zFlB&Qpw4MAm{rXx!c-4too5wc>H@PKu!=BE69px86%jU24F&4t+AyBbeJ;ul;wGk~ zfI1BJ9i-4SD%Txsx;bH^nf;jDoFb9J+B-B7@IzqIAiHmtP zbB5?KMhQ_S20Kuuna$WQHcj*x;~zn0hH|h7s3_k>W2$R@_h;OOJy9|Df50H%9l zpg#8!v0SEeVxY{JBg)QDkXVwOQ2;V2LUa=2HnC%jkHny&iV)FLOdzus@pCfd7wD$u zCFiF=dPbH)pizY4lKcV&RYqoQ1#wP>oW$aioW!Km9MI6J3!gYQNK0;NZh2-(Nd~xQ z-6zVz;1n6+3U0Urii1KeRGfn$sj?)sprpv2VJ%~zcoyqy#zdB5jD8}_3~r7=;6jRp z0iw83oSh*pu?R^mD2akpe-q_pfVRYR^9vG-Kw}pF#2v*27{I(@-J(=b!IPN>l3-vs zD$WLxFa)`t0W^Mj4<=*;b}Fcqen^akA+adkkYO$3OYwtX=dwtEg^U>1GX8-ItrzD6 z547qg7J(bv2gS2kUy6gOIv)uIiCiW>30{d~j333hAU5hkJKP{;#~1@7KmnUrl&)Kr z2&y?jqM%aY7-PBwOhZy4xT*(9fnpcZX4jJ7Vkk~6fp`{_KH??LvzAJnXPv}2K>`%8 zjS@Ui3rq8gQ%gXB8!wT?Itd)O2jPZi=H`NQ&t_aNag6aEvM@{sBs#vrrHWG1K{`NA z0qGHtgt@aQH65l0BngTZO-VkeBZ^YfLA?=>f>H@k?gSMui7Xb9(^!r%x=Di43Mdqk zpoWMr2{1%T9%Iaf%ap@q7{D^^lDtr(i&N9#atdI%g>X0Jrh>gE!o{hcKuSPPz9z{JH8(dk7o0y3>Vz3UDl){`!AUm103=f@X(3T7xrW6;qEvhh%P~f2 zDM*4YOUwaDgNnm?hO;cEm_(Qw{@-B%dH1IzENYTqzEYP8V5*j?mCR+Tm6|Sjj4?)v z9W;PdRFn^D-)f6zvA*N5Wtu0Yke8ZRq`>fw!xk#ER>}&*g)~Bs3v)6+@~Cb;sG^h+ z&tkP?p2R2vPP+>vco~vG%~@zZPGMNf7$NG)d{`=iIYJbaU`3>DnS`V>^U4x)GE)>1 zi_%MTQ}ap`KqEUe^A;6so5&U&rq6|T2YXiT#}li3ofuh%>Y}bbJ7TL1(0}ZF~pKC zkU826YZ*b#4Pg2$eMusK>AmzB$%)d(7@talL_qoH7-I#~X6a*$m!w%391sQ2dI^x# z#~8(=VJSK-u?S>5D3T$mhy|QF7-hI1#cD}n5_lAeQ+6pUrz{g2s6@eqU&$~sP8H_@ zwGmQu!HEuB?twb!ADKO5K%I0;n7QB{IcNk{DuC&b3@9@-%A8`l$8??*RB%Lyf*R?$ zOh;ruW&A`LPKaZ46AjH6)-pm$^J8$)BCsf^g}}tHn)w_vME;Hp2UJ&)1;bj#drY$# zA(Eh~MqGlMA+ew!rxNZ?kd>h3)E^lp1_w|RMubV2VZ8(>SoOu37;HfO&_)?ho9q<0 zMVQ5Uib+%U7^9mk6N3*(axlP463esWaCASF=nyels?9o z3{vg@YIzHRiWg8Z2ß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 z zvHf*mWypYfV+Y$i2UdnMDDNB_k0UEX1~f#Uut_X2E{;qL zdNmAn#(&uUnzJ)lCFd9Afj2%BSS=BQKoKSu_K8-<7&9E07)o*&>WszMs~njaN>C}~Kmh_;yjo`*$9~rl96m|;B_;W}40Xn3>>7>&&;Za)%CE?U z?B1#~Zeurd6o3X4io_E3HxM)6O7E~AcjSOXcTzqm?Y?6-aN=hGZ7bC+&d5wF0j-7v zrEoTm$95bH<%yXk;LU+`#zGtuZ8$(%0qu&D!NrIiM~xF3SRfgc?KC)4?b#SWa-{_f zb;d>?#LLLf1*Q62jxrFhARX-b0*)4EkOT8Tg=sOzB#2ZBsPHV~ zm=BW5%mW2yCC6G2CnXi+@*0j^Aghu<67?M7_M8j_MS1Cvom6$kO&q~aEDS}Uef4$5 zZ5&QctPCZY$=M*qOE{i7gX+lQ)YKGEj@iIbX2Zmw2ueM>I2c?&i_t;sQykJ@HYj1= d;!p>(;~46UUvXS=WMrsgs5Ab>fwY^I0RWjj*OmYP diff --git a/zipoff.jrt b/zipoff.jrt index d8bd29e..25b5e91 100755 --- a/zipoff.jrt +++ b/zipoff.jrt @@ -139,7 +139,8 @@ var comfilename : readcom ( filename ) open 0x100 target! begin dup fgetc dup EOF != while >t repeat drop close ; -:init comfilename @ readcom } ; +( we write a fake all-null PSP so openself can fail gracefully ) +:init 0 target! 0xff ALLOT comfilename @ readcom } ; : writeenv ( comfile wrapper -- ) swap comfilename ! diff --git a/zipstub.seg b/zipstub.seg index a99766938856cf72d606b509cea420cee66c28f6..192cd705efc6d79f4b0b53bf31cecc7a301e83b1 100755 GIT binary patch delta 925 zcmZn>m>|Ak7km94jx9EZC!@|P2CVHo{9pYv#}?ZSOmOZkj&3#`2F?Q|(tQUE{~I1y zSNeBd>96&jzvOxj^xXg{J*y}W(aFlW#V-1+BG?o`PQwF+C$~67M?nQN7#SGUIJekG zM@61h>||5o1S_-P+*0p=DrC#}AEY*kF_zJrlaEP-)0=ZSvjXQt=0{AM7_&K#GkS0q zFeWj6WAx^{!3}mUD(?QN@U}u2D z4|3LX`ZAqkhNw8lypz+H={zS)4ahSf%)r3G@GC&Cn@y6-L9dfdl1r7Dp@e;dLj5y^ zh~MWUe(U|$ljU;d+F@&*jJjQ3DDM5Qc}g6iEBG!4*yr*$^9fz