From 45f7c01b2d6b6a5c082ec59a160ba834f7b33a12 Mon Sep 17 00:00:00 2001 From: Jeremy Penner Date: Tue, 10 Oct 2023 22:11:56 -0400 Subject: [PATCH] rewrite generators in assembly --- dialer.com | Bin 7010 -> 7115 bytes dialer.jrt | 4 +- embed.jrt | 4 +- iter.jrt | 144 ++++++++++++++++++++++++++++++++++++++++++++-------- swine.com | Bin 7731 -> 7828 bytes zipoff.com | Bin 20174 -> 20177 bytes zipstub.seg | Bin 4214 -> 4311 bytes 7 files changed, 128 insertions(+), 24 deletions(-) diff --git a/dialer.com b/dialer.com index b31789e7c07d6f249bef396378925ff5b2395efb..9a60ab950090f25529a5b772dfd637d6473fd6d5 100755 GIT binary patch delta 2514 zcmZ8jeQZimK+q9H&?NK)c#3ouOhP{o`DiHXQ*sA3k4YAS&^ zuuK!Yb<@@A(xWTI?gD~f1I$vzOFz!o+L^3J(0 z?$8wFzI%S>+~4`UH@P0Z)HGV7IA^uvkghlm_r}A@ZU;c>rP8$!8Xqrxh1YKr;elWf zcI}Er2X?S<68GU`$=k_``Ko7aRd}GJr9~=|JJ|N^sZFkC^IZYr6wkpOJ_e&=0uDhO zejvu+GVVLUf^JVUN zS4_$=Sitkuf|&1$^GiOm(10gmCLSs%{UQtP2m*fF@Jj@?w)6k2`cd02axeyc?o-?^ z9@i84rkl8aD6KLIA>T)&U}eFN-A}qHoPJT0z}!3Geb+) zJf9EGaQY1oY!1Ss7ymla(NX`q6Y94&e=OLMz-&?b@b$%(e4O;UrpNH_dz% ziIX3~goLo$M_FYoa3dD_1@P2H!jrWUcK_%RYx-4wM zb>8(YL;~0WI!}ADHF22Yu$O1yS;-P`Qy@0SULN5lr*Vse8CB^s2FKK>x?k?Ak$waZ zSss`c!z%TANbOOv?mtrR3JXrEr*L9Vsx;kok|YZ`Y0sv`AJjqdma<%B7W@j?Y<-z$ z9QQM7{ne8fJ0@o*XIJIF##iN=uv|*M>Yu6CJgsKAc2|0DElb_`s+Lg_oU+VmGRvzT$eBR!W*oA2wf`k{R+|T3PNx7CK+&f(dw;W3(K}&ED_9=Z3s%p# zr^OpO-NgO+0`~1?)Yxy)CTAnwB}3MB3?|Vg4GfYz>g9dTCyL1VX=j8Va9Z%ERF76^ zUePmHlRO4N?#WdQiV<1i{XM7adO@z_q{>V3FgJ>>>It4v7QiT)l{-2KsP(fXCRu_> z5<-nm!&*j9MVI%M-s~lLrIZhQKepwAP{($lyOdOZmQjQ3eH}~kX0ILAlsYZ4-a!%d zT5#G+L~XNp&So8jpzYhL_~OdvAGlp9M9(f~Lb~V|Tp&lA4`TlZHDO-F3yo3vvCX zBn?TmAfGjn^t6v$_IaqfewN^duILuL;IkW_h9GnJ(oiGUU2?UNAX|g@F1gmowUV_U z^7tB*NDb>myn#KBt19;!<$fbGNwE%&$!Onjq@k4cDz7+V%5)KBcFp1R(>GXbf2sDL z_YaDdewsxK)=O;`zTl7S*|vvO`*Tq3H~jbXUwY4a)3Tfql&CRN+K_ZYSMhs(c@=Z; z(`IK5-gbtu(XaY%dvLJ6;h%s5&ca)g0~)QQ97lQ`C>A1ER*nRzZN638pK*`DqJLWa z8(nAcDUy$f1vmT_sO8hbRlWpUXhjTv0h%fcy%a9~YPd8$;(ODvt}^7pzpD6?bNmDu zZv_Sg)#JEQ?3hs~XS^l>ieN?grPRQupEjF}jIzc^@N){GB$<4Jae+4(GZINd8+#BS zjv=1prxcpUoa0g8QQ&?c!QaDsn=`Q1@E}0@3FEtBP}~m;;frt%ZA%&5>|YynYrn}_ zG3uWg&4vX(H_{Md!QvC9V!@CxfkjIi*BrwR3yv8S$Obe}&?OzeZFHc7!>&DzM`xto z?Pzr@cYF?;9b&zXYTQj426l~RW7tuN+FHc$pNxtx9qjG?%5#an?%wV%hmLmlCZ6j# zh)pH}JXV7?9Thd9ulF1Y9q2mR9XgUgv-+nRHiSd#Lr>MAWq~vc-$~^I%XSb#7>xsk wK;hmoVwjV!Z delta 2398 zcmYjSeP~lx6o2Qwq+hvtd3gz&%j;^GA1i)zHJDgCC;gb>unaRalF$tq zK5^2uPW*~phGQB;i0Fh8rMTiBuI^dCX67~qcB>YZ{xL^E9obMvcg}r{3gNzce&=^S z?m6e)Tw8QE)IVP?-l=Yfiqh?H@JvWvWd|wIQ#1!0XU-JuV~I~3A)}iE?_*hb$TF~v z4?`zJU^CCaVcfTY2}gL8hXq>8b|aqQ(`+$j!dae@gRB$EL6RbnhA|#N{y9D>11I}m z`Gg}Zc;Ge|aXe)+GO*J*j2W5GEy$GRT&xJWN};PZ z=t$h+x^W5jNnp~5qr;g5S<0WtVm=Z<4Rm`_&cL6-lL-^TbN;OVI#2grtgr9Aji1Rk zBR~nhqU1z06ABco_CeOjY)UPoSTUxvVW2+b4ABBIS)nxW9Q0ues-{fN^W9U818h|o z6m|}qlYuxg2jnQPWNWce!_a`WGgy#qU;}bUp@VL~U;}avg3N~@YuQ|GwTX6V$S8E= z6tp1M$oKEkOJKKfLY2BL&-OYP9@6De4n9ZJCB>Is^JXV^Fv#tZeF?HdrYn!W)jmnLT zCVo`*lr*v-3}kW2;flQ+mPlYLlAbhId{MyFnu=arXBA5E!hZj_zx8Rh^=ZXqg{oGm z{h{&t*72I2vGJOz?w6=3IVQ@yRi$KMK!L0Q1TV$jty5_nDBlRIP*Z$|s+XA1rINhA zBngw#L#m>Vi)2$+o5@L%Z=if!?H{0Ebr`Jf{zfj3ZxkWVtLN@49Mq(B|2%FMz>n(v zjWeH3X(KoTz>H%m&0SQ@K_iPX8Z+x<_(NSQCh?j`AP2|PsA}yW6dhCBAgbn>s(TnL zO{p`*m$>PoF?SB{*F4l%GyYC-5dG?+wi)O|P7);OWsMq(7f-WM@UM$&Sx2!6@x)K+ zEThX!^L)fja~u&#g`ohE3-0T9QDkXItQ6#uo8(hWw{3IBSPExbx9t==vP_}YE0yC~ zh=(ME8l8kW(o=l?ByEp-#7*)HA*Ofk2gBmf8VNSz-Bi&BEE@ESxS5;S9Xxy{h2M`Mkr>QJlZ6#63aW#CM+A%SxRY_}rV~ zpLw&8!iPw_B_?!wO*oA3mwDJk7Cke!fQG9XJ?8I!IYiFP^d7fY8Ggs}-x|Mz{zk)) zwJ%0DyL>I2>abldu#d`gRuew-Q8m8xMiPI&_MUOWmy$2|V))t5*6 z&@3JBk&mOSm-WdsqFMVP-yz>#wCcgDyjjN@!vP=d*X!$f3*YNIijTwqa*HIo?5#Ro z*CRfnj{TI~1g}nsT*Htuh9vWD{Situ|6^zx zPfYk;eY-;+#NN;?Ic1+^Z?ad|tLN)ZOVwr7U{%FedK81E*nmX)qXE5Lgh9{_~_ETw4Er WQ`55g)&Ah3P-P{C81!^wVgCp1D3G=Q diff --git a/dialer.jrt b/dialer.jrt index 57a7fb9..74dbad9 100755 --- a/dialer.jrt +++ b/dialer.jrt @@ -63,7 +63,9 @@ array dtmf-row 697 freq>div , 770 freq>div , 852 freq>div , 941 freq>div , : connect ( st -- ) call noisy 200 sleep-csec handshake ; import embed.jrt -array rick-welcome-rle { s" rickclub.bin" embed-rle } +array rick-welcome-rle +{ : lines-of pagew 2* * take ; + s" rickclub.bin" open filebytes 18 lines-of encode-rle } : xmit-screen ( rle -- ) 0 0 textxy! rle-decode each i 8 >> textpen ! i emit diff --git a/embed.jrt b/embed.jrt index 05ccd21..b6050ae 100755 --- a/embed.jrt +++ b/embed.jrt @@ -32,8 +32,8 @@ var rle-run : >rle-done 0 rle-run ! target rle-start @ !t ; -: encode-rle ( -- , with iterator that returns bytes ) - >rle-start each i iteration if i 8 << | >rle else drop then next >rle-done ; +: encode-rle ( call with iterator that returns bytes ) + >rle-start each i iterate if i 8 << | >rle else drop then next >rle-done ; : embed-rle ( host-filename -- ) open filebytes encode-rle ; : embed ( host-filename -- ) target 0 w>t open filebytes each i >t next target swap !t ; diff --git a/iter.jrt b/iter.jrt index 6545f1d..20c236c 100755 --- a/iter.jrt +++ b/iter.jrt @@ -57,6 +57,24 @@ nexttop :drop nextdrop itop :push >i nexttop :push >next +:asm r>next + MOV BX @[ SS: nexttop @] + DEC BX DEC BX + DEC BP DEC BP + MOV AX @[ BP] + MOV @[ SS: nexttop @] BX + MOV @[ SS: BX] AX + NEXT + +:asm next>r + MOV BX @[ SS: nexttop @] + MOV AX @[ SS: BX] + INC BX INC BX + MOV @[ SS: nexttop @] BX + MOV @[ BP] AX + INC BP INC BP + NEXT + : next always more convenient to check the flag first when consuming the result. ) : get-next ( -- c f ) 0 nextpeek execute swap ; : n-nextdrop ( c -- ) dup if begin nextdrop 1- dup not until then drop ; -: iteration get-next if drop 1 else n-nextdrop 0 then ; -: EACH_ r ; +: iterate get-next if drop 1 else n-nextdrop 0 then ; +: EACH_ 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_ r ; : each ' EACH_ , here >i 0 , ; immediate : continue ' GOTO_ , i cell - , ; immediate : next ['] continue here next 0 cancelled ! 0 swap |; >next ; { : break ' >cancel , ['] continue ; immediate :timm break t, >cancel CONTINUE ; } +: cancel >cancel iterate drop ; : nothing :| 0 1 |; >next ; : single >i :| nextdrop :| idrop 0 1 |; >next 1 1 |; >next ; @@ -123,29 +142,109 @@ nexttop :push >next >next >next 1 nextpeek - >i :| 2 nextpeek +for? 3 |; >next ; : pchars ( st -- ) 1- >i :| i 1 else drop 0 then 1 |; >next ; -:asm tail ( TODO: support CREATE words ) - LODSW - MOV BX AX - INC BX INC BX - MOV SI BX - NEXT - -: gen-save-args ( extra-args... extra-arg-count -- ) +( +: gen-save-args [ extra-args... extra-arg-count -- ] begin dup while swap >next 1- repeat drop ; -: gen-save ( 0 0 extra-args... extra-arg-count -- 1 cnext ) +: gen-save [ 0 0 extra-args... extra-arg-count -- 1 cnext ] >r r@ gen-save-args rot drop drop 1 swap ; -: gen-restore ( arg-count -- args... ) +: gen-restore [ arg-count -- args... ] begin dup while cancel iteration drop ; -: _resume ( cpcancel -- c f args... ) +:asm _resume ( cpcancel -- 0 0 args... ) + POP DX + MOV AX SS + MOV ES AX + PUSH FALSE + PUSH FALSE + MOV DI @[ SS: nexttop @] + + ( make SP affect the nextstack and DI affect the data stack. ) + STD ( data stack grows down ) + XCHG DI SP + ( PUSH decrements and then stores; STOSW stores then decrements. ) + SCASW ( pre-decrement ) + + POP BX ( points to xt of the girl calling this, discard ) + POP BX ( points to the following the yield ) + XOR CX CX + MOV CL @[ BX] + CMP @[ cancelled @] 0 # + JNZ 0 @> + ( not cancelled; move CX values from next-stack to data-stack ) + JCXZ 2 @> +1 :> + POP AX + STOSW + LOOP 1 <@ +2 <: + ( fix return stack to return to the yielded code ) + INC BX + MOV @[ BP] BX + INC BP INC BP + ( fix SP - DI is one word past the end of the stack ) + CLD SCASW XCHG SP DI + ( fix nexttop ) + MOV @[ SS: nexttop @] DI + NEXT +0 <: + ( cancelled! ) + ( fix SP ) + CLD SCASW XCHG SP DI + ( throw away next values ) + SHL CX 1 # + ADD DI AX + ( update nexttop ) + MOV @[ SS: nexttop @] DI + ( abort the current word ) + DEC BP DEC BP + MOV SI @[ BP] + ( run the "cancel" xt in DX ) + MOV BX DX + JMP @[ BX] + +( : _resume [ cpcancel -- c f args... ] nextdrop 0 0 r rswap ub@ gen-restore ; -: _suspend ( cpresume -- ) - rswap r@ ub@ swap >r gen-save next >next ; + drop r rswap ub@ gen-restore ; ) -: GENSTART_ next :| ' noop _resume |; >next ; +:asm _suspend ( 0 0 cpresume -- 1 n ) + POP DX + MOV AX SS + MOV ES AX + MOV DI @[ SS: nexttop @] + DEC BP DEC BP ( top of return stack points to arg count ) + MOV BX @[ BP] + XOR CX CX + MOV CL @[ BX] + STD ( next-stack grows down ) + SCASW ( pre-decrement ) + JCXZ 1 @> +0 :> + POP AX + STOSW + LOOP 0 <@ +1 <: + MOV AX BX + STOSW + MOV AX DX + STOSW + CLD SCASW + MOV @[ SS: nexttop @] DI + ( data stack contains 0 0, must become 1 argcount+2 ) + POP AX + POP AX + MOV AX 1 # + PUSH AX + MOV CL @[ BX] + INC CX INC CX + PUSH CX + NEXT + +( : _suspend [ cpresume -- ] + rswap r@ ub@ swap >r gen-save rswap r>next r>next ; ) + +: GENSTART_ r>next :| ' noop _resume |; >next ; { var gen-arg-count :timm (( t:| t, GENSTART_ gen-arg-count @ >t ; @@ -162,7 +261,10 @@ nexttop :push >next :yield map next >i :| :| idrop i cancel |; _resume idrop i |; _suspend 1+ ; : _pass-suspend rdrop :| ' cancel _resume |; _suspend ; +: _return rdrop r ; ( don't yield at all, skip past the yielder ) :yield pass _pass-suspend ; -:yield filter if _pass-suspend else r then ; +:yield filter if _pass-suspend then _return ; -: chars pchars (( each i b@ map next )) ; +: take ( n -- ) >arg (( each dup if pass else break then 1- next drop )) ; +: readbytes ( -- ) (( each i b@ map next )) ; +: chars ( p -- ) pchars readbytes ; diff --git a/swine.com b/swine.com index 9ab83837b4bdea946883f59e74a50163ee6a524d..e4bc0d39fc23e3ef3d39131876c1d7d98daf26f3 100755 GIT binary patch delta 4034 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 delta 3993 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 M=_RMaJ(jibe*^4j%>V!Z diff --git a/zipoff.com b/zipoff.com index 62e922e377f2b07da2f0b23b0105b18470630da1..f72130d162a2d23759a5013e74e30ce27e08c6b4 100755 GIT binary patch delta 1425 zcmYjRZERCj7(S=%?cKV2dt2OW5C#sWgpA4JsM*FWRG96~{iuN&3}Kshw|CoR?QM7O z?J^9pZof261Zw;UEKx=bhRjH6#yysk*!B=N+^Dj$lMxv*~7kI+=$8VBXcODmZxBaxUUA!&`58oCx@Zt9M3(cn} ze6@6$y3XNmOK&uEVSK6d^}TB--}8al###St;~{_XuXUjkz5X!vob~tlOZi5tp{Xoh zOdL;4CFsOglAL%}cw6{cib}r7Y5Ultd7Hx&$!TyYoaG9C+iu(SIdX813>2gxm}jNf0K zvA~efRA@6P<7HBV_9Ucauk>V(V>XXTsA5GzW&B~h1}ji+fQ{8IcV;%jYlk&}hI=&3wk$!rv#pg|}{na(lb#U2QHB zI*HE+_DzT#9@HWm!w@bc<#D8}Gr9 z6-^6t4iby~!umo|Tmr{Q>h4KC5xn?_rlwPE=r&G@H~deFRE2QxAO111Du_4)&2gd| zXXKoNHgXw(MFTn6G+XcXK;+&OohDg%Lx&D1oCGz1s9-u-SuP5@4rytaa)-!sbBi$jIfLP?3B{$NH zF<93H#tDtPWHY0gMzL3Hz~SP6xD8XqX>nsgmf)?KMg-hI+YoryHUg|38U+`+8#w^ z@1A?kz4y)xF3jNCKOSu!?fAIq17Ww&7yE&H*t#ILH{5IOmuN|Bd{Lr=rak>%)Lvq6 zA@>b)m&cR2ixn*x-^~47xtS@c3troL*q43qTSHUqO3{dBhl`?NwvPCb;ld#^nF5W;%EX6sTQgN#Pa43y z!>)8OsI%i>tRK)7_VnR(G>3aV+utXzP>bYNJtR2684 z{wH)}%t4Vr*&zni4=2qwK%;>(T^Z>gtq__H-QSaRz-kdse8;T;@oqAWk#Q(Arak z!aH|D*ScHEsRoLK&f|jU3{PsNQ9YCgp-Vss<$3(KK;t46kn%VK3g-ZB%bz@1)BMs# z<0APIXugG%=(?sJ1^|iKMzQMXN$C+dPBZ^k@~2pWU)Qz7Py>35PfA~MrzK{MaPbm1 zBNYWvmssXnB@Z4~Q!aYUUCe$WZprN6YeX8SRLgSdC|?P-!+HYlzDpe9r$h#=kEWNO zlS+|p*pph^Zifa<@j>}1Q4Pd7zFPJm-JF2+4ZfFnaf@n=>y`H8&=J8c9s(9gTBs6$?AowwuR2VSO z-4omm&ceMOOuAnTRrV@`jHGTkLaxmJ0=x~?bbg;5WuHN)+PUw54wOylDa%d|?zXfM F^dF)epjiL_ diff --git a/zipstub.seg b/zipstub.seg index ab41e084818cbd74d25fe867dc94a450b15c16a5..1b882364f6fa442c157628a84de83242568967bf 100755 GIT binary patch delta 1312 zcmZ8hU1%It6u#$9Y_hv|X6|SzHNiB++7x3~Q_Lu6LN>AOLm7!rSvGDQxbJw z?0`Ph>9#=(VX43Spl)oCUA7=aiUiBJ_#m4QO{8J5HDwhGi>9)I*)pDcC#%JWnYs5n z-}%lxKX>ZgYkLX@l+Xr04Ouu1w=bCrYwLTKndz=BIC|8w(uaxZ;@WguKX@p}geCggz_d^+>VihgXocP(5Y!` zXE}%?2>2bvuMh~V$^WrZXic#)6k%GOqwVZ&yFfoyh1Q3Xl~n}tE+S2q2cN2YRdJjY zJ1~X0C*fLT3-kY4EkOcv{zj4op%-f-q^_e>66R+wuuf-(W@dM^T zw5FJYsuz_aJfexP9z->v+)VW;EpcvXX3;k*R6J&SunX>-`6WL--uLZU{msGO8F{5+ zqb0uZb7RCkhMj8U&ooRIS=dd-?-ASO8&HxEcKcQ0uJ}FY168Sp;4vb^?&Jd<_s0cy zX`zvqF7fzfAfspXSnPQ@9ySbPj%zZnESOp|qa5723rizzL%V}iMHeNgMNF+0nS^Zv z;+_BEDQtIur&uo&B|L(*91P&Q7I_1a4(x#N7i+4W6{-dHuyzU86}@kL=IZ$J#`4BK|24YLe-g{3_&tBlzN0Nw4zv4+>VNJU)Z7#@fhNQvmbnXo*~fEM*bd+rgyx|hoUaNA8sYnt%dGt zcYLcH--`OtQ~UxinAMSZb?B|@)uHX~yu`E06ct&Pxy*81gR%nx9>gKL!v9O`Grr1h z@XoLYYh0A+?QjPC-5Gw8ACdbk_RaUj{xRI&V-&s+!GtN9-T8HLeWWX4sB`Cq8hB!bS6k~-4>sxJ# zk%SfAWS%mbtQXW(_JJX8;t8XUeLIhq;9oQl>c_j(DQjDVW#nXlfJ?0h=yYgTiwOQ+ PC`MlldGLb_JPH2*9IcSG delta 1218 zcmYjRU1$_n6rS%+&}{b3%uOpLHHAj4Hjp-0aJNBJvYQtlc1xa;uwlgvt>mdJyNfMS zoZ>@hER?n(1QcWlg$1Dy#;^qOsWL7oZ4iV~Yg91ogTg`;ro|Mt=iJ$?zRcYFo$q|- zcjotf(a_q5X5xZ64Iu{Y*iY&{5 zMl<3f;ej0JsfZBk(l=A0gkczliy9tFm-riU%Y_Q==mjDBjd)+x>MO-2fYbXg(JSlc>@ ztgKMMMchyBhywvGSPjZ3#DXSsmLt>=mhwrei20>IXe zpdQIyH3K}=N+DWWxm)W$*3XMKCngpj(yRTx3r_GYJJQiY?6TwDr$k=#*crjGDq>JH zz;lQ^Jpy()Y3F2wWg5X)$K{5+*clvXR0Y^#gN75JO3b=hmWRbO4XS}0_0AJ1aaz>P zw9SQ{reJk5LQ3qVkQp%|<1z86hQQ{MeM}M8>(1}iYv6(w;Z8l&Xe&8ow~{5i!lVE3 zEVVwyvlN7V_B*@}1N3YqbA;qbjs5w|T#u4=F)eC1>bP^1NzUd>Vv%8ojR7W|VJF0t zlM!4QW4Emu&XVXA+wf)8nUYt{m$nh&Gx9i0jIW%J{`~Id?A<4KpB!p`Ar7@a*7I0e zdSQR!tvf$xVV=UebI!?&Ei*58Wt&N3OqN%>MmiQUkxL?YZ~K#4djFt8}{Z;NVT TpofEBPGrP