From f45d523bdd845f12f58f2b9eb5f55dc5e207b03f Mon Sep 17 00:00:00 2001 From: Jeremy Penner Date: Sat, 7 Oct 2023 09:28:46 -0400 Subject: [PATCH] dialer splash screen, modem noises --- beep.jrt | 3 +- dialer.com | Bin 0 -> 5363 bytes dialer.jrt | 138 +++++++++++++++++++++++++++++++++++++++++++++++++++- iter.jrt | 3 +- swine.com | Bin 7625 -> 7705 bytes swine.jrt | 2 +- timer.jrt | 8 ++- zipoff.com | Bin 20108 -> 20159 bytes zipstub.seg | Bin 4154 -> 4234 bytes 9 files changed, 147 insertions(+), 7 deletions(-) create mode 100755 dialer.com diff --git a/beep.jrt b/beep.jrt index 3da4e26..4212ded 100755 --- a/beep.jrt +++ b/beep.jrt @@ -30,6 +30,5 @@ : 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 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 literal 0 HcmV?d00001 diff --git a/dialer.jrt b/dialer.jrt index 62840a6..6808113 100755 --- a/dialer.jrt +++ b/dialer.jrt @@ -1,3 +1,5 @@ +1 var, quiet + array dtmf-col 1209 freq>div , 1336 freq>div , 1477 freq>div , array dtmf-row 697 freq>div , 770 freq>div , 852 freq>div , 941 freq>div , @@ -9,9 +11,143 @@ array dtmf-row 697 freq>div , 770 freq>div , 852 freq>div , 941 freq>div , -2 const D* -1 const D# +: noisy quiet @ if rdrop then ; + : 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 ; +: dialch ( b -- ) >r + r@ [ key * lit ] = if D* dial then + r@ [ key # lit ] = if D# dial then + r@ [ key 0 lit ] >= if r@ [ key 9 lit ] <= if + r@ [ key 0 lit ] - dial + then then rdrop ; +: dialst ( st -- ) chars each i dialch next ; +: dialtone [ 350 freq>div lit 440 freq>div lit ] 200 arp ; +: offhook 30 sleep-csec 3 2 boop 15 sleep-csec 7 2 boop 10 sleep-csec ; + +2100 freq>div const carrier-div +980 freq>div const hs-low +1180 freq>div const hs-high +1650 freq>div const hs2-low +1850 freq>div const hs2-high + +: carrier-drop 0x6000 1 boop ; +: carrier ( csec -- ) carrier-div swap boop carrier-drop ; +: scramblebip ( div div -- ) rand 2 % if swap then drop 1 boop ; +: hs-with-carrier ( csec -- ) + over-csec each carrier-div 1 boop hs-low hs-high scramblebip next ; +: dual-hs ( csec -- ) over-csec each + hs-low hs-high scramblebip hs2-low hs2-high scramblebip + next ; +: probe-hi ( csec -- ) [ 2400 freq>div lit 1200 freq>div lit ] div lit 300 freq>div lit ] div >spk next silence ; +: handshake + 30 carrier 45 carrier 75 carrier 30 carrier + 30 hs-with-carrier 75 hs-with-carrier 45 hs-with-carrier + 37 dual-hs 37 dual-hs 37 dual-hs 30 dual-hs + 45 probe-hi 50 probe-lo 15 probe-hi 60 probe-lo 60 probe-hi + 300 fullduplex ; + +( terminal words ) +: fixcursor texty 8 << textx | movecursor ; +: nl nextline fixcursor ; +: emit draw-char fixcursor ; +: xmit ( st -- ) chars each i emit 1 sleep-csec next ; +: call ( st -- ) s" ATDT" xmit dup xmit nl noisy offhook dialtone dialst ; + +: connect ( st -- ) call noisy 200 sleep-csec handshake ; + +{ : X ( v -- v ) 2* 1 | ; + : o ( v -- v ) 2* ; } +7 const logoh +6 const logocount + +array logo +0 X X X X X o o o >t +0 X X o o X X o o >t +0 X X o o X X o o >t +0 X X o o X X o o >t +0 X X o o X X o o >t +0 X X o o X X o o >t +0 X X X X X o o o >t + +0 o o o o o o o o >t +0 o o X X X o o o >t +0 o o o o o o o o >t +0 o o X X X o o o >t +0 o o o X X o o o >t +0 o o o X X o o o >t +0 o X X X X X X o >t + +0 o o o o o o o o >t +0 o o o o o o o o >t +0 o o X X X X X o >t +0 o X X o o X X o >t +0 o X X o o X X o >t +0 o X X o o X X o >t +0 o o X X X X X X >t + +0 o o X X X o o o >t +0 o o o X X o o o >t +0 o o o X X o o o >t +0 o o o X X o o o >t +0 o o o X X o o o >t +0 o o o X X o o o >t +0 o o X X X X o o >t + +0 o o o o o o o o >t +0 o o o o o o o o >t +0 o o X X X X o o >t +0 o X X o o X X o >t +0 o X X X X X X o >t +0 o X X o o o o o >t +0 o o X X X X X o >t + +0 o o o o o o o o >t +0 o o o o o o o o >t +0 X X o X X X o o >t +0 o X X X o X X o >t +0 o X X o o o o o >t +0 o X X o o o o o >t +0 X X X X o o o o >t + +array logobits +0xb2 b, 0xdd b, 0xf0 b, 0xde b, 0x1f b, 0x7f b, 0xfe b, 0x0a b, 0xba b, +target logobits - const logobit-count + +var curr-logobit +: logobit curr-logobit @ logobits + ub@ ; +: nextlogo curr-logobit @ 1+ logobit-count % curr-logobit ! ; + +: draw-logo + 80 logocount 8 * - 2/ 3 textxy! + logo logo logoh + for each textx 0 logocount for each + j i logoh * + ub@ + 8 times each dup 0x80 & + if logobit else [ key lit ] then draw-char 2* + next drop + next nextline textx! next ; + +: animate-logo + logobit-count 3 * times each draw-logo 10 sleep-csec nextlogo next ; + +: splash + blue bg! lgray fg! 32 fill-page lcyan fg! animate-logo + nl nl 15 textx! lblue bg! lred fg! s" Unregistered version" xmit + blue bg! lcyan fg! s" - you have used 13246 / 30" xmit nl + 15 textx! s" days of your limited trial!" xmit nl nl 200 sleep-csec + lgray fg! ; + +: go splash 0 15 textxy! + s" 5551212" connect s" CONNECT 57600" xmit nl ; + +' go ' main redefine + +dbg" saving" + +{ s" dialer.com" writecom } diff --git a/iter.jrt b/iter.jrt index ab0d32c..5c77311 100755 --- a/iter.jrt +++ b/iter.jrt @@ -121,7 +121,7 @@ nexttop :push >next : for ( start lim -- ) >next 1- >i :| 1 +for? 2 |; >next ; : for+ ( start lim inc -- ) >next >next 1 nextpeek - >i :| 2 nextpeek +for? 3 |; >next ; -: chars ( st -- ) 1- >i :| i 1 else drop 0 then 1 |; >next ; +: pchars ( st -- ) 1- >i :| i 1 else drop 0 then 1 |; >next ; :asm tail ( TODO: support CREATE words ) LODSW @@ -165,3 +165,4 @@ nexttop :push >next :yield pass _pass-suspend ; :yield filter if _pass-suspend else r then ; +: chars pchars (( each i b@ map next )) ; diff --git a/swine.com b/swine.com index bf50f07c5699f77bedb415bb569928710085a33e..bdc7a7fc255ac4221c6450b3213e7ccfdef2f4fb 100755 GIT binary patch delta 3166 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 X85{~#1m6ka)|0^p+&e;Vx;o(hCbnV1 diff --git a/swine.jrt b/swine.jrt index 20c0971..e61acdc 100755 --- a/swine.jrt +++ b/swine.jrt @@ -189,7 +189,7 @@ dbg" general-purpose drawing" : spacer ( st -- ) sp drawdot? if dot else sp then sp ; : draw-spaced-text ( st -- ) - chars each i b@ draw-char i spacer next ; + pchars each i b@ draw-char i spacer next ; ( menu subsystem ) dbg" menu" diff --git a/timer.jrt b/timer.jrt index 3189659..33a8fb8 100755 --- a/timer.jrt +++ b/timer.jrt @@ -57,8 +57,12 @@ var timer OUT 0x40 # AL NEXT -: sleep-csec ( cs -- ) - timer @ + begin suspend dup timer @ <= until drop ; +( the timer is set to run at just under 150hz, so a "csec" is closer to 7.5ms + than 10ms. ) +: over-csec ( csec -- ) + timer @ + >arg (( begin yield0 dup timer @ <= until drop )) ; +: sleep-csec ( cs -- ) over-csec each suspend next ; + ' 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/zipoff.com b/zipoff.com index a01d02062d645e686913b21d0d981e1d853c1e4d..3ed5dadb759b3ab999ef6cb308d9b069e1449559 100755 GIT binary patch delta 868 zcmYk4Pe>F|7{K3KcUD*1nOQM6Hdj~>)NE`qGx5)8V4^$oW^PeIZR_r+lk4s{Z`@Lf z#Y>@h$vK$_QFt&Bl8u5om=b$1iVg)r5SSo@L6qphi@p7a-RAp!zwdkB_ufp;!_|3M z^>eSZ_tO0fhTsr7dKUe6TIa-0-}_b`ZHrt3g|__V=lPYYISQ^O-%*msB^jVA*of(A)0X8YcV!ec7B8niI?71l80}NTU>dLQ43&Q+LAeN*BKEwV9pb zsYC$nk**Vz-<6+cL$tv$Rf&Xs;1CATD|!e~S&)f0=zAz9@EP!fcB29~9Mm$=A$?bL zfPfanm^{la3m!fA#7jsRdKxiLcX)x#>V&=rqrvvz9Gn-awU!cBv4kSm#L#BD`d#B+`z=p;$Qm zFzd{L-vLIWY7`s6NQ5IPLO(H&r4n-L|7?eGlDQ0Zn9S*JEM~t-_H2}^q1oG#17OAA zG7cA3CU?rI%4b;pAo9vWe1%0uYMp721kEEh86{khoxpGmo19Fw&JgRZ- eb{Bx4o|fC3vqbjhe%mX~aaF^{XkR^62EacY-3fRA delta 817 zcmYk4K}Zx)7{}jRXI9O2X0pvKTZ08D%|=8`L~~UT(Vh2ZuY#biyW=u7?vC@uwUXGp zgsCS7f>J@~R2Wzbb?DF%vQQLVJOn|M2Py1gVh0KA&FqTZ=KKAB-}k;ZGjCSl!V0YZ zxmVubednqvd8E$1C!wkKN2se|qrC%fA+eFc-$NBm9nY(mSh$eMvY&a_mU(!l4Z>7r zv!a}Jv%=%5-coD#yl>IZW=i~TD*{<;gr#stcvD`M{oz@(j$X)|ypKLg%XlFC6dReH z#^0szZszN?YK~c#SYQ=P;-xB70^&+SB$1Q?Dw`|0CRFACLm_6;uvrV|Le`*ERUW7A zFqtH}l88}$kL$7Kq}KErnqgagIT#PQU~MgU1~0dHT@9{~ZxODcZ8it%TNzLnG2%2@ zqDb=Q;1`L31+;^5aD*CS-tf8(5A)8eP6igB2j}1_Z3!MZbtgkUyYY3u+v-MV(?fWV zPMu*xzN2m4Ave6GDq5@o9Ka#`lDm%CJaFpw+%zr-K?iJc=Wr1mkLXTyz)c|!7}g_% zh{rds;gfv~w4oyf`F+U^$5hR1Q4ELl@bkC?s0lNrM9nVxjt2N|#~?sKlHbKeKs6@l z^Q`5^0qC-V_=;-)SsK2Ou9u5}N{k>KL4`$rTBhS@9ZkmUPqE7X33{+*V19r+Ak$mhmSs&f{ZPz*E8># z##H_SMgyh-#u|RZ+kJz~@)Lg?}PYSrVfulP}X2 z{wjW7rn}6(OcE@`Kw6l~m+26{BTyWqMuX7`h;0}cSvVMe1?Y9N@d!BRbplCMc7_u6 z4GPZ`B7UEb_^tO}Pe8yzV1wB+=ZI$x9S@#4fNe`+rI&$nHC95XJle168OgG%T&zt zjd3c|dB%@Sn;7p1gfksyJkEF;Y}+@+MFK?v5cX@1MFO#mMFKFD0)jAAAU9eFg5-}f z>Ij||2Wyq#UBD9{c%CtqkxB3y<55Nj!ASyQDlI^f>5L4Foxm_I;gnzjSwEZ8ktu`o MC}W2p$m#+{01keYQUCw| delta 417 zcmeBD+@-KVmzmQ+ppJ0?V;y6_W;13bZiy&o;h?pc;*1MEs603 z{{rS>CTXtoV3r;8CPqDh@^{WkFtIWJ(a2&d9`|Ch(2Xm#LWP z8{<@_^Nb&vHZjf;2xmIZc%0FtQvl?EZ;S~7Y61}UYmNkgSVlDgn9_3s#~C3q(m>6z zj0b>*@iD<^02F?X A-~a#s