LnSOS BOOT 1.1 SOS.KERNEL SOS KRNLI/O ERRORFILE 'SOS.KERNEL' NOT FOUND%INVALID KERNEL FILE: xةw,@  ȱlmi8#)!) /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// /// SIG, Washington Apple Pi 12022 Parklawn Drive Rockville, MD. 20852 (30-READ.ME.FIRST6)PRINT.ALL  ,Ҳ*۲'*MENU.MAKER }>*SOS.DRIVER o(.*SOS.INTERP 4keҲ"! *SOS.KERNEL @,VҲ"!aSOURCE.1Ҳ+Ҳ+%SEG.T jŸ/ III.TEL.04M.04u' DISKNAME.DAT'Ҳ#ҲFLASHNAME.DATHҲ$%HELLO Ҳ"/ *HELLO.TEXTҲ"6-KERMIT.REVIEW Ҳ3Բ4)KERMITDOC >dLԡm#i㰼m#iЕOLԡȱfg hi !dLԡ憦  Ljmkm l y`2 Lԡ8(Je稽)ʈ@L1)-984-0300 WELCOME! WAP /// SIG Public Domain Library Category/Number: Telecommunications/3TEL-04 Disk Format: Self-booting (Side A) This /// SI CONV&CONV$CONV%LEFT$RIGHT$MID$INSTR>=<^/*-+NEXT WITHOUT FOSYNTARETURN WITHOUT GOSUOUT OF DATILLEGAL QUANTITOVERFLOOUT OF MEMORUNDEF'D STATEMENBAD SUBSCRIPRANGINVOKSTACK OVERFLOREDIM'D ARRADIVISION BY ZERILLEGAL DIRECTYPE MISMATNDEELSCONLISCLEAGENETABTSPCUSINTHEAMOSTEANOEXTENSIODIAFNOAAAAAAAAAAAAAASGNINTABSATYPRECAAAAAAAAAAPDLBUTTONSQRRNDLOGEXPCOSSINTANATNAAAAAAAAAAAASTR$HEX$CHR$LENVALASCTENAACONVOERRLIERKBEOTIMEDATEPREFIXEXFNEXFN%OUTREINDENAAAAAAAPOHOMA SUB$OFTRACNOTRACNORMAINVERSSCALERESUMALEGOTIRESTORSWAGOSURETURRESTOOALOASAVDELETRURENAMLOCUNLOCCREATEXECHAIAAACATALOAADATIMAGCADEAPRIssssssssss\3!z~IssssssssssssIG%ӓ,ssևwn7}|tttUUZ{fzxxˆU膅[L<^ENFONEXINPUOUTPUDIREAWRITOPECLOSATEXABYAAAAAWINDOINVOKPERFORAAFRHPOVP̠Ώ h:gpOn[n٧s]ds3issssssss0b>&dsjs|T}|s[  !"#$%&'()*+,-./0123456789:;<=>ŭ᭭򭭪𭭠򠭠頭퀠Šӳ頠𠠀𠠠堠젭ӠΠSOS NTRPRHeLZĠР쁭堠堠ՠP򠭠έ魭HER SUBROUTINEnSLOW=110xFLASH/2=FLASH/2):۴ =11:=07 FLASH$ SLOW FLASH:".d1/Menu.Maker"5 WAP /// SIG HELLO PROGRAM. UPDATED 4/12/89 DGO :#1,".D1/hello.text" ž#170 (#1;ERIN$ 2ERIN$<40F#1/P=23:=25:"PRESS ANY KEY TO CONTINUE.":G$U-Z#2,".D1/FLASHNAME.DAT":#2;FLASH$:#2%dFLASH=110: FLASce limitations, it is NOT self-booting. Please read the documentation carefully and print out the commands for ease of use. The "Kermitdoc" file will tell you how to launch this program from our Pascal Menu.Maker or make a "turn- key" disk. ENG PD disk brings you another telecommunications program. It's called Kermit /// and uses the Kermit Protocol. You'll find the documentation on this side. Two files contain the source code, one on each side. Kermit /// is on Side B, but due to spaCSTRING TOO LONFORMULA TOO COMPLECAN'T CONTINUUNDEF'D FUNCTIOVARIABLSOS CALFILES BUSNOT SOI/FILE TOO LARGWRITE PROTECDISK SWITCHEBAD PATFILE NOT FOUNPATH NOT FOUNVOLUME NOT FOUNDUPLICATE FILDISK FULFILE LOCKEFILE NOT OPEDEVICE DISCONNECTERESOURCE UNAVAILABLDIRECTORY FULDUPLICATE VOLUM ERROR Please Press SPACE BAR IN PROGRAM INTERRUPTED%&'(%+.@C$DE FG!H"I'MN#PQRTW(X潭`: 808`:dd@՚H Z#IJJ iLOPP$pX0S&ȱhȱKȱLe潥ɂ逅$L# $mKL x~ m khLgLsLc h5逢)&a TH THLgL6k8:9: STT`)ɀLK$Lb8gLOPPKLMNhhm Vf0 mLf) mWA 0 -a mL8fW;8<< 悕` 6kLU*i kXX 4XLy \\'_ch_chbi^g \ihh ] Qp aj ih `p b iq bqn %jjg56Ly { b bq | XHWHHHֺh$PLh wlȱȱ%$LWH mh x~  m#W", mȱ28eLeji`Lwl mȱ"Ɂɂ ȱ :, iTjj ȱiVjj8逪XW0 Vf0WHW$ 0X: h ,@dd )e dʙdH &eh(dL ddک,ddLd:e``eLeHELLO ue 5eLse6e:7ee8ee:e`EAd j @a(% -, bLs j {ghhL<^gHhHhH , - b j$% @ag5h6h6hhhhh8g5h6h 悅`6 "]La ud `L  d.CONSOLE[[ TdSdddddd0 ddddd`dd A 6 s e 9c()' 9cKHLI jLdj89弅:彬: 悅`H hɝɞɜ)`dd  6芅 e ()'` e'()HKIL 9cL>hL<^) i!Ls j @aLK$L% :: 悅 lc!)` +b` +b` sL :b#`L,H s h ऊL(,L8f` A KL jLdjOPPKLL h AKL` Ѽ   (`H shLs Aji!S)Lt`SSS`L` z :0.`9::hhgg.%g& $gegަhH逪hhʰ` ҥ [ aLT ҥIJJABB=>>;<<?@@T ě hhhHH  `89$ 0~!L`!sm?iٰcL`S )!a{)Qi ڐ߽S) -ai) -aɢ ɣɍж$HS -ahʥ0SSȩ5%"/װ&hԐɈf0ɔĐ 8,f 8f L_ʅSS=ȄL`ȱi8eiidHddhd) _ ƢLh _L>h jhP _S @a-Qggeg5hih 6i6 "]S" ]$%SSSg a aL^ S S`La8 SiUjjS):,$f 0$ p fHhH_HcH uhch_hhhfhi0hhhB B A` ֥'( )&񦕤LNKM$Lb ě $m wl "m6X6+5 56ɀ56H $mhɀ(Z)& mL k~ wlL ͝dL Nsd# wl^_ ꂅ__hg^`8 悕`gHhHhH5?6@6@*5g5666gҦhhhhhhhhg:e:;e; ;m;`@c@c?be^@e@ _m__^ \Lx] i6g55``BY BSAMHH H] LPL(\)&P ěj9ȑ9ȑ99i=:i: >i>`Ɂ7XWWXjnXWi` ]?@@bgchch )^ ]b ]b^b^L\b8g+H__^8_ABB 9::)ѭ [ I[ aυ婶ZeLLL^$%Lae LGidFddddddd.ddddddddd ɕdˏd`Ls  Apple Business BASIC v1.23 - Copyright Apple Computer, 1980-83 d wlOZL^L^-L(dPL<^OPMNKLhhLg` Ls ҥ?ieCiLa,  aFL s a iLg ]hhh5h689H: H:HLHKHH6H5HHH` ui` pi` Qp j pi `p i` j jK$L%8eȢ 9:: Ga.ghh 悅` A` \\ɾ,L<^hhZkKhLhhhe9e:: mLg jei `Ls j:,"hhhhLgɜEɝDɞLb Hɾɺдmhɾ Qp aj pi `p j` jLi j,656 wh H5Gh`lmm566 Lx5Hȱ5ȱ5 F665 w56h(` x("LH)&h`( '&'`lmm566LxĠLx znInEz{iLx y? zL||uu`8i$iznIii0ĨV y${Wiuu8Iem_B_B`)&N> ȱI8gJJ hhge ghh f feLH>H= x\L|F )XHABB8 __^hHI8e^ @1 @+?%GHHHIJJih BABGHh`$  ě u Дs IJJ^__Lveȱeȱe `LćHƽ Ƽh`$ lȱlLL{ɝɍLɎСL s HI s shmHmHlHHɦ# shmHmHlHH , hHLt  ,, shTTLui ui,L3$0 |Lu xijk6kxyy xxy6i L[ s r$PLsi,L3-hLs L*tɘcɭ_ TTLdd`jk8L|L3L3TL3,L3i LL r$PLLBLsș Ȅ ( qƚƚ` s s),;,=,#,(,,ѼLL<^L<^ llmm$P$?TUJ)TU  ' Lsi imLqLsh E0`H ty ))ELyq  8 $0!PizEn{dUeUi hLqLs `wLr !L2 {}$ 0`QɀX zLs.+"2mXm tL qXXW zzEn{i x }H$ ]kh8 )KLe9e:: }Lgi , p s$8$0p`PL<^Յ H s r ɀ ȱX Hih0 & ?<I?iE W Lq s )L<^ȱQȱȅR dj sLHoUVV$ LhU Lp$ LL<^opL^```?EXTRA IGNORED?REENTER $0pL,`LgXW ׫ k*iXX 4X \\L<^Xii7 { n k$ |WlXVVE$ P% eT{||Hd ̐h p IkLo00$0 L>o "m nV dj$D$ P 膼Lo$0",i [ kLoHSHhp< {}$ p0H 07h ]k ,LmUVV `p F sLn 2 ukLoF вLm jȪЖ LL<^~p l nhhLgOPP` Add# 6d s S SS@Ln A " r ,; s lLn#f  ;П ⭩,SLn "mʆ,S _S% nLh "mL_T ST#L(, U VV ׫$ 0  QpU= d hkddhe##5ddˏdd?Ll ,?#$04dHHd = d hkddˡddhhd`LsL#&F  ; s b 0` L+l$ Nsd#Lzm566ȱ5Ll H# wl m#͉LchL$m QRKLLsh$0LU$^`=8WW>X> 悅XXXL:^ g`L<^ l Jj bx bp,_;Ll  ~q$0P oՅ5R66R l ~ L%l $m0 =k $m#`$L#i)8#Ll  s s( L7bʊ# L-l m hxd5d$0H h`L^bLb$%/%5$ &5 &5e$$5e%%$&%$e$% Lk ׫ sHH ~qLPkHHh$0'ph | ZlWȥmW`L$|hXWXL-hm lmmLkl VYZZ{|| w ᐥlmmYZZ LxWXX ox ExYW# kXX 4=^W^0A,lkj |yjJkjlkmlmi in`emeymlexlkewkjevjLkyi&m&l&k&j8iIiii9fjfkflfmf`nIngjIjgIm lkj`L<^}i0vvvvvj`Ly^Vy dv88; 54541r |LiHi z xz U{y xy рz xh '~z zLz z~ zm zl zk zj zL{LyJ eyexew~ev~f~ffffJ`5665y5x5w5zEn{z t $mlmkljkij8ihn`L,$0DpA q enHi80 @Lyu \ % @u ćh `&m&l&k&j`2L0 և yxLT}$0pLI oբRLi `u LLi u Lui0 ܆ چ,,% п 擩lm0u 1eL5665`iɀ*iH i  @8 ei $ tutt tj ȡhn` t` 0RN0R 0R$n-RRR`i` p`5665i`$0BP?iH i hLbe55f5f6e}Lme6u5u }`6ʈ`v`jip` ? #  ue }~ %u $ چ 0 u}` L uu  ) }Li <i@L{i$i0 p $ 1`ui` LL Lbb `}i~ei^~0] e e^`}`566i5`_cf_cfi^eub` ?^qbep`L<^ ?8b^e` rp`I` ? ㄩp^|be #^b ebbu|beiee^^iL56^f" ऩ थ (! ( ऩ थ (" ( द!LGb8Lऩ@iu +-ELj) e | ^ .' "5 1 p) iIii i)Lm` ?i $0 ׄ $0 $0 ^`Hhth`^Qb ^^ 8` `H Jh(L悈`H逨h` Hh8 Hɀjhji` HihJi(`  ~q$L ɺ b$P i pi$ȱLdjɻƟ dj 柰ީ Lihh sLg  s ! b   s "!!!+|] {n LU{HLʁIڢIڢ-(h#5ᆥ](IڢʥnH BiHɁy U{y рhɁ xhLB` vy{| g|S}dpL}Qz}c0~~D:~L̑56gh6hegehh `iɇoȘ戅 aziȅ xdo`Abi$nFn) i  j g g ^ ܇.Laz͠Lć ^ ׄ& ć ׄ ć ͠L- x |z K{ | T}{ x xnH yxn0 I B xh B Lр |  ZuL.y +|z% T}uH }h{ ~|H !z az ~hJ inIn`L~8;)q4X>Vt~w/z*|cYX ~uƀ1rP aziP | |iɈ { T}i8Huiiu x BU 瀩{h z` |] az 뀩]Laz | i8fe.șR0șRmymlylkykjyj00ڊIi i/ȄȪ)Re.șRI)ЪR0.ȩ+f.8f-RER/8 i:RRRRRR`y`'d |Ģ { &{f o0`LB ` H$ge &{h 80 '~L}H |h |zEn{iLxf d$h0Ly ef q80fL}COt#t$JZ mLKjk8 | ~Lm ^|-$nșRnȩ0iL f~ azea~ } \~ } &{e B{e yx %}ei0nihoi8傐IL|`7 z!L|iD8$n yiLyn)FjjjLyiɠ %}nnI*imLyjklm` s e-o+ smo..IE)2s S -+fh r$h8fL}fg s$gPf8ef B{f65m5l5k5n j5i`d,]WXX566 |m5 ^|l5k5n %j5i5` |m l)m |m`znth` |ht`i  y my`i n*` |jkjI*mlinLyFn`nEz0ʢiH xv5ui`uei0,iiL0y{n`nI0hhL,yLy |i{ xi` |={{ {LZ{ zL{ |8ii zivjwk xlym* 蕁24(y&x&w&v0⨥ymyxlxwkwvjvL{@jjj)(L{L<^~jklmL y56}5}} ,kk} , kklm Lٓ[ 80@ 6 2`  dkH) ojhJJJJ ojL 0:i`L<^ jHHHHHH s jhLyqhhh6h6h555_ȱ5VHHHH %L/5H6H6HH ?5^6_6_hhXhXhWLk ? % ?Џ`5566` xe5566ɂ66` s p `  zLseff z.!'$ iߪ$ 0 H8eAi\h$ P8 (Lt$ 0V` 痠U` hh R LsL  z (L[ Rީ  @Y%(&:$LU s և ^|iHn %jHkHlHK s n ZlHmH5 s iH jHH楩e ) ,LsLR eՅ7V8U #   785U6VLΔU7e778ҥU^V_bcF_hcCgDhebbc \^__`U8傅UV` |UȱU` L<^ |UUƜ0ƛ ӗWqeWȱWqei W` |8UUWȥVUX`UeUUVUO / +'L U)łiV VL LI 8U 7ȱ7 UU ЯUVULU7V8 p L LZ U qUU qUH85h688V77U U 5qUWȥ6qUX7qWWȥ8qWW ٥IiV) V LVU?e8V je?e>e8U>e5V?e665e=e@eee8 hx57 xLCx8I77JJ8 88` H dhjL YYHH dYZZ oxhhe5566ɂ逅66 wZZY L YIL=m ) s  ʊHYImm shhhhYhZhZHHE` 3YZZ xLCxl5Ym6Z78ߠȘH yxy hL3 j kqHHHH s H , ,H s s ~qhh 1 lhhXhXhWWȱW7ȱW8 eLNLXZWX ` GGH HlHmHmH khmhmhlh hk8j7k8Lޒ e7788IjJkJk )lmm'&`UR{R||L̐: / cRRȹRRȥ Rл s `Lsh sh5lh6mh6mhxhyhy x x Qȱx7ȱx88 Ƃ 7e7888ł75 楽HHȱȱ6H6H5H s =к bqhhh Lshhhh` ~R/mZlmYZ PujHkki^^`H"h{||kjkȱ{ "ie{||  V{|56|6 w&5L<^i8e` ě u8A?pB@B@ )onL܇jkL| Nsdȩ8 NsdL2Lа,L<^ A s ׫ g iq s= sXHXHWHHHH ajL? b rLiq HHH s iqhhh5ȱ6ȱLI65 g5H6 2|Hgȑgʆ5a g5ȑgȥg <^^^__ɂ逅____<;إy6 hlhm^Ȋ^LL:^ȥ5^H^h ͎el5emȆ6п  ͎e^e__ iLZe *& eegggegȱgehh Ľ ,L<^  8` ^LQ ŠhhL6 $P 訽5 ͎56ۥ 8ee L:^?be^@ce@c __^_ \__^;<<6  $Phihi^Ȋ^6h656H |mHlHkHjHiHl5 8eeghh^__` HHH H bqh hhhn0iɐ1 }L yxL%}\i FHHHHH 6hhhHHlm ,҄ shh)>=>hgh<<;[a{p ;<<ccb? @c@ube.a{bb,\(eb cc`ebcA[8饰 a{8`8\e@@He? ]@@?hbbb0 ea ȑbc8L@ @@h57Ri88 pi UŦLUUU HHHHL 2hh LW iL 2hlhkhn jhimhHɗ8 Ls`LIŚ1CUDVDVU Lŧ 0 7U L`L:^֩ ŚEĚ L| Qp QeeRee8 1  sL͙ɚʚ `pAƚЙϚŚњ˚ ̚8 悅DDF͚ Κ8 DiFEC CD)ӚDmӚDԚCBКLěŚAݚ⚠IȌ 8 ꂍ  8 ꂅJJ` ! ɃɄ b`" lJJJJYe s ˰L8Ls LԫN l@u=ekPe tMe )llNesOet NeOetMeCOeNeȌ=e>e;e ƬƫHH ,hohp` ɩCe0R`ȹR`ee?e@e ue 5e T L=e;e`Lso`n}pm aa`dyopd8isŠt`dyoopd8ip`J uv`&&&8孪孪宐橈`! @ uA?B@B 悅@=g>h>h ]=i>j>k a=g8i>hj>h 悅ki=5j>6k6SOS KRNLb.D1/SOS.INTERPŠ̠Š.D1/SOS.DRIVERР頞 0 ) (lH'&3&'&#e'#%e'%'&"$"$#%'#%h`$eh`L)i   HH `TH..TH..TH..THATS ALL, FOLKS!R`RT RT`#RT RRRRR`0R`RR 㵩:RRL㵆  ~ RR`BLOCKS FREE: BLOCKS USED: TOTAL BLOCKS: sj]"]\AjiGa@aI[5x<^sě xCxEx5eҥV{}g}gkj̐kIk~^hT}27uejewsHH st\hh H PASCODPASTXTTEXT PASDTABINARYFONT FOTO BASIC DATA WPTEXTSYSTEMRESERVRESERVCAT RPSDATRPSIDXAFDISCASMOD AFRPT SCNLIBk;eo $'>ed?eehi?e ueL5e qrL,op ɩ`et?ek;e`hZ L<^hZL<^L=ee>e ?e`opqrst !e5ehe?eLje LjeR=89R>:>:iR:RiRRiRL`8(RR(`EeFe  s bq Vml0L dMeL` bՍe :RRRiRȐȰRe9Re: J 2IHJh*=>> 95:6:6R L1 1Lԫ`L:^  aFL^R, ue 5eLڭR7>e?e5e?eJeKeLje֩ u>e?eՍ "] a a$% iLg֢   sLj$%`8f  a e ; ` s ɩ` YLILcopL7 z0xH ׫$0_ ;h8fH`aai shH2 h zJJJJf Ik ɩ` ̬ t os YLA ևLLק jWXX` ׫$`ɥ%e,ȥ,*,- y,,,-,,,ȱ,,- yL+,ȑ,` 2"p-,-L(Ġ %>,i-i8, ȱ,%,W,pp ڠ %p`l  " ) i ?ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghij0 `8`HiHiH ihhȱh`86)IH)heuQɸ` ` W` ] %饚0` W` ߰4`)|E8LLLRLLLLL*LLLLLhh`LLL`SOS 1.3 01-NOV-82(C) 1980, 1982 BY APPLE COMPUTER INC. ) `G`î** }*`o^`on 8 JJAj@` *?($`ΠņɠŠ堠РѠ͠஠әƆH v?c,,,,h߈ߢ~))`3PLLP*%(i&`Ѕ񩏍E H pph`XǠĠӠ!((ͽϠРРSOS NTRPSOS DRVR(.D1(YYYYMMDDWHHMMSSMMM̱忠ΠͽŠ堠Р͠Ю̠Ɔx߭J ʈc(()o/ e/''ʈ((''()(1i / e/''ʈ((''((''((''' ('`ŠDAY, DD-MON-YY HH:MMSUNMONTUEWEDTHUFRISATJANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDECԠŠР@L&I/O ERRORINTERPRETER FILE NOT FOUNDINVALID INTERPRETER FILEINCOMPATIBLE INTERPRETERDRIVER FILE NOT FOUNDINVALID DRIVER FILEDRIVER FILE TOO LARGEROM ERROR: PLEASE NOTIFY YOUR DEALERTOO MANY DEVICESTOO MANY BLOCK DEVICESEMPTY DRIVER FILE '(i%%%h}%%`8 ȥ!8 !)"qȥ#q#e$ȱe%L)%`@(((( % %`((((࠰$(ɠH(@(h((((@(`%z %% %~(A{(L%`.8(.Je.&ʈ.s(1 6$P8"ȥ#L1$8"ȥ#(ϸ`"##L]$"qȥ#q0,$p)@"q"ȩq"8`*$% $% 8% $L$* $8%8 $`8 &'$% 8&$'% 8$%%`H   q ȥ q Hi hi 1  % H H ȱ h h % $$ 0 e e H i hi âz %` 1 8`    # &ȱ ' # i" i# # #`8 ȥ H h `8 6$P`8"#%#%"$w"$#%"`荚ٍ荺 荚`荺``` D ( )  * ) 4* * h* ))` L% q ȥ q Hi hi  i" i# #% $ȱ %ȱ &ȱ '`<!((g %(r(z(q( %y(i(0z %"#$ %&' $"#$%&'   `%$%ɠ%* " ~#C #p $ %*0"#)#)i $"% * %*  L! {" j% %ƌ(X#"$% "$ #%%& '   ` {" & ɠ% %)  !( (" %(r(z(q( %y(a(0: %   "$%&e$'e% R % <`` LLɠ8`ΛLL渠`ǽi `< Ȱ+<#5 ې'` ɐ /ݐE`W8`R` 5&i ` Ȱ 0i `<8> ȐT eİF cȰB)Hh5 ˭)*ȑƑȥǑ'(ȑ`L)ɭ)Ѷ*e`M) `ۅH)Ѱ%}ʈh Qܐ'``hi ` p6۽ʹZ5 HȐ/i i `гW8`0( ɐ Ȱ ʮ6E`5 խ ɐ ޢ ȰLȍ۱Ǎ X̰% & !J8` *LĢ `8 iۥƍۥǍ`ۅ %  6 )Ѱ Ѱ` 𝭧e ǐ bǰL*ۈ5ȱ۠ƍȱǍ X̐ H h1  /ݐE`ۈۅ ۅ 8ƭ X̐`LLŠǠ  ݭv̅w̅ ðzv̍ŭw̍ŭƭ ­ōō T̰]ŅƮņ X̠8iȱiiȱi ṰŅǭŅ XLōۭ۩ۅ ȱ8D`F`8eYƍťǍŠ)͠ Wٍۭۅ5ۅƭۅ X̰ ìۈۑ T̰ۅƭۅ X̰ۙ%ۍ" T`K8`)` İ ۱ۈ` ưW/ۈęۈЍ۩@` 8 MƐ  5 Q8`LŅ ۅ ۩ۍۅ Lɰ ʰۅۄÍÍۙ'Ù ۍ*ۨ  Ѝ۹ۙ8v- ðJ ¥ ð, ðLO ʰƥLT`'  mې浰``8 8 nʰ0 ̰+泱Ƴ m° x̰ ̐8` m° x̰8 ۢ8 ˰y ` ¥ nʰ泱Ƴ T̰#泪 Ѳ *Ƴ ` L:Ϡ`泑Ƴ` LaĥH8`JȘ I8`  S`ۈۥۥ۩Íۭۍۭۍ հL¢H8`Jj Ȅ ۍۆeۅiۅ Lɰ ʰWۅۄ ¦J> ɩE` eĐL Ȑ 15WL QL5WW{5 ې'`,55 ې'` ݠ B1 ȩȑ Lɦ8`5  @ R㥶i ` İG8`F`X8``éۅĩ >` T֩xxMH]@ Kۅ5H ɐE$ eİ Ȱ h`h`8`W h8`hR`hLҿ i x +ۅ5ۅ6 ǰ `E8<W`­ `0XLۅ5` ռ``ߤeI`IiţO`Ȯʆ/ )󘑡`()0zq 滅ѺY Ueۅ5Ѻ Ѻ  Qܐ'`i ҩ *C8/y.i/ ȑ  © $ E7<3W`ȽLֽȄ @8`R ) [)_[AͰ")[)_[A:0/.ЩȑΘ8e * ȩ`Loü 7)?۽۩ W٠Յ<ōōř ռV7 uM78 V榠=ü#)@5 ɐ /ݐE ) .) @L `lqhٯ޿=ϓTXIֲ̛̐~ؠIJK,-NOPQ0vt Ѷ"` ɰ Ȑ`E`Ɔ X̐8`>>5Ѷ Qܩ<`>`\ʊJJJJ ۍ۩  ˰Fȱ X̰6 0 Lɠ 0ۑۑ8ȱ`H8` ɹ $  8JJJJ8 ` ۪` H hQ)fʅ F jF jF jF &!  eװ*  ̰F湥 ƹ`Z8`@  ʰ泭ۑƳ ʐ` ʐ` ˰ ƹ Wː`ۘ . . .۪8*Jۦȱ ˦,+* ʈJj =ؠ yiȩ`y4泱ƳHhz ʠiȱizLA`L;ؠ"  `1` Đ7@8V۩ Lɠ۪8ۊ۠X)JJJƄ X Ġȱ۠ ȍ۱۠ ۭ) ۍ ð*)#  O̰``)(`N8` ) xհۈ ̰آ*գ  Ͱ ݢգ LvL{ؠ;i ڥ(8` ְ( ȱ5 HȦ)`Lxץ: ש ְ⥺i ꥻ(8`Lx Lxש u )۠0)p խ.8`)@ ϰ) ϰۈۅƭۅǭۅ5 X̰ *ƭ۬͵̶L  ΐ` Wհ> H۪ȱHۑhƳh sϰq ` ʰiȱi `)5©éՅĩ5 }JJ+`.`8`ɂ )`@ ש ְO ֤FHۑۑh8`P) հ Wհҥ,J+j泭۪ƳۑȊ ) ~ fPL ͊.>.ʱ+,EP!.E.Lw+,,ӄ*- P*e (` հB հ5 Wհ0,J۪泭ۑƳ sϰ(` L Ͱ2 ~ P kҐ#L8 T 2ΠHHȑhhȑ`Ld )N8` xհ*eȱ+eȱ,i۠Ѻ۹ۑ񥤅- ť.Lcԥ.La Ͱ$)rJ Lɰ )# Ԑ) ͰU..++,,IJ/ ӥ-.?Цե,J+jѲ4Ƴǥ4聠 H hH kh8`8-ȥ.L 8*Ʊ )8 0*-`.G.ʱ*+,EP'.E.LұE0+,,ӄ*p-e  )LBѠٳ )8`i (` )N8`*eȱ+eȱ,i۠Ѻ*ȱ+L - ť.Lkҥ. ՅL ͐Ld ~ pа.J/)@߅4N8`) ))УJ8` ۑȭۑǠۑۑȭۑ($S8`O8` "` / 򑺠+* ͐H h8` ΰi `()  *ǵ յý5Ņ4gȩυɩč5 iψ }.8` iϙLIѠ ˢ L΢ ΰ LϠ ˢ ΰ1` Đ@ АP8`B8`ۑJJJJ -ѥ +jѲ84ƳJJ 2ΐ3泑ƳLTΩ潑ƽ`ƱƳ ΰ( {Π۵*+)e`8`)` J J + ΰ" 0 ΰ 🱼ѼL8`ǩ Ϡ` ϰ ƑȥǑ` Ѻе*`)ȥ+8ۍې  ,ѺLTΠ"LΠ5 խ ɐ /ݐE`C8`)@ ϰa)ۥ,8ېu+J,\ ȱLJΠ) ϰ'#,J(] { ΰ ƑȥǑ.8` { ΰ,JѲ ƳL΅ƱƳ ΰҥ,J0`#$"0#`!qȱi 5H5Ƶ ǽ jh5`L2̩ƍv̥Ǎw̩ÎL%ϠƄǥLj̩۬L~̠HHh` ̐`*ѺG0?M`)J"u-- M8`۬` # ː`  = O̰)= I`JJJJѶQi Lˢ  0 ̐ `"L˦ `H8`8$$"$= O̰=`$0`#$"0`$Jۑĥ` İo!)N8`WپX0 ĥLä X0 ĥLà !"#$ Đ2@H AڰCŰrP` 3ڰ(` AڰѶ? İG8`Fە1 ռ İ ЩP߭)@N8`1@8` Aڰ񈱴ۈ)ۅƭۅ X̰ 3ڰLÍLT̥L㼠  ʰ` İK ХP8` LɐH80)N  հ)@LO ˰)0 ̐` M ­۠泭ۑƳѲƱƳ X̰ Rڰä,] Xx,f (I0јIFjFjFji```x@gŽPy+wLwԠ͠ŠԹ.D1 .D2 .D3 .D`HJJJJh)y` (2ϩ 1ޠ== f ɰ`ޭ`5=(5= i Х(`=H hDC5 L3ܵ ɐ /ݐ 8`5 ˥JJJJ8 H h ` ܠ825H h5 ɐ /ݐ 8`Hh ܥ5 `ɥܥܥܥܥ5`܅܅܅܅܅5`( ݰ)Ѻ ݰL ݰ泱Ƴ ʰȭۮ ʰͩΪΩۦ eװqȭqLJ  ˰Aۅƭۅ X̰2%&N  ʰƭ X̐`Ӏ堁ӠҠՈ՘̠ƠŠӠ̠ɤӮȪŅ͠Ϊ ܆5 HȰ4 )ߍ) hjjjjۥ0CF = -$(L !LLL&L L-LJ٥eƦ ,L  # ` (L.L…ҥÅӭƅХDžѥL1LUȑ  i ߩLL )  札)  ҩLL` **éL0;` H ) abRcdTefVghXijSdfhj RR`^0U ` 0 ʠ0 8 `ůàՠԠàࠝӢӠ ȠDž̖͌͊頀ϐωŠŠӠҠȠγ`%!^0 ^)@`a R =` *^)ـooL]^)?i |TU QTU]qUoqTITsUsprRprqs]ToUXa` RL=Xa` R` *R`X`U T  *\AX[ @F\B9ɏ5\o*Ɂo)[[ @^`U V  *C?^0: ݳ ٢ ^)?i` *)@o `p^ XiH 1h `)X0 8~X 1`C X`)X0`C РǠ𠠐ŠŠӠҠȠƠŮƠҢâӠUAQY @?ZY 9ZYY^TU QZoȥɭ }`` ? }``  }`X0i 8~XX0H }h襯` ©Wéĭ }0W`F X0A */5BL. zF`LLz Lz`Y `Ơ堧 B k L( LO  %   }` ` ?!©UéĩU󥣍V }`` ?)) $p10LYeieLVȱ d0L`Hȱ hh` WɸSI I.ȩ8A 8ɸ4ɠ(H)h h8   `    i Ȣ d` $,)?P^ GL㢮 5L}P.)(Ơ L`ޠ LR  稱 I)0JJJJѤ  БĈ` H`)à`֩ нѽ>`]PU]]UPPX0 0 PPXPP  į󠠩ҙ̙ɠΠɊՐӠӢ̢ՠҠŠԠҚРĠ鱃ԠȠࠠLQ  * WHHH>%H H @`)h8`  HШБˆeЅА SYSTEM FAILURE = $hh8`hhhxآY_Z@tPRVT,p S JJJJ ) ʍL@ i0i6`îӉ͠堧ǥӥ``HhHy)(h`H` 0L?i `h` `` `x)( 8 `jjJJԥ)եӬɂ )Ӆ҅`  `H0Xh`Π'à̠ȈL` 8`څ  Lk%  Lk8Lu텚8嚅 L L Ld V ``  h` ک V `ۅץ  VLFx) ( :` H ) L  .P'pб0 &L:L5'8+8`0Fܢ` ř,Ř 0 8f)J DžŠƠŚ̮ÎȠ Ӡ̠Ӡ` LL#L/LL'Lgab `abBcd cdBrcadbho:ab.cݰdDcݰd8abҊ v+abcde0f`   cCȱcD C Ea  UV 1 ELUFVG FUUCVDեYCWZDXWXCUDV[ v`b0WXYZiUcȥVcWX eeYZ ggE` @SATRnpqrstuvwxyz{|}~GA7  3  5  >>< (&20 *, **>> "2*&" " >>  ">> "8""> """"""< SOS DRVR"CUSTOM.3 )((8*,;((*,((+)((9/(p((>3  =9 :9 .(~|L|LNqooGoDDDcc0ccpc]]c"QM"|@@pAATT**|ym, marksym, nonesym, oddsym, offsym, onsym, paritysym, quitsym, recsym, sendsym, setsym, showsym, spacesym); var noun, verb, adj: vocab; status: statustype; vocablist: array[vocab] of string; filename, line: s type statustype = (null, at_eol, unconfirmed, parm_expected, ambiguous, unrec, fn_expected, ch_expected); vocab = (nullsym, allsym, consym, debugsym, escsym, evensym, exitsym, filewarnsym,helpsym, ibmsym, localskmb PARSER   )* i LiHh`PQPQ>P Q,PQ"PɀQ@PAQ`8`nɀ<)nopoLpp` 0h8蘠fȊf` ab 1abo)abaݰb L9c`` a N0Ioa0H ha`pLopna n`  3ɠ/8 L %iLɠ8逨J Hh $`b >_-%^%p_^^_ab"08^c_L8^c_L8^c_L8^c_ȑcc\] ab^_ ``aV R0M bba dda `Q8STRQ ST`c\ȱc]a  b 5DU e\^e]_ ^_ ^_LH8\^]_?Je\^e]_,78\^]_ ^ݰ_ ^_LH^_ $bL@A^_aoQ*@A RQL@A `T8`RLSJTKQHIQiHiIKNJ)M8逅OPOPHMIN'a MHNILHOIPaOHPI8JHFKIGFGaHMINNMʆSTL8HSITQQST>> ""*:<"">""""""""""""">>><2"<""">""" ""  ">"6**"""""&*2""""""""""""*,"" "" ">""""""""""""""**6"""""""> >>>xrL ==L: ,lCL <=L: <,n)LL8 L8 u:L8 ;)ߍ;j`; ;j`uBL8 uCL8 u)u;) u;L8    x) `(,  LuL-upp<`uqq=L: vuL L L #1:CY` 9C<m><=m@=>@?AL8 >m<>@m=@<=L8 <m>?=m@AL8 C9L8 ; ;k`;);k`,@`<,m p<L<`<p<`,ms<L=q=L: ,lXґȥӑ,10 h0  `,g0L  ҅ӥĥŰ+,0p 4 Ls  Ls i )"|tȌs|st HH` MjH,: <J h̰ <rh,oL`%CYgu9 Ln90$0%,7 ҥ L$0T,8OK50P;ҥ,8 L%\   8҅¥Ӆé҅L,5,6  & @jIH,5 p  He҅Ґhe…å逅h,23Lhʩd8,h)ec efeede`,5 H  h 4  `5!    4(P 4 4  `,g0L,10kH0 ԥ f0)ĭ9)9҅xh(ĥŐL i,1HȊ©L,52,9-P" a{) b) )ab)a a,h0& &+%a0 +hcefd(c,@cfabdf`cnx  (,4h`dd,9P"<:J H) +̰ H) +ʭcP h̰BTVSPLH   5"ʘ HH` (# (=  0`)aI88  >!SHOLES 1!1!2@23#3#4$4$5%5%6^67&7&8*8*9(9(0)0)-_-=+=+\|QWERTYUI OP[{]}`~`~ASDFGHJ K L ;:;:'"'"ZXCVBNM ,<,<.>.>/?/?d0hp00000>0# #0~$ <"<"""<< <"""<"><$""< """"  "" 6***""""""""""<""< :< $"""2,"""""**6"""""< >>> <Le Le ,g0L HH`! ( 9EKQWbmz`(" ((è%È`2ȭ3`1`d`c`+È`&È` & IMk`4`5`6`7`8`9`<ȭ=` & @jI`:ȭpȭqé,i0L È`,g HH`LL! l      5  Hdcefh&+si  M0   h) `(" (  (È& 8  `)2ȱÍ3`)1`Ɂ" (cefd`Hc HH` (# ( (Q`,Q$ ()PJK % "]RSiTU Q`% (QLl Xx )(JK `,Q0LpEąĩEŅ|o,i0prH (+@EIR[ty} NQI(C) Apple Computer 1981, 1982, 1983. Built-in Serial Port RS-232 Driver._r.RS232 c "߄P(C) Apple Computer Inc. 1983L     ! ( 0 7 I N S _  . G R Y f {    ! $ 4 9 F I P S V \ a h m p s x |     ' + < ? D G N U f k p x ?BEJMRUX]`h  2;AGMS[fot|              . 3 6 9 < ? B E H N S V \ _ b w  KORY\aelpu !$(+.147<?BFILORUX]`finsw| !%*/369<+;CNU\eh "*-036<BLORX_fj &+38;?DGLTot <?BGLQgjox',/25:BG̑ʈ0 Ցʭr̈A萠L: ֦ڱΑ0Б֤ h L  p,:0 JfiΥiώJe΅Хiю@ B $p̑бʑΈ0 Б̱ΑʈeمΐeمАA萿 :  `ʝ"`t  !#%')L: 8p,:Jf׮@$PA B $P@/A'ʤ˅΄ϥ̤ͅЄ B $̑бʑΈ0Ƞ h L: $)טɀIim>ٮ@8pذ `$0"8,:Jک@ׅפ؈۩MjL,:08*Ȅ B ,:J}΅н(I I $0;P̑бʑΈ,:JՐrx 0, )ߍ:) J)*PR,T,V( : `,k<,: JI`I`<,:J̰`=m@>,:J}ʅ̽(I I `<Mj,:0pJՐ̑ʈ`pJհ0`ՑʭrpȐ`=m@< B h A$g " x) (,`% (gL,}0, `gé ĩ `:) j:;jN;~j;O,:0'???>>8?>p<<AAA@@8A@q==C)CB)B C}0 x) `(`hh% ( ΍ ύ逅Ñ}`` " ( ĩ~Íĩϭ & &υΠÑΈ~ F ~ҰةeÅÐн},,P,`,g$ ( efh) `xÙ+(`xÙ&(`)4`)5`)6`)7`)8`)9`,i0!M:0p ȱq L `" (~)y ~JJ* I `x|x|,,}P-X~ F }~L } `,8fofo7,T0*,V-x ) V)(LU Kh,RSL@pȥȑ`,Q0LmEąĩEŅ Km`l KL 8fol,Q0L HHGH`! (NOo}`\" (x\ Blacksburg, VA 24060 ay that sums it up pretty accurately. Al Bloom openly states in the documentation that he hopes someone might take the initiative to clean it up a bit. But on a more positive note, Kermit protocol for text file transmission to and from a host co A REVIEW OF KERMIT /// By Dan Martin Taken From: TauTales September, 1987 Pgs 12-13 The label on the TAU disk marking the new Public Domain Library Disk #083 says, "Apple /// Kermit...Not a great Kermit". I must s might make to this piece of junk. A real native-mode KERMIT could be a boon to a lot of Apple /// users. Allan M Bloom, PhD CDP Home: 703-951-2025 Institutional Research Office: 703-961-7921 Virginia Tech s a KERMIT command. It's a low priority function. I don't believe the assembler routines are necessary for an Apple ///, nor do I believe that the PARITY stuff is needed. I would appreciate receiving a copy of any upgrade youEXT" to the mainframe file name, and putting it in your prefix directory. That would be a neat thing to fix. You must set your .RS232 driver parameters before entering KERMIT. I'm working on being able to SET RS232 af Kermit uses no known Apple /// features. Its only virtue is that it seems to work in native mode. You cannot RECEIVE a file by any name your heart desires. KERMIT creates a filename from the SEND INIT packet, appending ".T=== ============ MACHLIB.CODE 5 28-Jun-81 MACHLIB.TEXT 29 28-Jun-81 UCKERM2.TEXT 49 16-Mar-85 UCPARS.TEXT 23 16-Mar-85 UCRCVS.TEXT 27 28-Jun-81 UCSNDS.TEXT 31 16-Mar-85 TE CREATED ============ ====== ============ PARSELIB.CODE 9 22-Apr-84 UCAPPL.TEXT 5 22-Apr-84 UCHELP.TEXT 15 11-Sep-81 UCKERM.TEXT 41 16-Mar-85 AND IN SOURCE.2: NAME BLOCKS DATE CREATED ============ === NOTE: THE FILES IN SOURCE.1 AND SOURCE.2 ARE PASCAL TEXT OR CODE FILES AND ARE *NOT* READABLE FROM BASIC. BUT YOU *CAN* READ THEM WITH PASCAL MENU.MAKER, DISK 1054 OR THE PASCAL DEVELOPMENT SYSTEM. THE FILES IN SOURCE.1 ARE: NAME BLOCKS DAmputer is faithfully provided in this disk. Not everyone knows Kermit. It is a rather limited utility protocol in that it only supports ASCII/text file transmissions (in the form offered on this disk...many host computers also support a binary trasic; +Q Quits."r12);::"80C";a$;:+w#9,"DISKNAME.DAT":#9;DISKNAME$:#9|d$=DISKNAME$$=23:=0::"80C";d$;::12)201M=3:=14:"This /// SIG Disk is \^ 19";Р,2)", Washington Apple `, Ltd."=4:B$(1)="":B$(2)=""A$=16,B) THEN 240 #1, d$="":=10:"80C";d$ ž#1300I=0"I=I+1:#1;A$(I):290,#1 6L=I-1@j=1:same=0 J:SEG=0 Tœ2030^CT<1CT=1cCT>13000Zha$="{,|,~,}; selects; to new disk; J/2)=4:=+1:ۙ=44B$(J);:J=J+1I:1,180,22:2,280,21:2,2380,23:8A$(1000),B$(1000),C%(511),C$(20),name$(20):=10:=0UCA=128:LCA=UCA+32CT=15 IF PREFIX$= PREFIX$+MID$(B$(I),VOLUME NAME (/DISKNAME) OR DEVICE NAME (.Dx)"P12);::"80C";a$;:Zb$="CHANGING DISKS"$d=23:=0::"80C";b$;::12).n=12:=20:"MAKE A NEW MENU FOR DISK: ";N$xN$)<2110=N$ :210 I=1L(A$(I),A$))200B$0 WAP /// SIG MENU.MAKER PROGRAM (v. 6.2) =".D1"210: Coldstart (320: Warmstart &*X=11000: TEXT SLOW-DOWN LOOP ,X.1 CHANGE DISK SUBROUTINE23œ202:2200<RFa$=" YOU MAY SELECT YOUR DISK BY you need Kermit protocol, this is the only one you are likely to ever see (NOTE: in native mode) and it could be a lifesaver for you! supporting binary transfers. It's nice to be able to use a mainframe or Vax as a relay node for /// codefiles! Kermit /// is, as the lable states, not the most polished of packages from either a user interface or documentation standpoint. But if on errors. Further, if your mainframe supports Xmodem, you would be far more satisfied with the level of familiarity and support that you'd get out of Communications Manager (from On Three) or XModem /// (WAP PD disk 1065) as well as the option of error-detecting and correcting protocol. However, since this version only supports ASCII file transfers, it is on limited utility unless you need to transfer large reports or such to your mainframe at school or work without having to check for transmissi it ints terminal mode, you can see it struggle to keep you with the 1200 baud rate if you call up a full screen of text. I used it to transfer a large ASCII file to the Vax and back again successfully. Kermit is similar to Xmodem in that it is anr this program. Although it can be set up to run at 1200 baud, the fact that it is implemented in Pascal, using Pascal I/O slows it down considerably. I tested it using a Vax supermini as the host and ran it quite successfully at 1200 baud, thoughnsfer as well.) Kermit is particularly popular on computers such as Vaxes and IBM mainframes. So if you do not use your /// as a terminal for a remote mainframe or supermini that supports Kermit protocol, odds are that you will not find any use fo"BASIC 0":150A$="TEXT 0":150A$="CAT 0":150A$="FONT 0":150A$="FOTO 0":150A$(L),"BLOCKS")510*=27:=19:"FREE MEMORY AVAILABLE: ";=7:=20:"80C";A$(L);$:=5:THPOS=4:I=1:IBOTM=J-1:620Q=:=26:=21:1600 =Q:WW=0A=:A=21A=9&oldprefix$=40A=31410: Control C "aborts" program to Basic(:A=13770: Return Selects a file *DA=27:50: Escape to change disks/FA=324000: back out one directory level 3GA=(80+UCA)A=(80+LoqYLJ,h,VLJj)`X5L8,jL%,TP TcL,UUTdLXXL%lk,W0f,bPZ,[0W[cLZnoln _L" `L" aX ) ` ) `x,V0 %)(`J`l031e-Yx V(Y K`j) )g kkL)` kkLl ),b-cWLldWuoeQ,T0L@TEPd>gZ[M,h,oe$YHV ))ho kk0 qrÈȌk(`RȭS` l  o `ȩ`,Q0L HH`LB<Xf,T U K,U0x])] olXYmnpqVWZ[kj^)  ]] ^ ) (`\" ( Ù\ `ÍRȱÍSa$,1)="/"5060:s=s-1 5030=a$240 MENU.MAKER 6.2 * Thanks to C.M.Davidson for his help!el; G$:::320H: Error Routine 202:U=11:"79C";"BAD PATH ERROR (NO DISK IN DISK DRIVE OR DESIRED FILE NOT FOUND.)"X=11000:X:::210Z a$="{,|,~,}; selects; back 1 lev 1600 &:WW=1:0 :SEG=1;".D1/S EG.F" SEG=1".D1/SEG.G"diskname$=3802  CATCH PASCAL TEXT FILES 202 :F*=08:"78C";"SORRY BUT MENU.MAKER CAN'T READ PASCAL TEXT FILES."04=10:"M$="NOVEMBER":1750M$="DECEMBER":1750826);"-";M$;" ";Ѡ,2));", ";"19";Р,2);" ";/П,2))=>13П,2))-12;џ,6);:1780$П,2))=0"12";џ,6);:ٟ;$П,2))=>12" PM-":" AM-" 1830WW=1530 =26:=211660,1670,1680,1690,1700,1710,1720,1730,1740^M$="JANUARY":1750hM$="FEBRUARY":1750rM$="MARCH":1750|M$="APRIL":1750M$="MAY":1750M$="JUNE":1750M$="JULY":1750M$="AUGUST":1750M$="SEPTEMBER":1750M$="OCTOBER":1750T 0")2070H540R\A$="RUNNING "+B$(I),16,B)f"79C";A$;:=0pB$(I),16,B) z::SEG=1".D1/SEG.T"t=+B$(I),16,B) yCT=CT+1~240:=24:=0:"@ ..... "DATE.TIME.LINE" ....JM=Ҡ,4,2))BTM1630,1640,1650,0=+IBOTM/2-.5):I=IBOTM:I/2=I/2)I=I-1 œ2120B=B$(I),16)," ")-1 B$(I),"BASIC 0")850B$(I),"TEXT 0")890 B$(I),"CAT 0")1140*B$(I),"FONT 0")18504B$(I),"FOTO 0")1930>B$(I),"PASTXB$(I);v:520: 500THPOS=4:I/2=I/2)I=I-1I=IBOTM THPOS=44:I/2<>I/2)I=I+1I2=-1:I=I-2:IBOTM<30THPOS=44I=IBOTM/2)*2:=+IBOTM/2)-1:CA)"PRINT.ALL": OA+P 3HA=(81+UCA)A=(81+LCA):::: OA+Q Quits 3IA=(83+LCA)A=(83+UCA)"PRINT.SHOW": OA+S 2JA=(68+LCA)A=(68+UCA)/Screen.Savers/HELLON=THPOS:B$(I);XA<8A>11540bA-7640,660,690,720l:=THPOS:N{"'*INYox{  %*/:>GIKMUclsy  $.BPV^dhx %(-5QY\adgjmruz  #NS MENU.MAKER TEXT MODULESEG=0"MENU.MAKER"890&*X=11000: TEXT SLOW-DOWN LOOP ,X.1,180,22:2,280,21:2,2380,23:z:A$="LISTING "+B$(I),16,B)$=01:=0::"80C";A$;::12)>=23:=0::"T$=N$,E,1):T$=" "T$=","610XE=E+1:E>N$)610:590bD$=N$,S,E-S)l:v:E>S+1600:D$="": œ770P=3:"Looking for ";34);D$;34);" directory." #1,D$=P3:"Reading from ";34);D$;34);" directory." I>X200300S=1:D=1:B=1570D$=""500 Y=X:S=ED$(D)=D$:640 X=Y440D=D+1:S=E:440D=D-1:X=0F$(X):X=0 J=1D D$=D$(J)790&J0 :œ6303DE=S+1:N$,S,1)=" "N$,S,1)=","S=S+1:580%Nž#2390 ^1000c: h#2;a$ma$rY=1150:Y0wB=B+1: Count the number of lines printed xB=15B=30355yB=60#3;12)zB=60B=1 {#3;a$|360B<=20#3;13)::410#3;12):Z=11000:ZI I=3d: PRINTER V. 1.0 ::=2::"PRINT.ALL v. 1.0":3=4:"Directory Name(s) or return to quit: ";n$N$)=0::"MENU.MAKER"430 X>0260I=11000:I:200: ,I=1X 14000 6#2,F$(I)@#3,".PRINTER" JCINFO : Pascal Miscellaneous Information file for Kermit file SIDE TWO SOURCE.2 : Subdirectory with additional source code listings STARTUP.CODE : Startup file for Kermit - Requires Pascal SYSTEM.MISCINFO : Pascal Miscellaneous Information file for Kermit ile for Kermit uires Pascal SYSTEM.MIS review are included on disk. Requires Pascal to run (not included on this disk). SIDE ONE KERMIT.REVIEW : A review of Kermit /// KERMITDOC : Kermit /// Manual SOURCE.1 : Subdirectory with source code listings READ.ME.FIRST : This WAP /// SIG PUBLIC DOMAIN LIBRARY PDS NAME: KERMIT /// DISK ID#: 3TEL-04 BOOTABLE?: Bootable This is a very basic telecom program using the Kermit file Protocal - a way to upload and download files with error checking. Documention and a79C";"PRESS ANY KEY TO HALT LISTING"::202 1020#2,B$(I),16,B)ž#242:::1160Z=1#2;A$:"78A";A$Z=Z+1:Z>1842:::Z=1980*:=23:=0::"79C";"CONTINUE...?":1C$:C$<>"Y"C$<>"y"C$<>"N"C$<>"n"10C$<>"n"850\C$="N"C$="n"1000;f:=23:=0::"79C";"PRESS ANY KEY TO HALT LISTING": p840z2,280,21K:=23:=0::"79C";"TO PRINT OR RETURN TO MENU, HIT THE SPACE BAR":C$:C$<>" "930:ۺ1000 :=".d1"01:=0::"80C";A$;::12)E=23:=0::"79C";"PRESS ANY KEY TO HALT LISTING"::2,280,21 840#2,B$(I),16,B) ž#2910*#2;A$:A$:12304810 >:120*H:=23:=0::"79C";"CONTINUE...?":0RC$:C$<>"Y"C$<>"y"C$<>"N"IC 0")700B$(I),"TEXT 0")740B$(I),"CAT 0")960B$(I),"FONT 0")1660B$(I),"FOTO 0")1730400A$="RUNNING "+B$(I),16,B)"79C";A$;:=0B$(I),16,B):A$="LISTING "+B$(I),16,B)$=JOY! 2010C$="N"C$="n"200;:=23:=0::"79C";"PRESS ANY KEY TO HALT LISTING": 20002,280,21 DF$(I)=D$+"/DISKNAME.DAT"F$(I)=D$+"/FLASHNAME.DAT"410:ۺ310 PRINTER v 1.0 p$ 900A$="PRINTING"+F$(I):$=01:=0::"80C";A$;::12)F=23:=0::"79C";"PRESS ANY KEY TO HALT PRINTING"::2,280,21 2000*:=23:=0::"79C";"CONTINUE...?":1C$:C$<>"Y"C$<>"y"C$<>"N"C$<>"n"#1,D$::"Processing directory ";34);D$;34);", please wait."; ž#1880*#1;A$:A$)<48104A$,3,4)<>"TEXT"810>X=X+1:".";HE=15:F$=A$,16,15)RF$,E,1)=" "E=E-1:850\F$(X)=D$+"/"+F$,E)f810p:  Pausež#1740#1;A$:A$)<4710A$,3,4)="TEXT"X=X+1710 :X>YN=P::7);"There are no text files in the ";34);D$;34);" directory." ::I=P::7);"Unable to locate and open ";34);D$;34);" directory." ::IEAD PASCAL TEXT FILES."04=10:"78C";"ANY KEY RETURNS TO THE MENU."!>G$:::".D1/MENU.MAKER",320R",220(204::"79A";""; 2D=1:F=1 <#4;a$ FD=D+1 P#5;a$ZD=60#5;12)dD=60D=1nF=F+1::d$;::Y=1100:Y x13402  CATCH PASCAL TEXT FILES 202 :F*=08:"78C";"SORRY BUT MENU.MAKER CAN'T R".D1/MENU.MAKER",220 d$="" A$="PRINTING "+B$(I),16,B)=01:=0::"80C";A$;:#3,B$(I),16,B)Z=1#3;b$:"78A";b$Z=Z+1:Z=18:1290 1260 #4,B$(I),16,B)#5,".PRINTER"+ž#4#5;12):::".D1/MENU.MAKE30C$="N"C$="n"1160;:=23:=0::"79C";"PRESS ANY KEY TO HALT LISTING": $1020.202 8::Z=1B::=23:=0::"79C";"WOULD YOU LIKE A PRINTED COPY?":1C$:C$<>"Y"C$<>"y"C$<>"N"C$<>"n"1170*C$="N"C$="n":=12:=0:120=+B$(I),16,B)1408A$(1000),B$(1000),C%(511),C$(20),name$(20):=10:=0 :120>::=23:=0::"79C";"WOULD YOU LIKE A PRINTED COPY?":1C$:C$<>"Y"C$<>"y"C$<>"N"C$<>"n"1010C$="N"C$="n"120#4,B$(I),16,B)#5,".PRINTER" $ž#4120 .#4;a$ 8#5;a$ B1070LV:=24:=0::#X=1100: TEXT SLOW-DOWN LOOPX810 Halt Subroutine::=23:=0::"79C";"PRESS ANY KEY TO HALT LISTING.": 1300(=23:at includes the .RS232 Driver for the serial port in your ///)(It may have to be reconfigured to work with Kermit (see note below)). You will also need: System.Pascal (From a Pascal disk...see PD disk 1054) From Side To create a "turnkey" boot disk for Kermit /// you'll need the following files: SOS.KERNEL SOS.INTERP (Pascal language) SOS.DRIVER (with the appropriate .RS232 DRIVER) (We have included a SOS.DRIVER file on Side B th KERMIT /// WAP /// SIG NOTE JULY, 1989 NOTE: This program is not for beginners! We have a number of other telecom programs in the PD library you may find very useful, like Disk 1065, XModem ///. JOIN WAP /// SIG MEMBERS ON THE TCS! CALL THE WAP OFFICE FOR DETAILS. KERMIT /// TELECOMMUNICATIONS PROGRAM B$(I),16,B)name$=34)+D$+34) GLOAD.D$16);1) GRAFIXONX=12000:X::RELEASE:#5302l ...... WAP /// SIG MENU.MAKER (VERSION 4.54):=21:1400 T1400 ^:WW=1:h |: CHANGE THE FONT".D1/download.inv"C$=B$(I),16,B)array$="C%"name$=34)+C$+34)getfont(@name$,@array$)loadfont(@array$)J=1:SAME=0:215#5,".GRAFIX"".D1/BGRAF.INV"D$=50M$="NOVEMBER":1550M$="DECEMBER":1550826);"-";M$;" ";Ѡ,2));", ";"19";Р,2);" ";/П,2))=>13П,2))-12;џ,6);:1580$"П,2))=0"12";џ,6);:ٟ;$,П,2))=>12" PM-":" AM-" 61630@WW=1390J=26,1450,1460,1470,1480,1490,1500,1510,1520,1530,1540M$="JANUARY":1550M$="FEBRUARY":1550M$="MARCH":1550M$="APRIL":1550M$="MAY":1550M$="JUNE":1550M$="JULY":1550M$="AUGUST":1550M$="SEPTEMBER":1550M$="OCTOBER":15=0::"79C";"CONTINUE...?":'(<>89<>121<>78<>11013202=78=11010<9F=23:=0::"79C";"PRESS ANY KEY TO HALT LISTING":P2,280,2 Z1310dn"x ..... "DATE.TIME.LINE" ....M=Ҡ,4,2))BM1430,1440B of this disk: Startup.Code (renamed System.Startup - use System Utilities) System.Miscinfo OR...you can use Pascal Menu.Maker to launch this program if you like. Simply boot Pascal Menu.Maker, hit and "V", making sure Side B is in .D2. Now select .d2. Highlight "Startup.Code" and hit . REMEMBER, you'll have to make sure the SOS.Driver file loaded has the appropriate .RS232 Driver for your system.) ===================================TP: INTEGER MAXCHAR: INTEGER DATA: PACKED ARRAY [0..RCVQSIZE] OF CHAR END VAR RCVQ: QUEUE (* must be declared in outermost block *) The routines RCVINIT and KBDINIT must KBDHANDLR and RCVHANDLR CONST RCVQSIZE = TYPE QUEUE = RECORD (* These are order-dependent !!! *) QSIZE: INTEGER INP: INTEGER OU Output file? KERMIT.CODE The order in which the library files are typed in makes a difference (for some unknown reason), as does the '.CODE' extension on the output file name. The following declarations are needed foren compile KERMIT then finally enter the following linker sequence: Host file? KERMIT Lib file? PARSELIB Lib file? SENDB Lib file? RCVHANDLR Lib file? KBDHANDLR Lib file? Map name? board, and SENDB contains the routine for sending a continuous break to an IBM mainframe. To build KERMIT, first assemble PARSER, RCVHANDLR, KBDHANDLR & SENDB. PARSER must then be linked into a library called PARSELIB. Th keyboard receiving. The file RCVHANDLR.TEXT contains all the routines for handling the characters received from the host, KBDHANDLR.TEXT contains all the routines for handling characters received from the keyhe functions of the routines, as well as information needed for linking. The command parser is a separate compilation unit, which has the filename PARSER. KERMIT uses assembly routines for host computer andCSD psystem. Due to the limitations of UCSD Pascal, there are several routines which must be written in assembly language. This version was implemented on a Terak 8510A, which is a PDP 11/2. Detailed below are tons for building UCSD Pascal Kermit for the Terak, and hints on adapting it to other machines. [End of USCD.HLP, Oct 1983] [Begin Original UCSD Documentation] KERMIT UCSD is a version of KERMIT which runs under the U SENDSW.TEXT UCSNDS.PAS The .PAS files are Pascal source files (which should be mostly system independent), the .MAC files are MACRO-11 source files for the Terak, and the .HLP file contains user documentation, instructiP.PAS KBDHANDLR.TEXT UCKBDH.MAC KERMIT.TEXT UCKERM.PAS KERMITHLP.TEXT UCKERM.HLP PARSER.TEXT UCPARS.PAS RCVHANDLR.TEXT UCRCVH.MAC RECSW.TEXT UCRCVS.PAS SENDB.TEXT UCSNDB.MAC d to fit within the filename restrictions of some systems we ship KERMIT to). The files have been renamed as follows: UCSD Name KERMIT Distribution Name -------------- ------------------------ HELP.TEXT UCHEL several modules, some system independent, some system dependent. These modules have been renamed to fit the naming conventions of the KERMIT distribution area (to allow related files to grouped together alphabetically, an=========================================== UCSD Pascal KERMIT from Cornell University This implementation of KERMIT was done by Kate MacGregor of Cornell Computing Services for the Terak p-System. It is broken up into be called at the beginning of the program in order to set up interrupt vectors and handlers. They are declared as PROCEDURE RCVINIT (VAR Q: QUEUE; SIZE:INTEGER) EXTERNAL PROCEDURE KBDINIT (VAR Q: QUEUE; SIZE:INTEGER) EXTERNAL and should be called appropriately. RCVINIT takes care of setting other system interrupt priorities so that keyboard and remote input override them. KBDINIT only deals with the keyboard interupts, since othershe remote host. The default is CTRL-] c. FILE-WARNING ON/OFF, default is OFF. If ON, Kermit will rename an incoming file so as not to write over a file that currently exists with the same name. d of packets to something other than the default of CR. It must be a digit between 0 and 31. ESCAPE To change the escape sequence that lets you return to the PC Kermit from teter. SET To establish system-dependent parameters. The SET options are as follows: DEBUG To set debug mode ON or OFF (default is OFF). END-OF-LINE To change the character used at the en case the help will refer only to that command. RECEIVE To accept a file from the remote system. SEND To send a file or group of files to the remote system. Takes a filename as a paramghtbracket followed immediately by the letter C.) EXIT To return to main psystem command level. HELP To get a list of KERMIT commands. HELP can be followed by any command, in whichNNECT To make a "virtual terminal" connection to a remote system. To break the connection and "escape" back to the micro, type the escape sequence (CTRL-] C, that is Control ristead of using a clock to time out when waiting for a packet, KERMIT-UCSD has a limit on the number of times it will look for a response before giving up. The commands recognized by KERMIT-UCSD are listed below. CO 4) No '?' and at the end of a command line. 5) No server communications. 6) Sending and receiving cannot be done for anything but .TEXT files (which contain a two-block header and space compression codes). 7) Int handlers, the program should be easily movable to any UCSD psystem. KERMIT-UCSD has the following limitations: 1) No wild card designations of file names. 2) No eight-bit file quoting. 3) No character repeat counts. te input interrupt handlers, and one more which sends a continuous break signal. The program was developed on a TERAK 8510A microcomputer, which is a PDP-11/2. With the rewriting of the above five routines, plus two interrupak and should be declared as PROCEDURE SENDBRK; EXTERNAL; KERMIT-UCSD is a version of KERMIT written primarily in UCSD Pascal Version II.0. There are four assembly language routines which manage special keyboard and remo and keep track of the maximum number of characters in the queues in the MAXCHAR variables. Queue overflow is indicated by MAXCHAR > QSIZE. To send a break the routine SENDBRK is used, which sends a continuous breNIT; EXTERNAL; PROCEDURE KBDFINIT; EXTERNAL; and are called with no parameters. The queue handlers run continuously as interrupt-driven tasks at high priority. As characters come in, they advance the queue INP pointer will be taken care of by RCVINIT. The routines RCVFINIT and KBDFINIT should be Mcalled at the end of the program in order to restore interrupt vectors, handlers and priorities. They are declared as PROCEDURE RCVFI IBM ON/OFF, default is OFF. This flag should be ON only when transfering files between the PC and an IBM VM/CMS system. It also causes the parity to be set appropriately and activates local echoing. LOCAL-ECHO ON/OFF, default is OFF. This sets the duplex. It should be ON when using the IBM and OFF for the DEC-20. PARITY EVEN, ODD, MARK, SPACE, or NONE. NONE is the (* Apple /// appendages to UCSD KERMIT *) procedure rcvinit(var q : queue; size : integer); external; procedure rcvfinit; external; procedure kbdinit(var q : queue; size : integer); external; procedure kbdfinit ; external; proceduO^dSOURCE.1vҲ+'  '-PARSELIB.CODEl Ҳ7+UCAPPL.TEXTҲ,+UCHELP.TEXTҲ,++UCKERM.TEXT)PҲ-p' $NOTEҲ#Ҳ# the value of only that parameter. This version of KERMIT does not have a SET BAUD command because the baud rate is set by hardware on the TERAK. [Begin AMB Comments -- 04/07/86 This Apple /// version o requirements of SHOW To see the values of parameters that can be modified via the SET command. SHOW ALL shows all parameters; SHOW followed by a parameter listed under SET will show default but if the IBM flag is set, parity is set to MARK. This flag selects the parity for outgoing and incoming characters during CONNECT and file transfer to match the re sendbrk; external; procedure fetch(var q: queue); external; begin writeln(' QUIT Same as EXIT.'); writeln; end; (* if *) if (noun = nullsym) or (noun = recsym) then begin writeln(' RECEIVE To accept a file from the remote system.'); writeln; end; (* if *) end; (* help1 *) procedure help2; return back to main command level of the p-system.'); writeln; end; (* if *) if (noun = nullsym) or (noun = helpsym) then begin writeln(' HELP To get a list of KERMIT commands.'); writeln; end; (* if *) if (noun = nullsym) or (noun = quitsym) thenwriteln(' type the escape sequence (CTRL-] C, that is Control '); writeln(' rightbracket followed immediately by the letter C.)'); writeln; end; (* if *) if (noun = nullsym) or (noun = exitsym) then begin writeln(' EXIT To To make a "virutual terminal" connection to a remote'); writeln(' system.'); writeln; write(' To break the connection and "escape" back to the micro,'); writeln; d to make the '); writeln('microcomputer behave as a terminal for a mainframe. These are the '); writeln('commands for theUCSD p-system version, KERMIT-UCSD:'); writeln end; (* if *) if (noun = nullsym) or (noun = consym) then begin writeln(' CONNECT d; (* keypress *) procedure help1; var ch: char; begin if (noun = nullsym) then begin writeln('KERMIT is a family of programs that do reliable file transfer'); write('between computers over TTY lines. KERMIT can also be '); writeln('usesegment procedure help; procedure keypress; const clearscreen = 28; var ch: char; begin writeln('---------------Press any key to continue---------------'); repeat until readch(kq,ch); writeln(chr(clearscreen)) enO^䩹var ch: char; begin if (noun = nullsym) or (noun = sendsym) then begin writeln(' SEND To send a file or group of files to the remote system.'); writeln; end; (* if *) if (noun = nullsym) then keypress; if (noun = nullsym) or (noun = setsym) then begin writeln(' SET To establish system-dependent parameters. The '); writeln(' SET options are as follows: '); writeln; if (adj = nullsym) or (adj = debugsym) then begin writeln(' elp4 *) begin help1; help2; help3; help4 end; (* help *) writeln(' SHOW To see the values of parameters that can be modified'); writeln(' via the SET command. Options are the same as for SET,'); writeln(' except that a SHOW ALL command has been added.'); end; (* if *) end; (* h CONNECT and file transfer to match the'); writeln; writeln(' requirements of the host.'); writeln; end; (* if *) end; (* if *) if (noun = nullsym) or (noun = showsym) then begin flag is set, parity is set to MARK. '); writeln(' This flag selects the parity for '); write(' outgoing and incoming characters during'); writeln; write(' etsym) or (noun = nullsym) then begin if (adj = nullsym) or (adj = paritysym) then begin writeln(' PARITY EVEN, ODD, MARK, SPACE, or NONE.'); writeln(' NONE is the default but if the IBM '); writeln(' writeln(' duplex. It should be ON when using '); writeln(' the IBM and OFF for the DEC-20.'); writeln; end; (* if *) end; (* if *) end; (* help3 *) procedure help4; begin if (noun = srk) and activates'); writeln(' local echoing'); writeln; end; (* if *) if (adj = nullsym) or (adj = localsym) then begin write(' LOCAL-ECHO ON/OFF, default is OFF. This sets the'); writeln; transfering files'); writeln(' between the micro and an IBM VM/CMS'); writeln(' system. It also causes the parity to'); write(' be set appropriately '); writeln('(maegin if (noun = nullsym) or (noun = setsym) then begin if (adj = nullsym) or (adj = ibmsym) then begin writeln(' IBM ON/OFF, default is OFF. This flag '); write(' should be ON only when '); writeln('writeln(' a file that currently exists with the'); writeln(' same name'); writeln; end; (* if *) if (adj = nullsym) then keypress; end; (* if *) end; (* help2 *) procedure help3; b begin writeln(' FILE-WARNING ON/OFF, default is OFF. If ON, '); writeln(' Kermit will warn you and rename an '); writeln(' incoming file so as not to write over'); that '); writeln(' lets you return to the PC Kermit from'); write(' the remote host.'); writeln(' The default is CTRL-] c.'); writeln; end; (* if *) if (adj = nullsym) or (adj = filewarnsym) then DEBUG To set debug mode ON or OFF '); writeln(' (default is OFF).'); writeln; end; (* if *) if (adj = nullsym) or (adj = escsym) then begin writeln(' ESCAPE To change the escape sequence O^H retry_line = 4; file_line = 5; error_line = 6; debug_line = 7; prompt_line = 8; (* position on line to put info *) statuspos = 70; packet_pos = 19; retry_pos = 17; file_pos = 11; type queue = reback_space = 8; (* pascal backspace sym *) erase_eol = 31; (* erase to end of line *) % (* screen control information *) (* console line on which to put specified info *) title_line = 1; statusline = 2; packet_line = 3; mintim = 2; (* minimum time out interval *) at_eof = -1; (* value to return if at eof *) rqsize = 5000; (* input queue size *) qsize1 = 5001; (* qsize + 1 *) eoln_sym = 13; (* pascal eoln sym *) ) my_pchar = 0; (* padding character I need *) my_eol = 13; (* end of line character i need *) my_time = 5; (* seconds after which I should be timed out *) maxtim = 20; (* maximum timeout interval *) my_esc = 29; (* default esc char for connect (^]) *) maxtry = 5; (* number of times to retry sending packet *) my_quote = '#'; (* quote character I'll use *) my_pad = 0; (* number of padding chars I need * (* ASCII line feed *) ht = 09; (* ASCII horiz. tab *) &vt = 11; (* ASCII vert. tab *) &dle = 16; (* ASCII DLE (space compression prefix for psystem) *) del = 127; (* delete *) bell = 7; (* ASCII bell *) maxpack = 93; (* maximum packet size minus 1 *) soh = 1; (* start of header *) sp = 32; (* ASCII space *) cr = 13; (* ASCII CR *) lf = 10; } (*$L+*) (*$U kermitstuff/PARSELIB.CODE*) USES PARSER; const blksize = 512; oport = 8; (* output port # *) clearscreen = 28; (* charcter which erases screen *) program kermit; { Modified 03-16-85 AMB: Allow receipt of long strings } { } { Try to use RS232 driver } { cord (* input queue *) qsize: integer; refer : 0..255; inp: integer; outp: integer; maxchar: integer; 1data: packed array[0..rqsize] of char; end; (* queue *) packettype = packed array[0..maxpack] of char; parity_type = (evenpar, oddpar, markpar, spacepar, nopar); char_int_rec = record (* allows character to be treated as integer... *) (* is system dependent *) if (i > 0) then (* if not at beginning of line *) begin write(ch); (* go back a space on screen *) write(' '); (* erase char on screen *) '',0,0); repeat repeat (* get a character *) until read_ch(q,ch); if (ord(ch) = backspace) then (* if it's a backspace then *) begin LP.TEXT*) (*$I kermitstuff/UCSNDS.TEXT*) (*$I kermitstuff/UCRCVS.TEXT*) procedure read_str(*var q: queue; var s: string*); (* acts like readln(s) but takes input from input queue *) var i: integer; begin i := 0; s := copy(an; forward; function rpack(var len, num: integer; var data: packettype): char; forward; procedure read_str(var q: queue; var s: string); forward; procedure show_parms; forward; (*$I kermitstuff/ucappl.text*)  (*$I kermitstuff/UCHEprocedure rpar(var packet: packettype); forward; procedure spack(ptype: char; num:integer; len: integer; data: packettype); forward; function getch(var r: char_int_rec; var q: queue): boolean; forward; function getsoh(var q: queue): boole; forward; procedure bufemp(buffer: packettype; var f: text; len: integer); forward; function bufill(var buffer: packettype): integer; forward; procedure spar(var packet: packettype); forward; ger); forward; function min(x,y: integer): integer; forward; function tochar(ch: char): char; forward; function unchar(ch: char): char; forward; function ctl(ch: char): char; forward; function getfil(filename: string): booleanward; procedure io_error(i: integer); forward; procedure debugwrite(s: string); forward; procedure debugint(s: string; i: integer); forward; procedure writescreen(s: string); forward; procedure refresh_screen(numtry, num: inteprocedure clear_buf(var q: queue); forward; function aand(x,y: integer): integer; forward; function aor(x,y: integer): integer; forward; function xor(x,y: integer): integer; forward; procedure error(p: packettype; len: integer); for parity_array: packed array[char] of char; ctlset: set of char; rec_ok, send_ok: boolean; $erase: 0..255; $lastn: 0..63; $iofile: interactive; {03-16-85} function read_ch(var q: queue; var ch: char): boolean; forward; , pad, n, num_try, oldtry, timint: integer; recpkt, packet: packettype; padchar, ch: char; debf: text; (* file for debug output *) parity: parity_type; xon: char; filebuf: packed array[1..1024] of char; bufpos, bufend: integer; r kq, rq: queue; state: char; (* current state *) f: file of char; (* file to be received *) oldf: file; (* file to be sent *) s: string; eol, quote, esc_char: char; fwarn, ibm, half_duplex, debug: boolean; i, size, rpsiz, spsiz (* used for numeric AND,OR,XOR...system dependent *) case boolean of true: (i: integer); false: (b: boolean) end; (* record *) va case boolean of true: (i: integer); false: (ch: char) end; (* record *) int_bool_rec = record (* allows integer to be treated as boolean... *) write(ch); (* go back a space again *) i := i - 1; (* adjust string counter *) s := copy(s,1,i) (* adjust string *) end (* if *) end (* if *) else if (ord(ch) <> eoln_sym) then (* otherwise if not at eoln then *) begin write(ch); (* echo char on screen *) i := i + 1; (* inc string counter *) s := concat(s,' '); procedure debugint(*s: string; i: integer*); (* write a debugging message and an integer *) begin if debug then begin debugwrite(s); write(i) end (* if debug *) end; (* debugint *) procedure writen gotoxy(0,debugline); unitwrite(1,erase,1,,12); (* erase to end of line *) write(s); for i := 1 to 2000 do ; (* write debugging message *) end (* if debug *) end; (* debugwrite *) r'); 15: writeln('Ring buffer overflow') end; (* case *) gotoxy(0,promptline) end; (* io_error *) procedure debugwrite(*s: string*); (* writes a debugging message *) var i: integer; begin if debug then begisuch file on volume'); 11: writeln('Duplicate file'); 12: writeln('Not closed, attempt to open an open file'); 13: writeln('Not open, attempt to close a closed file'); 14: writeln('Bad format, error in reading real or intege 6: writeln('Lost file, File is no longer in directory'); 7: writeln('Bad Title, Illegal file name'); 8: writeln('No room, insufficient space'); 9: writeln('No unit, No such volume on line'); 10: writeln('No file, No teln('Bad Block, Parity error (CRC)'); 2: writeln('Bad Unit Number'); 3: writeln('Bad Mode, Illegal operation'); 4: writeln('Undefined hardware error'); 5: writeln('Lost unit, Unit is no longer on-line'); p[i]); gotoxy(0,promptline); end; (* error *) procedure io_error(*i: integer*); begin gotoxy(0,errorline); unitwrite(1,erase,1,,12); (* erase to end of line *) case i of 0: writeln('No error'); 1: wri (* return integer result *) end; (* xor *) procedure error(*p: packettype; len: integer*); (* writes error message sent by remote host *) var i: integer; begin gotoxy(0,errorline); for i := 0 to len-1 do write( xrec.i := x; (* put two numbers in variant record *) yrec.i := y; (* use as booleans to 'xor' them *) temp.b := (xrec.b or yrec.b) and (not(xrec.b and yrec.b)); xor := temp.i yrec.b; (* use as booleans to 'or' them *) aor := temp.i (* return integer result *) end; (* aor *) function xor(*x,y: integer): integer*); (* exclisive or *) var xrec, yrec, temp: int_bool_rec; begin ; (* aand *) function aor(*x,y: integer): integer*); (* arithmetic or *) var xrec, yrec, temp: int_bool_rec; begin xrec.i := x; (* put two numbers in variant record *) yrec.i := y; temp.b := xrec.b or bool_rec; begin xrec.i := x; (* put the two numbers in variant record *) yrec.i := y; temp.b := xrec.b and yrec.b; (* use as booleans to 'and' them *) aand := temp.i (* return integer result *) end writeln (* write a line on the screen *) end; (* read_str *) function aand(*x,y: integer): integer*); (* arithmetic and--takes 2 integers and ands them, yeilding an integer *) var xrec, yrec, temp: int_ s[i] := ch; (* put char in string *) end; (* if *) until (ord(ch) = eoln_sym); (* if not eoln, get another char *) s := copy(s,1,i); (* correct string length *) screen(*s: string*); (* sets up the screen for receiving or sending files *) begin write(chr(clearscreen)); gotoxy(0,titleline); write(' Kermit UCSD p-system'); gotoxy(statuspos,statusline); write(s); gotoxy(0,packetline); write('Number of Packets: '); gotoxy(0,retryline); write('Number of Tries: '); gotoxy(0,fileline); write('File Name: '); end; (* writescreen *) procedure refresh_screen(*numtry, num: integer*); (*$I+*) (* turn i/o checking back on *) else (* else, is a regular char, so *) begin r.i := aand(r.i,127); (* mask off parity bit *) s := concat(s,' '); (* then (* if io_error *) begin io_error(ioresult); (* tell them and *) state := 'a'; (* abort *) end (* if *) end ) (*$I-*) (* turn i/o checking off *) writeln(f,s); (* and write out line to file *) s := copy('',0,0); (* empty the string var *) ls := 0; if (io_result <> 0)quote)) then r.ch := ctl(r.ch); (* controllify it *) end; (* if *) if (r.i = cr) then (* else if a carriage return then *) begin i := i + 3; (* skip over that and line feed * if (r.ch = myquote) then (* if character is control quote *) begin i := i + 1; (* skip over quote and *) r.ch := buffer[i]; (* get quoted character *) if (aand(r.i,127) <> ord(my {03-16-85} begin s := copy('',0,0); ls := 0; i := 0; while i < len do begin r.ch := buffer[i]; (* get a character *) checking on *) getfil := (ioresult = 0) end; (* getfil *) procedure bufemp(*buffer: packettype; var f: text; len: integer*); (* empties a packet into a file *) var i,ls: integer; r: char_int_rec; s: string [255]; fer *) begin q.outp := q.inp end; (* clear_buf *) function getfil(*filename: string): boolean*); (* opens a file for writing *) begin (*$I-*) (* turn i/o checking off *) rewrite(f,filename); (*$I-*) (* turn i/o+bell : unitwrite(1,ch,1,,12); +ht : unitwrite(1,ch,1,,12); +vt : unitwrite(1,ch,1,,12); +end; (end; %ch := chr(curon); %unitwrite(1,ch,1,,12); ( "end; (* echo *) procedure clear_buf(*var q: queue*); (* empties the buffer input buf begin ch := chr(aand(ord(ch),127)); (* mask off parity bit *) if ch >= chr(sp) then unitwrite(1,ch,1,,12) else (begin +c := ord (ch); ( case c of +cr : unitwrite(1,ch,1,,12); ( lf : unitwrite(1,ch,1,,12); (* ctl toggles control bit: ^A becomes A, A becomes ^A *) begin ctl := chr(xor(ord(ch),64)) end; (* ctl *) procedure echo(ch: char); const curon = 15;  var c : integer; (* echos a character on the screen *) begin tochar := chr(ord(ch) + ord(' ')) end; (* tochar *) function unchar(*ch: char): char*); (* unchar undoes tochar *) begin unchar := chr(ord(ch) - ord(' ')) end; (* unchar *) function ctl(*ch: char): char*);(* returns smaller of two integers *) begin if x < y then min := x else min := y end; (* min *) function tochar(*ch: char): char*); (* tochar converts a control character to a printable one by adding space *) (* keeps track of packet count on screen *) begin gotoxy(retrypos,retryline); write(numtry: 5); gotoxy(packetpos,packetline); write(num: 5) end; (* refresh_screen *) function min(*x,y: integer): integer*); and add character to out string *) ls := ls + 1; s[ls] := r.ch; i := i + 1 (* increase buffer pointer *) end; (* else *) end; (* while *) (* and get another char *) (*$I-*) (* turn i/o checking off *) write(f,s); (* and write out line to file *) if (io_result <> 0) then (* if io_error *) begin io_error(ioresult); (* tell them and *) state if (i = 0) then (* if we're at end of file, *) bufill := (at_eof) (* indicate it *) else (* else *) begin if (j <= count) then (* i bufpos := bufend + 1 (* since rest will be NULs *) else bufpos := blksize + 1; j := j + 1 end; (* while *) end; (* while *) NUL *) begin buffer[i] := r.ch; i := i + 1; end (* if *) else (* is a NUL so *) if (bufpos > blksize) then (* skip to end of block *) end; (* if *) end; (* if *) j := 1; while (j <= count) and (i <= spsiz - 5) do begin (* put all the chars in buffer *) if (r.i <> 0) then (* so long as not a buffer[i] := quote; (* put the quote in buffer *) i := i + 1; if r.ch <> quote then r.ch := ctl(r.ch); (* and un-controllify char *) end (* if *) r.i := lf; (* and we'll stick a LF after *) end; (* if *) if r.i <> 0 then (* if not a NUL then *) begin then (* if a carriage return *) begin buffer[i] := quote; (* put (quoted) CR in buffer *) i := i + 1; buffer[i] := ctl(chr(cr)); i := i + 1; else (* otherwise, it's just a char *) count := 1; (* so only 1 copy of it *) if (r.ch in ctlset) then (* if a control char *) begin if (r.i = cr) count := ord(unchar(filebuf[bufpos])); (* get # of spaces *) bufpos := bufpos + 1; (* read past # *) r.ch := ' '; (* and make current char a space *) end (* else if *) a character *) bufpos := bufpos + 1; (* increase buffer pointer *) if (r.i = dle) then (* if it's space compression char, *) begin filebuf[1],2) * blksize; (* and adjust buffer pointer *) bufpos := 1 end; (* if *) if (bufpos <= bufend) then (* if we're within buffer bounds *) begin r.ch := filebuf[bufpos]; (* getnd) or (not eof(oldf))) and (i < spsiz-9) do begin (* if we need more data from disk then *) if (bufpos > bufend) and (not eof(oldf)) then begin (* read a couple of blocks *) bufend := blockread(oldf,(* fill a packet with data from a file...manages a 2 block buffer *) var i, j, k, t7, count: integer; r: char_int_rec; begin i := 0; (* while file has some data & packet has some room we'll keep going *) while ((bufpos <= bufe:= 'a'; (* abort *) end (* if *) (*$I+*) (* turn i/o checking back on *) end; (* bufemp *) function bufill(*var buffer: packettype): integer*); f didn't all fit in packet *) begin bufpos := bufpos - 2; (* put buf pointer at DLE *) (* and update compress count *) filebuf[bufpos + 1] := tochar(chr(count-j+1)); end; (* if *) bufill := i (* return # of chars in packet *) end; (* else *) end; (* bufill *) " "(*$I kermitstuff/UCKERM2.text*) tring; newescchar: char; expected: set of vocab; procedure uppercase(var s: string); function parse: statustype; procedure initvocab; IMPLEMENTATION E vensym, exitsym, filewarnsym,helpsym, ibmsym, locals @VOCABLISy,>Pj|!6HYk IBWARNINGP)צHELPP )צIBMP ) LOCAL-ECHOתP )MARKתP )NONEתP )ODDתP)צOFFP)ONתPPARSER 0BADJ `FILENAMEEXPECTED Q$LINE 'QVj NEWESCCHNOUN 2PVERB CTP)DEBUGתP)צESCAPEP)צEVENP)צEXITP)צ FILE-WARNINGP)צHELPP )צIBMP ) LOCAL-ECHOתP )MARKתP )NONEתP )ODDתP)צOFFP)ONתP)PARITYתP)QUITתP)RECEIVEתP)צSENDP)צSETP)SHOWתP)SPACEתPJv\ h:ˡ * )ALLתP)צCONNECTP)DEBUGתP)צESCAPEP)צEVENP)צEXITP)צ FILE-WARNINGP)צHELPP )צIBMP ) LOCAL-ECHOתP )MARKתP )NONEתP )ODDתP)צOFFP)ONתP á ˄>D á˄W#MHC>94/(* *@G?< h:ˡ * )ALLתP)צCONNE˄G=83.)$ (/@@ 8 á ˄@ á ˄ á ˄ܹ>D á `˄W#MH C>94/(*- ,C;852 á  áPtɡˡ R&á./0)ۥ 00ۚ)ɡ/á/0/0š. 0á..tZ ȡ.ٛ ٛٛaA6 Fٓ* áP1V @ئ Pۓ7ڛ á#PƀƀǠPڕPVVym, marksym, nonesym, oddsym, offsym, onsym, paritysym, quitsym, recsym, sendsym, setsym, showsym, spacesym); var noun, verb, adj: vocab; status: statustype; vocablist: array[vocab] of string; filename, line: s