IMD 1.15: 1/01/1998 1:07:16 fog hak 021         -FOG/HAK021/HAK#021CRC&/HAK#021DOCINFO MENURBBS NEWCOM NEWS OZCHAT34ASM( !"#$%PWDS RBSUTIL COM< RBSUTL35ASC\TWIT USERS This is the INFO file and it is printed NOW INFO MENURBBS NEWCOM NEWS    Functions supported: Bulletin File Chat with SYSOP Enter Message * GO 'Leave the system' Read Message Scan message base Kill Message Users file (Members) <T> Toggle BELL List callers * Welcome Message

Password Change Junk File * X'pert User * Special function requirements Verified users only Repeated Ctrl-K's abort, Ctrl-S pauses Messages are Private unless addressed to ALL For Sequential retrieval (not scanning), use '+' after message #. For example, R;10+ reads message #10 and all that follow, a Ctrl K can be used to 'SKIP' to the next message in this mode.   This is the NEWCOM file, and it is printed NOW INFO MENURBBS NEWCOM NEWS   This is the NEWS file an area you can call up from inside RBBS to list NEWS to the caller.INFO MENURBBS NEWCOM NEWS   "CPM","SUPERSYSOP","DDT","What is the DRI Debugger ","B:","*",30000,15INFO MENURBBS NEWCOM NEWS `!"9?!=:=+H9>!"7>!=:=\H~\H~H SI> SI>SI*9?;?=+I;?=ìH:=E:=H>ͺI*7>9>=+I9>=ìH|}6Iƀ)`iÊI> SI> SI> SI:=E:=|J =ŠI!9>>!=ÊI:=E:=G*7>|=̯I#"7>8>w:=  ==+J!=J!>'J_!= NJ LJ SI~UJfJ7ȷ!JC@@J> G!JCGDISK FULL!ͦ7a6!!ͼ86!\.,!.$2!!c0!!ͼ8Dͥ=͒=M!a6!eN!͍N!%I|+!C7͡9"*|š!Q͡9"*|$2!!c0$2!c0$2!!c0!ͥIͥ=!1+!.$2!c0d!ͥI$2!!c0$2!!c0$2!!J:>gK@Kw#2{=.ʒK!ڒKw#kK2{=.ʙK!ҀKÙK6 #’K:{=.ʦK`"w#¦KpJJK2J2J:J=KJJ L!J"J>2J*J~L7 Lc0$2!!c0ͥ=!a6͒=M!͗9|- )E !ͦ7a6N !a6!ͥM$2!!c0ͥ=$2!?0!eN!͍N`iͨ/!/PY*N!͸9J5"$2*60!u?0!!c0$2!`?0*N$2!͸9!VJ8c0$2!J?0*N!͸9J5"$2*#28c#"JɅo$ɧGw#LG~#3L#%L++G~#GL##7L+++L~#fo{z|/g}/o## dLZM a{ >!LL~#fo><ڏL0E"}_|W=€L)T]))ɯ!xGyOLLͦ72a6T!>72a6"!m͝8!(͸954!|g}o|ʾ* 28!2C7!?t7! 8C7! 8C7-7* #" $2-!?t7c0-!(7$2-!t7c0*0N*7|͒=?!ͼ1!9c0!(͸9X0ͥ=!\.,!.!͗9|&)5$2!c0!!ͼ8I!a6!eN!C7!͍N!J|ڕʕ$2!?0!C7?0!c0!ͥIͥ=!ͥI!" !u\.,!"."bkͦ7"a6"!qͼ8"!ma6"!mͼ8)!K\.,!%.%!!ͼ8 4!3!q*+#"+*7|/g}/o|'*0#"0*+N*7|L͒=?!ͼ1!9c0m-!(7*0N$2-!?t7c0*5#"5*5|ځ) !(͸9J5"<!*+#"+*7|/g}/o|ʲ*0#"0*+N*7|͒=?!ͼ1!9c0-!(7*0N$2-!?t7c0*5#"5*%!Ga6!%͸9J5" * |)$2!6c0ͥ=$2!c0!eN !͍N!ͨ/(!/!"+!eN !͍N!ͨ/-!/!"0$2!c0*+N!%I|!(͸9͏4*+"+$2!c0À"!m͝8!(͸954!|g}o|(!.%9| (!.%9(!ͦ75*<z|}|Җ*+#"+*7|/g}/o|0*0#"0ý!ͥI!eN!͍N!ͥI!`MG!L!GL$2!c0!eN~!͍N!ͥI!~`M!eN!͍N`iͨ/>! /A!/!eN~!͍N`iͨ/-!/!N>!AC7-7!N"!m  ͼ8* +28A7!N!ͥI!"͒=jͥ=$2!cc0!eN!͍N!ͥI!`M!eNG!A͍N`iͨ/(!A/!"+!eNU!͍N`iͨ/-!/!"0$2!c0!)*+N!%I|Y(!t7!C7-7*0N*+#"+*0#"0$2-!t7cnnot rename a file that doesn't already exist0File not found.BSummary file built. XSUMMARY.$$$fBuilding summary file... COUNTERS.BAKUpdating counters... MESSAGES.BAKArchiving message $MESSAGS.$$$Purging message file... SUMMARY.BAK0!%I|Y*5|%!(͸9X4!Y*5#"5*5|9)ڱ*+43!(͸92J5"+â!ͥI !LU! L$2!?c0ͥ=Q2&4!C2|go|g}o|ʮ$2!-c0t2Q2&4!C2|go|g}o|$2!-c0!ͥIt2 Q2&4!C2|go|gODeletion $SUMMARY.$$$Purging summary file...9Invalid msg #.J1NMessage number to start (CR=1)?pYtyxRenumber messages? exists.Archive file: .ARCMust be less then 8 characters.Today's date (DD/MM/YY) ?Files already purg}o|$2!c0t2Q2&4!C2|go|g}o|G$2!c0t2$2!?0C260!?0Q2! VH0t2!""!eN !͍N!"`iͨ/!/*N!%I|6!͸9J5"D*#"*)*Ds#r|*D|)*+"6*N!ed. 9999SUMMARYUpdating summary file.1;59999 <File empty.JMESSAGESUUpdating msg fileiUpdating counters}You CANNOT use '*' with ALL.* Password?Subject?ALLWho to (C/R for ALL)?Todays date (DD/MM|HH/MM)?Message file n͸9J5*)"\1s#r*\1^#V*"*"Ù!ͥIͥ=!(͗9++"(*!ͦ7!ͼ8v*+"*|vJ(*t79a6ͥ=!ͦ7a6!!ͼ8!\.,!.$2!!c0!!ͼ8ͥ=͒=M!a6!`M$2!!c0ͥ=!\.,!.ame? Msg # will be 1Files must be purged before messages can be addedMThis msg # will be cLast caller was # x$(M) + COUNTERSRActive # of msg's *.*++ End Of File ++ ++ Aborted ++ I Filename? 1T ==> transfers a disk fi$2!!c0!!ͼ8ͥ=͒=MF!a6$2!!c0!}\.,!.$2!!c0!!ͼ8Wͥ=͒=MI!a6F!IL$2!!c0ͥ=j'New Filename? Existing Filename?  in line number Error number -That file doesn't exist so you can't erase it3You cale to the message file R ==> rename a file1 P ==> purge the message filesS K ==> kill a filei F ==> list the disk directory E ==> end the utility program D ==> display an ascii file, B ==> build summary file from message file Comm  ands allowed are: !TFDPEBKRA !Command? ,! RBBS Utility I!SYSOP.Q!==============================================!Vers 3.5!!/8<wdwnwxwwwwwwwwwwww}2%2%*^#V"%##^#V"% 2%!0&!!""%!&"&6#6P>2&>2&>2&%u&%u&l&_ 5 5!9"&( !O'(&!O'&!&O'!R",j6@JT^h:rMm|u`  :/  &06DRNdXoblv    N ` ` `        *! 4^ >q H R"&!O"&(|#'> '6#s#r#='>2&>2&>2&2&!y&"&!$\"&>&2&%=6#}L'|L'= STOZ(j'(*&.. . ........;*&|q':&'*&|''(  s#r(  {=)w#6"&*&*&>2&>)d'!9N#F(~#~(~+ \ f pz z     / ? s       4 _ } $ . 8 B LV?`]jt~ CJMMM (2<FP5ZIdbnx) DSYkz(~#~(+^#V###'###'|)(~#fo!1(= Internal Error - No Line Number y&(~#(= at line'y((>ͭ(<ڒ(ͦ(|(ͭ(<ڒ(0MTͦ(Ҏ(}_|W!(T~#fo>= at address|=}=(> MT> MT~#*(T~#fo`ry"p,6@JT^h:|Oo3vT?8  'm0L&:DXN0b3lir!///8V|  *Y\4> H%Rqf^!9"|&!)*|& )"~&!,)*~&(!\)~ing SpacString Formula Too CompleRESUME without Erro2Field Overflo3Internal Erro4Bad File Numbe5File Not Foun6Bad File Mod7File Already Ope9Disk I/O Erro:File Already Exist=Disk Ful>Input Past En?Bad Record Numbe@Bad File NamCToo Many File  Unprintable Erro)N&!+>++X&w>;;|‡')}NARM+>R`i"&!b+"&!+"&ʾ+ ,+ʙ+ʨ+I@t>* V* V* V*Vø+P@?* Vø+P@]>* V* V b+,Z+~#+x;;ø+)!>Ò'+ͯ;;;d6́K+ )l0P1)w0P1)͂0P1)B0P1)l0r1)w0r1)͂0r1)0r1)l0 1)w0 1)͂0 1)0 1 VÍ0VÍ0" VÖ0H~# Ž0x2(>:&G110Bͯ;<~1~ʿ0͹S#ó0m1B~0 ĹS#0>2(>:&G1F#~#fox1~111~#,+",G{,x,PX́Ki,!.Oz"yT, ʉ, T,O{,y,́Ki, T,{ c,,> c,c,i,i,,́K ,"t, œ,́Kڜ, t,,ʜ, ”,́Kڜ, ʜ,*&( 4:&,{,,6!.ͯ;O ,+~ ʶ,#6!.ɷw#Ý,N#",!9",",y2,*&|,*&!-"S01;1>"ùSG:&x1aT*&+~ ùS1>,͹SW*&#^ ̨1ʢ1+=ڢ1:&=ʢ1aTz{ں1{_ì1)|1}N1>R`i"&++"&!2"&!1"&2&:2)Ç''&A~#*/T:&-~-ʠ---I@0-P@"/V-b-t>* V* V* V*Vo-?* Vo-]>* V* V*/Tʓ-~#"/,- -:&--~-!"&~,"«-#"~ʿ-ʿ-# ®--"-#"/x"- -+~ -y;;o-=?Redo from Start *,JͪQ}o|g2> ͹S+|2aT!&"&!"&2&:2!&~6#w( n&( ^#V4|)!p2Z:&{'^#V2&^#V#"&!"&:&*&( nÒ'~!2=Nʾ2)i&Ò' Q3m3s3Q3m3s3Q3m3;!.\.*,:,O-*,+~+@.2.2. +w 4.K.++~#fod6",!,5*,~2[.#~#^#V͸=++;jR[':.)*&|ž.!.ͯ;;;d6*&s33Q3m3s33Q3m3s3Q3m3s3Q3m3s33Q3m3s33͎3ͬ3^#V#͸3"2*2͎3W3͎3^#4È3͎3^#V#Ͳ3]3"2~22"2)*2*2:2ÂT:2T:233Z6[[I[3X~XWxVT~#fo^#4͌T^#4͙)}NAR>R! ~#fo"/! "/)|‡'*/}o|gSR"/*/"/f<#s#r++sT3&)))(>!>!>!>!>!>^#V#! Vâ4>!>!>!>!>!>^#V#!Vé4>n4>n4>n4>n4>n4>^#V#!V4>Ö4>Ö4>Ö4>Ö4>Ö4>4)!V4í4 G'6ʽ44 G'64~#fo4##) Z)õ\^#V#5  !]2&))"5)TY5͌T|Ç')P5)Y565p5:&ʦ5!5)͎X4Z}5:&ʩ5!9)Z: V2 V:V55:V5ß5|/g}/o4Z:V5!V5'65!)Ä':VgoW* V|7g5: V5+>5|/g}/o6!:: : :::::::_!942:5*9"9~#N#F#r:L: T5:yxW: 5:+++6@#yw#xw+++6###!9~6ڃ:͘:2::*9#~#~2:)~'!*9"9~#^#V#::Tå:|:å:++~_w#~Ww#å:͘:*9DM~#^#V#<;::+z6G|6 6o& Gȯ|g}o616>>6~+~?~I6+#V6+ V6)͘;Ԟ6~##++f<>T+V+^+ʑ6+r+sͰ<)d6~;"6"6*6|‡'}ʇ' ڇ'+<6{*66~#^#V`i#N#F T*6;7#N#fi<+{<##{z~#q#p_:y1;x1;DM:~#1;:YP+++"96@###{_zW+r+sɷʋ;*9|i;)Á'":^#V+"9w#s#r+++r+s##!;;*A={z*C=?ҭ;}|~# ³;yGV;xTGV;x#N#F& ;͘;f<ð<*A=*C= U:7~#N#fiT;FO!7G#~#fo#~#foxTy:7;6 #:7)ڇ'V;d7d7;;~#~#foT)|‡'BKͮ7PY)|‡'BK ҟ7 o_Â7)z‡'zʶ7 Ҽ7_7o}`i;;DM) 7~ʇ'#~#fon&;)z8}V;<<@++*9"9s#r+:*9#~_#~W<)Í'r+s##6"9###!9~#fo< U<<~ 8s#8)Ç')|‡'!9>;;)" V>Y8) V>S8)V>T2(>>!*8͙TB>*8͌T~#u8x;;>ß8>ß8>ß8>ß8>ß8>8!+>8>8>8>8>8>88~#fo##GN9y9#~#fo~#fo 9#9 8*9"9*9}o|g6@#s#r#6"9*C=*A="9}w>#w## U(=++6+69":L=>2E=|‡=+})N#҃=~#fo :E=v=!9"&!&4 ~T#Ç'!&4!9"&^#V#!&~wr'!9"&ɧ~MT#=º==~MT#=G~#=#=++=0:=M y 9y<.9)9);;.9x‡'ű99 y<2$9F~ڃ9ڃ9#~#foyTO #~#foxʇ9w9#f9Ç9!$94 c92$9;;*$9&~;o&~ʇ'#^#V++;o&)~<ʇ'V;~#~#foT6+lGI@t>;;9999:T͆GP>* V}/o|/g#" V|́>͵\P>! V~wɯ2V͆Gk>4Ź>* V́>õ\͆Gk>Z>>&@~a&#Æ>a&>!Vä>>!VV2># ª>!VÎX!V͋?%V>>>>|}+!A@ÖWS?<]+6! V>Y2V!=@I[!9@ÖW  !VÖW~_#~W#~O͆^Z! GZ͇\&?ɇ<o&́>õ\* V* VV?" V`i" V! V^#V#N#F#!=@[t^x{i^!V6I]wg>^Í^Ï?:(>Gw#??ä?!V? V͆GV͆G?* V||<͆G* V?͞?!G͘?ʹ>d>??: V2 V:VcHe?:V@>#:)>~ D*D+DlG-+_:&{0FD#lGFD++wxDB+6%?aD͂?YED_xEEFE FC_yJADLAD{_xDEEDEyFOEGOFD*)>=EPCk>ѯD͂?7Y@ @|/g}/o!@!cH:V*@e?" V>2(>?aj @ L}X>~>NH>2>`h!@~&ʡG-x@+x@+lG_A.Aeʊ@E´@lGlʢ@Lʢ@qʢ@Qʳ@:(>@>@~%A##A!$Ad@D@-AlG͗GlGA@_{_͆G!-?EyJAOzWOLAE&E/<~.]?")>PEͥCCկ͆G}E:V}EF!V͋?? bEͯE͆GECO?ØEFͺ>E=AÀELAͯE͆GEt#?EFͺ>E=60#EE F60#=E{@O F")>6*@͆G @-Ax@lG!-?!?@-AlG@]>t>͆G_?>=͆G>>ҔAT])))O |A" Vx@yk>7ҴAt$?A_?AÌA{>>͞?/?{>ʹ>ÌA8?/??{ A0_@B! V͆GA:VAy.#60F#HF6.")>#H 6,#͆GnF͞?!G͘?ʹ>>G> F/>͡>HF>͡>p#=?F!VE?{F?>e?H?\G? FS?/{_#zW#yO++ҏF?#H?p#ځF>ýFbG> FN#F#* V/}o|gF" Vp#=½F Fw1_cB:VB: VB:V/BcHͩB)B6+Ͱ?;B6-/>#60:+>W:(>CCҲBͷF!>F :+>_ tBx*tB{tBAqlGʔBEʔBDʔB0tB,tB.—B+60{ʢB+:&w{+p2+>!>6 8?*V* V2>]CE~B:B0B #~B>DGB"V`i" VƤ~@zZrN vH Tʚ;@B''d #~: lG lG lG0?<=:(>ғG7-++lG)HOʲGHʲG+;GG!@H#GG)Ä'M!GG}0?)))صoGM!HH#~+EC-C0OxGEC#~C`xE:Cy B>2>JC|B2CB"V`i" VH?#WYE:>xCÂCC҆CE60]?F+~0ʕC.]?C͆G>"w#6+C6-/</ ҺC:#p#w#6!>#zNDDEzEͷF{>=EWBCp#6!})H0? H? ))))صoHa{ ?͆G:V: V?:>2>2>)Ä')Ä'  )}NAR>R!' ~`I `I#~UI`iO #~goPY!' ůwpK:%6N\R=VR=”IѯGR<\R!% ^#Vr+s)}ʝN!"I}NI PYI!I`i>8J!' ~kIpK͐O)}NAR!&M:& W:&N> ͈S͈S܅SHM~*6?# .NO!!4NN#4NN#4y"cN\R><"I>2&!Q"&:&<2&*&"I!N"&)"InL*&|ʯN##nͭIÞN.ͨI*I)N)2 IO"!IO)N)2 IO"!IOARR!J*&~~Q( ~'K+~#5O ~+~3K9K K7>*&T]% N#F+q#p###6 QKpK:%6N>iK>w+w!(K7?*&' 6#67~YR#^#fk_ڹKN#~:ʽK++@YRy@YRYRH #L~.KK7K#K2I;z YR ^#V: IP*!I{DR+s#r! w#w! ~#fo!,RAPPBK>!)TP)#UP))cP bP#=JP}_}la)_RzP#x_R"O! "O!) "O!}o|g,RکPbk:OP,RҾP QDM*O*OCQ"OPY Q}o|g*O#"OŒP QDM*O*OCYR> KK> LK)͜KiHH T͜K:H!H_RHR#N#F++; OʧLIʧLR>R*I|§L!"I}_NºL͐O{NMRz͜K O"&#H> T66pK~M<Q"OPYP2+R*O! ~#fo,Rs#r2Q:+R?Q!?Q!& cJ~# xDQDMͬQSR͡Q! w!( V6 yQzwͪQSR͡Q! ~!ÜQ! ^#V! s#rDM͙Q͓Q,R}NARQ>R`i"&!Q"& ŔK)!>Ò')|‡',R-:&AR*\RM<MPRL!%w#w#w#w~7M9K) p# =M͝N _)͜KiHH<PR)!H6# .NîM)͜K2I!H*N!I*NiHHPRO!jH  ~#͈SyM~ M>.͈S &!X&"&{V;f$%'R! R*&R|}!"&>6>4>?>=>:>7>5>2>3>@>C>)o&Ò')!"&!."/|R:[.R=?ÍRpͳSR:S>\2S§RʌR͈S+ʻR~͈SR+͈SR͈SͅS!.2SRͳSOʓR:SR>\͈S2SyRS̋S7 yS RS   SʍRRS̋SʍR*SʍR͈S> ͈S>ôR4S>#ûRMS6ͅS!.͝SR Rx<>]Syq#͈S R> ͈SͳSjS RR:[.̅Sw(MT>^͈S@͈SͅS~ ¬S> ͈S͈S#ÝSX&*& S#~+ ͹S~=?T*&!&"&͹S"&> ͹S> ùS:&=|T> h&> h&*S^#V#͌Tɷ! VT!VãT VTVTw#w#w#w#T>VT> VT ~#=T!T#~ T TɅo$ɧX+6!VV# Yɯ# YY>Y/!VOyw#6YG: VgY!VVwz# LYx?YD^!VzY_YxX!VwD^X~w# |Y=W]^ZÛY=W Z!VÎX=W]^Z÷Y=W Z W!V~Xy2V! VFU~q+YqYNsY+YY W~w+YGw#U{zY! VY͵\Z]^!Vw#ZÍ^+Z}`Z4ZfZ`Z<]! VF#^#V#N$^fZ}V~#NZG++NyÕ^VLZ! V]^>ʣZ{ZͰ2͆^ͱZt^ʟZ!V6I]g>^| ]!>uZak]^ZM\ZÍ^!V~+>wÍ^\Z~^ʍ^:Vf^Z/<]ҍ^<]g^! V6#VIZVTV͍^OYV!^! Vy#QV+DV͍^?Õ^=W]^ZrV=W Z W!VIZV:Vʍ^:V/NY[~_#~W#~O$^#4^.^$^G~_#~W#~O]f]\9[~^ʍ^>OZ\L[~^\͍^ȯG-\"Uy2UFo]]!D* V: VO҉[V4^á[ͱ[g.*U:UOzҊ[ͱ[g.* V: V×[x<=[{_zWxG)yOHG$^\[~^i^͍^-\y+F+F+Fw`h|%\gyX2V:V>Y͍^x/F+N+=]W!VqW!V>q#p#=tW!VÖW"?UhWWWCW*?UIZD^:VD^!VN#F-\YqWGYZx ¼W³W>Y! VYWj0 TeB׳]h!I.k  \: VO|g}oxG-|[}[f]ElaO[!V~GxE\ƀC^w<]w+ɷ^D^t^x{i^!V6I]wgk\zj\ >^|6^{>2Vf]/))7] =/]! V~7w?##wy7O* V* V" V" VajSXͭ]D^JS\E!VD^/ø^ ҷ^7>{_zW}o|g=®^|g}o^CZQ^ o-yOzW{_xG^0 VERS$ = "Vers 3.5" 250 ON ERROR GOTO 2190 260 DIM M(200,2) 270 SEP$ = "==============================================" 280 CRLF$ = CHR$(13) + CHR$(10) 290 PURGED = 0: BACKUP = 0 300 GOSUB 2260 ' BUILD MSG INDEX 310 N$ = "SYSOP": O$ = "" 320 PRINT: PRINT " RBBS Utility ";VERS$ 330 PRINT SEP$ 340 MSGS = 1: CALLS = MSGS + 1: MNUM = CALLS + 1 350 PRINT: INPUT "Command? ",PROMPT$ 360 PRINT: PRINT: IF PROMPT$ = "" THEN GOSUB 400: GOTO 350 370 B$ = MID$(PROMPT$,1,1): GOSUB 1250: SM$ = B$: SM = INSTR ("TFDPEBKRA",SM$): GOSUB 380: GOTO 350 380 IF SM = 0 THEN 400 390 ON SM GOTO 740,690,570,1310,510,2010,2440,2520 400 PRINT: PRINT "Commands allowed are:" 410 PRINT "B ==> build 100 ' RBSUTL35.BAS A Utility program for use with RBBS35 110 ' Revised from Version 2.7/3.1 of RBBSUTIL 120 ' 130 ' Dennis Recla 2/01/84 140 ' 150 ' Removed the SYSOP recognition codes from 2.7 since this 160 ' versiosummary file from message file" 420 PRINT "D ==> display an ascii file" 430 PRINT "E ==> end the utility program" 440 PRINT "F ==> list the disk directory" 450 PRINT "K ==> kill a file" 460 PRINT "P ==> purge the message files" 470 PRINT   "R ==> rename a file" 480 PRINT "T ==> transfers a disk file to the message file" 490 RETURN 500 ' 510 ' END OF PROGRAM 520 ' 530 PRINT: PRINT: END 540 ' 550 ' DISPLAY A FILE 560 ' 570 B$ = MID$(PROMPT$,2): IF B$ = "" THEN INPUT "FiFiles must be purged before messages can be added": RETURN 820 OPEN "R",1,"COUNTERS",5: PRINT "Msg # will be ";: FIELD#1,5 AS RR$: GET#1,MNUM: V = VAL(RR$) 830 PRINT STR$(V + 1): CLOSE 840 INPUT "Message file name? ",B$: GOSUB 1250: FILlename? ",B$: PRINT 580 IF B$ = "" THEN RETURN ELSE GOSUB 1250: FILN$ = B$ 590 OPEN "I",1,FILN$ 600 IF EOF(1) THEN 640 610 BI = ASC(INKEY$+" "): IF BI = 19 THEN BI = ASC(INPUT$(1)) 620 IF BI = 11 THEN PRINT: PRINT "++ Abort$ = B$ 850 INPUT "Todays date (DD/MM|HH/MM)?",B$: GOSUB 1250: IF B$ = "" THEN D$ = DT$ ELSE D$ = B$ 860 INPUT "Who to (C/R for ALL)?";B$: GOSUB 1250: IF B$ = "" THEN T$ = "ALL" ELSE T$ = B$ 870 INPUT "Subject?",B$: GOSUB 1250: ed ++": PRINT: CLOSE: RETURN 630 LINE INPUT #1,LIN$: PRINT LIN$: GOTO 600 640 CLOSE: PRINT: PRINT: PRINT "++ End Of File ++": PRINT 650 RETURN 660 ' 670 ' DISPLAY DIRECTORY 680 ' 690 B$ = PROMPT$: GOSUB 1250: IF LEN(B$) > 1  K$ = B$ 880 INPUT "Password?",B$: GOSUB 1250: PW$ = B$: IF T$ = "ALL" AND LEFT$(PW$,1) = "*" THEN PRINT CHR$(7);"You CANNOT use '*' with ALL.": GOTO 880 890 F = 0 ' F IS MESSAGE LENGTH 900 PRINT "Updating counters": OPEN "R",1,"COUNTERTHEN SPEC$ = MID$(B$,3) ELSE SPEC$ = "*.*" 700 FILES SPEC$: PRINT: RETURN 710 ' 720 ' TRANSFER A DISK FILE 730 ' 740 PRINT "Active # of msg's ";: OPEN "R",1,"COUNTERS",5: FIELD#1,5 AS RR$: GET#1,MSGS: M = VAL(RR$) 750 PRINT STR"$(S",5: FIELD#1,5 AS RR$ 910 GET#1,MNUM: LSET RR$ = STR$(VAL(RR$) + 1): PUT#1,MNUM 920 GET#1,MSGS: LSET RR$ = STR$(VAL(RR$) + 1): PUT#1,MSGS: CLOSE#1 930 PRINT "Updating msg file": OPEN "R",1,"MESSAGES",65: RL = 65 940 FIELD#1,65 AS RR$ M) + " " 760 PRINT "Last caller was # ";: GET#1,CALLS: PRINT STR$(VAL(RR$)) 770 PRINT "This msg # will be ";: GET#1,MNUM: U = VAL(RR$): PRINT STR$(U + 1): CLOSE 780 ' 790 ' ***ENTER A NEW MESSAGE*** 800 ' 810 IF NOT PURGED THEN PRINT "950 RE = MX + 7: F = 0 960 OPEN "I",2,FIL$: IF EOF(2) THEN PRINT "File empty.": CLOSE#1: CLOSE#2: END 970 IF EOF(2) THEN S$ = "9999": GOSUB 1260: PUT #1,RE: CLOSE #2: GOTO 1010 980 LINE INPUT #2,S$ 990 IF LEN(S$) > 63 THE  N S$ = LEFT$(S$,63) 1000 PRINT S$: GOSUB 1260: PUT #1,RE: RE = RE + 1: F = F + 1: GOTO 970 1010 RE = MX + 1 1020 S$ = STR$(V + 1): GOSUB 1260: PUT#1,RE 1030 RE = RE + 1: S$ = D$: GOSUB 1260: PUT#1,RE 1040 RE = RE + 1: S$ = N$ (MID$(B$,ZZ,1)) + 32 * (ASC(MID$(B$,ZZ,1)) > 96)): NEXT ZZ: RETURN 1260 ' 1270 ' FILL AND STORE DISK RECORD 1280 ' 1290 LSET RR$ = LEFT$(S$ + SPACE$(RL - 2),RL - 2) + CHR$(13) + CHR$(10) 1300 RETURN 1310 ' 1320 ' PURGE KILLED MESSAGES FROM FILES+ " " + O$: GOSUB 1260: PUT#1,RE 1050 RE = RE + 1: S$ = T$: GOSUB 1260: PUT#1,RE 1060 RE = RE + 1: S$ = K$: GOSUB 1260: PUT#1,RE: RE = RE + 1: S$ = STR$(F): GOSUB 1260: PUT#1,RE 1070 CLOSE #1 1080 IF PW$ <> "" THEN PW$ = ";"  1330 ' 1340 IF PURGED THEN PRINT "Files already purged.": RETURN 1350 INPUT "Today's date (DD/MM/YY) ?",DATE$ 1360 IF LEN(DATE$) > 8 THEN PRINT "Must be less then 8 characters.": GOTO 1350 1370 IF DATE$ = "" THEN DATE$ = DT$ 1380 OPEN+ PW$ 1090 PRINT "Updating summary file." 1100 OPEN "R",1,"SUMMARY",30: RE = 1: FIELD#1,30 AS RR$: RL = 30 1110 RE = MZ * 6 + 1: S$ = STR$(V + 1) + PW$: GOSUB 1260: PUT#1,RE 1120 RE = RE + 1: S$ = D$: GOSUB 1260: PUT#1,RE 1130 RE = R "R",1,DATE$+".ARC" 1390 IF LOF(1) > 0 THEN PRINT "Archive file: ";DATE$ + ".ARC";" exists.": CLOSE: RETURN 1400 CLOSE 1410 MSGN = 1: INPUT "Renumber messages?",PK$: PK$ = MID$(PK$,1,1) 1420 IF PK$ = "y" THEN PK$ = "Y" 1430 IF PK$ <> "E + 1: S$ = N$ + " " + O$: GOSUB 1260: PUT#1,RE 1140 RE = RE + 1: S$ = T$: GOSUB 1260: PUT#1,RE 1150 RE = RE + 1: S$ = K$: GOSUB 1260: PUT#1,RE 1160 RE = RE + 1: S$ = STR$(F): GOSUB 1260: PUT#1,RE 1170 RE = RE + 1: S$ = " 9999Y" THEN 1460 1440 INPUT "Message number to start (CR=1)?",MSG$: IF MSG$ = "" THEN MSG$="1" 1450 MSGN = VAL(MSG$): IF MSGN = 0 THEN PRINT "Invalid msg #.": RETURN 1460 PRINT "Purging summary file...": OPEN "R",1,"SUMMARY",30 1470 FIELD": GOSUB 1260: PUT#1,RE 1180 CLOSE#1 1190 MX = MX + F + 6: MZ = MZ + 1: M(MZ,1) = V + 1: M(MZ,2) = F 1200 U = U + 1 1210 RETURN 1220 ' 1230 ' Convert the string B$ to upper case 1240 ' 1250 FOR ZZ=1 TO LEN(B$): MID$(B$,ZZ,1) = CHR$(ASC#1,30 AS R1$ 1480 R1 = 1 1490 OPEN "R",2,"$SUMMARY.$$$",30 1500 FIELD#2,30 AS R2$ 1510 R2 = 1 1520 PRINT SEP$: GET#1,R1: IF EOF(1) THEN 1650 1530 IF VAL(R1$) = 0 THEN R1 = R1 + 6: PRINT "Deletion": GOTO 1520 1540 IF PK$ = "Y" AND VAL  (R1$) < 9999 THEN IF INSTR(R1$,";") THEN PASS$ = MID$(R1$,INSTR(R1$,";"),27) ELSE PASS$ = SPACE$(28) 1550 IF PK$ = "Y" AND VAL(R1$) < 9999 THEN LSET R2$ = LEFT$(STR$(MSGN) + PASS$,28) + CHR$(13) + CHR$(10): MSGN = MSGN + 1: GOTO 157 = LEFT$(STR$(MSGN) + PASS$,63) + CHR$(13) + CHR$(10): MSGN = MSGN + 1: PRINT LEFT$(R2$,63): GOTO 1770 1760 LSET R2$ = R1$: PRINT LEFT$(R2$,6) 1770 PUT #2,R2 1780 IF KIL THEN GOSUB 2360: PRINT #3,KL$ 1790 IF VAL(R1$) > 9998 THEN 1910 1560 LSET R2$ = R1$ 1570 PUT #2,R2 1580 PRINT LEFT$(R2$,28) 1590 IF VAL(R1$) > 9998 THEN 1650 1600 FOR I = 1 TO 5 1610 R1 = R1 + 1: R2 = R2 + 1: GET#1,R1: LSET R2$ = R1$: PUT#2,R2 1620 PRINT LEFT$(R2$,28) 1630 NEXT I 1640 R1 = R0 1800 FOR I = 1 TO 5 1810 R1 = R1 + 1: IF NOT KIL THEN R2 = R2 + 1 1820 GET #1,R1: IF KIL THEN GOSUB 2360: PRINT #3,KL$: GOTO 1840 1830 LSET R2$ = R1$: PUT #2,R2: PRINT LEFT$(R2$,63) 1840 NEXT I 1850 FOR I = 1 TO VAL(R1 + 1: R2 = R2 + 1: GOTO 1520 1650 CLOSE: OPEN "O",1,"SUMMARY.BAK": CLOSE: KILL "SUMMARY.BAK": NAME "SUMMARY" AS "SUMMARY.BAK": NAME "$SUMMARY.$$$" AS "SUMMARY" 1660 PRINT "Purging message file...": MSGN = VAL(MSG$) 1670 OPEN "R",1,"MESS1$): R1 = R1 + 1: IF NOT KIL THEN R2 = R2 + 1 1860 GET #1,R1: IF KIL THEN GOSUB 2360: PRINT #3,KL$: GOTO 1880 1870 LSET R2$ = R1$: PUT #2,R2: PRINT LEFT$(R2$,63) 1880 NEXT I: R1 = R1 + 1: IF NOT KIL THEN R2 = R2 +AGES",65: FIELD #1,65 AS R1$ 1680 OPEN "R",2,"$MESSAGS.$$$",65: FIELD #2,65 AS R2$ 1690 OPEN "O",3,DATE$+".ARC": R1 = 1: KIL = 0 1700 R1 = 1: R2 = 1 1710 PRINT SEP$: GET #1,R1: IF EOF(1) THEN 1910 1720 IF VAL(R1$) = 0 THEN KIL = - 1 1890 GOTO 1710 1900 ' 1910 CLOSE: OPEN "O",1,"MESSAGES.BAK": CLOSE: KILL "MESSAGES.BAK": NAME "MESSAGES" AS "MESSAGES.BAK": NAME "$MESSAGS.$$$" AS "MESSAGES" 1920 PRINT "Updating counters..." 1930 OPEN "O",1,"COUNTERS.BAK": CLOSE: KIL1: PRINT "Archiving message": GOTO 1780 1730 KIL = 0 1740 IF PK$ = "Y" AND VAL(R1$) < 9999 THEN IF INSTR(R1$,";") THEN PASS$ = MID$(R1$,INSTR(R1$,";"),62) ELSE PASS$ = SPACE$(62) 1750 IF PK$ = "Y" AND VAL(R1$) < 9999 THEN LSET R2$L "COUNTERS.BAK" 1940 OPEN "R",1,"COUNTERS",15: FIELD #1,10 AS C1$,5 AS C2$ 1950 OPEN "R",2,"COUNTERS.BAK",15: FIELD #2,15 AS R2$ 1960 GET #1,1: LSET R2$ = C1$ + C2$: PUT #2,1 1970 IF PK$ = "Y" THEN LSET C2$ = STR$(MSGN - 1): PUT #1,1 19  80 CLOSE 1990 PURGED = -1: GOSUB 2260: RETURN 2000 ' 2010 ' BUILD SUMMARY FILE FROM MESSAGE FILE 2020 ' 2030 PRINT "Building summary file..." 2040 OPEN "O",1,"SUMMARY.BAK": CLOSE: KILL "SUMMARY.BAK" 2050 OPEN "R",1,"MESSAGES",65: FIELD #1," in line number ";ERL 2240 RESUME 350 2250 ' 2260 ' build message index 2270 ' 2280 MX = 0: MZ = 0 2290 OPEN "R",1,"SUMMARY",30: RE = 1: FIELD#1,28 AS RR$ 2300 GET#1,RE: IF EOF(1) THEN 2340 2310 G = VAL(RR$): MZ = MZ + 1: M(MZ,1) = 65 AS R1$: R1 = 1 2060 OPEN "R",2,"SUMMARY.$$$",30: FIELD #2,30 AS R2$: R2 = 1 2070 PRINT SEP$ 2080 FOR I = 1 TO 6 2090 GET #1,R1: IF EOF(1) THEN 2140 2100 LSET R2$ = LEFT$(R1$,28) + CRLF$: PUT #2,R2 2110 R1 = R1 + 1: R2 = R2 + G: IF G = 0 THEN 2330 2320 IF G > 9998 THEN MZ = MZ - 1: GOTO 2340 2330 GET#1,RE + 5: M(MZ,2) = VAL(RR$): MX = MX + M(MZ,2) + 6: RE = RE + 6: GOTO 2300 2340 CLOSE: RETURN 2350 ' 2360 ' unpack record 2370 ' 2380 ZZ = LEN(R1$) - 21: PRINT LEFT$(R2$,28): IF EOF(1) THEN 2140 2120 IF I = 1 THEN IF VAL(R1$) > 9998 THEN 2140 2130 NEXT I: R1 = R1 + VAL(R1$): GOTO 2070 2140 CLOSE: NAME "SUMMARY" AS "SUMMARY.BAK": NAME "SUMMARY.$$$" AS "SUMMARY" 2150 PRINT " 2390 WHILE MID$(R1$,ZZ,1) = " " 2400 ZZ = ZZ - 1: IF ZZ = 1 THEN 2420 2410 WEND 2420 KL$ = LEFT$(R1$,ZZ) 2430 RETURN 2440 ' 2450 ' Kill (Erase) a file 2460 ' 2470 B$ = MID$(PROMPT$,3): IF B$ = "" THEN INPUT "Filename? ",B$: PRINT 24Summary file built.": RETURN 2160 ' 2170 ' Error handlers 2180 ' 2190 IF (ERL = 700) AND (ERR = 53) THEN PRINT "File not found.": RESUME 350 2200 IF (ERL = 590) AND (ERR = 53) THEN PRINT "File not found.": CLOSE: RESUME 650 2210 IF (80 IF B$ = "" THEN RETURN ELSE GOSUB 1250: FILN$ = B$ 2490 KILL FILN$ 2500 PRINT 2510 RETURN 2520 ' 2530 ' Rename a file 2540 ' 2550 INPUT "Existing Filename? ",B$: PRINT 2560 IF B$ = "" THEN RETURN ELSE GOSUB 1250: EFILN$ =ERL = 2590) AND (ERR = 53) THEN PRINT "You cannot rename a file that doesn't already exist": RESUME 350 2220 IF (ERL = 2490) AND (ERR = 53) THEN PRINT "That file doesn't exist so you can't erase it": RESUME 350 2230 PRINT "Error number ";ERR; B$ 2570 PRINT: INPUT "New Filename? ",B$: PRINT 2580 IF B$ = "" THEN RETURN ELSE GOSUB 1250: NFILN$ = B$ 2590 NAME EFILN$ AS NFILN$ 2600 PRINT: RETURN  PRINT 2580 IF B$ = "" THEN RETURN ELSE GOSUB 1250: NFILN$ = B$ 2590  This is the TWIT file. When a caller who has been tagged as being a TWIT calls, he gets this message.INFO MENURBBS NEWCOM NEWS    1 ! JACK;BROWN;SURREY, B.C.;HELLOTHERE; 0  ! JACK;BROWN;SURREY, B.C.;HELLOTHERE; 0  First Osborne Group (FOG) -FOG/HAK.021 Copyrigh 198 b Firs Osborn Grou (FOG t th exten no copyrighte b th origina autho fo th exclusiv us an enjoymen o it members An reproductio o distributio fo profi o persona gai i strictl forbidden Fo information contac FOG P O Bo 3474 Dal City C 94015. RBBS35 - A BULLETIN BOARD SYSTEM On these two disks is the RBBS35 message system for use in a Remote Bulletin Board S  ystem (RBBS). To use this system, you really need to compile the Basic files with the Bascom compiler. I have included the .com files for you to test the features, etc. of this system out first, or you could use ddt, du, edfile, or similar to change the info and passwords, and use it as is. It has been linked with the OBSLIB library, and does not need BRUN.COM to be used. It does call BYE to hang up on the caller from the 'G' command. To really make the system work, though, you will need the ; ; CHAT.ASM v3.4 ; (revised: 01/01/84) ; ; An interactive program to allow a remote user to "chat" ; with the local Remote CP/M system operator. ; ; ; This program may be used with RCPM systems to allow the operator to be ; summofollowing. BYE (version 2 or 3 will do fine) BASCOM The Microsoft Basic compiler L80 (LD80) The Microsoft linker (L80 is supplied with Bascom, but you may have to use LD80 or strip all comments, etc out of the RBBS source code tned by a remote caller. He can then carry on a keyboard conver- ; sation with that user. The local operator acknowledges "chat" request ; by pressing the special code key designated at "ACK" below. ; ; When in the chat mode, lines are automatically lio fit in the memory available on the o1) or try compiling on an Executive instead of an O1 You will also need to be fairly comfortable with Basic and with 8080 assembler (for BYE) if you want to make any major changes in the system, but try mited to 79 charact- ; ers. A CR/LF is inserted automatically on the first space typed after ; the 74th character. If your system is a TRS-80, change ELINE to 63 ; and EWARN to 55, however it would auto-wrap in any case after 63 chars. ; ; TO USE: Tit anyway! You will learn a lot, that's for sure! Any questions or problems, try contacting me on FOG #2 300/1200 baud (604) 596-0314 . I'll help where I can. ......enjoy!! .....Jack Brown he operator types an ESC to enter chat mode when summoned. ; If the operator wishes to initiate chat himself, use "CHAT C". ; CTL-X or CTL-C aborts chat, back to CP/M (for either party). ; ; TO SET: Since this program checks the keyboard for any   entry during ; the delay timing loop, the length of delay might vary some- ; what from one computer to another. ; ; 1) have somebody test it and check the time with a ; clock until it times out and says NO OPERATOR IS ; PRESENT, etc assembly. Also changed corresponding line ; in code to match. Added MEASURE equate to make "measuring ; stick" independent of whether NOISY was set or not. Changed ; name of last caller file to "LASTCALR" (from "LASTCALR.DAT") ; bec. ; 2) if not in the area of 30-40 seconds, try first ; changing the CLOCK equ to something different. ; 3) you can also change the value in DELAYV label ; area from 50000 to something larger (maximum ; is 65535) to shorten the timeouause it is more often used and matches with XMODEM83.COM ; (current version). (Anyone out there know of an easy way to ; make the length of the "measuring stick" vary as to what the ; ALERT equate is set to?) - Ed Svoboda ; Sysop Oract, or make it ; smaller to lengthen the timeout. ; 4) it should only take a couple of tests (if any) ; to set it quite accurately for your system. ; ; - notes by Irv Hoff ; (updated by Kim Levitt) ; ;===========================le HQ RCP/M) ; ; 12/20/83 Added "|--------------|" above blips (.) so the user knows ; v3.2 when this thing is going to stop beeping. NOTE: This string ; is currently set for 11 blips (Non NOISY mode) - add 2 '--'s ; for every addition============================================ ; ; 01/01/84 Fixed a problem in the CLOOP area that prevented proper as- ; v3.4 sembly with ASM.COM which does not like nested "IF - ENDIF". ; It had been ok with MAC.COM and was only affected if tal blip (.) you bleep. If you set the ; NOISY equate to NO, this string will be skipped and it will ; just say 'Ringing...' as usual. ; - Andrew Moore ; Sysop Quincy RAM-NET. ; ; 12/18/83 Altered code, so that if the LASTCALR 'filhe ; LASTCALR equate was set to NO - not everyone uses LASTCALR.) ; - Irv Hoff ; ; 12/29/83 Changed exclamation marks in comments for v3.2 to vertical ; v3.3 bars to prevent unimportant but buggy 'S' errors from ap- ; pearing duringe open' was not ; v3.1 successful, you would still be returned to the current user ; and disk on exit. Made part of CLOOP code conditional for ; MBBS and OxGate. - Don Brown ; ; 12/11/83 Well, it worked, but left you in LASTCALR user #   and disk, ; v3.0 (on some systems). Added code to get current user and disk ; and restore on exit... Also made user selection a CPM22 ; equate function. (Set CPM22 false for CP/M v1.4 systems...) ; - Kim Levitt ; Sysop Hollywoon? ; v2.6 - Sigi Kluger ; Sysop El Paso RCPM) ; ; 11/26/83 Combined Alex Soya's CHAT24 with my CHAT24 to hopefully get ; v2.5 in sync again. Also added support for DELETE (treated same ; as backspace) and CTL-C or CTL-X during nd RCPM/MBBS ; ; 12/11/83 Fixed yet ANOTHER bug in LASTCALR file read code. (NOW IT ; v2.9 WORKS...) (DMA address wasn't set, HL wasn't saved, FCB ; wasn't initialized, now they are...) Also added "..." after ; "Wait, WHATS YOURFACE" msg ame entry abort op- ; tion. Also added code so will beep ten columns from end of ; line, and will beep continuously at margin if no auto wrap ; or CR. Fixed bug that stopped paging if non-abort or ACK ; character typed during page. ;and fixed bug that would chop ; off part of person's name if they had a space in it... ; (AND added code so LASTCALR function will work with MBBS.) ; - Kim Levitt ; ; 12/10/83 Fixed bug in LASTCALR file read code, removed margin warning  - Kim Levitt ; ; 11/25/83 CHAT modified to get the callers name from LASTCALR file. ; v2.4(AS) Set GETCALR to YES for this to be enabled and set up LASTUSR ; and LASTDRV to the user area and drive on which LASTCALR can ; be found. Asse; v2.8 bell, as is largely unnecessary and is annoying.. ; - Kim Levitt ; ; 12/08/83 Added IMSAI code. I thought it was here before, but must ; v2.7 have been deleted somewhere along the way. If switch 4 of ; the programmed input imble with MAC and SEQIO22 when setting this ; option. - Alex Soya ; Sysop RCPM/Hackers BBS) ; ; 11/23/83 Added equates for "NOISY" option (bell every second instead ; v2.4(KL) of once every five seconds). Added equate for BELTOG option, s down, no operator is available. ; Changed label 'NAME:' back to 'GLOOP:' so can be compiled ; with MAC. Why induce more bugs when not necessary? ; - Mike Spann (??) ; ; 11/27/83 Removed need for MAC/SEQIO. Why shoot sparrow with canno ; if running version of BYE with console bell toggle, will ; read KILBEL location before paging, if set, will inform user ; immediately that operator not available. Changed immediate ; entrance option from CHAT / to CHAT C so ZCPR2 sta  ndard of ; using "//" for help will function. Set DELAYV equate at ; beginning to make it easier to find and adjust DELAY value. ; Changed text display to eliminate leading spaces, reference ; to "30 seconds". Made name question an eqs. Changed the delay to allow instant ; abort, also operator can now immediately get into chat mode. ; Was previously indeterminate, depending where in the delay ; count you were, creating confusion. ; - Irv Hoff ; ; 04/05/83 Addeduate option, (who ; needs it if BYE has a CTL-T function?). (Also fixed some ; bugs in backspace handling that Tom and Tony missed, made ; wrap zone even bigger, (for those big words), added MBBS ; equate for MBBS, etc., etc., etc.) ; "quick" mode (bypass alert) to drop directly into chat ; v2.0 loop. Reformatted file (ran ASPRETTY over some of it). Ad- ; ded ELINE and EWARN equates, which deal with where the wrap- ; around should take place. - Paul Traina ; Sy - Kim Levitt ; ; 11/18/83 CHAT was dropping into conversation mode without summoning ; v2.3 operator if caller typed a backspace while giving his name. ; Now also shows that name is optional. ; - Tom Bering ; ; 11/13/83 Added feasop OXTAGE system ; ; 07/06/82 Changed signon banner to shorten. Added help text that is ; v1.9 called like this: CHAT xxx (anything on command line). ; A blank command line defaults to normal execution. All pro- ; grams should respoture to see who is calling before answer. Changed ; v2.2 timing sequence to get in more rings over 30 sec -- easier ; to detect if in bathroom when CHAT call starts. ; - Tony Stanley ; ; 11/01/83 Corrected comments to match current nd to COMMAND ? with an appropriate re- ; sponse. - Paul Homchick ; ; 07/04/82 Modified to support faster CPU speeds with CPUMHZ equate. ; v1.8 Changed sign-on message to allow abort of ring with CTL-Z. ; - Paul Homchick ; ; Orirevisons, other minor ; v2.1 changes. Aborts with either CTL-C or CTL-X. Added Oracle, ; Metal and Datatech operating systems, or option for none. ; Shortened the help message. Works properly at 1200 bps with ; memory mapped displayginally written by Roderick W. Hart, date unknown ; ;======================================================================= ; NO: EQU 0 YES: EQU 0FFH ; CPM22: EQU YES ;set to NO if CP/M 1.4, YES if CP/M 2.2-up ; ; ; Conditional assembly switches   ; BELTOG: EQU NO ;yes if BYE supports console bell toggle key CLOCK: EQU 4 ;set to your CPU clock spped in MHz MEASURE:EQU no ;yes for "measuring stick" MPMPRL: EQU NO ;yes if MP/M program relocatable format NOISY: EQU YES ;yes for multus alertus (l ENDIF ; ;======================================================================= ; ; Define ASCII characters used ; ABORT: EQU 'X'-40H ;CTL-X for ring abort BAKSP: EQU 08H ;backspace BELL: EQU 07H ;bell CR: EQU 0DH ;carriage return CTLC: otsa bells) ; CBBS: EQU NO ;yes if CBBS system DATA: EQU NO ;yes if DataTech system METAL: EQU NO ;yes if METAL system MBBS: EQU NO ;yes if MBBS system MINCBBS:EQU NO ;yes if MINICBBS system ORACLE: EQU NO ;yes if Oracle system OXGATE: EQU NO ;yeEQU 03H ;CTL-C, chat-mode exit character DEL: EQU 7FH ;delete ESC: EQU 1BH ;escape character LF: EQU 0AH ;line feed ; ; ; Define line length & warning location ; ELINE: EQU 52 ;end of terminal line EWARN: EQU 47 ;place to start wrap ; ; ;s if OxGate system RBBS: EQU yes ;yes if RBBS system CPM: EQU NO ;if none of these being used ; ; IF BELTOG KILBEL: EQU 3BH ;if BELTOG EQU YES, set to KILBEL address ENDIF ; IMSAI: EQU NO ;yes if IMSAI front panel ; IF IMSAI SENSE: EQU 0F Define operator acknowledge code ; ACK: EQU ESC ;respond to page by hitting an escape QUICK: EQU 'C' ;starts chat [jumps to chat loop] ; ; ; Define number of alert attempts ; IF NOISY ALERT: EQU 25 ;thirty if noisy ENDIF ; IF NOT NOISFH ;Front panel port address. SSOPAV: EQU 010H ;Bit to check for operator available ENDIF ; ;======================================================================= ; ; Pick either one or neither of the below, NOT both... ; ASKNAM: EQU no ;yes ifY ALERT: EQU 11 ;yell 11 times ENDIF ; ; ; Define DELAY loop value (the larger the value, shorter the delay...) ; IF NOISY DELAYV: EQU 64350 ;(1 second between bells) ENDIF ; IF NOT NOISY DELAYV: EQU 47000 ;few secs between bells  ask user's name before paging... GETCALR:EQU YES ;yes to enable feature to get name from LASTCALR ; ; ; Define drive and user area if GETCALR is set to YES ; IF GETCALR LASTUSR:EQU 0 ;user area of LASTCALR LASTDRV:EQU 'A' ;Drive of LASTCALR fileENDIF ; ; ; BDOS equates ; BASE: EQU 0 ;start of CP/M memory area BDOS: EQU 5 ;BDOS call address FCB: EQU 5CH ;CCP file control block DMAADR: EQU 80H ;Default DMA buffer address ; ; ; BDOS functions ; PRINT: EQU 9 ;print string function S  ELDSK: EQU 14 ;select disk FOPEN: EQU 15 ;file open FREAD: EQU 20 ;file read RTNDSK: EQU 25 ;return current disk SETDMA: EQU 26 ;set dma address SETUSR: EQU 32 ;get/set user number ; IF MPMPRL ORG BASE ENDIF ; IF NOT MPMPRL ORG BASE+100f he is ' DB 'not around',CR,LF,'you will be returned to CP/M. ' DB '(Use CTL-X to abort the alert ',CR,LF,'before then.) ' DB 'If the operator is available you will enter the ',CR,LF DB 'CHAT mode and will be able to type with him.',0 JMP EXITH ENDIF ; ;======================================================================= ; ; Program starts here ; ;======================================================================= ; START: LXI H,0 DAD SP ;get old stack pointer SHLD STAC ; ; ; Print signon message ; CHAT: CALL ILPRT DB CR,LF,'CHAT v3.4',0 ; IF BELTOG ;Console Bell Toggle Key? LDA KILBEL ORA A JNZ NOHERE ;if bell's off.. not here... ENDIF ;BELTOG ; IF IMSAI IN SENSE ;Have front panel, go checK ;save it LXI SP,STACK ;set new stack pointer ; ; ; Initialize jumps to CBIOS for direct I/O ; LHLD BASE+1 ;get pointer to CBIOS LXI D,3 ;ready for add DAD D ;HL = constat vector SHLD CSTAT+1 ;modify jump DAD D ;HL = CONIN vector Sk the switch ANI SSOPAV JZ NOHERE ;Not set, not here. ENDIF ;IMSAI ; LDA FCB+1 ;if it was quick mode, just sign-on CPI QUICK ;and drop right to the chat loop JNZ WHO CALL ILPRT ;turn up a new line DB CR,LF,0 JMP CRLF ;now go chatHLD CONIN+1 ;modify jump DAD D ;HL = CONOUT vector SHLD CONOUT+1 ;modify jump ; ; ; Check command parameters for help request ; LDA FCB+1 ;look at start of command line CPI QUICK ;if quick character requested then JZ CHAT ;sign on, and t ; ; ;Get caller's name from LASTCALR, user or not at all ; WHO: IF CPM22 AND GETCALR MVI E,0FFH ;get current user # MVI C,SETUSR CALL BDOS STA CURUSR ;save current user MVI E,LASTUSR MVI C,SETUSR ;set user of LASTCALR CALL BDOS ENhen jump to loop CPI ' ' ;no argument? JZ CHAT ;if no argument, then do normal chat ; ; ; Otherwise, help the poor confused fellow... ; CALL ILPRT DB CR,LF,'CHAT v3.4 - 01/01/84',CR,LF,CR,LF DB 'This will attempt to alert the operator. IDIF ;CPM22 AND GETCALR ; IF GETCALR MVI C,RTNDSK ;get current disk CALL BDOS STA CURDSK MVI E,LASTDRV-'A' ;set drive of LASTCALR MVI C,SELDSK CALL BDOS LXI D,LFCB ;open LASTCALR MVI C,FOPEN CALL BDOS INR A ;Check if file not fou  nd (FFh) JZ UNDO ;if not found, don't complain, Zflag set LXI D,DMAADR MVI C,SETDMA ;make sure DMA is default addr CALL BDOS LXI D,LFCB MVI C,FREAD ;fill default buffer CALL BDOS ORI 0FFH ;Make sure the Zflag is clear ENDIF ;GETCALR IF OXGATE OR MBBS LDA SECND ORA A JNZ CLOOPE ;MBBS & OxGate need to stop at the 2nd ',' MVI A,1 STA SECND ENDIF ;MBBS OR OXGATE ENDIF ;GETCALR ; IF GETCALR MVI A,' ' NOCO: PUSH H MOV C,A CALL CONOUT POP H INX H JMP CL ; ; ; If the file open was not successful, the Zflag is set. We still need ; to return to the current disk and user ; UNDO: IF GETCALR PUSH PSW ;Save it for for later ENDIF ;GETCALR ; IF CPM22 AND GETCALR LDA CURUSR ;restore currentOOP ; CLOOPE: CALL ILPRT DB '...',0 JMP CHAT1 ;done ; LFCB: DB 0 ENDIF ;GETCALR ; IF GETCALR AND (NOT MBBS) DB 'LASTCALR ' ;file containing name of last caller ENDIF ;GETCALR AND (NOT MBBS) ; IF GETCALR AND MBBS DB 'LASTCAL user MOV E,A MVI C,SETUSR CALL BDOS ENDIF ;CPM22 AND GETCALR ; IF GETCALR LDA CURDSK ;restore current disk MOV E,A MVI C,SELDSK CALL BDOS POP PSW ;Was the file open successful?... JZ CHAT1 ;..No, so skip the rest of this stufRBBS' ENDIF ;GETCALR AND MBBS ; IF GETCALR DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 SECND: DB 0 CURDSK: DB 0 ENDIF ;GETCALR ; IF CPM22 AND GETCALR CURUSR: DB 0 ENDIF ;CPM22 AND GETCALR ; IF ASKNAM CALL ILPRT DBf ENDIF ;GETCALR ; IF GETCALR AND (NOT MBBS) LXI H,DMAADR ENDIF ;GETCALR AND (NOT MBBS) ; IF GETCALR AND MBBS LXI H,DMAADR+11 ENDIF ;GETCALR AND MBBS ; ; ; CLOOP is a bit more complex because of SIGNON*. The SIGNON* system ;  CR,LF,'Your name, please? (optional): ',0 ; GLOOP: CALL CONIN CPI CR JZ CHAT1 ;CR, end of name CPI BAKSP JZ BACK0 ;BS, erase previous char. CPI DEL JZ BACK0 ;DEL, erase previous char also.. CPI CTLC JZ EXIT ;CTL-C or CPI ABORT JZplaces additional information into LASTCALR, which need not be ; presented to the caller. (* OxGate, too) ; IF GETCALR CALL ILPRT DB CR,LF,'Hold on, ',0 ; CLOOP: MOV A,M CPI CR JZ CLOOPE ;found end of file CPI ',' JNZ NOCO ;  EXIT ;CTL-X, abort CPI ' ' JC GLOOP ;CTL-character, ignore it MOV C,A CALL CONOUT ;else echo it.. LDA LCNT INR A ;increment line count (for BACK0) STA LCNT JMP GLOOP ;keep looping ; BACK0: CALL BACKIT ;do BS,SPACE,BS JMP GLOOP    ENDIF ;ASKNAM ; CHAT1: CALL ILPRT ;print: DB CR,LF,'Will page operator, use CTL-X to abort.' IF MEASURE DB CR,LF,'|-------------------|',CR,LF,0 CALL START1 ENDIF ;MEASURE ; DB CR,LF,'Ringing ',0 ; ; ; Attempt to alert operator ;DB ' message system...',0 ENDIF ; JMP EXIT ;exit to CP/M ; ; ;======================================================================= ; ; Routines start here ; ;======================================================================= ; ; B START1: call ilprt db cr,lf,0 mvi b,9 starta: push b CALL ILPRT ;print bell, period, space DB BELL,'. ',0 CALL DELAY ;wait... pop b LDA CNT ;get attempt counter DCR A ;done with alert attempts? STA CNT ;save new count ora ackspaces one column, first erasing the current character ; BACKIT: LDA LCNT ;get character count DCR A ;subtract one because of backspace RM ;dont go past zero STA LCNT ;save new count CALL ILPRT ;print DB BAKSP,' ',BAKSP,0 RET ;conta JNZ STARTa ;not done with attempts, do more push b call ilprt db cr,' ', cr,0 pop b mvi a,15 sta cnt mov a,b dcr a mov b,a ora a jnz starta ; ; ; ; Operator did not answer ; NOHERE: CALL ILPRT inue looping ;..... ; ; ; Conversation routine - uses direct CBIOS I/O to prevent control char- ; acters from being echoed. ; CONT: CALL CONIN ;get console input with no echo CPI ABORT ;CTL-X? JZ EXIT ;yes, exit to CP/M CPI CTLC ;CTL-C? ;print: DB CR,LF,CR,LF,'Sorry, operator is not available - ' ; IF CPM DB 'back to CP/M...',0 ENDIF ;CPM ; IF NOT CPM DB 'please leave your message',CR,LF,'on the ' ENDIF ; IF CBBS DB 'CBBS' ENDIF ; IF DATA DB 'DataTech'JZ EXIT ;yes, exit to CP/M CPI CR ;carriage return? JZ CRLF ;yes, send CRLF CPI BAKSP ;backspace? JZ BACK1 ;yes, do backspace space backspace CPI DEL ;delete? JZ BACK1 ;yes, treat like backspace CPI ' ' ;space or above? if not, JC C ENDIF ; IF METAL DB 'METAL' ENDIF ; IF MINCBBS DB 'MINICBBS' ENDIF ; IF ORACLE DB 'Oracle' ENDIF ; IF OXGATE DB 'OxGate' ENDIF ; IF RBBS DB 'RBBS' ENDIF ; IF MBBS DB 'MBBS' ENDIF ; IF NOT CPM ONT ;it's a CTL-character, continue looping MOV C,A ;else, save char in C (also for CBIOS) LDA LCNT ;check count CPI EWARN ;near end of line limit? JC CHROK ;no, char ok... MOV A,C ;get character CPI ' ' ;space? JZ CRLF ;yes, then wor  d wrap LDA LCNT ;no, check line count agin.. CPI ELINE ;at end of line? JNZ CHROK ;not at end of line, char ok MVI C,BELL ;else, CALL CONOUT ;ignore char, beep.. JMP CONT ;and continue ; CHROK: CALL CONOUT ;send character to console er has cold feet? JZ EXIT ;yes? then go back to CP/M CPI CTLC ;used to using CTL-C to quit? JZ EXIT ;ok, then back to CP/M CPI ACK ;was it the right answer? JNZ DELAY3 ;if not, keep timing ; ; ; Operator is present ; LXI SP,STACK ;fix LDA LCNT ;get character count INR A ;increment counter STA LCNT ;save new count JMP CONT ;continue looping ; CRLF: CALL ILPRT ;print: DB CR,LF,0 XRA A ;zero character counter STA LCNT JMP CONT ;continue looping ; BACK1: CALL BACKITstack CALL ILPRT ;print: DB CR,LF,CR,LF DB 'Operator is available, please go ahead...',CR,LF DB '(Use CTL-X to exit and return to CP/M)',CR,LF DB CR,LF,0 JMP CRLF ;now in chat mode ; EXIT: CALL ILPRT DB CR,LF,0 ; EXIT1: LHLD STACK ; ;BS, space, BS JMP CONT ;continue looping ;..... ; ; ; CBIOS routines for console status, get character and show character ; CSTAT: JMP $-$ ;modified at init ; CONIN: JMP $-$ ;modified at init ; CONOUT: JMP $-$ ;modified at init ; CNT: get old CP/M (or MP/M) stack SPHL ;restore old stack pointer RET ;return to CCP ;..... ; ; ; Inline print routine ; ILPRT: XTHL ;save HL, generate message ; ILPLP: MOV C,M ;get character PUSH H CALL CONOUT ;output it POP H INX HDB ALERT ;alert counter LCNT: DB 0 ;line position counter ; ; ; Delay routine to wait between beeps ; DELAY: MVI B,CLOCK ; DELAY1: LXI H,DELAYV LXI D,1 ; DELAY2: PUSH H ;save the values, consume some time PUSH D PUSH B CALL CSTAT ;get ;point to next character MOV A,M ;test ORA A ;...for end JNZ ILPLP XTHL ;restore HL, return address RET ;return past message string ;..... ; ; end of routines ;=======================================================================  console status ORA A ;char ready? JNZ DELAY4 ;let's check it out... ; DELAY3: POP B ;restore the values POP D POP H DAD D JNC DELAY2 DCR B JNZ DELAY1 RET ;finished this time ; DELAY4: CALL CONIN ;get character CPI ABORT ;us ; DS 64 ;room for 32 level stack STACK: DS 2 ;old CP/M (or MP/M) stack saved here ; IF MPMPRL DB 0 ;force allocation of storage space ENDIF ; END START DS 2 ;old CP/M (or MP/M) stack saved here ; IF MPMPRL DB 0 ;force allocatio!  HAT34.ASM CRC = 88 37 --> FILE: PWDS . CRC = B1 8C --> FILE: RBSUTIL .COM CRC = EF 8A --> FILE: RBSUTL35.ASC CRC = 2F 06 --> FILE: TWIT . CRC = 9C 1C --> FILE: USERS . CRC = F0 52 ---------------------> SUM OF CRCS = E0 08 C CRC = 2F 06 --> FILE: TWIT . CRC = 9C 1C --> FILE: USERS . CRC = F0 52 ---------------------> SUM OF --> FILE: -FOG/HAK.021 CRC = 00 00 --> FILE: /HAK#021.DOC CRC = 2B C0 --> FILE: INFO . CRC = 44 AC --> FILE: MENURBBS. CRC = C0 2D --> FILE: NEWCOM . CRC = 6D 3B --> FILE: NEWS . CRC = 5D 73 --> FILE: OZC"  #  $  %  &  '