` V CYM+  ` ` V DOC,5N vV.COMM"y7ǃ/u@\n =4mOыzIhZޅ-xr?JRL~=d9Ĝqu)^OX4Kl֬S8ֲDsP}v>EVfba$c/VO n2RڃVJZ~A0/]Նzeo4E-`;~mJ8G|=Yf5O y2҅>IVkӖF%]X󊊾_P$v.a^q+u4J\0M4ӛ% ~^$lUU] ϵ<i3׌*n0VJ˝A;ړ{gh{$qLt3?@ՙjB?;6GbУz*Ng=qf]尚q{ 7v7A,s cBn%bi U]l#LUP`#^f޲m^? L:QTD GkJH Xd(Ts_r7n|4ΰS{g,ڥWAφUS3j3YE&LDBfI Pe!^{=w?柾C]yy|wvݯ7HQ9zxMv!Vo߁$w+~[i;,5?sdgW}b?7 &˰{&^[I%>7ږ)-ɹsx4y)a0.|xo׀C!>Xdk)щO .9Z]sFφZʭ޺tAl#;:By5FS04%[ 9gE;{> 7 ].gSB%VI@NOwHaGo/`7g%4 N} ]FYq=:"㭲{ՔX9 Ywl#sSQ4sLy"c>έWĶ@M-e.9p FrRe>nt9wӨ6ʆQkW]۔}T,>& |W[8NQ BdVkvf1=Zv3KwXL%K$~2OuYa9OP:+ uv܊pNxOnu}+\,g{FNS0]bX/x`g04估e2dcL7R=>s#Yo%jީ'_X8*U+%gbPTc[?Y'SzPeX((†YBrj0JZ } ~nnSp<h]vJ˩^ۣ'$:#~:aTE3 y`0;w")M oٛ ػ[y*x,CK TŠg **f5 /sns^:өPP 8xzκ߶Mtʇ[YN\KWFI# < C,0 ~a%9 ;> 㮶"C;)nG:!meK8z!LxCj8`+KK6r;U/ywu@)`ѯ1y{w%Nô!(UwFsqun܏YHYc:Y}Ϗaƺ׼<&lB3}ڭ.6U=峦tbMu4ݾ>ڟo(wxkPõthoףe.G/KPc6zFqVJxͭVBF7pۇx1 ?yky~\65z v.iɥz8TBlQρ'>0$6C-QJ֚(y jN,cw* YR<Ladf6ҹz@cCml 6*@J>L7^X~ ?&WZ Gyв&{R1vχY $3x{)WɰT퍷* #րP)?G{56UPFeោ=n$ 4InB\t(+Bu6aSp=}Hտy}zߗ#?$ 4`W+q^(p$LLM>qG? XoDtg#";)u 7ad1Zk8 .Mdj~A=F;~'&1Gn|qK(ⱟIRO8Xm`Lj?q {0#H>ZjU DKM6lY)x @Cimϊ YQ~=(z7Mq?"~͞_?zej Wov`~/!}TJkPp:݀L_d`jAn61sFPͱơ\FOƱ=9AGw:u#Xֈr_73Ӊjrfox3qn#:6s\-f ;p"q#[`a= 8: ˜~agZҼU;-p ,Z=itv@Q6*-b>fVbxÉW 6*jY7٧2]-f>n$KB 0903]yq<K Zwr&[LGl:ajiQ[Y8WUEDda0Yg:l$u-]=Wp^|pRڤ-TT?xߙ*2Xb!3XkGh| z>`A 1yz{ٴHLA_KR_@< ITzj0`4 MmEI<*:$>aksΛ7KHӊ%7Dx31>3/O,Uڳ~g,M]@9,3Uж%aO':an$ HՊ %IMYrI= K$Bn_ MGg+Go~& AAj/lÞu \`Ppzd<֢GZ,RHFgkHF9geLm;C7=b0iOԠ/ңفGq! 4fߌE3†77DZ [S\ͧ1k1Y їv=Yky34?xXĚJv^= zn9w>') 1e2Qc'9ČdkN A`@$Dx">0BG0MdžtBI!m|FW ݖ˿Xd{t`sj=QdOVIz85T5x &xi(`$%ty$z:vf|XbUkN,1pkF̱'nY}pEsò*tŵR7s߀?`Ld:^ ELst{.Wcs~'Z%'Ky!"؃CGF YW)7``ȱsIM![FIO/>_AnLvKhL!+Z5P u159Uc[9 ہ|Mz.XoTMY5F|# hSHᵲHCteŇǸLt~`(eH+m}7njzaKp X;0/Wrtۊ{ ֠j^!צuppp=.S4U8oK&7TA=~!nlb(&v.doc vers. 0.6 4/12/90 Bridger Mitchell (Plu*Perfect Systems) V -- quad-directional Z-System file viewer V now supports multiple files, with usage: V filespec1 ... filespecN A filespec is an ambiguous filename and type, preceded by an optional DU: or DIR: specification. Some valid filespecs are: *.DOC WORK:MENU??.TXT A15:*.* FOO.BAR V maintains a ring of all matching files. ^X will move to the next file; ^R moves back to the previous file. ^C exits the program. Because the ring is virtual, V should work on any size disk, regardless of the number of directory entries. (These and all other control commands may be rebound; see below). A list of excluded filespecs is tested; files such as COM, REL, LBR, !!!TIME&.DAT, etc. will be skipped automatically. You can extend this table by patching near the start of V. V uses an in-memory cache to make the most recently read sectors of a file available for re-viewing without additional disk reads. This allows reverse viewing of crunched files, up to the limit of available memory. If, when going in reverse, the cache is exhausted, V will automatically restart the uncrunching process from the beginning of the file and display the first lines. Viewing of adjacent lines/screens is rapid for both ascii and crunched files. Going to the End is also quick in ascii, but results in some delay uncrunching a large file -- the entire file must be uncrunched first. TERMCAP requirements The termcap requirement is the addition of three strings to the standard Z-System termcap. These definitions are already setup in files of type ".NZT" (New Z-System Termcap), available on major Z-Nodes. If your terminal isn't already there, you can add definitions following the initialization and deinitialization strings. NOTE: This uses the STANDARD termcap specification (not the one in experimental use in early 1989 by J. W. Wright). Here's an example for the Wyse-50. DEFB 'TERMINALNAME' ; 13 bytes db 0 ; reserved [ ... next part of termcap omitted...] DEFB ESC,')',0 ; SO - Standout on string DEFB ESC,'(',0 ; SE - Standout end string DEFB 0 ; TI - Terminal init string DEFB 0 ; TE - Terminal de-init string ; ; 3 extensions to standard TCAP follow immediately after "TE" ; DEFB ESC,'R',0 ; DL - Line Delete DEFB ESC,'E',0 ; IL - Line Insert DEFB ESC,'Y',0 ; CD - Clear to End of Screen String ; ; ... the rest of the termcap ... CONFIGURATION You can change the keys that control V by assembling a modified version of the code below and ; ; offsets from 100h for configuration areas ; CONFIGBUF equ 20h HELPBUF equ 80h EXCLUDEBUF equ 200h SPACE equ 20h TAB equ 09h CR equ 0dh LF equ 0ah ; 1. These are the bindings that control the V screen. In addition ; to the one to three keys for each command, V automatically ; picks up the cursor-control keys ("arrow" keys) from the ; Z-System tcap and uses them, in addition to the bindings in ; these tables. ; ; 2. To change the bindings, set the equates for your preferences, ; reassemble this file to HEX, and overlay onto V.COM. ; ; 3. Enter exactly 3 bytes for each binding. Use uppercase for all ; keys. V automatically converts a typed lower case key to upper case. ; Use a nul to indicate the absence of a binding. ; ; 4. Edit the help screen to match your choice of bindings. ; K_up1 equ ',' K_up2 equ 'P'-'@' K_up3 equ 0 ; and, automatically, Z3TCP's left arrow key ; k_pgup1 equ '<' K_pgup2 equ TAB K_pgup3 equ 'Z'-'@' ; and, automatically, Z3TCP's left arrow key K_dn1 equ '.' K_dn2 equ SPACE K_dn3 equ 'N'-'@' ; and, automatically, Z3TCP's up arrow key K_pgdn1 equ '>' K_pgdn2 equ CR K_pgdn3 equ 'V'-'@' ; and, automatically, Z3TCP's down arrow key ; K_left1 equ 'L' K_left2 equ 'A'-'@' K_left3 equ 0 ; K_rt1 equ 'R' K_rt2 equ 'E'-'@' K_rt3 equ 0 ; K_beg1 equ 'B' K_beg2 equ 0 K_beg3 equ 0 ; K_end1 equ 'E' K_end2 equ 0 K_end3 equ 0 ; K_goto1 equ 'G' K_goto2 equ 'S' K_goto3 equ 0 ; K_nxtf1 equ 'X'-'@' K_nxtf2 equ 0 K_nxtf3 equ 0 ; K_prvf1 equ 'R'-'@' K_prvf2 equ 0 K_prvf3 equ 0 ; K_exit1 equ 'C'-'@' K_exit2 equ 0 K_exit3 equ 0 ; ; subttl '---------- KEY BINDINGS ----------' ; ; Each V function has three possible key values. ; V ignores case. ; If you use fewer than three keys, use nulls for the remainder. ; ;; org CONFIGBUF ; beginconfig: ; db '__UP:' k.up: db K_up1,K_up2,K_up3 ; Scroll one line up ; db 'PGUP:' k.pgup:db K_pgup1,K_pgup2,K_pgup3 ; Scroll one page (screen) up ; db '__DN:' k.down: db K_dn1,K_dn2,K_dn3 ; Scroll one line down ; db 'PGDN:' k.pgdown:db K_pgdn1,K_pgdn2,K_pgdn3 ; Scroll one page (screen) down ; db 'LEFT:' k.left: db K_left1,K_left2,K_left3 ; Scroll to left ; db 'RGHT:' k.right:db K_rt1,K_rt2,K_rt3 ; Scroll to right ; db 'BEGN:' k.begin:db K_beg1,K_beg2,K_beg3 ; Display beginning of file ; db '_END:' k.end: db K_end1,K_end2,K_end3 ; Display end of file ; db 'GOTO:' k.goto: db K_goto1,K_goto2,K_goto3 ; Goto (search) for string ; db 'NXTF:' k.nextfile:db K_nxtf1,K_nxtf2,K_nxtf3 ; View next file ; db 'PRVF:' k.prevfile:db K_prvf1,K_prvf2,K_prvf3 ; View previous file ; db 'EXIT:' k.exit:db K_exit1,K_exit2,K_exit3 ; Exit from V. ; .list configlen equ $-beginconfig ; test0 equ HELPBUF-CONFIGBUF-configlen ds HELPBUF-CONFIGBUF-configlen .xlist subttl '---------- HELP AND USAGE ----------' ; ;; org HELPBUF ; ; Edit the message to correspond to the key bindings. ; helpmessage: ; db 'V commands (in addition to Z-System arrow keys):',cr,lf db lf db '1 line down . SP ^N 1 line up , ^P',cr,lf db '1 page down > CR ^V 1 page up < ^Z',cr,lf db 'n pages digit n pages digit',cr,lf db lf db 'right R left L',cr,lf db 'beginning B end E',cr,lf db 'next file ^X prev. file ^R',cr,lf db 'goto/search G exit ^C',cr,lf db 0 ; helpmsglen equ $-helpmessage .list ;!!! ERROR -- help message is too long. test2 equ EXCLUDEBUF-HELPBUF-helpmsglen ds EXCLUDEBUF-HELPBUF-helpmsglen ; .xlist subttl '---------- FILE EXCLUSION LIST ----------' ; ; exclude_cnt: db ??excnt ;; number of items in list .xlist exclude_tbl: ; ruler: '--11 bytes-' db '!!!TIME&DAT' db '????????SWP' db '????????BIN' db '????????C?M' db '????????R?L' db '????????Z?L' db '?????????Y?' db '????????LBR' db '????????BSX' db '????????RSX' rept 5*11 ;; space for more db 0FFh ;; list terminator endm ??excnt equ ($-exclude_tbl)/11 db 0 ; ; end vkeys.lib  1 line up