IMD 1.16: 1/06/2007 10:00:31 FOGCPM.168 --FOGCPM168EDFILE3 COMV EDFILE3 DOCEDFILE3 DOC !-04-00 87 EDFILE3 UPD"#M-DUMP11COM?$%&'()*+M-DUMP11DOC%,-./0MPRINT COMC123456789MPRINT DOC:MPRINT C -;<=>?@WILDEXP C )ABCDEFSCAN12 COM GHIJSCAN12 DOC7KLMNOPQVDE25 COM]RSTUVWXYZ[\]VDE25 DOC^_`abcdefghijklmVDE25 DOCnopqrstuvwxyz{|}VDE25 DOC~VDE25 DOC-CPM168 DOCVDE25 QRFVDE25INSBUGVDM25 COMVVINST25 COMBThis is the disk name. 1 EDFILE 1-12-87 J. C. Kaltwasser & M. J. Mosko $= **͂+}2'++*'&0+!'ͥ(}2'*'&!)*/!*!ͪ*͢*!'!)*"'*'!Z!b(!Z!!*!\8+!)*ʇ!Z*!*!ͪ*͢*!\+!\!!"'*'*"'*'!)*ʶ!"'!*'*! ͘(!i͇+*'!}2'"'2'*"'͹ !\"'*'! (!C)**'! (!O)*ͤ)*'! (!M)*ͤ)=!"'!!͟!\ͺ+|ʅ! ͪ*!*!ͪ*M! ͪ*!"'Ý*'&*ʖ_Ý!}2'!?ͪ**'&|*'&!E*!}2'*'&!g)!x)!}2'*'&*'&***u(}2'!!*'&!E)**'&!)*ͯ)9 !}2'*'&!Q)**'&!)*ͯ)b*'&!H)*t*'&!M)*ʆ*'&!B)*ʛ!"'*'&!Z)*ʷ*'!:*"'*'&!-)**'!)*'!:*"'*'!:*"'*'&!R)* !*"'*'&!A)*b!*"'*':*)*'zWJ{WW"'b:**'!E*"'*'&!O)*~!*"'*'&!S)**'&!C)*ͯ)ʠ]*'&! )**'&!+)*ͯ)*'&!=)*ͯ)!'(*'V)!"'*'*'*=͓ !\@+͢*!*͓ ͓ !*͓ !*!͢ !*!͢ !1*͓ !E*!͢ !\*!͢ !s*͓ !*!͢ !*!͢ !*͓ !*!͢ !*!͢ !*͓ ! *͓ ͓ !- *͓ !B *!͢ !Z *!͢ !q *͓ ! *!͢ ! *!͢ ! *͓ ! *͓ ! *͓ ͓ ! *͓ !͢ !!*͓ !͢ !7!*͓ !͢ !i!*͓ !͢ !!*͓ !͢ !!*͓ !͢ !!*͓ !͢ !"*͓ !͢ !U"*͓ !͢ !f"*͓ !͢ !"*͓ ! ͢ !"*͓ ! ͢ !"*͓ ! ͢ !+#*͓ !͢ !G#*͓ !͢ !o#*͓ !͢ !#*͓ !͢ !#*͓ !͢ !#*͓ !͢ !$*͓ ͓ !>$*!'!!*!'+!͢ !V$*͓ !͢ !$*͓ !͢ !$*͓ !$*͓ !͢ !#%*͓ !͢ !f%*͓ !͢ !%*͓ !͢ !%*͓ ͓ !͢ !%*͓ !͢ ! &*͓ !>&*͓ !&*!'!!*!'+!}2(*(&!)ʇ ͓ !(D)!!! ͪ*! ͪ*!9)ʵ ! ͪ*͇*!}2(*(&!Y!(2) !Y*(&(*!(D)!&*! }2'*'&|6 *'&}2'*'&}2'!>*'&!g)}2'K !}2'!}2'!>}2'*"'!}2'!}2'*'&*'&**| *}2(͟*(&! )*(&*ͤ)ʨ *(&"(!*()* !!!&*!\+| ! ͪ*!&*!ͪ*M! !è !*()*M !!!&*!\ͺ+|> ! ͪ*!&*!ͪ*M! !è *X&*()*| !',)!)s !}2'*"'è *W&*()*ʨ !')!)ʢ !}2'*"'*'&|0 *(&! )*(&*ͤ)ʬ *(&"(*U&*()*d *'&|T *'&!)# *'&!:*}2'!')!'ͺ)!}2'Q *'!)Q !6}2'!M}2'!')!'ͺ)!}2'a !')!}2'é *V&*()*y é !*()*ʩ !}2'*'&!)*ʩ !}2'!')- *(&}2(!)- *(&u(ͪ*!i*'!i*'(!*'&)ͤ)*(&*'&)ͯ)**'&*'&!i*'($=*(&! )*(&*ͤ)*(&" (*U&* ()*ʺ *'&!>)ʐ *'&!:*}2'!')!'ͺ)÷ *'!)ʷ !5}2'!M}2'!')!'ͺ) *V&* ()* ͍ !* ()* !}2' !* ()* !)}2(=!}2(*(&$!i*'*(&**'&*'&*(&3͍*'&! *'&)**n *'"5(*'&!S)*}!(!!*!}20(2'21(2(2'2'!}2(!!!&*!(+!(!(!(!!*!(!".(!(!(!)*(͟!!!?ͪ**5("'!)}2'!}22(*2(&!)X!'*2(&!*!2(D)*.(!(!!(!((s*.((!\)*ʦ*(&!))}2(!.(%)X*.((!;)**1(&!))}21(!.(%)! *X*1(&| !'!'D)*.((u(*!.(%)! *X*.((!,)*-!.(%)!}2(X*(&|S!'!'D)!.(%)(*p!.(%)(u(}2 (* (&!A)* (&!F)ͯ)* (&!0)* (&!9)ͯ)ͤ)ʷ!ͪ*!}20(sP* (&!AV)* (&!F2)ͤ)* (&!A:*! }2 (* (&!0:*}2 (!'*'&!'*'&(*(&* (&x)**(&!)*I!'D)!}2(!}2(*'&!)p!ͪ*!}20(sX*0(&|r!"7("9(}2'23(*'&*'&}22(*'&!C(ʹ!}2'!Uͭ|?!)}2'!}24(*4(&*'&2)?!'*4(&(!aV)!'*4(&(!z2)ͤ)7!'*4(&!'*4(&(!ͤ)*!4(D)!}2'!Zͭ|Y!}2'!Oͭ||͓ !&*!:*"7(!Mͭ|ʙ͓ !'*}2'!Aͭ|ʹ*'!"'*!\ͺ+*3(&*'&)!'*3(&(*2(&N)*ͤ)!3(D)!}23(*3(&*'&)*y!Oͭ*7(*9((ͤ)2!}23(!9(%)y*2(&*'&V)^*2(&*'&:*!}2'g*2(&}2'!}2'!)}2'!2(D)*2(&!V)!Bͭ|ʣ!'ͺ)é!'%)*'*'*!}22(!\ͺ+|*5("'!!!(!*!4'*!ͪ*!}2'*|2*2(&}2'*}23(!!!@'*!}2'ù**A*}2;(*;(&!i!9((*'&ͤ)}2<(*'&|ʤ*<(&!aV)*<(&!z2)ͤ)ʤ*<(&!ͤ)͇**<(&͇**'&!)*!͇*!}2=(*=(&*'&2) !'*=(&(!9()*!)͇*!=(D)!͇**'&|*!'D)!}2'Ì*'&!6)^*'&!}2'!'D)!'%)!}2'Ì*'!)ʌ!}2'!>}2'!'D)!'%)!}2'*'&!M)ʺ*'&!}2'!'D)!'%)*'!)!}2'!>}2'!'D)!'%)!9!9(u(*!9(!A)!9(!0:*͇*!9(!7:*͇**'&!:*!)*'&!>:*!:">(!>(K)^͓ !O'*!Z*!V'**'! !a'**'Ϳ!d'*!h'*!*!p'**'Ϳ!s'*͓ !v'*!}2@(*@(&!)*@(&*'!ͤ)3! ͪ*!@(D)!'*!}2@(*@(&!)A*@(&*'!ͤ)!g)ͼ!@(D)͓ !'*!}2@(*@(&!)p!'*!@(D)!'**'!x)*'"'!}2@(*@(&!)V͓ *'*@(&"C(*C(d!'*!}2A(*A(&!)!i*@(&*A(&(3! ͪ*!A(D)!'*!}2A(*A(&!)=!i*@(&*A(&($!A(D)!<ͪ**@(&!}2@(Ñ͓ ''!9!9(!ͤ)*!9(!)Y!9(ͪ*`!.ͪ*͇*!9*"'!}2E(*E(&!2)*'!g)}2G(*'!E*"'*G(&! )*G(&!0}2F(*G(&!7}2F(!*E(&*F(&*!E()!!!*!*! ͪ*͇*!9*"'!}2I(*I(&!2)*'!(ͤ)s*'! g)}2H(*'! E*"'!!I()*H(&!0**I(&!2)ʗ!!I()!0*!!!*!9*ʸ!*!͇*!}2J(*J(&!(/*J(&!:*}2J(!9**J(&)!ͤ)!0}2K(*K(&!9)$*K(&!}2K(*K(&ͪ*͇*!9(!)!ͤ)!0}2L(*L(&!9)p*L(&!}2L(*L(&ͪ*!9(!ͤ)!0}2L(*L(&!9)ʯ*L(&!}2L(*L(&ͪ*͇*!9(!ͤ)!0}2M(*M(&!9)*M(&!}2M(*M(&ͪ*͇*!P(!!*!P(+!P(!(}2O(!P(!͂(!P(*O(&!(!H)*a!O()!}2V(h! }2V(!"X(!"Z(*O(&!}2N(*N(&!V)!P(*N(&(}2W(!0"\(*W(&!9)ʿ!7"\(*X(*Z(*W(&*\(:*x)"X(*Z(*V(&x)"Z(!N()*X(!}2^(*^(&!@!(2)/!@*^(&(*!^(D)*E&!)g!9**E&*!9**E&*Û!9**E&!ͤ)*!9**E&!ͤ)*͇*!}2_(*_(&!P!(2)!P*_(&(*!_(D)!}2`(*`(&!K!(2)!K*`(&(*!`(D)!F!(!)*X!}2a(*a(&!O)N! *!a(D)! *Ñ!}2a(*a(&!F!(2)ʑ!F*a(&(*!a(D)No File Specified. Not Found.Bad Record.RECORD = ADDRESS = OFFSET = HelpRead/Edit File Utility Functions:A - Address to dump B - Dump at beginning C - Continue SearchE - Enter Edit Mode H - This help list M - Expanded Help listO - Set address offsetQ - Quit this program R - Read & dump recordS - Search for string Z - Dump at end of fileCR - (+/=) - Adv record(-/_) - Decr record Edit Mode Functions:^T - Toggle data fields^W - Write buffer out ^Q - Abort Edit Mode ^X - Cursor Down ^E - Cursor Up ^S - Cursor Left ^D - Cursor Right Expanded HelpRead/Edit File Utility Functions:A - Enter relative address to dumpB - Set record to beginning of file and dump dataC - Continue search. Restarts search on last entered search string.E - Enter Edit mode on current recordH - Brief description of the functionsM - This help descriptionO - Enter offset address relative to start of file (.COM = 100h)Q - Quit programR - Enter record number to dumpS - Search for hex or ASCII string in file (starts at current record)'\' = ASCII string delimiters (ex: \Test\)',' = hex and/or ASCII delimiters (ex: 41,\Test\,4A';' = select search optionsA - Start search from beginning of fileB - Search BackwardsM - Search on certain bits set; use mask xxO - Stop on xx occurrence of stringU - Translate lower case characters to upper caseZ - Search recognition on least significant 7 bits onlyHit for more -Z - Set record to end of file and dump dataCR - carriage return (or +/= key) - advances record and dumps the data-/_ key - decrements record and dumps the dataEdit mode: ('^' refers to the Control key)^[ - (ESC) Accept next char into edit field even if a control char^T - Toggle between ASCII and hex data fields^W - Flush record to disk^Q - Abort edit mode without updating record^X - Cursor down ^E - Cursor up ^S - Cursor left ^D - Cursor right Input integers are decimal. Use 'h' suffix for hexadecimal entries.Hit to continue -Edit RecordWriting Buffer ** WRITE ERROR **EDIT ABORTED** READ ERROR **?Search String = Stop on string occurrence = Enter string search mask = Not Found.SEARCH ABORTEDFile: Record: (H) LOF: (H) -- ---------------- - >xs(~# f(}a{ o~aڔ({Ҕ( w#Ä(~#Ü(!^#6~( (#÷(}|#~ (((6#÷(i`^#Vr+s|r)!„*+Ä*ngr)!ڄ*+Ä*r)!ڄ*+Ä*(+|4ng*r)!+,)-|^#Vr+s|*r)!+E*|z{.zW{_-ʠ)җ)} DMoxGyOÁ)|}o|g}o|gK)#|5ng),|}o|gzʄ*|g}o)zʄ*}o|g)͑*#||!„*#Ä*~#fo}}|r)!ʄ*+Ä*}o|g"*."*{_zW**-"*ʄ*>)D**OxG|* ?T*} =Š*}/o|/g!+ñ*ÿ*o&ÿ*͙*!**͙*K* !+*ñ*͙*͙* ͙*_+͙*  ʴ*>ô*  ͙*͙*ñ*͙*ñ*͙*ñ*ñ*͙*ñ*͙*ñ*͙*ñ*͙*ñ*͙*ñ*ñ*͙*͙*ñ* ñ*͙* ͙*!ñ*͙*"ñ*͙*#͙*$͙*%͙*(ñ*xs(~# f(}a{ o~aڔ({Ҕ( w#Ä(~#Ü(!^#6~( (#÷(}|#~ (((6#÷(i`^#Vr+s|r)!„*+Ä*n EDFILE UTILITY USAGE Jan 10, 1984 by Mike Mosko, K3RL (Revised, Jan 12, 1987) EDFILE is a public domain utility which allows display and editing of data in files. It has been tested and run under CP/M- 80 version 2.2 and TurboDOS 1.2 and should run in any CP/M-80 type environment. EDFILE is approximately 11k in size. EDFILE may be freely distributed to whomever desires it. The date of this document should agree with the version date in EDFILE. FEATURES: ======== - Hex and ASCII display of record data. - Screen editing of selected record. - Hex or ASCII input when editing file records. - Fully programmable cursor control. - Powerful file search capabilities. - Forward and backward record scrolling. - Address and/or record number referencing. - Decimal or Hex number inputs. - Disk reset on input (prevents Disk R/O error). - Full online abbreviated help AND expanded help menus. INSTALLATION: ============ The following information will aid the user when installing EDFILE on a different terminal. The EDFILE original distribution program is originally configured for an ADM-3A type terminal or equivalent (I use a Digilog S1500). The terminal must be able to display 80 columns by 24 rows. The only absolutely necessary function required for proper use is the cursor positioning function. Other functions that can be added merely for visual purposes are the cursor on, cursor off and clear to end-of-line functions. If the clear to end-of-line function is not preprogrammed, it is performed in software. These functions are not implemented in the original distribution version of EDFILE. For ADM-3A type terminals, the following commands can be patched in EDFILE if these attributes are desired: Clear to end-of-line .... ESC 'Q' (1B,51) Enable Cursor ........... ESC 'X' (1B,58) Disable Cursor .......... ESC 'Y' (1B,59) For example, to add the clear to end-of-line function, patch a 02 for the string length (2 bytes for the sequence) at address 146. Then patch a 1B in location 147 and a 51 in location 148. Certain functions are programmable for the type of terminal in use. Five bytes are reserved for each terminal function (string sequence). The first byte represents the length of the string sequence. For example: the initial cursor positioning string for an ADM-3A terminal is 'ESC ='. This is two bytes in length. Therefore, the values inserted into the cursor positioning sequence area are (in hex): 02,1B,3D. To complete the cursor positioning sequence for the terminal, the row and column must be issued as well. The ADM-3A requires an adjustment value (or offset) of 32 decimal (20 hex) be added to the row and column. For terminals that require a different offset, this value can be changed as well. The row is usually sent before the column, but if your terminal is different, i.e., the column must be issued first, then set the high order bit of the cursor offset value. This flags the cursor positioning routine to send the column before the row. The following addresses detail the location of the modifiable parameters for the terminal. Address Default (hex) Function ------- ------------- -------- 140 02,1B,3D,00,00 *Initial cursor positioning string sequence 145 20 *Row/column adjustment (set high bit for column/row) 146 00,00,00,00,00 Clear to end-of-line string sequence 14B 00,00,00,00,00 Enable cursor (cursor on) string sequence 150 00,00,00,00,00 Disable cursor (cursor off) string sequence 155 13 Cursor left (normally CTRL-S) 156 04 Cursor right (normally CTRL-D) 157 05 Cursor up (normally CTRL-E) 158 18 Cursor down (normally CTRL-X) 159 00..........00 Terminal initialization string (35 bytes) * - Must be implemented. If your terminal requires some sort of initialization string, either to preset it or to program a function key pad, this can be inserted into the terminal initialization string area provided. The first byte represents the length of the string to be issued to the terminal. There are 35 bytes available for an initialization string. Why so many? The Digilog S1500 computer I use allows reprogramming of the numeric keypad. This requires 28 bytes. The actual control sequences for positioning the cursor (up, down, left and right) can be changed. This is provided for terminals that have cursor positioning keypads which don't issue the WordStar control characters. Many machines, for example, use a CTRL-L to move the cursor one space to the right. If your cursor pad uses that control character, then patch 0C in the location for the cursor right value. Note that the help menus will still display the default values for up, down, left, and right cursor movements. You can just live with it or, better yet, use EDFILE to patch the help menus. All of the above modifications (patches) can be made easily with EDFILE itself. Of course, if it won't run at all, you'll have to resort to some sort of debugger such as DDT, SID, MONITOR, etc..., or better yet, use someone elses computer with a (working) version of EDFILE to modify it for your terminal. EDFILE should work on virtually all terminals currently in use. There may be some real strange ones out there that I don't know about, but that's life. OPERATION: ========= EDFILE is simple to use especially with the online help menus. Therefore, just a few tidbits of information is provided here for operation. To invoke EDFILE, simply type EDFILE followed by the name of the file you wish to dump and/or edit. Example: EDFILE EDFILE.COM The display should look similar to the following: ------------------------------------------------------------------------------- EDFILE 1-12-87 J. C. Kaltwasser & M. J. Mosko File: EDFILE.COM Record: 00000 (0000H) LOF: 00086 (0056H) 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 0123456789ABCDEF -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- ---------------- 0100 - 31 EA 01 C3 EA 01 0D 0A 20 45 44 46 49 4C 45 20 >1j.Cj... EDFILE < 0110 - 20 31 2D 31 32 2D 38 37 20 20 20 4A 2E 20 43 2E > 1-12-87 J. C.< 0120 - 20 4B 61 6C 74 77 61 73 73 65 72 20 26 20 4D 2E > Kaltwasser & M.< 0130 - 20 4A 2E 20 4D 6F 73 6B 6F 20 20 20 0D 0A 24 1A > J. Mosko ..$.< 0140 - 02 1B 3D 00 00 20 00 00 00 00 00 00 00 00 00 00 >..=.............< 0150 - 00 00 00 00 00 13 04 05 18 00 00 00 00 00 00 00 >................< 0160 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 >................< 0170 - 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 >................< ? ------------------------------------------------------------------------------- EDFILE performs an automatic disk reset (^C) when executed. Therefore, don't panic if you suddenly realized you forgot to perform a Control-C after making some changes. This prevents the infamous (and frustrating) Bdos Err on A: R/O from occuring when writing records. The LOF means the Length-Of-File which is the total number of records in the file. Record numbers begin at 0; the last displayable record number is actually the LOF - 1. If you don't specify a file on the command line, you'll get an error: "No File Specified."; or if the file is not found, you'll get an error telling you this: " Not Found." Simple. At the ? prompt, type 'H'. The brief help menu will be displayed: ------------------------------------------------------------------------------- Read/Edit File Utility Functions: A - Address to dump B - Dump at beginning C - Continue Search E - Enter Edit Mode H - This help list M - Expanded Help list O - Set address offset Q - Quit this program R - Read & dump record S - Search for string Z - Dump at end of file CR - (+/=) - Adv record (-/_) - Decr record Edit Mode Functions: ^T - Toggle data fields ^W - Write buffer out ^Q - Abort Edit Mode ^X - Cursor Down ^E - Cursor Up ^S - Cursor Left ^D - Cursor Right ------------------------------------------------------------------------------- Again at the ? prompt, type 'M'. This will display the expanded help menu. ------------------------------------------------------------------------------- Read/Edit File Utility Functions: A - Enter relative address to dump B - Set record to beginning of file and dump data C - Continue search. Restarts search on last entered search string. E - Enter Edit mode on current record H - Brief description of the functions M - This help description O - Enter offset address relative to start of file (.COM = 100h) Q - Quit program R - Enter record number to dump S - Search for hex or ASCII string in file (starts at current record) '\' = ASCII string delimiters (ex: \Test\) ',' = hex and/or ASCII delimiters (ex: 41,\Test\,4A ';' = select search options A - Start search from beginning of file B - Search Backwards M - Search on certain bits set; use mask xx O - Stop on xx occurrence of string U - Translate lower case characters to upper case Z - Search recognition on least significant 7 bits only Z - Set record to end of file and dump data CR - carriage return (or +/= key) - advances record and dumps the data -/_ key - decrements record and dumps the data Edit mode: ('^' refers to the Control key) ^[ - (ESC) Accept next char into edit field even if a control char ^T - Toggle between ASCII and hex data fields ^W - Flush record to disk ^Q - Abort edit mode without updating record ^X - Cursor down ^E - Cursor up ^S - Cursor left ^D - Cursor right Input integers are decimal. Use 'h' suffix for hexadecimal entries. ------------------------------------------------------------------------------- Use the '=' key (which has the '+') or the RETURN key to advance the record. You don't have to use the shift key with the '=' key. EDFILE will wrap around to the start of the file when attempting to advance beyond the end of the file. The following paragraphs expand on the features available in EDFILE. Most of the options are self-explanatory from the help menus. However, some require additional explanations and are provided below. ADDRESS/OFFSET OPTIONS ---------------------- The address option allows you to specify an address within the file. This is useful for patching COM files and the like when the address of the patch is known. Note that when EDFILE'ing COM files, EDFILE automatically sets the offset to 0100h. The offset can be changed by typing 'O' at the command level and entering the desired offset. The headings will be adjusted for the different offset automatically. The address option always references the starting offset so that locations within programs which don't begin at 0100h (overlays, for example) can be easily referenced once the offset has been properly programmed. The Address option also has a wrap-around feature so that references below the current offset will be readjusted. This feature can be quite handy when tinkering around with COM files. You have to experiment a little to pickup the usefulness of these options. SEARCH OPTION ------------- The 'search' option is the most involved because it offers so many different possibilites. The description provided here should provide enough information to effectively use it. String searches normally start from the current record and proceed until the end of the file (EOF) is encountered. Certain suboptions can alter this sequence. If a match is not found, the program will indicate this and restore the screen to the record last displayed. The search can be aborted at any time by simply striking a key. If a string match occurs across records, the search will stop on the last record read into its' local buffer and position the cursor at the end of the found string. It just wasn't worth putting in the extra code to handle this wierd situation. When using the Occurrence ('O') and Mask ('M') suboptions, the program will prompt for the occurrence number and/or search mask to be used. The suboptions are inserted after a semicolon to delimit them from the search string entered. No spaces should be inserted between the suboptions. Upper or lower case is acceptable. Example: ?Search String = \This is great\;auo Stop on string occurrence = 3 This means to search for the string 'This is great' starting from the beginning of the file, ignoring the case of the string (i.e., translate lower to upper case) and stopping on the third occurrence of the string. ASCII strings must be delimitted by backslashes ('\'). The limitation here, of course, is that you can't search for backslashes in the file. So use the hex equivalent if necessary: 5C. The 'U' suboption (translate lower case to upper case) will translate the search string to upper case automatically, as well as converting all lower case characters read from the file. So, you don't have to input the search string in upper case when using the 'U' suboption. When inputting hexidecimal values as part of a search key, they MUST be two-digit HEX (not decimal) numbers. An invalid hex digit entry will cause an error and the string entry must be reentered. Two digits must be supplied for each hex number otherwise the search won't work properly. Upper or lower case for the hexidecimal letters is acceptable. Example: ?Search String = 40,FE,e5,05 You can mix hex entries with string entries within the search key. Example: ?Search String = 40,FE,\help me\,E5,05 The Backward search suboption (B) will start the search from the current record and continue towards the start of the file. It DOES NOT reverse the search string key, that is, if you enter \HELP\ for a search string key, it will not search backwards for \PLEH\. It only refers to the direction the records will be read while searching for a matching string. Also, each record is searched from the start of the record. The search stops when the start of the file (SOF) is encountered. The  Mask suboption is for those cases where bytes in a file use certain bits for special meanings. The input mask is logically AND'd with each byte in the file before comparing it to the search string. Therefore, some bytes could pass the search test but still may not be exactly what your looking for. ?Search String = 03;M Enter string search mask = 0Fh This will mask all upper nibbles (upper 4 bits of each byte) and then compare it to a 3. Therefore, any data bytes which have a 3 in the lower nibble will cause a match with the search key. When the search string is found in the file, the search is temporarily terminated and the cursor is positioned at the start of the found string. Note, that the program is NOT in the edit mode, so the next key entered is a command not an edit control key. Hit a space (or any unrecognizable command) to redump the record and place the cursor on the command line. Hit an 'E' to go into the e dit mode. The cursor will remain positioned at the start of the found string. CONTINUE SEARCH OPTION ---------------------- Hitting a 'C' at the command level will restart the search from the current record and cursor position (if previously defined). The search facility will then look for the NEXT occurrence of the entered string sequence. The 'O' suboption is affective only on the initial start of the search. The Continue ('C') option effectively disables the occurrence value previously entered. The default string occurrence is 1, i.e., the first (or next) occurrence. The Continue option can be invoked at any time after a search string key has been entered. All other suboptions are in affect when continuing the search. RECORD EDITING -------------- Record editing is accomplished by typing an 'E' at the command level. When in the edit mode, there are two modes of editing. You can edit the HEXIDECIMAL field area of the record or the ASCII field area. When entering the edit mode the cursor will be positioned at the upper left corner in the HEX data field of the current record. To switch to the ASCII data field of the record, simply enter a CTRL-T. This will toggle the cursor between the two fields. The HEX field area will only accept hexidecimal digits for inputs. The ASCII field will accept all key inputs including control key inputs if they are preceeded by an ESC key. For example: to input a CTRL-K into the record at the current cursor position, hit the ESC key followed by a CTRL-K. The ESC key simply means 'put the next input character into the record even if its' a control character'. This is only affective in the ASCII field area. Non-control characters (i.e., regular ASCII) can be typed in directly. To make the record changes permanently to the file, they must be flushed to the disk by typing a CTRL-W. Typing a CTRL-Q will exit the edit mode without updating the file. BUGS: ==== There are currently no known bugs. However, inputs are not completely validated, therefore, some conditions could cause different results. None, however, are known to cause file crashes or anything catastrophic. Any reports of bugs will be noted and appreciated. USE UNDER TURBODOS: ================== EDFILE is especially useful under TurboDOS. Using the filename $.DSK or $.DIR upon entering EDFILE allows editing of the disk and/or directory. I use EDFILE in every case when I need to look at the disk directory and make changes to it. The search facility makes this task a breeze. BACKGROUND INFO: =============== EDFILE was written in a language called SIL (Systems Implementation Language) which was obtained from DDJ and then enhanced and improved at Digilog, Inc for use in writing systems programs and utilities. SIL is very similar to 'C' but allows true inline 8080/Z80 assembly language coding (very useful) and compiles to actual assembly mnemonics. The output of the compiler is passed to Digital Research Inc's Relocatable Assembler (RMAC) and then to DRI's Linker (LINK). No special tricks were used in this program; that is, no system specific calls or locations were referenced, therefore, it should run on any CP/M or equivalent system. Of course, Murphy is lurking around, so don't depend on that assumption. FUTURE VERSIONS: =============== On the wish list is to add the capability to read and edit the data off of the disk on a track/sector basis. Any other ideas will be seriously considered in future versions of EDFILE. Thanks and good EDFILE'ing. Problems, suggestions or questions can be sent to me on my CompuServe number (#72345,1540) or via my home address: Mike Mosko 519 E. Station Ave. Coopersburg, PA 18036 ompuServe num utilities. SIL is very similar to 'C' but allows true inline 8080/Z80 assembly language coding (very useful) and compi EDFILE 3 UPDATE 1-12-87 Eugene L. Pizzetta 481 Revere Street Revere, MA 02151 Voice - (617) 284-0891 This update was made to allow EDFILE to be used with CP/M machines whose cursor keys default to WordStar's diamond pattern (^S, ^D, ^E, ^X). Although the old version provided a patch area for cursor codes, the ^E and ^X conflicted with built commands to toggle between the hex and ASCII areas of the display and to abort the edit, respectively. The command to toggle between the hex and ASCII display areas has been changed to ^T. The command to abort the edit has been changed to ^Q. The documentation has been modified to reflect these changes, as have the built-in help screens. Two earlier patches have also been incorporated into this version: 1. From Dennis Recla, Dallas, Texas, 1/10/84, fixing an  error in the Cursor up and Cursor down portion of the program. The original version dated 01/09/84 had them reversed. The doc file was revised to correct the same errors in it. I also added a short paragraph describing the proceedure for writing the changes to the memory buffer, and to use CTRL-C to write the memory buffer to the disk. 2. From Clint Lew, South Bay Techincal Support RCP/M , 9/84, two small bugs. The first bug limited the size of the file to which direct jumps could be made. In the original version, for files greater than about 8000H, the "dump relative address" or "A" command would not consistently jump directly to all addresses. (Actually the address jump limit was dependent upon the file size). The second bug was a minor problem in that a jump to an address which happened to be on a sector boundary would send you to the block before the desired block. n that a jump to an address which happened to be on a sector boundary would send you to the block before the desi*K͞+  '+FÎr7 :2!q: ʊ *M8 ^#V#*~#fo^#*~#fo^#V#*n^#*n^#V# ~#fo^#& ~#fo!+!#!+!#!+!+}|z{|}|z7||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#z/W{/_!9~#fo! ! ! ! ! ! !9~#A"s!`*"!"!Y">2>2>22!"!"!@"!" ʞ!F#x±~#±!b2r~# "2r+}|~#G:rx"2r+w# +6#!6#2w2x*s!>r<o&F=-` r'~h6!+`W?_!~7z?` :>ª@w#.¶66*>?w#> w#.7:77!a{   `OE!y6$ -7rBo&))T])))!y*:":l.3::2:":|!}Ž!.3ʤ!‘!/3>G>)͢3é!#ͫ'͜))̓(Ͱ0!͐&+ͽ1#͜%! /3,(r&͐&͜))̓(G(~m7#^#V#"Ͱ0)))R~+̽1G~`2:2:#~2:~?>S"=2:#^#V#^#V#":^#V":::}"*:!::@ʎ"":*:#w":*:~ʪ"µ"*ͽ19+":*:+":!=":6!=":*:~*:*:s#r#*:s#r#*:s#r#*:s#r#*:s#r#::w#":*:*:s#r#*:s#r#*:s#r#*:s#r#*:s#r#::w#":*:+~2:+V+^+":V+^+":V+^+":V?ÐqéÖOÀå&!9DM! M-DUMP V1.1 ͡! Copyright (c) 1984 ͡!%by John Porter ͡!0HNot for commercial use ͡!SÉ This program allows you to dump memory to a disk.͡! PUT THE IN THE DISK YOU WANT TO OUTPUT TO ͡! Hit any key when readyͤ͡!!ͧ!  s#r!! ͧ! ~#fo!ͧ!) O What is the file name for output ?͡! w#w! ~#fo ͤͪ! s{ „ ! ~#fo! ! ns! n}¸ ! ~#fo++! s#r! ~#fo| ! w#w! ^#Vr+s\ ! ~#fo! 6! !  file=%s ͭ`i~#fo! Ͱ#|H !$ > Can't open output file ͡ͳ!N { Do you want to strip off end of file markers!Ͷ! s! n} ! End of file markers will be stripped off ͡ ! End of file markers left in place ͡! > Do you want to see memory contents displayed during the dump!Ͷ! s! n}ʙ !^ Ñ Memory contents will be displayed during the dump ͡ ! Memory contents will not be displayed ͡!  Do you want to give memory addresses in hexidecimal!Ͷ! s! n}L !% D Input memory addresses in HEX ͡z !R u Input memory addresses in DECIMAL ͡! 6#6! w#w! ~#fo! ~#fo! Input starting memory location to be copied ͡! n} ! ! %x͹ ! ! %u͹! G Input ending memory location to be copied ͡! n}m ! !a d %x͹Á ! !x { %u͹! ~#fo! ~#fo! ü Start Memory=%u, Final Memory=%u ͭ! ~#fo! ~#fo! Starting track must be LESS than ending track ͡Ë !- DUMPING NOW ͡! n}V!BQADDR VAL CHAR ͡! ~#fo! s#r! ~#fo! ~#foH! n}ʗ! ~#fon}:! n}! ~#fon&! ~#fon&! ~#fo!%u %d %c ͭ`i~#fo! ~#fon&ͼ#|:! ~#fo!/ ***** DISK FULL at memory location %d ͭͳ! ^#Vr+sf`i~#fo!ͼ`i~#foͿ`i~#fo!tÈ That's all folks ͡! 9å?qÐ!9DM! ͙! ~#fo͜! Yes or No? (RETURN for default) ͜͢͟`is`in} ! ͙`in}Y N&,!6!6! n&6!9E!9DM͐n}o! ^#Vr+sn&BMwI!9DM! n&t|ʞ! n&ã! n&òx?!y9DM! `iͬ`iͯ!9&!9DM͐! ~#fo͐ s#rz!! ~#fo! ~#fos#r! ~#fo##6#6! ~#fo~#foXWþ!y9DM`iR! `iUw!9ÌÄ!9DM͐+|¬! n&̓͐++|! n&!͆͐+++|! n&!͆! ~#fo##^#Vr+sz"! ~#fo^#Vr+s! ns&!! ~#fo! ~#fo~#fo͉T!! ~#fo##6#6! ~#fo! ~#fos#r! ~#fo^#Vr+s! ns&ñÄ=!9DM͐!! ~#fo##~#fo!! ~#fo##~#fo`is#r͐! ~#fo! ~#fo~#foͨ͐B!͐+?`is#r! ~#fo##~#fo|!! ~#fo! ~#fo͐ͫ! ~#fo##~#fo͐s#r! ~#fo~#fo͐s#r!!! ~#fo~#foͮ! ~#fo##6#6! ~#fo! ~#fos#r!!9,è!9DM! ~#fo~#fo)!9DM! n&aͯt! n&zͯÇÆõq!i9DM! ^#Vr+s~#fo! s#r͐! s#r! ^#Vr+sn`is{ʯ`in}%™! ! s#r! 6#6! s! s͐n}-! ^#Vr+s! 4͐n&~}/! ́2!! s#r! ^#Vr+sn`is{.z! ́! s#r! 4! ^#Vr+sn`is`in&̈́}DʦUXOC:SkÃ͐~#fo|! ^#Vr+s6-͐͐~#fos#r! ^#Vr+s! 6 ! 6! 6! ~#fo! n&! ^#Vr+s~#fo! {ѯgs#r! ^#Vr+s! ^#Vr+s~#fos! ^#Vr+s! n}~! 6#6! ^#Vr+s~#fo! s#r͐n}͐|! ^#Vr+s! ^#Vr+sns! ^#Vr+s! ^#Vr+sÙ͐6! ! s#r! n}&! ^#Vr+s!&! ^#Vr+s6 ͐! ^#Vr+sns{O! ^#Vr+s&! n}ʀ! ^#Vr+s!Ҁ! ^#Vr+s6 YÖ! ^#Vr+s`insì! ^#Vr+s`insö͐6!9KqÑë!9DM! ^#Vr+s~#fo! s#r͐! s#r! 6! ^#Vr+sn! s{͐n}2! n&! n&|F! n}%ʄ! n! v! n&Á! ^#Vr+s! 6#6! 6 `i6! ^#Vr+sn! s{*`i4! ^#Vr+sn! s! n&}XODU.SʺCMÉ! 6.! 6.! -.! 6#6! ^#Vr+s! w#w! n&! #|]! n&! n&! ^#Vr+sn&! s{ʬ͐ ! nѯg?! nѯg! s#r]! ^#Vr+sÓ! ͐ ~#fo! s#r! ^#Vr+sn! s{+! n͐n} ! ^#Vr+s+`in}(! ^#Vr+s! ns`in}J! 4͐6! ^#Vr+s`in}{͐n&! ^#Vr+s~#fo! 4! ^#Vr+s! n&`in}! ^#Vr+s~#fo͐ ͐?s#r! 4! n&!9!9DM͐͐ 2͐^#Vr+s͐ ͐0'͐7s!&}͐ ͐͐ ͉͐`is͐ ͐͐ )͐`in&#&}!9!9DM! n&0ͯڱ! n&9ͯûÆ!9DM`iw#w͐~#fon&͸}͐ ?͐^#Vr+snѯg`is#r͐!9!9DM! n} ͝G! n} ͝G! n} ͝Q!9DM͐~#fon`isN|ʀ͐^#Vr+sY`in&È!9Ý'qÆ!9DM! n&͗! s͔|! n&s! n&͚}! n&s!! n! n&+!%! n&0aI!9DM! n&*|ͣ]! n&-|ͣ!9DM! n&Aͯڌ! n&Zͯ:woʟ2w&!o  . &7:O*o`     _  !\&!/ö7*)\!*, 6  #F#x~#r7:)~:,"s!"u*|*u*~#"*s*u#"u*+"î7*|DM**7><~# x ><+~+ x+|}C7:,*@:*e}|2q ʖŒ:qwʇ! {w#7*:w7,2q*&:q):==r:qo& , FNxg>Goy $`in&È!9Ý'qÆ!9DM! n&͗! s͔|! n&s! n&͚}! n&s!! 11/1/1984 M-DUM v 1. copyrigh (c 1984 b Joh Porter Fre fo use bu no fo sale. M-Dum i progra tha allow yo cop wha i i you computer' memor directl t dis file I ca b use t recove tex tha wa i memor a th tim softwar o hardwar erro cause th compute t "loc up" Runnin M-Dump: WHY: Typically M-Dum i use followin proble wit tex editin program I th tex editin progra become unresponsiv t you commands th onl optio ma b t hi th rese butto o ke an d col boot Typically col boo reset th compute an reload CP/M I doe not howeve eras wha i i memor  (i.e al tha tex tha yo jus type in) Th tric i ho t ge tha tex bac ou again I yo reente you tex editin program i wil overwrit th portio o memor th tex i store in M-Dum ma b use t sav th da b copyin th portio o memor tha ha th tex store i i t dis file Yo ma the us you tex edito t edi th fil produce b M- Dum t recove th tex withi it. DOIN IT: T ru M-DUMP jus typ M-DUMPxx wher x i th versio number I wil the tel yo wha th progra doe an instruc yo t plac i dis driv dis t whic yo wan t cop th output Pu i th dis an hi 'return' Th progra wil the as yo questions Th firs i whethe yo wan t stri ou end-of-fil marker (control-z fro wha i i memory Th defaul i YES sinc mos tex editor sto readin inpu a th firs end-of- fil marke the encounter Th second i whethe yo wan th memor content displaye o th screen characte a time a the ar dumpe t disk Th defaul fo thi i NO sinc thi slow th program down considerably. Th progra wil as whethe yo wan t refe t th memor addresse usin hexadecima numbers Th defaul i NO whic means that decimal numbers for addresses should be given. Finally th progra wil as fo th startin an endin memor addresse t b dumped Fo WORDSTAҠ 3.0 store tex seem t star shortl afte addres 3000 (decimal an en abou addres 5100 (decimal) Fo PERFEC WRITER th startin an endin addresse o 3950 (decimal an 5600 (decimal see t work Thes addresse ar onl guideline an ma var betwee computers I i no critica tha yo kno exactl wher you 1 tex is I yo wan to yo ma dum th entir memor t fil and locate the text with your text editor! WHAT TO DO AFTERWARDS: Whe yo loo a th content o th dis fil produce b M-Dump usin eithe th CP/ TYP comman o you tex editor yo wil probabl notic lot o ver strang character comin befor an afte th text Thes ar th machin languag instruction tha wer als store i memory The shoul constitut n problem Jus ge int you tex edito an delet them Th tex itsel ma b somewha mixe up sinc mos tex editor mov th piece aroun i memor quit bit bu th majorit o th tex shoul b recognizable. Thi progra wa writte b Joh Porte o KAYPR Iɠ computer runnin CP/ 2.2 I yo hav an problem ma b contacte vi th Dept o Environmenta Sciences Clar Hall Univ o Virginia, Charlottesville, VA 22903 (804) 924-6846. CP/M is a trademark of Digital Research Corp. WORDSTAR is a trademark of MicroPro International Corp. PERFECT WRITER is a trademark of Perfect Software, Inc. 2  wer als store i memory The shoul constitut n problem Jus ge int you tex edito an delet them Th tex itsel ma b somewha mixe up sinc mos tex editor mov th piece aroun i memor quit bit bu th majorit o th tex shoul b recognizable. Thi progra wa writte b Joh Porte o8 ;b͸{A"A"o&w{ÖüH!K]jU 2͵ ^#V#*~#fo^#*~#fo^#V#*n^#*n^#V# ~#fo^#& ~#fo!+!#!+!#!+!+}|z{|}|z7||7zZZ)|/g}/o#|͉k|/g}/o#ɯ2hZZk:h|/g}/o#|/g}/o#:h<2hqDM!xxGyO҃)v|͔`i|)Öxڷz/W{/_ѯzW{_=yOxGæ2hZZ͉M|}ȯ|g}o)|/g}/o#z/W{/_!9~#fo! ! ! ! ! ! P!9~#A!9"w**w"j!z*"d!"f!Y"H>2^>2a>2`2c>2s2t>2r>2v!"@!"D!@"B!"F !F#x:~#!|2i~# :" 2i +}|~#:G:ix."2i+w# +6#!6#@A2n2?*j**|+`"d!"f!!>ڌo&͖=}  w~2ʸͼ56!+W ?_!~7z?ͧ:>͞@w#5 .ww#w#w#w*>?@͌>w#͌5> w#@ͧ͵g 2q&0OxG͵j/ʆSx\͞.7:77!a{  ʨ ʨ0:?ŷO !y$ 7o&))T])))!y 2p_ :p6)))Y~0̿7G~`2@2@#~2@~?>&=2@#^#V#^#V#"@^#V"@:@ '*{@!:@@'"@*@#w"@*@~9'D'/Ϳ7͈?+"@*@+"@!6D"@6!^D"@*@~*@*@s#r#*@s#r#*@s#r#*@s#r#*@s#r#:@w#"@'*@*@s#r#*@s#r#*@s#r#*@s#r#*@s#r#:@w#"@'|E'}X27*@+~2@+V+^+"@V+^+"@V+^+"@V+^+"@V+^"@"@*@+~2@+V+^+"@V+^+"@V+^+"@V+^+"@V+^"@"@p';(ͯ''͋(!"@"K@2@<2@2@2@ͥ)()(*¾(2@2@(S*(#)2@2@)l*{~eïú0ò1UÜÁô-!9DM!ͻ!< !ͻ**6#6*6#6! ! #|K !p ;!ͻ͐+|ˆ ! ;!ͻ! ;!ͻ! ;!ͻ! ;!ͻ!%;!*s!C;!*s#r!g;!*s!;!+*&s#r!;!8*$s#r!;!*s!;!AM* s#r!;!*sk} !;!*s#r͐++| !;!**s#r!ͻ!2;k &*6#6M͐: *w#wMM) *! ~#foM)~#fo*s#rzk !ͻ!L;*"w#w*6*(6#6!!** s{ k } k &|g}o* sk }  kkѯgW!  k &k } M&*,s#r*"^#Vr+s*,^#Vr+s!|n *"^#Vr+s! = M"M$ M(k}ʗ k}© !ͻ*(^#Vr+s*"w#wÛ M"| M(*k} MM M͐ *^#Vr+s *^#Vr+s MPRINT v1.1 28 Nov 1985 Peter Brawley$Too many files.$Usage: MPRINT filename.$ Exclude files with $ may include <*> and $To select default settings [ ], press RETURN.$Output to PRINTER [yes] ? $Left margin indentation [0] ==> $Tab setting [8] ==> $Line spacing [1] ==> $Lines / page [56] ==> $Print page numbers [yes] ? $Text width [65] ? $Page pause [no] ? $Number of copies [1] ==> $Starting page [1] ==> $HIT ANY KEY TO BEGIN ...$++ Can't open file ++$ÀØ)Zhå!9DM!h!n s͐{~#fo! s#r͐y~#fo! s#r`i6#6!l w#w!k! s#rz!M!o 6#6͐o͐6! ~#fo͐o)~#fon}!u͐o+|C! ~#fo͐)!Vs#r! ^#Vr+s!l ^#Vr+s)!D ! ~#fo͐o)~#fo#s#r(! ~#fo͐o)~#fon|! ~#fo`i^#Vr+s)! ~#fo͐o)~#fos#r(! ~#fo͐o)~#fo! q!. !B s#r! ~#fo͐o)~#fo#n!/ s{:P! ~#fo͐o)~#fon!. s!0 !B s#r!. n&!h!- 6! !- n}k!n!h!, s!, n}ˆ!- 6!, n& ?͐Bt! ~#fo͐)!. w#ks#rz!M͐8|!M!. ! ~#fo`i^#Vr+s)~#fozV!n n&!h!o ^#Vr+s!o w#w͐o͐l+!q 6#6͐q͐!n n&! ~#fo͐q)~#fo͐o)!D ~#fo}|͐q`i^#Vr+s·͐q!s s#r͐s͐ ! ~#fo͐s)! ~#fo͐s#)~#fos#r!s ^#Vr+sg!q ^#Vr+sW!o ^#Vr+s>͐y͐s#r͐{͐s#r!M!u9*.*!9DM! w#w`i6#6͐|! ~#fo͐n} —! ~#fo! ^#Vr+s! ~#fo͐n&|g}os`i^#Vr+sq! ~#fo n} ! ~#fo! ^#Vr+s6.`i6 #6͐|w! ~#fo͐n} 4w! ~#fo! ^#Vr+s! ~#fo͐n&|g}os`i^#Vr+s! ~#fo͐6͐Ï!9!9DM! ^#Vr+sn`is{`in}*`in}?!à!!9!9DM! ~#fo#n}:C! ~#fo#n}:@! ~#fon&! n&:! ~#fo##s#r@!uÊ! ~#fo#n}:ʊ! ~#fon&! n&„! ~#fo##s#rÊ!u! ^#Vr+sn`is{\`in}?! ^#Vr+sn`is{`in}.Ê!uY`in}*5͐n`is{ ! ^#Vr+s`in}. ͐n`is{2! ^#Vr+s`in}./2 Y`in! ^#Vr+sn}SÊY!uÊ͐n}o!uu!u!9Ä!9DM͐! ́â!9DM! n&!͟k}! n&!͟*4kk}*6Ü!9DM͐|/! n&! ^#Vr+s7k}ͣWM(M*ͯ*sM! 4*6Á!9DM! ~5o&|ڸ! !~! !~Éò{!9DMk &ͽ! s! n} !! n`is! n}Y`i6! n}N`i6`in&'!99I'!9DM! ! 3! 6`is#r͐|q͐`is#r͐x!9ÊÜ!9DMk}ʔ! ̈́M"M$###! ̈́*"^#Vr+sä*w#w*^#Vr+sM ! ̈́*w#w*^#Vr+sM`i͐ 0s! ~#fo s#r!|M|ڄ*^#Vr+s`in&̈́W! ̈́! ̈́k}ʫ! !͇! 9{~úï!ͷ!ͺ!ͽ}!!CONTINUE ? $ Å!9DM͐!͐s#rz5!͐##w#w͐6͐~#foaò!9DM͐|xX$͐+++|![$͐##^#Vr+s| !͐͐~#fo^`is#r!|͐##^#Vr+s$͐##͐?+s#r͐͐s#r͐^#Vr+sn&$!96Ö !9DM͐N!͐0͐~#fo3!9DM`iw#w! ^#Vr+sn}ʕ`i^#Vr+sv͐Ü!9!9DM͐`is#r! ^#Vr+s! ^#Vr+sns{÷͐!9Q!9DM! n&|! n&!! n&&-À!9DM`iw#w! 6#6͐ n! s{ `! n} n! ^#Vr+sD! n}-! 6#6! ^#Vr+s! ^#Vr+sn! s*|͐ ?! nѯg`is#rÍ͐͐?!9Ù M!Þ!!9DM͐ !H͐n&|g}o|+!H͐##~#fo|D!H͐##~#fo`is#r͐͐͐~#fo͐ʑ!H͐+?`is#r͐##~#fo|!!͐͐͐͐##~#fo͐s#r͐~#fo͐s#r!!͐~#foH͐##6#6͐͐s#r!H!9!9DM! n&|ͯ|! n&|ͩ!9DM! n&|ͯګ! n&|ͩ :no2n& !o  . &7:PO*R *d+*f|/g}/o#9"#"dz{7*R~# 0 0+*P&!O  9q  #F#Hx~~#qi&7,Ҕ> 2h*P/:q2> :h):R==> :qw#w#w:ho&552?7:P)V>ڐ z>ʐ z2:P,"j!"l*T|*l( 5*R*j!ѷY 2?S S !# *l# *T+"T*R"R*l#"l*j! N#Fp+qx ##6>2? 2?#7:P)"XV>G!z> G!z2:P,"j!"l*T| *j!^#V*X#^#V r+s*l5*R"R*j"*l!2? #"l*T+"T*j! N#Fp+qx ##6>2? 2?7*T|DM*R*P|!>Һ!2?!^#V*R:T!=!!*P͡!*R!s#r ,">2?)~2#"j!!~#fo#^#Vp+q*j~#fo;"s#r5!9DM! n&|ͯګ! n&|ͩ :no2n& !o  . &7:PO*R *d+*f|/g}/o#9"#"dz{7*R~# 0 0+*P&!O  9q  #F#Hx~~#qi&7,Ҕ> 2h*P/:q2> :h):R==> :qw#w#w:ho&552?7:P)V>ڐ z>ʐ z2:P,"j!"l*T|*l( 5*R*j!ѷY 2?S S !# *l# *T+"T*R"R*l#"l*j! N#Fp+qx ##6>2? 2?#7:P)"XV>G!z> G!z2:P,"j!"l*T| *j!^#V*X#^#V r+s*l5*R------------------------- MPRINT A multi-file, multi-copy print utility with these features: - command line accepts wildcards for print list, and !wildcards for exclusion from print list; - zeroes the high bit of all input characters; - can also just screen file(s) to review page formatting etc. When MPRINT is loaded, you can set up to ten printing parameters. They all have default valuess, shown in [], which are selected by pressing . - printer output - starting page - left margin indentation - page numbering off/on - tab setting - text width - lines / page - page pause (continue/abort) - line spacing - number of copies MPRINT is written in BDS C, but many of its functions are direct CP/M BDOS calls. The source code is in mprint.c and wildexp.c. Info on compilation is also in mprint.c. Peter Brawley, 16 Hazel Ave, Toronto M4E 1C5, 699 8757. /* BDS C MULTIPLE FILE PRINT utility. Created June 14, 1984. All output through BDOS calls, for speed and compactness. v1.1 28 Nov 1985 Compile with: cc mprint -e3000 clink mprint -n -s MPRINT features: command line accepts wildcard filenames zeroes the high bit of all input characters screens file(s) with or without printer output user options: printer output left margin indentation tab setting lines / page line spacing starting page page numbering text width page pause [continue / abort] number of copies (6/6/85) */ #include /* Constants */ #define CHAREOF 255 /* CHAR represemtation of -1 */ #define LF 10 #define FF 12 #define CR 13 #define SPACE 32 /* Global vars */ char ibuf [BUFSIZ]; char c, kars, pagenum, ppause, printer, printing, tabb; int copy, copies, f, fd, i, indent, width; int line, lines, linesp, page, start, temp; main (argc, argv) int argc; char **argv; { /* Sign on */ nline (2); mesg ("MPRINT v1.1 28 Nov 1985 Peter Brawley$"); nline (2); start = 1; copies = 1; /* Check wildcard syntax */ if (wildexp (&argc, &argv) == ERROR) { mesg ("Too many files.$"); nline (1); exit (); } if (argc == 1) { mesg ("Usage: MPRINT filename.$"); nline (1); mesg (" Exclude files with $"); nline (1); mesg (" may include <*> and $"); nline (1); exit (); } /* Initialise vars */ mesg ("To select default settings [ ], press RETURN.$"); nline (2); /* Printer output ? */ mesg ("Output to PRINTER [yes] ? $"); printer = bool (TRUE); /* Left margin */ mesg ("Left margin indentation [0] ==> $"); indent = number (0); /* Tab setting */ mesg ("Tab setting [8] ==> $"); tabb = number (8); /* Line spacing */ mesg ("Line spacing [1] ==> $"); linesp = number (1) - 1; /* Lines per page */ mesg ("Lines / page [56] ==> $"); lines = number (56); /* Print page numbers ? */ mesg ("Print page numbers [yes] ? $"); pagenum = bool (TRUE); /* Width ? */ mesg ("Text width [65] ? $"); width = (number (65) / 2) + indent; /* Page pause ? */ mesg ("Page pause [no] ? $"); ppause = bool (FALSE); if (printer) { /* Number of copies */ mesg ("Number of copies [1] ==> $"); copies = number (1); /* Starting page */ if (argc == 2) { mesg ("Starting page [1] ==> $"); start = number (1); } nline (2); mesg ("HIT ANY KEY TO BEGIN ...$"); getchar (c); } for (f = 1; f < argc; f++) { for (copy = 0; copy < copies; copy++) { if ((fd = fopen (argv [f], ibuf)) == ERROR) { nline (1); mesg ("++ Can't open file ++$"); exit (); } line = 0; kars = 0; page = 1; /* Start with a clear screen */ bdos (2, CPMEOF); leftmargin (); /* Read the file char by char, zero the high bit */ while ((c = getc (ibuf)) != CHAREOF && c != CPMEOF) { /* Strip high bit */ c = c & 127; /* If it's a tab, expand it */ if (c == 9) repeat (SPACE, tabb-kars); else print (c); /* End of line */ if (c == LF) { temp = linesp; line++; while (temp-- > 0) { line++; print (LF); } /* End of page */ if (line >= lines) { endpage (page); if (ppause) pause (); if (ppause == FALSE) nline (3); page++; line = 0; } leftmargin (); } } /* Pad last page */ if (line != 0) endpage (page); fclose (ibuf); if (ppause && (copy < copies || f < argc)) pause (); } } } mesg (msg) char *msg; { bdos (9, msg); } print (k) char k; { bdos (2, k); if (printing) bdos (5, k); kars ++; if (kars == tabb) kars = 0; } repeat (k, howmany) char k; int howmany; { while (howmany > 0) { print (k); howmany --; } } leftmargin () { printing = (printer && page >= start); repeat (SPACE, indent); kars = 0; } nline (nl) char nl; { while (nl-- > 0) { bdos (2, CR); bdos (2, LF); } } char bool (def) char def; /* Set to DEFault unless user typed or */ { char b, choice; choice = toupper (getchar (c)); /* Print crlf if one wasn't typed */ if (choice != '\n') nline (1); b = def; if (choice == 'Y') b = TRUE; if (choice == 'N') b = FALSE; return (b); } number (def) int def; /* Input a string, convert to integer value */ { int num; char *nbuff [10]; getline (nbuff, 10); num = atoi (nbuff); if (num == 0) num = def; return (num); } endpage (pg) int pg ;  /* Pad the page, print page# if is true */ { char s [10]; if (pagenum) { print (CR); while (line < (lines+3)) { print (LF); line ++; } i = 0; while (i++ < width) print (SPACE); i = 0; /* Convert integer to ASCII, print it */ do { i ++; s [i] = (pg % 10) + '0'; } while ((pg /= 10) > 0); while (i > 0) print (s [i--]); print (CR); print (LF); } if (printing) bdos (5, FF); } pause () { nline (1); mesg ("CONTINUE ? $"); if (!bool (TRUE)) exit (); bdos (2, CPMEOF); } typed */ if (choice != '\n') nline (1); b = def; if (choice == 'Y') b = TRUE; if (choice == 'N') b = FALSE; return (b); } number (def) int def; /* Input a string, convert to integer value */ { int num; char *nbuff [10]; getline (nbuff, 10); num = atoi (nbuff); if (num == 0) num = def; return (num); } endpage (pg) int pg ; /* WILDEXP.C v1.2 9/25/82 BDS C Command-line Wild-card expansion utility Written by Leor Zolman Lets ambiguous file names appear on the command line to C programs, automatically expanding the parameter list to contain all files that fit the afn's. Returns ERROR if something went wrong; usually, this is due to MAXITEMS being set too low; the "MAXITEMS" defined constant sets the maximum number of matches that WILDEXP can handle. If you need to be able to process directories with more entries than this, be sure to modify MAXITEMS to be bigger than the largest expected directory size. An afn preceded by a "!" causes all names matching the given afn to be EXCLUDED from the resulting expansion list. Thus, to yield a command line containing all files except "COM" files, you'd say: A>progname !*.com Another example: to get all files on B: except .C files, say: A>prognam b:*.* !b:*.c When giving a "!" afn, "*" chars in the string matches to the end of either the filename or extension, just like CP/M, but "?" chars match ONE and ONLY ONE character in either the filename or extension. To use WILDEXP, begin your "main" function as follows: --------------------------------------------- main(argc,argv) char **argv; { ... /* local declarations */ if (wildexp(&argc,&argv) == ERROR) /* 1st state. in prog. */ exit(puts("Wildexp overflow")); dioinit(&argc,argv); /* if using DIO */ ... --------------------------------------------- and link WILDEXP.CRL in with your program. That's all there is to it; note that "wildexp" uses the "sbrk" function to obtain storage, so don't go playing around with memory that is outside of the external or stack areas unless you obtain the memory through "sbrk" or "alloc" calls. */ #include #define MAXITEMS 200 /* max no. of items after expansion */ #define SEARCH_FIRST 17 /* BDOS calls */ #define SEARCH_NEXT 18 wildexp(oargcp, oargvp) int *oargcp; /* pointer to old argc */ char ***oargvp; /* pointer to old argv */ { int nargc; /* new argc */ char **nargv; /* new argv */ char **oargv; /* old argv */ int oargc; /* old argc */ char fcb[36]; /* fcb used for search for first/next calls */ char dmapos; /* value returned by search calls */ char first_time; /* used in search routine */ char tmpfn[20], /* temp filename buffer */ *tmpfnp; char *notfns[20]; /* list of ! entries */ int notcount; /* count of entries in notfns */ char cur_drive; /* currently logged drive */ int i,j,k; cur_drive = bdos(25); oargv = *oargvp; oargc = *oargcp; nargc = 1; notcount = 0; if ((nargv = sbrk(MAXITEMS * 2 + 2)) == ERROR) return ERROR; for (i = 1; i < oargc; i++) if (oargv[i][0] == '!') { if (i == 1) { oargv[oargc] = "*.*"; oargc++; } notfns[notcount++] = &oargv[i][1]; } else if (!haswild(oargv[i])) nargv[nargc++] = oargv[i]; else { setfcb(fcb,oargv[i]); tmpfnp = tmpfn; if ((tmpfn[1] = oargv[i][1]) == ':') { tmpfn[0] = oargv[i][0]; tmpfnp = tmpfn + 2; bdos(14,tmpfn[0] - 'A'); } first_time = TRUE; while (1) { /* find all matching files */ dmapos = bdos(first_time ? SEARCH_FIRST : SEARCH_NEXT, fcb); if (dmapos == 255) break; first_time = FALSE; hackname(tmpfnp,(BASE + 0x80 + dmapos * 32)); if ((nargv[nargc] = sbrk(strlen(tmpfn) + 1)) == ERROR) return ERROR; if (nargc >= MAXITEMS) return ERROR; strcpy(nargv[nargc++], tmpfn); } bdos(14,cur_drive); /* restore to current drive */ } for (i = 0; i < notcount; i++) for (j = 1; j < nargc; j++) while (match(notfns[i],nargv[j],cur_drive)) { if(j == --nargc) break; for (k = j; k < nargc; k++) nargv[k] = nargv[k+1]; } *oargcp = nargc; *oargvp = nargv; return 0; } hackname(dest,source) char *dest, *source; { int i,j; j = 0; for (i = 1; i < 9; i++) { if (source[i] == ' ') break; dest[j++] = source[i] & 0x7F; } if (source[9] != ' ') dest[j++] = '.'; for (i = 9; i < 12; i++) { if (source[i] == ' ') break; dest[j++] = source[i] & 0x7F; } dest[j] = '\0'; return dest; } int haswild(fname) char *fname; { char c; while (c = *fname++) if (c == '*' || c == '?') return TRUE; return FALSE; } int match(wildnam, filnam, cur_drive) char *wildnam, *filnam, cur_drive; { char c; if (wildnam[1] != ':') { if (filnam[1] == ':') if (filnam[0] - 'A' == cur_drive) filnam += 2; else return FALSE; } else { if (filnam[1] != ':') if (wildnam[0] - 'A' == cur_drive) wildnam += 2; else return FALSE; } while (c = *wildnam++) if (c == '?') if ((c = *filnam++) && c != '.') continue; else return FALSE; else if (c == '*') { while (c = *wildnam) { wildnam++; if (c == '.') break; } while (c = *filnam) { filnam++; if (c == '.') break; } } else if (c == *filnam++) continue; else return FALSE; if (!*filnam) return TRUE; else return FALSE; } f (source[i] == ' ') break; dest[j++] = source[i] & 0x7F; } dest[j] = '\0'; return dest; } int haswild(fname) char *fname; { char c; while (c = *fname++) if (c == '*' || c == '?') return TRUE; return FALSE; } int match(wildnam, filnam, cur_drive) char *wildnam, *filnam, cur_drive; { char c; if (wildnam[1] != ':') { if (filnam[1] == ':') if (filnam[0] - 'A' == cur_drive) filnam += 2; else return FALSE; } else { if (filnam[1] != ':') if (wildnam[0] - 'A' == cur_drive) wildnam += 2; else return FALSE; } while (c = *wildnam++) if (c == '?') if ((c = *filnam++) && c != '.') continue; else return FALSE; else if (c == '*') { while (c = *wildnam) { wildnam++; if (c == '.') break; } while (c = *filnam) { filnam++; if (c == '.') break; } } ^  SCAN Commands: ================================================== First Line ----------------> 1 Next Page -----------------> ^C, Space Previous Page -------------> ^R, B Next Line -----------------> ^X, N, CR Previous Line -------------> ^E, P Scroll Display Left -------> ^S, Backspace Scroll Display Right ------> ^D, Tab Set Display Width/Scroll --> S EXIT SCAN -----------------> Q, Esc ================================================== Any other command will display this help screen... `!9" 1 !F#* +:ґ0Һ2!m 6!e~ ²6L#6B#6R+n n B ?Pu P! ~`#    A M !` SCAN Version 1.2 - buffered bi-directional text file scroll utility Usage: SCAN [du:]fn.ft [member] [columns [scroll lines]] Examples: SCAN TXT50.ASM - displays normal file SCAN TXT50.AQM - displays squeezed file SCAN TXT50.DOC 65 20 - displays file and sets screen display to 65 columns wide and 20 lines/scroll SCAN TXT50.LBR - displays directory of LBR SCAN TXT50 TXT50.AQM - displays member file in LBR $ >^ @ :<2W: 2cay{y 1 B NPQ  S$    :2:=2:<:<2 $~+  :=2##:* :}2}:~2~`! !222}*"} **}2 !":½ \! *}#"}*#"= *}*= !*}*| Program failure, non-contiguous sectors requested from unsqueeze rtn  *-!$" $* $" $^#V#N#~222y2*i">222Wp}W>_*%"*"}*eM:Gy”<)œ%=\** $s#r#w#p#" $ >>> Unsqueezing text <<<!   *}"*)l&""}">:] 2h\ < file not found $ ~# n 0ڤ ?ڤ zWW~#ʛ z z=wxd   0w++ x q# q~# _ _! : {  4:{ 6 >G>  :2  !F# :g:. } |g 2|2þ / q#\ * \1 F f xB ͠ g 6# 6 #S 6#\  #i :~^ Aڄ @#~#:+xG~0G#~:Œ #ͼ ~.#yʶ  ì ͼ #^  ¼ # ~. :ȷS  ) " 2 = go>  : * > y# "    go\ ]  y!a{   ɯ22*  ʭ : File is not a library  >2!~=2G: Library file, containing: !+~< :   ʆ <  #~ # x >.  !~#44 6 ; :   :} Member file not found in LBR directory    ##~#fo ~#fo"": Cannot display member in squeezed library  ?P Member is empty   # |}~# +~# +~#6ɯoe222222"*""}!%"""v>2*ڌ"ʻ Invalid decode tree size  ! $" $" |"| !"|xw#q#s#*+|}/o|/:N*!"O:O>=GGyOx;22! " !jl*w#R:|=2:͠›͠‘>==2:2:O:¹ O>=2! !F#yOx#^ ʧy2{>  go Unexpected EOF  **!~#":K Read past EOF on SQ file  *!%"*"}o|g)D*}"*}"x"2"** N* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * SCAN version 1.2 * * * * A Buffered Bi-directional Text File Scroll Utility * * * * Terry Hazen * * Los Gatos, California * * 09/29/85 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * INTRODUCTION... SCAN is a buffered bi-directional text file scroll utility that was adapted from BISHOW, Version 3.01. The name was changed to avoid conflicts with possible newer BISHOW versions, and because BISHOW's assembly-time options were deleted. The DU: form is now supported and most control characters are displayed. File scroll commands may be customized by the user. SCAN will display normal ASCII files, squeezed files, and will display LBR members and directories. SCAN displays most control characters, a useful feature when viewing WordStar and similar files with embedded print and format control characters. SCAN can replace TYPE, LDIR, LTYPE, TYPEL, etc, in many situations. SCAN requires a terminal with home cursor and erase screen functions. Scrolling backwards by page or by line is done by erasing and re-displaying the text, so that SCAN works more satisfactorily on high baud rate terminals like the WYSE, which supports 38400 baud. THE SCAN COMMAND LINE... The SCAN command line may include the filename with optional du: specification, and optional library member name. The screen display width and number of lines per scroll may also be changed. Usage: SCAN [du:]fn.ft [member] [columns [scroll lines]] Examples: SCAN - displays usage help screen SCAN TXT50.ASM - displays normal file SCAN TXT50.AQM - displays squeezed file SCAN TXT50.DOC 65 20 - displays file and sets screen display to 65 columns wide and 20 lines/scroll SCAN TXT50.LBR - displays directory of LBR when .LBR extension is used and no member name is specified SCAN TXT50 TXT50.AQM - displays member file in LBR Command Line Options: [du:] - Normal drive and/or user specification [member] - Displays a member file in a library. The use of the .LBR extension in the library filename is optional. [columns [scroll lines]] - Sets the number of columns displayed and the number of lines per scroll. The number of columns may be specified by itself, or both columns and scroll lines may be specified SCAN FILE SCROLL COMMANDS... SCAN, as supplied, has the following file scroll commands, many of them emulating WordStar cursor control commands: First Line ----------------> 1 Next Page -----------------> ^C, F, Space Previous Page -------------> ^R, B Next Line -----------------> ^X, N, CR Previous Line -------------> ^E, P Scroll Display Left -------> ^S, Backspace Scroll Display Right ------> ^D, Tab Set Display Width/Scroll --> S EXIT SCAN -----------------> Q, ESC Any other command will display a help screen. CUSTOMIZING SCAN... SCAN requires a terminal with home cursor and erase screen functions. These control sequences and any desired changes in the commands may be patched directly into SCAN.COM using DDT, PATCH, or any similar utility, at the locations given below. Some of the distribution command options emulate WordStar commands, but you may customize any or all of these commands to suit your own preferences. You may change the commands to emulate your favorite word processor, or to use your cursor arrow keys, for example. If any of the commands are changed, you should also update the help screen text beginning at 0116H. If you are using DDT or PATCH to modify SCAN.COM, use this list of functions and their corresponding addresses: HEX -DEFAULT- ADDR HEX ASCII FUNCTION ----------------------------------------------------------------- 0106H 1AH ESC Home cursor and clear screen sequences. Up to 0107H 5BH [ 7 bytes are available. The default 0108H 48H H sequences are for the VT100/ANSI. End 0109H 1AH ESC your combined sequences with 00H. 010AH 5BH [ 010BH 32H 2 010CH 4AH J 010DH 00H End of home cursor and clear screen area. 0116H Start of help screen text area. Update the text in this area with any changed commands. File Scroll Command definitions: ------------------------------- 067AH 31H 1 First Line command. 067FH 20H SPACE Next Page command, first option. 0684H 03H ^C Next Page command, second option. 0689H 42H B Previous Page command, first option. 068EH 12H ^R Previous Page command, second option. 0693H 0DH CR Next Line command, first option. 0698H 4EH N Next Line command, second option. 069DH 1AH ^Z Next Line command, third option. 06A2H 50H P Previous Line command, first option. 06A7H 17H ^W Previous Line command, second option. 06ACH 51H Q Exit command, first option. 06B1H 1BH ESC Exit command, second option. 06B6H 53H S Set Screen Display command. 06BBH 08H BS Scroll Display Left command, first option. 06C0H 13H ^S Scroll Display Left command, first option. 06C5H 09H TAB Scroll Display Right command, first option. 06CAH 04H ^D Scroll Display Right command, first option. Default Settings: ---------------- 08B8H 3EH > Beginning of >>> Unsqueezing text <<< msg. If this message annoys you, put a 00H here. 0D38H 3AH : Fence character for LBR directory display. 10A7H 17H (23 dec) Default number of lines per scroll. 10A8H 4EH (78 dec) Default number of columns displayed - 1 (79 - 1). 79 is used, as some terminals do not allow the 80th column to be filled without going to the next line. 10B8H 00H (0 dec) Maximum number of LBR directory names to be displayed per line - 1 (1 per line - 1). Allow 14 spaces for each directory listing. Change this number if you change the default number of columns to be displayed. A 00H here causes the listings to be displayed in a single column, which is easy to read. An 04H will give 5 names per line, the maximum for 79 columns. ACKNOWLEDGEMENTS... Phil Cary wrote BISHOW 1.00, which was a buffered, bidirectional version of SHOW.ASM from Interface Age, November 1981. BISHOW was subsequently updated and enhanced by W.F.Mcgee, Lucien Pan, Keith Petersen, Bruce Ratoff, Dick Mead, Chuck Forsberg, Ted Emigh, and Frans van Duinen. The DU: code was adapted from Bob Van Valzah's FAST and Ron Fowler's MLOAD. Thanks! - Terry Hazen minals do not allow the 80th column to be filled without going to the next line. 10B8H 00H (0 dec) MaximuÀP8HJVDE 2.50 (03/87) (c)1987 E.MeyerA:@@#7LearSiegler ADM3P T= =! R=! ETeletype printer1I1* "}+ "w+ " "a ͢2-Ԣ͢2$/<2\ ͢2%/2&/!, :=2:b2F/:528/:<2(!";/:/ 2B/ !/w#2/20/20!~#g)!p͑-” $: ]:] #͘##:#/ :/!02/ $:͕ C}*͖̈́?{Q.q%-|&$K k ;:#/ͅ+:::;!đ [[[ :#/o&+^#V Error ]]] :;!đ2:#/ ڔ* >">>>>>> >>> 2#/C2!.{G*C2!.{!.d͹̈́08:)͖B?& BUR"S;#Wa#N#Ph B D!QXuL$M)K(T H( Ci!F!E"!p*=*~*#)!.d͖ͭ̈́Br$9_m1 Q:!.d͖ͭB$ %$$$''<%D$$+-t;#:#/”!x͑:$/_͢:%/_ ͢*"'/!"['/S*'/"1I1F>0ɷ("!8#͢<(!()%â â T](_O>: V++~08,:0(0_+~08:00W_+{2&/ ͢}(~ (A_>{<2\>:> +#(]#(e.( (<8i[(>([>  #(?. #(4 (8<[((.~ #~[ #~(A(N(W 21:] ( 7! .,;:?*=[!]6 ^ 1I1!.2O3 2/:2-:\!2@w#:&/ 861# 0w#6:#!]> (Y !e6.#6 #6 #6[#:1w#>(6 #= { ( *O!N/56:N/_ :a   :`<2N/G> ͕ :`<2N/ :`<:N/_~#͍  鯁(Aͨ  J yOͨ(2/ P < > > 2/ *Q/w#"Q/:M/:M/O:Q/!?O> ɯ2/ >G:M/O x(*Q/6 }o"Q/+>  :L/_"O/0$:L/2L/0 `2M/<2U/1%2U/:K/Ox0_:M/8 8 x={(<2M/D2K/*V/"Z/:8/_+(R8#"Z/CX/͝*O/:L/=(_c :K/=(G:M/O *Q/"S/>!K/<( G*`/n  0*b/#:L/_:b_c 2*X/͈&2*Z/͈/2:U/o&È>2G/2/2h2|\͢ #wz ˾~ +~(0 (!!<( ~ 8~ (> #wz#ê 2/7 :\!] ˾#:/(-!\ !\!.͢͢\͢2G/2h2|\͢!ͨ!((aw:1W 3~ (& ( ($2G/~ >2G/:G/ ~#\͢ 8!:w > (|¿ }¿ ¿ (6#\͢(F\â!8/ <2-/27//24/>2,/23/!.,ͨ6!-/ ͹ *( ^((@(P#(m"(B(8P(9V)8l2,/F ^S5/2"(L>227/~ @~!wF 5)80(-23/22/:8/G#*./ͨ q+($x:B/( #8) ͵ [0/{z0>  :8/( y!~(˾F#Q!,/5…!F#Q*d/+ͪÔ:2/> :-/g(F+(l!2/4(fN:3/_:4/=8Z8W:3/O:2/!-/8˶N(<:7/G::/0>F> = *5/:7/GF> :2/o&͈! F:8/G7nnnnn !(:-/W >^@!-/v W 0O!((I!( 4>_!F#Q$>_!~ F#˾O`x~#xN`#` BDM*\/DM*^/h*b/K`/K^/*`/++t*`/+*^/"^/#"`/͂*^/#*`/"`/+"^/q0b( > 7>  ###7?(#+0S> *`/  7?z 7*b/+> ##>4:b?-*V/+"V/:L/(=*V/#"V/:L/!b(<:b2L/>5:K/=(,%!M/8#$:K/=:K/=!?<:K/!`<:`2K/!2"Q/ɯ ~#(  > q8)T]c~  > 8 > # S^/*b/T]c >0~ ~+ S`/o͈͈ܽ>}*^/#w"^/*`/+w"`/!"V/q*d/#t> *^/ _*V/"V/*d/+͂> *`/ *V/R"V/ɯ7G#N#O:0?:(!͑!Ñ:; !͑ !Ñ O:K/!` :L/!b:0>?ä: F!N#N#: zO#{O{O#zO:G!~zB2!}ր02*̈́(&(" (>(>y(w# 0@ͤO >+!͑ }ր*ͭ>ͪ z6bk~08 :0 #x0Fx(>(8( 430.0( =>dG0( => 8G0(=(x7!FNy(-B0 ##>1B84 ##NFy(>0}0B> 6 #= 'd :;!đ:`G-:;!đͽ͈`i,È!},*͹YN( :b!= 2"\/*.%+"b/!226 ɯ2M/<2K/2L/2U/!"X/"V/*\/+"^/6 *b/#"`/+"b/#6 #6 #6 F#^#V## ^#V##͹@`a{_>G:/x= @ x > >>> :/02/sf:/!͑sf:/!͑|+ͧ+:;!đ!2͸:;!đñ+|+ :L/GÖ>2 /ɯ! /6:;(!͖͑!ÑPH!2(:`_:b ~# ( 0@ͤ:H/<{O{ !i͑S   2 //2/͖:b< :!/!L/(G3|+ s :/=`=5:/`5:M/>2/͖*S/~ :H/<:K/_:L/W͖:L/=:U/=[( ( :K/!`t:L/!b:L/=:L/!b:bV:;!đ!,:;!đ2!p͑2{*\/͓$`!"V/*^/"d/*b/ͪY͖O8 *`/>D q8 *\/>? V>2U/͓`o%[( %ͥ:L/=G:U/4:b!L/G:U/sf/͓:U/osf+0*b/~ Bͪ=*/%!U/8#[( (ͥ8 ~=!? #+"^/: (% (uo͖/%=!`tsf:K/=tdʹ*`/~(6 +#"`/, ( (͉sfoB`>2U/:`=!?!K/t|[( (l(((ͥl({(( (ͥl({(:L/b( Q(Qq({(  ((Qq({(([( `ͥ=/(q({((v(Ā(͉((q({((q({( :b=_!68<_+99[^/Sd/ͪO:U/:b_=!68_$$[`/Sd/͓o:U/:b?? !0O#> *^/"d/:/( GV!0~(G#~,Vs>2/!,͔ͨ0O!>2E/m:/:#/q+(40͝+:>2E/4:E/(͏:#/7:/͕ 3f ͩ:#/?:/r&:E/!/C2 {}*!.C2 { 7* ͓+2E/_YN %!@8#~=!`t:/~{%À%:GV%O!@~(0#+q!FGyH%!@(#V6T]#H!/dͭ!<B (@ (͉ Bo%x%O y(͉y &:"/¬> (:K/!?=!`t|:!/ė:/ *͆b( {͢8oå:!/> (o> (:L/!b [( (B`:!/> 6> 6!/~:K/!`t*`/> > :/2/!/~(6!.6!/72{͈*`/+"`/~ ͈x *`/++> ##"`/Q*`/~(ͧ*`/~6 +w~#"`/ ͈ x7*^/#x8gT]#ͧ> r0 *b/~ # +"`/*`/r"`/; :<(͉T GVwVͱ ; T #GVw ͓+ͪD͖(!I/6q8$:< T] +~8*`/:< F T]{ +q:< q:<T]t8S^/+x *b/:< *b/:<T]͂8S`/#x T OV ;w DM*^/B`i(#S^/͖DK`/BDM(+S`/S^/#"`/ͽT OVV+#RDM[`/͟!>S`/͖D͈`ih!&,>ͪ6:\G:&/O(&͹08e:8 @8]0YG)00KOY ͢!f/p#6?h/ 6:`2N/:b=2=/:`!>/wgN f/͢ Vf/͢ʰ"_!#! ~(:7( ~w#6+6 +6 +6 +T]+y6.O !=/5( > ͍ :>/O ...  y!>/(> ͍ :&/_ ͢2͘##:#/ :\\͢VͲ#3 Ô͘##:#/ .!+ͽ͈8*^/ͅ >0F [^/"^/#͓Ͳ#3 !+*`/"d/*\/͓*`/R *d/+ͪÔ͘##:#/ !+T O( R(BKR Ͳ#3 ÔV!\f/ :&/:1:/!f/\ ~2&/_#~21#~2/ â!,>ͪV6G!~͹w#!~[(xV2/3 Ô#~W( A(NV213 :1N(*3"9/>2"/2H/!"9/2"/2H/:/ P:bV?$͖͕ !DM= = !2 == =2b2/:F/2b2/[(_A8 [0nˮ ͥ!8/:5(w!H/!!/!"/~/w!8,:U/VVO:9/8>29/2;/y2:/>22;/ÔR%!:/~(2 (͉:9/=Gr[( ͥ<r([( = %2U/b( >Gͨ x!?G>8 t0x+6 B::/!U/4e%ЯGQ5b( ^- [( (> ([( ͥ4o%(8 ͻ͘%x=r&^ͥ=::/=r^[( ͑'8͠%ͷ'͸%͘%q+%!U/^[( 3' ~=!? (l( ͥ%o%^^ͻ[( ( å&͘%å&b( GQb( {-^ͥ'>͸%[( {QQͅ( ͥ> (rå&ͥ':!/͆0r7ͥ[( ʲ' (rͥrQb( ' (rQr[( ͥ[(Q  {2W(::/r[( l( ^͆Ql( %!U/:9/=G::/^W((r͘%> (r*`/~*^/~> !(!(!(!(!( !([(b(~ #,;/-.?!:  !d,*͹2+/N(Q *0V VW>!0>_!z(N #= ~(^6#DM!BDMg){(I: :>s#K!T]BBDMN#!0:+/N(Q +~#8#+g)Ô !!>ݾ8^R8#"|6#+| !"!!!/F*0Z:Zͅ+2/!/F0G!(^#~#VO~˾(#~˾+>1)!A,ͨ(_O!I,*͹Q +*y( !06͔*( 08 0Gx2A/ʅ+!0"?/>2/!/~->20Ô:/Z*[(+](.>(9<(@_!0~#Z(Z{ #"?/!0"?/!0>+"?/Vͥ qVQ*?/++++"?/>>2*:/Z*_[(p**>2/:/(o&))))|++ :/_:/ /2/}|+!6!>þw{!~62C/:C/2!~62D/:D/2+++++++++MemoryKeyI/OFindSyntaxReformat[ Please WAIT ] Filename: Find: Change to: Drive: Options: Column: Macro: Repeat count ([Q],0-9/*): Key number ([N/Q],0-9): Abandon file? (Y/N): Bytes free: NNNNN |^V insert|^B reform||ESC- Write Prnt||^Q- |R TOF ||^O- D disp CR ^F wd rt|^N ins CR|^^ case || Read Name|| |C EOF ||L,R,X margins ^A wd lf|^G del rt|^P ^code ||Block Files Load||B block|F find ||+,-,V vtabs ^R pg up|DEL dl lf|^PZ place||Termin Erase Save||P place|A replc||P pagn|S spcg ^C pg dn|^T del wd|^U undel ||Copy Macro eXit||DEL dl BOL| U ||C cntr|W wndw ^Z rp fi|^Y del ln|^W wait ||Delete Key Quit|| Y del EOL|undl||F flsh|Z zap BAK Duu:FFFFFFFF.TTT [X Pg 0 Ln 0 Cl 0 ESC-? = menu ^Q- ^O- ^P-Chg (Y/N,*)?INSERT6!>þw{!~62C/:C/2!~62D/:D/2+++++++++MemoryKeyI/OFindSyntaxReformat[ Please WAIT ] Filename: Find: Change to: Drive: Options: Column: Macro: Repeat count ([Q],0-9/*): Key number ([N/Q],0-9): Abandon file? (Y/N): Bytes free: NNNNN |^V insert|^B reform||ESC- Write Prnt||^Q- | VDE25.DOC --------- Instructions for VDE (Video Display Editor): VDE, VDM 2.5 (03/87) (c)1987, E. Meyer ============================================================================== VDE is a small, powerful text editor for CP/M computers, offering: --- * full-screen editing * block operations * user area support * wordwrap and reformat * macro programs * disk file operations * margins, tabs, spacing * find and replace * WordStar compatibility * many print features * undelete functions * configurable options VDE is fast: it's written entirely in assembly language, and edits a file entirely in memory. Its definable macros and pure ASCII output make it an ideal programmer's editor. With full formatting and printing features, and either ASCII or WordStar file format, it is also an efficient word processor. VDE is designed for Z80 CP/M 2.2 and 3.0 systems; it should also work with full equivalents (eg HD64180 CPU, ZRDOS), but NOT on 8080/85 systems. The generic version can be installed for any terminal; there is also a memory- mapped version VDM, which offers faster screen display if your hardware supports it. =============================== INTRODUCTION =============================== VDE is invoked from CP/M: A>vde [du:][filename] [opt] ("opt"= A,W,N) EXAMPLE: A>vde b3:prog.asm [n You can also run VDE simply by typing "vde", in which case VDE will load into memory and then ask for a filename. Here "du:" is an optional CP/M drive and user number; if omitted, the current defaults (in the ">" prompt) are assumed. The "opt" letter should be preceded by a space and/or a "[", and if specified, selects one of three different file modes: "W"ordstar document, "A"SCII document, "N"on-document. The default is usually "A".  If you are creating a new file, it will of course be empty. If the file you name is too large to fit in memory, VDE will complain, and you'll have to break it up first. (Typically this limit is about 55-60K.) VDE gives you a "status line" at the top of the screen which includes the filename, cursor position (page, line, column), INSERT toggle (if on), and prefix flag (if on). If you type ESC-?, you will get a brief menu of the various VDE commands, along with the amount of free memory. The menu, like all command prompts and error messages, appears temporarily in the top portion of the screen; press ESC again to remove it. ------------------------------------------------------------------------------- B11:TEXT.FIL [A Pg 12 Ln 34 Cl 49 INSERT ESC-? = menu VDE 2.xx (xx/87) (c)1987 E.Meyer Bytes free: xxxxx |^V insert|^B reform||ESC- Write Prnt||^Q- |R TOF ||^O- D disp CR ^F wd rt|^N ins CR|^^ case || Read Name||<udrl> |C EOF ||L,R,X margins ^A wd lf|^G del rt|^P ^code ||Block Files Load||B block|F find ||+,-,V vtabs ^R pg up|DEL dl lf|^PZ place||Termin Erase Save||P place|A replc||P pagn|S spcg ^C pg dn|^T del wd|^U undel ||Copy Macro eXit||DEL dl BOL| U ||C cntr|W wndw ^Z rp fi|^Y del ln|^W wait ||Delete Key Quit|| Y del EOL|undl||F flsh|Z zap ------------------------------------------------------------------------------- The VDE command set is similar in many respects to WordStar's, though not identical. There are ESC- commands, which mostly correspond to WordStar ^K- (Block) commands; ^Q- and ^O- commands; and other single-control-key commands. The similarities are strong enough that a WordStar user should have no trouble adapting to VDE. ============================= COMMAND SUMMARY ============================== I. CONTROL KEYS: single keystroke commands, function without prefix. CR = Carriage return (^M). Marks a paragraph end. BS = Nondestructive Backspace (^H). TAB = Hard Tab mode: insert a Tab (^I). Variable Tab mode: move to next tab stop. Arrow keys: WordStar: ^E up, ^X down, ^S left, ^D right. Alternate: configurable, defaults to ^K,^J,^H,^L. ^F = move to next word right. ^A = move to next word left. ^R = scroll upward one screen. ^C = scroll downward one screen. ^G = delete character to the right of the cursor. DEL = delete character to the left. [Configurable alternate.] ^U = undelete a character. ^T = delete word to right of cursor. ^Y = delete current line. ^N = insert a carriage return (break line) at present position. ^V = toggle INSERT mode on and off. ^^ = toggle case (upper/lower) of character at cursor. ^P = insert following control code. ^B = reformat a paragraph. ^Z = repeat find/replace (Repeats last ^QF or ^QA command.) ^W = wait. (Brief pause, useful during Macros.) II. ESCAPE COMMANDS: first hit ESC, then the key shown. (ESC cancels) ESC ? = menu. Display a brief menu of all VDE commands. Also shows amount of memory free for editing. ESC Arrows: Left/Right (including ^S/D) = shift frame horizontally, 32 columns at a time (if cursor position allows). Up/Down (including ^E/X) = shift vertically 1/4 screen. ESC F = Files. Look at the directory of a disk. Press ESC to clear. ESC E = Erase. Erase a disk file. ESC L = Load. Load a brand new file to begin editing. ESC N = Name. Change the current filename (affects Save, eXit). ESC R = Read. Read a disk file into text at cursor position. ESC P = Print. Print the file (or block) from memory. ESC S = Save. Save the current file, but continue editing it. ESC X = eXit. Do a Save, then a Quit (no confirmation needed). ESC Q = Quit. Abandon current file and exit VDE. ESC B = Block. Mark the start of a Block. ESC T = Terminate. Mark the end of a Block. ESC H = Hide. Unmark the Block. ESC D = Delete. Delete the marked Block. ESC C = Copy. Copy the marked Block to present cursor position. ESC W = Write. Write the marked Block to a disk file. ESC M = Macro. Execute a string of commands repeatedly. ESC K = Key. Store Macro on function Key for later recall. ESC 0..9 = Use stored Key. (In macro mode: label.) ESC !,=,~,# Used in Macro programming (see below). III. QUICK COMMANDS: first hit ^Q, then the key shown. (ESC cancels) ^Q Arrows: Left/Right (including ^S/D) = go to start or end of line. Up/Down (including ^E/X) = go to top or bottom of screen. ^Q B = move to block marker. ^Q P = move to next place marker. ^Q R = move to top of file. ^Q C = move to end of file. ^Q F = find next occurrence of a string. ^Q A = start global find/replace.  ^Q Y = delete from cursor to end of current line. ^Q DEL = delete from cursor to beginning of current line. ^Q U = undelete a line. IV. ONSCREEN COMMANDS: first hit ^O, then the key shown. (ESC cancels) ^O R = set right margin (column 1 turns off wordwrap/formatting). ^O L = set left margin. ^O X = toggle margin release in/out. ^O S = toggle line spacing single/double. ^O C = center current line. ^O F = align a line flush to the right margin. ^O D = toggle display of hard CRs on/off. ^O V = toggle tab mode Hard/Variable. ^O + = set variable tab stop. ^O - = clear variable tab stop. ^O P = toggle pagination on/off. ^O W = toggle windowing on/off. ^O Z = temporarily blank the entire screen. ========================= EXPLANATION OF COMMANDS ========================== ARROW KEYS - VDE supports two separate sets of Arrow keys, which function interchangeably. The built-in set supports the WordStar "arrow key diamond" ^E,^X,^S,^D; the other is user configurable, but set by default to ^K,^J,^H,^L. These keys move the cursor up, down, left, right. Preceded by ^Q-, an arrow moves more quickly: to the top or bottom of the screen, to the left or right end of the line. Preceded by ESC-, an arrow moves the FRAME rather than the cursor: the text as a whole shifts up/down 1/4 screen, or right/left 32 columns, while the cursor stays put. (In fact, vertical shifts will drag the cursor along if they have to; horizontal shifts just won't work.) BASIC COMMANDS ESC-S,N,Q,X,L) - ESC-S SAVES your work: what's in memory is written to disk under the file name in the header. (If that file already existed, it may be preserved as a BAK file.) Do this often. ESC-N NAMES your work. This allows you to change the filename in the header before saving. After a name change, BAK files are not preserved. ESC-X EXITS politely to CP/M, saving your work first. ESC-Q just QUITS. Since you will wind up at the CP/M prompt with any text not yet saved lost forever, you are prompted to confirm this (Y/N). ESC-L quits and LOADS a new file to begin editing. This also requires confirmation (Y/N). BLOCK COMMANDS (ESC-B,T,H,D,C,W,PB, ^QB) - ESC-B marks the start of a Block. ESC-T marks the end. (The marker is the same in both cases, by default a highlighted "B", and will remain until deleted or reset.) You can't mark the end if the start isn't marked yet. Of the Block functions ESC- D,C,W,PB, none will work if the Block isn't marked, and only ESC-D works if the cursor is inside the block. ESC-H hides (unmarks) the block, removing any block markers set. ESC-D deletes the block (including markers). ESC-C copies the block text (not including markers) to right after the present cursor location. There is no Block Move command, but ESC-C then ESC-D (to delete the original) will work fine. (If the block is too big for a copy to fit in memory you will get an error.) ESC-W writes the block text to a disk file. ESC-PB (ESC-P with B option) prints the block text. The ^QB command moves the cursor to the Block start. [The default block marker is ^B. This can be reconfigured.] DISK OPERATIONS (ESC-F,E,R) - On using the ESC-F command, you will be asked to specify a drive and/or user, and its directory will be shown. If there is not enough room to fit all the files on the screen, you will see "..." at the end to indicate that there were still more. Press ESC to return to editing. [ESC-F may be configured to ignore SYStem files.] ESC-E can erase a disk file. (Like all VDE commands, it will not accept wildcards in the filename.) ESC-R reads in the contents of an entire disk file, placing the text after the current cursor position.  FIND, REPLACE (^QF, ^QA, ^Z) - ^QF is the command to find a string. The search is case sensitive; the character "?" can function as a wildcard (unless it's the first character in the string). Thus searching for "he ??press" will find "the Depression", "She impressed" etc (but not "the press). Control codes (including ^M, or CR, for newline) may be included with the ^P prefix. ^QA is the global find/replace command. It asks for a string to find, and what to change it to. The cursor will be placed in succession on each occurrence of the string in the file (starting at the current cursor location). To change it, press "Y"; anything else skips to the next. If you want to change all further occurrences without being asked, press "*". ESC cancels at any time. ^Z repeats the last ^QF or ^QA command. For ^QF this is simply a repeat find; for ^QA you will also be asked whether you want to replace the found string.  INSERT MODE (^V) - ^V toggles insertion on and off (when on, the INSERT flag shows in the header). Normally, any existing text to the right of the cursor is overwritten as you type. If INSERT is ON, what you type is inserted, and existing text moves to the right. LINE SPACING (^OS) - The ^OS command toggles between single and double line spacing. In double space mode, the following functions produce double carriage returns: , ^N, Wordwrap, ^B. You can easily mix single and double spacing; and the Reform function ^B can quickly convert between the two. MACROS (ESC-M) - A "macro" is a string of VDE commands and text that (once defined) can be repeated or reused. When you type ESC-M you will be asked for the string, then a "Repeat count". Usually you will simply type a number for the repeat count (0-9, or "*" for "global" -- actually 255 times). You will see the results as the macro executes, and you can abort it at any time by pressing ESC. (If you are sure you know what you're doing, you can speed up Macro execution by specifying "Quiet" mode: press "Q" before the repeat count. Only the header will be updated as the Macro runs.) Macros also stop any time an error occurs; the error message will be visible, and can be cleared by pressing ESC. Many commands (like Find or Reformat) are designed to generate errors at the end of the file so that a global ("*") Macro containing them will halt there. Other global Macros may need to be aborted manually. VDE turns INSERT OFF before running a macro, so that the same sequence will always have the same effect. In order to include any input line editing characters (BS, left arrow, DEL, ^X, CR) in a macro, you must prefix them with ^P. (NOTE: To make them easier to read and understand, Macro listings will be given here as they function, not as they are typed in. ^P prefixes as needed are NOT shown. Keystrokes are separated by dashes or commas for clarity, and "sp" means a space or blank.) Here is an example of a macro. Can you figure out what it does? (Answer: .elif eht fo dne eht ta meht fo tsil a gnikam elif a fo tuo sesehtnerap ni stnemmoc lla ekat lliw tI) ^QR,^QF,(,CR,^G,ESC-B,^QF,),CR,^G,ESC-T,^QC,CR,ESC-C,ESC-D {Onscreen you will see: QRQF(MG[BQF)MG[TQCM[C[D } VDE Macros are very powerful tools, particularly given their program ability and storage on function keys. MACRO KEYS (ESC-K) - Up to 10 Macros can be stored (0..9), by entering them with the ESC-M command, then using ESC-K to save them. They can then be recalled and used simply by typing ESC-. Example: typing ESC-K-0 will store the last Macro used as Key 0, and it can be recalled and reused at any future time simply by typing ESC-0. Ordinarily, Keys operate just like the original Macro: they will ask for "Repeat count" when executed. If you want to suppress this (giving something more like a "function key", that only executes once) you can type "N" (for No repeat) before storing the key number. Example: ESC-K-N- 0 stores a Macro in Key 0 as a once-only function key. Similarly you can make it a QUIET once-only key with "Q" instead: eg ESC-K-Q-0. If the Macro (ESC-M) string is empty, using ESC-K will delete a Key definition. Using a defined Key brings its string into the Macro buffer. Trying to use an undefined Key results in an error. There are 500 bytes total available for all 10 keys, and a 128 byte limit for any one Key. (VINSTALL will accept keys up to 128 bytes; but VDE's input line is only 65 bytes.) If your request to store (ESC-K) exceeds the limit an error will result. Besides simply storing Macros, here are some useful function Keys: 1. Showing a ruler line. The following sequence:  ^V,CR,TAB,!,TAB,!,TAB,!,TAB,!,TAB,!,TAB,!,CR,^V can be used to display a ruler line showing tab stops. 2. Storing different sets of margins (eg for quotes): for example, ^OL,12,CR,^OR,66,CR 3. Typing any frequently repeated phrase; "ESC-6" is much more convenient than "World Wide Widgets Inc." [VINSTALL allows you to install a default set of macro Keys. Thus VDE can be customized for any task, such as the formatting requirements of specialized writing or programming languages.] MACRO PROGRAMMING (ESC-0..9, ESC-!,=,~,#) - VDE has several commands which function only in a Macro string, and give you control over the execution of a macro, allowing real programming. ESC-0..9, when in a Macro, function as "labels" 0..9. They have no effect, but can be "jumped" to by other commands. ESC-! followed by 0..9 is a simple "jump" instruction, causing macro execution to resume with the command following the label ESC-0..9. As two special cases, ESC-!-[ jumps to the beginning of the Macro, and ESC-!-] jumps to the end (aborts). ESC-= and ESC-~, followed by a character and then a label (or "[", "]"), are conditional jumps: they will jump to that label IF the character at the cursor position does (or for "~", doesn't) match that specified. ESC-= and ESC-~, followed by a character and then ">" or "<", are search loops. They will continue to move the cursor right (or for "<", left) as long as the character at the cursor does(n't) match, or until the beginning or end of the file. ESC-#, followed by 0..9, is used to "chain" to another macro key. In this way you can build up strings longer than the 65-byte limit on any one key. It does not "call" the key; there is no returning. Macro programs are stored just like any other macro string (usually with no repeat count). If you program in an endless loop, you will at some point have to abort with ESC. Don't make macro programs "quiet" until you're sure they work. Example: stripping (varible numbers of) leading spaces. The macro: ^QS,ESC=sp>,^QDEL,CR will delete all leading blanks on a line. MARGINS, CENTER, FLUSH (^OR,L,X, ^OF,C) - ^OR sets the RIGHT margin, and turns ON wordwrap, formatting, and centering. The default is column 1, which turns OFF all formatting functions. At the prompt "Column:" enter the column number (1-255), or just hit RETURN for the current cursor column. If this value conflicts with the left margin, the left margin will be reset to 1. ^OL sets the LEFT margin in an identical fashion. Must be to left of the right margin, which must have been set first. The default is 1. ^OX temporarily RELEASES the margins (sets them to 1), allowing you to type outside them without wordwrap. Use ^OX again to restore the margins. ^OC CENTERS a line with respect to the current margins, if set. ^OF FLUSHES a line over to the right margin, if set. PAGINATION (^OP) - The ^OP command toggles pagination. When on, the default page length is reflected in the VDE header ("Pg xx..."), and all page functions in the Print routine (formfeeds, headers, start/stop print) are enabled. When off, the header will say "Pg 0", and the line count ("Ln xx...") will be the line number in the file; also, printing sends the whole file out at once, with no pagination from VDE. [You cannot toggle pagination on if the default page length is 0.] PLACE MARKERS (^PZ,^QP) - You can set any number of temporary place markers in your file with ^PZ (they will appear as a highlighted Z). The ^QP command moves the cursor to the next place marker in the file, if set (cycling back to the top of the file if needed). Place markers are not saved to disk. PRINTING (ESC-P, ^P) - The ESC-P command Prints the file from memory. You will be asked for a set of "Options:", at which point you may enter one or more of the following, in any order: P pauses for keystroke before printing each page (sheet feed). B causes ONLY the currently marked Block to print. ^ causes control characters ^X to be FILTERED to ASCII "^X". *nn causes the job to print out nn TIMES (nn=1..255). @nn causes printing to begin AT page nn. #nn causes a MAXIMUM of nn pages to print. "..." causes quoted string to print out as a HEADER. The string, followed immediately by the page number, will print at the top right of each page near the margin. (Maximum length is 50 characters; use an empty string, "", to get numbered pages with no header text.) The last three options (@,#,"") are NOT allowed if pagination is off (^OP), or if "B"lock print was chosen. Example 1: Options: P*2 "Instructions, page" @6#1 will print out page six of the file twice, with the header shown, pausing before each page for a keystroke. Example 2: Options: B^ will print out the current marked Block, with control filtering. You can abort printing at any time with ESC (this may take a moment, or a few keystrokes, depending on your BIOS). For printer control, VDE supports a subset of WordStar ^P print codes. These can be entered with ^P, then the control code (or letter; ^P^X and ^PX are equivalent). First there are simple embedded codes: ^H - overstrike previous character ^L - formfeed (Not recommended when pagination (^OP) is on) Then there are seven user-definable codes: three toggles, four switches. The Printer Installation in VINSTALL allows you to choose what codes you want, and install the control sequences your printer needs. The defaults are toggles ^D, ^S, ^Y  and switches ^Q, ^W, ^E, ^R. These correspond to the Doublestrike, Underline, and Ribbon toggles, and the four User Codes, in WordStar. Toggles are well suited to features (like ^Sunderline^S) that will be turned on and off. Control codes other than the 7 installed ones will simply print out "as is", that is, ^[ will print as ESC, etc. (Note ^B and ^Z are reserved for use as block and place markers.) Control codes display on screen as highlighted capital letters. Unfortunately, VDE does count these codes when reformatting text. Where format is critical, insert ^P codes last. TABS (^I, ^OV,^O+,^O-) - There are two Tab modes, Variable and Hard; the ^OV command toggles between them. In Hard Tab mode the Tab key produces an actual ^I (ASCII TAB); whether this overwrites any existing text depends on the INSERT toggle. Hard Tabs display by default at fixed intervals of 8 screen columns. [This is reconfigurable to 2, 4, 16, etc.] In Variable Tab mode, the Tab key moves the cursor to the next variable tab stop. Existing text is not overwritten; spaces are added at the end of a line as needed. Up to eight tab stops may be set with ^O+ and cleared with ^O-; the defaults are in columns 5, 15, 35, and 55. [These are reconfigurable.] Note that you can always get a Hard Tab by typing ^PI. UNDELETE (^U, ^QU) - The undelete functions can be used (repeatedly if necessary) to recover a reasonable amount of text deleted either by overtyping, or with any of VDE's delete commands. ^U undeletes one character; ^QU does a whole line. Restrictions: undelete may work imperfectly if the cursor has been moved since deleting; or if DEL has been used several times in sequence; or if ESC-D was used and the cursor was not at the start of the block. Further use after all deleted text is recovered will produce junk (often including duplicates of text above the cursor). WINDOW, ZAP (^OW, ^OZ) - The ^OW command creates a Window in the bottom half of the screen, which retains a copy of the file text starting at the cursor line. Editing continues normally in the top half of the screen. This is useful for comparing different sections of text within a file, or even between different files. Typing ^OW again removes the Window. (Note: Windowing is only supported for screens of 15 or more lines.) The ^OZ command temporarily zaps (blanks) the entire screen; good for avoiding CRT burn-in, or just protecting work from prying eyes or fingers. Restore the screen by pressing ESC. (Note: if Windowing was in effect, its text will be lost.) WORDWRAP, REFORMAT (^B, ^OD) - WORDWRAP is automatic whenever the right margin is set. Any text entered will be formatted while you type, to the current margin settings. ^B REFORMATS from the line the cursor is on, to the end of the para- graph, according to the current margin settings and line spacing. (Thus it is used not only to reshape text after editing, but also to change margins and line spacing.) The end of a paragraph is marked by a "HARD CR", which occurs when you press the key. (This is a CR immediately following a character of text.) In contrast, when wordwrap occurs you get a "SOFT CR" (which is actually a CR with a space before it). You can change a hard CR into a soft one, or vice versa, by deleting or adding a space before it. Hitting the key also hardens a soft CR. The distinction between hard and soft CRs is only important when using ^B. ^OD toggles DISPLAY OF HARD CRs. Hard CRs, otherwise invisible, can be caused to display as a "<" character. This can be useful; some may find it distracting, so it turns off. You may find you want to leave it on for a while, at least until you get used to how the new hard CRs work. (Avoid hitting the CR key just to move down through a file, for example.) =========================== FURTHER INFORMATION ============================ ASCII FILES - The "A"SCII-document file format has been modified in VDE 2.50 to allow more accurate formatting (the old method required a lot of guess- work on VDE's part) and greater WordStar compatibility. The new scheme distinguishes between "hard" and "soft" CRs according to whether or not they are preceded by a space. Consequently, if you edit an ASCII file created by other software (including earlier versions of VDE!), it will appear to be full of hard CRs, making text impossible to reformat. There are two easy ways to solve this problem: first, you can use ^QA to find "^M"s and selectively replace them with " ^M". Alternatively, the following Macro (best stored as a Quiet macro Key) does a good job of "softening up" a single paragraph: ^QS,^X,ESC=sp],ESC=CR],^S,^Vsp^V,^D,ESC![ FILE MODES - By default, VDE reads and writes text as standard ASCII 7-bit characters, a format accepted by virtually all software. However, if you specify the "W" option on the command line, as in A>vde document.fil w VDE will function in WordStar document mode, which means that (1) any right justification is removed when files are read in, and (2) soft returns and spaces are written as appropriate on output. If you are exchanging files with WordStar, this will produce what you want about 95% of the time, and you can easily clean up the occasional glitch. [VINSTALL allows you to set up VDE to default to WordStar mode; if this is done, you can still specify the option "A" to get ASCII mode.] The "N" and "A" modes both produce ASCII files, and differ only in the default options (margins etc) set up when a new file is loaded. Typically "A" is for word processing and "N" is for programs, etc. DEFAULTS FOR: File I/O Margins Tabs Hard CR disp. "W"ordstar document WORDSTAR SET VARIABLE ON "A"SCII document ASCII SET VARIABLE ON "N"on-document ASCII RELEASED HARD OFF The file mode option can be specified along with the filename at any VDE file function prompt, allowing you to mix WordStar and ASCII disk files as needed. You can also change the current mode with the ESC-N function by entering a new mode (eg, "[W") without a filename. HYPHENATION - VDE can't hyphenate, but it does recognize hyphens in the text, treating them as a legitimate place to break a line. (So if you're typing a long word close to the margin, you can type a hyphen where you'd like the word to be broken.) If VDE is trying to reformat and finds a hyphen at the end of a line, it will quit with an error. You must join the lines (and delete the hyphen, if desired) manually, then press ^B again. INTERRUPTION - If VDE gets interrupted by a message from some other software (BIOS error, resident utilities, etc), it may lose control of the screen. The best way to restore it to normal is by blanking and restoring the screen (^OZ,ESC). RUNNING OUT OF ROOM - If you run out of disk space, you can just swap disks (you should always keep a blank FORMATTED disk around). Alternatively, you can use the ESC-F and ESC-E commands to delete unneeded files; and you can install VDE not to preserve backup (BAK) files. SPACE COMPRESSION - Since VDE 2.10, a new text compression algorithm is used, that can effectively increase memory capacity by over 25%. Of course this compression is undone when writing the file back to disk. (Earlier versions of VDE used a compression algorithm inherited from VDO, that was about half as efficient.) SPEED - VDM is quite fast on screen. VDE should run with adequate speed on most terminals; however, if your BIOS doesn't buffer the keyboard well, you might occasionally lose characters when typing. Hints that help here: (1) response speed improves if you have INSERT OFF while typing in large amounts of text. (2) getting "Scroll Up/Down" correct when installing VDE for your computer makes a big difference. STRING ARGUMENTS - When confronted with a prompt like "Find:", you are expected to type in a string (up to 65 characters). During this process, you can correct mistakes with DEL, BS, or any left arrow, or ^X will delete the whole entry; hit CR when finished. Note that to get any of these codes into the string itself, you must precede it with ^P (this includes ^P). Examples: to find a line beginning with a "*" (find "CR,*") type ^QF, ^P,CR, *, CR. Now to get this into a Macro with ESC-M, you would have to type (whew) ESC-M, ^QF, ^P,^P, ^P,CR, *, ^P,CR, CR. WORDSTAR COMPATIBILITY - Aside from the obvious fact that "ESC" is used as a command prefix instead of "^K", the remaining differences between the VDE and WordStar command sets are minor: COMMON FUNCTION WS VDE NOTES ----------------- ---- --- ------------------------- Rept Find/Replace ^L ^Z Partial Scroll Up ^W ESC Several lines at once. " " Down ^Z ESC Set Place Mark ^K0..9 ^PZ Not individually numbered. Go To Place Mark ^Q0..9 ^QP Cyclic. Block End ^KK ESC-T Delete Block ^KY ESC-D Move Block ^KV --- Must Copy then Delete. VariTab Set,Clr ^OI,^ON ^O+,^O- Help ^J... ESC-? Erase Disk File ^KJ ESC-E Interrupt Process ^U ESC It is also important to note that VDE does not recognize "dot commands". ================================= MESSAGES ================================= All messages appear in the line just below the header. First there are PROMPTS requiring user input. (Many assume a natural default if you just type RETURN, and can be aborted if you type ESC,RETURN.) "Abandon file?" - please confirm ("Y") a Quit or Load request. "Find:", etc - enter the string argument for the command. "Column:", etc - enter a number 0..255 "Repeat count:" - enter [optional "Q" and] repeat count for Macro. "Key number:" - enter [optional "N/Q" and] key number for Key. Then there are the (temporary) INFORMATIONAL messages: "Please WAIT" - disk I/O or printing in progress. Then there are ERROR messages: you need to press ESC to continue. "Error" alone means the command used just won't work in this situation. (Example: a block isn't correctly marked.) More specific errors are: "Memory" - the file, block, or key string won't fit in RAM. "Key" - an illegal control or ESC sequence was pressed. "I/O" - file not found, disk full, empty/invalid drive, etc. "Reformat" - end of file; hyphen at end of line; or word too long. "Find" - the search string was not found. "Syntax" - a macro programming command was misused. ============================== USING VINSTALL ============================== VDE and VDM should be distributed in a library file containing this DOC file and a corresponding version of the VINSTALL program. As distributed, VDE is set up for an ADM3 terminal, and VDM is set up for an Osborne Executive. If you use another computer/terminal, you may have to re-"install" VDE/M; otherwise it will make more or less of a mess on your screen, or (possibly, with VDM) crash. Most users should not need to go through the full terminal installation, at least at first. Choose the ist option to select from a menu of terminals already built into VINSTALL. The list is not exhaustive, but it includes most basic types: for example, the default "LearSiegler ADM3" data will also run on Qume, Wyse, Freedom and many other terminals, as well as many computers, that emulate an ADM3 terminal. Check your manual to see whether your machine emulates one on the menu, or comes close. (Minor touchups, such as codes for inverse video, can be made later.) The default printer installation is a basic Teletype. You will probably want to redo this, so you will have access to your printer's special features. There are also many options affecting the operation of VDE that you can select or modify to suit your taste. VINSTALL SYNTAX: A>vinstall [d:]vde[.com] [instfil] "[]"=optional Typically, you can use VINSTALL to modify VDE24.COM simply by typing: A>vinstall vde24 and selecting the values you want to change. If you have to do a manual installation of VDE for your computer, you may want to create an "installation file" which you can use (and give to others) to supplement the built-in terminal list of VINSTALL. This is done by specifying another filename: A>vinstall vde24 termname[.vde] VINSTALL will load and use (or create) the file TERMNAME.VDE (or .VDM), and update it as well as VDE.COM when you exit. The installation file is very small, containing just terminal parameters (no user options, etc). It is also possible to create "key files" of VDE macro key definitions. These work just the same way, except they must have a filetype of ".VDK", and this must be specified on the command line, eg: A>vinstall vdm241 mykeys.vdk (No, you can't specify both an installation and a key file at once.) The version numbers of VDE/M, VINSTALL, and any other files must "agree" or you will get an error. The match need not be exact, as there may be a new release of VDE without modifying the installation areas. VINSTALL is largely self-documenting, and steps you through each item individually. If this is your first time running the program, take advantage of its "Help" option before you start in, for some basic instructions. Note that ALL the number entry in VINSTALL is HEXADECIMAL; you will find a good ASCII/base-conversion chart helpful. VINSTALL can't check for illegal values; be careful what you enter. What follows is a more detailed explanation of installation items, in about the same order as in the VINSTALL procedure. Most people will be using VDE; you can try to use VDM instead if you have memory mapped video with: (1) a high bit that can be used to highlight and provide a cursor; (2) an absolute address at or above 3000h. USER OPTIONS Create BAKup files (Y/N) - Do you want backup files to be made when you save a file with VDE? Default file mode W/A/N - Which of the three file modes "W","A","N" described above do you want as the default? (W=57, A=41, N=4E.) Default insert on (Y/N) - Do you want the INSERT toggle to start out on when VDE loads a new file? Left and Right margin columns (00-FF) - Default margin settings. Set both to 1 to entirely disable wordwrap and reformatting. Page length (00-FF) - Set the number of text lines to print on a page. (Does not include another 3 lines for a header, if used.) Setting to 0 disables pagination entirely. Scroll overlap (00-lines) - This is the number of lines overlap between screens when scrolling with ^R/^C. The smaller, the larger the scroll. Show system files (Y/N) - Do you want files with the SYStem attribute to show in the VDE directory display? Fixed drives (01-10) - This lets you specify that up to two CP/M logical drives are nonremovable (hard or RAM disk), so VDE won't reset them before writing to them, speeding up some systems. Enter 01 for A:, 02 for B: etc (or just 0000 if you have none). Caution: naming a floppy drive here can cause serious BDOS errors. Ring bell on error (Y/N) - Do you want your terminal bell to ring when a VDE error message displays? Alternate video in header (Y/N) - Do you want the header, messages, etc to appear in a contrasting video mode? Block mark character (00-7F) - Usually ^B (02), but if you need to imbed that code in your files for any reason (eg, ZCPR3) you can change this to some other (otherwise unused) ASCII code, such as 00 (^@). Clock speed in MHz (01-FF) - Set this to reflect your CPU clock speed; most Z80 computers are 4.0 MHz (use 40 here). Horizontal scroll delay (01-FF) - This affects only VDE (not VDM): adjusts the delay between scrolling the current line and scrolling the rest of the screen, when working beyond the right screen edge. The average value is 80; adjust as you like. Hard Tab display spacing - Usually 08, this can also be 02, 04, 10, or any other power of two. Other values will produce erratic results. Variable tab stops - Enter a list of up to 8 tab stop columns, in ascending order. (Column 01 is the leftmost.) TERMINAL INSTALLATION (Both versions) Terminal ID - Identify the terminal you are installing. (16 characters) Viewable screen columns (28-FF) - Enter the width of your screen in columns. The normal value is 50 for eighty columns. Screen lines (04-FF) - Enter the number of lines on your screen. Normally 18 for twenty-four line screens. DELete character (00-7F) - VDE always accepts 7F as a delete key. If your keyboard can't generate this you can install an alternate value here (example: 1F enables ^_ on an Osborne 1). If you have a DEL key, you can leave this at the default value, FF for "not used". Arrows up, down, right, left (00-7F) - Enter the ASCII codes for your terminal arrow keys in this order, one byte each. Ignore parity. Use a value of FF to mean "not used". (WordStar arrows and BS need not be redefined here.) The default is CP/M ^K,^J,^L, entered as 0B0A0CFF. (Use the codes generated by your arrow keys; not the cursor control codes for your screen, where these differ.) Terminal init, uninit - Enter the codes you want sent to initialize your screen on entry into VDE, and to uninitialize on exit, in the form (# of bytes),bytes. You will at least want to clear the screen. TERMINAL INSTALLATION (Generic VDE only) Autowrap at line end (Y/N) - Usually Yes, as most terminals wrap down to the next line when a character is printed at the right edge of the screen. If yours discards characters instead, set this to No. Clear to end of line - Enter the codes to clear to the end of the line, as (#),bytes. Example: ESC-T is (02)1B54. If your terminal can't do this then zero it out (00). Alternate video on/off - Enter the codes (#),bytes to turn your favorite video mode (eg inverse) on and off. If your terminal can't do this, zero them out (00). Use high bit for alt. video (Y/N) - If your terminal needs the high bit set on characters to get them in alternate video, zero the above strings out and say Yes here; otherwise, No. Console filter (7D-FF) - This is the highest ASCII code that will be sent to the screen. Normally 7F; if your terminal can't display codes 7F or 7E (DEL and tilde), lower this to 7E or 7D. Use ANSI cursor addressing (Y/N) - Normally No; if your terminal uses ANSI standard codes "ESC[rr;ccH" for cursor addressing, answer Yes here and skip over the next two items. Cursor column before row (Y/N) - Normally No; if your terminal expects col,row order when positioning the cursor instead of row,col, say Yes. Position cursor at (0,0) - Enter the 4-byte sequence for addressing the cursor to the top left: two lead bytes, then two row/column values. Most terminals use ESC,=,20h+row,20h+col, or 1B3D2020. If you have only one lead byte, make the first something innocuous like 00. Delay after cursor positioning (00-FF) - Normally 00. Some slow terminals require a delay here to accomplish cursor movement; adjust this value upwards as necessary. Scroll text up and down - Sequences that will cause the text to quickly scroll up or down a line. On most terminals you can send the cursor to the second screen line (first text line) and delete/insert a line. Example: on an ADM3-style terminal, 1B3D2120 puts the cursor on line 2, 1B52 deletes a line, and 1B45 inserts a line. So what you need for scroll up is (06)1B3D21201B52, and for scroll down (06)1B3D21201B45. Some terminals require different approaches; if yours can't do this at all, zero this out (00). CAUTION: installing this incorrectly can have danger- ous results; the screen display may not be properly maintained. If in doubt, zero it out. TERMINAL INSTALLATION (Memory-mapped VDM only) Unused columns of RAM (00-FF) - Enter the number of unused bytes in video RAM between the end of one visible line and the start of the next. Example: many computers have 80 (hex) bytes of RAM per line, but only show 50 of them. So there would be 30 unused columns. Cursor on/off - Enter the codes (#),bytes to turn the regular CP/M cursor on and off, so it won't appear on the VDE screen. If you can't do this zero them out (00), and the cursor will remain visible at the upper corner of the screen. Video RAM start (3000-FFFF) - Enter the starting address of your video memory, as four hex digits. Video in/out code - If your video RAM is in the ordinary bank of memory, just enter "C9" here (that's a RET instruction). Otherwise, you will need the machine-language code to switch video memory in and out. There are 16 bytes available for each routine, and you must preserve all the CPU registers, and end with a RET. You should find the assembler code to do this in your terminal manual; to convert it to hex, either look up the hex values in a Z80 reference book, or use DDT or ASM/MAC to write and assemble the code to hex form. PRINTER INSTALLATION Printer ID - Identify the printer you are installing. (16 characters) Printer initialization - Enter a string of codes (#),bytes to send to the printer before printing text, to set up print mode, margins, etc. Printer uninit - another string (#),bytes to restore the printer to any desired state after VDE is finished printing. Send LF after CR (Y/N) - Normally Yes. But with some printers, which manufacture their own LF on receiving a CR, you will want No here. Toggles and switches - Enter the ASCII codes for the three toggles, then four switches, as described above. Toggles turn a feature on and off again; switches just send the same code each time. The defaults, which correspond to WordStar, are toggles ^D,^S,^Y (doublestrike, underline, and ribbon) and switches ^Q,^W,^E,^R. You can use any codes here EXCEPT ^B,^H,^I,^J,^L,^M,^Z, which are used for other purposes. Codes for toggles (on/off) - Enter the codes (#),bytes to send to the printer on encountering each of the three toggle codes, first to turn a feature on, then off. Codes for switches - Enter the codes (#),bytes to send to the printer on encountering each of the four switches. MACRO KEYS VINSTALL gives you the ability to examine and change the default set of macro Keys in VDE. (Any Keys defined with ESC-K while running VDE override the defaults.) VINSTALL gives you a display much like this: MACRO KEYS: (01C6 bytes free) <---- note free bytes (up to 01F4 = 500) <0><> <1><>  <---- "<>" flag means empty <2><> <3>^C^W <---- normal macro key <4><> <5>World Wide Widgets Inc. <---- "" flag means no-rpt key <6><> <7>^QR^[B^QC^[T^[C <---- "" flag means quiet key <8><> <9><> This is pretty straightforward; you just select the number of the Key you wish to redefine, then type in the new definition, much as you would in VDE. All the same rules apply (but VINSTALL will accept longer keys, up to 128 bytes). If the new definition is too long to fit it will be rejected. FURTHER USER PATCHING The address of the user patch area will be given to you by VINSTALL. This small region in VDE can be used to install any extra patch code you need. (Example: if your video in/out routines won't fit into 16 bytes, you can jump to the user patch area and put more code there.) This is the ONLY such area available, as VDE uses all available memory after its own code for editing text. VINSTALL also tells you the addresses of the command tables in VDE/M. You may find this useful if you need to go in and change a VDE command key that conflicts with your computer's firmware. There are four command tables: basic, ESC, ^Q, and ^O. Each is a list of 3-byte entries, with a one byte keycode, then a two byte address. (Examples: you will find the ^T command and the ESC prefix in the basic table; and the ^OX command appears in the ^O menu, as ^X.) Find the problem keycode, and use DDT or another utility to change it. (You will also see the keycodes 80-84h in the tables; these mean DEL and the arrow keys, however installed.) Don't try to change the ESC- prefix to ^K- to make VDE more WordStar- like. It will take you a while to locate all the occurrences, and leave you with some pretty confusing pairs of commands (eg ^KX = eXit, ^K^X = shift screen down).  RESTORE DEFAULTS This option is provided in the event that someone has so mucked up your copy of VDE that you can't sort out what's wrong. This should return VDE to the state it was distributed in: all User Options restored to their defaults, Terminal Installation set to ADM3 (or Osborne Exec), printer set to a basic Teletype, no Macro Keys, no User Patch code. ================================= HISTORY ================================== The original VDO editor (Fritz Schneider, 1982) was adapted by George Peace to run on Osborne computers (VDO-EX, 1984), then further enhanced by me (VDE). There are other descendants of VDO, including James Whorton's VDO25; each has evolved in a different direction, with its own advantages and compromises. VDE reflects my own tastes, and has by now been thoroughly enough rewritten and expanded that I consider it (and the name "VDE/M") mine. VDE, VDE-2 (1984) - Improved command set. Still Osborne only.  VDE-PX (1985) - First terminal adaptation, to Epson PX-8. VDE-OS/OX (1985) - Osborne versions, with ongoing improvements. VDE, VDM 2.00 (1986) - Unified VDE/M installable for different terminals. v 2.1x (6/86) - Macros; file directory; undelete; tighter compression; improved pagination and scrolling; printer installation. v 2.2x (8/86) - More WordStar-like commands; left margin; hyphenation. v 2.3x (9/86) - New VINSTALL program; word functions; new ^Q-up/down; global replace; print options; all ^P codes allowed. v 2.40 (1/87) - Improved scrolling and screen functions; more screen sizes supported; WordStar file mode; place markers; ^OZ; block print; larger macro keys; VINSTALL terminal menu. v 2.50 (3/87) - User area support; variable tabs; double spacing; search wildcards; more standard block functions; improved format- ting; many additions to VINSTALL. **************************************************************** ***** The VDE editor and its documentation are ***** ***** (c)1987 E. Meyer, all rights reserved. ***** ***** You may freely distribute UNMODIFIED copies of them, ***** ***** for NONPROFIT use only, at your own risk. ***** **************************************************************** Please do not circulate the VDE package (minimally VDE, VDM, VINSTALL, and VDE.DOC) in any incomplete or modified form, or without the above copyright notice. You may include additions of your own (*.VFK files, HEX overlays, special documentation) if you wish; if you devise something really useful, please tell me about it. Source code to VDE 2.xx has not been released. Direct problems and suggestions concerning VDE itself to me at the address below; include a stamped envelope for a reply if desired. Eric Meyer 427 N . Washington Bloomington, IN 47401 CompuServe [74415,1305] ==============================================================================  distribute UNMODIFIED copies of them, ***** ***** for NONPROFIT use only, at your own risk. ***** **************************************************************** Please do not circulate the VDE package (minimally VDE, VDM, VINSTALL, and VDE.DOC) in any incomplete or modified form, or without the above copyright notice. You may include additions of your own (*.VFK files, HEX overlays, special documentation) if you wish; if you devise something really useful, please tell me about it. Source code to VDE 2.xx has not been released. Direct problems and suggestions concerning VDE itself to me at the address below; include a stamped envelope for a reply if desired. Eric Meyer 427 N QUICK REFERENCE FOR VDE 2.5 --------------------------- ESC-? gives brief onscreen command menu. ESC key cancels prefixes, aborts printing/macros, clears error messages. CURSOR AND SCREEN: = ^K or ^E = ^L or ^D ^Q, start, end of line = ^J or ^X = ^H or ^S ^Q, top, end of screen ^F word right ^R page up ^QR top of file ^QB block start ^A word left ^C page down ^QC end of file ^QP place mark ^OW window on/off ESC, shift frame up, down 1/4 screen ^OZ blank screen ESC, shift frame right, left 32 cols MISCELLANY: ^V INSERT on/off ^^ upper/lower case ^OV variable tabs on/off ^N insert a CR TAB enter Tab or move ^O+ set variable tab ^OD HCR display on/off to varitab stop ^O- clear variable tab  DELETING: ^G delete char to right ^Y delete line ^QY del to end of ln DEL delete char to left ^QU UNdel line ^Q-DEL " to beg of ln ^T delete word to right ^U UNdel char FIND and REPLACE: ^QF find string ^QA find and replace string ^Z repeat find/repl DISK FILES: ESC-N new filename ESC-F show disk files ESC-S save, continue ESC-L load new file ESC-E erase disk file ESC-X save and exit ESC-R read in disk file ESC-Q quit without save BLOCKS: ESC-B block start ESC-C copy block ESC-W write block to disk ESC-T terminate block ESC-D delete block ESC-P-B print block ESC-H hide block FORMATTING and PRINTING: ^OR,L set rt, lft margins ^OC center line ^P insert ^-code: ^OX margin release on/off ^OF flush right line ^D,S,Y toggles ^B reform paragraph ^OS single/double space ^Q,W,E,R switches ESC-P print text ^OP pagination on/off ^I hard tab (Options: P,B,^,*nn,"",@nn,#nn) ^Z place mark MACROS: ESC-M define macro ESC-K store macro key ESC-!,=,~,# ^W wait (pause) ESC-0..9 use key macro programming  new file ESC-E erase disk file ESC-X save and exit ESC-R read in disk file ESC-Q quit without save BLOCKS: ESC-B block start ESC-C copy block ESC-W write block to disk ESC-T terminate block ESC-D delete block ESC-P-B print block ESC-H hide block FORMATTING and PRINTING: ^OR,L set rt, lft margins ^OC center line ^P insert ^-code: ^OX margin rele VINSTALL 2.50 BUG: PROBLEM: Using VINSTALL to load a .VDE (.VDM) file doesn't work, because it loads in 16 bytes too low in the memory image. (There's nothing wrong with the .VDE file itself.) SOLUTION: (1) Use MLOAD or similar utility to install the .VDE file at an offset of 50H from the start of VDE.COM (2) Use a debugger to patch VINST25.COM as follows: Find 0250: 11 4D 24 LD DE,244D And change to 11 5D 24 LD DE,245D ----- E. Meyer, 3/18/87 ----- !ÀP8HXVDM 2.50 (03/87) (c)1987 E.MeyerA:@@#7Osborne Exec P0 .0.2˷Teletype printer1.* "`( "Z( " "B ʹ2-Դʹ2+<2\ ʹ2+2+!\) !`^S,#^S,:b2 ,:=2:52+:<2%!"+:/ 2+!+w#2M,2,/2O-!~#i&!p{!{s T M*& ̈́:]  ͈ :+ ?:+!02+ !* (&͏ͽ2W[9z#!g   I:+zh(::Č 2 [[[ :+o&(^#V" 2 Error ]]]  ( >">>>>>> >>> 2+͐*C!+͠ ) (͐*C!+͠ !+T͏08:&ͽ2?RS+ WQ N PABDQXL;M&K%TH)CaFE!'='~'#& !+T͏ͽ2M`sc /uH!+Tͽ2! "!!!$$;"1!)!+:-g+ :+T!x{!{:+_ʹ:+_ ʹ*"+!"[+S*+"1.6>0ɷ("!8#ʹ<(!()%ô ô T](_O>: V++~08,:0(0_+~08:00W_+{2+ ʹ}(~ (A_>{<2\>:> +#(]#(e.( (<8i[(> ([>  #(?. #(4 (8<[( (.~ #~[ #~(W(A(N 21:] ( 7!  .,;:?*=[!]6 ^ 1.!r+[O:`0O͐͠W 2+:29 :\͐*@w#:+ 861# 0w#6:#!]> ( !e6.#6 #6 #6[#:1w#>(6 #= ͠ ( +O yÊ  O*,T]>  (*,",G =0 =G> ͊ *,˽:`̀͐> ͻ ͠À͐~#(ͻ à" 鯁(A͑  ̘ yO͑(2p ̞ 0͐͊ ͠> > 2p : ,><͐͊ à*,w#",:,:,O:,!?O> ɯ2p :,G:,O7 x(H*,T]͐>  (͠S,+K,*, ",> µ :,_ͤ",0:,2,ͤ0C2,<2,\ "2,:,Ox0_:,8 8 x={(<2,D2,*,"!,:+_+(R8#"!,C,_( ̀*,:,=(_ͱ :,=(G:,O7 *,",:,!,<( G*',ͽ  0*),#:,_:b(_ͱ ͐**,ͯ*&*!,ͯ*/:,o&ͯ͠ &:;*͐:`G#[, à" :;*͐:`G~:(#à#à>2 ,2+2h2|\ʹ<% ʹ\ʹ % !:1W D~ : ,(e5~ 2 ,~ ~ (! ˾> #wz ˾~ +~(0 (!!<( ~ 8~ (> #wz#à 2+7 :\!] ˾#:+(-!\ !\!o+ʹʹ\ʹ2 ,2h2|\ʹ!͑!%(aw:1W 3~ (& ( ($2 ,~ >2 ,: , ~#\ʹ 8!:w > (|˜ }˜ ˜ (6#\ʹ(6\ô!+ <2+2,/2,>2+2, !(5 ͳ6!+m *( ^((@(P#(m"(B(8P(FP8l2+F ^S,2"(L>22,~ @~!wF 5P80(-2,2,:+G*+͑ ͼT(($x:+( 8) ͓ͼ [,{z0> ͼ :+( yͼ!~(˾F#2!+5b!F#2*+,+Í:,> ļ:+g(Y(ʆ!,4ʆN:,_:,=چچ:,O:,!+8˶N(<:,G:+0>F> ͼ= *,:,G'> ͼ:,o&ͯ! ':+G7nnnnn !%:+W >^ͼ@!+v# !%#!( 4>_!F#2$>_!~ F#˾OAx~ͼ#xNA# BDM*#,DM*%,I*),K',IK%,*',++IU*',+*%,"%,#"',c*%,#*',"',+"%,R0X% > 7>  ###7?(#+`0S> *', 7?z 7*),+> ##>4:b?-*,+",:,(=*,#",:,!b(<:b2,>5:,=(,"!,8#$:,=:,=!?<:,!`<:`2,*[,[,",ɯ ~#(  > R8*T]D~  > 8 > #  S%,`*),T]D >0~ ~+ S',ojܦj.}*%,#w"%,*',+w"',!",R*+,#U> *%, I*,",*+,+c> *', i*,R",ɯG#N#͌!c ( (#(OGyH>B2!}ր. (͏. -1yw# 0͐͊ ͠û û  û>+*,+",͐> ww͠}ր!+T>͵ z6bk~08 :0 #x0Fx(>(8( 430.0( =>dG0( => 8G0(=(x7!FNy(-B0 ##>1B84 ##NFy(>0}0B> 6 #= "'d *,K, T]͐:;-wà*,*,͐~ àͦj`i)ï !E)5 . (YN( !."#,*.%+"),ɯ2,<2,2,2,!",",*#,+"%,6 *),#"',+"),#6 #6 #6 F#^#V## ^#V##@`a{_>G:+x= @ x :bFF ![)"   ": ,BR8 *#,>=Fͤ>2,vC0 *),~ (++͍y:,=G:,:b!,G:,2ͤv:,="!,`8$Q% ( ~=!? #+"%,$ y 7?Xy`*',~(6 +#"', _ l%CQ% (b%((ͅb%q%( (ͅb%q%:,X% W(Wg%q%  ((Wg%q%(ͅ=(g%q%( l%v%6G(g%q%͑(g%q% ͑:b=_!68<_+``[%,S+,͍9:,:b_=!68_ͤMM[',S+,vY:,:b??2+ !(5 ͳ,O!>2, :M,:+CT((͙0z(*>2,͙:,((:+7:+  :+7:M,p#:,͐*C!+ ͠ (͐*C!+ ͠  7* p(2,_YN "!@8#:+~z"":GF"O!@~(0#+q!FGyH"!@(#F6T]#H!+T!<2 (2 l 2n"w"Ol)y #:+ > _):+:+ $ͧX% ͍`8Å :+> > %C$:+> > !+~*',> Ñ!+~(6!+M6!+͐*7͠ j*',+"',jx *',++> ##"',W`*',~(ͯ*',~6 +w#"',j x7*%,#x8gT]#ͯ> ͖Ñ0 *),~ # +"',*',͖"',͹:<lOGFwFͬ͹O#GFw v+͍.y ! ,6R8$:< T]z +~`8*',:< F T]v+R:<R:<T]U8S%,+x `*),:<`*),:<T]c8S',#x OOF 8w DM*%,B`i(#S%,y.K',BDM(+S',S%,#"',ͦOOFF+#RDM[',͔.S',y.j`iI !(5 >͵6:\G:+O(&08c:8 @8[0WGP00IOY ʹ!-,p#6?/, 6*,>o",:b=2+:`!+wgN -,ʹ F-,ʹʦ_!#! ~(:7( ~w#6+6 +6 +6 +T]+y6.O" !+5( 2 :+O2 ...  y!+(2 :+_ ʹ"͈ :+ :\\ʹF͢ W ͈ :+ 1 !(5 ͦj8*%,^ .06 [%,"%,#v͢ W  !(5 *',"+,*#,v`*',+ *+,+Í͈ :+  !(5 OO( R(BK+ ͢ W F!\-, :+:1:+!-,\ ~2+_#~21#~2+ ô !(5 >͵F6G!~w#!~[(xF2+W #~W( A(NF21W :1N(*3"+>2+2 ,!"+2+2 ,:+ h:bF?y &*,[,DM= = *", ͐* =K,K, = =2b2+à: ,2b2+Q%_A8 [0nˮ Å!+:5(w!+! ,!+~/w !)5 :,?FFO:+8>2+2+y2+>2+:+Q" !)5 :,?FF!+F2+>2+Q"!+~(2+6:+w!+~(2+6:+w:,G:+<:+G:,:+!,G> l:+=G͖Q% ͅ<͖(Q% ͑= "2,X% >Gͤ͑ x!?G># U0x+6 %":+!,4d"ЯGW5X% N- Q% (> Q% ͅ4n"(8 ͔"x=p#Nͅ=:+=͖`NQ% 2͎$8͜"ʹ$ʹ"͔"T("!,`NQ% 2$Q% ~=!? b% ͅ"n"NNQ% ( ͑͑ã#͔"ã#X% GWX% ͍-N͑ͅ$>ʹ"Q% ͍WW{% ͅ> ͖ã#ͅ$:+ͧ`0͖7ͅQ% ʯ$ (͖͖ͅWX% $ (ÖWÖQ% ͅQ%W ͑Ñ {2M%:+͖Q% b% ͑NͧWb% ͑"!,:+=G:+NM%(͖͔"> Ö*',~*%,~> !%!%!%!%!% !%Q%X%~ #,;/-.?!:   !,)5 . (2+N(Q ͐ͻ ͠. (0F FW>!O->_!z(N #= ~(^6#DM!BDMi&{(I: :.s#K!T]BBDMN#!O-:+N(Q +~#8#+i& !!>ݾ8^R8#"|6#+| !"!!!+F (0J:Jh(2+!+F0G!(^#~#FO~˾( #~˾b(>1< ! )5 ͳz'O !)5 . (Q ͐ͻ ͠b(. (y( !O-6*( 08 0Gx2+h(!O-"+>2+!+~9>2O-:+J ([(,]'>(9<(@_!O-~#J(J{ #"+!O-"+!O->+"+`Fͅ RFW*+++++"+>>2(:+J (_Q%ʀ' (:+Y(T(#(:+3(2+2+h( Y(*+~(:+=2+(!O-"+ (~#"+_(! 6! >¾w! ~62 ,: ,2 (((((((((MemoryKeyI/OFindSyntaxReformat[ Please WAIT ]Filename: Find: Change to: Drive: Options: #Column: Macro: Repeat count ([Q],0-9/*): Key number ([N/Q],0-9): Abandon file? (Y/N): Bytes free: NNNNN |^V insert|^B reform||ESC- Write Prnt||^Q- |R TOF ||^O- D disp CR ^F wd rt|^N ins CR|^^ case || Read Name|| |C EOF ||L,R,X margins ^A wd lf|^G del rt|^P ^code ||Block Files Load||B block|F find ||+,-,V vtabs ^R pg up|DEL dl lf|^PZ place||Termin Erase Save||P place|A replc||P pagn|S spcg ^C pg dn|^T del wd|^U undel ||Copy Macro eXit||DEL dl BOL| U ||C cntr|W wndw ^Z rp fi|^Y del ln|^W wait ||Delete Key Quit|| Y del EOL|undl||F flsh|Z zap BAK Duu:FFFFFFFF.TTT [X Pg 0 Ln 0 Cl 0 ESC-? = menu ^Q- ^O- ^P-Chg (Y/N,*)?INSERT (_Q%ʀ' (:+Y(T(#(:+3(2+2+h( Y(*+~(:+=2+(!O-"+ (~#"+_(! 6! >¾w! ~62 ,: ,2 (((((((((MemoryKeyI/OFindSyntaxReformat[ Please WAIT ]Filename: Find: Change to: Drive: Options: s "1 "*""!e͝VDE(M) 2.50 INSTALL (03/87) (c)1987 E.Meyer [Opening !] ͫ!l \<! $\*$˽PR(>M2 !! ""6: X͝, ! ͫ!##(K< <X:! "K !* "PR! "%X* "PR!"]$`͝] Installing !$ ͫã͝ ...Press to see Main Menu ͝ --------------- VINSTALL MENU --------------- ption configuration ey definitions erminal installation urther patching

rinter installation estore defaults Choose option, ave, or elp: vOT PKFRSHwÊ͝ VINSTALL HELP -- press ^C at any time to abort VINSTALL VINSTALL is menu driven; however, installation functions (Options, Terminal, Printer) require complex data entry: Logical: simply enter "Y" or "N". Numbers: always HEX, usually 2 (sometimes 4) digits 0-F. (Always include leading zeros.) Byte strings: If fixed length, just enter the necessary number of hex bytes, 2 digits each. If variable length, enter the # of bytes at the "(" prompt, up to the "[max]" value shown, then the bytes themselves. Text strings: enter text, then to end. For all items you can either press immediately to keep the current value, or enter a new value instead. (See VDE.DOC for further explanation of patches and values.) ͝ RESTORE DEFAULTS: This will restore VDE to its original distribution state: default options, terminal, and printer; no function keys, no user patches. Proceed? (Y/N) Y!=$ !1$͙!"$!E%T]6G!(!{!]$`͝ Done.͝ USER OPTIONS: Create BAKup files: !=$͝͝ Default file mode W/A/N: ͝ Default insert on: ͝͝ Left margin col: ͝ Right margin col: ͝ Page length: ͝ Scroll overlap: ͝ Show system files: ͝͝ Fixed drives (01-10): k Ring bell on error: ͝͝ Use alt video in header: ͝͝ Code for block marker: ͝ Clock speed in MHz: ͝ [VDE only] Horizontal scroll delay: ͝ Fixed tab display spacing:  ͝ Variable tab columns: k4+5#͝ TERMINAL INSTALLATION:  ͝Generic Terminal Version͝Memory Mapped Version͝ Currently "!]$ͫ͝" Choose: dit current or ist terminals: E? L ͝ Terminals: press to select from list: !(! ~#G͍͖ͫY(`͝(End of list)]$`͝Selected͝ Editing installation - *͝Generic Terminal Version Terminal ID: !]$P͝ Viewable columns: !m$͝ Auto wrap at line end: ͝͝ Viewable lines:  ͝ Extra DELete key: ͝ Extra arrow keys u/d/r/l: k͝ Clear to end of line [06]: !v$y͝ Terminal init [07]: y͝ Terminal uninit [07]: y͝ Alternate video on [06]: y͝ Alternate video off [06]: y͝ Alt video uses high bit: ͝͝ Output filter limit: ͝ Use ANSI cursor addressing: ͝͝ [Non-ANSI] Cursor column precedes row: ͝͝ [Non-ANSI] Position cursor to (0,0): k͝ Delay after cursor positioning: ͝ Scroll text up [09]: !$ y͝ Scroll text down [09]:  y͝Memory Mapped Version Terminal ID: !]$P͝ Viewable columns: !m$͝ Unused columns in RAM: ͝ Viewable lines:  ͝ Extra DELete key: ͝ Extra arrow keys u/d/r/l: k͝ Terminal init [07]: !}$y͝ Terminal uninit [07]: y͝ Turn cursor off [06]: y͝ Turn cursor on [06]: y͝ Video RAM start addr: ͝ Z80 video in routine: k͝ Z80 video out routine: k͝ PRINTER INSTALLATION: Printer ID: !$P͝ Printer init [17]: !$y͝ Printer uninit [07]: !$y͝ Send LF after CR: !$͝͝ Toggles & switches: !$k͝ Toggle 1 on [07]: !$y͝ Toggle 1 off [07]: y͝ Toggle 2 on [07]: $y͝ Toggle 2 off [07]: y͝ Toggle 3 on [07]: y͝ Toggle 3 off [07]: y͝ Switch 1 [07]: y͝ Switch 2 [07]: y͝ Switch 3 [07]: y͝ Switch 4 [07]: ys͝ Select <0-9> or ap; or to exit:  Zm20 2͝ New definition: ( edits, saves; use ^P to enter these) Ԩ͙͝ MACRO KEYS: (h!%;!%;͝ bytes free)!% > 02͝ ͻ͝! (0((w#ͨ>8+~ ܛ͛!>w7͝ :W:_!%z(N #= ~(^6#DM!'BDMh{e:% :%s#K!'T]BBDMN#!͝ Choose o-repeat or uiet if desired: ͨN(Q +~#8#+h !!%>ݾ8^R8#"%|6#+| !"%!%! O@O^#($#~~+ ~+~#G~#ͨ͝<>͝͝͝  FURTHER PATCHING: You will require DDT or a similar utility. Addresses in this version of the program are: User patch area: *$-:$_+͝ Command tables: Basic: *$͝ ESC: *$͝ ^Q: *$͝ ^O: *$͖͝ [Closing !] ͫ2h2|22 ! $\(: ʠ͝, ! ͫ:K "!P" "!%"! "(à!P" "!]$"`! "(͝] { "͝ *Aborted* è͝ *File)͝ *Read͝ *Version ͝ *Write͝ error* è 7 <(ط͍ͫͺ (+!w#ͺ ( 8w#6 #!~Y N͍_ (Y(N Oq###;;͍8(28(w#:w###|<}<;͍8(w#ͺ 7?Z؇2:ͺZO::A~POPO0:0 ?_?>2qCr"t$2qCr"t(*t;)*tF#( ;#͍!`a6Kr:qx(!`w(Y#ͺ ->P8>0!`wG(4#ͺ :q "Z8wͺZڧw#[tKrH!`:q #*tKrH :q#()F#^#V## ^#V##͝ ?:͝ 㯆#O#O Oʭa{_!$~COMVDEA:@@#7Teletype printerADDS 25 P KkkG4G0Y Y! MY! LAmstrad / Heath P KHEHEpqY Y! MY! LANSI standard P   Bondwell 2 P TIN= =! R=! EDEC VT52 P KHJHJY Commodore 128 P T)(= =! R=! EEpson Geneva PX8PT  = Kaypro II/IV P = =! R=! EKaypro 2/4/10 P B0C0= =! R=! ELearSiegler ADM3P T= =! R=! EMorrow MDT-20 P T= =! R=! EOsborne 1/2/4 P T)(= =! R=! EOtrona Attache P KU&U = =! M=! LTelevideo 910+ P TG4G0= =! R=! ETRS-80 model 4P P = =! =! Zenith ZT10 P Ts1s0= =! R=! EKaypro II/IV P0 0Osborne 1/4 P0 Osborne Exec P0 .0.2˷=! R=! ELearSiegler ADM3P T= =! R=! EMorrow MDT-20 P T= =! R=! EOsborne 1/2/4 P T)(= =! R=! EOtrona Attache P KU&U = =! M=! LTelevideo 910+ P TG4G0= =! R=! ETRS-80 model 4P P = =! =! Zenith ZT10 P Ts1s0= =! R=! EKaypro II/IV P0 0% This is the release date of the disk. DE25 DOC -CPM168 DOC VDE25 QRF VDE25INSBUG VDM25 COM +VINST25 COM !SCAN12 .COM AC 73 4096 32 SCAN12 .DOC D7 26 7040 55 VDE25 .COM 1B 51 11904 93 VDE25 .DOC 76 A7 52480 410 VDE25 .QRF 55 A9 2560 20 VDE25INS.BUG 5A 38 640 5 VDM25 .COM 3C F3 11008 86 VINST25 .COM 77 03 8448 66  Fog Library Disk FOG-CPM.168 Copyright (1987) by Fog International Computer Users Group to the extent not copyrighted by the original author for the exclusive use and enjoyment of its members. Any reproduction or distribution for profit or personal gain is strictly forbidden. For information, contact FOG, P. O. Box 3474, Daly City, CA. 94015-0474. as part of the description of a file indicates that the program is distributed on a "try first, pay if you like it" basis. If you find the program(s) meet your need, please refer to the author's documentation for information on becoming a registered user. Only by registering and paying for the programs you like and use will the authors of such programs continue development. Often, more complete documentation, additional modules, and new releases are available only to registered users. File and text editors and viewing programs. Filename Description -04-00 .87 This is the release date of the disk. -CPM168 .DOC This is the description of the disk contents. EDFILE3 .COM BC06 11K ver. 3.0 [File Editor 1 of 3] Edit any disk file and change characters in either ASCII or hex. Perfect for patching any program. EDFILE3 .DOC 794B 20K ver. 3.0 [File Editor 2 of 3] EDFILE3 .UPD C711 2K ver. 3.0 [File Editor 3 of 3] M-DUMP11.COM 26A6 8K ver. 1.1 [Memory Dump 1 of 2] Copies your computer's memory to a disk file. Normally used to recover from a disk error or system crash. M-DUMP11.DOC 4932 5K ver. 1.1 [Memory Dump 2 of 2] MPRINT .COM 614F 9K [MultiPrint 1 of 4] A multi-file, multiple copy print utility with control over margins, tabs, pages, etc. BDS 'C' source is included. MPRINT .DOC 9481 1K [MultiPrint 2 of 4] MPRINT .C 82AB 6K [MultiPrint 3 of 4] WILDEXP .C 39F6 6K [MultiPrint 4 of 4] SCAN12 .COM AC73 4K ver. 1.2  [SCAN 1 of 2] A bi-directional text viewing utility. SCAN12 .DOC D726 7K ver. 1.2 [SCAN 2 of 2] VDE25 .COM 1B51 12K ver. 2.5 [VideoDisplayEditor 1 of 6] Comprehensive text editor for all computers (VDM25 is the version for memory mapped computers such as the Osborne 1). VDE25 .DOC 76A7 52K ver. 2.5 [VideoDisplayEditor 2 of 6] VDE25 .QRF 55A9 3K ver. 2.5 [VideoDisplayEditor 3 of 6] VDE25INS.BUG 5A38 1K ver. 2.5 [VideoDisplayEditor 4 of 6] VDM25 .COM 3CF3 11K ver. 2.5 [VideoDisplayEditor 5 of 6] VINST25 .COM 7703 9K ver. 2.5 [VideoDisplayEditor 6 of 6] fn-"."-ft TO malt STOR SUBST(ft,1,2) TO mdate SET ALTE TO &malt SET ALTE ON ? filedesc SET ALTE OFF SET ALTE TO SELE A STOR diskf-"-"-SUBST(dfile,5,3)-"&mdiskno"-".DOC" TO malt SET ALTE TO &malt SET ALTE ON DO WHILE diskno="&mdiskno".AND. .NOT. EOF() IF diskno="000" IF dfile="FOG-DOS" ? " &'