IMD 1.16: 28/05/2007 16:39:53 -FOG/UTL017         VMAP BAS<VMAP DOCFMAP COMDISK DOC XCOPY COM SAFRAM AQMK SAFRAM DOC8SAFRAM2 COMLRUN COM LU DOC1 !"LU111 COM #$%&'()*+-FOG/UTL017XCOPY AQM,-10 'VMAP.BAS VERSION 1.1 20 ' 30 '------------------------------------------------------------- 40 'INITIALIZATION SEGMENT 6/25/82 50 ' 60 FF$=CHR$(12): 'FORMFEED 70 WIDTH 64 80 PRINT FF$: FOR I=1 TO 1000: NEXT: REM SLOW TERMINALS DELAY 90 K=120: DIM K$(200) :'NUMBER OF BASIC COMMANDS IN DATA FILE 100 M=80: 'MAX NUMBER OF VARIABLES (CAPACITY) 110 DIM H(9), I(200), J(200) 120 DIM V$(100), NL%(100), LL%(100,50), PA%(100) 130 FOR I=1 TO K: READ K$(I): NEXT I: 'LOAD DATA K$ 140 ' 150 '------------  ---------------------------------------------- 160 'BATCH BUILD SEGMENT, 07/26/81, JWC 170 ' 180 INPUT "PROCESS LAST SETUP (Y/N) ";I$: IF I$="Y" THEN GOTO 270 190 PRINT 200 OPEN "O",#1,"VARDAT" 210 INPUT"FILE NAME ";PN$ : INPUT"BEGIN LINE NUMBER ";LSE PRINT:PRINT: PRINT "HIT RETURN WHEN READY FOR LISTING ON CRT "; 470 I$="": I$=INKEY$: IF I$="" GOTO 470: 'CONSOLE OUTPUT 480 PRINT:PRINT:PRINT"LIST OF VARIABLES FOR PROGRAM ";PN$:PRINT 490 FOR I=1 TO NF 500 PRINT V$(I);TAB(15);"-"; 510 FOR J=0 TLB! :INPUT"END LINE NUMBER";UB! : INPUT"DO YOU WANT A PRINTOUT (Y/N)";PT$ : INPUT"DO YOU WANT TO PROCESS ANOTHER PROGRAM (Y/N)";I1$ 220 PRINT#1,PN$;",";LB!;",";UB!;",";PT$;",";I1$ 230 IF I1$<>"Y" THEN CLOSE: GOTO 290 240 PRINT: GOTO 210 250 ' 26O NL%(PA%(I))-1:IF J THEN PRINT", "; 520 PRINT FNA$(LL%(PA%(I),J)+32767!); 530 NEXT J 540 PRINT:PRINT:NEXT I 550 GOTO 770 560 CLOSE #2 570 IF I1$<>"Y" THEN PRINT:PRINT"*** END OF VARIABLE MAP PROGRAM ***":END 580 PRINT "HIT ANY KEY TO CONTINUE" 5900 '---------------------------------------------------- 270 'MAPPING SEGMENT FOR BASIC FILES, 07/27/81, JWC 280 ' 290 RESTORE 300 PRINT FF$: FOR I=1 TO 1000: NEXT: REM SLOW TERMINALS DELAY 310 OPEN "I",#1,"VARDAT" 320 IF EOF(1) THEN CLOSE: END 330 P I$="": I$=INKEY$: IF I$="" THEN 590 600 GOTO 330 610 IF PT$="Y" THEN 330 620 ' 630 '----------------------------------------------- 640 'PRINTER ROUTINE 650 ' 660 LC=0: GOSUB 890:LPRINT TAB(55);"LINES";NL+32767!;"TO"; N+32767!:LPRINT:LC=LC+2 670RINT:PRINT:PRINT"ONE MOMENT FOR SETUP PLEASE.......":PRINT 340 FOR I=1 TO M:PA%(I)=I:NEXT I: 'COUNT 1 TO 80 PA% 350 DEF FNA$(A)=MID$(STR$(A),2) 360 INPUT#1,PN$,LB!,UB!,PT$,I1$ 370 PN$=PN$+".BAS" 380 OPEN "I",#2,PN$ 390 PRINT:PRINT"*** LINES BEING PRO FOR I=1 TO NF: LPRINT TAB(5); STR$(I);".";TAB(11);V$(I); TAB(20);"-";: B=0 680 FOR J=0 TO NL%(PA%(I))-1 690 IF J THEN LPRINT ", ";: B=B+1: IF B=10 THEN B=0: LPRINT:LC=LC+1:LPRINT TAB(20);"-"; 700 LPRINT FNA$(LL%(PA%(I),J)+32767!); 710 NEXT J 720 LCESSED:": 400 IF EOF(2) THEN 440: 'END OF SOURCE FILE FINISH PROCESSING 410 S=0:H=0:O=0:IN%=0:Q=0:LINE INPUT#2,L$ 420 GOSUB 940 430 IF N+32767!60 THEN GOSUB 840:GOSUB 850:LPRINT:LC=LC+1 740 NEXT I 750 ' IF LC>50 THEN GOSUB 840:GOSUB 850:LPRINT:LC=LC+1 760 LPRINT FF$: FOR I=1 TO 1000: NEXT: 'SLOW TERMINAL DELAY 770 GOTO 560: IF PT$="Y"THEN LPRINT:LPRINT"EQUIVAL  ENT VARIABLES":LC=LC+2ELSE PRINT: PRINT "EQUIVALENT VARIABLES": 'DELEATED NOT WORKING 780 V$="$(!(#(%(" 790 FOR I=0 TO NF-1:FOR J=I+1 TO NF-1 800 IF LEFT$(V$(I),2)<>LEFT$(V$(J),2) OR LEFT$(V$(I),2)="FN" THEN 840 810 ON ERROR GOTO 1670 820 IF(INSTR(VAND X<=57)OR(X=>65 AND X<=70) THEN 1150 ELSE H=0:S=0:GOTO 1060 1030 IF O THEN IF(X=>48 AND X<=57)THEN 1150 ELSE O=0:S=0:GOTO 1060 1040 IF X=72 AND NOT H THEN H=-1:GOTO 1150 1050 IF X=79 AND NOT O THEN O=-1:GOTO 1150 ELSE S=0:H=0:O=0 1060 IF X=34 THEN $,RIGHT$(V$(I),2))<>INSTR(V$,RIGHT$(V$(J),2)))OR (INSTR(V$,RIGHT$(V$(I),1))<>INSTR(V$,RIGHT$(V$(J),1))) THEN 840 830 GOSUB 1230: IF PT$<>"Y"THEN PRINT V$(I);"=";V$(J) ELSE LPRINT V$(I);"=";V$(J):LC=LC+1 840 NEXT J:NEXT I 850 IF J>0 THEN IF PT$=IF Q THEN Q=0:V$="":GOTO 1150 ELSE Q=-1:GOTO 1150 1070 IF Q THEN 1150 1080 IF X=39 THEN RETURN: 'REMARK 1090 IF X=38 THEN S=-1:GOTO 1150 1100 IF(X=>48 AND X<=57) OR (X=>65 AND X<=90) OR (X=35 OR X=33 OR X=36 OR X=37) THEN IF V THEN V$=V$+X$: GOTO 1150"Y" THEN LPRINT"** NONE FOUND **":LC=LC+1 860 IF J>0 THEN PRINT"**NONE FOUND**" 870 GOTO 560 880 FOR IK=LC TO 65: LPRINT: NEXT IK: LC=0: RETURN: 'SKOP 890 LPRINT:LPRINT:LPRINT TAB(5);"LIST OF VARIABLES FOR PROGRAM" ;PN$;:LC=LC+3: RETURN: 'DELETED FF$ ELSE V$=X$:V=-1: GOTO 1150 1110 IF X=40 AND V THEN V$=V$+X$ 1120 IF NOT V THEN 1150 1130 GOSUB 1200:V=0 1140 IF R THEN RETURN 1150 NEXT I:IF NOT V THEN RETURN 1160 ' 1170 '------------------------------------------------------ 1180 'KEYWORD COMPA 900 ' 910 '------------------------------------------------------------- 920 'VARIABLE SEARCH SUBROUTINE 930 ' 940 R=0:V=0:X=INSTR(L$," "):N=VAL(LEFT$(L$,X))-32767!: S$=MID$(L$,X+1) 950 IF N+32767!>UB!THEN RETURN 960 IF N+32767!0 OR LEFT$(V$,1)="0"THEN V$=MID$(V$,2):GOTO 1210 1220 FOR J=1 TO K:Y=INSTR(V$,K$(J)):IF Y=0 THEN 1270 1230 IF V$=K$(J)THEN RETURN: 'KEY WORD 1240 IF LEFT$(V$,LEN(K$(J)))=K$(JE PRINT:PRINT L$: PRINT TAB(5);:IF NOT XN%THEN XN%=-1:NL=N 970 IF LEFT$(S$,1)=" "THEN S$=MID$(S$,2):GOTO 970 980 IF INSTR(S$,"DATA")=1 THEN RETURN 990 FOR I=1 TO LEN(S$) 1000 X$=MID$(S$,I,1):X=ASC(X$) 1010 IF NOT S THEN 1060 1020 IF H THEN IF(X=>48 )THEN V$=MID$(V$,LEN(K$(J))+1):GOTO 1200 1250 IF RIGHT$(V$,LEN(K$(J)))=K$(J) THEN V$=MID$(V$,1,LEN(V$)-LEN(K$(J))):GOTO 1200 1260 VH$=MID$(V$,Y+LEN(K$(J))):V$=LEFT$(V$,Y-1): GOSUB 1200:IF R THEN RETURN ELSE V$=VH$:GOTO 1200 1270 NEXT J 1280 IF V$="(  "OR V$=""OR V$="!"OR V$="%"OR V$="#"THEN RETURN 1290 IF IN%THEN PRINT";";:ELSE IN%=-1 1300 IF NF=0 THEN 1370 1310 FOR J=0 TO NF 1320 IF V$<>V$(J)THEN 1350 1330 IF LL%(J,NL%(J)-1)=N THEN RETURN 1340 IF NL%(J)<80 THEN LL%(J,NL%(J))=N:NL%(J)=NL%(J)+1: INSTR,LEFT$,MERGE,MOUNT,TROFF,USING 1580 DATA TRON,CDBL,CHR$,CINT,CONT,CSNG,DSKF,EDIT,ELSE,GOTO,KILL,LINE 1590 DATA LIST,LOAD,LPOS,LSET,MID$,MKD$,MKI$,MKS$,NAME,NEXT,NULL,OPEN 1600 DATA PEEK,POKE,READ,RSET,SAVE,SPC,(,STEP,STOP,STR$,SWAP,TAB(,THEN,WAIT PRINT V$;",<";FNA$(NL%(J));">";:RETURN 1350 NEXT J 1360 IF NF=M-1 THEN PRINT:PRINT"OUT OF ROOM FOR VARIABLES, "; "CONTINUE NEXT RUN...":GOTO 440 1370 PRINT V$;",[";FNA$(NF+1);"]"; 1380 V$(NF)=V$:LL%(NF,NL%(NF))=N:NL%(NF)=NL%(NF)+1:NF=NF+1 1390 RETURN1610 DATA ABS,AND,ASC,ATN,COS,CVD,CVI,CVS,DEF,DIM,END,EOF,ERL,ERR,EXP,FOR 1620 DATA FRE,GET,INP,INT,LEN,LET,LOC,LOF,LOG,MOD,NEW,NOT,OUT,POS,PUT,RND 1630 DATA RUN,SGN,SIN,SQR,TAN,USR,VAL 1640 DATA AS,IF,TO,ON,OR,EQV,WIDTH,TAB,@,@: REM 120 1660 ' 1670 I 1400 ' 1410 '----------------------------------------------------------- 1420 'SORT SUBROUTINE 1430 ' 1440 H(1)=1: H(2)=4: H(3)=13: T=1 1450 IF H(T+2)<5000 THEN T=T+1:H(T+2)=3*H(T+1)+1:GOTO 1450 1460 IF NF=0 THEN RETURN ELSE FOR T=1 TO 6:IF H(T+2)<F ERR=13 THEN PRINT:PRINT:PRINT "**** NO VARIABLES FOUND *****":PRINT:GOTO 560 1680 PRINT"ERROR CODE IS ";ERR;" ON LINE NUMBER ";ERL;:PRINT:END PRINT:PRINT "**** NO VARIABLES FOUND *****":PRINT:GOTO 560 1680 PRINT"ERROR CODE IS ";ERR;" ON LINE NUMBERNF THEN NEXT 1470 FOR S=T TO 1 STEP -1:H=H(S):FOR JJ=H TO NF 1480 V$=V$(JJ):PA%=PA%(JJ):FOR II=JJ-H TO 0 STEP -H 1490 IF V$). Only ascii Basic source file can be used, since all source is saved in machine code. Once the file(s) is saved in ascii, run VMAP. +FMAP V2.3 - 12/07/81 FMAP H for help $!9" 1 :]HE:^ ʀ :\2H b<2I :\=_>?2\!mS ~# o:u2 U… ͊ !]~   6?#™>?2h͹<» ++NOT FOUND$:S B  FILENAME TYP EX RC #K EXTENTS...$͹<0 Supply the answer to the prompt for file name, terminator (see appendix A), lower bound of the statement number to map, and the upper bound of the statement number to map. When the terminator is suppied as "END", the program begins to ma*F :  w#w#"F *N #"N *N DM! s#r#{_zW x;*N "P |]}=ʐ2R *P +" "P |ʐ! n ##* +" |s:R ]ͣ! "F :S ʢBʢ/ʢLʢ:S UY:T  ++ "U" OPTION REQUIRES VOLUME NUMBER AS IN "U23" OR "U123"$  :V *T "U >02T !` p  ~# :T 2 2' 2A 2x :U 2 2( 2B 2y :V 2 2) 2C 2z :H 2o :I =_o o <’ ++CAN'T MAKE NAMES FILE$:S U¢! eͱ *F ^#V#"F U 2K : S:S DP̈́:S M̈́͝:S LUù$_ > ͟  ~`x>.`#"> `>?`_N7SY4> `> `_!v~0$ >1 > >$ >2 :S P> >$ >3 ~ {#±> {> {> {:S B / o  ) U z!T ͱ!Y v:S K2K ͱY ͱ:S LD=P@͝:S KP>, a :S /~aF###~{xgya~=#:S /: ʆ͊®>-{ʗ* z>,{Ìî!yv:S /:J <2J >|{> { ![ :S K 2K ͱ![ 60#60#60*F ++^#V! F~G!] vB mM *N +|7*F ++^#V#N#F 7#l >*N +"N *F ##"F  }¹ *4~2 #~2 #~2 #~2 #~2 #~2   ~# x :I =_* :S /2J *N +"N |¢:S +BB/BLB>F2S :S BB B/B>$2v :S ʨ Bʨ /ʨ Lʨ 2K > 1 o è FILES, K $͓" :S Bz*m |=ҳ: >?{>?{4^#: V#" ͓: : z|  B/ // L/ :K / *k ~$ > w#"k }1 o P ++WRITE ERROR$!"k >. þ> > þ^#V#N#F #w ! ͉ ~{#~‰ >2R N#F#^q#Vpr+s:S B ! ͉ *m * #2{+|  þ $ Bit map: FMAP by Ward C. Help: p ))))xyO{x* & : |g}o=(: B)==|J} ++ ERROR COMPUTING #K - MORE THAN 255K/EXTENT$O! ~ʛx›!=ʛ)Ñ DM* #DM*F "m T] : 60# x¼: W: _*m )>1| ++ Insufficient room for tableFMAP fn.ft [option][.suboption] fn.ft: ? and * allowed. Opt Console out? To disk as: Usage: --- -------- -------------- -------- / Y (across) B Y + bit map D Y $1 $2fn.ft $3 for SUBMIT F Y fn.ft UCAT input K fn.ft nnK L Y + seq# + #s or bit map ++$!v~# 80ڀ :Ҁ xGG x2M aGmG Q Oxgþp y0_:S FʘBʘ/ʘLʘ ̟: P{  :L O>2L \!o~ʹ: U:M ¹#] ?#K M N $1 $2 $3fn.ft SUBMIT MODEM Q N fn.ft P N $1 $2fn.ft$3 SUBMIT PIP Unnn Users group catalog nnn to -CATALOG.nnn Suboptions: .S selects names as listed; .P output to printer; .Unn selects only user nn VOLUME~___ DESCRIPTION: N  UMBER SIZE NAME COMMENTS CATALOG.___ CONTENTS~OF~CP/M~VOL.~___ / . 1 000K -CATALOG000NAMES SUBoptions: ay withdraw individual files from the library. If the library contains .COM command files, these may be run using LRUN. To use, place LU111.COM or LRUN.COM in drive A. At the A> prompt, type LU111 or LRUN Read LU.DOC for instructions. When executed without parameters as illustrated above, LRUN displays a summary of helpful information. SAFRAM allows you to protect an area of high memory from being overwritten. Place SAFRAM2.COM in drive A. At the A> prompt, type SAFRAM2 Refer to SAFRAM.DOC for further information. FMAP, submitted by Gale Rhoades of FOG, displays information about your disk directory or will perform a variety of other functions. It is a newer version of FMAP found on -FOG/UTL.002. To use, place FMAP.COM in drive A. At the A> prompt, type FMAP H for help information, or type FMAP filedscr for directory information, where filedscr may include wildcards. VMAP is an MBASIC program which will prepare a cross-reference  DISK.DOC -FOG/UTL.017 First Osborne Group (FOG) Utility Disk This disk contains the library utility LU, which permits you to pack many small files into one larger library file. Similarly, you mof variables used in another MBASIC program. First, the program to be cross-referenced must be saved in ASCII mode. Place the program to be cross-referenced along with VMAP.BAS in drive B and MBASIC.COM in drive A. At the A> prompt, type B  : At the B> prompt, type A:MBASIC At the MBASIC Ok prompt, type LOAD "program" SAVE "program",A where program must be capitalized and the quotation marks are required. Then type RUN "VMAP" The program is self-prompting. Also ;BY 128 LD (BDMA),HL ;STORE NEW DMA ADR EX DE,HL ;GET IT IN DE REGS. LD C,DMAF ;RESET DMA TO NEXT ADDRESS CALL BDOS RET ;IF FILE PRESENT, SET UP DMA FOR READ/WRITE SETDMA LD DE,BUFF ;USER DMA LD (BDMA),DE ;STORE BUFF ADDRESS LD C,DMAF, refer to VMAP.DOC. XCOPY, submitted by Jim Schenkel of FOG, will copy files from one disk to another using a single drive. Place XCOPY.COM in drive A. At the A> prompt, type XCOPY for helpful information, or type XCOPY d:filename. ;ALL READ/WRITE OPS CALL BDOS ;START AT DMA XOR A ;CLEAR A LD (FCB+32),A ;ZERO "CR" IN FCB RET *STORAGE AREA HOWDY DB CR,LF,'XCOPY SINGLE-DISK DRIVE COPY UTILITY' DB CR,LF,' (JS version 7/23/82)' DB CR,LF,'Gives WEIRD results with typ where d: is the drive to be used and filename.typ is the file to be copied. If d: is missing, the logged drive will be used as the source drive, and the file will be copied to drive A. Squeezed assembly language .AQM files may be unsqueezefiles over 16k bytes',CR,LF,LF,'$' NOFL DB CR,LF,'++Cannot find the source file++' DB CR,LF,LF,'XCOPY requires a command of the form' DB CR,LF,LF,' XCOPY [X:]FILENAME.TYP' DB CR,LF,LF,'The drive designation is optional; if present, XCOPY' d using utilities found on -FOG/UTL.003, .004, and .014. Jim Woolley FOG Disk Librarian December, 1982  DB CR,LF,'will read from and write to the specified drive.' DB CR,LF,'If not present, XCOPY will read from the currently' DB CR,LF,'active drive and write to drive A.' DB CR,LF,LF,'$' NDISK DB CR,LF,'Insert the new disk and hit RETURN to continue.C,PRINTF ;PRINT MESSAGE CALL BDOS QUIT1 LD HL,(OLDSP) ;GET OLD STACK POINTER LD SP,HL ;PUT INTO SP RET ;RETURN TO CCP *SUBROUTINES ;ADVANCE DMA BY 128 BYTES (1 RECORD) XBUF LD HL,(BDMA) ;GET DMA ADDRESS LD DE,80H ;INCREMENT ADD HL,DE ' DB CR,LF,' (Any other key to abort.)',CR,LF,'$' BADIR DB CR,LF,'++No space in the directory++$' BADFL DB CR,LF,'++Bad write operation++$' DONE DB CR,LF,'End of copy operation.$' CLOSE DB CR,LF,'++Cannot close the file++$' OLDSP DS 2 ;O  LD STACK POINTER RCNUM DS 1 ;# OF RECORDS DS 40H ;PROGRAM STACK AREA STACK EQU $ BDMA DW BUFF ;START OF FILE MEMORY BUFF EQU $ ;START FILE BUFFER HERE END !9"51x27 \<<ʝ͸\>ͧ!74(m  ¢ \\<ʝ͸\ͧ!75ʋo\<ʝ *5*x"xzSx2| XCOPY SINGLE-DISK DRIVE COPY UTILITY (JS version 7/23/82) Gives WEIRD results with files over 16k bytes $ ++Cannot find the source file++ XCOPY requires a command of the form XCOPY [X:]FILENAME.TYP The drive designation is optional; if present, XCOPY will read from and write to the   specified drive. If not present, XCOPY will read from the currently active drive and write to drive A. $ Insert the new disk and hit RETURN to continue. (Any other key to abort.) $ ++No space in the directory++$ ++Bad write operation++$ End of copy operation.$ ++Cannot close the file++$zvsSAFRAM.ASMT   "!#$%&('o)*,+.-/0132456789:;<=>?@BACDFEGHIJLOMKNQRSP[5y9?{H+kzv-ǟ9!6OO:lwتcǖ{m&Jh%o3R=+ 4էA_uK=(fiN)R4V5i/sRjԖ1=&9O)LP5[:uğ=eL-nAY{˿4SK!a:{_OEe|v0p{S, ǢRc`]~Vb-c46J)x4CiW\@4/.SNeni26Y/^q}YF5FYqm2iiR6q{q ꗛQ1ƲKٚ=7w 4j)\z<{x,*[NVɮ0SX<R֚!iV)4=Pdl?c2-V1ZOH1LձDv S#[~u}fu&Tz 5kЯilnΧk+$=y_.k"3콢y;"]6$c1îiGr@=Aأƙr>E$Wv~zq]xlAҽuf˘km-cN$j0wyg' ;Aأ^Wv~vIVי]i g#- ;AأTxv3<]-Z5r*~]~#{eqjyZٵ;гZ~IǢX,x,*[=ŜZ!s=nc<r۫yYp[$Eقm]rc2/-c6x\ʍo廥"k 5=nxx,_XS3yqf4cXjIʕo4I#m'az xx,3[W&f??*WOT5m<ٔߒVi^Wr{G@xqk=ʋ*W;L{6}ہ<kxxfxƻ  5}i_pJo?Lp42]PG{hswK7b![p>;xxh|]Ep>_pʻ Ikq=4ww=VGHz{}X#=<-ݿY%{$if|z'F{<G܁!LXT˝&)5mZe0x,*[f~@3B-sFUi2z\!  Xkx\ʍ`CZU@8mN+<4w=9|GO{ܶ;k%b7S<<<r&4*|H#0cQzxh2rlwKM3`ن)&?`lFH!0|VQFښt1_檥y7[] xCq܁=9F\m!Xkbh>X _6*|H 5_N8@&#i7Y>Lpid*<n'6w Bׇ 5;Lqlw+lFHjf6nyzҚqp7zC|Fj&q&z\+^n d$.Fe"v{hs;=F{hs<<{id*Ze"42W 'Y[)jdl%[&.F!=n8NCcn[̖=X*!0#w t%fTEe0=nXM5fB]̗j)dv0^gEsn^?oFS[ZzxbzG^xgH[y2~ft{汨l=lnӢOYYv"iLd~J /yx42Jna{UJ42jm<ٔ7*^2m쁝Hnvy  /jmhbROy!)eDzEtZVj xXua{qSi<<*WOT~ŐKd^L#v峊K^~ x\1܁iV.mYP~6qliic<{&{V^dTq]vm=(ZFi;'GJna{q+zNz<<Oޓ0i(_lk;Ld_jKaǖ4dJ=ibmآX)] elzf%* safram.doc Roy Lipscomb * version 1.0 Aug 1, 1982 * * Secures CCP and relocated modules against destruction until * system reset. Operates as is with any standard CP/M-80. * * Copyright 1982 by Roy Lipscomb, Logic Associates, Chicago * Copyin{͞J1=jJna{X1[S)^pXCSO9CҚck64d74x\NSxI4pb^n쟚 &xwZ{˘m51 Ikb ż|ǥby 2+ib 6UJ42jm<ٔ7*^2m쁝HSAFRAM * Explicit mode: A>SAFRAM A000 * * * * CUSTOMIZING * * Customizing of SAFRAM.ASM is accomplished through several * variables: * * VARIABLE VALUE * -------- ----- * * BOOT 0 for standard CP/M * * NOTIFY "yes" for notification of what is * the currently secured address. ******************************************************************** * * ASSEMBLING * * This source uses the LINK pseudo-operation featured in * Ward Christensen's LASM.COM (available on RCPM's) and * its predecessor LINKASM.COM (available from CPM U* (Displayed at each warmboot.) * * HOTBOOT 0 if not active. Otherwise gives * displacement from start of bios to * the first instruction after the end * of the CCP/BDOS/BIOS-loading code. * * Used to bypass unnecessary reloading sers * Group as 36.11 and 36.12). This feature is used here to * link SAFRAM.ASM to itself, and thus introduce two * (partial) copies to the assembler. The two copies are used * by the resultant SAFRAM.COM to produce a relocatable module. * * If ne* of the CCP and BDOS, which are saved * by SAFRAM from being overlaid (with 99% * assurance: somewhere there may be * some unlikely program that ignores * location boot+6). * * (See document SAFRAM.H for more information on HOTBOOT.)ither of the above assemblers is available, this * source can be assembled in a more roundabout fashion. * * First, delete these three statements from the end of * SAFRAM.ASM: * * if not copy1 * link safram * endif * * Next, execute the follow * ******************************************************************** * * APPLICATION NOTES * * [] Self-relocating utility modules that will be protected by * SAFRAM should insure that they are not overlaying the CCP. * * [] When securing   a module that does not protect itself by changing * location boot+6, you should use the explicit-address mode * of SAFRAM. (See THEORY OF OPERATION above.) * * [] There is no option to individually "de-secure" a module. The * only way to nullify security is to press the reset button. * The de-securing option was deemed infeasible, since there is * no simple way to keep track of what patches may have been * intalled by any given trap module, so that they could be * reversed if the module were de-secured. * * [] To inspect the CCP using DDT (which normally overlays the CCP), * execute SAFRAM before invoking DDT. The CCP will be intact * after DDT has been loaded. * * [] It is sometimes desirable to secure DDT (for instance, for * use with BACK2DDT, available on RCPM's). Use this procedure: * * SAFRAM (to secure the CCP) * DDT SAFRAM.COM * -G (to secure DDT itself) * * (DDT may now be used in the normal fashion.) * * * (end)  * DDT SAFRAM.COM * -G (to  Abort: Valid address range at present is ....H through ....H. $Abort: unable to locate CCP $ SAFRAM Copyright 1982 by Roy Lipscomb, Logic Associates Version 1.0 Aug, 1982 Assigns safe partition (removed only by system reset) below BDOS. (Multiple executions of SAFRAM are permitted). [] To secure the CCP or the boot+6 address, type "SAFRAM". [] To secure a lower address, type "SAFRAM xxxx", where "xxxx" is address in hex.    $ $͉*̏!\!:^Ą!9|*"S*Y*Y*"Gb!¡ʃq!~ ҡ*# ڡ"!!@*!N  p#q#r#s0 ))))oBKW_|))))0:|/g}/o#."> ~5P#د*#^#V"/=7[#N*>o"*"*6ͥ*>o""ͽ:xʼ*T] }||!# xGO! * }|*!|͙**<LRUN Ver 1.0 Copyright (c) 1982 Gary P. Novosielski $!9" ͗*| Wfx ~#[![bxʓ {†~#o}oҏu33o!U"  ́q ¼![ ![ ![<!~4"6#s#r* s#r*t !zS,0:7w#!" !" !" e! " !" ! " e** *#^#V*  s#r*  s#ryÒW x~# Ùxʼ*T] }||!# xGO! * }|*!|͙**!~ > #*|*+E|9+!6[ 1 J^#V"#^#V" z/W{/_hXX!^#6#~ ʙ-°#JhJ~#»x2!N[!\JlJ * Correct sy>>2>2!":=$;O + (Safram at ....) $s#r*  s#ryÒW x~# Ùxʼ*T] }||!# xGO! * }|*!|͙**ntax is: LRUN [-] Where is the optional library name (Note the preceding "-". ) If omitted, the default command library is used. is the name and parameters of the command being run from the librar>>2>2!":=$;O + (Safram at ....) $>>2>2!":=$;O + (Safram at ....) $y, just as if a separate .COM file were being run. $ !hH#=Xr͏6# 6 #_6#h;ȷ#r#~+:~@##ͩ~.#yʣ Ùͩ#*ʼ ©>? ¾#~.,; :=<>ȷ͘Can't run under CP/M 1  .4͘Library not found$͘Name after "-" isn't a library$͘Command not in directory$͘No program in memory$͘Program too large to load$COMCOMMAND LBR   ...ABORTED.$ $ޭޭޭޭޭޭޭޭޭޭޭޭޭޭޭޭޭޭޭޭޭޭޭޭޭޭޭޭocument for any non-commercial purpose. Any use of this material for commercial advantage without prior written consent of the author is prohibited. INTRODUCTION Lubrary Utility (LU) is a program to allow c*>og)))))))y!,m*"2!"*}z+"*T] "!_*#",>2!"   BAD LOAD$$$$ SUBޭޭޭޭޭޭޭޭޭޭޭޭޭޭޭޭ D  ޭޭޭޭޭޭޭޭޭޭޭombining of multilple files into one larger file. It requires CP/M version 2.0 or higher to run. LU was developed as an alternative to the excellent ARCHIVE series of programs by Michael Rubenstein. The major differences are: LU  BAD LOAD$$$$ SUBޭޭޭޭޭޭޭޭޭޭޭޭޭޭޭޭ D  ޭޭޭޭޭޭޭޭޭޭޭ  BAD LOAD$$$$ SUBޭޭޭޭޭޭޭޭޭޭޭޭޭޭޭޭ D  ޭޭޭޭޭޭޭޭޭޭޭ was written mostly in the BDS implementation of the C language, with substantial reduction of object code size as compared with the ARCHIVE programs. The add, extract, delete, list/map, and reorganize functions are all combined in one object program of less than 20k. The directory information is stored in the same file as the data, or member files. The amount of space to be allocated to the directory must be specified by the user when a new library is created, but can be  Documentation for LU.COM and LRUN.COM This document applies to version 1.10 of LU.COM and version 1.0 of LRUN.COM. Copyright (c) 1982 Gary P. Novosielski All rights reserved. Permission is hereby granted to copy and distribute this dchanged when the file is reorganized. The size of each directory entry is 32 bytes, which means each four directory entries take up one sector of the library file. Currently only 16 bytes of each entry are used, with 16 bytes being reserved for   use with possible future enhancements. The directory itself uses one entry for control information, so the number of directory sectors needed for a library of m members is (m + 1) / 4, rounded up to the next whole number. The user need nory itself may have a partially wasted block at the end, and requires some space for directory information at the beginning, the net effect is usually a saving of total space. The best results are seen when many small files are combt be concerned with this discussion as directory size is calculated by the program. All directory sizes are input and output in terms of entries, each entry being a potential member file. The program adjusts directory size to an integral number of ined into one library. Second, a library file makes most efficient use of the CP/M disk directory, since it is treated as only one file by CP/M regardless of how many members it contains. Third, libraries can aid in transferring packages sectors. LRUN.COM is a small (12 sector) program which allows running a .COM (object code) file member directly from any library, without having to extract it to a separate disk file. Page 1 82-08-07 Docuof software from one system to another using XMODEM. Only one file is transferred, eliminating the need to run the XMODEM transfer program several times, the chance of overlooking a needed file, and the problems of naming conflicts, (such as READmentation for LU.COM and LRUN.COM WHY USE LIBRARIES? First, a library file usually takes up less space than the total of the individual member files which went into it. The reason for this is that CP/M allocates dis.ME files) among unrelated packages. WHY NOT USE LIBRARIES? There are some very good reasons for not using libraries. For one thing, files within a library are not available to most "normal" programs. If k space in fixed blocks or groups, typically 2k bytes each. Any space after the last sector of a file up to the next 2k block boundry is wasted. The same files in a library use only the number of sectors they actually need, and though the libraa frequently accessed file is placed in a library, it will have to be extracted from the library to its free-standing counterpart before it can be used by a program. (.COM files are a notable exception to this, because of the availability   of the LRUN command, covered later.) Libraries can actually waste disk space. When a disk file is erased, CP/M returns the space formerly used by the file to the free space pool for use by new files. When a member file is deleted fro the XSUB facility are also supported for more advanced applications. All the methods make use of similar syntax. Command input takes two forms: operators (sometimes called tags, or options) and operands. An operator is defined as m a library however, the space previously occupied by the file is not useable. The library must be reorganized to make this space available to CP/M. While this is easy to do with the LU command, it is not automatic, and if the situation is i any two character string where the first character is a minus sign. Operators tell the program what to do. Valid operators are -a, -d, -e, -l, -o, and -r. Anything else with a similar form is an operator too, but an invalid one. Operands argnored, large areas of disk can be tied up as unproductive "dead space". Page 2 82-08-07 Documentation for LU.COM and LRUN.COM HOW TO USE THE LIBRARY UTILITY LU has two basic methods of operae everything else. Normally, operands are file names which you want to add to, delete from, or extract from a library file, or are names of library files to be opened. They may contain the characters * or ? in which case they are called ambiguoustion: interactive, and parameter driven. Use of the interactive method is probably the best way to get to know the program, because the effect of each action can be immediatley seen. To start an interactive library maintenance session, just type  operands. Some valid operands are: foo.bar b:test.fil z *.* comm?nd etc. To refer to a file named "-z" the operand would have to be entered as "-z." with the period, since otherwise it would be mistaken as an invalid operator.  LU on the command line with no parameters after it. After you are familiar with the program, you can specify multiple paramters on the command line and LU will work with little or no intervention. Input from disk files, C program "pipes", andWhat action is taken upon the file depends upon which operator most recently preceded it. If no operator was entered, or an invalid one, or one that takes no operands, the operand will be ignored. When running interactively, LU prompts f  or each operand and operator, one per input line. Multiple inputs per line are not allowed using the interactive method. The prompt you will see is the name of the current operator followed by a ">" character, for example "-E>". This the file(s) instead of the current drive. -d delete files from library. -d causes the prompt to change to -D> which accepts names of files to be deleted from the open library. Ambiguous names match all member files which qualify. indicates that the -e operator is in effect, and if an operand is entered it will be interpreted as the name of a member file to be Extracted from the library. When the program first starts up, the prompt is "-?>" which means no operator is Drive specifications on operands are ignored, since the library members are obviously on whichever drive contains the open library. -e extract files from library. -e causes the prompt to change to -E> which accepts names of library currently in effect. In this case, the only valid input is an operator. Any operand will be ignored. Page 3 82-08-07 Documentation for LU.COM and LRUN.COM SUMMARY OF OPERATORS -a add files member files to be extracted to normal free-standing CP/M files. Ambiguous names match all member files which qualify. Drive specification on a member name causes the output file to be placed on the specified drive rather than the current drto library. -a causes the prompt to change to -A> which will then accept as operands the names of files to be added to the open library. (If no library name has been opened with the -o operator, the default library LIBRARY.LBR is alwaive. Any existing file with the same name will be overwritten unless it is protected by virtue of its Read/Only flag bit being set. -l list current library map. -l causes the directory of the current library to be listed on the coys used instead.) Ambiguous operands match all disk files which qualify according to normal CP/M wild-card conventions, except those with a filetype of .LBR. Explicit drive specification on an operand causes that drive to be searched for nsole. The member names are displayed, along with their index, or starting position within the library, and their size in sectors. Also, information is displayed about the number of sectors in the library, and how much space, is used   or unused (wasted). Information is also displayed about the number of entries in the directory, and how many are active, deleted, or free for use. This helps determine whether the library needs to be re-organized to free unused space and deleguest, but you will have to specify the name without * or ? characters when adding it. -r reorganize library. -r causes the currently open library to be reorganized. First, the directory is sorted into alphabetical order, and ted entries. The operator -l expects no operands, so after the list is displayed, the prompt changes back to -?> for entry of another operator. -o open a library. -o causes the prompt to change to -O> which accepts the name of a libra then all active members are copied to a work library which is opened on the current drive, not necessarily the drive containing the old library. The user may specify a different number of entries for the work library if it is necessary to exry file to be opened for use with subsequent operators. If another library is already open, it is closed first. If the new library does not exist, it is created with an empty directory. Ambiguous names are not allowed. Drive specification is pand or compress the directory. The directory will always be made large enough to contain all the active members of the old library, so a size of 1 may be specified to make the directory as small as possible. (See Specifying Directory Sizes below.allowed. The file type may be specified, but defaults to .LBR which is strongly suggested as the file type for all library files. You will recall that files of type -a (add) operator. This prevents libraries from being accidentally added ) When reorganization is complete, the old library is deleted and the work library is renamed to the name of the old library. No backup copy is retained. The newly reorganized library remains open for use with subsequent operato other libraries, or to themselves; a situation not unlike trying to drive a truck up its own tailpipe. If for some Page 4 82-08-07 Documentation for LU.COM and LRUN.COM reason you want to add one library to another, be my tions. Whenever the program is prompting for an operand, another operator may be entered instead to change the status of the prompt. To end an interactive session, enter a blank line at the prompt. SPECIFYING DIRECTORY SIZ  E Whenever an old library is opened, the directory size is displayed as follows: Old library LIBRARY.LBR has 32 entries, 5 free. This means that 5 more members may be added before the directory becomes full. When the directoryperation the disk space runs out, the name is not added to the directory. If a multiple add is in progress, due to an ambiguous operand, the remaining qualifying files are still added if possible. If any of them is small enough to fit in the rema is full, -a becomes an invalid operator, and the library must be reorganized to add any more members. When a library is created for the first time, the user is prompted like this: New library COMMAND.LBR. Allow how many entries?_ ining disk space, it will be added. If any sectors were written by an add attempt, and then never utilized, they remain as unused sectors, and the library should be reorganized. PARAMETER DRIVEN METHOD All of th Any number from 1 to 65535 is valid. The actual maximum is determined by the amount of free memory available on the system in use. Directory size will be rounded up to the next whole sector necessary to contain the number of entries requeste information needed for a maintenance run may be specified on the command line. The operators and operands are entered, separated by spaces, after the LU command, and the operations will take place without console intervention, except in the case ed. This number will remain in effect until the library is reorganized. Since the directory itself counts as an entry, one entry is added to whatever is entered before the size is calculated. Therefore just enter the maximum number of membe where the directory size for a new library is requested. The syntax is: LU [ [ ...]] [ [ ...]... where square brackets indicate optional parameters, and: is any operator. is any operand. r files you want the library to be capable of holding. The maximum number of member files is also constrained by the amount of available disk space. If during an add Page 5 82-08-07 Documentation for LU.COM and LRUN.COM o... indicates that the preceding parameter may occur multiple times. Any names occurring prior to the first operator, or following an operator which does not expect operands, are ignored.    Page 6 82-08-07 Documentation for LU.COM and LRUN.COM ADVANCED FEATURES Input from BDS C "pipes" or ordinary sequential files is also possible. The filename is specified on the command line precedonsole file output is also echoed on the real console, except when input is also redirected, as in the last example. To force visible console output when both an input and output file are used, the ">" character preceding the output fed by a "<" character and no intervening blank. Example: LU ". This applies to parameter driven as well as interactive (including "piped")  The importance of keeping backup copies of all disk files, and especially libraries, cannot be overemphasized. By using library files, the user is exposed to the dreaded all-the-eggs-in-one-basket syndrome. That is, if something happens  input. Examples: LU -O SPECIAL -A ZOT.COM >LOGFILE.OUT would add the file zot.com to the library special.lbr and write the console output to a file called logfile.out. the location of the output name on the line does not matter and exceto the library file, particularly the directory, it may be beyond the capabilities of even a CP/M wizard to restore the member files. The situation is made particularly sticky by the fact that the the directory must be updated in place as members pt for turning on redirected output, it is ignored by all operators. LU B:RECORD.DOC would take interactive commands from the file batch.in and write console output to a file called record.doc on drive B. Normally, care added or deleted. Precautions have been taken to minimize this risk. For Page 7 82-08-07 Documentation for LU.COM and LRUN.COM one thing, the directory is read into memory when the library is first opened, and i  s only written back if it differs from the copy on the disk when the library is closed. Operations which change the directory are: adds, deletes, and the sort operation which is done before reorganization. If only extracts (o When the -D> prompt returns, do not hit RETURN. Instead, abort the program with Control-C. This will cancel the program without updating the directory, and the original members will still be present. Here is another caution. Since the entr LRUN program executions) are done, the directory is never rewritten, and the .LBR file may be write protected if desired. For another thing, the entire empty directory is allocated and written to disk when a new library is first cire directory (but not member sectors) must fit in memory for a library to be successfully opened, it is possible that a huge directory created on a your system will be too large to fit in memory if read on another system will less memory. This shoulreated. This insures that there will always be enough space on disk for the number of directory entries requested at the time of creation. The disk space may run out while adding files later, but there will always be enough room on disk to update thd not be a problem with a library of under a hundred entries. To give you an idea of how much elbowroom you have to work with, LU displays the highest memory location used each time it terminates. This will vary depending on the largest directe directory once it is successfully created. The fact that only the memory copy of the directory is modified until the file is closed may come in very handy if you mistakenly delete a file and recognize it right away. For example, suppose ory used during operation. It does not include the stack, which grows down from high memory, and is allowed about a thousand bytes of space for subroutine linkages and temporary work areas. Page 8 82-08-07you make the mistake of typing *.* after the -D> prompt. Briefly, your heart sinks, as the "Deleting:" message is displayed and all the member names zip into oblivion. Don't panic. Only the memory copy of the directory has been modified. Documentation for LU.COM and LRUN.COM THE LRUN COMMAND The LRUN command was created for those of us who have lots of command files we like to keep on line all the time. What usually happens is that some nic  e little .COM files are very small programs, but having a lot of them on disk eats up file space at an alarming rate due to the fixed CP/M block size. Put them all into a library called COMMAND.LBR using LU. You can then run any .COM file di (possibly empty) list of parameters which the .COM file expects to find on the command line when it is run. This list is parsed to the required file control blocks and command line area before execution begins, so the program will rectly from the library by saying: LRUN The full syntax of LRUN is: LRUN [-] [] Where: is the library to be searched. The square bracknot be aware that anything cute is going on. (Thanks to Ron Ron Fowler for supplying the code which makes this possible.) LRUN EXAMPLES LRUN ED FOO.BAR the file ED.COM is searched for in COMMAND.LBR on the cets around - indicate it is optional. The - character tells LRUN that what follows is a library name. It is not an actual part of the name. Don't leave a space after the -. If the first parameter doesn't begin with - then the default librurrent drive, or the A: drive. If found, ED.COM is loaded from the library, and FOO.BAR is passed to it as a parameter. LRUN -C:SPECIAL LU -O COMMAND -A A:*.COM the file LU.COM is searched for in SPECIAL.LBR on the C drive. If foary COMMAND.LBR is used. If a drive spec is given, such as B:, then only that drive is searched for the library. If no drive spec is given, the current drive is searched first, and if no library of that name is found, the A: drive is searchund, LU.COM is loaded, and the strings -O, COMMAND, -A, and *.COM are passed to it as parameters. Page 9 82-08-07 Documentation for LU.COM and LRUN.COM LRUN - -ZIP the file -ZIP.COM is searched for in COMMAND.LBR on the ed before giving up. If a name, but no type is entered, .LBR is assumed. is the name of the command to be run. No drive spec is used here. The type defaults to .COM and need not be entered. is a the normalcurrent drive, or the A: drive. If found, -ZIP.COM is loaded and executed with a blank parameter list. Since -ZIP.COM begins with a -, the extra - followed by a space was needed to act as a place-holder for the library name. Compare with: LRUN   -ZIP the library -ZIP.LBR is looked for, but nothing else happens, because no command was specified. LRUN with no parameters at all, causes a screen of help information to be displayed as a memory refresher. Please report any problems or suggestions for enhancement to me via CompuServe EMAIL or CP-MIG, user number 70160,120; or by phone at (201) 935-4087, voice, evenings (eastern) or weekends. Gary P. Novosielski  Page 10 82-08-07  Gary P. Novosielski or by phone at (201) 935-4087, voice, evenings (eastern) or weekends. Gary P. Novosielski   *K͞+F{E>n'+FÎr ͖ 8{ Ăw#w#w^#V#*~#fo^#*~#fo^#V#*n^#*n^#V# ~#fo^#& ~#fo!+!#!+!#!+!+}|z{|}|z5>s͋5>@2=#R1Ϳ5#(,#:==2=)(@#>s͋5#͘(Y#X1:>͋5:&=͋5c1Ϳ5#f1Ϳ52=#(—#>͋5:&=͋5>{͋5c1Ϳ5#(#:$=µ#>}͋5c1Ú#:$=;-͘(#>&͋5͋5f2Ú#:$=$v+è":7||7zZZ)|/g}/o#|͉k|/g}/o#ɯ2qZZk:q|/g}/o#|/g}/o#:q<2qqDM!xxGyO҃)v|͔`i|)Öxڷz/W{/_ѯzW{_=yOxGæ2qZZ͉M|}ȯ|g}o)|/g}/o=$,v+2#:$=>$$>͋5v+>͋5>@2$=2#*="<1Ϳ5:=2="<|s$}d$[2Ϳ5z$g$[3Ϳ5>G>)͋5$#͞*D)͏,Ͷ,v++4ʱ$Û Ñ þJ %-\>5ã>ñ8- m>õ(!9DM͐! ͳ*F}*F}*#z/W{/_!9~#fo! ! ! ! ! ! !9~#A"s!`*"!"!Y">2>2>22!"!"!@"!" ʞ!F#x±~#±!b2r~# "2r+}|~#G:rx"2rF&|g}o}2F! ! ! !! !Ͷ! ͹`is! P!+ ͼ!G "r<o&F=-` r'~h6!+`W?_!~7z?` :>ª@w#G.¶ww#?*>?w#> w#.7:77ì *1N| *-N}2 !͐͐*ì : !\ ͐~#fo!m !͐͐*ì !͐͐*ì !͐͐*ì ì Ͱì Õ!+! !9Copyright (c) 1982 Gary P. Novosielski82-08-2!a{   `OE!y6$ -7rBo&))T])))!yV5:=b#:=#:$=2#v+:<"(">6͋5:&=͋5#*&=|"M1Ϳ5#>6͋5:&=͋5>#͋5>6͋5:'=͋5#*&="<(#>͋5:&=͋6Library Utility Ver:%d.%02d %s %s Requires CP/M 2.0 or betterLIBRARYDirectory full. Invalid option: %s Highest memory used: %04x Þ>5Q+ÑDDá>8->-f-g!9DM͞ *-N} *N͡ #| !N! ͤ ͐ͧ |   ! ͐ͪ #|& ͐! ͤ ͐!Nͭ !.͐ͪ #|U ! !NͰ !!Nͳ "N#|~ !N! Ͷ ͹ !Nͼ "N#| !N!4 !Ϳ !/N!^ +| */N | ͐!a ͤ >2-N*1N*/N!{ Ͷ Can't close library:!ul͐|ʊ! ~#fo#n}:I͐`i! ! s#rS`i! s#r! 6! n&͐͐#|ʇ`i! 6Yl͐!!͐"+N#|*+N|*+N!l*+N͐"+N#|!l!!*+N %s Bad library name: %s.LBROld library: %s has New library: %s. Allow how many entries? %d Can't create library: %s%d entries, %d free. þ 8-Q+DÑ á>?]?|?mÑ?* à?!9DM*1N| ͐!͔ x͐͗ |\ ! ~#fo#n}: ͐!*:N ~#fo*N*:N~#fo*N*+N#|S*+N!l*+N#|l!l!9Can't extract %s; not in library Extracting: %-20s Destination file is protected Can't create output file I/O error. Disk Full? Err`i͚ ! ! s#r# `i! s#r! 6#6! ^#Vr+s͐͐͝ #|Y `i͠ , x͐!͔ ͐ͣ |ʃ !͔ x!͐ͦ "+N#|¥ !͔ x!*:N *3Ns#r*Nͩ *:N*+Nͬ s#r*+Nͯ !!*+Nͩ *:N~#fo*or closing output 8-!9DM͐!1Unexpected input: %-20s Æf"Û 8-D×-ý?á>??Ú+a@|?m5 Þ>Ñ?ò@!L9DM*-N}ž*2.N\"5N!!( s#r͐(_͐(P+N*NͲ #|&*+N͵ !͔ x͐*:N#͸ *:N6!!*:Nͻ *3N*:N~#fo"3N*1N+"1N>2.N*+N͵ !9No room for %s in directory Adding: %-20s Name already in library File not found Disk space too tight 8-Q+]!!"5N*8N":N!`ib! s#r! 6#6! 6#6͐͐l͐͐ʕ͐! s#r!͐͐e!!* ͐h͐!* ! k! s#r͐n}!Sl͐! k! !S! *:N ":N͐n!9DM͐}(͐!Ã͐|k! 6! n&͐`i#|h`i! 6<Ã͐!*:N6>2.N!9Can't delete %s; not in library Deleting: %-20s 8-Q+D]!þá>4"Ñ?>?mÞ>!9DM͐}͐*:N *Nqs#r!͐ ~#fo͐e͐~#fo͐*Nt#|^!w! ^#Vr+s3>2.Nz*N}#|!N!$w{2.N{2-N͐̀`i_`i͐(̓`iP!9 Reorganizing: %s WORK-LBR.$$$Reorganized. Copying: !  %-20s I/O error. Check disk spaceError closing %sD-ý?õ(\>!9DM͐ ͐͐͐!8!;!!8>!AA:$$$.SUB...ABORTEDÛ Ñ þJ"ñEW#8-!w9DM`i! s#r>?27N`i͸|`in}! ͻal: %u. ?A5*.N} !!*N *8N~#fo*8N*N*8N~#fol!N!s>2.N Error updating directory: %s!9DM`iw#w͐n}! ^#Vr+sn! n}͐`i^#Vr+sß!!9#f$??f"5]?!}! n&;}27N}O8ALDʠEʴLR{!`i**1N|\*-N}s!`i*{!`i!*>?27N!`i*!`i*!`i*>?27N`i͸|͵>?27N`i͸| `}!!*N!*8N*N+|j!=*8N|j*8N ~#fo|j*8N~#fo|r!J*8N~#fo*8N~#fok}¤*8N~#fo+*8N*N*8N~#fo+!W*N"3N !*8N~#foiͲ`i͸!9Directory full. Invalid option: %s GÛ ñ!9DM*-N}i! n}i*2.N a fishy odora bad directoryÑ?ý?5#8-* !9DM͐Ҭ*Nj!Nm!p͐*5Nͩ*5N͐! s#r! ^#Vr+s! ?s}!v!å*8N6!!9DM*-N}*2.N*8N~#fo"3N|!N!v!å!9Illegal sizeToo big. Try again. .Created %s with ÇA\>Ë$Ú+!9DM͐-r! ^#Vr+sÈ*/N*1N͐! ^#Vr+s͐͐͐͐!!9! ^#Vr+sa!9 Name Index Size Name: %s DIRECTORY %4u %-8s %5u %4u Active sectors %12u Unused %12u Total %12u Active entries: %u, Deleted: %u, Free: %u, Tot! `iw#w͐͐/X! ͐|4!7!!& s{LX`i^#Vr+s!& n}ʤ!!!!& ng ?|¤! !!& sX!& n}µ!!& ng ?͐+!!'9LBR* f"!9DM`i6͐!"   *8N ":N*/N*1N! s#r! ^#Vr+sz\`i*:N|O!&d*:N ":N&!&d!9v?A!9DM͐@!@!&=(! ~#fo͐)~#fo#n}% '* ! ~#fo͐)~#fo# %#|'&'!! ~#fo! ^#Vr+s6 L ͐ T!! ~#fo! ^#Vr+s6 *!!9i!* f"Ú+!9DM!."`is#r!1"! s#r! n}ʲ!͐*8Ns#r͐*/N*1Ns#r͐6͐ ͐#`!͐^#Vr+sz"͐͐^#V! r+sc!|"͐~#f! ~#fo͐)~#fo#!](!%%*6!l(! ~#fo͐)~#fo%|b&*n&|g}osÌ'*##4! ~#fo͐)~#fo#*###s#r! ~#fo͐)~#fo#n}&! ~#fo͐)!x(s#r! ~#fo͐)*s#r&*#n&|g}os! ~#fo͐)o͐f!!%"!͐s#r!%"!9="çA÷A!9DM͐7" :"|g}o&!9DM`i6 #6`i^#Vr+sz"͐n͐ nѯgW! s#rzʶ"͐ n}?ʶ"͐"! ^#Vr+s! ^#Vr+su"!"!9"8-.f-!9DM*7N&!I#"~#fo#n}'!(!%%! ~#fo͐)~#fo#%*! ~#fo͐)~#fo#%#|‡'! ~#fo͐)~#fo#!(!%%*#4w}(͐! s#r͐͐ ~#fo'! ~#fo͐)! ~#fo͐#)~#fos#r! ^#Vr+sá'͐ ^#Vr+s`i^#Vr*F}#͐!O#!"-#͐!S#"B#͐s&! -%c>%s %s c#Û "ñ!9DM͐`is#r*-N}#! n}ʏ#*!9DM!c$! s#r͐͐~#fo$!&+s*^#Vr+s:(͐ ͐s#r! ~#fo͐ ~#fo)w#wH(! ^#Vr+s`i^#Vr+sl%!9Can't open %s þA!9DMw}ʽ)* ͇)`is{ º)á))!͊)`is{)͍)`in})! *`in} *`i6 w}*! !͐! s#r͐ `is#r͐͐.͐͐ ! s#r͐|.͐͐ ͐͐͐!t.!9~#foڃ..͐ ͚͐͐͐͐-! ~#fo͐s#rA.`i~#fo͐s#r.! ~#fo͉s#r-!9/;Ì)`in& *!9$* 0-þA\>!9DMw}*!0+`is#r! n} T*! n} „*͐n} ʁ**! **! *ï**! n&*#|¯*!2+!**͐! nsw&|g}o|*'+! !*|*!!*+++|**! n} +!07!y9DM͐`i.|!/!1/! `i.1/!9@/á>!9DM͐!͐=/s#rzj/!͐##w#w͐~#foÆ/>!9DM͐͐̓/s#rz/!͐͐s#r͐##6#6͐~#fo/Þ>!9DM͐/!͐~#fo+n} +! !!*! n&!!*!9File output error; disk full? !9DM! ^#Vr+sn`is{ʋ+`in}*ʂ+`in}?ˆ+!Ñ+Y+!Ñ+!9!9DM! w#w`i6#6͐ +! ~#fo͐n&|g}os`i^#Vr+sñ+`i6#6͐ N,! /0*\>-B!9DM͐+|50! n& 0͐++|S0! n&!0͐+++|r0! n&!0͐++++|ª0! n} —0! !0! n&!0͐##^#Vr+sz0͐^#Vr+s! ns&!͐͐~#fo01 ~#fo͐n} ,N,! ~#fo! ^#Vr+s! ~#fo͐ns`i^#Vr+s+! ~#fo n} {,! ~#fo! ^#Vr+s6.`i6 #6͐ ,! ~#fo͐n} ¨,,! ~#fo! ^#Vr+s! ~#fo͐ns`i^#Vr+sÂ,! ~#fo͐6͐,!9!͐##6#6͐͐s#r͐^#Vr+s! ns&R1-Ba@ÕB!9DM͐m1!Ê2͐##~#fo†1!Ê2͐##~#fo`is#r͐͐͐~#foI1͐1!Ê2͐+?`is#r͐##~#fo|c2!͐ -Á36!y9DM! `i-͐`i-/-!9A-Á3Z7!y9DM! `i;-`i>-!9o-AÌ7!y9DM`ii-! `il-Î-!9Ý-ê:!9DM͐͐k! s#r͉͐! s#r͐|.͐͐k! s#r͐͐! s#r͐͐͐L1͐##~#fo͐s#r͐~#fo͐s#r!!͐~#foO1Ê2͐##6#6͐͐s#r!Ê2!9ß2Ä)\>C!9DM͐|¶2͖2x3͐+++|2!͙2x3͐##^#Vr+sz2͐^#Vr+sn&x3!͐$  ͐~#fo͜2`is#r!43͐##^#Vr+sx3͐##͐?+s#r͐͐s#r͐^#Vr+sn&x3!9Ð3;FEç<E!h9DM! ^#Vr+s~#fo! s#r͐! s#r! ^#Vr+sn`is{6`in}%6! ! s#r! 6#6! s! s! n&͏7|87! n}%R8! n! ͒7D8! n&á:O8! ^#Vr+sÔ:! 6#6! 6 `i6! ^#Vr+sn! s{*–8`i4! ^#Vr+sn! s! n&͕7}X8O8D8U8Sʈ9C:W:! 68! 68! ͒7-8! 6#6! ^#Vr+s! ! s͐n}- 4! ^#Vr+s! 4͐n}004! 4͐n&͇3}M4! ͊3P4!! s#r! ^#Vr+sn`is{.˜4! ͊3! s#r! 4! ^#Vr+sn`is`in&͍3}D4U5X 5O5CX5Sʉ5õ6͐~#fo|5! ^#Vr+s6-͐͐~#fos#r! ^#Vr+sw#w! n&! ͒7͘7#|+9! n&á:! n&! ^#Vr+sn&͘7! s{z9͐ ! nѯg?! nѯg! s#r+9! ^#Vr+sa:! ͒7͐ ~#fo! s#r! ^#Vr+sn! s{9! n͐n}9! ^#Vr+s9`in}9! ^#Vr+s! nsá9`in}! 6 5! 65! 6! ~#fo! n&! ^#Vr+s~#fo! ̈́3ѯgs#r6! ^#Vr+s! ^#Vr+s~#fos! ^#Vr+s6! n}œ5! 6#6! ^#Vr+s~#fo! s#r͐n}6͐|6! ^#Vr+s! ^#Vr+sns! ^#Vr+s! ^#Vr+s÷:! 4͐6! ^#Vr+s7`in}I:͐n&! ^#Vr+s~#fo͛7! 4! ^#Vr+s7! n&á:`in}”:! ^#Vr+s~#fo͐ ͐?s#r! 47! n&á:!9!9DM! ^#Vr+sz:͐n`is! ^#Vr+s͐ ns! ^#Vr+s`insò:!95͐6! ! s#r! n}X6! ^#Vr+s!X6! ^#Vr+s! n}O6!0R6! s6͐! ^#Vr+sns{ʁ6! ^#Vr+sX6! n}ʲ6! ^#Vr+s!Ҳ6! ^#Vr+s6 Ë66! ^#Vr+s`ins6! ^#Vr+s`insÿ3͐6!96 0!9DM! ;Ó2=!9DM`i6#6͐ ! s#r͐ ;! s#r!H;͐#|N;!;! ^#Vr+s͐s{ ˜;͐͐ #ҕ;͐++n} •;! ^#Vr+s6 ;`i^#Vr+sz;͐ ;! s#rz;͐N;͐;͐ ͐;͐6͐ ;!9< ^#Vr+sn`is{K7`in} ,7͐! 6͐`in&6#|H7!Q76!Q7!9`7*!9DM͐n}ʊ7! ^#Vr+sn&]7h7Þ7VE =EP=vC!9DM! ^#Vr+s~#fo! s#r͐! s#r! 6! ^#Vr+sn! s{ʗ:͐n}8! n&á:;!9DM͐͐ S<͐^#Vr+s͐ @<͐0H<͐7s!&Þ<͐ ͐͐ ͉͐<`is͐ ͐͐ )͐<`in&#&Þ!!j96  #F#x(B~#B7:)~:,"s!"u*|*uʓB*~#jB"*s*u“B#"u*+"WBÛBëD7:,*͘B:*ʽB}|2q BB:qwB! {w n&=͐+>͐##~#fo0>!͐^#Vr+s! ns͐##^#Vr+s!7:O* *ړ>+*|/g}/o#9͗>ғ>#"z{#7,2q*&:q):>=>=r:qo&>ý?á>7*>\7:)~:,"s!"u*|VC**s[C! ~VC6*u*+"*"*u#"u"C7*:w:wo2w&7*!9& 6C#6O#6M¿C*|C!\&C!\&*|C!!l&!9~#fo!*>7:,U?*:J?=8?J?#U?*!s#r!^#V7:,#!~#fo7:,!^#V )6!7**:Oz¸?q#ð? !\&!7:)~:,"s!"u*|*u@D> +xD#~D##CxSAD)D úCEXECL: Too much text $!pD!*w#MD*:1gD*pD!pD!a{ ѷ! , FNxg>GoyD$7**~#D*7**~#D+w#D**s!ѷ8@'@O! ! ~3@6*u*+"*"*u#"u*s! N#Fp+q?7*|DM**ͬ@ڐ@><@~# x„@ ><@~+ x @|}7*!@&*!@&@!}"]*a 6 *]}#|#*]*!9~o&a{_obkE{ozg7**CE#4E!ɖg!9~!0:,!9~! -!9~!A[,DE ͐ «7:)~:,"s!"u*|*uHA*~#PA"*s"*u#"u*+"*s! N#Fp+q;A7*~# ʎA ʎA+*&! ) , n& AÐC7*^#V#zAx2A+V+^+A*A:Ao&9! &  4vVc!g]-ͧyGm[Xi>kh<"XuYS|an\Z9]uE>8Ȥo(}G_?īHmVb`e˽?N*.#_) [-uJ|EgGźq_ 6gg }E:".G뮋|=XiaZ,Pu9I,lˆ}f6m+~qκXc,TԔcۺĔc,5YK_`aWmN[Y#cK3֌ c,亯>-Q:K9Npں~ﳱX6,֩;_w]#a'(}]%-9f|}ۖcۺ~9l#6uuc@vhg G뾕qb,;Ŕmv XCOPY.ASMW   !"$#&%'(*)+-,/.0123546789:;<=?>@ABCD_uY<2,aR+K9Jcɳuz?'lLu Qͬ|.Ruژ)A!%HoR>~谳9[)A6+\u՗D((]>ydm͑I^ 1r_YkFSu9)?c_c!GV1}/G-84_*G뢲EGFIJHKLMoPNOSURTVQqKP\U/>x++ln?uSgR19t:ןtSg)Qqg**t9¥CQ7 E˜n~ԡyN=wΥNƝizL tQOӍ* -f91r~NbJrdXȑUu "?"X1, ?'*(}$QeC߶}T݆f-'(}]%-Q:tl[K1Hmd9aqg>.uΑP4~)>-Gvs>nCƺMS[uOC[O4{T޶jsv6gu|*G`eu#Sя"~R}6jkJt{d, w Tޯ[S|䬫n+T:#u[Ʒmv鳙On> [u|*?QPSn|*Qs\Oq}ۖm˩2XYu5VZ{$DXia >R 4 cY r/#~~NR |U}oe?/X326^uէ%JǶb)Gض~8\W_l摺l#U~q*c@pWqiMjQl}*'  ?R6V0^]w?-hgsuuz'iV_w]T*Kus4de)l~eMuq"+.#ΑIT~?'?f᜝ZjBXن:-6y~qζȚ1rԝ>e#㳍uLسQm[볱X9I{X>D,V\ȷs"ǘ;_G`vV>m _KGݦaaG>K#a(ۍrLmuvԝuucgїMq x+lbx[ sJPil;;} 9qǵNq4u4xCssr-'#}z e0 9t=+&`ݽ`:S({񄡞uu/!`lv`Fԥ <}l!9?NKPƭܭULWL=} C OZ@Q{s::4=9BOse0䠩2zJ`:Ѥ韦' ӣ {Wu/!K9S9.A=M= PO]'N7^]}l0:kaka0hO\ S]}l!u%[xll*#hlz`:ggsitN~MpuX9 r/NtSOϑBsIw{ e0nT&`]z#L3}