X7$ ?BOOT-U-No boot on volume ߋtv'3'kQ!3'SRT11A DECRT11A ۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m7Ԁ,$kQ$kQ@+kQB kQ7kQ7kQXavq^kQ{3' G;s'>> 4. USING CACHE 4.1 CACHE components and their use 4.2 Write-protect of system disk 4.3 Caching example Appendix -------- A. Software Product Description B. V6 Release Notes C. Building from source 1. Introduction. ---------------- This manual is a guide for installing and using the RT-11 CACHE package as developped at the University Hospital Groningen. Concept and implementation are described in full detail in: "DISK USAGE ANALYSIS and DISK DATA CACHING under RT-11" DECUS Europe Proceedings, Zuerich 1983. and "DISK DATA CACHING under RT-11" DECUS U.S.A. Proceedings, New Orleans 1985. The package provides transparent DISK DATA CACHING under RT-11 (V5.0 and higher) on LSI-11 or PDP-11 systems. With CACHE-11 V6, important changes have taken place. See appendix A (Software Product Description) and B (Release Notes V6) for an overview. Principle caching algorithm: ---------------------------- Special function requests are returned immediately to the disk handler. However, read and write requests: IF (no cache hit) THEN (return to disk handler) ELSE (IF (read) THEN (call VM handler) ELSE (call VM handler call DISK handler)) The VM handler is called in a similar way as RT-11 calls a handler. Problems/suggestions -------------------- Well documented, to: H. Haenen, Dept. Clinical Neurology AZG P.O. Box 30.001 9700 RB GRONINGEN / HOLLAND Telex 53942 Tel. 050-612689 / 612497, international +3150 612689/+3150 612497 2. Contents of the distribution package. ----------------------------------------- CACHF .SAV Utility program for starting/stopping/testing caching CH .SYS Cache handler CH. Set to: no device time-out and no XM support, maximum of 3 cache area's CH61 .MAC Cache handler source CSHOW .SAV Utility program, can print at any time caching merit and cache area's layout. CHMACR.MAC CACHE macro, to be inserted in disk handler VMMACR.MAC Macro, to replace .DRFIN VM in VM: handler UPD .SAV Utility updating disk and VM handler source for caching CACHE .DOC CACHE Manual 3. Preparing the system for CACHING ------------------------------------ $ ********** * STEP 1 * ********** First of all the CACHE MACRO is inserted in the device handler to be cached. This is simply done by running UPD and specifying the two letter filename of the device's source (e.g. RK.MAC): RU UPD *RK [Return] UPD then creates a new updated source file with extension .SRC You can prepare several device handlers if you want those devices to have potentially available for caching. The MACRO only occupies 3 words in the handler and performs no function when caching is not on. Assemble, link and copy the updated disk handlers to SY: MAC/OBJ:RK SYSGEN.CND+CHMACR+RK.SRC LINK/EXE:RK.SYS RK COPY/SYS RK.SYS SY: !XM: -> COPY/SYS RK.SYS SY:RKX.SYS!! What is done by UPD? The CACHE MACRO is inserted directly after the .DRBEG MACRO in the handler source. Refer to the following example for the device RK: Existing code(example): After INSERT CACHE: ----------------------- ------------------- . . .SBTTL DRIVER ENTRY .SBTTL DRIVER ENTRY .DRBEG RK .DRBEG RK CACHE MOV #RKCNT,(PC)+ MOV #RKCNT,(PC)+ $ ********** * STEP 2 * ********** Update the VM handler for caching with UPD. Copy the VM handler source (VM.MAC) to the disk on which you are working, then: RU UPD *VM [Return] UPD then creates a new updated source file: VM.SRC What is done by UPD? UPD replaces the .DRFIN macro in the VM handler source (appears at two locations. One for SJ/FB and one for XM) by macro call DRFNVM: $ existing code: new code (with MACRO DRFNVM): -------------- ----------------------------- VMERR: MOV VMCQE,R5 VMERR: MOV VMCQE,R5 BIS #HDERR$,-(R5) BIS #HDERR$,-(R5) VMDONE: .DRFIN VM VMDONE: DRFNVM VM .... .... $ ********** * STEP 3 * ********** Assemble CH and updated VM handler, build them and copy to SY: MAC/OBJ:VM SYSGEN.CND+VMMACR+VM.SRC MAC/OBJ:CH SYSGEN.CND+CH61 LINK/EXE:VM.SYS VM ! XM: -> LINK/EXE:VMX.SYS VM LINK/EXE:CH.SYS CH ! XM: -> LINK/EXE:CHX.SYS CH COPY/SYS CH(,X).SYS,VM(,X).SYS,C(ACHF,SHOW).SAV SY: INST CH,VM Type SET CH SHOW [RETURN] in order to see which device is selected by CH: for caching. If you wish to make another device selection, then remember the device number in the list and type: UNLOAD CH [RETURN] ! If loaded! SET CH DISK="device number in list" [RETURN] 4. Using CACHE. ---------------- 4.1 CACHE components and their use ---------------------------------- The components of the CACHE package which should reside on the system disk are CH.SYS (and of course the VM handler), CACHF.SAV and CSHOW.SAV. They should be used as follows: 1. CH.SYS Cache handler, contains the caching algorithm code. Type SET CH SHOW to check the selected cached device. If not appropriate, select the disk to be cached by entering the disk number x (displayed by SET CH SHOW) with: SET CH DISK=x LOAD CH: before enabling caching. LOAD VM: so that CH: can access the cache files on VM:. In a fully occupied 18 bit memory system you have 376. blocks available on VM:. (a full 22 bit memory system something like 5000. blocks!) 2. CACHF.SAV Cache-utility, to be used for starting/stopping/testing caching. Disk area's to be cached may be specified for each disk unit. Disk UNITS should be specified in INCREASING order. For each cache area a cache file is created on VM: If files cached are neighbours, they are put in one cache area/file which has the size of the sum of the individual file sizes. A read-request which fits within the cached area is read from the data-cache on VM: (= extended memory). A write-request within the cached area updates the data-cache as well as the disk. This is known as the WRITE-THROUGH principle. It ensures that the disk is always correct, even after a system crash or power fail. So a directory may be safely placed in the cached area. At the high block end of a cache area additional (instead of separately) also a temporary data-area may be specified. A write-request to this area does NOT update the DISK!! Of course this should only be applied to a disk area contain- ing only temporary data. A good candidate for this area is e.g. the SWAP.SYS system file. A cache area may be completely WRITE-THROUGH or completely TEMPORARY. Cache setup is simple for FILES and DIRECTORIES! You do not have to look for the start addresses and length of files and directories, but you can simple specify filenames for caching files and device names for caching directories. Also logical disks (LD:) which reside on a unit of the cached device can be easily cached by specifying it's device name. The program also creates the necessary cache files on VM:. Before it deletes all existing cache files! However, if possible initialize or squeeze VM: before starting CACHF. For it is not permitted that the cached files move when you squeeze VM:! A "/T" switch after a filename puts it in a temporary cache area. All other area's are default Write-Through. A "/B" switch puts a device directory in cache just as /D does. However, also the device's bootstrap blocks (0,2,3,4,5) are put in cache as a temporary area! With a COPY/BOOT command now only the boot-blocks in the cache are modified and NOT the one on disk. This was a desirable function for multiple processors using the SAME system disk. Block boundaries can still be specified by using the /L and /H switches. /L:n specifies the low block boundary of a cache area and /H:n the high block boundary. Run CACHF and make a selection from the main menu: (See also 4.3 for a cache startup example) "Caching start/Stop caching/Test cache/Read-only/Write-enable :" The "Stop caching", "Test cache" options require no further input. The "Read-only", "Write-enable" options query for the disk unit number. With the "Read-only" and "Write-enable" menu items a disk unit can be set respectively reset Write-Protected. A summary of valid input with the "Cache start" option is listed below: /? = Prints HELP info /S = Stop (preliminary) asking input CDx:/D = Cache directory of CD: unit x CDx:/B = As /D, but BOOT area (0,2,3,4,5) also (temporary) LDx:/D = Directory logical disk LDx: which ----------------- must reside on cached disk CDx: ---------------- filespec. = Put file in WRITE-THROUGH area Switches available TOGETHER with filespec. (dev:filnam.ext): ------------------------------------------------------------ filespec./T = File in TEMPORARY area filespec./L:n = n is low block boundary in file of cache area filespec./H:n = n is high block boundary in file of cache area NOTE> use decimal dot (".") after decimal number n! use relative blockno.! n=0 is start of file! dev: can only be CDx: or LDx:, x = device unit 0 - 7 IMPORTANT --------- 1. Do apply caching to REMOVABLE disks with care!! For changing a disk while caching is proceding may corrupt the inserted disk! STOP caching before changing disks! 2. SQUEEZE while caching is on, is only permitted when you are shure that cached disk data will not be moved by the squeeze operation! However, you can always safely squeeze when ONLY the directory is cached. 3. Stop caching before issuing any BOOT command. 4. Do NOT squeeze a cached SYSTEM DISK because a BOOT is performed automatically after squeezing. 5. Stop caching before doing a COPY/DEVICE with output to a cached disk as this may result in partial write-hits. 6. Test cache contents regularly and after suspected hard write I/O errors from a cached disk unit. 7. Test cache contents when you notice that partial hits have occurred. Error printout of CACHF is self explaining. CACHF performes several checks such as checking if CACHE Macro is present in the disk handler and if the VM handler has been updated before enabling caching. $ 4. CSHOW.SAV This utility can be run at any time when CH: is loaded. It prints the total number of reads and writes to each disk unit. It prints the size of each unit and also "NoWrite" if a disk unit is set to read-only. A "V" after the size in blocks means that the unit is a variable size volume. A "?" or "??" after the size means that a fatal error occurred when the variable size volume was requested to return it's size. Further printout: the position of the cache area, which part is WRITE-THROUGH and temporary, hits rates: number of read hits for each cache area number of updates for each cache area number of partial read/writes for each cache area ( NOTE> This number should always be 0! ) number of write hits=number of writes to temporary cache area 4.2 Write-protect of system disk -------------------------------- You can set the system disk to WRITE-PROTECT if system files to which write operations occur (SWAP.SYS, handler files, ..) are in temporary cache area's. Of course SET operations of handlers are then also temporarily. When the handlers are not in a temporary cache area, KMON prints an error message and the SET command is not executed. The write protection scheme is a nice extra feature of caching and can help preventing corruption of the system disk by "naive" users. $ 4.3 Caching example ------------------- An example will be given how a system disk is cached. The directory of the system disk is as follows (DIR/BLOCKS/COL:1 SY:): 09-Sep-83 RT11FB.SYS 81 16-Feb-83 38 SWAP .SYS 25 16-Feb-83 119 RESORC.SAV 15 10-Mar-82 144 . . . . . . . . SYSMAC.SML 45 10-MAR-82 410 . . . . . . . . @+ Disk layout: DISK VM: /----------\ 0 /---------\ !BOOT ! !DIRECTORY! ^ Block start address !VOL / HOME! 1 ------------- VMOFF 1 ! !BOOT ! ! ! ! ------------ 6 ! ! ! !DIRECTORY ! ! file: ! ! ------------- 38 ! ! ! !RT11FB.SYS! ! ! DISK CACHE AREA 1 ! ! ! CACHE0 ! ! ! ! ! .SYS ! ! ------------ 119 ! ! ! !SWAP ^ Temporary area ! ! ! !.SYS ! ! !143. ! v ! v ! ! Blocks ! Block high address ------------ 144 ------------- VMMAX 1 ! ! // // ! ! ^ Block start address ------------ 410 ------------- VMOFF 2 ! !SYSMAC ! ! file: ! ! ! .SML ! ! ! DISK CACHE AREA 2 ! ! ! CACHE1 ! ! ! ! ! .SYS ! v ! ! !45.Blocks! Block high address ------------ 455 ------------- VMMAX 2 ! ! // // \----------/ @- Assume further that the physical name of the cached device is RK: .LOAD CH,VM .INIT VM: !If possible .CACHF Logical Disks available. Cached device = RK: Caching = OFF S E L E C T > CACHE start / STOP caching / TEST / READ-ONLY / WRITE-enable : CACHE *RK:/D !RK0:=SY:, cache directory of SY: *RK:RT11FB.SYS *RK:SWAP.SYS/T !Put SWAP.SYS in a temporary cache area *RK:SYSMAC.SML */S !Stop asking for input Under FB/XM also the following warning is printed when a Foreground or System job is loaded: "No I/O to cached device permitted! Foreground/System job loaded. ARE YOU SHURE? (Y/N):" This is important because during most actions of CACHF the link between CH: and the disk handler is manipulated. At such moments I/O activity outside CACHF could destroy cache integrity. However, in order to have a consistent answer pattern, this warning and question is also NOT given when CACHF runs from an indirect commandfile. Appendix A Product: RT-11 DISK DATA CACHE Purpose: + SPEEDUP DISK I/O in a transparent way by caching technique + WRITE-PROTECT can be dynamically set/reset for each disk unit. WRITE-PROTECT of SYSTEM DISK is possible. + Multiprocessor environment: simultaneous use of system disk by multiple systems Characteristics: + Considerable improvement of system response, virtually eliminates USR and KMON swapping when cached + Applications run much faster as far as disk I/O is concerned + After startup caching is completely transparent + Cache setup is simple: files and directories can be cached by entering device and filenames + Requires only about 250 words of resident cache code in low memory. This cache code resides in a separate cache handler which may be removed from memory by unloading it. + A must for floppy and TU58 users due to dramatic performance improvement. Principle: Direct Mapping (proved to be superior to Look Ahead and Least Recently Used algorithms): a fixed disk area is mapped to a file(the cache file) on VM: (the virtual memory handler). Space on VM: not occupied by the cache-files remains available for normal use. Up to 10 disk area's may be defined on several units. A disk area may be the directory (in many situations a very efficient cache area) or a file. Failsafe: Uses the Write-Through principle. A read to a cached disk area is served with data from the cache file on VM:. However, a write updates the cache data as well as the disk data. So, even when a disk directory is cached, the disk is not corrupted after a system crash. Write cache: The Write-Trough principle can be disabled explicitly for specific disk area's which contain temporary data. For example consider the SWAP.SYS system file. The data in this file have only a meaning during runtime. I/O to disk area's cached in this way write to/read from only the VM: cache file. Software: + CH:, cache handler. Must be loaded when caching. + Two small macro's updating VM: and disk handler for caching. + CACHF, a utility program for starting, stopping caching, testing cache contents and device unit write protection + CSHOW, a utility program to be run at any time during caching to show (display) cache setup and performance Required: + RT-11 V5 and later for CACHE V6 + Extended memory. The more memory, the more disk data can be cached. However, memory not used for caching remains available for data storage. A total of 128 Kw. memory in a system may cache up to 376. disk blocks. VM: (RT-11 V5) supports upto 2 Mw on Q-bus. + It is necessary to assemble, link and re-install VM: and disk handlers to be cached. Status: Operational for FB/SJ V4 since Oct-82, under V5 since Aug-83. Under V5 XM monitor since september 1984. Appendix B ---------- Release notes CACHE-11 V6 ========================= This release results from some major improvements of V5. No corrections were necessary. The improvements are: - Installing caching is now very simple: a utility UPD converts disk and VM handler sources. Run UPD, assemble disk and VM source, link, copy to SY: and INSTALL. That's all! New releases from DEC for the VM handler are now easy updated for caching. (Note: the VM-handler update is minimized: only the .DRFIN VM statement is exchanged by a DRFNVM macro call) - The caching algorithm code is now in a separate cache handler (CH:), size ca. 250. words. This means that when you do not use the cache, the code can be simply removed from low-memory by unloading the CH: handler. Internal some significant changes in the caching mechanism have taken place. E.g. the CH handler now makes a copy of the disk Q-element and puts this "copy-Q" element in the input queue of VM. The VM handler is called in a similar way as RT-11 itself calls a handler. - A new utility, CACHF, makes it very simple to cache DIRECTORIES and FILES by only entering device and filenames. The block boundaries are automatically setup by CACHF. Also logical disk residing on a unit of the cached device are supported. - It is now possible through software to set each unit of the cached device to read-only (Write-Protect). - The only sources to be assembled are the handlers CH, VM. The programs CACHF, CSHOW are supplied in direct runnable format(.SAV) and run on any system having at least EIS hardware - CACHF has now variable volume support and thus checks for each volume that cache-area's are not defined outside the disk space. - V 6.1 (july '85): Multiple /T concatenated files possible, /B switch. The new /B switch puts a device directory in cache just as /D does. However, also the device's bootstrap (block 0) is put in cache as a temporary area! With a COPY/BOOT command now only the bootblock in the cache is modified and NOT the one on disk. This was a desirable function for multiple processors using the SAME system disk. - April 1986: it appeared that with the newer versions also block 5 is modified for bootstrapping => block 0,2,3,4,5 now temporary! ========================= Appendix C ---------- SOURCE PACKAGE CONTENTS ----------------------- CHCF61.MAC CACHF utility program CH61 .MAC Cache handler (CH:) CHSH61.MAC CSHOW utility program, can print at any time caching merit and cache area's layout. CHMACR.MAC CACHE macro, to be inserted in disk handler VMMACR.MAC Macro, to replace .DRFIN VM in VM: handler * The conditional NAREA can be changed in cache (CH) handler source: NAREA = 3 ;Maximum number of cache area's (Currently limited to 10). The SET code area of CH: contains two similar lists (one ASCII, one RAD50) with 20 device names. If you have a device that is not in the list, you can edit these lists and CHANGE (do not extend the lists!) a device name in both lists to a new name. * Build cache handler and programs and copy to system device: MAC/OBJ:CH SYSGEN.CND+CH61 MAC CHCF61,CHSH61 LINK/EXE:CH.SYS CH ! XM: -> LINK/EXE:CHX.SYS CH LINK/EXE:CACHF CHCF61 LINK/EXE:CSHOW CHSH61 COPY/SYS CH(,X).SYS,C(ACHF,SHOW).SAV SY: INST CH TIM$IT= 1 ;1=time-out support NAREA = 2 ;Max. no. of cache area's on disk ;MMG$T = 1 ;XM-MONITOR .TITLE CH - CACHE HANDLER V6.1 (File: CH60.MAC) .IIF NDF,TIM$IT TIM$IT= 1 .IIF NDF,MMG$T MMG$T = 0 .IIF NDF,NAREA NAREA = 3 ;Max. no. of cache area's on disk ; Note: When NAREA = 0 then the resulting handler can be used for ;------ for disk access monitoring! ; Update: V5 -> V6 1) Separate cache handler CH (contains caching algorithm) ; 2) Minimal VM handler change: ; existing code: new code (MACRO DRFNVM): ; -------------- ------------------------ ; VMERR: MOV VMCQE,R5 VMERR: MOV VMCQE,R5 ; BIS #HDERR$,-(R5) BIS #HDERR$,-(R5) ; VMDONE: .DRFIN VM VMDONE:(MOV VMCQE,R5) ; .... CMPB Q$FUNC(R5),#200 ; BNE 1$ ; RETURN ; 1$: .DRFIN VM ; .... ; 3) VM handler is called in a similar way as RT-11 calls ; a handler. ; ; 4) Read-only feature for cached disk units ; ; Caching algorithm: ; ------------------ ; IF (no cache hit) THEN (return to disk handler) ; ELSE (IF (read) THEN (call VM handler) ; ELSE (call VM handler ; call DISK handler)) ; ; ; .DRBEG MACRO: xxSTRT: .WORD 0 ; Device vector/offset to vectortable ; .WORD 0 ; Offset to interrupt service ; .WORD 0 ; 340 (priority) ; .DSTAT pointer -> xxLQE: .WORD 0 ; Pointer to last Q-element +0 ; xxCQE: .WORD 0 ; Pointer to current Q-element +2 ; ; Update 28/4/86: /B => 0-5 temporary except block 1 (home block) ; (block 5 appeared also to be update with COPY/BOOT !) .MCALL .DRDEF, .MTPS, .PRINT .DRDEF CH,147,RONLY$!WONLY$,0,0,0 ;=====================================================================; ; .DRSET SHOW,-1,S.SHOW ;;SHOW disks in list .DRSET DISK,20.,S.DISK, ;;Select disk no. ; .SBTTL SET OPTION PROCESSING ROUTINES ;------------------------------------- S.SHOW: MOV PC,R0 ADD #HEAD-.,R0 .PRINT ; Print header info MOV PC,R1 ADD #DSKR50-.,R1 MOV PC,R2 ADD #DSKASC-.,R2 MOVB #' ,DIGITH MOVB #'0,DIGITL ; LOOP: MOV (R2)+,NAME BEQ S.EXIT CLRB MARK ; Initialize as terminator CMP (R1)+,DISKNM ; Current selected disk? BNE 1$ MOVB #'<,MARK 1$: MOV PC,R0 ADD #LIST-.,R0 .PRINT INCB DIGITL CMPB DIGITL,#': ; >9 ? BLT LOOP MOVB #'1,DIGITH MOVB #'0,DIGITL BR LOOP S.DISK: CMP R0,R3 BHIS S.ERR ;Not too high! ASL R0 ;*2 MOV PC,R1 ADD #DSKR50-.,R1 ADD R0,R1 MOV @R1,DISKNM S.EXIT: RETURN S.ERR: SEC RETURN ; ************* ; *** NOTE **** Do NOT EXTEND the following two lists. However, you can ; ************* change names. ; DSKASC: .ASCII /RK/ ;1 .ASCII /DL/ ;2 .ASCII /DY/ ;3 .ASCII /RF/ ;4 .ASCII /DS/ ;5 .ASCII /DP/ ;6 .ASCII /DX/ ;7 .ASCII /DM/ ;8 .ASCII /DD/ ;9 .ASCII /DR/ ;10 .ASCII /DU/ ;11 .ASCII /DW/ ;12 .ASCII /QN/ ;13 .ASCII /WB/ ;14 .ASCII /DA/ ;15 .ASCII /DB/ ;16 .ASCII /DC/ ;17 .ASCII /DE/ ;18 .ASCII /DF/ ;19 .ASCII /DZ/ ;20 .WORD 0 ; DSKR50: .RAD50 /RK / ;1 .RAD50 /DL / ;2 .RAD50 /DY / ;3 .RAD50 /RF / ;4 .RAD50 /DS / ;5 .RAD50 /DP / ;6 .RAD50 /DX / ;7 .RAD50 /DM / ;8 .RAD50 /DD / ;9 .RAD50 /DR / ;10 .RAD50 /DU / ;11 .RAD50 /DW / ;12 .RAD50 /QN / ;13 .RAD50 /WB / ;14 .RAD50 /DA / ;15 .RAD50 /DB / ;16 .RAD50 /DC / ;17 .RAD50 /DE / ;18 .RAD50 /DF / ;19 .RAD50 /DZ / ;20 ; LIST: .BYTE 40,40 DIGITH: .BYTE 0 DIGITL: .BYTE 0 .ASCII /. = / NAME: .WORD 0 .BYTE 40 MARK: .ASCIZ / selected!/ HEAD: .ASCIZ /CACHE Handler V6/ .EVEN ;=====================================================================; .DRBEG CH JMP CACHE ;This address is handler entry +4 DKCQEA: .WORD 0 ;Address of disk DKCQE +10 VMCQEA: .WORD 0 ; " " VM VMCQE +12 DISKNM: .RAD50 /RK / ;Physical name of disk cached DISKRO: .BYTE 0 ;Low byte bit 0-7 = readonly unit 0-7 if SET! MASK: .BYTE 0 ;Local use only ;*CH*--------------------- CACHE Data area ----------------------*CH*; Offsets: DKUNIT = 0 ;Disk unit no. for this cache area. MINBLK = 2 ;Disk start addres cache area MAXBLK = 4 ;Max. disk addres cache area MAXWTT = 6 ;Max. disk addres cache write-through area BLKOFF =10 ;Transform to VM-block address VMHIT =12 ;Total no. of VM-cache hits VMUPD =14 ; no. of VM-cache updates(writes). VMPRT =16 ; no. of partial VM-cache hits. VMWTMP =20 ;Total no. of writes to temporary data cache area CHINFO: .WORD TABLE-CHINFO ;Cache area's table VMCOLL: .WORD 0 ;No. VM collisions VMEXIT: .WORD 0 ;No. VM linked Q's on VM exit .REPT 8. .WORD 0 ;Total no. of reads .WORD 0 ;Total no. of writes .ENDR TABLE: .WORD NAREA ;No. of cache area's AREA: .REPT NAREA .WORD 0 ; +0 Disk unit no. for this cache area .WORD 0 ; +2 Disk start addres cache area .WORD 0 ; +4 Max. disk addres cache area .WORD 0 ; +6 Max. disk addres cache write-through area .WORD 0 ;+10 Transform to VM-block address .WORD 0 ;+12 Total no. of VM-cache hits .WORD 0 ;+14 No. of VM-cache updates(writes). .WORD 0 ;+16 No. of partial VM-cache hits. .WORD 0 ;+20 No. of writes to temporary data cache area .ENDR ;NAREA .WORD -1 ;Non-existing disk unitno./Terminator ;---------------------- Check if data in CACHE -----------------------; CACHE: MOV @DKCQEA,R4 ;Get Q-element pointer DK: TSTB Q$FUNC(R4) ;Special function request. BEQ 1$ ;If so, do nothing. RETURN ;Let disk handle SPFUN 1$: MOVB Q$UNIT(R4),R3 ;Get and check disk unitno. BIC #^C7,R3 MOV PC,R5 ADD #CHINFO-.+6.,R5 ;Setup tablepointer, skip:VMCOLL/EXIT MOV R3,R0 ASL R0 ;*2 Words -> bytes ASL R0 ;*4 Reads + Writes ADD R0,R5 ;Entry in DISK unit table CLR R0 MOV Q$WCNT(R4),R2 ;Read or Write? BPL 6$ TST (R5)+ ;Select write counter NEG R2 INC R0 ;Set mask bit ASH R3,R0 ;Shift left to its place 6$: INC (R5) MOVB R0,MASK ;Store mask .IF NE,NAREA MOV PC,R5 ADD #AREA-.,R5 ;Set up table pointer. MOV #NAREA,R1 10$: CMP R3,@R5 ;Check disk unitno. BEQ UNITOK ADD #22,R5 ;Point to next area. SOB R1,10$ ;Check all area's BR TODISK UNITOK: MOV Q$BLKN(R4),R0 ;R0=Low IO block address to access. ADD #377,R2 ;Round up. CLRB R2 ;Convert to no. of SWAB R2 ; blocks. DEC R2 ;One less. 1 block= offset 0! ADD R0,R2 ;R2=High IO block address to access. BLKCHK: CMP R2,MAXBLK(R5) ;Too high for VM cache? BHI NOHIT CMP R0,MINBLK(R5) ;Low IO block address OK? BHIS HIT CMP R2,MINBLK(R5) ;High IO below cache? BLO NEXTCH NOHIT: CMP R0,MAXBLK(R5) ;Low IO above cache? BHI NEXTCH INC VMPRT(R5) ;No full hit-> DATA from disk. .ENDC ; NE,NAREA TODISK: BITB MASK,DISKRO BNE PRTERR RETURN .IF NE,NAREA NEXTCH: ADD #22,R5 ;Next cache(CH) area CMP R3,@R5 ;Check disk unitno. area BNE TODISK BR BLKCHK ;Try this area ;-------------------------------VM-CACHE------------------------------------; HIT: MOV PC,R3 ADD #QELMNT-.,R3 MOV R4,R0 CMP -(R0),-(R0) ;R0 points to header disk queue .IF NE MMG$T .REPT 10. MOV (R0)+,(R3)+ ;Make copy of disk queue element .ENDR .IFF .REPT 7 MOV (R0)+,(R3)+ ;Make copy of disk queue element .ENDR .ENDC ADD BLKOFF(R5),VMBLCK ;Corresp. block address in file. TST Q$WCNT(R4) BPL CHREAD CHWRIT: CMP R2,#5 ;Request within BOOT area (0-5)? BHI 1$ ;april 86, /B (R2= highest blockno.) CMP R2,#1 ;Except HOME block! BNE 2$ ;All other temporary with /B ! 1$: CMP Q$BLKN(R4),MAXWTT(R5) ;Start block in temporary area? BLOS 3$ ;BLOS=> no 2$: INC VMWTMP(R5) ;Write to cache only=WRITE HIT! BR VMONLY 3$: BITB MASK,DISKRO ;Write protected =>can't update disk BEQ UPDATE .ENDC ; NE,NAREA PRTERR: BIS #HDERR$,@Q$CSW(R4) ;Write while WRITE-PROTECT => error MOV DKCQEA,R4 ;DISK Q-element pointer ADDRESS(DRFIN) .IF NE,NAREA BR DRFIN UPDATE: INC VMUPD(R5) CALL VMIO ;Write -> update VM-cache. BIT #HDERR$,@VMCSW ;VM IO ERROR? BNE ALLFND SETVM: MOV VMCQEA,R5 ;After CACHE I/O to VM: => check TST -(R5) ; pending VM req., adjust VM queue .MTPS #340 ;Disable interrupts MOV VMLINK,(R5)+ ;Setup VMLQE MOV VMLINK,(R5)+ ;Setup VMCQE BEQ 2$ INC VMEXIT ;RT-11 will call VM handler afterwards 2$: .MTPS #0 RETURN ;TO DISK / SETVM CALLER ;---------------------------------------------------------------------------; CHREAD: INC VMHIT(R5) VMONLY: CALL VMIO ;All data from VM. ALLFND: MOV DKCQEA,R4 ;DISK Q-element pointer ADDRESS BIT #HDERR$,@VMCSW ;VM IO ERROR? BEQ MONRET MOV @R4,R5 ;R5 = DISK Q-element pointer BIS #HDERR$,@Q$CSW(R5) MONRET: CALL SETVM ;Setup VM: input Queue .ENDC ; NE,NAREA CHINT: ;Note, CHINT: must be defined due to .DRBEG DRFIN: TST (SP)+ ;Pop off return to disk-handler. MOV @#54,R5 ;Return to monitor JMP @270(R5) ; and link-out Q-element .IF NE,NAREA ;-------------------- Send copy of Q-element to VM: ------------------------; VMIO: MOV VMCQEA,R3 ;Set up VM- dummy Q-element MOVB #200,VMFUNC CLR VMLINK .MTPS #340 MOV PC,R0 ADD #VMCQE-.,R0 MOV @R3,R1 BEQ HANDGO INC VMCOLL ; VM has already an input I/O queue !! Link our dummy element to it 1$: TST Q$LINK(R1) BEQ 2$ MOV Q$LINK(R1),R1 BR 1$ 2$: MOV R0,Q$LINK(R1) ;Link it in VM queue MOV R0,-(R3) ;Set up VMLQE MOV (SP)+,R0 ;Pop off CH return MOV (SP)+,R1 ;Pop off DISK return MOV (SP)+,R3 ;Monitor return MOV R1,-(SP) MOV R0,-(SP) BR TOCALL HANDGO: TST -(R3) MOV R0,(R3)+ ;Setup VMLQE MOV R0,(R3)+ ;Setup VMCQE TOCALL: CLR -(SP) ;Lower priority MOV R3,-(SP) ; and jump to caller (VM entry or monitor) RTI ; ; Copy of disk Q-element = "dummy" VM Q-element ; QELMNT: VMLINK: .WORD 0 ;0 VMCSW: .WORD 0 ;2 VMCQE: VMBLCK: .WORD 0 ;4 VMFUNC: .BYTE 0 ;6 VMJBNM: .BYTE 0 ;7 VMBUFF: .WORD 0 ;10 VMWCNT: .WORD 0 ;12 VMCMPL: .WORD 0 ;14 .IF NE MMG$T QPAR: .WORD 0 ;16 XM PAR1 .WORD 0 ;20 RESERVED .WORD 0 ;22 RESERVED .ENDC ;MMG$T QLENGT: .WORD 0 ;24 .ENDC ; NE,NAREA .DREND CH .END ;*CH*-----------------------------------------------------------*CH*; .TITLE CH - CACHE HANDLER V6.2 (File: CH6x.MAC) V5.3 = 0 ; Set to V5.3 = 1 when used under RT-11 V5.3 or later ! .IIF NDF,TIM$IT TIM$IT= 1 .IIF NDF,MMG$T MMG$T = 0 .IIF NDF,NAREA NAREA = 5 ;Max. no. of cache area's on disk ; Note: When NAREA = 0 then the resulting handler can be used for ;------ for disk access monitoring! ; Update: V5 -> V6 1) Separate cache handler CH (contains caching algorithm) ; 2) Minimal VM handler change: ; existing code: new code (MACRO DRFNVM): ; -------------- ------------------------ ; VMERR: MOV VMCQE,R5 VMERR: MOV VMCQE,R5 ; BIS #HDERR$,-(R5) BIS #HDERR$,-(R5) ; VMDONE: .DRFIN VM VMDONE:(MOV VMCQE,R5) ; .... CMPB Q$FUNC(R5),#200 ; BNE 1$ ; RETURN ; 1$: .DRFIN VM ; .... ; 3) VM handler is called in a similar way as RT-11 calls ; a handler. ; ; 4) Read-only feature for cached disk units ; ; Caching algorithm: ; ------------------ ; IF (no cache hit) THEN (return to disk handler) ; ELSE (IF (read) THEN (call VM handler) ; ELSE (call VM handler ; call DISK handler)) ; ; ; .DRBEG MACRO: xxSTRT: .WORD 0 ; Device vector/offset to vectortable ; .WORD 0 ; Offset to interrupt service ; .WORD 0 ; 340 (priority) ; .DSTAT pointer -> xxLQE: .WORD 0 ; Pointer to last Q-element +0 ; xxCQE: .WORD 0 ; Pointer to current Q-element +2 ; [.WORD NOP] ; RT-11 V5.3 or later ; ; Update 28/4/86: /B => 0-5 temporary except block 1 (home block) ; (block 5 appeared also to be update with COPY/BOOT !) RMON = 54 SYSVER = 276 ;Current RT-11 version offset .MCALL .DRDEF, .MTPS, .PRINT .DRDEF CH,147,RONLY$!WONLY$,0,0,0 ;=====================================================================; ; .DRINS CH BR CHECK BR ERROR ; May never be installed as SYSTEM device ; Check whether current system is RT-11 V5.3 or later ; (.DRBEG data structure expanded 1 word with RT-11 V5.3) CHECK: CMP (SP),#6000 ; Called by BOOTSTRAP or MONITOR? BCS ERROR ; Carry is set for AUTOMATIC INSTALLATION! MOV @#RMON,R0 ADD #SYSVER,R0 MOV @R0,R1 SWAB R1 CMP #<5*400!3>,R1 ;V5.3 or later ? BLOS 10$ .IF NE,V5.3 MOV PC,R0 ;It's V5.2 or earlier ADD #TONEW-.,R0 .PRINT SEC 10$: RETURN ;It's V5.3 or later .IFF RETURN ;It's V5.2 or earlier 10$: MOV PC,R0 ;It's V5.3 or later ADD #TOOLD-.,R0 .PRINT .ENDC ERROR: SEC RETURN TONEW: .ASCIZ <12>/?CH-F-Generated for V5.3 or later!/ TOOLD: .ASCIZ <12>/?CH-F-Generated for up to V5.2 !/ .EVEN .DRSET SHOW,-1,S.SHOW ;;SHOW disks in list .DRSET DISK,20.,S.DISK, ;;Select disk no. ; .SBTTL SET OPTION PROCESSING ROUTINES ;------------------------------------- S.SHOW: MOV PC,R0 ADD #HEAD-.,R0 .PRINT ; Print header info MOV PC,R1 ADD #DSKR50-.,R1 MOV PC,R2 ADD #DSKASC-.,R2 MOVB #' ,DIGITH MOVB #'0,DIGITL ; LOOP: MOV (R2)+,NAME BEQ S.EXIT CLRB MARK ; Initialize as terminator CMP (R1)+,DISKNM ; Current selected disk? BNE 1$ MOVB #'<,MARK 1$: MOV PC,R0 ADD #LIST-.,R0 .PRINT INCB DIGITL CMPB DIGITL,#': ; >9 ? BLT LOOP MOVB #'1,DIGITH MOVB #'0,DIGITL BR LOOP S.DISK: CMP R0,R3 BHIS S.ERR ;Not too high! ASL R0 ;*2 MOV PC,R1 ADD #DSKR50-.,R1 ADD R0,R1 MOV @R1,DISKNM S.EXIT: RETURN S.ERR: SEC RETURN ; ************* ; *** NOTE **** Do NOT EXTEND the following two lists. However, you can ; ************* change names. ; DSKASC: .ASCII /RK/ ;1 .ASCII /DL/ ;2 .ASCII /DY/ ;3 .ASCII /RF/ ;4 .ASCII /DS/ ;5 .ASCII /DP/ ;6 .ASCII /DX/ ;7 .ASCII /DM/ ;8 .ASCII /DD/ ;9 .ASCII /DR/ ;10 .ASCII /DU/ ;11 .ASCII /DW/ ;12 .ASCII /QN/ ;13 .ASCII /WB/ ;14 .ASCII /DA/ ;15 .ASCII /DB/ ;16 .ASCII /DC/ ;17 .ASCII /DE/ ;18 .ASCII /DF/ ;19 .ASCII /DZ/ ;20 .WORD 0 ; DSKR50: .RAD50 /RK / ;1 .RAD50 /DL / ;2 .RAD50 /DY / ;3 .RAD50 /RF / ;4 .RAD50 /DS / ;5 .RAD50 /DP / ;6 .RAD50 /DX / ;7 .RAD50 /DM / ;8 .RAD50 /DD / ;9 .RAD50 /DR / ;10 .RAD50 /DU / ;11 .RAD50 /DW / ;12 .RAD50 /QN / ;13 .RAD50 /WB / ;14 .RAD50 /DA / ;15 .RAD50 /DB / ;16 .RAD50 /DC / ;17 .RAD50 /DE / ;18 .RAD50 /DF / ;19 .RAD50 /DZ / ;20 ; LIST: .BYTE 40,40 DIGITH: .BYTE 0 DIGITL: .BYTE 0 .ASCII /. = / NAME: .WORD 0 .BYTE 40 MARK: .ASCIZ / selected!/ HEAD: .ASCIZ /CACHE Handler V6.2/ .EVEN ;=====================================================================; .DRBEG CH JMP CACHE ;This address is handler entry +4 / 6 (>=5.3) DKCQEA: .WORD 0 ;Address of disk DKCQE +10 / 12 VMCQEA: .WORD 0 ; " " VM VMCQE +12 / 14 DISKNM: .RAD50 /RK / ;Physical name of disk cached DISKRO: .BYTE 0 ;Low byte bit 0-7 = readonly unit 0-7 if SET! MASK: .BYTE 0 ;Local use only ;*CH*--------------------- CACHE Data area ----------------------*CH*; Offsets: DKUNIT = 0 ;Disk unit no. for this cache area. MINBLK = 2 ;Disk start addres cache area MAXBLK = 4 ;Max. disk addres cache area MAXWTT = 6 ;Max. disk addres cache write-through area BLKOFF =10 ;Transform to VM-block address VMHIT =12 ;Total no. of VM-cache hits VMUPD =14 ; no. of VM-cache updates(writes). VMPRT =16 ; no. of partial VM-cache hits. VMWTMP =20 ;Total no. of writes to temporary data cache area CHINFO: .WORD TABLE-CHINFO ;Cache area's table VMCOLL: .WORD 0 ;No. VM collisions VMEXIT: .WORD 0 ;No. VM linked Q's on VM exit .REPT 8. .WORD 0 ;Total no. of reads .WORD 0 ;Total no. of writes .ENDR TABLE: .WORD NAREA ;No. of cache area's AREA: .REPT NAREA .WORD 0 ; +0 Disk unit no. for this cache area .WORD 0 ; +2 Disk start addres cache area .WORD 0 ; +4 Max. disk addres cache area .WORD 0 ; +6 Max. disk addres cache write-through area .WORD 0 ;+10 Transform to VM-block address .WORD 0 ;+12 Total no. of VM-cache hits .WORD 0 ;+14 No. of VM-cache updates(writes). .WORD 0 ;+16 No. of partial VM-cache hits. .WORD 0 ;+20 No. of writes to temporary data cache area .ENDR ;NAREA .WORD -1 ;Non-existing disk unitno./Terminator ;---------------------- Check if data in CACHE -----------------------; CACHE: MOV @DKCQEA,R4 ;Get Q-element pointer DK: TSTB Q$FUNC(R4) ;Special function request. BEQ 1$ ;If so, do nothing. RETURN ;Let disk handle SPFUN 1$: MOVB Q$UNIT(R4),R3 ;Get and check disk unitno. BIC #^C7,R3 MOV PC,R5 ADD #CHINFO-.+6.,R5 ;Setup tablepointer, skip:VMCOLL/EXIT MOV R3,R0 ASL R0 ;*2 Words -> bytes ASL R0 ;*4 Reads + Writes ADD R0,R5 ;Entry in DISK unit table CLR R0 MOV Q$WCNT(R4),R2 ;Read or Write? BPL 6$ TST (R5)+ ;Select write counter NEG R2 INC R0 ;Set mask bit ASH R3,R0 ;Shift left to its place 6$: INC (R5) MOVB R0,MASK ;Store mask .IF NE,NAREA MOV PC,R5 ADD #AREA-.,R5 ;Set up table pointer. MOV #NAREA,R1 10$: CMP R3,@R5 ;Check disk unitno. BEQ UNITOK ADD #22,R5 ;Point to next area. SOB R1,10$ ;Check all area's BR TODISK UNITOK: MOV Q$BLKN(R4),R0 ;R0=Low IO block address to access. ADD #377,R2 ;Round up. CLRB R2 ;Convert to no. of SWAB R2 ; blocks. DEC R2 ;One less. 1 block= offset 0! ADD R0,R2 ;R2=High IO block address to access. BLKCHK: CMP R2,MAXBLK(R5) ;Too high for VM cache? BHI NOHIT CMP R0,MINBLK(R5) ;Low IO block address OK? BHIS HIT CMP R2,MINBLK(R5) ;High IO below cache? BLO NEXTCH NOHIT: CMP R0,MAXBLK(R5) ;Low IO above cache? BHI NEXTCH INC VMPRT(R5) ;No full hit-> DATA from disk. .ENDC ; NE,NAREA TODISK: BITB MASK,DISKRO BNE PRTERR RETURN .IF NE,NAREA NEXTCH: ADD #22,R5 ;Next cache(CH) area CMP R3,@R5 ;Check disk unitno. area BNE TODISK BR BLKCHK ;Try this area ;-------------------------------VM-CACHE------------------------------------; HIT: MOV PC,R3 ADD #QELMNT-.,R3 MOV R4,R0 CMP -(R0),-(R0) ;R0 points to header disk queue .IF NE MMG$T .REPT 10. MOV (R0)+,(R3)+ ;Make copy of disk queue element .ENDR .IFF .REPT 7 MOV (R0)+,(R3)+ ;Make copy of disk queue element .ENDR .ENDC ADD BLKOFF(R5),VMBLCK ;Corresp. block address in file. TST Q$WCNT(R4) BPL CHREAD CHWRIT: CMP R2,#5 ;Request within BOOT area (0-5)? BHI 1$ ;april 86, /B (R2= highest blockno.) CMP R2,#1 ;Except HOME block! BNE 2$ ;All other temporary with /B ! 1$: CMP Q$BLKN(R4),MAXWTT(R5) ;Start block in temporary area? BLOS 3$ ;BLOS=> no 2$: INC VMWTMP(R5) ;Write to cache only=WRITE HIT! BR VMONLY 3$: BITB MASK,DISKRO ;Write protected =>can't update disk BEQ UPDATE .ENDC ; NE,NAREA PRTERR: BIS #HDERR$,@Q$CSW(R4) ;Write while WRITE-PROTECT => error MOV DKCQEA,R4 ;DISK Q-element pointer ADDRESS(DRFIN) .IF NE,NAREA BR DRFIN UPDATE: INC VMUPD(R5) CALL VMIO ;Write -> update VM-cache. BIT #HDERR$,@VMCSW ;VM IO ERROR? BNE ALLFND SETVM: MOV VMCQEA,R5 ;After CACHE I/O to VM: => check TST -(R5) ; pending VM req., adjust VM queue .MTPS #340 ;Disable interrupts MOV VMLINK,(R5)+ ;Setup VMLQE MOV VMLINK,(R5)+ ;Setup VMCQE BEQ 2$ INC VMEXIT ;RT-11 will call VM handler afterwards 2$: .MTPS #0 RETURN ;TO DISK / SETVM CALLER ;---------------------------------------------------------------------------; CHREAD: INC VMHIT(R5) VMONLY: CALL VMIO ;All data from VM. ALLFND: MOV DKCQEA,R4 ;DISK Q-element pointer ADDRESS BIT #HDERR$,@VMCSW ;VM IO ERROR? BEQ MONRET MOV @R4,R5 ;R5 = DISK Q-element pointer BIS #HDERR$,@Q$CSW(R5) MONRET: CALL SETVM ;Setup VM: input Queue .ENDC ; NE,NAREA CHINT: ;Note, CHINT: must be defined due to .DRBEG DRFIN: TST (SP)+ ;Pop off return to disk-handler. MOV @#54,R5 ;Return to monitor JMP @270(R5) ; and link-out Q-element .IF NE,NAREA ;-------------------- Send copy of Q-element to VM: ------------------------; VMIO: MOV VMCQEA,R3 ;Set up VM- dummy Q-element MOVB #200,VMFUNC CLR VMLINK .MTPS #340 MOV PC,R0 ADD #VMCQE-.,R0 MOV @R3,R1 ;At VM: Q-element pending? BEQ HANDGO INC VMCOLL ; VM has already an input I/O queue !! Link our dummy element to it 1$: TST Q$LINK(R1) BEQ 2$ MOV Q$LINK(R1),R1 BR 1$ 2$: MOV R0,Q$LINK(R1) ;Link it in VM queue MOV R0,-(R3) ;Set up VMLQE MOV (SP)+,R0 ;Pop off CH return MOV (SP)+,R1 ;Pop off DISK return MOV (SP)+,R3 ;Monitor return MOV R1,-(SP) MOV R0,-(SP) BR TOCALL HANDGO: TST -(R3) MOV R0,(R3)+ ;Setup VMLQE MOV R0,(R3)+ ;Setup VMCQE .IIF NE,V5.3 TST (R3)+ ;Skip V5.3 NOP data word! TOCALL: CLR -(SP) ;Lower priority MOV R3,-(SP) ; and jump to caller (VM entry or monitor) RTI ; ; Copy of disk Q-element = "dummy" VM Q-element ; QELMNT: VMLINK: .WORD 0 ;0 VMCSW: .WORD 0 ;2 VMCQE: VMBLCK: .WORD 0 ;4 VMFUNC: .BYTE 0 ;6 VMJBNM: .BYTE 0 ;7 VMBUFF: .WORD 0 ;10 VMWCNT: .WORD 0 ;12 VMCMPL: .WORD 0 ;14 .IF NE MMG$T QPAR: .WORD 0 ;16 XM PAR1 .WORD 0 ;20 RESERVED .WORD 0 ;22 RESERVED .ENDC ;MMG$T QLENGT: .WORD 0 ;24 .ENDC ; NE,NAREA .DREND CH .END ;*CH*-----------------------------------------------------------*CH*; .TITLE CACHF - Caching utility program V6 (File: CHCF6x.MAC) ; for FILES & DIRECTORIES ; =========================================================================== ; Directories and files to be cached can be specified directly without giving ; blocknumbers. These blocknumbers are automatically retrieved by CACHF from ; the file and directory information. ; Options: temporary area, bootblocks in temp.area, absolute block boundaries ; =========================================================================== ; >> NO USER (conditional) settings in this program << .ENABL LC ; Copyright (c) 1981,82,83,84,85,86 ; by H. Haenen NKG-AZG ; V4 sep-82/ V5 jul-83 / V6 sep-84 ; Multiple /T concatenated files, /B /L /H switch : july 85 --> V 6.1 ; RT-11 V5.3 changed data structure .DRBEG --> V 6.2 ; To use: .LOAD CH: ; .LOAD VM: ; .CACHF ; "C"= start caching ; "S"= stop caching ; "T"= Test cache contents ; "R"= Set disk unit to read-only ; "W"= Set disk unit to write enable ; You must STOP CACHING before a BOOT or COPY/DEV. ; You must redefine CACHING after a BOOT or COPY/DEV. ; Check the cache contents after a hard disk error in the cache region. .MCALL .EXIT,.DSTAT,.CSTAT, .LOOKUP,.TTYIN,.MRKT,.CMKT,.SPFUN .MCALL .PRINT,.SERR,.CLOSE, .READW,.WRITW,.GTLIN,.CSISPC,.ENTER .MCALL .FETCH, .SETTOP, .RELEAS, .FPROT, .GVAL, .DELETE ; RMON fixed offsets used: ; ------------------------ SYSVER = 276 ;Current RT-11 version offset STATWD = 366 ; Indirect control file status CONFIG = 300 ; Configuration word ; Bit defenitions: ; ---------------- FBMON$ = 1 ; 0 => SJ ; 1 => FB or XM RT11 Monitor FJOB$ = 200 ; 0 => no foreground or system job ; 1 => foreground or system VARSZ$ = 400 ; Variable size bit ; CACHF Offsets: ; -------------- DKUNIT = 0 ;Disk unit nr. for this cache area. MINBLK = 2 ;Block start address cache area MAXBLK = 4 ;High block address cache area MAXWTT = 6 ;High block address cache write-through area BLKOFF =10 ;Offset to transform to block address within VM cache file. VMHIT =12 ;Total nr. of VM-cache hits VMUPD =14 ; nr. of VM-cache updates(writes). VMPRT =16 ; nr. of partial VM-cache hits. VMWTMP =20 ;Total nr. of writes to temporary data cache area ; DISK VM: ;--------; ;--------; .PSECT STRING ; ; ; ; FERR: .ASCII /?CACHF-F-/<200> ; -------- STRBLK -------- VMOFF .PSECT CODE ; ; ; 0 ; ; ; ; DATA ; .MACRO ERRTST STR,TEST=CC,?LOC ; ^ ; ; CACHE ; .SAVE ; ! TMPBLK ; ; .PSECT STRING ; ! ; ; ; $$$= . ; v ; ; ; .ASCIZ \STR\ ; -------- MAXBLK -------- VMMAX .RESTORE ; ; ; SIZE-1 ; B'TEST LOC ;--------; ;--------; JSR R5,ERROR ; DISK CACHE AREA VM:CACHEX.SYS file .WORD $$$ LOC: .ENDM ERRTST .MACRO PRINT STR .SAVE .PSECT STRING $$$= . .ASCIZ \STR\ .RESTORE MOV (PC)+,R0 .WORD $$$ .PRINT .ENDM PRINT ;---------------------------- Initialize ----------------------------------; START: CLR COUNT ;Reset cache area counter. .SERR ;TRAP VARIOUS DEVICE ERRORS ; *** CH *** ;Device STATUS word/Handler size/Load address/size: .DSTAT #CHSTAT,#CHSPEC ;GET CH DEVICE INFORMATION ERRTST MOV CHSTAT+4,R3 ;BUF+4=HANDLER ENTRY ADDRESS at LQE ERRTST ,NE ADD #10,R3 ; +10=DKCQEA, +12=VMCQEA, +14=RAD50 ; RT-11 V5.3 ; +12 14 16 ; Check whether current system is RT-11 V5.3 or later CLR V53 ;Default < V5.3 MOVB #'O,UPDATE+1 .GVAL #AREA, #SYSVER MOV R0,R1 SWAB R0 CMP #<5*400!3>,R0 ;V5.3 or later ? BHI 20$ MOVB #'U,UPDATE+1 INC V53 ;Yes, now >= V5.3 ADD #2,R3 20$: MOVB R1,R0 ADD #'0,R0 MOVB R0,VERSION SWAB R1 MOVB R1,R0 ADD #'0,R0 MOVB R0,UPDATE .PRINT #HELLO ; -------------------------------- ; CLRB CLEAN TST @R3 BNE 1$ INCB CLEAN ;0=NOT clean, 1=clean 1$: MOV 4(R3), DKNAME ;Fetch RAD50 device name disk MOV DKNAME,DKSPEC MOV DKNAME,R0 MOV #NAME,R1 CALL R50ASC ADD #^R 0,DKNAME ;e.g. RK : -> RK0: MOV R3,PADDRS ADD #6,PADDRS ;Address of disk PROTECTION bits ; *** VM *** .DSTAT #VMSTAT,#VMSPEC ;GET VM DEVICE INFORMATION ERRTST TST VMSTAT+4 ;Entry address at LQE ERRTST ,NE ; *** LD *** MOV @#50,R5 ;Load R5 with high program limit. TST (R5)+ ;Make R5 point to free space CLR LD ;LD flag: 0= no LD in system! .DSTAT #LDSTAT,#LDSPEC ;Get LD disk information. BCS LDEND INC LD ;Signal LD is in system TST LDSTAT+4 BNE LDLOAD MOV LDSTAT+2,R1 ;Handler size! ADD R5,R1 ;New high limit needed! BCS MEMOVR .SETTOP R1 ;Do limit request. BCS MEMOVR 10$: CMP @#50,R1 ;Enough memory? BLO MEMOVR .FETCH R5,#LDSPEC BCC LDLOAD PRINT BR CLRLD MEMOVR: PRINT BR CLRLD NOLD: PRINT CLRLD: CLR LD BR LDEND LDLOAD: .LOOKUP #AREA,#1,#LDSPEC BCS NOLD .SPFUN #AREA,#1,#372,#LDHAND,#-1 ; SETUP LD info table BCS NOLD .CLOSE #1 LDEND: ; *** DISK *** .DSTAT #DKSTAT,#DKSPEC ;Get disk information. ERRTST MOV DKSTAT+4,R3 ERRTST ,NE MOV DKSTAT+6,DKSIZE TST V53 ;Check .DRBEG data structure with RT-11 V5.3 BEQ 20$ ADD #2,R3 20$: ADD #6,R3 TST LD BNE 1$ .PRINT #LDNONE BR 2$ 1$: .PRINT #LDINST 2$: .PRINT #NAME CLRB CHRUN TST @R3 BEQ 10$ INCB CHRUN ;0=NOrun, 1=RUN .PRINT #RUN BR INITOK 10$: .PRINT #NORUN TSTB CLEAN BNE INITOK .PRINT #CLNTXT ;------------------------- Ask for command --------------------------------; INITOK: .GVAL #AREA, #CONFIG ; get configuration word BIT #FBMON$,R0 ; RT11FB ? BEQ CMD ; it's RT11SJ -> start BIT #FJOB$,R0 ; foreground running ? BEQ CMD ; no -> start .GVAL #AREA, #STATWD ; Indirect control file status TST R0 BNE CMD .PRINT #WARN ;Say WARNING: NO I/O during start/stop CALL TTIN ;Get a command. R1 = input char. CMPB R1,#'Y ;No I/O going to disk? ERRTST ,EQ CMD: .PRINT #CMDTXT ;Say how to use this program. CALL TTIN ;Get a command. R1 = input char. CLRB TSTFLG CMPB R1,#'R ;Set read-only? BNE 1$ TSTB CHRUN BEQ CMDERR JMP SETRO 1$: CMPB R1,#'W ;Set write enable? BNE 2$ TSTB CHRUN BEQ CMDERR JMP SETWT 2$: CMPB R1,#'S ;Stop caching? BNE 3$ TSTB CHRUN BEQ CMDERR JMP CSTOP 3$: CMPB R1,#'T ;Test cache? BNE 4$ TSTB CHRUN BEQ CMDERR INCB TSTFLG JMP CSTOP 4$: CMPB R1,#'C ;Start caching? ERRTST ,EQ TSTB CHRUN ERRTST ,EQ BR CSTART CMDERR: PRINT JMP CMD ;-------------------------- Enable caching --------------------------------; ;**************************************************************************; CSTART: MOV CHSTAT+4,R3 ;BUF+4=HANDLER ENTRY ADDRESS at LQE TST V53 ;.DRBEG data structure => RT-11 V5.3 BEQ 20$ ADD #2,R3 20$: MOV R3,R1 ADD #4,R1 ;Points to JMP CACHE(+2/4=CQE, MOV R1,CHPNTR ;CH-address to put in disk CACHE-macro ADD #10,R3 ; +10/12=DKCQEA, +12/14=VMCQEA) MOV VMSTAT+4,R4 ;HANDLER ENTRY ADDRESS at VMLQE TST (R4)+ ;Point to VMCQE MOV R4,R0 MOV #VMMACR,R1 MOV VMSTAT+2,R2 ASR R2 ;Length VM handler in words. SUB #5,R2 ;We skip some header words and do not ; want running out of VM space VCHECK: CMP (R0),(R1) BNE 1$ ;Scan through VM code.... CMP 2(R0),2(R1) ; and try to find VMmacro BNE 1$ CMP 4(R0),4(R1) BNE 1$ CMP 6(R0),6(R1) BEQ VMMAOK 1$: ADD #2,R0 ;Next address SOB R2,VCHECK SEC ERRTST VMMAOK: MOV DKSTAT+4,R2 ADD #6,R2 ;Points to Cache loc. in disk-H. TST V53 ;.DRBEG data structure => RT-11 V5.3 BEQ 20$ ADD #2,R2 20$: MOV #CHMACR,R0 ;Check if CACHE Macro present in disk. CMP (R0),-2(R2) BNE NOMACR CMP 4(R0),2(R2) BNE NOMACR CMP 6(R0),4(R2) NOMACR: ERRTST ,EQ MACROK: TST @R2 ERRTST ,EQ MOV R2,CACHE ;Where to put CH-address. MOV DKSTAT+4,(R3) ;DISK Handler entry, store in CH: ADD #2,(R3)+ ;Point to CQE of DISK. MOV R4,(R3)+ ;Point to CQE of VM. TST (R3)+ ;Skip RAD50 disk name TST (R3)+ ;Skip disk PROTECTION bits ;R3 now points to CH-table pointer. MOV R3,CHINFO ;Save CH-table pointer. ADD @R3,CHINFO ;ADD table offset. MOV @CHINFO,NAREA ;Nr. cache area's BNE 1$ .PRINT #NOCACH JMP EXITC 1$: ADD #2,CHINFO ;-------------------------- Cache SETUP ---------------------------; ; ; Valid input CSI: ; /? = prints HELP info ; /S = stop asking for input ; CDx:/D = cache directory of cached device CD: unit x ; LDx:/D = cache directory of logical disk LDx: which ; resides on a cached device (CD:) unit ; CDx:/B = same as /D, but BOOT blocks (0-5, except 1) temporary ; dev:filnam.ext = put file in cache WRITE-THROUGH area ; ; Switches available together with filespecification (dev:filnam.ext): ; ; /T = put file in cache TEMPORARY area ; (dev: can either be a cached device unit or ; a logical disk residing on cached device) ; /L:n = n is low block boundary in file of cache area ; (n=0 is start of file!) ; /H:n = n is high block boundary of cache area ; (Note: use decimal dot (".") after decimal number!) ;------------------------------------------------------------------; ; ; Delete all existing cache files: ; -------------------------------- ; MOV #10.,R4 10$: .FPROT #AREA,#1,#VMFILE,#0 ;Unprotect VM-cache-file .DELETE #AREA,#1,#VMFILE ;Delete file if it already exists INC VMFIL ;Next file SOB R4,10$ MOV #^RHE0,VMFIL ;Init to 1st filename .PRINT #CSETUP ; NOTE: giving command after command, the ; the cached device unit on which the data ; reside should be equal or higher! CLR UNITB MOV NAREA,COUNT MOV #-1,STARTB ; Set no current area NEWCMD: MOV SP,R4 ; Save SP. CLR BOOT ; 0 CLR TEMP ; 0 CLR LOWBLK ; 0 CLR HGHBLK ; 0 CALL STATUS ; Print status. .CSISPC #OUTSPC,#DEFEXT ; Obtain filespecs. BCC OPT PRINT ; Check for error. BR AGAIN OPT: MOV (SP)+,R5 ; Load option count. OPTNXT: DEC R5 ; Any more options? BPL 100$ JMP OPTEND ; No- go restore SP. 100$: MOV (SP)+,R3 ; Load option description. CMPB R3,#'S ; Stop? BEQ OPTSTP ; Yes- go process it. CMPB R3,#'D BEQ OPTDIR ; Directory in cache! CMPB R3,#'B BNE 1$ INC BOOT ; Set BOOT block also BR OPTDIR ; Directory in cache! 1$: CMPB R3,#'? ; Display HELP info? BNE 2$ JMP OPTHLP ; Yes- go do it. 2$: CMPB R3,#'T ; Temporary area? BNE 3$ TST R3 BMI OPTSTP INC TEMP ; Yes- set temporary flag BR OPTNXT 3$: CMPB R3,#'L BNE 4$ TST R3 BPL NOVAL MOV (SP)+,LOWBLK ; Get block boundary value BR OPTNXT 4$: CMPB R3,#'H BNE 5$ TST R3 BPL NOVAL MOV (SP)+,HGHBLK ; Get block boundary value BR OPTNXT 5$: PRINT ; Display message and abort. BR AGAIN NOVAL: PRINT AGAIN: MOV R4,SP BR NEWCMD NOTEMP: PRINT NEW1: BR NEWCMD ;=========================== STOP *** OPTSTP: MOV R4,SP TST R3 BPL STPOK VALERR: PRINT NEW2: BR NEW1 STPOK: CMP STARTB,#-1 ;Previous area is setup BEQ 1$ CALL FILLAR ;If so 1st make definitive 1$: JMP EXITC ;=========================== DIRECTORY *** OPTDIR: MOV R4,SP TST R3 BMI VALERR TST TEMP BNE NOTEMP ;Directories only WTT TST INPSPC BEQ NODIR TST INPSPC+2 BNE NOFILE .LOOKUP #AREA,#2,#INPSPC ;OPEN DISK-DIRECTORY BCS NODIR .READW #AREA,#2,#NSEGM,#2,#6 ;Read DIR size from physical device BCS NODIR .CLOSE #2 ; ; Check directory: ; MOV NSEGM,R0 ;No. of valid segments is 1-31. DEC R0 CMP R0,#30. BHI ILLDIR MOV NXTSEG,R0 ;Pointer to next segment: 0-31. CMP R0,#31. BHI ILLDIR ; ; Fetch device unit: ; MOV INPSPC,R0 MOV #NAME,R1 CALL R50ASC MOVB NAME+2,R0 BIC #^C177,R0 SUB #'0,R0 BPL 1$ CLR R0 ; Case: RK instead of RK0! 1$: MOV R0,UNITF ; (space also generates unit error) CLR STARTF ; Initialize with 0 for LDDATA ; ; Check device identification: ; .DSTAT #BUF,#INPSPC BCS NODEV CMPB BUF,DKIDEN ;Is input CD: cached disk? BEQ 10$ TST LD BEQ NODEV CMPB BUF,LDIDEN ;Or, is it LD: logical disk? BNE NODEV ; ; LD Directory: ; CALL LDDATA BCS NEW3 ; ; Check physical device unit: ; 10$: CMP UNITF,UNITB BLO UNTERR ;Unit no. should be equal or increase ; ; Setup current area: ; CMP STARTB,#-1 ;Previous area is setup BEQ 20$ CALL FILLAR ;If so 1st make definitive 20$: MOV STARTF,STARTB ;Initialize with 0 or LD offset TST BOOT ;Start with BOOT block (0) ? BNE 30$ INC STARTB ;Start with HOME block 30$: MOV NSEGM,R0 ASL R0 ;*2 = No. blocks ADD #5,R0 ADD STARTF,R0 MOV R0,ENDB MOV R0,TEMPB MOV UNITF,UNITB MOV INPSPC,SAVDEV ; Save device specification NEW3: JMP NEW2 NODIR: PRINT .CLOSE #2 BR NEW3 ILLDIR: PRINT BR NEW3 NOFILE: PRINT BR NEW3 UNTERR: PRINT BR NEW3 NODEV: PRINT BR NEW3 ; DIR ;=========================== HELP *** OPTHLP: MOV R4,SP .PRINT #HELP ; Display version identification. NEW4: BR NEW3 ; HELP ;======= Option END: process FILE SPECIFICATION *** OPTEND: MOV R4,SP ; Restore SP from before CSISPC. TST INPSPC ; Check if valid file specification BNE DSPEC PRINT BR NEW4 DSPEC: TST INPSPC+2 BNE FSPEC PRINT BR NEW4 ; ; *** Cache a file *** ; FSPEC: .LOOKUP #AREA,#2,#INPSPC ;OPEN DISK-FILE. BCS FILERR .CSTAT #AREA,#2,#CBLKF ;Get CHANNEL INFORMATION BCC CHFILE FILERR: PRINT .CLOSE #2 BR NEW4 CHFILE: .CLOSE #2 ; ; Check device identification: ; .DSTAT #BUF,#INPSPC BCS NODEV CMPB BUF,DKIDEN ;Is input CD: cached disk? BEQ 5$ TST LD BEQ NODEV CMPB BUF,LDIDEN ;Or, is it LD: logical disk? BNE NODEV ; ; LD File: ; CALL LDDATA BCS NEW5 ; ; Adapt STARTF & LENGTH when block boundaries are specified! ; 5$: MOV STARTF,START0 ;Save start of file = block 0 TST LOWBLK BEQ 6$ ADD LOWBLK,STARTF ;New block boundary 6$: TST HGHBLK BEQ 10$ MOV HGHBLK,LENGTH INC LENGTH ;Make equivalent length from HGHBLK ; ; Put file into current cache area or setup new one: ; 10$: CMP UNITF,UNITB BLO UNTERR ;If lower don't accept. CMP STARTB,#-1 ;Is there previous area? BNE UPDTAR ;If so try to update it? ; Setup start of NEW area: SET: MOV STARTF,STARTB ;Set start of NEW area MOV START0,ENDB ;Set end of area: ADD LENGTH,ENDB DEC ENDB MOV ENDB,TEMPB ;1st assume Write-Through MOV UNITF,UNITB MOV INPSPC,SAVDEV ; Save device specification TST TEMP BEQ NEW4 MOV STARTB,TEMPB ;Set temporary and make defenitive DEC TEMPB ;Should mark LAST WRITE-TROUGH block! NEW5: BR NEW4 ; Try to concatenate with previous area: UPDTAR: MOV ENDB,R0 INC R0 CMP R0,STARTF ;Check if previous can be linked BNE NWAREA ;EQ -> Yes! CMP UNITF,UNITB ;Must be on the same disk unit! BEQ CONTIG NWAREA: CALL FILLAR ;Previous not contiguous with current! BR SET ; Current file contiguous with current area, check if they ; can be linked ( NOT possible when previous is temporary ; and current write-through): CONTIG: TST TEMP ;New file is temporary? BNE TEMPOR CMP ENDB,TEMPB ;New is WTT, previous? BNE NWAREA ;If previous Temp., setup new area ADD LENGTH,ENDB ;Concatenate new with previous WTT MOV ENDB,TEMPB BR NEW5 TEMPOR: CMP ENDB,TEMPB ;New is Temp., previous? BNE PRVTMP MOV STARTF,TEMPB ;Previous is WTT, concatenate DEC TEMPB ;Should mark LAST WRITE-TROUGH block! PRVTMP: ADD LENGTH,ENDB BR NEW5 ;------------- Create VM file and copy disks block to VM-cache -------------; FILLAR: MOV ENDB,R4 ;Length of file in R4 SUB STARTB,R4 INC R4 ;Yes, amazed? .ENTER #AREA,#1,#VMFILE,R4 ;Create VM-cache-file ERRTST VMFOK: .CSTAT #AREA,#1,#CBLKVM ;Get CHANNEL INFORMATION BCC OK PRINT ;Should never happen! BR NEW5 OK: .LOOKUP #AREA,#2,#SAVDEV ;Open disk NON-file structured ERRTST MOV CHINFO,R3 MOV UNITB,(R3) ;Set disk unitnr. for this cache area. MOV STARTV,BLKOFF(R3) ;Starting block number of cache on VM. SUB STARTB,BLKOFF(R3) ;Correct for disk start address. MOV STARTB,MINBLK(R3) ;Store disk start address in CH:. MOV ENDB,MAXBLK(R3) ;Store in CH max. block limit MOV TEMPB,MAXWTT(R3) ;Store in CH begin temporary area. .PRINT #CHFILL CLR R2 ;Start with block 0 in VM file MOV STARTB,R3 ;Disk start address. LOOP: .READW #AREA,#2,#BUF,#256.,R3 ;Read blocks from physical device ERRTST <.READW failed> MOV R2,R0 BIC #^C7,R0 ;Every 8 blocks BNE 1$ .PRINT #DOT ; .= 1Kw. 1$: .WRITW #AREA,#1,#BUF,#256.,R2 ;Write blocks to VM-cache-file. ERRTST <.WRITW failed> INC R2 ;Next block. INC R3 ;Next block. SOB R4,LOOP .PRINT #NEWLIN .CLOSE #1 ;CLOSE VM: CHANNEL .FPROT #AREA,#1,#VMFILE,#1 ;Protect VM-cache-file ERRTST .CLOSE #2 ;CLOSE DISK CHANNEL ADD #18.,CHINFO ;Point to next disk area-table. INC VMFIL ;Select next cache file. DEC COUNT ;ONE area less BEQ EXITC MOV #-1,STARTB ; Set no current area RETURN EXITC: MOV CHPNTR,@CACHE ;Enable disk caching. PRINT < Disk-cache running!> JMP EXITCF ;------------------------------------------------; CHMACR: TST (PC)+ ;Data set CACHE macro in disk-handler CACH: .WORD 0 BEQ CHEND CALL @CACH CHEND: ; -----------------------------------------------; Q$FUNC=2 VMMACR: CMPB Q$FUNC(R5),#200 ;Data set DRFNVM macro in VM-handler BNE VMEND RETURN VMEND: ;------------------------- STOP/TEST Caching ------------------------------; ;**************************************************************************; CSTOP: MOV CHSTAT+4,R3 ;HANDLER ENTRY ADDRESS TST V53 ;.DRBEG data structure => RT-11 V5.3 BEQ 20$ ADD #2,R3 20$: ADD #10,R3 ;+10/12=DKCQEA, +12/14=VMCQEA MOV DKSTAT+4,R2 TST V53 ;.DRBEG data structure => RT-11 V5.3 BEQ 22$ ADD #2,R2 22$: ADD #6,R2 ;Points to Cache loc. in disk-H. TSTB TSTFLG BEQ 1$ MOV @R2,DKLINK ;Save CACHE-Disk LINK MOV R2,LINKAD ;for restore after test!! 1$: CLR @R2 ;Disable disk driver caching 1st. ; -------------------------------- TSTB TSTFLG BNE 2$ CLR (R3)+ ;Clear disk pointer (DKCQEA). CLR (R3)+ ;Clear VM pointer (VMCQEA). BR 3$ 2$: TST (R3)+ TST (R3)+ 3$: TST (R3)+ ;Skip RAD50 disk name TST (R3)+ ;Skip PROTECTION flags MOV R3,CHINFO ADD @R3,CHINFO ;ADD table offset. MOV @CHINFO,NAREA ;Nr. cache area's BNE 4$ .PRINT #NOCACH JMP EXSTOP 4$: ADD #2,CHINFO ;-----------------------------all units-------------------------------; STPRPT: MOV #NUMBER,R3 ;Print INC COUNT ; DISK MOV COUNT,R0 ; AREA CALL CNV10 ; number .PRINT #DKAREA MOVB #200,@R3 .PRINT #NUMBER MOV CHINFO,R3 MOV @R3,R0 ;Fetch device unit nr. BPL STPUOK JMP EXSTOP STPUOK: MOV DKNAME,DKSPEC ADD R0,DKSPEC MOV R3,-(SP) MOV #NUMBER,R3 ;Print CALL CNV10 ; DISK .PRINT #DKUNT ; UNIT MOVB #200,@R3 .PRINT #NUMBER ; number MOV (SP)+,R3 MOV MINBLK(R3),R4 ;Disk start block. MOV MAXWTT(R3),R5 ;Max. block address write-through area TSTB TSTFLG ;Preserve table if testing only! BNE 1$ CLR BLKOFF(R3) ;Start blk.nr. cache file on VM CLR MINBLK(R3) ;Reset CLR MAXWTT(R3) ; block addresses CLR MAXBLK(R3) 1$: TST R5 ;Check max. block address BEQ 2$ INC R5 ;Change blk address into number blocks SUB R4,R5 ;MAX.-MIN. BHI COMPAR 2$: PRINT < Nothing to compare!> JMP NOCOMP COMPAR: MOV R4,STARTB ;Save R4 for printout later. ;------------- Compare VM-cache write-through area with disk --------------; .LOOKUP #AREA,#2,#DKSPEC ;OPEN DISK. ERRTST .LOOKUP #AREA,#1,#VMFILE ;OPEN CHANNEL TO VM-cache-file BCC VMFSOK PRINT BR NEXTS ;------------------- Read disk/cache block and compare --------------------; VMFSOK: .PRINT #CHECK CLR R2 ;Start with block 0 in VM file CLRB ERRFLG ; BEGIN COMPARE blocks LOOP ; ===== CMPLP: .READW #AREA,#2,#BUF,#256.,R4 ;Read blocks from physical disk device ERRTST <.READW1 failed> .READW #AREA,#1,#BUF2,#256.,R2 ;Read blocks from VM-cache-file. ERRTST <.READW2 failed> MOV R2,R0 BIC #^C7,R0 ;Every 8 blocks BNE 3$ .PRINT #DOT ; .= 1Kw. 3$: ; Compare block cache/disk: MOV #BUF,R0 MOV #BUF2,R1 MOV #256.,R3 1$: CMP (R0)+,(R1)+ BNE 2$ SOB R3,1$ BR BLCKOK 2$: CALL CHERR ; ------------------------- BLCKOK: INC R2 ;Next block. INC R4 ;Next block. SOB R5,CMPLP ; END COMPARE blocks LOOP ; === TSTB ERRFLG BEQ 1$ .PRINT #DATERR BR EXCACH 1$: .PRINT #NEWLIN .PRINT #DATAOK EXCACH: MOV #NUMBER,R3 MOV STARTB,R0 ;Print MIN. block addr. CALL CNV10 ; MOVB #200,@R3 .PRINT #NUMBER MOV #NUMBER,R3 MOV R4,R0 ;Print MAX. block addr. DEC R0 ;Highest WTT block address. CALL CNV10 ; .PRINT #CONCAT .PRINT #NUMBER NOCOMP: .CLOSE #1 ;Close channels. NEXTS: .CLOSE #2 ; ADD #18.,CHINFO ;Point to next diskarea-table. INC VMFIL ;Select next cache file. CMP COUNT,NAREA BEQ EXSTOP JMP STPRPT ;----------------------------- End of it ----------------------------------; EXSTOP: TSTB TSTFLG ;Testing? BEQ 2$ MOV LINKAD,R2 ;Address CACHE-Disk LINK MOV DKLINK,@R2 ;Restore CACHE-Disk LINK 2$: .PRINT #NEWLIN EXITCF: TST LDSTAT+4 BNE 1$ ; IF (LD was not loaded) THEN (release LD) .RELEAS #LDSPEC 1$: .EXIT ; Print bad block (or is a BOOT block?): CHERR: MOV #NUMBER,R3 MOV R4,R0 ;R4 = physical address of bad block. CALL CNV10 MOVB #200,@R3 ;NEWLIN does CRLF! .PRINT #NEWLIN CMP R4,#5 ;Boot area? BHI 1$ CMP R4,#1 ;Home block? BNE 2$ 1$: .PRINT #WTTERR ;After WTTERR follows NUMBER string! INCB ERRFLG RETURN 2$: .PRINT #BOOTXT ;Print that it was a boot block! RETURN ;--------------------------- Set Read-Only --------------------------------; ;**************************************************************************; SETRO: .PRINT #TEXTRO MOV #8.,LIMIT ;Query for disk unit nr. MOV #UNTTXT,R1 ;Question. CALL GETINT TST R1 BMI EXRW MOV #1,R0 ASH R1,R0 BISB R0,@PADDRS ;Set prot-bit EXRW: JMP EXITCF ;------------------------- Set Write-enable -------------------------------; ;**************************************************************************; SETWT: .PRINT #TEXTWT MOV #8.,LIMIT ;Query for disk unit nr. MOV #UNTTXT,R1 ;Question. CALL GETINT TST R1 BMI EXRW MOV #1,R0 ASH R1,R0 BICB R0,@PADDRS ;Clear prot-bit BR EXRW ;------------------------ CACHE Data Area ---------------------------------; ;================== DATA block 1 V53: .WORD 0 SAVDEV: .WORD 0,0 PADDRS: .WORD 0 CHRUN: .BYTE 0 CLEAN: .BYTE 0 TSTFLG: .BYTE 0 ERRFLG: .BYTE 0 LIMIT: .WORD 0 NAREA: .WORD 0 ONFLG: .WORD 0 LINKAD: .WORD 0 DKLINK: .WORD 0 AREA: .BLKW 6 STARTB: .WORD 0 ;Start address cache area on disk. TEMPB: .WORD 0 ;Start address temporary cache area. ENDB: .WORD 0 ;End address cache area on disk. UNITB: .WORD 0 BOOT: .WORD 0 TEMP: .WORD 0 ;================== DATA block 2 LOWBLK: .WORD 0 HGHBLK: .WORD 0 START0: .WORD 0 CBLKF: ;Channel status block CSW: .WORD 0 ; " " word STARTF: .WORD 0 ;Block start no. of file LENGTH: .WORD 0 ;Length of file HIGHWT: .WORD 0 ;Highest block written UNITF: .WORD 0 ;Unit no. of device DEVR50: .WORD 0 ;RAD50 of device CBLKVM: ;Channel status block VM: cache file .WORD 0 ; " " word STARTV: .WORD 0 ;Block start no. of cache file .WORD 0,0,0,0 ;================== DATA block 3 OUTSPC: .BLKW 5 ;Output filespec ch0 .BLKW 5*2 ; ch1 + ch2 INPSPC: .BLKW 4 ;Input filespec ch3 .BLKW 4*6 ; ch4 - ch9 DEFEXT: .WORD 0,0,0,0 ;Default extensions for .CSISPC ;================== DATA block 4 CACHE: .WORD 0 ;CH-address in disk driver.a CHPNTR: .WORD 0 ;Entry point for disk into CH. CHINFO: .WORD 0 ;Points to INFO table in CH: COUNT: .WORD 0 BUF: .BLKW 256. BUF2: .BLKW 256. ;================== DATA block 5 CHSPEC: .RAD50 /CH / ;<== CH SPEC .WORD 0 CHSTAT: .BLKW 4 VMSPEC: .RAD50 /VM / ;<== VM SPEC .WORD 0 VMSTAT: .BLKW 4 DKSPEC: .WORD 0 ;<== DISK DRIVER SPEC!! .WORD 0 DKNAME: .WORD 0 ;<== DISK DRIVER SPEC!! DKSIZE: .WORD 0 NSEGM: .WORD 0 ;No. of directory segments NXTSEG: .WORD 0 ;Pointer to next directory segment DKSTAT: DKIDEN: .BYTE 0,0 .WORD 0,0,0 SPFBLK: .WORD 0,0,0,0 VMFILE: .RAD50 /VM CAC/ ;<== CACHE FILE, VM:CACHE0.SYS VMFIL: .RAD50 /HE0SYS/ ;================== DATA block 6 LD: .WORD 0 ;LD flag LDSPEC: .RAD50 /LD / .WORD 0 LDSTAT: .WORD 0,0,0,0 LDIDEN: .BYTE 46,0 ;================== DATA block 7 HELLO: .BYTE 15,12 .ASCII \ * CACHE utility for FILES & DIRECTORIES V6.2 (RT-11 V\ VERSION:.BYTE ' ,'. UPDATE: .ASCIZ \ ) *\<12> WARN: .ASCII <12>\ NO I/O to cached device permitted !\<15><12><12> .ASCII \Foreground/System job loaded! ARE YOU SURE?(Y/N):\<200> NOCACH: .ASCIZ /NO data-cache: monitoring only!/ CMDTXT: .ASCII <12>/S E L E C T >/<15><12><12> .ASCII #CACHE start / STOP cache / TEST /# .ASCII # READ-ONLY / WRITE-enable :#<200> LDNONE: .ASCII \ No Logical Disk! \<200> LDINST: .ASCII \ LD: available. \<200> NAME: .BYTE 0,0,0 .ASCII \= cached device. Caching = \<200> RUN: .ASCIZ \ON\ NORUN: .ASCIZ \OFF\ CLNTXT: .ASCII \ Bad cleanup> CH: pointing to disk!\ NEWLIN: .BYTE 0 UNTTXT: .ASCII <12>/Disk unit no. (-1=exit) [0]:/<200> CHECK: .ASCII / Check/<200> CHFILL: .ASCII / Filling cache file/<200> DOT: .ASCII /./<200> DKAREA: .ASCII <12>/* Disk AREA /<200> DKUNT: .ASCII /, unit /<200> TEXTRO: .ASCIZ <12>/S E T Read-Only>/ TEXTWT: .ASCIZ <12>/S E T Write-enable>/ DATAOK: .ASCII <12>/ ALL data O.K. for block : /<200> DATERR: .ASCII <12>/ Data ERROR in cache area : /<200> CONCAT: .ASCII /- /<200> BOOTXT: .ASCII % BOOT area =>% WTTERR: .ASCII % CACHE/DISK DIFFER for block: % NUMBER: .BLKB 10. ;================== DATA block 8 CSETUP: .ASCIZ <12><11>#** S E T U P C A C H E (type /? for HELP) **#<12> HELP: .ASCII / Valid CACHE SETUP input:/<15><12><12> .ASCII # /?= Prints HELP info#<15><12> .ASCII # /S= Stop (preliminary) asking input#<15><12> .ASCII # CDx:/D= Cache directory of CD: unit x#<15><12> .ASCII # CDx:/B= As /D, but BOOT blocks (0-5 except 1) temporary# .BYTE 15,12 .ASCII # LDx:/D= Directory logical disk LDx: which#<15><12> .ASCII # must reside on cached disk (CDx:)#<15><12> .ASCII # dev:fname = File in WRITE-THROUGH area#<15><12><12> .ASCII # Note: dev: can only be CDx: or LDx: !#<15><12><12> .ASCII # Switches available together with file specification# .ASCII # (dev:filnam.ext):#<15><12><12> .ASCII # /T = Put file in TEMPORARY area#<15><12> .ASCII # /L:n = n is low block boundary in file#<15><12> .ASCII # /H:n = n is high block boundary in file#<15><12> .ASCII <12># Note: use decimal dot (".") after decimal number!#<15> .ASCII <12># use relative n> n=0 is start of file!# .BYTE 0 .EVEN ;---------------------------- Subroutines ---------------------------------; ;------------------------------ STATUS ------------------------------------; STATUS: CMP STARTB,#-1 BNE 1$ .PRINT #NOSTAT BR FREE ; 1$: MOV STARTB,R0 MOV #NUMBER,R3 CALL CNV10 MOVB #200,@R3 .PRINT #STAT .PRINT #NUMBER ; .PRINT #CONCAT ; MOV ENDB,R0 MOV #NUMBER,R3 CALL CNV10 MOVB #200,@R3 .PRINT #NUMBER ; MOV #SHDEV,R1 MOV SAVDEV,R0 CALL R50ASC .PRINT #DEV ; FREE: MOV COUNT,R0 MOV #NUMBER,R3 CALL CNV10 .PRINT #AFREE .PRINT #NUMBER CMP COUNT,#1 BNE 1$ .PRINT #LAST 1$: RETURN NOSTAT: .ASCII <12>/No current defined cache area! /<200> STAT: .ASCII <12>/Current cache: /<200> DEV: .ASCII / on / SHDEV: .BYTE 0,0,0,':,40,40,200 AFREE: .ASCII / Available area's =/<200> LAST: .ASCIZ /LAST area! Make it defenitive!/ .EVEN ;------------------------------ LDDATA ------------------------------------; LD.ASS=100000 LD.RDO=20000 LD.SQZ=100 ; ; Routine fetches data of LD for block & device unit transform ; ; Result: Input UNITF =LD unit no. Output: UNITF =physical disk unit no. ; STARTF=File start blk STARTF=idem +LD block offset ; INPSPC=physical dev. spec. ; error - > carry set! LDDATA: MOV UNITF,R0 ASL R0 MOV #LDOFFS,R1 ADD R0,R1 MOV @R1,R2 ;LD block offset BEQ LDERR ADD R2,STARTF ;SET it ; MOV #LDHAND,R1 ADD R0,R1 MOV @R1,R2 ;LD status BIT #LD.ASS,R2 BEQ LDERR BIT #LD.RDO,R2 BEQ OKPROT TST TEMP BEQ LDWERR PRINT OKPROT: SWAB R2 BIC #^C7,R2 ;Fetch physical unit no. MOV R2,UNITF ;SET it MOV DKNAME,INPSPC ;Replace LD spec. ADD R2,INPSPC ; with correct physical dev unit no. CLC RETURN ; LDERR: PRINT SEC RETURN LDWERR: PRINT SEC RETURN ; ; BIT 8/9/10 = PHYSICAL DISK UNIT NO. ; LDHAND: .BLKW 8. LDOFFS: .BLKW 8. LDSIZE: .BLKW 8. LDNAME: .BLKW 8.*4 ;------------------------------- CNV10 ------------------------------------; ;+ CALL CNV10 Uses R0 and R3!! ; Routine converts bits to decimal ASCII string. ; R0; Contains bits to be converted ; R3; Points to output area ; Size of area should be nr. digits plus two ; On return R3 points to string terminator ; Note: Contens of R0, R3 is changed!! CNV10:: MOV R1,-(SP) CALL CONVRT MOVB #' ,(R3)+ CLRB @R3 ;Insert terminator CRLF MOV (SP)+,R1 ;- End CNV10 RETURN CONVRT: ;+ CONVRT MOV R0,R1 CLR R0 DIV #10.,R0 MOV R1,-(SP) TST R0 BEQ DONE CALL CONVRT DONE: MOVB (SP)+,@R3 BISB #'0,(R3)+ RETURN ;- End CONVRT ;------------------------------- ERROR ------------------------------------; ERROR: .PRINT #FERR .PRINT (R5)+ .EXIT ;------------------------- Terminal input(2*) -----------------------------; ;------- 1: ; ; Get 1st character of command and store in R1 NOINP: .PRINT #NOINPT TTIN: CLR R1 .GTLIN #LINBUF MOV #LINBUF,R0 10$: MOVB (R0)+,R1 BEQ NOINP CMPB #' ,R1 BEQ 10$ ; ; Convert to uppercase: ; CMPB R1,#'A+40 BLT 20$ CMPB R1,#'Z+40 BGT 20$ BICB #40,R1 20$: RETURN LINBUF: .BLKW 41. NOINPT: .ASCII <12>/?Give valid input:/<200> .EVEN ;--------2: GETINT::MOV R1,R1SAVE REPGET: MOV R1SAVE,R1 .PRINT R1 CLR R1 CLR MINFLG .GTLIN #LINBUF MOV R2,-(SP) ;We need R2. MOV #LINBUF,R2 1$: MOVB (R2)+,R0 ;Get a character. BEQ GTDONE CMPB #' ,R0 ;Leading SPACE? => O.K. BEQ 1$ CMPB #'-,R0 ;MINUS => Remember BNE 2$ INC MINFLG BR 1$ 2$: SUB #60,R0 ;Convert to binary. BLT GTDONE ;LT-> No digit! CMPB #9.,R0 BLT GTDONE ;LT-> No digit! ASL R1 ;*2 MOV R1,-(SP) ASL R1 ;*4 ASL R1 ;*8. ADD (SP)+,R1 ;*2+*8. = *10. ADD R0,R1 ;Put in new digit. BR 1$ ;Get next. GTDONE: MOV (SP)+,R2 TST MINFLG BEQ 1$ NEG R1 ;Make binairy negative value. 1$: CMP R1,#-1 ;Accept -1 for disk unit nr. BNE 2$ CMP #8.,LIMIT ;Was query for unit nr.? BEQ RTNGET 2$: CMP R1,LIMIT ;Check max. value. BLO RTNGET .PRINT #ILLVAL BR REPGET RTNGET: RETURN R1SAVE: .WORD 0 MINFLG: .WORD 0 ILLVAL: .ASCIZ /?Illegal input value!/ .EVEN ;--------------------------- RAD50 => ASCII -------------------------------; ; RAD50 to ASCII conversion routine ; R0 = RAD50 characters INPUT ; R1 > OUTPUT BUFFER ; R2 is USED as a SCRATCH register ; R50ASC: CALL DIV50 ; DIVIDE BY 50(8) MOV R2,-(SP) ; SAVE THIRD CHARACTER CALL DIV50 ; AGAIN MOV R2,-(SP) ; AND SAVE SECOND CHARACTER CALL DIV50 ; ONCE MORE CALL 10$ ; CONVERT TO ALPHA AND OUTPUT MOV (SP)+,R2 ; REMEMBER SECOND CALL 10$ ; AND OUTPUT MOV (SP)+,R2 ; REMEMBER THIRD ; AND FALL THROUGH 10$: TST R2 ; SPACE ? BEQ 20$ ADD #40,R2 ; NO - ADD OFFSET FOR A-Z CMP R2,#72 ; ALPHA ? BLE 20$ SUB #56,R2 ; NO - OFFSET TO NUMERIC CMP R2,#16 ; NUMERIC, *, OR % ? BGE 20$ CLR R2 ; NO - FORCE TO BLANK 20$: ADD #40,R2 ; FINISH TRANSLATION MOVB R2,(R1)+ ; AND OUTPUT RETURN ; ; DIV50 ROUTINE - DUMB SUBTRACT-AND-INCREMENT, BUT WHO CARES ; DIV50: MOV R0,R2 CLR R0 1$: SUB #50,R2 BCS 2$ INC R0 BR 1$ 2$: ADD #50,R2 RETURN ;======================================================================; .END START ; MACRO FOR CACHING AND ITS APPLICATION IN DISK HANDLER ; ; ------------------------------------------------------; .MACRO CACHE,?X TST (PC)+ CACHE: .WORD 0 ;Entry point CacHe driver. BEQ X CALL @CACHE ;Goto CH-driver. X: .ENDM CACHE ; ;-------------------------------------------------------; .TITLE CSHOW ; FILE: CHSH6x.MAC ; Program accesses CH handler to show CACHE setup and print counters ; H.H. NKG-AZG ; ; Device identifier of physical VM: is assumed to be 47: ; VMIDEN=47 ;Prog. Ref. Man. 1983, p.2-38 VARSZ$=400 ; .MCALL .EXIT,.DSTAT,.PRINT,.LOOKUP,.SPFUN,.CLOSE .ENABL LC .PSECT STRING; FERR: .ASCII /?CSHOW-F-/<200> .PSECT CODE .MACRO ERRTST STR,TEST=CC,?LOC .SAVE .PSECT STRING $$$= . .ASCIZ \STR\ .RESTORE B'TEST LOC JSR R5,ERROR .WORD $$$ LOC: .ENDM ERRTST .MACRO PRINT STR .SAVE .PSECT STRING $$$= . .ASCII \STR\<0> .RESTORE MOV (PC)+,R0 .WORD $$$ .PRINT .ENDM PRINT ;-------------------------Program start--------------------------------; CSHOW: CLRB DKTOCH ;Init pointer flags CLRB CHTODK .DSTAT #BUF,#CHSPEC ;GET DEVICE INFORMATION ERRTST CMPB BUF,#VMIDEN ;Check device identifier VM: ERRTST ,NE MOV BUF+4,R3 ;HANDLER ENTRY ADDRESS ERRTST ,NE ;0 = LQE +2=CQE, ADD #10,R3 ; +10=DKCQEA, +12=VMCQEA TST (R3)+ ;Is DKCQEA in CH: pointing? BEQ 1$ INCB CHTODK 1$: TST (R3)+ ;Skip VMCQEA MOV (R3)+,R0 ;Fetch cached disk name MOV R0,DKSPEC MOV #DNAME1,R1 CALL R50ASC MOVB #'n,-1(R1) MOVB #':,(R1) MOVB DNAME1,DNAME2 MOVB DNAME1+1,DNAME2+1 MOVB DNAME1+2,DNAME2+2 MOVB DNAME1+3,DNAME2+3 MOV (R3)+,DISKRO ;Fetch read-only pattern ;Cached device STATUS word/Handler size/Load address/size: .DSTAT #BUF,#DKSPEC ERRTST MOV BUF+4,R5 ERRTST ,NE MOV BUF,DKSTAT MOV BUF+6,DKSIZE ;Initialize size ADD #6,R5 TST @R5 BEQ 10$ INCB DKTOCH TSTB CHTODK BNE 100$ .PRINT #BADON BR 100$ 10$: .PRINT #COFF TSTB CHTODK BEQ 100$ .PRINT #BADOFF 100$: MOV R3,R4 ;Pointer CHINFO. ADD (R3),R4 ;ADD offset to NAREA MOV (R3)+,R5 ;Save table offset for DISK unit calc. MOV (R3)+,VMCOLL MOV (R3)+,VMLINK MOV R4,AREATB ;Setup area pointer. ; Note V6: NUNIT is dropped and fixed to 8, therefore R5=8. always! ;;;; ASR R5 ;/2 ;;;; ASR R5 ;/4, R2=nr. of disk units ;;;; DEC R5 ;Substract 1 due to VMCOLL/EXIT MOV #8.,R5 MOVB #60,UNIT MOV R3,R4 ;Pointer R4 points to unitno. list ;============== PRINT No. READs & WRITEs for each device unit ==============; ADD #^R 0,DKSPEC ;Change 3rd char from blank to 0 MOVB #200,UNTEND .PRINT #HEAD0 CLR R2 ;Binairy unit counter (UNIT=ASCII!) UNLOOP: MOV #OUTLIN,R3 MOV #1,R0 ASH R2,R0 ; Test mask pattern versus disk ro-pattern MOVB R0,MASK BITB MASK,DISKRO ; Read-only? BNE 1$ TST @R4 ; D'not print units with zero count! BNE 1$ ; (unless.... the unit was read-only) ADD #4,R4 BR NCOUNT 1$: CALL CNV104 CALL CNV104 MOVB #200,@R3 .PRINT #OUTLIN .PRINT #UNTTXT ;Set size again if variable volume: MOV #SIZE,R0 MOVB #' ,(R0)+ MOVB #' ,(R0)+ MOVB #' ,(R0)+ MOVB #' ,(R0)+ BIT #VARSZ$,DKSTAT BEQ SIZEOK CLR DKSIZE MOVB #'V,SIZE .LOOKUP #AREA,#0,#DKSPEC BCC 10$ MOVB #'?,SIZE+2 ;' ?' = LOOKUP error 10$: .SPFUN #AREA,#0,#373,#BUF,#1,#BLK BCC 11$ MOVB #'?,SIZE+1 ;'?' = SPFUN size req. error BR 12$ 11$: MOV BUF,DKSIZE 12$: .CLOSE #0 SIZEOK: MOV #OUTLIN,R3 MOV DKSIZE,R0 CALL CNV10 MOVB #200,@R3 CLRB SIZE+3 BITB MASK,DISKRO ;Read-only? BEQ 1$ MOVB #200,SIZE+3 .PRINT #OUTLIN .PRINT #SIZE .PRINT #NOWRIT BR NCOUNT 1$: .PRINT #OUTLIN .PRINT #SIZE NCOUNT: INCB UNIT INC DKSPEC INC R2 DEC R5 BEQ 1$ JMP UNLOOP 1$: MOV AREATB,R4 ;Fetch nr. area's MOV (R4)+,NAREA BNE 2$ .PRINT #NOCACH .EXIT 2$: CLR COUNT ;======================= PRINT CACHE area STATISTICS =======================; CLRB UNTEND .PRINT #HEAD1 .PRINT #HEAD2 .PRINT #HEAD3 NEXTCH: INC COUNT ;Count the cache area's MOV #OUTLIN,R3 MOV (R4)+,R0 ;Set disk unit nr. BMI EXIT ADD #60,R0 MOVB R0,UNIT CALL CNV104 MOVB #'-,(R3)+ ;Low-High block seperator CALL CNV104 CALL CNV104 TST (R4)+ ;Skip VM block offset. .REPT 4 CALL CNV104 .ENDR MOVB #200,@R3 .PRINT #OUTLIN+3 .PRINT #UNTTXT CMP COUNT,NAREA BLT NEXTCH EXIT: MOV VMCOLL,R0 BNE 1$ TST VMLINK BNE 1$ .EXIT ;====================================; 1$: MOV #OUTLIN,R3 CALL CNV10 MOVB #200,@R3 .PRINT #PVMCOL .PRINT #OUTLIN MOV VMLINK,R0 MOV #OUTLIN,R3 CALL CNV10 MOVB #200,@R3 .PRINT #PVMLNK .PRINT #OUTLIN .PRINT #PVMEND .EXIT ;------------------------- Program DATA --------------------------------; BADON: .ASCIZ / Caching = ON, DANGER: NO link from CH: to disk!/<12> COFF: .ASCIZ / Caching = OFF, no link from disk TO CH:/<12> BADOFF: .ASCIZ / Bad cleanup >>> link from CH: to disk!/<12> UNTTXT: .ASCII % UNIT % UNIT: .BYTE 60,40,40 UNTEND: .BYTE 200 SIZE: .BYTE 0,0,0,0 NOWRIT: .ASCIZ / NoWrite/ NOCACH: .ASCIZ /No data cached!/ ;1234567812345678 HEAD0: .ASCII <12>/ Reads Writes / DNAME1: .ASCII /DISK Size(blocks) CACHE V6.1/<15><12> .ASCIZ / ----- ------ ------ ------------/ ; 1 2 3 4 5 6 ;12345678901234567890123456789012345678901234567890123456789012 ;12345678-123456781234567812345678123456781234567812345678 HEAD1: .BYTE 12 .ASCII /!Block Address Write-Thr! Read Updates Partial Wrt-tmp / DNAME2: .ASCIZ /DISK/ HEAD2: .ASCIZ /! Cache area upto ! Hits Hits Hits/ HEAD3: .ASCIZ /!-----------------------! ---- ------- ------- ------- ----/ PVMCOL: .ASCII <12>% (VM I/O collisions=%<200> PVMLNK: .ASCII % VM linked I/O on exit=%<200> PVMEND: .ASCIZ %)% OUTLIN: .BLKB 60. .EVEN CHTODK: .BYTE 0 DKTOCH: .BYTE 0 DISKRO: .BYTE 0 MASK: .BYTE 0 CHSPEC: .RAD50 /CH / .WORD 0,0,0 DKSPEC: .RAD50 /RK / ;Set by CSHOW! .WORD 0,0,0 DKSIZE: .WORD 0 DKSTAT: .WORD 0 AREA: .BLKW 4 BLK: .WORD 0,0,0,0 BUF: .BLKW 4 NAREA: .WORD 0 COUNT: .WORD 0 AREATB: .WORD 0 VMCOLL: .WORD 0 VMLINK: .WORD 0 ; -----------------INTEGER TO ASCII CONVERSION------------ .SBTTL CONVER FORMAT=8. ;If defined gives number format ; Integer to ASCII conversion(decimal): R0=value, R3=outp. string pointer ; R1,R2,R4,R5 unaffected! CNV104: MOV (R4)+,R0 ;Get next one from R4 pointer. CNV10: MOV #FORMAT,FORM MOV R4,-(SP) ;CONVERT to DECIMAL MOV R1,-(SP) .IIF DF FORMAT,CLR R4 CALL CONVRT MOV (SP)+,R1 MOV (SP)+,R4 RETURN CONVRT: MOV R0,R1 CLR R0 DIV #10.,R0 MOV R1,-(SP) .IIF DF FORMAT,INC R4 TST R0 BEQ 1$ CALL CONVRT 1$: .IF DF FORMAT NEG R4 BEQ 30$ DEC R4 ADD FORM,R4 BLE 20$ 10$: MOVB #' ,(R3)+ SOB R4,10$ 20$: MOVB #' ,(R3)+ 30$: .ENDC ; FORMAT MOVB (SP)+,@R3 BISB #'0,(R3)+ RETURN FORM: .WORD 0 ERROR: .PRINT #FERR .PRINT (R5)+ .EXIT ; RAD50 to ASCII conversion routine ; R0 = RAD50 characters INPUT ; R1 > OUTPUT BUFFER ; R2 is USED as a SCRATCH register ; R50ASC: CALL DIV50 ; DIVIDE BY 50(8) MOV R2,-(SP) ; SAVE THIRD CHARACTER CALL DIV50 ; AGAIN MOV R2,-(SP) ; AND SAVE SECOND CHARACTER CALL DIV50 ; ONCE MORE CALL 10$ ; CONVERT TO ALPHA AND OUTPUT MOV (SP)+,R2 ; REMEMBER SECOND CALL 10$ ; AND OUTPUT MOV (SP)+,R2 ; REMEMBER THIRD ; AND FALL THROUGH 10$: TST R2 ; SPACE ? BEQ 20$ ADD #40,R2 ; NO - ADD OFFSET FOR A-Z CMP R2,#72 ; ALPHA ? BLE 20$ SUB #56,R2 ; NO - OFFSET TO NUMERIC CMP R2,#16 ; NUMERIC, *, OR % ? BGE 20$ CLR R2 ; NO - FORCE TO BLANK 20$: ADD #40,R2 ; FINISH TRANSLATION MOVB R2,(R1)+ ; AND OUTPUT RETURN ; ; DIV50 ROUTINE - DUMB SUBTRACT-AND-INCREMENT, BUT WHO CARES ; DIV50: MOV R0,R2 CLR R0 1$: SUB #50,R2 BCS 2$ INC R0 BR 1$ 2$: ADD #50,R2 RETURN .END CSHOW .TITLE CSHOW ; FILE: CHSH6x.MAC ;+ ; Program accesses CH handler to show CACHE setup and print counters ; Upd. due to .DRBEG change with RT-11 V5.3: aug-86 ; ; H.H. NKG-AZG ; ; Device identifier of physical VM: is assumed to be 47: ;- VMIDEN = 47 ;Prog. Ref. Man. 1983, p.2-38 VARSZ$ = 400 RMON = 54 SYSVER = 276 ;Current RT-11 version offset ; .MCALL .EXIT,.DSTAT,.PRINT,.LOOKUP,.SPFUN,.CLOSE .ENABL LC .PSECT STRING; FERR: .ASCII /?CSHOW-F-/<200> .PSECT CODE .MACRO ERRTST STR,TEST=CC,?LOC .SAVE .PSECT STRING $$$= . .ASCIZ \STR\ .RESTORE B'TEST LOC JSR R5,ERROR .WORD $$$ LOC: .ENDM ERRTST .MACRO PRINT STR .SAVE .PSECT STRING $$$= . .ASCII \STR\<0> .RESTORE MOV (PC)+,R0 .WORD $$$ .PRINT .ENDM PRINT ;-------------------------Program start--------------------------------; CSHOW: CLRB DKTOCH ;Init pointer flags CLRB CHTODK .DSTAT #BUF,#CHSPEC ;GET DEVICE INFORMATION ERRTST CMPB BUF,#VMIDEN ;Check device identifier VM: ERRTST ,NE MOV BUF+4,R3 ;HANDLER ENTRY ADDRESS ERRTST ,NE ; Check whether current system is RT-11 V5.3 or later CLR V53 ;Default < V5.3 MOV @#RMON,R0 ADD #SYSVER,R0 MOV R0,R1 CMPB #5,(R0)+ ;V5 ? BLO 3$ BHI 4$ CMPB #3,(R0)+ ;V5, update 3? BHI 4$ 3$: ADD #2,R3 INC V53 4$: MOVB (R1)+,R0 ADD #'0,R0 MOVB R0,VERSION MOVB (R1)+,R0 ADD #'0,R0 MOVB R0,UPDATE ; Check CH: <=> DISK pointers ;0 = LQE +2=CQE, ADD #10,R3 ; +10=DKCQEA, +12=VMCQEA TST (R3)+ ;Is DKCQEA in CH: pointing? BEQ 5$ INCB CHTODK 5$: TST (R3)+ ;Skip VMCQEA MOV (R3)+,R0 ;Fetch cached disk name MOV R0,DKSPEC MOV #DNAME1,R1 CALL R50ASC MOVB #'n,-1(R1) MOVB #':,(R1) MOVB DNAME1,DNAME2 MOVB DNAME1+1,DNAME2+1 MOVB DNAME1+2,DNAME2+2 MOVB DNAME1+3,DNAME2+3 MOV (R3)+,DISKRO ;Fetch read-only pattern ;Cached device STATUS word/Handler size/Load address/size: .DSTAT #BUF,#DKSPEC ERRTST MOV BUF+4,R5 ERRTST ,NE MOV BUF,DKSTAT MOV BUF+6,DKSIZE ;Initialize size ADD #6,R5 TST V53 ;Check .DRBEG data structure with RT-11 V5.3 BEQ 8$ ADD #2,R5 8$: TST @R5 BEQ 10$ INCB DKTOCH TSTB CHTODK BNE 100$ .PRINT #BADON BR 100$ 10$: .PRINT #COFF TSTB CHTODK BEQ 100$ .PRINT #BADOFF 100$: MOV R3,R4 ;Pointer CHINFO. ADD (R3),R4 ;ADD offset to NAREA MOV (R3)+,R5 ;Save table offset for DISK unit calc. MOV (R3)+,VMCOLL MOV (R3)+,VMLINK MOV R4,AREATB ;Setup area pointer. ; Note V6: NUNIT is dropped and fixed to 8, therefore R5=8. always! ;;;; ASR R5 ;/2 ;;;; ASR R5 ;/4, R2=nr. of disk units ;;;; DEC R5 ;Substract 1 due to VMCOLL/EXIT MOV #8.,R5 MOVB #60,UNIT MOV R3,R4 ;Pointer R4 points to unitno. list ;============== PRINT No. READs & WRITEs for each device unit ==============; ADD #^R 0,DKSPEC ;Change 3rd char from blank to 0 MOVB #200,UNTEND .PRINT #HEAD0 CLR R2 ;Binairy unit counter (UNIT=ASCII!) UNLOOP: MOV #OUTLIN,R3 MOV #1,R0 ASH R2,R0 ; Test mask pattern versus disk ro-pattern MOVB R0,MASK BITB MASK,DISKRO ; Read-only? BNE 1$ TST @R4 ; D'not print units with zero count! BNE 1$ ; (unless.... the unit was read-only) ADD #4,R4 BR NCOUNT 1$: CALL CNV104 CALL CNV104 MOVB #200,@R3 .PRINT #OUTLIN .PRINT #UNTTXT ;Set size again if variable volume: MOV #SIZE,R0 MOVB #' ,(R0)+ MOVB #' ,(R0)+ MOVB #' ,(R0)+ MOVB #' ,(R0)+ BIT #VARSZ$,DKSTAT BEQ SIZEOK CLR DKSIZE MOVB #'V,SIZE .LOOKUP #AREA,#0,#DKSPEC BCC 10$ MOVB #'?,SIZE+2 ;' ?' = LOOKUP error 10$: .SPFUN #AREA,#0,#373,#BUF,#1,#BLK BCC 11$ MOVB #'?,SIZE+1 ;'?' = SPFUN size req. error BR 12$ 11$: MOV BUF,DKSIZE 12$: .CLOSE #0 SIZEOK: MOV #OUTLIN,R3 MOV DKSIZE,R0 CALL CNV10 MOVB #200,@R3 CLRB SIZE+3 BITB MASK,DISKRO ;Read-only? BEQ 1$ MOVB #200,SIZE+3 .PRINT #OUTLIN .PRINT #SIZE .PRINT #NOWRIT BR NCOUNT 1$: .PRINT #OUTLIN .PRINT #SIZE NCOUNT: INCB UNIT INC DKSPEC INC R2 DEC R5 BEQ 1$ JMP UNLOOP 1$: MOV AREATB,R4 ;Fetch nr. area's MOV (R4)+,NAREA BNE 2$ .PRINT #NOCACH .EXIT 2$: CLR COUNT ;======================= PRINT CACHE area STATISTICS =======================; CLRB UNTEND .PRINT #HEAD1 .PRINT #HEAD2 .PRINT #HEAD3 NEXTCH: INC COUNT ;Count the cache area's MOV #OUTLIN,R3 MOV (R4)+,R0 ;Set disk unit nr. BMI EXIT ADD #60,R0 MOVB R0,UNIT CALL CNV104 MOVB #'-,(R3)+ ;Low-High block seperator CALL CNV104 CALL CNV104 TST (R4)+ ;Skip VM block offset. .REPT 4 CALL CNV104 .ENDR MOVB #200,@R3 .PRINT #OUTLIN+3 .PRINT #UNTTXT CMP COUNT,NAREA BLT NEXTCH EXIT: MOV VMCOLL,R0 BNE 1$ TST VMLINK BNE 1$ .EXIT ;====================================; 1$: MOV #OUTLIN,R3 CALL CNV10 MOVB #200,@R3 .PRINT #PVMCOL .PRINT #OUTLIN MOV VMLINK,R0 MOV #OUTLIN,R3 CALL CNV10 MOVB #200,@R3 .PRINT #PVMLNK .PRINT #OUTLIN .PRINT #PVMEND .EXIT ;------------------------- Program DATA --------------------------------; BADON: .ASCIZ / Caching = ON, DANGER: NO link from CH: to disk!/<12> COFF: .ASCIZ / Caching = OFF, no link from disk TO CH:/<12> BADOFF: .ASCIZ / Bad cleanup >>> link from CH: to disk!/<12> UNTTXT: .ASCII % UNIT % UNIT: .BYTE 60,40,40 UNTEND: .BYTE 200 SIZE: .BYTE 0,0,0,0 NOWRIT: .ASCIZ / NoWrite/ NOCACH: .ASCIZ /No data cached!/ ;1234567812345678 HEAD0: .ASCII <12>/ Reads Writes / DNAME1: .ASCII /DISK Size(blocks) CACHE V6.2/<15><12> .ASCII / ----- ------ -/ .ASCII /----- ------------ (RT-11 V/ VERSION:.BYTE '0, '. UPDATE: .BYTE '0, '), 0 ; 1 2 3 4 5 6 ;12345678901234567890123456789012345678901234567890123456789012 ;12345678-123456781234567812345678123456781234567812345678 HEAD1: .BYTE 12 .ASCII /!Block Address Write-Thr! Read Updates Partial Wrt-tmp / DNAME2: .ASCIZ /DISK/ HEAD2: .ASCIZ /! Cache area upto ! Hits Hits Hits/ HEAD3: .ASCIZ /!-----------------------! ---- ------- ------- ------- ----/ PVMCOL: .ASCII <12>% (VM I/O collisions=%<200> PVMLNK: .ASCII % VM linked I/O on exit=%<200> PVMEND: .ASCIZ %)% OUTLIN: .BLKB 60. .EVEN CHTODK: .BYTE 0 DKTOCH: .BYTE 0 DISKRO: .BYTE 0 MASK: .BYTE 0 V53: .WORD 0 CHSPEC: .RAD50 /CH / .WORD 0,0,0 DKSPEC: .RAD50 /RK / ;Set by CSHOW! .WORD 0,0,0 DKSIZE: .WORD 0 DKSTAT: .WORD 0 AREA: .BLKW 4 BLK: .WORD 0,0,0,0 BUF: .BLKW 4 NAREA: .WORD 0 COUNT: .WORD 0 AREATB: .WORD 0 VMCOLL: .WORD 0 VMLINK: .WORD 0 ; -----------------INTEGER TO ASCII CONVERSION------------ .SBTTL CONVER FORMAT=8. ;If defined gives number format ; Integer to ASCII conversion(decimal): R0=value, R3=outp. string pointer ; R1,R2,R4,R5 unaffected! CNV104: MOV (R4)+,R0 ;Get next one from R4 pointer. CNV10: MOV #FORMAT,FORM MOV R4,-(SP) ;CONVERT to DECIMAL MOV R1,-(SP) .IIF DF FORMAT,CLR R4 CALL CONVRT MOV (SP)+,R1 MOV (SP)+,R4 RETURN CONVRT: MOV R0,R1 CLR R0 DIV #10.,R0 MOV R1,-(SP) .IIF DF FORMAT,INC R4 TST R0 BEQ 1$ CALL CONVRT 1$: .IF DF FORMAT NEG R4 BEQ 30$ DEC R4 ADD FORM,R4 BLE 20$ 10$: MOVB #' ,(R3)+ SOB R4,10$ 20$: MOVB #' ,(R3)+ 30$: .ENDC ; FORMAT MOVB (SP)+,@R3 BISB #'0,(R3)+ RETURN FORM: .WORD 0 ERROR: .PRINT #FERR .PRINT (R5)+ .EXIT ; RAD50 to ASCII conversion routine ; R0 = RAD50 characters INPUT ; R1 > OUTPUT BUFFER ; R2 is USED as a SCRATCH register ; R50ASC: CALL DIV50 ; DIVIDE BY 50(8) MOV R2,-(SP) ; SAVE THIRD CHARACTER CALL DIV50 ; AGAIN MOV R2,-(SP) ; AND SAVE SECOND CHARACTER CALL DIV50 ; ONCE MORE CALL 10$ ; CONVERT TO ALPHA AND OUTPUT MOV (SP)+,R2 ; REMEMBER SECOND CALL 10$ ; AND OUTPUT MOV (SP)+,R2 ; REMEMBER THIRD ; AND FALL THROUGH 10$: TST R2 ; SPACE ? BEQ 20$ ADD #40,R2 ; NO - ADD OFFSET FOR A-Z CMP R2,#72 ; ALPHA ? BLE 20$ SUB #56,R2 ; NO - OFFSET TO NUMERIC CMP R2,#16 ; NUMERIC, *, OR % ? BGE 20$ CLR R2 ; NO - FORCE TO BLANK 20$: ADD #40,R2 ; FINISH TRANSLATION MOVB R2,(R1)+ ; AND OUTPUT RETURN ; ; DIV50 ROUTINE - DUMB SUBTRACT-AND-INCREMENT, BUT WHO CARES ; DIV50: MOV R0,R2 CLR R0 1$: SUB #50,R2 BCS 2$ INC R0 BR 1$ 2$: ADD #50,R2 RETURN .END CSHOW TIM$IT= 1 ;1=time-out support NAREA = 0 ;Just monitor disk usage ;MMG$T = 1 ;XM-MONITOR ?CSHOW-F-No Cache HandlerPhysical VM: may not be assigned to CH!Cache handler not LOADedNo Cached deviceCached device not loaded7Q7Lw  ׭`'w Vw C7 ,eХХe @e07@e07e  7f `nɕ:JE@;w \w me xe gb  Nbtr7j0~e0sR t7  ej , (˕'2Е Е Е Е 5/7 V?0 ?~p ˕7MJ 262鈷p & w@78B7 ,7K.鈷 !e07" ӕ-      ˕'-  ˕k ˕ Caching = ON, DANGER: NO link from CH: to disk! Caching = OFF, no link from disk TO CH: Bad cleanup >>> link from CH: to disk! UNIT 0 NoWriteNo data cached! Reads Writes DISK Size(blocks) CACHE V6.2z ----- ------ ------ ------------ (RT-11 V0.0) !Block Address Write-Thr! Read Updates Partial Wrt-tmp DISK! Cache area upto ! Hits Hits Hits!-----------------------! ---- ------- ------- ------- ---- (VM I/O collisions= VM linked I/O on exit=)8rB&f  r f    mӕ ӕ 0@ : 4 .   e :.  e  ( e( .TITLE DECODQ ; H.H. OCT-82 ,Subr. splits up combined Q$FUNC/UNIT/JNUM Q-element ; entry(INPUT) into separate: function code (IFUNC) ; device unit nr(IUNIT) ; job number (JOBNUM) ; Fortran call: CALL DECODQ(INPUT,IFUNC,IUNIT,JOBNUM) ; <----output------> DECODQ::TST (R5)+ MOV @(R5)+,R0 ;Get function code, convert byte->word MOV R0,R1 BIC #177400,R1 MOV R1,@(R5)+ ;Put into output. SWAB R0 ;Swab unit/jobnum to low-byte. MOV R0,R1 BIC #177770,R1 ;Extract unit nr. MOV R1,@(R5)+ ; and into output. ASR R0 ;Shift ASR R0 ; job ASR R0 ; number BIC #177761,R0 ; and cleanup MOV R0,@(R5) ; RETURN .END C C HIST.FOR Readout of file produced by LOGG+LG:, e.g. VM:LOGG.DAT C Produces HISTOGRAM of selected parameter. C H.H. NKG-AZG, V2 JUL-83/SEP-82/ V6 AUG-84 C C Central DATA arrays: IVALUE(..), IHIST(..) C parameter values frequency of values C C DIMENSION IBUF(256),IVALUE(5000),IHIST(5000),IFC(3) INTEGER FILSPC(39), SW(4,8), OUT(5), DVUNIT REAL RTEXT1(6),RTEXT2(3), DEFTYP(2) BYTE FILNAM(20),DATUM(9),TEXT(5,3) DATA TEXT/'R','e','a','d',' ','W','r','i','t','e', 1'A','l','l',2*' '/ DATA RTEXT1/'CSW ','BLOK','XXXX','BUFF','SIZE','CMPL'/ DATA RTEXT2/'FUNC','UNIT','JOBS'/ DATA DEFTYP/6RDATDAT,6RDATDAT/, SW(1,1)/'R'/,SW(1,2)/'W'/ DATA SW(1,3)/'U'/,SW(1,4)/'J'/,SW(1,5)/'O'/,SW(1,6)/'M'/ DATA SW(1,7)/'S'/,SW(1,8)/'T'/ c EQUIVALENCE (OUT(1),FILSPC(1)) c 10 CALL PRINT('HIST log-file> give valid RT-11 file spec!') CALL PRINT('Options: /R = list READS only, [ALL]') CALL PRINT(' /W = list WRITES only') CALL PRINT(' /U:n = device unit no. n [ALL]') CALL PRINT(' /J:n = I/O of job n only, [ALL]') CALL PRINT(' /O:n = print out on LUN n,[7 (TT:)]') CALL PRINT(' /M:n = minimum count n, [1]') CALL PRINT(' /? = Help, print this message') CALL PRINT(' ') CALL PRINT('Select parameter for HISTOGRAM (UPPERCASE=default)>') CALL PRINT('/S:n 1=csw, 2=BLOCKADDR, 3=qaddr, 4=size, 5=cmplt') CALL PRINT('/T:n 1=function code, 2=device unitno., 3=jobno.') c 20 IF (ICSI(FILSPC,DEFTYP,,SW,8).NE.0) GOTO 10 c ISEL =3 ISEL1 =2 ISEL2 =0 LUN =7 JOBNUM = -1 DVUNIT = -1 MINCNT = 1 c /R: IF (SW(2,1).NE.0) ISEL = 1 c /W: IF (SW(2,2).NE.0) ISEL = 2 c /U: IF (SW(2,3).EQ.2) DVUNIT = SW(4,3) c /J: IF (SW(2,4).EQ.2) JOBNUM = SW(4,4) c /O: IF (SW(2,5).EQ.2) LUN = SW(4,5) c /M: IF (SW(2,6).EQ.2) MINCNT = SW(4,6) c /S: IF (SW(2,7).EQ.2) ISEL1 = SW(4,7) c /T: IF (SW(2,8).EQ.2) ISEL2 = SW(4,8) IF (ISEL1.GT.2) ISEL1 = ISEL1+1 !ISEL1 is word entry Q element IF (ISEL2.GT.0) ISEL1 = 3 !ISEL2 is entry job&func&unit no. c CALL R50ASC(12,FILSPC(16),FILNAM) c c Open input file and read the data c --------------------------------- c ICHAN = IGETC() !Input data channel c IFLAG= IFETCH(FILSPC(16)) IF (IFLAG.EQ.0) GOTO 30 CALL ERROR('Input device FETCH error',IFLAG) GOTO 20 30 ISIZE= LOOKUP(ICHAN,FILSPC(16),IPOS) IF (ISIZE.GT.0) GOTO 50 CALL ERROR('Input file LOOKUP error',ISIZE) GOTO 20 c c Read header: c 50 IST=IREADW(256,IBUF,0,ICHAN) IF(IST.NE.256) CALL ERROR('Input READ error',IST) CALL DATE(DATUM) WRITE(LUN,110)DATUM WRITE(LUN,111)ISIZE,(FILNAM(I),I=1,20) WRITE(LUN,112)DVUNIT,JOBNUM,(TEXT(I,ISEL),I=1,5) 110 FORMAT('1***------ LGHIST V6 ------ ',9A1,' ------***') 111 FORMAT(' *** ',I6,' block(s) in LOG file: ',3A1,':',6A1,'.',11A1) 112 FORMAT(' *** Selected: dev-unit',I3,', job',I3,', ',5A1,' IO-s'/) C C List START/END/EXECUTION time: C CALL LGTIME(IBUF,LUN) C C --------------------------- PROCES DATA ----------------------------- C C *********** DO 120 I=1,5000 IVALUE(I)=-1 120 IHIST(I)=0 NRVAL=0 IALL=0 C C Read NEXT DATA words C WRITE(7,140) 140 FORMAT('0Wait... '/) DO 150 IREC=1,ISIZE-1 IST=IREADW(256,IBUF,IREC,ICHAN) IF(IST.NE.256) CALL ERROR('Input READ error',IST) WRITE(7,152)IREC 152 FORMAT('+Reading&processing blockno.',I6) NVAL=IBUF(1) IF (NVAL.EQ.0) NVAL=42 ! = (256-4)/6 NMISS=IBUF(2) LMIS=NMISS-NOLD NOLD=NMISS DO 150 J=1,NVAL IPJ=4+6*(J-1) ICSW = IBUF(IPJ+1) IBLK = IBUF(IPJ+2) IFUNC = IBUF(IPJ+3) IADDR = IBUF(IPJ+4) IWORD = IBUF(IPJ+5) ICMPL = IBUF(IPJ+6) CALL DECODQ(IFUNC,IFC(1),IFC(2),IFC(3)) IF (DVUNIT.NE.IFC(2).AND.DVUNIT.GE.0) GOTO 150 IF (JOBNUM.NE.IFC(3).AND.JOBNUM.GE.0) GOTO 150 IF (ISEL.EQ.1.AND.IWORD.LT.0.OR. & ISEL.EQ.2.AND.IWORD.GE.0) GOTO 150 IALL=IALL+1 IBUF(IPJ+5)=IABS(IWORD) !Give writes also a + wordcount. DO 1000 I=1,5000 IF (ISEL1.NE.3.AND.IVALUE(I).EQ.IBUF(IPJ+ISEL1)) GOTO 1500 IF (ISEL1.EQ.3.AND.IVALUE(I).EQ.IFC(ISEL2)) GOTO 1500 IF (IVALUE(I).EQ.-1) GOTO 1200 !New value found 1000 CONTINUE CALL PRINT('?LGHIST-W-More parameter values than space!') GOTO 150 !CONTINUE 1200 IF (ISEL1.NE.3) IVALUE(I)=IBUF(IPJ+ISEL1) !Set Value IF (ISEL1.EQ.3) IVALUE(I)=IFC(ISEL2) !Set Value NRVAL=NRVAL+1 !Count nr. different values 1500 IHIST(I)=IHIST(I)+1 !Count 150 CONTINUE IF (IALL.LE.0) STOP '?LGHIST-F-No counts made' C CALL ISORT2(IVALUE,IHIST,NRVAL) C C PRINTOUT of HISTOGRAM C IF (ISEL1.NE.3) WRITE(LUN,6000)RTEXT1(ISEL1),NRVAL,IALL IF (ISEL1.EQ.3) WRITE(LUN,6000)RTEXT2(ISEL2),NRVAL,IALL 6000 FORMAT('0','Parameter selected: ',1A4,' Nr. values:',I6/ 1,25X,'Total count:',I6// 2' ****** HISTOGRAM of I/O requests ******'/ 3' -------------------------------------------'// 4' Parameter value Count Percentage'/) ALL=FLOAT(IALL)/100. PERCNT = 0. IPRINT = 0 DO 7000 I=1,5000 IF (IVALUE(I).EQ.-1) GOTO 10000 IH=IHIST(I) IF (IH.EQ.0.OR.IH.LT.MINCNT) GOTO 7000 IPRINT = IPRINT+IH PERCNT = PERCNT+FLOAT(IH)/ALL IF (ISEL1.EQ.5) GOTO 7200 !Size? WRITE(LUN,7100)IVALUE(I),IVALUE(I),IH,FLOAT(IH)/ALL 7100 FORMAT(1X,I6,' (',O6,')',3X,I8,6X,F10.1) GOTO 7000 7200 IB=IVALUE(I)/256 !Size in blocks WRITE(LUN,7210)IVALUE(I),IB,IH,FLOAT(IH)/ALL 7210 FORMAT(1X,I6,' (',I5,')',3X,I8,6X,F10.1) 7000 CONTINUE 10000 WRITE(LUN,10010) WRITE(LUN,10011)IPRINT,PERCNT IF (MINCNT.GT.1) WRITE(LUN,10012)MINCNT 10010 FORMAT(' -------------------------------------------') 10011 FORMAT(' Sum',15X,I8,6X,F10.1) 10012 FORMAT(' Counts less than',I4,' omitted!') CALL CLOSEC(ICHAN) CALL IFREEC(ICHAN) STOP 'LGHIST' END c SUBROUTINE ERROR(STRING,ICODE) c BYTE STRING(1) c WRITE(7,10) ICODE,(STRING(I),I=1,LEN(STRING)) 10 FORMAT('0LGHIST-ERROR-Code=',I4,1X,40A1) CALL PRINT('') RETURN END SUBROUTINE ISORT2(IBUF,IBUF2,N) C C Routine sorts ABSOLUTE values of INTEGERS in IBUFS C according to their value. C IBUF2 is rearranged according to rearrangement of IBUFS!! C C N: nr. of values in IBUFS/2 to be sorted. C DIMENSION IBUF(1),IBUF2(1) C NNR=N ISAV=IBUF(1) ISAV2=IBUF2(1) NNR=NNR-1 IF (NNR.LE.0) GOTO 1000 !Nothing to do! C C ISAV = Current largest value to be moved C DO 400 NR=NNR,1,-1 !MAIN LOOP INDEX=2 DO 300 NS=NR,1,-1 !SUB LOOP IF (IABS(ISAV).GE.IABS(IBUF(INDEX))) GOTO 300 C C now exchange values C IS=IBUF(INDEX) IBUF(INDEX)=ISAV ISAV=IS C IS2=IBUF2(INDEX) IBUF2(INDEX)=ISAV2 ISAV2=IS2 300 INDEX=INDEX+1 C C Put the largest value(ISAV) at the and of the sub-array: C INDEX=INDEX-1 IS=IBUF(INDEX) IBUF(INDEX)=ISAV ISAV=IS C IS2=IBUF2(INDEX) IBUF2(INDEX)=ISAV2 ISAV2=IS2 C 400 CONTINUE C 1000 IBUF(1)=ISAV IBUF2(1)=ISAV2 RETURN END .TITLE LG DISK-DATA-logging handler TIM$IT=1 NRQIO= 4 ;MAX. Nr. of disk IO's to be stored locally. NUNIT=-1 ;Set to disk unitnr. to be logged. If negatif all disk units ;are logged. ; H.H. NKG-AZG Version 6.0 NOV-84 (V1 SEP-82) .ENABL LC .MCALL .DRDEF,.MTPS,.PRINT .DRDEF LG,301,RONLY$!WONLY$,0,0,0 .DRSET SHOW,-1,S.SHOW ;;SHOW disks in list .DRSET DISK,20.,S.DISK, ;;Select disk no. ; .SBTTL SET OPTION PROCESSING ROUTINES ;------------------------------------- S.SHOW: MOV PC,R0 ADD #HEAD-.,R0 .PRINT ; Print header info MOV PC,R1 ADD #DSKR50-.,R1 MOV PC,R2 ADD #DSKASC-.,R2 MOVB #' ,DIGITH MOVB #'0,DIGITL ; LOOP: MOV (R2)+,NAME BEQ S.EXIT CLRB MARK CMP (R1)+,DISKNM ; Current selected disk? BNE 1$ MOVB #'<,MARK 1$: MOV PC,R0 ADD #LIST-.,R0 .PRINT INCB DIGITL CMPB DIGITL,#': ; >9 ? BLT LOOP MOVB #'1,DIGITH MOVB #'0,DIGITL BR LOOP S.DISK: CMP R0,R3 BHIS S.ERR ;Not too high! ASL R0 ;*2 MOV PC,R1 ADD #DSKR50-.,R1 ADD R0,R1 MOV @R1,DISKNM S.EXIT: RETURN S.ERR: SEC RETURN ; DSKASC: .ASCII /RK/ ;1 .ASCII /DL/ ;2 .ASCII /DY/ ;3 .ASCII /RF/ ;4 .ASCII /DS/ ;5 .ASCII /DP/ ;6 .ASCII /DX/ ;7 .ASCII /DM/ ;8 .ASCII /DD/ ;9 .ASCII /DR/ ;10 .ASCII /DU/ ;11 .ASCII /DW/ ;12 .ASCII /QN/ ;13 .ASCII /WB/ ;14 .ASCII /DP/ ;15 .ASCII /PD/ ;16 .ASCII /DJ/ ;17 .ASCII /WJ/ ;18 .ASCII /QJ/ ;19 .ASCII /KJ/ ;20 .WORD 0 ; DSKR50: .RAD50 /RK / ;1 .RAD50 /DL / ;2 .RAD50 /DY / ;3 .RAD50 /RF / ;4 .RAD50 /DS / ;5 .RAD50 /DP / ;6 .RAD50 /DX / ;7 .RAD50 /DM / ;8 .RAD50 /DD / ;9 .RAD50 /DR / ;10 .RAD50 /DU / ;11 .RAD50 /DW / ;12 .RAD50 /QN / ;13 .RAD50 /WB / ;14 .RAD50 /DP / ;15 .RAD50 /PD / ;16 .RAD50 /DJ / ;17 .RAD50 /WJ / ;18 .RAD50 /QJ / ;19 .RAD50 /KJ / ;20 ; LIST: .BYTE 40,40 DIGITH: .BYTE 0 DIGITL: .BYTE 0 .ASCII /. = / NAME: .WORD 0 .BYTE 40 MARK: .ASCIZ / selected!/ HEAD: .ASCIZ \I/O Handler V6\ .EVEN .IIF LE,NRQIO NRQIO=1 ;---------------------------Handler Begin----------------------------; .SBTTL Driver entry Offsets: TOTAL = 0 ;Total nr. IO-requests TMISS = 2 ;Total nr. IO-missed, due to FULL IO-list! TOTRD = 4 ;Total nr. of reads TOTWT = 6 ;Total nr. of writes TOTSPF= 10 ;Total nr. of special function requests TOTSPD= 12 ; nr. of special directory requests .DRBEG LG ;0=LQE, 2=CQE BR GOLOGG ;+4 DKCQE: .WORD 0 ;Contains pointer to curr. Q-elem. disk! +6 DISKNM: .RAD50 /RK / ;Initialize logged disk name ;----------------------- Storage tables --------------------------; LGINFO: ;This way anyone may find counts. .WORD 0 ; Total nr. of IO's .WORD 0 ;+2 Total nr. of IO's missed .WORD 0 ;+4 Total nr. of reads .WORD 0 ;+6 Total nr. of writes .WORD 0 ;+10 Total nr. of special function requests .WORD 0 ;+12 " nr. of special directory requests NRQCNT: .WORD 0 ;Nr. of Q-elements stored in QLIST. QLIST: ;Copy of Q-elements .REPT 10.*NRQIO .WORD 0 .ENDR ;----------------------- Handler body ----------------------------; GOLOGG: MOV @DKCQE,R4 ;Get Q-element pointer DK: .IF GE,NUNIT MOVB Q$UNIT(R4),R0 BIC #^C7,R0 CMP R0,#NUNIT ;Is it a valid unit? BEQ UNITOK RETURN UNITOK: .ENDC ;NUNIT MOV PC,R5 ADD #LGINFO-.,R5 ;Set up table pointer. INC TOTAL(R5) TSTB Q$FUNC(R4) ;Special function request. BEQ NOSPF ;If so, notifie. BPL SPDIR INC TOTSPF(R5) BR DSKRET SPDIR: INC TOTSPD(R5) BR DSKRET NOSPF: TST Q$WCNT(R4) ;Read or Write? BMI 1$ INC TOTRD(R5) BR DSKRET 1$: INC TOTWT(R5) DSKRET: CMP NRQCNT,#NRQIO ;Q-LIST FULL? BLT OK INC TMISS(R5) BR RET ;Wait until LOGG-job frees Q-LIST. OK: ADD #16,R5 ;Save Q-element, point to QLIST MOV NRQCNT,R0 ASL R0 ;*2 MOV R0,R1 ASL R0 ;*4 ASL R0 ;*8 ADD R1,R0 ;*10. ASL R0 ;*20., offset in bytes! ADD R0,R5 ;R5 points to free Q-element space. CMP -(R4),-(R4) ;Point to begin of Q-element MOV (R4)+,(R5)+ ;Q$LINK MOV @(R4)+,(R5)+ ;@Q$CSW MOV (R4)+,(R5)+ ;Q$BLKN MOV (R4)+,(R5)+ ;Q$JNUM Q$UNIT Q$FUNC MOV (R4)+,(R5)+ ;Q$BUFF MOV (R4)+,(R5)+ ;Q$WCNT MOV (R4)+,(R5)+ ;Q$COMP INC NRQCNT ;Next free space RET: RETURN LGINT:: RTI ;---------------------------------------------------------------------------; .DREND LG .END .TITLE LGSHOW NR=6. ;NR. of numbers to print .MCALL .PRINT,.EXIT,.DSTAT .ENABL LC .PSECT STRING; FERR: .ASCII /?LGSHOW-F-/<200> .PSECT CODE .MACRO ERRTST STR,TEST=CC,?LOC .SAVE .PSECT STRING $$$= . .ASCIZ \STR\ .RESTORE B'TEST LOC JSR R5,ERROR .WORD $$$ LOC: .ENDM ERRTST ;-------------------------Progam start--------------------------------; LGSHOW: .DSTAT #BUF,#LGSPEC ;GET DEVICE INFORMATION ERRTST MOV BUF+4,R4 ;HANDLER ENTRY ADDRESS ERRTST ,NE ;0 = LQE +2=CQE, ADD #6.,R4 ;+4=BR GOLOG +8.=RAD50 +10.=LG-table. TST (R4)+ ;Is DKCQE in LG: pointing? ERRTST ,NE MOV (R4)+,R0 ;Fetch cached disk name MOV #NAME,R1 CALL R50ASC .PRINT #HEAD MOV #TEXT,R5 MOV #NR,R2 MOV #OUTP,R1 LOOP: MOV (R4)+,R0 ;R4 = Pointer to LGINFO. MOV R1,R3 ;+ CALL CNV10 ; Routine converts bits to decimal ASCII string. ; R0; Contains bits to be converted ; R3; Points to output area ; Size of area should be nr. digits plus two ; On return R3 points to string terminator ; Note: Contens of R0, R3 is changed!! CNV10:: MOV R1,-(SP) CALL CONVRT MOVB #' ,(R3)+ MOVB #200,@R3 MOV (SP)+,R1 ;- End CNV10 .PRINT R5 .PRINT R1 ADD #11.,R5 ;Point to next string(each 11. char). SOB R2,LOOP .PRINT #END .EXIT ;------------------------- Progam End --------------------------------; HEAD: .ASCII <15><12>/* ------- LG: Info ------- */<15><12> .ASCII \* I/O's from device \ NAME: .BYTE 0,0,0 .ASCIZ \: *\ END: .ASCIZ <15><12><12>/* ------------------------ */ TEXT: .ASCII <15><12><40>/Total =/<200> .ASCII <11><40><10>/Missed=/<200> .ASCII <15><12><40>/Reads =/<200> .ASCII <11><40><10>/Writes=/<200> .ASCII <15><12><40>/SPFUNs=/<200> .ASCII <11><40><10>/SPDIRs=/<200> OUTP: .BLKB 10. .EVEN LGSPEC: .RAD50 /LG / BUF: .BLKW 4 ;------------------------- Subroutines -----------------------------; ;+ CONVRT CONVRT: MOV R0,R1 CLR R0 DIV #10.,R0 MOV R1,-(SP) TST R0 BEQ DONE CALL CONVRT DONE: MOVB (SP)+,@R3 BISB #'0,(R3)+ RETURN ;- End CONVRT ERROR: .PRINT #FERR .PRINT (R5)+ .EXIT ; RAD50 to ASCII conversion routine ; R0 = RAD50 characters INPUT ; R1 > OUTPUT BUFFER ; R2 is USED as a SCRATCH register ; R50ASC: CALL DIV50 ; DIVIDE BY 50(8) MOV R2,-(SP) ; SAVE THIRD CHARACTER CALL DIV50 ; AGAIN MOV R2,-(SP) ; AND SAVE SECOND CHARACTER CALL DIV50 ; ONCE MORE CALL 10$ ; CONVERT TO ALPHA AND OUTPUT MOV (SP)+,R2 ; REMEMBER SECOND CALL 10$ ; AND OUTPUT MOV (SP)+,R2 ; REMEMBER THIRD ; AND FALL THROUGH 10$: TST R2 ; SPACE ? BEQ 20$ ADD #40,R2 ; NO - ADD OFFSET FOR A-Z CMP R2,#72 ; ALPHA ? BLE 20$ SUB #56,R2 ; NO - OFFSET TO NUMERIC CMP R2,#16 ; NUMERIC, *, OR % ? BGE 20$ CLR R2 ; NO - FORCE TO BLANK 20$: ADD #40,R2 ; FINISH TRANSLATION MOVB R2,(R1)+ ; AND OUTPUT RETURN ; ; DIV50 ROUTINE - DUMB SUBTRACT-AND-INCREMENT, BUT WHO CARES ; DIV50: MOV R0,R2 CLR R0 1$: SUB #50,R2 BCS 2$ INC R0 BR 1$ 2$: ADD #50,R2 RETURN .END LGSHOW SUBROUTINE LGTIME(IHEAD,LUN) C Used by LGLIST/LGHIST/LGEXAM C CALL LGTIME(IBUF,LUN) , IHEAD = Buffer filled with header of logfile C LUN = Print output LUN C START/END/EXECUTION TIME: C DIMENSION IHEAD(1) CALL CVTTIM(IHEAD(1),IHRSE,IMINE,ISECE,ITICKE) CALL JJCVT(IHEAD(1)) CALL JJCVT(IHEAD(249)) CALL JSUB(IHEAD(1),IHEAD(249),IHEAD(1)) CALL JJCVT(IHEAD(1)) CALL JJCVT(IHEAD(249)) CALL CVTTIM(IHEAD(249),IHRSS,IMINS,ISECS,ITICKS) CALL CVTTIM(IHEAD(1),IHRS,IMIN,ISEC,ITICK) WRITE(LUN,101)IHRSE,IMINE,ISECE,ITICKE WRITE(LUN,102)IHRSS,IMINS,ISECS,ITICKS WRITE(LUN,103)IHRS,IMIN,ISEC,ITICK 101 FORMAT(' Current time (H-M-S-T):',4I3) 102 FORMAT(' Start time (H-M-S-T):',4I3) 103 FORMAT(' -----------------------------------' 1/' Execution (H-M-S-T):',4I3/) RETURN END C C LIST.FOR Readout of file produced by LOGG+LG: (VM:LOGG.DAT) C H.H. NKG-AZG, V6 aug-84 C DIMENSION IUNIT(8),JOBS(8), IBUF(256), ISELIO(4) INTEGER FILSPC(39), SW(4,7), OUT(5), DVUNIT REAL DEFTYP(2) BYTE DATUM(9),TEXT(5,3),FILNAM(20) DATA TEXT/'R','e','a','d',' ','W','r','i','t','e', 1'A','l','l',2*' '/ DATA DEFTYP/6RDATDAT,6RDATDAT/, SW(1,1)/'R'/,SW(1,2)/'W'/ DATA SW(1,3)/'U'/,SW(1,4)/'J'/,SW(1,5)/'O'/ DATA SW(1,6)/'L'/,SW(1,7)/'H'/ c EQUIVALENCE (OUT(1),FILSPC(1)) c CALL PRINT('DATA FILE (type /? for HELP)>') GOTO 20 10 CALL PRINT('Input valid RT-11 filespec. for DATA FILE!') CALL PRINT('Options: /R = list READS only, default ALL I/Os') CALL PRINT(' /W = list WRITES only') CALL PRINT(' /U:n = device unit no. n only, default ALL') CALL PRINT(' /J:n = I/O of job n only, default ALL') CALL PRINT(' /O:n = print out on LUN n, default 7 (TT:)') CALL PRINT(' /L:n = Low block limit for printout') CALL PRINT(' /H:n = High block limit for printout') CALL PRINT(' /? = Help, prints this message') c 20 IF (ICSI(FILSPC,DEFTYP,,SW,7).NE.0) GOTO 10 c ISEL = 3 LUN = 7 JOBNUM = -1 DVUNIT = -1 IBLOW = 0 IBHIGH = 0 c /R: IF (SW(2,1).NE.0) ISEL = 1 c /W: IF (SW(2,2).NE.0) ISEL = 2 c /U: IF (SW(2,3).EQ.2) DVUNIT = SW(4,3) c /J: IF (SW(2,4).EQ.2) JOBNUM = SW(4,4) c /O: IF (SW(2,5).EQ.2) LUN = SW(4,5) c /L: IF (SW(2,6).EQ.2) IBLOW = SW(4,6) c /H: IF (SW(2,7).EQ.2) IBHIGH = SW(4,7) c CALL R50ASC(12,FILSPC(16),FILNAM) c c Open input file and read the data c --------------------------------- c ICHAN = IGETC() !Input data channel c IFLAG= IFETCH(FILSPC(16)) IF (IFLAG.EQ.0) GOTO 30 CALL ERROR('Input device FETCH error',IFLAG) GOTO 20 30 ISIZE= LOOKUP(ICHAN,FILSPC(16),IPOS) IF (ISIZE.GT.0) GOTO 50 CALL ERROR('Input file LOOKUP error',ISIZE) GOTO 20 c c Read header: c 50 IST=IREADW(256,IBUF,0,ICHAN) IF(IST.NE.256) CALL ERROR('Input READ error',IST) CALL DATE(DATUM) WRITE(LUN,110)DATUM WRITE(LUN,111)ISIZE,(FILNAM(I),I=1,20) WRITE(LUN,112)DVUNIT,JOBNUM,(TEXT(I,ISEL),I=1,5) 110 FORMAT(' ***------ LGLIST V6 ------ ',9A1,' ------***'/) 111 FORMAT(' *** ',I5,' block(s) in LOG file: ',3A1,':',6A1,'.',11A1) 112 FORMAT(' *** Selected: dev-unit',I3,', job',I3,', ',5A1,' IO-s'/) C C List START/END/EXECUTION time: C CALL LGTIME(IBUF,LUN) C C --------------------------- PROCES DATA ----------------------------- C C *********** IALL = 0 ISFCNT= 0 IRDCNT= 0 IWTCNT= 0 IUNCNT= 0 !NR. OF DIFFERENT DEVICE UNITS JOBCNT= 0 !NR. OF DIFFERENT JOBS DO 1140 I=1,8 IF (I.LE.4) ISELIO(I)=0 IUNIT(I) =-1 1140 JOBS(I) =-1 WRITE(LUN,140) 140 FORMAT(' Nr.IO/Missed CSW(Oct) FUNC UNIT JOB(Oct) Words 1 Block Buffer- CMPLT address'/) NOLD=0 C C Read NEXT DATA words C DO 150 IREC=1,ISIZE-1 IST=IREADW(256,IBUF,IREC,ICHAN) IF(IST.NE.256) CALL ERROR('Input READ error',IST) NVAL=IBUF(1) IF (NVAL.EQ.0) NVAL=42 ! = (256-4)/6 NMISS=IBUF(2) LMIS=NMISS-NOLD NOLD=NMISS DO 150 J=1,NVAL ICSW = IBUF(4+6*(J-1)+1) IBLK = IBUF(4+6*(J-1)+2) IFUNC = IBUF(4+6*(J-1)+3) IADDR = IBUF(4+6*(J-1)+4) IWORD = IBUF(4+6*(J-1)+5) ICMPL = IBUF(4+6*(J-1)+6) CALL DECODQ(IFUNC,IF,IU,JB) C------------------------ MAKEUP SUMMARY ------------------------C DO 1152 I=1,8 IF (IUNIT(I).EQ.IU) GOTO 1158 !OK Unit already there. IF (IUNIT(I).EQ.-1) GOTO 1154 !New unit, store it. 1152 CONTINUE 1154 IUNIT(I)=IU IUNCNT=IUNCNT+1 1158 CONTINUE DO 1162 I=1,8 IF (JOBS(I).EQ.JB) GOTO 1168 !OK JOB number already there. IF (JOBS(I).EQ.-1) GOTO 1164 !New JOB number, store it. 1162 CONTINUE 1164 JOBS(I)=JB JOBCNT=JOBCNT+1 1168 CONTINUE C IALL=IALL+1 IF (IF.NE.0) ISFCNT=ISFCNT+1 IF (IWORD.GE.0) IRDCNT=IRDCNT+1 IF (IWORD.LT.0) IWTCNT=IWTCNT+1 C---------------------------- Make selection -----------------------------C IF (IBLK.LT.IBLOW) GOTO 150 IF (IBHIGH.NE.0.AND.IBLK.GT.IBHIGH) GOTO 150 IF (DVUNIT.NE.IU.AND.DVUNIT.GE.0) GOTO 150 IF (JOBNUM.NE.JB.AND.JOBNUM.GE.0) GOTO 150 IF (ISEL.EQ.1.AND.IWORD.LT.0.OR. & ISEL.EQ.2.AND.IWORD.GE.0) GOTO 150 ISELIO(1) = ISELIO(1)+1 IF (IF.NE.0) ISELIO(2)=ISELIO(2)+1 IF (IWORD.GE.0) ISELIO(3)=ISELIO(3)+1 IF (IWORD.LT.0) ISELIO(4)=ISELIO(4)+1 C------------------------------ Output data ------------------------------C IF (J.EQ.1) WRITE(LUN,141) WRITE(LUN,142)(IREC-1)*42+J,LMIS,ICSW,IF,IU,JB,IWORD,IBLK,IADDR,ICMPL 141 FORMAT(1X,'*') 142 FORMAT(1X,2I5,': ',O7,2I5,O7,3X,2I7,1X,2O7) 150 CONTINUE C C----------------------- Print Summary of input data -----------------------C WRITE(LUN,2140) WRITE(LUN,2141)IALL,ISFCNT,IRDCNT,IWTCNT WRITE(LUN,2142)(ISELIO(I),I=1,4) WRITE(LUN,2143)IUNCNT,(IUNIT(I),I=1,IUNCNT) WRITE(LUN,2144)JOBCNT,(JOBS(I),I=1,JOBCNT) WRITE(LUN,2145) 2140 FORMAT('0',21('-'),' Summary of input data ',20('-')/) 2141 FORMAT(' Nr. IO-s:',I6,' SPFUN/SPDIR-s, READs, WRITEs:',3I6) 2142 FORMAT(' Selected:',I6,' SPFUN/SPDIR-s, READs, WRITEs:',3I6/) 2143 FORMAT(' Nr. Device units:',I4,' Unitnrs. : ',8I6/) 2144 FORMAT(' Nr. JOB-s :',I4,' JOBs(Oct): ',8O6/) 2145 FORMAT(1X,64('-')/) CALL CLOSEC(ICHAN) CALL IFREEC(ICHAN) STOP 'LGLIST' END c SUBROUTINE ERROR(STRING,ICODE) c BYTE STRING(1) c WRITE(7,10) ICODE,(STRING(I),I=1,LEN(STRING)) 10 FORMAT('0LGLIST-ERROR-Code=',I4,1X,40A1) CALL PRINT('') RETURN END .TITLE LOGG ;DISK-USAGE-LOGGER, uses handler LG: .MCALL .TWAIT,.EXIT,.ENTER,.LOOKUP,.PRINT,.QSET,.MTPS,.SCCA .MCALL .READW,.READC,.WRITW,.GTIM,.CLOSE,.DSTAT,.SERR .ENABL LC NRQIO =4 ;Nr. of space for Q-elements in LG: handler (see LG source!). NTICK =1 ;Nr. of clock ticks for interval to schedule LG: FILSIZ =0 ;Size LOG-file. ; FILSIZ = 0 -> 1/2 largest empty entry OR entire 2nd largest ; entry, whichever is larger. ; =-1 -> largest empty entry ; = m -> reserve m blocks ; LOGG.MAC IO request logging, storage in file VM:LOGG.DAT ; H.H. NKG-AZG V6 NOV-84 (V1 SEP 82) .IIF LE,NRQIO NRQIO=1 ; Data stored in LOG-file: ! BUFFER(256. w)format: ; ------------------------ ! Nr. values ; @CSW <=I ! Nr. missed ; BLOCKADDRESS <=II ! I ; SPFUN + Unit + Job nr. <=III ! II ; BUFADR <=IV ! III ; WRDCNT <=V ! IV ; CMPADR <=VI ! V ; ! VI etc. ; Q-Element layout: Offset: ; ---------------- Q$LINK ------ -4 / 0 ; Q$CSW -2 / 2 ; Q-Element pointer => Q$BLKN 0 / 4 ; Q$JNUM Q$UNIT Q$FUNC 2 / 6 ; Q$BUFF 4 /10 ; Q$WCNT 6 /12 ; Q$COMP 10/14 ; Logged are word @2,4,6,10,12,14 ; First word in each packet indicates nr. 6-word packets(=1 IO) in block. .PSECT STRING; FERR: .ASCII /?LOGG-F-/<200> .PSECT CODE .MACRO ERRTST STR,TEST=CC,?LOC .SAVE .PSECT STRING $$$= . .ASCIZ \STR\ .RESTORE B'TEST LOC JSR R5,ERROR .WORD $$$ LOC: .ENDM ERRTST .PSECT INILOG START: BUFFER:: ;------------------ Open channels on device -----------------------; GETFIL: .ENTER #AREA,#0,#FILE,#FILSIZ ;CH# 0 = VM:LOGG.DAT ERRTST .SERR ;TRAP VARIOUS DEVICE ERRORS .SCCA #AREA,#FLAG .DSTAT #LGSTAT,#LGSPEC ;GET LG DEVICE INFORMATION ERRTST MOV LGSTAT+4,R3 ;HANDLER ENTRY ADDRESS MOV R3,R1 ERRTST ,NE ADD #4,R1 ;Points +4 =BR GOLOGG(+2=CQE, ADD #6,R3 ;+6=DKCQE (DK-Q-Pointer) TST @R3 ERRTST ,EQ MOV 2(R3),DKSPEC .DSTAT #DKSTAT,#DKSPEC ;Get disk information. ERRTST MOV DKSTAT+4,R2 ERRTST ,NE ADD #6,R2 ;Points to Cache loc. in disk-H. MOV #CHMACR,R0 ;Check if CACHE Macro present in disk. CMP (R0),-2(R2) BNE NOMACR CMP 4(R0),2(R2) BNE NOMACR CMP 6(R0),4(R2) NOMACR: ERRTST ,EQ TST @R2 ERRTST ,EQ MOV DKSTAT+4,(R3) ;Handler entry address, store in LG: ADD #2,(R3)+ ;Point to CQE of DISK. TST (R3)+ ;Skip RAD50 name MOV R3,LGPNTR ;Points to LG: info table. CLR MISSED ;SET 0 CLR #BUFFER+4 ;Cleanup unused CLR #BUFFER+6 ; areas .GTIM #AREA,#TSTART ;Get current time. .WRITW #AREA,#0,#BUFFER,#256.,#0 ;Write header block. BCS 3$ MOV R1,@R2 ;Enable disk logging. JMP RUN ;------------------- 3$: JMP IOERR ; -----------------------------------------------; ERROR: .PRINT #FERR .PRINT (R5)+ .EXIT ; -----------------------------------------------; CHMACR: TST (PC)+ ;Data set CACHE macro in disk-handler CACH: .WORD 0 BEQ CHEND CALL @CACH CHEND: ; -----------------------------------------------; FILE: .RAD50 /VM LOGG DAT/ ;LOG-FILE: ; ------ Up to here, code may not exceed 496 bytes ------ .=BUFFER+496. ;Set near end of buffer area. TSTART: .WORD 0,0 ;Start time LOGG .WORD 0,0,0,0,0 ;RESERVED!! BUFEND: .WORD 0 .REPT 10.* ;Room for running out of buffer!! .WORD 0 .ENDR ;--------------End of initializing code and buffer area-----------------; .PSECT RUNLOG ; ** R1 = Points to Q-element DATA in LG: ; ** R2 = Nr. of IO's in local buffer (set to 0 when buffer full) ; ** R3 = Points to free space in buffer ; ** R4 = Block address in file RUN:: CLR R4 ;Set block nr. MOV #BUFFER+10,R3 ;Pointer to values.(1st 4 w. reserv.) CLR R2 ;Nr. values. MOV LGPNTR,R1 ;Acces DATA in LG:. NEXTS: ;Wait for next scheduling of LG: .TWAIT #AREA,#TIME TST FLAG ;Can we go on? BEQ 1$ MOV R2,BUFFER BEQ EXIT BR WRTBUF 1$: TST 14(R1) ;Something in IO-list? BEQ NEXTS MOV 2(R1),MISSED ;Get total missed. ADD #14,R1 ;Skip count table(+14) ;-----------------------------------------------------------------------; .MTPS #340 ;Do NOT disturb Q-copy!! MOV (R1),R0 ;LG: NRQCNT CLR (R1)+ ;LG: NRQCNT=0, QLIST is free TST (R1)+ ;Skip Q$LINK ADD R0,R2 ;Count the IO's QCOPY: .REPT 6 ;Copy Q-element values MOV (R1)+,(R3)+ ;@Q$CSW,Q$BLKN,Q$FUNC/UNIT/JNUM etc. .ENDR ADD #8.,R1 ;Point to next Q-element, skip SOB R0,QCOPY ;the 3 free words + Q$LINK .MTPS #0 ;-----------------------------------------------------------------------; MOV LGPNTR,R1 ;Setup R1 again as pointer. CMP R3,#BUFEND BLO NEXTS CLR BUFFER ;Say BUFFER FULL WRTBUF: MOV MISSED,BUFFER+2 ;Store cumulative missed INC R4 ;Next block. .WRITW #AREA,#0,#BUFFER,#256.,R4 BCS IOERR MOV #BUFEND+2,R0 MOV R3,R5 MOV #BUFFER+10,R3 SUB #<256.-4>/6,R2 1$: CMP R0,R5 BHIS 2$ MOV (R0)+,(R3)+ BR 1$ 2$: TST FLAG ;Can we go on? BEQ NEXTS EXIT: .READW #AREA,#0,#BUFFER,#256.,#0 .GTIM #AREA,#BUFFER ;Store END time. .WRITW #AREA,#0,#BUFFER,#256.,#0 EXITLG: .CLOSE #0 ;Close LOG-FILE. MOV DKSTAT+4,R2 ADD #6,R2 ;Points to Cache loc. in disk-H. CLR @R2 ;Disable disk driver LOGGING 1st. ; -------------------------------- MOV LGSTAT+4,R3 ;HANDLER ENTRY ADDRESS ;0 = LQE +2=CQE, ADD #6,R3 ;+4=BR GOLOG +6=DKCQE +8.=LG-table. CLR (R3)+ ;Clear disk pointer (DKCQE). .EXIT IOERR: .PRINT #HRDERR BR EXITLG ;--------------------------- Storage ------------------------------; AREA: .BLKW 5 TIME: .WORD 0,NTICK ;Look every 20.*NTICK ms. LGPNTR: .WORD 0 LGSTAT: .BLKW 4 DKSTAT: .BLKW 4 MISSED: .WORD 0 ; ------------------------------- LGSPEC: .RAD50 /LG / DKSPEC: .RAD50 /RK / ;DISK DRIVER SPEC!! .WORD 0 FLAG: .WORD 0 HRDERR: .ASCIZ /?LOGG-F-IO err/ .EVEN .END START RT-11 DEVICE IO LOGGING & DISPLAY (Version 12-NOV-84 NKGAZG) Page ********************************** * DEVICE IO LOGGING & DISPLAY * * * * MANUAL * ********************************** Contents: --------- 1. INTRODUCTION 2. CONTENTS OF THE DISTRIBUTION PACKAGE 3. PREPARING DEVICE IO LOGGING & DISPLAY 4. USING DEVICE IO LOGGING & DISPLAY Appendix A. LIST printout example Appendix B. HIST printout example Appendix C. Building the programs from source 1. Introduction. ---------------- This manual is a guide for installing and using the DEVICE IO LOGGING package as developped at the University Hospital Groningen and concept and implementation is described in full detail in: "DISK USAGE ANALYSIS and DISK DATA CACHING under RT-11" DECUS Europe Proceedings, Zuerich 1983. Besides IO logging, also a separate package provides transparent DISK DATA CACHING under RT-11. This package is only available directly from the address at the end of this manual. A major later addition to the package is the SHOWIO program which prints the I/O's entering the handler directly on the terminal. 2. Contents of the distribution package. ----------------------------------------- $ LG .SYS Pseudo handler for assisting logging&display. LOGG .REL Foreground/system job. Copies IO info form LG: to log-file(on VM:) LGSHOW.REL LGSHOW utility program for printout of number and type of IO's logged. SHOWIO.REL SHOWIO foreground/system job for real-time printout of device I/O requests(uses also LG:). LGLIST.SAV Printout of logged and selected IO's. LGHIST.SAV Printout of histogram of selected IO's. LOGG .DOC MANUAL UPD .SAV Utility update disk handler source for logging CHMACR.MAC Cache MACRO. Establishes the link with the device to be logged. LG60 .MAC LG handler source 3. Preparing device IO logging & display ----------------------------------------- $ ********** * STEP 1 * ********** Thirst of all the CACHE MACRO is inserted in the device handler to be logged. This is simply done by running UPD and specifying the two letter filename of the device's source (e.g. RK.MAC): RU UPD *RK [Return] UPD then creates a new updated source file with extension .SRC You can prepare several device handlers if you want those devices to have potentially available for logging. The MACRO only occupies 3 words in the handler and performs no function when logging is not on. What is done by UPD? The CACHE MACRO is inserted directly after the .DRBEG MACRO in the handler source. Refer to the following example for the device RK: Existing code(example): After INSERT CACHE: ----------------------- ------------------- . . .SBTTL DRIVER ENTRY .SBTTL DRIVER ENTRY .DRBEG RK .DRBEG RK CACHE MOV #RKCNT,(PC)+ MOV #RKCNT,(PC)+ . . $ ********** * STEP 2 * ********** Now build the handler and copy to the system device: REM RK MAC/OBJ:RK SYSGEN.CND+CHMACR+RK.SRC (SYCND+CHMACR+RK.SRC, for RT-11 V4) LINK/EXE:RK.SYS RK COPY/SYS RK.SYS SY: INST RK Do the same for the LG handler if you cannot use the distributed LG.SYS (Has no device time-out support or XM!): MAC/OBJ:LG SYSGEN.CND+LG60 (SYCND+LG60, for RT-11 V4) LINK/EXE:LG.SYS LG COPY/SYS LG.SYS SY: INST LG If you have'nt installed VM:, then do it now: INST VM INIT VM: $ ********** * STEP 3 * ********** Type SET LG SHOW [RETURN] in order to see which device is selected by LG: for intercepting the I/O's. If you wish to make another device selection, then remember the device number in the list and type: UNLOAD LG SET LG DISK="device number in list" 4. Using DEVICE IO LOGGING --------------------------- Follow the next steps: - Load the device handler to be logged. This handler should be provided with the CACHE macro(see preparing caching) - LOAD LG: If you want to logg I/O's then: - LOAD VM: - FRUN LOGG or SRUN LOGG (logging starts) - Run LGSHOW to see how many I/O's have been logged. else (display I/O's): - FRUN SHOWIO or SRUN SHOWIO If enough I/O's have been logged or when you want to stop SHOWIO type: ^X LOGG (or SHOWIO) ^C^C UNLOAD LOGG (or SHOWIO) Copy the VM log-file (VM:LOGG.DAT) to disk for backup and perform the analysis using LGLIST and LGHIST. $ Report all problems/suggestions, well documented, to: H. Haenen Dept. Clinical Neurology AZG P.O. Box 30.001 9700 RB GRONINGEN / HOLLAND (Tel. 050-612689 / 612497, Telex 53942) (Tel. International +3150-612689 or +3150-612497) Appendix A ---------- ***------ LGLIST V6 ------ 10-NOV-84 ------*** *** 52 block(s) in LOG file: DK :LOGG .DAT *** Selected: dev-unit 1, job -1, All IO-s Current time (H-M-S-T): 10 38 47 5 Start time (H-M-S-T): 9 42 38 19 ----------------------------------- Execution (H-M-S-T): 0 56 8 36 Nr.IO/Missed CSW(Oct) FUNC UNIT JOB(Oct) Words Block Buffer- CMPLT address 719 0: 100402 0 1 0 512 6 102060 0 720 0: 101002 0 1 0 512 8 102060 0 721 0: 101402 0 1 0 512 10 102060 0 722 0: 101402 0 1 0 256 2335 40062 0 725 0: 101402 0 1 0 256 2336 40062 0 726 0: 101402 0 1 0 256 2337 40062 0 868 0: 100402 0 1 14 256 6 127770 0 869 0: 100402 0 1 14 256 7 127770 0 870 0: 100402 0 1 14 256 8 127770 0 871 0: 100402 0 1 14 256 9 127770 0 872 0: 100402 0 1 14 256 10 127770 0 873 0: 100402 0 1 14 256 11 127770 0 874 0: 100402 0 1 14 -256 10 127770 0 875 0: 100402 0 1 14 -256 11 127770 0 876 0: 100402 0 1 14 -256 2694 127770 0 877 0: 100402 0 1 14 256 6 127770 0 878 0: 100402 0 1 14 256 7 127770 0 879 0: 100402 0 1 14 256 8 127770 0 880 0: 100402 0 1 14 256 9 127770 0 881 0: 100402 0 1 14 256 10 127770 0 882 0: 100402 0 1 14 256 11 127770 0 * 883 0: 100402 0 1 14 -256 10 127770 0 884 0: 100402 0 1 14 -256 11 127770 0 885 0: 100402 0 1 14 256 6 127770 0 886 0: 100402 0 1 14 256 7 127770 0 887 0: 100402 0 1 14 256 8 127770 0 888 0: 100402 0 1 14 256 9 127770 0 889 0: 100402 0 1 14 256 10 127770 0 890 0: 100402 0 1 14 256 11 127770 0 891 0: 100402 0 1 14 256 6 127770 0 892 0: 100402 0 1 14 256 7 127770 0 893 0: 100402 0 1 14 256 8 127770 0 . . . . . . . . . . . . . . . 1236 0: 101402 0 1 0 256 2694 40062 0 --------------------- Summary of input data -------------------- Nr. IO-s: 2121 SPFUN/SPDIR-s, READs, WRITEs: 0 1925 196 Selected: 57 SPFUN/SPDIR-s, READs, WRITEs: 0 50 7 Nr. Device units: 4 Unitnrs. : 0 2 1 7 Nr. JOB-s : 2 JOBs(Oct): 0 14 ---------------------------------------------------------------- Appendix B ---------- ***------ LGHIST V6 ------ 10-NOV-84 ------*** *** 52 block(s) in LOG file: DK :LOGG .DAT *** Selected: dev-unit 2, job -1, All IO-s Current time (H-M-S-T): 10 38 47 5 Start time (H-M-S-T): 9 42 38 19 ----------------------------------- Execution (H-M-S-T): 0 56 8 36 Parameter selected: BLOK Nr. values: 137 Total count: 1310 ****** HISTOGRAM of I/O requests ****** ------------------------------------------- Parameter value Count Percentage 6 ( 6) 99 7.6 8 ( 10) 93 7.1 10 ( 12) 92 7.0 12 ( 14) 91 6.9 14 ( 16) 94 7.2 16 ( 20) 110 8.4 18 ( 22) 112 8.5 20 ( 24) 92 7.0 22 ( 26) 107 8.2 24 ( 30) 92 7.0 26 ( 32) 94 7.2 3395 ( 6503) 11 0.8 ------------------------------------------- Sum 1087 83.0 Counts less than 10 omitted! Note: the above summary shows that 83% of all I/O's went to the block addresses listed under the heading "Parameter value". It shows also that 82.2% (83.0-0.8) of all I/O's went to the block addresses 6 to 26. It is interesting to note that these block addresses are in the directory! Appendix C ---------- Building programs from the source package. ------------------------------------------ Source kit overview: LG60 .MAC LG: Pseudo logging handler. LOGG60.MAC LOGG, copies IO info within LG: to log-file(on VM:) LGSH60.MAC LGSHOW, for printout of number and type of IO's logged. SHIO60.MAC SHOWIO foreground/systemjob for real-time printout of I/O's CHMACR.MAC CACHE MACRO LIST60.FOR LGLIST printout of logged and selected IO's. HIST60.FOR LGHIST printout of histogram of selected IO's. LGTIME.FOR Subroutines ISORT2.FOR DECODQ.MAC HIST60.LNK Link-files to build programs LGLIST and LGHIST. LIST60.LNK * The following conditionals can be changed in LG handler source: NRQIO= 4 ;Maximum number of disk IO's to be stored local list. NUNIT=-1 ;Set to disk unit number to be logged. Negatif -> all disk units The SET code area of LG: contains two similar lists (one ASCII, one RAD50) with 20 device names. If you have a device that is not in the list, you can edit these lists and CHANGE (do not extend the lists!) a device name in both lists to a new name. * The following conditionals can be set in the LOGG/SHOWIO source: NRQIO =4 ;Number of space for Q-elements in LG: handler (should equal the setting in the LG source!). NTICK =1 ;Number of clock ticks for interval to schedule LG: FILSIZ =0 ;Size LOG-file in blocks: FILSIZ = 0 -> 1/2 largest empty entry OR entire 2nd largest entry, whichever is larger. =-1 -> largest empty entry = m -> reserve m blocks MAC/OBJ:LG SYSGEN.CND+LG60 (SYCND+LG60, for RT-11 V4) *** Assemble/compile all other .MAC/.FOR files. *** Build handler and programs and copy to system device. Use .LNK indirect command files to build the analysis programs LGLIST,LGHIST.: LINK/EXE:LG.SYS LG LINK/FOREGR/EXE:LOGG LOGG60 LINK/FOREGR/EXE:SHOWIO SHIO60 LINK/EXE:LGSHOW LGSH60 LINK/EXE:LGDONE LGDONE @LIST60.LNK @HIST60.LNK COPY/SYS LG.SYS,(LOGG,SHOWIO).REL,LGSHOW.SAV SY: Release notes CACHE-11 V6 ========================= This release results from some major improvements of V5. No corrections were necessary. The improvements are: - Installing caching is now very simple: a utility UPD converts disk and VM handler sources. Run UPD, assemble disk and VM source, link, copy to SY: and INSTALL. That's all! New releases from DEC for the VM handler are now easy updated for caching. (Note: the VM-handler update is minimized: only the .DRFIN VM statement is exchanged by a DRFNVM macro call) - The caching algorithm code is now in a separate cache handler (CH:), size ca. 250. words. This means that when you do not use the cache, the code can be simply removed from low-memory by unloading the CH: handler. Internal some significant changes in the caching mechanism have taken place. E.g. the CH handler now makes a copy of the disk Q-element and puts this "copy-Q" element in the input queue of VM. The VM handler is called in a similar way as RT-11 itself calls a handler. - A new utility, CACHF, makes it very simple to cache DIRECTORIES and FILES by only entering device and filenames. The block boundaries are automatically setup by CACHF. Also logical disks residing on a unit of the cached device are supported. - It is now possible through software to set each unit of the cached device to read-only (Write-Protect). - The only sources to be assembled are the handlers CH, VM. The programs CACHE, CACHF, CSHOW are supplied in direct runnable format(.SAV) and run on any system having at least EIS hardware - CACHE has now variable volume support and thus checks for each volume that cache-area's are not defined outside the disk space. ========================= .TITLE SHOWIO ;DISK-IO-DISPAY, uses handler LG: .MCALL .TWAIT,.EXIT,.ENTER,.LOOKUP,.PRINT,.QSET,.MTPS,.SCCA .MCALL .READW,.READC,.WRITW,.GTIM,.CLOSE,.DSTAT,.SERR .ENABL LC NRQIO =4 ;Nr. of space for Q-elements in LG: handler (see LG source!). NTICK =1 ;Nr. of clock ticks for interval to schedule LG: ; SHIO60.MAC IO shows I/O's of selected disk with CACHE macro ; H.H. NKG-AZG AUG-84 .IIF LE,NRQIO NRQIO=1 ; Data stored in LG-handler: ! ; -------------------------- ! ; @CSW <=I ! ; BLOCKADDRESS <=II ! ; SPFUN + Unit + Job nr. <=III ! ; BUFADR <=IV ! ; WRDCNT <=V ! ; CMPADR <=VI ! ; ! ; Q-Element layout: Offset: ; ---------------- Q$LINK ------ -4 / 0 ; Q$CSW -2 / 2 ; Q-Element pointer => Q$BLKN 0 / 4 ; Q$JNUM Q$UNIT Q$FUNC 2 / 6 ; Q$BUFF 4 /10 ; Q$WCNT 6 /12 ; Q$COMP 10/14 ; Logged are word @2,4,6,10,12,14 CSW = 0 BLKN = 2 SFUN = 4 UNIT = 5 BUFF = 6 WCNT = 10 COMP = 12 .PSECT INISIO START: ;------------------ Open channels on device/job -----------------------; .SERR ;TRAP VARIOUS DEVICE ERRORS .SCCA #AREA,#CCFLAG .DSTAT #LGSTAT,#LGSPEC ;GET LG DEVICE INFORMATION BCS ERR1 MOV LGSTAT+4,R3 ;HANDLER ENTRY ADDRESS MOV R3,R1 BEQ ERR2 ADD #4,R1 ;Points to BR GOLOGG(+2=CQE, ADD #6,R3 ;+4=BR BEGIN). +8.=RAD50 10.=LG-table. TST @R3 ; +6 DK-Q-Pointer) BNE ERR3 MOV 2(R3),DKSPEC .DSTAT #DKSTAT,#DKSPEC ;Get disk information. BCS ERRDK1 MOV DKSTAT+4,R2 BEQ ERRDK2 ADD #6,R2 ;Points to Cache loc. in disk-H. TST @R2 BNE ERRDK3 MOV DKSTAT+4,(R3) ;Handler entry address, store in LG: ADD #2,(R3)+ ;Point to CQE of DISK. TST (R3)+ ;Skip RAD50 name MOV R3,LGPNTR ;Points to LG: info table. CLR MISSED MOV R1,@R2 ;Enable disk link. JMP NEXTS ERR1: .PRINT #LG1 BR EXITIN ERR2: .PRINT #LG2 BR EXITIN ERR3: .PRINT #LG3 BR EXITIN ERRDK1: .PRINT #DK1 BR EXITIN ERRDK2: .PRINT #DK2 BR EXITIN ERRDK3: .PRINT #DK3 EXITIN: .EXIT ;--------------End of initializing code and buffer area-----------------; .PSECT RUNSIO ; ** R1 = Points to Q-element DATA in LG: ; ** R2 = Nr. of IO's ; ** R3 = String pointer NEXTS: ;Wait for next scheduling of LG: MOV LGPNTR,R1 ;Acces DATA in LG: through R1. .TWAIT #AREA,#TIME TST CCFLAG ;Can we go on? BEQ 1$ JMP EXIT 1$: TST 14(R1) ;Something in IO-list? BEQ NEXTS ; ============================== ; I/O is there, display it! MOVB #' ,HEAD CMP 2(R1),MISSED ;New IO missed? BEQ 2$ MOVB #'+,HEAD ;Yes!! + =IO overrun. MOV 2(R1),MISSED ;Get total missed. 2$: ADD #14,R1 ;Skip count table(+14) ;-----------------------------------------------------------------------; MOV #BUFFER,R3 .MTPS #340 ;Do NOT disturb Q-copy!! MOV (R1),R0 ;LG: NRQCNT CLR (R1)+ ;LG: NRQCNT=0, QLIST is free TST (R1)+ ;Skip Q$LINK MOV R0,R2 ;Copy IO count QCOPY: .REPT 6 ;Copy Q-element values MOV (R1)+,(R3)+ ;@Q$CSW,Q$BLKN,Q$FUNC/UNIT/JNUM etc. .ENDR ADD #8.,R1 ;Point to next Q-element, skip SOB R0,QCOPY ;the 3 free words + Q$LINK .MTPS #0 ;-----------------------------------------------------------------------; SHOWIO: MOV #BUFFER,R1 AGAIN: MOV #" ,IOTXT MOV #" ,IOSPF TST WCNT(R1) ;READ? BMI 2$ MOV #"RD,IOTXT BR 3$ 2$: MOV #"WT,IOTXT 3$: TSTB SFUN(R1) ;SPFUN? BEQ 4$ MOV #"SF,IOSPF 4$: MOV #IONUMB,R3 ;ASCII output comes here. MOV CSW(R1),R0 ;Fetch CSW CALL CNVOCT MOVB #'@,(R3)+ MOVB UNIT(R1),R0 ;CONVERT UNIT BIC #177770,R0 CALL CNVDEC MOVB #'U,(R3)+ MOV WCNT(R1),R0 ;CONVERT WORD COUNT CALL CNVDEC MOVB #'W,(R3)+ MOV BLKN(R1),R0 ;CONVERT BLOCK ADRES CALL CNVDEC MOVB #'B,(R3)+ MOVB SFUN(R1),R0 ;CONVERT SPFUN VALUE CALL CNVDEC MOVB #'F,(R3)+ MOV BUFF(R1),R0 ;CONVERT BUFFER ADDRESS CALL CNVOCT MOVB #'A,(R3)+ MOV COMP(R1),R0 ;CONVERT COMPLETION ADDRESS CALL CNVOCT MOVB #'C,(R3)+ CLRB (R3) .PRINT #HEAD ADD #12.,R1 ;Add offset to next IO in BUFFER DEC R2 BEQ 5$ JMP AGAIN 5$: JMP NEXTS ;Wait till next schedule of LG: EXIT: MOV DKSTAT+4,R2 ADD #6,R2 ;Points to Cache loc. in disk-H. CLR @R2 ;Disable disk driver LOGGING 1st. ; -------------------------------- MOV LGSTAT+4,R3 ;HANDLER ENTRY ADDRESS ;0 = LQE +2=CQE, ADD #6,R3 ;+4=BR BEGIN +6=BR GOLOG +8.=LG-table. CLR (R3)+ ;Clear disk pointer (DKCQE). .EXIT ;--------------------------- Storage ------------------------------; AREA: .BLKW 5 TIME: .WORD 0,NTICK ;Look every 20.*NTICK ms. LGPNTR: .WORD 0 DKSTAT: .BLKW 4 LGSTAT: .BLKW 4 BUFFER: .BLKW NRQIO*6 MISSED: .WORD 0 ; ------------------------------- LGSPEC: .RAD50 /LG / DKSPEC: .RAD50 /RK / ;DISK DRIVER SPEC!! .WORD 0 CCFLAG: .WORD 0 HEAD: .BYTE 0,40 IOSPF: .WORD 0 IOTXT: .WORD 0 .ASCII /=>/ IONUMB: .BLKB 70. LG1: .ASCIZ /No LG:/ LG2: .ASCIZ /LG: not LOADed/ LG3: .ASCIZ /LG: ON/ DK1: .ASCIZ /No DK:/ DK2: .ASCIZ /DK: not LOADed/ DK3: .ASCIZ /DK: LINKED!/ .EVEN ; ------------------------------- ; Routine converts bits to decimal or octal ASCII string. ; R0; Contains bits to be converted ; R3; Points to output area ; Size of area should be nr. digits plus two ; On return R3 points to string terminator ; Note: Contens of R0, R3, R4 and R5 is changed!! ; Contens of R1 and R2 is saved and restored!! FORMAT=7. FORMAT=FORMAT-1 .IIF LT,FORMAT-6 FORMAT=6 CNVDEC:: MOV R2,-(SP) MOV #10.,R2 MOV R0,R5 BGE CONT .IIF NDF FORMAT MOVB #'-,(R3)+ NEG R0 BR CONT CNVOCT:: MOV R2,-(SP) MOV #8.,R2 CLR R5 CONT: MOV R1,-(SP) .IIF DF FORMAT,CLR R4 CALL CONVRT MOVB #200,@R3 MOV (SP)+,R1 MOV (SP)+,R2 RETURN CONVRT: MOV R0,R1 CLR R0 DIV R2,R0 MOV R1,-(SP) .IIF DF FORMAT,INC R4 TST R0 BEQ 1$ CALL CONVRT 1$: .IF DF FORMAT NEG R4 BEQ 30$ ADD #FORMAT,R4 BEQ 15$ 10$: MOVB #' ,(R3)+ SOB R4,10$ 15$: TST R5 BLT 20$ MOVB #' ,(R3)+ BR 30$ 20$: MOVB #'-,(R3)+ 30$: .ENDC ;FORMAT MOVB (SP)+,@R3 BISB #'0,(R3)+ RETURN .END START Product: RT-11 DISK DATA CACHE Purpose: + SPEEDUP DISK I/O in a transparent way by caching technique + WRITE-PROTECT can be dynamically set/reset for each disk unit. WRITE-PROTECT of SYSTEM DISK is possible. + Multiprocessor environment: simultaneous use of system disk by multiple systems Characteristics: + Improvement of system response, virtually eliminates USR and KMON swapping when cached + Applications run much faster as far as disk I/O is concerned + After startup caching is completely transparent + Cache setup is simple: FILES / DIRECTORIES can be cached by simply entering FILE / DEVICE names + Requires only about 250 words of resident cache code in low memory. This cache code resides in a separate cache handler + A must for floppy and TU58 users due to dramatic performance improvement. Principle: Direct Mapping (proved to be superior to Look Ahead and Least Recently Used algorithms): a fixed disk area is mapped to a file(the cache file) on VM: (the virtual memory handler). Space on VM: not occupied by the cache-files remains available for normal use. Up to 10 disk area's may be defined on several units. A disk area may be the directory (in many situations a very efficient cache area), a file or a part of a file, etc. Failsafe: Uses the Write-Through principle. A read to a cached disk area is served with data from the cache file on VM:. However, a write updates the cache data as well as the disk data. So, even when a disk directory is cached, the disk is not corrupted after a system crash. Write cache: The Write-Trough principle can be disabled explicitly for specific disk area's which contain temporary data. For example consider the SWAP.SYS system file. The data in this file have only a meaning during runtime. I/O to disk area's cached in this way write to/read from only the VM: cache file. Software: + CH:, cache handler. Must be loaded when caching. + Two small macro's updating VM: and disk handler for caching. + CACHE & CACHF, a utility programs for starting/stopping caching and testing cache contents + CSHOW, a utility program to be run at any time during caching to show (print) cache setup and performance Required: + RT-11 V5 and later for CACHE V6 + Extended memory. The more memory, the more disk data can be cached. However, memory not used for caching remains available for data storage. A total of 128 Kw. memory in a system may cache up to 376. disk blocks. VM: (RT-11 V5) supports upto 2 Mw on Q-bus. + It is necessary to assemble, link and re-install VM: and disk handlers. Current status: Operational for FB/SJ V4 since Oct-82, under V5 since Aug-83. Under V5 XM monitor since september 1984. CUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU C C UPD.FOR Program updates disk and VM handler sources for CACHING/LOGGING C H.H. dec-84 C INTEGER FILSPC(39),SW(4,10),OUT(5) REAL DEFTYP(2) BYTE LINE(131),CACHE(8),INPERR,OUTERR,DOT(2),CONV(11) BYTE CC,NAME(4) c DATA DEFTYP/6RMACSRC,6RSRCSRC/ DATA ISRC/3RSRC/, IVM/3RVM / DATA CACHE/"11,'C','A','C','H','E',0,0/ DATA DOT,CC,NAME/'.',"200,0,4*' '/ DATA CONV/'C','o','n','v','e','r','t','i','n','g',"200/ EQUIVALENCE (OUT(1),FILSPC(1)) c c 10 CALL PRINT('UPD: UPDATES disk & VM handler for CACHING/LOGGING!') CALL PRINT(' (Default extension input=.MAC, output=.SRC)') CALL PRINT(' (Note: filename for VM handler MUST be VM )') CALL PRINT('') CALL PRINT('Give FILESPEC handler SOURCE>') 20 IF (ICSI(FILSPC,DEFTYP,,SW,0).NE.0) GOTO 10 c c Open input file and read the data c --------------------------------- c ICHANI = IGETC() !Input data channel IF (ICHANI.GE.0) GOTO 25 CALL ERROR('Input GET CHANNEL error',ICHANI) GOTO 20 c 25 IFLAG= IFETCH(FILSPC(16)) IF (IFLAG.EQ.0) GOTO 30 CALL ERROR('Input device FETCH error',IFLAG) GOTO 20 30 ISIZE= LOOKUP(ICHANI,FILSPC(16),IPOS) IF (ISIZE.GT.0) GOTO 40 CALL ERROR('Input file LOOKUP error',IFLAG) GOTO 20 c 40 OUT(1) = FILSPC(16) OUT(2) = FILSPC(17) OUT(3) = FILSPC(18) OUT(4) = ISRC IFLAG= IFETCH(OUT) IF (IFLAG.EQ.0) GOTO 43 CALL ERROR('Output device FETCH error',IFLAG) GOTO 20 c 43 ICHANO = IGETC() !Output data channel IF (ICHANO.GE.0) GOTO 46 CALL ERROR('Output GET CHANNEL error',ICHANO) GOTO 20 46 OUT(5) = ISIZE+1 !1 extra for possible extension IFLAG = IENTER(ICHANO,OUT,OUT(5),IPOS) !Enter outputfile! IF (IFLAG.GT.0) GOTO 50 CALL ERROR('Output file ENTER error',IFLAG) GOTO 20 c-------------------------- Files open; do I/O ---------------------------c C C Open input file and read the data C --------------------------------- C 50 IERR=IASIGN(1,FILSPC(16),FILSPC(17),0,32) IF (IERR.NE.0) STOP '?UPD-F-Unable to open input file!' IERR=IASIGN(2,FILSPC(1),FILSPC(2),FILSPC(5),9) IF (IERR.NE.0) STOP '?UPD-F-Unable to open output file!' c c Read / Write data: c C DISK or VM? C MACRO = 0 CALL PRINT('') CALL PRINT(CONV) IF (FILSPC(17).EQ.IVM) GOTO 1900 C NAME(1)='D' NAME(2)='I' NAME(3)='S' NAME(4)='K' C C Read text for disk handler: C --------------------------- DO 1000 LINES=1,10000 CALL GETSTR(1,LINE,130,INPERR) IF (INPERR) GOTO 4000 IF (MOD(LINES,10).EQ.0) CALL PRINT(DOT) CALL PUTSTR(2,LINE,CC,OUTERR) IF (OUTERR) GOTO 3600 C C Find the text of interest: C IF (INDEX(LINE,'.DRBEG').NE.0) GOTO 1110 IF (INDEX(LINE,'.drbeg').EQ.0) GOTO 1000 1110 MACRO=MACRO+1 IF (MACRO.NE.1) GOTO 3500 CALL PUTSTR(2,CACHE,CC,OUTERR) IF (OUTERR) GOTO 3600 1000 CONTINUE GOTO 6000 C 3500 CALL PRINT('') STOP '?UPD-F-Several .DRBEG in disk source!' 3600 CALL PRINT('') STOP '?UPD-F-Fatal hard OUTPUT error' C C---------------------------------------------------------------------C C 1900 NAME(2)='V' NAME(3)='M' C C Read text for VM handler: C --------------------------- DO 2000 LINES=1,10000 CALL GETSTR(1,LINE,130,INPERR) IF (INPERR) GOTO 4000 IF (MOD(LINES,10).EQ.0) CALL PRINT(DOT) C C Find the text of interest: C IP = INDEX(LINE,'.DRFIN') IF (IP.NE.0) GOTO 2110 !Continue IP = INDEX(LINE,'.drfin') IF (IP.EQ.0) GOTO 2100 !Continue 2110 IF (INDEX(LINE,'VM').NE.0) GOTO 2120 IF (INDEX(LINE,'vm').EQ.0) GOTO 4500 2120 MACRO=MACRO+1 IF (MACRO.GT.2) GOTO 4510 LINE(IP ) = 'D' LINE(IP+1) = 'R' LINE(IP+2) = 'F' LINE(IP+3) = 'N' LINE(IP+4) = 'V' LINE(IP+5) = 'M' 2100 CALL PUTSTR(2,LINE,CC,OUTERR) IF (OUTERR) GOTO 3600 2000 CONTINUE 6000 CALL PRINT('') STOP '?UPD-F-Too many input lines!' C 4000 CLOSE(UNIT=1,DISPOSE='SAVE',ERR=3600) CLOSE(UNIT=2,DISPOSE='SAVE',ERR=3600) CALL PRINT('') WRITE(7,4010)NAME,LINES-1 4010 FORMAT(' ?UPD-I-SUCCESFULL ',4A1,' update! No. lines =',I4) STOP 'UPD' C 4500 CALL PRINT('') STOP '?UPD-F-Is this REALLY VM handler source???' 4510 CALL PRINT('') STOP '?UPD-F-Too many .DRFIN in VM source???' C CALL EXIT END c SUBROUTINE ERROR(STRING,ICODE) c BYTE STRING(1) c WRITE(7,10)ICODE,(STRING(I),I=1,LEN(STRING)) 10 FORMAT('0?UPD-W-Error code =',I4,1X,40A1) CALL PRINT('') RETURN END ; MACRO FOR UPGRADING VM: HANDLER TO CACHING ; ; -----------------------------------------------------; .MACRO DRFNVM,?X MOV VMCQE,R5 CMPB Q$FUNC(R5),#200 BNE X RETURN X: .DRFIN VM .ENDM DRFNVM ; ; Use: ; ---- ; Replace VMDONE: .DRFIN VM by VMDONE: DRFNVM ; ;-------------------------------------------------------; R LINK SAV:LGHIST,TT:=HIST60,LGTIME,ISORT2,DECODQ/I $SHORT ^C !MAC LOGG20 !R LINK !LOGG,TT:=LOGG20/R !FORT LIST60 R LINK SAV:LGLIST,TT:=LIST60,LGTIME,DECODQ/I $SHORT ^C eD 5ex(Ye,  evef eH %w.E,5 A^ PeeBe <Bl&e ,8 ul^urdR~ EE `  "^dߕ-ߕ>ߕ^ėߕ=_ߕ.ߕ>62bdS w@d^:d34E@O`@Kjb`\qhtg@%)% %@E.E(P$ E%P@%  77ebe   74 7T "$&(*,.02468:U% z5 Uw \wp 7  EU?7 (eEae  E % 4ͥ , tw<3 '%͕!"E%% 1 Q$  w 7\ U wep NyqCGU[YW?R   57h ef E 7 b& ͕եw0 t@ wfwb5 A5%w t4oo]5@^ 55 q K%(5wj5<55 5wt 5zKHn!5@"d `55 %E@w55  8wp5@z5vw5@5 %b%@5hf B %n.fh X ĝ]N?w5 , An5@ 55d25/_ "h5@5 ^"%KB@*5 .wr &75 " ww!e, }7  e,} U0& x 7M 7RBg H%8 /(7g%7 l%5b   ww*%% 7" 5 %%5% 5   wr T8:% j[ QL> @/5wr&x  ĝ]%wXŝD5@ e 4&ŝh "ŝU7   @5 55g w5e ee>w=5@ Ax cE eL  E%%f c e aewb 7 ` '%N % %%U7* %%  Dw%)wj7  b$e  K%%e w7e7 % ~ew -d^e D < aeGc *3    &   ,C l  Q$  45 5wv .    J  @ wR    N   " < e<fHDR1$e  e   P   V R  H    ͕wz  %0;&&% *e F1EODe7 *  > eV      %   Jw&%0@ w ec  wx B  wX.5%%   =lŋ5 2% -&  N% %% % f p l h w     w7((e~w!ww   fU w 7wW5 5ZH B 7 l  .     6 # R N $ B%% ( $ &      #w$3 %?  %  5 X%EO%F1e ?@     De8eɥ.  %Е % %RT%11Е.P %  AT.D$e! e  A W ((  W ee0e  .%&  ` B0` ae/ dT 'd , EeJD`W 5  EC`EeHe w|;Zx0N 5(ez 5w`7 (e?N v5% ,3? $7  5 %HD%R1$ %EO%F1%V1e x?%VO%L1w l hʁw8w7   Z ,1 p   Z kQ< w7hE wPw XTHDR1 RT11A 0001000100 00000 0DECRT11A 62|~S VRR`Kj0``K0`\qht<@  7F ae>  ae33  @  eae  7w"RPVTWW U% (R5 ,5@ Uw (w& DE e|E`E w27 e5 e  7 %UW wU Rf}%!%* LW# ,1 w3 M Z TE| 45l.Ed (e%5F % 1 Q$  w 7 U wVe  h$$""$ą R ,e & Ε,e U%U@,e  cceL.E 7MepU%U% != 5 %5E wd @DE ac4R zM@5 &e5w 5@E@ Hzw>E@5  te5 %(U 5 U E (%%4 w^55@  ww6E@5  t <wf5@we5 -w 5N5GE@5@%">%:%65%k+%'Uz\E@55UV   w= w5Ue%v,e & Ε,e U%U@,e 6%<eN%5 E5+Ue,e & Ε,e U%U@,e eU d55 ffxfh 1  r 5PU }f&J E 5U ff&eTTTLw 5E *wxwb!e, }7 e,} U0& x 7e ee w  E%%f c e aewb 7 ` '%N % %%U7* %%  Dw%)wj7  H$e  K%%e w7e7 % ~ew -d^e D < aeGc *3    &   ,C R  Q$  45 5wv     J  @ wR    N   " < e<fHDR1$e  e   P   V R  H    ͕wz  %;&&% *e F1EODe7 *  > eV      %   Jw|&%0@ w ec  wx B  wX5%%   =lŋ5 2% -&  N% %% % f p l h w     w7((e~w!ww   fU w 7wW5 5ZH B 7 :  .     6 # R N $ B%% ( $ &      #w$3 %?  %  5 X%EO%F1e ?@     De8eɥ.  %Е % %RT%11Е.P %  AT.D$e! e  A W ((  W ee0e  .%&  ` B0` ae/ dT 'd , EeJD`W 5  EC`EeHe w|;Zx0N 5(ez 5w`\7 Z(e?N v5% ,3? $7  5 %HD%R1$ %EO%F1%V1e x?%VO%L1w l hʁw8w7   Z ,1 p   Z kQ< w7jE wRw ZVHDR1 RT11A 0001000100 00000 0DECRT11A 62>@ S PP5w@Ud>d^:dD4L@\`@Kjo`\qhtt@ %%, %' %) % U U@U`E`P U`P@% % `` 77eHe   7 7*PRTVXZU% j5 UwTw EU`?7 <e,Eae  E % 1ͥ , w3 $%͕ %% 1 Q$  w 7t  U . wRep nCEAOMKIG?R  QeJ E 7+&  ͕եw @ nw lw`5@A <xx00(5<2 4w`5[(5 5DQ wM5FH55  58E  wpwj7!e, F}7 < e(,} &U0&  77 i` %Rwy%5 aw%5@5   ww&%t%l7~ 5 %N%F%5@%4 5 0  w * xX 5pwfw  <<w2*. ŝ#  ?ŝ5 e ŝ7L]Lŝ3e ee eceL 0E%%f c e aewb 7 ` '%N % %%U7* %%  Dw%)wj7  $e  K%%e w7e7 % ~ew -d^e D < aeGc *3    &   ,C   Q$  45 5wv R    J  @ w R    N   " < e<fHDR1$e  e   P   V R  H    ͕wz  %T;&&% *e F1EODe7 *  > eV      %   Jw&%0@ w ec  wx B  wXR5%%   =lŋ5 2% -&  N% %% % f p l h w     w7((e~w!ww   f6U w &7wfW5 5ZH B 7 n  .     6 # R N $ B%% ( $ &      #w$3 %?  %  5 X%EO%F1e ?@     De8eɥ.  %Е % %RT%11Е.P %  AT.D$e! e  A W ((  W ee0e  .%&  ` B0` ae/ dT 'd , EeJD`W 5  EC`EeHe w|;Zx0N 5(ez 5w`7 (e?N v5% ,3? $7  5 %HD%R1$ %EO%F1%V1e x?%VO%L1w l hʁw8w7   Z ,1 p   Z kQ< w,7jE wRw ZVHDR1 RT11A 0001000100 00000 0DECRT11A 62*" 0S43@@',5 !aa%% e % UT  2],wy}#@w!@4"$`Kj%`$`K%`\qht&@7 O eJw ae4J7 e  e  > ?:_ @BT%& ?_  @ ? " wv b " ?_ U% 4 tŜE w  B~C`$@ ?<_ e, ^}7 T e@,} >U0& 2 e eew  NE%%f c e aewb 7 ` '%N % %%U7* %%  Dw%)wj7  $e  K%%e w7e7 % ~ew -d"^e D < aeGc *3    &   ,C   Q$  45 5wv p    J  @ w(R    N   " < e<fHDR1$e  e   P   V R  H    ͕wz  %r;&&% *e F1EODe7 *  > eV      %   Jw&%0@ w ec  wx B  wXp5%%   =lŋ5 2% -&  N% %% % f p l h w     w7(( e~w!wwV   fTU w D7wbW5 5ZH B 7   .     6 # R N $ B%% ( $ &      #w$3 %?  %  5 X%EO%F1e ?@     De8eɥ.  %Е % %RT%11Е.P %  AT.D$e! e  A W ((  W ee0e  .%&  ` B0` ae/ dT 'd , EeJD`W 5  EC`EeHe w|;Zx0N 5(ez 5w`7 (e?N v5% ,3? $7  5 %HD%R1$ %EO%F1%V1e x?%VO%L1w l hʁw8w7   Z ,1 p   Z kQ< w(7xE w`w hdHDR1 RT11A 0001000100 00000 0DECRT11A  '  !E ae8` V  @S  jNEW IaeɐՀ@ @7=: 97 t2 zv aeh x\ePLe @e> ep U  we@e @@ @WC  r T \!D ef JB~ 0 4 ~e~`~     ,^_eD,`0a _0 a "b!""Z$%%%%<&&&&('P'()))$)U,e As\ v3JsLe `@ s638 `e  e , @BT0%D7 7 ^Ww>wf e( $Ww 5wJJ rw?    L1 e- ہF ?H_h7 |׌w `z, W% w @n7 Dww fw" w,DDe7DDe TU( U  wLwH7 7  5w hIl%?@ A Ee w?D B A 7 (h  B µeA  ?_EP-,  µ7  (W  w www $w  w &fehA 7wh $ 000e4A 7wte te@ 7~7xe4@ 7t7n ?&7 >@ DeHw ?Tf,e tf eB E 5@&D$ f \~ V~ww  B~ w6E ae7 (7 rw^wVw | ŀş~aeq$t t%!dU@  \ U$ 7 F7 7 $ w h f w ,\7`W#W#W#f ͵U ͵U BEeĥ(D?  ,1* w5 U  wZĥ ĕ 5  w 7l ?n< eA HT$*`!"%"%%$7e77w 7 <w X ? 2r U  rW r  U 7 4U ՀN 7 &  ? (EE D!?B M ! X ?Z b* fefE eN! m`w F 7 Pw |w v z e/W#W W- 7 4w  4w   wc B!  e6e^+N5 UՀ":5 U@ZB     z  w8  B  ?E@ ? ^w< w2*w*62:<S U e,}62 ? 1S T,5 NE5E,@@`E`W%W#7 e @ +U(Z! `@Kj`x 7\7V7  77erepp &e`-f EaeJEae8 e'鈇UStation address = 0123456789ABCDEFP P ,e wL D E aeD W  &  ŋ  & B e< JeaEJ  UeL,}>(& . #     e   7 B t1"Av1A7  3 CpaeB      \    7 lw7  Z ae 7  we- vww-f wWqae  eD fNUVUwHe&%%%fe$    w-  w-w v7 ww b7 wZ&f   - e  -@ @ 77 4  &D&&er,07P4 7 U lE,^ @ :UHB7@7:4 e6, $" 7 7 7 7 ~eEE  0 pae   2,e<    E 7 -  7  Z  heb,}f&afD* 6-! E 6 54 4  7 707tUE ex&  ee7 e&  fe  e *tEU1 e@ @  w$Ee 1 U ,p0 U@ @^V  >6ex e &TT   eT 1111 1( e9  eeT 2 U tw EAw @D55 5  Vw 4w &f 5@w5 5@wq w5`w:Fw0 U^ aee  ,   z e se&e pae 3,3, "e IeCfE E Ue<fe d B!  FUh ae &e,  `E Uw  W wwL5  p0 LWp ae e:,5%5d7\4 5@5 5 U 2 B X w d a ^ W e& e ( e\\eRRRe  WtEU UP  P  h7 7 ^11 U(Z62 ? 1SHH& w `@Kj`x$ ;7\7V73 277,&㨠ӤeO ew 7   m-eK  PHP ,e w0 ( E ae( W  &  ŋ &  e< JeaEJ UeL,}>(& . | #   h   ex v t 7 & t1"Av1A7  3 Cpae&    V  .    7 *w7   ae 7  we-d Zww-J wWqaep  e( fNUVUwHe %%%fe$    Fw-  w-w v7 ww b7 w&f   - e  -@ @ 77 4  &D& er,07P4 7 U lE,^ @ UHB7@7:4 e6, $" |7 7 rl7 7 belEE  0 paej   e     E 7 -  7  , D heb,}f&afD* 6-! E 6 54 4  7 707tep0 ȕ Bȕ 4ȕ &ee6~hȕ 7 \ Blȕ &E%ȕ@ Hȕȕ   &e*e7 TeT ^  @e jtEU11 ee@  e ,tE1e@  e tEldePeZPD@ :ȕ  e  &TT  j1 ŝPwȕȕ : U U@Uw~ vȕ ȕ@ȕH ȋ0wZ @tDu5  5 5͕H w tw  &f |5wd5@w2w( ZU0 aeeb  ,   v e oe&e8 pae. 3,3, "e Ee.?EEfe  B!  UB ae &e,  , .1  W wwWpae h ~&fe0e7(4 5@5  5  U    &f ;8 X5 e \\eRRR ef, e 0 HZ,5@ Rn 50&EA ȕ@@`@`& " " &e%"6e  " e eZ e7`B7`Fe*e- $ eaef e 7  Q$eep @ ep0 ȕ ȕ ee-f EaeEae e B w8&vEeTeT鈀Uȋ0Z:\DEUNA, DELUA, Station address = 0123456789ABCDEF62>@@S  `@Kj7`\qht?@ &7\7Vefe e @@ @  57 7BD E` `E@% e`7C U% tdf cB eB ,5@ E>d EPI @eD P 5  nX7;W#  XB͋ 5ZTUMU7 e,} C_| e `E Pc ˋ  N N N N E  Pr  _w @  ߋtv ?BOOT-U-I/O error 62 '4)dxS/F,5 V   72םgeEU7 O e(wE aeKC l^l _l7FWlKriEXKq,]KSz,D9p:NÌf0ff,@~n@U Х: 7Ж/m"`ZQ7H?  w 7&w \O @ E% _ U e,}Rj~%E 5w   @,c Xw  d ,cAu.Be)  D K ѐåB !f W!2 5 "cF(舗/[w " G( B5P$>A,8IA.~%E/ @,~4 u*L,@* *  e, 5 , _/ec55 (  E"ť@  !@ 0"'' &f&M }"w ,`l%W,xW,e w ``8`<`>`Plw7P0Z.H   . < !!"!*!>!F!X!d!!!!!"2"#&&&J**5``5`0 B~eQ$E% PPPPPf"e4 e0ue%鈀 [?2l\<<[62;1"px0,E ]7  7 \p鈀D HWN L N,UEA @4  7,EU*,7EE B7\鈀  `. www  7 O ew 7  w@eT77 w x w7 0  7x∀%)d @d  $UPP$KrKf& KnK  ? /M[ ?ww % %=%>- %p ae&KltEaeE@$wKvKf  Aρ"̇ ae5c 09E0f e `;<\Z '!'ǀM` l@'S@f@ ` !Y --CǀCǀǀ2ǀ2888ǀǀǀ====ǀǀǀǀǀrǀǀǀǀǀHHHHO&%& &(&T ( " &  +w`ae鈇LA12LA100LA120LA34/38LQPSE-FLQP02VK100VT50VT50HVT52VT52JVT55VT61VT100VT102VT102JVT125VT131VT132VT1__ in VT52 modeVT278Generic VT100Generic VT200?SL-F-no response to DA request?SL-F-Unknown DA response?SL-F-Unsupported device - ?SL-I-Supporting as a VT52, terminal is - ?SL-I-Supporting as a VT100, terminal is - ?SL-I-Supporting as a VT102, terminal is -  awwB$LOAD SL$SET SL ONw($LOAD SL$SET SL KMONw $UNLOAD SLC76?SL-E-ON/KMON/OFF must be last option in set command鈀7$?SL-I-Following options ignored - @ J P H U $[?6l?SL-E-SET SL LEARN is not supported for VT52 \7m,@@`E`%%I e @U .Ux>E_eN,`r"R lR  e$ ?SL-F-Insufficient high memoryf,5e+?SL-F-SL cannot be unloaded while running _JKG/8DCvT f G~2 G~* W"#   2 E @ ,B  C C C  ނBrB` 7\B^B`CBHB`B CB 2B`lDC  p" " EefE_ @ D~DC '|(( ESSS e<D`-0///Be&;2_ @u. `W 55B  w_ CCm$$E$UP$e 5" R} x u8&@8@ B @4 320 wp& (5e5  & R54E4  X A"  IU _  N  Nu 54 EP$_]$$@e w0  3 E WSwDWXw`w-w 2[O wbMSZ-wZluh-wPPR- wBAD|- & 4ww  w  >w@7E  78 w ) @ & w@3ˋi lw_]H7j X7\@ȋf `wD6Ձ CCcw@w9u-0 *5: A  \59  u  wA; u:; ˋ;wˋw, w  ^w  w.wdwwx w  w@@cȋ577%H7 jwwp Ӌ w  ˋR  r`5*w\p    " ' (7 ~    k w0` $,Y T ˋwtF ww78 2 ,0wf HwNˋG j``w A  5*ߋz@~ ׬_& *  ee~@e* ˋ  w    EB@ ` 3 BbE e#BB Aɋ P f A5Ac 2 $C Y ~ e @p%oW dW 1 d/  e / N  KE 2D[=48&5`* 6@P~7c 27o* DP   }4}f@ 4 @.@f @`&&ȕ@ f ɋW *&`5E@*&f 95 5&f5  `B`b~ JR~2  4 & R5   @ceˋ 5@$WaWz C Cå CE e1 ~@09 Ћ:ȋ9= @09 B  5:Ћ:50B9 B ߋ &DBʋҋeC@ !## 50595:7u0=>2  & wߋ&  @     f~0ɋ@ &  u @       f,0P P@07f o@ P  `נ0נ9   2 wB  נAנC;@ ;00DD     d  C;* P  B f 4@ : . N.w frנ/נ נaנz EWaWz Š   נ, נ- f e E` f w A07 Z 79%.*&>###U#Y#>#8#]#a#M#e#i#>#m#q#8###u#y#>#8#}'33*$*)>'3*(<#<##<>:I<##<>:%..*$*$*&###########>#}###<'3*()0x xxnlkmjuqqqqqqqqqqqqqqwqqqqqqqv GET OLD OLDER SAVE V GET SAVLEFT C RIGHT CDEL LIN ^ <--- ---> GOLD HELP BEGIN END UNDEL L SWAP BACK SPUNSWAP REFRESHDEL LINRETURN DEL CHRCTRL W CTRL R CTRL U DELETE TRUNC UNDEL CHKKY7 |||K+-------+TUGET OLDGET NEW CYCLE SET CYC#5For more information,type HELP SLX> UNSAVE<>Ŷ<>8]A<>mqa<ʉ>8}<>Ŷ<><8><Ŷ><Ŷ<9U<9e<9u<9ŸUnsupported commandAt left margin nowNothing to undeleteNo room to insertInvalid keyInvalid control charAt right margin now^Z^C j~62 -0S },`X}.@4FK.a'+5@,@J'U@R@w\t!/db@X%7,CP   Eae  C Eaeɐ aee  C n ڂEaeT H:  ,e 777PW/ E&ae7ae72`5@ E7 aen7&ewU`,W  0 ^7 XwW J 7 DewfU@r oleTwJ U@R `  F7 m7 ?ee-@ e - `7    5h  \UE@Ee,}&e(7 ?&D~f& 7 7 ee^ veeQ b,fE e ԕ-EaeTTTԕ-EeH  F rP  NRe J% v e" 8e5 *e e5    e x e f  X  5  w^JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDECFILENA.EXTeWW@ew AZew 0:ew -. ew   & `e  et   @ -.:* 0    @ˇ C    7e~-\ ****`eHW͕ @ h * L < 4@ $0 :  ? -& 7 PPe7U@8e7 l deH % b %e ee e  (@ PRINTED ON AT ************************ RT-11 **** RT-11 **** RT-11 **** RT-11 **** RT-11 ************************ ??????000000?>?000000<??000000???00000000???000000?????000??000 00??0 0 ??00000000??<pp<????<???000000????0004<?7?? 1 ~<000000????000000??>>?????080080<??< 0<?30?0000?000000?000??000<>310c030000800c0000???<000000??000000?>?c3>?000000?>>8000000?>88862'S?VM-W-Remove and reinstall this handlerzz w4,@@`@`" " h $C  $  e "oP  SK @ `Bx@7@ *7 f&ere @V@@ $Be  7 7ea  W%  CK 7f ,l$ $`` `- E, b/w , e ! @ ^ 0 & D~6Ue0,},f@@`@`" " h $C $  e " %P  Sa  W%  CK 0  MlC_pV e5z  %f  `W N  3@eL#?UzU RRC~ ~ ze@~_Az (   _w @  ߋtv ?BOOT-U-I/O error 62x ~x/ ,5 .ߝ\ȕȕȕȕDȕȕȕȕhȕȕȕȕȕȕȕȕߕߕ wEy@e.  " f U_w 2Kn,X`  %K\Pe @ E?XL-F-Handler may not be unloaded while in use.62" ~f/ S@@,5   `?Kj `7h7b7V7TeN7LeF7De> 78e76 =. ,57 ,7 :UFD U@6! w   w 7 U@@BDFPWWW#W)WGWQeX,} pUE7 ^U@7 pRU@ B RU5 dU5XU5@LUf &  E U&E@7 L7 U@ 7 07 7 U@ XeR,}f&afD( 6-  E6 54 7707t `  ŕe ŕ    E@   rE W W  E@7 7 U@ 0`şEWlW7 `U@| aeL  -@7 - U@:  W 7 -0 U@ @ :-p@9fae"E \ V-R@7 JWf J -0@ & & r7l ^U  &f& Ε,e 7 7  &D& Ε,e E,^ ` vU77z4 ev, f`@@ , &L\^e @nE@E@E?XL-F-Handler may not be unloaded while in use.!.MODULE STARTS,03, TYPE V5USER.TXT ! ! Typical commands to control system startup of a distributed XM monitor. ! ! Don't let anybody see what we're doing. ! !SET TT QUIET ! ! Select the terminal characteristics (if not a scope). Assumes an LA100 ! or LA120 type terminal. Note that the distributed XM monitor comes pre- ! set in scope mode. Do NOT select the next line unless you have a hard- ! copy terminal. Do NOT select the next line on a PC300 system. ! !SET TT NOSCOPE,NOTAB,FORM,NOCRLF ! ! Select the editor of your choice. Take the default (KEX) unless you are ! not using a VT100 compatible terminal. If you are using an incompatible ! terminal (or a hard copy terminal) select the following command. ! !SET EDIT EDIT ! ! Turn the single line editor on. Do not select this option unless you ! have a scope type terminal or a Professional 300 series system. The ! associated LET command is an example of a usefull RT-11 substitution. ! Normally, Pro 300 users select the next two lines. ! !SET SL LET,KMON !LET _;=: ! ! RT-11 systems can be used as a "terminal" when connected via a serial ! interface to a host computer. If you are connected to a host computer ! select the communications handler appropriate for your system. ! ! For PDP-11 systems.... ! Note that the XL handler must have its CSR and vector correctly ! selected by using SET XL CSR=nnnnnn and SET XL VECTOR=nnn before the ! following commands will work. XL is distributed with CSR=176500 and ! vector=300. ! !FRUN SY:VTCOM.SAV/PAUSE !LOAD XL=VTCOM !RESUME VTCOM ! ! For the Professional 300.... ! Note that the XC handler must have its speed correctly selected by ! using SET XC SPEED=nnnn before the following will work. ! !FRUN SY:VTCOM.SAV/PAUSE !LOAD XC=VTCOM !RESUME VTCOM ! ! Start the spooler on a Pro 300 or a PDP-11 with a serial printer. ! On PDP-11 systems, the LS handler must have its CSR and vector cor- ! rectly selected using the SET LS CSR=nnnnnn and SET LS VECTOR=nnn ! commands. LS is distributed with its CSR and vector preset for a Pro ! 300 computer. If you are a Professional series user and have a ! printer, the following commands are normally selected. ! !SRUN SPOOL/PAUSE !LOAD LS=SPOOL !RESUME SPOOL !ASS SP0 LP !ASS SP0 LP0 !ASS SP0 LS !ASS SP0 LS0 ! ! Start the spooler on a PDP-11 with a line printer. ! !SRUN SPOOL/PAUSE !LOAD LP=SPOOL !RESUME SPOOL !ASS SP0 LP !ASS SP0 LP0 ! ! Load the DU device to prevent re-initialization every time the DU ! handler is fetched. This should be done only if your DU device is ! other than the system disk. Professional 300 users should NOT ! select the following command. Micro/PDP-11 users should not ! select the following command unless they are booted from other ! than the RX50 or RD51 devices. ! !LOAD DU ! ! If logical disks are to be utilized, it is usually better if the ! logical disk handler is loaded. This improves performance and ! is more convenient if foreground and/or system jobs are active. ! Pro 300 and Micro/PDP-11 users normally select the following. ! !LOAD LD ! ! Use VM for scratch and work file space. If you are a MACRO user ! and have sufficient memory, using VM for scratch storage will ! increase system performance. ! !INITIALIZE/NOQUERY VM: !ASS VM0 CF !ASS VM0 WF ! ! If you are a Pro 300 user and have a color monitor, you may select ! the appropriate background and character colors. Do NOT select ! the following commands if you do not have a Pro 300 with a color ! monitor. White on blue looks nice. ! !SETUP WHITE ON BLUE ! ! Clear display and show memory. ! !SETUP VT100,JUMP,DARK,CLEAR !SHOW MEMORY !DATE !SET TT NOQUIET ! ! Get the revision levels of your MU's, if you have them ! R MSCPCK O   &f)eB J%@& fE7 ʋ, A>w <Ά +?VHANDL-F-Window error3_ TEkQ NACIYw # z45r l-5d7,QE E -7 H > <7 :w 6 -4$P ,7, 7,QzN `#<77 WORKING... 8 % 6    7 "7 l Nh l,72,Q7  7 7 % ' &f7,Q P D] 5 =7 7 7  7   B -7 : 5 = z wPv"t7 "7 |  5"7 " +7 V  7 zj&@ , , 7H+}Q 7:+Q74+QwF$7 !  V,  7!  d n+ 7+Q +& 7*Q 7 ! 7! 7 7 "w7 j7 j x!7  *7*Q7*Q 7*Q \<wT<QQ& Q7  `*E(E$ ~*w< &78*~Q &7&*Q7  l( &S#+^",d" /p% 'c#''^"d"Aa.Dd.Ee.Ll1Ss/Uu1Xx/$p%Oo#[#X"O#[$X"p)q,(r0)s)tX%u^%v2w.x.y2nx2Ml%P#Qt6R*S(,l,mR(Ad,B,C)D)X"pj)q1rD,s%t@9u&9vT4w@-x0y2nh%M3P#Qt6R)S'l'm'A&9B@9C6)D)X"f  1eA5 7 2 * $& (  (x x( f &`  x(7 R2R8R2R t!7 &@7 vQ&D D @ ` E` wTw\   7 3 0%9 %  7   Q7 9 5X' $5L  -B^-X\ׯP - ?    ('U >E7 0k7 *k 7 z 7 4k 2 &%  5 - U7  ' m    1  2  &ׯb  `2   41  1 17 hFA TAO Ae  RJ`TATA A AFAFA qw 7 Ukf q, -    7 yk7 kFATAA j4 ) 6 jBB-Z#BC   0 40  0 7 k7 k7 k7 k  F |/  j ~/  " 0  < 0  f  Z  N3 7 xlT 2  &   3 7 >9l%  2  07 ]l 07 |l   |.  |.  7 l7 l   L N.7 l7 l   f 2.7 md N .7 r/mL7 NB7 n Q8T*wHZ pN j ^ ^  " v ^7 f `ZRw P7 Nm7 ^m7 vm]*H*Oi*[y*H*t)u)R*Ml%A)B)H* h- @ - .7 ~mNB7 7 7 NB &B F 7 :m H  >D  @ 4  m-  @      %A Z%a%z E %A ZU 0  \  \ \   F- - 7 Nm7 Hm7 Bm  > ,7 .m " h,7 n -7 ,n @, 7 Kn $, 7 en  5z   Z- V-  n   + 7 t~n U& 4 5  -؆-&*ㆄ  , w w @ 4 w @     5 7 B7 Q9 O M T 4 7 n7 n 7 n ɋ%7 n f&  ʋ - @ @  ҋ ʋ e 5 K & @+- @ @ 0 ` ` f 2   3~  azE W  BC d  ) H) ~ FB> D67 $7 Xo ( v  j7 d ^   R wD7 ;o 44w  @  ^(   m    eE  7 \o 2)  )퇇  VCw,ew& $7 "7     7    -   7  $  7 qo      ?z v-rndf  7 oR N-JJ7 F V V7   J h'Y       ' J( d@   `    4 <ׯ  6 ׯ   7 o7 o d &  & '   A7 o7 oj+Dv+<+4 tI  x@Erp   C* &) ?  6&  C & ?  %  7 p7 p7 Ap -  ? w(w<7 dp7 7 7   , j7 7 7 7 ~ | v r   `^w 6 @ H7 F | N 7 pn v ,  $    7 p  R7  I 7    ~  L%@ "$/ p   NC` N f% 0$ <#   * w7 p7 p  -  < 7 p   w   0$ 7 q7 q7   d  e0'd tCѕ$    w"7 lAtѕ  < bC@   w7 :btW @ ^<  B  f< f|<f<fv<fe  %    . & t _$. v v _ .$         AZ09 6 az ׯ   07 {t  `  n 7 zt  7 Pt f&f& 3e 7 7 L>R7 5$J  ~R@DE  7 hEE  w7 nhwFR(U $7 &E0    >R @ H77 hۄ`n P 7 c7 c7(@`aw`  w07 hC   ! ee! RrRXeGG15 +GĝJ 0 0 ~G UEL#GG5GG 7 UE&7 Dphw~vR  h   w6~ 2(I7 Q *P P  R   ~R&RRf 7Q <c̋7LQ_R W~R P~~RR , : ,W,    j *     " " " " D6 6 Kק*+w >vDK* 7 Lj j7 b~RR 7 7  w7 \$j@~Rp:   >  >զB6K~qfiWe  w @7 .iק*ק* P7 i7 i !~R~R& ק* d숀7 7 <7 7 1%)E έ$  v t  έ     έ   E έܶ  D~H , 0L  dP ѕ e0ѐ 'd  7 : 4, ^RBe p , epww$7 jR~R$$$"U@$E@$ E  Ee b7 ^鈷XӇUP$EP$ 툇? -|(S &p7RRb & `ѵVB 7vQ e e0 Je0 @C 87DXQ B76]Qwz  .7"aQ7gQ B$ 2U$ & *7]Q$E 77]Q7gQ&7]Q7lQ 7]Q7 zN   XSSfc _vS V:jL b PV0ק*? >7 Eu=*00 ,4 4 Հ04 4 Հ T7 ҿt7 t L7 t B7 u7 tu t ŀ 7 lґu7 fҹuŀ*SBŀ  <   '4  5<  0 000  e 4  ߋ*7 u7 u   E 0 00  e 4 ߋ*7 ,v 7ק*fʋ %r @ KEX V01.28    ?KEX-[?8l[?8h[?3l<)07[?6l8=>   epeat: aModel: Command: 7#58[ beicd[?3h[?5h[?5l G0SDS2SFSTVINC-LUDESK-IPW-RITEINP-UTOU-TPUTCLO-SECLE-AREXITQUITOP-ENPURGESE-TLE-ARNLO-CALF-ILLT-ABSA-DJUSTT@VP-ASTETDVI-NPUTO-UTPUTTJVENT-ITYSEC-TIONP-AGEBE-GINEN-DEX-ACTG-ENERALBO-UNDEDU-NBOUNDEDSEA-RCHSC-REEN80132D-ARKL-IGHTQ-UIETNOQ-UIETW-RAPNOW-RAPT-ABSNOT-ABSNONUxVQ-UIETW-RAPT-ABSfUV80132D-ARKL-IGHTUVS-ECTIONP-AGEUVBE-GINEN-DEX-ACTG-ENERALBO-UNDEDU-NBOUNDEDUVA-DJUSTUVL-INESUVP-AGESL-INESR-ESTUVP-AGESL-INESR-ESTS-ELECTF:>:Z;999TZ99T:T/<0U7-p3-99-}U87>7F6N6V6Z6d6l6UcU6676707 54577KU-07457-6676-87>7-F6N6V6Z6d6l6-7-x77`:|::-t;;;;-:v }*7*7 ʄw ^78 70w*w,?$B :85 &>D #7 7g 77 w 77 7  7     -    R  f 2  & b  V & H-   ew   -      v   d p* v r$D #<\ Z.?* P NeDw B *  8 ($ !-ew 7  ew ͇ ) &-"ew ~   &d t ̀   F-22 L D "   &    b 7 V% - 7 0 w  (  %  7 rp w   hXV  r7 FD ^w Z  h F 8/ &+&(  @mA 7 w A 7`w w`7 7 7 dPg  w f-Ow _B5RRw tnȝp`pl0  >wmV@T.0B7 F m> w  @E & " 7  7 ~|g7 xg   -ww w:B z1lb 0^x n~ p\0  .ww2(B@bw m2 7 g7 g7 g  w 5 0w Bm5bbw ȝ0  w m7 *g xmBkm~\Z t/ Z PX Yw PV Rb p&>0  Hw Bm&Rw -1    p0  eE `w 7 Dh7 >(h7 8Ah7 2Zhcc:ddd^^^^^^^ad`ic~{[ M77  mjbb |P@   7 X7 V7 &Db *Z@  ,   -- --zztw7 ^`-ZZ Dw JD f  z D 2 p 7 @^:dNRV-L: D@ 2ʋ,r rZd*    r 76 ҋP7 DNS !TBew mfE%  ^D(^7 r  m 7 HD `RR@  ```B  B7 @7 ^ - m (  ? r J -LL ׯD ^ ? ^ 7 j7! fF & Z qn F >7!V wN6DB LH6 M @׆ !E , ؆ %      \& 0   e@E^ 7!"  l ^`&jmx^ L7 J7V D -:`  & - FjD f c   f&& `N W0 1  $ 1 N 7!7!U(-#ES] QUIT SET [ENTITY] SECTION "string" SET [ENTITY] SECTION integer [LINES] [OPEN] INPUT filespec [OPEN] OUTPUT filespec SET [SEARCH] GENERAL CLOSE SET [SEARCH] EXACT PURGE SET [SEARCH] "d FSBa&fe@BJ%@& fEA  w Xf XXX xX AXXXP_ _ L _  \_  _ \_ _ \_  _ `_ z_  _ $\_ $_ $ _ *Z_ *d wWrewee K"s, P"P, % Շ     &  |7 $  Da- @ w "=w ߥ* w   0 ߋ* a7 =t@w=h wwR&   c %e ee e    X -,  0  ߋ*w &w x(@?LIBR-F-Invalid option: /X?LIBR-F-No value allowed: /XModule name? Global? LIBR V05.03 Nf CW/ADEGNP X@MRU !F"b 7H& a w  U, 숂4 e . ? %\鈪 G`7Q  UQ Q  Q Q ww^^55 5@ "SkQ5 w 5 b'](5\ |Ph7 f (X0r p\ ߥ*@w &@w 5 J5 HE$5@w5 w5w  ww`v $  bf&& $ *@(    e  e% ` `ֆ U @w    LL 3 3 =     %  w e E 7w7 wC-0&  @ %  w w =d  %% W( 62W.8 ( t =  h@ @ U @ 7w@w   >K ,  ew  $e- -z 7r]  w 5@w t  0 % w ?(e"-(w H? "@2R2258w3A6w .w &"=  e$! ee@% 5e5eE 7 Z % ww w e E 7wE@xw8Af  @ % e &  w l. fD <7U@%=   %% f(  ,  3 '  5 5=r5 5@`]bj T %%wD & "Ae     w  @ (w 6        B =@e e    0 p0 =H wwBw ~D60 00 '-w :Ea'(w &e p0  w  P @w e .  $Eee D,E,f 7r Da  %     ߥ*w Jw8&^^^^lvlllfb.^  R    H70 00 (-/-+Eae'(w  p0  w  e-w   @Q  !. !:a@ȋХ ы ɕ Ie@ Iы   7 7  ŝ   e 7 . -,7ѕ ѕ ŝ  Ŋѕ ѕ ѕ+ŝɕ Q $  N ѕ ѕ  8  :  ߥ*w r ߥ*w XwF e E EE&eHf& c `5%E l:  e QQQQ  e  pѕ ><, 2< < h `& Z& T 2ѕ: (ѕ: ѕ ѕ    / d  <  D @    RT-11 LIBRARIAN V05.03 MODULE GLOBALS SAT SUN MON TUE WED THU FRI -JAN-FEB-MAR-APR-MAY-JUN-JUL-AUG-SEP-OCT-NOV-DEC-:Yw/MV   " 1,1,w Xe   * @e?E?33 7\e # x  G7   B  &  & v 7 l ((6(&w   d ^ T RL F  2 5     w  fC`U ɥ.  w T"',05E W:W=E U  MACROREPTIRPCIRPENDMENDR@&fBʋfaz    ``  C ɥ ɥ ɥ ɥ; W     z 7 ?e-(w   @E  w     & l NΤΤ e   b ` e z`Z@9/$#.- (  , w < &  B B   e-6* B  0 p0 h ߥ*w ww 7 "C@%PDE`;D%' `B DE!N` fB `f%)Tw %7 !%%) `` xr`T \7V A!ق$ 7?HH   3   7   D Z -7%](%bK%b'e w E 7w  w$ "xn w  e-d-V 7N9  Rw nw@ @  @ 7 w`? e-(w ,? ee K"s,w*7 w e@%5eE 7y D v w V~ P eL8 47: B 3 ;  2]   v j  V  B <%  "   ` ~ bB  0 p0  ߥ*w dwRw Z     @ (w .b'@ *w f&rE%ҋ  E[ѕ  Q  4F+w Ce b ^@Q  !. !:a@ȋХ ы  Nef  !:@ȋХ ы    +W.鈄ɕ@ Qɕ I?LIBR-F-?LIBR-F-Internal errorFile not foundInvalid deviceInsufficient memoryInvalid option combinationInput error inInvalid record type inOutput device fullInvalid GSD inMacro name table full, use /M:nInvalid insert ofInvalid replacement ofNull libraryDuplicate module name ofInvalid delete ofOnly continuation allowedInvalid character/R or /U given on library fileInvalid library for listing or extractOutput errorOutput file fullInvalid extract ofEOF during extractOutput and Input file names the sameInvalid input fileDuplicate form name of/U given on library fileFile created; protected file already existsProtected file already existsDuplicate macro name of\*.+Invalid commandInvalid optionForeground loadedInvalid option combinationInvalid value specified with option: /VOperation not completedInvalid deviceFile not foundUnsupported operationOperation not completedInput errorOutput errorDevice fullFile created; protected file already existsInsufficient memoryInvalid output filenameUFD not foundInvalid PPN formatDirectory input errorNot interchange formatChannel not openUnexpected EOF!4Py 7LetD$ADDB CJXbZ*TZ*Z*Z*Z*Z*Z*Z*.Hr6 "$ $2&&|'(T[,=<: %*$A"C-D-bF-G'I"L-N0P"S TU V3WY*Z-l,./:<=[FILEX V05.04 ?FILEX-x-IWEFU:/Initialize; Are you sure? :/Volume ID change; Are you sure? Foreground Loaded; Are you sure? Volume ID? Volume ID: Mount input volume in Mount output volume in Mount system volume in :; Continue? *File already exists Volume ID truncated at six charactersProtected file already exists &f z _ܲ+w&鈀w " 7 2 t7 f~0 & ɋ@B UOՋPɋ@ hW/f B ċ ыW]d $ ыC .C $ыWZW/ @H*=ЋfЇ ,% 8,5E  PĊ H4H  ƀ  --_\*$f  f7 7 m l fhf  d&f&f J1N (7d ̕d U$d~& E$d  YN  j O e n dh b!6 l f<D >.B B @E%% w!<f 5!  e z 7 7 w&f鈀d p̕d U$d~& E$d އ׭Y,0 0 wj ,-&  VDԕ  e b @ f  f *d-T_ D  &$  ԕ ԕ   $@    X wh  V , ԕ-_U$df& E$׭YwX  ԕ.w :(T ee0͠Ջ Acf  A M A be  ԕ %5<&E  T e   e@ 4-Jan-Feb-Mar-Apr-May-Jun-Jul-Aug-Sep-Oct-Nov-Dec-w J ܁e0 $@ "@e@&$@e "@e%%H$fK*  @UX(@DR   5 3&f&f f~(,5  jU$d& E$׭YwZ  &2 x 7 d7d ̕d U$d~& E$d YNf,AlwBW$ eBB w~vve  fb@V W  6 e ,&lee@`U@$E@$fɋW ff C  8 W2, f < -f~p0 *e~p e W4 UUUu Mee e m~7  `~p00  `ߋ*Af w5 ~0  &  f&wate7 `'w0 VT  wNe W  -<e wק*ݗ+ ԕ: ̒  w B    U5 ~p0 H~p~pfNE# 'D?  e&~p0 W,  w w $wW@E  `7`w`W 7W#@TT$ U%W#@tċw" w, w,v A]]pX  PC d 8 `? X e -F7 >/  j ee    UUUU UU eM UU      !   x !"ZJb ba&~0p0  Da͊f & 2 f B ee~Bp0 ( d /+.!wf 7~e0 &~0  C$$" "@$"@ "@$ e ( w7 B7 @ @ h ee  &   eW ?BE<B m `? N ^ \T 7 LeH :2r J&~ 0 ]w  @ 6 !  !!w xh t&$$PŠ HBT ~ rp0     C^Ew 2e+ʕ5 & eee  e#% <eu8B~ p0   `B~ p0  7 8$jD  ~ BL0 w&7 e7 7  eH &~0 f.@  @ !e! "W,  & ɋP"& @8e Pw"&!  " 6e EIQ   %a./=ʋe ef@@T@T ċ P(P(P(%ꆇe HE$H,W#n gW dwww$d eC jD7 e : e~N&6dw Tw 2-  w   f ee    w6ete $ 5Ç\m~  !7B  ! x܁ !E& w Pe w B e e& h @E@  P@ 7 *&  eZ @  d %@ ɋ&w & ew Tw We7*& 0ɋA7ww7 P7 R7Jf$@!!!!7 $ Q Q @  :e e    @c `&  :T& Ε,e   f` & Ε,e ȕe R b R D  & Ε,e 5L& Ε,e ,H :p EU & #Uȕ5#eEȕ5 #U 5& Ε,e  7 7 $-_ e   wt B mb@ RnMD ʕJe ҝJҝG淊C=5淊0 & %@@P@@@@@@Lf@@)    U$ U$d& E$@% ꇦd 0  ʋe+dYѕ@ )&  @@   7  ed @   f7e->f3 ~0 $ n < d-` ċ, , ,e" *@  `  `e  ` @E` e ( 5`U e" BEA %~ @  X feE ee Mew h %%ы7 @E    7 ,"# 4 $$$&@E & `@Ee70 ק*(*%  ` ` ` ~f7ewe&-l7h J2 ~0 $ fp .-*9 )&e  `%%f@w ( % w e f  L  %@$$%@e 7 E ,   &  @!" W   & f  N W!4D`D` ew7  7.  $ &D . * & e  e"(ѕ@ EeH    b 7`j  EP%7<*8e2 %d d $ e ȝE  eQ !W  7 @ L ( D7 ~  n h`3 f5 7.7$ < 6 (e" 7w߇ Ee7E |7 !$ | X  7-  f 7w޷އ& E ee h 7P7FG R L6De>< "70އ*$E      E77  Ā & & eem 3e" ѕ e# %  ѕ i t Z%T%S ^F  e &E <ѕ ,   E77 ȕ e7-./% <=2&?'@O{[lP}M]\Nk`Kaz^L~no|JZ_myjСf 1( W @Ee(EWWW ~,@e7Ze7V@77@  B& 5U7pe7j 7>"5C&E * ae ewR: U $w  *2S o|@?SRCCOM-x- ( 1)T2)<(p0)  ,2kQnxt SRCCOM V05.09 Audit trail? -f. @ 5$@A E 5U< Fpf T 0pf zE@U=vk5- 7 5$U$f& E$ zR ɋ Zȕ0  6 74 0%6-Zȕ f E % %77  w\ wDwTw2 <  T  <AT 5f  <T0D DqBCr r &   r ŝ  \5w2 :w*< &T  \  r 3  w 58T ݍ2 ~ 2 2 <s A E E   2 w~ 54<p    d22 3, < p d<Е-& r  A ><Е, A ! $z Е, Е,Е/Е;Д/@Jf  T 2  & 7  @ 61  @ &. Z.F @B 21 1ap1 6n $"%ʥ  d5b : P:Lw  $ !5&; R   АP <А&e   5; 5 ӕ 5 &     Е6&D fXp$p" Be.ZF0  E D!El e0 w @ U@  & Ur n L U^Uއ e.   .Cå*å%  B R 0 0 .Z 4 0 0 .pZ   0 fH 77 툇 6 d V    r \7 | 7" je ZȕF0  ~@f ZȕF0  \7 "5å å åå0U߇F77  7n ZȕF0  7숇wvwt߇ 7 7 \^ 0 7 DD @-66 fȝ0 ק* ZȕF &ZȕF  Hw X   ZȕF %VO ZȕF e%ӥD%%B | n ZȕF %HDfȝ0  ZȕF : |lx5 R^ @5L   -݌5 ZȕF ZȕF NJ@E%-:87 ݷ $$ڲ 0 L t  &-܇  rhw R]PRe@ De>w4e .fȝ p0  ZȕF w5ww ZȕF l ww% ܣ57 em܂ܡ tw 0wree.Cȥ5 * ѕ ȥ. ȥ.Ћȥ. e1 x Jw w n `55 %%HDw vw p%EO5 e61 w J  zۇ%fȝ^h0 & f.ep@e. F5 .  e.e  w  Cå*DĠ Ġå*å% f  E%ه7 &@ , @ee ٰEL Lee  8 3  ( +Uh77!P X  8h  X" e JFʋe ͋5: ҕ e ʋw5 ZȕF0   ؤؤ؇wB*% # W W T%wW wW Ew!| Ԕ̝؇w ĕ CĠ ĠW ыɋE8Jw &E%5 "5 5@! X ȋE   5@v  de pe d`ȋ7 Tׇ5XfZ.F ff0 采5fZ.F f0 采f . (ы fePPP< *@`T @`鈇< pf FT pf 0&  ѕ  ѕ f. 5 x5ы n5 @0 %   e` .S * /S n% /BEHOQSD.:Px*>k?BINCOM-X-~XBincom options currently available: /B -- Compares the input files byte by byte default is word mode /D -- Compares two different devices starting with block 0 /E:n -- Ends comparison at block # n default is until eof on either file /H -- Prints list of switches /O -- Always creates an output file or patch file regardless of whether the files are the same or different /Q -- Suppresses the difference listing, only tells you if files are the same or different /S:n -- Starts the comparison at block # n default is beginning of file R SIPPBINCOM V05.09 * * * BINCOM comparing/Invalid option /X Device full Output file full Input error Output error Invalid commandInput file not found File is longer Files are differentNo differences foundInsufficient memoryFile created; protected file already exists Devices are differentDevice is longer Error reading directory Invalid directory Device not active Wrong version of RT-11Unknown error codeWEFUt&f& ($***E  ȕ0   7 . >& ȕE0  @;鈽 & Ť   ww| 5 : / r  'ߋ* ȕE0  Nק* ȕE0  07 L7L 7NL ȕEL 5 z ȕE0  U@\ ȕE  ȕE t, 5Jw@ 85@ ȕ E0   ( wwe(wz5@wewf !5@U@ &5w  x"$N lN \B Ba EwX L `wB@` ( 4&. , w 5@ w - 5  5 55 ȕ  .ȕ !5T5 L ȕ   ȕ p5@ NN0 ȕE0  NL쇇W ыɋE>Bw E%5  `5 xȋE .\  de Fe :6ȋ7 *ۇ5.NȕE N0 采5NȕE N0 采 x rы jePPPQ  ыѝ 鈇&  ѕ  ~ѕ f 5 5ы 5 @0 %   e` S &f  \ z l  2  `E@@鈀5  ~ѕeȋР+ z (@w \ . % b % e%e ee e w D   ѕ:   ѕ.  D w   D% %*  %@  & ea &f& v tjS HSLP V05.05 wE wR z"   UUfŀ2W/WUUU#Ue!E#U/? "B Z @鈇fmX 7 T w( wD NUb  5L 5  5   L-n6 w|5 U 5X  57 EUU 777w&fWk FWA& @鈀     V +w+?SLP-x-     @AAŁ@<(lxPD?SLP-I-checksum is X-1/9. w @A @Q5` ACE   & ʐ 5u      ť ť Ee 5> * G`w 7 :  ( ׭   5 2   5 =<  D   ȕ  R      W 5 #8 w ,@BC @D ` Ґ5@ * @ 2  G`7 51    *@ P G` 45     5 <   8 pT7 8   ȝ&0 ` ×* wH  6&  EC 0E aE a DAEP ѕ  ȋBX    鈇fA @ @ & *B &f  U B ; -& B 5 EeЕ B  Е B  B  Ee 5t x \ ;**-EW**w :j@E<E1E.E09EŠ$"EŠEŠEŠťNE E EEEŋዾ   Ee   7 w l  a  e0А'd w ?  P nj   &    %,` -Z7 7  h)w :` w V (X ,BC ̋Ԥ D7 l 5 7 w F(R &", - # -  w m~ 7 x(wh  B 7 XlTL(  ٝ 7 *%( &fw`\ 7 T7R@,q `-KacJE[ !m@  ) L R  7 f@  &  5]U E :&@E A | ̆  E vE cLJ 50- @  . &fv  v   8  " .$   ̥ZḀ90      A0 ` @` L`x(BOdq*H]|Insufficient memoryExtra file(s) specifiedAudit trail exceeds line limitUnexpected end of correction fileSearch failure in source fileLine too longAudit trail overwrites lineCommand syntax errorLine number errorSource file not specifiedSystem errorHard error on deviceDevice full Protected file already existsFile created; protected file already existsInvalid renameFile not foundAudit trail overwrites existing audit trailBackup file suppression unsuccessfulCharacters before the "-" in No update text foundCorrection file checksum errorSource file checksum errorInput error - Wrong version of RT-11;,ȁ ,;ʆ,ȁ ,/$/І;ʄ/6.Xb/N.6І@6+h+h̆w |D   ѕ:   ѕ.   D (@w 6 % b % e%e ee e :STGNWXBESNo LPInvalid option: /Output error Input error Insufficient memoryInvalid commandFile or input device not foundUnexpected EOF ?DUMP-W-File created : protected file already exists Protected file already exists Device full ?DUMP-W-Wrong version of RT-11?DUMP-F-MUdDUMP.DMP  b` BLOCK NUMBER ** / * **** TAPE MARK ****DUMP V05.07 "E  w V 7 77Y  :@:* w v.w .w   w 7, 7F w v w v w v  w wH w f.|H0 0  w B.W  w *b    w2.az OΕE   w 4  ߋ*  6wv<w U׭" /7!׭ gc׭]    ߥ*.w  ߥ*<w -|<w J& L& :wJ j 0`L@ Skw 4" dbK 'Kdpp0 w v77,e"5 w7@Ek  # @ v  b  b% 6 @E  ,  `  B@ w   &   w& &EU0 e b & #N e ee e .  (@@E% .   '.w ^Gp 0.w 2G @ V& VWW:W=:VRW:PRWVW:RWV:RW@: w v     ^(v pYJN /R 7J5"0 0 ߋ*<w  w vnj%HDR %EOF 7ZP7ME7@ 8% -  E7w t4 ~-׭x)& # dp0  ߋ* <w U  %% @ +6@ +J& L& :w":.WSW=#:. < ɋ ɭ R Sы ҕ ҕ R < r(S ACDL6DJAORSV&0~@AAŁ@<(lxPDv%t( E  D#ȕ!0  |! 7 $T@! D#ȕ0  R! 0    *f& ɋ"e C 2 f % wB3 D#ȕ F 9&E a zE   T 55D#ȕE0  P ŀGD#ȕ eA# 2 w D#ȕ F  5~7 )ߋ*D#ȕF ߥ*D#ȕF *&fq 7 7 e&     7  %F   *7c 'Ud5 0 0 D#ȕF0  K J<ߋ* D#ȕ E0  jߥ*D#ȕF Fߥ* D#ȕF &D#ȕF  v    7 7 7 p7 n .5`L5$HUN6(4 D#ȕE0  E(7 7 7 E!x#v   D#ȕ0  `7 % 7 Em#~  5 D#ȕ0  UE# H : 5pU@jr 5 z R%! ,  w-fw#ceu w-gw# cE E=5U A%l%i@ U v ~E@ҕ ʕr* z: V E5 5 F pB5z !X JD#ȕ0  '5@F D#ȕ0  D#ȕ 0   D#ȕ0  twfE_ u-@ @ @ U E5 Ew5 ^#*wp *5E*$UfP#& $E N  -F)D#ȕ0  6wlw5&*P#& D#ȕI0  xw7  "$($ D   ̋5ҕ/ҕAeҕ/ҕCҕ ҕ eDe 6 , (  <A @E/u-t $et T-L-De e# e#-e *$,$   ,$.$ R 5S58  wJ @A ~ U58JE  0  D#ȕF 5D  "0 wD#ȕ0  w - - "@NCE w D M ; ~ DUKVRN~Ae E Ez5p55b55 5D5:E&툀*$Uf&& $EE * 5 ! 55 5e . x %D#ȕ 0  ;/:;\^ Z4ߕ+ w5|ɋ.ɥZ#ɥz ɥYɥyɥCɥc Fɋ%U45. reɀwwr ɋos" {("f %%ы XL %SEU wRɋHEU wEw 8ɋ%3ES   5    A-@-E w E D#ȕ0  U@hDe@ E@Tҕ w7  f *E0툇 < 7 55&  0 "755 0 eD#ȕF ߋ*wJD#ȕ Up &($*$ U@R v < P7 2 D&  EC 0E ahE ax DAEP& fEe0 5@E@  &.$0$ @&5   j0  N R  D W 0$.$0$D#ȕF 4 Cנ0נ7 U t  `  5 N1@ @ N @  @PN @ D7 < @ 7 &7 $ *5@D Pҕ &2E,7%x%  : z 5 fҕ 5ҕ<ŀ`⋢ҋҕ^e@5ҕ ҕ< %.B ҕ>n  ҕ 7V7T ҕ . @A *JE ^ D#ȕ0  %> D#ȕ0  | &e ?   ##RW?ҕ w E( T(  `r e"\-TPkl 5eet EjJ,K"H5@U8D#ȕ0   ( ," e    me  D#ȕ0   D#ȕ0  wT (ZF e H7@5 X >* 7,     e ee$ -  e 577!U UeE - e ` @ mP@ mLt@"C,w @ m,@ m(5=BAeA E !-,-(5DU<D#ȕ0   $ !D#ȕ0  rD#ȕ0  Z E5 U 5 bx LnzhU fKeR L  HD #" Checksum? Checksum = Base? Segment? Offset? Base Offset Old New? Segment Base Offset Old New?SIPP - Are you sure? Search for? Start? End? Found at R SIPP^Z^Y^C 'Approaching segment boundaryProtected file already exists Exceeds program limitChecksum errorDevice full Exceeds segment boundaryExtending overlay segmentExtending high limitFile not found Invalid commandInvalid device Invalid inputInvalid search commandInvalid option: /Invalid option combinationInsufficient memoryInvalid segment numberNo modifications madeNot V4 overlaid fileOdd base addressBelow segment boundaryPatch buffer approaching limitPatch buffer fullSize function failedOutput error Invalid addressPatch aborted, no modifications madeEnd of fileInput error Invalid extension of root segmentRegion size exceeds 96KInvalid boundary sizeEnd of fileWrong version of RT-11Unknown error codeWEFU2$&f& v     2  `E@@鈀5  ~ѕe''ȋР+ z (@w ' % b % e%e ee e w :D   ѕ:   ѕ.  D &f 2$B"+FS6  Ba&fe@BJ%@& fEA  w ^+^^^^!^%/^(^/_ `_  _  d_  |_  _  _  _  _  _  _  _  _  !_ _ f_ `_ $ _ *:_ *L_ *ZYXIZLFVWSMG >J&zQQAA wL^Y-*BUP SRT11A DECRT11A 9g&?BUP-X-'   1 L ` m }   ' A d y  4 T j ~ VOLUME OF V 0 files, 0 blocks Free Blocks1 File, BlocksVOLUME FILENAME BLOCKS DATEBUP V05.54 ?CSI-F-Illegal command Foreground loadedBUP - Are you sure? Mount output volume in ; Continue? ?BUP-I-Creating volume ?BUP-I-Appending to volume?BUP-I-Verify pass startedMount input volume in ; Continue? ?BUP-I-Restore operation started from volume ?BUP-I-Verify operation started from volume ?BUP-W-Verification error at block ?BUP-W-Input error at block :/BUP Initialize; Are you sure? Volume contains files. Are you sure? Volume not RT-11 format. Are you sure? Restoring over SYSTEM volume!SY:/Restore; Are you sure?  Invalid command Wildcards not permitted on command lineInvalid device Invalid option Invalid option combinationDuplicate optionDuplicate saveset name Invalid device combinationInsufficient memoryFetch error File not found Channel in use Device in use Error reading directory Invalid directory Directory input error Input error Directory output error Output error Not a Backup volume No room on output device Volume does not belong to this setWrong volume number Bad block scan startedBad blocks detected; use another volumeNo bad blocks detectedToo many bad blocks Copy operation is completeVerify operation is completeOperation not completedIncompatible output volume sizeWrong version of RT11Verification error Protected file already exists Too many mismatches during verify operation Size does not match No blocks to backup Device not available Device write-locked Unknown error codeWEFU !,eȥ ȕ0  舷  idߋX T ^ ,5   Z=$ L^\hwPh wh| 255 \|pc l <5TJ 8Xhe PPH he H  6@-0z r @f"0^ V px 0(@?BUP-W-Tape unit not ready; Continue? ?BUP-F-Unexpected error in .SPFUNz NH0 ȕ e0  VLLD5'ȝ0 0  "-  "݆w H 20 E E E HF0  ee @U$& & E$f8 E WNWY   w <  ww "0  | pfAB@ Ћ 鈇ȋ "&    - fxmv p7j->:bPPPȝ`0 @7 4 `e@ ݴ7&f  ȝp0  7 HF` `p % b % e%e ee e  f ɕ ^  e:  f  @` W  W90@` f  HF 7p[7 pAߋ*9ߥ*  ȝFp .fȕp   hw wrw&^x7NPLB(>w<  7 ȝ2p   pㇱU5  &f 0ߋ*x   `wR@ 0 0%w"=r&-t-VO  f%  X R*"ȝ00 0   UE w <.7 (ȝ0 鈇&5 t7 r*h`XV 6D@6 ^*&  R7 7 7 rȝ 0 &f& v &f  X ,  2  `E@@鈀5  ~ѕe;3ȋР+ z (@w \ % b % e%e ee e w D   ѕ:   ѕ.  D w   D% %*  %@  & ea  6Lh w7ȝߋ* hȕ F 6| RRJʥ ʕ0 be7ȝ0 hȕ F m 5p#* 6.\ T( |  *      T `< ȕ0  HC7$ ?BOOT-U-No boot on volume ߋtv L   ```A L ȝ00 0#0   ׭X׭P ȝJ0 w ȝ0 %wȝx0 0 ȝN0   l  ȝz0  p ȝH0  8_.e ȝ0  :e0WPѕ  ȝH0  ȝ"0   ȝX0  J">eB*  ȝ0   H0  ȕ0  7wnD vwb *A ȝp0 ק* ȕ0  "` 7  5 5 &f:C7e eȝpp00  %7%7n %f7d5\ 57 NeFm@@ 6`V ȕ 0  ;78 6 0\ȝ ߋ* ȕ 0  rȕ F  Ƈ  l  ,}7   b f x! "!!\ ȕ0  ȕ`  Fȝ ߋ* ȕ 0  Zȕ F ~ R0 j#7nȕ0  6  8   Le7F ԇwp  ̥ ɕ0K > w|w\wV  Zr "7ȕ0    ,  e7 hp ȕ 0  &77Tȝh!ߋ*hȕ  ݚȕ F 7l  J @7FB& w߃`( ȝ.0 `ȕ 8 mb5 w ȕ0  " 7  7!7mȝD0ȝ$l00  ȕ` 4 !R2ȕh  $-  * - ȕ"F0  5 mwf@:ED *݁ >ȝ0p0  *, X ȝp0  ȕF0  eE`7` @  L-F ȕFh   鈦& h}鈄&f7 ߀ E7 7&f&7  7 77vzv7zrq f`Z^mLwRȝ>p0 &(ȝ0p0   & }鈂e ` b ȝP0`w7 -t  ȕ`  t 8eDZs5H| 0 4+ 57  .(66  CeBԀ`C  ȝ$0  ȕ` 0[  ȝpF0 ݇ W f+& p+4+   ȝ0  x ȝV0  H0e $%<+e f+fȋfR SRT11A DECRT11A  (e7 7 0,"$7 7 7 7 7 7 7 7 7 |7 v7 7 7 .7 $7 777NI)   > 0 ew Gaz ȕF0  ' ȕF0  f V-_w.S eE$"& U$ʋ:ʋ =ԕ*ʋh *Հ&Հ&he e   7 e0he& jB wX%@Հhe e > 7 %@UheN UU~heNe  N@ W:w,:Հ4 ;j n)w U)H wJ w-ȕF0  lȕF T  5 ȕF 5 5nwՀbw ȕ F0   `& ㈇ߋ* ȕ F0  nȕ F P ԋ W*W% ȕF0   w 4    sk8 *.WUYSU JU~UxȕF0  ȕF0  . :<8܁( ށBIǀ\H7 7 ⵁU⮀H Fzb 8w" R q wUf▁U7 $wF  ^& ㈇ߋ* ȕ F0  ȕ w & ㈇ e l ȕ F0  Zh`he` .h ?BUP-W-Bad block read at ?BUP-I-Output volume not initialized; Are you sure? &$ &7Hȝߋ* ȕ F0  ݘȕ F L n: . 77 ׭׭ `   `~w   ~7   l7 ,4 | ɥ ɕ0f ȕ F0   | ȕ0  7Y  Ҥ :hȕ  b?& E sє ` s @ h  He R! ȕ0          w<w6 2B` %m64 ȝ,` 7 #C @ȝ`ߋ*ק* !ݴȕ F HF0  HF` ;r D * N}鈇7 &"- 7w  Wwȝ`p0 ߋ*< p$8 ȝ&p0  `ȕF  *m^bmXZRRD@:ZHI0  l   wȝߋ*wȕ F dw ww7 vx-lh tl-hd`JVNȝbFp0 ߋ*J -F =  ȝp0  `ȕF $X mm-  wL ~ n b6h wG & ׭ • ȕF` `• HF` 8e`  eA • Bه׭P j Rw • • ȝzp" 0 f&f$ȝ00p0 (wEȝ0fp0  ȕ` <$#7!p 7j }鈂 - ȕ"F0  .  fD>ED . Bȝ4p0  *0 ` ȝp0  ȕF0  @eE`7` @  P-J ȕFh l鈦& t}鈄 ,^" *7ȝ(ߋ* w&ȕ F .>  6  ȕ h  L wjwd (b d7  @ `*w(2. 7 $ 4 | ɥ ɕ0f w   ( 7xe R!        Uȝr` 07 J#*ȝJ`*ߋ*ק* ! HF` *HF0  H0  8r D | }鈇-l  n^2d 7 VJL-JFB>:0ȝD(p0 * ȝp0 wl mmק* wm- ކ 8ݤiHI0  ZP>wF5 ȝR2p0 w07`7   " Lf&f\ȝ0Lp0 (wEȝ0p0  ȕ` $#7! 7 X}鈂 - ȕ"F0  l  f|ED  :ȝp0  *( P ȝp0 weE`7`d @  >-8 ȕFh  鈦& 2}鈄?BUP-W-Bad block read at 7 :6$2 4 5 5 7lp &fMV7e eȝp00  67 7e%7vep %#h7f5^ H 57 He@m::&fh p$ p$p$77l| `C eC PLh ȕ 0  h->7\`T7De& 7he7bȝ#ߋ*ȕ 0  ݞȕ F z + . JȝJ0 ȕ0  Z7ȕ0  >ȝ\0  ȕ0  .e 5wj T e   w|~pzlv 4{  P 2 B "{ ., { x  v b 7a X le  F- 7a) $ }  }  - j$ ||v N$   (  B $ 8 EeH E E 7w 0 j - ^  T  z `    .  $;Zx0N?BUP-F-Cannot append to old BUP tapeZEROEDZZZ VOL1RTBUP % O4BUP PHDR1 RTBUP 00010001000100 000 00000 000000DECRT11BUP554 HDR2F0409600512EOF1EOF2EOV1EOV2 Е- w <  Е- w $@A f    e0f A N  %  7P,fH( 7   65 , 7 7  wd 7 v R 5 ^ @w&- R7 2 w x  `i T  PP(F$D 80   p & (  n7  f  x w\ F @R ȕ0  6ݰ7 | w  7 \ $v 0 Fߋ* w  Z ". 7 w"jw" W$R1 J  T W"EOeW" 0  p w"7 w )+ vw$*W"V1 rȕ0  " ݐW"F1 H ` $ HHF0   5e l7w l) p HF` 2P :݇`    p  ̥ ɕ0˕0=: $wn7 D   4 % $ %VO  %HDeѥ0  PJDv@-: w &ȝ0ߋ*1m ݚ *# ݂3@w . 7 : e 6wLHh p b<ȕ` D, -H 5  P L77  .0   7 r * ߋ*%wnh  @7D$  "ȝ(0   HFh 8 e7le 7 5 l5C`| H4- vB w  D7 R 6 5  8 $ ȕ`  ` &f&@B }鈄 <w Bs     z6w P & s5>7 n  ѕ.W )ѕ 2> L J,  LK BN>z7 r-l T ,\TPȝ0 ȕFh m޴   P7 7 ȝ0 ߋ* wrݷ݇%%% e exݷtݷ hb \X wf&b` 7!6&RP B`C`$aww  -"wF  f n  ^   4 p L&f&:ȝD*0  ~ w  l-pfe ۇ,-& "ܺBe  @ l `    B : *?BUP-F-Unexpected end of saveset?BUP-F-Unexpected error on .SPFUN?BUP-I-No savesets on volume?BUP-W-Not a BACKUP saveset ?BUP-E-Tape volume position error?BUP-W-Expected block ; Tape volume begins with ?BUP-W-Continuing RESTORE with mounted volume?BUP-W-Output volume not initialized; Are you sure? SAVESET SECTION BLOCKS DATE;Zx0Nm<[y1On 87 .  $+ +f7 F7 F>:<  7|  7 7 tj x Z np0 .7, *s?   ȕ Fp R Bh\ "  B ) z->6 7~e87 7 ׭׭   j     N b7|7v7s7q~4 | ɥ ɕ0 w 8 w`7  5   9 5 55wW"VO5 NeW"BUew Dq h w| .ww @ww  wW"EOW, wX W"F2W"V2  6w, ` wW"HDW,R1fw eW.P   Е PPPWCB 7,   D w|  7v  7x 7VEw8W,R2Be 7F 7.78.⿀)PT w  EFb;w hs bs /} | $ Hh H0  -rR fWbWtvnhjb7`A"鈦&DL `[ R}鈄 *   77`& 77vȝ0 0 fzw~w|wzwxw^ 7F7\    %2->4wvb w:ȝ`7 *ȝ`*W !`HF #HF0  ȝߋ*  w P V w77v-p =b- N7 e e -ߔ  b ts7 X R= F XO 8" ( $;H0  B8 &׭ • w*• |e`  eA • B׭4 L 6w~ • • ȝZp 0 7 ȝ&0  z -H  .-*0wt " ȝ01T[ ݆&7@&&ȝdH00 # *ަf f &#$# B Emܷ & }鈷 L݄-DD"w ȕ p mf܇b  ݘw7J5  ,5  % hwr D  2}鈇߃e77 , )7a-7 `` 7`77 wB Z&P :  v  5 5 ( eZ wL鈱  5  w  C 5 e  C  ef&7 p he e , D,eR$R$ R$ 7lemfB E m@H7D     7  @ 7    0B7 ه wهB 74 =$7   C7w {  } |  *e j  87aV  $7aB/ 6 7a*#  pnf @ } J EeH E E 7wطؗ 0 ( - h `   8 @\`T   .  hS^^^^j  & & & & z PAT V05.05 ?PAT-F-?PAT-F-Internal errormissingAdditional output file ignoredInsufficient memoryAdditional input file ignoredread errorhas invalid recordInvalid RLD symbol inInvalid GSD symbol inUnable to locate moduleIncompatible reference to globalIncompatible reference to sectionInput module checksum isCorrection file checksum ischecksum errorOnly /C allowedDevice fullInvalid commandOutput errormissing RLD recordFile created; protected file already existsWrong version of RT-11Correction file Input file . &^^ ^E U ,<U   *& * # @ % 鈰 e ʼne  CE% % 쀷 倷 D ,h407 ~t    PH P$ H" jh 5 z    +  " "w7 |* * \yC " 73  BB33,HDZ B  L%ſſCCË > 8Ë  wW,"PPPPCrn7  -4-0   .    &   ED- A" %  Z   7     D% d   $a"8  a"8Jߥ*: Sꈀ @2@6 &"7 p e (wR* Rf @   >w̉&d$%) "".,b!Ha&@`!"Da"Hab s3 @e_ (D$ Hwf`P 7%x  B ` T>e & Ne x 0܇ &  >Ie  <& @` :  w.& @e   &f  -8 :ߋ*ˉÉ h% lC n @% z w :fV Z% Շ   &  Da-  ߋ* a7 _ $   7 D`f6f `_"(#    B(  ,2,    ,1, :@W$wrn: 7 @E% fS/% <L%I% F `C&TBEmJ$% "l!#% f& e!(7QSSSK7f,QT@&Υw  @m1Ec @c% % ` Cf7є  w%fQ%% S          <7 R7 7 <7 7 7 47 @7 7 7 7 :7 7 7 n7 7 7 X f     l  & & & &  z      f&E% % ҋ E ׭  ѕ  +Fw  6 . &7 ċ+W_鈄&   c  m %e ee e ѐ  (@ɕ@ Qɕ IP  S t  ?QUEMAN-X-* Number of banner pages? Delete workfile? QUEMAN V05.06 Files queued:AKDHMLPRSN/IJCQWX " 0 < J :  ? N NSQUEUEQUEMAN >J&zQQAA wL^YM RT-11 Device Queue is EmptyDevice Job Status Copies File------ --- ------ ------ ----m :. File not found - Handler not loaded - Invalid commandInvalid device - Invalid option - /xQUEUE is not runningQUEUE fullRead error in - Insufficient memoryWrong version of RT11Unknown error codeWEFUp,eȥ "ȕ 0  X  7r,5 "ȕ0  V 7      XXD5$E$HӋE&& "ȕE0  PY鈁7  +vťaťz ťH& Ť _"ȕE0   U% *E 7"ע: ע=ע/פ<"@ ejs _eji UN \  Nȥ%Х*  0 b &     e e PP$m 5 wwzzrw   "ȕp 舁   "ȕFp t"ȕE0  ^50 "ȕE :"ȕI $wU%U wE eefe  ߝz"ȕE0   e hU w U1 U ~U1E *U@Q$7 " w:"ȕE0  F U U z U@ n UEh5UU 0 d "ȕ0  ,e&00  "ȕh 舷  - E ew >e ҋ ѕ:ѕ   ѕ Ջ͋ ѕS +w+ѕPѕ ŝkp0 ÝDE `5w,J  ŭ  56 xѕ ѕ ѕ 7 f ʋÝÕE . ѕ  ѕ:ѕ   e ]5@eŭ Q  Z5 tҋ ` ѕ:ѕ  H  B ѕ @ѝ:7 6ѕQѕ e D! p0 . @鈇7 wU$.& U4  G& ׭6YE$ wU wU w  U$7 vE$Eť  wv D7F7 F:>  2 . e  e 7a  -v  "ȕE0  " Uw,5@-bN t0 @0 2$wpt0 0 "ȕE0  \"ȕ0  F,Ee 25 N Ue r 7 5 5@U@ 5 7 U z     V  vww *  Cå*B   å*å% f&  f&f5@05$  E 5  5@ 5@  OW ee 0  "ȕF x5np ` XL%D؇ BB57 2e2m6,f w veEȥ3 * ѕ ȥ. ȥ.Ћȥ. e1 w w w  r d53 %%HDw w %EO5 e61 sw   "%&0  @5(@0 00  @ 7 w # ѕ ɕ *3 3  w w E @@&L0 V   7 w n )%   0  7 w 6 % "%HD  b 5b >we7 v7 "ȕF T@&f& m @` 7 ` 0  "ȕE0  & z tѕ  jѕ f 3 3ы 3 @0 %   e`& 0 p&f  @@ 0 7 `"ȕE0   e:   & e$g,E e`g,bCåCåJ ' %%2%c%He  $  "ȕE0  LrfEeHw 7E 7 A   f5 35f ɥ ѕ @5& ֥Y Uh", \ z d  2  `E@@鈀5  ~ѕeI A ȋР+ z (@w X % b % e%e ee e w D   ѕ:   ѕ.  D w   D% %*  %@  & ea &f& v p)f& e A@A 0 B <CEՕ:eËe:/ՐՐ2& 05 <  @ C   @&5FS Ba&fe@BJ%@& fEA  w  Au$$8_ j_ l_ _  4_  6_  p_ d_ f_ _ _ _ _ 2_ 4_ $d_ $f_ *0_ *2_ 00_ 02_ 6f_ 6h_ 6_ <J_ <L_ <L_ Bp_ Br_ Bzz?FORMAT-x-IWEFUYWVPSzV檪UU""m,̈FORMAT V05.18 Invalid command lineUnit number must be in range 0-7Device invalid or not supported by FORMATInvalid option: /Invalid option: /Formatting/verifying the system volume is not allowedInvalid directoryDuplicate option specified: /Device handler fetch errorInvalid value specified with option: /LOOKUP ERRORDirectory input errorOperation not completedFile not found Input errorWrong version of RT11Device invalid for /VERIFY, or not formattedInstall DW:/FORMAT-Are you sure? Formatting abortedFormatting complete:/VERIFY-Are you sure? : is write locked. CONTINUE(Y/N)? Verification abortedVerification completePATTERN #Foreground loadedVolume contains protected files; Are you sure? Device not readyDevice errorInsufficient memoryMount input volume in :; Continue? Mount input volume in :; Continue? Mount system volume in :; Continue? 8rRKhDYjpDPrDMf+DW|(80*DZ~@P^HH(DUXh`DLtp DTx6DXvDDz6 U $I N 7 r < |w , ,5G  އ "& 2 R  F >   f 2-e- 7@ ~ 2 ĕ+ĝ5! e  J ! nJ& oBL 0e@7 SL % 6A- & 7 V #_ j e e673p X*  j|,I &f^%+%* f, hFDwX, w`L(- ( ѕ ѕ ɕ0 J0 = :Jw~ w  4v U7`   F _ < x@ 3  -77 V J J  vR 0 <  0 T    &  @  & '  ,@  & m 7 j0!w50 0    A& % 7=  8B4&R  %+  w w  D%%+D" 067 $| 0 00   & & & e:  X(w @ w   w    ` tCE5%p0 Gdp0 5 <p0 % p0  5   eC w   w  F w   D  wÝe0p  B 0        PՋPÝJe0Ȑb p?7e7 ȝ 4!  H Y 2 & ݎ& x7 v t " 5 ` 5 &f@> 7 7 7 ~ <   p * \ je@  z;*e$e 7  5 U.  @ E% 7 7  J e d h   Q$@   420.T PU&fC@U Q$ D aam EE7 7 B n  w@7 b 4<@Ee7v@E7V5 N  L  Z5  \w - 7 7  PwE@E75 .5! 5  7 J  @ 5  w \-XH eb^N7 J7 < 6-".-(-"7  -R 7   z   e 2 Q| e&e"7fE`7`7ZETP t P %66.5 ]55U5] 5515,55^ 55 5@ 5 U 55 w"Q$W"Ew"f fE%XFeV 燱@B ``m, BE?%#E@E@e$  7  8w ]Hw  X vXw  m m& c      r 5     r 5@ 8 5@ %r 0 55e[r 55 hxhUnit number too large for RT-11 configuration7  TU 5 55 57   NUj%UZX%UFF6 U &"5 55 5 LEU 5I5 5 Set FORMAT switch to ENABLE. CONTINUE(Y/N)?Set FORMAT switch to NORMAL. CONTINUE(Y)?rɃMO)%2 OdrɃC 5 7  "UE   5 5%  "_ 4_  UJʋ E5%$xhUnit number too large for RT-11 configuration7 (U 5 55%U%Urr6 *06   13 5@5  uQ(Q8QH 54`7 ^ D R  %5 0 T.%4 &7 3 V f7 7  8 -7 -  @   P  &ee<ŒD~Œ  ee4 4   55ȋ 5<Invalid device for FORMAT0 (BfDevice handler fetch errorChannel in useDevice invalid or not supported by FORMATOperation unsupported on old micro-code revisionDU0: is an RX50 volume/FORMAT-Are you sure? <4 00 0 0  R B`B`B`B`w 50& w`vw` wR0 vw&00 0 0 y R vB`B`B`B`h7 0w j= a:w T%# Ow B \$w 1%!%e% (% % %B w 0/ ,  R& <0 e00 r00 <0 0 U(;FS;; ,~Ba&fe@BJ%@& fEA  w ^-;^-%^-T^-"_ L1_ 1_ ^2_ ~2_ 2_ 2_ R3_  ._  /_  60_  F0_  f0_  T2_  3_  3_  3_  .4_  \4_  b4_  4_  4_  |8_  9_ 1_ 2_ 2UU 5 %E |U@v,A (U ( Ep ewrewl -U@7`n5@ U@$J%HP& & Pv& P̋7E ȋ5  w hpȋ #ȕf l'#E 5 #ȕf <'B&C8&A%55 X #ȕf '5J %5 *%" j5 U5ݰ 5ݢ5= #ȕf &5= #ȕ f l&55@ 0 5n 5 UX7 VwPRPP twf0 0 ė*ĥĥ#HF  %8AwEw p0 ė*ĥĥ#HF  @%hjeA- #ȕF0  % 4w $# Ћ &:å0å9ԋE ̋&̥ ̥,ԋaz ȥ:ȥ=U ȥ,ȥ Ћ :$0 0 ė*ĥĥ#HF  $8Aw>Ew< p0 ė*ĥĥ#HF  #mAw%7Ef wp0 ė*ĥĥ#HF  8#dew^&ХNХO  ė*ĥ #HF  " &F42 #ȕF " b"ɋ 5@ɋw:5 5 #ȕF :" -(:e4,j- #ȕF0  ! #ȕF0  ! #ȕF !  T 5  p0 ė*ĥĥ#HF H!  0 #ȕF 5510 #ȕF p0 #ȕF X p0 #ȕF  wB p20 #ȕF  0 ė*ĥĥ#HF  |w p0 #ȕF 2 X0 ė*ĥĥ#HF   E ҋ ʋ *U    5U@  DCE 0 ė*ĥĥ#HF( B`L 0 ė*ĥĥ#HF( 7 SETUP V05.59 [?3h[?3l[?6l[?7l[?1l>[?25h[?25l[3"z[?5lK[61"pPq[?1;1c[?1;3c[?61c[?61;1c[?9h[?4l[3"z[0"z[?5h[2"z[0"zc[?8h[?4hH[0 J\L<[?2l[1 J[?7h(Q(K(E(R(Y(I(J(H(C(Z(A(BNOCharacteristics? is ,For a list of SETUP commands type one of the following: SETUP TERMINAL HELP SETUP PRINTER HELP SETUP CLOCK HELPDATE:dd:mmm:yy Sets the system date as specified.TIME:hh:mm:ss Sets the system time as specified.BCD Converts the system clock to BCD mode. NOBCD Converts the system clock to binary mode.DST Puts the system clock into Daylight Savings Time mode. NODST Puts the system clock into non-Daylight Savings Time mode.12HOUR Puts the system clock in 12 HOUR mode.24HOUR Puts the system clock in 24 HOUR mode.[NO]240INTERLACE Enter [exit] INTERLACE mode.480INTERLACE Puts the terminal in 480 interlace mode.DENSE Use enhanced density printing.COLOR Put video into COLOR mode.MONOCHROME Put video into MONOCHROME mode.DOWN Move paper UP 1/12 inch for alignment.UP Move paper DOWN 1/12 inch for alignment.DRAFT Use normal density printing.FACTORY Use with SETCOLOR to return to original color.GRAPHIC Enter GRAPHIC mode.HELP Print this HELP text.TEXT Exit GRAPHIC mode.HORIZONTAL:n Print n characters per inch.VERTICAL:n Print n lines per inch.LETTER Use enhanced density and 10 characters per inch.LISTING Use normal density and 16.5 characters per inch.MEMO Use memo quality printing.PAGELENGTH:n Print n lines per page.SELECT:n Select port n of mini-exchange.SETCOLOR Define the intensities for a color.PORTRAIT Set page orientation to tall.LANDSCAPE Set page orientation to wide.VT52 Enter VT52 mode.DARK Print light characters on a dark background.[NO]INTERLACE Enter [exit] INTERLACE mode.LIGHT Print dark characters on a light background.JUMP Scroll lines across screen as fast as they are received.SMOOTH Scroll 6 lines per second across screen.[NO]NEWLINE Do [not] generate when is typed.[NO]REPEAT Do [not] repeat characters when key is held down.VT100 Set terminal into VT100 specific mode.80COLUMNS Display 80 characters across screen.132COLUMNS Display 132 characters across screen.ANSWERBACK:/text/ Place text into the ANSWERBACK buffer.BLOCK Display the cursor as a block.UNDERSCORE Display the cursor as an underscore.CAPS Cause CAPS LOCK key to function as a VT100 key.SHIFT Cause CAPS LOCK key to function as a typewriter key.[NO]CLICK Do [not] cause keys to click when pressed.[NO]CURSOR Cause cursor to be [in]visible.DEFAULTS Return terminal to it's factory settings.GENERIC100 Reply to device ID query as a generic VT100.[NO]MARGINBELL Do [not] sound bell 8 columns from right margin.SAVE Save terminal characteristics.[NO]BOLD Do [not] use bold printing.CLEAR Perform a soft reset.RESET Reset terminal to previously saved characteristics.TABS:n:n:n... Set tabs at specified columns. NOTABS Clear all tabs.[NO]UNDERLINE Do [not] use underlined printing.[NO]WRAP Do [not] wrap around to the following line.SHOW Show current settings.LANG:xxx Use the font for the specified country code. color1 ON color2 Sets the text to color1 and background to color2. The available colors are: GREEN, BLUE, RED, CYAN, MAGENTA, YELLOW, BLACK, WHITE;MMhezhezzwv?=?SETUP-X-##(AM*BERAN*SWERBACKBC*DBLA*CKBLO*CKBLU*EBO*LDCA*PSCLE*ARCLI*CKCLO*CKCOL*ORCOM*POSECU*RSORCY*ANDAR*KDATADATEDEF*AULTSDEN*SEDO*WNDR*AFTDS*TF*ACTORYGE*NERIC100GRA*PHICGRE*ENHE*LPHO*RIZONTALIN*TERLACEJ*UMPK*EYBOARDKBLAND*SCAPELANGLE*TTERLIG*HTLIS*TINGLPLQ*NGLSMAG*ENTAMAR*GINBELLME*MOMO*NOCHROMENE*WLINEONPA*GELENGTHPO*RTRAITPR*INTERREDREP*EATRES*ETRET*AINSA*VESE*TCOLORSHI*FTSHO*WSM*OOTHTA*BSTER*MINALTEX*TTI*METT*TY*PEUNDERL*INEUNDERS*COREUPVE*RTICALVI*DEOVT100VT52WH*ITEWR*APY*ELLOW132*COLUMNS12*HOUR24*HOUR240*INTERLACE480*INTERLACE80*COLUMNSCOLORX)Lg`amhw8  '2>px(((("p( ((" ((AADFAQAsIsI a Q I q AqIdAD3#3DFAaDsA3qa a b{sqsa {a AQ sQA#ba AcADADAIE1sa sda ILsQ"3a aD!AAqDDDDAqA AAUSBCDNECDNFCHFCHDDDKFGBIIRLNNLNZSSFSPUS*AHpPlDPHHLPlTlLLl`dhpv:O'$I^}&KAB~s"2r"goCut[Cy((0(0(((㰶(p(p( ))0)L)Y)m)))))**2*F*V*h*u*******++$+6+U+f+t+Ambiguous command: Ambiguous value: Answerback message too longInvalid dateWrong version of PIInvalid terminal for command: Invalid command for destination: Invalid terminator for command: Invalid command: Invalid processor for command: Invalid value: Unknown error codeWEFU(Unknown error code Channel in use Channel not open Device full Directory full Directory I/O error Fetch error File created; protected file already exists File not found Invalid device Input error Insufficient memory Output error Output file full Protected file already exists Record too long System error Unexpected EOF &f& v &f   Z  2  `E@@鈀5  ~ѕe-*%*ȋР+ z (@w \F, % b % e%e ee e w D   ѕ:   ѕ.  D    Ba. & W+W-  B0  c  c S W %ec e`s  # 3  (JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC:Yw/MData Mode: BCDBINARY24/12 Hour Mode: 12 Hour24 HourDaylight Savings Clock: DisabledEnabled5U@ rȵ ŀe % %  5 5U@z 0% Հ  Հ  5 @& 5@:5E  E e U& 5  r fpe@ UH hH & c `5%E l-ew2<  D @    & & 5v`N `A B    EwZ E JE7DeH> . , 5  N B D7 <7 475 . %$.U E5. ` %.5. UnjfE^ R PHHP,( . < x<mB j<mB \w .R50UE z %E5UU%E@N U@D %E 5 *,  #ȕ f 7,dG7`- އ w   #ȕF0  r p5 v UE4UE5U  EE5U f ^UE 5 1 #ȕ f %75  %;75  zڇ%;ׇ7ԁ 5  (-5---5---5-.鈇 DATA,LANG:USA No Answerback Message DATA/TYPE KeyboardKeyboard NRCVideo FONT is set to enableddisabledDevice attributes reply string: VT100 with processorVT100 with AVO and processorGeneric VT100 with AVOunknown Tabstop settings:9:17:25:33:41:49:57:65:73:81:89:97:105:113:121:129I0123456789012345678901234567890120zwv10121316*.55678*.256812234 & ѕ ѕ P& & Pԋ%#ȕF0  z w^֋ԋ!0 #ȕF .0 #ȕF •S >0 #ȕF ֋L ؇$d"T5 ؇ "U7 w5p5zf "5 h #ȕf m8D0 #ȕF  0 #ȕF ffU` " U 2T%Q5h W ( W (Ub5J5U *W (U85 5U E W ('U5  E@P7P% ۇ#ȕ f ~#ȕf fS  g v f0 #ȕF 5 B ,@`?4@`?*& f 0 #ȕF n-0 #ȕF Z $L `-ed  5d '&J5U@]@@ .*w.{  #ȕ f 5 #ȕf U0s ԇ5 #ȕ F0  nU ԇ7  dѐ \ѕt  ԇ"  f L$"  2և&n-5 wn0 #ȕF p  0 #ȕF 0E #5&1 ӕ ʥ*ҋ @8&%% 5&  --鈁 &ҋ0 #ȕF dɋo-n-r-0 #ȕF - 65.- 5".   5".0. 5-:.n-B. 0 #ȕF 8P ɕ ҋɕT   ..  ..n- 0 #ȕF --R  --R  鈄" w5 \15 0&&D  40 #ȕF G& *V. v\ ѐ%\ѕC Z T L Då:ԋ #ȕ f ZՕ  5 |ɋՕU勇5@</ 2 5B 50p0 #ȕF zLy`;vPIX.SYS/B:=PIX.SYSUSAUSA USA (B 5 0 #ȕF e1S 1 5 #ȕ f 55@' 5 #ȕf JA' ; 0 #ȕF 5  5 , 0 #ȕF 1eR 1eR  1 wҔ  \0 ė*ĥĥ#HF  -1  T0 #ȕF   -0 ė*ĥĥ#HF0  *   . 0 w`.*1 w % -  P1 z  -0 ė*ĥĥ#HF0  X ~e%eҔ  V0 ė*ĥĥ#HF  ( \`-ė*ĥ #HF`- @`- t-5  N|- -5l    00 #ȕF  0 #ȕF eS  0 #ȕF 8& X VBa  vfEf w,p00 ė*ĥĥ#HF  D` d f00 #ȕF T 0 #ȕF eS  0 #ȕF 0 #ȕF e˝T0 #ȕF 61 χP N7 vfEf w&p00 ė*ĥĥ#HF  D`C be=V Baʋ#ȕ fp b ҋˋӋ f&  Е- w   Е- w @A f    e0f A N  %S5cppD+ *6pۇ ; 0 ʇ_ :]ETX,^ Ee,A  ={,^ EE'ef,A PUU vLE 7:7<7.e$U,^ e EDt C  <b8#5 (E f  -m  H $44 e H e  U 5     4 U e &  Ft Pf  m&N -B` '&  H m6 eN```e %%wE@ U@ f  5 q` W    LDa p` V w Cm$ "%ee "  w1f2 _ZZZ?VBGEXE-F-Error mapping kernel?VBGEXE-F-Requires XM monitor R3w.213w e 4$$~HW  x1& & x1B~x152& x1͋42v1 3鈵͋ՕBv-QW !J  @ҕ=v-R"&w z X  Nx2鈆7 v-0 0 5w7 B6w(4 v-p0 >EDaee R02wx  &ev-``E v-0 5w C``NbU NeD чHe < e E (e @eFe2wz&s3w<0 0 5w')"@@  @ԋҋH߂l    ` `e~  @4 v6!wb_ yUPpMެAWtwze@`7fe58:wd,7ݷ  8W:  " $JW. ͋W   $  7 09AZaz&  Nl b e  2?2 w f & ~& P X2&w| em '& JJ 0x1 (H U $$LOAD xxx$RUN xxx:VBGEXE Hŀ |& d   %e ee e @(?VBGEXE-F-Cannot find floating impure area offsets 3w$w $ $ $ $$$ AeAb w$FD&w*j-p- 02w$(D&wl-t- jd܇  S$ [ a@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"_5efvProgram? ?VBGEXE-F-Invalid device?VBGEXE-F-Device not loaded -- ?VBGEXE-F-Program requested was not found (.LOOKUP error)?VBGEXE-F-Insufficient extended memory for virtual job region?VBGEXE-F-Internal error (load code overflow)?VBGEXE-F-Internal error (overlay channel not open)?VBGEXE-F-Wrong version of RT-11?VBGEXE-F-Cannot create window into virtual job region.?VBGEXE-F-Cannot find monitor's FIXTRP routine?VBGEXE-F-Invalid file specificationVBGEXE V05.21 e@*e@@ee,   @ee@` ( @0 wl,$U$@pE@U0@p0(m@p5$" + e6eH@  "$&2{ ETX?VBGEXE-F-Error reading job@!xrlp@f  wV-VPBB   e,B `- eB w"Be r۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m۶m